Repository: boto/botocore
Pull request #2700 (2022-06-17 19:50:49)

sse for SelectObjectCount s3 op
This PR addresses https://github.com/boto/boto3/discussions/3268. Discussion about supporting SSE for all s3 ops was discussed, but the service only supports it for 11 out of its 97 APIs/ops.

A manual integration test was performed before and after registering the handler for `SelectObjectContent`. Before the same exception `botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the SelectObjectContent operation: Access Denied` was raised that the user in the original issue highlighted. After, the call succeeded.


Patch:
diff --git a/.changes/1.27.12.json b/.changes/1.27.12.json
new file mode 100644
index 000000000..64c0718a4
--- /dev/null
+++ b/.changes/1.27.12.json
@@ -0,0 +1,22 @@
+[
+  {
+    "category": "``connect``",
+    "description": "This release updates these APIs: UpdateInstanceAttribute, DescribeInstanceAttribute and ListInstanceAttributes. You can use it to programmatically enable/disable High volume outbound communications using attribute type HIGH_VOLUME_OUTBOUND on the specified Amazon Connect instance.",
+    "type": "api-change"
+  },
+  {
+    "category": "``connectcampaigns``",
+    "description": "Added Amazon Connect high volume outbound communications SDK.",
+    "type": "api-change"
+  },
+  {
+    "category": "``dynamodb``",
+    "description": "Doc only update for DynamoDB service",
+    "type": "api-change"
+  },
+  {
+    "category": "``dynamodbstreams``",
+    "description": "Update dynamodbstreams client to latest version",
+    "type": "api-change"
+  }
+]
\ No newline at end of file
diff --git a/.changes/1.27.13.json b/.changes/1.27.13.json
new file mode 100644
index 000000000..413ba8c5f
--- /dev/null
+++ b/.changes/1.27.13.json
@@ -0,0 +1,17 @@
+[
+  {
+    "category": "``ds``",
+    "description": "This release adds support for describing and updating AWS Managed Microsoft AD settings",
+    "type": "api-change"
+  },
+  {
+    "category": "``kafka``",
+    "description": "Documentation updates to use Az Id during cluster creation.",
+    "type": "api-change"
+  },
+  {
+    "category": "``outposts``",
+    "description": "This release adds the AssetLocation structure to the ListAssets response. AssetLocation includes the RackElevation for an Asset.",
+    "type": "api-change"
+  }
+]
\ No newline at end of file
diff --git a/.github/workflows/stale_issue.yml b/.github/workflows/stale_issue.yml
index 937e20c92..c6daa048a 100644
--- a/.github/workflows/stale_issue.yml
+++ b/.github/workflows/stale_issue.yml
@@ -7,6 +7,10 @@ on:
 
 jobs:
   issue-cleanup:
+    permissions:
+      issues: write
+      contents: read
+      pull-requests: write
     runs-on: ubuntu-latest
     name: Stale issue job
     steps:
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 004c41512..2a7b9c4de 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,6 +2,23 @@
 CHANGELOG
 =========
 
+1.27.13
+=======
+
+* api-change:``ds``: This release adds support for describing and updating AWS Managed Microsoft AD settings
+* api-change:``kafka``: Documentation updates to use Az Id during cluster creation.
+* api-change:``outposts``: This release adds the AssetLocation structure to the ListAssets response. AssetLocation includes the RackElevation for an Asset.
+
+
+1.27.12
+=======
+
+* api-change:``connect``: This release updates these APIs: UpdateInstanceAttribute, DescribeInstanceAttribute and ListInstanceAttributes. You can use it to programmatically enable/disable High volume outbound communications using attribute type HIGH_VOLUME_OUTBOUND on the specified Amazon Connect instance.
+* api-change:``connectcampaigns``: Added Amazon Connect high volume outbound communications SDK.
+* api-change:``dynamodb``: Doc only update for DynamoDB service
+* api-change:``dynamodbstreams``: Update dynamodbstreams client to latest version
+
+
 1.27.11
 =======
 
diff --git a/botocore/__init__.py b/botocore/__init__.py
index 7fa5fc601..1bb08bf9a 100644
--- a/botocore/__init__.py
+++ b/botocore/__init__.py
@@ -16,7 +16,7 @@ import logging
 import os
 import re
 
-__version__ = '1.27.11'
+__version__ = '1.27.13'
 
 
 class NullHandler(logging.Handler):
diff --git a/botocore/data/connect/2017-08-08/service-2.json b/botocore/data/connect/2017-08-08/service-2.json
index 639ea3e7e..70239a726 100644
--- a/botocore/data/connect/2017-08-08/service-2.json
+++ b/botocore/data/connect/2017-08-08/service-2.json
@@ -6513,7 +6513,8 @@
         "AUTO_RESOLVE_BEST_VOICES",
         "USE_CUSTOM_TTS_VOICES",
         "EARLY_MEDIA",
-        "MULTI_PARTY_CONFERENCE"
+        "MULTI_PARTY_CONFERENCE",
+        "HIGH_VOLUME_OUTBOUND"
       ]
     },
     "InstanceAttributeValue":{
diff --git a/botocore/data/connectcampaigns/2021-01-30/paginators-1.json b/botocore/data/connectcampaigns/2021-01-30/paginators-1.json
new file mode 100644
index 000000000..6ab045125
--- /dev/null
+++ b/botocore/data/connectcampaigns/2021-01-30/paginators-1.json
@@ -0,0 +1,10 @@
+{
+  "pagination": {
+    "ListCampaigns": {
+      "input_token": "nextToken",
+      "output_token": "nextToken",
+      "limit_key": "maxResults",
+      "result_key": "campaignSummaryList"
+    }
+  }
+}
diff --git a/botocore/data/connectcampaigns/2021-01-30/service-2.json b/botocore/data/connectcampaigns/2021-01-30/service-2.json
new file mode 100644
index 000000000..f89723611
--- /dev/null
+++ b/botocore/data/connectcampaigns/2021-01-30/service-2.json
@@ -0,0 +1,1412 @@
+{
+  "version":"2.0",
+  "metadata":{
+    "apiVersion":"2021-01-30",
+    "endpointPrefix":"connect-campaigns",
+    "jsonVersion":"1.1",
+    "protocol":"rest-json",
+    "serviceFullName":"AmazonConnectCampaignService",
+    "serviceId":"ConnectCampaigns",
+    "signatureVersion":"v4",
+    "signingName":"connect-campaigns",
+    "uid":"connectcampaigns-2021-01-30"
+  },
+  "operations":{
+    "CreateCampaign":{
+      "name":"CreateCampaign",
+      "http":{
+        "method":"PUT",
+        "requestUri":"/campaigns",
+        "responseCode":200
+      },
+      "input":{"shape":"CreateCampaignRequest"},
+      "output":{"shape":"CreateCampaignResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"ConflictException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ServiceQuotaExceededException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Creates a campaign for the specified Amazon Connect account. This API is idempotent.</p>",
+      "idempotent":true
+    },
+    "DeleteCampaign":{
+      "name":"DeleteCampaign",
+      "http":{
+        "method":"DELETE",
+        "requestUri":"/campaigns/{id}",
+        "responseCode":200
+      },
+      "input":{"shape":"DeleteCampaignRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Deletes a campaign from the specified Amazon Connect account.</p>",
+      "idempotent":true
+    },
+    "DeleteConnectInstanceConfig":{
+      "name":"DeleteConnectInstanceConfig",
+      "http":{
+        "method":"DELETE",
+        "requestUri":"/connect-instance/{connectInstanceId}/config",
+        "responseCode":200
+      },
+      "input":{"shape":"DeleteConnectInstanceConfigRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"InvalidStateException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Deletes a connect instance config from the specified AWS account.</p>",
+      "idempotent":true
+    },
+    "DeleteInstanceOnboardingJob":{
+      "name":"DeleteInstanceOnboardingJob",
+      "http":{
+        "method":"DELETE",
+        "requestUri":"/connect-instance/{connectInstanceId}/onboarding",
+        "responseCode":200
+      },
+      "input":{"shape":"DeleteInstanceOnboardingJobRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"InvalidStateException"}
+      ],
+      "documentation":"<p>Delete the Connect Campaigns onboarding job for the specified Amazon Connect instance.</p>",
+      "idempotent":true
+    },
+    "DescribeCampaign":{
+      "name":"DescribeCampaign",
+      "http":{
+        "method":"GET",
+        "requestUri":"/campaigns/{id}",
+        "responseCode":200
+      },
+      "input":{"shape":"DescribeCampaignRequest"},
+      "output":{"shape":"DescribeCampaignResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Describes the specific campaign.</p>"
+    },
+    "GetCampaignState":{
+      "name":"GetCampaignState",
+      "http":{
+        "method":"GET",
+        "requestUri":"/campaigns/{id}/state",
+        "responseCode":200
+      },
+      "input":{"shape":"GetCampaignStateRequest"},
+      "output":{"shape":"GetCampaignStateResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Get state of a campaign for the specified Amazon Connect account.</p>"
+    },
+    "GetCampaignStateBatch":{
+      "name":"GetCampaignStateBatch",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns-state",
+        "responseCode":200
+      },
+      "input":{"shape":"GetCampaignStateBatchRequest"},
+      "output":{"shape":"GetCampaignStateBatchResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Get state of campaigns for the specified Amazon Connect account.</p>"
+    },
+    "GetConnectInstanceConfig":{
+      "name":"GetConnectInstanceConfig",
+      "http":{
+        "method":"GET",
+        "requestUri":"/connect-instance/{connectInstanceId}/config",
+        "responseCode":200
+      },
+      "input":{"shape":"GetConnectInstanceConfigRequest"},
+      "output":{"shape":"GetConnectInstanceConfigResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Get the specific Connect instance config.</p>"
+    },
+    "GetInstanceOnboardingJobStatus":{
+      "name":"GetInstanceOnboardingJobStatus",
+      "http":{
+        "method":"GET",
+        "requestUri":"/connect-instance/{connectInstanceId}/onboarding",
+        "responseCode":200
+      },
+      "input":{"shape":"GetInstanceOnboardingJobStatusRequest"},
+      "output":{"shape":"GetInstanceOnboardingJobStatusResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Get the specific instance onboarding job status.</p>"
+    },
+    "ListCampaigns":{
+      "name":"ListCampaigns",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns-summary",
+        "responseCode":200
+      },
+      "input":{"shape":"ListCampaignsRequest"},
+      "output":{"shape":"ListCampaignsResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Provides summary information about the campaigns under the specified Amazon Connect account.</p>"
+    },
+    "ListTagsForResource":{
+      "name":"ListTagsForResource",
+      "http":{
+        "method":"GET",
+        "requestUri":"/tags/{arn}",
+        "responseCode":200
+      },
+      "input":{"shape":"ListTagsForResourceRequest"},
+      "output":{"shape":"ListTagsForResourceResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>List tags for a resource.</p>",
+      "idempotent":true
+    },
+    "PauseCampaign":{
+      "name":"PauseCampaign",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns/{id}/pause",
+        "responseCode":200
+      },
+      "input":{"shape":"PauseCampaignRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ConflictException"},
+        {"shape":"InvalidCampaignStateException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Pauses a campaign for the specified Amazon Connect account.</p>"
+    },
+    "PutDialRequestBatch":{
+      "name":"PutDialRequestBatch",
+      "http":{
+        "method":"PUT",
+        "requestUri":"/campaigns/{id}/dial-requests",
+        "responseCode":200
+      },
+      "input":{"shape":"PutDialRequestBatchRequest"},
+      "output":{"shape":"PutDialRequestBatchResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"ConflictException"},
+        {"shape":"InvalidCampaignStateException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Creates dials requests for the specified campaign Amazon Connect account. This API is idempotent.</p>",
+      "idempotent":true
+    },
+    "ResumeCampaign":{
+      "name":"ResumeCampaign",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns/{id}/resume",
+        "responseCode":200
+      },
+      "input":{"shape":"ResumeCampaignRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ConflictException"},
+        {"shape":"InvalidCampaignStateException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Stops a campaign for the specified Amazon Connect account.</p>"
+    },
+    "StartCampaign":{
+      "name":"StartCampaign",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns/{id}/start",
+        "responseCode":200
+      },
+      "input":{"shape":"StartCampaignRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ConflictException"},
+        {"shape":"InvalidCampaignStateException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Starts a campaign for the specified Amazon Connect account.</p>"
+    },
+    "StartInstanceOnboardingJob":{
+      "name":"StartInstanceOnboardingJob",
+      "http":{
+        "method":"PUT",
+        "requestUri":"/connect-instance/{connectInstanceId}/onboarding",
+        "responseCode":200
+      },
+      "input":{"shape":"StartInstanceOnboardingJobRequest"},
+      "output":{"shape":"StartInstanceOnboardingJobResponse"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"ConflictException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Onboard the specific Amazon Connect instance to Connect Campaigns.</p>",
+      "idempotent":true
+    },
+    "StopCampaign":{
+      "name":"StopCampaign",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns/{id}/stop",
+        "responseCode":200
+      },
+      "input":{"shape":"StopCampaignRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ConflictException"},
+        {"shape":"InvalidCampaignStateException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Stops a campaign for the specified Amazon Connect account.</p>"
+    },
+    "TagResource":{
+      "name":"TagResource",
+      "http":{
+        "method":"POST",
+        "requestUri":"/tags/{arn}",
+        "responseCode":200
+      },
+      "input":{"shape":"TagResourceRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Tag a resource.</p>",
+      "idempotent":true
+    },
+    "UntagResource":{
+      "name":"UntagResource",
+      "http":{
+        "method":"DELETE",
+        "requestUri":"/tags/{arn}",
+        "responseCode":200
+      },
+      "input":{"shape":"UntagResourceRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Untag a resource.</p>",
+      "idempotent":true
+    },
+    "UpdateCampaignDialerConfig":{
+      "name":"UpdateCampaignDialerConfig",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns/{id}/dialer-config",
+        "responseCode":200
+      },
+      "input":{"shape":"UpdateCampaignDialerConfigRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"ConflictException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Updates the dialer config of a campaign. This API is idempotent.</p>",
+      "idempotent":true
+    },
+    "UpdateCampaignName":{
+      "name":"UpdateCampaignName",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns/{id}/name",
+        "responseCode":200
+      },
+      "input":{"shape":"UpdateCampaignNameRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"ConflictException"},
+        {"shape":"AccessDeniedException"}
+      ],
+      "documentation":"<p>Updates the name of a campaign. This API is idempotent.</p>",
+      "idempotent":true
+    },
+    "UpdateCampaignOutboundCallConfig":{
+      "name":"UpdateCampaignOutboundCallConfig",
+      "http":{
+        "method":"POST",
+        "requestUri":"/campaigns/{id}/outbound-call-config",
+        "responseCode":200
+      },
+      "input":{"shape":"UpdateCampaignOutboundCallConfigRequest"},
+      "errors":[
+        {"shape":"InternalServerException"},
+        {"shape":"ResourceNotFoundException"},
+        {"shape":"ValidationException"},
+        {"shape":"ConflictException"},
+        {"shape":"AccessDeniedException"},
+        {"shape":"ThrottlingException"}
+      ],
+      "documentation":"<p>Updates the outbound call config of a campaign. This API is idempotent.</p>",
+      "idempotent":true
+    }
+  },
+  "shapes":{
+    "AccessDeniedException":{
+      "type":"structure",
+      "required":["message"],
+      "members":{
+        "message":{"shape":"String"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>You do not have sufficient access to perform this action.</p>",
+      "error":{
+        "httpStatusCode":403,
+        "senderFault":true
+      },
+      "exception":true
+    },
+    "AnswerMachineDetectionConfig":{
+      "type":"structure",
+      "required":["enableAnswerMachineDetection"],
+      "members":{
+        "enableAnswerMachineDetection":{
+          "shape":"Boolean",
+          "documentation":"<p>Enable or disable answering machine detection</p>"
+        }
+      },
+      "documentation":"<p>Answering Machine Detection config</p>"
+    },
+    "Arn":{
+      "type":"string",
+      "documentation":"<p>Arn</p>",
+      "max":500,
+      "min":20,
+      "pattern":"^arn:.*"
+    },
+    "AttributeName":{
+      "type":"string",
+      "documentation":"<p>The key of the attribute. Attribute keys can include only alphanumeric, dash, and underscore characters.</p>",
+      "max":32767,
+      "min":0,
+      "pattern":"^[a-zA-Z0-9\\-_]+$"
+    },
+    "AttributeValue":{
+      "type":"string",
+      "documentation":"<p>The value of the attribute.</p>",
+      "max":32767,
+      "min":0
+    },
+    "Attributes":{
+      "type":"map",
+      "key":{"shape":"AttributeName"},
+      "value":{"shape":"AttributeValue"},
+      "documentation":"<p>A custom key-value pair using an attribute map. The attributes are standard Amazon Connect attributes, and can be accessed in contact flows just like any other contact attributes.</p>",
+      "sensitive":true
+    },
+    "BandwidthAllocation":{
+      "type":"double",
+      "documentation":"<p>The bandwidth allocation of a queue resource.</p>",
+      "box":true,
+      "max":1,
+      "min":0
+    },
+    "Boolean":{
+      "type":"boolean",
+      "box":true
+    },
+    "Campaign":{
+      "type":"structure",
+      "required":[
+        "arn",
+        "connectInstanceId",
+        "dialerConfig",
+        "id",
+        "name",
+        "outboundCallConfig"
+      ],
+      "members":{
+        "arn":{"shape":"CampaignArn"},
+        "connectInstanceId":{"shape":"InstanceId"},
+        "dialerConfig":{"shape":"DialerConfig"},
+        "id":{"shape":"CampaignId"},
+        "name":{"shape":"CampaignName"},
+        "outboundCallConfig":{"shape":"OutboundCallConfig"},
+        "tags":{"shape":"TagMap"}
+      },
+      "documentation":"<p>An Amazon Connect campaign.</p>"
+    },
+    "CampaignArn":{
+      "type":"string",
+      "documentation":"<p>The resource name of an Amazon Connect campaign.</p>",
+      "max":500,
+      "min":20
+    },
+    "CampaignFilters":{
+      "type":"structure",
+      "members":{
+        "instanceIdFilter":{"shape":"InstanceIdFilter"}
+      },
+      "documentation":"<p>Filter model by type</p>"
+    },
+    "CampaignId":{
+      "type":"string",
+      "documentation":"<p>Identifier representing a Campaign</p>",
+      "max":256,
+      "min":0
+    },
+    "CampaignName":{
+      "type":"string",
+      "documentation":"<p>The name of an Amazon Connect Campaign name.</p>",
+      "max":127,
+      "min":1
+    },
+    "CampaignState":{
+      "type":"string",
+      "documentation":"<p>State of a campaign</p>",
+      "enum":[
+        "Initialized",
+        "Running",
+        "Paused",
+        "Stopped",
+        "Failed"
+      ]
+    },
+    "CampaignSummary":{
+      "type":"structure",
+      "required":[
+        "arn",
+        "connectInstanceId",
+        "id",
+        "name"
+      ],
+      "members":{
+        "arn":{"shape":"CampaignArn"},
+        "connectInstanceId":{"shape":"InstanceId"},
+        "id":{"shape":"CampaignId"},
+        "name":{"shape":"CampaignName"}
+      },
+      "documentation":"<p>An Amazon Connect campaign summary.</p>"
+    },
+    "CampaignSummaryList":{
+      "type":"list",
+      "member":{"shape":"CampaignSummary"},
+      "documentation":"<p>A list of Amazon Connect campaigns.</p>"
+    },
+    "ClientToken":{
+      "type":"string",
+      "documentation":"<p>Client provided parameter used for idempotency. Its value must be unique for each request.</p>",
+      "max":64,
+      "min":0
+    },
+    "ConflictException":{
+      "type":"structure",
+      "required":["message"],
+      "members":{
+        "message":{"shape":"String"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>The request could not be processed because of conflict in the current state of the resource.</p>",
+      "error":{
+        "httpStatusCode":409,
+        "senderFault":true
+      },
+      "exception":true
+    },
+    "ContactFlowId":{
+      "type":"string",
+      "documentation":"<p>The identifier of the contact flow for the outbound call.</p>",
+      "max":500,
+      "min":0
+    },
+    "CreateCampaignRequest":{
+      "type":"structure",
+      "required":[
+        "connectInstanceId",
+        "dialerConfig",
+        "name",
+        "outboundCallConfig"
+      ],
+      "members":{
+        "connectInstanceId":{"shape":"InstanceId"},
+        "dialerConfig":{"shape":"DialerConfig"},
+        "name":{"shape":"CampaignName"},
+        "outboundCallConfig":{"shape":"OutboundCallConfig"},
+        "tags":{"shape":"TagMap"}
+      },
+      "documentation":"<p>The request for Create Campaign API.</p>"
+    },
+    "CreateCampaignResponse":{
+      "type":"structure",
+      "members":{
+        "arn":{"shape":"CampaignArn"},
+        "id":{"shape":"CampaignId"},
+        "tags":{"shape":"TagMap"}
+      },
+      "documentation":"<p>The response for Create Campaign API</p>"
+    },
+    "DeleteCampaignRequest":{
+      "type":"structure",
+      "required":["id"],
+      "members":{
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>DeleteCampaignRequest</p>"
+    },
+    "DeleteConnectInstanceConfigRequest":{
+      "type":"structure",
+      "required":["connectInstanceId"],
+      "members":{
+        "connectInstanceId":{
+          "shape":"InstanceId",
+          "location":"uri",
+          "locationName":"connectInstanceId"
+        }
+      },
+      "documentation":"<p>DeleteCampaignRequest</p>"
+    },
+    "DeleteInstanceOnboardingJobRequest":{
+      "type":"structure",
+      "required":["connectInstanceId"],
+      "members":{
+        "connectInstanceId":{
+          "shape":"InstanceId",
+          "location":"uri",
+          "locationName":"connectInstanceId"
+        }
+      },
+      "documentation":"<p>The request for DeleteInstanceOnboardingJob API.</p>"
+    },
+    "DescribeCampaignRequest":{
+      "type":"structure",
+      "required":["id"],
+      "members":{
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>DescribeCampaignRequests</p>"
+    },
+    "DescribeCampaignResponse":{
+      "type":"structure",
+      "members":{
+        "campaign":{"shape":"Campaign"}
+      },
+      "documentation":"<p>DescribeCampaignResponse</p>"
+    },
+    "DestinationPhoneNumber":{
+      "type":"string",
+      "documentation":"<p>The phone number of the customer, in E.164 format.</p>",
+      "max":20,
+      "min":0,
+      "sensitive":true
+    },
+    "DialRequest":{
+      "type":"structure",
+      "required":[
+        "attributes",
+        "clientToken",
+        "expirationTime",
+        "phoneNumber"
+      ],
+      "members":{
+        "attributes":{"shape":"Attributes"},
+        "clientToken":{"shape":"ClientToken"},
+        "expirationTime":{"shape":"TimeStamp"},
+        "phoneNumber":{"shape":"DestinationPhoneNumber"}
+      },
+      "documentation":"<p>A dial request for a campaign.</p>"
+    },
+    "DialRequestId":{
+      "type":"string",
+      "documentation":"<p>Identifier representing a Dial request</p>"
+    },
+    "DialRequestList":{
+      "type":"list",
+      "member":{"shape":"DialRequest"},
+      "documentation":"<p>A list of dial requests.</p>",
+      "max":25,
+      "min":1
+    },
+    "DialerConfig":{
+      "type":"structure",
+      "members":{
+        "predictiveDialerConfig":{"shape":"PredictiveDialerConfig"},
+        "progressiveDialerConfig":{"shape":"ProgressiveDialerConfig"}
+      },
+      "documentation":"<p>The possible types of dialer config parameters</p>",
+      "union":true
+    },
+    "Enabled":{
+      "type":"boolean",
+      "documentation":"<p>Boolean to indicate if custom encryption has been enabled.</p>"
+    },
+    "EncryptionConfig":{
+      "type":"structure",
+      "required":["enabled"],
+      "members":{
+        "enabled":{"shape":"Enabled"},
+        "encryptionType":{"shape":"EncryptionType"},
+        "keyArn":{"shape":"EncryptionKey"}
+      },
+      "documentation":"<p>Encryption config for Connect Instance. Note that sensitive data will always be encrypted. If disabled, service will perform encryption with its own key. If enabled, a KMS key id needs to be provided and KMS charges will apply. KMS is only type supported</p>"
+    },
+    "EncryptionKey":{
+      "type":"string",
+      "documentation":"<p>KMS key id/arn for encryption config.</p>",
+      "max":500,
+      "min":0
+    },
+    "EncryptionType":{
+      "type":"string",
+      "documentation":"<p>Server-side encryption type.</p>",
+      "enum":["KMS"]
+    },
+    "FailedCampaignStateResponse":{
+      "type":"structure",
+      "members":{
+        "campaignId":{"shape":"CampaignId"},
+        "failureCode":{"shape":"GetCampaignStateBatchFailureCode"}
+      },
+      "documentation":"<p>Failed response of campaign state</p>"
+    },
+    "FailedCampaignStateResponseList":{
+      "type":"list",
+      "member":{"shape":"FailedCampaignStateResponse"},
+      "documentation":"<p>List of failed requests of campaign state</p>",
+      "max":25,
+      "min":0
+    },
+    "FailedRequest":{
+      "type":"structure",
+      "members":{
+        "clientToken":{"shape":"ClientToken"},
+        "failureCode":{"shape":"FailureCode"},
+        "id":{"shape":"DialRequestId"}
+      },
+      "documentation":"<p>A failed request identified by the unique client token.</p>"
+    },
+    "FailedRequestList":{
+      "type":"list",
+      "member":{"shape":"FailedRequest"},
+      "documentation":"<p>A list of failed requests.</p>",
+      "max":25,
+      "min":0
+    },
+    "FailureCode":{
+      "type":"string",
+      "documentation":"<p>A predefined code indicating the error that caused the failure.</p>",
+      "enum":[
+        "InvalidInput",
+        "RequestThrottled",
+        "UnknownError"
+      ]
+    },
+    "GetCampaignStateBatchFailureCode":{
+      "type":"string",
+      "documentation":"<p>A predefined code indicating the error that caused the failure in getting state of campaigns</p>",
+      "enum":[
+        "ResourceNotFound",
+        "UnknownError"
+      ]
+    },
+    "GetCampaignStateBatchRequest":{
+      "type":"structure",
+      "required":["campaignIds"],
+      "members":{
+        "campaignIds":{"shape":"GetCampaignStateBatchRequestCampaignIdsList"}
+      },
+      "documentation":"<p>GetCampaignStateBatchRequest</p>"
+    },
+    "GetCampaignStateBatchRequestCampaignIdsList":{
+      "type":"list",
+      "member":{"shape":"CampaignId"},
+      "documentation":"<p>List of CampaignId</p>",
+      "max":25,
+      "min":1
+    },
+    "GetCampaignStateBatchResponse":{
+      "type":"structure",
+      "members":{
+        "failedRequests":{"shape":"FailedCampaignStateResponseList"},
+        "successfulRequests":{"shape":"SuccessfulCampaignStateResponseList"}
+      },
+      "documentation":"<p>GetCampaignStateBatchResponse</p>"
+    },
+    "GetCampaignStateRequest":{
+      "type":"structure",
+      "required":["id"],
+      "members":{
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>GetCampaignStateRequest</p>"
+    },
+    "GetCampaignStateResponse":{
+      "type":"structure",
+      "members":{
+        "state":{"shape":"CampaignState"}
+      },
+      "documentation":"<p>GetCampaignStateResponse</p>"
+    },
+    "GetConnectInstanceConfigRequest":{
+      "type":"structure",
+      "required":["connectInstanceId"],
+      "members":{
+        "connectInstanceId":{
+          "shape":"InstanceId",
+          "location":"uri",
+          "locationName":"connectInstanceId"
+        }
+      },
+      "documentation":"<p>GetConnectInstanceConfigRequest</p>"
+    },
+    "GetConnectInstanceConfigResponse":{
+      "type":"structure",
+      "members":{
+        "connectInstanceConfig":{"shape":"InstanceConfig"}
+      },
+      "documentation":"<p>GetConnectInstanceConfigResponse</p>"
+    },
+    "GetInstanceOnboardingJobStatusRequest":{
+      "type":"structure",
+      "required":["connectInstanceId"],
+      "members":{
+        "connectInstanceId":{
+          "shape":"InstanceId",
+          "location":"uri",
+          "locationName":"connectInstanceId"
+        }
+      },
+      "documentation":"<p>GetInstanceOnboardingJobStatusRequest</p>"
+    },
+    "GetInstanceOnboardingJobStatusResponse":{
+      "type":"structure",
+      "members":{
+        "connectInstanceOnboardingJobStatus":{"shape":"InstanceOnboardingJobStatus"}
+      },
+      "documentation":"<p>GetInstanceOnboardingJobStatusResponse</p>"
+    },
+    "InstanceConfig":{
+      "type":"structure",
+      "required":[
+        "connectInstanceId",
+        "encryptionConfig",
+        "serviceLinkedRoleArn"
+      ],
+      "members":{
+        "connectInstanceId":{"shape":"InstanceId"},
+        "encryptionConfig":{"shape":"EncryptionConfig"},
+        "serviceLinkedRoleArn":{"shape":"ServiceLinkedRoleArn"}
+      },
+      "documentation":"<p>Instance config object</p>"
+    },
+    "InstanceId":{
+      "type":"string",
+      "documentation":"<p>Amazon Connect Instance Id</p>",
+      "max":256,
+      "min":0
+    },
+    "InstanceIdFilter":{
+      "type":"structure",
+      "required":[
+        "operator",
+        "value"
+      ],
+      "members":{
+        "operator":{"shape":"InstanceIdFilterOperator"},
+        "value":{"shape":"InstanceId"}
+      },
+      "documentation":"<p>Connect instance identifier filter</p>"
+    },
+    "InstanceIdFilterOperator":{
+      "type":"string",
+      "documentation":"<p>Operators for Connect instance identifier filter</p>",
+      "enum":["Eq"]
+    },
+    "InstanceOnboardingJobFailureCode":{
+      "type":"string",
+      "documentation":"<p>Enumeration of the possible failure codes for instance onboarding job</p>",
+      "enum":[
+        "EVENT_BRIDGE_ACCESS_DENIED",
+        "EVENT_BRIDGE_MANAGED_RULE_LIMIT_EXCEEDED",
+        "IAM_ACCESS_DENIED",
+        "KMS_ACCESS_DENIED",
+        "KMS_KEY_NOT_FOUND",
+        "INTERNAL_FAILURE"
+      ]
+    },
+    "InstanceOnboardingJobStatus":{
+      "type":"structure",
+      "required":[
+        "connectInstanceId",
+        "status"
+      ],
+      "members":{
+        "connectInstanceId":{"shape":"InstanceId"},
+        "failureCode":{"shape":"InstanceOnboardingJobFailureCode"},
+        "status":{"shape":"InstanceOnboardingJobStatusCode"}
+      },
+      "documentation":"<p>Instance onboarding job status object</p>"
+    },
+    "InstanceOnboardingJobStatusCode":{
+      "type":"string",
+      "documentation":"<p>Enumeration of the possible states for instance onboarding job</p>",
+      "enum":[
+        "IN_PROGRESS",
+        "SUCCEEDED",
+        "FAILED"
+      ]
+    },
+    "InternalServerException":{
+      "type":"structure",
+      "required":["message"],
+      "members":{
+        "message":{"shape":"String"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>Request processing failed because of an error or failure with the service.</p>",
+      "error":{"httpStatusCode":500},
+      "exception":true,
+      "fault":true,
+      "retryable":{"throttling":false}
+    },
+    "InvalidCampaignStateException":{
+      "type":"structure",
+      "required":[
+        "message",
+        "state"
+      ],
+      "members":{
+        "message":{"shape":"String"},
+        "state":{"shape":"CampaignState"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>The request could not be processed because of conflict in the current state of the campaign.</p>",
+      "error":{
+        "httpStatusCode":409,
+        "senderFault":true
+      },
+      "exception":true
+    },
+    "InvalidStateException":{
+      "type":"structure",
+      "required":["message"],
+      "members":{
+        "message":{"shape":"String"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>The request could not be processed because of conflict in the current state.</p>",
+      "error":{
+        "httpStatusCode":409,
+        "senderFault":true
+      },
+      "exception":true
+    },
+    "ListCampaignsRequest":{
+      "type":"structure",
+      "members":{
+        "filters":{"shape":"CampaignFilters"},
+        "maxResults":{"shape":"MaxResults"},
+        "nextToken":{"shape":"NextToken"}
+      },
+      "documentation":"<p>ListCampaignsRequest</p>"
+    },
+    "ListCampaignsResponse":{
+      "type":"structure",
+      "members":{
+        "campaignSummaryList":{"shape":"CampaignSummaryList"},
+        "nextToken":{"shape":"NextToken"}
+      },
+      "documentation":"<p>ListCampaignsResponse</p>"
+    },
+    "ListTagsForResourceRequest":{
+      "type":"structure",
+      "required":["arn"],
+      "members":{
+        "arn":{
+          "shape":"Arn",
+          "location":"uri",
+          "locationName":"arn"
+        }
+      },
+      "documentation":"<p>ListTagsForResource</p>"
+    },
+    "ListTagsForResourceResponse":{
+      "type":"structure",
+      "members":{
+        "tags":{"shape":"TagMap"}
+      },
+      "documentation":"<p>ListTagsForResponse</p>"
+    },
+    "MaxResults":{
+      "type":"integer",
+      "documentation":"<p>The maximum number of results to return per page.</p>",
+      "box":true,
+      "max":50,
+      "min":1
+    },
+    "NextToken":{
+      "type":"string",
+      "documentation":"<p>The token for the next set of results.</p>",
+      "max":1000,
+      "min":0
+    },
+    "OutboundCallConfig":{
+      "type":"structure",
+      "required":[
+        "connectContactFlowId",
+        "connectQueueId"
+      ],
+      "members":{
+        "answerMachineDetectionConfig":{"shape":"AnswerMachineDetectionConfig"},
+        "connectContactFlowId":{"shape":"ContactFlowId"},
+        "connectQueueId":{"shape":"QueueId"},
+        "connectSourcePhoneNumber":{"shape":"SourcePhoneNumber"}
+      },
+      "documentation":"<p>The configuration used for outbound calls.</p>"
+    },
+    "PauseCampaignRequest":{
+      "type":"structure",
+      "required":["id"],
+      "members":{
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>PauseCampaignRequest</p>"
+    },
+    "PredictiveDialerConfig":{
+      "type":"structure",
+      "required":["bandwidthAllocation"],
+      "members":{
+        "bandwidthAllocation":{"shape":"BandwidthAllocation"}
+      },
+      "documentation":"<p>Predictive Dialer config</p>"
+    },
+    "ProgressiveDialerConfig":{
+      "type":"structure",
+      "required":["bandwidthAllocation"],
+      "members":{
+        "bandwidthAllocation":{"shape":"BandwidthAllocation"}
+      },
+      "documentation":"<p>Progressive Dialer config</p>"
+    },
+    "PutDialRequestBatchRequest":{
+      "type":"structure",
+      "required":[
+        "dialRequests",
+        "id"
+      ],
+      "members":{
+        "dialRequests":{"shape":"DialRequestList"},
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>PutDialRequestBatchRequest</p>"
+    },
+    "PutDialRequestBatchResponse":{
+      "type":"structure",
+      "members":{
+        "failedRequests":{"shape":"FailedRequestList"},
+        "successfulRequests":{"shape":"SuccessfulRequestList"}
+      },
+      "documentation":"<p>PutDialRequestBatchResponse</p>"
+    },
+    "QueueId":{
+      "type":"string",
+      "documentation":"<p>The queue for the call. If you specify a queue, the phone displayed for caller ID is the phone number specified in the queue. If you do not specify a queue, the queue defined in the contact flow is used. If you do not specify a queue, you must specify a source phone number.</p>",
+      "max":500,
+      "min":0
+    },
+    "ResourceNotFoundException":{
+      "type":"structure",
+      "required":["message"],
+      "members":{
+        "message":{"shape":"String"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>The specified resource was not found.</p>",
+      "error":{
+        "httpStatusCode":404,
+        "senderFault":true
+      },
+      "exception":true
+    },
+    "ResumeCampaignRequest":{
+      "type":"structure",
+      "required":["id"],
+      "members":{
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>ResumeCampaignRequest</p>"
+    },
+    "ServiceLinkedRoleArn":{
+      "type":"string",
+      "documentation":"<p>Service linked role arn</p>",
+      "max":256,
+      "min":0
+    },
+    "ServiceQuotaExceededException":{
+      "type":"structure",
+      "required":["message"],
+      "members":{
+        "message":{"shape":"String"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>Request would cause a service quota to be exceeded.</p>",
+      "error":{
+        "httpStatusCode":402,
+        "senderFault":true
+      },
+      "exception":true
+    },
+    "SourcePhoneNumber":{
+      "type":"string",
+      "documentation":"<p>The phone number associated with the Amazon Connect instance, in E.164 format. If you do not specify a source phone number, you must specify a queue.</p>",
+      "max":100,
+      "min":0
+    },
+    "StartCampaignRequest":{
+      "type":"structure",
+      "required":["id"],
+      "members":{
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>StartCampaignRequest</p>"
+    },
+    "StartInstanceOnboardingJobRequest":{
+      "type":"structure",
+      "required":[
+        "connectInstanceId",
+        "encryptionConfig"
+      ],
+      "members":{
+        "connectInstanceId":{
+          "shape":"InstanceId",
+          "location":"uri",
+          "locationName":"connectInstanceId"
+        },
+        "encryptionConfig":{"shape":"EncryptionConfig"}
+      },
+      "documentation":"<p>The request for StartInstanceOnboardingJob API.</p>"
+    },
+    "StartInstanceOnboardingJobResponse":{
+      "type":"structure",
+      "members":{
+        "connectInstanceOnboardingJobStatus":{"shape":"InstanceOnboardingJobStatus"}
+      },
+      "documentation":"<p>The response for StartInstanceOnboardingJob API.</p>"
+    },
+    "StopCampaignRequest":{
+      "type":"structure",
+      "required":["id"],
+      "members":{
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>StopCampaignRequest</p>"
+    },
+    "String":{"type":"string"},
+    "SuccessfulCampaignStateResponse":{
+      "type":"structure",
+      "members":{
+        "campaignId":{"shape":"CampaignId"},
+        "state":{"shape":"CampaignState"}
+      },
+      "documentation":"<p>Successful response of campaign state</p>"
+    },
+    "SuccessfulCampaignStateResponseList":{
+      "type":"list",
+      "member":{"shape":"SuccessfulCampaignStateResponse"},
+      "documentation":"<p>List of successful response of campaign state</p>",
+      "max":25,
+      "min":0
+    },
+    "SuccessfulRequest":{
+      "type":"structure",
+      "members":{
+        "clientToken":{"shape":"ClientToken"},
+        "id":{"shape":"DialRequestId"}
+      },
+      "documentation":"<p>A successful request identified by the unique client token.</p>"
+    },
+    "SuccessfulRequestList":{
+      "type":"list",
+      "member":{"shape":"SuccessfulRequest"},
+      "documentation":"<p>A list of successful requests identified by the unique client token.</p>",
+      "max":25,
+      "min":0
+    },
+    "TagKey":{
+      "type":"string",
+      "documentation":"<p>Tag key.</p>",
+      "max":128,
+      "min":1,
+      "pattern":"^(?!aws:)[a-zA-Z+-=._:/]+$"
+    },
+    "TagKeyList":{
+      "type":"list",
+      "member":{"shape":"TagKey"},
+      "documentation":"<p>List of tag keys.</p>",
+      "max":50,
+      "min":0
+    },
+    "TagMap":{
+      "type":"map",
+      "key":{"shape":"TagKey"},
+      "value":{"shape":"TagValue"},
+      "documentation":"<p>Tag map with key and value.</p>"
+    },
+    "TagResourceRequest":{
+      "type":"structure",
+      "required":[
+        "arn",
+        "tags"
+      ],
+      "members":{
+        "arn":{
+          "shape":"Arn",
+          "location":"uri",
+          "locationName":"arn"
+        },
+        "tags":{"shape":"TagMap"}
+      },
+      "documentation":"<p>TagResourceRequest</p>"
+    },
+    "TagValue":{
+      "type":"string",
+      "documentation":"<p>Tag value.</p>",
+      "max":256,
+      "min":0
+    },
+    "ThrottlingException":{
+      "type":"structure",
+      "required":["message"],
+      "members":{
+        "message":{"shape":"String"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>The request was denied due to request throttling.</p>",
+      "error":{
+        "httpStatusCode":429,
+        "senderFault":true
+      },
+      "exception":true,
+      "retryable":{"throttling":false}
+    },
+    "TimeStamp":{
+      "type":"timestamp",
+      "documentation":"<p>Timestamp with no UTC offset or timezone</p>",
+      "timestampFormat":"iso8601"
+    },
+    "UntagResourceRequest":{
+      "type":"structure",
+      "required":[
+        "arn",
+        "tagKeys"
+      ],
+      "members":{
+        "arn":{
+          "shape":"Arn",
+          "location":"uri",
+          "locationName":"arn"
+        },
+        "tagKeys":{
+          "shape":"TagKeyList",
+          "location":"querystring",
+          "locationName":"tagKeys"
+        }
+      },
+      "documentation":"<p>UntagResourceRequest</p>"
+    },
+    "UpdateCampaignDialerConfigRequest":{
+      "type":"structure",
+      "required":[
+        "dialerConfig",
+        "id"
+      ],
+      "members":{
+        "dialerConfig":{"shape":"DialerConfig"},
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>UpdateCampaignDialerConfigRequest</p>"
+    },
+    "UpdateCampaignNameRequest":{
+      "type":"structure",
+      "required":[
+        "id",
+        "name"
+      ],
+      "members":{
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        },
+        "name":{"shape":"CampaignName"}
+      },
+      "documentation":"<p>UpdateCampaignNameRequest</p>"
+    },
+    "UpdateCampaignOutboundCallConfigRequest":{
+      "type":"structure",
+      "required":["id"],
+      "members":{
+        "answerMachineDetectionConfig":{"shape":"AnswerMachineDetectionConfig"},
+        "connectContactFlowId":{"shape":"ContactFlowId"},
+        "connectSourcePhoneNumber":{"shape":"SourcePhoneNumber"},
+        "id":{
+          "shape":"CampaignId",
+          "location":"uri",
+          "locationName":"id"
+        }
+      },
+      "documentation":"<p>UpdateCampaignOutboundCallConfigRequest</p>"
+    },
+    "ValidationException":{
+      "type":"structure",
+      "required":["message"],
+      "members":{
+        "message":{"shape":"String"},
+        "xAmzErrorType":{
+          "shape":"XAmazonErrorType",
+          "location":"header",
+          "locationName":"x-amzn-ErrorType"
+        }
+      },
+      "documentation":"<p>The input fails to satisfy the constraints specified by an AWS service.</p>",
+      "error":{
+        "httpStatusCode":400,
+        "senderFault":true
+      },
+      "exception":true
+    },
+    "XAmazonErrorType":{
+      "type":"string",
+      "documentation":"<p>A header that defines the error encountered while processing the request.</p>"
+    }
+  },
+  "documentation":"<p>Provide APIs to create and manage Amazon Connect Campaigns.</p>"
+}
diff --git a/botocore/data/ds/2015-04-16/service-2.json b/botocore/data/ds/2015-04-16/service-2.json
index 5d857ffc5..8acca1e9f 100644
--- a/botocore/data/ds/2015-04-16/service-2.json
+++ b/botocore/data/ds/2015-04-16/service-2.json
@@ -521,6 +521,24 @@
       ],
       "documentation":"<p>Provides information about the Regions that are configured for multi-Region replication.</p>"
     },
+    "DescribeSettings":{
+      "name":"DescribeSettings",
+      "http":{
+        "method":"POST",
+        "requestUri":"/"
+      },
+      "input":{"shape":"DescribeSettingsRequest"},
+      "output":{"shape":"DescribeSettingsResult"},
+      "errors":[
+        {"shape":"DirectoryDoesNotExistException"},
+        {"shape":"UnsupportedOperationException"},
+        {"shape":"InvalidParameterException"},
+        {"shape":"InvalidNextTokenException"},
+        {"shape":"ClientException"},
+        {"shape":"ServiceException"}
+      ],
+      "documentation":"<p>Retrieves information about the configurable settings for the specified directory.</p>"
+    },
     "DescribeSharedDirectories":{
       "name":"DescribeSharedDirectories",
       "http":{
@@ -1080,6 +1098,26 @@
       ],
       "documentation":"<p>Updates the Remote Authentication Dial In User Service (RADIUS) server information for an AD Connector or Microsoft AD directory.</p>"
     },
+    "UpdateSettings":{
+      "name":"UpdateSettings",
+      "http":{
+        "method":"POST",
+        "requestUri":"/"
+      },
+      "input":{"shape":"UpdateSettingsRequest"},
+      "output":{"shape":"UpdateSettingsResult"},
+      "errors":[
+        {"shape":"DirectoryDoesNotExistException"},
+        {"shape":"UnsupportedOperationException"},
+        {"shape":"DirectoryUnavailableException"},
+        {"shape":"IncompatibleSettingsException"},
+        {"shape":"UnsupportedSettingsException"},
+        {"shape":"InvalidParameterException"},
+        {"shape":"ClientException"},
+        {"shape":"ServiceException"}
+      ],
+      "documentation":"<p>Updates the configurable settings for the specified directory.</p>"
+    },
     "UpdateTrust":{
       "name":"UpdateTrust",
       "http":{
@@ -1470,7 +1508,10 @@
     },
     "ClientAuthenticationType":{
       "type":"string",
-      "enum":["SmartCard"]
+      "enum":[
+        "SmartCard",
+        "SmartCardOrPassword"
+      ]
     },
     "ClientCertAuthSettings":{
       "type":"structure",
@@ -2306,6 +2347,41 @@
         }
       }
     },
+    "DescribeSettingsRequest":{
+      "type":"structure",
+      "required":["DirectoryId"],
+      "members":{
+        "DirectoryId":{
+          "shape":"DirectoryId",
+          "documentation":"<p>The identifier of the directory for which to retrieve information.</p>"
+        },
+        "Status":{
+          "shape":"DirectoryConfigurationStatus",
+          "documentation":"<p>The status of the directory settings for which to retrieve information.</p>"
+        },
+        "NextToken":{
+          "shape":"NextToken",
+          "documentation":"<p>The <code>DescribeSettingsResult.NextToken</code> value from a previous call to <a>DescribeSettings</a>. Pass null if this is the first call.</p>"
+        }
+      }
+    },
+    "DescribeSettingsResult":{
+      "type":"structure",
+      "members":{
+        "DirectoryId":{
+          "shape":"DirectoryId",
+          "documentation":"<p>The identifier of the directory.</p>"
+        },
+        "SettingEntries":{
+          "shape":"SettingEntries",
+          "documentation":"<p>The list of <a>SettingEntry</a> objects that were retrieved.</p> <p>It is possible that this list contains less than the number of items specified in the <code>Limit</code> member of the request. This occurs if there are less than the requested number of items left to retrieve, or if the limitations of the operation have been exceeded.</p>"
+        },
+        "NextToken":{
+          "shape":"NextToken",
+          "documentation":"<p>If not null, token that indicates that more results are available. Pass this value for the <code>NextToken</code> parameter in a subsequent call to <code>DescribeSettings</code> to retrieve the next set of items. </p>"
+        }
+      }
+    },
     "DescribeSharedDirectoriesRequest":{
       "type":"structure",
       "required":["OwnerDirectoryId"],
@@ -2441,6 +2517,38 @@
       "documentation":"<p>The specified directory has already been shared with this Amazon Web Services account.</p>",
       "exception":true
     },
+    "DirectoryConfigurationSettingAllowedValues":{"type":"string"},
+    "DirectoryConfigurationSettingLastRequestedDateTime":{"type":"timestamp"},
+    "DirectoryConfigurationSettingLastUpdatedDateTime":{"type":"timestamp"},
+    "DirectoryConfigurationSettingName":{
+      "type":"string",
+      "max":255,
+      "min":1,
+      "pattern":"^[a-zA-Z0-9-/. _]*$"
+    },
+    "DirectoryConfigurationSettingRequestDetailedStatus":{
+      "type":"map",
+      "key":{"shape":"RegionName"},
+      "value":{"shape":"DirectoryConfigurationStatus"}
+    },
+    "DirectoryConfigurationSettingRequestStatusMessage":{"type":"string"},
+    "DirectoryConfigurationSettingType":{"type":"string"},
+    "DirectoryConfigurationSettingValue":{
+      "type":"string",
+      "max":255,
+      "min":1,
+      "pattern":"^[a-zA-Z0-9]*$"
+    },
+    "DirectoryConfigurationStatus":{
+      "type":"string",
+      "enum":[
+        "Requested",
+        "Updating",
+        "Updated",
+        "Failed",
+        "Default"
+      ]
+    },
     "DirectoryConnectSettings":{
       "type":"structure",
       "required":[
@@ -3137,6 +3245,15 @@
       },
       "documentation":"<p>Contains the results of the <a>GetSnapshotLimits</a> operation.</p>"
     },
+    "IncompatibleSettingsException":{
+      "type":"structure",
+      "members":{
+        "Message":{"shape":"ExceptionMessage"},
+        "RequestId":{"shape":"RequestId"}
+      },
+      "documentation":"<p>The specified directory setting is not compatible with other settings.</p>",
+      "exception":true
+    },
     "InsufficientPermissionsException":{
       "type":"structure",
       "members":{
@@ -4049,6 +4166,78 @@
       "exception":true,
       "fault":true
     },
+    "Setting":{
+      "type":"structure",
+      "required":[
+        "Name",
+        "Value"
+      ],
+      "members":{
+        "Name":{
+          "shape":"DirectoryConfigurationSettingName",
+          "documentation":"<p>The name of the directory setting. For example:</p> <p> <code>TLS_1_0</code> </p>"
+        },
+        "Value":{
+          "shape":"DirectoryConfigurationSettingValue",
+          "documentation":"<p>The value of the directory setting for which to retrieve information. For example, for <code>TLS_1_0</code>, the valid values are: <code>Enable</code> and <code>Disable</code>.</p>"
+        }
+      },
+      "documentation":"<p>Contains information about the configurable settings for a directory.</p>"
+    },
+    "SettingEntries":{
+      "type":"list",
+      "member":{"shape":"SettingEntry"}
+    },
+    "SettingEntry":{
+      "type":"structure",
+      "members":{
+        "Type":{
+          "shape":"DirectoryConfigurationSettingType",
+          "documentation":"<p>The type of directory setting. For example, <code>Protocol</code> or <code>Cipher</code>.</p>"
+        },
+        "Name":{
+          "shape":"DirectoryConfigurationSettingName",
+          "documentation":"<p>The name of the directory setting. For example:</p> <p> <code>TLS_1_0</code> </p>"
+        },
+        "AllowedValues":{
+          "shape":"DirectoryConfigurationSettingAllowedValues",
+          "documentation":"<p>The valid range of values for the directory setting.</p>"
+        },
+        "AppliedValue":{
+          "shape":"DirectoryConfigurationSettingValue",
+          "documentation":"<p>The value of the directory setting that is applied to the directory.</p>"
+        },
+        "RequestedValue":{
+          "shape":"DirectoryConfigurationSettingValue",
+          "documentation":"<p>The value that was last requested for the directory setting.</p>"
+        },
+        "RequestStatus":{
+          "shape":"DirectoryConfigurationStatus",
+          "documentation":"<p>The overall status of the request to update the directory setting request. If the directory setting is deployed in more than one region, and the request fails in any region, the overall status is <code>Failed</code>.</p>"
+        },
+        "RequestDetailedStatus":{
+          "shape":"DirectoryConfigurationSettingRequestDetailedStatus",
+          "documentation":"<p>Details about the status of the request to update the directory setting. If the directory setting is deployed in more than one region, status is returned for the request in each region where the setting is deployed.</p>"
+        },
+        "RequestStatusMessage":{
+          "shape":"DirectoryConfigurationSettingRequestStatusMessage",
+          "documentation":"<p>The last status message for the directory status request.</p>"
+        },
+        "LastUpdatedDateTime":{
+          "shape":"DirectoryConfigurationSettingLastUpdatedDateTime",
+          "documentation":"<p>The date and time when the directory setting was last updated.</p>"
+        },
+        "LastRequestedDateTime":{
+          "shape":"DirectoryConfigurationSettingLastRequestedDateTime",
+          "documentation":"<p>The date and time when the request to update a directory setting was last submitted.</p>"
+        }
+      },
+      "documentation":"<p>Contains information about the specified configurable setting for a directory.</p>"
+    },
+    "Settings":{
+      "type":"list",
+      "member":{"shape":"Setting"}
+    },
     "ShareDirectoryRequest":{
       "type":"structure",
       "required":[
@@ -4466,7 +4655,7 @@
       "type":"string",
       "max":128,
       "min":1,
-      "pattern":"(.|\\s)*\\S(.|\\s)*",
+      "pattern":"^(\\p{LD}|\\p{Punct}| )+$",
       "sensitive":true
     },
     "TrustState":{
@@ -4550,6 +4739,15 @@
       "documentation":"<p>The operation is not supported.</p>",
       "exception":true
     },
+    "UnsupportedSettingsException":{
+      "type":"structure",
+      "members":{
+        "Message":{"shape":"ExceptionMessage"},
+        "RequestId":{"shape":"RequestId"}
+      },
+      "documentation":"<p>The specified directory setting is not supported.</p>",
+      "exception":true
+    },
     "UpdateConditionalForwarderRequest":{
       "type":"structure",
       "required":[
@@ -4626,6 +4824,32 @@
       "documentation":"<p>Contains the results of the <a>UpdateRadius</a> operation.</p>"
     },
     "UpdateSecurityGroupForDirectoryControllers":{"type":"boolean"},
+    "UpdateSettingsRequest":{
+      "type":"structure",
+      "required":[
+        "DirectoryId",
+        "Settings"
+      ],
+      "members":{
+        "DirectoryId":{
+          "shape":"DirectoryId",
+          "documentation":"<p>The identifier of the directory for which to update settings.</p>"
+        },
+        "Settings":{
+          "shape":"Settings",
+          "documentation":"<p>The list of <a>Setting</a> objects.</p>"
+        }
+      }
+    },
+    "UpdateSettingsResult":{
+      "type":"structure",
+      "members":{
+        "DirectoryId":{
+          "shape":"DirectoryId",
+          "documentation":"<p>The identifier of the directory.</p>"
+        }
+      }
+    },
     "UpdateTrustRequest":{
       "type":"structure",
       "required":["TrustId"],
diff --git a/botocore/data/dynamodb/2012-08-10/service-2.json b/botocore/data/dynamodb/2012-08-10/service-2.json
index 25c87aae0..337c7f7f2 100644
--- a/botocore/data/dynamodb/2012-08-10/service-2.json
+++ b/botocore/data/dynamodb/2012-08-10/service-2.json
@@ -25,7 +25,7 @@
         {"shape":"RequestLimitExceeded"},
         {"shape":"InternalServerError"}
       ],
-      "documentation":"<p>This operation allows you to perform batch reads or writes on data stored in DynamoDB, using PartiQL.</p> <note> <p>The entire batch must consist of either read statements or write statements, you cannot mix both in one batch.</p> </note>"
+      "documentation":"<p>This operation allows you to perform batch reads or writes on data stored in DynamoDB, using PartiQL. Each read statement in a <code>BatchExecuteStatement</code> must specify an equality condition on all key attributes. This enforces that each <code>SELECT</code> statement in a batch returns at most a single item.</p> <note> <p>The entire batch must consist of either read statements or write statements, you cannot mix both in one batch.</p> </note> <important> <p>A HTTP 200 response does not mean that all statements in the BatchExecuteStatement 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 statement.</p> </important>"
     },
     "BatchGetItem":{
       "name":"BatchGetItem",
@@ -574,7 +574,7 @@
         {"shape":"RequestLimitExceeded"},
         {"shape":"InternalServerError"}
       ],
-      "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> <important> <p>This topic provides general information about the <code>PutItem</code> API.</p> <p>For information on how to call the <code>PutItem</code> API using the Amazon Web Services SDK in specific languages, see the following:</p> <ul> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/PutItem\"> PutItem in the Command Line Interface</a> </p> </li> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/DotNetSDKV3/dynamodb-2012-08-10/PutItem\"> PutItem in the SDK for .NET</a> </p> </li> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/SdkForCpp/dynamodb-2012-08-10/PutItem\"> PutItem in the SDK for C++</a> </p> </li> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/SdkForGoV1/dynamodb-2012-08-10/PutItem\"> PutItem in the SDK for Go</a> </p> </li> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/SdkForJava/dynamodb-2012-08-10/PutItem\"> PutItem in the SDK for Java</a> </p> </li> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/AWSJavaScriptSDK/dynamodb-2012-08-10/PutItem\"> PutItem in the SDK for JavaScript</a> </p> </li> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/SdkForPHPV3/dynamodb-2012-08-10/PutItem\"> PutItem in the SDK for PHP V3</a> </p> </li> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/boto3/dynamodb-2012-08-10/PutItem\"> PutItem in the SDK for Python (Boto)</a> </p> </li> <li> <p> <a href=\"http://docs.aws.amazon.com/goto/SdkForRubyV2/dynamodb-2012-08-10/PutItem\"> PutItem in the SDK for Ruby V2</a> </p> </li> </ul> </important> <p>When you add an item, the primary key attributes are the only required attributes. Attribute values cannot be null.</p> <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. Set type attributes cannot be empty. </p> <p>Invalid Requests with empty values will be rejected with a <code>ValidationException</code> exception.</p> <note> <p>To prevent a new item from replacing an existing item, use a conditional expression that contains the <code>attribute_not_exists</code> function with the name of the attribute being used as the partition key for the table. Since every record must contain that attribute, the <code>attribute_not_exists</code> function will only succeed if no matching item exists.</p> </note> <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>",
+      "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> <p>When you add an item, the primary key attributes are the only required attributes. Attribute values cannot be null.</p> <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. Set type attributes cannot be empty. </p> <p>Invalid Requests with empty values will be rejected with a <code>ValidationException</code> exception.</p> <note> <p>To prevent a new item from replacing an existing item, use a conditional expression that contains the <code>attribute_not_exists</code> function with the name of the attribute being used as the partition key for the table. Since every record must contain that attribute, the <code>attribute_not_exists</code> function will only succeed if no matching item exists.</p> </note> <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>",
       "endpointdiscovery":{
       }
     },
@@ -834,7 +834,7 @@
         {"shape":"LimitExceededException"},
         {"shape":"InternalServerError"}
       ],
-      "documentation":"<p>Modifies the provisioned throughput settings, global secondary indexes, or DynamoDB Streams settings for a given table.</p> <p>You can only perform one of the following operations at once:</p> <ul> <li> <p>Modify the provisioned throughput settings of the table.</p> </li> <li> <p>Enable or disable DynamoDB Streams on the table.</p> </li> <li> <p>Remove a global secondary index from the table.</p> </li> <li> <p>Create a new global secondary index on the table. After the index begins backfilling, you can use <code>UpdateTable</code> to perform other operations.</p> </li> </ul> <p> <code>UpdateTable</code> is an asynchronous operation; while it is executing, the table status changes from <code>ACTIVE</code> to <code>UPDATING</code>. While it is <code>UPDATING</code>, you cannot issue another <code>UpdateTable</code> request. When the table returns to the <code>ACTIVE</code> state, the <code>UpdateTable</code> operation is complete.</p>",
+      "documentation":"<p>Modifies the provisioned throughput settings, global secondary indexes, or DynamoDB Streams settings for a given table.</p> <p>You can only perform one of the following operations at once:</p> <ul> <li> <p>Modify the provisioned throughput settings of the table.</p> </li> <li> <p>Remove a global secondary index from the table.</p> </li> <li> <p>Create a new global secondary index on the table. After the index begins backfilling, you can use <code>UpdateTable</code> to perform other operations.</p> </li> </ul> <p> <code>UpdateTable</code> is an asynchronous operation; while it is executing, the table status changes from <code>ACTIVE</code> to <code>UPDATING</code>. While it is <code>UPDATING</code>, you cannot issue another <code>UpdateTable</code> request. When the table returns to the <code>ACTIVE</code> state, the <code>UpdateTable</code> operation is complete.</p>",
       "endpointdiscovery":{
       }
     },
@@ -975,7 +975,7 @@
         },
         "L":{
           "shape":"ListAttributeValue",
-          "documentation":"<p>An attribute of type List. For example:</p> <p> <code>\"L\": [ {\"S\": \"Cookies\"} , {\"S\": \"Coffee\"}, {\"N\", \"3.14159\"}]</code> </p>"
+          "documentation":"<p>An attribute of type List. For example:</p> <p> <code>\"L\": [ {\"S\": \"Cookies\"} , {\"S\": \"Coffee\"}, {\"N\": \"3.14159\"}]</code> </p>"
         },
         "NULL":{
           "shape":"NullAttributeValue",
@@ -1001,7 +1001,7 @@
         },
         "Action":{
           "shape":"AttributeAction",
-          "documentation":"<p>Specifies how to perform the update. Valid values are <code>PUT</code> (default), <code>DELETE</code>, and <code>ADD</code>. The behavior depends on whether the specified primary key already exists in the table.</p> <p> <b>If an item with the specified <i>Key</i> is found in the table:</b> </p> <ul> <li> <p> <code>PUT</code> - Adds the specified attribute to the item. If the attribute already exists, it is replaced by the new value. </p> </li> <li> <p> <code>DELETE</code> - If no value is specified, the attribute and its value are removed from the item. The data type of the specified value must match the existing value's data type.</p> <p>If a <i>set</i> of values is specified, then those values are subtracted from the old set. For example, if the attribute value was the set <code>[a,b,c]</code> and the <code>DELETE</code> action specified <code>[a,c]</code>, then the final attribute value would be <code>[b]</code>. Specifying an empty set is an error.</p> </li> <li> <p> <code>ADD</code> - If the attribute does not already exist, then the attribute and its values are added to the item. If the attribute does exist, then the behavior of <code>ADD</code> depends on the data type of the attribute:</p> <ul> <li> <p>If the existing attribute is a number, and if <code>Value</code> is also a number, then the <code>Value</code> is mathematically added to the existing attribute. If <code>Value</code> is a negative number, then it is subtracted from the existing attribute.</p> <note> <p> If you use <code>ADD</code> to increment or decrement a number value for an item that doesn't exist before the update, DynamoDB uses 0 as the initial value.</p> <p>In addition, if you use <code>ADD</code> to update an existing item, and intend to increment or decrement an attribute value which does not yet exist, DynamoDB uses <code>0</code> as the initial value. For example, suppose that the item you want to update does not yet have an attribute named <i>itemcount</i>, but you decide to <code>ADD</code> the number <code>3</code> to this attribute anyway, even though it currently does not exist. DynamoDB will create the <i>itemcount</i> attribute, set its initial value to <code>0</code>, and finally add <code>3</code> to it. The result will be a new <i>itemcount</i> attribute in the item, with a value of <code>3</code>.</p> </note> </li> <li> <p>If the existing data type is a set, and if the <code>Value</code> is also a set, then the <code>Value</code> is added to the existing set. (This is a <i>set</i> operation, not mathematical addition.) For example, if the attribute value was the set <code>[1,2]</code>, and the <code>ADD</code> action specified <code>[3]</code>, then the final attribute value would be <code>[1,2,3]</code>. An error occurs if an Add action is specified for a set attribute and the attribute type specified does not match the existing set type. </p> <p>Both sets must have the same primitive data type. For example, if the existing data type is a set of strings, the <code>Value</code> must also be a set of strings. The same holds true for number sets and binary sets.</p> </li> </ul> <p>This action is only valid for an existing attribute whose data type is number or is a set. Do not use <code>ADD</code> for any other data types.</p> </li> </ul> <p> <b>If no item with the specified <i>Key</i> is found:</b> </p> <ul> <li> <p> <code>PUT</code> - DynamoDB creates a new item with the specified primary key, and then adds the attribute. </p> </li> <li> <p> <code>DELETE</code> - Nothing happens; there is no attribute to delete.</p> </li> <li> <p> <code>ADD</code> - DynamoDB creates an item with the supplied primary key and number (or set of numbers) for the attribute value. The only data types allowed are number and number set; no other data types can be specified.</p> </li> </ul>"
+          "documentation":"<p>Specifies how to perform the update. Valid values are <code>PUT</code> (default), <code>DELETE</code>, and <code>ADD</code>. The behavior depends on whether the specified primary key already exists in the table.</p> <p> <b>If an item with the specified <i>Key</i> is found in the table:</b> </p> <ul> <li> <p> <code>PUT</code> - Adds the specified attribute to the item. If the attribute already exists, it is replaced by the new value. </p> </li> <li> <p> <code>DELETE</code> - If no value is specified, the attribute and its value are removed from the item. The data type of the specified value must match the existing value's data type.</p> <p>If a <i>set</i> of values is specified, then those values are subtracted from the old set. For example, if the attribute value was the set <code>[a,b,c]</code> and the <code>DELETE</code> action specified <code>[a,c]</code>, then the final attribute value would be <code>[b]</code>. Specifying an empty set is an error.</p> </li> <li> <p> <code>ADD</code> - If the attribute does not already exist, then the attribute and its values are added to the item. If the attribute does exist, then the behavior of <code>ADD</code> depends on the data type of the attribute:</p> <ul> <li> <p>If the existing attribute is a number, and if <code>Value</code> is also a number, then the <code>Value</code> is mathematically added to the existing attribute. If <code>Value</code> is a negative number, then it is subtracted from the existing attribute.</p> <note> <p> If you use <code>ADD</code> to increment or decrement a number value for an item that doesn't exist before the update, DynamoDB uses 0 as the initial value.</p> <p>In addition, if you use <code>ADD</code> to update an existing item, and intend to increment or decrement an attribute value which does not yet exist, DynamoDB uses <code>0</code> as the initial value. For example, suppose that the item you want to update does not yet have an attribute named <i>itemcount</i>, but you decide to <code>ADD</code> the number <code>3</code> to this attribute anyway, even though it currently does not exist. DynamoDB will create the <i>itemcount</i> attribute, set its initial value to <code>0</code>, and finally add <code>3</code> to it. The result will be a new <i>itemcount</i> attribute in the item, with a value of <code>3</code>.</p> </note> </li> <li> <p>If the existing data type is a set, and if the <code>Value</code> is also a set, then the <code>Value</code> is added to the existing set. (This is a <i>set</i> operation, not mathematical addition.) For example, if the attribute value was the set <code>[1,2]</code>, and the <code>ADD</code> action specified <code>[3]</code>, then the final attribute value would be <code>[1,2,3]</code>. An error occurs if an Add action is specified for a set attribute and the attribute type specified does not match the existing set type. </p> <p>Both sets must have the same primitive data type. For example, if the existing data type is a set of strings, the <code>Value</code> must also be a set of strings. The same holds true for number sets and binary sets.</p> </li> </ul> <p>This action is only valid for an existing attribute whose data type is number or is a set. Do not use <code>ADD</code> for any other data types.</p> </li> </ul> <p> <b>If no item with the specified <i>Key</i> is found:</b> </p> <ul> <li> <p> <code>PUT</code> - DynamoDB creates a new item with the specified primary key, and then adds the attribute. </p> </li> <li> <p> <code>DELETE</code> - Nothing happens; there is no attribute to delete.</p> </li> <li> <p> <code>ADD</code> - DynamoDB creates a new item with the supplied primary key and number (or set) for the attribute value. The only data types allowed are number, number set, string set or binary set.</p> </li> </ul>"
         }
       },
       "documentation":"<p>For the <code>UpdateItem</code> operation, represents the attributes to be modified, the action to perform on each, and the new value for each.</p> <note> <p>You cannot use <code>UpdateItem</code> to update any primary key attributes. Instead, you will need to delete the item, and then use <code>PutItem</code> to create a new item with new attributes.</p> </note> <p>Attribute values cannot be null; string and binary type attributes must have lengths greater than zero; and set type attributes must not be empty. Requests with empty values will be rejected with a <code>ValidationException</code> exception.</p>"
@@ -1194,7 +1194,7 @@
         },
         "BackupSizeBytes":{
           "shape":"BackupSizeBytes",
-          "documentation":"<p>Size of the backup in bytes.</p>"
+          "documentation":"<p>Size of the backup in bytes. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p>"
         },
         "BackupStatus":{
           "shape":"BackupStatus",
@@ -2052,7 +2052,7 @@
         },
         "ReturnValues":{
           "shape":"ReturnValue",
-          "documentation":"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appeared before they were deleted. For <code>DeleteItem</code>, the valid values are:</p> <ul> <li> <p> <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its value is <code>NONE</code>, then nothing is returned. (This setting is the default for <code>ReturnValues</code>.)</p> </li> <li> <p> <code>ALL_OLD</code> - The content of the old item is returned.</p> </li> </ul> <note> <p>The <code>ReturnValues</code> parameter is used by several DynamoDB operations; however, <code>DeleteItem</code> does not recognize any values other than <code>NONE</code> or <code>ALL_OLD</code>.</p> </note>"
+          "documentation":"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appeared before they were deleted. For <code>DeleteItem</code>, the valid values are:</p> <ul> <li> <p> <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its value is <code>NONE</code>, then nothing is returned. (This setting is the default for <code>ReturnValues</code>.)</p> </li> <li> <p> <code>ALL_OLD</code> - The content of the old item is returned.</p> </li> </ul> <p>There is no additional cost associated with requesting a return value aside from the small network and processing overhead of receiving a larger response. No read capacity units are consumed.</p> <note> <p>The <code>ReturnValues</code> parameter is used by several DynamoDB operations; however, <code>DeleteItem</code> does not recognize any values other than <code>NONE</code> or <code>ALL_OLD</code>.</p> </note>"
         },
         "ReturnConsumedCapacity":{"shape":"ReturnConsumedCapacity"},
         "ReturnItemCollectionMetrics":{
@@ -2714,7 +2714,7 @@
         },
         "ExportTime":{
           "shape":"ExportTime",
-          "documentation":"<p>Time in the past from which to export table data. The table export will be a snapshot of the table's state at this point in time.</p>"
+          "documentation":"<p>Time in the past from which to export table data, counted in seconds from the start of the Unix epoch. The table export will be a snapshot of the table's state at this point in time.</p>"
         },
         "ClientToken":{
           "shape":"ClientToken",
@@ -3377,7 +3377,7 @@
           "documentation":"<p>Too many operations for a given subscriber.</p>"
         }
       },
-      "documentation":"<p>There is no limit to the number of daily on-demand backups that can be taken. </p> <p>Up to 50 simultaneous table operations are allowed per account. These operations include <code>CreateTable</code>, <code>UpdateTable</code>, <code>DeleteTable</code>,<code>UpdateTimeToLive</code>, <code>RestoreTableFromBackup</code>, and <code>RestoreTableToPointInTime</code>. </p> <p>The only exception is when you are creating a table with one or more secondary indexes. You can have up to 25 such requests running at a time; however, if the table or index specifications are complex, DynamoDB might temporarily reduce the number of concurrent operations.</p> <p>There is a soft account quota of 256 tables.</p>",
+      "documentation":"<p>There is no limit to the number of daily on-demand backups that can be taken. </p> <p>Up to 500 simultaneous table operations are allowed per account. These operations include <code>CreateTable</code>, <code>UpdateTable</code>, <code>DeleteTable</code>,<code>UpdateTimeToLive</code>, <code>RestoreTableFromBackup</code>, and <code>RestoreTableToPointInTime</code>. </p> <p>The only exception is when you are creating a table with one or more secondary indexes. You can have up to 250 such requests running at a time; however, if the table or index specifications are complex, DynamoDB might temporarily reduce the number of concurrent operations.</p> <p>There is a soft account quota of 2,500 tables.</p>",
       "exception":true
     },
     "ListAttributeValue":{
@@ -3409,7 +3409,7 @@
         },
         "BackupType":{
           "shape":"BackupTypeFilter",
-          "documentation":"<p>The backups from the table specified by <code>BackupType</code> are listed.</p> <p>Where <code>BackupType</code> can be:</p> <ul> <li> <p> <code>USER</code> - On-demand backup created by you.</p> </li> <li> <p> <code>SYSTEM</code> - On-demand backup automatically created by DynamoDB.</p> </li> <li> <p> <code>ALL</code> - All types of on-demand backups (USER and SYSTEM).</p> </li> </ul>"
+          "documentation":"<p>The backups from the table specified by <code>BackupType</code> are listed.</p> <p>Where <code>BackupType</code> can be:</p> <ul> <li> <p> <code>USER</code> - On-demand backup created by you. (The default setting if no other backup types are specified.)</p> </li> <li> <p> <code>SYSTEM</code> - On-demand backup automatically created by DynamoDB.</p> </li> <li> <p> <code>ALL</code> - All types of on-demand backups (USER and SYSTEM).</p> </li> </ul>"
         }
       }
     },
@@ -3803,7 +3803,7 @@
         },
         "NonKeyAttributes":{
           "shape":"NonKeyAttributeNameList",
-          "documentation":"<p>Represents the non-key attribute names which will be projected into the index.</p> <p>For local secondary indexes, the total count of <code>NonKeyAttributes</code> summed across all of the local 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>"
+          "documentation":"<p>Represents the non-key attribute names which will be projected into the index.</p> <p>For local secondary indexes, the total count of <code>NonKeyAttributes</code> summed across all of the local 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>"
         }
       },
       "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>"
@@ -3937,7 +3937,7 @@
         },
         "ReturnValues":{
           "shape":"ReturnValue",
-          "documentation":"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appeared before they were updated with the <code>PutItem</code> request. For <code>PutItem</code>, the valid values are:</p> <ul> <li> <p> <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its value is <code>NONE</code>, then nothing is returned. (This setting is the default for <code>ReturnValues</code>.)</p> </li> <li> <p> <code>ALL_OLD</code> - If <code>PutItem</code> overwrote an attribute name-value pair, then the content of the old item is returned.</p> </li> </ul> <p>The values returned are strongly consistent.</p> <note> <p>The <code>ReturnValues</code> parameter is used by several DynamoDB operations; however, <code>PutItem</code> does not recognize any values other than <code>NONE</code> or <code>ALL_OLD</code>.</p> </note>"
+          "documentation":"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appeared before they were updated with the <code>PutItem</code> request. For <code>PutItem</code>, the valid values are:</p> <ul> <li> <p> <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its value is <code>NONE</code>, then nothing is returned. (This setting is the default for <code>ReturnValues</code>.)</p> </li> <li> <p> <code>ALL_OLD</code> - If <code>PutItem</code> overwrote an attribute name-value pair, then the content of the old item is returned.</p> </li> </ul> <p>The values returned are strongly consistent.</p> <p>There is no additional cost associated with requesting a return value aside from the small network and processing overhead of receiving a larger response. No read capacity units are consumed.</p> <note> <p>The <code>ReturnValues</code> parameter is used by several DynamoDB operations; however, <code>PutItem</code> does not recognize any values other than <code>NONE</code> or <code>ALL_OLD</code>.</p> </note>"
         },
         "ReturnConsumedCapacity":{"shape":"ReturnConsumedCapacity"},
         "ReturnItemCollectionMetrics":{
@@ -4011,7 +4011,7 @@
         },
         "Select":{
           "shape":"Select",
-          "documentation":"<p>The attributes to be returned in the result. You can retrieve all item attributes, specific item attributes, the count of matching items, or in the case of an index, some or all of the attributes projected into the index.</p> <ul> <li> <p> <code>ALL_ATTRIBUTES</code> - Returns all of the item attributes from the specified table or index. If you query a local secondary index, then for each matching item in the index, DynamoDB fetches the entire item from the parent table. If the index is configured to project all item attributes, then all of the data can be obtained from the local secondary index, and no fetching is required.</p> </li> <li> <p> <code>ALL_PROJECTED_ATTRIBUTES</code> - Allowed only when querying an index. Retrieves all attributes that have been projected into the index. If the index is configured to project all attributes, this return value is equivalent to specifying <code>ALL_ATTRIBUTES</code>.</p> </li> <li> <p> <code>COUNT</code> - Returns the number of matching items, rather than the matching items themselves.</p> </li> <li> <p> <code>SPECIFIC_ATTRIBUTES</code> - Returns only the attributes listed in <code>AttributesToGet</code>. This return value is equivalent to specifying <code>AttributesToGet</code> without specifying any value for <code>Select</code>.</p> <p>If you query or scan a local secondary index and request only attributes that are projected into that index, the operation will read only the index and not the table. If any of the requested attributes are not projected into the local secondary index, DynamoDB fetches each of these attributes from the parent table. This extra fetching incurs additional throughput cost and latency.</p> <p>If you query or scan a global secondary index, you can only request attributes that are projected into the index. Global secondary index queries cannot fetch attributes from the parent table.</p> </li> </ul> <p>If neither <code>Select</code> nor <code>AttributesToGet</code> are specified, DynamoDB defaults to <code>ALL_ATTRIBUTES</code> when accessing a table, and <code>ALL_PROJECTED_ATTRIBUTES</code> when accessing an index. You cannot use both <code>Select</code> and <code>AttributesToGet</code> together in a single request, unless the value for <code>Select</code> is <code>SPECIFIC_ATTRIBUTES</code>. (This usage is equivalent to specifying <code>AttributesToGet</code> without any value for <code>Select</code>.)</p> <note> <p>If you use the <code>ProjectionExpression</code> parameter, then the value for <code>Select</code> can only be <code>SPECIFIC_ATTRIBUTES</code>. Any other value for <code>Select</code> will return an error.</p> </note>"
+          "documentation":"<p>The attributes to be returned in the result. You can retrieve all item attributes, specific item attributes, the count of matching items, or in the case of an index, some or all of the attributes projected into the index.</p> <ul> <li> <p> <code>ALL_ATTRIBUTES</code> - Returns all of the item attributes from the specified table or index. If you query a local secondary index, then for each matching item in the index, DynamoDB fetches the entire item from the parent table. If the index is configured to project all item attributes, then all of the data can be obtained from the local secondary index, and no fetching is required.</p> </li> <li> <p> <code>ALL_PROJECTED_ATTRIBUTES</code> - Allowed only when querying an index. Retrieves all attributes that have been projected into the index. If the index is configured to project all attributes, this return value is equivalent to specifying <code>ALL_ATTRIBUTES</code>.</p> </li> <li> <p> <code>COUNT</code> - Returns the number of matching items, rather than the matching items themselves.</p> </li> <li> <p> <code>SPECIFIC_ATTRIBUTES</code> - Returns only the attributes listed in <code>ProjectionExpression</code>. This return value is equivalent to specifying <code>ProjectionExpression</code> without specifying any value for <code>Select</code>.</p> <p>If you query or scan a local secondary index and request only attributes that are projected into that index, the operation will read only the index and not the table. If any of the requested attributes are not projected into the local secondary index, DynamoDB fetches each of these attributes from the parent table. This extra fetching incurs additional throughput cost and latency.</p> <p>If you query or scan a global secondary index, you can only request attributes that are projected into the index. Global secondary index queries cannot fetch attributes from the parent table.</p> </li> </ul> <p>If neither <code>Select</code> nor <code>ProjectionExpression</code> are specified, DynamoDB defaults to <code>ALL_ATTRIBUTES</code> when accessing a table, and <code>ALL_PROJECTED_ATTRIBUTES</code> when accessing an index. You cannot use both <code>Select</code> and <code>ProjectionExpression</code> together in a single request, unless the value for <code>Select</code> is <code>SPECIFIC_ATTRIBUTES</code>. (This usage is equivalent to specifying <code>ProjectionExpression</code> without any value for <code>Select</code>.)</p> <note> <p>If you use the <code>ProjectionExpression</code> parameter, then the value for <code>Select</code> can only be <code>SPECIFIC_ATTRIBUTES</code>. Any other value for <code>Select</code> will return an error.</p> </note>"
         },
         "AttributesToGet":{
           "shape":"AttributeNameList",
@@ -4052,7 +4052,7 @@
         },
         "FilterExpression":{
           "shape":"ConditionExpression",
-          "documentation":"<p>A string that contains conditions that DynamoDB applies after the <code>Query</code> operation, but before the data is returned to you. Items that do not satisfy the <code>FilterExpression</code> criteria are not returned.</p> <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> <note> <p>A <code>FilterExpression</code> is applied after the items have already been read; the process of filtering does not consume any additional read capacity units.</p> </note> <p>For more information, see <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>"
+          "documentation":"<p>A string that contains conditions that DynamoDB applies after the <code>Query</code> operation, but before the data is returned to you. Items that do not satisfy the <code>FilterExpression</code> criteria are not returned.</p> <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> <note> <p>A <code>FilterExpression</code> is applied after the items have already been read; the process of filtering does not consume any additional read capacity units.</p> </note> <p>For more information, see <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#Query.FilterExpression\">Filter Expressions</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>"
         },
         "KeyConditionExpression":{
           "shape":"KeyExpression",
@@ -4472,7 +4472,7 @@
           "documentation":"<p>The parameters required for deleting a replica for the table.</p>"
         }
       },
-      "documentation":"<p>Represents one of the following:</p> <ul> <li> <p>A new replica to be added to an existing regional table or global table. This request invokes the <code>CreateTableReplica</code> action in the destination Region.</p> </li> <li> <p>New parameters for an existing replica. This request invokes the <code>UpdateTable</code> action in the destination Region.</p> </li> <li> <p>An existing replica to be deleted. The request invokes the <code>DeleteTableReplica</code> action in the destination Region, deleting the replica and all if its items in the destination Region.</p> </li> </ul>"
+      "documentation":"<p>Represents one of the following:</p> <ul> <li> <p>A new replica to be added to an existing regional table or global table. This request invokes the <code>CreateTableReplica</code> action in the destination Region.</p> </li> <li> <p>New parameters for an existing replica. This request invokes the <code>UpdateTable</code> action in the destination Region.</p> </li> <li> <p>An existing replica to be deleted. The request invokes the <code>DeleteTableReplica</code> action in the destination Region, deleting the replica and all if its items in the destination Region.</p> </li> </ul> <note> <p>When you manually remove a table or global table replica, you do not automatically remove any associated scalable targets, scaling policies, or CloudWatch alarms.</p> </note>"
     },
     "ReplicationGroupUpdateList":{
       "type":"list",
@@ -4778,7 +4778,7 @@
         },
         "Select":{
           "shape":"Select",
-          "documentation":"<p>The attributes to be returned in the result. You can retrieve all item attributes, specific item attributes, the count of matching items, or in the case of an index, some or all of the attributes projected into the index.</p> <ul> <li> <p> <code>ALL_ATTRIBUTES</code> - Returns all of the item attributes from the specified table or index. If you query a local secondary index, then for each matching item in the index, DynamoDB fetches the entire item from the parent table. If the index is configured to project all item attributes, then all of the data can be obtained from the local secondary index, and no fetching is required.</p> </li> <li> <p> <code>ALL_PROJECTED_ATTRIBUTES</code> - Allowed only when querying an index. Retrieves all attributes that have been projected into the index. If the index is configured to project all attributes, this return value is equivalent to specifying <code>ALL_ATTRIBUTES</code>.</p> </li> <li> <p> <code>COUNT</code> - Returns the number of matching items, rather than the matching items themselves.</p> </li> <li> <p> <code>SPECIFIC_ATTRIBUTES</code> - Returns only the attributes listed in <code>AttributesToGet</code>. This return value is equivalent to specifying <code>AttributesToGet</code> without specifying any value for <code>Select</code>.</p> <p>If you query or scan a local secondary index and request only attributes that are projected into that index, the operation reads only the index and not the table. If any of the requested attributes are not projected into the local secondary index, DynamoDB fetches each of these attributes from the parent table. This extra fetching incurs additional throughput cost and latency.</p> <p>If you query or scan a global secondary index, you can only request attributes that are projected into the index. Global secondary index queries cannot fetch attributes from the parent table.</p> </li> </ul> <p>If neither <code>Select</code> nor <code>AttributesToGet</code> are specified, DynamoDB defaults to <code>ALL_ATTRIBUTES</code> when accessing a table, and <code>ALL_PROJECTED_ATTRIBUTES</code> when accessing an index. You cannot use both <code>Select</code> and <code>AttributesToGet</code> together in a single request, unless the value for <code>Select</code> is <code>SPECIFIC_ATTRIBUTES</code>. (This usage is equivalent to specifying <code>AttributesToGet</code> without any value for <code>Select</code>.)</p> <note> <p>If you use the <code>ProjectionExpression</code> parameter, then the value for <code>Select</code> can only be <code>SPECIFIC_ATTRIBUTES</code>. Any other value for <code>Select</code> will return an error.</p> </note>"
+          "documentation":"<p>The attributes to be returned in the result. You can retrieve all item attributes, specific item attributes, the count of matching items, or in the case of an index, some or all of the attributes projected into the index.</p> <ul> <li> <p> <code>ALL_ATTRIBUTES</code> - Returns all of the item attributes from the specified table or index. If you query a local secondary index, then for each matching item in the index, DynamoDB fetches the entire item from the parent table. If the index is configured to project all item attributes, then all of the data can be obtained from the local secondary index, and no fetching is required.</p> </li> <li> <p> <code>ALL_PROJECTED_ATTRIBUTES</code> - Allowed only when querying an index. Retrieves all attributes that have been projected into the index. If the index is configured to project all attributes, this return value is equivalent to specifying <code>ALL_ATTRIBUTES</code>.</p> </li> <li> <p> <code>COUNT</code> - Returns the number of matching items, rather than the matching items themselves.</p> </li> <li> <p> <code>SPECIFIC_ATTRIBUTES</code> - Returns only the attributes listed in <code>ProjectionExpression</code>. This return value is equivalent to specifying <code>ProjectionExpression</code> without specifying any value for <code>Select</code>.</p> <p>If you query or scan a local secondary index and request only attributes that are projected into that index, the operation reads only the index and not the table. If any of the requested attributes are not projected into the local secondary index, DynamoDB fetches each of these attributes from the parent table. This extra fetching incurs additional throughput cost and latency.</p> <p>If you query or scan a global secondary index, you can only request attributes that are projected into the index. Global secondary index queries cannot fetch attributes from the parent table.</p> </li> </ul> <p>If neither <code>Select</code> nor <code>ProjectionExpression</code> are specified, DynamoDB defaults to <code>ALL_ATTRIBUTES</code> when accessing a table, and <code>ALL_PROJECTED_ATTRIBUTES</code> when accessing an index. You cannot use both <code>Select</code> and <code>ProjectionExpression</code> together in a single request, unless the value for <code>Select</code> is <code>SPECIFIC_ATTRIBUTES</code>. (This usage is equivalent to specifying <code>ProjectionExpression</code> without any value for <code>Select</code>.)</p> <note> <p>If you use the <code>ProjectionExpression</code> parameter, then the value for <code>Select</code> can only be <code>SPECIFIC_ATTRIBUTES</code>. Any other value for <code>Select</code> will return an error.</p> </note>"
         },
         "ScanFilter":{
           "shape":"FilterConditionMap",
@@ -4807,7 +4807,7 @@
         },
         "FilterExpression":{
           "shape":"ConditionExpression",
-          "documentation":"<p>A string that contains conditions that DynamoDB applies after the <code>Scan</code> operation, but before the data is returned to you. Items that do not satisfy the <code>FilterExpression</code> criteria are not returned.</p> <note> <p>A <code>FilterExpression</code> is applied after the items have already been read; the process of filtering does not consume any additional read capacity units.</p> </note> <p>For more information, see <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>"
+          "documentation":"<p>A string that contains conditions that DynamoDB applies after the <code>Scan</code> operation, but before the data is returned to you. Items that do not satisfy the <code>FilterExpression</code> criteria are not returned.</p> <note> <p>A <code>FilterExpression</code> is applied after the items have already been read; the process of filtering does not consume any additional read capacity units.</p> </note> <p>For more information, see <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#Query.FilterExpression\">Filter Expressions</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>"
         },
         "ExpressionAttributeNames":{
           "shape":"ExpressionAttributeNameMap",
@@ -5083,11 +5083,11 @@
         },
         "LocalSecondaryIndexes":{
           "shape":"LocalSecondaryIndexDescriptionList",
-          "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> <ul> <li> <p> <code>IndexName</code> - The name of the local secondary index.</p> </li> <li> <p> <code>KeySchema</code> - Specifies the complete index key schema. The attribute names in the key schema must be between 1 and 255 characters (inclusive). The key schema must begin with the same partition key as the table.</p> </li> <li> <p> <code>Projection</code> - Specifies attributes that are copied (projected) from the table into the index. These are in addition to the primary key attributes and index key attributes, which are automatically projected. Each attribute specification is composed of:</p> <ul> <li> <p> <code>ProjectionType</code> - One of the following:</p> <ul> <li> <p> <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the index.</p> </li> <li> <p> <code>INCLUDE</code> - Only the specified table attributes are projected into the index. The list of projected attributes is in <code>NonKeyAttributes</code>.</p> </li> <li> <p> <code>ALL</code> - All of the table attributes are projected into the index.</p> </li> </ul> </li> <li> <p> <code>NonKeyAttributes</code> - A list of one or more non-key attribute names that are 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> </li> </ul> </li> <li> <p> <code>IndexSizeBytes</code> - Represents the total size of the index, in bytes. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p> </li> <li> <p> <code>ItemCount</code> - Represents the number of items in the index. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p> </li> </ul> <p>If the table is in the <code>DELETING</code> state, no information about indexes will be returned.</p>"
+          "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> <ul> <li> <p> <code>IndexName</code> - The name of the local secondary index.</p> </li> <li> <p> <code>KeySchema</code> - Specifies the complete index key schema. The attribute names in the key schema must be between 1 and 255 characters (inclusive). The key schema must begin with the same partition key as the table.</p> </li> <li> <p> <code>Projection</code> - Specifies attributes that are copied (projected) from the table into the index. These are in addition to the primary key attributes and index key attributes, which are automatically projected. Each attribute specification is composed of:</p> <ul> <li> <p> <code>ProjectionType</code> - One of the following:</p> <ul> <li> <p> <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the index.</p> </li> <li> <p> <code>INCLUDE</code> - Only the specified table attributes are projected into the index. The list of projected attributes is in <code>NonKeyAttributes</code>.</p> </li> <li> <p> <code>ALL</code> - All of the table attributes are projected into the index.</p> </li> </ul> </li> <li> <p> <code>NonKeyAttributes</code> - A list of one or more non-key attribute names that are 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> </li> </ul> </li> <li> <p> <code>IndexSizeBytes</code> - Represents the total size of the index, in bytes. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p> </li> <li> <p> <code>ItemCount</code> - Represents the number of items in the index. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p> </li> </ul> <p>If the table is in the <code>DELETING</code> state, no information about indexes will be returned.</p>"
         },
         "GlobalSecondaryIndexes":{
           "shape":"GlobalSecondaryIndexDescriptionList",
-          "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> <ul> <li> <p> <code>Backfilling</code> - If true, then the index is currently in the backfilling phase. Backfilling occurs only when a new global secondary index is added to the table. It is the process by which DynamoDB populates the new index with data from the table. (This attribute does not appear for indexes that were created during a <code>CreateTable</code> operation.) </p> <p> You can delete an index that is being created during the <code>Backfilling</code> phase when <code>IndexStatus</code> is set to CREATING and <code>Backfilling</code> is true. You can't delete the index that is being created when <code>IndexStatus</code> is set to CREATING and <code>Backfilling</code> is false. (This attribute does not appear for indexes that were created during a <code>CreateTable</code> operation.)</p> </li> <li> <p> <code>IndexName</code> - The name of the global secondary index.</p> </li> <li> <p> <code>IndexSizeBytes</code> - The total size of the global secondary index, in bytes. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value. </p> </li> <li> <p> <code>IndexStatus</code> - The current status of the global secondary index:</p> <ul> <li> <p> <code>CREATING</code> - The index is being created.</p> </li> <li> <p> <code>UPDATING</code> - The index is being updated.</p> </li> <li> <p> <code>DELETING</code> - The index is being deleted.</p> </li> <li> <p> <code>ACTIVE</code> - The index is ready for use.</p> </li> </ul> </li> <li> <p> <code>ItemCount</code> - The number of items in the global secondary index. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value. </p> </li> <li> <p> <code>KeySchema</code> - Specifies the complete index key schema. The attribute names in the key schema must be between 1 and 255 characters (inclusive). The key schema must begin with the same partition key as the table.</p> </li> <li> <p> <code>Projection</code> - Specifies attributes that are copied (projected) from the table into the index. These are in addition to the primary key attributes and index key attributes, which are automatically projected. Each attribute specification is composed of:</p> <ul> <li> <p> <code>ProjectionType</code> - One of the following:</p> <ul> <li> <p> <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the index.</p> </li> <li> <p> <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> </li> <li> <p> <code>ALL</code> - All of the table attributes are projected into the index.</p> </li> </ul> </li> <li> <p> <code>NonKeyAttributes</code> - A list of one or more non-key attribute names that are 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> </li> </ul> </li> <li> <p> <code>ProvisionedThroughput</code> - The provisioned throughput settings for the global secondary index, consisting of read and write capacity units, along with data about increases and decreases. </p> </li> </ul> <p>If the table is in the <code>DELETING</code> state, no information about indexes will be returned.</p>"
+          "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> <ul> <li> <p> <code>Backfilling</code> - If true, then the index is currently in the backfilling phase. Backfilling occurs only when a new global secondary index is added to the table. It is the process by which DynamoDB populates the new index with data from the table. (This attribute does not appear for indexes that were created during a <code>CreateTable</code> operation.) </p> <p> You can delete an index that is being created during the <code>Backfilling</code> phase when <code>IndexStatus</code> is set to CREATING and <code>Backfilling</code> is true. You can't delete the index that is being created when <code>IndexStatus</code> is set to CREATING and <code>Backfilling</code> is false. (This attribute does not appear for indexes that were created during a <code>CreateTable</code> operation.)</p> </li> <li> <p> <code>IndexName</code> - The name of the global secondary index.</p> </li> <li> <p> <code>IndexSizeBytes</code> - The total size of the global secondary index, in bytes. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value. </p> </li> <li> <p> <code>IndexStatus</code> - The current status of the global secondary index:</p> <ul> <li> <p> <code>CREATING</code> - The index is being created.</p> </li> <li> <p> <code>UPDATING</code> - The index is being updated.</p> </li> <li> <p> <code>DELETING</code> - The index is being deleted.</p> </li> <li> <p> <code>ACTIVE</code> - The index is ready for use.</p> </li> </ul> </li> <li> <p> <code>ItemCount</code> - The number of items in the global secondary index. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value. </p> </li> <li> <p> <code>KeySchema</code> - Specifies the complete index key schema. The attribute names in the key schema must be between 1 and 255 characters (inclusive). The key schema must begin with the same partition key as the table.</p> </li> <li> <p> <code>Projection</code> - Specifies attributes that are copied (projected) from the table into the index. These are in addition to the primary key attributes and index key attributes, which are automatically projected. Each attribute specification is composed of:</p> <ul> <li> <p> <code>ProjectionType</code> - One of the following:</p> <ul> <li> <p> <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the index.</p> </li> <li> <p> <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> </li> <li> <p> <code>ALL</code> - All of the table attributes are projected into the index.</p> </li> </ul> </li> <li> <p> <code>NonKeyAttributes</code> - A list of one or more non-key attribute names that are 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> </li> </ul> </li> <li> <p> <code>ProvisionedThroughput</code> - The provisioned throughput settings for the global secondary index, consisting of read and write capacity units, along with data about increases and decreases. </p> </li> </ul> <p>If the table is in the <code>DELETING</code> state, no information about indexes will be returned.</p>"
         },
         "StreamSpecification":{
           "shape":"StreamSpecification",
@@ -5155,7 +5155,7 @@
       "members":{
         "message":{"shape":"ErrorMessage"}
       },
-      "documentation":"<p>A source table with the name <code>TableName</code> does not currently exist within the subscriber's account.</p>",
+      "documentation":"<p>A source table with the name <code>TableName</code> does not currently exist within the subscriber's account or the subscriber is operating in the wrong Amazon Web Services Region.</p>",
       "exception":true
     },
     "TableStatus":{
@@ -5386,7 +5386,7 @@
           "documentation":"<p>A list of cancellation reasons.</p>"
         }
       },
-      "documentation":"<p>The entire transaction request was canceled.</p> <p>DynamoDB cancels a <code>TransactWriteItems</code> request under the following circumstances:</p> <ul> <li> <p>A condition in one of the condition expressions is not met.</p> </li> <li> <p>A table in the <code>TransactWriteItems</code> request is in a different account or region.</p> </li> <li> <p>More than one action in the <code>TransactWriteItems</code> operation targets the same item.</p> </li> <li> <p>There is insufficient provisioned capacity for the transaction to be completed.</p> </li> <li> <p>An item size becomes too large (larger than 400 KB), or a local secondary index (LSI) becomes too large, or a similar validation error occurs because of changes made by the transaction.</p> </li> <li> <p>There is a user error, such as an invalid data format.</p> </li> </ul> <p>DynamoDB cancels a <code>TransactGetItems</code> request under the following circumstances:</p> <ul> <li> <p>There is an ongoing <code>TransactGetItems</code> operation that conflicts with a concurrent <code>PutItem</code>, <code>UpdateItem</code>, <code>DeleteItem</code> or <code>TransactWriteItems</code> request. In this case the <code>TransactGetItems</code> operation fails with a <code>TransactionCanceledException</code>.</p> </li> <li> <p>A table in the <code>TransactGetItems</code> request is in a different account or region.</p> </li> <li> <p>There is insufficient provisioned capacity for the transaction to be completed.</p> </li> <li> <p>There is a user error, such as an invalid data format.</p> </li> </ul> <note> <p>If using Java, DynamoDB lists the cancellation reasons on the <code>CancellationReasons</code> property. This property is not set for other languages. 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> </note> <p>Cancellation reason codes and possible error messages:</p> <ul> <li> <p>No Errors:</p> <ul> <li> <p>Code: <code>NONE</code> </p> </li> <li> <p>Message: <code>null</code> </p> </li> </ul> </li> <li> <p>Conditional Check Failed:</p> <ul> <li> <p>Code: <code>ConditionalCheckFailed</code> </p> </li> <li> <p>Message: The conditional request failed. </p> </li> </ul> </li> <li> <p>Item Collection Size Limit Exceeded:</p> <ul> <li> <p>Code: <code>ItemCollectionSizeLimitExceeded</code> </p> </li> <li> <p>Message: Collection size exceeded.</p> </li> </ul> </li> <li> <p>Transaction Conflict:</p> <ul> <li> <p>Code: <code>TransactionConflict</code> </p> </li> <li> <p>Message: Transaction is ongoing for the item.</p> </li> </ul> </li> <li> <p>Provisioned Throughput Exceeded:</p> <ul> <li> <p>Code: <code>ProvisionedThroughputExceeded</code> </p> </li> <li> <p>Messages:</p> <ul> <li> <p>The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API.</p> <note> <p>This Message is received when provisioned throughput is exceeded is on a provisioned DynamoDB table.</p> </note> </li> <li> <p>The level of configured provisioned throughput for one or more global secondary indexes of the table was exceeded. Consider increasing your provisioning level for the under-provisioned global secondary indexes with the UpdateTable API.</p> <note> <p>This message is returned when provisioned throughput is exceeded is on a provisioned GSI.</p> </note> </li> </ul> </li> </ul> </li> <li> <p>Throttling Error:</p> <ul> <li> <p>Code: <code>ThrottlingError</code> </p> </li> <li> <p>Messages: </p> <ul> <li> <p>Throughput exceeds the current capacity of your table or index. DynamoDB is automatically scaling your table or index so please try again shortly. If exceptions persist, check if you have a hot key: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html.</p> <note> <p>This message is returned when writes get throttled on an On-Demand table as DynamoDB is automatically scaling the table.</p> </note> </li> <li> <p>Throughput exceeds the current capacity for one or more global secondary indexes. DynamoDB is automatically scaling your index so please try again shortly.</p> <note> <p>This message is returned when when writes get throttled on an On-Demand GSI as DynamoDB is automatically scaling the GSI.</p> </note> </li> </ul> </li> </ul> </li> <li> <p>Validation Error:</p> <ul> <li> <p>Code: <code>ValidationError</code> </p> </li> <li> <p>Messages: </p> <ul> <li> <p>One or more parameter values were invalid.</p> </li> <li> <p>The update expression attempted to update the secondary index key beyond allowed size limits.</p> </li> <li> <p>The update expression attempted to update the secondary index key to unsupported type.</p> </li> <li> <p>An operand in the update expression has an incorrect data type.</p> </li> <li> <p>Item size to update has exceeded the maximum allowed size.</p> </li> <li> <p>Number overflow. Attempting to store a number with magnitude larger than supported range.</p> </li> <li> <p>Type mismatch for attribute to update.</p> </li> <li> <p>Nesting Levels have exceeded supported limits.</p> </li> <li> <p>The document path provided in the update expression is invalid for update.</p> </li> <li> <p>The provided expression refers to an attribute that does not exist in the item.</p> </li> </ul> </li> </ul> </li> </ul>",
+      "documentation":"<p>The entire transaction request was canceled.</p> <p>DynamoDB cancels a <code>TransactWriteItems</code> request under the following circumstances:</p> <ul> <li> <p>A condition in one of the condition expressions is not met.</p> </li> <li> <p>A table in the <code>TransactWriteItems</code> request is in a different account or region.</p> </li> <li> <p>More than one action in the <code>TransactWriteItems</code> operation targets the same item.</p> </li> <li> <p>There is insufficient provisioned capacity for the transaction to be completed.</p> </li> <li> <p>An item size becomes too large (larger than 400 KB), or a local secondary index (LSI) becomes too large, or a similar validation error occurs because of changes made by the transaction.</p> </li> <li> <p>There is a user error, such as an invalid data format.</p> </li> </ul> <p>DynamoDB cancels a <code>TransactGetItems</code> request under the following circumstances:</p> <ul> <li> <p>There is an ongoing <code>TransactGetItems</code> operation that conflicts with a concurrent <code>PutItem</code>, <code>UpdateItem</code>, <code>DeleteItem</code> or <code>TransactWriteItems</code> request. In this case the <code>TransactGetItems</code> operation fails with a <code>TransactionCanceledException</code>.</p> </li> <li> <p>A table in the <code>TransactGetItems</code> request is in a different account or region.</p> </li> <li> <p>There is insufficient provisioned capacity for the transaction to be completed.</p> </li> <li> <p>There is a user error, such as an invalid data format.</p> </li> </ul> <note> <p>If using Java, DynamoDB lists the cancellation reasons on the <code>CancellationReasons</code> property. This property is not set for other languages. 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> </note> <p>Cancellation reason codes and possible error messages:</p> <ul> <li> <p>No Errors:</p> <ul> <li> <p>Code: <code>None</code> </p> </li> <li> <p>Message: <code>null</code> </p> </li> </ul> </li> <li> <p>Conditional Check Failed:</p> <ul> <li> <p>Code: <code>ConditionalCheckFailed</code> </p> </li> <li> <p>Message: The conditional request failed. </p> </li> </ul> </li> <li> <p>Item Collection Size Limit Exceeded:</p> <ul> <li> <p>Code: <code>ItemCollectionSizeLimitExceeded</code> </p> </li> <li> <p>Message: Collection size exceeded.</p> </li> </ul> </li> <li> <p>Transaction Conflict:</p> <ul> <li> <p>Code: <code>TransactionConflict</code> </p> </li> <li> <p>Message: Transaction is ongoing for the item.</p> </li> </ul> </li> <li> <p>Provisioned Throughput Exceeded:</p> <ul> <li> <p>Code: <code>ProvisionedThroughputExceeded</code> </p> </li> <li> <p>Messages:</p> <ul> <li> <p>The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API.</p> <note> <p>This Message is received when provisioned throughput is exceeded is on a provisioned DynamoDB table.</p> </note> </li> <li> <p>The level of configured provisioned throughput for one or more global secondary indexes of the table was exceeded. Consider increasing your provisioning level for the under-provisioned global secondary indexes with the UpdateTable API.</p> <note> <p>This message is returned when provisioned throughput is exceeded is on a provisioned GSI.</p> </note> </li> </ul> </li> </ul> </li> <li> <p>Throttling Error:</p> <ul> <li> <p>Code: <code>ThrottlingError</code> </p> </li> <li> <p>Messages: </p> <ul> <li> <p>Throughput exceeds the current capacity of your table or index. DynamoDB is automatically scaling your table or index so please try again shortly. If exceptions persist, check if you have a hot key: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html.</p> <note> <p>This message is returned when writes get throttled on an On-Demand table as DynamoDB is automatically scaling the table.</p> </note> </li> <li> <p>Throughput exceeds the current capacity for one or more global secondary indexes. DynamoDB is automatically scaling your index so please try again shortly.</p> <note> <p>This message is returned when when writes get throttled on an On-Demand GSI as DynamoDB is automatically scaling the GSI.</p> </note> </li> </ul> </li> </ul> </li> <li> <p>Validation Error:</p> <ul> <li> <p>Code: <code>ValidationError</code> </p> </li> <li> <p>Messages: </p> <ul> <li> <p>One or more parameter values were invalid.</p> </li> <li> <p>The update expression attempted to update the secondary index key beyond allowed size limits.</p> </li> <li> <p>The update expression attempted to update the secondary index key to unsupported type.</p> </li> <li> <p>An operand in the update expression has an incorrect data type.</p> </li> <li> <p>Item size to update has exceeded the maximum allowed size.</p> </li> <li> <p>Number overflow. Attempting to store a number with magnitude larger than supported range.</p> </li> <li> <p>Type mismatch for attribute to update.</p> </li> <li> <p>Nesting Levels have exceeded supported limits.</p> </li> <li> <p>The document path provided in the update expression is invalid for update.</p> </li> <li> <p>The provided expression refers to an attribute that does not exist in the item.</p> </li> </ul> </li> </ul> </li> </ul>",
       "exception":true
     },
     "TransactionConflictException":{
diff --git a/botocore/data/dynamodbstreams/2012-08-10/service-2.json b/botocore/data/dynamodbstreams/2012-08-10/service-2.json
index 9dd95ee28..3fe832e36 100644
--- a/botocore/data/dynamodbstreams/2012-08-10/service-2.json
+++ b/botocore/data/dynamodbstreams/2012-08-10/service-2.json
@@ -117,7 +117,7 @@
         },
         "L":{
           "shape":"ListAttributeValue",
-          "documentation":"<p>An attribute of type List. For example:</p> <p> <code>\"L\": [ {\"S\": \"Cookies\"} , {\"S\": \"Coffee\"}, {\"N\", \"3.14159\"}]</code> </p>"
+          "documentation":"<p>An attribute of type List. For example:</p> <p> <code>\"L\": [ {\"S\": \"Cookies\"} , {\"S\": \"Coffee\"}, {\"N\": \"3.14159\"}]</code> </p>"
         },
         "NULL":{
           "shape":"NullAttributeValue",
@@ -314,7 +314,7 @@
           "documentation":"<p>Too many operations for a given subscriber.</p>"
         }
       },
-      "documentation":"<p>There is no limit to the number of daily on-demand backups that can be taken.</p> <p>Up to 50 simultaneous table operations are allowed per account. These operations include <code>CreateTable</code>, <code>UpdateTable</code>, <code>DeleteTable</code>,<code>UpdateTimeToLive</code>, <code>RestoreTableFromBackup</code>, and <code>RestoreTableToPointInTime</code>.</p> <p>The only exception is when you are creating a table with one or more secondary indexes. You can have up to 25 such requests running at a time; however, if the table or index specifications are complex, DynamoDB might temporarily reduce the number of concurrent operations.</p> <p>There is a soft account quota of 256 tables.</p>",
+      "documentation":"<p>There is no limit to the number of daily on-demand backups that can be taken. </p> <p>Up to 500 simultaneous table operations are allowed per account. These operations include <code>CreateTable</code>, <code>UpdateTable</code>, <code>DeleteTable</code>,<code>UpdateTimeToLive</code>, <code>RestoreTableFromBackup</code>, and <code>RestoreTableToPointInTime</code>. </p> <p>The only exception is when you are creating a table with one or more secondary indexes. You can have up to 250 such requests running at a time; however, if the table or index specifications are complex, DynamoDB might temporarily reduce the number of concurrent operations.</p> <p>There is a soft account quota of 2,500 tables.</p>",
       "exception":true
     },
     "ListAttributeValue":{
diff --git a/botocore/data/endpoints.json b/botocore/data/endpoints.json
index 27c23e5b6..5c173af81 100644
--- a/botocore/data/endpoints.json
+++ b/botocore/data/endpoints.json
@@ -2984,6 +2984,14 @@
           "us-west-2" : { }
         }
       },
+      "connect-campaigns" : {
+        "endpoints" : {
+          "ap-southeast-2" : { },
+          "eu-west-2" : { },
+          "us-east-1" : { },
+          "us-west-2" : { }
+        }
+      },
       "contact-lens" : {
         "endpoints" : {
           "ap-northeast-1" : { },
diff --git a/botocore/data/kafka/2018-11-14/service-2.json b/botocore/data/kafka/2018-11-14/service-2.json
index 9f929f44c..bb1f873a8 100644
--- a/botocore/data/kafka/2018-11-14/service-2.json
+++ b/botocore/data/kafka/2018-11-14/service-2.json
@@ -1467,7 +1467,7 @@
         "ClientSubnets": {
           "shape": "__listOf__string",
           "locationName": "clientSubnets",
-          "documentation": "\n            <p>The list of subnets to connect to in the client virtual private cloud (VPC). AWS creates elastic network interfaces inside these subnets. Client applications use elastic network interfaces to produce and consume data. Client subnets can't be in Availability Zone us-east-1e.</p>\n         "
+          "documentation": "\n            <p>The list of subnets to connect to in the client virtual private cloud (VPC). AWS creates elastic network interfaces inside these subnets. Client applications use elastic network interfaces to produce and consume data. Client subnets can't occupy the Availability Zone with ID use use1-az3.</p>\n         "
         },
         "InstanceType": {
           "shape": "__stringMin5Max32",
diff --git a/botocore/data/outposts/2019-12-03/service-2.json b/botocore/data/outposts/2019-12-03/service-2.json
index e691b60b8..348496a3d 100644
--- a/botocore/data/outposts/2019-12-03/service-2.json
+++ b/botocore/data/outposts/2019-12-03/service-2.json
@@ -562,6 +562,10 @@
         "ComputeAttributes":{
           "shape":"ComputeAttributes",
           "documentation":"<p> Information about compute hardware assets. </p>"
+        },
+        "AssetLocation":{
+          "shape":"AssetLocation",
+          "documentation":"<p> The position of an asset in a rack. </p>"
         }
       },
       "documentation":"<p> Information about hardware assets. </p>"
@@ -570,6 +574,16 @@
       "type":"list",
       "member":{"shape":"AssetInfo"}
     },
+    "AssetLocation":{
+      "type":"structure",
+      "members":{
+        "RackElevation":{
+          "shape":"RackElevation",
+          "documentation":"<p> The position of an asset in a rack measured in rack units. </p>"
+        }
+      },
+      "documentation":"<p> Information about the position of the asset in a rack. </p>"
+    },
     "AssetType":{
       "type":"string",
       "enum":["COMPUTE"]
@@ -1760,6 +1774,12 @@
       ]
     },
     "Quantity":{"type":"string"},
+    "RackElevation":{
+      "type":"float",
+      "box":true,
+      "max":99,
+      "min":0
+    },
     "RackId":{
       "type":"string",
       "max":20,
diff --git a/botocore/handlers.py b/botocore/handlers.py
index 04156e72f..5c09ffb90 100644
--- a/botocore/handlers.py
+++ b/botocore/handlers.py
@@ -1109,6 +1109,7 @@ BUILTIN_HANDLERS = [
     ('before-parameter-build.s3.UploadPart', sse_md5),
     ('before-parameter-build.s3.UploadPartCopy', sse_md5),
     ('before-parameter-build.s3.UploadPartCopy', copy_source_sse_md5),
+    ('before-parameter-build.s3.SelectObjectContent', sse_md5),
     ('before-parameter-build.ec2.RunInstances', base64_encode_user_data),
     (
         'before-parameter-build.autoscaling.CreateLaunchConfiguration',
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 3b86dd605..b2c4b0330 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -54,7 +54,7 @@ copyright = u'2013, Mitch Garnaat'
 # The short X.Y version.
 version = '1.27.'
 # The full version, including alpha/beta/rc tags.
-release = '1.27.11'
+release = '1.27.13'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/requirements-dev-lock.txt b/requirements-dev-lock.txt
index 37d6d1f1c..0ccc5870f 100644
--- a/requirements-dev-lock.txt
+++ b/requirements-dev-lock.txt
@@ -8,9 +8,9 @@ atomicwrites==1.4.0 \
     --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 \
     --hash=sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a
     # via -r requirements-dev.txt
-attrs==21.2.0 \
-    --hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \
-    --hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb
+attrs==21.4.0 \
+    --hash=sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4 \
+    --hash=sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd
     # via pytest
 behave==1.2.5 \
     --hash=sha256:07c741f30497b6f9361a9bc74c68418507cd17e70d6f586faa3bff57684a2ec8 \
@@ -82,9 +82,9 @@ execnet==1.9.0 \
     --hash=sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5 \
     --hash=sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142
     # via pytest-xdist
-importlib-metadata==4.8.1 \
-    --hash=sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15 \
-    --hash=sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1
+importlib-metadata==4.11.4 \
+    --hash=sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700 \
+    --hash=sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec
     # via
     #   pluggy
     #   pytest
@@ -97,36 +97,36 @@ jsonschema==2.5.1 \
     --hash=sha256:71e7b3bcf9fca408bcb65bb60892f375d3abdd2e4f296eeeb8fe0bbbfcde598e \
     --hash=sha256:9088494da4c74497a7a27842ae4ca9c3355b5f7754121edc440463eaf020f079
     # via -r requirements-dev.txt
-packaging==21.0 \
-    --hash=sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7 \
-    --hash=sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14
+packaging==21.3 \
+    --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \
+    --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522
     # via pytest
 parse==1.19.0 \
     --hash=sha256:9ff82852bcb65d139813e2a5197627a94966245c897796760a3a2a8eb66f020b
     # via
     #   behave
     #   parse-type
-parse-type==0.5.2 \
-    --hash=sha256:089a471b06327103865dfec2dd844230c3c658a4a1b5b4c8b6c16c8f77577f9e \
-    --hash=sha256:7f690b18d35048c15438d6d0571f9045cffbec5907e0b1ccf006f889e3a38c0b
+parse-type==0.6.0 \
+    --hash=sha256:20b43c660e48ed47f433bce5873a2a3d4b9b6a7ba47bd7f7d2a7cec4bec5551f \
+    --hash=sha256:c148e88436bd54dab16484108e882be3367f44952c649c9cd6b82a7370b650cb
     # via behave
 pluggy==1.0.0 \
     --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \
     --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3
     # via pytest
-py==1.10.0 \
-    --hash=sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3 \
-    --hash=sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a
+py==1.11.0 \
+    --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \
+    --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378
     # via
     #   pytest
     #   pytest-forked
-pyparsing==2.4.7 \
-    --hash=sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1 \
-    --hash=sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b
+pyparsing==3.0.9 \
+    --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \
+    --hash=sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc
     # via packaging
-pytest==6.2.5 \
-    --hash=sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89 \
-    --hash=sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134
+pytest==7.1.2 \
+    --hash=sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c \
+    --hash=sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45
     # via
     #   -r requirements-dev.txt
     #   pytest-cov
@@ -136,9 +136,9 @@ pytest-cov==2.12.1 \
     --hash=sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a \
     --hash=sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7
     # via -r requirements-dev.txt
-pytest-forked==1.3.0 \
-    --hash=sha256:6aa9ac7e00ad1a539c41bec6d21011332de671e938c7637378ec9710204e37ca \
-    --hash=sha256:dc4147784048e70ef5d437951728825a131b81714b398d5d52f17c7c144d8815
+pytest-forked==1.4.0 \
+    --hash=sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e \
+    --hash=sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8
     # via pytest-xdist
 pytest-xdist==2.4.0 \
     --hash=sha256:7b61ebb46997a0820a263553179d6d1e25a8c50d8a8620cd1aa1e20e3be99168 \
@@ -153,19 +153,20 @@ six==1.16.0 \
 toml==0.10.2 \
     --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \
     --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f
-    # via
-    #   pytest
-    #   pytest-cov
-typing-extensions==3.10.0.2 \
-    --hash=sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e \
-    --hash=sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7 \
-    --hash=sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34
+    # via pytest-cov
+tomli==2.0.1 \
+    --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
+    --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f
+    # via pytest
+typing-extensions==4.2.0 \
+    --hash=sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708 \
+    --hash=sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376
     # via importlib-metadata
 wheel==0.37.0 \
     --hash=sha256:21014b2bd93c6d0034b6ba5d35e4eb284340e09d63c59aef6fc14b0f346146fd \
     --hash=sha256:e2ef7239991699e3355d54f8e968a21bb940a1dbf34a4d226741e64462516fad
     # via -r requirements-dev.txt
-zipp==3.5.0 \
-    --hash=sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3 \
-    --hash=sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4
+zipp==3.8.0 \
+    --hash=sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad \
+    --hash=sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099
     # via importlib-metadata
diff --git a/requirements-dev.txt b/requirements-dev.txt
index a9bcc2f6f..e69ee7265 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -4,7 +4,7 @@ jsonschema==2.5.1
 coverage==5.5
 
 # Pytest specific deps
-pytest==6.2.5
+pytest==7.1.2
 pytest-cov==2.12.1
 pytest-xdist==2.4.0
 atomicwrites>=1.0 # Windows requirement
diff --git a/setup.py b/setup.py
index 96385a000..acd04b7dd 100644
--- a/setup.py
+++ b/setup.py
@@ -57,5 +57,6 @@ setup(
         'Programming Language :: Python :: 3.8',
         'Programming Language :: Python :: 3.9',
         'Programming Language :: Python :: 3.10',
+        'Programming Language :: Python :: 3.11',
     ],
 )


Test patch:
diff --git a/.github/workflows/run-crt-test.yml b/.github/workflows/run-crt-test.yml
index bf6da5462..26d0449b2 100644
--- a/.github/workflows/run-crt-test.yml
+++ b/.github/workflows/run-crt-test.yml
@@ -11,8 +11,9 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        python-version: ['3.7', '3.8', '3.9', '3.10']
+        python-version: ['3.7', '3.8', '3.9', '3.10', '3.11-dev']
         os: [ubuntu-latest, macOS-latest, windows-latest]
+
     steps:
       - uses: actions/checkout@v2
       - name: 'Set up Python ${{ matrix.python-version }}'
diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml
index 20b767554..7dfc97c3f 100644
--- a/.github/workflows/run-tests.yml
+++ b/.github/workflows/run-tests.yml
@@ -11,8 +11,9 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        python-version: ['3.7', '3.8', '3.9', '3.10']
+        python-version: ['3.7', '3.8', '3.9', '3.10', '3.11-dev']
         os: [ubuntu-latest, macOS-latest, windows-latest]
+
     steps:
       - uses: actions/checkout@v2
       - name: 'Set up Python ${{ matrix.python-version }}'
diff --git a/tests/unit/test_handlers.py b/tests/unit/test_handlers.py
index c7ae140a2..ab7b47ebb 100644
--- a/tests/unit/test_handlers.py
+++ b/tests/unit/test_handlers.py
@@ -1166,6 +1166,7 @@ class TestSSEMD5(BaseMD5Test):
             'CreateMultipartUpload',
             'UploadPart',
             'UploadPartCopy',
+            'SelectObjectContent',
         ):
             event = 'before-parameter-build.s3.%s' % op
             params = {