From 6ceecaa69e62d8390e4f813b6b0f46559ef9902f Mon Sep 17 00:00:00 2001 From: Tim Bendt Date: Wed, 26 Nov 2025 11:50:55 -0500 Subject: [PATCH] lockfile again --- composer.lock | 5589 ++++++- vendor/aws/aws-crt-php/CODE_OF_CONDUCT.md | 4 + vendor/aws/aws-crt-php/LICENSE | 175 + vendor/aws/aws-crt-php/NOTICE | 1 + vendor/aws/aws-crt-php/composer.json | 35 + vendor/aws/aws-crt-php/format-check.py | 46 + .../src/AWS/CRT/Auth/AwsCredentials.php | 69 + .../src/AWS/CRT/Auth/CredentialsProvider.php | 23 + .../aws-crt-php/src/AWS/CRT/Auth/Signable.php | 43 + .../src/AWS/CRT/Auth/SignatureType.php | 15 + .../src/AWS/CRT/Auth/SignedBodyHeaderType.php | 11 + .../aws-crt-php/src/AWS/CRT/Auth/Signing.php | 22 + .../src/AWS/CRT/Auth/SigningAlgorithm.php | 11 + .../src/AWS/CRT/Auth/SigningConfigAWS.php | 75 + .../src/AWS/CRT/Auth/SigningResult.php | 33 + .../CRT/Auth/StaticCredentialsProvider.php | 35 + vendor/aws/aws-crt-php/src/AWS/CRT/CRT.php | 358 + .../aws-crt-php/src/AWS/CRT/HTTP/Headers.php | 50 + .../aws-crt-php/src/AWS/CRT/HTTP/Message.php | 95 + .../aws-crt-php/src/AWS/CRT/HTTP/Request.php | 32 + .../aws-crt-php/src/AWS/CRT/HTTP/Response.php | 27 + .../src/AWS/CRT/IO/EventLoopGroup.php | 39 + .../src/AWS/CRT/IO/InputStream.php | 50 + .../src/AWS/CRT/Internal/Encoding.php | 37 + .../src/AWS/CRT/Internal/Extension.php | 29 + vendor/aws/aws-crt-php/src/AWS/CRT/Log.php | 47 + .../src/AWS/CRT/NativeResource.php | 42 + .../aws/aws-crt-php/src/AWS/CRT/Options.php | 77 + vendor/aws/aws-sdk-php/CODE_OF_CONDUCT.md | 4 + vendor/aws/aws-sdk-php/CRT_INSTRUCTIONS.md | 4 + vendor/aws/aws-sdk-php/LICENSE | 141 + vendor/aws/aws-sdk-php/NOTICE | 17 + vendor/aws/aws-sdk-php/THIRD-PARTY-LICENSES | 84 + vendor/aws/aws-sdk-php/composer.json | 73 + .../aws/aws-sdk-php/src/AIOps/AIOpsClient.php | 31 + .../src/AIOps/Exception/AIOpsException.php | 9 + .../ARCRegionSwitch/ARCRegionSwitchClient.php | 49 + .../Exception/ARCRegionSwitchException.php | 9 + .../src/ARCZonalShift/ARCZonalShiftClient.php | 39 + .../Exception/ARCZonalShiftException.php | 9 + .../src/AbstractConfigurationProvider.php | 157 + .../aws/aws-sdk-php/src/Api/AbstractModel.php | 89 + .../aws/aws-sdk-php/src/Api/ApiProvider.php | 244 + .../aws-sdk-php/src/Api/DateTimeResult.php | 134 + vendor/aws/aws-sdk-php/src/Api/DocModel.php | 139 + .../Api/ErrorParser/AbstractErrorParser.php | 99 + .../src/Api/ErrorParser/JsonParserTrait.php | 144 + .../Api/ErrorParser/JsonRpcErrorParser.php | 47 + .../Api/ErrorParser/RestJsonErrorParser.php | 49 + .../src/Api/ErrorParser/XmlErrorParser.php | 111 + vendor/aws/aws-sdk-php/src/Api/ListShape.php | 35 + vendor/aws/aws-sdk-php/src/Api/MapShape.php | 54 + vendor/aws/aws-sdk-php/src/Api/Operation.php | 158 + .../src/Api/Parser/AbstractParser.php | 46 + .../src/Api/Parser/AbstractRestParser.php | 216 + .../src/Api/Parser/Crc32ValidatingParser.php | 54 + .../Parser/DecodingEventStreamIterator.php | 347 + .../src/Api/Parser/EventParsingIterator.php | 211 + .../Api/Parser/Exception/ParserException.php | 56 + .../aws-sdk-php/src/Api/Parser/JsonParser.php | 74 + .../src/Api/Parser/JsonRpcParser.php | 82 + .../src/Api/Parser/MetadataParserTrait.php | 95 + ...kableStreamDecodingEventStreamIterator.php | 101 + .../src/Api/Parser/PayloadParserTrait.php | 61 + .../src/Api/Parser/QueryParser.php | 68 + .../src/Api/Parser/RestJsonParser.php | 64 + .../src/Api/Parser/RestXmlParser.php | 42 + .../aws-sdk-php/src/Api/Parser/XmlParser.php | 183 + .../src/Api/Serializer/Ec2ParamBuilder.php | 38 + .../src/Api/Serializer/JsonBody.php | 116 + .../src/Api/Serializer/JsonRpcSerializer.php | 87 + .../src/Api/Serializer/QueryParamBuilder.php | 158 + .../src/Api/Serializer/QuerySerializer.php | 82 + .../src/Api/Serializer/RestJsonSerializer.php | 41 + .../src/Api/Serializer/RestSerializer.php | 486 + .../src/Api/Serializer/RestXmlSerializer.php | 50 + .../src/Api/Serializer/XmlBody.php | 256 + vendor/aws/aws-sdk-php/src/Api/Service.php | 564 + vendor/aws/aws-sdk-php/src/Api/Shape.php | 77 + vendor/aws/aws-sdk-php/src/Api/ShapeMap.php | 109 + .../aws-sdk-php/src/Api/StructureShape.php | 105 + .../src/Api/SupportedProtocols.php | 26 + .../aws-sdk-php/src/Api/TimestampShape.php | 48 + vendor/aws/aws-sdk-php/src/Api/Validator.php | 336 + .../aws-sdk-php/src/Arn/AccessPointArn.php | 66 + .../src/Arn/AccessPointArnInterface.php | 10 + vendor/aws/aws-sdk-php/src/Arn/Arn.php | 188 + .../aws/aws-sdk-php/src/Arn/ArnInterface.php | 37 + vendor/aws/aws-sdk-php/src/Arn/ArnParser.php | 69 + .../src/Arn/Exception/InvalidArnException.php | 7 + .../src/Arn/ObjectLambdaAccessPointArn.php | 35 + .../src/Arn/ResourceTypeAndIdTrait.php | 30 + .../aws-sdk-php/src/Arn/S3/AccessPointArn.php | 27 + .../src/Arn/S3/BucketArnInterface.php | 12 + .../src/Arn/S3/MultiRegionAccessPointArn.php | 38 + .../src/Arn/S3/OutpostsAccessPointArn.php | 110 + .../src/Arn/S3/OutpostsArnInterface.php | 12 + .../src/Arn/S3/OutpostsBucketArn.php | 99 + .../src/Artifact/ArtifactClient.php | 23 + .../Artifact/Exception/ArtifactException.php | 9 + vendor/aws/aws-sdk-php/src/AwsClient.php | 800 + .../aws-sdk-php/src/AwsClientInterface.php | 169 + vendor/aws/aws-sdk-php/src/AwsClientTrait.php | 101 + vendor/aws/aws-sdk-php/src/CacheInterface.php | 34 + .../src/CleanRooms/CleanRoomsClient.php | 183 + .../Exception/CleanRoomsException.php | 9 + .../src/CleanRoomsML/CleanRoomsMLClient.php | 127 + .../Exception/CleanRoomsMLException.php | 9 + vendor/aws/aws-sdk-php/src/ClientResolver.php | 1460 ++ .../AbstractMonitoringMiddleware.php | 309 + .../ApiCallAttemptMonitoringMiddleware.php | 262 + .../ApiCallMonitoringMiddleware.php | 175 + .../ClientSideMonitoring/Configuration.php | 77 + .../ConfigurationInterface.php | 44 + .../ConfigurationProvider.php | 236 + .../Exception/ConfigurationException.php | 15 + .../MonitoringMiddlewareInterface.php | 35 + vendor/aws/aws-sdk-php/src/Command.php | 134 + .../aws/aws-sdk-php/src/CommandInterface.php | 42 + vendor/aws/aws-sdk-php/src/CommandPool.php | 151 + .../src/ConfigurationProviderInterface.php | 13 + .../AssumeRoleCredentialProvider.php | 67 + ...eRoleWithWebIdentityCredentialProvider.php | 201 + .../src/Credentials/CredentialProvider.php | 1113 ++ .../src/Credentials/CredentialSources.php | 23 + .../src/Credentials/Credentials.php | 150 + .../src/Credentials/CredentialsInterface.php | 52 + .../src/Credentials/CredentialsUtils.php | 35 + .../src/Credentials/EcsCredentialProvider.php | 262 + .../Credentials/InstanceProfileProvider.php | 468 + .../Credentials/LoginCredentialProvider.php | 527 + .../src/Crypto/AbstractCryptoClient.php | 121 + .../src/Crypto/AbstractCryptoClientV2.php | 119 + .../src/Crypto/AesDecryptingStream.php | 146 + .../src/Crypto/AesEncryptingStream.php | 151 + .../src/Crypto/AesGcmDecryptingStream.php | 104 + .../src/Crypto/AesGcmEncryptingStream.php | 119 + .../src/Crypto/AesStreamInterface.php | 30 + .../src/Crypto/AesStreamInterfaceV2.php | 31 + .../aws/aws-sdk-php/src/Crypto/Cipher/Cbc.php | 88 + .../src/Crypto/Cipher/CipherBuilderTrait.php | 72 + .../src/Crypto/Cipher/CipherMethod.php | 59 + .../src/Crypto/DecryptionTrait.php | 181 + .../src/Crypto/DecryptionTraitV2.php | 249 + .../src/Crypto/EncryptionTrait.php | 192 + .../src/Crypto/EncryptionTraitV2.php | 196 + .../src/Crypto/KmsMaterialsProvider.php | 121 + .../src/Crypto/KmsMaterialsProviderV2.php | 100 + .../src/Crypto/MaterialsProvider.php | 105 + .../src/Crypto/MaterialsProviderInterface.php | 61 + .../Crypto/MaterialsProviderInterfaceV2.php | 53 + .../src/Crypto/MaterialsProviderV2.php | 66 + .../src/Crypto/MetadataEnvelope.php | 61 + .../src/Crypto/MetadataStrategyInterface.php | 30 + .../src/DSQL/AuthTokenGenerator.php | 126 + .../aws/aws-sdk-php/src/DSQL/DSQLClient.php | 33 + .../src/DSQL/Exception/DSQLException.php | 9 + .../src/Deadline/DeadlineClient.php | 235 + .../Deadline/Exception/DeadlineException.php | 9 + .../src/DefaultsMode/Configuration.php | 131 + .../DefaultsMode/ConfigurationInterface.php | 51 + .../DefaultsMode/ConfigurationProvider.php | 201 + .../Exception/ConfigurationException.php | 14 + .../aws-sdk-php/src/DoctrineCacheAdapter.php | 70 + .../src/Endpoint/EndpointProvider.php | 96 + .../aws-sdk-php/src/Endpoint/Partition.php | 322 + .../Endpoint/PartitionEndpointProvider.php | 130 + .../src/Endpoint/PartitionInterface.php | 56 + .../src/Endpoint/PatternEndpointProvider.php | 51 + .../UseDualstackEndpoint/Configuration.php | 41 + .../ConfigurationInterface.php | 19 + .../ConfigurationProvider.php | 173 + .../Exception/ConfigurationException.php | 14 + .../UseFipsEndpoint/Configuration.php | 37 + .../ConfigurationInterface.php | 19 + .../UseFipsEndpoint/ConfigurationProvider.php | 179 + .../Exception/ConfigurationException.php | 14 + .../src/EndpointDiscovery/Configuration.php | 48 + .../ConfigurationInterface.php | 30 + .../ConfigurationProvider.php | 240 + .../EndpointDiscoveryMiddleware.php | 423 + .../src/EndpointDiscovery/EndpointList.php | 85 + .../Exception/ConfigurationException.php | 14 + .../src/EndpointParameterMiddleware.php | 89 + .../EndpointV2/EndpointDefinitionProvider.php | 71 + .../src/EndpointV2/EndpointProviderV2.php | 69 + .../src/EndpointV2/EndpointV2Middleware.php | 427 + .../EndpointV2/EndpointV2SerializerTrait.php | 77 + .../src/EndpointV2/Rule/AbstractRule.php | 62 + .../src/EndpointV2/Rule/EndpointRule.php | 111 + .../src/EndpointV2/Rule/ErrorRule.php | 45 + .../src/EndpointV2/Rule/RuleCreator.php | 26 + .../src/EndpointV2/Rule/TreeRule.php | 61 + .../src/EndpointV2/Ruleset/Ruleset.php | 117 + .../EndpointV2/Ruleset/RulesetEndpoint.php | 63 + .../EndpointV2/Ruleset/RulesetParameter.php | 179 + .../Ruleset/RulesetStandardLibrary.php | 434 + .../EntityResolutionClient.php | 85 + .../Exception/EntityResolutionException.php | 9 + .../src/Exception/AwsException.php | 263 + .../src/Exception/CommonRuntimeException.php | 7 + .../CouldNotCreateChecksumException.php | 25 + .../src/Exception/CredentialsException.php | 11 + .../src/Exception/CryptoException.php | 11 + .../src/Exception/CryptoPolyfillException.php | 10 + .../Exception/EventStreamDataException.php | 38 + .../IncalculablePayloadException.php | 11 + .../src/Exception/InvalidJsonException.php | 11 + .../src/Exception/InvalidRegionException.php | 11 + .../Exception/MultipartUploadException.php | 63 + .../src/Exception/TokenException.php | 11 + .../src/Exception/UnresolvedApiException.php | 11 + .../Exception/UnresolvedEndpointException.php | 11 + .../UnresolvedSignatureException.php | 11 + .../src/Handler/Guzzle/GuzzleHandler.php | 89 + .../src/Handler/GuzzleV6/GuzzleHandler.php | 11 + vendor/aws/aws-sdk-php/src/HandlerList.php | 469 + vendor/aws/aws-sdk-php/src/HasDataTrait.php | 81 + .../src/HasMonitoringEventsTrait.php | 39 + vendor/aws/aws-sdk-php/src/HashInterface.php | 27 + vendor/aws/aws-sdk-php/src/HashingStream.php | 63 + vendor/aws/aws-sdk-php/src/History.php | 161 + .../src/IdempotencyTokenMiddleware.php | 120 + .../src/InputValidationMiddleware.php | 74 + vendor/aws/aws-sdk-php/src/JsonCompiler.php | 25 + vendor/aws/aws-sdk-php/src/LruArrayCache.php | 83 + vendor/aws/aws-sdk-php/src/MetricsBuilder.php | 503 + vendor/aws/aws-sdk-php/src/Middleware.php | 473 + vendor/aws/aws-sdk-php/src/MockHandler.php | 148 + .../src/MonitoringEventsInterface.php | 30 + .../aws/aws-sdk-php/src/MultiRegionClient.php | 269 + vendor/aws/aws-sdk-php/src/PhpHash.php | 81 + .../aws-sdk-php/src/PresignUrlMiddleware.php | 128 + .../aws/aws-sdk-php/src/Psr16CacheAdapter.php | 30 + .../aws/aws-sdk-php/src/PsrCacheAdapter.php | 38 + .../src/QueryCompatibleInputMiddleware.php | 234 + .../Exception/RTBFabricException.php | 9 + .../src/RTBFabric/RTBFabricClient.php | 63 + .../Exception/RepostspaceException.php | 9 + .../src/Repostspace/RepostspaceClient.php | 47 + .../src/RequestCompressionMiddleware.php | 172 + .../src/ResponseContainerInterface.php | 15 + vendor/aws/aws-sdk-php/src/Result.php | 57 + .../aws/aws-sdk-php/src/ResultInterface.php | 54 + .../aws/aws-sdk-php/src/ResultPaginator.php | 206 + .../aws-sdk-php/src/Retry/Configuration.php | 61 + .../src/Retry/ConfigurationInterface.php | 30 + .../src/Retry/ConfigurationProvider.php | 222 + .../Exception/ConfigurationException.php | 14 + .../aws-sdk-php/src/Retry/QuotaManager.php | 86 + .../aws/aws-sdk-php/src/Retry/RateLimiter.php | 182 + .../src/Retry/RetryHelperTrait.php | 56 + .../aws/aws-sdk-php/src/RetryMiddleware.php | 277 + .../aws/aws-sdk-php/src/RetryMiddlewareV2.php | 377 + .../src/S3/AmbiguousSuccessParser.php | 79 + .../src/S3/ApplyChecksumMiddleware.php | 242 + vendor/aws/aws-sdk-php/src/S3/BatchDelete.php | 240 + .../src/S3/BucketEndpointArnMiddleware.php | 355 + .../src/S3/BucketEndpointMiddleware.php | 111 + .../src/S3/CalculatesChecksumTrait.php | 59 + .../src/S3/Crypto/CryptoParamsTrait.php | 75 + .../src/S3/Crypto/CryptoParamsTraitV2.php | 19 + .../src/S3/Crypto/HeadersMetadataStrategy.php | 52 + .../InstructionFileMetadataStrategy.php | 90 + .../src/S3/Crypto/S3EncryptionClient.php | 344 + .../src/S3/Crypto/S3EncryptionClientV2.php | 450 + .../Crypto/S3EncryptionMultipartUploader.php | 169 + .../S3EncryptionMultipartUploaderV2.php | 176 + .../src/S3/Crypto/UserAgentTrait.php | 31 + .../src/S3/EndpointRegionHelperTrait.php | 106 + .../DeleteMultipleObjectsException.php | 68 + .../Exception/PermanentRedirectException.php | 4 + .../src/S3/Exception/S3Exception.php | 9 + .../Exception/S3MultipartUploadException.php | 84 + .../src/S3/ExpiresParsingMiddleware.php | 56 + .../src/S3/GetBucketLocationParser.php | 49 + .../aws/aws-sdk-php/src/S3/MultipartCopy.php | 249 + .../aws-sdk-php/src/S3/MultipartUploader.php | 181 + .../src/S3/MultipartUploadingTrait.php | 151 + .../aws/aws-sdk-php/src/S3/ObjectCopier.php | 170 + .../aws/aws-sdk-php/src/S3/ObjectUploader.php | 150 + .../Parser/GetBucketLocationResultMutator.php | 42 + .../aws-sdk-php/src/S3/Parser/S3Parser.php | 275 + .../src/S3/Parser/S3ResultMutator.php | 36 + .../ValidateResponseChecksumResultMutator.php | 207 + .../src/S3/PermanentRedirectMiddleware.php | 62 + vendor/aws/aws-sdk-php/src/S3/PostObject.php | 160 + .../aws/aws-sdk-php/src/S3/PostObjectV4.php | 195 + .../src/S3/PutObjectUrlMiddleware.php | 59 + .../src/S3/RegionalEndpoint/Configuration.php | 42 + .../ConfigurationInterface.php | 22 + .../ConfigurationProvider.php | 195 + .../Exception/ConfigurationException.php | 14 + .../S3/RetryableMalformedResponseParser.php | 56 + vendor/aws/aws-sdk-php/src/S3/S3Client.php | 1323 ++ .../aws-sdk-php/src/S3/S3ClientInterface.php | 369 + .../aws/aws-sdk-php/src/S3/S3ClientTrait.php | 399 + .../src/S3/S3EndpointMiddleware.php | 343 + .../src/S3/S3MultiRegionClient.php | 384 + vendor/aws/aws-sdk-php/src/S3/S3UriParser.php | 163 + .../aws/aws-sdk-php/src/S3/SSECMiddleware.php | 75 + .../aws/aws-sdk-php/src/S3/StreamWrapper.php | 1005 ++ vendor/aws/aws-sdk-php/src/S3/Transfer.php | 456 + .../src/S3/UseArnRegion/Configuration.php | 37 + .../UseArnRegion/ConfigurationInterface.php | 19 + .../S3/UseArnRegion/ConfigurationProvider.php | 175 + .../Exception/ConfigurationException.php | 14 + .../src/S3/ValidateResponseChecksumParser.php | 149 + .../S3Tables/Exception/S3TablesException.php | 9 + .../src/S3Tables/S3TablesClient.php | 81 + .../Exception/S3VectorsException.php | 9 + .../src/S3Vectors/S3VectorsClient.php | 41 + vendor/aws/aws-sdk-php/src/Sdk.php | 942 ++ .../src/Signature/AnonymousSignature.php | 33 + .../src/Signature/DpopSignature.php | 246 + .../src/Signature/S3ExpressSignature.php | 47 + .../src/Signature/S3SignatureV4.php | 125 + .../src/Signature/SignatureInterface.php | 45 + .../src/Signature/SignatureProvider.php | 150 + .../src/Signature/SignatureTrait.php | 48 + .../aws-sdk-php/src/Signature/SignatureV4.php | 584 + .../src/Signin/Exception/SigninException.php | 9 + .../aws-sdk-php/src/Signin/SigninClient.php | 11 + .../Exception/SimSpaceWeaverException.php | 9 + .../SimSpaceWeaver/SimSpaceWeaverClient.php | 41 + .../Exception/SocialMessagingException.php | 9 + .../SocialMessaging/SocialMessagingClient.php | 51 + .../src/StreamRequestPayloadMiddleware.php | 85 + .../Exception/TaxSettingsException.php | 9 + .../src/TaxSettings/TaxSettingsClient.php | 41 + .../Textract/Exception/TextractException.php | 9 + .../src/Textract/TextractClient.php | 59 + .../Exception/TimestreamInfluxDBException.php | 9 + .../TimestreamInfluxDBClient.php | 43 + .../Exception/TimestreamQueryException.php | 9 + .../TimestreamQuery/TimestreamQueryClient.php | 39 + .../Exception/TimestreamWriteException.php | 9 + .../TimestreamWrite/TimestreamWriteClient.php | 47 + .../src/Tnb/Exception/TnbException.php | 9 + vendor/aws/aws-sdk-php/src/Tnb/TnbClient.php | 75 + .../src/Token/BearerTokenAuthorization.php | 33 + .../src/Token/BedrockTokenProvider.php | 105 + .../aws-sdk-php/src/Token/ParsesIniTrait.php | 44 + .../RefreshableTokenProviderInterface.php | 23 + vendor/aws/aws-sdk-php/src/Token/SsoToken.php | 129 + .../src/Token/SsoTokenProvider.php | 280 + vendor/aws/aws-sdk-php/src/Token/Token.php | 127 + .../src/Token/TokenAuthorization.php | 24 + .../aws-sdk-php/src/Token/TokenInterface.php | 36 + .../aws-sdk-php/src/Token/TokenProvider.php | 271 + .../aws/aws-sdk-php/src/Token/TokenSource.php | 7 + .../aws/aws-sdk-php/src/TraceMiddleware.php | 360 + .../Exception/TranscribeServiceException.php | 9 + .../TranscribeServiceClient.php | 95 + .../Transfer/Exception/TransferException.php | 9 + .../src/Transfer/TransferClient.php | 151 + .../Exception/TranslateException.php | 9 + .../src/Translate/TranslateClient.php | 47 + .../Exception/TrustedAdvisorException.php | 9 + .../TrustedAdvisor/TrustedAdvisorClient.php | 31 + .../aws-sdk-php/src/UserAgentMiddleware.php | 265 + vendor/aws/aws-sdk-php/src/Waiter.php | 285 + .../aws-sdk-php/src/WrappedHttpHandler.php | 208 + .../aws/aws-sdk-php/src/data/aliases.json.php | 3 + .../aws-sdk-php/src/data/endpoints.json.php | 3 + .../data/endpoints_prefix_history.json.php | 3 + .../src/data/grandfathered-services.json.php | 3 + .../aws-sdk-php/src/data/manifest.json.php | 3 + .../aws-sdk-php/src/data/partitions.json.php | 3 + .../src/data/s3/2006-03-01/api-2.json.php | 3 + .../2006-03-01/endpoint-rule-set-1.json.php | 3 + .../data/s3/2006-03-01/paginators-1.json.php | 3 + .../src/data/s3/2006-03-01/smoke.json.php | 3 + .../src/data/s3/2006-03-01/waiters-1.json.php | 3 + .../src/data/s3/2006-03-01/waiters-2.json.php | 3 + .../data/s3tables/2018-05-10/api-2.json.php | 3 + .../2018-05-10/endpoint-rule-set-1.json.php | 3 + .../s3tables/2018-05-10/paginators-1.json.php | 3 + .../data/s3tables/2018-05-10/smoke.json.php | 3 + .../s3tables/2018-05-10/waiters-2.json.php | 3 + .../data/s3vectors/2025-07-15/api-2.json.php | 3 + .../2025-07-15/endpoint-rule-set-1.json.php | 3 + .../2025-07-15/paginators-1.json.php | 3 + .../data/s3vectors/2025-07-15/smoke.json.php | 3 + .../s3vectors/2025-07-15/waiters-2.json.php | 3 + .../data/sdk-default-configuration.json.php | 3 + .../socialmessaging/2024-01-01/api-2.json.php | 3 + .../2024-01-01/endpoint-rule-set-1.json.php | 3 + .../2024-01-01/paginators-1.json.php | 3 + vendor/aws/aws-sdk-php/src/functions.php | 568 + vendor/bin/carbon | 119 + vendor/bin/jp.php | 119 + vendor/bin/var-dump-server | 119 + .../fix-php-post-input/FixPhpPostInput.php | 151 + .../fix-php-post-input/LICENSE.md | 21 + .../fix-php-post-input/bootstrap.php | 5 + .../fix-php-post-input/composer.json | 43 + .../fix-php-post-input/composer.lock | 72 + .../carbonphp/carbon-doctrine-types/LICENSE | 21 + .../carbon-doctrine-types/composer.json | 36 + .../Carbon/Doctrine/CarbonDoctrineType.php | 16 + .../Carbon/Doctrine/CarbonImmutableType.php | 9 + .../src/Carbon/Doctrine/CarbonType.php | 9 + .../Carbon/Doctrine/CarbonTypeConverter.php | 131 + .../Doctrine/DateTimeDefaultPrecision.php | 30 + .../Carbon/Doctrine/DateTimeImmutableType.php | 32 + .../src/Carbon/Doctrine/DateTimeType.php | 24 + vendor/clue/stream-filter/.github/FUNDING.yml | 2 + vendor/clue/stream-filter/LICENSE | 21 + vendor/clue/stream-filter/composer.json | 32 + .../clue/stream-filter/src/CallbackFilter.php | 120 + vendor/clue/stream-filter/src/functions.php | 380 + .../stream-filter/src/functions_include.php | 9 + vendor/composer/ca-bundle/LICENSE | 19 + vendor/composer/ca-bundle/composer.json | 54 + vendor/composer/ca-bundle/res/cacert.pem | 3601 ++++ vendor/composer/ca-bundle/src/CaBundle.php | 322 + vendor/composer/installed.json | 5819 ++++++- vendor/composer/installed.php | 820 +- vendor/doctrine/deprecations/LICENSE | 19 + vendor/doctrine/deprecations/composer.json | 39 + .../doctrine/deprecations/src/Deprecation.php | 309 + .../src/PHPUnit/VerifyDeprecations.php | 66 + vendor/doctrine/lexer/LICENSE | 19 + vendor/doctrine/lexer/UPGRADE.md | 14 + vendor/doctrine/lexer/composer.json | 56 + vendor/doctrine/lexer/src/AbstractLexer.php | 342 + vendor/doctrine/lexer/src/Token.php | 145 + vendor/egulias/email-validator/LICENSE | 19 + vendor/egulias/email-validator/composer.json | 37 + .../email-validator/src/EmailLexer.php | 345 + .../email-validator/src/EmailParser.php | 90 + .../email-validator/src/EmailValidator.php | 67 + .../email-validator/src/MessageIDParser.php | 91 + vendor/egulias/email-validator/src/Parser.php | 78 + .../email-validator/src/Parser/Comment.php | 104 + .../CommentStrategy/CommentStrategy.php | 18 + .../Parser/CommentStrategy/DomainComment.php | 37 + .../Parser/CommentStrategy/LocalComment.php | 37 + .../src/Parser/DomainLiteral.php | 211 + .../email-validator/src/Parser/DomainPart.php | 316 + .../src/Parser/DoubleQuote.php | 87 + .../src/Parser/FoldingWhiteSpace.php | 86 + .../email-validator/src/Parser/IDLeftPart.php | 15 + .../src/Parser/IDRightPart.php | 29 + .../email-validator/src/Parser/LocalPart.php | 165 + .../email-validator/src/Parser/PartParser.php | 63 + .../src/Result/InvalidEmail.php | 46 + .../src/Result/MultipleErrors.php | 56 + .../src/Result/Reason/AtextAfterCFWS.php | 16 + .../src/Result/Reason/CRLFAtTheEnd.php | 19 + .../src/Result/Reason/CRLFX2.php | 16 + .../src/Result/Reason/CRNoLF.php | 16 + .../src/Result/Reason/CharNotAllowed.php | 16 + .../src/Result/Reason/CommaInDomain.php | 16 + .../src/Result/Reason/CommentsInIDRight.php | 16 + .../src/Result/Reason/ConsecutiveAt.php | 17 + .../src/Result/Reason/ConsecutiveDot.php | 16 + .../src/Result/Reason/DetailedReason.php | 13 + .../src/Result/Reason/DomainAcceptsNoMail.php | 16 + .../src/Result/Reason/DomainHyphened.php | 16 + .../src/Result/Reason/DomainTooLong.php | 16 + .../src/Result/Reason/DotAtEnd.php | 16 + .../src/Result/Reason/DotAtStart.php | 16 + .../src/Result/Reason/EmptyReason.php | 16 + .../src/Result/Reason/ExceptionFound.php | 26 + .../src/Result/Reason/ExpectingATEXT.php | 16 + .../src/Result/Reason/ExpectingCTEXT.php | 16 + .../src/Result/Reason/ExpectingDTEXT.php | 16 + .../Reason/ExpectingDomainLiteralClose.php | 16 + .../src/Result/Reason/LabelTooLong.php | 16 + .../Result/Reason/LocalOrReservedDomain.php | 16 + .../src/Result/Reason/NoDNSRecord.php | 16 + .../src/Result/Reason/NoDomainPart.php | 16 + .../src/Result/Reason/NoLocalPart.php | 16 + .../src/Result/Reason/RFCWarnings.php | 16 + .../src/Result/Reason/Reason.php | 16 + .../src/Result/Reason/SpoofEmail.php | 17 + .../src/Result/Reason/UnOpenedComment.php | 16 + .../Result/Reason/UnableToGetDNSRecord.php | 19 + .../src/Result/Reason/UnclosedComment.php | 16 + .../Result/Reason/UnclosedQuotedString.php | 16 + .../src/Result/Reason/UnusualElements.php | 26 + .../email-validator/src/Result/Result.php | 27 + .../email-validator/src/Result/SpoofEmail.php | 13 + .../email-validator/src/Result/ValidEmail.php | 27 + .../src/Validation/DNSCheckValidation.php | 191 + .../src/Validation/DNSGetRecordWrapper.php | 28 + .../src/Validation/DNSRecords.php | 35 + .../src/Validation/EmailValidation.php | 34 + .../Exception/EmptyValidationList.php | 16 + .../Validation/Extra/SpoofCheckValidation.php | 52 + .../src/Validation/MessageIDValidation.php | 51 + .../Validation/MultipleValidationWithAnd.php | 117 + .../Validation/NoRFCWarningsValidation.php | 41 + .../src/Validation/RFCValidation.php | 55 + .../src/Warning/AddressLiteral.php | 14 + .../src/Warning/CFWSNearAt.php | 13 + .../src/Warning/CFWSWithFWS.php | 13 + .../email-validator/src/Warning/Comment.php | 13 + .../src/Warning/DeprecatedComment.php | 13 + .../src/Warning/DomainLiteral.php | 14 + .../src/Warning/EmailTooLong.php | 15 + .../src/Warning/IPV6BadChar.php | 14 + .../src/Warning/IPV6ColonEnd.php | 14 + .../src/Warning/IPV6ColonStart.php | 14 + .../src/Warning/IPV6Deprecated.php | 14 + .../src/Warning/IPV6DoubleColon.php | 14 + .../src/Warning/IPV6GroupCount.php | 14 + .../src/Warning/IPV6MaxGroups.php | 14 + .../src/Warning/LocalTooLong.php | 15 + .../src/Warning/NoDNSMXRecord.php | 14 + .../src/Warning/ObsoleteDTEXT.php | 14 + .../src/Warning/QuotedPart.php | 17 + .../src/Warning/QuotedString.php | 17 + .../email-validator/src/Warning/TLD.php | 13 + .../email-validator/src/Warning/Warning.php | 47 + .../.github/workflows/unit-tests.yaml | 37 + vendor/erusev/parsedown/LICENSE.txt | 20 + vendor/erusev/parsedown/Parsedown.php | 1994 +++ vendor/erusev/parsedown/composer.json | 33 + vendor/ezyang/htmlpurifier/LICENSE | 504 + vendor/ezyang/htmlpurifier/composer.json | 45 + .../library/HTMLPurifier.auto.php | 11 + .../library/HTMLPurifier.autoload-legacy.php | 14 + .../library/HTMLPurifier.autoload.php | 25 + .../library/HTMLPurifier.composer.php | 4 + .../library/HTMLPurifier.func.php | 25 + .../library/HTMLPurifier.includes.php | 236 + .../library/HTMLPurifier.kses.php | 30 + .../library/HTMLPurifier.path.php | 11 + .../htmlpurifier/library/HTMLPurifier.php | 297 + .../library/HTMLPurifier.safe-includes.php | 230 + .../library/HTMLPurifier/Arborize.php | 71 + .../library/HTMLPurifier/AttrCollections.php | 148 + .../library/HTMLPurifier/AttrDef.php | 144 + .../library/HTMLPurifier/AttrDef/CSS.php | 140 + .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 34 + .../HTMLPurifier/AttrDef/CSS/Background.php | 113 + .../AttrDef/CSS/BackgroundPosition.php | 157 + .../HTMLPurifier/AttrDef/CSS/Border.php | 56 + .../HTMLPurifier/AttrDef/CSS/Color.php | 161 + .../HTMLPurifier/AttrDef/CSS/Composite.php | 48 + .../AttrDef/CSS/DenyElementDecorator.php | 44 + .../HTMLPurifier/AttrDef/CSS/Filter.php | 77 + .../library/HTMLPurifier/AttrDef/CSS/Font.php | 176 + .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 217 + .../HTMLPurifier/AttrDef/CSS/Ident.php | 32 + .../AttrDef/CSS/ImportantDecorator.php | 56 + .../HTMLPurifier/AttrDef/CSS/Length.php | 77 + .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 112 + .../HTMLPurifier/AttrDef/CSS/Multiple.php | 71 + .../HTMLPurifier/AttrDef/CSS/Number.php | 90 + .../HTMLPurifier/AttrDef/CSS/Percentage.php | 54 + .../HTMLPurifier/AttrDef/CSS/Ratio.php | 46 + .../AttrDef/CSS/TextDecoration.php | 46 + .../library/HTMLPurifier/AttrDef/CSS/URI.php | 77 + .../library/HTMLPurifier/AttrDef/Clone.php | 44 + .../library/HTMLPurifier/AttrDef/Enum.php | 73 + .../HTMLPurifier/AttrDef/HTML/Bool.php | 48 + .../HTMLPurifier/AttrDef/HTML/Class.php | 48 + .../HTMLPurifier/AttrDef/HTML/Color.php | 51 + .../AttrDef/HTML/ContentEditable.php | 16 + .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 38 + .../library/HTMLPurifier/AttrDef/HTML/ID.php | 113 + .../HTMLPurifier/AttrDef/HTML/Length.php | 56 + .../HTMLPurifier/AttrDef/HTML/LinkTypes.php | 67 + .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 60 + .../HTMLPurifier/AttrDef/HTML/Nmtokens.php | 70 + .../HTMLPurifier/AttrDef/HTML/Pixels.php | 76 + .../library/HTMLPurifier/AttrDef/Integer.php | 91 + .../library/HTMLPurifier/AttrDef/Lang.php | 86 + .../library/HTMLPurifier/AttrDef/Switch.php | 53 + .../library/HTMLPurifier/AttrDef/Text.php | 21 + .../library/HTMLPurifier/AttrDef/URI.php | 111 + .../HTMLPurifier/AttrDef/URI/Email.php | 20 + .../AttrDef/URI/Email/SimpleCheck.php | 29 + .../library/HTMLPurifier/AttrDef/URI/Host.php | 136 + .../library/HTMLPurifier/AttrDef/URI/IPv4.php | 45 + .../library/HTMLPurifier/AttrDef/URI/IPv6.php | 89 + .../library/HTMLPurifier/AttrTransform.php | 60 + .../HTMLPurifier/AttrTransform/Background.php | 28 + .../HTMLPurifier/AttrTransform/BdoDir.php | 27 + .../HTMLPurifier/AttrTransform/BgColor.php | 28 + .../HTMLPurifier/AttrTransform/BoolToCSS.php | 47 + .../HTMLPurifier/AttrTransform/Border.php | 26 + .../HTMLPurifier/AttrTransform/EnumToCSS.php | 68 + .../AttrTransform/ImgRequired.php | 47 + .../HTMLPurifier/AttrTransform/ImgSpace.php | 61 + .../HTMLPurifier/AttrTransform/Input.php | 56 + .../HTMLPurifier/AttrTransform/Lang.php | 31 + .../HTMLPurifier/AttrTransform/Length.php | 45 + .../HTMLPurifier/AttrTransform/Name.php | 33 + .../HTMLPurifier/AttrTransform/NameSync.php | 46 + .../HTMLPurifier/AttrTransform/Nofollow.php | 52 + .../HTMLPurifier/AttrTransform/SafeEmbed.php | 25 + .../HTMLPurifier/AttrTransform/SafeObject.php | 28 + .../HTMLPurifier/AttrTransform/SafeParam.php | 84 + .../AttrTransform/ScriptRequired.php | 23 + .../AttrTransform/TargetBlank.php | 49 + .../AttrTransform/TargetNoopener.php | 37 + .../AttrTransform/TargetNoreferrer.php | 37 + .../HTMLPurifier/AttrTransform/Textarea.php | 27 + .../library/HTMLPurifier/AttrTypes.php | 97 + .../library/HTMLPurifier/AttrValidator.php | 178 + .../library/HTMLPurifier/Bootstrap.php | 91 + .../library/HTMLPurifier/CSSDefinition.php | 570 + .../library/HTMLPurifier/ChildDef.php | 52 + .../HTMLPurifier/ChildDef/Chameleon.php | 67 + .../library/HTMLPurifier/ChildDef/Custom.php | 102 + .../library/HTMLPurifier/ChildDef/Empty.php | 38 + .../library/HTMLPurifier/ChildDef/List.php | 94 + .../HTMLPurifier/ChildDef/Optional.php | 45 + .../HTMLPurifier/ChildDef/Required.php | 118 + .../ChildDef/StrictBlockquote.php | 110 + .../library/HTMLPurifier/ChildDef/Table.php | 227 + .../library/HTMLPurifier/Config.php | 924 ++ .../library/HTMLPurifier/ConfigSchema.php | 176 + .../ConfigSchema/Builder/ConfigSchema.php | 48 + .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 144 + .../HTMLPurifier/ConfigSchema/Exception.php | 11 + .../HTMLPurifier/ConfigSchema/Interchange.php | 47 + .../ConfigSchema/Interchange/Directive.php | 89 + .../ConfigSchema/Interchange/Id.php | 58 + .../ConfigSchema/InterchangeBuilder.php | 226 + .../HTMLPurifier/ConfigSchema/Validator.php | 248 + .../ConfigSchema/ValidatorAtom.php | 130 + .../HTMLPurifier/ConfigSchema/schema.ser | 1 + .../schema/Attr.AllowedClasses.txt | 8 + .../schema/Attr.AllowedFrameTargets.txt | 12 + .../ConfigSchema/schema/Attr.AllowedRel.txt | 9 + .../ConfigSchema/schema/Attr.AllowedRev.txt | 9 + .../schema/Attr.ClassUseCDATA.txt | 19 + .../schema/Attr.DefaultImageAlt.txt | 11 + .../schema/Attr.DefaultInvalidImage.txt | 9 + .../schema/Attr.DefaultInvalidImageAlt.txt | 8 + .../schema/Attr.DefaultTextDir.txt | 10 + .../ConfigSchema/schema/Attr.EnableID.txt | 16 + .../schema/Attr.ForbiddenClasses.txt | 8 + .../ConfigSchema/schema/Attr.ID.HTML5.txt | 10 + .../ConfigSchema/schema/Attr.IDBlacklist.txt | 5 + .../schema/Attr.IDBlacklistRegexp.txt | 9 + .../ConfigSchema/schema/Attr.IDPrefix.txt | 12 + .../schema/Attr.IDPrefixLocal.txt | 14 + .../schema/AutoFormat.AutoParagraph.txt | 31 + .../ConfigSchema/schema/AutoFormat.Custom.txt | 12 + .../schema/AutoFormat.DisplayLinkURI.txt | 11 + .../schema/AutoFormat.Linkify.txt | 12 + .../AutoFormat.PurifierLinkify.DocURL.txt | 12 + .../schema/AutoFormat.PurifierLinkify.txt | 12 + .../AutoFormat.RemoveEmpty.Predicate.txt | 14 + ...rmat.RemoveEmpty.RemoveNbsp.Exceptions.txt | 11 + .../AutoFormat.RemoveEmpty.RemoveNbsp.txt | 15 + .../schema/AutoFormat.RemoveEmpty.txt | 46 + ...utoFormat.RemoveSpansWithoutAttributes.txt | 11 + .../schema/CSS.AllowDuplicates.txt | 11 + .../schema/CSS.AllowImportant.txt | 8 + .../ConfigSchema/schema/CSS.AllowTricky.txt | 11 + .../ConfigSchema/schema/CSS.AllowedFonts.txt | 12 + .../schema/CSS.AllowedProperties.txt | 18 + .../ConfigSchema/schema/CSS.DefinitionRev.txt | 11 + .../schema/CSS.ForbiddenProperties.txt | 13 + .../ConfigSchema/schema/CSS.MaxImgLength.txt | 16 + .../ConfigSchema/schema/CSS.Proprietary.txt | 10 + .../ConfigSchema/schema/CSS.Trusted.txt | 9 + .../schema/Cache.DefinitionImpl.txt | 14 + .../schema/Cache.SerializerPath.txt | 13 + .../schema/Cache.SerializerPermissions.txt | 16 + .../schema/Core.AggressivelyFixLt.txt | 18 + .../schema/Core.AggressivelyRemoveScript.txt | 16 + .../schema/Core.AllowHostnameUnderscore.txt | 16 + .../schema/Core.AllowParseManyTags.txt | 12 + .../schema/Core.CollectErrors.txt | 12 + .../schema/Core.ColorKeywords.txt | 160 + .../schema/Core.ConvertDocumentToFragment.txt | 15 + .../Core.DirectLexLineNumberSyncInterval.txt | 17 + .../schema/Core.DisableExcludes.txt | 14 + .../ConfigSchema/schema/Core.EnableIDNA.txt | 9 + .../ConfigSchema/schema/Core.Encoding.txt | 15 + .../schema/Core.EscapeInvalidChildren.txt | 12 + .../schema/Core.EscapeInvalidTags.txt | 7 + .../schema/Core.EscapeNonASCIICharacters.txt | 13 + .../schema/Core.HiddenElements.txt | 19 + .../ConfigSchema/schema/Core.Language.txt | 10 + .../schema/Core.LegacyEntityDecoder.txt | 36 + .../ConfigSchema/schema/Core.LexerImpl.txt | 34 + .../schema/Core.MaintainLineNumbers.txt | 16 + .../schema/Core.NormalizeNewlines.txt | 11 + .../ConfigSchema/schema/Core.RemoveBlanks.txt | 10 + .../schema/Core.RemoveInvalidImg.txt | 12 + .../Core.RemoveProcessingInstructions.txt | 11 + .../schema/Core.RemoveScriptContents.txt | 12 + .../ConfigSchema/schema/Filter.Custom.txt | 11 + .../Filter.ExtractStyleBlocks.Escaping.txt | 14 + .../Filter.ExtractStyleBlocks.Scope.txt | 29 + .../Filter.ExtractStyleBlocks.TidyImpl.txt | 16 + .../schema/Filter.ExtractStyleBlocks.txt | 74 + .../ConfigSchema/schema/Filter.YouTube.txt | 16 + .../ConfigSchema/schema/HTML.Allowed.txt | 25 + .../schema/HTML.AllowedAttributes.txt | 19 + .../schema/HTML.AllowedComments.txt | 10 + .../schema/HTML.AllowedCommentsRegexp.txt | 15 + .../schema/HTML.AllowedElements.txt | 23 + .../schema/HTML.AllowedModules.txt | 20 + .../schema/HTML.Attr.Name.UseCDATA.txt | 11 + .../ConfigSchema/schema/HTML.BlockWrapper.txt | 18 + .../ConfigSchema/schema/HTML.CoreModules.txt | 23 + .../schema/HTML.CustomDoctype.txt | 9 + .../ConfigSchema/schema/HTML.DefinitionID.txt | 33 + .../schema/HTML.DefinitionRev.txt | 16 + .../ConfigSchema/schema/HTML.Doctype.txt | 11 + .../schema/HTML.FlashAllowFullScreen.txt | 11 + .../schema/HTML.ForbiddenAttributes.txt | 21 + .../schema/HTML.ForbiddenElements.txt | 20 + .../ConfigSchema/schema/HTML.Forms.txt | 11 + .../ConfigSchema/schema/HTML.MaxImgLength.txt | 14 + .../ConfigSchema/schema/HTML.Nofollow.txt | 7 + .../ConfigSchema/schema/HTML.Parent.txt | 12 + .../ConfigSchema/schema/HTML.Proprietary.txt | 12 + .../ConfigSchema/schema/HTML.SafeEmbed.txt | 13 + .../ConfigSchema/schema/HTML.SafeIframe.txt | 13 + .../ConfigSchema/schema/HTML.SafeObject.txt | 13 + .../schema/HTML.SafeScripting.txt | 10 + .../ConfigSchema/schema/HTML.Strict.txt | 9 + .../ConfigSchema/schema/HTML.TargetBlank.txt | 8 + .../schema/HTML.TargetNoopener.txt | 10 + .../schema/HTML.TargetNoreferrer.txt | 9 + .../ConfigSchema/schema/HTML.TidyAdd.txt | 8 + .../ConfigSchema/schema/HTML.TidyLevel.txt | 24 + .../ConfigSchema/schema/HTML.TidyRemove.txt | 8 + .../ConfigSchema/schema/HTML.Trusted.txt | 9 + .../ConfigSchema/schema/HTML.XHTML.txt | 11 + .../schema/Output.CommentScriptContents.txt | 10 + .../schema/Output.FixInnerHTML.txt | 15 + .../schema/Output.FlashCompat.txt | 11 + .../ConfigSchema/schema/Output.Newline.txt | 13 + .../ConfigSchema/schema/Output.SortAttr.txt | 14 + .../ConfigSchema/schema/Output.TidyFormat.txt | 25 + .../ConfigSchema/schema/Test.ForceNoIconv.txt | 7 + .../schema/URI.AllowedSchemes.txt | 18 + .../schema/URI.AllowedSymbols.txt | 7 + .../ConfigSchema/schema/URI.Base.txt | 17 + .../ConfigSchema/schema/URI.DefaultScheme.txt | 15 + .../ConfigSchema/schema/URI.DefinitionID.txt | 11 + .../ConfigSchema/schema/URI.DefinitionRev.txt | 11 + .../ConfigSchema/schema/URI.Disable.txt | 14 + .../schema/URI.DisableExternal.txt | 11 + .../schema/URI.DisableExternalResources.txt | 13 + .../schema/URI.DisableResources.txt | 15 + .../ConfigSchema/schema/URI.Host.txt | 19 + .../ConfigSchema/schema/URI.HostBlacklist.txt | 9 + .../ConfigSchema/schema/URI.MakeAbsolute.txt | 13 + .../ConfigSchema/schema/URI.Munge.txt | 83 + .../schema/URI.MungeResources.txt | 17 + .../schema/URI.MungeSecretKey.txt | 30 + .../schema/URI.OverrideAllowedSchemes.txt | 9 + .../schema/URI.SafeIframeHosts.txt | 14 + .../schema/URI.SafeIframeRegexp.txt | 22 + .../HTMLPurifier/ConfigSchema/schema/info.ini | 3 + .../library/HTMLPurifier/ContentSets.php | 169 + .../library/HTMLPurifier/Context.php | 84 + .../library/HTMLPurifier/Definition.php | 55 + .../library/HTMLPurifier/DefinitionCache.php | 129 + .../DefinitionCache/Decorator.php | 112 + .../DefinitionCache/Decorator/Cleanup.php | 78 + .../DefinitionCache/Decorator/Memory.php | 85 + .../DefinitionCache/Decorator/Template.php.in | 82 + .../HTMLPurifier/DefinitionCache/Null.php | 76 + .../DefinitionCache/Serializer.php | 313 + .../HTMLPurifier/DefinitionCacheFactory.php | 106 + .../library/HTMLPurifier/Doctype.php | 73 + .../library/HTMLPurifier/DoctypeRegistry.php | 142 + .../library/HTMLPurifier/ElementDef.php | 216 + .../library/HTMLPurifier/Encoder.php | 615 + .../library/HTMLPurifier/EntityLookup.php | 48 + .../HTMLPurifier/EntityLookup/entities.ser | 1 + .../library/HTMLPurifier/EntityParser.php | 285 + .../library/HTMLPurifier/ErrorCollector.php | 244 + .../library/HTMLPurifier/ErrorStruct.php | 74 + .../library/HTMLPurifier/Exception.php | 12 + .../library/HTMLPurifier/Filter.php | 56 + .../Filter/ExtractStyleBlocks.php | 362 + .../library/HTMLPurifier/Filter/YouTube.php | 65 + .../library/HTMLPurifier/Generator.php | 286 + .../library/HTMLPurifier/HTMLDefinition.php | 488 + .../library/HTMLPurifier/HTMLModule.php | 285 + .../library/HTMLPurifier/HTMLModule/Bdo.php | 44 + .../HTMLModule/CommonAttributes.php | 32 + .../library/HTMLPurifier/HTMLModule/Edit.php | 55 + .../library/HTMLPurifier/HTMLModule/Forms.php | 194 + .../HTMLPurifier/HTMLModule/Hypertext.php | 40 + .../HTMLPurifier/HTMLModule/Iframe.php | 57 + .../library/HTMLPurifier/HTMLModule/Image.php | 49 + .../HTMLPurifier/HTMLModule/Legacy.php | 186 + .../library/HTMLPurifier/HTMLModule/List.php | 51 + .../library/HTMLPurifier/HTMLModule/Name.php | 26 + .../HTMLPurifier/HTMLModule/Nofollow.php | 25 + .../HTMLModule/NonXMLCommonAttributes.php | 20 + .../HTMLPurifier/HTMLModule/Object.php | 62 + .../HTMLPurifier/HTMLModule/Presentation.php | 42 + .../HTMLPurifier/HTMLModule/Proprietary.php | 40 + .../library/HTMLPurifier/HTMLModule/Ruby.php | 36 + .../HTMLPurifier/HTMLModule/SafeEmbed.php | 40 + .../HTMLPurifier/HTMLModule/SafeObject.php | 62 + .../HTMLPurifier/HTMLModule/SafeScripting.php | 40 + .../HTMLPurifier/HTMLModule/Scripting.php | 73 + .../HTMLModule/StyleAttribute.php | 33 + .../HTMLPurifier/HTMLModule/Tables.php | 75 + .../HTMLPurifier/HTMLModule/Target.php | 28 + .../HTMLPurifier/HTMLModule/TargetBlank.php | 24 + .../HTMLModule/TargetNoopener.php | 21 + .../HTMLModule/TargetNoreferrer.php | 21 + .../library/HTMLPurifier/HTMLModule/Text.php | 87 + .../library/HTMLPurifier/HTMLModule/Tidy.php | 226 + .../HTMLPurifier/HTMLModule/Tidy/Name.php | 33 + .../HTMLModule/Tidy/Proprietary.php | 34 + .../HTMLPurifier/HTMLModule/Tidy/Strict.php | 43 + .../HTMLModule/Tidy/Transitional.php | 16 + .../HTMLPurifier/HTMLModule/Tidy/XHTML.php | 26 + .../HTMLModule/Tidy/XHTMLAndHTML4.php | 182 + .../HTMLModule/XMLCommonAttributes.php | 20 + .../HTMLPurifier/HTMLModuleManager.php | 463 + .../library/HTMLPurifier/IDAccumulator.php | 57 + .../library/HTMLPurifier/Injector.php | 283 + .../HTMLPurifier/Injector/AutoParagraph.php | 356 + .../HTMLPurifier/Injector/DisplayLinkURI.php | 40 + .../library/HTMLPurifier/Injector/Linkify.php | 67 + .../HTMLPurifier/Injector/PurifierLinkify.php | 71 + .../HTMLPurifier/Injector/RemoveEmpty.php | 112 + .../Injector/RemoveSpansWithoutAttributes.php | 95 + .../HTMLPurifier/Injector/SafeObject.php | 124 + .../library/HTMLPurifier/Language.php | 204 + .../HTMLPurifier/Language/messages/en.php | 55 + .../library/HTMLPurifier/LanguageFactory.php | 203 + .../library/HTMLPurifier/Length.php | 162 + .../library/HTMLPurifier/Lexer.php | 371 + .../library/HTMLPurifier/Lexer/DOMLex.php | 411 + .../library/HTMLPurifier/Lexer/DirectLex.php | 517 + .../library/HTMLPurifier/Lexer/PH5P.php | 4788 ++++++ .../library/HTMLPurifier/Node.php | 49 + .../library/HTMLPurifier/Node/Comment.php | 36 + .../library/HTMLPurifier/Node/Element.php | 59 + .../library/HTMLPurifier/Node/Text.php | 54 + .../library/HTMLPurifier/PercentEncoder.php | 111 + .../library/HTMLPurifier/Printer.php | 218 + .../HTMLPurifier/Printer/CSSDefinition.php | 44 + .../HTMLPurifier/Printer/ConfigForm.css | 10 + .../HTMLPurifier/Printer/ConfigForm.js | 5 + .../HTMLPurifier/Printer/ConfigForm.php | 456 + .../HTMLPurifier/Printer/HTMLDefinition.php | 324 + .../library/HTMLPurifier/PropertyList.php | 122 + .../HTMLPurifier/PropertyListIterator.php | 43 + .../library/HTMLPurifier/Queue.php | 56 + .../library/HTMLPurifier/Strategy.php | 26 + .../HTMLPurifier/Strategy/Composite.php | 30 + .../library/HTMLPurifier/Strategy/Core.php | 17 + .../HTMLPurifier/Strategy/FixNesting.php | 181 + .../HTMLPurifier/Strategy/MakeWellFormed.php | 659 + .../Strategy/RemoveForeignElements.php | 207 + .../Strategy/ValidateAttributes.php | 45 + .../library/HTMLPurifier/StringHash.php | 48 + .../library/HTMLPurifier/StringHashParser.php | 136 + .../library/HTMLPurifier/TagTransform.php | 37 + .../HTMLPurifier/TagTransform/Font.php | 114 + .../HTMLPurifier/TagTransform/Simple.php | 44 + .../library/HTMLPurifier/Token.php | 100 + .../library/HTMLPurifier/Token/Comment.php | 38 + .../library/HTMLPurifier/Token/Empty.php | 15 + .../library/HTMLPurifier/Token/End.php | 24 + .../library/HTMLPurifier/Token/Start.php | 10 + .../library/HTMLPurifier/Token/Tag.php | 68 + .../library/HTMLPurifier/Token/Text.php | 53 + .../library/HTMLPurifier/TokenFactory.php | 118 + .../htmlpurifier/library/HTMLPurifier/URI.php | 316 + .../library/HTMLPurifier/URIDefinition.php | 112 + .../library/HTMLPurifier/URIFilter.php | 74 + .../URIFilter/DisableExternal.php | 54 + .../URIFilter/DisableExternalResources.php | 25 + .../URIFilter/DisableResources.php | 22 + .../HTMLPurifier/URIFilter/HostBlacklist.php | 46 + .../HTMLPurifier/URIFilter/MakeAbsolute.php | 158 + .../library/HTMLPurifier/URIFilter/Munge.php | 115 + .../HTMLPurifier/URIFilter/SafeIframe.php | 69 + .../library/HTMLPurifier/URIParser.php | 71 + .../library/HTMLPurifier/URIScheme.php | 102 + .../library/HTMLPurifier/URIScheme/data.php | 136 + .../library/HTMLPurifier/URIScheme/file.php | 44 + .../library/HTMLPurifier/URIScheme/ftp.php | 58 + .../library/HTMLPurifier/URIScheme/http.php | 36 + .../library/HTMLPurifier/URIScheme/https.php | 18 + .../library/HTMLPurifier/URIScheme/mailto.php | 40 + .../library/HTMLPurifier/URIScheme/news.php | 35 + .../library/HTMLPurifier/URIScheme/nntp.php | 32 + .../library/HTMLPurifier/URIScheme/tel.php | 46 + .../HTMLPurifier/URISchemeRegistry.php | 81 + .../library/HTMLPurifier/UnitConverter.php | 307 + .../library/HTMLPurifier/VarParser.php | 198 + .../HTMLPurifier/VarParser/Flexible.php | 130 + .../library/HTMLPurifier/VarParser/Native.php | 38 + .../HTMLPurifier/VarParserException.php | 11 + .../library/HTMLPurifier/Zipper.php | 157 + vendor/firebase/php-jwt/LICENSE | 30 + vendor/firebase/php-jwt/composer.json | 42 + .../php-jwt/src/BeforeValidException.php | 18 + vendor/firebase/php-jwt/src/CachedKeySet.php | 274 + .../firebase/php-jwt/src/ExpiredException.php | 18 + vendor/firebase/php-jwt/src/JWK.php | 355 + vendor/firebase/php-jwt/src/JWT.php | 667 + .../src/JWTExceptionWithPayloadInterface.php | 20 + vendor/firebase/php-jwt/src/Key.php | 55 + .../php-jwt/src/SignatureInvalidException.php | 7 + vendor/google/apiclient-services/LICENSE | 203 + vendor/google/apiclient-services/SECURITY.md | 7 + vendor/google/apiclient-services/autoload.php | 36 + .../google/apiclient-services/composer.json | 27 + .../google/apiclient-services/src/Gmail.php | 1425 ++ .../src/Gmail/AutoForwarding.php | 117 + .../src/Gmail/BatchDeleteMessagesRequest.php | 49 + .../src/Gmail/BatchModifyMessagesRequest.php | 95 + .../Gmail/ClassificationLabelFieldValue.php | 76 + .../src/Gmail/ClassificationLabelValue.php | 69 + .../src/Gmail/CseIdentity.php | 91 + .../src/Gmail/CseKeyPair.php | 211 + .../src/Gmail/CsePrivateKeyMetadata.php | 85 + .../apiclient-services/src/Gmail/Delegate.php | 98 + .../src/Gmail/DisableCseKeyPairRequest.php | 25 + .../apiclient-services/src/Gmail/Draft.php | 66 + .../src/Gmail/EnableCseKeyPairRequest.php | 25 + .../apiclient-services/src/Gmail/Filter.php | 84 + .../src/Gmail/FilterAction.php | 93 + .../src/Gmail/FilterCriteria.php | 253 + .../src/Gmail/ForwardingAddress.php | 86 + .../src/Gmail/HardwareKeyMetadata.php | 48 + .../apiclient-services/src/Gmail/History.php | 141 + .../src/Gmail/HistoryLabelAdded.php | 65 + .../src/Gmail/HistoryLabelRemoved.php | 65 + .../src/Gmail/HistoryMessageAdded.php | 42 + .../src/Gmail/HistoryMessageDeleted.php | 42 + .../src/Gmail/ImapSettings.php | 143 + .../src/Gmail/KaclsKeyMetadata.php | 74 + .../apiclient-services/src/Gmail/Label.php | 293 + .../src/Gmail/LabelColor.php | 130 + .../src/Gmail/LanguageSettings.php | 68 + .../src/Gmail/ListCseIdentitiesResponse.php | 71 + .../src/Gmail/ListCseKeyPairsResponse.php | 71 + .../src/Gmail/ListDelegatesResponse.php | 46 + .../src/Gmail/ListDraftsResponse.php | 92 + .../src/Gmail/ListFiltersResponse.php | 45 + .../Gmail/ListForwardingAddressesResponse.php | 45 + .../src/Gmail/ListHistoryResponse.php | 90 + .../src/Gmail/ListLabelsResponse.php | 48 + .../src/Gmail/ListMessagesResponse.php | 91 + .../src/Gmail/ListSendAsResponse.php | 45 + .../src/Gmail/ListSmimeInfoResponse.php | 45 + .../src/Gmail/ListThreadsResponse.php | 92 + .../apiclient-services/src/Gmail/Message.php | 265 + .../src/Gmail/MessagePart.php | 155 + .../src/Gmail/MessagePartBody.php | 104 + .../src/Gmail/MessagePartHeader.php | 72 + .../src/Gmail/ModifyMessageRequest.php | 75 + .../src/Gmail/ModifyThreadRequest.php | 75 + .../src/Gmail/ObliterateCseKeyPairRequest.php | 25 + .../src/Gmail/PivKeyMetadata.php | 44 + .../src/Gmail/PopSettings.php | 114 + .../apiclient-services/src/Gmail/Profile.php | 114 + .../src/Gmail/Resource/Users.php | 83 + .../src/Gmail/Resource/UsersDrafts.php | 146 + .../src/Gmail/Resource/UsersHistory.php | 70 + .../src/Gmail/Resource/UsersLabels.php | 133 + .../src/Gmail/Resource/UsersMessages.php | 263 + .../Resource/UsersMessagesAttachments.php | 52 + .../src/Gmail/Resource/UsersSettings.php | 203 + .../src/Gmail/Resource/UsersSettingsCse.php | 33 + .../Resource/UsersSettingsCseIdentities.php | 177 + .../Resource/UsersSettingsCseKeypairs.php | 207 + .../Gmail/Resource/UsersSettingsDelegates.php | 119 + .../Gmail/Resource/UsersSettingsFilters.php | 99 + .../UsersSettingsForwardingAddresses.php | 107 + .../Gmail/Resource/UsersSettingsSendAs.php | 166 + .../Resource/UsersSettingsSendAsSmimeInfo.php | 128 + .../src/Gmail/Resource/UsersThreads.php | 154 + .../apiclient-services/src/Gmail/SendAs.php | 273 + .../src/Gmail/SignAndEncryptKeyPairs.php | 70 + .../src/Gmail/SmimeInfo.php | 192 + .../apiclient-services/src/Gmail/SmtpMsa.php | 164 + .../apiclient-services/src/Gmail/Thread.php | 111 + .../src/Gmail/VacationSettings.php | 230 + .../src/Gmail/WatchRequest.php | 164 + .../src/Gmail/WatchResponse.php | 72 + vendor/google/apiclient/LICENSE | 203 + vendor/google/apiclient/SECURITY.md | 7 + vendor/google/apiclient/composer.json | 47 + .../apiclient/src/AccessToken/Revoke.php | 81 + .../apiclient/src/AccessToken/Verify.php | 264 + .../src/AuthHandler/AuthHandlerFactory.php | 49 + .../src/AuthHandler/Guzzle6AuthHandler.php | 124 + .../src/AuthHandler/Guzzle7AuthHandler.php | 25 + vendor/google/apiclient/src/Client.php | 1368 ++ vendor/google/apiclient/src/Collection.php | 122 + vendor/google/apiclient/src/Exception.php | 24 + vendor/google/apiclient/src/Http/Batch.php | 261 + .../apiclient/src/Http/MediaFileUpload.php | 353 + vendor/google/apiclient/src/Http/REST.php | 198 + vendor/google/apiclient/src/Model.php | 333 + vendor/google/apiclient/src/Service.php | 76 + .../apiclient/src/Service/Exception.php | 73 + .../google/apiclient/src/Service/Resource.php | 320 + vendor/google/apiclient/src/Task/Composer.php | 115 + .../google/apiclient/src/Task/Exception.php | 24 + .../google/apiclient/src/Task/Retryable.php | 26 + vendor/google/apiclient/src/Task/Runner.php | 293 + .../apiclient/src/Utils/UriTemplate.php | 334 + vendor/google/apiclient/src/aliases.php | 102 + vendor/google/auth/.repo-metadata.json | 7 + vendor/google/auth/COPYING | 202 + vendor/google/auth/LICENSE | 203 + vendor/google/auth/SECURITY.md | 7 + vendor/google/auth/composer.json | 45 + vendor/google/auth/src/AccessToken.php | 473 + .../src/ApplicationDefaultCredentials.php | 391 + .../src/Cache/FileSystemCacheItemPool.php | 232 + .../src/Cache/InvalidArgumentException.php | 24 + .../auth/src/Cache/MemoryCacheItemPool.php | 182 + .../auth/src/Cache/SysVCacheItemPool.php | 352 + vendor/google/auth/src/Cache/TypedItem.php | 170 + vendor/google/auth/src/CacheTrait.php | 110 + .../src/CredentialSource/AwsNativeSource.php | 375 + .../src/CredentialSource/ExecutableSource.php | 272 + .../auth/src/CredentialSource/FileSource.php | 87 + .../auth/src/CredentialSource/UrlSource.php | 109 + .../Credentials/AppIdentityCredentials.php | 238 + .../ExternalAccountCredentials.php | 394 + .../auth/src/Credentials/GCECredentials.php | 685 + .../auth/src/Credentials/IAMCredentials.php | 91 + .../ImpersonatedServiceAccountCredentials.php | 301 + .../src/Credentials/InsecureCredentials.php | 68 + .../Credentials/ServiceAccountCredentials.php | 457 + .../ServiceAccountJwtAccessCredentials.php | 246 + .../Credentials/UserRefreshCredentials.php | 202 + vendor/google/auth/src/CredentialsLoader.php | 318 + .../ExecutableHandler/ExecutableHandler.php | 83 + .../ExecutableResponseError.php | 27 + ...ternalAccountCredentialSourceInterface.php | 24 + .../google/auth/src/FetchAuthTokenCache.php | 339 + .../auth/src/FetchAuthTokenInterface.php | 54 + vendor/google/auth/src/GCECache.php | 82 + .../auth/src/GetQuotaProjectInterface.php | 33 + .../auth/src/GetUniverseDomainInterface.php | 35 + .../src/HttpHandler/Guzzle6HttpHandler.php | 140 + .../src/HttpHandler/Guzzle7HttpHandler.php | 21 + .../auth/src/HttpHandler/HttpClientCache.php | 54 + .../src/HttpHandler/HttpHandlerFactory.php | 73 + vendor/google/auth/src/Iam.php | 155 + vendor/google/auth/src/IamSignerTrait.php | 72 + .../google/auth/src/Logging/LoggingTrait.php | 138 + .../google/auth/src/Logging/RpcLogEvent.php | 136 + .../google/auth/src/Logging/StdOutLogger.php | 85 + vendor/google/auth/src/MetricsTrait.php | 120 + .../src/Middleware/AuthTokenMiddleware.php | 163 + .../Middleware/ProxyAuthTokenMiddleware.php | 155 + .../ScopedAccessTokenMiddleware.php | 165 + .../auth/src/Middleware/SimpleMiddleware.php | 92 + vendor/google/auth/src/OAuth2.php | 1828 ++ .../auth/src/ProjectIdProviderInterface.php | 32 + .../auth/src/ServiceAccountSignerTrait.php | 56 + vendor/google/auth/src/SignBlobInterface.php | 44 + .../auth/src/UpdateMetadataInterface.php | 41 + .../google/auth/src/UpdateMetadataTrait.php | 74 + vendor/guzzlehttp/guzzle/LICENSE | 27 + vendor/guzzlehttp/guzzle/composer.json | 131 + vendor/guzzlehttp/guzzle/package-lock.json | 6 + .../guzzlehttp/guzzle/src/BodySummarizer.php | 28 + .../guzzle/src/BodySummarizerInterface.php | 13 + vendor/guzzlehttp/guzzle/src/Client.php | 483 + .../guzzlehttp/guzzle/src/ClientInterface.php | 84 + vendor/guzzlehttp/guzzle/src/ClientTrait.php | 241 + .../guzzle/src/Cookie/CookieJar.php | 307 + .../guzzle/src/Cookie/CookieJarInterface.php | 80 + .../guzzle/src/Cookie/FileCookieJar.php | 101 + .../guzzle/src/Cookie/SessionCookieJar.php | 77 + .../guzzle/src/Cookie/SetCookie.php | 492 + .../src/Exception/BadResponseException.php | 39 + .../guzzle/src/Exception/ClientException.php | 10 + .../guzzle/src/Exception/ConnectException.php | 56 + .../guzzle/src/Exception/GuzzleException.php | 9 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 150 + .../guzzle/src/Exception/ServerException.php | 10 + .../Exception/TooManyRedirectsException.php | 7 + .../src/Exception/TransferException.php | 7 + .../guzzle/src/Handler/CurlFactory.php | 741 + .../src/Handler/CurlFactoryInterface.php | 25 + .../guzzle/src/Handler/CurlHandler.php | 49 + .../guzzle/src/Handler/CurlMultiHandler.php | 287 + .../guzzle/src/Handler/EasyHandle.php | 112 + .../guzzle/src/Handler/HeaderProcessor.php | 42 + .../guzzle/src/Handler/MockHandler.php | 212 + .../guzzlehttp/guzzle/src/Handler/Proxy.php | 51 + .../guzzle/src/Handler/StreamHandler.php | 634 + vendor/guzzlehttp/guzzle/src/HandlerStack.php | 275 + .../guzzle/src/MessageFormatter.php | 199 + .../guzzle/src/MessageFormatterInterface.php | 18 + vendor/guzzlehttp/guzzle/src/Middleware.php | 268 + vendor/guzzlehttp/guzzle/src/Pool.php | 125 + .../guzzle/src/PrepareBodyMiddleware.php | 105 + .../guzzle/src/RedirectMiddleware.php | 228 + .../guzzlehttp/guzzle/src/RequestOptions.php | 274 + .../guzzlehttp/guzzle/src/RetryMiddleware.php | 119 + .../guzzlehttp/guzzle/src/TransferStats.php | 133 + vendor/guzzlehttp/guzzle/src/Utils.php | 384 + vendor/guzzlehttp/guzzle/src/functions.php | 167 + .../guzzle/src/functions_include.php | 6 + vendor/guzzlehttp/promises/LICENSE | 24 + vendor/guzzlehttp/promises/composer.json | 58 + .../promises/src/AggregateException.php | 19 + .../promises/src/CancellationException.php | 12 + vendor/guzzlehttp/promises/src/Coroutine.php | 162 + vendor/guzzlehttp/promises/src/Create.php | 79 + vendor/guzzlehttp/promises/src/Each.php | 81 + .../guzzlehttp/promises/src/EachPromise.php | 248 + .../promises/src/FulfilledPromise.php | 89 + vendor/guzzlehttp/promises/src/Is.php | 40 + vendor/guzzlehttp/promises/src/Promise.php | 281 + .../promises/src/PromiseInterface.php | 91 + .../promises/src/PromisorInterface.php | 16 + .../promises/src/RejectedPromise.php | 95 + .../promises/src/RejectionException.php | 49 + vendor/guzzlehttp/promises/src/TaskQueue.php | 71 + .../promises/src/TaskQueueInterface.php | 24 + vendor/guzzlehttp/promises/src/Utils.php | 261 + vendor/guzzlehttp/psr7/LICENSE | 26 + vendor/guzzlehttp/psr7/composer.json | 93 + vendor/guzzlehttp/psr7/src/AppendStream.php | 248 + vendor/guzzlehttp/psr7/src/BufferStream.php | 147 + vendor/guzzlehttp/psr7/src/CachingStream.php | 153 + vendor/guzzlehttp/psr7/src/DroppingStream.php | 49 + .../src/Exception/MalformedUriException.php | 14 + vendor/guzzlehttp/psr7/src/FnStream.php | 180 + vendor/guzzlehttp/psr7/src/Header.php | 134 + vendor/guzzlehttp/psr7/src/HttpFactory.php | 94 + vendor/guzzlehttp/psr7/src/InflateStream.php | 37 + vendor/guzzlehttp/psr7/src/LazyOpenStream.php | 49 + vendor/guzzlehttp/psr7/src/LimitStream.php | 157 + vendor/guzzlehttp/psr7/src/Message.php | 246 + vendor/guzzlehttp/psr7/src/MessageTrait.php | 261 + vendor/guzzlehttp/psr7/src/MimeType.php | 1259 ++ .../guzzlehttp/psr7/src/MultipartStream.php | 165 + vendor/guzzlehttp/psr7/src/NoSeekStream.php | 28 + vendor/guzzlehttp/psr7/src/PumpStream.php | 179 + vendor/guzzlehttp/psr7/src/Query.php | 118 + vendor/guzzlehttp/psr7/src/Request.php | 159 + vendor/guzzlehttp/psr7/src/Response.php | 161 + vendor/guzzlehttp/psr7/src/Rfc7230.php | 23 + vendor/guzzlehttp/psr7/src/ServerRequest.php | 340 + vendor/guzzlehttp/psr7/src/Stream.php | 283 + .../psr7/src/StreamDecoratorTrait.php | 156 + vendor/guzzlehttp/psr7/src/StreamWrapper.php | 207 + vendor/guzzlehttp/psr7/src/UploadedFile.php | 211 + vendor/guzzlehttp/psr7/src/Uri.php | 743 + vendor/guzzlehttp/psr7/src/UriComparator.php | 52 + vendor/guzzlehttp/psr7/src/UriNormalizer.php | 220 + vendor/guzzlehttp/psr7/src/UriResolver.php | 211 + vendor/guzzlehttp/psr7/src/Utils.php | 477 + .../html2text/.github/workflows/ci.yml | 38 + vendor/html2text/html2text/composer.json | 23 + vendor/html2text/html2text/src/Html2Text.php | 668 + vendor/ifsnop/mysqldump-php/LICENSE | 674 + vendor/ifsnop/mysqldump-php/composer.json | 26 + .../src/Ifsnop/Mysqldump/Mysqldump.php | 2382 +++ vendor/illuminate/collections/Arr.php | 747 + vendor/illuminate/collections/Collection.php | 1672 ++ vendor/illuminate/collections/Enumerable.php | 1027 ++ .../HigherOrderCollectionProxy.php | 63 + .../collections/HigherOrderWhenProxy.php | 63 + .../collections/ItemNotFoundException.php | 9 + vendor/illuminate/collections/LICENSE.md | 21 + .../illuminate/collections/LazyCollection.php | 1585 ++ .../MultipleItemsFoundException.php | 9 + .../collections/Traits/EnumeratesValues.php | 1116 ++ vendor/illuminate/collections/composer.json | 41 + vendor/illuminate/collections/helpers.php | 186 + .../contracts/Auth/Access/Authorizable.php | 15 + .../illuminate/contracts/Auth/Access/Gate.php | 150 + .../contracts/Auth/Authenticatable.php | 49 + .../contracts/Auth/CanResetPassword.php | 21 + vendor/illuminate/contracts/Auth/Factory.php | 22 + vendor/illuminate/contracts/Auth/Guard.php | 50 + .../Auth/Middleware/AuthenticatesRequests.php | 8 + .../contracts/Auth/MustVerifyEmail.php | 34 + .../contracts/Auth/PasswordBroker.php | 61 + .../contracts/Auth/PasswordBrokerFactory.php | 14 + .../contracts/Auth/StatefulGuard.php | 63 + .../contracts/Auth/SupportsBasicAuth.php | 24 + .../contracts/Auth/UserProvider.php | 49 + .../contracts/Broadcasting/Broadcaster.php | 33 + .../contracts/Broadcasting/Factory.php | 14 + .../Broadcasting/HasBroadcastChannel.php | 20 + .../Broadcasting/ShouldBroadcast.php | 13 + .../Broadcasting/ShouldBroadcastNow.php | 8 + .../illuminate/contracts/Bus/Dispatcher.php | 66 + .../contracts/Bus/QueueingDispatcher.php | 30 + vendor/illuminate/contracts/Cache/Factory.php | 14 + vendor/illuminate/contracts/Cache/Lock.php | 44 + .../contracts/Cache/LockProvider.php | 25 + .../contracts/Cache/LockTimeoutException.php | 10 + .../illuminate/contracts/Cache/Repository.php | 108 + vendor/illuminate/contracts/Cache/Store.php | 92 + .../contracts/Config/Repository.php | 57 + .../contracts/Console/Application.php | 23 + .../illuminate/contracts/Console/Kernel.php | 64 + .../Container/BindingResolutionException.php | 11 + .../Container/CircularDependencyException.php | 11 + .../contracts/Container/Container.php | 183 + .../Container/ContextualBindingBuilder.php | 30 + .../illuminate/contracts/Cookie/Factory.php | 47 + .../contracts/Cookie/QueueingFactory.php | 30 + .../contracts/Database/Eloquent/Castable.php | 15 + .../Database/Eloquent/CastsAttributes.php | 28 + .../Eloquent/CastsInboundAttributes.php | 17 + .../Eloquent/DeviatesCastableAttributes.php | 28 + .../Eloquent/SerializesCastableAttributes.php | 17 + .../Eloquent/SupportsPartialRelations.php | 30 + .../Database/Events/MigrationEvent.php | 8 + .../contracts/Database/ModelIdentifier.php | 53 + .../contracts/Debug/ExceptionHandler.php | 46 + .../contracts/Encryption/DecryptException.php | 10 + .../contracts/Encryption/EncryptException.php | 10 + .../contracts/Encryption/Encrypter.php | 28 + .../contracts/Encryption/StringEncrypter.php | 26 + .../contracts/Events/Dispatcher.php | 82 + .../illuminate/contracts/Filesystem/Cloud.php | 14 + .../contracts/Filesystem/Factory.php | 14 + .../Filesystem/FileExistsException.php | 10 + .../Filesystem/FileNotFoundException.php | 10 + .../contracts/Filesystem/Filesystem.php | 198 + .../Filesystem/LockTimeoutException.php | 10 + .../contracts/Foundation/Application.php | 215 + .../Foundation/CachesConfiguration.php | 27 + .../contracts/Foundation/CachesRoutes.php | 20 + .../illuminate/contracts/Hashing/Hasher.php | 42 + vendor/illuminate/contracts/Http/Kernel.php | 37 + vendor/illuminate/contracts/LICENSE.md | 21 + vendor/illuminate/contracts/Mail/Factory.php | 14 + .../illuminate/contracts/Mail/MailQueue.php | 25 + vendor/illuminate/contracts/Mail/Mailable.php | 76 + vendor/illuminate/contracts/Mail/Mailer.php | 48 + .../contracts/Notifications/Dispatcher.php | 24 + .../contracts/Notifications/Factory.php | 32 + .../contracts/Pagination/CursorPaginator.php | 117 + .../Pagination/LengthAwarePaginator.php | 29 + .../contracts/Pagination/Paginator.php | 124 + vendor/illuminate/contracts/Pipeline/Hub.php | 15 + .../contracts/Pipeline/Pipeline.php | 40 + .../contracts/Queue/ClearableQueue.php | 14 + .../Queue/EntityNotFoundException.php | 22 + .../contracts/Queue/EntityResolver.php | 15 + vendor/illuminate/contracts/Queue/Factory.php | 14 + vendor/illuminate/contracts/Queue/Job.php | 166 + vendor/illuminate/contracts/Queue/Monitor.php | 30 + vendor/illuminate/contracts/Queue/Queue.php | 99 + .../contracts/Queue/QueueableCollection.php | 34 + .../contracts/Queue/QueueableEntity.php | 27 + .../contracts/Queue/ShouldBeEncrypted.php | 8 + .../contracts/Queue/ShouldBeUnique.php | 8 + .../Queue/ShouldBeUniqueUntilProcessing.php | 8 + .../contracts/Queue/ShouldQueue.php | 8 + .../illuminate/contracts/Redis/Connection.php | 35 + .../illuminate/contracts/Redis/Connector.php | 25 + vendor/illuminate/contracts/Redis/Factory.php | 14 + .../Redis/LimiterTimeoutException.php | 10 + .../contracts/Routing/BindingRegistrar.php | 23 + .../contracts/Routing/Registrar.php | 105 + .../contracts/Routing/ResponseFactory.php | 155 + .../contracts/Routing/UrlGenerator.php | 79 + .../contracts/Routing/UrlRoutable.php | 39 + .../illuminate/contracts/Session/Session.php | 204 + .../contracts/Support/Arrayable.php | 13 + .../Support/CanBeEscapedWhenCastToString.php | 14 + .../contracts/Support/DeferrableProvider.php | 13 + .../Support/DeferringDisplayableValue.php | 13 + .../illuminate/contracts/Support/Htmlable.php | 13 + .../illuminate/contracts/Support/Jsonable.php | 14 + .../contracts/Support/MessageBag.php | 102 + .../contracts/Support/MessageProvider.php | 13 + .../contracts/Support/Renderable.php | 13 + .../contracts/Support/Responsable.php | 14 + .../contracts/Support/ValidatedData.php | 11 + .../Translation/HasLocalePreference.php | 13 + .../contracts/Translation/Loader.php | 40 + .../contracts/Translation/Translator.php | 42 + .../contracts/Validation/DataAwareRule.php | 14 + .../contracts/Validation/Factory.php | 46 + .../contracts/Validation/ImplicitRule.php | 8 + .../illuminate/contracts/Validation/Rule.php | 22 + .../Validation/UncompromisedVerifier.php | 14 + .../Validation/ValidatesWhenResolved.php | 13 + .../contracts/Validation/Validator.php | 65 + .../Validation/ValidatorAwareRule.php | 14 + vendor/illuminate/contracts/View/Engine.php | 15 + vendor/illuminate/contracts/View/Factory.php | 79 + vendor/illuminate/contracts/View/View.php | 31 + vendor/illuminate/contracts/composer.json | 35 + vendor/illuminate/macroable/LICENSE.md | 21 + .../illuminate/macroable/Traits/Macroable.php | 126 + vendor/illuminate/macroable/composer.json | 33 + vendor/jakeasmith/http_build_url/LICENSE | 21 + .../jakeasmith/http_build_url/composer.json | 18 + vendor/jakeasmith/http_build_url/readme.md | 20 + .../http_build_url/src/http_build_url.php | 174 + vendor/league/csv/LICENSE | 20 + vendor/league/csv/autoload.php | 14 + vendor/league/csv/composer.json | 88 + vendor/league/csv/phpstan-build.neon | 22 + vendor/league/csv/src/AbstractCsv.php | 675 + vendor/league/csv/src/Bom.php | 145 + vendor/league/csv/src/Buffer.php | 491 + vendor/league/csv/src/ByteSequence.php | 34 + .../league/csv/src/CallbackStreamFilter.php | 159 + vendor/league/csv/src/CannotInsertRecord.php | 64 + vendor/league/csv/src/CharsetConverter.php | 412 + vendor/league/csv/src/ColumnConsistency.php | 54 + vendor/league/csv/src/EncloseField.php | 142 + vendor/league/csv/src/EscapeFormula.php | 160 + vendor/league/csv/src/Exception.php | 23 + vendor/league/csv/src/FragmentFinder.php | 441 + vendor/league/csv/src/FragmentNotFound.php | 20 + vendor/league/csv/src/HTMLConverter.php | 253 + vendor/league/csv/src/HttpHeaders.php | 64 + vendor/league/csv/src/Info.php | 81 + vendor/league/csv/src/InvalidArgument.php | 113 + vendor/league/csv/src/JsonConverter.php | 608 + vendor/league/csv/src/JsonFormat.php | 22 + vendor/league/csv/src/MapIterator.php | 67 + .../csv/src/Query/Constraint/Column.php | 85 + .../csv/src/Query/Constraint/Comparison.php | 157 + .../csv/src/Query/Constraint/Criteria.php | 168 + .../csv/src/Query/Constraint/Offset.php | 79 + .../csv/src/Query/Constraint/TwoColumns.php | 99 + vendor/league/csv/src/Query/Limit.php | 50 + .../league/csv/src/Query/Ordering/Column.php | 113 + .../csv/src/Query/Ordering/MultiSort.php | 115 + vendor/league/csv/src/Query/Predicate.php | 43 + .../csv/src/Query/PredicateCombinator.php | 71 + .../league/csv/src/Query/QueryException.php | 44 + vendor/league/csv/src/Query/Row.php | 176 + vendor/league/csv/src/Query/Sort.php | 43 + .../league/csv/src/Query/SortCombinator.php | 45 + vendor/league/csv/src/RFC4180Field.php | 214 + vendor/league/csv/src/RdbmsResult.php | 83 + vendor/league/csv/src/Reader.php | 756 + vendor/league/csv/src/ResultSet.php | 756 + .../csv/src/Serializer/AfterMapping.php | 50 + .../league/csv/src/Serializer/ArrayShape.php | 32 + .../csv/src/Serializer/CallbackCasting.php | 392 + .../league/csv/src/Serializer/CastToArray.php | 228 + .../league/csv/src/Serializer/CastToBool.php | 99 + .../league/csv/src/Serializer/CastToDate.php | 159 + .../league/csv/src/Serializer/CastToEnum.php | 136 + .../league/csv/src/Serializer/CastToFloat.php | 92 + .../league/csv/src/Serializer/CastToInt.php | 92 + .../csv/src/Serializer/CastToString.php | 93 + .../src/Serializer/DenormalizationFailed.php | 25 + .../csv/src/Serializer/Denormalizer.php | 461 + vendor/league/csv/src/Serializer/MapCell.php | 33 + .../league/csv/src/Serializer/MapRecord.php | 71 + .../csv/src/Serializer/MappingFailed.php | 56 + .../csv/src/Serializer/PropertySetter.php | 71 + .../src/Serializer/SerializationFailed.php | 20 + vendor/league/csv/src/Serializer/Type.php | 163 + .../league/csv/src/Serializer/TypeCasting.php | 38 + .../csv/src/Serializer/TypeCastingFailed.php | 74 + .../csv/src/Serializer/TypeCastingInfo.php | 111 + .../src/Serializer/TypeCastingTargetType.php | 30 + vendor/league/csv/src/Statement.php | 518 + vendor/league/csv/src/Stream.php | 571 + vendor/league/csv/src/StreamFilter.php | 185 + vendor/league/csv/src/SwapDelimiter.php | 168 + vendor/league/csv/src/SyntaxError.php | 65 + vendor/league/csv/src/TabularData.php | 70 + vendor/league/csv/src/TabularDataProvider.php | 19 + vendor/league/csv/src/TabularDataReader.php | 99 + vendor/league/csv/src/TabularDataWriter.php | 47 + vendor/league/csv/src/UnableToProcessCsv.php | 20 + vendor/league/csv/src/UnavailableFeature.php | 43 + vendor/league/csv/src/UnavailableStream.php | 32 + vendor/league/csv/src/Warning.php | 87 + vendor/league/csv/src/Writer.php | 352 + vendor/league/csv/src/XMLConverter.php | 315 + vendor/league/csv/src/functions.php | 57 + vendor/league/csv/src/functions_include.php | 14 + vendor/league/event/LICENSE | 19 + vendor/league/event/composer.json | 37 + vendor/league/event/src/AbstractEvent.php | 64 + vendor/league/event/src/AbstractListener.php | 14 + vendor/league/event/src/BufferedEmitter.php | 49 + vendor/league/event/src/CallbackListener.php | 65 + vendor/league/event/src/Emitter.php | 268 + .../event/src/EmitterAwareInterface.php | 22 + vendor/league/event/src/EmitterAwareTrait.php | 41 + vendor/league/event/src/EmitterInterface.php | 92 + vendor/league/event/src/EmitterTrait.php | 113 + vendor/league/event/src/Event.php | 43 + vendor/league/event/src/EventInterface.php | 43 + vendor/league/event/src/Generator.php | 10 + .../league/event/src/GeneratorInterface.php | 13 + vendor/league/event/src/GeneratorTrait.php | 40 + vendor/league/event/src/ListenerAcceptor.php | 43 + .../event/src/ListenerAcceptorInterface.php | 59 + vendor/league/event/src/ListenerInterface.php | 24 + .../event/src/ListenerProviderInterface.php | 15 + vendor/league/event/src/OneTimeListener.php | 57 + vendor/league/flysystem-aws-s3-v3/LICENSE | 21 + .../league/flysystem-aws-s3-v3/changelog.md | 161 + .../league/flysystem-aws-s3-v3/composer.json | 38 + .../flysystem-aws-s3-v3/src/AwsS3Adapter.php | 723 + vendor/league/flysystem/CODE_OF_CONDUCT.md | 76 + vendor/league/flysystem/LICENSE | 19 + vendor/league/flysystem/SECURITY.md | 16 + vendor/league/flysystem/composer.json | 68 + vendor/league/flysystem/deprecations.md | 19 + .../flysystem/src/Adapter/AbstractAdapter.php | 72 + .../src/Adapter/AbstractFtpAdapter.php | 705 + .../src/Adapter/CanOverwriteFiles.php | 12 + vendor/league/flysystem/src/Adapter/Ftp.php | 584 + vendor/league/flysystem/src/Adapter/Ftpd.php | 48 + vendor/league/flysystem/src/Adapter/Local.php | 533 + .../flysystem/src/Adapter/NullAdapter.php | 144 + .../Polyfill/NotSupportingVisibilityTrait.php | 33 + .../Adapter/Polyfill/StreamedCopyTrait.php | 51 + .../Adapter/Polyfill/StreamedReadingTrait.php | 44 + .../src/Adapter/Polyfill/StreamedTrait.php | 9 + .../Adapter/Polyfill/StreamedWritingTrait.php | 60 + .../flysystem/src/Adapter/SynologyFtp.php | 8 + .../league/flysystem/src/AdapterInterface.php | 118 + vendor/league/flysystem/src/Config.php | 107 + .../league/flysystem/src/ConfigAwareTrait.php | 49 + .../src/ConnectionErrorException.php | 9 + .../src/ConnectionRuntimeException.php | 9 + .../flysystem/src/CorruptedPathDetected.php | 17 + vendor/league/flysystem/src/Directory.php | 31 + vendor/league/flysystem/src/Exception.php | 8 + vendor/league/flysystem/src/File.php | 205 + .../flysystem/src/FileExistsException.php | 37 + .../flysystem/src/FileNotFoundException.php | 37 + vendor/league/flysystem/src/Filesystem.php | 409 + .../flysystem/src/FilesystemException.php | 7 + .../flysystem/src/FilesystemInterface.php | 284 + .../src/FilesystemNotFoundException.php | 12 + vendor/league/flysystem/src/Handler.php | 137 + .../flysystem/src/InvalidRootException.php | 9 + vendor/league/flysystem/src/MountManager.php | 648 + .../flysystem/src/NotSupportedException.php | 37 + .../flysystem/src/Plugin/AbstractPlugin.php | 24 + .../league/flysystem/src/Plugin/EmptyDir.php | 34 + .../flysystem/src/Plugin/ForcedCopy.php | 44 + .../flysystem/src/Plugin/ForcedRename.php | 44 + .../flysystem/src/Plugin/GetWithMetadata.php | 51 + .../league/flysystem/src/Plugin/ListFiles.php | 35 + .../league/flysystem/src/Plugin/ListPaths.php | 36 + .../league/flysystem/src/Plugin/ListWith.php | 60 + .../flysystem/src/Plugin/PluggableTrait.php | 97 + .../src/Plugin/PluginNotFoundException.php | 10 + .../league/flysystem/src/PluginInterface.php | 20 + vendor/league/flysystem/src/ReadInterface.php | 88 + .../flysystem/src/RootViolationException.php | 10 + vendor/league/flysystem/src/SafeStorage.php | 39 + .../flysystem/src/UnreadableFileException.php | 18 + vendor/league/flysystem/src/Util.php | 354 + .../src/Util/ContentListingFormatter.php | 122 + vendor/league/flysystem/src/Util/MimeType.php | 80 + .../flysystem/src/Util/StreamHasher.php | 36 + vendor/league/mime-type-detection/LICENSE | 19 + .../league/mime-type-detection/composer.json | 34 + .../src/EmptyExtensionToMimeTypeMap.php | 13 + .../src/ExtensionLookup.php | 14 + .../src/ExtensionMimeTypeDetector.php | 56 + .../src/ExtensionToMimeTypeMap.php | 10 + .../src/FinfoMimeTypeDetector.php | 106 + .../src/GeneratedExtensionToMimeTypeMap.php | 2310 +++ .../src/MimeTypeDetector.php | 19 + .../src/OverridingExtensionToMimeTypeMap.php | 30 + vendor/league/oauth2-client/LICENSE | 21 + vendor/league/oauth2-client/composer.json | 53 + .../oauth2-client/src/Grant/AbstractGrant.php | 80 + .../src/Grant/AuthorizationCode.php | 41 + .../src/Grant/ClientCredentials.php | 39 + .../Grant/Exception/InvalidGrantException.php | 26 + .../oauth2-client/src/Grant/GrantFactory.php | 104 + .../oauth2-client/src/Grant/Password.php | 42 + .../oauth2-client/src/Grant/RefreshToken.php | 41 + .../HttpBasicAuthOptionProvider.php | 42 + .../OptionProviderInterface.php | 30 + .../OptionProvider/PostAuthOptionProvider.php | 51 + .../src/Provider/AbstractProvider.php | 961 ++ .../Exception/IdentityProviderException.php | 48 + .../src/Provider/GenericProvider.php | 247 + .../src/Provider/GenericResourceOwner.php | 61 + .../src/Provider/ResourceOwnerInterface.php | 36 + .../oauth2-client/src/Token/AccessToken.php | 251 + .../src/Token/AccessTokenInterface.php | 74 + .../ResourceOwnerAccessTokenInterface.php | 25 + .../Token/SettableRefreshTokenInterface.php | 26 + .../src/Tool/ArrayAccessorTrait.php | 52 + .../src/Tool/BearerAuthorizationTrait.php | 36 + .../src/Tool/GuardedPropertyTrait.php | 70 + .../src/Tool/MacAuthorizationTrait.php | 83 + .../src/Tool/ProviderRedirectTrait.php | 122 + .../src/Tool/QueryBuilderTrait.php | 33 + .../oauth2-client/src/Tool/RequestFactory.php | 87 + .../src/Tool/RequiredParameterTrait.php | 56 + vendor/league/oauth2-google/LICENSE | 21 + vendor/league/oauth2-google/composer.json | 44 + .../src/Exception/HostedDomainException.php | 15 + .../oauth2-google/src/Provider/Google.php | 138 + .../oauth2-google/src/Provider/GoogleUser.php | 125 + vendor/masterminds/html5/LICENSE.txt | 66 + vendor/masterminds/html5/RELEASE.md | 157 + vendor/masterminds/html5/bin/entities.php | 26 + vendor/masterminds/html5/composer.json | 40 + vendor/masterminds/html5/src/HTML5.php | 245 + .../masterminds/html5/src/HTML5/Elements.php | 637 + .../masterminds/html5/src/HTML5/Entities.php | 2236 +++ .../masterminds/html5/src/HTML5/Exception.php | 10 + .../html5/src/HTML5/InstructionProcessor.php | 41 + .../src/HTML5/Parser/CharacterReference.php | 61 + .../html5/src/HTML5/Parser/DOMTreeBuilder.php | 713 + .../html5/src/HTML5/Parser/EventHandler.php | 114 + .../src/HTML5/Parser/FileInputStream.php | 33 + .../html5/src/HTML5/Parser/InputStream.php | 87 + .../html5/src/HTML5/Parser/ParseError.php | 10 + .../html5/src/HTML5/Parser/Scanner.php | 416 + .../src/HTML5/Parser/StringInputStream.php | 336 + .../html5/src/HTML5/Parser/Tokenizer.php | 1215 ++ .../src/HTML5/Parser/TreeBuildingRules.php | 126 + .../html5/src/HTML5/Parser/UTF8Utils.php | 177 + .../src/HTML5/Serializer/HTML5Entities.php | 1533 ++ .../src/HTML5/Serializer/OutputRules.php | 559 + .../src/HTML5/Serializer/RulesInterface.php | 99 + .../html5/src/HTML5/Serializer/Traverser.php | 142 + vendor/moneyphp/money/LICENSE | 21 + vendor/moneyphp/money/composer.json | 95 + vendor/moneyphp/money/resources/currency.php | 1255 ++ .../resources/generate-money-factory.php | 61 + vendor/moneyphp/money/src/Calculator.php | 127 + .../money/src/Calculator/BcMathCalculator.php | 241 + .../money/src/Calculator/GmpCalculator.php | 322 + .../money/src/Calculator/PhpCalculator.php | 197 + vendor/moneyphp/money/src/Converter.php | 48 + vendor/moneyphp/money/src/Currencies.php | 29 + .../src/Currencies/AggregateCurrencies.php | 77 + .../src/Currencies/BitcoinCurrencies.php | 46 + .../money/src/Currencies/CachedCurrencies.php | 95 + .../money/src/Currencies/CurrencyList.php | 73 + .../money/src/Currencies/ISOCurrencies.php | 102 + vendor/moneyphp/money/src/Currency.php | 87 + vendor/moneyphp/money/src/CurrencyPair.php | 130 + vendor/moneyphp/money/src/Exception.php | 12 + .../src/Exception/FormatterException.php | 14 + .../money/src/Exception/ParserException.php | 14 + .../Exception/UnknownCurrencyException.php | 14 + .../UnresolvableCurrencyPairException.php | 30 + vendor/moneyphp/money/src/Exchange.php | 22 + .../money/src/Exchange/ExchangerExchange.php | 47 + .../money/src/Exchange/FixedExchange.php | 42 + .../money/src/Exchange/IndirectExchange.php | 195 + .../Exchange/ReversedCurrenciesExchange.php | 46 + .../money/src/Exchange/SwapExchange.php | 42 + .../src/Formatter/AggregateMoneyFormatter.php | 56 + .../src/Formatter/BitcoinMoneyFormatter.php | 87 + .../src/Formatter/DecimalMoneyFormatter.php | 59 + .../IntlLocalizedDecimalFormatter.php | 65 + .../src/Formatter/IntlMoneyFormatter.php | 65 + vendor/moneyphp/money/src/Money.php | 613 + vendor/moneyphp/money/src/MoneyFactory.php | 208 + vendor/moneyphp/money/src/MoneyFormatter.php | 20 + vendor/moneyphp/money/src/MoneyParser.php | 23 + vendor/moneyphp/money/src/Number.php | 331 + .../moneyphp/money/src/PHPUnit/Comparator.php | 63 + .../money/src/Parser/AggregateMoneyParser.php | 58 + .../money/src/Parser/BitcoinMoneyParser.php | 82 + .../money/src/Parser/DecimalMoneyParser.php | 100 + .../src/Parser/IntlLocalizedDecimalParser.php | 94 + .../money/src/Parser/IntlMoneyParser.php | 97 + vendor/monolog/monolog/LICENSE | 19 + vendor/monolog/monolog/composer.json | 82 + .../Monolog/Attribute/AsMonologProcessor.php | 38 + .../Monolog/Attribute/WithMonologChannel.php | 29 + .../monolog/src/Monolog/DateTimeImmutable.php | 24 + .../monolog/src/Monolog/ErrorHandler.php | 279 + .../Monolog/Formatter/ChromePHPFormatter.php | 87 + .../Monolog/Formatter/ElasticaFormatter.php | 84 + .../Formatter/ElasticsearchFormatter.php | 86 + .../Monolog/Formatter/FlowdockFormatter.php | 106 + .../Monolog/Formatter/FluentdFormatter.php | 85 + .../Monolog/Formatter/FormatterInterface.php | 38 + .../Formatter/GelfMessageFormatter.php | 150 + .../Formatter/GoogleCloudLoggingFormatter.php | 40 + .../src/Monolog/Formatter/HtmlFormatter.php | 142 + .../src/Monolog/Formatter/JsonFormatter.php | 230 + .../src/Monolog/Formatter/LineFormatter.php | 313 + .../src/Monolog/Formatter/LogglyFormatter.php | 47 + .../Monolog/Formatter/LogmaticFormatter.php | 70 + .../Monolog/Formatter/LogstashFormatter.php | 100 + .../Monolog/Formatter/MongoDBFormatter.php | 159 + .../Monolog/Formatter/NormalizerFormatter.php | 353 + .../src/Monolog/Formatter/ScalarFormatter.php | 49 + .../src/Monolog/Formatter/SyslogFormatter.php | 65 + .../Monolog/Formatter/WildfireFormatter.php | 137 + .../src/Monolog/Handler/AbstractHandler.php | 104 + .../Handler/AbstractProcessingHandler.php | 60 + .../Monolog/Handler/AbstractSyslogHandler.php | 95 + .../src/Monolog/Handler/AmqpHandler.php | 170 + .../Monolog/Handler/BrowserConsoleHandler.php | 300 + .../src/Monolog/Handler/BufferHandler.php | 170 + .../src/Monolog/Handler/ChromePHPHandler.php | 186 + .../src/Monolog/Handler/CouchDBHandler.php | 97 + .../src/Monolog/Handler/CubeHandler.php | 167 + .../monolog/src/Monolog/Handler/Curl/Util.php | 68 + .../Monolog/Handler/DeduplicationHandler.php | 174 + .../Handler/DoctrineCouchDBHandler.php | 47 + .../src/Monolog/Handler/DynamoDbHandler.php | 80 + .../src/Monolog/Handler/ElasticaHandler.php | 143 + .../Monolog/Handler/ElasticsearchHandler.php | 238 + .../src/Monolog/Handler/ErrorLogHandler.php | 94 + .../Monolog/Handler/FallbackGroupHandler.php | 68 + .../src/Monolog/Handler/FilterHandler.php | 202 + .../ActivationStrategyInterface.php | 27 + .../ChannelLevelActivationStrategy.php | 69 + .../ErrorLevelActivationStrategy.php | 42 + .../Monolog/Handler/FingersCrossedHandler.php | 242 + .../src/Monolog/Handler/FirePHPHandler.php | 174 + .../src/Monolog/Handler/FleepHookHandler.php | 132 + .../src/Monolog/Handler/FlowdockHandler.php | 127 + .../Handler/FormattableHandlerInterface.php | 34 + .../Handler/FormattableHandlerTrait.php | 57 + .../src/Monolog/Handler/GelfHandler.php | 58 + .../src/Monolog/Handler/GroupHandler.php | 130 + .../monolog/src/Monolog/Handler/Handler.php | 62 + .../src/Monolog/Handler/HandlerInterface.php | 76 + .../src/Monolog/Handler/HandlerWrapper.php | 134 + .../src/Monolog/Handler/IFTTTHandler.php | 75 + .../src/Monolog/Handler/InsightOpsHandler.php | 74 + .../src/Monolog/Handler/LogEntriesHandler.php | 68 + .../src/Monolog/Handler/LogglyHandler.php | 156 + .../src/Monolog/Handler/LogmaticHandler.php | 98 + .../src/Monolog/Handler/MailHandler.php | 91 + .../src/Monolog/Handler/MandrillHandler.php | 83 + .../Handler/MissingExtensionException.php | 21 + .../src/Monolog/Handler/MongoDBHandler.php | 82 + .../Monolog/Handler/NativeMailerHandler.php | 179 + .../src/Monolog/Handler/NewRelicHandler.php | 180 + .../src/Monolog/Handler/NoopHandler.php | 42 + .../src/Monolog/Handler/NullHandler.php | 56 + .../src/Monolog/Handler/OverflowHandler.php | 139 + .../src/Monolog/Handler/PHPConsoleHandler.php | 303 + .../src/Monolog/Handler/ProcessHandler.php | 191 + .../Handler/ProcessableHandlerInterface.php | 43 + .../Handler/ProcessableHandlerTrait.php | 70 + .../src/Monolog/Handler/PsrHandler.php | 92 + .../src/Monolog/Handler/PushoverHandler.php | 246 + .../src/Monolog/Handler/RedisHandler.php | 94 + .../Monolog/Handler/RedisPubSubHandler.php | 65 + .../src/Monolog/Handler/RollbarHandler.php | 132 + .../Monolog/Handler/RotatingFileHandler.php | 218 + .../src/Monolog/Handler/SamplingHandler.php | 121 + .../src/Monolog/Handler/SendGridHandler.php | 95 + .../src/Monolog/Handler/Slack/SlackRecord.php | 381 + .../src/Monolog/Handler/SlackHandler.php | 267 + .../Monolog/Handler/SlackWebhookHandler.php | 128 + .../src/Monolog/Handler/SocketHandler.php | 436 + .../src/Monolog/Handler/SqsHandler.php | 61 + .../src/Monolog/Handler/StreamHandler.php | 246 + .../Monolog/Handler/SymfonyMailerHandler.php | 109 + .../src/Monolog/Handler/SyslogHandler.php | 63 + .../Monolog/Handler/SyslogUdp/UdpSocket.php | 77 + .../src/Monolog/Handler/SyslogUdpHandler.php | 154 + .../Monolog/Handler/TelegramBotHandler.php | 297 + .../src/Monolog/Handler/TestHandler.php | 195 + .../Handler/WebRequestRecognizerTrait.php | 23 + .../Handler/WhatFailureGroupHandler.php | 80 + .../Monolog/Handler/ZendMonitorHandler.php | 90 + .../JsonSerializableDateTimeImmutable.php | 48 + vendor/monolog/monolog/src/Monolog/Level.php | 209 + .../monolog/monolog/src/Monolog/LogRecord.php | 127 + vendor/monolog/monolog/src/Monolog/Logger.php | 751 + .../Processor/ClosureContextProcessor.php | 51 + .../src/Monolog/Processor/GitProcessor.php | 75 + .../Monolog/Processor/HostnameProcessor.php | 37 + .../Processor/IntrospectionProcessor.php | 126 + .../Processor/LoadAverageProcessor.php | 66 + .../Processor/MemoryPeakUsageProcessor.php | 39 + .../src/Monolog/Processor/MemoryProcessor.php | 60 + .../Processor/MemoryUsageProcessor.php | 39 + .../Monolog/Processor/MercurialProcessor.php | 80 + .../Monolog/Processor/ProcessIdProcessor.php | 32 + .../Monolog/Processor/ProcessorInterface.php | 27 + .../Processor/PsrLogMessageProcessor.php | 87 + .../src/Monolog/Processor/TagProcessor.php | 65 + .../src/Monolog/Processor/UidProcessor.php | 67 + .../src/Monolog/Processor/WebProcessor.php | 115 + .../monolog/monolog/src/Monolog/Registry.php | 133 + .../src/Monolog/ResettableInterface.php | 31 + .../monolog/src/Monolog/SignalHandler.php | 113 + .../src/Monolog/Test/MonologTestCase.php | 71 + .../monolog/src/Monolog/Test/TestCase.php | 23 + vendor/monolog/monolog/src/Monolog/Utils.php | 257 + vendor/mtdowling/jmespath.php/LICENSE | 19 + vendor/mtdowling/jmespath.php/README.rst | 123 + vendor/mtdowling/jmespath.php/bin/jp.php | 74 + vendor/mtdowling/jmespath.php/bin/perf.php | 68 + vendor/mtdowling/jmespath.php/composer.json | 38 + .../mtdowling/jmespath.php/src/AstRuntime.php | 47 + .../jmespath.php/src/CompilerRuntime.php | 83 + .../jmespath.php/src/DebugRuntime.php | 109 + vendor/mtdowling/jmespath.php/src/Env.php | 91 + .../jmespath.php/src/FnDispatcher.php | 407 + .../mtdowling/jmespath.php/src/JmesPath.php | 17 + vendor/mtdowling/jmespath.php/src/Lexer.php | 444 + vendor/mtdowling/jmespath.php/src/Parser.php | 519 + .../jmespath.php/src/SyntaxErrorException.php | 36 + .../jmespath.php/src/TreeCompiler.php | 419 + .../jmespath.php/src/TreeInterpreter.php | 235 + vendor/mtdowling/jmespath.php/src/Utils.php | 258 + vendor/mustache/mustache/.gitattributes | 8 + vendor/mustache/mustache/LICENSE | 21 + .../mustache/mustache/bin/build_bootstrap.php | 178 + vendor/mustache/mustache/composer.json | 25 + .../mustache/src/Mustache/Autoloader.php | 88 + .../mustache/mustache/src/Mustache/Cache.php | 43 + .../src/Mustache/Cache/AbstractCache.php | 60 + .../src/Mustache/Cache/FilesystemCache.php | 161 + .../mustache/src/Mustache/Cache/NoopCache.php | 47 + .../mustache/src/Mustache/Compiler.php | 689 + .../mustache/src/Mustache/Context.php | 242 + .../mustache/mustache/src/Mustache/Engine.php | 829 + .../mustache/src/Mustache/Exception.php | 18 + .../Exception/InvalidArgumentException.php | 18 + .../src/Mustache/Exception/LogicException.php | 18 + .../Mustache/Exception/RuntimeException.php | 18 + .../Mustache/Exception/SyntaxException.php | 41 + .../Exception/UnknownFilterException.php | 38 + .../Exception/UnknownHelperException.php | 38 + .../Exception/UnknownTemplateException.php | 38 + .../src/Mustache/HelperCollection.php | 172 + .../mustache/src/Mustache/LambdaHelper.php | 76 + .../mustache/mustache/src/Mustache/Loader.php | 27 + .../src/Mustache/Loader/ArrayLoader.php | 79 + .../src/Mustache/Loader/CascadingLoader.php | 69 + .../src/Mustache/Loader/FilesystemLoader.php | 135 + .../src/Mustache/Loader/InlineLoader.php | 123 + .../src/Mustache/Loader/MutableLoader.php | 31 + .../Loader/ProductionFilesystemLoader.php | 86 + .../src/Mustache/Loader/StringLoader.php | 39 + .../mustache/mustache/src/Mustache/Logger.php | 126 + .../src/Mustache/Logger/AbstractLogger.php | 121 + .../src/Mustache/Logger/StreamLogger.php | 194 + .../mustache/mustache/src/Mustache/Parser.php | 317 + .../mustache/mustache/src/Mustache/Source.php | 40 + .../src/Mustache/Source/FilesystemSource.php | 77 + .../mustache/src/Mustache/Template.php | 180 + .../mustache/src/Mustache/Tokenizer.php | 378 + vendor/nesbot/carbon/.phpstorm.meta.php | 10 + vendor/nesbot/carbon/LICENSE | 19 + vendor/nesbot/carbon/bin/carbon | 23 + vendor/nesbot/carbon/bin/carbon.bat | 4 + vendor/nesbot/carbon/composer.json | 125 + vendor/nesbot/carbon/extension.neon | 5 + .../MessageFormatterMapperStrongType.php | 28 + .../MessageFormatterMapperWeakType.php | 36 + .../lazy/Carbon/ProtectedDatePeriod.php | 73 + .../lazy/Carbon/TranslatorStrongType.php | 52 + .../carbon/lazy/Carbon/TranslatorWeakType.php | 32 + .../lazy/Carbon/UnprotectedDatePeriod.php | 20 + vendor/nesbot/carbon/readme.md | 189 + vendor/nesbot/carbon/sponsors.php | 268 + .../carbon/src/Carbon/AbstractTranslator.php | 440 + vendor/nesbot/carbon/src/Carbon/Callback.php | 129 + vendor/nesbot/carbon/src/Carbon/Carbon.php | 847 + .../src/Carbon/CarbonConverterInterface.php | 21 + .../carbon/src/Carbon/CarbonImmutable.php | 890 + .../carbon/src/Carbon/CarbonInterface.php | 4960 ++++++ .../carbon/src/Carbon/CarbonInterval.php | 3572 ++++ .../nesbot/carbon/src/Carbon/CarbonPeriod.php | 2717 +++ .../src/Carbon/CarbonPeriodImmutable.php | 38 + .../carbon/src/Carbon/CarbonTimeZone.php | 336 + .../nesbot/carbon/src/Carbon/Cli/Invoker.php | 40 + .../Exceptions/BadComparisonUnitException.php | 50 + .../BadFluentConstructorException.php | 51 + .../Exceptions/BadFluentSetterException.php | 51 + .../Exceptions/BadMethodCallException.php | 19 + .../Exceptions/EndLessPeriodException.php | 21 + .../src/Carbon/Exceptions/Exception.php | 19 + .../Carbon/Exceptions/ImmutableException.php | 50 + .../Exceptions/InvalidArgumentException.php | 19 + .../Exceptions/InvalidCastException.php | 21 + .../Exceptions/InvalidDateException.php | 69 + .../Exceptions/InvalidFormatException.php | 21 + .../Exceptions/InvalidIntervalException.php | 21 + .../Exceptions/InvalidPeriodDateException.php | 21 + .../InvalidPeriodParameterException.php | 21 + .../Exceptions/InvalidTimeZoneException.php | 21 + .../Exceptions/InvalidTypeException.php | 21 + .../Exceptions/NotACarbonClassException.php | 56 + .../Carbon/Exceptions/NotAPeriodException.php | 21 + .../Exceptions/NotLocaleAwareException.php | 34 + .../Carbon/Exceptions/OutOfRangeException.php | 103 + .../Carbon/Exceptions/ParseErrorException.php | 90 + .../Carbon/Exceptions/RuntimeException.php | 19 + .../src/Carbon/Exceptions/UnitException.php | 21 + .../Exceptions/UnitNotConfiguredException.php | 50 + .../Exceptions/UnknownGetterException.php | 51 + .../Exceptions/UnknownMethodException.php | 51 + .../Exceptions/UnknownSetterException.php | 51 + .../Exceptions/UnknownUnitException.php | 50 + .../Exceptions/UnreachableException.php | 21 + .../Exceptions/UnsupportedUnitException.php | 27 + vendor/nesbot/carbon/src/Carbon/Factory.php | 848 + .../carbon/src/Carbon/FactoryImmutable.php | 192 + vendor/nesbot/carbon/src/Carbon/Lang/aa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/aa_DJ.php | 44 + .../nesbot/carbon/src/Carbon/Lang/aa_ER.php | 28 + .../carbon/src/Carbon/Lang/aa_ER@saaho.php | 28 + .../nesbot/carbon/src/Carbon/Lang/aa_ET.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/af.php | 77 + .../nesbot/carbon/src/Carbon/Lang/af_NA.php | 28 + .../nesbot/carbon/src/Carbon/Lang/af_ZA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/agq.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/agr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/agr_PE.php | 44 + vendor/nesbot/carbon/src/Carbon/Lang/ak.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ak_GH.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/am.php | 15 + .../nesbot/carbon/src/Carbon/Lang/am_ET.php | 59 + vendor/nesbot/carbon/src/Carbon/Lang/an.php | 15 + .../nesbot/carbon/src/Carbon/Lang/an_ES.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/anp.php | 15 + .../nesbot/carbon/src/Carbon/Lang/anp_IN.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ar.php | 93 + .../nesbot/carbon/src/Carbon/Lang/ar_AE.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_BH.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_DJ.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_DZ.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_EG.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_EH.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_ER.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_IL.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_IN.php | 26 + .../nesbot/carbon/src/Carbon/Lang/ar_IQ.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_JO.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_KM.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_KW.php | 95 + .../nesbot/carbon/src/Carbon/Lang/ar_LB.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_LY.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_MA.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_MR.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_OM.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_PS.php | 18 + .../nesbot/carbon/src/Carbon/Lang/ar_QA.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_SA.php | 94 + .../nesbot/carbon/src/Carbon/Lang/ar_SD.php | 29 + .../nesbot/carbon/src/Carbon/Lang/ar_SO.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_SS.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_SY.php | 29 + .../carbon/src/Carbon/Lang/ar_Shakl.php | 95 + .../nesbot/carbon/src/Carbon/Lang/ar_TD.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_TN.php | 91 + .../nesbot/carbon/src/Carbon/Lang/ar_YE.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/as.php | 15 + .../nesbot/carbon/src/Carbon/Lang/as_IN.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/asa.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ast.php | 59 + .../nesbot/carbon/src/Carbon/Lang/ast_ES.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ayc.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ayc_PE.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/az.php | 129 + .../nesbot/carbon/src/Carbon/Lang/az_AZ.php | 21 + .../nesbot/carbon/src/Carbon/Lang/az_Cyrl.php | 20 + .../nesbot/carbon/src/Carbon/Lang/az_IR.php | 27 + .../nesbot/carbon/src/Carbon/Lang/az_Latn.php | 29 + vendor/nesbot/carbon/src/Carbon/Lang/bas.php | 32 + vendor/nesbot/carbon/src/Carbon/Lang/be.php | 160 + .../nesbot/carbon/src/Carbon/Lang/be_BY.php | 22 + .../carbon/src/Carbon/Lang/be_BY@latin.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bem.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bem_ZM.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/ber.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ber_DZ.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ber_MA.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bez.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/bg.php | 108 + .../nesbot/carbon/src/Carbon/Lang/bg_BG.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/bhb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bhb_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bho.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bho_IN.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/bi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bi_VU.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/bm.php | 70 + vendor/nesbot/carbon/src/Carbon/Lang/bn.php | 100 + .../nesbot/carbon/src/Carbon/Lang/bn_BD.php | 27 + .../nesbot/carbon/src/Carbon/Lang/bn_IN.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/bo.php | 78 + .../nesbot/carbon/src/Carbon/Lang/bo_CN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/bo_IN.php | 29 + vendor/nesbot/carbon/src/Carbon/Lang/br.php | 74 + .../nesbot/carbon/src/Carbon/Lang/br_FR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/brx.php | 15 + .../nesbot/carbon/src/Carbon/Lang/brx_IN.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/bs.php | 93 + .../nesbot/carbon/src/Carbon/Lang/bs_BA.php | 12 + .../nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php | 28 + .../nesbot/carbon/src/Carbon/Lang/bs_Latn.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/byn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/byn_ER.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ca.php | 117 + .../nesbot/carbon/src/Carbon/Lang/ca_AD.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ca_ES.php | 12 + .../carbon/src/Carbon/Lang/ca_ES_Valencia.php | 23 + .../nesbot/carbon/src/Carbon/Lang/ca_FR.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ca_IT.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/ccp.php | 28 + .../nesbot/carbon/src/Carbon/Lang/ccp_IN.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/ce.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ce_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/cgg.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/chr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/chr_US.php | 59 + vendor/nesbot/carbon/src/Carbon/Lang/ckb.php | 90 + vendor/nesbot/carbon/src/Carbon/Lang/cmn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/cmn_TW.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/crh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/crh_UA.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/cs.php | 124 + .../nesbot/carbon/src/Carbon/Lang/cs_CZ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/csb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/csb_PL.php | 41 + vendor/nesbot/carbon/src/Carbon/Lang/cu.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/cv.php | 65 + .../nesbot/carbon/src/Carbon/Lang/cv_RU.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/cy.php | 86 + .../nesbot/carbon/src/Carbon/Lang/cy_GB.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/da.php | 81 + .../nesbot/carbon/src/Carbon/Lang/da_DK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/da_GL.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/dav.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/de.php | 135 + .../nesbot/carbon/src/Carbon/Lang/de_AT.php | 27 + .../nesbot/carbon/src/Carbon/Lang/de_BE.php | 20 + .../nesbot/carbon/src/Carbon/Lang/de_CH.php | 20 + .../nesbot/carbon/src/Carbon/Lang/de_DE.php | 16 + .../nesbot/carbon/src/Carbon/Lang/de_IT.php | 16 + .../nesbot/carbon/src/Carbon/Lang/de_LI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/de_LU.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/dje.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/doi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/doi_IN.php | 32 + vendor/nesbot/carbon/src/Carbon/Lang/dsb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/dsb_DE.php | 60 + vendor/nesbot/carbon/src/Carbon/Lang/dua.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/dv.php | 90 + .../nesbot/carbon/src/Carbon/Lang/dv_MV.php | 87 + vendor/nesbot/carbon/src/Carbon/Lang/dyo.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/dz.php | 15 + .../nesbot/carbon/src/Carbon/Lang/dz_BT.php | 44 + vendor/nesbot/carbon/src/Carbon/Lang/ebu.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ee.php | 56 + .../nesbot/carbon/src/Carbon/Lang/ee_TG.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/el.php | 89 + .../nesbot/carbon/src/Carbon/Lang/el_CY.php | 19 + .../nesbot/carbon/src/Carbon/Lang/el_GR.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/en.php | 95 + .../nesbot/carbon/src/Carbon/Lang/en_001.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_150.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_AG.php | 20 + .../nesbot/carbon/src/Carbon/Lang/en_AI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_AS.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_AT.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_AU.php | 30 + .../nesbot/carbon/src/Carbon/Lang/en_BB.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_BE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_BI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_BM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_BS.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_BW.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_BZ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_CA.php | 30 + .../nesbot/carbon/src/Carbon/Lang/en_CC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_CH.php | 21 + .../nesbot/carbon/src/Carbon/Lang/en_CK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_CM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_CX.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_CY.php | 27 + .../nesbot/carbon/src/Carbon/Lang/en_DE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_DG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_DK.php | 21 + .../nesbot/carbon/src/Carbon/Lang/en_DM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_ER.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_FI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_FJ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_FK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_FM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_GB.php | 29 + .../nesbot/carbon/src/Carbon/Lang/en_GD.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_GG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_GH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_GI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_GM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_GU.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_GY.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_HK.php | 18 + .../nesbot/carbon/src/Carbon/Lang/en_IE.php | 30 + .../nesbot/carbon/src/Carbon/Lang/en_IL.php | 30 + .../nesbot/carbon/src/Carbon/Lang/en_IM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_IN.php | 25 + .../nesbot/carbon/src/Carbon/Lang/en_IO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_ISO.php | 22 + .../nesbot/carbon/src/Carbon/Lang/en_JE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_JM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_KE.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_KI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_KN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_KY.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_LC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_LR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_LS.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MH.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MO.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MP.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MS.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MT.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MY.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_NA.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_NF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_NG.php | 17 + .../nesbot/carbon/src/Carbon/Lang/en_NL.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_NR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_NU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_NZ.php | 30 + .../nesbot/carbon/src/Carbon/Lang/en_PG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_PH.php | 18 + .../nesbot/carbon/src/Carbon/Lang/en_PK.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_PN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_PR.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_PW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_RW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SB.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SD.php | 15 + .../nesbot/carbon/src/Carbon/Lang/en_SE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SG.php | 23 + .../nesbot/carbon/src/Carbon/Lang/en_SH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SL.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SS.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SX.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_SZ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_TC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_TK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_TO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_TT.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_TV.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_TZ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_UG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_UM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_US.php | 14 + .../carbon/src/Carbon/Lang/en_US_Posix.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_VC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_VG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_VI.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_VU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_WS.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_ZA.php | 25 + .../nesbot/carbon/src/Carbon/Lang/en_ZM.php | 20 + .../nesbot/carbon/src/Carbon/Lang/en_ZW.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/eo.php | 77 + vendor/nesbot/carbon/src/Carbon/Lang/es.php | 125 + .../nesbot/carbon/src/Carbon/Lang/es_419.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_AR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_BO.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_BR.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_BZ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_CL.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CO.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CU.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_DO.php | 31 + .../nesbot/carbon/src/Carbon/Lang/es_EA.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_EC.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_ES.php | 16 + .../nesbot/carbon/src/Carbon/Lang/es_GQ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_GT.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_HN.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_IC.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_MX.php | 20 + .../nesbot/carbon/src/Carbon/Lang/es_NI.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PA.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PE.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PH.php | 22 + .../nesbot/carbon/src/Carbon/Lang/es_PR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PY.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_SV.php | 20 + .../nesbot/carbon/src/Carbon/Lang/es_US.php | 38 + .../nesbot/carbon/src/Carbon/Lang/es_UY.php | 21 + .../nesbot/carbon/src/Carbon/Lang/es_VE.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/et.php | 93 + .../nesbot/carbon/src/Carbon/Lang/et_EE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/eu.php | 67 + .../nesbot/carbon/src/Carbon/Lang/eu_ES.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ewo.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/fa.php | 84 + .../nesbot/carbon/src/Carbon/Lang/fa_AF.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fa_IR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ff.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ff_CM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ff_GN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ff_MR.php | 21 + .../nesbot/carbon/src/Carbon/Lang/ff_SN.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/fi.php | 88 + .../nesbot/carbon/src/Carbon/Lang/fi_FI.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/fil.php | 15 + .../nesbot/carbon/src/Carbon/Lang/fil_PH.php | 63 + vendor/nesbot/carbon/src/Carbon/Lang/fo.php | 69 + .../nesbot/carbon/src/Carbon/Lang/fo_DK.php | 19 + .../nesbot/carbon/src/Carbon/Lang/fo_FO.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/fr.php | 118 + .../nesbot/carbon/src/Carbon/Lang/fr_BE.php | 16 + .../nesbot/carbon/src/Carbon/Lang/fr_BF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_BI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_BJ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_BL.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CA.php | 25 + .../nesbot/carbon/src/Carbon/Lang/fr_CD.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CH.php | 24 + .../nesbot/carbon/src/Carbon/Lang/fr_CI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/fr_DJ.php | 22 + .../nesbot/carbon/src/Carbon/Lang/fr_DZ.php | 23 + .../nesbot/carbon/src/Carbon/Lang/fr_FR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GA.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GP.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GQ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_HT.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_KM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_LU.php | 20 + .../nesbot/carbon/src/Carbon/Lang/fr_MA.php | 15 + .../nesbot/carbon/src/Carbon/Lang/fr_MC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_MF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_MG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_ML.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_MQ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_MR.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_MU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_NC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_NE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_PF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_PM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_RE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_RW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_SC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_SN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_SY.php | 23 + .../nesbot/carbon/src/Carbon/Lang/fr_TD.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_TG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_TN.php | 22 + .../nesbot/carbon/src/Carbon/Lang/fr_VU.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_WF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_YT.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/fur.php | 15 + .../nesbot/carbon/src/Carbon/Lang/fur_IT.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/fy.php | 76 + .../nesbot/carbon/src/Carbon/Lang/fy_DE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/fy_NL.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ga.php | 75 + .../nesbot/carbon/src/Carbon/Lang/ga_IE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/gd.php | 75 + .../nesbot/carbon/src/Carbon/Lang/gd_GB.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/gez.php | 15 + .../nesbot/carbon/src/Carbon/Lang/gez_ER.php | 56 + .../nesbot/carbon/src/Carbon/Lang/gez_ET.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/gl.php | 98 + .../nesbot/carbon/src/Carbon/Lang/gl_ES.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/gom.php | 15 + .../carbon/src/Carbon/Lang/gom_Latn.php | 77 + vendor/nesbot/carbon/src/Carbon/Lang/gsw.php | 49 + .../nesbot/carbon/src/Carbon/Lang/gsw_CH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/gsw_FR.php | 20 + .../nesbot/carbon/src/Carbon/Lang/gsw_LI.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/gu.php | 82 + .../nesbot/carbon/src/Carbon/Lang/gu_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/guz.php | 48 + vendor/nesbot/carbon/src/Carbon/Lang/gv.php | 15 + .../nesbot/carbon/src/Carbon/Lang/gv_GB.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ha.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ha_GH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ha_NE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ha_NG.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hak.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hak_TW.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/haw.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/he.php | 86 + .../nesbot/carbon/src/Carbon/Lang/he_IL.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hi.php | 82 + .../nesbot/carbon/src/Carbon/Lang/hi_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hif.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hif_FJ.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/hne.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hne_IN.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/hr.php | 99 + .../nesbot/carbon/src/Carbon/Lang/hr_BA.php | 32 + .../nesbot/carbon/src/Carbon/Lang/hr_HR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hsb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hsb_DE.php | 60 + vendor/nesbot/carbon/src/Carbon/Lang/ht.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ht_HT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/hu.php | 118 + .../nesbot/carbon/src/Carbon/Lang/hu_HU.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hy.php | 90 + .../nesbot/carbon/src/Carbon/Lang/hy_AM.php | 24 + vendor/nesbot/carbon/src/Carbon/Lang/i18n.php | 23 + vendor/nesbot/carbon/src/Carbon/Lang/ia.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ia_FR.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/id.php | 92 + .../nesbot/carbon/src/Carbon/Lang/id_ID.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ig.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ig_NG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ii.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/ik.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ik_CA.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/in.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/is.php | 55 + .../nesbot/carbon/src/Carbon/Lang/is_IS.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/it.php | 111 + .../nesbot/carbon/src/Carbon/Lang/it_CH.php | 20 + .../nesbot/carbon/src/Carbon/Lang/it_IT.php | 16 + .../nesbot/carbon/src/Carbon/Lang/it_SM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/it_VA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/iu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/iu_CA.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/iw.php | 59 + vendor/nesbot/carbon/src/Carbon/Lang/ja.php | 98 + .../nesbot/carbon/src/Carbon/Lang/ja_JP.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/jgo.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/jmc.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/jv.php | 78 + vendor/nesbot/carbon/src/Carbon/Lang/ka.php | 204 + .../nesbot/carbon/src/Carbon/Lang/ka_GE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kab.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kab_DZ.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/kam.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/kde.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/kea.php | 49 + vendor/nesbot/carbon/src/Carbon/Lang/khq.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ki.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/kk.php | 103 + .../nesbot/carbon/src/Carbon/Lang/kk_KZ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kkj.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/kl.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kl_GL.php | 64 + vendor/nesbot/carbon/src/Carbon/Lang/kln.php | 32 + vendor/nesbot/carbon/src/Carbon/Lang/km.php | 77 + .../nesbot/carbon/src/Carbon/Lang/km_KH.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kn.php | 82 + .../nesbot/carbon/src/Carbon/Lang/kn_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ko.php | 84 + .../nesbot/carbon/src/Carbon/Lang/ko_KP.php | 14 + .../nesbot/carbon/src/Carbon/Lang/ko_KR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kok.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kok_IN.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/ks.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ks_IN.php | 52 + .../src/Carbon/Lang/ks_IN@devanagari.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ksb.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ksf.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ksh.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/ku.php | 57 + .../nesbot/carbon/src/Carbon/Lang/ku_TR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kw_GB.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ky.php | 106 + .../nesbot/carbon/src/Carbon/Lang/ky_KG.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lag.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/lb.php | 85 + .../nesbot/carbon/src/Carbon/Lang/lb_LU.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lg.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lg_UG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/li.php | 15 + .../nesbot/carbon/src/Carbon/Lang/li_NL.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/lij.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lij_IT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/lkt.php | 42 + vendor/nesbot/carbon/src/Carbon/Lang/ln.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ln_AO.php | 17 + .../nesbot/carbon/src/Carbon/Lang/ln_CD.php | 16 + .../nesbot/carbon/src/Carbon/Lang/ln_CF.php | 17 + .../nesbot/carbon/src/Carbon/Lang/ln_CG.php | 17 + vendor/nesbot/carbon/src/Carbon/Lang/lo.php | 63 + .../nesbot/carbon/src/Carbon/Lang/lo_LA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lrc.php | 18 + .../nesbot/carbon/src/Carbon/Lang/lrc_IQ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lt.php | 141 + .../nesbot/carbon/src/Carbon/Lang/lt_LT.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lu.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/luo.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/luy.php | 58 + vendor/nesbot/carbon/src/Carbon/Lang/lv.php | 177 + .../nesbot/carbon/src/Carbon/Lang/lv_LV.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lzh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lzh_TW.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/mag.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mag_IN.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/mai.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mai_IN.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/mas.php | 52 + .../nesbot/carbon/src/Carbon/Lang/mas_TZ.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/mer.php | 44 + vendor/nesbot/carbon/src/Carbon/Lang/mfe.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mfe_MU.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/mg.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mg_MG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/mgh.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/mgo.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mhr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mhr_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/mi.php | 66 + .../nesbot/carbon/src/Carbon/Lang/mi_NZ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/miq.php | 15 + .../nesbot/carbon/src/Carbon/Lang/miq_NI.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/mjw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mjw_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mk.php | 110 + .../nesbot/carbon/src/Carbon/Lang/mk_MK.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ml.php | 76 + .../nesbot/carbon/src/Carbon/Lang/ml_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mn.php | 116 + .../nesbot/carbon/src/Carbon/Lang/mn_MN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mni.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mni_IN.php | 36 + vendor/nesbot/carbon/src/Carbon/Lang/mo.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mr.php | 86 + .../nesbot/carbon/src/Carbon/Lang/mr_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ms.php | 104 + .../nesbot/carbon/src/Carbon/Lang/ms_BN.php | 22 + .../nesbot/carbon/src/Carbon/Lang/ms_MY.php | 18 + .../nesbot/carbon/src/Carbon/Lang/ms_SG.php | 22 + vendor/nesbot/carbon/src/Carbon/Lang/mt.php | 65 + .../nesbot/carbon/src/Carbon/Lang/mt_MT.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mua.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/my.php | 76 + .../nesbot/carbon/src/Carbon/Lang/my_MM.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mzn.php | 25 + vendor/nesbot/carbon/src/Carbon/Lang/nan.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nan_TW.php | 56 + .../carbon/src/Carbon/Lang/nan_TW@latin.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/naq.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/nb.php | 84 + .../nesbot/carbon/src/Carbon/Lang/nb_NO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/nb_SJ.php | 18 + vendor/nesbot/carbon/src/Carbon/Lang/nd.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/nds.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nds_DE.php | 60 + .../nesbot/carbon/src/Carbon/Lang/nds_NL.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ne.php | 82 + .../nesbot/carbon/src/Carbon/Lang/ne_IN.php | 25 + .../nesbot/carbon/src/Carbon/Lang/ne_NP.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/nhn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nhn_MX.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/niu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/niu_NU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/nl.php | 113 + .../nesbot/carbon/src/Carbon/Lang/nl_AW.php | 27 + .../nesbot/carbon/src/Carbon/Lang/nl_BE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/nl_BQ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/nl_CW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/nl_NL.php | 24 + .../nesbot/carbon/src/Carbon/Lang/nl_SR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/nl_SX.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/nmg.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/nn.php | 78 + .../nesbot/carbon/src/Carbon/Lang/nn_NO.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/nnh.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/no.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/nr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nr_ZA.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/nso.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nso_ZA.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/nus.php | 36 + vendor/nesbot/carbon/src/Carbon/Lang/nyn.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/oc.php | 101 + .../nesbot/carbon/src/Carbon/Lang/oc_FR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/om.php | 61 + .../nesbot/carbon/src/Carbon/Lang/om_ET.php | 12 + .../nesbot/carbon/src/Carbon/Lang/om_KE.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/or.php | 15 + .../nesbot/carbon/src/Carbon/Lang/or_IN.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/os.php | 15 + .../nesbot/carbon/src/Carbon/Lang/os_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/pa.php | 76 + .../nesbot/carbon/src/Carbon/Lang/pa_Arab.php | 26 + .../nesbot/carbon/src/Carbon/Lang/pa_Guru.php | 27 + .../nesbot/carbon/src/Carbon/Lang/pa_IN.php | 19 + .../nesbot/carbon/src/Carbon/Lang/pa_PK.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/pap.php | 39 + .../nesbot/carbon/src/Carbon/Lang/pap_AW.php | 16 + .../nesbot/carbon/src/Carbon/Lang/pap_CW.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/pl.php | 113 + .../nesbot/carbon/src/Carbon/Lang/pl_PL.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/prg.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/ps.php | 55 + .../nesbot/carbon/src/Carbon/Lang/ps_AF.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/pt.php | 111 + .../nesbot/carbon/src/Carbon/Lang/pt_AO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_BR.php | 39 + .../nesbot/carbon/src/Carbon/Lang/pt_CH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_CV.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_GQ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_GW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_LU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_MO.php | 20 + .../nesbot/carbon/src/Carbon/Lang/pt_MZ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/pt_PT.php | 27 + .../nesbot/carbon/src/Carbon/Lang/pt_ST.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_TL.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/qu.php | 22 + .../nesbot/carbon/src/Carbon/Lang/qu_BO.php | 14 + .../nesbot/carbon/src/Carbon/Lang/qu_EC.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/quz.php | 15 + .../nesbot/carbon/src/Carbon/Lang/quz_PE.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/raj.php | 15 + .../nesbot/carbon/src/Carbon/Lang/raj_IN.php | 48 + vendor/nesbot/carbon/src/Carbon/Lang/rm.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/rn.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/ro.php | 77 + .../nesbot/carbon/src/Carbon/Lang/ro_MD.php | 21 + .../nesbot/carbon/src/Carbon/Lang/ro_RO.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/rof.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ru.php | 180 + .../nesbot/carbon/src/Carbon/Lang/ru_BY.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_KG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_KZ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_MD.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_RU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_UA.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/rw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/rw_RW.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/rwk.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/sa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sa_IN.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/sah.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sah_RU.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/saq.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/sat.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sat_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sbp.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/sc.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sc_IT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sd.php | 87 + .../nesbot/carbon/src/Carbon/Lang/sd_IN.php | 26 + .../src/Carbon/Lang/sd_IN@devanagari.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/se.php | 73 + .../nesbot/carbon/src/Carbon/Lang/se_FI.php | 27 + .../nesbot/carbon/src/Carbon/Lang/se_NO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/se_SE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/seh.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ses.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/sg.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/sgs.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sgs_LT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sh.php | 58 + vendor/nesbot/carbon/src/Carbon/Lang/shi.php | 57 + .../carbon/src/Carbon/Lang/shi_Latn.php | 33 + .../carbon/src/Carbon/Lang/shi_Tfng.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/shn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/shn_MM.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/shs.php | 15 + .../nesbot/carbon/src/Carbon/Lang/shs_CA.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/si.php | 78 + .../nesbot/carbon/src/Carbon/Lang/si_LK.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sid.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sid_ET.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/sk.php | 160 + .../nesbot/carbon/src/Carbon/Lang/sk_SK.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sl.php | 129 + .../nesbot/carbon/src/Carbon/Lang/sl_SI.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sm.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sm_WS.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/smn.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/sn.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/so.php | 74 + .../nesbot/carbon/src/Carbon/Lang/so_DJ.php | 20 + .../nesbot/carbon/src/Carbon/Lang/so_ET.php | 16 + .../nesbot/carbon/src/Carbon/Lang/so_KE.php | 16 + .../nesbot/carbon/src/Carbon/Lang/so_SO.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/sq.php | 79 + .../nesbot/carbon/src/Carbon/Lang/sq_AL.php | 12 + .../nesbot/carbon/src/Carbon/Lang/sq_MK.php | 19 + .../nesbot/carbon/src/Carbon/Lang/sq_XK.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/sr.php | 98 + .../nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php | 97 + .../carbon/src/Carbon/Lang/sr_Cyrl_BA.php | 33 + .../carbon/src/Carbon/Lang/sr_Cyrl_ME.php | 103 + .../carbon/src/Carbon/Lang/sr_Cyrl_XK.php | 24 + .../nesbot/carbon/src/Carbon/Lang/sr_Latn.php | 12 + .../carbon/src/Carbon/Lang/sr_Latn_BA.php | 33 + .../carbon/src/Carbon/Lang/sr_Latn_ME.php | 61 + .../carbon/src/Carbon/Lang/sr_Latn_XK.php | 24 + .../nesbot/carbon/src/Carbon/Lang/sr_ME.php | 12 + .../nesbot/carbon/src/Carbon/Lang/sr_RS.php | 16 + .../carbon/src/Carbon/Lang/sr_RS@latin.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ss.php | 78 + .../nesbot/carbon/src/Carbon/Lang/ss_ZA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/st.php | 15 + .../nesbot/carbon/src/Carbon/Lang/st_ZA.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sv.php | 87 + .../nesbot/carbon/src/Carbon/Lang/sv_AX.php | 19 + .../nesbot/carbon/src/Carbon/Lang/sv_FI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/sv_SE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sw.php | 74 + .../nesbot/carbon/src/Carbon/Lang/sw_CD.php | 17 + .../nesbot/carbon/src/Carbon/Lang/sw_KE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/sw_TZ.php | 28 + .../nesbot/carbon/src/Carbon/Lang/sw_UG.php | 17 + vendor/nesbot/carbon/src/Carbon/Lang/szl.php | 15 + .../nesbot/carbon/src/Carbon/Lang/szl_PL.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ta.php | 97 + .../nesbot/carbon/src/Carbon/Lang/ta_IN.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ta_LK.php | 28 + .../nesbot/carbon/src/Carbon/Lang/ta_MY.php | 28 + .../nesbot/carbon/src/Carbon/Lang/ta_SG.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/tcy.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tcy_IN.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/te.php | 89 + .../nesbot/carbon/src/Carbon/Lang/te_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/teo.php | 28 + .../nesbot/carbon/src/Carbon/Lang/teo_KE.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/tet.php | 64 + vendor/nesbot/carbon/src/Carbon/Lang/tg.php | 104 + .../nesbot/carbon/src/Carbon/Lang/tg_TJ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/th.php | 73 + .../nesbot/carbon/src/Carbon/Lang/th_TH.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/the.php | 15 + .../nesbot/carbon/src/Carbon/Lang/the_NP.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ti.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ti_ER.php | 56 + .../nesbot/carbon/src/Carbon/Lang/ti_ET.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/tig.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tig_ER.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/tk.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tk_TM.php | 67 + vendor/nesbot/carbon/src/Carbon/Lang/tl.php | 61 + .../nesbot/carbon/src/Carbon/Lang/tl_PH.php | 18 + vendor/nesbot/carbon/src/Carbon/Lang/tlh.php | 72 + vendor/nesbot/carbon/src/Carbon/Lang/tn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tn_ZA.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/to.php | 15 + .../nesbot/carbon/src/Carbon/Lang/to_TO.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/tpi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tpi_PG.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/tr.php | 121 + .../nesbot/carbon/src/Carbon/Lang/tr_CY.php | 23 + .../nesbot/carbon/src/Carbon/Lang/tr_TR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ts.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ts_ZA.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/tt.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tt_RU.php | 39 + .../carbon/src/Carbon/Lang/tt_RU@iqtelif.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/twq.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/tzl.php | 65 + vendor/nesbot/carbon/src/Carbon/Lang/tzm.php | 57 + .../carbon/src/Carbon/Lang/tzm_Latn.php | 64 + vendor/nesbot/carbon/src/Carbon/Lang/ug.php | 84 + .../nesbot/carbon/src/Carbon/Lang/ug_CN.php | 17 + vendor/nesbot/carbon/src/Carbon/Lang/uk.php | 190 + .../nesbot/carbon/src/Carbon/Lang/uk_UA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/unm.php | 15 + .../nesbot/carbon/src/Carbon/Lang/unm_US.php | 58 + vendor/nesbot/carbon/src/Carbon/Lang/ur.php | 101 + .../nesbot/carbon/src/Carbon/Lang/ur_IN.php | 26 + .../nesbot/carbon/src/Carbon/Lang/ur_PK.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/uz.php | 85 + .../nesbot/carbon/src/Carbon/Lang/uz_Arab.php | 28 + .../nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php | 20 + .../nesbot/carbon/src/Carbon/Lang/uz_Latn.php | 74 + .../nesbot/carbon/src/Carbon/Lang/uz_UZ.php | 27 + .../carbon/src/Carbon/Lang/uz_UZ@cyrillic.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/vai.php | 35 + .../carbon/src/Carbon/Lang/vai_Latn.php | 27 + .../carbon/src/Carbon/Lang/vai_Vaii.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ve.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ve_ZA.php | 50 + vendor/nesbot/carbon/src/Carbon/Lang/vi.php | 76 + .../nesbot/carbon/src/Carbon/Lang/vi_VN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/vo.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/vun.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/wa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wa_BE.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/wae.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wae_CH.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/wal.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wal_ET.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/wo.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wo_SN.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/xh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/xh_ZA.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/xog.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/yav.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/yi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yi_US.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/yo.php | 65 + .../nesbot/carbon/src/Carbon/Lang/yo_BJ.php | 28 + .../nesbot/carbon/src/Carbon/Lang/yo_NG.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/yue.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yue_HK.php | 28 + .../carbon/src/Carbon/Lang/yue_Hans.php | 12 + .../carbon/src/Carbon/Lang/yue_Hant.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/yuw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yuw_PG.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/zgh.php | 80 + vendor/nesbot/carbon/src/Carbon/Lang/zh.php | 29 + .../nesbot/carbon/src/Carbon/Lang/zh_CN.php | 33 + .../nesbot/carbon/src/Carbon/Lang/zh_HK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_Hans.php | 102 + .../carbon/src/Carbon/Lang/zh_Hans_HK.php | 12 + .../carbon/src/Carbon/Lang/zh_Hans_MO.php | 12 + .../carbon/src/Carbon/Lang/zh_Hans_SG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_Hant.php | 104 + .../carbon/src/Carbon/Lang/zh_Hant_HK.php | 12 + .../carbon/src/Carbon/Lang/zh_Hant_MO.php | 12 + .../carbon/src/Carbon/Lang/zh_Hant_TW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_MO.php | 21 + .../nesbot/carbon/src/Carbon/Lang/zh_SG.php | 26 + .../nesbot/carbon/src/Carbon/Lang/zh_TW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_YUE.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/zu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/zu_ZA.php | 55 + vendor/nesbot/carbon/src/Carbon/Language.php | 271 + .../src/Carbon/Laravel/ServiceProvider.php | 178 + .../carbon/src/Carbon/List/languages.php | 1241 ++ .../nesbot/carbon/src/Carbon/List/regions.php | 292 + .../MessageFormatterMapper.php | 46 + vendor/nesbot/carbon/src/Carbon/Month.php | 79 + .../src/Carbon/PHPStan/MacroExtension.php | 137 + .../Carbon/PHPStan/MacroMethodReflection.php | 124 + .../carbon/src/Carbon/Traits/Boundaries.php | 469 + .../nesbot/carbon/src/Carbon/Traits/Cast.php | 48 + .../carbon/src/Carbon/Traits/Comparison.php | 1361 ++ .../carbon/src/Carbon/Traits/Converter.php | 556 + .../carbon/src/Carbon/Traits/Creator.php | 938 ++ .../nesbot/carbon/src/Carbon/Traits/Date.php | 2973 ++++ .../Traits/DeprecatedPeriodProperties.php | 83 + .../carbon/src/Carbon/Traits/Difference.php | 855 + .../src/Carbon/Traits/IntervalRounding.php | 59 + .../carbon/src/Carbon/Traits/IntervalStep.php | 94 + .../carbon/src/Carbon/Traits/LocalFactory.php | 67 + .../carbon/src/Carbon/Traits/Localization.php | 732 + .../nesbot/carbon/src/Carbon/Traits/Macro.php | 111 + .../src/Carbon/Traits/MagicParameter.php | 35 + .../nesbot/carbon/src/Carbon/Traits/Mixin.php | 208 + .../carbon/src/Carbon/Traits/Modifiers.php | 476 + .../carbon/src/Carbon/Traits/Mutability.php | 69 + .../Carbon/Traits/ObjectInitialisation.php | 24 + .../carbon/src/Carbon/Traits/Options.php | 217 + .../carbon/src/Carbon/Traits/Rounding.php | 226 + .../src/Carbon/Traits/Serialization.php | 328 + .../src/Carbon/Traits/StaticLocalization.php | 81 + .../src/Carbon/Traits/StaticOptions.php | 164 + .../nesbot/carbon/src/Carbon/Traits/Test.php | 185 + .../carbon/src/Carbon/Traits/Timestamp.php | 192 + .../src/Carbon/Traits/ToStringFormat.php | 52 + .../nesbot/carbon/src/Carbon/Traits/Units.php | 469 + .../nesbot/carbon/src/Carbon/Traits/Week.php | 223 + .../nesbot/carbon/src/Carbon/Translator.php | 34 + .../carbon/src/Carbon/TranslatorImmutable.php | 100 + .../Carbon/TranslatorStrongTypeInterface.php | 24 + vendor/nesbot/carbon/src/Carbon/Unit.php | 119 + vendor/nesbot/carbon/src/Carbon/WeekDay.php | 68 + .../nesbot/carbon/src/Carbon/WrapperClock.php | 187 + vendor/omnipay/common/.github/FUNDING.yml | 1 + .../common/.github/workflows/phpunit.yml | 54 + vendor/omnipay/common/LICENSE | 20 + vendor/omnipay/common/UPGRADE.md | 62 + vendor/omnipay/common/composer.json | 80 + .../common/src/Common/AbstractGateway.php | 344 + .../omnipay/common/src/Common/CreditCard.php | 1552 ++ .../Exception/BadMethodCallException.php | 10 + .../Exception/InvalidCreditCardException.php | 12 + .../Exception/InvalidRequestException.php | 12 + .../Exception/InvalidResponseException.php | 16 + .../src/Common/Exception/OmnipayException.php | 10 + .../src/Common/Exception/RuntimeException.php | 10 + .../common/src/Common/GatewayFactory.php | 90 + .../common/src/Common/GatewayInterface.php | 82 + vendor/omnipay/common/src/Common/Helper.php | 148 + .../omnipay/common/src/Common/Http/Client.php | 72 + .../src/Common/Http/ClientInterface.php | 34 + .../common/src/Common/Http/Exception.php | 31 + .../Http/Exception/NetworkException.php | 9 + .../Http/Exception/RequestException.php | 9 + vendor/omnipay/common/src/Common/Issuer.php | 80 + vendor/omnipay/common/src/Common/Item.php | 108 + vendor/omnipay/common/src/Common/ItemBag.php | 95 + .../common/src/Common/ItemInterface.php | 35 + .../src/Common/Message/AbstractRequest.php | 704 + .../src/Common/Message/AbstractResponse.php | 266 + .../Message/FetchIssuersResponseInterface.php | 29 + .../FetchPaymentMethodsResponseInterface.php | 29 + .../src/Common/Message/MessageInterface.php | 23 + .../Common/Message/NotificationInterface.php | 35 + .../Message/RedirectResponseInterface.php | 46 + .../src/Common/Message/RequestInterface.php | 51 + .../src/Common/Message/ResponseInterface.php | 65 + .../common/src/Common/ParametersTrait.php | 85 + .../common/src/Common/PaymentMethod.php | 63 + vendor/omnipay/common/src/Omnipay.php | 118 + vendor/omnipay/paypal/LICENSE | 20 + vendor/omnipay/paypal/composer.json | 43 + vendor/omnipay/paypal/grumphp.yml | 15 + vendor/omnipay/paypal/makedoc.sh | 146 + vendor/omnipay/paypal/phpunit.xml.dist~ | 25 + vendor/omnipay/paypal/src/ExpressGateway.php | 168 + .../paypal/src/ExpressInContextGateway.php | 24 + .../paypal/src/Message/AbstractRequest.php | 356 + .../src/Message/AbstractRestRequest.php | 189 + .../paypal/src/Message/CaptureRequest.php | 23 + .../src/Message/ExpressAuthorizeRequest.php | 195 + .../src/Message/ExpressAuthorizeResponse.php | 58 + .../ExpressCompleteAuthorizeRequest.php | 47 + .../Message/ExpressCompleteOrderRequest.php | 17 + .../ExpressCompletePurchaseRequest.php | 22 + .../ExpressCompletePurchaseResponse.php | 44 + .../Message/ExpressFetchCheckoutRequest.php | 26 + .../ExpressInContextAuthorizeRequest.php | 14 + .../ExpressInContextAuthorizeResponse.php | 20 + .../Message/ExpressInContextOrderRequest.php | 17 + .../src/Message/ExpressOrderRequest.php | 17 + .../ExpressTransactionSearchRequest.php | 371 + .../ExpressTransactionSearchResponse.php | 34 + .../paypal/src/Message/ExpressVoidRequest.php | 18 + .../src/Message/FetchTransactionRequest.php | 20 + .../src/Message/ProAuthorizeRequest.php | 43 + .../paypal/src/Message/ProPurchaseRequest.php | 17 + .../paypal/src/Message/RefundRequest.php | 26 + .../omnipay/paypal/src/Message/Response.php | 46 + .../src/Message/RestAuthorizeRequest.php | 366 + .../src/Message/RestAuthorizeResponse.php | 100 + .../Message/RestCancelSubscriptionRequest.php | 93 + .../paypal/src/Message/RestCaptureRequest.php | 59 + .../Message/RestCompletePurchaseRequest.php | 71 + .../RestCompleteSubscriptionRequest.php | 120 + .../src/Message/RestCreateCardRequest.php | 110 + .../src/Message/RestCreatePlanRequest.php | 323 + .../Message/RestCreateSubscriptionRequest.php | 457 + .../src/Message/RestDeleteCardRequest.php | 62 + .../src/Message/RestFetchPurchaseRequest.php | 55 + .../Message/RestFetchTransactionRequest.php | 56 + .../src/Message/RestListPlanRequest.php | 242 + .../src/Message/RestListPurchaseRequest.php | 282 + .../src/Message/RestPurchaseRequest.php | 232 + .../RestReactivateSubscriptionRequest.php | 93 + .../src/Message/RestRefundCaptureRequest.php | 36 + .../paypal/src/Message/RestRefundRequest.php | 73 + .../paypal/src/Message/RestResponse.php | 72 + .../Message/RestSearchTransactionRequest.php | 198 + .../RestSuspendSubscriptionRequest.php | 93 + .../paypal/src/Message/RestTokenRequest.php | 48 + .../src/Message/RestUpdatePlanRequest.php | 127 + .../paypal/src/Message/RestVoidRequest.php | 28 + vendor/omnipay/paypal/src/PayPalItem.php | 32 + vendor/omnipay/paypal/src/PayPalItemBag.php | 33 + vendor/omnipay/paypal/src/ProGateway.php | 81 + vendor/omnipay/paypal/src/RestGateway.php | 717 + .../InstantUpdateApi/BillingAgreement.php | 97 + .../InstantUpdateApi/ShippingOption.php | 72 + .../phprbac/PhpRbac/src/PhpRbac/Rbac.php | 57 + .../PhpRbac/src/PhpRbac/core/lib/Jf.php | 207 + .../src/PhpRbac/core/lib/nestedset/base.php | 397 + .../src/PhpRbac/core/lib/nestedset/full.php | 494 + .../PhpRbac/src/PhpRbac/core/lib/rbac.php | 1120 ++ .../PhpRbac/src/PhpRbac/core/setup.php | 69 + vendor/owasp/phprbac/composer.json | 34 + vendor/pancakeapp/dompdf/AUTHORS.md | 24 + vendor/pancakeapp/dompdf/LICENSE.LGPL | 456 + vendor/pancakeapp/dompdf/composer.json | 47 + vendor/pancakeapp/dompdf/lib/Cpdf.php | 6501 ++++++++ .../dompdf/lib/fonts/Courier-Bold.afm | 344 + .../dompdf/lib/fonts/Courier-BoldOblique.afm | 344 + .../dompdf/lib/fonts/Courier-Oblique.afm | 344 + .../pancakeapp/dompdf/lib/fonts/Courier.afm | 344 + .../dompdf/lib/fonts/DejaVuSans-Bold.ttf | Bin 0 -> 705684 bytes .../dompdf/lib/fonts/DejaVuSans-Bold.ufm | 6067 +++++++ .../lib/fonts/DejaVuSans-BoldOblique.ttf | Bin 0 -> 643292 bytes .../lib/fonts/DejaVuSans-BoldOblique.ufm | 5712 +++++++ .../dompdf/lib/fonts/DejaVuSans-Oblique.ttf | Bin 0 -> 635416 bytes .../dompdf/lib/fonts/DejaVuSans-Oblique.ufm | 5268 ++++++ .../dompdf/lib/fonts/DejaVuSans.ttf | Bin 0 -> 757076 bytes .../dompdf/lib/fonts/DejaVuSans.ufm | 6661 ++++++++ .../dompdf/lib/fonts/DejaVuSansMono-Bold.ttf | Bin 0 -> 331992 bytes .../dompdf/lib/fonts/DejaVuSansMono-Bold.ufm | 3285 ++++ .../lib/fonts/DejaVuSansMono-BoldOblique.ttf | Bin 0 -> 253580 bytes .../lib/fonts/DejaVuSansMono-BoldOblique.ufm | 2707 +++ .../lib/fonts/DejaVuSansMono-Oblique.ttf | Bin 0 -> 251932 bytes .../lib/fonts/DejaVuSansMono-Oblique.ufm | 2707 +++ .../dompdf/lib/fonts/DejaVuSansMono.ttf | Bin 0 -> 340712 bytes .../dompdf/lib/fonts/DejaVuSansMono.ufm | 3284 ++++ .../dompdf/lib/fonts/DejaVuSerif-Bold.ttf | Bin 0 -> 356088 bytes .../dompdf/lib/fonts/DejaVuSerif-Bold.ufm | 4013 +++++ .../lib/fonts/DejaVuSerif-BoldItalic.ttf | Bin 0 -> 347460 bytes .../lib/fonts/DejaVuSerif-BoldItalic.ufm | 3892 +++++ .../dompdf/lib/fonts/DejaVuSerif-Italic.ttf | Bin 0 -> 345996 bytes .../dompdf/lib/fonts/DejaVuSerif-Italic.ufm | 3883 +++++ .../dompdf/lib/fonts/DejaVuSerif.ttf | Bin 0 -> 380132 bytes .../dompdf/lib/fonts/DejaVuSerif.ufm | 4012 +++++ .../dompdf/lib/fonts/Helvetica-Bold.afm | 2829 ++++ .../lib/fonts/Helvetica-BoldOblique.afm | 2829 ++++ .../dompdf/lib/fonts/Helvetica-Oblique.afm | 3053 ++++ .../pancakeapp/dompdf/lib/fonts/Helvetica.afm | 3053 ++++ vendor/pancakeapp/dompdf/lib/fonts/Symbol.afm | 213 + .../dompdf/lib/fonts/Times-Bold.afm | 2590 +++ .../dompdf/lib/fonts/Times-BoldItalic.afm | 2386 +++ .../dompdf/lib/fonts/Times-Italic.afm | 2669 +++ .../dompdf/lib/fonts/Times-Roman.afm | 2421 +++ .../dompdf/lib/fonts/ZapfDingbats.afm | 225 + .../lib/fonts/installed-fonts.dist.json | 80 + .../pancakeapp/dompdf/lib/fonts/mustRead.html | 17 + .../dompdf/lib/res/broken_image.png | Bin 0 -> 618 bytes .../dompdf/lib/res/broken_image.svg | 8 + vendor/pancakeapp/dompdf/lib/res/html.css | 518 + vendor/pancakeapp/dompdf/src/Adapter/CPDF.php | 944 ++ vendor/pancakeapp/dompdf/src/Adapter/GD.php | 929 ++ .../pancakeapp/dompdf/src/Adapter/PDFLib.php | 1450 ++ vendor/pancakeapp/dompdf/src/Canvas.php | 477 + .../pancakeapp/dompdf/src/CanvasFactory.php | 58 + vendor/pancakeapp/dompdf/src/Cellmap.php | 999 ++ .../dompdf/src/Css/AttributeTranslator.php | 652 + vendor/pancakeapp/dompdf/src/Css/Color.php | 339 + vendor/pancakeapp/dompdf/src/Css/Style.php | 3743 +++++ .../pancakeapp/dompdf/src/Css/Stylesheet.php | 1655 ++ vendor/pancakeapp/dompdf/src/Dompdf.php | 1464 ++ vendor/pancakeapp/dompdf/src/Exception.php | 27 + .../dompdf/src/Exception/ImageException.php | 30 + vendor/pancakeapp/dompdf/src/FontMetrics.php | 635 + vendor/pancakeapp/dompdf/src/Frame.php | 1217 ++ .../pancakeapp/dompdf/src/Frame/Factory.php | 262 + .../dompdf/src/Frame/FrameListIterator.php | 100 + .../pancakeapp/dompdf/src/Frame/FrameTree.php | 324 + .../dompdf/src/Frame/FrameTreeIterator.php | 88 + .../FrameDecorator/AbstractFrameDecorator.php | 923 ++ .../dompdf/src/FrameDecorator/Block.php | 256 + .../dompdf/src/FrameDecorator/Image.php | 120 + .../dompdf/src/FrameDecorator/Inline.php | 121 + .../dompdf/src/FrameDecorator/ListBullet.php | 117 + .../src/FrameDecorator/ListBulletImage.php | 112 + .../src/FrameDecorator/NullFrameDecorator.php | 33 + .../dompdf/src/FrameDecorator/Page.php | 753 + .../dompdf/src/FrameDecorator/Table.php | 343 + .../dompdf/src/FrameDecorator/TableCell.php | 143 + .../dompdf/src/FrameDecorator/TableRow.php | 28 + .../src/FrameDecorator/TableRowGroup.php | 74 + .../dompdf/src/FrameDecorator/Text.php | 191 + .../FrameReflower/AbstractFrameReflower.php | 705 + .../dompdf/src/FrameReflower/Block.php | 948 ++ .../dompdf/src/FrameReflower/Image.php | 213 + .../dompdf/src/FrameReflower/Inline.php | 188 + .../dompdf/src/FrameReflower/ListBullet.php | 51 + .../src/FrameReflower/NullFrameReflower.php | 37 + .../dompdf/src/FrameReflower/Page.php | 199 + .../dompdf/src/FrameReflower/Table.php | 523 + .../dompdf/src/FrameReflower/TableCell.php | 161 + .../dompdf/src/FrameReflower/TableRow.php | 82 + .../src/FrameReflower/TableRowGroup.php | 71 + .../dompdf/src/FrameReflower/Text.php | 611 + vendor/pancakeapp/dompdf/src/Helpers.php | 1095 ++ vendor/pancakeapp/dompdf/src/Image/Cache.php | 254 + .../dompdf/src/JavascriptEmbedder.php | 51 + vendor/pancakeapp/dompdf/src/LineBox.php | 412 + vendor/pancakeapp/dompdf/src/Options.php | 1152 ++ vendor/pancakeapp/dompdf/src/PhpEvaluator.php | 62 + .../dompdf/src/Positioner/Absolute.php | 128 + .../src/Positioner/AbstractPositioner.php | 48 + .../dompdf/src/Positioner/Block.php | 40 + .../dompdf/src/Positioner/Fixed.php | 92 + .../dompdf/src/Positioner/Inline.php | 52 + .../dompdf/src/Positioner/ListBullet.php | 42 + .../dompdf/src/Positioner/NullPositioner.php | 26 + .../dompdf/src/Positioner/TableCell.php | 29 + .../dompdf/src/Positioner/TableRow.php | 34 + vendor/pancakeapp/dompdf/src/Renderer.php | 291 + .../dompdf/src/Renderer/AbstractRenderer.php | 1244 ++ .../pancakeapp/dompdf/src/Renderer/Block.php | 88 + .../pancakeapp/dompdf/src/Renderer/Image.php | 90 + .../pancakeapp/dompdf/src/Renderer/Inline.php | 126 + .../dompdf/src/Renderer/ListBullet.php | 235 + .../dompdf/src/Renderer/TableCell.php | 188 + .../dompdf/src/Renderer/TableRowGroup.php | 40 + .../pancakeapp/dompdf/src/Renderer/Text.php | 158 + .../constant_time_encoding/LICENSE.txt | 48 + .../constant_time_encoding/composer.json | 67 + .../constant_time_encoding/src/Base32.php | 558 + .../constant_time_encoding/src/Base32Hex.php | 118 + .../constant_time_encoding/src/Base64.php | 381 + .../src/Base64DotSlash.php | 92 + .../src/Base64DotSlashOrdered.php | 86 + .../src/Base64UrlSafe.php | 99 + .../constant_time_encoding/src/Binary.php | 87 + .../src/EncoderInterface.php | 61 + .../constant_time_encoding/src/Encoding.php | 301 + .../constant_time_encoding/src/Hex.php | 176 + .../constant_time_encoding/src/RFC4648.php | 208 + vendor/paragonie/random_compat/LICENSE | 22 + vendor/paragonie/random_compat/build-phar.sh | 5 + vendor/paragonie/random_compat/composer.json | 34 + .../dist/random_compat.phar.pubkey | 5 + .../dist/random_compat.phar.pubkey.asc | 11 + vendor/paragonie/random_compat/lib/random.php | 32 + .../random_compat/other/build_phar.php | 57 + .../random_compat/psalm-autoload.php | 9 + vendor/paragonie/random_compat/psalm.xml | 19 + vendor/payeezy/payeezy-php/Doxyfile | 2478 +++ vendor/payeezy/payeezy-php/LICENSE | 21 + vendor/payeezy/payeezy-php/coder_ruleset.xml | 159 + vendor/payeezy/payeezy-php/composer.json | 36 + .../payeezy-php/src/Payeezy/Client.php | 99 + .../payeezy-php/src/Payeezy/CreditCard.php | 10 + .../payeezy/payeezy-php/src/Payeezy/Error.php | 32 + .../payeezy-php/src/Payeezy/Paypal.php | 10 + .../payeezy-php/src/Payeezy/TeleCheck.php | 10 + .../payeezy/payeezy-php/src/Payeezy/Token.php | 10 + .../payeezy-php/src/Payeezy/Transaction.php | 161 + .../src/Payeezy/TransactionType.php | 143 + .../payeezy/payeezy-php/src/Payeezy/Util.php | 13 + .../payeezy-php/src/Payeezy/ValueLink.php | 10 + .../payeezy-php/src/Payeezy/threeDS.php | 10 + .../pear/math_biginteger/Math/BigInteger.php | 3717 +++++ vendor/pear/math_biginteger/README.rst | 39 + vendor/pear/math_biginteger/composer.json | 37 + .../pear/math_biginteger/demo/benchmark.php | 30 + vendor/pear/math_biginteger/demo/demo.php | 73 + vendor/pear/math_biginteger/package.xml | 152 + vendor/phenx/php-font-lib/LICENSE | 456 + vendor/phenx/php-font-lib/composer.json | 32 + .../maps/adobe-standard-encoding.map | 231 + vendor/phenx/php-font-lib/maps/cp1250.map | 251 + vendor/phenx/php-font-lib/maps/cp1251.map | 255 + vendor/phenx/php-font-lib/maps/cp1252.map | 251 + vendor/phenx/php-font-lib/maps/cp1253.map | 239 + vendor/phenx/php-font-lib/maps/cp1254.map | 249 + vendor/phenx/php-font-lib/maps/cp1255.map | 233 + vendor/phenx/php-font-lib/maps/cp1257.map | 244 + vendor/phenx/php-font-lib/maps/cp1258.map | 247 + vendor/phenx/php-font-lib/maps/cp874.map | 225 + vendor/phenx/php-font-lib/maps/iso-8859-1.map | 256 + .../phenx/php-font-lib/maps/iso-8859-11.map | 248 + .../phenx/php-font-lib/maps/iso-8859-15.map | 256 + .../phenx/php-font-lib/maps/iso-8859-16.map | 256 + vendor/phenx/php-font-lib/maps/iso-8859-2.map | 256 + vendor/phenx/php-font-lib/maps/iso-8859-4.map | 256 + vendor/phenx/php-font-lib/maps/iso-8859-5.map | 256 + vendor/phenx/php-font-lib/maps/iso-8859-7.map | 250 + vendor/phenx/php-font-lib/maps/iso-8859-9.map | 256 + vendor/phenx/php-font-lib/maps/koi8-r.map | 256 + vendor/phenx/php-font-lib/maps/koi8-u.map | 256 + .../src/FontLib/AdobeFontMetrics.php | 253 + .../php-font-lib/src/FontLib/BinaryStream.php | 449 + .../php-font-lib/src/FontLib/EOT/File.php | 159 + .../php-font-lib/src/FontLib/EOT/Header.php | 113 + .../php-font-lib/src/FontLib/EncodingMap.php | 37 + .../Exception/FontNotFoundException.php | 11 + .../phenx/php-font-lib/src/FontLib/Font.php | 89 + .../src/FontLib/Glyph/Outline.php | 109 + .../src/FontLib/Glyph/OutlineComponent.php | 31 + .../src/FontLib/Glyph/OutlineComposite.php | 253 + .../src/FontLib/Glyph/OutlineSimple.php | 335 + .../phenx/php-font-lib/src/FontLib/Header.php | 37 + .../src/FontLib/OpenType/File.php | 18 + .../FontLib/OpenType/TableDirectoryEntry.php | 18 + .../src/FontLib/Table/DirectoryEntry.php | 130 + .../php-font-lib/src/FontLib/Table/Table.php | 93 + .../src/FontLib/Table/Type/cmap.php | 381 + .../src/FontLib/Table/Type/cvt.php | 27 + .../src/FontLib/Table/Type/fpgm.php | 27 + .../src/FontLib/Table/Type/glyf.php | 166 + .../src/FontLib/Table/Type/head.php | 51 + .../src/FontLib/Table/Type/hhea.php | 44 + .../src/FontLib/Table/Type/hmtx.php | 65 + .../src/FontLib/Table/Type/kern.php | 80 + .../src/FontLib/Table/Type/loca.php | 80 + .../src/FontLib/Table/Type/maxp.php | 42 + .../src/FontLib/Table/Type/name.php | 242 + .../src/FontLib/Table/Type/nameRecord.php | 54 + .../src/FontLib/Table/Type/os2.php | 47 + .../src/FontLib/Table/Type/post.php | 143 + .../src/FontLib/Table/Type/prep.php | 30 + .../src/FontLib/TrueType/Collection.php | 100 + .../src/FontLib/TrueType/File.php | 591 + .../src/FontLib/TrueType/Header.php | 31 + .../FontLib/TrueType/TableDirectoryEntry.php | 33 + .../php-font-lib/src/FontLib/WOFF/File.php | 81 + .../php-font-lib/src/FontLib/WOFF/Header.php | 32 + .../src/FontLib/WOFF/TableDirectoryEntry.php | 34 + vendor/phenx/php-svg-lib/LICENSE | 165 + vendor/phenx/php-svg-lib/composer.json | 31 + .../phenx/php-svg-lib/src/Svg/CssLength.php | 135 + .../php-svg-lib/src/Svg/DefaultStyle.php | 29 + vendor/phenx/php-svg-lib/src/Svg/Document.php | 445 + .../php-svg-lib/src/Svg/Gradient/Stop.php | 16 + vendor/phenx/php-svg-lib/src/Svg/Style.php | 565 + .../php-svg-lib/src/Svg/Surface/CPdf.php | 6419 ++++++++ .../src/Svg/Surface/SurfaceCpdf.php | 495 + .../src/Svg/Surface/SurfaceInterface.php | 90 + .../src/Svg/Surface/SurfacePDFLib.php | 430 + .../php-svg-lib/src/Svg/Tag/AbstractTag.php | 327 + .../phenx/php-svg-lib/src/Svg/Tag/Anchor.php | 14 + .../phenx/php-svg-lib/src/Svg/Tag/Circle.php | 36 + .../php-svg-lib/src/Svg/Tag/ClipPath.php | 33 + .../phenx/php-svg-lib/src/Svg/Tag/Ellipse.php | 42 + .../phenx/php-svg-lib/src/Svg/Tag/Group.php | 33 + .../phenx/php-svg-lib/src/Svg/Tag/Image.php | 76 + vendor/phenx/php-svg-lib/src/Svg/Tag/Line.php | 43 + .../src/Svg/Tag/LinearGradient.php | 83 + vendor/phenx/php-svg-lib/src/Svg/Tag/Path.php | 581 + .../phenx/php-svg-lib/src/Svg/Tag/Polygon.php | 42 + .../php-svg-lib/src/Svg/Tag/Polyline.php | 40 + .../src/Svg/Tag/RadialGradient.php | 17 + vendor/phenx/php-svg-lib/src/Svg/Tag/Rect.php | 50 + .../phenx/php-svg-lib/src/Svg/Tag/Shape.php | 63 + vendor/phenx/php-svg-lib/src/Svg/Tag/Stop.php | 17 + .../php-svg-lib/src/Svg/Tag/StyleTag.php | 27 + .../phenx/php-svg-lib/src/Svg/Tag/Symbol.php | 34 + vendor/phenx/php-svg-lib/src/Svg/Tag/Text.php | 72 + .../phenx/php-svg-lib/src/Svg/Tag/UseTag.php | 132 + vendor/php-http/discovery/.php-cs-fixer.php | 17 + vendor/php-http/discovery/LICENSE | 19 + vendor/php-http/discovery/composer.json | 64 + .../php-http/discovery/src/ClassDiscovery.php | 255 + .../discovery/src/Composer/Plugin.php | 474 + vendor/php-http/discovery/src/Exception.php | 12 + .../ClassInstantiationFailedException.php | 14 + .../Exception/DiscoveryFailedException.php | 51 + .../Exception/NoCandidateFoundException.php | 47 + .../src/Exception/NotFoundException.php | 16 + .../Exception/PuliUnavailableException.php | 12 + .../StrategyUnavailableException.php | 15 + .../src/HttpAsyncClientDiscovery.php | 32 + .../discovery/src/HttpClientDiscovery.php | 34 + .../discovery/src/MessageFactoryDiscovery.php | 34 + .../discovery/src/NotFoundException.php | 16 + .../php-http/discovery/src/Psr17Factory.php | 303 + .../discovery/src/Psr17FactoryDiscovery.php | 137 + vendor/php-http/discovery/src/Psr18Client.php | 52 + .../discovery/src/Psr18ClientDiscovery.php | 33 + .../src/Strategy/CommonClassesStrategy.php | 185 + .../Strategy/CommonPsr17ClassesStrategy.php | 104 + .../src/Strategy/DiscoveryStrategy.php | 23 + .../src/Strategy/MockClientStrategy.php | 24 + .../src/Strategy/PuliBetaStrategy.php | 90 + .../discovery/src/StreamFactoryDiscovery.php | 34 + .../discovery/src/UriFactoryDiscovery.php | 34 + vendor/php-http/guzzle7-adapter/LICENSE | 19 + vendor/php-http/guzzle7-adapter/composer.json | 43 + .../guzzle7-adapter/phpstan.neon.dist | 5 + .../guzzle7-adapter/psalm.baseline.xml | 13 + vendor/php-http/guzzle7-adapter/psalm.xml | 16 + .../php-http/guzzle7-adapter/src/Client.php | 69 + .../Exception/UnexpectedValueException.php | 9 + .../php-http/guzzle7-adapter/src/Promise.php | 123 + .../php-http/httplug/.php-cs-fixer.dist.php | 16 + vendor/php-http/httplug/LICENSE | 20 + vendor/php-http/httplug/composer.json | 40 + vendor/php-http/httplug/puli.json | 12 + vendor/php-http/httplug/src/Exception.php | 14 + .../httplug/src/Exception/HttpException.php | 65 + .../src/Exception/NetworkException.php | 28 + .../src/Exception/RequestAwareTrait.php | 23 + .../src/Exception/RequestException.php | 29 + .../src/Exception/TransferException.php | 14 + .../php-http/httplug/src/HttpAsyncClient.php | 25 + vendor/php-http/httplug/src/HttpClient.php | 17 + .../src/Promise/HttpFulfilledPromise.php | 45 + .../src/Promise/HttpRejectedPromise.php | 49 + vendor/php-http/message-factory/CONTRIBUTING | 1 + vendor/php-http/message-factory/LICENSE | 19 + vendor/php-http/message-factory/composer.json | 27 + vendor/php-http/message-factory/puli.json | 44 + .../message-factory/src/MessageFactory.php | 14 + .../message-factory/src/RequestFactory.php | 36 + .../message-factory/src/ResponseFactory.php | 37 + .../message-factory/src/StreamFactory.php | 27 + .../message-factory/src/UriFactory.php | 26 + .../php-http/message/.php-cs-fixer.dist.php | 19 + vendor/php-http/message/LICENSE | 19 + vendor/php-http/message/apigen.neon | 6 + vendor/php-http/message/composer.json | 63 + vendor/php-http/message/puli.json | 111 + .../php-http/message/src/Authentication.php | 25 + .../src/Authentication/AutoBasicAuth.php | 45 + .../message/src/Authentication/BasicAuth.php | 41 + .../message/src/Authentication/Bearer.php | 34 + .../message/src/Authentication/Chain.php | 44 + .../message/src/Authentication/Header.php | 33 + .../message/src/Authentication/Matching.php | 66 + .../message/src/Authentication/QueryParam.php | 44 + .../src/Authentication/RequestConditional.php | 40 + .../message/src/Authentication/Wsse.php | 64 + .../message/src/Builder/ResponseBuilder.php | 146 + vendor/php-http/message/src/Cookie.php | 524 + vendor/php-http/message/src/CookieJar.php | 206 + vendor/php-http/message/src/CookieUtil.php | 53 + .../src/Decorator/MessageDecorator.php | 98 + .../src/Decorator/RequestDecorator.php | 66 + .../src/Decorator/ResponseDecorator.php | 44 + .../message/src/Decorator/StreamDecorator.php | 93 + .../message/src/Encoding/ChunkStream.php | 30 + .../message/src/Encoding/CompressStream.php | 39 + .../message/src/Encoding/DechunkStream.php | 23 + .../message/src/Encoding/DecompressStream.php | 39 + .../message/src/Encoding/DeflateStream.php | 35 + .../message/src/Encoding/Filter/Chunk.php | 27 + .../message/src/Encoding/FilteredStream.php | 214 + .../message/src/Encoding/GzipDecodeStream.php | 39 + .../message/src/Encoding/GzipEncodeStream.php | 39 + .../message/src/Encoding/InflateStream.php | 39 + vendor/php-http/message/src/Exception.php | 10 + .../Exception/UnexpectedValueException.php | 9 + vendor/php-http/message/src/Formatter.php | 35 + .../src/Formatter/CurlCommandFormatter.php | 97 + .../Formatter/FullHttpMessageFormatter.php | 110 + .../message/src/Formatter/SimpleFormatter.php | 46 + .../DiactorosMessageFactory.php | 80 + .../MessageFactory/GuzzleMessageFactory.php | 53 + .../src/MessageFactory/SlimMessageFactory.php | 72 + .../php-http/message/src/RequestMatcher.php | 26 + .../RequestMatcher/CallbackRequestMatcher.php | 29 + .../RequestMatcher/RegexRequestMatcher.php | 38 + .../src/RequestMatcher/RequestMatcher.php | 76 + .../message/src/Stream/BufferedStream.php | 237 + .../StreamFactory/DiactorosStreamFactory.php | 49 + .../src/StreamFactory/GuzzleStreamFactory.php | 30 + .../src/StreamFactory/SlimStreamFactory.php | 40 + .../src/UriFactory/DiactorosUriFactory.php | 37 + .../src/UriFactory/GuzzleUriFactory.php | 31 + .../message/src/UriFactory/SlimUriFactory.php | 34 + vendor/php-http/message/src/filters.php | 6 + vendor/php-http/promise/LICENSE | 19 + vendor/php-http/promise/composer.json | 33 + vendor/php-http/promise/phpstan.neon.dist | 6 + .../php-http/promise/src/FulfilledPromise.php | 51 + vendor/php-http/promise/src/Promise.php | 69 + .../php-http/promise/src/RejectedPromise.php | 48 + .../bcmath_compat/.github/workflows/ci.yml | 27 + vendor/phpseclib/bcmath_compat/LICENSE.md | 21 + vendor/phpseclib/bcmath_compat/composer.json | 49 + vendor/phpseclib/bcmath_compat/lib/bcmath.php | 185 + vendor/phpseclib/bcmath_compat/src/BCMath.php | 490 + vendor/phpseclib/phpseclib/AUTHORS | 7 + vendor/phpseclib/phpseclib/BACKERS.md | 19 + vendor/phpseclib/phpseclib/LICENSE | 20 + vendor/phpseclib/phpseclib/composer.json | 84 + .../phpseclib/Common/Functions/Strings.php | 507 + .../phpseclib/phpseclib/Crypt/AES.php | 116 + .../phpseclib/phpseclib/Crypt/Blowfish.php | 835 + .../phpseclib/phpseclib/Crypt/ChaCha20.php | 799 + .../phpseclib/Crypt/Common/AsymmetricKey.php | 581 + .../phpseclib/Crypt/Common/BlockCipher.php | 24 + .../Crypt/Common/Formats/Keys/JWK.php | 77 + .../Crypt/Common/Formats/Keys/OpenSSH.php | 224 + .../Crypt/Common/Formats/Keys/PKCS.php | 72 + .../Crypt/Common/Formats/Keys/PKCS1.php | 209 + .../Crypt/Common/Formats/Keys/PKCS8.php | 766 + .../Crypt/Common/Formats/Keys/PuTTY.php | 380 + .../Crypt/Common/Formats/Signature/Raw.php | 60 + .../phpseclib/Crypt/Common/PrivateKey.php | 31 + .../phpseclib/Crypt/Common/PublicKey.php | 25 + .../phpseclib/Crypt/Common/StreamCipher.php | 54 + .../phpseclib/Crypt/Common/SymmetricKey.php | 3398 ++++ .../Crypt/Common/Traits/Fingerprint.php | 57 + .../Crypt/Common/Traits/PasswordProtected.php | 46 + .../phpseclib/phpseclib/Crypt/DES.php | 1392 ++ .../phpseclib/phpseclib/Crypt/DH.php | 405 + .../phpseclib/Crypt/DH/Formats/Keys/PKCS1.php | 77 + .../phpseclib/Crypt/DH/Formats/Keys/PKCS8.php | 132 + .../phpseclib/Crypt/DH/Parameters.php | 36 + .../phpseclib/Crypt/DH/PrivateKey.php | 75 + .../phpseclib/Crypt/DH/PublicKey.php | 49 + .../phpseclib/phpseclib/Crypt/DSA.php | 337 + .../Crypt/DSA/Formats/Keys/OpenSSH.php | 118 + .../Crypt/DSA/Formats/Keys/PKCS1.php | 143 + .../Crypt/DSA/Formats/Keys/PKCS8.php | 146 + .../Crypt/DSA/Formats/Keys/PuTTY.php | 112 + .../phpseclib/Crypt/DSA/Formats/Keys/Raw.php | 85 + .../phpseclib/Crypt/DSA/Formats/Keys/XML.php | 132 + .../Crypt/DSA/Formats/Signature/ASN1.php | 62 + .../Crypt/DSA/Formats/Signature/Raw.php | 25 + .../Crypt/DSA/Formats/Signature/SSH2.php | 74 + .../phpseclib/Crypt/DSA/Parameters.php | 36 + .../phpseclib/Crypt/DSA/PrivateKey.php | 154 + .../phpseclib/Crypt/DSA/PublicKey.php | 87 + .../phpseclib/phpseclib/Crypt/EC.php | 480 + .../phpseclib/Crypt/EC/BaseCurves/Base.php | 218 + .../phpseclib/Crypt/EC/BaseCurves/Binary.php | 373 + .../Crypt/EC/BaseCurves/KoblitzPrime.php | 335 + .../Crypt/EC/BaseCurves/Montgomery.php | 279 + .../phpseclib/Crypt/EC/BaseCurves/Prime.php | 785 + .../Crypt/EC/BaseCurves/TwistedEdwards.php | 215 + .../phpseclib/Crypt/EC/Curves/Curve25519.php | 81 + .../phpseclib/Crypt/EC/Curves/Curve448.php | 92 + .../phpseclib/Crypt/EC/Curves/Ed25519.php | 333 + .../phpseclib/Crypt/EC/Curves/Ed448.php | 273 + .../Crypt/EC/Curves/brainpoolP160r1.php | 34 + .../Crypt/EC/Curves/brainpoolP160t1.php | 47 + .../Crypt/EC/Curves/brainpoolP192r1.php | 34 + .../Crypt/EC/Curves/brainpoolP192t1.php | 34 + .../Crypt/EC/Curves/brainpoolP224r1.php | 34 + .../Crypt/EC/Curves/brainpoolP224t1.php | 34 + .../Crypt/EC/Curves/brainpoolP256r1.php | 34 + .../Crypt/EC/Curves/brainpoolP256t1.php | 34 + .../Crypt/EC/Curves/brainpoolP320r1.php | 40 + .../Crypt/EC/Curves/brainpoolP320t1.php | 40 + .../Crypt/EC/Curves/brainpoolP384r1.php | 58 + .../Crypt/EC/Curves/brainpoolP384t1.php | 58 + .../Crypt/EC/Curves/brainpoolP512r1.php | 58 + .../Crypt/EC/Curves/brainpoolP512t1.php | 58 + .../phpseclib/Crypt/EC/Curves/nistb233.php | 18 + .../phpseclib/Crypt/EC/Curves/nistb409.php | 18 + .../phpseclib/Crypt/EC/Curves/nistk163.php | 18 + .../phpseclib/Crypt/EC/Curves/nistk233.php | 18 + .../phpseclib/Crypt/EC/Curves/nistk283.php | 18 + .../phpseclib/Crypt/EC/Curves/nistk409.php | 18 + .../phpseclib/Crypt/EC/Curves/nistp192.php | 18 + .../phpseclib/Crypt/EC/Curves/nistp224.php | 18 + .../phpseclib/Crypt/EC/Curves/nistp256.php | 18 + .../phpseclib/Crypt/EC/Curves/nistp384.php | 18 + .../phpseclib/Crypt/EC/Curves/nistp521.php | 18 + .../phpseclib/Crypt/EC/Curves/nistt571.php | 18 + .../phpseclib/Crypt/EC/Curves/prime192v1.php | 18 + .../phpseclib/Crypt/EC/Curves/prime192v2.php | 34 + .../phpseclib/Crypt/EC/Curves/prime192v3.php | 34 + .../phpseclib/Crypt/EC/Curves/prime239v1.php | 34 + .../phpseclib/Crypt/EC/Curves/prime239v2.php | 34 + .../phpseclib/Crypt/EC/Curves/prime239v3.php | 34 + .../phpseclib/Crypt/EC/Curves/prime256v1.php | 18 + .../phpseclib/Crypt/EC/Curves/secp112r1.php | 34 + .../phpseclib/Crypt/EC/Curves/secp112r2.php | 35 + .../phpseclib/Crypt/EC/Curves/secp128r1.php | 34 + .../phpseclib/Crypt/EC/Curves/secp128r2.php | 35 + .../phpseclib/Crypt/EC/Curves/secp160k1.php | 46 + .../phpseclib/Crypt/EC/Curves/secp160r1.php | 34 + .../phpseclib/Crypt/EC/Curves/secp160r2.php | 35 + .../phpseclib/Crypt/EC/Curves/secp192k1.php | 45 + .../phpseclib/Crypt/EC/Curves/secp192r1.php | 78 + .../phpseclib/Crypt/EC/Curves/secp224k1.php | 45 + .../phpseclib/Crypt/EC/Curves/secp224r1.php | 34 + .../phpseclib/Crypt/EC/Curves/secp256k1.php | 49 + .../phpseclib/Crypt/EC/Curves/secp256r1.php | 34 + .../phpseclib/Crypt/EC/Curves/secp384r1.php | 52 + .../phpseclib/Crypt/EC/Curves/secp521r1.php | 46 + .../phpseclib/Crypt/EC/Curves/sect113r1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect113r2.php | 34 + .../phpseclib/Crypt/EC/Curves/sect131r1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect131r2.php | 34 + .../phpseclib/Crypt/EC/Curves/sect163k1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect163r1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect163r2.php | 34 + .../phpseclib/Crypt/EC/Curves/sect193r1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect193r2.php | 34 + .../phpseclib/Crypt/EC/Curves/sect233k1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect233r1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect239k1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect283k1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect283r1.php | 34 + .../phpseclib/Crypt/EC/Curves/sect409k1.php | 38 + .../phpseclib/Crypt/EC/Curves/sect409r1.php | 38 + .../phpseclib/Crypt/EC/Curves/sect571k1.php | 42 + .../phpseclib/Crypt/EC/Curves/sect571r1.php | 42 + .../Crypt/EC/Formats/Keys/Common.php | 549 + .../phpseclib/Crypt/EC/Formats/Keys/JWK.php | 189 + .../EC/Formats/Keys/MontgomeryPrivate.php | 101 + .../EC/Formats/Keys/MontgomeryPublic.php | 71 + .../Crypt/EC/Formats/Keys/OpenSSH.php | 209 + .../phpseclib/Crypt/EC/Formats/Keys/PKCS1.php | 194 + .../phpseclib/Crypt/EC/Formats/Keys/PKCS8.php | 237 + .../phpseclib/Crypt/EC/Formats/Keys/PuTTY.php | 138 + .../phpseclib/Crypt/EC/Formats/Keys/XML.php | 486 + .../Crypt/EC/Formats/Keys/libsodium.php | 116 + .../Crypt/EC/Formats/Signature/ASN1.php | 62 + .../Crypt/EC/Formats/Signature/IEEE.php | 68 + .../Crypt/EC/Formats/Signature/Raw.php | 25 + .../Crypt/EC/Formats/Signature/SSH2.php | 94 + .../phpseclib/Crypt/EC/Parameters.php | 36 + .../phpseclib/Crypt/EC/PrivateKey.php | 283 + .../phpseclib/Crypt/EC/PublicKey.php | 173 + .../phpseclib/phpseclib/Crypt/Hash.php | 1891 +++ .../phpseclib/Crypt/PublicKeyLoader.php | 112 + .../phpseclib/phpseclib/Crypt/RC2.php | 640 + .../phpseclib/phpseclib/Crypt/RC4.php | 280 + .../phpseclib/phpseclib/Crypt/RSA.php | 933 ++ .../phpseclib/Crypt/RSA/Formats/Keys/JWK.php | 142 + .../Crypt/RSA/Formats/Keys/MSBLOB.php | 224 + .../Crypt/RSA/Formats/Keys/OpenSSH.php | 132 + .../Crypt/RSA/Formats/Keys/PKCS1.php | 187 + .../Crypt/RSA/Formats/Keys/PKCS8.php | 122 + .../phpseclib/Crypt/RSA/Formats/Keys/PSS.php | 238 + .../Crypt/RSA/Formats/Keys/PuTTY.php | 124 + .../phpseclib/Crypt/RSA/Formats/Keys/Raw.php | 184 + .../phpseclib/Crypt/RSA/Formats/Keys/XML.php | 171 + .../phpseclib/Crypt/RSA/PrivateKey.php | 530 + .../phpseclib/Crypt/RSA/PublicKey.php | 513 + .../phpseclib/phpseclib/Crypt/Random.php | 222 + .../phpseclib/phpseclib/Crypt/Rijndael.php | 1036 ++ .../phpseclib/phpseclib/Crypt/Salsa20.php | 528 + .../phpseclib/phpseclib/Crypt/TripleDES.php | 436 + .../phpseclib/phpseclib/Crypt/Twofish.php | 816 + .../Exception/BadConfigurationException.php | 23 + .../Exception/BadDecryptionException.php | 23 + .../phpseclib/Exception/BadModeException.php | 23 + .../Exception/ConnectionClosedException.php | 23 + .../Exception/FileNotFoundException.php | 23 + .../Exception/InconsistentSetupException.php | 23 + .../Exception/InsufficientSetupException.php | 23 + .../InvalidPacketLengthException.php | 10 + .../Exception/NoKeyLoadedException.php | 23 + .../NoSupportedAlgorithmsException.php | 23 + .../phpseclib/Exception/TimeoutException.php | 10 + .../Exception/UnableToConnectException.php | 23 + .../UnsupportedAlgorithmException.php | 23 + .../Exception/UnsupportedCurveException.php | 23 + .../Exception/UnsupportedFormatException.php | 23 + .../UnsupportedOperationException.php | 23 + .../phpseclib/phpseclib/File/ANSI.php | 551 + .../phpseclib/phpseclib/File/ASN1.php | 1530 ++ .../phpseclib/phpseclib/File/ASN1/Element.php | 43 + .../File/ASN1/Maps/AccessDescription.php | 32 + .../ASN1/Maps/AdministrationDomainName.php | 36 + .../File/ASN1/Maps/AlgorithmIdentifier.php | 35 + .../phpseclib/File/ASN1/Maps/AnotherName.php | 37 + .../phpseclib/File/ASN1/Maps/Attribute.php | 37 + .../File/ASN1/Maps/AttributeType.php | 26 + .../File/ASN1/Maps/AttributeTypeAndValue.php | 32 + .../File/ASN1/Maps/AttributeValue.php | 26 + .../phpseclib/File/ASN1/Maps/Attributes.php | 31 + .../ASN1/Maps/AuthorityInfoAccessSyntax.php | 31 + .../File/ASN1/Maps/AuthorityKeyIdentifier.php | 45 + .../phpseclib/File/ASN1/Maps/BaseDistance.php | 26 + .../File/ASN1/Maps/BasicConstraints.php | 39 + .../Maps/BuiltInDomainDefinedAttribute.php | 32 + .../Maps/BuiltInDomainDefinedAttributes.php | 31 + .../ASN1/Maps/BuiltInStandardAttributes.php | 67 + .../phpseclib/File/ASN1/Maps/CPSuri.php | 26 + .../File/ASN1/Maps/CRLDistributionPoints.php | 31 + .../phpseclib/File/ASN1/Maps/CRLNumber.php | 26 + .../phpseclib/File/ASN1/Maps/CRLReason.php | 41 + .../phpseclib/File/ASN1/Maps/CertPolicyId.php | 26 + .../phpseclib/File/ASN1/Maps/Certificate.php | 33 + .../File/ASN1/Maps/CertificateIssuer.php | 24 + .../File/ASN1/Maps/CertificateList.php | 33 + .../File/ASN1/Maps/CertificatePolicies.php | 31 + .../ASN1/Maps/CertificateSerialNumber.php | 26 + .../File/ASN1/Maps/CertificationRequest.php | 33 + .../ASN1/Maps/CertificationRequestInfo.php | 41 + .../File/ASN1/Maps/Characteristic_two.php | 36 + .../phpseclib/File/ASN1/Maps/CountryName.php | 36 + .../phpseclib/File/ASN1/Maps/Curve.php | 36 + .../phpseclib/File/ASN1/Maps/DHParameter.php | 38 + .../phpseclib/File/ASN1/Maps/DSAParams.php | 33 + .../File/ASN1/Maps/DSAPrivateKey.php | 36 + .../phpseclib/File/ASN1/Maps/DSAPublicKey.php | 26 + .../phpseclib/File/ASN1/Maps/DigestInfo.php | 34 + .../File/ASN1/Maps/DirectoryString.php | 35 + .../phpseclib/File/ASN1/Maps/DisplayText.php | 34 + .../File/ASN1/Maps/DistributionPoint.php | 45 + .../File/ASN1/Maps/DistributionPointName.php | 40 + .../phpseclib/File/ASN1/Maps/DssSigValue.php | 32 + .../phpseclib/File/ASN1/Maps/ECParameters.php | 45 + .../phpseclib/File/ASN1/Maps/ECPoint.php | 26 + .../phpseclib/File/ASN1/Maps/ECPrivateKey.php | 48 + .../phpseclib/File/ASN1/Maps/EDIPartyName.php | 42 + .../File/ASN1/Maps/EcdsaSigValue.php | 32 + .../File/ASN1/Maps/EncryptedData.php | 26 + .../ASN1/Maps/EncryptedPrivateKeyInfo.php | 32 + .../File/ASN1/Maps/ExtKeyUsageSyntax.php | 31 + .../phpseclib/File/ASN1/Maps/Extension.php | 43 + .../File/ASN1/Maps/ExtensionAttribute.php | 42 + .../File/ASN1/Maps/ExtensionAttributes.php | 31 + .../phpseclib/File/ASN1/Maps/Extensions.php | 33 + .../phpseclib/File/ASN1/Maps/FieldElement.php | 26 + .../phpseclib/File/ASN1/Maps/FieldID.php | 35 + .../phpseclib/File/ASN1/Maps/GeneralName.php | 80 + .../phpseclib/File/ASN1/Maps/GeneralNames.php | 31 + .../File/ASN1/Maps/GeneralSubtree.php | 42 + .../File/ASN1/Maps/GeneralSubtrees.php | 31 + .../File/ASN1/Maps/HashAlgorithm.php | 24 + .../File/ASN1/Maps/HoldInstructionCode.php | 26 + .../File/ASN1/Maps/InvalidityDate.php | 26 + .../File/ASN1/Maps/IssuerAltName.php | 24 + .../ASN1/Maps/IssuingDistributionPoint.php | 68 + .../File/ASN1/Maps/KeyIdentifier.php | 26 + .../phpseclib/File/ASN1/Maps/KeyPurposeId.php | 26 + .../phpseclib/File/ASN1/Maps/KeyUsage.php | 39 + .../File/ASN1/Maps/MaskGenAlgorithm.php | 24 + .../phpseclib/File/ASN1/Maps/Name.php | 31 + .../File/ASN1/Maps/NameConstraints.php | 40 + .../File/ASN1/Maps/NetworkAddress.php | 26 + .../File/ASN1/Maps/NoticeReference.php | 37 + .../File/ASN1/Maps/NumericUserIdentifier.php | 26 + .../phpseclib/File/ASN1/Maps/ORAddress.php | 33 + .../File/ASN1/Maps/OneAsymmetricKey.php | 48 + .../File/ASN1/Maps/OrganizationName.php | 26 + .../ASN1/Maps/OrganizationalUnitNames.php | 31 + .../File/ASN1/Maps/OtherPrimeInfo.php | 34 + .../File/ASN1/Maps/OtherPrimeInfos.php | 32 + .../phpseclib/File/ASN1/Maps/PBEParameter.php | 34 + .../phpseclib/File/ASN1/Maps/PBES2params.php | 34 + .../phpseclib/File/ASN1/Maps/PBKDF2params.php | 41 + .../phpseclib/File/ASN1/Maps/PBMAC1params.php | 34 + .../phpseclib/File/ASN1/Maps/PKCS9String.php | 32 + .../phpseclib/File/ASN1/Maps/Pentanomial.php | 33 + .../phpseclib/File/ASN1/Maps/PersonalName.php | 54 + .../File/ASN1/Maps/PolicyInformation.php | 38 + .../File/ASN1/Maps/PolicyMappings.php | 37 + .../File/ASN1/Maps/PolicyQualifierId.php | 26 + .../File/ASN1/Maps/PolicyQualifierInfo.php | 32 + .../File/ASN1/Maps/PostalAddress.php | 32 + .../phpseclib/File/ASN1/Maps/Prime_p.php | 26 + .../File/ASN1/Maps/PrivateDomainName.php | 32 + .../phpseclib/File/ASN1/Maps/PrivateKey.php | 26 + .../File/ASN1/Maps/PrivateKeyInfo.php | 41 + .../File/ASN1/Maps/PrivateKeyUsagePeriod.php | 40 + .../phpseclib/File/ASN1/Maps/PublicKey.php | 26 + .../File/ASN1/Maps/PublicKeyAndChallenge.php | 32 + .../File/ASN1/Maps/PublicKeyInfo.php | 35 + .../File/ASN1/Maps/RC2CBCParameter.php | 37 + .../phpseclib/File/ASN1/Maps/RDNSequence.php | 38 + .../File/ASN1/Maps/RSAPrivateKey.php | 44 + .../phpseclib/File/ASN1/Maps/RSAPublicKey.php | 32 + .../File/ASN1/Maps/RSASSA_PSS_params.php | 58 + .../phpseclib/File/ASN1/Maps/ReasonFlags.php | 39 + .../ASN1/Maps/RelativeDistinguishedName.php | 37 + .../File/ASN1/Maps/RevokedCertificate.php | 35 + .../ASN1/Maps/SignedPublicKeyAndChallenge.php | 33 + .../File/ASN1/Maps/SpecifiedECDomain.php | 45 + .../File/ASN1/Maps/SubjectAltName.php | 24 + .../ASN1/Maps/SubjectDirectoryAttributes.php | 31 + .../ASN1/Maps/SubjectInfoAccessSyntax.php | 31 + .../File/ASN1/Maps/SubjectPublicKeyInfo.php | 32 + .../phpseclib/File/ASN1/Maps/TBSCertList.php | 54 + .../File/ASN1/Maps/TBSCertificate.php | 65 + .../File/ASN1/Maps/TerminalIdentifier.php | 26 + .../phpseclib/File/ASN1/Maps/Time.php | 32 + .../phpseclib/File/ASN1/Maps/Trinomial.php | 26 + .../File/ASN1/Maps/UniqueIdentifier.php | 26 + .../phpseclib/File/ASN1/Maps/UserNotice.php | 38 + .../phpseclib/File/ASN1/Maps/Validity.php | 32 + .../File/ASN1/Maps/netscape_ca_policy_url.php | 26 + .../File/ASN1/Maps/netscape_cert_type.php | 40 + .../File/ASN1/Maps/netscape_comment.php | 26 + .../phpseclib/phpseclib/File/X509.php | 4029 +++++ .../phpseclib/phpseclib/Math/BigInteger.php | 926 ++ .../Math/BigInteger/Engines/BCMath.php | 702 + .../Math/BigInteger/Engines/BCMath/Base.php | 110 + .../BigInteger/Engines/BCMath/BuiltIn.php | 40 + .../Engines/BCMath/DefaultEngine.php | 25 + .../BigInteger/Engines/BCMath/OpenSSL.php | 25 + .../Engines/BCMath/Reductions/Barrett.php | 196 + .../Engines/BCMath/Reductions/EvalBarrett.php | 108 + .../Math/BigInteger/Engines/Engine.php | 1331 ++ .../phpseclib/Math/BigInteger/Engines/GMP.php | 697 + .../BigInteger/Engines/GMP/DefaultEngine.php | 40 + .../Math/BigInteger/Engines/OpenSSL.php | 68 + .../phpseclib/Math/BigInteger/Engines/PHP.php | 1360 ++ .../Math/BigInteger/Engines/PHP/Base.php | 143 + .../BigInteger/Engines/PHP/DefaultEngine.php | 25 + .../BigInteger/Engines/PHP/Montgomery.php | 89 + .../Math/BigInteger/Engines/PHP/OpenSSL.php | 25 + .../Engines/PHP/Reductions/Barrett.php | 296 + .../Engines/PHP/Reductions/Classic.php | 42 + .../Engines/PHP/Reductions/EvalBarrett.php | 500 + .../Engines/PHP/Reductions/Montgomery.php | 126 + .../Engines/PHP/Reductions/MontgomeryMult.php | 76 + .../Engines/PHP/Reductions/PowerOfTwo.php | 59 + .../Math/BigInteger/Engines/PHP32.php | 371 + .../Math/BigInteger/Engines/PHP64.php | 372 + .../phpseclib/phpseclib/Math/BinaryField.php | 203 + .../phpseclib/Math/BinaryField/Integer.php | 516 + .../phpseclib/Math/Common/FiniteField.php | 22 + .../Math/Common/FiniteField/Integer.php | 44 + .../phpseclib/phpseclib/Math/PrimeField.php | 118 + .../phpseclib/Math/PrimeField/Integer.php | 442 + .../phpseclib/phpseclib/Net/SFTP.php | 3790 +++++ .../phpseclib/phpseclib/Net/SFTP/Stream.php | 764 + .../phpseclib/phpseclib/Net/SSH2.php | 5633 +++++++ .../phpseclib/phpseclib/System/SSH/Agent.php | 306 + .../phpseclib/System/SSH/Agent/Identity.php | 346 + .../System/SSH/Common/Traits/ReadBytes.php | 37 + .../phpseclib/phpseclib/bootstrap.php | 22 + .../phpseclib/phpseclib/phpseclib/openssl.cnf | 6 + vendor/psr/cache/LICENSE.txt | 19 + vendor/psr/cache/composer.json | 25 + vendor/psr/cache/src/CacheException.php | 10 + vendor/psr/cache/src/CacheItemInterface.php | 105 + .../psr/cache/src/CacheItemPoolInterface.php | 138 + .../cache/src/InvalidArgumentException.php | 13 + vendor/psr/clock/LICENSE | 19 + vendor/psr/clock/composer.json | 21 + vendor/psr/clock/src/ClockInterface.php | 13 + vendor/psr/container/LICENSE | 21 + vendor/psr/container/composer.json | 22 + .../src/ContainerExceptionInterface.php | 12 + .../psr/container/src/ContainerInterface.php | 36 + .../src/NotFoundExceptionInterface.php | 10 + vendor/psr/http-client/LICENSE | 19 + vendor/psr/http-client/composer.json | 30 + .../src/ClientExceptionInterface.php | 10 + .../psr/http-client/src/ClientInterface.php | 20 + .../src/NetworkExceptionInterface.php | 24 + .../src/RequestExceptionInterface.php | 24 + vendor/psr/http-factory/LICENSE | 21 + vendor/psr/http-factory/composer.json | 38 + .../src/RequestFactoryInterface.php | 18 + .../src/ResponseFactoryInterface.php | 18 + .../src/ServerRequestFactoryInterface.php | 24 + .../src/StreamFactoryInterface.php | 45 + .../src/UploadedFileFactoryInterface.php | 34 + .../http-factory/src/UriFactoryInterface.php | 17 + vendor/psr/http-message/LICENSE | 19 + vendor/psr/http-message/composer.json | 26 + .../psr/http-message/src/MessageInterface.php | 187 + .../psr/http-message/src/RequestInterface.php | 130 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 + .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + vendor/psr/http-message/src/UriInterface.php | 324 + vendor/psr/log/LICENSE | 19 + vendor/psr/log/composer.json | 26 + vendor/psr/log/src/AbstractLogger.php | 15 + .../psr/log/src/InvalidArgumentException.php | 7 + vendor/psr/log/src/LogLevel.php | 18 + vendor/psr/log/src/LoggerAwareInterface.php | 14 + vendor/psr/log/src/LoggerAwareTrait.php | 22 + vendor/psr/log/src/LoggerInterface.php | 98 + vendor/psr/log/src/LoggerTrait.php | 98 + vendor/psr/log/src/NullLogger.php | 26 + vendor/psr/simple-cache/.editorconfig | 12 + vendor/psr/simple-cache/LICENSE.md | 21 + vendor/psr/simple-cache/composer.json | 25 + .../psr/simple-cache/src/CacheException.php | 10 + .../psr/simple-cache/src/CacheInterface.php | 114 + .../src/InvalidArgumentException.php | 13 + vendor/ralouphie/getallheaders/LICENSE | 21 + vendor/ralouphie/getallheaders/composer.json | 26 + .../getallheaders/src/getallheaders.php | 46 + .../.github/workflows/php.yml | 29 + vendor/riverline/multipart-parser/LICENSE | 19 + .../riverline/multipart-parser/composer.json | 37 + .../src/Converters/Globals.php | 48 + .../src/Converters/HttpFoundation.php | 39 + .../multipart-parser/src/Converters/PSR7.php | 49 + .../riverline/multipart-parser/src/Part.php | 36 + .../multipart-parser/src/StreamedPart.php | 426 + vendor/sabberworm/php-css-parser/LICENSE | 21 + .../sabberworm/php-css-parser/composer.json | 81 + .../src/CSSList/AtRuleBlockList.php | 84 + .../src/CSSList/CSSBlockList.php | 143 + .../php-css-parser/src/CSSList/CSSList.php | 496 + .../php-css-parser/src/CSSList/Document.php | 173 + .../php-css-parser/src/CSSList/KeyFrame.php | 105 + .../php-css-parser/src/Comment/Comment.php | 71 + .../src/Comment/Commentable.php | 25 + .../php-css-parser/src/OutputFormat.php | 348 + .../php-css-parser/src/OutputFormatter.php | 255 + .../sabberworm/php-css-parser/src/Parser.php | 66 + .../php-css-parser/src/Parsing/Anchor.php | 34 + .../src/Parsing/OutputException.php | 18 + .../src/Parsing/ParserState.php | 545 + .../src/Parsing/SourceException.php | 32 + .../src/Parsing/UnexpectedEOFException.php | 12 + .../src/Parsing/UnexpectedTokenException.php | 51 + .../php-css-parser/src/Property/AtRule.php | 38 + .../src/Property/CSSNamespace.php | 154 + .../php-css-parser/src/Property/Charset.php | 131 + .../php-css-parser/src/Property/Import.php | 145 + .../src/Property/KeyframeSelector.php | 25 + .../php-css-parser/src/Property/Selector.php | 144 + .../php-css-parser/src/Renderable.php | 21 + .../php-css-parser/src/Rule/Rule.php | 393 + .../php-css-parser/src/RuleSet/AtRuleSet.php | 77 + .../src/RuleSet/DeclarationBlock.php | 836 + .../php-css-parser/src/RuleSet/RuleSet.php | 332 + .../php-css-parser/src/Settings.php | 100 + .../php-css-parser/src/Value/CSSFunction.php | 98 + .../php-css-parser/src/Value/CSSString.php | 110 + .../php-css-parser/src/Value/CalcFunction.php | 110 + .../src/Value/CalcRuleValueList.php | 24 + .../php-css-parser/src/Value/Color.php | 180 + .../php-css-parser/src/Value/LineName.php | 65 + .../src/Value/PrimitiveValue.php | 14 + .../src/Value/RuleValueList.php | 20 + .../php-css-parser/src/Value/Size.php | 230 + .../php-css-parser/src/Value/URL.php | 95 + .../php-css-parser/src/Value/Value.php | 221 + .../php-css-parser/src/Value/ValueList.php | 106 + vendor/spatie/once/.editorconfig | 15 + vendor/spatie/once/.github/FUNDING.yml | 1 + .../once/.github/workflows/run-tests.yml | 44 + vendor/spatie/once/LICENSE.md | 21 + vendor/spatie/once/composer.json | 46 + vendor/spatie/once/src/Backtrace.php | 64 + vendor/spatie/once/src/Cache.php | 111 + vendor/spatie/once/src/Listener.php | 26 + vendor/spatie/once/src/functions.php | 33 + .../stripe-php/.coveralls.github-actions.yml | 3 + vendor/stripe/stripe-php/.editorconfig | 20 + vendor/stripe/stripe-php/.php-cs-fixer.php | 65 + vendor/stripe/stripe-php/CODE_OF_CONDUCT.md | 77 + vendor/stripe/stripe-php/LICENSE | 21 + vendor/stripe/stripe-php/Makefile | 39 + vendor/stripe/stripe-php/build.php | 25 + vendor/stripe/stripe-php/composer.json | 47 + .../stripe-php/data/ca-certificates.crt | 3476 ++++ vendor/stripe/stripe-php/init.php | 274 + vendor/stripe/stripe-php/lib/Account.php | 430 + vendor/stripe/stripe-php/lib/AccountLink.php | 26 + .../stripe/stripe-php/lib/AlipayAccount.php | 75 + .../stripe-php/lib/ApiOperations/All.php | 37 + .../stripe-php/lib/ApiOperations/Create.php | 31 + .../stripe-php/lib/ApiOperations/Delete.php | 30 + .../lib/ApiOperations/NestedResource.php | 135 + .../stripe-php/lib/ApiOperations/Request.php | 100 + .../stripe-php/lib/ApiOperations/Retrieve.php | 30 + .../stripe-php/lib/ApiOperations/Search.php | 37 + .../stripe-php/lib/ApiOperations/Update.php | 52 + vendor/stripe/stripe-php/lib/ApiRequestor.php | 619 + vendor/stripe/stripe-php/lib/ApiResource.php | 122 + vendor/stripe/stripe-php/lib/ApiResponse.php | 45 + .../stripe/stripe-php/lib/ApplePayDomain.php | 31 + .../stripe/stripe-php/lib/ApplicationFee.php | 90 + .../stripe-php/lib/ApplicationFeeRefund.php | 66 + vendor/stripe/stripe-php/lib/Balance.php | 45 + .../stripe-php/lib/BalanceTransaction.php | 71 + vendor/stripe/stripe-php/lib/BankAccount.php | 133 + .../stripe-php/lib/BaseStripeClient.php | 312 + .../lib/BaseStripeClientInterface.php | 44 + .../lib/BillingPortal/Configuration.php | 32 + .../stripe-php/lib/BillingPortal/Session.php | 41 + .../stripe/stripe-php/lib/BitcoinReceiver.php | 71 + .../stripe-php/lib/BitcoinTransaction.php | 19 + vendor/stripe/stripe-php/lib/Capability.php | 88 + vendor/stripe/stripe-php/lib/Card.php | 143 + vendor/stripe/stripe-php/lib/CashBalance.php | 66 + vendor/stripe/stripe-php/lib/Charge.php | 163 + .../stripe-php/lib/Checkout/Session.php | 133 + vendor/stripe/stripe-php/lib/Collection.php | 312 + vendor/stripe/stripe-php/lib/CountrySpec.php | 30 + vendor/stripe/stripe-php/lib/Coupon.php | 41 + vendor/stripe/stripe-php/lib/CreditNote.php | 111 + .../stripe-php/lib/CreditNoteLineItem.php | 26 + vendor/stripe/stripe-php/lib/Customer.php | 343 + .../lib/CustomerBalanceTransaction.php | 103 + vendor/stripe/stripe-php/lib/Discount.php | 23 + vendor/stripe/stripe-php/lib/Dispute.php | 82 + vendor/stripe/stripe-php/lib/EphemeralKey.php | 43 + vendor/stripe/stripe-php/lib/ErrorObject.php | 162 + vendor/stripe/stripe-php/lib/Event.php | 255 + .../lib/Exception/ApiConnectionException.php | 12 + .../lib/Exception/ApiErrorException.php | 219 + .../lib/Exception/AuthenticationException.php | 11 + .../lib/Exception/BadMethodCallException.php | 7 + .../lib/Exception/CardException.php | 84 + .../lib/Exception/ExceptionInterface.php | 22 + .../lib/Exception/IdempotencyException.php | 11 + .../Exception/InvalidArgumentException.php | 7 + .../lib/Exception/InvalidRequestException.php | 60 + .../Exception/OAuth/ExceptionInterface.php | 10 + .../OAuth/InvalidClientException.php | 12 + .../Exception/OAuth/InvalidGrantException.php | 13 + .../OAuth/InvalidRequestException.php | 11 + .../Exception/OAuth/InvalidScopeException.php | 10 + .../Exception/OAuth/OAuthErrorException.php | 19 + .../OAuth/UnknownOAuthErrorException.php | 12 + .../OAuth/UnsupportedGrantTypeException.php | 11 + .../UnsupportedResponseTypeException.php | 11 + .../lib/Exception/PermissionException.php | 11 + .../lib/Exception/RateLimitException.php | 12 + .../SignatureVerificationException.php | 74 + .../Exception/UnexpectedValueException.php | 7 + .../Exception/UnknownApiErrorException.php | 12 + vendor/stripe/stripe-php/lib/ExchangeRate.php | 30 + vendor/stripe/stripe-php/lib/File.php | 87 + vendor/stripe/stripe-php/lib/FileLink.php | 30 + .../lib/FinancialConnections/Account.php | 84 + .../lib/FinancialConnections/AccountOwner.php | 20 + .../FinancialConnections/AccountOwnership.php | 18 + .../lib/FinancialConnections/Session.php | 27 + .../stripe-php/lib/FundingInstructions.php | 28 + .../lib/HttpClient/ClientInterface.php | 22 + .../stripe-php/lib/HttpClient/CurlClient.php | 739 + .../HttpClient/StreamingClientInterface.php | 23 + .../lib/Identity/VerificationReport.php | 45 + .../lib/Identity/VerificationSession.php | 88 + vendor/stripe/stripe-php/lib/Invoice.php | 283 + vendor/stripe/stripe-php/lib/InvoiceItem.php | 50 + .../stripe/stripe-php/lib/InvoiceLineItem.php | 34 + .../stripe-php/lib/Issuing/Authorization.php | 81 + vendor/stripe/stripe-php/lib/Issuing/Card.php | 60 + .../stripe-php/lib/Issuing/CardDetails.php | 19 + .../stripe-php/lib/Issuing/Cardholder.php | 39 + .../stripe/stripe-php/lib/Issuing/Dispute.php | 53 + .../stripe-php/lib/Issuing/Transaction.php | 44 + vendor/stripe/stripe-php/lib/LineItem.php | 26 + vendor/stripe/stripe-php/lib/LoginLink.php | 15 + vendor/stripe/stripe-php/lib/Mandate.php | 27 + vendor/stripe/stripe-php/lib/OAuth.php | 101 + .../stripe-php/lib/OAuthErrorObject.php | 31 + vendor/stripe/stripe-php/lib/Order.php | 81 + vendor/stripe/stripe-php/lib/OrderItem.php | 19 + vendor/stripe/stripe-php/lib/OrderReturn.php | 32 + .../stripe/stripe-php/lib/PaymentIntent.php | 195 + vendor/stripe/stripe-php/lib/PaymentLink.php | 70 + .../stripe/stripe-php/lib/PaymentMethod.php | 95 + vendor/stripe/stripe-php/lib/Payout.php | 108 + vendor/stripe/stripe-php/lib/Person.php | 123 + vendor/stripe/stripe-php/lib/Plan.php | 57 + vendor/stripe/stripe-php/lib/Price.php | 83 + vendor/stripe/stripe-php/lib/Product.php | 73 + .../stripe/stripe-php/lib/PromotionCode.php | 33 + vendor/stripe/stripe-php/lib/Quote.php | 171 + .../lib/Radar/EarlyFraudWarning.php | 38 + .../stripe/stripe-php/lib/Radar/ValueList.php | 35 + .../stripe-php/lib/Radar/ValueListItem.php | 31 + vendor/stripe/stripe-php/lib/Recipient.php | 44 + .../stripe-php/lib/RecipientTransfer.php | 36 + vendor/stripe/stripe-php/lib/Refund.php | 78 + .../stripe-php/lib/Reporting/ReportRun.php | 37 + .../stripe-php/lib/Reporting/ReportType.php | 35 + .../stripe-php/lib/RequestTelemetry.php | 26 + vendor/stripe/stripe-php/lib/Review.php | 66 + vendor/stripe/stripe-php/lib/SKU.php | 41 + vendor/stripe/stripe-php/lib/SearchResult.php | 234 + .../lib/Service/AbstractService.php | 105 + .../lib/Service/AbstractServiceFactory.php | 59 + .../lib/Service/AccountLinkService.php | 25 + .../stripe-php/lib/Service/AccountService.php | 382 + .../lib/Service/ApplePayDomainService.php | 70 + .../lib/Service/ApplicationFeeService.php | 125 + .../stripe-php/lib/Service/BalanceService.php | 26 + .../lib/Service/BalanceTransactionService.php | 47 + .../BillingPortalServiceFactory.php | 27 + .../BillingPortal/ConfigurationService.php | 73 + .../Service/BillingPortal/SessionService.php | 23 + .../stripe-php/lib/Service/ChargeService.php | 122 + .../Checkout/CheckoutServiceFactory.php | 25 + .../lib/Service/Checkout/SessionService.php | 92 + .../lib/Service/CoreServiceFactory.php | 139 + .../lib/Service/CountrySpecService.php | 39 + .../stripe-php/lib/Service/CouponService.php | 104 + .../lib/Service/CreditNoteService.php | 156 + .../lib/Service/CustomerService.php | 440 + .../stripe-php/lib/Service/DisputeService.php | 83 + .../lib/Service/EphemeralKeyService.php | 43 + .../stripe-php/lib/Service/EventService.php | 44 + .../lib/Service/ExchangeRateService.php | 41 + .../lib/Service/FileLinkService.php | 70 + .../stripe-php/lib/Service/FileService.php | 66 + .../FinancialConnections/AccountService.php | 58 + .../FinancialConnectionsServiceFactory.php | 27 + .../FinancialConnections/SessionService.php | 41 + .../Identity/IdentityServiceFactory.php | 27 + .../Identity/VerificationReportService.php | 39 + .../Identity/VerificationSessionService.php | 146 + .../lib/Service/InvoiceItemService.php | 93 + .../stripe-php/lib/Service/InvoiceService.php | 292 + .../Service/Issuing/AuthorizationService.php | 97 + .../lib/Service/Issuing/CardService.php | 73 + .../lib/Service/Issuing/CardholderService.php | 74 + .../lib/Service/Issuing/DisputeService.php | 99 + .../Service/Issuing/IssuingServiceFactory.php | 33 + .../Service/Issuing/TransactionService.php | 59 + .../stripe-php/lib/Service/MandateService.php | 24 + .../stripe-php/lib/Service/OAuthService.php | 150 + .../lib/Service/OrderReturnService.php | 42 + .../stripe-php/lib/Service/OrderService.php | 109 + .../lib/Service/PaymentIntentService.php | 283 + .../lib/Service/PaymentLinkService.php | 89 + .../lib/Service/PaymentMethodService.php | 130 + .../stripe-php/lib/Service/PayoutService.php | 127 + .../stripe-php/lib/Service/PlanService.php | 91 + .../stripe-php/lib/Service/PriceService.php | 92 + .../stripe-php/lib/Service/ProductService.php | 112 + .../lib/Service/PromotionCodeService.php | 75 + .../stripe-php/lib/Service/QuoteService.php | 177 + .../Radar/EarlyFraudWarningService.php | 43 + .../lib/Service/Radar/RadarServiceFactory.php | 29 + .../Service/Radar/ValueListItemService.php | 74 + .../lib/Service/Radar/ValueListService.php | 93 + .../stripe-php/lib/Service/RefundService.php | 95 + .../Service/Reporting/ReportRunService.php | 55 + .../Service/Reporting/ReportTypeService.php | 40 + .../Reporting/ReportingServiceFactory.php | 27 + .../stripe-php/lib/Service/ReviewService.php | 58 + .../lib/Service/SetupAttemptService.php | 23 + .../lib/Service/SetupIntentService.php | 143 + .../lib/Service/ShippingRateService.php | 70 + .../Sigma/ScheduledQueryRunService.php | 39 + .../lib/Service/Sigma/SigmaServiceFactory.php | 25 + .../stripe-php/lib/Service/SkuService.php | 95 + .../stripe-php/lib/Service/SourceService.php | 110 + .../lib/Service/SubscriptionItemService.php | 151 + .../Service/SubscriptionScheduleService.php | 113 + .../lib/Service/SubscriptionService.php | 155 + .../stripe-php/lib/Service/TaxCodeService.php | 41 + .../stripe-php/lib/Service/TaxRateService.php | 71 + .../Service/Terminal/ConfigurationService.php | 86 + .../Terminal/ConnectionTokenService.php | 25 + .../lib/Service/Terminal/LocationService.php | 89 + .../lib/Service/Terminal/ReaderService.php | 151 + .../Terminal/TerminalServiceFactory.php | 31 + .../lib/Service/TestHelpers/RefundService.php | 24 + .../TestHelpers/Terminal/ReaderService.php | 25 + .../Terminal/TerminalServiceFactory.php | 25 + .../Service/TestHelpers/TestClockService.php | 87 + .../TestHelpers/TestHelpersServiceFactory.php | 29 + .../stripe-php/lib/Service/TokenService.php | 42 + .../stripe-php/lib/Service/TopupService.php | 89 + .../lib/Service/TransferService.php | 175 + .../lib/Service/WebhookEndpointService.php | 97 + vendor/stripe/stripe-php/lib/SetupAttempt.php | 32 + vendor/stripe/stripe-php/lib/SetupIntent.php | 131 + vendor/stripe/stripe-php/lib/ShippingRate.php | 40 + .../lib/Sigma/ScheduledQueryRun.php | 37 + .../stripe-php/lib/SingletonApiResource.php | 40 + vendor/stripe/stripe-php/lib/Source.php | 168 + .../stripe-php/lib/SourceTransaction.php | 20 + vendor/stripe/stripe-php/lib/Stripe.php | 278 + vendor/stripe/stripe-php/lib/StripeClient.php | 84 + .../stripe-php/lib/StripeClientInterface.php | 21 + vendor/stripe/stripe-php/lib/StripeObject.php | 587 + .../lib/StripeStreamingClientInterface.php | 11 + vendor/stripe/stripe-php/lib/Subscription.php | 139 + .../stripe-php/lib/SubscriptionItem.php | 84 + .../stripe-php/lib/SubscriptionSchedule.php | 76 + vendor/stripe/stripe-php/lib/TaxCode.php | 22 + vendor/stripe/stripe-php/lib/TaxId.php | 120 + vendor/stripe/stripe-php/lib/TaxRate.php | 50 + .../stripe-php/lib/Terminal/Configuration.php | 28 + .../lib/Terminal/ConnectionToken.php | 22 + .../stripe-php/lib/Terminal/Location.php | 30 + .../stripe/stripe-php/lib/Terminal/Reader.php | 104 + .../stripe-php/lib/TestHelpers/TestClock.php | 53 + vendor/stripe/stripe-php/lib/ThreeDSecure.php | 37 + vendor/stripe/stripe-php/lib/Token.php | 57 + vendor/stripe/stripe-php/lib/Topup.php | 63 + vendor/stripe/stripe-php/lib/Transfer.php | 130 + .../stripe-php/lib/TransferReversal.php | 79 + vendor/stripe/stripe-php/lib/UsageRecord.php | 25 + .../stripe-php/lib/UsageRecordSummary.php | 19 + .../lib/Util/CaseInsensitiveArray.php | 93 + .../stripe-php/lib/Util/DefaultLogger.php | 29 + .../stripe-php/lib/Util/LoggerInterface.php | 34 + .../stripe-php/lib/Util/ObjectTypes.php | 115 + .../stripe-php/lib/Util/RandomGenerator.php | 36 + .../stripe-php/lib/Util/RequestOptions.php | 168 + vendor/stripe/stripe-php/lib/Util/Set.php | 48 + vendor/stripe/stripe-php/lib/Util/Util.php | 265 + vendor/stripe/stripe-php/lib/Webhook.php | 42 + .../stripe/stripe-php/lib/WebhookEndpoint.php | 41 + .../stripe-php/lib/WebhookSignature.php | 140 + vendor/stripe/stripe-php/phpdoc.dist.xml | 31 + .../stripe/stripe-php/phpstan-baseline.neon | 0 vendor/stripe/stripe-php/phpstan.neon.dist | 13 + vendor/stripe/stripe-php/update_certs.php | 19 + vendor/swiftmailer/swiftmailer/.gitattributes | 11 + .../swiftmailer/.github/ISSUE_TEMPLATE.md | 19 + .../.github/PULL_REQUEST_TEMPLATE.md | 14 + .../swiftmailer/.github/workflows/tests.yml | 55 + vendor/swiftmailer/swiftmailer/.php_cs.dist | 21 + vendor/swiftmailer/swiftmailer/LICENSE | 19 + vendor/swiftmailer/swiftmailer/composer.json | 44 + .../swiftmailer/lib/classes/Swift.php | 78 + .../lib/classes/Swift/AddressEncoder.php | 25 + .../AddressEncoder/IdnAddressEncoder.php | 50 + .../AddressEncoder/Utf8AddressEncoder.php | 36 + .../classes/Swift/AddressEncoderException.php | 32 + .../lib/classes/Swift/Attachment.php | 54 + .../AbstractFilterableInputStream.php | 176 + .../Swift/ByteStream/ArrayByteStream.php | 178 + .../Swift/ByteStream/FileByteStream.php | 214 + .../ByteStream/TemporaryFileByteStream.php | 52 + .../lib/classes/Swift/CharacterReader.php | 67 + .../GenericFixedWidthReader.php | 97 + .../Swift/CharacterReader/UsAsciiReader.php | 84 + .../Swift/CharacterReader/Utf8Reader.php | 176 + .../classes/Swift/CharacterReaderFactory.php | 26 + .../SimpleCharacterReaderFactory.php | 124 + .../lib/classes/Swift/CharacterStream.php | 87 + .../CharacterStream/ArrayCharacterStream.php | 291 + .../CharacterStream/NgCharacterStream.php | 262 + .../lib/classes/Swift/ConfigurableSpool.php | 63 + .../lib/classes/Swift/DependencyContainer.php | 387 + .../lib/classes/Swift/DependencyException.php | 27 + .../lib/classes/Swift/EmbeddedFile.php | 53 + .../swiftmailer/lib/classes/Swift/Encoder.php | 28 + .../classes/Swift/Encoder/Base64Encoder.php | 58 + .../lib/classes/Swift/Encoder/QpEncoder.php | 300 + .../classes/Swift/Encoder/Rfc2231Encoder.php | 90 + .../lib/classes/Swift/Events/CommandEvent.php | 64 + .../classes/Swift/Events/CommandListener.php | 22 + .../lib/classes/Swift/Events/Event.php | 38 + .../classes/Swift/Events/EventDispatcher.php | 70 + .../classes/Swift/Events/EventListener.php | 18 + .../lib/classes/Swift/Events/EventObject.php | 61 + .../classes/Swift/Events/ResponseEvent.php | 64 + .../classes/Swift/Events/ResponseListener.php | 22 + .../lib/classes/Swift/Events/SendEvent.php | 126 + .../lib/classes/Swift/Events/SendListener.php | 27 + .../Swift/Events/SimpleEventDispatcher.php | 142 + .../Swift/Events/TransportChangeEvent.php | 27 + .../Swift/Events/TransportChangeListener.php | 37 + .../Swift/Events/TransportExceptionEvent.php | 43 + .../Events/TransportExceptionListener.php | 22 + .../lib/classes/Swift/FailoverTransport.php | 33 + .../lib/classes/Swift/FileSpool.php | 208 + .../lib/classes/Swift/FileStream.php | 24 + .../lib/classes/Swift/Filterable.php | 31 + .../lib/classes/Swift/IdGenerator.php | 22 + .../swiftmailer/lib/classes/Swift/Image.php | 43 + .../lib/classes/Swift/InputByteStream.php | 75 + .../lib/classes/Swift/IoException.php | 28 + .../lib/classes/Swift/KeyCache.php | 104 + .../classes/Swift/KeyCache/ArrayKeyCache.php | 197 + .../classes/Swift/KeyCache/DiskKeyCache.php | 294 + .../Swift/KeyCache/KeyCacheInputStream.php | 47 + .../classes/Swift/KeyCache/NullKeyCache.php | 113 + .../KeyCache/SimpleKeyCacheInputStream.php | 123 + .../classes/Swift/LoadBalancedTransport.php | 33 + .../swiftmailer/lib/classes/Swift/Mailer.php | 98 + .../Swift/Mailer/ArrayRecipientIterator.php | 53 + .../Swift/Mailer/RecipientIterator.php | 32 + .../lib/classes/Swift/MemorySpool.php | 110 + .../swiftmailer/lib/classes/Swift/Message.php | 279 + .../lib/classes/Swift/Mime/Attachment.php | 144 + .../classes/Swift/Mime/CharsetObserver.php | 24 + .../lib/classes/Swift/Mime/ContentEncoder.php | 34 + .../ContentEncoder/Base64ContentEncoder.php | 101 + .../ContentEncoder/NativeQpContentEncoder.php | 121 + .../ContentEncoder/NullContentEncoder.php | 79 + .../ContentEncoder/PlainContentEncoder.php | 164 + .../Mime/ContentEncoder/QpContentEncoder.php | 134 + .../ContentEncoder/QpContentEncoderProxy.php | 96 + .../Mime/ContentEncoder/RawContentEncoder.php | 65 + .../lib/classes/Swift/Mime/EmbeddedFile.php | 41 + .../classes/Swift/Mime/EncodingObserver.php | 22 + .../lib/classes/Swift/Mime/Header.php | 93 + .../lib/classes/Swift/Mime/HeaderEncoder.php | 24 + .../HeaderEncoder/Base64HeaderEncoder.php | 55 + .../Mime/HeaderEncoder/QpHeaderEncoder.php | 65 + .../Swift/Mime/Headers/AbstractHeader.php | 486 + .../classes/Swift/Mime/Headers/DateHeader.php | 113 + .../Mime/Headers/IdentificationHeader.php | 189 + .../Swift/Mime/Headers/MailboxHeader.php | 358 + .../Swift/Mime/Headers/OpenDKIMHeader.php | 135 + .../Mime/Headers/ParameterizedHeader.php | 255 + .../classes/Swift/Mime/Headers/PathHeader.php | 153 + .../Swift/Mime/Headers/UnstructuredHeader.php | 109 + .../lib/classes/Swift/Mime/IdGenerator.php | 54 + .../lib/classes/Swift/Mime/MimePart.php | 199 + .../Swift/Mime/SimpleHeaderFactory.php | 195 + .../classes/Swift/Mime/SimpleHeaderSet.php | 399 + .../lib/classes/Swift/Mime/SimpleMessage.php | 642 + .../classes/Swift/Mime/SimpleMimeEntity.php | 826 + .../lib/classes/Swift/MimePart.php | 45 + .../lib/classes/Swift/NullTransport.php | 26 + .../lib/classes/Swift/OutputByteStream.php | 46 + .../classes/Swift/Plugins/AntiFloodPlugin.php | 137 + .../Swift/Plugins/BandwidthMonitorPlugin.php | 154 + .../Swift/Plugins/Decorator/Replacements.php | 31 + .../classes/Swift/Plugins/DecoratorPlugin.php | 200 + .../Swift/Plugins/ImpersonatePlugin.php | 65 + .../lib/classes/Swift/Plugins/Logger.php | 36 + .../classes/Swift/Plugins/LoggerPlugin.php | 126 + .../Swift/Plugins/Loggers/ArrayLogger.php | 72 + .../Swift/Plugins/Loggers/EchoLogger.php | 58 + .../classes/Swift/Plugins/MessageLogger.php | 70 + .../Swift/Plugins/Pop/Pop3Connection.php | 31 + .../Swift/Plugins/Pop/Pop3Exception.php | 27 + .../Swift/Plugins/PopBeforeSmtpPlugin.php | 242 + .../Swift/Plugins/RedirectingPlugin.php | 201 + .../lib/classes/Swift/Plugins/Reporter.php | 31 + .../classes/Swift/Plugins/ReporterPlugin.php | 57 + .../Swift/Plugins/Reporters/HitReporter.php | 58 + .../Swift/Plugins/Reporters/HtmlReporter.php | 38 + .../lib/classes/Swift/Plugins/Sleeper.php | 24 + .../classes/Swift/Plugins/ThrottlerPlugin.php | 196 + .../lib/classes/Swift/Plugins/Timer.php | 24 + .../lib/classes/Swift/Preferences.php | 100 + .../Swift/ReplacementFilterFactory.php | 27 + .../classes/Swift/RfcComplianceException.php | 27 + .../lib/classes/Swift/SendmailTransport.php | 33 + .../swiftmailer/lib/classes/Swift/Signer.php | 19 + .../lib/classes/Swift/Signers/BodySigner.php | 31 + .../lib/classes/Swift/Signers/DKIMSigner.php | 682 + .../classes/Swift/Signers/DomainKeySigner.php | 504 + .../classes/Swift/Signers/HeaderSigner.php | 61 + .../classes/Swift/Signers/OpenDKIMSigner.php | 183 + .../lib/classes/Swift/Signers/SMimeSigner.php | 542 + .../lib/classes/Swift/SmtpTransport.php | 45 + .../swiftmailer/lib/classes/Swift/Spool.php | 53 + .../lib/classes/Swift/SpoolTransport.php | 33 + .../lib/classes/Swift/StreamFilter.php | 35 + .../ByteArrayReplacementFilter.php | 166 + .../StreamFilters/StringReplacementFilter.php | 70 + .../StringReplacementFilterFactory.php | 45 + .../lib/classes/Swift/SwiftException.php | 28 + .../lib/classes/Swift/Transport.php | 76 + .../Swift/Transport/AbstractSmtpTransport.php | 541 + .../Esmtp/Auth/CramMd5Authenticator.php | 75 + .../Esmtp/Auth/LoginAuthenticator.php | 45 + .../Esmtp/Auth/NTLMAuthenticator.php | 681 + .../Esmtp/Auth/PlainAuthenticator.php | 44 + .../Esmtp/Auth/XOAuth2Authenticator.php | 64 + .../Swift/Transport/Esmtp/AuthHandler.php | 268 + .../Swift/Transport/Esmtp/Authenticator.php | 36 + .../Transport/Esmtp/EightBitMimeHandler.php | 113 + .../Swift/Transport/Esmtp/SmtpUtf8Handler.php | 107 + .../classes/Swift/Transport/EsmtpHandler.php | 86 + .../Swift/Transport/EsmtpTransport.php | 446 + .../Swift/Transport/FailoverTransport.php | 103 + .../lib/classes/Swift/Transport/IoBuffer.php | 65 + .../Swift/Transport/LoadBalancedTransport.php | 192 + .../classes/Swift/Transport/NullTransport.php | 98 + .../Swift/Transport/SendmailTransport.php | 158 + .../lib/classes/Swift/Transport/SmtpAgent.php | 36 + .../Swift/Transport/SpoolTransport.php | 120 + .../classes/Swift/Transport/StreamBuffer.php | 319 + .../lib/classes/Swift/TransportException.php | 28 + .../lib/dependency_maps/cache_deps.php | 23 + .../lib/dependency_maps/message_deps.php | 9 + .../lib/dependency_maps/mime_deps.php | 134 + .../lib/dependency_maps/transport_deps.php | 97 + .../swiftmailer/lib/mime_types.php | 1007 ++ .../swiftmailer/lib/preferences.php | 19 + .../swiftmailer/lib/swift_required.php | 22 + .../lib/swiftmailer_generate_mimes_config.php | 182 + vendor/symfony/clock/Clock.php | 89 + vendor/symfony/clock/ClockAwareTrait.php | 38 + vendor/symfony/clock/ClockInterface.php | 24 + vendor/symfony/clock/DatePoint.php | 169 + vendor/symfony/clock/LICENSE | 19 + vendor/symfony/clock/MockClock.php | 98 + vendor/symfony/clock/MonotonicClock.php | 93 + vendor/symfony/clock/NativeClock.php | 67 + vendor/symfony/clock/Resources/now.php | 28 + .../clock/Test/ClockSensitiveTrait.php | 77 + vendor/symfony/clock/composer.json | 34 + vendor/symfony/deprecation-contracts/LICENSE | 19 + .../deprecation-contracts/composer.json | 35 + .../deprecation-contracts/function.php | 27 + .../symfony/http-foundation/AcceptHeader.php | 168 + .../http-foundation/AcceptHeaderItem.php | 177 + .../http-foundation/BinaryFileResponse.php | 418 + vendor/symfony/http-foundation/Cookie.php | 422 + .../Exception/BadRequestException.php | 19 + .../Exception/ConflictingHeadersException.php | 21 + .../Exception/JsonException.php | 21 + .../Exception/RequestExceptionInterface.php | 21 + .../Exception/SessionNotFoundException.php | 27 + .../SuspiciousOperationException.php | 20 + .../ExpressionRequestMatcher.php | 47 + .../File/Exception/AccessDeniedException.php | 25 + .../Exception/CannotWriteFileException.php | 21 + .../File/Exception/ExtensionFileException.php | 21 + .../File/Exception/FileException.php | 21 + .../File/Exception/FileNotFoundException.php | 25 + .../File/Exception/FormSizeFileException.php | 21 + .../File/Exception/IniSizeFileException.php | 21 + .../File/Exception/NoFileException.php | 21 + .../File/Exception/NoTmpDirFileException.php | 21 + .../File/Exception/PartialFileException.php | 21 + .../Exception/UnexpectedTypeException.php | 20 + .../File/Exception/UploadException.php | 21 + vendor/symfony/http-foundation/File/File.php | 152 + .../symfony/http-foundation/File/Stream.php | 31 + .../http-foundation/File/UploadedFile.php | 290 + vendor/symfony/http-foundation/FileBag.php | 140 + vendor/symfony/http-foundation/HeaderBag.php | 295 + .../symfony/http-foundation/HeaderUtils.php | 298 + vendor/symfony/http-foundation/InputBag.php | 113 + vendor/symfony/http-foundation/IpUtils.php | 216 + .../symfony/http-foundation/JsonResponse.php | 221 + vendor/symfony/http-foundation/LICENSE | 19 + .../symfony/http-foundation/ParameterBag.php | 228 + .../AbstractRequestRateLimiter.php | 71 + .../RequestRateLimiterInterface.php | 30 + .../http-foundation/RedirectResponse.php | 110 + vendor/symfony/http-foundation/Request.php | 2187 +++ .../http-foundation/RequestMatcher.php | 196 + .../RequestMatcherInterface.php | 27 + .../symfony/http-foundation/RequestStack.php | 128 + vendor/symfony/http-foundation/Response.php | 1288 ++ .../http-foundation/ResponseHeaderBag.php | 291 + vendor/symfony/http-foundation/ServerBag.php | 99 + .../Session/Attribute/AttributeBag.php | 152 + .../Attribute/AttributeBagInterface.php | 61 + .../Attribute/NamespacedAttributeBag.php | 161 + .../Session/Flash/AutoExpireFlashBag.php | 161 + .../Session/Flash/FlashBag.php | 152 + .../Session/Flash/FlashBagInterface.php | 88 + .../http-foundation/Session/Session.php | 285 + .../Session/SessionBagInterface.php | 46 + .../Session/SessionBagProxy.php | 95 + .../Session/SessionFactory.php | 40 + .../Session/SessionFactoryInterface.php | 20 + .../Session/SessionInterface.php | 166 + .../http-foundation/Session/SessionUtils.php | 59 + .../Handler/AbstractSessionHandler.php | 155 + .../Storage/Handler/IdentityMarshaller.php | 42 + .../Handler/MarshallingSessionHandler.php | 108 + .../Handler/MemcachedSessionHandler.php | 135 + .../Handler/MigratingSessionHandler.php | 139 + .../Storage/Handler/MongoDbSessionHandler.php | 193 + .../Handler/NativeFileSessionHandler.php | 59 + .../Storage/Handler/NullSessionHandler.php | 80 + .../Storage/Handler/PdoSessionHandler.php | 943 ++ .../Storage/Handler/RedisSessionHandler.php | 137 + .../Storage/Handler/SessionHandlerFactory.php | 103 + .../Storage/Handler/StrictSessionHandler.php | 118 + .../Session/Storage/MetadataBag.php | 167 + .../Storage/MockArraySessionStorage.php | 249 + .../Storage/MockFileSessionStorage.php | 160 + .../Storage/MockFileSessionStorageFactory.php | 42 + .../Session/Storage/NativeSessionStorage.php | 507 + .../Storage/NativeSessionStorageFactory.php | 49 + .../Storage/PhpBridgeSessionStorage.php | 64 + .../PhpBridgeSessionStorageFactory.php | 47 + .../Session/Storage/Proxy/AbstractProxy.php | 118 + .../Storage/Proxy/SessionHandlerProxy.php | 111 + .../Session/Storage/ServiceSessionFactory.php | 38 + .../SessionStorageFactoryInterface.php | 25 + .../Storage/SessionStorageInterface.php | 131 + .../http-foundation/StreamedResponse.php | 139 + .../Constraint/RequestAttributeValueSame.php | 55 + .../Constraint/ResponseCookieValueSame.php | 85 + .../Test/Constraint/ResponseFormatSame.php | 71 + .../Test/Constraint/ResponseHasCookie.php | 77 + .../Test/Constraint/ResponseHasHeader.php | 53 + .../Test/Constraint/ResponseHeaderSame.php | 55 + .../Test/Constraint/ResponseIsRedirected.php | 56 + .../Test/Constraint/ResponseIsSuccessful.php | 56 + .../Constraint/ResponseIsUnprocessable.php | 56 + .../Constraint/ResponseStatusCodeSame.php | 63 + vendor/symfony/http-foundation/UrlHelper.php | 118 + vendor/symfony/http-foundation/composer.json | 43 + vendor/symfony/polyfill-ctype/Ctype.php | 232 + vendor/symfony/polyfill-ctype/LICENSE | 19 + vendor/symfony/polyfill-ctype/bootstrap.php | 50 + vendor/symfony/polyfill-ctype/bootstrap80.php | 46 + vendor/symfony/polyfill-ctype/composer.json | 38 + vendor/symfony/polyfill-iconv/Iconv.php | 718 + vendor/symfony/polyfill-iconv/LICENSE | 19 + .../Resources/charset/from.big5.php | 13719 ++++++++++++++++ .../Resources/charset/from.cp037.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp1006.php | Bin 0 -> 3860 bytes .../Resources/charset/from.cp1026.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp424.php | Bin 0 -> 3210 bytes .../Resources/charset/from.cp437.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp500.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp737.php | Bin 0 -> 3834 bytes .../Resources/charset/from.cp775.php | Bin 0 -> 3815 bytes .../Resources/charset/from.cp850.php | Bin 0 -> 3809 bytes .../Resources/charset/from.cp852.php | Bin 0 -> 3808 bytes .../Resources/charset/from.cp855.php | Bin 0 -> 3809 bytes .../Resources/charset/from.cp856.php | Bin 0 -> 3194 bytes .../Resources/charset/from.cp857.php | Bin 0 -> 3763 bytes .../Resources/charset/from.cp860.php | Bin 0 -> 3840 bytes .../Resources/charset/from.cp861.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp862.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp863.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp864.php | Bin 0 -> 3779 bytes .../Resources/charset/from.cp865.php | Bin 0 -> 3841 bytes .../Resources/charset/from.cp866.php | Bin 0 -> 3831 bytes .../Resources/charset/from.cp869.php | Bin 0 -> 3676 bytes .../Resources/charset/from.cp874.php | Bin 0 -> 3410 bytes .../Resources/charset/from.cp875.php | Bin 0 -> 3776 bytes .../Resources/charset/from.cp932.php | Bin 0 -> 134095 bytes .../Resources/charset/from.cp936.php | Bin 0 -> 372283 bytes .../Resources/charset/from.cp949.php | Bin 0 -> 291504 bytes .../Resources/charset/from.cp950.php | Bin 0 -> 231436 bytes .../Resources/charset/from.iso-8859-1.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-10.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-11.php | Bin 0 -> 3746 bytes .../Resources/charset/from.iso-8859-13.php | Bin 0 -> 3783 bytes .../Resources/charset/from.iso-8859-14.php | Bin 0 -> 3801 bytes .../Resources/charset/from.iso-8859-15.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-16.php | Bin 0 -> 3782 bytes .../Resources/charset/from.iso-8859-2.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-3.php | Bin 0 -> 3674 bytes .../Resources/charset/from.iso-8859-4.php | Bin 0 -> 3779 bytes .../Resources/charset/from.iso-8859-5.php | Bin 0 -> 3780 bytes .../Resources/charset/from.iso-8859-6.php | Bin 0 -> 3104 bytes .../Resources/charset/from.iso-8859-7.php | Bin 0 -> 3692 bytes .../Resources/charset/from.iso-8859-8.php | Bin 0 -> 3242 bytes .../Resources/charset/from.iso-8859-9.php | Bin 0 -> 3779 bytes .../Resources/charset/from.koi8-r.php | Bin 0 -> 3835 bytes .../Resources/charset/from.koi8-u.php | Bin 0 -> 3827 bytes .../Resources/charset/from.us-ascii.php | Bin 0 -> 1859 bytes .../Resources/charset/from.windows-1250.php | Bin 0 -> 3721 bytes .../Resources/charset/from.windows-1251.php | Bin 0 -> 3782 bytes .../Resources/charset/from.windows-1252.php | Bin 0 -> 3721 bytes .../Resources/charset/from.windows-1253.php | Bin 0 -> 3542 bytes .../Resources/charset/from.windows-1254.php | Bin 0 -> 3691 bytes .../Resources/charset/from.windows-1255.php | Bin 0 -> 3454 bytes .../Resources/charset/from.windows-1256.php | Bin 0 -> 3800 bytes .../Resources/charset/from.windows-1257.php | Bin 0 -> 3616 bytes .../Resources/charset/from.windows-1258.php | Bin 0 -> 3662 bytes .../Resources/charset/translit.php | 4106 +++++ vendor/symfony/polyfill-iconv/bootstrap.php | 84 + vendor/symfony/polyfill-iconv/bootstrap80.php | 76 + vendor/symfony/polyfill-iconv/composer.json | 38 + vendor/symfony/polyfill-intl-idn/Idn.php | 941 ++ vendor/symfony/polyfill-intl-idn/Info.php | 23 + vendor/symfony/polyfill-intl-idn/LICENSE | 19 + .../Resources/unidata/DisallowedRanges.php | 384 + .../Resources/unidata/Regex.php | 33 + .../Resources/unidata/deviation.php | 8 + .../Resources/unidata/disallowed.php | 2638 +++ .../unidata/disallowed_STD3_mapped.php | 308 + .../unidata/disallowed_STD3_valid.php | 71 + .../Resources/unidata/ignored.php | 273 + .../Resources/unidata/mapped.php | 5778 +++++++ .../Resources/unidata/virama.php | 65 + .../symfony/polyfill-intl-idn/bootstrap.php | 145 + .../symfony/polyfill-intl-idn/bootstrap80.php | 125 + .../symfony/polyfill-intl-idn/composer.json | 40 + .../symfony/polyfill-intl-normalizer/LICENSE | 19 + .../polyfill-intl-normalizer/Normalizer.php | 310 + .../Resources/stubs/Normalizer.php | 17 + .../unidata/canonicalComposition.php | 945 ++ .../unidata/canonicalDecomposition.php | 2065 +++ .../Resources/unidata/combiningClass.php | 876 + .../unidata/compatibilityDecomposition.php | 3695 +++++ .../polyfill-intl-normalizer/bootstrap.php | 23 + .../polyfill-intl-normalizer/bootstrap80.php | 19 + .../polyfill-intl-normalizer/composer.json | 36 + vendor/symfony/polyfill-mbstring/LICENSE | 19 + vendor/symfony/polyfill-mbstring/Mbstring.php | 1045 ++ .../Resources/unidata/caseFolding.php | 119 + .../Resources/unidata/lowerCase.php | 1397 ++ .../Resources/unidata/titleCaseRegexp.php | 5 + .../Resources/unidata/upperCase.php | 1489 ++ .../symfony/polyfill-mbstring/bootstrap.php | 172 + .../symfony/polyfill-mbstring/bootstrap80.php | 167 + .../symfony/polyfill-mbstring/composer.json | 39 + vendor/symfony/polyfill-php80/LICENSE | 19 + vendor/symfony/polyfill-php80/Php80.php | 115 + vendor/symfony/polyfill-php80/PhpToken.php | 106 + .../Resources/stubs/Attribute.php | 31 + .../Resources/stubs/PhpToken.php | 16 + .../Resources/stubs/Stringable.php | 20 + .../Resources/stubs/UnhandledMatchError.php | 16 + .../Resources/stubs/ValueError.php | 16 + vendor/symfony/polyfill-php80/bootstrap.php | 42 + vendor/symfony/polyfill-php80/composer.json | 37 + vendor/symfony/polyfill-php83/LICENSE | 19 + vendor/symfony/polyfill-php83/Php83.php | 197 + .../Resources/stubs/DateError.php | 16 + .../Resources/stubs/DateException.php | 16 + .../stubs/DateInvalidOperationException.php | 16 + .../stubs/DateInvalidTimeZoneException.php | 16 + .../DateMalformedIntervalStringException.php | 16 + .../DateMalformedPeriodStringException.php | 16 + .../stubs/DateMalformedStringException.php | 16 + .../Resources/stubs/DateObjectError.php | 16 + .../Resources/stubs/DateRangeError.php | 16 + .../Resources/stubs/Override.php | 20 + .../Resources/stubs/SQLite3Exception.php | 16 + vendor/symfony/polyfill-php83/bootstrap.php | 50 + vendor/symfony/polyfill-php83/bootstrap81.php | 22 + vendor/symfony/polyfill-php83/composer.json | 33 + vendor/symfony/translation-contracts/LICENSE | 19 + .../LocaleAwareInterface.php | 29 + .../Test/TranslatorTest.php | 401 + .../TranslatableInterface.php | 20 + .../TranslatorInterface.php | 68 + .../translation-contracts/TranslatorTrait.php | 231 + .../translation-contracts/composer.json | 37 + .../Catalogue/AbstractOperation.php | 183 + .../translation/Catalogue/MergeOperation.php | 69 + .../Catalogue/OperationInterface.php | 61 + .../translation/Catalogue/TargetOperation.php | 83 + .../CatalogueMetadataAwareInterface.php | 44 + .../Command/TranslationLintCommand.php | 129 + .../Command/TranslationPullCommand.php | 176 + .../Command/TranslationPushCommand.php | 176 + .../translation/Command/TranslationTrait.php | 77 + .../translation/Command/XliffLintCommand.php | 288 + .../TranslationDataCollector.php | 155 + .../translation/DataCollectorTranslator.php | 139 + .../DataCollectorTranslatorPass.php | 36 + .../LoggingTranslatorPass.php | 59 + .../TranslationDumperPass.php | 35 + .../TranslationExtractorPass.php | 40 + .../DependencyInjection/TranslatorPass.php | 91 + .../TranslatorPathsPass.php | 142 + .../translation/Dumper/CsvFileDumper.php | 54 + .../translation/Dumper/DumperInterface.php | 30 + .../symfony/translation/Dumper/FileDumper.php | 101 + .../translation/Dumper/IcuResFileDumper.php | 95 + .../translation/Dumper/IniFileDumper.php | 39 + .../translation/Dumper/JsonFileDumper.php | 34 + .../translation/Dumper/MoFileDumper.php | 73 + .../translation/Dumper/PhpFileDumper.php | 32 + .../translation/Dumper/PoFileDumper.php | 131 + .../translation/Dumper/QtFileDumper.php | 55 + .../translation/Dumper/XliffFileDumper.php | 227 + .../translation/Dumper/YamlFileDumper.php | 54 + .../Exception/ExceptionInterface.php | 21 + .../Exception/IncompleteDsnException.php | 24 + .../Exception/InvalidArgumentException.php | 21 + .../Exception/InvalidResourceException.php | 21 + .../translation/Exception/LogicException.php | 21 + .../MissingRequiredOptionException.php | 25 + .../Exception/NotFoundResourceException.php | 21 + .../Exception/ProviderException.php | 43 + .../Exception/ProviderExceptionInterface.php | 23 + .../Exception/RuntimeException.php | 21 + .../Exception/UnsupportedSchemeException.php | 58 + .../Extractor/AbstractFileExtractor.php | 61 + .../translation/Extractor/ChainExtractor.php | 51 + .../Extractor/ExtractorInterface.php | 39 + .../translation/Extractor/PhpAstExtractor.php | 85 + .../Extractor/Visitor/AbstractVisitor.php | 135 + .../Extractor/Visitor/ConstraintVisitor.php | 112 + .../Extractor/Visitor/TransMethodVisitor.php | 65 + .../Visitor/TranslatableMessageVisitor.php | 65 + .../translation/Formatter/IntlFormatter.php | 57 + .../Formatter/IntlFormatterInterface.php | 27 + .../Formatter/MessageFormatter.php | 46 + .../Formatter/MessageFormatterInterface.php | 28 + .../translation/IdentityTranslator.php | 26 + vendor/symfony/translation/LICENSE | 19 + .../translation/Loader/ArrayLoader.php | 57 + .../translation/Loader/CsvFileLoader.php | 69 + .../symfony/translation/Loader/FileLoader.php | 57 + .../translation/Loader/IcuDatFileLoader.php | 58 + .../translation/Loader/IcuResFileLoader.php | 86 + .../translation/Loader/IniFileLoader.php | 25 + .../translation/Loader/JsonFileLoader.php | 51 + .../translation/Loader/LoaderInterface.php | 32 + .../translation/Loader/MoFileLoader.php | 138 + .../translation/Loader/PhpFileLoader.php | 35 + .../translation/Loader/PoFileLoader.php | 147 + .../translation/Loader/QtFileLoader.php | 78 + .../translation/Loader/XliffFileLoader.php | 248 + .../translation/Loader/YamlFileLoader.php | 51 + vendor/symfony/translation/LocaleSwitcher.php | 83 + .../symfony/translation/LoggingTranslator.php | 98 + .../symfony/translation/MessageCatalogue.php | 316 + .../translation/MessageCatalogueInterface.php | 122 + .../translation/MetadataAwareInterface.php | 44 + .../Provider/AbstractProviderFactory.php | 37 + vendor/symfony/translation/Provider/Dsn.php | 110 + .../Provider/FilteringProvider.php | 58 + .../translation/Provider/NullProvider.php | 39 + .../Provider/NullProviderFactory.php | 34 + .../Provider/ProviderFactoryInterface.php | 26 + .../Provider/ProviderInterface.php | 30 + .../TranslationProviderCollection.php | 57 + .../TranslationProviderCollectionFactory.php | 54 + .../PseudoLocalizationTranslator.php | 385 + .../translation/Reader/TranslationReader.php | 59 + .../Reader/TranslationReaderInterface.php | 27 + .../Resources/bin/translation-status.php | 274 + .../translation/Resources/data/parents.json | 153 + .../translation/Resources/functions.php | 22 + .../schemas/xliff-core-1.2-transitional.xsd | 2261 +++ .../Resources/schemas/xliff-core-2.0.xsd | 411 + .../translation/Resources/schemas/xml.xsd | 309 + .../Test/AbstractProviderFactoryTestCase.php | 79 + .../Test/IncompleteDsnTestTrait.php | 42 + .../Test/ProviderFactoryTestCase.php | 85 + .../translation/Test/ProviderTestCase.php | 84 + .../translation/TranslatableMessage.php | 60 + vendor/symfony/translation/Translator.php | 483 + vendor/symfony/translation/TranslatorBag.php | 102 + .../translation/TranslatorBagInterface.php | 36 + .../translation/Util/ArrayConverter.php | 142 + .../symfony/translation/Util/XliffUtils.php | 191 + .../translation/Writer/TranslationWriter.php | 71 + .../Writer/TranslationWriterInterface.php | 33 + vendor/symfony/translation/composer.json | 61 + .../symfony/var-dumper/Caster/AmqpCaster.php | 212 + vendor/symfony/var-dumper/Caster/ArgsStub.php | 80 + vendor/symfony/var-dumper/Caster/Caster.php | 175 + .../symfony/var-dumper/Caster/ClassStub.php | 106 + .../symfony/var-dumper/Caster/ConstStub.php | 36 + .../var-dumper/Caster/CutArrayStub.php | 30 + vendor/symfony/var-dumper/Caster/CutStub.php | 64 + .../symfony/var-dumper/Caster/DOMCaster.php | 304 + .../symfony/var-dumper/Caster/DateCaster.php | 129 + .../var-dumper/Caster/DoctrineCaster.php | 62 + vendor/symfony/var-dumper/Caster/DsCaster.php | 70 + .../symfony/var-dumper/Caster/DsPairStub.php | 28 + vendor/symfony/var-dumper/Caster/EnumStub.php | 30 + .../var-dumper/Caster/ExceptionCaster.php | 388 + .../symfony/var-dumper/Caster/FrameStub.php | 30 + .../symfony/var-dumper/Caster/GmpCaster.php | 32 + .../var-dumper/Caster/ImagineCaster.php | 37 + vendor/symfony/var-dumper/Caster/ImgStub.php | 26 + .../symfony/var-dumper/Caster/IntlCaster.php | 172 + vendor/symfony/var-dumper/Caster/LinkStub.php | 108 + .../var-dumper/Caster/MemcachedCaster.php | 81 + .../var-dumper/Caster/MysqliCaster.php | 33 + .../symfony/var-dumper/Caster/PdoCaster.php | 122 + .../symfony/var-dumper/Caster/PgSqlCaster.php | 156 + .../var-dumper/Caster/ProxyManagerCaster.php | 33 + .../symfony/var-dumper/Caster/RedisCaster.php | 152 + .../var-dumper/Caster/ReflectionCaster.php | 405 + .../var-dumper/Caster/ResourceCaster.php | 105 + .../symfony/var-dumper/Caster/SplCaster.php | 245 + .../symfony/var-dumper/Caster/StubCaster.php | 84 + .../var-dumper/Caster/SymfonyCaster.php | 69 + .../symfony/var-dumper/Caster/TraceStub.php | 36 + .../symfony/var-dumper/Caster/UuidCaster.php | 30 + .../var-dumper/Caster/XmlReaderCaster.php | 91 + .../var-dumper/Caster/XmlResourceCaster.php | 63 + .../var-dumper/Cloner/AbstractCloner.php | 377 + .../var-dumper/Cloner/ClonerInterface.php | 27 + vendor/symfony/var-dumper/Cloner/Cursor.php | 43 + vendor/symfony/var-dumper/Cloner/Data.php | 470 + .../var-dumper/Cloner/DumperInterface.php | 56 + vendor/symfony/var-dumper/Cloner/Stub.php | 67 + .../symfony/var-dumper/Cloner/VarCloner.php | 324 + .../Command/Descriptor/CliDescriptor.php | 88 + .../Descriptor/DumpDescriptorInterface.php | 23 + .../Command/Descriptor/HtmlDescriptor.php | 119 + .../var-dumper/Command/ServerDumpCommand.php | 101 + .../var-dumper/Dumper/AbstractDumper.php | 210 + .../symfony/var-dumper/Dumper/CliDumper.php | 655 + .../ContextProvider/CliContextProvider.php | 32 + .../ContextProviderInterface.php | 25 + .../RequestContextProvider.php | 51 + .../ContextProvider/SourceContextProvider.php | 126 + .../Dumper/ContextualizedDumper.php | 43 + .../var-dumper/Dumper/DataDumperInterface.php | 24 + .../symfony/var-dumper/Dumper/HtmlDumper.php | 1004 ++ .../var-dumper/Dumper/ServerDumper.php | 53 + .../Exception/ThrowingCasterException.php | 26 + vendor/symfony/var-dumper/LICENSE | 19 + .../var-dumper/Resources/bin/var-dump-server | 67 + .../Resources/css/htmlDescriptor.css | 130 + .../var-dumper/Resources/functions/dump.php | 43 + .../var-dumper/Resources/js/htmlDescriptor.js | 10 + .../symfony/var-dumper/Server/Connection.php | 95 + .../symfony/var-dumper/Server/DumpServer.php | 107 + .../var-dumper/Test/VarDumperTestTrait.php | 87 + vendor/symfony/var-dumper/VarDumper.php | 66 + vendor/symfony/var-dumper/composer.json | 50 + 4461 files changed, 641349 insertions(+), 10 deletions(-) create mode 100644 vendor/aws/aws-crt-php/CODE_OF_CONDUCT.md create mode 100644 vendor/aws/aws-crt-php/LICENSE create mode 100644 vendor/aws/aws-crt-php/NOTICE create mode 100644 vendor/aws/aws-crt-php/composer.json create mode 100755 vendor/aws/aws-crt-php/format-check.py create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/AwsCredentials.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/CredentialsProvider.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signable.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignatureType.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignedBodyHeaderType.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signing.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningAlgorithm.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningConfigAWS.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningResult.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Auth/StaticCredentialsProvider.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/CRT.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Headers.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Message.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Request.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Response.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/IO/EventLoopGroup.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/IO/InputStream.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Encoding.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Extension.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Log.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/NativeResource.php create mode 100644 vendor/aws/aws-crt-php/src/AWS/CRT/Options.php create mode 100644 vendor/aws/aws-sdk-php/CODE_OF_CONDUCT.md create mode 100644 vendor/aws/aws-sdk-php/CRT_INSTRUCTIONS.md create mode 100644 vendor/aws/aws-sdk-php/LICENSE create mode 100644 vendor/aws/aws-sdk-php/NOTICE create mode 100644 vendor/aws/aws-sdk-php/THIRD-PARTY-LICENSES create mode 100644 vendor/aws/aws-sdk-php/composer.json create mode 100644 vendor/aws/aws-sdk-php/src/AIOps/AIOpsClient.php create mode 100644 vendor/aws/aws-sdk-php/src/AIOps/Exception/AIOpsException.php create mode 100644 vendor/aws/aws-sdk-php/src/ARCRegionSwitch/ARCRegionSwitchClient.php create mode 100644 vendor/aws/aws-sdk-php/src/ARCRegionSwitch/Exception/ARCRegionSwitchException.php create mode 100644 vendor/aws/aws-sdk-php/src/ARCZonalShift/ARCZonalShiftClient.php create mode 100644 vendor/aws/aws-sdk-php/src/ARCZonalShift/Exception/ARCZonalShiftException.php create mode 100644 vendor/aws/aws-sdk-php/src/AbstractConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/AbstractModel.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/ApiProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/DateTimeResult.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/DocModel.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/ListShape.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/MapShape.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Operation.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/AbstractParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/DecodingEventStreamIterator.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/EventParsingIterator.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/Exception/ParserException.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/JsonParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/JsonRpcParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/MetadataParserTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/NonSeekableStreamDecodingEventStreamIterator.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/PayloadParserTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/QueryParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/RestJsonParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/RestXmlParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Parser/XmlParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/Ec2ParamBuilder.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/JsonRpcSerializer.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/QueryParamBuilder.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/QuerySerializer.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/RestJsonSerializer.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/RestSerializer.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/RestXmlSerializer.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Serializer/XmlBody.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Service.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Shape.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/ShapeMap.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/StructureShape.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/SupportedProtocols.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/TimestampShape.php create mode 100644 vendor/aws/aws-sdk-php/src/Api/Validator.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/AccessPointArn.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/AccessPointArnInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/Arn.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/ArnInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/ArnParser.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/Exception/InvalidArnException.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/ObjectLambdaAccessPointArn.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/ResourceTypeAndIdTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/S3/BucketArnInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/S3/MultiRegionAccessPointArn.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsAccessPointArn.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsArnInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsBucketArn.php create mode 100644 vendor/aws/aws-sdk-php/src/Artifact/ArtifactClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Artifact/Exception/ArtifactException.php create mode 100644 vendor/aws/aws-sdk-php/src/AwsClient.php create mode 100644 vendor/aws/aws-sdk-php/src/AwsClientInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/AwsClientTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/CacheInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/CleanRooms/CleanRoomsClient.php create mode 100644 vendor/aws/aws-sdk-php/src/CleanRooms/Exception/CleanRoomsException.php create mode 100644 vendor/aws/aws-sdk-php/src/CleanRoomsML/CleanRoomsMLClient.php create mode 100644 vendor/aws/aws-sdk-php/src/CleanRoomsML/Exception/CleanRoomsMLException.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientResolver.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientSideMonitoring/AbstractMonitoringMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallAttemptMonitoringMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientSideMonitoring/Configuration.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ConfigurationInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientSideMonitoring/Exception/ConfigurationException.php create mode 100644 vendor/aws/aws-sdk-php/src/ClientSideMonitoring/MonitoringMiddlewareInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Command.php create mode 100644 vendor/aws/aws-sdk-php/src/CommandInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/CommandPool.php create mode 100644 vendor/aws/aws-sdk-php/src/ConfigurationProviderInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/AssumeRoleCredentialProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/AssumeRoleWithWebIdentityCredentialProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/CredentialSources.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/Credentials.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/CredentialsInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/CredentialsUtils.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/EcsCredentialProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Credentials/LoginCredentialProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/AbstractCryptoClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/AbstractCryptoClientV2.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/AesDecryptingStream.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/AesEncryptingStream.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/AesGcmDecryptingStream.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/AesGcmEncryptingStream.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/AesStreamInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/AesStreamInterfaceV2.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/Cipher/Cbc.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/Cipher/CipherBuilderTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/Cipher/CipherMethod.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/DecryptionTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/DecryptionTraitV2.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/EncryptionTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/EncryptionTraitV2.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/KmsMaterialsProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/KmsMaterialsProviderV2.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/MaterialsProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/MaterialsProviderInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/MaterialsProviderInterfaceV2.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/MaterialsProviderV2.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/MetadataEnvelope.php create mode 100644 vendor/aws/aws-sdk-php/src/Crypto/MetadataStrategyInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/DSQL/AuthTokenGenerator.php create mode 100644 vendor/aws/aws-sdk-php/src/DSQL/DSQLClient.php create mode 100644 vendor/aws/aws-sdk-php/src/DSQL/Exception/DSQLException.php create mode 100644 vendor/aws/aws-sdk-php/src/Deadline/DeadlineClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Deadline/Exception/DeadlineException.php create mode 100644 vendor/aws/aws-sdk-php/src/DefaultsMode/Configuration.php create mode 100644 vendor/aws/aws-sdk-php/src/DefaultsMode/ConfigurationInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/DefaultsMode/ConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/DefaultsMode/Exception/ConfigurationException.php create mode 100644 vendor/aws/aws-sdk-php/src/DoctrineCacheAdapter.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/EndpointProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/Partition.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/PartitionEndpointProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/PartitionInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/PatternEndpointProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Configuration.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/ConfigurationInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/ConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Exception/ConfigurationException.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/Configuration.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/ConfigurationInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/ConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/Exception/ConfigurationException.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointDiscovery/Configuration.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointDiscovery/ConfigurationInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointDiscovery/ConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointDiscovery/EndpointDiscoveryMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointDiscovery/EndpointList.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointDiscovery/Exception/ConfigurationException.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointParameterMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/EndpointDefinitionProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/EndpointProviderV2.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/EndpointV2Middleware.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/EndpointV2SerializerTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Rule/AbstractRule.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Rule/EndpointRule.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Rule/ErrorRule.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Rule/RuleCreator.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Rule/TreeRule.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/Ruleset.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetEndpoint.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetParameter.php create mode 100644 vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetStandardLibrary.php create mode 100644 vendor/aws/aws-sdk-php/src/EntityResolution/EntityResolutionClient.php create mode 100644 vendor/aws/aws-sdk-php/src/EntityResolution/Exception/EntityResolutionException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/AwsException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/CommonRuntimeException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/CouldNotCreateChecksumException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/CredentialsException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/CryptoException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/CryptoPolyfillException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/EventStreamDataException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/IncalculablePayloadException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/InvalidJsonException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/InvalidRegionException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/MultipartUploadException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/TokenException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/UnresolvedApiException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/UnresolvedEndpointException.php create mode 100644 vendor/aws/aws-sdk-php/src/Exception/UnresolvedSignatureException.php create mode 100644 vendor/aws/aws-sdk-php/src/Handler/Guzzle/GuzzleHandler.php create mode 100644 vendor/aws/aws-sdk-php/src/Handler/GuzzleV6/GuzzleHandler.php create mode 100644 vendor/aws/aws-sdk-php/src/HandlerList.php create mode 100644 vendor/aws/aws-sdk-php/src/HasDataTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/HasMonitoringEventsTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/HashInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/HashingStream.php create mode 100644 vendor/aws/aws-sdk-php/src/History.php create mode 100644 vendor/aws/aws-sdk-php/src/IdempotencyTokenMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/InputValidationMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/JsonCompiler.php create mode 100644 vendor/aws/aws-sdk-php/src/LruArrayCache.php create mode 100644 vendor/aws/aws-sdk-php/src/MetricsBuilder.php create mode 100644 vendor/aws/aws-sdk-php/src/Middleware.php create mode 100644 vendor/aws/aws-sdk-php/src/MockHandler.php create mode 100644 vendor/aws/aws-sdk-php/src/MonitoringEventsInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/MultiRegionClient.php create mode 100644 vendor/aws/aws-sdk-php/src/PhpHash.php create mode 100644 vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/Psr16CacheAdapter.php create mode 100644 vendor/aws/aws-sdk-php/src/PsrCacheAdapter.php create mode 100644 vendor/aws/aws-sdk-php/src/QueryCompatibleInputMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/RTBFabric/Exception/RTBFabricException.php create mode 100644 vendor/aws/aws-sdk-php/src/RTBFabric/RTBFabricClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Repostspace/Exception/RepostspaceException.php create mode 100644 vendor/aws/aws-sdk-php/src/Repostspace/RepostspaceClient.php create mode 100644 vendor/aws/aws-sdk-php/src/RequestCompressionMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/ResponseContainerInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Result.php create mode 100644 vendor/aws/aws-sdk-php/src/ResultInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/ResultPaginator.php create mode 100644 vendor/aws/aws-sdk-php/src/Retry/Configuration.php create mode 100644 vendor/aws/aws-sdk-php/src/Retry/ConfigurationInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Retry/ConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Retry/Exception/ConfigurationException.php create mode 100644 vendor/aws/aws-sdk-php/src/Retry/QuotaManager.php create mode 100644 vendor/aws/aws-sdk-php/src/Retry/RateLimiter.php create mode 100644 vendor/aws/aws-sdk-php/src/Retry/RetryHelperTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/RetryMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/RetryMiddlewareV2.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/AmbiguousSuccessParser.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/BatchDelete.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/BucketEndpointArnMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/CalculatesChecksumTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/CryptoParamsTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/CryptoParamsTraitV2.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/HeadersMetadataStrategy.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/InstructionFileMetadataStrategy.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionClient.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionClientV2.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionMultipartUploader.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionMultipartUploaderV2.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Crypto/UserAgentTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/EndpointRegionHelperTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Exception/DeleteMultipleObjectsException.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Exception/PermanentRedirectException.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Exception/S3Exception.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Exception/S3MultipartUploadException.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/ExpiresParsingMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/GetBucketLocationParser.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/MultipartCopy.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/MultipartUploader.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/MultipartUploadingTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/ObjectCopier.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/ObjectUploader.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Parser/GetBucketLocationResultMutator.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Parser/S3Parser.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Parser/S3ResultMutator.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Parser/ValidateResponseChecksumResultMutator.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/PermanentRedirectMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/PostObject.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/PostObjectV4.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/PutObjectUrlMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/Configuration.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/ConfigurationInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/ConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/Exception/ConfigurationException.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/RetryableMalformedResponseParser.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/S3Client.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/S3ClientInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/S3ClientTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/S3EndpointMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/S3MultiRegionClient.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/S3UriParser.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/SSECMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/Transfer.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/UseArnRegion/Configuration.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/UseArnRegion/ConfigurationInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/UseArnRegion/ConfigurationProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/UseArnRegion/Exception/ConfigurationException.php create mode 100644 vendor/aws/aws-sdk-php/src/S3/ValidateResponseChecksumParser.php create mode 100644 vendor/aws/aws-sdk-php/src/S3Tables/Exception/S3TablesException.php create mode 100644 vendor/aws/aws-sdk-php/src/S3Tables/S3TablesClient.php create mode 100644 vendor/aws/aws-sdk-php/src/S3Vectors/Exception/S3VectorsException.php create mode 100644 vendor/aws/aws-sdk-php/src/S3Vectors/S3VectorsClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Sdk.php create mode 100644 vendor/aws/aws-sdk-php/src/Signature/AnonymousSignature.php create mode 100644 vendor/aws/aws-sdk-php/src/Signature/DpopSignature.php create mode 100644 vendor/aws/aws-sdk-php/src/Signature/S3ExpressSignature.php create mode 100644 vendor/aws/aws-sdk-php/src/Signature/S3SignatureV4.php create mode 100644 vendor/aws/aws-sdk-php/src/Signature/SignatureInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Signature/SignatureProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Signature/SignatureTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Signature/SignatureV4.php create mode 100644 vendor/aws/aws-sdk-php/src/Signin/Exception/SigninException.php create mode 100644 vendor/aws/aws-sdk-php/src/Signin/SigninClient.php create mode 100644 vendor/aws/aws-sdk-php/src/SimSpaceWeaver/Exception/SimSpaceWeaverException.php create mode 100644 vendor/aws/aws-sdk-php/src/SimSpaceWeaver/SimSpaceWeaverClient.php create mode 100644 vendor/aws/aws-sdk-php/src/SocialMessaging/Exception/SocialMessagingException.php create mode 100644 vendor/aws/aws-sdk-php/src/SocialMessaging/SocialMessagingClient.php create mode 100644 vendor/aws/aws-sdk-php/src/StreamRequestPayloadMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/TaxSettings/Exception/TaxSettingsException.php create mode 100644 vendor/aws/aws-sdk-php/src/TaxSettings/TaxSettingsClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Textract/Exception/TextractException.php create mode 100644 vendor/aws/aws-sdk-php/src/Textract/TextractClient.php create mode 100644 vendor/aws/aws-sdk-php/src/TimestreamInfluxDB/Exception/TimestreamInfluxDBException.php create mode 100644 vendor/aws/aws-sdk-php/src/TimestreamInfluxDB/TimestreamInfluxDBClient.php create mode 100644 vendor/aws/aws-sdk-php/src/TimestreamQuery/Exception/TimestreamQueryException.php create mode 100644 vendor/aws/aws-sdk-php/src/TimestreamQuery/TimestreamQueryClient.php create mode 100644 vendor/aws/aws-sdk-php/src/TimestreamWrite/Exception/TimestreamWriteException.php create mode 100644 vendor/aws/aws-sdk-php/src/TimestreamWrite/TimestreamWriteClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Tnb/Exception/TnbException.php create mode 100644 vendor/aws/aws-sdk-php/src/Tnb/TnbClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/BearerTokenAuthorization.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/BedrockTokenProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/ParsesIniTrait.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/RefreshableTokenProviderInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/SsoToken.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/SsoTokenProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/Token.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/TokenAuthorization.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/TokenInterface.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/TokenProvider.php create mode 100644 vendor/aws/aws-sdk-php/src/Token/TokenSource.php create mode 100644 vendor/aws/aws-sdk-php/src/TraceMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/TranscribeService/Exception/TranscribeServiceException.php create mode 100644 vendor/aws/aws-sdk-php/src/TranscribeService/TranscribeServiceClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Transfer/Exception/TransferException.php create mode 100644 vendor/aws/aws-sdk-php/src/Transfer/TransferClient.php create mode 100644 vendor/aws/aws-sdk-php/src/Translate/Exception/TranslateException.php create mode 100644 vendor/aws/aws-sdk-php/src/Translate/TranslateClient.php create mode 100644 vendor/aws/aws-sdk-php/src/TrustedAdvisor/Exception/TrustedAdvisorException.php create mode 100644 vendor/aws/aws-sdk-php/src/TrustedAdvisor/TrustedAdvisorClient.php create mode 100644 vendor/aws/aws-sdk-php/src/UserAgentMiddleware.php create mode 100644 vendor/aws/aws-sdk-php/src/Waiter.php create mode 100644 vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php create mode 100644 vendor/aws/aws-sdk-php/src/data/aliases.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/endpoints.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/endpoints_prefix_history.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/grandfathered-services.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/manifest.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/partitions.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/api-2.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/endpoint-rule-set-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/paginators-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/smoke.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-2.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/api-2.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/endpoint-rule-set-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/paginators-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/smoke.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/waiters-2.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/api-2.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/endpoint-rule-set-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/paginators-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/smoke.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/waiters-2.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/sdk-default-configuration.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/api-2.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/endpoint-rule-set-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/paginators-1.json.php create mode 100644 vendor/aws/aws-sdk-php/src/functions.php create mode 100755 vendor/bin/carbon create mode 100755 vendor/bin/jp.php create mode 100755 vendor/bin/var-dump-server create mode 100644 vendor/brunodebarros/fix-php-post-input/FixPhpPostInput.php create mode 100644 vendor/brunodebarros/fix-php-post-input/LICENSE.md create mode 100644 vendor/brunodebarros/fix-php-post-input/bootstrap.php create mode 100644 vendor/brunodebarros/fix-php-post-input/composer.json create mode 100644 vendor/brunodebarros/fix-php-post-input/composer.lock create mode 100644 vendor/carbonphp/carbon-doctrine-types/LICENSE create mode 100644 vendor/carbonphp/carbon-doctrine-types/composer.json create mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php create mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php create mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php create mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php create mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php create mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php create mode 100644 vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php create mode 100644 vendor/clue/stream-filter/.github/FUNDING.yml create mode 100644 vendor/clue/stream-filter/LICENSE create mode 100644 vendor/clue/stream-filter/composer.json create mode 100644 vendor/clue/stream-filter/src/CallbackFilter.php create mode 100644 vendor/clue/stream-filter/src/functions.php create mode 100644 vendor/clue/stream-filter/src/functions_include.php create mode 100644 vendor/composer/ca-bundle/LICENSE create mode 100644 vendor/composer/ca-bundle/composer.json create mode 100644 vendor/composer/ca-bundle/res/cacert.pem create mode 100644 vendor/composer/ca-bundle/src/CaBundle.php create mode 100644 vendor/doctrine/deprecations/LICENSE create mode 100644 vendor/doctrine/deprecations/composer.json create mode 100644 vendor/doctrine/deprecations/src/Deprecation.php create mode 100644 vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php create mode 100644 vendor/doctrine/lexer/LICENSE create mode 100644 vendor/doctrine/lexer/UPGRADE.md create mode 100644 vendor/doctrine/lexer/composer.json create mode 100644 vendor/doctrine/lexer/src/AbstractLexer.php create mode 100644 vendor/doctrine/lexer/src/Token.php create mode 100644 vendor/egulias/email-validator/LICENSE create mode 100644 vendor/egulias/email-validator/composer.json create mode 100644 vendor/egulias/email-validator/src/EmailLexer.php create mode 100644 vendor/egulias/email-validator/src/EmailParser.php create mode 100644 vendor/egulias/email-validator/src/EmailValidator.php create mode 100644 vendor/egulias/email-validator/src/MessageIDParser.php create mode 100644 vendor/egulias/email-validator/src/Parser.php create mode 100644 vendor/egulias/email-validator/src/Parser/Comment.php create mode 100644 vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php create mode 100644 vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php create mode 100644 vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php create mode 100644 vendor/egulias/email-validator/src/Parser/DomainLiteral.php create mode 100644 vendor/egulias/email-validator/src/Parser/DomainPart.php create mode 100644 vendor/egulias/email-validator/src/Parser/DoubleQuote.php create mode 100644 vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php create mode 100644 vendor/egulias/email-validator/src/Parser/IDLeftPart.php create mode 100644 vendor/egulias/email-validator/src/Parser/IDRightPart.php create mode 100644 vendor/egulias/email-validator/src/Parser/LocalPart.php create mode 100644 vendor/egulias/email-validator/src/Parser/PartParser.php create mode 100644 vendor/egulias/email-validator/src/Result/InvalidEmail.php create mode 100644 vendor/egulias/email-validator/src/Result/MultipleErrors.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/CRLFX2.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/CRNoLF.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/DomainHyphened.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/DomainTooLong.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/DotAtEnd.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/DotAtStart.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/EmptyReason.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/LabelTooLong.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/NoDomainPart.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/NoLocalPart.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/RFCWarnings.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/Reason.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/SpoofEmail.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/UnclosedComment.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php create mode 100644 vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php create mode 100644 vendor/egulias/email-validator/src/Result/Result.php create mode 100644 vendor/egulias/email-validator/src/Result/SpoofEmail.php create mode 100644 vendor/egulias/email-validator/src/Result/ValidEmail.php create mode 100644 vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php create mode 100644 vendor/egulias/email-validator/src/Validation/DNSRecords.php create mode 100644 vendor/egulias/email-validator/src/Validation/EmailValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php create mode 100644 vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/MessageIDValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php create mode 100644 vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php create mode 100644 vendor/egulias/email-validator/src/Validation/RFCValidation.php create mode 100644 vendor/egulias/email-validator/src/Warning/AddressLiteral.php create mode 100644 vendor/egulias/email-validator/src/Warning/CFWSNearAt.php create mode 100644 vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php create mode 100644 vendor/egulias/email-validator/src/Warning/Comment.php create mode 100644 vendor/egulias/email-validator/src/Warning/DeprecatedComment.php create mode 100644 vendor/egulias/email-validator/src/Warning/DomainLiteral.php create mode 100644 vendor/egulias/email-validator/src/Warning/EmailTooLong.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6BadChar.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php create mode 100644 vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php create mode 100644 vendor/egulias/email-validator/src/Warning/LocalTooLong.php create mode 100644 vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php create mode 100644 vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php create mode 100644 vendor/egulias/email-validator/src/Warning/QuotedPart.php create mode 100644 vendor/egulias/email-validator/src/Warning/QuotedString.php create mode 100644 vendor/egulias/email-validator/src/Warning/TLD.php create mode 100644 vendor/egulias/email-validator/src/Warning/Warning.php create mode 100644 vendor/erusev/parsedown/.github/workflows/unit-tests.yaml create mode 100644 vendor/erusev/parsedown/LICENSE.txt create mode 100644 vendor/erusev/parsedown/Parsedown.php create mode 100644 vendor/erusev/parsedown/composer.json create mode 100644 vendor/ezyang/htmlpurifier/LICENSE create mode 100644 vendor/ezyang/htmlpurifier/composer.json create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload-legacy.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ratio.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowParseManyTags.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveBlanks.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Forms.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSymbols.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeHosts.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php create mode 100644 vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php create mode 100644 vendor/firebase/php-jwt/LICENSE create mode 100644 vendor/firebase/php-jwt/composer.json create mode 100644 vendor/firebase/php-jwt/src/BeforeValidException.php create mode 100644 vendor/firebase/php-jwt/src/CachedKeySet.php create mode 100644 vendor/firebase/php-jwt/src/ExpiredException.php create mode 100644 vendor/firebase/php-jwt/src/JWK.php create mode 100644 vendor/firebase/php-jwt/src/JWT.php create mode 100644 vendor/firebase/php-jwt/src/JWTExceptionWithPayloadInterface.php create mode 100644 vendor/firebase/php-jwt/src/Key.php create mode 100644 vendor/firebase/php-jwt/src/SignatureInvalidException.php create mode 100644 vendor/google/apiclient-services/LICENSE create mode 100644 vendor/google/apiclient-services/SECURITY.md create mode 100644 vendor/google/apiclient-services/autoload.php create mode 100644 vendor/google/apiclient-services/composer.json create mode 100644 vendor/google/apiclient-services/src/Gmail.php create mode 100644 vendor/google/apiclient-services/src/Gmail/AutoForwarding.php create mode 100644 vendor/google/apiclient-services/src/Gmail/BatchDeleteMessagesRequest.php create mode 100644 vendor/google/apiclient-services/src/Gmail/BatchModifyMessagesRequest.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ClassificationLabelFieldValue.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ClassificationLabelValue.php create mode 100644 vendor/google/apiclient-services/src/Gmail/CseIdentity.php create mode 100644 vendor/google/apiclient-services/src/Gmail/CseKeyPair.php create mode 100644 vendor/google/apiclient-services/src/Gmail/CsePrivateKeyMetadata.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Delegate.php create mode 100644 vendor/google/apiclient-services/src/Gmail/DisableCseKeyPairRequest.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Draft.php create mode 100644 vendor/google/apiclient-services/src/Gmail/EnableCseKeyPairRequest.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Filter.php create mode 100644 vendor/google/apiclient-services/src/Gmail/FilterAction.php create mode 100644 vendor/google/apiclient-services/src/Gmail/FilterCriteria.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ForwardingAddress.php create mode 100644 vendor/google/apiclient-services/src/Gmail/HardwareKeyMetadata.php create mode 100644 vendor/google/apiclient-services/src/Gmail/History.php create mode 100644 vendor/google/apiclient-services/src/Gmail/HistoryLabelAdded.php create mode 100644 vendor/google/apiclient-services/src/Gmail/HistoryLabelRemoved.php create mode 100644 vendor/google/apiclient-services/src/Gmail/HistoryMessageAdded.php create mode 100644 vendor/google/apiclient-services/src/Gmail/HistoryMessageDeleted.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ImapSettings.php create mode 100644 vendor/google/apiclient-services/src/Gmail/KaclsKeyMetadata.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Label.php create mode 100644 vendor/google/apiclient-services/src/Gmail/LabelColor.php create mode 100644 vendor/google/apiclient-services/src/Gmail/LanguageSettings.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListCseIdentitiesResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListCseKeyPairsResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListDelegatesResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListDraftsResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListFiltersResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListForwardingAddressesResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListHistoryResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListLabelsResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListMessagesResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListSendAsResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListSmimeInfoResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ListThreadsResponse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Message.php create mode 100644 vendor/google/apiclient-services/src/Gmail/MessagePart.php create mode 100644 vendor/google/apiclient-services/src/Gmail/MessagePartBody.php create mode 100644 vendor/google/apiclient-services/src/Gmail/MessagePartHeader.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ModifyMessageRequest.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ModifyThreadRequest.php create mode 100644 vendor/google/apiclient-services/src/Gmail/ObliterateCseKeyPairRequest.php create mode 100644 vendor/google/apiclient-services/src/Gmail/PivKeyMetadata.php create mode 100644 vendor/google/apiclient-services/src/Gmail/PopSettings.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Profile.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/Users.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersDrafts.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersHistory.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersLabels.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersMessages.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersMessagesAttachments.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettings.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettingsCse.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettingsCseIdentities.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettingsCseKeypairs.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettingsDelegates.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettingsFilters.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettingsForwardingAddresses.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettingsSendAs.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersSettingsSendAsSmimeInfo.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Resource/UsersThreads.php create mode 100644 vendor/google/apiclient-services/src/Gmail/SendAs.php create mode 100644 vendor/google/apiclient-services/src/Gmail/SignAndEncryptKeyPairs.php create mode 100644 vendor/google/apiclient-services/src/Gmail/SmimeInfo.php create mode 100644 vendor/google/apiclient-services/src/Gmail/SmtpMsa.php create mode 100644 vendor/google/apiclient-services/src/Gmail/Thread.php create mode 100644 vendor/google/apiclient-services/src/Gmail/VacationSettings.php create mode 100644 vendor/google/apiclient-services/src/Gmail/WatchRequest.php create mode 100644 vendor/google/apiclient-services/src/Gmail/WatchResponse.php create mode 100644 vendor/google/apiclient/LICENSE create mode 100644 vendor/google/apiclient/SECURITY.md create mode 100644 vendor/google/apiclient/composer.json create mode 100644 vendor/google/apiclient/src/AccessToken/Revoke.php create mode 100644 vendor/google/apiclient/src/AccessToken/Verify.php create mode 100644 vendor/google/apiclient/src/AuthHandler/AuthHandlerFactory.php create mode 100644 vendor/google/apiclient/src/AuthHandler/Guzzle6AuthHandler.php create mode 100644 vendor/google/apiclient/src/AuthHandler/Guzzle7AuthHandler.php create mode 100644 vendor/google/apiclient/src/Client.php create mode 100644 vendor/google/apiclient/src/Collection.php create mode 100644 vendor/google/apiclient/src/Exception.php create mode 100644 vendor/google/apiclient/src/Http/Batch.php create mode 100644 vendor/google/apiclient/src/Http/MediaFileUpload.php create mode 100644 vendor/google/apiclient/src/Http/REST.php create mode 100644 vendor/google/apiclient/src/Model.php create mode 100644 vendor/google/apiclient/src/Service.php create mode 100644 vendor/google/apiclient/src/Service/Exception.php create mode 100644 vendor/google/apiclient/src/Service/Resource.php create mode 100644 vendor/google/apiclient/src/Task/Composer.php create mode 100644 vendor/google/apiclient/src/Task/Exception.php create mode 100644 vendor/google/apiclient/src/Task/Retryable.php create mode 100644 vendor/google/apiclient/src/Task/Runner.php create mode 100644 vendor/google/apiclient/src/Utils/UriTemplate.php create mode 100644 vendor/google/apiclient/src/aliases.php create mode 100644 vendor/google/auth/.repo-metadata.json create mode 100644 vendor/google/auth/COPYING create mode 100644 vendor/google/auth/LICENSE create mode 100644 vendor/google/auth/SECURITY.md create mode 100644 vendor/google/auth/composer.json create mode 100644 vendor/google/auth/src/AccessToken.php create mode 100644 vendor/google/auth/src/ApplicationDefaultCredentials.php create mode 100644 vendor/google/auth/src/Cache/FileSystemCacheItemPool.php create mode 100644 vendor/google/auth/src/Cache/InvalidArgumentException.php create mode 100644 vendor/google/auth/src/Cache/MemoryCacheItemPool.php create mode 100644 vendor/google/auth/src/Cache/SysVCacheItemPool.php create mode 100644 vendor/google/auth/src/Cache/TypedItem.php create mode 100644 vendor/google/auth/src/CacheTrait.php create mode 100644 vendor/google/auth/src/CredentialSource/AwsNativeSource.php create mode 100644 vendor/google/auth/src/CredentialSource/ExecutableSource.php create mode 100644 vendor/google/auth/src/CredentialSource/FileSource.php create mode 100644 vendor/google/auth/src/CredentialSource/UrlSource.php create mode 100644 vendor/google/auth/src/Credentials/AppIdentityCredentials.php create mode 100644 vendor/google/auth/src/Credentials/ExternalAccountCredentials.php create mode 100644 vendor/google/auth/src/Credentials/GCECredentials.php create mode 100644 vendor/google/auth/src/Credentials/IAMCredentials.php create mode 100644 vendor/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php create mode 100644 vendor/google/auth/src/Credentials/InsecureCredentials.php create mode 100644 vendor/google/auth/src/Credentials/ServiceAccountCredentials.php create mode 100644 vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php create mode 100644 vendor/google/auth/src/Credentials/UserRefreshCredentials.php create mode 100644 vendor/google/auth/src/CredentialsLoader.php create mode 100644 vendor/google/auth/src/ExecutableHandler/ExecutableHandler.php create mode 100644 vendor/google/auth/src/ExecutableHandler/ExecutableResponseError.php create mode 100644 vendor/google/auth/src/ExternalAccountCredentialSourceInterface.php create mode 100644 vendor/google/auth/src/FetchAuthTokenCache.php create mode 100644 vendor/google/auth/src/FetchAuthTokenInterface.php create mode 100644 vendor/google/auth/src/GCECache.php create mode 100644 vendor/google/auth/src/GetQuotaProjectInterface.php create mode 100644 vendor/google/auth/src/GetUniverseDomainInterface.php create mode 100644 vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php create mode 100644 vendor/google/auth/src/HttpHandler/Guzzle7HttpHandler.php create mode 100644 vendor/google/auth/src/HttpHandler/HttpClientCache.php create mode 100644 vendor/google/auth/src/HttpHandler/HttpHandlerFactory.php create mode 100644 vendor/google/auth/src/Iam.php create mode 100644 vendor/google/auth/src/IamSignerTrait.php create mode 100644 vendor/google/auth/src/Logging/LoggingTrait.php create mode 100644 vendor/google/auth/src/Logging/RpcLogEvent.php create mode 100644 vendor/google/auth/src/Logging/StdOutLogger.php create mode 100644 vendor/google/auth/src/MetricsTrait.php create mode 100644 vendor/google/auth/src/Middleware/AuthTokenMiddleware.php create mode 100644 vendor/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php create mode 100644 vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php create mode 100644 vendor/google/auth/src/Middleware/SimpleMiddleware.php create mode 100644 vendor/google/auth/src/OAuth2.php create mode 100644 vendor/google/auth/src/ProjectIdProviderInterface.php create mode 100644 vendor/google/auth/src/ServiceAccountSignerTrait.php create mode 100644 vendor/google/auth/src/SignBlobInterface.php create mode 100644 vendor/google/auth/src/UpdateMetadataInterface.php create mode 100644 vendor/google/auth/src/UpdateMetadataTrait.php create mode 100644 vendor/guzzlehttp/guzzle/LICENSE create mode 100644 vendor/guzzlehttp/guzzle/composer.json create mode 100644 vendor/guzzlehttp/guzzle/package-lock.json create mode 100644 vendor/guzzlehttp/guzzle/src/BodySummarizer.php create mode 100644 vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Client.php create mode 100644 vendor/guzzlehttp/guzzle/src/ClientInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/ClientTrait.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/HandlerStack.php create mode 100644 vendor/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100644 vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Middleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/Pool.php create mode 100644 vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/RequestOptions.php create mode 100644 vendor/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/TransferStats.php create mode 100644 vendor/guzzlehttp/guzzle/src/Utils.php create mode 100644 vendor/guzzlehttp/guzzle/src/functions.php create mode 100644 vendor/guzzlehttp/guzzle/src/functions_include.php create mode 100644 vendor/guzzlehttp/promises/LICENSE create mode 100644 vendor/guzzlehttp/promises/composer.json create mode 100644 vendor/guzzlehttp/promises/src/AggregateException.php create mode 100644 vendor/guzzlehttp/promises/src/CancellationException.php create mode 100644 vendor/guzzlehttp/promises/src/Coroutine.php create mode 100644 vendor/guzzlehttp/promises/src/Create.php create mode 100644 vendor/guzzlehttp/promises/src/Each.php create mode 100644 vendor/guzzlehttp/promises/src/EachPromise.php create mode 100644 vendor/guzzlehttp/promises/src/FulfilledPromise.php create mode 100644 vendor/guzzlehttp/promises/src/Is.php create mode 100644 vendor/guzzlehttp/promises/src/Promise.php create mode 100644 vendor/guzzlehttp/promises/src/PromiseInterface.php create mode 100644 vendor/guzzlehttp/promises/src/PromisorInterface.php create mode 100644 vendor/guzzlehttp/promises/src/RejectedPromise.php create mode 100644 vendor/guzzlehttp/promises/src/RejectionException.php create mode 100644 vendor/guzzlehttp/promises/src/TaskQueue.php create mode 100644 vendor/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100644 vendor/guzzlehttp/promises/src/Utils.php create mode 100644 vendor/guzzlehttp/psr7/LICENSE create mode 100644 vendor/guzzlehttp/psr7/composer.json create mode 100644 vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100644 vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100644 vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100644 vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php create mode 100644 vendor/guzzlehttp/psr7/src/FnStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Header.php create mode 100644 vendor/guzzlehttp/psr7/src/HttpFactory.php create mode 100644 vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100644 vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100644 vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Message.php create mode 100644 vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100644 vendor/guzzlehttp/psr7/src/MimeType.php create mode 100644 vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100644 vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100644 vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Query.php create mode 100644 vendor/guzzlehttp/psr7/src/Request.php create mode 100644 vendor/guzzlehttp/psr7/src/Response.php create mode 100644 vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100644 vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100644 vendor/guzzlehttp/psr7/src/Stream.php create mode 100644 vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100644 vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100644 vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100644 vendor/guzzlehttp/psr7/src/Uri.php create mode 100644 vendor/guzzlehttp/psr7/src/UriComparator.php create mode 100644 vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100644 vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100644 vendor/guzzlehttp/psr7/src/Utils.php create mode 100644 vendor/html2text/html2text/.github/workflows/ci.yml create mode 100644 vendor/html2text/html2text/composer.json create mode 100644 vendor/html2text/html2text/src/Html2Text.php create mode 100644 vendor/ifsnop/mysqldump-php/LICENSE create mode 100644 vendor/ifsnop/mysqldump-php/composer.json create mode 100644 vendor/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php create mode 100644 vendor/illuminate/collections/Arr.php create mode 100644 vendor/illuminate/collections/Collection.php create mode 100644 vendor/illuminate/collections/Enumerable.php create mode 100644 vendor/illuminate/collections/HigherOrderCollectionProxy.php create mode 100644 vendor/illuminate/collections/HigherOrderWhenProxy.php create mode 100644 vendor/illuminate/collections/ItemNotFoundException.php create mode 100644 vendor/illuminate/collections/LICENSE.md create mode 100644 vendor/illuminate/collections/LazyCollection.php create mode 100644 vendor/illuminate/collections/MultipleItemsFoundException.php create mode 100644 vendor/illuminate/collections/Traits/EnumeratesValues.php create mode 100644 vendor/illuminate/collections/composer.json create mode 100644 vendor/illuminate/collections/helpers.php create mode 100644 vendor/illuminate/contracts/Auth/Access/Authorizable.php create mode 100644 vendor/illuminate/contracts/Auth/Access/Gate.php create mode 100644 vendor/illuminate/contracts/Auth/Authenticatable.php create mode 100644 vendor/illuminate/contracts/Auth/CanResetPassword.php create mode 100644 vendor/illuminate/contracts/Auth/Factory.php create mode 100644 vendor/illuminate/contracts/Auth/Guard.php create mode 100644 vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php create mode 100644 vendor/illuminate/contracts/Auth/MustVerifyEmail.php create mode 100644 vendor/illuminate/contracts/Auth/PasswordBroker.php create mode 100644 vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php create mode 100644 vendor/illuminate/contracts/Auth/StatefulGuard.php create mode 100644 vendor/illuminate/contracts/Auth/SupportsBasicAuth.php create mode 100644 vendor/illuminate/contracts/Auth/UserProvider.php create mode 100644 vendor/illuminate/contracts/Broadcasting/Broadcaster.php create mode 100644 vendor/illuminate/contracts/Broadcasting/Factory.php create mode 100644 vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php create mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php create mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php create mode 100644 vendor/illuminate/contracts/Bus/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Bus/QueueingDispatcher.php create mode 100644 vendor/illuminate/contracts/Cache/Factory.php create mode 100644 vendor/illuminate/contracts/Cache/Lock.php create mode 100644 vendor/illuminate/contracts/Cache/LockProvider.php create mode 100644 vendor/illuminate/contracts/Cache/LockTimeoutException.php create mode 100644 vendor/illuminate/contracts/Cache/Repository.php create mode 100644 vendor/illuminate/contracts/Cache/Store.php create mode 100644 vendor/illuminate/contracts/Config/Repository.php create mode 100644 vendor/illuminate/contracts/Console/Application.php create mode 100644 vendor/illuminate/contracts/Console/Kernel.php create mode 100644 vendor/illuminate/contracts/Container/BindingResolutionException.php create mode 100644 vendor/illuminate/contracts/Container/CircularDependencyException.php create mode 100644 vendor/illuminate/contracts/Container/Container.php create mode 100644 vendor/illuminate/contracts/Container/ContextualBindingBuilder.php create mode 100644 vendor/illuminate/contracts/Cookie/Factory.php create mode 100644 vendor/illuminate/contracts/Cookie/QueueingFactory.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/Castable.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php create mode 100644 vendor/illuminate/contracts/Database/Events/MigrationEvent.php create mode 100644 vendor/illuminate/contracts/Database/ModelIdentifier.php create mode 100644 vendor/illuminate/contracts/Debug/ExceptionHandler.php create mode 100644 vendor/illuminate/contracts/Encryption/DecryptException.php create mode 100644 vendor/illuminate/contracts/Encryption/EncryptException.php create mode 100644 vendor/illuminate/contracts/Encryption/Encrypter.php create mode 100644 vendor/illuminate/contracts/Encryption/StringEncrypter.php create mode 100644 vendor/illuminate/contracts/Events/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Filesystem/Cloud.php create mode 100644 vendor/illuminate/contracts/Filesystem/Factory.php create mode 100644 vendor/illuminate/contracts/Filesystem/FileExistsException.php create mode 100644 vendor/illuminate/contracts/Filesystem/FileNotFoundException.php create mode 100644 vendor/illuminate/contracts/Filesystem/Filesystem.php create mode 100644 vendor/illuminate/contracts/Filesystem/LockTimeoutException.php create mode 100644 vendor/illuminate/contracts/Foundation/Application.php create mode 100644 vendor/illuminate/contracts/Foundation/CachesConfiguration.php create mode 100644 vendor/illuminate/contracts/Foundation/CachesRoutes.php create mode 100644 vendor/illuminate/contracts/Hashing/Hasher.php create mode 100644 vendor/illuminate/contracts/Http/Kernel.php create mode 100644 vendor/illuminate/contracts/LICENSE.md create mode 100644 vendor/illuminate/contracts/Mail/Factory.php create mode 100644 vendor/illuminate/contracts/Mail/MailQueue.php create mode 100644 vendor/illuminate/contracts/Mail/Mailable.php create mode 100644 vendor/illuminate/contracts/Mail/Mailer.php create mode 100644 vendor/illuminate/contracts/Notifications/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Notifications/Factory.php create mode 100644 vendor/illuminate/contracts/Pagination/CursorPaginator.php create mode 100644 vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php create mode 100644 vendor/illuminate/contracts/Pagination/Paginator.php create mode 100644 vendor/illuminate/contracts/Pipeline/Hub.php create mode 100644 vendor/illuminate/contracts/Pipeline/Pipeline.php create mode 100644 vendor/illuminate/contracts/Queue/ClearableQueue.php create mode 100644 vendor/illuminate/contracts/Queue/EntityNotFoundException.php create mode 100644 vendor/illuminate/contracts/Queue/EntityResolver.php create mode 100644 vendor/illuminate/contracts/Queue/Factory.php create mode 100644 vendor/illuminate/contracts/Queue/Job.php create mode 100644 vendor/illuminate/contracts/Queue/Monitor.php create mode 100644 vendor/illuminate/contracts/Queue/Queue.php create mode 100644 vendor/illuminate/contracts/Queue/QueueableCollection.php create mode 100644 vendor/illuminate/contracts/Queue/QueueableEntity.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeUnique.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldQueue.php create mode 100644 vendor/illuminate/contracts/Redis/Connection.php create mode 100644 vendor/illuminate/contracts/Redis/Connector.php create mode 100644 vendor/illuminate/contracts/Redis/Factory.php create mode 100644 vendor/illuminate/contracts/Redis/LimiterTimeoutException.php create mode 100644 vendor/illuminate/contracts/Routing/BindingRegistrar.php create mode 100644 vendor/illuminate/contracts/Routing/Registrar.php create mode 100644 vendor/illuminate/contracts/Routing/ResponseFactory.php create mode 100644 vendor/illuminate/contracts/Routing/UrlGenerator.php create mode 100644 vendor/illuminate/contracts/Routing/UrlRoutable.php create mode 100644 vendor/illuminate/contracts/Session/Session.php create mode 100755 vendor/illuminate/contracts/Support/Arrayable.php create mode 100644 vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php create mode 100644 vendor/illuminate/contracts/Support/DeferrableProvider.php create mode 100644 vendor/illuminate/contracts/Support/DeferringDisplayableValue.php create mode 100644 vendor/illuminate/contracts/Support/Htmlable.php create mode 100755 vendor/illuminate/contracts/Support/Jsonable.php create mode 100644 vendor/illuminate/contracts/Support/MessageBag.php create mode 100755 vendor/illuminate/contracts/Support/MessageProvider.php create mode 100755 vendor/illuminate/contracts/Support/Renderable.php create mode 100644 vendor/illuminate/contracts/Support/Responsable.php create mode 100644 vendor/illuminate/contracts/Support/ValidatedData.php create mode 100644 vendor/illuminate/contracts/Translation/HasLocalePreference.php create mode 100755 vendor/illuminate/contracts/Translation/Loader.php create mode 100644 vendor/illuminate/contracts/Translation/Translator.php create mode 100644 vendor/illuminate/contracts/Validation/DataAwareRule.php create mode 100644 vendor/illuminate/contracts/Validation/Factory.php create mode 100644 vendor/illuminate/contracts/Validation/ImplicitRule.php create mode 100644 vendor/illuminate/contracts/Validation/Rule.php create mode 100644 vendor/illuminate/contracts/Validation/UncompromisedVerifier.php create mode 100644 vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php create mode 100644 vendor/illuminate/contracts/Validation/Validator.php create mode 100644 vendor/illuminate/contracts/Validation/ValidatorAwareRule.php create mode 100755 vendor/illuminate/contracts/View/Engine.php create mode 100644 vendor/illuminate/contracts/View/Factory.php create mode 100644 vendor/illuminate/contracts/View/View.php create mode 100644 vendor/illuminate/contracts/composer.json create mode 100644 vendor/illuminate/macroable/LICENSE.md create mode 100644 vendor/illuminate/macroable/Traits/Macroable.php create mode 100644 vendor/illuminate/macroable/composer.json create mode 100644 vendor/jakeasmith/http_build_url/LICENSE create mode 100644 vendor/jakeasmith/http_build_url/composer.json create mode 100644 vendor/jakeasmith/http_build_url/readme.md create mode 100644 vendor/jakeasmith/http_build_url/src/http_build_url.php create mode 100644 vendor/league/csv/LICENSE create mode 100644 vendor/league/csv/autoload.php create mode 100644 vendor/league/csv/composer.json create mode 100644 vendor/league/csv/phpstan-build.neon create mode 100644 vendor/league/csv/src/AbstractCsv.php create mode 100644 vendor/league/csv/src/Bom.php create mode 100644 vendor/league/csv/src/Buffer.php create mode 100644 vendor/league/csv/src/ByteSequence.php create mode 100644 vendor/league/csv/src/CallbackStreamFilter.php create mode 100644 vendor/league/csv/src/CannotInsertRecord.php create mode 100644 vendor/league/csv/src/CharsetConverter.php create mode 100644 vendor/league/csv/src/ColumnConsistency.php create mode 100644 vendor/league/csv/src/EncloseField.php create mode 100644 vendor/league/csv/src/EscapeFormula.php create mode 100644 vendor/league/csv/src/Exception.php create mode 100644 vendor/league/csv/src/FragmentFinder.php create mode 100644 vendor/league/csv/src/FragmentNotFound.php create mode 100644 vendor/league/csv/src/HTMLConverter.php create mode 100644 vendor/league/csv/src/HttpHeaders.php create mode 100644 vendor/league/csv/src/Info.php create mode 100644 vendor/league/csv/src/InvalidArgument.php create mode 100644 vendor/league/csv/src/JsonConverter.php create mode 100644 vendor/league/csv/src/JsonFormat.php create mode 100644 vendor/league/csv/src/MapIterator.php create mode 100644 vendor/league/csv/src/Query/Constraint/Column.php create mode 100644 vendor/league/csv/src/Query/Constraint/Comparison.php create mode 100644 vendor/league/csv/src/Query/Constraint/Criteria.php create mode 100644 vendor/league/csv/src/Query/Constraint/Offset.php create mode 100644 vendor/league/csv/src/Query/Constraint/TwoColumns.php create mode 100644 vendor/league/csv/src/Query/Limit.php create mode 100644 vendor/league/csv/src/Query/Ordering/Column.php create mode 100644 vendor/league/csv/src/Query/Ordering/MultiSort.php create mode 100644 vendor/league/csv/src/Query/Predicate.php create mode 100644 vendor/league/csv/src/Query/PredicateCombinator.php create mode 100644 vendor/league/csv/src/Query/QueryException.php create mode 100644 vendor/league/csv/src/Query/Row.php create mode 100644 vendor/league/csv/src/Query/Sort.php create mode 100644 vendor/league/csv/src/Query/SortCombinator.php create mode 100644 vendor/league/csv/src/RFC4180Field.php create mode 100644 vendor/league/csv/src/RdbmsResult.php create mode 100644 vendor/league/csv/src/Reader.php create mode 100644 vendor/league/csv/src/ResultSet.php create mode 100644 vendor/league/csv/src/Serializer/AfterMapping.php create mode 100644 vendor/league/csv/src/Serializer/ArrayShape.php create mode 100644 vendor/league/csv/src/Serializer/CallbackCasting.php create mode 100644 vendor/league/csv/src/Serializer/CastToArray.php create mode 100644 vendor/league/csv/src/Serializer/CastToBool.php create mode 100644 vendor/league/csv/src/Serializer/CastToDate.php create mode 100644 vendor/league/csv/src/Serializer/CastToEnum.php create mode 100644 vendor/league/csv/src/Serializer/CastToFloat.php create mode 100644 vendor/league/csv/src/Serializer/CastToInt.php create mode 100644 vendor/league/csv/src/Serializer/CastToString.php create mode 100644 vendor/league/csv/src/Serializer/DenormalizationFailed.php create mode 100644 vendor/league/csv/src/Serializer/Denormalizer.php create mode 100644 vendor/league/csv/src/Serializer/MapCell.php create mode 100644 vendor/league/csv/src/Serializer/MapRecord.php create mode 100644 vendor/league/csv/src/Serializer/MappingFailed.php create mode 100644 vendor/league/csv/src/Serializer/PropertySetter.php create mode 100644 vendor/league/csv/src/Serializer/SerializationFailed.php create mode 100644 vendor/league/csv/src/Serializer/Type.php create mode 100644 vendor/league/csv/src/Serializer/TypeCasting.php create mode 100644 vendor/league/csv/src/Serializer/TypeCastingFailed.php create mode 100644 vendor/league/csv/src/Serializer/TypeCastingInfo.php create mode 100644 vendor/league/csv/src/Serializer/TypeCastingTargetType.php create mode 100644 vendor/league/csv/src/Statement.php create mode 100644 vendor/league/csv/src/Stream.php create mode 100644 vendor/league/csv/src/StreamFilter.php create mode 100644 vendor/league/csv/src/SwapDelimiter.php create mode 100644 vendor/league/csv/src/SyntaxError.php create mode 100644 vendor/league/csv/src/TabularData.php create mode 100644 vendor/league/csv/src/TabularDataProvider.php create mode 100644 vendor/league/csv/src/TabularDataReader.php create mode 100644 vendor/league/csv/src/TabularDataWriter.php create mode 100644 vendor/league/csv/src/UnableToProcessCsv.php create mode 100644 vendor/league/csv/src/UnavailableFeature.php create mode 100644 vendor/league/csv/src/UnavailableStream.php create mode 100644 vendor/league/csv/src/Warning.php create mode 100644 vendor/league/csv/src/Writer.php create mode 100644 vendor/league/csv/src/XMLConverter.php create mode 100644 vendor/league/csv/src/functions.php create mode 100644 vendor/league/csv/src/functions_include.php create mode 100644 vendor/league/event/LICENSE create mode 100644 vendor/league/event/composer.json create mode 100644 vendor/league/event/src/AbstractEvent.php create mode 100644 vendor/league/event/src/AbstractListener.php create mode 100644 vendor/league/event/src/BufferedEmitter.php create mode 100644 vendor/league/event/src/CallbackListener.php create mode 100644 vendor/league/event/src/Emitter.php create mode 100644 vendor/league/event/src/EmitterAwareInterface.php create mode 100644 vendor/league/event/src/EmitterAwareTrait.php create mode 100644 vendor/league/event/src/EmitterInterface.php create mode 100644 vendor/league/event/src/EmitterTrait.php create mode 100644 vendor/league/event/src/Event.php create mode 100644 vendor/league/event/src/EventInterface.php create mode 100644 vendor/league/event/src/Generator.php create mode 100644 vendor/league/event/src/GeneratorInterface.php create mode 100644 vendor/league/event/src/GeneratorTrait.php create mode 100644 vendor/league/event/src/ListenerAcceptor.php create mode 100644 vendor/league/event/src/ListenerAcceptorInterface.php create mode 100644 vendor/league/event/src/ListenerInterface.php create mode 100644 vendor/league/event/src/ListenerProviderInterface.php create mode 100644 vendor/league/event/src/OneTimeListener.php create mode 100644 vendor/league/flysystem-aws-s3-v3/LICENSE create mode 100644 vendor/league/flysystem-aws-s3-v3/changelog.md create mode 100644 vendor/league/flysystem-aws-s3-v3/composer.json create mode 100644 vendor/league/flysystem-aws-s3-v3/src/AwsS3Adapter.php create mode 100644 vendor/league/flysystem/CODE_OF_CONDUCT.md create mode 100644 vendor/league/flysystem/LICENSE create mode 100644 vendor/league/flysystem/SECURITY.md create mode 100644 vendor/league/flysystem/composer.json create mode 100644 vendor/league/flysystem/deprecations.md create mode 100644 vendor/league/flysystem/src/Adapter/AbstractAdapter.php create mode 100644 vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php create mode 100644 vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php create mode 100644 vendor/league/flysystem/src/Adapter/Ftp.php create mode 100644 vendor/league/flysystem/src/Adapter/Ftpd.php create mode 100644 vendor/league/flysystem/src/Adapter/Local.php create mode 100644 vendor/league/flysystem/src/Adapter/NullAdapter.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/StreamedCopyTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/Polyfill/StreamedWritingTrait.php create mode 100644 vendor/league/flysystem/src/Adapter/SynologyFtp.php create mode 100644 vendor/league/flysystem/src/AdapterInterface.php create mode 100644 vendor/league/flysystem/src/Config.php create mode 100644 vendor/league/flysystem/src/ConfigAwareTrait.php create mode 100644 vendor/league/flysystem/src/ConnectionErrorException.php create mode 100644 vendor/league/flysystem/src/ConnectionRuntimeException.php create mode 100644 vendor/league/flysystem/src/CorruptedPathDetected.php create mode 100644 vendor/league/flysystem/src/Directory.php create mode 100644 vendor/league/flysystem/src/Exception.php create mode 100644 vendor/league/flysystem/src/File.php create mode 100644 vendor/league/flysystem/src/FileExistsException.php create mode 100644 vendor/league/flysystem/src/FileNotFoundException.php create mode 100644 vendor/league/flysystem/src/Filesystem.php create mode 100644 vendor/league/flysystem/src/FilesystemException.php create mode 100644 vendor/league/flysystem/src/FilesystemInterface.php create mode 100644 vendor/league/flysystem/src/FilesystemNotFoundException.php create mode 100644 vendor/league/flysystem/src/Handler.php create mode 100644 vendor/league/flysystem/src/InvalidRootException.php create mode 100644 vendor/league/flysystem/src/MountManager.php create mode 100644 vendor/league/flysystem/src/NotSupportedException.php create mode 100644 vendor/league/flysystem/src/Plugin/AbstractPlugin.php create mode 100644 vendor/league/flysystem/src/Plugin/EmptyDir.php create mode 100644 vendor/league/flysystem/src/Plugin/ForcedCopy.php create mode 100644 vendor/league/flysystem/src/Plugin/ForcedRename.php create mode 100644 vendor/league/flysystem/src/Plugin/GetWithMetadata.php create mode 100644 vendor/league/flysystem/src/Plugin/ListFiles.php create mode 100644 vendor/league/flysystem/src/Plugin/ListPaths.php create mode 100644 vendor/league/flysystem/src/Plugin/ListWith.php create mode 100644 vendor/league/flysystem/src/Plugin/PluggableTrait.php create mode 100644 vendor/league/flysystem/src/Plugin/PluginNotFoundException.php create mode 100644 vendor/league/flysystem/src/PluginInterface.php create mode 100644 vendor/league/flysystem/src/ReadInterface.php create mode 100644 vendor/league/flysystem/src/RootViolationException.php create mode 100644 vendor/league/flysystem/src/SafeStorage.php create mode 100644 vendor/league/flysystem/src/UnreadableFileException.php create mode 100644 vendor/league/flysystem/src/Util.php create mode 100644 vendor/league/flysystem/src/Util/ContentListingFormatter.php create mode 100644 vendor/league/flysystem/src/Util/MimeType.php create mode 100644 vendor/league/flysystem/src/Util/StreamHasher.php create mode 100644 vendor/league/mime-type-detection/LICENSE create mode 100644 vendor/league/mime-type-detection/composer.json create mode 100644 vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php create mode 100644 vendor/league/mime-type-detection/src/ExtensionLookup.php create mode 100644 vendor/league/mime-type-detection/src/ExtensionMimeTypeDetector.php create mode 100644 vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php create mode 100644 vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php create mode 100644 vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php create mode 100644 vendor/league/mime-type-detection/src/MimeTypeDetector.php create mode 100644 vendor/league/mime-type-detection/src/OverridingExtensionToMimeTypeMap.php create mode 100644 vendor/league/oauth2-client/LICENSE create mode 100644 vendor/league/oauth2-client/composer.json create mode 100644 vendor/league/oauth2-client/src/Grant/AbstractGrant.php create mode 100644 vendor/league/oauth2-client/src/Grant/AuthorizationCode.php create mode 100644 vendor/league/oauth2-client/src/Grant/ClientCredentials.php create mode 100644 vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php create mode 100644 vendor/league/oauth2-client/src/Grant/GrantFactory.php create mode 100644 vendor/league/oauth2-client/src/Grant/Password.php create mode 100644 vendor/league/oauth2-client/src/Grant/RefreshToken.php create mode 100644 vendor/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php create mode 100644 vendor/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php create mode 100644 vendor/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php create mode 100644 vendor/league/oauth2-client/src/Provider/AbstractProvider.php create mode 100644 vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php create mode 100644 vendor/league/oauth2-client/src/Provider/GenericProvider.php create mode 100644 vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php create mode 100644 vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php create mode 100644 vendor/league/oauth2-client/src/Token/AccessToken.php create mode 100644 vendor/league/oauth2-client/src/Token/AccessTokenInterface.php create mode 100644 vendor/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php create mode 100644 vendor/league/oauth2-client/src/Token/SettableRefreshTokenInterface.php create mode 100644 vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/GuardedPropertyTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/RequestFactory.php create mode 100644 vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php create mode 100644 vendor/league/oauth2-google/LICENSE create mode 100644 vendor/league/oauth2-google/composer.json create mode 100644 vendor/league/oauth2-google/src/Exception/HostedDomainException.php create mode 100644 vendor/league/oauth2-google/src/Provider/Google.php create mode 100644 vendor/league/oauth2-google/src/Provider/GoogleUser.php create mode 100644 vendor/masterminds/html5/LICENSE.txt create mode 100644 vendor/masterminds/html5/RELEASE.md create mode 100644 vendor/masterminds/html5/bin/entities.php create mode 100644 vendor/masterminds/html5/composer.json create mode 100644 vendor/masterminds/html5/src/HTML5.php create mode 100644 vendor/masterminds/html5/src/HTML5/Elements.php create mode 100644 vendor/masterminds/html5/src/HTML5/Entities.php create mode 100644 vendor/masterminds/html5/src/HTML5/Exception.php create mode 100644 vendor/masterminds/html5/src/HTML5/InstructionProcessor.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/InputStream.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/ParseError.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/Scanner.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php create mode 100644 vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php create mode 100644 vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php create mode 100644 vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php create mode 100644 vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php create mode 100644 vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php create mode 100644 vendor/moneyphp/money/LICENSE create mode 100644 vendor/moneyphp/money/composer.json create mode 100644 vendor/moneyphp/money/resources/currency.php create mode 100644 vendor/moneyphp/money/resources/generate-money-factory.php create mode 100644 vendor/moneyphp/money/src/Calculator.php create mode 100644 vendor/moneyphp/money/src/Calculator/BcMathCalculator.php create mode 100644 vendor/moneyphp/money/src/Calculator/GmpCalculator.php create mode 100644 vendor/moneyphp/money/src/Calculator/PhpCalculator.php create mode 100644 vendor/moneyphp/money/src/Converter.php create mode 100644 vendor/moneyphp/money/src/Currencies.php create mode 100644 vendor/moneyphp/money/src/Currencies/AggregateCurrencies.php create mode 100644 vendor/moneyphp/money/src/Currencies/BitcoinCurrencies.php create mode 100644 vendor/moneyphp/money/src/Currencies/CachedCurrencies.php create mode 100644 vendor/moneyphp/money/src/Currencies/CurrencyList.php create mode 100644 vendor/moneyphp/money/src/Currencies/ISOCurrencies.php create mode 100644 vendor/moneyphp/money/src/Currency.php create mode 100644 vendor/moneyphp/money/src/CurrencyPair.php create mode 100644 vendor/moneyphp/money/src/Exception.php create mode 100644 vendor/moneyphp/money/src/Exception/FormatterException.php create mode 100644 vendor/moneyphp/money/src/Exception/ParserException.php create mode 100644 vendor/moneyphp/money/src/Exception/UnknownCurrencyException.php create mode 100644 vendor/moneyphp/money/src/Exception/UnresolvableCurrencyPairException.php create mode 100644 vendor/moneyphp/money/src/Exchange.php create mode 100644 vendor/moneyphp/money/src/Exchange/ExchangerExchange.php create mode 100644 vendor/moneyphp/money/src/Exchange/FixedExchange.php create mode 100644 vendor/moneyphp/money/src/Exchange/IndirectExchange.php create mode 100644 vendor/moneyphp/money/src/Exchange/ReversedCurrenciesExchange.php create mode 100644 vendor/moneyphp/money/src/Exchange/SwapExchange.php create mode 100644 vendor/moneyphp/money/src/Formatter/AggregateMoneyFormatter.php create mode 100644 vendor/moneyphp/money/src/Formatter/BitcoinMoneyFormatter.php create mode 100644 vendor/moneyphp/money/src/Formatter/DecimalMoneyFormatter.php create mode 100644 vendor/moneyphp/money/src/Formatter/IntlLocalizedDecimalFormatter.php create mode 100644 vendor/moneyphp/money/src/Formatter/IntlMoneyFormatter.php create mode 100644 vendor/moneyphp/money/src/Money.php create mode 100644 vendor/moneyphp/money/src/MoneyFactory.php create mode 100644 vendor/moneyphp/money/src/MoneyFormatter.php create mode 100644 vendor/moneyphp/money/src/MoneyParser.php create mode 100644 vendor/moneyphp/money/src/Number.php create mode 100644 vendor/moneyphp/money/src/PHPUnit/Comparator.php create mode 100644 vendor/moneyphp/money/src/Parser/AggregateMoneyParser.php create mode 100644 vendor/moneyphp/money/src/Parser/BitcoinMoneyParser.php create mode 100644 vendor/moneyphp/money/src/Parser/DecimalMoneyParser.php create mode 100644 vendor/moneyphp/money/src/Parser/IntlLocalizedDecimalParser.php create mode 100644 vendor/moneyphp/money/src/Parser/IntlMoneyParser.php create mode 100644 vendor/monolog/monolog/LICENSE create mode 100644 vendor/monolog/monolog/composer.json create mode 100644 vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Attribute/WithMonologChannel.php create mode 100644 vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php create mode 100644 vendor/monolog/monolog/src/Monolog/ErrorHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/SyslogFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Handler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/JsonSerializableDateTimeImmutable.php create mode 100644 vendor/monolog/monolog/src/Monolog/Level.php create mode 100644 vendor/monolog/monolog/src/Monolog/LogRecord.php create mode 100644 vendor/monolog/monolog/src/Monolog/Logger.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ClosureContextProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/LoadAverageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Registry.php create mode 100644 vendor/monolog/monolog/src/Monolog/ResettableInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/SignalHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Test/MonologTestCase.php create mode 100644 vendor/monolog/monolog/src/Monolog/Test/TestCase.php create mode 100644 vendor/monolog/monolog/src/Monolog/Utils.php create mode 100644 vendor/mtdowling/jmespath.php/LICENSE create mode 100644 vendor/mtdowling/jmespath.php/README.rst create mode 100755 vendor/mtdowling/jmespath.php/bin/jp.php create mode 100755 vendor/mtdowling/jmespath.php/bin/perf.php create mode 100644 vendor/mtdowling/jmespath.php/composer.json create mode 100644 vendor/mtdowling/jmespath.php/src/AstRuntime.php create mode 100644 vendor/mtdowling/jmespath.php/src/CompilerRuntime.php create mode 100644 vendor/mtdowling/jmespath.php/src/DebugRuntime.php create mode 100644 vendor/mtdowling/jmespath.php/src/Env.php create mode 100644 vendor/mtdowling/jmespath.php/src/FnDispatcher.php create mode 100644 vendor/mtdowling/jmespath.php/src/JmesPath.php create mode 100644 vendor/mtdowling/jmespath.php/src/Lexer.php create mode 100644 vendor/mtdowling/jmespath.php/src/Parser.php create mode 100644 vendor/mtdowling/jmespath.php/src/SyntaxErrorException.php create mode 100644 vendor/mtdowling/jmespath.php/src/TreeCompiler.php create mode 100644 vendor/mtdowling/jmespath.php/src/TreeInterpreter.php create mode 100644 vendor/mtdowling/jmespath.php/src/Utils.php create mode 100644 vendor/mustache/mustache/.gitattributes create mode 100644 vendor/mustache/mustache/LICENSE create mode 100755 vendor/mustache/mustache/bin/build_bootstrap.php create mode 100644 vendor/mustache/mustache/composer.json create mode 100644 vendor/mustache/mustache/src/Mustache/Autoloader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Cache.php create mode 100644 vendor/mustache/mustache/src/Mustache/Cache/AbstractCache.php create mode 100644 vendor/mustache/mustache/src/Mustache/Cache/FilesystemCache.php create mode 100644 vendor/mustache/mustache/src/Mustache/Cache/NoopCache.php create mode 100644 vendor/mustache/mustache/src/Mustache/Compiler.php create mode 100644 vendor/mustache/mustache/src/Mustache/Context.php create mode 100644 vendor/mustache/mustache/src/Mustache/Engine.php create mode 100644 vendor/mustache/mustache/src/Mustache/Exception.php create mode 100644 vendor/mustache/mustache/src/Mustache/Exception/InvalidArgumentException.php create mode 100644 vendor/mustache/mustache/src/Mustache/Exception/LogicException.php create mode 100644 vendor/mustache/mustache/src/Mustache/Exception/RuntimeException.php create mode 100644 vendor/mustache/mustache/src/Mustache/Exception/SyntaxException.php create mode 100644 vendor/mustache/mustache/src/Mustache/Exception/UnknownFilterException.php create mode 100644 vendor/mustache/mustache/src/Mustache/Exception/UnknownHelperException.php create mode 100644 vendor/mustache/mustache/src/Mustache/Exception/UnknownTemplateException.php create mode 100644 vendor/mustache/mustache/src/Mustache/HelperCollection.php create mode 100644 vendor/mustache/mustache/src/Mustache/LambdaHelper.php create mode 100644 vendor/mustache/mustache/src/Mustache/Loader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Loader/ArrayLoader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Loader/CascadingLoader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Loader/FilesystemLoader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Loader/InlineLoader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Loader/MutableLoader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Loader/ProductionFilesystemLoader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Loader/StringLoader.php create mode 100644 vendor/mustache/mustache/src/Mustache/Logger.php create mode 100644 vendor/mustache/mustache/src/Mustache/Logger/AbstractLogger.php create mode 100644 vendor/mustache/mustache/src/Mustache/Logger/StreamLogger.php create mode 100644 vendor/mustache/mustache/src/Mustache/Parser.php create mode 100644 vendor/mustache/mustache/src/Mustache/Source.php create mode 100644 vendor/mustache/mustache/src/Mustache/Source/FilesystemSource.php create mode 100644 vendor/mustache/mustache/src/Mustache/Template.php create mode 100644 vendor/mustache/mustache/src/Mustache/Tokenizer.php create mode 100644 vendor/nesbot/carbon/.phpstorm.meta.php create mode 100644 vendor/nesbot/carbon/LICENSE create mode 100755 vendor/nesbot/carbon/bin/carbon create mode 100644 vendor/nesbot/carbon/bin/carbon.bat create mode 100644 vendor/nesbot/carbon/composer.json create mode 100644 vendor/nesbot/carbon/extension.neon create mode 100644 vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php create mode 100644 vendor/nesbot/carbon/readme.md create mode 100644 vendor/nesbot/carbon/sponsors.php create mode 100644 vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Callback.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Carbon.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonInterface.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonInterval.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Factory.php create mode 100644 vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ak.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/am.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/an.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/anp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/as.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/asa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ast.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ayc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bas.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bem.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bez.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bhb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bho.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/br.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/brx.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/byn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ccp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ce.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cgg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/chr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ckb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cmn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/crh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/csb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dav.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dje.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/doi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dsb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dua.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dyo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ebu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ee.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_001.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_150.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_419.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ewo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fil.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fur.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ga.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gom.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/guz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hak.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/haw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hif.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hne.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hsb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ht.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/i18n.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ia.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ig.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ii.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ik.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/in.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jgo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jmc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kam.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kde.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kea.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/khq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ki.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kkj.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kln.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kok.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksf.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ku.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ky.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lag.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/li.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lij.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lkt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lrc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/luo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/luy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lzh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mag.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mai.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mas.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mer.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mfe.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mgh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mgo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mhr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/miq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mjw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ml.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mni.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mua.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mzn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/naq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nhn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/niu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nmg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nnh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/no.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nso.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nus.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nyn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/or.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/os.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/prg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/quz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/raj.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rof.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rwk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sah.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/saq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sat.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sbp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/seh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ses.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sgs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/si.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sid.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/smn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ss.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/st.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/szl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tcy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/te.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/teo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tet.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/the.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tig.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tlh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/to.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tpi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ts.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/twq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ug.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/unm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ve.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vun.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wae.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wal.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xog.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yav.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yuw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zgh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Language.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php create mode 100644 vendor/nesbot/carbon/src/Carbon/List/languages.php create mode 100644 vendor/nesbot/carbon/src/Carbon/List/regions.php create mode 100644 vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Month.php create mode 100644 vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php create mode 100644 vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Cast.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Converter.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Creator.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Date.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Difference.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Localization.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Macro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Options.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Test.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Units.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Week.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Translator.php create mode 100644 vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Unit.php create mode 100644 vendor/nesbot/carbon/src/Carbon/WeekDay.php create mode 100644 vendor/nesbot/carbon/src/Carbon/WrapperClock.php create mode 100644 vendor/omnipay/common/.github/FUNDING.yml create mode 100644 vendor/omnipay/common/.github/workflows/phpunit.yml create mode 100644 vendor/omnipay/common/LICENSE create mode 100644 vendor/omnipay/common/UPGRADE.md create mode 100644 vendor/omnipay/common/composer.json create mode 100755 vendor/omnipay/common/src/Common/AbstractGateway.php create mode 100644 vendor/omnipay/common/src/Common/CreditCard.php create mode 100644 vendor/omnipay/common/src/Common/Exception/BadMethodCallException.php create mode 100644 vendor/omnipay/common/src/Common/Exception/InvalidCreditCardException.php create mode 100644 vendor/omnipay/common/src/Common/Exception/InvalidRequestException.php create mode 100644 vendor/omnipay/common/src/Common/Exception/InvalidResponseException.php create mode 100644 vendor/omnipay/common/src/Common/Exception/OmnipayException.php create mode 100644 vendor/omnipay/common/src/Common/Exception/RuntimeException.php create mode 100644 vendor/omnipay/common/src/Common/GatewayFactory.php create mode 100644 vendor/omnipay/common/src/Common/GatewayInterface.php create mode 100644 vendor/omnipay/common/src/Common/Helper.php create mode 100644 vendor/omnipay/common/src/Common/Http/Client.php create mode 100644 vendor/omnipay/common/src/Common/Http/ClientInterface.php create mode 100644 vendor/omnipay/common/src/Common/Http/Exception.php create mode 100644 vendor/omnipay/common/src/Common/Http/Exception/NetworkException.php create mode 100644 vendor/omnipay/common/src/Common/Http/Exception/RequestException.php create mode 100644 vendor/omnipay/common/src/Common/Issuer.php create mode 100644 vendor/omnipay/common/src/Common/Item.php create mode 100644 vendor/omnipay/common/src/Common/ItemBag.php create mode 100644 vendor/omnipay/common/src/Common/ItemInterface.php create mode 100644 vendor/omnipay/common/src/Common/Message/AbstractRequest.php create mode 100644 vendor/omnipay/common/src/Common/Message/AbstractResponse.php create mode 100644 vendor/omnipay/common/src/Common/Message/FetchIssuersResponseInterface.php create mode 100644 vendor/omnipay/common/src/Common/Message/FetchPaymentMethodsResponseInterface.php create mode 100644 vendor/omnipay/common/src/Common/Message/MessageInterface.php create mode 100755 vendor/omnipay/common/src/Common/Message/NotificationInterface.php create mode 100644 vendor/omnipay/common/src/Common/Message/RedirectResponseInterface.php create mode 100644 vendor/omnipay/common/src/Common/Message/RequestInterface.php create mode 100644 vendor/omnipay/common/src/Common/Message/ResponseInterface.php create mode 100644 vendor/omnipay/common/src/Common/ParametersTrait.php create mode 100644 vendor/omnipay/common/src/Common/PaymentMethod.php create mode 100644 vendor/omnipay/common/src/Omnipay.php create mode 100644 vendor/omnipay/paypal/LICENSE create mode 100644 vendor/omnipay/paypal/composer.json create mode 100644 vendor/omnipay/paypal/grumphp.yml create mode 100755 vendor/omnipay/paypal/makedoc.sh create mode 100644 vendor/omnipay/paypal/phpunit.xml.dist~ create mode 100644 vendor/omnipay/paypal/src/ExpressGateway.php create mode 100644 vendor/omnipay/paypal/src/ExpressInContextGateway.php create mode 100644 vendor/omnipay/paypal/src/Message/AbstractRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/AbstractRestRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/CaptureRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressAuthorizeRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressAuthorizeResponse.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressCompleteAuthorizeRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressCompleteOrderRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressCompletePurchaseRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressCompletePurchaseResponse.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressFetchCheckoutRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressInContextAuthorizeRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressInContextAuthorizeResponse.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressInContextOrderRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressOrderRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressTransactionSearchRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressTransactionSearchResponse.php create mode 100644 vendor/omnipay/paypal/src/Message/ExpressVoidRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/FetchTransactionRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ProAuthorizeRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/ProPurchaseRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RefundRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/Response.php create mode 100644 vendor/omnipay/paypal/src/Message/RestAuthorizeRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestAuthorizeResponse.php create mode 100644 vendor/omnipay/paypal/src/Message/RestCancelSubscriptionRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestCaptureRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestCompletePurchaseRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestCompleteSubscriptionRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestCreateCardRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestCreatePlanRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestCreateSubscriptionRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestDeleteCardRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestFetchPurchaseRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestFetchTransactionRequest.php create mode 100755 vendor/omnipay/paypal/src/Message/RestListPlanRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestListPurchaseRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestPurchaseRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestReactivateSubscriptionRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestRefundCaptureRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestRefundRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestResponse.php create mode 100644 vendor/omnipay/paypal/src/Message/RestSearchTransactionRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestSuspendSubscriptionRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestTokenRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestUpdatePlanRequest.php create mode 100644 vendor/omnipay/paypal/src/Message/RestVoidRequest.php create mode 100644 vendor/omnipay/paypal/src/PayPalItem.php create mode 100644 vendor/omnipay/paypal/src/PayPalItemBag.php create mode 100644 vendor/omnipay/paypal/src/ProGateway.php create mode 100644 vendor/omnipay/paypal/src/RestGateway.php create mode 100644 vendor/omnipay/paypal/src/Support/InstantUpdateApi/BillingAgreement.php create mode 100644 vendor/omnipay/paypal/src/Support/InstantUpdateApi/ShippingOption.php create mode 100644 vendor/owasp/phprbac/PhpRbac/src/PhpRbac/Rbac.php create mode 100644 vendor/owasp/phprbac/PhpRbac/src/PhpRbac/core/lib/Jf.php create mode 100644 vendor/owasp/phprbac/PhpRbac/src/PhpRbac/core/lib/nestedset/base.php create mode 100644 vendor/owasp/phprbac/PhpRbac/src/PhpRbac/core/lib/nestedset/full.php create mode 100644 vendor/owasp/phprbac/PhpRbac/src/PhpRbac/core/lib/rbac.php create mode 100644 vendor/owasp/phprbac/PhpRbac/src/PhpRbac/core/setup.php create mode 100644 vendor/owasp/phprbac/composer.json create mode 100644 vendor/pancakeapp/dompdf/AUTHORS.md create mode 100644 vendor/pancakeapp/dompdf/LICENSE.LGPL create mode 100644 vendor/pancakeapp/dompdf/composer.json create mode 100644 vendor/pancakeapp/dompdf/lib/Cpdf.php create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Courier-Bold.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Courier-BoldOblique.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Courier-Oblique.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Courier.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSans-Bold.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSans-Bold.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSans-BoldOblique.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSans-BoldOblique.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSans-Oblique.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSans-Oblique.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSans.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSans.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSansMono-Bold.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSansMono-Bold.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSansMono-Oblique.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSansMono-Oblique.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSansMono.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSansMono.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSerif-Bold.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSerif-Bold.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSerif-Italic.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSerif-Italic.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSerif.ttf create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/DejaVuSerif.ufm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Helvetica-Bold.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Helvetica-BoldOblique.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Helvetica-Oblique.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Helvetica.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Symbol.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Times-Bold.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Times-BoldItalic.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Times-Italic.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/Times-Roman.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/ZapfDingbats.afm create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/installed-fonts.dist.json create mode 100644 vendor/pancakeapp/dompdf/lib/fonts/mustRead.html create mode 100644 vendor/pancakeapp/dompdf/lib/res/broken_image.png create mode 100644 vendor/pancakeapp/dompdf/lib/res/broken_image.svg create mode 100644 vendor/pancakeapp/dompdf/lib/res/html.css create mode 100644 vendor/pancakeapp/dompdf/src/Adapter/CPDF.php create mode 100644 vendor/pancakeapp/dompdf/src/Adapter/GD.php create mode 100644 vendor/pancakeapp/dompdf/src/Adapter/PDFLib.php create mode 100644 vendor/pancakeapp/dompdf/src/Canvas.php create mode 100644 vendor/pancakeapp/dompdf/src/CanvasFactory.php create mode 100644 vendor/pancakeapp/dompdf/src/Cellmap.php create mode 100644 vendor/pancakeapp/dompdf/src/Css/AttributeTranslator.php create mode 100644 vendor/pancakeapp/dompdf/src/Css/Color.php create mode 100644 vendor/pancakeapp/dompdf/src/Css/Style.php create mode 100644 vendor/pancakeapp/dompdf/src/Css/Stylesheet.php create mode 100644 vendor/pancakeapp/dompdf/src/Dompdf.php create mode 100644 vendor/pancakeapp/dompdf/src/Exception.php create mode 100644 vendor/pancakeapp/dompdf/src/Exception/ImageException.php create mode 100644 vendor/pancakeapp/dompdf/src/FontMetrics.php create mode 100644 vendor/pancakeapp/dompdf/src/Frame.php create mode 100644 vendor/pancakeapp/dompdf/src/Frame/Factory.php create mode 100644 vendor/pancakeapp/dompdf/src/Frame/FrameListIterator.php create mode 100644 vendor/pancakeapp/dompdf/src/Frame/FrameTree.php create mode 100644 vendor/pancakeapp/dompdf/src/Frame/FrameTreeIterator.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/AbstractFrameDecorator.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/Block.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/Image.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/Inline.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/ListBullet.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/ListBulletImage.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/NullFrameDecorator.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/Page.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/Table.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/TableCell.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/TableRow.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/TableRowGroup.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameDecorator/Text.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/AbstractFrameReflower.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/Block.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/Image.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/Inline.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/ListBullet.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/NullFrameReflower.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/Page.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/Table.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/TableCell.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/TableRow.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/TableRowGroup.php create mode 100644 vendor/pancakeapp/dompdf/src/FrameReflower/Text.php create mode 100644 vendor/pancakeapp/dompdf/src/Helpers.php create mode 100644 vendor/pancakeapp/dompdf/src/Image/Cache.php create mode 100644 vendor/pancakeapp/dompdf/src/JavascriptEmbedder.php create mode 100644 vendor/pancakeapp/dompdf/src/LineBox.php create mode 100644 vendor/pancakeapp/dompdf/src/Options.php create mode 100644 vendor/pancakeapp/dompdf/src/PhpEvaluator.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/Absolute.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/AbstractPositioner.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/Block.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/Fixed.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/Inline.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/ListBullet.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/NullPositioner.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/TableCell.php create mode 100644 vendor/pancakeapp/dompdf/src/Positioner/TableRow.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer/AbstractRenderer.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer/Block.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer/Image.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer/Inline.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer/ListBullet.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer/TableCell.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer/TableRowGroup.php create mode 100644 vendor/pancakeapp/dompdf/src/Renderer/Text.php create mode 100644 vendor/paragonie/constant_time_encoding/LICENSE.txt create mode 100644 vendor/paragonie/constant_time_encoding/composer.json create mode 100644 vendor/paragonie/constant_time_encoding/src/Base32.php create mode 100644 vendor/paragonie/constant_time_encoding/src/Base32Hex.php create mode 100644 vendor/paragonie/constant_time_encoding/src/Base64.php create mode 100644 vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php create mode 100644 vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php create mode 100644 vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php create mode 100644 vendor/paragonie/constant_time_encoding/src/Binary.php create mode 100644 vendor/paragonie/constant_time_encoding/src/EncoderInterface.php create mode 100644 vendor/paragonie/constant_time_encoding/src/Encoding.php create mode 100644 vendor/paragonie/constant_time_encoding/src/Hex.php create mode 100644 vendor/paragonie/constant_time_encoding/src/RFC4648.php create mode 100644 vendor/paragonie/random_compat/LICENSE create mode 100755 vendor/paragonie/random_compat/build-phar.sh create mode 100644 vendor/paragonie/random_compat/composer.json create mode 100644 vendor/paragonie/random_compat/dist/random_compat.phar.pubkey create mode 100644 vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc create mode 100644 vendor/paragonie/random_compat/lib/random.php create mode 100644 vendor/paragonie/random_compat/other/build_phar.php create mode 100644 vendor/paragonie/random_compat/psalm-autoload.php create mode 100644 vendor/paragonie/random_compat/psalm.xml create mode 100644 vendor/payeezy/payeezy-php/Doxyfile create mode 100755 vendor/payeezy/payeezy-php/LICENSE create mode 100644 vendor/payeezy/payeezy-php/coder_ruleset.xml create mode 100755 vendor/payeezy/payeezy-php/composer.json create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/Client.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/CreditCard.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/Error.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/Paypal.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/TeleCheck.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/Token.php create mode 100755 vendor/payeezy/payeezy-php/src/Payeezy/Transaction.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/TransactionType.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/Util.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/ValueLink.php create mode 100644 vendor/payeezy/payeezy-php/src/Payeezy/threeDS.php create mode 100644 vendor/pear/math_biginteger/Math/BigInteger.php create mode 100644 vendor/pear/math_biginteger/README.rst create mode 100644 vendor/pear/math_biginteger/composer.json create mode 100644 vendor/pear/math_biginteger/demo/benchmark.php create mode 100644 vendor/pear/math_biginteger/demo/demo.php create mode 100644 vendor/pear/math_biginteger/package.xml create mode 100644 vendor/phenx/php-font-lib/LICENSE create mode 100644 vendor/phenx/php-font-lib/composer.json create mode 100644 vendor/phenx/php-font-lib/maps/adobe-standard-encoding.map create mode 100644 vendor/phenx/php-font-lib/maps/cp1250.map create mode 100644 vendor/phenx/php-font-lib/maps/cp1251.map create mode 100644 vendor/phenx/php-font-lib/maps/cp1252.map create mode 100644 vendor/phenx/php-font-lib/maps/cp1253.map create mode 100644 vendor/phenx/php-font-lib/maps/cp1254.map create mode 100644 vendor/phenx/php-font-lib/maps/cp1255.map create mode 100644 vendor/phenx/php-font-lib/maps/cp1257.map create mode 100644 vendor/phenx/php-font-lib/maps/cp1258.map create mode 100644 vendor/phenx/php-font-lib/maps/cp874.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-1.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-11.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-15.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-16.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-2.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-4.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-5.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-7.map create mode 100644 vendor/phenx/php-font-lib/maps/iso-8859-9.map create mode 100644 vendor/phenx/php-font-lib/maps/koi8-r.map create mode 100644 vendor/phenx/php-font-lib/maps/koi8-u.map create mode 100644 vendor/phenx/php-font-lib/src/FontLib/AdobeFontMetrics.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/BinaryStream.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/EOT/File.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/EOT/Header.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/EncodingMap.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Exception/FontNotFoundException.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Font.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Glyph/Outline.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComponent.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineSimple.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Header.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/OpenType/File.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/OpenType/TableDirectoryEntry.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/DirectoryEntry.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Table.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/cmap.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/cvt.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/fpgm.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/glyf.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/head.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/hhea.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/hmtx.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/kern.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/loca.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/maxp.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/name.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/nameRecord.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/os2.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/post.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/Table/Type/prep.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/TrueType/Collection.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/TrueType/File.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/TrueType/Header.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/WOFF/File.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/WOFF/Header.php create mode 100644 vendor/phenx/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php create mode 100644 vendor/phenx/php-svg-lib/LICENSE create mode 100644 vendor/phenx/php-svg-lib/composer.json create mode 100644 vendor/phenx/php-svg-lib/src/Svg/CssLength.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/DefaultStyle.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Document.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Gradient/Stop.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Style.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Surface/CPdf.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceInterface.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Surface/SurfacePDFLib.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/AbstractTag.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Anchor.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Circle.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/ClipPath.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Ellipse.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Group.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Image.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Line.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/LinearGradient.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Path.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Polygon.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Polyline.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/RadialGradient.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Rect.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Shape.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Stop.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/StyleTag.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Symbol.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/Text.php create mode 100644 vendor/phenx/php-svg-lib/src/Svg/Tag/UseTag.php create mode 100644 vendor/php-http/discovery/.php-cs-fixer.php create mode 100644 vendor/php-http/discovery/LICENSE create mode 100644 vendor/php-http/discovery/composer.json create mode 100644 vendor/php-http/discovery/src/ClassDiscovery.php create mode 100644 vendor/php-http/discovery/src/Composer/Plugin.php create mode 100644 vendor/php-http/discovery/src/Exception.php create mode 100644 vendor/php-http/discovery/src/Exception/ClassInstantiationFailedException.php create mode 100644 vendor/php-http/discovery/src/Exception/DiscoveryFailedException.php create mode 100644 vendor/php-http/discovery/src/Exception/NoCandidateFoundException.php create mode 100644 vendor/php-http/discovery/src/Exception/NotFoundException.php create mode 100644 vendor/php-http/discovery/src/Exception/PuliUnavailableException.php create mode 100644 vendor/php-http/discovery/src/Exception/StrategyUnavailableException.php create mode 100644 vendor/php-http/discovery/src/HttpAsyncClientDiscovery.php create mode 100644 vendor/php-http/discovery/src/HttpClientDiscovery.php create mode 100644 vendor/php-http/discovery/src/MessageFactoryDiscovery.php create mode 100644 vendor/php-http/discovery/src/NotFoundException.php create mode 100644 vendor/php-http/discovery/src/Psr17Factory.php create mode 100644 vendor/php-http/discovery/src/Psr17FactoryDiscovery.php create mode 100644 vendor/php-http/discovery/src/Psr18Client.php create mode 100644 vendor/php-http/discovery/src/Psr18ClientDiscovery.php create mode 100644 vendor/php-http/discovery/src/Strategy/CommonClassesStrategy.php create mode 100644 vendor/php-http/discovery/src/Strategy/CommonPsr17ClassesStrategy.php create mode 100644 vendor/php-http/discovery/src/Strategy/DiscoveryStrategy.php create mode 100644 vendor/php-http/discovery/src/Strategy/MockClientStrategy.php create mode 100644 vendor/php-http/discovery/src/Strategy/PuliBetaStrategy.php create mode 100644 vendor/php-http/discovery/src/StreamFactoryDiscovery.php create mode 100644 vendor/php-http/discovery/src/UriFactoryDiscovery.php create mode 100644 vendor/php-http/guzzle7-adapter/LICENSE create mode 100644 vendor/php-http/guzzle7-adapter/composer.json create mode 100644 vendor/php-http/guzzle7-adapter/phpstan.neon.dist create mode 100644 vendor/php-http/guzzle7-adapter/psalm.baseline.xml create mode 100644 vendor/php-http/guzzle7-adapter/psalm.xml create mode 100644 vendor/php-http/guzzle7-adapter/src/Client.php create mode 100644 vendor/php-http/guzzle7-adapter/src/Exception/UnexpectedValueException.php create mode 100644 vendor/php-http/guzzle7-adapter/src/Promise.php create mode 100644 vendor/php-http/httplug/.php-cs-fixer.dist.php create mode 100644 vendor/php-http/httplug/LICENSE create mode 100644 vendor/php-http/httplug/composer.json create mode 100644 vendor/php-http/httplug/puli.json create mode 100644 vendor/php-http/httplug/src/Exception.php create mode 100644 vendor/php-http/httplug/src/Exception/HttpException.php create mode 100644 vendor/php-http/httplug/src/Exception/NetworkException.php create mode 100644 vendor/php-http/httplug/src/Exception/RequestAwareTrait.php create mode 100644 vendor/php-http/httplug/src/Exception/RequestException.php create mode 100644 vendor/php-http/httplug/src/Exception/TransferException.php create mode 100644 vendor/php-http/httplug/src/HttpAsyncClient.php create mode 100644 vendor/php-http/httplug/src/HttpClient.php create mode 100644 vendor/php-http/httplug/src/Promise/HttpFulfilledPromise.php create mode 100644 vendor/php-http/httplug/src/Promise/HttpRejectedPromise.php create mode 100644 vendor/php-http/message-factory/CONTRIBUTING create mode 100644 vendor/php-http/message-factory/LICENSE create mode 100644 vendor/php-http/message-factory/composer.json create mode 100644 vendor/php-http/message-factory/puli.json create mode 100644 vendor/php-http/message-factory/src/MessageFactory.php create mode 100644 vendor/php-http/message-factory/src/RequestFactory.php create mode 100644 vendor/php-http/message-factory/src/ResponseFactory.php create mode 100644 vendor/php-http/message-factory/src/StreamFactory.php create mode 100644 vendor/php-http/message-factory/src/UriFactory.php create mode 100644 vendor/php-http/message/.php-cs-fixer.dist.php create mode 100644 vendor/php-http/message/LICENSE create mode 100644 vendor/php-http/message/apigen.neon create mode 100644 vendor/php-http/message/composer.json create mode 100644 vendor/php-http/message/puli.json create mode 100644 vendor/php-http/message/src/Authentication.php create mode 100644 vendor/php-http/message/src/Authentication/AutoBasicAuth.php create mode 100644 vendor/php-http/message/src/Authentication/BasicAuth.php create mode 100644 vendor/php-http/message/src/Authentication/Bearer.php create mode 100644 vendor/php-http/message/src/Authentication/Chain.php create mode 100644 vendor/php-http/message/src/Authentication/Header.php create mode 100644 vendor/php-http/message/src/Authentication/Matching.php create mode 100644 vendor/php-http/message/src/Authentication/QueryParam.php create mode 100644 vendor/php-http/message/src/Authentication/RequestConditional.php create mode 100644 vendor/php-http/message/src/Authentication/Wsse.php create mode 100644 vendor/php-http/message/src/Builder/ResponseBuilder.php create mode 100644 vendor/php-http/message/src/Cookie.php create mode 100644 vendor/php-http/message/src/CookieJar.php create mode 100644 vendor/php-http/message/src/CookieUtil.php create mode 100644 vendor/php-http/message/src/Decorator/MessageDecorator.php create mode 100644 vendor/php-http/message/src/Decorator/RequestDecorator.php create mode 100644 vendor/php-http/message/src/Decorator/ResponseDecorator.php create mode 100644 vendor/php-http/message/src/Decorator/StreamDecorator.php create mode 100644 vendor/php-http/message/src/Encoding/ChunkStream.php create mode 100644 vendor/php-http/message/src/Encoding/CompressStream.php create mode 100644 vendor/php-http/message/src/Encoding/DechunkStream.php create mode 100644 vendor/php-http/message/src/Encoding/DecompressStream.php create mode 100644 vendor/php-http/message/src/Encoding/DeflateStream.php create mode 100644 vendor/php-http/message/src/Encoding/Filter/Chunk.php create mode 100644 vendor/php-http/message/src/Encoding/FilteredStream.php create mode 100644 vendor/php-http/message/src/Encoding/GzipDecodeStream.php create mode 100644 vendor/php-http/message/src/Encoding/GzipEncodeStream.php create mode 100644 vendor/php-http/message/src/Encoding/InflateStream.php create mode 100644 vendor/php-http/message/src/Exception.php create mode 100644 vendor/php-http/message/src/Exception/UnexpectedValueException.php create mode 100644 vendor/php-http/message/src/Formatter.php create mode 100644 vendor/php-http/message/src/Formatter/CurlCommandFormatter.php create mode 100644 vendor/php-http/message/src/Formatter/FullHttpMessageFormatter.php create mode 100644 vendor/php-http/message/src/Formatter/SimpleFormatter.php create mode 100644 vendor/php-http/message/src/MessageFactory/DiactorosMessageFactory.php create mode 100644 vendor/php-http/message/src/MessageFactory/GuzzleMessageFactory.php create mode 100644 vendor/php-http/message/src/MessageFactory/SlimMessageFactory.php create mode 100644 vendor/php-http/message/src/RequestMatcher.php create mode 100644 vendor/php-http/message/src/RequestMatcher/CallbackRequestMatcher.php create mode 100644 vendor/php-http/message/src/RequestMatcher/RegexRequestMatcher.php create mode 100644 vendor/php-http/message/src/RequestMatcher/RequestMatcher.php create mode 100644 vendor/php-http/message/src/Stream/BufferedStream.php create mode 100644 vendor/php-http/message/src/StreamFactory/DiactorosStreamFactory.php create mode 100644 vendor/php-http/message/src/StreamFactory/GuzzleStreamFactory.php create mode 100644 vendor/php-http/message/src/StreamFactory/SlimStreamFactory.php create mode 100644 vendor/php-http/message/src/UriFactory/DiactorosUriFactory.php create mode 100644 vendor/php-http/message/src/UriFactory/GuzzleUriFactory.php create mode 100644 vendor/php-http/message/src/UriFactory/SlimUriFactory.php create mode 100644 vendor/php-http/message/src/filters.php create mode 100644 vendor/php-http/promise/LICENSE create mode 100644 vendor/php-http/promise/composer.json create mode 100644 vendor/php-http/promise/phpstan.neon.dist create mode 100644 vendor/php-http/promise/src/FulfilledPromise.php create mode 100644 vendor/php-http/promise/src/Promise.php create mode 100644 vendor/php-http/promise/src/RejectedPromise.php create mode 100644 vendor/phpseclib/bcmath_compat/.github/workflows/ci.yml create mode 100644 vendor/phpseclib/bcmath_compat/LICENSE.md create mode 100644 vendor/phpseclib/bcmath_compat/composer.json create mode 100644 vendor/phpseclib/bcmath_compat/lib/bcmath.php create mode 100644 vendor/phpseclib/bcmath_compat/src/BCMath.php create mode 100644 vendor/phpseclib/phpseclib/AUTHORS create mode 100644 vendor/phpseclib/phpseclib/BACKERS.md create mode 100644 vendor/phpseclib/phpseclib/LICENSE create mode 100644 vendor/phpseclib/phpseclib/composer.json create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/AES.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DES.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DH.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RC2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RC4.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ANSI.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/File/X509.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BinaryField.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/PrimeField.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/bootstrap.php create mode 100644 vendor/phpseclib/phpseclib/phpseclib/openssl.cnf create mode 100644 vendor/psr/cache/LICENSE.txt create mode 100644 vendor/psr/cache/composer.json create mode 100644 vendor/psr/cache/src/CacheException.php create mode 100644 vendor/psr/cache/src/CacheItemInterface.php create mode 100644 vendor/psr/cache/src/CacheItemPoolInterface.php create mode 100644 vendor/psr/cache/src/InvalidArgumentException.php create mode 100644 vendor/psr/clock/LICENSE create mode 100644 vendor/psr/clock/composer.json create mode 100644 vendor/psr/clock/src/ClockInterface.php create mode 100644 vendor/psr/container/LICENSE create mode 100644 vendor/psr/container/composer.json create mode 100644 vendor/psr/container/src/ContainerExceptionInterface.php create mode 100644 vendor/psr/container/src/ContainerInterface.php create mode 100644 vendor/psr/container/src/NotFoundExceptionInterface.php create mode 100644 vendor/psr/http-client/LICENSE create mode 100644 vendor/psr/http-client/composer.json create mode 100644 vendor/psr/http-client/src/ClientExceptionInterface.php create mode 100644 vendor/psr/http-client/src/ClientInterface.php create mode 100644 vendor/psr/http-client/src/NetworkExceptionInterface.php create mode 100644 vendor/psr/http-client/src/RequestExceptionInterface.php create mode 100644 vendor/psr/http-factory/LICENSE create mode 100644 vendor/psr/http-factory/composer.json create mode 100644 vendor/psr/http-factory/src/RequestFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/ResponseFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/ServerRequestFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/StreamFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/UploadedFileFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/UriFactoryInterface.php create mode 100644 vendor/psr/http-message/LICENSE create mode 100644 vendor/psr/http-message/composer.json create mode 100644 vendor/psr/http-message/src/MessageInterface.php create mode 100644 vendor/psr/http-message/src/RequestInterface.php create mode 100644 vendor/psr/http-message/src/ResponseInterface.php create mode 100644 vendor/psr/http-message/src/ServerRequestInterface.php create mode 100644 vendor/psr/http-message/src/StreamInterface.php create mode 100644 vendor/psr/http-message/src/UploadedFileInterface.php create mode 100644 vendor/psr/http-message/src/UriInterface.php create mode 100644 vendor/psr/log/LICENSE create mode 100644 vendor/psr/log/composer.json create mode 100644 vendor/psr/log/src/AbstractLogger.php create mode 100644 vendor/psr/log/src/InvalidArgumentException.php create mode 100644 vendor/psr/log/src/LogLevel.php create mode 100644 vendor/psr/log/src/LoggerAwareInterface.php create mode 100644 vendor/psr/log/src/LoggerAwareTrait.php create mode 100644 vendor/psr/log/src/LoggerInterface.php create mode 100644 vendor/psr/log/src/LoggerTrait.php create mode 100644 vendor/psr/log/src/NullLogger.php create mode 100644 vendor/psr/simple-cache/.editorconfig create mode 100644 vendor/psr/simple-cache/LICENSE.md create mode 100644 vendor/psr/simple-cache/composer.json create mode 100644 vendor/psr/simple-cache/src/CacheException.php create mode 100644 vendor/psr/simple-cache/src/CacheInterface.php create mode 100644 vendor/psr/simple-cache/src/InvalidArgumentException.php create mode 100644 vendor/ralouphie/getallheaders/LICENSE create mode 100644 vendor/ralouphie/getallheaders/composer.json create mode 100644 vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100644 vendor/riverline/multipart-parser/.github/workflows/php.yml create mode 100644 vendor/riverline/multipart-parser/LICENSE create mode 100644 vendor/riverline/multipart-parser/composer.json create mode 100644 vendor/riverline/multipart-parser/src/Converters/Globals.php create mode 100644 vendor/riverline/multipart-parser/src/Converters/HttpFoundation.php create mode 100644 vendor/riverline/multipart-parser/src/Converters/PSR7.php create mode 100644 vendor/riverline/multipart-parser/src/Part.php create mode 100644 vendor/riverline/multipart-parser/src/StreamedPart.php create mode 100644 vendor/sabberworm/php-css-parser/LICENSE create mode 100644 vendor/sabberworm/php-css-parser/composer.json create mode 100644 vendor/sabberworm/php-css-parser/src/CSSList/AtRuleBlockList.php create mode 100644 vendor/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php create mode 100644 vendor/sabberworm/php-css-parser/src/CSSList/CSSList.php create mode 100644 vendor/sabberworm/php-css-parser/src/CSSList/Document.php create mode 100644 vendor/sabberworm/php-css-parser/src/CSSList/KeyFrame.php create mode 100644 vendor/sabberworm/php-css-parser/src/Comment/Comment.php create mode 100644 vendor/sabberworm/php-css-parser/src/Comment/Commentable.php create mode 100644 vendor/sabberworm/php-css-parser/src/OutputFormat.php create mode 100644 vendor/sabberworm/php-css-parser/src/OutputFormatter.php create mode 100644 vendor/sabberworm/php-css-parser/src/Parser.php create mode 100644 vendor/sabberworm/php-css-parser/src/Parsing/Anchor.php create mode 100644 vendor/sabberworm/php-css-parser/src/Parsing/OutputException.php create mode 100644 vendor/sabberworm/php-css-parser/src/Parsing/ParserState.php create mode 100644 vendor/sabberworm/php-css-parser/src/Parsing/SourceException.php create mode 100644 vendor/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php create mode 100644 vendor/sabberworm/php-css-parser/src/Parsing/UnexpectedTokenException.php create mode 100644 vendor/sabberworm/php-css-parser/src/Property/AtRule.php create mode 100644 vendor/sabberworm/php-css-parser/src/Property/CSSNamespace.php create mode 100644 vendor/sabberworm/php-css-parser/src/Property/Charset.php create mode 100644 vendor/sabberworm/php-css-parser/src/Property/Import.php create mode 100644 vendor/sabberworm/php-css-parser/src/Property/KeyframeSelector.php create mode 100644 vendor/sabberworm/php-css-parser/src/Property/Selector.php create mode 100644 vendor/sabberworm/php-css-parser/src/Renderable.php create mode 100644 vendor/sabberworm/php-css-parser/src/Rule/Rule.php create mode 100644 vendor/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php create mode 100644 vendor/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php create mode 100644 vendor/sabberworm/php-css-parser/src/RuleSet/RuleSet.php create mode 100644 vendor/sabberworm/php-css-parser/src/Settings.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/CSSFunction.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/CSSString.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/CalcFunction.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/Color.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/LineName.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/PrimitiveValue.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/RuleValueList.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/Size.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/URL.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/Value.php create mode 100644 vendor/sabberworm/php-css-parser/src/Value/ValueList.php create mode 100644 vendor/spatie/once/.editorconfig create mode 100644 vendor/spatie/once/.github/FUNDING.yml create mode 100644 vendor/spatie/once/.github/workflows/run-tests.yml create mode 100644 vendor/spatie/once/LICENSE.md create mode 100644 vendor/spatie/once/composer.json create mode 100644 vendor/spatie/once/src/Backtrace.php create mode 100644 vendor/spatie/once/src/Cache.php create mode 100644 vendor/spatie/once/src/Listener.php create mode 100644 vendor/spatie/once/src/functions.php create mode 100644 vendor/stripe/stripe-php/.coveralls.github-actions.yml create mode 100644 vendor/stripe/stripe-php/.editorconfig create mode 100644 vendor/stripe/stripe-php/.php-cs-fixer.php create mode 100644 vendor/stripe/stripe-php/CODE_OF_CONDUCT.md create mode 100644 vendor/stripe/stripe-php/LICENSE create mode 100644 vendor/stripe/stripe-php/Makefile create mode 100755 vendor/stripe/stripe-php/build.php create mode 100644 vendor/stripe/stripe-php/composer.json create mode 100644 vendor/stripe/stripe-php/data/ca-certificates.crt create mode 100644 vendor/stripe/stripe-php/init.php create mode 100644 vendor/stripe/stripe-php/lib/Account.php create mode 100644 vendor/stripe/stripe-php/lib/AccountLink.php create mode 100644 vendor/stripe/stripe-php/lib/AlipayAccount.php create mode 100644 vendor/stripe/stripe-php/lib/ApiOperations/All.php create mode 100644 vendor/stripe/stripe-php/lib/ApiOperations/Create.php create mode 100644 vendor/stripe/stripe-php/lib/ApiOperations/Delete.php create mode 100644 vendor/stripe/stripe-php/lib/ApiOperations/NestedResource.php create mode 100644 vendor/stripe/stripe-php/lib/ApiOperations/Request.php create mode 100644 vendor/stripe/stripe-php/lib/ApiOperations/Retrieve.php create mode 100644 vendor/stripe/stripe-php/lib/ApiOperations/Search.php create mode 100644 vendor/stripe/stripe-php/lib/ApiOperations/Update.php create mode 100644 vendor/stripe/stripe-php/lib/ApiRequestor.php create mode 100644 vendor/stripe/stripe-php/lib/ApiResource.php create mode 100644 vendor/stripe/stripe-php/lib/ApiResponse.php create mode 100644 vendor/stripe/stripe-php/lib/ApplePayDomain.php create mode 100644 vendor/stripe/stripe-php/lib/ApplicationFee.php create mode 100644 vendor/stripe/stripe-php/lib/ApplicationFeeRefund.php create mode 100644 vendor/stripe/stripe-php/lib/Balance.php create mode 100644 vendor/stripe/stripe-php/lib/BalanceTransaction.php create mode 100644 vendor/stripe/stripe-php/lib/BankAccount.php create mode 100644 vendor/stripe/stripe-php/lib/BaseStripeClient.php create mode 100644 vendor/stripe/stripe-php/lib/BaseStripeClientInterface.php create mode 100644 vendor/stripe/stripe-php/lib/BillingPortal/Configuration.php create mode 100644 vendor/stripe/stripe-php/lib/BillingPortal/Session.php create mode 100644 vendor/stripe/stripe-php/lib/BitcoinReceiver.php create mode 100644 vendor/stripe/stripe-php/lib/BitcoinTransaction.php create mode 100644 vendor/stripe/stripe-php/lib/Capability.php create mode 100644 vendor/stripe/stripe-php/lib/Card.php create mode 100644 vendor/stripe/stripe-php/lib/CashBalance.php create mode 100644 vendor/stripe/stripe-php/lib/Charge.php create mode 100644 vendor/stripe/stripe-php/lib/Checkout/Session.php create mode 100644 vendor/stripe/stripe-php/lib/Collection.php create mode 100644 vendor/stripe/stripe-php/lib/CountrySpec.php create mode 100644 vendor/stripe/stripe-php/lib/Coupon.php create mode 100644 vendor/stripe/stripe-php/lib/CreditNote.php create mode 100644 vendor/stripe/stripe-php/lib/CreditNoteLineItem.php create mode 100644 vendor/stripe/stripe-php/lib/Customer.php create mode 100644 vendor/stripe/stripe-php/lib/CustomerBalanceTransaction.php create mode 100644 vendor/stripe/stripe-php/lib/Discount.php create mode 100644 vendor/stripe/stripe-php/lib/Dispute.php create mode 100644 vendor/stripe/stripe-php/lib/EphemeralKey.php create mode 100644 vendor/stripe/stripe-php/lib/ErrorObject.php create mode 100644 vendor/stripe/stripe-php/lib/Event.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/ApiConnectionException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/ApiErrorException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/AuthenticationException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/BadMethodCallException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/CardException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/ExceptionInterface.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/IdempotencyException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/InvalidArgumentException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/InvalidRequestException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/ExceptionInterface.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/InvalidClientException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/InvalidGrantException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/InvalidRequestException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/InvalidScopeException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/OAuthErrorException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/PermissionException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/RateLimitException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/SignatureVerificationException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/UnexpectedValueException.php create mode 100644 vendor/stripe/stripe-php/lib/Exception/UnknownApiErrorException.php create mode 100644 vendor/stripe/stripe-php/lib/ExchangeRate.php create mode 100644 vendor/stripe/stripe-php/lib/File.php create mode 100644 vendor/stripe/stripe-php/lib/FileLink.php create mode 100644 vendor/stripe/stripe-php/lib/FinancialConnections/Account.php create mode 100644 vendor/stripe/stripe-php/lib/FinancialConnections/AccountOwner.php create mode 100644 vendor/stripe/stripe-php/lib/FinancialConnections/AccountOwnership.php create mode 100644 vendor/stripe/stripe-php/lib/FinancialConnections/Session.php create mode 100644 vendor/stripe/stripe-php/lib/FundingInstructions.php create mode 100644 vendor/stripe/stripe-php/lib/HttpClient/ClientInterface.php create mode 100644 vendor/stripe/stripe-php/lib/HttpClient/CurlClient.php create mode 100644 vendor/stripe/stripe-php/lib/HttpClient/StreamingClientInterface.php create mode 100644 vendor/stripe/stripe-php/lib/Identity/VerificationReport.php create mode 100644 vendor/stripe/stripe-php/lib/Identity/VerificationSession.php create mode 100644 vendor/stripe/stripe-php/lib/Invoice.php create mode 100644 vendor/stripe/stripe-php/lib/InvoiceItem.php create mode 100644 vendor/stripe/stripe-php/lib/InvoiceLineItem.php create mode 100644 vendor/stripe/stripe-php/lib/Issuing/Authorization.php create mode 100644 vendor/stripe/stripe-php/lib/Issuing/Card.php create mode 100644 vendor/stripe/stripe-php/lib/Issuing/CardDetails.php create mode 100644 vendor/stripe/stripe-php/lib/Issuing/Cardholder.php create mode 100644 vendor/stripe/stripe-php/lib/Issuing/Dispute.php create mode 100644 vendor/stripe/stripe-php/lib/Issuing/Transaction.php create mode 100644 vendor/stripe/stripe-php/lib/LineItem.php create mode 100644 vendor/stripe/stripe-php/lib/LoginLink.php create mode 100644 vendor/stripe/stripe-php/lib/Mandate.php create mode 100644 vendor/stripe/stripe-php/lib/OAuth.php create mode 100644 vendor/stripe/stripe-php/lib/OAuthErrorObject.php create mode 100644 vendor/stripe/stripe-php/lib/Order.php create mode 100644 vendor/stripe/stripe-php/lib/OrderItem.php create mode 100644 vendor/stripe/stripe-php/lib/OrderReturn.php create mode 100644 vendor/stripe/stripe-php/lib/PaymentIntent.php create mode 100644 vendor/stripe/stripe-php/lib/PaymentLink.php create mode 100644 vendor/stripe/stripe-php/lib/PaymentMethod.php create mode 100644 vendor/stripe/stripe-php/lib/Payout.php create mode 100644 vendor/stripe/stripe-php/lib/Person.php create mode 100644 vendor/stripe/stripe-php/lib/Plan.php create mode 100644 vendor/stripe/stripe-php/lib/Price.php create mode 100644 vendor/stripe/stripe-php/lib/Product.php create mode 100644 vendor/stripe/stripe-php/lib/PromotionCode.php create mode 100644 vendor/stripe/stripe-php/lib/Quote.php create mode 100644 vendor/stripe/stripe-php/lib/Radar/EarlyFraudWarning.php create mode 100644 vendor/stripe/stripe-php/lib/Radar/ValueList.php create mode 100644 vendor/stripe/stripe-php/lib/Radar/ValueListItem.php create mode 100644 vendor/stripe/stripe-php/lib/Recipient.php create mode 100644 vendor/stripe/stripe-php/lib/RecipientTransfer.php create mode 100644 vendor/stripe/stripe-php/lib/Refund.php create mode 100644 vendor/stripe/stripe-php/lib/Reporting/ReportRun.php create mode 100644 vendor/stripe/stripe-php/lib/Reporting/ReportType.php create mode 100644 vendor/stripe/stripe-php/lib/RequestTelemetry.php create mode 100644 vendor/stripe/stripe-php/lib/Review.php create mode 100644 vendor/stripe/stripe-php/lib/SKU.php create mode 100644 vendor/stripe/stripe-php/lib/SearchResult.php create mode 100644 vendor/stripe/stripe-php/lib/Service/AbstractService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/AbstractServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/AccountLinkService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/AccountService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/ApplePayDomainService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/ApplicationFeeService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/BalanceService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/BalanceTransactionService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/BillingPortal/ConfigurationService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/BillingPortal/SessionService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/ChargeService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Checkout/SessionService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/CoreServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/CountrySpecService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/CouponService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/CreditNoteService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/CustomerService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/DisputeService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/EphemeralKeyService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/EventService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/ExchangeRateService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/FileLinkService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/FileService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/FinancialConnections/AccountService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/FinancialConnections/SessionService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Identity/IdentityServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Identity/VerificationReportService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Identity/VerificationSessionService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/InvoiceItemService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/InvoiceService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Issuing/AuthorizationService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Issuing/CardService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Issuing/CardholderService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Issuing/DisputeService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Issuing/TransactionService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/MandateService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/OAuthService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/OrderReturnService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/OrderService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/PaymentIntentService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/PaymentLinkService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/PaymentMethodService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/PayoutService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/PlanService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/PriceService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/ProductService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/PromotionCodeService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/QuoteService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Radar/RadarServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Radar/ValueListItemService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Radar/ValueListService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/RefundService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Reporting/ReportRunService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Reporting/ReportTypeService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/ReviewService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/SetupAttemptService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/SetupIntentService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/ShippingRateService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/SkuService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/SourceService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/SubscriptionItemService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/SubscriptionScheduleService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/SubscriptionService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TaxCodeService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TaxRateService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Terminal/ConfigurationService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Terminal/ConnectionTokenService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Terminal/LocationService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Terminal/ReaderService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TestHelpers/RefundService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TestHelpers/TestClockService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TokenService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TopupService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/TransferService.php create mode 100644 vendor/stripe/stripe-php/lib/Service/WebhookEndpointService.php create mode 100644 vendor/stripe/stripe-php/lib/SetupAttempt.php create mode 100644 vendor/stripe/stripe-php/lib/SetupIntent.php create mode 100644 vendor/stripe/stripe-php/lib/ShippingRate.php create mode 100644 vendor/stripe/stripe-php/lib/Sigma/ScheduledQueryRun.php create mode 100644 vendor/stripe/stripe-php/lib/SingletonApiResource.php create mode 100644 vendor/stripe/stripe-php/lib/Source.php create mode 100644 vendor/stripe/stripe-php/lib/SourceTransaction.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe.php create mode 100644 vendor/stripe/stripe-php/lib/StripeClient.php create mode 100644 vendor/stripe/stripe-php/lib/StripeClientInterface.php create mode 100644 vendor/stripe/stripe-php/lib/StripeObject.php create mode 100644 vendor/stripe/stripe-php/lib/StripeStreamingClientInterface.php create mode 100644 vendor/stripe/stripe-php/lib/Subscription.php create mode 100644 vendor/stripe/stripe-php/lib/SubscriptionItem.php create mode 100644 vendor/stripe/stripe-php/lib/SubscriptionSchedule.php create mode 100644 vendor/stripe/stripe-php/lib/TaxCode.php create mode 100644 vendor/stripe/stripe-php/lib/TaxId.php create mode 100644 vendor/stripe/stripe-php/lib/TaxRate.php create mode 100644 vendor/stripe/stripe-php/lib/Terminal/Configuration.php create mode 100644 vendor/stripe/stripe-php/lib/Terminal/ConnectionToken.php create mode 100644 vendor/stripe/stripe-php/lib/Terminal/Location.php create mode 100644 vendor/stripe/stripe-php/lib/Terminal/Reader.php create mode 100644 vendor/stripe/stripe-php/lib/TestHelpers/TestClock.php create mode 100644 vendor/stripe/stripe-php/lib/ThreeDSecure.php create mode 100644 vendor/stripe/stripe-php/lib/Token.php create mode 100644 vendor/stripe/stripe-php/lib/Topup.php create mode 100644 vendor/stripe/stripe-php/lib/Transfer.php create mode 100644 vendor/stripe/stripe-php/lib/TransferReversal.php create mode 100644 vendor/stripe/stripe-php/lib/UsageRecord.php create mode 100644 vendor/stripe/stripe-php/lib/UsageRecordSummary.php create mode 100644 vendor/stripe/stripe-php/lib/Util/CaseInsensitiveArray.php create mode 100644 vendor/stripe/stripe-php/lib/Util/DefaultLogger.php create mode 100644 vendor/stripe/stripe-php/lib/Util/LoggerInterface.php create mode 100644 vendor/stripe/stripe-php/lib/Util/ObjectTypes.php create mode 100644 vendor/stripe/stripe-php/lib/Util/RandomGenerator.php create mode 100644 vendor/stripe/stripe-php/lib/Util/RequestOptions.php create mode 100644 vendor/stripe/stripe-php/lib/Util/Set.php create mode 100644 vendor/stripe/stripe-php/lib/Util/Util.php create mode 100644 vendor/stripe/stripe-php/lib/Webhook.php create mode 100644 vendor/stripe/stripe-php/lib/WebhookEndpoint.php create mode 100644 vendor/stripe/stripe-php/lib/WebhookSignature.php create mode 100644 vendor/stripe/stripe-php/phpdoc.dist.xml create mode 100644 vendor/stripe/stripe-php/phpstan-baseline.neon create mode 100644 vendor/stripe/stripe-php/phpstan.neon.dist create mode 100755 vendor/stripe/stripe-php/update_certs.php create mode 100644 vendor/swiftmailer/swiftmailer/.gitattributes create mode 100644 vendor/swiftmailer/swiftmailer/.github/ISSUE_TEMPLATE.md create mode 100644 vendor/swiftmailer/swiftmailer/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/swiftmailer/swiftmailer/.github/workflows/tests.yml create mode 100644 vendor/swiftmailer/swiftmailer/.php_cs.dist create mode 100644 vendor/swiftmailer/swiftmailer/LICENSE create mode 100644 vendor/swiftmailer/swiftmailer/composer.json create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/AddressEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/AddressEncoder/IdnAddressEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/AddressEncoder/Utf8AddressEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/AddressEncoderException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Attachment.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/AbstractFilterableInputStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/ArrayByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/FileByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ByteStream/TemporaryFileByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/GenericFixedWidthReader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/UsAsciiReader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReader/Utf8Reader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReaderFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterReaderFactory/SimpleCharacterReaderFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream/ArrayCharacterStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/CharacterStream/NgCharacterStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ConfigurableSpool.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/DependencyContainer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/DependencyException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/EmbeddedFile.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/Base64Encoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/QpEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Encoder/Rfc2231Encoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/CommandEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/CommandListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/Event.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventDispatcher.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/EventObject.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/ResponseEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/ResponseListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SendEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SendListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SimpleEventDispatcher.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportChangeEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportChangeListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportExceptionEvent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/TransportExceptionListener.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/FailoverTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/FileSpool.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/FileStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Filterable.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/IdGenerator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Image.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/InputByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/IoException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/ArrayKeyCache.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/DiskKeyCache.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/KeyCacheInputStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/NullKeyCache.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/SimpleKeyCacheInputStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/LoadBalancedTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer/ArrayRecipientIterator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer/RecipientIterator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/MemorySpool.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Message.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Attachment.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/CharsetObserver.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/Base64ContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/NativeQpContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/NullContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/PlainContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/QpContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/QpContentEncoderProxy.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/RawContentEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/EmbeddedFile.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/EncodingObserver.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Header.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder/Base64HeaderEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/HeaderEncoder/QpHeaderEncoder.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/AbstractHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/DateHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/IdentificationHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/OpenDKIMHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/ParameterizedHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/PathHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Headers/UnstructuredHeader.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/IdGenerator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/MimePart.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleHeaderFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleHeaderSet.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleMessage.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleMimeEntity.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/MimePart.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/NullTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/OutputByteStream.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/AntiFloodPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/BandwidthMonitorPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Decorator/Replacements.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/DecoratorPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ImpersonatePlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Logger.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/LoggerPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Loggers/ArrayLogger.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Loggers/EchoLogger.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/MessageLogger.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Connection.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Pop/Pop3Exception.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/PopBeforeSmtpPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/RedirectingPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ReporterPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporters/HitReporter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Reporters/HtmlReporter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Sleeper.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Plugins/Timer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Preferences.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/ReplacementFilterFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/RfcComplianceException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/SendmailTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/BodySigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/DomainKeySigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/OpenDKIMSigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Signers/SMimeSigner.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Spool.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/SpoolTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/ByteArrayReplacementFilter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilter.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/StreamFilters/StringReplacementFilterFactory.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/SwiftException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/AuthHandler.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/Authenticator.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/EightBitMimeHandler.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/Esmtp/SmtpUtf8Handler.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpHandler.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/FailoverTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/IoBuffer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/LoadBalancedTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/NullTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SendmailTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SmtpAgent.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SpoolTransport.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/dependency_maps/cache_deps.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/mime_types.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/preferences.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/swift_required.php create mode 100644 vendor/swiftmailer/swiftmailer/lib/swiftmailer_generate_mimes_config.php create mode 100644 vendor/symfony/clock/Clock.php create mode 100644 vendor/symfony/clock/ClockAwareTrait.php create mode 100644 vendor/symfony/clock/ClockInterface.php create mode 100644 vendor/symfony/clock/DatePoint.php create mode 100644 vendor/symfony/clock/LICENSE create mode 100644 vendor/symfony/clock/MockClock.php create mode 100644 vendor/symfony/clock/MonotonicClock.php create mode 100644 vendor/symfony/clock/NativeClock.php create mode 100644 vendor/symfony/clock/Resources/now.php create mode 100644 vendor/symfony/clock/Test/ClockSensitiveTrait.php create mode 100644 vendor/symfony/clock/composer.json create mode 100644 vendor/symfony/deprecation-contracts/LICENSE create mode 100644 vendor/symfony/deprecation-contracts/composer.json create mode 100644 vendor/symfony/deprecation-contracts/function.php create mode 100644 vendor/symfony/http-foundation/AcceptHeader.php create mode 100644 vendor/symfony/http-foundation/AcceptHeaderItem.php create mode 100644 vendor/symfony/http-foundation/BinaryFileResponse.php create mode 100644 vendor/symfony/http-foundation/Cookie.php create mode 100644 vendor/symfony/http-foundation/Exception/BadRequestException.php create mode 100644 vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php create mode 100644 vendor/symfony/http-foundation/Exception/JsonException.php create mode 100644 vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php create mode 100644 vendor/symfony/http-foundation/Exception/SessionNotFoundException.php create mode 100644 vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php create mode 100644 vendor/symfony/http-foundation/ExpressionRequestMatcher.php create mode 100644 vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/FileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/NoFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/PartialFileException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php create mode 100644 vendor/symfony/http-foundation/File/Exception/UploadException.php create mode 100644 vendor/symfony/http-foundation/File/File.php create mode 100644 vendor/symfony/http-foundation/File/Stream.php create mode 100644 vendor/symfony/http-foundation/File/UploadedFile.php create mode 100644 vendor/symfony/http-foundation/FileBag.php create mode 100644 vendor/symfony/http-foundation/HeaderBag.php create mode 100644 vendor/symfony/http-foundation/HeaderUtils.php create mode 100644 vendor/symfony/http-foundation/InputBag.php create mode 100644 vendor/symfony/http-foundation/IpUtils.php create mode 100644 vendor/symfony/http-foundation/JsonResponse.php create mode 100644 vendor/symfony/http-foundation/LICENSE create mode 100644 vendor/symfony/http-foundation/ParameterBag.php create mode 100644 vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php create mode 100644 vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php create mode 100644 vendor/symfony/http-foundation/RedirectResponse.php create mode 100644 vendor/symfony/http-foundation/Request.php create mode 100644 vendor/symfony/http-foundation/RequestMatcher.php create mode 100644 vendor/symfony/http-foundation/RequestMatcherInterface.php create mode 100644 vendor/symfony/http-foundation/RequestStack.php create mode 100644 vendor/symfony/http-foundation/Response.php create mode 100644 vendor/symfony/http-foundation/ResponseHeaderBag.php create mode 100644 vendor/symfony/http-foundation/ServerBag.php create mode 100644 vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php create mode 100644 vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php create mode 100644 vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php create mode 100644 vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php create mode 100644 vendor/symfony/http-foundation/Session/Flash/FlashBag.php create mode 100644 vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php create mode 100644 vendor/symfony/http-foundation/Session/Session.php create mode 100644 vendor/symfony/http-foundation/Session/SessionBagInterface.php create mode 100644 vendor/symfony/http-foundation/Session/SessionBagProxy.php create mode 100644 vendor/symfony/http-foundation/Session/SessionFactory.php create mode 100644 vendor/symfony/http-foundation/Session/SessionFactoryInterface.php create mode 100644 vendor/symfony/http-foundation/Session/SessionInterface.php create mode 100644 vendor/symfony/http-foundation/Session/SessionUtils.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/MetadataBag.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/ServiceSessionFactory.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php create mode 100644 vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php create mode 100644 vendor/symfony/http-foundation/StreamedResponse.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php create mode 100644 vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php create mode 100644 vendor/symfony/http-foundation/UrlHelper.php create mode 100644 vendor/symfony/http-foundation/composer.json create mode 100644 vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 vendor/symfony/polyfill-ctype/LICENSE create mode 100644 vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 vendor/symfony/polyfill-ctype/bootstrap80.php create mode 100644 vendor/symfony/polyfill-ctype/composer.json create mode 100644 vendor/symfony/polyfill-iconv/Iconv.php create mode 100644 vendor/symfony/polyfill-iconv/LICENSE create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp1006.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp437.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp775.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp852.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp860.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp862.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp863.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-13.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-16.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-4.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-r.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.us-ascii.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1250.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1251.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1253.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php create mode 100644 vendor/symfony/polyfill-iconv/Resources/charset/translit.php create mode 100644 vendor/symfony/polyfill-iconv/bootstrap.php create mode 100644 vendor/symfony/polyfill-iconv/bootstrap80.php create mode 100644 vendor/symfony/polyfill-iconv/composer.json create mode 100644 vendor/symfony/polyfill-intl-idn/Idn.php create mode 100644 vendor/symfony/polyfill-intl-idn/Info.php create mode 100644 vendor/symfony/polyfill-intl-idn/LICENSE create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php create mode 100644 vendor/symfony/polyfill-intl-idn/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-idn/bootstrap80.php create mode 100644 vendor/symfony/polyfill-intl-idn/composer.json create mode 100644 vendor/symfony/polyfill-intl-normalizer/LICENSE create mode 100644 vendor/symfony/polyfill-intl-normalizer/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/bootstrap80.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/composer.json create mode 100644 vendor/symfony/polyfill-mbstring/LICENSE create mode 100644 vendor/symfony/polyfill-mbstring/Mbstring.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100644 vendor/symfony/polyfill-mbstring/bootstrap.php create mode 100644 vendor/symfony/polyfill-mbstring/bootstrap80.php create mode 100644 vendor/symfony/polyfill-mbstring/composer.json create mode 100644 vendor/symfony/polyfill-php80/LICENSE create mode 100644 vendor/symfony/polyfill-php80/Php80.php create mode 100644 vendor/symfony/polyfill-php80/PhpToken.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php create mode 100644 vendor/symfony/polyfill-php80/bootstrap.php create mode 100644 vendor/symfony/polyfill-php80/composer.json create mode 100644 vendor/symfony/polyfill-php83/LICENSE create mode 100644 vendor/symfony/polyfill-php83/Php83.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateError.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateException.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/Override.php create mode 100644 vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php create mode 100644 vendor/symfony/polyfill-php83/bootstrap.php create mode 100644 vendor/symfony/polyfill-php83/bootstrap81.php create mode 100644 vendor/symfony/polyfill-php83/composer.json create mode 100644 vendor/symfony/translation-contracts/LICENSE create mode 100644 vendor/symfony/translation-contracts/LocaleAwareInterface.php create mode 100644 vendor/symfony/translation-contracts/Test/TranslatorTest.php create mode 100644 vendor/symfony/translation-contracts/TranslatableInterface.php create mode 100644 vendor/symfony/translation-contracts/TranslatorInterface.php create mode 100644 vendor/symfony/translation-contracts/TranslatorTrait.php create mode 100644 vendor/symfony/translation-contracts/composer.json create mode 100644 vendor/symfony/translation/Catalogue/AbstractOperation.php create mode 100644 vendor/symfony/translation/Catalogue/MergeOperation.php create mode 100644 vendor/symfony/translation/Catalogue/OperationInterface.php create mode 100644 vendor/symfony/translation/Catalogue/TargetOperation.php create mode 100644 vendor/symfony/translation/CatalogueMetadataAwareInterface.php create mode 100644 vendor/symfony/translation/Command/TranslationLintCommand.php create mode 100644 vendor/symfony/translation/Command/TranslationPullCommand.php create mode 100644 vendor/symfony/translation/Command/TranslationPushCommand.php create mode 100644 vendor/symfony/translation/Command/TranslationTrait.php create mode 100644 vendor/symfony/translation/Command/XliffLintCommand.php create mode 100644 vendor/symfony/translation/DataCollector/TranslationDataCollector.php create mode 100644 vendor/symfony/translation/DataCollectorTranslator.php create mode 100644 vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslatorPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php create mode 100644 vendor/symfony/translation/Dumper/CsvFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/DumperInterface.php create mode 100644 vendor/symfony/translation/Dumper/FileDumper.php create mode 100644 vendor/symfony/translation/Dumper/IcuResFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/IniFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/JsonFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/MoFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/PhpFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/PoFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/QtFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/XliffFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/YamlFileDumper.php create mode 100644 vendor/symfony/translation/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/translation/Exception/IncompleteDsnException.php create mode 100644 vendor/symfony/translation/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/translation/Exception/InvalidResourceException.php create mode 100644 vendor/symfony/translation/Exception/LogicException.php create mode 100644 vendor/symfony/translation/Exception/MissingRequiredOptionException.php create mode 100644 vendor/symfony/translation/Exception/NotFoundResourceException.php create mode 100644 vendor/symfony/translation/Exception/ProviderException.php create mode 100644 vendor/symfony/translation/Exception/ProviderExceptionInterface.php create mode 100644 vendor/symfony/translation/Exception/RuntimeException.php create mode 100644 vendor/symfony/translation/Exception/UnsupportedSchemeException.php create mode 100644 vendor/symfony/translation/Extractor/AbstractFileExtractor.php create mode 100644 vendor/symfony/translation/Extractor/ChainExtractor.php create mode 100644 vendor/symfony/translation/Extractor/ExtractorInterface.php create mode 100644 vendor/symfony/translation/Extractor/PhpAstExtractor.php create mode 100644 vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php create mode 100644 vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php create mode 100644 vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php create mode 100644 vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php create mode 100644 vendor/symfony/translation/Formatter/IntlFormatter.php create mode 100644 vendor/symfony/translation/Formatter/IntlFormatterInterface.php create mode 100644 vendor/symfony/translation/Formatter/MessageFormatter.php create mode 100644 vendor/symfony/translation/Formatter/MessageFormatterInterface.php create mode 100644 vendor/symfony/translation/IdentityTranslator.php create mode 100644 vendor/symfony/translation/LICENSE create mode 100644 vendor/symfony/translation/Loader/ArrayLoader.php create mode 100644 vendor/symfony/translation/Loader/CsvFileLoader.php create mode 100644 vendor/symfony/translation/Loader/FileLoader.php create mode 100644 vendor/symfony/translation/Loader/IcuDatFileLoader.php create mode 100644 vendor/symfony/translation/Loader/IcuResFileLoader.php create mode 100644 vendor/symfony/translation/Loader/IniFileLoader.php create mode 100644 vendor/symfony/translation/Loader/JsonFileLoader.php create mode 100644 vendor/symfony/translation/Loader/LoaderInterface.php create mode 100644 vendor/symfony/translation/Loader/MoFileLoader.php create mode 100644 vendor/symfony/translation/Loader/PhpFileLoader.php create mode 100644 vendor/symfony/translation/Loader/PoFileLoader.php create mode 100644 vendor/symfony/translation/Loader/QtFileLoader.php create mode 100644 vendor/symfony/translation/Loader/XliffFileLoader.php create mode 100644 vendor/symfony/translation/Loader/YamlFileLoader.php create mode 100644 vendor/symfony/translation/LocaleSwitcher.php create mode 100644 vendor/symfony/translation/LoggingTranslator.php create mode 100644 vendor/symfony/translation/MessageCatalogue.php create mode 100644 vendor/symfony/translation/MessageCatalogueInterface.php create mode 100644 vendor/symfony/translation/MetadataAwareInterface.php create mode 100644 vendor/symfony/translation/Provider/AbstractProviderFactory.php create mode 100644 vendor/symfony/translation/Provider/Dsn.php create mode 100644 vendor/symfony/translation/Provider/FilteringProvider.php create mode 100644 vendor/symfony/translation/Provider/NullProvider.php create mode 100644 vendor/symfony/translation/Provider/NullProviderFactory.php create mode 100644 vendor/symfony/translation/Provider/ProviderFactoryInterface.php create mode 100644 vendor/symfony/translation/Provider/ProviderInterface.php create mode 100644 vendor/symfony/translation/Provider/TranslationProviderCollection.php create mode 100644 vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php create mode 100644 vendor/symfony/translation/PseudoLocalizationTranslator.php create mode 100644 vendor/symfony/translation/Reader/TranslationReader.php create mode 100644 vendor/symfony/translation/Reader/TranslationReaderInterface.php create mode 100644 vendor/symfony/translation/Resources/bin/translation-status.php create mode 100644 vendor/symfony/translation/Resources/data/parents.json create mode 100644 vendor/symfony/translation/Resources/functions.php create mode 100644 vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd create mode 100644 vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd create mode 100644 vendor/symfony/translation/Resources/schemas/xml.xsd create mode 100644 vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php create mode 100644 vendor/symfony/translation/Test/IncompleteDsnTestTrait.php create mode 100644 vendor/symfony/translation/Test/ProviderFactoryTestCase.php create mode 100644 vendor/symfony/translation/Test/ProviderTestCase.php create mode 100644 vendor/symfony/translation/TranslatableMessage.php create mode 100644 vendor/symfony/translation/Translator.php create mode 100644 vendor/symfony/translation/TranslatorBag.php create mode 100644 vendor/symfony/translation/TranslatorBagInterface.php create mode 100644 vendor/symfony/translation/Util/ArrayConverter.php create mode 100644 vendor/symfony/translation/Util/XliffUtils.php create mode 100644 vendor/symfony/translation/Writer/TranslationWriter.php create mode 100644 vendor/symfony/translation/Writer/TranslationWriterInterface.php create mode 100644 vendor/symfony/translation/composer.json create mode 100644 vendor/symfony/var-dumper/Caster/AmqpCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ArgsStub.php create mode 100644 vendor/symfony/var-dumper/Caster/Caster.php create mode 100644 vendor/symfony/var-dumper/Caster/ClassStub.php create mode 100644 vendor/symfony/var-dumper/Caster/ConstStub.php create mode 100644 vendor/symfony/var-dumper/Caster/CutArrayStub.php create mode 100644 vendor/symfony/var-dumper/Caster/CutStub.php create mode 100644 vendor/symfony/var-dumper/Caster/DOMCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DateCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DoctrineCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DsCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/DsPairStub.php create mode 100644 vendor/symfony/var-dumper/Caster/EnumStub.php create mode 100644 vendor/symfony/var-dumper/Caster/ExceptionCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/FrameStub.php create mode 100644 vendor/symfony/var-dumper/Caster/GmpCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ImagineCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ImgStub.php create mode 100644 vendor/symfony/var-dumper/Caster/IntlCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/LinkStub.php create mode 100644 vendor/symfony/var-dumper/Caster/MemcachedCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/MysqliCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/PdoCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/PgSqlCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/RedisCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ReflectionCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/ResourceCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/SplCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/StubCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/SymfonyCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/TraceStub.php create mode 100644 vendor/symfony/var-dumper/Caster/UuidCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/XmlReaderCaster.php create mode 100644 vendor/symfony/var-dumper/Caster/XmlResourceCaster.php create mode 100644 vendor/symfony/var-dumper/Cloner/AbstractCloner.php create mode 100644 vendor/symfony/var-dumper/Cloner/ClonerInterface.php create mode 100644 vendor/symfony/var-dumper/Cloner/Cursor.php create mode 100644 vendor/symfony/var-dumper/Cloner/Data.php create mode 100644 vendor/symfony/var-dumper/Cloner/DumperInterface.php create mode 100644 vendor/symfony/var-dumper/Cloner/Stub.php create mode 100644 vendor/symfony/var-dumper/Cloner/VarCloner.php create mode 100644 vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php create mode 100644 vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php create mode 100644 vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php create mode 100644 vendor/symfony/var-dumper/Command/ServerDumpCommand.php create mode 100644 vendor/symfony/var-dumper/Dumper/AbstractDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/CliDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php create mode 100644 vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/DataDumperInterface.php create mode 100644 vendor/symfony/var-dumper/Dumper/HtmlDumper.php create mode 100644 vendor/symfony/var-dumper/Dumper/ServerDumper.php create mode 100644 vendor/symfony/var-dumper/Exception/ThrowingCasterException.php create mode 100644 vendor/symfony/var-dumper/LICENSE create mode 100755 vendor/symfony/var-dumper/Resources/bin/var-dump-server create mode 100644 vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css create mode 100644 vendor/symfony/var-dumper/Resources/functions/dump.php create mode 100644 vendor/symfony/var-dumper/Resources/js/htmlDescriptor.js create mode 100644 vendor/symfony/var-dumper/Server/Connection.php create mode 100644 vendor/symfony/var-dumper/Server/DumpServer.php create mode 100644 vendor/symfony/var-dumper/Test/VarDumperTestTrait.php create mode 100644 vendor/symfony/var-dumper/VarDumper.php create mode 100644 vendor/symfony/var-dumper/composer.json diff --git a/composer.lock b/composer.lock index e78d7a0..10154a5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,5595 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "519d12029469c19dc1ae17d08fa71087", - "packages": [], + "content-hash": "fc363ba63f9b0e99cea2079d318b7608", + "packages": [ + { + "name": "aws/aws-crt-php", + "version": "v1.2.7", + "source": { + "type": "git", + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "https://github.com/awslabs/aws-crt-php", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" + }, + "time": "2024-10-18T22:15:13+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.363.2", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "f8b5f125248daa8942144b4771c041a63ec41900" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f8b5f125248daa8942144b4771c041a63ec41900", + "reference": "f8b5f125248daa8942144b4771c041a63ec41900", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.2.3", + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.4.5", + "mtdowling/jmespath.php": "^2.8.0", + "php": ">=8.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "composer/composer": "^2.7.8", + "dms/phpunit-arraysubset-asserts": "^0.4.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", + "psr/cache": "^2.0 || ^3.0", + "psr/simple-cache": "^2.0 || ^3.0", + "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", + "symfony/filesystem": "^v6.4.0 || ^v7.1.0", + "yoast/phpunit-polyfills": "^2.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Aws\\": "src/" + }, + "exclude-from-classmap": [ + "src/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "support": { + "forum": "https://github.com/aws/aws-sdk-php/discussions", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.363.2" + }, + "time": "2025-11-25T19:04:55+00:00" + }, + { + "name": "brunodebarros/fix-php-post-input", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/pocketarc/fix-php-post-input.git", + "reference": "088544a82e94e95f41e8f7c9b9cb7061f8d0c7fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pocketarc/fix-php-post-input/zipball/088544a82e94e95f41e8f7c9b9cb7061f8d0c7fc", + "reference": "088544a82e94e95f41e8f7c9b9cb7061f8d0c7fc", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "riverline/multipart-parser": "dev-master" + }, + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Brunodebarros\\FixPhpPostInput\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno De Barros", + "email": "bruno@terraduo.com" + } + ], + "description": "If your $_POST/$_FILES are empty and they shouldn't be, this library fixes them.", + "homepage": "https://github.com/BrunoDeBarros/fix-php-post-input", + "keywords": [ + "compatibility", + "files", + "input", + "post" + ], + "support": { + "issues": "https://github.com/pocketarc/fix-php-post-input/issues", + "source": "https://github.com/pocketarc/fix-php-post-input/tree/v1.3.0" + }, + "time": "2018-08-13T08:16:58+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-20T15:40:13+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.5.9", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "1905981ee626e6f852448b7aaa978f8666c5bc54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/1905981ee626e6f852448b7aaa978f8666c5bc54", + "reference": "1905981ee626e6f852448b7aaa978f8666c5bc54", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.9" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-11-06T11:46:17+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + }, + "time": "2025-04-07T20:06:18+00:00" + }, + { + "name": "doctrine/lexer", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:35:39+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.2.6", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2|^2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.2.6" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-06-01T07:04:22+00:00" + }, + { + "name": "erusev/parsedown", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "0b274ac959624e6c6d647e9c9b6c2d20da242004" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/0b274ac959624e6c6d647e9c9b6c2d20da242004", + "reference": "0b274ac959624e6c6d647e9c9b6c2d20da242004", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5|^8.5|^9.6" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "support": { + "issues": "https://github.com/erusev/parsedown/issues", + "source": "https://github.com/erusev/parsedown/tree/master" + }, + "time": "2025-08-31T07:57:44+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.19.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/b287d2a16aceffbf6e0295559b39662612b77fcf", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.19.0" + }, + "time": "2025-10-17T16:34:55+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.11.1", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" + }, + "time": "2025-04-09T20:32:01+00:00" + }, + { + "name": "google/apiclient", + "version": "v2.18.4", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-api-php-client.git", + "reference": "5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b", + "reference": "5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "^6.0", + "google/apiclient-services": "~0.350", + "google/auth": "^1.37", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.6", + "monolog/monolog": "^2.9||^3.0", + "php": "^8.1", + "phpseclib/phpseclib": "^3.0.36" + }, + "require-dev": { + "cache/filesystem-adapter": "^1.1", + "composer/composer": "^1.10.23", + "phpcompatibility/php-compatibility": "^9.2", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "^3.8", + "symfony/css-selector": "~2.1", + "symfony/dom-crawler": "~2.1" + }, + "suggest": { + "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/aliases.php" + ], + "psr-4": { + "Google\\": "src/" + }, + "classmap": [ + "src/aliases.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Client library for Google APIs", + "homepage": "http://developers.google.com/api-client-library/php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/google-api-php-client/issues", + "source": "https://github.com/googleapis/google-api-php-client/tree/v2.18.4" + }, + "time": "2025-09-30T04:23:07+00:00" + }, + { + "name": "google/apiclient-services", + "version": "v0.421.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-api-php-client-services.git", + "reference": "d84e7301a52405677807564dab6b1a112dfd03bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d84e7301a52405677807564dab6b1a112dfd03bd", + "reference": "d84e7301a52405677807564dab6b1a112dfd03bd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "autoload": { + "files": [ + "autoload.php" + ], + "psr-4": { + "Google\\Service\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Client library for Google APIs", + "homepage": "http://developers.google.com/api-client-library/php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/google-api-php-client-services/issues", + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.421.0" + }, + "time": "2025-11-23T01:06:22+00:00" + }, + { + "name": "google/auth", + "version": "v1.49.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-auth-library-php.git", + "reference": "68e3d88cb59a49f713e3db25d4f6bb3cc0b70764" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/68e3d88cb59a49f713e3db25d4f6bb3cc0b70764", + "reference": "68e3d88cb59a49f713e3db25d4f6bb3cc0b70764", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "^6.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.4.5", + "php": "^8.1", + "psr/cache": "^2.0||^3.0", + "psr/http-message": "^1.1||^2.0", + "psr/log": "^3.0" + }, + "require-dev": { + "guzzlehttp/promises": "^2.0", + "kelvinmo/simplejwt": "0.7.1", + "phpseclib/phpseclib": "^3.0.35", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^4.0", + "symfony/filesystem": "^6.3||^7.3", + "symfony/process": "^6.0||^7.0", + "webmozart/assert": "^1.11" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Auth Library for PHP", + "homepage": "https://github.com/google/google-auth-library-php", + "keywords": [ + "Authentication", + "google", + "oauth2" + ], + "support": { + "docs": "https://cloud.google.com/php/docs/reference/auth/latest", + "issues": "https://github.com/googleapis/google-auth-library-php/issues", + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.49.0" + }, + "time": "2025-11-06T21:27:55+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, + { + "name": "html2text/html2text", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/mtibben/html2text.git", + "reference": "3b443cbe302b52eb5806a21a9dbd79524203970a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mtibben/html2text/zipball/3b443cbe302b52eb5806a21a9dbd79524203970a", + "reference": "3b443cbe302b52eb5806a21a9dbd79524203970a", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "~4|^9.0" + }, + "suggest": { + "ext-mbstring": "For best performance", + "symfony/polyfill-mbstring": "If you can't install ext-mbstring" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Html2Text\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Converts HTML to formatted plain text", + "support": { + "issues": "https://github.com/mtibben/html2text/issues", + "source": "https://github.com/mtibben/html2text/tree/4.3.2" + }, + "time": "2024-08-20T02:43:29+00:00" + }, + { + "name": "ifsnop/mysqldump-php", + "version": "v2.12", + "source": { + "type": "git", + "url": "https://github.com/ifsnop/mysqldump-php.git", + "reference": "2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ifsnop/mysqldump-php/zipball/2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3", + "reference": "2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.8.36", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ifsnop\\": "src/Ifsnop/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Diego Torres", + "homepage": "https://github.com/ifsnop", + "role": "Developer" + } + ], + "description": "PHP version of mysqldump cli that comes with MySQL", + "homepage": "https://github.com/ifsnop/mysqldump-php", + "keywords": [ + "PHP7", + "database", + "hhvm", + "mariadb", + "mysql", + "mysql-backup", + "mysqldump", + "pdo", + "php", + "php5", + "sql" + ], + "support": { + "issues": "https://github.com/ifsnop/mysqldump-php/issues", + "source": "https://github.com/ifsnop/mysqldump-php/tree/v2.12" + }, + "time": "2023-04-12T07:43:14+00:00" + }, + { + "name": "illuminate/collections", + "version": "v8.83.27", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "705a4e1ef93cd492c45b9b3e7911cccc990a07f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/705a4e1ef93cd492c45b9b3e7911cccc990a07f4", + "reference": "705a4e1ef93cd492c45b9b3e7911cccc990a07f4", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^5.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-06-23T15:29:49+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v8.83.27", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "5e0fd287a1b22a6b346a9f7cd484d8cf0234585d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/5e0fd287a1b22a6b346a9f7cd484d8cf0234585d", + "reference": "5e0fd287a1b22a6b346a9f7cd484d8cf0234585d", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-01-13T14:47:47+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v8.83.27", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "aed81891a6e046fdee72edd497f822190f61c162" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/aed81891a6e046fdee72edd497f822190f61c162", + "reference": "aed81891a6e046fdee72edd497f822190f61c162", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-16T13:57:03+00:00" + }, + { + "name": "jakeasmith/http_build_url", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/jakeasmith/http_build_url.git", + "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jakeasmith/http_build_url/zipball/93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "src/http_build_url.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jake A. Smith", + "email": "theman@jakeasmith.com" + } + ], + "description": "Provides functionality for http_build_url() to environments without pecl_http.", + "support": { + "issues": "https://github.com/jakeasmith/http_build_url/issues", + "source": "https://github.com/jakeasmith/http_build_url" + }, + "time": "2017-05-01T15:36:40+00:00" + }, + { + "name": "league/csv", + "version": "9.27.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/26de738b8fccf785397d05ee2fc07b6cd8749797", + "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1.2" + }, + "require-dev": { + "ext-dom": "*", + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^3.75.0", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^1.12.27", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^10.5.16 || ^11.5.22 || ^12.3.6", + "symfony/var-dumper": "^6.4.8 || ^7.3.0" + }, + "suggest": { + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters", + "ext-mysqli": "Requiered to use the package with the MySQLi extension", + "ext-pdo": "Required to use the package with the PDO extension", + "ext-pgsql": "Requiered to use the package with the PgSQL extension", + "ext-sqlite3": "Required to use the package with the SQLite3 extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "League\\Csv\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "CSV data manipulation made easy in PHP", + "homepage": "https://csv.thephpleague.com", + "keywords": [ + "convert", + "csv", + "export", + "filter", + "import", + "read", + "transform", + "write" + ], + "support": { + "docs": "https://csv.thephpleague.com", + "issues": "https://github.com/thephpleague/csv/issues", + "rss": "https://github.com/thephpleague/csv/releases.atom", + "source": "https://github.com/thephpleague/csv" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-10-25T08:35:20+00:00" + }, + { + "name": "league/event", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "062ebb450efbe9a09bc2478e89b7c933875b0935" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/062ebb450efbe9a09bc2478e89b7c933875b0935", + "reference": "062ebb450efbe9a09bc2478e89b7c933875b0935", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "^2.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "support": { + "issues": "https://github.com/thephpleague/event/issues", + "source": "https://github.com/thephpleague/event/tree/2.3.0" + }, + "time": "2025-03-14T19:51:10+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.10", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2022-10-04T09:16:37+00:00" + }, + { + "name": "league/flysystem-aws-s3-v3", + "version": "1.0.30", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", + "reference": "af286f291ebab6877bac0c359c6c2cb017eb061d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/af286f291ebab6877bac0c359c6c2cb017eb061d", + "reference": "af286f291ebab6877bac0c359c6c2cb017eb061d", + "shasum": "" + }, + "require": { + "aws/aws-sdk-php": "^3.20.0", + "league/flysystem": "^1.0.40", + "php": ">=5.5.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "^2.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\AwsS3v3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Flysystem adapter for the AWS S3 SDK v3.x", + "support": { + "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/1.0.30" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-07-02T13:51:38+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/oauth2-client", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "php": "^7.1 || >=8.0.0 <8.6.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.9.0" + }, + "time": "2025-11-25T22:17:17+00:00" + }, + { + "name": "league/oauth2-google", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-google.git", + "reference": "c0faed29ec6d665ce3234e01f62029516cee4c02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/c0faed29ec6d665ce3234e01f62029516cee4c02", + "reference": "c0faed29ec6d665ce3234e01f62029516cee4c02", + "shasum": "" + }, + "require": { + "league/oauth2-client": "^2.0" + }, + "require-dev": { + "eloquent/phony": "^0.14.6", + "phpunit/phpunit": "^5.7", + "satooshi/php-coveralls": "^2.0", + "squizlabs/php_codesniffer": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com", + "homepage": "http://shadowhand.me" + } + ], + "description": "Google OAuth 2.0 Client Provider for The PHP League OAuth2-Client", + "keywords": [ + "Authentication", + "authorization", + "client", + "google", + "oauth", + "oauth2" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-google/issues", + "source": "https://github.com/thephpleague/oauth2-google/tree/master" + }, + "time": "2018-03-19T17:28:55+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fcf91eb64359852f00d921887b219479b4f21251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" + }, + "time": "2025-07-25T09:04:22+00:00" + }, + { + "name": "moneyphp/money", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/moneyphp/money.git", + "reference": "0dc40e3791c67e8793e3aa13fead8cf4661ec9cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/moneyphp/money/zipball/0dc40e3791c67e8793e3aa13fead8cf4661ec9cd", + "reference": "0dc40e3791c67e8793e3aa13fead8cf4661ec9cd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.6" + }, + "require-dev": { + "cache/taggable-cache": "^0.4.0", + "doctrine/instantiator": "^1.0.5", + "ext-bcmath": "*", + "ext-gmp": "*", + "ext-intl": "*", + "florianv/exchanger": "^1.0", + "florianv/swap": "^3.0", + "friends-of-phpspec/phpspec-code-coverage": "^3.1.1 || ^4.3", + "moneyphp/iso-currencies": "^3.2.1", + "php-http/message": "^1.4", + "php-http/mock-client": "^1.0.0", + "phpspec/phpspec": "^3.4.3", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.18 || ^8.5", + "psr/cache": "^1.0", + "symfony/phpunit-bridge": "^4" + }, + "suggest": { + "ext-bcmath": "Calculate without integer limits", + "ext-gmp": "Calculate without integer limits", + "ext-intl": "Format Money objects with intl", + "florianv/exchanger": "Exchange rates library for PHP", + "florianv/swap": "Exchange rates library for PHP", + "psr/cache-implementation": "Used for Currency caching" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Money\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Verraes", + "email": "mathias@verraes.net", + "homepage": "http://verraes.net" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Frederik Bosch", + "email": "f.bosch@genkgo.nl" + } + ], + "description": "PHP implementation of Fowler's Money pattern", + "homepage": "http://moneyphp.org", + "keywords": [ + "Value Object", + "money", + "vo" + ], + "support": { + "issues": "https://github.com/moneyphp/money/issues", + "source": "https://github.com/moneyphp/money/tree/v3.3.3" + }, + "time": "2022-09-21T07:43:36+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.9.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2025-03-24T10:02:05+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "files": [ + "src/JmesPath.php" + ], + "psr-4": { + "JmesPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" + }, + "time": "2024-09-04T18:46:31+00:00" + }, + { + "name": "mustache/mustache", + "version": "v2.14.2", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/mustache.php.git", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.11", + "phpunit/phpunit": "~3.7|~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "issues": "https://github.com/bobthecow/mustache.php/issues", + "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" + }, + "time": "2022-08-23T13:07:01+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.10.3", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2025-09-06T13:39:36+00:00" + }, + { + "name": "omnipay/common", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/omnipay-common.git", + "reference": "83552de28815c5e46f66360c4d52c3a82a7d5efc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/omnipay-common/zipball/83552de28815c5e46f66360c4d52c3a82a7d5efc", + "reference": "83552de28815c5e46f66360c4d52c3a82a7d5efc", + "shasum": "" + }, + "require": { + "moneyphp/money": "^3.1|^4.0.3", + "php": "^7.2|^8", + "php-http/client-implementation": "^1", + "php-http/discovery": "^1.14", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.1", + "symfony/http-foundation": "^2.1|^3|^4|^5|^6|^7" + }, + "require-dev": { + "http-interop/http-factory-guzzle": "^1.1", + "omnipay/tests": "^4.1", + "php-http/guzzle7-adapter": "^1", + "php-http/mock-client": "^1.6", + "squizlabs/php_codesniffer": "^3.8.1" + }, + "suggest": { + "league/omnipay": "The default Omnipay package provides a default HTTP Adapter." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Omnipay\\Common\\": "src/Common" + }, + "classmap": [ + "src/Omnipay.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrian Macneil", + "email": "adrian@adrianmacneil.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + }, + { + "name": "Jason Judge", + "email": "jason.judge@consil.co.uk" + }, + { + "name": "Del" + }, + { + "name": "Omnipay Contributors", + "homepage": "https://github.com/thephpleague/omnipay-common/contributors" + } + ], + "description": "Common components for Omnipay payment processing library", + "homepage": "https://github.com/thephpleague/omnipay-common", + "keywords": [ + "gateway", + "merchant", + "omnipay", + "pay", + "payment", + "purchase" + ], + "support": { + "issues": "https://github.com/thephpleague/omnipay-common/issues", + "source": "https://github.com/thephpleague/omnipay-common/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-03-03T09:25:00+00:00" + }, + { + "name": "omnipay/paypal", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/omnipay-paypal.git", + "reference": "519db61b32ff0c1e56cbec94762b970ee9674f65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/omnipay-paypal/zipball/519db61b32ff0c1e56cbec94762b970ee9674f65", + "reference": "519db61b32ff0c1e56cbec94762b970ee9674f65", + "shasum": "" + }, + "require": { + "omnipay/common": "^3" + }, + "require-dev": { + "omnipay/tests": "^3", + "phpro/grumphp": "^0.14", + "squizlabs/php_codesniffer": "^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Omnipay\\PayPal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrian Macneil", + "email": "adrian@adrianmacneil.com" + }, + { + "name": "Omnipay Contributors", + "homepage": "https://github.com/thephpleague/omnipay-paypal/contributors" + } + ], + "description": "PayPal gateway for Omnipay payment processing library", + "homepage": "https://github.com/thephpleague/omnipay-paypal", + "keywords": [ + "gateway", + "merchant", + "omnipay", + "pay", + "payment", + "paypal", + "purchase" + ], + "support": { + "issues": "https://github.com/thephpleague/omnipay-paypal/issues", + "source": "https://github.com/thephpleague/omnipay-paypal/tree/v3.0.2" + }, + "time": "2018-05-15T10:35:58+00:00" + }, + { + "name": "owasp/phprbac", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/OWASP/rbac.git", + "reference": "1af904f69dcfc61f1a27c90fe8de2bfd574c1a71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OWASP/rbac/zipball/1af904f69dcfc61f1a27c90fe8de2bfd574c1a71", + "reference": "1af904f69dcfc61f1a27c90fe8de2bfd574c1a71", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "PhpRbac": "PhpRbac/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC-BY-SA-3.0" + ], + "authors": [ + { + "name": "AbiusX", + "email": "me@abiusx.com", + "homepage": "http://abiusx.com/", + "role": "Lead Developer" + }, + { + "name": "Jesse Burns", + "email": "jesse.burns@alliancecms.com", + "homepage": "http://www.jbwebware.com", + "role": "Developer" + } + ], + "description": "PHP-RBAC is the de-facto authorization library for PHP. It provides developers with NIST Level 2 Standard Role Based Access Control and more, in the fastest implementation yet.", + "homepage": "http://phprbac.net/", + "keywords": [ + "owasp", + "rbac", + "security" + ], + "support": { + "issues": "https://github.com/OWASP/rbac/issues", + "source": "https://github.com/OWASP/rbac/tree/2.0.0" + }, + "time": "2014-03-14T13:39:52+00:00" + }, + { + "name": "pancakeapp/dompdf", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/pancakeapp/dompdf.git", + "reference": "271714832a1e3f13b7ad6b519649387cfacb9a9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pancakeapp/dompdf/zipball/271714832a1e3f13b7ad6b519649387cfacb9a9d", + "reference": "271714832a1e3f13b7ad6b519649387cfacb9a9d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "phenx/php-font-lib": ">=0.5.4 <1.0.0", + "phenx/php-svg-lib": ">=0.3.3 <1.0.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "autoload-dev": { + "psr-4": { + "Dompdf\\Tests\\": "tests/" + } + }, + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "source": "https://github.com/pancakeapp/dompdf/tree/master" + }, + "time": "2023-01-24T20:02:20+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "payeezy/payeezy-php", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/payeezy/payeezy-php.git", + "reference": "2bbc3bec72a56c16fb6652900f9804740cbea4c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/payeezy/payeezy-php/zipball/2bbc3bec72a56c16fb6652900f9804740cbea4c9", + "reference": "2bbc3bec72a56c16fb6652900f9804740cbea4c9", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Payeezy_": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "payeezy and contributors", + "homepage": "https://github.com/payeezy/payeezy-php/graphs/contributors" + } + ], + "description": "Payeezy PHP Library", + "homepage": "https://developer.payeezy.com/", + "keywords": [ + "api", + "payeezy", + "payment processing" + ], + "support": { + "source": "https://github.com/payeezy/payeezy-php/tree/master" + }, + "time": "2016-07-26T20:54:48+00:00" + }, + { + "name": "pear/math_biginteger", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/pear/Math_BigInteger.git", + "reference": "33d4357543037a458fad3e8c837a01b93104e592" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Math_BigInteger/zipball/33d4357543037a458fad3e8c837a01b93104e592", + "reference": "33d4357543037a458fad3e8c837a01b93104e592", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": ">=4.2.0" + }, + "suggest": { + "ext-bcmath": "Allows using the BCMath extension internally for computation. Faster than native implementation.", + "ext-gmp": "Allows using the GNU Multiple Precision extension internally for computation. If you are doing a lot of computation this is the recommended extension." + }, + "type": "library", + "autoload": { + "psr-0": { + "Math_": "./" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net" + } + ], + "description": "Pure-PHP arbitrary precission integer arithmetic library. If GMP or BCMath are available they are used.", + "homepage": "https://github.com/pear/Math_BigInteger", + "keywords": [ + "arbitrary", + "bcmath", + "gmp", + "integer", + "precision" + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Math_BigInteger", + "source": "https://github.com/pear/Math_BigInteger" + }, + "time": "2016-04-12T05:46:52+00:00" + }, + { + "name": "phenx/php-font-lib", + "version": "0.5.6", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "a1681e9793040740a405ac5b189275059e2a9863" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a1681e9793040740a405ac5b189275059e2a9863", + "reference": "a1681e9793040740a405ac5b189275059e2a9863", + "shasum": "" + }, + "require": { + "ext-mbstring": "*" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.6" + }, + "time": "2024-01-29T14:45:26+00:00" + }, + { + "name": "phenx/php-svg-lib", + "version": "0.5.4", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.4" + }, + "time": "2024-04-08T12:52:34+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "time": "2024-10-02T11:20:13+00:00" + }, + { + "name": "php-http/guzzle7-adapter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle7-adapter.git", + "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/03a415fde709c2f25539790fecf4d9a31bc3d0eb", + "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.0", + "php": "^7.3 | ^8.0", + "php-http/httplug": "^2.0", + "psr/http-client": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "php-http/client-integration-tests": "^3.0", + "php-http/message-factory": "^1.1", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "Guzzle 7 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "support": { + "issues": "https://github.com/php-http/guzzle7-adapter/issues", + "source": "https://github.com/php-http/guzzle7-adapter/tree/1.1.0" + }, + "time": "2024-11-26T11:14:36+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.1" + }, + "time": "2024-09-23T11:39:58+00:00" + }, + { + "name": "php-http/message", + "version": "1.16.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.2" + }, + "time": "2024-10-02T11:34:13+00:00" + }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" + }, + { + "name": "php-http/promise", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.1" + }, + "time": "2024-03-15T13:55:21+00:00" + }, + { + "name": "phpseclib/bcmath_compat", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/bcmath_compat.git", + "reference": "ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/bcmath_compat/zipball/ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a", + "reference": "ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a", + "shasum": "" + }, + "require": { + "phpseclib/phpseclib": "^3.0" + }, + "provide": { + "ext-bcmath": "8.1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", + "squizlabs/php_codesniffer": "^3.0" + }, + "suggest": { + "ext-gmp": "Will enable faster math operations" + }, + "type": "library", + "autoload": { + "files": [ + "lib/bcmath.php" + ], + "psr-4": { + "bcmath_compat\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "homepage": "http://phpseclib.sourceforge.net" + } + ], + "description": "PHP 5.x-8.x polyfill for bcmath extension", + "keywords": [ + "BigInteger", + "bcmath", + "bigdecimal", + "math", + "polyfill" + ], + "support": { + "email": "terrafrost@php.net", + "issues": "https://github.com/phpseclib/bcmath_compat/issues", + "source": "https://github.com/phpseclib/bcmath_compat" + }, + "time": "2024-06-06T14:17:54+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.47", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/9d6ca36a6c2dd434765b1071b2644a1c683b385d", + "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.47" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2025-10-06T01:07:24+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "riverline/multipart-parser", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Riverline/multipart-parser.git", + "reference": "c9498351b43e19ce6f9410b9c042d59a20ec9fe0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Riverline/multipart-parser/zipball/c9498351b43e19ce6f9410b9c042d59a20ec9fe0", + "reference": "c9498351b43e19ce6f9410b9c042d59a20ec9fe0", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.0" + }, + "require-dev": { + "laminas/laminas-diactoros": "*", + "phpunit/phpunit": "*", + "psr/http-message": "*", + "symfony/psr-http-message-bridge": "*" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Riverline\\MultiPartParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Romain Cambien", + "email": "romain@cambien.net" + }, + { + "name": "Riverline", + "homepage": "http://www.riverline.fr" + } + ], + "description": "One class library to parse multipart content with encoding and charset support.", + "keywords": [ + "http", + "multipart", + "parser" + ], + "support": { + "issues": "https://github.com/Riverline/multipart-parser/issues", + "source": "https://github.com/Riverline/multipart-parser/tree/master" + }, + "time": "2025-04-29T14:26:43+00:00" + }, + { + "name": "sabberworm/php-css-parser", + "version": "v8.6.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d2fb94a9641be84d79c7548c6d39bbebba6e9a70", + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=5.6.20" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.27" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.6.0" + }, + "time": "2024-07-01T07:33:21+00:00" + }, + { + "name": "spatie/once", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/once.git", + "reference": "e6c13ae474a7d4b30975ef6a502a593874ac12d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/once/zipball/e6c13ae474a7d4b30975ef6a502a593874ac12d2", + "reference": "e6c13ae474a7d4b30975ef6a502a593874ac12d2", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Spatie\\Once\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A magic memoization function", + "homepage": "https://github.com/spatie/once", + "keywords": [ + "cache", + "callable", + "memozation", + "once", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/once/issues", + "source": "https://github.com/spatie/once/tree/2.2.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2020-10-29T18:22:10+00:00" + }, + { + "name": "stripe/stripe-php", + "version": "v7.128.0", + "source": { + "type": "git", + "url": "https://github.com/stripe/stripe-php.git", + "reference": "c704949c49b72985c76cc61063aa26fefbd2724e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/c704949c49b72985c76cc61063aa26fefbd2724e", + "reference": "c704949c49b72985c76cc61063aa26fefbd2724e", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.5.0", + "phpstan/phpstan": "^1.2", + "phpunit/phpunit": "^5.7 || ^9.0", + "squizlabs/php_codesniffer": "^3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Stripe\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "description": "Stripe PHP Library", + "homepage": "https://stripe.com/", + "keywords": [ + "api", + "payment processing", + "stripe" + ], + "support": { + "issues": "https://github.com/stripe/stripe-php/issues", + "source": "https://github.com/stripe/stripe-php/tree/v7.128.0" + }, + "time": "2022-05-05T17:18:02+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "abandoned": "symfony/mailer", + "time": "2021-10-18T15:26:12+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.50", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1a0706e8b8041046052ea2695eb8aeee04f97609", + "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.50" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-03T12:58:48+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/5f3b930437ae03ae5dff61269024d8ea1b3774aa", + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-17T14:58:18+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "metapackage", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-07T11:39:36+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "1069c7a3fca74578022fab6f81643248d02f8e63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63", + "reference": "1069c7a3fca74578022fab6f81643248d02f8e63", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^1.43|^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v4.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-10-03T15:15:11+00:00" + } + ], "packages-dev": [], "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, + "minimum-stability": "dev", + "stability-flags": { + "erusev/parsedown": 20, + "html2text/html2text": 20, + "pancakeapp/dompdf": 20, + "payeezy/payeezy-php": 20 + }, + "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.3", + "php": "^8.0", "ext-gd": "*", "ext-dom": "*", "ext-curl": "*", - "ext-mbstring": "*" + "ext-mbstring": "*", + "ext-json": "*" }, "platform-dev": {}, "plugin-api-version": "2.9.0" diff --git a/vendor/aws/aws-crt-php/CODE_OF_CONDUCT.md b/vendor/aws/aws-crt-php/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..5b627cf --- /dev/null +++ b/vendor/aws/aws-crt-php/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +## Code of Conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. diff --git a/vendor/aws/aws-crt-php/LICENSE b/vendor/aws/aws-crt-php/LICENSE new file mode 100644 index 0000000..67db858 --- /dev/null +++ b/vendor/aws/aws-crt-php/LICENSE @@ -0,0 +1,175 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/vendor/aws/aws-crt-php/NOTICE b/vendor/aws/aws-crt-php/NOTICE new file mode 100644 index 0000000..616fc58 --- /dev/null +++ b/vendor/aws/aws-crt-php/NOTICE @@ -0,0 +1 @@ +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/vendor/aws/aws-crt-php/composer.json b/vendor/aws/aws-crt-php/composer.json new file mode 100644 index 0000000..13e7ac6 --- /dev/null +++ b/vendor/aws/aws-crt-php/composer.json @@ -0,0 +1,35 @@ +{ + "name": "aws/aws-crt-php", + "homepage": "https://github.com/awslabs/aws-crt-php", + "description": "AWS Common Runtime for PHP", + "keywords": ["aws","amazon","sdk","crt"], + "type": "library", + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "minimum-stability": "alpha", + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit":"^4.8.35||^5.6.3||^9.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "suggest": { + "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." + }, + "scripts": { + "test": "./dev-scripts/run_tests.sh", + "test-extension": "@test", + "test-win": ".\\dev-scripts\\run_tests.bat" + }, + "license": "Apache-2.0" +} diff --git a/vendor/aws/aws-crt-php/format-check.py b/vendor/aws/aws-crt-php/format-check.py new file mode 100755 index 0000000..35ac46e --- /dev/null +++ b/vendor/aws/aws-crt-php/format-check.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import argparse +import os +from pathlib import Path +import re +from subprocess import list2cmdline, run +from tempfile import NamedTemporaryFile + +CLANG_FORMAT_VERSION = '18.1.6' + +INCLUDE_REGEX = re.compile(r'^ext/.*\.(c|h|inl)$') +EXCLUDE_REGEX = re.compile(r'^$') + +arg_parser = argparse.ArgumentParser(description="Check with clang-format") +arg_parser.add_argument('-i', '--inplace-edit', action='store_true', + help="Edit files inplace") +args = arg_parser.parse_args() + +os.chdir(Path(__file__).parent) + +# create file containing list of all files to format +filepaths_file = NamedTemporaryFile(delete=False) +for dirpath, dirnames, filenames in os.walk('.'): + for filename in filenames: + # our regexes expect filepath to use forward slash + filepath = Path(dirpath, filename).as_posix() + if not INCLUDE_REGEX.match(filepath): + continue + if EXCLUDE_REGEX.match(filepath): + continue + + filepaths_file.write(f"{filepath}\n".encode()) +filepaths_file.close() + +# use pipx to run clang-format from PyPI +# this is a simple way to run the same clang-format version regardless of OS +cmd = ['pipx', 'run', f'clang-format=={CLANG_FORMAT_VERSION}', + f'--files={filepaths_file.name}'] +if args.inplace_edit: + cmd += ['-i'] +else: + cmd += ['--Werror', '--dry-run'] + +print(f"{Path.cwd()}$ {list2cmdline(cmd)}") +if run(cmd).returncode: + exit(1) diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/AwsCredentials.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/AwsCredentials.php new file mode 100644 index 0000000..6f6acee --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/AwsCredentials.php @@ -0,0 +1,69 @@ + '', + 'secret_access_key' => '', + 'session_token' => '', + 'expiration_timepoint_seconds' => 0, + ]; + } + + private $access_key_id; + private $secret_access_key; + private $session_token; + private $expiration_timepoint_seconds = 0; + + public function __get($name) { + return $this->$name; + } + + function __construct(array $options = []) { + parent::__construct(); + + $options = new Options($options, self::defaults()); + $this->access_key_id = $options->access_key_id->asString(); + $this->secret_access_key = $options->secret_access_key->asString(); + $this->session_token = $options->session_token ? $options->session_token->asString() : null; + $this->expiration_timepoint_seconds = $options->expiration_timepoint_seconds->asInt(); + + if (strlen($this->access_key_id) == 0) { + throw new \InvalidArgumentException("access_key_id must be provided"); + } + if (strlen($this->secret_access_key) == 0) { + throw new \InvalidArgumentException("secret_access_key must be provided"); + } + + $creds_options = self::$crt->aws_credentials_options_new(); + self::$crt->aws_credentials_options_set_access_key_id($creds_options, $this->access_key_id); + self::$crt->aws_credentials_options_set_secret_access_key($creds_options, $this->secret_access_key); + self::$crt->aws_credentials_options_set_session_token($creds_options, $this->session_token); + self::$crt->aws_credentials_options_set_expiration_timepoint_seconds($creds_options, $this->expiration_timepoint_seconds); + $this->acquire(self::$crt->aws_credentials_new($creds_options)); + self::$crt->aws_credentials_options_release($creds_options); + } + + function __destruct() { + self::$crt->aws_credentials_release($this->release()); + parent::__destruct(); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/CredentialsProvider.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/CredentialsProvider.php new file mode 100644 index 0000000..e9d3588 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/CredentialsProvider.php @@ -0,0 +1,23 @@ +credentials_provider_release($this->release()); + parent::__destruct(); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signable.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signable.php new file mode 100644 index 0000000..100b56a --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/Signable.php @@ -0,0 +1,43 @@ +signable_new_from_http_request($http_message->native); + }); + } + + public static function fromChunk($chunk_stream, $previous_signature="") { + if (!($chunk_stream instanceof InputStream)) { + $chunk_stream = new InputStream($chunk_stream); + } + return new Signable(function() use($chunk_stream, $previous_signature) { + return self::$crt->signable_new_from_chunk($chunk_stream->native, $previous_signature); + }); + } + + public static function fromCanonicalRequest($canonical_request) { + return new Signable(function() use($canonical_request) { + return self::$crt->signable_new_from_canonical_request($canonical_request); + }); + } + + protected function __construct($ctor) { + parent::__construct(); + $this->acquire($ctor()); + } + + function __destruct() { + self::$crt->signable_release($this->release()); + parent::__destruct(); + } +} \ No newline at end of file diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignatureType.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignatureType.php new file mode 100644 index 0000000..3d3b99f --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SignatureType.php @@ -0,0 +1,15 @@ +sign_request_aws($signable->native, $signing_config->native, + function($result, $error_code) use ($on_complete) { + $signing_result = SigningResult::fromNative($result); + $on_complete($signing_result, $error_code); + }, null); + } + + static function testVerifySigV4ASigning($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y) { + return self::$crt->test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningAlgorithm.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningAlgorithm.php new file mode 100644 index 0000000..dd11059 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningAlgorithm.php @@ -0,0 +1,11 @@ + SigningAlgorithm::SIGv4, + 'signature_type' => SignatureType::HTTP_REQUEST_HEADERS, + 'credentials_provider' => null, + 'region' => null, + 'service' => null, + 'use_double_uri_encode' => false, + 'should_normalize_uri_path' => false, + 'omit_session_token' => false, + 'signed_body_value' => null, + 'signed_body_header_type' => SignedBodyHeaderType::NONE, + 'expiration_in_seconds' => 0, + 'date' => time(), + 'should_sign_header' => null, + ]; + } + + private $options; + + public function __construct(array $options = []) { + parent::__construct(); + $this->options = $options = new Options($options, self::defaults()); + $sc = $this->acquire(self::$crt->signing_config_aws_new()); + self::$crt->signing_config_aws_set_algorithm($sc, $options->algorithm->asInt()); + self::$crt->signing_config_aws_set_signature_type($sc, $options->signature_type->asInt()); + if ($credentials_provider = $options->credentials_provider->asObject()) { + self::$crt->signing_config_aws_set_credentials_provider( + $sc, + $credentials_provider->native); + } + self::$crt->signing_config_aws_set_region( + $sc, $options->region->asString()); + self::$crt->signing_config_aws_set_service( + $sc, $options->service->asString()); + self::$crt->signing_config_aws_set_use_double_uri_encode( + $sc, $options->use_double_uri_encode->asBool()); + self::$crt->signing_config_aws_set_should_normalize_uri_path( + $sc, $options->should_normalize_uri_path->asBool()); + self::$crt->signing_config_aws_set_omit_session_token( + $sc, $options->omit_session_token->asBool()); + self::$crt->signing_config_aws_set_signed_body_value( + $sc, $options->signed_body_value->asString()); + self::$crt->signing_config_aws_set_signed_body_header_type( + $sc, $options->signed_body_header_type->asInt()); + self::$crt->signing_config_aws_set_expiration_in_seconds( + $sc, $options->expiration_in_seconds->asInt()); + self::$crt->signing_config_aws_set_date($sc, $options->date->asInt()); + if ($should_sign_header = $options->should_sign_header->asCallable()) { + self::$crt->signing_config_aws_set_should_sign_header_fn($sc, $should_sign_header); + } + } + + function __destruct() + { + self::$crt->signing_config_aws_release($this->release()); + parent::__destruct(); + } + + public function __get($name) { + return $this->options->get($name); + } +} \ No newline at end of file diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningResult.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningResult.php new file mode 100644 index 0000000..b8a4ab5 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/SigningResult.php @@ -0,0 +1,33 @@ +acquire($native); + } + + function __destruct() { + // No destruction necessary, SigningResults are transient, just release + $this->release(); + parent::__destruct(); + } + + public static function fromNative($ptr) { + return new SigningResult($ptr); + } + + public function applyToHttpRequest(&$http_request) { + self::$crt->signing_result_apply_to_http_request($this->native, $http_request->native); + // Update http_request from native + $http_request = Request::unmarshall($http_request->toBlob()); + } +} \ No newline at end of file diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/StaticCredentialsProvider.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/StaticCredentialsProvider.php new file mode 100644 index 0000000..8dc6249 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Auth/StaticCredentialsProvider.php @@ -0,0 +1,35 @@ +$name; + } + + function __construct(array $options = []) { + parent::__construct(); + $this->credentials = new AwsCredentials($options); + + $provider_options = self::$crt->credentials_provider_static_options_new(); + self::$crt->credentials_provider_static_options_set_access_key_id($provider_options, $this->credentials->access_key_id); + self::$crt->credentials_provider_static_options_set_secret_access_key($provider_options, $this->credentials->secret_access_key); + self::$crt->credentials_provider_static_options_set_session_token($provider_options, $this->credentials->session_token); + $this->acquire(self::$crt->credentials_provider_static_new($provider_options)); + self::$crt->credentials_provider_static_options_release($provider_options); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/CRT.php b/vendor/aws/aws-crt-php/src/AWS/CRT/CRT.php new file mode 100644 index 0000000..d196a47 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/CRT.php @@ -0,0 +1,358 @@ +aws_crt_last_error(); + } + + /** + * @param integer $error Error code from the CRT, usually delivered via callback or {@see last_error} + * @return string Human-readable description of the provided error code + */ + public static function error_str($error) { + return self::$impl->aws_crt_error_str((int) $error); + } + + /** + * @param integer $error Error code from the CRT, usually delivered via callback or {@see last_error} + * @return string Name/enum identifier for the provided error code + */ + public static function error_name($error) { + return self::$impl->aws_crt_error_name((int) $error); + } + + public static function log_to_stdout() { + return self::$impl->aws_crt_log_to_stdout(); + } + + public static function log_to_stderr() { + return self::$impl->aws_crt_log_to_stderr(); + } + + public static function log_to_file($filename) { + return self::$impl->aws_crt_log_to_file($filename); + } + + public static function log_to_stream($stream) { + return self::$impl->aws_crt_log_to_stream($stream); + } + + public static function log_set_level($level) { + return self::$impl->aws_crt_log_set_level($level); + } + + public static function log_stop() { + return self::$impl->aws_crt_log_stop(); + } + + public static function log_message($level, $message) { + return self::$impl->aws_crt_log_message($level, $message); + } + + /** + * @return object Pointer to native event_loop_group_options + */ + function event_loop_group_options_new() { + return self::$impl->aws_crt_event_loop_group_options_new(); + } + + /** + * @param object $elg_options Pointer to native event_loop_group_options + */ + function event_loop_group_options_release($elg_options) { + self::$impl->aws_crt_event_loop_group_options_release($elg_options); + } + + /** + * @param object $elg_options Pointer to native event_loop_group_options + * @param integer $max_threads Maximum number of threads to allow the event loop group to use, default: 0/1 per CPU core + */ + function event_loop_group_options_set_max_threads($elg_options, $max_threads) { + self::$impl->aws_crt_event_loop_group_options_set_max_threads($elg_options, (int)$max_threads); + } + + /** + * @param object Pointer to event_loop_group_options, {@see event_loop_group_options_new} + * @return object Pointer to the new event loop group + */ + function event_loop_group_new($options) { + return self::$impl->aws_crt_event_loop_group_new($options); + } + + /** + * @param object $elg Pointer to the event loop group to release + */ + function event_loop_group_release($elg) { + self::$impl->aws_crt_event_loop_group_release($elg); + } + + /** + * return object Pointer to native AWS credentials options + */ + function aws_credentials_options_new() { + return self::$impl->aws_crt_credentials_options_new(); + } + + function aws_credentials_options_release($options) { + self::$impl->aws_crt_credentials_options_release($options); + } + + function aws_credentials_options_set_access_key_id($options, $access_key_id) { + self::$impl->aws_crt_credentials_options_set_access_key_id($options, $access_key_id); + } + + function aws_credentials_options_set_secret_access_key($options, $secret_access_key) { + self::$impl->aws_crt_credentials_options_set_secret_access_key($options, $secret_access_key); + } + + function aws_credentials_options_set_session_token($options, $session_token) { + self::$impl->aws_crt_credentials_options_set_session_token($options, $session_token); + } + + function aws_credentials_options_set_expiration_timepoint_seconds($options, $expiration_timepoint_seconds) { + self::$impl->aws_crt_credentials_options_set_expiration_timepoint_seconds($options, $expiration_timepoint_seconds); + } + + function aws_credentials_new($options) { + return self::$impl->aws_crt_credentials_new($options); + } + + function aws_credentials_release($credentials) { + self::$impl->aws_crt_credentials_release($credentials); + } + + function credentials_provider_release($provider) { + self::$impl->aws_crt_credentials_provider_release($provider); + } + + function credentials_provider_static_options_new() { + return self::$impl->aws_crt_credentials_provider_static_options_new(); + } + + function credentials_provider_static_options_release($options) { + self::$impl->aws_crt_credentials_provider_static_options_release($options); + } + + function credentials_provider_static_options_set_access_key_id($options, $access_key_id) { + self::$impl->aws_crt_credentials_provider_static_options_set_access_key_id($options, $access_key_id); + } + + function credentials_provider_static_options_set_secret_access_key($options, $secret_access_key) { + self::$impl->aws_crt_credentials_provider_static_options_set_secret_access_key($options, $secret_access_key); + } + + function credentials_provider_static_options_set_session_token($options, $session_token) { + self::$impl->aws_crt_credentials_provider_static_options_set_session_token($options, $session_token); + } + + function credentials_provider_static_new($options) { + return self::$impl->aws_crt_credentials_provider_static_new($options); + } + + function input_stream_options_new() { + return self::$impl->aws_crt_input_stream_options_new(); + } + + function input_stream_options_release($options) { + self::$impl->aws_crt_input_stream_options_release($options); + } + + function input_stream_options_set_user_data($options, $user_data) { + self::$impl->aws_crt_input_stream_options_set_user_data($options, $user_data); + } + + function input_stream_new($options) { + return self::$impl->aws_crt_input_stream_new($options); + } + + function input_stream_release($stream) { + self::$impl->aws_crt_input_stream_release($stream); + } + + function input_stream_seek($stream, $offset, $basis) { + return self::$impl->aws_crt_input_stream_seek($stream, $offset, $basis); + } + + function input_stream_read($stream, $length) { + return self::$impl->aws_crt_input_stream_read($stream, $length); + } + + function input_stream_eof($stream) { + return self::$impl->aws_crt_input_stream_eof($stream); + } + + function input_stream_get_length($stream) { + return self::$impl->aws_crt_input_stream_get_length($stream); + } + + function http_message_new_from_blob($blob) { + return self::$impl->aws_crt_http_message_new_from_blob($blob); + } + + function http_message_to_blob($message) { + return self::$impl->aws_crt_http_message_to_blob($message); + } + + function http_message_release($message) { + self::$impl->aws_crt_http_message_release($message); + } + + function signing_config_aws_new() { + return self::$impl->aws_crt_signing_config_aws_new(); + } + + function signing_config_aws_release($signing_config) { + return self::$impl->aws_crt_signing_config_aws_release($signing_config); + } + + function signing_config_aws_set_algorithm($signing_config, $algorithm) { + self::$impl->aws_crt_signing_config_aws_set_algorithm($signing_config, (int)$algorithm); + } + + function signing_config_aws_set_signature_type($signing_config, $signature_type) { + self::$impl->aws_crt_signing_config_aws_set_signature_type($signing_config, (int)$signature_type); + } + + function signing_config_aws_set_credentials_provider($signing_config, $credentials_provider) { + self::$impl->aws_crt_signing_config_aws_set_credentials_provider($signing_config, $credentials_provider); + } + + function signing_config_aws_set_region($signing_config, $region) { + self::$impl->aws_crt_signing_config_aws_set_region($signing_config, $region); + } + + function signing_config_aws_set_service($signing_config, $service) { + self::$impl->aws_crt_signing_config_aws_set_service($signing_config, $service); + } + + function signing_config_aws_set_use_double_uri_encode($signing_config, $use_double_uri_encode) { + self::$impl->aws_crt_signing_config_aws_set_use_double_uri_encode($signing_config, $use_double_uri_encode); + } + + function signing_config_aws_set_should_normalize_uri_path($signing_config, $should_normalize_uri_path) { + self::$impl->aws_crt_signing_config_aws_set_should_normalize_uri_path($signing_config, $should_normalize_uri_path); + } + + function signing_config_aws_set_omit_session_token($signing_config, $omit_session_token) { + self::$impl->aws_crt_signing_config_aws_set_omit_session_token($signing_config, $omit_session_token); + } + + function signing_config_aws_set_signed_body_value($signing_config, $signed_body_value) { + self::$impl->aws_crt_signing_config_aws_set_signed_body_value($signing_config, $signed_body_value); + } + + function signing_config_aws_set_signed_body_header_type($signing_config, $signed_body_header_type) { + self::$impl->aws_crt_signing_config_aws_set_signed_body_header_type($signing_config, $signed_body_header_type); + } + + function signing_config_aws_set_expiration_in_seconds($signing_config, $expiration_in_seconds) { + self::$impl->aws_crt_signing_config_aws_set_expiration_in_seconds($signing_config, $expiration_in_seconds); + } + + function signing_config_aws_set_date($signing_config, $timestamp) { + self::$impl->aws_crt_signing_config_aws_set_date($signing_config, $timestamp); + } + + function signing_config_aws_set_should_sign_header_fn($signing_config, $should_sign_header_fn) { + self::$impl->aws_crt_signing_config_aws_set_should_sign_header_fn($signing_config, $should_sign_header_fn); + } + + function signable_new_from_http_request($http_message) { + return self::$impl->aws_crt_signable_new_from_http_request($http_message); + } + + function signable_new_from_chunk($chunk_stream, $previous_signature) { + return self::$impl->aws_crt_signable_new_from_chunk($chunk_stream, $previous_signature); + } + + function signable_new_from_canonical_request($canonical_request) { + return self::$impl->aws_crt_signable_new_from_canonical_request($canonical_request); + } + + function signable_release($signable) { + self::$impl->aws_crt_signable_release($signable); + } + + function signing_result_release($signing_result) { + self::$impl->aws_crt_signing_result_release($signing_result); + } + + function signing_result_apply_to_http_request($signing_result, $http_message) { + return self::$impl->aws_crt_signing_result_apply_to_http_request( + $signing_result, $http_message); + } + + function sign_request_aws($signable, $signing_config, $on_complete, $user_data) { + return self::$impl->aws_crt_sign_request_aws($signable, $signing_config, $on_complete, $user_data); + } + + function test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y) { + return self::$impl->aws_crt_test_verify_sigv4a_signing($signable, $signing_config, $expected_canonical_request, $signature, $ecc_key_pub_x, $ecc_key_pub_y); + } + + public static function crc32($input, $previous = 0) { + return self::$impl->aws_crt_crc32($input, $previous); + } + + public static function crc32c($input, $previous = 0) { + return self::$impl->aws_crt_crc32c($input, $previous); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Headers.php b/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Headers.php new file mode 100644 index 0000000..8d1457c --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Headers.php @@ -0,0 +1,50 @@ +headers = $headers; + } + + public static function marshall($headers) { + $buf = ""; + foreach ($headers->headers as $header => $value) { + $buf .= Encoding::encodeString($header); + $buf .= Encoding::encodeString($value); + } + return $buf; + } + + public static function unmarshall($buf) { + $strings = Encoding::readStrings($buf); + $headers = []; + for ($idx = 0; $idx < count($strings);) { + $headers[$strings[$idx++]] = $strings[$idx++]; + } + return new Headers($headers); + } + + public function count() { + return count($this->headers); + } + + public function get($header) { + return isset($this->headers[$header]) ? $this->headers[$header] : null; + } + + public function set($header, $value) { + $this->headers[$header] = $value; + } + + public function toArray() { + return $this->headers; + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Message.php b/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Message.php new file mode 100644 index 0000000..a8c151f --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Message.php @@ -0,0 +1,95 @@ +method = $method; + $this->path = $path; + $this->query = $query; + $this->headers = new Headers($headers); + $this->acquire(self::$crt->http_message_new_from_blob(self::marshall($this))); + } + + public function __destruct() { + self::$crt->http_message_release($this->release()); + parent::__destruct(); + } + + public function toBlob() { + return self::$crt->http_message_to_blob($this->native); + } + + protected static function marshall($msg) { + $buf = ""; + $buf .= Encoding::encodeString($msg->method); + $buf .= Encoding::encodeString($msg->pathAndQuery()); + $buf .= Headers::marshall($msg->headers); + return $buf; + } + + protected static function _unmarshall($buf, $class=Message::class) { + $method = Encoding::readString($buf); + $path_and_query = Encoding::readString($buf); + $parts = explode("?", $path_and_query, 2); + $path = isset($parts[0]) ? $parts[0] : ""; + $query = isset($parts[1]) ? $parts[1] : ""; + $headers = Headers::unmarshall($buf); + + // Turn query params back into a dictionary + if (strlen($query)) { + $query = rawurldecode($query); + $query = explode("&", $query); + $query = array_reduce($query, function($params, $pair) { + list($param, $value) = explode("=", $pair, 2); + $params[$param] = $value; + return $params; + }, []); + } else { + $query = []; + } + + return new $class($method, $path, $query, $headers->toArray()); + } + + public function pathAndQuery() { + $path = $this->path; + $queries = []; + foreach ($this->query as $param => $value) { + $queries []= urlencode($param) . "=" . urlencode($value); + } + $query = implode("&", $queries); + if (strlen($query)) { + $path = implode("?", [$path, $query]); + } + return $path; + } + + public function method() { + return $this->method; + } + + public function path() { + return $this->path; + } + + public function query() { + return $this->query; + } + + public function headers() { + return $this->headers; + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Request.php b/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Request.php new file mode 100644 index 0000000..bec4ac1 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Request.php @@ -0,0 +1,32 @@ +body_stream = $body_stream; + } + + public static function marshall($request) { + return parent::marshall($request); + } + + public static function unmarshall($buf) { + return parent::_unmarshall($buf, Request::class); + } + + public function body_stream() { + return $this->body_stream; + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Response.php b/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Response.php new file mode 100644 index 0000000..526edc3 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/HTTP/Response.php @@ -0,0 +1,27 @@ +status_code = $status_code; + } + + public static function marshall($response) { + return parent::marshall($response); + } + + public static function unmarshall($buf) { + return parent::_unmarshall($buf, Response::class); + } + + public function status_code() { + return $this->status_code; + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/IO/EventLoopGroup.php b/vendor/aws/aws-crt-php/src/AWS/CRT/IO/EventLoopGroup.php new file mode 100644 index 0000000..7e989e7 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/IO/EventLoopGroup.php @@ -0,0 +1,39 @@ + 0, + ]; + } + + function __construct(array $options = []) { + parent::__construct(); + $options = new Options($options, self::defaults()); + $elg_options = self::$crt->event_loop_group_options_new(); + self::$crt->event_loop_group_options_set_max_threads($elg_options, $options->getInt('max_threads')); + $this->acquire(self::$crt->event_loop_group_new($elg_options)); + self::$crt->event_loop_group_options_release($elg_options); + } + + function __destruct() { + self::$crt->event_loop_group_release($this->release()); + parent::__destruct(); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/IO/InputStream.php b/vendor/aws/aws-crt-php/src/AWS/CRT/IO/InputStream.php new file mode 100644 index 0000000..6aef709 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/IO/InputStream.php @@ -0,0 +1,50 @@ +stream = $stream; + $options = self::$crt->input_stream_options_new(); + // The stream implementation in native just converts the PHP stream into + // a native php_stream* and executes operations entirely in native + self::$crt->input_stream_options_set_user_data($options, $stream); + $this->acquire(self::$crt->input_stream_new($options)); + self::$crt->input_stream_options_release($options); + } + + public function __destruct() { + $this->release(); + parent::__destruct(); + } + + public function eof() { + return self::$crt->input_stream_eof($this->native); + } + + public function length() { + return self::$crt->input_stream_get_length($this->native); + } + + public function read($length = 0) { + if ($length == 0) { + $length = $this->length(); + } + return self::$crt->input_stream_read($this->native, $length); + } + + public function seek($offset, $basis) { + return self::$crt->input_stream_seek($this->native, $offset, $basis); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Encoding.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Encoding.php new file mode 100644 index 0000000..7c62559 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Internal/Encoding.php @@ -0,0 +1,37 @@ += self::NONE && $level <= self::TRACE); + CRT::log_set_level($level); + } + + public static function log($level, $message) { + CRT::log_message($level, $message); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/NativeResource.php b/vendor/aws/aws-crt-php/src/AWS/CRT/NativeResource.php new file mode 100644 index 0000000..528df75 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/NativeResource.php @@ -0,0 +1,42 @@ +native = $handle; + } + + protected function release() { + $native = $this->native; + $this->native = null; + return $native; + } + + function __destruct() { + // Should have been destroyed and released by derived resource + assert($this->native == null); + unset(self::$resources[spl_object_hash($this)]); + } +} diff --git a/vendor/aws/aws-crt-php/src/AWS/CRT/Options.php b/vendor/aws/aws-crt-php/src/AWS/CRT/Options.php new file mode 100644 index 0000000..363a396 --- /dev/null +++ b/vendor/aws/aws-crt-php/src/AWS/CRT/Options.php @@ -0,0 +1,77 @@ +value = $value; + } + + public function asObject() { + return $this->value; + } + + public function asMixed() { + return $this->value; + } + + public function asInt() { + return empty($this->value) ? 0 : (int)$this->value; + } + + public function asBool() { + return boolval($this->value); + } + + public function asString() { + return !empty($this->value) ? strval($this->value) : ""; + } + + public function asArray() { + return is_array($this->value) ? $this->value : (!empty($this->value) ? [$this->value] : []); + } + + public function asCallable() { + return is_callable($this->value) ? $this->value : null; + } +} + +final class Options { + private $options; + + public function __construct($opts = [], $defaults = []) { + $this->options = array_replace($defaults, empty($opts) ? [] : $opts); + } + + public function __get($name) { + return $this->get($name); + } + + public function asArray() { + return $this->options; + } + + public function toArray() { + return array_merge_recursive([], $this->options); + } + + public function get($name) { + return new OptionValue($this->options[$name]); + } + + public function getInt($name) { + return $this->get($name)->asInt(); + } + + public function getString($name) { + return $this->get($name)->asString(); + } + + public function getBool($name) { + return $this->get($name)->asBool(); + } +} diff --git a/vendor/aws/aws-sdk-php/CODE_OF_CONDUCT.md b/vendor/aws/aws-sdk-php/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..5dccd4c --- /dev/null +++ b/vendor/aws/aws-sdk-php/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +## Code of Conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. \ No newline at end of file diff --git a/vendor/aws/aws-sdk-php/CRT_INSTRUCTIONS.md b/vendor/aws/aws-sdk-php/CRT_INSTRUCTIONS.md new file mode 100644 index 0000000..047b4b0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/CRT_INSTRUCTIONS.md @@ -0,0 +1,4 @@ +## Building and enabling the Common Run Time + +1. **Follow instructions on crt repo** – Clone and build the repo as shown [here][https://github.com/awslabs/aws-crt-php]. +1. **Enable the CRT** – add the following line to your php.ini file `extension=path/to/aws-crt-php/modules/awscrt.so` \ No newline at end of file diff --git a/vendor/aws/aws-sdk-php/LICENSE b/vendor/aws/aws-sdk-php/LICENSE new file mode 100644 index 0000000..8d53e9f --- /dev/null +++ b/vendor/aws/aws-sdk-php/LICENSE @@ -0,0 +1,141 @@ +# Apache License +Version 2.0, January 2004 + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +## 1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 +through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the +License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled +by, or are under common control with that entity. For the purposes of this definition, "control" means +(i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract +or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial +ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software +source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, +including but not limited to compiled object code, generated documentation, and conversions to other media +types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, +as indicated by a copyright notice that is included in or attached to the work (an example is provided in the +Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) +the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not +include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work +and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any +modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to +Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to +submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or its representatives, including but not +limited to communication on electronic mailing lists, source code control systems, and issue tracking systems +that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been +received by Licensor and subsequently incorporated within the Work. + +## 2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare +Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +## 3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent +license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such +license applies only to those patent claims licensable by such Contributor that are necessarily infringed by +their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such +Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim +or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work +constitutes direct or contributory patent infringement, then any patent licenses granted to You under this +License for that Work shall terminate as of the date such litigation is filed. + +## 4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + + 2. You must cause any modified files to carry prominent notices stating that You changed the files; and + + 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, + trademark, and attribution notices from the Source form of the Work, excluding those notices that do + not pertain to any part of the Derivative Works; and + + 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that + You distribute must include a readable copy of the attribution notices contained within such NOTICE + file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed as part of the Derivative Works; within + the Source form or documentation, if provided along with the Derivative Works; or, within a display + generated by the Derivative Works, if and wherever such third-party notices normally appear. The + contents of the NOTICE file are for informational purposes only and do not modify the License. You may + add Your own attribution notices within Derivative Works that You distribute, alongside or as an + addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be + construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license +terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative +Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the +conditions stated in this License. + +## 5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by +You to the Licensor shall be under the terms and conditions of this License, without any additional terms or +conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate +license agreement you may have executed with Licensor regarding such Contributions. + +## 6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, service marks, or product names of +the Licensor, except as required for reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +## 7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor +provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, +MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +## 8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless +required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any +Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential +damages of any character arising as a result of this License or out of the use or inability to use the Work +(including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has been advised of the possibility +of such damages. + +## 9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, +acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole +responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold +each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/vendor/aws/aws-sdk-php/NOTICE b/vendor/aws/aws-sdk-php/NOTICE new file mode 100644 index 0000000..e231afd --- /dev/null +++ b/vendor/aws/aws-sdk-php/NOTICE @@ -0,0 +1,17 @@ +# AWS SDK for PHP + + + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"). +You may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/aws/aws-sdk-php/THIRD-PARTY-LICENSES b/vendor/aws/aws-sdk-php/THIRD-PARTY-LICENSES new file mode 100644 index 0000000..6f7dc62 --- /dev/null +++ b/vendor/aws/aws-sdk-php/THIRD-PARTY-LICENSES @@ -0,0 +1,84 @@ +The AWS SDK for PHP includes the following third-party software/licensing: + + +** Guzzle - https://github.com/guzzle/guzzle + +Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------- + +** jmespath.php - https://github.com/mtdowling/jmespath.php + +Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +---------------- + +** phpunit-mock-objects -- https://github.com/sebastianbergmann/phpunit-mock-objects + +Copyright (c) 2002-2018, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/vendor/aws/aws-sdk-php/composer.json b/vendor/aws/aws-sdk-php/composer.json new file mode 100644 index 0000000..f992495 --- /dev/null +++ b/vendor/aws/aws-sdk-php/composer.json @@ -0,0 +1,73 @@ +{ + "name": "aws/aws-sdk-php", + "homepage": "http://aws.amazon.com/sdkforphp", + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "keywords": ["aws","amazon","sdk","s3","ec2","dynamodb","cloud","glacier"], + "type": "library", + "license": "Apache-2.0", + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "support": { + "forum": "https://github.com/aws/aws-sdk-php/discussions", + "issues": "https://github.com/aws/aws-sdk-php/issues" + }, + "require": { + "php": ">=8.1", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.4.5", + "guzzlehttp/promises": "^2.0", + "mtdowling/jmespath.php": "^2.8.0", + "ext-pcre": "*", + "ext-json": "*", + "ext-simplexml": "*", + "aws/aws-crt-php": "^1.2.3", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "composer/composer" : "^2.7.8", + "ext-openssl": "*", + "ext-dom": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", + "behat/behat": "~3.0", + "doctrine/cache": "~1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "andrewsville/php-token-reflection": "^1.4", + "psr/cache": "^2.0 || ^3.0", + "psr/simple-cache": "^2.0 || ^3.0", + "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", + "symfony/filesystem": "^v6.4.0 || ^v7.1.0", + "yoast/phpunit-polyfills": "^2.0", + "dms/phpunit-arraysubset-asserts": "^0.4.0" + }, + "suggest": { + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-curl": "To send requests using cURL", + "ext-sockets": "To use client-side monitoring", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications" + }, + "autoload": { + "psr-4": { + "Aws\\": "src/" + }, + "files": ["src/functions.php"], + "exclude-from-classmap": ["src/data/"] + }, + "autoload-dev": { + "psr-4": { + "Aws\\Test\\": "tests/" + }, + "classmap": ["build/"] + }, + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/AIOps/AIOpsClient.php b/vendor/aws/aws-sdk-php/src/AIOps/AIOpsClient.php new file mode 100644 index 0000000..bc6d495 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/AIOps/AIOpsClient.php @@ -0,0 +1,31 @@ +get($cacheKey); + if ($found instanceof static::$interfaceClass) { + return Promise\Create::promiseFor($found); + } + + return $provider() + ->then(function ($config) use ( + $cache, + $cacheKey + ) { + $cache->set($cacheKey, $config); + return $config; + }); + }; + } + + /** + * Creates an aggregate configuration provider that invokes the provided + * variadic providers one after the other until a provider returns + * configuration. + * + * @return callable + */ + public static function chain() + { + $links = func_get_args(); + if (empty($links)) { + throw new \InvalidArgumentException('No providers in chain'); + } + + return function () use ($links) { + /** @var callable $parent */ + $parent = array_shift($links); + $promise = $parent(); + while ($next = array_shift($links)) { + $promise = $promise->otherwise($next); + } + return $promise; + }; + } + + /** + * Gets the environment's HOME directory if available. + * + * @return null|string + */ + protected static function getHomeDir() + { + // On Linux/Unix-like systems, use the HOME environment variable + if ($homeDir = getenv('HOME')) { + return $homeDir; + } + + // Get the HOMEDRIVE and HOMEPATH values for Windows hosts + $homeDrive = getenv('HOMEDRIVE'); + $homePath = getenv('HOMEPATH'); + + return ($homeDrive && $homePath) ? $homeDrive . $homePath : null; + } + + /** + * Gets default config file location from environment, falling back to aws + * default location + * + * @return string + */ + protected static function getDefaultConfigFilename() + { + if ($filename = getenv(self::ENV_CONFIG_FILE)) { + return $filename; + } + return self::getHomeDir() . '/.aws/config'; + } + + /** + * Wraps a config provider and caches previously provided configuration. + * + * @param callable $provider Config provider function to wrap. + * + * @return callable + */ + public static function memoize(callable $provider) + { + return function () use ($provider) { + static $result; + static $isConstant; + + // Constant config will be returned constantly. + if ($isConstant) { + return $result; + } + + // Create the initial promise that will be used as the cached value + if (null === $result) { + $result = $provider(); + } + + // Return config and set flag that provider is already set + return $result + ->then(function ($config) use (&$isConstant) { + $isConstant = true; + return $config; + }); + }; + } + + /** + * Reject promise with standardized exception. + * + * @param $msg + * @return Promise\RejectedPromise + */ + protected static function reject($msg) + { + $exceptionClass = static::$exceptionClass; + return new Promise\RejectedPromise(new $exceptionClass($msg)); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/AbstractModel.php b/vendor/aws/aws-sdk-php/src/Api/AbstractModel.php new file mode 100644 index 0000000..2c9b412 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/AbstractModel.php @@ -0,0 +1,89 @@ +definition = $definition; + $this->shapeMap = $shapeMap; + if (isset($definition['contextParam'])) { + $this->contextParam = $definition['contextParam']; + } + } + + public function toArray() + { + return $this->definition; + } + + /** + * @return mixed|null + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + return isset($this->definition[$offset]) + ? $this->definition[$offset] : null; + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetSet($offset, $value) + { + $this->definition[$offset] = $value; + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + return isset($this->definition[$offset]); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetUnset($offset) + { + unset($this->definition[$offset]); + } + + protected function shapeAt($key) + { + if (!isset($this->definition[$key])) { + throw new \InvalidArgumentException('Expected shape definition at ' + . $key); + } + + return $this->shapeFor($this->definition[$key]); + } + + protected function shapeFor(array $definition) + { + return isset($definition['shape']) + ? $this->shapeMap->resolve($definition) + : Shape::create($definition, $this->shapeMap); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ApiProvider.php b/vendor/aws/aws-sdk-php/src/Api/ApiProvider.php new file mode 100644 index 0000000..818ff5d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ApiProvider.php @@ -0,0 +1,244 @@ + 'api-2', + 'paginator' => 'paginators-1', + 'waiter' => 'waiters-2', + 'docs' => 'docs-2', + ]; + + /** @var array API manifest */ + private $manifest; + + /** @var string The directory containing service models. */ + private $modelsDir; + + /** + * Resolves an API provider and ensures a non-null return value. + * + * @param callable $provider Provider function to invoke. + * @param string $type Type of data ('api', 'waiter', 'paginator'). + * @param string $service Service name. + * @param string $version API version. + * + * @return array + * @throws UnresolvedApiException + */ + public static function resolve(callable $provider, $type, $service, $version) + { + // Execute the provider and return the result, if there is one. + $result = $provider($type, $service, $version); + if (is_array($result)) { + if (!isset($result['metadata']['serviceIdentifier'])) { + $result['metadata']['serviceIdentifier'] = $service; + } + return $result; + } + + // Throw an exception with a message depending on the inputs. + if (!isset(self::$typeMap[$type])) { + $msg = "The type must be one of: " . implode(', ', self::$typeMap); + } elseif ($service) { + $msg = "The {$service} service does not have version: {$version}."; + } else { + $msg = "You must specify a service name to retrieve its API data."; + } + + throw new UnresolvedApiException($msg); + } + + /** + * Default SDK API provider. + * + * This provider loads pre-built manifest data from the `data` directory. + * + * @return self + */ + public static function defaultProvider() + { + return new self(__DIR__ . '/../data', \Aws\manifest()); + } + + /** + * Loads API data after resolving the version to the latest, compatible, + * available version based on the provided manifest data. + * + * Manifest data is essentially an associative array of service names to + * associative arrays of API version aliases. + * + * [ + * ... + * 'ec2' => [ + * 'latest' => '2014-10-01', + * '2014-10-01' => '2014-10-01', + * '2014-09-01' => '2014-10-01', + * '2014-06-15' => '2014-10-01', + * ... + * ], + * 'ecs' => [...], + * 'elasticache' => [...], + * ... + * ] + * + * @param string $dir Directory containing service models. + * @param array $manifest The API version manifest data. + * + * @return self + */ + public static function manifest($dir, array $manifest) + { + return new self($dir, $manifest); + } + + /** + * Loads API data from the specified directory. + * + * If "latest" is specified as the version, this provider must glob the + * directory to find which is the latest available version. + * + * @param string $dir Directory containing service models. + * + * @return self + * @throws \InvalidArgumentException if the provided `$dir` is invalid. + */ + public static function filesystem($dir) + { + return new self($dir); + } + + /** + * Retrieves a list of valid versions for the specified service. + * + * @param string $service Service name + * + * @return array + */ + public function getVersions($service) + { + if (!isset($this->manifest)) { + $this->buildVersionsList($service); + } + + if (!isset($this->manifest[$service]['versions'])) { + return []; + } + + return array_values(array_unique($this->manifest[$service]['versions'])); + } + + /** + * Execute the provider. + * + * @param string $type Type of data ('api', 'waiter', 'paginator'). + * @param string $service Service name. + * @param string $version API version. + * + * @return array|null + */ + public function __invoke($type, $service, $version) + { + // Resolve the type or return null. + if (isset(self::$typeMap[$type])) { + $type = self::$typeMap[$type]; + } else { + return null; + } + + // Resolve the version or return null. + if (!isset($this->manifest)) { + $this->buildVersionsList($service); + } + + if (!isset($this->manifest[$service]['versions'][$version])) { + return null; + } + + $version = $this->manifest[$service]['versions'][$version]; + $path = "{$this->modelsDir}/{$service}/{$version}/{$type}.json"; + + try { + return \Aws\load_compiled_json($path); + } catch (\InvalidArgumentException $e) { + return null; + } + } + + /** + * @param string $modelsDir Directory containing service models. + * @param array $manifest The API version manifest data. + */ + private function __construct($modelsDir, ?array $manifest = null) + { + $this->manifest = $manifest; + $this->modelsDir = rtrim($modelsDir, '/'); + if (!is_dir($this->modelsDir)) { + throw new \InvalidArgumentException( + "The specified models directory, {$modelsDir}, was not found." + ); + } + } + + /** + * Build the versions list for the specified service by globbing the dir. + */ + private function buildVersionsList($service) + { + $dir = "{$this->modelsDir}/{$service}/"; + + if (!is_dir($dir)) { + return; + } + + // Get versions, remove . and .., and sort in descending order. + $results = array_diff(scandir($dir, SCANDIR_SORT_DESCENDING), ['..', '.']); + + if (!$results) { + $this->manifest[$service] = ['versions' => []]; + } else { + $this->manifest[$service] = [ + 'versions' => [ + 'latest' => $results[0] + ] + ]; + $this->manifest[$service]['versions'] += array_combine($results, $results); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/DateTimeResult.php b/vendor/aws/aws-sdk-php/src/Api/DateTimeResult.php new file mode 100644 index 0000000..b296abc --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/DateTimeResult.php @@ -0,0 +1,134 @@ +format('Y-m-d H:i:s.u'), + new DateTimeZone('UTC') + ); + } + + /** + * @return DateTimeResult + */ + public static function fromISO8601($iso8601Timestamp) + { + if (is_numeric($iso8601Timestamp) || !is_string($iso8601Timestamp)) { + throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromISO8601'); + } + + // Prior to 8.0.10, nanosecond precision is not supported + // Reduces to microsecond precision if nanosecond precision is detected + if (PHP_VERSION_ID < 80010 + && preg_match(self::ISO8601_NANOSECOND_REGEX, $iso8601Timestamp, $matches) + ) { + $iso8601Timestamp = $matches[1] . ($matches[3] ?? ''); + } + + return new DateTimeResult($iso8601Timestamp); + } + + /** + * Create a new DateTimeResult from an unknown timestamp. + * + * @return DateTimeResult + * @throws Exception + */ + public static function fromTimestamp($timestamp, $expectedFormat = null) + { + if (empty($timestamp)) { + return self::fromEpoch(0); + } + + if (!(is_string($timestamp) || is_numeric($timestamp))) { + throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromTimestamp'); + } + + try { + if ($expectedFormat == 'iso8601') { + try { + return self::fromISO8601($timestamp); + } catch (Exception $exception) { + return self::fromEpoch($timestamp); + } + } else if ($expectedFormat == 'unixTimestamp') { + try { + return self::fromEpoch($timestamp); + } catch (Exception $exception) { + return self::fromISO8601($timestamp); + } + } else if (\Aws\is_valid_epoch($timestamp)) { + return self::fromEpoch($timestamp); + } + return self::fromISO8601($timestamp); + } catch (Exception $exception) { + throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromTimestamp'); + } + } + + /** + * Serialize the DateTimeResult as an ISO 8601 date string. + * + * @return string + */ + public function __toString() + { + return $this->format('c'); + } + + /** + * Serialize the date as an ISO 8601 date when serializing as JSON. + * + * @return string + */ + #[\ReturnTypeWillChange] + public function jsonSerialize() + { + return (string) $this; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/DocModel.php b/vendor/aws/aws-sdk-php/src/Api/DocModel.php new file mode 100644 index 0000000..1a0ecf9 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/DocModel.php @@ -0,0 +1,139 @@ +docs = $docs; + } + + /** + * Convert the doc model to an array. + * + * @return array + */ + public function toArray() + { + return $this->docs; + } + + /** + * Retrieves documentation about the service. + * + * @return null|string + */ + public function getServiceDocs() + { + return isset($this->docs['service']) ? $this->docs['service'] : null; + } + + /** + * Retrieves documentation about an operation. + * + * @param string $operation Name of the operation + * + * @return null|string + */ + public function getOperationDocs($operation) + { + return isset($this->docs['operations'][$operation]) + ? $this->docs['operations'][$operation] + : null; + } + + /** + * Retrieves documentation about an error. + * + * @param string $error Name of the error + * + * @return null|string + */ + public function getErrorDocs($error) + { + return isset($this->docs['shapes'][$error]['base']) + ? $this->docs['shapes'][$error]['base'] + : null; + } + + /** + * Retrieves documentation about a shape, specific to the context. + * + * @param string $shapeName Name of the shape. + * @param string $parentName Name of the parent/context shape. + * @param string $ref Name used by the context to reference the shape. + * + * @return null|string + */ + public function getShapeDocs($shapeName, $parentName, $ref) + { + if (!isset($this->docs['shapes'][$shapeName])) { + return ''; + } + + $result = ''; + $d = $this->docs['shapes'][$shapeName]; + if (isset($d['refs']["{$parentName}\${$ref}"])) { + $result = $d['refs']["{$parentName}\${$ref}"]; + } elseif (isset($d['base'])) { + $result = $d['base']; + } + + if (isset($d['append'])) { + if (!isset($d['excludeAppend']) + || !in_array($parentName, $d['excludeAppend']) + ) { + $result .= $d['append']; + } + } + + if (isset($d['appendOnly']) + && in_array($parentName, $d['appendOnly']['shapes']) + ) { + $result .= $d['appendOnly']['message']; + } + + return $this->clean($result); + } + + + private function clean($content) + { + if (!$content) { + return ''; + } + + $tidy = new \tidy(); + $tidy->parseString($content, [ + 'indent' => true, + 'doctype' => 'omit', + 'output-html' => true, + 'show-body-only' => true, + 'drop-empty-paras' => true, + 'clean' => true, + 'drop-proprietary-attributes' => true, + 'hide-comments' => true, + 'logical-emphasis' => true + ]); + $tidy->cleanRepair(); + + return (string) $content; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php new file mode 100644 index 0000000..c72f03f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php @@ -0,0 +1,99 @@ +api = $api; + } + + abstract protected function payload( + ResponseInterface $response, + StructureShape $member + ); + + protected function extractPayload( + StructureShape $member, + ResponseInterface $response + ) { + if ($member instanceof StructureShape) { + // Structure members parse top-level data into a specific key. + return $this->payload($response, $member); + } else { + // Streaming data is just the stream from the response body. + return $response->getBody(); + } + } + + protected function populateShape( + array &$data, + ResponseInterface $response, + ?CommandInterface $command = null + ) { + $data['body'] = []; + + if (!empty($command) && !empty($this->api)) { + + // If modeled error code is indicated, check for known error shape + if (!empty($data['code'])) { + + $errors = $this->api->getOperation($command->getName())->getErrors(); + foreach ($errors as $key => $error) { + + // If error code matches a known error shape, populate the body + if ($this->errorCodeMatches($data, $error)) { + $modeledError = $error; + $data['body'] = $this->extractPayload( + $modeledError, + $response + ); + $data['error_shape'] = $modeledError; + + foreach ($error->getMembers() as $name => $member) { + switch ($member['location']) { + case 'header': + $this->extractHeader($name, $member, $response, $data['body']); + break; + case 'headers': + $this->extractHeaders($name, $member, $response, $data['body']); + break; + case 'statusCode': + $this->extractStatus($name, $response, $data['body']); + break; + } + } + + break; + } + } + } + } + + return $data; + } + + private function errorCodeMatches(array $data, $error): bool + { + return $data['code'] == $error['name'] + || (isset($error['error']['code']) && $data['code'] === $error['error']['code']); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php new file mode 100644 index 0000000..67afb16 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonParserTrait.php @@ -0,0 +1,144 @@ +getStatusCode(); + $error_code = null; + $error_type = null; + + // Parse error code and type for query compatible services + if ($this->api + && !is_null($this->api->getMetadata('awsQueryCompatible')) + && $response->hasHeader('x-amzn-query-error') + ) { + $awsQueryError = $this->parseAwsQueryCompatibleHeader($response); + if ($awsQueryError) { + $error_code = $awsQueryError['code']; + $error_type = $awsQueryError['type']; + } + } + + // Parse error code from X-Amzn-Errortype header + if (!$error_code && $response->hasHeader('X-Amzn-Errortype')) { + $error_code = $this->extractErrorCode( + $response->getHeaderLine('X-Amzn-Errortype') + ); + } + + $parsedBody = null; + $body = $response->getBody(); + if (!$body->isSeekable() || $body->getSize()) { + $parsedBody = $this->parseJson((string) $body, $response); + } + + // Parse error code from response body + if (!$error_code && $parsedBody) { + $error_code = $this->parseErrorFromBody($parsedBody); + } + + if (!isset($error_type)) { + $error_type = $code[0] == '4' ? 'client' : 'server'; + } + + return [ + 'request_id' => $response->getHeaderLine('x-amzn-requestid'), + 'code' => $error_code ?? null, + 'message' => null, + 'type' => $error_type, + 'parsed' => $parsedBody + ]; + } + + /** + * Parse AWS Query Compatible error from header + * + * @param ResponseInterface $response + * @return array|null Returns ['code' => string, 'type' => string] or null + */ + private function parseAwsQueryCompatibleHeader(ResponseInterface $response): ?array + { + $queryError = $response->getHeaderLine('x-amzn-query-error'); + $parts = explode(';', $queryError); + + if (count($parts) === 2 && $parts[0] && $parts[1]) { + return [ + 'code' => $parts[0], + 'type' => $parts[1] + ]; + } + + return null; + } + + /** + * Parse error code from response body + * + * @param array|null $parsedBody + * @return string|null + */ + private function parseErrorFromBody(?array $parsedBody): ?string + { + if (!$parsedBody + || (!isset($parsedBody['code']) && !isset($parsedBody['__type'])) + ) { + return null; + } + + $error_code = $parsedBody['code'] ?? $parsedBody['__type']; + return $this->extractErrorCode($error_code); + } + + /** + * Extract error code from raw error string containing # and/or : delimiters + * + * @param string $rawErrorCode + * @return string + */ + private function extractErrorCode(string $rawErrorCode): string + { + // Handle format with both # and uri (e.g., "namespace#http://foo-bar") + if (str_contains($rawErrorCode, ':') && str_contains($rawErrorCode, '#')) { + $start = strpos($rawErrorCode, '#') + 1; + $end = strpos($rawErrorCode, ':', $start); + return substr($rawErrorCode, $start, $end - $start); + } + + // Handle format with uri only : (e.g., "ErrorCode:http://foo-bar.com/baz") + if (str_contains($rawErrorCode, ':')) { + return substr($rawErrorCode, 0, strpos($rawErrorCode, ':')); + } + + // Handle format with only # (e.g., "namespace#ErrorCode") + if (str_contains($rawErrorCode, '#')) { + return substr($rawErrorCode, strpos($rawErrorCode, '#') + 1); + } + + return $rawErrorCode; + } + + protected function payload( + ResponseInterface $response, + StructureShape $member + ) { + $body = $response->getBody(); + if (!$body->isSeekable() || $body->getSize()) { + $jsonBody = $this->parseJson($body, $response); + } else { + $jsonBody = (string) $body; + } + + return $this->parser->parse($member, $jsonBody); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php new file mode 100644 index 0000000..35e8ebe --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php @@ -0,0 +1,47 @@ +parser = $parser ?: new JsonParser(); + } + + public function __invoke( + ResponseInterface $response, + ?CommandInterface $command = null + ) { + $data = $this->genericHandler($response); + + // Make the casing consistent across services. + if ($data['parsed']) { + $data['parsed'] = array_change_key_case($data['parsed']); + } + + if (isset($data['parsed']['__type'])) { + if (!isset($data['code'])) { + $parts = explode('#', $data['parsed']['__type']); + $data['code'] = isset($parts[1]) ? $parts[1] : $parts[0]; + } + $data['message'] = $data['parsed']['message'] ?? null; + } + + $this->populateShape($data, $response, $command); + + return $data; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php new file mode 100644 index 0000000..3d50a73 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php @@ -0,0 +1,49 @@ +parser = $parser ?: new JsonParser(); + } + + public function __invoke( + ResponseInterface $response, + ?CommandInterface $command = null + ) { + $data = $this->genericHandler($response); + + // Merge in error data from the JSON body + if ($json = $data['parsed']) { + $data = array_replace($json, $data); + } + + // Correct error type from services like Amazon Glacier + if (!empty($data['type'])) { + $data['type'] = strtolower($data['type']); + } + + // Retrieve error message directly + $data['message'] = $data['parsed']['message'] + ?? ($data['parsed']['Message'] ?? null); + + $this->populateShape($data, $response, $command); + + return $data; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php new file mode 100644 index 0000000..86f5d0b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php @@ -0,0 +1,111 @@ +parser = $parser ?: new XmlParser(); + } + + public function __invoke( + ResponseInterface $response, + ?CommandInterface $command = null + ) { + $code = (string) $response->getStatusCode(); + + $data = [ + 'type' => $code[0] == '4' ? 'client' : 'server', + 'request_id' => null, + 'code' => null, + 'message' => null, + 'parsed' => null + ]; + + $body = $response->getBody(); + if ($body->getSize() > 0) { + $this->parseBody($this->parseXml($body, $response), $data); + } else { + $this->parseHeaders($response, $data); + } + + $this->populateShape($data, $response, $command); + + return $data; + } + + private function parseHeaders(ResponseInterface $response, array &$data) + { + if ($response->getStatusCode() == '404') { + $data['code'] = 'NotFound'; + } + + $data['message'] = $response->getStatusCode() . ' ' + . $response->getReasonPhrase(); + + if ($requestId = $response->getHeaderLine('x-amz-request-id')) { + $data['request_id'] = $requestId; + $data['message'] .= " (Request-ID: $requestId)"; + } + } + + private function parseBody(\SimpleXMLElement $body, array &$data) + { + $data['parsed'] = $body; + $prefix = $this->registerNamespacePrefix($body); + + if ($tempXml = $body->xpath("//{$prefix}Code[1]")) { + $data['code'] = (string) $tempXml[0]; + } + + if ($tempXml = $body->xpath("//{$prefix}Message[1]")) { + $data['message'] = (string) $tempXml[0]; + } + + $tempXml = $body->xpath("//{$prefix}RequestId[1]"); + if (isset($tempXml[0])) { + $data['request_id'] = (string)$tempXml[0]; + } + } + + protected function registerNamespacePrefix(\SimpleXMLElement $element) + { + $namespaces = $element->getDocNamespaces(); + if (!isset($namespaces[''])) { + return ''; + } + + // Account for the default namespace being defined and PHP not + // being able to handle it :(. + $element->registerXPathNamespace('ns', $namespaces['']); + return 'ns:'; + } + + protected function payload( + ResponseInterface $response, + StructureShape $member + ) { + $xmlBody = $this->parseXml($response->getBody(), $response); + $prefix = $this->registerNamespacePrefix($xmlBody); + $errorBody = $xmlBody->xpath("//{$prefix}Error"); + + if (is_array($errorBody) && !empty($errorBody[0])) { + return $this->parser->parse($member, $errorBody[0]); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ListShape.php b/vendor/aws/aws-sdk-php/src/Api/ListShape.php new file mode 100644 index 0000000..a425efa --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ListShape.php @@ -0,0 +1,35 @@ +member) { + if (!isset($this->definition['member'])) { + throw new \RuntimeException('No member attribute specified'); + } + $this->member = Shape::create( + $this->definition['member'], + $this->shapeMap + ); + } + + return $this->member; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/MapShape.php b/vendor/aws/aws-sdk-php/src/Api/MapShape.php new file mode 100644 index 0000000..f180f9a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/MapShape.php @@ -0,0 +1,54 @@ +value) { + if (!isset($this->definition['value'])) { + throw new \RuntimeException('No value specified'); + } + + $this->value = Shape::create( + $this->definition['value'], + $this->shapeMap + ); + } + + return $this->value; + } + + /** + * @return Shape + */ + public function getKey() + { + if (!$this->key) { + $this->key = isset($this->definition['key']) + ? Shape::create($this->definition['key'], $this->shapeMap) + : new Shape(['type' => 'string'], $this->shapeMap); + } + + return $this->key; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Operation.php b/vendor/aws/aws-sdk-php/src/Api/Operation.php new file mode 100644 index 0000000..36ba395 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Operation.php @@ -0,0 +1,158 @@ +staticContextParams = $definition['staticContextParams']; + } + + if (isset($definition['operationContextParams'])) { + $this->operationContextParams = $definition['operationContextParams']; + } + + parent::__construct($definition, $shapeMap); + $this->contextParams = $this->setContextParams(); + } + + /** + * Returns an associative array of the HTTP attribute of the operation: + * + * - method: HTTP method of the operation + * - requestUri: URI of the request (can include URI template placeholders) + * + * @return array + */ + public function getHttp() + { + return $this->definition['http']; + } + + /** + * Get the input shape of the operation. + * + * @return StructureShape + */ + public function getInput() + { + if (!$this->input) { + if ($input = $this['input']) { + $this->input = $this->shapeFor($input); + } else { + $this->input = new StructureShape([], $this->shapeMap); + } + } + + return $this->input; + } + + /** + * Get the output shape of the operation. + * + * @return StructureShape + */ + public function getOutput() + { + if (!$this->output) { + if ($output = $this['output']) { + $this->output = $this->shapeFor($output); + } else { + $this->output = new StructureShape([], $this->shapeMap); + } + } + + return $this->output; + } + + /** + * Get an array of operation error shapes. + * + * @return Shape[] + */ + public function getErrors() + { + if ($this->errors === null) { + if ($errors = $this['errors']) { + foreach ($errors as $key => $error) { + $errors[$key] = $this->shapeFor($error); + } + $this->errors = $errors; + } else { + $this->errors = []; + } + } + + return $this->errors; + } + + /** + * Gets static modeled static values used for + * endpoint resolution. + * + * @return array + */ + public function getStaticContextParams() + { + return $this->staticContextParams; + } + + /** + * Gets definition of modeled dynamic values used + * for endpoint resolution + * + * @return array + */ + public function getContextParams() + { + return $this->contextParams; + } + + /** + * Gets definition of modeled dynamic values used + * for endpoint resolution + * + * @return array + */ + public function getOperationContextParams(): array + { + return $this->operationContextParams; + } + + private function setContextParams() + { + $members = $this->getInput()->getMembers(); + $contextParams = []; + + foreach($members as $name => $shape) { + if (!empty($contextParam = $shape->getContextParam())) { + $contextParams[$contextParam['name']] = [ + 'shape' => $name, + 'type' => $shape->getType() + ]; + } + } + return $contextParams; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractParser.php new file mode 100644 index 0000000..2d515d2 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractParser.php @@ -0,0 +1,46 @@ +api = $api; + } + + /** + * @param CommandInterface $command Command that was executed. + * @param ResponseInterface $response Response that was received. + * + * @return ResultInterface + */ + abstract public function __invoke( + CommandInterface $command, + ResponseInterface $response + ); + + abstract public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ); +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php new file mode 100644 index 0000000..a0267e8 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php @@ -0,0 +1,216 @@ +api->getOperation($command->getName())->getOutput(); + $result = []; + + if ($payload = $output['payload']) { + $this->extractPayload($payload, $output, $response, $result); + } + + foreach ($output->getMembers() as $name => $member) { + switch ($member['location']) { + case 'header': + $this->extractHeader($name, $member, $response, $result); + break; + case 'headers': + $this->extractHeaders($name, $member, $response, $result); + break; + case 'statusCode': + $this->extractStatus($name, $response, $result); + break; + } + } + + $body = $response->getBody(); + if (!$payload + && (!$body->isSeekable() || $body->getSize()) + && count($output->getMembers()) > 0 + ) { + // if no payload was found, then parse the contents of the body + $this->payload($response, $output, $result); + } + + return new Result($result); + } + + private function extractPayload( + $payload, + StructureShape $output, + ResponseInterface $response, + array &$result + ) { + $member = $output->getMember($payload); + $body = $response->getBody(); + + if (!empty($member['eventstream'])) { + $result[$payload] = new EventParsingIterator( + $body, + $member, + $this + ); + } elseif ($member instanceof StructureShape) { + //Unions must have at least one member set to a non-null value + // If the body is empty, we can assume it is unset + if (!empty($member['union']) && ($body->isSeekable() && !$body->getSize())) { + return; + } + + $result[$payload] = []; + $this->payload($response, $member, $result[$payload]); + } else { + // Always set the payload to the body stream, regardless of content + $result[$payload] = $body; + } + } + + /** + * Extract a single header from the response into the result. + */ + private function extractHeader( + $name, + Shape $shape, + ResponseInterface $response, + &$result + ) { + $value = $response->getHeaderLine($shape['locationName'] ?: $name); + // Empty headers should not be deserialized + if ($value === null || $value === '') { + return; + } + + switch ($shape->getType()) { + case 'float': + case 'double': + $value = match ($value) { + 'NaN', 'Infinity', '-Infinity' => $value, + default => (float) $value + }; + break; + case 'long': + case 'integer': + $value = (int) $value; + break; + case 'boolean': + $value = filter_var($value, FILTER_VALIDATE_BOOLEAN); + break; + case 'blob': + $value = base64_decode($value); + break; + case 'timestamp': + try { + $value = DateTimeResult::fromTimestamp( + $value, + !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null + ); + break; + } catch (\Exception $e) { + // If the value cannot be parsed, then do not add it to the + // output structure. + return; + } + case 'string': + try { + if ($shape['jsonvalue']) { + $value = $this->parseJson(base64_decode($value), $response); + } + + // If value is not set, do not add to output structure. + if (!isset($value)) { + return; + } + break; + } catch (\Exception $e) { + //If the value cannot be parsed, then do not add it to the + //output structure. + return; + } + case 'list': + $listMember = $shape->getMember(); + $type = $listMember->getType(); + + // Only boolean lists require special handling + // other types can be returned as-is + if ($type !== 'boolean') { + break; + } + + $items = array_map('trim', explode(',', $value)); + $value = array_map( + static fn($item) => filter_var($item, FILTER_VALIDATE_BOOLEAN), + $items + ); + + break; + } + + $result[$name] = $value; + } + + /** + * Extract a map of headers with an optional prefix from the response. + */ + private function extractHeaders( + $name, + Shape $shape, + ResponseInterface $response, + &$result + ) { + // Check if the headers are prefixed by a location name + $result[$name] = []; + $prefix = $shape['locationName']; + $prefixLen = $prefix !== null ? strlen($prefix) : 0; + + foreach ($response->getHeaders() as $k => $values) { + if (!$prefixLen) { + $result[$name][$k] = implode(', ', $values); + } elseif (stripos($k, $prefix) === 0) { + $result[$name][substr($k, $prefixLen)] = implode(', ', $values); + } + } + } + + /** + * Places the status code of the response into the result array. + */ + private function extractStatus( + $name, + ResponseInterface $response, + array &$result + ) { + $result[$name] = (int) $response->getStatusCode(); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php new file mode 100644 index 0000000..8e5d4f0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php @@ -0,0 +1,54 @@ +parser = $parser; + } + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + if ($expected = $response->getHeaderLine('x-amz-crc32')) { + $hash = hexdec(Psr7\Utils::hash($response->getBody(), 'crc32b')); + if ($expected != $hash) { + throw new AwsException( + "crc32 mismatch. Expected {$expected}, found {$hash}.", + $command, + [ + 'code' => 'ClientChecksumMismatch', + 'connection_error' => true, + 'response' => $response + ] + ); + } + } + + $fn = $this->parser; + return $fn($command, $response); + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + return $this->parser->parseMemberFromStream($stream, $member, $response); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/DecodingEventStreamIterator.php b/vendor/aws/aws-sdk-php/src/Api/Parser/DecodingEventStreamIterator.php new file mode 100644 index 0000000..b31cbd8 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/DecodingEventStreamIterator.php @@ -0,0 +1,347 @@ + 'decodeUint32', + self::LENGTH_HEADERS => 'decodeUint32', + self::CRC_PRELUDE => 'decodeUint32', + ]; + + private static $lengthFormatMap = [ + 1 => 'decodeUint8', + 2 => 'decodeUint16', + 4 => 'decodeUint32', + 8 => 'decodeUint64', + ]; + + private static $headerTypeMap = [ + 0 => 'decodeBooleanTrue', + 1 => 'decodeBooleanFalse', + 2 => 'decodeInt8', + 3 => 'decodeInt16', + 4 => 'decodeInt32', + 5 => 'decodeInt64', + 6 => 'decodeBytes', + 7 => 'decodeString', + 8 => 'decodeTimestamp', + 9 => 'decodeUuid', + ]; + + /** @var StreamInterface Stream of eventstream shape to parse. */ + protected $stream; + + /** @var array Currently parsed event. */ + protected $currentEvent; + + /** @var int Current in-order event key. */ + protected $key; + + /** @var resource|\HashContext CRC32 hash context for event validation */ + protected $hashContext; + + /** @var int $currentPosition */ + protected $currentPosition; + + /** + * DecodingEventStreamIterator constructor. + * + * @param StreamInterface $stream + */ + public function __construct(StreamInterface $stream) + { + $this->stream = $stream; + $this->rewind(); + } + + protected function parseHeaders($headerBytes) + { + $headers = []; + $bytesRead = 0; + + while ($bytesRead < $headerBytes) { + list($key, $numBytes) = $this->decodeString(1); + $bytesRead += $numBytes; + + list($type, $numBytes) = $this->decodeUint8(); + $bytesRead += $numBytes; + + $f = self::$headerTypeMap[$type]; + list($value, $numBytes) = $this->{$f}(); + $bytesRead += $numBytes; + + if (isset($headers[$key])) { + throw new ParserException('Duplicate key in event headers.'); + } + $headers[$key] = $value; + } + + return [$headers, $bytesRead]; + } + + protected function parsePrelude() + { + $prelude = []; + $bytesRead = 0; + + $calculatedCrc = null; + foreach (self::$preludeFormat as $key => $decodeFunction) { + if ($key === self::CRC_PRELUDE) { + $hashCopy = hash_copy($this->hashContext); + $calculatedCrc = hash_final($this->hashContext, true); + $this->hashContext = $hashCopy; + } + list($value, $numBytes) = $this->{$decodeFunction}(); + $bytesRead += $numBytes; + + $prelude[$key] = $value; + } + + if (unpack('N', $calculatedCrc)[1] !== $prelude[self::CRC_PRELUDE]) { + throw new ParserException('Prelude checksum mismatch.'); + } + + return [$prelude, $bytesRead]; + } + + /** + * This method decodes an event from the stream. + * + * @return array + */ + protected function parseEvent() + { + $event = []; + + if ($this->stream->tell() < $this->stream->getSize()) { + $this->hashContext = hash_init('crc32b'); + + $bytesLeft = $this->stream->getSize() - $this->stream->tell(); + list($prelude, $numBytes) = $this->parsePrelude(); + if ($prelude[self::LENGTH_TOTAL] > $bytesLeft) { + throw new ParserException('Message length too long.'); + } + $bytesLeft -= $numBytes; + + if ($prelude[self::LENGTH_HEADERS] > $bytesLeft) { + throw new ParserException('Headers length too long.'); + } + + list( + $event[self::HEADERS], + $numBytes + ) = $this->parseHeaders($prelude[self::LENGTH_HEADERS]); + + $event[self::PAYLOAD] = Psr7\Utils::streamFor( + $this->readAndHashBytes( + $prelude[self::LENGTH_TOTAL] - self::BYTES_PRELUDE + - $numBytes - self::BYTES_TRAILING + ) + ); + + $calculatedCrc = hash_final($this->hashContext, true); + $messageCrc = $this->stream->read(4); + if ($calculatedCrc !== $messageCrc) { + throw new ParserException('Message checksum mismatch.'); + } + } + + return $event; + } + + // Iterator Functionality + + /** + * @return array + */ + #[\ReturnTypeWillChange] + public function current() + { + return $this->currentEvent; + } + + /** + * @return int + */ + #[\ReturnTypeWillChange] + public function key() + { + return $this->key; + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function next() + { + $this->currentPosition = $this->stream->tell(); + if ($this->valid()) { + $this->key++; + $this->currentEvent = $this->parseEvent(); + } + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function rewind() + { + $this->stream->rewind(); + $this->key = 0; + $this->currentPosition = 0; + $this->currentEvent = $this->parseEvent(); + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function valid() + { + return $this->currentPosition < $this->stream->getSize(); + } + + // Decoding Utilities + + protected function readAndHashBytes($num) + { + $bytes = $this->stream->read($num); + hash_update($this->hashContext, $bytes); + return $bytes; + } + + private function decodeBooleanTrue() + { + return [true, 0]; + } + + private function decodeBooleanFalse() + { + return [false, 0]; + } + + private function uintToInt($val, $size) + { + $signedCap = pow(2, $size - 1); + if ($val > $signedCap) { + $val -= (2 * $signedCap); + } + return $val; + } + + private function decodeInt8() + { + $val = (int)unpack('C', $this->readAndHashBytes(1))[1]; + return [$this->uintToInt($val, 8), 1]; + } + + private function decodeUint8() + { + return [unpack('C', $this->readAndHashBytes(1))[1], 1]; + } + + private function decodeInt16() + { + $val = (int)unpack('n', $this->readAndHashBytes(2))[1]; + return [$this->uintToInt($val, 16), 2]; + } + + private function decodeUint16() + { + return [unpack('n', $this->readAndHashBytes(2))[1], 2]; + } + + private function decodeInt32() + { + $val = (int)unpack('N', $this->readAndHashBytes(4))[1]; + return [$this->uintToInt($val, 32), 4]; + } + + private function decodeUint32() + { + return [unpack('N', $this->readAndHashBytes(4))[1], 4]; + } + + private function decodeInt64() + { + $val = $this->unpackInt64($this->readAndHashBytes(8))[1]; + return [$this->uintToInt($val, 64), 8]; + } + + private function decodeUint64() + { + return [$this->unpackInt64($this->readAndHashBytes(8))[1], 8]; + } + + private function unpackInt64($bytes) + { + return unpack('J', $bytes); + } + + private function decodeBytes($lengthBytes=2) + { + if (!isset(self::$lengthFormatMap[$lengthBytes])) { + throw new ParserException('Undefined variable length format.'); + } + $f = self::$lengthFormatMap[$lengthBytes]; + list($len, $bytes) = $this->{$f}(); + return [$this->readAndHashBytes($len), $len + $bytes]; + } + + private function decodeString($lengthBytes=2) + { + if (!isset(self::$lengthFormatMap[$lengthBytes])) { + throw new ParserException('Undefined variable length format.'); + } + $f = self::$lengthFormatMap[$lengthBytes]; + list($len, $bytes) = $this->{$f}(); + return [$this->readAndHashBytes($len), $len + $bytes]; + } + + private function decodeTimestamp() + { + list($val, $bytes) = $this->decodeInt64(); + return [ + DateTimeResult::createFromFormat('U.u', $val / 1000), + $bytes + ]; + } + + private function decodeUuid() + { + $val = unpack('H32', $this->readAndHashBytes(16))[1]; + return [ + substr($val, 0, 8) . '-' + . substr($val, 8, 4) . '-' + . substr($val, 12, 4) . '-' + . substr($val, 16, 4) . '-' + . substr($val, 20, 12), + 16 + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/EventParsingIterator.php b/vendor/aws/aws-sdk-php/src/Api/Parser/EventParsingIterator.php new file mode 100644 index 0000000..b14c5fc --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/EventParsingIterator.php @@ -0,0 +1,211 @@ +decodingIterator = $this->chooseDecodingIterator($stream); + $this->shape = $shape; + $this->parser = $parser; + } + + /** + * This method choose a decoding iterator implementation based on if the stream + * is seekable or not. + * + * @param $stream + * + * @return Iterator + */ + private function chooseDecodingIterator($stream) + { + if ($stream->isSeekable()) { + return new DecodingEventStreamIterator($stream); + } else { + return new NonSeekableStreamDecodingEventStreamIterator($stream); + } + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function current() + { + return $this->parseEvent($this->decodingIterator->current()); + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function key() + { + return $this->decodingIterator->key(); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function next() + { + $this->decodingIterator->next(); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function rewind() + { + $this->decodingIterator->rewind(); + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function valid() + { + return $this->decodingIterator->valid(); + } + + private function parseEvent(array $event) + { + if (!empty($event['headers'][':message-type'])) { + if ($event['headers'][':message-type'] === 'error') { + return $this->parseError($event); + } + + if ($event['headers'][':message-type'] === 'exception') { + return $this->parseException($event); + } + + if ($event['headers'][':message-type'] !== 'event') { + throw new ParserException('Failed to parse unknown message type.'); + } + } + + $eventType = $event['headers'][':event-type'] ?? null; + if (empty($eventType)) { + throw new ParserException('Failed to parse without event type.'); + } + + $eventPayload = $event['payload']; + if ($eventType === 'initial-response') { + return $this->parseInitialResponseEvent($eventPayload); + } + + $eventShape = $this->shape->getMember($eventType); + + return [ + $eventType => array_merge( + $this->parseEventHeaders($event['headers'], $eventShape), + $this->parseEventPayload($eventPayload, $eventShape) + ) + ]; + } + + /** + * @param $headers + * @param $eventShape + * + * @return array + */ + private function parseEventHeaders($headers, $eventShape): array + { + $parsedHeaders = []; + foreach ($eventShape->getMembers() as $memberName => $memberProps) { + if (isset($memberProps['eventheader'])) { + $parsedHeaders[$memberName] = $headers[$memberName]; + } + } + + return $parsedHeaders; + } + + /** + * @param $payload + * @param $eventShape + * + * @return array + */ + private function parseEventPayload($payload, $eventShape): array + { + $parsedPayload = []; + foreach ($eventShape->getMembers() as $memberName => $memberProps) { + $memberShape = $eventShape->getMember($memberName); + if (isset($memberProps['eventpayload'])) { + if ($memberShape->getType() === 'blob') { + $parsedPayload[$memberName] = $payload; + } else { + $parsedPayload[$memberName] = $this->parser->parseMemberFromStream( + $payload, + $memberShape, + null + ); + } + + break; + } + } + + if (empty($parsedPayload) && !empty($payload->getContents())) { + /** + * If we did not find a member with an eventpayload trait, then we should deserialize the payload + * using the event's shape. + */ + $parsedPayload = $this->parser->parseMemberFromStream($payload, $eventShape, null); + } + + return $parsedPayload; + } + + private function parseError(array $event) + { + throw new EventStreamDataException( + $event['headers'][':error-code'], + $event['headers'][':error-message'] + ); + } + + private function parseException(array $event) { + $payload = $event['payload']?->getContents(); + $parsedPayload = json_decode($payload, true); + + throw new EventStreamDataException( + $event['headers'][':exception-type'] ?? 'Unknown', + $parsedPayload['message'] ?? $payload, + ); + } + + private function parseInitialResponseEvent($payload): array + { + return ['initial-response' => json_decode($payload, true)]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/Exception/ParserException.php b/vendor/aws/aws-sdk-php/src/Api/Parser/Exception/ParserException.php new file mode 100644 index 0000000..f5fd9ec --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/Exception/ParserException.php @@ -0,0 +1,56 @@ +errorCode = isset($context['error_code']) ? $context['error_code'] : null; + $this->requestId = isset($context['request_id']) ? $context['request_id'] : null; + $this->response = isset($context['response']) ? $context['response'] : null; + parent::__construct($message, $code, $previous); + } + + /** + * Get the error code, if any. + * + * @return string|null + */ + public function getErrorCode() + { + return $this->errorCode; + } + + /** + * Get the request ID, if any. + * + * @return string|null + */ + public function getRequestId() + { + return $this->requestId; + } + + /** + * Get the received HTTP response if any. + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/JsonParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/JsonParser.php new file mode 100644 index 0000000..da11e31 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/JsonParser.php @@ -0,0 +1,74 @@ +getMembers() as $name => $member) { + $locationName = $member['locationName'] ?: $name; + if (isset($value[$locationName])) { + $target[$name] = $this->parse($member, $value[$locationName]); + } + } + if (isset($shape['union']) + && $shape['union'] + && is_array($value) + && empty($target) + ) { + foreach ($value as $key => $val) { + $target['Unknown'][$key] = $val; + } + } + return $target; + + case 'list': + $member = $shape->getMember(); + $target = []; + foreach ($value as $v) { + $target[] = $this->parse($member, $v); + } + return $target; + + case 'map': + $values = $shape->getValue(); + $target = []; + foreach ($value as $k => $v) { + // null map values should not be deserialized + if (!is_null($v)) { + $target[$k] = $this->parse($values, $v); + } + } + return $target; + + case 'timestamp': + return DateTimeResult::fromTimestamp( + $value, + !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null + ); + + case 'blob': + return base64_decode($value); + + default: + return $value; + } + } +} + diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/JsonRpcParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/JsonRpcParser.php new file mode 100644 index 0000000..cd6549c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/JsonRpcParser.php @@ -0,0 +1,82 @@ +parser = $parser ?: new JsonParser(); + } + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + $operation = $this->api->getOperation($command->getName()); + + return $this->parseResponse($response, $operation); + } + + /** + * This method parses a response based on JSON RPC protocol. + * + * @param ResponseInterface $response the response to parse. + * @param Operation $operation the operation which holds information for + * parsing the response. + * + * @return Result + */ + private function parseResponse(ResponseInterface $response, Operation $operation) + { + if (null === $operation['output']) { + return new Result([]); + } + + $outputShape = $operation->getOutput(); + foreach ($outputShape->getMembers() as $memberName => $memberProps) { + if (!empty($memberProps['eventstream'])) { + return new Result([ + $memberName => new EventParsingIterator( + $response->getBody(), + $outputShape->getMember($memberName), + $this + ) + ]); + } + } + + $result = $this->parseMemberFromStream( + $response->getBody(), + $operation->getOutput(), + $response + ); + + return new Result(is_null($result) ? [] : $result); + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + return $this->parser->parse($member, $this->parseJson($stream, $response)); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/MetadataParserTrait.php b/vendor/aws/aws-sdk-php/src/Api/Parser/MetadataParserTrait.php new file mode 100644 index 0000000..b3bba99 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/MetadataParserTrait.php @@ -0,0 +1,95 @@ +getHeaderLine($shape['locationName'] ?: $name); + // Empty values should not be deserialized + if ($value === null || $value === '') { + return; + } + + switch ($shape->getType()) { + case 'float': + case 'double': + $value = (float) $value; + break; + case 'long': + case 'integer': + $value = (int) $value; + break; + case 'boolean': + $value = filter_var($value, FILTER_VALIDATE_BOOLEAN); + break; + case 'blob': + $value = base64_decode($value); + break; + case 'timestamp': + try { + $value = DateTimeResult::fromTimestamp( + $value, + !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null + ); + break; + } catch (\Exception $e) { + // If the value cannot be parsed, then do not add it to the + // output structure. + return; + } + case 'string': + if ($shape['jsonvalue']) { + $value = $this->parseJson(base64_decode($value), $response); + } + break; + } + + $result[$name] = $value; + } + + /** + * Extract a map of headers with an optional prefix from the response. + */ + protected function extractHeaders( + $name, + Shape $shape, + ResponseInterface $response, + &$result + ) { + // Check if the headers are prefixed by a location name + $result[$name] = []; + $prefix = $shape['locationName']; + $prefixLen = strlen($prefix); + + foreach ($response->getHeaders() as $k => $values) { + if (!$prefixLen) { + $result[$name][$k] = implode(', ', $values); + } elseif (stripos($k, $prefix) === 0) { + $result[$name][substr($k, $prefixLen)] = implode(', ', $values); + } + } + } + + /** + * Places the status code of the response into the result array. + */ + protected function extractStatus( + $name, + ResponseInterface $response, + array &$result + ) { + $result[$name] = (int) $response->getStatusCode(); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/NonSeekableStreamDecodingEventStreamIterator.php b/vendor/aws/aws-sdk-php/src/Api/Parser/NonSeekableStreamDecodingEventStreamIterator.php new file mode 100644 index 0000000..ca5388d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/NonSeekableStreamDecodingEventStreamIterator.php @@ -0,0 +1,101 @@ +stream = $stream; + if ($this->stream->isSeekable()) { + throw new \InvalidArgumentException('The stream provided must be not seekable.'); + } + + $this->tempBuffer = []; + } + + /** + * @inheritDoc + * + * @return array + */ + protected function parseEvent(): array + { + $event = []; + $this->hashContext = hash_init('crc32b'); + $prelude = $this->parsePrelude()[0]; + list( + $event[self::HEADERS], + $numBytes + ) = $this->parseHeaders($prelude[self::LENGTH_HEADERS]); + $event[self::PAYLOAD] = Psr7\Utils::streamFor( + $this->readAndHashBytes( + $prelude[self::LENGTH_TOTAL] - self::BYTES_PRELUDE + - $numBytes - self::BYTES_TRAILING + ) + ); + $calculatedCrc = hash_final($this->hashContext, true); + $messageCrc = $this->stream->read(4); + if ($calculatedCrc !== $messageCrc) { + throw new ParserException('Message checksum mismatch.'); + } + + return $event; + } + + protected function readAndHashBytes($num): string + { + $bytes = ''; + while (!empty($this->tempBuffer) && $num > 0) { + $byte = array_shift($this->tempBuffer); + $bytes .= $byte; + $num = $num - 1; + } + + $bytes = $bytes . $this->stream->read($num); + hash_update($this->hashContext, $bytes); + + return $bytes; + } + + // Iterator Functionality + + #[\ReturnTypeWillChange] + public function rewind() + { + $this->currentEvent = $this->parseEvent(); + } + + public function next() + { + $this->tempBuffer[] = $this->stream->read(1); + if ($this->valid()) { + $this->key++; + $this->currentEvent = $this->parseEvent(); + } + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function valid() + { + return !$this->stream->eof(); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/PayloadParserTrait.php b/vendor/aws/aws-sdk-php/src/Api/Parser/PayloadParserTrait.php new file mode 100644 index 0000000..43d3d56 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/PayloadParserTrait.php @@ -0,0 +1,61 @@ + $response] + ); + } + + return $jsonPayload; + } + + /** + * @param string $xml + * + * @throws ParserException + * + * @return \SimpleXMLElement + */ + protected function parseXml($xml, $response) + { + $priorSetting = libxml_use_internal_errors(true); + try { + libxml_clear_errors(); + $xmlPayload = new \SimpleXMLElement($xml); + if ($error = libxml_get_last_error()) { + throw new \RuntimeException($error->message); + } + } catch (\Exception $e) { + throw new ParserException( + "Error parsing XML: {$e->getMessage()}", + 0, + $e, + ['response' => $response] + ); + } finally { + libxml_use_internal_errors($priorSetting); + } + + return $xmlPayload; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/QueryParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/QueryParser.php new file mode 100644 index 0000000..2ea0676 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/QueryParser.php @@ -0,0 +1,68 @@ +parser = $xmlParser ?: new XmlParser(); + $this->honorResultWrapper = $honorResultWrapper; + } + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + $output = $this->api->getOperation($command->getName())->getOutput(); + $body = $response->getBody(); + $xml = !$body->isSeekable() || $body->getSize() + ? $this->parseXml($body, $response) + : null; + + // Empty request bodies should not be deserialized. + if (is_null($xml)) { + return new Result(); + } + + if ($this->honorResultWrapper && $output['resultWrapper']) { + $xml = $xml->{$output['resultWrapper']}; + } + + return new Result($this->parser->parse($output, $xml)); + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + $xml = $this->parseXml($stream, $response); + return $this->parser->parse($member, $xml); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/RestJsonParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/RestJsonParser.php new file mode 100644 index 0000000..8c14e07 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/RestJsonParser.php @@ -0,0 +1,64 @@ +parser = $parser ?: new JsonParser(); + } + + protected function payload( + ResponseInterface $response, + StructureShape $member, + array &$result + ) { + $responseBody = (string) $response->getBody(); + + // Parse JSON if we have content + $parsedJson = null; + if (!empty($responseBody)) { + $parsedJson = $this->parseJson($responseBody, $response); + } else { + // An empty response body should be deserialized as null + $result = $parsedJson; + return; + } + + $parsedBody = $this->parser->parse($member, $parsedJson); + if (is_string($parsedBody) && $member['document']) { + // Document types can be strings: replace entire result + $result = $parsedBody; + } else { + // Merge array/object results into existing result + $result = array_merge($result, (array) $parsedBody); + } + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + $jsonBody = $this->parseJson($stream, $response); + if ($jsonBody) { + return $this->parser->parse($member, $jsonBody); + } + return []; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/RestXmlParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/RestXmlParser.php new file mode 100644 index 0000000..057c00c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/RestXmlParser.php @@ -0,0 +1,42 @@ +parser = $parser ?: new XmlParser(); + } + + protected function payload( + ResponseInterface $response, + StructureShape $member, + array &$result + ) { + $result += $this->parseMemberFromStream($response->getBody(), $member, $response); + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + $xml = $this->parseXml($stream, $response); + return $this->parser->parse($member, $xml); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Parser/XmlParser.php b/vendor/aws/aws-sdk-php/src/Api/Parser/XmlParser.php new file mode 100644 index 0000000..c9d47d2 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Parser/XmlParser.php @@ -0,0 +1,183 @@ +dispatch($shape, $value); + } + + private function dispatch($shape, \SimpleXMLElement $value) + { + static $methods = [ + 'structure' => 'parse_structure', + 'list' => 'parse_list', + 'map' => 'parse_map', + 'blob' => 'parse_blob', + 'boolean' => 'parse_boolean', + 'integer' => 'parse_integer', + 'float' => 'parse_float', + 'double' => 'parse_float', + 'timestamp' => 'parse_timestamp', + ]; + + $type = $shape['type']; + if (isset($methods[$type])) { + return $this->{$methods[$type]}($shape, $value); + } + + return (string) $value; + } + + private function parse_structure( + StructureShape $shape, + \SimpleXMLElement $value + ) { + $target = []; + + foreach ($shape->getMembers() as $name => $member) { + // Extract the name of the XML node + $node = $this->memberKey($member, $name); + if (isset($value->{$node})) { + $target[$name] = $this->dispatch($member, $value->{$node}); + } else { + $memberShape = $shape->getMember($name); + if (!empty($memberShape['xmlAttribute'])) { + $target[$name] = $this->parse_xml_attribute( + $shape, + $memberShape, + $value + ); + } + } + } + if (isset($shape['union']) + && $shape['union'] + && empty($target) + ) { + foreach ($value as $key => $val) { + $name = $val->children()->getName(); + $target['Unknown'][$name] = $val->$name; + } + } + return $target; + } + + private function memberKey(Shape $shape, $name) + { + // Check if locationName came from shape definition + if ($shape instanceof StructureShape && isset($shape['locationName'])) { + $originalDef = $shape->getOriginalDefinition($shape->getName()); + + if ($originalDef && isset($originalDef['locationName']) + && $originalDef['locationName'] === $shape['locationName'] + ) { + return $name; + } + } + + return $shape['locationName'] ?? $name; + } + + private function parse_list(ListShape $shape, \SimpleXMLElement $value) + { + $target = []; + $member = $shape->getMember(); + + if (!$shape['flattened']) { + $value = $value->{$member['locationName'] ?: 'member'}; + } + + foreach ($value as $v) { + $target[] = $this->dispatch($member, $v); + } + + return $target; + } + + private function parse_map(MapShape $shape, \SimpleXMLElement $value) + { + $target = []; + + if (!$shape['flattened']) { + $value = $value->entry; + } + + $mapKey = $shape->getKey(); + $mapValue = $shape->getValue(); + $keyName = $shape->getKey()['locationName'] ?: 'key'; + $valueName = $shape->getValue()['locationName'] ?: 'value'; + + foreach ($value as $node) { + $key = $this->dispatch($mapKey, $node->{$keyName}); + $value = $this->dispatch($mapValue, $node->{$valueName}); + $target[$key] = $value; + } + + return $target; + } + + private function parse_blob(Shape $shape, $value) + { + return base64_decode((string) $value); + } + + private function parse_float(Shape $shape, $value) + { + $value = (string) $value; + + return match ($value) { + 'NaN', 'Infinity', '-Infinity' => $value, + default => (float) $value + }; + } + + private function parse_integer(Shape $shape, $value) + { + return (int) (string) $value; + } + + private function parse_boolean(Shape $shape, $value) + { + return $value == 'true'; + } + + private function parse_timestamp(Shape $shape, $value) + { + if (is_string($value) + || is_int($value) + || (is_object($value) + && method_exists($value, '__toString')) + ) { + return DateTimeResult::fromTimestamp( + (string) $value, + !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null + ); + } + throw new ParserException('Invalid timestamp value passed to XmlParser::parse_timestamp'); + } + + private function parse_xml_attribute(Shape $shape, Shape $memberShape, $value) + { + $namespace = $shape['xmlNamespace']['uri'] ?? ''; + $prefix = $shape['xmlNamespace']['prefix'] ?? ''; + if (!empty($prefix)) { + $prefix .= ':'; + } + $key = str_replace($prefix, '', $memberShape['locationName']); + + $attributes = $value->attributes($namespace); + return isset($attributes[$key]) ? (string) $attributes[$key] : null; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/Ec2ParamBuilder.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/Ec2ParamBuilder.php new file mode 100644 index 0000000..a3753cd --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/Ec2ParamBuilder.php @@ -0,0 +1,38 @@ +getMember(); + foreach ($value as $k => $v) { + $this->format($items, $v, $prefix . '.' . ($k + 1), $query); + } + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php new file mode 100644 index 0000000..6ac2dd9 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php @@ -0,0 +1,116 @@ +api = $api; + } + + /** + * Gets the JSON Content-Type header for a service API + * + * @param Service $service + * + * @return string + */ + public static function getContentType(Service $service) + { + if ($service->getMetadata('protocol') === 'rest-json') { + return 'application/json'; + } + + $jsonVersion = $service->getMetadata('jsonVersion'); + if (empty($jsonVersion)) { + throw new \InvalidArgumentException('invalid json'); + } else { + return 'application/x-amz-json-' + . @number_format($service->getMetadata('jsonVersion'), 1); + } + } + + /** + * Builds the JSON body based on an array of arguments. + * + * @param Shape $shape Operation being constructed + * @param array|string $args Associative array of arguments, or a string. + * + * @return string + */ + public function build(Shape $shape, array|string $args) + { + try { + $result = json_encode($this->format($shape, $args), JSON_THROW_ON_ERROR); + } catch (\JsonException $e) { + throw new InvalidJsonException( + 'Unable to encode JSON document ' . $shape->getName() . ': ' . + $e->getMessage() . PHP_EOL + ); + } + + return $result === '[]' ? '{}' : $result; + } + + private function format(Shape $shape, $value) + { + switch ($shape['type']) { + case 'structure': + $data = []; + if ($shape['document'] ?? false) { + return $value; + } + foreach ($value as $k => $v) { + if ($v !== null && $shape->hasMember($k)) { + $valueShape = $shape->getMember($k); + $data[$valueShape['locationName'] ?: $k] + = $this->format($valueShape, $v); + } + } + if (empty($data)) { + return new \stdClass; + } + return $data; + + case 'list': + $items = $shape->getMember(); + foreach ($value as $k => $v) { + $value[$k] = $this->format($items, $v); + } + return $value; + + case 'map': + if (empty($value)) { + return new \stdClass; + } + $values = $shape->getValue(); + foreach ($value as $k => $v) { + $value[$k] = $this->format($values, $v); + } + return $value; + + case 'blob': + return base64_encode($value); + + case 'timestamp': + $timestampFormat = !empty($shape['timestampFormat']) + ? $shape['timestampFormat'] + : 'unixTimestamp'; + return TimestampShape::format($value, $timestampFormat); + + default: + return $value; + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonRpcSerializer.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonRpcSerializer.php new file mode 100644 index 0000000..a4f5e6f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/JsonRpcSerializer.php @@ -0,0 +1,87 @@ +endpoint = $endpoint; + $this->api = $api; + $this->jsonFormatter = $jsonFormatter ?: new JsonBody($this->api); + $this->contentType = JsonBody::getContentType($api); + } + + /** + * When invoked with an AWS command, returns a serialization array + * containing "method", "uri", "headers", and "body" key value pairs. + * + * @param CommandInterface $command Command to serialize into a request. + * @param $endpointProvider Provider used for dynamic endpoint resolution. + * @param $clientArgs Client arguments used for dynamic endpoint resolution. + * + * @return RequestInterface + */ + public function __invoke( + CommandInterface $command, + $endpoint = null + ) + { + $operationName = $command->getName(); + $operation = $this->api->getOperation($operationName); + $commandArgs = $command->toArray(); + $body = $this->jsonFormatter->build($operation->getInput(), $commandArgs); + $headers = [ + 'X-Amz-Target' => $this->api->getMetadata('targetPrefix') . '.' . $operationName, + 'Content-Type' => $this->contentType, + 'Content-Length' => strlen($body) + ]; + + if ($endpoint instanceof RulesetEndpoint) { + $this->setEndpointV2RequestOptions($endpoint, $headers); + } + + $requestUri = $operation['http']['requestUri'] ?? null; + $absoluteUri = str_ends_with($this->endpoint, '/') + ? $this->endpoint : $this->endpoint . $requestUri; + + return new Request( + $operation['http']['method'], + $absoluteUri, + $headers, + $body + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/QueryParamBuilder.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/QueryParamBuilder.php new file mode 100644 index 0000000..29168da --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/QueryParamBuilder.php @@ -0,0 +1,158 @@ +isFlat($shape) && !empty($shape['member']['locationName'])) { + return $shape['member']['locationName']; + } + + return $default; + } + + protected function isFlat(Shape $shape) + { + return $shape['flattened'] === true; + } + + public function __invoke(StructureShape $shape, array $params) + { + if (!$this->methods) { + $this->methods = array_fill_keys(get_class_methods($this), true); + } + + $query = []; + $this->format_structure($shape, $params, '', $query); + + return $query; + } + + protected function format(Shape $shape, $value, $prefix, array &$query) + { + $type = 'format_' . $shape['type']; + if (isset($this->methods[$type])) { + $this->{$type}($shape, $value, $prefix, $query); + } else { + $query[$prefix] = (string) $value; + } + } + + protected function format_structure( + StructureShape $shape, + array $value, + $prefix, + &$query + ) { + if ($prefix) { + $prefix .= '.'; + } + + foreach ($value as $k => $v) { + if ($shape->hasMember($k)) { + $member = $shape->getMember($k); + $this->format( + $member, + $v, + $prefix . $this->queryName($member, $k), + $query + ); + } + } + } + + protected function format_list( + ListShape $shape, + array $value, + $prefix, + &$query + ) { + // Handle empty list serialization + if (!$value) { + $query[$prefix] = ''; + return; + } + + $items = $shape->getMember(); + + if (!$this->isFlat($shape)) { + $locationName = $shape->getMember()['locationName'] ?: 'member'; + $prefix .= ".$locationName"; + // flattened lists can also model a `locationName` + } elseif ($name = $shape['locationName'] ?? $this->queryName($items)) { + $parts = explode('.', $prefix); + $parts[count($parts) - 1] = $name; + $prefix = implode('.', $parts); + } + + foreach ($value as $k => $v) { + $this->format($items, $v, $prefix . '.' . ($k + 1), $query); + } + } + + protected function format_map( + MapShape $shape, + array $value, + $prefix, + array &$query + ) { + $vals = $shape->getValue(); + $keys = $shape->getKey(); + + if (!$this->isFlat($shape)) { + $prefix .= '.entry'; + } + + $i = 0; + $keyName = '%s.%d.' . $this->queryName($keys, 'key'); + $valueName = '%s.%s.' . $this->queryName($vals, 'value'); + + foreach ($value as $k => $v) { + $i++; + $this->format($keys, $k, sprintf($keyName, $prefix, $i), $query); + $this->format($vals, $v, sprintf($valueName, $prefix, $i), $query); + } + } + + protected function format_blob(Shape $shape, $value, $prefix, array &$query) + { + $query[$prefix] = base64_encode($value); + } + + protected function format_timestamp( + TimestampShape $shape, + $value, + $prefix, + array &$query + ) { + $timestampFormat = !empty($shape['timestampFormat']) + ? $shape['timestampFormat'] + : 'iso8601'; + $query[$prefix] = TimestampShape::format($value, $timestampFormat); + } + + protected function format_boolean(Shape $shape, $value, $prefix, array &$query) + { + $query[$prefix] = ($value) ? 'true' : 'false'; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/QuerySerializer.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/QuerySerializer.php new file mode 100644 index 0000000..c38c881 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/QuerySerializer.php @@ -0,0 +1,82 @@ +api = $api; + $this->endpoint = $endpoint; + $this->paramBuilder = $paramBuilder ?: new QueryParamBuilder(); + } + + /** + * When invoked with an AWS command, returns a serialization array + * containing "method", "uri", "headers", and "body" key value pairs. + * + * @param CommandInterface $command Command to serialize into a request. + * @param null $endpoint Endpoint resolved using EndpointProviderV2 + * @return RequestInterface + */ + public function __invoke( + CommandInterface $command, + $endpoint = null + ) + { + $operation = $this->api->getOperation($command->getName()); + $body = [ + 'Action' => $command->getName(), + 'Version' => $this->api->getMetadata('apiVersion') + ]; + $commandArgs = $command->toArray(); + + // Only build up the parameters when there are parameters to build + if ($commandArgs) { + $body += call_user_func( + $this->paramBuilder, + $operation->getInput(), + $commandArgs + ); + } + $body = http_build_query($body, '', '&', PHP_QUERY_RFC3986); + $headers = [ + 'Content-Length' => strlen($body), + 'Content-Type' => 'application/x-www-form-urlencoded' + ]; + $requestUri = $operation['http']['requestUri'] ?? null; + + if ($endpoint instanceof RulesetEndpoint) { + $this->setEndpointV2RequestOptions($endpoint, $headers); + } + $absoluteUri = str_ends_with($this->endpoint, '/') + ? $this->endpoint : $this->endpoint . $requestUri; + + return new Request( + 'POST', + $absoluteUri, + $headers, + $body + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/RestJsonSerializer.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/RestJsonSerializer.php new file mode 100644 index 0000000..e198664 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/RestJsonSerializer.php @@ -0,0 +1,41 @@ +contentType = JsonBody::getContentType($api); + $this->jsonFormatter = $jsonFormatter ?: new JsonBody($api); + } + + protected function payload(StructureShape $member, array|string $value, array &$opts) + { + $opts['headers']['Content-Type'] = $this->contentType; + $body = $this->jsonFormatter->build($member, $value); + $opts['headers']['Content-Length'] = strlen($body); + $opts['body'] = $body; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/RestSerializer.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/RestSerializer.php new file mode 100644 index 0000000..a0d342d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/RestSerializer.php @@ -0,0 +1,486 @@ + true, + 'glacier' => true + ]; + + /** @var Service */ + private Service $api; + + /** @var Uri */ + private $endpoint; + + /** @var bool */ + private $isUseEndpointV2; + + use EndpointV2SerializerTrait; + + /** + * @param Service $api Service API description + * @param string $endpoint Endpoint to connect to + */ + public function __construct(Service $api, $endpoint) + { + $this->api = $api; + $this->endpoint = Psr7\Utils::uriFor($endpoint); + } + + /** + * @param CommandInterface $command Command to serialize into a request. + * @param mixed|null $endpoint + * @return RequestInterface + */ + public function __invoke( + CommandInterface $command, + mixed $endpoint = null + ) + { + $operation = $this->api->getOperation($command->getName()); + $commandArgs = $command->toArray(); + $opts = $this->serialize($operation, $commandArgs); + $headers = $opts['headers'] ?? []; + + if ($endpoint instanceof RulesetEndpoint) { + $this->isUseEndpointV2 = true; + $this->setEndpointV2RequestOptions($endpoint, $headers); + } + + $uri = $this->buildEndpoint($operation, $commandArgs, $opts); + + return new Request( + $operation['http']['method'], + $uri, + $headers, + $opts['body'] ?? null + ); + } + + /** + * Modifies a hash of request options for a payload body. + * + * @param StructureShape $member Member to serialize + * @param array $value Value to serialize + * @param array $opts Request options to modify. + */ + abstract protected function payload( + StructureShape $member, + array $value, + array &$opts + ); + + private function serialize(Operation $operation, array $args) + { + $opts = []; + $input = $operation->getInput(); + + // Apply the payload trait if present + if ($payload = $input['payload']) { + $this->applyPayload($input, $payload, $args, $opts); + } + + foreach ($args as $name => $value) { + if ($input->hasMember($name)) { + $member = $input->getMember($name); + $location = $member['location']; + if (!$payload && !$location) { + $bodyMembers[$name] = $value; + } elseif ($location === 'header') { + $this->applyHeader($name, $member, $value, $opts); + } elseif ($location === 'querystring') { + $this->applyQuery($name, $member, $value, $opts); + } elseif ($location === 'headers') { + $this->applyHeaderMap($name, $member, $value, $opts); + } + } + } + + if (isset($bodyMembers)) { + $this->payload($input, $bodyMembers, $opts); + } else if (!isset($opts['body']) && $this->hasPayloadParam($input, $payload)) { + $this->payload($input, [], $opts); + } + + return $opts; + } + + private function applyPayload(StructureShape $input, $name, array $args, array &$opts) + { + if (!isset($args[$name])) { + return; + } + + $m = $input->getMember($name); + + $type = $m->getType(); + if ($m['streaming'] || + ($type === 'string' || $type === 'blob') + ) { + // This path skips setting the content-type header usually done in + // RestJsonSerializer and RestXmlSerializer.certain S3 and glacier + // operations determine content type in Middleware::ContentType() + if (!isset(self::$excludeContentType[$this->api->getServiceName()])) { + switch ($type) { + case 'string': + $opts['headers']['Content-Type'] = 'text/plain'; + break; + case 'blob': + $opts['headers']['Content-Type'] = 'application/octet-stream'; + break; + } + } + + $body = $args[$name]; + if (!$m['streaming'] && is_string($body)) { + $opts['headers']['Content-Length'] = strlen($body); + } + + // Streaming bodies or payloads that are strings are + // always just a stream of data. + $opts['body'] = Psr7\Utils::streamFor($body); + return; + } + + $this->payload($m, $args[$name], $opts); + } + + private function applyHeader($name, Shape $member, $value, array &$opts) + { + // Handle lists by recursively applying header logic to each element + if ($member instanceof ListShape) { + $listMember = $member->getMember(); + $headerValues = []; + + foreach ($value as $listValue) { + $tempOpts = ['headers' => []]; + $this->applyHeader('temp', $listMember, $listValue, $tempOpts); + $convertedValue = $tempOpts['headers']['temp']; + $headerValues[] = $convertedValue; + } + + $value = $headerValues; + } elseif (!is_null($value)) { + switch ($member->getType()) { + case 'timestamp': + $timestampFormat = $member['timestampFormat'] ?? 'rfc822'; + $value = $this->formatTimestamp($value, $timestampFormat); + break; + case 'boolean': + $value = $this->formatBoolean($value); + break; + } + } + + if ($member['jsonvalue']) { + $value = json_encode($value); + if (empty($value) && JSON_ERROR_NONE !== json_last_error()) { + throw new \InvalidArgumentException('Unable to encode the provided value' + . ' with \'json_encode\'. ' . json_last_error_msg()); + } + + $value = base64_encode($value); + } + + $opts['headers'][$member['locationName'] ?: $name] = $value; + } + + /** + * Note: This is currently only present in the Amazon S3 model. + */ + private function applyHeaderMap($name, Shape $member, array $value, array &$opts) + { + $prefix = $member['locationName']; + foreach ($value as $k => $v) { + $opts['headers'][$prefix . $k] = $v; + } + } + + private function applyQuery($name, Shape $member, $value, array &$opts) + { + if ($member instanceof MapShape) { + $opts['query'] = isset($opts['query']) && is_array($opts['query']) + ? $opts['query'] + $value + : $value; + } elseif ($member instanceof ListShape) { + $listMember = $member->getMember(); + $paramName = $member['locationName'] ?: $name; + + foreach ($value as $listValue) { + // Recursively call applyQuery for each list element + $tempOpts = ['query' => []]; + $this->applyQuery('temp', $listMember, $listValue, $tempOpts); + $opts['query'][$paramName][] = $tempOpts['query']['temp']; + } + } elseif (!is_null($value)) { + switch ($member->getType()) { + case 'timestamp': + $timestampFormat = $member['timestampFormat'] ?? 'iso8601'; + $value = $this->formatTimestamp($value, $timestampFormat); + break; + case 'boolean': + $value = $this->formatBoolean($value); + break; + } + + $opts['query'][$member['locationName'] ?: $name] = $value; + } + } + + private function buildEndpoint( + Operation $operation, + array $args, + array $opts + ): UriInterface + { + // Expand `requestUri` field members + $relativeUri = $this->expandUriTemplate($operation, $args); + + // Add query members to relativeUri + if (!empty($opts['query'])) { + $relativeUri = $this->appendQuery($opts['query'], $relativeUri); + } + + // Special case - S3 keys that need path preservation + if ($this->api->getServiceName() === 's3' + && isset($args['Key']) + && $this->shouldPreservePath($args['Key']) + ) { + return new Uri($this->endpoint . $relativeUri); + } + + return $this->resolveUri($relativeUri, $opts); + } + + /** + * Expands `requestUri` members + * + * @param Operation $operation + * @param array $args + * + * @return string + */ + private function expandUriTemplate(Operation $operation, array $args): string + { + $varDefinitions = $this->getVarDefinitions($operation, $args); + + return preg_replace_callback( + self::TEMPLATE_STRING_REGEX, + static function (array $matches) use ($varDefinitions) { + $isGreedy = str_ends_with($matches[1], '+'); + $varName = $isGreedy ? substr($matches[1], 0, -1) : $matches[1]; + + if (!isset($varDefinitions[$varName])) { + return ''; + } + + $value = $varDefinitions[$varName]; + + if ($isGreedy) { + return str_replace('%2F', '/', rawurlencode($value)); + } + + return rawurlencode($value); + }, + $operation['http']['requestUri'] + ); + } + + /** + * Checks for path-like key names. If detected, traditional + * URI resolution is bypassed. + * + * @param string $key + * @return bool + */ + private function shouldPreservePath(string $key): bool + { + // Keys with dot segments + if (str_contains($key, '.')) { + $segments = explode('/', $key); + foreach ($segments as $segment) { + if ($segment === '.' || $segment === '..') { + return true; + } + } + } + + // Keys starting with slash + if (str_starts_with($key, '/')) { + return true; + } + + return false; + } + + /** + * @param string $relativeUri + * @param array $opts + * + * @return UriInterface + */ + private function resolveUri(string $relativeUri, array $opts): UriInterface + { + $basePath = $this->endpoint->getPath(); + + // Only process if we have a non-empty base path + if (!empty($basePath) && $basePath !== '/') { + // if relative is just '/', we want just the base path without trailing slash + if ($relativeUri === '/' || empty($relativeUri)) { + // Remove trailing slash if present + return $this->endpoint->withPath(rtrim($basePath, '/')); + } + + // if relative is '/?query', we want base path without trailing slash + query + // for now, this is only seen with S3 GetBucketLocation after processing the model + if (empty($opts['query']) + && str_starts_with($relativeUri, '/?') + ) { + $query = substr($relativeUri, 2); // Remove '/?' + return $this->endpoint->withQuery($query); + } + + // Ensure base path has trailing slash + if (!str_ends_with($basePath, '/')) { + $this->endpoint = $this->endpoint->withPath($basePath . '/'); + } + + // Remove leading slash from relative path to make it relative + if (str_starts_with($relativeUri, '/')) { + $relativeUri = substr($relativeUri, 1); + } + } + + return UriResolver::resolve($this->endpoint, new Uri($relativeUri)); + } + + /** + * @param StructureShape $input + * @param $payload + * + * @return bool + */ + private function hasPayloadParam(StructureShape $input, $payload) + { + if ($payload) { + $potentiallyEmptyTypes = ['blob','string']; + if ($this->api->getProtocol() === 'rest-xml') { + $potentiallyEmptyTypes[] = 'structure'; + } + + $payloadMember = $input->getMember($payload); + //unions may also be empty/unset + if (!empty($payloadMember['union']) + || in_array($payloadMember['type'], $potentiallyEmptyTypes) + ) { + return false; + } + } + + foreach ($input->getMembers() as $member) { + if (!isset($member['location'])) { + return true; + } + } + + return false; + } + + /** + * @param $query + * @param $relativeUri + * + * @return string + */ + private function appendQuery($query, $relativeUri): string + { + $append = Psr7\Query::build($query); + return $relativeUri + . (str_contains($relativeUri, '?') ? "&{$append}" : "?{$append}"); + } + + /** + * @param CommandInterface $command + * @param array $args + * + * @return array + */ + private function getVarDefinitions( + Operation $operation, + array $args + ): array + { + $varDefinitions = []; + + foreach ($operation->getInput()->getMembers() as $name => $member) { + if ($member['location'] === 'uri') { + $value = $args[$name] ?? null; + if (!is_null($value)) { + switch ($member->getType()) { + case 'timestamp': + $timestampFormat = $member['timestampFormat'] ?? 'iso8601'; + $value = $this->formatTimestamp($value, $timestampFormat); + break; + case 'boolean': + $value = $this->formatBoolean($value); + break; + } + } + + $varDefinitions[$member['locationName'] ?: $name] = $value; + } + } + + return $varDefinitions; + } + + /** + * @param DateTimeInterface|string|int $value + * @param string $timestampFormat + * + * @return string + */ + private function formatTimestamp( + DateTimeInterface|string|int $value, + string $timestampFormat + ): string + { + return TimestampShape::format($value, $timestampFormat); + } + + /** + * @param $value + * + * @return string + */ + private function formatBoolean($value): string + { + return $value ? 'true' : 'false'; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/RestXmlSerializer.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/RestXmlSerializer.php new file mode 100644 index 0000000..16d8ae7 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/RestXmlSerializer.php @@ -0,0 +1,50 @@ +xmlBody = $xmlBody ?: new XmlBody($api); + } + + protected function payload(StructureShape $member, array $value, array &$opts) + { + $opts['headers']['Content-Type'] = 'application/xml'; + $body = $this->getXmlBody($member, $value); + $opts['headers']['Content-Length'] = strlen($body); + $opts['body'] = $body; + } + + /** + * @param StructureShape $member + * @param array $value + * @return string + */ + private function getXmlBody(StructureShape $member, array $value) + { + $xmlBody = (string)$this->xmlBody->build($member, $value); + $xmlBody = str_replace("'", "'", $xmlBody); + $xmlBody = str_replace('\r', " ", $xmlBody); + $xmlBody = str_replace('\n', " ", $xmlBody); + return $xmlBody; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Serializer/XmlBody.php b/vendor/aws/aws-sdk-php/src/Api/Serializer/XmlBody.php new file mode 100644 index 0000000..9ce967e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Serializer/XmlBody.php @@ -0,0 +1,256 @@ +api = $api; + } + + /** + * Builds the XML body based on an array of arguments. + * + * @param Shape $shape Operation being constructed + * @param array $args Associative array of arguments + * + * @return string + */ + public function build(Shape $shape, array $args) + { + $xml = new XMLWriter(); + $xml->openMemory(); + $xml->startDocument('1.0', 'UTF-8'); + + $rootElementName = $this->determineRootElementName($shape); + + $this->format($shape, $rootElementName, $args, $xml); + $xml->endDocument(); + + return $xml->outputMemory(); + } + + private function startElement(Shape $shape, $name, XMLWriter $xml) + { + $xml->startElement($name); + + if ($ns = $shape['xmlNamespace']) { + $xml->writeAttribute( + isset($ns['prefix']) ? "xmlns:{$ns['prefix']}" : 'xmlns', + $ns['uri'] + ); + } + } + + private function format(Shape $shape, $name, $value, XMLWriter $xml) + { + // Any method mentioned here has a custom serialization handler. + static $methods = [ + 'add_structure' => true, + 'add_list' => true, + 'add_blob' => true, + 'add_timestamp' => true, + 'add_boolean' => true, + 'add_map' => true, + 'add_string' => true + ]; + + $type = 'add_' . $shape['type']; + if (isset($methods[$type])) { + $this->{$type}($shape, $name, $value, $xml); + } else { + $this->defaultShape($shape, $name, $value, $xml); + } + } + + private function defaultShape(Shape $shape, $name, $value, XMLWriter $xml) + { + $this->startElement($shape, $name, $xml); + $xml->text($value); + $xml->endElement(); + } + + private function add_structure( + StructureShape $shape, + $name, + array $value, + \XMLWriter $xml + ) { + $this->startElement($shape, $name, $xml); + + foreach ($this->getStructureMembers($shape, $value) as $k => $definition) { + // Default to member name + $elementName = $k; + + // Only use locationName for non-structure members + if (!($definition['member'] instanceof StructureShape) + && $definition['member']['locationName'] + ) { + $elementName = $definition['member']['locationName']; + } + + $this->format( + $definition['member'], + $elementName, + $definition['value'], + $xml + ); + } + + $xml->endElement(); + } + + private function getStructureMembers(StructureShape $shape, array $value) + { + $members = []; + + foreach ($value as $k => $v) { + if ($v !== null && $shape->hasMember($k)) { + $definition = [ + 'member' => $shape->getMember($k), + 'value' => $v, + ]; + + if ($definition['member']['xmlAttribute']) { + // array_unshift_associative + $members = [$k => $definition] + $members; + } else { + $members[$k] = $definition; + } + } + } + + return $members; + } + + private function add_list( + ListShape $shape, + $name, + array $value, + XMLWriter $xml + ) { + $items = $shape->getMember(); + + if ($shape['flattened']) { + $elementName = $name; + } else { + $this->startElement($shape, $name, $xml); + $elementName = $items['locationName'] ?: 'member'; + } + + foreach ($value as $v) { + $this->format($items, $elementName, $v, $xml); + } + + if (!$shape['flattened']) { + $xml->endElement(); + } + } + + private function add_map( + MapShape $shape, + $name, + array $value, + XMLWriter $xml + ) { + $xmlEntry = $shape['flattened'] ? $name : 'entry'; + $xmlKey = $shape->getKey()['locationName'] ?: 'key'; + $xmlValue = $shape->getValue()['locationName'] ?: 'value'; + + if (!$shape['flattened']) { + $this->startElement($shape, $name, $xml); + } + + foreach ($value as $key => $v) { + $this->startElement($shape, $xmlEntry, $xml); + $this->format($shape->getKey(), $xmlKey, $key, $xml); + $this->format($shape->getValue(), $xmlValue, $v, $xml); + $xml->endElement(); + } + + if (!$shape['flattened']) { + $xml->endElement(); + } + } + + private function add_blob(Shape $shape, $name, $value, XMLWriter $xml) + { + $this->startElement($shape, $name, $xml); + $xml->writeRaw(base64_encode($value)); + $xml->endElement(); + } + + private function add_timestamp( + TimestampShape $shape, + $name, + $value, + XMLWriter $xml + ) { + $this->startElement($shape, $name, $xml); + $timestampFormat = !empty($shape['timestampFormat']) + ? $shape['timestampFormat'] + : 'iso8601'; + $xml->writeRaw(TimestampShape::format($value, $timestampFormat)); + $xml->endElement(); + } + + private function add_boolean( + Shape $shape, + $name, + $value, + XMLWriter $xml + ) { + $this->startElement($shape, $name, $xml); + $xml->writeRaw($value ? 'true' : 'false'); + $xml->endElement(); + } + + private function add_string( + Shape $shape, + $name, + $value, + XMLWriter $xml + ) { + if ($shape['xmlAttribute']) { + $xml->writeAttribute($shape['locationName'] ?: $name, $value); + } else { + $this->defaultShape($shape, $name, $value, $xml); + } + } + + private function determineRootElementName(Shape $shape): string + { + $shapeName = $shape->getName(); + + // Look up the shape definition first + if ($shapeName && $shapeMap = $shape->getShapeMap()) { + if (isset($shapeMap[$shapeName]['locationName'])) { + return $shapeMap[$shapeName]['locationName']; + } + } + + // Fall back to shape's current locationName + if ($shape['locationName']) { + return $shape['locationName']; + } + + return $shapeName; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Service.php b/vendor/aws/aws-sdk-php/src/Api/Service.php new file mode 100644 index 0000000..38bd451 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Service.php @@ -0,0 +1,564 @@ + [], + 'shapes' => [], + 'metadata' => [], + 'clientContextParams' => [] + ], $defaultMeta = [ + 'apiVersion' => null, + 'serviceFullName' => null, + 'serviceId' => null, + 'endpointPrefix' => null, + 'signingName' => null, + 'signatureVersion' => null, + 'protocol' => null, + 'uid' => null + ]; + + $definition += $defaults; + $definition['metadata'] += $defaultMeta; + $this->definition = $definition; + $this->apiProvider = $provider; + parent::__construct($definition, new ShapeMap($definition['shapes'])); + + if (isset($definition['metadata']['serviceIdentifier'])) { + $this->serviceName = $this->getServiceName(); + } else { + $this->serviceName = $this->getEndpointPrefix(); + } + $this->apiVersion = $this->getApiVersion(); + if (isset($definition['clientContextParams'])) { + $this->clientContextParams = $definition['clientContextParams']; + } + + $this->protocol = $this->selectProtocol($definition); + } + + /** + * Creates a request serializer for the provided API object. + * + * @param Service $api API that contains a protocol. + * @param string $endpoint Endpoint to send requests to. + * + * @return callable + * @throws \UnexpectedValueException + */ + public static function createSerializer(Service $api, $endpoint) + { + static $mapping = [ + 'json' => Serializer\JsonRpcSerializer::class, + 'query' => Serializer\QuerySerializer::class, + 'rest-json' => Serializer\RestJsonSerializer::class, + 'rest-xml' => Serializer\RestXmlSerializer::class + ]; + + $proto = $api->getProtocol(); + + if (isset($mapping[$proto])) { + return new $mapping[$proto]($api, $endpoint); + } + + if ($proto == 'ec2') { + return new Serializer\QuerySerializer($api, $endpoint, new Serializer\Ec2ParamBuilder()); + } + + throw new \UnexpectedValueException( + 'Unknown protocol: ' . $api->getProtocol() + ); + } + + /** + * Creates an error parser for the given protocol. + * + * Redundant method signature to preserve backwards compatibility. + * + * @param string $protocol Protocol to parse (e.g., query, json, etc.) + * + * @return callable + * @throws \UnexpectedValueException + */ + public static function createErrorParser($protocol, ?Service $api = null) + { + static $mapping = [ + 'json' => ErrorParser\JsonRpcErrorParser::class, + 'query' => ErrorParser\XmlErrorParser::class, + 'rest-json' => ErrorParser\RestJsonErrorParser::class, + 'rest-xml' => ErrorParser\XmlErrorParser::class, + 'ec2' => ErrorParser\XmlErrorParser::class + ]; + + if (isset($mapping[$protocol])) { + return new $mapping[$protocol]($api); + } + + throw new \UnexpectedValueException("Unknown protocol: $protocol"); + } + + /** + * Applies the listeners needed to parse client models. + * + * @param Service $api API to create a parser for + * @return callable + * @throws \UnexpectedValueException + */ + public static function createParser(Service $api) + { + static $mapping = [ + 'json' => Parser\JsonRpcParser::class, + 'query' => Parser\QueryParser::class, + 'rest-json' => Parser\RestJsonParser::class, + 'rest-xml' => Parser\RestXmlParser::class + ]; + + $proto = $api->getProtocol(); + if (isset($mapping[$proto])) { + return new $mapping[$proto]($api); + } + + if ($proto == 'ec2') { + return new Parser\QueryParser($api, null, false); + } + + throw new \UnexpectedValueException( + 'Unknown protocol: ' . $api->getProtocol() + ); + } + + /** + * Get the full name of the service + * + * @return string + */ + public function getServiceFullName() + { + return $this->definition['metadata']['serviceFullName']; + } + + /** + * Get the service id + * + * @return string + */ + public function getServiceId() + { + return $this->definition['metadata']['serviceId']; + } + + /** + * Get the API version of the service + * + * @return string + */ + public function getApiVersion() + { + return $this->definition['metadata']['apiVersion']; + } + + /** + * Get the API version of the service + * + * @return string + */ + public function getEndpointPrefix() + { + return $this->definition['metadata']['endpointPrefix']; + } + + /** + * Get the signing name used by the service. + * + * @return string + */ + public function getSigningName() + { + return $this->definition['metadata']['signingName'] + ?: $this->definition['metadata']['endpointPrefix']; + } + + /** + * Get the service name. + * + * @return string + */ + public function getServiceName() + { + return $this->definition['metadata']['serviceIdentifier'] ?? null; + } + + /** + * Get the default signature version of the service. + * + * Note: this method assumes "v4" when not specified in the model. + * + * @return string + */ + public function getSignatureVersion() + { + return $this->definition['metadata']['signatureVersion'] ?: 'v4'; + } + + /** + * Get the protocol used by the service. + * + * @return string + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * Get the uid string used by the service + * + * @return string + */ + public function getUid() + { + return $this->definition['metadata']['uid']; + } + + /** + * Check if the description has a specific operation by name. + * + * @param string $name Operation to check by name + * + * @return bool + */ + public function hasOperation($name) + { + return isset($this['operations'][$name]); + } + + /** + * Get an operation by name. + * + * @param string $name Operation to retrieve by name + * + * @return Operation + * @throws \InvalidArgumentException If the operation is not found + */ + public function getOperation($name) + { + if (!isset($this->operations[$name])) { + if (!isset($this->definition['operations'][$name])) { + throw new \InvalidArgumentException("Unknown operation: $name"); + } + $this->operations[$name] = new Operation( + $this->definition['operations'][$name], + $this->shapeMap + ); + } elseif ($this->modifiedModel) { + $this->operations[$name] = new Operation( + $this->definition['operations'][$name], + $this->shapeMap + ); + } + + return $this->operations[$name]; + } + + /** + * Get all of the operations of the description. + * + * @return Operation[] + */ + public function getOperations() + { + $result = []; + foreach ($this->definition['operations'] as $name => $definition) { + $result[$name] = $this->getOperation($name); + } + + return $result; + } + + /** + * Get all of the error shapes of the service + * + * @return array + */ + public function getErrorShapes() + { + $result = []; + foreach ($this->definition['shapes'] as $name => $definition) { + if (!empty($definition['exception'])) { + $definition['name'] = $name; + $result[] = new StructureShape($definition, $this->getShapeMap()); + } + } + + return $result; + } + + /** + * Get all of the service metadata or a specific metadata key value. + * + * @param string|null $key Key to retrieve or null to retrieve all metadata + * + * @return mixed Returns the result or null if the key is not found + */ + public function getMetadata($key = null) + { + if (!$key) { + return $this['metadata']; + } + + if (isset($this->definition['metadata'][$key])) { + return $this->definition['metadata'][$key]; + } + + return null; + } + + /** + * Gets an associative array of available paginator configurations where + * the key is the name of the paginator, and the value is the paginator + * configuration. + * + * @return array + * @unstable The configuration format of paginators may change in the future + */ + public function getPaginators() + { + if (!isset($this->paginators)) { + $res = call_user_func( + $this->apiProvider, + 'paginator', + $this->serviceName, + $this->apiVersion + ); + $this->paginators = isset($res['pagination']) + ? $res['pagination'] + : []; + } + + return $this->paginators; + } + + /** + * Determines if the service has a paginator by name. + * + * @param string $name Name of the paginator. + * + * @return bool + */ + public function hasPaginator($name) + { + return isset($this->getPaginators()[$name]); + } + + /** + * Retrieve a paginator by name. + * + * @param string $name Paginator to retrieve by name. This argument is + * typically the operation name. + * @return array + * @throws \UnexpectedValueException if the paginator does not exist. + * @unstable The configuration format of paginators may change in the future + */ + public function getPaginatorConfig($name) + { + static $defaults = [ + 'input_token' => null, + 'output_token' => null, + 'limit_key' => null, + 'result_key' => null, + 'more_results' => null, + ]; + + if ($this->hasPaginator($name)) { + return $this->paginators[$name] + $defaults; + } + + throw new \UnexpectedValueException("There is no {$name} " + . "paginator defined for the {$this->serviceName} service."); + } + + /** + * Gets an associative array of available waiter configurations where the + * key is the name of the waiter, and the value is the waiter + * configuration. + * + * @return array + */ + public function getWaiters() + { + if (!isset($this->waiters)) { + $res = call_user_func( + $this->apiProvider, + 'waiter', + $this->serviceName, + $this->apiVersion + ); + $this->waiters = isset($res['waiters']) + ? $res['waiters'] + : []; + } + + return $this->waiters; + } + + /** + * Determines if the service has a waiter by name. + * + * @param string $name Name of the waiter. + * + * @return bool + */ + public function hasWaiter($name) + { + return isset($this->getWaiters()[$name]); + } + + /** + * Get a waiter configuration by name. + * + * @param string $name Name of the waiter by name. + * + * @return array + * @throws \UnexpectedValueException if the waiter does not exist. + */ + public function getWaiterConfig($name) + { + // Error if the waiter is not defined + if ($this->hasWaiter($name)) { + return $this->waiters[$name]; + } + + throw new \UnexpectedValueException("There is no {$name} waiter " + . "defined for the {$this->serviceName} service."); + } + + /** + * Get the shape map used by the API. + * + * @return ShapeMap + */ + public function getShapeMap() + { + return $this->shapeMap; + } + + /** + * Get all the context params of the description. + * + * @return array + */ + public function getClientContextParams() + { + return $this->clientContextParams; + } + + /** + * Get the service's api provider. + * + * @return callable + */ + public function getProvider() + { + return $this->apiProvider; + } + + /** + * Get the service's definition. + * + * @return callable + */ + public function getDefinition() + { + return $this->definition; + } + + /** + * Sets the service's api definition. + * Intended for internal use only. + * + * @return void + * + * @internal + */ + public function setDefinition($definition) + { + $this->definition = $definition; + $this->shapeMap = new ShapeMap($definition['shapes']); + $this->modifiedModel = true; + } + + /** + * Denotes whether or not a service's definition has + * been modified. Intended for internal use only. + * + * @return bool + * + * @internal + */ + public function isModifiedModel() + { + return $this->modifiedModel; + } + + /** + * Accepts a list of protocols derived from the service model. + * Returns the highest priority compatible auth scheme if the `protocols` trait is present. + * Otherwise, returns the value of the `protocol` field, if set, or null. + * + * @param array $definition + * + * @return string|null + */ + private function selectProtocol(array $definition): string | null + { + $modeledProtocols = $definition['metadata']['protocols'] ?? null; + if (!empty($modeledProtocols)) { + foreach(SupportedProtocols::cases() as $protocol) { + if (in_array($protocol->value, $modeledProtocols)) { + return $protocol->value; + } + } + } + + return $definition['metadata']['protocol'] ?? null; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Shape.php b/vendor/aws/aws-sdk-php/src/Api/Shape.php new file mode 100644 index 0000000..765efc0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Shape.php @@ -0,0 +1,77 @@ + StructureShape::class, + 'map' => MapShape::class, + 'list' => ListShape::class, + 'timestamp' => TimestampShape::class, + 'integer' => Shape::class, + 'double' => Shape::class, + 'float' => Shape::class, + 'long' => Shape::class, + 'string' => Shape::class, + 'byte' => Shape::class, + 'character' => Shape::class, + 'blob' => Shape::class, + 'boolean' => Shape::class + ]; + + if (isset($definition['shape'])) { + return $shapeMap->resolve($definition); + } + + if (!isset($map[$definition['type']])) { + throw new \RuntimeException('Invalid type: ' + . print_r($definition, true)); + } + + $type = $map[$definition['type']]; + + return new $type($definition, $shapeMap); + } + + /** + * Get the type of the shape + * + * @return string + */ + public function getType() + { + return $this->definition['type']; + } + + /** + * Get the name of the shape + * + * @return string + */ + public function getName() + { + return $this->definition['name']; + } + + /** + * Get a context param definition. + */ + public function getContextParam() + { + return $this->contextParam; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/ShapeMap.php b/vendor/aws/aws-sdk-php/src/Api/ShapeMap.php new file mode 100644 index 0000000..269b2d3 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/ShapeMap.php @@ -0,0 +1,109 @@ +definitions = $shapeModels; + } + + /** + * Get an array of shape names. + * + * @return array + */ + public function getShapeNames() + { + return array_keys($this->definitions); + } + + /** + * Resolve a shape reference + * + * @param array $shapeRef Shape reference shape + * + * @return Shape + * @throws \InvalidArgumentException + */ + public function resolve(array $shapeRef) + { + $shape = $shapeRef['shape']; + + if (!isset($this->definitions[$shape])) { + throw new \InvalidArgumentException('Shape not found: ' . $shape); + } + + $isSimple = count($shapeRef) == 1; + if ($isSimple && isset($this->simple[$shape])) { + return $this->simple[$shape]; + } + + $definition = $shapeRef + $this->definitions[$shape]; + $definition['name'] = $definition['shape']; + if (isset($definition['shape'])) { + unset($definition['shape']); + } + + $result = Shape::create($definition, $this); + + if ($isSimple) { + $this->simple[$shape] = $result; + } + + return $result; + } + + /** + * @param mixed $offset + * @return bool + */ + public function offsetExists(mixed $offset): bool + { + return isset($this->definitions[$offset]); + } + + /** + * @param mixed $offset + * @return mixed + */ + public function offsetGet(mixed $offset): mixed + { + return $this->definitions[$offset] ?? null; + } + + /** + * @param mixed $offset + * @param mixed $value + * @throws \BadMethodCallException + */ + public function offsetSet(mixed $offset, mixed $value): void + { + throw new \BadMethodCallException( + 'ShapeMap is read-only and cannot be modified.' + ); + } + + /** + * @param mixed $offset + * @throws \BadMethodCallException + */ + public function offsetUnset(mixed $offset): void + { + throw new \BadMethodCallException( + 'ShapeMap is read-only and cannot be modified.' + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/StructureShape.php b/vendor/aws/aws-sdk-php/src/Api/StructureShape.php new file mode 100644 index 0000000..2cfe770 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/StructureShape.php @@ -0,0 +1,105 @@ +members)) { + $this->generateMembersHash(); + } + + return $this->members; + } + + /** + * Check if a specific member exists by name. + * + * @param string $name Name of the member to check + * + * @return bool + */ + public function hasMember($name) + { + return isset($this->definition['members'][$name]); + } + + /** + * Retrieve a member by name. + * + * @param string $name Name of the member to retrieve + * + * @return Shape + * @throws \InvalidArgumentException if the member is not found. + */ + public function getMember($name) + { + $members = $this->getMembers(); + + if (!isset($members[$name])) { + throw new \InvalidArgumentException('Unknown member ' . $name); + } + + return $members[$name]; + } + + /** + * Used to look up the shape's original definition. + * ShapeMap::resolve() merges properties from both + * member and target shape definitions, causing certain + * properties like `locationName` to be overwritten. + * + * @return ShapeMap + * @internal This method is for internal use only and should not be used + * by external code. It may be changed or removed without notice. + */ + public function getShapeMap(): ShapeMap + { + return $this->shapeMap; + } + + /** + * Used to look up a shape's original definition. + * + * @param string $name + * + * @return array|null + */ + public function getOriginalDefinition(string $name): ?array + { + return $this->shapeMap[$name] ?? null; + } + + private function generateMembersHash() + { + $this->members = []; + + foreach ($this->definition['members'] as $name => $definition) { + $this->members[$name] = $this->shapeFor($definition); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/SupportedProtocols.php b/vendor/aws/aws-sdk-php/src/Api/SupportedProtocols.php new file mode 100644 index 0000000..8a06bd0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/SupportedProtocols.php @@ -0,0 +1,26 @@ +getTimestamp(); + } elseif (is_string($value)) { + $value = strtotime($value); + } elseif (!is_int($value)) { + throw new \InvalidArgumentException('Unable to handle the provided' + . ' timestamp type: ' . gettype($value)); + } + + switch ($format) { + case 'iso8601': + return gmdate('Y-m-d\TH:i:s\Z', $value); + case 'rfc822': + return gmdate('D, d M Y H:i:s \G\M\T', $value); + case 'unixTimestamp': + return $value; + default: + throw new \UnexpectedValueException('Unknown timestamp format: ' + . $format); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Api/Validator.php b/vendor/aws/aws-sdk-php/src/Api/Validator.php new file mode 100644 index 0000000..17e548b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Api/Validator.php @@ -0,0 +1,336 @@ + true, + 'min' => true, + 'max' => false, + 'pattern' => false + ]; + + /** + * @param array $constraints Associative array of constraints to enforce. + * Accepts the following keys: "required", "min", + * "max", and "pattern". If a key is not + * provided, the constraint will assume false. + */ + public function __construct(?array $constraints = null) + { + static $assumedFalseValues = [ + 'required' => false, + 'min' => false, + 'max' => false, + 'pattern' => false + ]; + $this->constraints = empty($constraints) + ? self::$defaultConstraints + : $constraints + $assumedFalseValues; + } + + /** + * Validates the given input against the schema. + * + * @param string $name Operation name + * @param Shape $shape Shape to validate + * @param array $input Input to validate + * + * @throws \InvalidArgumentException if the input is invalid. + */ + public function validate($name, Shape $shape, array $input) + { + $this->dispatch($shape, $input); + + if ($this->errors) { + $message = sprintf( + "Found %d error%s while validating the input provided for the " + . "%s operation:\n%s", + count($this->errors), + count($this->errors) > 1 ? 's' : '', + $name, + implode("\n", $this->errors) + ); + $this->errors = []; + + throw new \InvalidArgumentException($message); + } + } + + private function dispatch(Shape $shape, $value) + { + static $methods = [ + 'structure' => 'check_structure', + 'list' => 'check_list', + 'map' => 'check_map', + 'blob' => 'check_blob', + 'boolean' => 'check_boolean', + 'integer' => 'check_numeric', + 'float' => 'check_numeric', + 'long' => 'check_numeric', + 'string' => 'check_string', + 'byte' => 'check_string', + 'char' => 'check_string' + ]; + + $type = $shape->getType(); + if (isset($methods[$type])) { + $this->{$methods[$type]}($shape, $value); + } + } + + private function check_structure(StructureShape $shape, $value) + { + $isDocument = (isset($shape['document']) && $shape['document']); + $isUnion = (isset($shape['union']) && $shape['union']); + if ($isDocument) { + if (!$this->checkDocumentType($value)) { + $this->addError("is not a valid document type"); + return; + } + } elseif ($isUnion) { + if (!$this->checkUnion($value)) { + $this->addError("is a union type and must have exactly one non null value"); + return; + } + } elseif (!$this->checkAssociativeArray($value)) { + return; + } + + if ($this->constraints['required'] && $shape['required']) { + foreach ($shape['required'] as $req) { + if (!isset($value[$req])) { + $this->path[] = $req; + $this->addError('is missing and is a required parameter'); + array_pop($this->path); + } + } + } + if (!$isDocument) { + foreach ($value as $name => $v) { + if ($shape->hasMember($name)) { + $this->path[] = $name; + $this->dispatch( + $shape->getMember($name), + isset($value[$name]) ? $value[$name] : null + ); + array_pop($this->path); + } + } + } + } + + private function check_list(ListShape $shape, $value) + { + if (!is_array($value)) { + $this->addError('must be an array. Found ' + . Aws\describe_type($value)); + return; + } + + $this->validateRange($shape, count($value), "list element count"); + + $items = $shape->getMember(); + foreach ($value as $index => $v) { + $this->path[] = $index; + $this->dispatch($items, $v); + array_pop($this->path); + } + } + + private function check_map(MapShape $shape, $value) + { + if (!$this->checkAssociativeArray($value)) { + return; + } + + $values = $shape->getValue(); + foreach ($value as $key => $v) { + $this->path[] = $key; + $this->dispatch($values, $v); + array_pop($this->path); + } + } + + private function check_blob(Shape $shape, $value) + { + static $valid = [ + 'string' => true, + 'integer' => true, + 'double' => true, + 'resource' => true + ]; + + $type = gettype($value); + if (!isset($valid[$type])) { + if ($type != 'object' || !method_exists($value, '__toString')) { + $this->addError('must be an fopen resource, a ' + . 'GuzzleHttp\Stream\StreamInterface object, or something ' + . 'that can be cast to a string. Found ' + . Aws\describe_type($value)); + } + } + } + + private function check_numeric(Shape $shape, $value) + { + if (!is_numeric($value)) { + $this->addError('must be numeric. Found ' + . Aws\describe_type($value)); + return; + } + + $this->validateRange($shape, $value, "numeric value"); + } + + private function check_boolean(Shape $shape, $value) + { + if (!is_bool($value)) { + $this->addError('must be a boolean. Found ' + . Aws\describe_type($value)); + } + } + + private function check_string(Shape $shape, $value) + { + if ($shape['jsonvalue']) { + if (!self::canJsonEncode($value)) { + $this->addError('must be a value encodable with \'json_encode\'.' + . ' Found ' . Aws\describe_type($value)); + } + return; + } + + if (!$this->checkCanString($value)) { + $this->addError('must be a string or an object that implements ' + . '__toString(). Found ' . Aws\describe_type($value)); + return; + } + + $value = isset($value) ? $value : ''; + $this->validateRange($shape, strlen($value), "string length"); + + if ($this->constraints['pattern']) { + $pattern = $shape['pattern']; + if ($pattern && !preg_match("/$pattern/", $value)) { + $this->addError("Pattern /$pattern/ failed to match '$value'"); + } + } + } + + private function validateRange(Shape $shape, $length, $descriptor) + { + if ($this->constraints['min']) { + $min = $shape['min']; + if ($min && $length < $min) { + $this->addError("expected $descriptor to be >= $min, but " + . "found $descriptor of $length"); + } + } + + if ($this->constraints['max']) { + $max = $shape['max']; + if ($max && $length > $max) { + $this->addError("expected $descriptor to be <= $max, but " + . "found $descriptor of $length"); + } + } + } + + private function checkArray($arr) + { + return array_is_list($arr) || Aws\is_associative($arr); + } + + private function checkCanString($value) + { + static $valid = [ + 'string' => true, + 'integer' => true, + 'double' => true, + 'NULL' => true, + ]; + + $type = gettype($value); + + return isset($valid[$type]) || + ($type == 'object' && method_exists($value, '__toString')); + } + + private function checkAssociativeArray($value) + { + $isAssociative = false; + + if (is_array($value)) { + $expectedIndex = 0; + $key = key($value); + + do { + $isAssociative = $key !== $expectedIndex++; + next($value); + $key = key($value); + } while (!$isAssociative && null !== $key); + } + + if (!$isAssociative) { + $this->addError('must be an associative array. Found ' + . Aws\describe_type($value)); + return false; + } + + return true; + } + + private function checkDocumentType($value) + { + if (is_array($value)) { + $typeOfFirstKey = gettype(key($value)); + foreach ($value as $key => $val) { + if (!$this->checkDocumentType($val) || gettype($key) != $typeOfFirstKey) { + return false; + } + } + return $this->checkArray($value); + } + return is_null($value) + || is_numeric($value) + || is_string($value) + || is_bool($value); + } + + private function checkUnion($value) + { + if (is_array($value)) { + $nonNullCount = 0; + foreach ($value as $key => $val) { + if (!is_null($val) && !(strpos($key, "@") === 0)) { + $nonNullCount++; + } + } + return $nonNullCount == 1; + } + return !is_null($value); + } + + private function addError($message) + { + $this->errors[] = + implode('', array_map(function ($s) { return "[{$s}]"; }, $this->path)) + . ' ' + . $message; + } + + private function canJsonEncode($data) + { + return !is_resource($data); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Arn/AccessPointArn.php b/vendor/aws/aws-sdk-php/src/Arn/AccessPointArn.php new file mode 100644 index 0000000..e7b88ee --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Arn/AccessPointArn.php @@ -0,0 +1,66 @@ +data); + } + + public static function parse($string) + { + $data = parent::parse($string); + $data = self::parseResourceTypeAndId($data); + $data['accesspoint_name'] = $data['resource_id']; + return $data; + } + + public function getAccesspointName() + { + return $this->data['accesspoint_name']; + } + + /** + * Validation specific to AccessPointArn + * + * @param array $data + */ + protected static function validate(array $data) + { + self::validateRegion($data, 'access point ARN'); + self::validateAccountId($data, 'access point ARN'); + + if ($data['resource_type'] !== 'accesspoint') { + throw new InvalidArnException("The 6th component of an access point ARN" + . " represents the resource type and must be 'accesspoint'."); + } + + if (empty($data['resource_id'])) { + throw new InvalidArnException("The 7th component of an access point ARN" + . " represents the resource ID and must not be empty."); + } + if (strpos($data['resource_id'], ':') !== false) { + throw new InvalidArnException("The resource ID component of an access" + . " point ARN must not contain additional components" + . " (delimited by ':')."); + } + if (!self::isValidHostLabel($data['resource_id'])) { + throw new InvalidArnException("The resource ID in an access point ARN" + . " must be a valid host label value."); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Arn/AccessPointArnInterface.php b/vendor/aws/aws-sdk-php/src/Arn/AccessPointArnInterface.php new file mode 100644 index 0000000..9eb5f2b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Arn/AccessPointArnInterface.php @@ -0,0 +1,10 @@ + null, + 'partition' => null, + 'service' => null, + 'region' => null, + 'account_id' => null, + 'resource' => null, + ]; + + $length = strlen($string); + $lastDelim = 0; + $numComponents = 0; + for ($i = 0; $i < $length; $i++) { + + if (($numComponents < 5 && $string[$i] === ':')) { + // Split components between delimiters + $data[key($data)] = substr($string, $lastDelim, $i - $lastDelim); + + // Do not include delimiter character itself + $lastDelim = $i + 1; + next($data); + $numComponents++; + } + + if ($i === $length - 1) { + // Put the remainder in the last component. + if (in_array($numComponents, [5])) { + $data['resource'] = substr($string, $lastDelim); + } else { + // If there are < 5 components, put remainder in current + // component. + $data[key($data)] = substr($string, $lastDelim); + } + } + } + + return $data; + } + + public function __construct($data) + { + if (is_array($data)) { + $this->data = $data; + } elseif (is_string($data)) { + $this->data = static::parse($data); + } else { + throw new InvalidArnException('Constructor accepts a string or an' + . ' array as an argument.'); + } + + static::validate($this->data); + } + + public function __toString() + { + if (!isset($this->string)) { + $components = [ + $this->getPrefix(), + $this->getPartition(), + $this->getService(), + $this->getRegion(), + $this->getAccountId(), + $this->getResource(), + ]; + + $this->string = implode(':', $components); + } + return $this->string; + } + + public function getPrefix() + { + return $this->data['arn']; + } + + public function getPartition() + { + return $this->data['partition']; + } + + public function getService() + { + return $this->data['service']; + } + + public function getRegion() + { + return $this->data['region']; + } + + public function getAccountId() + { + return $this->data['account_id']; + } + + public function getResource() + { + return $this->data['resource']; + } + + public function toArray() + { + return $this->data; + } + + /** + * Minimally restrictive generic ARN validation + * + * @param array $data + */ + protected static function validate(array $data) + { + if ($data['arn'] !== 'arn') { + throw new InvalidArnException("The 1st component of an ARN must be" + . " 'arn'."); + } + + if (empty($data['partition'])) { + throw new InvalidArnException("The 2nd component of an ARN" + . " represents the partition and must not be empty."); + } + + if (empty($data['service'])) { + throw new InvalidArnException("The 3rd component of an ARN" + . " represents the service and must not be empty."); + } + + if (empty($data['resource'])) { + throw new InvalidArnException("The 6th component of an ARN" + . " represents the resource information and must not be empty." + . " Individual service ARNs may include additional delimiters" + . " to further qualify resources."); + } + } + + protected static function validateAccountId($data, $arnName) + { + if (!self::isValidHostLabel($data['account_id'])) { + throw new InvalidArnException("The 5th component of a {$arnName}" + . " is required, represents the account ID, and" + . " must be a valid host label."); + } + } + + protected static function validateRegion($data, $arnName) + { + if (empty($data['region'])) { + throw new InvalidArnException("The 4th component of a {$arnName}" + . " represents the region and must not be empty."); + } + } + + /** + * Validates whether a string component is a valid host label + * + * @param $string + * @return bool + */ + protected static function isValidHostLabel($string) + { + if (empty($string) || strlen($string) > 63) { + return false; + } + if ($value = preg_match("/^[a-zA-Z0-9-]+$/", $string)) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/vendor/aws/aws-sdk-php/src/Arn/ArnInterface.php b/vendor/aws/aws-sdk-php/src/Arn/ArnInterface.php new file mode 100644 index 0000000..c30c6cc --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Arn/ArnInterface.php @@ -0,0 +1,37 @@ +data['resource_type']; + } + + public function getResourceId() + { + return $this->data['resource_id']; + } + + protected static function parseResourceTypeAndId(array $data) + { + $resourceData = preg_split("/[\/:]/", $data['resource'], 2); + $data['resource_type'] = isset($resourceData[0]) + ? $resourceData[0] + : null; + $data['resource_id'] = isset($resourceData[1]) + ? $resourceData[1] + : null; + return $data; + } +} \ No newline at end of file diff --git a/vendor/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php b/vendor/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php new file mode 100644 index 0000000..5841d90 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php @@ -0,0 +1,27 @@ +data['outpost_id']; + } + + public function getAccesspointName() + { + return $this->data['accesspoint_name']; + } + + private static function parseOutpostData(array $data) + { + $resourceData = preg_split("/[\/:]/", $data['resource_id']); + + $data['outpost_id'] = isset($resourceData[0]) + ? $resourceData[0] + : null; + $data['accesspoint_type'] = isset($resourceData[1]) + ? $resourceData[1] + : null; + $data['accesspoint_name'] = isset($resourceData[2]) + ? $resourceData[2] + : null; + if (isset($resourceData[3])) { + $data['resource_extra'] = implode(':', array_slice($resourceData, 3)); + } + + return $data; + } + + /** + * Validation specific to OutpostsAccessPointArn. Note this uses the base Arn + * class validation instead of the direct parent due to it having slightly + * differing requirements from its parent. + * + * @param array $data + */ + public static function validate(array $data) + { + Arn::validate($data); + + if (($data['service'] !== 's3-outposts')) { + throw new InvalidArnException("The 3rd component of an S3 Outposts" + . " access point ARN represents the service and must be" + . " 's3-outposts'."); + } + + self::validateRegion($data, 'S3 Outposts access point ARN'); + self::validateAccountId($data, 'S3 Outposts access point ARN'); + + if (($data['resource_type'] !== 'outpost')) { + throw new InvalidArnException("The 6th component of an S3 Outposts" + . " access point ARN represents the resource type and must be" + . " 'outpost'."); + } + + if (!self::isValidHostLabel($data['outpost_id'])) { + throw new InvalidArnException("The 7th component of an S3 Outposts" + . " access point ARN is required, represents the outpost ID, and" + . " must be a valid host label."); + } + + if ($data['accesspoint_type'] !== 'accesspoint') { + throw new InvalidArnException("The 8th component of an S3 Outposts" + . " access point ARN must be 'accesspoint'"); + } + + if (!self::isValidHostLabel($data['accesspoint_name'])) { + throw new InvalidArnException("The 9th component of an S3 Outposts" + . " access point ARN is required, represents the accesspoint name," + . " and must be a valid host label."); + } + + if (!empty($data['resource_extra'])) { + throw new InvalidArnException("An S3 Outposts access point ARN" + . " should only have 9 components, delimited by the characters" + . " ':' and '/'. '{$data['resource_extra']}' was found after the" + . " 9th component."); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsArnInterface.php b/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsArnInterface.php new file mode 100644 index 0000000..20285e0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Arn/S3/OutpostsArnInterface.php @@ -0,0 +1,12 @@ +data['bucket_name']; + } + + public function getOutpostId() + { + return $this->data['outpost_id']; + } + + private static function parseOutpostData(array $data) + { + $resourceData = preg_split("/[\/:]/", $data['resource_id'], 3); + + $data['outpost_id'] = isset($resourceData[0]) + ? $resourceData[0] + : null; + $data['bucket_label'] = isset($resourceData[1]) + ? $resourceData[1] + : null; + $data['bucket_name'] = isset($resourceData[2]) + ? $resourceData[2] + : null; + + return $data; + } + + /** + * + * @param array $data + */ + public static function validate(array $data) + { + Arn::validate($data); + + if (($data['service'] !== 's3-outposts')) { + throw new InvalidArnException("The 3rd component of an S3 Outposts" + . " bucket ARN represents the service and must be 's3-outposts'."); + } + + self::validateRegion($data, 'S3 Outposts bucket ARN'); + self::validateAccountId($data, 'S3 Outposts bucket ARN'); + + if (($data['resource_type'] !== 'outpost')) { + throw new InvalidArnException("The 6th component of an S3 Outposts" + . " bucket ARN represents the resource type and must be" + . " 'outpost'."); + } + + if (!self::isValidHostLabel($data['outpost_id'])) { + throw new InvalidArnException("The 7th component of an S3 Outposts" + . " bucket ARN is required, represents the outpost ID, and" + . " must be a valid host label."); + } + + if ($data['bucket_label'] !== 'bucket') { + throw new InvalidArnException("The 8th component of an S3 Outposts" + . " bucket ARN must be 'bucket'"); + } + + if (empty($data['bucket_name'])) { + throw new InvalidArnException("The 9th component of an S3 Outposts" + . " bucket ARN represents the bucket name and must not be empty."); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Artifact/ArtifactClient.php b/vendor/aws/aws-sdk-php/src/Artifact/ArtifactClient.php new file mode 100644 index 0000000..3d9394a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Artifact/ArtifactClient.php @@ -0,0 +1,23 @@ +parseClass(); + if (!isset($args['service'])) { + $args['service'] = manifest($service)['endpoint']; + } + if (!isset($args['exception_class'])) { + $args['exception_class'] = $exceptionClass; + } + $this->handlerList = new HandlerList(); + $resolver = new ClientResolver(static::getArguments()); + $config = $resolver->resolve($args, $this->handlerList); + $this->api = $config['api']; + $this->signatureProvider = $config['signature_provider']; + $this->authSchemeResolver = $config['auth_scheme_resolver']; + $this->endpoint = new Uri($config['endpoint']); + $this->credentialProvider = $config['credentials']; + $this->tokenProvider = $config['token']; + $this->region = $config['region'] ?? null; + $this->signingRegionSet = $config['sigv4a_signing_region_set'] ?? null; + $this->config = $config['config']; + $this->setClientBuiltIns($args, $config); + $this->clientContextParams = $this->setClientContextParams($args); + $this->defaultRequestOptions = $config['http']; + $this->endpointProvider = $config['endpoint_provider']; + $this->serializer = $config['serializer']; + $this->addSignatureMiddleware($args); + $this->addInvocationId(); + $this->addEndpointParameterMiddleware($args); + $this->addEndpointDiscoveryMiddleware($config, $args); + $this->addRequestCompressionMiddleware($config); + $this->loadAliases(); + $this->addStreamRequestPayload(); + $this->addRecursionDetection(); + if ($this->isUseEndpointV2()) { + $this->addEndpointV2Middleware(); + } + $this->addAuthSelectionMiddleware($config['config']); + + if (!is_null($this->api->getMetadata('awsQueryCompatible'))) { + $this->addQueryCompatibleInputMiddleware($this->api); + $this->addQueryModeHeader(); + } + + if (isset($args['with_resolved'])) { + $args['with_resolved']($config); + } + $this->addUserAgentMiddleware($config); + } + + public function getHandlerList() + { + return $this->handlerList; + } + + public function getConfig($option = null) + { + return $option === null + ? $this->config + : $this->config[$option] ?? null; + } + + public function getCredentials() + { + $fn = $this->credentialProvider; + return $fn(); + } + + public function getToken() + { + $fn = $this->tokenProvider; + return $fn(); + } + + + public function getEndpoint() + { + return $this->endpoint; + } + + public function getRegion() + { + return $this->region; + } + + public function getApi() + { + return $this->api; + } + + public function getCommand($name, array $args = []) + { + // Fail fast if the command cannot be found in the description. + if (!isset($this->getApi()['operations'][$name])) { + $name = ucfirst($name); + if (!isset($this->getApi()['operations'][$name])) { + throw new \InvalidArgumentException("Operation not found: $name"); + } + } + + if (!isset($args['@http'])) { + $args['@http'] = $this->defaultRequestOptions; + } else { + $args['@http'] += $this->defaultRequestOptions; + } + + return new Command($name, $args, clone $this->getHandlerList()); + } + + public function getEndpointProvider() + { + return $this->endpointProvider; + } + + /** + * Provides the set of service context parameter + * key-value pairs used for endpoint resolution. + * + * @return array + */ + public function getClientContextParams() + { + return $this->clientContextParams; + } + + /** + * Provides the set of built-in keys and values + * used for endpoint resolution + * + * @return array + */ + public function getClientBuiltIns() + { + return $this->clientBuiltIns; + } + + public function __sleep() + { + throw new \RuntimeException('Instances of ' . static::class + . ' cannot be serialized'); + } + + /** + * Get the signature_provider function of the client. + * + * @return callable + */ + final public function getSignatureProvider() + { + return $this->signatureProvider; + } + + /** + * Parse the class name and setup the custom exception class of the client + * and return the "service" name of the client and "exception_class". + * + * @return array + */ + private function parseClass() + { + $klass = get_class($this); + + if ($klass === __CLASS__) { + return ['', AwsException::class]; + } + + $service = substr($klass, strrpos($klass, '\\') + 1, -6); + + return [ + strtolower($service), + "Aws\\{$service}\\Exception\\{$service}Exception" + ]; + } + + private function addEndpointParameterMiddleware($args) + { + if (empty($args['disable_host_prefix_injection'])) { + $list = $this->getHandlerList(); + $list->appendBuild( + EndpointParameterMiddleware::wrap( + $this->api + ), + 'endpoint_parameter' + ); + } + } + + private function addEndpointDiscoveryMiddleware($config, $args) + { + $list = $this->getHandlerList(); + + if (!isset($args['endpoint'])) { + $list->appendBuild( + EndpointDiscoveryMiddleware::wrap( + $this, + $args, + $config['endpoint_discovery'] + ), + 'EndpointDiscoveryMiddleware' + ); + } + } + + private function addSignatureMiddleware(array $args) + { + $api = $this->getApi(); + $provider = $this->signatureProvider; + $signatureVersion = $this->config['signature_version']; + $name = $this->config['signing_name']; + $region = $this->config['signing_region']; + $signingRegionSet = $this->signingRegionSet; + + if (isset($args['signature_version']) + || isset($this->config['configured_signature_version']) + ) { + $configuredSignatureVersion = true; + } else { + $configuredSignatureVersion = false; + } + + $resolver = static function ( + CommandInterface $command + ) use ( + $api, + $provider, + $name, + $region, + $signatureVersion, + $configuredSignatureVersion, + $signingRegionSet + ) { + if (!$configuredSignatureVersion) { + if (!empty($command['@context']['signing_region'])) { + $region = $command['@context']['signing_region']; + } + if (!empty($command['@context']['signing_service'])) { + $name = $command['@context']['signing_service']; + } + if (!empty($command['@context']['signature_version'])) { + $signatureVersion = $command['@context']['signature_version']; + } + + $authType = $api->getOperation($command->getName())['authtype']; + switch ($authType){ + case 'none': + $signatureVersion = 'anonymous'; + break; + case 'v4-unsigned-body': + $signatureVersion = 'v4-unsigned-body'; + break; + case 'bearer': + $signatureVersion = 'bearer'; + break; + } + } + + if ($signatureVersion === 'v4a') { + $commandSigningRegionSet = !empty($command['@context']['signing_region_set']) + ? implode(', ', $command['@context']['signing_region_set']) + : null; + + $region = $signingRegionSet + ?? $commandSigningRegionSet + ?? $region; + } + + // Capture signature metric + $command->getMetricsBuilder()->identifyMetricByValueAndAppend( + 'signature', + $signatureVersion + ); + + return SignatureProvider::resolve($provider, $signatureVersion, $name, $region); + }; + $this->handlerList->appendSign( + Middleware::signer($this->credentialProvider, + $resolver, + $this->tokenProvider, + $this->getConfig() + ), + 'signer' + ); + } + + private function addRequestCompressionMiddleware($config) + { + if (empty($config['disable_request_compression'])) { + $list = $this->getHandlerList(); + $list->appendBuild( + RequestCompressionMiddleware::wrap($config), + 'request-compression' + ); + } + } + + private function addQueryCompatibleInputMiddleware(Service $api) + { + $list = $this->getHandlerList(); + $list->appendValidate( + QueryCompatibleInputMiddleware::wrap($api), + 'query-compatible-input' + ); + } + + private function addQueryModeHeader(): void + { + $list = $this->getHandlerList(); + $list->appendBuild( + Middleware::mapRequest(function (RequestInterface $r) { + return $r->withHeader( + 'x-amzn-query-mode', + "true" + ); + }), + 'x-amzn-query-mode-header' + ); + } + + private function addInvocationId() + { + // Add invocation id to each request + $this->handlerList->prependSign(Middleware::invocationId(), 'invocation-id'); + } + + private function loadAliases($file = null) + { + if (!isset($this->aliases)) { + if (is_null($file)) { + $file = __DIR__ . '/data/aliases.json'; + } + $aliases = \Aws\load_compiled_json($file); + $serviceId = $this->api->getServiceId(); + $version = $this->getApi()->getApiVersion(); + if (!empty($aliases['operations'][$serviceId][$version])) { + $this->aliases = array_flip($aliases['operations'][$serviceId][$version]); + } + } + } + + private function addStreamRequestPayload() + { + $streamRequestPayloadMiddleware = StreamRequestPayloadMiddleware::wrap( + $this->api + ); + + $this->handlerList->prependSign( + $streamRequestPayloadMiddleware, + 'StreamRequestPayloadMiddleware' + ); + } + + private function addRecursionDetection() + { + // Add recursion detection header to requests + // originating in supported Lambda runtimes + $this->handlerList->appendBuild( + Middleware::recursionDetection(), 'recursion-detection' + ); + } + + private function addAuthSelectionMiddleware(array $args) + { + $list = $this->getHandlerList(); + + $list->prependBuild( + AuthSelectionMiddleware::wrap( + $this->authSchemeResolver, + $this->getApi(), + $args['auth_scheme_preference'] ?? null + ), + 'auth-selection' + ); + } + + private function addEndpointV2Middleware() + { + $list = $this->getHandlerList(); + $endpointArgs = $this->getEndpointProviderArgs(); + + $list->prependBuild( + EndpointV2Middleware::wrap( + $this->endpointProvider, + $this->getApi(), + $endpointArgs, + $this->credentialProvider + ), + 'endpoint-resolution' + ); + } + + /** + * Appends the user agent middleware. + * This middleware MUST be appended after the + * signature middleware `addSignatureMiddleware`, + * so that metrics around signatures are properly + * captured. + * + * @param $args + * @return void + */ + private function addUserAgentMiddleware($args) + { + $this->getHandlerList()->appendSign( + UserAgentMiddleware::wrap($args), + 'user-agent' + ); + } + + /** + * Retrieves client context param definition from service model, + * creates mapping of client context param names with client-provided + * values. + * + * @return array + */ + private function setClientContextParams($args) + { + $api = $this->getApi(); + $resolvedParams = []; + if (!empty($paramDefinitions = $api->getClientContextParams())) { + foreach($paramDefinitions as $paramName => $paramValue) { + if (isset($args[$paramName])) { + $resolvedParams[$paramName] = $args[$paramName]; + } + } + } + return $resolvedParams; + } + + /** + * Retrieves and sets default values used for endpoint resolution. + */ + private function setClientBuiltIns($args, $resolvedConfig) + { + $builtIns = []; + $config = $resolvedConfig['config']; + $service = $args['service']; + + $builtIns['SDK::Endpoint'] = null; + if (!empty($args['endpoint'])) { + $builtIns['SDK::Endpoint'] = $args['endpoint']; + } elseif (isset($config['configured_endpoint_url'])) { + $builtIns['SDK::Endpoint'] = (string) $this->getEndpoint(); + } + $builtIns['AWS::Region'] = $this->getRegion(); + $builtIns['AWS::UseFIPS'] = $config['use_fips_endpoint']->isUseFipsEndpoint(); + $builtIns['AWS::UseDualStack'] = $config['use_dual_stack_endpoint']->isUseDualstackEndpoint(); + if ($service === 's3' || $service === 's3control'){ + $builtIns['AWS::S3::UseArnRegion'] = $config['use_arn_region']->isUseArnRegion(); + } + if ($service === 's3') { + $builtIns['AWS::S3::UseArnRegion'] = $config['use_arn_region']->isUseArnRegion(); + $builtIns['AWS::S3::Accelerate'] = $config['use_accelerate_endpoint']; + $builtIns['AWS::S3::ForcePathStyle'] = $config['use_path_style_endpoint']; + $builtIns['AWS::S3::DisableMultiRegionAccessPoints'] = $config['disable_multiregion_access_points']; + } + $builtIns['AWS::Auth::AccountIdEndpointMode'] = $resolvedConfig['account_id_endpoint_mode']; + + $this->clientBuiltIns += $builtIns; + } + + /** + * Retrieves arguments to be used in endpoint resolution. + * + * @return array + */ + public function getEndpointProviderArgs() + { + return $this->normalizeEndpointProviderArgs(); + } + + /** + * Combines built-in and client context parameter values in + * order of specificity. Client context parameter values supersede + * built-in values. + * + * @return array + */ + private function normalizeEndpointProviderArgs() + { + $normalizedBuiltIns = []; + + foreach($this->clientBuiltIns as $name => $value) { + $normalizedName = explode('::', $name); + $normalizedName = $normalizedName[count($normalizedName) - 1]; + $normalizedBuiltIns[$normalizedName] = $value; + } + + return array_merge($normalizedBuiltIns, $this->getClientContextParams()); + } + + protected function isUseEndpointV2() + { + return $this->endpointProvider instanceof EndpointProviderV2; + } + + public static function emitDeprecationWarning() { + trigger_error( + "This method is deprecated. It will be removed in an upcoming release." + , E_USER_DEPRECATED + ); + + $phpVersion = PHP_VERSION_ID; + if ($phpVersion < 70205) { + $phpVersionString = phpversion(); + @trigger_error( + "This installation of the SDK is using PHP version" + . " {$phpVersionString}, which will be deprecated on August" + . " 15th, 2023. Please upgrade your PHP version to a minimum of" + . " 7.2.5 before then to continue receiving updates to the AWS" + . " SDK for PHP. To disable this warning, set" + . " suppress_php_deprecation_warning to true on the client constructor" + . " or set the environment variable AWS_SUPPRESS_PHP_DEPRECATION_WARNING" + . " to true.", + E_USER_DEPRECATED + ); + } + } + + + /** + * Returns a service model and doc model with any necessary changes + * applied. + * + * @param array $api Array of service data being documented. + * @param array $docs Array of doc model data. + * + * @return array Tuple containing a [Service, DocModel] + * + * @internal This should only used to document the service API. + * @codeCoverageIgnore + */ + public static function applyDocFilters(array $api, array $docs) + { + $aliases = \Aws\load_compiled_json(__DIR__ . '/data/aliases.json'); + $serviceId = $api['metadata']['serviceId'] ?? ''; + $version = $api['metadata']['apiVersion']; + + // Replace names for any operations with SDK aliases + if (!empty($aliases['operations'][$serviceId][$version])) { + foreach ($aliases['operations'][$serviceId][$version] as $op => $alias) { + $api['operations'][$alias] = $api['operations'][$op]; + $docs['operations'][$alias] = $docs['operations'][$op]; + unset($api['operations'][$op], $docs['operations'][$op]); + } + } + ksort($api['operations']); + + return [ + new Service($api, ApiProvider::defaultProvider()), + new DocModel($docs) + ]; + } + + /** + * @deprecated + * @return static + */ + public static function factory(array $config = []) + { + return new static($config); + } +} diff --git a/vendor/aws/aws-sdk-php/src/AwsClientInterface.php b/vendor/aws/aws-sdk-php/src/AwsClientInterface.php new file mode 100644 index 0000000..12a5701 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/AwsClientInterface.php @@ -0,0 +1,169 @@ +getWaiter('foo', ['bar' => 'baz']); + * $waiter->promise()->then(function () { echo 'Done!'; }); + * + * @param string|callable $name Name of the waiter that defines the wait + * configuration and conditions. + * @param array $args Args to be used with each command executed + * by the waiter. Waiter configuration options + * can be provided in an associative array in + * the @waiter key. + * @return \Aws\Waiter + * @throws \UnexpectedValueException if the waiter is invalid. + */ + public function getWaiter($name, array $args = []); +} diff --git a/vendor/aws/aws-sdk-php/src/AwsClientTrait.php b/vendor/aws/aws-sdk-php/src/AwsClientTrait.php new file mode 100644 index 0000000..f31a24e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/AwsClientTrait.php @@ -0,0 +1,101 @@ +getApi()->getPaginatorConfig($name); + + return new ResultPaginator($this, $name, $args, $config); + } + + public function getIterator($name, array $args = []) + { + $config = $this->getApi()->getPaginatorConfig($name); + if (!$config['result_key']) { + throw new \UnexpectedValueException(sprintf( + 'There are no resources to iterate for the %s operation of %s', + $name, $this->getApi()['serviceFullName'] + )); + } + + $key = is_array($config['result_key']) + ? $config['result_key'][0] + : $config['result_key']; + + if ($config['output_token'] && $config['input_token']) { + return $this->getPaginator($name, $args)->search($key); + } + + $result = $this->execute($this->getCommand($name, $args))->search($key); + + return new \ArrayIterator((array) $result); + } + + public function waitUntil($name, array $args = []) + { + return $this->getWaiter($name, $args)->promise()->wait(); + } + + public function getWaiter($name, array $args = []) + { + $config = isset($args['@waiter']) ? $args['@waiter'] : []; + $config += $this->getApi()->getWaiterConfig($name); + + return new Waiter($this, $name, $args, $config); + } + + public function execute(CommandInterface $command) + { + return $this->executeAsync($command)->wait(); + } + + public function executeAsync(CommandInterface $command) + { + $handler = $command->getHandlerList()->resolve(); + return $handler($command); + } + + public function __call($name, array $args) + { + if (substr($name, -5) === 'Async') { + $name = substr($name, 0, -5); + $isAsync = true; + } + + if (!empty($this->aliases[ucfirst($name)])) { + $name = $this->aliases[ucfirst($name)]; + } + + $params = isset($args[0]) ? $args[0] : []; + + if (!empty($isAsync)) { + return $this->executeAsync( + $this->getCommand($name, $params) + ); + } + + return $this->execute($this->getCommand($name, $params)); + } + + /** + * @param string $name + * @param array $args + * + * @return CommandInterface + */ + abstract public function getCommand($name, array $args = []); + + /** + * @return Service + */ + abstract public function getApi(); +} diff --git a/vendor/aws/aws-sdk-php/src/CacheInterface.php b/vendor/aws/aws-sdk-php/src/CacheInterface.php new file mode 100644 index 0000000..e77f18b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/CacheInterface.php @@ -0,0 +1,34 @@ + 'is_resource', + 'callable' => 'is_callable', + 'int' => 'is_int', + 'bool' => 'is_bool', + 'boolean' => 'is_bool', + 'string' => 'is_string', + 'object' => 'is_object', + 'array' => 'is_array', + ]; + + private static $defaultArgs = [ + 'service' => [ + 'type' => 'value', + 'valid' => ['string'], + 'doc' => 'Name of the service to utilize. This value will be supplied by default when using one of the SDK clients (e.g., Aws\\S3\\S3Client).', + 'required' => true, + 'internal' => true + ], + 'exception_class' => [ + 'type' => 'value', + 'valid' => ['string'], + 'doc' => 'Exception class to create when an error occurs.', + 'default' => AwsException::class, + 'internal' => true + ], + 'scheme' => [ + 'type' => 'value', + 'valid' => ['string'], + 'default' => 'https', + 'doc' => 'URI scheme to use when connecting connect. The SDK will utilize "https" endpoints (i.e., utilize SSL/TLS connections) by default. You can attempt to connect to a service over an unencrypted "http" endpoint by setting ``scheme`` to "http".', + ], + 'disable_host_prefix_injection' => [ + 'type' => 'value', + 'valid' => ['bool'], + 'doc' => 'Set to true to disable host prefix injection logic for services that use it. This disables the entire prefix injection, including the portions supplied by user-defined parameters. Setting this flag will have no effect on services that do not use host prefix injection.', + 'default' => false, + ], + 'ignore_configured_endpoint_urls' => [ + 'type' => 'value', + 'valid' => ['bool'], + 'doc' => 'Set to true to disable endpoint urls configured using `AWS_ENDPOINT_URL` and `endpoint_url` shared config option.', + 'fn' => [__CLASS__, '_apply_ignore_configured_endpoint_urls'], + 'default' => self::DEFAULT_FROM_ENV_INI, + ], + 'endpoint' => [ + 'type' => 'value', + 'valid' => ['string'], + 'doc' => 'The full URI of the webservice. This is only required when connecting to a custom endpoint (e.g., a local version of S3).', + 'fn' => [__CLASS__, '_apply_endpoint'], + 'default' => [__CLASS__, '_default_endpoint'] + ], + 'region' => [ + 'type' => 'value', + 'valid' => ['string'], + 'doc' => 'Region to connect to. See http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of available regions.', + 'fn' => [__CLASS__, '_apply_region'], + 'default' => self::DEFAULT_FROM_ENV_INI + ], + 'version' => [ + 'type' => 'value', + 'valid' => ['string'], + 'doc' => 'The version of the webservice to utilize (e.g., 2006-03-01).', + 'default' => 'latest', + ], + 'signature_provider' => [ + 'type' => 'value', + 'valid' => ['callable'], + 'doc' => 'A callable that accepts a signature version name (e.g., "v4"), a service name, and region, and returns a SignatureInterface object or null. This provider is used to create signers utilized by the client. See Aws\\Signature\\SignatureProvider for a list of built-in providers', + 'default' => [__CLASS__, '_default_signature_provider'], + ], + 'api_provider' => [ + 'type' => 'value', + 'valid' => ['callable'], + 'doc' => 'An optional PHP callable that accepts a type, service, and version argument, and returns an array of corresponding configuration data. The type value can be one of api, waiter, or paginator.', + 'fn' => [__CLASS__, '_apply_api_provider'], + 'default' => [ApiProvider::class, 'defaultProvider'], + ], + 'configuration_mode' => [ + 'type' => 'value', + 'valid' => [ConfigModeInterface::class, CacheInterface::class, 'string', 'closure'], + 'doc' => "Sets the default configuration mode. Otherwise provide an instance of Aws\DefaultsMode\ConfigurationInterface, an instance of Aws\CacheInterface, or a string containing a valid mode", + 'fn' => [__CLASS__, '_apply_defaults'], + 'default' => [ConfigModeProvider::class, 'defaultProvider'] + ], + 'use_fips_endpoint' => [ + 'type' => 'value', + 'valid' => ['bool', UseFipsEndpointConfiguration::class, CacheInterface::class, 'callable'], + 'doc' => 'Set to true to enable the use of FIPS pseudo regions', + 'fn' => [__CLASS__, '_apply_use_fips_endpoint'], + 'default' => [__CLASS__, '_default_use_fips_endpoint'], + ], + 'use_dual_stack_endpoint' => [ + 'type' => 'value', + 'valid' => ['bool', UseDualStackEndpointConfiguration::class, CacheInterface::class, 'callable'], + 'doc' => 'Set to true to enable the use of dual-stack endpoints', + 'fn' => [__CLASS__, '_apply_use_dual_stack_endpoint'], + 'default' => [__CLASS__, '_default_use_dual_stack_endpoint'], + ], + 'endpoint_provider' => [ + 'type' => 'value', + 'valid' => ['callable', EndpointV2\EndpointProviderV2::class], + 'fn' => [__CLASS__, '_apply_endpoint_provider'], + 'doc' => 'An optional PHP callable that accepts a hash of options including a "service" and "region" key and returns NULL or a hash of endpoint data, of which the "endpoint" key is required. See Aws\\Endpoint\\EndpointProvider for a list of built-in providers.', + 'default' => [__CLASS__, '_default_endpoint_provider'], + ], + 'serializer' => [ + 'default' => [__CLASS__, '_default_serializer'], + 'fn' => [__CLASS__, '_apply_serializer'], + 'internal' => true, + 'type' => 'value', + 'valid' => ['callable'], + ], + 'signature_version' => [ + 'type' => 'config', + 'valid' => ['string'], + 'doc' => 'A string representing a custom signature version to use with a service (e.g., v4). Note that per/operation signature version MAY override this requested signature version.', + 'default' => [__CLASS__, '_default_signature_version'], + ], + 'signing_name' => [ + 'type' => 'config', + 'valid' => ['string'], + 'doc' => 'A string representing a custom service name to be used when calculating a request signature.', + 'default' => [__CLASS__, '_default_signing_name'], + ], + 'signing_region' => [ + 'type' => 'config', + 'valid' => ['string'], + 'doc' => 'A string representing a custom region name to be used when calculating a request signature.', + 'default' => [__CLASS__, '_default_signing_region'], + ], + 'profile' => [ + 'type' => 'config', + 'valid' => ['string'], + 'doc' => 'Allows you to specify which profile to use when credentials are created from the AWS credentials file in your HOME directory. This setting overrides the AWS_PROFILE environment variable. Note: Specifying "profile" will cause the "credentials" and "use_aws_shared_config_files" keys to be ignored.', + 'fn' => [__CLASS__, '_apply_profile'], + ], + 'credentials' => [ + 'type' => 'value', + 'valid' => [CredentialsInterface::class, CacheInterface::class, 'array', 'bool', 'callable'], + 'doc' => 'Specifies the credentials used to sign requests. Provide an Aws\Credentials\CredentialsInterface object, an associative array of "key", "secret", and an optional "token" key, `false` to use null credentials, or a callable credentials provider used to create credentials or return null. See Aws\\Credentials\\CredentialProvider for a list of built-in credentials providers. If no credentials are provided, the SDK will attempt to load them from the environment.', + 'fn' => [__CLASS__, '_apply_credentials'], + 'default' => [__CLASS__, '_default_credential_provider'], + ], + 'auth_scheme_preference' => [ + 'type' => 'value', + 'valid' => ['string', 'array'], + 'doc' => 'Comma-separated list of authentication scheme preferences in priority order. Configure via environment variable `AWS_AUTH_SCHEME_PREFERENCE`, INI config file `auth_scheme_preference`, or client constructor parameter `auth_scheme_preference` (string or array).\nExample: `AWS_AUTH_SCHEME_PREFERENCE=aws.auth#sigv4a,aws.auth#sigv4,smithy.api#httpBearerAuth`', + 'default' => self::DEFAULT_FROM_ENV_INI, + 'fn' => [__CLASS__, '_apply_auth_scheme_preference'], + ], + 'token' => [ + 'type' => 'value', + 'valid' => [TokenInterface::class, CacheInterface::class, 'array', 'bool', 'callable'], + 'doc' => 'Specifies the token used to authorize requests. Provide an Aws\Token\TokenInterface object, an associative array of "token", and an optional "expiration" key, `false` to use a null token, or a callable token provider used to fetch a token or return null. See Aws\\Token\\TokenProvider for a list of built-in credentials providers. If no token is provided, the SDK will attempt to load one from the environment.', + 'fn' => [__CLASS__, '_apply_token'], + 'default' => [__CLASS__, '_default_token_provider'], + ], + 'auth_scheme_resolver' => [ + 'type' => 'value', + 'valid' => [AuthSchemeResolverInterface::class], + 'doc' => 'An instance of Aws\Auth\AuthSchemeResolverInterface which selects a modeled auth scheme and returns a signature version', + 'default' => [__CLASS__, '_default_auth_scheme_resolver'], + ], + 'endpoint_discovery' => [ + 'type' => 'value', + 'valid' => [ConfigurationInterface::class, CacheInterface::class, 'array', 'callable'], + 'doc' => 'Specifies settings for endpoint discovery. Provide an instance of Aws\EndpointDiscovery\ConfigurationInterface, an instance Aws\CacheInterface, a callable that provides a promise for a Configuration object, or an associative array with the following keys: enabled: (bool) Set to true to enable endpoint discovery, false to explicitly disable it. Defaults to false; cache_limit: (int) The maximum number of keys in the endpoints cache. Defaults to 1000.', + 'fn' => [__CLASS__, '_apply_endpoint_discovery'], + 'default' => [__CLASS__, '_default_endpoint_discovery_provider'] + ], + 'stats' => [ + 'type' => 'value', + 'valid' => ['bool', 'array'], + 'default' => false, + 'doc' => 'Set to true to gather transfer statistics on requests sent. Alternatively, you can provide an associative array with the following keys: retries: (bool) Set to false to disable reporting on retries attempted; http: (bool) Set to true to enable collecting statistics from lower level HTTP adapters (e.g., values returned in GuzzleHttp\TransferStats). HTTP handlers must support an http_stats_receiver option for this to have an effect; timer: (bool) Set to true to enable a command timer that reports the total wall clock time spent on an operation in seconds.', + 'fn' => [__CLASS__, '_apply_stats'], + ], + 'retries' => [ + 'type' => 'value', + 'valid' => ['int', RetryConfigInterface::class, CacheInterface::class, 'callable', 'array'], + 'doc' => "Configures the retry mode and maximum number of allowed retries for a client (pass 0 to disable retries). Provide an integer for 'legacy' mode with the specified number of retries. Otherwise provide an instance of Aws\Retry\ConfigurationInterface, an instance of Aws\CacheInterface, a callable function, or an array with the following keys: mode: (string) Set to 'legacy', 'standard' (uses retry quota management), or 'adapative' (an experimental mode that adds client-side rate limiting to standard mode); max_attempts: (int) The maximum number of attempts for a given request. ", + 'fn' => [__CLASS__, '_apply_retries'], + 'default' => [RetryConfigProvider::class, 'defaultProvider'] + ], + 'validate' => [ + 'type' => 'value', + 'valid' => ['bool', 'array'], + 'default' => true, + 'doc' => 'Set to false to disable client-side parameter validation. Set to true to utilize default validation constraints. Set to an associative array of validation options to enable specific validation constraints.', + 'fn' => [__CLASS__, '_apply_validate'], + ], + 'debug' => [ + 'type' => 'value', + 'valid' => ['bool', 'array'], + 'doc' => 'Set to true to display debug information when sending requests. Alternatively, you can provide an associative array with the following keys: logfn: (callable) Function that is invoked with log messages; stream_size: (int) When the size of a stream is greater than this number, the stream data will not be logged (set to "0" to not log any stream data); scrub_auth: (bool) Set to false to disable the scrubbing of auth data from the logged messages; http: (bool) Set to false to disable the "debug" feature of lower level HTTP adapters (e.g., verbose curl output).', + 'fn' => [__CLASS__, '_apply_debug'], + ], + 'disable_request_compression' => [ + 'type' => 'value', + 'valid' => ['bool', 'callable'], + 'doc' => 'Set to true to disable request compression for supported operations', + 'fn' => [__CLASS__, '_apply_disable_request_compression'], + 'default' => self::DEFAULT_FROM_ENV_INI, + ], + 'request_min_compression_size_bytes' => [ + 'type' => 'value', + 'valid' => ['int', 'callable'], + 'doc' => 'Set to a value between between 0 and 10485760 bytes, inclusive. This value will be ignored if `disable_request_compression` is set to `true`', + 'fn' => [__CLASS__, '_apply_min_compression_size'], + 'default' => [__CLASS__, '_default_min_compression_size'], + ], + 'csm' => [ + 'type' => 'value', + 'valid' => [\Aws\ClientSideMonitoring\ConfigurationInterface::class, 'callable', 'array', 'bool'], + 'doc' => 'CSM options for the client. Provides a callable wrapping a promise, a boolean "false", an instance of ConfigurationInterface, or an associative array of "enabled", "host", "port", and "client_id".', + 'fn' => [__CLASS__, '_apply_csm'], + 'default' => [\Aws\ClientSideMonitoring\ConfigurationProvider::class, 'defaultProvider'] + ], + 'http' => [ + 'type' => 'value', + 'valid' => ['array'], + 'default' => [], + 'doc' => 'Set to an array of SDK request options to apply to each request (e.g., proxy, verify, etc.).', + ], + 'http_handler' => [ + 'type' => 'value', + 'valid' => ['callable'], + 'doc' => 'An HTTP handler is a function that accepts a PSR-7 request object and returns a promise that is fulfilled with a PSR-7 response object or rejected with an array of exception data. NOTE: This option supersedes any provided "handler" option.', + 'fn' => [__CLASS__, '_apply_http_handler'] + ], + 'handler' => [ + 'type' => 'value', + 'valid' => ['callable'], + 'doc' => 'A handler that accepts a command object, request object and returns a promise that is fulfilled with an Aws\ResultInterface object or rejected with an Aws\Exception\AwsException. A handler does not accept a next handler as it is terminal and expected to fulfill a command. If no handler is provided, a default Guzzle handler will be utilized.', + 'fn' => [__CLASS__, '_apply_handler'], + 'default' => [__CLASS__, '_default_handler'] + ], + 'app_id' => [ + 'type' => 'value', + 'valid' => ['string'], + 'doc' => 'app_id(AppId) is an optional application specific identifier that can be set. + When set it will be appended to the User-Agent header of every request in the form of App/{AppId}. + This value is also sourced from environment variable AWS_SDK_UA_APP_ID or the shared config profile attribute sdk_ua_app_id.', + 'fn' => [__CLASS__, '_apply_app_id'], + 'default' => [__CLASS__, '_default_app_id'] + ], + 'ua_append' => [ + 'type' => 'value', + 'valid' => ['string', 'array'], + 'doc' => 'Provide a string or array of strings to send in the User-Agent header.', + 'fn' => [__CLASS__, '_apply_user_agent'], + 'default' => [], + ], + 'idempotency_auto_fill' => [ + 'type' => 'value', + 'valid' => ['bool', 'callable'], + 'doc' => 'Set to false to disable SDK to populate parameters that enabled \'idempotencyToken\' trait with a random UUID v4 value on your behalf. Using default value \'true\' still allows parameter value to be overwritten when provided. Note: auto-fill only works when cryptographically secure random bytes generator functions(random_bytes, openssl_random_pseudo_bytes or mcrypt_create_iv) can be found. You may also provide a callable source of random bytes.', + 'default' => true, + 'fn' => [__CLASS__, '_apply_idempotency_auto_fill'] + ], + 'use_aws_shared_config_files' => [ + 'type' => 'value', + 'valid' => ['bool'], + 'doc' => 'Set to false to disable checking for shared aws config files usually located in \'~/.aws/config\' and \'~/.aws/credentials\'. This will be ignored if you set the \'profile\' setting.', + 'default' => true, + ], + 'suppress_php_deprecation_warning' => [ + 'type' => 'value', + 'valid' => ['bool'], + 'doc' => 'Set to true to suppress PHP runtime deprecation warnings. The current deprecation campaign is PHP versions 8.0.x and below, taking effect on 1/13/2025.', + 'default' => false, + 'fn' => [__CLASS__, '_apply_suppress_php_deprecation_warning'] + ], + 'account_id_endpoint_mode' => [ + 'type' => 'value', + 'valid' => ['string'], + 'doc' => 'Decides whether account_id must a be a required resolved credentials property. If this configuration is set to disabled, then account_id is not required. If set to preferred a warning will be logged when account_id is not resolved, and when set to required an exception will be thrown if account_id is not resolved.', + 'default' => [__CLASS__, '_default_account_id_endpoint_mode'], + 'fn' => [__CLASS__, '_apply_account_id_endpoint_mode'] + ], + 'sigv4a_signing_region_set' => [ + 'type' => 'value', + 'valid' => ['string', 'array'], + 'doc' => 'A comma-delimited list of supported regions sent in sigv4a requests.', + 'fn' => [__CLASS__, '_apply_sigv4a_signing_region_set'], + 'default' => self::DEFAULT_FROM_ENV_INI + ] + ]; + + /** + * Gets an array of default client arguments, each argument containing a + * hash of the following: + * + * - type: (string, required) option type described as follows: + * - value: The default option type. + * - config: The provided value is made available in the client's + * getConfig() method. + * - valid: (array, required) Valid PHP types or class names. Note: null + * is not an allowed type. + * - required: (bool, callable) Whether or not the argument is required. + * Provide a function that accepts an array of arguments and returns a + * string to provide a custom error message. + * - default: (mixed) The default value of the argument if not provided. If + * a function is provided, then it will be invoked to provide a default + * value. The function is provided the array of options and is expected + * to return the default value of the option. The default value can be a + * closure and can not be a callable string that is not part of the + * defaultArgs array. + * - doc: (string) The argument documentation string. + * - fn: (callable) Function used to apply the argument. The function + * accepts the provided value, array of arguments by reference, and an + * event emitter. + * + * Note: Order is honored and important when applying arguments. + * + * @return array + */ + public static function getDefaultArguments() + { + return self::$defaultArgs; + } + + /** + * @param array $argDefinitions Client arguments. + */ + public function __construct(array $argDefinitions) + { + $this->argDefinitions = $argDefinitions; + } + + /** + * Resolves client configuration options and attached event listeners. + * Check for missing keys in passed arguments + * + * @param array $args Provided constructor arguments. + * @param HandlerList $list Handler list to augment. + * + * @return array Returns the array of provided options. + * @throws \InvalidArgumentException + * @see Aws\AwsClient::__construct for a list of available options. + */ + public function resolve(array $args, HandlerList $list) + { + $args['config'] = []; + foreach ($this->argDefinitions as $key => $a) { + // Add defaults, validate required values, and skip if not set. + if (!isset($args[$key])) { + if (isset($a['default'])) { + // Merge defaults in when not present. + if (is_callable($a['default']) + && ( + is_array($a['default']) + || $a['default'] instanceof \Closure + ) + ) { + if ($a['default'] === self::DEFAULT_FROM_ENV_INI) { + $args[$key] = $a['default']( + $key, + $a['valid'][0] ?? 'string', + $args + ); + } else { + $args[$key] = $a['default']($args); + } + } else { + $args[$key] = $a['default']; + } + } elseif (empty($a['required'])) { + continue; + } else { + $this->throwRequired($args); + } + } + + // Validate the types against the provided value. + foreach ($a['valid'] as $check) { + if (isset(self::$typeMap[$check])) { + $fn = self::$typeMap[$check]; + if ($fn($args[$key])) { + goto is_valid; + } + } elseif ($args[$key] instanceof $check) { + goto is_valid; + } + } + + $this->invalidType($key, $args[$key]); + + // Apply the value + is_valid: + if (isset($a['fn'])) { + $a['fn']($args[$key], $args, $list); + } + + if ($a['type'] === 'config') { + $args['config'][$key] = $args[$key]; + } + } + $this->_apply_client_context_params($args); + + return $args; + } + + /** + * Creates a verbose error message for an invalid argument. + * + * @param string $name Name of the argument that is missing. + * @param array $args Provided arguments + * @param bool $useRequired Set to true to show the required fn text if + * available instead of the documentation. + * @return string + */ + private function getArgMessage($name, $args = [], $useRequired = false) + { + $arg = $this->argDefinitions[$name]; + $msg = ''; + $modifiers = []; + if (isset($arg['valid'])) { + $modifiers[] = implode('|', $arg['valid']); + } + if (isset($arg['choice'])) { + $modifiers[] = 'One of ' . implode(', ', $arg['choice']); + } + if ($modifiers) { + $msg .= '(' . implode('; ', $modifiers) . ')'; + } + $msg = wordwrap("{$name}: {$msg}", 75, "\n "); + + if ($useRequired && is_callable($arg['required'])) { + $msg .= "\n\n "; + $msg .= str_replace("\n", "\n ", call_user_func($arg['required'], $args)); + } elseif (isset($arg['doc'])) { + $msg .= wordwrap("\n\n {$arg['doc']}", 75, "\n "); + } + + return $msg; + } + + /** + * Throw when an invalid type is encountered. + * + * @param string $name Name of the value being validated. + * @param mixed $provided The provided value. + * @throws \InvalidArgumentException + */ + private function invalidType($name, $provided) + { + $expected = implode('|', $this->argDefinitions[$name]['valid']); + $msg = "Invalid configuration value " + . "provided for \"{$name}\". Expected {$expected}, but got " + . describe_type($provided) . "\n\n" + . $this->getArgMessage($name); + throw new IAE($msg); + } + + /** + * Throws an exception for missing required arguments. + * + * @param array $args Passed in arguments. + * @throws \InvalidArgumentException + */ + private function throwRequired(array $args) + { + $missing = []; + foreach ($this->argDefinitions as $k => $a) { + if (empty($a['required']) + || isset($a['default']) + || isset($args[$k]) + ) { + continue; + } + $missing[] = $this->getArgMessage($k, $args, true); + } + $msg = "Missing required client configuration options: \n\n"; + $msg .= implode("\n\n", $missing); + throw new IAE($msg); + } + + public static function _apply_retries($value, array &$args, HandlerList $list) + { + // A value of 0 for the config option disables retries + if ($value) { + $config = RetryConfigProvider::unwrap($value); + + if ($config->getMode() === 'legacy') { + // # of retries is 1 less than # of attempts + $decider = RetryMiddleware::createDefaultDecider( + $config->getMaxAttempts() - 1 + ); + $list->appendSign( + Middleware::retry($decider, null, $args['stats']['retries']), + 'retry' + ); + } else { + $list->appendSign( + RetryMiddlewareV2::wrap( + $config, + ['collect_stats' => $args['stats']['retries']] + ), + 'retry' + ); + } + } + } + + public static function _apply_defaults($value, array &$args, HandlerList $list) + { + $config = ConfigModeProvider::unwrap($value); + if ($config->getMode() !== 'legacy') { + if (!isset($args['retries']) && !is_null($config->getRetryMode())) { + $args['retries'] = ['mode' => $config->getRetryMode()]; + } + if ( + !isset($args['sts_regional_endpoints']) + && !is_null($config->getStsRegionalEndpoints()) + ) { + $args['sts_regional_endpoints'] = ['mode' => $config->getStsRegionalEndpoints()]; + } + if ( + !isset($args['s3_us_east_1_regional_endpoint']) + && !is_null($config->getS3UsEast1RegionalEndpoints()) + ) { + $args['s3_us_east_1_regional_endpoint'] = ['mode' => $config->getS3UsEast1RegionalEndpoints()]; + } + + if (!isset($args['http'])) { + $args['http'] = []; + } + if ( + !isset($args['http']['connect_timeout']) + && !is_null($config->getConnectTimeoutInMillis()) + ) { + $args['http']['connect_timeout'] = $config->getConnectTimeoutInMillis() / 1000; + } + if ( + !isset($args['http']['timeout']) + && !is_null($config->getHttpRequestTimeoutInMillis()) + ) { + $args['http']['timeout'] = $config->getHttpRequestTimeoutInMillis() / 1000; + } + } + } + + public static function _apply_disable_request_compression($value, array &$args) { + if (is_callable($value)) { + $value = $value(); + } + if (!is_bool($value)) { + throw new IAE( + "Invalid configuration value provided for 'disable_request_compression'." + . " value must be a bool." + ); + } + $args['config']['disable_request_compression'] = $value; + } + + public static function _apply_min_compression_size($value, array &$args) { + if (is_callable($value)) { + $value = $value(); + } + if (!is_int($value) + || (is_int($value) + && ($value < 0 || $value > 10485760)) + ) { + throw new IAE(" Invalid configuration value provided for 'min_compression_size_bytes'." + . " value must be an integer between 0 and 10485760, inclusive."); + } + $args['config']['request_min_compression_size_bytes'] = $value; + } + + public static function _default_min_compression_size(array &$args) { + return ConfigurationResolver::resolve( + 'request_min_compression_size_bytes', + 10240, + 'int', + $args + ); + } + + public static function _apply_credentials($value, array &$args) + { + if (is_callable($value)) { + return; + } + + if ($value instanceof CredentialsInterface) { + $args['credentials'] = CredentialProvider::fromCredentials($value); + } elseif (is_array($value) + && isset($value['key']) + && isset($value['secret']) + ) { + $args['credentials'] = CredentialProvider::fromCredentials( + new Credentials( + $value['key'], + $value['secret'], + $value['token'] ?? null, + $value['expires'] ?? null, + $value['accountId'] ?? null + ) + ); + } elseif ($value === false) { + $args['credentials'] = CredentialProvider::fromCredentials( + new Credentials('', '') + ); + if ($args['config']['signature_version'] !== self::DPOP_SIGNATURE) { + $args['config']['signature_version'] = self::ANONYMOUS_SIGNATURE; + } + + $args['config']['configured_signature_version'] = true; + } elseif ($value instanceof CacheInterface) { + $args['credentials'] = CredentialProvider::defaultProvider($args); + } else { + throw new IAE('Credentials must be an instance of ' + . "'" . CredentialsInterface::class . ', an associative ' + . 'array that contains "key", "secret", and an optional "token" ' + . 'key-value pairs, a credentials provider function, or false.'); + } + } + + public static function _default_credential_provider(array $args) + { + return CredentialProvider::defaultProvider($args); + } + + public static function _apply_token($value, array &$args) + { + if (is_callable($value)) { + return; + } + + if ($value instanceof Token) { + $args['token'] = TokenProvider::fromToken($value); + } elseif (is_array($value) + && isset($value['token']) + ) { + $args['token'] = TokenProvider::fromToken( + new Token( + $value['token'], + $value['expires'] ?? null + ) + ); + } elseif ($value instanceof CacheInterface) { + $args['token'] = TokenProvider::defaultProvider($args); + } else { + throw new IAE('Token must be an instance of ' + . TokenInterface::class . ', an associative ' + . 'array that contains "token" and an optional "expires" ' + . 'key-value pairs, a token provider function, or false.'); + } + } + + public static function _default_token_provider(array &$args) + { + if (($args['config']['signing_name'] ?? '') === 'bedrock') { + // Checks for env value, if present, sets auth_scheme_preference + // to bearer auth and returns a provider + $provider = BedrockTokenProvider::createIfAvailable($args); + if (!is_null($provider)) { + return $provider; + } + } + + return TokenProvider::defaultProvider($args); + } + + public static function _apply_csm($value, array &$args, HandlerList $list) + { + if ($value === false) { + $value = new Configuration( + false, + \Aws\ClientSideMonitoring\ConfigurationProvider::DEFAULT_HOST, + \Aws\ClientSideMonitoring\ConfigurationProvider::DEFAULT_PORT, + \Aws\ClientSideMonitoring\ConfigurationProvider::DEFAULT_CLIENT_ID + ); + $args['csm'] = $value; + } + + $list->appendBuild( + ApiCallMonitoringMiddleware::wrap( + $args['credentials'], + $value, + $args['region'], + $args['api']->getServiceId() + ), + 'ApiCallMonitoringMiddleware' + ); + + $list->appendAttempt( + ApiCallAttemptMonitoringMiddleware::wrap( + $args['credentials'], + $value, + $args['region'], + $args['api']->getServiceId() + ), + 'ApiCallAttemptMonitoringMiddleware' + ); + } + + public static function _apply_api_provider(callable $value, array &$args) + { + $api = new Service( + ApiProvider::resolve( + $value, + 'api', + $args['service'], + $args['version'] + ), + $value + ); + + if ( + empty($args['config']['signing_name']) + && isset($api['metadata']['signingName']) + ) { + $args['config']['signing_name'] = $api['metadata']['signingName']; + } + + $args['api'] = $api; + $args['parser'] = Service::createParser($api); + $args['error_parser'] = Service::createErrorParser($api->getProtocol(), $api); + } + + public static function _apply_endpoint_provider($value, array &$args) + { + if (!isset($args['endpoint'])) { + if ($value instanceof \Aws\EndpointV2\EndpointProviderV2) { + $options = self::getEndpointProviderOptions($args); + $value = PartitionEndpointProvider::defaultProvider($options) + ->getPartition($args['region'], $args['service']); + } + + $endpointPrefix = $args['api']['metadata']['endpointPrefix'] ?? $args['service']; + + // Check region is a valid host label when it is being used to + // generate an endpoint + if (!self::isValidRegion($args['region'])) { + throw new InvalidRegionException('Region must be a valid RFC' + . ' host label.'); + } + $serviceEndpoints = + is_array($value) && isset($value['services'][$args['service']]['endpoints']) + ? $value['services'][$args['service']]['endpoints'] + : null; + if (isset($serviceEndpoints[$args['region']]['deprecated'])) { + trigger_error("The service " . $args['service'] . "has " + . " deprecated the region " . $args['region'] . ".", + E_USER_WARNING + ); + } + + $args['region'] = \Aws\strip_fips_pseudo_regions($args['region']); + + // Invoke the endpoint provider and throw if it does not resolve. + $result = EndpointProvider::resolve($value, [ + 'service' => $endpointPrefix, + 'region' => $args['region'], + 'scheme' => $args['scheme'], + 'options' => self::getEndpointProviderOptions($args), + ]); + + $args['endpoint'] = $result['endpoint']; + + if (empty($args['config']['signature_version'])) { + if ( + isset($args['api']) + && $args['api']->getSignatureVersion() == 'bearer' + ) { + $args['config']['signature_version'] = 'bearer'; + } elseif (isset($result['signatureVersion'])) { + $args['config']['signature_version'] = $result['signatureVersion']; + } + } + + if ( + empty($args['config']['signing_region']) + && isset($result['signingRegion']) + ) { + $args['config']['signing_region'] = $result['signingRegion']; + } + + if ( + empty($args['config']['signing_name']) + && isset($result['signingName']) + ) { + $args['config']['signing_name'] = $result['signingName']; + } + } + } + + public static function _apply_endpoint_discovery($value, array &$args) { + $args['endpoint_discovery'] = $value; + } + + public static function _default_endpoint_discovery_provider(array $args) + { + return ConfigurationProvider::defaultProvider($args); + } + + public static function _apply_use_fips_endpoint($value, array &$args) { + if ($value instanceof CacheInterface) { + $value = UseFipsConfigProvider::defaultProvider($args); + } + if (is_callable($value)) { + $value = $value(); + } + if ($value instanceof PromiseInterface) { + $value = $value->wait(); + } + if ($value instanceof UseFipsEndpointConfigurationInterface) { + $args['config']['use_fips_endpoint'] = $value; + } else { + // The Configuration class itself will validate other inputs + $args['config']['use_fips_endpoint'] = new UseFipsEndpointConfiguration($value); + } + } + + public static function _default_use_fips_endpoint(array &$args) { + return UseFipsConfigProvider::defaultProvider($args); + } + + public static function _apply_use_dual_stack_endpoint($value, array &$args) { + if ($value instanceof CacheInterface) { + $value = UseDualStackConfigProvider::defaultProvider($args); + } + if (is_callable($value)) { + $value = $value(); + } + if ($value instanceof PromiseInterface) { + $value = $value->wait(); + } + if ($value instanceof UseDualStackEndpointConfigurationInterface) { + $args['config']['use_dual_stack_endpoint'] = $value; + } else { + // The Configuration class itself will validate other inputs + $args['config']['use_dual_stack_endpoint'] = + new UseDualStackEndpointConfiguration($value, $args['region']); + } + } + + public static function _default_use_dual_stack_endpoint(array &$args) { + return UseDualStackConfigProvider::defaultProvider($args); + } + + public static function _apply_serializer($value, array &$args, HandlerList $list) + { + $list->prependBuild(Middleware::requestBuilder($value), 'builder'); + } + + public static function _apply_debug($value, array &$args, HandlerList $list) + { + if ($value !== false) { + $list->interpose( + new TraceMiddleware( + $value === true ? [] : $value, + $args['api']) + ); + } + } + + public static function _apply_stats($value, array &$args, HandlerList $list) + { + // Create an array of stat collectors that are disabled (set to false) + // by default. If the user has passed in true, enable all stat + // collectors. + $defaults = array_fill_keys( + ['http', 'retries', 'timer'], + $value === true + ); + $args['stats'] = is_array($value) + ? array_replace($defaults, $value) + : $defaults; + + if ($args['stats']['timer']) { + $list->prependInit(Middleware::timer(), 'timer'); + } + } + + public static function _apply_profile($_, array &$args) + { + $args['credentials'] = CredentialProvider::ini($args['profile']); + } + + public static function _apply_validate($value, array &$args, HandlerList $list) + { + if ($value === false) { + return; + } + + $validator = $value === true + ? new Validator() + : new Validator($value); + $list->appendValidate( + Middleware::validation($args['api'], $validator), + 'validation' + ); + } + + public static function _apply_handler($value, array &$args, HandlerList $list) + { + $list->setHandler($value); + } + + public static function _default_handler(array &$args) + { + return new WrappedHttpHandler( + default_http_handler(), + $args['parser'], + $args['error_parser'], + $args['exception_class'], + $args['stats']['http'] + ); + } + + public static function _apply_http_handler($value, array &$args, HandlerList $list) + { + $args['handler'] = new WrappedHttpHandler( + $value, + $args['parser'], + $args['error_parser'], + $args['exception_class'], + $args['stats']['http'] + ); + } + + public static function _apply_app_id($value, array &$args) + { + // AppId should not be longer than 50 chars + static $MAX_APP_ID_LENGTH = 50; + if (strlen($value) > $MAX_APP_ID_LENGTH) { + trigger_error("The provided or configured value for `AppId`, " + ."which is an user agent parameter, exceeds the maximum length of " + ."$MAX_APP_ID_LENGTH characters.", E_USER_WARNING); + } + + $args['app_id'] = $value; + } + + public static function _default_app_id(array $args) + { + return ConfigurationResolver::resolve( + 'sdk_ua_app_id', + '', + 'string', + $args + ); + } + + public static function _apply_user_agent( + $inputUserAgent, + array &$args, + HandlerList $list + ): void + { + // Add endpoint discovery if set + $userAgent = []; + // Add the input to the end + if ($inputUserAgent){ + if (!is_array($inputUserAgent)) { + $inputUserAgent = [$inputUserAgent]; + } + $inputUserAgent = array_map('strval', $inputUserAgent); + $userAgent = array_merge($userAgent, $inputUserAgent); + } + + $args['ua_append'] = $userAgent; + + $list->appendBuild( + Middleware::mapRequest(function (RequestInterface $request) use ($userAgent) { + return $request->withHeader( + 'X-Amz-User-Agent', + implode(' ', array_merge( + $userAgent, + $request->getHeader('X-Amz-User-Agent') + )) + ); + }) + ); + } + + public static function _apply_endpoint($value, array &$args, HandlerList $list) + { + if (empty($value)) { + unset($args['endpoint']); + return; + } + + $args['endpoint_override'] = true; + $args['endpoint'] = $value; + } + + public static function _apply_idempotency_auto_fill( + $value, + array &$args, + HandlerList $list + ) { + $enabled = false; + $generator = null; + + + if (is_bool($value)) { + $enabled = $value; + } elseif (is_callable($value)) { + $enabled = true; + $generator = $value; + } + + if ($enabled) { + $list->prependInit( + IdempotencyTokenMiddleware::wrap($args['api'], $generator), + 'idempotency_auto_fill' + ); + } + } + + public static function _default_account_id_endpoint_mode($args) + { + return ConfigurationResolver::resolve( + 'account_id_endpoint_mode', + 'preferred', + 'string', + $args + ); + } + + public static function _apply_account_id_endpoint_mode($value, array &$args) + { + static $accountIdEndpointModes = ['disabled', 'required', 'preferred']; + if (!in_array($value, $accountIdEndpointModes)) { + throw new IAE( + "The value provided for the config account_id_endpoint_mode is invalid." + ."Valid values are: " . implode(", ", $accountIdEndpointModes) + ); + } + + $args['account_id_endpoint_mode'] = $value; + } + + public static function _default_endpoint_provider(array $args) + { + $service = $args['api'] ?? null; + $serviceName = isset($service) ? $service->getServiceName() : null; + $apiVersion = isset($service) ? $service->getApiVersion() : null; + + if (self::isValidService($serviceName) + && self::isValidApiVersion($serviceName, $apiVersion) + ) { + $ruleset = EndpointDefinitionProvider::getEndpointRuleset( + $service->getServiceName(), + $service->getApiVersion() + ); + return new \Aws\EndpointV2\EndpointProviderV2( + $ruleset, + EndpointDefinitionProvider::getPartitions() + ); + } + $options = self::getEndpointProviderOptions($args); + return PartitionEndpointProvider::defaultProvider($options) + ->getPartition($args['region'], $args['service']); + } + + public static function _default_serializer(array $args) + { + return Service::createSerializer( + $args['api'], + $args['endpoint'] + ); + } + + public static function _default_signature_provider() + { + return SignatureProvider::defaultProvider(); + } + + public static function _default_auth_scheme_resolver(array $args) + { + return new AuthSchemeResolver($args['credentials'], $args['token']); + } + + public static function _apply_auth_scheme_preference( + string|array|null &$value, + array &$args + ): void + { + // Not provided user's preference auth scheme list + if (empty($value)) { + $value = null; + $args['config']['auth_scheme_preference'] = $value; + return; + } + + // Normalize it as an array + if (is_string($value)) { + $value = explode(',', $value); + } + + // Let`s trim each value to remove break lines, spaces and/or tabs + foreach ($value as &$val) { + $val = trim($val); + } + + // Assign user's preferred auth scheme list + $args['auth_scheme_preference'] = $value; + } + + public static function _default_signature_version(array &$args) + { + if (isset($args['config']['signature_version'])) { + return $args['config']['signature_version']; + } + + $args['__partition_result'] = isset($args['__partition_result']) + ? isset($args['__partition_result']) + : call_user_func(PartitionEndpointProvider::defaultProvider(), [ + 'service' => $args['service'], + 'region' => $args['region'], + ]); + + return isset($args['__partition_result']['signatureVersion']) + ? $args['__partition_result']['signatureVersion'] + : $args['api']->getSignatureVersion(); + } + + public static function _default_signing_name(array &$args) + { + if (isset($args['config']['signing_name'])) { + return $args['config']['signing_name']; + } + + $args['__partition_result'] = isset($args['__partition_result']) + ? isset($args['__partition_result']) + : call_user_func(PartitionEndpointProvider::defaultProvider(), [ + 'service' => $args['service'], + 'region' => $args['region'], + ]); + + if (isset($args['__partition_result']['signingName'])) { + return $args['__partition_result']['signingName']; + } + + if ($signingName = $args['api']->getSigningName()) { + return $signingName; + } + + return $args['service']; + } + + public static function _default_signing_region(array &$args) + { + if (isset($args['config']['signing_region'])) { + return $args['config']['signing_region']; + } + + $args['__partition_result'] = isset($args['__partition_result']) + ? isset($args['__partition_result']) + : call_user_func(PartitionEndpointProvider::defaultProvider(), [ + 'service' => $args['service'], + 'region' => $args['region'], + ]); + + return $args['__partition_result']['signingRegion'] ?? $args['region']; + } + + public static function _apply_ignore_configured_endpoint_urls($value, array &$args) + { + $args['config']['ignore_configured_endpoint_urls'] = $value; + } + + public static function _apply_suppress_php_deprecation_warning($value, &$args) + { + if ($value) { + $args['suppress_php_deprecation_warning'] = true; + } elseif (!empty(getenv("AWS_SUPPRESS_PHP_DEPRECATION_WARNING"))) { + $args['suppress_php_deprecation_warning'] + = \Aws\boolean_value(getenv("AWS_SUPPRESS_PHP_DEPRECATION_WARNING")); + } elseif (!empty($_SERVER["AWS_SUPPRESS_PHP_DEPRECATION_WARNING"])) { + $args['suppress_php_deprecation_warning'] = + \Aws\boolean_value($_SERVER["AWS_SUPPRESS_PHP_DEPRECATION_WARNING"]); + } elseif (!empty($_ENV["AWS_SUPPRESS_PHP_DEPRECATION_WARNING"])) { + $args['suppress_php_deprecation_warning'] = + \Aws\boolean_value($_ENV["AWS_SUPPRESS_PHP_DEPRECATION_WARNING"]); + } + + if ($args['suppress_php_deprecation_warning'] === false + && PHP_VERSION_ID < 80100 + ) { + self::emitDeprecationWarning(); + } + } + + public static function _default_endpoint(array &$args) + { + if ($args['config']['ignore_configured_endpoint_urls'] + || !self::isValidService($args['service']) + ) { + return ''; + } + + $serviceIdentifier = \Aws\manifest($args['service'])['serviceIdentifier']; + $value = ConfigurationResolver::resolve( + 'endpoint_url_' . $serviceIdentifier, + '', + 'string', + $args + [ + 'ini_resolver_options' => [ + 'section' => 'services', + 'subsection' => $serviceIdentifier, + 'key' => 'endpoint_url' + ] + ] + ); + + if (empty($value)) { + $value = ConfigurationResolver::resolve( + 'endpoint_url', + '', + 'string', + $args + ); + } + + if (!empty($value)) { + $args['config']['configured_endpoint_url'] = true; + } + + return $value; + } + + public static function _apply_sigv4a_signing_region_set($value, array &$args) + { + if (empty($value)) { + $args['sigv4a_signing_region_set'] = null; + } elseif (is_array($value)) { + $args['sigv4a_signing_region_set'] = implode(', ', $value); + } else { + $args['sigv4a_signing_region_set'] = $value; + } + } + + public static function _apply_region($value, array &$args) + { + if (empty($value)) { + self::_missing_region($args); + } + $args['region'] = $value; + } + + public static function _missing_region(array $args) + { + $service = $args['service'] ?? ''; + + $msg = << 0, + 'bool' => false, + 'boolean' => false, + 'string' => '', + ]; + + return ConfigurationResolver::resolve( + $key, + $typeDefaultMap[$expectedType] ?? '', + $expectedType, + $args + ); + } + + /** + * Extracts client options for the endpoint provider to its own array + * + * @param array $args + * @return array + */ + private static function getEndpointProviderOptions(array $args) + { + $options = []; + $optionKeys = [ + 'sts_regional_endpoints', + 's3_us_east_1_regional_endpoint', + ]; + $configKeys = [ + 'use_dual_stack_endpoint', + 'use_fips_endpoint', + ]; + foreach ($optionKeys as $key) { + if (isset($args[$key])) { + $options[$key] = $args[$key]; + } + } + foreach ($configKeys as $key) { + if (isset($args['config'][$key])) { + $options[$key] = $args['config'][$key]; + } + } + return $options; + } + + /** + * Validates a region to be used for endpoint construction + * + * @param $region + * @return bool + */ + private static function isValidRegion($region) + { + return is_valid_hostlabel($region); + } + + private function _apply_client_context_params(array $args) + { + if (isset($args['api']) + && !empty($args['api']->getClientContextParams())) + { + $clientContextParams = $args['api']->getClientContextParams(); + foreach($clientContextParams as $paramName => $paramDefinition) { + $definition = [ + 'type' => 'value', + 'valid' => [$paramDefinition['type']], + 'doc' => $paramDefinition['documentation'] ?? null + ]; + $this->argDefinitions[$paramName] = $definition; + + if (isset($args[$paramName])) { + $fn = self::$typeMap[$paramDefinition['type']]; + if (!$fn($args[$paramName])) { + $this->invalidType($paramName, $args[$paramName]); + } + } + } + } + } + + private static function isValidService($service) + { + if (is_null($service)) { + return false; + } + $services = \Aws\manifest(); + return isset($services[$service]); + } + + private static function isValidApiVersion($service, $apiVersion) + { + if (is_null($apiVersion)) { + return false; + } + return is_dir( + __DIR__ . "/data/{$service}/$apiVersion" + ); + } + + private static function emitDeprecationWarning() + { + $phpVersionString = phpversion(); + trigger_error( + "This installation of the SDK is using PHP version" + . " {$phpVersionString}, which will be deprecated on January" + . " 13th, 2025.\nPlease upgrade your PHP version to a minimum of" + . " 8.1.x to continue receiving updates for the AWS" + . " SDK for PHP.\nTo disable this warning, set" + . " suppress_php_deprecation_warning to true on the client constructor" + . " or set the environment variable AWS_SUPPRESS_PHP_DEPRECATION_WARNING" + . " to true.\nMore information can be found at: " + . "https://aws.amazon.com/blogs/developer/announcing-the-end-of-support-for-php-runtimes-8-0-x-and-below-in-the-aws-sdk-for-php/\n", + E_USER_DEPRECATED + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/AbstractMonitoringMiddleware.php b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/AbstractMonitoringMiddleware.php new file mode 100644 index 0000000..d514e83 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/AbstractMonitoringMiddleware.php @@ -0,0 +1,309 @@ +getResponse(); + if ($response !== null) { + $header = $response->getHeader($headerName); + if (!empty($header[0])) { + return $header[0]; + } + } + return null; + } + + protected static function getResultHeader(ResultInterface $result, $headerName) + { + if (isset($result['@metadata']['headers'][$headerName])) { + return $result['@metadata']['headers'][$headerName]; + } + return null; + } + + protected static function getExceptionHeader(\Exception $e, $headerName) + { + if ($e instanceof ResponseContainerInterface) { + $response = $e->getResponse(); + if ($response instanceof ResponseInterface) { + $header = $response->getHeader($headerName); + if (!empty($header[0])) { + return $header[0]; + } + } + } + return null; + } + + /** + * Constructor stores the passed in handler and options. + * + * @param callable $handler + * @param callable $credentialProvider + * @param $options + * @param $region + * @param $service + */ + public function __construct( + callable $handler, + callable $credentialProvider, + $options, + $region, + $service + ) { + $this->nextHandler = $handler; + $this->credentialProvider = $credentialProvider; + $this->options = $options; + $this->region = $region; + $this->service = $service; + } + + /** + * Standard invoke pattern for middleware execution to be implemented by + * child classes. + * + * @param CommandInterface $cmd + * @param RequestInterface $request + * @return Promise\PromiseInterface + */ + public function __invoke(CommandInterface $cmd, RequestInterface $request) + { + $handler = $this->nextHandler; + $eventData = null; + $enabled = $this->isEnabled(); + + if ($enabled) { + $cmd['@http']['collect_stats'] = true; + $eventData = $this->populateRequestEventData( + $cmd, + $request, + $this->getNewEvent($cmd, $request) + ); + } + + $g = function ($value) use ($eventData, $enabled) { + if ($enabled) { + $eventData = $this->populateResultEventData( + $value, + $eventData + ); + $this->sendEventData($eventData); + + if ($value instanceof MonitoringEventsInterface) { + $value->appendMonitoringEvent($eventData); + } + } + if ($value instanceof \Exception || $value instanceof \Throwable) { + return Promise\Create::rejectionFor($value); + } + return $value; + }; + + return Promise\Create::promiseFor($handler($cmd, $request))->then($g, $g); + } + + private function getClientId() + { + return $this->unwrappedOptions()->getClientId(); + } + + private function getNewEvent( + CommandInterface $cmd, + RequestInterface $request + ) { + $event = [ + 'Api' => $cmd->getName(), + 'ClientId' => $this->getClientId(), + 'Region' => $this->getRegion(), + 'Service' => $this->getService(), + 'Timestamp' => (int) floor(microtime(true) * 1000), + 'UserAgent' => substr( + $request->getHeaderLine('User-Agent') . ' ' . \Aws\default_user_agent(), + 0, + 256 + ), + 'Version' => 1 + ]; + return $event; + } + + private function getHost() + { + return $this->unwrappedOptions()->getHost(); + } + + private function getPort() + { + return $this->unwrappedOptions()->getPort(); + } + + private function getRegion() + { + return $this->region; + } + + private function getService() + { + return $this->service; + } + + /** + * Returns enabled flag from options, unwrapping options if necessary. + * + * @return bool + */ + private function isEnabled() + { + return $this->unwrappedOptions()->isEnabled(); + } + + /** + * Returns $eventData array with information from the request and command. + * + * @param CommandInterface $cmd + * @param RequestInterface $request + * @param array $event + * @return array + */ + protected function populateRequestEventData( + CommandInterface $cmd, + RequestInterface $request, + array $event + ) { + $dataFormat = static::getRequestData($request); + foreach ($dataFormat as $eventKey => $value) { + if ($value !== null) { + $event[$eventKey] = $value; + } + } + return $event; + } + + /** + * Returns $eventData array with information from the response, including + * the calculation for attempt latency. + * + * @param ResultInterface|\Exception $result + * @param array $event + * @return array + */ + protected function populateResultEventData( + $result, + array $event + ) { + $dataFormat = static::getResponseData($result); + foreach ($dataFormat as $eventKey => $value) { + if ($value !== null) { + $event[$eventKey] = $value; + } + } + return $event; + } + + + /** + * Checks if the socket is created. If PHP version is greater or equals to 8 then, + * it will check if the var is instance of \Socket otherwise it will check if is + * a resource. + * + * @return bool Returns true if the socket is created, false otherwise. + */ + private function isSocketCreated(): bool + { + // Before version 8, sockets are resources + // After version 8, sockets are instances of Socket + if (PHP_MAJOR_VERSION >= 8) { + $socketClass = '\Socket'; + return self::$socket instanceof $socketClass; + } else { + return is_resource(self::$socket); + } + } + + /** + * Creates a UDP socket resource and stores it with the class, or retrieves + * it if already instantiated and connected. Handles error-checking and + * re-connecting if necessary. If $forceNewConnection is set to true, a new + * socket will be created. + * + * @param bool $forceNewConnection + * @return Resource + */ + private function prepareSocket($forceNewConnection = false) + { + if (!$this->isSocketCreated() + || $forceNewConnection + || socket_last_error(self::$socket) + ) { + self::$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + socket_clear_error(self::$socket); + socket_connect(self::$socket, $this->getHost(), $this->getPort()); + } + + return self::$socket; + } + + /** + * Sends formatted monitoring event data via the UDP socket connection to + * the CSM agent endpoint. + * + * @param array $eventData + * @return int + */ + private function sendEventData(array $eventData) + { + $socket = $this->prepareSocket(); + $datagram = json_encode($eventData); + $result = socket_write($socket, $datagram, strlen($datagram)); + if ($result === false) { + $this->prepareSocket(true); + } + return $result; + } + + /** + * Unwraps options, if needed, and returns them. + * + * @return ConfigurationInterface + */ + private function unwrappedOptions() + { + if (!($this->options instanceof ConfigurationInterface)) { + try { + $this->options = ConfigurationProvider::unwrap($this->options); + } catch (\Exception $e) { + // Errors unwrapping CSM config defaults to disabling it + $this->options = new Configuration( + false, + ConfigurationProvider::DEFAULT_HOST, + ConfigurationProvider::DEFAULT_PORT + ); + } + } + return $this->options; + } +} diff --git a/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallAttemptMonitoringMiddleware.php b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallAttemptMonitoringMiddleware.php new file mode 100644 index 0000000..91810bb --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallAttemptMonitoringMiddleware.php @@ -0,0 +1,262 @@ + $request->getUri()->getHost(), + ]; + } + + /** + * {@inheritdoc} + */ + public static function getResponseData($klass) + { + if ($klass instanceof ResultInterface) { + return [ + 'AttemptLatency' => self::getResultAttemptLatency($klass), + 'DestinationIp' => self::getResultDestinationIp($klass), + 'DnsLatency' => self::getResultDnsLatency($klass), + 'HttpStatusCode' => self::getResultHttpStatusCode($klass), + 'XAmzId2' => self::getResultHeader($klass, 'x-amz-id-2'), + 'XAmzRequestId' => self::getResultHeader($klass, 'x-amz-request-id'), + 'XAmznRequestId' => self::getResultHeader($klass, 'x-amzn-RequestId'), + ]; + } + if ($klass instanceof AwsException) { + return [ + 'AttemptLatency' => self::getAwsExceptionAttemptLatency($klass), + 'AwsException' => substr( + self::getAwsExceptionErrorCode($klass), + 0, + 128 + ), + 'AwsExceptionMessage' => substr( + self::getAwsExceptionMessage($klass), + 0, + 512 + ), + 'DestinationIp' => self::getAwsExceptionDestinationIp($klass), + 'DnsLatency' => self::getAwsExceptionDnsLatency($klass), + 'HttpStatusCode' => self::getAwsExceptionHttpStatusCode($klass), + 'XAmzId2' => self::getAwsExceptionHeader($klass, 'x-amz-id-2'), + 'XAmzRequestId' => self::getAwsExceptionHeader( + $klass, + 'x-amz-request-id' + ), + 'XAmznRequestId' => self::getAwsExceptionHeader( + $klass, + 'x-amzn-RequestId' + ), + ]; + } + if ($klass instanceof \Exception) { + return [ + 'HttpStatusCode' => self::getExceptionHttpStatusCode($klass), + 'SdkException' => substr( + self::getExceptionCode($klass), + 0, + 128 + ), + 'SdkExceptionMessage' => substr( + self::getExceptionMessage($klass), + 0, + 512 + ), + 'XAmzId2' => self::getExceptionHeader($klass, 'x-amz-id-2'), + 'XAmzRequestId' => self::getExceptionHeader($klass, 'x-amz-request-id'), + 'XAmznRequestId' => self::getExceptionHeader($klass, 'x-amzn-RequestId'), + ]; + } + + throw new \InvalidArgumentException('Parameter must be an instance of ResultInterface, AwsException or Exception.'); + } + + private static function getResultAttemptLatency(ResultInterface $result) + { + if (isset($result['@metadata']['transferStats']['http'])) { + $attempt = end($result['@metadata']['transferStats']['http']); + if (isset($attempt['total_time'])) { + return (int) floor($attempt['total_time'] * 1000); + } + } + return null; + } + + private static function getResultDestinationIp(ResultInterface $result) + { + if (isset($result['@metadata']['transferStats']['http'])) { + $attempt = end($result['@metadata']['transferStats']['http']); + if (isset($attempt['primary_ip'])) { + return $attempt['primary_ip']; + } + } + return null; + } + + private static function getResultDnsLatency(ResultInterface $result) + { + if (isset($result['@metadata']['transferStats']['http'])) { + $attempt = end($result['@metadata']['transferStats']['http']); + if (isset($attempt['namelookup_time'])) { + return (int) floor($attempt['namelookup_time'] * 1000); + } + } + return null; + } + + private static function getResultHttpStatusCode(ResultInterface $result) + { + return $result['@metadata']['statusCode']; + } + + private static function getAwsExceptionAttemptLatency(AwsException $e) { + $attempt = $e->getTransferInfo(); + if (isset($attempt['total_time'])) { + return (int) floor($attempt['total_time'] * 1000); + } + return null; + } + + private static function getAwsExceptionErrorCode(AwsException $e) { + return $e->getAwsErrorCode(); + } + + private static function getAwsExceptionMessage(AwsException $e) { + return $e->getAwsErrorMessage(); + } + + private static function getAwsExceptionDestinationIp(AwsException $e) { + $attempt = $e->getTransferInfo(); + if (isset($attempt['primary_ip'])) { + return $attempt['primary_ip']; + } + return null; + } + + private static function getAwsExceptionDnsLatency(AwsException $e) { + $attempt = $e->getTransferInfo(); + if (isset($attempt['namelookup_time'])) { + return (int) floor($attempt['namelookup_time'] * 1000); + } + return null; + } + + private static function getAwsExceptionHttpStatusCode(AwsException $e) { + $response = $e->getResponse(); + if ($response !== null) { + return $response->getStatusCode(); + } + return null; + } + + private static function getExceptionHttpStatusCode(\Exception $e) { + if ($e instanceof ResponseContainerInterface) { + $response = $e->getResponse(); + if ($response instanceof ResponseInterface) { + return $response->getStatusCode(); + } + } + return null; + } + + private static function getExceptionCode(\Exception $e) { + if (!($e instanceof AwsException)) { + return get_class($e); + } + return null; + } + + private static function getExceptionMessage(\Exception $e) { + if (!($e instanceof AwsException)) { + return $e->getMessage(); + } + return null; + } + + /** + * {@inheritdoc} + */ + protected function populateRequestEventData( + CommandInterface $cmd, + RequestInterface $request, + array $event + ) { + $event = parent::populateRequestEventData($cmd, $request, $event); + $event['Type'] = 'ApiCallAttempt'; + return $event; + } + + /** + * {@inheritdoc} + */ + protected function populateResultEventData( + $result, + array $event + ) { + $event = parent::populateResultEventData($result, $event); + + $provider = $this->credentialProvider; + /** @var CredentialsInterface $credentials */ + $credentials = $provider()->wait(); + $event['AccessKey'] = $credentials->getAccessKeyId(); + $sessionToken = $credentials->getSecurityToken(); + if ($sessionToken !== null) { + $event['SessionToken'] = $sessionToken; + } + if (empty($event['AttemptLatency'])) { + $event['AttemptLatency'] = (int) (floor(microtime(true) * 1000) - $event['Timestamp']); + } + return $event; + } +} diff --git a/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php new file mode 100644 index 0000000..4208073 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php @@ -0,0 +1,175 @@ + 'AwsException', + 'FinalAwsExceptionMessage' => 'AwsExceptionMessage', + 'FinalSdkException' => 'SdkException', + 'FinalSdkExceptionMessage' => 'SdkExceptionMessage', + 'FinalHttpStatusCode' => 'HttpStatusCode', + ]; + + /** + * Standard middleware wrapper function with CSM options passed in. + * + * @param callable $credentialProvider + * @param mixed $options + * @param string $region + * @param string $service + * @return callable + */ + public static function wrap( + callable $credentialProvider, + $options, + $region, + $service + ) { + return function (callable $handler) use ( + $credentialProvider, + $options, + $region, + $service + ) { + return new static( + $handler, + $credentialProvider, + $options, + $region, + $service + ); + }; + } + + /** + * {@inheritdoc} + */ + public static function getRequestData(RequestInterface $request) + { + return []; + } + + /** + * {@inheritdoc} + */ + public static function getResponseData($klass) + { + if ($klass instanceof ResultInterface) { + $data = [ + 'AttemptCount' => self::getResultAttemptCount($klass), + 'MaxRetriesExceeded' => 0, + ]; + } elseif ($klass instanceof \Exception) { + $data = [ + 'AttemptCount' => self::getExceptionAttemptCount($klass), + 'MaxRetriesExceeded' => self::getMaxRetriesExceeded($klass), + ]; + } else { + throw new \InvalidArgumentException('Parameter must be an instance of ResultInterface or Exception.'); + } + + return $data + self::getFinalAttemptData($klass); + } + + private static function getResultAttemptCount(ResultInterface $result) { + if (isset($result['@metadata']['transferStats']['http'])) { + return count($result['@metadata']['transferStats']['http']); + } + return 1; + } + + private static function getExceptionAttemptCount(\Exception $e) { + $attemptCount = 0; + if ($e instanceof MonitoringEventsInterface) { + foreach ($e->getMonitoringEvents() as $event) { + if (isset($event['Type']) && + $event['Type'] === 'ApiCallAttempt') { + $attemptCount++; + } + } + + } + return $attemptCount; + } + + private static function getFinalAttemptData($klass) + { + $data = []; + if ($klass instanceof MonitoringEventsInterface) { + $finalAttempt = self::getFinalAttempt($klass->getMonitoringEvents()); + + if (!empty($finalAttempt)) { + foreach (self::$eventKeys as $callKey => $attemptKey) { + if (isset($finalAttempt[$attemptKey])) { + $data[$callKey] = $finalAttempt[$attemptKey]; + } + } + } + } + + return $data; + } + + private static function getFinalAttempt(array $events) + { + for (end($events); key($events) !== null; prev($events)) { + $current = current($events); + if (isset($current['Type']) + && $current['Type'] === 'ApiCallAttempt' + ) { + return $current; + } + } + + return null; + } + + private static function getMaxRetriesExceeded($klass) + { + if ($klass instanceof AwsException && $klass->isMaxRetriesExceeded()) { + return 1; + } + return 0; + } + + /** + * {@inheritdoc} + */ + protected function populateRequestEventData( + CommandInterface $cmd, + RequestInterface $request, + array $event + ) { + $event = parent::populateRequestEventData($cmd, $request, $event); + $event['Type'] = 'ApiCall'; + return $event; + } + + /** + * {@inheritdoc} + */ + protected function populateResultEventData( + $result, + array $event + ) { + $event = parent::populateResultEventData($result, $event); + $event['Latency'] = (int) (floor(microtime(true) * 1000) - $event['Timestamp']); + return $event; + } +} diff --git a/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/Configuration.php b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/Configuration.php new file mode 100644 index 0000000..b875274 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/Configuration.php @@ -0,0 +1,77 @@ +host = $host; + $this->port = filter_var($port, FILTER_VALIDATE_INT); + if ($this->port === false) { + throw new \InvalidArgumentException( + "CSM 'port' value must be an integer!"); + } + + // Unparsable $enabled flag errors on the side of disabling CSM + $this->enabled = filter_var($enabled, FILTER_VALIDATE_BOOLEAN); + $this->clientId = trim($clientId); + } + + /** + * {@inheritdoc} + */ + public function isEnabled() + { + return $this->enabled; + } + + /** + * {@inheritdoc} + */ + public function getClientId() + { + return $this->clientId; + } + + /** + * /{@inheritdoc} + */ + public function getHost() + { + return $this->host; + } + + /** + * {@inheritdoc} + */ + public function getPort() + { + return $this->port; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return [ + 'client_id' => $this->getClientId(), + 'enabled' => $this->isEnabled(), + 'host' => $this->getHost(), + 'port' => $this->getPort() + ]; + } +} \ No newline at end of file diff --git a/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ConfigurationInterface.php b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ConfigurationInterface.php new file mode 100644 index 0000000..9a54827 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/ConfigurationInterface.php @@ -0,0 +1,44 @@ + + * use Aws\ClientSideMonitoring\ConfigurationProvider; + * $provider = ConfigurationProvider::defaultProvider(); + * // Returns a ConfigurationInterface or throws. + * $config = $provider()->wait(); + * + * + * Configuration providers can be composed to create configuration using + * conditional logic that can create different configurations in different + * environments. You can compose multiple providers into a single provider using + * {@see Aws\ClientSideMonitoring\ConfigurationProvider::chain}. This function + * accepts providers as variadic arguments and returns a new function that will + * invoke each provider until a successful configuration is returned. + * + * + * // First try an INI file at this location. + * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = ConfigurationProvider::env(); + * // Combine the three providers together. + * $composed = ConfigurationProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with a configuration or throws. + * $promise = $composed(); + * // Wait on the configuration to resolve. + * $config = $promise->wait(); + * + */ +class ConfigurationProvider extends AbstractConfigurationProvider + implements ConfigurationProviderInterface +{ + const DEFAULT_CLIENT_ID = ''; + const DEFAULT_ENABLED = false; + const DEFAULT_HOST = '127.0.0.1'; + const DEFAULT_PORT = 31000; + const ENV_CLIENT_ID = 'AWS_CSM_CLIENT_ID'; + const ENV_ENABLED = 'AWS_CSM_ENABLED'; + const ENV_HOST = 'AWS_CSM_HOST'; + const ENV_PORT = 'AWS_CSM_PORT'; + const ENV_PROFILE = 'AWS_PROFILE'; + + public static $cacheKey = 'aws_cached_csm_config'; + + protected static $interfaceClass = ConfigurationInterface::class; + protected static $exceptionClass = ConfigurationException::class; + + /** + * Create a default config provider that first checks for environment + * variables, then checks for a specified profile in the environment-defined + * config file location (env variable is 'AWS_CONFIG_FILE', file location + * defaults to ~/.aws/config), then checks for the "default" profile in the + * environment-defined config file location, and failing those uses a default + * fallback set of configuration options. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided config options. + * + * @param array $config + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $configProviders = [self::env()]; + if ( + !isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] != false + ) { + $configProviders[] = self::ini(); + } + $configProviders[] = self::fallback(); + + $memo = self::memoize( + call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders) + ); + + if (isset($config['csm']) && $config['csm'] instanceof CacheInterface) { + return self::cache($memo, $config['csm'], self::$cacheKey); + } + + return $memo; + } + + /** + * Provider that creates CSM config from environment variables. + * + * @return callable + */ + public static function env() + { + return function () { + // Use credentials from environment variables, if available + $enabled = getenv(self::ENV_ENABLED); + if ($enabled !== false) { + return Promise\Create::promiseFor( + new Configuration( + $enabled, + getenv(self::ENV_HOST) ?: self::DEFAULT_HOST, + getenv(self::ENV_PORT) ?: self::DEFAULT_PORT, + getenv(self:: ENV_CLIENT_ID) ?: self::DEFAULT_CLIENT_ID + ) + ); + } + + return self::reject('Could not find environment variable CSM config' + . ' in ' . self::ENV_ENABLED. '/' . self::ENV_HOST . '/' + . self::ENV_PORT . '/' . self::ENV_CLIENT_ID); + }; + } + + /** + * Fallback config options when other sources are not set. + * + * @return callable + */ + public static function fallback() + { + return function() { + return Promise\Create::promiseFor( + new Configuration( + self::DEFAULT_ENABLED, + self::DEFAULT_HOST, + self::DEFAULT_PORT, + self::DEFAULT_CLIENT_ID + ) + ); + }; + } + + /** + * Config provider that creates config using a config file whose location + * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to + * ~/.aws/config if not specified + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile. + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the default directory. + * + * @return callable + */ + public static function ini($profile = null, $filename = null) + { + $filename = $filename ?: (self::getDefaultConfigFilename()); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'aws_csm'); + + return function () use ($profile, $filename) { + if (!@is_readable($filename)) { + return self::reject("Cannot read CSM config from $filename"); + } + $data = \Aws\parse_ini_file($filename, true); + if ($data === false) { + return self::reject("Invalid config file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in config file"); + } + if (!isset($data[$profile]['csm_enabled'])) { + return self::reject("Required CSM config values not present in + INI profile '{$profile}' ({$filename})"); + } + + // host is optional + if (empty($data[$profile]['csm_host'])) { + $data[$profile]['csm_host'] = self::DEFAULT_HOST; + } + + // port is optional + if (!filter_var($data[$profile]['csm_port'] ?? null, FILTER_VALIDATE_INT)) { + $data[$profile]['csm_port'] = self::DEFAULT_PORT; + } + + // client_id is optional + if (empty($data[$profile]['csm_client_id'])) { + $data[$profile]['csm_client_id'] = self::DEFAULT_CLIENT_ID; + } + + return Promise\Create::promiseFor( + new Configuration( + $data[$profile]['csm_enabled'], + $data[$profile]['csm_host'], + $data[$profile]['csm_port'], + $data[$profile]['csm_client_id'] + ) + ); + }; + } + + /** + * Unwraps a configuration object in whatever valid form it is in, + * always returning a ConfigurationInterface object. + * + * @param mixed $config + * @return ConfigurationInterface + * @throws \InvalidArgumentException + */ + public static function unwrap($config) + { + if (is_callable($config)) { + $config = $config(); + } + if ($config instanceof PromiseInterface) { + $config = $config->wait(); + } + if ($config instanceof ConfigurationInterface) { + return $config; + } elseif (is_array($config) && isset($config['enabled'])) { + $client_id = isset($config['client_id']) ? $config['client_id'] + : self::DEFAULT_CLIENT_ID; + $host = isset($config['host']) ? $config['host'] + : self::DEFAULT_HOST; + $port = isset($config['port']) ? $config['port'] + : self::DEFAULT_PORT; + return new Configuration($config['enabled'], $host, $port, $client_id); + } + + throw new \InvalidArgumentException('Not a valid CSM configuration ' + . 'argument.'); + } +} diff --git a/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/Exception/ConfigurationException.php b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/Exception/ConfigurationException.php new file mode 100644 index 0000000..827743e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ClientSideMonitoring/Exception/ConfigurationException.php @@ -0,0 +1,15 @@ +name = $name; + $this->data = $args; + $this->handlerList = $list ?: new HandlerList(); + + if (!isset($this->data['@http'])) { + $this->data['@http'] = []; + } + if (!isset($this->data['@context'])) { + $this->data['@context'] = []; + } + $this->metricsBuilder = $metricsBuilder ?: new MetricsBuilder(); + } + + public function __clone() + { + $this->handlerList = clone $this->handlerList; + } + + public function getName() + { + return $this->name; + } + + public function hasParam($name) + { + return array_key_exists($name, $this->data); + } + + public function getHandlerList() + { + return $this->handlerList; + } + + /** + * For overriding auth schemes on a per endpoint basis when using + * EndpointV2 provider. Intended for internal use only. + * + * @param array $authSchemes + * + * @deprecated In favor of using the @context property bag. + * Auth Schemes are now accessible via the `signature_version` key + * in a Command's context, if applicable. Auth Schemes set using + * This method are no longer consumed. + * + * @internal + */ + public function setAuthSchemes(array $authSchemes) + { + trigger_error(__METHOD__ . ' is deprecated. Auth schemes ' + . 'resolved using the service `auth` trait or via endpoint resolution ' + . 'are now set in the command `@context` property.`' + , E_USER_WARNING + ); + + $this->authSchemes = $authSchemes; + } + + /** + * Get auth schemes added to command as required + * for endpoint resolution + * + * @returns array + * + * @deprecated In favor of using the @context property bag. + * Auth schemes are now accessible via the `signature_version` key + * in a Command's context, if applicable. + */ + public function getAuthSchemes() + { + trigger_error(__METHOD__ . ' is deprecated. Auth schemes ' + . 'resolved using the service `auth` trait or via endpoint resolution ' + . 'can now be found in the command `@context` property.`' + , E_USER_WARNING + ); + + return $this->authSchemes ?: []; + } + + /** @deprecated */ + public function get($name) + { + return $this[$name]; + } + + /** + * Returns the metrics builder instance tied up to this command. + * + * @internal + * + * @return MetricsBuilder + */ + public function getMetricsBuilder(): MetricsBuilder + { + return $this->metricsBuilder; + } +} diff --git a/vendor/aws/aws-sdk-php/src/CommandInterface.php b/vendor/aws/aws-sdk-php/src/CommandInterface.php new file mode 100644 index 0000000..b35c75d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/CommandInterface.php @@ -0,0 +1,42 @@ +getBefore($config); + $mapFn = function ($commands) use ($client, $before, $config) { + foreach ($commands as $key => $command) { + if (!($command instanceof CommandInterface)) { + throw new \InvalidArgumentException('Each value yielded by ' + . 'the iterator must be an Aws\CommandInterface.'); + } + if ($before) { + $before($command, $key); + } + if (!empty($config['preserve_iterator_keys'])) { + yield $key => $client->executeAsync($command); + } else { + yield $client->executeAsync($command); + } + } + }; + + $this->each = new EachPromise($mapFn($commands), $config); + } + + /** + * @return PromiseInterface + */ + public function promise(): PromiseInterface + { + return $this->each->promise(); + } + + /** + * Executes a pool synchronously and aggregates the results of the pool + * into an indexed array in the same order as the passed in array. + * + * @param AwsClientInterface $client Client used to execute commands. + * @param mixed $commands Iterable that yields commands. + * @param array $config Configuration options. + * + * @return array + * @see \Aws\CommandPool::__construct for available configuration options. + */ + public static function batch( + AwsClientInterface $client, + $commands, + array $config = [] + ) { + $results = []; + self::cmpCallback($config, 'fulfilled', $results); + self::cmpCallback($config, 'rejected', $results); + + return (new self($client, $commands, $config)) + ->promise() + ->then(static function () use (&$results) { + ksort($results); + return $results; + }) + ->wait(); + } + + /** + * @return callable + */ + private function getBefore(array $config) + { + if (!isset($config['before'])) { + return null; + } + + if (is_callable($config['before'])) { + return $config['before']; + } + + throw new \InvalidArgumentException('before must be callable'); + } + + /** + * Adds an onFulfilled or onRejected callback that aggregates results into + * an array. If a callback is already present, it is replaced with the + * composed function. + * + * @param array $config + * @param $name + * @param array $results + */ + private static function cmpCallback(array &$config, $name, array &$results) + { + if (!isset($config[$name])) { + $config[$name] = function ($v, $k) use (&$results) { + $results[$k] = $v; + }; + } else { + $currentFn = $config[$name]; + $config[$name] = function ($v, $k) use (&$results, $currentFn) { + $currentFn($v, $k); + $results[$k] = $v; + }; + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/ConfigurationProviderInterface.php b/vendor/aws/aws-sdk-php/src/ConfigurationProviderInterface.php new file mode 100644 index 0000000..f132261 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ConfigurationProviderInterface.php @@ -0,0 +1,13 @@ +client = $config['client']; + $this->assumeRoleParams = $config['assume_role_params']; + } + + /** + * Loads assume role credentials. + * + * @return PromiseInterface + */ + public function __invoke() + { + $client = $this->client; + return $client->assumeRoleAsync($this->assumeRoleParams) + ->then(function (Result $result) { + return $this->client->createCredentials( + $result, + CredentialSources::STS_ASSUME_ROLE + ); + })->otherwise(function (\RuntimeException $exception) { + throw new CredentialsException( + "Error in retrieving assume role credentials.", + 0, + $exception + ); + }); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Credentials/AssumeRoleWithWebIdentityCredentialProvider.php b/vendor/aws/aws-sdk-php/src/Credentials/AssumeRoleWithWebIdentityCredentialProvider.php new file mode 100644 index 0000000..2c862c0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Credentials/AssumeRoleWithWebIdentityCredentialProvider.php @@ -0,0 +1,201 @@ +arn = $config['RoleArn']; + + if (!isset($config['WebIdentityTokenFile'])) { + throw new \InvalidArgumentException(self::ERROR_MSG . "'WebIdentityTokenFile'."); + } + $this->tokenFile = $config['WebIdentityTokenFile']; + + if (!preg_match("/^\w\:|^\/|^\\\/", $this->tokenFile)) { + throw new \InvalidArgumentException("'WebIdentityTokenFile' must be an absolute path."); + } + + $this->retries = (int) getenv(self::ENV_RETRIES) ?: (isset($config['retries']) ? $config['retries'] : 3); + $this->authenticationAttempts = 0; + $this->tokenFileReadAttempts = 0; + $this->session = $config['SessionName'] + ?? 'aws-sdk-php-' . round(microtime(true) * 1000); + + if (isset($config['client'])) { + $this->client = $config['client']; + } else { + $region = $config['region'] + ?? getEnv(CredentialProvider::ENV_REGION) + ?: null; + + $this->client = $this->createDefaultStsClient($region); + } + + $this->source = $config['source'] + ?? CredentialSources::STS_WEB_ID_TOKEN; + } + + /** + * Loads assume role with web identity credentials. + * + * @return Promise\PromiseInterface + */ + public function __invoke() + { + return Promise\Coroutine::of(function () { + $client = $this->client; + $result = null; + while ($result == null) { + try { + $token = @file_get_contents($this->tokenFile); + if (false === $token) { + clearstatcache(true, dirname($this->tokenFile) . "/" . readlink($this->tokenFile)); + clearstatcache(true, dirname($this->tokenFile) . "/" . dirname(readlink($this->tokenFile))); + clearstatcache(true, $this->tokenFile); + if (!@is_readable($this->tokenFile)) { + throw new CredentialsException( + "Unreadable tokenfile at location {$this->tokenFile}" + ); + } + + $token = @file_get_contents($this->tokenFile); + } + if (empty($token)) { + if ($this->tokenFileReadAttempts < $this->retries) { + sleep((int) pow(1.2, $this->tokenFileReadAttempts)); + $this->tokenFileReadAttempts++; + continue; + } + throw new CredentialsException("InvalidIdentityToken from file: {$this->tokenFile}"); + } + } catch (\Exception $exception) { + throw new CredentialsException( + "Error reading WebIdentityTokenFile from " . $this->tokenFile, + 0, + $exception + ); + } + + $assumeParams = [ + 'RoleArn' => $this->arn, + 'RoleSessionName' => $this->session, + 'WebIdentityToken' => $token + ]; + + try { + $result = $client->assumeRoleWithWebIdentity($assumeParams); + } catch (AwsException $e) { + if ($e->getAwsErrorCode() == 'InvalidIdentityToken') { + if ($this->authenticationAttempts < $this->retries) { + sleep((int) pow(1.2, $this->authenticationAttempts)); + } else { + throw new CredentialsException( + "InvalidIdentityToken, retries exhausted" + ); + } + } else { + throw new CredentialsException( + "Error assuming role from web identity credentials", + 0, + $e + ); + } + } catch (\Exception $e) { + throw new CredentialsException( + "Error retrieving web identity credentials: " . $e->getMessage() + . " (" . $e->getCode() . ")" + ); + } + $this->authenticationAttempts++; + } + + yield $this->client->createCredentials( + $result, + $this->source + ); + }); + } + + /** + * @param string|null $region + * + * @return StsClient + */ + private function createDefaultStsClient( + ?string $region + ): StsClient + { + if (empty($region)) { + $region = CredentialProvider::FALLBACK_REGION; + trigger_error( + 'NOTICE: STS client created without explicit `region` configuration.' . PHP_EOL + . "Defaulting to {$region}. This fallback behavior may be removed." . PHP_EOL + . 'To avoid potential disruptions, configure a region using one of the following methods:' . PHP_EOL + . '(1) Pass `region` in the `$config` array when calling the provider,' . PHP_EOL + . '(2) Set the `AWS_REGION` environment variable.' . PHP_EOL + . 'OR provide an STS client in the `$config` array when creating the provider as `client`.' . PHP_EOL + . 'See: https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/assume-role-with-web-identity-provider.html' + . PHP_EOL, + E_USER_NOTICE + ); + } + + return new StsClient([ + 'credentials' => false, + 'region' => $region + ]); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php b/vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php new file mode 100644 index 0000000..b0c54bc --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php @@ -0,0 +1,1113 @@ + + * use Aws\Credentials\CredentialProvider; + * $provider = CredentialProvider::defaultProvider(); + * // Returns a CredentialsInterface or throws. + * $creds = $provider()->wait(); + * + * + * Credential providers can be composed to create credentials using conditional + * logic that can create different credentials in different environments. You + * can compose multiple providers into a single provider using + * {@see Aws\Credentials\CredentialProvider::chain}. This function accepts + * providers as variadic arguments and returns a new function that will invoke + * each provider until a successful set of credentials is returned. + * + * + * // First try an INI file at this location. + * $a = CredentialProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = CredentialProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = CredentialProvider::env(); + * // Combine the three providers together. + * $composed = CredentialProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with credentials or throws. + * $promise = $composed(); + * // Wait on the credentials to resolve. + * $creds = $promise->wait(); + * + */ +class CredentialProvider +{ + public const ENV_ARN = 'AWS_ROLE_ARN'; + public const ENV_KEY = 'AWS_ACCESS_KEY_ID'; + public const ENV_PROFILE = 'AWS_PROFILE'; + public const ENV_ROLE_SESSION_NAME = 'AWS_ROLE_SESSION_NAME'; + public const ENV_SECRET = 'AWS_SECRET_ACCESS_KEY'; + public const ENV_ACCOUNT_ID = 'AWS_ACCOUNT_ID'; + public const ENV_SESSION = 'AWS_SESSION_TOKEN'; + public const ENV_TOKEN_FILE = 'AWS_WEB_IDENTITY_TOKEN_FILE'; + public const ENV_SHARED_CREDENTIALS_FILE = 'AWS_SHARED_CREDENTIALS_FILE'; + public const ENV_CONFIG_FILE = 'AWS_CONFIG_FILE'; + public const ENV_REGION = 'AWS_REGION'; + public const FALLBACK_REGION = 'us-east-1'; + public const REFRESH_WINDOW = 60; + + /** + * Create a default credential provider that + * first checks for environment variables, + * then checks for assumed role via web identity, + * then checks for cached SSO credentials from the CLI, + * then check for credential_process in the "default" profile in ~/.aws/credentials, + * then checks for the "default" profile in ~/.aws/credentials, + * then for credential_process in the "default profile" profile in ~/.aws/config, + * then checks for "profile default" profile in ~/.aws/config (which is + * the default profile of AWS CLI), + * then tries to make a GET Request to fetch credentials if ECS environment variable is presented, + * finally checks for EC2 instance profile credentials. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided credentials. + * + * @param array $config Optional array of ecs/instance profile credentials + * provider options. + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $cacheable = [ + 'web_identity', + 'sso', + 'login', + 'process_credentials', + 'process_config', + 'ecs', + 'instance' + ]; + + $profileName = getenv(self::ENV_PROFILE) ?: 'default'; + + $defaultChain = [ + 'env' => self::env(), + 'web_identity' => self::assumeRoleWithWebIdentityCredentialProvider($config), + ]; + if (!isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] !== false + ) { + $defaultChain['sso'] = self::sso( + $profileName, + self::getConfigFileName(), + $config + ); + $defaultChain['login'] = self::login($profileName, $config); + $defaultChain['process_credentials'] = self::process(); + $defaultChain['ini'] = self::ini(null, null, $config); + $defaultChain['process_config'] = self::process( + 'profile ' . $profileName, + self::getConfigFileName() + ); + $defaultChain['ini_config'] = self::ini( + 'profile '. $profileName, + self::getConfigFileName() + ); + } + + if (self::shouldUseEcs()) { + $defaultChain['ecs'] = self::ecsCredentials($config); + } else { + $defaultChain['instance'] = self::instanceProfile($config); + } + + if (isset($config['credentials']) + && $config['credentials'] instanceof CacheInterface + ) { + foreach ($cacheable as $provider) { + if (isset($defaultChain[$provider])) { + $defaultChain[$provider] = self::cache( + $defaultChain[$provider], + $config['credentials'], + 'aws_cached_' . $provider . '_credentials' + ); + } + } + } + + return self::memoize( + call_user_func_array( + [CredentialProvider::class, 'chain'], + array_values($defaultChain) + ) + ); + } + + /** + * Create a credential provider function from a set of static credentials. + * + * @param CredentialsInterface $creds + * + * @return callable + */ + public static function fromCredentials(CredentialsInterface $creds) + { + $promise = Promise\Create::promiseFor($creds); + + return function () use ($promise) { + return $promise; + }; + } + + /** + * Creates an aggregate credentials provider that invokes the provided + * variadic providers one after the other until a provider returns + * credentials. + * + * @return callable + */ + public static function chain() + { + $links = func_get_args(); + if (empty($links)) { + throw new \InvalidArgumentException('No providers in chain'); + } + + return function ($previousCreds = null) use ($links) { + /** @var callable $parent */ + $parent = array_shift($links); + $promise = $parent(); + while ($next = array_shift($links)) { + if ($next instanceof InstanceProfileProvider + && $previousCreds instanceof Credentials + ) { + $promise = $promise->otherwise( + function () use ($next, $previousCreds) {return $next($previousCreds);} + ); + } else { + $promise = $promise->otherwise($next); + } + } + return $promise; + }; + } + + /** + * Wraps a credential provider and caches previously provided credentials. + * + * Ensures that cached credentials are refreshed when they expire. + * + * @param callable $provider Credentials provider function to wrap. + * + * @return callable + */ + public static function memoize(callable $provider) + { + return function () use ($provider) { + static $result; + static $isConstant; + + // Constant credentials will be returned constantly. + if ($isConstant) { + return $result; + } + + // Create the initial promise that will be used as the cached value + // until it expires. + if (null === $result) { + $result = $provider(); + } + + // Return credentials that could expire and refresh when needed. + return $result + ->then(function (CredentialsInterface $creds) use ($provider, &$isConstant, &$result) { + // Determine if these are constant credentials. + if (!$creds->getExpiration()) { + $isConstant = true; + return $creds; + } + + // Check if credentials are expired or will expire in 1 minute + $needsRefresh = $creds->getExpiration() - time() <= self::REFRESH_WINDOW; + + // Refresh if expired or expiring soon + if (!$needsRefresh && !$creds->isExpired()) { + return $creds; + } + + // Refresh the result and forward the promise. + return $result = $provider($creds); + }) + ->otherwise(function($reason) use (&$result) { + // Cleanup rejected promise. + $result = null; + return new Promise\RejectedPromise($reason); + }); + }; + } + + /** + * Wraps a credential provider and saves provided credentials in an + * instance of Aws\CacheInterface. Forwards calls when no credentials found + * in cache and updates cache with the results. + * + * @param callable $provider Credentials provider function to wrap + * @param CacheInterface $cache Cache to store credentials + * @param string|null $cacheKey (optional) Cache key to use + * + * @return callable + */ + public static function cache( + callable $provider, + CacheInterface $cache, + $cacheKey = null + ) { + $cacheKey = $cacheKey ?: 'aws_cached_credentials'; + + return function () use ($provider, $cache, $cacheKey) { + $found = $cache->get($cacheKey); + if ($found instanceof CredentialsInterface && !$found->isExpired()) { + return Promise\Create::promiseFor($found); + } + + return $provider() + ->then(function (CredentialsInterface $creds) use ( + $cache, + $cacheKey + ) { + $cache->set( + $cacheKey, + $creds, + null === $creds->getExpiration() ? + 0 : $creds->getExpiration() - time() + ); + + return $creds; + }); + }; + } + + /** + * Provider that creates credentials from environment variables + * AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_SESSION_TOKEN. + * + * @return callable + */ + public static function env() + { + return function () { + // Use credentials from environment variables, if available + $key = getenv(self::ENV_KEY); + $secret = getenv(self::ENV_SECRET); + $accountId = getenv(self::ENV_ACCOUNT_ID) ?: null; + $token = getenv(self::ENV_SESSION) ?: null; + + if ($key && $secret) { + return Promise\Create::promiseFor( + new Credentials( + $key, + $secret, + $token, + null, + $accountId, + CredentialSources::ENVIRONMENT + ) + ); + } + + return self::reject('Could not find environment variable ' + . 'credentials in ' . self::ENV_KEY . '/' . self::ENV_SECRET); + }; + } + + /** + * Credential provider that creates credentials using instance profile + * credentials. + * + * @param array $config Array of configuration data. + * + * @return InstanceProfileProvider + * @see Aws\Credentials\InstanceProfileProvider for $config details. + */ + public static function instanceProfile(array $config = []) + { + return new InstanceProfileProvider($config); + } + + /** + * Credential provider that retrieves cached SSO credentials from the CLI + * + * @return callable + */ + public static function sso( + $ssoProfileName = 'default', + $filename = null, + $config = [] + ) { + $filename = $filename ?? self::getConfigFileName(); + + return function () use ($ssoProfileName, $filename, $config) { + if (!@is_readable($filename)) { + return self::reject("Cannot read credentials from $filename"); + } + $profiles = self::loadProfiles($filename); + + if (isset($profiles[$ssoProfileName])) { + $ssoProfile = $profiles[$ssoProfileName]; + } elseif (isset($profiles['profile ' . $ssoProfileName])) { + $ssoProfileName = 'profile ' . $ssoProfileName; + $ssoProfile = $profiles[$ssoProfileName]; + } else { + return self::reject("Profile {$ssoProfileName} does not exist in {$filename}."); + } + + if (!empty($ssoProfile['sso_session'])) { + return CredentialProvider::getSsoCredentials($profiles, $ssoProfileName, $filename, $config); + } else { + return CredentialProvider::getSsoCredentialsLegacy($profiles, $ssoProfileName, $filename, $config); + } + }; + } + + /** + * Credential provider that creates credentials using + * ecs credentials by a GET request, whose uri is specified + * by environment variable + * + * @param array $config Array of configuration data. + * + * @return EcsCredentialProvider + * @see Aws\Credentials\EcsCredentialProvider for $config details. + */ + public static function ecsCredentials(array $config = []) + { + return new EcsCredentialProvider($config); + } + + /** + * Credential provider that creates credentials using assume role + * + * @param array $config Array of configuration data + * @return callable + * @see Aws\Credentials\AssumeRoleCredentialProvider for $config details. + */ + public static function assumeRole(array $config=[]) + { + return new AssumeRoleCredentialProvider($config); + } + + /** + * Credential provider that creates credentials by assuming role from a + * Web Identity Token + * + * @param array $config Array of configuration data + * @return callable + * @see Aws\Credentials\AssumeRoleWithWebIdentityCredentialProvider for + * $config details. + */ + public static function assumeRoleWithWebIdentityCredentialProvider(array $config = []) + { + return function () use ($config) { + $arnFromEnv = getenv(self::ENV_ARN); + $tokenFromEnv = getenv(self::ENV_TOKEN_FILE); + $stsClient = isset($config['stsClient']) + ? $config['stsClient'] + : null; + $region = isset($config['region']) + ? $config['region'] + : null; + + if ($tokenFromEnv && $arnFromEnv) { + $sessionName = getenv(self::ENV_ROLE_SESSION_NAME) + ? getenv(self::ENV_ROLE_SESSION_NAME) + : null; + $provider = new AssumeRoleWithWebIdentityCredentialProvider([ + 'RoleArn' => $arnFromEnv, + 'WebIdentityTokenFile' => $tokenFromEnv, + 'SessionName' => $sessionName, + 'client' => $stsClient, + 'region' => $region, + 'source' => CredentialSources::ENVIRONMENT_STS_WEB_ID_TOKEN + ]); + + return $provider(); + } + + $profileName = getenv(self::ENV_PROFILE) ?: 'default'; + if (isset($config['filename'])) { + $profiles = self::loadProfiles($config['filename']); + } else { + $profiles = self::loadDefaultProfiles(); + } + + if (isset($profiles[$profileName])) { + $profile = $profiles[$profileName]; + if (isset($profile['region'])) { + $region = $profile['region']; + } + if (isset($profile['web_identity_token_file']) + && isset($profile['role_arn']) + ) { + $sessionName = isset($profile['role_session_name']) + ? $profile['role_session_name'] + : null; + $provider = new AssumeRoleWithWebIdentityCredentialProvider([ + 'RoleArn' => $profile['role_arn'], + 'WebIdentityTokenFile' => $profile['web_identity_token_file'], + 'SessionName' => $sessionName, + 'client' => $stsClient, + 'region' => $region, + 'source' => CredentialSources::PROFILE_STS_WEB_ID_TOKEN + ]); + + return $provider(); + } + } else { + return self::reject("Unknown profile: $profileName"); + } + return self::reject("No RoleArn or WebIdentityTokenFile specified"); + }; + } + + /** + * Credentials provider that creates credentials using an ini file stored + * in the current user's home directory. A source can be provided + * in this file for assuming a role using the credential_source config option. + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile in "~/.aws/credentials". + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the home directory. + * @param array|null $config If provided, may contain the following: + * preferStaticCredentials: If true, prefer static + * credentials to role_arn if both are present + * disableAssumeRole: If true, disable support for + * roles that assume an IAM role. If true and role profile + * is selected, an error is raised. + * stsClient: StsClient used to assume role specified in profile + * + * @return callable + */ + public static function ini($profile = null, $filename = null, array $config = []) + { + $filename = self::getCredentialsFileName($filename); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($profile, $filename, $config) { + $preferStaticCredentials = $config['preferStaticCredentials'] ?? false; + $disableAssumeRole = $config['disableAssumeRole'] ?? false; + $stsClient = $config['stsClient'] ?? null; + + if (!@is_readable($filename)) { + return self::reject("Cannot read credentials from $filename"); + } + $data = self::loadProfiles($filename); + if ($data === false) { + return self::reject("Invalid credentials file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in credentials file"); + } + + /* + In the CLI, the presence of both a role_arn and static credentials have + different meanings depending on how many profiles have been visited. For + the first profile processed, role_arn takes precedence over any static + credentials, but for all subsequent profiles, static credentials are + used if present, and only in their absence will the profile's + source_profile and role_arn keys be used to load another set of + credentials. This bool is intended to yield compatible behaviour in this + sdk. + */ + $preferStaticCredentialsToRoleArn = ($preferStaticCredentials + && isset($data[$profile]['aws_access_key_id']) + && isset($data[$profile]['aws_secret_access_key'])); + + if (isset($data[$profile]['role_arn']) + && !$preferStaticCredentialsToRoleArn + ) { + if ($disableAssumeRole) { + return self::reject( + "Role assumption profiles are disabled. " + . "Failed to load profile " . $profile); + } + return self::loadRoleProfile( + $data, + $profile, + $filename, + $stsClient, + $config + ); + } + + if (!isset($data[$profile]['aws_access_key_id']) + || !isset($data[$profile]['aws_secret_access_key']) + ) { + return self::reject("No credentials present in INI profile " + . "'$profile' ($filename)"); + } + + if (empty($data[$profile]['aws_session_token'])) { + $data[$profile]['aws_session_token'] + = isset($data[$profile]['aws_security_token']) + ? $data[$profile]['aws_security_token'] + : null; + } + + return Promise\Create::promiseFor( + new Credentials( + $data[$profile]['aws_access_key_id'], + $data[$profile]['aws_secret_access_key'], + $data[$profile]['aws_session_token'], + null, + $data[$profile]['aws_account_id'] ?? null, + CredentialSources::PROFILE + ) + ); + }; + } + + /** + * Credentials provider that creates credentials using a process configured in + * ini file stored in the current user's home directory. + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile in "~/.aws/credentials". + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the home directory. + * + * @return callable + */ + public static function process($profile = null, $filename = null) + { + $filename = self::getCredentialsFileName($filename); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($profile, $filename) { + if (!@is_readable($filename)) { + return self::reject("Cannot read process credentials from $filename"); + } + $data = \Aws\parse_ini_file($filename, true, INI_SCANNER_RAW); + if ($data === false) { + return self::reject("Invalid credentials file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in credentials file"); + } + if (!isset($data[$profile]['credential_process'])) { + return self::reject("No credential_process present in INI profile " + . "'$profile' ($filename)"); + } + + $credentialProcess = $data[$profile]['credential_process']; + $json = shell_exec($credentialProcess); + + $processData = json_decode($json, true); + + // Only support version 1 + if (isset($processData['Version'])) { + if ($processData['Version'] !== 1) { + return self::reject("credential_process does not return Version == 1"); + } + } + + if (!isset($processData['AccessKeyId']) + || !isset($processData['SecretAccessKey'])) + { + return self::reject("credential_process does not return valid credentials"); + } + + if (isset($processData['Expiration'])) { + try { + $expiration = new DateTimeResult($processData['Expiration']); + } catch (\Exception $e) { + return self::reject("credential_process returned invalid expiration"); + } + $now = new DateTimeResult(); + if ($expiration < $now) { + return self::reject("credential_process returned expired credentials"); + } + $expires = $expiration->getTimestamp(); + } else { + $expires = null; + } + + if (empty($processData['SessionToken'])) { + $processData['SessionToken'] = null; + } + + $accountId = null; + if (!empty($processData['AccountId'])) { + $accountId = $processData['AccountId']; + } elseif (!empty($data[$profile]['aws_account_id'])) { + $accountId = $data[$profile]['aws_account_id']; + } + + return Promise\Create::promiseFor( + new Credentials( + $processData['AccessKeyId'], + $processData['SecretAccessKey'], + $processData['SessionToken'], + $expires, + $accountId, + CredentialSources::PROFILE_PROCESS + ) + ); + }; + } + + /** + * Login credential provider for AWS local development using console credentials + * + * @param string|null $profileName profile containing your console login session information + * @param array $config region used for refresh requests. + * pass `'region' => ` to configure a region, + * otherwise, provider construction falls back to AWS_REGION, + * then the profile specified for `login` + * + * @return callable + */ + public static function login( + ?string $profileName = null, + array $config = [], + ): callable + { + $resolvedProfile = $profileName ?? getenv(self::ENV_PROFILE) ?: 'default'; + + return static function () use ($resolvedProfile, $config) { + try { + $provider = new LoginCredentialProvider( + $resolvedProfile, + $config['region'] ?? null + ); + } catch (\Exception $e) { + return self::reject( + "Failed to initialize login credential provider for profile '{$resolvedProfile}': " + . $e->getMessage() + ); + } + + return $provider(); + }; + } + + /** + * Assumes role for profile that includes role_arn + * + * @return callable + */ + private static function loadRoleProfile( + $profiles, + $profileName, + $filename, + $stsClient, + $config = [] + ) { + $roleProfile = $profiles[$profileName]; + $roleArn = $roleProfile['role_arn'] ?? ''; + $roleSessionName = $roleProfile['role_session_name'] + ?? 'aws-sdk-php-' . round(microtime(true) * 1000); + + if (empty($roleProfile['source_profile']) + == empty($roleProfile['credential_source']) + ) { + return self::reject("Either source_profile or credential_source must be set " . + "using profile " . $profileName . ", but not both." + ); + } + + $sourceProfileName = ""; + if (!empty($roleProfile['source_profile'])) { + $sourceProfileName = $roleProfile['source_profile']; + if (!isset($profiles[$sourceProfileName])) { + return self::reject("source_profile " . $sourceProfileName + . " using profile " . $profileName . " does not exist" + ); + } + if (isset($config['visited_profiles']) && + in_array($roleProfile['source_profile'], $config['visited_profiles']) + ) { + return self::reject("Circular source_profile reference found."); + } + $config['visited_profiles'] [] = $roleProfile['source_profile']; + } else { + if (empty($roleArn)) { + return self::reject( + "A role_arn must be provided with credential_source in " . + "file {$filename} under profile {$profileName} " + ); + } + } + + if (empty($stsClient)) { + $config['preferStaticCredentials'] = true; + $sourceCredentials = null; + if (!empty($roleProfile['source_profile'])){ + $sourceCredentials = call_user_func( + CredentialProvider::ini($sourceProfileName, $filename, $config) + )->wait(); + } else { + $sourceCredentials = self::getCredentialsFromSource( + $profileName, + $filename + ); + } + + $region = $profiles[$sourceProfileName]['region'] + ?? $config['region'] + ?? getEnv(self::ENV_REGION) + ?: null; + + $stsClient = self::createDefaultStsClient($sourceCredentials, $region); + } + + $result = $stsClient->assumeRole([ + 'RoleArn' => $roleArn, + 'RoleSessionName' => $roleSessionName + ]); + $credentials = $stsClient->createCredentials( + $result, + CredentialSources::STS_ASSUME_ROLE + ); + + return Promise\Create::promiseFor($credentials); + } + + /** + * Gets the environment's HOME directory if available. + * + * @return null|string + */ + public static function getHomeDir() + { + // On Linux/Unix-like systems, use the HOME environment variable + if ($homeDir = getenv('HOME')) { + return $homeDir; + } + + // Get the HOMEDRIVE and HOMEPATH values for Windows hosts + $homeDrive = getenv('HOMEDRIVE'); + $homePath = getenv('HOMEPATH'); + + return ($homeDrive && $homePath) ? $homeDrive . $homePath : null; + } + + /** + * Gets profiles from specified $filename, or default ini files. + */ + public static function loadProfiles($filename) + { + $profileData = \Aws\parse_ini_file($filename, true, INI_SCANNER_RAW); + + // If loading .aws/credentials, also load .aws/config when AWS_SDK_LOAD_NONDEFAULT_CONFIG is set + if ($filename === self::getHomeDir() . '/.aws/credentials' + && getenv('AWS_SDK_LOAD_NONDEFAULT_CONFIG') + ) { + $configFilename = self::getConfigFileName(); + $configProfileData = \Aws\parse_ini_file($configFilename, true, INI_SCANNER_RAW); + foreach ($configProfileData as $name => $profile) { + // standardize config profile names + $name = str_replace('profile ', '', $name); + if (!isset($profileData[$name])) { + $profileData[$name] = $profile; + } + } + } + + return $profileData; + } + + /** + * Gets profiles from ~/.aws/credentials and ~/.aws/config ini files + */ + private static function loadDefaultProfiles() + { + $profiles = []; + $credFile = self::getHomeDir() . '/.aws/credentials'; + $configFile = self::getHomeDir() . '/.aws/config'; + if (file_exists($credFile)) { + $profiles = \Aws\parse_ini_file($credFile, true, INI_SCANNER_RAW); + } + + if (file_exists($configFile)) { + $configProfileData = \Aws\parse_ini_file($configFile, true, INI_SCANNER_RAW); + foreach ($configProfileData as $name => $profile) { + // standardize config profile names + $name = str_replace('profile ', '', $name); + if (!isset($profiles[$name])) { + $profiles[$name] = $profile; + } + } + } + + return $profiles; + } + + public static function getCredentialsFromSource( + $profileName = '', + $filename = '', + $config = [] + ) { + $data = self::loadProfiles($filename); + $credentialSource = !empty($data[$profileName]['credential_source']) + ? $data[$profileName]['credential_source'] + : null; + $credentialsPromise = null; + + switch ($credentialSource) { + case 'Environment': + $credentialsPromise = self::env(); + break; + case 'Ec2InstanceMetadata': + $credentialsPromise = self::instanceProfile($config); + break; + case 'EcsContainer': + $credentialsPromise = self::ecsCredentials($config); + break; + default: + throw new CredentialsException( + "Invalid credential_source found in config file: {$credentialSource}. Valid inputs " + . "include Environment, Ec2InstanceMetadata, and EcsContainer." + ); + } + + $credentialsResult = null; + try { + $credentialsResult = $credentialsPromise()->wait(); + } catch (\Exception $reason) { + return self::reject( + "Unable to successfully retrieve credentials from the source specified in the" + . " credentials file: {$credentialSource}; failure message was: " + . $reason->getMessage() + ); + } + return function () use ($credentialsResult) { + return Promise\Create::promiseFor($credentialsResult); + }; + } + + private static function reject($msg) + { + return new Promise\RejectedPromise(new CredentialsException($msg)); + } + + /** + * Locates shared configuration file by first checking for AWS_CONFIG, + * then falling back to the default location. Returns the path of the + * resolved configuration file. + * + * @return string + */ + public static function getConfigFileName(): string + { + return getenv(self::ENV_CONFIG_FILE) ?: self::getHomeDir() . '/.aws/config'; + } + + /** + * Locates credentials file by first checking for AWS_SHARED_CREDENTIALS_FILE, + * then falling back to the default location. Returns the path of the + * resolved credentials file. + * + * @param $filename + * @return string + */ + public static function getCredentialsFileName($filename): string + { + if (!isset($filename)) { + $filename = getenv(self::ENV_SHARED_CREDENTIALS_FILE) ?: + (self::getHomeDir() . '/.aws/credentials'); + } + + return $filename; + } + + /** + * @return boolean + */ + public static function shouldUseEcs() + { + //Check for relative uri. if not, then full uri. + //fall back to server for each as getenv is not thread-safe. + return !empty(getenv(EcsCredentialProvider::ENV_URI)) + || !empty($_SERVER[EcsCredentialProvider::ENV_URI]) + || !empty(getenv(EcsCredentialProvider::ENV_FULL_URI)) + || !empty($_SERVER[EcsCredentialProvider::ENV_FULL_URI]); + } + + /** + * @param $profiles + * @param $ssoProfileName + * @param $filename + * @param $config + * @return Promise\PromiseInterface + */ + private static function getSsoCredentials($profiles, $ssoProfileName, $filename, $config) + { + if (empty($config['ssoOidcClient'])) { + $ssoProfile = $profiles[$ssoProfileName]; + $sessionName = $ssoProfile['sso_session']; + if (empty($profiles['sso-session ' . $sessionName])) { + return self::reject( + "Could not find sso-session {$sessionName} in {$filename}" + ); + } + $ssoSession = $profiles['sso-session ' . $ssoProfile['sso_session']]; + $ssoOidcClient = new Aws\SSOOIDC\SSOOIDCClient([ + 'region' => $ssoSession['sso_region'], + 'version' => '2019-06-10', + 'credentials' => false + ]); + } else { + $ssoOidcClient = $config['ssoClient']; + } + + $tokenPromise = new Aws\Token\SsoTokenProvider( + $ssoProfileName, + $filename, + $ssoOidcClient + ); + $token = $tokenPromise()->wait(); + $ssoCredentials = CredentialProvider::getCredentialsFromSsoService( + $ssoProfile, + $ssoSession['sso_region'], + $token->getToken(), + $config + ); + + //Expiration value is returned in epoch milliseconds. Conversion to seconds + $expiration = intdiv($ssoCredentials['expiration'], 1000); + return Promise\Create::promiseFor( + new Credentials( + $ssoCredentials['accessKeyId'], + $ssoCredentials['secretAccessKey'], + $ssoCredentials['sessionToken'], + $expiration, + $ssoProfile['sso_account_id'], + CredentialSources::PROFILE_SSO + ) + ); + } + + /** + * @param $profiles + * @param $ssoProfileName + * @param $filename + * @param $config + * @return Promise\PromiseInterface + */ + private static function getSsoCredentialsLegacy($profiles, $ssoProfileName, $filename, $config) + { + $ssoProfile = $profiles[$ssoProfileName]; + if (empty($ssoProfile['sso_start_url']) + || empty($ssoProfile['sso_region']) + || empty($ssoProfile['sso_account_id']) + || empty($ssoProfile['sso_role_name']) + ) { + return self::reject( + "Profile {$ssoProfileName} in {$filename} must contain the following keys: " + . "sso_start_url, sso_region, sso_account_id, and sso_role_name." + ); + } + $tokenLocation = self::getHomeDir() + . '/.aws/sso/cache/' + . sha1($ssoProfile['sso_start_url']) + . ".json"; + + if (!@is_readable($tokenLocation)) { + return self::reject("Unable to read token file at $tokenLocation"); + } + $tokenData = json_decode(file_get_contents($tokenLocation), true); + if (empty($tokenData['accessToken']) || empty($tokenData['expiresAt'])) { + return self::reject( + "Token file at {$tokenLocation} must contain an access token and an expiration" + ); + } + try { + $expiration = (new DateTimeResult($tokenData['expiresAt']))->getTimestamp(); + } catch (\Exception $e) { + return self::reject("Cached SSO credentials returned an invalid expiration"); + } + $now = time(); + if ($expiration < $now) { + return self::reject("Cached SSO credentials returned expired credentials"); + } + $ssoCredentials = CredentialProvider::getCredentialsFromSsoService( + $ssoProfile, + $ssoProfile['sso_region'], + $tokenData['accessToken'], + $config + ); + return Promise\Create::promiseFor( + new Credentials( + $ssoCredentials['accessKeyId'], + $ssoCredentials['secretAccessKey'], + $ssoCredentials['sessionToken'], + $expiration, + $ssoProfile['sso_account_id'], + CredentialSources::PROFILE_SSO_LEGACY + ) + ); + } + /** + * @param array $ssoProfile + * @param string $clientRegion + * @param string $accessToken + * @param array $config + * @return array|null + */ + private static function getCredentialsFromSsoService($ssoProfile, $clientRegion, $accessToken, $config) + { + if (empty($config['ssoClient'])) { + $ssoClient = new Aws\SSO\SSOClient([ + 'region' => $clientRegion, + 'version' => '2019-06-10', + 'credentials' => false + ]); + } else { + $ssoClient = $config['ssoClient']; + } + $ssoResponse = $ssoClient->getRoleCredentials([ + 'accessToken' => $accessToken, + 'accountId' => $ssoProfile['sso_account_id'], + 'roleName' => $ssoProfile['sso_role_name'] + ]); + + $ssoCredentials = $ssoResponse['roleCredentials']; + return $ssoCredentials; + } + + /** + * @param CredentialsInterface $credentials + * @param string|null $region + * + * @return StsClient + */ + private static function createDefaultStsClient( + CredentialsInterface|callable $credentials, + ?string $region + ): StsClient + { + if (empty($region)) { + $region = self::FALLBACK_REGION; + trigger_error( + 'NOTICE: STS client created without explicit `region` configuration.' . PHP_EOL + . "Defaulting to `{$region}`. This fallback behavior may be removed." . PHP_EOL + . 'To avoid potential disruptions, configure a `region` using one of the following methods:' . PHP_EOL + . '(1) Add `region` to your source profile in ~/.aws/credentials,' . PHP_EOL + . '(2) Pass `region` in the `$config` array when calling the provider,' . PHP_EOL + . '(3) Set the `AWS_REGION` environment variable.' . PHP_EOL + . 'See: https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials_assume_role.html#assume-role-with-profile' + . PHP_EOL, + E_USER_NOTICE + ); + } + + return new StsClient([ + 'credentials' => $credentials, + 'region' => $region + ]); + } +} + diff --git a/vendor/aws/aws-sdk-php/src/Credentials/CredentialSources.php b/vendor/aws/aws-sdk-php/src/Credentials/CredentialSources.php new file mode 100644 index 0000000..de8a765 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Credentials/CredentialSources.php @@ -0,0 +1,23 @@ +key = trim((string) $key); + $this->secret = trim((string) $secret); + $this->token = $token; + $this->expires = $expires; + $this->accountId = $accountId; + $this->source = $source ?? CredentialSources::STATIC; + } + + public static function __set_state(array $state) + { + return new self( + $state['key'], + $state['secret'], + $state['token'], + $state['expires'], + $state['accountId'], + $state['source'] ?? null + ); + } + + public function getAccessKeyId() + { + return $this->key; + } + + public function getSecretKey() + { + return $this->secret; + } + + public function getSecurityToken() + { + return $this->token; + } + + public function getExpiration() + { + return $this->expires; + } + + public function isExpired() + { + return $this->expires !== null && time() >= $this->expires; + } + + public function getAccountId() + { + return $this->accountId; + } + + public function getSource() + { + return $this->source; + } + + public function toArray() + { + return [ + 'key' => $this->key, + 'secret' => $this->secret, + 'token' => $this->token, + 'expires' => $this->expires, + 'accountId' => $this->accountId, + 'source' => $this->source + ]; + } + + public function serialize() + { + return json_encode($this->__serialize()); + } + + public function unserialize($serialized) + { + $data = json_decode($serialized, true); + + $this->__unserialize($data); + } + + public function __serialize() + { + return $this->toArray(); + } + + public function __unserialize($data) + { + $this->key = $data['key']; + $this->secret = $data['secret']; + $this->token = $data['token']; + $this->expires = $data['expires']; + $this->accountId = $data['accountId'] ?? null; + $this->source = $data['source'] ?? null; + } + + /** + * Internal-only. Used when IMDS is unreachable + * or returns expires credentials. + * + * @internal + */ + public function extendExpiration() { + $extension = mt_rand(5, 10); + $this->expires = time() + $extension * 60; + + $message = <<= $loopbackStart && $ipLong <= $loopbackEnd); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Credentials/EcsCredentialProvider.php b/vendor/aws/aws-sdk-php/src/Credentials/EcsCredentialProvider.php new file mode 100644 index 0000000..e95b2b0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Credentials/EcsCredentialProvider.php @@ -0,0 +1,262 @@ +timeout = (float) isset($config['timeout']) + ? $config['timeout'] + : (getenv(self::ENV_TIMEOUT) ?: self::DEFAULT_ENV_TIMEOUT); + $this->retries = (int) isset($config['retries']) + ? $config['retries'] + : ((int) getenv(self::ENV_RETRIES) ?: self::DEFAULT_ENV_RETRIES); + + $this->client = $config['client'] ?? \Aws\default_http_handler(); + } + + /** + * Load container credentials. + * + * @return PromiseInterface + * @throws GuzzleException + */ + public function __invoke() + { + $this->attempts = 0; + $uri = $this->getEcsUri(); + if ($this->isCompatibleUri($uri)) { + return Promise\Coroutine::of(function () { + $client = $this->client; + $request = new Request('GET', $this->getEcsUri()); + $headers = $this->getHeadersForAuthToken(); + $credentials = null; + while ($credentials === null) { + $credentials = (yield $client( + $request, + [ + 'timeout' => $this->timeout, + 'proxy' => '', + 'headers' => $headers, + ] + )->then(function (ResponseInterface $response) { + $result = $this->decodeResult((string)$response->getBody()); + if (!isset($result['AccountId']) && isset($result['RoleArn'])) { + try { + $parsedArn = new Arn($result['RoleArn']); + $result['AccountId'] = $parsedArn->getAccountId(); + } catch (\Exception $e) { + // AccountId will be null + } + } + + return new Credentials( + $result['AccessKeyId'], + $result['SecretAccessKey'], + $result['Token'], + strtotime($result['Expiration']), + $result['AccountId'] ?? null, + CredentialSources::ECS + ); + })->otherwise(function ($reason) { + $reason = is_array($reason) ? $reason['exception'] : $reason; + + $isRetryable = $reason instanceof ConnectException; + if ($isRetryable && ($this->attempts < $this->retries)) { + sleep((int)pow(1.2, $this->attempts)); + } else { + $msg = $reason->getMessage(); + throw new CredentialsException( + sprintf('Error retrieving credentials from container metadata after attempt %d/%d (%s)', $this->attempts, $this->retries, $msg) + ); + } + })); + $this->attempts++; + } + + yield $credentials; + }); + } + + throw new CredentialsException("Uri '{$uri}' contains an unsupported host."); + } + + /** + * Returns the number of attempts that have been done. + * + * @return int + */ + public function getAttempts(): int + { + return $this->attempts; + } + + /** + * Retrieves authorization token. + * + * @return array|false|string + */ + private function getEcsAuthToken() + { + if (!empty($path = getenv(self::ENV_AUTH_TOKEN_FILE))) { + $token = @file_get_contents($path); + if (false === $token) { + clearstatcache(true, dirname($path) . DIRECTORY_SEPARATOR . @readlink($path)); + clearstatcache(true, dirname($path) . DIRECTORY_SEPARATOR . dirname(@readlink($path))); + clearstatcache(true, $path); + } + + if (!is_readable($path)) { + throw new CredentialsException("Failed to read authorization token from '{$path}': no such file or directory."); + } + + $token = @file_get_contents($path); + + if (empty($token)) { + throw new CredentialsException("Invalid authorization token read from `$path`. Token file is empty!"); + } + + return $token; + } + + return getenv(self::ENV_AUTH_TOKEN); + } + + /** + * Provides headers for credential metadata request. + * + * @return array|array[]|string[] + */ + private function getHeadersForAuthToken() + { + $authToken = self::getEcsAuthToken(); + $headers = []; + + if (!empty($authToken)) + $headers = ['Authorization' => $authToken]; + + return $headers; + } + + /** @deprecated */ + public function setHeaderForAuthToken() + { + $authToken = self::getEcsAuthToken(); + $headers = []; + if (!empty($authToken)) + $headers = ['Authorization' => $authToken]; + + return $headers; + } + + /** + * Fetch container metadata URI from container environment variable. + * + * @return string Returns container metadata URI + */ + private function getEcsUri() + { + $credsUri = getenv(self::ENV_URI); + + if ($credsUri === false) { + $credsUri = $_SERVER[self::ENV_URI] ?? ''; + } + + if (empty($credsUri)){ + $credFullUri = getenv(self::ENV_FULL_URI); + if ($credFullUri === false){ + $credFullUri = $_SERVER[self::ENV_FULL_URI] ?? ''; + } + + if (!empty($credFullUri)) + return $credFullUri; + } + + return self::SERVER_URI . $credsUri; + } + + private function decodeResult($response) + { + $result = json_decode($response, true); + + if (!isset($result['AccessKeyId'])) { + throw new CredentialsException('Unexpected container metadata credentials value'); + } + return $result; + } + + /** + * Determines whether or not a given request URI is a valid + * container credential request URI. + * + * @param $uri + * + * @return bool + */ + private function isCompatibleUri($uri) + { + $parsed = parse_url($uri); + + if ($parsed['scheme'] !== 'https') { + $host = trim($parsed['host'], '[]'); + $ecsHost = parse_url(self::SERVER_URI)['host']; + $eksHost = self::EKS_SERVER_HOST_IPV4; + + if ($host !== $ecsHost + && $host !== $eksHost + && $host !== self::EKS_SERVER_HOST_IPV6 + && !CredentialsUtils::isLoopBackAddress(gethostbyname($host)) + ) { + return false; + } + } + + return true; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php b/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php new file mode 100644 index 0000000..c17a564 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php @@ -0,0 +1,468 @@ +timeout = (float) getenv(self::ENV_TIMEOUT) ?: ($config['timeout'] ?? self::DEFAULT_TIMEOUT); + $this->profile = $config['profile'] ?? null; + $this->retries = (int) getenv(self::ENV_RETRIES) ?: ($config['retries'] ?? self::DEFAULT_RETRIES); + $this->client = $config['client'] ?? \Aws\default_http_handler(); + $this->ec2MetadataV1Disabled = $config[self::CFG_EC2_METADATA_V1_DISABLED] ?? null; + $this->endpoint = $config[self::CFG_EC2_METADATA_SERVICE_ENDPOINT] ?? null; + if (!empty($this->endpoint) && !$this->isValidEndpoint($this->endpoint)) { + throw new \InvalidArgumentException('The provided URI "' . $this->endpoint . '" is invalid, or contains an unsupported host'); + } + + $this->endpointMode = $config[self::CFG_EC2_METADATA_SERVICE_ENDPOINT_MODE] ?? null; + $this->config = $config; + } + + /** + * Loads instance profile credentials. + * + * @return PromiseInterface + */ + public function __invoke($previousCredentials = null) + { + $this->attempts = 0; + return Promise\Coroutine::of(function () use ($previousCredentials) { + + // Retrieve token or switch out of secure mode + $token = null; + while ($this->secureMode && is_null($token)) { + try { + $token = (yield $this->request( + self::TOKEN_PATH, + 'PUT', + [ + 'x-aws-ec2-metadata-token-ttl-seconds' => self::DEFAULT_TOKEN_TTL_SECONDS + ] + )); + } catch (TransferException $e) { + if ($this->getExceptionStatusCode($e) === 500 + && $previousCredentials instanceof Credentials + ) { + goto generateCredentials; + } elseif ($this->shouldFallbackToIMDSv1() + && (!method_exists($e, 'getResponse') + || empty($e->getResponse()) + || !in_array( + $e->getResponse()->getStatusCode(), + [400, 500, 502, 503, 504] + )) + ) { + $this->secureMode = false; + } else { + $this->handleRetryableException( + $e, + [], + $this->createErrorMessage( + 'Error retrieving metadata token' + ) + ); + } + } + $this->attempts++; + } + + // Set token header only for secure mode + $headers = []; + if ($this->secureMode) { + $headers = [ + 'x-aws-ec2-metadata-token' => $token + ]; + } + + // Retrieve profile + while (!$this->profile) { + try { + $this->profile = (yield $this->request( + self::CRED_PATH, + 'GET', + $headers + )); + } catch (TransferException $e) { + // 401 indicates insecure flow not supported, switch to + // attempting secure mode for subsequent calls + if (!empty($this->getExceptionStatusCode($e)) + && $this->getExceptionStatusCode($e) === 401 + ) { + $this->secureMode = true; + } + $this->handleRetryableException( + $e, + [ 'blacklist' => [401, 403] ], + $this->createErrorMessage($e->getMessage()) + ); + } + + $this->attempts++; + } + + // Retrieve credentials + $result = null; + while ($result == null) { + try { + $json = (yield $this->request( + self::CRED_PATH . $this->profile, + 'GET', + $headers + )); + $result = $this->decodeResult($json); + } catch (InvalidJsonException $e) { + $this->handleRetryableException( + $e, + [ 'blacklist' => [401, 403] ], + $this->createErrorMessage( + 'Invalid JSON response, retries exhausted' + ) + ); + } catch (TransferException $e) { + // 401 indicates insecure flow not supported, switch to + // attempting secure mode for subsequent calls + if (($this->getExceptionStatusCode($e) === 500 + || strpos($e->getMessage(), "cURL error 28") !== false) + && $previousCredentials instanceof Credentials + ) { + goto generateCredentials; + } elseif (!empty($this->getExceptionStatusCode($e)) + && $this->getExceptionStatusCode($e) === 401 + ) { + $this->secureMode = true; + } + $this->handleRetryableException( + $e, + [ 'blacklist' => [401, 403] ], + $this->createErrorMessage($e->getMessage()) + ); + } + $this->attempts++; + } + generateCredentials: + + if (!isset($result)) { + $credentials = $previousCredentials; + } else { + $credentials = new Credentials( + $result['AccessKeyId'], + $result['SecretAccessKey'], + $result['Token'], + strtotime($result['Expiration']), + $result['AccountId'] ?? null, + CredentialSources::IMDS + ); + } + + if ($credentials->isExpired()) { + $credentials->extendExpiration(); + } + + yield $credentials; + }); + } + + /** + * @param string $url + * @param string $method + * @param array $headers + * @return PromiseInterface Returns a promise that is fulfilled with the + * body of the response as a string. + */ + private function request($url, $method = 'GET', $headers = []) + { + $disabled = getenv(self::ENV_DISABLE) ?: false; + if (strcasecmp($disabled, 'true') === 0) { + throw new CredentialsException( + $this->createErrorMessage('EC2 metadata service access disabled') + ); + } + + $fn = $this->client; + $request = new Request($method, $this->resolveEndpoint() . $url); + $userAgent = 'aws-sdk-php/' . Sdk::VERSION; + if (defined('HHVM_VERSION')) { + $userAgent .= ' HHVM/' . HHVM_VERSION; + } + $userAgent .= ' ' . \Aws\default_user_agent(); + $request = $request->withHeader('User-Agent', $userAgent); + foreach ($headers as $key => $value) { + $request = $request->withHeader($key, $value); + } + + return $fn($request, ['timeout' => $this->timeout]) + ->then(function (ResponseInterface $response) { + return (string) $response->getBody(); + })->otherwise(function (array $reason) { + $reason = $reason['exception']; + if ($reason instanceof TransferException) { + throw $reason; + } + $msg = $reason->getMessage(); + throw new CredentialsException( + $this->createErrorMessage($msg) + ); + }); + } + + private function handleRetryableException( + \Exception $e, + $retryOptions, + $message + ) { + $isRetryable = true; + if (!empty($status = $this->getExceptionStatusCode($e)) + && isset($retryOptions['blacklist']) + && in_array($status, $retryOptions['blacklist']) + ) { + $isRetryable = false; + } + if ($isRetryable && $this->attempts < $this->retries) { + sleep((int) pow(1.2, $this->attempts)); + } else { + throw new CredentialsException($message); + } + } + + private function getExceptionStatusCode(\Exception $e) + { + if (method_exists($e, 'getResponse') + && !empty($e->getResponse()) + ) { + return $e->getResponse()->getStatusCode(); + } + return null; + } + + private function createErrorMessage($previous) + { + return "Error retrieving credentials from the instance profile " + . "metadata service. ({$previous})"; + } + + private function decodeResult($response) + { + $result = json_decode($response, true); + + if (json_last_error() > 0) { + throw new InvalidJsonException(); + } + + if ($result['Code'] !== 'Success') { + throw new CredentialsException('Unexpected instance profile ' + . 'response code: ' . $result['Code']); + } + + return $result; + } + + /** + * This functions checks for whether we should fall back to IMDSv1 or not. + * If $ec2MetadataV1Disabled is null then we will try to resolve this value from + * the following sources: + * - From environment: "AWS_EC2_METADATA_V1_DISABLED". + * - From config file: aws_ec2_metadata_v1_disabled + * - Defaulted to false + * + * @return bool + */ + private function shouldFallbackToIMDSv1(): bool + { + $isImdsV1Disabled = \Aws\boolean_value($this->ec2MetadataV1Disabled) + ?? \Aws\boolean_value( + ConfigurationResolver::resolve( + self::CFG_EC2_METADATA_V1_DISABLED, + self::DEFAULT_AWS_EC2_METADATA_V1_DISABLED, + 'bool', + $this->config + ) + ) + ?? self::DEFAULT_AWS_EC2_METADATA_V1_DISABLED; + + return !$isImdsV1Disabled; + } + + /** + * Resolves the metadata service endpoint. If the endpoint is not provided + * or configured then, the default endpoint, based on the endpoint mode resolved, + * will be used. + * Example: if endpoint_mode is resolved to be IPv4 and the endpoint is not provided + * then, the endpoint to be used will be http://169.254.169.254. + * + * @return string + */ + private function resolveEndpoint(): string + { + $endpoint = $this->endpoint; + if (is_null($endpoint)) { + $endpoint = ConfigurationResolver::resolve( + self::CFG_EC2_METADATA_SERVICE_ENDPOINT, + $this->getDefaultEndpoint(), + 'string', + $this->config + ); + } + + if (!$this->isValidEndpoint($endpoint)) { + throw new CredentialsException('The provided URI "' . $endpoint . '" is invalid, or contains an unsupported host'); + } + + if (substr($endpoint, strlen($endpoint) - 1) !== '/') { + $endpoint = $endpoint . '/'; + } + + return $endpoint . 'latest/'; + } + + /** + * Resolves the default metadata service endpoint. + * If endpoint_mode is resolved as IPv4 then: + * - endpoint = http://169.254.169.254 + * If endpoint_mode is resolved as IPv6 then: + * - endpoint = http://[fd00:ec2::254] + * + * @return string + */ + private function getDefaultEndpoint(): string + { + $endpointMode = $this->resolveEndpointMode(); + switch ($endpointMode) { + case self::ENDPOINT_MODE_IPv4: + return self::DEFAULT_METADATA_SERVICE_IPv4_ENDPOINT; + case self::ENDPOINT_MODE_IPv6: + return self::DEFAULT_METADATA_SERVICE_IPv6_ENDPOINT; + } + + throw new CredentialsException("Invalid endpoint mode '$endpointMode' resolved"); + } + + /** + * Resolves the endpoint mode to be considered when resolving the default + * metadata service endpoint. + * + * @return string + */ + private function resolveEndpointMode(): string + { + $endpointMode = $this->endpointMode; + if (is_null($endpointMode)) { + $endpointMode = ConfigurationResolver::resolve( + self::CFG_EC2_METADATA_SERVICE_ENDPOINT_MODE, + self::ENDPOINT_MODE_IPv4, + 'string', + $this->config + ); + } + + return $endpointMode; + } + + /** + * This method checks for whether a provide URI is valid. + * @param string $uri this parameter is the uri to do the validation against to. + * + * @return string|null + */ + private function isValidEndpoint( + $uri + ): bool + { + // We make sure first the provided uri is a valid URL + $isValidURL = filter_var($uri, FILTER_VALIDATE_URL) !== false; + if (!$isValidURL) { + return false; + } + + // We make sure that if is a no secure host then it must be a loop back address. + $parsedUri = parse_url($uri); + if ($parsedUri['scheme'] !== 'https') { + $host = trim($parsedUri['host'], '[]'); + + return CredentialsUtils::isLoopBackAddress(gethostbyname($host)) + || in_array( + $uri, + [self::DEFAULT_METADATA_SERVICE_IPv4_ENDPOINT, self::DEFAULT_METADATA_SERVICE_IPv6_ENDPOINT] + ); + } + + return true; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Credentials/LoginCredentialProvider.php b/vendor/aws/aws-sdk-php/src/Credentials/LoginCredentialProvider.php new file mode 100644 index 0000000..21c188d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Credentials/LoginCredentialProvider.php @@ -0,0 +1,527 @@ +profileName = $profileName; + $this->client = $this->createSigninClient($profileName, $region); + $this->tokenLocation = $this->resolveTokenLocation($profileName); + } + + /** + * Returns a promise that resolves to AWS credentials + * + * This method loads the cached token, refreshes it if necessary, + * and returns AWS credentials sourced from the access token. + * + * @return Promise\PromiseInterface A promise that resolves to a Credentials object + * @throws CredentialsException If re-authentication is required or credentials cannot be loaded + * @throws SigninException If the token refresh fails with a SigninException + */ + public function __invoke(): Promise\PromiseInterface + { + return Promise\Coroutine::of(function () { + $this->token ??= $this->loadToken(); + $credentials = $this->token[self::KEY_ACCESS_TOKEN]; + + if ($this->shouldRefresh($credentials)) { + try { + $credentials = yield from $this->refresh($credentials); + } catch (CredentialsException $e) { + // For specific re-authentication errors, re-throw + throw $e; + } catch (SigninException $e) { + // For SigninException not handled by refresh(), re-throw + throw new CredentialsException( + 'Unable to refresh login credentials: ' . $e->getAwsErrorMessage(), + $e->getCode(), + $e + ); + } catch (\Exception $e) { + // For other refresh failures, log and continue with existing token + trigger_error( + 'Continuing with existing token after refresh failure: ' . $e->getMessage(), + E_USER_NOTICE + ); + } + } + + yield $credentials; + }); + } + + /** + * Refreshes the access token using the refresh token and returns new credentials, + * or, if refreshed from another source, returns the externally refreshed credentials. + * + * @param Credentials $currentCredentials The current credentials to refresh + * + * @return \Generator Generator that yields and returns refreshed credentials + * @throws CredentialsException If re-authentication is required due to expired or changed credentials + * @throws SigninException If the token refresh fails with a SigninException + * @throws \Exception For unexpected errors during refresh + */ + private function refresh(Credentials $currentCredentials): \Generator + { + // Check for external refresh + if ($refreshedToken = $this->getExternalRefresh($currentCredentials)) { + $this->token = $refreshedToken; + + return $refreshedToken[self::KEY_ACCESS_TOKEN]; + } + + try { + $refreshed = (yield $this->client->createOAuth2TokenAsync([ + self::REQUEST_KEY_TOKEN_INPUT => [ + self::REQUEST_KEY_CLIENT_ID => $this->token[self::REQUEST_KEY_CLIENT_ID], + self::REQUEST_KEY_GRANT_TYPE => self::GRANT_TYPE, + self::REQUEST_KEY_REFRESH_TOKEN => $this->token[self::REQUEST_KEY_REFRESH_TOKEN] + ], + self::KEY_DPOP_KEY => $this->token[self::KEY_DPOP_KEY] + ]))->get(self::RESULT_TOKEN_OUTPUT); + + $newCredentials = self::createCredentials( + $refreshed[self::KEY_ACCESS_TOKEN], + time() + $refreshed[self::RESULT_EXPIRES_IN], + $currentCredentials->getAccountId() + ); + + $this->token[self::KEY_ACCESS_TOKEN] = $newCredentials; + $this->token[self::REQUEST_KEY_REFRESH_TOKEN] = $refreshed[self::REQUEST_KEY_REFRESH_TOKEN]; + } catch (\Exception $e) { + throw $this->handleRefreshException($e); + } + + try { + $this->writeToCache(); + } catch (\JsonException|\RuntimeException $e) { + trigger_error( + 'Failed to update credential cache during refresh: ' . $e->getMessage() + . '. Using refreshed credentials in memory.', + E_USER_NOTICE + ); + } + + return $newCredentials; + } + + /** + * Gets externally refreshed token if token has been refreshed from another source. + * If the new token does not need refreshing, returns it. + * + * @param Credentials $currentCredentials Current credentials to compare against + * @return array|null Returns the updated token array if externally refreshed, null otherwise + */ + private function getExternalRefresh(Credentials $currentCredentials): ?array + { + try { + $latestToken = $this->loadToken(); + $latestCredentials = $latestToken[self::KEY_ACCESS_TOKEN]; + + // Refresh token must be different + if ($latestToken[self::REQUEST_KEY_REFRESH_TOKEN] + === $this->token[self::REQUEST_KEY_REFRESH_TOKEN] + ) { + return null; + } + + // Expiration must be newer + if ($latestCredentials->getExpiration() + <= $currentCredentials->getExpiration() + ) { + return null; + } + + // New token should not need refresh itself + if ($this->shouldRefresh($latestCredentials)) { + return null; + } + + return $latestToken; + } catch (\Exception $e) { + return null; + } + } + + /** + * Writes the updated access token and refresh token to the cache file + * + * @throws \JsonException|\RuntimeException + */ + private function writeToCache(): void + { + $credentials = $this->token[self::KEY_ACCESS_TOKEN]; + $updates = [ + self::KEY_ACCESS_TOKEN => [ + self::KEY_ACCESS_KEY_ID => $credentials->getAccessKeyId(), + self::KEY_SECRET_ACCESS_KEY => $credentials->getSecretKey(), + self::KEY_SESSION_TOKEN => $credentials->getSecurityToken(), + self::KEY_ACCOUNT_ID => $credentials->getAccountId(), + self::KEY_EXPIRES_AT => gmdate('Y-m-d\TH:i:s\Z', $credentials->getExpiration()) + ], + self::REQUEST_KEY_REFRESH_TOKEN => $this->token[self::REQUEST_KEY_REFRESH_TOKEN] + ]; + + $existing = json_decode( + file_get_contents($this->tokenLocation), true, 512, JSON_THROW_ON_ERROR + ); + $merged = array_merge($existing, $updates); + + $result = file_put_contents( + $this->tokenLocation, + json_encode($merged, JSON_THROW_ON_ERROR), + LOCK_EX + ); + + if (!$result) { + throw new \RuntimeException('Failed to write cache file'); + } + } + + /** + * Loads and validates the token from the cache file + * + * @return array The loaded token data with Credentials object, DPoP key, and other fields + * @throws CredentialsException If the cache file is invalid, missing required keys, + * or DPoP key cannot be loaded + */ + private function loadToken(): array + { + try { + $cached = json_decode( + file_get_contents($this->tokenLocation), + true, 512, JSON_THROW_ON_ERROR + ); + } catch (\JsonException $e) { + throw new CredentialsException( + 'Invalid JSON in cache file: ' . $e->getMessage(), + 0, + $e + ); + } + + if (self::hasAllRequiredKeys($cached, self::REQUIRED_CACHE_KEYS) + && self::hasAllRequiredKeys( + $cached[self::KEY_ACCESS_TOKEN] ?? [], + self::REQUIRED_ACCESS_TOKEN_KEYS + ) + ) { + // Convert expiresAt to Unix timestamp + $expiresAt = strtotime($cached[self::KEY_ACCESS_TOKEN][self::KEY_EXPIRES_AT]); + if ($expiresAt === false) { + throw new CredentialsException( + 'Invalid expiration date format in cached token `' + . self::KEY_EXPIRES_AT . '` field.' . self::REAUTHENTICATE_MSG + ); + } + + $cached[self::KEY_ACCESS_TOKEN] = self::createCredentials( + $cached[self::KEY_ACCESS_TOKEN], + $expiresAt, + $cached[self::KEY_ACCESS_TOKEN][self::KEY_ACCOUNT_ID] + ); + + // Load DPoP key + $cached[self::KEY_DPOP_KEY] = openssl_pkey_get_private($cached[self::KEY_DPOP_KEY]); + if ($cached[self::KEY_DPOP_KEY] === false) { + $error = openssl_error_string(); + throw new CredentialsException( + 'Failed to load DPoP private key from cached token for profile ' + . "{$this->profileName}: " . ($error ? ": {$error}" : '.') + . self::REAUTHENTICATE_MSG + ); + } + + return $cached; + } + + throw new CredentialsException( + 'Missing required keys in cached token for profile ' + . $this->profileName . '.' . self::REAUTHENTICATE_MSG + ); + } + + /** + * @param Credentials $credentials The credentials to check for expiration + * + * @return bool True if the token expires within the refresh threshold + */ + private function shouldRefresh(Credentials $credentials): bool + { + return ($credentials->getExpiration() - time()) <= self::DEFAULT_REFRESH_THRESHOLD; + } + + /** + * Handles exceptions thrown during token refresh + * + * @param \Exception $e The exception thrown during refresh + * + * @return \Exception The exception to be thrown (either transformed or original) + */ + private function handleRefreshException(\Exception $e): \Exception + { + if ($e instanceof SigninException) { + trigger_error( + 'Failed to refresh login credentials: ' . $e->getAwsErrorMessage(), + E_USER_NOTICE + ); + + if ($e->getAwsErrorCode() === 'AccessDeniedException') { + $error = strtolower($e->get('error')); + switch ($error) { + case 'token_expired': + return new CredentialsException( + 'Your session has expired.' . self::REAUTHENTICATE_MSG, + 0, + $e + ); + case 'user_credentials_changed': + return new CredentialsException( + 'Unable to refresh credentials because of a change in your password. ' + . 'Please reauthenticate with your new password.', + 0, + $e + ); + case 'insufficient_permissions': + return new CredentialsException( + 'Unable to refresh credentials due to insufficient permissions. ' + . 'You may be missing permission for the `CreateOAuth2Token` action.', + 0, + $e + ); + } + } + + return $e; + } + + // For all other exceptions + trigger_error( + 'Unexpected error refreshing login credentials: ' . $e->getMessage(), + E_USER_NOTICE + ); + + return $e; + } + + /** + * Resolves the cache file location for the given profile + * + * @param string $profileName The profile name to resolve the token location for + * + * @return string The full path to the cache file + * @throws CredentialsException If the profile doesn't exist, lacks login_session, + * or cache file is not readable + */ + private function resolveTokenLocation(string $profileName): string + { + $configFile = CredentialProvider::getConfigFileName(); + if (!is_readable($configFile)) { + throw new CredentialsException( + 'Unable to load configuration file at ' . $configFile + . '. Please ensure the file exists at the specified location.' + ); + } + + // Ensure profile and session are set + $profiles = CredentialProvider::loadProfiles($configFile); + if ($profileName === self::PROFILE_DEFAULT) { + $profileData = $profiles[self::PROFILE_DEFAULT] ?? null; + } elseif (str_starts_with($profileName, self::PROFILE_SECONDARY)) { + $profileData = $profiles[$profileName] ?? null; + } else { + // Try without prefix first, then with prefix + $profileData = $profiles[$profileName] + ?? $profiles[self::PROFILE_SECONDARY . $profileName] + ?? null; + } + + if (!$profileData) { + throw new CredentialsException( + "Profile '{$profileName}' does not exist. " + . "Please ensure the specified profile is set at {$configFile}." + ); + } + + if (empty($session = $profileData[self::KEY_PROFILE_LOGIN_SESSION] ?? null)) { + throw new CredentialsException( + "Profile '{$profileName}' did not contain a " + . self::KEY_PROFILE_LOGIN_SESSION . " value. " + . 're-authentication using `aws login` may be needed.' + ); + } + + // Resolve location and ensure it exists + $cacheDirectory = getenv(self::ENV_CACHE_DIRECTORY) + ?: CredentialProvider::getHomeDir() . self::DEFAULT_CACHE_DIRECTORY; + $cacheFile = $cacheDirectory . DIRECTORY_SEPARATOR . hash('sha256', trim($session)) . '.json'; + if (!@is_readable($cacheFile)) { + throw new CredentialsException( + "Failed to load cached credentials for profile " + . "'{$profileName}'." . self::REAUTHENTICATE_MSG + ); + } + + return $cacheFile; + } + + /** + * Creates a SigninClient configured for DPoP authentication + * + * @param string $profile + * @param string|null $region The AWS region for the Signin service + * + * @return SigninClient A configured SigninClient instance with DPoP signature version + */ + private function createSigninClient(string $profile, ?string $region): SigninClient + { + $resolvedRegion = $region + ?? ConfigurationResolver::env(self::KEY_CLIENT_REGION) + ?? ConfigurationResolver::ini(self::KEY_CLIENT_REGION, 'string', $profile) + ?? ConfigurationResolver::ini( + self::KEY_CLIENT_REGION, + 'string', + self::PROFILE_SECONDARY . $profile + ); + + if (empty($resolvedRegion)) { + throw new CredentialsException( + 'Unable to determine region for the Sign-In service client ' + . ' used for refreshing Login credentials. You can provide a region in-code ' + . 'when constructing the provider, by setting the AWS_REGION environment variable' + . ', or by setting a `region` in your specified profile.' + ); + } + + return new SigninClient([ + self::KEY_CLIENT_REGION => $resolvedRegion, + self::KEY_CLIENT_SIGNATURE_VERSION => self::CLIENT_SIGNATURE_DPOP, + self::KEY_CLIENT_CREDENTIALS => false + ]); + } + + /** + * Creates a Credentials object from token data + * + * @param array $tokenData The token data containing access key, secret, and session token + * @param int $expiration Unix timestamp for credential expiration + * @param string $accountId The AWS account ID + * + * @return Credentials The created Credentials object + */ + private static function createCredentials( + array $tokenData, + int $expiration, + string $accountId + ): Credentials + { + return new Credentials( + $tokenData[self::KEY_ACCESS_KEY_ID], + $tokenData[self::KEY_SECRET_ACCESS_KEY], + $tokenData[self::KEY_SESSION_TOKEN], + $expiration, + $accountId, + CredentialSources::PROFILE_LOGIN + ); + } + + /** + * Checks if all required keys are present and non-empty in the data array + * + * @param array $data The data array to check + * @param array $requiredKeys The list of keys that must be present and non-empty + * + * @return bool True if all required keys are present and non-empty, false otherwise + */ + private static function hasAllRequiredKeys( + array $data, + array $requiredKeys + ): bool + { + foreach ($requiredKeys as $key) { + if (empty($data[$key])) { + return false; + } + } + + return true; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/AbstractCryptoClient.php b/vendor/aws/aws-sdk-php/src/Crypto/AbstractCryptoClient.php new file mode 100644 index 0000000..823467b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/AbstractCryptoClient.php @@ -0,0 +1,121 @@ +stream = $cipherText; + $this->key = $key; + $this->cipherMethod = clone $cipherMethod; + } + + public function getOpenSslName() + { + return $this->cipherMethod->getOpenSslName(); + } + + public function getAesName() + { + return $this->cipherMethod->getAesName(); + } + + public function getCurrentIv() + { + return $this->cipherMethod->getCurrentIv(); + } + + public function getSize(): ?int + { + $plainTextSize = $this->stream->getSize(); + + if ($this->cipherMethod->requiresPadding()) { + // PKCS7 padding requires that between 1 and self::BLOCK_SIZE be + // added to the plaintext to make it an even number of blocks. The + // plaintext is between strlen($cipherText) - self::BLOCK_SIZE and + // strlen($cipherText) - 1 + return null; + } + + return $plainTextSize; + } + + public function isWritable(): bool + { + return false; + } + + public function read($length): string + { + if ($length > strlen($this->buffer)) { + $this->buffer .= $this->decryptBlock( + (int) ( + self::BLOCK_SIZE * ceil(($length - strlen($this->buffer)) / self::BLOCK_SIZE) + ) + ); + } + + $data = substr($this->buffer, 0, $length); + $this->buffer = substr($this->buffer, $length); + + return $data ? $data : ''; + } + + public function seek($offset, $whence = SEEK_SET): void + { + if ($offset === 0 && $whence === SEEK_SET) { + $this->buffer = ''; + $this->cipherMethod->seek(0, SEEK_SET); + $this->stream->seek(0, SEEK_SET); + } else { + throw new LogicException('AES encryption streams only support being' + . ' rewound, not arbitrary seeking.'); + } + } + + private function decryptBlock($length) + { + if ($this->stream->eof()) { + return ''; + } + + $cipherText = ''; + do { + $cipherText .= $this->stream->read((int) ($length - strlen($cipherText))); + } while (strlen($cipherText) < $length && !$this->stream->eof()); + + $options = OPENSSL_RAW_DATA; + if (!$this->stream->eof() + && $this->stream->getSize() !== $this->stream->tell() + ) { + $options |= OPENSSL_ZERO_PADDING; + } + + $plaintext = openssl_decrypt( + $cipherText, + $this->cipherMethod->getOpenSslName(), + $this->key, + $options, + $this->cipherMethod->getCurrentIv() + ); + + $this->cipherMethod->update($cipherText); + + return $plaintext; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/AesEncryptingStream.php b/vendor/aws/aws-sdk-php/src/Crypto/AesEncryptingStream.php new file mode 100644 index 0000000..2cb5ab6 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/AesEncryptingStream.php @@ -0,0 +1,151 @@ +stream = $plainText; + $this->key = $key; + $this->cipherMethod = clone $cipherMethod; + } + + public function getOpenSslName() + { + return $this->cipherMethod->getOpenSslName(); + } + + public function getAesName() + { + return $this->cipherMethod->getAesName(); + } + + public function getCurrentIv() + { + return $this->cipherMethod->getCurrentIv(); + } + + public function getSize(): ?int + { + $plainTextSize = $this->stream->getSize(); + + if ($this->cipherMethod->requiresPadding() && $plainTextSize !== null) { + // PKCS7 padding requires that between 1 and self::BLOCK_SIZE be + // added to the plaintext to make it an even number of blocks. + $padding = self::BLOCK_SIZE - $plainTextSize % self::BLOCK_SIZE; + return $plainTextSize + $padding; + } + + return $plainTextSize; + } + + public function isWritable(): bool + { + return false; + } + + public function read($length): string + { + if ($length > strlen($this->buffer)) { + $this->buffer .= $this->encryptBlock( + (int) + self::BLOCK_SIZE * ceil(($length - strlen($this->buffer)) / self::BLOCK_SIZE) + ); + } + + $data = substr($this->buffer, 0, $length); + $this->buffer = substr($this->buffer, $length); + + return $data ? $data : ''; + } + + public function seek($offset, $whence = SEEK_SET): void + { + if ($whence === SEEK_CUR) { + $offset = $this->tell() + $offset; + $whence = SEEK_SET; + } + + if ($whence === SEEK_SET) { + $this->buffer = ''; + $wholeBlockOffset + = (int) ($offset / self::BLOCK_SIZE) * self::BLOCK_SIZE; + $this->stream->seek($wholeBlockOffset); + $this->cipherMethod->seek($wholeBlockOffset); + $this->read($offset - $wholeBlockOffset); + } else { + throw new LogicException('Unrecognized whence.'); + } + } + + private function encryptBlock($length) + { + if ($this->stream->eof()) { + return ''; + } + + $plainText = ''; + do { + $plainText .= $this->stream->read((int) ($length - strlen($plainText))); + } while (strlen($plainText) < $length && !$this->stream->eof()); + + $options = OPENSSL_RAW_DATA; + if (!$this->stream->eof() + || $this->stream->getSize() !== $this->stream->tell() + ) { + $options |= OPENSSL_ZERO_PADDING; + } + + $cipherText = openssl_encrypt( + $plainText, + $this->cipherMethod->getOpenSslName(), + $this->key, + $options, + $this->cipherMethod->getCurrentIv() + ); + + $this->cipherMethod->update($cipherText); + + return $cipherText; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/AesGcmDecryptingStream.php b/vendor/aws/aws-sdk-php/src/Crypto/AesGcmDecryptingStream.php new file mode 100644 index 0000000..d3a5d11 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/AesGcmDecryptingStream.php @@ -0,0 +1,104 @@ +cipherText = $cipherText; + $this->key = $key; + $this->initializationVector = $initializationVector; + $this->tag = $tag; + $this->aad = $aad; + $this->tagLength = $tagLength; + $this->keySize = $keySize; + // unsetting the property forces the first access to go through + // __get(). + unset($this->stream); + } + + public function getOpenSslName() + { + return "aes-{$this->keySize}-gcm"; + } + + public function getAesName() + { + return 'AES/GCM/NoPadding'; + } + + public function getCurrentIv() + { + return $this->initializationVector; + } + + public function createStream() + { + + $result = \openssl_decrypt( + (string)$this->cipherText, + $this->getOpenSslName(), + $this->key, + OPENSSL_RAW_DATA, + $this->initializationVector, + $this->tag, + $this->aad + ); + if ($result === false) { + throw new CryptoException('The requested object could not be ' + . 'decrypted due to an invalid authentication tag.'); + } + return Psr7\Utils::streamFor($result); + + } + + public function isWritable(): bool + { + return false; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/AesGcmEncryptingStream.php b/vendor/aws/aws-sdk-php/src/Crypto/AesGcmEncryptingStream.php new file mode 100644 index 0000000..ab2e5fa --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/AesGcmEncryptingStream.php @@ -0,0 +1,119 @@ +plaintext = $plaintext; + $this->key = $key; + $this->initializationVector = $initializationVector; + $this->aad = $aad; + $this->tagLength = $tagLength; + $this->keySize = $keySize; + // unsetting the property forces the first access to go through + // __get(). + unset($this->stream); + } + + public function getOpenSslName() + { + return "aes-{$this->keySize}-gcm"; + } + + /** + * Same as static method and retained for backwards compatibility + * + * @return string + */ + public function getAesName() + { + return self::getStaticAesName(); + } + + public function getCurrentIv() + { + return $this->initializationVector; + } + + public function createStream() + { + return Psr7\Utils::streamFor(\openssl_encrypt( + (string)$this->plaintext, + $this->getOpenSslName(), + $this->key, + OPENSSL_RAW_DATA, + $this->initializationVector, + $this->tag, + $this->aad, + $this->tagLength + )); + } + + /** + * @return string + */ + public function getTag() + { + return $this->tag; + } + + public function isWritable(): bool + { + return false; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/AesStreamInterface.php b/vendor/aws/aws-sdk-php/src/Crypto/AesStreamInterface.php new file mode 100644 index 0000000..ce7b85d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/AesStreamInterface.php @@ -0,0 +1,30 @@ +baseIv = $this->iv = $iv; + $this->keySize = $keySize; + + if (strlen($iv) !== openssl_cipher_iv_length($this->getOpenSslName())) { + throw new InvalidArgumentException('Invalid initialization vector'); + } + } + + public function getOpenSslName() + { + return "aes-{$this->keySize}-cbc"; + } + + public function getAesName() + { + return 'AES/CBC/PKCS5Padding'; + } + + public function getCurrentIv() + { + return $this->iv; + } + + public function requiresPadding() + { + return true; + } + + public function seek($offset, $whence = SEEK_SET) + { + if ($offset === 0 && $whence === SEEK_SET) { + $this->iv = $this->baseIv; + } else { + throw new LogicException('CBC initialization only support being' + . ' rewound, not arbitrary seeking.'); + } + } + + public function update($cipherTextBlock) + { + $this->iv = substr($cipherTextBlock, self::BLOCK_SIZE * -1); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/Cipher/CipherBuilderTrait.php b/vendor/aws/aws-sdk-php/src/Crypto/Cipher/CipherBuilderTrait.php new file mode 100644 index 0000000..ed9feb9 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/Cipher/CipherBuilderTrait.php @@ -0,0 +1,72 @@ +decryptCek( + base64_decode( + $envelope[MetadataEnvelope::CONTENT_KEY_V2_HEADER] + ), + json_decode( + $envelope[MetadataEnvelope::MATERIALS_DESCRIPTION_HEADER], + true + ) + ); + $cipherOptions['KeySize'] = strlen($cek) * 8; + $cipherOptions['Cipher'] = $this->getCipherFromAesName( + $envelope[MetadataEnvelope::CONTENT_CRYPTO_SCHEME_HEADER] + ); + + $decryptionStream = $this->getDecryptingStream( + $cipherText, + $cek, + $cipherOptions + ); + unset($cek); + + return $decryptionStream; + } + + private function getTagFromCiphertextStream( + StreamInterface $cipherText, + $tagLength + ) { + $cipherTextSize = $cipherText->getSize(); + if ($cipherTextSize == null || $cipherTextSize <= 0) { + throw new \RuntimeException('Cannot decrypt a stream of unknown' + . ' size.'); + } + return (string) new LimitStream( + $cipherText, + $tagLength, + $cipherTextSize - $tagLength + ); + } + + private function getStrippedCiphertextStream( + StreamInterface $cipherText, + $tagLength + ) { + $cipherTextSize = $cipherText->getSize(); + if ($cipherTextSize == null || $cipherTextSize <= 0) { + throw new \RuntimeException('Cannot decrypt a stream of unknown' + . ' size.'); + } + return new LimitStream( + $cipherText, + $cipherTextSize - $tagLength, + 0 + ); + } + + /** + * Generates a stream that wraps the cipher text with the proper cipher and + * uses the content encryption key (CEK) to decrypt the data when read. + * + * @param string $cipherText Plain-text data to be encrypted using the + * materials, algorithm, and data provided. + * @param string $cek A content encryption key for use by the stream for + * encrypting the plaintext data. + * @param array $cipherOptions Options for use in determining the cipher to + * be used for encrypting data. + * + * @return AesStreamInterface + * + * @internal + */ + protected function getDecryptingStream( + $cipherText, + $cek, + $cipherOptions + ) { + $cipherTextStream = Psr7\Utils::streamFor($cipherText); + switch ($cipherOptions['Cipher']) { + case 'gcm': + $cipherOptions['Tag'] = $this->getTagFromCiphertextStream( + $cipherTextStream, + $cipherOptions['TagLength'] + ); + + return new AesGcmDecryptingStream( + $this->getStrippedCiphertextStream( + $cipherTextStream, + $cipherOptions['TagLength'] + ), + $cek, + $cipherOptions['Iv'], + $cipherOptions['Tag'], + $cipherOptions['Aad'] = isset($cipherOptions['Aad']) + ? $cipherOptions['Aad'] + : '', + $cipherOptions['TagLength'] ?: null, + $cipherOptions['KeySize'] + ); + default: + $cipherMethod = $this->buildCipherMethod( + $cipherOptions['Cipher'], + $cipherOptions['Iv'], + $cipherOptions['KeySize'] + ); + return new AesDecryptingStream( + $cipherTextStream, + $cek, + $cipherMethod + ); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/DecryptionTraitV2.php b/vendor/aws/aws-sdk-php/src/Crypto/DecryptionTraitV2.php new file mode 100644 index 0000000..ed63e0b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/DecryptionTraitV2.php @@ -0,0 +1,249 @@ +decryptCek( + base64_decode( + $envelope[MetadataEnvelope::CONTENT_KEY_V2_HEADER] + ), + json_decode( + $envelope[MetadataEnvelope::MATERIALS_DESCRIPTION_HEADER], + true + ), + $options + ); + $options['@CipherOptions']['KeySize'] = strlen($cek) * 8; + $options['@CipherOptions']['Cipher'] = $this->getCipherFromAesName( + $envelope[MetadataEnvelope::CONTENT_CRYPTO_SCHEME_HEADER] + ); + + $this->validateOptionsAndEnvelope($options, $envelope); + + $decryptionStream = $this->getDecryptingStream( + $cipherText, + $cek, + $options['@CipherOptions'] + ); + unset($cek); + + return $decryptionStream; + } + + private function getTagFromCiphertextStream( + StreamInterface $cipherText, + $tagLength + ) { + $cipherTextSize = $cipherText->getSize(); + if ($cipherTextSize == null || $cipherTextSize <= 0) { + throw new \RuntimeException('Cannot decrypt a stream of unknown' + . ' size.'); + } + return (string) new LimitStream( + $cipherText, + $tagLength, + $cipherTextSize - $tagLength + ); + } + + private function getStrippedCiphertextStream( + StreamInterface $cipherText, + $tagLength + ) { + $cipherTextSize = $cipherText->getSize(); + if ($cipherTextSize == null || $cipherTextSize <= 0) { + throw new \RuntimeException('Cannot decrypt a stream of unknown' + . ' size.'); + } + return new LimitStream( + $cipherText, + $cipherTextSize - $tagLength, + 0 + ); + } + + private function validateOptionsAndEnvelope($options, $envelope) + { + $allowedCiphers = AbstractCryptoClientV2::$supportedCiphers; + $allowedKeywraps = AbstractCryptoClientV2::$supportedKeyWraps; + if ($options['@SecurityProfile'] == 'V2_AND_LEGACY') { + $allowedCiphers = array_unique(array_merge( + $allowedCiphers, + AbstractCryptoClient::$supportedCiphers + )); + $allowedKeywraps = array_unique(array_merge( + $allowedKeywraps, + AbstractCryptoClient::$supportedKeyWraps + )); + } + + $v1SchemaException = new CryptoException("The requested object is encrypted" + . " with V1 encryption schemas that have been disabled by" + . " client configuration @SecurityProfile=V2. Retry with" + . " V2_AND_LEGACY enabled or reencrypt the object."); + + if (!in_array($options['@CipherOptions']['Cipher'], $allowedCiphers)) { + if (in_array($options['@CipherOptions']['Cipher'], AbstractCryptoClient::$supportedCiphers)) { + throw $v1SchemaException; + } + throw new CryptoException("The requested object is encrypted with" + . " the cipher '{$options['@CipherOptions']['Cipher']}', which is not" + . " supported for decryption with the selected security profile." + . " This profile allows decryption with: " + . implode(", ", $allowedCiphers)); + } + if (!in_array( + $envelope[MetadataEnvelope::KEY_WRAP_ALGORITHM_HEADER], + $allowedKeywraps + )) { + if (in_array( + $envelope[MetadataEnvelope::KEY_WRAP_ALGORITHM_HEADER], + AbstractCryptoClient::$supportedKeyWraps) + ) { + throw $v1SchemaException; + } + throw new CryptoException("The requested object is encrypted with" + . " the keywrap schema '{$envelope[MetadataEnvelope::KEY_WRAP_ALGORITHM_HEADER]}'," + . " which is not supported for decryption with the current security" + . " profile."); + } + + $matdesc = json_decode( + $envelope[MetadataEnvelope::MATERIALS_DESCRIPTION_HEADER], + true + ); + if (isset($matdesc['aws:x-amz-cek-alg']) + && $envelope[MetadataEnvelope::CONTENT_CRYPTO_SCHEME_HEADER] !== + $matdesc['aws:x-amz-cek-alg'] + ) { + throw new CryptoException("There is a mismatch in specified content" + . " encryption algrithm between the materials description value" + . " and the metadata envelope value: {$matdesc['aws:x-amz-cek-alg']}" + . " vs. {$envelope[MetadataEnvelope::CONTENT_CRYPTO_SCHEME_HEADER]}."); + } + } + + /** + * Generates a stream that wraps the cipher text with the proper cipher and + * uses the content encryption key (CEK) to decrypt the data when read. + * + * @param string $cipherText Plain-text data to be encrypted using the + * materials, algorithm, and data provided. + * @param string $cek A content encryption key for use by the stream for + * encrypting the plaintext data. + * @param array $cipherOptions Options for use in determining the cipher to + * be used for encrypting data. + * + * @return AesStreamInterface + * + * @internal + */ + protected function getDecryptingStream( + $cipherText, + $cek, + $cipherOptions + ) { + $cipherTextStream = Psr7\Utils::streamFor($cipherText); + switch ($cipherOptions['Cipher']) { + case 'gcm': + $cipherOptions['Tag'] = $this->getTagFromCiphertextStream( + $cipherTextStream, + $cipherOptions['TagLength'] + ); + + return new AesGcmDecryptingStream( + $this->getStrippedCiphertextStream( + $cipherTextStream, + $cipherOptions['TagLength'] + ), + $cek, + $cipherOptions['Iv'], + $cipherOptions['Tag'], + $cipherOptions['Aad'] = isset($cipherOptions['Aad']) + ? $cipherOptions['Aad'] + : '', + $cipherOptions['TagLength'] ?: null, + $cipherOptions['KeySize'] + ); + default: + $cipherMethod = $this->buildCipherMethod( + $cipherOptions['Cipher'], + $cipherOptions['Iv'], + $cipherOptions['KeySize'] + ); + return new AesDecryptingStream( + $cipherTextStream, + $cek, + $cipherMethod + ); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/EncryptionTrait.php b/vendor/aws/aws-sdk-php/src/Crypto/EncryptionTrait.php new file mode 100644 index 0000000..fcddba6 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/EncryptionTrait.php @@ -0,0 +1,192 @@ + true, + 'KeySize' => true, + 'Aad' => true, + ]; + + /** + * Dependency to generate a CipherMethod from a set of inputs for loading + * in to an AesEncryptingStream. + * + * @param string $cipherName Name of the cipher to generate for encrypting. + * @param string $iv Base Initialization Vector for the cipher. + * @param int $keySize Size of the encryption key, in bits, that will be + * used. + * + * @return Cipher\CipherMethod + * + * @internal + */ + abstract protected function buildCipherMethod($cipherName, $iv, $keySize); + + /** + * Builds an AesStreamInterface and populates encryption metadata into the + * supplied envelope. + * + * @param Stream $plaintext Plain-text data to be encrypted using the + * materials, algorithm, and data provided. + * @param array $cipherOptions Options for use in determining the cipher to + * be used for encrypting data. + * @param MaterialsProvider $provider A provider to supply and encrypt + * materials used in encryption. + * @param MetadataEnvelope $envelope A storage envelope for encryption + * metadata to be added to. + * + * @return AesStreamInterface + * + * @throws \InvalidArgumentException Thrown when a value in $cipherOptions + * is not valid. + * + * @internal + */ + public function encrypt( + Stream $plaintext, + array $cipherOptions, + MaterialsProvider $provider, + MetadataEnvelope $envelope + ) { + $materialsDescription = $provider->getMaterialsDescription(); + + $cipherOptions = array_intersect_key( + $cipherOptions, + self::$allowedOptions + ); + + if (empty($cipherOptions['Cipher'])) { + throw new \InvalidArgumentException('An encryption cipher must be' + . ' specified in the "cipher_options".'); + } + + if (!self::isSupportedCipher($cipherOptions['Cipher'])) { + throw new \InvalidArgumentException('The cipher requested is not' + . ' supported by the SDK.'); + } + + if (empty($cipherOptions['KeySize'])) { + $cipherOptions['KeySize'] = 256; + } + if (!is_int($cipherOptions['KeySize'])) { + throw new \InvalidArgumentException('The cipher "KeySize" must be' + . ' an integer.'); + } + + if (!MaterialsProvider::isSupportedKeySize( + $cipherOptions['KeySize'] + )) { + throw new \InvalidArgumentException('The cipher "KeySize" requested' + . ' is not supported by AES (128, 192, or 256).'); + } + + $cipherOptions['Iv'] = $provider->generateIv( + $this->getCipherOpenSslName( + $cipherOptions['Cipher'], + $cipherOptions['KeySize'] + ) + ); + + $cek = $provider->generateCek($cipherOptions['KeySize']); + + list($encryptingStream, $aesName) = $this->getEncryptingStream( + $plaintext, + $cek, + $cipherOptions + ); + + // Populate envelope data + $envelope[MetadataEnvelope::CONTENT_KEY_V2_HEADER] = + $provider->encryptCek( + $cek, + $materialsDescription + ); + unset($cek); + + $envelope[MetadataEnvelope::IV_HEADER] = + base64_encode($cipherOptions['Iv']); + $envelope[MetadataEnvelope::KEY_WRAP_ALGORITHM_HEADER] = + $provider->getWrapAlgorithmName(); + $envelope[MetadataEnvelope::CONTENT_CRYPTO_SCHEME_HEADER] = $aesName; + $envelope[MetadataEnvelope::UNENCRYPTED_CONTENT_LENGTH_HEADER] = + strlen($plaintext); + $envelope[MetadataEnvelope::MATERIALS_DESCRIPTION_HEADER] = + json_encode($materialsDescription); + if (!empty($cipherOptions['Tag'])) { + $envelope[MetadataEnvelope::CRYPTO_TAG_LENGTH_HEADER] = + strlen($cipherOptions['Tag']) * 8; + } + + return $encryptingStream; + } + + /** + * Generates a stream that wraps the plaintext with the proper cipher and + * uses the content encryption key (CEK) to encrypt the data when read. + * + * @param Stream $plaintext Plain-text data to be encrypted using the + * materials, algorithm, and data provided. + * @param string $cek A content encryption key for use by the stream for + * encrypting the plaintext data. + * @param array $cipherOptions Options for use in determining the cipher to + * be used for encrypting data. + * + * @return array returns an array with two elements as follows: [string, AesStreamInterface] + * + * @internal + */ + protected function getEncryptingStream( + Stream $plaintext, + $cek, + &$cipherOptions + ) { + switch ($cipherOptions['Cipher']) { + case 'gcm': + $cipherOptions['TagLength'] = 16; + + $cipherTextStream = new AesGcmEncryptingStream( + $plaintext, + $cek, + $cipherOptions['Iv'], + $cipherOptions['Aad'] = isset($cipherOptions['Aad']) + ? $cipherOptions['Aad'] + : '', + $cipherOptions['TagLength'], + $cipherOptions['KeySize'] + ); + + if (!empty($cipherOptions['Aad'])) { + trigger_error("'Aad' has been supplied for content encryption" + . " with " . $cipherTextStream->getAesName() . ". The" + . " PHP SDK encryption client can decrypt an object" + . " encrypted in this way, but other AWS SDKs may not be" + . " able to.", E_USER_WARNING); + } + + $appendStream = new AppendStream([ + $cipherTextStream->createStream() + ]); + $cipherOptions['Tag'] = $cipherTextStream->getTag(); + $appendStream->addStream(Psr7\Utils::streamFor($cipherOptions['Tag'])); + return [$appendStream, $cipherTextStream->getAesName()]; + default: + $cipherMethod = $this->buildCipherMethod( + $cipherOptions['Cipher'], + $cipherOptions['Iv'], + $cipherOptions['KeySize'] + ); + $cipherTextStream = new AesEncryptingStream( + $plaintext, + $cek, + $cipherMethod + ); + return [$cipherTextStream, $cipherTextStream->getAesName()]; + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/EncryptionTraitV2.php b/vendor/aws/aws-sdk-php/src/Crypto/EncryptionTraitV2.php new file mode 100644 index 0000000..2bce183 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/EncryptionTraitV2.php @@ -0,0 +1,196 @@ + true, + 'KeySize' => true, + 'Aad' => true, + ]; + + private static $encryptClasses = [ + 'gcm' => AesGcmEncryptingStream::class + ]; + + /** + * Dependency to generate a CipherMethod from a set of inputs for loading + * in to an AesEncryptingStream. + * + * @param string $cipherName Name of the cipher to generate for encrypting. + * @param string $iv Base Initialization Vector for the cipher. + * @param int $keySize Size of the encryption key, in bits, that will be + * used. + * + * @return Cipher\CipherMethod + * + * @internal + */ + abstract protected function buildCipherMethod($cipherName, $iv, $keySize); + + /** + * Builds an AesStreamInterface and populates encryption metadata into the + * supplied envelope. + * + * @param Stream $plaintext Plain-text data to be encrypted using the + * materials, algorithm, and data provided. + * @param array $options Options for use in encryption, including cipher + * options, and encryption context. + * @param MaterialsProviderV2 $provider A provider to supply and encrypt + * materials used in encryption. + * @param MetadataEnvelope $envelope A storage envelope for encryption + * metadata to be added to. + * + * @return StreamInterface + * + * @throws \InvalidArgumentException Thrown when a value in $options['@CipherOptions'] + * is not valid. + *s + * @internal + */ + public function encrypt( + Stream $plaintext, + array $options, + MaterialsProviderV2 $provider, + MetadataEnvelope $envelope + ) { + $options = array_change_key_case($options); + $cipherOptions = array_intersect_key( + $options['@cipheroptions'], + self::$allowedOptions + ); + + if (empty($cipherOptions['Cipher'])) { + throw new \InvalidArgumentException('An encryption cipher must be' + . ' specified in @CipherOptions["Cipher"].'); + } + + $cipherOptions['Cipher'] = strtolower($cipherOptions['Cipher']); + + if (!self::isSupportedCipher($cipherOptions['Cipher'])) { + throw new \InvalidArgumentException('The cipher requested is not' + . ' supported by the SDK.'); + } + + if (empty($cipherOptions['KeySize'])) { + $cipherOptions['KeySize'] = 256; + } + if (!is_int($cipherOptions['KeySize'])) { + throw new \InvalidArgumentException('The cipher "KeySize" must be' + . ' an integer.'); + } + + if (!MaterialsProviderV2::isSupportedKeySize( + $cipherOptions['KeySize'] + )) { + throw new \InvalidArgumentException('The cipher "KeySize" requested' + . ' is not supported by AES (128 or 256).'); + } + + $cipherOptions['Iv'] = $provider->generateIv( + $this->getCipherOpenSslName( + $cipherOptions['Cipher'], + $cipherOptions['KeySize'] + ) + ); + + $encryptClass = self::$encryptClasses[$cipherOptions['Cipher']]; + $aesName = $encryptClass::getStaticAesName(); + $materialsDescription = ['aws:x-amz-cek-alg' => $aesName]; + + $keys = $provider->generateCek( + $cipherOptions['KeySize'], + $materialsDescription, + $options + ); + + // Some providers modify materials description based on options + if (isset($keys['UpdatedContext'])) { + $materialsDescription = $keys['UpdatedContext']; + } + + $encryptingStream = $this->getEncryptingStream( + $plaintext, + $keys['Plaintext'], + $cipherOptions + ); + + // Populate envelope data + $envelope[MetadataEnvelope::CONTENT_KEY_V2_HEADER] = $keys['Ciphertext']; + unset($keys); + + $envelope[MetadataEnvelope::IV_HEADER] = + base64_encode($cipherOptions['Iv']); + $envelope[MetadataEnvelope::KEY_WRAP_ALGORITHM_HEADER] = + $provider->getWrapAlgorithmName(); + $envelope[MetadataEnvelope::CONTENT_CRYPTO_SCHEME_HEADER] = $aesName; + $envelope[MetadataEnvelope::UNENCRYPTED_CONTENT_LENGTH_HEADER] = + strlen($plaintext); + $envelope[MetadataEnvelope::MATERIALS_DESCRIPTION_HEADER] = + json_encode($materialsDescription); + if (!empty($cipherOptions['Tag'])) { + $envelope[MetadataEnvelope::CRYPTO_TAG_LENGTH_HEADER] = + strlen($cipherOptions['Tag']) * 8; + } + + return $encryptingStream; + } + + /** + * Generates a stream that wraps the plaintext with the proper cipher and + * uses the content encryption key (CEK) to encrypt the data when read. + * + * @param Stream $plaintext Plain-text data to be encrypted using the + * materials, algorithm, and data provided. + * @param string $cek A content encryption key for use by the stream for + * encrypting the plaintext data. + * @param array $cipherOptions Options for use in determining the cipher to + * be used for encrypting data. + * + * @return array returns an array with two elements as follows: [string, AesStreamInterface] + * + * @internal + */ + protected function getEncryptingStream( + Stream $plaintext, + $cek, + &$cipherOptions + ) { + switch ($cipherOptions['Cipher']) { + // Only 'gcm' is supported for encryption currently + case 'gcm': + $cipherOptions['TagLength'] = 16; + $encryptClass = self::$encryptClasses['gcm']; + $cipherTextStream = new $encryptClass( + $plaintext, + $cek, + $cipherOptions['Iv'], + $cipherOptions['Aad'] = isset($cipherOptions['Aad']) + ? $cipherOptions['Aad'] + : '', + $cipherOptions['TagLength'], + $cipherOptions['KeySize'] + ); + + if (!empty($cipherOptions['Aad'])) { + trigger_error("'Aad' has been supplied for content encryption" + . " with " . $cipherTextStream->getAesName() . ". The" + . " PHP SDK encryption client can decrypt an object" + . " encrypted in this way, but other AWS SDKs may not be" + . " able to.", E_USER_WARNING); + } + + $appendStream = new AppendStream([ + $cipherTextStream->createStream() + ]); + $cipherOptions['Tag'] = $cipherTextStream->getTag(); + $appendStream->addStream(Psr7\Utils::streamFor($cipherOptions['Tag'])); + return $appendStream; + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/KmsMaterialsProvider.php b/vendor/aws/aws-sdk-php/src/Crypto/KmsMaterialsProvider.php new file mode 100644 index 0000000..fc75138 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/KmsMaterialsProvider.php @@ -0,0 +1,121 @@ +kmsClient = $kmsClient; + $this->kmsKeyId = $kmsKeyId; + } + + public function fromDecryptionEnvelope(MetadataEnvelope $envelope) + { + if (empty($envelope[MetadataEnvelope::MATERIALS_DESCRIPTION_HEADER])) { + throw new \RuntimeException('Not able to detect the materials description.'); + } + + $materialsDescription = json_decode( + $envelope[MetadataEnvelope::MATERIALS_DESCRIPTION_HEADER], + true + ); + + if (empty($materialsDescription['kms_cmk_id']) + && empty($materialsDescription['aws:x-amz-cek-alg'])) { + throw new \RuntimeException('Not able to detect kms_cmk_id (legacy' + . ' implementation) or aws:x-amz-cek-alg (current implementation)' + . ' from kms materials description.'); + } + + return new self( + $this->kmsClient, + isset($materialsDescription['kms_cmk_id']) + ? $materialsDescription['kms_cmk_id'] + : null + ); + } + + /** + * The KMS key id for use in matching this Provider to its keys, + * consistently with other SDKs as 'kms_cmk_id'. + * + * @return array + */ + public function getMaterialsDescription() + { + return ['kms_cmk_id' => $this->kmsKeyId]; + } + + public function getWrapAlgorithmName() + { + return self::WRAP_ALGORITHM_NAME; + } + + /** + * Takes a content encryption key (CEK) and description to return an encrypted + * key by using KMS' Encrypt API. + * + * @param string $unencryptedCek Key for use in encrypting other data + * that itself needs to be encrypted by the + * Provider. + * @param string $materialDescription Material Description for use in + * encrypting the $cek. + * + * @return string + */ + public function encryptCek($unencryptedCek, $materialDescription) + { + $encryptedDataKey = $this->kmsClient->encrypt([ + 'Plaintext' => $unencryptedCek, + 'KeyId' => $this->kmsKeyId, + 'EncryptionContext' => $materialDescription + ]); + return base64_encode($encryptedDataKey['CiphertextBlob']); + } + + /** + * Takes an encrypted content encryption key (CEK) and material description + * for use decrypting the key by using KMS' Decrypt API. + * + * @param string $encryptedCek Encrypted key to be decrypted by the Provider + * for use decrypting other data. + * @param string $materialDescription Material Description for use in + * encrypting the $cek. + * + * @return string + */ + public function decryptCek($encryptedCek, $materialDescription) + { + $result = $this->kmsClient->decrypt([ + 'CiphertextBlob' => $encryptedCek, + 'EncryptionContext' => $materialDescription + ]); + + return $result['Plaintext']; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/KmsMaterialsProviderV2.php b/vendor/aws/aws-sdk-php/src/Crypto/KmsMaterialsProviderV2.php new file mode 100644 index 0000000..e7da8b9 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/KmsMaterialsProviderV2.php @@ -0,0 +1,100 @@ +kmsClient = $kmsClient; + $this->kmsKeyId = $kmsKeyId; + } + + /** + * @inheritDoc + */ + public function getWrapAlgorithmName() + { + return self::WRAP_ALGORITHM_NAME; + } + + /** + * @inheritDoc + */ + public function decryptCek($encryptedCek, $materialDescription, $options) + { + $params = [ + 'CiphertextBlob' => $encryptedCek, + 'EncryptionContext' => $materialDescription + ]; + if (empty($options['@KmsAllowDecryptWithAnyCmk'])) { + if (empty($this->kmsKeyId)) { + throw new CryptoException('KMS CMK ID was not specified and the' + . ' operation is not opted-in to attempting to use any valid' + . ' CMK it discovers. Please specify a CMK ID, or explicitly' + . ' enable attempts to use any valid KMS CMK with the' + . ' @KmsAllowDecryptWithAnyCmk option.'); + } + $params['KeyId'] = $this->kmsKeyId; + } + + $result = $this->kmsClient->decrypt($params); + return $result['Plaintext']; + } + + /** + * @inheritDoc + */ + public function generateCek($keySize, $context, $options) + { + if (empty($this->kmsKeyId)) { + throw new CryptoException('A KMS key id is required for encryption' + . ' with KMS keywrap. Use a KmsMaterialsProviderV2 that has been' + . ' instantiated with a KMS key id.'); + } + $options = array_change_key_case($options); + if (!isset($options['@kmsencryptioncontext']) + || !is_array($options['@kmsencryptioncontext']) + ) { + throw new CryptoException("'@KmsEncryptionContext' is a" + . " required argument when using KmsMaterialsProviderV2, and" + . " must be an associative array (or empty array)."); + } + if (isset($options['@kmsencryptioncontext']['aws:x-amz-cek-alg'])) { + throw new CryptoException("Conflict in reserved @KmsEncryptionContext" + . " key aws:x-amz-cek-alg. This value is reserved for the S3" + . " Encryption Client and cannot be set by the user."); + } + $context = array_merge($options['@kmsencryptioncontext'], $context); + $result = $this->kmsClient->generateDataKey([ + 'KeyId' => $this->kmsKeyId, + 'KeySpec' => "AES_{$keySize}", + 'EncryptionContext' => $context + ]); + return [ + 'Plaintext' => $result['Plaintext'], + 'Ciphertext' => base64_encode($result['CiphertextBlob']), + 'UpdatedContext' => $context + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/MaterialsProvider.php b/vendor/aws/aws-sdk-php/src/Crypto/MaterialsProvider.php new file mode 100644 index 0000000..1c6941c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/MaterialsProvider.php @@ -0,0 +1,105 @@ + true, + 192 => true, + 256 => true, + ]; + + /** + * Returns if the requested size is supported by AES. + * + * @param int $keySize Size of the requested key in bits. + * + * @return bool + */ + public static function isSupportedKeySize($keySize) + { + return isset(self::$supportedKeySizes[$keySize]); + } + + /** + * Performs further initialization of the MaterialsProvider based on the + * data inside the MetadataEnvelope. + * + * @param MetadataEnvelope $envelope A storage envelope for encryption + * metadata to be read from. + * + * @return MaterialsProvider + * + * @throws \RuntimeException Thrown when there is an empty or improperly + * formed materials description in the envelope. + * + * @internal + */ + abstract public function fromDecryptionEnvelope(MetadataEnvelope $envelope); + + /** + * Returns the material description for this Provider so it can be verified + * by encryption mechanisms. + * + * @return string + */ + abstract public function getMaterialsDescription(); + + /** + * Returns the wrap algorithm name for this Provider. + * + * @return string + */ + abstract public function getWrapAlgorithmName(); + + /** + * Takes a content encryption key (CEK) and description to return an + * encrypted key according to the Provider's specifications. + * + * @param string $unencryptedCek Key for use in encrypting other data + * that itself needs to be encrypted by the + * Provider. + * @param string $materialDescription Material Description for use in + * encrypting the $cek. + * + * @return string + */ + abstract public function encryptCek($unencryptedCek, $materialDescription); + + /** + * Takes an encrypted content encryption key (CEK) and material description + * for use decrypting the key according to the Provider's specifications. + * + * @param string $encryptedCek Encrypted key to be decrypted by the Provider + * for use decrypting other data. + * @param string $materialDescription Material Description for use in + * encrypting the $cek. + * + * @return string + */ + abstract public function decryptCek($encryptedCek, $materialDescription); + + /** + * @param string $keySize Length of a cipher key in bits for generating a + * random content encryption key (CEK). + * + * @return string + */ + public function generateCek($keySize) + { + return openssl_random_pseudo_bytes($keySize / 8); + } + + /** + * @param string $openSslName Cipher OpenSSL name to use for generating + * an initialization vector. + * + * @return string + */ + public function generateIv($openSslName) + { + return openssl_random_pseudo_bytes( + openssl_cipher_iv_length($openSslName) + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/MaterialsProviderInterface.php b/vendor/aws/aws-sdk-php/src/Crypto/MaterialsProviderInterface.php new file mode 100644 index 0000000..a22016d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/MaterialsProviderInterface.php @@ -0,0 +1,61 @@ + true, + 256 => true, + ]; + + /** + * Returns if the requested size is supported by AES. + * + * @param int $keySize Size of the requested key in bits. + * + * @return bool + */ + public static function isSupportedKeySize($keySize) + { + return isset(self::$supportedKeySizes[$keySize]); + } + + /** + * Returns the wrap algorithm name for this Provider. + * + * @return string + */ + abstract public function getWrapAlgorithmName(); + + /** + * Takes an encrypted content encryption key (CEK) and material description + * for use decrypting the key according to the Provider's specifications. + * + * @param string $encryptedCek Encrypted key to be decrypted by the Provider + * for use decrypting other data. + * @param string $materialDescription Material Description for use in + * decrypting the CEK. + * @param string $options Options for use in decrypting the CEK. + * + * @return string + */ + abstract public function decryptCek($encryptedCek, $materialDescription, $options); + + /** + * @param string $keySize Length of a cipher key in bits for generating a + * random content encryption key (CEK). + * @param array $context Context map needed for key encryption + * @param array $options Additional options to be used in CEK generation + * + * @return array + */ + abstract public function generateCek($keySize, $context, $options); + + /** + * @param string $openSslName Cipher OpenSSL name to use for generating + * an initialization vector. + * + * @return string + */ + public function generateIv($openSslName) + { + return openssl_random_pseudo_bytes( + openssl_cipher_iv_length($openSslName) + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/MetadataEnvelope.php b/vendor/aws/aws-sdk-php/src/Crypto/MetadataEnvelope.php new file mode 100644 index 0000000..5a7c692 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/MetadataEnvelope.php @@ -0,0 +1,61 @@ +getConstants()) as $constant) { + self::$constants[$constant] = true; + } + } + + return array_keys(self::$constants); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetSet($name, $value) + { + $constants = self::getConstantValues(); + if (is_null($name) || !in_array($name, $constants)) { + throw new InvalidArgumentException('MetadataEnvelope fields must' + . ' must match a predefined offset; use the header constants.'); + } + + $this->data[$name] = $value; + } + + #[\ReturnTypeWillChange] + public function jsonSerialize() + { + return $this->data; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Crypto/MetadataStrategyInterface.php b/vendor/aws/aws-sdk-php/src/Crypto/MetadataStrategyInterface.php new file mode 100644 index 0000000..5270c7e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Crypto/MetadataStrategyInterface.php @@ -0,0 +1,30 @@ +credentialProvider = Aws\constantly($promise); + } else { + $this->credentialProvider = $creds; + } + } + + /** + * @param string $endpoint + * @param string $region + * @param int $expiration + * + * @return string + */ + public function generateDbConnectAuthToken( + string $endpoint, + string $region, + int $expiration = self::DEFAULT_EXPIRATION_TIME_SECONDS + ): string + { + return $this->createToken($endpoint, $region, self::DB_CONNECT, $expiration); + } + + /** + * @param string $endpoint + * @param string $region + * @param int $expiration + * + * @return string + */ + public function generateDbConnectAdminAuthToken( + string $endpoint, + string $region, + int $expiration = self::DEFAULT_EXPIRATION_TIME_SECONDS + ): string + { + return $this->createToken($endpoint, $region, self::DB_CONNECT_ADMIN, $expiration); + } + + /** + * Creates token for database connection + * + * @param string $endpoint The database hostname + * @param string $region The region where the database is located + * @param string $action Db action to perform + * @param int $expiration The expiration of the token in seconds + * + * @return string Generated token + */ + private function createToken( + string $endpoint, + string $region, + string $action, + int $expiration + ): string + { + if ($expiration <= 0) { + throw new \InvalidArgumentException( + "Lifetime must be a positive number, was {$expiration}" + ); + } + + if (empty($region)) { + throw new \InvalidArgumentException('Region must be a non-empty string.'); + } + + if (empty($endpoint)) { + throw new \InvalidArgumentException('Endpoint must be a non-empty string.'); + } + + $uri = new Uri($endpoint); + if (empty($uri->getHost())) { + $uri = $uri->withHost($endpoint); + } + $uri = $uri->withPath('/')->withQuery('Action=' . $action); + + $request = new Request('GET', $uri); + $signer = new SignatureV4(self::SIGNING_NAME, $region); + $provider = $this->credentialProvider; + + $url = (string) $signer->presign( + $request, + $provider()->wait(), + '+' . $expiration . ' seconds' + )->getUri(); + + // Remove 2 extra slash from the presigned url result + return substr($url, 2); + } +} + diff --git a/vendor/aws/aws-sdk-php/src/DSQL/DSQLClient.php b/vendor/aws/aws-sdk-php/src/DSQL/DSQLClient.php new file mode 100644 index 0000000..5a99f3e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/DSQL/DSQLClient.php @@ -0,0 +1,33 @@ +validModes)) { + throw new \InvalidArgumentException("'{$mode}' is not a valid mode." + . " The mode has to be 'legacy', 'standard', 'cross-region', 'in-region'," + . " 'mobile', or 'auto'."); + } + + $this->mode = $mode; + if ($this->mode == 'legacy') { + return; + } + + $data = \Aws\load_compiled_json( + __DIR__ . '/../data/sdk-default-configuration.json' + ); + + $this->retryMode = $data['base']['retryMode']; + $this->stsRegionalEndpoints = $data['base']['stsRegionalEndpoints']; + $this->s3UsEast1RegionalEndpoints = $data['base']['s3UsEast1RegionalEndpoints']; + $this->connectTimeoutInMillis = $data['base']['connectTimeoutInMillis']; + + if (isset($data['modes'][$mode])) { + $modeData = $data['modes'][$mode]; + foreach ($modeData as $settingName => $settingValue) { + if (isset($this->$settingName)) { + if (isset($settingValue['override'])) { + $this->$settingName = $settingValue['override']; + } else if (isset($settingValue['multiply'])) { + $this->$settingName *= $settingValue['multiply']; + } else if (isset($settingValue['add'])) { + $this->$settingName += $settingValue['add']; + } + } else { + if (isset($settingValue['override'])) { + if (property_exists($this, $settingName)) { + $this->$settingName = $settingValue['override']; + } + } + } + } + } + } + + /** + * {@inheritdoc} + */ + public function getMode() + { + return $this->mode; + } + + /** + * {@inheritdoc} + */ + public function getRetryMode() + { + return $this->retryMode; + } + + /** + * {@inheritdoc} + */ + public function getStsRegionalEndpoints() + { + return $this->stsRegionalEndpoints; + } + + /** + * {@inheritdoc} + */ + public function getS3UsEast1RegionalEndpoints() + { + return $this->s3UsEast1RegionalEndpoints; + } + + /** + * {@inheritdoc} + */ + public function getConnectTimeoutInMillis() + { + return $this->connectTimeoutInMillis; + } + + /** + * {@inheritdoc} + */ + public function getHttpRequestTimeoutInMillis() + { + return $this->httpRequestTimeoutInMillis; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return [ + 'mode' => $this->getMode(), + 'retry_mode' => $this->getRetryMode(), + 'sts_regional_endpoints' => $this->getStsRegionalEndpoints(), + 's3_us_east_1_regional_endpoint' => $this->getS3UsEast1RegionalEndpoints(), + 'connect_timeout_in_milliseconds' => $this->getConnectTimeoutInMillis(), + 'http_request_timeout_in_milliseconds' => $this->getHttpRequestTimeoutInMillis(), + ]; + } + +} diff --git a/vendor/aws/aws-sdk-php/src/DefaultsMode/ConfigurationInterface.php b/vendor/aws/aws-sdk-php/src/DefaultsMode/ConfigurationInterface.php new file mode 100644 index 0000000..34c5a63 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/DefaultsMode/ConfigurationInterface.php @@ -0,0 +1,51 @@ + + * use Aws\Sts\RegionalEndpoints\ConfigurationProvider; + * $provider = ConfigurationProvider::defaultProvider(); + * // Returns a ConfigurationInterface or throws. + * $config = $provider()->wait(); + * + * + * Configuration providers can be composed to create configuration using + * conditional logic that can create different configurations in different + * environments. You can compose multiple providers into a single provider using + * {@see \Aws\DefaultsMode\ConfigurationProvider::chain}. This function + * accepts providers as variadic arguments and returns a new function that will + * invoke each provider until a successful configuration is returned. + * + * + * // First try an INI file at this location. + * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = ConfigurationProvider::env(); + * // Combine the three providers together. + * $composed = ConfigurationProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with a configuration or throws. + * $promise = $composed(); + * // Wait on the configuration to resolve. + * $config = $promise->wait(); + * + */ +class ConfigurationProvider extends AbstractConfigurationProvider + implements ConfigurationProviderInterface +{ + const DEFAULT_MODE = 'legacy'; + const ENV_MODE = 'AWS_DEFAULTS_MODE'; + const ENV_PROFILE = 'AWS_PROFILE'; + const INI_MODE = 'defaults_mode'; + + public static $cacheKey = 'aws_defaults_mode'; + + protected static $interfaceClass = ConfigurationInterface::class; + protected static $exceptionClass = ConfigurationException::class; + + /** + * Create a default config provider that first checks for environment + * variables, then checks for a specified profile in the environment-defined + * config file location (env variable is 'AWS_CONFIG_FILE', file location + * defaults to ~/.aws/config), then checks for the "default" profile in the + * environment-defined config file location, and failing those uses a default + * fallback set of configuration options. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided config options. + * + * @param array $config + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $configProviders = [self::env()]; + if ( + !isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] != false + ) { + $configProviders[] = self::ini(); + } + $configProviders[] = self::fallback(); + + $memo = self::memoize( + call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders) + ); + + if (isset($config['defaultsMode']) + && $config['defaultsMode'] instanceof CacheInterface + ) { + return self::cache($memo, $config['defaultsMode'], self::$cacheKey); + } + + return $memo; + } + + /** + * Provider that creates config from environment variables. + * + * @return callable + */ + public static function env() + { + return function () { + // Use config from environment variables, if available + $mode = getenv(self::ENV_MODE); + if (!empty($mode)) { + return Promise\Create::promiseFor( + new Configuration($mode) + ); + } + + return self::reject('Could not find environment variable config' + . ' in ' . self::ENV_MODE); + }; + } + + /** + * Fallback config options when other sources are not set. + * + * @return callable + */ + public static function fallback() + { + return function () { + return Promise\Create::promiseFor( + new Configuration( self::DEFAULT_MODE) + ); + }; + } + + /** + * Config provider that creates config using a config file whose location + * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to + * ~/.aws/config if not specified + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile. + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the default directory. + * + * @return callable + */ + public static function ini( + $profile = null, + $filename = null + ) { + $filename = $filename ?: (self::getDefaultConfigFilename()); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($profile, $filename) { + if (!is_readable($filename)) { + return self::reject("Cannot read configuration from $filename"); + } + $data = \Aws\parse_ini_file($filename, true); + if ($data === false) { + return self::reject("Invalid config file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in config file"); + } + if (!isset($data[$profile][self::INI_MODE])) { + return self::reject("Required defaults mode config values + not present in INI profile '{$profile}' ({$filename})"); + } + return Promise\Create::promiseFor( + new Configuration( + $data[$profile][self::INI_MODE] + ) + ); + }; + } + + /** + * Unwraps a configuration object in whatever valid form it is in, + * always returning a ConfigurationInterface object. + * + * @param mixed $config + * @return ConfigurationInterface + * @throws \InvalidArgumentException + */ + public static function unwrap($config) + { + if (is_callable($config)) { + $config = $config(); + } + if ($config instanceof PromiseInterface) { + $config = $config->wait(); + } + if ($config instanceof ConfigurationInterface) { + return $config; + } + + if (is_string($config)) { + return new Configuration($config); + } + + throw new \InvalidArgumentException('Not a valid defaults mode configuration' + . ' argument.'); + } +} diff --git a/vendor/aws/aws-sdk-php/src/DefaultsMode/Exception/ConfigurationException.php b/vendor/aws/aws-sdk-php/src/DefaultsMode/Exception/ConfigurationException.php new file mode 100644 index 0000000..b7186a5 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/DefaultsMode/Exception/ConfigurationException.php @@ -0,0 +1,14 @@ +cache = $cache; + } + + public function get($key) + { + return $this->cache->fetch($key); + } + + /** + * @return mixed + */ + public function fetch($key) + { + return $this->get($key); + } + + public function set($key, $value, $ttl = 0) + { + return $this->cache->save($key, $value, $ttl); + } + + /** + * @return bool + */ + public function save($key, $value, $ttl = 0) + { + return $this->set($key, $value, $ttl); + } + + public function remove($key) + { + return $this->cache->delete($key); + } + + /** + * @return bool + */ + public function delete($key) + { + return $this->remove($key); + } + + /** + * @return bool + */ + public function contains($key) + { + return $this->cache->contains($key); + } + + /** + * @return mixed[]|null + */ + public function getStats() + { + return $this->cache->getStats(); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/EndpointProvider.php b/vendor/aws/aws-sdk-php/src/Endpoint/EndpointProvider.php new file mode 100644 index 0000000..ba53574 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/EndpointProvider.php @@ -0,0 +1,96 @@ + 'ec2', 'region' => 'us-west-2']); + * // Returns an endpoint array or throws. + * $endpoint = EndpointProvider::resolve($provider, [ + * 'service' => 'ec2', + * 'region' => 'us-west-2' + * ]); + * + * You can compose multiple providers into a single provider using + * {@see Aws\or_chain}. This function accepts providers as arguments and + * returns a new function that will invoke each provider until a non-null value + * is returned. + * + * $a = function (array $args) { + * if ($args['region'] === 'my-test-region') { + * return ['endpoint' => 'http://localhost:123/api']; + * } + * }; + * $b = EndpointProvider::defaultProvider(); + * $c = \Aws\or_chain($a, $b); + * $config = ['service' => 'ec2', 'region' => 'my-test-region']; + * $res = $c($config); // $a handles this. + * $config['region'] = 'us-west-2'; + * $res = $c($config); // $b handles this. + */ +class EndpointProvider +{ + /** + * Resolves and endpoint provider and ensures a non-null return value. + * + * @param callable $provider Provider function to invoke. + * @param array $args Endpoint arguments to pass to the provider. + * + * @return array + * @throws UnresolvedEndpointException + */ + public static function resolve(callable $provider, array $args = []) + { + $result = $provider($args); + if (is_array($result)) { + return $result; + } + + throw new UnresolvedEndpointException( + 'Unable to resolve an endpoint using the provider arguments: ' + . json_encode($args) . '. Note: you can provide an "endpoint" ' + . 'option to a client constructor to bypass invoking an endpoint ' + . 'provider.'); + } + + /** + * Creates and returns the default SDK endpoint provider. + * + * @deprecated Use an instance of \Aws\Endpoint\Partition instead. + * + * @return callable + */ + public static function defaultProvider() + { + return PartitionEndpointProvider::defaultProvider(); + } + + /** + * Creates and returns an endpoint provider that uses patterns from an + * array. + * + * @param array $patterns Endpoint patterns + * + * @return callable + */ + public static function patterns(array $patterns) + { + return new PatternEndpointProvider($patterns); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/Partition.php b/vendor/aws/aws-sdk-php/src/Endpoint/Partition.php new file mode 100644 index 0000000..46d2371 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/Partition.php @@ -0,0 +1,322 @@ +data = $definition; + } + + public function getName() + { + return $this->data['partition']; + } + + /** + * @internal + * @return mixed + */ + public function getDnsSuffix() + { + return $this->data['dnsSuffix']; + } + + public function isRegionMatch($region, $service) + { + if (isset($this->data['regions'][$region]) + || isset($this->data['services'][$service]['endpoints'][$region]) + ) { + return true; + } + + if (isset($this->data['regionRegex'])) { + return (bool) preg_match( + "@{$this->data['regionRegex']}@", + $region + ); + } + + return false; + } + + public function getAvailableEndpoints( + $service, + $allowNonRegionalEndpoints = false + ) { + if ($this->isServicePartitionGlobal($service)) { + return [$this->getPartitionEndpoint($service)]; + } + + if (isset($this->data['services'][$service]['endpoints'])) { + $serviceRegions = array_keys( + $this->data['services'][$service]['endpoints'] + ); + + return $allowNonRegionalEndpoints + ? $serviceRegions + : array_intersect($serviceRegions, array_keys( + $this->data['regions'] + )); + } + + return []; + } + + public function __invoke(array $args = []) + { + $service = isset($args['service']) ? $args['service'] : ''; + $region = isset($args['region']) ? $args['region'] : ''; + $scheme = isset($args['scheme']) ? $args['scheme'] : 'https'; + $options = isset($args['options']) ? $args['options'] : []; + $data = $this->getEndpointData($service, $region, $options); + $variant = $this->getVariant($options, $data); + if (isset($variant['hostname'])) { + $template = $variant['hostname']; + } else { + $template = isset($data['hostname']) ? $data['hostname'] : ''; + } + $dnsSuffix = isset($variant['dnsSuffix']) + ? $variant['dnsSuffix'] + : $this->data['dnsSuffix']; + return [ + 'endpoint' => "{$scheme}://" . $this->formatEndpoint( + $template, + $service, + $region, + $dnsSuffix + ), + 'signatureVersion' => $this->getSignatureVersion($data), + 'signingRegion' => isset($data['credentialScope']['region']) + ? $data['credentialScope']['region'] + : $region, + 'signingName' => isset($data['credentialScope']['service']) + ? $data['credentialScope']['service'] + : $service, + ]; + } + + private function getEndpointData($service, $region, $options) + { + $defaultRegion = $this->resolveRegion($service, $region, $options); + $data = isset($this->data['services'][$service]['endpoints'][$defaultRegion]) + ? $this->data['services'][$service]['endpoints'][$defaultRegion] + : []; + $data += isset($this->data['services'][$service]['defaults']) + ? $this->data['services'][$service]['defaults'] + : []; + $data += isset($this->data['defaults']) + ? $this->data['defaults'] + : []; + + return $data; + } + + private function getSignatureVersion(array $data) + { + static $supportedBySdk = [ + 's3v4', + 'v4', + 'anonymous', + ]; + + $possibilities = array_intersect( + $supportedBySdk, + isset($data['signatureVersions']) + ? $data['signatureVersions'] + : ['v4'] + ); + + return array_shift($possibilities); + } + + private function resolveRegion($service, $region, $options) + { + if (isset($this->data['services'][$service]['endpoints'][$region]) + && $this->isFipsEndpointUsed($region) + ) { + return $region; + } + + if ($this->isServicePartitionGlobal($service) + || $this->isStsLegacyEndpointUsed($service, $region, $options) + || $this->isS3LegacyEndpointUsed($service, $region, $options) + ) { + return $this->getPartitionEndpoint($service); + } + + return $region; + } + + private function isServicePartitionGlobal($service) + { + return isset($this->data['services'][$service]['isRegionalized']) + && false === $this->data['services'][$service]['isRegionalized'] + && isset($this->data['services'][$service]['partitionEndpoint']); + } + + /** + * STS legacy endpoints used for valid regions unless option is explicitly + * set to 'regional' + * + * @param string $service + * @param string $region + * @param array $options + * @return bool + */ + private function isStsLegacyEndpointUsed($service, $region, $options) + { + return $service === 'sts' + && in_array($region, $this->stsLegacyGlobalRegions) + && (empty($options['sts_regional_endpoints']) + || ConfigurationProvider::unwrap( + $options['sts_regional_endpoints'] + )->getEndpointsType() !== 'regional' + ); + } + + /** + * S3 legacy us-east-1 endpoint used for valid regions unless option is explicitly + * set to 'regional' + * + * @param string $service + * @param string $region + * @param array $options + * @return bool + */ + private function isS3LegacyEndpointUsed($service, $region, $options) + { + return $service === 's3' + && $region === 'us-east-1' + && (empty($options['s3_us_east_1_regional_endpoint']) + || S3ConfigurationProvider::unwrap( + $options['s3_us_east_1_regional_endpoint'] + )->getEndpointsType() !== 'regional' + ); + } + + private function getPartitionEndpoint($service) + { + return $this->data['services'][$service]['partitionEndpoint']; + } + + private function formatEndpoint($template, $service, $region, $dnsSuffix) + { + return strtr($template, [ + '{service}' => $service, + '{region}' => $region, + '{dnsSuffix}' => $dnsSuffix, + ]); + } + + /** + * @param $region + * @return bool + */ + private function isFipsEndpointUsed($region) + { + return strpos($region, "fips") !== false; + } + + /** + * @param array $options + * @param array $data + * @return array + */ + private function getVariant(array $options, array $data) + { + $variantTags = []; + if (isset($options['use_fips_endpoint'])) { + $useFips = $options['use_fips_endpoint']; + if (is_bool($useFips)) { + $useFips && $variantTags[] = 'fips'; + } elseif ($useFips->isUseFipsEndpoint()) { + $variantTags[] = 'fips'; + } + } + if (isset($options['use_dual_stack_endpoint'])) { + $useDualStack = $options['use_dual_stack_endpoint']; + if (is_bool($useDualStack)) { + $useDualStack && $variantTags[] = 'dualstack'; + } elseif ($useDualStack->isUseDualStackEndpoint()) { + $variantTags[] = 'dualstack'; + } + } + if (!empty($variantTags)) { + if (isset($data['variants'])) { + foreach ($data['variants'] as $variant) { + if (array_count_values($variant['tags']) == array_count_values($variantTags)) { + return $variant; + } + } + } + if (isset($this->data['defaults']['variants'])) { + foreach ($this->data['defaults']['variants'] as $variant) { + if (array_count_values($variant['tags']) == array_count_values($variantTags)) { + return $variant; + } + } + } + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/PartitionEndpointProvider.php b/vendor/aws/aws-sdk-php/src/Endpoint/PartitionEndpointProvider.php new file mode 100644 index 0000000..21ca2c8 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/PartitionEndpointProvider.php @@ -0,0 +1,130 @@ +partitions = array_map(function (array $definition) { + return new Partition($definition); + }, array_values($partitions)); + $this->defaultPartition = $defaultPartition; + $this->options = $options; + } + + public function __invoke(array $args = []) + { + $partition = $this->getPartition( + isset($args['region']) ? $args['region'] : '', + isset($args['service']) ? $args['service'] : '' + ); + $args['options'] = $this->options; + + return $partition($args); + } + + /** + * Returns the partition containing the provided region or the default + * partition if no match is found. + * + * @param string $region + * @param string $service + * + * @return Partition + */ + public function getPartition($region, $service) + { + foreach ($this->partitions as $partition) { + if ($partition->isRegionMatch($region, $service)) { + return $partition; + } + } + + return $this->getPartitionByName($this->defaultPartition); + } + + /** + * Returns the partition with the provided name or null if no partition with + * the provided name can be found. + * + * @param string $name + * + * @return Partition|null + */ + public function getPartitionByName($name) + { + foreach ($this->partitions as $partition) { + if ($name === $partition->getName()) { + return $partition; + } + } + } + + /** + * Creates and returns the default SDK partition provider. + * + * @param array $options + * @return PartitionEndpointProvider + */ + public static function defaultProvider($options = []) + { + $data = \Aws\load_compiled_json(__DIR__ . '/../data/endpoints.json'); + $prefixData = \Aws\load_compiled_json(__DIR__ . '/../data/endpoints_prefix_history.json'); + $mergedData = self::mergePrefixData($data, $prefixData); + + return new self($mergedData['partitions'], 'aws', $options); + } + + /** + * Copy endpoint data for other prefixes used by a given service + * + * @param $data + * @param $prefixData + * @return array + */ + public static function mergePrefixData($data, $prefixData) + { + $prefixGroups = $prefixData['prefix-groups']; + + foreach ($data["partitions"] as $index => $partition) { + foreach ($prefixGroups as $current => $old) { + $serviceData = Env::search("services.\"{$current}\"", $partition); + if (!empty($serviceData)) { + foreach ($old as $prefix) { + if (empty(Env::search("services.\"{$prefix}\"", $partition))) { + $data["partitions"][$index]["services"][$prefix] = $serviceData; + } + } + } + } + } + + return $data; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/PartitionInterface.php b/vendor/aws/aws-sdk-php/src/Endpoint/PartitionInterface.php new file mode 100644 index 0000000..0f2572d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/PartitionInterface.php @@ -0,0 +1,56 @@ +patterns = $patterns; + } + + public function __invoke(array $args = []) + { + $service = isset($args['service']) ? $args['service'] : ''; + $region = isset($args['region']) ? $args['region'] : ''; + $keys = ["{$region}/{$service}", "{$region}/*", "*/{$service}", "*/*"]; + + foreach ($keys as $key) { + if (isset($this->patterns[$key])) { + return $this->expand( + $this->patterns[$key], + isset($args['scheme']) ? $args['scheme'] : 'https', + $service, + $region + ); + } + } + + return null; + } + + private function expand(array $config, $scheme, $service, $region) + { + $config['endpoint'] = $scheme . '://' + . strtr($config['endpoint'], [ + '{service}' => $service, + '{region}' => $region + ]); + + return $config; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Configuration.php b/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Configuration.php new file mode 100644 index 0000000..5506fca --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Configuration.php @@ -0,0 +1,41 @@ +useDualstackEndpoint = Aws\boolean_value($useDualstackEndpoint); + if (is_null($this->useDualstackEndpoint)) { + throw new ConfigurationException("'use_dual_stack_endpoint' config option" + . " must be a boolean value."); + } + if ($this->useDualstackEndpoint == true + && (strpos($region, "iso-") !== false || strpos($region, "-iso") !== false) + ) { + throw new ConfigurationException("Dual-stack is not supported in ISO regions"); } + } + + /** + * {@inheritdoc} + */ + public function isUseDualstackEndpoint() + { + return $this->useDualstackEndpoint; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return [ + 'use_dual_stack_endpoint' => $this->isUseDualstackEndpoint(), + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/ConfigurationInterface.php b/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/ConfigurationInterface.php new file mode 100644 index 0000000..e1c7d5e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/ConfigurationInterface.php @@ -0,0 +1,19 @@ + + * use Aws\Endpoint\UseDualstackEndpoint\ConfigurationProvider; + * $provider = ConfigurationProvider::defaultProvider(); + * // Returns a ConfigurationInterface or throws. + * $config = $provider()->wait(); + * + * + * Configuration providers can be composed to create configuration using + * conditional logic that can create different configurations in different + * environments. You can compose multiple providers into a single provider using + * {@see Aws\Endpoint\UseDualstackEndpoint\ConfigurationProvider::chain}. This function + * accepts providers as variadic arguments and returns a new function that will + * invoke each provider until a successful configuration is returned. + * + * + * // First try an INI file at this location. + * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = ConfigurationProvider::env(); + * // Combine the three providers together. + * $composed = ConfigurationProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with a configuration or throws. + * $promise = $composed(); + * // Wait on the configuration to resolve. + * $config = $promise->wait(); + * + */ +class ConfigurationProvider extends AbstractConfigurationProvider + implements ConfigurationProviderInterface +{ + const ENV_USE_DUAL_STACK_ENDPOINT = 'AWS_USE_DUALSTACK_ENDPOINT'; + const INI_USE_DUAL_STACK_ENDPOINT = 'use_dualstack_endpoint'; + + public static $cacheKey = 'aws_cached_use_dualstack_endpoint_config'; + + protected static $interfaceClass = ConfigurationInterface::class; + protected static $exceptionClass = ConfigurationException::class; + + /** + * Create a default config provider that first checks for environment + * variables, then checks for a specified profile in the environment-defined + * config file location (env variable is 'AWS_CONFIG_FILE', file location + * defaults to ~/.aws/config), then checks for the "default" profile in the + * environment-defined config file location, and failing those uses a default + * fallback set of configuration options. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided config options. + * + * @param array $config + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $region = $config['region']; + $configProviders = [self::env($region)]; + if ( + !isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] != false + ) { + $configProviders[] = self::ini($region); + } + $configProviders[] = self::fallback($region); + + $memo = self::memoize( + call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders) + ); + + if (isset($config['use_dual_stack_endpoint']) + && $config['use_dual_stack_endpoint'] instanceof CacheInterface + ) { + return self::cache($memo, $config['use_dual_stack_endpoint'], self::$cacheKey); + } + + return $memo; + } + + /** + * Provider that creates config from environment variables. + * + * @return callable + */ + public static function env($region) + { + return function () use ($region) { + // Use config from environment variables, if available + $useDualstackEndpoint = getenv(self::ENV_USE_DUAL_STACK_ENDPOINT); + if (!empty($useDualstackEndpoint)) { + return Promise\Create::promiseFor( + new Configuration($useDualstackEndpoint, $region) + ); + } + + return self::reject('Could not find environment variable config' + . ' in ' . self::ENV_USE_DUAL_STACK_ENDPOINT); + }; + } + + /** + * Config provider that creates config using a config file whose location + * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to + * ~/.aws/config if not specified + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile. + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the default directory. + * + * @return callable + */ + public static function ini($region, $profile = null, $filename = null) + { + $filename = $filename ?: (self::getDefaultConfigFilename()); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($region, $profile, $filename) { + if (!@is_readable($filename)) { + return self::reject("Cannot read configuration from $filename"); + } + + // Use INI_SCANNER_NORMAL instead of INI_SCANNER_TYPED for PHP 5.5 compatibility + $data = \Aws\parse_ini_file($filename, true, INI_SCANNER_NORMAL); + if ($data === false) { + return self::reject("Invalid config file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in config file"); + } + if (!isset($data[$profile][self::INI_USE_DUAL_STACK_ENDPOINT])) { + return self::reject("Required use dualstack endpoint config values + not present in INI profile '{$profile}' ({$filename})"); + } + + // INI_SCANNER_NORMAL parses false-y values as an empty string + if ($data[$profile][self::INI_USE_DUAL_STACK_ENDPOINT] === "") { + $data[$profile][self::INI_USE_DUAL_STACK_ENDPOINT] = false; + } + + return Promise\Create::promiseFor( + new Configuration($data[$profile][self::INI_USE_DUAL_STACK_ENDPOINT], $region) + ); + }; + } + + /** + * Fallback config options when other sources are not set. + * + * @return callable + */ + public static function fallback($region) + { + return function () use ($region) { + return Promise\Create::promiseFor(new Configuration(false, $region)); + }; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Exception/ConfigurationException.php b/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Exception/ConfigurationException.php new file mode 100644 index 0000000..796adc9 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Exception/ConfigurationException.php @@ -0,0 +1,14 @@ +useFipsEndpoint = Aws\boolean_value($useFipsEndpoint); + if (is_null($this->useFipsEndpoint)) { + throw new ConfigurationException("'use_fips_endpoint' config option" + . " must be a boolean value."); + } + } + + /** + * {@inheritdoc} + */ + public function isUseFipsEndpoint() + { + return $this->useFipsEndpoint; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return [ + 'use_fips_endpoint' => $this->isUseFipsEndpoint(), + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/ConfigurationInterface.php b/vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/ConfigurationInterface.php new file mode 100644 index 0000000..da23f87 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/ConfigurationInterface.php @@ -0,0 +1,19 @@ + + * use Aws\Endpoint\UseFipsEndpoint\ConfigurationProvider; + * $provider = ConfigurationProvider::defaultProvider(); + * // Returns a ConfigurationInterface or throws. + * $config = $provider()->wait(); + * + * + * Configuration providers can be composed to create configuration using + * conditional logic that can create different configurations in different + * environments. You can compose multiple providers into a single provider using + * {@see Aws\Endpoint\UseFipsEndpoint\ConfigurationProvider::chain}. This function + * accepts providers as variadic arguments and returns a new function that will + * invoke each provider until a successful configuration is returned. + * + * + * // First try an INI file at this location. + * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = ConfigurationProvider::env(); + * // Combine the three providers together. + * $composed = ConfigurationProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with a configuration or throws. + * $promise = $composed(); + * // Wait on the configuration to resolve. + * $config = $promise->wait(); + * + */ +class ConfigurationProvider extends AbstractConfigurationProvider + implements ConfigurationProviderInterface +{ + const ENV_USE_FIPS_ENDPOINT = 'AWS_USE_FIPS_ENDPOINT'; + const INI_USE_FIPS_ENDPOINT = 'use_fips_endpoint'; + + public static $cacheKey = 'aws_cached_use_fips_endpoint_config'; + + protected static $interfaceClass = ConfigurationInterface::class; + protected static $exceptionClass = ConfigurationException::class; + + /** + * Create a default config provider that first checks for environment + * variables, then checks for a specified profile in the environment-defined + * config file location (env variable is 'AWS_CONFIG_FILE', file location + * defaults to ~/.aws/config), then checks for the "default" profile in the + * environment-defined config file location, and failing those uses a default + * fallback set of configuration options. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided config options. + * + * @param array $config + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $configProviders = [self::env()]; + if ( + !isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] != false + ) { + $configProviders[] = self::ini(); + } + $configProviders[] = self::fallback($config['region']); + + $memo = self::memoize( + call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders) + ); + + if (isset($config['use_fips_endpoint']) + && $config['use_fips_endpoint'] instanceof CacheInterface + ) { + return self::cache($memo, $config['use_fips_endpoint'], self::$cacheKey); + } + + return $memo; + } + + /** + * Provider that creates config from environment variables. + * + * @return callable + */ + public static function env() + { + return function () { + // Use config from environment variables, if available + $useFipsEndpoint = getenv(self::ENV_USE_FIPS_ENDPOINT); + if (!empty($useFipsEndpoint)) { + return Promise\Create::promiseFor( + new Configuration($useFipsEndpoint) + ); + } + + return self::reject('Could not find environment variable config' + . ' in ' . self::ENV_USE_FIPS_ENDPOINT); + }; + } + + /** + * Config provider that creates config using a config file whose location + * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to + * ~/.aws/config if not specified + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile. + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the default directory. + * + * @return callable + */ + public static function ini($profile = null, $filename = null) + { + $filename = $filename ?: (self::getDefaultConfigFilename()); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($profile, $filename) { + if (!@is_readable($filename)) { + return self::reject("Cannot read configuration from $filename"); + } + + // Use INI_SCANNER_NORMAL instead of INI_SCANNER_TYPED for PHP 5.5 compatibility + $data = \Aws\parse_ini_file($filename, true, INI_SCANNER_NORMAL); + if ($data === false) { + return self::reject("Invalid config file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in config file"); + } + if (!isset($data[$profile][self::INI_USE_FIPS_ENDPOINT])) { + return self::reject("Required use fips endpoint config values + not present in INI profile '{$profile}' ({$filename})"); + } + + // INI_SCANNER_NORMAL parses false-y values as an empty string + if ($data[$profile][self::INI_USE_FIPS_ENDPOINT] === "") { + $data[$profile][self::INI_USE_FIPS_ENDPOINT] = false; + } + + return Promise\Create::promiseFor( + new Configuration($data[$profile][self::INI_USE_FIPS_ENDPOINT]) + ); + }; + } + + /** + * Fallback config options when other sources are not set. + * + * @return callable + */ + public static function fallback($region) + { + return function () use ($region) { + $isFipsPseudoRegion = strpos($region, 'fips-') !== false + || strpos($region, '-fips') !== false; + if ($isFipsPseudoRegion){ + $configuration = new Configuration(true); + } else { + $configuration = new Configuration(false); + } + return Promise\Create::promiseFor($configuration); + }; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/Exception/ConfigurationException.php b/vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/Exception/ConfigurationException.php new file mode 100644 index 0000000..468aa65 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/Exception/ConfigurationException.php @@ -0,0 +1,14 @@ +cacheLimit = filter_var($cacheLimit, FILTER_VALIDATE_INT); + if ($this->cacheLimit == false || $this->cacheLimit < 1) { + throw new \InvalidArgumentException( + "'cache_limit' value must be a positive integer." + ); + } + + // Unparsable $enabled flag errs on the side of disabling endpoint discovery + $this->enabled = filter_var($enabled, FILTER_VALIDATE_BOOLEAN); + } + + /** + * {@inheritdoc} + */ + public function isEnabled() + { + return $this->enabled; + } + + /** + * {@inheritdoc} + */ + public function getCacheLimit() + { + return $this->cacheLimit; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return [ + 'enabled' => $this->isEnabled(), + 'cache_limit' => $this->getCacheLimit() + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointDiscovery/ConfigurationInterface.php b/vendor/aws/aws-sdk-php/src/EndpointDiscovery/ConfigurationInterface.php new file mode 100644 index 0000000..3228d1d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointDiscovery/ConfigurationInterface.php @@ -0,0 +1,30 @@ + + * use Aws\EndpointDiscovery\ConfigurationProvider; + * $provider = ConfigurationProvider::defaultProvider(); + * // Returns a ConfigurationInterface or throws. + * $config = $provider()->wait(); + * + * + * Configuration providers can be composed to create configuration using + * conditional logic that can create different configurations in different + * environments. You can compose multiple providers into a single provider using + * {@see Aws\EndpointDiscovery\ConfigurationProvider::chain}. This function + * accepts providers as variadic arguments and returns a new function that will + * invoke each provider until a successful configuration is returned. + * + * + * // First try an INI file at this location. + * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = ConfigurationProvider::env(); + * // Combine the three providers together. + * $composed = ConfigurationProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with a configuration or throws. + * $promise = $composed(); + * // Wait on the configuration to resolve. + * $config = $promise->wait(); + * + */ +class ConfigurationProvider extends AbstractConfigurationProvider + implements ConfigurationProviderInterface +{ + const DEFAULT_ENABLED = false; + const DEFAULT_CACHE_LIMIT = 1000; + const ENV_ENABLED = 'AWS_ENDPOINT_DISCOVERY_ENABLED'; + const ENV_ENABLED_ALT = 'AWS_ENABLE_ENDPOINT_DISCOVERY'; + const ENV_PROFILE = 'AWS_PROFILE'; + + public static $cacheKey = 'aws_cached_endpoint_discovery_config'; + + protected static $interfaceClass = ConfigurationInterface::class; + protected static $exceptionClass = ConfigurationException::class; + + /** + * Create a default config provider that first checks for environment + * variables, then checks for a specified profile in the environment-defined + * config file location (env variable is 'AWS_CONFIG_FILE', file location + * defaults to ~/.aws/config), then checks for the "default" profile in the + * environment-defined config file location, and failing those uses a default + * fallback set of configuration options. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided config options. + * + * @param array $config + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $configProviders = [self::env()]; + if ( + !isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] != false + ) { + $configProviders[] = self::ini(); + } + $configProviders[] = self::fallback($config); + + $memo = self::memoize( + call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders) + ); + + if (isset($config['endpoint_discovery']) + && $config['endpoint_discovery'] instanceof CacheInterface + ) { + return self::cache($memo, $config['endpoint_discovery'], self::$cacheKey); + } + + return $memo; + } + + /** + * Provider that creates config from environment variables. + * + * @param $cacheLimit + * @return callable + */ + public static function env($cacheLimit = self::DEFAULT_CACHE_LIMIT) + { + return function () use ($cacheLimit) { + // Use config from environment variables, if available + $enabled = getenv(self::ENV_ENABLED); + if ($enabled === false || $enabled === '') { + $enabled = getenv(self::ENV_ENABLED_ALT); + } + if ($enabled !== false && $enabled !== '') { + return Promise\Create::promiseFor( + new Configuration($enabled, $cacheLimit) + ); + } + + return self::reject('Could not find environment variable config' + . ' in ' . self::ENV_ENABLED); + }; + } + + /** + * Fallback config options when other sources are not set. Will check the + * service model for any endpoint discovery required operations, and enable + * endpoint discovery in that case. If no required operations found, will use + * the class default values. + * + * @param array $config + * @return callable + */ + public static function fallback($config = []) + { + $enabled = self::DEFAULT_ENABLED; + if (!empty($config['api_provider']) + && !empty($config['service']) + && !empty($config['version']) + ) { + $provider = $config['api_provider']; + $apiData = $provider('api', $config['service'], $config['version']); + if (!empty($apiData['operations'])) { + foreach ($apiData['operations'] as $operation) { + if (!empty($operation['endpointdiscovery']['required'])) { + $enabled = true; + } + } + } + } + + return function () use ($enabled) { + return Promise\Create::promiseFor( + new Configuration( + $enabled, + self::DEFAULT_CACHE_LIMIT + ) + ); + }; + } + + /** + * Config provider that creates config using a config file whose location + * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to + * ~/.aws/config if not specified + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile. + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the default directory. + * @param int $cacheLimit + * + * @return callable + */ + public static function ini( + $profile = null, + $filename = null, + $cacheLimit = self::DEFAULT_CACHE_LIMIT + ) { + $filename = $filename ?: (self::getDefaultConfigFilename()); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($profile, $filename, $cacheLimit) { + if (!@is_readable($filename)) { + return self::reject("Cannot read configuration from $filename"); + } + $data = \Aws\parse_ini_file($filename, true); + if ($data === false) { + return self::reject("Invalid config file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in config file"); + } + if (!isset($data[$profile]['endpoint_discovery_enabled'])) { + return self::reject("Required endpoint discovery config values + not present in INI profile '{$profile}' ({$filename})"); + } + + return Promise\Create::promiseFor( + new Configuration( + $data[$profile]['endpoint_discovery_enabled'], + $cacheLimit + ) + ); + }; + } + + /** + * Unwraps a configuration object in whatever valid form it is in, + * always returning a ConfigurationInterface object. + * + * @param mixed $config + * @return ConfigurationInterface + * @throws \InvalidArgumentException + */ + public static function unwrap($config) + { + if (is_callable($config)) { + $config = $config(); + } + if ($config instanceof PromiseInterface) { + $config = $config->wait(); + } + if ($config instanceof ConfigurationInterface) { + return $config; + } elseif (is_array($config) && isset($config['enabled'])) { + if (isset($config['cache_limit'])) { + return new Configuration( + $config['enabled'], + $config['cache_limit'] + ); + } + return new Configuration( + $config['enabled'], + self::DEFAULT_CACHE_LIMIT + ); + } + + throw new \InvalidArgumentException('Not a valid endpoint_discovery ' + . 'configuration argument.'); + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointDiscovery/EndpointDiscoveryMiddleware.php b/vendor/aws/aws-sdk-php/src/EndpointDiscovery/EndpointDiscoveryMiddleware.php new file mode 100644 index 0000000..30f1820 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointDiscovery/EndpointDiscoveryMiddleware.php @@ -0,0 +1,423 @@ +nextHandler = $handler; + $this->client = $client; + $this->args = $args; + $this->service = $client->getApi(); + $this->config = $config; + } + + public function __invoke(CommandInterface $cmd, RequestInterface $request) + { + $nextHandler = $this->nextHandler; + $op = $this->service->getOperation($cmd->getName())->toArray(); + + // Continue only if endpointdiscovery trait is set + if (isset($op['endpointdiscovery'])) { + $config = ConfigurationProvider::unwrap($this->config); + $isRequired = !empty($op['endpointdiscovery']['required']); + + if ($isRequired && !($config->isEnabled())) { + throw new UnresolvedEndpointException('This operation ' + . 'requires the use of endpoint discovery, but this has ' + . 'been disabled in the configuration. Enable endpoint ' + . 'discovery or use a different operation.'); + } + + // Continue only if enabled by config + if ($config->isEnabled()) { + if (isset($op['endpointoperation'])) { + throw new UnresolvedEndpointException('This operation is ' + . 'contradictorily marked both as using endpoint discovery ' + . 'and being the endpoint discovery operation. Please ' + . 'verify the accuracy of your model files.'); + } + + // Original endpoint may be used if discovery optional + $originalUri = $request->getUri(); + + $identifiers = $this->getIdentifiers($op); + + $cacheKey = $this->getCacheKey( + $this->client->getCredentials()->wait(), + $cmd, + $identifiers + ); + + // Check/create cache + if (!isset(self::$cache)) { + self::$cache = new LruArrayCache($config->getCacheLimit()); + } + + if (empty($endpointList = self::$cache->get($cacheKey))) { + $endpointList = new EndpointList([]); + } + $endpoint = $endpointList->getActive(); + + // Retrieve endpoints if there is no active endpoint + if (empty($endpoint)) { + try { + $endpoint = $this->discoverEndpoint( + $cacheKey, + $cmd, + $identifiers + ); + } catch (\Exception $e) { + // Use cached endpoint, expired or active, if any remain + $endpoint = $endpointList->getEndpoint(); + + if (empty($endpoint)) { + return $this->handleDiscoveryException( + $isRequired, + $originalUri, + $e, + $cmd, + $request + ); + } + } + } + + $request = $this->modifyRequest($request, $endpoint); + + $g = function ($value) use ( + $cacheKey, + $cmd, + $identifiers, + $isRequired, + $originalUri, + $request, + &$endpoint, + &$g + ) { + if ($value instanceof AwsException + && ( + $value->getAwsErrorCode() == 'InvalidEndpointException' + || $value->getStatusCode() == 421 + ) + ) { + return $this->handleInvalidEndpoint( + $cacheKey, + $cmd, + $identifiers, + $isRequired, + $originalUri, + $request, + $value, + $endpoint, + $g + ); + } + + return $value; + }; + + return $nextHandler($cmd, $request)->otherwise($g); + } + } + + return $nextHandler($cmd, $request); + } + + private function discoverEndpoint( + $cacheKey, + CommandInterface $cmd, + array $identifiers + ) { + $discCmd = $this->getDiscoveryCommand($cmd, $identifiers); + $this->discoveryTimes[$cacheKey] = time(); + $result = $this->client->execute($discCmd); + + if (isset($result['Endpoints'])) { + $endpointData = []; + foreach ($result['Endpoints'] as $datum) { + $endpointData[$datum['Address']] = time() + + ($datum['CachePeriodInMinutes'] * 60); + } + $endpointList = new EndpointList($endpointData); + self::$cache->set($cacheKey, $endpointList); + return $endpointList->getEndpoint(); + } + + throw new UnresolvedEndpointException('The endpoint discovery operation ' + . 'yielded a response that did not contain properly formatted ' + . 'endpoint data.'); + } + + private function getCacheKey( + CredentialsInterface $creds, + CommandInterface $cmd, + array $identifiers + ) { + $key = $this->service->getServiceName() . '_' . $creds->getAccessKeyId(); + if (!empty($identifiers)) { + $key .= '_' . $cmd->getName(); + foreach ($identifiers as $identifier) { + $key .= "_{$cmd[$identifier]}"; + } + } + + return $key; + } + + private function getDiscoveryCommand( + CommandInterface $cmd, + array $identifiers + ) { + foreach ($this->service->getOperations() as $op) { + if (isset($op['endpointoperation'])) { + $endpointOperation = $op->toArray()['name']; + break; + } + } + + if (!isset($endpointOperation)) { + throw new UnresolvedEndpointException('This command is set to use ' + . 'endpoint discovery, but no endpoint discovery operation was ' + . 'found. Please verify the accuracy of your model files.'); + } + + $params = []; + if (!empty($identifiers)) { + $params['Operation'] = $cmd->getName(); + $params['Identifiers'] = []; + foreach ($identifiers as $identifier) { + $params['Identifiers'][$identifier] = $cmd[$identifier]; + } + } + $command = $this->client->getCommand($endpointOperation, $params); + $command->getHandlerList()->appendBuild( + Middleware::mapRequest(function (RequestInterface $r) { + return $r->withHeader( + 'x-amz-api-version', + $this->service->getApiVersion() + ); + }), + 'x-amz-api-version-header' + ); + + return $command; + } + + private function getIdentifiers(array $operation) + { + $inputShape = $this->service->getShapeMap() + ->resolve($operation['input']) + ->toArray(); + $identifiers = []; + foreach ($inputShape['members'] as $key => $member) { + if (!empty($member['endpointdiscoveryid'])) { + $identifiers[] = $key; + } + } + return $identifiers; + } + + private function handleDiscoveryException( + $isRequired, + $originalUri, + \Exception $e, + CommandInterface $cmd, + RequestInterface $request + ) { + // If no cached endpoints and discovery required, + // throw exception + if ($isRequired) { + $message = 'The endpoint required for this service is currently ' + . 'unable to be retrieved, and your request can not be fulfilled ' + . 'unless you manually specify an endpoint.'; + throw new AwsException( + $message, + $cmd, + [ + 'code' => 'EndpointDiscoveryException', + 'message' => $message + ], + $e + ); + } + + // If discovery isn't required, use original endpoint + return $this->useOriginalUri( + $originalUri, + $cmd, + $request + ); + } + + private function handleInvalidEndpoint( + $cacheKey, + $cmd, + $identifiers, + $isRequired, + $originalUri, + $request, + $value, + &$endpoint, + &$g + ) { + $nextHandler = $this->nextHandler; + $endpointList = self::$cache->get($cacheKey); + if ($endpointList instanceof EndpointList) { + + // Remove invalid endpoint from cached list + $endpointList->remove($endpoint); + + // If possible, get another cached endpoint + $newEndpoint = $endpointList->getEndpoint(); + } + if (empty($newEndpoint)) { + + // If no more cached endpoints, make discovery call + // if none made within cooldown for given key + if (time() - $this->discoveryTimes[$cacheKey] + < self::$discoveryCooldown + ) { + + // If no more cached endpoints and it's required, + // fail with original exception + if ($isRequired) { + return $value; + } + + // Use original endpoint if not required + return $this->useOriginalUri( + $originalUri, + $cmd, + $request + ); + } + + $newEndpoint = $this->discoverEndpoint( + $cacheKey, + $cmd, + $identifiers + ); + } + $endpoint = $newEndpoint; + $request = $this->modifyRequest($request, $endpoint); + return $nextHandler($cmd, $request)->otherwise($g); + } + + private function modifyRequest(RequestInterface $request, $endpoint) + { + $parsed = $this->parseEndpoint($endpoint); + if (!empty($request->getHeader('User-Agent'))) { + $userAgent = $request->getHeader('User-Agent')[0]; + if (strpos($userAgent, 'endpoint-discovery') === false) { + $userAgent = $userAgent . ' endpoint-discovery'; + } + } else { + $userAgent = 'endpoint-discovery'; + } + + return $request + ->withUri( + $request->getUri() + ->withHost($parsed['host']) + ->withPath($parsed['path']) + ) + ->withHeader('User-Agent', $userAgent); + } + + /** + * Parses an endpoint returned from the discovery API into an array with + * 'host' and 'path' keys. + * + * @param $endpoint + * @return array + */ + private function parseEndpoint($endpoint) + { + $parsed = parse_url($endpoint); + + // parse_url() will correctly parse full URIs with schemes + if (isset($parsed['host'])) { + return $parsed; + } + + // parse_url() will put host & path in 'path' if scheme is not provided + if (isset($parsed['path'])) { + $split = explode('/', $parsed['path'], 2); + $parsed['host'] = $split[0]; + if (isset($split[1])) { + if (substr($split[1], 0 , 1) !== '/') { + $split[1] = '/' . $split[1]; + } + $parsed['path'] = $split[1]; + } else { + $parsed['path'] = ''; + } + return $parsed; + } + + throw new UnresolvedEndpointException("The supplied endpoint '" + . "{$endpoint}' is invalid."); + } + + private function useOriginalUri( + UriInterface $uri, + CommandInterface $cmd, + RequestInterface $request + ) { + $nextHandler = $this->nextHandler; + $endpoint = $uri->getHost() . $uri->getPath(); + $request = $this->modifyRequest( + $request, + $endpoint + ); + return $nextHandler($cmd, $request); + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointDiscovery/EndpointList.php b/vendor/aws/aws-sdk-php/src/EndpointDiscovery/EndpointList.php new file mode 100644 index 0000000..80ccc47 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointDiscovery/EndpointList.php @@ -0,0 +1,85 @@ +active = $endpoints; + reset($this->active); + } + + /** + * Gets an active (unexpired) endpoint. Returns null if none found. + * + * @return null|string + */ + public function getActive() + { + if (count($this->active) < 1) { + return null; + } + while (time() > current($this->active)) { + $key = key($this->active); + $this->expired[$key] = current($this->active); + $this->increment($this->active); + unset($this->active[$key]); + if (count($this->active) < 1) { + return null; + } + } + $active = key($this->active); + $this->increment($this->active); + return $active; + } + + /** + * Gets an active endpoint if possible, then an expired endpoint if possible. + * Returns null if no endpoints found. + * + * @return null|string + */ + public function getEndpoint() + { + if (!empty($active = $this->getActive())) { + return $active; + } + return $this->getExpired(); + } + + /** + * Removes an endpoint from both lists. + * + * @param string $key + */ + public function remove($key) + { + unset($this->active[$key]); + unset($this->expired[$key]); + } + + /** + * Get an expired endpoint. Returns null if none found. + * + * @return null|string + */ + private function getExpired() + { + if (count($this->expired) < 1) { + return null; + } + $expired = key($this->expired); + $this->increment($this->expired); + return $expired; + } + + private function increment(&$array) + { + if (next($array) === false) { + reset($array); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointDiscovery/Exception/ConfigurationException.php b/vendor/aws/aws-sdk-php/src/EndpointDiscovery/Exception/ConfigurationException.php new file mode 100644 index 0000000..f87cdbf --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointDiscovery/Exception/ConfigurationException.php @@ -0,0 +1,14 @@ +nextHandler = $nextHandler; + $this->service = $service; + } + + public function __invoke(CommandInterface $command, RequestInterface $request) + { + $nextHandler = $this->nextHandler; + + $operation = $this->service->getOperation($command->getName()); + + if (!empty($operation['endpoint']['hostPrefix'])) { + $prefix = $operation['endpoint']['hostPrefix']; + + // Captures endpoint parameters stored in the modeled host. + // These are denoted by enclosure in braces, i.e. '{param}' + preg_match_all("/\{([a-zA-Z0-9]+)}/", $prefix, $parameters); + + if (!empty($parameters[1])) { + + // Captured parameters without braces stored in $parameters[1], + // which should correspond to members in the Command object + foreach ($parameters[1] as $index => $parameter) { + if (empty($command[$parameter])) { + throw new \InvalidArgumentException( + "The parameter '{$parameter}' must be set and not empty." + ); + } + + // Captured parameters with braces stored in $parameters[0], + // which are replaced by their corresponding Command value + $prefix = str_replace( + $parameters[0][$index], + $command[$parameter], + $prefix + ); + } + } + + $uri = $request->getUri(); + $host = $prefix . $uri->getHost(); + if (!\Aws\is_valid_hostname($host)) { + throw new \InvalidArgumentException( + "The supplied parameters result in an invalid hostname: '{$host}'." + ); + } + $request = $request->withUri($uri->withHost($host)); + } + + return $nextHandler($command, $request); + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointDefinitionProvider.php b/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointDefinitionProvider.php new file mode 100644 index 0000000..6da2685 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointDefinitionProvider.php @@ -0,0 +1,71 @@ +ruleset = new Ruleset($ruleset, $partitions); + $this->cache = new LruArrayCache(100); + } + + /** + * @return Ruleset + */ + public function getRuleset() + { + return $this->ruleset; + } + + /** + * Given a Ruleset and input parameters, determines the correct endpoint + * or an error to be thrown for a given request. + * + * @return RulesetEndpoint + * @throws UnresolvedEndpointException + */ + public function resolveEndpoint(array $inputParameters) + { + $hashedParams = $this->hashInputParameters($inputParameters); + $match = $this->cache->get($hashedParams); + + if (!is_null($match)) { + return $match; + } + + $endpoint = $this->ruleset->evaluate($inputParameters); + if ($endpoint === false) { + throw new UnresolvedEndpointException( + 'Unable to resolve an endpoint using the provider arguments: ' + . json_encode($inputParameters) + ); + } + $this->cache->set($hashedParams, $endpoint); + + return $endpoint; + } + + private function hashInputParameters($inputParameters) + { + return md5(serialize($inputParameters)); + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointV2Middleware.php b/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointV2Middleware.php new file mode 100644 index 0000000..d9fe443 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointV2Middleware.php @@ -0,0 +1,427 @@ + 'v4', + 'sigv4a' => 'v4a', + 'none' => 'anonymous', + 'bearer' => 'bearer', + 'sigv4-s3express' => 'v4-s3express' + ]; + + /** @var callable */ + private $nextHandler; + + /** @var EndpointProviderV2 */ + private $endpointProvider; + + /** @var Service */ + private $api; + + /** @var array */ + private $clientArgs; + + /** @var Closure */ + private $credentialProvider; + + /** + * Create a middleware wrapper function + * + * @param EndpointProviderV2 $endpointProvider + * @param Service $api + * @param array $args + * @param callable $credentialProvider + * + * @return Closure + */ + public static function wrap( + EndpointProviderV2 $endpointProvider, + Service $api, + array $args, + callable $credentialProvider + ) : Closure + { + return function (callable $handler) use ($endpointProvider, $api, $args, $credentialProvider) { + return new self($handler, $endpointProvider, $api, $args, $credentialProvider); + }; + } + + /** + * @param callable $nextHandler + * @param EndpointProviderV2 $endpointProvider + * @param Service $api + * @param array $args + */ + public function __construct( + callable $nextHandler, + EndpointProviderV2 $endpointProvider, + Service $api, + array $args, + ?callable $credentialProvider = null + ) + { + $this->nextHandler = $nextHandler; + $this->endpointProvider = $endpointProvider; + $this->api = $api; + $this->clientArgs = $args; + $this->credentialProvider = $credentialProvider; + } + + /** + * @param CommandInterface $command + * + * @return Promise + */ + public function __invoke(CommandInterface $command) + { + $nextHandler = $this->nextHandler; + $operation = $this->api->getOperation($command->getName()); + $commandArgs = $command->toArray(); + $providerArgs = $this->resolveArgs($commandArgs, $operation); + + $endpoint = $this->endpointProvider->resolveEndpoint($providerArgs); + + $this->appendEndpointMetrics($providerArgs, $endpoint, $command); + + if (!empty($authSchemes = $endpoint->getProperty('authSchemes'))) { + $this->applyAuthScheme( + $authSchemes, + $command + ); + } + + return $nextHandler($command, $endpoint); + } + + /** + * Resolves client, context params, static context params and endpoint provider + * arguments provided at the command level. + * + * @param array $commandArgs + * @param Operation $operation + * + * @return array + */ + private function resolveArgs(array $commandArgs, Operation $operation): array + { + $rulesetParams = $this->endpointProvider->getRuleset()->getParameters(); + + if (isset($rulesetParams[self::ACCOUNT_ID_PARAM]) + && isset($rulesetParams[self::ACCOUNT_ID_ENDPOINT_MODE_PARAM])) { + $this->clientArgs[self::ACCOUNT_ID_PARAM] = $this->resolveAccountId(); + } + + $endpointCommandArgs = $this->filterEndpointCommandArgs( + $rulesetParams, + $commandArgs + ); + $staticContextParams = $this->bindStaticContextParams( + $operation->getStaticContextParams() + ); + $contextParams = $this->bindContextParams( + $commandArgs, $operation->getContextParams() + ); + $operationContextParams = $this->bindOperationContextParams( + $commandArgs, + $operation->getOperationContextParams() + ); + + return array_merge( + $this->clientArgs, + $operationContextParams, + $contextParams, + $staticContextParams, + $endpointCommandArgs + ); + } + + /** + * Compares Ruleset parameters against Command arguments + * to create a mapping of arguments to pass into the + * endpoint provider for endpoint resolution. + * + * @param array $rulesetParams + * @param array $commandArgs + * @return array + */ + private function filterEndpointCommandArgs( + array $rulesetParams, + array $commandArgs + ): array + { + $endpointMiddlewareOpts = [ + '@use_dual_stack_endpoint' => 'UseDualStack', + '@use_accelerate_endpoint' => 'Accelerate', + '@use_path_style_endpoint' => 'ForcePathStyle' + ]; + + $filteredArgs = []; + + foreach($rulesetParams as $name => $value) { + if (isset($commandArgs[$name])) { + if (!empty($value->getBuiltIn())) { + continue; + } + $filteredArgs[$name] = $commandArgs[$name]; + } + } + + if ($this->api->getServiceName() === 's3') { + foreach($endpointMiddlewareOpts as $optionName => $newValue) { + if (isset($commandArgs[$optionName])) { + $filteredArgs[$newValue] = $commandArgs[$optionName]; + } + } + } + + return $filteredArgs; + } + + /** + * Binds static context params to their corresponding values. + * + * @param $staticContextParams + * + * @return array + */ + private function bindStaticContextParams($staticContextParams): array + { + $scopedParams = []; + + forEach($staticContextParams as $paramName => $paramValue) { + $scopedParams[$paramName] = $paramValue['value']; + } + + return $scopedParams; + } + + /** + * Binds context params to their corresponding values found in + * command arguments. + * + * @param array $commandArgs + * @param array $contextParams + * + * @return array + */ + private function bindContextParams( + array $commandArgs, + array $contextParams + ): array + { + $scopedParams = []; + + foreach($contextParams as $name => $spec) { + if (isset($commandArgs[$spec['shape']])) { + $scopedParams[$name] = $commandArgs[$spec['shape']]; + } + } + + return $scopedParams; + } + + /** + * Binds context params to their corresponding values found in + * command arguments. + * + * @param array $commandArgs + * @param array $contextParams + * + * @return array + */ + private function bindOperationContextParams( + array $commandArgs, + array $operationContextParams + ): array + { + $scopedParams = []; + + foreach($operationContextParams as $name => $spec) { + $scopedValue = search($spec['path'], $commandArgs); + + if ($scopedValue) { + $scopedParams[$name] = $scopedValue; + } + } + + return $scopedParams; + } + + /** + * Applies resolved auth schemes to the command object. + * + * @param $authSchemes + * @param $command + * + * @return void + */ + private function applyAuthScheme( + array $authSchemes, + CommandInterface $command + ): void + { + $authScheme = $this->resolveAuthScheme($authSchemes); + + $command['@context']['signature_version'] = $authScheme['version']; + + if (isset($authScheme['name'])) { + $command['@context']['signing_service'] = $authScheme['name']; + } + + if (isset($authScheme['region'])) { + $command['@context']['signing_region'] = $authScheme['region']; + } elseif (isset($authScheme['signingRegionSet'])) { + $command['@context']['signing_region_set'] = $authScheme['signingRegionSet']; + } + } + + /** + * Returns the first compatible auth scheme in an endpoint object's + * auth schemes. + * + * @param array $authSchemes + * + * @return array + */ + private function resolveAuthScheme(array $authSchemes): array + { + $invalidAuthSchemes = []; + + foreach($authSchemes as $authScheme) { + if ($this->isValidAuthScheme($authScheme['name'])) { + return $this->normalizeAuthScheme($authScheme); + } + $invalidAuthSchemes[$authScheme['name']] = false; + } + + $invalidAuthSchemesString = '`' . implode( + '`, `', + array_keys($invalidAuthSchemes)) + . '`'; + $validAuthSchemesString = '`' + . implode('`, `', array_keys( + array_diff_key(self::$validAuthSchemes, $invalidAuthSchemes)) + ) + . '`'; + throw new UnresolvedAuthSchemeException( + "This operation requests {$invalidAuthSchemesString}" + . " auth schemes, but the client currently supports {$validAuthSchemesString}." + ); + } + + /** + * Normalizes an auth scheme's name, signing region or signing region set + * to the auth keys recognized by the SDK. + * + * @param array $authScheme + * @return array + */ + private function normalizeAuthScheme(array $authScheme): array + { + /* + sigv4a will contain a regionSet property. which is guaranteed to be `*` + for now. The SigV4 class handles this automatically for now. It seems + complexity will be added here in the future. + */ + $normalizedAuthScheme = []; + + if (isset($authScheme['disableDoubleEncoding']) + && $authScheme['disableDoubleEncoding'] === true + && $authScheme['name'] !== 'sigv4a' + && $authScheme['name'] !== 'sigv4-s3express' + ) { + $normalizedAuthScheme['version'] = 's3v4'; + } else { + $normalizedAuthScheme['version'] = self::$validAuthSchemes[$authScheme['name']]; + } + + $normalizedAuthScheme['name'] = $authScheme['signingName'] ?? null; + $normalizedAuthScheme['region'] = $authScheme['signingRegion'] ?? null; + $normalizedAuthScheme['signingRegionSet'] = $authScheme['signingRegionSet'] ?? null; + + return $normalizedAuthScheme; + } + + private function isValidAuthScheme($signatureVersion): bool + { + if (isset(self::$validAuthSchemes[$signatureVersion])) { + if ($signatureVersion === 'sigv4a') { + return extension_loaded('awscrt'); + } + return true; + } + + return false; + } + + /** + * This method tries to resolve an `AccountId` parameter from a resolved identity. + * We will just perform this operation if the parameter `AccountId` is part of the ruleset parameters and + * `AccountIdEndpointMode` is not disabled, otherwise, we will ignore it. + * + * @return null|string + */ + private function resolveAccountId(): ?string + { + if (isset($this->clientArgs[self::ACCOUNT_ID_ENDPOINT_MODE_PARAM]) + && $this->clientArgs[self::ACCOUNT_ID_ENDPOINT_MODE_PARAM] === 'disabled') { + return null; + } + + if (is_null($this->credentialProvider)) { + return null; + } + + $identityProviderFn = $this->credentialProvider; + $identity = $identityProviderFn()->wait(); + + return $identity->getAccountId(); + } + + private function appendEndpointMetrics( + array $providerArgs, + RulesetEndpoint $endpoint, + CommandInterface $command + ): void + { + // Resolved AccountId Metric + if (!empty($providerArgs[self::ACCOUNT_ID_PARAM])) { + $command->getMetricsBuilder()->append(MetricsBuilder::RESOLVED_ACCOUNT_ID); + } + // AccountIdMode Metric + if(!empty($providerArgs[self::ACCOUNT_ID_ENDPOINT_MODE_PARAM])) { + $command->getMetricsBuilder()->identifyMetricByValueAndAppend( + 'account_id_endpoint_mode', + $providerArgs[self::ACCOUNT_ID_ENDPOINT_MODE_PARAM] + ); + } + + // AccountId Endpoint Metric + $command->getMetricsBuilder()->identifyMetricByValueAndAppend( + 'account_id_endpoint', + $endpoint->getUrl() + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointV2SerializerTrait.php b/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointV2SerializerTrait.php new file mode 100644 index 0000000..951cbcb --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/EndpointV2SerializerTrait.php @@ -0,0 +1,77 @@ +applyHeaders($endpoint, $headers); + $resolvedUrl = $endpoint->getUrl(); + $this->applyScheme($resolvedUrl); + $this->endpoint = $this instanceof RestSerializer + ? new Uri($resolvedUrl) + : $resolvedUrl; + } + + /** + * Combines modeled headers and headers resolved from an endpoint object. + * + * @param $endpoint + * @param $headers + * @return void + */ + private function applyHeaders(RulesetEndpoint $endpoint, array &$headers): void + { + if (!is_null($endpoint->getHeaders())) { + $headers = array_merge( + $headers, + $endpoint->getHeaders() + ); + } + } + + /** + * Applies custom HTTP schemes provided in client configuration. + * + * @param $resolvedUrl + * @return void + */ + private function applyScheme(&$resolvedUrl): void + { + $resolvedEndpointScheme = parse_url($resolvedUrl, PHP_URL_SCHEME); + $scheme = $this->endpoint instanceof Uri + ? $this->endpoint->getScheme() + : parse_url($this->endpoint, PHP_URL_SCHEME); + + if (!empty($scheme) && $scheme !== $resolvedEndpointScheme) { + $resolvedUrl = str_replace( + $resolvedEndpointScheme, + $scheme, + $resolvedUrl + ); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/AbstractRule.php b/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/AbstractRule.php new file mode 100644 index 0000000..adedb4e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/AbstractRule.php @@ -0,0 +1,62 @@ +conditions = $definition['conditions']; + $this->documentation = isset($definition['documentation']) ? + $definition['documentation'] : null; + } + + /** + * @return array + */ + public function getConditions() + { + return $this->conditions; + } + + /** + * @return mixed + */ + public function getDocumentation() + { + return $this->documentation; + } + + /** + * Determines if all conditions for a given rule are met. + * + * @return boolean + */ + protected function evaluateConditions( + array &$inputParameters, + RulesetStandardLibrary $standardLibrary + ) + { + foreach($this->getConditions() as $condition) { + $result = $standardLibrary->callFunction($condition, $inputParameters); + if (is_null($result) || $result === false) { + return false; + } + } + return true; + } + + abstract public function evaluate( + array $inputParameters, + RulesetStandardLibrary $standardLibrary + ); +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/EndpointRule.php b/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/EndpointRule.php new file mode 100644 index 0000000..c3a0e9b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/EndpointRule.php @@ -0,0 +1,111 @@ +endpoint = $definition['endpoint']; + } + + /** + * @return array + */ + public function getEndpoint() + { + return $this->endpoint; + } + + /** + * If all the rule's conditions are met, return the resolved + * endpoint object. + * + * @return RulesetEndpoint | null + */ + public function evaluate(array $inputParameters, RulesetStandardLibrary $standardLibrary) + { + if ($this->evaluateConditions($inputParameters, $standardLibrary)) { + return $this->resolve($inputParameters, $standardLibrary); + } + return false; + } + + /** + * Given input parameters, resolve an endpoint in its entirety. + * + * @return RulesetEndpoint + */ + private function resolve( + array $inputParameters, + RulesetStandardLibrary $standardLibrary + ) + { + $uri = $standardLibrary->resolveValue($this->endpoint['url'], $inputParameters); + $properties = isset($this->endpoint['properties']) + ? $this->resolveProperties($this->endpoint['properties'], $inputParameters, $standardLibrary) + : null; + $headers = $this->resolveHeaders($inputParameters, $standardLibrary); + + return new RulesetEndpoint($uri, $properties, $headers); + } + + /** + * Recurse through an endpoint's `properties` attribute, resolving template + * strings when found. Return the fully resolved attribute. + * + * @return array + */ + private function resolveProperties( + $properties, + array $inputParameters, + RulesetStandardLibrary $standardLibrary + ) + { + if (is_array($properties)) { + $propertiesArr = []; + foreach($properties as $key => $val) { + $propertiesArr[$key] = $this->resolveProperties($val, $inputParameters, $standardLibrary); + } + return $propertiesArr; + } elseif ($standardLibrary->isTemplate($properties)) { + return $standardLibrary->resolveTemplateString($properties, $inputParameters); + } + return $properties; + } + + /** + * If present, iterate through an endpoint's headers attribute resolving + * values along the way. Return the fully resolved attribute. + * + * @return array + */ + private function resolveHeaders( + array $inputParameters, + RulesetStandardLibrary $standardLibrary + ) + { + $headers = isset($this->endpoint['headers']) ? $this->endpoint['headers'] : null; + if (is_null($headers)) { + return null; + } + $resolvedHeaders = []; + + foreach($headers as $headerName => $headerValues) { + $resolvedValues = []; + foreach($headerValues as $value) { + $resolvedValue = $standardLibrary->resolveValue($value, $inputParameters, $standardLibrary); + $resolvedValues[] = $resolvedValue; + } + $resolvedHeaders[$headerName] = $resolvedValues; + } + return $resolvedHeaders; + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/ErrorRule.php b/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/ErrorRule.php new file mode 100644 index 0000000..941624a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/ErrorRule.php @@ -0,0 +1,45 @@ +error = $definition['error']; + } + + /** + * @return array + */ + public function getError() + { + return $this->error; + } + + /** + * If an error rule's conditions are met, raise an + * UnresolvedEndpointError containing the fully resolved error string. + * + * @return null + * @throws UnresolvedEndpointException + */ + public function evaluate( + array $inputParameters, + RulesetStandardLibrary $standardLibrary + ) + { + if ($this->evaluateConditions($inputParameters, $standardLibrary)) { + $message = $standardLibrary->resolveValue($this->error, $inputParameters); + throw new UnresolvedEndpointException($message); + } + return false; + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/RuleCreator.php b/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/RuleCreator.php new file mode 100644 index 0000000..279477e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/Rule/RuleCreator.php @@ -0,0 +1,26 @@ +rules = $this->createRules($definition['rules']); + } + + /** + * @return array + */ + public function getRules() + { + return $this->rules; + } + + /** + * If a tree rule's conditions evaluate successfully, iterate over its + * subordinate rules and return a result if there is one. If any of the + * subsequent rules are trees, the function will recurse until it reaches + * an error or an endpoint rule + * + * @return mixed + */ + public function evaluate( + array $inputParameters, + RulesetStandardLibrary $standardLibrary + ) + { + if ($this->evaluateConditions($inputParameters, $standardLibrary)) { + foreach($this->rules as $rule) { + $inputParametersCopy = $inputParameters; + $evaluation = $rule->evaluate($inputParametersCopy, $standardLibrary); + if ($evaluation !== false) { + return $evaluation; + } + } + } + return false; + } + + private function createRules(array $rules) + { + $rulesList = []; + + forEach($rules as $rule) { + $ruleType = RuleCreator::create($rule['type'], $rule); + $rulesList[] = $ruleType; + } + return $rulesList; + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/Ruleset.php b/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/Ruleset.php new file mode 100644 index 0000000..21828c1 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/Ruleset.php @@ -0,0 +1,117 @@ +version = $ruleset['version']; + $this->parameters = $this->createParameters($ruleset['parameters']); + $this->rules = $this->createRules($ruleset['rules']); + $this->standardLibrary = new RulesetStandardLibrary($partitions); + } + + /** + * @return mixed + */ + public function getVersion() + { + return $this->version; + } + + /** + * @return array + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * @return array + */ + public function getRules() + { + return $this->rules; + } + + /** + * Evaluate the ruleset against the input parameters. + * Return the first rule the parameters match against. + * + * @return mixed + */ + public function evaluate(array $inputParameters) + { + $this->validateInputParameters($inputParameters); + + foreach($this->rules as $rule) { + $evaluation = $rule->evaluate($inputParameters, $this->standardLibrary); + if ($evaluation !== false) { + return $evaluation; + } + } + return false; + } + + /** + * Ensures all corresponding client-provided parameters match + * the Ruleset parameter's specified type. + * + * @return void + */ + private function validateInputParameters(array &$inputParameters) + { + foreach($this->parameters as $paramName => $param) { + $inputParam = isset($inputParameters[$paramName]) ? $inputParameters[$paramName] : null; + + if (is_null($inputParam) && !is_null($param->getDefault())) { + $inputParameters[$paramName] = $param->getDefault(); + } elseif (!is_null($inputParam)) { + $param->validateInputParam($inputParam); + } + } + } + + private function createParameters(array $parameters) + { + $parameterList = []; + + foreach($parameters as $name => $definition) { + $parameterList[$name] = new RulesetParameter($name, $definition); + } + + return $parameterList; + } + + private function createRules(array $rules) + { + $rulesList = []; + + forEach($rules as $rule) { + $ruleObj = RuleCreator::create($rule['type'], $rule); + $rulesList[] = $ruleObj; + } + return $rulesList; + } +} + diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetEndpoint.php b/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetEndpoint.php new file mode 100644 index 0000000..46f844e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetEndpoint.php @@ -0,0 +1,63 @@ +url = $url; + $this->properties = $properties; + $this->headers = $headers; + } + + /** + * @return mixed + */ + public function getUrl() + { + return $this->url; + } + + /** + * @param $property + * @return mixed + */ + public function getProperty($property) + { + if (isset($this->properties[$property])) { + return $this->properties[$property]; + } + + return null; + } + + /** + * @return mixed + */ + public function getProperties() + { + return $this->properties; + } + + /** + * @return mixed + */ + public function getHeaders() + { + return $this->headers; + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetParameter.php b/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetParameter.php new file mode 100644 index 0000000..1a3322c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetParameter.php @@ -0,0 +1,179 @@ + */ + private static $typeMap = [ + 'String' => 'is_string', + 'Boolean' => 'is_bool', + 'StringArray' => 'isStringArray' + ]; + + public function __construct($name, array $definition) + { + $type = ucfirst($definition['type']); + if ($this->isValidType($type)) { + $this->type = $type; + } else { + throw new UnresolvedEndpointException( + 'Unknown parameter type ' . "`{$type}`" . + '. Parameters must be of type `String`, `Boolean` or `StringArray.' + ); + } + + $this->name = $name; + $this->builtIn = $definition['builtIn'] ?? null; + $this->default = $definition['default'] ?? null; + $this->required = $definition['required'] ?? false; + $this->documentation = $definition['documentation'] ?? null; + $this->deprecated = $definition['deprecated'] ?? false; + } + + /** + * @return mixed + */ + public function getName() + { + return $this->name; + } + + /** + * @return mixed + */ + public function getType() + { + return $this->type; + } + + /** + * @return mixed + */ + public function getBuiltIn() + { + return $this->builtIn; + } + + /** + * @return mixed + */ + public function getDefault() + { + return $this->default; + } + + /** + * @return boolean + */ + public function getRequired() + { + return $this->required; + } + + /** + * @return string + */ + public function getDocumentation() + { + return $this->documentation; + } + + /** + * @return boolean + */ + public function getDeprecated() + { + return $this->deprecated; + } + + /** + * Validates that an input parameter matches the type provided in its definition. + * + * @return void + * @throws InvalidArgumentException + */ + public function validateInputParam($inputParam) + { + if (!$this->isValidInput($inputParam)) { + throw new UnresolvedEndpointException( + "Input parameter `{$this->name}` is the wrong type. Must be a {$this->type}." + ); + } + + if ($this->deprecated) { + $deprecated = $this->deprecated; + $deprecationString = "{$this->name} has been deprecated "; + $msg = $deprecated['message'] ?? null; + $since = $deprecated['since'] ?? null; + + if (!is_null($since)){ + $deprecationString .= 'since ' . $since . '. '; + } + if (!is_null($msg)) { + $deprecationString .= $msg; + } + + trigger_error($deprecationString, E_USER_WARNING); + } + } + + private function isValidType($type) + { + return isset(self::$typeMap[$type]); + } + + private function isValidInput($inputParam): bool + { + $method = self::$typeMap[$this->type]; + if (is_callable($method)) { + return $method($inputParam); + } elseif (method_exists($this, $method)) { + return $this->$method($inputParam); + } + + return false; + } + + private function isStringArray(array $array): bool + { + if (is_associative($array)) { + return false; + } + + foreach($array as $value) { + if (!is_string($value)) { + return false; + } + } + + return true; + } +} diff --git a/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetStandardLibrary.php b/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetStandardLibrary.php new file mode 100644 index 0000000..910bc5a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetStandardLibrary.php @@ -0,0 +1,434 @@ +[^\{\}]+)|(?R))*\}#x'; + const HOST_LABEL_RE = '/^(?!-)[a-zA-Z\d-]{1,63}(?partitions = $partitions; + } + + /** + * Determines if a value is set. + * + * @return boolean + */ + public function is_set($value) + { + return isset($value); + } + + /** + * Function implementation of logical operator `not` + * + * @return boolean + */ + public function not($value) + { + return !$value; + } + + /** + * Find an attribute within a value given a path string. + * + * @return mixed + */ + public function getAttr($from, $path) + { + // Handles the case where "[= $stop or strlen($input) < $stop) { + return null; + } + if (!$reverse) { + return substr($input, $start, $stop - $start); + } else { + $offset = strlen($input) - $stop; + $length = $stop - $start; + return substr($input, $offset, $length); + } + } + + /** + * Evaluates two strings for equality. + * + * @return boolean + */ + public function stringEquals($string1, $string2) + { + if (!is_string($string1) || !is_string($string2)) { + throw new UnresolvedEndpointException( + 'Values passed to StringEquals must be `string`.' + ); + } + return $string1 === $string2; + } + + /** + * Evaluates two booleans for equality. + * + * @return boolean + */ + public function booleanEquals($boolean1, $boolean2) + { + return + filter_var($boolean1, FILTER_VALIDATE_BOOLEAN) + === filter_var($boolean2, FILTER_VALIDATE_BOOLEAN); + } + + /** + * Percent-encodes an input string. + * + * @return mixed + */ + public function uriEncode($input) + { + if (is_null($input)) { + return null; + } + return str_replace('%7E', '~', rawurlencode($input)); + } + + /** + * Parses URL string into components. + * + * @return mixed + */ + public function parseUrl($url) + { + if (is_null($url)) { + return null; + } + + $parsed = parse_url($url); + + if ($parsed === false || !empty($parsed['query'])) { + return null; + } elseif (!isset($parsed['scheme'])) { + return null; + } + + if ($parsed['scheme'] !== 'http' + && $parsed['scheme'] !== 'https' + ) { + return null; + } + + $urlInfo = []; + $urlInfo['scheme'] = $parsed['scheme']; + $urlInfo['authority'] = isset($parsed['host']) ? $parsed['host'] : ''; + if (isset($parsed['port'])) { + $urlInfo['authority'] = $urlInfo['authority'] . ":" . $parsed['port']; + } + $urlInfo['path'] = isset($parsed['path']) ? $parsed['path'] : ''; + $urlInfo['normalizedPath'] = !empty($parsed['path']) + ? rtrim($urlInfo['path'] ?: '', '/' . "/") . '/' + : '/'; + $urlInfo['isIp'] = !isset($parsed['host']) ? + 'false' : $this->isValidIp($parsed['host']); + + return $urlInfo; + } + + /** + * Evaluates whether a value is a valid host label per + * RFC 1123. If allow_subdomains is true, split on `.` and validate + * each subdomain separately. + * + * @return boolean + */ + public function isValidHostLabel($hostLabel, $allowSubDomains) + { + if (!isset($hostLabel) + || (!$allowSubDomains && strpos($hostLabel, '.') != false) + ) { + return false; + } + + if ($allowSubDomains) { + foreach (explode('.', $hostLabel) as $subdomain) { + if (!$this->validateHostLabel($subdomain)) { + return false; + } + } + return true; + } else { + return $this->validateHostLabel($hostLabel); + } + } + + /** + * Parse and validate string for ARN components. + * + * @return array|null + */ + public function parseArn($arnString) + { + if (is_null($arnString) + || substr( $arnString, 0, 3 ) !== "arn" + ) { + return null; + } + + $arn = []; + $parts = explode(':', $arnString, 6); + if (sizeof($parts) < 6) { + return null; + } + + $arn['partition'] = isset($parts[1]) ? $parts[1] : null; + $arn['service'] = isset($parts[2]) ? $parts[2] : null; + $arn['region'] = isset($parts[3]) ? $parts[3] : null; + $arn['accountId'] = isset($parts[4]) ? $parts[4] : null; + $arn['resourceId'] = isset($parts[5]) ? $parts[5] : null; + + if (empty($arn['partition']) + || empty($arn['service']) + || empty($arn['resourceId']) + ) { + return null; + } + $resource = $arn['resourceId']; + $arn['resourceId'] = preg_split("/[:\/]/", $resource); + + return $arn; + } + + /** + * Matches a region string to an AWS partition. + * + * @return mixed + */ + public function partition($region) + { + if (!is_string($region)) { + throw new UnresolvedEndpointException( + 'Value passed to `partition` must be `string`.' + ); + } + + $partitions = $this->partitions; + foreach ($partitions['partitions'] as $partition) { + if (array_key_exists($region, $partition['regions']) + || preg_match("/{$partition['regionRegex']}/", $region) + ) { + return $partition['outputs']; + } + } + //return `aws` partition if no match is found. + return $partitions['partitions'][0]['outputs']; + } + + /** + * Evaluates whether a value is a valid bucket name for virtual host + * style bucket URLs. + * + * @return boolean + */ + public function isVirtualHostableS3Bucket($bucketName, $allowSubdomains) + { + if ((is_null($bucketName) + || (strlen($bucketName) < 3 || strlen($bucketName) > 63)) + || preg_match(self::IPV4_RE, $bucketName) + || strtolower($bucketName) !== $bucketName + ) { + return false; + } + + if ($allowSubdomains) { + $labels = explode('.', $bucketName); + $results = []; + forEach($labels as $label) { + $results[] = $this->isVirtualHostableS3Bucket($label, false); + } + return !in_array(false, $results); + } + return $this->isValidHostLabel($bucketName, false); + } + + public function callFunction($funcCondition, &$inputParameters) + { + $funcArgs = []; + + forEach($funcCondition['argv'] as $arg) { + $funcArgs[] = $this->resolveValue($arg, $inputParameters); + } + + $funcName = str_replace('aws.', '', $funcCondition['fn']); + if ($funcName === 'isSet') { + $funcName = 'is_set'; + } + + $result = call_user_func_array( + [RulesetStandardLibrary::class, $funcName], + $funcArgs + ); + + if (isset($funcCondition['assign'])) { + $assign = $funcCondition['assign']; + if (isset($inputParameters[$assign])){ + throw new UnresolvedEndpointException( + "Assignment `{$assign}` already exists in input parameters" . + " or has already been assigned by an endpoint rule and cannot be overwritten." + ); + } + $inputParameters[$assign] = $result; + } + return $result; + } + + public function resolveValue($value, $inputParameters) + { + //Given a value, check if it's a function, reference or template. + //returns resolved value + if ($this->isFunc($value)) { + return $this->callFunction($value, $inputParameters); + } elseif ($this->isRef($value)) { + return isset($inputParameters[$value['ref']]) ? $inputParameters[$value['ref']] : null; + } elseif ($this->isTemplate($value)) { + return $this->resolveTemplateString($value, $inputParameters); + } + return $value; + } + + public function isFunc($arg) + { + return is_array($arg) && isset($arg['fn']); + } + + public function isRef($arg) + { + return is_array($arg) && isset($arg['ref']); + } + + public function isTemplate($arg) + { + return is_string($arg) && !empty(preg_match(self::TEMPLATE_SEARCH_RE, $arg)); + } + + public function resolveTemplateString($value, $inputParameters) + { + return preg_replace_callback( + self::TEMPLATE_PARSE_RE, + function ($match) use ($inputParameters) { + if (preg_match(self::TEMPLATE_ESCAPE_RE, $match[0])) { + return $match[1]; + } + + $notFoundMessage = 'Resolved value was null. Please check rules and ' . + 'input parameters and try again.'; + + $parts = explode("#", $match[1]); + if (count($parts) > 1) { + $resolvedValue = $inputParameters; + foreach($parts as $part) { + if (!isset($resolvedValue[$part])) { + throw new UnresolvedEndpointException($notFoundMessage); + } + $resolvedValue = $resolvedValue[$part]; + } + return $resolvedValue; + } else { + if (!isset($inputParameters[$parts[0]])) { + throw new UnresolvedEndpointException($notFoundMessage); + } + return $inputParameters[$parts[0]]; + } + }, + $value + ); + } + + private function validateHostLabel ($hostLabel) + { + if (empty($hostLabel) || strlen($hostLabel) > 63) { + return false; + } + if (preg_match(self::HOST_LABEL_RE, $hostLabel)) { + return true; + } + return false; + } + + private function isValidIp($hostName) + { + $isWrapped = strpos($hostName, '[') === 0 + && strrpos($hostName, ']') === strlen($hostName) - 1; + + return preg_match( + self::IPV4_RE, + $hostName + ) + //IPV6 enclosed in brackets + || ($isWrapped && preg_match( + self::IPV6_RE, + $hostName + )) + ? 'true' : 'false'; + } +} diff --git a/vendor/aws/aws-sdk-php/src/EntityResolution/EntityResolutionClient.php b/vendor/aws/aws-sdk-php/src/EntityResolution/EntityResolutionClient.php new file mode 100644 index 0000000..d71474c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/EntityResolution/EntityResolutionClient.php @@ -0,0 +1,85 @@ +data = $context['body'] ?? []; + $this->command = $command; + $this->response = $context['response'] ?? null; + $this->request = $context['request'] ?? null; + $this->requestId = $context['request_id'] ?? null; + $this->errorType = $context['type'] ?? null; + $this->errorCode = $context['code'] ?? null; + $this->errorShape = $context['error_shape'] ?? null; + $this->connectionError = !empty($context['connection_error']); + $this->result = $context['result'] ?? null; + $this->transferInfo = $context['transfer_stats'] ?? []; + $this->errorMessage = $context['message'] ?? null; + $this->monitoringEvents = []; + $this->maxRetriesExceeded = false; + parent::__construct($message, 0, $previous); + } + + public function __toString() + { + if (!$this->getPrevious()) { + return parent::__toString(); + } + + // PHP strangely shows the innermost exception first before the outer + // exception message. It also has a default character limit for + // exception message strings such that the "next" exception (this one) + // might not even get shown, causing developers to attempt to catch + // the inner exception instead of the actual exception because they + // can't see the outer exception's __toString output. + return sprintf( + "exception '%s' with message '%s'\n\n%s", + get_class($this), + $this->getMessage(), + parent::__toString() + ); + } + + /** + * Get the command that was executed. + * + * @return CommandInterface + */ + public function getCommand() + { + return $this->command; + } + + /** + * Get the concise error message if any. + * + * @return string|null + */ + public function getAwsErrorMessage() + { + return $this->errorMessage; + } + + /** + * Get the sent HTTP request if any. + * + * @return RequestInterface|null + */ + public function getRequest() + { + return $this->request; + } + + /** + * Get the received HTTP response if any. + * + * @return ResponseInterface|null + */ + public function getResponse() + { + return $this->response; + } + + /** + * Get the result of the exception if available + * + * @return ResultInterface|null + */ + public function getResult() + { + return $this->result; + } + + /** + * Returns true if this is a connection error. + * + * @return bool + */ + public function isConnectionError() + { + return $this->connectionError; + } + + /** + * If available, gets the HTTP status code of the corresponding response + * + * @return int|null + */ + public function getStatusCode() + { + return $this->response ? $this->response->getStatusCode() : null; + } + + /** + * Get the request ID of the error. This value is only present if a + * response was received and is not present in the event of a networking + * error. + * + * @return string|null Returns null if no response was received + */ + public function getAwsRequestId() + { + return $this->requestId; + } + + /** + * Get the AWS error type. + * + * @return string|null Returns null if no response was received + */ + public function getAwsErrorType() + { + return $this->errorType; + } + + /** + * Get the AWS error code. + * + * @return string|null Returns null if no response was received + */ + public function getAwsErrorCode() + { + return $this->errorCode; + } + + /** + * Get the AWS error shape. + * + * @return Shape|null Returns null if no response was received + */ + public function getAwsErrorShape() + { + return $this->errorShape; + } + + /** + * Get all transfer information as an associative array if no $name + * argument is supplied, or gets a specific transfer statistic if + * a $name attribute is supplied (e.g., 'retries_attempted'). + * + * @param string $name Name of the transfer stat to retrieve + * + * @return mixed|null|array + */ + public function getTransferInfo($name = null) + { + if (!$name) { + return $this->transferInfo; + } + + return $this->transferInfo[$name] ?? null; + } + + /** + * Replace the transfer information associated with an exception. + * + * @param array $info + */ + public function setTransferInfo(array $info) + { + $this->transferInfo = $info; + } + + /** + * Returns whether the max number of retries is exceeded. + * + * @return bool + */ + public function isMaxRetriesExceeded() + { + return $this->maxRetriesExceeded; + } + + /** + * Sets the flag for max number of retries exceeded. + */ + public function setMaxRetriesExceeded() + { + $this->maxRetriesExceeded = true; + } + + public function hasKey($name) + { + return isset($this->data[$name]); + } + + public function get($key) + { + return $this[$key]; + } + + public function search($expression) + { + return JmesPath::search($expression, $this->toArray()); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Exception/CommonRuntimeException.php b/vendor/aws/aws-sdk-php/src/Exception/CommonRuntimeException.php new file mode 100644 index 0000000..d17cd3a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Exception/CommonRuntimeException.php @@ -0,0 +1,7 @@ +errorCode = $code; + $this->errorMessage = $message; + parent::__construct($message); + } + + /** + * Get the AWS error code. + * + * @return string|null Returns null if no response was received + */ + public function getAwsErrorCode() + { + return $this->errorCode; + } + + /** + * Get the concise error message if any. + * + * @return string|null + */ + public function getAwsErrorMessage() + { + return $this->errorMessage; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Exception/IncalculablePayloadException.php b/vendor/aws/aws-sdk-php/src/Exception/IncalculablePayloadException.php new file mode 100644 index 0000000..a64e742 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Exception/IncalculablePayloadException.php @@ -0,0 +1,11 @@ + 'uploading parts to']); + $msg .= ". The following parts had errors:\n"; + /** @var $error AwsException */ + foreach ($prev as $part => $error) { + $msg .= "- Part {$part}: " . $error->getMessage(). "\n"; + } + } elseif ($prev instanceof AwsException) { + switch ($prev->getCommand()->getName()) { + case 'CreateMultipartUpload': + case 'InitiateMultipartUpload': + $action = 'initiating'; + break; + case 'CompleteMultipartUpload': + $action = 'completing'; + break; + } + if (isset($action)) { + $msg = strtr($msg, ['performing' => $action]); + } + $msg .= ": {$prev->getMessage()}"; + } + + if (!$prev instanceof \Exception) { + $prev = null; + } + + parent::__construct($msg, 0, $prev); + $this->state = $state; + } + + /** + * Get the state of the transfer + * + * @return UploadState + */ + public function getState() + { + return $this->state; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Exception/TokenException.php b/vendor/aws/aws-sdk-php/src/Exception/TokenException.php new file mode 100644 index 0000000..f669601 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Exception/TokenException.php @@ -0,0 +1,11 @@ +client = $client ?: new Client(); + } + + /** + * @param Psr7Request $request + * @param array $options + * + * @return Promise\Promise + */ + public function __invoke(Psr7Request $request, array $options = []) + { + $request = $request->withHeader( + 'User-Agent', + $request->getHeaderLine('User-Agent') + . ' ' . Utils::defaultUserAgent() + ); + + return $this->client->sendAsync($request, $this->parseOptions($options)) + ->otherwise( + static function ($e) { + $error = [ + 'exception' => $e, + 'connection_error' => $e instanceof ConnectException, + 'response' => null, + ]; + + if ( + ($e instanceof RequestException) + && $e->getResponse() + ) { + $error['response'] = $e->getResponse(); + } + + return new Promise\RejectedPromise($error); + } + ); + } + + private function parseOptions(array $options) + { + if (isset($options['http_stats_receiver'])) { + $fn = $options['http_stats_receiver']; + unset($options['http_stats_receiver']); + + $prev = isset($options['on_stats']) + ? $options['on_stats'] + : null; + + $options['on_stats'] = static function ( + TransferStats $stats + ) use ($fn, $prev) { + if (is_callable($prev)) { + $prev($stats); + } + $transferStats = ['total_time' => $stats->getTransferTime()]; + $transferStats += $stats->getHandlerStats(); + $fn($transferStats); + }; + } + + return $options; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Handler/GuzzleV6/GuzzleHandler.php b/vendor/aws/aws-sdk-php/src/Handler/GuzzleV6/GuzzleHandler.php new file mode 100644 index 0000000..9d08d2a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Handler/GuzzleV6/GuzzleHandler.php @@ -0,0 +1,11 @@ + [], + self::SIGN => [], + self::BUILD => [], + self::VALIDATE => [], + self::INIT => [], + ]; + + /** + * @param callable $handler HTTP handler. + */ + public function __construct(?callable $handler = null) + { + $this->handler = $handler; + } + + /** + * Dumps a string representation of the list. + * + * @return string + */ + public function __toString() + { + $str = ''; + $i = 0; + + foreach (array_reverse($this->steps) as $k => $step) { + foreach (array_reverse($step) as $j => $tuple) { + $str .= "{$i}) Step: {$k}, "; + if ($tuple[1]) { + $str .= "Name: {$tuple[1]}, "; + } + $str .= "Function: " . $this->debugCallable($tuple[0]) . "\n"; + $i++; + } + } + + if ($this->handler) { + $str .= "{$i}) Handler: " . $this->debugCallable($this->handler) . "\n"; + } + + return $str; + } + + /** + * Set the HTTP handler that actually returns a response. + * + * @param callable $handler Function that accepts a request and array of + * options and returns a Promise. + */ + public function setHandler(callable $handler) + { + $this->handler = $handler; + } + + /** + * Returns true if the builder has a handler. + * + * @return bool + */ + public function hasHandler() + { + return (bool) $this->handler; + } + + /** + * Checks if a middleware exists. The middleware + * should have been added with a name in order to + * use this method. + * + * @param string $name + * + * @return bool + */ + public function hasMiddleware(string $name): bool + { + return isset($this->named[$name]); + } + + /** + * Append a middleware to the init step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function appendInit(callable $middleware, $name = null) + { + $this->add(self::INIT, $name, $middleware); + } + + /** + * Prepend a middleware to the init step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function prependInit(callable $middleware, $name = null) + { + $this->add(self::INIT, $name, $middleware, true); + } + + /** + * Append a middleware to the validate step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function appendValidate(callable $middleware, $name = null) + { + $this->add(self::VALIDATE, $name, $middleware); + } + + /** + * Prepend a middleware to the validate step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function prependValidate(callable $middleware, $name = null) + { + $this->add(self::VALIDATE, $name, $middleware, true); + } + + /** + * Append a middleware to the build step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function appendBuild(callable $middleware, $name = null) + { + $this->add(self::BUILD, $name, $middleware); + } + + /** + * Prepend a middleware to the build step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function prependBuild(callable $middleware, $name = null) + { + $this->add(self::BUILD, $name, $middleware, true); + } + + /** + * Append a middleware to the sign step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function appendSign(callable $middleware, $name = null) + { + $this->add(self::SIGN, $name, $middleware); + } + + /** + * Prepend a middleware to the sign step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function prependSign(callable $middleware, $name = null) + { + $this->add(self::SIGN, $name, $middleware, true); + } + + /** + * Append a middleware to the attempt step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function appendAttempt(callable $middleware, $name = null) + { + $this->add(self::ATTEMPT, $name, $middleware); + } + + /** + * Prepend a middleware to the attempt step. + * + * @param callable $middleware Middleware function to add. + * @param string $name Name of the middleware. + */ + public function prependAttempt(callable $middleware, $name = null) + { + $this->add(self::ATTEMPT, $name, $middleware, true); + } + + /** + * Add a middleware before the given middleware by name. + * + * @param string|callable $findName Add before this + * @param string $withName Optional name to give the middleware + * @param callable $middleware Middleware to add. + */ + public function before($findName, $withName, callable $middleware) + { + $this->splice($findName, $withName, $middleware, true); + } + + /** + * Add a middleware after the given middleware by name. + * + * @param string|callable $findName Add after this + * @param string $withName Optional name to give the middleware + * @param callable $middleware Middleware to add. + */ + public function after($findName, $withName, callable $middleware) + { + $this->splice($findName, $withName, $middleware, false); + } + + /** + * Remove a middleware by name or by instance from the list. + * + * @param string|callable $nameOrInstance Middleware to remove. + */ + public function remove($nameOrInstance) + { + if (is_callable($nameOrInstance)) { + $this->removeByInstance($nameOrInstance); + } elseif (is_string($nameOrInstance)) { + $this->removeByName($nameOrInstance); + } + } + + /** + * Interpose a function between each middleware (e.g., allowing for a trace + * through the middleware layers). + * + * The interpose function is a function that accepts a "step" argument as a + * string and a "name" argument string. This function must then return a + * function that accepts the next handler in the list. This function must + * then return a function that accepts a CommandInterface and optional + * RequestInterface and returns a promise that is fulfilled with an + * Aws\ResultInterface or rejected with an Aws\Exception\AwsException + * object. + * + * @param callable|null $fn Pass null to remove any previously set function + */ + public function interpose(?callable $fn = null) + { + $this->sorted = null; + $this->interposeFn = $fn; + } + + /** + * Compose the middleware and handler into a single callable function. + * + * @return callable + */ + public function resolve() + { + if (!($prev = $this->handler)) { + throw new \LogicException('No handler has been specified'); + } + + if ($this->sorted === null) { + $this->sortMiddleware(); + } + + foreach ($this->sorted as $fn) { + $prev = $fn($prev); + } + + return $prev; + } + + /** + * @return int + */ + #[\ReturnTypeWillChange] + public function count() + { + return count($this->steps[self::INIT]) + + count($this->steps[self::VALIDATE]) + + count($this->steps[self::BUILD]) + + count($this->steps[self::SIGN]) + + count($this->steps[self::ATTEMPT]); + } + + /** + * Splices a function into the middleware list at a specific position. + * + * @param $findName + * @param $withName + * @param callable $middleware + * @param $before + */ + private function splice($findName, $withName, callable $middleware, $before) + { + if (!isset($this->named[$findName])) { + throw new \InvalidArgumentException("$findName not found"); + } + + $idx = $this->sorted = null; + $step = $this->named[$findName]; + + if ($withName) { + $this->named[$withName] = $step; + } + + foreach ($this->steps[$step] as $i => $tuple) { + if ($tuple[1] === $findName) { + $idx = $i; + break; + } + } + + $replacement = $before + ? [$this->steps[$step][$idx], [$middleware, $withName]] + : [[$middleware, $withName], $this->steps[$step][$idx]]; + array_splice($this->steps[$step], $idx, 1, $replacement); + } + + /** + * Provides a debug string for a given callable. + * + * @param array|callable $fn Function to write as a string. + * + * @return string + */ + private function debugCallable($fn) + { + if (is_string($fn)) { + return "callable({$fn})"; + } + + if (is_array($fn)) { + $ele = is_string($fn[0]) ? $fn[0] : get_class($fn[0]); + return "callable(['{$ele}', '{$fn[1]}'])"; + } + + return 'callable(' . spl_object_hash($fn) . ')'; + } + + /** + * Sort the middleware, and interpose if needed in the sorted list. + */ + private function sortMiddleware() + { + $this->sorted = []; + + if (!$this->interposeFn) { + foreach ($this->steps as $step) { + foreach ($step as $fn) { + $this->sorted[] = $fn[0]; + } + } + return; + } + + $ifn = $this->interposeFn; + // Interpose the interposeFn into the handler stack. + foreach ($this->steps as $stepName => $step) { + foreach ($step as $fn) { + $this->sorted[] = $ifn($stepName, $fn[1]); + $this->sorted[] = $fn[0]; + } + } + } + + private function removeByName($name) + { + if (!isset($this->named[$name])) { + return; + } + + $this->sorted = null; + $step = $this->named[$name]; + $this->steps[$step] = array_values( + array_filter( + $this->steps[$step], + function ($tuple) use ($name) { + return $tuple[1] !== $name; + } + ) + ); + } + + private function removeByInstance(callable $fn) + { + foreach ($this->steps as $k => $step) { + foreach ($step as $j => $tuple) { + if ($tuple[0] === $fn) { + $this->sorted = null; + unset($this->named[$this->steps[$k][$j][1]]); + unset($this->steps[$k][$j]); + } + } + } + } + + /** + * Add a middleware to a step. + * + * @param string $step Middleware step. + * @param string $name Middleware name. + * @param callable $middleware Middleware function to add. + * @param bool $prepend Prepend instead of append. + */ + private function add($step, $name, callable $middleware, $prepend = false) + { + $this->sorted = null; + + if ($prepend) { + $this->steps[$step][] = [$middleware, $name]; + } else { + array_unshift($this->steps[$step], [$middleware, $name]); + } + + if ($name) { + $this->named[$name] = $step; + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/HasDataTrait.php b/vendor/aws/aws-sdk-php/src/HasDataTrait.php new file mode 100644 index 0000000..5910fff --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/HasDataTrait.php @@ -0,0 +1,81 @@ +data); + } + + /** + * This method returns a reference to the variable to allow for indirect + * array modification (e.g., $foo['bar']['baz'] = 'qux'). + * + * @param $offset + * + * @return mixed|null + */ + #[\ReturnTypeWillChange] + public function & offsetGet($offset) + { + if (isset($this->data[$offset])) { + return $this->data[$offset]; + } + + $value = null; + return $value; + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetSet($offset, $value) + { + $this->data[$offset] = $value; + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + return isset($this->data[$offset]); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetUnset($offset) + { + unset($this->data[$offset]); + } + + public function toArray() + { + return $this->data; + } + + /** + * @return int + */ + #[\ReturnTypeWillChange] + public function count() + { + return count($this->data); + } +} diff --git a/vendor/aws/aws-sdk-php/src/HasMonitoringEventsTrait.php b/vendor/aws/aws-sdk-php/src/HasMonitoringEventsTrait.php new file mode 100644 index 0000000..b28f0a4 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/HasMonitoringEventsTrait.php @@ -0,0 +1,39 @@ +monitoringEvents; + } + + /** + * Prepend a client-side monitoring event to this object's event list + * + * @param array $event + */ + public function prependMonitoringEvent(array $event) + { + array_unshift($this->monitoringEvents, $event); + } + + /** + * Append a client-side monitoring event to this object's event list + * + * @param array $event + */ + public function appendMonitoringEvent(array $event) + { + $this->monitoringEvents []= $event; + } +} diff --git a/vendor/aws/aws-sdk-php/src/HashInterface.php b/vendor/aws/aws-sdk-php/src/HashInterface.php new file mode 100644 index 0000000..6304e4d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/HashInterface.php @@ -0,0 +1,27 @@ +stream = $stream; + $this->hash = $hash; + $this->callback = $onComplete; + } + + public function read($length): string + { + $data = $this->stream->read($length); + $this->hash->update($data); + if ($this->eof()) { + $result = $this->hash->complete(); + if ($this->callback) { + call_user_func($this->callback, $result); + } + } + + return $data; + } + + public function seek($offset, $whence = SEEK_SET): void + { + // Seeking arbitrarily is not supported. + if ($offset !== 0) { + return; + } + + $this->hash->reset(); + $this->stream->seek($offset); + } +} diff --git a/vendor/aws/aws-sdk-php/src/History.php b/vendor/aws/aws-sdk-php/src/History.php new file mode 100644 index 0000000..9f8a3bf --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/History.php @@ -0,0 +1,161 @@ +maxEntries = $maxEntries; + } + + /** + * @return int + */ + #[\ReturnTypeWillChange] + public function count() + { + return count($this->entries); + } + + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator(array_values($this->entries)); + } + + /** + * Get the last finished command seen by the history container. + * + * @return CommandInterface + * @throws \LogicException if no commands have been seen. + */ + public function getLastCommand() + { + if (!$this->entries) { + throw new \LogicException('No commands received'); + } + + return end($this->entries)['command']; + } + + /** + * Get the last finished request seen by the history container. + * + * @return RequestInterface + * @throws \LogicException if no requests have been seen. + */ + public function getLastRequest() + { + if (!$this->entries) { + throw new \LogicException('No requests received'); + } + + return end($this->entries)['request']; + } + + /** + * Get the last received result or exception. + * + * @return ResultInterface|AwsException + * @throws \LogicException if no return values have been received. + */ + public function getLastReturn() + { + if (!$this->entries) { + throw new \LogicException('No entries'); + } + + $last = end($this->entries); + + if (isset($last['result'])) { + return $last['result']; + } + + if (isset($last['exception'])) { + return $last['exception']; + } + + throw new \LogicException('No return value for last entry.'); + } + + /** + * Initiate an entry being added to the history. + * + * @param CommandInterface $cmd Command be executed. + * @param RequestInterface $req Request being sent. + * + * @return string Returns the ticket used to finish the entry. + */ + public function start(CommandInterface $cmd, RequestInterface $req) + { + $ticket = uniqid(); + $this->entries[$ticket] = [ + 'command' => $cmd, + 'request' => $req, + 'result' => null, + 'exception' => null, + ]; + + return $ticket; + } + + /** + * Finish adding an entry to the history container. + * + * @param string $ticket Ticket returned from the start call. + * @param mixed $result The result (an exception or AwsResult). + */ + public function finish($ticket, $result) + { + if (!isset($this->entries[$ticket])) { + throw new \InvalidArgumentException('Invalid history ticket'); + } + + if (isset($this->entries[$ticket]['result']) + || isset($this->entries[$ticket]['exception']) + ) { + throw new \LogicException('History entry is already finished'); + } + + if ($result instanceof \Exception) { + $this->entries[$ticket]['exception'] = $result; + } else { + $this->entries[$ticket]['result'] = $result; + } + + if (count($this->entries) >= $this->maxEntries) { + $this->entries = array_slice($this->entries, -$this->maxEntries, null, true); + } + } + + /** + * Flush the history + */ + public function clear() + { + $this->entries = []; + } + + /** + * Converts the history to an array. + * + * @return array + */ + public function toArray() + { + return array_values($this->entries); + } +} diff --git a/vendor/aws/aws-sdk-php/src/IdempotencyTokenMiddleware.php b/vendor/aws/aws-sdk-php/src/IdempotencyTokenMiddleware.php new file mode 100644 index 0000000..c87d0bb --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/IdempotencyTokenMiddleware.php @@ -0,0 +1,120 @@ +bytesGenerator = $bytesGenerator + ?: $this->findCompatibleRandomSource(); + $this->service = $service; + $this->nextHandler = $nextHandler; + } + + public function __invoke( + CommandInterface $command, + ?RequestInterface $request = null + ) { + $handler = $this->nextHandler; + if ($this->bytesGenerator) { + $operation = $this->service->getOperation($command->getName()); + $members = $operation->getInput()->getMembers(); + foreach ($members as $member => $value) { + if ($value['idempotencyToken']) { + $bytes = call_user_func($this->bytesGenerator, 16); + // populating UUIDv4 only when the parameter is not set + $command[$member] = $command[$member] + ?: $this->getUuidV4($bytes); + // only one member could have the trait enabled + break; + } + } + } + return $handler($command, $request); + } + + /** + * This function generates a random UUID v4 string, + * which is used as auto filled token value. + * + * @param string $bytes 16 bytes of pseudo-random bytes + * @return string + * More information about UUID v4, see: + * https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29 + * https://tools.ietf.org/html/rfc4122#page-14 + */ + private static function getUuidV4($bytes) + { + // set version to 0100 + $bytes[6] = chr(ord($bytes[6]) & 0x0f | 0x40); + // set bits 6-7 to 10 + $bytes[8] = chr(ord($bytes[8]) & 0x3f | 0x80); + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4)); + } + + /** + * This function decides the PHP function used in generating random bytes. + * + * @return callable|null + */ + private function findCompatibleRandomSource() + { + if (function_exists('random_bytes')) { + return 'random_bytes'; + } + + if (function_exists('openssl_random_pseudo_bytes')) { + return 'openssl_random_pseudo_bytes'; + } + + if (function_exists('mcrypt_create_iv')) { + return 'mcrypt_create_iv'; + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/InputValidationMiddleware.php b/vendor/aws/aws-sdk-php/src/InputValidationMiddleware.php new file mode 100644 index 0000000..0c5a24d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/InputValidationMiddleware.php @@ -0,0 +1,74 @@ +service = $service; + $this->nextHandler = $nextHandler; + $this->mandatoryAttributeList = $mandatoryAttributeList; + } + + public function __invoke(CommandInterface $cmd) { + $nextHandler = $this->nextHandler; + $op = $this->service->getOperation($cmd->getName())->toArray(); + if (!empty($op['input']['shape'])) { + $service = $this->service->toArray(); + if (!empty($input = $service['shapes'][$op['input']['shape']])) { + if (!empty($input['required'])) { + foreach ($input['required'] as $key => $member) { + if (in_array($member, $this->mandatoryAttributeList)) { + $argument = is_string($cmd[$member]) ? trim($cmd[$member]) : $cmd[$member]; + if ($argument === '' || $argument === null) { + $commandName = $cmd->getName(); + throw new \InvalidArgumentException( + "The {$commandName} operation requires non-empty parameter: {$member}" + ); + } + } + } + } + } + } + return $nextHandler($cmd); + } +} diff --git a/vendor/aws/aws-sdk-php/src/JsonCompiler.php b/vendor/aws/aws-sdk-php/src/JsonCompiler.php new file mode 100644 index 0000000..5358b31 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/JsonCompiler.php @@ -0,0 +1,25 @@ +maxItems = $maxItems; + } + + public function get($key) + { + if (!isset($this->items[$key])) { + return null; + } + + $entry = $this->items[$key]; + + // Ensure the item is not expired. + if (!$entry[1] || time() < $entry[1]) { + // LRU: remove the item and push it to the end of the array. + unset($this->items[$key]); + $this->items[$key] = $entry; + return $entry[0]; + } + + unset($this->items[$key]); + return null; + } + + public function set($key, $value, $ttl = 0) + { + // Only call time() if the TTL is not 0/false/null + $ttl = $ttl ? time() + $ttl : 0; + $this->items[$key] = [$value, $ttl]; + + // Determine if there are more items in the cache than allowed. + $diff = count($this->items) - $this->maxItems; + + // Clear out least recently used items. + if ($diff > 0) { + // Reset to the beginning of the array and begin unsetting. + reset($this->items); + for ($i = 0; $i < $diff; $i++) { + unset($this->items[key($this->items)]); + next($this->items); + } + } + } + + public function remove($key) + { + unset($this->items[$key]); + } + + /** + * @return int + */ + #[\ReturnTypeWillChange] + public function count() + { + return count($this->items); + } +} diff --git a/vendor/aws/aws-sdk-php/src/MetricsBuilder.php b/vendor/aws/aws-sdk-php/src/MetricsBuilder.php new file mode 100644 index 0000000..5452c53 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/MetricsBuilder.php @@ -0,0 +1,503 @@ +metrics = []; + // The first metrics does not include the separator + // therefore it is reduced by default. + $this->metricsSize = -(strlen(self::$METRIC_SEPARATOR)); + } + + /** + * Build the metrics string value. + * + * @return string + */ + public function build(): string + { + if (empty($this->metrics)) { + return ""; + } + + return $this->encode(); + } + + /** + * Encodes the metrics by separating each metric + * with a comma. Example: for the metrics[A,B,C] then + * the output would be "A,B,C". + * + * @return string + */ + private function encode(): string + { + return implode(self::$METRIC_SEPARATOR, array_keys($this->metrics)); + } + + /** + * Appends a metric to the internal metrics holder after validating it. + * Increases the current metrics size by the length of the new metric + * plus the length of the encoding separator. + * Example: $currentSize = $currentSize + len($newMetric) + len($separator) + * + * @param string $metric The metric to append. + * + * @return void + */ + public function append(string $metric): void + { + if (!$this->canMetricBeAppended($metric)) { + return; + } + + $this->metrics[$metric] = true; + $this->metricsSize += strlen($metric) + strlen(self::$METRIC_SEPARATOR); + } + + /** + * Receives a feature group and a value to identify which one is the metric. + * For example, a group could be `signature` and a value could be `v4a`, + * then the metric will be `SIGV4A_SIGNING`. + * + * @param string $featureGroup the feature group such as `signature`. + * @param mixed $value the value for identifying the metric. + * + * @return void + */ + public function identifyMetricByValueAndAppend( + string $featureGroup, + mixed $value + ): void + { + if (empty($value)) { + return; + } + + static $appendMetricFns = [ + 'signature' => 'appendSignatureMetric', + 'request_compression' => 'appendRequestCompressionMetric', + 'request_checksum' => 'appendRequestChecksumMetric', + 'credentials' => 'appendCredentialsMetric', + 'account_id_endpoint_mode' => 'appendAccountIdEndpointMode', + 'account_id_endpoint' => 'appendAccountIdEndpoint', + 'request_checksum_calculation' => 'appendRequestChecksumCalculationMetric', + 'token' => 'appendTokenMetric' + ]; + + $fn = $appendMetricFns[$featureGroup]; + $this->{$fn}($value); + } + + /** + * Appends the signature metric based on the signature value. + * + * @param string $signature + * + * @return void + */ + private function appendSignatureMetric(string $signature): void + { + if ($signature === 'v4-s3express') { + $this->append(self::S3_EXPRESS_BUCKET); + } elseif ($signature === 'v4a') { + $this->append(self::SIGV4A_SIGNING); + } + } + + /** + * Appends the request compression metric based on the format resolved. + * + * @param string $format + * + * @return void + */ + private function appendRequestCompressionMetric(string $format): void + { + if ($format === 'gzip') { + $this->append(self::GZIP_REQUEST_COMPRESSION); + } + } + + /** + * Appends the request checksum metric based on the algorithm. + * + * @param string $algorithm + * + * @return void + */ + private function appendRequestChecksumMetric(string $algorithm): void + { + if ($algorithm === 'crc32') { + $this->append(self::FLEXIBLE_CHECKSUMS_REQ_CRC32); + } elseif ($algorithm === 'crc32c') { + $this->append(self::FLEXIBLE_CHECKSUMS_REQ_CRC32C); + } elseif ($algorithm === 'crc64') { + $this->append(self::FLEXIBLE_CHECKSUMS_REQ_CRC64); + } elseif ($algorithm === 'sha1') { + $this->append(self::FLEXIBLE_CHECKSUMS_REQ_SHA1); + } elseif ($algorithm === 'sha256') { + $this->append(self::FLEXIBLE_CHECKSUMS_REQ_SHA256); + } + } + + + /** + * Appends the credentials metric based on the type of credentials + * resolved. + * + * @param CredentialsInterface $credentials + * + * @return void + */ + private function appendCredentialsMetric( + CredentialsInterface $credentials + ): void + { + $source = $credentials->toArray()['source'] ?? null; + if (empty($source)) { + return; + } + + static $credentialsMetricMapping = [ + CredentialSources::STATIC => + self::CREDENTIALS_CODE, + CredentialSources::ENVIRONMENT => + self::CREDENTIALS_ENV_VARS, + CredentialSources::ENVIRONMENT_STS_WEB_ID_TOKEN => + self::CREDENTIALS_ENV_VARS_STS_WEB_ID_TOKEN, + CredentialSources::STS_ASSUME_ROLE => + self::CREDENTIALS_STS_ASSUME_ROLE, + CredentialSources::STS_WEB_ID_TOKEN => + self::CREDENTIALS_STS_ASSUME_ROLE_WEB_ID, + CredentialSources::PROFILE => + self::CREDENTIALS_PROFILE, + CredentialSources::IMDS => + self::CREDENTIALS_IMDS, + CredentialSources::ECS => + self::CREDENTIALS_HTTP, + CredentialSources::PROFILE_STS_WEB_ID_TOKEN => + self::CREDENTIALS_PROFILE_STS_WEB_ID_TOKEN, + CredentialSources::PROFILE_PROCESS => + self::CREDENTIALS_PROFILE_PROCESS, + CredentialSources::PROFILE_SSO => + self::CREDENTIALS_PROFILE_SSO, + CredentialSources::PROFILE_SSO_LEGACY => + self::CREDENTIALS_PROFILE_SSO_LEGACY, + CredentialSources::PROFILE_LOGIN => + self::CREDENTIALS_PROFILE_LOGIN + ]; + if (isset($credentialsMetricMapping[$source])) { + $this->append($credentialsMetricMapping[$source]); + } + } + + private function appendTokenMetric(TokenInterface $token): void + { + $source = $token->getSource(); + if (empty($source)) { + return; + } + + static $tokenMetricMapping = [ + 'bearer_service_env_vars' => self::BEARER_SERVICE_ENV_VARS + ]; + + if (isset($tokenMetricMapping[$source])) { + $this->append($tokenMetricMapping[$source]); + } + } + + private function appendRequestChecksumCalculationMetric( + string $checkSumCalculation + ): void + { + static $checksumCalculationMetricMapping = [ + 'when_supported' => self::FLEXIBLE_CHECKSUMS_REQ_WHEN_SUPPORTED, + 'when_required' => self::FLEXIBLE_CHECKSUMS_REQ_WHEN_REQUIRED, + ]; + + if (isset($checksumCalculationMetricMapping[$checkSumCalculation])) { + $this->append($checksumCalculationMetricMapping[$checkSumCalculation]); + } + } + + /** + * Appends the account_id_endpoint_mode metrics based on + * the value resolved. + * + * @param string $accountIdEndpointMode + * + * @return void + */ + private function appendAccountIdEndpointMode( + string $accountIdEndpointMode + ): void + { + if (empty($accountIdEndpointMode)) { + return; + } + + if ($accountIdEndpointMode === 'preferred') { + $this->append(self::ACCOUNT_ID_MODE_PREFERRED); + } elseif ($accountIdEndpointMode === 'disabled') { + $this->append(self::ACCOUNT_ID_MODE_DISABLED); + } elseif ($accountIdEndpointMode === 'required') { + $this->append(self::ACCOUNT_ID_MODE_REQUIRED); + } + } + + /** + * Appends the account_id_endpoint metric whenever a resolved endpoint + * matches an account_id endpoint pattern which also defined here. + * + * @param string $endpoint + * + * @return void + */ + private function appendAccountIdEndpoint(string $endpoint): void + { + static $pattern = "/(https|http):\\/\\/\\d{12}\\.ddb/"; + if (preg_match($pattern, $endpoint)) { + $this->append(self::ACCOUNT_ID_ENDPOINT); + } + } + + /** + * Resolves metrics from client arguments. + * + * @param array $args + * + * @return void + */ + public function resolveAndAppendFromArgs(array $args = []): void + { + static $metricsFnList = [ + 'appendEndpointMetric', + 'appendRetryConfigMetric', + 'appendResponseChecksumValidationMetric', + ]; + foreach ($metricsFnList as $metricFn) { + $this->{$metricFn}($args); + } + } + + /** + * Appends the endpoint metric into the metrics builder, + * just if a custom endpoint was provided at client construction. + * + * @param array $args + * + * @return void + */ + private function appendEndpointMetric(array $args): void + { + if (!empty($args['endpoint_override'])) { + $this->append(MetricsBuilder::ENDPOINT_OVERRIDE); + } + } + + /** + * Appends the retry mode metric into the metrics builder, + * based on the resolved retry config mode. + * + * @param array $args + * + * @return void + */ + private function appendRetryConfigMetric(array $args): void + { + $retries = $args['retries'] ?? null; + if ($retries === null) { + return; + } + + $retryMode = ''; + if ($retries instanceof \Aws\Retry\Configuration) { + $retryMode = $retries->getMode(); + } elseif (is_array($retries) + && isset($retries["mode"]) + ) { + $retryMode = $retries["mode"]; + } + + if ($retryMode === 'legacy') { + $this->append( + MetricsBuilder::RETRY_MODE_LEGACY + ); + } elseif ($retryMode === 'standard') { + $this->append( + MetricsBuilder::RETRY_MODE_STANDARD + ); + } elseif ($retryMode === 'adaptive') { + $this->append( + MetricsBuilder::RETRY_MODE_ADAPTIVE + ); + } + } + + /** + * Appends the provided/resolved response checksum validation mode. + * + * @param array $args + * + * @return void + */ + private function appendResponseChecksumValidationMetric(array $args): void + { + if (empty($args['response_checksum_validation'])) { + return; + } + + $checksumValidation = $args['response_checksum_validation']; + static $checksumValidationMetricMapping = [ + 'when_supported' => MetricsBuilder::FLEXIBLE_CHECKSUMS_RES_WHEN_SUPPORTED, + 'when_required' => MetricsBuilder::FLEXIBLE_CHECKSUMS_RES_WHEN_REQUIRED, + ]; + + if (isset($checksumValidationMetricMapping[$checksumValidation])) { + $this->append($checksumValidationMetricMapping[$checksumValidation]); + } + } + + /** + * Validates if a metric can be appended by ensuring the total size, + * including the new metric and separator, does not exceed the limit. + * Also checks that the metric does not already exist. + * Example: Appendable if: + * $currentSize + len($newMetric) + len($separator) <= MAX_SIZE + * and: + * $newMetric not in $existingMetrics + * + * @param string $newMetric The metric to validate. + * + * @return bool True if the metric can be appended, false otherwise. + */ + private function canMetricBeAppended(string $newMetric): bool + { + if ($newMetric === "") { + return false; + } + + if ($this->metricsSize + + (strlen($newMetric) + strlen(self::$METRIC_SEPARATOR)) + > self::$MAX_METRICS_SIZE + ) { + return false; + } + + if (isset($this->metrics[$newMetric])) { + return false; + } + + return true; + } + + /** + * Returns the metrics builder from the property @context of a command. + * + * @param Command $command + * + * @return MetricsBuilder + */ + public static function fromCommand(CommandInterface $command): MetricsBuilder + { + return $command->getMetricsBuilder(); + } + + /** + * Helper method for appending a metrics capture middleware into a + * handler stack given. The middleware appended here is on top of the + * build step. + * + * @param HandlerList $handlerList + * @param $metric + * + * @return void + */ + public static function appendMetricsCaptureMiddleware( + HandlerList $handlerList, + $metric + ): void + { + $middlewareName = 'metrics-capture-'.$metric; + if (!$handlerList->hasMiddleware($middlewareName)) { + $handlerList->appendBuild( + Middleware::tap( + function (CommandInterface $command) use ($metric) { + self::fromCommand($command)->append( + $metric + ); + } + ), + $middlewareName + ); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/Middleware.php b/vendor/aws/aws-sdk-php/src/Middleware.php new file mode 100644 index 0000000..fa5e4d8 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Middleware.php @@ -0,0 +1,473 @@ +getOperation($command->getName()); + $source = $command[$sourceParameter]; + + if ($source !== null + && $operation->getInput()->hasMember($bodyParameter) + ) { + $lazyOpenStream = new LazyOpenStream($source, 'r'); + $command[$bodyParameter] = $lazyOpenStream; + unset($command[$sourceParameter]); + + $next = $handler($command, $request); + // To avoid failures in some tests cases + if ($next !== null && method_exists($next, 'then')) { + return $next->then( + function ($result) use ($lazyOpenStream) { + // To make sure the resource is closed. + $lazyOpenStream->close(); + + return $result; + } + )->otherwise(function (\Throwable $e) use ($lazyOpenStream) { + $lazyOpenStream->close(); + + throw $e; + }); + } + + return $next; + } + + return $handler($command, $request); + }; + }; + } + + /** + * Adds a middleware that uses client-side validation. + * + * @param Service $api API being accessed. + * + * @return callable + */ + public static function validation(Service $api, ?Validator $validator = null) + { + $validator = $validator ?: new Validator(); + return function (callable $handler) use ($api, $validator) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($api, $validator, $handler) { + if ($api->isModifiedModel()) { + $api = new Service( + $api->getDefinition(), + $api->getProvider() + ); + } + $operation = $api->getOperation($command->getName()); + $validator->validate( + $command->getName(), + $operation->getInput(), + $command->toArray() + ); + return $handler($command, $request); + }; + }; + } + + /** + * Builds an HTTP request for a command. + * + * @param callable $serializer Function used to serialize a request for a + * command. + * @param EndpointProviderV2 | null $endpointProvider + * @param array $providerArgs + * @return callable + */ + public static function requestBuilder($serializer) + { + return function (callable $handler) use ($serializer) { + return function (CommandInterface $command, $endpoint = null) use ($serializer, $handler) { + return $handler($command, $serializer($command, $endpoint)); + }; + }; + } + + /** + * Creates a middleware that signs requests for a command. + * + * @param callable $credProvider Credentials provider function that + * returns a promise that is resolved + * with a CredentialsInterface object. + * @param callable $signatureFunction Function that accepts a Command + * object and returns a + * SignatureInterface. + * + * @return callable + */ + public static function signer( + callable $credProvider, + callable $signatureFunction, + $tokenProvider = null, + $config = [] + ) { + return function (callable $handler) use ($signatureFunction, $credProvider, $tokenProvider, $config) { + return function ( + CommandInterface $command, + RequestInterface $request + ) use ($handler, $signatureFunction, $credProvider, $tokenProvider, $config) { + $signer = $signatureFunction($command); + + // Token authorization path + if ($signer instanceof TokenAuthorization) { + return $tokenProvider()->then(function (TokenInterface $token) use ($handler, $command, $signer, $request) { + $command->getMetricsBuilder()->identifyMetricByValueAndAppend('token', $token); + return $handler($command, $signer->authorizeRequest($request, $token)); + }); + } + + // DPoP path + if ($signer instanceof DpopSignature) { + if (empty($key = $command['dpopKey']) + || !($key instanceof \OpenSSLAsymmetricKey) + ) { + throw new \RuntimeException( + 'A valid DPoP key must be present for DPoP signatures' + ); + } + + return $handler($command, $signer->signRequest($request, $key)); + } + + // Credential signing path + $credentialPromise = ($signer instanceof S3ExpressSignature) + ? $config['s3_express_identity_provider']($command) + : $credProvider(); + + return $credentialPromise->then(function (CredentialsInterface $creds) use ($handler, + $command, + $signer, + $request + ) { + $command->getMetricsBuilder()->identifyMetricByValueAndAppend('credentials', $creds); + return $handler($command, $signer->signRequest($request, $creds)); + }); + }; + }; + } + + /** + * Creates a middleware that invokes a callback at a given step. + * + * The tap callback accepts a CommandInterface and RequestInterface as + * arguments but is not expected to return a new value or proxy to + * downstream middleware. It's simply a way to "tap" into the handler chain + * to debug or get an intermediate value. + * + * @param callable $fn Tap function + * + * @return callable + */ + public static function tap(callable $fn) + { + return function (callable $handler) use ($fn) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler, $fn) { + $fn($command, $request); + return $handler($command, $request); + }; + }; + } + + /** + * Middleware wrapper function that retries requests based on the boolean + * result of invoking the provided "decider" function. + * + * If no delay function is provided, a simple implementation of exponential + * backoff will be utilized. + * + * @param callable $decider Function that accepts the number of retries, + * a request, [result], and [exception] and + * returns true if the command is to be retried. + * @param callable $delay Function that accepts the number of retries and + * returns the number of milliseconds to delay. + * @param bool $stats Whether to collect statistics on retries and the + * associated delay. + * + * @return callable + */ + public static function retry( + ?callable $decider = null, + ?callable $delay = null, + $stats = false + ) { + $decider = $decider ?: RetryMiddleware::createDefaultDecider(); + $delay = $delay ?: [RetryMiddleware::class, 'exponentialDelay']; + + return function (callable $handler) use ($decider, $delay, $stats) { + return new RetryMiddleware($decider, $delay, $handler, $stats); + }; + } + /** + * Middleware wrapper function that adds an invocation id header to + * requests, which is only applied after the build step. + * + * This is a uniquely generated UUID to identify initial and subsequent + * retries as part of a complete request lifecycle. + * + * @return callable + */ + public static function invocationId() + { + return function (callable $handler) { + return function ( + CommandInterface $command, + RequestInterface $request + ) use ($handler){ + return $handler($command, $request->withHeader( + 'aws-sdk-invocation-id', + md5(uniqid(gethostname(), true)) + )); + }; + }; + } + /** + * Middleware wrapper function that adds a Content-Type header to requests. + * This is only done when the Content-Type has not already been set, and the + * request body's URI is available. It then checks the file extension of the + * URI to determine the mime-type. + * + * @param array $operations Operations that Content-Type should be added to. + * + * @return callable + */ + public static function contentType(array $operations) + { + return function (callable $handler) use ($operations) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler, $operations) { + if (!$request->hasHeader('Content-Type') + && in_array($command->getName(), $operations, true) + && ($uri = $request->getBody()->getMetadata('uri')) + ) { + $request = $request->withHeader( + 'Content-Type', + Psr7\MimeType::fromFilename($uri) ?: 'application/octet-stream' + ); + } + + return $handler($command, $request); + }; + }; + } + /** + * Middleware wrapper function that adds a trace id header to requests + * from clients instantiated in supported Lambda runtime environments. + * + * The purpose for this header is to track and stop Lambda functions + * from being recursively invoked due to misconfigured resources. + * + * @return callable + */ + public static function recursionDetection() + { + return function (callable $handler) { + return function ( + CommandInterface $command, + RequestInterface $request + ) use ($handler){ + $isLambda = getenv('AWS_LAMBDA_FUNCTION_NAME'); + $traceId = str_replace('\e', '\x1b', getenv('_X_AMZN_TRACE_ID')); + + if ($isLambda && $traceId) { + if (!$request->hasHeader('X-Amzn-Trace-Id')) { + $ignoreChars = ['=', ';', ':', '+', '&', '[', ']', '{', '}', '"', '\'', ',']; + $traceIdEncoded = rawurlencode(stripcslashes($traceId)); + + foreach($ignoreChars as $char) { + $encodedChar = rawurlencode($char); + $traceIdEncoded = str_replace($encodedChar, $char, $traceIdEncoded); + } + + return $handler($command, $request->withHeader( + 'X-Amzn-Trace-Id', + $traceIdEncoded + )); + } + } + return $handler($command, $request); + }; + }; + } + /** + * Tracks command and request history using a history container. + * + * This is useful for testing. + * + * @param History $history History container to store entries. + * + * @return callable + */ + public static function history(History $history) + { + return function (callable $handler) use ($history) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler, $history) { + $ticket = $history->start($command, $request); + return $handler($command, $request) + ->then( + function ($result) use ($history, $ticket) { + $history->finish($ticket, $result); + return $result; + }, + function ($reason) use ($history, $ticket) { + $history->finish($ticket, $reason); + return Promise\Create::rejectionFor($reason); + } + ); + }; + }; + } + + /** + * Creates a middleware that applies a map function to requests as they + * pass through the middleware. + * + * @param callable $f Map function that accepts a RequestInterface and + * returns a RequestInterface. + * + * @return callable + */ + public static function mapRequest(callable $f) + { + return function (callable $handler) use ($f) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler, $f) { + return $handler($command, $f($request)); + }; + }; + } + + /** + * Creates a middleware that applies a map function to commands as they + * pass through the middleware. + * + * @param callable $f Map function that accepts a command and returns a + * command. + * + * @return callable + */ + public static function mapCommand(callable $f) + { + return function (callable $handler) use ($f) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler, $f) { + return $handler($f($command), $request); + }; + }; + } + + /** + * Creates a middleware that applies a map function to results. + * + * @param callable $f Map function that accepts an Aws\ResultInterface and + * returns an Aws\ResultInterface. + * + * @return callable + */ + public static function mapResult(callable $f) + { + return function (callable $handler) use ($f) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler, $f) { + return $handler($command, $request)->then($f); + }; + }; + } + + public static function timer() + { + return function (callable $handler) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler) { + $start = microtime(true); + return $handler($command, $request) + ->then( + function (ResultInterface $res) use ($start) { + if (!isset($res['@metadata'])) { + $res['@metadata'] = []; + } + if (!isset($res['@metadata']['transferStats'])) { + $res['@metadata']['transferStats'] = []; + } + + $res['@metadata']['transferStats']['total_time'] + = microtime(true) - $start; + + return $res; + }, + function ($err) use ($start) { + if ($err instanceof AwsException) { + $err->setTransferInfo([ + 'total_time' => microtime(true) - $start, + ] + $err->getTransferInfo()); + } + return Promise\Create::rejectionFor($err); + } + ); + }; + }; + } +} diff --git a/vendor/aws/aws-sdk-php/src/MockHandler.php b/vendor/aws/aws-sdk-php/src/MockHandler.php new file mode 100644 index 0000000..7d6b453 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/MockHandler.php @@ -0,0 +1,148 @@ +queue = []; + $this->onFulfilled = $onFulfilled; + $this->onRejected = $onRejected; + + if ($resultOrQueue) { + call_user_func_array([$this, 'append'], array_values($resultOrQueue)); + } + } + + /** + * Adds one or more variadic ResultInterface or AwsException objects to the + * queue. + */ + public function append() + { + foreach (func_get_args() as $value) { + if ($value instanceof ResultInterface + || $value instanceof Exception + || is_callable($value) + ) { + $this->queue[] = $value; + } else { + throw new \InvalidArgumentException('Expected an Aws\ResultInterface or Exception.'); + } + } + } + + /** + * Adds one or more \Exception or \Throwable to the queue + */ + public function appendException() + { + foreach (func_get_args() as $value) { + if ($value instanceof \Exception || $value instanceof \Throwable) { + $this->queue[] = $value; + } else { + throw new \InvalidArgumentException('Expected an \Exception or \Throwable.'); + } + } + } + + public function __invoke( + CommandInterface $command, + RequestInterface $request + ) { + if (!$this->queue) { + $last = $this->lastCommand + ? ' The last command sent was ' . $this->lastCommand->getName() . '.' + : ''; + throw new \RuntimeException('Mock queue is empty. Trying to send a ' + . $command->getName() . ' command failed.' . $last); + } + + $this->lastCommand = $command; + $this->lastRequest = $request; + + $result = array_shift($this->queue); + + if (is_callable($result)) { + $result = $result($command, $request); + } + + if ($result instanceof \Exception) { + $result = new RejectedPromise($result); + } else { + // Add an effective URI and statusCode if not present. + $meta = $result['@metadata']; + if (!isset($meta['effectiveUri'])) { + $meta['effectiveUri'] = (string) $request->getUri(); + } + if (!isset($meta['statusCode'])) { + $meta['statusCode'] = 200; + } + $result['@metadata'] = $meta; + $result = Promise\Create::promiseFor($result); + } + + $result->then($this->onFulfilled, $this->onRejected); + + return $result; + } + + /** + * Get the last received request. + * + * @return RequestInterface|null + */ + public function getLastRequest() + { + return $this->lastRequest; + } + + /** + * Get the last received command. + * + * @return CommandInterface + */ + public function getLastCommand() + { + return $this->lastCommand; + } + + /** + * Returns the number of remaining items in the queue. + * + * @return int + */ + #[\ReturnTypeWillChange] + public function count() + { + return count($this->queue); + } +} diff --git a/vendor/aws/aws-sdk-php/src/MonitoringEventsInterface.php b/vendor/aws/aws-sdk-php/src/MonitoringEventsInterface.php new file mode 100644 index 0000000..662927f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/MonitoringEventsInterface.php @@ -0,0 +1,30 @@ + true, 'region' => true] + ); + $args['region']['required'] = false; + unset($args['region']['fn']); + unset($args['region']['default']); + + return $args + [ + 'client_factory' => [ + 'type' => 'config', + 'valid' => ['callable'], + 'doc' => 'A callable that takes an array of client' + . ' configuration arguments and returns a regionalized' + . ' client.', + 'required' => true, + 'internal' => true, + 'default' => function (array $args) { + $namespace = manifest($args['service'])['namespace']; + $klass = "Aws\\{$namespace}\\{$namespace}Client"; + $region = isset($args['region']) ? $args['region'] : null; + + return function (array $args) use ($klass, $region) { + if ($region && empty($args['region'])) { + $args['region'] = $region; + } + + return new $klass($args); + }; + }, + ], + 'partition' => [ + 'type' => 'config', + 'valid' => ['string', PartitionInterface::class], + 'doc' => 'AWS partition to connect to. Valid partitions' + . ' include "aws," "aws-cn," and "aws-us-gov." Used to' + . ' restrict the scope of the mapRegions method.', + 'default' => function (array $args) { + $region = isset($args['region']) ? $args['region'] : ''; + return PartitionEndpointProvider::defaultProvider() + ->getPartition($region, $args['service']); + }, + 'fn' => function ($value, array &$args) { + if (is_string($value)) { + $value = PartitionEndpointProvider::defaultProvider() + ->getPartitionByName($value); + } + + if (!$value instanceof PartitionInterface) { + throw new \InvalidArgumentException('No valid partition' + . ' was provided. Provide a concrete partition or' + . ' the name of a partition (e.g., "aws," "aws-cn,"' + . ' or "aws-us-gov").' + ); + } + $ruleset = EndpointDefinitionProvider::getEndpointRuleset( + $args['service'], + isset($args['version']) ? $args['version'] : 'latest' + ); + $partitions = EndpointDefinitionProvider::getPartitions(); + $args['endpoint_provider'] = new EndpointProviderV2($ruleset, $partitions); + } + ], + ]; + } + + /** + * The multi-region client constructor accepts the following options: + * + * - client_factory: (callable) An optional callable that takes an array of + * client configuration arguments and returns a regionalized client. + * - partition: (Aws\Endpoint\Partition|string) AWS partition to connect to. + * Valid partitions include "aws," "aws-cn," and "aws-us-gov." Used to + * restrict the scope of the mapRegions method. + * - region: (string) Region to connect to when no override is provided. + * Used to create the default client factory and determine the appropriate + * AWS partition when present. + * + * @param array $args Client configuration arguments. + */ + public function __construct(array $args = []) + { + if (!isset($args['service'])) { + $args['service'] = $this->parseClass(); + } + + $this->handlerList = new HandlerList(function ( + CommandInterface $command + ) { + list($region, $args) = $this->getRegionFromArgs($command->toArray()); + $command = $this->getClientFromPool($region) + ->getCommand($command->getName(), $args); + + if ($this->isUseCustomHandler()) { + $command->getHandlerList()->setHandler($this->customHandler); + } + + return $this->executeAsync($command); + }); + + $argDefinitions = static::getArguments(); + $resolver = new ClientResolver($argDefinitions); + $args = $resolver->resolve($args, $this->handlerList); + $this->config = $args['config']; + $this->factory = $args['client_factory']; + $this->partition = $args['partition']; + $this->args = array_diff_key($args, $args['config']); + } + + /** + * Get the region to which the client is configured to send requests by + * default. + * + * @return string + */ + public function getRegion() + { + return $this->getClientFromPool()->getRegion(); + } + + /** + * Create a command for an operation name. + * + * Special keys may be set on the command to control how it behaves, + * including: + * + * - @http: Associative array of transfer specific options to apply to the + * request that is serialized for this command. Available keys include + * "proxy", "verify", "timeout", "connect_timeout", "debug", "delay", and + * "headers". + * - @region: The region to which the command should be sent. + * + * @param string $name Name of the operation to use in the command + * @param array $args Arguments to pass to the command + * + * @return CommandInterface + * @throws \InvalidArgumentException if no command can be found by name + */ + public function getCommand($name, array $args = []) + { + return new Command($name, $args, clone $this->getHandlerList()); + } + + public function getConfig($option = null) + { + if (null === $option) { + return $this->config; + } + + if (isset($this->config[$option])) { + return $this->config[$option]; + } + + return $this->getClientFromPool()->getConfig($option); + } + + public function getCredentials() + { + return $this->getClientFromPool()->getCredentials(); + } + + public function getHandlerList() + { + return $this->handlerList; + } + + public function getApi() + { + return $this->getClientFromPool()->getApi(); + } + + public function getEndpoint() + { + return $this->getClientFromPool()->getEndpoint(); + } + + public function useCustomHandler(callable $handler) + { + $this->customHandler = $handler; + } + + private function isUseCustomHandler() + { + return isset($this->customHandler); + } + + /** + * @param string $region Omit this argument or pass in an empty string to + * allow the configured client factory to apply the + * region. + * + * @return AwsClientInterface + */ + protected function getClientFromPool($region = '') + { + if (empty($this->clientPool[$region])) { + $factory = $this->factory; + $this->clientPool[$region] = $factory( + array_replace($this->args, array_filter(['region' => $region])) + ); + } + + return $this->clientPool[$region]; + } + + /** + * Parse the class name and return the "service" name of the client. + * + * @return string + */ + private function parseClass() + { + $klass = get_class($this); + + if ($klass === __CLASS__) { + return ''; + } + + return strtolower(substr($klass, strrpos($klass, '\\') + 1, -17)); + } + + private function getRegionFromArgs(array $args) + { + $region = isset($args['@region']) + ? $args['@region'] + : $this->getRegion(); + unset($args['@region']); + + return [$region, $args]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/PhpHash.php b/vendor/aws/aws-sdk-php/src/PhpHash.php new file mode 100644 index 0000000..7a82815 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/PhpHash.php @@ -0,0 +1,81 @@ +algo = $algo; + $this->options = $options; + } + + public function update($data) + { + if ($this->hash !== null) { + $this->reset(); + } + + hash_update($this->getContext(), $data); + } + + public function complete() + { + if ($this->hash) { + return $this->hash; + } + + $this->hash = hash_final($this->getContext(), true); + + if (isset($this->options['base64']) && $this->options['base64']) { + $this->hash = base64_encode($this->hash); + } + + return $this->hash; + } + + public function reset() + { + $this->context = $this->hash = null; + } + + /** + * Get a hash context or create one if needed + * + * @return resource|\HashContext + */ + private function getContext() + { + if (!$this->context) { + $key = isset($this->options['key']) ? $this->options['key'] : ''; + $this->context = hash_init( + $this->algo, + $key ? HASH_HMAC : 0, + $key + ); + } + + return $this->context; + } +} diff --git a/vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php b/vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php new file mode 100644 index 0000000..67ca788 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/PresignUrlMiddleware.php @@ -0,0 +1,128 @@ +endpointProvider = $endpointProvider; + $this->client = $client; + $this->nextHandler = $nextHandler; + $this->commandPool = $options['operations']; + $this->serviceName = $options['service']; + $this->presignParam = !empty($options['presign_param']) + ? $options['presign_param'] + : 'PresignedUrl'; + $this->extraQueryParams = !empty($options['extra_query_params']) + ? $options['extra_query_params'] + : []; + $this->requireDifferentRegion = !empty($options['require_different_region']); + } + + public static function wrap( + AwsClientInterface $client, + $endpointProvider, + array $options = [] + ) { + return function (callable $handler) use ($endpointProvider, $client, $options) { + $f = new PresignUrlMiddleware($options, $endpointProvider, $client, $handler); + return $f; + }; + } + + public function __invoke(CommandInterface $cmd, ?RequestInterface $request = null) + { + if (in_array($cmd->getName(), $this->commandPool) + && (!isset($cmd['__skip' . $cmd->getName()])) + ) { + $cmd['DestinationRegion'] = $this->client->getRegion(); + if (!empty($cmd['SourceRegion']) && !empty($cmd[$this->presignParam])) { + goto nexthandler; + } + if (!$this->requireDifferentRegion + || (!empty($cmd['SourceRegion']) + && $cmd['SourceRegion'] !== $cmd['DestinationRegion']) + ) { + $cmd[$this->presignParam] = $this->createPresignedUrl($this->client, $cmd); + } + } + nexthandler: + $nextHandler = $this->nextHandler; + return $nextHandler($cmd, $request); + } + + private function createPresignedUrl( + AwsClientInterface $client, + CommandInterface $cmd + ) { + $cmdName = $cmd->getName(); + $newCmd = $client->getCommand($cmdName, $cmd->toArray()); + // Avoid infinite recursion by flagging the new command. + $newCmd['__skip' . $cmdName] = true; + + // Serialize a request for the operation. + $request = \Aws\serialize($newCmd); + // Create the new endpoint for the target endpoint. + if ($this->endpointProvider instanceof \Aws\EndpointV2\EndpointProviderV2) { + $providerArgs = array_merge( + $this->client->getEndpointProviderArgs(), + ['Region' => $cmd['SourceRegion']] + ); + $endpoint = $this->endpointProvider->resolveEndpoint($providerArgs)->getUrl(); + } else { + $endpoint = EndpointProvider::resolve($this->endpointProvider, [ + 'region' => $cmd['SourceRegion'], + 'service' => $this->serviceName, + ])['endpoint']; + } + + // Set the request to hit the target endpoint. + $uri = $request->getUri()->withHost((new Uri($endpoint))->getHost()); + $request = $request->withUri($uri); + + // Create a presigned URL for our generated request. + $signer = new SignatureV4($this->serviceName, $cmd['SourceRegion']); + + $currentQueryParams = (string) $request->getBody(); + $paramsToAdd = false; + if (!empty($this->extraQueryParams[$cmdName])) { + foreach ($this->extraQueryParams[$cmdName] as $param) { + if (!strpos($currentQueryParams, $param)) { + $paramsToAdd = "&{$param}=" . urlencode($cmd[$param]); + } + } + } + + return (string) $signer->presign( + SignatureV4::convertPostToGet($request, $paramsToAdd ?: ""), + $client->getCredentials()->wait(), + '+1 hour' + )->getUri(); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Psr16CacheAdapter.php b/vendor/aws/aws-sdk-php/src/Psr16CacheAdapter.php new file mode 100644 index 0000000..b1ac8ed --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Psr16CacheAdapter.php @@ -0,0 +1,30 @@ +cache = $cache; + } + + public function get($key) + { + return $this->cache->get($key); + } + + public function set($key, $value, $ttl = 0) + { + $this->cache->set($key, $value, $ttl); + } + + public function remove($key) + { + $this->cache->delete($key); + } +} diff --git a/vendor/aws/aws-sdk-php/src/PsrCacheAdapter.php b/vendor/aws/aws-sdk-php/src/PsrCacheAdapter.php new file mode 100644 index 0000000..9dd2d94 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/PsrCacheAdapter.php @@ -0,0 +1,38 @@ +pool = $pool; + } + + public function get($key) + { + $item = $this->pool->getItem($key); + + return $item->isHit() ? $item->get() : null; + } + + public function set($key, $value, $ttl = 0) + { + $item = $this->pool->getItem($key); + $item->set($value); + if ($ttl > 0) { + $item->expiresAfter($ttl); + } + + $this->pool->save($item); + } + + public function remove($key) + { + $this->pool->deleteItem($key); + } +} diff --git a/vendor/aws/aws-sdk-php/src/QueryCompatibleInputMiddleware.php b/vendor/aws/aws-sdk-php/src/QueryCompatibleInputMiddleware.php new file mode 100644 index 0000000..9da75b6 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/QueryCompatibleInputMiddleware.php @@ -0,0 +1,234 @@ +service = $service; + $this->nextHandler = $nextHandler; + } + + public function __invoke(CommandInterface $cmd) + { + $this->command = $cmd; + $nextHandler = $this->nextHandler; + $op = $this->service->getOperation($cmd->getName()); + $inputMembers = $op->getInput()->getMembers(); + $input = $cmd->toArray(); + + foreach ($input as $param => $value) { + if (isset($inputMembers[$param])) { + $shape = $inputMembers[$param]; + $this->processInput($value, $shape, [$param]); + } + } + + return $nextHandler($this->command); + } + + /** + * Recurses a given input shape. if a given scalar input does not match its + * modeled type, it is cast to its modeled type. + * + * @param $input + * @param $shape + * @param array $path + * + * @return void + */ + private function processInput($input, $shape, array $path) : void + { + switch ($shape->getType()) { + case 'structure': + $this->processStructure($input, $shape, $path); + break; + case 'list': + $this->processList($input, $shape, $path); + break; + case 'map': + $this->processMap($input, $shape, $path); + break; + default: + $this->processScalar($input, $shape, $path); + } + } + + /** + * @param array $input + * @param StructureShape $shape + * @param array $path + * + * @return void + */ + private function processStructure( + array $input, + StructureShape $shape, + array $path + ) : void + { + foreach ($input as $param => $value) { + if ($shape->hasMember($param)) { + $memberPath = array_merge($path, [$param]); + $this->processInput($value, $shape->getMember($param), $memberPath); + } + } + } + + /** + * @param array $input + * @param ListShape $shape + * @param array $path + * + * @return void + */ + private function processList( + array $input, + ListShape $shape, + array $path + ) : void + { + foreach ($input as $param => $value) { + $memberPath = array_merge($path, [$param]); + $this->processInput($value, $shape->getMember(), $memberPath); + } + } + + /** + * @param array $input + * @param MapShape $shape + * @param array $path + * + * @return void + */ + private function processMap(array $input, MapShape $shape, array $path) : void + { + foreach ($input as $param => $value) { + $memberPath = array_merge($path, [$param]); + $this->processInput($value, $shape->getValue(), $memberPath); + } + } + + /** + * @param $input + * @param Shape $shape + * @param array $path + * + * @return void + */ + private function processScalar($input, Shape $shape, array $path) : void + { + $expectedType = $shape->getType(); + + if (!$this->isModeledType($input, $expectedType)) { + trigger_error( + "The provided type for `". implode(' -> ', $path) ."` value was `" + . (gettype($input) === 'double' ? 'float' : gettype($input)) . "`." + . " The modeled type is `{$expectedType}`.", + E_USER_WARNING + ); + $value = $this->castValue($input, $expectedType); + $this->changeValueAtPath($path, $value); + } + } + + /** + * Modifies command in place + * + * @param array $path + * @param $newValue + * + * @return void + */ + private function changeValueAtPath(array $path, $newValue) : void + { + $commandRef = &$this->command; + + foreach ($path as $segment) { + if (!isset($commandRef[$segment])) { + return; + } + $commandRef = &$commandRef[$segment]; + } + $commandRef = $newValue; + } + + /** + * @param $value + * @param $type + * + * @return bool + */ + private function isModeledType($value, $type) : bool + { + switch ($type) { + case 'string': + return is_string($value); + case 'integer': + case 'long': + return is_int($value); + case 'float': + return is_float($value); + default: + return true; + } + } + + /** + * @param $value + * @param $type + * + * @return float|int|mixed|string + */ + private function castValue($value, $type) + { + switch ($type) { + case 'integer': + return (int) $value; + case 'long' : + return $value + 0; + case 'float': + return (float) $value; + case 'string': + return (string) $value; + default: + return $value; + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/RTBFabric/Exception/RTBFabricException.php b/vendor/aws/aws-sdk-php/src/RTBFabric/Exception/RTBFabricException.php new file mode 100644 index 0000000..2e0ced2 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/RTBFabric/Exception/RTBFabricException.php @@ -0,0 +1,9 @@ + 'gzencode' + ]; + + /** + * Create a middleware wrapper function. + * + * @return callable + */ + public static function wrap(array $config) + { + return function (callable $handler) use ($config) { + return new self($handler, $config); + }; + } + + public function __construct(callable $nextHandler, $config) + { + $this->minimumCompressionSize = $this->determineMinimumCompressionSize($config); + $this->api = $config['api']; + $this->nextHandler = $nextHandler; + } + + public function __invoke(CommandInterface $command, RequestInterface $request) + { + if (isset($command['@request_min_compression_size_bytes']) + && is_int($command['@request_min_compression_size_bytes']) + && $this->isValidCompressionSize($command['@request_min_compression_size_bytes']) + ) { + $this->minimumCompressionSize = $command['@request_min_compression_size_bytes']; + } + $nextHandler = $this->nextHandler; + $operation = $this->api->getOperation($command->getName()); + $compressionInfo = $operation['requestcompression'] ?? null; + + if (!$this->shouldCompressRequestBody( + $compressionInfo, + $command, + $operation, + $request + )) { + return $nextHandler($command, $request); + } + + $this->encodings = $compressionInfo['encodings']; + $request = $this->compressRequestBody($request); + + // Capture request compression metric + $command->getMetricsBuilder()->identifyMetricByValueAndAppend( + 'request_compression', + $request->getHeaderLine('content-encoding') + ); + + return $nextHandler($command, $request); + } + + private function compressRequestBody( + RequestInterface $request + ) { + $fn = $this->determineEncoding(); + if (is_null($fn)) { + return $request; + } + + $body = $request->getBody()->getContents(); + $compressedBody = $fn($body); + + $request = $request->withBody(Psr7\Utils::streamFor($compressedBody)); + if ($request->hasHeader('Content-Encoding')) { + return $request->withAddedHeader('Content-Encoding', $this->encoding); + } + + return $request->withHeader('Content-Encoding', $this->encoding); + } + + private function determineEncoding() + { + foreach ($this->encodings as $encoding) { + if (isset($this->encodingMap[$encoding])) { + $this->encoding = $encoding; + return $this->encodingMap[$encoding]; + } + } + return null; + } + + private function shouldCompressRequestBody( + $compressionInfo, + $command, + $operation, + $request + ){ + if ($compressionInfo) { + if (isset($command['@disable_request_compression']) + && $command['@disable_request_compression'] === true + ) { + return false; + } elseif ($this->hasStreamingTraitWithoutRequiresLength($command, $operation) + ) { + return true; + } + + $requestBodySize = $request->hasHeader('content-length') + ? (int) $request->getHeaderLine('content-length') + : $request->getBody()->getSize(); + + if ($requestBodySize >= $this->minimumCompressionSize) { + return true; + } + } + return false; + } + + private function hasStreamingTraitWithoutRequiresLength($command, $operation) + { + foreach ($operation->getInput()->getMembers() as $name => $member) { + if (isset($command[$name]) + && !empty($member['streaming']) + && empty($member['requiresLength']) + ){ + return true; + } + } + return false; + } + + private function determineMinimumCompressionSize($config) { + if (is_callable($config['request_min_compression_size_bytes'])) { + $minCompressionSz = $config['request_min_compression_size_bytes'](); + } else { + $minCompressionSz = $config['request_min_compression_size_bytes']; + } + + if ($this->isValidCompressionSize($minCompressionSz)) { + return $minCompressionSz; + } + } + + private function isValidCompressionSize($compressionSize) + { + if (is_numeric($compressionSize) + && ($compressionSize >= 0 && $compressionSize <= 10485760) + ) { + return true; + } + + throw new \InvalidArgumentException( + 'The minimum request compression size must be a ' + . 'non-negative integer value between 0 and 10485760 bytes, inclusive.' + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/ResponseContainerInterface.php b/vendor/aws/aws-sdk-php/src/ResponseContainerInterface.php new file mode 100644 index 0000000..d26921b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ResponseContainerInterface.php @@ -0,0 +1,15 @@ +data = $data; + } + + public function hasKey($name) + { + return isset($this->data[$name]); + } + + public function get($key) + { + return $this[$key]; + } + + public function search($expression) + { + return JmesPath::search($expression, $this->toArray()); + } + + public function __toString() + { + $jsonData = json_encode($this->toArray(), JSON_PRETTY_PRINT); + return <<get(\$key)`) or "accessing the result like an +associative array (e.g. `\$result['key']`). You can also execute JMESPath +expressions on the result data using the search() method. + +{$jsonData} + +EOT; + } + + /** + * @deprecated + */ + public function getPath($path) + { + return $this->search(str_replace('/', '.', $path)); + } +} diff --git a/vendor/aws/aws-sdk-php/src/ResultInterface.php b/vendor/aws/aws-sdk-php/src/ResultInterface.php new file mode 100644 index 0000000..18a166a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ResultInterface.php @@ -0,0 +1,54 @@ +execute($command); + * $jpResult = $result->search('foo.*.bar[?baz > `10`]'); + * + * @param string $expression JMESPath expression to execute + * + * @return mixed Returns the result of the JMESPath expression. + * @link http://jmespath.readthedocs.org/en/latest/ JMESPath documentation + */ + public function search($expression); +}; diff --git a/vendor/aws/aws-sdk-php/src/ResultPaginator.php b/vendor/aws/aws-sdk-php/src/ResultPaginator.php new file mode 100644 index 0000000..396ed1a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ResultPaginator.php @@ -0,0 +1,206 @@ +client = $client; + $this->operation = $operation; + $this->args = $args; + $this->config = $config; + MetricsBuilder::appendMetricsCaptureMiddleware( + $this->client->getHandlerList(), + MetricsBuilder::PAGINATOR + ); + } + + /** + * Runs a paginator asynchronously and uses a callback to handle results. + * + * The callback should have the signature: function (Aws\Result $result). + * A non-null return value from the callback will be yielded by the + * promise. This means that you can return promises from the callback that + * will need to be resolved before continuing iteration over the remaining + * items, essentially merging in other promises to the iteration. The last + * non-null value returned by the callback will be the result that fulfills + * the promise to any downstream promises. + * + * @param callable $handleResult Callback for handling each page of results. + * The callback accepts the result that was + * yielded as a single argument. If the + * callback returns a promise, the promise + * will be merged into the coroutine. + * + * @return Promise\Promise + */ + public function each(callable $handleResult) + { + return Promise\Coroutine::of(function () use ($handleResult) { + $nextToken = null; + do { + $command = $this->createNextCommand($this->args, $nextToken); + $result = (yield $this->client->executeAsync($command)); + $nextToken = $this->determineNextToken($result); + $retVal = $handleResult($result); + if ($retVal !== null) { + yield Promise\Create::promiseFor($retVal); + } + } while ($nextToken); + }); + } + + /** + * Returns an iterator that iterates over the values of applying a JMESPath + * search to each result yielded by the iterator as a flat sequence. + * + * @param string $expression JMESPath expression to apply to each result. + * + * @return \Iterator + */ + public function search($expression) + { + // Apply JMESPath expression on each result, but as a flat sequence. + return flatmap($this, function (Result $result) use ($expression) { + return (array) $result->search($expression); + }); + } + + /** + * @return Result + */ + #[\ReturnTypeWillChange] + public function current() + { + return $this->valid() ? $this->result : false; + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function key() + { + return $this->valid() ? $this->requestCount - 1 : null; + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function next() + { + $this->result = null; + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function valid() + { + if ($this->result) { + return true; + } + + if ($this->nextToken || !$this->requestCount) { + //Forward/backward paging can result in a case where the last page's nextforwardtoken + //is the same as the one that came before it. This can cause an infinite loop. + $hasBidirectionalPaging = $this->config['output_token'] === 'nextForwardToken'; + if ($hasBidirectionalPaging && $this->nextToken) { + $tokenKey = $this->config['input_token']; + $previousToken = $this->nextToken[$tokenKey]; + } + + $this->result = $this->client->execute( + $this->createNextCommand($this->args, $this->nextToken) + ); + + $this->nextToken = $this->determineNextToken($this->result); + + if (isset($previousToken) + && $previousToken === $this->nextToken[$tokenKey] + ) { + return false; + } + + $this->requestCount++; + return true; + } + + return false; + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function rewind() + { + $this->requestCount = 0; + $this->nextToken = null; + $this->result = null; + } + + private function createNextCommand(array $args, ?array $nextToken = null) + { + return $this->client->getCommand($this->operation, array_merge($args, ($nextToken ?: []))); + } + + private function determineNextToken(Result $result) + { + if (!$this->config['output_token']) { + return null; + } + + if ($this->config['more_results'] + && !$result->search($this->config['more_results']) + ) { + return null; + } + + $nextToken = is_scalar($this->config['output_token']) + ? [$this->config['input_token'] => $this->config['output_token']] + : array_combine($this->config['input_token'], $this->config['output_token']); + + return array_filter(array_map(function ($outputToken) use ($result) { + return $result->search($outputToken); + }, $nextToken)); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Retry/Configuration.php b/vendor/aws/aws-sdk-php/src/Retry/Configuration.php new file mode 100644 index 0000000..aa370c4 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Retry/Configuration.php @@ -0,0 +1,61 @@ +validModes)) { + throw new ConfigurationException("'{$mode}' is not a valid mode." + . " The mode has to be 'legacy', 'standard', or 'adaptive'."); + } + if (!is_numeric($maxAttempts) + || intval($maxAttempts) != $maxAttempts + || $maxAttempts < 1 + ) { + throw new ConfigurationException("The 'maxAttempts' parameter has" + . " to be an integer >= 1."); + } + + $this->mode = $mode; + $this->maxAttempts = intval($maxAttempts); + } + + /** + * {@inheritdoc} + */ + public function getMode() + { + return $this->mode; + } + + /** + * {@inheritdoc} + */ + public function getMaxAttempts() + { + return $this->maxAttempts; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return [ + 'mode' => $this->getMode(), + 'max_attempts' => $this->getMaxAttempts(), + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Retry/ConfigurationInterface.php b/vendor/aws/aws-sdk-php/src/Retry/ConfigurationInterface.php new file mode 100644 index 0000000..3f57b62 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Retry/ConfigurationInterface.php @@ -0,0 +1,30 @@ + + * use Aws\Sts\RegionalEndpoints\ConfigurationProvider; + * $provider = ConfigurationProvider::defaultProvider(); + * // Returns a ConfigurationInterface or throws. + * $config = $provider()->wait(); + * + * + * Configuration providers can be composed to create configuration using + * conditional logic that can create different configurations in different + * environments. You can compose multiple providers into a single provider using + * {@see \Aws\Retry\ConfigurationProvider::chain}. This function + * accepts providers as variadic arguments and returns a new function that will + * invoke each provider until a successful configuration is returned. + * + * + * // First try an INI file at this location. + * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = ConfigurationProvider::env(); + * // Combine the three providers together. + * $composed = ConfigurationProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with a configuration or throws. + * $promise = $composed(); + * // Wait on the configuration to resolve. + * $config = $promise->wait(); + * + */ +class ConfigurationProvider extends AbstractConfigurationProvider + implements ConfigurationProviderInterface +{ + const DEFAULT_MAX_ATTEMPTS = 3; + const DEFAULT_MODE = 'legacy'; + const ENV_MAX_ATTEMPTS = 'AWS_MAX_ATTEMPTS'; + const ENV_MODE = 'AWS_RETRY_MODE'; + const ENV_PROFILE = 'AWS_PROFILE'; + const INI_MAX_ATTEMPTS = 'max_attempts'; + const INI_MODE = 'retry_mode'; + + public static $cacheKey = 'aws_retries_config'; + + protected static $interfaceClass = ConfigurationInterface::class; + protected static $exceptionClass = ConfigurationException::class; + + /** + * Create a default config provider that first checks for environment + * variables, then checks for a specified profile in the environment-defined + * config file location (env variable is 'AWS_CONFIG_FILE', file location + * defaults to ~/.aws/config), then checks for the "default" profile in the + * environment-defined config file location, and failing those uses a default + * fallback set of configuration options. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided config options. + * + * @param array $config + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $configProviders = [self::env()]; + if ( + !isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] != false + ) { + $configProviders[] = self::ini(); + } + $configProviders[] = self::fallback(); + + $memo = self::memoize( + call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders) + ); + + if (isset($config['retries']) + && $config['retries'] instanceof CacheInterface + ) { + return self::cache($memo, $config['retries'], self::$cacheKey); + } + + return $memo; + } + + /** + * Provider that creates config from environment variables. + * + * @return callable + */ + public static function env() + { + return function () { + // Use config from environment variables, if available + $mode = getenv(self::ENV_MODE); + $maxAttempts = getenv(self::ENV_MAX_ATTEMPTS) + ? getenv(self::ENV_MAX_ATTEMPTS) + : self::DEFAULT_MAX_ATTEMPTS; + if (!empty($mode)) { + return Promise\Create::promiseFor( + new Configuration($mode, $maxAttempts) + ); + } + + return self::reject('Could not find environment variable config' + . ' in ' . self::ENV_MODE); + }; + } + + /** + * Fallback config options when other sources are not set. + * + * @return callable + */ + public static function fallback() + { + return function () { + return Promise\Create::promiseFor( + new Configuration(self::DEFAULT_MODE, self::DEFAULT_MAX_ATTEMPTS) + ); + }; + } + + /** + * Config provider that creates config using a config file whose location + * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to + * ~/.aws/config if not specified + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile. + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the default directory. + * + * @return callable + */ + public static function ini( + $profile = null, + $filename = null + ) { + $filename = $filename ?: (self::getDefaultConfigFilename()); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($profile, $filename) { + if (!@is_readable($filename)) { + return self::reject("Cannot read configuration from $filename"); + } + $data = \Aws\parse_ini_file($filename, true); + if ($data === false) { + return self::reject("Invalid config file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in config file"); + } + if (!isset($data[$profile][self::INI_MODE])) { + return self::reject("Required retry config values + not present in INI profile '{$profile}' ({$filename})"); + } + + $maxAttempts = isset($data[$profile][self::INI_MAX_ATTEMPTS]) + ? $data[$profile][self::INI_MAX_ATTEMPTS] + : self::DEFAULT_MAX_ATTEMPTS; + + return Promise\Create::promiseFor( + new Configuration( + $data[$profile][self::INI_MODE], + $maxAttempts + ) + ); + }; + } + + /** + * Unwraps a configuration object in whatever valid form it is in, + * always returning a ConfigurationInterface object. + * + * @param mixed $config + * @return ConfigurationInterface + * @throws \InvalidArgumentException + */ + public static function unwrap($config) + { + if (is_callable($config)) { + $config = $config(); + } + if ($config instanceof PromiseInterface) { + $config = $config->wait(); + } + if ($config instanceof ConfigurationInterface) { + return $config; + } + + // An integer value for this config indicates the legacy 'retries' + // config option, which is incremented to translate to max attempts + if (is_int($config)) { + return new Configuration('legacy', $config + 1); + } + + if (is_array($config) && isset($config['mode'])) { + $maxAttempts = isset($config['max_attempts']) + ? $config['max_attempts'] + : self::DEFAULT_MAX_ATTEMPTS; + return new Configuration($config['mode'], $maxAttempts); + } + + throw new \InvalidArgumentException('Not a valid retry configuration' + . ' argument.'); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Retry/Exception/ConfigurationException.php b/vendor/aws/aws-sdk-php/src/Retry/Exception/ConfigurationException.php new file mode 100644 index 0000000..0705c2e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Retry/Exception/ConfigurationException.php @@ -0,0 +1,14 @@ +initialRetryTokens = isset($config['initial_retry_tokens']) + ? $config['initial_retry_tokens'] + : 500; + $this->noRetryIncrement = isset($config['no_retry_increment']) + ? $config['no_retry_increment'] + : 1; + $this->retryCost = isset($config['retry_cost']) + ? $config['retry_cost'] + : 5; + $this->timeoutRetryCost = isset($config['timeout_retry_cost']) + ? $config['timeout_retry_cost'] + : 10; + $this->maxCapacity = $this->initialRetryTokens; + $this->availableCapacity = $this->initialRetryTokens; + } + + public function hasRetryQuota($result) + { + if ($result instanceof AwsException && $result->isConnectionError()) { + $this->capacityAmount = $this->timeoutRetryCost; + } else { + $this->capacityAmount = $this->retryCost; + } + + if ($this->capacityAmount > $this->availableCapacity) { + return false; + } + + $this->availableCapacity -= $this->capacityAmount; + return true; + } + + public function releaseToQuota($result) + { + if ($result instanceof AwsException) { + $statusCode = (int) $result->getStatusCode(); + } elseif ($result instanceof ResultInterface) { + $statusCode = isset($result['@metadata']['statusCode']) + ? (int) $result['@metadata']['statusCode'] + : null; + } + + if (!empty($statusCode) && $statusCode >= 200 && $statusCode < 300) { + if (isset($this->capacityAmount)) { + $amount = $this->capacityAmount; + $this->availableCapacity += $amount; + unset($this->capacityAmount); + } else { + $amount = $this->noRetryIncrement; + $this->availableCapacity += $amount; + } + $this->availableCapacity = min( + $this->availableCapacity, + $this->maxCapacity + ); + } + + return (isset($amount) ? $amount : 0); + } + + public function getAvailableCapacity() + { + return $this->availableCapacity; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Retry/RateLimiter.php b/vendor/aws/aws-sdk-php/src/Retry/RateLimiter.php new file mode 100644 index 0000000..b58cc59 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Retry/RateLimiter.php @@ -0,0 +1,182 @@ +beta = isset($options['beta']) + ? $options['beta'] + : 0.7; + $this->minCapacity = isset($options['min_capacity']) + ? $options['min_capacity'] + : 1; + $this->minFillRate = isset($options['min_fill_rate']) + ? $options['min_fill_rate'] + : 0.5; + $this->scaleConstant = isset($options['scale_constant']) + ? $options['scale_constant'] + : 0.4; + $this->smooth = isset($options['smooth']) + ? $options['smooth'] + : 0.8; + $this->timeProvider = isset($options['time_provider']) + ? $options['time_provider'] + : null; + + $this->lastTxRateBucket = floor($this->time()); + $this->lastThrottleTime = $this->time(); + } + + public function isEnabled() + { + return $this->enabled; + } + + public function getSendToken() + { + $this->acquireToken(1); + } + + public function updateSendingRate($isThrottled) + { + $this->updateMeasuredRate(); + + if ($isThrottled) { + if (!$this->isEnabled()) { + $rateToUse = $this->measuredTxRate; + } else { + $rateToUse = min($this->measuredTxRate, $this->fillRate); + } + + $this->lastMaxRate = $rateToUse; + $this->calculateTimeWindow(); + $this->lastThrottleTime = $this->time(); + $calculatedRate = $this->cubicThrottle($rateToUse); + $this->enableTokenBucket(); + } else { + $this->calculateTimeWindow(); + $calculatedRate = $this->cubicSuccess($this->time()); + } + $newRate = min($calculatedRate, 2 * $this->measuredTxRate); + $this->updateTokenBucketRate($newRate); + return $newRate; + } + + private function acquireToken($amount) + { + if (!$this->enabled) { + return true; + } + + $this->refillTokenBucket(); + + if ($amount > $this->currentCapacity) { + usleep((int) (1000000 * ($amount - $this->currentCapacity) / $this->fillRate)); + } + + $this->currentCapacity -= $amount; + return true; + } + + private function calculateTimeWindow() + { + $this->timeWindow = pow(($this->lastMaxRate * (1 - $this->beta) / $this->scaleConstant), 0.333); + } + + private function cubicSuccess($timestamp) + { + $dt = $timestamp - $this->lastThrottleTime; + return $this->scaleConstant * pow($dt - $this->timeWindow, 3) + $this->lastMaxRate; + } + + private function cubicThrottle($rateToUse) + { + return $rateToUse * $this->beta; + } + + private function enableTokenBucket() + { + $this->enabled = true; + } + + private function refillTokenBucket() + { + $timestamp = $this->time(); + if (!isset($this->lastTimestamp)) { + $this->lastTimestamp = $timestamp; + return; + } + $fillAmount = ($timestamp - $this->lastTimestamp) * $this->fillRate; + $this->currentCapacity = $this->currentCapacity + $fillAmount; + if (!is_null($this->maxCapacity)) { + $this->currentCapacity = min( + $this->maxCapacity, + $this->currentCapacity + ); + } + + $this->lastTimestamp = $timestamp; + } + + private function time() + { + if (is_callable($this->timeProvider)) { + $provider = $this->timeProvider; + $time = $provider(); + return $time; + } + return microtime(true); + } + + private function updateMeasuredRate() + { + $timestamp = $this->time(); + $timeBucket = floor(round($timestamp, 3) * 2) / 2; + $this->requestCount++; + if ($timeBucket > $this->lastTxRateBucket) { + $currentRate = $this->requestCount / ($timeBucket - $this->lastTxRateBucket); + $this->measuredTxRate = ($currentRate * $this->smooth) + + ($this->measuredTxRate * (1 - $this->smooth)); + $this->requestCount = 0; + $this->lastTxRateBucket = $timeBucket; + } + } + + private function updateTokenBucketRate($newRps) + { + $this->refillTokenBucket(); + $this->fillRate = max($newRps, $this->minFillRate); + $this->maxCapacity = max($newRps, $this->minCapacity); + $this->currentCapacity = min($this->currentCapacity, $this->maxCapacity); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Retry/RetryHelperTrait.php b/vendor/aws/aws-sdk-php/src/Retry/RetryHelperTrait.php new file mode 100644 index 0000000..a7edb72 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Retry/RetryHelperTrait.php @@ -0,0 +1,56 @@ +withHeader('aws-sdk-retry', "{$retries}/{$delayBy}"); + } + + + private function updateStats($retries, $delay, array &$stats) + { + if (!isset($stats['total_retry_delay'])) { + $stats['total_retry_delay'] = 0; + } + + $stats['total_retry_delay'] += $delay; + $stats['retries_attempted'] = $retries; + } + + private function updateHttpStats($value, array &$stats) + { + if (empty($stats['http'])) { + $stats['http'] = []; + } + + if ($value instanceof AwsException) { + $resultStats = $value->getTransferInfo(); + $stats['http'] []= $resultStats; + } elseif ($value instanceof ResultInterface) { + $resultStats = isset($value['@metadata']['transferStats']['http'][0]) + ? $value['@metadata']['transferStats']['http'][0] + : []; + $stats['http'] []= $resultStats; + } + } + + private function bindStatsToReturn($return, array $stats) + { + if ($return instanceof ResultInterface) { + if (!isset($return['@metadata'])) { + $return['@metadata'] = []; + } + + $return['@metadata']['transferStats'] = $stats; + } elseif ($return instanceof AwsException) { + $return->setTransferInfo($stats); + } + + return $return; + } +} diff --git a/vendor/aws/aws-sdk-php/src/RetryMiddleware.php b/vendor/aws/aws-sdk-php/src/RetryMiddleware.php new file mode 100644 index 0000000..bb550df --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/RetryMiddleware.php @@ -0,0 +1,277 @@ + true, + 502 => true, + 503 => true, + 504 => true + ]; + + private static $retryCodes = [ + // Throttling error + 'RequestLimitExceeded' => true, + 'Throttling' => true, + 'ThrottlingException' => true, + 'ThrottledException' => true, + 'ProvisionedThroughputExceededException' => true, + 'RequestThrottled' => true, + 'BandwidthLimitExceeded' => true, + 'RequestThrottledException' => true, + 'TooManyRequestsException' => true, + 'IDPCommunicationError' => true, + 'EC2ThrottledException' => true, + ]; + + private $decider; + private $delay; + private $nextHandler; + private $collectStats; + + public function __construct( + callable $decider, + callable $delay, + callable $nextHandler, + $collectStats = false + ) { + $this->decider = $decider; + $this->delay = $delay; + $this->nextHandler = $nextHandler; + $this->collectStats = (bool) $collectStats; + } + + /** + * Creates a default AWS retry decider function. + * + * The optional $extraConfig parameter is an associative array + * that specifies additional retry conditions on top of the ones specified + * by default by the Aws\RetryMiddleware class, with the following keys: + * + * - errorCodes: (string[]) An indexed array of AWS exception codes to retry. + * Optional. + * - statusCodes: (int[]) An indexed array of HTTP status codes to retry. + * Optional. + * - curlErrors: (int[]) An indexed array of Curl error codes to retry. Note + * these should be valid Curl constants. Optional. + * + * @param int $maxRetries + * @param array $extraConfig + * @return callable + */ + public static function createDefaultDecider( + $maxRetries = 3, + $extraConfig = [] + ) { + $retryCurlErrors = []; + if (extension_loaded('curl')) { + $retryCurlErrors[CURLE_RECV_ERROR] = true; + } + + return function ( + $retries, + CommandInterface $command, + RequestInterface $request, + ?ResultInterface $result = null, + $error = null + ) use ($maxRetries, $retryCurlErrors, $extraConfig) { + // Allow command-level options to override this value + $maxRetries = null !== $command['@retries'] ? + $command['@retries'] + : $maxRetries; + + $isRetryable = self::isRetryable( + $result, + $error, + $retryCurlErrors, + $extraConfig + ); + + if ($retries >= $maxRetries) { + if (!empty($error) + && $error instanceof AwsException + && $isRetryable + ) { + $error->setMaxRetriesExceeded(); + } + return false; + } + + return $isRetryable; + }; + } + + private static function isRetryable( + $result, + $error, + $retryCurlErrors, + $extraConfig = [] + ) { + $errorCodes = self::$retryCodes; + if (!empty($extraConfig['error_codes']) + && is_array($extraConfig['error_codes']) + ) { + foreach($extraConfig['error_codes'] as $code) { + $errorCodes[$code] = true; + } + } + + $statusCodes = self::$retryStatusCodes; + if (!empty($extraConfig['status_codes']) + && is_array($extraConfig['status_codes']) + ) { + foreach($extraConfig['status_codes'] as $code) { + $statusCodes[$code] = true; + } + } + + if (!empty($extraConfig['curl_errors']) + && is_array($extraConfig['curl_errors']) + ) { + foreach($extraConfig['curl_errors'] as $code) { + $retryCurlErrors[$code] = true; + } + } + + if (!$error) { + if (!isset($result['@metadata']['statusCode'])) { + return false; + } + return isset($statusCodes[$result['@metadata']['statusCode']]); + } + + if (!($error instanceof AwsException)) { + return false; + } + + if ($error->isConnectionError()) { + return true; + } + + if (isset($errorCodes[$error->getAwsErrorCode()])) { + return true; + } + + if (isset($statusCodes[$error->getStatusCode()])) { + return true; + } + + if (count($retryCurlErrors) + && ($previous = $error->getPrevious()) + && $previous instanceof RequestException + ) { + if (method_exists($previous, 'getHandlerContext')) { + $context = $previous->getHandlerContext(); + return !empty($context['errno']) + && isset($retryCurlErrors[$context['errno']]); + } + + $message = $previous->getMessage(); + foreach (array_keys($retryCurlErrors) as $curlError) { + if (strpos($message, 'cURL error ' . $curlError . ':') === 0) { + return true; + } + } + } + + return false; + } + + /** + * Delay function that calculates an exponential delay. + * + * Exponential backoff with jitter, 100ms base, 20 sec ceiling + * + * @param $retries - The number of retries that have already been attempted + * + * @return int + * + * @link https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ + */ + public static function exponentialDelay($retries) + { + return mt_rand(0, (int) min(20000, (int) pow(2, $retries) * 100)); + } + + /** + * @param CommandInterface $command + * @param RequestInterface $request + * + * @return PromiseInterface + */ + public function __invoke( + CommandInterface $command, + ?RequestInterface $request = null + ) { + $retries = 0; + $requestStats = []; + $monitoringEvents = []; + $handler = $this->nextHandler; + $decider = $this->decider; + $delay = $this->delay; + + $request = $this->addRetryHeader($request, 0, 0); + + $g = function ($value) use ( + $handler, + $decider, + $delay, + $command, + $request, + &$retries, + &$requestStats, + &$monitoringEvents, + &$g + ) { + $this->updateHttpStats($value, $requestStats); + + if ($value instanceof MonitoringEventsInterface) { + $reversedEvents = array_reverse($monitoringEvents); + $monitoringEvents = array_merge($monitoringEvents, $value->getMonitoringEvents()); + foreach ($reversedEvents as $event) { + $value->prependMonitoringEvent($event); + } + } + if ($value instanceof \Exception || $value instanceof \Throwable) { + if (!$decider($retries, $command, $request, null, $value)) { + return Promise\Create::rejectionFor( + $this->bindStatsToReturn($value, $requestStats) + ); + } + } elseif ($value instanceof ResultInterface + && !$decider($retries, $command, $request, $value, null) + ) { + return $this->bindStatsToReturn($value, $requestStats); + } + + // Delay fn is called with 0, 1, ... so increment after the call. + $delayBy = $delay($retries++); + $command['@http']['delay'] = $delayBy; + if ($this->collectStats) { + $this->updateStats($retries, $delayBy, $requestStats); + } + + // Update retry header with retry count and delayBy + $request = $this->addRetryHeader($request, $retries, $delayBy); + + return $handler($command, $request)->then($g, $g); + }; + + return $handler($command, $request)->then($g, $g); + } +} diff --git a/vendor/aws/aws-sdk-php/src/RetryMiddlewareV2.php b/vendor/aws/aws-sdk-php/src/RetryMiddlewareV2.php new file mode 100644 index 0000000..ba989ad --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/RetryMiddlewareV2.php @@ -0,0 +1,377 @@ + true, + 'ThrottlingException' => true, + 'ThrottledException' => true, + 'RequestThrottledException' => true, + 'TooManyRequestsException' => true, + 'ProvisionedThroughputExceededException' => true, + 'TransactionInProgressException' => true, + 'RequestLimitExceeded' => true, + 'BandwidthLimitExceeded' => true, + 'LimitExceededException' => true, + 'RequestThrottled' => true, + 'SlowDown' => true, + 'PriorRequestNotComplete' => true, + 'EC2ThrottledException' => true, + ]; + + private static $standardTransientErrors = [ + 'RequestTimeout' => true, + 'RequestTimeoutException' => true, + ]; + + private static $standardTransientStatusCodes = [ + 500 => true, + 502 => true, + 503 => true, + 504 => true, + ]; + + private $collectStats; + private $decider; + private $delayer; + private $maxAttempts; + private $maxBackoff; + private $mode; + private $nextHandler; + private $options; + private $quotaManager; + private $rateLimiter; + + public static function wrap($config, $options) + { + return function (callable $handler) use ( + $config, + $options + ) { + return new static( + $config, + $handler, + $options + ); + }; + } + + public static function createDefaultDecider( + QuotaManager $quotaManager, + $maxAttempts = 3, + $options = [] + ) { + $retryCurlErrors = []; + if (extension_loaded('curl')) { + $retryCurlErrors[CURLE_RECV_ERROR] = true; + } + + return function( + $attempts, + CommandInterface $command, + $result + ) use ($options, $quotaManager, $retryCurlErrors, $maxAttempts) { + + // Release retry tokens back to quota on a successful result + $quotaManager->releaseToQuota($result); + + // Allow command-level option to override this value + // # of attempts = # of retries + 1 + $maxAttempts = (null !== $command['@retries']) + ? $command['@retries'] + 1 + : $maxAttempts; + + $isRetryable = self::isRetryable( + $result, + $retryCurlErrors, + $options + ); + + if ($isRetryable) { + + // Retrieve retry tokens and check if quota has been exceeded + if (!$quotaManager->hasRetryQuota($result)) { + return false; + } + + if ($attempts >= $maxAttempts) { + if (!empty($result) && $result instanceof AwsException) { + $result->setMaxRetriesExceeded(); + } + return false; + } + } + + return $isRetryable; + }; + } + + public function __construct( + ConfigurationInterface $config, + callable $handler, + $options = [] + ) { + $this->options = $options; + $this->maxAttempts = $config->getMaxAttempts(); + $this->mode = $config->getMode(); + $this->nextHandler = $handler; + $this->quotaManager = new QuotaManager(); + + $this->maxBackoff = isset($options['max_backoff']) + ? $options['max_backoff'] + : 20000; + + $this->collectStats = isset($options['collect_stats']) + ? (bool) $options['collect_stats'] + : false; + + $this->decider = isset($options['decider']) + ? $options['decider'] + : self::createDefaultDecider( + $this->quotaManager, + $this->maxAttempts, + $options + ); + + $this->delayer = isset($options['delayer']) + ? $options['delayer'] + : function ($attempts) { + return $this->exponentialDelayWithJitter($attempts); + }; + + if ($this->mode === 'adaptive') { + $this->rateLimiter = isset($options['rate_limiter']) + ? $options['rate_limiter'] + : new RateLimiter(); + } + } + + public function __invoke(CommandInterface $cmd, RequestInterface $req) + { + $decider = $this->decider; + $delayer = $this->delayer; + $handler = $this->nextHandler; + + $attempts = 1; + $monitoringEvents = []; + $requestStats = []; + + $req = $this->addRetryHeader($req, 0, 0); + + $callback = function ($value) use ( + $handler, + $cmd, + $req, + $decider, + $delayer, + &$attempts, + &$requestStats, + &$monitoringEvents, + &$callback + ) { + if ($this->mode === 'adaptive') { + $this->rateLimiter->updateSendingRate($this->isThrottlingError($value)); + } + + $this->updateHttpStats($value, $requestStats); + + if ($value instanceof MonitoringEventsInterface) { + $reversedEvents = array_reverse($monitoringEvents); + $monitoringEvents = array_merge($monitoringEvents, $value->getMonitoringEvents()); + foreach ($reversedEvents as $event) { + $value->prependMonitoringEvent($event); + } + } + if ($value instanceof \Exception || $value instanceof \Throwable) { + if (!$decider($attempts, $cmd, $value)) { + return Promise\Create::rejectionFor( + $this->bindStatsToReturn($value, $requestStats) + ); + } + } elseif ($value instanceof ResultInterface + && !$decider($attempts, $cmd, $value) + ) { + return $this->bindStatsToReturn($value, $requestStats); + } + + $delayBy = $delayer($attempts++); + $cmd['@http']['delay'] = $delayBy; + if ($this->collectStats) { + $this->updateStats($attempts - 1, $delayBy, $requestStats); + } + + // Update retry header with retry count and delayBy + $req = $this->addRetryHeader($req, $attempts - 1, $delayBy); + + // Get token from rate limiter, which will sleep if necessary + if ($this->mode === 'adaptive') { + $this->rateLimiter->getSendToken(); + } + + return $handler($cmd, $req)->then($callback, $callback); + }; + + // Get token from rate limiter, which will sleep if necessary + if ($this->mode === 'adaptive') { + $this->rateLimiter->getSendToken(); + } + + return $handler($cmd, $req)->then($callback, $callback); + } + + /** + * Amount of milliseconds to delay as a function of attempt number + * + * @param $attempts + * @return mixed + */ + public function exponentialDelayWithJitter($attempts) + { + $rand = mt_rand() / mt_getrandmax(); + return min(1000 * $rand * pow(2, $attempts) , $this->maxBackoff); + } + + private static function isRetryable( + $result, + $retryCurlErrors, + $options = [] + ) { + $errorCodes = self::$standardThrottlingErrors + self::$standardTransientErrors; + if (!empty($options['transient_error_codes']) + && is_array($options['transient_error_codes']) + ) { + foreach($options['transient_error_codes'] as $code) { + $errorCodes[$code] = true; + } + } + if (!empty($options['throttling_error_codes']) + && is_array($options['throttling_error_codes']) + ) { + foreach($options['throttling_error_codes'] as $code) { + $errorCodes[$code] = true; + } + } + + $statusCodes = self::$standardTransientStatusCodes; + if (!empty($options['status_codes']) + && is_array($options['status_codes']) + ) { + foreach($options['status_codes'] as $code) { + $statusCodes[$code] = true; + } + } + + if (!empty($options['curl_errors']) + && is_array($options['curl_errors']) + ) { + foreach($options['curl_errors'] as $code) { + $retryCurlErrors[$code] = true; + } + } + + if ($result instanceof \Exception || $result instanceof \Throwable) { + $isError = true; + } else { + $isError = false; + } + + if (!$isError) { + if (!isset($result['@metadata']['statusCode'])) { + return false; + } + return isset($statusCodes[$result['@metadata']['statusCode']]); + } + + if (!($result instanceof AwsException)) { + return false; + } + + if ($result->isConnectionError()) { + return true; + } + + if (!empty($errorCodes[$result->getAwsErrorCode()])) { + return true; + } + + if (!empty($statusCodes[$result->getStatusCode()])) { + return true; + } + + if (count($retryCurlErrors) + && ($previous = $result->getPrevious()) + && $previous instanceof RequestException + ) { + if (method_exists($previous, 'getHandlerContext')) { + $context = $previous->getHandlerContext(); + return !empty($context['errno']) + && isset($retryCurlErrors[$context['errno']]); + } + + $message = $previous->getMessage(); + foreach (array_keys($retryCurlErrors) as $curlError) { + if (strpos($message, 'cURL error ' . $curlError . ':') === 0) { + return true; + } + } + } + + // Check error shape for the retryable trait + if (!empty($errorShape = $result->getAwsErrorShape())) { + $definition = $errorShape->toArray(); + if (!empty($definition['retryable'])) { + return true; + } + } + + return false; + } + + private function isThrottlingError($result) + { + if ($result instanceof AwsException) { + // Check pre-defined throttling errors + $throttlingErrors = self::$standardThrottlingErrors; + if (!empty($this->options['throttling_error_codes']) + && is_array($this->options['throttling_error_codes']) + ) { + foreach($this->options['throttling_error_codes'] as $code) { + $throttlingErrors[$code] = true; + } + } + if (!empty($result->getAwsErrorCode()) + && !empty($throttlingErrors[$result->getAwsErrorCode()]) + ) { + return true; + } + + // Check error shape for the throttling trait + if (!empty($errorShape = $result->getAwsErrorShape())) { + $definition = $errorShape->toArray(); + if (!empty($definition['retryable']['throttling'])) { + return true; + } + } + } + + return false; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/AmbiguousSuccessParser.php b/vendor/aws/aws-sdk-php/src/S3/AmbiguousSuccessParser.php new file mode 100644 index 0000000..18d3a17 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/AmbiguousSuccessParser.php @@ -0,0 +1,79 @@ + true, + 'UploadPartCopy' => true, + 'CopyObject' => true, + 'CompleteMultipartUpload' => true, + ]; + + /** @var callable */ + private $errorParser; + /** @var string */ + private $exceptionClass; + + public function __construct( + callable $parser, + callable $errorParser, + $exceptionClass = AwsException::class + ) { + $this->parser = $parser; + $this->errorParser = $errorParser; + $this->exceptionClass = $exceptionClass; + } + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + if (200 === $response->getStatusCode() + && isset(self::$ambiguousSuccesses[$command->getName()]) + ) { + $errorParser = $this->errorParser; + try { + $parsed = $errorParser($response); + } catch (ParserException $e) { + $parsed = [ + 'code' => 'ConnectionError', + 'message' => "An error connecting to the service occurred" + . " while performing the " . $command->getName() + . " operation." + ]; + } + if (isset($parsed['code']) && isset($parsed['message'])) { + throw new $this->exceptionClass( + $parsed['message'], + $command, + ['connection_error' => true] + ); + } + } + + $fn = $this->parser; + return $fn($command, $response); + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + return $this->parser->parseMemberFromStream($stream, $member, $response); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php new file mode 100644 index 0000000..2ed4519 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/ApplyChecksumMiddleware.php @@ -0,0 +1,242 @@ + true, + 'UploadPart' => true, + ]; + + /** @var Service */ + private $api; + + /** @var array */ + private $config; + + /** @var callable */ + private $nextHandler; + + /** + * Create a middleware wrapper function. + * + * @param Service $api + * @return callable + */ + public static function wrap(Service $api, array $config = []) + { + return function (callable $handler) use ($api, $config) { + return new self($handler, $api, $config); + }; + } + + public function __construct( + callable $nextHandler, + Service $api, + array $config = [] + ) + { + $this->api = $api; + $this->nextHandler = $nextHandler; + $this->config = $config; + } + + public function __invoke( + CommandInterface $command, + RequestInterface $request + ) { + $next = $this->nextHandler; + $name = $command->getName(); + $body = $request->getBody(); + $operation = $this->api->getOperation($name); + $mode = $this->config['request_checksum_calculation'] + ?? self::DEFAULT_CALCULATION_MODE; + + $command->getMetricsBuilder()->identifyMetricByValueAndAppend( + 'request_checksum_calculation', + $mode + ); + + // Trigger warning if AddContentMD5 is specified for PutObject or UploadPart + $this->handleDeprecatedAddContentMD5($command); + + $checksumInfo = $operation['httpChecksum'] ?? []; + $checksumMemberName = $checksumInfo['requestAlgorithmMember'] ?? ''; + $checksumMember = !empty($checksumMemberName) + ? $operation->getInput()->getMember($checksumMemberName) + : null; + $checksumRequired = $checksumInfo['requestChecksumRequired'] ?? false; + $requestedAlgorithm = $command[$checksumMemberName] ?? null; + + $shouldAddChecksum = $this->shouldAddChecksum( + $mode, + $checksumRequired, + $checksumMember, + $requestedAlgorithm + ); + if ($shouldAddChecksum) { + if (!$this->hasAlgorithmHeader($request)) { + $supportedAlgorithms = array_map('strtolower', $checksumMember['enum'] ?? []); + $algorithm = $this->determineChecksumAlgorithm( + $supportedAlgorithms, + $requestedAlgorithm, + $checksumMemberName + ); + $request = $this->addAlgorithmHeader($algorithm, $request, $body); + + $command->getMetricsBuilder()->identifyMetricByValueAndAppend( + 'request_checksum', + $algorithm + ); + } + } + + // Set the content hash header if ContentSHA256 is provided + if (isset(self::$sha256[$name]) && $command['ContentSHA256']) { + $request = $request->withHeader( + 'X-Amz-Content-Sha256', + $command['ContentSHA256'] + ); + $command->getMetricsBuilder()->append( + MetricsBuilder::FLEXIBLE_CHECKSUMS_REQ_SHA256 + ); + } + + return $next($command, $request); + } + + /** + * @param CommandInterface $command + * + * @return void + */ + private function handleDeprecatedAddContentMD5(CommandInterface $command): void + { + if (!empty($command['AddContentMD5'])) { + trigger_error( + 'S3 no longer supports MD5 checksums. ' . + 'A CRC32 checksum will be computed and applied on your behalf.', + E_USER_DEPRECATED + ); + $command['ChecksumAlgorithm'] = self::DEFAULT_ALGORITHM; + } + } + + /** + * @param string $mode + * @param Shape|null $checksumMember + * @param string $name + * @param bool $checksumRequired + * @param string|null $requestedAlgorithm + * + * @return bool + */ + private function shouldAddChecksum( + string $mode, + bool $checksumRequired, + ?Shape $checksumMember, + ?string $requestedAlgorithm + ): bool + { + return ($mode === 'when_supported' && $checksumMember) + || ($mode === 'when_required' + && ($checksumRequired || ($checksumMember && $requestedAlgorithm))); + } + + /** + * @param Shape|null $checksumMember + * @param string|null $requestedAlgorithm + * @param string|null $checksumMemberName + * + * @return string + */ + private function determineChecksumAlgorithm( + array $supportedAlgorithms, + ?string $requestedAlgorithm, + ?string $checksumMemberName + ): string + { + $algorithm = self::DEFAULT_ALGORITHM; + + if ($requestedAlgorithm) { + $requestedAlgorithm = strtolower($requestedAlgorithm); + if (!in_array($requestedAlgorithm, $supportedAlgorithms)) { + throw new InvalidArgumentException( + "Unsupported algorithm supplied for input variable {$checksumMemberName}. " . + "Supported checksums for this operation include: " + . implode(", ", $supportedAlgorithms) . "." + ); + } + $algorithm = $requestedAlgorithm; + } + + return $algorithm; + } + + /** + * @param string $requestedAlgorithm + * @param RequestInterface $request + * @param StreamInterface $body + * + * @return RequestInterface + */ + private function addAlgorithmHeader( + string $requestedAlgorithm, + RequestInterface $request, + StreamInterface $body + ): RequestInterface + { + $headerName = "x-amz-checksum-{$requestedAlgorithm}"; + if (!$request->hasHeader($headerName)) { + $encoded = self::getEncodedValue($requestedAlgorithm, $body); + $request = $request->withHeader($headerName, $encoded); + } + + return $request; + } + + /** + * @param RequestInterface $request + * + * @return bool + */ + private function hasAlgorithmHeader(RequestInterface $request): bool + { + $headers = $request->getHeaders(); + + foreach ($headers as $name => $values) { + if (stripos($name, 'x-amz-checksum-') === 0) { + return true; + } + } + + return false; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/BatchDelete.php b/vendor/aws/aws-sdk-php/src/S3/BatchDelete.php new file mode 100644 index 0000000..db81beb --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/BatchDelete.php @@ -0,0 +1,240 @@ + 'us-west-2', + * 'version' => 'latest' + * ]); + * + * $listObjectsParams = ['Bucket' => 'foo', 'Prefix' => 'starts/with/']; + * $delete = Aws\S3\BatchDelete::fromListObjects($s3, $listObjectsParams); + * // Asynchronously delete + * $promise = $delete->promise(); + * // Force synchronous completion + * $delete->delete(); + * + * When using one of the batch delete creational static methods, you can supply + * an associative array of options: + * + * - before: Function invoked before executing a command. The function is + * passed the command that is about to be executed. This can be useful + * for logging, adding custom request headers, etc. + * - batch_size: The size of each delete batch. Defaults to 1000. + * + * @link http://docs.aws.amazon.com/AmazonS3/latest/API/multiobjectdeleteapi.html + */ +class BatchDelete implements PromisorInterface +{ + private $bucket; + /** @var AwsClientInterface */ + private $client; + /** @var callable */ + private $before; + /** @var PromiseInterface */ + private $cachedPromise; + /** @var callable */ + private $promiseCreator; + private $batchSize = 1000; + private $queue = []; + + /** + * Creates a BatchDelete object from all of the paginated results of a + * ListObjects operation. Each result that is returned by the ListObjects + * operation will be deleted. + * + * @param AwsClientInterface $client AWS Client to use. + * @param array $listObjectsParams ListObjects API parameters + * @param array $options BatchDelete options. + * + * @return BatchDelete + */ + public static function fromListObjects( + AwsClientInterface $client, + array $listObjectsParams, + array $options = [] + ) { + $iter = $client->getPaginator('ListObjects', $listObjectsParams); + $bucket = $listObjectsParams['Bucket']; + $fn = function (BatchDelete $that) use ($iter) { + return $iter->each(function ($result) use ($that) { + $promises = []; + if (is_array($result['Contents'])) { + foreach ($result['Contents'] as $object) { + if ($promise = $that->enqueue($object)) { + $promises[] = $promise; + } + } + } + return $promises ? Promise\Utils::all($promises) : null; + }); + }; + + return new self($client, $bucket, $fn, $options); + } + + /** + * Creates a BatchDelete object from an iterator that yields results. + * + * @param AwsClientInterface $client AWS Client to use to execute commands + * @param string $bucket Bucket where the objects are stored + * @param \Iterator $iter Iterator that yields assoc arrays + * @param array $options BatchDelete options + * + * @return BatchDelete + */ + public static function fromIterator( + AwsClientInterface $client, + $bucket, + \Iterator $iter, + array $options = [] + ) { + $fn = function (BatchDelete $that) use ($iter) { + return Promise\Coroutine::of(function () use ($that, $iter) { + foreach ($iter as $obj) { + if ($promise = $that->enqueue($obj)) { + yield $promise; + } + } + }); + }; + + return new self($client, $bucket, $fn, $options); + } + + /** + * @return PromiseInterface + */ + public function promise(): PromiseInterface + { + if (!$this->cachedPromise) { + $this->cachedPromise = $this->createPromise(); + } + + return $this->cachedPromise; + } + + /** + * Synchronously deletes all of the objects. + * + * @throws DeleteMultipleObjectsException on error. + */ + public function delete() + { + $this->promise()->wait(); + } + + /** + * @param AwsClientInterface $client Client used to transfer the requests + * @param string $bucket Bucket to delete from. + * @param callable $promiseFn Creates a promise. + * @param array $options Hash of options used with the batch + * + * @throws \InvalidArgumentException if the provided batch_size is <= 0 + */ + private function __construct( + AwsClientInterface $client, + $bucket, + callable $promiseFn, + array $options = [] + ) { + $this->client = $client; + $this->bucket = $bucket; + $this->promiseCreator = $promiseFn; + + if (isset($options['before'])) { + if (!is_callable($options['before'])) { + throw new \InvalidArgumentException('before must be callable'); + } + $this->before = $options['before']; + } + + if (isset($options['batch_size'])) { + if ($options['batch_size'] <= 0) { + throw new \InvalidArgumentException('batch_size is not > 0'); + } + $this->batchSize = min($options['batch_size'], 1000); + } + } + + private function enqueue(array $obj) + { + $this->queue[] = $obj; + return count($this->queue) >= $this->batchSize + ? $this->flushQueue() + : null; + } + + private function flushQueue() + { + static $validKeys = ['Key' => true, 'VersionId' => true]; + + if (count($this->queue) === 0) { + return null; + } + + $batch = []; + while ($obj = array_shift($this->queue)) { + $batch[] = array_intersect_key($obj, $validKeys); + } + + $command = $this->client->getCommand('DeleteObjects', [ + 'Bucket' => $this->bucket, + 'Delete' => ['Objects' => $batch] + ]); + + if ($this->before) { + call_user_func($this->before, $command); + } + + return $this->client->executeAsync($command) + ->then(function ($result) { + if (!empty($result['Errors'])) { + throw new DeleteMultipleObjectsException( + $result['Deleted'] ?: [], + $result['Errors'] + ); + } + return $result; + }); + } + + /** + * Returns a promise that will clean up any references when it completes. + * + * @return PromiseInterface + */ + private function createPromise() + { + // Create the promise + $promise = call_user_func($this->promiseCreator, $this); + $this->promiseCreator = null; + + // Cleans up the promise state and references. + $cleanup = function () { + $this->before = $this->client = $this->queue = null; + }; + + // When done, ensure cleanup and that any remaining are processed. + return $promise->then( + function () use ($cleanup) { + return Promise\Create::promiseFor($this->flushQueue()) + ->then($cleanup); + }, + function ($reason) use ($cleanup) { + $cleanup(); + return Promise\Create::rejectionFor($reason); + } + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/BucketEndpointArnMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/BucketEndpointArnMiddleware.php new file mode 100644 index 0000000..becfded --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/BucketEndpointArnMiddleware.php @@ -0,0 +1,355 @@ +partitionProvider = PartitionEndpointProvider::defaultProvider(); + $this->region = $region; + $this->service = $service; + $this->config = $config; + $this->nextHandler = $nextHandler; + $this->isUseEndpointV2 = $isUseEndpointV2; + } + + public function __invoke(CommandInterface $cmd, RequestInterface $req) + { + $nextHandler = $this->nextHandler; + + $op = $this->service->getOperation($cmd->getName())->toArray(); + if (!empty($op['input']['shape'])) { + $service = $this->service->toArray(); + if (!empty($input = $service['shapes'][$op['input']['shape']])) { + foreach ($input['members'] as $key => $member) { + if ($member['shape'] === 'BucketName') { + $arnableKey = $key; + break; + } + } + + if (!empty($arnableKey) && ArnParser::isArn($cmd[$arnableKey])) { + + try { + // Throw for commands that do not support ARN inputs + if (in_array($cmd->getName(), $this->nonArnableCommands)) { + throw new S3Exception( + 'ARN values cannot be used in the bucket field for' + . ' the ' . $cmd->getName() . ' operation.', + $cmd + ); + } + + if (!$this->isUseEndpointV2) { + $arn = ArnParser::parse($cmd[$arnableKey]); + $partition = $this->validateArn($arn); + $host = $this->generateAccessPointHost($arn, $req); + } + // Remove encoded bucket string from path + $path = $req->getUri()->getPath(); + $encoded = rawurlencode($cmd[$arnableKey]); + $len = strlen($encoded) + 1; + if (trim(substr($path, 0, $len), '/') === "{$encoded}") { + $path = substr($path, $len); + if (substr($path, 0, 1) !== "/") { + $path = '/' . $path; + } + } + if (empty($path)) { + $path = ''; + } + + // Set modified request + if ($this->isUseEndpointV2) { + $req = $req->withUri( + $req->getUri()->withPath($path) + + ); + goto next; + } + + $req = $req->withUri( + $req->getUri()->withPath($path)->withHost($host) + ); + + // Update signing region based on ARN data if configured to do so + if ($this->config['use_arn_region']->isUseArnRegion() + && !$this->config['use_fips_endpoint']->isUseFipsEndpoint() + ) { + $region = $arn->getRegion(); + } else { + $region = $this->region; + } + $endpointData = $partition([ + 'region' => $region, + 'service' => $arn->getService() + ]); + $cmd['@context']['signing_region'] = $endpointData['signingRegion']; + + // Update signing service for Outposts and Lambda ARNs + if ($arn instanceof OutpostsArnInterface + || $arn instanceof ObjectLambdaAccessPointArn + ) { + $cmd['@context']['signing_service'] = $arn->getService(); + } + } catch (InvalidArnException $e) { + // Add context to ARN exception + throw new S3Exception( + 'Bucket parameter parsed as ARN and failed with: ' + . $e->getMessage(), + $cmd, + [], + $e + ); + } + } + } + } + next: + return $nextHandler($cmd, $req); + } + + + private function generateAccessPointHost( + BaseAccessPointArn $arn, + RequestInterface $req + ) { + if ($arn instanceof OutpostsAccessPointArn) { + $accesspointName = $arn->getAccesspointName(); + } else { + $accesspointName = $arn->getResourceId(); + } + + if ($arn instanceof MultiRegionAccessPointArn) { + $partition = $this->partitionProvider->getPartitionByName( + $arn->getPartition(), + 's3' + ); + $dnsSuffix = $partition->getDnsSuffix(); + return "{$accesspointName}.accesspoint.s3-global.{$dnsSuffix}"; + } + + $host = "{$accesspointName}-" . $arn->getAccountId(); + + $useFips = $this->config['use_fips_endpoint']->isUseFipsEndpoint(); + $fipsString = $useFips ? "-fips" : ""; + + if ($arn instanceof OutpostsAccessPointArn) { + $host .= '.' . $arn->getOutpostId() . '.s3-outposts'; + } else if ($arn instanceof ObjectLambdaAccessPointArn) { + if (!empty($this->config['endpoint'])) { + return $host . '.' . $this->config['endpoint']; + } else { + $host .= ".s3-object-lambda{$fipsString}"; + } + } else { + $host .= ".s3-accesspoint{$fipsString}"; + if (!empty($this->config['dual_stack'])) { + $host .= '.dualstack'; + } + } + + if (!empty($this->config['use_arn_region']->isUseArnRegion())) { + $region = $arn->getRegion(); + } else { + $region = $this->region; + } + $region = \Aws\strip_fips_pseudo_regions($region); + $host .= '.' . $region . '.' . $this->getPartitionSuffix($arn, $this->partitionProvider); + return $host; + } + + /** + * Validates an ARN, returning a partition object corresponding to the ARN + * if successful + * + * @param $arn + * @return \Aws\Endpoint\Partition + */ + private function validateArn($arn) + { + if ($arn instanceof AccessPointArnInterface) { + + // Dualstack is not supported with Outposts access points + if ($arn instanceof OutpostsAccessPointArn + && !empty($this->config['dual_stack']) + ) { + throw new UnresolvedEndpointException( + 'Dualstack is currently not supported with S3 Outposts access' + . ' points. Please disable dualstack or do not supply an' + . ' access point ARN.'); + } + if ($arn instanceof MultiRegionAccessPointArn) { + if (!empty($this->config['disable_multiregion_access_points'])) { + throw new UnresolvedEndpointException( + 'Multi-Region Access Point ARNs are disabled, but one was provided. Please' + . ' enable them or provide a different ARN.' + ); + } + if (!empty($this->config['dual_stack'])) { + throw new UnresolvedEndpointException( + 'Multi-Region Access Point ARNs do not currently support dual stack. Please' + . ' disable dual stack or provide a different ARN.' + ); + } + } + // Accelerate is not supported with access points + if (!empty($this->config['accelerate'])) { + throw new UnresolvedEndpointException( + 'Accelerate is currently not supported with access points.' + . ' Please disable accelerate or do not supply an access' + . ' point ARN.'); + } + + // Path-style is not supported with access points + if (!empty($this->config['path_style'])) { + throw new UnresolvedEndpointException( + 'Path-style addressing is currently not supported with' + . ' access points. Please disable path-style or do not' + . ' supply an access point ARN.'); + } + + // Custom endpoint is not supported with access points + if (!is_null($this->config['endpoint']) + && !$arn instanceof ObjectLambdaAccessPointArn + ) { + throw new UnresolvedEndpointException( + 'A custom endpoint has been supplied along with an access' + . ' point ARN, and these are not compatible with each other.' + . ' Please only use one or the other.'); + } + + // Dualstack is not supported with object lambda access points + if ($arn instanceof ObjectLambdaAccessPointArn + && !empty($this->config['dual_stack']) + ) { + throw new UnresolvedEndpointException( + 'Dualstack is currently not supported with Object Lambda access' + . ' points. Please disable dualstack or do not supply an' + . ' access point ARN.'); + } + // Global endpoints do not support cross-region requests + if ($this->isGlobal($this->region) + && $this->config['use_arn_region']->isUseArnRegion() == false + && $arn->getRegion() != $this->region + && !$arn instanceof MultiRegionAccessPointArn + ) { + throw new UnresolvedEndpointException( + 'Global endpoints do not support cross region requests.' + . ' Please enable use_arn_region or do not supply a global region' + . ' with a different region in the ARN.'); + } + + // Get partitions for ARN and client region + $arnPart = $this->partitionProvider->getPartition( + $arn->getRegion(), + 's3' + ); + $clientPart = $this->partitionProvider->getPartition( + $this->region, + 's3' + ); + + // If client partition not found, try removing pseudo-region qualifiers + if (!($clientPart->isRegionMatch($this->region, 's3'))) { + $clientPart = $this->partitionProvider->getPartition( + \Aws\strip_fips_pseudo_regions($this->region), + 's3' + ); + } + if (!$arn instanceof MultiRegionAccessPointArn) { + // Verify that the partition matches for supplied partition and region + if ($arn->getPartition() !== $clientPart->getName()) { + throw new InvalidRegionException('The supplied ARN partition' + . " does not match the client's partition."); + } + if ($clientPart->getName() !== $arnPart->getName()) { + throw new InvalidRegionException('The corresponding partition' + . ' for the supplied ARN region does not match the' + . " client's partition."); + } + + // Ensure ARN region matches client region unless + // configured for using ARN region over client region + $this->validateMatchingRegion($arn); + + // Ensure it is not resolved to fips pseudo-region for S3 Outposts + $this->validateFipsConfigurations($arn); + } + + return $arnPart; + } + + throw new InvalidArnException('Provided ARN was not a valid S3 access' + . ' point ARN or S3 Outposts access point ARN.'); + } + + /** + * Checks if a region is global + * + * @param $region + * @return bool + */ + private function isGlobal($region) + { + return $region == 's3-external-1' || $region == 'aws-global'; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php new file mode 100644 index 0000000..131043b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php @@ -0,0 +1,111 @@ + true]; + private $nextHandler; + private bool $useEndpointV2; + private ?string $endpoint; + + /** + * Create a middleware wrapper function. + * + * @param bool $useEndpointV2 + * @param string|null $endpoint + * + * @return callable + */ + public static function wrap( + bool $useEndpointV2 = false, + ?string $endpoint = null + ): callable + { + return function (callable $handler) use ($useEndpointV2, $endpoint) { + return new self($handler, $useEndpointV2, $endpoint); + }; + } + + public function __construct( + callable $nextHandler, + bool $useEndpointV2, + ?string $endpoint = null + ) + { + $this->nextHandler = $nextHandler; + $this->useEndpointV2 = $useEndpointV2; + $this->endpoint = $endpoint; + } + + public function __invoke(CommandInterface $command, RequestInterface $request) + { + $nextHandler = $this->nextHandler; + $bucket = $command['Bucket']; + + if ($bucket && !isset(self::$exclusions[$command->getName()])) { + $request = $this->modifyRequest($request, $command); + } + + return $nextHandler($command, $request); + } + + /** + * @param string $path + * @param string $bucket + * + * @return string + */ + private function removeBucketFromPath(string $path, string $bucket): string + { + $len = strlen($bucket) + 1; + if (str_starts_with($path, "/{$bucket}")) { + $path = substr($path, $len); + } + + return $path ?: '/'; + } + + /** + * @param RequestInterface $request + * @param CommandInterface $command + * + * @return RequestInterface + */ + private function modifyRequest( + RequestInterface $request, + CommandInterface $command + ): RequestInterface + { + $uri = $request->getUri(); + $path = $uri->getPath(); + $host = $uri->getHost(); + $bucket = $command['Bucket']; + + if ($this->useEndpointV2 && !empty($this->endpoint)) { + // V2 provider adds bucket name to host by default + // preserve original host + $host = (new Uri($this->endpoint))->getHost(); + } + + $path = $this->removeBucketFromPath($path, $bucket); + + // Modify the Key to make sure the key is encoded, but slashes are not. + if ($command['Key']) { + $path = S3Client::encodeKey(rawurldecode($path)); + } + + return $request->withUri($uri->withPath($path)->withHost($host)); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/CalculatesChecksumTrait.php b/vendor/aws/aws-sdk-php/src/S3/CalculatesChecksumTrait.php new file mode 100644 index 0000000..6b2b194 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/CalculatesChecksumTrait.php @@ -0,0 +1,59 @@ + true, + 'crc32' => true, + 'sha256' => true, + 'sha1' => true + ]; + + /** + * @param string $requestedAlgorithm the algorithm to encode with + * @param string $value the value to be encoded + * @return string + */ + public static function getEncodedValue($requestedAlgorithm, $value) { + $requestedAlgorithm = strtolower($requestedAlgorithm); + $useCrt = extension_loaded('awscrt'); + + if (isset(self::$supportedAlgorithms[$requestedAlgorithm])) { + if ($useCrt) { + $crt = new Crt(); + switch ($requestedAlgorithm) { + case 'crc32c': + return base64_encode(pack('N*',($crt::crc32c($value)))); + case 'crc32': + return base64_encode(pack('N*',($crt::crc32($value)))); + default: + break; + } + } + + if ($requestedAlgorithm === 'crc32c') { + throw new CommonRuntimeException("crc32c is not supported for checksums " + . "without use of the common runtime for php. Please enable the CRT or choose " + . "a different algorithm." + ); + } + + if ($requestedAlgorithm === "crc32") { + $requestedAlgorithm = "crc32b"; + } + return base64_encode(Psr7\Utils::hash($value, $requestedAlgorithm, true)); + } + + $validAlgorithms = implode(', ', array_keys(self::$supportedAlgorithms)); + throw new InvalidArgumentException( + "Invalid checksum requested: {$requestedAlgorithm}." + . " Valid algorithms supported by the runtime are {$validAlgorithms}." + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Crypto/CryptoParamsTrait.php b/vendor/aws/aws-sdk-php/src/S3/Crypto/CryptoParamsTrait.php new file mode 100644 index 0000000..57253a4 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Crypto/CryptoParamsTrait.php @@ -0,0 +1,75 @@ +instructionFileSuffix; + } + + protected function determineGetObjectStrategy( + $result, + $instructionFileSuffix + ) { + if (isset($result['Metadata'][MetadataEnvelope::CONTENT_KEY_V2_HEADER])) { + return new HeadersMetadataStrategy(); + } + + return new InstructionFileMetadataStrategy( + $this->client, + $instructionFileSuffix + ); + } + + protected function getMetadataStrategy(array $args, $instructionFileSuffix) + { + if (!empty($args['@MetadataStrategy'])) { + if ($args['@MetadataStrategy'] instanceof MetadataStrategyInterface) { + return $args['@MetadataStrategy']; + } + + if (is_string($args['@MetadataStrategy'])) { + switch ($args['@MetadataStrategy']) { + case HeadersMetadataStrategy::class: + return new HeadersMetadataStrategy(); + case InstructionFileMetadataStrategy::class: + return new InstructionFileMetadataStrategy( + $this->client, + $instructionFileSuffix + ); + default: + throw new \InvalidArgumentException('Could not match the' + . ' specified string in "MetadataStrategy" to a' + . ' predefined strategy.'); + } + } else { + throw new \InvalidArgumentException('The metadata strategy that' + . ' was passed to "MetadataStrategy" was unrecognized.'); + } + } elseif ($instructionFileSuffix) { + return new InstructionFileMetadataStrategy( + $this->client, + $instructionFileSuffix + ); + } + + return null; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Crypto/CryptoParamsTraitV2.php b/vendor/aws/aws-sdk-php/src/S3/Crypto/CryptoParamsTraitV2.php new file mode 100644 index 0000000..0549817 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Crypto/CryptoParamsTraitV2.php @@ -0,0 +1,19 @@ +$value) { + $args['Metadata'][$header] = $value; + } + + return $args; + } + + /** + * Generates a MetadataEnvelope according to the metadata headers from the + * GetObject result. + * + * @param array $args Arguments from Command and Result that contains + * S3 Object information, relevant headers, and command + * configuration. + * + * @return MetadataEnvelope + */ + public function load(array $args) + { + $envelope = new MetadataEnvelope(); + $constantValues = MetadataEnvelope::getConstantValues(); + + foreach ($constantValues as $constant) { + if (!empty($args['Metadata'][$constant])) { + $envelope[$constant] = $args['Metadata'][$constant]; + } + } + + return $envelope; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Crypto/InstructionFileMetadataStrategy.php b/vendor/aws/aws-sdk-php/src/S3/Crypto/InstructionFileMetadataStrategy.php new file mode 100644 index 0000000..5065928 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Crypto/InstructionFileMetadataStrategy.php @@ -0,0 +1,90 @@ +suffix = empty($suffix) + ? self::DEFAULT_FILE_SUFFIX + : $suffix; + $this->client = $client; + } + + /** + * Places the information in the MetadataEnvelope to a location on S3. + * + * @param MetadataEnvelope $envelope Encryption data to save according to + * the strategy. + * @param array $args Starting arguments for PutObject, used for saving + * extra the instruction file. + * + * @return array Updated arguments for PutObject. + */ + public function save(MetadataEnvelope $envelope, array $args) + { + $this->client->putObject([ + 'Bucket' => $args['Bucket'], + 'Key' => $args['Key'] . $this->suffix, + 'Body' => json_encode($envelope) + ]); + + return $args; + } + + /** + * Uses the strategy's client to retrieve the instruction file from S3 and generates + * a MetadataEnvelope from its contents. + * + * @param array $args Arguments from Command and Result that contains + * S3 Object information, relevant headers, and command + * configuration. + * + * @return MetadataEnvelope + */ + public function load(array $args) + { + $result = $this->client->getObject([ + 'Bucket' => $args['Bucket'], + 'Key' => $args['Key'] . $this->suffix + ]); + + $metadataHeaders = json_decode($result['Body'], true); + $envelope = new MetadataEnvelope(); + $constantValues = MetadataEnvelope::getConstantValues(); + + foreach ($constantValues as $constant) { + if (!empty($metadataHeaders[$constant])) { + $envelope[$constant] = $metadataHeaders[$constant]; + } + } + + return $envelope; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionClient.php b/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionClient.php new file mode 100644 index 0000000..96cb152 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionClient.php @@ -0,0 +1,344 @@ +client = $client; + $this->instructionFileSuffix = $instructionFileSuffix; + MetricsBuilder::appendMetricsCaptureMiddleware( + $this->client->getHandlerList(), + MetricsBuilder::S3_CRYPTO_V1N + ); + } + + private static function getDefaultStrategy() + { + return new HeadersMetadataStrategy(); + } + + /** + * Encrypts the data in the 'Body' field of $args and promises to upload it + * to the specified location on S3. + * + * @param array $args Arguments for encrypting an object and uploading it + * to S3 via PutObject. + * + * The required configuration arguments are as follows: + * + * - @MaterialsProvider: (MaterialsProvider) Provides Cek, Iv, and Cek + * encrypting/decrypting for encryption metadata. + * - @CipherOptions: (array) Cipher options for encrypting data. Only the + * Cipher option is required. Accepts the following: + * - Cipher: (string) cbc|gcm + * See also: AbstractCryptoClient::$supportedCiphers. Note that + * cbc is deprecated and gcm should be used when possible. + * - KeySize: (int) 128|192|256 + * See also: MaterialsProvider::$supportedKeySizes + * - Aad: (string) Additional authentication data. This option is + * passed directly to OpenSSL when using gcm. It is ignored when + * using cbc. Note if you pass in Aad for gcm encryption, the + * PHP SDK will be able to decrypt the resulting object, but other + * AWS SDKs may not be able to do so. + * + * The optional configuration arguments are as follows: + * + * - @MetadataStrategy: (MetadataStrategy|string|null) Strategy for storing + * MetadataEnvelope information. Defaults to using a + * HeadersMetadataStrategy. Can either be a class implementing + * MetadataStrategy, a class name of a predefined strategy, or empty/null + * to default. + * - @InstructionFileSuffix: (string|null) Suffix used when writing to an + * instruction file if using an InstructionFileMetadataHandler. + * + * @return PromiseInterface + * + * @throws \InvalidArgumentException Thrown when arguments above are not + * passed or are passed incorrectly. + */ + public function putObjectAsync(array $args) + { + $provider = $this->getMaterialsProvider($args); + unset($args['@MaterialsProvider']); + + $instructionFileSuffix = $this->getInstructionFileSuffix($args); + unset($args['@InstructionFileSuffix']); + + $strategy = $this->getMetadataStrategy($args, $instructionFileSuffix); + unset($args['@MetadataStrategy']); + + $envelope = new MetadataEnvelope(); + + return Promise\Create::promiseFor($this->encrypt( + Psr7\Utils::streamFor($args['Body']), + $args['@CipherOptions'] ?: [], + $provider, + $envelope + ))->then( + function ($encryptedBodyStream) use ($args) { + $hash = new PhpHash('sha256'); + $hashingEncryptedBodyStream = new HashingStream( + $encryptedBodyStream, + $hash, + self::getContentShaDecorator($args) + ); + return [$hashingEncryptedBodyStream, $args]; + } + )->then( + function ($putObjectContents) use ($strategy, $envelope) { + list($bodyStream, $args) = $putObjectContents; + if ($strategy === null) { + $strategy = self::getDefaultStrategy(); + } + + $updatedArgs = $strategy->save($envelope, $args); + $updatedArgs['Body'] = $bodyStream; + return $updatedArgs; + } + )->then( + function ($args) { + unset($args['@CipherOptions']); + return $this->client->putObjectAsync($args); + } + ); + } + + private static function getContentShaDecorator(&$args) + { + return function ($hash) use (&$args) { + $args['ContentSHA256'] = bin2hex($hash); + }; + } + + /** + * Encrypts the data in the 'Body' field of $args and uploads it to the + * specified location on S3. + * + * @param array $args Arguments for encrypting an object and uploading it + * to S3 via PutObject. + * + * The required configuration arguments are as follows: + * + * - @MaterialsProvider: (MaterialsProvider) Provides Cek, Iv, and Cek + * encrypting/decrypting for encryption metadata. + * - @CipherOptions: (array) Cipher options for encrypting data. A Cipher + * is required. Accepts the following options: + * - Cipher: (string) cbc|gcm + * See also: AbstractCryptoClient::$supportedCiphers. Note that + * cbc is deprecated and gcm should be used when possible. + * - KeySize: (int) 128|192|256 + * See also: MaterialsProvider::$supportedKeySizes + * - Aad: (string) Additional authentication data. This option is + * passed directly to OpenSSL when using gcm. It is ignored when + * using cbc. Note if you pass in Aad for gcm encryption, the + * PHP SDK will be able to decrypt the resulting object, but other + * AWS SDKs may not be able to do so. + * + * The optional configuration arguments are as follows: + * + * - @MetadataStrategy: (MetadataStrategy|string|null) Strategy for storing + * MetadataEnvelope information. Defaults to using a + * HeadersMetadataStrategy. Can either be a class implementing + * MetadataStrategy, a class name of a predefined strategy, or empty/null + * to default. + * - @InstructionFileSuffix: (string|null) Suffix used when writing to an + * instruction file if an using an InstructionFileMetadataHandler was + * determined. + * + * @return \Aws\Result PutObject call result with the details of uploading + * the encrypted file. + * + * @throws \InvalidArgumentException Thrown when arguments above are not + * passed or are passed incorrectly. + */ + public function putObject(array $args) + { + return $this->putObjectAsync($args)->wait(); + } + + /** + * Promises to retrieve an object from S3 and decrypt the data in the + * 'Body' field. + * + * @param array $args Arguments for retrieving an object from S3 via + * GetObject and decrypting it. + * + * The required configuration argument is as follows: + * + * - @MaterialsProvider: (MaterialsProvider) Provides Cek, Iv, and Cek + * encrypting/decrypting for decryption metadata. May have data loaded + * from the MetadataEnvelope upon decryption. + * + * The optional configuration arguments are as follows: + * + * - SaveAs: (string) The path to a file on disk to save the decrypted + * object data. This will be handled by file_put_contents instead of the + * Guzzle sink. + * + * - @MetadataStrategy: (MetadataStrategy|string|null) Strategy for reading + * MetadataEnvelope information. Defaults to determining based on object + * response headers. Can either be a class implementing MetadataStrategy, + * a class name of a predefined strategy, or empty/null to default. + * - @InstructionFileSuffix: (string) Suffix used when looking for an + * instruction file if an InstructionFileMetadataHandler is being used. + * - @CipherOptions: (array) Cipher options for decrypting data. A Cipher + * is required. Accepts the following options: + * - Aad: (string) Additional authentication data. This option is + * passed directly to OpenSSL when using gcm. It is ignored when + * using cbc. + * + * @return PromiseInterface + * + * @throws \InvalidArgumentException Thrown when required arguments are not + * passed or are passed incorrectly. + */ + public function getObjectAsync(array $args) + { + $provider = $this->getMaterialsProvider($args); + unset($args['@MaterialsProvider']); + + $instructionFileSuffix = $this->getInstructionFileSuffix($args); + unset($args['@InstructionFileSuffix']); + + $strategy = $this->getMetadataStrategy($args, $instructionFileSuffix); + unset($args['@MetadataStrategy']); + + $saveAs = null; + if (!empty($args['SaveAs'])) { + $saveAs = $args['SaveAs']; + } + + $promise = $this->client->getObjectAsync($args) + ->then( + function ($result) use ( + $provider, + $instructionFileSuffix, + $strategy, + $args + ) { + if ($strategy === null) { + $strategy = $this->determineGetObjectStrategy( + $result, + $instructionFileSuffix + ); + } + + $envelope = $strategy->load($args + [ + 'Metadata' => $result['Metadata'] + ]); + + $provider = $provider->fromDecryptionEnvelope($envelope); + + $result['Body'] = $this->decrypt( + $result['Body'], + $provider, + $envelope, + isset($args['@CipherOptions']) + ? $args['@CipherOptions'] + : [] + ); + return $result; + } + )->then( + function ($result) use ($saveAs) { + if (!empty($saveAs)) { + file_put_contents( + $saveAs, + (string)$result['Body'], + LOCK_EX + ); + } + return $result; + } + ); + + return $promise; + } + + /** + * Retrieves an object from S3 and decrypts the data in the 'Body' field. + * + * @param array $args Arguments for retrieving an object from S3 via + * GetObject and decrypting it. + * + * The required configuration argument is as follows: + * + * - @MaterialsProvider: (MaterialsProvider) Provides Cek, Iv, and Cek + * encrypting/decrypting for decryption metadata. May have data loaded + * from the MetadataEnvelope upon decryption. + * + * The optional configuration arguments are as follows: + * + * - SaveAs: (string) The path to a file on disk to save the decrypted + * object data. This will be handled by file_put_contents instead of the + * Guzzle sink. + * - @InstructionFileSuffix: (string|null) Suffix used when looking for an + * instruction file if an InstructionFileMetadataHandler was detected. + * - @CipherOptions: (array) Cipher options for encrypting data. A Cipher + * is required. Accepts the following options: + * - Aad: (string) Additional authentication data. This option is + * passed directly to OpenSSL when using gcm. It is ignored when + * using cbc. + * + * @return \Aws\Result GetObject call result with the 'Body' field + * wrapped in a decryption stream with its metadata + * information. + * + * @throws \InvalidArgumentException Thrown when arguments above are not + * passed or are passed incorrectly. + */ + public function getObject(array $args) + { + return $this->getObjectAsync($args)->wait(); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionClientV2.php b/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionClientV2.php new file mode 100644 index 0000000..fe91780 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionClientV2.php @@ -0,0 +1,450 @@ + + * use Aws\Crypto\KmsMaterialsProviderV2; + * use Aws\S3\Crypto\S3EncryptionClientV2; + * use Aws\S3\S3Client; + * + * $encryptionClient = new S3EncryptionClientV2( + * new S3Client([ + * 'region' => 'us-west-2', + * 'version' => 'latest' + * ]) + * ); + * $materialsProvider = new KmsMaterialsProviderV2( + * new KmsClient([ + * 'profile' => 'default', + * 'region' => 'us-east-1', + * 'version' => 'latest', + * ], + * 'your-kms-key-id' + * ); + * + * $encryptionClient->putObject([ + * '@MaterialsProvider' => $materialsProvider, + * '@CipherOptions' => [ + * 'Cipher' => 'gcm', + * 'KeySize' => 256, + * ], + * '@KmsEncryptionContext' => ['foo' => 'bar'], + * 'Bucket' => 'your-bucket', + * 'Key' => 'your-key', + * 'Body' => 'your-encrypted-data', + * ]); + * + * + * Example read call (using objects from previous example): + * + * + * $encryptionClient->getObject([ + * '@MaterialsProvider' => $materialsProvider, + * '@CipherOptions' => [ + * 'Cipher' => 'gcm', + * 'KeySize' => 256, + * ], + * 'Bucket' => 'your-bucket', + * 'Key' => 'your-key', + * ]); + * + */ +class S3EncryptionClientV2 extends AbstractCryptoClientV2 +{ + use CipherBuilderTrait; + use CryptoParamsTraitV2; + use DecryptionTraitV2; + use EncryptionTraitV2; + use UserAgentTrait; + + const CRYPTO_VERSION = '2.1'; + + private $client; + private $instructionFileSuffix; + private $legacyWarningCount; + + /** + * @param S3Client $client The S3Client to be used for true uploading and + * retrieving objects from S3 when using the + * encryption client. + * @param string|null $instructionFileSuffix Suffix for a client wide + * default when using instruction + * files for metadata storage. + */ + public function __construct( + S3Client $client, + $instructionFileSuffix = null + ) { + $this->client = $client; + $this->instructionFileSuffix = $instructionFileSuffix; + $this->legacyWarningCount = 0; + MetricsBuilder::appendMetricsCaptureMiddleware( + $this->client->getHandlerList(), + MetricsBuilder::S3_CRYPTO_V2 + ); + } + + private static function getDefaultStrategy() + { + return new HeadersMetadataStrategy(); + } + + /** + * Encrypts the data in the 'Body' field of $args and promises to upload it + * to the specified location on S3. + * + * Note that for PHP versions of < 7.1, this operation uses an AES-GCM + * polyfill for encryption since there is no native PHP support. The + * performance for large inputs will be a lot slower than for PHP 7.1+, so + * upgrading older PHP version environments may be necessary to use this + * effectively. + * + * @param array $args Arguments for encrypting an object and uploading it + * to S3 via PutObject. + * + * The required configuration arguments are as follows: + * + * - @MaterialsProvider: (MaterialsProviderV2) Provides Cek, Iv, and Cek + * encrypting/decrypting for encryption metadata. + * - @CipherOptions: (array) Cipher options for encrypting data. Only the + * Cipher option is required. Accepts the following: + * - Cipher: (string) gcm + * See also: AbstractCryptoClientV2::$supportedCiphers + * - KeySize: (int) 128|256 + * See also: MaterialsProvider::$supportedKeySizes + * - Aad: (string) Additional authentication data. This option is + * passed directly to OpenSSL when using gcm. Note if you pass in + * Aad, the PHP SDK will be able to decrypt the resulting object, + * but other AWS SDKs may not be able to do so. + * - @KmsEncryptionContext: (array) Only required if using + * KmsMaterialsProviderV2. An associative array of key-value + * pairs to be added to the encryption context for KMS key encryption. An + * empty array may be passed if no additional context is desired. + * + * The optional configuration arguments are as follows: + * + * - @MetadataStrategy: (MetadataStrategy|string|null) Strategy for storing + * MetadataEnvelope information. Defaults to using a + * HeadersMetadataStrategy. Can either be a class implementing + * MetadataStrategy, a class name of a predefined strategy, or empty/null + * to default. + * - @InstructionFileSuffix: (string|null) Suffix used when writing to an + * instruction file if using an InstructionFileMetadataHandler. + * + * @return PromiseInterface + * + * @throws \InvalidArgumentException Thrown when arguments above are not + * passed or are passed incorrectly. + */ + public function putObjectAsync(array $args) + { + $provider = $this->getMaterialsProvider($args); + unset($args['@MaterialsProvider']); + + $instructionFileSuffix = $this->getInstructionFileSuffix($args); + unset($args['@InstructionFileSuffix']); + + $strategy = $this->getMetadataStrategy($args, $instructionFileSuffix); + unset($args['@MetadataStrategy']); + + $envelope = new MetadataEnvelope(); + + return Promise\Create::promiseFor($this->encrypt( + Psr7\Utils::streamFor($args['Body']), + $args, + $provider, + $envelope + ))->then( + function ($encryptedBodyStream) use ($args) { + $hash = new PhpHash('sha256'); + $hashingEncryptedBodyStream = new HashingStream( + $encryptedBodyStream, + $hash, + self::getContentShaDecorator($args) + ); + return [$hashingEncryptedBodyStream, $args]; + } + )->then( + function ($putObjectContents) use ($strategy, $envelope) { + list($bodyStream, $args) = $putObjectContents; + if ($strategy === null) { + $strategy = self::getDefaultStrategy(); + } + + $updatedArgs = $strategy->save($envelope, $args); + $updatedArgs['Body'] = $bodyStream; + return $updatedArgs; + } + )->then( + function ($args) { + unset($args['@CipherOptions']); + return $this->client->putObjectAsync($args); + } + ); + } + + private static function getContentShaDecorator(&$args) + { + return function ($hash) use (&$args) { + $args['ContentSHA256'] = bin2hex($hash); + }; + } + + /** + * Encrypts the data in the 'Body' field of $args and uploads it to the + * specified location on S3. + * + * Note that for PHP versions of < 7.1, this operation uses an AES-GCM + * polyfill for encryption since there is no native PHP support. The + * performance for large inputs will be a lot slower than for PHP 7.1+, so + * upgrading older PHP version environments may be necessary to use this + * effectively. + * + * @param array $args Arguments for encrypting an object and uploading it + * to S3 via PutObject. + * + * The required configuration arguments are as follows: + * + * - @MaterialsProvider: (MaterialsProvider) Provides Cek, Iv, and Cek + * encrypting/decrypting for encryption metadata. + * - @CipherOptions: (array) Cipher options for encrypting data. A Cipher + * is required. Accepts the following options: + * - Cipher: (string) gcm + * See also: AbstractCryptoClientV2::$supportedCiphers + * - KeySize: (int) 128|256 + * See also: MaterialsProvider::$supportedKeySizes + * - Aad: (string) Additional authentication data. This option is + * passed directly to OpenSSL when using gcm. Note if you pass in + * Aad, the PHP SDK will be able to decrypt the resulting object, + * but other AWS SDKs may not be able to do so. + * - @KmsEncryptionContext: (array) Only required if using + * KmsMaterialsProviderV2. An associative array of key-value + * pairs to be added to the encryption context for KMS key encryption. An + * empty array may be passed if no additional context is desired. + * + * The optional configuration arguments are as follows: + * + * - @MetadataStrategy: (MetadataStrategy|string|null) Strategy for storing + * MetadataEnvelope information. Defaults to using a + * HeadersMetadataStrategy. Can either be a class implementing + * MetadataStrategy, a class name of a predefined strategy, or empty/null + * to default. + * - @InstructionFileSuffix: (string|null) Suffix used when writing to an + * instruction file if an using an InstructionFileMetadataHandler was + * determined. + * + * @return \Aws\Result PutObject call result with the details of uploading + * the encrypted file. + * + * @throws \InvalidArgumentException Thrown when arguments above are not + * passed or are passed incorrectly. + */ + public function putObject(array $args) + { + return $this->putObjectAsync($args)->wait(); + } + + /** + * Promises to retrieve an object from S3 and decrypt the data in the + * 'Body' field. + * + * @param array $args Arguments for retrieving an object from S3 via + * GetObject and decrypting it. + * + * The required configuration argument is as follows: + * + * - @MaterialsProvider: (MaterialsProviderInterface) Provides Cek, Iv, and Cek + * encrypting/decrypting for decryption metadata. May have data loaded + * from the MetadataEnvelope upon decryption. + * - @SecurityProfile: (string) Must be set to 'V2' or 'V2_AND_LEGACY'. + * - 'V2' indicates that only objects encrypted with S3EncryptionClientV2 + * content encryption and key wrap schemas are able to be decrypted. + * - 'V2_AND_LEGACY' indicates that objects encrypted with both + * S3EncryptionClientV2 and older legacy encryption clients are able + * to be decrypted. + * + * The optional configuration arguments are as follows: + * + * - SaveAs: (string) The path to a file on disk to save the decrypted + * object data. This will be handled by file_put_contents instead of the + * Guzzle sink. + * + * - @MetadataStrategy: (MetadataStrategy|string|null) Strategy for reading + * MetadataEnvelope information. Defaults to determining based on object + * response headers. Can either be a class implementing MetadataStrategy, + * a class name of a predefined strategy, or empty/null to default. + * - @InstructionFileSuffix: (string) Suffix used when looking for an + * instruction file if an InstructionFileMetadataHandler is being used. + * - @CipherOptions: (array) Cipher options for decrypting data. A Cipher + * is required. Accepts the following options: + * - Aad: (string) Additional authentication data. This option is + * passed directly to OpenSSL when using gcm. It is ignored when + * using cbc. + * - @KmsAllowDecryptWithAnyCmk: (bool) This allows decryption with + * KMS materials for any KMS key ID, instead of needing the KMS key ID to + * be specified and provided to the decrypt operation. Ignored for non-KMS + * materials providers. Defaults to false. + * + * @return PromiseInterface + * + * @throws \InvalidArgumentException Thrown when required arguments are not + * passed or are passed incorrectly. + */ + public function getObjectAsync(array $args) + { + $provider = $this->getMaterialsProvider($args); + unset($args['@MaterialsProvider']); + + $instructionFileSuffix = $this->getInstructionFileSuffix($args); + unset($args['@InstructionFileSuffix']); + + $strategy = $this->getMetadataStrategy($args, $instructionFileSuffix); + unset($args['@MetadataStrategy']); + + if (!isset($args['@SecurityProfile']) + || !in_array($args['@SecurityProfile'], self::$supportedSecurityProfiles) + ) { + throw new CryptoException("@SecurityProfile is required and must be" + . " set to 'V2' or 'V2_AND_LEGACY'"); + } + + // Only throw this legacy warning once per client + if (in_array($args['@SecurityProfile'], self::$legacySecurityProfiles) + && $this->legacyWarningCount < 1 + ) { + $this->legacyWarningCount++; + trigger_error( + "This S3 Encryption Client operation is configured to" + . " read encrypted data with legacy encryption modes. If you" + . " don't have objects encrypted with these legacy modes," + . " you should disable support for them to enhance security. ", + E_USER_WARNING + ); + } + + $saveAs = null; + if (!empty($args['SaveAs'])) { + $saveAs = $args['SaveAs']; + } + + $promise = $this->client->getObjectAsync($args) + ->then( + function ($result) use ( + $provider, + $instructionFileSuffix, + $strategy, + $args + ) { + if ($strategy === null) { + $strategy = $this->determineGetObjectStrategy( + $result, + $instructionFileSuffix + ); + } + + $envelope = $strategy->load($args + [ + 'Metadata' => $result['Metadata'] + ]); + + $result['Body'] = $this->decrypt( + $result['Body'], + $provider, + $envelope, + $args + ); + return $result; + } + )->then( + function ($result) use ($saveAs) { + if (!empty($saveAs)) { + file_put_contents( + $saveAs, + (string)$result['Body'], + LOCK_EX + ); + } + return $result; + } + ); + + return $promise; + } + + /** + * Retrieves an object from S3 and decrypts the data in the 'Body' field. + * + * @param array $args Arguments for retrieving an object from S3 via + * GetObject and decrypting it. + * + * The required configuration argument is as follows: + * + * - @MaterialsProvider: (MaterialsProviderInterface) Provides Cek, Iv, and Cek + * encrypting/decrypting for decryption metadata. May have data loaded + * from the MetadataEnvelope upon decryption. + * - @SecurityProfile: (string) Must be set to 'V2' or 'V2_AND_LEGACY'. + * - 'V2' indicates that only objects encrypted with S3EncryptionClientV2 + * content encryption and key wrap schemas are able to be decrypted. + * - 'V2_AND_LEGACY' indicates that objects encrypted with both + * S3EncryptionClientV2 and older legacy encryption clients are able + * to be decrypted. + * + * The optional configuration arguments are as follows: + * + * - SaveAs: (string) The path to a file on disk to save the decrypted + * object data. This will be handled by file_put_contents instead of the + * Guzzle sink. + * - @InstructionFileSuffix: (string|null) Suffix used when looking for an + * instruction file if an InstructionFileMetadataHandler was detected. + * - @CipherOptions: (array) Cipher options for encrypting data. A Cipher + * is required. Accepts the following options: + * - Aad: (string) Additional authentication data. This option is + * passed directly to OpenSSL when using gcm. It is ignored when + * using cbc. + * - @KmsAllowDecryptWithAnyCmk: (bool) This allows decryption with + * KMS materials for any KMS key ID, instead of needing the KMS key ID to + * be specified and provided to the decrypt operation. Ignored for non-KMS + * materials providers. Defaults to false. + * + * @return \Aws\Result GetObject call result with the 'Body' field + * wrapped in a decryption stream with its metadata + * information. + * + * @throws \InvalidArgumentException Thrown when arguments above are not + * passed or are passed incorrectly. + */ + public function getObject(array $args) + { + return $this->getObjectAsync($args)->wait(); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionMultipartUploader.php b/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionMultipartUploader.php new file mode 100644 index 0000000..ddf1d2d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionMultipartUploader.php @@ -0,0 +1,169 @@ +appendUserAgent($client, 'feat/s3-encrypt/' . self::CRYPTO_VERSION); + $this->client = $client; + $config['params'] = []; + if (!empty($config['bucket'])) { + $config['params']['Bucket'] = $config['bucket']; + } + if (!empty($config['key'])) { + $config['params']['Key'] = $config['key']; + } + + $this->provider = $this->getMaterialsProvider($config); + unset($config['@MaterialsProvider']); + + $this->instructionFileSuffix = $this->getInstructionFileSuffix($config); + unset($config['@InstructionFileSuffix']); + $this->strategy = $this->getMetadataStrategy( + $config, + $this->instructionFileSuffix + ); + if ($this->strategy === null) { + $this->strategy = self::getDefaultStrategy(); + } + unset($config['@MetadataStrategy']); + + $config['prepare_data_source'] = $this->getEncryptingDataPreparer(); + + parent::__construct($client, $source, $config); + } + + private static function getDefaultStrategy() + { + return new HeadersMetadataStrategy(); + } + + private function getEncryptingDataPreparer() + { + return function() { + // Defer encryption work until promise is executed + $envelope = new MetadataEnvelope(); + + list($this->source, $params) = Promise\Create::promiseFor($this->encrypt( + $this->source, + $this->config['@cipheroptions'] ?: [], + $this->provider, + $envelope + ))->then( + function ($bodyStream) use ($envelope) { + $params = $this->strategy->save( + $envelope, + $this->config['params'] + ); + return [$bodyStream, $params]; + } + )->wait(); + + $this->source->rewind(); + $this->config['params'] = $params; + }; + } +} \ No newline at end of file diff --git a/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionMultipartUploaderV2.php b/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionMultipartUploaderV2.php new file mode 100644 index 0000000..1bdbccf --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Crypto/S3EncryptionMultipartUploaderV2.php @@ -0,0 +1,176 @@ +appendUserAgent($client, 'feat/s3-encrypt/' . self::CRYPTO_VERSION); + $this->client = $client; + $config['params'] = []; + if (!empty($config['bucket'])) { + $config['params']['Bucket'] = $config['bucket']; + } + if (!empty($config['key'])) { + $config['params']['Key'] = $config['key']; + } + + $this->provider = $this->getMaterialsProvider($config); + unset($config['@MaterialsProvider']); + + $this->instructionFileSuffix = $this->getInstructionFileSuffix($config); + unset($config['@InstructionFileSuffix']); + $this->strategy = $this->getMetadataStrategy( + $config, + $this->instructionFileSuffix + ); + if ($this->strategy === null) { + $this->strategy = self::getDefaultStrategy(); + } + unset($config['@MetadataStrategy']); + + $config['prepare_data_source'] = $this->getEncryptingDataPreparer(); + + parent::__construct($client, $source, $config); + } + + private static function getDefaultStrategy() + { + return new HeadersMetadataStrategy(); + } + + private function getEncryptingDataPreparer() + { + return function() { + // Defer encryption work until promise is executed + $envelope = new MetadataEnvelope(); + + list($this->source, $params) = Promise\Create::promiseFor($this->encrypt( + $this->source, + $this->config ?: [], + $this->provider, + $envelope + ))->then( + function ($bodyStream) use ($envelope) { + $params = $this->strategy->save( + $envelope, + $this->config['params'] + ); + return [$bodyStream, $params]; + } + )->wait(); + + $this->source->rewind(); + $this->config['params'] = $params; + }; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Crypto/UserAgentTrait.php b/vendor/aws/aws-sdk-php/src/S3/Crypto/UserAgentTrait.php new file mode 100644 index 0000000..4566275 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Crypto/UserAgentTrait.php @@ -0,0 +1,31 @@ +getHandlerList(); + $list->appendBuild(Middleware::mapRequest( + function(RequestInterface $req) use ($agentString) { + if (!empty($req->getHeader('User-Agent')) + && !empty($req->getHeader('User-Agent')[0]) + ) { + $userAgent = $req->getHeader('User-Agent')[0]; + if (strpos($userAgent, $agentString) === false) { + $userAgent .= " {$agentString}"; + }; + } else { + $userAgent = $agentString; + } + + $req = $req->withHeader('User-Agent', $userAgent); + return $req; + } + )); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/EndpointRegionHelperTrait.php b/vendor/aws/aws-sdk-php/src/S3/EndpointRegionHelperTrait.php new file mode 100644 index 0000000..3c35c4b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/EndpointRegionHelperTrait.php @@ -0,0 +1,106 @@ +getPartition( + $arn->getRegion(), + $arn->getService() + ); + return $partition->getDnsSuffix(); + } + + private function getSigningRegion( + $region, + $service, + PartitionEndpointProvider $provider + ) { + $partition = $provider->getPartition($region, $service); + $data = $partition->toArray(); + if (isset($data['services'][$service]['endpoints'][$region]['credentialScope']['region'])) { + return $data['services'][$service]['endpoints'][$region]['credentialScope']['region']; + } + return $region; + } + + private function isMatchingSigningRegion( + $arnRegion, + $clientRegion, + $service, + PartitionEndpointProvider $provider + ) { + $arnRegion = \Aws\strip_fips_pseudo_regions(strtolower($arnRegion)); + $clientRegion = strtolower($clientRegion); + if ($arnRegion === $clientRegion) { + return true; + } + if ($this->getSigningRegion($clientRegion, $service, $provider) === $arnRegion) { + return true; + } + return false; + } + + private function validateFipsConfigurations(ArnInterface $arn) + { + $useFipsEndpoint = !empty($this->config['use_fips_endpoint']); + if ($arn instanceof OutpostsArnInterface) { + if (empty($this->config['use_arn_region']) + || !($this->config['use_arn_region']->isUseArnRegion()) + ) { + $region = $this->region; + } else { + $region = $arn->getRegion(); + } + if (\Aws\is_fips_pseudo_region($region)) { + throw new InvalidRegionException( + 'Fips is currently not supported with S3 Outposts access' + . ' points. Please provide a non-fips region or do not supply an' + . ' access point ARN.'); + } + } + } + + private function validateMatchingRegion(ArnInterface $arn) + { + if (!($this->isMatchingSigningRegion( + $arn->getRegion(), + $this->region, + $this->service->getEndpointPrefix(), + $this->partitionProvider) + )) { + if (empty($this->config['use_arn_region']) + || !($this->config['use_arn_region']->isUseArnRegion()) + ) { + throw new InvalidRegionException('The region' + . " specified in the ARN (" . $arn->getRegion() + . ") does not match the client region (" + . "{$this->region})."); + } + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Exception/DeleteMultipleObjectsException.php b/vendor/aws/aws-sdk-php/src/S3/Exception/DeleteMultipleObjectsException.php new file mode 100644 index 0000000..5b4c289 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Exception/DeleteMultipleObjectsException.php @@ -0,0 +1,68 @@ +deleted = array_values($deleted); + $this->errors = array_values($errors); + parent::__construct('Unable to delete certain keys when executing a' + . ' DeleteMultipleObjects request: ' + . self::createMessageFromErrors($errors)); + } + + /** + * Create a single error message from multiple errors. + * + * @param array $errors Errors encountered + * + * @return string + */ + public static function createMessageFromErrors(array $errors) + { + return "\n- " . implode("\n- ", array_map(function ($key) { + return json_encode($key); + }, $errors)); + } + + /** + * Get the errored objects + * + * @return array Returns an array of associative arrays, each containing + * a 'Code', 'Message', and 'Key' key. + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Get the successfully deleted objects + * + * @return array Returns an array of associative arrays, each containing + * a 'Key' and optionally 'DeleteMarker' and + * 'DeleterMarkerVersionId' + */ + public function getDeleted() + { + return $this->deleted; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Exception/PermanentRedirectException.php b/vendor/aws/aws-sdk-php/src/S3/Exception/PermanentRedirectException.php new file mode 100644 index 0000000..67d916e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Exception/PermanentRedirectException.php @@ -0,0 +1,4 @@ +collectPathInfo($error->getCommand()); + } elseif ($prev instanceof AwsException) { + $this->collectPathInfo($prev->getCommand()); + } + parent::__construct($state, $prev); + } + + /** + * Get the Bucket information of the transfer object + * + * @return string|null Returns null when 'Bucket' information + * is unavailable. + */ + public function getBucket() + { + return $this->bucket; + } + + /** + * Get the Key information of the transfer object + * + * @return string|null Returns null when 'Key' information + * is unavailable. + */ + public function getKey() + { + return $this->key; + } + + /** + * Get the source file name of the transfer object + * + * @return string|null Returns null when metadata of the stream + * wrapped in 'Body' parameter is unavailable. + */ + public function getSourceFileName() + { + return $this->filename; + } + + /** + * Collect file path information when accessible. (Bucket, Key) + * + * @param CommandInterface $cmd + */ + private function collectPathInfo(CommandInterface $cmd) + { + if (empty($this->bucket) && isset($cmd['Bucket'])) { + $this->bucket = $cmd['Bucket']; + } + if (empty($this->key) && isset($cmd['Key'])) { + $this->key = $cmd['Key']; + } + if (empty($this->filename) && isset($cmd['Body'])) { + $this->filename = $cmd['Body']->getMetadata('uri'); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/ExpiresParsingMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/ExpiresParsingMiddleware.php new file mode 100644 index 0000000..5bdb34a --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/ExpiresParsingMiddleware.php @@ -0,0 +1,56 @@ +nextHandler = $nextHandler; + } + + public function __invoke(CommandInterface $command, ?RequestInterface $request = null) + { + $next = $this->nextHandler; + return $next($command, $request)->then( + function (ResultInterface $result) { + if (empty($result['Expires']) && !empty($result['ExpiresString'])) { + trigger_error( + "Failed to parse the `expires` header as a timestamp due to " + . " an invalid timestamp format.\nPlease refer to `ExpiresString` " + . "for the unparsed string format of this header.\n" + , E_USER_WARNING + ); + } + return $result; + } + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/GetBucketLocationParser.php b/vendor/aws/aws-sdk-php/src/S3/GetBucketLocationParser.php new file mode 100644 index 0000000..94aee69 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/GetBucketLocationParser.php @@ -0,0 +1,49 @@ +parser = $parser; + } + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + $fn = $this->parser; + $result = $fn($command, $response); + + if ($command->getName() === 'GetBucketLocation') { + $location = 'us-east-1'; + if (preg_match('/>(.+?)<\/LocationConstraint>/', $response->getBody(), $matches)) { + $location = $matches[1] === 'EU' ? 'eu-west-1' : $matches[1]; + } + $result['LocationConstraint'] = $location; + } + + return $result; + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + return $this->parser->parseMemberFromStream($stream, $member, $response); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/MultipartCopy.php b/vendor/aws/aws-sdk-php/src/S3/MultipartCopy.php new file mode 100644 index 0000000..6a7bc04 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/MultipartCopy.php @@ -0,0 +1,249 @@ +/). If the key contains a '?' + * character, instead pass an array of source_key, + * source_bucket, and source_version_id. + * @param array $config Configuration used to perform the upload. + */ + public function __construct( + S3ClientInterface $client, + $source, + array $config = [] + ) { + if (is_array($source)) { + $this->source = $source; + } else { + $this->source = $this->getInputSource($source); + } + + parent::__construct( + $client, + array_change_key_case($config) + ['source_metadata' => null] + ); + + if ($this->displayProgress) { + $this->getState()->setProgressThresholds( + $this->sourceMetadata["ContentLength"] + ); + } + } + + /** + * An alias of the self::upload method. + * + * @see self::upload + */ + public function copy() + { + return $this->upload(); + } + + protected function loadUploadWorkflowInfo() + { + return [ + 'command' => [ + 'initiate' => 'CreateMultipartUpload', + 'upload' => 'UploadPartCopy', + 'complete' => 'CompleteMultipartUpload', + ], + 'id' => [ + 'bucket' => 'Bucket', + 'key' => 'Key', + 'upload_id' => 'UploadId', + ], + 'part_num' => 'PartNumber', + ]; + } + + protected function getUploadCommands(callable $resultHandler) + { + $parts = ceil($this->getSourceSize() / $this->determinePartSize()); + + for ($partNumber = 1; $partNumber <= $parts; $partNumber++) { + // If we haven't already uploaded this part, yield a new part. + if (!$this->state->hasPartBeenUploaded($partNumber)) { + $command = $this->client->getCommand( + $this->info['command']['upload'], + $this->createPart($partNumber, $parts) + $this->getState()->getId() + ); + $command->getHandlerList()->appendSign($resultHandler, 'mup'); + yield $command; + } + } + } + + private function createPart($partNumber, $partsCount) + { + $data = []; + + // Apply custom params to UploadPartCopy data + $config = $this->getConfig(); + $params = isset($config['params']) ? $config['params'] : []; + foreach ($params as $k => $v) { + $data[$k] = $v; + } + // The source parameter here is usually a string, but can be overloaded as an array + // if the key contains a '?' character to specify where the query parameters start + if (is_array($this->source)) { + $key = str_replace('%2F', '/', rawurlencode($this->source['source_key'])); + $bucket = $this->source['source_bucket']; + } else { + list($bucket, $key) = explode('/', ltrim($this->source, '/'), 2); + $key = implode( + '/', + array_map( + 'urlencode', + explode('/', rawurldecode($key)) + ) + ); + } + + $uri = ArnParser::isArn($bucket) ? '' : '/'; + $uri .= $bucket . '/' . $key; + $data['CopySource'] = $uri; + $data['PartNumber'] = $partNumber; + if (!empty($this->sourceVersionId)) { + $data['CopySource'] .= "?versionId=" . $this->sourceVersionId; + } + + $defaultPartSize = $this->determinePartSize(); + $startByte = $defaultPartSize * ($partNumber - 1); + $data['ContentLength'] = $partNumber < $partsCount + ? $defaultPartSize + : $this->getSourceSize() - ($defaultPartSize * ($partsCount - 1)); + $endByte = $startByte + $data['ContentLength'] - 1; + $data['CopySourceRange'] = "bytes=$startByte-$endByte"; + + return $data; + } + + protected function extractETag(ResultInterface $result) + { + return $result->search('CopyPartResult.ETag'); + } + + protected function getSourceMimeType() + { + return $this->getSourceMetadata()['ContentType']; + } + + protected function getSourceSize() + { + return $this->getSourceMetadata()['ContentLength']; + } + + private function getSourceMetadata() + { + if (empty($this->sourceMetadata)) { + $this->sourceMetadata = $this->fetchSourceMetadata(); + } + + return $this->sourceMetadata; + } + + private function fetchSourceMetadata() + { + if ($this->config['source_metadata'] instanceof ResultInterface) { + return $this->config['source_metadata']; + } + //if the source variable was overloaded with an array, use the inputs for key and bucket + if (is_array($this->source)) { + $headParams = [ + 'Key' => $this->source['source_key'], + 'Bucket' => $this->source['source_bucket'] + ]; + if (isset($this->source['source_version_id'])) { + $this->sourceVersionId = $this->source['source_version_id']; + $headParams['VersionId'] = $this->sourceVersionId; + } + //otherwise, use the default source parsing behavior + } else { + list($bucket, $key) = explode('/', ltrim($this->source, '/'), 2); + $headParams = [ + 'Bucket' => $bucket, + 'Key' => $key, + ]; + if (strpos($key, '?')) { + list($key, $query) = explode('?', $key, 2); + $headParams['Key'] = $key; + $query = Psr7\Query::parse($query, false); + if (isset($query['versionId'])) { + $this->sourceVersionId = $query['versionId']; + $headParams['VersionId'] = $this->sourceVersionId; + } + } + } + return $this->client->headObject($headParams); + } + + /** + * Get the url decoded input source, starting with a slash if it is not an + * ARN to standardize the source location syntax. + * + * @param string $inputSource The source that was passed to the constructor + * @return string The source, starting with a slash if it's not an arn + */ + private function getInputSource($inputSource) + { + $sourceBuilder = ArnParser::isArn($inputSource) ? '' : '/'; + $sourceBuilder .= ltrim(rawurldecode($inputSource), '/'); + return $sourceBuilder; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/MultipartUploader.php b/vendor/aws/aws-sdk-php/src/S3/MultipartUploader.php new file mode 100644 index 0000000..b2bed2b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/MultipartUploader.php @@ -0,0 +1,181 @@ + null, + 'key' => null, + 'exception_class' => S3MultipartUploadException::class, + ]); + + if ($this->displayProgress) { + $this->getState()->setProgressThresholds($this->source->getSize()); + } + } + + protected function loadUploadWorkflowInfo() + { + return [ + 'command' => [ + 'initiate' => 'CreateMultipartUpload', + 'upload' => 'UploadPart', + 'complete' => 'CompleteMultipartUpload', + ], + 'id' => [ + 'bucket' => 'Bucket', + 'key' => 'Key', + 'upload_id' => 'UploadId', + ], + 'part_num' => 'PartNumber', + ]; + } + + protected function createPart($seekable, $number) + { + // Initialize the array of part data that will be returned. + $data = []; + + // Apply custom params to UploadPart data + $config = $this->getConfig(); + $params = isset($config['params']) ? $config['params'] : []; + foreach ($params as $k => $v) { + $data[$k] = $v; + } + + $data['PartNumber'] = $number; + + // Read from the source to create the body stream. + if ($seekable) { + // Case 1: Source is seekable, use lazy stream to defer work. + $body = $this->limitPartStream( + new Psr7\LazyOpenStream($this->source->getMetadata('uri'), 'r') + ); + } else { + // Case 2: Stream is not seekable; must store in temp stream. + $source = $this->limitPartStream($this->source); + $source = $this->decorateWithHashes($source, $data); + $body = Psr7\Utils::streamFor(); + Psr7\Utils::copyToStream($source, $body); + } + + $contentLength = $body->getSize(); + + // Do not create a part if the body size is zero. + if ($contentLength === 0) { + return false; + } + + $body->seek(0); + $data['Body'] = $body; + + if (isset($config['add_content_md5']) + && $config['add_content_md5'] === true + ) { + $data['AddContentMD5'] = true; + } + + $data['ContentLength'] = $contentLength; + + return $data; + } + + protected function extractETag(ResultInterface $result) + { + return $result['ETag']; + } + + protected function getSourceMimeType() + { + if ($uri = $this->source->getMetadata('uri')) { + return Psr7\MimeType::fromFilename($uri) + ?: 'application/octet-stream'; + } + } + + protected function getSourceSize() + { + return $this->source->getSize(); + } + + /** + * Decorates a stream with a sha256 linear hashing stream. + * + * @param Stream $stream Stream to decorate. + * @param array $data Part data to augment with the hash result. + * + * @return Stream + */ + private function decorateWithHashes(Stream $stream, array &$data) + { + // Decorate source with a hashing stream + $hash = new PhpHash('sha256'); + return new HashingStream($stream, $hash, function ($result) use (&$data) { + $data['ContentSHA256'] = bin2hex($result); + }); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/MultipartUploadingTrait.php b/vendor/aws/aws-sdk-php/src/S3/MultipartUploadingTrait.php new file mode 100644 index 0000000..b98a2d7 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/MultipartUploadingTrait.php @@ -0,0 +1,151 @@ + $bucket, + 'Key' => $key, + 'UploadId' => $uploadId, + ]); + + foreach ($client->getPaginator('ListParts', $state->getId()) as $result) { + // Get the part size from the first part in the first result. + if (!$state->getPartSize()) { + $state->setPartSize($result->search('Parts[0].Size')); + } + // Mark all the parts returned by ListParts as uploaded. + foreach ($result['Parts'] as $part) { + $state->markPartAsUploaded($part['PartNumber'], [ + 'PartNumber' => $part['PartNumber'], + 'ETag' => $part['ETag'] + ]); + } + } + + $state->setStatus(UploadState::INITIATED); + + return $state; + } + + protected function handleResult(CommandInterface $command, ResultInterface $result) + { + $partData = []; + $partData['PartNumber'] = $command['PartNumber']; + $partData['ETag'] = $this->extractETag($result); + $commandName = $command->getName(); + $checksumResult = $commandName === 'UploadPart' + ? $result + : $result[$commandName . 'Result']; + + if (isset($command['ChecksumAlgorithm'])) { + $checksumMemberName = 'Checksum' . strtoupper($command['ChecksumAlgorithm']); + $partData[$checksumMemberName] = $checksumResult[$checksumMemberName] ?? null; + } + + $this->getState()->markPartAsUploaded($command['PartNumber'], $partData); + + // Updates counter for uploaded bytes. + $this->uploadedBytes += $command["ContentLength"]; + // Sends uploaded bytes to progress tracker if getDisplayProgress set + if ($this->displayProgress) { + $this->getState()->getDisplayProgress($this->uploadedBytes); + } + } + + abstract protected function extractETag(ResultInterface $result); + + protected function getCompleteParams() + { + $config = $this->getConfig(); + $params = isset($config['params']) ? $config['params'] : []; + + $params['MultipartUpload'] = [ + 'Parts' => $this->getState()->getUploadedParts() + ]; + + return $params; + } + + protected function determinePartSize() + { + // Make sure the part size is set. + $partSize = $this->getConfig()['part_size'] ?: MultipartUploader::PART_MIN_SIZE; + + // Adjust the part size to be larger for known, x-large uploads. + if ($sourceSize = $this->getSourceSize()) { + $partSize = (int) max( + $partSize, + ceil($sourceSize / MultipartUploader::PART_MAX_NUM) + ); + } + + // Ensure that the part size follows the rules: 5 MB <= size <= 5 GB. + if ($partSize < MultipartUploader::PART_MIN_SIZE || $partSize > MultipartUploader::PART_MAX_SIZE) { + throw new \InvalidArgumentException('The part size must be no less ' + . 'than 5 MB and no greater than 5 GB.'); + } + + return $partSize; + } + + protected function getInitiateParams() + { + $config = $this->getConfig(); + $params = isset($config['params']) ? $config['params'] : []; + + if (isset($config['acl'])) { + $params['ACL'] = $config['acl']; + } + + // Set the ContentType if not already present + if (empty($params['ContentType']) && $type = $this->getSourceMimeType()) { + $params['ContentType'] = $type; + } + + return $params; + } + + /** + * @return UploadState + */ + abstract protected function getState(); + + /** + * @return array + */ + abstract protected function getConfig(); + + /** + * @return int + */ + abstract protected function getSourceSize(); + + /** + * @return string|null + */ + abstract protected function getSourceMimeType(); +} diff --git a/vendor/aws/aws-sdk-php/src/S3/ObjectCopier.php b/vendor/aws/aws-sdk-php/src/S3/ObjectCopier.php new file mode 100644 index 0000000..66e4446 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/ObjectCopier.php @@ -0,0 +1,170 @@ + null, + 'before_upload' => null, + 'concurrency' => 5, + 'mup_threshold' => self::DEFAULT_MULTIPART_THRESHOLD, + 'params' => [], + 'part_size' => null, + 'version_id' => null, + ]; + + /** + * @param S3ClientInterface $client The S3 Client used to execute + * the copy command(s). + * @param array $source The object to copy, specified as + * an array with a 'Bucket' and + * 'Key' keys. Provide a + * 'VersionID' key to copy a + * specified version of an object. + * @param array $destination The bucket and key to which to + * copy the $source, specified as + * an array with a 'Bucket' and + * 'Key' keys. + * @param string $acl ACL to apply to the copy + * (default: private). + * @param array $options Options used to configure the + * copy process. Options passed in + * through 'params' are added to + * the sub commands. + * + * @throws InvalidArgumentException + */ + public function __construct( + S3ClientInterface $client, + array $source, + array $destination, + $acl = 'private', + array $options = [] + ) { + $this->validateLocation($source); + $this->validateLocation($destination); + + $this->client = $client; + $this->source = $source; + $this->destination = $destination; + $this->acl = $acl; + $this->options = $options + self::$defaults; + } + + /** + * Perform the configured copy asynchronously. Returns a promise that is + * fulfilled with the result of the CompleteMultipartUpload or CopyObject + * operation or rejected with an exception. + * + * @return Coroutine + */ + public function promise(): PromiseInterface + { + return Coroutine::of(function () { + $headObjectCommand = $this->client->getCommand( + 'HeadObject', + $this->options['params'] + $this->source + ); + if (is_callable($this->options['before_lookup'])) { + $this->options['before_lookup']($headObjectCommand); + } + $objectStats = (yield $this->client->executeAsync( + $headObjectCommand + )); + + if ($objectStats['ContentLength'] > $this->options['mup_threshold']) { + $mup = new MultipartCopy( + $this->client, + $this->getSourcePath(), + ['source_metadata' => $objectStats, 'acl' => $this->acl] + + $this->destination + + $this->options + ); + + yield $mup->promise(); + } else { + $defaults = [ + 'ACL' => $this->acl, + 'MetadataDirective' => 'COPY', + 'CopySource' => $this->getSourcePath(), + ]; + + $params = array_diff_key($this->options, self::$defaults) + + $this->destination + $defaults + $this->options['params']; + + yield $this->client->executeAsync( + $this->client->getCommand('CopyObject', $params) + ); + } + }); + } + + /** + * Perform the configured copy synchronously. Returns the result of the + * CompleteMultipartUpload or CopyObject operation. + * + * @return Result + * + * @throws S3Exception + * @throws MultipartUploadException + */ + public function copy() + { + return $this->promise()->wait(); + } + + private function validateLocation(array $location) + { + if (empty($location['Bucket']) || empty($location['Key'])) { + throw new \InvalidArgumentException('Locations provided to an' + . ' Aws\S3\ObjectCopier must have a non-empty Bucket and Key'); + } + } + + private function getSourcePath() + { + $path = "/{$this->source['Bucket']}/"; + if (ArnParser::isArn($this->source['Bucket'])) { + try { + new AccessPointArn($this->source['Bucket']); + $path = "{$this->source['Bucket']}/object/"; + } catch (\Exception $e) { + throw new \InvalidArgumentException( + 'Provided ARN was a not a valid S3 access point ARN (' + . $e->getMessage() . ')', + 0, + $e + ); + } + } + + $sourcePath = $path . rawurlencode($this->source['Key']); + if (isset($this->source['VersionId'])) { + $sourcePath .= "?versionId={$this->source['VersionId']}"; + } + + return $sourcePath; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/ObjectUploader.php b/vendor/aws/aws-sdk-php/src/S3/ObjectUploader.php new file mode 100644 index 0000000..b73b7b1 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/ObjectUploader.php @@ -0,0 +1,150 @@ + null, + 'concurrency' => 3, + 'mup_threshold' => self::DEFAULT_MULTIPART_THRESHOLD, + 'params' => [], + 'part_size' => null, + ]; + private $addContentMD5; + + /** + * @param S3ClientInterface $client The S3 Client used to execute + * the upload command(s). + * @param string $bucket Bucket to upload the object, or + * an S3 access point ARN. + * @param string $key Key of the object. + * @param mixed $body Object data to upload. Can be a + * StreamInterface, PHP stream + * resource, or a string of data to + * upload. + * @param string $acl ACL to apply to the copy + * (default: private). + * @param array $options Options used to configure the + * copy process. Options passed in + * through 'params' are added to + * the sub command(s). + */ + public function __construct( + S3ClientInterface $client, + $bucket, + $key, + $body, + $acl = 'private', + array $options = [] + ) { + $this->client = $client; + $this->bucket = $bucket; + $this->key = $key; + $this->body = Psr7\Utils::streamFor($body); + $this->acl = $acl; + $this->options = $options + self::$defaults; + // Handle "add_content_md5" option. + $this->addContentMD5 = isset($options['add_content_md5']) + && $options['add_content_md5'] === true; + } + + /** + * @return PromiseInterface + */ + public function promise(): PromiseInterface + { + /** @var int $mup_threshold */ + $mup_threshold = $this->options['mup_threshold']; + if ($this->requiresMultipart($this->body, $mup_threshold)) { + // Perform a multipart upload. + return (new MultipartUploader($this->client, $this->body, [ + 'bucket' => $this->bucket, + 'key' => $this->key, + 'acl' => $this->acl + ] + $this->options))->promise(); + } + + // Perform a regular PutObject operation. + $command = $this->client->getCommand('PutObject', [ + 'Bucket' => $this->bucket, + 'Key' => $this->key, + 'Body' => $this->body, + 'ACL' => $this->acl, + 'AddContentMD5' => $this->addContentMD5 + ] + $this->options['params']); + if (is_callable($this->options['before_upload'])) { + $this->options['before_upload']($command); + } + return $this->client->executeAsync($command); + } + + public function upload() + { + return $this->promise()->wait(); + } + + /** + * Determines if the body should be uploaded using PutObject or the + * Multipart Upload System. It also modifies the passed-in $body as needed + * to support the upload. + * + * @param StreamInterface $body Stream representing the body. + * @param integer $threshold Minimum bytes before using Multipart. + * + * @return bool + */ + private function requiresMultipart(StreamInterface &$body, $threshold) + { + // If body size known, compare to threshold to determine if Multipart. + if ($body->getSize() !== null) { + return $body->getSize() >= $threshold; + } + + /** + * Handle the situation where the body size is unknown. + * Read up to 5MB into a buffer to determine how to upload the body. + * @var StreamInterface $buffer + */ + $buffer = Psr7\Utils::streamFor(); + Psr7\Utils::copyToStream($body, $buffer, MultipartUploader::PART_MIN_SIZE); + + // If body < 5MB, use PutObject with the buffer. + if ($buffer->getSize() < MultipartUploader::PART_MIN_SIZE) { + $buffer->seek(0); + $body = $buffer; + return false; + } + + // If body >= 5 MB, then use multipart. [YES] + if ($body->isSeekable() && $body->getMetadata('uri') !== 'php://input') { + // If the body is seekable, just rewind the body. + $body->seek(0); + } else { + // If the body is non-seekable, stitch the rewind the buffer and + // the partially read body together into one stream. This avoids + // unnecessary disc usage and does not require seeking on the + // original stream. + $buffer->seek(0); + $body = new Psr7\AppendStream([$buffer, $body]); + } + + return true; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Parser/GetBucketLocationResultMutator.php b/vendor/aws/aws-sdk-php/src/S3/Parser/GetBucketLocationResultMutator.php new file mode 100644 index 0000000..2e8d1a1 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Parser/GetBucketLocationResultMutator.php @@ -0,0 +1,42 @@ +getName() !== 'GetBucketLocation') { + return $result; + } + + $location = 'us-east-1'; + static $pattern = '/>(.+?)<\/LocationConstraint>/'; + if (preg_match($pattern, $response->getBody(), $matches)) { + $location = $matches[1] === 'EU' ? 'eu-west-1' : $matches[1]; + } + + $result['LocationConstraint'] = $location; + $response->getBody()->rewind(); + + return $result; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Parser/S3Parser.php b/vendor/aws/aws-sdk-php/src/S3/Parser/S3Parser.php new file mode 100644 index 0000000..3f6f354 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Parser/S3Parser.php @@ -0,0 +1,275 @@ +protocolParser = $protocolParser; + $this->errorParser = $errorParser; + $this->exceptionClass = $exceptionClass; + $this->s3ResultMutators = []; + } + + /** + * Parses a S3 response. + * + * @param CommandInterface $command The command that originated the request. + * @param ResponseInterface $response The response received from the service. + * + * @return ResultInterface|null + */ + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ):? ResultInterface + { + // Check first if the response is an error + $this->parse200Error($command, $response); + + try { + $parseFn = $this->protocolParser; + $result = $parseFn($command, $response); + } catch (ParserException $e) { + // Parsing errors will be considered retryable. + throw new $this->exceptionClass( + "Error parsing response for {$command->getName()}:" + . " AWS parsing error: {$e->getMessage()}", + $command, + ['connection_error' => true, 'exception' => $e], + $e + ); + } + + return $this->executeS3ResultMutators($result, $command, $response); + } + + /** + * Tries to parse a 200 response as an error from S3. + * If the parsed result contains a code and message then that means an error + * was found, and hence an exception is thrown with that error. + * + * @param CommandInterface $command + * @param ResponseInterface $response + * + * @return void + */ + private function parse200Error( + CommandInterface $command, + ResponseInterface $response + ): void + { + // This error parsing should be just for 200 error responses + // and operations where its output shape does not have a streaming + // member and the body of the response is seekable. + if (200 !== $response->getStatusCode() + || !$this->shouldBeConsidered200Error($command->getName()) + || !$response->getBody()->isSeekable()) { + return; + } + + // To guarantee we try the error parsing just for an Error xml response. + if (!$this->isFirstRootElementError($response->getBody())) { + return; + } + + try { + $errorParserFn = $this->errorParser; + $parsedError = $errorParserFn($response, $command); + } catch (ParserException $e) { + // Parsing errors will be considered retryable. + $parsedError = [ + 'code' => 'ConnectionError', + 'message' => "An error connecting to the service occurred" + . " while performing the " . $command->getName() + . " operation." + ]; + } + + if (isset($parsedError['code']) && isset($parsedError['message'])) { + throw new $this->exceptionClass( + $parsedError['message'], + $command, + [ + 'connection_error' => true, + 'code' => $parsedError['code'], + 'message' => $parsedError['message'] + ] + ); + } + } + + /** + * Checks if a specific operation should be considered + * a s3 200 error. Operations where any of its output members + * has a streaming or httpPayload trait should be not considered. + * + * @param $commandName + * + * @return bool + */ + private function shouldBeConsidered200Error($commandName): bool + { + $operation = $this->api->getOperation($commandName); + $output = $operation->getOutput(); + foreach ($output->getMembers() as $_ => $memberProps) { + if (!empty($memberProps['eventstream']) || !empty($memberProps['streaming'])) { + return false; + } + } + + return true; + } + + /** + * Checks if the root element of the response body is "Error", which is + * when we should try to parse an error from a 200 response from s3. + * It is recommended to make sure the stream given is seekable, otherwise + * the rewind call will cause a user warning. + * + * @param StreamInterface $responseBody + * + * @return bool + */ + private function isFirstRootElementError(StreamInterface $responseBody): bool + { + static $pattern = '/<\?xml version="1\.0" encoding="UTF-8"\?>\s*/'; + // To avoid performance overhead in large streams + $reducedBodyContent = $responseBody->read(64); + $foundErrorElement = preg_match($pattern, $reducedBodyContent); + // A rewind is needed because the stream is partially or entirely consumed + // in the previous read operation. + $responseBody->rewind(); + + return $foundErrorElement; + } + + /** + * Execute mutator implementations over a result. + * Mutators are logics that modifies a result. + * + * @param ResultInterface $result + * @param CommandInterface $command + * @param ResponseInterface $response + * + * @return ResultInterface + */ + private function executeS3ResultMutators( + ResultInterface $result, + CommandInterface $command, + ResponseInterface $response + ): ResultInterface + { + foreach ($this->s3ResultMutators as $mutator) { + $result = $mutator($result, $command, $response); + } + + return $result; + } + + /** + * Adds a mutator into the list of mutators. + * + * @param string $mutatorName + * @param S3ResultMutator $s3ResultMutator + * @return void + */ + public function addS3ResultMutator( + string $mutatorName, + S3ResultMutator $s3ResultMutator + ): void + { + if (isset($this->s3ResultMutators[$mutatorName])) { + trigger_error( + "The S3 Result Mutator {$mutatorName} already exists!", + E_USER_WARNING + ); + + return; + } + + $this->s3ResultMutators[$mutatorName] = $s3ResultMutator; + } + + /** + * Removes a mutator from the mutator list. + * + * @param string $mutatorName + * @return void + */ + public function removeS3ResultMutator(string $mutatorName): void + { + if (!isset($this->s3ResultMutators[$mutatorName])) { + trigger_error( + "The S3 Result Mutator {$mutatorName} does not exist!", + E_USER_WARNING + ); + + return; + } + + unset($this->s3ResultMutators[$mutatorName]); + } + + /** + * Returns the list of result mutators available. + * + * @return array + */ + public function getS3ResultMutators(): array + { + return $this->s3ResultMutators; + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) + { + return $this->protocolParser->parseMemberFromStream( + $stream, + $member, + $response + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Parser/S3ResultMutator.php b/vendor/aws/aws-sdk-php/src/S3/Parser/S3ResultMutator.php new file mode 100644 index 0000000..5119501 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Parser/S3ResultMutator.php @@ -0,0 +1,36 @@ +api = $api; + $this->config = $config; + } + + /** + * @param ResultInterface $result + * @param CommandInterface|null $command + * @param ResponseInterface|null $response + * + * @return ResultInterface + */ + public function __invoke( + ResultInterface $result, + ?CommandInterface $command = null, + ?ResponseInterface $response = null + ): ResultInterface + { + $operation = $this->api->getOperation($command->getName()); + + // Skip this middleware if the operation doesn't have an httpChecksum + $checksumInfo = $operation['httpChecksum'] ?? null; + if (is_null($checksumInfo)) { + return $result; + } + + $mode = $this->config['response_checksum_validation'] ?? self::DEFAULT_VALIDATION_MODE; + $checksumModeEnabledMember = $checksumInfo['requestValidationModeMember'] ?? ""; + $checksumModeEnabled = strtolower($command[$checksumModeEnabledMember] ?? ""); + $responseAlgorithms = $checksumInfo['responseAlgorithms'] ?? []; + $shouldSkipValidation = $this->shouldSkipValidation( + $mode, + $checksumModeEnabled, + $responseAlgorithms + ); + + if ($shouldSkipValidation) { + return $result; + } + + $checksumPriority = $this->getChecksumPriority(); + $checksumsToCheck = array_intersect($responseAlgorithms, array_map( + 'strtoupper', + array_keys($checksumPriority)) + ); + $checksumValidationInfo = $this->validateChecksum($checksumsToCheck, $response); + + if ($checksumValidationInfo['status'] === "SUCCEEDED") { + $result['ChecksumValidated'] = $checksumValidationInfo['checksum']; + } elseif ($checksumValidationInfo['status'] === "FAILED") { + if ($this->isMultipartGetObject($command, $checksumValidationInfo)) { + return $result; + } + throw new S3Exception( + "Calculated response checksum did not match the expected value", + $command + ); + } + + return $result; + } + + /** + * @param $checksumPriority + * @param ResponseInterface $response + * + * @return array + */ + private function validateChecksum( + $checksumPriority, + ResponseInterface $response + ): array + { + $checksumToValidate = $this->chooseChecksumHeaderToValidate( + $checksumPriority, + $response + ); + $validationStatus = "SKIPPED"; + $checksumHeaderValue = null; + if (!empty($checksumToValidate)) { + $checksumHeaderValue = $response->getHeaderLine( + 'x-amz-checksum-' . $checksumToValidate + ); + if (!empty($checksumHeaderValue)) { + $calculatedChecksumValue = $this->getEncodedValue( + $checksumToValidate, + $response->getBody() + ); + $validationStatus = $checksumHeaderValue == $calculatedChecksumValue + ? "SUCCEEDED" + : "FAILED"; + } + } + return [ + "status" => $validationStatus, + "checksum" => $checksumToValidate, + "checksumHeaderValue" => $checksumHeaderValue, + ]; + } + + /** + * @param $checksumPriority + * @param ResponseInterface $response + * + * @return string + */ + private function chooseChecksumHeaderToValidate( + $checksumPriority, + ResponseInterface $response + ):? string + { + foreach ($checksumPriority as $checksum) { + $checksumHeader = 'x-amz-checksum-' . $checksum; + if ($response->hasHeader($checksumHeader)) { + return $checksum; + } + } + + return null; + } + + /** + * @param string $mode + * @param string $checksumModeEnabled + * @param array $responseAlgorithms + * + * @return bool + */ + private function shouldSkipValidation( + string $mode, + string $checksumModeEnabled, + array $responseAlgorithms + ): bool + { + return empty($responseAlgorithms) + || ($mode === 'when_required' && $checksumModeEnabled !== 'enabled'); + } + + /** + * @return string[] + */ + private function getChecksumPriority(): array + { + return extension_loaded('awscrt') + ? self::$supportedAlgorithms + : array_slice(self::$supportedAlgorithms, 1); + } + + /** + * @param CommandInterface $command + * @param array $checksumValidationInfo + * + * @return bool + */ + private function isMultipartGetObject( + CommandInterface $command, + array $checksumValidationInfo + ): bool + { + if ($command->getName() !== "GetObject" + || empty($checksumValidationInfo['checksumHeaderValue']) + ) { + return false; + } + + $headerValue = $checksumValidationInfo['checksumHeaderValue']; + $lastDashPos = strrpos($headerValue, '-'); + $endOfChecksum = substr($headerValue, $lastDashPos + 1); + + return is_numeric($endOfChecksum) + && (int) $endOfChecksum > 1 + && (int) $endOfChecksum < 10000; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/PermanentRedirectMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/PermanentRedirectMiddleware.php new file mode 100644 index 0000000..36a0e68 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/PermanentRedirectMiddleware.php @@ -0,0 +1,62 @@ +nextHandler = $nextHandler; + } + + public function __invoke(CommandInterface $command, ?RequestInterface $request = null) + { + $next = $this->nextHandler; + return $next($command, $request)->then( + function (ResultInterface $result) use ($command) { + $status = isset($result['@metadata']['statusCode']) + ? $result['@metadata']['statusCode'] + : null; + if ($status == 301) { + throw new PermanentRedirectException( + 'Encountered a permanent redirect while requesting ' + . $result->search('"@metadata".effectiveUri') . '. ' + . 'Are you sure you are using the correct region for ' + . 'this bucket?', + $command, + ['result' => $result] + ); + } + return $result; + } + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/PostObject.php b/vendor/aws/aws-sdk-php/src/S3/PostObject.php new file mode 100644 index 0000000..48913ea --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/PostObject.php @@ -0,0 +1,160 @@ +client = $client; + $this->bucket = $bucket; + + if (is_array($jsonPolicy)) { + $jsonPolicy = json_encode($jsonPolicy); + } + + $this->jsonPolicy = $jsonPolicy; + $this->formAttributes = [ + 'action' => $this->generateUri(), + 'method' => 'POST', + 'enctype' => 'multipart/form-data' + ]; + + $this->formInputs = $formInputs + ['key' => '${filename}']; + $credentials = $client->getCredentials()->wait(); + $this->formInputs += $this->getPolicyAndSignature($credentials); + } + + /** + * Gets the S3 client. + * + * @return S3ClientInterface + */ + public function getClient() + { + return $this->client; + } + + /** + * Gets the bucket name. + * + * @return string + */ + public function getBucket() + { + return $this->bucket; + } + + /** + * Gets the form attributes as an array. + * + * @return array + */ + public function getFormAttributes() + { + return $this->formAttributes; + } + + /** + * Set a form attribute. + * + * @param string $attribute Form attribute to set. + * @param string $value Value to set. + */ + public function setFormAttribute($attribute, $value) + { + $this->formAttributes[$attribute] = $value; + } + + /** + * Gets the form inputs as an array. + * + * @return array + */ + public function getFormInputs() + { + return $this->formInputs; + } + + /** + * Set a form input. + * + * @param string $field Field name to set + * @param string $value Value to set. + */ + public function setFormInput($field, $value) + { + $this->formInputs[$field] = $value; + } + + /** + * Gets the raw JSON policy. + * + * @return string + */ + public function getJsonPolicy() + { + return $this->jsonPolicy; + } + + private function generateUri() + { + $uri = new Uri($this->client->getEndpoint()); + + if ($this->client->getConfig('use_path_style_endpoint') === true + || ($uri->getScheme() === 'https' + && strpos($this->bucket, '.') !== false) + ) { + // Use path-style URLs + $uri = $uri->withPath("/{$this->bucket}"); + } else { + // Use virtual-style URLs + $uri = $uri->withHost($this->bucket . '.' . $uri->getHost()); + } + + return (string) $uri; + } + + protected function getPolicyAndSignature(CredentialsInterface $creds) + { + $jsonPolicy64 = base64_encode($this->jsonPolicy); + + return [ + 'AWSAccessKeyId' => $creds->getAccessKeyId(), + 'policy' => $jsonPolicy64, + 'signature' => base64_encode(hash_hmac( + 'sha1', + $jsonPolicy64, + $creds->getSecretKey(), + true + )) + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/PostObjectV4.php b/vendor/aws/aws-sdk-php/src/S3/PostObjectV4.php new file mode 100644 index 0000000..1976372 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/PostObjectV4.php @@ -0,0 +1,195 @@ +client = $client; + $this->bucket = $bucket; + + // setup form attributes + $this->formAttributes = [ + 'action' => $this->generateUri(), + 'method' => 'POST', + 'enctype' => 'multipart/form-data' + ]; + + $credentials = $this->client->getCredentials()->wait(); + + if ($securityToken = $credentials->getSecurityToken()) { + $options [] = ['x-amz-security-token' => $securityToken]; + $formInputs['X-Amz-Security-Token'] = $securityToken; + } + + // setup basic policy + $policy = [ + 'expiration' => TimestampShape::format($expiration, 'iso8601'), + 'conditions' => $options, + ]; + + // setup basic formInputs + $this->formInputs = $formInputs + ['key' => '${filename}']; + + // finalize policy and signature + + $this->formInputs += $this->getPolicyAndSignature( + $credentials, + $policy + ); + } + + /** + * Gets the S3 client. + * + * @return S3ClientInterface + */ + public function getClient() + { + return $this->client; + } + + /** + * Gets the bucket name. + * + * @return string + */ + public function getBucket() + { + return $this->bucket; + } + + /** + * Gets the form attributes as an array. + * + * @return array + */ + public function getFormAttributes() + { + return $this->formAttributes; + } + + /** + * Set a form attribute. + * + * @param string $attribute Form attribute to set. + * @param string $value Value to set. + */ + public function setFormAttribute($attribute, $value) + { + $this->formAttributes[$attribute] = $value; + } + + /** + * Gets the form inputs as an array. + * + * @return array + */ + public function getFormInputs() + { + return $this->formInputs; + } + + /** + * Set a form input. + * + * @param string $field Field name to set + * @param string $value Value to set. + */ + public function setFormInput($field, $value) + { + $this->formInputs[$field] = $value; + } + + private function generateUri() + { + $uri = new Uri($this->client->getEndpoint()); + + if ($this->client->getConfig('use_path_style_endpoint') === true + || ($uri->getScheme() === 'https' + && strpos($this->bucket, '.') !== false) + ) { + // Use path-style URLs + $uri = $uri->withPath("/{$this->bucket}"); + } else { + // Use virtual-style URLs if haven't been set up already + if (strpos($uri->getHost(), $this->bucket . '.') !== 0) { + $uri = $uri->withHost($this->bucket . '.' . $uri->getHost()); + } + } + + return (string) $uri; + } + + protected function getPolicyAndSignature( + CredentialsInterface $credentials, + array $policy + ){ + $ldt = gmdate(SignatureV4::ISO8601_BASIC); + $sdt = substr($ldt, 0, 8); + $policy['conditions'][] = ['X-Amz-Date' => $ldt]; + + $region = $this->client->getRegion(); + $scope = $this->createScope($sdt, $region, 's3'); + $creds = "{$credentials->getAccessKeyId()}/$scope"; + $policy['conditions'][] = ['X-Amz-Credential' => $creds]; + + $policy['conditions'][] = ['X-Amz-Algorithm' => "AWS4-HMAC-SHA256"]; + + $jsonPolicy64 = base64_encode(json_encode($policy)); + $key = $this->getSigningKey( + $sdt, + $region, + 's3', + $credentials->getSecretKey() + ); + + return [ + 'X-Amz-Credential' => $creds, + 'X-Amz-Algorithm' => "AWS4-HMAC-SHA256", + 'X-Amz-Date' => $ldt, + 'Policy' => $jsonPolicy64, + 'X-Amz-Signature' => bin2hex( + hash_hmac('sha256', $jsonPolicy64, $key, true) + ), + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/PutObjectUrlMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/PutObjectUrlMiddleware.php new file mode 100644 index 0000000..9b80406 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/PutObjectUrlMiddleware.php @@ -0,0 +1,59 @@ +nextHandler = $nextHandler; + } + + public function __invoke(CommandInterface $command, ?RequestInterface $request = null) + { + $next = $this->nextHandler; + return $next($command, $request)->then( + function (ResultInterface $result) use ($command) { + $name = $command->getName(); + switch ($name) { + case 'PutObject': + case 'CopyObject': + $result['ObjectURL'] = isset($result['@metadata']['effectiveUri']) + ? $result['@metadata']['effectiveUri'] + : null; + break; + case 'CompleteMultipartUpload': + $result['ObjectURL'] = urldecode($result['Location'] ?? ''); + break; + } + return $result; + } + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/Configuration.php b/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/Configuration.php new file mode 100644 index 0000000..48dc63d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/Configuration.php @@ -0,0 +1,42 @@ +endpointsType = strtolower($endpointsType); + $this->isFallback = $isFallback; + if (!in_array($this->endpointsType, ['legacy', 'regional'])) { + throw new \InvalidArgumentException( + "Configuration parameter must either be 'legacy' or 'regional'." + ); + } + } + + /** + * {@inheritdoc} + */ + public function getEndpointsType() + { + return $this->endpointsType; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return [ + 'endpoints_type' => $this->getEndpointsType() + ]; + } + + public function isFallback() + { + return $this->isFallback; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/ConfigurationInterface.php b/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/ConfigurationInterface.php new file mode 100644 index 0000000..10fbf94 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/ConfigurationInterface.php @@ -0,0 +1,22 @@ + + * use Aws\S3\RegionalEndpoint\ConfigurationProvider; + * $provider = ConfigurationProvider::defaultProvider(); + * // Returns a ConfigurationInterface or throws. + * $config = $provider()->wait(); + * + * + * Configuration providers can be composed to create configuration using + * conditional logic that can create different configurations in different + * environments. You can compose multiple providers into a single provider using + * {@see \Aws\S3\RegionalEndpoint\ConfigurationProvider::chain}. This function + * accepts providers as variadic arguments and returns a new function that will + * invoke each provider until a successful configuration is returned. + * + * + * // First try an INI file at this location. + * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = ConfigurationProvider::env(); + * // Combine the three providers together. + * $composed = ConfigurationProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with a configuration or throws. + * $promise = $composed(); + * // Wait on the configuration to resolve. + * $config = $promise->wait(); + * + */ +class ConfigurationProvider extends AbstractConfigurationProvider + implements ConfigurationProviderInterface +{ + const ENV_ENDPOINTS_TYPE = 'AWS_S3_US_EAST_1_REGIONAL_ENDPOINT'; + const INI_ENDPOINTS_TYPE = 's3_us_east_1_regional_endpoint'; + const DEFAULT_ENDPOINTS_TYPE = 'legacy'; + + public static $cacheKey = 'aws_s3_us_east_1_regional_endpoint_config'; + + protected static $interfaceClass = ConfigurationInterface::class; + protected static $exceptionClass = ConfigurationException::class; + + /** + * Create a default config provider that first checks for environment + * variables, then checks for a specified profile in the environment-defined + * config file location (env variable is 'AWS_CONFIG_FILE', file location + * defaults to ~/.aws/config), then checks for the "default" profile in the + * environment-defined config file location, and failing those uses a default + * fallback set of configuration options. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided config options. + * + * @param array $config + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $configProviders = [self::env()]; + if ( + !isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] != false + ) { + $configProviders[] = self::ini(); + } + $configProviders[] = self::fallback(); + + $memo = self::memoize( + call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders) + ); + + if (isset($config['s3_us_east_1_regional_endpoint']) + && $config['s3_us_east_1_regional_endpoint'] instanceof CacheInterface + ) { + return self::cache($memo, $config['s3_us_east_1_regional_endpoint'], self::$cacheKey); + } + + return $memo; + } + + public static function env() + { + return function () { + // Use config from environment variables, if available + $endpointsType = getenv(self::ENV_ENDPOINTS_TYPE); + if (!empty($endpointsType)) { + return Promise\Create::promiseFor( + new Configuration($endpointsType) + ); + } + + return self::reject('Could not find environment variable config' + . ' in ' . self::ENV_ENDPOINTS_TYPE); + }; + } + + /** + * Config provider that creates config using a config file whose location + * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to + * ~/.aws/config if not specified + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile. + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the default directory. + * + * @return callable + */ + public static function ini( + $profile = null, + $filename = null + ) { + $filename = $filename ?: (self::getDefaultConfigFilename()); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($profile, $filename) { + if (!@is_readable($filename)) { + return self::reject("Cannot read configuration from $filename"); + } + $data = \Aws\parse_ini_file($filename, true); + if ($data === false) { + return self::reject("Invalid config file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in config file"); + } + if (!isset($data[$profile][self::INI_ENDPOINTS_TYPE])) { + return self::reject("Required S3 regional endpoint config values + not present in INI profile '{$profile}' ({$filename})"); + } + + return Promise\Create::promiseFor( + new Configuration($data[$profile][self::INI_ENDPOINTS_TYPE]) + ); + }; + } + + /** + * Fallback config options when other sources are not set. + * + * @return callable + */ + public static function fallback() + { + return function () { + return Promise\Create::promiseFor( + new Configuration(self::DEFAULT_ENDPOINTS_TYPE, true) + ); + }; + } + + /** + * Unwraps a configuration object in whatever valid form it is in, + * always returning a ConfigurationInterface object. + * + * @param mixed $config + * @return ConfigurationInterface + * @throws \InvalidArgumentException + */ + public static function unwrap($config) + { + if (is_callable($config)) { + $config = $config(); + } + if ($config instanceof Promise\PromiseInterface) { + $config = $config->wait(); + } + if ($config instanceof ConfigurationInterface) { + return $config; + } + if (is_string($config)) { + return new Configuration($config); + } + if (is_array($config) && isset($config['endpoints_type'])) { + return new Configuration($config['endpoints_type']); + } + + throw new \InvalidArgumentException('Not a valid S3 regional endpoint ' + . 'configuration argument.'); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/Exception/ConfigurationException.php b/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/Exception/ConfigurationException.php new file mode 100644 index 0000000..29e211f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/RegionalEndpoint/Exception/ConfigurationException.php @@ -0,0 +1,14 @@ +parser = $parser; + $this->exceptionClass = $exceptionClass; + } + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + $fn = $this->parser; + + try { + return $fn($command, $response); + } catch (ParserException $e) { + throw new $this->exceptionClass( + "Error parsing response for {$command->getName()}:" + . " AWS parsing error: {$e->getMessage()}", + $command, + ['connection_error' => true, 'exception' => $e], + $e + ); + } + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + return $this->parser->parseMemberFromStream($stream, $member, $response); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/S3Client.php b/vendor/aws/aws-sdk-php/src/S3/S3Client.php new file mode 100644 index 0000000..c7177d1 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/S3Client.php @@ -0,0 +1,1323 @@ + true, + 'when_required' => true + ]; + + public static function getArguments() + { + $args = parent::getArguments(); + $args['retries']['fn'] = [__CLASS__, '_applyRetryConfig']; + $args['api_provider']['fn'] = [__CLASS__, '_applyApiProvider']; + + return + [ + 'request_checksum_calculation' => [ + 'type' => 'config', + 'valid' => ['string'], + 'doc' => 'Valid values are `when_supported` and `when_required`. Default is `when_supported`.' + . ' `when_supported` results in checksum calculation when an operation has modeled checksum support.' + . ' `when_required` results in checksum calculation when an operation has modeled checksum support and' + . ' request checksums are modeled as required.', + 'fn' => [__CLASS__, '_apply_request_checksum_calculation'], + 'default' => [__CLASS__, '_default_request_checksum_calculation'], + ], + 'response_checksum_validation' => [ + 'type' => 'config', + 'valid' => ['string'], + 'doc' => 'Valid values are `when_supported` and `when_required`. Default is `when_supported`.' + . ' `when_supported` results in checksum validation when an operation has modeled checksum support.' + . ' `when_required` results in checksum validation when an operation has modeled checksum support and' + . ' `CheckSumMode` is set to `enabled`.', + 'fn' => [__CLASS__, '_apply_response_checksum_validation'], + 'default' => [__CLASS__, '_default_response_checksum_validation'], + ] + ] + + $args + [ + 'bucket_endpoint' => [ + 'type' => 'config', + 'valid' => ['bool'], + 'doc' => 'Set to true to send requests to a hardcoded ' + . 'bucket endpoint rather than create an endpoint as a ' + . 'result of injecting the bucket into the URL. This ' + . 'option is useful for interacting with CNAME endpoints.', + ], + 'use_arn_region' => [ + 'type' => 'config', + 'valid' => [ + 'bool', + Configuration::class, + CacheInterface::class, + 'callable' + ], + 'doc' => 'Set to true to allow passed in ARNs to override' + . ' client region. Accepts...', + 'fn' => [__CLASS__, '_apply_use_arn_region'], + 'default' => [UseArnRegionConfigurationProvider::class, 'defaultProvider'], + ], + 'use_accelerate_endpoint' => [ + 'type' => 'config', + 'valid' => ['bool'], + 'doc' => 'Set to true to send requests to an S3 Accelerate' + . ' endpoint by default. Can be enabled or disabled on' + . ' individual operations by setting' + . ' \'@use_accelerate_endpoint\' to true or false. Note:' + . ' you must enable S3 Accelerate on a bucket before it can' + . ' be accessed via an Accelerate endpoint.', + 'default' => false, + ], + 'use_path_style_endpoint' => [ + 'type' => 'config', + 'valid' => ['bool'], + 'doc' => 'Set to true to send requests to an S3 path style' + . ' endpoint by default.' + . ' Can be enabled or disabled on individual operations by setting' + . ' \'@use_path_style_endpoint\' to true or false.', + 'default' => false, + ], + 'disable_multiregion_access_points' => [ + 'type' => 'config', + 'valid' => ['bool'], + 'doc' => 'Set to true to disable the usage of' + . ' multi region access points. These are enabled by default.' + . ' Can be enabled or disabled on individual operations by setting' + . ' \'@disable_multiregion_access_points\' to true or false.', + 'default' => false, + ], + 'disable_express_session_auth' => [ + 'type' => 'config', + 'valid' => ['bool'], + 'doc' => 'Set to true to disable the usage of' + . ' s3 express session authentication. This is enabled by default.', + 'default' => [__CLASS__, '_default_disable_express_session_auth'], + ], + 's3_express_identity_provider' => [ + 'type' => 'config', + 'valid' => [ + 'bool', + 'callable' + ], + 'doc' => 'Specifies the provider used to generate identities to sign s3 express requests. ' + . 'Set to `false` to disable s3 express auth, or a callable provider used to create s3 express ' + . 'identities or return null.', + 'default' => [__CLASS__, '_default_s3_express_identity_provider'], + ], + ]; + } + + /** + * {@inheritdoc} + * + * In addition to the options available to + * {@see Aws\AwsClient::__construct}, S3Client accepts the following + * options: + * + * - bucket_endpoint: (bool) Set to true to send requests to a + * hardcoded bucket endpoint rather than create an endpoint as a result + * of injecting the bucket into the URL. This option is useful for + * interacting with CNAME endpoints. Note: if you are using version 2.243.0 + * and above and do not expect the bucket name to appear in the host, you will + * also need to set `use_path_style_endpoint` to `true`. + * - calculate_md5: (bool) Set to false to disable calculating an MD5 + * for all Amazon S3 signed uploads. + * - s3_us_east_1_regional_endpoint: + * (Aws\S3\RegionalEndpoint\ConfigurationInterface|Aws\CacheInterface\|callable|string|array) + * Specifies whether to use regional or legacy endpoints for the us-east-1 + * region. Provide an Aws\S3\RegionalEndpoint\ConfigurationInterface object, an + * instance of Aws\CacheInterface, a callable configuration provider used + * to create endpoint configuration, a string value of `legacy` or + * `regional`, or an associative array with the following keys: + * endpoint_types: (string) Set to `legacy` or `regional`, defaults to + * `legacy` + * - use_accelerate_endpoint: (bool) Set to true to send requests to an S3 + * Accelerate endpoint by default. Can be enabled or disabled on + * individual operations by setting '@use_accelerate_endpoint' to true or + * false. Note: you must enable S3 Accelerate on a bucket before it can be + * accessed via an Accelerate endpoint. + * - use_arn_region: (Aws\S3\UseArnRegion\ConfigurationInterface, + * Aws\CacheInterface, bool, callable) Set to true to enable the client + * to use the region from a supplied ARN argument instead of the client's + * region. Provide an instance of Aws\S3\UseArnRegion\ConfigurationInterface, + * an instance of Aws\CacheInterface, a callable that provides a promise for + * a Configuration object, or a boolean value. Defaults to false (i.e. + * the SDK will not follow the ARN region if it conflicts with the client + * region and instead throw an error). + * - use_dual_stack_endpoint: (bool) Set to true to send requests to an S3 + * Dual Stack endpoint by default, which enables IPv6 Protocol. + * Can be enabled or disabled on individual operations by setting + * '@use_dual_stack_endpoint\' to true or false. Note: + * you cannot use it together with an accelerate endpoint. + * - use_path_style_endpoint: (bool) Set to true to send requests to an S3 + * path style endpoint by default. + * Can be enabled or disabled on individual operations by setting + * '@use_path_style_endpoint\' to true or false. Note: + * you cannot use it together with an accelerate endpoint. + * - disable_multiregion_access_points: (bool) Set to true to disable + * sending multi region requests. They are enabled by default. + * Can be enabled or disabled on individual operations by setting + * '@disable_multiregion_access_points\' to true or false. Note: + * you cannot use it together with an accelerate or dualstack endpoint. + * + * @param array $args + */ + public function __construct(array $args) + { + if ( + !isset($args['s3_us_east_1_regional_endpoint']) + || $args['s3_us_east_1_regional_endpoint'] instanceof CacheInterface + ) { + $args['s3_us_east_1_regional_endpoint'] = ConfigurationProvider::defaultProvider($args); + } + $this->addBuiltIns($args); + parent::__construct($args); + $stack = $this->getHandlerList(); + $config = $this->getConfig(); + $stack->appendInit(SSECMiddleware::wrap($this->getEndpoint()->getScheme()), 's3.ssec'); + $stack->appendBuild( + ApplyChecksumMiddleware::wrap($this->getApi(), $this->getConfig()), + 's3.checksum' + ); + $stack->appendBuild( + Middleware::contentType(['PutObject', 'UploadPart']), + 's3.content_type' + ); + + if ($this->getConfig('bucket_endpoint')) { + $stack->appendBuild(BucketEndpointMiddleware::wrap( + $this->isUseEndpointV2(), $args['endpoint'] ?? null), 's3.bucket_endpoint' + ); + } elseif (!$this->isUseEndpointV2()) { + $stack->appendBuild( + S3EndpointMiddleware::wrap( + $this->getRegion(), + $this->getConfig('endpoint_provider'), + [ + 'accelerate' => $this->getConfig('use_accelerate_endpoint'), + 'path_style' => $this->getConfig('use_path_style_endpoint'), + 'use_fips_endpoint' => $this->getConfig('use_fips_endpoint'), + 'dual_stack' => + $this->getConfig('use_dual_stack_endpoint')->isUseDualStackEndpoint(), + + ] + ), + 's3.endpoint_middleware' + ); + } + + $stack->appendBuild( + BucketEndpointArnMiddleware::wrap( + $this->getApi(), + $this->getRegion(), + [ + 'use_arn_region' => $this->getConfig('use_arn_region'), + 'accelerate' => $this->getConfig('use_accelerate_endpoint'), + 'path_style' => $this->getConfig('use_path_style_endpoint'), + 'dual_stack' => + $this->getConfig('use_dual_stack_endpoint')->isUseDualStackEndpoint(), + 'use_fips_endpoint' => $this->getConfig('use_fips_endpoint'), + 'disable_multiregion_access_points' => + $this->getConfig('disable_multiregion_access_points'), + 'endpoint' => $args['endpoint'] ?? null + ], + $this->isUseEndpointV2() + ), + 's3.bucket_endpoint_arn' + ); + if ($this->getConfig('disable_express_session_auth')) { + $stack->prependSign( + $this->getDisableExpressSessionAuthMiddleware(), + 's3.disable_express_session_auth' + ); + } + + $stack->appendValidate( + InputValidationMiddleware::wrap($this->getApi(), self::$mandatoryAttributes), + 'input_validation_middleware' + ); + $stack->appendSign(ExpiresParsingMiddleware::wrap(), 's3.expires_parsing'); + $stack->appendSign(PutObjectUrlMiddleware::wrap(), 's3.put_object_url'); + $stack->appendSign(PermanentRedirectMiddleware::wrap(), 's3.permanent_redirect'); + $stack->appendInit(Middleware::sourceFile($this->getApi()), 's3.source_file'); + $stack->appendInit($this->getSaveAsParameter(), 's3.save_as'); + $stack->appendInit($this->getLocationConstraintMiddleware(), 's3.location'); + $stack->appendInit($this->getEncodingTypeMiddleware(), 's3.auto_encode'); + $stack->appendInit($this->getHeadObjectMiddleware(), 's3.head_object'); + $this->processModel($this->isUseEndpointV2()); + if ($this->isUseEndpointV2()) { + $stack->after('builder', + 's3.check_empty_path_with_query', + $this->getEmptyPathWithQuery()); + } + } + + /** + * Determine if a string is a valid name for a DNS compatible Amazon S3 + * bucket. + * + * DNS compatible bucket names can be used as a subdomain in a URL (e.g., + * ".s3.amazonaws.com"). + * + * @param string $bucket Bucket name to check. + * + * @return bool + */ + public static function isBucketDnsCompatible($bucket) + { + if (!is_string($bucket)) { + return false; + } + $bucketLen = strlen($bucket); + + return ($bucketLen >= 3 && $bucketLen <= 63) && + // Cannot look like an IP address + !filter_var($bucket, FILTER_VALIDATE_IP) && + preg_match('/^[a-z0-9]([a-z0-9\-\.]*[a-z0-9])?$/', $bucket); + } + + public static function _apply_use_arn_region($value, array &$args, HandlerList $list) + { + if ($value instanceof CacheInterface) { + $value = UseArnRegionConfigurationProvider::defaultProvider($args); + } + if (is_callable($value)) { + $value = $value(); + } + if ($value instanceof PromiseInterface) { + $value = $value->wait(); + } + if ($value instanceof ConfigurationInterface) { + $args['use_arn_region'] = $value; + } else { + // The Configuration class itself will validate other inputs + $args['use_arn_region'] = new Configuration($value); + } + } + + public static function _default_request_checksum_calculation(array $args): string + { + return ConfigurationResolver::resolve( + 'request_checksum_calculation', + ApplyChecksumMiddleware::DEFAULT_CALCULATION_MODE, + 'string', + $args + ); + } + + public static function _apply_request_checksum_calculation( + string $value, + array &$args + ): void + { + $value = strtolower($value); + if (array_key_exists($value, self::$checksumOptionEnum)) { + $args['request_checksum_calculation'] = $value; + } else { + $validValues = implode(' | ', array_keys(self::$checksumOptionEnum)); + throw new \InvalidArgumentException( + 'invalid value provided for `request_checksum_calculation`.' + . ' valid values are: ' . $validValues . '.' + ); + } + } + + public static function _default_response_checksum_validation(array $args): string + { + return ConfigurationResolver::resolve( + 'response_checksum_validation', + ValidateResponseChecksumResultMutator::DEFAULT_VALIDATION_MODE, + 'string', + $args + ); + } + + public static function _apply_response_checksum_validation( + $value, + array &$args + ): void + { + $value = strtolower($value); + if (array_key_exists($value, self::$checksumOptionEnum)) { + $args['response_checksum_validation'] = $value; + } else { + $validValues = implode(' | ', array_keys(self::$checksumOptionEnum)); + throw new \InvalidArgumentException( + 'invalid value provided for `response_checksum_validation`.' + . ' valid values are: ' . $validValues . '.' + ); + } + } + + public static function _default_disable_express_session_auth(array &$args) + { + return ConfigurationResolver::resolve( + 's3_disable_express_session_auth', + false, + 'bool', + $args + ); + } + + public static function _default_s3_express_identity_provider(array $args) + { + if ($args['config']['disable_express_session_auth']) { + return false; + } + return new S3ExpressIdentityProvider($args['region']); + } + + public function createPresignedRequest(CommandInterface $command, $expires, array $options = []) + { + $command = clone $command; + $list = $command->getHandlerList(); + $list->remove('signer'); + + //Removes checksum calculation behavior by default + if (empty($command['ChecksumAlgorithm']) + && empty($command['AddContentMD5']) + ) { + $list->remove('s3.checksum'); + } + + $request = \Aws\serialize($command); + + //Applies ContentSHA256 parameter, if provided and not applied + // by middleware + $commandName = $command->getName(); + if (!empty($command['ContentSHA256'] + && isset(ApplyChecksumMiddleware::$sha256[$commandName]) + && !$request->hasHeader('X-Amz-Content-Sha256') + )) { + $request = $request->withHeader( + 'X-Amz-Content-Sha256', + $command['ContentSHA256'] + ); + } + + $signing_name = $command['@context']['signing_service'] + ?? $this->getSigningName($request->getUri()->getHost()); + $signature_version = $this->getSignatureVersionFromCommand($command); + + /** @var \Aws\Signature\SignatureInterface $signer */ + $signer = call_user_func( + $this->getSignatureProvider(), + $signature_version, + $signing_name, + $this->getConfig('signing_region') + ); + if ($signature_version == 'v4-s3express') { + $provider = $this->getConfig('s3_express_identity_provider'); + $credentials = $provider($command)->wait(); + } else { + $credentials = $this->getCredentials()->wait(); + } + return $signer->presign( + $request, + $credentials, + $expires, + $options + ); + } + + /** + * Returns the URL to an object identified by its bucket and key. + * + * The URL returned by this method is not signed nor does it ensure that the + * bucket and key given to the method exist. If you need a signed URL, then + * use the {@see \Aws\S3\S3Client::createPresignedRequest} method and get + * the URI of the signed request. + * + * @param string $bucket The name of the bucket where the object is located + * @param string $key The key of the object + * + * @return string The URL to the object + */ + public function getObjectUrl($bucket, $key) + { + $command = $this->getCommand('GetObject', [ + 'Bucket' => $bucket, + 'Key' => $key + ]); + + return (string) \Aws\serialize($command)->getUri(); + } + + /** + * Raw URL encode a key and allow for '/' characters + * + * @param string $key Key to encode + * + * @return string Returns the encoded key + */ + public static function encodeKey($key) + { + return str_replace('%2F', '/', rawurlencode($key)); + } + + /** + * Provides a middleware that removes the need to specify LocationConstraint on CreateBucket. + * + * @return \Closure + */ + private function getLocationConstraintMiddleware() + { + $region = $this->getRegion(); + return static function (callable $handler) use ($region) { + return function (Command $command, $request = null) use ($handler, $region) { + if ($command->getName() === 'CreateBucket' + && !self::isDirectoryBucket($command['Bucket']) + ) { + $locationConstraint = $command['CreateBucketConfiguration']['LocationConstraint'] + ?? null; + + if ($locationConstraint === 'us-east-1') { + unset($command['CreateBucketConfiguration']); + } elseif ('us-east-1' !== $region && empty($locationConstraint)) { + if (isset($command['CreateBucketConfiguration'])) { + $command['CreateBucketConfiguration']['LocationConstraint'] = $region; + } else { + $command['CreateBucketConfiguration'] = ['LocationConstraint' => $region]; + } + } + } + + return $handler($command, $request); + }; + }; + } + + /** + * Provides a middleware that supports the `SaveAs` parameter. + * + * @return \Closure + */ + private function getSaveAsParameter() + { + return static function (callable $handler) { + return function (Command $command, $request = null) use ($handler) { + if ($command->getName() === 'GetObject' && isset($command['SaveAs'])) { + $command['@http']['sink'] = $command['SaveAs']; + unset($command['SaveAs']); + } + + return $handler($command, $request); + }; + }; + } + + /** + * Provides a middleware that disables content decoding on HeadObject + * commands. + * + * @return \Closure + */ + private function getHeadObjectMiddleware() + { + return static function (callable $handler) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler) { + if ($command->getName() === 'HeadObject' + && !isset($command['@http']['decode_content']) + ) { + $command['@http']['decode_content'] = false; + } + + return $handler($command, $request); + }; + }; + } + + /** + * Provides a middleware that autopopulates the EncodingType parameter on + * ListObjects commands. + * + * @return \Closure + */ + private function getEncodingTypeMiddleware() + { + return static function (callable $handler) { + return function (Command $command, $request = null) use ($handler) { + $autoSet = false; + if ($command->getName() === 'ListObjects' + && empty($command['EncodingType']) + ) { + $command['EncodingType'] = 'url'; + $autoSet = true; + } + + return $handler($command, $request) + ->then(function (ResultInterface $result) use ($autoSet) { + if ($result['EncodingType'] === 'url' && $autoSet) { + static $topLevel = [ + 'Delimiter', + 'Marker', + 'NextMarker', + 'Prefix', + ]; + static $nested = [ + ['Contents', 'Key'], + ['CommonPrefixes', 'Prefix'], + ]; + + foreach ($topLevel as $key) { + if (isset($result[$key])) { + $result[$key] = urldecode($result[$key]); + } + } + foreach ($nested as $steps) { + if (isset($result[$steps[0]])) { + foreach ($result[$steps[0]] as $key => $part) { + if (isset($part[$steps[1]])) { + $result[$steps[0]][$key][$steps[1]] + = urldecode($part[$steps[1]]); + } + } + } + } + + } + + return $result; + }); + }; + }; + } + + /** + * Provides a middleware that checks for an empty path and a + * non-empty query string. + * + * @return \Closure + */ + private function getEmptyPathWithQuery() + { + return static function (callable $handler) { + return function (Command $command, RequestInterface $request) use ($handler) { + $uri = $request->getUri(); + if (empty($uri->getPath()) && !empty($uri->getQuery())) { + $uri = $uri->withPath('/'); + $request = $request->withUri($uri); + } + + return $handler($command, $request); + }; + }; + } + + /** + * Provides a middleware that disables express session auth when + * customers opt out of it. + * + * @return \Closure + */ + private function getDisableExpressSessionAuthMiddleware() + { + return function (callable $handler) { + return function ( + CommandInterface $command, + ?RequestInterface $request = null + ) use ($handler) { + if (!empty($command['@context']['signature_version']) + && $command['@context']['signature_version'] === 'v4-s3express' + ) { + $command['@context']['signature_version'] = 's3v4'; + } + return $handler($command, $request); + }; + }; + } + + /** + * Special handling for when the service name is s3-object-lambda. + * So, if the host contains s3-object-lambda, then the service name + * returned is s3-object-lambda, otherwise the default signing service is returned. + * @param string $host The host to validate if is a s3-object-lambda URL. + * @return string returns the signing service name to be used + */ + private function getSigningName($host) + { + if (strpos( $host, 's3-object-lambda')) { + return 's3-object-lambda'; + } + + return $this->getConfig('signing_name'); + } + + /** + * If EndpointProviderV2 is used, removes `Bucket` from request URIs. + * This is now handled by the endpoint ruleset. + * + * Additionally adds a synthetic shape `ExpiresString` and modifies + * `Expires` type to ensure it remains set to `timestamp`. + * + * @param array $args + * @return void + * + * @internal + */ + private function processModel(bool $isUseEndpointV2): void + { + $definition = $this->getApi()->getDefinition(); + + if ($isUseEndpointV2) { + foreach($definition['operations'] as &$operation) { + if (isset($operation['http']['requestUri'])) { + $requestUri = $operation['http']['requestUri']; + if ($requestUri === "/{Bucket}") { + $requestUri = str_replace('/{Bucket}', '/', $requestUri); + } else { + $requestUri = str_replace('/{Bucket}', '', $requestUri); + // If we're left with just a query string, prepend '/' + if (str_starts_with($requestUri, '?')) { + $requestUri = '/' . $requestUri; + } + } + $operation['http']['requestUri'] = $requestUri; + } + } + } + + foreach ($definition['shapes'] as $key => &$value) { + $suffix = 'Output'; + if (str_ends_with($key, $suffix)) { + if (isset($value['members']['Expires'])) { + $value['members']['Expires']['deprecated'] = true; + $value['members']['ExpiresString'] = [ + 'shape' => 'ExpiresString', + 'location' => 'header', + 'locationName' => 'Expires' + ]; + } + } + } + $definition['shapes']['ExpiresString']['type'] = 'string'; + $definition['shapes']['Expires']['type'] = 'timestamp'; + + $this->getApi()->setDefinition($definition); + } + + /** + * Adds service-specific client built-in values + * + * @return void + */ + private function addBuiltIns($args) + { + if (isset($args['region']) + && $args['region'] !== 'us-east-1' + ) { + return false; + } + + if (!isset($args['region']) + && ConfigurationResolver::resolve('region', '', 'string') !== 'us-east-1' + ) { + return false; + } + + $key = 'AWS::S3::UseGlobalEndpoint'; + $result = $args['s3_us_east_1_regional_endpoint'] instanceof \Closure ? + $args['s3_us_east_1_regional_endpoint']()->wait() : $args['s3_us_east_1_regional_endpoint']; + + if (is_string($result)) { + if ($result === 'regional') { + $value = false; + } else if ($result === 'legacy') { + $value = true; + } else { + return; + } + } else { + if ($result->isFallback() + || $result->getEndpointsType() === 'legacy' + ) { + $value = true; + } else { + $value = false; + } + } + $this->clientBuiltIns[$key] = $value; + } + + /** + * Determines whether a bucket is a directory bucket. + * Only considers the availability zone/suffix format + * + * @param string $bucket + * @return bool + */ + public static function isDirectoryBucket(string $bucket): bool + { + return preg_match(self::DIRECTORY_BUCKET_REGEX, $bucket) === 1; + } + + /** @internal */ + public static function _applyRetryConfig($value, $args, HandlerList $list) + { + if ($value) { + $config = \Aws\Retry\ConfigurationProvider::unwrap($value); + + if ($config->getMode() === 'legacy') { + $maxRetries = $config->getMaxAttempts() - 1; + $decider = RetryMiddleware::createDefaultDecider($maxRetries); + $decider = function ($retries, $command, $request, $result, $error) use ($decider, $maxRetries) { + $maxRetries = $command['@retries'] ?? $maxRetries; + + if ($decider($retries, $command, $request, $result, $error)) { + return true; + } + + if ($error instanceof AwsException + && $retries < $maxRetries + ) { + if ($error->getResponse() + && $error->getResponse()->getStatusCode() >= 400 + ) { + return strpos( + $error->getResponse()->getBody(), + 'Your socket connection to the server' + ) !== false; + } + + if ($error->getPrevious() instanceof RequestException) { + // All commands except CompleteMultipartUpload are + // idempotent and may be retried without worry if a + // networking error has occurred. + return $command->getName() !== 'CompleteMultipartUpload'; + } + } + + return false; + }; + + $delay = [RetryMiddleware::class, 'exponentialDelay']; + $list->appendSign(Middleware::retry($decider, $delay), 'retry'); + } else { + $defaultDecider = RetryMiddlewareV2::createDefaultDecider( + new QuotaManager(), + $config->getMaxAttempts() + ); + + $list->appendSign( + RetryMiddlewareV2::wrap( + $config, + [ + 'collect_stats' => $args['stats']['retries'], + 'decider' => function( + $attempts, + CommandInterface $cmd, + $result + ) use ($defaultDecider, $config) { + $isRetryable = $defaultDecider($attempts, $cmd, $result); + if (!$isRetryable + && $result instanceof AwsException + && $attempts < $config->getMaxAttempts() + ) { + if (!empty($result->getResponse()) + && $result->getResponse()->getStatusCode() >= 400 + ) { + return strpos( + $result->getResponse()->getBody(), + 'Your socket connection to the server' + ) !== false; + } + + if ($result->getPrevious() instanceof RequestException + && $cmd->getName() !== 'CompleteMultipartUpload' + ) { + $isRetryable = true; + } + } + + return $isRetryable; + } + ] + ), + 'retry' + ); + } + } + } + + /** @internal */ + public static function _applyApiProvider($value, array &$args, HandlerList $list) + { + ClientResolver::_apply_api_provider($value, $args); + $s3Parser = new S3Parser( + $args['parser'], + $args['error_parser'], + $args['api'], + $args['exception_class'] + ); + $s3Parser->addS3ResultMutator( + 'get-bucket-location', + new GetBucketLocationResultMutator() + ); + $s3Parser->addS3ResultMutator( + 'validate-response-checksum', + new ValidateResponseChecksumResultMutator( + $args['api'], + ['response_checksum_validation' => $args['response_checksum_validation']] + ) + ); + $args['parser'] = $s3Parser; + } + + /** + * @internal + * @codeCoverageIgnore + */ + public static function applyDocFilters(array $api, array $docs) + { + $b64 = '
This value will be base64 encoded on your behalf.
'; + $opt = '
This value will be computed for you it is not supplied.
'; + + // Add a note on the CopyObject docs + $s3ExceptionRetryMessage = "

Additional info on response behavior: if there is" + . " an internal error in S3 after the request was successfully recieved," + . " a 200 response will be returned with an S3Exception embedded" + . " in it; this will still be caught and retried by" + . " RetryMiddleware.

"; + + $docs['operations']['CopyObject'] .= $s3ExceptionRetryMessage; + $docs['operations']['CompleteMultipartUpload'] .= $s3ExceptionRetryMessage; + $docs['operations']['UploadPartCopy'] .= $s3ExceptionRetryMessage; + $docs['operations']['UploadPart'] .= $s3ExceptionRetryMessage; + + // Add note about stream ownership in the putObject call + $guzzleStreamMessage = "

Additional info on behavior of the stream" + . " parameters: Psr7 takes ownership of streams and will automatically close" + . " streams when this method is called with a stream as the Body" + . " parameter. To prevent this, set the Body using" + . " GuzzleHttp\Psr7\stream_for method with a is an instance of" + . " Psr\Http\Message\StreamInterface, and it will be returned" + . " unmodified. This will allow you to keep the stream in scope.

"; + $docs['operations']['PutObject'] .= $guzzleStreamMessage; + + // Add the SourceFile parameter. + $docs['shapes']['SourceFile']['base'] = 'The path to a file on disk to use instead of the Body parameter.'; + $api['shapes']['SourceFile'] = ['type' => 'string']; + $api['shapes']['PutObjectRequest']['members']['SourceFile'] = ['shape' => 'SourceFile']; + $api['shapes']['UploadPartRequest']['members']['SourceFile'] = ['shape' => 'SourceFile']; + + // Add the ContentSHA256 parameter. + $docs['shapes']['ContentSHA256']['base'] = 'A SHA256 hash of the body content of the request.'; + $api['shapes']['ContentSHA256'] = ['type' => 'string']; + $api['shapes']['PutObjectRequest']['members']['ContentSHA256'] = ['shape' => 'ContentSHA256']; + $api['shapes']['UploadPartRequest']['members']['ContentSHA256'] = ['shape' => 'ContentSHA256']; + $docs['shapes']['ContentSHA256']['append'] = $opt; + + // Add the AddContentMD5 parameter. + $docs['shapes']['AddContentMD5']['base'] = 'Set to true to calculate the ContentMD5 for the upload.'; + $api['shapes']['AddContentMD5'] = ['type' => 'boolean']; + $api['shapes']['PutObjectRequest']['members']['AddContentMD5'] = ['shape' => 'AddContentMD5']; + $api['shapes']['UploadPartRequest']['members']['AddContentMD5'] = ['shape' => 'AddContentMD5']; + + // Add the SaveAs parameter. + $docs['shapes']['SaveAs']['base'] = 'The path to a file on disk to save the object data.'; + $api['shapes']['SaveAs'] = ['type' => 'string']; + $api['shapes']['GetObjectRequest']['members']['SaveAs'] = ['shape' => 'SaveAs']; + + // Several SSECustomerKey documentation updates. + $docs['shapes']['SSECustomerKey']['append'] = $b64; + $docs['shapes']['CopySourceSSECustomerKey']['append'] = $b64; + $docs['shapes']['SSECustomerKeyMd5']['append'] = $opt; + + // Add the ObjectURL to various output shapes and documentation. + $docs['shapes']['ObjectURL']['base'] = 'The URI of the created object.'; + $api['shapes']['ObjectURL'] = ['type' => 'string']; + $api['shapes']['PutObjectOutput']['members']['ObjectURL'] = ['shape' => 'ObjectURL']; + $api['shapes']['CopyObjectOutput']['members']['ObjectURL'] = ['shape' => 'ObjectURL']; + $api['shapes']['CompleteMultipartUploadOutput']['members']['ObjectURL'] = ['shape' => 'ObjectURL']; + + // Fix references to Location Constraint. + unset($api['shapes']['CreateBucketRequest']['payload']); + $api['shapes']['BucketLocationConstraint']['enum'] = [ + "ap-northeast-1", + "ap-southeast-2", + "ap-southeast-1", + "cn-north-1", + "eu-central-1", + "eu-west-1", + "us-east-1", + "us-west-1", + "us-west-2", + "sa-east-1", + ]; + + // Add a note that the ContentMD5 is automatically computed, except for with PutObject and UploadPart + $docs['shapes']['ContentMD5']['append'] = '
The value will be computed on ' + . 'your behalf.
'; + $docs['shapes']['ContentMD5']['excludeAppend'] = ['PutObjectRequest', 'UploadPartRequest']; + + //Add a note to ContentMD5 for PutObject and UploadPart that specifies the value is required + // When uploading to a bucket with object lock enabled and that it is not computed automatically + $objectLock = '
This value is required if uploading to a bucket ' + . 'which has Object Lock enabled. It will not be calculated for you automatically. If you wish to have ' + . 'the value calculated for you, use the `AddContentMD5` parameter.
'; + $docs['shapes']['ContentMD5']['appendOnly'] = [ + 'message' => $objectLock, + 'shapes' => ['PutObjectRequest', 'UploadPartRequest'] + ]; + + // Add `ExpiresString` shape to output structures which contain `Expires` + // Deprecate existing `Expires` shapes in output structures + // Add/Update documentation for both `ExpiresString` and `Expires` + // Ensure `Expires` type remains timestamp + foreach ($api['shapes'] as $key => &$value) { + $suffix = 'Output'; + if (substr($key, -strlen($suffix)) === $suffix) { + if (isset($value['members']['Expires'])) { + $value['members']['Expires']['deprecated'] = true; + $value['members']['ExpiresString'] = [ + 'shape' => 'ExpiresString', + 'location' => 'header', + 'locationName' => 'Expires' + ]; + $docs['shapes']['Expires']['refs'][$key . '$Expires'] + .= '

This output shape has been deprecated. Please refer to ExpiresString instead.

.'; + } + } + } + $api['shapes']['ExpiresString']['type'] = 'string'; + $docs['shapes']['ExpiresString']['base'] = 'The unparsed string value of the Expires output member.'; + $api['shapes']['Expires']['type'] = 'timestamp'; + + return [ + new Service($api, ApiProvider::defaultProvider()), + new DocModel($docs) + ]; + } + + /** + * @internal + * @codeCoverageIgnore + */ + public static function addDocExamples($examples) + { + $getObjectExample = [ + 'input' => [ + 'Bucket' => 'arn:aws:s3:us-east-1:123456789012:accesspoint:myaccesspoint', + 'Key' => 'my-key' + ], + 'output' => [ + 'Body' => 'class GuzzleHttp\Psr7\Stream#208 (7) {...}', + 'ContentLength' => '11', + 'ContentType' => 'application/octet-stream', + ], + 'comments' => [ + 'input' => '', + 'output' => 'Simplified example output' + ], + 'description' => 'The following example retrieves an object by referencing the bucket via an S3 accesss point ARN. Result output is simplified for the example.', + 'id' => '', + 'title' => 'To get an object via an S3 access point ARN' + ]; + if (isset($examples['GetObject'])) { + $examples['GetObject'] []= $getObjectExample; + } else { + $examples['GetObject'] = [$getObjectExample]; + } + + $putObjectExample = [ + 'input' => [ + 'Bucket' => 'arn:aws:s3:us-east-1:123456789012:accesspoint:myaccesspoint', + 'Key' => 'my-key', + 'Body' => 'my-body', + ], + 'output' => [ + 'ObjectURL' => 'https://my-bucket.s3.us-east-1.amazonaws.com/my-key' + ], + 'comments' => [ + 'input' => '', + 'output' => 'Simplified example output' + ], + 'description' => 'The following example uploads an object by referencing the bucket via an S3 accesss point ARN. Result output is simplified for the example.', + 'id' => '', + 'title' => 'To upload an object via an S3 access point ARN' + ]; + if (isset($examples['PutObject'])) { + $examples['PutObject'] []= $putObjectExample; + } else { + $examples['PutObject'] = [$putObjectExample]; + } + + return $examples; + } + + /** + * @param CommandInterface $command + * @return array|mixed|null + */ + private function getSignatureVersionFromCommand(CommandInterface $command) + { + return $command['@context']['signature_version'] + ?? $this->getConfig('signature_version'); + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/S3ClientInterface.php b/vendor/aws/aws-sdk-php/src/S3/S3ClientInterface.php new file mode 100644 index 0000000..261d7dd --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/S3ClientInterface.php @@ -0,0 +1,369 @@ +uploadAsync($bucket, $key, $body, $acl, $options) + ->wait(); + } + + /** + * @see S3ClientInterface::uploadAsync() + */ + public function uploadAsync( + $bucket, + $key, + $body, + $acl = 'private', + array $options = [] + ) { + return (new ObjectUploader($this, $bucket, $key, $body, $acl, $options)) + ->promise(); + } + + /** + * @see S3ClientInterface::copy() + */ + public function copy( + $fromB, + $fromK, + $destB, + $destK, + $acl = 'private', + array $opts = [] + ) { + return $this->copyAsync($fromB, $fromK, $destB, $destK, $acl, $opts) + ->wait(); + } + + /** + * @see S3ClientInterface::copyAsync() + */ + public function copyAsync( + $fromB, + $fromK, + $destB, + $destK, + $acl = 'private', + array $opts = [] + ) { + $source = [ + 'Bucket' => $fromB, + 'Key' => $fromK, + ]; + if (isset($opts['version_id'])) { + $source['VersionId'] = $opts['version_id']; + } + $destination = [ + 'Bucket' => $destB, + 'Key' => $destK + ]; + + return (new ObjectCopier($this, $source, $destination, $acl, $opts)) + ->promise(); + } + + /** + * @see S3ClientInterface::registerStreamWrapper() + */ + public function registerStreamWrapper() + { + StreamWrapper::register($this); + } + + /** + * @see S3ClientInterface::registerStreamWrapperV2() + */ + public function registerStreamWrapperV2() + { + StreamWrapper::register( + $this, + 's3', + null, + true + ); + } + + /** + * @see S3ClientInterface::deleteMatchingObjects() + */ + public function deleteMatchingObjects( + $bucket, + $prefix = '', + $regex = '', + array $options = [] + ) { + $this->deleteMatchingObjectsAsync($bucket, $prefix, $regex, $options) + ->wait(); + } + + /** + * @see S3ClientInterface::deleteMatchingObjectsAsync() + */ + public function deleteMatchingObjectsAsync( + $bucket, + $prefix = '', + $regex = '', + array $options = [] + ) { + if (!$prefix && !$regex) { + return new RejectedPromise( + new \RuntimeException('A prefix or regex is required.') + ); + } + + $params = ['Bucket' => $bucket, 'Prefix' => $prefix]; + $iter = $this->getIterator('ListObjects', $params); + + if ($regex) { + $iter = \Aws\filter($iter, function ($c) use ($regex) { + return preg_match($regex, $c['Key']); + }); + } + + return BatchDelete::fromIterator($this, $bucket, $iter, $options) + ->promise(); + } + + /** + * @see S3ClientInterface::uploadDirectory() + */ + public function uploadDirectory( + $directory, + $bucket, + $keyPrefix = null, + array $options = [] + ) { + $this->uploadDirectoryAsync($directory, $bucket, $keyPrefix, $options) + ->wait(); + } + + /** + * @see S3ClientInterface::uploadDirectoryAsync() + */ + public function uploadDirectoryAsync( + $directory, + $bucket, + $keyPrefix = null, + array $options = [] + ) { + $d = "s3://$bucket" . ($keyPrefix ? '/' . ltrim($keyPrefix, '/') : ''); + return (new Transfer($this, $directory, $d, $options))->promise(); + } + + /** + * @see S3ClientInterface::downloadBucket() + */ + public function downloadBucket( + $directory, + $bucket, + $keyPrefix = '', + array $options = [] + ) { + $this->downloadBucketAsync($directory, $bucket, $keyPrefix, $options) + ->wait(); + } + + /** + * @see S3ClientInterface::downloadBucketAsync() + */ + public function downloadBucketAsync( + $directory, + $bucket, + $keyPrefix = '', + array $options = [] + ) { + $s = "s3://$bucket" . ($keyPrefix ? '/' . ltrim($keyPrefix, '/') : ''); + return (new Transfer($this, $s, $directory, $options))->promise(); + } + + /** + * @see S3ClientInterface::determineBucketRegion() + */ + public function determineBucketRegion($bucketName) + { + return $this->determineBucketRegionAsync($bucketName)->wait(); + } + + /** + * @see S3ClientInterface::determineBucketRegionAsync() + * + * @param string $bucketName + * + * @return PromiseInterface + */ + public function determineBucketRegionAsync($bucketName) + { + $command = $this->getCommand('HeadBucket', ['Bucket' => $bucketName]); + $handlerList = clone $this->getHandlerList(); + $handlerList->remove('s3.permanent_redirect'); + $handlerList->remove('signer'); + $handler = $handlerList->resolve(); + + return $handler($command) + ->then(static function (ResultInterface $result) { + return $result['@metadata']['headers']['x-amz-bucket-region']; + }, function (AwsException $e) { + $response = $e->getResponse(); + if ($response === null) { + throw $e; + } + + if ($e->getAwsErrorCode() === 'AuthorizationHeaderMalformed') { + $region = $this->determineBucketRegionFromExceptionBody( + $response + ); + if (!empty($region)) { + return $region; + } + throw $e; + } + + return $response->getHeaderLine('x-amz-bucket-region'); + }); + } + + private function determineBucketRegionFromExceptionBody(ResponseInterface $response) + { + try { + $element = $this->parseXml($response->getBody(), $response); + if (!empty($element->Region)) { + return (string)$element->Region; + } + } catch (\Exception $e) { + // Fallthrough on exceptions from parsing + } + return false; + } + + /** + * @see S3ClientInterface::doesBucketExist() + */ + public function doesBucketExist($bucket) + { + return $this->checkExistenceWithCommand( + $this->getCommand('HeadBucket', ['Bucket' => $bucket]) + ); + } + + /** + * @see S3ClientInterface::doesBucketExistV2() + */ + public function doesBucketExistV2($bucket, $accept403 = false) + { + $command = $this->getCommand('HeadBucket', ['Bucket' => $bucket]); + + try { + $this->execute($command); + return true; + } catch (S3Exception $e) { + if ( + ($accept403 && $e->getStatusCode() === 403) + || $e instanceof PermanentRedirectException + ) { + return true; + } + if ($e->getStatusCode() === 404) { + return false; + } + throw $e; + } + } + + /** + * @see S3ClientInterface::doesObjectExist() + */ + public function doesObjectExist($bucket, $key, array $options = []) + { + return $this->checkExistenceWithCommand( + $this->getCommand('HeadObject', [ + 'Bucket' => $bucket, + 'Key' => $key + ] + $options) + ); + } + + /** + * @see S3ClientInterface::doesObjectExistV2() + */ + public function doesObjectExistV2( + $bucket, + $key, + $includeDeleteMarkers = false, + array $options = [] + ){ + $command = $this->getCommand('HeadObject', [ + 'Bucket' => $bucket, + 'Key' => $key + ] + $options + ); + + try { + $this->execute($command); + return true; + } catch (S3Exception $e) { + if ($includeDeleteMarkers + && $this->useDeleteMarkers($e) + ) { + return true; + } + if ($e->getStatusCode() === 404) { + return false; + } + throw $e; + } + } + + private function useDeleteMarkers($exception) + { + $response = $exception->getResponse(); + return !empty($response) + && $response->getHeader('x-amz-delete-marker'); + } + + /** + * Determines whether or not a resource exists using a command + * + * @param CommandInterface $command Command used to poll for the resource + * + * @return bool + * @throws S3Exception|\Exception if there is an unhandled exception + */ + private function checkExistenceWithCommand(CommandInterface $command) + { + try { + $this->execute($command); + return true; + } catch (S3Exception $e) { + if ($e->getAwsErrorCode() == 'AccessDenied') { + return true; + } + if ($e->getStatusCode() >= 500) { + throw $e; + } + return false; + } + } + + /** + * @see S3ClientInterface::execute() + */ + abstract public function execute(CommandInterface $command); + + /** + * @see S3ClientInterface::getCommand() + */ + abstract public function getCommand($name, array $args = []); + + /** + * @see S3ClientInterface::getHandlerList() + * + * @return HandlerList + */ + abstract public function getHandlerList(); + + /** + * @see S3ClientInterface::getIterator() + * + * @return \Iterator + */ + abstract public function getIterator($name, array $args = []); +} diff --git a/vendor/aws/aws-sdk-php/src/S3/S3EndpointMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/S3EndpointMiddleware.php new file mode 100644 index 0000000..c8dd007 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/S3EndpointMiddleware.php @@ -0,0 +1,343 @@ + true, + 'DeleteBucket' => true, + 'ListBuckets' => true, + ]; + + const NO_PATTERN = 0; + const DUALSTACK = 1; + const ACCELERATE = 2; + const ACCELERATE_DUALSTACK = 3; + const PATH_STYLE = 4; + const HOST_STYLE = 5; + + /** @var bool */ + private $accelerateByDefault; + /** @var bool */ + private $dualStackByDefault; + /** @var bool */ + private $pathStyleByDefault; + /** @var string */ + private $region; + /** @var callable */ + private $endpointProvider; + /** @var callable */ + private $nextHandler; + /** @var string */ + private $endpoint; + + /** + * Create a middleware wrapper function + * + * @param string $region + * @param EndpointProvider $endpointProvider + * @param array $options + * + * @return callable + */ + public static function wrap($region, $endpointProvider, array $options) + { + return function (callable $handler) use ($region, $endpointProvider, $options) { + return new self($handler, $region, $options, $endpointProvider); + }; + } + + public function __construct( + callable $nextHandler, + $region, + array $options, + $endpointProvider = null + ) { + $this->pathStyleByDefault = isset($options['path_style']) + ? (bool) $options['path_style'] : false; + $this->dualStackByDefault = isset($options['dual_stack']) + ? (bool) $options['dual_stack'] : false; + $this->accelerateByDefault = isset($options['accelerate']) + ? (bool) $options['accelerate'] : false; + $this->region = (string) $region; + $this->endpoint = isset($options['endpoint']) + ? $options['endpoint'] : ""; + $this->endpointProvider = is_null($endpointProvider) + ? PartitionEndpointProvider::defaultProvider() + : $endpointProvider; + $this->nextHandler = $nextHandler; + } + + public function __invoke(CommandInterface $command, RequestInterface $request) + { + if (!empty($this->endpoint)) { + $request = $this->applyEndpoint($command, $request); + } else { + switch ($this->endpointPatternDecider($command, $request)) { + case self::HOST_STYLE: + $request = $this->applyHostStyleEndpoint($command, $request); + break; + case self::NO_PATTERN: + break; + case self::PATH_STYLE: + $request = $this->applyPathStyleEndpointCustomizations($command, $request); + break; + case self::DUALSTACK: + $request = $this->applyDualStackEndpoint($command, $request); + break; + case self::ACCELERATE: + $request = $this->applyAccelerateEndpoint( + $command, + $request, + 's3-accelerate' + ); + break; + case self::ACCELERATE_DUALSTACK: + $request = $this->applyAccelerateEndpoint( + $command, + $request, + 's3-accelerate.dualstack' + ); + break; + } + } + $nextHandler = $this->nextHandler; + return $nextHandler($command, $request); + } + + private static function isRequestHostStyleCompatible( + CommandInterface $command, + RequestInterface $request + ) { + return S3Client::isBucketDnsCompatible($command['Bucket']) + && ( + $request->getUri()->getScheme() === 'http' + || strpos($command['Bucket'], '.') === false + ) + && filter_var($request->getUri()->getHost(), FILTER_VALIDATE_IP) === false; + } + + private function endpointPatternDecider( + CommandInterface $command, + RequestInterface $request + ) { + $accelerate = isset($command['@use_accelerate_endpoint']) + ? $command['@use_accelerate_endpoint'] : $this->accelerateByDefault; + $dualStack = isset($command['@use_dual_stack_endpoint']) + ? $command['@use_dual_stack_endpoint'] : $this->dualStackByDefault; + $pathStyle = isset($command['@use_path_style_endpoint']) + ? $command['@use_path_style_endpoint'] : $this->pathStyleByDefault; + + if ($accelerate && $dualStack) { + // When try to enable both for operations excluded from s3-accelerate, + // only dualstack endpoints will be enabled. + return $this->canAccelerate($command) + ? self::ACCELERATE_DUALSTACK + : self::DUALSTACK; + } + + if ($accelerate && $this->canAccelerate($command)) { + return self::ACCELERATE; + } + + if ($dualStack) { + return self::DUALSTACK; + } + + if (!$pathStyle + && self::isRequestHostStyleCompatible($command, $request) + ) { + return self::HOST_STYLE; + } + + return self::PATH_STYLE; + } + + private function canAccelerate(CommandInterface $command) + { + return empty(self::$exclusions[$command->getName()]) + && S3Client::isBucketDnsCompatible($command['Bucket']); + } + + private function getBucketStyleHost(CommandInterface $command, $host) + { + // For operations on the base host (e.g. ListBuckets) + if (!isset($command['Bucket'])) { + return $host; + } + + return "{$command['Bucket']}.{$host}"; + } + + private function applyHostStyleEndpoint( + CommandInterface $command, + RequestInterface $request + ) { + $uri = $request->getUri(); + $request = $request->withUri( + $uri->withHost($this->getBucketStyleHost( + $command, + $uri->getHost() + )) + ->withPath($this->getBucketlessPath( + $uri->getPath(), + $command + )) + ); + return $request; + } + + private function applyPathStyleEndpointCustomizations( + CommandInterface $command, + RequestInterface $request + ) { + if ($command->getName() == 'WriteGetObjectResponse') { + $dnsSuffix = $this->endpointProvider + ->getPartition($this->region, 's3') + ->getDnsSuffix(); + $fips = \Aws\is_fips_pseudo_region($this->region) ? "-fips" : ""; + $region = \Aws\strip_fips_pseudo_regions($this->region); + $host = + "{$command['RequestRoute']}.s3-object-lambda{$fips}.{$region}.{$dnsSuffix}"; + + $uri = $request->getUri(); + $request = $request->withUri( + $uri->withHost($host) + ->withPath($this->getBucketlessPath( + $uri->getPath(), + $command + )) + ); + } + return $request; + } + + + private function applyDualStackEndpoint( + CommandInterface $command, + RequestInterface $request + ) { + $request = $request->withUri( + $request->getUri()->withHost($this->getDualStackHost()) + ); + + if (empty($command['@use_path_style_endpoint']) + && !$this->pathStyleByDefault + && self::isRequestHostStyleCompatible($command, $request) + ) { + $request = $this->applyHostStyleEndpoint($command, $request); + } + return $request; + } + + private function getDualStackHost() + { + $dnsSuffix = $this->endpointProvider + ->getPartition($this->region, 's3') + ->getDnsSuffix(); + return "s3.dualstack.{$this->region}.{$dnsSuffix}"; + } + + private function applyAccelerateEndpoint( + CommandInterface $command, + RequestInterface $request, + $pattern + ) { + $request = $request->withUri( + $request->getUri() + ->withHost($this->getAccelerateHost($command, $pattern)) + ->withPath($this->getBucketlessPath( + $request->getUri()->getPath(), + $command + )) + ); + return $request; + } + + private function getAccelerateHost(CommandInterface $command, $pattern) + { + $dnsSuffix = $this->endpointProvider + ->getPartition($this->region, 's3') + ->getDnsSuffix(); + return "{$command['Bucket']}.{$pattern}.{$dnsSuffix}"; + } + + private function getBucketlessPath($path, CommandInterface $command) + { + $pattern = '/^\\/' . preg_quote($command['Bucket'], '/') . '/'; + $path = preg_replace($pattern, '', $path) ?: '/'; + if (substr($path, 0 , 1) !== '/') { + $path = '/' . $path; + } + return $path; + } + + private function applyEndpoint( + CommandInterface $command, + RequestInterface $request + ) { + $dualStack = isset($command['@use_dual_stack_endpoint']) + ? $command['@use_dual_stack_endpoint'] : $this->dualStackByDefault; + if (ArnParser::isArn($command['Bucket'])) { + $arn = ArnParser::parse($command['Bucket']); + $outpost = $arn->getService() == 's3-outposts'; + if ($outpost && $dualStack) { + throw new InvalidArgumentException("Outposts + dualstack is not supported"); + } + if ($arn instanceof ObjectLambdaAccessPointArn) { + return $request; + } + } + if ($dualStack) { + throw new InvalidArgumentException("Custom Endpoint + Dualstack not supported"); + } + if ($command->getName() == 'WriteGetObjectResponse') { + $host = "{$command['RequestRoute']}.{$this->endpoint}"; + $uri = $request->getUri(); + return $request = $request->withUri( + $uri->withHost($host) + ->withPath($this->getBucketlessPath( + $uri->getPath(), + $command + )) + ); + } + $host = ($this->pathStyleByDefault) ? + $this->endpoint : + $this->getBucketStyleHost( + $command, + $this->endpoint + ); + $uri = $request->getUri(); + $scheme = $uri->getScheme(); + if(empty($scheme)){ + $request = $request->withUri( + $uri->withHost($host) + ); + } else { + $request = $request->withUri($uri); + } + + return $request; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/S3MultiRegionClient.php b/vendor/aws/aws-sdk-php/src/S3/S3MultiRegionClient.php new file mode 100644 index 0000000..3a688a1 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/S3MultiRegionClient.php @@ -0,0 +1,384 @@ + function (array &$args) { + $availableRegions = array_keys($args['partition']['regions']); + return end($availableRegions); + }]; + unset($args['region']); + + return $args + [ + 'bucket_region_cache' => [ + 'type' => 'config', + 'valid' => [CacheInterface::class], + 'doc' => 'Cache of regions in which given buckets are located.', + 'default' => function () { return new LruArrayCache; }, + ], + 'region' => $regionDef, + ]; + } + + public function __construct(array $args) + { + parent::__construct($args); + $this->cache = $this->getConfig('bucket_region_cache'); + + $this->getHandlerList()->prependInit( + $this->determineRegionMiddleware(), + 'determine_region' + ); + } + + private function determineRegionMiddleware() + { + return function (callable $handler) { + return function (CommandInterface $command) use ($handler) { + $cacheKey = $this->getCacheKey($command['Bucket']); + if ( + empty($command['@region']) && + $region = $this->cache->get($cacheKey) + ) { + $command['@region'] = $region; + } + + return Promise\Coroutine::of(function () use ( + $handler, + $command, + $cacheKey + ) { + try { + yield $handler($command); + } catch (PermanentRedirectException $e) { + if (empty($command['Bucket'])) { + throw $e; + } + $result = $e->getResult(); + $region = null; + if (isset($result['@metadata']['headers']['x-amz-bucket-region'])) { + $region = $result['@metadata']['headers']['x-amz-bucket-region']; + $this->cache->set($cacheKey, $region); + } else { + $region = (yield $this->determineBucketRegionAsync( + $command['Bucket'] + )); + } + + $command['@region'] = $region; + yield $handler($command); + } catch (AwsException $e) { + if ($e->getAwsErrorCode() === 'AuthorizationHeaderMalformed') { + $region = $this->determineBucketRegionFromExceptionBody( + $e->getResponse() + ); + if (!empty($region)) { + $this->cache->set($cacheKey, $region); + + $command['@region'] = $region; + yield $handler($command); + } else { + throw $e; + } + } else { + throw $e; + } + } + }); + }; + }; + } + + public function createPresignedRequest(CommandInterface $command, $expires, array $options = []) + { + if (empty($command['Bucket'])) { + throw new \InvalidArgumentException('The S3\\MultiRegionClient' + . ' cannot create presigned requests for commands without a' + . ' specified bucket.'); + } + + /** @var S3ClientInterface $client */ + $client = $this->getClientFromPool( + $this->determineBucketRegion($command['Bucket']) + ); + return $client->createPresignedRequest( + $client->getCommand($command->getName(), $command->toArray()), + $expires, + $options + ); + } + + public function getObjectUrl($bucket, $key) + { + /** @var S3Client $regionalClient */ + $regionalClient = $this->getClientFromPool( + $this->determineBucketRegion($bucket) + ); + + return $regionalClient->getObjectUrl($bucket, $key); + } + + public function determineBucketRegionAsync($bucketName) + { + $cacheKey = $this->getCacheKey($bucketName); + if ($cached = $this->cache->get($cacheKey)) { + return Promise\Create::promiseFor($cached); + } + + /** @var S3ClientInterface $regionalClient */ + $regionalClient = $this->getClientFromPool(); + return $regionalClient->determineBucketRegionAsync($bucketName) + ->then( + function ($region) use ($cacheKey) { + $this->cache->set($cacheKey, $region); + + return $region; + } + ); + } + + private function getCacheKey($bucketName) + { + return "aws:s3:{$bucketName}:location"; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/S3UriParser.php b/vendor/aws/aws-sdk-php/src/S3/S3UriParser.php new file mode 100644 index 0000000..508bff1 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/S3UriParser.php @@ -0,0 +1,163 @@ + true, + 'bucket' => null, + 'key' => null, + 'region' => null + ]; + + /** + * Parses a URL or S3 StreamWrapper Uri (s3://) into an associative array + * of Amazon S3 data including: + * + * - bucket: The Amazon S3 bucket (null if none) + * - key: The Amazon S3 key (null if none) + * - path_style: Set to true if using path style, or false if not + * - region: Set to a string if a non-class endpoint is used or null. + * + * @param string|UriInterface $uri + * + * @return array + * @throws \InvalidArgumentException|InvalidArnException + */ + public function parse($uri) + { + // Attempt to parse host component of uri as an ARN + $components = $this->parseS3UrlComponents($uri); + if (!empty($components)) { + if (ArnParser::isArn($components['host'])) { + $arn = new AccessPointArn($components['host']); + return [ + 'bucket' => $components['host'], + 'key' => $components['path'], + 'path_style' => false, + 'region' => $arn->getRegion() + ]; + } + } + + $url = Psr7\Utils::uriFor($uri); + + if ($url->getScheme() == $this->streamWrapperScheme) { + return $this->parseStreamWrapper($url); + } + + if (!$url->getHost()) { + throw new \InvalidArgumentException('No hostname found in URI: ' + . $uri); + } + + if (!preg_match($this->pattern, $url->getHost(), $matches)) { + return $this->parseCustomEndpoint($url); + } + + // Parse the URI based on the matched format (path / virtual) + $result = empty($matches[1]) + ? $this->parsePathStyle($url) + : $this->parseVirtualHosted($url, $matches); + + // Add the region if one was found and not the classic endpoint + $result['region'] = $matches[2] == 'amazonaws' ? null : $matches[2]; + + return $result; + } + + private function parseS3UrlComponents($uri) + { + preg_match("/^([a-zA-Z0-9]*):\/\/([a-zA-Z0-9:-]*)\/(.*)/", $uri, $components); + if (empty($components)) { + return []; + } + return [ + 'scheme' => $components[1], + 'host' => $components[2], + 'path' => $components[3], + ]; + } + + private function parseStreamWrapper(UriInterface $url) + { + $result = self::$defaultResult; + $result['path_style'] = false; + + $result['bucket'] = $url->getHost(); + if ($url->getPath()) { + $key = ltrim($url->getPath(), '/ '); + if (!empty($key)) { + $result['key'] = $key; + } + } + + return $result; + } + + private function parseCustomEndpoint(UriInterface $url) + { + $result = self::$defaultResult; + $path = ltrim($url->getPath(), '/ '); + $segments = explode('/', $path, 2); + + if (isset($segments[0])) { + $result['bucket'] = $segments[0]; + if (isset($segments[1])) { + $result['key'] = $segments[1]; + } + } + + return $result; + } + + private function parsePathStyle(UriInterface $url) + { + $result = self::$defaultResult; + + if ($url->getPath() != '/') { + $path = ltrim($url->getPath(), '/'); + if ($path) { + $pathPos = strpos($path, '/'); + if ($pathPos === false) { + // https://s3.amazonaws.com/bucket + $result['bucket'] = $path; + } elseif ($pathPos == strlen($path) - 1) { + // https://s3.amazonaws.com/bucket/ + $result['bucket'] = substr($path, 0, -1); + } else { + // https://s3.amazonaws.com/bucket/key + $result['bucket'] = substr($path, 0, $pathPos); + $result['key'] = substr($path, $pathPos + 1) ?: null; + } + } + } + + return $result; + } + + private function parseVirtualHosted(UriInterface $url, array $matches) + { + $result = self::$defaultResult; + $result['path_style'] = false; + // Remove trailing "." from the prefix to get the bucket + $result['bucket'] = substr($matches[1], 0, -1); + $path = $url->getPath(); + // Check if a key was present, and if so, removing the leading "/" + $result['key'] = !$path || $path == '/' ? null : substr($path, 1); + + return $result; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/SSECMiddleware.php b/vendor/aws/aws-sdk-php/src/S3/SSECMiddleware.php new file mode 100644 index 0000000..628ddef --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/SSECMiddleware.php @@ -0,0 +1,75 @@ +nextHandler = $nextHandler; + $this->endpointScheme = $endpointScheme; + } + + public function __invoke( + CommandInterface $command, + ?RequestInterface $request = null + ) { + // Allows only HTTPS connections when using SSE-C + if (($command['SSECustomerKey'] || $command['CopySourceSSECustomerKey']) + && $this->endpointScheme !== 'https' + ) { + throw new \RuntimeException('You must configure your S3 client to ' + . 'use HTTPS in order to use the SSE-C features.'); + } + + // Prepare the normal SSE-CPK headers + if ($command['SSECustomerKey']) { + $this->prepareSseParams($command); + } + + // If it's a copy operation, prepare the SSE-CPK headers for the source. + if ($command['CopySourceSSECustomerKey']) { + $this->prepareSseParams($command, 'CopySource'); + } + + $f = $this->nextHandler; + return $f($command, $request); + } + + private function prepareSseParams(CommandInterface $command, $prefix = '') + { + // Base64 encode the provided key + $key = $command[$prefix . 'SSECustomerKey']; + $command[$prefix . 'SSECustomerKey'] = base64_encode($key); + + // Base64 the provided MD5 or, generate an MD5 if not provided + if ($md5 = $command[$prefix . 'SSECustomerKeyMD5']) { + $command[$prefix . 'SSECustomerKeyMD5'] = base64_encode($md5); + } else { + $command[$prefix . 'SSECustomerKeyMD5'] = base64_encode(md5($key, true)); + } + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php b/vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php new file mode 100644 index 0000000..af7d229 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/StreamWrapper.php @@ -0,0 +1,1005 @@ +/" files with PHP + * streams, supporting "r", "w", "a", "x". + * + * # Opening "r" (read only) streams: + * + * Read only streams are truly streaming by default and will not allow you to + * seek. This is because data read from the stream is not kept in memory or on + * the local filesystem. You can force a "r" stream to be seekable by setting + * the "seekable" stream context option true. This will allow true streaming of + * data from Amazon S3, but will maintain a buffer of previously read bytes in + * a 'php://temp' stream to allow seeking to previously read bytes from the + * stream. + * + * You may pass any GetObject parameters as 's3' stream context options. These + * options will affect how the data is downloaded from Amazon S3. + * + * # Opening "w" and "x" (write only) streams: + * + * Because Amazon S3 requires a Content-Length header, write only streams will + * maintain a 'php://temp' stream to buffer data written to the stream until + * the stream is flushed (usually by closing the stream with fclose). + * + * You may pass any PutObject parameters as 's3' stream context options. These + * options will affect how the data is uploaded to Amazon S3. + * + * When opening an "x" stream, the file must exist on Amazon S3 for the stream + * to open successfully. + * + * # Opening "a" (write only append) streams: + * + * Similar to "w" streams, opening append streams requires that the data be + * buffered in a "php://temp" stream. Append streams will attempt to download + * the contents of an object in Amazon S3, seek to the end of the object, then + * allow you to append to the contents of the object. The data will then be + * uploaded using a PutObject operation when the stream is flushed (usually + * with fclose). + * + * You may pass any GetObject and/or PutObject parameters as 's3' stream + * context options. These options will affect how the data is downloaded and + * uploaded from Amazon S3. + * + * Stream context options: + * + * - "seekable": Set to true to create a seekable "r" (read only) stream by + * using a php://temp stream buffer + * - For "unlink" only: Any option that can be passed to the DeleteObject + * operation + */ +class StreamWrapper +{ + /** @var resource|null Stream context (this is set by PHP) */ + public $context; + + /** @var StreamInterface Underlying stream resource */ + private $body; + + /** @var int Size of the body that is opened */ + private $size; + + /** @var array Hash of opened stream parameters */ + private $params = []; + + /** @var string Mode in which the stream was opened */ + private $mode; + + /** @var \Iterator Iterator used with opendir() related calls */ + private $objectIterator; + + /** @var string The bucket that was opened when opendir() was called */ + private $openedBucket; + + /** @var string The prefix of the bucket that was opened with opendir() */ + private $openedBucketPrefix; + + /** @var string Opened bucket path */ + private $openedPath; + + /** @var CacheInterface Cache for object and dir lookups */ + private $cache; + + /** @var string The opened protocol (e.g., "s3") */ + private $protocol = 's3'; + + /** @var bool Keeps track of whether stream has been flushed since opening */ + private $isFlushed = false; + + /** @var bool Whether or not to use V2 bucket and object existence methods */ + private static $useV2Existence = false; + + /** + * Register the 's3://' stream wrapper + * + * @param S3ClientInterface $client Client to use with the stream wrapper + * @param string $protocol Protocol to register as. + * @param CacheInterface $cache Default cache for the protocol. + */ + public static function register( + S3ClientInterface $client, + $protocol = 's3', + ?CacheInterface $cache = null, + $v2Existence = false + ) { + self::$useV2Existence = $v2Existence; + if (in_array($protocol, stream_get_wrappers())) { + stream_wrapper_unregister($protocol); + } + + // Set the client passed in as the default stream context client + stream_wrapper_register($protocol, get_called_class(), STREAM_IS_URL); + $default = stream_context_get_options(stream_context_get_default()); + $default[$protocol]['client'] = $client; + + if ($cache) { + $default[$protocol]['cache'] = $cache; + } elseif (!isset($default[$protocol]['cache'])) { + // Set a default cache adapter. + $default[$protocol]['cache'] = new LruArrayCache(); + } + + stream_context_set_default($default); + } + + public function stream_close() + { + if (!$this->isFlushed + && empty($this->body->getSize()) + && $this->mode !== 'r' + ) { + $this->stream_flush(); + } + $this->body = $this->cache = null; + } + + public function stream_open($path, $mode, $options, &$opened_path) + { + $this->initProtocol($path); + $this->isFlushed = false; + $this->params = $this->getBucketKey($path); + $this->mode = rtrim($mode, 'bt'); + + if ($errors = $this->validate($path, $this->mode)) { + return $this->triggerError($errors); + } + + return $this->boolCall(function() { + switch ($this->mode) { + case 'r': return $this->openReadStream(); + case 'a': return $this->openAppendStream(); + default: return $this->openWriteStream(); + } + }); + } + + public function stream_eof() + { + return $this->body->eof(); + } + + public function stream_flush() + { + // Check if stream body size has been + // calculated via a flush or close + if($this->body->getSize() === null && $this->mode !== 'r') { + return $this->triggerError( + "Unable to determine stream size. Did you forget to close or flush the stream?" + ); + } + + $this->isFlushed = true; + if ($this->mode == 'r') { + return false; + } + + if ($this->body->isSeekable()) { + $this->body->seek(0); + } + $params = $this->getOptions(true); + $params['Body'] = $this->body; + + // Attempt to guess the ContentType of the upload based on the + // file extension of the key + if (!isset($params['ContentType']) && + ($type = Psr7\MimeType::fromFilename($params['Key'])) + ) { + $params['ContentType'] = $type; + } + + $this->clearCacheKey("{$this->protocol}://{$params['Bucket']}/{$params['Key']}"); + return $this->boolCall(function () use ($params) { + return (bool) $this->getClient()->putObject($params); + }); + } + + public function stream_read($count) + { + return $this->body->read($count); + } + + public function stream_seek($offset, $whence = SEEK_SET) + { + return !$this->body->isSeekable() + ? false + : $this->boolCall(function () use ($offset, $whence) { + $this->body->seek($offset, $whence); + return true; + }); + } + + public function stream_tell() + { + return $this->boolCall(function() { return $this->body->tell(); }); + } + + public function stream_write($data) + { + return $this->body->write($data); + } + + public function unlink($path) + { + $this->initProtocol($path); + + return $this->boolCall(function () use ($path) { + $this->clearCacheKey($path); + $this->getClient()->deleteObject($this->withPath($path)); + return true; + }); + } + + public function stream_stat() + { + $stat = $this->getStatTemplate(); + $stat[7] = $stat['size'] = $this->getSize(); + $stat[2] = $stat['mode'] = $this->mode; + + return $stat; + } + + /** + * Provides information for is_dir, is_file, filesize, etc. Works on + * buckets, keys, and prefixes. + * @link http://www.php.net/manual/en/streamwrapper.url-stat.php + */ + public function url_stat($path, $flags) + { + $this->initProtocol($path); + + // Some paths come through as S3:// for some reason. + $split = explode('://', $path, 2); + $path = strtolower($split[0]) . '://' . $split[1]; + + // Check if this path is in the url_stat cache + if ($value = $this->getCacheStorage()->get($path)) { + return $value; + } + + $stat = $this->createStat($path, $flags); + + if (is_array($stat)) { + $this->getCacheStorage()->set($path, $stat); + } + + return $stat; + } + + /** + * Parse the protocol out of the given path. + * + * @param $path + */ + private function initProtocol($path) + { + $parts = explode('://', $path, 2); + $this->protocol = $parts[0] ?: 's3'; + } + + private function createStat($path, $flags) + { + $this->initProtocol($path); + $parts = $this->withPath($path); + + if (!$parts['Key']) { + return $this->statDirectory($parts, $path, $flags); + } + + return $this->boolCall(function () use ($parts, $path) { + try { + $result = $this->getClient()->headObject($parts); + if (substr($parts['Key'], -1, 1) == '/' && + $result['ContentLength'] == 0 + ) { + // Return as if it is a bucket to account for console + // bucket objects (e.g., zero-byte object "foo/") + return $this->formatUrlStat($path); + } + + // Attempt to stat and cache regular object + return $this->formatUrlStat($result->toArray()); + } catch (S3Exception $e) { + // Maybe this isn't an actual key, but a prefix. Do a prefix + // listing of objects to determine. + $result = $this->getClient()->listObjects([ + 'Bucket' => $parts['Bucket'], + 'Prefix' => rtrim($parts['Key'], '/') . '/', + 'MaxKeys' => 1 + ]); + if (!$result['Contents'] && !$result['CommonPrefixes']) { + throw new \Exception("File or directory not found: $path"); + } + return $this->formatUrlStat($path); + } + }, $flags); + } + + private function statDirectory($parts, $path, $flags) + { + // Stat "directories": buckets, or "s3://" + $method = self::$useV2Existence ? 'doesBucketExistV2' : 'doesBucketExist'; + + if (!$parts['Bucket'] || + $this->getClient()->$method($parts['Bucket']) + ) { + return $this->formatUrlStat($path); + } + + return $this->triggerError("File or directory not found: $path", $flags); + } + + /** + * Support for mkdir(). + * + * @param string $path Directory which should be created. + * @param int $mode Permissions. 700-range permissions map to + * ACL_PUBLIC. 600-range permissions map to + * ACL_AUTH_READ. All other permissions map to + * ACL_PRIVATE. Expects octal form. + * @param int $options A bitwise mask of values, such as + * STREAM_MKDIR_RECURSIVE. + * + * @return bool + * @link http://www.php.net/manual/en/streamwrapper.mkdir.php + */ + public function mkdir($path, $mode, $options) + { + $this->initProtocol($path); + $params = $this->withPath($path); + $this->clearCacheKey($path); + if (!$params['Bucket']) { + return false; + } + + if (!isset($params['ACL'])) { + $params['ACL'] = $this->determineAcl($mode); + } + + return empty($params['Key']) + ? $this->createBucket($path, $params) + : $this->createSubfolder($path, $params); + } + + public function rmdir($path, $options) + { + $this->initProtocol($path); + $this->clearCacheKey($path); + $params = $this->withPath($path); + $client = $this->getClient(); + + if (!$params['Bucket']) { + return $this->triggerError('You must specify a bucket'); + } + + return $this->boolCall(function () use ($params, $path, $client) { + if (!$params['Key']) { + $client->deleteBucket(['Bucket' => $params['Bucket']]); + return true; + } + return $this->deleteSubfolder($path, $params); + }); + } + + /** + * Support for opendir(). + * + * The opendir() method of the Amazon S3 stream wrapper supports a stream + * context option of "listFilter". listFilter must be a callable that + * accepts an associative array of object data and returns true if the + * object should be yielded when iterating the keys in a bucket. + * + * @param string $path The path to the directory + * (e.g. "s3://dir[]") + * @param string $options Unused option variable + * + * @return bool true on success + * @see http://www.php.net/manual/en/function.opendir.php + */ + public function dir_opendir($path, $options) + { + $this->initProtocol($path); + $this->openedPath = $path; + $params = $this->withPath($path); + $delimiter = $this->getOption('delimiter'); + /** @var callable $filterFn */ + $filterFn = $this->getOption('listFilter'); + $op = ['Bucket' => $params['Bucket']]; + $this->openedBucket = $params['Bucket']; + + if ($delimiter === null) { + $delimiter = '/'; + } + + if ($delimiter) { + $op['Delimiter'] = $delimiter; + } + + if ($params['Key']) { + $params['Key'] = rtrim($params['Key'], $delimiter) . $delimiter; + $op['Prefix'] = $params['Key']; + } + + $this->openedBucketPrefix = $params['Key']; + + // Filter our "/" keys added by the console as directories, and ensure + // that if a filter function is provided that it passes the filter. + $this->objectIterator = \Aws\flatmap( + $this->getClient()->getPaginator('ListObjects', $op), + function (Result $result) use ($filterFn) { + $contentsAndPrefixes = $result->search('[Contents[], CommonPrefixes[]][]'); + // Filter out dir place holder keys and use the filter fn. + return array_filter( + $contentsAndPrefixes, + function ($key) use ($filterFn) { + return (!$filterFn || call_user_func($filterFn, $key)) + && (!isset($key['Key']) || substr($key['Key'], -1, 1) !== '/'); + } + ); + } + ); + + return true; + } + + /** + * Close the directory listing handles + * + * @return bool true on success + */ + public function dir_closedir() + { + $this->objectIterator = null; + gc_collect_cycles(); + + return true; + } + + /** + * This method is called in response to rewinddir() + * + * @return boolean true on success + */ + public function dir_rewinddir() + { + return $this->boolCall(function() { + $this->objectIterator = null; + $this->dir_opendir($this->openedPath, null); + return true; + }); + } + + /** + * This method is called in response to readdir() + * + * @return string Should return a string representing the next filename, or + * false if there is no next file. + * @link http://www.php.net/manual/en/function.readdir.php + */ + public function dir_readdir() + { + // Skip empty result keys + if (!$this->objectIterator->valid()) { + return false; + } + + // First we need to create a cache key. This key is the full path to + // then object in s3: protocol://bucket/key. + // Next we need to create a result value. The result value is the + // current value of the iterator without the opened bucket prefix to + // emulate how readdir() works on directories. + // The cache key and result value will depend on if this is a prefix + // or a key. + $cur = $this->objectIterator->current(); + if (isset($cur['Prefix'])) { + // Include "directories". Be sure to strip a trailing "/" + // on prefixes. + $result = rtrim($cur['Prefix'], '/'); + $key = $this->formatKey($result); + $stat = $this->formatUrlStat($key); + } else { + $result = $cur['Key']; + $key = $this->formatKey($cur['Key']); + $stat = $this->formatUrlStat($cur); + } + + // Cache the object data for quick url_stat lookups used with + // RecursiveDirectoryIterator. + $this->getCacheStorage()->set($key, $stat); + $this->objectIterator->next(); + + // Remove the prefix from the result to emulate other stream wrappers. + return $this->openedBucketPrefix + ? substr($result, strlen($this->openedBucketPrefix)) + : $result; + } + + private function formatKey($key) + { + $protocol = explode('://', $this->openedPath)[0]; + return "{$protocol}://{$this->openedBucket}/{$key}"; + } + + /** + * Called in response to rename() to rename a file or directory. Currently + * only supports renaming objects. + * + * @param string $path_from the path to the file to rename + * @param string $path_to the new path to the file + * + * @return bool true if file was successfully renamed + * @link http://www.php.net/manual/en/function.rename.php + */ + public function rename($path_from, $path_to) + { + // PHP will not allow rename across wrapper types, so we can safely + // assume $path_from and $path_to have the same protocol + $this->initProtocol($path_from); + $partsFrom = $this->withPath($path_from); + $partsTo = $this->withPath($path_to); + $this->clearCacheKey($path_from); + $this->clearCacheKey($path_to); + + if (!$partsFrom['Key'] || !$partsTo['Key']) { + return $this->triggerError('The Amazon S3 stream wrapper only ' + . 'supports copying objects'); + } + + return $this->boolCall(function () use ($partsFrom, $partsTo) { + $options = $this->getOptions(true); + // Copy the object and allow overriding default parameters if + // desired, but by default copy metadata + $this->getClient()->copy( + $partsFrom['Bucket'], + $partsFrom['Key'], + $partsTo['Bucket'], + $partsTo['Key'], + isset($options['acl']) ? $options['acl'] : 'private', + $options + ); + // Delete the original object + $this->getClient()->deleteObject([ + 'Bucket' => $partsFrom['Bucket'], + 'Key' => $partsFrom['Key'] + ] + $options); + return true; + }); + } + + public function stream_cast($cast_as) + { + return false; + } + + public function stream_set_option($option, $arg1, $arg2) + { + return false; + } + + public function stream_metadata($path, $option, $value) + { + return false; + } + + public function stream_lock($operation) + { + trigger_error( + 'stream_lock() is not supported by the Amazon S3 stream wrapper', + E_USER_WARNING + ); + return false; + } + + public function stream_truncate($new_size) + { + return false; + } + + /** + * Validates the provided stream arguments for fopen and returns an array + * of errors. + */ + private function validate($path, $mode) + { + $errors = []; + + if (!$this->getOption('Key')) { + $errors[] = 'Cannot open a bucket. You must specify a path in the ' + . 'form of s3://bucket/key'; + } + + if (!in_array($mode, ['r', 'w', 'a', 'x'])) { + $errors[] = "Mode not supported: {$mode}. " + . "Use one 'r', 'w', 'a', or 'x'."; + } + + if ($mode === 'x') { + $method = self::$useV2Existence ? 'doesObjectExistV2' : 'doesObjectExist'; + + if ($this->getClient()->$method( + $this->getOption('Bucket'), + $this->getOption('Key'), + $this->getOptions(true) + )) { + $errors[] = "{$path} already exists on Amazon S3"; + } + } + + return $errors; + } + + /** + * Get the stream context options available to the current stream + * + * @param bool $removeContextData Set to true to remove contextual kvp's + * like 'client' from the result. + * + * @return array + */ + private function getOptions($removeContextData = false) + { + // Context is not set when doing things like stat + if ($this->context === null) { + $options = []; + } else { + $options = stream_context_get_options($this->context); + $options = isset($options[$this->protocol]) + ? $options[$this->protocol] + : []; + } + + $default = stream_context_get_options(stream_context_get_default()); + $default = isset($default[$this->protocol]) + ? $default[$this->protocol] + : []; + $result = $this->params + $options + $default; + + if ($removeContextData) { + unset($result['client'], $result['seekable'], $result['cache']); + } + + return $result; + } + + /** + * Get a specific stream context option + * + * @param string $name Name of the option to retrieve + * + * @return mixed|null + */ + private function getOption($name) + { + $options = $this->getOptions(); + + return isset($options[$name]) ? $options[$name] : null; + } + + /** + * Gets the client from the stream context + * + * @return S3ClientInterface + * @throws \RuntimeException if no client has been configured + */ + private function getClient() + { + if (!$client = $this->getOption('client')) { + throw new \RuntimeException('No client in stream context'); + } + + return $client; + } + + private function getBucketKey($path) + { + // Remove the protocol + $parts = explode('://', $path, 2); + // Get the bucket, key + $parts = explode('/', $parts[1], 2); + + return [ + 'Bucket' => $parts[0], + 'Key' => isset($parts[1]) ? $parts[1] : null + ]; + } + + /** + * Get the bucket and key from the passed path (e.g. s3://bucket/key) + * + * @param string $path Path passed to the stream wrapper + * + * @return array Hash of 'Bucket', 'Key', and custom params from the context + */ + private function withPath($path) + { + $params = $this->getOptions(true); + + return $this->getBucketKey($path) + $params; + } + + private function openReadStream() + { + $client = $this->getClient(); + $command = $client->getCommand('GetObject', $this->getOptions(true)); + $command['@http']['stream'] = true; + $result = $client->execute($command); + $this->size = $result['ContentLength']; + $this->body = $result['Body']; + + // Wrap the body in a caching entity body if seeking is allowed + if ($this->getOption('seekable') && !$this->body->isSeekable()) { + $this->body = new CachingStream($this->body); + } + + return true; + } + + private function openWriteStream() + { + $this->body = new Stream(fopen('php://temp', 'r+')); + return true; + } + + private function openAppendStream() + { + try { + // Get the body of the object and seek to the end of the stream + $client = $this->getClient(); + $this->body = $client->getObject($this->getOptions(true))['Body']; + $this->body->seek(0, SEEK_END); + return true; + } catch (S3Exception $e) { + // The object does not exist, so use a simple write stream + return $this->openWriteStream(); + } + } + + /** + * Trigger one or more errors + * + * @param string|array $errors Errors to trigger + * @param mixed $flags If set to STREAM_URL_STAT_QUIET, then no + * error or exception occurs + * + * @return bool Returns false + * @throws \RuntimeException if throw_errors is true + */ + private function triggerError($errors, $flags = null) + { + // This is triggered with things like file_exists() + if ($flags & STREAM_URL_STAT_QUIET) { + return $flags & STREAM_URL_STAT_LINK + // This is triggered for things like is_link() + ? $this->formatUrlStat(false) + : false; + } + + // This is triggered when doing things like lstat() or stat() + trigger_error(implode("\n", (array) $errors), E_USER_WARNING); + + return false; + } + + /** + * Prepare a url_stat result array + * + * @param string|array $result Data to add + * + * @return array Returns the modified url_stat result + */ + private function formatUrlStat($result = null) + { + $stat = $this->getStatTemplate(); + switch (gettype($result)) { + case 'NULL': + case 'string': + // Directory with 0777 access - see "man 2 stat". + $stat['mode'] = $stat[2] = 0040777; + break; + case 'array': + // Regular file with 0777 access - see "man 2 stat". + $stat['mode'] = $stat[2] = 0100777; + // Pluck the content-length if available. + if (isset($result['ContentLength'])) { + $stat['size'] = $stat[7] = $result['ContentLength']; + } elseif (isset($result['Size'])) { + $stat['size'] = $stat[7] = $result['Size']; + } + if (isset($result['LastModified'])) { + // ListObjects or HeadObject result + $stat['mtime'] = $stat[9] = $stat['ctime'] = $stat[10] + = strtotime($result['LastModified']); + } + } + + return $stat; + } + + /** + * Creates a bucket for the given parameters. + * + * @param string $path Stream wrapper path + * @param array $params A result of StreamWrapper::withPath() + * + * @return bool Returns true on success or false on failure + */ + private function createBucket($path, array $params) + { + $method = self::$useV2Existence ? 'doesBucketExistV2' : 'doesBucketExist'; + + if ($this->getClient()->$method($params['Bucket'])) { + return $this->triggerError("Bucket already exists: {$path}"); + } + + unset($params['ACL']); + return $this->boolCall(function () use ($params, $path) { + $this->getClient()->createBucket($params); + $this->clearCacheKey($path); + return true; + }); + } + + /** + * Creates a pseudo-folder by creating an empty "/" suffixed key + * + * @param string $path Stream wrapper path + * @param array $params A result of StreamWrapper::withPath() + * + * @return bool + */ + private function createSubfolder($path, array $params) + { + // Ensure the path ends in "/" and the body is empty. + $params['Key'] = rtrim($params['Key'], '/') . '/'; + $params['Body'] = ''; + + // Fail if this pseudo directory key already exists + $method = self::$useV2Existence ? 'doesObjectExistV2' : 'doesObjectExist'; + + if ($this->getClient()->$method( + $params['Bucket'], + $params['Key'] + )) { + return $this->triggerError("Subfolder already exists: {$path}"); + } + + return $this->boolCall(function () use ($params, $path) { + $this->getClient()->putObject($params); + $this->clearCacheKey($path); + return true; + }); + } + + /** + * Deletes a nested subfolder if it is empty. + * + * @param string $path Path that is being deleted (e.g., 's3://a/b/c') + * @param array $params A result of StreamWrapper::withPath() + * + * @return bool + */ + private function deleteSubfolder($path, $params) + { + // Use a key that adds a trailing slash if needed. + $prefix = rtrim($params['Key'], '/') . '/'; + $result = $this->getClient()->listObjects([ + 'Bucket' => $params['Bucket'], + 'Prefix' => $prefix, + 'MaxKeys' => 1 + ]); + + // Check if the bucket contains keys other than the placeholder + if ($contents = $result['Contents']) { + return (count($contents) > 1 || $contents[0]['Key'] != $prefix) + ? $this->triggerError('Subfolder is not empty') + : $this->unlink(rtrim($path, '/') . '/'); + } + + return $result['CommonPrefixes'] + ? $this->triggerError('Subfolder contains nested folders') + : true; + } + + /** + * Determine the most appropriate ACL based on a file mode. + * + * @param int $mode File mode + * + * @return string + */ + private function determineAcl($mode) + { + switch (substr(decoct($mode), 0, 1)) { + case '7': return 'public-read'; + case '6': return 'authenticated-read'; + default: return 'private'; + } + } + + /** + * Gets a URL stat template with default values + * + * @return array + */ + private function getStatTemplate() + { + return [ + 0 => 0, 'dev' => 0, + 1 => 0, 'ino' => 0, + 2 => 0, 'mode' => 0, + 3 => 0, 'nlink' => 0, + 4 => 0, 'uid' => 0, + 5 => 0, 'gid' => 0, + 6 => -1, 'rdev' => -1, + 7 => 0, 'size' => 0, + 8 => 0, 'atime' => 0, + 9 => 0, 'mtime' => 0, + 10 => 0, 'ctime' => 0, + 11 => -1, 'blksize' => -1, + 12 => -1, 'blocks' => -1, + ]; + } + + /** + * Invokes a callable and triggers an error if an exception occurs while + * calling the function. + * + * @param callable $fn + * @param int $flags + * + * @return bool + */ + private function boolCall(callable $fn, $flags = null) + { + try { + return $fn(); + } catch (\Exception $e) { + return $this->triggerError($e->getMessage(), $flags); + } + } + + /** + * @return LruArrayCache + */ + private function getCacheStorage() + { + if (!$this->cache) { + $this->cache = $this->getOption('cache') ?: new LruArrayCache(); + } + + return $this->cache; + } + + /** + * Clears a specific stat cache value from the stat cache and LRU cache. + * + * @param string $key S3 path (s3://bucket/key). + */ + private function clearCacheKey($key) + { + clearstatcache(true, $key); + $this->getCacheStorage()->remove($key); + } + + /** + * Returns the size of the opened object body. + * + * @return int|null + */ + private function getSize() + { + $size = $this->body->getSize(); + + return !empty($size) ? $size : $this->size; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/Transfer.php b/vendor/aws/aws-sdk-php/src/S3/Transfer.php new file mode 100644 index 0000000..7679950 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/Transfer.php @@ -0,0 +1,456 @@ +client = $client; + + // Prepare the destination. + $this->destination = $this->prepareTarget($dest); + if ($this->destination['scheme'] === 's3') { + $this->s3Args = $this->getS3Args($this->destination['path']); + } + + // Prepare the source. + if (is_string($source)) { + $this->sourceMetadata = $this->prepareTarget($source); + $this->source = $source; + } elseif ($source instanceof Iterator) { + if (empty($options['base_dir'])) { + throw new \InvalidArgumentException('You must provide the source' + . ' argument as a string or provide the "base_dir" option.'); + } + + $this->sourceMetadata = $this->prepareTarget($options['base_dir']); + $this->source = $source; + } else { + throw new \InvalidArgumentException('source must be the path to a ' + . 'directory or an iterator that yields file names.'); + } + + // Validate schemes. + if ($this->sourceMetadata['scheme'] === $this->destination['scheme']) { + throw new \InvalidArgumentException("You cannot copy from" + . " {$this->sourceMetadata['scheme']} to" + . " {$this->destination['scheme']}." + ); + } + + // Handle multipart-related options. + $this->concurrency = isset($options['concurrency']) + ? $options['concurrency'] + : MultipartUploader::DEFAULT_CONCURRENCY; + $this->mupThreshold = isset($options['mup_threshold']) + ? $options['mup_threshold'] + : 16777216; + if ($this->mupThreshold < MultipartUploader::PART_MIN_SIZE) { + throw new \InvalidArgumentException('mup_threshold must be >= 5MB'); + } + + // Handle "before" callback option. + if (isset($options['before'])) { + $this->before = $options['before']; + if (!is_callable($this->before)) { + throw new \InvalidArgumentException('before must be a callable.'); + } + } + + // Handle "after" callback option. + if (isset($options['after'])) { + $this->after = $options['after']; + if (!is_callable($this->after)) { + throw new \InvalidArgumentException('after must be a callable.'); + } + } + + // Handle "debug" option. + if (isset($options['debug'])) { + if ($options['debug'] === true) { + $options['debug'] = fopen('php://output', 'w'); + } + if (is_resource($options['debug'])) { + $this->addDebugToBefore($options['debug']); + } + } + + // Handle "add_content_md5" option. + $this->addContentMD5 = isset($options['add_content_md5']) + && $options['add_content_md5'] === true; + MetricsBuilder::appendMetricsCaptureMiddleware( + $this->client->getHandlerList(), + MetricsBuilder::S3_TRANSFER + ); + } + + /** + * Transfers the files. + * + * @return PromiseInterface + */ + public function promise(): PromiseInterface + { + // If the promise has been created, just return it. + if (!$this->promise) { + // Create an upload/download promise for the transfer. + $this->promise = $this->sourceMetadata['scheme'] === 'file' + ? $this->createUploadPromise() + : $this->createDownloadPromise(); + } + + return $this->promise; + } + + /** + * Transfers the files synchronously. + */ + public function transfer() + { + $this->promise()->wait(); + } + + private function prepareTarget($targetPath) + { + $target = [ + 'path' => $this->normalizePath($targetPath), + 'scheme' => $this->determineScheme($targetPath), + ]; + + if ($target['scheme'] !== 's3' && $target['scheme'] !== 'file') { + throw new \InvalidArgumentException('Scheme must be "s3" or "file".'); + } + + return $target; + } + + /** + * Creates an array that contains Bucket and Key by parsing the filename. + * + * @param string $path Path to parse. + * + * @return array + */ + private function getS3Args($path) + { + $parts = explode('/', str_replace('s3://', '', $path), 2); + $args = ['Bucket' => $parts[0]]; + if (isset($parts[1])) { + $args['Key'] = $parts[1]; + } + + return $args; + } + + /** + * Parses the scheme from a filename. + * + * @param string $path Path to parse. + * + * @return string + */ + private function determineScheme($path) + { + return !strpos($path, '://') ? 'file' : explode('://', $path)[0]; + } + + /** + * Normalize a path so that it has UNIX-style directory separators and no trailing / + * + * @param string $path + * + * @return string + */ + private function normalizePath($path) + { + return rtrim(str_replace('\\', '/', $path), '/'); + } + + private function resolvesOutsideTargetDirectory($sink, $objectKey) + { + $resolved = []; + $sections = explode('/', $sink); + $targetSectionsLength = count(explode('/', $objectKey)); + $targetSections = array_slice($sections, -($targetSectionsLength + 1)); + $targetDirectory = $targetSections[0]; + + foreach ($targetSections as $section) { + if ($section === '.' || $section === '') { + continue; + } + if ($section === '..') { + array_pop($resolved); + if (empty($resolved) || $resolved[0] !== $targetDirectory) { + return true; + } + } else { + $resolved []= $section; + } + } + return false; + } + + private function createDownloadPromise() + { + $parts = $this->getS3Args($this->sourceMetadata['path']); + $prefix = "s3://{$parts['Bucket']}/" + . (isset($parts['Key']) ? $parts['Key'] . '/' : ''); + + $commands = []; + foreach ($this->getDownloadsIterator() as $object) { + // Prepare the sink. + $objectKey = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $object); + $sink = $this->destination['path'] . '/' . $objectKey; + + $command = $this->client->getCommand( + 'GetObject', + $this->getS3Args($object) + ['@http' => ['sink' => $sink]] + ); + + if ($this->resolvesOutsideTargetDirectory($sink, $objectKey)) { + throw new AwsException( + 'Cannot download key ' . $objectKey + . ', its relative path resolves outside the' + . ' parent directory', $command); + } + + // Create the directory if needed. + $dir = dirname($sink); + if (!is_dir($dir) && !mkdir($dir, 0777, true)) { + throw new \RuntimeException("Could not create dir: {$dir}"); + } + + // Create the command. + $commands []= $command; + } + + // Create a GetObject command pool and return the promise. + return (new Aws\CommandPool($this->client, $commands, [ + 'concurrency' => $this->concurrency, + 'before' => $this->before, + 'fulfill' => $this->after, + 'rejected' => function ($reason, $idx, Promise\PromiseInterface $p) { + $p->reject($reason); + } + ]))->promise(); + } + + private function createUploadPromise() + { + // Map each file into a promise that performs the actual transfer. + $files = \Aws\map($this->getUploadsIterator(), function ($file) { + return (filesize($file) >= $this->mupThreshold) + ? $this->uploadMultipart($file) + : $this->upload($file); + }); + + // Create an EachPromise, that will concurrently handle the upload + // operations' yielded promises from the iterator. + return Promise\Each::ofLimitAll($files, $this->concurrency, $this->after); + } + + /** @return Iterator */ + private function getUploadsIterator() + { + if (is_string($this->source)) { + return Aws\filter( + Aws\recursive_dir_iterator($this->sourceMetadata['path']), + function ($file) { return !is_dir($file); } + ); + } + + return $this->source; + } + + /** @return Iterator */ + private function getDownloadsIterator() + { + if (is_string($this->source)) { + $listArgs = $this->getS3Args($this->sourceMetadata['path']); + if (isset($listArgs['Key'])) { + $listArgs['Prefix'] = $listArgs['Key'] . '/'; + unset($listArgs['Key']); + } + + $files = $this->client + ->getPaginator('ListObjects', $listArgs) + ->search('Contents[].Key'); + $files = Aws\map($files, function ($key) use ($listArgs) { + return "s3://{$listArgs['Bucket']}/$key"; + }); + return Aws\filter($files, function ($key) { + return substr($key, -1, 1) !== '/'; + }); + } + + return $this->source; + } + + private function upload($filename) + { + $args = $this->s3Args; + $args['SourceFile'] = $filename; + $args['Key'] = $this->createS3Key($filename); + $args['AddContentMD5'] = $this->addContentMD5; + $command = $this->client->getCommand('PutObject', $args); + $this->before and call_user_func($this->before, $command); + + return $this->client->executeAsync($command); + } + + private function uploadMultipart($filename) + { + $args = $this->s3Args; + $args['Key'] = $this->createS3Key($filename); + $filename = $filename instanceof \SplFileInfo ? $filename->getPathname() : $filename; + + return (new MultipartUploader($this->client, $filename, [ + 'bucket' => $args['Bucket'], + 'key' => $args['Key'], + 'before_initiate' => $this->before, + 'before_upload' => $this->before, + 'before_complete' => $this->before, + 'concurrency' => $this->concurrency, + 'add_content_md5' => $this->addContentMD5 + ]))->promise(); + } + + private function createS3Key($filename) + { + $filename = $this->normalizePath($filename); + $relative_file_path = ltrim( + preg_replace('#^' . preg_quote($this->sourceMetadata['path']) . '#', '', $filename), + '/\\' + ); + + if (isset($this->s3Args['Key'])) { + return rtrim($this->s3Args['Key'], '/').'/'.$relative_file_path; + } + + return $relative_file_path; + } + + private function addDebugToBefore($debug) + { + $before = $this->before; + $sourcePath = $this->sourceMetadata['path']; + $s3Args = $this->s3Args; + + $this->before = static function ( + CommandInterface $command + ) use ($before, $debug, $sourcePath, $s3Args) { + // Call the composed before function. + $before and $before($command); + + // Determine the source and dest values based on operation. + switch ($operation = $command->getName()) { + case 'GetObject': + $source = "s3://{$command['Bucket']}/{$command['Key']}"; + $dest = $command['@http']['sink']; + break; + case 'PutObject': + $source = $command['SourceFile']; + $dest = "s3://{$command['Bucket']}/{$command['Key']}"; + break; + case 'UploadPart': + $part = $command['PartNumber']; + case 'CreateMultipartUpload': + case 'CompleteMultipartUpload': + $sourceKey = $command['Key']; + if (isset($s3Args['Key']) && strpos($sourceKey, $s3Args['Key']) === 0) { + $sourceKey = substr($sourceKey, strlen($s3Args['Key']) + 1); + } + $source = "{$sourcePath}/{$sourceKey}"; + $dest = "s3://{$command['Bucket']}/{$command['Key']}"; + break; + default: + throw new \UnexpectedValueException( + "Transfer encountered an unexpected operation: {$operation}." + ); + } + + // Print the debugging message. + $context = sprintf('%s -> %s (%s)', $source, $dest, $operation); + if (isset($part)) { + $context .= " : Part={$part}"; + } + fwrite($debug, "Transferring {$context}\n"); + }; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/Configuration.php b/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/Configuration.php new file mode 100644 index 0000000..91277d6 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/Configuration.php @@ -0,0 +1,37 @@ +useArnRegion = Aws\boolean_value($useArnRegion); + if (is_null($this->useArnRegion)) { + throw new ConfigurationException("'use_arn_region' config option" + . " must be a boolean value."); + } + } + + /** + * {@inheritdoc} + */ + public function isUseArnRegion() + { + return $this->useArnRegion; + } + + /** + * {@inheritdoc} + */ + public function toArray() + { + return [ + 'use_arn_region' => $this->isUseArnRegion(), + ]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/ConfigurationInterface.php b/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/ConfigurationInterface.php new file mode 100644 index 0000000..c7f3b24 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/ConfigurationInterface.php @@ -0,0 +1,19 @@ + + * use Aws\S3\UseArnRegion\ConfigurationProvider; + * $provider = ConfigurationProvider::defaultProvider(); + * // Returns a ConfigurationInterface or throws. + * $config = $provider()->wait(); + * + * + * Configuration providers can be composed to create configuration using + * conditional logic that can create different configurations in different + * environments. You can compose multiple providers into a single provider using + * {@see Aws\S3\UseArnRegion\ConfigurationProvider::chain}. This function + * accepts providers as variadic arguments and returns a new function that will + * invoke each provider until a successful configuration is returned. + * + * + * // First try an INI file at this location. + * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); + * // Then try an INI file at this location. + * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); + * // Then try loading from environment variables. + * $c = ConfigurationProvider::env(); + * // Combine the three providers together. + * $composed = ConfigurationProvider::chain($a, $b, $c); + * // Returns a promise that is fulfilled with a configuration or throws. + * $promise = $composed(); + * // Wait on the configuration to resolve. + * $config = $promise->wait(); + * + */ +class ConfigurationProvider extends AbstractConfigurationProvider + implements ConfigurationProviderInterface +{ + const ENV_USE_ARN_REGION = 'AWS_S3_USE_ARN_REGION'; + const INI_USE_ARN_REGION = 's3_use_arn_region'; + const DEFAULT_USE_ARN_REGION = true; + + public static $cacheKey = 'aws_s3_use_arn_region_config'; + + protected static $interfaceClass = ConfigurationInterface::class; + protected static $exceptionClass = ConfigurationException::class; + + /** + * Create a default config provider that first checks for environment + * variables, then checks for a specified profile in the environment-defined + * config file location (env variable is 'AWS_CONFIG_FILE', file location + * defaults to ~/.aws/config), then checks for the "default" profile in the + * environment-defined config file location, and failing those uses a default + * fallback set of configuration options. + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided config options. + * + * @param array $config + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $configProviders = [self::env()]; + if ( + !isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] != false + ) { + $configProviders[] = self::ini(); + } + $configProviders[] = self::fallback(); + + $memo = self::memoize( + call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders) + ); + + if (isset($config['use_arn_region']) + && $config['use_arn_region'] instanceof CacheInterface + ) { + return self::cache($memo, $config['use_arn_region'], self::$cacheKey); + } + + return $memo; + } + + /** + * Provider that creates config from environment variables. + * + * @return callable + */ + public static function env() + { + return function () { + // Use config from environment variables, if available + $useArnRegion = getenv(self::ENV_USE_ARN_REGION); + if (!empty($useArnRegion)) { + return Promise\Create::promiseFor( + new Configuration($useArnRegion) + ); + } + + return self::reject('Could not find environment variable config' + . ' in ' . self::ENV_USE_ARN_REGION); + }; + } + + /** + * Config provider that creates config using a config file whose location + * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to + * ~/.aws/config if not specified + * + * @param string|null $profile Profile to use. If not specified will use + * the "default" profile. + * @param string|null $filename If provided, uses a custom filename rather + * than looking in the default directory. + * + * @return callable + */ + public static function ini($profile = null, $filename = null) + { + $filename = $filename ?: (self::getDefaultConfigFilename()); + $profile = $profile ?: (getenv(self::ENV_PROFILE) ?: 'default'); + + return function () use ($profile, $filename) { + if (!@is_readable($filename)) { + return self::reject("Cannot read configuration from $filename"); + } + + // Use INI_SCANNER_NORMAL instead of INI_SCANNER_TYPED for PHP 5.5 compatibility + $data = \Aws\parse_ini_file($filename, true, INI_SCANNER_NORMAL); + if ($data === false) { + return self::reject("Invalid config file: $filename"); + } + if (!isset($data[$profile])) { + return self::reject("'$profile' not found in config file"); + } + if (!isset($data[$profile][self::INI_USE_ARN_REGION])) { + return self::reject("Required S3 Use Arn Region config values + not present in INI profile '{$profile}' ({$filename})"); + } + + // INI_SCANNER_NORMAL parses false-y values as an empty string + if ($data[$profile][self::INI_USE_ARN_REGION] === "") { + $data[$profile][self::INI_USE_ARN_REGION] = false; + } + + return Promise\Create::promiseFor( + new Configuration($data[$profile][self::INI_USE_ARN_REGION]) + ); + }; + } + + /** + * Fallback config options when other sources are not set. + * + * @return callable + */ + public static function fallback() + { + return function () { + return Promise\Create::promiseFor( + new Configuration(self::DEFAULT_USE_ARN_REGION) + ); + }; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/Exception/ConfigurationException.php b/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/Exception/ConfigurationException.php new file mode 100644 index 0000000..15d06a9 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3/UseArnRegion/Exception/ConfigurationException.php @@ -0,0 +1,14 @@ +api = $api; + $this->parser = $parser; + } + + public function __invoke( + CommandInterface $command, + ResponseInterface $response + ) { + $fn = $this->parser; + $result = $fn($command, $response); + + //Skip this middleware if the operation doesn't have an httpChecksum + $op = $this->api->getOperation($command->getName()); + $checksumInfo = isset($op['httpChecksum']) + ? $op['httpChecksum'] + : []; + if (empty($checksumInfo)) { + return $result; + } + + //Skip this middleware if the operation doesn't send back a checksum, or the user doesn't opt in + $checksumModeEnabledMember = isset($checksumInfo['requestValidationModeMember']) + ? $checksumInfo['requestValidationModeMember'] + : ""; + $checksumModeEnabled = isset($command[$checksumModeEnabledMember]) + ? $command[$checksumModeEnabledMember] + : ""; + $responseAlgorithms = isset($checksumInfo['responseAlgorithms']) + ? $checksumInfo['responseAlgorithms'] + : []; + if (empty($responseAlgorithms) + || strtolower($checksumModeEnabled) !== "enabled" + ) { + return $result; + } + + if (extension_loaded('awscrt')) { + $checksumPriority = ['CRC32C', 'CRC32', 'SHA1', 'SHA256']; + } else { + $checksumPriority = ['CRC32', 'SHA1', 'SHA256']; + } + $checksumsToCheck = array_intersect($responseAlgorithms, $checksumPriority); + $checksumValidationInfo = $this->validateChecksum($checksumsToCheck, $response); + + if ($checksumValidationInfo['status'] == "SUCCEEDED") { + $result['ChecksumValidated'] = $checksumValidationInfo['checksum']; + } else if ($checksumValidationInfo['status'] == "FAILED"){ + //Ignore failed validations on GetObject if it's a multipart get which returned a full multipart object + if ($command->getName() == "GetObject" + && !empty($checksumValidationInfo['checksumHeaderValue']) + ) { + $headerValue = $checksumValidationInfo['checksumHeaderValue']; + $lastDashPos = strrpos($headerValue, '-'); + $endOfChecksum = substr($headerValue, $lastDashPos + 1); + if (is_numeric($endOfChecksum) + && intval($endOfChecksum) > 1 + && intval($endOfChecksum) < 10000) { + return $result; + } + } + throw new S3Exception( + "Calculated response checksum did not match the expected value", + $command + ); + } + return $result; + } + + public function parseMemberFromStream( + StreamInterface $stream, + StructureShape $member, + $response + ) { + return $this->parser->parseMemberFromStream($stream, $member, $response); + } + + /** + * @param $checksumPriority + * @param ResponseInterface $response + */ + public function validateChecksum($checksumPriority, ResponseInterface $response) + { + $checksumToValidate = $this->chooseChecksumHeaderToValidate( + $checksumPriority, + $response + ); + $validationStatus = "SKIPPED"; + $checksumHeaderValue = null; + if (!empty($checksumToValidate)) { + $checksumHeaderValue = $response->getHeader( + 'x-amz-checksum-' . $checksumToValidate + ); + if (isset($checksumHeaderValue)) { + $checksumHeaderValue = $checksumHeaderValue[0]; + $calculatedChecksumValue = $this->getEncodedValue( + $checksumToValidate, + $response->getBody() + ); + $validationStatus = $checksumHeaderValue == $calculatedChecksumValue + ? "SUCCEEDED" + : "FAILED"; + } + } + return [ + "status" => $validationStatus, + "checksum" => $checksumToValidate, + "checksumHeaderValue" => $checksumHeaderValue, + ]; + } + + /** + * @param $checksumPriority + * @param ResponseInterface $response + */ + public function chooseChecksumHeaderToValidate( + $checksumPriority, + ResponseInterface $response + ) { + foreach ($checksumPriority as $checksum) { + $checksumHeader = 'x-amz-checksum-' . $checksum; + if ($response->hasHeader($checksumHeader)) { + return $checksum; + } + } + return null; + } +} diff --git a/vendor/aws/aws-sdk-php/src/S3Tables/Exception/S3TablesException.php b/vendor/aws/aws-sdk-php/src/S3Tables/Exception/S3TablesException.php new file mode 100644 index 0000000..1dd0347 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/S3Tables/Exception/S3TablesException.php @@ -0,0 +1,9 @@ +args = $args; + + if (!isset($args['handler']) && !isset($args['http_handler'])) { + $this->args['http_handler'] = default_http_handler(); + } + } + + public function __call($name, array $args) + { + $args = isset($args[0]) ? $args[0] : []; + if (strpos($name, 'createMultiRegion') === 0) { + return $this->createMultiRegionClient(substr($name, 17), $args); + } + + if (strpos($name, 'create') === 0) { + return $this->createClient(substr($name, 6), $args); + } + + throw new \BadMethodCallException("Unknown method: {$name}."); + } + + /** + * Get a client by name using an array of constructor options. + * + * @param string $name Service name or namespace (e.g., DynamoDb, s3). + * @param array $args Arguments to configure the client. + * + * @return AwsClientInterface + * @throws \InvalidArgumentException if any required options are missing or + * the service is not supported. + * @see Aws\AwsClient::__construct for a list of available options for args. + */ + public function createClient($name, array $args = []) + { + // Get information about the service from the manifest file. + $service = manifest($name); + $namespace = $service['namespace']; + + // Instantiate the client class. + $client = "Aws\\{$namespace}\\{$namespace}Client"; + return new $client($this->mergeArgs($namespace, $service, $args)); + } + + public function createMultiRegionClient($name, array $args = []) + { + // Get information about the service from the manifest file. + $service = manifest($name); + $namespace = $service['namespace']; + + $klass = "Aws\\{$namespace}\\{$namespace}MultiRegionClient"; + $klass = class_exists($klass) ? $klass : MultiRegionClient::class; + + return new $klass($this->mergeArgs($namespace, $service, $args)); + } + + /** + * Clone existing SDK instance with ability to pass an associative array + * of extra client settings. + * + * @param array $args + * + * @return self + */ + public function copy(array $args = []) + { + return new self($args + $this->args); + } + + private function mergeArgs($namespace, array $manifest, array $args = []) + { + // Merge provided args with stored, service-specific args. + if (isset($this->args[$namespace])) { + $args += $this->args[$namespace]; + } + + // Provide the endpoint prefix in the args. + if (!isset($args['service'])) { + $args['service'] = $manifest['endpoint']; + } + + return $args + $this->args; + } + + /** + * Determine the endpoint prefix from a client namespace. + * + * @param string $name Namespace name + * + * @return string + * @internal + * @deprecated Use the `\Aws\manifest()` function instead. + */ + public static function getEndpointPrefix($name) + { + return manifest($name)['endpoint']; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Signature/AnonymousSignature.php b/vendor/aws/aws-sdk-php/src/Signature/AnonymousSignature.php new file mode 100644 index 0000000..9ccc8df --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Signature/AnonymousSignature.php @@ -0,0 +1,33 @@ + true]; + private const EXT_OPENSSL = 'openssl'; + private const CURVE_NAME = 'prime256v1'; + private const HEADER_DPOP = 'DPop'; + private const HEADER_TYP = 'dpop+jwt'; + private const HEADER_ALG = 'ES256'; + private const HEADER_JWK_KTY = 'EC'; + private const HEADER_JWK_CRV = 'P-256'; + private const PAYLOAD_HTM = 'POST'; + private const JWK_SCHEMA = [ + 'kty' => self::HEADER_JWK_KTY, + 'crv' => self::HEADER_JWK_CRV, + ]; + private const HEADER_SCHEMA = [ + 'typ' => self::HEADER_TYP, + 'alg' => self::HEADER_ALG, + 'jwk' => self::JWK_SCHEMA + ]; + private const PAYLOAD_SCHEMA = [ + 'htm' => self::PAYLOAD_HTM, + ]; + + /** + * Creates a new DpopSignature instance for the specified service + * + * @param string $serviceName The name of the AWS service (must be in the allow list) + * + * @throws \RuntimeException If the OpenSSL extension is not loaded + * @throws \InvalidArgumentException If the service is not in the allow list + */ + public function __construct(string $serviceName) + { + if (!extension_loaded(self::EXT_OPENSSL)) { + throw new \RuntimeException( + 'the `openssl` extension is required to generate DPop signatures. ' + . 'Please install or enable the `openssl` extension.' + ); + } + + if (!isset(self::ALLOW_LISTED_SERVICES[$serviceName])) { + throw new \InvalidArgumentException( + "The '{$serviceName}' service does not support DPop signatures. " + . 'Please configure a signature version this service supports.' + ); + } + } + + /** + * Signs an HTTP request with a DPoP header + * + * @param RequestInterface $request The HTTP request to sign + * @param \OpenSSLAsymmetricKey $key The private key for signing + * + * @return RequestInterface The request with the DPoP header added + * @throws \RuntimeException|\Exception If signature generation fails + */ + public function signRequest( + RequestInterface $request, + \OpenSSLAsymmetricKey $key, + ) { + $dpopHeaderValue = $this->generateDpopProof($key, $request->getUri()); + + return $request->withHeader(self::HEADER_DPOP, $dpopHeaderValue); + } + + /** + * Generates the DPoP JWT header value for the request + * + * @param \OpenSSLAsymmetricKey $key The private key for signing + * @param UriInterface $uri The URI of the request + * + * @return string The complete DPoP JWT token + * @throws \RuntimeException|\Exception If signature generation fails + */ + private function generateDpopProof( + \OpenSSLAsymmetricKey $key, + UriInterface $uri + ): string + { + $keyDetails = openssl_pkey_get_details($key); + if (($keyDetails['ec']['curve_name'] ?? '') !== self::CURVE_NAME) { + throw new \InvalidArgumentException( + 'DPoP signature keys must use P-256 curve. ' + . 'Please check your configuration and try again.' + ); + } + + ['x' => $x, 'y' => $y] = $keyDetails['ec']; + $header = $this->buildDpopHeader($x, $y); + $payload = $this->buildDpopPayload((string) $uri); + + $message = $this->base64url_encode(json_encode($header)) + . '.' . $this->base64url_encode(json_encode($payload)); + $signature = ''; + if (!openssl_sign($message, $signature, $key, OPENSSL_ALGO_SHA256)) { + $error = openssl_error_string(); + + throw new \RuntimeException( + 'Failed to generate signature.' . ($error ? ": $error" : '.') + ); + } + + $signature = $this->derToRaw($signature); + + return $message . '.' . $this->base64url_encode($signature); + } + + /** + * Builds the DPoP JWT header with the public key coordinates + * + * @param string $x The x-coordinate of the EC public key + * @param string $y The y-coordinate of the EC public key + * + * @return array The complete DPoP header with JWK + */ + private function buildDpopHeader(string $x, string $y): array + { + return array_merge_recursive(self::HEADER_SCHEMA, [ + 'jwk' => [ + 'x' => $this->base64url_encode($x), + 'y' => $this->base64url_encode($y) + ] + ]); + } + + /** + * Builds the DPoP JWT payload with request-specific claims + * + * @param string $uri The target URI for the HTTP request + * + * @return array The complete DPoP payload with jti, htm, htu, and iat claims + * @throws RandomException + */ + private function buildDpopPayload(string $uri): array + { + return array_merge(self::PAYLOAD_SCHEMA, [ + 'jti' => $this->uuidv4(), + 'htu' => $uri, + 'iat' => time() + ]); + } + + /** + * Generates a version 4 UUID + * + * @return string A UUID v4 string + * @throws RandomException + */ + private function uuidv4(): string + { + $data = random_bytes(16); + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); + + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); + } + + /** + * Encodes data to Base64URL format (RFC 4648) + * + * @param string $data The data to encode + * + * @return string Base64URL encoded string (no padding, URL-safe characters) + */ + private function base64url_encode(string $data): string + { + return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); + } + + /** + * Convert DER-encoded ECDSA signature to raw R||S format (64 bytes for ES256) + * + * @param string $derSignature DER-encoded signature from openssl_sign + * + * @return string Raw signature (64 bytes: 32 bytes R + 32 bytes S) + * @throws \Exception If the DER signature is invalid + */ + private function derToRaw(string $derSignature): string + { + $hex = bin2hex($derSignature); + $pos = 0; + + // Parse SEQUENCE tag (0x30) + if (substr($hex, $pos, 2) !== '30') { + throw new \Exception('Invalid DER signature format: missing SEQUENCE tag'); + } + $pos += 2; + + // Parse SEQUENCE length + $seqLen = hexdec(substr($hex, $pos, 2)); + $pos += 2; + + // Parse first INTEGER tag (0x02) for R + if (substr($hex, $pos, 2) !== '02') { + throw new \Exception('Invalid DER signature format: missing R INTEGER tag'); + } + $pos += 2; + + // Parse R length + $rLen = hexdec(substr($hex, $pos, 2)); + $pos += 2; + + // Extract R value + $r = substr($hex, $pos, $rLen * 2); + if (strlen($r) !== $rLen * 2) { + throw new \Exception('Invalid DER signature: R length mismatch'); + } + $pos += $rLen * 2; + + // Parse second INTEGER tag (0x02) for S + if (substr($hex, $pos, 2) !== '02') { + throw new \Exception('Invalid DER signature format: missing S INTEGER tag'); + } + $pos += 2; + + // Parse S length + $sLen = hexdec(substr($hex, $pos, 2)); + $pos += 2; + + // Extract S value + $s = substr($hex, $pos, $sLen * 2); + if (strlen($s) !== $sLen * 2) { + throw new \Exception('Invalid DER signature: S length mismatch'); + } + + // Remove leading zeros (if any) and pad to 32 bytes + $r = str_pad(ltrim($r, '0'), 64, '0', STR_PAD_LEFT); + $s = str_pad(ltrim($s, '0'), 64, '0', STR_PAD_LEFT); + + // Ensure exactly 32 bytes each + if (strlen($r) !== 64 || strlen($s) !== 64) { + throw new \Exception('Invalid signature component length'); + } + + return hex2bin($r . $s); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Signature/S3ExpressSignature.php b/vendor/aws/aws-sdk-php/src/Signature/S3ExpressSignature.php new file mode 100644 index 0000000..08d8114 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Signature/S3ExpressSignature.php @@ -0,0 +1,47 @@ +modifyTokenHeaders($request, $credentials); + $credentials = $this->getSigningCredentials($credentials); + return parent::signRequest($request, $credentials, $signingService); + } + + public function presign(RequestInterface $request, CredentialsInterface $credentials, $expires, array $options = []) + { + $request = $this->modifyTokenHeaders($request, $credentials); + $credentials = $this->getSigningCredentials($credentials); + return parent::presign($request, $credentials, $expires, $options); + } + + private function modifyTokenHeaders( + RequestInterface $request, + CredentialsInterface $credentials + ) { + //The x-amz-security-token header is not supported by s3 express + $request = $request->withoutHeader('X-Amz-Security-Token'); + return $request->withHeader( + 'x-amz-s3session-token', + $credentials->getSecurityToken() + ); + } + + private function getSigningCredentials(CredentialsInterface $credentials) + { + return new Credentials( + $credentials->getAccessKeyId(), + $credentials->getSecretKey() + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Signature/S3SignatureV4.php b/vendor/aws/aws-sdk-php/src/Signature/S3SignatureV4.php new file mode 100644 index 0000000..c99b281 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Signature/S3SignatureV4.php @@ -0,0 +1,125 @@ +hasHeader('x-amz-content-sha256')) { + $request = $request->withHeader( + 'x-amz-content-sha256', + $this->getPayload($request) + ); + } + $useCrt = + strpos($request->getUri()->getHost(), "accesspoint.s3-global") + !== false; + if (!$useCrt) { + if (strpos($request->getUri()->getHost(), "s3-object-lambda")) { + return parent::signRequest($request, $credentials, "s3-object-lambda"); + } + return parent::signRequest($request, $credentials); + } + $signingService = $signingService ?: 's3'; + return $this->signWithV4a($credentials, $request, $signingService); + } + + /** + * @param CredentialsInterface $credentials + * @param RequestInterface $request + * @param $signingService + * @param SigningConfigAWS|null $signingConfig + * @return RequestInterface + * + * Instantiates a separate sigv4a signing config. All services except S3 + * use double encoding. All services except S3 require path normalization. + */ + protected function signWithV4a( + CredentialsInterface $credentials, + RequestInterface $request, + $signingService, + ?SigningConfigAWS $signingConfig = null + ){ + $this->verifyCRTLoaded(); + $credentials_provider = $this->createCRTStaticCredentialsProvider($credentials); + $signingConfig = new SigningConfigAWS([ + 'algorithm' => SigningAlgorithm::SIGv4_ASYMMETRIC, + 'signature_type' => SignatureType::HTTP_REQUEST_HEADERS, + 'credentials_provider' => $credentials_provider, + 'signed_body_value' => $this->getPayload($request), + 'region' => $this->region, + 'should_normalize_uri_path' => false, + 'use_double_uri_encode' => false, + 'service' => $signingService, + 'date' => time(), + ]); + + return parent::signWithV4a($credentials, $request, $signingService, $signingConfig); + } + + /** + * Always add a x-amz-content-sha-256 for data integrity. + * + * {@inheritdoc} + */ + public function presign( + RequestInterface $request, + CredentialsInterface $credentials, + $expires, + array $options = [] + ) { + if (!$request->hasHeader('x-amz-content-sha256')) { + $request = $request->withHeader( + 'X-Amz-Content-Sha256', + $this->getPresignedPayload($request) + ); + } + + if (strpos($request->getUri()->getHost(), "accesspoint.s3-global")) { + $request = $request->withHeader("x-amz-region-set", "*"); + } + + return parent::presign($request, $credentials, $expires, $options); + } + + /** + * Override used to allow pre-signed URLs to be created for an + * in-determinate request payload. + */ + protected function getPresignedPayload(RequestInterface $request) + { + return SignatureV4::UNSIGNED_PAYLOAD; + } + + /** + * Amazon S3 does not double-encode the path component in the canonical request + */ + protected function createCanonicalizedPath($path) + { + // Only remove one slash in case of keys that have a preceding slash + if (substr($path, 0, 1) === '/') { + $path = substr($path, 1); + } + return '/' . $path; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Signature/SignatureInterface.php b/vendor/aws/aws-sdk-php/src/Signature/SignatureInterface.php new file mode 100644 index 0000000..cedfc45 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Signature/SignatureInterface.php @@ -0,0 +1,45 @@ + true, + 's3control' => true, + 's3-outposts' => true, + 's3-object-lambda' => true, + 's3express' => true + ]; + + /** + * Resolves and signature provider and ensures a non-null return value. + * + * @param callable $provider Provider function to invoke. + * @param string $version Signature version. + * @param string $service Service name. + * @param string $region Region name. + * + * @return SignatureInterface + * @throws UnresolvedSignatureException + */ + public static function resolve(callable $provider, $version, $service, $region) + { + $result = $provider($version, $service, $region); + if ($result instanceof SignatureInterface + || $result instanceof BearerTokenAuthorization + || $result instanceof DpopSignature + ) { + return $result; + } + + throw new UnresolvedSignatureException( + "Unable to resolve a signature for $version/$service/$region.\n" + . "Valid signature versions include v4 and anonymous." + ); + } + + /** + * Default SDK signature provider. + * + * @return callable + */ + public static function defaultProvider() + { + return self::memoize(self::version()); + } + + /** + * Creates a signature provider that caches previously created signature + * objects. The computed cache key is the concatenation of the version, + * service, and region. + * + * @param callable $provider Signature provider to wrap. + * + * @return callable + */ + public static function memoize(callable $provider) + { + $cache = []; + return function ($version, $service, $region) use (&$cache, $provider) { + $key = "($version)($service)($region)"; + if (!isset($cache[$key])) { + $cache[$key] = $provider($version, $service, $region); + } + return $cache[$key]; + }; + } + + /** + * Creates signature objects from known signature versions. + * + * This provider currently recognizes the following signature versions: + * + * - v4: Signature version 4. + * - anonymous: Does not sign requests. + * + * @return callable + */ + public static function version() + { + return function ($version, $service, $region) { + switch ($version) { + case 'v4-s3express': + return new S3ExpressSignature($service, $region); + case 's3v4': + case 'v4': + return !empty(self::$s3v4SignedServices[$service]) + ? new S3SignatureV4($service, $region) + : new SignatureV4($service, $region); + case 'v4a': + return !empty(self::$s3v4SignedServices[$service]) + ? new S3SignatureV4($service, $region, ['use_v4a' => true]) + : new SignatureV4($service, $region, ['use_v4a' => true]); + case 'v4-unsigned-body': + return !empty(self::$s3v4SignedServices[$service]) + ? new S3SignatureV4($service, $region, ['unsigned-body' => 'true']) + : new SignatureV4($service, $region, ['unsigned-body' => 'true']); + case 'bearer': + return new BearerTokenAuthorization(); + case 'anonymous': + return new AnonymousSignature(); + case 'dpop': + return new DpopSignature($service); + default: + return null; + } + }; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Signature/SignatureTrait.php b/vendor/aws/aws-sdk-php/src/Signature/SignatureTrait.php new file mode 100644 index 0000000..5dcfe9d --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Signature/SignatureTrait.php @@ -0,0 +1,48 @@ +cache[$k])) { + // Clear the cache when it reaches 50 entries + if (++$this->cacheSize > 50) { + $this->cache = []; + $this->cacheSize = 0; + } + + $dateKey = hash_hmac( + 'sha256', + $shortDate, + "AWS4{$secretKey}", + true + ); + $regionKey = hash_hmac('sha256', $region, $dateKey, true); + $serviceKey = hash_hmac('sha256', $service, $regionKey, true); + $this->cache[$k] = hash_hmac( + 'sha256', + 'aws4_request', + $serviceKey, + true + ); + } + return $this->cache[$k]; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Signature/SignatureV4.php b/vendor/aws/aws-sdk-php/src/Signature/SignatureV4.php new file mode 100644 index 0000000..74c3940 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Signature/SignatureV4.php @@ -0,0 +1,584 @@ + true, + 'content-type' => true, + 'content-length' => true, + 'expect' => true, + 'max-forwards' => true, + 'pragma' => true, + 'range' => true, + 'te' => true, + 'if-match' => true, + 'if-none-match' => true, + 'if-modified-since' => true, + 'if-unmodified-since' => true, + 'if-range' => true, + 'accept' => true, + 'authorization' => true, + 'proxy-authorization' => true, + 'from' => true, + 'referer' => true, + 'user-agent' => true, + 'X-Amz-User-Agent' => true, + 'x-amzn-trace-id' => true, + 'aws-sdk-invocation-id' => true, + 'aws-sdk-retry' => true, + ]; + } + + /** + * @param string $service Service name to use when signing + * @param string $region Region name to use when signing + * @param array $options Array of configuration options used when signing + * - unsigned-body: Flag to make request have unsigned payload. + * Unsigned body is used primarily for streaming requests. + */ + public function __construct($service, $region, array $options = []) + { + $this->service = $service; + $this->region = $region; + $this->unsigned = isset($options['unsigned-body']) ? $options['unsigned-body'] : false; + $this->useV4a = isset($options['use_v4a']) && $options['use_v4a'] === true; + } + + /** + * {@inheritdoc} + */ + public function signRequest( + RequestInterface $request, + CredentialsInterface $credentials, + $signingService = null + ) { + $ldt = gmdate(self::ISO8601_BASIC); + $sdt = substr($ldt, 0, 8); + $parsed = $this->parseRequest($request); + $parsed['headers']['X-Amz-Date'] = [$ldt]; + + if ($token = $credentials->getSecurityToken()) { + $parsed['headers']['X-Amz-Security-Token'] = [$token]; + } + $service = isset($signingService) ? $signingService : $this->service; + + if ($this->useV4a) { + return $this->signWithV4a($credentials, $request, $service); + } + + $cs = $this->createScope($sdt, $this->region, $service); + $payload = $this->getPayload($request); + + if ($payload == self::UNSIGNED_PAYLOAD) { + $parsed['headers'][self::AMZ_CONTENT_SHA256_HEADER] = [$payload]; + } + + $context = $this->createContext($parsed, $payload); + $toSign = $this->createStringToSign($ldt, $cs, $context['creq']); + $signingKey = $this->getSigningKey( + $sdt, + $this->region, + $service, + $credentials->getSecretKey() + ); + $signature = hash_hmac('sha256', $toSign, $signingKey); + $parsed['headers']['Authorization'] = [ + "AWS4-HMAC-SHA256 " + . "Credential={$credentials->getAccessKeyId()}/{$cs}, " + . "SignedHeaders={$context['headers']}, Signature={$signature}" + ]; + + return $this->buildRequest($parsed); + } + + /** + * Get the headers that were used to pre-sign the request. + * Used for the X-Amz-SignedHeaders header. + * + * @param array $headers + * @return array + */ + private function getPresignHeaders(array $headers) + { + $presignHeaders = []; + $blacklist = $this->getHeaderBlacklist(); + foreach ($headers as $name => $value) { + $lName = strtolower($name); + if (!isset($blacklist[$lName]) + && $name !== self::AMZ_CONTENT_SHA256_HEADER + ) { + $presignHeaders[] = $lName; + } + } + return $presignHeaders; + } + + /** + * {@inheritdoc} + */ + public function presign( + RequestInterface $request, + CredentialsInterface $credentials, + $expires, + array $options = [] + ) { + $startTimestamp = isset($options['start_time']) + ? $this->convertToTimestamp($options['start_time'], null) + : time(); + $expiresTimestamp = $this->convertToTimestamp($expires, $startTimestamp); + + if ($this->useV4a) { + return $this->presignWithV4a( + $request, + $credentials, + $this->convertExpires($expiresTimestamp, $startTimestamp) + ); + } + + $parsed = $this->createPresignedRequest($request, $credentials); + + $payload = $this->getPresignedPayload($request); + $httpDate = gmdate(self::ISO8601_BASIC, $startTimestamp); + $shortDate = substr($httpDate, 0, 8); + $scope = $this->createScope($shortDate, $this->region, $this->service); + $credential = $credentials->getAccessKeyId() . '/' . $scope; + if ($credentials->getSecurityToken()) { + unset($parsed['headers']['X-Amz-Security-Token']); + } + $parsed['query']['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256'; + $parsed['query']['X-Amz-Credential'] = $credential; + $parsed['query']['X-Amz-Date'] = gmdate('Ymd\THis\Z', $startTimestamp); + $parsed['query']['X-Amz-SignedHeaders'] = implode(';', $this->getPresignHeaders($parsed['headers'])); + $parsed['query']['X-Amz-Expires'] = $this->convertExpires($expiresTimestamp, $startTimestamp); + $context = $this->createContext($parsed, $payload); + $stringToSign = $this->createStringToSign($httpDate, $scope, $context['creq']); + $key = $this->getSigningKey( + $shortDate, + $this->region, + $this->service, + $credentials->getSecretKey() + ); + $parsed['query']['X-Amz-Signature'] = hash_hmac('sha256', $stringToSign, $key); + + return $this->buildRequest($parsed); + } + + /** + * Converts a POST request to a GET request by moving POST fields into the + * query string. + * + * Useful for pre-signing query protocol requests. + * + * @param RequestInterface $request Request to clone + * + * @return RequestInterface + * @throws \InvalidArgumentException if the method is not POST + */ + public static function convertPostToGet(RequestInterface $request, $additionalQueryParams = "") + { + if ($request->getMethod() !== 'POST') { + throw new \InvalidArgumentException('Expected a POST request but ' + . 'received a ' . $request->getMethod() . ' request.'); + } + + $sr = $request->withMethod('GET') + ->withBody(Psr7\Utils::streamFor('')) + ->withoutHeader('Content-Type') + ->withoutHeader('Content-Length'); + + // Move POST fields to the query if they are present + if ($request->getHeaderLine('Content-Type') === 'application/x-www-form-urlencoded') { + $body = (string) $request->getBody() . $additionalQueryParams; + $sr = $sr->withUri($sr->getUri()->withQuery($body)); + } + + return $sr; + } + + protected function getPayload(RequestInterface $request) + { + if ($this->unsigned && $request->getUri()->getScheme() == 'https') { + return self::UNSIGNED_PAYLOAD; + } + // Calculate the request signature payload + if ($request->hasHeader(self::AMZ_CONTENT_SHA256_HEADER)) { + // Handle streaming operations (e.g. Glacier.UploadArchive) + return $request->getHeaderLine(self::AMZ_CONTENT_SHA256_HEADER); + } + + if (!$request->getBody()->isSeekable()) { + throw new CouldNotCreateChecksumException('sha256'); + } + + try { + return Psr7\Utils::hash($request->getBody(), 'sha256'); + } catch (\Exception $e) { + throw new CouldNotCreateChecksumException('sha256', $e); + } + } + + protected function getPresignedPayload(RequestInterface $request) + { + return $this->getPayload($request); + } + + protected function createCanonicalizedPath($path) + { + $doubleEncoded = rawurlencode(ltrim($path, '/')); + + return '/' . str_replace('%2F', '/', $doubleEncoded); + } + + private function createStringToSign($longDate, $credentialScope, $creq) + { + $hash = hash('sha256', $creq); + + return "AWS4-HMAC-SHA256\n{$longDate}\n{$credentialScope}\n{$hash}"; + } + + private function createPresignedRequest( + RequestInterface $request, + CredentialsInterface $credentials + ) { + $parsedRequest = $this->parseRequest($request); + + // Make sure to handle temporary credentials + if ($token = $credentials->getSecurityToken()) { + $parsedRequest['headers']['X-Amz-Security-Token'] = [$token]; + } + + return $this->moveHeadersToQuery($parsedRequest); + } + + /** + * @param array $parsedRequest + * @param string $payload Hash of the request payload + * @return array Returns an array of context information + */ + private function createContext(array $parsedRequest, $payload) + { + $blacklist = $this->getHeaderBlacklist(); + + // Normalize the path as required by SigV4 + $canon = $parsedRequest['method'] . "\n" + . $this->createCanonicalizedPath($parsedRequest['path']) . "\n" + . $this->getCanonicalizedQuery($parsedRequest['query']) . "\n"; + + // Case-insensitively aggregate all of the headers. + $aggregate = []; + foreach ($parsedRequest['headers'] as $key => $values) { + $key = strtolower($key); + if (!isset($blacklist[$key])) { + foreach ($values as $v) { + $aggregate[$key][] = $v; + } + } + } + + ksort($aggregate); + $canonHeaders = []; + foreach ($aggregate as $k => $v) { + if (count($v) > 0) { + sort($v); + } + $canonHeaders[] = $k . ':' . preg_replace('/\s+/', ' ', implode(',', $v)); + } + + $signedHeadersString = implode(';', array_keys($aggregate)); + $canon .= implode("\n", $canonHeaders) . "\n\n" + . $signedHeadersString . "\n" + . $payload; + + return ['creq' => $canon, 'headers' => $signedHeadersString]; + } + + private function getCanonicalizedQuery(array $query) + { + unset($query['X-Amz-Signature']); + + if (!$query) { + return ''; + } + + $qs = ''; + ksort($query); + foreach ($query as $k => $v) { + if (!is_array($v)) { + $qs .= rawurlencode($k) . '=' . rawurlencode($v !== null ? $v : '') . '&'; + } else { + sort($v); + foreach ($v as $value) { + $qs .= rawurlencode($k) . '=' . rawurlencode($value !== null ? $value : '') . '&'; + } + } + } + + return substr($qs, 0, -1); + } + + private function convertToTimestamp($dateValue, $relativeTimeBase = null) + { + if ($dateValue instanceof \DateTimeInterface) { + $timestamp = $dateValue->getTimestamp(); + } elseif (!is_numeric($dateValue)) { + $timestamp = strtotime($dateValue, + $relativeTimeBase === null ? time() : $relativeTimeBase + ); + } else { + $timestamp = $dateValue; + } + + return $timestamp; + } + + private function convertExpires($expiresTimestamp, $startTimestamp) + { + $duration = $expiresTimestamp - $startTimestamp; + + // Ensure that the duration of the signature is not longer than a week + if ($duration > 604800) { + throw new \InvalidArgumentException('The expiration date of a ' + . 'signature version 4 presigned URL must be less than one ' + . 'week'); + } + + return $duration; + } + + private function moveHeadersToQuery(array $parsedRequest) + { + //x-amz-user-agent shouldn't be put in a query param + unset($parsedRequest['headers']['X-Amz-User-Agent']); + + foreach ($parsedRequest['headers'] as $name => $header) { + $lname = strtolower($name); + if (substr($lname, 0, 5) == 'x-amz') { + $parsedRequest['query'][$name] = $header; + } + $blacklist = $this->getHeaderBlacklist(); + if (isset($blacklist[$lname]) + || $lname === strtolower(self::AMZ_CONTENT_SHA256_HEADER) + ) { + unset($parsedRequest['headers'][$name]); + } + } + + return $parsedRequest; + } + + private function parseRequest(RequestInterface $request) + { + // Clean up any previously set headers. + /** @var RequestInterface $request */ + $request = $request + ->withoutHeader('X-Amz-Date') + ->withoutHeader('Date') + ->withoutHeader('Authorization'); + $uri = $request->getUri(); + + return [ + 'method' => $request->getMethod(), + 'path' => $uri->getPath(), + 'query' => Psr7\Query::parse($uri->getQuery()), + 'uri' => $uri, + 'headers' => $request->getHeaders(), + 'body' => $request->getBody(), + 'version' => $request->getProtocolVersion() + ]; + } + + private function buildRequest(array $req) + { + if ($req['query']) { + $req['uri'] = $req['uri']->withQuery(Psr7\Query::build($req['query'])); + } + + return new Psr7\Request( + $req['method'], + $req['uri'], + $req['headers'], + $req['body'], + $req['version'] + ); + } + + protected function verifyCRTLoaded() + { + if (!extension_loaded('awscrt')) { + throw new CommonRuntimeException( + "AWS Common Runtime for PHP is required to use Signature V4A" + . ". Please install it using the instructions found at" + . " https://github.com/aws/aws-sdk-php/blob/master/CRT_INSTRUCTIONS.md" + ); + } + } + + protected function createCRTStaticCredentialsProvider($credentials) + { + return new StaticCredentialsProvider([ + 'access_key_id' => $credentials->getAccessKeyId(), + 'secret_access_key' => $credentials->getSecretKey(), + 'session_token' => $credentials->getSecurityToken(), + ]); + } + + private function removeIllegalV4aHeaders(&$request) + { + static $illegalV4aHeaders = [ + self::AMZ_CONTENT_SHA256_HEADER, + 'aws-sdk-invocation-id', + 'aws-sdk-retry', + 'x-amz-region-set', + 'transfer-encoding' + ]; + $storedHeaders = []; + + foreach ($illegalV4aHeaders as $header) { + if ($request->hasHeader($header)) { + $storedHeaders[$header] = $request->getHeader($header); + $request = $request->withoutHeader($header); + } + } + + return $storedHeaders; + } + + private function CRTRequestFromGuzzleRequest($request) + { + return new Request( + $request->getMethod(), + (string) $request->getUri(), + [], //leave empty as the query is parsed from the uri object + array_map(function ($header) {return $header[0];}, $request->getHeaders()) + ); + } + + /** + * @param CredentialsInterface $credentials + * @param RequestInterface $request + * @param $signingService + * @param SigningConfigAWS|null $signingConfig + * @return RequestInterface + */ + protected function signWithV4a( + CredentialsInterface $credentials, + RequestInterface $request, + $signingService, + ?SigningConfigAWS $signingConfig = null + ){ + $this->verifyCRTLoaded(); + $signingConfig = $signingConfig ?? new SigningConfigAWS([ + 'algorithm' => SigningAlgorithm::SIGv4_ASYMMETRIC, + 'signature_type' => SignatureType::HTTP_REQUEST_HEADERS, + 'credentials_provider' => $this->createCRTStaticCredentialsProvider($credentials), + 'signed_body_value' => $this->getPayload($request), + 'should_normalize_uri_path' => true, + 'use_double_uri_encode' => true, + 'region' => $this->region, + 'service' => $signingService, + 'date' => time(), + ]); + + $removedIllegalHeaders = $this->removeIllegalV4aHeaders($request); + $http_request = $this->CRTRequestFromGuzzleRequest($request); + + Signing::signRequestAws( + Signable::fromHttpRequest($http_request), + $signingConfig, function ($signing_result, $error_code) use (&$http_request) { + $signing_result->applyToHttpRequest($http_request); + }); + foreach ($removedIllegalHeaders as $header => $value) { + $request = $request->withHeader($header, $value); + } + + $sigV4AHeaders = $http_request->headers(); + foreach ($sigV4AHeaders->toArray() as $h => $v) { + $request = $request->withHeader($h, $v); + } + + return $request; + } + + protected function presignWithV4a( + RequestInterface $request, + CredentialsInterface $credentials, + $expires + ) + { + $this->verifyCRTLoaded(); + $credentials_provider = $this->createCRTStaticCredentialsProvider($credentials); + $signingConfig = new SigningConfigAWS([ + 'algorithm' => SigningAlgorithm::SIGv4_ASYMMETRIC, + 'signature_type' => SignatureType::HTTP_REQUEST_QUERY_PARAMS, + 'credentials_provider' => $credentials_provider, + 'signed_body_value' => $this->getPresignedPayload($request), + 'region' => "*", + 'service' => $this->service, + 'date' => time(), + 'expiration_in_seconds' => $expires + ]); + + $this->removeIllegalV4aHeaders($request); + foreach ($this->getHeaderBlacklist() as $headerName => $headerValue) { + if ($request->hasHeader($headerName)) { + $request = $request->withoutHeader($headerName); + } + } + + $http_request = $this->CRTRequestFromGuzzleRequest($request); + Signing::signRequestAws( + Signable::fromHttpRequest($http_request), + $signingConfig, function ($signing_result, $error_code) use (&$http_request) { + $signing_result->applyToHttpRequest($http_request); + }); + + return $request->withUri( + new Psr7\Uri($http_request->pathAndQuery()) + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Signin/Exception/SigninException.php b/vendor/aws/aws-sdk-php/src/Signin/Exception/SigninException.php new file mode 100644 index 0000000..c473366 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Signin/Exception/SigninException.php @@ -0,0 +1,9 @@ +nextHandler = $nextHandler; + $this->service = $service; + } + + public function __invoke(CommandInterface $command, RequestInterface $request) + { + $nextHandler = $this->nextHandler; + + $operation = $this->service->getOperation($command->getName()); + $contentLength = $request->getHeader('content-length'); + $hasStreaming = false; + $requiresLength = false; + + // Check if any present input member is a stream and requires the + // content length + foreach ($operation->getInput()->getMembers() as $name => $member) { + if (!empty($member['streaming']) && isset($command[$name])) { + $hasStreaming = true; + if (!empty($member['requiresLength'])) { + $requiresLength = true; + } + } + } + + if ($hasStreaming) { + + // Add 'transfer-encoding' header if payload size not required to + // to be calculated and not already known + if (empty($requiresLength) + && empty($contentLength) + && isset($operation['authtype']) + && $operation['authtype'] == 'v4-unsigned-body' + ) { + $request = $request->withHeader('transfer-encoding', 'chunked'); + + // Otherwise, make sure 'content-length' header is added + } else { + if (empty($contentLength)) { + $size = $request->getBody()->getSize(); + if (is_null($size)) { + throw new IncalculablePayloadException('Payload' + . ' content length is required and can not be' + . ' calculated.'); + } + $request = $request->withHeader( + 'Content-Length', + $size + ); + } + } + } + + return $nextHandler($command, $request); + } +} diff --git a/vendor/aws/aws-sdk-php/src/TaxSettings/Exception/TaxSettingsException.php b/vendor/aws/aws-sdk-php/src/TaxSettings/Exception/TaxSettingsException.php new file mode 100644 index 0000000..93cac49 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/TaxSettings/Exception/TaxSettingsException.php @@ -0,0 +1,9 @@ +getToken())) { + throw new InvalidArgumentException( + "Cannot authorize a request with an empty token" + ); + } + $accessToken = $token->getToken(); + return $request->withHeader('Authorization', "Bearer {$accessToken}"); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Token/BedrockTokenProvider.php b/vendor/aws/aws-sdk-php/src/Token/BedrockTokenProvider.php new file mode 100644 index 0000000..bfcf113 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Token/BedrockTokenProvider.php @@ -0,0 +1,105 @@ + self::env(self::TOKEN_ENV_KEY)]; + + return self::memoize( + call_user_func_array( + [TokenProvider::class, 'chain'], + array_values($defaultChain) + ) + ); + } + + /** + * Token provider that creates a token from an environment variable. + * + * @param string $configKey The configuration key that will be transformed + * to an environment variable name by ConfigurationResolver + * + * @return callable + */ + public static function env(string $configKey): callable + { + return static function () use ($configKey) { + $tokenValue = ConfigurationResolver::env($configKey); + if (empty($tokenValue)) { + return Promise\Create::rejectionFor( + new TokenException( + "No token found in environment variable " . + ConfigurationResolver::$envPrefix . strtoupper($configKey) + ) + ); + } + + return Promise\Create::promiseFor(new Token($tokenValue)); + }; + } + + /** + * Create a token provider from a raw token value string. + * Bedrock bearer tokens sourced from env do not have an expiration + * + * @param string $tokenValue The bearer token value + * + * @return callable + */ + public static function fromTokenValue( + string $tokenValue, + ?TokenSource $source = null + ): callable + { + $token = new Token($tokenValue, null, $source); + return self::fromToken($token); + } + + /** + * Create a Bedrock token provider if the service is 'bedrock' and a token is available. + * Sets auth scheme preference to `bearer` auth. + * + * @param array $args Configuration arguments containing 'config' array + * + * @return callable|null Returns a token provider if conditions are met, null otherwise + */ + public static function createIfAvailable(array &$args): ?callable + { + $tokenValue = ConfigurationResolver::env(self::TOKEN_ENV_KEY); + + if ($tokenValue) { + $authSchemePreference = $args['config']['auth_scheme_preference'] ?? []; + array_unshift($authSchemePreference, self::BEARER_AUTH); + $args['config']['auth_scheme_preference'] = $authSchemePreference; + + return self::fromTokenValue($tokenValue, TokenSource::BEARER_SERVICE_ENV_VARS); + } + + return null; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Token/ParsesIniTrait.php b/vendor/aws/aws-sdk-php/src/Token/ParsesIniTrait.php new file mode 100644 index 0000000..b96a6d9 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Token/ParsesIniTrait.php @@ -0,0 +1,44 @@ + $profile) { + // standardize config profile names + $name = str_replace('profile ', '', $name); + $profileData[$name] = $profile; + } + + return $profileData; + } + + /** + * Gets the environment's HOME directory if available. + * + * @return null|string + */ + private static function getHomeDir() + { + // On Linux/Unix-like systems, use the HOME environment variable + if ($homeDir = getenv('HOME')) { + return $homeDir; + } + + // Get the HOMEDRIVE and HOMEPATH values for Windows hosts + $homeDrive = getenv('HOMEDRIVE'); + $homePath = getenv('HOMEPATH'); + + return ($homeDrive && $homePath) ? $homeDrive . $homePath : null; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Token/RefreshableTokenProviderInterface.php b/vendor/aws/aws-sdk-php/src/Token/RefreshableTokenProviderInterface.php new file mode 100644 index 0000000..4c88f3f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Token/RefreshableTokenProviderInterface.php @@ -0,0 +1,23 @@ +refreshToken = $refreshToken; + $this->clientId = $clientId; + $this->clientSecret = $clientSecret; + $this->registrationExpiresAt = $registrationExpiresAt; + $this->region = $region; + $this->startUrl = $startUrl; + } + + /** + * @return bool + */ + public function isExpired() + { + if (isset($this->registrationExpiresAt) + && time() >= $this->registrationExpiresAt + ) { + return false; + } + return $this->expires !== null && time() >= $this->expires; + } + + /** + * @return string|null + */ + public function getRefreshToken() + { + return $this->refreshToken; + } + + /** + * @return string|null + */ + public function getClientId() + { + return $this->clientId; + } + + /** + * @return string|null + */ + public function getClientSecret() + { + return $this->clientSecret; + } + + /** + * @return int|null + */ + public function getRegistrationExpiresAt() + { + return $this->registrationExpiresAt; + } + + /** + * @return string|null + */ + public function getRegion() + { + return $this->region; + } + + /** + * @return string|null + */ + public function getStartUrl() + { + return $this->startUrl; + } + + /** + * Creates an instance of SsoToken from a token data. + * + * @param $tokenData + * + * @return SsoToken + */ + public static function fromTokenData($tokenData): SsoToken + { + return new SsoToken( + $tokenData['accessToken'], + \strtotime($tokenData['expiresAt']), + isset($tokenData['refreshToken']) ? $tokenData['refreshToken'] : null, + isset($tokenData['clientId']) ? $tokenData['clientId'] : null, + isset($tokenData['clientSecret']) ? $tokenData['clientSecret'] : null, + isset($tokenData['registrationExpiresAt']) ? $tokenData['registrationExpiresAt'] : null, + isset($tokenData['region']) ? $tokenData['region'] : null, + isset($tokenData['startUrl']) ? $tokenData['startUrl'] : null + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Token/SsoTokenProvider.php b/vendor/aws/aws-sdk-php/src/Token/SsoTokenProvider.php new file mode 100644 index 0000000..13345a7 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Token/SsoTokenProvider.php @@ -0,0 +1,280 @@ +profileName = $this->resolveProfileName($profileName); + $this->configFilePath = $this->resolveConfigFile($configFilePath); + $this->ssoOidcClient = $ssoOidcClient; + } + + /** + * This method resolves the profile name to be used. The + * profile provided as instantiation argument takes precedence, + * followed by AWS_PROFILE env variable, otherwise `default` is + * used. + * + * @param string|null $argProfileName The profile provided as argument. + * + * @return string + */ + private function resolveProfileName($argProfileName): string + { + if (empty($argProfileName)) { + return getenv(self::ENV_PROFILE) ?: 'default'; + } else { + return $argProfileName; + } + } + + /** + * This method resolves the config file from where the profiles + * are going to be loaded from. If $argFileName is not empty then, + * it takes precedence over the default config file location. + * + * @param string|null $argConfigFilePath The config path provided as argument. + * + * @return string + */ + private function resolveConfigFile($argConfigFilePath): string + { + if (empty($argConfigFilePath)) { + return self::getHomeDir() . '/.aws/config'; + } else{ + return $argConfigFilePath; + } + } + + /** + * Loads cached sso credentials. + * + * @return Promise\PromiseInterface + */ + public function __invoke() + { + return Promise\Coroutine::of(function () { + if (empty($this->configFilePath) || !is_readable($this->configFilePath)) { + throw new TokenException("Cannot read profiles from {$this->configFilePath}"); + } + + $profiles = self::loadProfiles($this->configFilePath); + if (!isset($profiles[$this->profileName])) { + throw new TokenException("Profile `{$this->profileName}` does not exist in {$this->configFilePath}."); + } + + $profile = $profiles[$this->profileName]; + if (empty($profile['sso_session'])) { + throw new TokenException( + "Profile `{$this->profileName}` in {$this->configFilePath} must contain an sso_session." + ); + } + + $ssoSessionName = $profile['sso_session']; + $this->ssoSessionName = $ssoSessionName; + $profileSsoSession = 'sso-session ' . $ssoSessionName; + if (empty($profiles[$profileSsoSession])) { + throw new TokenException( + "Sso session `{$ssoSessionName}` does not exist in {$this->configFilePath}" + ); + } + + $sessionProfileData = $profiles[$profileSsoSession]; + foreach (['sso_start_url', 'sso_region'] as $requiredProp) { + if (empty($sessionProfileData[$requiredProp])) { + throw new TokenException( + "Sso session `{$ssoSessionName}` in {$this->configFilePath} is missing the required property `{$requiredProp}`" + ); + } + } + + $tokenData = $this->refresh(); + $tokenLocation = self::getTokenLocation($ssoSessionName); + $this->validateTokenData($tokenLocation, $tokenData); + $ssoToken = SsoToken::fromTokenData($tokenData); + // To make sure the token is not expired + if ($ssoToken->isExpired()) { + throw new TokenException("Cached SSO token returned an expired token."); + } + + yield $ssoToken; + }); + } + + /** + * This method attempt to refresh when possible. + * If a refresh is not possible then it just returns + * the current token data as it is. + * + * @return array + * @throws TokenException + */ + public function refresh(): array + { + $tokenLocation = self::getTokenLocation($this->ssoSessionName); + $tokenData = $this->getTokenData($tokenLocation); + if (!$this->shouldAttemptRefresh()) { + return $tokenData; + } + + if (null === $this->ssoOidcClient) { + throw new TokenException( + "Cannot refresh this token without an 'ssooidcClient' " + ); + } + + foreach (['clientId', 'clientSecret', 'refreshToken'] as $requiredProp) { + if (empty($tokenData[$requiredProp])) { + throw new TokenException( + "Cannot refresh this token without `{$requiredProp}` being set" + ); + } + } + + $response = $this->ssoOidcClient->createToken([ + 'clientId' => $tokenData['clientId'], + 'clientSecret' => $tokenData['clientSecret'], + 'grantType' => 'refresh_token', // REQUIRED + 'refreshToken' => $tokenData['refreshToken'], + ]); + if ($response['@metadata']['statusCode'] !== 200) { + throw new TokenException('Unable to create a new sso token'); + } + + $tokenData['accessToken'] = $response['accessToken']; + $tokenData['expiresAt'] = time () + $response['expiresIn']; + $tokenData['refreshToken'] = $response['refreshToken']; + + return $this->writeNewTokenDataToDisk($tokenData, $tokenLocation); + } + + /** + * This method checks for whether a token refresh should happen. + * It will return true just if more than 30 seconds has happened + * since last refresh, and if the expiration is within a 5-minutes + * window from the current time. + * + * @return bool + */ + public function shouldAttemptRefresh(): bool + { + $tokenLocation = self::getTokenLocation($this->ssoSessionName); + $tokenData = $this->getTokenData($tokenLocation); + if (empty($tokenData['expiresAt'])) { + throw new TokenException( + "Token file at $tokenLocation must contain an expiration date" + ); + } + + $tokenExpiresAt = strtotime($tokenData['expiresAt']); + $lastRefreshAt = filemtime($tokenLocation); + $now = \time(); + + // If last refresh happened after 30 seconds + // and if the token expiration is in the 5 minutes window + return ($now - $lastRefreshAt) > self::REFRESH_ATTEMPT_WINDOW_IN_SECS + && ($tokenExpiresAt - $now) < self::REFRESH_WINDOW_IN_SECS; + } + + /** + * @param $sso_session + * @return string + */ + public static function getTokenLocation($sso_session): string + { + return self::getHomeDir() + . '/.aws/sso/cache/' + . mb_convert_encoding(sha1($sso_session), "UTF-8") + . ".json"; + } + + /** + * @param $tokenLocation + * @return array + */ + function getTokenData($tokenLocation): array + { + if (empty($tokenLocation) || !is_readable($tokenLocation)) { + throw new TokenException("Unable to read token file at {$tokenLocation}"); + } + + return json_decode(file_get_contents($tokenLocation), true); + } + + /** + * @param $tokenData + * @param $tokenLocation + * @return mixed + */ + private function validateTokenData($tokenLocation, $tokenData) + { + foreach (['accessToken', 'expiresAt'] as $requiredProp) { + if (empty($tokenData[$requiredProp])) { + throw new TokenException( + "Token file at {$tokenLocation} must contain the required property `{$requiredProp}`" + ); + } + } + + $expiration = strtotime($tokenData['expiresAt']); + if ($expiration === false) { + throw new TokenException("Cached SSO token returned an invalid expiration"); + } elseif ($expiration < time()) { + throw new TokenException("Cached SSO token returned an expired token"); + } + + return $tokenData; + } + + /** + * @param array $tokenData + * @param string $tokenLocation + * + * @return array + */ + private function writeNewTokenDataToDisk(array $tokenData, $tokenLocation): array + { + $tokenData['expiresAt'] = gmdate( + 'Y-m-d\TH:i:s\Z', + $tokenData['expiresAt'] + ); + file_put_contents($tokenLocation, json_encode(array_filter($tokenData))); + + return $tokenData; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Token/Token.php b/vendor/aws/aws-sdk-php/src/Token/Token.php new file mode 100644 index 0000000..69b09dd --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Token/Token.php @@ -0,0 +1,127 @@ +token = $token; + $this->expires = $expires; + $this->source = $source; + } + + /** + * Sets the state of a token object + * + * @param array $state array containing 'token' and 'expires' + */ + public static function __set_state(array $state) + { + return new self( + $state['token'], + $state['expires'] + ); + } + + /** + * @return string + */ + public function getToken() + { + return $this->token; + } + + /** + * @return int + */ + public function getExpiration() + { + return $this->expires; + } + + /** + * @return string|null + */ + public function getSource(): ?string + { + return $this->source?->value; + } + + /** + * @return bool + */ + public function isExpired() + { + return $this->expires !== null && time() >= $this->expires; + } + + /** + * @return array + */ + public function toArray() + { + return [ + 'token' => $this->token, + 'expires' => $this->expires, + 'source' => $this->source?->value + ]; + } + + /** + * @return string + */ + public function serialize() + { + return json_encode($this->__serialize()); + } + + /** + * Sets the state of the object from serialized json data + */ + public function unserialize($serialized) + { + $data = json_decode($serialized, true); + + $this->__unserialize($data); + } + + /** + * @return array + */ + public function __serialize() + { + return $this->toArray(); + } + + /** + * Sets the state of this object from an array + */ + public function __unserialize($data) + { + $this->token = $data['token']; + $this->expires = $data['expires']; + $this->source = isset($data['source']) + ? TokenSource::from($data['source']) + : null; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Token/TokenAuthorization.php b/vendor/aws/aws-sdk-php/src/Token/TokenAuthorization.php new file mode 100644 index 0000000..3fab516 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Token/TokenAuthorization.php @@ -0,0 +1,24 @@ + + * use Aws\Token\TokenProvider; + * $provider = TokenProvider::defaultProvider(); + * // Returns a TokenInterface or throws. + * $token = $provider()->wait(); + * + * + * Token providers can be composed to create a token using conditional + * logic that can create different tokens in different environments. You + * can compose multiple providers into a single provider using + * {@see Aws\Token\TokenProvider::chain}. This function accepts + * providers as variadic arguments and returns a new function that will invoke + * each provider until a token is successfully returned. + */ +class TokenProvider +{ + const ENV_PROFILE = 'AWS_PROFILE'; + + use ParsesIniTrait; + + /** + * Create a default token provider tha checks for cached a SSO token from + * the CLI + * + * This provider is automatically wrapped in a memoize function that caches + * previously provided tokens. + * + * @param array $config Optional array of token provider options. + * + * @return callable + */ + public static function defaultProvider(array $config = []) + { + $cacheable = [ + 'sso', + ]; + + $defaultChain = []; + + if (!isset($config['use_aws_shared_config_files']) + || $config['use_aws_shared_config_files'] !== false + ) { + $profileName = getenv(self::ENV_PROFILE) ?: 'default'; + $defaultChain['sso'] = self::sso( + $profileName, + self::getHomeDir() . '/.aws/config', + $config + ); + } + + if (isset($config['token']) + && $config['token'] instanceof CacheInterface + ) { + foreach ($cacheable as $provider) { + if (isset($defaultChain[$provider])) { + $defaultChain[$provider] = self::cache( + $defaultChain[$provider], + $config['token'], + 'aws_cached_' . $provider . '_token' + ); + } + } + } + + return self::memoize( + call_user_func_array( + [__CLASS__, 'chain'], + array_values($defaultChain) + ) + ); + } + + /** + * Create a token provider function from a static token. + * + * @param TokenInterface $token + * + * @return callable + */ + public static function fromToken(TokenInterface $token) + { + $promise = Promise\Create::promiseFor($token); + + return static function () use ($promise) { + return $promise; + }; + } + + /** + * Creates an aggregate token provider that invokes the provided + * variadic providers one after the other until a provider returns + * a token. + * + * @return callable + */ + public static function chain() + { + $links = func_get_args(); + //Common use case for when aws_shared_config_files is false + if (empty($links)) { + return static function () { + return Promise\Create::promiseFor(false); + }; + } + + return static function () use ($links) { + /** @var callable $parent */ + $parent = array_shift($links); + $promise = $parent(); + while ($next = array_shift($links)) { + $promise = $promise->otherwise($next); + } + return $promise; + }; + } + + /** + * Wraps a token provider and caches a previously provided token. + * Ensures that cached tokens are refreshed when they expire. + * + * @param callable $provider Token provider function to wrap. + * @return callable + */ + public static function memoize(callable $provider) + { + return static function () use ($provider) { + static $result; + static $isConstant; + + // Constant tokens will be returned constantly. + if ($isConstant) { + return $result; + } + + // Create the initial promise that will be used as the cached value + // until it expires. + if (null === $result) { + $result = $provider(); + } + + // Return a token that could expire and refresh when needed. + return $result + ->then(function (TokenInterface $token) use ($provider, &$isConstant, &$result) { + // Determine if the token is constant. + if (!$token->getExpiration()) { + $isConstant = true; + return $token; + } + + if (!$token->isExpired()) { + return $token; + } + return $result = $provider(); + }) + ->otherwise(function($reason) use (&$result) { + // Cleanup rejected promise. + $result = null; + return Promise\Create::promiseFor(null); + }); + }; + } + + /** + * Wraps a token provider and saves provided token in an + * instance of Aws\CacheInterface. Forwards calls when no token found + * in cache and updates cache with the results. + * + * @param callable $provider Token provider function to wrap + * @param CacheInterface $cache Cache to store the token + * @param string|null $cacheKey (optional) Cache key to use + * + * @return callable + */ + public static function cache( + callable $provider, + CacheInterface $cache, + $cacheKey = null + ){ + $cacheKey = $cacheKey ?: 'aws_cached_token'; + + return static function () use ($provider, $cache, $cacheKey) { + $found = $cache->get($cacheKey); + if (is_array($found) && isset($found['token'])) { + $foundToken = $found['token']; + if ($foundToken instanceof TokenInterface) { + if (!$foundToken->isExpired()) { + return Promise\Create::promiseFor($foundToken); + } + if (isset($found['refreshMethod']) && is_callable($found['refreshMethod'])) { + return Promise\Create::promiseFor($found['refreshMethod']()); + } + } + } + + return $provider() + ->then(function (TokenInterface $token) use ( + $cache, + $cacheKey + ) { + $cache->set( + $cacheKey, + ['token' => $token], + null === $token->getExpiration() ? + 0 : $token->getExpiration() - time() + ); + + return $token; + }); + }; + } + + /** + * Gets profiles from the ~/.aws/config ini file + */ + private static function loadDefaultProfiles() + { + $profiles = []; + $configFile = self::getHomeDir() . '/.aws/config'; + + if (file_exists($configFile)) { + $configProfileData = \Aws\parse_ini_file($configFile, true, INI_SCANNER_RAW); + foreach ($configProfileData as $name => $profile) { + // standardize config profile names + $name = str_replace('profile ', '', $name); + if (!isset($profiles[$name])) { + $profiles[$name] = $profile; + } + } + } + + return $profiles; + } + + private static function reject($msg) + { + return new Promise\RejectedPromise(new TokenException($msg)); + } + + /** + * Token provider that creates a token from cached sso credentials + * + * @param string $profileName the name of the ini profile name + * @param string $filename the location of the ini file + * @param array $config configuration options + * + * @return SsoTokenProvider + * @see Aws\Token\SsoTokenProvider for $config details. + */ + public static function sso( + $profileName, + $filename, + $config = [] + ){ + $ssoClient = $config['ssoClient'] ?? null; + + return new SsoTokenProvider($profileName, $filename, $ssoClient); + } +} diff --git a/vendor/aws/aws-sdk-php/src/Token/TokenSource.php b/vendor/aws/aws-sdk-php/src/Token/TokenSource.php new file mode 100644 index 0000000..b9e1abe --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Token/TokenSource.php @@ -0,0 +1,7 @@ + '[TOKEN]', + ]; + + private static $authStrings = [ + // S3Signature + '/AWSAccessKeyId=[A-Z0-9]{20}&/i' => 'AWSAccessKeyId=[KEY]&', + // SignatureV4 Signature and S3Signature + '/Signature=.+/i' => 'Signature=[SIGNATURE]', + // SignatureV4 access key ID + '/Credential=[A-Z0-9]{20}\//i' => 'Credential=[KEY]/', + // S3 signatures + '/AWS [A-Z0-9]{20}:.+/' => 'AWS AKI[KEY]:[SIGNATURE]', + // STS Presigned URLs + '/X-Amz-Security-Token=[^&]+/i' => 'X-Amz-Security-Token=[TOKEN]', + // Crypto *Stream Keys + '/\["key.{27,36}Stream.{9}\]=>\s+.{7}\d{2}\) "\X{16,64}"/U' => '["key":[CONTENT KEY]]', + ]; + + /** + * Configuration array can contain the following key value pairs. + * + * - logfn: (callable) Function that is invoked with log messages. By + * default, PHP's "echo" function will be utilized. + * - stream_size: (int) When the size of a stream is greater than this + * number, the stream data will not be logged. Set to "0" to not log any + * stream data. + * - scrub_auth: (bool) Set to false to disable the scrubbing of auth data + * from the logged messages. + * - http: (bool) Set to false to disable the "debug" feature of lower + * level HTTP adapters (e.g., verbose curl output). + * - auth_strings: (array) A mapping of authentication string regular + * expressions to scrubbed strings. These mappings are passed directly to + * preg_replace (e.g., preg_replace($key, $value, $debugOutput) if + * "scrub_auth" is set to true. + * - auth_headers: (array) A mapping of header names known to contain + * sensitive data to what the scrubbed value should be. The value of any + * headers contained in this array will be replaced with the if + * "scrub_auth" is set to true. + */ + public function __construct(array $config = [], ?Service $service = null) + { + $this->config = $config + [ + 'logfn' => function ($value) { echo $value; }, + 'stream_size' => 524288, + 'scrub_auth' => true, + 'http' => true, + 'auth_strings' => [], + 'auth_headers' => [], + ]; + + $this->config['auth_strings'] += self::$authStrings; + $this->config['auth_headers'] += self::$authHeaders; + $this->service = $service; + } + + public function __invoke($step, $name) + { + $this->prevOutput = $this->prevInput = []; + + return function (callable $next) use ($step, $name) { + return function ( + CommandInterface $command, + $request = null + ) use ($next, $step, $name) { + $this->createHttpDebug($command); + $start = microtime(true); + $this->stepInput([ + 'step' => $step, + 'name' => $name, + 'request' => $this->requestArray($request), + 'command' => $this->commandArray($command) + ]); + + return $next($command, $request)->then( + function ($value) use ($step, $name, $command, $start) { + $this->flushHttpDebug($command); + $this->stepOutput($start, [ + 'step' => $step, + 'name' => $name, + 'result' => $this->resultArray($value), + 'error' => null + ]); + return $value; + }, + function ($reason) use ($step, $name, $start, $command) { + $this->flushHttpDebug($command); + $this->stepOutput($start, [ + 'step' => $step, + 'name' => $name, + 'result' => null, + 'error' => $this->exceptionArray($reason) + ]); + return new RejectedPromise($reason); + } + ); + }; + }; + } + + private function stepInput($entry) + { + static $keys = ['command', 'request']; + $this->compareStep($this->prevInput, $entry, '-> Entering', $keys); + $this->write("\n"); + $this->prevInput = $entry; + } + + private function stepOutput($start, $entry) + { + static $keys = ['result', 'error']; + $this->compareStep($this->prevOutput, $entry, '<- Leaving', $keys); + $totalTime = microtime(true) - $start; + $this->write(" Inclusive step time: " . $totalTime . "\n\n"); + $this->prevOutput = $entry; + } + + private function compareStep(array $a, array $b, $title, array $keys) + { + $changes = []; + foreach ($keys as $key) { + $av = isset($a[$key]) ? $a[$key] : null; + $bv = isset($b[$key]) ? $b[$key] : null; + $this->compareArray($av, $bv, $key, $changes); + } + $str = "\n{$title} step {$b['step']}, name '{$b['name']}'"; + $str .= "\n" . str_repeat('-', strlen($str) - 1) . "\n\n "; + $str .= $changes + ? implode("\n ", str_replace("\n", "\n ", $changes)) + : 'no changes'; + $this->write($str . "\n"); + } + + private function commandArray(CommandInterface $cmd) + { + return [ + 'instance' => spl_object_hash($cmd), + 'name' => $cmd->getName(), + 'params' => $this->getRedactedArray($cmd) + ]; + } + + private function requestArray($request = null) + { + return !$request instanceof RequestInterface + ? [] + : array_filter([ + 'instance' => spl_object_hash($request), + 'method' => $request->getMethod(), + 'headers' => $this->redactHeaders($request->getHeaders()), + 'body' => $this->streamStr($request->getBody()), + 'scheme' => $request->getUri()->getScheme(), + 'port' => $request->getUri()->getPort(), + 'path' => $request->getUri()->getPath(), + 'query' => $request->getUri()->getQuery(), + ]); + } + + private function responseArray(?ResponseInterface $response = null) + { + return !$response ? [] : [ + 'instance' => spl_object_hash($response), + 'statusCode' => $response->getStatusCode(), + 'headers' => $this->redactHeaders($response->getHeaders()), + 'body' => $this->streamStr($response->getBody()) + ]; + } + + private function resultArray($value) + { + return $value instanceof ResultInterface + ? [ + 'instance' => spl_object_hash($value), + 'data' => $value->toArray() + ] : $value; + } + + private function exceptionArray($e) + { + if (!($e instanceof \Exception)) { + return $e; + } + + $result = [ + 'instance' => spl_object_hash($e), + 'class' => get_class($e), + 'message' => $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'trace' => $e->getTraceAsString(), + ]; + + if ($e instanceof AwsException) { + $result += [ + 'type' => $e->getAwsErrorType(), + 'code' => $e->getAwsErrorCode(), + 'requestId' => $e->getAwsRequestId(), + 'statusCode' => $e->getStatusCode(), + 'result' => $this->resultArray($e->getResult()), + 'request' => $this->requestArray($e->getRequest()), + 'response' => $this->responseArray($e->getResponse()), + ]; + } + + return $result; + } + + private function compareArray($a, $b, $path, array &$diff) + { + if ($a === $b) { + return; + } + + if (is_array($a)) { + $b = (array) $b; + $keys = array_unique(array_merge(array_keys($a), array_keys($b))); + foreach ($keys as $k) { + if (!array_key_exists($k, $a)) { + $this->compareArray(null, $b[$k], "{$path}.{$k}", $diff); + } elseif (!array_key_exists($k, $b)) { + $this->compareArray($a[$k], null, "{$path}.{$k}", $diff); + } else { + $this->compareArray($a[$k], $b[$k], "{$path}.{$k}", $diff); + } + } + } elseif ($a !== null && $b === null) { + $diff[] = "{$path} was unset"; + } elseif ($a === null && $b !== null) { + $diff[] = sprintf("%s was set to %s", $path, $this->str($b)); + } else { + $diff[] = sprintf("%s changed from %s to %s", $path, $this->str($a), $this->str($b)); + } + } + + private function str($value) + { + if (is_scalar($value)) { + return (string) $value; + } + + if ($value instanceof \Exception) { + $value = $this->exceptionArray($value); + } + + ob_start(); + var_dump($value); + return ob_get_clean(); + } + + private function streamStr(StreamInterface $body) + { + return $body->getSize() < $this->config['stream_size'] + ? (string) $body + : 'stream(size=' . $body->getSize() . ')'; + } + + private function createHttpDebug(CommandInterface $command) + { + if ($this->config['http'] && !isset($command['@http']['debug'])) { + $command['@http']['debug'] = fopen('php://temp', 'w+'); + } + } + + private function flushHttpDebug(CommandInterface $command) + { + if ($res = $command['@http']['debug']) { + if (is_resource($res)) { + rewind($res); + $this->write(stream_get_contents($res)); + fclose($res); + } + $command['@http']['debug'] = null; + } + } + + private function write($value) + { + if ($this->config['scrub_auth']) { + foreach ($this->config['auth_strings'] as $pattern => $replacement) { + $value = preg_replace_callback( + $pattern, + function ($matches) use ($replacement) { + return $replacement; + }, + $value + ); + } + } + + call_user_func($this->config['logfn'], $value); + } + + private function redactHeaders(array $headers) + { + if ($this->config['scrub_auth']) { + $headers = $this->config['auth_headers'] + $headers; + } + + return $headers; + } + + /** + * @param CommandInterface $cmd + * @return array + */ + private function getRedactedArray(CommandInterface $cmd) + { + if (!isset($this->service["shapes"])) { + return $cmd->toArray(); + } + $shapes = $this->service["shapes"]; + $cmdArray = $cmd->toArray(); + $iterator = new RecursiveIteratorIterator( + new RecursiveArrayIterator($cmdArray), + RecursiveIteratorIterator::SELF_FIRST + ); + foreach ($iterator as $parameter => $value) { + if (isset($shapes[$parameter]['sensitive']) && + $shapes[$parameter]['sensitive'] === true + ) { + $redactedValue = is_string($value) ? "[{$parameter}]" : ["[{$parameter}]"]; + $currentDepth = $iterator->getDepth(); + for ($subDepth = $currentDepth; $subDepth >= 0; $subDepth--) { + $subIterator = $iterator->getSubIterator($subDepth); + $subIterator->offsetSet( + $subIterator->key(), + ($subDepth === $currentDepth + ? $redactedValue + : $iterator->getSubIterator(($subDepth+1))->getArrayCopy() + ) + ); + } + } + } + return $iterator->getArrayCopy(); + } +} diff --git a/vendor/aws/aws-sdk-php/src/TranscribeService/Exception/TranscribeServiceException.php b/vendor/aws/aws-sdk-php/src/TranscribeService/Exception/TranscribeServiceException.php new file mode 100644 index 0000000..7c9c48f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/TranscribeService/Exception/TranscribeServiceException.php @@ -0,0 +1,9 @@ +nextHandler = $nextHandler; + $this->args = $args; + } + + /** + * When invoked, its injects the user agent header into the + * request headers. + * + * @param CommandInterface $command + * @param RequestInterface $request + * + * @return mixed + */ + public function __invoke(CommandInterface $command, RequestInterface $request) + { + $handler = $this->nextHandler; + $this->metricsBuilder = MetricsBuilder::fromCommand($command); + $request = $this->requestWithUserAgentHeader($request); + + return $handler($command, $request); + } + + /** + * Builds the user agent header value, and injects it into the request + * headers. Then, it returns the mutated request. + * + * @param RequestInterface $request + * + * @return RequestInterface + */ + private function requestWithUserAgentHeader(RequestInterface $request): RequestInterface + { + $uaAppend = $this->args['ua_append'] ?? []; + $userAgentValue = array_merge( + $this->buildUserAgentValue(), + $uaAppend + ); + // It includes the user agent values just for the User-Agent header. + // The reason is that the SEP does not mention appending the + // metrics into the X-Amz-User-Agent header. + return $request->withHeader( + 'User-Agent', + implode(' ', array_merge( + $userAgentValue, + $request->getHeader('User-Agent') + )) + ); + } + + /** + * Builds the different user agent values. + * + * @return array + */ + private function buildUserAgentValue(): array + { + $userAgentValue = []; + foreach (self::$userAgentFnList as $fn) { + $val = $this->{$fn}(); + if (!empty($val)) { + $userAgentValue[] = $val; + } + } + + return $userAgentValue; + } + + /** + * Returns the user agent value for SDK version. + * + * @return string + */ + private function getSdkVersion(): string + { + return 'aws-sdk-php/' . Sdk::VERSION; + } + + /** + * Returns the user agent value for the agent version. + * + * @return string + */ + private function getUserAgentVersion(): string + { + return 'ua/' . self::AGENT_VERSION; + } + + /** + * Returns the user agent value for the hhvm version, but just + * when it is defined. + * + * @return string + */ + private function getHhvmVersion(): string + { + if (defined('HHVM_VERSION')) { + return 'HHVM/' . HHVM_VERSION; + } + + return ""; + } + + /** + * Returns the user agent value for the os version. + * + * @return string + */ + private function getOsName(): string + { + $disabledFunctions = explode(',', ini_get('disable_functions')); + if (function_exists('php_uname') + && !in_array('php_uname', $disabledFunctions, true) + ) { + $osName = "OS/" . php_uname('s') . '#' . php_uname('r'); + if (!empty($osName)) { + return $osName; + } + } + + return ""; + } + + /** + * Returns the user agent value for the php language used. + * + * @return string + */ + private function getLangVersion(): string + { + return 'lang/php#' . phpversion(); + } + + /** + * Returns the user agent value for the execution env. + * + * @return string + */ + private function getExecEnv(): string + { + if ($executionEnvironment = getenv('AWS_EXECUTION_ENV')) { + return $executionEnvironment; + } + + return ""; + } + + /** + * Returns the user agent value for endpoint discovery as cfg. + * This feature is deprecated. + * + * @return string + */ + private function getEndpointDiscovery(): string + { + $args = $this->args; + if (isset($args['endpoint_discovery'])) { + if (($args['endpoint_discovery'] instanceof Configuration + && $args['endpoint_discovery']->isEnabled()) + ) { + return 'cfg/endpoint-discovery'; + } elseif (is_array($args['endpoint_discovery']) + && isset($args['endpoint_discovery']['enabled']) + && $args['endpoint_discovery']['enabled'] + ) { + return 'cfg/endpoint-discovery'; + } + } + + return ""; + } + + /** + * Returns the user agent value for app id, but just when an + * app id was provided as a client argument. + * + * @return string + */ + private function getAppId(): string + { + if (empty($this->args['app_id'])) { + return ""; + } + + return 'app/' . $this->args['app_id']; + } + + /** + * Returns the user agent value for metrics. + * + * @return string + */ + private function getMetrics(): string + { + // Resolve first metrics related to client arguments. + $this->metricsBuilder->resolveAndAppendFromArgs($this->args); + // Build the metrics. + $metricsEncoded = $this->metricsBuilder->build(); + if (empty($metricsEncoded)) { + return ""; + } + + return "m/" . $metricsEncoded; + } +} diff --git a/vendor/aws/aws-sdk-php/src/Waiter.php b/vendor/aws/aws-sdk-php/src/Waiter.php new file mode 100644 index 0000000..59abdcc --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Waiter.php @@ -0,0 +1,285 @@ + 0, 'before' => null]; + + /** @var array Required configuration options. */ + private static $required = [ + 'acceptors', + 'delay', + 'maxAttempts', + 'operation', + ]; + + /** + * The array of configuration options include: + * + * - acceptors: (array) Array of acceptor options + * - delay: (int) Number of seconds to delay between attempts + * - maxAttempts: (int) Maximum number of attempts before failing + * - operation: (string) Name of the API operation to use for polling + * - before: (callable) Invoked before attempts. Accepts command and tries. + * + * @param AwsClientInterface $client Client used to execute commands. + * @param string $name Waiter name. + * @param array $args Command arguments. + * @param array $config Waiter config that overrides defaults. + * + * @throws \InvalidArgumentException if the configuration is incomplete. + */ + public function __construct( + AwsClientInterface $client, + $name, + array $args = [], + array $config = [] + ) { + $this->client = $client; + $this->name = $name; + $this->args = $args; + + // Prepare and validate config. + $this->config = $config + self::$defaults; + foreach (self::$required as $key) { + if (!isset($this->config[$key])) { + throw new \InvalidArgumentException( + 'The provided waiter configuration was incomplete.' + ); + } + } + if ($this->config['before'] && !is_callable($this->config['before'])) { + throw new \InvalidArgumentException( + 'The provided "before" callback is not callable.' + ); + } + MetricsBuilder::appendMetricsCaptureMiddleware( + $this->client->getHandlerList(), + MetricsBuilder::WAITER + ); + } + + /** + * @return Coroutine + */ + public function promise(): PromiseInterface + { + return Coroutine::of(function () { + $name = $this->config['operation']; + for ($state = 'retry', $attempt = 1; $state === 'retry'; $attempt++) { + // Execute the operation. + $args = $this->getArgsForAttempt($attempt); + $command = $this->client->getCommand($name, $args); + try { + if ($this->config['before']) { + $this->config['before']($command, $attempt); + } + $result = (yield $this->client->executeAsync($command)); + } catch (AwsException $e) { + $result = $e; + } + + // Determine the waiter's state and what to do next. + $state = $this->determineState($result); + if ($state === 'success') { + yield $command; + } elseif ($state === 'failed') { + $msg = "The {$this->name} waiter entered a failure state."; + if ($result instanceof \Exception) { + $msg .= ' Reason: ' . $result->getMessage(); + } + yield new RejectedPromise(new \RuntimeException($msg)); + } elseif ($state === 'retry' + && $attempt >= $this->config['maxAttempts'] + ) { + $state = 'failed'; + yield new RejectedPromise(new \RuntimeException( + "The {$this->name} waiter failed after attempt #{$attempt}." + )); + } + } + }); + } + + /** + * Gets the operation arguments for the attempt, including the delay. + * + * @param $attempt Number of the current attempt. + * + * @return mixed integer + */ + private function getArgsForAttempt($attempt) + { + $args = $this->args; + + // Determine the delay. + $delay = ($attempt === 1) + ? $this->config['initDelay'] + : $this->config['delay']; + if (is_callable($delay)) { + $delay = $delay($attempt); + } + + // Set the delay. (Note: handlers except delay in milliseconds.) + if (!isset($args['@http'])) { + $args['@http'] = []; + } + $args['@http']['delay'] = $delay * 1000; + + return $args; + } + + /** + * Determines the state of the waiter attempt, based on the result of + * polling the resource. A waiter can have the state of "success", "failed", + * or "retry". + * + * @param mixed $result + * + * @return string Will be "success", "failed", or "retry" + */ + private function determineState($result) + { + foreach ($this->config['acceptors'] as $acceptor) { + $matcher = 'matches' . ucfirst($acceptor['matcher']); + if ($this->{$matcher}($result, $acceptor)) { + return $acceptor['state']; + } + } + + return $result instanceof \Exception ? 'failed' : 'retry'; + } + + /** + * @param Result $result Result or exception. + * @param array $acceptor Acceptor configuration being checked. + * + * @return bool + */ + private function matchesPath($result, array $acceptor) + { + return $result instanceof ResultInterface + && $acceptor['expected'] === $result->search($acceptor['argument']); + } + + /** + * @param Result $result Result or exception. + * @param array $acceptor Acceptor configuration being checked. + * + * @return bool + */ + private function matchesPathAll($result, array $acceptor) + { + if (!($result instanceof ResultInterface)) { + return false; + } + + $actuals = $result->search($acceptor['argument']) ?: []; + // If is empty or not evaluates to an array it must return false. + if (empty($actuals) || !is_array($actuals)) { + return false; + } + + foreach ($actuals as $actual) { + if ($actual != $acceptor['expected']) { + return false; + } + } + + return true; + } + + /** + * @param Result $result Result or exception. + * @param array $acceptor Acceptor configuration being checked. + * + * @return bool + */ + private function matchesPathAny($result, array $acceptor) + { + if (!($result instanceof ResultInterface)) { + return false; + } + + $actuals = $result->search($acceptor['argument']) ?: []; + // If is empty or not evaluates to an array it must return false. + if (empty($actuals) || !is_array($actuals)) { + return false; + } + + return in_array($acceptor['expected'], $actuals); + } + + /** + * @param Result $result Result or exception. + * @param array $acceptor Acceptor configuration being checked. + * + * @return bool + */ + private function matchesStatus($result, array $acceptor) + { + if ($result instanceof ResultInterface) { + return $acceptor['expected'] == $result['@metadata']['statusCode']; + } + + if ($result instanceof AwsException && $response = $result->getResponse()) { + return $acceptor['expected'] == $response->getStatusCode(); + } + + return false; + } + + /** + * @param Result $result Result or exception. + * @param array $acceptor Acceptor configuration being checked. + * + * @return bool + */ + private function matchesError($result, array $acceptor) + { + // If expected is true then the $result should be an instance of + // AwsException, otherwise it should not. + if (isset($acceptor['expected']) && is_bool($acceptor['expected'])) { + return $acceptor['expected'] === ($result instanceof AwsException); + } + + if ($result instanceof AwsException) { + return $result->isConnectionError() + || $result->getAwsErrorCode() == $acceptor['expected']; + } + + return false; + } +} diff --git a/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php b/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php new file mode 100644 index 0000000..1c602de --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php @@ -0,0 +1,208 @@ +httpHandler = $httpHandler; + $this->parser = $parser; + $this->errorParser = $errorParser; + $this->exceptionClass = $exceptionClass; + $this->collectStats = $collectStats; + } + + /** + * Calls the simpler HTTP specific handler and wraps the returned promise + * with AWS specific values (e.g., a result object or AWS exception). + * + * @param CommandInterface $command Command being executed. + * @param RequestInterface $request Request to send. + * + * @return Promise\PromiseInterface + */ + public function __invoke( + CommandInterface $command, + RequestInterface $request + ) { + $fn = $this->httpHandler; + $options = $command['@http'] ?: []; + $stats = []; + if ($this->collectStats || !empty($options['collect_stats'])) { + $options['http_stats_receiver'] = static function ( + array $transferStats + ) use (&$stats) { + $stats = $transferStats; + }; + } elseif (isset($options['http_stats_receiver'])) { + throw new \InvalidArgumentException('Providing a custom HTTP stats' + . ' receiver to Aws\WrappedHttpHandler is not supported.'); + } + + return Promise\Create::promiseFor($fn($request, $options)) + ->then( + function ( + ResponseInterface $res + ) use ($command, $request, &$stats) { + return $this->parseResponse($command, $request, $res, $stats); + }, + function ($err) use ($request, $command, &$stats) { + if (is_array($err)) { + $err = $this->parseError( + $err, + $request, + $command, + $stats + ); + } + return new Promise\RejectedPromise($err); + } + ); + } + + /** + * @param CommandInterface $command + * @param RequestInterface $request + * @param ResponseInterface $response + * @param array $stats + * + * @return ResultInterface + */ + private function parseResponse( + CommandInterface $command, + RequestInterface $request, + ResponseInterface $response, + array $stats + ) { + $parser = $this->parser; + $status = $response->getStatusCode(); + $result = $status < 300 + ? $parser($command, $response) + : new Result(); + + $metadata = [ + 'statusCode' => $status, + 'effectiveUri' => (string) $request->getUri(), + 'headers' => [], + 'transferStats' => [], + ]; + if (!empty($stats)) { + $metadata['transferStats']['http'] = [$stats]; + } + + // Bring headers into the metadata array. + foreach ($response->getHeaders() as $name => $values) { + $metadata['headers'][strtolower($name)] = $values[0]; + } + + $result['@metadata'] = $metadata; + + return $result; + } + + /** + * Parses a rejection into an AWS error. + * + * @param array $err Rejection error array. + * @param RequestInterface $request Request that was sent. + * @param CommandInterface $command Command being sent. + * @param array $stats Transfer statistics + * + * @return \Exception + */ + private function parseError( + array $err, + RequestInterface $request, + CommandInterface $command, + array $stats + ) { + if (!isset($err['exception'])) { + throw new \RuntimeException('The HTTP handler was rejected without an "exception" key value pair.'); + } + + $serviceError = "AWS HTTP error: " . $err['exception']->getMessage(); + + if (!isset($err['response'])) { + $parts = ['response' => null]; + } else { + try { + $parts = call_user_func( + $this->errorParser, + $err['response'], + $command + ); + $serviceError .= " {$parts['code']} ({$parts['type']}): " + . "{$parts['message']} - " . $err['response']->getBody(); + } catch (ParserException $e) { + $parts = []; + $serviceError .= ' Unable to parse error information from ' + . "response - {$e->getMessage()}"; + } + + $parts['response'] = $err['response']; + } + + $parts['exception'] = $err['exception']; + $parts['request'] = $request; + $parts['connection_error'] = !empty($err['connection_error']); + $parts['transfer_stats'] = $stats; + + return new $this->exceptionClass( + sprintf( + 'Error executing "%s" on "%s"; %s', + $command->getName(), + $request->getUri(), + $serviceError + ), + $command, + $parts, + $err['exception'] + ); + } +} diff --git a/vendor/aws/aws-sdk-php/src/data/aliases.json.php b/vendor/aws/aws-sdk-php/src/data/aliases.json.php new file mode 100644 index 0000000..95dfe44 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/aliases.json.php @@ -0,0 +1,3 @@ + [ 'ApiGatewayV2' => [ '2018-11-29' => [ 'GetApi' => 'GetApiResource', ], ], 'CloudHSM' => [ '2014-05-30' => [ 'GetConfig' => 'GetConfigFiles', ], ], 'GroundStation' => [ '2019-05-23' => [ 'GetConfig' => 'GetMissionProfileConfig', ], ], 'Pinpoint' => [ '2016-12-01' => [ 'GetEndpoint' => 'GetUserEndpoint', 'UpdateEndpoint' => 'UpdateUserEndpoint', 'UpdateEndpointsBatch' => 'UpdateUserEndpointsBatch', ], ], 'AppSync' => [ '2017-07-25' => [ 'GetApi' => 'GetApiResource', ], ], 'AmplifyBackend' => [ '2020-08-11' => [ 'GetToken' => 'GetChallengeToken', ], ], 'IotDeviceAdvisor' => [ '2020-09-18' => [ 'GetEndpoint' => 'GetDeviceAdvisorEndpoint', ], ], 'IoT' => [ '2015-05-28' => [ 'GetCommand' => 'GetDeviceCommand', ], ], 'Redshift Serverless' => [ '2021-04-21' => [ 'GetCredentials' => 'GetDbCredentials', ], ], 'Lambda' => [ '2015-03-31' => [ 'InvokeAsync' => 'InvokeAsynchronous', ], ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/endpoints.json.php b/vendor/aws/aws-sdk-php/src/data/endpoints.json.php new file mode 100644 index 0000000..02341d3 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/endpoints.json.php @@ -0,0 +1,3 @@ + [ [ 'defaults' => [ 'hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => [ 'https', ], 'signatureVersions' => [ 'v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'dnsSuffix' => 'amazonaws.com', 'partition' => 'aws', 'partitionName' => 'AWS Standard', 'regionRegex' => '^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$', 'regions' => [ 'af-south-1' => [ 'description' => 'Africa (Cape Town)', ], 'ap-east-1' => [ 'description' => 'Asia Pacific (Hong Kong)', ], 'ap-east-2' => [ 'description' => 'Asia Pacific (Taipei)', ], 'ap-northeast-1' => [ 'description' => 'Asia Pacific (Tokyo)', ], 'ap-northeast-2' => [ 'description' => 'Asia Pacific (Seoul)', ], 'ap-northeast-3' => [ 'description' => 'Asia Pacific (Osaka)', ], 'ap-south-1' => [ 'description' => 'Asia Pacific (Mumbai)', ], 'ap-south-2' => [ 'description' => 'Asia Pacific (Hyderabad)', ], 'ap-southeast-1' => [ 'description' => 'Asia Pacific (Singapore)', ], 'ap-southeast-2' => [ 'description' => 'Asia Pacific (Sydney)', ], 'ap-southeast-3' => [ 'description' => 'Asia Pacific (Jakarta)', ], 'ap-southeast-4' => [ 'description' => 'Asia Pacific (Melbourne)', ], 'ap-southeast-5' => [ 'description' => 'Asia Pacific (Malaysia)', ], 'ap-southeast-6' => [ 'description' => 'Asia Pacific (New Zealand)', ], 'ap-southeast-7' => [ 'description' => 'Asia Pacific (Thailand)', ], 'ca-central-1' => [ 'description' => 'Canada (Central)', ], 'ca-west-1' => [ 'description' => 'Canada West (Calgary)', ], 'eu-central-1' => [ 'description' => 'Europe (Frankfurt)', ], 'eu-central-2' => [ 'description' => 'Europe (Zurich)', ], 'eu-north-1' => [ 'description' => 'Europe (Stockholm)', ], 'eu-south-1' => [ 'description' => 'Europe (Milan)', ], 'eu-south-2' => [ 'description' => 'Europe (Spain)', ], 'eu-west-1' => [ 'description' => 'Europe (Ireland)', ], 'eu-west-2' => [ 'description' => 'Europe (London)', ], 'eu-west-3' => [ 'description' => 'Europe (Paris)', ], 'il-central-1' => [ 'description' => 'Israel (Tel Aviv)', ], 'me-central-1' => [ 'description' => 'Middle East (UAE)', ], 'me-south-1' => [ 'description' => 'Middle East (Bahrain)', ], 'mx-central-1' => [ 'description' => 'Mexico (Central)', ], 'sa-east-1' => [ 'description' => 'South America (Sao Paulo)', ], 'us-east-1' => [ 'description' => 'US East (N. Virginia)', ], 'us-east-2' => [ 'description' => 'US East (Ohio)', ], 'us-west-1' => [ 'description' => 'US West (N. California)', ], 'us-west-2' => [ 'description' => 'US West (Oregon)', ], ], 'services' => [ 'access-analyzer' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'access-analyzer-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'access-analyzer.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'access-analyzer-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'access-analyzer.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'access-analyzer-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'access-analyzer-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'access-analyzer-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'access-analyzer-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'access-analyzer-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'access-analyzer-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'access-analyzer-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'access-analyzer.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'access-analyzer-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'access-analyzer-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'access-analyzer.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'access-analyzer-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'access-analyzer.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'access-analyzer-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'access-analyzer-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'access-analyzer.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'account' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'account.us-east-1.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'acm' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'acm-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'acm-fips.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'acm-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'acm-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'acm-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'acm-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'acm-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'acm-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'acm-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'acm-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'acm-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'acm-fips.us-west-2.amazonaws.com', ], ], ], 'acm-pca' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'acm-pca-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'acm-pca-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'acm-pca-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'acm-pca-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'acm-pca-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'acm-pca-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'acm-pca-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'acm-pca-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'acm-pca-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'acm-pca-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'acm-pca-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'acm-pca-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'agreement-marketplace' => [ 'endpoints' => [ 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'agreement-marketplace.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'airflow' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'amplify' => [ 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'amplifybackend' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'amplifyuibuilder' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'aoss' => [ 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'api.detective' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'detective.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'detective.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'detective.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'detective.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'detective.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'detective.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'detective.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'api.detective-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'detective-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'detective.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'api.detective-fips.ca-central-1.amazonaws.com', ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'detective.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'detective.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'detective.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'detective.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'detective.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'detective.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'detective.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'detective.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'detective.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'api.detective-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'detective-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'detective.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'api.detective-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'api.detective-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'detective-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'detective.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'api.detective-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'api.detective-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'detective-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'detective.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'api.detective-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'api.detective-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'detective-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'detective.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'api.detective-fips.us-west-2.amazonaws.com', ], ], ], 'api.ecr' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'ecr-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'hostname' => 'api.ecr.af-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 'api.ecr.ap-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'api.ecr.ap-northeast-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'api.ecr.ap-northeast-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 'api.ecr.ap-northeast-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'api.ecr.ap-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 'api.ecr.ap-south-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'api.ecr.ap-southeast-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'api.ecr.ap-southeast-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'hostname' => 'api.ecr.ap-southeast-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'hostname' => 'api.ecr.ap-southeast-4.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'credentialScope' => [ 'region' => 'ap-southeast-5', ], 'hostname' => 'api.ecr.ap-southeast-5.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'credentialScope' => [ 'region' => 'ap-southeast-7', ], 'hostname' => 'api.ecr.ap-southeast-7.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'api.ecr.ca-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'hostname' => 'api.ecr.ca-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'dkr-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ecr-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'dkr-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ecr-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'dkr-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ecr-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'dkr-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ecr-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'api.ecr.eu-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 'api.ecr.eu-central-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'api.ecr.eu-north-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'api.ecr.eu-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 'api.ecr.eu-south-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'api.ecr.eu-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'api.ecr.eu-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'api.ecr.eu-west-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-dkr-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-east-1.amazonaws.com', ], 'fips-dkr-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-east-2.amazonaws.com', ], 'fips-dkr-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-west-1.amazonaws.com', ], 'fips-dkr-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-west-2.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'hostname' => 'api.ecr.il-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'hostname' => 'api.ecr.me-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 'api.ecr.me-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'credentialScope' => [ 'region' => 'mx-central-1', ], 'hostname' => 'api.ecr.mx-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'api.ecr.sa-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'api.ecr.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ecr-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ecr.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'api.ecr.us-east-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ecr-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ecr.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'api.ecr.us-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ecr-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ecr.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'api.ecr.us-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ecr-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ecr.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'api.ecr-public' => [ 'endpoints' => [ 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'api.ecr-public.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr-public.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'api.ecr-public.us-west-2.amazonaws.com', ], ], ], 'api.iotdeviceadvisor' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'api.iotdeviceadvisor.ap-northeast-1.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'api.iotdeviceadvisor.eu-west-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'api.iotdeviceadvisor.us-east-1.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'api.iotdeviceadvisor.us-west-2.amazonaws.com', ], ], ], 'api.iotwireless' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'api.iotwireless.ap-northeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'api.iotwireless.ap-southeast-2.amazonaws.com', ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'api.iotwireless.eu-central-1.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'api.iotwireless.eu-west-1.amazonaws.com', ], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'api.iotwireless.sa-east-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'api.iotwireless.us-east-1.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'api.iotwireless.us-west-2.amazonaws.com', ], ], ], 'api.mediatailor' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-3' => [], 'me-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'api.pricing' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'pricing', ], ], 'endpoints' => [ 'ap-south-1' => [], 'eu-central-1' => [], 'us-east-1' => [], ], ], 'api.sagemaker' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'api-fips.sagemaker.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'api-fips.sagemaker.ca-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'api-fips.sagemaker.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'api-fips.sagemaker.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'api-fips.sagemaker.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'api-fips.sagemaker.us-west-2.amazonaws.com', ], ], ], 'api.tunneling.iot' => [ 'defaults' => [ 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], [ 'dnsSuffix' => 'api.aws', 'hostname' => 'api.iot-tunneling-fips.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'api.aws', 'hostname' => 'api.iot-tunneling.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'api.iot-tunneling.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'api.tunneling.iot-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-west-2.amazonaws.com', ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'api.iot-tunneling.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'api.tunneling.iot-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'api.iot-tunneling.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'api.tunneling.iot-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'api.iot-tunneling.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'api.tunneling.iot-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'api.iot-tunneling.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'api.tunneling.iot-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'apigateway' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'apigateway-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'apigateway-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'apigateway-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'apigateway-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'apigateway-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'apigateway-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'apigateway-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'apigateway-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'apigateway-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'apigateway-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'apigateway-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'apigateway-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'app-integrations' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'appconfig' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'appconfigdata' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'appflow' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'appflow-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'appflow-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'appflow-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'appflow-fips.us-west-2.amazonaws.com', ], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'appflow-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'appflow-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'appflow-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'appflow-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'application-autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'applicationinsights' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'applicationinsights-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'applicationinsights.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'applicationinsights-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'applicationinsights.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'applicationinsights-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'applicationinsights-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'applicationinsights-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'applicationinsights-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'applicationinsights-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'applicationinsights-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'applicationinsights-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'applicationinsights.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'applicationinsights-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'applicationinsights-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'applicationinsights.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'applicationinsights-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'applicationinsights.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'applicationinsights-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'applicationinsights-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'applicationinsights.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'appmesh' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'appmesh.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'appmesh.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'appmesh.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'appmesh.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'appmesh-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'appmesh-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'appmesh.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'appmesh-fips.ca-central-1.amazonaws.com', ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'appmesh.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'appmesh.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'appmesh.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'appmesh.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'appmesh-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'appmesh-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'appmesh.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'appmesh-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'appmesh-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'appmesh-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'appmesh.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'appmesh-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'appmesh-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'appmesh-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'appmesh.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'appmesh-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'appmesh-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'appmesh-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'appmesh.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'appmesh-fips.us-west-2.amazonaws.com', ], ], ], 'apprunner' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'apprunner-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'apprunner-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'apprunner-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'apprunner-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'apprunner-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'apprunner-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'appstream2' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'appstream', ], 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-5' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'appstream2-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'appstream2-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'appstream2-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'appstream2-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'appstream2-fips.us-west-2.amazonaws.com', ], ], ], 'appsync' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'appsync.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'appsync.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'appsync.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'appsync.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'appsync.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'appsync.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'appsync.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'appsync.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'appsync.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'appsync.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'appsync.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'appsync.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'appsync.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'appsync.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'appsync.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'appsync.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'appsync.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'appsync.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'appsync.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'aps' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [], 'ap-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [], 'ap-southeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [], 'eu-north-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'deprecated' => true, ], 'us-east-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'deprecated' => true, ], 'us-west-1' => [], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'deprecated' => true, ], ], ], 'arc-zonal-shift' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'athena' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'athena.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'athena.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'athena.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'athena.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'athena.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'athena.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'athena.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'athena.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'athena.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'athena.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'athena.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'athena.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'athena-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'athena-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'athena.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'athena-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'athena-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'athena.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'athena.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'athena.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'athena.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'athena.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'athena.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'athena.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'athena.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'athena.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'athena-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'athena-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'athena-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'athena-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'athena-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'athena-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'athena.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'athena.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'athena.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'athena.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'athena-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'athena-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'athena.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'athena-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'athena-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'athena.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'athena-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'athena-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'athena.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'athena-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'athena-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'athena.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'auditmanager' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'auditmanager-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'auditmanager-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'auditmanager-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'auditmanager-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'auditmanager-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'auditmanager-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'auditmanager-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'auditmanager-fips.us-west-2.amazonaws.com', ], ], ], 'autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'autoscaling-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'autoscaling-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'autoscaling-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'autoscaling-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'autoscaling-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'autoscaling-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'autoscaling-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'autoscaling-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'autoscaling-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'autoscaling-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'autoscaling-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'autoscaling-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'autoscaling-plans' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'backup' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'backup-gateway' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'batch' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'fips.batch.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'fips.batch.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'fips.batch.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'fips.batch.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'fips.batch.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'fips.batch.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'fips.batch.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'fips.batch.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'fips.batch.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'bedrock' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'bedrock-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'bedrock.ap-northeast-1.amazonaws.com', ], 'bedrock-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'bedrock.ap-northeast-2.amazonaws.com', ], 'bedrock-ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 'bedrock.ap-northeast-3.amazonaws.com', ], 'bedrock-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'bedrock.ap-south-1.amazonaws.com', ], 'bedrock-ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 'bedrock.ap-south-2.amazonaws.com', ], 'bedrock-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'bedrock.ap-southeast-1.amazonaws.com', ], 'bedrock-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'bedrock.ap-southeast-2.amazonaws.com', ], 'bedrock-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'bedrock.ca-central-1.amazonaws.com', ], 'bedrock-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'bedrock.eu-central-1.amazonaws.com', ], 'bedrock-eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 'bedrock.eu-central-2.amazonaws.com', ], 'bedrock-eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'bedrock.eu-north-1.amazonaws.com', ], 'bedrock-eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'bedrock.eu-south-1.amazonaws.com', ], 'bedrock-eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 'bedrock.eu-south-2.amazonaws.com', ], 'bedrock-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'bedrock.eu-west-1.amazonaws.com', ], 'bedrock-eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'bedrock.eu-west-2.amazonaws.com', ], 'bedrock-eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'bedrock.eu-west-3.amazonaws.com', ], 'bedrock-fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'bedrock-fips.ca-central-1.amazonaws.com', ], 'bedrock-fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'bedrock-fips.us-east-1.amazonaws.com', ], 'bedrock-fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'bedrock-fips.us-east-2.amazonaws.com', ], 'bedrock-fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'bedrock-fips.us-west-2.amazonaws.com', ], 'bedrock-runtime-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'bedrock-runtime.ap-northeast-1.amazonaws.com', ], 'bedrock-runtime-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'bedrock-runtime.ap-northeast-2.amazonaws.com', ], 'bedrock-runtime-ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 'bedrock-runtime.ap-northeast-3.amazonaws.com', ], 'bedrock-runtime-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'bedrock-runtime.ap-south-1.amazonaws.com', ], 'bedrock-runtime-ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 'bedrock-runtime.ap-south-2.amazonaws.com', ], 'bedrock-runtime-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'bedrock-runtime.ap-southeast-1.amazonaws.com', ], 'bedrock-runtime-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'bedrock-runtime.ap-southeast-2.amazonaws.com', ], 'bedrock-runtime-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'bedrock-runtime.ca-central-1.amazonaws.com', ], 'bedrock-runtime-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'bedrock-runtime.eu-central-1.amazonaws.com', ], 'bedrock-runtime-eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 'bedrock-runtime.eu-central-2.amazonaws.com', ], 'bedrock-runtime-eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'bedrock-runtime.eu-north-1.amazonaws.com', ], 'bedrock-runtime-eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'bedrock-runtime.eu-south-1.amazonaws.com', ], 'bedrock-runtime-eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 'bedrock-runtime.eu-south-2.amazonaws.com', ], 'bedrock-runtime-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'bedrock-runtime.eu-west-1.amazonaws.com', ], 'bedrock-runtime-eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'bedrock-runtime.eu-west-2.amazonaws.com', ], 'bedrock-runtime-eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'bedrock-runtime.eu-west-3.amazonaws.com', ], 'bedrock-runtime-fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'bedrock-runtime-fips.ca-central-1.amazonaws.com', ], 'bedrock-runtime-fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'bedrock-runtime-fips.us-east-1.amazonaws.com', ], 'bedrock-runtime-fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'bedrock-runtime-fips.us-east-2.amazonaws.com', ], 'bedrock-runtime-fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'bedrock-runtime-fips.us-west-2.amazonaws.com', ], 'bedrock-runtime-sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'bedrock-runtime.sa-east-1.amazonaws.com', ], 'bedrock-runtime-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'bedrock-runtime.us-east-1.amazonaws.com', ], 'bedrock-runtime-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'bedrock-runtime.us-east-2.amazonaws.com', ], 'bedrock-runtime-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'bedrock-runtime.us-west-2.amazonaws.com', ], 'bedrock-sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'bedrock.sa-east-1.amazonaws.com', ], 'bedrock-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'bedrock.us-east-1.amazonaws.com', ], 'bedrock-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'bedrock.us-east-2.amazonaws.com', ], 'bedrock-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'bedrock.us-west-2.amazonaws.com', ], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'billingconductor' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'billingconductor.us-east-1.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'braket' => [ 'endpoints' => [ 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'braket.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'braket.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'braket.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'braket.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'braket.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'budgets' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'budgets.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'cases' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => [ 'deprecated' => true, ], 'fips-us-west-2' => [ 'deprecated' => true, ], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], ], ], 'cassandra' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'cassandra-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'cassandra-fips.us-west-2.amazonaws.com', ], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'cassandra-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'cassandra-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'catalog.marketplace' => [ 'endpoints' => [ 'us-east-1' => [], ], ], 'ce' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'ce.us-east-1.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'chime' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'chime.us-east-1.amazonaws.com', 'protocols' => [ 'https', ], ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'cleanrooms' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'cleanrooms.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'cleanrooms.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'cleanrooms.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'cleanrooms.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'cleanrooms.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'cleanrooms.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'cleanrooms.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'cleanrooms.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'cleanrooms-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'cleanrooms-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'cleanrooms-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'cleanrooms-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cleanrooms-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cleanrooms.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'cleanrooms-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cleanrooms-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cleanrooms.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'cleanrooms-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cleanrooms-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cleanrooms.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'cloud9' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'cloud9-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloud9-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'cloud9-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'cloud9-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'cloud9-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'cloud9-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'cloud9-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'cloud9-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloud9-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'cloud9-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloud9-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'cloud9-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloud9-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'cloud9-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloud9-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], ], ], 'cloudcontrolapi' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloudcontrolapi-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cloudcontrolapi.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloudcontrolapi-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cloudcontrolapi.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'cloudcontrolapi-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'cloudcontrolapi-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'cloudcontrolapi-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'cloudcontrolapi-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'cloudcontrolapi-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'cloudcontrolapi-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloudcontrolapi-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cloudcontrolapi.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloudcontrolapi-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cloudcontrolapi.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloudcontrolapi-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cloudcontrolapi.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloudcontrolapi-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cloudcontrolapi.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'clouddirectory' => [ 'endpoints' => [ 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'cloudformation' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudformation-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'cloudformation-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'cloudformation-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'cloudformation-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudformation-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'cloudformation-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'cloudformation-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'cloudformation-fips.us-west-2.amazonaws.com', ], ], ], 'cloudfront' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'cloudfront.amazonaws.com', 'protocols' => [ 'http', 'https', ], ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'cloudhsm' => [ 'endpoints' => [ 'us-east-1' => [], ], ], 'cloudhsmv2' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'cloudhsm', ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'cloudsearch' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'cloudtrail' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'cloudtrail-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'cloudtrail-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'cloudtrail-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'cloudtrail-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudtrail-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'cloudtrail-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudtrail-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'cloudtrail-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'cloudtrail-data' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'codeartifact' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'codebuild' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'codebuild-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'codebuild-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'codebuild-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'codebuild-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'codebuild-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'codebuild-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'codebuild-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'codebuild-fips.us-west-2.amazonaws.com', ], ], ], 'codecatalyst' => [ 'endpoints' => [ 'aws-global' => [ 'hostname' => 'codecatalyst.global.api.aws', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'codecommit' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'codecommit-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.ca-central-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.ca-central-1.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'codecommit-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'codecommit-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'codecommit-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'codecommit-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.us-west-2.amazonaws.com', ], ], ], 'codedeploy' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'codedeploy-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'codedeploy-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'codedeploy-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'codedeploy-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'codedeploy-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'codedeploy-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'codedeploy-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'codedeploy-fips.us-west-2.amazonaws.com', ], ], ], 'codeguru-profiler' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'codeguru-reviewer' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'codepipeline' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'codepipeline-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'codepipeline-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'codepipeline-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'codepipeline-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'codepipeline-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'codepipeline-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'codepipeline-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'codepipeline-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'codepipeline-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'codepipeline-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'codestar-connections' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'codestar-notifications' => [ 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'cognito-identity' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.af-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-northeast-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-northeast-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-northeast-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-south-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-southeast-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-southeast-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-southeast-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-southeast-4.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ap-southeast-5.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ca-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.ca-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.eu-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.eu-central-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.eu-north-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.eu-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.eu-south-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.eu-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.eu-west-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.eu-west-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'cognito-identity-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'cognito-identity-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'cognito-identity-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'cognito-identity-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.il-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.me-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.me-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.sa-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity-fips.us-east-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-identity-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-identity.us-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'cognito-identity-fips.us-east-2.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-identity-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-identity.us-east-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity-fips.us-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-identity-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-identity.us-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'cognito-identity-fips.us-west-2.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-identity-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-identity.us-west-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'cognito-idp' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.af-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-northeast-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-northeast-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-northeast-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-south-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-southeast-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-southeast-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-southeast-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-southeast-4.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ap-southeast-5.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ca-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.ca-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.eu-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.eu-central-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.eu-north-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.eu-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.eu-south-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.eu-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.eu-west-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.eu-west-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'cognito-idp-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'cognito-idp-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'cognito-idp-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'cognito-idp-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.il-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.me-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.me-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.sa-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp-fips.us-east-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-idp-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-idp.us-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'cognito-idp-fips.us-east-2.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-idp-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-idp.us-east-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp-fips.us-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-idp-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-idp.us-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'cognito-idp-fips.us-west-2.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-idp-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-idp.us-west-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'cognito-sync' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'comprehend' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'comprehend.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'comprehend.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'comprehend.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'comprehend.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'comprehend.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'comprehend-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'comprehend-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'comprehend.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'comprehend.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'comprehend.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'comprehend.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'comprehend-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'comprehend-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'comprehend-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'comprehend-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'comprehend-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'comprehend-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'comprehend.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'comprehend-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'comprehend-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'comprehend.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'comprehend-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'comprehend-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'comprehend.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'comprehendmedical' => [ 'endpoints' => [ 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'comprehendmedical-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'comprehendmedical-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'comprehendmedical-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'comprehendmedical-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'comprehendmedical-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'comprehendmedical-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'comprehendmedical-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'comprehendmedical-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'compute-optimizer' => [ 'endpoints' => [ 'af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'hostname' => 'compute-optimizer.af-south-1.amazonaws.com', ], 'ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 'compute-optimizer.ap-east-1.amazonaws.com', ], 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'compute-optimizer.ap-northeast-1.amazonaws.com', ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'compute-optimizer.ap-northeast-2.amazonaws.com', ], 'ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 'compute-optimizer.ap-northeast-3.amazonaws.com', ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'compute-optimizer.ap-south-1.amazonaws.com', ], 'ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 'compute-optimizer.ap-south-2.amazonaws.com', ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'compute-optimizer.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'compute-optimizer.ap-southeast-2.amazonaws.com', ], 'ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'hostname' => 'compute-optimizer.ap-southeast-3.amazonaws.com', ], 'ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'hostname' => 'compute-optimizer.ap-southeast-4.amazonaws.com', ], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'compute-optimizer.ca-central-1.amazonaws.com', ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'compute-optimizer.eu-central-1.amazonaws.com', ], 'eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 'compute-optimizer.eu-central-2.amazonaws.com', ], 'eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'compute-optimizer.eu-north-1.amazonaws.com', ], 'eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'compute-optimizer.eu-south-1.amazonaws.com', ], 'eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 'compute-optimizer.eu-south-2.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'compute-optimizer.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'compute-optimizer.eu-west-2.amazonaws.com', ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'compute-optimizer.eu-west-3.amazonaws.com', ], 'il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'hostname' => 'compute-optimizer.il-central-1.amazonaws.com', ], 'me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'hostname' => 'compute-optimizer.me-central-1.amazonaws.com', ], 'me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 'compute-optimizer.me-south-1.amazonaws.com', ], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'compute-optimizer.sa-east-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'compute-optimizer.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'compute-optimizer.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'compute-optimizer.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'compute-optimizer.us-west-2.amazonaws.com', ], ], ], 'config' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'config-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'config-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'config-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'config-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'config-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'config-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'config-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'config-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'connect' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'connect-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'connect-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'connect-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'connect-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'connect-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'connect-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'connect-campaigns' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'connect-campaigns-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'connect-campaigns-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'connect-campaigns-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'connect-campaigns-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'contact-lens' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'controltower' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'controltower-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'controltower-fips.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'controltower-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'controltower-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'controltower-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'controltower-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'controltower-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'controltower-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'controltower-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'controltower-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'controltower-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'controltower-fips.us-west-2.amazonaws.com', ], ], ], 'cost-optimization-hub' => [ 'endpoints' => [ 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'cost-optimization-hub.us-east-1.amazonaws.com', ], ], ], 'cur' => [ 'endpoints' => [ 'us-east-1' => [], ], ], 'data-ats.iot' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-5' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-west-2.amazonaws.com', ], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'data.iot' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-west-2.amazonaws.com', ], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'data.jobs.iot' => [ 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-5' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'data.jobs.iot-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'data.jobs.iot-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'data.jobs.iot-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'data.jobs.iot-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'data.jobs.iot-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'data.jobs.iot-fips.us-west-2.amazonaws.com', ], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'data.jobs.iot-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'data.jobs.iot-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'data.jobs.iot-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'data.jobs.iot-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'data.mediastore' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'databrew' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'databrew-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'databrew-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'databrew-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'databrew-fips.us-west-2.amazonaws.com', ], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'databrew-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'databrew-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'databrew-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'databrew-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'dataexchange' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'datapipeline' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'datasync' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'datasync.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'datasync.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'datasync-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'datasync.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'datasync-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'datasync.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'datasync.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'datasync.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'datasync.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'datasync.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'datasync.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'datasync.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'datasync.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'datasync.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'datasync-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'datasync-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'datasync-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'datasync-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'datasync-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'datasync-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'datasync.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'datasync.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'datasync.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'datasync.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'datasync.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'datasync-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'datasync.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'datasync-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'datasync.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'datasync-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'datasync.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'datasync-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'datasync.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'datazone' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [ 'hostname' => 'datazone.ap-northeast-1.api.aws', ], 'ap-northeast-2' => [ 'hostname' => 'datazone.ap-northeast-2.api.aws', ], 'ap-northeast-3' => [ 'hostname' => 'datazone.ap-northeast-3.api.aws', ], 'ap-south-1' => [ 'hostname' => 'datazone.ap-south-1.api.aws', ], 'ap-south-2' => [ 'hostname' => 'datazone.ap-south-2.api.aws', ], 'ap-southeast-1' => [ 'hostname' => 'datazone.ap-southeast-1.api.aws', ], 'ap-southeast-2' => [ 'hostname' => 'datazone.ap-southeast-2.api.aws', ], 'ap-southeast-3' => [ 'hostname' => 'datazone.ap-southeast-3.api.aws', ], 'ap-southeast-4' => [ 'hostname' => 'datazone.ap-southeast-4.api.aws', ], 'ap-southeast-5' => [ 'hostname' => 'datazone.ap-southeast-5.api.aws', ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'hostname' => 'datazone.ap-southeast-7.api.aws', ], 'ca-central-1' => [ 'hostname' => 'datazone.ca-central-1.api.aws', 'variants' => [ [ 'hostname' => 'datazone-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'hostname' => 'datazone.ca-west-1.api.aws', ], 'eu-central-1' => [ 'hostname' => 'datazone.eu-central-1.api.aws', ], 'eu-central-2' => [], 'eu-north-1' => [ 'hostname' => 'datazone.eu-north-1.api.aws', ], 'eu-south-1' => [ 'hostname' => 'datazone.eu-south-1.api.aws', ], 'eu-west-1' => [ 'hostname' => 'datazone.eu-west-1.api.aws', ], 'eu-west-2' => [ 'hostname' => 'datazone.eu-west-2.api.aws', ], 'eu-west-3' => [ 'hostname' => 'datazone.eu-west-3.api.aws', ], 'il-central-1' => [ 'hostname' => 'datazone.il-central-1.api.aws', ], 'me-central-1' => [ 'hostname' => 'datazone.me-central-1.api.aws', ], 'me-south-1' => [ 'hostname' => 'datazone.me-south-1.api.aws', ], 'mx-central-1' => [ 'hostname' => 'datazone.mx-central-1.api.aws', ], 'sa-east-1' => [ 'hostname' => 'datazone.sa-east-1.api.aws', ], 'us-east-1' => [ 'hostname' => 'datazone.us-east-1.api.aws', 'variants' => [ [ 'hostname' => 'datazone-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'hostname' => 'datazone.us-east-2.api.aws', 'variants' => [ [ 'hostname' => 'datazone-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'hostname' => 'datazone.us-west-1.api.aws', ], 'us-west-2' => [ 'hostname' => 'datazone.us-west-2.api.aws', 'variants' => [ [ 'hostname' => 'datazone-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'dax' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'devicefarm' => [ 'endpoints' => [ 'us-west-2' => [], ], ], 'devops-guru' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'devops-guru-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'devops-guru-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'devops-guru-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'devops-guru-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'devops-guru-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'devops-guru-fips.us-west-2.amazonaws.com', ], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'devops-guru-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'devops-guru-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'devops-guru-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'devops-guru-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'directconnect' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'directconnect-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'directconnect-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'directconnect-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'directconnect-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'directconnect-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'directconnect-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'directconnect-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'directconnect-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'directconnect-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'directconnect-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'directconnect-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'directconnect-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'discovery' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'dlm' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'dlm.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'dlm.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'dlm-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'dlm.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'dlm-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'dlm.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'dlm.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'dlm.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'dlm.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'dlm.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'dlm.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'dlm.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'dlm.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'dlm.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'dlm.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'dlm.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'dlm.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'dlm.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'dlm.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'dlm-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'dlm.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'dlm-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'dlm.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'dlm-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'dlm.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'dlm-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'dlm.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'dms' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'dms' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'dms-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'dms-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'dms-fips.us-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'dms-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'dms-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'dms-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'dms-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'dms-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'dms-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'dms-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'dms-fips.us-west-2.amazonaws.com', ], ], ], 'docdb' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'rds.ap-northeast-1.amazonaws.com', ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'rds.ap-northeast-2.amazonaws.com', ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'rds.ap-south-1.amazonaws.com', ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'rds.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'rds.ap-southeast-2.amazonaws.com', ], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'rds.ca-central-1.amazonaws.com', ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'rds.eu-central-1.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'rds.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'rds.eu-west-2.amazonaws.com', ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'rds.eu-west-3.amazonaws.com', ], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'rds.sa-east-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'rds.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'rds.us-east-2.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'rds.us-west-2.amazonaws.com', ], ], ], 'drs' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'drs-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'drs-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'drs-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'drs-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'drs-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'drs-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'drs-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'drs-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ds' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'dynamodb' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'dynamodb-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'dynamodb-fips.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'dynamodb-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'dynamodb-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'local' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'localhost:8000', 'protocols' => [ 'http', ], ], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'dynamodb-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'dynamodb-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'dynamodb-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'dynamodb-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'dynamodb-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'dynamodb-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'dynamodb-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'dynamodb-fips.us-west-2.amazonaws.com', ], ], ], 'ebs' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'ebs-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'ebs-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'ebs-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'ebs-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ebs-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ebs-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ebs-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ebs-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ebs-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ebs-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ebs-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ebs-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ec2' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'ec2.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'ec2.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'ec2.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'ec2.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'ec2.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'ec2.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'ec2.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'ec2-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ec2.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'ec2-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'ec2.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'ec2.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'ec2.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'ec2.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'ec2.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'ec2.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'ec2-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'ec2-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ec2-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ec2-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ec2-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ec2-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'ec2.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'ec2.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ec2-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ec2.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ec2-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ec2.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ec2-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ec2.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ec2-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ec2.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'ecs' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ecs-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ecs-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ecs-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ecs-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ecs-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ecs-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ecs-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ecs-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'edge.sagemaker' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'eks' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 'fips.eks.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'fips.eks.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'fips.eks.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'fips.eks.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'fips.eks.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'fips.eks.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'fips.eks.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'fips.eks.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'fips.eks.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'eks-auth' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'hostname' => 'eks-auth.af-south-1.api.aws', ], 'ap-east-1' => [ 'hostname' => 'eks-auth.ap-east-1.api.aws', ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'hostname' => 'eks-auth.ap-northeast-1.api.aws', ], 'ap-northeast-2' => [ 'hostname' => 'eks-auth.ap-northeast-2.api.aws', ], 'ap-northeast-3' => [ 'hostname' => 'eks-auth.ap-northeast-3.api.aws', ], 'ap-south-1' => [ 'hostname' => 'eks-auth.ap-south-1.api.aws', ], 'ap-south-2' => [ 'hostname' => 'eks-auth.ap-south-2.api.aws', ], 'ap-southeast-1' => [ 'hostname' => 'eks-auth.ap-southeast-1.api.aws', ], 'ap-southeast-2' => [ 'hostname' => 'eks-auth.ap-southeast-2.api.aws', ], 'ap-southeast-3' => [ 'hostname' => 'eks-auth.ap-southeast-3.api.aws', ], 'ap-southeast-4' => [ 'hostname' => 'eks-auth.ap-southeast-4.api.aws', ], 'ap-southeast-5' => [ 'hostname' => 'eks-auth.ap-southeast-5.api.aws', ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'hostname' => 'eks-auth.ap-southeast-7.api.aws', ], 'ca-central-1' => [ 'hostname' => 'eks-auth.ca-central-1.api.aws', ], 'ca-west-1' => [ 'hostname' => 'eks-auth.ca-west-1.api.aws', ], 'eu-central-1' => [ 'hostname' => 'eks-auth.eu-central-1.api.aws', ], 'eu-central-2' => [ 'hostname' => 'eks-auth.eu-central-2.api.aws', ], 'eu-north-1' => [ 'hostname' => 'eks-auth.eu-north-1.api.aws', ], 'eu-south-1' => [ 'hostname' => 'eks-auth.eu-south-1.api.aws', ], 'eu-south-2' => [ 'hostname' => 'eks-auth.eu-south-2.api.aws', ], 'eu-west-1' => [ 'hostname' => 'eks-auth.eu-west-1.api.aws', ], 'eu-west-2' => [ 'hostname' => 'eks-auth.eu-west-2.api.aws', ], 'eu-west-3' => [ 'hostname' => 'eks-auth.eu-west-3.api.aws', ], 'il-central-1' => [ 'hostname' => 'eks-auth.il-central-1.api.aws', ], 'me-central-1' => [ 'hostname' => 'eks-auth.me-central-1.api.aws', ], 'me-south-1' => [ 'hostname' => 'eks-auth.me-south-1.api.aws', ], 'mx-central-1' => [ 'hostname' => 'eks-auth.mx-central-1.api.aws', ], 'sa-east-1' => [ 'hostname' => 'eks-auth.sa-east-1.api.aws', ], 'us-east-1' => [ 'hostname' => 'eks-auth.us-east-1.api.aws', ], 'us-east-2' => [ 'hostname' => 'eks-auth.us-east-2.api.aws', ], 'us-west-1' => [ 'hostname' => 'eks-auth.us-west-1.api.aws', ], 'us-west-2' => [ 'hostname' => 'eks-auth.us-west-2.api.aws', ], ], ], 'elasticache' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'elasticache-fips.us-west-1.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticache-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'elasticache-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'elasticache-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'elasticache-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticache-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'elasticache-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'elasticache-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'elasticache-fips.us-west-2.amazonaws.com', ], ], ], 'elasticbeanstalk' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'elasticbeanstalk-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'elasticbeanstalk-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'elasticbeanstalk-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'elasticbeanstalk-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticbeanstalk-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'elasticbeanstalk.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticbeanstalk-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'elasticbeanstalk.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticbeanstalk-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'elasticbeanstalk.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticbeanstalk-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'elasticbeanstalk.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'elasticfilesystem' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.af-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-northeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-northeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-northeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-south-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-southeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-southeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-southeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-southeast-4.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-southeast-5.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ap-southeast-7.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-central-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-north-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-south-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-west-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.af-south-1.amazonaws.com', ], 'fips-ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-east-1.amazonaws.com', ], 'fips-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-northeast-1.amazonaws.com', ], 'fips-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-northeast-2.amazonaws.com', ], 'fips-ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-northeast-3.amazonaws.com', ], 'fips-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-south-1.amazonaws.com', ], 'fips-ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-south-2.amazonaws.com', ], 'fips-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-1.amazonaws.com', ], 'fips-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-2.amazonaws.com', ], 'fips-ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-3.amazonaws.com', ], 'fips-ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-4.amazonaws.com', ], 'fips-ap-southeast-5' => [ 'credentialScope' => [ 'region' => 'ap-southeast-5', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-5.amazonaws.com', ], 'fips-ap-southeast-7' => [ 'credentialScope' => [ 'region' => 'ap-southeast-7', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-7.amazonaws.com', ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.ca-west-1.amazonaws.com', ], 'fips-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-central-1.amazonaws.com', ], 'fips-eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-central-2.amazonaws.com', ], 'fips-eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-north-1.amazonaws.com', ], 'fips-eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-south-1.amazonaws.com', ], 'fips-eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-south-2.amazonaws.com', ], 'fips-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-west-1.amazonaws.com', ], 'fips-eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-west-2.amazonaws.com', ], 'fips-eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-west-3.amazonaws.com', ], 'fips-il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.il-central-1.amazonaws.com', ], 'fips-me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.me-central-1.amazonaws.com', ], 'fips-me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.me-south-1.amazonaws.com', ], 'fips-mx-central-1' => [ 'credentialScope' => [ 'region' => 'mx-central-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.mx-central-1.amazonaws.com', ], 'fips-sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.sa-east-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.il-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.me-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.me-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.mx-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.sa-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'elasticloadbalancing' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'elasticloadbalancing-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'elasticloadbalancing-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'elasticloadbalancing-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'elasticloadbalancing-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticloadbalancing-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'elasticloadbalancing-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticloadbalancing-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'elasticloadbalancing-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'elasticmapreduce' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'sslCommonName' => '{region}.{service}.{dnsSuffix}', ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'sslCommonName' => '{service}.{region}.{dnsSuffix}', ], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'sslCommonName' => '{service}.{region}.{dnsSuffix}', 'variants' => [ [ 'hostname' => 'elasticmapreduce-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticmapreduce.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'elastictranscoder' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'email' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-5' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'email-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'email-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'email-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'email-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'email-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'email-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'email-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'email-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'email-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'email-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'emr-containers' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'emr-containers-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'emr-containers-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'emr-containers-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'emr-containers-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'emr-containers-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'emr-containers-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'emr-containers-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'emr-containers-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'emr-containers-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'emr-containers-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'emr-serverless' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'emr-serverless-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'emr-serverless-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'emr-serverless-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'emr-serverless-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'emr-serverless-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'emr-serverless-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'emr-serverless-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'emr-serverless-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'emr-serverless-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'emr-serverless-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'entitlement.marketplace' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'aws-marketplace', ], ], 'endpoints' => [ 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'entitlement-marketplace.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'es' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'aos.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'aos.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'aos.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'aos.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'aos.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'aos.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'aos.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'aos.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'aos.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'aos.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'aos.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'aos.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'aos.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'aos.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'aos.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'aos.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'aos.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'aos.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'aos.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'aos.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'aos.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'aos.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'aos.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'es-fips.us-west-1.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'aos.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'aos.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'aos.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'aos.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'aos.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'aos.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'es-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'es-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'aos.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'es-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'es-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'aos.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'es-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'es-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'aos.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'es-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'es-fips.us-west-2.amazonaws.com', ], ], ], 'events' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'events.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'events.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'events.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'events.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'events.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'events.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'events.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'events.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'events.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'events.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'events.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'events.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'events.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'events.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'events.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'events.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'events.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'events.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'events.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'events.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'events.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'events.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'events.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'events-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'events-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'events-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'events-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'events.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'events.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'events.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'events.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'events.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'events-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'events-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'events.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'events-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'events-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'events.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'events-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'events-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'events.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'events-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'events-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'events.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'evidently' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'hostname' => 'evidently.ap-northeast-1.amazonaws.com', ], 'ap-southeast-1' => [ 'hostname' => 'evidently.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'hostname' => 'evidently.ap-southeast-2.amazonaws.com', ], 'eu-central-1' => [ 'hostname' => 'evidently.eu-central-1.amazonaws.com', ], 'eu-north-1' => [ 'hostname' => 'evidently.eu-north-1.amazonaws.com', ], 'eu-west-1' => [ 'hostname' => 'evidently.eu-west-1.amazonaws.com', ], 'us-east-1' => [ 'hostname' => 'evidently.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'hostname' => 'evidently.us-east-2.amazonaws.com', ], 'us-west-2' => [ 'hostname' => 'evidently.us-west-2.amazonaws.com', ], ], ], 'finspace' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'finspace-api' => [ 'endpoints' => [ 'ca-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'firehose' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'firehose.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'firehose.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'firehose.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'firehose.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'firehose.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'firehose.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'firehose.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'firehose.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'firehose.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'firehose.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'firehose.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'firehose.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'firehose-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'firehose-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'firehose-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'firehose-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'firehose.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'firehose.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'firehose.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'firehose.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'firehose.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'firehose-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'firehose-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'firehose.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'firehose-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'firehose-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'firehose.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'firehose-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'firehose-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'firehose.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'firehose-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'firehose-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'firehose.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'fms' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.af-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.ap-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.ap-northeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'fms-fips.ap-northeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-3' => [], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.ap-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-2' => [], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.ap-southeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'fms-fips.ap-southeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.eu-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.eu-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-2' => [], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.eu-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'fms-fips.eu-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'fms-fips.eu-west-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.af-south-1.amazonaws.com', ], 'fips-ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.ap-east-1.amazonaws.com', ], 'fips-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.ap-northeast-1.amazonaws.com', ], 'fips-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'deprecated' => true, 'hostname' => 'fms-fips.ap-northeast-2.amazonaws.com', ], 'fips-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.ap-south-1.amazonaws.com', ], 'fips-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.ap-southeast-1.amazonaws.com', ], 'fips-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'deprecated' => true, 'hostname' => 'fms-fips.ap-southeast-2.amazonaws.com', ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.ca-west-1.amazonaws.com', ], 'fips-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.eu-central-1.amazonaws.com', ], 'fips-eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.eu-south-1.amazonaws.com', ], 'fips-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.eu-west-1.amazonaws.com', ], 'fips-eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'deprecated' => true, 'hostname' => 'fms-fips.eu-west-2.amazonaws.com', ], 'fips-eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'deprecated' => true, 'hostname' => 'fms-fips.eu-west-3.amazonaws.com', ], 'fips-me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.me-south-1.amazonaws.com', ], 'fips-sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.sa-east-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'fms-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'fms-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.me-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.sa-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'fms-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'fms-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'forecast' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'forecast-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'forecast-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'forecast-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'forecast-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'forecast-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'forecast-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'forecastquery' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'forecastquery-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'forecastquery-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'forecastquery-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'forecastquery-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'forecastquery-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'forecastquery-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'frauddetector' => [ 'endpoints' => [ 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'fsx' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.ca-west-1.amazonaws.com', ], 'fips-prod-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.ca-central-1.amazonaws.com', ], 'fips-prod-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.ca-west-1.amazonaws.com', ], 'fips-prod-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-east-1.amazonaws.com', ], 'fips-prod-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-east-2.amazonaws.com', ], 'fips-prod-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-west-1.amazonaws.com', ], 'fips-prod-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-west-2.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'prod-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'prod-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'prod-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'prod-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'prod-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'prod-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'gamelift' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'gameliftstreams' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'hostname' => 'gameliftstreams.af-south-1.api.aws', ], 'ap-east-1' => [ 'hostname' => 'gameliftstreams.ap-east-1.api.aws', ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'hostname' => 'gameliftstreams.ap-northeast-1.api.aws', ], 'ap-northeast-2' => [ 'hostname' => 'gameliftstreams.ap-northeast-2.api.aws', ], 'ap-northeast-3' => [ 'hostname' => 'gameliftstreams.ap-northeast-3.api.aws', ], 'ap-south-1' => [ 'hostname' => 'gameliftstreams.ap-south-1.api.aws', ], 'ap-south-2' => [ 'hostname' => 'gameliftstreams.ap-south-2.api.aws', ], 'ap-southeast-1' => [ 'hostname' => 'gameliftstreams.ap-southeast-1.api.aws', ], 'ap-southeast-2' => [ 'hostname' => 'gameliftstreams.ap-southeast-2.api.aws', ], 'ap-southeast-3' => [ 'hostname' => 'gameliftstreams.ap-southeast-3.api.aws', ], 'ap-southeast-4' => [ 'hostname' => 'gameliftstreams.ap-southeast-4.api.aws', ], 'ap-southeast-5' => [ 'hostname' => 'gameliftstreams.ap-southeast-5.api.aws', ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'hostname' => 'gameliftstreams.ap-southeast-7.api.aws', ], 'ca-central-1' => [ 'hostname' => 'gameliftstreams.ca-central-1.api.aws', ], 'ca-west-1' => [ 'hostname' => 'gameliftstreams.ca-west-1.api.aws', ], 'eu-central-1' => [ 'hostname' => 'gameliftstreams.eu-central-1.api.aws', ], 'eu-central-2' => [ 'hostname' => 'gameliftstreams.eu-central-2.api.aws', ], 'eu-north-1' => [ 'hostname' => 'gameliftstreams.eu-north-1.api.aws', ], 'eu-south-1' => [ 'hostname' => 'gameliftstreams.eu-south-1.api.aws', ], 'eu-south-2' => [ 'hostname' => 'gameliftstreams.eu-south-2.api.aws', ], 'eu-west-1' => [ 'hostname' => 'gameliftstreams.eu-west-1.api.aws', ], 'eu-west-2' => [ 'hostname' => 'gameliftstreams.eu-west-2.api.aws', ], 'eu-west-3' => [ 'hostname' => 'gameliftstreams.eu-west-3.api.aws', ], 'il-central-1' => [ 'hostname' => 'gameliftstreams.il-central-1.api.aws', ], 'me-central-1' => [ 'hostname' => 'gameliftstreams.me-central-1.api.aws', ], 'me-south-1' => [ 'hostname' => 'gameliftstreams.me-south-1.api.aws', ], 'mx-central-1' => [ 'hostname' => 'gameliftstreams.mx-central-1.api.aws', ], 'sa-east-1' => [ 'hostname' => 'gameliftstreams.sa-east-1.api.aws', ], 'us-east-1' => [ 'hostname' => 'gameliftstreams.us-east-1.api.aws', ], 'us-east-2' => [ 'hostname' => 'gameliftstreams.us-east-2.api.aws', ], 'us-west-1' => [ 'hostname' => 'gameliftstreams.us-west-1.api.aws', ], 'us-west-2' => [ 'hostname' => 'gameliftstreams.us-west-2.api.aws', ], ], ], 'geo' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-5' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'glacier' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'glacier-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'glacier-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'glacier-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'glacier-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'glacier-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'glacier-fips.us-west-2.amazonaws.com', ], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'glacier-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'glacier-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'glacier-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'glacier-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'globalaccelerator' => [ 'endpoints' => [ 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'globalaccelerator-fips.us-west-2.amazonaws.com', ], ], ], 'glue' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'glue.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'glue.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'glue.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'glue.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'glue.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'glue.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'glue.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'glue.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'glue.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'glue.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'glue.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'glue.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'glue.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'glue.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'glue.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'glue.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'glue.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'glue.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'glue.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'glue.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'glue.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'glue.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'glue.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'glue-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'glue-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'glue-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'glue-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'glue.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'glue.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'glue.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'glue.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'glue.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'glue-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'glue-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'glue.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'glue-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'glue-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'glue.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'glue-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'glue-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'glue.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'glue-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'glue-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'glue.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'grafana' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'grafana.ap-northeast-1.amazonaws.com', ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'grafana.ap-northeast-2.amazonaws.com', ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'grafana.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'grafana.ap-southeast-2.amazonaws.com', ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'grafana.eu-central-1.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'grafana.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'grafana.eu-west-2.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'grafana.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'grafana.us-east-2.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'grafana.us-west-2.amazonaws.com', ], ], ], 'greengrass' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-5' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'greengrass-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'greengrass-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'greengrass-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'greengrass-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'greengrass-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'greengrass-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'greengrass-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'greengrass-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], 'isRegionalized' => true, ], 'groundstation' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'groundstation-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'groundstation-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'groundstation-fips.us-west-2.amazonaws.com', ], 'me-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'groundstation-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'groundstation-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'groundstation-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'groundstation-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'groundstation-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'groundstation-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], ], ], 'guardduty' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'guardduty-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'guardduty-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'guardduty-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'guardduty-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'guardduty-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'guardduty-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'guardduty-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'guardduty-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'guardduty-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'guardduty-fips.us-west-2.amazonaws.com', ], ], 'isRegionalized' => true, ], 'health' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'sslCommonName' => 'health.us-east-1.amazonaws.com', ], 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'global.health.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'health-fips.us-east-2.amazonaws.com', ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'health-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'healthlake' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-south-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'iam' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'iam.amazonaws.com', 'variants' => [ [ 'hostname' => 'iam-fips.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'iam.global.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'aws-global-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'iam-fips.amazonaws.com', ], 'iam' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'iam-fips.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'iam-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'iam-fips.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'identity-chime' => [ 'endpoints' => [ 'eu-central-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'identity-chime-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'identity-chime-fips.us-east-1.amazonaws.com', ], ], ], 'identitystore' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'importexport' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', 'service' => 'IngestionService', ], 'hostname' => 'importexport.amazonaws.com', 'signatureVersions' => [ 'v2', 'v4', ], ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'ingest.timestream' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'ingest-fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ingest.timestream-fips.us-east-1.amazonaws.com', ], 'ingest-fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ingest.timestream-fips.us-east-2.amazonaws.com', ], 'ingest-fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ingest.timestream-fips.us-west-2.amazonaws.com', ], 'ingest-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ingest.timestream-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ingest-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ingest.timestream-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ingest-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ingest.timestream-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'inspector' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'inspector-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'inspector-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'inspector-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'inspector-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'inspector-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'inspector-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'inspector-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'inspector-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'inspector2' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'inspector2-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'inspector2-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'inspector2-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'inspector2-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'inspector2-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'inspector2-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'inspector2-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'inspector2-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'internetmonitor' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'hostname' => 'internetmonitor.af-south-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'hostname' => 'internetmonitor.ap-east-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'hostname' => 'internetmonitor.ap-northeast-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'hostname' => 'internetmonitor.ap-northeast-2.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'hostname' => 'internetmonitor.ap-northeast-3.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'hostname' => 'internetmonitor.ap-south-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'hostname' => 'internetmonitor.ap-south-2.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'hostname' => 'internetmonitor.ap-southeast-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'hostname' => 'internetmonitor.ap-southeast-2.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'hostname' => 'internetmonitor.ap-southeast-3.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'hostname' => 'internetmonitor.ap-southeast-4.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'hostname' => 'internetmonitor.ap-southeast-5.api.aws', ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'hostname' => 'internetmonitor.ap-southeast-7.api.aws', ], 'ca-central-1' => [ 'hostname' => 'internetmonitor.ca-central-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'internetmonitor-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'internetmonitor.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'hostname' => 'internetmonitor.ca-west-1.api.aws', ], 'eu-central-1' => [ 'hostname' => 'internetmonitor.eu-central-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'hostname' => 'internetmonitor.eu-central-2.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'hostname' => 'internetmonitor.eu-north-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'hostname' => 'internetmonitor.eu-south-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'hostname' => 'internetmonitor.eu-south-2.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'hostname' => 'internetmonitor.eu-west-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'hostname' => 'internetmonitor.eu-west-2.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'hostname' => 'internetmonitor.eu-west-3.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'hostname' => 'internetmonitor.il-central-1.api.aws', ], 'me-central-1' => [ 'hostname' => 'internetmonitor.me-central-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'hostname' => 'internetmonitor.me-south-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'hostname' => 'internetmonitor.mx-central-1.api.aws', ], 'sa-east-1' => [ 'hostname' => 'internetmonitor.sa-east-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'hostname' => 'internetmonitor.us-east-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'internetmonitor-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'internetmonitor.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'hostname' => 'internetmonitor.us-east-2.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'internetmonitor-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'internetmonitor.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'hostname' => 'internetmonitor.us-west-1.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'internetmonitor-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'internetmonitor.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'hostname' => 'internetmonitor.us-west-2.api.aws', 'variants' => [ [ 'hostname' => 'internetmonitor-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'internetmonitor-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'internetmonitor.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'iot' => [ 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-5' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'iot-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'deprecated' => true, 'hostname' => 'iot-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'deprecated' => true, 'hostname' => 'iot-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'deprecated' => true, 'hostname' => 'iot-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'deprecated' => true, 'hostname' => 'iot-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'deprecated' => true, 'hostname' => 'iot-fips.us-west-2.amazonaws.com', ], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'iot-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'iot-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'iot-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'iot-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iotanalytics' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'iotevents' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'iotevents-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'iotevents-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'iotevents-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'iotevents-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'iotevents-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'iotevents-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'iotevents-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'iotevents-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ioteventsdata' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'data.iotevents.ap-northeast-1.amazonaws.com', ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'data.iotevents.ap-northeast-2.amazonaws.com', ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'data.iotevents.ap-south-1.amazonaws.com', ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'data.iotevents.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'data.iotevents.ap-southeast-2.amazonaws.com', ], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'data.iotevents.ca-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'data.iotevents-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'data.iotevents.eu-central-1.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'data.iotevents.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'data.iotevents.eu-west-2.amazonaws.com', ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'data.iotevents-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'data.iotevents-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'data.iotevents-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'data.iotevents-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'data.iotevents.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'data.iotevents-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'data.iotevents.us-east-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'data.iotevents-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'data.iotevents.us-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'data.iotevents-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iotfleetwise' => [ 'endpoints' => [ 'ap-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], ], ], 'iotsecuredtunneling' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-west-2.amazonaws.com', ], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iotsitewise' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'iotsitewise-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'iotsitewise-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'iotsitewise-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'iotsitewise-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'iotsitewise-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'iotsitewise-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'iotsitewise-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'iotsitewise-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iotthingsgraph' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'iotthingsgraph', ], ], 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'iottwinmaker' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'api-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'api.iottwinmaker.ap-northeast-1.amazonaws.com', ], 'api-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'api.iottwinmaker.ap-northeast-2.amazonaws.com', ], 'api-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'api.iottwinmaker.ap-south-1.amazonaws.com', ], 'api-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'api.iottwinmaker.ap-southeast-1.amazonaws.com', ], 'api-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'api.iottwinmaker.ap-southeast-2.amazonaws.com', ], 'api-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'api.iottwinmaker.eu-central-1.amazonaws.com', ], 'api-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'api.iottwinmaker.eu-west-1.amazonaws.com', ], 'api-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'api.iottwinmaker.us-east-1.amazonaws.com', ], 'api-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'api.iottwinmaker.us-west-2.amazonaws.com', ], 'data-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'data.iottwinmaker.ap-northeast-1.amazonaws.com', ], 'data-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'data.iottwinmaker.ap-northeast-2.amazonaws.com', ], 'data-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'data.iottwinmaker.ap-south-1.amazonaws.com', ], 'data-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'data.iottwinmaker.ap-southeast-1.amazonaws.com', ], 'data-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'data.iottwinmaker.ap-southeast-2.amazonaws.com', ], 'data-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'data.iottwinmaker.eu-central-1.amazonaws.com', ], 'data-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'data.iottwinmaker.eu-west-1.amazonaws.com', ], 'data-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'data.iottwinmaker.us-east-1.amazonaws.com', ], 'data-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'data.iottwinmaker.us-west-2.amazonaws.com', ], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-api-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'api.iottwinmaker-fips.us-east-1.amazonaws.com', ], 'fips-api-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'api.iottwinmaker-fips.us-west-2.amazonaws.com', ], 'fips-data-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'data.iottwinmaker-fips.us-east-1.amazonaws.com', ], 'fips-data-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'data.iottwinmaker-fips.us-west-2.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'iottwinmaker-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'iottwinmaker-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'iottwinmaker-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'iottwinmaker-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iotwireless' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'api.iotwireless.ap-northeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'api.iotwireless.ap-southeast-2.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'api.iotwireless.eu-west-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'api.iotwireless.us-east-1.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'api.iotwireless.us-west-2.amazonaws.com', ], ], ], 'ivs' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'ivschat' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'ivsrealtime' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'kafka' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'kafka-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'kafka-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'kafka-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'kafka-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'kafka-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'kafka-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'kafka-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'kafka-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'kafka-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'kafka-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'kafka-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'kafka-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kafkaconnect' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'kendra' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'kendra-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'kendra-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'kendra-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'kendra-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'kendra-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'kendra-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'kendra-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'kendra-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kendra-ranking' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'hostname' => 'kendra-ranking.af-south-1.api.aws', ], 'ap-east-1' => [ 'hostname' => 'kendra-ranking.ap-east-1.api.aws', ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'hostname' => 'kendra-ranking.ap-northeast-1.api.aws', ], 'ap-northeast-2' => [ 'hostname' => 'kendra-ranking.ap-northeast-2.api.aws', ], 'ap-northeast-3' => [ 'hostname' => 'kendra-ranking.ap-northeast-3.api.aws', ], 'ap-south-1' => [ 'hostname' => 'kendra-ranking.ap-south-1.api.aws', ], 'ap-south-2' => [ 'hostname' => 'kendra-ranking.ap-south-2.api.aws', ], 'ap-southeast-1' => [ 'hostname' => 'kendra-ranking.ap-southeast-1.api.aws', ], 'ap-southeast-2' => [ 'hostname' => 'kendra-ranking.ap-southeast-2.api.aws', ], 'ap-southeast-3' => [ 'hostname' => 'kendra-ranking.ap-southeast-3.api.aws', ], 'ap-southeast-4' => [ 'hostname' => 'kendra-ranking.ap-southeast-4.api.aws', ], 'ap-southeast-5' => [ 'hostname' => 'kendra-ranking.ap-southeast-5.api.aws', ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'hostname' => 'kendra-ranking.ap-southeast-7.api.aws', ], 'ca-central-1' => [ 'hostname' => 'kendra-ranking.ca-central-1.api.aws', 'variants' => [ [ 'hostname' => 'kendra-ranking-fips.ca-central-1.api.aws', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'hostname' => 'kendra-ranking.ca-west-1.api.aws', ], 'eu-central-2' => [ 'hostname' => 'kendra-ranking.eu-central-2.api.aws', ], 'eu-north-1' => [ 'hostname' => 'kendra-ranking.eu-north-1.api.aws', ], 'eu-south-1' => [ 'hostname' => 'kendra-ranking.eu-south-1.api.aws', ], 'eu-south-2' => [ 'hostname' => 'kendra-ranking.eu-south-2.api.aws', ], 'eu-west-1' => [ 'hostname' => 'kendra-ranking.eu-west-1.api.aws', ], 'eu-west-3' => [ 'hostname' => 'kendra-ranking.eu-west-3.api.aws', ], 'il-central-1' => [ 'hostname' => 'kendra-ranking.il-central-1.api.aws', ], 'me-central-1' => [ 'hostname' => 'kendra-ranking.me-central-1.api.aws', ], 'me-south-1' => [ 'hostname' => 'kendra-ranking.me-south-1.api.aws', ], 'mx-central-1' => [ 'hostname' => 'kendra-ranking.mx-central-1.api.aws', ], 'sa-east-1' => [ 'hostname' => 'kendra-ranking.sa-east-1.api.aws', ], 'us-east-1' => [ 'hostname' => 'kendra-ranking.us-east-1.api.aws', 'variants' => [ [ 'hostname' => 'kendra-ranking-fips.us-east-1.api.aws', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'hostname' => 'kendra-ranking.us-east-2.api.aws', 'variants' => [ [ 'hostname' => 'kendra-ranking-fips.us-east-2.api.aws', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'hostname' => 'kendra-ranking.us-west-1.api.aws', ], 'us-west-2' => [ 'hostname' => 'kendra-ranking.us-west-2.api.aws', 'variants' => [ [ 'hostname' => 'kendra-ranking-fips.us-west-2.api.aws', 'tags' => [ 'fips', ], ], ], ], ], ], 'kinesis' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'kinesis-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'kinesis-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'kinesis-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'kinesis-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'kinesis-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'kinesis-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'kinesis-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'kinesis-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kinesisanalytics' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'kinesisanalytics-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'kinesisanalytics-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'kinesisanalytics-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'kinesisanalytics-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'kinesisanalytics-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'kinesisanalytics-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'kinesisanalytics-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'kinesisanalytics-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'kinesisanalytics-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'kinesisanalytics-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'kinesisanalytics-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'kinesisanalytics-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kinesisvideo' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-5' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'kms' => [ 'endpoints' => [ 'ProdFips' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-central-2.amazonaws.com', ], 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.af-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'af-south-1-fips' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.af-south-1.amazonaws.com', ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-east-1-fips' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-east-1.amazonaws.com', ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-northeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-1-fips' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-northeast-1.amazonaws.com', ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-northeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-2-fips' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-northeast-2.amazonaws.com', ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-northeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-3-fips' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-northeast-3.amazonaws.com', ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-1-fips' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-south-1.amazonaws.com', ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-south-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-2-fips' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-south-2.amazonaws.com', ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-southeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-1-fips' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-southeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-2-fips' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-southeast-2.amazonaws.com', ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-southeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-3-fips' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-southeast-3.amazonaws.com', ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-southeast-4.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-4-fips' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-southeast-4.amazonaws.com', ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-southeast-5.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-5-fips' => [ 'credentialScope' => [ 'region' => 'ap-southeast-5', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-southeast-5.amazonaws.com', ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ap-southeast-7.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-7-fips' => [ 'credentialScope' => [ 'region' => 'ap-southeast-7', ], 'deprecated' => true, 'hostname' => 'kms-fips.ap-southeast-7.amazonaws.com', ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1-fips' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-central-1.amazonaws.com', ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-central-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-2-fips' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-central-2.amazonaws.com', ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-north-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-north-1-fips' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-north-1.amazonaws.com', ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-1-fips' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-south-1.amazonaws.com', ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-south-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-2-fips' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-south-2.amazonaws.com', ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-1-fips' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-2-fips' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-west-2.amazonaws.com', ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-west-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-3-fips' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-west-3.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.il-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'il-central-1-fips' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.il-central-1.amazonaws.com', ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.me-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'me-central-1-fips' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.me-central-1.amazonaws.com', ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.me-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'me-south-1-fips' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.me-south-1.amazonaws.com', ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.mx-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'mx-central-1-fips' => [ 'credentialScope' => [ 'region' => 'mx-central-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.mx-central-1.amazonaws.com', ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.sa-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'sa-east-1-fips' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.sa-east-1.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-west-2.amazonaws.com', ], ], ], 'lakeformation' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'lakeformation.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'lakeformation.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'lakeformation.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'lakeformation.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'lakeformation-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'lakeformation-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'lakeformation-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'lakeformation-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lakeformation-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'lakeformation.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'lakeformation-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lakeformation-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'lakeformation.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lakeformation-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'lakeformation.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'lakeformation-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lakeformation-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'lakeformation.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'lambda' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'lambda.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'lambda.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'lambda.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'lambda.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'lambda-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'lambda-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'lambda-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'lambda-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'lambda.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'lambda.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'lambda.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'lambda.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'lambda.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'lambda-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lambda.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'lambda-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lambda.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'lambda-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lambda.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'lambda-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lambda.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'license-manager' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'license-manager-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'license-manager-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'license-manager-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'license-manager-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'license-manager-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'license-manager-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'license-manager-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'license-manager-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'license-manager-linux-subscriptions' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'license-manager-linux-subscriptions-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'license-manager-linux-subscriptions-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'license-manager-linux-subscriptions-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'license-manager-linux-subscriptions-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'license-manager-linux-subscriptions-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'license-manager-linux-subscriptions-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'license-manager-user-subscriptions' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'license-manager-user-subscriptions-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'license-manager-user-subscriptions-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'license-manager-user-subscriptions-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'license-manager-user-subscriptions-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'license-manager-user-subscriptions-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'license-manager-user-subscriptions-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'license-manager-user-subscriptions-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'license-manager-user-subscriptions-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'lightsail' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'logs' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'logs.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'logs.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'logs.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'logs.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'logs.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'logs.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'logs.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'logs.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'logs.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'logs.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'logs.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'logs-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'logs.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'logs-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'logs.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'logs.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'logs.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'logs.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'logs.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'logs.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'logs.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'logs.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'logs.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'logs-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'logs-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'logs-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'logs-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'logs-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'logs-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'logs.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'logs.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'logs.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'logs.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'logs-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'logs.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'logs-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'logs.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'logs-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'logs.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'logs-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'logs.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'lookoutequipment' => [ 'endpoints' => [ 'ap-northeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], ], ], 'm2' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'deprecated' => true, ], 'fips-us-east-1' => [ 'deprecated' => true, ], 'fips-us-east-2' => [ 'deprecated' => true, ], 'fips-us-west-1' => [ 'deprecated' => true, ], 'fips-us-west-2' => [ 'deprecated' => true, ], 'il-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], ], ], 'machinelearning' => [ 'endpoints' => [ 'eu-west-1' => [], 'us-east-1' => [], ], ], 'macie2' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'macie2.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'macie2.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'macie2.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'macie2.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'macie2.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'macie2.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'macie2.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'macie2.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'macie2.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'macie2.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'macie2.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'macie2.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'macie2.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'macie2.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'macie2.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'macie2-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'macie2-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'macie2-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'macie2-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'macie2.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'macie2.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'macie2.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'macie2-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'macie2-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'macie2.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'macie2-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'macie2-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'macie2.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'macie2-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'macie2-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'macie2.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'macie2-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'macie2-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'macie2.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'managedblockchain' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], ], ], 'managedblockchain-query' => [ 'endpoints' => [ 'us-east-1' => [], ], ], 'marketplacecommerceanalytics' => [ 'endpoints' => [ 'us-east-1' => [], ], ], 'media-pipelines-chime' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'media-pipelines-chime-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'media-pipelines-chime-fips.us-east-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'media-pipelines-chime-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'media-pipelines-chime-fips.us-west-2.amazonaws.com', ], ], ], 'mediaconnect' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'mediaconvert' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'mediaconvert-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'mediaconvert.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'mediaconvert-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'mediaconvert-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'mediaconvert-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'mediaconvert-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'mediaconvert-fips.us-west-2.amazonaws.com', ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'mediaconvert-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'mediaconvert.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'mediaconvert-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'mediaconvert-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'mediaconvert.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'mediaconvert-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'mediaconvert.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'mediaconvert-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'mediaconvert-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'mediaconvert.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'medialive' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'medialive-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'medialive-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'medialive-fips.us-west-2.amazonaws.com', ], 'me-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'medialive-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'medialive-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'medialive-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'mediapackage' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'mediapackage-vod' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'mediapackagev2' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-4' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'mediapackagev2-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'mediapackagev2-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'mediapackagev2-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'mediapackagev2-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'mediapackagev2-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'mediapackagev2-fips.us-west-2.amazonaws.com', ], 'me-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'mediapackagev2-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'mediapackagev2-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'mediapackagev2-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'mediapackagev2-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'mediastore' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'meetings-chime' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'meetings-chime-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'meetings-chime-fips.ca-central-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-west-2' => [], 'il-central-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'meetings-chime-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'meetings-chime-fips.us-east-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'meetings-chime-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'meetings-chime-fips.us-west-2.amazonaws.com', ], ], ], 'memory-db' => [ 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'memory-db-fips.us-west-1.amazonaws.com', ], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'messaging-chime' => [ 'endpoints' => [ 'eu-central-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'messaging-chime-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'messaging-chime-fips.us-east-1.amazonaws.com', ], ], ], 'metering.marketplace' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'aws-marketplace', ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'metrics.sagemaker' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'metrics-fips.sagemaker.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'metrics-fips.sagemaker.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'metrics-fips.sagemaker.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'metrics-fips.sagemaker.ca-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'metrics-fips.sagemaker.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'metrics-fips.sagemaker.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'metrics-fips.sagemaker.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'metrics-fips.sagemaker.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'metrics-fips.sagemaker.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'metrics-fips.sagemaker.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'metrics-fips.sagemaker.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'metrics-fips.sagemaker.us-west-2.amazonaws.com', ], ], ], 'mgh' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'mgn' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'mgn-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'mgn-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'mgn-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'mgn-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'mgn-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'mgn-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'mgn-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'mgn-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'migrationhub-orchestrator' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'migrationhub-strategy' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'mobileanalytics' => [ 'endpoints' => [ 'us-east-1' => [], ], ], 'models-v2-lex' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'models.lex' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'lex', ], 'variants' => [ [ 'hostname' => 'models-fips.lex.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'models-fips.lex.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'models-fips.lex.us-east-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'models-fips.lex.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'models-fips.lex.us-west-2.amazonaws.com', ], ], ], 'monitoring' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'monitoring-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'monitoring-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'monitoring-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'monitoring-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'monitoring-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'monitoring-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'monitoring-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'monitoring-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'mq' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'mq-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'mq-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'mq-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'mq-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'mq-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'mq-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'mq-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'mq-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'mturk-requester' => [ 'endpoints' => [ 'sandbox' => [ 'hostname' => 'mturk-requester-sandbox.us-east-1.amazonaws.com', ], 'us-east-1' => [], ], 'isRegionalized' => false, ], 'neptune' => [ 'endpoints' => [ 'ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 'rds.ap-east-1.amazonaws.com', ], 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'rds.ap-northeast-1.amazonaws.com', ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'rds.ap-northeast-2.amazonaws.com', ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'rds.ap-south-1.amazonaws.com', ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'rds.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'rds.ap-southeast-2.amazonaws.com', ], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'rds.ca-central-1.amazonaws.com', ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'rds.eu-central-1.amazonaws.com', ], 'eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'rds.eu-north-1.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'rds.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'rds.eu-west-2.amazonaws.com', ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'rds.eu-west-3.amazonaws.com', ], 'me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 'rds.me-south-1.amazonaws.com', ], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'rds.sa-east-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'rds.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'rds.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'rds.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'rds.us-west-2.amazonaws.com', ], ], ], 'network-firewall' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'network-firewall-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'network-firewall-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'network-firewall-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'network-firewall-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'network-firewall-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'network-firewall-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'network-firewall-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'network-firewall-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'network-firewall-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'network-firewall-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'networkmanager' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'networkmanager.us-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'networkmanager-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'networkmanager-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'networkmanager.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-aws-global' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'networkmanager-fips.us-west-2.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'notifications' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'hostname' => 'notifications.af-south-1.api.aws', ], 'ap-east-1' => [ 'hostname' => 'notifications.ap-east-1.api.aws', ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'hostname' => 'notifications.ap-northeast-1.api.aws', ], 'ap-northeast-2' => [ 'hostname' => 'notifications.ap-northeast-2.api.aws', ], 'ap-northeast-3' => [ 'hostname' => 'notifications.ap-northeast-3.api.aws', ], 'ap-south-1' => [ 'hostname' => 'notifications.ap-south-1.api.aws', ], 'ap-south-2' => [ 'hostname' => 'notifications.ap-south-2.api.aws', ], 'ap-southeast-1' => [ 'hostname' => 'notifications.ap-southeast-1.api.aws', ], 'ap-southeast-2' => [ 'hostname' => 'notifications.ap-southeast-2.api.aws', ], 'ap-southeast-3' => [ 'hostname' => 'notifications.ap-southeast-3.api.aws', ], 'ap-southeast-4' => [ 'hostname' => 'notifications.ap-southeast-4.api.aws', ], 'ap-southeast-5' => [ 'hostname' => 'notifications.ap-southeast-5.api.aws', ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'hostname' => 'notifications.ap-southeast-7.api.aws', ], 'ca-central-1' => [ 'hostname' => 'notifications.ca-central-1.api.aws', ], 'ca-west-1' => [ 'hostname' => 'notifications.ca-west-1.api.aws', ], 'eu-central-1' => [ 'hostname' => 'notifications.eu-central-1.api.aws', ], 'eu-central-2' => [ 'hostname' => 'notifications.eu-central-2.api.aws', ], 'eu-north-1' => [ 'hostname' => 'notifications.eu-north-1.api.aws', ], 'eu-south-1' => [ 'hostname' => 'notifications.eu-south-1.api.aws', ], 'eu-south-2' => [ 'hostname' => 'notifications.eu-south-2.api.aws', ], 'eu-west-1' => [ 'hostname' => 'notifications.eu-west-1.api.aws', ], 'eu-west-2' => [ 'hostname' => 'notifications.eu-west-2.api.aws', ], 'eu-west-3' => [ 'hostname' => 'notifications.eu-west-3.api.aws', ], 'il-central-1' => [ 'hostname' => 'notifications.il-central-1.api.aws', ], 'me-central-1' => [ 'hostname' => 'notifications.me-central-1.api.aws', ], 'me-south-1' => [ 'hostname' => 'notifications.me-south-1.api.aws', ], 'mx-central-1' => [ 'hostname' => 'notifications.mx-central-1.api.aws', ], 'sa-east-1' => [ 'hostname' => 'notifications.sa-east-1.api.aws', ], 'us-east-1' => [ 'hostname' => 'notifications.us-east-1.api.aws', ], 'us-east-2' => [ 'hostname' => 'notifications.us-east-2.api.aws', ], 'us-west-1' => [ 'hostname' => 'notifications.us-west-1.api.aws', ], 'us-west-2' => [ 'hostname' => 'notifications.us-west-2.api.aws', ], ], ], 'notifications-contacts' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'notifications-contacts.us-east-1.api.aws', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'oam' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'oidc' => [ 'endpoints' => [ 'af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'hostname' => 'oidc.af-south-1.amazonaws.com', ], 'ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 'oidc.ap-east-1.amazonaws.com', ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'oidc.ap-northeast-1.amazonaws.com', ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'oidc.ap-northeast-2.amazonaws.com', ], 'ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 'oidc.ap-northeast-3.amazonaws.com', ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'oidc.ap-south-1.amazonaws.com', ], 'ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 'oidc.ap-south-2.amazonaws.com', ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'oidc.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'oidc.ap-southeast-2.amazonaws.com', ], 'ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'hostname' => 'oidc.ap-southeast-3.amazonaws.com', ], 'ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'hostname' => 'oidc.ap-southeast-4.amazonaws.com', ], 'ap-southeast-5' => [ 'credentialScope' => [ 'region' => 'ap-southeast-5', ], 'hostname' => 'oidc.ap-southeast-5.amazonaws.com', ], 'ap-southeast-7' => [], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'oidc.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'hostname' => 'oidc.ca-west-1.amazonaws.com', ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'oidc.eu-central-1.amazonaws.com', ], 'eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 'oidc.eu-central-2.amazonaws.com', ], 'eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'oidc.eu-north-1.amazonaws.com', ], 'eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'oidc.eu-south-1.amazonaws.com', ], 'eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 'oidc.eu-south-2.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'oidc.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'oidc.eu-west-2.amazonaws.com', ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'oidc.eu-west-3.amazonaws.com', ], 'il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'hostname' => 'oidc.il-central-1.amazonaws.com', ], 'me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'hostname' => 'oidc.me-central-1.amazonaws.com', ], 'me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 'oidc.me-south-1.amazonaws.com', ], 'mx-central-1' => [], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'oidc.sa-east-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'oidc.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'oidc.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'oidc.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'oidc.us-west-2.amazonaws.com', ], ], ], 'omics' => [ 'endpoints' => [ 'ap-northeast-2' => [], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'omics.ap-southeast-1.amazonaws.com', ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'omics.eu-central-1.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'omics.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'omics.eu-west-2.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'omics-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'omics-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'hostname' => 'omics.il-central-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'omics.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'omics-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'omics.us-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'omics-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'organizations' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'organizations.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'organizations-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'organizations-fips.us-east-1.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'osis' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'outposts' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'outposts-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'outposts-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'outposts-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'outposts-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'outposts-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'outposts-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'outposts-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'outposts-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'outposts-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'outposts-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'participant.connect' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'participant.connect-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'participant.connect-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'participant.connect-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'participant.connect-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'personalize' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'pi' => [ 'endpoints' => [ 'af-south-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'pi-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'pi.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'pi-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'pi.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'pi-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'pi-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'pi-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'pi-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'pi-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'pi-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'pi-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'pi.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'pi-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'pi.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'pi-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'pi.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'pi-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'pi.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'pinpoint' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'mobiletargeting', ], ], 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'pinpoint.ca-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'pinpoint-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'pinpoint-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'pinpoint-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'pinpoint-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'pinpoint-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'pinpoint.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'pinpoint-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'pinpoint.us-east-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'pinpoint-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'pinpoint.us-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'pinpoint-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'pipes' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'polly' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'polly.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'polly.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'polly.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'polly.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'polly.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'polly.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'polly.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'polly.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'polly.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'polly-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'polly-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'polly.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'polly.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'polly.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'polly.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'polly.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'polly.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'polly.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'polly-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'polly-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'polly-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'polly-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'polly-fips.us-west-2.amazonaws.com', ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'polly.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'polly.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'polly-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'polly-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'polly.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'polly-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'polly-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'polly.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'polly-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'polly-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'polly.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'polly-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'polly-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'polly.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'portal.sso' => [ 'endpoints' => [ 'af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'hostname' => 'portal.sso.af-south-1.amazonaws.com', ], 'ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 'portal.sso.ap-east-1.amazonaws.com', ], 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'portal.sso.ap-northeast-1.amazonaws.com', ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'portal.sso.ap-northeast-2.amazonaws.com', ], 'ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 'portal.sso.ap-northeast-3.amazonaws.com', ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'portal.sso.ap-south-1.amazonaws.com', ], 'ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 'portal.sso.ap-south-2.amazonaws.com', ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'portal.sso.ap-southeast-1.amazonaws.com', ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'portal.sso.ap-southeast-2.amazonaws.com', ], 'ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'hostname' => 'portal.sso.ap-southeast-3.amazonaws.com', ], 'ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'hostname' => 'portal.sso.ap-southeast-4.amazonaws.com', ], 'ap-southeast-5' => [ 'credentialScope' => [ 'region' => 'ap-southeast-5', ], 'hostname' => 'portal.sso.ap-southeast-5.amazonaws.com', ], 'ap-southeast-7' => [], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'portal.sso.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'hostname' => 'portal.sso.ca-west-1.amazonaws.com', ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'portal.sso.eu-central-1.amazonaws.com', ], 'eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 'portal.sso.eu-central-2.amazonaws.com', ], 'eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'portal.sso.eu-north-1.amazonaws.com', ], 'eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'portal.sso.eu-south-1.amazonaws.com', ], 'eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 'portal.sso.eu-south-2.amazonaws.com', ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'portal.sso.eu-west-1.amazonaws.com', ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'portal.sso.eu-west-2.amazonaws.com', ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'portal.sso.eu-west-3.amazonaws.com', ], 'il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'hostname' => 'portal.sso.il-central-1.amazonaws.com', ], 'me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'hostname' => 'portal.sso.me-central-1.amazonaws.com', ], 'me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 'portal.sso.me-south-1.amazonaws.com', ], 'mx-central-1' => [], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'portal.sso.sa-east-1.amazonaws.com', ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'portal.sso.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'portal.sso.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'portal.sso.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'portal.sso.us-west-2.amazonaws.com', ], ], ], 'profile' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'profile-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'profile-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'profile-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'profile-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'profile-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'profile-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'proton' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'qbusiness' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'hostname' => 'qbusiness.af-south-1.api.aws', ], 'ap-east-1' => [ 'hostname' => 'qbusiness.ap-east-1.api.aws', ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'hostname' => 'qbusiness.ap-northeast-1.api.aws', ], 'ap-northeast-2' => [ 'hostname' => 'qbusiness.ap-northeast-2.api.aws', ], 'ap-northeast-3' => [ 'hostname' => 'qbusiness.ap-northeast-3.api.aws', ], 'ap-south-1' => [ 'hostname' => 'qbusiness.ap-south-1.api.aws', ], 'ap-south-2' => [ 'hostname' => 'qbusiness.ap-south-2.api.aws', ], 'ap-southeast-1' => [ 'hostname' => 'qbusiness.ap-southeast-1.api.aws', ], 'ap-southeast-2' => [ 'hostname' => 'qbusiness.ap-southeast-2.api.aws', ], 'ap-southeast-3' => [ 'hostname' => 'qbusiness.ap-southeast-3.api.aws', ], 'ap-southeast-4' => [ 'hostname' => 'qbusiness.ap-southeast-4.api.aws', ], 'ap-southeast-5' => [ 'hostname' => 'qbusiness.ap-southeast-5.api.aws', ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'hostname' => 'qbusiness.ap-southeast-7.api.aws', ], 'ca-central-1' => [ 'hostname' => 'qbusiness.ca-central-1.api.aws', ], 'ca-west-1' => [ 'hostname' => 'qbusiness.ca-west-1.api.aws', ], 'eu-central-1' => [ 'hostname' => 'qbusiness.eu-central-1.api.aws', ], 'eu-central-2' => [ 'hostname' => 'qbusiness.eu-central-2.api.aws', ], 'eu-north-1' => [ 'hostname' => 'qbusiness.eu-north-1.api.aws', ], 'eu-south-1' => [ 'hostname' => 'qbusiness.eu-south-1.api.aws', ], 'eu-south-2' => [ 'hostname' => 'qbusiness.eu-south-2.api.aws', ], 'eu-west-1' => [ 'hostname' => 'qbusiness.eu-west-1.api.aws', ], 'eu-west-2' => [ 'hostname' => 'qbusiness.eu-west-2.api.aws', ], 'eu-west-3' => [ 'hostname' => 'qbusiness.eu-west-3.api.aws', ], 'il-central-1' => [ 'hostname' => 'qbusiness.il-central-1.api.aws', ], 'me-central-1' => [ 'hostname' => 'qbusiness.me-central-1.api.aws', ], 'me-south-1' => [ 'hostname' => 'qbusiness.me-south-1.api.aws', ], 'mx-central-1' => [ 'hostname' => 'qbusiness.mx-central-1.api.aws', ], 'sa-east-1' => [ 'hostname' => 'qbusiness.sa-east-1.api.aws', ], 'us-east-1' => [ 'hostname' => 'qbusiness.us-east-1.api.aws', ], 'us-east-2' => [ 'hostname' => 'qbusiness.us-east-2.api.aws', ], 'us-west-1' => [ 'hostname' => 'qbusiness.us-west-1.api.aws', ], 'us-west-2' => [ 'hostname' => 'qbusiness.us-west-2.api.aws', ], ], ], 'query.timestream' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'quicksight' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'ram' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'ram-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ram-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'ram-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ram-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'ram-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'ram-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ram-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ram-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ram-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ram-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'ram-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ram-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'ram-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ram-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'ram-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ram-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'ram-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ram-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], ], ], 'rbin' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'rbin.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'rbin.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rbin-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rbin.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rbin-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rbin.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'rbin.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'rbin.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'rbin.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'rbin.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'rbin.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'rbin.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'rbin.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'rbin.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'rbin.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'rbin.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'rbin.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'rbin.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rbin-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rbin.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rbin-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rbin.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rbin-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rbin.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rbin-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rbin.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'rds' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'rds-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'rds-fips.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'rds-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'rds-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'rds-fips.ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'rds-fips.ca-central-1.amazonaws.com', ], 'rds-fips.ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'rds-fips.ca-west-1.amazonaws.com', ], 'rds-fips.us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'rds-fips.us-east-1.amazonaws.com', ], 'rds-fips.us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'rds-fips.us-east-2.amazonaws.com', ], 'rds-fips.us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'rds-fips.us-west-1.amazonaws.com', ], 'rds-fips.us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'rds-fips.us-west-2.amazonaws.com', ], 'rds.ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rds-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rds.ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rds-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rds.us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rds-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rds.us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rds-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rds.us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rds-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rds.us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rds-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'sa-east-1' => [], 'us-east-1' => [ 'sslCommonName' => '{service}.{dnsSuffix}', 'variants' => [ [ 'hostname' => 'rds-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'rds-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'rds-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'rds-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'rds-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'rds-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'rds-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'rds-fips.us-west-2.amazonaws.com', ], ], ], 'rds-data' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'rds-data-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'rds-data-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'rds-data-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'rds-data-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'rds-data-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'rds-data-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'rds-data-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'rds-data-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'redshift' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'redshift-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'redshift-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'redshift-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'redshift-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'redshift-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'redshift-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'redshift-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'redshift-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'redshift-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'redshift-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'redshift-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'redshift-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'redshift-serverless' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'redshift-serverless-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'redshift-serverless-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'redshift-serverless-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'redshift-serverless-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'redshift-serverless-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'redshift-serverless-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'redshift-serverless-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'redshift-serverless-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'redshift-serverless-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'redshift-serverless-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'rekognition' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'rekognition.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'rekognition.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'rekognition.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'rekognition.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'rekognition.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'rekognition-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rekognition-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rekognition.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.ca-central-1.amazonaws.com', ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'rekognition.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'rekognition.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'rekognition.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'rekognition.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'rekognition.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'rekognition-fips.ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.ca-central-1.amazonaws.com', ], 'rekognition-fips.us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-east-1.amazonaws.com', ], 'rekognition-fips.us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-east-2.amazonaws.com', ], 'rekognition-fips.us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-west-1.amazonaws.com', ], 'rekognition-fips.us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-west-2.amazonaws.com', ], 'rekognition.ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rekognition-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rekognition.us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rekognition-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rekognition.us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rekognition-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rekognition.us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rekognition-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'rekognition.us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rekognition-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'rekognition-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rekognition-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rekognition.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'rekognition-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rekognition-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rekognition.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'rekognition-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rekognition-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rekognition.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'rekognition-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rekognition-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rekognition.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-west-2.amazonaws.com', ], ], ], 'resiliencehub' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'resiliencehub.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'resource-explorer-2' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'resource-explorer-2-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'resource-explorer-2-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'resource-explorer-2-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'resource-explorer-2-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'resource-explorer-2-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'resource-explorer-2-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'resource-explorer-2-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'resource-explorer-2-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'resource-explorer-2-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'resource-explorer-2-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'resource-explorer-2-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'resource-explorer-2-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'resource-explorer-2-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'resource-explorer-2-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'resource-explorer-2-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'resource-explorer-2-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'resource-explorer-2-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'resource-explorer-2-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], ], ], 'resource-groups' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'resource-groups-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'resource-groups-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'resource-groups-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'resource-groups-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'resource-groups-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'resource-groups-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'resource-groups-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'resource-groups-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'rolesanywhere' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'rolesanywhere-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'rolesanywhere-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'rolesanywhere-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'rolesanywhere-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'rolesanywhere-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'rolesanywhere-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'rolesanywhere-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'rolesanywhere-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'route53' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'route53.amazonaws.com', 'variants' => [ [ 'hostname' => 'route53-fips.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'route53-fips.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'route53-recovery-control-config' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'route53-recovery-control-config.us-west-2.amazonaws.com', ], ], ], 'route53domains' => [ 'endpoints' => [ 'us-east-1' => [], ], ], 'route53profiles' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'route53profiles.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53profiles.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53profiles.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'route53profiles.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'route53profiles.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'route53profiles.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'route53profiles.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53profiles.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'route53profiles-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53profiles.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53profiles.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'route53profiles-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53profiles.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'route53resolver' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'route53resolver.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'route53resolver-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53resolver.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'route53resolver-fips.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'route53resolver-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53resolver.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'route53resolver-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'route53resolver.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'route53resolver.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'route53resolver.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'route53resolver.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'route53resolver-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53resolver.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'route53resolver-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'route53resolver-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'route53resolver-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53resolver.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'route53resolver-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'route53resolver-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53resolver.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'route53resolver-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'route53resolver-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'route53resolver-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53resolver.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'route53resolver-fips.us-west-2.amazonaws.com', ], ], ], 'rum' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'runtime-v2-lex' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'runtime.lex' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'lex', ], 'variants' => [ [ 'hostname' => 'runtime-fips.lex.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'runtime-fips.lex.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'runtime-fips.lex.us-east-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'runtime-fips.lex.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'runtime-fips.lex.us-west-2.amazonaws.com', ], ], ], 'runtime.sagemaker' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'runtime-fips.sagemaker.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'runtime-fips.sagemaker.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'runtime-fips.sagemaker.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'runtime-fips.sagemaker.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'runtime-fips.sagemaker.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'runtime-fips.sagemaker.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'runtime-fips.sagemaker.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'runtime-fips.sagemaker.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'runtime-fips.sagemaker.us-west-2.amazonaws.com', ], ], ], 's3' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.af-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'hostname' => 's3.ap-northeast-1.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'hostname' => 's3.dualstack.ap-northeast-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-northeast-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-northeast-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-south-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'hostname' => 's3.ap-southeast-1.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'hostname' => 's3.dualstack.ap-southeast-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'hostname' => 's3.ap-southeast-2.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'hostname' => 's3.dualstack.ap-southeast-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-southeast-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-southeast-4.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-southeast-5.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.ap-southeast-7.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 's3.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 's3-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-fips.dualstack.ca-central-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3.dualstack.ca-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 's3-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-fips.dualstack.ca-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3.dualstack.ca-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.eu-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.eu-central-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.eu-north-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.eu-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.eu-south-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'hostname' => 's3.eu-west-1.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'hostname' => 's3.dualstack.eu-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.eu-west-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.eu-west-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 's3-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 's3-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 's3-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 's3-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 's3-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 's3-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.il-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.me-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.me-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.mx-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 's3-external-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 's3-external-1.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], ], 'sa-east-1' => [ 'hostname' => 's3.sa-east-1.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'hostname' => 's3.dualstack.sa-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'hostname' => 's3.us-east-1.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'hostname' => 's3-fips.dualstack.us-east-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3.dualstack.us-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 's3-fips.dualstack.us-east-2.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3.dualstack.us-east-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'hostname' => 's3.us-west-1.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'hostname' => 's3-fips.dualstack.us-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3.dualstack.us-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'hostname' => 's3.us-west-2.amazonaws.com', 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'hostname' => 's3-fips.dualstack.us-west-2.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3.dualstack.us-west-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], ], 'isRegionalized' => true, 'partitionEndpoint' => 'aws-global', ], 's3-control' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'hostname' => 's3-control.af-south-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.af-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 's3-control.ap-east-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 's3-control.ap-northeast-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-northeast-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 's3-control.ap-northeast-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-northeast-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 's3-control.ap-northeast-3.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-northeast-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 's3-control.ap-south-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 's3-control.ap-south-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-south-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 's3-control.ap-southeast-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-southeast-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 's3-control.ap-southeast-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-southeast-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'hostname' => 's3-control.ap-southeast-3.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-southeast-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'hostname' => 's3-control.ap-southeast-4.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.ap-southeast-4.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 's3-control.ca-central-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control-fips.dualstack.ca-central-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control.dualstack.ca-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.ca-central-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], ], 'ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'hostname' => 's3-control.ca-west-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control-fips.dualstack.ca-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control.dualstack.ca-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.ca-west-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 's3-control.eu-central-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.eu-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 's3-control.eu-central-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.eu-central-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 's3-control.eu-north-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.eu-north-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 's3-control.eu-south-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.eu-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 's3-control.eu-south-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.eu-south-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 's3-control.eu-west-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.eu-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 's3-control.eu-west-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.eu-west-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 's3-control.eu-west-3.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.eu-west-3.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'hostname' => 's3-control.il-central-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.il-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'hostname' => 's3-control.me-central-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.me-central-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 's3-control.me-south-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.me-south-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 's3-control.sa-east-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.sa-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 's3-control.us-east-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-east-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-east-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 's3-control.us-east-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-east-2.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-east-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-east-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], ], 'us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 's3-control.us-west-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-west-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 's3-control.us-west-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-west-2.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-west-2.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-west-2.amazonaws.com', 'signatureVersions' => [ 's3v4', ], ], ], ], 's3-outposts' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'deprecated' => true, ], 'fips-us-east-1' => [ 'deprecated' => true, ], 'fips-us-east-2' => [ 'deprecated' => true, ], 'fips-us-west-1' => [ 'deprecated' => true, ], 'fips-us-west-2' => [ 'deprecated' => true, ], 'il-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], ], ], 'sagemaker-geospatial' => [ 'endpoints' => [ 'us-west-2' => [], ], ], 'savingsplans' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'savingsplans.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'scheduler' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'schemas' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'sdb' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'signatureVersions' => [ 'v2', ], ], 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'hostname' => 'sdb.amazonaws.com', ], 'us-west-1' => [], 'us-west-2' => [], ], ], 'secretsmanager' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'deprecated' => true, ], 'ca-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'deprecated' => true, ], 'eu-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'deprecated' => true, ], 'us-east-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'deprecated' => true, ], 'us-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'deprecated' => true, ], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'deprecated' => true, ], ], ], 'securityhub' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'securityhub.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'securityhub.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'securityhub.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'securityhub.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'securityhub.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'securityhub-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'securityhub-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'securityhub-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'securityhub-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'securityhub.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'securityhub-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securityhub.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'securityhub-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securityhub.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'securityhub-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securityhub.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'securityhub-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securityhub.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'securitylake' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'securitylake-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'securitylake-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'securitylake-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'securitylake-fips.us-west-2.amazonaws.com', ], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'securitylake-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securitylake-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'securitylake-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securitylake-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'securitylake-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securitylake-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'securitylake-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securitylake-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], ], ], 'serverlessrepo' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-east-1' => [ 'protocols' => [ 'https', ], ], 'ap-northeast-1' => [ 'protocols' => [ 'https', ], ], 'ap-northeast-2' => [ 'protocols' => [ 'https', ], ], 'ap-south-1' => [ 'protocols' => [ 'https', ], ], 'ap-southeast-1' => [ 'protocols' => [ 'https', ], ], 'ap-southeast-2' => [ 'protocols' => [ 'https', ], ], 'ca-central-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'serverlessrepo-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'serverlessrepo-fips.ca-central-1.amazonaws.com', ], 'eu-central-1' => [ 'protocols' => [ 'https', ], ], 'eu-north-1' => [ 'protocols' => [ 'https', ], ], 'eu-west-1' => [ 'protocols' => [ 'https', ], ], 'eu-west-2' => [ 'protocols' => [ 'https', ], ], 'eu-west-3' => [ 'protocols' => [ 'https', ], ], 'me-south-1' => [ 'protocols' => [ 'https', ], ], 'sa-east-1' => [ 'protocols' => [ 'https', ], ], 'us-east-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'serverlessrepo-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'serverlessrepo-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'serverlessrepo-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'serverlessrepo-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'serverlessrepo-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'serverlessrepo-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'serverlessrepo-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'serverlessrepo-fips.us-west-2.amazonaws.com', ], ], ], 'servicecatalog' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'servicecatalog-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'servicecatalog-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'servicecatalog-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'servicecatalog-fips.us-west-2.amazonaws.com', ], ], ], 'servicecatalog-appregistry' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-appregistry-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'servicecatalog-appregistry-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'servicecatalog-appregistry-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'servicecatalog-appregistry-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'servicecatalog-appregistry-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'servicecatalog-appregistry-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-appregistry-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-appregistry-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-appregistry-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-appregistry-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'servicediscovery' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'servicediscovery-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'servicediscovery.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'servicediscovery-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'servicediscovery.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'servicediscovery-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'servicediscovery.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'servicediscovery-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'servicediscovery-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'servicediscovery.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'servicediscovery-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'servicediscovery.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'servicediscovery-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'servicediscovery-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'servicediscovery.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.us-west-2.amazonaws.com', ], ], ], 'servicequotas' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'shield' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'sslCommonName' => 'shield.us-east-1.amazonaws.com', ], 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'shield.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'shield-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'shield-fips.us-east-1.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'signer' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'signer-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'signer-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'signer-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'signer-fips.us-west-2.amazonaws.com', ], 'fips-verification-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'verification.signer-fips.us-east-1.amazonaws.com', ], 'fips-verification-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'verification.signer-fips.us-east-2.amazonaws.com', ], 'fips-verification-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'verification.signer-fips.us-west-1.amazonaws.com', ], 'fips-verification-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'verification.signer-fips.us-west-2.amazonaws.com', ], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'signer-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'signer-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'signer-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'signer-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'verification-af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'hostname' => 'verification.signer.af-south-1.amazonaws.com', ], 'verification-ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 'verification.signer.ap-east-1.amazonaws.com', ], 'verification-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'verification.signer.ap-northeast-1.amazonaws.com', ], 'verification-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'verification.signer.ap-northeast-2.amazonaws.com', ], 'verification-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'verification.signer.ap-south-1.amazonaws.com', ], 'verification-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'verification.signer.ap-southeast-1.amazonaws.com', ], 'verification-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'verification.signer.ap-southeast-2.amazonaws.com', ], 'verification-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'verification.signer.ca-central-1.amazonaws.com', ], 'verification-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'verification.signer.eu-central-1.amazonaws.com', ], 'verification-eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'verification.signer.eu-north-1.amazonaws.com', ], 'verification-eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'verification.signer.eu-south-1.amazonaws.com', ], 'verification-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'verification.signer.eu-west-1.amazonaws.com', ], 'verification-eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'verification.signer.eu-west-2.amazonaws.com', ], 'verification-eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'verification.signer.eu-west-3.amazonaws.com', ], 'verification-me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 'verification.signer.me-south-1.amazonaws.com', ], 'verification-sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'verification.signer.sa-east-1.amazonaws.com', ], 'verification-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'verification.signer.us-east-1.amazonaws.com', ], 'verification-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'verification.signer.us-east-2.amazonaws.com', ], 'verification-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'verification.signer.us-west-1.amazonaws.com', ], 'verification-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'verification.signer.us-west-2.amazonaws.com', ], ], ], 'simspaceweaver' => [ 'endpoints' => [ 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'sms-voice' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'sms-voice.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sms-voice-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'sms-voice.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sms-voice-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'sms-voice.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'sms-voice.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'sms-voice.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'sms-voice.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'sms-voice.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'sms-voice-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'sms-voice-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'sms-voice-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'sms-voice-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'sms-voice-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'sms-voice-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sms-voice-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'sms-voice.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'sms-voice-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sms-voice-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'sms-voice.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sms-voice-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'sms-voice.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'sms-voice-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sms-voice-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'sms-voice.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'snowball' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.af-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.af-south-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ap-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ap-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ap-northeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ap-northeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ap-northeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ap-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ap-south-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ap-southeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ap-southeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ap-southeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.eu-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.eu-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.eu-north-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.eu-north-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.eu-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.eu-south-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.eu-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.eu-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.eu-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.eu-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.eu-west-3.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.eu-west-3.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.af-south-1.amazonaws.com', ], 'fips-ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ap-east-1.amazonaws.com', ], 'fips-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ap-northeast-1.amazonaws.com', ], 'fips-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ap-northeast-2.amazonaws.com', ], 'fips-ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ap-northeast-3.amazonaws.com', ], 'fips-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ap-south-1.amazonaws.com', ], 'fips-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ap-southeast-1.amazonaws.com', ], 'fips-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ap-southeast-2.amazonaws.com', ], 'fips-ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ap-southeast-3.amazonaws.com', ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.ca-central-1.amazonaws.com', ], 'fips-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.eu-central-1.amazonaws.com', ], 'fips-eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.eu-north-1.amazonaws.com', ], 'fips-eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.eu-south-1.amazonaws.com', ], 'fips-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.eu-west-1.amazonaws.com', ], 'fips-eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'deprecated' => true, 'hostname' => 'snowball-fips.eu-west-2.amazonaws.com', ], 'fips-eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'deprecated' => true, 'hostname' => 'snowball-fips.eu-west-3.amazonaws.com', ], 'fips-il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.il-central-1.amazonaws.com', ], 'fips-me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.me-central-1.amazonaws.com', ], 'fips-sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.sa-east-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'snowball-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'snowball-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.il-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.il-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.me-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.me-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.sa-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.sa-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'sns' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'sns.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'sns.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'sns.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'sns.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'sns.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'sns.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'sns.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'sns.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'sns.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'sns.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'sns.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'sns.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'sns.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'sns.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'sns-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sns.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'sns.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'sns.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'sns.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'sns.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'sns.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'sns.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'sns.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'sns.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'sns-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'sns-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'sns-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'sns-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'sns-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'sns.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'sns.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'sns.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'sns.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'sns.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'sns-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sns.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'sns-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sns.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'sns-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sns.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'sns-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sns.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'sqs' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'sslCommonName' => '{region}.queue.{dnsSuffix}', ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'sqs.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'sqs.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'sqs-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sqs.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'sqs-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sqs.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'sqs.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'sqs.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'sqs.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'sqs.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'sqs.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'sqs.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'sqs.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'sqs.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'sqs-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'sqs-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'sqs-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'sqs-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'sqs-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'sqs-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'sqs.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'sqs.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'sqs.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'sqs.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'sqs.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'sslCommonName' => 'queue.{dnsSuffix}', 'variants' => [ [ 'hostname' => 'sqs-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sqs.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'sqs-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sqs.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'sqs-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sqs.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'sqs-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sqs.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'ssm' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'ssm-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'ssm-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'ssm-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ssm-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ssm-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ssm-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ssm-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ssm-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ssm-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ssm-contacts' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ssm-contacts-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ssm-contacts-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ssm-contacts-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ssm-contacts-fips.us-west-2.amazonaws.com', ], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm-contacts-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ssm-contacts-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm-contacts-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ssm-contacts-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ssm-incidents' => [ 'endpoints' => [ 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-incidents-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-incidents.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'ssm-incidents-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ssm-incidents-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ssm-incidents-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ssm-incidents-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ssm-incidents-fips.us-west-2.amazonaws.com', ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-incidents-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-incidents.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-incidents-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-incidents.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-incidents-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-incidents.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ssm-incidents-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-incidents-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-incidents.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'ssm-quicksetup' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'ssm-quicksetup-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'ssm-quicksetup-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ssm-quicksetup-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ssm-quicksetup-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ssm-quicksetup-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ssm-quicksetup-fips.us-west-2.amazonaws.com', ], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm-quicksetup-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ssm-quicksetup-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm-quicksetup-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ssm-quicksetup-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ssm-sap' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-sap-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-sap.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'ssm-sap-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'ssm-sap-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'ssm-sap-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'ssm-sap-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'ssm-sap-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-sap-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-sap.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'ssm-sap-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-sap-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-sap.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm-sap-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-sap-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-sap.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'ssm-sap-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ssm-sap-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ssm-sap.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'sso' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'states' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'states-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'states-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'states-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'states-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'states-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'states-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'states-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'states-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'states-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'states-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'states-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'states-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'storagegateway' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.ca-central-1.amazonaws.com', ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.ca-west-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-west-2.amazonaws.com', ], ], ], 'streams.dynamodb' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'dynamodb', ], 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'local' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'localhost:8000', 'protocols' => [ 'http', ], ], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'sts' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'sts.amazonaws.com', ], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'sts-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'sts-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'sts-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'sts-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'sts-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'sts-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'sts-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'sts-fips.us-west-2.amazonaws.com', ], ], 'partitionEndpoint' => 'aws-global', ], 'support' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'support.us-east-1.amazonaws.com', ], ], 'partitionEndpoint' => 'aws-global', ], 'supportapp' => [ 'endpoints' => [ 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'swf' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'swf-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'swf-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'swf-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'swf-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'swf-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'swf-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'swf-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'swf-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'swf-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'swf-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'swf-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'swf-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'synthetics' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-3' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-northeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-2' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-3' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-southeast-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-4' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-southeast-4.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-5' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-southeast-5.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-6' => [], 'ap-southeast-7' => [ 'variants' => [ [ 'hostname' => 'synthetics.ap-southeast-7.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'synthetics-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'synthetics-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'synthetics.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'synthetics-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'synthetics-fips.ca-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'synthetics.ca-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-2' => [ 'variants' => [ [ 'hostname' => 'synthetics.eu-central-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.eu-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'synthetics.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'synthetics.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'synthetics.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'synthetics-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'synthetics-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'synthetics-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'synthetics-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'synthetics-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'synthetics-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.il-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-central-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.me-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'mx-central-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.mx-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'synthetics-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'synthetics-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'synthetics.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'synthetics-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'synthetics-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'synthetics.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'synthetics-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'synthetics-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'synthetics.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'synthetics-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'synthetics-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'synthetics.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'tagging' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'tax' => [ 'endpoints' => [ 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'tax.us-east-1.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'textract' => [ 'endpoints' => [ 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'textract.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'textract.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'textract.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'textract.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'textract-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'textract-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'textract.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'textract.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-south-2' => [ 'variants' => [ [ 'hostname' => 'textract.eu-south-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'textract.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'textract.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'textract.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'textract-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'textract-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'textract-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'textract-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'textract-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'textract-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'textract-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'textract.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'textract-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'textract-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'textract.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'textract-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'textract-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'textract.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'textract-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'textract-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'textract.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'thinclient' => [ 'endpoints' => [ 'ap-south-1' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'tnb' => [ 'endpoints' => [ 'ap-northeast-2' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'transcribe' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'fips.transcribe.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'transcribe.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'transcribe.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'fips.transcribe.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribe-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribe.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'transcribe.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'transcribe.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'fips.transcribe.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'fips.transcribe.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'fips.transcribe.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'fips.transcribe.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'fips.transcribe.us-west-2.amazonaws.com', ], 'me-south-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.me-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'transcribe.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'fips.transcribe.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribe-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribe.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'fips.transcribe.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribe-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribe.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'fips.transcribe.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribe-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribe.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'fips.transcribe.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribe-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribe.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'transcribestreaming' => [ 'endpoints' => [ 'af-south-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.af-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribestreaming-fips.ca-central-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribestreaming.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'transcribestreaming-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'transcribestreaming-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'transcribestreaming-fips.us-east-2.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'transcribestreaming-fips.us-west-2.amazonaws.com', ], 'sa-east-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.sa-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribestreaming-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribestreaming.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribestreaming-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribestreaming.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribestreaming-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribestreaming.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'transfer' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'transfer-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'transfer-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'transfer-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'transfer-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'transfer-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'transfer-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'transfer-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'transfer-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'transfer-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'transfer-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'transfer-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'transfer-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'translate' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'ap-east-1' => [ 'variants' => [ [ 'hostname' => 'translate.ap-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-1' => [ 'variants' => [ [ 'hostname' => 'translate.ap-northeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-northeast-2' => [ 'variants' => [ [ 'hostname' => 'translate.ap-northeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-south-1' => [ 'variants' => [ [ 'hostname' => 'translate.ap-south-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-1' => [ 'variants' => [ [ 'hostname' => 'translate.ap-southeast-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ap-southeast-2' => [ 'variants' => [ [ 'hostname' => 'translate.ap-southeast-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'translate.ca-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-central-1' => [ 'variants' => [ [ 'hostname' => 'translate.eu-central-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-north-1' => [ 'variants' => [ [ 'hostname' => 'translate.eu-north-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-1' => [ 'variants' => [ [ 'hostname' => 'translate.eu-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-2' => [ 'variants' => [ [ 'hostname' => 'translate.eu-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'eu-west-3' => [ 'variants' => [ [ 'hostname' => 'translate.eu-west-3.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'translate-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'translate-fips.us-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'translate.us-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'translate-fips.us-east-1.amazonaws.com', ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'translate-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'translate-fips.us-east-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'translate.us-east-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-east-2-fips' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'translate-fips.us-east-2.amazonaws.com', ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'translate-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'translate-fips.us-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'translate.us-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'translate-fips.us-west-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'translate-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'translate-fips.us-west-2.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'translate.us-west-2.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'translate-fips.us-west-2.amazonaws.com', ], ], ], 'trustedadvisor' => [ 'endpoints' => [ 'ap-northeast-2' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'trustedadvisor-fips.us-east-1.api.aws', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'trustedadvisor-fips.us-east-2.api.aws', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'trustedadvisor-fips.us-west-2.api.aws', ], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => [], ], ], 'verifiedpermissions' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'verifiedpermissions-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'variants' => [ [ 'hostname' => 'verifiedpermissions-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'verifiedpermissions-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'verifiedpermissions-fips.ca-west-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'verifiedpermissions-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'verifiedpermissions-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'verifiedpermissions-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'verifiedpermissions-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'verifiedpermissions-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'verifiedpermissions-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'verifiedpermissions-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'verifiedpermissions-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'voice-chime' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'voice-chime-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1-fips' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'voice-chime-fips.ca-central-1.amazonaws.com', ], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'voice-chime-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'voice-chime-fips.us-east-1.amazonaws.com', ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'voice-chime-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2-fips' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'voice-chime-fips.us-west-2.amazonaws.com', ], ], ], 'voiceid' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'hostname' => 'voiceid-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'voiceid-fips.ca-central-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'voiceid-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'voiceid-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'voiceid-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'voiceid-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'vpc-lattice' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'waf' => [ 'endpoints' => [ 'aws' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'waf-fips.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'aws-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'waf-fips.amazonaws.com', ], 'aws-global' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'waf.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-fips.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'aws-global-fips' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'waf-fips.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-global', ], 'waf-regional' => [ 'endpoints' => [ 'af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'hostname' => 'waf-regional.af-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.af-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 'waf-regional.ap-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'waf-regional.ap-northeast-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-northeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'waf-regional.ap-northeast-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-northeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 'waf-regional.ap-northeast-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-northeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'waf-regional.ap-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 'waf-regional.ap-south-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-south-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'waf-regional.ap-southeast-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-southeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'waf-regional.ap-southeast-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-southeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'hostname' => 'waf-regional.ap-southeast-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-southeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'hostname' => 'waf-regional.ap-southeast-4.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ap-southeast-4.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'waf-regional.ca-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'waf-regional.eu-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.eu-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 'waf-regional.eu-central-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.eu-central-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'waf-regional.eu-north-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.eu-north-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'waf-regional.eu-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.eu-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 'waf-regional.eu-south-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.eu-south-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'waf-regional.eu-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.eu-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'waf-regional.eu-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.eu-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'waf-regional.eu-west-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.eu-west-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.af-south-1.amazonaws.com', ], 'fips-ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-east-1.amazonaws.com', ], 'fips-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-northeast-1.amazonaws.com', ], 'fips-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-northeast-2.amazonaws.com', ], 'fips-ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-northeast-3.amazonaws.com', ], 'fips-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-south-1.amazonaws.com', ], 'fips-ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-south-2.amazonaws.com', ], 'fips-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-southeast-1.amazonaws.com', ], 'fips-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-southeast-2.amazonaws.com', ], 'fips-ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-southeast-3.amazonaws.com', ], 'fips-ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ap-southeast-4.amazonaws.com', ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.ca-central-1.amazonaws.com', ], 'fips-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.eu-central-1.amazonaws.com', ], 'fips-eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.eu-central-2.amazonaws.com', ], 'fips-eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.eu-north-1.amazonaws.com', ], 'fips-eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.eu-south-1.amazonaws.com', ], 'fips-eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.eu-south-2.amazonaws.com', ], 'fips-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.eu-west-1.amazonaws.com', ], 'fips-eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.eu-west-2.amazonaws.com', ], 'fips-eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.eu-west-3.amazonaws.com', ], 'fips-il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.il-central-1.amazonaws.com', ], 'fips-me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.me-central-1.amazonaws.com', ], 'fips-me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.me-south-1.amazonaws.com', ], 'fips-sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.sa-east-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'hostname' => 'waf-regional.il-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.il-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'hostname' => 'waf-regional.me-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.me-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 'waf-regional.me-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.me-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'waf-regional.sa-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.sa-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'waf-regional.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'waf-regional.us-east-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'waf-regional.us-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'waf-regional.us-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'wafv2' => [ 'endpoints' => [ 'af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'hostname' => 'wafv2.af-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.af-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'hostname' => 'wafv2.ap-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-east-2' => [], 'ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'hostname' => 'wafv2.ap-northeast-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-northeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'hostname' => 'wafv2.ap-northeast-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-northeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'hostname' => 'wafv2.ap-northeast-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-northeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'hostname' => 'wafv2.ap-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'hostname' => 'wafv2.ap-south-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-south-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'hostname' => 'wafv2.ap-southeast-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-southeast-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'hostname' => 'wafv2.ap-southeast-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-southeast-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'hostname' => 'wafv2.ap-southeast-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-southeast-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'hostname' => 'wafv2.ap-southeast-4.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-southeast-4.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-5' => [ 'credentialScope' => [ 'region' => 'ap-southeast-5', ], 'hostname' => 'wafv2.ap-southeast-5.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-southeast-5.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ap-southeast-7' => [ 'credentialScope' => [ 'region' => 'ap-southeast-7', ], 'hostname' => 'wafv2.ap-southeast-7.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ap-southeast-7.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'hostname' => 'wafv2.ca-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ca-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'hostname' => 'wafv2.ca-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.ca-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'hostname' => 'wafv2.eu-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.eu-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'hostname' => 'wafv2.eu-central-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.eu-central-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'hostname' => 'wafv2.eu-north-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.eu-north-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'hostname' => 'wafv2.eu-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.eu-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'hostname' => 'wafv2.eu-south-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.eu-south-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'hostname' => 'wafv2.eu-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.eu-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'hostname' => 'wafv2.eu-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.eu-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'hostname' => 'wafv2.eu-west-3.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.eu-west-3.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-af-south-1' => [ 'credentialScope' => [ 'region' => 'af-south-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.af-south-1.amazonaws.com', ], 'fips-ap-east-1' => [ 'credentialScope' => [ 'region' => 'ap-east-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-east-1.amazonaws.com', ], 'fips-ap-northeast-1' => [ 'credentialScope' => [ 'region' => 'ap-northeast-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-northeast-1.amazonaws.com', ], 'fips-ap-northeast-2' => [ 'credentialScope' => [ 'region' => 'ap-northeast-2', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-northeast-2.amazonaws.com', ], 'fips-ap-northeast-3' => [ 'credentialScope' => [ 'region' => 'ap-northeast-3', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-northeast-3.amazonaws.com', ], 'fips-ap-south-1' => [ 'credentialScope' => [ 'region' => 'ap-south-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-south-1.amazonaws.com', ], 'fips-ap-south-2' => [ 'credentialScope' => [ 'region' => 'ap-south-2', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-south-2.amazonaws.com', ], 'fips-ap-southeast-1' => [ 'credentialScope' => [ 'region' => 'ap-southeast-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-southeast-1.amazonaws.com', ], 'fips-ap-southeast-2' => [ 'credentialScope' => [ 'region' => 'ap-southeast-2', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-southeast-2.amazonaws.com', ], 'fips-ap-southeast-3' => [ 'credentialScope' => [ 'region' => 'ap-southeast-3', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-southeast-3.amazonaws.com', ], 'fips-ap-southeast-4' => [ 'credentialScope' => [ 'region' => 'ap-southeast-4', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-southeast-4.amazonaws.com', ], 'fips-ap-southeast-5' => [ 'credentialScope' => [ 'region' => 'ap-southeast-5', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-southeast-5.amazonaws.com', ], 'fips-ap-southeast-7' => [ 'credentialScope' => [ 'region' => 'ap-southeast-7', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ap-southeast-7.amazonaws.com', ], 'fips-ca-central-1' => [ 'credentialScope' => [ 'region' => 'ca-central-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ca-central-1.amazonaws.com', ], 'fips-ca-west-1' => [ 'credentialScope' => [ 'region' => 'ca-west-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.ca-west-1.amazonaws.com', ], 'fips-eu-central-1' => [ 'credentialScope' => [ 'region' => 'eu-central-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.eu-central-1.amazonaws.com', ], 'fips-eu-central-2' => [ 'credentialScope' => [ 'region' => 'eu-central-2', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.eu-central-2.amazonaws.com', ], 'fips-eu-north-1' => [ 'credentialScope' => [ 'region' => 'eu-north-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.eu-north-1.amazonaws.com', ], 'fips-eu-south-1' => [ 'credentialScope' => [ 'region' => 'eu-south-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.eu-south-1.amazonaws.com', ], 'fips-eu-south-2' => [ 'credentialScope' => [ 'region' => 'eu-south-2', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.eu-south-2.amazonaws.com', ], 'fips-eu-west-1' => [ 'credentialScope' => [ 'region' => 'eu-west-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.eu-west-1.amazonaws.com', ], 'fips-eu-west-2' => [ 'credentialScope' => [ 'region' => 'eu-west-2', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.eu-west-2.amazonaws.com', ], 'fips-eu-west-3' => [ 'credentialScope' => [ 'region' => 'eu-west-3', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.eu-west-3.amazonaws.com', ], 'fips-il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.il-central-1.amazonaws.com', ], 'fips-me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.me-central-1.amazonaws.com', ], 'fips-me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.me-south-1.amazonaws.com', ], 'fips-mx-central-1' => [ 'credentialScope' => [ 'region' => 'mx-central-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.mx-central-1.amazonaws.com', ], 'fips-sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.sa-east-1.amazonaws.com', ], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [ 'credentialScope' => [ 'region' => 'il-central-1', ], 'hostname' => 'wafv2.il-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.il-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'me-central-1' => [ 'credentialScope' => [ 'region' => 'me-central-1', ], 'hostname' => 'wafv2.me-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.me-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'me-south-1' => [ 'credentialScope' => [ 'region' => 'me-south-1', ], 'hostname' => 'wafv2.me-south-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.me-south-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'mx-central-1' => [ 'credentialScope' => [ 'region' => 'mx-central-1', ], 'hostname' => 'wafv2.mx-central-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.mx-central-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'sa-east-1' => [ 'credentialScope' => [ 'region' => 'sa-east-1', ], 'hostname' => 'wafv2.sa-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.sa-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'hostname' => 'wafv2.us-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'hostname' => 'wafv2.us-east-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'hostname' => 'wafv2.us-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'hostname' => 'wafv2.us-west-2.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'wellarchitected' => [ 'endpoints' => [ 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => [], ], ], 'wisdom' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => [ 'deprecated' => true, ], 'fips-us-east-1' => [ 'deprecated' => true, ], 'fips-us-west-2' => [ 'deprecated' => true, ], 'ui-ap-northeast-1' => [], 'ui-ap-northeast-2' => [], 'ui-ap-southeast-1' => [], 'ui-ap-southeast-2' => [], 'ui-ca-central-1' => [], 'ui-eu-central-1' => [], 'ui-eu-west-2' => [], 'ui-us-east-1' => [], 'ui-us-west-2' => [], 'us-east-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], ], ], 'workdocs' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'workdocs-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'workdocs-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'workdocs-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'workdocs-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'workmail' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => [], ], ], 'workspaces' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'workspaces-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'workspaces-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'workspaces-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'workspaces-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'workspaces-web' => [ 'endpoints' => [ 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'workspaces-web-fips.us-east-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'workspaces-web-fips.us-west-2.amazonaws.com', ], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'workspaces-web-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'workspaces-web-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'xray' => [ 'endpoints' => [ 'af-south-1' => [], 'ap-east-1' => [], 'ap-east-2' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ap-southeast-5' => [], 'ap-southeast-6' => [], 'ap-southeast-7' => [], 'ca-central-1' => [], 'ca-west-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => [ 'credentialScope' => [ 'region' => 'us-east-1', ], 'deprecated' => true, 'hostname' => 'xray-fips.us-east-1.amazonaws.com', ], 'fips-us-east-2' => [ 'credentialScope' => [ 'region' => 'us-east-2', ], 'deprecated' => true, 'hostname' => 'xray-fips.us-east-2.amazonaws.com', ], 'fips-us-west-1' => [ 'credentialScope' => [ 'region' => 'us-west-1', ], 'deprecated' => true, 'hostname' => 'xray-fips.us-west-1.amazonaws.com', ], 'fips-us-west-2' => [ 'credentialScope' => [ 'region' => 'us-west-2', ], 'deprecated' => true, 'hostname' => 'xray-fips.us-west-2.amazonaws.com', ], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'mx-central-1' => [], 'sa-east-1' => [], 'us-east-1' => [ 'variants' => [ [ 'hostname' => 'xray-fips.us-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-east-2' => [ 'variants' => [ [ 'hostname' => 'xray-fips.us-east-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-1' => [ 'variants' => [ [ 'hostname' => 'xray-fips.us-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-west-2' => [ 'variants' => [ [ 'hostname' => 'xray-fips.us-west-2.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], ], ], [ 'defaults' => [ 'hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => [ 'https', ], 'signatureVersions' => [ 'v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'dnsSuffix' => 'amazonaws.com.cn', 'partition' => 'aws-cn', 'partitionName' => 'AWS China', 'regionRegex' => '^cn\\-\\w+\\-\\d+$', 'regions' => [ 'cn-north-1' => [ 'description' => 'China (Beijing)', ], 'cn-northwest-1' => [ 'description' => 'China (Ningxia)', ], ], 'services' => [ 'access-analyzer' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'account' => [ 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'account.cn-northwest-1.amazonaws.com.cn', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-cn-global', ], 'acm' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'acm-pca' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'airflow' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'api.ecr' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'api.ecr.cn-north-1.amazonaws.com.cn', 'variants' => [ [ 'hostname' => 'ecr.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'api.ecr.cn-northwest-1.amazonaws.com.cn', 'variants' => [ [ 'hostname' => 'ecr.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'api.pricing' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'pricing', ], ], 'endpoints' => [ 'cn-northwest-1' => [], ], ], 'api.sagemaker' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'api.tunneling.iot' => [ 'defaults' => [ 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com.cn', 'hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => 'api.iot-tunneling-fips.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => 'api.iot-tunneling.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'apigateway' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'appconfig' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'appconfigdata' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'application-autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'applicationinsights' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'appmesh' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'appmesh.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'appsync' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'appsync.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'appsync.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'arc-zonal-shift' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'athena' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'athena.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'athena.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'autoscaling-plans' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'backup' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'batch' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'budgets' => [ 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'budgets.amazonaws.com.cn', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-cn-global', ], 'cassandra' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'ce' => [ 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'ce.cn-northwest-1.amazonaws.com.cn', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-cn-global', ], 'cloudcontrolapi' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'cloudformation' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'cloudfront' => [ 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'cloudfront.cn-northwest-1.amazonaws.com.cn', 'protocols' => [ 'http', 'https', ], ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-cn-global', ], 'cloudtrail' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'codebuild' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'codecommit' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'codedeploy' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'codepipeline' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'cognito-identity' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.cn-north-1.amazonaws.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'compute-optimizer' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'compute-optimizer.cn-north-1.amazonaws.com.cn', ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'compute-optimizer.cn-northwest-1.amazonaws.com.cn', ], ], ], 'config' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'cur' => [ 'endpoints' => [ 'cn-northwest-1' => [], ], ], 'data-ats.iot' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [ 'hostname' => 'data.ats.iot.cn-north-1.amazonaws.com.cn', 'protocols' => [ 'https', ], ], 'cn-northwest-1' => [], ], ], 'data.iot' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'data.jobs.iot' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'databrew' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'datasync' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'datasync.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'datasync.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'datazone' => [ 'defaults' => [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [ [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'hostname' => 'datazone.cn-north-1.api.amazonwebservices.com.cn', ], 'cn-northwest-1' => [ 'hostname' => 'datazone.cn-northwest-1.api.amazonwebservices.com.cn', ], ], ], 'dax' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'directconnect' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'dlm' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'dlm.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'dlm.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'dms' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'docdb' => [ 'endpoints' => [ 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'rds.cn-northwest-1.amazonaws.com.cn', ], ], ], 'ds' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'dynamodb' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'ebs' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'ec2' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'ecs' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'eks' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'eks-auth' => [ 'defaults' => [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [ [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'hostname' => 'eks-auth.cn-north-1.api.amazonwebservices.com.cn', ], 'cn-northwest-1' => [ 'hostname' => 'eks-auth.cn-northwest-1.api.amazonwebservices.com.cn', ], ], ], 'elasticache' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'elasticbeanstalk' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'elasticbeanstalk.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'elasticfilesystem' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.cn-north-1.amazonaws.com.cn', 'tags' => [ 'fips', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.cn-northwest-1.amazonaws.com.cn', 'tags' => [ 'fips', ], ], ], ], 'fips-cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.cn-north-1.amazonaws.com.cn', ], 'fips-cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.cn-northwest-1.amazonaws.com.cn', ], ], ], 'elasticloadbalancing' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'elasticmapreduce' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'emr-containers' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'emr-serverless' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'entitlement.marketplace' => [ 'endpoints' => [ 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'entitlement-marketplace.cn-northwest-1.amazonaws.com.cn', 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'entitlement-marketplace.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'es' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'aos.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'aos.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'events' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'events.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'events.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'firehose' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'firehose.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'firehose.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'fms' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'fsx' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'gamelift' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'gameliftstreams' => [ 'defaults' => [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [ [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'hostname' => 'gameliftstreams.cn-north-1.api.amazonwebservices.com.cn', ], 'cn-northwest-1' => [ 'hostname' => 'gameliftstreams.cn-northwest-1.api.amazonwebservices.com.cn', ], ], ], 'glacier' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'glue' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'glue.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'glue.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'greengrass' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], ], 'isRegionalized' => true, ], 'guardduty' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], 'isRegionalized' => true, ], 'health' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'sslCommonName' => 'health.cn-northwest-1.amazonaws.com.cn', ], 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'global.health.amazonaws.com.cn', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-cn-global', ], 'iam' => [ 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'iam.cn-north-1.amazonaws.com.cn', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-cn-global', ], 'identitystore' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'inspector2' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'internetmonitor' => [ 'defaults' => [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [ [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'hostname' => 'internetmonitor.cn-north-1.api.amazonwebservices.com.cn', ], 'cn-northwest-1' => [ 'hostname' => 'internetmonitor.cn-northwest-1.api.amazonwebservices.com.cn', ], ], ], 'iot' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'iotanalytics' => [ 'endpoints' => [ 'cn-north-1' => [], ], ], 'iotevents' => [ 'endpoints' => [ 'cn-north-1' => [], ], ], 'ioteventsdata' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'data.iotevents.cn-north-1.amazonaws.com.cn', ], ], ], 'iotsecuredtunneling' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'iotsitewise' => [ 'endpoints' => [ 'cn-north-1' => [], ], ], 'iottwinmaker' => [ 'endpoints' => [ 'api-cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'api.iottwinmaker.cn-north-1.amazonaws.com.cn', ], 'cn-north-1' => [], 'data-cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'data.iottwinmaker.cn-north-1.amazonaws.com.cn', ], ], ], 'kafka' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'kafkaconnect' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'kendra-ranking' => [ 'defaults' => [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [ [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'hostname' => 'kendra-ranking.cn-north-1.api.amazonwebservices.com.cn', ], 'cn-northwest-1' => [ 'hostname' => 'kendra-ranking.cn-northwest-1.api.amazonwebservices.com.cn', ], ], ], 'kinesis' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'kinesisanalytics' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'kinesisvideo' => [ 'endpoints' => [ 'cn-north-1' => [], ], ], 'kms' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'lakeformation' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'lambda' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'lambda.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'lambda.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'license-manager' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'license-manager-linux-subscriptions' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'logs' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'logs.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'logs.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'mediaconvert' => [ 'endpoints' => [ 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'memory-db' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'metering.marketplace' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'aws-marketplace', ], ], 'endpoints' => [ 'cn-northwest-1' => [], ], ], 'metrics.sagemaker' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'monitoring' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'mq' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'neptune' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'rds.cn-north-1.amazonaws.com.cn', ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'rds.cn-northwest-1.amazonaws.com.cn', ], ], ], 'network-firewall' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'notifications' => [ 'defaults' => [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [ [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'hostname' => 'notifications.cn-north-1.api.amazonwebservices.com.cn', ], 'cn-northwest-1' => [ 'hostname' => 'notifications.cn-northwest-1.api.amazonwebservices.com.cn', ], ], ], 'oam' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'oidc' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'oidc.cn-north-1.amazonaws.com.cn', ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'oidc.cn-northwest-1.amazonaws.com.cn', ], ], ], 'organizations' => [ 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'organizations.cn-northwest-1.amazonaws.com.cn', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-cn-global', ], 'personalize' => [ 'endpoints' => [ 'cn-north-1' => [], ], ], 'pi' => [ 'endpoints' => [ 'cn-north-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'pipes' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'polly' => [ 'endpoints' => [ 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'polly.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'portal.sso' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'portal.sso.cn-north-1.amazonaws.com.cn', ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'portal.sso.cn-northwest-1.amazonaws.com.cn', ], ], ], 'qbusiness' => [ 'defaults' => [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [ [ 'dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'hostname' => 'qbusiness.cn-north-1.api.amazonwebservices.com.cn', ], 'cn-northwest-1' => [ 'hostname' => 'qbusiness.cn-northwest-1.api.amazonwebservices.com.cn', ], ], ], 'quicksight' => [ 'endpoints' => [ 'cn-north-1' => [], ], ], 'ram' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], ], ], 'rbin' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'rbin.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'rbin.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'rds' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'redshift' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'redshift-serverless' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'resource-groups' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'rolesanywhere' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'route53' => [ 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'route53.amazonaws.com.cn', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-cn-global', ], 'route53profiles' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'route53resolver' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'runtime.sagemaker' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 's3' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com.cn', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.cn-north-1.amazonaws.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 's3.dualstack.cn-northwest-1.amazonaws.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 's3-control' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com.cn', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 's3-control.cn-north-1.amazonaws.com.cn', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.cn-north-1.amazonaws.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 's3-control.cn-northwest-1.amazonaws.com.cn', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control.dualstack.cn-northwest-1.amazonaws.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'savingsplans' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'savingsplans.cn-north-1.amazonaws.com.cn', ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'savingsplans.cn-northwest-1.amazonaws.com.cn', ], ], 'isRegionalized' => true, ], 'scheduler' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'schemas' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'secretsmanager' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], ], ], ], ], 'securityhub' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'serverlessrepo' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [ 'protocols' => [ 'https', ], ], 'cn-northwest-1' => [ 'protocols' => [ 'https', ], ], ], ], 'servicecatalog' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'servicediscovery' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'servicequotas' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'signer' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], 'verification-cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'verification.signer.cn-north-1.amazonaws.com.cn', ], 'verification-cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'verification.signer.cn-northwest-1.amazonaws.com.cn', ], ], ], 'snowball' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.cn-north-1.amazonaws.com.cn', 'tags' => [ 'fips', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.cn-northwest-1.amazonaws.com.cn', 'tags' => [ 'fips', ], ], ], ], 'fips-cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.cn-north-1.amazonaws.com.cn', ], 'fips-cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.cn-northwest-1.amazonaws.com.cn', ], ], ], 'sns' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'sns.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'sns.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'sqs' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'sslCommonName' => '{region}.queue.{dnsSuffix}', ], 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'sqs.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'sqs.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'ssm' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'sso' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'states' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'states.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'states.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'storagegateway' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'streams.dynamodb' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'dynamodb', ], 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'sts' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'support' => [ 'endpoints' => [ 'aws-cn-global' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'support.cn-north-1.amazonaws.com.cn', ], ], 'partitionEndpoint' => 'aws-cn-global', ], 'swf' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'synthetics' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'synthetics.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'tagging' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'transcribe' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'cn.transcribe.cn-north-1.amazonaws.com.cn', 'variants' => [ [ 'hostname' => 'transcribe.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'cn.transcribe.cn-northwest-1.amazonaws.com.cn', 'variants' => [ [ 'hostname' => 'transcribe.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'transcribestreaming' => [ 'endpoints' => [ 'cn-north-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.cn-north-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], 'cn-northwest-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'transfer' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'verifiedpermissions' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], 'waf-regional' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'waf-regional.cn-north-1.amazonaws.com.cn', 'variants' => [ [ 'hostname' => 'waf-regional-fips.cn-north-1.amazonaws.com.cn', 'tags' => [ 'fips', ], ], ], ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'waf-regional.cn-northwest-1.amazonaws.com.cn', 'variants' => [ [ 'hostname' => 'waf-regional-fips.cn-northwest-1.amazonaws.com.cn', 'tags' => [ 'fips', ], ], ], ], 'fips-cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.cn-north-1.amazonaws.com.cn', ], 'fips-cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.cn-northwest-1.amazonaws.com.cn', ], ], ], 'wafv2' => [ 'endpoints' => [ 'cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'hostname' => 'wafv2.cn-north-1.amazonaws.com.cn', 'variants' => [ [ 'hostname' => 'wafv2-fips.cn-north-1.amazonaws.com.cn', 'tags' => [ 'fips', ], ], ], ], 'cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'hostname' => 'wafv2.cn-northwest-1.amazonaws.com.cn', 'variants' => [ [ 'hostname' => 'wafv2-fips.cn-northwest-1.amazonaws.com.cn', 'tags' => [ 'fips', ], ], ], ], 'fips-cn-north-1' => [ 'credentialScope' => [ 'region' => 'cn-north-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.cn-north-1.amazonaws.com.cn', ], 'fips-cn-northwest-1' => [ 'credentialScope' => [ 'region' => 'cn-northwest-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.cn-northwest-1.amazonaws.com.cn', ], ], ], 'workspaces' => [ 'endpoints' => [ 'cn-northwest-1' => [], ], ], 'xray' => [ 'endpoints' => [ 'cn-north-1' => [], 'cn-northwest-1' => [], ], ], ], ], [ 'defaults' => [ 'hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => [ 'https', ], 'signatureVersions' => [ 'v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'dnsSuffix' => 'amazonaws.com', 'partition' => 'aws-us-gov', 'partitionName' => 'AWS GovCloud (US)', 'regionRegex' => '^us\\-gov\\-\\w+\\-\\d+$', 'regions' => [ 'us-gov-east-1' => [ 'description' => 'AWS GovCloud (US-East)', ], 'us-gov-west-1' => [ 'description' => 'AWS GovCloud (US-West)', ], ], 'services' => [ 'access-analyzer' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'access-analyzer.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'access-analyzer.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'access-analyzer.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'access-analyzer.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'access-analyzer.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'access-analyzer.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'access-analyzer.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'access-analyzer.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'access-analyzer.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'access-analyzer.us-gov-west-1.amazonaws.com', ], ], ], 'acm' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'acm.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'acm.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'acm.us-gov-west-1.amazonaws.com', ], ], ], 'acm-pca' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'acm-pca.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'acm-pca.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'acm-pca.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'acm-pca.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'acm-pca.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'aoss' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'api.detective' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'api.detective-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'detective-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'detective.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'api.detective-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'api.detective-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'detective-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'detective.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'api.detective-fips.us-gov-west-1.amazonaws.com', ], ], ], 'api.ecr' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'ecr-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'dkr-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ecr-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'dkr-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'ecr-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-dkr-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-gov-east-1.amazonaws.com', ], 'fips-dkr-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-gov-west-1.amazonaws.com', ], 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'ecr-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'api.ecr.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ecr-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ecr.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'api.ecr.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ecr-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ecr-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'ecr.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'api.sagemaker' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'api-fips.sagemaker.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'api-fips.sagemaker.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'api-fips.sagemaker.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1-fips-secondary' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'api.sagemaker.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1-secondary' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'api.sagemaker.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'api.tunneling.iot' => [ 'defaults' => [ 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], [ 'dnsSuffix' => 'api.aws', 'hostname' => 'api.iot-tunneling-fips.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'api.aws', 'hostname' => 'api.iot-tunneling.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'api.iot-tunneling.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'api.tunneling.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'api.iot-tunneling-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'api.iot-tunneling.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'api.tunneling.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'apigateway' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'appconfig' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'appconfig.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'appconfig.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'appconfig.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'appconfig.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'appconfigdata' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'appconfigdata.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'appconfigdata.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'appconfigdata.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'appconfigdata.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'application-autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'hostname' => 'application-autoscaling.us-gov-east-1.amazonaws.com', 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 'application-autoscaling.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'deprecated' => true, 'hostname' => 'application-autoscaling.us-gov-east-1.amazonaws.com', 'protocols' => [ 'http', 'https', ], ], 'us-gov-west-1' => [ 'hostname' => 'application-autoscaling.us-gov-west-1.amazonaws.com', 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 'application-autoscaling.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'deprecated' => true, 'hostname' => 'application-autoscaling.us-gov-west-1.amazonaws.com', 'protocols' => [ 'http', 'https', ], ], ], ], 'applicationinsights' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'applicationinsights-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'applicationinsights-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'applicationinsights-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'applicationinsights.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'applicationinsights-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'applicationinsights-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'applicationinsights.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'appstream2' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'appstream', ], 'protocols' => [ 'https', ], ], 'endpoints' => [ 'fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'appstream2-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'appstream2-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'appstream2-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'appstream2-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'appstream2-fips.us-gov-west-1.amazonaws.com', ], ], ], 'aps' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'arc-zonal-shift' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'athena' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'athena-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'athena-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'athena-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'athena-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'athena.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'athena-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'athena-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'athena.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'autoscaling' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'autoscaling.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'protocols' => [ 'http', 'https', ], ], 'us-gov-west-1' => [ 'protocols' => [ 'http', 'https', ], ], ], ], 'autoscaling-plans' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'autoscaling-plans.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'deprecated' => true, 'hostname' => 'autoscaling-plans.us-gov-east-1.amazonaws.com', 'protocols' => [ 'http', 'https', ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'autoscaling-plans.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'deprecated' => true, 'hostname' => 'autoscaling-plans.us-gov-west-1.amazonaws.com', 'protocols' => [ 'http', 'https', ], ], ], ], 'backup' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'backup-gateway' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'batch' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'batch.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'batch.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'batch.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'batch.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'batch.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'bedrock' => [ 'endpoints' => [ 'bedrock-fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'bedrock-fips.us-gov-east-1.amazonaws.com', ], 'bedrock-fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'bedrock-fips.us-gov-west-1.amazonaws.com', ], 'bedrock-runtime-fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'bedrock-runtime-fips.us-gov-east-1.amazonaws.com', ], 'bedrock-runtime-fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'bedrock-runtime-fips.us-gov-west-1.amazonaws.com', ], 'bedrock-runtime-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'bedrock-runtime.us-gov-east-1.amazonaws.com', ], 'bedrock-runtime-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'bedrock-runtime.us-gov-west-1.amazonaws.com', ], 'bedrock-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'bedrock.us-gov-east-1.amazonaws.com', ], 'bedrock-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'bedrock.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'cassandra' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'cassandra.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'cassandra.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'cassandra.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'cassandra.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'cassandra.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'cassandra.us-gov-west-1.amazonaws.com', ], ], ], 'cloudcontrolapi' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'cloudcontrolapi-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'cloudcontrolapi-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloudcontrolapi-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cloudcontrolapi.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudcontrolapi-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cloudcontrolapi-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cloudcontrolapi.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'clouddirectory' => [ 'endpoints' => [ 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'clouddirectory.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'clouddirectory.us-gov-west-1.amazonaws.com', ], ], ], 'cloudformation' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'cloudformation.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'cloudformation.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'cloudformation.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'cloudformation.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'cloudformation.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'cloudformation.us-gov-west-1.amazonaws.com', ], ], ], 'cloudhsm' => [ 'endpoints' => [ 'us-gov-west-1' => [], ], ], 'cloudhsmv2' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'cloudhsm', ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudhsmv2.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'cloudtrail' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'cloudtrail.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'cloudtrail.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'cloudtrail.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudtrail.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudtrail.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'codebuild' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'codebuild-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'codebuild-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'codebuild-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'codebuild-fips.us-gov-west-1.amazonaws.com', ], ], ], 'codecommit' => [ 'endpoints' => [ 'fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'codecommit-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'codecommit-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'codecommit-fips.us-gov-west-1.amazonaws.com', ], ], ], 'codedeploy' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'codedeploy-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'codedeploy-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'codedeploy-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'codedeploy-fips.us-gov-west-1.amazonaws.com', ], ], ], 'codepipeline' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'codepipeline-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'codepipeline-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'codepipeline-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'codepipeline-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'codestar-connections' => [ 'endpoints' => [ 'us-gov-east-1' => [], ], ], 'cognito-identity' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'cognito-identity-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity.us-gov-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'cognito-identity-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-identity-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-identity.us-gov-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'cognito-idp' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'cognito-idp-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp.us-gov-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'cognito-idp-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'cognito-idp-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'cognito-idp.us-gov-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'comprehend' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'comprehend-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'comprehend-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'comprehend-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'comprehend.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'comprehendmedical' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'comprehendmedical-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'comprehendmedical-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'compute-optimizer' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'compute-optimizer-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'compute-optimizer-fips.us-gov-west-1.amazonaws.com', ], ], ], 'config' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'config.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'config.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'config.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'config.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'config.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'connect' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'connect.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'connect.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'controltower' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'controltower-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'controltower-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'controltower-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'controltower-fips.us-gov-west-1.amazonaws.com', ], ], ], 'data-ats.iot' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'protocols' => [ 'https', ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'data.iot' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'protocols' => [ 'https', ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'service' => 'iotdata', ], 'deprecated' => true, 'hostname' => 'data.iot-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'data.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'data.jobs.iot' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'data.jobs.iot-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'data.jobs.iot-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'data.jobs.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'data.jobs.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'databrew' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'databrew.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'databrew.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'datasync' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'datasync-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'datasync-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'datasync-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'datasync.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'datasync-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'datasync.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'datazone' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'hostname' => 'datazone.us-gov-east-1.api.aws', ], 'us-gov-west-1' => [ 'hostname' => 'datazone.us-gov-west-1.api.aws', ], ], ], 'directconnect' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'directconnect-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'directconnect-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'directconnect-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'directconnect-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'dlm' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'dlm-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'dlm.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'dlm.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'dlm.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'dlm-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'dlm.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'dlm.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'dlm.us-gov-west-1.amazonaws.com', ], ], ], 'dms' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'dms.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'dms' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'dms.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'dms-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'dms.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'dms.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'dms.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'dms.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'dms.us-gov-west-1.amazonaws.com', ], ], ], 'docdb' => [ 'endpoints' => [ 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'rds.us-gov-west-1.amazonaws.com', ], ], ], 'drs' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'drs-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'drs-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'drs-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'drs-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ds' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'dynamodb' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'dynamodb.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'dynamodb-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'dynamodb-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'dynamodb-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'dynamodb-fips.us-gov-west-1.amazonaws.com', ], ], ], 'ebs' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'ec2' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'ec2.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'ec2.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ec2.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'ec2.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'ec2.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'ecs' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'ecs-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'ecs-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'ecs-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'ecs-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'eks' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 'eks.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'eks.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'eks.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'eks.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'eks.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'eks-auth' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'hostname' => 'eks-auth.us-gov-east-1.api.aws', ], 'us-gov-west-1' => [ 'hostname' => 'eks-auth.us-gov-west-1.api.aws', ], ], ], 'elasticache' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'elasticache.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'elasticache.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticache.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'elasticache.us-gov-west-1.amazonaws.com', ], ], ], 'elasticbeanstalk' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'elasticbeanstalk.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'elasticbeanstalk.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticbeanstalk.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'elasticbeanstalk.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'elasticbeanstalk.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'elasticbeanstalk.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticbeanstalk.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'elasticbeanstalk.us-gov-west-1.amazonaws.com', ], ], ], 'elasticfilesystem' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'elasticloadbalancing' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'elasticloadbalancing.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'elasticloadbalancing.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'elasticloadbalancing.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticloadbalancing.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 'elasticloadbalancing.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'elasticmapreduce' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticmapreduce.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'elasticmapreduce.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'elasticmapreduce.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'email' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'email-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'email-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'email-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'email-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'emr-containers' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'emr-containers.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'emr-containers.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'emr-containers.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'emr-containers.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'emr-serverless' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'emr-serverless.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'emr-serverless.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'emr-serverless.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'emr-serverless.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'es' => [ 'endpoints' => [ 'fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'es-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'aos.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'es-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'es-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'aos.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'es-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'es-fips.us-gov-west-1.amazonaws.com', ], ], ], 'events' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'events.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'events.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'events.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'events.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'firehose' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'firehose-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'firehose-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'firehose-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'firehose-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'fms' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'fms-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'fms-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'fsx' => [ 'endpoints' => [ 'fips-prod-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-gov-east-1.amazonaws.com', ], 'fips-prod-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-gov-west-1.amazonaws.com', ], 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-gov-west-1.amazonaws.com', ], 'prod-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'prod-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'gameliftstreams' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'hostname' => 'gameliftstreams.us-gov-east-1.api.aws', ], 'us-gov-west-1' => [ 'hostname' => 'gameliftstreams.us-gov-west-1.api.aws', ], ], ], 'geo' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'geo-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'geo-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'glacier' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'glacier.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'glacier.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'glacier.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 'glacier.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'glue' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'glue-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'glue-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'glue-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'glue-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'glue.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'glue-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'glue-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'glue.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'greengrass' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'dataplane-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'greengrass-ats.iot.us-gov-east-1.amazonaws.com', ], 'dataplane-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'greengrass-ats.iot.us-gov-west-1.amazonaws.com', ], 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'greengrass.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'greengrass.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'greengrass.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'greengrass.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], 'isRegionalized' => true, ], 'guardduty' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'guardduty.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'guardduty.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'guardduty.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'guardduty.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'guardduty.us-gov-west-1.amazonaws.com', ], ], 'isRegionalized' => true, ], 'health' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'sslCommonName' => 'health.us-gov-west-1.amazonaws.com', ], 'endpoints' => [ 'aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'global.health.us-gov.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'health-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'health-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iam' => [ 'endpoints' => [ 'aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'iam.us-gov.amazonaws.com', 'variants' => [ [ 'hostname' => 'iam.us-gov.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'aws-us-gov-global-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'iam.us-gov.amazonaws.com', ], 'iam-govcloud' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'iam.us-gov.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'iam-govcloud-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'iam.us-gov.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-us-gov-global', ], 'identitystore' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'identitystore.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'identitystore.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'identitystore.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'identitystore.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'identitystore.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ingest.timestream' => [ 'endpoints' => [ 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'ingest.timestream.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'ingest.timestream.us-gov-west-1.amazonaws.com', ], ], ], 'inspector' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'inspector-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'inspector-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'inspector-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'inspector-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'inspector2' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'inspector2-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'inspector2-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'inspector2-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'inspector2-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'internetmonitor' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'hostname' => 'internetmonitor.us-gov-east-1.api.aws', ], 'us-gov-west-1' => [ 'hostname' => 'internetmonitor.us-gov-west-1.api.aws', ], ], ], 'iot' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'deprecated' => true, 'hostname' => 'iot-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'deprecated' => true, 'hostname' => 'iot-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'iot-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'iot-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iotevents' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'iotevents-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'iotevents-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ioteventsdata' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'data.iotevents-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'data.iotevents.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'data.iotevents-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iotsecuredtunneling' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'api.tunneling.iot-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'api.tunneling.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iotsitewise' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'iotsitewise-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'iotsitewise-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'iottwinmaker' => [ 'endpoints' => [ 'api-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'api.iottwinmaker.us-gov-west-1.amazonaws.com', ], 'data-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'data.iottwinmaker.us-gov-west-1.amazonaws.com', ], 'fips-api-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'api.iottwinmaker-fips.us-gov-west-1.amazonaws.com', ], 'fips-data-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'data.iottwinmaker-fips.us-gov-west-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'iottwinmaker-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'iottwinmaker-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kafka' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'kafka.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'kafka.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'kafka.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'kafka.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'kafka.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'kafka.us-gov-west-1.amazonaws.com', ], ], ], 'kendra' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'kendra-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'kendra-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kendra-ranking' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'hostname' => 'kendra-ranking.us-gov-east-1.api.aws', ], 'us-gov-west-1' => [ 'hostname' => 'kendra-ranking.us-gov-west-1.api.aws', ], ], ], 'kinesis' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'kinesis.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'kinesis.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'kinesis.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'kinesis.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'kinesis.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'kinesis.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kinesisanalytics' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'kinesisanalytics-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'kinesisanalytics-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'kinesisanalytics-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'kinesisanalytics-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kinesisvideo' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'kinesisvideo-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'kinesisvideo-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'kinesisvideo-fips.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'kinesisvideo-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'kinesisvideo-fips.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'kinesisvideo-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'kms' => [ 'endpoints' => [ 'ProdFips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-gov-west-1.amazonaws.com', ], ], ], 'lakeformation' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'lakeformation-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'lakeformation-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lakeformation-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'lakeformation.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'lakeformation-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lakeformation-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'lakeformation.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'lambda' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'lambda-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'lambda-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'lambda-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lambda.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'lambda-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'lambda.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'license-manager' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'license-manager-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'license-manager-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'license-manager-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'license-manager-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'license-manager-linux-subscriptions' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'license-manager-user-subscriptions' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'logs' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'logs.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'logs.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'logs.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'logs.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'logs.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'logs.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'm2' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'deprecated' => true, ], 'fips-us-gov-west-1' => [ 'deprecated' => true, ], 'us-gov-east-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], ], ], 'managedblockchain' => [ 'endpoints' => [ 'us-gov-west-1' => [], ], ], 'mediaconvert' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'mediaconvert.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'mediaconvert.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'mediaconvert.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'mediaconvert.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], ], ], 'meetings-chime' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'meetings-chime-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'meetings-chime-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'meetings-chime-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'meetings-chime-fips.us-gov-west-1.amazonaws.com', ], ], ], 'memory-db' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'metering.marketplace' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'aws-marketplace', ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'metering-marketplace.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'metrics.sagemaker' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'mgn' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'mgn-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'mgn-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'mgn-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'mgn-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'models-v2-lex' => [ 'endpoints' => [ 'us-gov-west-1' => [], ], ], 'models.lex' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'lex', ], 'variants' => [ [ 'hostname' => 'models-fips.lex.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'models-fips.lex.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'models-fips.lex.us-gov-west-1.amazonaws.com', ], ], ], 'monitoring' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'monitoring.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'monitoring.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'monitoring.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'monitoring.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'monitoring.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'mq' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'mq-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'mq-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'mq-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'mq-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'neptune' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'rds.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'rds.us-gov-west-1.amazonaws.com', ], ], ], 'network-firewall' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'network-firewall-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'network-firewall-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'network-firewall-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'network-firewall-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'networkmanager' => [ 'endpoints' => [ 'aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'networkmanager.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'networkmanager.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'networkmanager.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'networkmanager.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'fips-aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'networkmanager.us-gov-west-1.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-us-gov-global', ], 'notifications' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'hostname' => 'notifications.us-gov-east-1.api.aws', ], 'us-gov-west-1' => [ 'hostname' => 'notifications.us-gov-west-1.api.aws', ], ], ], 'oam' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'oidc' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'oidc.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'oidc.us-gov-west-1.amazonaws.com', ], ], ], 'organizations' => [ 'endpoints' => [ 'aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'organizations.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'organizations.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'organizations.us-gov-west-1.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-us-gov-global', ], 'outposts' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'outposts.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'outposts.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'outposts.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'outposts.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'participant.connect' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'participant.connect.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'participant.connect.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'pi' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'pi-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'pi-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'pi-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'pi.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'pi-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'pi-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'pi.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'pinpoint' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'mobiletargeting', ], ], 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'pinpoint-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'pinpoint.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'pinpoint-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'polly' => [ 'endpoints' => [ 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'polly-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'polly-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'polly-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'polly.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'portal.sso' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'portal.sso.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'portal.sso.us-gov-west-1.amazonaws.com', ], ], ], 'qbusiness' => [ 'defaults' => [ 'dnsSuffix' => 'api.aws', 'variants' => [ [ 'dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'hostname' => 'qbusiness.us-gov-east-1.api.aws', ], 'us-gov-west-1' => [ 'hostname' => 'qbusiness.us-gov-west-1.api.aws', ], ], ], 'query.timestream' => [ 'endpoints' => [ 'us-gov-west-1' => [], ], ], 'quicksight' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'ram' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'ram.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'ram.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ramus-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'ram.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'ram.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'ram.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'ramus-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'ram.us-gov-west-1.amazonaws.com', ], ], ], 'rbin' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rbin-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rbin.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rbin-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rbin.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'rds' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'rds.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'rds.us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'rds.us-gov-east-1.amazonaws.com', ], 'rds.us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'rds.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'rds.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'rds.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'rds.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'rds.us-gov-west-1.amazonaws.com', ], ], ], 'redshift' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'redshift.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'redshift.us-gov-west-1.amazonaws.com', ], ], ], 'redshift-serverless' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'redshift-serverless-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'redshift-serverless-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'redshift-serverless-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'redshift-serverless-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'rekognition' => [ 'endpoints' => [ 'rekognition-fips.us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-gov-west-1.amazonaws.com', ], 'rekognition.us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'rekognition-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'rekognition-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'rekognition-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'rekognition.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'rekognition-fips.us-gov-west-1.amazonaws.com', ], ], ], 'resiliencehub' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'resiliencehub-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'resiliencehub-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'resiliencehub-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'resiliencehub.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'resiliencehub-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'resiliencehub-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'resiliencehub.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'resource-groups' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'resource-groups.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'resource-groups.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'resource-groups.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'resource-groups.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'resource-groups.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'rolesanywhere' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'rolesanywhere-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'rolesanywhere-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'rolesanywhere-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'rolesanywhere-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'route53' => [ 'endpoints' => [ 'aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'route53.us-gov.amazonaws.com', 'variants' => [ [ 'hostname' => 'route53.us-gov.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'fips-aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'route53.us-gov.amazonaws.com', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-us-gov-global', ], 'route53profiles' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53profiles.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'route53profiles-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'route53profiles.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'route53resolver' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'route53resolver.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'route53resolver.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'deprecated' => true, 'hostname' => 'route53resolver.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'route53resolver.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'route53resolver.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], [ 'hostname' => 'route53resolver.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'deprecated' => true, 'hostname' => 'route53resolver.us-gov-west-1.amazonaws.com', ], ], ], 'rum' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'runtime-v2-lex' => [ 'endpoints' => [ 'us-gov-west-1' => [], ], ], 'runtime.lex' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'lex', ], 'variants' => [ [ 'hostname' => 'runtime-fips.lex.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'runtime-fips.lex.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'runtime-fips.lex.us-gov-west-1.amazonaws.com', ], ], ], 'runtime.sagemaker' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'runtime.sagemaker.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'runtime.sagemaker.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'runtime.sagemaker.us-gov-west-1.amazonaws.com', ], ], ], 's3' => [ 'defaults' => [ 'signatureVersions' => [ 's3', 's3v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 's3-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 's3-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'hostname' => 's3.us-gov-east-1.amazonaws.com', 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 's3-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3.dualstack.us-gov-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'hostname' => 's3.us-gov-west-1.amazonaws.com', 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 's3-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3.dualstack.us-gov-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], ], ], 's3-control' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 's3-control.us-gov-east-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-gov-east-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-gov-east-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-gov-east-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 's3-control.us-gov-west-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-gov-west-1.amazonaws.com', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-gov-west-1.amazonaws.com', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-gov-west-1.amazonaws.com', 'signatureVersions' => [ 's3v4', ], ], ], ], 's3-outposts' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'deprecated' => true, ], 'fips-us-gov-west-1' => [ 'deprecated' => true, ], 'us-gov-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], ], ], 'scheduler' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'schemas' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'secretsmanager' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'deprecated' => true, ], 'us-gov-west-1' => [ 'variants' => [ [ 'tags' => [ 'dualstack', ], ], [ 'tags' => [ 'dualstack', 'fips', ], ], [ 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'deprecated' => true, ], ], ], 'securityhub' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'securityhub-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'securityhub-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'securityhub-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securityhub.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'securityhub-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securityhub.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'securitylake' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'securitylake.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securitylake.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'securitylake.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'securitylake.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'securitylake.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'securitylake.us-gov-west-1.amazonaws.com', ], ], ], 'serverlessrepo' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'serverlessrepo.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'serverlessrepo.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'serverlessrepo.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'serverlessrepo.us-gov-west-1.amazonaws.com', ], ], ], 'servicecatalog' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'servicecatalog-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'servicecatalog-fips.us-gov-west-1.amazonaws.com', ], ], ], 'servicecatalog-appregistry' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'servicecatalog-appregistry.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'servicediscovery' => [ 'endpoints' => [ 'servicediscovery' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'servicediscovery-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'servicediscovery-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'servicediscovery.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'servicediscovery-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'servicediscovery.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com', ], ], ], 'servicequotas' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'servicequotas.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'servicequotas.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'servicequotas.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'servicequotas.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'servicequotas.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'signer' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'signer-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'signer-fips.us-gov-west-1.amazonaws.com', ], 'fips-verification-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'verification.signer-fips.us-gov-east-1.amazonaws.com', ], 'fips-verification-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'verification.signer-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'signer-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'signer-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'verification-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'verification.signer.us-gov-east-1.amazonaws.com', ], 'verification-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'verification.signer.us-gov-west-1.amazonaws.com', ], ], ], 'simspaceweaver' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'simspaceweaver.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'simspaceweaver.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'simspaceweaver.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'simspaceweaver.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'sms-voice' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'sms-voice-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'sms-voice-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sms-voice-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'sms-voice.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'sms-voice-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'sms-voice-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'sms-voice.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'snowball' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'snowball-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'snowball-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'snowball-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'snowball.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'sns' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'sns.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'sns.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'sns.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'sns.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'sqs' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'sqs.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'sqs.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'sqs.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'sqs.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'protocols' => [ 'http', 'https', ], 'sslCommonName' => '{region}.queue.{dnsSuffix}', 'variants' => [ [ 'hostname' => 'sqs.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'ssm' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'ssm.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'ssm.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'ssm.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'ssm.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'ssm.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'sso' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'sso.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'sso.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'sso.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'sso.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'sso.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'sso.us-gov-west-1.amazonaws.com', ], ], ], 'states' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'states-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'states.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'states-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'states.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'storagegateway' => [ 'endpoints' => [ 'fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-gov-west-1.amazonaws.com', ], ], ], 'streams.dynamodb' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'dynamodb', ], 'variants' => [ [ 'hostname' => 'streams.dynamodb.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'sts' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'sts.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'sts.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'sts.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'sts.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'sts.us-gov-west-1.amazonaws.com', ], ], ], 'support' => [ 'endpoints' => [ 'aws-us-gov-global' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'support.us-gov-west-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'support.us-gov-west-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'support.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], 'partitionEndpoint' => 'aws-us-gov-global', ], 'swf' => [ 'endpoints' => [ 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'swf.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'swf.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'swf.us-gov-east-1.amazonaws.com', ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'swf.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'swf.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'swf.us-gov-west-1.amazonaws.com', ], ], ], 'synthetics' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'synthetics-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'synthetics-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'synthetics-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'synthetics-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'synthetics.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'synthetics-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'synthetics-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'synthetics.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'tagging' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'textract' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'textract-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'textract-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'textract-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'textract-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'textract.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'textract-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'textract-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'textract.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'transcribe' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'fips.transcribe.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'fips.transcribe.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'fips.transcribe.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'fips.transcribe.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribe-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribe.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'fips.transcribe.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribe-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribe.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'transcribestreaming' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'transcribestreaming-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'transcribestreaming-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribestreaming-fips.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribestreaming.us-gov-east-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'transcribestreaming-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'transcribestreaming-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'transcribestreaming.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'transfer' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'transfer-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'transfer-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'transfer-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'transfer-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'translate' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'translate-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], [ 'hostname' => 'translate-fips.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 'translate.us-gov-west-1.api.aws', 'tags' => [ 'dualstack', ], ], ], ], 'us-gov-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'translate-fips.us-gov-west-1.amazonaws.com', ], ], ], 'verifiedpermissions' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'verifiedpermissions-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'verifiedpermissions-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'verifiedpermissions-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'verifiedpermissions-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'waf-regional' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'waf-regional-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'waf-regional.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'waf-regional.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'waf-regional-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'wafv2' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'wafv2-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'hostname' => 'wafv2.us-gov-east-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'hostname' => 'wafv2.us-gov-west-1.amazonaws.com', 'variants' => [ [ 'hostname' => 'wafv2-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'wellarchitected' => [ 'endpoints' => [ 'us-gov-east-1' => [], 'us-gov-west-1' => [], ], ], 'workspaces' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'workspaces-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'workspaces-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'workspaces-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'workspaces-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], 'xray' => [ 'endpoints' => [ 'fips-us-gov-east-1' => [ 'credentialScope' => [ 'region' => 'us-gov-east-1', ], 'deprecated' => true, 'hostname' => 'xray-fips.us-gov-east-1.amazonaws.com', ], 'fips-us-gov-west-1' => [ 'credentialScope' => [ 'region' => 'us-gov-west-1', ], 'deprecated' => true, 'hostname' => 'xray-fips.us-gov-west-1.amazonaws.com', ], 'us-gov-east-1' => [ 'variants' => [ [ 'hostname' => 'xray-fips.us-gov-east-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], 'us-gov-west-1' => [ 'variants' => [ [ 'hostname' => 'xray-fips.us-gov-west-1.amazonaws.com', 'tags' => [ 'fips', ], ], ], ], ], ], ], ], [ 'defaults' => [ 'hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => [ 'https', ], 'signatureVersions' => [ 'v4', ], 'variants' => [ [ 'dnsSuffix' => 'c2s.ic.gov', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'dnsSuffix' => 'c2s.ic.gov', 'partition' => 'aws-iso', 'partitionName' => 'AWS ISO (US)', 'regionRegex' => '^us\\-iso\\-\\w+\\-\\d+$', 'regions' => [ 'us-iso-east-1' => [ 'description' => 'US ISO East', ], 'us-iso-west-1' => [ 'description' => 'US ISO WEST', ], ], 'services' => [ 'acm' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'agreement-marketplace' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'agreement-marketplace-fips.us-iso-east-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'agreement-marketplace-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'api.ecr' => [ 'endpoints' => [ 'us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'api.ecr.us-iso-east-1.c2s.ic.gov', ], 'us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'hostname' => 'api.ecr.us-iso-west-1.c2s.ic.gov', ], ], ], 'api.pricing' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'pricing', ], ], 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'api.sagemaker' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'apigateway' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'appconfig' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'appconfigdata' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'application-autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'arc-zonal-shift' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'athena' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'autoscaling' => [ 'endpoints' => [ 'us-iso-east-1' => [ 'protocols' => [ 'http', 'https', ], ], 'us-iso-west-1' => [], ], ], 'backup' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'batch' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'bedrock' => [ 'endpoints' => [ 'bedrock-runtime-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'bedrock-runtime.us-iso-east-1.c2s.ic.gov', ], 'bedrock-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'bedrock.us-iso-east-1.c2s.ic.gov', ], 'us-iso-east-1' => [], ], ], 'budgets' => [ 'endpoints' => [ 'aws-iso-global' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'budgets.c2s.ic.gov', ], 'us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'budgets.c2s.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-global', ], 'ce' => [ 'endpoints' => [ 'aws-iso-global' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'ce.us-iso-east-1.c2s.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-global', ], 'cloudcontrolapi' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'cloudformation' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'cloudtrail' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'cloudtrail-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'cloudtrail-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudtrail-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'cloudtrail-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'codebuild' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'codedeploy' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'comprehend' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'comprehend-fips.us-iso-east-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'comprehend-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'config' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'config-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'config-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'config-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'config-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'datapipeline' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'datasync' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'datasync-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'datasync-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'datasync-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'directconnect' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'dlm' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'dms' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'dms.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'dms' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'dms.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'dms-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'dms.us-iso-east-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'dms.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'dms.us-iso-east-1.c2s.ic.gov', ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'dms.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'dms.us-iso-west-1.c2s.ic.gov', ], ], ], 'ds' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'dynamodb' => [ 'endpoints' => [ 'us-iso-east-1' => [ 'protocols' => [ 'http', 'https', ], ], 'us-iso-west-1' => [], ], ], 'ebs' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'ec2' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'ecs' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'eks' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'elasticache' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'elasticfilesystem' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'elasticloadbalancing' => [ 'endpoints' => [ 'us-iso-east-1' => [ 'protocols' => [ 'http', 'https', ], ], 'us-iso-west-1' => [], ], ], 'elasticmapreduce' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'protocols' => [ 'https', ], 'variants' => [ [ 'hostname' => 'elasticmapreduce.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'es' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'events' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'firehose' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'fsx' => [ 'endpoints' => [ 'fips-prod-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'fsx-fips.us-iso-east-1.c2s.ic.gov', ], 'prod-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'fsx-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'fsx-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [], ], ], 'glacier' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'glacier-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'glacier-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 'glacier-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'glacier-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'glue' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'guardduty' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-iso-east-1' => [], ], 'isRegionalized' => true, ], 'health' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'iam' => [ 'endpoints' => [ 'aws-iso-global' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'iam.us-iso-east-1.c2s.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-global', ], 'kinesis' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'kinesisanalytics' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'kinesisvideo' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'kms' => [ 'endpoints' => [ 'ProdFips' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-iso-east-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-iso-east-1.c2s.ic.gov', ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-iso-west-1.c2s.ic.gov', ], ], ], 'lakeformation' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'lambda' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'license-manager' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'logs' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'medialive' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'medialive-fips.us-iso-east-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'medialive-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'mediapackage' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'metrics.sagemaker' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'monitoring' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'network-firewall' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'oam' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'organizations' => [ 'endpoints' => [ 'aws-iso-global' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'organizations.us-iso-east-1.c2s.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-global', ], 'outposts' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'pi' => [ 'endpoints' => [ 'us-iso-east-1' => [ 'protocols' => [ 'https', ], ], 'us-iso-west-1' => [ 'protocols' => [ 'https', ], ], ], ], 'ram' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'rbin' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'rds' => [ 'endpoints' => [ 'rds.us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'rds.us-iso-east-1.c2s.ic.gov', ], 'rds.us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'rds.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'rds.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'rds.us-iso-east-1.c2s.ic.gov', ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'rds.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'rds.us-iso-west-1.c2s.ic.gov', ], ], ], 'redshift' => [ 'endpoints' => [ 'us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'redshift.us-iso-east-1.c2s.ic.gov', ], 'us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'hostname' => 'redshift.us-iso-west-1.c2s.ic.gov', ], ], ], 'resource-groups' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'route53' => [ 'endpoints' => [ 'aws-iso-global' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'route53.c2s.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-global', ], 'route53resolver' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'runtime.sagemaker' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 's3' => [ 'defaults' => [ 'signatureVersions' => [ 's3v4', ], ], 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 's3-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 's3-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'protocols' => [ 'http', 'https', ], 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-fips.dualstack.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 's3-fips.dualstack.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 's3-control' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'signatureVersions' => [ 's3v4', ], ], 'endpoints' => [ 'us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 's3-control.us-iso-east-1.c2s.ic.gov', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'dualstack', ], ], ], ], 'us-iso-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-iso-east-1.c2s.ic.gov', 'signatureVersions' => [ 's3v4', ], ], 'us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'hostname' => 's3-control.us-iso-west-1.c2s.ic.gov', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'dualstack', ], ], ], ], 'us-iso-west-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-iso-west-1.c2s.ic.gov', 'signatureVersions' => [ 's3v4', ], ], ], ], 's3-outposts' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'deprecated' => true, ], 'us-iso-east-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], ], ], 'scheduler' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'secretsmanager' => [ 'endpoints' => [ 'us-iso-east-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-iso-east-1-fips' => [ 'deprecated' => true, ], 'us-iso-west-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1-fips' => [ 'deprecated' => true, ], ], ], 'securityhub' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'servicediscovery' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'servicequotas' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'snowball' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'sns' => [ 'endpoints' => [ 'us-iso-east-1' => [ 'protocols' => [ 'http', 'https', ], ], 'us-iso-west-1' => [], ], ], 'sqs' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'sqs.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'sqs.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'protocols' => [ 'http', 'https', ], 'variants' => [ [ 'hostname' => 'sqs.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'sqs.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'ssm' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'states' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'states-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'states-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'states-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'states-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'storagegateway' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'streams.dynamodb' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'dynamodb', ], ], 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'sts' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'support' => [ 'endpoints' => [ 'aws-iso-global' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'hostname' => 'support.us-iso-east-1.c2s.ic.gov', ], ], 'partitionEndpoint' => 'aws-iso-global', ], 'swf' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'swf-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'swf-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'swf-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'swf-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'synthetics' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'tagging' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], 'textract' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'transcribe' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'fips.transcribe.us-iso-east-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'fips.transcribe.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'transcribestreaming' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'translate' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'translate-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'translate-fips.us-iso-east-1.c2s.ic.gov', ], ], ], 'wafv2' => [ 'endpoints' => [ 'us-iso-east-1' => [], ], ], 'workspaces' => [ 'endpoints' => [ 'fips-us-iso-east-1' => [ 'credentialScope' => [ 'region' => 'us-iso-east-1', ], 'deprecated' => true, 'hostname' => 'workspaces-fips.us-iso-east-1.c2s.ic.gov', ], 'fips-us-iso-west-1' => [ 'credentialScope' => [ 'region' => 'us-iso-west-1', ], 'deprecated' => true, 'hostname' => 'workspaces-fips.us-iso-west-1.c2s.ic.gov', ], 'us-iso-east-1' => [ 'variants' => [ [ 'hostname' => 'workspaces-fips.us-iso-east-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-iso-west-1' => [ 'variants' => [ [ 'hostname' => 'workspaces-fips.us-iso-west-1.c2s.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'xray' => [ 'endpoints' => [ 'us-iso-east-1' => [], 'us-iso-west-1' => [], ], ], ], ], [ 'defaults' => [ 'hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => [ 'https', ], 'signatureVersions' => [ 'v4', ], 'variants' => [ [ 'dnsSuffix' => 'sc2s.sgov.gov', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'dnsSuffix' => 'sc2s.sgov.gov', 'partition' => 'aws-iso-b', 'partitionName' => 'AWS ISOB (US)', 'regionRegex' => '^us\\-isob\\-\\w+\\-\\d+$', 'regions' => [ 'us-isob-east-1' => [ 'description' => 'US ISOB East (Ohio)', ], 'us-isob-west-1' => [ 'description' => 'US ISOB West', ], ], 'services' => [ 'api.ecr' => [ 'endpoints' => [ 'us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'api.ecr.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-west-1' => [], ], ], 'api.pricing' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'pricing', ], ], 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'api.sagemaker' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'apigateway' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'appconfig' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'appconfigdata' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'application-autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'arc-zonal-shift' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'athena' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'backup' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'batch' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'bedrock' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'budgets' => [ 'endpoints' => [ 'aws-iso-b-global' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'budgets.global.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'budgets.global.sc2s.sgov.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-b-global', ], 'ce' => [ 'endpoints' => [ 'aws-iso-b-global' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'ce.us-isob-east-1.sc2s.sgov.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-b-global', ], 'cloudcontrolapi' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'cloudformation' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'cloudtrail' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'cloudtrail-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'cloudtrail-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-west-1' => [], ], ], 'codebuild' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'codedeploy' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'config' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'config-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'config-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-west-1' => [], ], ], 'datasync' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'directconnect' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'dlm' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'dms' => [ 'defaults' => [ 'variants' => [ [ 'hostname' => 'dms.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'endpoints' => [ 'dms' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'dms.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'dms-fips' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'dms.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'dms.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'dms.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-west-1' => [], ], ], 'ds' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'ds-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'ds-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'dynamodb' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'ebs' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'ec2' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'ecs' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'eks' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'elasticache' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'elasticfilesystem' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'elasticloadbalancing' => [ 'endpoints' => [ 'us-isob-east-1' => [ 'protocols' => [ 'https', ], ], 'us-isob-west-1' => [], ], ], 'elasticmapreduce' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'elasticmapreduce.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticmapreduce.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-west-1' => [], ], ], 'es' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'events' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'firehose' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'fsx' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'glacier' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'glacier-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'glacier-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'glue' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'guardduty' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'health' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'iam' => [ 'endpoints' => [ 'aws-iso-b-global' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'iam.us-isob-east-1.sc2s.sgov.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-b-global', ], 'kinesis' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'kinesisanalytics' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'kms' => [ 'endpoints' => [ 'ProdFips' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-west-1' => [], ], ], 'lakeformation' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'lambda' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'license-manager' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'logs' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'medialive' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'medialive-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'medialive-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'mediapackage' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'metering.marketplace' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'aws-marketplace', ], ], 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'metrics.sagemaker' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'monitoring' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'network-firewall' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'oam' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'organizations' => [ 'endpoints' => [ 'aws-iso-b-global' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'organizations.us-isob-east-1.sc2s.sgov.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-b-global', ], 'outposts' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'pi' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'ram' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'rbin' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'rbin-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'rbin-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-west-1' => [], ], ], 'rds' => [ 'endpoints' => [ 'rds.us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'rds.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'rds.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'rds.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-west-1' => [], ], ], 'redshift' => [ 'endpoints' => [ 'us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'redshift.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-west-1' => [], ], ], 'resource-groups' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'route53' => [ 'endpoints' => [ 'aws-iso-b-global' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'route53.sc2s.sgov.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-b-global', ], 'route53resolver' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'runtime.sagemaker' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 's3' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'signatureVersions' => [ 's3v4', ], ], 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 's3-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 's3-fips.dualstack.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-west-1' => [], ], ], 's3-control' => [ 'defaults' => [ 'protocols' => [ 'https', ], 'signatureVersions' => [ 's3v4', ], ], 'endpoints' => [ 'us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 's3-control.us-isob-east-1.sc2s.sgov.gov', 'signatureVersions' => [ 's3v4', ], 'variants' => [ [ 'hostname' => 's3-control-fips.dualstack.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'dualstack', 'fips', ], ], [ 'hostname' => 's3-control-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], [ 'hostname' => 's3-control.dualstack.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'dualstack', ], ], ], ], 'us-isob-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 's3-control-fips.us-isob-east-1.sc2s.sgov.gov', 'signatureVersions' => [ 's3v4', ], ], ], ], 's3-outposts' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'deprecated' => true, ], 'us-isob-east-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], ], ], 'scheduler' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'secretsmanager' => [ 'endpoints' => [ 'us-isob-east-1' => [ 'variants' => [ [ 'tags' => [ 'fips', ], ], ], ], 'us-isob-east-1-fips' => [ 'deprecated' => true, ], 'us-isob-west-1' => [], ], ], 'securityhub' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'servicediscovery' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'servicequotas' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'snowball' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'sns' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'sqs' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'sslCommonName' => '{region}.queue.{dnsSuffix}', ], 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'sqs.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'sqs.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-west-1' => [], ], ], 'ssm' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'states' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'states-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'states-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-west-1' => [], ], ], 'storagegateway' => [ 'endpoints' => [ 'fips' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'storagegateway-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'storagegateway-fips.us-isob-east-1.sc2s.sgov.gov', ], ], ], 'streams.dynamodb' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'dynamodb', ], 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'sts' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'support' => [ 'endpoints' => [ 'aws-iso-b-global' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'hostname' => 'support.us-isob-east-1.sc2s.sgov.gov', ], ], 'partitionEndpoint' => 'aws-iso-b-global', ], 'swf' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'swf-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'swf-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isob-west-1' => [], ], ], 'synthetics' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'tagging' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], 'wafv2' => [ 'endpoints' => [ 'us-isob-east-1' => [], ], ], 'workspaces' => [ 'endpoints' => [ 'fips-us-isob-east-1' => [ 'credentialScope' => [ 'region' => 'us-isob-east-1', ], 'deprecated' => true, 'hostname' => 'workspaces-fips.us-isob-east-1.sc2s.sgov.gov', ], 'us-isob-east-1' => [ 'variants' => [ [ 'hostname' => 'workspaces-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'xray' => [ 'endpoints' => [ 'us-isob-east-1' => [], 'us-isob-west-1' => [], ], ], ], ], [ 'defaults' => [ 'hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => [ 'https', ], 'signatureVersions' => [ 'v4', ], 'variants' => [ [ 'dnsSuffix' => 'cloud.adc-e.uk', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'dnsSuffix' => 'cloud.adc-e.uk', 'partition' => 'aws-iso-e', 'partitionName' => 'AWS ISOE (Europe)', 'regionRegex' => '^eu\\-isoe\\-\\w+\\-\\d+$', 'regions' => [ 'eu-isoe-west-1' => [ 'description' => 'EU ISOE West', ], ], 'services' => [ 'access-analyzer' => [ 'endpoints' => [ 'eu-isoe-west-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.eu-isoe-west-1.api.cloud-aws.adc-e.uk', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'acm' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'acm-pca' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'api.ecr' => [ 'endpoints' => [ 'eu-isoe-west-1' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'hostname' => 'api.ecr.eu-isoe-west-1.cloud.adc-e.uk', ], ], ], 'api.pricing' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'pricing', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'apigateway' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'appconfig' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'appconfigdata' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'application-autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'arc-zonal-shift' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'athena' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'batch' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'budgets' => [ 'endpoints' => [ 'aws-iso-e-global' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'hostname' => 'budgets.global.cloud.adc-e.uk', ], 'eu-isoe-west-1' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'hostname' => 'budgets.global.cloud.adc-e.uk', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-e-global', ], 'cloudcontrolapi' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'cloudformation' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'cloudtrail' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'cloudtrail-data' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'codedeploy' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'compute-optimizer' => [ 'endpoints' => [ 'eu-isoe-west-1' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'hostname' => 'compute-optimizer.eu-isoe-west-1.cloud.adc-e.uk', ], ], ], 'config' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'cost-optimization-hub' => [ 'endpoints' => [ 'eu-isoe-west-1' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'hostname' => 'cost-optimization-hub.eu-isoe-west-1.cloud.adc-e.uk', ], ], ], 'directconnect' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'dlm' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'dms' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'ds' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'dynamodb' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'ebs' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'ec2' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'ecs' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'eks' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'elasticache' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'elasticfilesystem' => [ 'endpoints' => [ 'eu-isoe-west-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.eu-isoe-west-1.cloud.adc-e.uk', 'tags' => [ 'fips', ], ], ], ], 'fips-eu-isoe-west-1' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.eu-isoe-west-1.cloud.adc-e.uk', ], ], ], 'elasticloadbalancing' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'elasticmapreduce' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'emr-serverless' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'es' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'events' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'firehose' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'glue' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'kinesis' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'kms' => [ 'endpoints' => [ 'ProdFips' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-isoe-west-1.cloud.adc-e.uk', ], 'eu-isoe-west-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.eu-isoe-west-1.cloud.adc-e.uk', 'tags' => [ 'fips', ], ], ], ], 'eu-isoe-west-1-fips' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.eu-isoe-west-1.cloud.adc-e.uk', ], ], ], 'lakeformation' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'lambda' => [ 'endpoints' => [ 'eu-isoe-west-1' => [ 'variants' => [ [ 'hostname' => 'lambda.eu-isoe-west-1.api.cloud-aws.adc-e.uk', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'license-manager' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'logs' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'monitoring' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'oam' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'organizations' => [ 'endpoints' => [ 'aws-iso-e-global' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'hostname' => 'organizations.eu-isoe-west-1.cloud.adc-e.uk', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-e-global', ], 'pi' => [ 'endpoints' => [ 'eu-isoe-west-1' => [ 'protocols' => [ 'https', ], ], ], ], 'pipes' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'ram' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'rbin' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'rds' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'redshift' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'redshift-serverless' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'resource-groups' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'route53' => [ 'endpoints' => [ 'aws-iso-e-global' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'hostname' => 'route53.cloud.adc-e.uk', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-e-global', ], 'route53profiles' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'route53resolver' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 's3' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'signatureVersions' => [ 's3v4', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'savingsplans' => [ 'endpoints' => [ 'aws-iso-e-global' => [ 'credentialScope' => [ 'region' => 'eu-isoe-west-1', ], 'hostname' => 'savingsplans.cloud.adc-e.uk', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-e-global', ], 'scheduler' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'schemas' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'secretsmanager' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'servicecatalog' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'servicediscovery' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'servicequotas' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'sns' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'sqs' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'sslCommonName' => '{region}.queue.{dnsSuffix}', ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'ssm' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'states' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'streams.dynamodb' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'dynamodb', ], 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'sts' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'swf' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'synthetics' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'tagging' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'trustedadvisor' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], 'xray' => [ 'endpoints' => [ 'eu-isoe-west-1' => [], ], ], ], ], [ 'defaults' => [ 'hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => [ 'https', ], 'signatureVersions' => [ 'v4', ], 'variants' => [ [ 'dnsSuffix' => 'csp.hci.ic.gov', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], ], ], 'dnsSuffix' => 'csp.hci.ic.gov', 'partition' => 'aws-iso-f', 'partitionName' => 'AWS ISOF', 'regionRegex' => '^us\\-isof\\-\\w+\\-\\d+$', 'regions' => [ 'us-isof-east-1' => [ 'description' => 'US ISOF EAST', ], 'us-isof-south-1' => [ 'description' => 'US ISOF SOUTH', ], ], 'services' => [ 'access-analyzer' => [ 'endpoints' => [ 'us-isof-east-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.us-isof-east-1.api.aws.hci.ic.gov', 'tags' => [ 'dualstack', ], ], ], ], 'us-isof-south-1' => [ 'variants' => [ [ 'hostname' => 'access-analyzer.us-isof-south-1.api.aws.hci.ic.gov', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'acm' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'acm-pca' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'api.ecr' => [ 'endpoints' => [ 'us-isof-east-1' => [ 'credentialScope' => [ 'region' => 'us-isof-east-1', ], 'hostname' => 'api.ecr.us-isof-east-1.csp.hci.ic.gov', ], 'us-isof-south-1' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'api.ecr.us-isof-south-1.csp.hci.ic.gov', ], ], ], 'api.pricing' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'pricing', ], ], 'endpoints' => [ 'us-isof-south-1' => [], ], ], 'api.sagemaker' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'appconfig' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'appconfigdata' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'application-autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'arc-zonal-shift' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'athena' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'autoscaling' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'backup' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'batch' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'budgets' => [ 'endpoints' => [ 'aws-iso-f-global' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'budgets.global.csp.hci.ic.gov', ], 'us-isof-south-1' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'budgets.global.csp.hci.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-f-global', ], 'ce' => [ 'endpoints' => [ 'aws-iso-f-global' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'ce.us-isof-south-1.csp.hci.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-f-global', ], 'cloudcontrolapi' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'cloudformation' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'cloudtrail' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'cloudtrail-data' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'codebuild' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'codedeploy' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'codepipeline' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'comprehend' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'compute-optimizer' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'compute-optimizer.us-isof-south-1.csp.hci.ic.gov', ], ], ], 'config' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'cost-optimization-hub' => [ 'endpoints' => [ 'us-isof-south-1' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'cost-optimization-hub.us-isof-south-1.csp.hci.ic.gov', ], ], ], 'directconnect' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'dlm' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'dms' => [ 'endpoints' => [ 'dms' => [ 'credentialScope' => [ 'region' => 'us-isof-east-1', ], 'deprecated' => true, 'variants' => [ [ 'hostname' => 'dms.us-isof-east-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'dms-fips' => [ 'credentialScope' => [ 'region' => 'us-isof-east-1', ], 'deprecated' => true, 'hostname' => 'dms.us-isof-east-1.csp.hci.ic.gov', ], 'us-isof-east-1' => [ 'variants' => [ [ 'hostname' => 'dms.us-isof-east-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isof-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isof-east-1', ], 'deprecated' => true, 'hostname' => 'dms.us-isof-east-1.csp.hci.ic.gov', ], 'us-isof-south-1' => [ 'variants' => [ [ 'hostname' => 'dms.us-isof-south-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isof-south-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'deprecated' => true, 'hostname' => 'dms.us-isof-south-1.csp.hci.ic.gov', ], ], ], 'ds' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'dynamodb' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'ebs' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'ec2' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'ecs' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'eks' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'elasticache' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'elasticfilesystem' => [ 'endpoints' => [ 'fips-us-isof-east-1' => [ 'credentialScope' => [ 'region' => 'us-isof-east-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-isof-east-1.csp.hci.ic.gov', ], 'fips-us-isof-south-1' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'deprecated' => true, 'hostname' => 'elasticfilesystem-fips.us-isof-south-1.csp.hci.ic.gov', ], 'us-isof-east-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-isof-east-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isof-south-1' => [ 'variants' => [ [ 'hostname' => 'elasticfilesystem-fips.us-isof-south-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'elasticloadbalancing' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'elasticmapreduce' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'es' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'events' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'firehose' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'fsx' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'glue' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'guardduty' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], 'isRegionalized' => true, ], 'iam' => [ 'endpoints' => [ 'aws-iso-f-global' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'iam.us-isof-south-1.csp.hci.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-f-global', ], 'kinesis' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'kms' => [ 'endpoints' => [ 'ProdFips' => [ 'credentialScope' => [ 'region' => 'us-isof-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-isof-east-1.csp.hci.ic.gov', ], 'us-isof-east-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-isof-east-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isof-east-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isof-east-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-isof-east-1.csp.hci.ic.gov', ], 'us-isof-south-1' => [ 'variants' => [ [ 'hostname' => 'kms-fips.us-isof-south-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isof-south-1-fips' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'deprecated' => true, 'hostname' => 'kms-fips.us-isof-south-1.csp.hci.ic.gov', ], ], ], 'lakeformation' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'lambda' => [ 'endpoints' => [ 'us-isof-east-1' => [ 'variants' => [ [ 'hostname' => 'lambda.us-isof-east-1.api.aws.hci.ic.gov', 'tags' => [ 'dualstack', ], ], ], ], 'us-isof-south-1' => [ 'variants' => [ [ 'hostname' => 'lambda.us-isof-south-1.api.aws.hci.ic.gov', 'tags' => [ 'dualstack', ], ], ], ], ], ], 'license-manager' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'logs' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'metrics.sagemaker' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'monitoring' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'oam' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'organizations' => [ 'endpoints' => [ 'aws-iso-f-global' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'organizations.us-isof-south-1.csp.hci.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-f-global', ], 'pi' => [ 'endpoints' => [ 'us-isof-east-1' => [ 'protocols' => [ 'https', ], ], 'us-isof-south-1' => [ 'protocols' => [ 'https', ], ], ], ], 'pipes' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'quicksight' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'ram' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'rbin' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'rds' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'redshift' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'redshift-serverless' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'rekognition' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'resource-groups' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'route53' => [ 'endpoints' => [ 'aws-iso-f-global' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'route53.csp.hci.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-f-global', ], 'route53profiles' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'route53resolver' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'runtime.sagemaker' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 's3' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'signatureVersions' => [ 's3v4', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'savingsplans' => [ 'endpoints' => [ 'aws-iso-f-global' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'hostname' => 'savingsplans.csp.hci.ic.gov', ], ], 'isRegionalized' => false, 'partitionEndpoint' => 'aws-iso-f-global', ], 'scheduler' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'schemas' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'secretsmanager' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'servicediscovery' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'servicequotas' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'sns' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'sqs' => [ 'defaults' => [ 'protocols' => [ 'http', 'https', ], 'sslCommonName' => '{region}.queue.{dnsSuffix}', ], 'endpoints' => [ 'fips-us-isof-east-1' => [ 'credentialScope' => [ 'region' => 'us-isof-east-1', ], 'deprecated' => true, 'hostname' => 'sqs.us-isof-east-1.csp.hci.ic.gov', ], 'fips-us-isof-south-1' => [ 'credentialScope' => [ 'region' => 'us-isof-south-1', ], 'deprecated' => true, 'hostname' => 'sqs.us-isof-south-1.csp.hci.ic.gov', ], 'us-isof-east-1' => [ 'variants' => [ [ 'hostname' => 'sqs.us-isof-east-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], 'us-isof-south-1' => [ 'variants' => [ [ 'hostname' => 'sqs.us-isof-south-1.csp.hci.ic.gov', 'tags' => [ 'fips', ], ], ], ], ], ], 'ssm' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'states' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'streams.dynamodb' => [ 'defaults' => [ 'credentialScope' => [ 'service' => 'dynamodb', ], 'protocols' => [ 'http', 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'sts' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'swf' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'synthetics' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'tagging' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'textract' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'transcribe' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'transcribestreaming' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'translate' => [ 'defaults' => [ 'protocols' => [ 'https', ], ], 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], 'trustedadvisor' => [ 'endpoints' => [ 'us-isof-south-1' => [], ], ], 'xray' => [ 'endpoints' => [ 'us-isof-east-1' => [], 'us-isof-south-1' => [], ], ], ], ], [ 'defaults' => [ 'hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => [ 'https', ], 'signatureVersions' => [ 'v4', ], 'variants' => [ [ 'dnsSuffix' => 'amazonaws.eu', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'fips', ], ], [ 'dnsSuffix' => 'api.amazonwebservices.eu', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', 'fips', ], ], [ 'dnsSuffix' => 'api.amazonwebservices.eu', 'hostname' => '{service}.{region}.{dnsSuffix}', 'tags' => [ 'dualstack', ], ], ], ], 'dnsSuffix' => 'amazonaws.eu', 'partition' => 'aws-eusc', 'partitionName' => 'AWS EUSC', 'regionRegex' => '^eusc\\-(de)\\-\\w+\\-\\d+$', 'regions' => [ 'eusc-de-east-1' => [ 'description' => 'EU (Germany)', ], ], 'services' => [], ], ], 'version' => 3,]; diff --git a/vendor/aws/aws-sdk-php/src/data/endpoints_prefix_history.json.php b/vendor/aws/aws-sdk-php/src/data/endpoints_prefix_history.json.php new file mode 100644 index 0000000..3e8b7c0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/endpoints_prefix_history.json.php @@ -0,0 +1,3 @@ + [ 'api.ecr' => [ 'ecr', ], 'api.elastic-inference' => [ 'elastic-inference', ], 'api.sagemaker' => [ 'sagemaker', ], 'ecr' => [ 'api.ecr', ], 'elastic-inference' => [ 'api.elastic-inference', ], 'sagemaker' => [ 'api.sagemaker', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/grandfathered-services.json.php b/vendor/aws/aws-sdk-php/src/data/grandfathered-services.json.php new file mode 100644 index 0000000..2688176 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/grandfathered-services.json.php @@ -0,0 +1,3 @@ + [ 'AccessAnalyzer', 'Account', 'ACMPCA', 'ACM', 'PrometheusService', 'Amplify', 'AmplifyBackend', 'AmplifyUIBuilder', 'APIGateway', 'ApiGatewayManagementApi', 'ApiGatewayV2', 'AppConfig', 'AppConfigData', 'Appflow', 'AppIntegrationsService', 'ApplicationAutoScaling', 'ApplicationInsights', 'ApplicationCostProfiler', 'AppMesh', 'AppRunner', 'AppStream', 'AppSync', 'Athena', 'AuditManager', 'AutoScalingPlans', 'AutoScaling', 'BackupGateway', 'Backup', 'Batch', 'BillingConductor', 'Braket', 'Budgets', 'CostExplorer', 'ChimeSDKIdentity', 'ChimeSDKMediaPipelines', 'ChimeSDKMeetings', 'ChimeSDKMessaging', 'Chime', 'Cloud9', 'CloudControlApi', 'CloudDirectory', 'CloudFormation', 'CloudFront', 'CloudHSM', 'CloudHSMV2', 'CloudSearch', 'CloudSearchDomain', 'CloudTrail', 'CodeArtifact', 'CodeBuild', 'CodeCommit', 'CodeDeploy', 'CodeGuruReviewer', 'CodeGuruProfiler', 'CodePipeline', 'CodeStarconnections', 'CodeStarNotifications', 'CodeStar', 'CognitoIdentity', 'CognitoIdentityProvider', 'CognitoSync', 'Comprehend', 'ComprehendMedical', 'ComputeOptimizer', 'ConfigService', 'ConnectContactLens', 'Connect', 'ConnectCampaignService', 'ConnectParticipant', 'CostandUsageReportService', 'CustomerProfiles', 'IoTDataPlane', 'GlueDataBrew', 'DataExchange', 'DataPipeline', 'DataSync', 'DAX', 'Detective', 'DeviceFarm', 'DevOpsGuru', 'DirectConnect', 'ApplicationDiscoveryService', 'DLM', 'DatabaseMigrationService', 'DocDB', 'drs', 'DirectoryService', 'DynamoDB', 'EBS', 'EC2InstanceConnect', 'EC2', 'ECRPublic', 'ECR', 'ECS', 'EKS', 'ElastiCache', 'ElasticBeanstalk', 'EFS', 'ElasticLoadBalancing', 'ElasticLoadBalancingv2', 'EMR', 'ElasticTranscoder', 'SES', 'EMRContainers', 'EMRServerless', 'MarketplaceEntitlementService', 'ElasticsearchService', 'EventBridge', 'CloudWatchEvents', 'CloudWatchEvidently', 'FinSpaceData', 'finspace', 'Firehose', 'FIS', 'FMS', 'ForecastService', 'ForecastQueryService', 'FraudDetector', 'FSx', 'GameLift', 'Glacier', 'GlobalAccelerator', 'Glue', 'ManagedGrafana', 'Greengrass', 'GreengrassV2', 'GroundStation', 'GuardDuty', 'Health', 'HealthLake', 'IAM', 'IdentityStore', 'imagebuilder', 'ImportExport', 'Inspector', 'Inspector2', 'IoTJobsDataPlane', 'IoT', 'IoTAnalytics', 'IoTDeviceAdvisor', 'IoTEventsData', 'IoTEvents', 'IoTSecureTunneling', 'IoTSiteWise', 'IoTThingsGraph', 'IoTTwinMaker', 'IoTWireless', 'IVS', 'ivschat', 'Kafka', 'KafkaConnect', 'kendra', 'Keyspaces', 'KinesisVideoArchivedMedia', 'KinesisVideoMedia', 'KinesisVideoSignalingChannels', 'Kinesis', 'KinesisAnalytics', 'KinesisAnalyticsV2', 'KinesisVideo', 'KMS', 'LakeFormation', 'Lambda', 'LexModelBuildingService', 'LicenseManager', 'Lightsail', 'LocationService', 'CloudWatchLogs', 'LookoutEquipment', 'MainframeModernization', 'MachineLearning', 'Macie2', 'ManagedBlockchain', 'MarketplaceCatalog', 'MarketplaceCommerceAnalytics', 'MediaConnect', 'MediaConvert', 'MediaLive', 'MediaPackageVod', 'MediaPackage', 'MediaStoreData', 'MediaStore', 'MediaTailor', 'MemoryDB', 'MarketplaceMetering', 'MigrationHub', 'mgn', 'MigrationHubRefactorSpaces', 'MigrationHubConfig', 'MigrationHubStrategyRecommendations', 'LexModelsV2', 'CloudWatch', 'MQ', 'MTurk', 'MWAA', 'Neptune', 'NetworkFirewall', 'NetworkManager', 'OpenSearchService', 'Organizations', 'Outposts', 'Panorama', 'PersonalizeEvents', 'PersonalizeRuntime', 'Personalize', 'PI', 'PinpointEmail', 'PinpointSMSVoiceV2', 'Pinpoint', 'Polly', 'Pricing', 'Proton', 'QuickSight', 'RAM', 'RecycleBin', 'RDSDataService', 'RDS', 'RedshiftDataAPIService', 'RedshiftServerless', 'Redshift', 'Rekognition', 'ResilienceHub', 'ResourceGroups', 'ResourceGroupsTaggingAPI', 'Route53RecoveryCluster', 'Route53RecoveryControlConfig', 'Route53RecoveryReadiness', 'Route53', 'Route53Domains', 'Route53Resolver', 'CloudWatchRUM', 'LexRuntimeV2', 'LexRuntimeService', 'SageMakerRuntime', 'S3', 'S3Control', 'S3Outposts', 'AugmentedAIRuntime', 'SagemakerEdgeManager', 'SageMakerFeatureStoreRuntime', 'SageMaker', 'SavingsPlans', 'Schemas', 'SecretsManager', 'SecurityHub', 'ServerlessApplicationRepository', 'ServiceQuotas', 'AppRegistry', 'ServiceCatalog', 'ServiceDiscovery', 'SESV2', 'Shield', 'signer', 'PinpointSMSVoice', 'SnowDeviceManagement', 'Snowball', 'SNS', 'SQS', 'SSMContacts', 'SSMIncidents', 'SSM', 'SSOAdmin', 'SSOOIDC', 'SSO', 'SFN', 'StorageGateway', 'DynamoDBStreams', 'STS', 'Support', 'SWF', 'Synthetics', 'Textract', 'TimestreamQuery', 'TimestreamWrite', 'TranscribeService', 'Transfer', 'Translate', 'VoiceID', 'WAFRegional', 'WAF', 'WAFV2', 'WellArchitected', 'ConnectWisdomService', 'WorkDocs', 'WorkMail', 'WorkMailMessageFlow', 'WorkSpacesWeb', 'WorkSpaces', 'XRay', ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/manifest.json.php b/vendor/aws/aws-sdk-php/src/data/manifest.json.php new file mode 100644 index 0000000..a2a1c15 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/manifest.json.php @@ -0,0 +1,3 @@ + [ 'namespace' => 'AccessAnalyzer', 'versions' => [ 'latest' => '2019-11-01', '2019-11-01' => '2019-11-01', ], 'serviceIdentifier' => 'accessanalyzer', ], 'account' => [ 'namespace' => 'Account', 'versions' => [ 'latest' => '2021-02-01', '2021-02-01' => '2021-02-01', ], 'serviceIdentifier' => 'account', ], 'acm-pca' => [ 'namespace' => 'ACMPCA', 'versions' => [ 'latest' => '2017-08-22', '2017-08-22' => '2017-08-22', ], 'serviceIdentifier' => 'acm_pca', ], 'acm' => [ 'namespace' => 'Acm', 'versions' => [ 'latest' => '2015-12-08', '2015-12-08' => '2015-12-08', ], 'serviceIdentifier' => 'acm', ], 'aiops' => [ 'namespace' => 'AIOps', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'aiops', ], 'amp' => [ 'namespace' => 'PrometheusService', 'versions' => [ 'latest' => '2020-08-01', '2020-08-01' => '2020-08-01', ], 'serviceIdentifier' => 'amp', ], 'amplify' => [ 'namespace' => 'Amplify', 'versions' => [ 'latest' => '2017-07-25', '2017-07-25' => '2017-07-25', ], 'serviceIdentifier' => 'amplify', ], 'amplifybackend' => [ 'namespace' => 'AmplifyBackend', 'versions' => [ 'latest' => '2020-08-11', '2020-08-11' => '2020-08-11', ], 'serviceIdentifier' => 'amplifybackend', ], 'amplifyuibuilder' => [ 'namespace' => 'AmplifyUIBuilder', 'versions' => [ 'latest' => '2021-08-11', '2021-08-11' => '2021-08-11', ], 'serviceIdentifier' => 'amplifyuibuilder', ], 'apigateway' => [ 'namespace' => 'ApiGateway', 'versions' => [ 'latest' => '2015-07-09', '2015-07-09' => '2015-07-09', '2015-06-01' => '2015-07-09', ], 'serviceIdentifier' => 'api_gateway', ], 'apigatewaymanagementapi' => [ 'namespace' => 'ApiGatewayManagementApi', 'versions' => [ 'latest' => '2018-11-29', '2018-11-29' => '2018-11-29', ], 'serviceIdentifier' => 'apigatewaymanagementapi', ], 'apigatewayv2' => [ 'namespace' => 'ApiGatewayV2', 'versions' => [ 'latest' => '2018-11-29', '2018-11-29' => '2018-11-29', ], 'serviceIdentifier' => 'apigatewayv2', ], 'appconfig' => [ 'namespace' => 'AppConfig', 'versions' => [ 'latest' => '2019-10-09', '2019-10-09' => '2019-10-09', ], 'serviceIdentifier' => 'appconfig', ], 'appconfigdata' => [ 'namespace' => 'AppConfigData', 'versions' => [ 'latest' => '2021-11-11', '2021-11-11' => '2021-11-11', ], 'serviceIdentifier' => 'appconfigdata', ], 'appfabric' => [ 'namespace' => 'AppFabric', 'versions' => [ 'latest' => '2023-05-19', '2023-05-19' => '2023-05-19', ], 'serviceIdentifier' => 'appfabric', ], 'appflow' => [ 'namespace' => 'Appflow', 'versions' => [ 'latest' => '2020-08-23', '2020-08-23' => '2020-08-23', ], 'serviceIdentifier' => 'appflow', ], 'appintegrations' => [ 'namespace' => 'AppIntegrationsService', 'versions' => [ 'latest' => '2020-07-29', '2020-07-29' => '2020-07-29', ], 'serviceIdentifier' => 'appintegrations', ], 'application-autoscaling' => [ 'namespace' => 'ApplicationAutoScaling', 'versions' => [ 'latest' => '2016-02-06', '2016-02-06' => '2016-02-06', ], 'serviceIdentifier' => 'application_auto_scaling', ], 'application-insights' => [ 'namespace' => 'ApplicationInsights', 'versions' => [ 'latest' => '2018-11-25', '2018-11-25' => '2018-11-25', ], 'serviceIdentifier' => 'application_insights', ], 'application-signals' => [ 'namespace' => 'ApplicationSignals', 'versions' => [ 'latest' => '2024-04-15', '2024-04-15' => '2024-04-15', ], 'serviceIdentifier' => 'application_signals', ], 'applicationcostprofiler' => [ 'namespace' => 'ApplicationCostProfiler', 'versions' => [ 'latest' => '2020-09-10', '2020-09-10' => '2020-09-10', ], 'serviceIdentifier' => 'applicationcostprofiler', ], 'appmesh' => [ 'namespace' => 'AppMesh', 'versions' => [ 'latest' => '2019-01-25', '2019-01-25' => '2019-01-25', '2018-10-01' => '2018-10-01', ], 'serviceIdentifier' => 'app_mesh', ], 'apprunner' => [ 'namespace' => 'AppRunner', 'versions' => [ 'latest' => '2020-05-15', '2020-05-15' => '2020-05-15', ], 'serviceIdentifier' => 'apprunner', ], 'appstream' => [ 'namespace' => 'Appstream', 'versions' => [ 'latest' => '2016-12-01', '2016-12-01' => '2016-12-01', ], 'serviceIdentifier' => 'appstream', ], 'appsync' => [ 'namespace' => 'AppSync', 'versions' => [ 'latest' => '2017-07-25', '2017-07-25' => '2017-07-25', ], 'serviceIdentifier' => 'appsync', ], 'arc-region-switch' => [ 'namespace' => 'ARCRegionSwitch', 'versions' => [ 'latest' => '2022-07-26', '2022-07-26' => '2022-07-26', ], 'serviceIdentifier' => 'arc_region_switch', ], 'arc-zonal-shift' => [ 'namespace' => 'ARCZonalShift', 'versions' => [ 'latest' => '2022-10-30', '2022-10-30' => '2022-10-30', ], 'serviceIdentifier' => 'arc_zonal_shift', ], 'artifact' => [ 'namespace' => 'Artifact', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'artifact', ], 'athena' => [ 'namespace' => 'Athena', 'versions' => [ 'latest' => '2017-05-18', '2017-05-18' => '2017-05-18', ], 'serviceIdentifier' => 'athena', ], 'auditmanager' => [ 'namespace' => 'AuditManager', 'versions' => [ 'latest' => '2017-07-25', '2017-07-25' => '2017-07-25', ], 'serviceIdentifier' => 'auditmanager', ], 'autoscaling-plans' => [ 'namespace' => 'AutoScalingPlans', 'versions' => [ 'latest' => '2018-01-06', '2018-01-06' => '2018-01-06', ], 'serviceIdentifier' => 'auto_scaling_plans', ], 'autoscaling' => [ 'namespace' => 'AutoScaling', 'versions' => [ 'latest' => '2011-01-01', '2011-01-01' => '2011-01-01', ], 'serviceIdentifier' => 'auto_scaling', ], 'b2bi' => [ 'namespace' => 'B2bi', 'versions' => [ 'latest' => '2022-06-23', '2022-06-23' => '2022-06-23', ], 'serviceIdentifier' => 'b2bi', ], 'backup-gateway' => [ 'namespace' => 'BackupGateway', 'versions' => [ 'latest' => '2021-01-01', '2021-01-01' => '2021-01-01', ], 'serviceIdentifier' => 'backup_gateway', ], 'backup' => [ 'namespace' => 'Backup', 'versions' => [ 'latest' => '2018-11-15', '2018-11-15' => '2018-11-15', ], 'serviceIdentifier' => 'backup', ], 'backupsearch' => [ 'namespace' => 'BackupSearch', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'backupsearch', ], 'batch' => [ 'namespace' => 'Batch', 'versions' => [ 'latest' => '2016-08-10', '2016-08-10' => '2016-08-10', ], 'serviceIdentifier' => 'batch', ], 'bcm-dashboards' => [ 'namespace' => 'BCMDashboards', 'versions' => [ 'latest' => '2025-08-18', '2025-08-18' => '2025-08-18', ], 'serviceIdentifier' => 'bcm_dashboards', ], 'bcm-data-exports' => [ 'namespace' => 'BCMDataExports', 'versions' => [ 'latest' => '2023-11-26', '2023-11-26' => '2023-11-26', ], 'serviceIdentifier' => 'bcm_data_exports', ], 'bcm-pricing-calculator' => [ 'namespace' => 'BCMPricingCalculator', 'versions' => [ 'latest' => '2024-06-19', '2024-06-19' => '2024-06-19', ], 'serviceIdentifier' => 'bcm_pricing_calculator', ], 'bcm-recommended-actions' => [ 'namespace' => 'BCMRecommendedActions', 'versions' => [ 'latest' => '2024-11-14', '2024-11-14' => '2024-11-14', ], 'serviceIdentifier' => 'bcm_recommended_actions', ], 'bedrock-agent-runtime' => [ 'namespace' => 'BedrockAgentRuntime', 'versions' => [ 'latest' => '2023-07-26', '2023-07-26' => '2023-07-26', ], 'serviceIdentifier' => 'bedrock_agent_runtime', ], 'bedrock-agent' => [ 'namespace' => 'BedrockAgent', 'versions' => [ 'latest' => '2023-06-05', '2023-06-05' => '2023-06-05', ], 'serviceIdentifier' => 'bedrock_agent', ], 'bedrock-agentcore-control' => [ 'namespace' => 'BedrockAgentCoreControl', 'versions' => [ 'latest' => '2023-06-05', '2023-06-05' => '2023-06-05', ], 'serviceIdentifier' => 'bedrock_agentcore_control', ], 'bedrock-agentcore' => [ 'namespace' => 'BedrockAgentCore', 'versions' => [ 'latest' => '2024-02-28', '2024-02-28' => '2024-02-28', ], 'serviceIdentifier' => 'bedrock_agentcore', ], 'bedrock-data-automation-runtime' => [ 'namespace' => 'BedrockDataAutomationRuntime', 'versions' => [ 'latest' => '2024-06-13', '2024-06-13' => '2024-06-13', ], 'serviceIdentifier' => 'bedrock_data_automation_runtime', ], 'bedrock-data-automation' => [ 'namespace' => 'BedrockDataAutomation', 'versions' => [ 'latest' => '2023-07-26', '2023-07-26' => '2023-07-26', ], 'serviceIdentifier' => 'bedrock_data_automation', ], 'bedrock-runtime' => [ 'namespace' => 'BedrockRuntime', 'versions' => [ 'latest' => '2023-09-30', '2023-09-30' => '2023-09-30', ], 'serviceIdentifier' => 'bedrock_runtime', ], 'bedrock' => [ 'namespace' => 'Bedrock', 'versions' => [ 'latest' => '2023-04-20', '2023-04-20' => '2023-04-20', ], 'serviceIdentifier' => 'bedrock', ], 'billing' => [ 'namespace' => 'Billing', 'versions' => [ 'latest' => '2023-09-07', '2023-09-07' => '2023-09-07', ], 'serviceIdentifier' => 'billing', ], 'billingconductor' => [ 'namespace' => 'BillingConductor', 'versions' => [ 'latest' => '2021-07-30', '2021-07-30' => '2021-07-30', ], 'serviceIdentifier' => 'billingconductor', ], 'braket' => [ 'namespace' => 'Braket', 'versions' => [ 'latest' => '2019-09-01', '2019-09-01' => '2019-09-01', ], 'serviceIdentifier' => 'braket', ], 'budgets' => [ 'namespace' => 'Budgets', 'versions' => [ 'latest' => '2016-10-20', '2016-10-20' => '2016-10-20', ], 'serviceIdentifier' => 'budgets', ], 'ce' => [ 'namespace' => 'CostExplorer', 'versions' => [ 'latest' => '2017-10-25', '2017-10-25' => '2017-10-25', ], 'serviceIdentifier' => 'cost_explorer', ], 'chatbot' => [ 'namespace' => 'Chatbot', 'versions' => [ 'latest' => '2017-10-11', '2017-10-11' => '2017-10-11', ], 'serviceIdentifier' => 'chatbot', ], 'chime-sdk-identity' => [ 'namespace' => 'ChimeSDKIdentity', 'versions' => [ 'latest' => '2021-04-20', '2021-04-20' => '2021-04-20', ], 'serviceIdentifier' => 'chime_sdk_identity', ], 'chime-sdk-media-pipelines' => [ 'namespace' => 'ChimeSDKMediaPipelines', 'versions' => [ 'latest' => '2021-07-15', '2021-07-15' => '2021-07-15', ], 'serviceIdentifier' => 'chime_sdk_media_pipelines', ], 'chime-sdk-meetings' => [ 'namespace' => 'ChimeSDKMeetings', 'versions' => [ 'latest' => '2021-07-15', '2021-07-15' => '2021-07-15', ], 'serviceIdentifier' => 'chime_sdk_meetings', ], 'chime-sdk-messaging' => [ 'namespace' => 'ChimeSDKMessaging', 'versions' => [ 'latest' => '2021-05-15', '2021-05-15' => '2021-05-15', ], 'serviceIdentifier' => 'chime_sdk_messaging', ], 'chime-sdk-voice' => [ 'namespace' => 'ChimeSDKVoice', 'versions' => [ 'latest' => '2022-08-03', '2022-08-03' => '2022-08-03', ], 'serviceIdentifier' => 'chime_sdk_voice', ], 'chime' => [ 'namespace' => 'Chime', 'versions' => [ 'latest' => '2018-05-01', '2018-05-01' => '2018-05-01', ], 'serviceIdentifier' => 'chime', ], 'cleanrooms' => [ 'namespace' => 'CleanRooms', 'versions' => [ 'latest' => '2022-02-17', '2022-02-17' => '2022-02-17', ], 'serviceIdentifier' => 'cleanrooms', ], 'cleanroomsml' => [ 'namespace' => 'CleanRoomsML', 'versions' => [ 'latest' => '2023-09-06', '2023-09-06' => '2023-09-06', ], 'serviceIdentifier' => 'cleanroomsml', ], 'cloud9' => [ 'namespace' => 'Cloud9', 'versions' => [ 'latest' => '2017-09-23', '2017-09-23' => '2017-09-23', ], 'serviceIdentifier' => 'cloud9', ], 'cloudcontrol' => [ 'namespace' => 'CloudControlApi', 'versions' => [ 'latest' => '2021-09-30', '2021-09-30' => '2021-09-30', ], 'serviceIdentifier' => 'cloudcontrol', ], 'clouddirectory' => [ 'namespace' => 'CloudDirectory', 'versions' => [ 'latest' => '2017-01-11', '2017-01-11' => '2017-01-11', '2016-05-10' => '2016-05-10', ], 'serviceIdentifier' => 'clouddirectory', ], 'cloudformation' => [ 'namespace' => 'CloudFormation', 'versions' => [ 'latest' => '2010-05-15', '2010-05-15' => '2010-05-15', ], 'serviceIdentifier' => 'cloudformation', ], 'cloudfront-keyvaluestore' => [ 'namespace' => 'CloudFrontKeyValueStore', 'versions' => [ 'latest' => '2022-07-26', '2022-07-26' => '2022-07-26', ], 'serviceIdentifier' => 'cloudfront_keyvaluestore', ], 'cloudfront' => [ 'namespace' => 'CloudFront', 'versions' => [ 'latest' => '2020-05-31', '2020-05-31' => '2020-05-31', '2019-03-26' => '2019-03-26', '2018-11-05' => '2018-11-05', '2018-06-18' => '2018-06-18', '2017-10-30' => '2017-10-30', '2017-03-25' => '2017-03-25', '2016-11-25' => '2016-11-25', '2016-09-29' => '2016-09-29', '2016-09-07' => '2016-09-07', '2016-08-20' => '2016-08-20', '2016-08-01' => '2016-08-01', '2016-01-28' => '2016-01-28', '2016-01-13' => '2020-05-31', '2015-09-17' => '2020-05-31', '2015-07-27' => '2015-07-27', '2015-04-17' => '2015-07-27', '2014-11-06' => '2015-07-27', ], 'serviceIdentifier' => 'cloudfront', ], 'cloudhsm' => [ 'namespace' => 'CloudHsm', 'versions' => [ 'latest' => '2014-05-30', '2014-05-30' => '2014-05-30', ], 'serviceIdentifier' => 'cloudhsm', ], 'cloudhsmv2' => [ 'namespace' => 'CloudHSMV2', 'versions' => [ 'latest' => '2017-04-28', '2017-04-28' => '2017-04-28', ], 'serviceIdentifier' => 'cloudhsm_v2', ], 'cloudsearch' => [ 'namespace' => 'CloudSearch', 'versions' => [ 'latest' => '2013-01-01', '2013-01-01' => '2013-01-01', ], 'serviceIdentifier' => 'cloudsearch', ], 'cloudsearchdomain' => [ 'namespace' => 'CloudSearchDomain', 'versions' => [ 'latest' => '2013-01-01', '2013-01-01' => '2013-01-01', ], 'serviceIdentifier' => 'cloudsearch_domain', ], 'cloudtrail-data' => [ 'namespace' => 'CloudTrailData', 'versions' => [ 'latest' => '2021-08-11', '2021-08-11' => '2021-08-11', ], 'serviceIdentifier' => 'cloudtrail_data', ], 'cloudtrail' => [ 'namespace' => 'CloudTrail', 'versions' => [ 'latest' => '2013-11-01', '2013-11-01' => '2013-11-01', ], 'serviceIdentifier' => 'cloudtrail', ], 'codeartifact' => [ 'namespace' => 'CodeArtifact', 'versions' => [ 'latest' => '2018-09-22', '2018-09-22' => '2018-09-22', ], 'serviceIdentifier' => 'codeartifact', ], 'codebuild' => [ 'namespace' => 'CodeBuild', 'versions' => [ 'latest' => '2016-10-06', '2016-10-06' => '2016-10-06', ], 'serviceIdentifier' => 'codebuild', ], 'codecatalyst' => [ 'namespace' => 'CodeCatalyst', 'versions' => [ 'latest' => '2022-09-28', '2022-09-28' => '2022-09-28', ], 'serviceIdentifier' => 'codecatalyst', ], 'codecommit' => [ 'namespace' => 'CodeCommit', 'versions' => [ 'latest' => '2015-04-13', '2015-04-13' => '2015-04-13', ], 'serviceIdentifier' => 'codecommit', ], 'codeconnections' => [ 'namespace' => 'CodeConnections', 'versions' => [ 'latest' => '2023-12-01', '2023-12-01' => '2023-12-01', ], 'serviceIdentifier' => 'codeconnections', ], 'codedeploy' => [ 'namespace' => 'CodeDeploy', 'versions' => [ 'latest' => '2014-10-06', '2014-10-06' => '2014-10-06', ], 'serviceIdentifier' => 'codedeploy', ], 'codeguru-reviewer' => [ 'namespace' => 'CodeGuruReviewer', 'versions' => [ 'latest' => '2019-09-19', '2019-09-19' => '2019-09-19', ], 'serviceIdentifier' => 'codeguru_reviewer', ], 'codeguru-security' => [ 'namespace' => 'CodeGuruSecurity', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'codeguru_security', ], 'codeguruprofiler' => [ 'namespace' => 'CodeGuruProfiler', 'versions' => [ 'latest' => '2019-07-18', '2019-07-18' => '2019-07-18', ], 'serviceIdentifier' => 'codeguruprofiler', ], 'codepipeline' => [ 'namespace' => 'CodePipeline', 'versions' => [ 'latest' => '2015-07-09', '2015-07-09' => '2015-07-09', ], 'serviceIdentifier' => 'codepipeline', ], 'codestar-connections' => [ 'namespace' => 'CodeStarconnections', 'versions' => [ 'latest' => '2019-12-01', '2019-12-01' => '2019-12-01', ], 'serviceIdentifier' => 'codestar_connections', ], 'codestar-notifications' => [ 'namespace' => 'CodeStarNotifications', 'versions' => [ 'latest' => '2019-10-15', '2019-10-15' => '2019-10-15', ], 'serviceIdentifier' => 'codestar_notifications', ], 'cognito-identity' => [ 'namespace' => 'CognitoIdentity', 'versions' => [ 'latest' => '2014-06-30', '2014-06-30' => '2014-06-30', ], 'serviceIdentifier' => 'cognito_identity', ], 'cognito-idp' => [ 'namespace' => 'CognitoIdentityProvider', 'versions' => [ 'latest' => '2016-04-18', '2016-04-18' => '2016-04-18', ], 'serviceIdentifier' => 'cognito_identity_provider', ], 'cognito-sync' => [ 'namespace' => 'CognitoSync', 'versions' => [ 'latest' => '2014-06-30', '2014-06-30' => '2014-06-30', ], 'serviceIdentifier' => 'cognito_sync', ], 'comprehend' => [ 'namespace' => 'Comprehend', 'versions' => [ 'latest' => '2017-11-27', '2017-11-27' => '2017-11-27', ], 'serviceIdentifier' => 'comprehend', ], 'comprehendmedical' => [ 'namespace' => 'ComprehendMedical', 'versions' => [ 'latest' => '2018-10-30', '2018-10-30' => '2018-10-30', ], 'serviceIdentifier' => 'comprehendmedical', ], 'compute-optimizer-automation' => [ 'namespace' => 'ComputeOptimizerAutomation', 'versions' => [ 'latest' => '2025-09-22', '2025-09-22' => '2025-09-22', ], 'serviceIdentifier' => 'compute_optimizer_automation', ], 'compute-optimizer' => [ 'namespace' => 'ComputeOptimizer', 'versions' => [ 'latest' => '2019-11-01', '2019-11-01' => '2019-11-01', ], 'serviceIdentifier' => 'compute_optimizer', ], 'config' => [ 'namespace' => 'ConfigService', 'versions' => [ 'latest' => '2014-11-12', '2014-11-12' => '2014-11-12', ], 'serviceIdentifier' => 'config_service', ], 'connect-contact-lens' => [ 'namespace' => 'ConnectContactLens', 'versions' => [ 'latest' => '2020-08-21', '2020-08-21' => '2020-08-21', ], 'serviceIdentifier' => 'connect_contact_lens', ], 'connect' => [ 'namespace' => 'Connect', 'versions' => [ 'latest' => '2017-08-08', '2017-08-08' => '2017-08-08', ], 'serviceIdentifier' => 'connect', ], 'connectcampaigns' => [ 'namespace' => 'ConnectCampaignService', 'versions' => [ 'latest' => '2021-01-30', '2021-01-30' => '2021-01-30', ], 'serviceIdentifier' => 'connectcampaigns', ], 'connectcampaignsv2' => [ 'namespace' => 'ConnectCampaignsV2', 'versions' => [ 'latest' => '2024-04-23', '2024-04-23' => '2024-04-23', ], 'serviceIdentifier' => 'connectcampaignsv2', ], 'connectcases' => [ 'namespace' => 'ConnectCases', 'versions' => [ 'latest' => '2022-10-03', '2022-10-03' => '2022-10-03', ], 'serviceIdentifier' => 'connectcases', ], 'connectparticipant' => [ 'namespace' => 'ConnectParticipant', 'versions' => [ 'latest' => '2018-09-07', '2018-09-07' => '2018-09-07', ], 'serviceIdentifier' => 'connectparticipant', ], 'controlcatalog' => [ 'namespace' => 'ControlCatalog', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'controlcatalog', ], 'controltower' => [ 'namespace' => 'ControlTower', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'controltower', ], 'cost-optimization-hub' => [ 'namespace' => 'CostOptimizationHub', 'versions' => [ 'latest' => '2022-07-26', '2022-07-26' => '2022-07-26', ], 'serviceIdentifier' => 'cost_optimization_hub', ], 'cur' => [ 'namespace' => 'CostandUsageReportService', 'versions' => [ 'latest' => '2017-01-06', '2017-01-06' => '2017-01-06', ], 'serviceIdentifier' => 'cost_and_usage_report_service', ], 'customer-profiles' => [ 'namespace' => 'CustomerProfiles', 'versions' => [ 'latest' => '2020-08-15', '2020-08-15' => '2020-08-15', ], 'serviceIdentifier' => 'customer_profiles', ], 'data.iot' => [ 'namespace' => 'IotDataPlane', 'versions' => [ 'latest' => '2015-05-28', '2015-05-28' => '2015-05-28', ], 'serviceIdentifier' => 'iot_data_plane', ], 'databrew' => [ 'namespace' => 'GlueDataBrew', 'versions' => [ 'latest' => '2017-07-25', '2017-07-25' => '2017-07-25', ], 'serviceIdentifier' => 'databrew', ], 'dataexchange' => [ 'namespace' => 'DataExchange', 'versions' => [ 'latest' => '2017-07-25', '2017-07-25' => '2017-07-25', ], 'serviceIdentifier' => 'dataexchange', ], 'datapipeline' => [ 'namespace' => 'DataPipeline', 'versions' => [ 'latest' => '2012-10-29', '2012-10-29' => '2012-10-29', ], 'serviceIdentifier' => 'data_pipeline', ], 'datasync' => [ 'namespace' => 'DataSync', 'versions' => [ 'latest' => '2018-11-09', '2018-11-09' => '2018-11-09', ], 'serviceIdentifier' => 'datasync', ], 'datazone' => [ 'namespace' => 'DataZone', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'datazone', ], 'dax' => [ 'namespace' => 'DAX', 'versions' => [ 'latest' => '2017-04-19', '2017-04-19' => '2017-04-19', ], 'serviceIdentifier' => 'dax', ], 'deadline' => [ 'namespace' => 'Deadline', 'versions' => [ 'latest' => '2023-10-12', '2023-10-12' => '2023-10-12', ], 'serviceIdentifier' => 'deadline', ], 'detective' => [ 'namespace' => 'Detective', 'versions' => [ 'latest' => '2018-10-26', '2018-10-26' => '2018-10-26', ], 'serviceIdentifier' => 'detective', ], 'devicefarm' => [ 'namespace' => 'DeviceFarm', 'versions' => [ 'latest' => '2015-06-23', '2015-06-23' => '2015-06-23', ], 'serviceIdentifier' => 'device_farm', ], 'devops-guru' => [ 'namespace' => 'DevOpsGuru', 'versions' => [ 'latest' => '2020-12-01', '2020-12-01' => '2020-12-01', ], 'serviceIdentifier' => 'devops_guru', ], 'directconnect' => [ 'namespace' => 'DirectConnect', 'versions' => [ 'latest' => '2012-10-25', '2012-10-25' => '2012-10-25', ], 'serviceIdentifier' => 'direct_connect', ], 'directory-service-data' => [ 'namespace' => 'DirectoryServiceData', 'versions' => [ 'latest' => '2023-05-31', '2023-05-31' => '2023-05-31', ], 'serviceIdentifier' => 'directory_service_data', ], 'discovery' => [ 'namespace' => 'ApplicationDiscoveryService', 'versions' => [ 'latest' => '2015-11-01', '2015-11-01' => '2015-11-01', ], 'serviceIdentifier' => 'application_discovery_service', ], 'dlm' => [ 'namespace' => 'DLM', 'versions' => [ 'latest' => '2018-01-12', '2018-01-12' => '2018-01-12', ], 'serviceIdentifier' => 'dlm', ], 'dms' => [ 'namespace' => 'DatabaseMigrationService', 'versions' => [ 'latest' => '2016-01-01', '2016-01-01' => '2016-01-01', ], 'serviceIdentifier' => 'database_migration_service', ], 'docdb-elastic' => [ 'namespace' => 'DocDBElastic', 'versions' => [ 'latest' => '2022-11-28', '2022-11-28' => '2022-11-28', ], 'serviceIdentifier' => 'docdb_elastic', ], 'docdb' => [ 'namespace' => 'DocDB', 'versions' => [ 'latest' => '2014-10-31', '2014-10-31' => '2014-10-31', ], 'serviceIdentifier' => 'docdb', ], 'drs' => [ 'namespace' => 'drs', 'versions' => [ 'latest' => '2020-02-26', '2020-02-26' => '2020-02-26', ], 'serviceIdentifier' => 'drs', ], 'ds' => [ 'namespace' => 'DirectoryService', 'versions' => [ 'latest' => '2015-04-16', '2015-04-16' => '2015-04-16', ], 'serviceIdentifier' => 'directory_service', ], 'dsql' => [ 'namespace' => 'DSQL', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'dsql', ], 'dynamodb' => [ 'namespace' => 'DynamoDb', 'versions' => [ 'latest' => '2012-08-10', '2012-08-10' => '2012-08-10', '2011-12-05' => '2011-12-05', ], 'serviceIdentifier' => 'dynamodb', ], 'ebs' => [ 'namespace' => 'EBS', 'versions' => [ 'latest' => '2019-11-02', '2019-11-02' => '2019-11-02', ], 'serviceIdentifier' => 'ebs', ], 'ec2-instance-connect' => [ 'namespace' => 'EC2InstanceConnect', 'versions' => [ 'latest' => '2018-04-02', '2018-04-02' => '2018-04-02', ], 'serviceIdentifier' => 'ec2_instance_connect', ], 'ec2' => [ 'namespace' => 'Ec2', 'versions' => [ 'latest' => '2016-11-15', '2016-11-15' => '2016-11-15', '2016-09-15' => '2016-09-15', '2016-04-01' => '2016-04-01', '2015-10-01' => '2015-10-01', '2015-04-15' => '2016-11-15', ], 'serviceIdentifier' => 'ec2', ], 'ecr-public' => [ 'namespace' => 'ECRPublic', 'versions' => [ 'latest' => '2020-10-30', '2020-10-30' => '2020-10-30', ], 'serviceIdentifier' => 'ecr_public', ], 'ecr' => [ 'namespace' => 'Ecr', 'versions' => [ 'latest' => '2015-09-21', '2015-09-21' => '2015-09-21', ], 'serviceIdentifier' => 'ecr', ], 'ecs' => [ 'namespace' => 'Ecs', 'versions' => [ 'latest' => '2014-11-13', '2014-11-13' => '2014-11-13', ], 'serviceIdentifier' => 'ecs', ], 'eks-auth' => [ 'namespace' => 'EKSAuth', 'versions' => [ 'latest' => '2023-11-26', '2023-11-26' => '2023-11-26', ], 'serviceIdentifier' => 'eks_auth', ], 'eks' => [ 'namespace' => 'EKS', 'versions' => [ 'latest' => '2017-11-01', '2017-11-01' => '2017-11-01', ], 'serviceIdentifier' => 'eks', ], 'elasticache' => [ 'namespace' => 'ElastiCache', 'versions' => [ 'latest' => '2015-02-02', '2015-02-02' => '2015-02-02', ], 'serviceIdentifier' => 'elasticache', ], 'elasticbeanstalk' => [ 'namespace' => 'ElasticBeanstalk', 'versions' => [ 'latest' => '2010-12-01', '2010-12-01' => '2010-12-01', ], 'serviceIdentifier' => 'elastic_beanstalk', ], 'elasticfilesystem' => [ 'namespace' => 'Efs', 'versions' => [ 'latest' => '2015-02-01', '2015-02-01' => '2015-02-01', ], 'serviceIdentifier' => 'efs', ], 'elasticloadbalancing' => [ 'namespace' => 'ElasticLoadBalancing', 'versions' => [ 'latest' => '2012-06-01', '2012-06-01' => '2012-06-01', ], 'serviceIdentifier' => 'elastic_load_balancing', ], 'elasticloadbalancingv2' => [ 'namespace' => 'ElasticLoadBalancingV2', 'versions' => [ 'latest' => '2015-12-01', '2015-12-01' => '2015-12-01', ], 'serviceIdentifier' => 'elastic_load_balancing_v2', ], 'elasticmapreduce' => [ 'namespace' => 'Emr', 'versions' => [ 'latest' => '2009-03-31', '2009-03-31' => '2009-03-31', ], 'serviceIdentifier' => 'emr', ], 'elastictranscoder' => [ 'namespace' => 'ElasticTranscoder', 'versions' => [ 'latest' => '2012-09-25', '2012-09-25' => '2012-09-25', ], 'serviceIdentifier' => 'elastic_transcoder', ], 'email' => [ 'namespace' => 'Ses', 'versions' => [ 'latest' => '2010-12-01', '2010-12-01' => '2010-12-01', ], 'serviceIdentifier' => 'ses', ], 'emr-containers' => [ 'namespace' => 'EMRContainers', 'versions' => [ 'latest' => '2020-10-01', '2020-10-01' => '2020-10-01', ], 'serviceIdentifier' => 'emr_containers', ], 'emr-serverless' => [ 'namespace' => 'EMRServerless', 'versions' => [ 'latest' => '2021-07-13', '2021-07-13' => '2021-07-13', ], 'serviceIdentifier' => 'emr_serverless', ], 'entitlement.marketplace' => [ 'namespace' => 'MarketplaceEntitlementService', 'versions' => [ 'latest' => '2017-01-11', '2017-01-11' => '2017-01-11', ], 'serviceIdentifier' => 'marketplace_entitlement_service', ], 'entityresolution' => [ 'namespace' => 'EntityResolution', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'entityresolution', ], 'es' => [ 'namespace' => 'ElasticsearchService', 'versions' => [ 'latest' => '2015-01-01', '2015-01-01' => '2015-01-01', ], 'serviceIdentifier' => 'elasticsearch_service', ], 'eventbridge' => [ 'namespace' => 'EventBridge', 'versions' => [ 'latest' => '2015-10-07', '2015-10-07' => '2015-10-07', ], 'serviceIdentifier' => 'eventbridge', ], 'events' => [ 'namespace' => 'CloudWatchEvents', 'versions' => [ 'latest' => '2015-10-07', '2015-10-07' => '2015-10-07', '2014-02-03' => '2015-10-07', ], 'serviceIdentifier' => 'cloudwatch_events', ], 'evidently' => [ 'namespace' => 'CloudWatchEvidently', 'versions' => [ 'latest' => '2021-02-01', '2021-02-01' => '2021-02-01', ], 'serviceIdentifier' => 'evidently', ], 'evs' => [ 'namespace' => 'Evs', 'versions' => [ 'latest' => '2023-07-27', '2023-07-27' => '2023-07-27', ], 'serviceIdentifier' => 'evs', ], 'finspace-data' => [ 'namespace' => 'FinSpaceData', 'versions' => [ 'latest' => '2020-07-13', '2020-07-13' => '2020-07-13', ], 'serviceIdentifier' => 'finspace_data', ], 'finspace' => [ 'namespace' => 'finspace', 'versions' => [ 'latest' => '2021-03-12', '2021-03-12' => '2021-03-12', ], 'serviceIdentifier' => 'finspace', ], 'firehose' => [ 'namespace' => 'Firehose', 'versions' => [ 'latest' => '2015-08-04', '2015-08-04' => '2015-08-04', ], 'serviceIdentifier' => 'firehose', ], 'fis' => [ 'namespace' => 'FIS', 'versions' => [ 'latest' => '2020-12-01', '2020-12-01' => '2020-12-01', ], 'serviceIdentifier' => 'fis', ], 'fms' => [ 'namespace' => 'FMS', 'versions' => [ 'latest' => '2018-01-01', '2018-01-01' => '2018-01-01', ], 'serviceIdentifier' => 'fms', ], 'forecast' => [ 'namespace' => 'ForecastService', 'versions' => [ 'latest' => '2018-06-26', '2018-06-26' => '2018-06-26', ], 'serviceIdentifier' => 'forecast', ], 'forecastquery' => [ 'namespace' => 'ForecastQueryService', 'versions' => [ 'latest' => '2018-06-26', '2018-06-26' => '2018-06-26', ], 'serviceIdentifier' => 'forecastquery', ], 'frauddetector' => [ 'namespace' => 'FraudDetector', 'versions' => [ 'latest' => '2019-11-15', '2019-11-15' => '2019-11-15', ], 'serviceIdentifier' => 'frauddetector', ], 'freetier' => [ 'namespace' => 'FreeTier', 'versions' => [ 'latest' => '2023-09-07', '2023-09-07' => '2023-09-07', ], 'serviceIdentifier' => 'freetier', ], 'fsx' => [ 'namespace' => 'FSx', 'versions' => [ 'latest' => '2018-03-01', '2018-03-01' => '2018-03-01', ], 'serviceIdentifier' => 'fsx', ], 'gamelift' => [ 'namespace' => 'GameLift', 'versions' => [ 'latest' => '2015-10-01', '2015-10-01' => '2015-10-01', ], 'serviceIdentifier' => 'gamelift', ], 'gameliftstreams' => [ 'namespace' => 'GameLiftStreams', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'gameliftstreams', ], 'geo-maps' => [ 'namespace' => 'GeoMaps', 'versions' => [ 'latest' => '2020-11-19', '2020-11-19' => '2020-11-19', ], 'serviceIdentifier' => 'geo_maps', ], 'geo-places' => [ 'namespace' => 'GeoPlaces', 'versions' => [ 'latest' => '2020-11-19', '2020-11-19' => '2020-11-19', ], 'serviceIdentifier' => 'geo_places', ], 'geo-routes' => [ 'namespace' => 'GeoRoutes', 'versions' => [ 'latest' => '2020-11-19', '2020-11-19' => '2020-11-19', ], 'serviceIdentifier' => 'geo_routes', ], 'glacier' => [ 'namespace' => 'Glacier', 'versions' => [ 'latest' => '2012-06-01', '2012-06-01' => '2012-06-01', ], 'serviceIdentifier' => 'glacier', ], 'globalaccelerator' => [ 'namespace' => 'GlobalAccelerator', 'versions' => [ 'latest' => '2018-08-08', '2018-08-08' => '2018-08-08', ], 'serviceIdentifier' => 'global_accelerator', ], 'glue' => [ 'namespace' => 'Glue', 'versions' => [ 'latest' => '2017-03-31', '2017-03-31' => '2017-03-31', ], 'serviceIdentifier' => 'glue', ], 'grafana' => [ 'namespace' => 'ManagedGrafana', 'versions' => [ 'latest' => '2020-08-18', '2020-08-18' => '2020-08-18', ], 'serviceIdentifier' => 'grafana', ], 'greengrass' => [ 'namespace' => 'Greengrass', 'versions' => [ 'latest' => '2017-06-07', '2017-06-07' => '2017-06-07', ], 'serviceIdentifier' => 'greengrass', ], 'greengrassv2' => [ 'namespace' => 'GreengrassV2', 'versions' => [ 'latest' => '2020-11-30', '2020-11-30' => '2020-11-30', ], 'serviceIdentifier' => 'greengrassv2', ], 'groundstation' => [ 'namespace' => 'GroundStation', 'versions' => [ 'latest' => '2019-05-23', '2019-05-23' => '2019-05-23', ], 'serviceIdentifier' => 'groundstation', ], 'guardduty' => [ 'namespace' => 'GuardDuty', 'versions' => [ 'latest' => '2017-11-28', '2017-11-28' => '2017-11-28', ], 'serviceIdentifier' => 'guardduty', ], 'health' => [ 'namespace' => 'Health', 'versions' => [ 'latest' => '2016-08-04', '2016-08-04' => '2016-08-04', ], 'serviceIdentifier' => 'health', ], 'healthlake' => [ 'namespace' => 'HealthLake', 'versions' => [ 'latest' => '2017-07-01', '2017-07-01' => '2017-07-01', ], 'serviceIdentifier' => 'healthlake', ], 'iam' => [ 'namespace' => 'Iam', 'versions' => [ 'latest' => '2010-05-08', '2010-05-08' => '2010-05-08', ], 'serviceIdentifier' => 'iam', ], 'identitystore' => [ 'namespace' => 'IdentityStore', 'versions' => [ 'latest' => '2020-06-15', '2020-06-15' => '2020-06-15', ], 'serviceIdentifier' => 'identitystore', ], 'imagebuilder' => [ 'namespace' => 'imagebuilder', 'versions' => [ 'latest' => '2019-12-02', '2019-12-02' => '2019-12-02', ], 'serviceIdentifier' => 'imagebuilder', ], 'importexport' => [ 'namespace' => 'ImportExport', 'versions' => [ 'latest' => '2010-06-01', '2010-06-01' => '2010-06-01', ], 'serviceIdentifier' => 'importexport', ], 'inspector-scan' => [ 'namespace' => 'InspectorScan', 'versions' => [ 'latest' => '2023-08-08', '2023-08-08' => '2023-08-08', ], 'serviceIdentifier' => 'inspector_scan', ], 'inspector' => [ 'namespace' => 'Inspector', 'versions' => [ 'latest' => '2016-02-16', '2016-02-16' => '2016-02-16', '2015-08-18' => '2016-02-16', ], 'serviceIdentifier' => 'inspector', ], 'inspector2' => [ 'namespace' => 'Inspector2', 'versions' => [ 'latest' => '2020-06-08', '2020-06-08' => '2020-06-08', ], 'serviceIdentifier' => 'inspector2', ], 'internetmonitor' => [ 'namespace' => 'InternetMonitor', 'versions' => [ 'latest' => '2021-06-03', '2021-06-03' => '2021-06-03', ], 'serviceIdentifier' => 'internetmonitor', ], 'invoicing' => [ 'namespace' => 'Invoicing', 'versions' => [ 'latest' => '2024-12-01', '2024-12-01' => '2024-12-01', ], 'serviceIdentifier' => 'invoicing', ], 'iot-jobs-data' => [ 'namespace' => 'IoTJobsDataPlane', 'versions' => [ 'latest' => '2017-09-29', '2017-09-29' => '2017-09-29', ], 'serviceIdentifier' => 'iot_jobs_data_plane', ], 'iot-managed-integrations' => [ 'namespace' => 'IoTManagedIntegrations', 'versions' => [ 'latest' => '2025-03-03', '2025-03-03' => '2025-03-03', ], 'serviceIdentifier' => 'iot_managed_integrations', ], 'iot' => [ 'namespace' => 'Iot', 'versions' => [ 'latest' => '2015-05-28', '2015-05-28' => '2015-05-28', ], 'serviceIdentifier' => 'iot', ], 'iotanalytics' => [ 'namespace' => 'IoTAnalytics', 'versions' => [ 'latest' => '2017-11-27', '2017-11-27' => '2017-11-27', ], 'serviceIdentifier' => 'iotanalytics', ], 'iotdeviceadvisor' => [ 'namespace' => 'IoTDeviceAdvisor', 'versions' => [ 'latest' => '2020-09-18', '2020-09-18' => '2020-09-18', ], 'serviceIdentifier' => 'iotdeviceadvisor', ], 'iotevents-data' => [ 'namespace' => 'IoTEventsData', 'versions' => [ 'latest' => '2018-10-23', '2018-10-23' => '2018-10-23', ], 'serviceIdentifier' => 'iot_events_data', ], 'iotevents' => [ 'namespace' => 'IoTEvents', 'versions' => [ 'latest' => '2018-07-27', '2018-07-27' => '2018-07-27', ], 'serviceIdentifier' => 'iot_events', ], 'iotfleetwise' => [ 'namespace' => 'IoTFleetWise', 'versions' => [ 'latest' => '2021-06-17', '2021-06-17' => '2021-06-17', ], 'serviceIdentifier' => 'iotfleetwise', ], 'iotsecuretunneling' => [ 'namespace' => 'IoTSecureTunneling', 'versions' => [ 'latest' => '2018-10-05', '2018-10-05' => '2018-10-05', ], 'serviceIdentifier' => 'iotsecuretunneling', ], 'iotsitewise' => [ 'namespace' => 'IoTSiteWise', 'versions' => [ 'latest' => '2019-12-02', '2019-12-02' => '2019-12-02', ], 'serviceIdentifier' => 'iotsitewise', ], 'iotthingsgraph' => [ 'namespace' => 'IoTThingsGraph', 'versions' => [ 'latest' => '2018-09-06', '2018-09-06' => '2018-09-06', ], 'serviceIdentifier' => 'iotthingsgraph', ], 'iottwinmaker' => [ 'namespace' => 'IoTTwinMaker', 'versions' => [ 'latest' => '2021-11-29', '2021-11-29' => '2021-11-29', ], 'serviceIdentifier' => 'iottwinmaker', ], 'iotwireless' => [ 'namespace' => 'IoTWireless', 'versions' => [ 'latest' => '2020-11-22', '2020-11-22' => '2020-11-22', ], 'serviceIdentifier' => 'iot_wireless', ], 'ivs-realtime' => [ 'namespace' => 'IVSRealTime', 'versions' => [ 'latest' => '2020-07-14', '2020-07-14' => '2020-07-14', ], 'serviceIdentifier' => 'ivs_realtime', ], 'ivs' => [ 'namespace' => 'IVS', 'versions' => [ 'latest' => '2020-07-14', '2020-07-14' => '2020-07-14', ], 'serviceIdentifier' => 'ivs', ], 'ivschat' => [ 'namespace' => 'ivschat', 'versions' => [ 'latest' => '2020-07-14', '2020-07-14' => '2020-07-14', ], 'serviceIdentifier' => 'ivschat', ], 'kafka' => [ 'namespace' => 'Kafka', 'versions' => [ 'latest' => '2018-11-14', '2018-11-14' => '2018-11-14', ], 'serviceIdentifier' => 'kafka', ], 'kafkaconnect' => [ 'namespace' => 'KafkaConnect', 'versions' => [ 'latest' => '2021-09-14', '2021-09-14' => '2021-09-14', ], 'serviceIdentifier' => 'kafkaconnect', ], 'kendra-ranking' => [ 'namespace' => 'KendraRanking', 'versions' => [ 'latest' => '2022-10-19', '2022-10-19' => '2022-10-19', ], 'serviceIdentifier' => 'kendra_ranking', ], 'kendra' => [ 'namespace' => 'kendra', 'versions' => [ 'latest' => '2019-02-03', '2019-02-03' => '2019-02-03', ], 'serviceIdentifier' => 'kendra', ], 'keyspaces' => [ 'namespace' => 'Keyspaces', 'versions' => [ 'latest' => '2022-02-10', '2022-02-10' => '2022-02-10', ], 'serviceIdentifier' => 'keyspaces', ], 'keyspacesstreams' => [ 'namespace' => 'KeyspacesStreams', 'versions' => [ 'latest' => '2024-09-09', '2024-09-09' => '2024-09-09', ], 'serviceIdentifier' => 'keyspacesstreams', ], 'kinesis-video-archived-media' => [ 'namespace' => 'KinesisVideoArchivedMedia', 'versions' => [ 'latest' => '2017-09-30', '2017-09-30' => '2017-09-30', ], 'serviceIdentifier' => 'kinesis_video_archived_media', ], 'kinesis-video-media' => [ 'namespace' => 'KinesisVideoMedia', 'versions' => [ 'latest' => '2017-09-30', '2017-09-30' => '2017-09-30', ], 'serviceIdentifier' => 'kinesis_video_media', ], 'kinesis-video-signaling' => [ 'namespace' => 'KinesisVideoSignalingChannels', 'versions' => [ 'latest' => '2019-12-04', '2019-12-04' => '2019-12-04', ], 'serviceIdentifier' => 'kinesis_video_signaling', ], 'kinesis-video-webrtc-storage' => [ 'namespace' => 'KinesisVideoWebRTCStorage', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'kinesis_video_webrtc_storage', ], 'kinesis' => [ 'namespace' => 'Kinesis', 'versions' => [ 'latest' => '2013-12-02', '2013-12-02' => '2013-12-02', ], 'serviceIdentifier' => 'kinesis', ], 'kinesisanalytics' => [ 'namespace' => 'KinesisAnalytics', 'versions' => [ 'latest' => '2015-08-14', '2015-08-14' => '2015-08-14', ], 'serviceIdentifier' => 'kinesis_analytics', ], 'kinesisanalyticsv2' => [ 'namespace' => 'KinesisAnalyticsV2', 'versions' => [ 'latest' => '2018-05-23', '2018-05-23' => '2018-05-23', ], 'serviceIdentifier' => 'kinesis_analytics_v2', ], 'kinesisvideo' => [ 'namespace' => 'KinesisVideo', 'versions' => [ 'latest' => '2017-09-30', '2017-09-30' => '2017-09-30', ], 'serviceIdentifier' => 'kinesis_video', ], 'kms' => [ 'namespace' => 'Kms', 'versions' => [ 'latest' => '2014-11-01', '2014-11-01' => '2014-11-01', ], 'serviceIdentifier' => 'kms', ], 'lakeformation' => [ 'namespace' => 'LakeFormation', 'versions' => [ 'latest' => '2017-03-31', '2017-03-31' => '2017-03-31', ], 'serviceIdentifier' => 'lakeformation', ], 'lambda' => [ 'namespace' => 'Lambda', 'versions' => [ 'latest' => '2015-03-31', '2015-03-31' => '2015-03-31', ], 'serviceIdentifier' => 'lambda', ], 'launch-wizard' => [ 'namespace' => 'LaunchWizard', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'launch_wizard', ], 'lex-models' => [ 'namespace' => 'LexModelBuildingService', 'versions' => [ 'latest' => '2017-04-19', '2017-04-19' => '2017-04-19', ], 'serviceIdentifier' => 'lex_model_building_service', ], 'license-manager-linux-subscriptions' => [ 'namespace' => 'LicenseManagerLinuxSubscriptions', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'license_manager_linux_subscriptions', ], 'license-manager-user-subscriptions' => [ 'namespace' => 'LicenseManagerUserSubscriptions', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'license_manager_user_subscriptions', ], 'license-manager' => [ 'namespace' => 'LicenseManager', 'versions' => [ 'latest' => '2018-08-01', '2018-08-01' => '2018-08-01', ], 'serviceIdentifier' => 'license_manager', ], 'lightsail' => [ 'namespace' => 'Lightsail', 'versions' => [ 'latest' => '2016-11-28', '2016-11-28' => '2016-11-28', ], 'serviceIdentifier' => 'lightsail', ], 'location' => [ 'namespace' => 'LocationService', 'versions' => [ 'latest' => '2020-11-19', '2020-11-19' => '2020-11-19', ], 'serviceIdentifier' => 'location', ], 'logs' => [ 'namespace' => 'CloudWatchLogs', 'versions' => [ 'latest' => '2014-03-28', '2014-03-28' => '2014-03-28', ], 'serviceIdentifier' => 'cloudwatch_logs', ], 'lookoutequipment' => [ 'namespace' => 'LookoutEquipment', 'versions' => [ 'latest' => '2020-12-15', '2020-12-15' => '2020-12-15', ], 'serviceIdentifier' => 'lookoutequipment', ], 'm2' => [ 'namespace' => 'MainframeModernization', 'versions' => [ 'latest' => '2021-04-28', '2021-04-28' => '2021-04-28', ], 'serviceIdentifier' => 'm2', ], 'machinelearning' => [ 'namespace' => 'MachineLearning', 'versions' => [ 'latest' => '2014-12-12', '2014-12-12' => '2014-12-12', ], 'serviceIdentifier' => 'machine_learning', ], 'macie2' => [ 'namespace' => 'Macie2', 'versions' => [ 'latest' => '2020-01-01', '2020-01-01' => '2020-01-01', ], 'serviceIdentifier' => 'macie2', ], 'mailmanager' => [ 'namespace' => 'MailManager', 'versions' => [ 'latest' => '2023-10-17', '2023-10-17' => '2023-10-17', ], 'serviceIdentifier' => 'mailmanager', ], 'managedblockchain-query' => [ 'namespace' => 'ManagedBlockchainQuery', 'versions' => [ 'latest' => '2023-05-04', '2023-05-04' => '2023-05-04', ], 'serviceIdentifier' => 'managedblockchain_query', ], 'managedblockchain' => [ 'namespace' => 'ManagedBlockchain', 'versions' => [ 'latest' => '2018-09-24', '2018-09-24' => '2018-09-24', ], 'serviceIdentifier' => 'managedblockchain', ], 'marketplace-agreement' => [ 'namespace' => 'MarketplaceAgreement', 'versions' => [ 'latest' => '2020-03-01', '2020-03-01' => '2020-03-01', ], 'serviceIdentifier' => 'marketplace_agreement', ], 'marketplace-catalog' => [ 'namespace' => 'MarketplaceCatalog', 'versions' => [ 'latest' => '2018-09-17', '2018-09-17' => '2018-09-17', ], 'serviceIdentifier' => 'marketplace_catalog', ], 'marketplace-deployment' => [ 'namespace' => 'MarketplaceDeployment', 'versions' => [ 'latest' => '2023-01-25', '2023-01-25' => '2023-01-25', ], 'serviceIdentifier' => 'marketplace_deployment', ], 'marketplace-reporting' => [ 'namespace' => 'MarketplaceReporting', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'marketplace_reporting', ], 'marketplacecommerceanalytics' => [ 'namespace' => 'MarketplaceCommerceAnalytics', 'versions' => [ 'latest' => '2015-07-01', '2015-07-01' => '2015-07-01', ], 'serviceIdentifier' => 'marketplace_commerce_analytics', ], 'mediaconnect' => [ 'namespace' => 'MediaConnect', 'versions' => [ 'latest' => '2018-11-14', '2018-11-14' => '2018-11-14', ], 'serviceIdentifier' => 'mediaconnect', ], 'mediaconvert' => [ 'namespace' => 'MediaConvert', 'versions' => [ 'latest' => '2017-08-29', '2017-08-29' => '2017-08-29', ], 'serviceIdentifier' => 'mediaconvert', ], 'medialive' => [ 'namespace' => 'MediaLive', 'versions' => [ 'latest' => '2017-10-14', '2017-10-14' => '2017-10-14', ], 'serviceIdentifier' => 'medialive', ], 'mediapackage-vod' => [ 'namespace' => 'MediaPackageVod', 'versions' => [ 'latest' => '2018-11-07', '2018-11-07' => '2018-11-07', ], 'serviceIdentifier' => 'mediapackage_vod', ], 'mediapackage' => [ 'namespace' => 'MediaPackage', 'versions' => [ 'latest' => '2017-10-12', '2017-10-12' => '2017-10-12', ], 'serviceIdentifier' => 'mediapackage', ], 'mediapackagev2' => [ 'namespace' => 'MediaPackageV2', 'versions' => [ 'latest' => '2022-12-25', '2022-12-25' => '2022-12-25', ], 'serviceIdentifier' => 'mediapackagev2', ], 'mediastore-data' => [ 'namespace' => 'MediaStoreData', 'versions' => [ 'latest' => '2017-09-01', '2017-09-01' => '2017-09-01', ], 'serviceIdentifier' => 'mediastore_data', ], 'mediastore' => [ 'namespace' => 'MediaStore', 'versions' => [ 'latest' => '2017-09-01', '2017-09-01' => '2017-09-01', ], 'serviceIdentifier' => 'mediastore', ], 'mediatailor' => [ 'namespace' => 'MediaTailor', 'versions' => [ 'latest' => '2018-04-23', '2018-04-23' => '2018-04-23', ], 'serviceIdentifier' => 'mediatailor', ], 'medical-imaging' => [ 'namespace' => 'MedicalImaging', 'versions' => [ 'latest' => '2023-07-19', '2023-07-19' => '2023-07-19', ], 'serviceIdentifier' => 'medical_imaging', ], 'memorydb' => [ 'namespace' => 'MemoryDB', 'versions' => [ 'latest' => '2021-01-01', '2021-01-01' => '2021-01-01', ], 'serviceIdentifier' => 'memorydb', ], 'metering.marketplace' => [ 'namespace' => 'MarketplaceMetering', 'versions' => [ 'latest' => '2016-01-14', '2016-01-14' => '2016-01-14', ], 'serviceIdentifier' => 'marketplace_metering', ], 'mgh' => [ 'namespace' => 'MigrationHub', 'versions' => [ 'latest' => '2017-05-31', '2017-05-31' => '2017-05-31', ], 'serviceIdentifier' => 'migration_hub', ], 'mgn' => [ 'namespace' => 'mgn', 'versions' => [ 'latest' => '2020-02-26', '2020-02-26' => '2020-02-26', ], 'serviceIdentifier' => 'mgn', ], 'migration-hub-refactor-spaces' => [ 'namespace' => 'MigrationHubRefactorSpaces', 'versions' => [ 'latest' => '2021-10-26', '2021-10-26' => '2021-10-26', ], 'serviceIdentifier' => 'migration_hub_refactor_spaces', ], 'migrationhub-config' => [ 'namespace' => 'MigrationHubConfig', 'versions' => [ 'latest' => '2019-06-30', '2019-06-30' => '2019-06-30', ], 'serviceIdentifier' => 'migrationhub_config', ], 'migrationhuborchestrator' => [ 'namespace' => 'MigrationHubOrchestrator', 'versions' => [ 'latest' => '2021-08-28', '2021-08-28' => '2021-08-28', ], 'serviceIdentifier' => 'migrationhuborchestrator', ], 'migrationhubstrategy' => [ 'namespace' => 'MigrationHubStrategyRecommendations', 'versions' => [ 'latest' => '2020-02-19', '2020-02-19' => '2020-02-19', ], 'serviceIdentifier' => 'migrationhubstrategy', ], 'models.lex.v2' => [ 'namespace' => 'LexModelsV2', 'versions' => [ 'latest' => '2020-08-07', '2020-08-07' => '2020-08-07', ], 'serviceIdentifier' => 'lex_models_v2', ], 'monitoring' => [ 'namespace' => 'CloudWatch', 'versions' => [ 'latest' => '2010-08-01', '2010-08-01' => '2010-08-01', ], 'serviceIdentifier' => 'cloudwatch', ], 'mpa' => [ 'namespace' => 'MPA', 'versions' => [ 'latest' => '2022-07-26', '2022-07-26' => '2022-07-26', ], 'serviceIdentifier' => 'mpa', ], 'mq' => [ 'namespace' => 'MQ', 'versions' => [ 'latest' => '2017-11-27', '2017-11-27' => '2017-11-27', ], 'serviceIdentifier' => 'mq', ], 'mturk-requester' => [ 'namespace' => 'MTurk', 'versions' => [ 'latest' => '2017-01-17', '2017-01-17' => '2017-01-17', ], 'serviceIdentifier' => 'mturk', ], 'mwaa-serverless' => [ 'namespace' => 'MWAAServerless', 'versions' => [ 'latest' => '2024-07-26', '2024-07-26' => '2024-07-26', ], 'serviceIdentifier' => 'mwaa_serverless', ], 'mwaa' => [ 'namespace' => 'MWAA', 'versions' => [ 'latest' => '2020-07-01', '2020-07-01' => '2020-07-01', ], 'serviceIdentifier' => 'mwaa', ], 'neptune-graph' => [ 'namespace' => 'NeptuneGraph', 'versions' => [ 'latest' => '2023-11-29', '2023-11-29' => '2023-11-29', ], 'serviceIdentifier' => 'neptune_graph', ], 'neptune' => [ 'namespace' => 'Neptune', 'versions' => [ 'latest' => '2014-10-31', '2014-10-31' => '2014-10-31', ], 'serviceIdentifier' => 'neptune', ], 'neptunedata' => [ 'namespace' => 'Neptunedata', 'versions' => [ 'latest' => '2023-08-01', '2023-08-01' => '2023-08-01', ], 'serviceIdentifier' => 'neptunedata', ], 'network-firewall' => [ 'namespace' => 'NetworkFirewall', 'versions' => [ 'latest' => '2020-11-12', '2020-11-12' => '2020-11-12', ], 'serviceIdentifier' => 'network_firewall', ], 'networkflowmonitor' => [ 'namespace' => 'NetworkFlowMonitor', 'versions' => [ 'latest' => '2023-04-19', '2023-04-19' => '2023-04-19', ], 'serviceIdentifier' => 'networkflowmonitor', ], 'networkmanager' => [ 'namespace' => 'NetworkManager', 'versions' => [ 'latest' => '2019-07-05', '2019-07-05' => '2019-07-05', ], 'serviceIdentifier' => 'networkmanager', ], 'networkmonitor' => [ 'namespace' => 'NetworkMonitor', 'versions' => [ 'latest' => '2023-08-01', '2023-08-01' => '2023-08-01', ], 'serviceIdentifier' => 'networkmonitor', ], 'notifications' => [ 'namespace' => 'Notifications', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'notifications', ], 'notificationscontacts' => [ 'namespace' => 'NotificationsContacts', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'notificationscontacts', ], 'oam' => [ 'namespace' => 'OAM', 'versions' => [ 'latest' => '2022-06-10', '2022-06-10' => '2022-06-10', ], 'serviceIdentifier' => 'oam', ], 'observabilityadmin' => [ 'namespace' => 'ObservabilityAdmin', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'observabilityadmin', ], 'odb' => [ 'namespace' => 'Odb', 'versions' => [ 'latest' => '2024-08-20', '2024-08-20' => '2024-08-20', ], 'serviceIdentifier' => 'odb', ], 'omics' => [ 'namespace' => 'Omics', 'versions' => [ 'latest' => '2022-11-28', '2022-11-28' => '2022-11-28', ], 'serviceIdentifier' => 'omics', ], 'opensearch' => [ 'namespace' => 'OpenSearchService', 'versions' => [ 'latest' => '2021-01-01', '2021-01-01' => '2021-01-01', ], 'serviceIdentifier' => 'opensearch', ], 'opensearchserverless' => [ 'namespace' => 'OpenSearchServerless', 'versions' => [ 'latest' => '2021-11-01', '2021-11-01' => '2021-11-01', ], 'serviceIdentifier' => 'opensearchserverless', ], 'organizations' => [ 'namespace' => 'Organizations', 'versions' => [ 'latest' => '2016-11-28', '2016-11-28' => '2016-11-28', ], 'serviceIdentifier' => 'organizations', ], 'osis' => [ 'namespace' => 'OSIS', 'versions' => [ 'latest' => '2022-01-01', '2022-01-01' => '2022-01-01', ], 'serviceIdentifier' => 'osis', ], 'outposts' => [ 'namespace' => 'Outposts', 'versions' => [ 'latest' => '2019-12-03', '2019-12-03' => '2019-12-03', ], 'serviceIdentifier' => 'outposts', ], 'panorama' => [ 'namespace' => 'Panorama', 'versions' => [ 'latest' => '2019-07-24', '2019-07-24' => '2019-07-24', ], 'serviceIdentifier' => 'panorama', ], 'partnercentral-channel' => [ 'namespace' => 'PartnerCentralChannel', 'versions' => [ 'latest' => '2024-03-18', '2024-03-18' => '2024-03-18', ], 'serviceIdentifier' => 'partnercentral_channel', ], 'partnercentral-selling' => [ 'namespace' => 'PartnerCentralSelling', 'versions' => [ 'latest' => '2022-07-26', '2022-07-26' => '2022-07-26', ], 'serviceIdentifier' => 'partnercentral_selling', ], 'payment-cryptography-data' => [ 'namespace' => 'PaymentCryptographyData', 'versions' => [ 'latest' => '2022-02-03', '2022-02-03' => '2022-02-03', ], 'serviceIdentifier' => 'payment_cryptography_data', ], 'payment-cryptography' => [ 'namespace' => 'PaymentCryptography', 'versions' => [ 'latest' => '2021-09-14', '2021-09-14' => '2021-09-14', ], 'serviceIdentifier' => 'payment_cryptography', ], 'pca-connector-ad' => [ 'namespace' => 'PcaConnectorAd', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'pca_connector_ad', ], 'pca-connector-scep' => [ 'namespace' => 'PcaConnectorScep', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'pca_connector_scep', ], 'pcs' => [ 'namespace' => 'PCS', 'versions' => [ 'latest' => '2023-02-10', '2023-02-10' => '2023-02-10', ], 'serviceIdentifier' => 'pcs', ], 'personalize-events' => [ 'namespace' => 'PersonalizeEvents', 'versions' => [ 'latest' => '2018-03-22', '2018-03-22' => '2018-03-22', ], 'serviceIdentifier' => 'personalize_events', ], 'personalize-runtime' => [ 'namespace' => 'PersonalizeRuntime', 'versions' => [ 'latest' => '2018-05-22', '2018-05-22' => '2018-05-22', ], 'serviceIdentifier' => 'personalize_runtime', ], 'personalize' => [ 'namespace' => 'Personalize', 'versions' => [ 'latest' => '2018-05-22', '2018-05-22' => '2018-05-22', ], 'serviceIdentifier' => 'personalize', ], 'pi' => [ 'namespace' => 'PI', 'versions' => [ 'latest' => '2018-02-27', '2018-02-27' => '2018-02-27', ], 'serviceIdentifier' => 'pi', ], 'pinpoint-email' => [ 'namespace' => 'PinpointEmail', 'versions' => [ 'latest' => '2018-07-26', '2018-07-26' => '2018-07-26', ], 'serviceIdentifier' => 'pinpoint_email', ], 'pinpoint-sms-voice-v2' => [ 'namespace' => 'PinpointSMSVoiceV2', 'versions' => [ 'latest' => '2022-03-31', '2022-03-31' => '2022-03-31', ], 'serviceIdentifier' => 'pinpoint_sms_voice_v2', ], 'pinpoint' => [ 'namespace' => 'Pinpoint', 'versions' => [ 'latest' => '2016-12-01', '2016-12-01' => '2016-12-01', ], 'serviceIdentifier' => 'pinpoint', ], 'pipes' => [ 'namespace' => 'Pipes', 'versions' => [ 'latest' => '2015-10-07', '2015-10-07' => '2015-10-07', ], 'serviceIdentifier' => 'pipes', ], 'polly' => [ 'namespace' => 'Polly', 'versions' => [ 'latest' => '2016-06-10', '2016-06-10' => '2016-06-10', ], 'serviceIdentifier' => 'polly', ], 'pricing' => [ 'namespace' => 'Pricing', 'versions' => [ 'latest' => '2017-10-15', '2017-10-15' => '2017-10-15', ], 'serviceIdentifier' => 'pricing', ], 'proton' => [ 'namespace' => 'Proton', 'versions' => [ 'latest' => '2020-07-20', '2020-07-20' => '2020-07-20', ], 'serviceIdentifier' => 'proton', ], 'qapps' => [ 'namespace' => 'QApps', 'versions' => [ 'latest' => '2023-11-27', '2023-11-27' => '2023-11-27', ], 'serviceIdentifier' => 'qapps', ], 'qbusiness' => [ 'namespace' => 'QBusiness', 'versions' => [ 'latest' => '2023-11-27', '2023-11-27' => '2023-11-27', ], 'serviceIdentifier' => 'qbusiness', ], 'qconnect' => [ 'namespace' => 'QConnect', 'versions' => [ 'latest' => '2020-10-19', '2020-10-19' => '2020-10-19', ], 'serviceIdentifier' => 'qconnect', ], 'quicksight' => [ 'namespace' => 'QuickSight', 'versions' => [ 'latest' => '2018-04-01', '2018-04-01' => '2018-04-01', ], 'serviceIdentifier' => 'quicksight', ], 'ram' => [ 'namespace' => 'RAM', 'versions' => [ 'latest' => '2018-01-04', '2018-01-04' => '2018-01-04', ], 'serviceIdentifier' => 'ram', ], 'rbin' => [ 'namespace' => 'RecycleBin', 'versions' => [ 'latest' => '2021-06-15', '2021-06-15' => '2021-06-15', ], 'serviceIdentifier' => 'rbin', ], 'rds-data' => [ 'namespace' => 'RDSDataService', 'versions' => [ 'latest' => '2018-08-01', '2018-08-01' => '2018-08-01', ], 'serviceIdentifier' => 'rds_data', ], 'rds' => [ 'namespace' => 'Rds', 'versions' => [ 'latest' => '2014-10-31', '2014-10-31' => '2014-10-31', '2014-09-01' => '2014-09-01', ], 'serviceIdentifier' => 'rds', ], 'redshift-data' => [ 'namespace' => 'RedshiftDataAPIService', 'versions' => [ 'latest' => '2019-12-20', '2019-12-20' => '2019-12-20', ], 'serviceIdentifier' => 'redshift_data', ], 'redshift-serverless' => [ 'namespace' => 'RedshiftServerless', 'versions' => [ 'latest' => '2021-04-21', '2021-04-21' => '2021-04-21', ], 'serviceIdentifier' => 'redshift_serverless', ], 'redshift' => [ 'namespace' => 'Redshift', 'versions' => [ 'latest' => '2012-12-01', '2012-12-01' => '2012-12-01', ], 'serviceIdentifier' => 'redshift', ], 'rekognition' => [ 'namespace' => 'Rekognition', 'versions' => [ 'latest' => '2016-06-27', '2016-06-27' => '2016-06-27', ], 'serviceIdentifier' => 'rekognition', ], 'repostspace' => [ 'namespace' => 'Repostspace', 'versions' => [ 'latest' => '2022-05-13', '2022-05-13' => '2022-05-13', ], 'serviceIdentifier' => 'repostspace', ], 'resiliencehub' => [ 'namespace' => 'ResilienceHub', 'versions' => [ 'latest' => '2020-04-30', '2020-04-30' => '2020-04-30', ], 'serviceIdentifier' => 'resiliencehub', ], 'resource-explorer-2' => [ 'namespace' => 'ResourceExplorer2', 'versions' => [ 'latest' => '2022-07-28', '2022-07-28' => '2022-07-28', ], 'serviceIdentifier' => 'resource_explorer_2', ], 'resource-groups' => [ 'namespace' => 'ResourceGroups', 'versions' => [ 'latest' => '2017-11-27', '2017-11-27' => '2017-11-27', ], 'serviceIdentifier' => 'resource_groups', ], 'resourcegroupstaggingapi' => [ 'namespace' => 'ResourceGroupsTaggingAPI', 'versions' => [ 'latest' => '2017-01-26', '2017-01-26' => '2017-01-26', ], 'serviceIdentifier' => 'resource_groups_tagging_api', ], 'rolesanywhere' => [ 'namespace' => 'RolesAnywhere', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'rolesanywhere', ], 'route53-recovery-cluster' => [ 'namespace' => 'Route53RecoveryCluster', 'versions' => [ 'latest' => '2019-12-02', '2019-12-02' => '2019-12-02', ], 'serviceIdentifier' => 'route53_recovery_cluster', ], 'route53-recovery-control-config' => [ 'namespace' => 'Route53RecoveryControlConfig', 'versions' => [ 'latest' => '2020-11-02', '2020-11-02' => '2020-11-02', ], 'serviceIdentifier' => 'route53_recovery_control_config', ], 'route53-recovery-readiness' => [ 'namespace' => 'Route53RecoveryReadiness', 'versions' => [ 'latest' => '2019-12-02', '2019-12-02' => '2019-12-02', ], 'serviceIdentifier' => 'route53_recovery_readiness', ], 'route53' => [ 'namespace' => 'Route53', 'versions' => [ 'latest' => '2013-04-01', '2013-04-01' => '2013-04-01', ], 'serviceIdentifier' => 'route_53', ], 'route53domains' => [ 'namespace' => 'Route53Domains', 'versions' => [ 'latest' => '2014-05-15', '2014-05-15' => '2014-05-15', ], 'serviceIdentifier' => 'route_53_domains', ], 'route53profiles' => [ 'namespace' => 'Route53Profiles', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'route53profiles', ], 'route53resolver' => [ 'namespace' => 'Route53Resolver', 'versions' => [ 'latest' => '2018-04-01', '2018-04-01' => '2018-04-01', ], 'serviceIdentifier' => 'route53resolver', ], 'rtbfabric' => [ 'namespace' => 'RTBFabric', 'versions' => [ 'latest' => '2023-05-15', '2023-05-15' => '2023-05-15', ], 'serviceIdentifier' => 'rtbfabric', ], 'rum' => [ 'namespace' => 'CloudWatchRUM', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'rum', ], 'runtime.lex.v2' => [ 'namespace' => 'LexRuntimeV2', 'versions' => [ 'latest' => '2020-08-07', '2020-08-07' => '2020-08-07', ], 'serviceIdentifier' => 'lex_runtime_v2', ], 'runtime.lex' => [ 'namespace' => 'LexRuntimeService', 'versions' => [ 'latest' => '2016-11-28', '2016-11-28' => '2016-11-28', ], 'serviceIdentifier' => 'lex_runtime_service', ], 'runtime.sagemaker' => [ 'namespace' => 'SageMakerRuntime', 'versions' => [ 'latest' => '2017-05-13', '2017-05-13' => '2017-05-13', ], 'serviceIdentifier' => 'sagemaker_runtime', ], 's3' => [ 'namespace' => 'S3', 'versions' => [ 'latest' => '2006-03-01', '2006-03-01' => '2006-03-01', ], 'serviceIdentifier' => 's3', ], 's3control' => [ 'namespace' => 'S3Control', 'versions' => [ 'latest' => '2018-08-20', '2018-08-20' => '2018-08-20', ], 'serviceIdentifier' => 's3_control', ], 's3outposts' => [ 'namespace' => 'S3Outposts', 'versions' => [ 'latest' => '2017-07-25', '2017-07-25' => '2017-07-25', ], 'serviceIdentifier' => 's3outposts', ], 's3tables' => [ 'namespace' => 'S3Tables', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 's3tables', ], 's3vectors' => [ 'namespace' => 'S3Vectors', 'versions' => [ 'latest' => '2025-07-15', '2025-07-15' => '2025-07-15', ], 'serviceIdentifier' => 's3vectors', ], 'sagemaker-a2i-runtime' => [ 'namespace' => 'AugmentedAIRuntime', 'versions' => [ 'latest' => '2019-11-07', '2019-11-07' => '2019-11-07', ], 'serviceIdentifier' => 'sagemaker_a2i_runtime', ], 'sagemaker-edge' => [ 'namespace' => 'SagemakerEdgeManager', 'versions' => [ 'latest' => '2020-09-23', '2020-09-23' => '2020-09-23', ], 'serviceIdentifier' => 'sagemaker_edge', ], 'sagemaker-featurestore-runtime' => [ 'namespace' => 'SageMakerFeatureStoreRuntime', 'versions' => [ 'latest' => '2020-07-01', '2020-07-01' => '2020-07-01', ], 'serviceIdentifier' => 'sagemaker_featurestore_runtime', ], 'sagemaker-geospatial' => [ 'namespace' => 'SageMakerGeospatial', 'versions' => [ 'latest' => '2020-05-27', '2020-05-27' => '2020-05-27', ], 'serviceIdentifier' => 'sagemaker_geospatial', ], 'sagemaker-metrics' => [ 'namespace' => 'SageMakerMetrics', 'versions' => [ 'latest' => '2022-09-30', '2022-09-30' => '2022-09-30', ], 'serviceIdentifier' => 'sagemaker_metrics', ], 'sagemaker' => [ 'namespace' => 'SageMaker', 'versions' => [ 'latest' => '2017-07-24', '2017-07-24' => '2017-07-24', ], 'serviceIdentifier' => 'sagemaker', ], 'savingsplans' => [ 'namespace' => 'SavingsPlans', 'versions' => [ 'latest' => '2019-06-28', '2019-06-28' => '2019-06-28', ], 'serviceIdentifier' => 'savingsplans', ], 'scheduler' => [ 'namespace' => 'Scheduler', 'versions' => [ 'latest' => '2021-06-30', '2021-06-30' => '2021-06-30', ], 'serviceIdentifier' => 'scheduler', ], 'schemas' => [ 'namespace' => 'Schemas', 'versions' => [ 'latest' => '2019-12-02', '2019-12-02' => '2019-12-02', ], 'serviceIdentifier' => 'schemas', ], 'secretsmanager' => [ 'namespace' => 'SecretsManager', 'versions' => [ 'latest' => '2017-10-17', '2017-10-17' => '2017-10-17', ], 'serviceIdentifier' => 'secrets_manager', ], 'security-ir' => [ 'namespace' => 'SecurityIR', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'security_ir', ], 'securityhub' => [ 'namespace' => 'SecurityHub', 'versions' => [ 'latest' => '2018-10-26', '2018-10-26' => '2018-10-26', ], 'serviceIdentifier' => 'securityhub', ], 'securitylake' => [ 'namespace' => 'SecurityLake', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'securitylake', ], 'serverlessrepo' => [ 'namespace' => 'ServerlessApplicationRepository', 'versions' => [ 'latest' => '2017-09-08', '2017-09-08' => '2017-09-08', ], 'serviceIdentifier' => 'serverlessapplicationrepository', ], 'service-quotas' => [ 'namespace' => 'ServiceQuotas', 'versions' => [ 'latest' => '2019-06-24', '2019-06-24' => '2019-06-24', ], 'serviceIdentifier' => 'service_quotas', ], 'servicecatalog-appregistry' => [ 'namespace' => 'AppRegistry', 'versions' => [ 'latest' => '2020-06-24', '2020-06-24' => '2020-06-24', ], 'serviceIdentifier' => 'service_catalog_appregistry', ], 'servicecatalog' => [ 'namespace' => 'ServiceCatalog', 'versions' => [ 'latest' => '2015-12-10', '2015-12-10' => '2015-12-10', ], 'serviceIdentifier' => 'service_catalog', ], 'servicediscovery' => [ 'namespace' => 'ServiceDiscovery', 'versions' => [ 'latest' => '2017-03-14', '2017-03-14' => '2017-03-14', ], 'serviceIdentifier' => 'servicediscovery', ], 'sesv2' => [ 'namespace' => 'SesV2', 'versions' => [ 'latest' => '2019-09-27', '2019-09-27' => '2019-09-27', ], 'serviceIdentifier' => 'sesv2', ], 'shield' => [ 'namespace' => 'Shield', 'versions' => [ 'latest' => '2016-06-02', '2016-06-02' => '2016-06-02', ], 'serviceIdentifier' => 'shield', ], 'signer' => [ 'namespace' => 'signer', 'versions' => [ 'latest' => '2017-08-25', '2017-08-25' => '2017-08-25', ], 'serviceIdentifier' => 'signer', ], 'signin' => [ 'namespace' => 'Signin', 'versions' => [ 'latest' => '2023-01-01', '2023-01-01' => '2023-01-01', ], 'serviceIdentifier' => 'signin', ], 'simspaceweaver' => [ 'namespace' => 'SimSpaceWeaver', 'versions' => [ 'latest' => '2022-10-28', '2022-10-28' => '2022-10-28', ], 'serviceIdentifier' => 'simspaceweaver', ], 'sms-voice' => [ 'namespace' => 'PinpointSMSVoice', 'versions' => [ 'latest' => '2018-09-05', '2018-09-05' => '2018-09-05', ], 'serviceIdentifier' => 'pinpoint_sms_voice', ], 'snow-device-management' => [ 'namespace' => 'SnowDeviceManagement', 'versions' => [ 'latest' => '2021-08-04', '2021-08-04' => '2021-08-04', ], 'serviceIdentifier' => 'snow_device_management', ], 'snowball' => [ 'namespace' => 'SnowBall', 'versions' => [ 'latest' => '2016-06-30', '2016-06-30' => '2016-06-30', ], 'serviceIdentifier' => 'snowball', ], 'sns' => [ 'namespace' => 'Sns', 'versions' => [ 'latest' => '2010-03-31', '2010-03-31' => '2010-03-31', ], 'serviceIdentifier' => 'sns', ], 'socialmessaging' => [ 'namespace' => 'SocialMessaging', 'versions' => [ 'latest' => '2024-01-01', '2024-01-01' => '2024-01-01', ], 'serviceIdentifier' => 'socialmessaging', ], 'sqs' => [ 'namespace' => 'Sqs', 'versions' => [ 'latest' => '2012-11-05', '2012-11-05' => '2012-11-05', ], 'serviceIdentifier' => 'sqs', ], 'ssm-contacts' => [ 'namespace' => 'SSMContacts', 'versions' => [ 'latest' => '2021-05-03', '2021-05-03' => '2021-05-03', ], 'serviceIdentifier' => 'ssm_contacts', ], 'ssm-guiconnect' => [ 'namespace' => 'SSMGuiConnect', 'versions' => [ 'latest' => '2021-05-01', '2021-05-01' => '2021-05-01', ], 'serviceIdentifier' => 'ssm_guiconnect', ], 'ssm-incidents' => [ 'namespace' => 'SSMIncidents', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'ssm_incidents', ], 'ssm-quicksetup' => [ 'namespace' => 'SSMQuickSetup', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'ssm_quicksetup', ], 'ssm-sap' => [ 'namespace' => 'SsmSap', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'ssm_sap', ], 'ssm' => [ 'namespace' => 'Ssm', 'versions' => [ 'latest' => '2014-11-06', '2014-11-06' => '2014-11-06', ], 'serviceIdentifier' => 'ssm', ], 'sso-admin' => [ 'namespace' => 'SSOAdmin', 'versions' => [ 'latest' => '2020-07-20', '2020-07-20' => '2020-07-20', ], 'serviceIdentifier' => 'sso_admin', ], 'sso-oidc' => [ 'namespace' => 'SSOOIDC', 'versions' => [ 'latest' => '2019-06-10', '2019-06-10' => '2019-06-10', ], 'serviceIdentifier' => 'sso_oidc', ], 'sso' => [ 'namespace' => 'SSO', 'versions' => [ 'latest' => '2019-06-10', '2019-06-10' => '2019-06-10', ], 'serviceIdentifier' => 'sso', ], 'states' => [ 'namespace' => 'Sfn', 'versions' => [ 'latest' => '2016-11-23', '2016-11-23' => '2016-11-23', ], 'serviceIdentifier' => 'sfn', ], 'storagegateway' => [ 'namespace' => 'StorageGateway', 'versions' => [ 'latest' => '2013-06-30', '2013-06-30' => '2013-06-30', ], 'serviceIdentifier' => 'storage_gateway', ], 'streams.dynamodb' => [ 'namespace' => 'DynamoDbStreams', 'versions' => [ 'latest' => '2012-08-10', '2012-08-10' => '2012-08-10', ], 'serviceIdentifier' => 'dynamodb_streams', ], 'sts' => [ 'namespace' => 'Sts', 'versions' => [ 'latest' => '2011-06-15', '2011-06-15' => '2011-06-15', ], 'serviceIdentifier' => 'sts', ], 'supplychain' => [ 'namespace' => 'SupplyChain', 'versions' => [ 'latest' => '2024-01-01', '2024-01-01' => '2024-01-01', ], 'serviceIdentifier' => 'supplychain', ], 'support-app' => [ 'namespace' => 'SupportApp', 'versions' => [ 'latest' => '2021-08-20', '2021-08-20' => '2021-08-20', ], 'serviceIdentifier' => 'support_app', ], 'support' => [ 'namespace' => 'Support', 'versions' => [ 'latest' => '2013-04-15', '2013-04-15' => '2013-04-15', ], 'serviceIdentifier' => 'support', ], 'swf' => [ 'namespace' => 'Swf', 'versions' => [ 'latest' => '2012-01-25', '2012-01-25' => '2012-01-25', ], 'serviceIdentifier' => 'swf', ], 'synthetics' => [ 'namespace' => 'Synthetics', 'versions' => [ 'latest' => '2017-10-11', '2017-10-11' => '2017-10-11', ], 'serviceIdentifier' => 'synthetics', ], 'taxsettings' => [ 'namespace' => 'TaxSettings', 'versions' => [ 'latest' => '2018-05-10', '2018-05-10' => '2018-05-10', ], 'serviceIdentifier' => 'taxsettings', ], 'textract' => [ 'namespace' => 'Textract', 'versions' => [ 'latest' => '2018-06-27', '2018-06-27' => '2018-06-27', ], 'serviceIdentifier' => 'textract', ], 'timestream-influxdb' => [ 'namespace' => 'TimestreamInfluxDB', 'versions' => [ 'latest' => '2023-01-27', '2023-01-27' => '2023-01-27', ], 'serviceIdentifier' => 'timestream_influxdb', ], 'timestream-query' => [ 'namespace' => 'TimestreamQuery', 'versions' => [ 'latest' => '2018-11-01', '2018-11-01' => '2018-11-01', ], 'serviceIdentifier' => 'timestream_query', ], 'timestream-write' => [ 'namespace' => 'TimestreamWrite', 'versions' => [ 'latest' => '2018-11-01', '2018-11-01' => '2018-11-01', ], 'serviceIdentifier' => 'timestream_write', ], 'tnb' => [ 'namespace' => 'Tnb', 'versions' => [ 'latest' => '2008-10-21', '2008-10-21' => '2008-10-21', ], 'serviceIdentifier' => 'tnb', ], 'transcribe' => [ 'namespace' => 'TranscribeService', 'versions' => [ 'latest' => '2017-10-26', '2017-10-26' => '2017-10-26', ], 'serviceIdentifier' => 'transcribe', ], 'transfer' => [ 'namespace' => 'Transfer', 'versions' => [ 'latest' => '2018-11-05', '2018-11-05' => '2018-11-05', ], 'serviceIdentifier' => 'transfer', ], 'translate' => [ 'namespace' => 'Translate', 'versions' => [ 'latest' => '2017-07-01', '2017-07-01' => '2017-07-01', ], 'serviceIdentifier' => 'translate', ], 'trustedadvisor' => [ 'namespace' => 'TrustedAdvisor', 'versions' => [ 'latest' => '2022-09-15', '2022-09-15' => '2022-09-15', ], 'serviceIdentifier' => 'trustedadvisor', ], 'verifiedpermissions' => [ 'namespace' => 'VerifiedPermissions', 'versions' => [ 'latest' => '2021-12-01', '2021-12-01' => '2021-12-01', ], 'serviceIdentifier' => 'verifiedpermissions', ], 'voice-id' => [ 'namespace' => 'VoiceID', 'versions' => [ 'latest' => '2021-09-27', '2021-09-27' => '2021-09-27', ], 'serviceIdentifier' => 'voice_id', ], 'vpc-lattice' => [ 'namespace' => 'VPCLattice', 'versions' => [ 'latest' => '2022-11-30', '2022-11-30' => '2022-11-30', ], 'serviceIdentifier' => 'vpc_lattice', ], 'waf-regional' => [ 'namespace' => 'WafRegional', 'versions' => [ 'latest' => '2016-11-28', '2016-11-28' => '2016-11-28', ], 'serviceIdentifier' => 'waf_regional', ], 'waf' => [ 'namespace' => 'Waf', 'versions' => [ 'latest' => '2015-08-24', '2015-08-24' => '2015-08-24', ], 'serviceIdentifier' => 'waf', ], 'wafv2' => [ 'namespace' => 'WAFV2', 'versions' => [ 'latest' => '2019-07-29', '2019-07-29' => '2019-07-29', ], 'serviceIdentifier' => 'wafv2', ], 'wellarchitected' => [ 'namespace' => 'WellArchitected', 'versions' => [ 'latest' => '2020-03-31', '2020-03-31' => '2020-03-31', ], 'serviceIdentifier' => 'wellarchitected', ], 'wisdom' => [ 'namespace' => 'ConnectWisdomService', 'versions' => [ 'latest' => '2020-10-19', '2020-10-19' => '2020-10-19', ], 'serviceIdentifier' => 'wisdom', ], 'workdocs' => [ 'namespace' => 'WorkDocs', 'versions' => [ 'latest' => '2016-05-01', '2016-05-01' => '2016-05-01', ], 'serviceIdentifier' => 'workdocs', ], 'workmail' => [ 'namespace' => 'WorkMail', 'versions' => [ 'latest' => '2017-10-01', '2017-10-01' => '2017-10-01', ], 'serviceIdentifier' => 'workmail', ], 'workmailmessageflow' => [ 'namespace' => 'WorkMailMessageFlow', 'versions' => [ 'latest' => '2019-05-01', '2019-05-01' => '2019-05-01', ], 'serviceIdentifier' => 'workmailmessageflow', ], 'workspaces-instances' => [ 'namespace' => 'WorkspacesInstances', 'versions' => [ 'latest' => '2022-07-26', '2022-07-26' => '2022-07-26', ], 'serviceIdentifier' => 'workspaces_instances', ], 'workspaces-thin-client' => [ 'namespace' => 'WorkSpacesThinClient', 'versions' => [ 'latest' => '2023-08-22', '2023-08-22' => '2023-08-22', ], 'serviceIdentifier' => 'workspaces_thin_client', ], 'workspaces-web' => [ 'namespace' => 'WorkSpacesWeb', 'versions' => [ 'latest' => '2020-07-08', '2020-07-08' => '2020-07-08', ], 'serviceIdentifier' => 'workspaces_web', ], 'workspaces' => [ 'namespace' => 'WorkSpaces', 'versions' => [ 'latest' => '2015-04-08', '2015-04-08' => '2015-04-08', ], 'serviceIdentifier' => 'workspaces', ], 'xray' => [ 'namespace' => 'XRay', 'versions' => [ 'latest' => '2016-04-12', '2016-04-12' => '2016-04-12', ], 'serviceIdentifier' => 'xray', ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/partitions.json.php b/vendor/aws/aws-sdk-php/src/data/partitions.json.php new file mode 100644 index 0000000..84eac1b --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/partitions.json.php @@ -0,0 +1,3 @@ + [ [ 'id' => 'aws', 'outputs' => [ 'dnsSuffix' => 'amazonaws.com', 'dualStackDnsSuffix' => 'api.aws', 'implicitGlobalRegion' => 'us-east-1', 'name' => 'aws', 'supportsDualStack' => true, 'supportsFIPS' => true, ], 'regionRegex' => '^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$', 'regions' => [ 'af-south-1' => [ 'description' => 'Africa (Cape Town)', ], 'ap-east-1' => [ 'description' => 'Asia Pacific (Hong Kong)', ], 'ap-east-2' => [ 'description' => 'Asia Pacific (Taipei)', ], 'ap-northeast-1' => [ 'description' => 'Asia Pacific (Tokyo)', ], 'ap-northeast-2' => [ 'description' => 'Asia Pacific (Seoul)', ], 'ap-northeast-3' => [ 'description' => 'Asia Pacific (Osaka)', ], 'ap-south-1' => [ 'description' => 'Asia Pacific (Mumbai)', ], 'ap-south-2' => [ 'description' => 'Asia Pacific (Hyderabad)', ], 'ap-southeast-1' => [ 'description' => 'Asia Pacific (Singapore)', ], 'ap-southeast-2' => [ 'description' => 'Asia Pacific (Sydney)', ], 'ap-southeast-3' => [ 'description' => 'Asia Pacific (Jakarta)', ], 'ap-southeast-4' => [ 'description' => 'Asia Pacific (Melbourne)', ], 'ap-southeast-5' => [ 'description' => 'Asia Pacific (Malaysia)', ], 'ap-southeast-6' => [ 'description' => 'Asia Pacific (New Zealand)', ], 'ap-southeast-7' => [ 'description' => 'Asia Pacific (Thailand)', ], 'aws-global' => [ 'description' => 'aws global region', ], 'ca-central-1' => [ 'description' => 'Canada (Central)', ], 'ca-west-1' => [ 'description' => 'Canada West (Calgary)', ], 'eu-central-1' => [ 'description' => 'Europe (Frankfurt)', ], 'eu-central-2' => [ 'description' => 'Europe (Zurich)', ], 'eu-north-1' => [ 'description' => 'Europe (Stockholm)', ], 'eu-south-1' => [ 'description' => 'Europe (Milan)', ], 'eu-south-2' => [ 'description' => 'Europe (Spain)', ], 'eu-west-1' => [ 'description' => 'Europe (Ireland)', ], 'eu-west-2' => [ 'description' => 'Europe (London)', ], 'eu-west-3' => [ 'description' => 'Europe (Paris)', ], 'il-central-1' => [ 'description' => 'Israel (Tel Aviv)', ], 'me-central-1' => [ 'description' => 'Middle East (UAE)', ], 'me-south-1' => [ 'description' => 'Middle East (Bahrain)', ], 'mx-central-1' => [ 'description' => 'Mexico (Central)', ], 'sa-east-1' => [ 'description' => 'South America (Sao Paulo)', ], 'us-east-1' => [ 'description' => 'US East (N. Virginia)', ], 'us-east-2' => [ 'description' => 'US East (Ohio)', ], 'us-west-1' => [ 'description' => 'US West (N. California)', ], 'us-west-2' => [ 'description' => 'US West (Oregon)', ], ], ], [ 'id' => 'aws-cn', 'outputs' => [ 'dnsSuffix' => 'amazonaws.com.cn', 'dualStackDnsSuffix' => 'api.amazonwebservices.com.cn', 'implicitGlobalRegion' => 'cn-northwest-1', 'name' => 'aws-cn', 'supportsDualStack' => true, 'supportsFIPS' => true, ], 'regionRegex' => '^cn\\-\\w+\\-\\d+$', 'regions' => [ 'aws-cn-global' => [ 'description' => 'aws-cn global region', ], 'cn-north-1' => [ 'description' => 'China (Beijing)', ], 'cn-northwest-1' => [ 'description' => 'China (Ningxia)', ], ], ], [ 'id' => 'aws-eusc', 'outputs' => [ 'dnsSuffix' => 'amazonaws.eu', 'dualStackDnsSuffix' => 'api.amazonwebservices.eu', 'implicitGlobalRegion' => 'eusc-de-east-1', 'name' => 'aws-eusc', 'supportsDualStack' => true, 'supportsFIPS' => true, ], 'regionRegex' => '^eusc\\-(de)\\-\\w+\\-\\d+$', 'regions' => [ 'eusc-de-east-1' => [ 'description' => 'EU (Germany)', ], ], ], [ 'id' => 'aws-iso', 'outputs' => [ 'dnsSuffix' => 'c2s.ic.gov', 'dualStackDnsSuffix' => 'api.aws.ic.gov', 'implicitGlobalRegion' => 'us-iso-east-1', 'name' => 'aws-iso', 'supportsDualStack' => true, 'supportsFIPS' => true, ], 'regionRegex' => '^us\\-iso\\-\\w+\\-\\d+$', 'regions' => [ 'aws-iso-global' => [ 'description' => 'aws-iso global region', ], 'us-iso-east-1' => [ 'description' => 'US ISO East', ], 'us-iso-west-1' => [ 'description' => 'US ISO WEST', ], ], ], [ 'id' => 'aws-iso-b', 'outputs' => [ 'dnsSuffix' => 'sc2s.sgov.gov', 'dualStackDnsSuffix' => 'api.aws.scloud', 'implicitGlobalRegion' => 'us-isob-east-1', 'name' => 'aws-iso-b', 'supportsDualStack' => true, 'supportsFIPS' => true, ], 'regionRegex' => '^us\\-isob\\-\\w+\\-\\d+$', 'regions' => [ 'aws-iso-b-global' => [ 'description' => 'aws-iso-b global region', ], 'us-isob-east-1' => [ 'description' => 'US ISOB East (Ohio)', ], 'us-isob-west-1' => [ 'description' => 'US ISOB West', ], ], ], [ 'id' => 'aws-iso-e', 'outputs' => [ 'dnsSuffix' => 'cloud.adc-e.uk', 'dualStackDnsSuffix' => 'api.cloud-aws.adc-e.uk', 'implicitGlobalRegion' => 'eu-isoe-west-1', 'name' => 'aws-iso-e', 'supportsDualStack' => true, 'supportsFIPS' => true, ], 'regionRegex' => '^eu\\-isoe\\-\\w+\\-\\d+$', 'regions' => [ 'aws-iso-e-global' => [ 'description' => 'aws-iso-e global region', ], 'eu-isoe-west-1' => [ 'description' => 'EU ISOE West', ], ], ], [ 'id' => 'aws-iso-f', 'outputs' => [ 'dnsSuffix' => 'csp.hci.ic.gov', 'dualStackDnsSuffix' => 'api.aws.hci.ic.gov', 'implicitGlobalRegion' => 'us-isof-south-1', 'name' => 'aws-iso-f', 'supportsDualStack' => true, 'supportsFIPS' => true, ], 'regionRegex' => '^us\\-isof\\-\\w+\\-\\d+$', 'regions' => [ 'aws-iso-f-global' => [ 'description' => 'aws-iso-f global region', ], 'us-isof-east-1' => [ 'description' => 'US ISOF EAST', ], 'us-isof-south-1' => [ 'description' => 'US ISOF SOUTH', ], ], ], [ 'id' => 'aws-us-gov', 'outputs' => [ 'dnsSuffix' => 'amazonaws.com', 'dualStackDnsSuffix' => 'api.aws', 'implicitGlobalRegion' => 'us-gov-west-1', 'name' => 'aws-us-gov', 'supportsDualStack' => true, 'supportsFIPS' => true, ], 'regionRegex' => '^us\\-gov\\-\\w+\\-\\d+$', 'regions' => [ 'aws-us-gov-global' => [ 'description' => 'aws-us-gov global region', ], 'us-gov-east-1' => [ 'description' => 'AWS GovCloud (US-East)', ], 'us-gov-west-1' => [ 'description' => 'AWS GovCloud (US-West)', ], ], ], ], 'version' => '1.1',]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/api-2.json.php b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/api-2.json.php new file mode 100644 index 0000000..2e62964 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/api-2.json.php @@ -0,0 +1,3 @@ + '2.0', 'metadata' => [ 'apiVersion' => '2006-03-01', 'checksumFormat' => 'md5', 'endpointPrefix' => 's3', 'globalEndpoint' => 's3.amazonaws.com', 'protocol' => 'rest-xml', 'protocols' => [ 'rest-xml', ], 'serviceAbbreviation' => 'Amazon S3', 'serviceFullName' => 'Amazon Simple Storage Service', 'serviceId' => 'S3', 'signatureVersion' => 's3', 'uid' => 's3-2006-03-01', 'auth' => [ 'aws.auth#sigv4', ], ], 'operations' => [ 'AbortMultipartUpload' => [ 'name' => 'AbortMultipartUpload', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}/{Key+}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'AbortMultipartUploadRequest', ], 'output' => [ 'shape' => 'AbortMultipartUploadOutput', ], 'errors' => [ [ 'shape' => 'NoSuchUpload', ], ], ], 'CompleteMultipartUpload' => [ 'name' => 'CompleteMultipartUpload', 'http' => [ 'method' => 'POST', 'requestUri' => '/{Bucket}/{Key+}', ], 'input' => [ 'shape' => 'CompleteMultipartUploadRequest', ], 'output' => [ 'shape' => 'CompleteMultipartUploadOutput', ], ], 'CopyObject' => [ 'name' => 'CopyObject', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}', ], 'input' => [ 'shape' => 'CopyObjectRequest', ], 'output' => [ 'shape' => 'CopyObjectOutput', ], 'errors' => [ [ 'shape' => 'ObjectNotInActiveTierError', ], ], 'staticContextParams' => [ 'DisableS3ExpressSessionAuth' => [ 'value' => true, ], ], ], 'CreateBucket' => [ 'name' => 'CreateBucket', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}', ], 'input' => [ 'shape' => 'CreateBucketRequest', ], 'output' => [ 'shape' => 'CreateBucketOutput', ], 'errors' => [ [ 'shape' => 'BucketAlreadyExists', ], [ 'shape' => 'BucketAlreadyOwnedByYou', ], ], 'staticContextParams' => [ 'DisableAccessPoints' => [ 'value' => true, ], 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'CreateBucketMetadataConfiguration' => [ 'name' => 'CreateBucketMetadataConfiguration', 'http' => [ 'method' => 'POST', 'requestUri' => '/{Bucket}?metadataConfiguration', ], 'input' => [ 'shape' => 'CreateBucketMetadataConfigurationRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'CreateBucketMetadataTableConfiguration' => [ 'name' => 'CreateBucketMetadataTableConfiguration', 'http' => [ 'method' => 'POST', 'requestUri' => '/{Bucket}?metadataTable', ], 'input' => [ 'shape' => 'CreateBucketMetadataTableConfigurationRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'CreateMultipartUpload' => [ 'name' => 'CreateMultipartUpload', 'http' => [ 'method' => 'POST', 'requestUri' => '/{Bucket}/{Key+}?uploads', ], 'input' => [ 'shape' => 'CreateMultipartUploadRequest', ], 'output' => [ 'shape' => 'CreateMultipartUploadOutput', ], ], 'CreateSession' => [ 'name' => 'CreateSession', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?session', ], 'input' => [ 'shape' => 'CreateSessionRequest', ], 'output' => [ 'shape' => 'CreateSessionOutput', ], 'errors' => [ [ 'shape' => 'NoSuchBucket', ], ], 'staticContextParams' => [ 'DisableS3ExpressSessionAuth' => [ 'value' => true, ], ], ], 'DeleteBucket' => [ 'name' => 'DeleteBucket', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketAnalyticsConfiguration' => [ 'name' => 'DeleteBucketAnalyticsConfiguration', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?analytics', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketAnalyticsConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketCors' => [ 'name' => 'DeleteBucketCors', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?cors', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketCorsRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketEncryption' => [ 'name' => 'DeleteBucketEncryption', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?encryption', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketEncryptionRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketIntelligentTieringConfiguration' => [ 'name' => 'DeleteBucketIntelligentTieringConfiguration', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?intelligent-tiering', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketIntelligentTieringConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketInventoryConfiguration' => [ 'name' => 'DeleteBucketInventoryConfiguration', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?inventory', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketInventoryConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketLifecycle' => [ 'name' => 'DeleteBucketLifecycle', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?lifecycle', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketLifecycleRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketMetadataConfiguration' => [ 'name' => 'DeleteBucketMetadataConfiguration', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?metadataConfiguration', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketMetadataConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketMetadataTableConfiguration' => [ 'name' => 'DeleteBucketMetadataTableConfiguration', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?metadataTable', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketMetadataTableConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketMetricsConfiguration' => [ 'name' => 'DeleteBucketMetricsConfiguration', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?metrics', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketMetricsConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketOwnershipControls' => [ 'name' => 'DeleteBucketOwnershipControls', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?ownershipControls', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketOwnershipControlsRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketPolicy' => [ 'name' => 'DeleteBucketPolicy', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?policy', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketPolicyRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketReplication' => [ 'name' => 'DeleteBucketReplication', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?replication', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketReplicationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketTagging' => [ 'name' => 'DeleteBucketTagging', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?tagging', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketTaggingRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteBucketWebsite' => [ 'name' => 'DeleteBucketWebsite', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?website', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteBucketWebsiteRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'DeleteObject' => [ 'name' => 'DeleteObject', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}/{Key+}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteObjectRequest', ], 'output' => [ 'shape' => 'DeleteObjectOutput', ], ], 'DeleteObjectTagging' => [ 'name' => 'DeleteObjectTagging', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}/{Key+}?tagging', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteObjectTaggingRequest', ], 'output' => [ 'shape' => 'DeleteObjectTaggingOutput', ], ], 'DeleteObjects' => [ 'name' => 'DeleteObjects', 'http' => [ 'method' => 'POST', 'requestUri' => '/{Bucket}?delete', ], 'input' => [ 'shape' => 'DeleteObjectsRequest', ], 'output' => [ 'shape' => 'DeleteObjectsOutput', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], ], 'DeletePublicAccessBlock' => [ 'name' => 'DeletePublicAccessBlock', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/{Bucket}?publicAccessBlock', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeletePublicAccessBlockRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketAbac' => [ 'name' => 'GetBucketAbac', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?abac', ], 'input' => [ 'shape' => 'GetBucketAbacRequest', ], 'output' => [ 'shape' => 'GetBucketAbacOutput', ], ], 'GetBucketAccelerateConfiguration' => [ 'name' => 'GetBucketAccelerateConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?accelerate', ], 'input' => [ 'shape' => 'GetBucketAccelerateConfigurationRequest', ], 'output' => [ 'shape' => 'GetBucketAccelerateConfigurationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketAcl' => [ 'name' => 'GetBucketAcl', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?acl', ], 'input' => [ 'shape' => 'GetBucketAclRequest', ], 'output' => [ 'shape' => 'GetBucketAclOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketAnalyticsConfiguration' => [ 'name' => 'GetBucketAnalyticsConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?analytics', ], 'input' => [ 'shape' => 'GetBucketAnalyticsConfigurationRequest', ], 'output' => [ 'shape' => 'GetBucketAnalyticsConfigurationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketCors' => [ 'name' => 'GetBucketCors', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?cors', ], 'input' => [ 'shape' => 'GetBucketCorsRequest', ], 'output' => [ 'shape' => 'GetBucketCorsOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketEncryption' => [ 'name' => 'GetBucketEncryption', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?encryption', ], 'input' => [ 'shape' => 'GetBucketEncryptionRequest', ], 'output' => [ 'shape' => 'GetBucketEncryptionOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketIntelligentTieringConfiguration' => [ 'name' => 'GetBucketIntelligentTieringConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?intelligent-tiering', ], 'input' => [ 'shape' => 'GetBucketIntelligentTieringConfigurationRequest', ], 'output' => [ 'shape' => 'GetBucketIntelligentTieringConfigurationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketInventoryConfiguration' => [ 'name' => 'GetBucketInventoryConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?inventory', ], 'input' => [ 'shape' => 'GetBucketInventoryConfigurationRequest', ], 'output' => [ 'shape' => 'GetBucketInventoryConfigurationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketLifecycle' => [ 'name' => 'GetBucketLifecycle', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?lifecycle', ], 'input' => [ 'shape' => 'GetBucketLifecycleRequest', ], 'output' => [ 'shape' => 'GetBucketLifecycleOutput', ], 'deprecated' => true, 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketLifecycleConfiguration' => [ 'name' => 'GetBucketLifecycleConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?lifecycle', ], 'input' => [ 'shape' => 'GetBucketLifecycleConfigurationRequest', ], 'output' => [ 'shape' => 'GetBucketLifecycleConfigurationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketLocation' => [ 'name' => 'GetBucketLocation', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?location', ], 'input' => [ 'shape' => 'GetBucketLocationRequest', ], 'output' => [ 'shape' => 'GetBucketLocationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketLogging' => [ 'name' => 'GetBucketLogging', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?logging', ], 'input' => [ 'shape' => 'GetBucketLoggingRequest', ], 'output' => [ 'shape' => 'GetBucketLoggingOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketMetadataConfiguration' => [ 'name' => 'GetBucketMetadataConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?metadataConfiguration', ], 'input' => [ 'shape' => 'GetBucketMetadataConfigurationRequest', ], 'output' => [ 'shape' => 'GetBucketMetadataConfigurationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketMetadataTableConfiguration' => [ 'name' => 'GetBucketMetadataTableConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?metadataTable', ], 'input' => [ 'shape' => 'GetBucketMetadataTableConfigurationRequest', ], 'output' => [ 'shape' => 'GetBucketMetadataTableConfigurationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketMetricsConfiguration' => [ 'name' => 'GetBucketMetricsConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?metrics', ], 'input' => [ 'shape' => 'GetBucketMetricsConfigurationRequest', ], 'output' => [ 'shape' => 'GetBucketMetricsConfigurationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketNotification' => [ 'name' => 'GetBucketNotification', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?notification', ], 'input' => [ 'shape' => 'GetBucketNotificationConfigurationRequest', ], 'output' => [ 'shape' => 'NotificationConfigurationDeprecated', ], 'deprecated' => true, 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketNotificationConfiguration' => [ 'name' => 'GetBucketNotificationConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?notification', ], 'input' => [ 'shape' => 'GetBucketNotificationConfigurationRequest', ], 'output' => [ 'shape' => 'NotificationConfiguration', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketOwnershipControls' => [ 'name' => 'GetBucketOwnershipControls', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?ownershipControls', ], 'input' => [ 'shape' => 'GetBucketOwnershipControlsRequest', ], 'output' => [ 'shape' => 'GetBucketOwnershipControlsOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketPolicy' => [ 'name' => 'GetBucketPolicy', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?policy', ], 'input' => [ 'shape' => 'GetBucketPolicyRequest', ], 'output' => [ 'shape' => 'GetBucketPolicyOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketPolicyStatus' => [ 'name' => 'GetBucketPolicyStatus', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?policyStatus', ], 'input' => [ 'shape' => 'GetBucketPolicyStatusRequest', ], 'output' => [ 'shape' => 'GetBucketPolicyStatusOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketReplication' => [ 'name' => 'GetBucketReplication', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?replication', ], 'input' => [ 'shape' => 'GetBucketReplicationRequest', ], 'output' => [ 'shape' => 'GetBucketReplicationOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketRequestPayment' => [ 'name' => 'GetBucketRequestPayment', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?requestPayment', ], 'input' => [ 'shape' => 'GetBucketRequestPaymentRequest', ], 'output' => [ 'shape' => 'GetBucketRequestPaymentOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketTagging' => [ 'name' => 'GetBucketTagging', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?tagging', ], 'input' => [ 'shape' => 'GetBucketTaggingRequest', ], 'output' => [ 'shape' => 'GetBucketTaggingOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketVersioning' => [ 'name' => 'GetBucketVersioning', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?versioning', ], 'input' => [ 'shape' => 'GetBucketVersioningRequest', ], 'output' => [ 'shape' => 'GetBucketVersioningOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetBucketWebsite' => [ 'name' => 'GetBucketWebsite', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?website', ], 'input' => [ 'shape' => 'GetBucketWebsiteRequest', ], 'output' => [ 'shape' => 'GetBucketWebsiteOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'GetObject' => [ 'name' => 'GetObject', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}', ], 'input' => [ 'shape' => 'GetObjectRequest', ], 'output' => [ 'shape' => 'GetObjectOutput', ], 'errors' => [ [ 'shape' => 'NoSuchKey', ], [ 'shape' => 'InvalidObjectState', ], ], 'httpChecksum' => [ 'requestValidationModeMember' => 'ChecksumMode', 'responseAlgorithms' => [ 'CRC64NVME', 'CRC32', 'CRC32C', 'SHA256', 'SHA1', ], ], ], 'GetObjectAcl' => [ 'name' => 'GetObjectAcl', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?acl', ], 'input' => [ 'shape' => 'GetObjectAclRequest', ], 'output' => [ 'shape' => 'GetObjectAclOutput', ], 'errors' => [ [ 'shape' => 'NoSuchKey', ], ], ], 'GetObjectAttributes' => [ 'name' => 'GetObjectAttributes', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?attributes', ], 'input' => [ 'shape' => 'GetObjectAttributesRequest', ], 'output' => [ 'shape' => 'GetObjectAttributesOutput', ], 'errors' => [ [ 'shape' => 'NoSuchKey', ], ], ], 'GetObjectLegalHold' => [ 'name' => 'GetObjectLegalHold', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?legal-hold', ], 'input' => [ 'shape' => 'GetObjectLegalHoldRequest', ], 'output' => [ 'shape' => 'GetObjectLegalHoldOutput', ], ], 'GetObjectLockConfiguration' => [ 'name' => 'GetObjectLockConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?object-lock', ], 'input' => [ 'shape' => 'GetObjectLockConfigurationRequest', ], 'output' => [ 'shape' => 'GetObjectLockConfigurationOutput', ], ], 'GetObjectRetention' => [ 'name' => 'GetObjectRetention', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?retention', ], 'input' => [ 'shape' => 'GetObjectRetentionRequest', ], 'output' => [ 'shape' => 'GetObjectRetentionOutput', ], ], 'GetObjectTagging' => [ 'name' => 'GetObjectTagging', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?tagging', ], 'input' => [ 'shape' => 'GetObjectTaggingRequest', ], 'output' => [ 'shape' => 'GetObjectTaggingOutput', ], ], 'GetObjectTorrent' => [ 'name' => 'GetObjectTorrent', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?torrent', ], 'input' => [ 'shape' => 'GetObjectTorrentRequest', ], 'output' => [ 'shape' => 'GetObjectTorrentOutput', ], ], 'GetPublicAccessBlock' => [ 'name' => 'GetPublicAccessBlock', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?publicAccessBlock', ], 'input' => [ 'shape' => 'GetPublicAccessBlockRequest', ], 'output' => [ 'shape' => 'GetPublicAccessBlockOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'HeadBucket' => [ 'name' => 'HeadBucket', 'http' => [ 'method' => 'HEAD', 'requestUri' => '/{Bucket}', ], 'input' => [ 'shape' => 'HeadBucketRequest', ], 'output' => [ 'shape' => 'HeadBucketOutput', ], 'errors' => [ [ 'shape' => 'NoSuchBucket', ], ], ], 'HeadObject' => [ 'name' => 'HeadObject', 'http' => [ 'method' => 'HEAD', 'requestUri' => '/{Bucket}/{Key+}', ], 'input' => [ 'shape' => 'HeadObjectRequest', ], 'output' => [ 'shape' => 'HeadObjectOutput', ], 'errors' => [ [ 'shape' => 'NoSuchKey', ], ], ], 'ListBucketAnalyticsConfigurations' => [ 'name' => 'ListBucketAnalyticsConfigurations', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?analytics', ], 'input' => [ 'shape' => 'ListBucketAnalyticsConfigurationsRequest', ], 'output' => [ 'shape' => 'ListBucketAnalyticsConfigurationsOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'ListBucketIntelligentTieringConfigurations' => [ 'name' => 'ListBucketIntelligentTieringConfigurations', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?intelligent-tiering', ], 'input' => [ 'shape' => 'ListBucketIntelligentTieringConfigurationsRequest', ], 'output' => [ 'shape' => 'ListBucketIntelligentTieringConfigurationsOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'ListBucketInventoryConfigurations' => [ 'name' => 'ListBucketInventoryConfigurations', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?inventory', ], 'input' => [ 'shape' => 'ListBucketInventoryConfigurationsRequest', ], 'output' => [ 'shape' => 'ListBucketInventoryConfigurationsOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'ListBucketMetricsConfigurations' => [ 'name' => 'ListBucketMetricsConfigurations', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?metrics', ], 'input' => [ 'shape' => 'ListBucketMetricsConfigurationsRequest', ], 'output' => [ 'shape' => 'ListBucketMetricsConfigurationsOutput', ], ], 'ListBuckets' => [ 'name' => 'ListBuckets', 'http' => [ 'method' => 'GET', 'requestUri' => '/', ], 'input' => [ 'shape' => 'ListBucketsRequest', ], 'output' => [ 'shape' => 'ListBucketsOutput', ], ], 'ListDirectoryBuckets' => [ 'name' => 'ListDirectoryBuckets', 'http' => [ 'method' => 'GET', 'requestUri' => '/', ], 'input' => [ 'shape' => 'ListDirectoryBucketsRequest', ], 'output' => [ 'shape' => 'ListDirectoryBucketsOutput', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'ListMultipartUploads' => [ 'name' => 'ListMultipartUploads', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?uploads', ], 'input' => [ 'shape' => 'ListMultipartUploadsRequest', ], 'output' => [ 'shape' => 'ListMultipartUploadsOutput', ], ], 'ListObjectVersions' => [ 'name' => 'ListObjectVersions', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?versions', ], 'input' => [ 'shape' => 'ListObjectVersionsRequest', ], 'output' => [ 'shape' => 'ListObjectVersionsOutput', ], ], 'ListObjects' => [ 'name' => 'ListObjects', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}', ], 'input' => [ 'shape' => 'ListObjectsRequest', ], 'output' => [ 'shape' => 'ListObjectsOutput', ], 'errors' => [ [ 'shape' => 'NoSuchBucket', ], ], ], 'ListObjectsV2' => [ 'name' => 'ListObjectsV2', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}?list-type=2', ], 'input' => [ 'shape' => 'ListObjectsV2Request', ], 'output' => [ 'shape' => 'ListObjectsV2Output', ], 'errors' => [ [ 'shape' => 'NoSuchBucket', ], ], ], 'ListParts' => [ 'name' => 'ListParts', 'http' => [ 'method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}', ], 'input' => [ 'shape' => 'ListPartsRequest', ], 'output' => [ 'shape' => 'ListPartsOutput', ], ], 'PutBucketAbac' => [ 'name' => 'PutBucketAbac', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?abac', ], 'input' => [ 'shape' => 'PutBucketAbacRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => false, ], ], 'PutBucketAccelerateConfiguration' => [ 'name' => 'PutBucketAccelerateConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?accelerate', ], 'input' => [ 'shape' => 'PutBucketAccelerateConfigurationRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => false, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketAcl' => [ 'name' => 'PutBucketAcl', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?acl', ], 'input' => [ 'shape' => 'PutBucketAclRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketAnalyticsConfiguration' => [ 'name' => 'PutBucketAnalyticsConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?analytics', ], 'input' => [ 'shape' => 'PutBucketAnalyticsConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketCors' => [ 'name' => 'PutBucketCors', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?cors', ], 'input' => [ 'shape' => 'PutBucketCorsRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketEncryption' => [ 'name' => 'PutBucketEncryption', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?encryption', ], 'input' => [ 'shape' => 'PutBucketEncryptionRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketIntelligentTieringConfiguration' => [ 'name' => 'PutBucketIntelligentTieringConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?intelligent-tiering', ], 'input' => [ 'shape' => 'PutBucketIntelligentTieringConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketInventoryConfiguration' => [ 'name' => 'PutBucketInventoryConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?inventory', ], 'input' => [ 'shape' => 'PutBucketInventoryConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketLifecycle' => [ 'name' => 'PutBucketLifecycle', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?lifecycle', ], 'input' => [ 'shape' => 'PutBucketLifecycleRequest', ], 'deprecated' => true, 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketLifecycleConfiguration' => [ 'name' => 'PutBucketLifecycleConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?lifecycle', ], 'input' => [ 'shape' => 'PutBucketLifecycleConfigurationRequest', ], 'output' => [ 'shape' => 'PutBucketLifecycleConfigurationOutput', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketLogging' => [ 'name' => 'PutBucketLogging', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?logging', ], 'input' => [ 'shape' => 'PutBucketLoggingRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketMetricsConfiguration' => [ 'name' => 'PutBucketMetricsConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?metrics', ], 'input' => [ 'shape' => 'PutBucketMetricsConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketNotification' => [ 'name' => 'PutBucketNotification', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?notification', ], 'input' => [ 'shape' => 'PutBucketNotificationRequest', ], 'deprecated' => true, 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketNotificationConfiguration' => [ 'name' => 'PutBucketNotificationConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?notification', ], 'input' => [ 'shape' => 'PutBucketNotificationConfigurationRequest', ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketOwnershipControls' => [ 'name' => 'PutBucketOwnershipControls', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?ownershipControls', ], 'input' => [ 'shape' => 'PutBucketOwnershipControlsRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketPolicy' => [ 'name' => 'PutBucketPolicy', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?policy', ], 'input' => [ 'shape' => 'PutBucketPolicyRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketReplication' => [ 'name' => 'PutBucketReplication', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?replication', ], 'input' => [ 'shape' => 'PutBucketReplicationRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketRequestPayment' => [ 'name' => 'PutBucketRequestPayment', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?requestPayment', ], 'input' => [ 'shape' => 'PutBucketRequestPaymentRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketTagging' => [ 'name' => 'PutBucketTagging', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?tagging', ], 'input' => [ 'shape' => 'PutBucketTaggingRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketVersioning' => [ 'name' => 'PutBucketVersioning', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?versioning', ], 'input' => [ 'shape' => 'PutBucketVersioningRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutBucketWebsite' => [ 'name' => 'PutBucketWebsite', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?website', ], 'input' => [ 'shape' => 'PutBucketWebsiteRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'PutObject' => [ 'name' => 'PutObject', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}', ], 'input' => [ 'shape' => 'PutObjectRequest', ], 'output' => [ 'shape' => 'PutObjectOutput', ], 'errors' => [ [ 'shape' => 'InvalidRequest', ], [ 'shape' => 'InvalidWriteOffset', ], [ 'shape' => 'TooManyParts', ], [ 'shape' => 'EncryptionTypeMismatch', ], ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => false, ], ], 'PutObjectAcl' => [ 'name' => 'PutObjectAcl', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?acl', ], 'input' => [ 'shape' => 'PutObjectAclRequest', ], 'output' => [ 'shape' => 'PutObjectAclOutput', ], 'errors' => [ [ 'shape' => 'NoSuchKey', ], ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], ], 'PutObjectLegalHold' => [ 'name' => 'PutObjectLegalHold', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?legal-hold', ], 'input' => [ 'shape' => 'PutObjectLegalHoldRequest', ], 'output' => [ 'shape' => 'PutObjectLegalHoldOutput', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], ], 'PutObjectLockConfiguration' => [ 'name' => 'PutObjectLockConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?object-lock', ], 'input' => [ 'shape' => 'PutObjectLockConfigurationRequest', ], 'output' => [ 'shape' => 'PutObjectLockConfigurationOutput', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], ], 'PutObjectRetention' => [ 'name' => 'PutObjectRetention', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?retention', ], 'input' => [ 'shape' => 'PutObjectRetentionRequest', ], 'output' => [ 'shape' => 'PutObjectRetentionOutput', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], ], 'PutObjectTagging' => [ 'name' => 'PutObjectTagging', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?tagging', ], 'input' => [ 'shape' => 'PutObjectTaggingRequest', ], 'output' => [ 'shape' => 'PutObjectTaggingOutput', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], ], 'PutPublicAccessBlock' => [ 'name' => 'PutPublicAccessBlock', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?publicAccessBlock', ], 'input' => [ 'shape' => 'PutPublicAccessBlockRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'RenameObject' => [ 'name' => 'RenameObject', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?renameObject', ], 'input' => [ 'shape' => 'RenameObjectRequest', ], 'output' => [ 'shape' => 'RenameObjectOutput', ], 'errors' => [ [ 'shape' => 'IdempotencyParameterMismatch', ], ], ], 'RestoreObject' => [ 'name' => 'RestoreObject', 'http' => [ 'method' => 'POST', 'requestUri' => '/{Bucket}/{Key+}?restore', ], 'input' => [ 'shape' => 'RestoreObjectRequest', ], 'output' => [ 'shape' => 'RestoreObjectOutput', ], 'errors' => [ [ 'shape' => 'ObjectAlreadyInActiveTierError', ], ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => false, ], ], 'SelectObjectContent' => [ 'name' => 'SelectObjectContent', 'http' => [ 'method' => 'POST', 'requestUri' => '/{Bucket}/{Key+}?select&select-type=2', ], 'input' => [ 'shape' => 'SelectObjectContentRequest', 'locationName' => 'SelectObjectContentRequest', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'output' => [ 'shape' => 'SelectObjectContentOutput', ], ], 'UpdateBucketMetadataInventoryTableConfiguration' => [ 'name' => 'UpdateBucketMetadataInventoryTableConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?metadataInventoryTable', ], 'input' => [ 'shape' => 'UpdateBucketMetadataInventoryTableConfigurationRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'UpdateBucketMetadataJournalTableConfiguration' => [ 'name' => 'UpdateBucketMetadataJournalTableConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}?metadataJournalTable', ], 'input' => [ 'shape' => 'UpdateBucketMetadataJournalTableConfigurationRequest', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => true, ], 'staticContextParams' => [ 'UseS3ExpressControlEndpoint' => [ 'value' => true, ], ], ], 'UploadPart' => [ 'name' => 'UploadPart', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}', ], 'input' => [ 'shape' => 'UploadPartRequest', ], 'output' => [ 'shape' => 'UploadPartOutput', ], 'httpChecksum' => [ 'requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => false, ], ], 'UploadPartCopy' => [ 'name' => 'UploadPartCopy', 'http' => [ 'method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}', ], 'input' => [ 'shape' => 'UploadPartCopyRequest', ], 'output' => [ 'shape' => 'UploadPartCopyOutput', ], 'staticContextParams' => [ 'DisableS3ExpressSessionAuth' => [ 'value' => true, ], ], ], 'WriteGetObjectResponse' => [ 'name' => 'WriteGetObjectResponse', 'http' => [ 'method' => 'POST', 'requestUri' => '/WriteGetObjectResponse', ], 'input' => [ 'shape' => 'WriteGetObjectResponseRequest', ], 'authtype' => 'v4-unsigned-body', 'endpoint' => [ 'hostPrefix' => '{RequestRoute}.', ], 'staticContextParams' => [ 'UseObjectLambdaEndpoint' => [ 'value' => true, ], ], 'unsignedPayload' => true, ], ], 'shapes' => [ 'AbacStatus' => [ 'type' => 'structure', 'members' => [ 'Status' => [ 'shape' => 'BucketAbacStatus', ], ], ], 'AbortDate' => [ 'type' => 'timestamp', ], 'AbortIncompleteMultipartUpload' => [ 'type' => 'structure', 'members' => [ 'DaysAfterInitiation' => [ 'shape' => 'DaysAfterInitiation', ], ], ], 'AbortMultipartUploadOutput' => [ 'type' => 'structure', 'members' => [ 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'AbortMultipartUploadRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', 'UploadId', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'UploadId' => [ 'shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'IfMatchInitiatedTime' => [ 'shape' => 'IfMatchInitiatedTime', 'location' => 'header', 'locationName' => 'x-amz-if-match-initiated-time', ], ], ], 'AbortRuleId' => [ 'type' => 'string', ], 'AccelerateConfiguration' => [ 'type' => 'structure', 'members' => [ 'Status' => [ 'shape' => 'BucketAccelerateStatus', ], ], ], 'AcceptRanges' => [ 'type' => 'string', ], 'AccessControlPolicy' => [ 'type' => 'structure', 'members' => [ 'Grants' => [ 'shape' => 'Grants', 'locationName' => 'AccessControlList', ], 'Owner' => [ 'shape' => 'Owner', ], ], ], 'AccessControlTranslation' => [ 'type' => 'structure', 'required' => [ 'Owner', ], 'members' => [ 'Owner' => [ 'shape' => 'OwnerOverride', ], ], ], 'AccessKeyIdValue' => [ 'type' => 'string', ], 'AccessPointAlias' => [ 'type' => 'boolean', 'box' => true, ], 'AccessPointArn' => [ 'type' => 'string', ], 'AccountId' => [ 'type' => 'string', ], 'AllowQuotedRecordDelimiter' => [ 'type' => 'boolean', 'box' => true, ], 'AllowedHeader' => [ 'type' => 'string', ], 'AllowedHeaders' => [ 'type' => 'list', 'member' => [ 'shape' => 'AllowedHeader', ], 'flattened' => true, ], 'AllowedMethod' => [ 'type' => 'string', ], 'AllowedMethods' => [ 'type' => 'list', 'member' => [ 'shape' => 'AllowedMethod', ], 'flattened' => true, ], 'AllowedOrigin' => [ 'type' => 'string', ], 'AllowedOrigins' => [ 'type' => 'list', 'member' => [ 'shape' => 'AllowedOrigin', ], 'flattened' => true, ], 'AnalyticsAndOperator' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tags' => [ 'shape' => 'TagSet', 'flattened' => true, 'locationName' => 'Tag', ], ], ], 'AnalyticsConfiguration' => [ 'type' => 'structure', 'required' => [ 'Id', 'StorageClassAnalysis', ], 'members' => [ 'Id' => [ 'shape' => 'AnalyticsId', ], 'Filter' => [ 'shape' => 'AnalyticsFilter', ], 'StorageClassAnalysis' => [ 'shape' => 'StorageClassAnalysis', ], ], ], 'AnalyticsConfigurationList' => [ 'type' => 'list', 'member' => [ 'shape' => 'AnalyticsConfiguration', ], 'flattened' => true, ], 'AnalyticsExportDestination' => [ 'type' => 'structure', 'required' => [ 'S3BucketDestination', ], 'members' => [ 'S3BucketDestination' => [ 'shape' => 'AnalyticsS3BucketDestination', ], ], ], 'AnalyticsFilter' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tag' => [ 'shape' => 'Tag', ], 'And' => [ 'shape' => 'AnalyticsAndOperator', ], ], ], 'AnalyticsId' => [ 'type' => 'string', ], 'AnalyticsS3BucketDestination' => [ 'type' => 'structure', 'required' => [ 'Format', 'Bucket', ], 'members' => [ 'Format' => [ 'shape' => 'AnalyticsS3ExportFileFormat', ], 'BucketAccountId' => [ 'shape' => 'AccountId', ], 'Bucket' => [ 'shape' => 'BucketName', ], 'Prefix' => [ 'shape' => 'Prefix', ], ], ], 'AnalyticsS3ExportFileFormat' => [ 'type' => 'string', 'enum' => [ 'CSV', ], ], 'ArchiveStatus' => [ 'type' => 'string', 'enum' => [ 'ARCHIVE_ACCESS', 'DEEP_ARCHIVE_ACCESS', ], ], 'BlockedEncryptionTypes' => [ 'type' => 'structure', 'members' => [ 'EncryptionType' => [ 'shape' => 'EncryptionTypeList', ], ], ], 'Body' => [ 'type' => 'blob', ], 'Bucket' => [ 'type' => 'structure', 'members' => [ 'Name' => [ 'shape' => 'BucketName', ], 'CreationDate' => [ 'shape' => 'CreationDate', ], 'BucketRegion' => [ 'shape' => 'BucketRegion', ], 'BucketArn' => [ 'shape' => 'S3RegionalOrS3ExpressBucketArnString', ], ], ], 'BucketAbacStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'BucketAccelerateStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Suspended', ], ], 'BucketAlreadyExists' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 409, ], 'exception' => true, ], 'BucketAlreadyOwnedByYou' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 409, ], 'exception' => true, ], 'BucketCannedACL' => [ 'type' => 'string', 'enum' => [ 'private', 'public-read', 'public-read-write', 'authenticated-read', ], ], 'BucketInfo' => [ 'type' => 'structure', 'members' => [ 'DataRedundancy' => [ 'shape' => 'DataRedundancy', ], 'Type' => [ 'shape' => 'BucketType', ], ], ], 'BucketKeyEnabled' => [ 'type' => 'boolean', 'box' => true, ], 'BucketLifecycleConfiguration' => [ 'type' => 'structure', 'required' => [ 'Rules', ], 'members' => [ 'Rules' => [ 'shape' => 'LifecycleRules', 'locationName' => 'Rule', ], ], ], 'BucketLocationConstraint' => [ 'type' => 'string', 'enum' => [ 'af-south-1', 'ap-east-1', 'ap-northeast-1', 'ap-northeast-2', 'ap-northeast-3', 'ap-south-1', 'ap-south-2', 'ap-southeast-1', 'ap-southeast-2', 'ap-southeast-3', 'ap-southeast-4', 'ap-southeast-5', 'ca-central-1', 'cn-north-1', 'cn-northwest-1', 'EU', 'eu-central-1', 'eu-central-2', 'eu-north-1', 'eu-south-1', 'eu-south-2', 'eu-west-1', 'eu-west-2', 'eu-west-3', 'il-central-1', 'me-central-1', 'me-south-1', 'sa-east-1', 'us-east-2', 'us-gov-east-1', 'us-gov-west-1', 'us-west-1', 'us-west-2', ], ], 'BucketLocationName' => [ 'type' => 'string', ], 'BucketLoggingStatus' => [ 'type' => 'structure', 'members' => [ 'LoggingEnabled' => [ 'shape' => 'LoggingEnabled', ], ], ], 'BucketLogsPermission' => [ 'type' => 'string', 'enum' => [ 'FULL_CONTROL', 'READ', 'WRITE', ], ], 'BucketName' => [ 'type' => 'string', ], 'BucketRegion' => [ 'type' => 'string', ], 'BucketType' => [ 'type' => 'string', 'enum' => [ 'Directory', ], ], 'BucketVersioningStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Suspended', ], ], 'Buckets' => [ 'type' => 'list', 'member' => [ 'shape' => 'Bucket', 'locationName' => 'Bucket', ], ], 'BypassGovernanceRetention' => [ 'type' => 'boolean', 'box' => true, ], 'BytesProcessed' => [ 'type' => 'long', 'box' => true, ], 'BytesReturned' => [ 'type' => 'long', 'box' => true, ], 'BytesScanned' => [ 'type' => 'long', 'box' => true, ], 'CORSConfiguration' => [ 'type' => 'structure', 'required' => [ 'CORSRules', ], 'members' => [ 'CORSRules' => [ 'shape' => 'CORSRules', 'locationName' => 'CORSRule', ], ], ], 'CORSRule' => [ 'type' => 'structure', 'required' => [ 'AllowedMethods', 'AllowedOrigins', ], 'members' => [ 'ID' => [ 'shape' => 'ID', ], 'AllowedHeaders' => [ 'shape' => 'AllowedHeaders', 'locationName' => 'AllowedHeader', ], 'AllowedMethods' => [ 'shape' => 'AllowedMethods', 'locationName' => 'AllowedMethod', ], 'AllowedOrigins' => [ 'shape' => 'AllowedOrigins', 'locationName' => 'AllowedOrigin', ], 'ExposeHeaders' => [ 'shape' => 'ExposeHeaders', 'locationName' => 'ExposeHeader', ], 'MaxAgeSeconds' => [ 'shape' => 'MaxAgeSeconds', ], ], ], 'CORSRules' => [ 'type' => 'list', 'member' => [ 'shape' => 'CORSRule', ], 'flattened' => true, ], 'CSVInput' => [ 'type' => 'structure', 'members' => [ 'FileHeaderInfo' => [ 'shape' => 'FileHeaderInfo', ], 'Comments' => [ 'shape' => 'Comments', ], 'QuoteEscapeCharacter' => [ 'shape' => 'QuoteEscapeCharacter', ], 'RecordDelimiter' => [ 'shape' => 'RecordDelimiter', ], 'FieldDelimiter' => [ 'shape' => 'FieldDelimiter', ], 'QuoteCharacter' => [ 'shape' => 'QuoteCharacter', ], 'AllowQuotedRecordDelimiter' => [ 'shape' => 'AllowQuotedRecordDelimiter', ], ], ], 'CSVOutput' => [ 'type' => 'structure', 'members' => [ 'QuoteFields' => [ 'shape' => 'QuoteFields', ], 'QuoteEscapeCharacter' => [ 'shape' => 'QuoteEscapeCharacter', ], 'RecordDelimiter' => [ 'shape' => 'RecordDelimiter', ], 'FieldDelimiter' => [ 'shape' => 'FieldDelimiter', ], 'QuoteCharacter' => [ 'shape' => 'QuoteCharacter', ], ], ], 'CacheControl' => [ 'type' => 'string', ], 'Checksum' => [ 'type' => 'structure', 'members' => [ 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', ], ], ], 'ChecksumAlgorithm' => [ 'type' => 'string', 'enum' => [ 'CRC32', 'CRC32C', 'SHA1', 'SHA256', 'CRC64NVME', ], ], 'ChecksumAlgorithmList' => [ 'type' => 'list', 'member' => [ 'shape' => 'ChecksumAlgorithm', ], 'flattened' => true, ], 'ChecksumCRC32' => [ 'type' => 'string', ], 'ChecksumCRC32C' => [ 'type' => 'string', ], 'ChecksumCRC64NVME' => [ 'type' => 'string', ], 'ChecksumMode' => [ 'type' => 'string', 'enum' => [ 'ENABLED', ], ], 'ChecksumSHA1' => [ 'type' => 'string', ], 'ChecksumSHA256' => [ 'type' => 'string', ], 'ChecksumType' => [ 'type' => 'string', 'enum' => [ 'COMPOSITE', 'FULL_OBJECT', ], ], 'ClientToken' => [ 'type' => 'string', ], 'CloudFunction' => [ 'type' => 'string', ], 'CloudFunctionConfiguration' => [ 'type' => 'structure', 'members' => [ 'Id' => [ 'shape' => 'NotificationId', ], 'Event' => [ 'shape' => 'Event', 'deprecated' => true, ], 'Events' => [ 'shape' => 'EventList', 'locationName' => 'Event', ], 'CloudFunction' => [ 'shape' => 'CloudFunction', ], 'InvocationRole' => [ 'shape' => 'CloudFunctionInvocationRole', ], ], ], 'CloudFunctionInvocationRole' => [ 'type' => 'string', ], 'Code' => [ 'type' => 'string', ], 'Comments' => [ 'type' => 'string', ], 'CommonPrefix' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], ], ], 'CommonPrefixList' => [ 'type' => 'list', 'member' => [ 'shape' => 'CommonPrefix', ], 'flattened' => true, ], 'CompleteMultipartUploadOutput' => [ 'type' => 'structure', 'members' => [ 'Location' => [ 'shape' => 'Location', ], 'Bucket' => [ 'shape' => 'BucketName', ], 'Key' => [ 'shape' => 'ObjectKey', ], 'Expiration' => [ 'shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration', ], 'ETag' => [ 'shape' => 'ETag', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'CompleteMultipartUploadRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', 'UploadId', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'MultipartUpload' => [ 'shape' => 'CompletedMultipartUpload', 'locationName' => 'CompleteMultipartUpload', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'UploadId' => [ 'shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc64nvme', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', 'location' => 'header', 'locationName' => 'x-amz-checksum-type', ], 'MpuObjectSize' => [ 'shape' => 'MpuObjectSize', 'location' => 'header', 'locationName' => 'x-amz-mp-object-size', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'IfMatch' => [ 'shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match', ], 'IfNoneMatch' => [ 'shape' => 'IfNoneMatch', 'location' => 'header', 'locationName' => 'If-None-Match', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], ], 'payload' => 'MultipartUpload', ], 'CompletedMultipartUpload' => [ 'type' => 'structure', 'members' => [ 'Parts' => [ 'shape' => 'CompletedPartList', 'locationName' => 'Part', ], ], ], 'CompletedPart' => [ 'type' => 'structure', 'members' => [ 'ETag' => [ 'shape' => 'ETag', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', ], 'PartNumber' => [ 'shape' => 'PartNumber', ], ], ], 'CompletedPartList' => [ 'type' => 'list', 'member' => [ 'shape' => 'CompletedPart', ], 'flattened' => true, ], 'CompressionType' => [ 'type' => 'string', 'enum' => [ 'NONE', 'GZIP', 'BZIP2', ], ], 'Condition' => [ 'type' => 'structure', 'members' => [ 'HttpErrorCodeReturnedEquals' => [ 'shape' => 'HttpErrorCodeReturnedEquals', ], 'KeyPrefixEquals' => [ 'shape' => 'KeyPrefixEquals', ], ], ], 'ConfirmRemoveSelfBucketAccess' => [ 'type' => 'boolean', 'box' => true, ], 'ContentDisposition' => [ 'type' => 'string', ], 'ContentEncoding' => [ 'type' => 'string', ], 'ContentLanguage' => [ 'type' => 'string', ], 'ContentLength' => [ 'type' => 'long', ], 'ContentMD5' => [ 'type' => 'string', ], 'ContentRange' => [ 'type' => 'string', ], 'ContentType' => [ 'type' => 'string', ], 'ContinuationEvent' => [ 'type' => 'structure', 'members' => [], 'event' => true, ], 'CopyObjectOutput' => [ 'type' => 'structure', 'members' => [ 'CopyObjectResult' => [ 'shape' => 'CopyObjectResult', ], 'Expiration' => [ 'shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration', ], 'CopySourceVersionId' => [ 'shape' => 'CopySourceVersionId', 'location' => 'header', 'locationName' => 'x-amz-copy-source-version-id', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'SSEKMSEncryptionContext' => [ 'shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], 'payload' => 'CopyObjectResult', ], 'CopyObjectRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'CopySource', 'Key', ], 'members' => [ 'ACL' => [ 'shape' => 'ObjectCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl', ], 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'CacheControl' => [ 'shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-checksum-algorithm', ], 'ContentDisposition' => [ 'shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition', ], 'ContentEncoding' => [ 'shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding', ], 'ContentLanguage' => [ 'shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language', ], 'ContentType' => [ 'shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type', ], 'CopySource' => [ 'shape' => 'CopySource', 'contextParam' => [ 'name' => 'CopySource', ], 'location' => 'header', 'locationName' => 'x-amz-copy-source', ], 'CopySourceIfMatch' => [ 'shape' => 'CopySourceIfMatch', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-match', ], 'CopySourceIfModifiedSince' => [ 'shape' => 'CopySourceIfModifiedSince', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-modified-since', ], 'CopySourceIfNoneMatch' => [ 'shape' => 'CopySourceIfNoneMatch', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-none-match', ], 'CopySourceIfUnmodifiedSince' => [ 'shape' => 'CopySourceIfUnmodifiedSince', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-unmodified-since', ], 'Expires' => [ 'shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires', ], 'GrantFullControl' => [ 'shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control', ], 'GrantRead' => [ 'shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read', ], 'GrantReadACP' => [ 'shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp', ], 'GrantWriteACP' => [ 'shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp', ], 'IfMatch' => [ 'shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match', ], 'IfNoneMatch' => [ 'shape' => 'IfNoneMatch', 'location' => 'header', 'locationName' => 'If-None-Match', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'Metadata' => [ 'shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-', ], 'MetadataDirective' => [ 'shape' => 'MetadataDirective', 'location' => 'header', 'locationName' => 'x-amz-metadata-directive', ], 'TaggingDirective' => [ 'shape' => 'TaggingDirective', 'location' => 'header', 'locationName' => 'x-amz-tagging-directive', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'StorageClass' => [ 'shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class', ], 'WebsiteRedirectLocation' => [ 'shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'SSEKMSEncryptionContext' => [ 'shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'CopySourceSSECustomerAlgorithm' => [ 'shape' => 'CopySourceSSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-algorithm', ], 'CopySourceSSECustomerKey' => [ 'shape' => 'CopySourceSSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-key', ], 'CopySourceSSECustomerKeyMD5' => [ 'shape' => 'CopySourceSSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'Tagging' => [ 'shape' => 'TaggingHeader', 'location' => 'header', 'locationName' => 'x-amz-tagging', ], 'ObjectLockMode' => [ 'shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode', ], 'ObjectLockRetainUntilDate' => [ 'shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date', ], 'ObjectLockLegalHoldStatus' => [ 'shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'ExpectedSourceBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-source-expected-bucket-owner', ], ], ], 'CopyObjectResult' => [ 'type' => 'structure', 'members' => [ 'ETag' => [ 'shape' => 'ETag', ], 'LastModified' => [ 'shape' => 'LastModified', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', ], ], ], 'CopyPartResult' => [ 'type' => 'structure', 'members' => [ 'ETag' => [ 'shape' => 'ETag', ], 'LastModified' => [ 'shape' => 'LastModified', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', ], ], ], 'CopySource' => [ 'type' => 'string', 'pattern' => '\\/?.+\\/.+', ], 'CopySourceIfMatch' => [ 'type' => 'string', ], 'CopySourceIfModifiedSince' => [ 'type' => 'timestamp', ], 'CopySourceIfNoneMatch' => [ 'type' => 'string', ], 'CopySourceIfUnmodifiedSince' => [ 'type' => 'timestamp', ], 'CopySourceRange' => [ 'type' => 'string', ], 'CopySourceSSECustomerAlgorithm' => [ 'type' => 'string', ], 'CopySourceSSECustomerKey' => [ 'type' => 'string', 'sensitive' => true, ], 'CopySourceSSECustomerKeyMD5' => [ 'type' => 'string', ], 'CopySourceVersionId' => [ 'type' => 'string', ], 'CreateBucketConfiguration' => [ 'type' => 'structure', 'members' => [ 'LocationConstraint' => [ 'shape' => 'BucketLocationConstraint', ], 'Location' => [ 'shape' => 'LocationInfo', ], 'Bucket' => [ 'shape' => 'BucketInfo', ], 'Tags' => [ 'shape' => 'TagSet', ], ], ], 'CreateBucketMetadataConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'MetadataConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'MetadataConfiguration' => [ 'shape' => 'MetadataConfiguration', 'locationName' => 'MetadataConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'MetadataConfiguration', ], 'CreateBucketMetadataTableConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'MetadataTableConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'MetadataTableConfiguration' => [ 'shape' => 'MetadataTableConfiguration', 'locationName' => 'MetadataTableConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'MetadataTableConfiguration', ], 'CreateBucketOutput' => [ 'type' => 'structure', 'members' => [ 'Location' => [ 'shape' => 'Location', 'location' => 'header', 'locationName' => 'Location', ], 'BucketArn' => [ 'shape' => 'S3RegionalOrS3ExpressBucketArnString', 'location' => 'header', 'locationName' => 'x-amz-bucket-arn', ], ], ], 'CreateBucketRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'ACL' => [ 'shape' => 'BucketCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl', ], 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'CreateBucketConfiguration' => [ 'shape' => 'CreateBucketConfiguration', 'locationName' => 'CreateBucketConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'GrantFullControl' => [ 'shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control', ], 'GrantRead' => [ 'shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read', ], 'GrantReadACP' => [ 'shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp', ], 'GrantWrite' => [ 'shape' => 'GrantWrite', 'location' => 'header', 'locationName' => 'x-amz-grant-write', ], 'GrantWriteACP' => [ 'shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp', ], 'ObjectLockEnabledForBucket' => [ 'shape' => 'ObjectLockEnabledForBucket', 'location' => 'header', 'locationName' => 'x-amz-bucket-object-lock-enabled', ], 'ObjectOwnership' => [ 'shape' => 'ObjectOwnership', 'location' => 'header', 'locationName' => 'x-amz-object-ownership', ], ], 'payload' => 'CreateBucketConfiguration', ], 'CreateMultipartUploadOutput' => [ 'type' => 'structure', 'members' => [ 'AbortDate' => [ 'shape' => 'AbortDate', 'location' => 'header', 'locationName' => 'x-amz-abort-date', ], 'AbortRuleId' => [ 'shape' => 'AbortRuleId', 'location' => 'header', 'locationName' => 'x-amz-abort-rule-id', ], 'Bucket' => [ 'shape' => 'BucketName', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', ], 'UploadId' => [ 'shape' => 'MultipartUploadId', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'SSEKMSEncryptionContext' => [ 'shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-checksum-algorithm', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', 'location' => 'header', 'locationName' => 'x-amz-checksum-type', ], ], ], 'CreateMultipartUploadRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'ACL' => [ 'shape' => 'ObjectCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl', ], 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'CacheControl' => [ 'shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control', ], 'ContentDisposition' => [ 'shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition', ], 'ContentEncoding' => [ 'shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding', ], 'ContentLanguage' => [ 'shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language', ], 'ContentType' => [ 'shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type', ], 'Expires' => [ 'shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires', ], 'GrantFullControl' => [ 'shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control', ], 'GrantRead' => [ 'shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read', ], 'GrantReadACP' => [ 'shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp', ], 'GrantWriteACP' => [ 'shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'Metadata' => [ 'shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'StorageClass' => [ 'shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class', ], 'WebsiteRedirectLocation' => [ 'shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'SSEKMSEncryptionContext' => [ 'shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'Tagging' => [ 'shape' => 'TaggingHeader', 'location' => 'header', 'locationName' => 'x-amz-tagging', ], 'ObjectLockMode' => [ 'shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode', ], 'ObjectLockRetainUntilDate' => [ 'shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date', ], 'ObjectLockLegalHoldStatus' => [ 'shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-checksum-algorithm', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', 'location' => 'header', 'locationName' => 'x-amz-checksum-type', ], ], ], 'CreateSessionOutput' => [ 'type' => 'structure', 'required' => [ 'Credentials', ], 'members' => [ 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'SSEKMSEncryptionContext' => [ 'shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'Credentials' => [ 'shape' => 'SessionCredentials', 'locationName' => 'Credentials', ], ], ], 'CreateSessionRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'SessionMode' => [ 'shape' => 'SessionMode', 'location' => 'header', 'locationName' => 'x-amz-create-session-mode', ], 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'SSEKMSEncryptionContext' => [ 'shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], ], ], 'CreationDate' => [ 'type' => 'timestamp', ], 'DataRedundancy' => [ 'type' => 'string', 'enum' => [ 'SingleAvailabilityZone', 'SingleLocalZone', ], ], 'Date' => [ 'type' => 'timestamp', 'timestampFormat' => 'iso8601', ], 'Days' => [ 'type' => 'integer', 'box' => true, ], 'DaysAfterInitiation' => [ 'type' => 'integer', 'box' => true, ], 'DefaultRetention' => [ 'type' => 'structure', 'members' => [ 'Mode' => [ 'shape' => 'ObjectLockRetentionMode', ], 'Days' => [ 'shape' => 'Days', ], 'Years' => [ 'shape' => 'Years', ], ], ], 'Delete' => [ 'type' => 'structure', 'required' => [ 'Objects', ], 'members' => [ 'Objects' => [ 'shape' => 'ObjectIdentifierList', 'locationName' => 'Object', ], 'Quiet' => [ 'shape' => 'Quiet', ], ], ], 'DeleteBucketAnalyticsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'AnalyticsId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketCorsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketEncryptionRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketIntelligentTieringConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'IntelligentTieringId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketInventoryConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'InventoryId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketLifecycleRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketMetadataConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketMetadataTableConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketMetricsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'MetricsId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketOwnershipControlsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketPolicyRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketReplicationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketTaggingRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteBucketWebsiteRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteMarker' => [ 'type' => 'boolean', ], 'DeleteMarkerEntry' => [ 'type' => 'structure', 'members' => [ 'Owner' => [ 'shape' => 'Owner', ], 'Key' => [ 'shape' => 'ObjectKey', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', ], 'IsLatest' => [ 'shape' => 'IsLatest', ], 'LastModified' => [ 'shape' => 'LastModified', ], ], ], 'DeleteMarkerReplication' => [ 'type' => 'structure', 'members' => [ 'Status' => [ 'shape' => 'DeleteMarkerReplicationStatus', ], ], ], 'DeleteMarkerReplicationStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'DeleteMarkerVersionId' => [ 'type' => 'string', ], 'DeleteMarkers' => [ 'type' => 'list', 'member' => [ 'shape' => 'DeleteMarkerEntry', ], 'flattened' => true, ], 'DeleteObjectOutput' => [ 'type' => 'structure', 'members' => [ 'DeleteMarker' => [ 'shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-delete-marker', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'DeleteObjectRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'MFA' => [ 'shape' => 'MFA', 'location' => 'header', 'locationName' => 'x-amz-mfa', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'BypassGovernanceRetention' => [ 'shape' => 'BypassGovernanceRetention', 'location' => 'header', 'locationName' => 'x-amz-bypass-governance-retention', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'IfMatch' => [ 'shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match', ], 'IfMatchLastModifiedTime' => [ 'shape' => 'IfMatchLastModifiedTime', 'location' => 'header', 'locationName' => 'x-amz-if-match-last-modified-time', ], 'IfMatchSize' => [ 'shape' => 'IfMatchSize', 'location' => 'header', 'locationName' => 'x-amz-if-match-size', ], ], ], 'DeleteObjectTaggingOutput' => [ 'type' => 'structure', 'members' => [ 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], ], ], 'DeleteObjectTaggingRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeleteObjectsOutput' => [ 'type' => 'structure', 'members' => [ 'Deleted' => [ 'shape' => 'DeletedObjects', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], 'Errors' => [ 'shape' => 'Errors', 'locationName' => 'Error', ], ], ], 'DeleteObjectsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Delete', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Delete' => [ 'shape' => 'Delete', 'locationName' => 'Delete', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'MFA' => [ 'shape' => 'MFA', 'location' => 'header', 'locationName' => 'x-amz-mfa', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'BypassGovernanceRetention' => [ 'shape' => 'BypassGovernanceRetention', 'location' => 'header', 'locationName' => 'x-amz-bypass-governance-retention', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], ], 'payload' => 'Delete', ], 'DeletePublicAccessBlockRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'DeletedObject' => [ 'type' => 'structure', 'members' => [ 'Key' => [ 'shape' => 'ObjectKey', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', ], 'DeleteMarker' => [ 'shape' => 'DeleteMarker', ], 'DeleteMarkerVersionId' => [ 'shape' => 'DeleteMarkerVersionId', ], ], ], 'DeletedObjects' => [ 'type' => 'list', 'member' => [ 'shape' => 'DeletedObject', ], 'flattened' => true, ], 'Delimiter' => [ 'type' => 'string', ], 'Description' => [ 'type' => 'string', ], 'Destination' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', ], 'Account' => [ 'shape' => 'AccountId', ], 'StorageClass' => [ 'shape' => 'StorageClass', ], 'AccessControlTranslation' => [ 'shape' => 'AccessControlTranslation', ], 'EncryptionConfiguration' => [ 'shape' => 'EncryptionConfiguration', ], 'ReplicationTime' => [ 'shape' => 'ReplicationTime', ], 'Metrics' => [ 'shape' => 'Metrics', ], ], ], 'DestinationResult' => [ 'type' => 'structure', 'members' => [ 'TableBucketType' => [ 'shape' => 'S3TablesBucketType', ], 'TableBucketArn' => [ 'shape' => 'S3TablesBucketArn', ], 'TableNamespace' => [ 'shape' => 'S3TablesNamespace', ], ], ], 'DirectoryBucketToken' => [ 'type' => 'string', 'max' => 1024, 'min' => 0, ], 'DisplayName' => [ 'type' => 'string', ], 'ETag' => [ 'type' => 'string', ], 'EmailAddress' => [ 'type' => 'string', ], 'EnableRequestProgress' => [ 'type' => 'boolean', 'box' => true, ], 'EncodingType' => [ 'type' => 'string', 'enum' => [ 'url', ], ], 'Encryption' => [ 'type' => 'structure', 'required' => [ 'EncryptionType', ], 'members' => [ 'EncryptionType' => [ 'shape' => 'ServerSideEncryption', ], 'KMSKeyId' => [ 'shape' => 'SSEKMSKeyId', ], 'KMSContext' => [ 'shape' => 'KMSContext', ], ], ], 'EncryptionConfiguration' => [ 'type' => 'structure', 'members' => [ 'ReplicaKmsKeyID' => [ 'shape' => 'ReplicaKmsKeyID', ], ], ], 'EncryptionType' => [ 'type' => 'string', 'enum' => [ 'NONE', 'SSE-C', ], ], 'EncryptionTypeList' => [ 'type' => 'list', 'member' => [ 'shape' => 'EncryptionType', 'locationName' => 'EncryptionType', ], 'flattened' => true, ], 'EncryptionTypeMismatch' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 400, ], 'exception' => true, ], 'End' => [ 'type' => 'long', 'box' => true, ], 'EndEvent' => [ 'type' => 'structure', 'members' => [], 'event' => true, ], 'Error' => [ 'type' => 'structure', 'members' => [ 'Key' => [ 'shape' => 'ObjectKey', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', ], 'Code' => [ 'shape' => 'Code', ], 'Message' => [ 'shape' => 'Message', ], ], ], 'ErrorCode' => [ 'type' => 'string', ], 'ErrorDetails' => [ 'type' => 'structure', 'members' => [ 'ErrorCode' => [ 'shape' => 'ErrorCode', ], 'ErrorMessage' => [ 'shape' => 'ErrorMessage', ], ], ], 'ErrorDocument' => [ 'type' => 'structure', 'required' => [ 'Key', ], 'members' => [ 'Key' => [ 'shape' => 'ObjectKey', ], ], ], 'ErrorMessage' => [ 'type' => 'string', ], 'Errors' => [ 'type' => 'list', 'member' => [ 'shape' => 'Error', ], 'flattened' => true, ], 'Event' => [ 'type' => 'string', 'enum' => [ 's3:ReducedRedundancyLostObject', 's3:ObjectCreated:*', 's3:ObjectCreated:Put', 's3:ObjectCreated:Post', 's3:ObjectCreated:Copy', 's3:ObjectCreated:CompleteMultipartUpload', 's3:ObjectRemoved:*', 's3:ObjectRemoved:Delete', 's3:ObjectRemoved:DeleteMarkerCreated', 's3:ObjectRestore:*', 's3:ObjectRestore:Post', 's3:ObjectRestore:Completed', 's3:Replication:*', 's3:Replication:OperationFailedReplication', 's3:Replication:OperationNotTracked', 's3:Replication:OperationMissedThreshold', 's3:Replication:OperationReplicatedAfterThreshold', 's3:ObjectRestore:Delete', 's3:LifecycleTransition', 's3:IntelligentTiering', 's3:ObjectAcl:Put', 's3:LifecycleExpiration:*', 's3:LifecycleExpiration:Delete', 's3:LifecycleExpiration:DeleteMarkerCreated', 's3:ObjectTagging:*', 's3:ObjectTagging:Put', 's3:ObjectTagging:Delete', ], ], 'EventBridgeConfiguration' => [ 'type' => 'structure', 'members' => [], ], 'EventList' => [ 'type' => 'list', 'member' => [ 'shape' => 'Event', ], 'flattened' => true, ], 'ExistingObjectReplication' => [ 'type' => 'structure', 'required' => [ 'Status', ], 'members' => [ 'Status' => [ 'shape' => 'ExistingObjectReplicationStatus', ], ], ], 'ExistingObjectReplicationStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'Expiration' => [ 'type' => 'string', ], 'ExpirationState' => [ 'type' => 'string', 'enum' => [ 'ENABLED', 'DISABLED', ], ], 'ExpirationStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'ExpiredObjectDeleteMarker' => [ 'type' => 'boolean', 'box' => true, ], 'Expires' => [ 'type' => 'string', ], 'ExposeHeader' => [ 'type' => 'string', ], 'ExposeHeaders' => [ 'type' => 'list', 'member' => [ 'shape' => 'ExposeHeader', ], 'flattened' => true, ], 'Expression' => [ 'type' => 'string', ], 'ExpressionType' => [ 'type' => 'string', 'enum' => [ 'SQL', ], ], 'FetchOwner' => [ 'type' => 'boolean', 'box' => true, ], 'FieldDelimiter' => [ 'type' => 'string', ], 'FileHeaderInfo' => [ 'type' => 'string', 'enum' => [ 'USE', 'IGNORE', 'NONE', ], ], 'FilterRule' => [ 'type' => 'structure', 'members' => [ 'Name' => [ 'shape' => 'FilterRuleName', ], 'Value' => [ 'shape' => 'FilterRuleValue', ], ], ], 'FilterRuleList' => [ 'type' => 'list', 'member' => [ 'shape' => 'FilterRule', ], 'flattened' => true, ], 'FilterRuleName' => [ 'type' => 'string', 'enum' => [ 'prefix', 'suffix', ], ], 'FilterRuleValue' => [ 'type' => 'string', ], 'GetBucketAbacOutput' => [ 'type' => 'structure', 'members' => [ 'AbacStatus' => [ 'shape' => 'AbacStatus', ], ], 'payload' => 'AbacStatus', ], 'GetBucketAbacRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketAccelerateConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'Status' => [ 'shape' => 'BucketAccelerateStatus', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'GetBucketAccelerateConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], ], ], 'GetBucketAclOutput' => [ 'type' => 'structure', 'members' => [ 'Owner' => [ 'shape' => 'Owner', ], 'Grants' => [ 'shape' => 'Grants', 'locationName' => 'AccessControlList', ], ], ], 'GetBucketAclRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketAnalyticsConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'AnalyticsConfiguration' => [ 'shape' => 'AnalyticsConfiguration', ], ], 'payload' => 'AnalyticsConfiguration', ], 'GetBucketAnalyticsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'AnalyticsId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketCorsOutput' => [ 'type' => 'structure', 'members' => [ 'CORSRules' => [ 'shape' => 'CORSRules', 'locationName' => 'CORSRule', ], ], ], 'GetBucketCorsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketEncryptionOutput' => [ 'type' => 'structure', 'members' => [ 'ServerSideEncryptionConfiguration' => [ 'shape' => 'ServerSideEncryptionConfiguration', ], ], 'payload' => 'ServerSideEncryptionConfiguration', ], 'GetBucketEncryptionRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketIntelligentTieringConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'IntelligentTieringConfiguration' => [ 'shape' => 'IntelligentTieringConfiguration', ], ], 'payload' => 'IntelligentTieringConfiguration', ], 'GetBucketIntelligentTieringConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'IntelligentTieringId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketInventoryConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'InventoryConfiguration' => [ 'shape' => 'InventoryConfiguration', ], ], 'payload' => 'InventoryConfiguration', ], 'GetBucketInventoryConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'InventoryId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketLifecycleConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'Rules' => [ 'shape' => 'LifecycleRules', 'locationName' => 'Rule', ], 'TransitionDefaultMinimumObjectSize' => [ 'shape' => 'TransitionDefaultMinimumObjectSize', 'location' => 'header', 'locationName' => 'x-amz-transition-default-minimum-object-size', ], ], ], 'GetBucketLifecycleConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketLifecycleOutput' => [ 'type' => 'structure', 'members' => [ 'Rules' => [ 'shape' => 'Rules', 'locationName' => 'Rule', ], ], ], 'GetBucketLifecycleRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketLocationOutput' => [ 'type' => 'structure', 'members' => [ 'LocationConstraint' => [ 'shape' => 'BucketLocationConstraint', ], ], ], 'GetBucketLocationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketLoggingOutput' => [ 'type' => 'structure', 'members' => [ 'LoggingEnabled' => [ 'shape' => 'LoggingEnabled', ], ], ], 'GetBucketLoggingRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketMetadataConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'GetBucketMetadataConfigurationResult' => [ 'shape' => 'GetBucketMetadataConfigurationResult', ], ], 'payload' => 'GetBucketMetadataConfigurationResult', ], 'GetBucketMetadataConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketMetadataConfigurationResult' => [ 'type' => 'structure', 'required' => [ 'MetadataConfigurationResult', ], 'members' => [ 'MetadataConfigurationResult' => [ 'shape' => 'MetadataConfigurationResult', ], ], ], 'GetBucketMetadataTableConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'GetBucketMetadataTableConfigurationResult' => [ 'shape' => 'GetBucketMetadataTableConfigurationResult', ], ], 'payload' => 'GetBucketMetadataTableConfigurationResult', ], 'GetBucketMetadataTableConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketMetadataTableConfigurationResult' => [ 'type' => 'structure', 'required' => [ 'MetadataTableConfigurationResult', 'Status', ], 'members' => [ 'MetadataTableConfigurationResult' => [ 'shape' => 'MetadataTableConfigurationResult', ], 'Status' => [ 'shape' => 'MetadataTableStatus', ], 'Error' => [ 'shape' => 'ErrorDetails', ], ], ], 'GetBucketMetricsConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'MetricsConfiguration' => [ 'shape' => 'MetricsConfiguration', ], ], 'payload' => 'MetricsConfiguration', ], 'GetBucketMetricsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'MetricsId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketNotificationConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketOwnershipControlsOutput' => [ 'type' => 'structure', 'members' => [ 'OwnershipControls' => [ 'shape' => 'OwnershipControls', ], ], 'payload' => 'OwnershipControls', ], 'GetBucketOwnershipControlsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketPolicyOutput' => [ 'type' => 'structure', 'members' => [ 'Policy' => [ 'shape' => 'Policy', ], ], 'payload' => 'Policy', ], 'GetBucketPolicyRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketPolicyStatusOutput' => [ 'type' => 'structure', 'members' => [ 'PolicyStatus' => [ 'shape' => 'PolicyStatus', ], ], 'payload' => 'PolicyStatus', ], 'GetBucketPolicyStatusRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketReplicationOutput' => [ 'type' => 'structure', 'members' => [ 'ReplicationConfiguration' => [ 'shape' => 'ReplicationConfiguration', ], ], 'payload' => 'ReplicationConfiguration', ], 'GetBucketReplicationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketRequestPaymentOutput' => [ 'type' => 'structure', 'members' => [ 'Payer' => [ 'shape' => 'Payer', ], ], ], 'GetBucketRequestPaymentRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketTaggingOutput' => [ 'type' => 'structure', 'required' => [ 'TagSet', ], 'members' => [ 'TagSet' => [ 'shape' => 'TagSet', ], ], ], 'GetBucketTaggingRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketVersioningOutput' => [ 'type' => 'structure', 'members' => [ 'Status' => [ 'shape' => 'BucketVersioningStatus', ], 'MFADelete' => [ 'shape' => 'MFADeleteStatus', 'locationName' => 'MfaDelete', ], ], ], 'GetBucketVersioningRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetBucketWebsiteOutput' => [ 'type' => 'structure', 'members' => [ 'RedirectAllRequestsTo' => [ 'shape' => 'RedirectAllRequestsTo', ], 'IndexDocument' => [ 'shape' => 'IndexDocument', ], 'ErrorDocument' => [ 'shape' => 'ErrorDocument', ], 'RoutingRules' => [ 'shape' => 'RoutingRules', ], ], ], 'GetBucketWebsiteRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetObjectAclOutput' => [ 'type' => 'structure', 'members' => [ 'Owner' => [ 'shape' => 'Owner', ], 'Grants' => [ 'shape' => 'Grants', 'locationName' => 'AccessControlList', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'GetObjectAclRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetObjectAttributesOutput' => [ 'type' => 'structure', 'members' => [ 'DeleteMarker' => [ 'shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-delete-marker', ], 'LastModified' => [ 'shape' => 'LastModified', 'location' => 'header', 'locationName' => 'Last-Modified', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], 'ETag' => [ 'shape' => 'ETag', ], 'Checksum' => [ 'shape' => 'Checksum', ], 'ObjectParts' => [ 'shape' => 'GetObjectAttributesParts', ], 'StorageClass' => [ 'shape' => 'StorageClass', ], 'ObjectSize' => [ 'shape' => 'ObjectSize', ], ], ], 'GetObjectAttributesParts' => [ 'type' => 'structure', 'members' => [ 'TotalPartsCount' => [ 'shape' => 'PartsCount', 'locationName' => 'PartsCount', ], 'PartNumberMarker' => [ 'shape' => 'PartNumberMarker', ], 'NextPartNumberMarker' => [ 'shape' => 'NextPartNumberMarker', ], 'MaxParts' => [ 'shape' => 'MaxParts', ], 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'Parts' => [ 'shape' => 'PartsList', 'locationName' => 'Part', ], ], ], 'GetObjectAttributesRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', 'ObjectAttributes', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'MaxParts' => [ 'shape' => 'MaxParts', 'location' => 'header', 'locationName' => 'x-amz-max-parts', ], 'PartNumberMarker' => [ 'shape' => 'PartNumberMarker', 'location' => 'header', 'locationName' => 'x-amz-part-number-marker', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'ObjectAttributes' => [ 'shape' => 'ObjectAttributesList', 'location' => 'header', 'locationName' => 'x-amz-object-attributes', ], ], ], 'GetObjectLegalHoldOutput' => [ 'type' => 'structure', 'members' => [ 'LegalHold' => [ 'shape' => 'ObjectLockLegalHold', 'locationName' => 'LegalHold', ], ], 'payload' => 'LegalHold', ], 'GetObjectLegalHoldRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetObjectLockConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'ObjectLockConfiguration' => [ 'shape' => 'ObjectLockConfiguration', ], ], 'payload' => 'ObjectLockConfiguration', ], 'GetObjectLockConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetObjectOutput' => [ 'type' => 'structure', 'members' => [ 'Body' => [ 'shape' => 'Body', 'streaming' => true, ], 'DeleteMarker' => [ 'shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-delete-marker', ], 'AcceptRanges' => [ 'shape' => 'AcceptRanges', 'location' => 'header', 'locationName' => 'accept-ranges', ], 'Expiration' => [ 'shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration', ], 'Restore' => [ 'shape' => 'Restore', 'location' => 'header', 'locationName' => 'x-amz-restore', ], 'LastModified' => [ 'shape' => 'LastModified', 'location' => 'header', 'locationName' => 'Last-Modified', ], 'ContentLength' => [ 'shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length', ], 'ETag' => [ 'shape' => 'ETag', 'location' => 'header', 'locationName' => 'ETag', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc64nvme', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', 'location' => 'header', 'locationName' => 'x-amz-checksum-type', ], 'MissingMeta' => [ 'shape' => 'MissingMeta', 'location' => 'header', 'locationName' => 'x-amz-missing-meta', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], 'CacheControl' => [ 'shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control', ], 'ContentDisposition' => [ 'shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition', ], 'ContentEncoding' => [ 'shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding', ], 'ContentLanguage' => [ 'shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language', ], 'ContentRange' => [ 'shape' => 'ContentRange', 'location' => 'header', 'locationName' => 'Content-Range', ], 'ContentType' => [ 'shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type', ], 'Expires' => [ 'shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires', ], 'WebsiteRedirectLocation' => [ 'shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'Metadata' => [ 'shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'StorageClass' => [ 'shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], 'ReplicationStatus' => [ 'shape' => 'ReplicationStatus', 'location' => 'header', 'locationName' => 'x-amz-replication-status', ], 'PartsCount' => [ 'shape' => 'PartsCount', 'location' => 'header', 'locationName' => 'x-amz-mp-parts-count', ], 'TagCount' => [ 'shape' => 'TagCount', 'location' => 'header', 'locationName' => 'x-amz-tagging-count', ], 'ObjectLockMode' => [ 'shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode', ], 'ObjectLockRetainUntilDate' => [ 'shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date', ], 'ObjectLockLegalHoldStatus' => [ 'shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold', ], ], 'payload' => 'Body', ], 'GetObjectRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'IfMatch' => [ 'shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match', ], 'IfModifiedSince' => [ 'shape' => 'IfModifiedSince', 'location' => 'header', 'locationName' => 'If-Modified-Since', ], 'IfNoneMatch' => [ 'shape' => 'IfNoneMatch', 'location' => 'header', 'locationName' => 'If-None-Match', ], 'IfUnmodifiedSince' => [ 'shape' => 'IfUnmodifiedSince', 'location' => 'header', 'locationName' => 'If-Unmodified-Since', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'Range' => [ 'shape' => 'Range', 'location' => 'header', 'locationName' => 'Range', ], 'ResponseCacheControl' => [ 'shape' => 'ResponseCacheControl', 'location' => 'querystring', 'locationName' => 'response-cache-control', ], 'ResponseContentDisposition' => [ 'shape' => 'ResponseContentDisposition', 'location' => 'querystring', 'locationName' => 'response-content-disposition', ], 'ResponseContentEncoding' => [ 'shape' => 'ResponseContentEncoding', 'location' => 'querystring', 'locationName' => 'response-content-encoding', ], 'ResponseContentLanguage' => [ 'shape' => 'ResponseContentLanguage', 'location' => 'querystring', 'locationName' => 'response-content-language', ], 'ResponseContentType' => [ 'shape' => 'ResponseContentType', 'location' => 'querystring', 'locationName' => 'response-content-type', ], 'ResponseExpires' => [ 'shape' => 'ResponseExpires', 'location' => 'querystring', 'locationName' => 'response-expires', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'PartNumber' => [ 'shape' => 'PartNumber', 'location' => 'querystring', 'locationName' => 'partNumber', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'ChecksumMode' => [ 'shape' => 'ChecksumMode', 'location' => 'header', 'locationName' => 'x-amz-checksum-mode', ], ], ], 'GetObjectResponseStatusCode' => [ 'type' => 'integer', 'box' => true, ], 'GetObjectRetentionOutput' => [ 'type' => 'structure', 'members' => [ 'Retention' => [ 'shape' => 'ObjectLockRetention', 'locationName' => 'Retention', ], ], 'payload' => 'Retention', ], 'GetObjectRetentionRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetObjectTaggingOutput' => [ 'type' => 'structure', 'required' => [ 'TagSet', ], 'members' => [ 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], 'TagSet' => [ 'shape' => 'TagSet', ], ], ], 'GetObjectTaggingRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], ], ], 'GetObjectTorrentOutput' => [ 'type' => 'structure', 'members' => [ 'Body' => [ 'shape' => 'Body', 'streaming' => true, ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], 'payload' => 'Body', ], 'GetObjectTorrentRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GetPublicAccessBlockOutput' => [ 'type' => 'structure', 'members' => [ 'PublicAccessBlockConfiguration' => [ 'shape' => 'PublicAccessBlockConfiguration', ], ], 'payload' => 'PublicAccessBlockConfiguration', ], 'GetPublicAccessBlockRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'GlacierJobParameters' => [ 'type' => 'structure', 'required' => [ 'Tier', ], 'members' => [ 'Tier' => [ 'shape' => 'Tier', ], ], ], 'Grant' => [ 'type' => 'structure', 'members' => [ 'Grantee' => [ 'shape' => 'Grantee', ], 'Permission' => [ 'shape' => 'Permission', ], ], ], 'GrantFullControl' => [ 'type' => 'string', ], 'GrantRead' => [ 'type' => 'string', ], 'GrantReadACP' => [ 'type' => 'string', ], 'GrantWrite' => [ 'type' => 'string', ], 'GrantWriteACP' => [ 'type' => 'string', ], 'Grantee' => [ 'type' => 'structure', 'required' => [ 'Type', ], 'members' => [ 'DisplayName' => [ 'shape' => 'DisplayName', ], 'EmailAddress' => [ 'shape' => 'EmailAddress', ], 'ID' => [ 'shape' => 'ID', ], 'Type' => [ 'shape' => 'Type', 'locationName' => 'xsi:type', 'xmlAttribute' => true, ], 'URI' => [ 'shape' => 'URI', ], ], 'xmlNamespace' => [ 'prefix' => 'xsi', 'uri' => 'http://www.w3.org/2001/XMLSchema-instance', ], ], 'Grants' => [ 'type' => 'list', 'member' => [ 'shape' => 'Grant', 'locationName' => 'Grant', ], ], 'HeadBucketOutput' => [ 'type' => 'structure', 'members' => [ 'BucketArn' => [ 'shape' => 'S3RegionalOrS3ExpressBucketArnString', 'location' => 'header', 'locationName' => 'x-amz-bucket-arn', ], 'BucketLocationType' => [ 'shape' => 'LocationType', 'location' => 'header', 'locationName' => 'x-amz-bucket-location-type', ], 'BucketLocationName' => [ 'shape' => 'BucketLocationName', 'location' => 'header', 'locationName' => 'x-amz-bucket-location-name', ], 'BucketRegion' => [ 'shape' => 'Region', 'location' => 'header', 'locationName' => 'x-amz-bucket-region', ], 'AccessPointAlias' => [ 'shape' => 'AccessPointAlias', 'location' => 'header', 'locationName' => 'x-amz-access-point-alias', ], ], ], 'HeadBucketRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'HeadObjectOutput' => [ 'type' => 'structure', 'members' => [ 'DeleteMarker' => [ 'shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-delete-marker', ], 'AcceptRanges' => [ 'shape' => 'AcceptRanges', 'location' => 'header', 'locationName' => 'accept-ranges', ], 'Expiration' => [ 'shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration', ], 'Restore' => [ 'shape' => 'Restore', 'location' => 'header', 'locationName' => 'x-amz-restore', ], 'ArchiveStatus' => [ 'shape' => 'ArchiveStatus', 'location' => 'header', 'locationName' => 'x-amz-archive-status', ], 'LastModified' => [ 'shape' => 'LastModified', 'location' => 'header', 'locationName' => 'Last-Modified', ], 'ContentLength' => [ 'shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc64nvme', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', 'location' => 'header', 'locationName' => 'x-amz-checksum-type', ], 'ETag' => [ 'shape' => 'ETag', 'location' => 'header', 'locationName' => 'ETag', ], 'MissingMeta' => [ 'shape' => 'MissingMeta', 'location' => 'header', 'locationName' => 'x-amz-missing-meta', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], 'CacheControl' => [ 'shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control', ], 'ContentDisposition' => [ 'shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition', ], 'ContentEncoding' => [ 'shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding', ], 'ContentLanguage' => [ 'shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language', ], 'ContentType' => [ 'shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type', ], 'ContentRange' => [ 'shape' => 'ContentRange', 'location' => 'header', 'locationName' => 'Content-Range', ], 'Expires' => [ 'shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires', ], 'WebsiteRedirectLocation' => [ 'shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'Metadata' => [ 'shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'StorageClass' => [ 'shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], 'ReplicationStatus' => [ 'shape' => 'ReplicationStatus', 'location' => 'header', 'locationName' => 'x-amz-replication-status', ], 'PartsCount' => [ 'shape' => 'PartsCount', 'location' => 'header', 'locationName' => 'x-amz-mp-parts-count', ], 'TagCount' => [ 'shape' => 'TagCount', 'location' => 'header', 'locationName' => 'x-amz-tagging-count', ], 'ObjectLockMode' => [ 'shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode', ], 'ObjectLockRetainUntilDate' => [ 'shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date', ], 'ObjectLockLegalHoldStatus' => [ 'shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold', ], ], ], 'HeadObjectRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'IfMatch' => [ 'shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match', ], 'IfModifiedSince' => [ 'shape' => 'IfModifiedSince', 'location' => 'header', 'locationName' => 'If-Modified-Since', ], 'IfNoneMatch' => [ 'shape' => 'IfNoneMatch', 'location' => 'header', 'locationName' => 'If-None-Match', ], 'IfUnmodifiedSince' => [ 'shape' => 'IfUnmodifiedSince', 'location' => 'header', 'locationName' => 'If-Unmodified-Since', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'Range' => [ 'shape' => 'Range', 'location' => 'header', 'locationName' => 'Range', ], 'ResponseCacheControl' => [ 'shape' => 'ResponseCacheControl', 'location' => 'querystring', 'locationName' => 'response-cache-control', ], 'ResponseContentDisposition' => [ 'shape' => 'ResponseContentDisposition', 'location' => 'querystring', 'locationName' => 'response-content-disposition', ], 'ResponseContentEncoding' => [ 'shape' => 'ResponseContentEncoding', 'location' => 'querystring', 'locationName' => 'response-content-encoding', ], 'ResponseContentLanguage' => [ 'shape' => 'ResponseContentLanguage', 'location' => 'querystring', 'locationName' => 'response-content-language', ], 'ResponseContentType' => [ 'shape' => 'ResponseContentType', 'location' => 'querystring', 'locationName' => 'response-content-type', ], 'ResponseExpires' => [ 'shape' => 'ResponseExpires', 'location' => 'querystring', 'locationName' => 'response-expires', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'PartNumber' => [ 'shape' => 'PartNumber', 'location' => 'querystring', 'locationName' => 'partNumber', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'ChecksumMode' => [ 'shape' => 'ChecksumMode', 'location' => 'header', 'locationName' => 'x-amz-checksum-mode', ], ], ], 'HostName' => [ 'type' => 'string', ], 'HttpErrorCodeReturnedEquals' => [ 'type' => 'string', ], 'HttpRedirectCode' => [ 'type' => 'string', ], 'ID' => [ 'type' => 'string', ], 'IdempotencyParameterMismatch' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 400, ], 'exception' => true, ], 'IfMatch' => [ 'type' => 'string', ], 'IfMatchInitiatedTime' => [ 'type' => 'timestamp', 'timestampFormat' => 'rfc822', ], 'IfMatchLastModifiedTime' => [ 'type' => 'timestamp', 'timestampFormat' => 'rfc822', ], 'IfMatchSize' => [ 'type' => 'long', 'box' => true, ], 'IfModifiedSince' => [ 'type' => 'timestamp', ], 'IfNoneMatch' => [ 'type' => 'string', ], 'IfUnmodifiedSince' => [ 'type' => 'timestamp', ], 'IndexDocument' => [ 'type' => 'structure', 'required' => [ 'Suffix', ], 'members' => [ 'Suffix' => [ 'shape' => 'Suffix', ], ], ], 'Initiated' => [ 'type' => 'timestamp', ], 'Initiator' => [ 'type' => 'structure', 'members' => [ 'ID' => [ 'shape' => 'ID', ], 'DisplayName' => [ 'shape' => 'DisplayName', ], ], ], 'InputSerialization' => [ 'type' => 'structure', 'members' => [ 'CSV' => [ 'shape' => 'CSVInput', ], 'CompressionType' => [ 'shape' => 'CompressionType', ], 'JSON' => [ 'shape' => 'JSONInput', ], 'Parquet' => [ 'shape' => 'ParquetInput', ], ], ], 'IntelligentTieringAccessTier' => [ 'type' => 'string', 'enum' => [ 'ARCHIVE_ACCESS', 'DEEP_ARCHIVE_ACCESS', ], ], 'IntelligentTieringAndOperator' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tags' => [ 'shape' => 'TagSet', 'flattened' => true, 'locationName' => 'Tag', ], ], ], 'IntelligentTieringConfiguration' => [ 'type' => 'structure', 'required' => [ 'Id', 'Status', 'Tierings', ], 'members' => [ 'Id' => [ 'shape' => 'IntelligentTieringId', ], 'Filter' => [ 'shape' => 'IntelligentTieringFilter', ], 'Status' => [ 'shape' => 'IntelligentTieringStatus', ], 'Tierings' => [ 'shape' => 'TieringList', 'locationName' => 'Tiering', ], ], ], 'IntelligentTieringConfigurationList' => [ 'type' => 'list', 'member' => [ 'shape' => 'IntelligentTieringConfiguration', ], 'flattened' => true, ], 'IntelligentTieringDays' => [ 'type' => 'integer', 'box' => true, ], 'IntelligentTieringFilter' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tag' => [ 'shape' => 'Tag', ], 'And' => [ 'shape' => 'IntelligentTieringAndOperator', ], ], ], 'IntelligentTieringId' => [ 'type' => 'string', ], 'IntelligentTieringStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'InvalidObjectState' => [ 'type' => 'structure', 'members' => [ 'StorageClass' => [ 'shape' => 'StorageClass', ], 'AccessTier' => [ 'shape' => 'IntelligentTieringAccessTier', ], ], 'error' => [ 'httpStatusCode' => 403, ], 'exception' => true, ], 'InvalidRequest' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 400, ], 'exception' => true, ], 'InvalidWriteOffset' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 400, ], 'exception' => true, ], 'InventoryConfiguration' => [ 'type' => 'structure', 'required' => [ 'Destination', 'IsEnabled', 'Id', 'IncludedObjectVersions', 'Schedule', ], 'members' => [ 'Destination' => [ 'shape' => 'InventoryDestination', ], 'IsEnabled' => [ 'shape' => 'IsEnabled', ], 'Filter' => [ 'shape' => 'InventoryFilter', ], 'Id' => [ 'shape' => 'InventoryId', ], 'IncludedObjectVersions' => [ 'shape' => 'InventoryIncludedObjectVersions', ], 'OptionalFields' => [ 'shape' => 'InventoryOptionalFields', ], 'Schedule' => [ 'shape' => 'InventorySchedule', ], ], ], 'InventoryConfigurationList' => [ 'type' => 'list', 'member' => [ 'shape' => 'InventoryConfiguration', ], 'flattened' => true, ], 'InventoryConfigurationState' => [ 'type' => 'string', 'enum' => [ 'ENABLED', 'DISABLED', ], ], 'InventoryDestination' => [ 'type' => 'structure', 'required' => [ 'S3BucketDestination', ], 'members' => [ 'S3BucketDestination' => [ 'shape' => 'InventoryS3BucketDestination', ], ], ], 'InventoryEncryption' => [ 'type' => 'structure', 'members' => [ 'SSES3' => [ 'shape' => 'SSES3', 'locationName' => 'SSE-S3', ], 'SSEKMS' => [ 'shape' => 'SSEKMS', 'locationName' => 'SSE-KMS', ], ], ], 'InventoryFilter' => [ 'type' => 'structure', 'required' => [ 'Prefix', ], 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], ], ], 'InventoryFormat' => [ 'type' => 'string', 'enum' => [ 'CSV', 'ORC', 'Parquet', ], ], 'InventoryFrequency' => [ 'type' => 'string', 'enum' => [ 'Daily', 'Weekly', ], ], 'InventoryId' => [ 'type' => 'string', ], 'InventoryIncludedObjectVersions' => [ 'type' => 'string', 'enum' => [ 'All', 'Current', ], ], 'InventoryOptionalField' => [ 'type' => 'string', 'enum' => [ 'Size', 'LastModifiedDate', 'StorageClass', 'ETag', 'IsMultipartUploaded', 'ReplicationStatus', 'EncryptionStatus', 'ObjectLockRetainUntilDate', 'ObjectLockMode', 'ObjectLockLegalHoldStatus', 'IntelligentTieringAccessTier', 'BucketKeyStatus', 'ChecksumAlgorithm', 'ObjectAccessControlList', 'ObjectOwner', ], ], 'InventoryOptionalFields' => [ 'type' => 'list', 'member' => [ 'shape' => 'InventoryOptionalField', 'locationName' => 'Field', ], ], 'InventoryS3BucketDestination' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Format', ], 'members' => [ 'AccountId' => [ 'shape' => 'AccountId', ], 'Bucket' => [ 'shape' => 'BucketName', ], 'Format' => [ 'shape' => 'InventoryFormat', ], 'Prefix' => [ 'shape' => 'Prefix', ], 'Encryption' => [ 'shape' => 'InventoryEncryption', ], ], ], 'InventorySchedule' => [ 'type' => 'structure', 'required' => [ 'Frequency', ], 'members' => [ 'Frequency' => [ 'shape' => 'InventoryFrequency', ], ], ], 'InventoryTableConfiguration' => [ 'type' => 'structure', 'required' => [ 'ConfigurationState', ], 'members' => [ 'ConfigurationState' => [ 'shape' => 'InventoryConfigurationState', ], 'EncryptionConfiguration' => [ 'shape' => 'MetadataTableEncryptionConfiguration', ], ], ], 'InventoryTableConfigurationResult' => [ 'type' => 'structure', 'required' => [ 'ConfigurationState', ], 'members' => [ 'ConfigurationState' => [ 'shape' => 'InventoryConfigurationState', ], 'TableStatus' => [ 'shape' => 'MetadataTableStatus', ], 'Error' => [ 'shape' => 'ErrorDetails', ], 'TableName' => [ 'shape' => 'S3TablesName', ], 'TableArn' => [ 'shape' => 'S3TablesArn', ], ], ], 'InventoryTableConfigurationUpdates' => [ 'type' => 'structure', 'required' => [ 'ConfigurationState', ], 'members' => [ 'ConfigurationState' => [ 'shape' => 'InventoryConfigurationState', ], 'EncryptionConfiguration' => [ 'shape' => 'MetadataTableEncryptionConfiguration', ], ], ], 'IsEnabled' => [ 'type' => 'boolean', 'box' => true, ], 'IsLatest' => [ 'type' => 'boolean', 'box' => true, ], 'IsPublic' => [ 'type' => 'boolean', 'box' => true, ], 'IsRestoreInProgress' => [ 'type' => 'boolean', 'box' => true, ], 'IsTruncated' => [ 'type' => 'boolean', 'box' => true, ], 'JSONInput' => [ 'type' => 'structure', 'members' => [ 'Type' => [ 'shape' => 'JSONType', ], ], ], 'JSONOutput' => [ 'type' => 'structure', 'members' => [ 'RecordDelimiter' => [ 'shape' => 'RecordDelimiter', ], ], ], 'JSONType' => [ 'type' => 'string', 'enum' => [ 'DOCUMENT', 'LINES', ], ], 'JournalTableConfiguration' => [ 'type' => 'structure', 'required' => [ 'RecordExpiration', ], 'members' => [ 'RecordExpiration' => [ 'shape' => 'RecordExpiration', ], 'EncryptionConfiguration' => [ 'shape' => 'MetadataTableEncryptionConfiguration', ], ], ], 'JournalTableConfigurationResult' => [ 'type' => 'structure', 'required' => [ 'TableStatus', 'TableName', 'RecordExpiration', ], 'members' => [ 'TableStatus' => [ 'shape' => 'MetadataTableStatus', ], 'Error' => [ 'shape' => 'ErrorDetails', ], 'TableName' => [ 'shape' => 'S3TablesName', ], 'TableArn' => [ 'shape' => 'S3TablesArn', ], 'RecordExpiration' => [ 'shape' => 'RecordExpiration', ], ], ], 'JournalTableConfigurationUpdates' => [ 'type' => 'structure', 'required' => [ 'RecordExpiration', ], 'members' => [ 'RecordExpiration' => [ 'shape' => 'RecordExpiration', ], ], ], 'KMSContext' => [ 'type' => 'string', ], 'KeyCount' => [ 'type' => 'integer', ], 'KeyMarker' => [ 'type' => 'string', ], 'KeyPrefixEquals' => [ 'type' => 'string', ], 'KmsKeyArn' => [ 'type' => 'string', ], 'LambdaFunctionArn' => [ 'type' => 'string', ], 'LambdaFunctionConfiguration' => [ 'type' => 'structure', 'required' => [ 'LambdaFunctionArn', 'Events', ], 'members' => [ 'Id' => [ 'shape' => 'NotificationId', ], 'LambdaFunctionArn' => [ 'shape' => 'LambdaFunctionArn', 'locationName' => 'CloudFunction', ], 'Events' => [ 'shape' => 'EventList', 'locationName' => 'Event', ], 'Filter' => [ 'shape' => 'NotificationConfigurationFilter', ], ], ], 'LambdaFunctionConfigurationList' => [ 'type' => 'list', 'member' => [ 'shape' => 'LambdaFunctionConfiguration', ], 'flattened' => true, ], 'LastModified' => [ 'type' => 'timestamp', ], 'LastModifiedTime' => [ 'type' => 'timestamp', 'timestampFormat' => 'rfc822', ], 'LifecycleConfiguration' => [ 'type' => 'structure', 'required' => [ 'Rules', ], 'members' => [ 'Rules' => [ 'shape' => 'Rules', 'locationName' => 'Rule', ], ], ], 'LifecycleExpiration' => [ 'type' => 'structure', 'members' => [ 'Date' => [ 'shape' => 'Date', ], 'Days' => [ 'shape' => 'Days', ], 'ExpiredObjectDeleteMarker' => [ 'shape' => 'ExpiredObjectDeleteMarker', ], ], ], 'LifecycleRule' => [ 'type' => 'structure', 'required' => [ 'Status', ], 'members' => [ 'Expiration' => [ 'shape' => 'LifecycleExpiration', ], 'ID' => [ 'shape' => 'ID', ], 'Prefix' => [ 'shape' => 'Prefix', 'deprecated' => true, ], 'Filter' => [ 'shape' => 'LifecycleRuleFilter', ], 'Status' => [ 'shape' => 'ExpirationStatus', ], 'Transitions' => [ 'shape' => 'TransitionList', 'locationName' => 'Transition', ], 'NoncurrentVersionTransitions' => [ 'shape' => 'NoncurrentVersionTransitionList', 'locationName' => 'NoncurrentVersionTransition', ], 'NoncurrentVersionExpiration' => [ 'shape' => 'NoncurrentVersionExpiration', ], 'AbortIncompleteMultipartUpload' => [ 'shape' => 'AbortIncompleteMultipartUpload', ], ], ], 'LifecycleRuleAndOperator' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tags' => [ 'shape' => 'TagSet', 'flattened' => true, 'locationName' => 'Tag', ], 'ObjectSizeGreaterThan' => [ 'shape' => 'ObjectSizeGreaterThanBytes', ], 'ObjectSizeLessThan' => [ 'shape' => 'ObjectSizeLessThanBytes', ], ], ], 'LifecycleRuleFilter' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tag' => [ 'shape' => 'Tag', ], 'ObjectSizeGreaterThan' => [ 'shape' => 'ObjectSizeGreaterThanBytes', ], 'ObjectSizeLessThan' => [ 'shape' => 'ObjectSizeLessThanBytes', ], 'And' => [ 'shape' => 'LifecycleRuleAndOperator', ], ], ], 'LifecycleRules' => [ 'type' => 'list', 'member' => [ 'shape' => 'LifecycleRule', ], 'flattened' => true, ], 'ListBucketAnalyticsConfigurationsOutput' => [ 'type' => 'structure', 'members' => [ 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'ContinuationToken' => [ 'shape' => 'Token', ], 'NextContinuationToken' => [ 'shape' => 'NextToken', ], 'AnalyticsConfigurationList' => [ 'shape' => 'AnalyticsConfigurationList', 'locationName' => 'AnalyticsConfiguration', ], ], ], 'ListBucketAnalyticsConfigurationsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContinuationToken' => [ 'shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'ListBucketIntelligentTieringConfigurationsOutput' => [ 'type' => 'structure', 'members' => [ 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'ContinuationToken' => [ 'shape' => 'Token', ], 'NextContinuationToken' => [ 'shape' => 'NextToken', ], 'IntelligentTieringConfigurationList' => [ 'shape' => 'IntelligentTieringConfigurationList', 'locationName' => 'IntelligentTieringConfiguration', ], ], ], 'ListBucketIntelligentTieringConfigurationsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContinuationToken' => [ 'shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'ListBucketInventoryConfigurationsOutput' => [ 'type' => 'structure', 'members' => [ 'ContinuationToken' => [ 'shape' => 'Token', ], 'InventoryConfigurationList' => [ 'shape' => 'InventoryConfigurationList', 'locationName' => 'InventoryConfiguration', ], 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'NextContinuationToken' => [ 'shape' => 'NextToken', ], ], ], 'ListBucketInventoryConfigurationsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContinuationToken' => [ 'shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'ListBucketMetricsConfigurationsOutput' => [ 'type' => 'structure', 'members' => [ 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'ContinuationToken' => [ 'shape' => 'Token', ], 'NextContinuationToken' => [ 'shape' => 'NextToken', ], 'MetricsConfigurationList' => [ 'shape' => 'MetricsConfigurationList', 'locationName' => 'MetricsConfiguration', ], ], ], 'ListBucketMetricsConfigurationsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContinuationToken' => [ 'shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'ListBucketsOutput' => [ 'type' => 'structure', 'members' => [ 'Buckets' => [ 'shape' => 'Buckets', ], 'Owner' => [ 'shape' => 'Owner', ], 'ContinuationToken' => [ 'shape' => 'NextToken', ], 'Prefix' => [ 'shape' => 'Prefix', ], ], ], 'ListBucketsRequest' => [ 'type' => 'structure', 'members' => [ 'MaxBuckets' => [ 'shape' => 'MaxBuckets', 'location' => 'querystring', 'locationName' => 'max-buckets', ], 'ContinuationToken' => [ 'shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token', ], 'Prefix' => [ 'shape' => 'Prefix', 'location' => 'querystring', 'locationName' => 'prefix', ], 'BucketRegion' => [ 'shape' => 'BucketRegion', 'location' => 'querystring', 'locationName' => 'bucket-region', ], ], ], 'ListDirectoryBucketsOutput' => [ 'type' => 'structure', 'members' => [ 'Buckets' => [ 'shape' => 'Buckets', ], 'ContinuationToken' => [ 'shape' => 'DirectoryBucketToken', ], ], ], 'ListDirectoryBucketsRequest' => [ 'type' => 'structure', 'members' => [ 'ContinuationToken' => [ 'shape' => 'DirectoryBucketToken', 'location' => 'querystring', 'locationName' => 'continuation-token', ], 'MaxDirectoryBuckets' => [ 'shape' => 'MaxDirectoryBuckets', 'location' => 'querystring', 'locationName' => 'max-directory-buckets', ], ], ], 'ListMultipartUploadsOutput' => [ 'type' => 'structure', 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', ], 'KeyMarker' => [ 'shape' => 'KeyMarker', ], 'UploadIdMarker' => [ 'shape' => 'UploadIdMarker', ], 'NextKeyMarker' => [ 'shape' => 'NextKeyMarker', ], 'Prefix' => [ 'shape' => 'Prefix', ], 'Delimiter' => [ 'shape' => 'Delimiter', ], 'NextUploadIdMarker' => [ 'shape' => 'NextUploadIdMarker', ], 'MaxUploads' => [ 'shape' => 'MaxUploads', ], 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'Uploads' => [ 'shape' => 'MultipartUploadList', 'locationName' => 'Upload', ], 'CommonPrefixes' => [ 'shape' => 'CommonPrefixList', ], 'EncodingType' => [ 'shape' => 'EncodingType', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'ListMultipartUploadsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Delimiter' => [ 'shape' => 'Delimiter', 'location' => 'querystring', 'locationName' => 'delimiter', ], 'EncodingType' => [ 'shape' => 'EncodingType', 'location' => 'querystring', 'locationName' => 'encoding-type', ], 'KeyMarker' => [ 'shape' => 'KeyMarker', 'location' => 'querystring', 'locationName' => 'key-marker', ], 'MaxUploads' => [ 'shape' => 'MaxUploads', 'location' => 'querystring', 'locationName' => 'max-uploads', ], 'Prefix' => [ 'shape' => 'Prefix', 'contextParam' => [ 'name' => 'Prefix', ], 'location' => 'querystring', 'locationName' => 'prefix', ], 'UploadIdMarker' => [ 'shape' => 'UploadIdMarker', 'location' => 'querystring', 'locationName' => 'upload-id-marker', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], ], ], 'ListObjectVersionsOutput' => [ 'type' => 'structure', 'members' => [ 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'KeyMarker' => [ 'shape' => 'KeyMarker', ], 'VersionIdMarker' => [ 'shape' => 'VersionIdMarker', ], 'NextKeyMarker' => [ 'shape' => 'NextKeyMarker', ], 'NextVersionIdMarker' => [ 'shape' => 'NextVersionIdMarker', ], 'Versions' => [ 'shape' => 'ObjectVersionList', 'locationName' => 'Version', ], 'DeleteMarkers' => [ 'shape' => 'DeleteMarkers', 'locationName' => 'DeleteMarker', ], 'Name' => [ 'shape' => 'BucketName', ], 'Prefix' => [ 'shape' => 'Prefix', ], 'Delimiter' => [ 'shape' => 'Delimiter', ], 'MaxKeys' => [ 'shape' => 'MaxKeys', ], 'CommonPrefixes' => [ 'shape' => 'CommonPrefixList', ], 'EncodingType' => [ 'shape' => 'EncodingType', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'ListObjectVersionsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Delimiter' => [ 'shape' => 'Delimiter', 'location' => 'querystring', 'locationName' => 'delimiter', ], 'EncodingType' => [ 'shape' => 'EncodingType', 'location' => 'querystring', 'locationName' => 'encoding-type', ], 'KeyMarker' => [ 'shape' => 'KeyMarker', 'location' => 'querystring', 'locationName' => 'key-marker', ], 'MaxKeys' => [ 'shape' => 'MaxKeys', 'location' => 'querystring', 'locationName' => 'max-keys', ], 'Prefix' => [ 'shape' => 'Prefix', 'contextParam' => [ 'name' => 'Prefix', ], 'location' => 'querystring', 'locationName' => 'prefix', ], 'VersionIdMarker' => [ 'shape' => 'VersionIdMarker', 'location' => 'querystring', 'locationName' => 'version-id-marker', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'OptionalObjectAttributes' => [ 'shape' => 'OptionalObjectAttributesList', 'location' => 'header', 'locationName' => 'x-amz-optional-object-attributes', ], ], ], 'ListObjectsOutput' => [ 'type' => 'structure', 'members' => [ 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'Marker' => [ 'shape' => 'Marker', ], 'NextMarker' => [ 'shape' => 'NextMarker', ], 'Contents' => [ 'shape' => 'ObjectList', ], 'Name' => [ 'shape' => 'BucketName', ], 'Prefix' => [ 'shape' => 'Prefix', ], 'Delimiter' => [ 'shape' => 'Delimiter', ], 'MaxKeys' => [ 'shape' => 'MaxKeys', ], 'CommonPrefixes' => [ 'shape' => 'CommonPrefixList', ], 'EncodingType' => [ 'shape' => 'EncodingType', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'ListObjectsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Delimiter' => [ 'shape' => 'Delimiter', 'location' => 'querystring', 'locationName' => 'delimiter', ], 'EncodingType' => [ 'shape' => 'EncodingType', 'location' => 'querystring', 'locationName' => 'encoding-type', ], 'Marker' => [ 'shape' => 'Marker', 'location' => 'querystring', 'locationName' => 'marker', ], 'MaxKeys' => [ 'shape' => 'MaxKeys', 'location' => 'querystring', 'locationName' => 'max-keys', ], 'Prefix' => [ 'shape' => 'Prefix', 'contextParam' => [ 'name' => 'Prefix', ], 'location' => 'querystring', 'locationName' => 'prefix', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'OptionalObjectAttributes' => [ 'shape' => 'OptionalObjectAttributesList', 'location' => 'header', 'locationName' => 'x-amz-optional-object-attributes', ], ], ], 'ListObjectsV2Output' => [ 'type' => 'structure', 'members' => [ 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'Contents' => [ 'shape' => 'ObjectList', ], 'Name' => [ 'shape' => 'BucketName', ], 'Prefix' => [ 'shape' => 'Prefix', ], 'Delimiter' => [ 'shape' => 'Delimiter', ], 'MaxKeys' => [ 'shape' => 'MaxKeys', ], 'CommonPrefixes' => [ 'shape' => 'CommonPrefixList', ], 'EncodingType' => [ 'shape' => 'EncodingType', ], 'KeyCount' => [ 'shape' => 'KeyCount', ], 'ContinuationToken' => [ 'shape' => 'Token', ], 'NextContinuationToken' => [ 'shape' => 'NextToken', ], 'StartAfter' => [ 'shape' => 'StartAfter', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'ListObjectsV2Request' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Delimiter' => [ 'shape' => 'Delimiter', 'location' => 'querystring', 'locationName' => 'delimiter', ], 'EncodingType' => [ 'shape' => 'EncodingType', 'location' => 'querystring', 'locationName' => 'encoding-type', ], 'MaxKeys' => [ 'shape' => 'MaxKeys', 'location' => 'querystring', 'locationName' => 'max-keys', ], 'Prefix' => [ 'shape' => 'Prefix', 'contextParam' => [ 'name' => 'Prefix', ], 'location' => 'querystring', 'locationName' => 'prefix', ], 'ContinuationToken' => [ 'shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token', ], 'FetchOwner' => [ 'shape' => 'FetchOwner', 'location' => 'querystring', 'locationName' => 'fetch-owner', ], 'StartAfter' => [ 'shape' => 'StartAfter', 'location' => 'querystring', 'locationName' => 'start-after', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'OptionalObjectAttributes' => [ 'shape' => 'OptionalObjectAttributesList', 'location' => 'header', 'locationName' => 'x-amz-optional-object-attributes', ], ], ], 'ListPartsOutput' => [ 'type' => 'structure', 'members' => [ 'AbortDate' => [ 'shape' => 'AbortDate', 'location' => 'header', 'locationName' => 'x-amz-abort-date', ], 'AbortRuleId' => [ 'shape' => 'AbortRuleId', 'location' => 'header', 'locationName' => 'x-amz-abort-rule-id', ], 'Bucket' => [ 'shape' => 'BucketName', ], 'Key' => [ 'shape' => 'ObjectKey', ], 'UploadId' => [ 'shape' => 'MultipartUploadId', ], 'PartNumberMarker' => [ 'shape' => 'PartNumberMarker', ], 'NextPartNumberMarker' => [ 'shape' => 'NextPartNumberMarker', ], 'MaxParts' => [ 'shape' => 'MaxParts', ], 'IsTruncated' => [ 'shape' => 'IsTruncated', ], 'Parts' => [ 'shape' => 'Parts', 'locationName' => 'Part', ], 'Initiator' => [ 'shape' => 'Initiator', ], 'Owner' => [ 'shape' => 'Owner', ], 'StorageClass' => [ 'shape' => 'StorageClass', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', ], ], ], 'ListPartsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', 'UploadId', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'MaxParts' => [ 'shape' => 'MaxParts', 'location' => 'querystring', 'locationName' => 'max-parts', ], 'PartNumberMarker' => [ 'shape' => 'PartNumberMarker', 'location' => 'querystring', 'locationName' => 'part-number-marker', ], 'UploadId' => [ 'shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], ], ], 'Location' => [ 'type' => 'string', ], 'LocationInfo' => [ 'type' => 'structure', 'members' => [ 'Type' => [ 'shape' => 'LocationType', ], 'Name' => [ 'shape' => 'LocationNameAsString', ], ], ], 'LocationNameAsString' => [ 'type' => 'string', ], 'LocationPrefix' => [ 'type' => 'string', ], 'LocationType' => [ 'type' => 'string', 'enum' => [ 'AvailabilityZone', 'LocalZone', ], ], 'LoggingEnabled' => [ 'type' => 'structure', 'required' => [ 'TargetBucket', 'TargetPrefix', ], 'members' => [ 'TargetBucket' => [ 'shape' => 'TargetBucket', ], 'TargetGrants' => [ 'shape' => 'TargetGrants', ], 'TargetPrefix' => [ 'shape' => 'TargetPrefix', ], 'TargetObjectKeyFormat' => [ 'shape' => 'TargetObjectKeyFormat', ], ], ], 'MFA' => [ 'type' => 'string', ], 'MFADelete' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'MFADeleteStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'Marker' => [ 'type' => 'string', ], 'MaxAgeSeconds' => [ 'type' => 'integer', 'box' => true, ], 'MaxBuckets' => [ 'type' => 'integer', 'box' => true, 'max' => 10000, 'min' => 1, ], 'MaxDirectoryBuckets' => [ 'type' => 'integer', 'box' => true, 'max' => 1000, 'min' => 0, ], 'MaxKeys' => [ 'type' => 'integer', ], 'MaxParts' => [ 'type' => 'integer', ], 'MaxUploads' => [ 'type' => 'integer', ], 'Message' => [ 'type' => 'string', ], 'Metadata' => [ 'type' => 'map', 'key' => [ 'shape' => 'MetadataKey', ], 'value' => [ 'shape' => 'MetadataValue', ], ], 'MetadataConfiguration' => [ 'type' => 'structure', 'required' => [ 'JournalTableConfiguration', ], 'members' => [ 'JournalTableConfiguration' => [ 'shape' => 'JournalTableConfiguration', ], 'InventoryTableConfiguration' => [ 'shape' => 'InventoryTableConfiguration', ], ], ], 'MetadataConfigurationResult' => [ 'type' => 'structure', 'required' => [ 'DestinationResult', ], 'members' => [ 'DestinationResult' => [ 'shape' => 'DestinationResult', ], 'JournalTableConfigurationResult' => [ 'shape' => 'JournalTableConfigurationResult', ], 'InventoryTableConfigurationResult' => [ 'shape' => 'InventoryTableConfigurationResult', ], ], ], 'MetadataDirective' => [ 'type' => 'string', 'enum' => [ 'COPY', 'REPLACE', ], ], 'MetadataEntry' => [ 'type' => 'structure', 'members' => [ 'Name' => [ 'shape' => 'MetadataKey', ], 'Value' => [ 'shape' => 'MetadataValue', ], ], ], 'MetadataKey' => [ 'type' => 'string', ], 'MetadataTableConfiguration' => [ 'type' => 'structure', 'required' => [ 'S3TablesDestination', ], 'members' => [ 'S3TablesDestination' => [ 'shape' => 'S3TablesDestination', ], ], ], 'MetadataTableConfigurationResult' => [ 'type' => 'structure', 'required' => [ 'S3TablesDestinationResult', ], 'members' => [ 'S3TablesDestinationResult' => [ 'shape' => 'S3TablesDestinationResult', ], ], ], 'MetadataTableEncryptionConfiguration' => [ 'type' => 'structure', 'required' => [ 'SseAlgorithm', ], 'members' => [ 'SseAlgorithm' => [ 'shape' => 'TableSseAlgorithm', ], 'KmsKeyArn' => [ 'shape' => 'KmsKeyArn', ], ], ], 'MetadataTableStatus' => [ 'type' => 'string', ], 'MetadataValue' => [ 'type' => 'string', ], 'Metrics' => [ 'type' => 'structure', 'required' => [ 'Status', ], 'members' => [ 'Status' => [ 'shape' => 'MetricsStatus', ], 'EventThreshold' => [ 'shape' => 'ReplicationTimeValue', ], ], ], 'MetricsAndOperator' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tags' => [ 'shape' => 'TagSet', 'flattened' => true, 'locationName' => 'Tag', ], 'AccessPointArn' => [ 'shape' => 'AccessPointArn', ], ], ], 'MetricsConfiguration' => [ 'type' => 'structure', 'required' => [ 'Id', ], 'members' => [ 'Id' => [ 'shape' => 'MetricsId', ], 'Filter' => [ 'shape' => 'MetricsFilter', ], ], ], 'MetricsConfigurationList' => [ 'type' => 'list', 'member' => [ 'shape' => 'MetricsConfiguration', ], 'flattened' => true, ], 'MetricsFilter' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tag' => [ 'shape' => 'Tag', ], 'AccessPointArn' => [ 'shape' => 'AccessPointArn', ], 'And' => [ 'shape' => 'MetricsAndOperator', ], ], ], 'MetricsId' => [ 'type' => 'string', ], 'MetricsStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'Minutes' => [ 'type' => 'integer', 'box' => true, ], 'MissingMeta' => [ 'type' => 'integer', ], 'MpuObjectSize' => [ 'type' => 'long', ], 'MultipartUpload' => [ 'type' => 'structure', 'members' => [ 'UploadId' => [ 'shape' => 'MultipartUploadId', ], 'Key' => [ 'shape' => 'ObjectKey', ], 'Initiated' => [ 'shape' => 'Initiated', ], 'StorageClass' => [ 'shape' => 'StorageClass', ], 'Owner' => [ 'shape' => 'Owner', ], 'Initiator' => [ 'shape' => 'Initiator', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', ], ], ], 'MultipartUploadId' => [ 'type' => 'string', ], 'MultipartUploadList' => [ 'type' => 'list', 'member' => [ 'shape' => 'MultipartUpload', ], 'flattened' => true, ], 'NextKeyMarker' => [ 'type' => 'string', ], 'NextMarker' => [ 'type' => 'string', ], 'NextPartNumberMarker' => [ 'type' => 'integer', 'box' => true, ], 'NextToken' => [ 'type' => 'string', ], 'NextUploadIdMarker' => [ 'type' => 'string', ], 'NextVersionIdMarker' => [ 'type' => 'string', ], 'NoSuchBucket' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 404, ], 'exception' => true, ], 'NoSuchKey' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 404, ], 'exception' => true, ], 'NoSuchUpload' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 404, ], 'exception' => true, ], 'NoncurrentVersionExpiration' => [ 'type' => 'structure', 'members' => [ 'NoncurrentDays' => [ 'shape' => 'Days', ], 'NewerNoncurrentVersions' => [ 'shape' => 'VersionCount', ], ], ], 'NoncurrentVersionTransition' => [ 'type' => 'structure', 'members' => [ 'NoncurrentDays' => [ 'shape' => 'Days', ], 'StorageClass' => [ 'shape' => 'TransitionStorageClass', ], 'NewerNoncurrentVersions' => [ 'shape' => 'VersionCount', ], ], ], 'NoncurrentVersionTransitionList' => [ 'type' => 'list', 'member' => [ 'shape' => 'NoncurrentVersionTransition', ], 'flattened' => true, ], 'NotificationConfiguration' => [ 'type' => 'structure', 'members' => [ 'TopicConfigurations' => [ 'shape' => 'TopicConfigurationList', 'locationName' => 'TopicConfiguration', ], 'QueueConfigurations' => [ 'shape' => 'QueueConfigurationList', 'locationName' => 'QueueConfiguration', ], 'LambdaFunctionConfigurations' => [ 'shape' => 'LambdaFunctionConfigurationList', 'locationName' => 'CloudFunctionConfiguration', ], 'EventBridgeConfiguration' => [ 'shape' => 'EventBridgeConfiguration', ], ], ], 'NotificationConfigurationDeprecated' => [ 'type' => 'structure', 'members' => [ 'TopicConfiguration' => [ 'shape' => 'TopicConfigurationDeprecated', ], 'QueueConfiguration' => [ 'shape' => 'QueueConfigurationDeprecated', ], 'CloudFunctionConfiguration' => [ 'shape' => 'CloudFunctionConfiguration', ], ], ], 'NotificationConfigurationFilter' => [ 'type' => 'structure', 'members' => [ 'Key' => [ 'shape' => 'S3KeyFilter', 'locationName' => 'S3Key', ], ], ], 'NotificationId' => [ 'type' => 'string', ], 'Object' => [ 'type' => 'structure', 'members' => [ 'Key' => [ 'shape' => 'ObjectKey', ], 'LastModified' => [ 'shape' => 'LastModified', ], 'ETag' => [ 'shape' => 'ETag', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithmList', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', ], 'Size' => [ 'shape' => 'Size', ], 'StorageClass' => [ 'shape' => 'ObjectStorageClass', ], 'Owner' => [ 'shape' => 'Owner', ], 'RestoreStatus' => [ 'shape' => 'RestoreStatus', ], ], ], 'ObjectAlreadyInActiveTierError' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 403, ], 'exception' => true, ], 'ObjectAttributes' => [ 'type' => 'string', 'enum' => [ 'ETag', 'Checksum', 'ObjectParts', 'StorageClass', 'ObjectSize', ], ], 'ObjectAttributesList' => [ 'type' => 'list', 'member' => [ 'shape' => 'ObjectAttributes', ], ], 'ObjectCannedACL' => [ 'type' => 'string', 'enum' => [ 'private', 'public-read', 'public-read-write', 'authenticated-read', 'aws-exec-read', 'bucket-owner-read', 'bucket-owner-full-control', ], ], 'ObjectIdentifier' => [ 'type' => 'structure', 'required' => [ 'Key', ], 'members' => [ 'Key' => [ 'shape' => 'ObjectKey', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', ], 'ETag' => [ 'shape' => 'ETag', ], 'LastModifiedTime' => [ 'shape' => 'LastModifiedTime', ], 'Size' => [ 'shape' => 'Size', ], ], ], 'ObjectIdentifierList' => [ 'type' => 'list', 'member' => [ 'shape' => 'ObjectIdentifier', ], 'flattened' => true, ], 'ObjectKey' => [ 'type' => 'string', 'min' => 1, ], 'ObjectList' => [ 'type' => 'list', 'member' => [ 'shape' => 'Object', ], 'flattened' => true, ], 'ObjectLockConfiguration' => [ 'type' => 'structure', 'members' => [ 'ObjectLockEnabled' => [ 'shape' => 'ObjectLockEnabled', ], 'Rule' => [ 'shape' => 'ObjectLockRule', ], ], ], 'ObjectLockEnabled' => [ 'type' => 'string', 'enum' => [ 'Enabled', ], ], 'ObjectLockEnabledForBucket' => [ 'type' => 'boolean', 'box' => true, ], 'ObjectLockLegalHold' => [ 'type' => 'structure', 'members' => [ 'Status' => [ 'shape' => 'ObjectLockLegalHoldStatus', ], ], ], 'ObjectLockLegalHoldStatus' => [ 'type' => 'string', 'enum' => [ 'ON', 'OFF', ], ], 'ObjectLockMode' => [ 'type' => 'string', 'enum' => [ 'GOVERNANCE', 'COMPLIANCE', ], ], 'ObjectLockRetainUntilDate' => [ 'type' => 'timestamp', 'timestampFormat' => 'iso8601', ], 'ObjectLockRetention' => [ 'type' => 'structure', 'members' => [ 'Mode' => [ 'shape' => 'ObjectLockRetentionMode', ], 'RetainUntilDate' => [ 'shape' => 'Date', ], ], ], 'ObjectLockRetentionMode' => [ 'type' => 'string', 'enum' => [ 'GOVERNANCE', 'COMPLIANCE', ], ], 'ObjectLockRule' => [ 'type' => 'structure', 'members' => [ 'DefaultRetention' => [ 'shape' => 'DefaultRetention', ], ], ], 'ObjectLockToken' => [ 'type' => 'string', ], 'ObjectNotInActiveTierError' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 403, ], 'exception' => true, ], 'ObjectOwnership' => [ 'type' => 'string', 'enum' => [ 'BucketOwnerPreferred', 'ObjectWriter', 'BucketOwnerEnforced', ], ], 'ObjectPart' => [ 'type' => 'structure', 'members' => [ 'PartNumber' => [ 'shape' => 'PartNumber', ], 'Size' => [ 'shape' => 'Size', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', ], ], ], 'ObjectSize' => [ 'type' => 'long', 'box' => true, ], 'ObjectSizeGreaterThanBytes' => [ 'type' => 'long', 'box' => true, ], 'ObjectSizeLessThanBytes' => [ 'type' => 'long', 'box' => true, ], 'ObjectStorageClass' => [ 'type' => 'string', 'enum' => [ 'STANDARD', 'REDUCED_REDUNDANCY', 'GLACIER', 'STANDARD_IA', 'ONEZONE_IA', 'INTELLIGENT_TIERING', 'DEEP_ARCHIVE', 'OUTPOSTS', 'GLACIER_IR', 'SNOW', 'EXPRESS_ONEZONE', 'FSX_OPENZFS', ], ], 'ObjectVersion' => [ 'type' => 'structure', 'members' => [ 'ETag' => [ 'shape' => 'ETag', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithmList', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', ], 'Size' => [ 'shape' => 'Size', ], 'StorageClass' => [ 'shape' => 'ObjectVersionStorageClass', ], 'Key' => [ 'shape' => 'ObjectKey', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', ], 'IsLatest' => [ 'shape' => 'IsLatest', ], 'LastModified' => [ 'shape' => 'LastModified', ], 'Owner' => [ 'shape' => 'Owner', ], 'RestoreStatus' => [ 'shape' => 'RestoreStatus', ], ], ], 'ObjectVersionId' => [ 'type' => 'string', ], 'ObjectVersionList' => [ 'type' => 'list', 'member' => [ 'shape' => 'ObjectVersion', ], 'flattened' => true, ], 'ObjectVersionStorageClass' => [ 'type' => 'string', 'enum' => [ 'STANDARD', ], ], 'OptionalObjectAttributes' => [ 'type' => 'string', 'enum' => [ 'RestoreStatus', ], ], 'OptionalObjectAttributesList' => [ 'type' => 'list', 'member' => [ 'shape' => 'OptionalObjectAttributes', ], ], 'OutputLocation' => [ 'type' => 'structure', 'members' => [ 'S3' => [ 'shape' => 'S3Location', ], ], ], 'OutputSerialization' => [ 'type' => 'structure', 'members' => [ 'CSV' => [ 'shape' => 'CSVOutput', ], 'JSON' => [ 'shape' => 'JSONOutput', ], ], ], 'Owner' => [ 'type' => 'structure', 'members' => [ 'DisplayName' => [ 'shape' => 'DisplayName', ], 'ID' => [ 'shape' => 'ID', ], ], ], 'OwnerOverride' => [ 'type' => 'string', 'enum' => [ 'Destination', ], ], 'OwnershipControls' => [ 'type' => 'structure', 'required' => [ 'Rules', ], 'members' => [ 'Rules' => [ 'shape' => 'OwnershipControlsRules', 'locationName' => 'Rule', ], ], ], 'OwnershipControlsRule' => [ 'type' => 'structure', 'required' => [ 'ObjectOwnership', ], 'members' => [ 'ObjectOwnership' => [ 'shape' => 'ObjectOwnership', ], ], ], 'OwnershipControlsRules' => [ 'type' => 'list', 'member' => [ 'shape' => 'OwnershipControlsRule', ], 'flattened' => true, ], 'ParquetInput' => [ 'type' => 'structure', 'members' => [], ], 'Part' => [ 'type' => 'structure', 'members' => [ 'PartNumber' => [ 'shape' => 'PartNumber', ], 'LastModified' => [ 'shape' => 'LastModified', ], 'ETag' => [ 'shape' => 'ETag', ], 'Size' => [ 'shape' => 'Size', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', ], ], ], 'PartNumber' => [ 'type' => 'integer', ], 'PartNumberMarker' => [ 'type' => 'integer', ], 'PartitionDateSource' => [ 'type' => 'string', 'enum' => [ 'EventTime', 'DeliveryTime', ], ], 'PartitionedPrefix' => [ 'type' => 'structure', 'members' => [ 'PartitionDateSource' => [ 'shape' => 'PartitionDateSource', ], ], 'locationName' => 'PartitionedPrefix', ], 'Parts' => [ 'type' => 'list', 'member' => [ 'shape' => 'Part', ], 'flattened' => true, ], 'PartsCount' => [ 'type' => 'integer', 'box' => true, ], 'PartsList' => [ 'type' => 'list', 'member' => [ 'shape' => 'ObjectPart', ], 'flattened' => true, ], 'Payer' => [ 'type' => 'string', 'enum' => [ 'Requester', 'BucketOwner', ], ], 'Permission' => [ 'type' => 'string', 'enum' => [ 'FULL_CONTROL', 'WRITE', 'WRITE_ACP', 'READ', 'READ_ACP', ], ], 'Policy' => [ 'type' => 'string', ], 'PolicyStatus' => [ 'type' => 'structure', 'members' => [ 'IsPublic' => [ 'shape' => 'IsPublic', 'locationName' => 'IsPublic', ], ], ], 'Prefix' => [ 'type' => 'string', ], 'Priority' => [ 'type' => 'integer', 'box' => true, ], 'Progress' => [ 'type' => 'structure', 'members' => [ 'BytesScanned' => [ 'shape' => 'BytesScanned', ], 'BytesProcessed' => [ 'shape' => 'BytesProcessed', ], 'BytesReturned' => [ 'shape' => 'BytesReturned', ], ], ], 'ProgressEvent' => [ 'type' => 'structure', 'members' => [ 'Details' => [ 'shape' => 'Progress', 'eventpayload' => true, ], ], 'event' => true, ], 'Protocol' => [ 'type' => 'string', 'enum' => [ 'http', 'https', ], ], 'PublicAccessBlockConfiguration' => [ 'type' => 'structure', 'members' => [ 'BlockPublicAcls' => [ 'shape' => 'Setting', 'locationName' => 'BlockPublicAcls', ], 'IgnorePublicAcls' => [ 'shape' => 'Setting', 'locationName' => 'IgnorePublicAcls', ], 'BlockPublicPolicy' => [ 'shape' => 'Setting', 'locationName' => 'BlockPublicPolicy', ], 'RestrictPublicBuckets' => [ 'shape' => 'Setting', 'locationName' => 'RestrictPublicBuckets', ], ], ], 'PutBucketAbacRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'AbacStatus', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'AbacStatus' => [ 'shape' => 'AbacStatus', 'locationName' => 'AbacStatus', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], ], 'payload' => 'AbacStatus', ], 'PutBucketAccelerateConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'AccelerateConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'AccelerateConfiguration' => [ 'shape' => 'AccelerateConfiguration', 'locationName' => 'AccelerateConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], ], 'payload' => 'AccelerateConfiguration', ], 'PutBucketAclRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'ACL' => [ 'shape' => 'BucketCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl', ], 'AccessControlPolicy' => [ 'shape' => 'AccessControlPolicy', 'locationName' => 'AccessControlPolicy', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'GrantFullControl' => [ 'shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control', ], 'GrantRead' => [ 'shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read', ], 'GrantReadACP' => [ 'shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp', ], 'GrantWrite' => [ 'shape' => 'GrantWrite', 'location' => 'header', 'locationName' => 'x-amz-grant-write', ], 'GrantWriteACP' => [ 'shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'AccessControlPolicy', ], 'PutBucketAnalyticsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', 'AnalyticsConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'AnalyticsId', 'location' => 'querystring', 'locationName' => 'id', ], 'AnalyticsConfiguration' => [ 'shape' => 'AnalyticsConfiguration', 'locationName' => 'AnalyticsConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'AnalyticsConfiguration', ], 'PutBucketCorsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'CORSConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'CORSConfiguration' => [ 'shape' => 'CORSConfiguration', 'locationName' => 'CORSConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'CORSConfiguration', ], 'PutBucketEncryptionRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'ServerSideEncryptionConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ServerSideEncryptionConfiguration' => [ 'shape' => 'ServerSideEncryptionConfiguration', 'locationName' => 'ServerSideEncryptionConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'ServerSideEncryptionConfiguration', ], 'PutBucketIntelligentTieringConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', 'IntelligentTieringConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'IntelligentTieringId', 'location' => 'querystring', 'locationName' => 'id', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'IntelligentTieringConfiguration' => [ 'shape' => 'IntelligentTieringConfiguration', 'locationName' => 'IntelligentTieringConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], ], 'payload' => 'IntelligentTieringConfiguration', ], 'PutBucketInventoryConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', 'InventoryConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'InventoryId', 'location' => 'querystring', 'locationName' => 'id', ], 'InventoryConfiguration' => [ 'shape' => 'InventoryConfiguration', 'locationName' => 'InventoryConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'InventoryConfiguration', ], 'PutBucketLifecycleConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'TransitionDefaultMinimumObjectSize' => [ 'shape' => 'TransitionDefaultMinimumObjectSize', 'location' => 'header', 'locationName' => 'x-amz-transition-default-minimum-object-size', ], ], ], 'PutBucketLifecycleConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'LifecycleConfiguration' => [ 'shape' => 'BucketLifecycleConfiguration', 'locationName' => 'LifecycleConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'TransitionDefaultMinimumObjectSize' => [ 'shape' => 'TransitionDefaultMinimumObjectSize', 'location' => 'header', 'locationName' => 'x-amz-transition-default-minimum-object-size', ], ], 'payload' => 'LifecycleConfiguration', ], 'PutBucketLifecycleRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'LifecycleConfiguration' => [ 'shape' => 'LifecycleConfiguration', 'locationName' => 'LifecycleConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'LifecycleConfiguration', ], 'PutBucketLoggingRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'BucketLoggingStatus', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'BucketLoggingStatus' => [ 'shape' => 'BucketLoggingStatus', 'locationName' => 'BucketLoggingStatus', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'BucketLoggingStatus', ], 'PutBucketMetricsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Id', 'MetricsConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Id' => [ 'shape' => 'MetricsId', 'location' => 'querystring', 'locationName' => 'id', ], 'MetricsConfiguration' => [ 'shape' => 'MetricsConfiguration', 'locationName' => 'MetricsConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'MetricsConfiguration', ], 'PutBucketNotificationConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'NotificationConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'NotificationConfiguration' => [ 'shape' => 'NotificationConfiguration', 'locationName' => 'NotificationConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'SkipDestinationValidation' => [ 'shape' => 'SkipValidation', 'location' => 'header', 'locationName' => 'x-amz-skip-destination-validation', ], ], 'payload' => 'NotificationConfiguration', ], 'PutBucketNotificationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'NotificationConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'NotificationConfiguration' => [ 'shape' => 'NotificationConfigurationDeprecated', 'locationName' => 'NotificationConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'NotificationConfiguration', ], 'PutBucketOwnershipControlsRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'OwnershipControls', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'OwnershipControls' => [ 'shape' => 'OwnershipControls', 'locationName' => 'OwnershipControls', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], ], 'payload' => 'OwnershipControls', ], 'PutBucketPolicyRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Policy', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ConfirmRemoveSelfBucketAccess' => [ 'shape' => 'ConfirmRemoveSelfBucketAccess', 'location' => 'header', 'locationName' => 'x-amz-confirm-remove-self-bucket-access', ], 'Policy' => [ 'shape' => 'Policy', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'Policy', ], 'PutBucketReplicationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'ReplicationConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ReplicationConfiguration' => [ 'shape' => 'ReplicationConfiguration', 'locationName' => 'ReplicationConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'Token' => [ 'shape' => 'ObjectLockToken', 'location' => 'header', 'locationName' => 'x-amz-bucket-object-lock-token', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'ReplicationConfiguration', ], 'PutBucketRequestPaymentRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'RequestPaymentConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'RequestPaymentConfiguration' => [ 'shape' => 'RequestPaymentConfiguration', 'locationName' => 'RequestPaymentConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'RequestPaymentConfiguration', ], 'PutBucketTaggingRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Tagging', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'Tagging' => [ 'shape' => 'Tagging', 'locationName' => 'Tagging', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'Tagging', ], 'PutBucketVersioningRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'VersioningConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'MFA' => [ 'shape' => 'MFA', 'location' => 'header', 'locationName' => 'x-amz-mfa', ], 'VersioningConfiguration' => [ 'shape' => 'VersioningConfiguration', 'locationName' => 'VersioningConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'VersioningConfiguration', ], 'PutBucketWebsiteRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'WebsiteConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'WebsiteConfiguration' => [ 'shape' => 'WebsiteConfiguration', 'locationName' => 'WebsiteConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'WebsiteConfiguration', ], 'PutObjectAclOutput' => [ 'type' => 'structure', 'members' => [ 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'PutObjectAclRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'ACL' => [ 'shape' => 'ObjectCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl', ], 'AccessControlPolicy' => [ 'shape' => 'AccessControlPolicy', 'locationName' => 'AccessControlPolicy', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'GrantFullControl' => [ 'shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control', ], 'GrantRead' => [ 'shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read', ], 'GrantReadACP' => [ 'shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp', ], 'GrantWrite' => [ 'shape' => 'GrantWrite', 'location' => 'header', 'locationName' => 'x-amz-grant-write', ], 'GrantWriteACP' => [ 'shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'AccessControlPolicy', ], 'PutObjectLegalHoldOutput' => [ 'type' => 'structure', 'members' => [ 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'PutObjectLegalHoldRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'LegalHold' => [ 'shape' => 'ObjectLockLegalHold', 'locationName' => 'LegalHold', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'LegalHold', ], 'PutObjectLockConfigurationOutput' => [ 'type' => 'structure', 'members' => [ 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'PutObjectLockConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ObjectLockConfiguration' => [ 'shape' => 'ObjectLockConfiguration', 'locationName' => 'ObjectLockConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'Token' => [ 'shape' => 'ObjectLockToken', 'location' => 'header', 'locationName' => 'x-amz-bucket-object-lock-token', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'ObjectLockConfiguration', ], 'PutObjectOutput' => [ 'type' => 'structure', 'members' => [ 'Expiration' => [ 'shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration', ], 'ETag' => [ 'shape' => 'ETag', 'location' => 'header', 'locationName' => 'ETag', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc64nvme', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256', ], 'ChecksumType' => [ 'shape' => 'ChecksumType', 'location' => 'header', 'locationName' => 'x-amz-checksum-type', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'SSEKMSEncryptionContext' => [ 'shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'Size' => [ 'shape' => 'Size', 'location' => 'header', 'locationName' => 'x-amz-object-size', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'PutObjectRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'ACL' => [ 'shape' => 'ObjectCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl', ], 'Body' => [ 'shape' => 'Body', 'streaming' => true, ], 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'CacheControl' => [ 'shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control', ], 'ContentDisposition' => [ 'shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition', ], 'ContentEncoding' => [ 'shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding', ], 'ContentLanguage' => [ 'shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language', ], 'ContentLength' => [ 'shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ContentType' => [ 'shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc64nvme', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256', ], 'Expires' => [ 'shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires', ], 'IfMatch' => [ 'shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match', ], 'IfNoneMatch' => [ 'shape' => 'IfNoneMatch', 'location' => 'header', 'locationName' => 'If-None-Match', ], 'GrantFullControl' => [ 'shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control', ], 'GrantRead' => [ 'shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read', ], 'GrantReadACP' => [ 'shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp', ], 'GrantWriteACP' => [ 'shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'WriteOffsetBytes' => [ 'shape' => 'WriteOffsetBytes', 'location' => 'header', 'locationName' => 'x-amz-write-offset-bytes', ], 'Metadata' => [ 'shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'StorageClass' => [ 'shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class', ], 'WebsiteRedirectLocation' => [ 'shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'SSEKMSEncryptionContext' => [ 'shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'Tagging' => [ 'shape' => 'TaggingHeader', 'location' => 'header', 'locationName' => 'x-amz-tagging', ], 'ObjectLockMode' => [ 'shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode', ], 'ObjectLockRetainUntilDate' => [ 'shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date', ], 'ObjectLockLegalHoldStatus' => [ 'shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'Body', ], 'PutObjectRetentionOutput' => [ 'type' => 'structure', 'members' => [ 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'PutObjectRetentionRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'Retention' => [ 'shape' => 'ObjectLockRetention', 'locationName' => 'Retention', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'BypassGovernanceRetention' => [ 'shape' => 'BypassGovernanceRetention', 'location' => 'header', 'locationName' => 'x-amz-bypass-governance-retention', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'Retention', ], 'PutObjectTaggingOutput' => [ 'type' => 'structure', 'members' => [ 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id', ], ], ], 'PutObjectTaggingRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', 'Tagging', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'Tagging' => [ 'shape' => 'Tagging', 'locationName' => 'Tagging', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], ], 'payload' => 'Tagging', ], 'PutPublicAccessBlockRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'PublicAccessBlockConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'PublicAccessBlockConfiguration' => [ 'shape' => 'PublicAccessBlockConfiguration', 'locationName' => 'PublicAccessBlockConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'PublicAccessBlockConfiguration', ], 'QueueArn' => [ 'type' => 'string', ], 'QueueConfiguration' => [ 'type' => 'structure', 'required' => [ 'QueueArn', 'Events', ], 'members' => [ 'Id' => [ 'shape' => 'NotificationId', ], 'QueueArn' => [ 'shape' => 'QueueArn', 'locationName' => 'Queue', ], 'Events' => [ 'shape' => 'EventList', 'locationName' => 'Event', ], 'Filter' => [ 'shape' => 'NotificationConfigurationFilter', ], ], ], 'QueueConfigurationDeprecated' => [ 'type' => 'structure', 'members' => [ 'Id' => [ 'shape' => 'NotificationId', ], 'Event' => [ 'shape' => 'Event', 'deprecated' => true, ], 'Events' => [ 'shape' => 'EventList', 'locationName' => 'Event', ], 'Queue' => [ 'shape' => 'QueueArn', ], ], ], 'QueueConfigurationList' => [ 'type' => 'list', 'member' => [ 'shape' => 'QueueConfiguration', ], 'flattened' => true, ], 'Quiet' => [ 'type' => 'boolean', 'box' => true, ], 'QuoteCharacter' => [ 'type' => 'string', ], 'QuoteEscapeCharacter' => [ 'type' => 'string', ], 'QuoteFields' => [ 'type' => 'string', 'enum' => [ 'ALWAYS', 'ASNEEDED', ], ], 'Range' => [ 'type' => 'string', ], 'RecordDelimiter' => [ 'type' => 'string', ], 'RecordExpiration' => [ 'type' => 'structure', 'required' => [ 'Expiration', ], 'members' => [ 'Expiration' => [ 'shape' => 'ExpirationState', ], 'Days' => [ 'shape' => 'RecordExpirationDays', 'box' => true, ], ], ], 'RecordExpirationDays' => [ 'type' => 'integer', ], 'RecordsEvent' => [ 'type' => 'structure', 'members' => [ 'Payload' => [ 'shape' => 'Body', 'eventpayload' => true, ], ], 'event' => true, ], 'Redirect' => [ 'type' => 'structure', 'members' => [ 'HostName' => [ 'shape' => 'HostName', ], 'HttpRedirectCode' => [ 'shape' => 'HttpRedirectCode', ], 'Protocol' => [ 'shape' => 'Protocol', ], 'ReplaceKeyPrefixWith' => [ 'shape' => 'ReplaceKeyPrefixWith', ], 'ReplaceKeyWith' => [ 'shape' => 'ReplaceKeyWith', ], ], ], 'RedirectAllRequestsTo' => [ 'type' => 'structure', 'required' => [ 'HostName', ], 'members' => [ 'HostName' => [ 'shape' => 'HostName', ], 'Protocol' => [ 'shape' => 'Protocol', ], ], ], 'Region' => [ 'type' => 'string', 'max' => 20, 'min' => 0, ], 'RenameObjectOutput' => [ 'type' => 'structure', 'members' => [], ], 'RenameObjectRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', 'RenameSource', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'RenameSource' => [ 'shape' => 'RenameSource', 'location' => 'header', 'locationName' => 'x-amz-rename-source', ], 'DestinationIfMatch' => [ 'shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match', ], 'DestinationIfNoneMatch' => [ 'shape' => 'IfNoneMatch', 'location' => 'header', 'locationName' => 'If-None-Match', ], 'DestinationIfModifiedSince' => [ 'shape' => 'IfModifiedSince', 'location' => 'header', 'locationName' => 'If-Modified-Since', ], 'DestinationIfUnmodifiedSince' => [ 'shape' => 'IfUnmodifiedSince', 'location' => 'header', 'locationName' => 'If-Unmodified-Since', ], 'SourceIfMatch' => [ 'shape' => 'RenameSourceIfMatch', 'location' => 'header', 'locationName' => 'x-amz-rename-source-if-match', ], 'SourceIfNoneMatch' => [ 'shape' => 'RenameSourceIfNoneMatch', 'location' => 'header', 'locationName' => 'x-amz-rename-source-if-none-match', ], 'SourceIfModifiedSince' => [ 'shape' => 'RenameSourceIfModifiedSince', 'location' => 'header', 'locationName' => 'x-amz-rename-source-if-modified-since', ], 'SourceIfUnmodifiedSince' => [ 'shape' => 'RenameSourceIfUnmodifiedSince', 'location' => 'header', 'locationName' => 'x-amz-rename-source-if-unmodified-since', ], 'ClientToken' => [ 'shape' => 'ClientToken', 'idempotencyToken' => true, 'location' => 'header', 'locationName' => 'x-amz-client-token', ], ], ], 'RenameSource' => [ 'type' => 'string', 'pattern' => '\\/?.+\\/.+', ], 'RenameSourceIfMatch' => [ 'type' => 'string', ], 'RenameSourceIfModifiedSince' => [ 'type' => 'timestamp', 'timestampFormat' => 'rfc822', ], 'RenameSourceIfNoneMatch' => [ 'type' => 'string', ], 'RenameSourceIfUnmodifiedSince' => [ 'type' => 'timestamp', 'timestampFormat' => 'rfc822', ], 'ReplaceKeyPrefixWith' => [ 'type' => 'string', ], 'ReplaceKeyWith' => [ 'type' => 'string', ], 'ReplicaKmsKeyID' => [ 'type' => 'string', ], 'ReplicaModifications' => [ 'type' => 'structure', 'required' => [ 'Status', ], 'members' => [ 'Status' => [ 'shape' => 'ReplicaModificationsStatus', ], ], ], 'ReplicaModificationsStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'ReplicationConfiguration' => [ 'type' => 'structure', 'required' => [ 'Role', 'Rules', ], 'members' => [ 'Role' => [ 'shape' => 'Role', ], 'Rules' => [ 'shape' => 'ReplicationRules', 'locationName' => 'Rule', ], ], ], 'ReplicationRule' => [ 'type' => 'structure', 'required' => [ 'Status', 'Destination', ], 'members' => [ 'ID' => [ 'shape' => 'ID', ], 'Priority' => [ 'shape' => 'Priority', ], 'Prefix' => [ 'shape' => 'Prefix', 'deprecated' => true, ], 'Filter' => [ 'shape' => 'ReplicationRuleFilter', ], 'Status' => [ 'shape' => 'ReplicationRuleStatus', ], 'SourceSelectionCriteria' => [ 'shape' => 'SourceSelectionCriteria', ], 'ExistingObjectReplication' => [ 'shape' => 'ExistingObjectReplication', ], 'Destination' => [ 'shape' => 'Destination', ], 'DeleteMarkerReplication' => [ 'shape' => 'DeleteMarkerReplication', ], ], ], 'ReplicationRuleAndOperator' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tags' => [ 'shape' => 'TagSet', 'flattened' => true, 'locationName' => 'Tag', ], ], ], 'ReplicationRuleFilter' => [ 'type' => 'structure', 'members' => [ 'Prefix' => [ 'shape' => 'Prefix', ], 'Tag' => [ 'shape' => 'Tag', ], 'And' => [ 'shape' => 'ReplicationRuleAndOperator', ], ], ], 'ReplicationRuleStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'ReplicationRules' => [ 'type' => 'list', 'member' => [ 'shape' => 'ReplicationRule', ], 'flattened' => true, ], 'ReplicationStatus' => [ 'type' => 'string', 'enum' => [ 'COMPLETE', 'PENDING', 'FAILED', 'REPLICA', 'COMPLETED', ], ], 'ReplicationTime' => [ 'type' => 'structure', 'required' => [ 'Status', 'Time', ], 'members' => [ 'Status' => [ 'shape' => 'ReplicationTimeStatus', ], 'Time' => [ 'shape' => 'ReplicationTimeValue', ], ], ], 'ReplicationTimeStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'ReplicationTimeValue' => [ 'type' => 'structure', 'members' => [ 'Minutes' => [ 'shape' => 'Minutes', ], ], ], 'RequestCharged' => [ 'type' => 'string', 'enum' => [ 'requester', ], ], 'RequestPayer' => [ 'type' => 'string', 'enum' => [ 'requester', ], ], 'RequestPaymentConfiguration' => [ 'type' => 'structure', 'required' => [ 'Payer', ], 'members' => [ 'Payer' => [ 'shape' => 'Payer', ], ], ], 'RequestProgress' => [ 'type' => 'structure', 'members' => [ 'Enabled' => [ 'shape' => 'EnableRequestProgress', ], ], ], 'RequestRoute' => [ 'type' => 'string', ], 'RequestToken' => [ 'type' => 'string', ], 'ResponseCacheControl' => [ 'type' => 'string', ], 'ResponseContentDisposition' => [ 'type' => 'string', ], 'ResponseContentEncoding' => [ 'type' => 'string', ], 'ResponseContentLanguage' => [ 'type' => 'string', ], 'ResponseContentType' => [ 'type' => 'string', ], 'ResponseExpires' => [ 'type' => 'timestamp', 'timestampFormat' => 'rfc822', ], 'Restore' => [ 'type' => 'string', ], 'RestoreExpiryDate' => [ 'type' => 'timestamp', ], 'RestoreObjectOutput' => [ 'type' => 'structure', 'members' => [ 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], 'RestoreOutputPath' => [ 'shape' => 'RestoreOutputPath', 'location' => 'header', 'locationName' => 'x-amz-restore-output-path', ], ], ], 'RestoreObjectRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId', ], 'RestoreRequest' => [ 'shape' => 'RestoreRequest', 'locationName' => 'RestoreRequest', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'RestoreRequest', ], 'RestoreOutputPath' => [ 'type' => 'string', ], 'RestoreRequest' => [ 'type' => 'structure', 'members' => [ 'Days' => [ 'shape' => 'Days', ], 'GlacierJobParameters' => [ 'shape' => 'GlacierJobParameters', ], 'Type' => [ 'shape' => 'RestoreRequestType', ], 'Tier' => [ 'shape' => 'Tier', ], 'Description' => [ 'shape' => 'Description', ], 'SelectParameters' => [ 'shape' => 'SelectParameters', ], 'OutputLocation' => [ 'shape' => 'OutputLocation', ], ], ], 'RestoreRequestType' => [ 'type' => 'string', 'enum' => [ 'SELECT', ], ], 'RestoreStatus' => [ 'type' => 'structure', 'members' => [ 'IsRestoreInProgress' => [ 'shape' => 'IsRestoreInProgress', ], 'RestoreExpiryDate' => [ 'shape' => 'RestoreExpiryDate', ], ], ], 'Role' => [ 'type' => 'string', ], 'RoutingRule' => [ 'type' => 'structure', 'required' => [ 'Redirect', ], 'members' => [ 'Condition' => [ 'shape' => 'Condition', ], 'Redirect' => [ 'shape' => 'Redirect', ], ], ], 'RoutingRules' => [ 'type' => 'list', 'member' => [ 'shape' => 'RoutingRule', 'locationName' => 'RoutingRule', ], ], 'Rule' => [ 'type' => 'structure', 'required' => [ 'Prefix', 'Status', ], 'members' => [ 'Expiration' => [ 'shape' => 'LifecycleExpiration', ], 'ID' => [ 'shape' => 'ID', ], 'Prefix' => [ 'shape' => 'Prefix', ], 'Status' => [ 'shape' => 'ExpirationStatus', ], 'Transition' => [ 'shape' => 'Transition', ], 'NoncurrentVersionTransition' => [ 'shape' => 'NoncurrentVersionTransition', ], 'NoncurrentVersionExpiration' => [ 'shape' => 'NoncurrentVersionExpiration', ], 'AbortIncompleteMultipartUpload' => [ 'shape' => 'AbortIncompleteMultipartUpload', ], ], ], 'Rules' => [ 'type' => 'list', 'member' => [ 'shape' => 'Rule', ], 'flattened' => true, ], 'S3KeyFilter' => [ 'type' => 'structure', 'members' => [ 'FilterRules' => [ 'shape' => 'FilterRuleList', 'locationName' => 'FilterRule', ], ], ], 'S3Location' => [ 'type' => 'structure', 'required' => [ 'BucketName', 'Prefix', ], 'members' => [ 'BucketName' => [ 'shape' => 'BucketName', ], 'Prefix' => [ 'shape' => 'LocationPrefix', ], 'Encryption' => [ 'shape' => 'Encryption', ], 'CannedACL' => [ 'shape' => 'ObjectCannedACL', ], 'AccessControlList' => [ 'shape' => 'Grants', ], 'Tagging' => [ 'shape' => 'Tagging', ], 'UserMetadata' => [ 'shape' => 'UserMetadata', ], 'StorageClass' => [ 'shape' => 'StorageClass', ], ], ], 'S3RegionalOrS3ExpressBucketArnString' => [ 'type' => 'string', 'max' => 128, 'min' => 1, 'pattern' => 'arn:[^:]+:(s3|s3express):.*', ], 'S3TablesArn' => [ 'type' => 'string', ], 'S3TablesBucketArn' => [ 'type' => 'string', ], 'S3TablesBucketType' => [ 'type' => 'string', 'enum' => [ 'aws', 'customer', ], ], 'S3TablesDestination' => [ 'type' => 'structure', 'required' => [ 'TableBucketArn', 'TableName', ], 'members' => [ 'TableBucketArn' => [ 'shape' => 'S3TablesBucketArn', ], 'TableName' => [ 'shape' => 'S3TablesName', ], ], ], 'S3TablesDestinationResult' => [ 'type' => 'structure', 'required' => [ 'TableBucketArn', 'TableName', 'TableArn', 'TableNamespace', ], 'members' => [ 'TableBucketArn' => [ 'shape' => 'S3TablesBucketArn', ], 'TableName' => [ 'shape' => 'S3TablesName', ], 'TableArn' => [ 'shape' => 'S3TablesArn', ], 'TableNamespace' => [ 'shape' => 'S3TablesNamespace', ], ], ], 'S3TablesName' => [ 'type' => 'string', ], 'S3TablesNamespace' => [ 'type' => 'string', ], 'SSECustomerAlgorithm' => [ 'type' => 'string', ], 'SSECustomerKey' => [ 'type' => 'string', 'sensitive' => true, ], 'SSECustomerKeyMD5' => [ 'type' => 'string', ], 'SSEKMS' => [ 'type' => 'structure', 'required' => [ 'KeyId', ], 'members' => [ 'KeyId' => [ 'shape' => 'SSEKMSKeyId', ], ], 'locationName' => 'SSE-KMS', ], 'SSEKMSEncryptionContext' => [ 'type' => 'string', 'sensitive' => true, ], 'SSEKMSKeyId' => [ 'type' => 'string', 'sensitive' => true, ], 'SSES3' => [ 'type' => 'structure', 'members' => [], 'locationName' => 'SSE-S3', ], 'ScanRange' => [ 'type' => 'structure', 'members' => [ 'Start' => [ 'shape' => 'Start', ], 'End' => [ 'shape' => 'End', ], ], ], 'SelectObjectContentEventStream' => [ 'type' => 'structure', 'members' => [ 'Records' => [ 'shape' => 'RecordsEvent', ], 'Stats' => [ 'shape' => 'StatsEvent', ], 'Progress' => [ 'shape' => 'ProgressEvent', ], 'Cont' => [ 'shape' => 'ContinuationEvent', ], 'End' => [ 'shape' => 'EndEvent', ], ], 'eventstream' => true, ], 'SelectObjectContentOutput' => [ 'type' => 'structure', 'members' => [ 'Payload' => [ 'shape' => 'SelectObjectContentEventStream', ], ], 'payload' => 'Payload', ], 'SelectObjectContentRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', 'Expression', 'ExpressionType', 'InputSerialization', 'OutputSerialization', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'Expression' => [ 'shape' => 'Expression', ], 'ExpressionType' => [ 'shape' => 'ExpressionType', ], 'RequestProgress' => [ 'shape' => 'RequestProgress', ], 'InputSerialization' => [ 'shape' => 'InputSerialization', ], 'OutputSerialization' => [ 'shape' => 'OutputSerialization', ], 'ScanRange' => [ 'shape' => 'ScanRange', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], ], 'SelectParameters' => [ 'type' => 'structure', 'required' => [ 'InputSerialization', 'ExpressionType', 'Expression', 'OutputSerialization', ], 'members' => [ 'InputSerialization' => [ 'shape' => 'InputSerialization', ], 'ExpressionType' => [ 'shape' => 'ExpressionType', ], 'Expression' => [ 'shape' => 'Expression', ], 'OutputSerialization' => [ 'shape' => 'OutputSerialization', ], ], ], 'ServerSideEncryption' => [ 'type' => 'string', 'enum' => [ 'AES256', 'aws:fsx', 'aws:kms', 'aws:kms:dsse', ], ], 'ServerSideEncryptionByDefault' => [ 'type' => 'structure', 'required' => [ 'SSEAlgorithm', ], 'members' => [ 'SSEAlgorithm' => [ 'shape' => 'ServerSideEncryption', ], 'KMSMasterKeyID' => [ 'shape' => 'SSEKMSKeyId', ], ], ], 'ServerSideEncryptionConfiguration' => [ 'type' => 'structure', 'required' => [ 'Rules', ], 'members' => [ 'Rules' => [ 'shape' => 'ServerSideEncryptionRules', 'locationName' => 'Rule', ], ], ], 'ServerSideEncryptionRule' => [ 'type' => 'structure', 'members' => [ 'ApplyServerSideEncryptionByDefault' => [ 'shape' => 'ServerSideEncryptionByDefault', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', ], 'BlockedEncryptionTypes' => [ 'shape' => 'BlockedEncryptionTypes', ], ], ], 'ServerSideEncryptionRules' => [ 'type' => 'list', 'member' => [ 'shape' => 'ServerSideEncryptionRule', ], 'flattened' => true, ], 'SessionCredentialValue' => [ 'type' => 'string', 'sensitive' => true, ], 'SessionCredentials' => [ 'type' => 'structure', 'required' => [ 'AccessKeyId', 'SecretAccessKey', 'SessionToken', 'Expiration', ], 'members' => [ 'AccessKeyId' => [ 'shape' => 'AccessKeyIdValue', 'locationName' => 'AccessKeyId', ], 'SecretAccessKey' => [ 'shape' => 'SessionCredentialValue', 'locationName' => 'SecretAccessKey', ], 'SessionToken' => [ 'shape' => 'SessionCredentialValue', 'locationName' => 'SessionToken', ], 'Expiration' => [ 'shape' => 'SessionExpiration', 'locationName' => 'Expiration', ], ], ], 'SessionExpiration' => [ 'type' => 'timestamp', ], 'SessionMode' => [ 'type' => 'string', 'enum' => [ 'ReadOnly', 'ReadWrite', ], ], 'Setting' => [ 'type' => 'boolean', 'box' => true, ], 'SimplePrefix' => [ 'type' => 'structure', 'members' => [], 'locationName' => 'SimplePrefix', ], 'Size' => [ 'type' => 'long', 'box' => true, ], 'SkipValidation' => [ 'type' => 'boolean', 'box' => true, ], 'SourceSelectionCriteria' => [ 'type' => 'structure', 'members' => [ 'SseKmsEncryptedObjects' => [ 'shape' => 'SseKmsEncryptedObjects', ], 'ReplicaModifications' => [ 'shape' => 'ReplicaModifications', ], ], ], 'SseKmsEncryptedObjects' => [ 'type' => 'structure', 'required' => [ 'Status', ], 'members' => [ 'Status' => [ 'shape' => 'SseKmsEncryptedObjectsStatus', ], ], ], 'SseKmsEncryptedObjectsStatus' => [ 'type' => 'string', 'enum' => [ 'Enabled', 'Disabled', ], ], 'Start' => [ 'type' => 'long', 'box' => true, ], 'StartAfter' => [ 'type' => 'string', ], 'Stats' => [ 'type' => 'structure', 'members' => [ 'BytesScanned' => [ 'shape' => 'BytesScanned', ], 'BytesProcessed' => [ 'shape' => 'BytesProcessed', ], 'BytesReturned' => [ 'shape' => 'BytesReturned', ], ], ], 'StatsEvent' => [ 'type' => 'structure', 'members' => [ 'Details' => [ 'shape' => 'Stats', 'eventpayload' => true, ], ], 'event' => true, ], 'StorageClass' => [ 'type' => 'string', 'enum' => [ 'STANDARD', 'REDUCED_REDUNDANCY', 'STANDARD_IA', 'ONEZONE_IA', 'INTELLIGENT_TIERING', 'GLACIER', 'DEEP_ARCHIVE', 'OUTPOSTS', 'GLACIER_IR', 'SNOW', 'EXPRESS_ONEZONE', 'FSX_OPENZFS', ], ], 'StorageClassAnalysis' => [ 'type' => 'structure', 'members' => [ 'DataExport' => [ 'shape' => 'StorageClassAnalysisDataExport', ], ], ], 'StorageClassAnalysisDataExport' => [ 'type' => 'structure', 'required' => [ 'OutputSchemaVersion', 'Destination', ], 'members' => [ 'OutputSchemaVersion' => [ 'shape' => 'StorageClassAnalysisSchemaVersion', ], 'Destination' => [ 'shape' => 'AnalyticsExportDestination', ], ], ], 'StorageClassAnalysisSchemaVersion' => [ 'type' => 'string', 'enum' => [ 'V_1', ], ], 'Suffix' => [ 'type' => 'string', ], 'TableSseAlgorithm' => [ 'type' => 'string', 'enum' => [ 'aws:kms', 'AES256', ], ], 'Tag' => [ 'type' => 'structure', 'required' => [ 'Key', 'Value', ], 'members' => [ 'Key' => [ 'shape' => 'ObjectKey', ], 'Value' => [ 'shape' => 'Value', ], ], ], 'TagCount' => [ 'type' => 'integer', 'box' => true, ], 'TagSet' => [ 'type' => 'list', 'member' => [ 'shape' => 'Tag', 'locationName' => 'Tag', ], ], 'Tagging' => [ 'type' => 'structure', 'required' => [ 'TagSet', ], 'members' => [ 'TagSet' => [ 'shape' => 'TagSet', ], ], ], 'TaggingDirective' => [ 'type' => 'string', 'enum' => [ 'COPY', 'REPLACE', ], ], 'TaggingHeader' => [ 'type' => 'string', ], 'TargetBucket' => [ 'type' => 'string', ], 'TargetGrant' => [ 'type' => 'structure', 'members' => [ 'Grantee' => [ 'shape' => 'Grantee', ], 'Permission' => [ 'shape' => 'BucketLogsPermission', ], ], ], 'TargetGrants' => [ 'type' => 'list', 'member' => [ 'shape' => 'TargetGrant', 'locationName' => 'Grant', ], ], 'TargetObjectKeyFormat' => [ 'type' => 'structure', 'members' => [ 'SimplePrefix' => [ 'shape' => 'SimplePrefix', 'locationName' => 'SimplePrefix', ], 'PartitionedPrefix' => [ 'shape' => 'PartitionedPrefix', 'locationName' => 'PartitionedPrefix', ], ], ], 'TargetPrefix' => [ 'type' => 'string', ], 'Tier' => [ 'type' => 'string', 'enum' => [ 'Standard', 'Bulk', 'Expedited', ], ], 'Tiering' => [ 'type' => 'structure', 'required' => [ 'Days', 'AccessTier', ], 'members' => [ 'Days' => [ 'shape' => 'IntelligentTieringDays', ], 'AccessTier' => [ 'shape' => 'IntelligentTieringAccessTier', ], ], ], 'TieringList' => [ 'type' => 'list', 'member' => [ 'shape' => 'Tiering', ], 'flattened' => true, ], 'Token' => [ 'type' => 'string', ], 'TooManyParts' => [ 'type' => 'structure', 'members' => [], 'error' => [ 'httpStatusCode' => 400, ], 'exception' => true, ], 'TopicArn' => [ 'type' => 'string', ], 'TopicConfiguration' => [ 'type' => 'structure', 'required' => [ 'TopicArn', 'Events', ], 'members' => [ 'Id' => [ 'shape' => 'NotificationId', ], 'TopicArn' => [ 'shape' => 'TopicArn', 'locationName' => 'Topic', ], 'Events' => [ 'shape' => 'EventList', 'locationName' => 'Event', ], 'Filter' => [ 'shape' => 'NotificationConfigurationFilter', ], ], ], 'TopicConfigurationDeprecated' => [ 'type' => 'structure', 'members' => [ 'Id' => [ 'shape' => 'NotificationId', ], 'Events' => [ 'shape' => 'EventList', 'locationName' => 'Event', ], 'Event' => [ 'shape' => 'Event', 'deprecated' => true, ], 'Topic' => [ 'shape' => 'TopicArn', ], ], ], 'TopicConfigurationList' => [ 'type' => 'list', 'member' => [ 'shape' => 'TopicConfiguration', ], 'flattened' => true, ], 'Transition' => [ 'type' => 'structure', 'members' => [ 'Date' => [ 'shape' => 'Date', ], 'Days' => [ 'shape' => 'Days', ], 'StorageClass' => [ 'shape' => 'TransitionStorageClass', ], ], ], 'TransitionDefaultMinimumObjectSize' => [ 'type' => 'string', 'enum' => [ 'varies_by_storage_class', 'all_storage_classes_128K', ], ], 'TransitionList' => [ 'type' => 'list', 'member' => [ 'shape' => 'Transition', ], 'flattened' => true, ], 'TransitionStorageClass' => [ 'type' => 'string', 'enum' => [ 'GLACIER', 'STANDARD_IA', 'ONEZONE_IA', 'INTELLIGENT_TIERING', 'DEEP_ARCHIVE', 'GLACIER_IR', ], ], 'Type' => [ 'type' => 'string', 'enum' => [ 'CanonicalUser', 'AmazonCustomerByEmail', 'Group', ], ], 'URI' => [ 'type' => 'string', ], 'UpdateBucketMetadataInventoryTableConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'InventoryTableConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'InventoryTableConfiguration' => [ 'shape' => 'InventoryTableConfigurationUpdates', 'locationName' => 'InventoryTableConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'InventoryTableConfiguration', ], 'UpdateBucketMetadataJournalTableConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'JournalTableConfiguration', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'JournalTableConfiguration' => [ 'shape' => 'JournalTableConfigurationUpdates', 'locationName' => 'JournalTableConfiguration', 'xmlNamespace' => [ 'uri' => 'http://s3.amazonaws.com/doc/2006-03-01/', ], ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'JournalTableConfiguration', ], 'UploadIdMarker' => [ 'type' => 'string', ], 'UploadPartCopyOutput' => [ 'type' => 'structure', 'members' => [ 'CopySourceVersionId' => [ 'shape' => 'CopySourceVersionId', 'location' => 'header', 'locationName' => 'x-amz-copy-source-version-id', ], 'CopyPartResult' => [ 'shape' => 'CopyPartResult', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], 'payload' => 'CopyPartResult', ], 'UploadPartCopyRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'CopySource', 'Key', 'PartNumber', 'UploadId', ], 'members' => [ 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'CopySource' => [ 'shape' => 'CopySource', 'location' => 'header', 'locationName' => 'x-amz-copy-source', ], 'CopySourceIfMatch' => [ 'shape' => 'CopySourceIfMatch', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-match', ], 'CopySourceIfModifiedSince' => [ 'shape' => 'CopySourceIfModifiedSince', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-modified-since', ], 'CopySourceIfNoneMatch' => [ 'shape' => 'CopySourceIfNoneMatch', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-none-match', ], 'CopySourceIfUnmodifiedSince' => [ 'shape' => 'CopySourceIfUnmodifiedSince', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-unmodified-since', ], 'CopySourceRange' => [ 'shape' => 'CopySourceRange', 'location' => 'header', 'locationName' => 'x-amz-copy-source-range', ], 'Key' => [ 'shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key', ], 'PartNumber' => [ 'shape' => 'PartNumber', 'location' => 'querystring', 'locationName' => 'partNumber', ], 'UploadId' => [ 'shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'CopySourceSSECustomerAlgorithm' => [ 'shape' => 'CopySourceSSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-algorithm', ], 'CopySourceSSECustomerKey' => [ 'shape' => 'CopySourceSSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-key', ], 'CopySourceSSECustomerKeyMD5' => [ 'shape' => 'CopySourceSSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], 'ExpectedSourceBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-source-expected-bucket-owner', ], ], ], 'UploadPartOutput' => [ 'type' => 'structure', 'members' => [ 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption', ], 'ETag' => [ 'shape' => 'ETag', 'location' => 'header', 'locationName' => 'ETag', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc64nvme', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged', ], ], ], 'UploadPartRequest' => [ 'type' => 'structure', 'required' => [ 'Bucket', 'Key', 'PartNumber', 'UploadId', ], 'members' => [ 'Body' => [ 'shape' => 'Body', 'streaming' => true, ], 'Bucket' => [ 'shape' => 'BucketName', 'contextParam' => [ 'name' => 'Bucket', ], 'location' => 'uri', 'locationName' => 'Bucket', ], 'ContentLength' => [ 'shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length', ], 'ContentMD5' => [ 'shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5', ], 'ChecksumAlgorithm' => [ 'shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc64nvme', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256', ], 'Key' => [ 'shape' => 'ObjectKey', 'contextParam' => [ 'name' => 'Key', ], 'location' => 'uri', 'locationName' => 'Key', ], 'PartNumber' => [ 'shape' => 'PartNumber', 'location' => 'querystring', 'locationName' => 'partNumber', ], 'UploadId' => [ 'shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm', ], 'SSECustomerKey' => [ 'shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5', ], 'RequestPayer' => [ 'shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer', ], 'ExpectedBucketOwner' => [ 'shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner', ], ], 'payload' => 'Body', ], 'UserMetadata' => [ 'type' => 'list', 'member' => [ 'shape' => 'MetadataEntry', 'locationName' => 'MetadataEntry', ], ], 'Value' => [ 'type' => 'string', ], 'VersionCount' => [ 'type' => 'integer', 'box' => true, ], 'VersionIdMarker' => [ 'type' => 'string', ], 'VersioningConfiguration' => [ 'type' => 'structure', 'members' => [ 'MFADelete' => [ 'shape' => 'MFADelete', 'locationName' => 'MfaDelete', ], 'Status' => [ 'shape' => 'BucketVersioningStatus', ], ], ], 'WebsiteConfiguration' => [ 'type' => 'structure', 'members' => [ 'ErrorDocument' => [ 'shape' => 'ErrorDocument', ], 'IndexDocument' => [ 'shape' => 'IndexDocument', ], 'RedirectAllRequestsTo' => [ 'shape' => 'RedirectAllRequestsTo', ], 'RoutingRules' => [ 'shape' => 'RoutingRules', ], ], ], 'WebsiteRedirectLocation' => [ 'type' => 'string', ], 'WriteGetObjectResponseRequest' => [ 'type' => 'structure', 'required' => [ 'RequestRoute', 'RequestToken', ], 'members' => [ 'RequestRoute' => [ 'shape' => 'RequestRoute', 'hostLabel' => true, 'location' => 'header', 'locationName' => 'x-amz-request-route', ], 'RequestToken' => [ 'shape' => 'RequestToken', 'location' => 'header', 'locationName' => 'x-amz-request-token', ], 'Body' => [ 'shape' => 'Body', 'streaming' => true, ], 'StatusCode' => [ 'shape' => 'GetObjectResponseStatusCode', 'location' => 'header', 'locationName' => 'x-amz-fwd-status', ], 'ErrorCode' => [ 'shape' => 'ErrorCode', 'location' => 'header', 'locationName' => 'x-amz-fwd-error-code', ], 'ErrorMessage' => [ 'shape' => 'ErrorMessage', 'location' => 'header', 'locationName' => 'x-amz-fwd-error-message', ], 'AcceptRanges' => [ 'shape' => 'AcceptRanges', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-accept-ranges', ], 'CacheControl' => [ 'shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Cache-Control', ], 'ContentDisposition' => [ 'shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Disposition', ], 'ContentEncoding' => [ 'shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Encoding', ], 'ContentLanguage' => [ 'shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Language', ], 'ContentLength' => [ 'shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length', ], 'ContentRange' => [ 'shape' => 'ContentRange', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Range', ], 'ContentType' => [ 'shape' => 'ContentType', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Type', ], 'ChecksumCRC32' => [ 'shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-crc32', ], 'ChecksumCRC32C' => [ 'shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-crc32c', ], 'ChecksumCRC64NVME' => [ 'shape' => 'ChecksumCRC64NVME', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-crc64nvme', ], 'ChecksumSHA1' => [ 'shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-sha1', ], 'ChecksumSHA256' => [ 'shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-sha256', ], 'DeleteMarker' => [ 'shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-delete-marker', ], 'ETag' => [ 'shape' => 'ETag', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-ETag', ], 'Expires' => [ 'shape' => 'Expires', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Expires', ], 'Expiration' => [ 'shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-expiration', ], 'LastModified' => [ 'shape' => 'LastModified', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Last-Modified', ], 'MissingMeta' => [ 'shape' => 'MissingMeta', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-missing-meta', ], 'Metadata' => [ 'shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-', ], 'ObjectLockMode' => [ 'shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-object-lock-mode', ], 'ObjectLockLegalHoldStatus' => [ 'shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-object-lock-legal-hold', ], 'ObjectLockRetainUntilDate' => [ 'shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-object-lock-retain-until-date', ], 'PartsCount' => [ 'shape' => 'PartsCount', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-mp-parts-count', ], 'ReplicationStatus' => [ 'shape' => 'ReplicationStatus', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-replication-status', ], 'RequestCharged' => [ 'shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-request-charged', ], 'Restore' => [ 'shape' => 'Restore', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-restore', ], 'ServerSideEncryption' => [ 'shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption', ], 'SSECustomerAlgorithm' => [ 'shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption-customer-algorithm', ], 'SSEKMSKeyId' => [ 'shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption-aws-kms-key-id', ], 'SSECustomerKeyMD5' => [ 'shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption-customer-key-MD5', ], 'StorageClass' => [ 'shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-storage-class', ], 'TagCount' => [ 'shape' => 'TagCount', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-tagging-count', ], 'VersionId' => [ 'shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-version-id', ], 'BucketKeyEnabled' => [ 'shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption-bucket-key-enabled', ], ], 'payload' => 'Body', ], 'WriteOffsetBytes' => [ 'type' => 'long', 'box' => true, ], 'Years' => [ 'type' => 'integer', 'box' => true, ], ], 'clientContextParams' => [ 'Accelerate' => [ 'documentation' => 'Enables this client to use S3 Transfer Acceleration endpoints.', 'type' => 'boolean', ], 'DisableMultiRegionAccessPoints' => [ 'documentation' => 'Disables this client\'s usage of Multi-Region Access Points.', 'type' => 'boolean', ], 'DisableS3ExpressSessionAuth' => [ 'documentation' => 'Disables this client\'s usage of Session Auth for S3Express buckets and reverts to using conventional SigV4 for those.', 'type' => 'boolean', ], 'ForcePathStyle' => [ 'documentation' => 'Forces this client to use path-style addressing for buckets.', 'type' => 'boolean', ], 'UseArnRegion' => [ 'documentation' => 'Enables this client to use an ARN\'s region when constructing an endpoint instead of the client\'s configured region.', 'type' => 'boolean', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/endpoint-rule-set-1.json.php b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/endpoint-rule-set-1.json.php new file mode 100644 index 0000000..8cc438f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/endpoint-rule-set-1.json.php @@ -0,0 +1,3 @@ + '1.0', 'parameters' => [ 'Bucket' => [ 'required' => false, 'documentation' => 'The S3 bucket used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 bucket.', 'type' => 'string', ], 'Region' => [ 'builtIn' => 'AWS::Region', 'required' => false, 'documentation' => 'The AWS region used to dispatch the request.', 'type' => 'string', ], 'UseFIPS' => [ 'builtIn' => 'AWS::UseFIPS', 'required' => true, 'default' => false, 'documentation' => 'When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.', 'type' => 'boolean', ], 'UseDualStack' => [ 'builtIn' => 'AWS::UseDualStack', 'required' => true, 'default' => false, 'documentation' => 'When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.', 'type' => 'boolean', ], 'Endpoint' => [ 'builtIn' => 'SDK::Endpoint', 'required' => false, 'documentation' => 'Override the endpoint used to send this request', 'type' => 'string', ], 'ForcePathStyle' => [ 'builtIn' => 'AWS::S3::ForcePathStyle', 'required' => true, 'default' => false, 'documentation' => 'When true, force a path-style endpoint to be used where the bucket name is part of the path.', 'type' => 'boolean', ], 'Accelerate' => [ 'builtIn' => 'AWS::S3::Accelerate', 'required' => true, 'default' => false, 'documentation' => 'When true, use S3 Accelerate. NOTE: Not all regions support S3 accelerate.', 'type' => 'boolean', ], 'UseGlobalEndpoint' => [ 'builtIn' => 'AWS::S3::UseGlobalEndpoint', 'required' => true, 'default' => false, 'documentation' => 'Whether the global endpoint should be used, rather then the regional endpoint for us-east-1.', 'type' => 'boolean', ], 'UseObjectLambdaEndpoint' => [ 'required' => false, 'documentation' => 'Internal parameter to use object lambda endpoint for an operation (eg: WriteGetObjectResponse)', 'type' => 'boolean', ], 'Key' => [ 'required' => false, 'documentation' => 'The S3 Key used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 Key.', 'type' => 'string', ], 'Prefix' => [ 'required' => false, 'documentation' => 'The S3 Prefix used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 Prefix.', 'type' => 'string', ], 'CopySource' => [ 'required' => false, 'documentation' => 'The Copy Source used for Copy Object request. This is an optional parameter that will be set automatically for operations that are scoped to Copy Source.', 'type' => 'string', ], 'DisableAccessPoints' => [ 'required' => false, 'documentation' => 'Internal parameter to disable Access Point Buckets', 'type' => 'boolean', ], 'DisableMultiRegionAccessPoints' => [ 'builtIn' => 'AWS::S3::DisableMultiRegionAccessPoints', 'required' => true, 'default' => false, 'documentation' => 'Whether multi-region access points (MRAP) should be disabled.', 'type' => 'boolean', ], 'UseArnRegion' => [ 'builtIn' => 'AWS::S3::UseArnRegion', 'required' => false, 'documentation' => 'When an Access Point ARN is provided and this flag is enabled, the SDK MUST use the ARN\'s region when constructing the endpoint instead of the client\'s configured region.', 'type' => 'boolean', ], 'UseS3ExpressControlEndpoint' => [ 'required' => false, 'documentation' => 'Internal parameter to indicate whether S3Express operation should use control plane, (ex. CreateBucket)', 'type' => 'boolean', ], 'DisableS3ExpressSessionAuth' => [ 'required' => false, 'documentation' => 'Parameter to indicate whether S3Express session auth should be disabled', 'type' => 'boolean', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Region', ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'Accelerate cannot be used with FIPS', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], 'error' => 'Cannot set dual-stack in combination with a custom endpoint.', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'A custom endpoint cannot be combined with FIPS', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'A custom endpoint cannot be combined with S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], 'aws-cn', ], ], ], 'error' => 'Partition does not support FIPS', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 0, 6, true, ], 'assign' => 'bucketSuffix', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'bucketSuffix', ], '--x-s3', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3Express does not support S3 Accelerate.', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'DisableS3ExpressSessionAuth', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableS3ExpressSessionAuth', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'uriEncode', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'uri_encoded_bucket', ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}/{uri_encoded_bucket}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], false, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'S3Express bucket name is not a valid virtual hostable name.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'uriEncode', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'uri_encoded_bucket', ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}/{uri_encoded_bucket}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], false, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'S3Express bucket name is not a valid virtual hostable name.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseS3ExpressControlEndpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseS3ExpressControlEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'uriEncode', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'uri_encoded_bucket', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://s3express-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://s3express-control.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3express-control.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'DisableS3ExpressSessionAuth', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableS3ExpressSessionAuth', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 14, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 14, 16, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 15, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 15, 17, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 19, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 19, 21, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 20, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 20, 22, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 26, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 26, 28, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Unrecognized S3Express bucket name format.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 14, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 14, 16, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 15, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 15, 17, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 19, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 19, 21, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 20, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 20, 22, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 6, 26, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 26, 28, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Unrecognized S3Express bucket name format.', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'S3Express bucket name is not a valid virtual hostable name.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 0, 7, true, ], 'assign' => 'accessPointSuffix', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'accessPointSuffix', ], '--xa-s3', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3Express does not support S3 Accelerate.', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'DisableS3ExpressSessionAuth', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableS3ExpressSessionAuth', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'uriEncode', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'uri_encoded_bucket', ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}/{uri_encoded_bucket}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], false, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'S3Express bucket name is not a valid virtual hostable name.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'uriEncode', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'uri_encoded_bucket', ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}/{uri_encoded_bucket}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], false, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'S3Express bucket name is not a valid virtual hostable name.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'DisableS3ExpressSessionAuth', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableS3ExpressSessionAuth', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 15, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 15, 17, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 16, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 16, 18, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 20, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 20, 22, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 21, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 21, 23, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 27, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 27, 29, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Unrecognized S3Express bucket name format.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 15, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 15, 17, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 16, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 16, 18, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 20, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 20, 22, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 21, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 21, 23, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 7, 27, true, ], 'assign' => 's3expressAvailabilityZoneId', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 27, 29, true, ], 'assign' => 's3expressAvailabilityZoneDelim', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 's3expressAvailabilityZoneDelim', ], '--', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-fips-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3express-{s3expressAvailabilityZoneId}.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4-s3express', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Unrecognized S3Express bucket name format.', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'S3Express bucket name is not a valid virtual hostable name.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseS3ExpressControlEndpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseS3ExpressControlEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://s3express-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://s3express-control.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3express-control.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'backend' => 'S3Express', 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3express', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 49, 50, true, ], 'assign' => 'hardwareType', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 8, 12, true, ], 'assign' => 'regionPrefix', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 0, 7, true, ], 'assign' => 'bucketAliasSuffix', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 32, 49, true, ], 'assign' => 'outpostId', ], [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'regionPartition', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'bucketAliasSuffix', ], '--op-s3', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'outpostId', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'hardwareType', ], 'e', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'regionPrefix', ], 'beta', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], ], 'error' => 'Expected a endpoint to be specified but no endpoint was found', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.ec2.{url#authority}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4a', 'signingName' => 's3-outposts', 'signingRegionSet' => [ '*', ], ], [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.ec2.s3-outposts.{Region}.{regionPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4a', 'signingName' => 's3-outposts', 'signingRegionSet' => [ '*', ], ], [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'hardwareType', ], 'o', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'regionPrefix', ], 'beta', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], ], 'error' => 'Expected a endpoint to be specified but no endpoint was found', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.op-{outpostId}.{url#authority}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4a', 'signingName' => 's3-outposts', 'signingRegionSet' => [ '*', ], ], [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.op-{outpostId}.s3-outposts.{Region}.{regionPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4a', 'signingName' => 's3-outposts', 'signingRegionSet' => [ '*', ], ], [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Unrecognized hardware type: "Expected hardware type o or e but got {hardwareType}"', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], ], ], ], 'error' => 'Custom endpoint `{Endpoint}` was not a valid URI', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'ForcePathStyle', ], false, ], ], [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'Region', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], 'aws-cn', ], ], ], 'error' => 'S3 Accelerate cannot be used in this region', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid region: region was not a valid DNS name.', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'scheme', ], ], 'http', ], ], [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'ForcePathStyle', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'Region', ], false, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid region: region was not a valid DNS name.', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'ForcePathStyle', ], false, ], ], [ 'fn' => 'aws.parseArn', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'bucketArn', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[0]', ], 'assign' => 'arnType', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnType', ], '', ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'service', ], ], 's3-object-lambda', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnType', ], 'accesspoint', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[1]', ], 'assign' => 'accessPointName', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'accessPointName', ], '', ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'S3 Object Lambda does not support Dual-stack', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3 Object Lambda does not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '', ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'DisableAccessPoints', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableAccessPoints', ], true, ], ], ], 'error' => 'Access points are not supported for this operation', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[2]', ], ], ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseArnRegion', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseArnRegion', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '{Region}', ], ], ], ], ], 'error' => 'Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], ], 'assign' => 'bucketPartition', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketPartition', ], 'name', ], ], [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'accountId', ], ], '', ], ], ], 'error' => 'Invalid ARN: Missing account id', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'accountId', ], ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'accessPointName', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => '{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: bucket ARN is missing a region', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnType', ], 'accesspoint', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[1]', ], 'assign' => 'accessPointName', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'accessPointName', ], '', ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '', ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnType', ], 'accesspoint', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '', ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'DisableAccessPoints', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableAccessPoints', ], true, ], ], ], 'error' => 'Access points are not supported for this operation', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[2]', ], ], ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseArnRegion', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseArnRegion', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '{Region}', ], ], ], ], ], 'error' => 'Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], ], 'assign' => 'bucketPartition', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketPartition', ], 'name', ], ], '{partitionResult#name}', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'service', ], ], 's3', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'accountId', ], ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'accessPointName', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'Access Points do not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => '{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'accessPointName', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'S3 MRAP does not support dual-stack', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'S3 MRAP does not support FIPS', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3 MRAP does not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableMultiRegionAccessPoints', ], true, ], ], ], 'error' => 'Invalid configuration: Multi-Region Access Point ARNs are disabled.', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'mrapPartition', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'mrapPartition', ], 'name', ], ], [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'partition', ], ], ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{accessPointName}.accesspoint.s3-global.{mrapPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4a', 'signingName' => 's3', 'signingRegionSet' => [ '*', ], ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Client was configured for partition `{mrapPartition#name}` but bucket referred to partition `{bucketArn#partition}`', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid Access Point Name', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'service', ], ], 's3-outposts', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'S3 Outposts does not support Dual-stack', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'S3 Outposts does not support FIPS', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3 Outposts does not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[4]', ], ], ], ], ], 'error' => 'Invalid Arn: Outpost Access Point ARN contains sub resources', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[1]', ], 'assign' => 'outpostId', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'outpostId', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseArnRegion', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseArnRegion', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '{Region}', ], ], ], ], ], 'error' => 'Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], ], 'assign' => 'bucketPartition', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketPartition', ], 'name', ], ], [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'accountId', ], ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[2]', ], 'assign' => 'outpostType', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[3]', ], 'assign' => 'accessPointName', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'outpostType', ], 'accesspoint', ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.{outpostId}.{url#authority}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4a', 'signingName' => 's3-outposts', 'signingRegionSet' => [ '*', ], ], [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.{outpostId}.s3-outposts.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4a', 'signingName' => 's3-outposts', 'signingRegionSet' => [ '*', ], ], [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Expected an outpost type `accesspoint`, found {outpostType}', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: expected an access point name', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: Expected a 4-component resource', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId}`', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: The Outpost Id was not set', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid ARN: No ARN type specified', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 0, 4, false, ], 'assign' => 'arnPrefix', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnPrefix', ], 'arn:', ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'aws.parseArn', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], ], ], ], ], 'error' => 'Invalid ARN: `{Bucket}` was not a valid ARN', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'ForcePathStyle', ], true, ], ], [ 'fn' => 'aws.parseArn', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], 'error' => 'Path-style addressing cannot be used with ARN buckets', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'uriEncode', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'uri_encoded_bucket', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Path-style addressing cannot be used with S3 Accelerate', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseObjectLambdaEndpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseObjectLambdaEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'Region', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'S3 Object Lambda does not support Dual-stack', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3 Object Lambda does not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://s3-object-lambda-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-object-lambda.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid region: region was not a valid DNS name.', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'Region', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid region: region was not a valid DNS name.', 'type' => 'error', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'A region must be set when sending requests to S3.', 'type' => 'error', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/paginators-1.json.php b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/paginators-1.json.php new file mode 100644 index 0000000..c255cce --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/paginators-1.json.php @@ -0,0 +1,3 @@ + [ 'ListBuckets' => [ 'input_token' => 'ContinuationToken', 'limit_key' => 'MaxBuckets', 'output_token' => 'ContinuationToken', 'result_key' => 'Buckets', ], 'ListDirectoryBuckets' => [ 'input_token' => 'ContinuationToken', 'limit_key' => 'MaxDirectoryBuckets', 'output_token' => 'ContinuationToken', 'result_key' => 'Buckets', ], 'ListMultipartUploads' => [ 'input_token' => [ 'KeyMarker', 'UploadIdMarker', ], 'limit_key' => 'MaxUploads', 'more_results' => 'IsTruncated', 'output_token' => [ 'NextKeyMarker', 'NextUploadIdMarker', ], 'result_key' => [ 'Uploads', 'CommonPrefixes', ], ], 'ListObjectVersions' => [ 'input_token' => [ 'KeyMarker', 'VersionIdMarker', ], 'limit_key' => 'MaxKeys', 'more_results' => 'IsTruncated', 'output_token' => [ 'NextKeyMarker', 'NextVersionIdMarker', ], 'result_key' => [ 'Versions', 'DeleteMarkers', 'CommonPrefixes', ], ], 'ListObjects' => [ 'input_token' => 'Marker', 'limit_key' => 'MaxKeys', 'more_results' => 'IsTruncated', 'output_token' => 'NextMarker || Contents[-1].Key', 'result_key' => [ 'Contents', 'CommonPrefixes', ], ], 'ListObjectsV2' => [ 'input_token' => 'ContinuationToken', 'limit_key' => 'MaxKeys', 'output_token' => 'NextContinuationToken', 'result_key' => [ 'Contents', 'CommonPrefixes', ], ], 'ListParts' => [ 'input_token' => 'PartNumberMarker', 'limit_key' => 'MaxParts', 'more_results' => 'IsTruncated', 'output_token' => 'NextPartNumberMarker', 'result_key' => 'Parts', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/smoke.json.php b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/smoke.json.php new file mode 100644 index 0000000..1d393b0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/smoke.json.php @@ -0,0 +1,3 @@ + 1, 'defaultRegion' => 'us-west-2', 'testCases' => [ [ 'operationName' => 'ListBuckets', 'input' => [], 'errorExpectedFromService' => false, ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-1.json.php b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-1.json.php new file mode 100644 index 0000000..70e0bdb --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-1.json.php @@ -0,0 +1,3 @@ + [ '__default__' => [ 'interval' => 5, 'max_attempts' => 20, ], 'BucketExists' => [ 'operation' => 'HeadBucket', 'ignore_errors' => [ 'NoSuchBucket', ], 'success_type' => 'output', ], 'BucketNotExists' => [ 'operation' => 'HeadBucket', 'success_type' => 'error', 'success_value' => 'NoSuchBucket', ], 'ObjectExists' => [ 'operation' => 'HeadObject', 'ignore_errors' => [ 'NoSuchKey', ], 'success_type' => 'output', ], 'ObjectNotExists' => [ 'operation' => 'HeadObject', 'success_type' => 'error', 'success_value' => 'NoSuchKey', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-2.json.php b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-2.json.php new file mode 100644 index 0000000..6058168 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-2.json.php @@ -0,0 +1,3 @@ + 2, 'waiters' => [ 'BucketExists' => [ 'delay' => 5, 'operation' => 'HeadBucket', 'maxAttempts' => 20, 'acceptors' => [ [ 'expected' => 200, 'matcher' => 'status', 'state' => 'success', ], [ 'expected' => 301, 'matcher' => 'status', 'state' => 'success', ], [ 'expected' => 403, 'matcher' => 'status', 'state' => 'success', ], [ 'expected' => 404, 'matcher' => 'status', 'state' => 'retry', ], ], ], 'BucketNotExists' => [ 'delay' => 5, 'operation' => 'HeadBucket', 'maxAttempts' => 20, 'acceptors' => [ [ 'expected' => 404, 'matcher' => 'status', 'state' => 'success', ], ], ], 'ObjectExists' => [ 'delay' => 5, 'operation' => 'HeadObject', 'maxAttempts' => 20, 'acceptors' => [ [ 'expected' => 200, 'matcher' => 'status', 'state' => 'success', ], [ 'expected' => 404, 'matcher' => 'status', 'state' => 'retry', ], ], ], 'ObjectNotExists' => [ 'delay' => 5, 'operation' => 'HeadObject', 'maxAttempts' => 20, 'acceptors' => [ [ 'expected' => 404, 'matcher' => 'status', 'state' => 'success', ], ], ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/api-2.json.php b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/api-2.json.php new file mode 100644 index 0000000..4ca20ac --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/api-2.json.php @@ -0,0 +1,3 @@ + '2.0', 'metadata' => [ 'apiVersion' => '2018-05-10', 'auth' => [ 'aws.auth#sigv4', ], 'endpointPrefix' => 's3tables', 'protocol' => 'rest-json', 'protocols' => [ 'rest-json', ], 'serviceFullName' => 'Amazon S3 Tables', 'serviceId' => 'S3Tables', 'signatureVersion' => 'v4', 'signingName' => 's3tables', 'uid' => 's3tables-2018-05-10', ], 'operations' => [ 'CreateNamespace' => [ 'name' => 'CreateNamespace', 'http' => [ 'method' => 'PUT', 'requestUri' => '/namespaces/{tableBucketARN}', 'responseCode' => 200, ], 'input' => [ 'shape' => 'CreateNamespaceRequest', ], 'output' => [ 'shape' => 'CreateNamespaceResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], ], 'CreateTable' => [ 'name' => 'CreateTable', 'http' => [ 'method' => 'PUT', 'requestUri' => '/tables/{tableBucketARN}/{namespace}', 'responseCode' => 200, ], 'input' => [ 'shape' => 'CreateTableRequest', ], 'output' => [ 'shape' => 'CreateTableResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], ], 'CreateTableBucket' => [ 'name' => 'CreateTableBucket', 'http' => [ 'method' => 'PUT', 'requestUri' => '/buckets', 'responseCode' => 200, ], 'input' => [ 'shape' => 'CreateTableBucketRequest', ], 'output' => [ 'shape' => 'CreateTableBucketResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], ], 'DeleteNamespace' => [ 'name' => 'DeleteNamespace', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/namespaces/{tableBucketARN}/{namespace}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteNamespaceRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'DeleteTable' => [ 'name' => 'DeleteTable', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteTableRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'DeleteTableBucket' => [ 'name' => 'DeleteTableBucket', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/buckets/{tableBucketARN}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteTableBucketRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'DeleteTableBucketEncryption' => [ 'name' => 'DeleteTableBucketEncryption', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/buckets/{tableBucketARN}/encryption', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteTableBucketEncryptionRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'DeleteTableBucketMetricsConfiguration' => [ 'name' => 'DeleteTableBucketMetricsConfiguration', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/buckets/{tableBucketARN}/metrics', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteTableBucketMetricsConfigurationRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'DeleteTableBucketPolicy' => [ 'name' => 'DeleteTableBucketPolicy', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/buckets/{tableBucketARN}/policy', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteTableBucketPolicyRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'DeleteTablePolicy' => [ 'name' => 'DeleteTablePolicy', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/policy', 'responseCode' => 204, ], 'input' => [ 'shape' => 'DeleteTablePolicyRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'GetNamespace' => [ 'name' => 'GetNamespace', 'http' => [ 'method' => 'GET', 'requestUri' => '/namespaces/{tableBucketARN}/{namespace}', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetNamespaceRequest', ], 'output' => [ 'shape' => 'GetNamespaceResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTable' => [ 'name' => 'GetTable', 'http' => [ 'method' => 'GET', 'requestUri' => '/get-table', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableRequest', ], 'output' => [ 'shape' => 'GetTableResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableBucket' => [ 'name' => 'GetTableBucket', 'http' => [ 'method' => 'GET', 'requestUri' => '/buckets/{tableBucketARN}', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableBucketRequest', ], 'output' => [ 'shape' => 'GetTableBucketResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableBucketEncryption' => [ 'name' => 'GetTableBucketEncryption', 'http' => [ 'method' => 'GET', 'requestUri' => '/buckets/{tableBucketARN}/encryption', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableBucketEncryptionRequest', ], 'output' => [ 'shape' => 'GetTableBucketEncryptionResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableBucketMaintenanceConfiguration' => [ 'name' => 'GetTableBucketMaintenanceConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/buckets/{tableBucketARN}/maintenance', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableBucketMaintenanceConfigurationRequest', ], 'output' => [ 'shape' => 'GetTableBucketMaintenanceConfigurationResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableBucketMetricsConfiguration' => [ 'name' => 'GetTableBucketMetricsConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/buckets/{tableBucketARN}/metrics', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableBucketMetricsConfigurationRequest', ], 'output' => [ 'shape' => 'GetTableBucketMetricsConfigurationResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableBucketPolicy' => [ 'name' => 'GetTableBucketPolicy', 'http' => [ 'method' => 'GET', 'requestUri' => '/buckets/{tableBucketARN}/policy', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableBucketPolicyRequest', ], 'output' => [ 'shape' => 'GetTableBucketPolicyResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableEncryption' => [ 'name' => 'GetTableEncryption', 'http' => [ 'method' => 'GET', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/encryption', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableEncryptionRequest', ], 'output' => [ 'shape' => 'GetTableEncryptionResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableMaintenanceConfiguration' => [ 'name' => 'GetTableMaintenanceConfiguration', 'http' => [ 'method' => 'GET', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/maintenance', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableMaintenanceConfigurationRequest', ], 'output' => [ 'shape' => 'GetTableMaintenanceConfigurationResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableMaintenanceJobStatus' => [ 'name' => 'GetTableMaintenanceJobStatus', 'http' => [ 'method' => 'GET', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/maintenance-job-status', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableMaintenanceJobStatusRequest', ], 'output' => [ 'shape' => 'GetTableMaintenanceJobStatusResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTableMetadataLocation' => [ 'name' => 'GetTableMetadataLocation', 'http' => [ 'method' => 'GET', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/metadata-location', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTableMetadataLocationRequest', ], 'output' => [ 'shape' => 'GetTableMetadataLocationResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'GetTablePolicy' => [ 'name' => 'GetTablePolicy', 'http' => [ 'method' => 'GET', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/policy', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetTablePolicyRequest', ], 'output' => [ 'shape' => 'GetTablePolicyResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'ListNamespaces' => [ 'name' => 'ListNamespaces', 'http' => [ 'method' => 'GET', 'requestUri' => '/namespaces/{tableBucketARN}', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListNamespacesRequest', ], 'output' => [ 'shape' => 'ListNamespacesResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'ListTableBuckets' => [ 'name' => 'ListTableBuckets', 'http' => [ 'method' => 'GET', 'requestUri' => '/buckets', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListTableBucketsRequest', ], 'output' => [ 'shape' => 'ListTableBucketsResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'ListTables' => [ 'name' => 'ListTables', 'http' => [ 'method' => 'GET', 'requestUri' => '/tables/{tableBucketARN}', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListTablesRequest', ], 'output' => [ 'shape' => 'ListTablesResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'readonly' => true, ], 'ListTagsForResource' => [ 'name' => 'ListTagsForResource', 'http' => [ 'method' => 'GET', 'requestUri' => '/tag/{resourceArn}', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListTagsForResourceRequest', ], 'output' => [ 'shape' => 'ListTagsForResourceResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'PutTableBucketEncryption' => [ 'name' => 'PutTableBucketEncryption', 'http' => [ 'method' => 'PUT', 'requestUri' => '/buckets/{tableBucketARN}/encryption', 'responseCode' => 200, ], 'input' => [ 'shape' => 'PutTableBucketEncryptionRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'PutTableBucketMaintenanceConfiguration' => [ 'name' => 'PutTableBucketMaintenanceConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/buckets/{tableBucketARN}/maintenance/{type}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'PutTableBucketMaintenanceConfigurationRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], ], 'PutTableBucketMetricsConfiguration' => [ 'name' => 'PutTableBucketMetricsConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/buckets/{tableBucketARN}/metrics', 'responseCode' => 204, ], 'input' => [ 'shape' => 'PutTableBucketMetricsConfigurationRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'PutTableBucketPolicy' => [ 'name' => 'PutTableBucketPolicy', 'http' => [ 'method' => 'PUT', 'requestUri' => '/buckets/{tableBucketARN}/policy', 'responseCode' => 200, ], 'input' => [ 'shape' => 'PutTableBucketPolicyRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'PutTableMaintenanceConfiguration' => [ 'name' => 'PutTableMaintenanceConfiguration', 'http' => [ 'method' => 'PUT', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/maintenance/{type}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'PutTableMaintenanceConfigurationRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], ], 'PutTablePolicy' => [ 'name' => 'PutTablePolicy', 'http' => [ 'method' => 'PUT', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/policy', 'responseCode' => 200, ], 'input' => [ 'shape' => 'PutTablePolicyRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'RenameTable' => [ 'name' => 'RenameTable', 'http' => [ 'method' => 'PUT', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/rename', 'responseCode' => 204, ], 'input' => [ 'shape' => 'RenameTableRequest', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], ], 'TagResource' => [ 'name' => 'TagResource', 'http' => [ 'method' => 'POST', 'requestUri' => '/tag/{resourceArn}', 'responseCode' => 200, ], 'input' => [ 'shape' => 'TagResourceRequest', ], 'output' => [ 'shape' => 'TagResourceResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'UntagResource' => [ 'name' => 'UntagResource', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/tag/{resourceArn}', 'responseCode' => 204, ], 'input' => [ 'shape' => 'UntagResourceRequest', ], 'output' => [ 'shape' => 'UntagResourceResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], 'idempotent' => true, ], 'UpdateTableMetadataLocation' => [ 'name' => 'UpdateTableMetadataLocation', 'http' => [ 'method' => 'PUT', 'requestUri' => '/tables/{tableBucketARN}/{namespace}/{name}/metadata-location', 'responseCode' => 200, ], 'input' => [ 'shape' => 'UpdateTableMetadataLocationRequest', ], 'output' => [ 'shape' => 'UpdateTableMetadataLocationResponse', ], 'errors' => [ [ 'shape' => 'InternalServerErrorException', ], [ 'shape' => 'ForbiddenException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'BadRequestException', ], ], ], ], 'shapes' => [ 'AccessDeniedException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 403, 'senderFault' => true, ], 'exception' => true, ], 'AccountId' => [ 'type' => 'string', 'max' => 12, 'min' => 12, 'pattern' => '[0-9].*', ], 'BadRequestException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 400, 'senderFault' => true, ], 'exception' => true, ], 'Boolean' => [ 'type' => 'boolean', 'box' => true, ], 'ConflictException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 409, 'senderFault' => true, ], 'exception' => true, ], 'CreateNamespaceRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'CreateNamespaceRequestNamespaceList', ], ], ], 'CreateNamespaceRequestNamespaceList' => [ 'type' => 'list', 'member' => [ 'shape' => 'NamespaceName', ], 'max' => 1, 'min' => 1, ], 'CreateNamespaceResponse' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceList', ], ], ], 'CreateTableBucketRequest' => [ 'type' => 'structure', 'required' => [ 'name', ], 'members' => [ 'name' => [ 'shape' => 'TableBucketName', ], 'encryptionConfiguration' => [ 'shape' => 'EncryptionConfiguration', ], 'tags' => [ 'shape' => 'Tags', ], ], ], 'CreateTableBucketResponse' => [ 'type' => 'structure', 'required' => [ 'arn', ], 'members' => [ 'arn' => [ 'shape' => 'TableBucketARN', ], ], ], 'CreateTableRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', 'format', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', ], 'format' => [ 'shape' => 'OpenTableFormat', ], 'metadata' => [ 'shape' => 'TableMetadata', ], 'encryptionConfiguration' => [ 'shape' => 'EncryptionConfiguration', ], 'tags' => [ 'shape' => 'Tags', ], ], ], 'CreateTableResponse' => [ 'type' => 'structure', 'required' => [ 'tableARN', 'versionToken', ], 'members' => [ 'tableARN' => [ 'shape' => 'TableARN', ], 'versionToken' => [ 'shape' => 'VersionToken', ], ], ], 'DeleteNamespaceRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], ], ], 'DeleteTableBucketEncryptionRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'DeleteTableBucketMetricsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'DeleteTableBucketPolicyRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'DeleteTableBucketRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'DeleteTablePolicyRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], ], ], 'DeleteTableRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], 'versionToken' => [ 'shape' => 'VersionToken', 'location' => 'querystring', 'locationName' => 'versionToken', ], ], ], 'EncryptionConfiguration' => [ 'type' => 'structure', 'required' => [ 'sseAlgorithm', ], 'members' => [ 'sseAlgorithm' => [ 'shape' => 'SSEAlgorithm', ], 'kmsKeyArn' => [ 'shape' => 'EncryptionConfigurationKmsKeyArnString', ], ], ], 'EncryptionConfigurationKmsKeyArnString' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, 'pattern' => '(arn:aws[-a-z0-9]*:kms:[-a-z0-9]*:[0-9]{12}:key/.+)', ], 'ErrorMessage' => [ 'type' => 'string', ], 'ForbiddenException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 403, 'senderFault' => true, ], 'exception' => true, ], 'GetNamespaceRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], ], ], 'GetNamespaceResponse' => [ 'type' => 'structure', 'required' => [ 'namespace', 'createdAt', 'createdBy', 'ownerAccountId', ], 'members' => [ 'namespace' => [ 'shape' => 'NamespaceList', ], 'createdAt' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'createdBy' => [ 'shape' => 'AccountId', ], 'ownerAccountId' => [ 'shape' => 'AccountId', ], 'namespaceId' => [ 'shape' => 'NamespaceId', ], 'tableBucketId' => [ 'shape' => 'TableBucketId', ], ], ], 'GetTableBucketEncryptionRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'GetTableBucketEncryptionResponse' => [ 'type' => 'structure', 'required' => [ 'encryptionConfiguration', ], 'members' => [ 'encryptionConfiguration' => [ 'shape' => 'EncryptionConfiguration', ], ], ], 'GetTableBucketMaintenanceConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'GetTableBucketMaintenanceConfigurationResponse' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'configuration', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', ], 'configuration' => [ 'shape' => 'TableBucketMaintenanceConfiguration', ], ], ], 'GetTableBucketMetricsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'GetTableBucketMetricsConfigurationResponse' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', ], 'id' => [ 'shape' => 'String', ], ], ], 'GetTableBucketPolicyRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'GetTableBucketPolicyResponse' => [ 'type' => 'structure', 'required' => [ 'resourcePolicy', ], 'members' => [ 'resourcePolicy' => [ 'shape' => 'ResourcePolicy', ], ], ], 'GetTableBucketRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'GetTableBucketResponse' => [ 'type' => 'structure', 'required' => [ 'arn', 'name', 'ownerAccountId', 'createdAt', ], 'members' => [ 'arn' => [ 'shape' => 'TableBucketARN', ], 'name' => [ 'shape' => 'TableBucketName', ], 'ownerAccountId' => [ 'shape' => 'AccountId', ], 'createdAt' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'tableBucketId' => [ 'shape' => 'TableBucketId', ], 'type' => [ 'shape' => 'TableBucketType', ], ], ], 'GetTableEncryptionRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], ], ], 'GetTableEncryptionResponse' => [ 'type' => 'structure', 'required' => [ 'encryptionConfiguration', ], 'members' => [ 'encryptionConfiguration' => [ 'shape' => 'EncryptionConfiguration', ], ], ], 'GetTableMaintenanceConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], ], ], 'GetTableMaintenanceConfigurationResponse' => [ 'type' => 'structure', 'required' => [ 'tableARN', 'configuration', ], 'members' => [ 'tableARN' => [ 'shape' => 'TableARN', ], 'configuration' => [ 'shape' => 'TableMaintenanceConfiguration', ], ], ], 'GetTableMaintenanceJobStatusRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], ], ], 'GetTableMaintenanceJobStatusResponse' => [ 'type' => 'structure', 'required' => [ 'tableARN', 'status', ], 'members' => [ 'tableARN' => [ 'shape' => 'TableARN', ], 'status' => [ 'shape' => 'TableMaintenanceJobStatus', ], ], ], 'GetTableMetadataLocationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], ], ], 'GetTableMetadataLocationResponse' => [ 'type' => 'structure', 'required' => [ 'versionToken', 'warehouseLocation', ], 'members' => [ 'versionToken' => [ 'shape' => 'VersionToken', ], 'metadataLocation' => [ 'shape' => 'MetadataLocation', ], 'warehouseLocation' => [ 'shape' => 'WarehouseLocation', ], ], ], 'GetTablePolicyRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], ], ], 'GetTablePolicyResponse' => [ 'type' => 'structure', 'required' => [ 'resourcePolicy', ], 'members' => [ 'resourcePolicy' => [ 'shape' => 'ResourcePolicy', ], ], ], 'GetTableRequest' => [ 'type' => 'structure', 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'querystring', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'querystring', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'querystring', 'locationName' => 'name', ], 'tableArn' => [ 'shape' => 'TableARN', 'location' => 'querystring', 'locationName' => 'tableArn', ], ], ], 'GetTableResponse' => [ 'type' => 'structure', 'required' => [ 'name', 'type', 'tableARN', 'namespace', 'versionToken', 'warehouseLocation', 'createdAt', 'createdBy', 'modifiedAt', 'modifiedBy', 'ownerAccountId', 'format', ], 'members' => [ 'name' => [ 'shape' => 'TableName', ], 'type' => [ 'shape' => 'TableType', ], 'tableARN' => [ 'shape' => 'TableARN', ], 'namespace' => [ 'shape' => 'NamespaceList', ], 'namespaceId' => [ 'shape' => 'NamespaceId', ], 'versionToken' => [ 'shape' => 'VersionToken', ], 'metadataLocation' => [ 'shape' => 'MetadataLocation', ], 'warehouseLocation' => [ 'shape' => 'WarehouseLocation', ], 'createdAt' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'createdBy' => [ 'shape' => 'AccountId', ], 'managedByService' => [ 'shape' => 'String', ], 'modifiedAt' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'modifiedBy' => [ 'shape' => 'AccountId', ], 'ownerAccountId' => [ 'shape' => 'AccountId', ], 'format' => [ 'shape' => 'OpenTableFormat', ], 'tableBucketId' => [ 'shape' => 'TableBucketId', ], ], ], 'IcebergCompactionSettings' => [ 'type' => 'structure', 'members' => [ 'targetFileSizeMB' => [ 'shape' => 'PositiveInteger', ], 'strategy' => [ 'shape' => 'IcebergCompactionStrategy', ], ], ], 'IcebergCompactionStrategy' => [ 'type' => 'string', 'enum' => [ 'auto', 'binpack', 'sort', 'z-order', ], ], 'IcebergMetadata' => [ 'type' => 'structure', 'required' => [ 'schema', ], 'members' => [ 'schema' => [ 'shape' => 'IcebergSchema', ], ], ], 'IcebergSchema' => [ 'type' => 'structure', 'required' => [ 'fields', ], 'members' => [ 'fields' => [ 'shape' => 'SchemaFieldList', ], ], ], 'IcebergSnapshotManagementSettings' => [ 'type' => 'structure', 'members' => [ 'minSnapshotsToKeep' => [ 'shape' => 'PositiveInteger', ], 'maxSnapshotAgeHours' => [ 'shape' => 'PositiveInteger', ], ], ], 'IcebergUnreferencedFileRemovalSettings' => [ 'type' => 'structure', 'members' => [ 'unreferencedDays' => [ 'shape' => 'PositiveInteger', ], 'nonCurrentDays' => [ 'shape' => 'PositiveInteger', ], ], ], 'InternalServerErrorException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 500, ], 'exception' => true, 'fault' => true, ], 'JobStatus' => [ 'type' => 'string', 'enum' => [ 'Not_Yet_Run', 'Successful', 'Failed', 'Disabled', ], ], 'ListNamespacesLimit' => [ 'type' => 'integer', 'box' => true, 'max' => 1000, 'min' => 1, ], 'ListNamespacesRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'prefix' => [ 'shape' => 'ListNamespacesRequestPrefixString', 'location' => 'querystring', 'locationName' => 'prefix', ], 'continuationToken' => [ 'shape' => 'NextToken', 'location' => 'querystring', 'locationName' => 'continuationToken', ], 'maxNamespaces' => [ 'shape' => 'ListNamespacesLimit', 'location' => 'querystring', 'locationName' => 'maxNamespaces', ], ], ], 'ListNamespacesRequestPrefixString' => [ 'type' => 'string', 'max' => 255, 'min' => 1, ], 'ListNamespacesResponse' => [ 'type' => 'structure', 'required' => [ 'namespaces', ], 'members' => [ 'namespaces' => [ 'shape' => 'NamespaceSummaryList', ], 'continuationToken' => [ 'shape' => 'NextToken', ], ], ], 'ListTableBucketsLimit' => [ 'type' => 'integer', 'box' => true, 'max' => 1000, 'min' => 1, ], 'ListTableBucketsRequest' => [ 'type' => 'structure', 'members' => [ 'prefix' => [ 'shape' => 'ListTableBucketsRequestPrefixString', 'location' => 'querystring', 'locationName' => 'prefix', ], 'continuationToken' => [ 'shape' => 'NextToken', 'location' => 'querystring', 'locationName' => 'continuationToken', ], 'maxBuckets' => [ 'shape' => 'ListTableBucketsLimit', 'location' => 'querystring', 'locationName' => 'maxBuckets', ], 'type' => [ 'shape' => 'TableBucketType', 'location' => 'querystring', 'locationName' => 'type', ], ], ], 'ListTableBucketsRequestPrefixString' => [ 'type' => 'string', 'max' => 63, 'min' => 1, ], 'ListTableBucketsResponse' => [ 'type' => 'structure', 'required' => [ 'tableBuckets', ], 'members' => [ 'tableBuckets' => [ 'shape' => 'TableBucketSummaryList', ], 'continuationToken' => [ 'shape' => 'NextToken', ], ], ], 'ListTablesLimit' => [ 'type' => 'integer', 'box' => true, 'max' => 1000, 'min' => 1, ], 'ListTablesRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'querystring', 'locationName' => 'namespace', ], 'prefix' => [ 'shape' => 'ListTablesRequestPrefixString', 'location' => 'querystring', 'locationName' => 'prefix', ], 'continuationToken' => [ 'shape' => 'NextToken', 'location' => 'querystring', 'locationName' => 'continuationToken', ], 'maxTables' => [ 'shape' => 'ListTablesLimit', 'location' => 'querystring', 'locationName' => 'maxTables', ], ], ], 'ListTablesRequestPrefixString' => [ 'type' => 'string', 'max' => 255, 'min' => 1, ], 'ListTablesResponse' => [ 'type' => 'structure', 'required' => [ 'tables', ], 'members' => [ 'tables' => [ 'shape' => 'TableSummaryList', ], 'continuationToken' => [ 'shape' => 'NextToken', ], ], ], 'ListTagsForResourceRequest' => [ 'type' => 'structure', 'required' => [ 'resourceArn', ], 'members' => [ 'resourceArn' => [ 'shape' => 'ResourceArn', 'location' => 'uri', 'locationName' => 'resourceArn', ], ], ], 'ListTagsForResourceResponse' => [ 'type' => 'structure', 'members' => [ 'tags' => [ 'shape' => 'Tags', ], ], ], 'MaintenanceStatus' => [ 'type' => 'string', 'enum' => [ 'enabled', 'disabled', ], ], 'MetadataLocation' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, ], 'NamespaceId' => [ 'type' => 'string', ], 'NamespaceList' => [ 'type' => 'list', 'member' => [ 'shape' => 'NamespaceName', ], ], 'NamespaceName' => [ 'type' => 'string', 'max' => 255, 'min' => 1, 'pattern' => '[0-9a-z_]*', ], 'NamespaceSummary' => [ 'type' => 'structure', 'required' => [ 'namespace', 'createdAt', 'createdBy', 'ownerAccountId', ], 'members' => [ 'namespace' => [ 'shape' => 'NamespaceList', ], 'createdAt' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'createdBy' => [ 'shape' => 'AccountId', ], 'ownerAccountId' => [ 'shape' => 'AccountId', ], 'namespaceId' => [ 'shape' => 'NamespaceId', ], 'tableBucketId' => [ 'shape' => 'TableBucketId', ], ], ], 'NamespaceSummaryList' => [ 'type' => 'list', 'member' => [ 'shape' => 'NamespaceSummary', ], ], 'NextToken' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, ], 'NotFoundException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 404, 'senderFault' => true, ], 'exception' => true, ], 'OpenTableFormat' => [ 'type' => 'string', 'enum' => [ 'ICEBERG', ], ], 'PositiveInteger' => [ 'type' => 'integer', 'box' => true, 'max' => 2147483647, 'min' => 1, ], 'PutTableBucketEncryptionRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'encryptionConfiguration', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'encryptionConfiguration' => [ 'shape' => 'EncryptionConfiguration', ], ], ], 'PutTableBucketMaintenanceConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'type', 'value', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'type' => [ 'shape' => 'TableBucketMaintenanceType', 'location' => 'uri', 'locationName' => 'type', ], 'value' => [ 'shape' => 'TableBucketMaintenanceConfigurationValue', ], ], ], 'PutTableBucketMetricsConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], ], ], 'PutTableBucketPolicyRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'resourcePolicy', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'resourcePolicy' => [ 'shape' => 'ResourcePolicy', ], ], ], 'PutTableMaintenanceConfigurationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', 'type', 'value', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], 'type' => [ 'shape' => 'TableMaintenanceType', 'location' => 'uri', 'locationName' => 'type', ], 'value' => [ 'shape' => 'TableMaintenanceConfigurationValue', ], ], ], 'PutTablePolicyRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', 'resourcePolicy', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], 'resourcePolicy' => [ 'shape' => 'ResourcePolicy', ], ], ], 'RenameTableRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], 'newNamespaceName' => [ 'shape' => 'NamespaceName', ], 'newName' => [ 'shape' => 'TableName', ], 'versionToken' => [ 'shape' => 'VersionToken', ], ], ], 'ResourceArn' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, 'pattern' => 'arn:aws[-a-z0-9]*:[a-z0-9]+:[-a-z0-9]*:[0-9]{12}:bucket/.+', ], 'ResourcePolicy' => [ 'type' => 'string', 'max' => 20480, 'min' => 1, ], 'SSEAlgorithm' => [ 'type' => 'string', 'enum' => [ 'AES256', 'aws:kms', ], ], 'SchemaField' => [ 'type' => 'structure', 'required' => [ 'name', 'type', ], 'members' => [ 'name' => [ 'shape' => 'String', ], 'type' => [ 'shape' => 'String', ], 'required' => [ 'shape' => 'Boolean', ], ], ], 'SchemaFieldList' => [ 'type' => 'list', 'member' => [ 'shape' => 'SchemaField', ], ], 'String' => [ 'type' => 'string', ], 'SyntheticTimestamp_date_time' => [ 'type' => 'timestamp', 'timestampFormat' => 'iso8601', ], 'TableARN' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, 'pattern' => '(arn:aws[-a-z0-9]*:[a-z0-9]+:[-a-z0-9]*:[0-9]{12}:bucket/[a-z0-9_-]{3,63}/table/[a-zA-Z0-9-_]{1,255})', ], 'TableBucketARN' => [ 'type' => 'string', 'pattern' => '(arn:aws[-a-z0-9]*:[a-z0-9]+:[-a-z0-9]*:[0-9]{12}:bucket/[a-z0-9_-]{3,63})', ], 'TableBucketId' => [ 'type' => 'string', ], 'TableBucketMaintenanceConfiguration' => [ 'type' => 'map', 'key' => [ 'shape' => 'TableBucketMaintenanceType', ], 'value' => [ 'shape' => 'TableBucketMaintenanceConfigurationValue', ], ], 'TableBucketMaintenanceConfigurationValue' => [ 'type' => 'structure', 'members' => [ 'status' => [ 'shape' => 'MaintenanceStatus', ], 'settings' => [ 'shape' => 'TableBucketMaintenanceSettings', ], ], ], 'TableBucketMaintenanceSettings' => [ 'type' => 'structure', 'members' => [ 'icebergUnreferencedFileRemoval' => [ 'shape' => 'IcebergUnreferencedFileRemovalSettings', ], ], 'union' => true, ], 'TableBucketMaintenanceType' => [ 'type' => 'string', 'enum' => [ 'icebergUnreferencedFileRemoval', ], ], 'TableBucketName' => [ 'type' => 'string', 'max' => 63, 'min' => 3, 'pattern' => '[0-9a-z-]*', ], 'TableBucketSummary' => [ 'type' => 'structure', 'required' => [ 'arn', 'name', 'ownerAccountId', 'createdAt', ], 'members' => [ 'arn' => [ 'shape' => 'TableBucketARN', ], 'name' => [ 'shape' => 'TableBucketName', ], 'ownerAccountId' => [ 'shape' => 'AccountId', ], 'createdAt' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'tableBucketId' => [ 'shape' => 'TableBucketId', ], 'type' => [ 'shape' => 'TableBucketType', ], ], ], 'TableBucketSummaryList' => [ 'type' => 'list', 'member' => [ 'shape' => 'TableBucketSummary', ], ], 'TableBucketType' => [ 'type' => 'string', 'enum' => [ 'customer', 'aws', ], ], 'TableMaintenanceConfiguration' => [ 'type' => 'map', 'key' => [ 'shape' => 'TableMaintenanceType', ], 'value' => [ 'shape' => 'TableMaintenanceConfigurationValue', ], ], 'TableMaintenanceConfigurationValue' => [ 'type' => 'structure', 'members' => [ 'status' => [ 'shape' => 'MaintenanceStatus', ], 'settings' => [ 'shape' => 'TableMaintenanceSettings', ], ], ], 'TableMaintenanceJobStatus' => [ 'type' => 'map', 'key' => [ 'shape' => 'TableMaintenanceJobType', ], 'value' => [ 'shape' => 'TableMaintenanceJobStatusValue', ], ], 'TableMaintenanceJobStatusValue' => [ 'type' => 'structure', 'required' => [ 'status', ], 'members' => [ 'status' => [ 'shape' => 'JobStatus', ], 'lastRunTimestamp' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'failureMessage' => [ 'shape' => 'String', ], ], ], 'TableMaintenanceJobType' => [ 'type' => 'string', 'enum' => [ 'icebergCompaction', 'icebergSnapshotManagement', 'icebergUnreferencedFileRemoval', ], ], 'TableMaintenanceSettings' => [ 'type' => 'structure', 'members' => [ 'icebergCompaction' => [ 'shape' => 'IcebergCompactionSettings', ], 'icebergSnapshotManagement' => [ 'shape' => 'IcebergSnapshotManagementSettings', ], ], 'union' => true, ], 'TableMaintenanceType' => [ 'type' => 'string', 'enum' => [ 'icebergCompaction', 'icebergSnapshotManagement', ], ], 'TableMetadata' => [ 'type' => 'structure', 'members' => [ 'iceberg' => [ 'shape' => 'IcebergMetadata', ], ], 'union' => true, ], 'TableName' => [ 'type' => 'string', 'max' => 255, 'min' => 1, 'pattern' => '[0-9a-z_]*', ], 'TableSummary' => [ 'type' => 'structure', 'required' => [ 'namespace', 'name', 'type', 'tableARN', 'createdAt', 'modifiedAt', ], 'members' => [ 'namespace' => [ 'shape' => 'NamespaceList', ], 'name' => [ 'shape' => 'TableName', ], 'type' => [ 'shape' => 'TableType', ], 'tableARN' => [ 'shape' => 'TableARN', ], 'createdAt' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'modifiedAt' => [ 'shape' => 'SyntheticTimestamp_date_time', ], 'namespaceId' => [ 'shape' => 'NamespaceId', ], 'tableBucketId' => [ 'shape' => 'TableBucketId', ], ], ], 'TableSummaryList' => [ 'type' => 'list', 'member' => [ 'shape' => 'TableSummary', ], ], 'TableType' => [ 'type' => 'string', 'enum' => [ 'customer', 'aws', ], ], 'TagKey' => [ 'type' => 'string', 'max' => 128, 'min' => 1, ], 'TagKeyList' => [ 'type' => 'list', 'member' => [ 'shape' => 'TagKey', ], ], 'TagResourceRequest' => [ 'type' => 'structure', 'required' => [ 'resourceArn', 'tags', ], 'members' => [ 'resourceArn' => [ 'shape' => 'ResourceArn', 'location' => 'uri', 'locationName' => 'resourceArn', ], 'tags' => [ 'shape' => 'Tags', ], ], ], 'TagResourceResponse' => [ 'type' => 'structure', 'members' => [], ], 'TagValue' => [ 'type' => 'string', 'max' => 256, 'min' => 0, ], 'Tags' => [ 'type' => 'map', 'key' => [ 'shape' => 'TagKey', ], 'value' => [ 'shape' => 'TagValue', ], ], 'TooManyRequestsException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 429, 'senderFault' => true, ], 'exception' => true, ], 'UntagResourceRequest' => [ 'type' => 'structure', 'required' => [ 'resourceArn', 'tagKeys', ], 'members' => [ 'resourceArn' => [ 'shape' => 'ResourceArn', 'location' => 'uri', 'locationName' => 'resourceArn', ], 'tagKeys' => [ 'shape' => 'TagKeyList', 'location' => 'querystring', 'locationName' => 'tagKeys', ], ], ], 'UntagResourceResponse' => [ 'type' => 'structure', 'members' => [], ], 'UpdateTableMetadataLocationRequest' => [ 'type' => 'structure', 'required' => [ 'tableBucketARN', 'namespace', 'name', 'versionToken', 'metadataLocation', ], 'members' => [ 'tableBucketARN' => [ 'shape' => 'TableBucketARN', 'location' => 'uri', 'locationName' => 'tableBucketARN', ], 'namespace' => [ 'shape' => 'NamespaceName', 'location' => 'uri', 'locationName' => 'namespace', ], 'name' => [ 'shape' => 'TableName', 'location' => 'uri', 'locationName' => 'name', ], 'versionToken' => [ 'shape' => 'VersionToken', ], 'metadataLocation' => [ 'shape' => 'MetadataLocation', ], ], ], 'UpdateTableMetadataLocationResponse' => [ 'type' => 'structure', 'required' => [ 'name', 'tableARN', 'namespace', 'versionToken', 'metadataLocation', ], 'members' => [ 'name' => [ 'shape' => 'TableName', ], 'tableARN' => [ 'shape' => 'TableARN', ], 'namespace' => [ 'shape' => 'NamespaceList', ], 'versionToken' => [ 'shape' => 'VersionToken', ], 'metadataLocation' => [ 'shape' => 'MetadataLocation', ], ], ], 'VersionToken' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, ], 'WarehouseLocation' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/endpoint-rule-set-1.json.php b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/endpoint-rule-set-1.json.php new file mode 100644 index 0000000..d04fd25 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/endpoint-rule-set-1.json.php @@ -0,0 +1,3 @@ + '1.0', 'parameters' => [ 'Region' => [ 'builtIn' => 'AWS::Region', 'required' => false, 'documentation' => 'The AWS region used to dispatch the request.', 'type' => 'string', ], 'UseDualStack' => [ 'builtIn' => 'AWS::UseDualStack', 'required' => true, 'default' => false, 'documentation' => 'When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.', 'type' => 'boolean', ], 'UseFIPS' => [ 'builtIn' => 'AWS::UseFIPS', 'required' => true, 'default' => false, 'documentation' => 'When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.', 'type' => 'boolean', ], 'Endpoint' => [ 'builtIn' => 'SDK::Endpoint', 'required' => false, 'documentation' => 'Override the endpoint used to send this request', 'type' => 'string', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'Invalid Configuration: FIPS and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'Invalid Configuration: Dualstack and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => [ 'ref' => 'Endpoint', ], 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Region', ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'PartitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ true, [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsFIPS', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ true, [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsDualStack', ], ], ], ], ], 'rules' => [ [ 'conditions' => [], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3tables-fips.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'FIPS and DualStack are enabled, but this partition does not support one or both', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsFIPS', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3tables-fips.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'FIPS is enabled but this partition does not support FIPS', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ true, [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsDualStack', ], ], ], ], ], 'rules' => [ [ 'conditions' => [], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3tables.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'DualStack is enabled but this partition does not support DualStack', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3tables.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid Configuration: Missing Region', 'type' => 'error', ], ], 'type' => 'tree', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/paginators-1.json.php b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/paginators-1.json.php new file mode 100644 index 0000000..a9db7b8 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/paginators-1.json.php @@ -0,0 +1,3 @@ + [ 'ListNamespaces' => [ 'input_token' => 'continuationToken', 'output_token' => 'continuationToken', 'limit_key' => 'maxNamespaces', 'result_key' => 'namespaces', ], 'ListTableBuckets' => [ 'input_token' => 'continuationToken', 'output_token' => 'continuationToken', 'limit_key' => 'maxBuckets', 'result_key' => 'tableBuckets', ], 'ListTables' => [ 'input_token' => 'continuationToken', 'output_token' => 'continuationToken', 'limit_key' => 'maxTables', 'result_key' => 'tables', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/smoke.json.php b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/smoke.json.php new file mode 100644 index 0000000..d22b526 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/smoke.json.php @@ -0,0 +1,3 @@ + 1, 'defaultRegion' => 'us-west-2', 'testCases' => [],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/waiters-2.json.php b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/waiters-2.json.php new file mode 100644 index 0000000..f5ff0cb --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3tables/2018-05-10/waiters-2.json.php @@ -0,0 +1,3 @@ + 2, 'waiters' => [],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/api-2.json.php b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/api-2.json.php new file mode 100644 index 0000000..f0a88e1 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/api-2.json.php @@ -0,0 +1,3 @@ + '2.0', 'metadata' => [ 'apiVersion' => '2025-07-15', 'auth' => [ 'aws.auth#sigv4', ], 'endpointPrefix' => 's3vectors', 'protocol' => 'rest-json', 'protocols' => [ 'rest-json', ], 'serviceFullName' => 'Amazon S3 Vectors', 'serviceId' => 'S3Vectors', 'signatureVersion' => 'v4', 'signingName' => 's3vectors', 'uid' => 's3vectors-2025-07-15', ], 'operations' => [ 'CreateIndex' => [ 'name' => 'CreateIndex', 'http' => [ 'method' => 'POST', 'requestUri' => '/CreateIndex', 'responseCode' => 200, ], 'input' => [ 'shape' => 'CreateIndexInput', ], 'output' => [ 'shape' => 'CreateIndexOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'ServiceQuotaExceededException', ], ], 'idempotent' => true, ], 'CreateVectorBucket' => [ 'name' => 'CreateVectorBucket', 'http' => [ 'method' => 'POST', 'requestUri' => '/CreateVectorBucket', 'responseCode' => 200, ], 'input' => [ 'shape' => 'CreateVectorBucketInput', ], 'output' => [ 'shape' => 'CreateVectorBucketOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'ConflictException', ], [ 'shape' => 'ServiceQuotaExceededException', ], ], 'idempotent' => true, ], 'DeleteIndex' => [ 'name' => 'DeleteIndex', 'http' => [ 'method' => 'POST', 'requestUri' => '/DeleteIndex', 'responseCode' => 200, ], 'input' => [ 'shape' => 'DeleteIndexInput', ], 'output' => [ 'shape' => 'DeleteIndexOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], ], 'idempotent' => true, ], 'DeleteVectorBucket' => [ 'name' => 'DeleteVectorBucket', 'http' => [ 'method' => 'POST', 'requestUri' => '/DeleteVectorBucket', 'responseCode' => 200, ], 'input' => [ 'shape' => 'DeleteVectorBucketInput', ], 'output' => [ 'shape' => 'DeleteVectorBucketOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'ConflictException', ], ], 'idempotent' => true, ], 'DeleteVectorBucketPolicy' => [ 'name' => 'DeleteVectorBucketPolicy', 'http' => [ 'method' => 'POST', 'requestUri' => '/DeleteVectorBucketPolicy', 'responseCode' => 200, ], 'input' => [ 'shape' => 'DeleteVectorBucketPolicyInput', ], 'output' => [ 'shape' => 'DeleteVectorBucketPolicyOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], ], 'idempotent' => true, ], 'DeleteVectors' => [ 'name' => 'DeleteVectors', 'http' => [ 'method' => 'POST', 'requestUri' => '/DeleteVectors', 'responseCode' => 200, ], 'input' => [ 'shape' => 'DeleteVectorsInput', ], 'output' => [ 'shape' => 'DeleteVectorsOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'KmsInvalidKeyUsageException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'KmsInvalidStateException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'KmsNotFoundException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'KmsDisabledException', ], ], 'idempotent' => true, ], 'GetIndex' => [ 'name' => 'GetIndex', 'http' => [ 'method' => 'POST', 'requestUri' => '/GetIndex', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetIndexInput', ], 'output' => [ 'shape' => 'GetIndexOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], ], 'readonly' => true, ], 'GetVectorBucket' => [ 'name' => 'GetVectorBucket', 'http' => [ 'method' => 'POST', 'requestUri' => '/GetVectorBucket', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetVectorBucketInput', ], 'output' => [ 'shape' => 'GetVectorBucketOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], ], 'readonly' => true, ], 'GetVectorBucketPolicy' => [ 'name' => 'GetVectorBucketPolicy', 'http' => [ 'method' => 'POST', 'requestUri' => '/GetVectorBucketPolicy', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetVectorBucketPolicyInput', ], 'output' => [ 'shape' => 'GetVectorBucketPolicyOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], ], 'readonly' => true, ], 'GetVectors' => [ 'name' => 'GetVectors', 'http' => [ 'method' => 'POST', 'requestUri' => '/GetVectors', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetVectorsInput', ], 'output' => [ 'shape' => 'GetVectorsOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'KmsInvalidKeyUsageException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'KmsInvalidStateException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'KmsNotFoundException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'KmsDisabledException', ], ], 'readonly' => true, ], 'ListIndexes' => [ 'name' => 'ListIndexes', 'http' => [ 'method' => 'POST', 'requestUri' => '/ListIndexes', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListIndexesInput', ], 'output' => [ 'shape' => 'ListIndexesOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], ], 'readonly' => true, ], 'ListVectorBuckets' => [ 'name' => 'ListVectorBuckets', 'http' => [ 'method' => 'POST', 'requestUri' => '/ListVectorBuckets', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListVectorBucketsInput', ], 'output' => [ 'shape' => 'ListVectorBucketsOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], ], 'readonly' => true, ], 'ListVectors' => [ 'name' => 'ListVectors', 'http' => [ 'method' => 'POST', 'requestUri' => '/ListVectors', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListVectorsInput', ], 'output' => [ 'shape' => 'ListVectorsOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], ], 'readonly' => true, ], 'PutVectorBucketPolicy' => [ 'name' => 'PutVectorBucketPolicy', 'http' => [ 'method' => 'POST', 'requestUri' => '/PutVectorBucketPolicy', 'responseCode' => 200, ], 'input' => [ 'shape' => 'PutVectorBucketPolicyInput', ], 'output' => [ 'shape' => 'PutVectorBucketPolicyOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], ], 'idempotent' => true, ], 'PutVectors' => [ 'name' => 'PutVectors', 'http' => [ 'method' => 'POST', 'requestUri' => '/PutVectors', 'responseCode' => 200, ], 'input' => [ 'shape' => 'PutVectorsInput', ], 'output' => [ 'shape' => 'PutVectorsOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'KmsInvalidKeyUsageException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'KmsInvalidStateException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'KmsNotFoundException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'ServiceQuotaExceededException', ], [ 'shape' => 'KmsDisabledException', ], ], 'idempotent' => true, ], 'QueryVectors' => [ 'name' => 'QueryVectors', 'http' => [ 'method' => 'POST', 'requestUri' => '/QueryVectors', 'responseCode' => 200, ], 'input' => [ 'shape' => 'QueryVectorsInput', ], 'output' => [ 'shape' => 'QueryVectorsOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'ServiceUnavailableException', ], [ 'shape' => 'TooManyRequestsException', ], [ 'shape' => 'KmsInvalidKeyUsageException', ], [ 'shape' => 'InternalServerException', ], [ 'shape' => 'KmsInvalidStateException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'KmsNotFoundException', ], [ 'shape' => 'RequestTimeoutException', ], [ 'shape' => 'NotFoundException', ], [ 'shape' => 'KmsDisabledException', ], ], 'readonly' => true, ], ], 'shapes' => [ 'AccessDeniedException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 403, 'senderFault' => true, ], 'exception' => true, ], 'Boolean' => [ 'type' => 'boolean', 'box' => true, ], 'ConflictException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 409, 'senderFault' => true, ], 'exception' => true, ], 'CreateIndexInput' => [ 'type' => 'structure', 'required' => [ 'indexName', 'dataType', 'dimension', 'distanceMetric', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], 'indexName' => [ 'shape' => 'IndexName', ], 'dataType' => [ 'shape' => 'DataType', ], 'dimension' => [ 'shape' => 'Dimension', ], 'distanceMetric' => [ 'shape' => 'DistanceMetric', ], 'metadataConfiguration' => [ 'shape' => 'MetadataConfiguration', ], ], ], 'CreateIndexOutput' => [ 'type' => 'structure', 'required' => [ 'indexArn', ], 'members' => [ 'indexArn' => [ 'shape' => 'IndexArn', ], ], ], 'CreateVectorBucketInput' => [ 'type' => 'structure', 'required' => [ 'vectorBucketName', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'encryptionConfiguration' => [ 'shape' => 'EncryptionConfiguration', ], ], ], 'CreateVectorBucketOutput' => [ 'type' => 'structure', 'required' => [ 'vectorBucketArn', ], 'members' => [ 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], ], ], 'DataType' => [ 'type' => 'string', 'enum' => [ 'float32', ], ], 'DeleteIndexInput' => [ 'type' => 'structure', 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], ], ], 'DeleteIndexOutput' => [ 'type' => 'structure', 'members' => [], ], 'DeleteVectorBucketInput' => [ 'type' => 'structure', 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], ], ], 'DeleteVectorBucketOutput' => [ 'type' => 'structure', 'members' => [], ], 'DeleteVectorBucketPolicyInput' => [ 'type' => 'structure', 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], ], ], 'DeleteVectorBucketPolicyOutput' => [ 'type' => 'structure', 'members' => [], ], 'DeleteVectorsInput' => [ 'type' => 'structure', 'required' => [ 'keys', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], 'keys' => [ 'shape' => 'DeleteVectorsInputList', ], ], ], 'DeleteVectorsInputList' => [ 'type' => 'list', 'member' => [ 'shape' => 'VectorKey', ], 'max' => 500, 'min' => 1, ], 'DeleteVectorsOutput' => [ 'type' => 'structure', 'members' => [], ], 'Dimension' => [ 'type' => 'integer', 'box' => true, 'max' => 4096, 'min' => 1, ], 'DistanceMetric' => [ 'type' => 'string', 'enum' => [ 'euclidean', 'cosine', ], ], 'Document' => [ 'type' => 'structure', 'members' => [], 'document' => true, ], 'EncryptionConfiguration' => [ 'type' => 'structure', 'members' => [ 'sseType' => [ 'shape' => 'SseType', ], 'kmsKeyArn' => [ 'shape' => 'KmsKeyArn', ], ], ], 'ExceptionMessage' => [ 'type' => 'string', ], 'Float' => [ 'type' => 'float', 'box' => true, ], 'Float32VectorData' => [ 'type' => 'list', 'member' => [ 'shape' => 'Float', ], ], 'GetIndexInput' => [ 'type' => 'structure', 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], ], ], 'GetIndexOutput' => [ 'type' => 'structure', 'required' => [ 'index', ], 'members' => [ 'index' => [ 'shape' => 'Index', ], ], ], 'GetOutputVector' => [ 'type' => 'structure', 'required' => [ 'key', ], 'members' => [ 'key' => [ 'shape' => 'VectorKey', ], 'data' => [ 'shape' => 'VectorData', ], 'metadata' => [ 'shape' => 'VectorMetadata', ], ], ], 'GetVectorBucketInput' => [ 'type' => 'structure', 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], ], ], 'GetVectorBucketOutput' => [ 'type' => 'structure', 'required' => [ 'vectorBucket', ], 'members' => [ 'vectorBucket' => [ 'shape' => 'VectorBucket', ], ], ], 'GetVectorBucketPolicyInput' => [ 'type' => 'structure', 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], ], ], 'GetVectorBucketPolicyOutput' => [ 'type' => 'structure', 'members' => [ 'policy' => [ 'shape' => 'VectorBucketPolicy', ], ], ], 'GetVectorsInput' => [ 'type' => 'structure', 'required' => [ 'keys', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], 'keys' => [ 'shape' => 'GetVectorsInputList', ], 'returnData' => [ 'shape' => 'Boolean', ], 'returnMetadata' => [ 'shape' => 'Boolean', ], ], ], 'GetVectorsInputList' => [ 'type' => 'list', 'member' => [ 'shape' => 'VectorKey', ], 'max' => 100, 'min' => 1, ], 'GetVectorsOutput' => [ 'type' => 'structure', 'required' => [ 'vectors', ], 'members' => [ 'vectors' => [ 'shape' => 'GetVectorsOutputList', ], ], ], 'GetVectorsOutputList' => [ 'type' => 'list', 'member' => [ 'shape' => 'GetOutputVector', ], ], 'Index' => [ 'type' => 'structure', 'required' => [ 'vectorBucketName', 'indexName', 'indexArn', 'creationTime', 'dataType', 'dimension', 'distanceMetric', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], 'creationTime' => [ 'shape' => 'Timestamp', ], 'dataType' => [ 'shape' => 'DataType', ], 'dimension' => [ 'shape' => 'Dimension', ], 'distanceMetric' => [ 'shape' => 'DistanceMetric', ], 'metadataConfiguration' => [ 'shape' => 'MetadataConfiguration', ], ], ], 'IndexArn' => [ 'type' => 'string', ], 'IndexName' => [ 'type' => 'string', 'max' => 63, 'min' => 3, ], 'IndexSummary' => [ 'type' => 'structure', 'required' => [ 'vectorBucketName', 'indexName', 'indexArn', 'creationTime', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], 'creationTime' => [ 'shape' => 'Timestamp', ], ], ], 'InternalServerException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 500, ], 'exception' => true, 'fault' => true, 'retryable' => [ 'throttling' => false, ], ], 'KmsDisabledException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 400, 'senderFault' => true, ], 'exception' => true, ], 'KmsInvalidKeyUsageException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 400, 'senderFault' => true, ], 'exception' => true, ], 'KmsInvalidStateException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 400, 'senderFault' => true, ], 'exception' => true, ], 'KmsKeyArn' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, 'pattern' => '(arn:aws[-a-z0-9]*:kms:[-a-z0-9]*:[0-9]{12}:key/.+)', ], 'KmsNotFoundException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 400, 'senderFault' => true, ], 'exception' => true, ], 'ListIndexesInput' => [ 'type' => 'structure', 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], 'maxResults' => [ 'shape' => 'ListIndexesMaxResults', ], 'nextToken' => [ 'shape' => 'ListIndexesNextToken', ], 'prefix' => [ 'shape' => 'ListIndexesPrefix', ], ], ], 'ListIndexesMaxResults' => [ 'type' => 'integer', 'box' => true, 'max' => 500, 'min' => 1, ], 'ListIndexesNextToken' => [ 'type' => 'string', 'max' => 512, 'min' => 1, ], 'ListIndexesOutput' => [ 'type' => 'structure', 'required' => [ 'indexes', ], 'members' => [ 'nextToken' => [ 'shape' => 'ListIndexesNextToken', ], 'indexes' => [ 'shape' => 'ListIndexesOutputList', ], ], ], 'ListIndexesOutputList' => [ 'type' => 'list', 'member' => [ 'shape' => 'IndexSummary', ], ], 'ListIndexesPrefix' => [ 'type' => 'string', 'max' => 63, 'min' => 1, ], 'ListOutputVector' => [ 'type' => 'structure', 'required' => [ 'key', ], 'members' => [ 'key' => [ 'shape' => 'VectorKey', ], 'data' => [ 'shape' => 'VectorData', ], 'metadata' => [ 'shape' => 'VectorMetadata', ], ], ], 'ListVectorBucketsInput' => [ 'type' => 'structure', 'members' => [ 'maxResults' => [ 'shape' => 'ListVectorBucketsMaxResults', ], 'nextToken' => [ 'shape' => 'ListVectorBucketsNextToken', ], 'prefix' => [ 'shape' => 'ListVectorBucketsPrefix', ], ], ], 'ListVectorBucketsMaxResults' => [ 'type' => 'integer', 'box' => true, 'max' => 500, 'min' => 1, ], 'ListVectorBucketsNextToken' => [ 'type' => 'string', 'max' => 512, 'min' => 1, ], 'ListVectorBucketsOutput' => [ 'type' => 'structure', 'required' => [ 'vectorBuckets', ], 'members' => [ 'nextToken' => [ 'shape' => 'ListVectorBucketsNextToken', ], 'vectorBuckets' => [ 'shape' => 'ListVectorBucketsOutputList', ], ], ], 'ListVectorBucketsOutputList' => [ 'type' => 'list', 'member' => [ 'shape' => 'VectorBucketSummary', ], ], 'ListVectorBucketsPrefix' => [ 'type' => 'string', 'max' => 63, 'min' => 1, ], 'ListVectorsInput' => [ 'type' => 'structure', 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], 'maxResults' => [ 'shape' => 'ListVectorsMaxResults', ], 'nextToken' => [ 'shape' => 'ListVectorsNextToken', ], 'segmentCount' => [ 'shape' => 'ListVectorsSegmentCount', ], 'segmentIndex' => [ 'shape' => 'ListVectorsSegmentIndex', ], 'returnData' => [ 'shape' => 'Boolean', ], 'returnMetadata' => [ 'shape' => 'Boolean', ], ], ], 'ListVectorsMaxResults' => [ 'type' => 'integer', 'box' => true, 'max' => 1000, 'min' => 1, ], 'ListVectorsNextToken' => [ 'type' => 'string', 'max' => 2048, 'min' => 1, ], 'ListVectorsOutput' => [ 'type' => 'structure', 'required' => [ 'vectors', ], 'members' => [ 'nextToken' => [ 'shape' => 'ListVectorsNextToken', ], 'vectors' => [ 'shape' => 'ListVectorsOutputList', ], ], ], 'ListVectorsOutputList' => [ 'type' => 'list', 'member' => [ 'shape' => 'ListOutputVector', ], ], 'ListVectorsSegmentCount' => [ 'type' => 'integer', 'box' => true, 'max' => 16, 'min' => 1, ], 'ListVectorsSegmentIndex' => [ 'type' => 'integer', 'box' => true, 'max' => 15, 'min' => 0, ], 'MetadataConfiguration' => [ 'type' => 'structure', 'required' => [ 'nonFilterableMetadataKeys', ], 'members' => [ 'nonFilterableMetadataKeys' => [ 'shape' => 'NonFilterableMetadataKeys', ], ], ], 'MetadataKey' => [ 'type' => 'string', 'max' => 63, 'min' => 1, ], 'NonFilterableMetadataKeys' => [ 'type' => 'list', 'member' => [ 'shape' => 'MetadataKey', ], 'max' => 10, 'min' => 1, ], 'NotFoundException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 404, 'senderFault' => true, ], 'exception' => true, ], 'PutInputVector' => [ 'type' => 'structure', 'required' => [ 'key', 'data', ], 'members' => [ 'key' => [ 'shape' => 'VectorKey', ], 'data' => [ 'shape' => 'VectorData', ], 'metadata' => [ 'shape' => 'VectorMetadata', ], ], ], 'PutVectorBucketPolicyInput' => [ 'type' => 'structure', 'required' => [ 'policy', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], 'policy' => [ 'shape' => 'VectorBucketPolicy', ], ], ], 'PutVectorBucketPolicyOutput' => [ 'type' => 'structure', 'members' => [], ], 'PutVectorsInput' => [ 'type' => 'structure', 'required' => [ 'vectors', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], 'vectors' => [ 'shape' => 'PutVectorsInputList', ], ], ], 'PutVectorsInputList' => [ 'type' => 'list', 'member' => [ 'shape' => 'PutInputVector', ], 'max' => 500, 'min' => 1, ], 'PutVectorsOutput' => [ 'type' => 'structure', 'members' => [], ], 'QueryOutputVector' => [ 'type' => 'structure', 'required' => [ 'key', ], 'members' => [ 'key' => [ 'shape' => 'VectorKey', ], 'data' => [ 'shape' => 'VectorData', ], 'metadata' => [ 'shape' => 'VectorMetadata', ], 'distance' => [ 'shape' => 'Float', ], ], ], 'QueryVectorsInput' => [ 'type' => 'structure', 'required' => [ 'topK', 'queryVector', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'indexName' => [ 'shape' => 'IndexName', ], 'indexArn' => [ 'shape' => 'IndexArn', ], 'topK' => [ 'shape' => 'TopK', ], 'queryVector' => [ 'shape' => 'VectorData', ], 'filter' => [ 'shape' => 'Document', ], 'returnMetadata' => [ 'shape' => 'Boolean', ], 'returnDistance' => [ 'shape' => 'Boolean', ], ], ], 'QueryVectorsOutput' => [ 'type' => 'structure', 'required' => [ 'vectors', 'distanceMetric', ], 'members' => [ 'vectors' => [ 'shape' => 'QueryVectorsOutputList', ], 'distanceMetric' => [ 'shape' => 'DistanceMetric', ], ], ], 'QueryVectorsOutputList' => [ 'type' => 'list', 'member' => [ 'shape' => 'QueryOutputVector', ], ], 'RequestTimeoutException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 408, 'senderFault' => true, ], 'exception' => true, 'retryable' => [ 'throttling' => false, ], ], 'ServiceQuotaExceededException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 402, 'senderFault' => true, ], 'exception' => true, ], 'ServiceUnavailableException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 503, ], 'exception' => true, 'fault' => true, 'retryable' => [ 'throttling' => false, ], ], 'SseType' => [ 'type' => 'string', 'enum' => [ 'AES256', 'aws:kms', ], ], 'String' => [ 'type' => 'string', ], 'Timestamp' => [ 'type' => 'timestamp', ], 'TooManyRequestsException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'ExceptionMessage', ], ], 'error' => [ 'httpStatusCode' => 429, 'senderFault' => true, ], 'exception' => true, 'retryable' => [ 'throttling' => true, ], ], 'TopK' => [ 'type' => 'integer', 'box' => true, 'min' => 1, ], 'ValidationException' => [ 'type' => 'structure', 'required' => [ 'message', ], 'members' => [ 'message' => [ 'shape' => 'String', ], 'fieldList' => [ 'shape' => 'ValidationExceptionFieldList', ], ], 'exception' => true, ], 'ValidationExceptionField' => [ 'type' => 'structure', 'required' => [ 'path', 'message', ], 'members' => [ 'path' => [ 'shape' => 'String', ], 'message' => [ 'shape' => 'String', ], ], ], 'ValidationExceptionFieldList' => [ 'type' => 'list', 'member' => [ 'shape' => 'ValidationExceptionField', ], ], 'VectorBucket' => [ 'type' => 'structure', 'required' => [ 'vectorBucketName', 'vectorBucketArn', 'creationTime', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], 'creationTime' => [ 'shape' => 'Timestamp', ], 'encryptionConfiguration' => [ 'shape' => 'EncryptionConfiguration', ], ], ], 'VectorBucketArn' => [ 'type' => 'string', ], 'VectorBucketName' => [ 'type' => 'string', 'max' => 63, 'min' => 3, ], 'VectorBucketPolicy' => [ 'type' => 'string', ], 'VectorBucketSummary' => [ 'type' => 'structure', 'required' => [ 'vectorBucketName', 'vectorBucketArn', 'creationTime', ], 'members' => [ 'vectorBucketName' => [ 'shape' => 'VectorBucketName', ], 'vectorBucketArn' => [ 'shape' => 'VectorBucketArn', ], 'creationTime' => [ 'shape' => 'Timestamp', ], ], ], 'VectorData' => [ 'type' => 'structure', 'members' => [ 'float32' => [ 'shape' => 'Float32VectorData', ], ], 'union' => true, ], 'VectorKey' => [ 'type' => 'string', 'max' => 1024, 'min' => 1, ], 'VectorMetadata' => [ 'type' => 'structure', 'members' => [], 'document' => true, ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/endpoint-rule-set-1.json.php b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/endpoint-rule-set-1.json.php new file mode 100644 index 0000000..9dc15d1 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/endpoint-rule-set-1.json.php @@ -0,0 +1,3 @@ + '1.0', 'parameters' => [ 'UseFIPS' => [ 'builtIn' => 'AWS::UseFIPS', 'required' => true, 'default' => false, 'documentation' => 'When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.', 'type' => 'boolean', ], 'Endpoint' => [ 'builtIn' => 'SDK::Endpoint', 'required' => false, 'documentation' => 'Override the endpoint used to send this request', 'type' => 'string', ], 'Region' => [ 'builtIn' => 'AWS::Region', 'required' => false, 'documentation' => 'The AWS region used to dispatch the request.', 'type' => 'string', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'Invalid Configuration: FIPS and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => [ 'ref' => 'Endpoint', ], 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Region', ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'PartitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://s3vectors-fips.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3vectors.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid Configuration: Missing Region', 'type' => 'error', ], ], 'type' => 'tree', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/paginators-1.json.php b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/paginators-1.json.php new file mode 100644 index 0000000..0cb9992 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/paginators-1.json.php @@ -0,0 +1,3 @@ + [ 'ListIndexes' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'indexes', ], 'ListVectorBuckets' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'vectorBuckets', ], 'ListVectors' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'vectors', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/smoke.json.php b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/smoke.json.php new file mode 100644 index 0000000..f768343 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/smoke.json.php @@ -0,0 +1,3 @@ + 1, 'defaultRegion' => 'us-west-2', 'testCases' => [],]; diff --git a/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/waiters-2.json.php b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/waiters-2.json.php new file mode 100644 index 0000000..9701c1c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/s3vectors/2025-07-15/waiters-2.json.php @@ -0,0 +1,3 @@ + 2, 'waiters' => [],]; diff --git a/vendor/aws/aws-sdk-php/src/data/sdk-default-configuration.json.php b/vendor/aws/aws-sdk-php/src/data/sdk-default-configuration.json.php new file mode 100644 index 0000000..2d28bf8 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/sdk-default-configuration.json.php @@ -0,0 +1,3 @@ + 1, 'base' => [ 'retryMode' => 'standard', 'stsRegionalEndpoints' => 'regional', 's3UsEast1RegionalEndpoints' => 'regional', 'connectTimeoutInMillis' => 1100, 'tlsNegotiationTimeoutInMillis' => 1100, ], 'modes' => [ 'standard' => [ 'connectTimeoutInMillis' => [ 'override' => 3100, ], 'tlsNegotiationTimeoutInMillis' => [ 'override' => 3100, ], ], 'in-region' => [], 'cross-region' => [ 'connectTimeoutInMillis' => [ 'override' => 3100, ], 'tlsNegotiationTimeoutInMillis' => [ 'override' => 3100, ], ], 'mobile' => [ 'connectTimeoutInMillis' => [ 'override' => 30000, ], 'tlsNegotiationTimeoutInMillis' => [ 'override' => 30000, ], ], ], 'documentation' => [ 'modes' => [ 'standard' => '

The STANDARD mode provides the latest recommended default values that should be safe to run in most scenarios

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

', 'in-region' => '

The IN_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services from within the same AWS region

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

', 'cross-region' => '

The CROSS_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services in a different region

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

', 'mobile' => '

The MOBILE mode builds on the standard mode and includes optimization tailored for mobile applications

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

', 'auto' => '

The AUTO mode is an experimental mode that builds on the standard mode. The SDK will attempt to discover the execution environment to determine the appropriate settings automatically.

Note that the auto detection is heuristics-based and does not guarantee 100% accuracy. STANDARD mode will be used if the execution environment cannot be determined. The auto detection might query EC2 Instance Metadata service, which might introduce latency. Therefore we recommend choosing an explicit defaults_mode instead if startup latency is critical to your application

', 'legacy' => '

The LEGACY mode provides default settings that vary per SDK and were used prior to establishment of defaults_mode

', ], 'configuration' => [ 'retryMode' => '

A retry mode specifies how the SDK attempts retries. See Retry Mode

', 'stsRegionalEndpoints' => '

Specifies how the SDK determines the AWS service endpoint that it uses to talk to the AWS Security Token Service (AWS STS). See Setting STS Regional endpoints

', 's3UsEast1RegionalEndpoints' => '

Specifies how the SDK determines the AWS service endpoint that it uses to talk to the Amazon S3 for the us-east-1 region

', 'connectTimeoutInMillis' => '

The amount of time after making an initial connection attempt on a socket, where if the client does not receive a completion of the connect handshake, the client gives up and fails the operation

', 'tlsNegotiationTimeoutInMillis' => '

The maximum amount of time that a TLS handshake is allowed to take from the time the CLIENT HELLO message is sent to ethe time the client and server have fully negotiated ciphers and exchanged keys

', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/api-2.json.php b/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/api-2.json.php new file mode 100644 index 0000000..667154f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/api-2.json.php @@ -0,0 +1,3 @@ + '2.0', 'metadata' => [ 'apiVersion' => '2024-01-01', 'auth' => [ 'aws.auth#sigv4', ], 'endpointPrefix' => 'social-messaging', 'protocol' => 'rest-json', 'protocols' => [ 'rest-json', ], 'serviceFullName' => 'AWS End User Messaging Social', 'serviceId' => 'SocialMessaging', 'signatureVersion' => 'v4', 'signingName' => 'social-messaging', 'uid' => 'socialmessaging-2024-01-01', ], 'operations' => [ 'AssociateWhatsAppBusinessAccount' => [ 'name' => 'AssociateWhatsAppBusinessAccount', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/signup', 'responseCode' => 200, ], 'input' => [ 'shape' => 'AssociateWhatsAppBusinessAccountInput', ], 'output' => [ 'shape' => 'AssociateWhatsAppBusinessAccountOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'LimitExceededException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'DependencyException', ], ], ], 'CreateWhatsAppMessageTemplate' => [ 'name' => 'CreateWhatsAppMessageTemplate', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/template/put', 'responseCode' => 200, ], 'input' => [ 'shape' => 'CreateWhatsAppMessageTemplateInput', ], 'output' => [ 'shape' => 'CreateWhatsAppMessageTemplateOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'CreateWhatsAppMessageTemplateFromLibrary' => [ 'name' => 'CreateWhatsAppMessageTemplateFromLibrary', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/template/create', 'responseCode' => 200, ], 'input' => [ 'shape' => 'CreateWhatsAppMessageTemplateFromLibraryInput', ], 'output' => [ 'shape' => 'CreateWhatsAppMessageTemplateFromLibraryOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'CreateWhatsAppMessageTemplateMedia' => [ 'name' => 'CreateWhatsAppMessageTemplateMedia', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/template/media', 'responseCode' => 200, ], 'input' => [ 'shape' => 'CreateWhatsAppMessageTemplateMediaInput', ], 'output' => [ 'shape' => 'CreateWhatsAppMessageTemplateMediaOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'DeleteWhatsAppMessageMedia' => [ 'name' => 'DeleteWhatsAppMessageMedia', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/v1/whatsapp/media', 'responseCode' => 200, ], 'input' => [ 'shape' => 'DeleteWhatsAppMessageMediaInput', ], 'output' => [ 'shape' => 'DeleteWhatsAppMessageMediaOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'AccessDeniedByMetaException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], 'idempotent' => true, ], 'DeleteWhatsAppMessageTemplate' => [ 'name' => 'DeleteWhatsAppMessageTemplate', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/v1/whatsapp/template', 'responseCode' => 200, ], 'input' => [ 'shape' => 'DeleteWhatsAppMessageTemplateInput', ], 'output' => [ 'shape' => 'DeleteWhatsAppMessageTemplateOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], 'idempotent' => true, ], 'DisassociateWhatsAppBusinessAccount' => [ 'name' => 'DisassociateWhatsAppBusinessAccount', 'http' => [ 'method' => 'DELETE', 'requestUri' => '/v1/whatsapp/waba/disassociate', 'responseCode' => 200, ], 'input' => [ 'shape' => 'DisassociateWhatsAppBusinessAccountInput', ], 'output' => [ 'shape' => 'DisassociateWhatsAppBusinessAccountOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'DependencyException', ], ], 'idempotent' => true, ], 'GetLinkedWhatsAppBusinessAccount' => [ 'name' => 'GetLinkedWhatsAppBusinessAccount', 'http' => [ 'method' => 'GET', 'requestUri' => '/v1/whatsapp/waba/details', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetLinkedWhatsAppBusinessAccountInput', ], 'output' => [ 'shape' => 'GetLinkedWhatsAppBusinessAccountOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'GetLinkedWhatsAppBusinessAccountPhoneNumber' => [ 'name' => 'GetLinkedWhatsAppBusinessAccountPhoneNumber', 'http' => [ 'method' => 'GET', 'requestUri' => '/v1/whatsapp/waba/phone/details', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetLinkedWhatsAppBusinessAccountPhoneNumberInput', ], 'output' => [ 'shape' => 'GetLinkedWhatsAppBusinessAccountPhoneNumberOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'GetWhatsAppMessageMedia' => [ 'name' => 'GetWhatsAppMessageMedia', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/media/get', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetWhatsAppMessageMediaInput', ], 'output' => [ 'shape' => 'GetWhatsAppMessageMediaOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'AccessDeniedByMetaException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'GetWhatsAppMessageTemplate' => [ 'name' => 'GetWhatsAppMessageTemplate', 'http' => [ 'method' => 'GET', 'requestUri' => '/v1/whatsapp/template', 'responseCode' => 200, ], 'input' => [ 'shape' => 'GetWhatsAppMessageTemplateInput', ], 'output' => [ 'shape' => 'GetWhatsAppMessageTemplateOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'ListLinkedWhatsAppBusinessAccounts' => [ 'name' => 'ListLinkedWhatsAppBusinessAccounts', 'http' => [ 'method' => 'GET', 'requestUri' => '/v1/whatsapp/waba/list', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListLinkedWhatsAppBusinessAccountsInput', ], 'output' => [ 'shape' => 'ListLinkedWhatsAppBusinessAccountsOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], ], ], 'ListTagsForResource' => [ 'name' => 'ListTagsForResource', 'http' => [ 'method' => 'GET', 'requestUri' => '/v1/tags/list', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListTagsForResourceInput', ], 'output' => [ 'shape' => 'ListTagsForResourceOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], ], ], 'ListWhatsAppMessageTemplates' => [ 'name' => 'ListWhatsAppMessageTemplates', 'http' => [ 'method' => 'GET', 'requestUri' => '/v1/whatsapp/template/list', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListWhatsAppMessageTemplatesInput', ], 'output' => [ 'shape' => 'ListWhatsAppMessageTemplatesOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'ListWhatsAppTemplateLibrary' => [ 'name' => 'ListWhatsAppTemplateLibrary', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/template/library', 'responseCode' => 200, ], 'input' => [ 'shape' => 'ListWhatsAppTemplateLibraryInput', ], 'output' => [ 'shape' => 'ListWhatsAppTemplateLibraryOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'PostWhatsAppMessageMedia' => [ 'name' => 'PostWhatsAppMessageMedia', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/media', 'responseCode' => 200, ], 'input' => [ 'shape' => 'PostWhatsAppMessageMediaInput', ], 'output' => [ 'shape' => 'PostWhatsAppMessageMediaOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'AccessDeniedByMetaException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'PutWhatsAppBusinessAccountEventDestinations' => [ 'name' => 'PutWhatsAppBusinessAccountEventDestinations', 'http' => [ 'method' => 'PUT', 'requestUri' => '/v1/whatsapp/waba/eventdestinations', 'responseCode' => 200, ], 'input' => [ 'shape' => 'PutWhatsAppBusinessAccountEventDestinationsInput', ], 'output' => [ 'shape' => 'PutWhatsAppBusinessAccountEventDestinationsOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], ], 'idempotent' => true, ], 'SendWhatsAppMessage' => [ 'name' => 'SendWhatsAppMessage', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/send', 'responseCode' => 200, ], 'input' => [ 'shape' => 'SendWhatsAppMessageInput', ], 'output' => [ 'shape' => 'SendWhatsAppMessageOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], 'TagResource' => [ 'name' => 'TagResource', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/tags/tag-resource', 'responseCode' => 200, ], 'input' => [ 'shape' => 'TagResourceInput', ], 'output' => [ 'shape' => 'TagResourceOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], ], ], 'UntagResource' => [ 'name' => 'UntagResource', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/tags/untag-resource', 'responseCode' => 200, ], 'input' => [ 'shape' => 'UntagResourceInput', ], 'output' => [ 'shape' => 'UntagResourceOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], ], ], 'UpdateWhatsAppMessageTemplate' => [ 'name' => 'UpdateWhatsAppMessageTemplate', 'http' => [ 'method' => 'POST', 'requestUri' => '/v1/whatsapp/template', 'responseCode' => 200, ], 'input' => [ 'shape' => 'UpdateWhatsAppMessageTemplateInput', ], 'output' => [ 'shape' => 'UpdateWhatsAppMessageTemplateOutput', ], 'errors' => [ [ 'shape' => 'ValidationException', ], [ 'shape' => 'AccessDeniedException', ], [ 'shape' => 'ResourceNotFoundException', ], [ 'shape' => 'InvalidParametersException', ], [ 'shape' => 'ThrottledRequestException', ], [ 'shape' => 'InternalServiceException', ], [ 'shape' => 'DependencyException', ], ], ], ], 'shapes' => [ 'AccessDeniedByMetaException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 403, 'senderFault' => true, ], 'exception' => true, ], 'AccessDeniedException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 403, 'senderFault' => true, ], 'exception' => true, ], 'AddContactNumber' => [ 'type' => 'boolean', 'box' => true, ], 'AddLearnMoreLink' => [ 'type' => 'boolean', 'box' => true, ], 'AddSecurityRecommendation' => [ 'type' => 'boolean', 'box' => true, ], 'AddTrackPackageLink' => [ 'type' => 'boolean', 'box' => true, ], 'Arn' => [ 'type' => 'string', 'max' => 2048, 'min' => 0, 'pattern' => 'arn:.*', ], 'AssociateInProgressToken' => [ 'type' => 'string', 'max' => 50, 'min' => 0, 'sensitive' => true, ], 'AssociateWhatsAppBusinessAccountInput' => [ 'type' => 'structure', 'members' => [ 'signupCallback' => [ 'shape' => 'WhatsAppSignupCallback', ], 'setupFinalization' => [ 'shape' => 'WhatsAppSetupFinalization', ], ], ], 'AssociateWhatsAppBusinessAccountOutput' => [ 'type' => 'structure', 'members' => [ 'signupCallbackResult' => [ 'shape' => 'WhatsAppSignupCallbackResult', ], 'statusCode' => [ 'shape' => 'Integer', ], ], ], 'Boolean' => [ 'type' => 'boolean', 'box' => true, ], 'ButtonType' => [ 'type' => 'string', 'max' => 25, 'min' => 1, ], 'CodeExpirationMinutes' => [ 'type' => 'integer', 'box' => true, ], 'CreateWhatsAppMessageTemplateFromLibraryInput' => [ 'type' => 'structure', 'required' => [ 'metaLibraryTemplate', 'id', ], 'members' => [ 'metaLibraryTemplate' => [ 'shape' => 'MetaLibraryTemplate', ], 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], ], ], 'CreateWhatsAppMessageTemplateFromLibraryOutput' => [ 'type' => 'structure', 'members' => [ 'metaTemplateId' => [ 'shape' => 'MetaTemplateId', ], 'templateStatus' => [ 'shape' => 'String', ], 'category' => [ 'shape' => 'MetaTemplateCategory', ], ], ], 'CreateWhatsAppMessageTemplateInput' => [ 'type' => 'structure', 'required' => [ 'templateDefinition', 'id', ], 'members' => [ 'templateDefinition' => [ 'shape' => 'MetaTemplateDefinition', ], 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], ], ], 'CreateWhatsAppMessageTemplateMediaInput' => [ 'type' => 'structure', 'required' => [ 'id', ], 'members' => [ 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], 'sourceS3File' => [ 'shape' => 'S3File', ], ], ], 'CreateWhatsAppMessageTemplateMediaOutput' => [ 'type' => 'structure', 'members' => [ 'metaHeaderHandle' => [ 'shape' => 'String', ], ], ], 'CreateWhatsAppMessageTemplateOutput' => [ 'type' => 'structure', 'members' => [ 'metaTemplateId' => [ 'shape' => 'MetaTemplateId', ], 'templateStatus' => [ 'shape' => 'String', ], 'category' => [ 'shape' => 'MetaTemplateCategory', ], ], ], 'DeleteAllLanguages' => [ 'type' => 'boolean', 'box' => true, ], 'DeleteWhatsAppMessageMediaInput' => [ 'type' => 'structure', 'required' => [ 'mediaId', 'originationPhoneNumberId', ], 'members' => [ 'mediaId' => [ 'shape' => 'WhatsAppMediaId', 'location' => 'querystring', 'locationName' => 'mediaId', ], 'originationPhoneNumberId' => [ 'shape' => 'WhatsAppPhoneNumberId', 'location' => 'querystring', 'locationName' => 'originationPhoneNumberId', ], ], ], 'DeleteWhatsAppMessageMediaOutput' => [ 'type' => 'structure', 'members' => [ 'success' => [ 'shape' => 'Boolean', ], ], ], 'DeleteWhatsAppMessageTemplateInput' => [ 'type' => 'structure', 'required' => [ 'id', 'templateName', ], 'members' => [ 'metaTemplateId' => [ 'shape' => 'MetaTemplateId', 'location' => 'querystring', 'locationName' => 'metaTemplateId', ], 'deleteAllLanguages' => [ 'shape' => 'DeleteAllLanguages', 'location' => 'querystring', 'locationName' => 'deleteAllTemplates', ], 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', 'location' => 'querystring', 'locationName' => 'id', ], 'templateName' => [ 'shape' => 'MetaTemplateName', 'location' => 'querystring', 'locationName' => 'templateName', ], ], ], 'DeleteWhatsAppMessageTemplateOutput' => [ 'type' => 'structure', 'members' => [], ], 'DependencyException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 502, ], 'exception' => true, 'fault' => true, 'retryable' => [ 'throttling' => false, ], ], 'DisassociateWhatsAppBusinessAccountInput' => [ 'type' => 'structure', 'required' => [ 'id', ], 'members' => [ 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', 'location' => 'querystring', 'locationName' => 'id', ], ], ], 'DisassociateWhatsAppBusinessAccountOutput' => [ 'type' => 'structure', 'members' => [], ], 'ErrorMessage' => [ 'type' => 'string', ], 'EventDestinationArn' => [ 'type' => 'string', 'max' => 2048, 'min' => 0, 'pattern' => 'arn:.*:[a-z-]+([/:](.*))?', ], 'Filter' => [ 'type' => 'map', 'key' => [ 'shape' => 'FilterKeyString', ], 'value' => [ 'shape' => 'FilterValueString', ], 'max' => 10, 'min' => 0, ], 'FilterKeyString' => [ 'type' => 'string', 'max' => 100, 'min' => 1, ], 'FilterValueString' => [ 'type' => 'string', 'max' => 100, 'min' => 1, ], 'GetLinkedWhatsAppBusinessAccountInput' => [ 'type' => 'structure', 'required' => [ 'id', ], 'members' => [ 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', 'location' => 'querystring', 'locationName' => 'id', ], ], ], 'GetLinkedWhatsAppBusinessAccountOutput' => [ 'type' => 'structure', 'members' => [ 'account' => [ 'shape' => 'LinkedWhatsAppBusinessAccount', ], ], ], 'GetLinkedWhatsAppBusinessAccountPhoneNumberInput' => [ 'type' => 'structure', 'required' => [ 'id', ], 'members' => [ 'id' => [ 'shape' => 'WhatsAppPhoneNumberId', 'location' => 'querystring', 'locationName' => 'id', ], ], ], 'GetLinkedWhatsAppBusinessAccountPhoneNumberOutput' => [ 'type' => 'structure', 'members' => [ 'phoneNumber' => [ 'shape' => 'WhatsAppPhoneNumberDetail', ], 'linkedWhatsAppBusinessAccountId' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], ], ], 'GetWhatsAppMessageMediaInput' => [ 'type' => 'structure', 'required' => [ 'mediaId', 'originationPhoneNumberId', ], 'members' => [ 'mediaId' => [ 'shape' => 'WhatsAppMediaId', ], 'originationPhoneNumberId' => [ 'shape' => 'WhatsAppPhoneNumberId', ], 'metadataOnly' => [ 'shape' => 'Boolean', ], 'destinationS3PresignedUrl' => [ 'shape' => 'S3PresignedUrl', ], 'destinationS3File' => [ 'shape' => 'S3File', ], ], ], 'GetWhatsAppMessageMediaOutput' => [ 'type' => 'structure', 'members' => [ 'mimeType' => [ 'shape' => 'String', ], 'fileSize' => [ 'shape' => 'Long', ], ], ], 'GetWhatsAppMessageTemplateInput' => [ 'type' => 'structure', 'required' => [ 'metaTemplateId', 'id', ], 'members' => [ 'metaTemplateId' => [ 'shape' => 'MetaTemplateId', 'location' => 'querystring', 'locationName' => 'metaTemplateId', ], 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', 'location' => 'querystring', 'locationName' => 'id', ], ], ], 'GetWhatsAppMessageTemplateOutput' => [ 'type' => 'structure', 'members' => [ 'template' => [ 'shape' => 'MetaTemplate', ], ], ], 'Headers' => [ 'type' => 'map', 'key' => [ 'shape' => 'String', ], 'value' => [ 'shape' => 'String', ], ], 'Integer' => [ 'type' => 'integer', 'box' => true, ], 'InternalServiceException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 500, ], 'exception' => true, 'fault' => true, 'retryable' => [ 'throttling' => false, ], ], 'InvalidParametersException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 400, 'senderFault' => true, ], 'exception' => true, ], 'IsoCountryCode' => [ 'type' => 'string', 'pattern' => '[A-Z]{2}', ], 'LibraryTemplateBodyInputs' => [ 'type' => 'structure', 'members' => [ 'addContactNumber' => [ 'shape' => 'AddContactNumber', ], 'addLearnMoreLink' => [ 'shape' => 'AddLearnMoreLink', ], 'addSecurityRecommendation' => [ 'shape' => 'AddSecurityRecommendation', ], 'addTrackPackageLink' => [ 'shape' => 'AddTrackPackageLink', ], 'codeExpirationMinutes' => [ 'shape' => 'CodeExpirationMinutes', ], ], ], 'LibraryTemplateButtonInput' => [ 'type' => 'structure', 'members' => [ 'type' => [ 'shape' => 'ButtonType', ], 'phoneNumber' => [ 'shape' => 'PhoneNumber', ], 'url' => [ 'shape' => 'MetaUrlWithSuffixExample', ], 'otpType' => [ 'shape' => 'OtpType', ], 'zeroTapTermsAccepted' => [ 'shape' => 'ZeroTapTermsAccepted', ], 'supportedApps' => [ 'shape' => 'SupportedApps', ], ], ], 'LibraryTemplateButtonList' => [ 'type' => 'structure', 'members' => [ 'type' => [ 'shape' => 'ButtonType', ], 'text' => [ 'shape' => 'MetaText', ], 'phoneNumber' => [ 'shape' => 'PhoneNumber', ], 'url' => [ 'shape' => 'MetaUrl', ], 'otpType' => [ 'shape' => 'OtpType', ], 'zeroTapTermsAccepted' => [ 'shape' => 'ZeroTapTermsAccepted', ], 'supportedApps' => [ 'shape' => 'SupportedApps', ], ], ], 'LimitExceededException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 400, 'senderFault' => true, ], 'exception' => true, ], 'LinkedAccountWithIncompleteSetup' => [ 'type' => 'map', 'key' => [ 'shape' => 'WhatsAppBusinessAccountId', ], 'value' => [ 'shape' => 'LinkedWhatsAppBusinessAccountIdMetaData', ], ], 'LinkedWhatsAppBusinessAccount' => [ 'type' => 'structure', 'required' => [ 'arn', 'id', 'wabaId', 'registrationStatus', 'linkDate', 'wabaName', 'eventDestinations', 'phoneNumbers', ], 'members' => [ 'arn' => [ 'shape' => 'LinkedWhatsAppBusinessAccountArn', ], 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], 'wabaId' => [ 'shape' => 'WhatsAppBusinessAccountId', ], 'registrationStatus' => [ 'shape' => 'RegistrationStatus', ], 'linkDate' => [ 'shape' => 'WhatsAppBusinessAccountLinkDate', ], 'wabaName' => [ 'shape' => 'WhatsAppBusinessAccountName', ], 'eventDestinations' => [ 'shape' => 'WhatsAppBusinessAccountEventDestinations', ], 'phoneNumbers' => [ 'shape' => 'WhatsAppPhoneNumberSummaryList', ], ], ], 'LinkedWhatsAppBusinessAccountArn' => [ 'type' => 'string', 'max' => 2048, 'min' => 0, 'pattern' => 'arn:.*:waba/[0-9a-zA-Z]+', ], 'LinkedWhatsAppBusinessAccountId' => [ 'type' => 'string', 'max' => 100, 'min' => 1, 'pattern' => '.*(^waba-.*$)|(^arn:.*:waba/[0-9a-zA-Z]+$).*', ], 'LinkedWhatsAppBusinessAccountIdMetaData' => [ 'type' => 'structure', 'members' => [ 'accountName' => [ 'shape' => 'WhatsAppBusinessAccountName', ], 'registrationStatus' => [ 'shape' => 'RegistrationStatus', ], 'unregisteredWhatsAppPhoneNumbers' => [ 'shape' => 'WhatsAppPhoneNumberDetailList', ], 'wabaId' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], ], ], 'LinkedWhatsAppBusinessAccountSummary' => [ 'type' => 'structure', 'required' => [ 'arn', 'id', 'wabaId', 'registrationStatus', 'linkDate', 'wabaName', 'eventDestinations', ], 'members' => [ 'arn' => [ 'shape' => 'LinkedWhatsAppBusinessAccountArn', ], 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], 'wabaId' => [ 'shape' => 'WhatsAppBusinessAccountId', ], 'registrationStatus' => [ 'shape' => 'RegistrationStatus', ], 'linkDate' => [ 'shape' => 'WhatsAppBusinessAccountLinkDate', ], 'wabaName' => [ 'shape' => 'WhatsAppBusinessAccountName', ], 'eventDestinations' => [ 'shape' => 'WhatsAppBusinessAccountEventDestinations', ], ], ], 'LinkedWhatsAppBusinessAccountSummaryList' => [ 'type' => 'list', 'member' => [ 'shape' => 'LinkedWhatsAppBusinessAccountSummary', ], ], 'LinkedWhatsAppPhoneNumberArn' => [ 'type' => 'string', 'max' => 2048, 'min' => 0, 'pattern' => 'arn:.*:phone-number-id/[0-9a-zA-Z]+', ], 'ListLinkedWhatsAppBusinessAccountsInput' => [ 'type' => 'structure', 'members' => [ 'nextToken' => [ 'shape' => 'NextToken', 'location' => 'querystring', 'locationName' => 'nextToken', ], 'maxResults' => [ 'shape' => 'MaxResults', 'location' => 'querystring', 'locationName' => 'maxResults', ], ], ], 'ListLinkedWhatsAppBusinessAccountsOutput' => [ 'type' => 'structure', 'members' => [ 'linkedAccounts' => [ 'shape' => 'LinkedWhatsAppBusinessAccountSummaryList', ], 'nextToken' => [ 'shape' => 'NextToken', ], ], ], 'ListTagsForResourceInput' => [ 'type' => 'structure', 'required' => [ 'resourceArn', ], 'members' => [ 'resourceArn' => [ 'shape' => 'Arn', 'location' => 'querystring', 'locationName' => 'resourceArn', ], ], ], 'ListTagsForResourceOutput' => [ 'type' => 'structure', 'members' => [ 'statusCode' => [ 'shape' => 'Integer', ], 'tags' => [ 'shape' => 'TagList', ], ], ], 'ListWhatsAppMessageTemplatesInput' => [ 'type' => 'structure', 'required' => [ 'id', ], 'members' => [ 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', 'location' => 'querystring', 'locationName' => 'id', ], 'nextToken' => [ 'shape' => 'NextToken', 'location' => 'querystring', 'locationName' => 'nextToken', ], 'maxResults' => [ 'shape' => 'MaxResults', 'location' => 'querystring', 'locationName' => 'maxResults', ], ], ], 'ListWhatsAppMessageTemplatesOutput' => [ 'type' => 'structure', 'members' => [ 'templates' => [ 'shape' => 'TemplateSummaryList', ], 'nextToken' => [ 'shape' => 'NextToken', ], ], ], 'ListWhatsAppTemplateLibraryInput' => [ 'type' => 'structure', 'required' => [ 'id', ], 'members' => [ 'nextToken' => [ 'shape' => 'NextToken', ], 'maxResults' => [ 'shape' => 'MaxResults', ], 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', 'location' => 'querystring', 'locationName' => 'id', ], 'filters' => [ 'shape' => 'Filter', ], ], ], 'ListWhatsAppTemplateLibraryOutput' => [ 'type' => 'structure', 'members' => [ 'metaLibraryTemplates' => [ 'shape' => 'MetaLibraryTemplatesList', ], 'nextToken' => [ 'shape' => 'NextToken', ], ], ], 'Long' => [ 'type' => 'long', 'box' => true, ], 'MaxResults' => [ 'type' => 'integer', 'box' => true, 'max' => 100, 'min' => 1, ], 'MetaIndustries' => [ 'type' => 'list', 'member' => [ 'shape' => 'MetaIndustry', ], ], 'MetaIndustry' => [ 'type' => 'string', 'max' => 25, 'min' => 1, ], 'MetaLibraryTemplate' => [ 'type' => 'structure', 'required' => [ 'templateName', 'libraryTemplateName', 'templateCategory', 'templateLanguage', ], 'members' => [ 'templateName' => [ 'shape' => 'MetaTemplateName', ], 'libraryTemplateName' => [ 'shape' => 'MetaTemplateName', ], 'templateCategory' => [ 'shape' => 'MetaTemplateCategory', ], 'templateLanguage' => [ 'shape' => 'MetaTemplateLanguage', ], 'libraryTemplateButtonInputs' => [ 'shape' => 'MetaLibraryTemplateButtonInputs', ], 'libraryTemplateBodyInputs' => [ 'shape' => 'LibraryTemplateBodyInputs', ], ], ], 'MetaLibraryTemplateButtonInputs' => [ 'type' => 'list', 'member' => [ 'shape' => 'LibraryTemplateButtonInput', ], ], 'MetaLibraryTemplateButtonList' => [ 'type' => 'list', 'member' => [ 'shape' => 'LibraryTemplateButtonList', ], ], 'MetaLibraryTemplateDefinition' => [ 'type' => 'structure', 'members' => [ 'templateName' => [ 'shape' => 'MetaTemplateName', ], 'templateLanguage' => [ 'shape' => 'MetaTemplateLanguage', ], 'templateCategory' => [ 'shape' => 'MetaTemplateCategory', ], 'templateTopic' => [ 'shape' => 'MetaTemplateTopic', ], 'templateUseCase' => [ 'shape' => 'MetaTemplateUseCase', ], 'templateIndustry' => [ 'shape' => 'MetaIndustries', ], 'templateHeader' => [ 'shape' => 'MetaTemplateHeader', ], 'templateBody' => [ 'shape' => 'MetaTemplateBody', ], 'templateButtons' => [ 'shape' => 'MetaLibraryTemplateButtonList', ], 'templateId' => [ 'shape' => 'MetaTemplateId', ], ], ], 'MetaLibraryTemplatesList' => [ 'type' => 'list', 'member' => [ 'shape' => 'MetaLibraryTemplateDefinition', ], ], 'MetaTemplate' => [ 'type' => 'string', 'max' => 6000, 'min' => 1, ], 'MetaTemplateBody' => [ 'type' => 'string', 'max' => 2000, 'min' => 1, ], 'MetaTemplateCategory' => [ 'type' => 'string', 'max' => 100, 'min' => 1, ], 'MetaTemplateComponents' => [ 'type' => 'blob', 'max' => 3000, 'min' => 1, ], 'MetaTemplateDefinition' => [ 'type' => 'blob', 'max' => 6000, 'min' => 1, ], 'MetaTemplateHeader' => [ 'type' => 'string', 'max' => 200, 'min' => 1, ], 'MetaTemplateId' => [ 'type' => 'string', 'max' => 100, 'min' => 1, 'pattern' => '[0-9]+', ], 'MetaTemplateLanguage' => [ 'type' => 'string', 'max' => 6, 'min' => 1, ], 'MetaTemplateName' => [ 'type' => 'string', 'max' => 512, 'min' => 1, ], 'MetaTemplateQualityScore' => [ 'type' => 'string', 'max' => 20, 'min' => 1, ], 'MetaTemplateStatus' => [ 'type' => 'string', 'max' => 20, 'min' => 1, ], 'MetaTemplateTopic' => [ 'type' => 'string', 'max' => 20, 'min' => 1, ], 'MetaTemplateUseCase' => [ 'type' => 'string', 'max' => 30, 'min' => 1, ], 'MetaText' => [ 'type' => 'string', 'max' => 40, 'min' => 1, ], 'MetaUrl' => [ 'type' => 'string', 'max' => 400, 'min' => 1, ], 'MetaUrlWithSuffixExample' => [ 'type' => 'map', 'key' => [ 'shape' => 'MetaUrlWithSuffixExampleKeyString', ], 'value' => [ 'shape' => 'MetaUrlWithSuffixExampleValueString', ], 'max' => 10, 'min' => 0, ], 'MetaUrlWithSuffixExampleKeyString' => [ 'type' => 'string', 'max' => 30, 'min' => 1, ], 'MetaUrlWithSuffixExampleValueString' => [ 'type' => 'string', 'max' => 400, 'min' => 1, ], 'NextToken' => [ 'type' => 'string', 'max' => 600, 'min' => 1, ], 'OtpType' => [ 'type' => 'string', 'max' => 25, 'min' => 1, ], 'PhoneNumber' => [ 'type' => 'string', 'max' => 20, 'min' => 1, ], 'PostWhatsAppMessageMediaInput' => [ 'type' => 'structure', 'required' => [ 'originationPhoneNumberId', ], 'members' => [ 'originationPhoneNumberId' => [ 'shape' => 'WhatsAppPhoneNumberId', ], 'sourceS3PresignedUrl' => [ 'shape' => 'S3PresignedUrl', ], 'sourceS3File' => [ 'shape' => 'S3File', ], ], ], 'PostWhatsAppMessageMediaOutput' => [ 'type' => 'structure', 'members' => [ 'mediaId' => [ 'shape' => 'WhatsAppMediaId', ], ], ], 'PutWhatsAppBusinessAccountEventDestinationsInput' => [ 'type' => 'structure', 'required' => [ 'id', 'eventDestinations', ], 'members' => [ 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], 'eventDestinations' => [ 'shape' => 'WhatsAppBusinessAccountEventDestinations', ], ], ], 'PutWhatsAppBusinessAccountEventDestinationsOutput' => [ 'type' => 'structure', 'members' => [], ], 'RegistrationStatus' => [ 'type' => 'string', 'enum' => [ 'COMPLETE', 'INCOMPLETE', ], ], 'ResourceNotFoundException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 404, 'senderFault' => true, ], 'exception' => true, ], 'RoleArn' => [ 'type' => 'string', 'pattern' => 'arn:aws:iam::\\d{12}:role\\/[a-zA-Z0-9+=,.@\\-_]+', ], 'S3File' => [ 'type' => 'structure', 'required' => [ 'bucketName', 'key', ], 'members' => [ 'bucketName' => [ 'shape' => 'S3FileBucketNameString', ], 'key' => [ 'shape' => 'S3FileKeyString', ], ], 'sensitive' => true, ], 'S3FileBucketNameString' => [ 'type' => 'string', 'max' => 63, 'min' => 3, 'pattern' => '[a-z0-9][a-z0-9.-]*[a-z0-9]', ], 'S3FileKeyString' => [ 'type' => 'string', 'max' => 1024, 'min' => 0, ], 'S3PresignedUrl' => [ 'type' => 'structure', 'required' => [ 'url', 'headers', ], 'members' => [ 'url' => [ 'shape' => 'S3PresignedUrlUrlString', ], 'headers' => [ 'shape' => 'Headers', ], ], 'sensitive' => true, ], 'S3PresignedUrlUrlString' => [ 'type' => 'string', 'max' => 2000, 'min' => 1, 'pattern' => 'https://(.*)s3(.*).amazonaws.com/(.*)', ], 'SendWhatsAppMessageInput' => [ 'type' => 'structure', 'required' => [ 'originationPhoneNumberId', 'message', 'metaApiVersion', ], 'members' => [ 'originationPhoneNumberId' => [ 'shape' => 'WhatsAppPhoneNumberId', ], 'message' => [ 'shape' => 'WhatsAppMessageBlob', ], 'metaApiVersion' => [ 'shape' => 'String', ], ], ], 'SendWhatsAppMessageOutput' => [ 'type' => 'structure', 'members' => [ 'messageId' => [ 'shape' => 'String', ], ], ], 'String' => [ 'type' => 'string', ], 'StringList' => [ 'type' => 'list', 'member' => [ 'shape' => 'String', ], ], 'SupportedApp' => [ 'type' => 'map', 'key' => [ 'shape' => 'SupportedAppKeyString', ], 'value' => [ 'shape' => 'SupportedAppValueString', ], 'max' => 10, 'min' => 0, ], 'SupportedAppKeyString' => [ 'type' => 'string', 'max' => 30, 'min' => 1, ], 'SupportedAppValueString' => [ 'type' => 'string', 'max' => 100, 'min' => 1, ], 'SupportedApps' => [ 'type' => 'list', 'member' => [ 'shape' => 'SupportedApp', ], ], 'Tag' => [ 'type' => 'structure', 'required' => [ 'key', ], 'members' => [ 'key' => [ 'shape' => 'TagKeyString', ], 'value' => [ 'shape' => 'TagValueString', ], ], ], 'TagKeyString' => [ 'type' => 'string', 'max' => 128, 'min' => 1, ], 'TagList' => [ 'type' => 'list', 'member' => [ 'shape' => 'Tag', ], ], 'TagResourceInput' => [ 'type' => 'structure', 'required' => [ 'resourceArn', 'tags', ], 'members' => [ 'resourceArn' => [ 'shape' => 'Arn', ], 'tags' => [ 'shape' => 'TagList', ], ], ], 'TagResourceOutput' => [ 'type' => 'structure', 'members' => [ 'statusCode' => [ 'shape' => 'Integer', ], ], ], 'TagValueString' => [ 'type' => 'string', 'max' => 256, 'min' => 0, ], 'TemplateSummary' => [ 'type' => 'structure', 'members' => [ 'templateName' => [ 'shape' => 'MetaTemplateName', ], 'metaTemplateId' => [ 'shape' => 'MetaTemplateId', ], 'templateStatus' => [ 'shape' => 'MetaTemplateStatus', ], 'templateQualityScore' => [ 'shape' => 'MetaTemplateQualityScore', ], 'templateLanguage' => [ 'shape' => 'MetaTemplateLanguage', ], 'templateCategory' => [ 'shape' => 'MetaTemplateCategory', ], ], ], 'TemplateSummaryList' => [ 'type' => 'list', 'member' => [ 'shape' => 'TemplateSummary', ], ], 'ThrottledRequestException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 429, 'senderFault' => true, ], 'exception' => true, 'retryable' => [ 'throttling' => false, ], ], 'TwoFactorPin' => [ 'type' => 'string', 'max' => 6, 'min' => 1, 'sensitive' => true, ], 'UntagResourceInput' => [ 'type' => 'structure', 'required' => [ 'resourceArn', 'tagKeys', ], 'members' => [ 'resourceArn' => [ 'shape' => 'Arn', ], 'tagKeys' => [ 'shape' => 'StringList', ], ], ], 'UntagResourceOutput' => [ 'type' => 'structure', 'members' => [ 'statusCode' => [ 'shape' => 'Integer', ], ], ], 'UpdateWhatsAppMessageTemplateInput' => [ 'type' => 'structure', 'required' => [ 'id', 'metaTemplateId', ], 'members' => [ 'id' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], 'metaTemplateId' => [ 'shape' => 'MetaTemplateId', ], 'templateCategory' => [ 'shape' => 'MetaTemplateCategory', ], 'templateComponents' => [ 'shape' => 'MetaTemplateComponents', ], ], ], 'UpdateWhatsAppMessageTemplateOutput' => [ 'type' => 'structure', 'members' => [], ], 'ValidationException' => [ 'type' => 'structure', 'members' => [ 'message' => [ 'shape' => 'ErrorMessage', ], ], 'error' => [ 'httpStatusCode' => 400, 'senderFault' => true, ], 'exception' => true, ], 'WabaPhoneNumberSetupFinalization' => [ 'type' => 'structure', 'required' => [ 'id', 'twoFactorPin', ], 'members' => [ 'id' => [ 'shape' => 'WhatsAppPhoneNumber', ], 'twoFactorPin' => [ 'shape' => 'TwoFactorPin', ], 'dataLocalizationRegion' => [ 'shape' => 'IsoCountryCode', ], 'tags' => [ 'shape' => 'TagList', ], ], ], 'WabaPhoneNumberSetupFinalizationList' => [ 'type' => 'list', 'member' => [ 'shape' => 'WabaPhoneNumberSetupFinalization', ], ], 'WabaSetupFinalization' => [ 'type' => 'structure', 'members' => [ 'id' => [ 'shape' => 'WhatsAppBusinessAccountId', ], 'eventDestinations' => [ 'shape' => 'WhatsAppBusinessAccountEventDestinations', ], 'tags' => [ 'shape' => 'TagList', ], ], ], 'WhatsAppBusinessAccountEventDestination' => [ 'type' => 'structure', 'required' => [ 'eventDestinationArn', ], 'members' => [ 'eventDestinationArn' => [ 'shape' => 'EventDestinationArn', ], 'roleArn' => [ 'shape' => 'RoleArn', ], ], ], 'WhatsAppBusinessAccountEventDestinations' => [ 'type' => 'list', 'member' => [ 'shape' => 'WhatsAppBusinessAccountEventDestination', ], 'max' => 1, 'min' => 0, ], 'WhatsAppBusinessAccountId' => [ 'type' => 'string', 'max' => 100, 'min' => 1, ], 'WhatsAppBusinessAccountLinkDate' => [ 'type' => 'timestamp', ], 'WhatsAppBusinessAccountName' => [ 'type' => 'string', 'max' => 200, 'min' => 0, ], 'WhatsAppDisplayPhoneNumber' => [ 'type' => 'string', 'max' => 20, 'min' => 0, ], 'WhatsAppMediaId' => [ 'type' => 'string', 'max' => 100, 'min' => 1, 'pattern' => '[A-Za-z0-9]+', ], 'WhatsAppMessageBlob' => [ 'type' => 'blob', 'max' => 2048000, 'min' => 1, 'sensitive' => true, ], 'WhatsAppPhoneNumber' => [ 'type' => 'string', 'max' => 100, 'min' => 1, ], 'WhatsAppPhoneNumberDetail' => [ 'type' => 'structure', 'required' => [ 'arn', 'phoneNumber', 'phoneNumberId', 'metaPhoneNumberId', 'displayPhoneNumberName', 'displayPhoneNumber', 'qualityRating', ], 'members' => [ 'arn' => [ 'shape' => 'LinkedWhatsAppPhoneNumberArn', ], 'phoneNumber' => [ 'shape' => 'PhoneNumber', ], 'phoneNumberId' => [ 'shape' => 'WhatsAppPhoneNumberId', ], 'metaPhoneNumberId' => [ 'shape' => 'WhatsAppPhoneNumber', ], 'displayPhoneNumberName' => [ 'shape' => 'WhatsAppPhoneNumberName', ], 'displayPhoneNumber' => [ 'shape' => 'WhatsAppDisplayPhoneNumber', ], 'qualityRating' => [ 'shape' => 'WhatsAppPhoneNumberQualityRating', ], 'dataLocalizationRegion' => [ 'shape' => 'IsoCountryCode', ], ], ], 'WhatsAppPhoneNumberDetailList' => [ 'type' => 'list', 'member' => [ 'shape' => 'WhatsAppPhoneNumberDetail', ], ], 'WhatsAppPhoneNumberId' => [ 'type' => 'string', 'max' => 100, 'min' => 1, 'pattern' => '.*(^phone-number-id-.*$)|(^arn:.*:phone-number-id/[0-9a-zA-Z]+$).*', ], 'WhatsAppPhoneNumberName' => [ 'type' => 'string', 'max' => 200, 'min' => 0, ], 'WhatsAppPhoneNumberQualityRating' => [ 'type' => 'string', 'max' => 10, 'min' => 0, ], 'WhatsAppPhoneNumberSummary' => [ 'type' => 'structure', 'required' => [ 'arn', 'phoneNumber', 'phoneNumberId', 'metaPhoneNumberId', 'displayPhoneNumberName', 'displayPhoneNumber', 'qualityRating', ], 'members' => [ 'arn' => [ 'shape' => 'LinkedWhatsAppPhoneNumberArn', ], 'phoneNumber' => [ 'shape' => 'PhoneNumber', ], 'phoneNumberId' => [ 'shape' => 'WhatsAppPhoneNumberId', ], 'metaPhoneNumberId' => [ 'shape' => 'WhatsAppPhoneNumber', ], 'displayPhoneNumberName' => [ 'shape' => 'WhatsAppPhoneNumberName', ], 'displayPhoneNumber' => [ 'shape' => 'WhatsAppDisplayPhoneNumber', ], 'qualityRating' => [ 'shape' => 'WhatsAppPhoneNumberQualityRating', ], 'dataLocalizationRegion' => [ 'shape' => 'IsoCountryCode', ], ], ], 'WhatsAppPhoneNumberSummaryList' => [ 'type' => 'list', 'member' => [ 'shape' => 'WhatsAppPhoneNumberSummary', ], ], 'WhatsAppSetupFinalization' => [ 'type' => 'structure', 'required' => [ 'associateInProgressToken', 'phoneNumbers', ], 'members' => [ 'associateInProgressToken' => [ 'shape' => 'AssociateInProgressToken', ], 'phoneNumbers' => [ 'shape' => 'WabaPhoneNumberSetupFinalizationList', ], 'phoneNumberParent' => [ 'shape' => 'LinkedWhatsAppBusinessAccountId', ], 'waba' => [ 'shape' => 'WabaSetupFinalization', ], ], ], 'WhatsAppSignupCallback' => [ 'type' => 'structure', 'required' => [ 'accessToken', ], 'members' => [ 'accessToken' => [ 'shape' => 'WhatsAppSignupCallbackAccessTokenString', ], 'callbackUrl' => [ 'shape' => 'WhatsAppSignupCallbackCallbackUrlString', ], ], ], 'WhatsAppSignupCallbackAccessTokenString' => [ 'type' => 'string', 'max' => 1000, 'min' => 0, ], 'WhatsAppSignupCallbackCallbackUrlString' => [ 'type' => 'string', 'max' => 100, 'min' => 0, ], 'WhatsAppSignupCallbackResult' => [ 'type' => 'structure', 'members' => [ 'associateInProgressToken' => [ 'shape' => 'AssociateInProgressToken', ], 'linkedAccountsWithIncompleteSetup' => [ 'shape' => 'LinkedAccountWithIncompleteSetup', ], ], ], 'ZeroTapTermsAccepted' => [ 'type' => 'boolean', 'box' => true, ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/endpoint-rule-set-1.json.php b/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/endpoint-rule-set-1.json.php new file mode 100644 index 0000000..528f8b0 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/endpoint-rule-set-1.json.php @@ -0,0 +1,3 @@ + '1.0', 'parameters' => [ 'Region' => [ 'builtIn' => 'AWS::Region', 'required' => false, 'documentation' => 'The AWS region used to dispatch the request.', 'type' => 'string', ], 'UseDualStack' => [ 'builtIn' => 'AWS::UseDualStack', 'required' => true, 'default' => false, 'documentation' => 'When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.', 'type' => 'boolean', ], 'UseFIPS' => [ 'builtIn' => 'AWS::UseFIPS', 'required' => true, 'default' => false, 'documentation' => 'When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.', 'type' => 'boolean', ], 'Endpoint' => [ 'builtIn' => 'SDK::Endpoint', 'required' => false, 'documentation' => 'Override the endpoint used to send this request', 'type' => 'string', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'Invalid Configuration: FIPS and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'Invalid Configuration: Dualstack and custom endpoint are not supported', 'type' => 'error', ], [ 'conditions' => [], 'endpoint' => [ 'url' => [ 'ref' => 'Endpoint', ], 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Region', ], ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'PartitionResult', ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ true, [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsFIPS', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ true, [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsDualStack', ], ], ], ], ], 'rules' => [ [ 'conditions' => [], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://social-messaging-fips.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'FIPS and DualStack are enabled, but this partition does not support one or both', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsFIPS', ], ], true, ], ], ], 'rules' => [ [ 'conditions' => [], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://social-messaging-fips.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'FIPS is enabled but this partition does not support FIPS', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ true, [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'PartitionResult', ], 'supportsDualStack', ], ], ], ], ], 'rules' => [ [ 'conditions' => [], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://social-messaging.{Region}.{PartitionResult#dualStackDnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'DualStack is enabled but this partition does not support DualStack', 'type' => 'error', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://social-messaging.{Region}.{PartitionResult#dnsSuffix}', 'properties' => [], 'headers' => [], ], 'type' => 'endpoint', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], ], 'type' => 'tree', ], [ 'conditions' => [], 'error' => 'Invalid Configuration: Missing Region', 'type' => 'error', ], ], 'type' => 'tree', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/paginators-1.json.php b/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/paginators-1.json.php new file mode 100644 index 0000000..cdaa03e --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/data/socialmessaging/2024-01-01/paginators-1.json.php @@ -0,0 +1,3 @@ + [ 'ListLinkedWhatsAppBusinessAccounts' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'linkedAccounts', ], 'ListWhatsAppMessageTemplates' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'templates', ], 'ListWhatsAppTemplateLibrary' => [ 'input_token' => 'nextToken', 'output_token' => 'nextToken', 'limit_key' => 'maxResults', 'result_key' => 'metaLibraryTemplates', ], ],]; diff --git a/vendor/aws/aws-sdk-php/src/functions.php b/vendor/aws/aws-sdk-php/src/functions.php new file mode 100644 index 0000000..b2c443c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/functions.php @@ -0,0 +1,568 @@ + true, '..' => true]; + $pathLen = strlen($path) + 1; + $iterator = dir_iterator($path, $context); + $queue = []; + do { + while ($iterator->valid()) { + $file = $iterator->current(); + $iterator->next(); + if (isset($invalid[basename($file)])) { + continue; + } + $fullPath = "{$path}/{$file}"; + yield $fullPath; + if (is_dir($fullPath)) { + $queue[] = $iterator; + $iterator = map( + dir_iterator($fullPath, $context), + function ($file) use ($fullPath, $pathLen) { + return substr("{$fullPath}/{$file}", $pathLen); + } + ); + continue; + } + } + $iterator = array_pop($queue); + } while ($iterator); +} + +//----------------------------------------------------------------------------- +// Misc. functions. +//----------------------------------------------------------------------------- + +/** + * Debug function used to describe the provided value type and class. + * + * @param mixed $input + * + * @return string Returns a string containing the type of the variable and + * if a class is provided, the class name. + */ +function describe_type($input) +{ + switch (gettype($input)) { + case 'object': + return 'object(' . get_class($input) . ')'; + case 'array': + return 'array(' . count($input) . ')'; + default: + ob_start(); + var_dump($input); + // normalize float vs double + return str_replace('double(', 'float(', rtrim(ob_get_clean())); + } +} + +/** + * Creates a default HTTP handler based on the available clients. + * + * @return callable + */ +function default_http_handler() +{ + return new \Aws\Handler\Guzzle\GuzzleHandler(); +} + +/** + * Gets the default user agent string depending on the Guzzle version + * + * @return string + */ +function default_user_agent() +{ + return Utils::defaultUserAgent(); +} + +/** + * Serialize a request for a command but do not send it. + * + * Returns a promise that is fulfilled with the serialized request. + * + * @param CommandInterface $command Command to serialize. + * + * @return RequestInterface + * @throws \RuntimeException + */ +function serialize(CommandInterface $command) +{ + $request = null; + $handlerList = $command->getHandlerList(); + + // Return a mock result. + $handlerList->setHandler( + function (CommandInterface $_, RequestInterface $r) use (&$request) { + $request = $r; + return new FulfilledPromise(new Result([])); + } + ); + + call_user_func($handlerList->resolve(), $command)->wait(); + if (!$request instanceof RequestInterface) { + throw new \RuntimeException( + 'Calling handler did not serialize request' + ); + } + + return $request; +} + +/** + * Retrieves data for a service from the SDK's service manifest file. + * + * Manifest data is stored statically, so it does not need to be loaded more + * than once per process. The JSON data is also cached in opcache. + * + * @param string $service Case-insensitive namespace or endpoint prefix of the + * service for which you are retrieving manifest data. + * + * @return array + * @throws \InvalidArgumentException if the service is not supported. + */ +function manifest($service = null) +{ + // Load the manifest and create aliases for lowercased namespaces + static $manifest = []; + static $aliases = []; + if (empty($manifest)) { + $manifest = load_compiled_json(__DIR__ . '/data/manifest.json'); + foreach ($manifest as $endpoint => $info) { + $alias = strtolower($info['namespace']); + if ($alias !== $endpoint) { + $aliases[$alias] = $endpoint; + } + } + } + + // If no service specified, then return the whole manifest. + if ($service === null) { + return $manifest; + } + + // Look up the service's info in the manifest data. + $service = strtolower($service); + if (isset($manifest[$service])) { + return $manifest[$service] + ['endpoint' => $service]; + } + + if (isset($aliases[$service])) { + return manifest($aliases[$service]); + } + + throw new \InvalidArgumentException( + "The service \"{$service}\" is not provided by the AWS SDK for PHP." + ); +} + +/** + * Checks if supplied parameter is a valid hostname + * + * @param string $hostname + * @return bool + */ +function is_valid_hostname($hostname) +{ + return ( + preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*\.?$/i", $hostname) + && preg_match("/^.{1,253}$/", $hostname) + && preg_match("/^[^\.]{1,63}(\.[^\.]{0,63})*$/", $hostname) + ); +} + +/** + * Checks if supplied parameter is a valid host label + * + * @param $label + * @return bool + */ +function is_valid_hostlabel($label) +{ + return preg_match("/^(?!-)[a-zA-Z0-9-]{1,63}(?realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + return include("phpvfscomposer://" . __DIR__ . '/..'.'/nesbot/carbon/bin/carbon'); + } +} + +return include __DIR__ . '/..'.'/nesbot/carbon/bin/carbon'; diff --git a/vendor/bin/jp.php b/vendor/bin/jp.php new file mode 100755 index 0000000..fc4e0a7 --- /dev/null +++ b/vendor/bin/jp.php @@ -0,0 +1,119 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + return include("phpvfscomposer://" . __DIR__ . '/..'.'/mtdowling/jmespath.php/bin/jp.php'); + } +} + +return include __DIR__ . '/..'.'/mtdowling/jmespath.php/bin/jp.php'; diff --git a/vendor/bin/var-dump-server b/vendor/bin/var-dump-server new file mode 100755 index 0000000..18db1c1 --- /dev/null +++ b/vendor/bin/var-dump-server @@ -0,0 +1,119 @@ +#!/usr/bin/env php +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + return include("phpvfscomposer://" . __DIR__ . '/..'.'/symfony/var-dumper/Resources/bin/var-dump-server'); + } +} + +return include __DIR__ . '/..'.'/symfony/var-dumper/Resources/bin/var-dump-server'; diff --git a/vendor/brunodebarros/fix-php-post-input/FixPhpPostInput.php b/vendor/brunodebarros/fix-php-post-input/FixPhpPostInput.php new file mode 100644 index 0000000..b6f89a4 --- /dev/null +++ b/vendor/brunodebarros/fix-php-post-input/FixPhpPostInput.php @@ -0,0 +1,151 @@ +temp_files[] = $tmp_name; + $result = file_put_contents($tmp_name, $contents); + + if (strlen($contents) !== $result) { + throw new \RuntimeException("Could not store temp file in $tmp_name."); + } + + return $tmp_name; + } + + protected function map_name_to_array($name, $array) { + if (substr($name, -2) == "[]") { + if (isset($array[substr($name, 0, -2)])) { + return $array[substr($name, 0, -2)]; + } + } + + if (isset($array[$name])) { + return $array[$name]; + } + + + $return = null; + $code = 'if(isset($array' . implode("", $name) . ')) {$return = $array' . implode("", $name) . ';} else { $return = null; }'; + eval($code); + return $return; + } + + function __construct(&$post = null, &$files = null, $server = null, $php_input = null) { + + if ($post === null) { + $post = &$_POST; + } + + if ($files === null) { + $files = &$_FILES; + } + + if ($php_input === null) { + $php_input = file_get_contents('php://input'); + } + + if ($server === null) { + $server = $_SERVER; + } + + if (count($post) == 0) { + $is_post = false; + foreach ($server as $key => $value) { + $search = "REQUEST_METHOD"; + if (substr($key, -strlen($search)) == $search) { + if ($value == "POST") { + $is_post = true; + } + } + } + + if ($is_post) { + if (!empty($php_input)) { + $is_multipart = (stristr($server["CONTENT_TYPE"], "multipart/form-data") !== false); + $is_json = (stristr($server["CONTENT_TYPE"], "application/json") !== false); + + if ($is_json) { + $post = json_decode($php_input, true); + } elseif ($is_multipart) { + $document = new \Riverline\MultiPartParser\Part("Content-Type: " . $server["CONTENT_TYPE"] . "\n\n" . $php_input); + foreach ($document->getParts() as $part) { + if ($part->isFile()) { + $size = strlen($part->getBody()); + + $data = [ + "name" => $part->getFileName(), + "type" => $size ? $part->getMimeType() : "", + "tmp_name" => $size ? $this->store_temp($part->getBody()) : "", + "error" => $size ? UPLOAD_ERR_OK : UPLOAD_ERR_NO_FILE, + "size" => $size, + ]; + + foreach ($data as $key => $value) { + $name = explode("[", $part->getName(), 2); + $name = $name[0] . "[$key][" . $name[1]; + $files = $this->edit_array($files, $name, $value); + } + } else { + $post = $this->edit_array($post, $part->getName(), $part->getBody()); + } + } + } else { + parse_str($php_input, $post); + } + } + } + } + } + + function __destruct() { + foreach ($this->temp_files as $temp_file) { + if (file_exists($temp_file)) { + unlink($temp_file); + } + } + } + +} \ No newline at end of file diff --git a/vendor/brunodebarros/fix-php-post-input/LICENSE.md b/vendor/brunodebarros/fix-php-post-input/LICENSE.md new file mode 100644 index 0000000..715f4b2 --- /dev/null +++ b/vendor/brunodebarros/fix-php-post-input/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Bruno De Barros + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/brunodebarros/fix-php-post-input/bootstrap.php b/vendor/brunodebarros/fix-php-post-input/bootstrap.php new file mode 100644 index 0000000..088dd57 --- /dev/null +++ b/vendor/brunodebarros/fix-php-post-input/bootstrap.php @@ -0,0 +1,5 @@ +=5.4", + "riverline/multipart-parser": "dev-master" + }, + "autoload": { + "psr-4": { + "Brunodebarros\\FixPhpPostInput\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "minimum-stability": "dev", + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true + } +} diff --git a/vendor/brunodebarros/fix-php-post-input/composer.lock b/vendor/brunodebarros/fix-php-post-input/composer.lock new file mode 100644 index 0000000..74eb3fa --- /dev/null +++ b/vendor/brunodebarros/fix-php-post-input/composer.lock @@ -0,0 +1,72 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "9b3b2714adf4aa244ebcc5410e3afee1", + "packages": [ + { + "name": "riverline/multipart-parser", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/BrunoDeBarros/multipart-parser.git", + "reference": "24fe25355e14eb86774e6c8dba35c52c62a091e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/BrunoDeBarros/multipart-parser/zipball/24fe25355e14eb86774e6c8dba35c52c62a091e6", + "reference": "24fe25355e14eb86774e6c8dba35c52c62a091e6", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^4.7 || ^5.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "Riverline\\MultiPartParser": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Romain Cambien", + "email": "romain@riverline.fr" + }, + { + "name": "Riverline", + "homepage": "http://www.riverline.fr" + } + ], + "description": "One class library to parse multipart content with encoding and charset support.", + "keywords": [ + "http", + "multipart", + "parser" + ], + "support": { + "source": "https://github.com/BrunoDeBarros/multipart-parser/tree/master" + }, + "time": "2018-08-13T07:57:45+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "riverline/multipart-parser": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.4" + }, + "platform-dev": [] +} diff --git a/vendor/carbonphp/carbon-doctrine-types/LICENSE b/vendor/carbonphp/carbon-doctrine-types/LICENSE new file mode 100644 index 0000000..2ee1671 --- /dev/null +++ b/vendor/carbonphp/carbon-doctrine-types/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Carbon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/carbonphp/carbon-doctrine-types/composer.json b/vendor/carbonphp/carbon-doctrine-types/composer.json new file mode 100644 index 0000000..abf45c5 --- /dev/null +++ b/vendor/carbonphp/carbon-doctrine-types/composer.json @@ -0,0 +1,36 @@ +{ + "name": "carbonphp/carbon-doctrine-types", + "description": "Types to use Carbon in Doctrine", + "type": "library", + "keywords": [ + "date", + "time", + "DateTime", + "Carbon", + "Doctrine" + ], + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "license": "MIT", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "minimum-stability": "dev" +} diff --git a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php new file mode 100644 index 0000000..a63a9b8 --- /dev/null +++ b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php @@ -0,0 +1,16 @@ + + */ + protected function getCarbonClassName(): string + { + return Carbon::class; + } + + public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string + { + $precision = min( + $fieldDeclaration['precision'] ?? DateTimeDefaultPrecision::get(), + $this->getMaximumPrecision($platform), + ); + + $type = parent::getSQLDeclaration($fieldDeclaration, $platform); + + if (!$precision) { + return $type; + } + + if (str_contains($type, '(')) { + return preg_replace('/\(\d+\)/', "($precision)", $type); + } + + [$before, $after] = explode(' ', "$type "); + + return trim("$before($precision) $after"); + } + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string + { + if ($value === null) { + return $value; + } + + if ($value instanceof DateTimeInterface) { + return $value->format('Y-m-d H:i:s.u'); + } + + throw InvalidType::new( + $value, + static::class, + ['null', 'DateTime', 'Carbon'] + ); + } + + private function doConvertToPHPValue(mixed $value) + { + $class = $this->getCarbonClassName(); + + if ($value === null || is_a($value, $class)) { + return $value; + } + + if ($value instanceof DateTimeInterface) { + return $class::instance($value); + } + + $date = null; + $error = null; + + try { + $date = $class::parse($value); + } catch (Exception $exception) { + $error = $exception; + } + + if (!$date) { + throw ValueNotConvertible::new( + $value, + static::class, + 'Y-m-d H:i:s.u or any format supported by '.$class.'::parse()', + $error + ); + } + + return $date; + } + + private function getMaximumPrecision(AbstractPlatform $platform): int + { + if ($platform instanceof DB2Platform) { + return 12; + } + + if ($platform instanceof OraclePlatform) { + return 9; + } + + if ($platform instanceof SQLServerPlatform || $platform instanceof SQLitePlatform) { + return 3; + } + + return 6; + } +} diff --git a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php new file mode 100644 index 0000000..cd9896f --- /dev/null +++ b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php @@ -0,0 +1,30 @@ + */ + use CarbonTypeConverter; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function convertToPHPValue(mixed $value, AbstractPlatform $platform): ?CarbonImmutable + { + return $this->doConvertToPHPValue($value); + } + + /** + * @return class-string + */ + protected function getCarbonClassName(): string + { + return CarbonImmutable::class; + } +} diff --git a/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php new file mode 100644 index 0000000..89e4b79 --- /dev/null +++ b/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php @@ -0,0 +1,24 @@ + */ + use CarbonTypeConverter; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function convertToPHPValue(mixed $value, AbstractPlatform $platform): ?Carbon + { + return $this->doConvertToPHPValue($value); + } +} diff --git a/vendor/clue/stream-filter/.github/FUNDING.yml b/vendor/clue/stream-filter/.github/FUNDING.yml new file mode 100644 index 0000000..9c09fb8 --- /dev/null +++ b/vendor/clue/stream-filter/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: clue +custom: https://clue.engineering/support diff --git a/vendor/clue/stream-filter/LICENSE b/vendor/clue/stream-filter/LICENSE new file mode 100644 index 0000000..dc09d1e --- /dev/null +++ b/vendor/clue/stream-filter/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Christian Lück + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/clue/stream-filter/composer.json b/vendor/clue/stream-filter/composer.json new file mode 100644 index 0000000..2e74456 --- /dev/null +++ b/vendor/clue/stream-filter/composer.json @@ -0,0 +1,32 @@ +{ + "name": "clue/stream-filter", + "description": "A simple and modern approach to stream filtering in PHP", + "keywords": ["stream", "callback", "filter", "php_user_filter", "stream_filter_append", "stream_filter_register", "bucket brigade"], + "homepage": "https://github.com/clue/stream-filter", + "license": "MIT", + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "autoload-dev": { + "psr-4": { + "Clue\\Tests\\StreamFilter\\": "tests/" + } + } +} diff --git a/vendor/clue/stream-filter/src/CallbackFilter.php b/vendor/clue/stream-filter/src/CallbackFilter.php new file mode 100644 index 0000000..a667fe6 --- /dev/null +++ b/vendor/clue/stream-filter/src/CallbackFilter.php @@ -0,0 +1,120 @@ +closed = false; + + if (!\is_callable($this->params)) { + throw new \InvalidArgumentException('No valid callback parameter given to stream_filter_(append|prepend)'); + } + $this->callback = $this->params; + + // callback supports end event if it accepts invocation without arguments + $ref = new \ReflectionFunction($this->callback); + $this->supportsClose = ($ref->getNumberOfRequiredParameters() === 0); + + return true; + } + + /** @return void */ + #[\ReturnTypeWillChange] + public function onClose() + { + $this->closed = true; + + // callback supports closing and is not already closed + if ($this->supportsClose) { + $this->supportsClose = false; + // invoke without argument to signal end and discard resulting buffer + try { + \call_user_func($this->callback); + } catch (\Exception $ignored) { + // this might be called during engine shutdown, so it's not safe + // to raise any errors or exceptions here + // trigger_error('Error closing filter: ' . $ignored->getMessage(), E_USER_WARNING); + } + } + + $this->callback = null; + } + + /** @return int */ + #[\ReturnTypeWillChange] + public function filter($in, $out, &$consumed, $closing) + { + // concatenate whole buffer from input brigade + $data = ''; + while ($bucket = \stream_bucket_make_writeable($in)) { + $consumed += $bucket->datalen; + $data .= $bucket->data; + } + + // skip processing callback that already ended + if ($this->closed) { + return \PSFS_FEED_ME; + } + + // only invoke filter function if buffer is not empty + // this may skip flushing a closing filter + if ($data !== '') { + try { + $data = \call_user_func($this->callback, $data); + } catch (\Exception $e) { + // exception should mark filter as closed + $this->onClose(); + \trigger_error('Error invoking filter: ' . $e->getMessage(), \E_USER_WARNING); + + return \PSFS_ERR_FATAL; + } + } + + // mark filter as closed after processing closing chunk + if ($closing) { + $this->closed = true; + + // callback supports closing and is not already closed + if ($this->supportsClose) { + $this->supportsClose = false; + + // invoke without argument to signal end and append resulting buffer + try { + $data .= \call_user_func($this->callback); + } catch (\Exception $e) { + \trigger_error('Error ending filter: ' . $e->getMessage(), \E_USER_WARNING); + + return \PSFS_ERR_FATAL; + } + } + } + + if ($data !== '') { + // create a new bucket for writing the resulting buffer to the output brigade + // reusing an existing bucket turned out to be bugged in some environments (ancient PHP versions and HHVM) + $bucket = @\stream_bucket_new($this->stream, $data); + + // legacy PHP versions (PHP < 5.4) do not support passing data from the event signal handler + // because closing the stream invalidates the stream and its stream bucket brigade before + // invoking the filter close handler. + if ($bucket !== false) { + \stream_bucket_append($out, $bucket); + } + } + + return \PSFS_PASS_ON; + } +} diff --git a/vendor/clue/stream-filter/src/functions.php b/vendor/clue/stream-filter/src/functions.php new file mode 100644 index 0000000..865f6b9 --- /dev/null +++ b/vendor/clue/stream-filter/src/functions.php @@ -0,0 +1,380 @@ + Note: Legacy PHP versions (PHP < 5.4) do not support passing additional data + * from the end signal handler if the stream is being closed. + * + * If your callback throws an `Exception`, then the filter process will be aborted. + * In order to play nice with PHP's stream handling, + * the `Exception` will be transformed to a PHP warning instead: + * + * ```php + * Clue\StreamFilter\append($stream, function ($chunk) { + * throw new \RuntimeException('Unexpected chunk'); + * }); + * + * // raises an E_USER_WARNING with "Error invoking filter: Unexpected chunk" + * fwrite($stream, 'hello'); + * ``` + * + * The optional `$read_write` parameter can be used to only invoke the `$callback` + * when either writing to the stream or only when reading from the stream: + * + * ```php + * Clue\StreamFilter\append($stream, function ($chunk) { + * // will be called each time you write to the stream + * return $chunk; + * }, STREAM_FILTER_WRITE); + * + * Clue\StreamFilter\append($stream, function ($chunk) { + * // will be called each time you read from the stream + * return $chunk; + * }, STREAM_FILTER_READ); + * ``` + * + * This function returns a filter resource which can be passed to [`remove()`](#remove). + * + * > Note that once a filter has been added to stream, the stream can no longer be passed to + * > [`stream_select()`](https://www.php.net/manual/en/function.stream-select.php) + * > (and family). + * > + * > > Warning: stream_select(): cannot cast a filtered stream on this system in {file} on line {line} + * > + * > This is due to limitations of PHP's stream filter support, as it can no longer reliably + * > tell when the underlying stream resource is actually ready. + * > As an alternative, consider calling `stream_select()` on the unfiltered stream and + * > then pass the unfiltered data through the [`fun()`](#fun) function. + * + * @param resource $stream + * @param callable $callback + * @param int $read_write + * @return resource filter resource which can be used for `remove()` + * @throws \Exception on error + * @uses stream_filter_append() + */ +function append($stream, $callback, $read_write = STREAM_FILTER_ALL) +{ + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errstr) { + // Match errstr from PHP's warning message. + // stream_filter_append() expects parameter 1 to be resource,... + $errstr = $error; // @codeCoverageIgnore + }); + + try { + $ret = \stream_filter_append($stream, register(), $read_write, $callback); + } catch (\TypeError $e) { // @codeCoverageIgnoreStart + // Throws TypeError on PHP 8.0+ + \restore_error_handler(); + throw $e; + } // @codeCoverageIgnoreEnd + + \restore_error_handler(); + + // PHP 8 throws above on type errors, older PHP and memory issues can throw here + // @codeCoverageIgnoreStart + if ($ret === false) { + throw new \RuntimeException('Unable to append filter: ' . $errstr); + } + // @codeCoverageIgnoreEnd + + return $ret; +} + +/** + * Prepend a filter callback to the given stream. + * + * Each stream can have a list of filters attached. + * This function prepends a filter to the start of this list. + * + * If the given filter can not be added, it throws an `Exception`. + * + * ```php + * $filter = Clue\StreamFilter\prepend($stream, function ($chunk) { + * // will be called each time you read or write a $chunk to/from the stream + * return $chunk; + * }); + * ``` + * + * This function returns a filter resource which can be passed to [`remove()`](#remove). + * + * Except for the position in the list of filters, this function behaves exactly + * like the [`append()`](#append) function. + * For more details about its behavior, see also the [`append()`](#append) function. + * + * @param resource $stream + * @param callable $callback + * @param int $read_write + * @return resource filter resource which can be used for `remove()` + * @throws \Exception on error + * @uses stream_filter_prepend() + */ +function prepend($stream, $callback, $read_write = STREAM_FILTER_ALL) +{ + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errstr) { + // Match errstr from PHP's warning message. + // stream_filter_prepend() expects parameter 1 to be resource,... + $errstr = $error; // @codeCoverageIgnore + }); + + try { + $ret = \stream_filter_prepend($stream, register(), $read_write, $callback); + } catch (\TypeError $e) { // @codeCoverageIgnoreStart + // Throws TypeError on PHP 8.0+ + \restore_error_handler(); + throw $e; + } // @codeCoverageIgnoreEnd + + \restore_error_handler(); + + // PHP 8 throws above on type errors, older PHP and memory issues can throw here + // @codeCoverageIgnoreStart + if ($ret === false) { + throw new \RuntimeException('Unable to prepend filter: ' . $errstr); + } + // @codeCoverageIgnoreEnd + + return $ret; +} + +/** + * Create a filter function which uses the given built-in `$filter`. + * + * PHP comes with a useful set of [built-in filters](https://www.php.net/manual/en/filters.php). + * Using `fun()` makes accessing these as easy as passing an input string to filter + * and getting the filtered output string. + * + * ```php + * $fun = Clue\StreamFilter\fun('string.rot13'); + * + * assert('grfg' === $fun('test')); + * assert('test' === $fun($fun('test')); + * ``` + * + * Please note that not all filter functions may be available depending + * on installed PHP extensions and the PHP version in use. + * In particular, [HHVM](https://hhvm.com/) may not offer the same filter functions + * or parameters as Zend PHP. + * Accessing an unknown filter function will result in a `RuntimeException`: + * + * ```php + * Clue\StreamFilter\fun('unknown'); // throws RuntimeException + * ``` + * + * Some filters may accept or require additional filter parameters – most + * filters do not require filter parameters. + * If given, the optional `$parameters` argument will be passed to the + * underlying filter handler as-is. + * In particular, note how *not passing* this parameter at all differs from + * explicitly passing a `null` value (which many filters do not accept). + * Please refer to the individual filter definition for more details. + * For example, the `string.strip_tags` filter can be invoked like this: + * + * ```php + * $fun = Clue\StreamFilter\fun('string.strip_tags', ''); + * + * $ret = $fun('h
i
'); + * assert('hi' === $ret); + * ``` + * + * Under the hood, this function allocates a temporary memory stream, so it's + * recommended to clean up the filter function after use. + * Also, some filter functions (in particular the + * [zlib compression filters](https://www.php.net/manual/en/filters.compression.php)) + * may use internal buffers and may emit a final data chunk on close. + * The filter function can be closed by invoking without any arguments: + * + * ```php + * $fun = Clue\StreamFilter\fun('zlib.deflate'); + * + * $ret = $fun('hello') . $fun('world') . $fun(); + * assert('helloworld' === gzinflate($ret)); + * ``` + * + * The filter function must not be used anymore after it has been closed. + * Doing so will result in a `RuntimeException`: + * + * ```php + * $fun = Clue\StreamFilter\fun('string.rot13'); + * $fun(); + * + * $fun('test'); // throws RuntimeException + * ``` + * + * > Note: If you're using the zlib compression filters, then you should be wary + * about engine inconsistencies between different PHP versions and HHVM. + * These inconsistencies exist in the underlying PHP engines and there's little we + * can do about this in this library. + * [Our test suite](tests/) contains several test cases that exhibit these issues. + * If you feel some test case is missing or outdated, we're happy to accept PRs! :) + * + * @param string $filter built-in filter name. See stream_get_filters() or http://php.net/manual/en/filters.php + * @param mixed $parameters (optional) parameters to pass to the built-in filter as-is + * @return callable a filter callback which can be append()'ed or prepend()'ed + * @throws \RuntimeException on error + * @link http://php.net/manual/en/filters.php + * @see stream_get_filters() + * @see append() + */ +function fun($filter, $parameters = null) +{ + $fp = \fopen('php://memory', 'w'); + + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errstr) { + // Match errstr from PHP's warning message. + // stream_filter_append() expects parameter 1 to be resource,... + $errstr = $error; + }); + + if (\func_num_args() === 1) { + $filter = \stream_filter_append($fp, $filter, \STREAM_FILTER_WRITE); + } else { + $filter = \stream_filter_append($fp, $filter, \STREAM_FILTER_WRITE, $parameters); + } + + \restore_error_handler(); + + if ($filter === false) { + \fclose($fp); + throw new \RuntimeException('Unable to access built-in filter: ' . $errstr); + } + + // append filter function which buffers internally + $buffer = ''; + append($fp, function ($chunk) use (&$buffer) { + $buffer .= $chunk; + + // always return empty string in order to skip actually writing to stream resource + return ''; + }, \STREAM_FILTER_WRITE); + + $closed = false; + + return function ($chunk = null) use ($fp, $filter, &$buffer, &$closed) { + if ($closed) { + throw new \RuntimeException('Unable to perform operation on closed stream'); + } + if ($chunk === null) { + $closed = true; + $buffer = ''; + \fclose($fp); + return $buffer; + } + // initialize buffer and invoke filters by attempting to write to stream + $buffer = ''; + \fwrite($fp, $chunk); + + // buffer now contains everything the filter function returned + return $buffer; + }; +} + +/** + * Remove a filter previously added via `append()` or `prepend()`. + * + * ```php + * $filter = Clue\StreamFilter\append($stream, function () { + * // … + * }); + * Clue\StreamFilter\remove($filter); + * ``` + * + * @param resource $filter + * @return bool true on success or false on error + * @throws \RuntimeException on error + * @uses stream_filter_remove() + */ +function remove($filter) +{ + $errstr = ''; + \set_error_handler(function ($_, $error) use (&$errstr) { + // Match errstr from PHP's warning message. + // stream_filter_remove() expects parameter 1 to be resource,... + $errstr = $error; + }); + + try { + $ret = \stream_filter_remove($filter); + } catch (\TypeError $e) { // @codeCoverageIgnoreStart + // Throws TypeError on PHP 8.0+ + \restore_error_handler(); + throw $e; + } // @codeCoverageIgnoreEnd + + \restore_error_handler(); + + if ($ret === false) { + // PHP 8 throws above on type errors, older PHP and memory issues can throw here + throw new \RuntimeException('Unable to remove filter: ' . $errstr); + } +} + +/** + * Registers the callback filter and returns the resulting filter name + * + * There should be little reason to call this function manually. + * + * @return string filter name + * @uses CallbackFilter + */ +function register() +{ + static $registered = null; + if ($registered === null) { + $registered = 'stream-callback'; + \stream_filter_register($registered, __NAMESPACE__ . '\CallbackFilter'); + } + return $registered; +} diff --git a/vendor/clue/stream-filter/src/functions_include.php b/vendor/clue/stream-filter/src/functions_include.php new file mode 100644 index 0000000..198b45f --- /dev/null +++ b/vendor/clue/stream-filter/src/functions_include.php @@ -0,0 +1,9 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\CaBundle; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Process\PhpProcess; + +/** + * @author Chris Smith + * @author Jordi Boggiano + */ +class CaBundle +{ + /** @var string|null */ + private static $caPath; + /** @var array */ + private static $caFileValidity = array(); + + /** + * Returns the system CA bundle path, or a path to the bundled one + * + * This method was adapted from Sslurp. + * https://github.com/EvanDotPro/Sslurp + * + * (c) Evan Coury + * + * For the full copyright and license information, please see below: + * + * Copyright (c) 2013, Evan Coury + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @param LoggerInterface $logger optional logger for information about which CA files were loaded + * @return string path to a CA bundle file or directory + */ + public static function getSystemCaRootBundlePath(?LoggerInterface $logger = null) + { + if (self::$caPath !== null) { + return self::$caPath; + } + $caBundlePaths = array(); + + // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that. + // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. + $caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE'); + + // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that. + // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. + $caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR'); + + $caBundlePaths[] = ini_get('openssl.cafile'); + $caBundlePaths[] = ini_get('openssl.capath'); + + $otherLocations = array( + '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', // Fedora, RHEL, CentOS (ca-certificates package) - NEW + '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package) - Deprecated + '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package) + '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package) + '/usr/ssl/certs/ca-bundle.crt', // Cygwin + '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package + '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option) + '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat? + '/etc/ssl/cert.pem', // OpenBSD + '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package + '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package + '/opt/homebrew/etc/openssl@3/cert.pem', // macOS silicon homebrew, openssl@3 package + '/opt/homebrew/etc/openssl@1.1/cert.pem', // macOS silicon homebrew, openssl@1.1 package + '/etc/pki/tls/certs', + '/etc/ssl/certs', // FreeBSD + ); + + $caBundlePaths = array_merge($caBundlePaths, $otherLocations); + + foreach ($caBundlePaths as $caBundle) { + if ($caBundle && self::caFileUsable($caBundle, $logger)) { + return self::$caPath = $caBundle; + } + + if ($caBundle && self::caDirUsable($caBundle, $logger)) { + return self::$caPath = $caBundle; + } + } + + return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort + } + + /** + * Returns the path to the bundled CA file + * + * In case you don't want to trust the user or the system, you can use this directly + * + * @return string path to a CA bundle file + */ + public static function getBundledCaBundlePath() + { + $caBundleFile = __DIR__.'/../res/cacert.pem'; + + // cURL does not understand 'phar://' paths + // see https://github.com/composer/ca-bundle/issues/10 + if (0 === strpos($caBundleFile, 'phar://')) { + $tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-'); + if (false === $tempCaBundleFile) { + throw new \RuntimeException('Could not create a temporary file to store the bundled CA file'); + } + + file_put_contents( + $tempCaBundleFile, + file_get_contents($caBundleFile) + ); + + register_shutdown_function(function() use ($tempCaBundleFile) { + @unlink($tempCaBundleFile); + }); + + $caBundleFile = $tempCaBundleFile; + } + + return $caBundleFile; + } + + /** + * Validates a CA file using opensl_x509_parse only if it is safe to use + * + * @param string $filename + * @param LoggerInterface $logger optional logger for information about which CA files were loaded + * + * @return bool + */ + public static function validateCaFile($filename, ?LoggerInterface $logger = null) + { + static $warned = false; + + if (isset(self::$caFileValidity[$filename])) { + return self::$caFileValidity[$filename]; + } + + $contents = file_get_contents($filename); + + if (is_string($contents) && strlen($contents) > 0) { + $contents = preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents); + if (null === $contents) { + // regex extraction failed + $isValid = false; + } else { + $isValid = (bool) openssl_x509_parse($contents); + } + } else { + $isValid = false; + } + + if ($logger) { + $logger->debug('Checked CA file '.realpath($filename).': '.($isValid ? 'valid' : 'invalid')); + } + + return self::$caFileValidity[$filename] = $isValid; + } + + /** + * Test if it is safe to use the PHP function openssl_x509_parse(). + * + * This checks if OpenSSL extensions is vulnerable to remote code execution + * via the exploit documented as CVE-2013-6420. + * + * @return bool + */ + public static function isOpensslParseSafe() + { + return true; + } + + /** + * Resets the static caches + * @return void + */ + public static function reset() + { + self::$caFileValidity = array(); + self::$caPath = null; + } + + /** + * @param string $name + * @return string|false + */ + private static function getEnvVariable($name) + { + if (isset($_SERVER[$name])) { + return (string) $_SERVER[$name]; + } + + if (PHP_SAPI === 'cli' && ($value = getenv($name)) !== false && $value !== null) { + return (string) $value; + } + + return false; + } + + /** + * @param string|false $certFile + * @param LoggerInterface|null $logger + * @return bool + */ + private static function caFileUsable($certFile, ?LoggerInterface $logger = null) + { + return $certFile + && self::isFile($certFile, $logger) + && self::isReadable($certFile, $logger) + && self::validateCaFile($certFile, $logger); + } + + /** + * @param string|false $certDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function caDirUsable($certDir, ?LoggerInterface $logger = null) + { + return $certDir + && self::isDir($certDir, $logger) + && self::isReadable($certDir, $logger) + && self::glob($certDir . '/*', $logger); + } + + /** + * @param string $certFile + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isFile($certFile, ?LoggerInterface $logger = null) + { + $isFile = @is_file($certFile); + if (!$isFile && $logger) { + $logger->debug(sprintf('Checked CA file %s does not exist or it is not a file.', $certFile)); + } + + return $isFile; + } + + /** + * @param string $certDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isDir($certDir, ?LoggerInterface $logger = null) + { + $isDir = @is_dir($certDir); + if (!$isDir && $logger) { + $logger->debug(sprintf('Checked directory %s does not exist or it is not a directory.', $certDir)); + } + + return $isDir; + } + + /** + * @param string $certFileOrDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isReadable($certFileOrDir, ?LoggerInterface $logger = null) + { + $isReadable = @is_readable($certFileOrDir); + if (!$isReadable && $logger) { + $logger->debug(sprintf('Checked file or directory %s is not readable.', $certFileOrDir)); + } + + return $isReadable; + } + + /** + * @param string $pattern + * @param LoggerInterface|null $logger + * @return bool + */ + private static function glob($pattern, ?LoggerInterface $logger = null) + { + $certs = glob($pattern); + if ($certs === false) { + if ($logger) { + $logger->debug(sprintf("An error occurred while trying to find certificates for pattern: %s", $pattern)); + } + return false; + } + + if (count($certs) === 0) { + if ($logger) { + $logger->debug(sprintf("No CA files found for pattern: %s", $pattern)); + } + return false; + } + + return true; + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 87fda74..1fab6f2 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,5 +1,5822 @@ { - "packages": [], + "packages": [ + { + "name": "aws/aws-crt-php", + "version": "v1.2.7", + "version_normalized": "1.2.7.0", + "source": { + "type": "git", + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." + }, + "time": "2024-10-18T22:15:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "https://github.com/awslabs/aws-crt-php", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" + }, + "install-path": "../aws/aws-crt-php" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.363.2", + "version_normalized": "3.363.2.0", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "f8b5f125248daa8942144b4771c041a63ec41900" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f8b5f125248daa8942144b4771c041a63ec41900", + "reference": "f8b5f125248daa8942144b4771c041a63ec41900", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.2.3", + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.4.5", + "mtdowling/jmespath.php": "^2.8.0", + "php": ">=8.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "composer/composer": "^2.7.8", + "dms/phpunit-arraysubset-asserts": "^0.4.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", + "psr/cache": "^2.0 || ^3.0", + "psr/simple-cache": "^2.0 || ^3.0", + "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", + "symfony/filesystem": "^v6.4.0 || ^v7.1.0", + "yoast/phpunit-polyfills": "^2.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "time": "2025-11-25T19:04:55+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Aws\\": "src/" + }, + "exclude-from-classmap": [ + "src/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "support": { + "forum": "https://github.com/aws/aws-sdk-php/discussions", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.363.2" + }, + "install-path": "../aws/aws-sdk-php" + }, + { + "name": "brunodebarros/fix-php-post-input", + "version": "v1.3.0", + "version_normalized": "1.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/pocketarc/fix-php-post-input.git", + "reference": "088544a82e94e95f41e8f7c9b9cb7061f8d0c7fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pocketarc/fix-php-post-input/zipball/088544a82e94e95f41e8f7c9b9cb7061f8d0c7fc", + "reference": "088544a82e94e95f41e8f7c9b9cb7061f8d0c7fc", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "riverline/multipart-parser": "dev-master" + }, + "time": "2018-08-13T08:16:58+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Brunodebarros\\FixPhpPostInput\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno De Barros", + "email": "bruno@terraduo.com" + } + ], + "description": "If your $_POST/$_FILES are empty and they shouldn't be, this library fixes them.", + "homepage": "https://github.com/BrunoDeBarros/fix-php-post-input", + "keywords": [ + "compatibility", + "files", + "input", + "post" + ], + "support": { + "issues": "https://github.com/pocketarc/fix-php-post-input/issues", + "source": "https://github.com/pocketarc/fix-php-post-input/tree/v1.3.0" + }, + "install-path": "../brunodebarros/fix-php-post-input" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "version_normalized": "3.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "time": "2024-02-09T16:56:22+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "install-path": "../carbonphp/carbon-doctrine-types" + }, + { + "name": "clue/stream-filter", + "version": "v1.7.0", + "version_normalized": "1.7.0.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "time": "2023-12-20T15:40:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "install-path": "../clue/stream-filter" + }, + { + "name": "composer/ca-bundle", + "version": "1.5.9", + "version_normalized": "1.5.9.0", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "1905981ee626e6f852448b7aaa978f8666c5bc54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/1905981ee626e6f852448b7aaa978f8666c5bc54", + "reference": "1905981ee626e6f852448b7aaa978f8666c5bc54", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "time": "2025-11-06T11:46:17+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.9" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "install-path": "./ca-bundle" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "version_normalized": "1.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "time": "2025-04-07T20:06:18+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + }, + "install-path": "../doctrine/deprecations" + }, + { + "name": "doctrine/lexer", + "version": "2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" + }, + "time": "2024-02-05T11:35:39+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "install-path": "../doctrine/lexer" + }, + { + "name": "egulias/email-validator", + "version": "3.2.6", + "version_normalized": "3.2.6.0", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2|^2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "time": "2023-06-01T07:04:22+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.2.6" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "install-path": "../egulias/email-validator" + }, + { + "name": "erusev/parsedown", + "version": "dev-master", + "version_normalized": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "0b274ac959624e6c6d647e9c9b6c2d20da242004" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/0b274ac959624e6c6d647e9c9b6c2d20da242004", + "reference": "0b274ac959624e6c6d647e9c9b6c2d20da242004", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5|^8.5|^9.6" + }, + "time": "2025-08-31T07:57:44+00:00", + "default-branch": true, + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "support": { + "issues": "https://github.com/erusev/parsedown/issues", + "source": "https://github.com/erusev/parsedown/tree/master" + }, + "install-path": "../erusev/parsedown" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.19.0", + "version_normalized": "4.19.0.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/b287d2a16aceffbf6e0295559b39662612b77fcf", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "time": "2025-10-17T16:34:55+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.19.0" + }, + "install-path": "../ezyang/htmlpurifier" + }, + { + "name": "firebase/php-jwt", + "version": "v6.11.1", + "version_normalized": "6.11.1.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "time": "2025-04-09T20:32:01+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" + }, + "install-path": "../firebase/php-jwt" + }, + { + "name": "google/apiclient", + "version": "v2.18.4", + "version_normalized": "2.18.4.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-api-php-client.git", + "reference": "5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b", + "reference": "5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "^6.0", + "google/apiclient-services": "~0.350", + "google/auth": "^1.37", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.6", + "monolog/monolog": "^2.9||^3.0", + "php": "^8.1", + "phpseclib/phpseclib": "^3.0.36" + }, + "require-dev": { + "cache/filesystem-adapter": "^1.1", + "composer/composer": "^1.10.23", + "phpcompatibility/php-compatibility": "^9.2", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "^3.8", + "symfony/css-selector": "~2.1", + "symfony/dom-crawler": "~2.1" + }, + "suggest": { + "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)" + }, + "time": "2025-09-30T04:23:07+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/aliases.php" + ], + "psr-4": { + "Google\\": "src/" + }, + "classmap": [ + "src/aliases.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Client library for Google APIs", + "homepage": "http://developers.google.com/api-client-library/php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/google-api-php-client/issues", + "source": "https://github.com/googleapis/google-api-php-client/tree/v2.18.4" + }, + "install-path": "../google/apiclient" + }, + { + "name": "google/apiclient-services", + "version": "v0.421.0", + "version_normalized": "0.421.0.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-api-php-client-services.git", + "reference": "d84e7301a52405677807564dab6b1a112dfd03bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d84e7301a52405677807564dab6b1a112dfd03bd", + "reference": "d84e7301a52405677807564dab6b1a112dfd03bd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "time": "2025-11-23T01:06:22+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "autoload.php" + ], + "psr-4": { + "Google\\Service\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Client library for Google APIs", + "homepage": "http://developers.google.com/api-client-library/php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/google-api-php-client-services/issues", + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.421.0" + }, + "install-path": "../google/apiclient-services" + }, + { + "name": "google/auth", + "version": "v1.49.0", + "version_normalized": "1.49.0.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-auth-library-php.git", + "reference": "68e3d88cb59a49f713e3db25d4f6bb3cc0b70764" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/68e3d88cb59a49f713e3db25d4f6bb3cc0b70764", + "reference": "68e3d88cb59a49f713e3db25d4f6bb3cc0b70764", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "^6.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.4.5", + "php": "^8.1", + "psr/cache": "^2.0||^3.0", + "psr/http-message": "^1.1||^2.0", + "psr/log": "^3.0" + }, + "require-dev": { + "guzzlehttp/promises": "^2.0", + "kelvinmo/simplejwt": "0.7.1", + "phpseclib/phpseclib": "^3.0.35", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^4.0", + "symfony/filesystem": "^6.3||^7.3", + "symfony/process": "^6.0||^7.0", + "webmozart/assert": "^1.11" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." + }, + "time": "2025-11-06T21:27:55+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Google\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Auth Library for PHP", + "homepage": "https://github.com/google/google-auth-library-php", + "keywords": [ + "Authentication", + "google", + "oauth2" + ], + "support": { + "docs": "https://cloud.google.com/php/docs/reference/auth/latest", + "issues": "https://github.com/googleapis/google-auth-library-php/issues", + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.49.0" + }, + "install-path": "../google/auth" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "version_normalized": "7.10.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "time": "2025-08-23T22:36:01+00:00", + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "install-path": "../guzzlehttp/guzzle" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "time": "2025-08-22T14:34:08+00:00", + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "install-path": "../guzzlehttp/promises" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "version_normalized": "2.8.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "time": "2025-08-23T21:21:41+00:00", + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "install-path": "../guzzlehttp/psr7" + }, + { + "name": "html2text/html2text", + "version": "dev-master", + "version_normalized": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/mtibben/html2text.git", + "reference": "3b443cbe302b52eb5806a21a9dbd79524203970a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mtibben/html2text/zipball/3b443cbe302b52eb5806a21a9dbd79524203970a", + "reference": "3b443cbe302b52eb5806a21a9dbd79524203970a", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "~4|^9.0" + }, + "suggest": { + "ext-mbstring": "For best performance", + "symfony/polyfill-mbstring": "If you can't install ext-mbstring" + }, + "time": "2024-08-20T02:43:29+00:00", + "default-branch": true, + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Html2Text\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Converts HTML to formatted plain text", + "support": { + "issues": "https://github.com/mtibben/html2text/issues", + "source": "https://github.com/mtibben/html2text/tree/4.3.2" + }, + "install-path": "../html2text/html2text" + }, + { + "name": "ifsnop/mysqldump-php", + "version": "v2.12", + "version_normalized": "2.12.0.0", + "source": { + "type": "git", + "url": "https://github.com/ifsnop/mysqldump-php.git", + "reference": "2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ifsnop/mysqldump-php/zipball/2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3", + "reference": "2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.8.36", + "squizlabs/php_codesniffer": "1.*" + }, + "time": "2023-04-12T07:43:14+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Ifsnop\\": "src/Ifsnop/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Diego Torres", + "homepage": "https://github.com/ifsnop", + "role": "Developer" + } + ], + "description": "PHP version of mysqldump cli that comes with MySQL", + "homepage": "https://github.com/ifsnop/mysqldump-php", + "keywords": [ + "PHP7", + "database", + "hhvm", + "mariadb", + "mysql", + "mysql-backup", + "mysqldump", + "pdo", + "php", + "php5", + "sql" + ], + "support": { + "issues": "https://github.com/ifsnop/mysqldump-php/issues", + "source": "https://github.com/ifsnop/mysqldump-php/tree/v2.12" + }, + "install-path": "../ifsnop/mysqldump-php" + }, + { + "name": "illuminate/collections", + "version": "v8.83.27", + "version_normalized": "8.83.27.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "705a4e1ef93cd492c45b9b3e7911cccc990a07f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/705a4e1ef93cd492c45b9b3e7911cccc990a07f4", + "reference": "705a4e1ef93cd492c45b9b3e7911cccc990a07f4", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^5.4)." + }, + "time": "2022-06-23T15:29:49+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/collections" + }, + { + "name": "illuminate/contracts", + "version": "v8.83.27", + "version_normalized": "8.83.27.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "5e0fd287a1b22a6b346a9f7cd484d8cf0234585d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/5e0fd287a1b22a6b346a9f7cd484d8cf0234585d", + "reference": "5e0fd287a1b22a6b346a9f7cd484d8cf0234585d", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "time": "2022-01-13T14:47:47+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/contracts" + }, + { + "name": "illuminate/macroable", + "version": "v8.83.27", + "version_normalized": "8.83.27.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "aed81891a6e046fdee72edd497f822190f61c162" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/aed81891a6e046fdee72edd497f822190f61c162", + "reference": "aed81891a6e046fdee72edd497f822190f61c162", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "time": "2021-11-16T13:57:03+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/macroable" + }, + { + "name": "jakeasmith/http_build_url", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/jakeasmith/http_build_url.git", + "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jakeasmith/http_build_url/zipball/93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "shasum": "" + }, + "time": "2017-05-01T15:36:40+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/http_build_url.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jake A. Smith", + "email": "theman@jakeasmith.com" + } + ], + "description": "Provides functionality for http_build_url() to environments without pecl_http.", + "support": { + "issues": "https://github.com/jakeasmith/http_build_url/issues", + "source": "https://github.com/jakeasmith/http_build_url" + }, + "install-path": "../jakeasmith/http_build_url" + }, + { + "name": "league/csv", + "version": "9.27.1", + "version_normalized": "9.27.1.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/26de738b8fccf785397d05ee2fc07b6cd8749797", + "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1.2" + }, + "require-dev": { + "ext-dom": "*", + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^3.75.0", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^1.12.27", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^10.5.16 || ^11.5.22 || ^12.3.6", + "symfony/var-dumper": "^6.4.8 || ^7.3.0" + }, + "suggest": { + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters", + "ext-mysqli": "Requiered to use the package with the MySQLi extension", + "ext-pdo": "Required to use the package with the PDO extension", + "ext-pgsql": "Requiered to use the package with the PgSQL extension", + "ext-sqlite3": "Required to use the package with the SQLite3 extension" + }, + "time": "2025-10-25T08:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "League\\Csv\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "CSV data manipulation made easy in PHP", + "homepage": "https://csv.thephpleague.com", + "keywords": [ + "convert", + "csv", + "export", + "filter", + "import", + "read", + "transform", + "write" + ], + "support": { + "docs": "https://csv.thephpleague.com", + "issues": "https://github.com/thephpleague/csv/issues", + "rss": "https://github.com/thephpleague/csv/releases.atom", + "source": "https://github.com/thephpleague/csv" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "install-path": "../league/csv" + }, + { + "name": "league/event", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "062ebb450efbe9a09bc2478e89b7c933875b0935" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/062ebb450efbe9a09bc2478e89b7c933875b0935", + "reference": "062ebb450efbe9a09bc2478e89b7c933875b0935", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "^2.2" + }, + "time": "2025-03-14T19:51:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "support": { + "issues": "https://github.com/thephpleague/event/issues", + "source": "https://github.com/thephpleague/event/tree/2.3.0" + }, + "install-path": "../league/event" + }, + { + "name": "league/flysystem", + "version": "1.1.10", + "version_normalized": "1.1.10.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "time": "2022-10-04T09:16:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "install-path": "../league/flysystem" + }, + { + "name": "league/flysystem-aws-s3-v3", + "version": "1.0.30", + "version_normalized": "1.0.30.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", + "reference": "af286f291ebab6877bac0c359c6c2cb017eb061d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/af286f291ebab6877bac0c359c6c2cb017eb061d", + "reference": "af286f291ebab6877bac0c359c6c2cb017eb061d", + "shasum": "" + }, + "require": { + "aws/aws-sdk-php": "^3.20.0", + "league/flysystem": "^1.0.40", + "php": ">=5.5.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "~1.0.1", + "phpspec/phpspec": "^2.0.0" + }, + "time": "2022-07-02T13:51:38+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Flysystem\\AwsS3v3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Flysystem adapter for the AWS S3 SDK v3.x", + "support": { + "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/1.0.30" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "install-path": "../league/flysystem-aws-s3-v3" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "version_normalized": "1.16.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "time": "2024-09-21T08:32:55+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "install-path": "../league/mime-type-detection" + }, + { + "name": "league/oauth2-client", + "version": "2.9.0", + "version_normalized": "2.9.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "php": "^7.1 || >=8.0.0 <8.6.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.11" + }, + "time": "2025-11-25T22:17:17+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.9.0" + }, + "install-path": "../league/oauth2-client" + }, + { + "name": "league/oauth2-google", + "version": "2.2.0", + "version_normalized": "2.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-google.git", + "reference": "c0faed29ec6d665ce3234e01f62029516cee4c02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/c0faed29ec6d665ce3234e01f62029516cee4c02", + "reference": "c0faed29ec6d665ce3234e01f62029516cee4c02", + "shasum": "" + }, + "require": { + "league/oauth2-client": "^2.0" + }, + "require-dev": { + "eloquent/phony": "^0.14.6", + "phpunit/phpunit": "^5.7", + "satooshi/php-coveralls": "^2.0", + "squizlabs/php_codesniffer": "^2.0" + }, + "time": "2018-03-19T17:28:55+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com", + "homepage": "http://shadowhand.me" + } + ], + "description": "Google OAuth 2.0 Client Provider for The PHP League OAuth2-Client", + "keywords": [ + "Authentication", + "authorization", + "client", + "google", + "oauth", + "oauth2" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-google/issues", + "source": "https://github.com/thephpleague/oauth2-google/tree/master" + }, + "install-path": "../league/oauth2-google" + }, + { + "name": "masterminds/html5", + "version": "2.10.0", + "version_normalized": "2.10.0.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fcf91eb64359852f00d921887b219479b4f21251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "time": "2025-07-25T09:04:22+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" + }, + "install-path": "../masterminds/html5" + }, + { + "name": "moneyphp/money", + "version": "v3.3.3", + "version_normalized": "3.3.3.0", + "source": { + "type": "git", + "url": "https://github.com/moneyphp/money.git", + "reference": "0dc40e3791c67e8793e3aa13fead8cf4661ec9cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/moneyphp/money/zipball/0dc40e3791c67e8793e3aa13fead8cf4661ec9cd", + "reference": "0dc40e3791c67e8793e3aa13fead8cf4661ec9cd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.6" + }, + "require-dev": { + "cache/taggable-cache": "^0.4.0", + "doctrine/instantiator": "^1.0.5", + "ext-bcmath": "*", + "ext-gmp": "*", + "ext-intl": "*", + "florianv/exchanger": "^1.0", + "florianv/swap": "^3.0", + "friends-of-phpspec/phpspec-code-coverage": "^3.1.1 || ^4.3", + "moneyphp/iso-currencies": "^3.2.1", + "php-http/message": "^1.4", + "php-http/mock-client": "^1.0.0", + "phpspec/phpspec": "^3.4.3", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.18 || ^8.5", + "psr/cache": "^1.0", + "symfony/phpunit-bridge": "^4" + }, + "suggest": { + "ext-bcmath": "Calculate without integer limits", + "ext-gmp": "Calculate without integer limits", + "ext-intl": "Format Money objects with intl", + "florianv/exchanger": "Exchange rates library for PHP", + "florianv/swap": "Exchange rates library for PHP", + "psr/cache-implementation": "Used for Currency caching" + }, + "time": "2022-09-21T07:43:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Money\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Verraes", + "email": "mathias@verraes.net", + "homepage": "http://verraes.net" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Frederik Bosch", + "email": "f.bosch@genkgo.nl" + } + ], + "description": "PHP implementation of Fowler's Money pattern", + "homepage": "http://moneyphp.org", + "keywords": [ + "Value Object", + "money", + "vo" + ], + "support": { + "issues": "https://github.com/moneyphp/money/issues", + "source": "https://github.com/moneyphp/money/tree/v3.3.3" + }, + "install-path": "../moneyphp/money" + }, + { + "name": "monolog/monolog", + "version": "3.9.0", + "version_normalized": "3.9.0.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "time": "2025-03-24T10:02:05+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "install-path": "../monolog/monolog" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.8.0", + "version_normalized": "2.8.0.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" + }, + "time": "2024-09-04T18:46:31+00:00", + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/JmesPath.php" + ], + "psr-4": { + "JmesPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" + }, + "install-path": "../mtdowling/jmespath.php" + }, + { + "name": "mustache/mustache", + "version": "v2.14.2", + "version_normalized": "2.14.2.0", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/mustache.php.git", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.11", + "phpunit/phpunit": "~3.7|~4.0|~5.0" + }, + "time": "2022-08-23T13:07:01+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "issues": "https://github.com/bobthecow/mustache.php/issues", + "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" + }, + "install-path": "../mustache/mustache" + }, + { + "name": "nesbot/carbon", + "version": "3.10.3", + "version_normalized": "3.10.3.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" + }, + "time": "2025-09-06T13:39:36+00:00", + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "install-path": "../nesbot/carbon" + }, + { + "name": "omnipay/common", + "version": "v3.4.0", + "version_normalized": "3.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/omnipay-common.git", + "reference": "83552de28815c5e46f66360c4d52c3a82a7d5efc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/omnipay-common/zipball/83552de28815c5e46f66360c4d52c3a82a7d5efc", + "reference": "83552de28815c5e46f66360c4d52c3a82a7d5efc", + "shasum": "" + }, + "require": { + "moneyphp/money": "^3.1|^4.0.3", + "php": "^7.2|^8", + "php-http/client-implementation": "^1", + "php-http/discovery": "^1.14", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.1", + "symfony/http-foundation": "^2.1|^3|^4|^5|^6|^7" + }, + "require-dev": { + "http-interop/http-factory-guzzle": "^1.1", + "omnipay/tests": "^4.1", + "php-http/guzzle7-adapter": "^1", + "php-http/mock-client": "^1.6", + "squizlabs/php_codesniffer": "^3.8.1" + }, + "suggest": { + "league/omnipay": "The default Omnipay package provides a default HTTP Adapter." + }, + "time": "2025-03-03T09:25:00+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Omnipay\\Common\\": "src/Common" + }, + "classmap": [ + "src/Omnipay.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrian Macneil", + "email": "adrian@adrianmacneil.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + }, + { + "name": "Jason Judge", + "email": "jason.judge@consil.co.uk" + }, + { + "name": "Del" + }, + { + "name": "Omnipay Contributors", + "homepage": "https://github.com/thephpleague/omnipay-common/contributors" + } + ], + "description": "Common components for Omnipay payment processing library", + "homepage": "https://github.com/thephpleague/omnipay-common", + "keywords": [ + "gateway", + "merchant", + "omnipay", + "pay", + "payment", + "purchase" + ], + "support": { + "issues": "https://github.com/thephpleague/omnipay-common/issues", + "source": "https://github.com/thephpleague/omnipay-common/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "install-path": "../omnipay/common" + }, + { + "name": "omnipay/paypal", + "version": "v3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/omnipay-paypal.git", + "reference": "519db61b32ff0c1e56cbec94762b970ee9674f65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/omnipay-paypal/zipball/519db61b32ff0c1e56cbec94762b970ee9674f65", + "reference": "519db61b32ff0c1e56cbec94762b970ee9674f65", + "shasum": "" + }, + "require": { + "omnipay/common": "^3" + }, + "require-dev": { + "omnipay/tests": "^3", + "phpro/grumphp": "^0.14", + "squizlabs/php_codesniffer": "^3" + }, + "time": "2018-05-15T10:35:58+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Omnipay\\PayPal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrian Macneil", + "email": "adrian@adrianmacneil.com" + }, + { + "name": "Omnipay Contributors", + "homepage": "https://github.com/thephpleague/omnipay-paypal/contributors" + } + ], + "description": "PayPal gateway for Omnipay payment processing library", + "homepage": "https://github.com/thephpleague/omnipay-paypal", + "keywords": [ + "gateway", + "merchant", + "omnipay", + "pay", + "payment", + "paypal", + "purchase" + ], + "support": { + "issues": "https://github.com/thephpleague/omnipay-paypal/issues", + "source": "https://github.com/thephpleague/omnipay-paypal/tree/v3.0.2" + }, + "install-path": "../omnipay/paypal" + }, + { + "name": "owasp/phprbac", + "version": "2.0.0", + "version_normalized": "2.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/OWASP/rbac.git", + "reference": "1af904f69dcfc61f1a27c90fe8de2bfd574c1a71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OWASP/rbac/zipball/1af904f69dcfc61f1a27c90fe8de2bfd574c1a71", + "reference": "1af904f69dcfc61f1a27c90fe8de2bfd574c1a71", + "shasum": "" + }, + "time": "2014-03-14T13:39:52+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "PhpRbac": "PhpRbac/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC-BY-SA-3.0" + ], + "authors": [ + { + "name": "AbiusX", + "email": "me@abiusx.com", + "homepage": "http://abiusx.com/", + "role": "Lead Developer" + }, + { + "name": "Jesse Burns", + "email": "jesse.burns@alliancecms.com", + "homepage": "http://www.jbwebware.com", + "role": "Developer" + } + ], + "description": "PHP-RBAC is the de-facto authorization library for PHP. It provides developers with NIST Level 2 Standard Role Based Access Control and more, in the fastest implementation yet.", + "homepage": "http://phprbac.net/", + "keywords": [ + "owasp", + "rbac", + "security" + ], + "support": { + "issues": "https://github.com/OWASP/rbac/issues", + "source": "https://github.com/OWASP/rbac/tree/2.0.0" + }, + "install-path": "../owasp/phprbac" + }, + { + "name": "pancakeapp/dompdf", + "version": "dev-master", + "version_normalized": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/pancakeapp/dompdf.git", + "reference": "271714832a1e3f13b7ad6b519649387cfacb9a9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pancakeapp/dompdf/zipball/271714832a1e3f13b7ad6b519649387cfacb9a9d", + "reference": "271714832a1e3f13b7ad6b519649387cfacb9a9d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "phenx/php-font-lib": ">=0.5.4 <1.0.0", + "phenx/php-svg-lib": ">=0.3.3 <1.0.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "time": "2023-01-24T20:02:20+00:00", + "default-branch": true, + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "autoload-dev": { + "psr-4": { + "Dompdf\\Tests\\": "tests/" + } + }, + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "source": "https://github.com/pancakeapp/dompdf/tree/master" + }, + "install-path": "../pancakeapp/dompdf" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "version_normalized": "3.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "time": "2025-09-24T15:06:41+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "install-path": "../paragonie/constant_time_encoding" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "version_normalized": "9.99.100.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "time": "2020-10-15T08:29:30+00:00", + "type": "library", + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "install-path": "../paragonie/random_compat" + }, + { + "name": "payeezy/payeezy-php", + "version": "dev-master", + "version_normalized": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/payeezy/payeezy-php.git", + "reference": "2bbc3bec72a56c16fb6652900f9804740cbea4c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/payeezy/payeezy-php/zipball/2bbc3bec72a56c16fb6652900f9804740cbea4c9", + "reference": "2bbc3bec72a56c16fb6652900f9804740cbea4c9", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "time": "2016-07-26T20:54:48+00:00", + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Payeezy_": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "payeezy and contributors", + "homepage": "https://github.com/payeezy/payeezy-php/graphs/contributors" + } + ], + "description": "Payeezy PHP Library", + "homepage": "https://developer.payeezy.com/", + "keywords": [ + "api", + "payeezy", + "payment processing" + ], + "support": { + "source": "https://github.com/payeezy/payeezy-php/tree/master" + }, + "install-path": "../payeezy/payeezy-php" + }, + { + "name": "pear/math_biginteger", + "version": "v1.0.3", + "version_normalized": "1.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/pear/Math_BigInteger.git", + "reference": "33d4357543037a458fad3e8c837a01b93104e592" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Math_BigInteger/zipball/33d4357543037a458fad3e8c837a01b93104e592", + "reference": "33d4357543037a458fad3e8c837a01b93104e592", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": ">=4.2.0" + }, + "suggest": { + "ext-bcmath": "Allows using the BCMath extension internally for computation. Faster than native implementation.", + "ext-gmp": "Allows using the GNU Multiple Precision extension internally for computation. If you are doing a lot of computation this is the recommended extension." + }, + "time": "2016-04-12T05:46:52+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Math_": "./" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net" + } + ], + "description": "Pure-PHP arbitrary precission integer arithmetic library. If GMP or BCMath are available they are used.", + "homepage": "https://github.com/pear/Math_BigInteger", + "keywords": [ + "arbitrary", + "bcmath", + "gmp", + "integer", + "precision" + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Math_BigInteger", + "source": "https://github.com/pear/Math_BigInteger" + }, + "install-path": "../pear/math_biginteger" + }, + { + "name": "phenx/php-font-lib", + "version": "0.5.6", + "version_normalized": "0.5.6.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "a1681e9793040740a405ac5b189275059e2a9863" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a1681e9793040740a405ac5b189275059e2a9863", + "reference": "a1681e9793040740a405ac5b189275059e2a9863", + "shasum": "" + }, + "require": { + "ext-mbstring": "*" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" + }, + "time": "2024-01-29T14:45:26+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.6" + }, + "install-path": "../phenx/php-font-lib" + }, + { + "name": "phenx/php-svg-lib", + "version": "0.5.4", + "version_normalized": "0.5.4.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + }, + "time": "2024-04-08T12:52:34+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.4" + }, + "install-path": "../phenx/php-svg-lib" + }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "version_normalized": "1.20.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "time": "2024-10-02T11:20:13+00:00", + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "install-path": "../php-http/discovery" + }, + { + "name": "php-http/guzzle7-adapter", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle7-adapter.git", + "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/03a415fde709c2f25539790fecf4d9a31bc3d0eb", + "reference": "03a415fde709c2f25539790fecf4d9a31bc3d0eb", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.0", + "php": "^7.3 | ^8.0", + "php-http/httplug": "^2.0", + "psr/http-client": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "php-http/client-integration-tests": "^3.0", + "php-http/message-factory": "^1.1", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^8.0|^9.3" + }, + "time": "2024-11-26T11:14:36+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "Guzzle 7 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "support": { + "issues": "https://github.com/php-http/guzzle7-adapter/issues", + "source": "https://github.com/php-http/guzzle7-adapter/tree/1.1.0" + }, + "install-path": "../php-http/guzzle7-adapter" + }, + { + "name": "php-http/httplug", + "version": "2.4.1", + "version_normalized": "2.4.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "time": "2024-09-23T11:39:58+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.1" + }, + "install-path": "../php-http/httplug" + }, + { + "name": "php-http/message", + "version": "1.16.2", + "version_normalized": "1.16.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "time": "2024-10-02T11:34:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.2" + }, + "install-path": "../php-http/message" + }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "time": "2023-04-14T14:16:17+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "install-path": "../php-http/message-factory" + }, + { + "name": "php-http/promise", + "version": "1.3.1", + "version_normalized": "1.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + }, + "time": "2024-03-15T13:55:21+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.1" + }, + "install-path": "../php-http/promise" + }, + { + "name": "phpseclib/bcmath_compat", + "version": "2.0.3", + "version_normalized": "2.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/bcmath_compat.git", + "reference": "ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/bcmath_compat/zipball/ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a", + "reference": "ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a", + "shasum": "" + }, + "require": { + "phpseclib/phpseclib": "^3.0" + }, + "provide": { + "ext-bcmath": "8.1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", + "squizlabs/php_codesniffer": "^3.0" + }, + "suggest": { + "ext-gmp": "Will enable faster math operations" + }, + "time": "2024-06-06T14:17:54+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "lib/bcmath.php" + ], + "psr-4": { + "bcmath_compat\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "homepage": "http://phpseclib.sourceforge.net" + } + ], + "description": "PHP 5.x-8.x polyfill for bcmath extension", + "keywords": [ + "BigInteger", + "bcmath", + "bigdecimal", + "math", + "polyfill" + ], + "support": { + "email": "terrafrost@php.net", + "issues": "https://github.com/phpseclib/bcmath_compat/issues", + "source": "https://github.com/phpseclib/bcmath_compat" + }, + "install-path": "../phpseclib/bcmath_compat" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.47", + "version_normalized": "3.0.47.0", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/9d6ca36a6c2dd434765b1071b2644a1c683b385d", + "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "time": "2025-10-06T01:07:24+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.47" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "install-path": "../phpseclib/phpseclib" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "time": "2021-02-03T23:26:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "install-path": "../psr/cache" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "time": "2022-11-25T14:36:26+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "install-path": "../psr/clock" + }, + { + "name": "psr/container", + "version": "1.1.2", + "version_normalized": "1.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "time": "2021-11-05T16:50:12+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "install-path": "../psr/container" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "version_normalized": "1.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "time": "2023-09-23T14:17:50+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "install-path": "../psr/http-client" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "time": "2024-04-15T12:06:14+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "install-path": "../psr/http-factory" + }, + { + "name": "psr/http-message", + "version": "2.0", + "version_normalized": "2.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "time": "2023-04-04T09:54:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "install-path": "../psr/http-message" + }, + { + "name": "psr/log", + "version": "3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "time": "2024-09-11T13:17:53+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "install-path": "../psr/log" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-10-23T01:57:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "install-path": "../psr/simple-cache" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "time": "2019-03-08T08:55:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "install-path": "../ralouphie/getallheaders" + }, + { + "name": "riverline/multipart-parser", + "version": "dev-master", + "version_normalized": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Riverline/multipart-parser.git", + "reference": "c9498351b43e19ce6f9410b9c042d59a20ec9fe0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Riverline/multipart-parser/zipball/c9498351b43e19ce6f9410b9c042d59a20ec9fe0", + "reference": "c9498351b43e19ce6f9410b9c042d59a20ec9fe0", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.0" + }, + "require-dev": { + "laminas/laminas-diactoros": "*", + "phpunit/phpunit": "*", + "psr/http-message": "*", + "symfony/psr-http-message-bridge": "*" + }, + "time": "2025-04-29T14:26:43+00:00", + "default-branch": true, + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Riverline\\MultiPartParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Romain Cambien", + "email": "romain@cambien.net" + }, + { + "name": "Riverline", + "homepage": "http://www.riverline.fr" + } + ], + "description": "One class library to parse multipart content with encoding and charset support.", + "keywords": [ + "http", + "multipart", + "parser" + ], + "support": { + "issues": "https://github.com/Riverline/multipart-parser/issues", + "source": "https://github.com/Riverline/multipart-parser/tree/master" + }, + "install-path": "../riverline/multipart-parser" + }, + { + "name": "sabberworm/php-css-parser", + "version": "v8.6.0", + "version_normalized": "8.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d2fb94a9641be84d79c7548c6d39bbebba6e9a70", + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=5.6.20" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.27" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "time": "2024-07-01T07:33:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.6.0" + }, + "install-path": "../sabberworm/php-css-parser" + }, + { + "name": "spatie/once", + "version": "2.2.1", + "version_normalized": "2.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/once.git", + "reference": "e6c13ae474a7d4b30975ef6a502a593874ac12d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/once/zipball/e6c13ae474a7d4b30975ef6a502a593874ac12d2", + "reference": "e6c13ae474a7d4b30975ef6a502a593874ac12d2", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0" + }, + "time": "2020-10-29T18:22:10+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Spatie\\Once\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A magic memoization function", + "homepage": "https://github.com/spatie/once", + "keywords": [ + "cache", + "callable", + "memozation", + "once", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/once/issues", + "source": "https://github.com/spatie/once/tree/2.2.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "install-path": "../spatie/once" + }, + { + "name": "stripe/stripe-php", + "version": "v7.128.0", + "version_normalized": "7.128.0.0", + "source": { + "type": "git", + "url": "https://github.com/stripe/stripe-php.git", + "reference": "c704949c49b72985c76cc61063aa26fefbd2724e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/c704949c49b72985c76cc61063aa26fefbd2724e", + "reference": "c704949c49b72985c76cc61063aa26fefbd2724e", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.5.0", + "phpstan/phpstan": "^1.2", + "phpunit/phpunit": "^5.7 || ^9.0", + "squizlabs/php_codesniffer": "^3.3" + }, + "time": "2022-05-05T17:18:02+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Stripe\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "description": "Stripe PHP Library", + "homepage": "https://stripe.com/", + "keywords": [ + "api", + "payment processing", + "stripe" + ], + "support": { + "issues": "https://github.com/stripe/stripe-php/issues", + "source": "https://github.com/stripe/stripe-php/tree/v7.128.0" + }, + "install-path": "../stripe/stripe-php" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "version_normalized": "6.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "time": "2021-10-18T15:26:12+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "abandoned": "symfony/mailer", + "install-path": "../swiftmailer/swiftmailer" + }, + { + "name": "symfony/clock", + "version": "v7.3.0", + "version_normalized": "7.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "time": "2024-09-25T14:21:43+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/clock" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "version_normalized": "3.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "time": "2024-09-25T14:21:43+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/deprecation-contracts" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.50", + "version_normalized": "5.4.50.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1a0706e8b8041046052ea2695eb8aeee04f97609", + "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "time": "2025-11-03T12:58:48+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.50" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/http-foundation" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2024-09-09T11:45:10+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-ctype" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/5f3b930437ae03ae5dff61269024d8ea1b3774aa", + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "time": "2024-09-17T14:58:18+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-iconv" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2024-09-10T14:38:51+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-intl-idn" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2024-09-09T11:45:10+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-intl-normalizer" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2024-12-23T08:48:59+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-mbstring" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.31.0", + "version_normalized": "1.31.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "time": "2024-09-09T11:45:10+00:00", + "type": "metapackage", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": null + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "time": "2025-01-02T08:10:11+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php80" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "time": "2025-07-08T02:45:35+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php83" + }, + { + "name": "symfony/translation", + "version": "v7.3.4", + "version_normalized": "7.3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "time": "2025-09-07T11:39:36+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/translation" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.1", + "version_normalized": "3.6.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "time": "2025-07-15T13:41:35+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/translation-contracts" + }, + { + "name": "symfony/var-dumper", + "version": "v4.4.47", + "version_normalized": "4.4.47.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "1069c7a3fca74578022fab6f81643248d02f8e63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63", + "reference": "1069c7a3fca74578022fab6f81643248d02f8e63", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^1.43|^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "time": "2022-10-03T15:15:11+00:00", + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v4.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/var-dumper" + } + ], "dev": true, "dev-package-names": [] } diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 87845b6..adfb5c6 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,21 +3,837 @@ 'name' => 'bendtstudio/pancake', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '871e5864a5c9649efb74b8e4572ad587614579bd', + 'reference' => 'af3c23cb6e9b372923876e131ca0ec350be4ffb9', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => true, ), 'versions' => array( + 'aws/aws-crt-php' => array( + 'pretty_version' => 'v1.2.7', + 'version' => '1.2.7.0', + 'reference' => 'd71d9906c7bb63a28295447ba12e74723bd3730e', + 'type' => 'library', + 'install_path' => __DIR__ . '/../aws/aws-crt-php', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'aws/aws-sdk-php' => array( + 'pretty_version' => '3.363.2', + 'version' => '3.363.2.0', + 'reference' => 'f8b5f125248daa8942144b4771c041a63ec41900', + 'type' => 'library', + 'install_path' => __DIR__ . '/../aws/aws-sdk-php', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'bendtstudio/pancake' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '871e5864a5c9649efb74b8e4572ad587614579bd', + 'reference' => 'af3c23cb6e9b372923876e131ca0ec350be4ffb9', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), + 'brunodebarros/fix-php-post-input' => array( + 'pretty_version' => 'v1.3.0', + 'version' => '1.3.0.0', + 'reference' => '088544a82e94e95f41e8f7c9b9cb7061f8d0c7fc', + 'type' => 'library', + 'install_path' => __DIR__ . '/../brunodebarros/fix-php-post-input', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'carbonphp/carbon-doctrine-types' => array( + 'pretty_version' => '3.2.0', + 'version' => '3.2.0.0', + 'reference' => '18ba5ddfec8976260ead6e866180bd5d2f71aa1d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../carbonphp/carbon-doctrine-types', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'clue/stream-filter' => array( + 'pretty_version' => 'v1.7.0', + 'version' => '1.7.0.0', + 'reference' => '049509fef80032cb3f051595029ab75b49a3c2f7', + 'type' => 'library', + 'install_path' => __DIR__ . '/../clue/stream-filter', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'composer/ca-bundle' => array( + 'pretty_version' => '1.5.9', + 'version' => '1.5.9.0', + 'reference' => '1905981ee626e6f852448b7aaa978f8666c5bc54', + 'type' => 'library', + 'install_path' => __DIR__ . '/./ca-bundle', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'doctrine/deprecations' => array( + 'pretty_version' => '1.1.5', + 'version' => '1.1.5.0', + 'reference' => '459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38', + 'type' => 'library', + 'install_path' => __DIR__ . '/../doctrine/deprecations', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'doctrine/lexer' => array( + 'pretty_version' => '2.1.1', + 'version' => '2.1.1.0', + 'reference' => '861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6', + 'type' => 'library', + 'install_path' => __DIR__ . '/../doctrine/lexer', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'egulias/email-validator' => array( + 'pretty_version' => '3.2.6', + 'version' => '3.2.6.0', + 'reference' => 'e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7', + 'type' => 'library', + 'install_path' => __DIR__ . '/../egulias/email-validator', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'erusev/parsedown' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => '0b274ac959624e6c6d647e9c9b6c2d20da242004', + 'type' => 'library', + 'install_path' => __DIR__ . '/../erusev/parsedown', + 'aliases' => array( + 0 => '9999999-dev', + ), + 'dev_requirement' => false, + ), + 'ezyang/htmlpurifier' => array( + 'pretty_version' => 'v4.19.0', + 'version' => '4.19.0.0', + 'reference' => 'b287d2a16aceffbf6e0295559b39662612b77fcf', + 'type' => 'library', + 'install_path' => __DIR__ . '/../ezyang/htmlpurifier', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'firebase/php-jwt' => array( + 'pretty_version' => 'v6.11.1', + 'version' => '6.11.1.0', + 'reference' => 'd1e91ecf8c598d073d0995afa8cd5c75c6e19e66', + 'type' => 'library', + 'install_path' => __DIR__ . '/../firebase/php-jwt', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'google/apiclient' => array( + 'pretty_version' => 'v2.18.4', + 'version' => '2.18.4.0', + 'reference' => '5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b', + 'type' => 'library', + 'install_path' => __DIR__ . '/../google/apiclient', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'google/apiclient-services' => array( + 'pretty_version' => 'v0.421.0', + 'version' => '0.421.0.0', + 'reference' => 'd84e7301a52405677807564dab6b1a112dfd03bd', + 'type' => 'library', + 'install_path' => __DIR__ . '/../google/apiclient-services', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'google/auth' => array( + 'pretty_version' => 'v1.49.0', + 'version' => '1.49.0.0', + 'reference' => '68e3d88cb59a49f713e3db25d4f6bb3cc0b70764', + 'type' => 'library', + 'install_path' => __DIR__ . '/../google/auth', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'guzzlehttp/guzzle' => array( + 'pretty_version' => '7.10.0', + 'version' => '7.10.0.0', + 'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4', + 'type' => 'library', + 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'guzzlehttp/promises' => array( + 'pretty_version' => '2.3.0', + 'version' => '2.3.0.0', + 'reference' => '481557b130ef3790cf82b713667b43030dc9c957', + 'type' => 'library', + 'install_path' => __DIR__ . '/../guzzlehttp/promises', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'guzzlehttp/psr7' => array( + 'pretty_version' => '2.8.0', + 'version' => '2.8.0.0', + 'reference' => '21dc724a0583619cd1652f673303492272778051', + 'type' => 'library', + 'install_path' => __DIR__ . '/../guzzlehttp/psr7', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'html2text/html2text' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => '3b443cbe302b52eb5806a21a9dbd79524203970a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../html2text/html2text', + 'aliases' => array( + 0 => '9999999-dev', + ), + 'dev_requirement' => false, + ), + 'ifsnop/mysqldump-php' => array( + 'pretty_version' => 'v2.12', + 'version' => '2.12.0.0', + 'reference' => '2d3a43fc0c49f23bf7dee392b0dd1f8c799f89d3', + 'type' => 'library', + 'install_path' => __DIR__ . '/../ifsnop/mysqldump-php', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/collections' => array( + 'pretty_version' => 'v8.83.27', + 'version' => '8.83.27.0', + 'reference' => '705a4e1ef93cd492c45b9b3e7911cccc990a07f4', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/collections', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/contracts' => array( + 'pretty_version' => 'v8.83.27', + 'version' => '8.83.27.0', + 'reference' => '5e0fd287a1b22a6b346a9f7cd484d8cf0234585d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/macroable' => array( + 'pretty_version' => 'v8.83.27', + 'version' => '8.83.27.0', + 'reference' => 'aed81891a6e046fdee72edd497f822190f61c162', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/macroable', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'jakeasmith/http_build_url' => array( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'reference' => '93c273e77cb1edead0cf8bcf8cd2003428e74e37', + 'type' => 'library', + 'install_path' => __DIR__ . '/../jakeasmith/http_build_url', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'league/csv' => array( + 'pretty_version' => '9.27.1', + 'version' => '9.27.1.0', + 'reference' => '26de738b8fccf785397d05ee2fc07b6cd8749797', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/csv', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'league/event' => array( + 'pretty_version' => '2.3.0', + 'version' => '2.3.0.0', + 'reference' => '062ebb450efbe9a09bc2478e89b7c933875b0935', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/event', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'league/flysystem' => array( + 'pretty_version' => '1.1.10', + 'version' => '1.1.10.0', + 'reference' => '3239285c825c152bcc315fe0e87d6b55f5972ed1', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/flysystem', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'league/flysystem-aws-s3-v3' => array( + 'pretty_version' => '1.0.30', + 'version' => '1.0.30.0', + 'reference' => 'af286f291ebab6877bac0c359c6c2cb017eb061d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/flysystem-aws-s3-v3', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'league/mime-type-detection' => array( + 'pretty_version' => '1.16.0', + 'version' => '1.16.0.0', + 'reference' => '2d6702ff215bf922936ccc1ad31007edc76451b9', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/mime-type-detection', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'league/oauth2-client' => array( + 'pretty_version' => '2.9.0', + 'version' => '2.9.0.0', + 'reference' => '26e8c5da4f3d78cede7021e09b1330a0fc093d5e', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/oauth2-client', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'league/oauth2-google' => array( + 'pretty_version' => '2.2.0', + 'version' => '2.2.0.0', + 'reference' => 'c0faed29ec6d665ce3234e01f62029516cee4c02', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/oauth2-google', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'masterminds/html5' => array( + 'pretty_version' => '2.10.0', + 'version' => '2.10.0.0', + 'reference' => 'fcf91eb64359852f00d921887b219479b4f21251', + 'type' => 'library', + 'install_path' => __DIR__ . '/../masterminds/html5', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'moneyphp/money' => array( + 'pretty_version' => 'v3.3.3', + 'version' => '3.3.3.0', + 'reference' => '0dc40e3791c67e8793e3aa13fead8cf4661ec9cd', + 'type' => 'library', + 'install_path' => __DIR__ . '/../moneyphp/money', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'monolog/monolog' => array( + 'pretty_version' => '3.9.0', + 'version' => '3.9.0.0', + 'reference' => '10d85740180ecba7896c87e06a166e0c95a0e3b6', + 'type' => 'library', + 'install_path' => __DIR__ . '/../monolog/monolog', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'mtdowling/jmespath.php' => array( + 'pretty_version' => '2.8.0', + 'version' => '2.8.0.0', + 'reference' => 'a2a865e05d5f420b50cc2f85bb78d565db12a6bc', + 'type' => 'library', + 'install_path' => __DIR__ . '/../mtdowling/jmespath.php', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'mustache/mustache' => array( + 'pretty_version' => 'v2.14.2', + 'version' => '2.14.2.0', + 'reference' => 'e62b7c3849d22ec55f3ec425507bf7968193a6cb', + 'type' => 'library', + 'install_path' => __DIR__ . '/../mustache/mustache', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'nesbot/carbon' => array( + 'pretty_version' => '3.10.3', + 'version' => '3.10.3.0', + 'reference' => '8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../nesbot/carbon', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'omnipay/common' => array( + 'pretty_version' => 'v3.4.0', + 'version' => '3.4.0.0', + 'reference' => '83552de28815c5e46f66360c4d52c3a82a7d5efc', + 'type' => 'library', + 'install_path' => __DIR__ . '/../omnipay/common', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'omnipay/paypal' => array( + 'pretty_version' => 'v3.0.2', + 'version' => '3.0.2.0', + 'reference' => '519db61b32ff0c1e56cbec94762b970ee9674f65', + 'type' => 'library', + 'install_path' => __DIR__ . '/../omnipay/paypal', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'owasp/phprbac' => array( + 'pretty_version' => '2.0.0', + 'version' => '2.0.0.0', + 'reference' => '1af904f69dcfc61f1a27c90fe8de2bfd574c1a71', + 'type' => 'library', + 'install_path' => __DIR__ . '/../owasp/phprbac', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'pancakeapp/dompdf' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => '271714832a1e3f13b7ad6b519649387cfacb9a9d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../pancakeapp/dompdf', + 'aliases' => array( + 0 => '9999999-dev', + ), + 'dev_requirement' => false, + ), + 'paragonie/constant_time_encoding' => array( + 'pretty_version' => 'v3.1.3', + 'version' => '3.1.3.0', + 'reference' => 'd5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77', + 'type' => 'library', + 'install_path' => __DIR__ . '/../paragonie/constant_time_encoding', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'paragonie/random_compat' => array( + 'pretty_version' => 'v9.99.100', + 'version' => '9.99.100.0', + 'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../paragonie/random_compat', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'payeezy/payeezy-php' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => '2bbc3bec72a56c16fb6652900f9804740cbea4c9', + 'type' => 'library', + 'install_path' => __DIR__ . '/../payeezy/payeezy-php', + 'aliases' => array( + 0 => '2.x-dev', + ), + 'dev_requirement' => false, + ), + 'pear/math_biginteger' => array( + 'pretty_version' => 'v1.0.3', + 'version' => '1.0.3.0', + 'reference' => '33d4357543037a458fad3e8c837a01b93104e592', + 'type' => 'library', + 'install_path' => __DIR__ . '/../pear/math_biginteger', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phenx/php-font-lib' => array( + 'pretty_version' => '0.5.6', + 'version' => '0.5.6.0', + 'reference' => 'a1681e9793040740a405ac5b189275059e2a9863', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phenx/php-font-lib', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phenx/php-svg-lib' => array( + 'pretty_version' => '0.5.4', + 'version' => '0.5.4.0', + 'reference' => '46b25da81613a9cf43c83b2a8c2c1bdab27df691', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phenx/php-svg-lib', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'php-http/async-client-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '*', + 1 => '1.0', + ), + ), + 'php-http/client-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '*', + 1 => '1.0', + ), + ), + 'php-http/discovery' => array( + 'pretty_version' => '1.20.0', + 'version' => '1.20.0.0', + 'reference' => '82fe4c73ef3363caed49ff8dd1539ba06044910d', + 'type' => 'composer-plugin', + 'install_path' => __DIR__ . '/../php-http/discovery', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'php-http/guzzle7-adapter' => array( + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'reference' => '03a415fde709c2f25539790fecf4d9a31bc3d0eb', + 'type' => 'library', + 'install_path' => __DIR__ . '/../php-http/guzzle7-adapter', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'php-http/httplug' => array( + 'pretty_version' => '2.4.1', + 'version' => '2.4.1.0', + 'reference' => '5cad731844891a4c282f3f3e1b582c46839d22f4', + 'type' => 'library', + 'install_path' => __DIR__ . '/../php-http/httplug', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'php-http/message' => array( + 'pretty_version' => '1.16.2', + 'version' => '1.16.2.0', + 'reference' => '06dd5e8562f84e641bf929bfe699ee0f5ce8080a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../php-http/message', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'php-http/message-factory' => array( + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'reference' => '4d8778e1c7d405cbb471574821c1ff5b68cc8f57', + 'type' => 'library', + 'install_path' => __DIR__ . '/../php-http/message-factory', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'php-http/message-factory-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.0', + ), + ), + 'php-http/promise' => array( + 'pretty_version' => '1.3.1', + 'version' => '1.3.1.0', + 'reference' => 'fc85b1fba37c169a69a07ef0d5a8075770cc1f83', + 'type' => 'library', + 'install_path' => __DIR__ . '/../php-http/promise', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phpseclib/bcmath_compat' => array( + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'reference' => 'ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpseclib/bcmath_compat', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phpseclib/phpseclib' => array( + 'pretty_version' => '3.0.47', + 'version' => '3.0.47.0', + 'reference' => '9d6ca36a6c2dd434765b1071b2644a1c683b385d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpseclib/phpseclib', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/cache' => array( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/cache', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/clock' => array( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'reference' => 'e41a24703d4560fd0acb709162f73b8adfc3aa0d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/clock', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/clock-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.0', + ), + ), + 'psr/container' => array( + 'pretty_version' => '1.1.2', + 'version' => '1.1.2.0', + 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/container', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-client' => array( + 'pretty_version' => '1.0.3', + 'version' => '1.0.3.0', + 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-client', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-client-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '*', + 1 => '1.0', + ), + ), + 'psr/http-factory' => array( + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-factory', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-factory-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '*', + 1 => '1.0', + ), + ), + 'psr/http-message' => array( + 'pretty_version' => '2.0', + 'version' => '2.0.0.0', + 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-message', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-message-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '*', + 1 => '1.0', + ), + ), + 'psr/log' => array( + 'pretty_version' => '3.0.2', + 'version' => '3.0.2.0', + 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/log', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/log-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '3.0.0', + ), + ), + 'psr/simple-cache' => array( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/simple-cache', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'ralouphie/getallheaders' => array( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'reference' => '120b605dfeb996808c31b6477290a714d356e822', + 'type' => 'library', + 'install_path' => __DIR__ . '/../ralouphie/getallheaders', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'riverline/multipart-parser' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'c9498351b43e19ce6f9410b9c042d59a20ec9fe0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../riverline/multipart-parser', + 'aliases' => array( + 0 => '9999999-dev', + ), + 'dev_requirement' => false, + ), + 'sabberworm/php-css-parser' => array( + 'pretty_version' => 'v8.6.0', + 'version' => '8.6.0.0', + 'reference' => 'd2fb94a9641be84d79c7548c6d39bbebba6e9a70', + 'type' => 'library', + 'install_path' => __DIR__ . '/../sabberworm/php-css-parser', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'spatie/once' => array( + 'pretty_version' => '2.2.1', + 'version' => '2.2.1.0', + 'reference' => 'e6c13ae474a7d4b30975ef6a502a593874ac12d2', + 'type' => 'library', + 'install_path' => __DIR__ . '/../spatie/once', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'stripe/stripe-php' => array( + 'pretty_version' => 'v7.128.0', + 'version' => '7.128.0.0', + 'reference' => 'c704949c49b72985c76cc61063aa26fefbd2724e', + 'type' => 'library', + 'install_path' => __DIR__ . '/../stripe/stripe-php', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'swiftmailer/swiftmailer' => array( + 'pretty_version' => 'v6.3.0', + 'version' => '6.3.0.0', + 'reference' => '8a5d5072dca8f48460fce2f4131fcc495eec654c', + 'type' => 'library', + 'install_path' => __DIR__ . '/../swiftmailer/swiftmailer', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/clock' => array( + 'pretty_version' => 'v7.3.0', + 'version' => '7.3.0.0', + 'reference' => 'b81435fbd6648ea425d1ee96a2d8e68f4ceacd24', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/clock', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/deprecation-contracts' => array( + 'pretty_version' => 'v3.6.0', + 'version' => '3.6.0.0', + 'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/http-foundation' => array( + 'pretty_version' => 'v5.4.50', + 'version' => '5.4.50.0', + 'reference' => '1a0706e8b8041046052ea2695eb8aeee04f97609', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/http-foundation', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-ctype' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-iconv' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '5f3b930437ae03ae5dff61269024d8ea1b3774aa', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-iconv', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-intl-idn' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '9614ac4d8061dc257ecc64cba1b140873dce8ad3', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-intl-normalizer' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '3833d7255cc303546435cb650316bff708a1c75c', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-mbstring' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-php72' => array( + 'pretty_version' => 'v1.31.0', + 'version' => '1.31.0.0', + 'reference' => 'fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce', + 'type' => 'metapackage', + 'install_path' => null, + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-php80' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-php80', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-php83' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '17f6f9a6b1735c0f163024d959f700cfbc5155e5', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-php83', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/translation' => array( + 'pretty_version' => 'v7.3.4', + 'version' => '7.3.4.0', + 'reference' => 'ec25870502d0c7072d086e8ffba1420c85965174', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/translation', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/translation-contracts' => array( + 'pretty_version' => 'v3.6.1', + 'version' => '3.6.1.0', + 'reference' => '65a8bc82080447fae78373aa10f8d13b38338977', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/translation-contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/translation-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '2.3|3.0', + ), + ), + 'symfony/var-dumper' => array( + 'pretty_version' => 'v4.4.47', + 'version' => '4.4.47.0', + 'reference' => '1069c7a3fca74578022fab6f81643248d02f8e63', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/var-dumper', + 'aliases' => array(), + 'dev_requirement' => false, + ), ), ); diff --git a/vendor/doctrine/deprecations/LICENSE b/vendor/doctrine/deprecations/LICENSE new file mode 100644 index 0000000..156905c --- /dev/null +++ b/vendor/doctrine/deprecations/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-2021 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/doctrine/deprecations/composer.json b/vendor/doctrine/deprecations/composer.json new file mode 100644 index 0000000..91ba9e6 --- /dev/null +++ b/vendor/doctrine/deprecations/composer.json @@ -0,0 +1,39 @@ +{ + "name": "doctrine/deprecations", + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "license": "MIT", + "type": "library", + "homepage": "https://www.doctrine-project.org/", + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "DeprecationTests\\": "test_fixtures/src", + "Doctrine\\Foo\\": "test_fixtures/vendor/doctrine/foo" + } + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + } +} diff --git a/vendor/doctrine/deprecations/src/Deprecation.php b/vendor/doctrine/deprecations/src/Deprecation.php new file mode 100644 index 0000000..1801e6c --- /dev/null +++ b/vendor/doctrine/deprecations/src/Deprecation.php @@ -0,0 +1,309 @@ +|null */ + private static $type; + + /** @var LoggerInterface|null */ + private static $logger; + + /** @var array */ + private static $ignoredPackages = []; + + /** @var array */ + private static $triggeredDeprecations = []; + + /** @var array */ + private static $ignoredLinks = []; + + /** @var bool */ + private static $deduplication = true; + + /** + * Trigger a deprecation for the given package and identfier. + * + * The link should point to a Github issue or Wiki entry detailing the + * deprecation. It is additionally used to de-duplicate the trigger of the + * same deprecation during a request. + * + * @param float|int|string $args + */ + public static function trigger(string $package, string $link, string $message, ...$args): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if ($type === self::TYPE_NONE) { + return; + } + + if (isset(self::$ignoredLinks[$link])) { + return; + } + + if (array_key_exists($link, self::$triggeredDeprecations)) { + self::$triggeredDeprecations[$link]++; + } else { + self::$triggeredDeprecations[$link] = 1; + } + + if (self::$deduplication === true && self::$triggeredDeprecations[$link] > 1) { + return; + } + + if (isset(self::$ignoredPackages[$package])) { + return; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); + + $message = sprintf($message, ...$args); + + self::delegateTriggerToBackend($message, $backtrace, $link, $package); + } + + /** + * Trigger a deprecation for the given package and identifier when called from outside. + * + * "Outside" means we assume that $package is currently installed as a + * dependency and the caller is not a file in that package. When $package + * is installed as a root package then deprecations triggered from the + * tests folder are also considered "outside". + * + * This deprecation method assumes that you are using Composer to install + * the dependency and are using the default /vendor/ folder and not a + * Composer plugin to change the install location. The assumption is also + * that $package is the exact composer packge name. + * + * Compared to {@link trigger()} this method causes some overhead when + * deprecation tracking is enabled even during deduplication, because it + * needs to call {@link debug_backtrace()} + * + * @param float|int|string $args + */ + public static function triggerIfCalledFromOutside(string $package, string $link, string $message, ...$args): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if ($type === self::TYPE_NONE) { + return; + } + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); + + // first check that the caller is not from a tests folder, in which case we always let deprecations pass + if (isset($backtrace[1]['file'], $backtrace[0]['file']) && strpos($backtrace[1]['file'], DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR) === false) { + $path = DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $package) . DIRECTORY_SEPARATOR; + + if (strpos($backtrace[0]['file'], $path) === false) { + return; + } + + if (strpos($backtrace[1]['file'], $path) !== false) { + return; + } + } + + if (isset(self::$ignoredLinks[$link])) { + return; + } + + if (array_key_exists($link, self::$triggeredDeprecations)) { + self::$triggeredDeprecations[$link]++; + } else { + self::$triggeredDeprecations[$link] = 1; + } + + if (self::$deduplication === true && self::$triggeredDeprecations[$link] > 1) { + return; + } + + if (isset(self::$ignoredPackages[$package])) { + return; + } + + $message = sprintf($message, ...$args); + + self::delegateTriggerToBackend($message, $backtrace, $link, $package); + } + + /** @param list $backtrace */ + private static function delegateTriggerToBackend(string $message, array $backtrace, string $link, string $package): void + { + $type = self::$type ?? self::getTypeFromEnv(); + + if (($type & self::TYPE_PSR_LOGGER) > 0) { + $context = [ + 'file' => $backtrace[0]['file'] ?? null, + 'line' => $backtrace[0]['line'] ?? null, + 'package' => $package, + 'link' => $link, + ]; + + assert(self::$logger !== null); + + self::$logger->notice($message, $context); + } + + if (! (($type & self::TYPE_TRIGGER_ERROR) > 0)) { + return; + } + + $message .= sprintf( + ' (%s:%d called by %s:%d, %s, package %s)', + self::basename($backtrace[0]['file'] ?? 'native code'), + $backtrace[0]['line'] ?? 0, + self::basename($backtrace[1]['file'] ?? 'native code'), + $backtrace[1]['line'] ?? 0, + $link, + $package + ); + + @trigger_error($message, E_USER_DEPRECATED); + } + + /** + * A non-local-aware version of PHPs basename function. + */ + private static function basename(string $filename): string + { + $pos = strrpos($filename, DIRECTORY_SEPARATOR); + + if ($pos === false) { + return $filename; + } + + return substr($filename, $pos + 1); + } + + public static function enableTrackingDeprecations(): void + { + self::$type = self::$type ?? self::getTypeFromEnv(); + self::$type |= self::TYPE_TRACK_DEPRECATIONS; + } + + public static function enableWithTriggerError(): void + { + self::$type = self::$type ?? self::getTypeFromEnv(); + self::$type |= self::TYPE_TRIGGER_ERROR; + } + + public static function enableWithPsrLogger(LoggerInterface $logger): void + { + self::$type = self::$type ?? self::getTypeFromEnv(); + self::$type |= self::TYPE_PSR_LOGGER; + self::$logger = $logger; + } + + public static function withoutDeduplication(): void + { + self::$deduplication = false; + } + + public static function disable(): void + { + self::$type = self::TYPE_NONE; + self::$logger = null; + self::$deduplication = true; + self::$ignoredLinks = []; + + foreach (self::$triggeredDeprecations as $link => $count) { + self::$triggeredDeprecations[$link] = 0; + } + } + + public static function ignorePackage(string $packageName): void + { + self::$ignoredPackages[$packageName] = true; + } + + public static function ignoreDeprecations(string ...$links): void + { + foreach ($links as $link) { + self::$ignoredLinks[$link] = true; + } + } + + public static function getUniqueTriggeredDeprecationsCount(): int + { + return array_reduce(self::$triggeredDeprecations, static function (int $carry, int $count) { + return $carry + $count; + }, 0); + } + + /** + * Returns each triggered deprecation link identifier and the amount of occurrences. + * + * @return array + */ + public static function getTriggeredDeprecations(): array + { + return self::$triggeredDeprecations; + } + + /** @return int-mask-of */ + private static function getTypeFromEnv(): int + { + switch ($_SERVER['DOCTRINE_DEPRECATIONS'] ?? $_ENV['DOCTRINE_DEPRECATIONS'] ?? null) { + case 'trigger': + self::$type = self::TYPE_TRIGGER_ERROR; + break; + + case 'track': + self::$type = self::TYPE_TRACK_DEPRECATIONS; + break; + + default: + self::$type = self::TYPE_NONE; + break; + } + + return self::$type; + } +} diff --git a/vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php b/vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php new file mode 100644 index 0000000..a6c7ad6 --- /dev/null +++ b/vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php @@ -0,0 +1,66 @@ + */ + private $doctrineDeprecationsExpectations = []; + + /** @var array */ + private $doctrineNoDeprecationsExpectations = []; + + public function expectDeprecationWithIdentifier(string $identifier): void + { + $this->doctrineDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + } + + public function expectNoDeprecationWithIdentifier(string $identifier): void + { + $this->doctrineNoDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + } + + /** @before */ + #[Before] + public function enableDeprecationTracking(): void + { + Deprecation::enableTrackingDeprecations(); + } + + /** @after */ + #[After] + public function verifyDeprecationsAreTriggered(): void + { + foreach ($this->doctrineDeprecationsExpectations as $identifier => $expectation) { + $actualCount = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + + $this->assertTrue( + $actualCount > $expectation, + sprintf( + "Expected deprecation with identifier '%s' was not triggered by code executed in test.", + $identifier + ) + ); + } + + foreach ($this->doctrineNoDeprecationsExpectations as $identifier => $expectation) { + $actualCount = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0; + + $this->assertTrue( + $actualCount === $expectation, + sprintf( + "Expected deprecation with identifier '%s' was triggered by code executed in test, but expected not to.", + $identifier + ) + ); + } + } +} diff --git a/vendor/doctrine/lexer/LICENSE b/vendor/doctrine/lexer/LICENSE new file mode 100644 index 0000000..e8fdec4 --- /dev/null +++ b/vendor/doctrine/lexer/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2006-2018 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/doctrine/lexer/UPGRADE.md b/vendor/doctrine/lexer/UPGRADE.md new file mode 100644 index 0000000..42b85b3 --- /dev/null +++ b/vendor/doctrine/lexer/UPGRADE.md @@ -0,0 +1,14 @@ +Note about upgrading: Doctrine uses static and runtime mechanisms to raise +awareness about deprecated code. + +- Use of `@deprecated` docblock that is detected by IDEs (like PHPStorm) or + Static Analysis tools (like Psalm, phpstan) +- Use of our low-overhead runtime deprecation API, details: + https://github.com/doctrine/deprecations/ + +# Upgrade to 2.0.0 + +`AbstractLexer::glimpse()` and `AbstractLexer::peek()` now return +instances of `Doctrine\Common\Lexer\Token`, which is an array-like class +Using it as an array is deprecated in favor of using properties of that class. +Using `count()` on it is deprecated with no replacement. diff --git a/vendor/doctrine/lexer/composer.json b/vendor/doctrine/lexer/composer.json new file mode 100644 index 0000000..3ac4b50 --- /dev/null +++ b/vendor/doctrine/lexer/composer.json @@ -0,0 +1,56 @@ +{ + "name": "doctrine/lexer", + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "license": "MIT", + "type": "library", + "keywords": [ + "php", + "parser", + "lexer", + "annotations", + "docblock" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "require": { + "php": "^7.1 || ^8.0", + "doctrine/deprecations": "^1.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Doctrine\\Tests\\Common\\Lexer\\": "tests" + } + }, + "config": { + "allow-plugins": { + "composer/package-versions-deprecated": true, + "dealerdirect/phpcodesniffer-composer-installer": true + }, + "sort-packages": true + } +} diff --git a/vendor/doctrine/lexer/src/AbstractLexer.php b/vendor/doctrine/lexer/src/AbstractLexer.php new file mode 100644 index 0000000..8bbe6b0 --- /dev/null +++ b/vendor/doctrine/lexer/src/AbstractLexer.php @@ -0,0 +1,342 @@ +> + */ + private $tokens = []; + + /** + * Current lexer position in input string. + * + * @var int + */ + private $position = 0; + + /** + * Current peek of current lexer position. + * + * @var int + */ + private $peek = 0; + + /** + * The next token in the input. + * + * @var Token|null + */ + public $lookahead; + + /** + * The last matched/seen token. + * + * @var Token|null + */ + public $token; + + /** + * Composed regex for input parsing. + * + * @var non-empty-string|null + */ + private $regex; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + * + * @return void + */ + public function setInput($input) + { + $this->input = $input; + $this->tokens = []; + + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + * + * @return void + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + * + * @return void + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param int $position Position to place the lexical scanner. + * + * @return void + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Retrieve the original lexer's input until a given position. + * + * @param int $position + * + * @return string + */ + public function getInputUntilPosition($position) + { + return substr($this->input, 0, $position); + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param T $type + * + * @return bool + * + * @psalm-assert-if-true !=null $this->lookahead + */ + public function isNextToken($type) + { + return $this->lookahead !== null && $this->lookahead->isA($type); + } + + /** + * Checks whether any of the given tokens matches the current lookahead. + * + * @param list $types + * + * @return bool + * + * @psalm-assert-if-true !=null $this->lookahead + */ + public function isNextTokenAny(array $types) + { + return $this->lookahead !== null && $this->lookahead->isA(...$types); + } + + /** + * Moves to the next token in the input string. + * + * @return bool + * + * @psalm-assert-if-true !null $this->lookahead + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = isset($this->tokens[$this->position]) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param T $type The token type to skip until. + * + * @return void + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && ! $this->lookahead->isA($type)) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token. + * + * @param string $value + * @param int|string $token + * + * @return bool + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return Token|null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } + + return null; + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return Token|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input A query string. + * + * @return void + */ + protected function scan($input) + { + if (! isset($this->regex)) { + $this->regex = sprintf( + '/(%s)|%s/%s', + implode(')|(', $this->getCatchablePatterns()), + implode('|', $this->getNonCatchablePatterns()), + $this->getModifiers() + ); + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($this->regex, $input, -1, $flags); + + if ($matches === false) { + // Work around https://bugs.php.net/78122 + $matches = [[$input, 0]]; + } + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $firstMatch = $match[0]; + $type = $this->getType($firstMatch); + + $this->tokens[] = new Token( + $firstMatch, + $type, + $match[1] + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param T $token + * + * @return int|string + */ + public function getLiteral($token) + { + if ($token instanceof UnitEnum) { + return get_class($token) . '::' . $token->name; + } + + $className = static::class; + + $reflClass = new ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Regex modifiers + * + * @return string + */ + protected function getModifiers() + { + return 'iu'; + } + + /** + * Lexical catchable patterns. + * + * @return string[] + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return string[] + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * + * @return T|null + * + * @param-out V $value + */ + abstract protected function getType(&$value); +} diff --git a/vendor/doctrine/lexer/src/Token.php b/vendor/doctrine/lexer/src/Token.php new file mode 100644 index 0000000..4fbbf4e --- /dev/null +++ b/vendor/doctrine/lexer/src/Token.php @@ -0,0 +1,145 @@ + + */ +final class Token implements ArrayAccess +{ + /** + * The string value of the token in the input string + * + * @readonly + * @var V + */ + public $value; + + /** + * The type of the token (identifier, numeric, string, input parameter, none) + * + * @readonly + * @var T|null + */ + public $type; + + /** + * The position of the token in the input string + * + * @readonly + * @var int + */ + public $position; + + /** + * @param V $value + * @param T|null $type + */ + public function __construct($value, $type, int $position) + { + $this->value = $value; + $this->type = $type; + $this->position = $position; + } + + /** @param T ...$types */ + public function isA(...$types): bool + { + return in_array($this->type, $types, true); + } + + /** + * @deprecated Use the value, type or position property instead + * {@inheritDoc} + */ + public function offsetExists($offset): bool + { + Deprecation::trigger( + 'doctrine/lexer', + 'https://github.com/doctrine/lexer/pull/79', + 'Accessing %s properties via ArrayAccess is deprecated, use the value, type or position property instead', + self::class + ); + + return in_array($offset, ['value', 'type', 'position'], true); + } + + /** + * @deprecated Use the value, type or position property instead + * {@inheritDoc} + * + * @param O $offset + * + * @return mixed + * @psalm-return ( + * O is 'value' + * ? V + * : ( + * O is 'type' + * ? T|null + * : ( + * O is 'position' + * ? int + * : mixed + * ) + * ) + * ) + * + * @template O of array-key + */ + #[ReturnTypeWillChange] + public function offsetGet($offset) + { + Deprecation::trigger( + 'doctrine/lexer', + 'https://github.com/doctrine/lexer/pull/79', + 'Accessing %s properties via ArrayAccess is deprecated, use the value, type or position property instead', + self::class + ); + + return $this->$offset; + } + + /** + * @deprecated no replacement planned + * {@inheritDoc} + */ + public function offsetSet($offset, $value): void + { + Deprecation::trigger( + 'doctrine/lexer', + 'https://github.com/doctrine/lexer/pull/79', + 'Setting %s properties via ArrayAccess is deprecated', + self::class + ); + + $this->$offset = $value; + } + + /** + * @deprecated no replacement planned + * {@inheritDoc} + */ + public function offsetUnset($offset): void + { + Deprecation::trigger( + 'doctrine/lexer', + 'https://github.com/doctrine/lexer/pull/79', + 'Setting %s properties via ArrayAccess is deprecated', + self::class + ); + + $this->$offset = null; + } +} diff --git a/vendor/egulias/email-validator/LICENSE b/vendor/egulias/email-validator/LICENSE new file mode 100644 index 0000000..307440d --- /dev/null +++ b/vendor/egulias/email-validator/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013-2022 Eduardo Gulias Davis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/egulias/email-validator/composer.json b/vendor/egulias/email-validator/composer.json new file mode 100644 index 0000000..6a273e2 --- /dev/null +++ b/vendor/egulias/email-validator/composer.json @@ -0,0 +1,37 @@ +{ + "name": "egulias/email-validator", + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": ["email", "validation", "validator", "emailvalidation", "emailvalidator"], + "license": "MIT", + "authors": [ + {"name": "Eduardo Gulias Davis"} + ], + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "require": { + "php": ">=7.2", + "doctrine/lexer": "^1.2|^2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Egulias\\EmailValidator\\Tests\\": "tests" + } + } +} diff --git a/vendor/egulias/email-validator/src/EmailLexer.php b/vendor/egulias/email-validator/src/EmailLexer.php new file mode 100644 index 0000000..4099758 --- /dev/null +++ b/vendor/egulias/email-validator/src/EmailLexer.php @@ -0,0 +1,345 @@ + + */ +class EmailLexer extends AbstractLexer +{ + //ASCII values + public const S_EMPTY = null; + public const C_NUL = 0; + public const S_HTAB = 9; + public const S_LF = 10; + public const S_CR = 13; + public const S_SP = 32; + public const EXCLAMATION = 33; + public const S_DQUOTE = 34; + public const NUMBER_SIGN = 35; + public const DOLLAR = 36; + public const PERCENTAGE = 37; + public const AMPERSAND = 38; + public const S_SQUOTE = 39; + public const S_OPENPARENTHESIS = 40; + public const S_CLOSEPARENTHESIS = 41; + public const ASTERISK = 42; + public const S_PLUS = 43; + public const S_COMMA = 44; + public const S_HYPHEN = 45; + public const S_DOT = 46; + public const S_SLASH = 47; + public const S_COLON = 58; + public const S_SEMICOLON = 59; + public const S_LOWERTHAN = 60; + public const S_EQUAL = 61; + public const S_GREATERTHAN = 62; + public const QUESTIONMARK = 63; + public const S_AT = 64; + public const S_OPENBRACKET = 91; + public const S_BACKSLASH = 92; + public const S_CLOSEBRACKET = 93; + public const CARET = 94; + public const S_UNDERSCORE = 95; + public const S_BACKTICK = 96; + public const S_OPENCURLYBRACES = 123; + public const S_PIPE = 124; + public const S_CLOSECURLYBRACES = 125; + public const S_TILDE = 126; + public const C_DEL = 127; + public const INVERT_QUESTIONMARK= 168; + public const INVERT_EXCLAMATION = 173; + public const GENERIC = 300; + public const S_IPV6TAG = 301; + public const INVALID = 302; + public const CRLF = 1310; + public const S_DOUBLECOLON = 5858; + public const ASCII_INVALID_FROM = 127; + public const ASCII_INVALID_TO = 199; + + /** + * US-ASCII visible characters not valid for atext (@link http://tools.ietf.org/html/rfc5322#section-3.2.3) + * + * @var array + */ + protected $charValue = [ + '{' => self::S_OPENCURLYBRACES, + '}' => self::S_CLOSECURLYBRACES, + '(' => self::S_OPENPARENTHESIS, + ')' => self::S_CLOSEPARENTHESIS, + '<' => self::S_LOWERTHAN, + '>' => self::S_GREATERTHAN, + '[' => self::S_OPENBRACKET, + ']' => self::S_CLOSEBRACKET, + ':' => self::S_COLON, + ';' => self::S_SEMICOLON, + '@' => self::S_AT, + '\\' => self::S_BACKSLASH, + '/' => self::S_SLASH, + ',' => self::S_COMMA, + '.' => self::S_DOT, + "'" => self::S_SQUOTE, + "`" => self::S_BACKTICK, + '"' => self::S_DQUOTE, + '-' => self::S_HYPHEN, + '::' => self::S_DOUBLECOLON, + ' ' => self::S_SP, + "\t" => self::S_HTAB, + "\r" => self::S_CR, + "\n" => self::S_LF, + "\r\n" => self::CRLF, + 'IPv6' => self::S_IPV6TAG, + '' => self::S_EMPTY, + '\0' => self::C_NUL, + '*' => self::ASTERISK, + '!' => self::EXCLAMATION, + '&' => self::AMPERSAND, + '^' => self::CARET, + '$' => self::DOLLAR, + '%' => self::PERCENTAGE, + '~' => self::S_TILDE, + '|' => self::S_PIPE, + '_' => self::S_UNDERSCORE, + '=' => self::S_EQUAL, + '+' => self::S_PLUS, + '¿' => self::INVERT_QUESTIONMARK, + '?' => self::QUESTIONMARK, + '#' => self::NUMBER_SIGN, + '¡' => self::INVERT_EXCLAMATION, + ]; + + public const INVALID_CHARS_REGEX = "/[^\p{S}\p{C}\p{Cc}]+/iu"; + + public const VALID_UTF8_REGEX = '/\p{Cc}+/u'; + + public const CATCHABLE_PATTERNS = [ + '[a-zA-Z]+[46]?', //ASCII and domain literal + '[^\x00-\x7F]', //UTF-8 + '[0-9]+', + '\r\n', + '::', + '\s+?', + '.', + ]; + + public const NON_CATCHABLE_PATTERNS = [ + '[\xA0-\xff]+', + ]; + + public const MODIFIERS = 'iu'; + + /** @var bool */ + protected $hasInvalidTokens = false; + + /** + * @var array + * + * @psalm-var array{value:string, type:null|int, position:int}|array + */ + protected $previous = []; + + /** + * The last matched/seen token. + * + * @var array|Token + * + * @psalm-suppress NonInvariantDocblockPropertyType + * @psalm-var array{value:string, type:null|int, position:int}|Token + */ + public $token; + + /** + * The next token in the input. + * + * @var array|Token|null + * + * @psalm-suppress NonInvariantDocblockPropertyType + * @psalm-var array{position: int, type: int|null|string, value: int|string}|Token|null + */ + public $lookahead; + + /** @psalm-var array{value:'', type:null, position:0} */ + private static $nullToken = [ + 'value' => '', + 'type' => null, + 'position' => 0, + ]; + + /** @var string */ + private $accumulator = ''; + + /** @var bool */ + private $hasToRecord = false; + + public function __construct() + { + $this->previous = $this->token = self::$nullToken; + $this->lookahead = null; + } + + public function reset() : void + { + $this->hasInvalidTokens = false; + parent::reset(); + $this->previous = $this->token = self::$nullToken; + } + + /** + * @param int $type + * @throws \UnexpectedValueException + * @return boolean + * + * @psalm-suppress InvalidScalarArgument + */ + public function find($type) : bool + { + $search = clone $this; + $search->skipUntil($type); + + if (!$search->lookahead) { + throw new \UnexpectedValueException($type . ' not found'); + } + return true; + } + + /** + * moveNext + * + * @return boolean + */ + public function moveNext() : bool + { + if ($this->hasToRecord && $this->previous === self::$nullToken) { + $this->accumulator .= ((array) $this->token)['value']; + } + + $this->previous = (array) $this->token; + + if($this->lookahead === null) { + $this->lookahead = self::$nullToken; + } + + $hasNext = parent::moveNext(); + + if ($this->hasToRecord) { + $this->accumulator .= ((array) $this->token)['value']; + } + + return $hasNext; + } + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @throws \InvalidArgumentException + * @return integer + */ + protected function getType(&$value) + { + $encoded = $value; + + if (mb_detect_encoding($value, 'auto', true) !== 'UTF-8') { + $encoded = mb_convert_encoding($value, 'UTF-8', 'Windows-1252'); + } + + if ($this->isValid($encoded)) { + return $this->charValue[$encoded]; + } + + if ($this->isNullType($encoded)) { + return self::C_NUL; + } + + if ($this->isInvalidChar($encoded)) { + $this->hasInvalidTokens = true; + return self::INVALID; + } + + + return self::GENERIC; + } + + protected function isValid(string $value) : bool + { + return isset($this->charValue[$value]); + } + + protected function isNullType(string $value) : bool + { + return $value === "\0"; + } + + protected function isInvalidChar(string $value) : bool + { + return !preg_match(self::INVALID_CHARS_REGEX, $value); + } + + protected function isUTF8Invalid(string $value) : bool + { + return preg_match(self::VALID_UTF8_REGEX, $value) !== false; + } + + public function hasInvalidTokens() : bool + { + return $this->hasInvalidTokens; + } + + /** + * getPrevious + * + * @return array + */ + public function getPrevious() : array + { + return $this->previous; + } + + /** + * Lexical catchable patterns. + * + * @return string[] + */ + protected function getCatchablePatterns() : array + { + return self::CATCHABLE_PATTERNS; + } + + /** + * Lexical non-catchable patterns. + * + * @return string[] + */ + protected function getNonCatchablePatterns() : array + { + return self::NON_CATCHABLE_PATTERNS; + } + + protected function getModifiers() : string + { + return self::MODIFIERS; + } + + public function getAccumulatedValues() : string + { + return $this->accumulator; + } + + public function startRecording() : void + { + $this->hasToRecord = true; + } + + public function stopRecording() : void + { + $this->hasToRecord = false; + } + + public function clearRecorded() : void + { + $this->accumulator = ''; + } +} diff --git a/vendor/egulias/email-validator/src/EmailParser.php b/vendor/egulias/email-validator/src/EmailParser.php new file mode 100644 index 0000000..352eae4 --- /dev/null +++ b/vendor/egulias/email-validator/src/EmailParser.php @@ -0,0 +1,90 @@ +addLongEmailWarning($this->localPart, $this->domainPart); + + return $result; + } + + protected function preLeftParsing(): Result + { + if (!$this->hasAtToken()) { + return new InvalidEmail(new NoLocalPart(), $this->lexer->token["value"]); + } + return new ValidEmail(); + } + + protected function parseLeftFromAt(): Result + { + return $this->processLocalPart(); + } + + protected function parseRightFromAt(): Result + { + return $this->processDomainPart(); + } + + private function processLocalPart() : Result + { + $localPartParser = new LocalPart($this->lexer); + $localPartResult = $localPartParser->parse(); + $this->localPart = $localPartParser->localPart(); + $this->warnings = array_merge($localPartParser->getWarnings(), $this->warnings); + + return $localPartResult; + } + + private function processDomainPart() : Result + { + $domainPartParser = new DomainPart($this->lexer); + $domainPartResult = $domainPartParser->parse(); + $this->domainPart = $domainPartParser->domainPart(); + $this->warnings = array_merge($domainPartParser->getWarnings(), $this->warnings); + + return $domainPartResult; + } + + public function getDomainPart() : string + { + return $this->domainPart; + } + + public function getLocalPart() : string + { + return $this->localPart; + } + + private function addLongEmailWarning(string $localPart, string $parsedDomainPart) : void + { + if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) { + $this->warnings[EmailTooLong::CODE] = new EmailTooLong(); + } + } +} diff --git a/vendor/egulias/email-validator/src/EmailValidator.php b/vendor/egulias/email-validator/src/EmailValidator.php new file mode 100644 index 0000000..5a2e5c8 --- /dev/null +++ b/vendor/egulias/email-validator/src/EmailValidator.php @@ -0,0 +1,67 @@ +lexer = new EmailLexer(); + } + + /** + * @param string $email + * @param EmailValidation $emailValidation + * @return bool + */ + public function isValid(string $email, EmailValidation $emailValidation) + { + $isValid = $emailValidation->isValid($email, $this->lexer); + $this->warnings = $emailValidation->getWarnings(); + $this->error = $emailValidation->getError(); + + return $isValid; + } + + /** + * @return boolean + */ + public function hasWarnings() + { + return !empty($this->warnings); + } + + /** + * @return array + */ + public function getWarnings() + { + return $this->warnings; + } + + /** + * @return InvalidEmail|null + */ + public function getError() + { + return $this->error; + } +} diff --git a/vendor/egulias/email-validator/src/MessageIDParser.php b/vendor/egulias/email-validator/src/MessageIDParser.php new file mode 100644 index 0000000..b0b6720 --- /dev/null +++ b/vendor/egulias/email-validator/src/MessageIDParser.php @@ -0,0 +1,91 @@ +addLongEmailWarning($this->idLeft, $this->idRight); + + return $result; + } + + protected function preLeftParsing(): Result + { + if (!$this->hasAtToken()) { + return new InvalidEmail(new NoLocalPart(), $this->lexer->token["value"]); + } + return new ValidEmail(); + } + + protected function parseLeftFromAt(): Result + { + return $this->processIDLeft(); + } + + protected function parseRightFromAt(): Result + { + return $this->processIDRight(); + } + + private function processIDLeft() : Result + { + $localPartParser = new IDLeftPart($this->lexer); + $localPartResult = $localPartParser->parse(); + $this->idLeft = $localPartParser->localPart(); + $this->warnings = array_merge($localPartParser->getWarnings(), $this->warnings); + + return $localPartResult; + } + + private function processIDRight() : Result + { + $domainPartParser = new IDRightPart($this->lexer); + $domainPartResult = $domainPartParser->parse(); + $this->idRight = $domainPartParser->domainPart(); + $this->warnings = array_merge($domainPartParser->getWarnings(), $this->warnings); + + return $domainPartResult; + } + + public function getLeftPart() : string + { + return $this->idLeft; + } + + public function getRightPart() : string + { + return $this->idRight; + } + + private function addLongEmailWarning(string $localPart, string $parsedDomainPart) : void + { + if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAILID_MAX_LENGTH) { + $this->warnings[EmailTooLong::CODE] = new EmailTooLong(); + } + } +} diff --git a/vendor/egulias/email-validator/src/Parser.php b/vendor/egulias/email-validator/src/Parser.php new file mode 100644 index 0000000..4e5ac7d --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser.php @@ -0,0 +1,78 @@ +lexer = $lexer; + } + + public function parse(string $str) : Result + { + $this->lexer->setInput($str); + + if ($this->lexer->hasInvalidTokens()) { + return new InvalidEmail(new ExpectingATEXT("Invalid tokens found"), $this->lexer->token["value"]); + } + + $preParsingResult = $this->preLeftParsing(); + if ($preParsingResult->isInvalid()) { + return $preParsingResult; + } + + $localPartResult = $this->parseLeftFromAt(); + + if ($localPartResult->isInvalid()) { + return $localPartResult; + } + + $domainPartResult = $this->parseRightFromAt(); + + if ($domainPartResult->isInvalid()) { + return $domainPartResult; + } + + return new ValidEmail(); + } + + /** + * @return Warning\Warning[] + */ + public function getWarnings() : array + { + return $this->warnings; + } + + protected function hasAtToken() : bool + { + $this->lexer->moveNext(); + $this->lexer->moveNext(); + + return ((array) $this->lexer->token)['type'] !== EmailLexer::S_AT; + } +} diff --git a/vendor/egulias/email-validator/src/Parser/Comment.php b/vendor/egulias/email-validator/src/Parser/Comment.php new file mode 100644 index 0000000..34ef972 --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/Comment.php @@ -0,0 +1,104 @@ +lexer = $lexer; + $this->commentStrategy = $commentStrategy; + } + + public function parse() : Result + { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS) { + $this->openedParenthesis++; + if($this->noClosingParenthesis()) { + return new InvalidEmail(new UnclosedComment(), ((array) $this->lexer->token)['value']); + } + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS) { + return new InvalidEmail(new UnOpenedComment(), ((array) $this->lexer->token)['value']); + } + + $this->warnings[WarningComment::CODE] = new WarningComment(); + + $moreTokens = true; + while ($this->commentStrategy->exitCondition($this->lexer, $this->openedParenthesis) && $moreTokens){ + + if ($this->lexer->isNextToken(EmailLexer::S_OPENPARENTHESIS)) { + $this->openedParenthesis++; + } + $this->warnEscaping(); + if($this->lexer->isNextToken(EmailLexer::S_CLOSEPARENTHESIS)) { + $this->openedParenthesis--; + } + $moreTokens = $this->lexer->moveNext(); + } + + if($this->openedParenthesis >= 1) { + return new InvalidEmail(new UnclosedComment(), ((array) $this->lexer->token)['value']); + } + if ($this->openedParenthesis < 0) { + return new InvalidEmail(new UnOpenedComment(), ((array) $this->lexer->token)['value']); + } + + $finalValidations = $this->commentStrategy->endOfLoopValidations($this->lexer); + + $this->warnings = array_merge($this->warnings, $this->commentStrategy->getWarnings()); + + return $finalValidations; + } + + + /** + * @return bool + */ + private function warnEscaping() : bool + { + //Backslash found + if (((array) $this->lexer->token)['type'] !== EmailLexer::S_BACKSLASH) { + return false; + } + + if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::C_DEL))) { + return false; + } + + $this->warnings[QuotedPart::CODE] = + new QuotedPart($this->lexer->getPrevious()['type'], ((array) $this->lexer->token)['type']); + return true; + + } + + private function noClosingParenthesis() : bool + { + try { + $this->lexer->find(EmailLexer::S_CLOSEPARENTHESIS); + return false; + } catch (\RuntimeException $e) { + return true; + } + } +} diff --git a/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php b/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php new file mode 100644 index 0000000..410032f --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php @@ -0,0 +1,18 @@ +isNextToken(EmailLexer::S_DOT))){ // || !$internalLexer->moveNext()) { + return false; + } + + return true; + } + + public function endOfLoopValidations(EmailLexer $lexer) : Result + { + //test for end of string + if (!$lexer->isNextToken(EmailLexer::S_DOT)) { + return new InvalidEmail(new ExpectingATEXT('DOT not found near CLOSEPARENTHESIS'), ((array) $lexer->token)['value']); + } + //add warning + //Address is valid within the message but cannot be used unmodified for the envelope + return new ValidEmail(); + } + + public function getWarnings(): array + { + return []; + } +} diff --git a/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php b/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php new file mode 100644 index 0000000..179802b --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php @@ -0,0 +1,37 @@ +isNextToken(EmailLexer::S_AT); + } + + public function endOfLoopValidations(EmailLexer $lexer) : Result + { + if (!$lexer->isNextToken(EmailLexer::S_AT)) { + return new InvalidEmail(new ExpectingATEXT('ATEX is not expected after closing comments'), ((array) $lexer->token)['value']); + } + $this->warnings[CFWSNearAt::CODE] = new CFWSNearAt(); + return new ValidEmail(); + } + + public function getWarnings(): array + { + return $this->warnings; + } +} diff --git a/vendor/egulias/email-validator/src/Parser/DomainLiteral.php b/vendor/egulias/email-validator/src/Parser/DomainLiteral.php new file mode 100644 index 0000000..1048634 --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/DomainLiteral.php @@ -0,0 +1,211 @@ +addTagWarnings(); + + $IPv6TAG = false; + $addressLiteral = ''; + + do { + if (((array) $this->lexer->token)['type'] === EmailLexer::C_NUL) { + return new InvalidEmail(new ExpectingDTEXT(), ((array) $this->lexer->token)['value']); + } + + $this->addObsoleteWarnings(); + + if ($this->lexer->isNextTokenAny(array(EmailLexer::S_OPENBRACKET, EmailLexer::S_OPENBRACKET))) { + return new InvalidEmail(new ExpectingDTEXT(), ((array) $this->lexer->token)['value']); + } + + if ($this->lexer->isNextTokenAny( + array(EmailLexer::S_HTAB, EmailLexer::S_SP, EmailLexer::CRLF) + )) { + $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS(); + $this->parseFWS(); + } + + if ($this->lexer->isNextToken(EmailLexer::S_CR)) { + return new InvalidEmail(new CRNoLF(), ((array) $this->lexer->token)['value']); + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH) { + return new InvalidEmail(new UnusualElements(((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']); + } + if (((array) $this->lexer->token)['type'] === EmailLexer::S_IPV6TAG) { + $IPv6TAG = true; + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEBRACKET) { + break; + } + + $addressLiteral .= ((array) $this->lexer->token)['value']; + + } while ($this->lexer->moveNext()); + + + //Encapsulate + $addressLiteral = str_replace('[', '', $addressLiteral); + $isAddressLiteralIPv4 = $this->checkIPV4Tag($addressLiteral); + + if (!$isAddressLiteralIPv4) { + return new ValidEmail(); + } else { + $addressLiteral = $this->convertIPv4ToIPv6($addressLiteral); + } + + if (!$IPv6TAG) { + $this->warnings[WarningDomainLiteral::CODE] = new WarningDomainLiteral(); + return new ValidEmail(); + } + + $this->warnings[AddressLiteral::CODE] = new AddressLiteral(); + + $this->checkIPV6Tag($addressLiteral); + + return new ValidEmail(); + } + + /** + * @param string $addressLiteral + * @param int $maxGroups + */ + public function checkIPV6Tag($addressLiteral, $maxGroups = 8) : void + { + $prev = $this->lexer->getPrevious(); + if ($prev['type'] === EmailLexer::S_COLON) { + $this->warnings[IPV6ColonEnd::CODE] = new IPV6ColonEnd(); + } + + $IPv6 = substr($addressLiteral, 5); + //Daniel Marschall's new IPv6 testing strategy + $matchesIP = explode(':', $IPv6); + $groupCount = count($matchesIP); + $colons = strpos($IPv6, '::'); + + if (count(preg_grep('/^[0-9A-Fa-f]{0,4}$/', $matchesIP, PREG_GREP_INVERT)) !== 0) { + $this->warnings[IPV6BadChar::CODE] = new IPV6BadChar(); + } + + if ($colons === false) { + // We need exactly the right number of groups + if ($groupCount !== $maxGroups) { + $this->warnings[IPV6GroupCount::CODE] = new IPV6GroupCount(); + } + return; + } + + if ($colons !== strrpos($IPv6, '::')) { + $this->warnings[IPV6DoubleColon::CODE] = new IPV6DoubleColon(); + return; + } + + if ($colons === 0 || $colons === (strlen($IPv6) - 2)) { + // RFC 4291 allows :: at the start or end of an address + //with 7 other groups in addition + ++$maxGroups; + } + + if ($groupCount > $maxGroups) { + $this->warnings[IPV6MaxGroups::CODE] = new IPV6MaxGroups(); + } elseif ($groupCount === $maxGroups) { + $this->warnings[IPV6Deprecated::CODE] = new IPV6Deprecated(); + } + } + + public function convertIPv4ToIPv6(string $addressLiteralIPv4) : string + { + $matchesIP = []; + $IPv4Match = preg_match(self::IPV4_REGEX, $addressLiteralIPv4, $matchesIP); + + // Extract IPv4 part from the end of the address-literal (if there is one) + if ($IPv4Match > 0) { + $index = (int) strrpos($addressLiteralIPv4, $matchesIP[0]); + //There's a match but it is at the start + if ($index > 0) { + // Convert IPv4 part to IPv6 format for further testing + return substr($addressLiteralIPv4, 0, $index) . '0:0'; + } + } + + return $addressLiteralIPv4; + } + + /** + * @param string $addressLiteral + * + * @return bool + */ + protected function checkIPV4Tag($addressLiteral) : bool + { + $matchesIP = []; + $IPv4Match = preg_match(self::IPV4_REGEX, $addressLiteral, $matchesIP); + + // Extract IPv4 part from the end of the address-literal (if there is one) + + if ($IPv4Match > 0) { + $index = strrpos($addressLiteral, $matchesIP[0]); + //There's a match but it is at the start + if ($index === 0) { + $this->warnings[AddressLiteral::CODE] = new AddressLiteral(); + return false; + } + } + + return true; + } + + private function addObsoleteWarnings() : void + { + if(in_array(((array) $this->lexer->token)['type'], self::OBSOLETE_WARNINGS)) { + $this->warnings[ObsoleteDTEXT::CODE] = new ObsoleteDTEXT(); + } + } + + private function addTagWarnings() : void + { + if ($this->lexer->isNextToken(EmailLexer::S_COLON)) { + $this->warnings[IPV6ColonStart::CODE] = new IPV6ColonStart(); + } + if ($this->lexer->isNextToken(EmailLexer::S_IPV6TAG)) { + $lexer = clone $this->lexer; + $lexer->moveNext(); + if ($lexer->isNextToken(EmailLexer::S_DOUBLECOLON)) { + $this->warnings[IPV6ColonStart::CODE] = new IPV6ColonStart(); + } + } + } + +} diff --git a/vendor/egulias/email-validator/src/Parser/DomainPart.php b/vendor/egulias/email-validator/src/Parser/DomainPart.php new file mode 100644 index 0000000..84a4180 --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/DomainPart.php @@ -0,0 +1,316 @@ +lexer->clearRecorded(); + $this->lexer->startRecording(); + + $this->lexer->moveNext(); + + $domainChecks = $this->performDomainStartChecks(); + if ($domainChecks->isInvalid()) { + return $domainChecks; + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_AT) { + return new InvalidEmail(new ConsecutiveAt(), ((array) $this->lexer->token)['value']); + } + + $result = $this->doParseDomainPart(); + if ($result->isInvalid()) { + return $result; + } + + $end = $this->checkEndOfDomain(); + if ($end->isInvalid()) { + return $end; + } + + $this->lexer->stopRecording(); + $this->domainPart = $this->lexer->getAccumulatedValues(); + + $length = strlen($this->domainPart); + if ($length > self::DOMAIN_MAX_LENGTH) { + return new InvalidEmail(new DomainTooLong(), ((array) $this->lexer->token)['value']); + } + + return new ValidEmail(); + } + + private function checkEndOfDomain() : Result + { + $prev = $this->lexer->getPrevious(); + if ($prev['type'] === EmailLexer::S_DOT) { + return new InvalidEmail(new DotAtEnd(), ((array) $this->lexer->token)['value']); + } + if ($prev['type'] === EmailLexer::S_HYPHEN) { + return new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), $prev['value']); + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_SP) { + return new InvalidEmail(new CRLFAtTheEnd(), $prev['value']); + } + return new ValidEmail(); + + } + + private function performDomainStartChecks() : Result + { + $invalidTokens = $this->checkInvalidTokensAfterAT(); + if ($invalidTokens->isInvalid()) { + return $invalidTokens; + } + + $missingDomain = $this->checkEmptyDomain(); + if ($missingDomain->isInvalid()) { + return $missingDomain; + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS) { + $this->warnings[DeprecatedComment::CODE] = new DeprecatedComment(); + } + return new ValidEmail(); + } + + private function checkEmptyDomain() : Result + { + $thereIsNoDomain = ((array) $this->lexer->token)['type'] === EmailLexer::S_EMPTY || + (((array) $this->lexer->token)['type'] === EmailLexer::S_SP && + !$this->lexer->isNextToken(EmailLexer::GENERIC)); + + if ($thereIsNoDomain) { + return new InvalidEmail(new NoDomainPart(), ((array) $this->lexer->token)['value']); + } + + return new ValidEmail(); + } + + private function checkInvalidTokensAfterAT() : Result + { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT) { + return new InvalidEmail(new DotAtStart(), ((array) $this->lexer->token)['value']); + } + if (((array) $this->lexer->token)['type'] === EmailLexer::S_HYPHEN) { + return new InvalidEmail(new DomainHyphened('After AT'), ((array) $this->lexer->token)['value']); + } + return new ValidEmail(); + } + + protected function parseComments(): Result + { + $commentParser = new Comment($this->lexer, new DomainComment()); + $result = $commentParser->parse(); + $this->warnings = array_merge($this->warnings, $commentParser->getWarnings()); + + return $result; + } + + protected function doParseDomainPart() : Result + { + $tldMissing = true; + $hasComments = false; + $domain = ''; + do { + $prev = $this->lexer->getPrevious(); + + $notAllowedChars = $this->checkNotAllowedChars($this->lexer->token); + if ($notAllowedChars->isInvalid()) { + return $notAllowedChars; + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS || + ((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS ) { + $hasComments = true; + $commentsResult = $this->parseComments(); + + //Invalid comment parsing + if($commentsResult->isInvalid()) { + return $commentsResult; + } + } + + $dotsResult = $this->checkConsecutiveDots(); + if ($dotsResult->isInvalid()) { + return $dotsResult; + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENBRACKET) { + $literalResult = $this->parseDomainLiteral(); + + $this->addTLDWarnings($tldMissing); + return $literalResult; + } + + $labelCheck = $this->checkLabelLength(); + if ($labelCheck->isInvalid()) { + return $labelCheck; + } + + $FwsResult = $this->parseFWS(); + if($FwsResult->isInvalid()) { + return $FwsResult; + } + + $domain .= ((array) $this->lexer->token)['value']; + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::GENERIC)) { + $tldMissing = false; + } + + $exceptionsResult = $this->checkDomainPartExceptions($prev, $hasComments); + if ($exceptionsResult->isInvalid()) { + return $exceptionsResult; + } + $this->lexer->moveNext(); + + } while (null !== ((array) $this->lexer->token)['type']); + + $labelCheck = $this->checkLabelLength(true); + if ($labelCheck->isInvalid()) { + return $labelCheck; + } + $this->addTLDWarnings($tldMissing); + + $this->domainPart = $domain; + return new ValidEmail(); + } + + /** + * @psalm-param array|Token $token + */ + private function checkNotAllowedChars($token) : Result + { + $notAllowed = [EmailLexer::S_BACKSLASH => true, EmailLexer::S_SLASH=> true]; + if (isset($notAllowed[((array) $token)['type']])) { + return new InvalidEmail(new CharNotAllowed(), ((array) $token)['value']); + } + return new ValidEmail(); + } + + /** + * @return Result + */ + protected function parseDomainLiteral() : Result + { + try { + $this->lexer->find(EmailLexer::S_CLOSEBRACKET); + } catch (\RuntimeException $e) { + return new InvalidEmail(new ExpectingDomainLiteralClose(), ((array) $this->lexer->token)['value']); + } + + $domainLiteralParser = new DomainLiteralParser($this->lexer); + $result = $domainLiteralParser->parse(); + $this->warnings = array_merge($this->warnings, $domainLiteralParser->getWarnings()); + return $result; + } + + protected function checkDomainPartExceptions(array $prev, bool $hasComments) : Result + { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENBRACKET && $prev['type'] !== EmailLexer::S_AT) { + return new InvalidEmail(new ExpectingATEXT('OPENBRACKET not after AT'), ((array) $this->lexer->token)['value']); + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) { + return new InvalidEmail(new DomainHyphened('Hypen found near DOT'), ((array) $this->lexer->token)['value']); + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH + && $this->lexer->isNextToken(EmailLexer::GENERIC)) { + return new InvalidEmail(new ExpectingATEXT('Escaping following "ATOM"'), ((array) $this->lexer->token)['value']); + } + + return $this->validateTokens($hasComments); + } + + protected function validateTokens(bool $hasComments) : Result + { + $validDomainTokens = array( + EmailLexer::GENERIC => true, + EmailLexer::S_HYPHEN => true, + EmailLexer::S_DOT => true, + ); + + if ($hasComments) { + $validDomainTokens[EmailLexer::S_OPENPARENTHESIS] = true; + $validDomainTokens[EmailLexer::S_CLOSEPARENTHESIS] = true; + } + + if (!isset($validDomainTokens[((array) $this->lexer->token)['type']])) { + return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . ((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']); + } + + return new ValidEmail(); + } + + private function checkLabelLength(bool $isEndOfDomain = false) : Result + { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT || $isEndOfDomain) { + if ($this->isLabelTooLong($this->label)) { + return new InvalidEmail(new LabelTooLong(), ((array) $this->lexer->token)['value']); + } + $this->label = ''; + } + $this->label .= ((array) $this->lexer->token)['value']; + return new ValidEmail(); + } + + + private function isLabelTooLong(string $label) : bool + { + if (preg_match('/[^\x00-\x7F]/', $label)) { + idn_to_ascii($label, IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46, $idnaInfo); + return (bool) ($idnaInfo['errors'] & IDNA_ERROR_LABEL_TOO_LONG); + } + return strlen($label) > self::LABEL_MAX_LENGTH; + } + + private function addTLDWarnings(bool $isTLDMissing) : void + { + if ($isTLDMissing) { + $this->warnings[TLD::CODE] = new TLD(); + } + } + + public function domainPart() : string + { + return $this->domainPart; + } +} diff --git a/vendor/egulias/email-validator/src/Parser/DoubleQuote.php b/vendor/egulias/email-validator/src/Parser/DoubleQuote.php new file mode 100644 index 0000000..d722292 --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/DoubleQuote.php @@ -0,0 +1,87 @@ +checkDQUOTE(); + if($validQuotedString->isInvalid()) return $validQuotedString; + + $special = [ + EmailLexer::S_CR => true, + EmailLexer::S_HTAB => true, + EmailLexer::S_LF => true + ]; + + $invalid = [ + EmailLexer::C_NUL => true, + EmailLexer::S_HTAB => true, + EmailLexer::S_CR => true, + EmailLexer::S_LF => true + ]; + + $setSpecialsWarning = true; + + $this->lexer->moveNext(); + + while (((array) $this->lexer->token)['type'] !== EmailLexer::S_DQUOTE && null !== ((array) $this->lexer->token)['type']) { + if (isset($special[((array) $this->lexer->token)['type']]) && $setSpecialsWarning) { + $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS(); + $setSpecialsWarning = false; + } + if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::S_DQUOTE)) { + $this->lexer->moveNext(); + } + + $this->lexer->moveNext(); + + if (!$this->escaped() && isset($invalid[((array) $this->lexer->token)['type']])) { + return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), ((array) $this->lexer->token)['value']); + } + } + + $prev = $this->lexer->getPrevious(); + + if ($prev['type'] === EmailLexer::S_BACKSLASH) { + $validQuotedString = $this->checkDQUOTE(); + if($validQuotedString->isInvalid()) return $validQuotedString; + } + + if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) { + return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), ((array) $this->lexer->token)['value']); + } + + return new ValidEmail(); + } + + protected function checkDQUOTE() : Result + { + $previous = $this->lexer->getPrevious(); + + if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] === EmailLexer::GENERIC) { + $description = 'https://tools.ietf.org/html/rfc5322#section-3.2.4 - quoted string should be a unit'; + return new InvalidEmail(new ExpectingATEXT($description), ((array) $this->lexer->token)['value']); + } + + try { + $this->lexer->find(EmailLexer::S_DQUOTE); + } catch (\Exception $e) { + return new InvalidEmail(new UnclosedQuotedString(), ((array) $this->lexer->token)['value']); + } + $this->warnings[QuotedString::CODE] = new QuotedString($previous['value'], ((array) $this->lexer->token)['value']); + + return new ValidEmail(); + } + +} diff --git a/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php b/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php new file mode 100644 index 0000000..be4b05b --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php @@ -0,0 +1,86 @@ +isFWS()) { + return new ValidEmail(); + } + + $previous = $this->lexer->getPrevious(); + + $resultCRLF = $this->checkCRLFInFWS(); + if ($resultCRLF->isInvalid()) { + return $resultCRLF; + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_CR) { + return new InvalidEmail(new CRNoLF(), ((array) $this->lexer->token)['value']); + } + + if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] !== EmailLexer::S_AT) { + return new InvalidEmail(new AtextAfterCFWS(), ((array) $this->lexer->token)['value']); + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_LF || ((array) $this->lexer->token)['type'] === EmailLexer::C_NUL) { + return new InvalidEmail(new ExpectingCTEXT(), ((array) $this->lexer->token)['value']); + } + + if ($this->lexer->isNextToken(EmailLexer::S_AT) || $previous['type'] === EmailLexer::S_AT) { + $this->warnings[CFWSNearAt::CODE] = new CFWSNearAt(); + } else { + $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS(); + } + + return new ValidEmail(); + } + + protected function checkCRLFInFWS() : Result + { + if (((array) $this->lexer->token)['type'] !== EmailLexer::CRLF) { + return new ValidEmail(); + } + + if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) { + return new InvalidEmail(new CRLFX2(), ((array) $this->lexer->token)['value']); + } + + //this has no coverage. Condition is repeated from above one + if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) { + return new InvalidEmail(new CRLFAtTheEnd(), ((array) $this->lexer->token)['value']); + } + + return new ValidEmail(); + } + + protected function isFWS() : bool + { + if ($this->escaped()) { + return false; + } + + return in_array(((array) $this->lexer->token)['type'], self::FWS_TYPES); + } +} diff --git a/vendor/egulias/email-validator/src/Parser/IDLeftPart.php b/vendor/egulias/email-validator/src/Parser/IDLeftPart.php new file mode 100644 index 0000000..3b01ae2 --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/IDLeftPart.php @@ -0,0 +1,15 @@ +lexer->token)['value']); + } +} diff --git a/vendor/egulias/email-validator/src/Parser/IDRightPart.php b/vendor/egulias/email-validator/src/Parser/IDRightPart.php new file mode 100644 index 0000000..d19e05a --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/IDRightPart.php @@ -0,0 +1,29 @@ + true, + EmailLexer::S_SQUOTE => true, + EmailLexer::S_BACKTICK => true, + EmailLexer::S_SEMICOLON => true, + EmailLexer::S_GREATERTHAN => true, + EmailLexer::S_LOWERTHAN => true, + ]; + + if (isset($invalidDomainTokens[((array) $this->lexer->token)['type']])) { + return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . ((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']); + } + return new ValidEmail(); + } +} diff --git a/vendor/egulias/email-validator/src/Parser/LocalPart.php b/vendor/egulias/email-validator/src/Parser/LocalPart.php new file mode 100644 index 0000000..3f2ef7d --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/LocalPart.php @@ -0,0 +1,165 @@ + EmailLexer::S_COMMA, + EmailLexer::S_CLOSEBRACKET => EmailLexer::S_CLOSEBRACKET, + EmailLexer::S_OPENBRACKET => EmailLexer::S_OPENBRACKET, + EmailLexer::S_GREATERTHAN => EmailLexer::S_GREATERTHAN, + EmailLexer::S_LOWERTHAN => EmailLexer::S_LOWERTHAN, + EmailLexer::S_COLON => EmailLexer::S_COLON, + EmailLexer::S_SEMICOLON => EmailLexer::S_SEMICOLON, + EmailLexer::INVALID => EmailLexer::INVALID + ]; + + /** + * @var string + */ + private $localPart = ''; + + + public function parse() : Result + { + $this->lexer->startRecording(); + + while (((array) $this->lexer->token)['type'] !== EmailLexer::S_AT && null !== ((array) $this->lexer->token)['type']) { + if ($this->hasDotAtStart()) { + return new InvalidEmail(new DotAtStart(), ((array) $this->lexer->token)['value']); + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DQUOTE) { + $dquoteParsingResult = $this->parseDoubleQuote(); + + //Invalid double quote parsing + if($dquoteParsingResult->isInvalid()) { + return $dquoteParsingResult; + } + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS || + ((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS ) { + $commentsResult = $this->parseComments(); + + //Invalid comment parsing + if($commentsResult->isInvalid()) { + return $commentsResult; + } + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) { + return new InvalidEmail(new ConsecutiveDot(), ((array) $this->lexer->token)['value']); + } + + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && + $this->lexer->isNextToken(EmailLexer::S_AT) + ) { + return new InvalidEmail(new DotAtEnd(), ((array) $this->lexer->token)['value']); + } + + $resultEscaping = $this->validateEscaping(); + if ($resultEscaping->isInvalid()) { + return $resultEscaping; + } + + $resultToken = $this->validateTokens(false); + if ($resultToken->isInvalid()) { + return $resultToken; + } + + $resultFWS = $this->parseLocalFWS(); + if($resultFWS->isInvalid()) { + return $resultFWS; + } + + $this->lexer->moveNext(); + } + + $this->lexer->stopRecording(); + $this->localPart = rtrim($this->lexer->getAccumulatedValues(), '@'); + if (strlen($this->localPart) > LocalTooLong::LOCAL_PART_LENGTH) { + $this->warnings[LocalTooLong::CODE] = new LocalTooLong(); + } + + return new ValidEmail(); + } + + protected function validateTokens(bool $hasComments) : Result + { + if (isset(self::INVALID_TOKENS[((array) $this->lexer->token)['type']])) { + return new InvalidEmail(new ExpectingATEXT('Invalid token found'), ((array) $this->lexer->token)['value']); + } + return new ValidEmail(); + } + + public function localPart() : string + { + return $this->localPart; + } + + private function parseLocalFWS() : Result + { + $foldingWS = new FoldingWhiteSpace($this->lexer); + $resultFWS = $foldingWS->parse(); + if ($resultFWS->isValid()) { + $this->warnings = array_merge($this->warnings, $foldingWS->getWarnings()); + } + return $resultFWS; + } + + private function hasDotAtStart() : bool + { + return ((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && null === $this->lexer->getPrevious()['type']; + } + + private function parseDoubleQuote() : Result + { + $dquoteParser = new DoubleQuote($this->lexer); + $parseAgain = $dquoteParser->parse(); + $this->warnings = array_merge($this->warnings, $dquoteParser->getWarnings()); + + return $parseAgain; + } + + protected function parseComments(): Result + { + $commentParser = new Comment($this->lexer, new LocalComment()); + $result = $commentParser->parse(); + $this->warnings = array_merge($this->warnings, $commentParser->getWarnings()); + if($result->isInvalid()) { + return $result; + } + return $result; + } + + private function validateEscaping() : Result + { + //Backslash found + if (((array) $this->lexer->token)['type'] !== EmailLexer::S_BACKSLASH) { + return new ValidEmail(); + } + + if ($this->lexer->isNextToken(EmailLexer::GENERIC)) { + return new InvalidEmail(new ExpectingATEXT('Found ATOM after escaping'), ((array) $this->lexer->token)['value']); + } + + if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::C_DEL))) { + return new ValidEmail(); + } + + return new ValidEmail(); + } +} diff --git a/vendor/egulias/email-validator/src/Parser/PartParser.php b/vendor/egulias/email-validator/src/Parser/PartParser.php new file mode 100644 index 0000000..7fc6d7b --- /dev/null +++ b/vendor/egulias/email-validator/src/Parser/PartParser.php @@ -0,0 +1,63 @@ +lexer = $lexer; + } + + abstract public function parse() : Result; + + /** + * @return \Egulias\EmailValidator\Warning\Warning[] + */ + public function getWarnings() + { + return $this->warnings; + } + + protected function parseFWS() : Result + { + $foldingWS = new FoldingWhiteSpace($this->lexer); + $resultFWS = $foldingWS->parse(); + $this->warnings = array_merge($this->warnings, $foldingWS->getWarnings()); + return $resultFWS; + } + + protected function checkConsecutiveDots() : Result + { + if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) { + return new InvalidEmail(new ConsecutiveDot(), ((array) $this->lexer->token)['value']); + } + + return new ValidEmail(); + } + + protected function escaped() : bool + { + $previous = $this->lexer->getPrevious(); + + return $previous && $previous['type'] === EmailLexer::S_BACKSLASH + && + ((array) $this->lexer->token)['type'] !== EmailLexer::GENERIC; + } +} diff --git a/vendor/egulias/email-validator/src/Result/InvalidEmail.php b/vendor/egulias/email-validator/src/Result/InvalidEmail.php new file mode 100644 index 0000000..180f4d8 --- /dev/null +++ b/vendor/egulias/email-validator/src/Result/InvalidEmail.php @@ -0,0 +1,46 @@ +token = $token; + $this->reason = $reason; + } + + public function isValid(): bool + { + return false; + } + + public function isInvalid(): bool + { + return true; + } + + public function description(): string + { + return $this->reason->description() . " in char " . $this->token; + } + + public function code(): int + { + return $this->reason->code(); + } + + public function reason() : Reason + { + return $this->reason; + } + +} diff --git a/vendor/egulias/email-validator/src/Result/MultipleErrors.php b/vendor/egulias/email-validator/src/Result/MultipleErrors.php new file mode 100644 index 0000000..5fa85af --- /dev/null +++ b/vendor/egulias/email-validator/src/Result/MultipleErrors.php @@ -0,0 +1,56 @@ +reasons[$reason->code()] = $reason; + } + + /** + * @return Reason[] + */ + public function getReasons() : array + { + return $this->reasons; + } + + public function reason() : Reason + { + return 0 !== count($this->reasons) + ? current($this->reasons) + : new EmptyReason(); + } + + public function description() : string + { + $description = ''; + foreach($this->reasons as $reason) { + $description .= $reason->description() . PHP_EOL; + } + + return $description; + } + + public function code() : int + { + return 0; + } +} diff --git a/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php b/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php new file mode 100644 index 0000000..96e2284 --- /dev/null +++ b/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php @@ -0,0 +1,16 @@ +detailedDescription = $details; + } +} diff --git a/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php b/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php new file mode 100644 index 0000000..bcaefb6 --- /dev/null +++ b/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php @@ -0,0 +1,16 @@ +exception = $exception; + + } + public function code() : int + { + return 999; + } + + public function description() : string + { + return $this->exception->getMessage(); + } +} diff --git a/vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php b/vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php new file mode 100644 index 0000000..07ea8d2 --- /dev/null +++ b/vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php @@ -0,0 +1,16 @@ +detailedDescription; + } +} diff --git a/vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php b/vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php new file mode 100644 index 0000000..64f5f7c --- /dev/null +++ b/vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php @@ -0,0 +1,16 @@ +element = $element; + } + + public function code() : int + { + return 201; + } + + public function description() : string + { + return 'Unusual element found, wourld render invalid in majority of cases. Element found: ' . $this->element; + } +} diff --git a/vendor/egulias/email-validator/src/Result/Result.php b/vendor/egulias/email-validator/src/Result/Result.php new file mode 100644 index 0000000..fd13e6c --- /dev/null +++ b/vendor/egulias/email-validator/src/Result/Result.php @@ -0,0 +1,27 @@ +reason = new ReasonSpoofEmail(); + parent::__construct($this->reason, ''); + } +} diff --git a/vendor/egulias/email-validator/src/Result/ValidEmail.php b/vendor/egulias/email-validator/src/Result/ValidEmail.php new file mode 100644 index 0000000..fdc882f --- /dev/null +++ b/vendor/egulias/email-validator/src/Result/ValidEmail.php @@ -0,0 +1,27 @@ +dnsGetRecord = $dnsGetRecord; + } + + public function isValid(string $email, EmailLexer $emailLexer) : bool + { + // use the input to check DNS if we cannot extract something similar to a domain + $host = $email; + + // Arguable pattern to extract the domain. Not aiming to validate the domain nor the email + if (false !== $lastAtPos = strrpos($email, '@')) { + $host = substr($email, $lastAtPos + 1); + } + + // Get the domain parts + $hostParts = explode('.', $host); + + $isLocalDomain = count($hostParts) <= 1; + $isReservedTopLevel = in_array($hostParts[(count($hostParts) - 1)], self::RESERVED_DNS_TOP_LEVEL_NAMES, true); + + // Exclude reserved top level DNS names + if ($isLocalDomain || $isReservedTopLevel) { + $this->error = new InvalidEmail(new LocalOrReservedDomain(), $host); + return false; + } + + return $this->checkDns($host); + } + + public function getError() : ?InvalidEmail + { + return $this->error; + } + + public function getWarnings() : array + { + return $this->warnings; + } + + /** + * @param string $host + * + * @return bool + */ + protected function checkDns($host) + { + $variant = INTL_IDNA_VARIANT_UTS46; + + $host = rtrim(idn_to_ascii($host, IDNA_DEFAULT, $variant), '.') . '.'; + + return $this->validateDnsRecords($host); + } + + + /** + * Validate the DNS records for given host. + * + * @param string $host A set of DNS records in the format returned by dns_get_record. + * + * @return bool True on success. + */ + private function validateDnsRecords($host) : bool + { + $dnsRecordsResult = $this->dnsGetRecord->getRecords($host, static::DNS_RECORD_TYPES_TO_CHECK); + + if ($dnsRecordsResult->withError()) { + $this->error = new InvalidEmail(new UnableToGetDNSRecord(), ''); + return false; + } + + $dnsRecords = $dnsRecordsResult->getRecords(); + + // No MX, A or AAAA DNS records + if ($dnsRecords === []) { + $this->error = new InvalidEmail(new ReasonNoDNSRecord(), ''); + return false; + } + + // For each DNS record + foreach ($dnsRecords as $dnsRecord) { + if (!$this->validateMXRecord($dnsRecord)) { + // No MX records (fallback to A or AAAA records) + if (empty($this->mxRecords)) { + $this->warnings[NoDNSMXRecord::CODE] = new NoDNSMXRecord(); + } + return false; + } + } + return true; + } + + /** + * Validate an MX record + * + * @param array $dnsRecord Given DNS record. + * + * @return bool True if valid. + */ + private function validateMxRecord($dnsRecord) : bool + { + if (!isset($dnsRecord['type'])) { + $this->error = new InvalidEmail(new ReasonNoDNSRecord(), ''); + return false; + } + + if ($dnsRecord['type'] !== 'MX') { + return true; + } + + // "Null MX" record indicates the domain accepts no mail (https://tools.ietf.org/html/rfc7505) + if (empty($dnsRecord['target']) || $dnsRecord['target'] === '.') { + $this->error = new InvalidEmail(new DomainAcceptsNoMail(), ""); + return false; + } + + $this->mxRecords[] = $dnsRecord; + + return true; + } +} diff --git a/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php b/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php new file mode 100644 index 0000000..f493c57 --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php @@ -0,0 +1,28 @@ +records = $records; + $this->error = $error; + } + + public function getRecords() : array + { + return $this->records; + } + + public function withError() : bool + { + return $this->error; + } + + +} diff --git a/vendor/egulias/email-validator/src/Validation/EmailValidation.php b/vendor/egulias/email-validator/src/Validation/EmailValidation.php new file mode 100644 index 0000000..1bcc0a7 --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/EmailValidation.php @@ -0,0 +1,34 @@ +setChecks(Spoofchecker::SINGLE_SCRIPT); + + if ($checker->isSuspicious($email)) { + $this->error = new SpoofEmail(); + } + + return $this->error === null; + } + + /** + * @return InvalidEmail + */ + public function getError() : ?InvalidEmail + { + return $this->error; + } + + public function getWarnings() : array + { + return []; + } +} diff --git a/vendor/egulias/email-validator/src/Validation/MessageIDValidation.php b/vendor/egulias/email-validator/src/Validation/MessageIDValidation.php new file mode 100644 index 0000000..0e02043 --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/MessageIDValidation.php @@ -0,0 +1,51 @@ +parse($email); + $this->warnings = $parser->getWarnings(); + if ($result->isInvalid()) { + /** @psalm-suppress PropertyTypeCoercion */ + $this->error = $result; + return false; + } + } catch (\Exception $invalid) { + $this->error = new InvalidEmail(new ExceptionFound($invalid), ''); + return false; + } + + return true; + } + + public function getWarnings(): array + { + return $this->warnings; + } + + public function getError(): ?InvalidEmail + { + return $this->error; + } +} diff --git a/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php b/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php new file mode 100644 index 0000000..abafe75 --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php @@ -0,0 +1,117 @@ +validations = $validations; + $this->mode = $mode; + } + + /** + * {@inheritdoc} + */ + public function isValid(string $email, EmailLexer $emailLexer) : bool + { + $result = true; + foreach ($this->validations as $validation) { + $emailLexer->reset(); + $validationResult = $validation->isValid($email, $emailLexer); + $result = $result && $validationResult; + $this->warnings = array_merge($this->warnings, $validation->getWarnings()); + if (!$validationResult) { + $this->processError($validation); + } + + if ($this->shouldStop($result)) { + break; + } + } + + return $result; + } + + private function initErrorStorage() : void + { + if (null === $this->error) { + $this->error = new MultipleErrors(); + } + } + + private function processError(EmailValidation $validation) : void + { + if (null !== $validation->getError()) { + $this->initErrorStorage(); + /** @psalm-suppress PossiblyNullReference */ + $this->error->addReason($validation->getError()->reason()); + } + } + + private function shouldStop(bool $result) : bool + { + return !$result && $this->mode === self::STOP_ON_ERROR; + } + + /** + * Returns the validation errors. + */ + public function getError() : ?InvalidEmail + { + return $this->error; + } + + /** + * {@inheritdoc} + */ + public function getWarnings() : array + { + return $this->warnings; + } +} diff --git a/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php b/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php new file mode 100644 index 0000000..06885ed --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php @@ -0,0 +1,41 @@ +getWarnings())) { + return true; + } + + $this->error = new InvalidEmail(new RFCWarnings(), ''); + + return false; + } + + /** + * {@inheritdoc} + */ + public function getError() : ?InvalidEmail + { + return $this->error ?: parent::getError(); + } +} diff --git a/vendor/egulias/email-validator/src/Validation/RFCValidation.php b/vendor/egulias/email-validator/src/Validation/RFCValidation.php new file mode 100644 index 0000000..e2c27ba --- /dev/null +++ b/vendor/egulias/email-validator/src/Validation/RFCValidation.php @@ -0,0 +1,55 @@ +parser = new EmailParser($emailLexer); + try { + $result = $this->parser->parse($email); + $this->warnings = $this->parser->getWarnings(); + if ($result->isInvalid()) { + /** @psalm-suppress PropertyTypeCoercion */ + $this->error = $result; + return false; + } + } catch (\Exception $invalid) { + $this->error = new InvalidEmail(new ExceptionFound($invalid), ''); + return false; + } + + return true; + } + + public function getError() : ?InvalidEmail + { + return $this->error; + } + + public function getWarnings() : array + { + return $this->warnings; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/AddressLiteral.php b/vendor/egulias/email-validator/src/Warning/AddressLiteral.php new file mode 100644 index 0000000..474ff0e --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/AddressLiteral.php @@ -0,0 +1,14 @@ +message = 'Address literal in domain part'; + $this->rfcNumber = 5321; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php b/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php new file mode 100644 index 0000000..8bac12b --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php @@ -0,0 +1,13 @@ +message = "Deprecated folding white space near @"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php b/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php new file mode 100644 index 0000000..ba57601 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php @@ -0,0 +1,13 @@ +message = 'Folding whites space followed by folding white space'; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/Comment.php b/vendor/egulias/email-validator/src/Warning/Comment.php new file mode 100644 index 0000000..6508295 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/Comment.php @@ -0,0 +1,13 @@ +message = "Comments found in this email"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php b/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php new file mode 100644 index 0000000..a257807 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php @@ -0,0 +1,13 @@ +message = 'Deprecated comments'; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/DomainLiteral.php b/vendor/egulias/email-validator/src/Warning/DomainLiteral.php new file mode 100644 index 0000000..034388c --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/DomainLiteral.php @@ -0,0 +1,14 @@ +message = 'Domain Literal'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/EmailTooLong.php b/vendor/egulias/email-validator/src/Warning/EmailTooLong.php new file mode 100644 index 0000000..d25ad12 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/EmailTooLong.php @@ -0,0 +1,15 @@ +message = 'Email is too long, exceeds ' . EmailParser::EMAIL_MAX_LENGTH; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php b/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php new file mode 100644 index 0000000..3ecd5bc --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php @@ -0,0 +1,14 @@ +message = 'Bad char in IPV6 domain literal'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php b/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php new file mode 100644 index 0000000..3f0c2f2 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php @@ -0,0 +1,14 @@ +message = ':: found at the end of the domain literal'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php b/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php new file mode 100644 index 0000000..742fb3b --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php @@ -0,0 +1,14 @@ +message = ':: found at the start of the domain literal'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php b/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php new file mode 100644 index 0000000..59c3037 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php @@ -0,0 +1,14 @@ +message = 'Deprecated form of IPV6'; + $this->rfcNumber = 5321; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php b/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php new file mode 100644 index 0000000..d406602 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php @@ -0,0 +1,14 @@ +message = 'Double colon found after IPV6 tag'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php b/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php new file mode 100644 index 0000000..551bc3a --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php @@ -0,0 +1,14 @@ +message = 'Group count is not IPV6 valid'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php b/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php new file mode 100644 index 0000000..7f8a410 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php @@ -0,0 +1,14 @@ +message = 'Reached the maximum number of IPV6 groups allowed'; + $this->rfcNumber = 5321; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/LocalTooLong.php b/vendor/egulias/email-validator/src/Warning/LocalTooLong.php new file mode 100644 index 0000000..b46b874 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/LocalTooLong.php @@ -0,0 +1,15 @@ +message = 'Local part is too long, exceeds 64 chars (octets)'; + $this->rfcNumber = 5322; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php b/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php new file mode 100644 index 0000000..bddb96b --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php @@ -0,0 +1,14 @@ +message = 'No MX DSN record was found for this email'; + $this->rfcNumber = 5321; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php b/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php new file mode 100644 index 0000000..412fd49 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php @@ -0,0 +1,14 @@ +rfcNumber = 5322; + $this->message = 'Obsolete DTEXT in domain literal'; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/QuotedPart.php b/vendor/egulias/email-validator/src/Warning/QuotedPart.php new file mode 100644 index 0000000..afa1f9e --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/QuotedPart.php @@ -0,0 +1,17 @@ +message = "Deprecated Quoted String found between $prevToken and $postToken"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/QuotedString.php b/vendor/egulias/email-validator/src/Warning/QuotedString.php new file mode 100644 index 0000000..c152ec2 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/QuotedString.php @@ -0,0 +1,17 @@ +message = "Quoted String found between $prevToken and $postToken"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/TLD.php b/vendor/egulias/email-validator/src/Warning/TLD.php new file mode 100644 index 0000000..10cec28 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/TLD.php @@ -0,0 +1,13 @@ +message = "RFC5321, TLD"; + } +} diff --git a/vendor/egulias/email-validator/src/Warning/Warning.php b/vendor/egulias/email-validator/src/Warning/Warning.php new file mode 100644 index 0000000..8b39d64 --- /dev/null +++ b/vendor/egulias/email-validator/src/Warning/Warning.php @@ -0,0 +1,47 @@ +message; + } + + /** + * @return int + */ + public function code() + { + return self::CODE; + } + + /** + * @return int + */ + public function RFCNumber() + { + return $this->rfcNumber; + } + + public function __toString() + { + return $this->message() . " rfc: " . $this->rfcNumber . "internal code: " . static::CODE; + } +} diff --git a/vendor/erusev/parsedown/.github/workflows/unit-tests.yaml b/vendor/erusev/parsedown/.github/workflows/unit-tests.yaml new file mode 100644 index 0000000..c00148d --- /dev/null +++ b/vendor/erusev/parsedown/.github/workflows/unit-tests.yaml @@ -0,0 +1,37 @@ +on: + - push + - pull_request + +jobs: + phpunit: + runs-on: ubuntu-latest + + strategy: + matrix: + php: + - '7.1' + - '7.2' + - '7.3' + - '7.4' + - '8.0' + - '8.1' + - '8.2' + - '8.3' + - '8.4' + + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '${{ matrix.php }}' + + - name: Install dependencies + run: composer install + + - name: Run tests + run: | + vendor/bin/phpunit + vendor/bin/phpunit test/CommonMarkTestWeak.php || true diff --git a/vendor/erusev/parsedown/LICENSE.txt b/vendor/erusev/parsedown/LICENSE.txt new file mode 100644 index 0000000..8e7c764 --- /dev/null +++ b/vendor/erusev/parsedown/LICENSE.txt @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013-2018 Emanuil Rusev, erusev.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/erusev/parsedown/Parsedown.php b/vendor/erusev/parsedown/Parsedown.php new file mode 100644 index 0000000..38edfe9 --- /dev/null +++ b/vendor/erusev/parsedown/Parsedown.php @@ -0,0 +1,1994 @@ +textElements($text); + + # convert to markup + $markup = $this->elements($Elements); + + # trim line breaks + $markup = trim($markup, "\n"); + + return $markup; + } + + protected function textElements($text) + { + # make sure no definitions are set + $this->DefinitionData = array(); + + # standardize line breaks + $text = str_replace(array("\r\n", "\r"), "\n", $text); + + # remove surrounding line breaks + $text = trim($text, "\n"); + + # split text into lines + $lines = explode("\n", $text); + + # iterate through lines to identify blocks + return $this->linesElements($lines); + } + + # + # Setters + # + + function setBreaksEnabled($breaksEnabled) + { + $this->breaksEnabled = $breaksEnabled; + + return $this; + } + + protected $breaksEnabled; + + function setMarkupEscaped($markupEscaped) + { + $this->markupEscaped = $markupEscaped; + + return $this; + } + + protected $markupEscaped; + + function setUrlsLinked($urlsLinked) + { + $this->urlsLinked = $urlsLinked; + + return $this; + } + + protected $urlsLinked = true; + + function setSafeMode($safeMode) + { + $this->safeMode = (bool) $safeMode; + + return $this; + } + + protected $safeMode; + + function setStrictMode($strictMode) + { + $this->strictMode = (bool) $strictMode; + + return $this; + } + + protected $strictMode; + + protected $safeLinksWhitelist = array( + 'http://', + 'https://', + 'ftp://', + 'ftps://', + 'mailto:', + 'tel:', + 'data:image/png;base64,', + 'data:image/gif;base64,', + 'data:image/jpeg;base64,', + 'irc:', + 'ircs:', + 'git:', + 'ssh:', + 'news:', + 'steam:', + ); + + # + # Lines + # + + protected $BlockTypes = array( + '#' => array('Header'), + '*' => array('Rule', 'List'), + '+' => array('List'), + '-' => array('SetextHeader', 'Table', 'Rule', 'List'), + '0' => array('List'), + '1' => array('List'), + '2' => array('List'), + '3' => array('List'), + '4' => array('List'), + '5' => array('List'), + '6' => array('List'), + '7' => array('List'), + '8' => array('List'), + '9' => array('List'), + ':' => array('Table'), + '<' => array('Comment', 'Markup'), + '=' => array('SetextHeader'), + '>' => array('Quote'), + '[' => array('Reference'), + '_' => array('Rule'), + '`' => array('FencedCode'), + '|' => array('Table'), + '~' => array('FencedCode'), + ); + + # ~ + + protected $unmarkedBlockTypes = array( + 'Code', + ); + + # + # Blocks + # + + protected function lines(array $lines) + { + return $this->elements($this->linesElements($lines)); + } + + protected function linesElements(array $lines) + { + $Elements = array(); + $CurrentBlock = null; + + foreach ($lines as $line) + { + if (chop($line) === '') + { + if (isset($CurrentBlock)) + { + $CurrentBlock['interrupted'] = (isset($CurrentBlock['interrupted']) + ? $CurrentBlock['interrupted'] + 1 : 1 + ); + } + + continue; + } + + while (($beforeTab = strstr($line, "\t", true)) !== false) + { + $shortage = 4 - mb_strlen($beforeTab, 'utf-8') % 4; + + $line = $beforeTab + . str_repeat(' ', $shortage) + . substr($line, strlen($beforeTab) + 1) + ; + } + + $indent = strspn($line, ' '); + + $text = $indent > 0 ? substr($line, $indent) : $line; + + # ~ + + $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); + + # ~ + + if (isset($CurrentBlock['continuable'])) + { + $methodName = 'block' . $CurrentBlock['type'] . 'Continue'; + $Block = $this->$methodName($Line, $CurrentBlock); + + if (isset($Block)) + { + $CurrentBlock = $Block; + + continue; + } + else + { + if ($this->isBlockCompletable($CurrentBlock['type'])) + { + $methodName = 'block' . $CurrentBlock['type'] . 'Complete'; + $CurrentBlock = $this->$methodName($CurrentBlock); + } + } + } + + # ~ + + $marker = $text[0]; + + # ~ + + $blockTypes = $this->unmarkedBlockTypes; + + if (isset($this->BlockTypes[$marker])) + { + foreach ($this->BlockTypes[$marker] as $blockType) + { + $blockTypes []= $blockType; + } + } + + # + # ~ + + foreach ($blockTypes as $blockType) + { + $Block = $this->{"block$blockType"}($Line, $CurrentBlock); + + if (isset($Block)) + { + $Block['type'] = $blockType; + + if ( ! isset($Block['identified'])) + { + if (isset($CurrentBlock)) + { + $Elements[] = $this->extractElement($CurrentBlock); + } + + $Block['identified'] = true; + } + + if ($this->isBlockContinuable($blockType)) + { + $Block['continuable'] = true; + } + + $CurrentBlock = $Block; + + continue 2; + } + } + + # ~ + + if (isset($CurrentBlock) and $CurrentBlock['type'] === 'Paragraph') + { + $Block = $this->paragraphContinue($Line, $CurrentBlock); + } + + if (isset($Block)) + { + $CurrentBlock = $Block; + } + else + { + if (isset($CurrentBlock)) + { + $Elements[] = $this->extractElement($CurrentBlock); + } + + $CurrentBlock = $this->paragraph($Line); + + $CurrentBlock['identified'] = true; + } + } + + # ~ + + if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) + { + $methodName = 'block' . $CurrentBlock['type'] . 'Complete'; + $CurrentBlock = $this->$methodName($CurrentBlock); + } + + # ~ + + if (isset($CurrentBlock)) + { + $Elements[] = $this->extractElement($CurrentBlock); + } + + # ~ + + return $Elements; + } + + protected function extractElement(array $Component) + { + if ( ! isset($Component['element'])) + { + if (isset($Component['markup'])) + { + $Component['element'] = array('rawHtml' => $Component['markup']); + } + elseif (isset($Component['hidden'])) + { + $Component['element'] = array(); + } + } + + return $Component['element']; + } + + protected function isBlockContinuable($Type) + { + return method_exists($this, 'block' . $Type . 'Continue'); + } + + protected function isBlockCompletable($Type) + { + return method_exists($this, 'block' . $Type . 'Complete'); + } + + # + # Code + + protected function blockCode($Line, $Block = null) + { + if (isset($Block) and $Block['type'] === 'Paragraph' and ! isset($Block['interrupted'])) + { + return; + } + + if ($Line['indent'] >= 4) + { + $text = substr($Line['body'], 4); + + $Block = array( + 'element' => array( + 'name' => 'pre', + 'element' => array( + 'name' => 'code', + 'text' => $text, + ), + ), + ); + + return $Block; + } + } + + protected function blockCodeContinue($Line, $Block) + { + if ($Line['indent'] >= 4) + { + if (isset($Block['interrupted'])) + { + $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']); + + unset($Block['interrupted']); + } + + $Block['element']['element']['text'] .= "\n"; + + $text = substr($Line['body'], 4); + + $Block['element']['element']['text'] .= $text; + + return $Block; + } + } + + protected function blockCodeComplete($Block) + { + return $Block; + } + + # + # Comment + + protected function blockComment($Line) + { + if ($this->markupEscaped or $this->safeMode) + { + return; + } + + if (strpos($Line['text'], '') !== false) + { + $Block['closed'] = true; + } + + return $Block; + } + } + + protected function blockCommentContinue($Line, array $Block) + { + if (isset($Block['closed'])) + { + return; + } + + $Block['element']['rawHtml'] .= "\n" . $Line['body']; + + if (strpos($Line['text'], '-->') !== false) + { + $Block['closed'] = true; + } + + return $Block; + } + + # + # Fenced Code + + protected function blockFencedCode($Line) + { + $marker = $Line['text'][0]; + + $openerLength = strspn($Line['text'], $marker); + + if ($openerLength < 3) + { + return; + } + + $infostring = trim(substr($Line['text'], $openerLength), "\t "); + + if (strpos($infostring, '`') !== false) + { + return; + } + + $Element = array( + 'name' => 'code', + 'text' => '', + ); + + if ($infostring !== '') + { + /** + * https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#classes + * Every HTML element may have a class attribute specified. + * The attribute, if specified, must have a value that is a set + * of space-separated tokens representing the various classes + * that the element belongs to. + * [...] + * The space characters, for the purposes of this specification, + * are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), + * U+000A LINE FEED (LF), U+000C FORM FEED (FF), and + * U+000D CARRIAGE RETURN (CR). + */ + $language = substr($infostring, 0, strcspn($infostring, " \t\n\f\r")); + + $Element['attributes'] = array('class' => "language-$language"); + } + + $Block = array( + 'char' => $marker, + 'openerLength' => $openerLength, + 'element' => array( + 'name' => 'pre', + 'element' => $Element, + ), + ); + + return $Block; + } + + protected function blockFencedCodeContinue($Line, $Block) + { + if (isset($Block['complete'])) + { + return; + } + + if (isset($Block['interrupted'])) + { + $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']); + + unset($Block['interrupted']); + } + + if (($len = strspn($Line['text'], $Block['char'])) >= $Block['openerLength'] + and chop(substr($Line['text'], $len), ' ') === '' + ) { + $Block['element']['element']['text'] = substr($Block['element']['element']['text'], 1); + + $Block['complete'] = true; + + return $Block; + } + + $Block['element']['element']['text'] .= "\n" . $Line['body']; + + return $Block; + } + + protected function blockFencedCodeComplete($Block) + { + return $Block; + } + + # + # Header + + protected function blockHeader($Line) + { + $level = strspn($Line['text'], '#'); + + if ($level > 6) + { + return; + } + + $text = trim($Line['text'], '#'); + + if ($this->strictMode and isset($text[0]) and $text[0] !== ' ') + { + return; + } + + $text = trim($text, ' '); + + $Block = array( + 'element' => array( + 'name' => 'h' . $level, + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $text, + 'destination' => 'elements', + ) + ), + ); + + return $Block; + } + + # + # List + + protected function blockList($Line, ?array $CurrentBlock = null) + { + list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]{1,9}+[.\)]'); + + if (preg_match('/^('.$pattern.'([ ]++|$))(.*+)/', $Line['text'], $matches)) + { + $contentIndent = strlen($matches[2]); + + if ($contentIndent >= 5) + { + $contentIndent -= 1; + $matches[1] = substr($matches[1], 0, -$contentIndent); + $matches[3] = str_repeat(' ', $contentIndent) . $matches[3]; + } + elseif ($contentIndent === 0) + { + $matches[1] .= ' '; + } + + $markerWithoutWhitespace = strstr($matches[1], ' ', true); + + $Block = array( + 'indent' => $Line['indent'], + 'pattern' => $pattern, + 'data' => array( + 'type' => $name, + 'marker' => $matches[1], + 'markerType' => ($name === 'ul' ? $markerWithoutWhitespace : substr($markerWithoutWhitespace, -1)), + ), + 'element' => array( + 'name' => $name, + 'elements' => array(), + ), + ); + $Block['data']['markerTypeRegex'] = preg_quote($Block['data']['markerType'], '/'); + + if ($name === 'ol') + { + $listStart = ltrim(strstr($matches[1], $Block['data']['markerType'], true), '0') ?: '0'; + + if ($listStart !== '1') + { + if ( + isset($CurrentBlock) + and $CurrentBlock['type'] === 'Paragraph' + and ! isset($CurrentBlock['interrupted']) + ) { + return; + } + + $Block['element']['attributes'] = array('start' => $listStart); + } + } + + $Block['li'] = array( + 'name' => 'li', + 'handler' => array( + 'function' => 'li', + 'argument' => !empty($matches[3]) ? array($matches[3]) : array(), + 'destination' => 'elements' + ) + ); + + $Block['element']['elements'] []= & $Block['li']; + + return $Block; + } + } + + protected function blockListContinue($Line, array $Block) + { + if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument'])) + { + return null; + } + + $requiredIndent = ($Block['indent'] + strlen($Block['data']['marker'])); + + if ($Line['indent'] < $requiredIndent + and ( + ( + $Block['data']['type'] === 'ol' + and preg_match('/^[0-9]++'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) + ) or ( + $Block['data']['type'] === 'ul' + and preg_match('/^'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) + ) + ) + ) { + if (isset($Block['interrupted'])) + { + $Block['li']['handler']['argument'] []= ''; + + $Block['loose'] = true; + + unset($Block['interrupted']); + } + + unset($Block['li']); + + $text = isset($matches[1]) ? $matches[1] : ''; + + $Block['indent'] = $Line['indent']; + + $Block['li'] = array( + 'name' => 'li', + 'handler' => array( + 'function' => 'li', + 'argument' => array($text), + 'destination' => 'elements' + ) + ); + + $Block['element']['elements'] []= & $Block['li']; + + return $Block; + } + elseif ($Line['indent'] < $requiredIndent and $this->blockList($Line)) + { + return null; + } + + if ($Line['text'][0] === '[' and $this->blockReference($Line)) + { + return $Block; + } + + if ($Line['indent'] >= $requiredIndent) + { + if (isset($Block['interrupted'])) + { + $Block['li']['handler']['argument'] []= ''; + + $Block['loose'] = true; + + unset($Block['interrupted']); + } + + $text = substr($Line['body'], $requiredIndent); + + $Block['li']['handler']['argument'] []= $text; + + return $Block; + } + + if ( ! isset($Block['interrupted'])) + { + $text = preg_replace('/^[ ]{0,'.$requiredIndent.'}+/', '', $Line['body']); + + $Block['li']['handler']['argument'] []= $text; + + return $Block; + } + } + + protected function blockListComplete(array $Block) + { + if (isset($Block['loose'])) + { + foreach ($Block['element']['elements'] as &$li) + { + if (end($li['handler']['argument']) !== '') + { + $li['handler']['argument'] []= ''; + } + } + } + + return $Block; + } + + # + # Quote + + protected function blockQuote($Line) + { + if (preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) + { + $Block = array( + 'element' => array( + 'name' => 'blockquote', + 'handler' => array( + 'function' => 'linesElements', + 'argument' => (array) $matches[1], + 'destination' => 'elements', + ) + ), + ); + + return $Block; + } + } + + protected function blockQuoteContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) + { + return; + } + + if ($Line['text'][0] === '>' and preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) + { + $Block['element']['handler']['argument'] []= $matches[1]; + + return $Block; + } + + if ( ! isset($Block['interrupted'])) + { + $Block['element']['handler']['argument'] []= $Line['text']; + + return $Block; + } + } + + # + # Rule + + protected function blockRule($Line) + { + $marker = $Line['text'][0]; + + if (substr_count($Line['text'], $marker) >= 3 and chop($Line['text'], " $marker") === '') + { + $Block = array( + 'element' => array( + 'name' => 'hr', + ), + ); + + return $Block; + } + } + + # + # Setext + + protected function blockSetextHeader($Line, ?array $Block = null) + { + if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) + { + return; + } + + if ($Line['indent'] < 4 and chop(chop($Line['text'], ' '), $Line['text'][0]) === '') + { + $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; + + return $Block; + } + } + + # + # Markup + + protected function blockMarkup($Line) + { + if ($this->markupEscaped or $this->safeMode) + { + return; + } + + if (preg_match('/^<[\/]?+(\w*)(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+(\/)?>/', $Line['text'], $matches)) + { + $element = strtolower($matches[1]); + + if (in_array($element, $this->textLevelElements)) + { + return; + } + + $Block = array( + 'name' => $matches[1], + 'element' => array( + 'rawHtml' => $Line['text'], + 'autobreak' => true, + ), + ); + + return $Block; + } + } + + protected function blockMarkupContinue($Line, array $Block) + { + if (isset($Block['closed']) or isset($Block['interrupted'])) + { + return; + } + + $Block['element']['rawHtml'] .= "\n" . $Line['body']; + + return $Block; + } + + # + # Reference + + protected function blockReference($Line) + { + if (strpos($Line['text'], ']') !== false + and preg_match('/^\[(.+?)\]:[ ]*+?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/', $Line['text'], $matches) + ) { + $id = strtolower($matches[1]); + + $Data = array( + 'url' => $matches[2], + 'title' => isset($matches[3]) ? $matches[3] : null, + ); + + $this->DefinitionData['Reference'][$id] = $Data; + + $Block = array( + 'element' => array(), + ); + + return $Block; + } + } + + # + # Table + + protected function blockTable($Line, ?array $Block = null) + { + if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) + { + return; + } + + if ( + strpos($Block['element']['handler']['argument'], '|') === false + and strpos($Line['text'], '|') === false + and strpos($Line['text'], ':') === false + or strpos($Block['element']['handler']['argument'], "\n") !== false + ) { + return; + } + + if (chop($Line['text'], ' -:|') !== '') + { + return; + } + + $alignments = array(); + + $divider = $Line['text']; + + $divider = trim($divider); + $divider = trim($divider, '|'); + + $dividerCells = explode('|', $divider); + + foreach ($dividerCells as $dividerCell) + { + $dividerCell = trim($dividerCell); + + if ($dividerCell === '') + { + return; + } + + $alignment = null; + + if ($dividerCell[0] === ':') + { + $alignment = 'left'; + } + + if (substr($dividerCell, - 1) === ':') + { + $alignment = $alignment === 'left' ? 'center' : 'right'; + } + + $alignments []= $alignment; + } + + # ~ + + $HeaderElements = array(); + + $header = $Block['element']['handler']['argument']; + + $header = trim($header); + $header = trim($header, '|'); + + $headerCells = explode('|', $header); + + if (count($headerCells) !== count($alignments)) + { + return; + } + + foreach ($headerCells as $index => $headerCell) + { + $headerCell = trim($headerCell); + + $HeaderElement = array( + 'name' => 'th', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $headerCell, + 'destination' => 'elements', + ) + ); + + if (isset($alignments[$index])) + { + $alignment = $alignments[$index]; + + $HeaderElement['attributes'] = array( + 'style' => "text-align: $alignment;", + ); + } + + $HeaderElements []= $HeaderElement; + } + + # ~ + + $Block = array( + 'alignments' => $alignments, + 'identified' => true, + 'element' => array( + 'name' => 'table', + 'elements' => array(), + ), + ); + + $Block['element']['elements'] []= array( + 'name' => 'thead', + ); + + $Block['element']['elements'] []= array( + 'name' => 'tbody', + 'elements' => array(), + ); + + $Block['element']['elements'][0]['elements'] []= array( + 'name' => 'tr', + 'elements' => $HeaderElements, + ); + + return $Block; + } + + protected function blockTableContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) + { + return; + } + + if (count($Block['alignments']) === 1 or $Line['text'][0] === '|' or strpos($Line['text'], '|')) + { + $Elements = array(); + + $row = $Line['text']; + + $row = trim($row); + $row = trim($row, '|'); + + preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]++`|`)++/', $row, $matches); + + $cells = array_slice($matches[0], 0, count($Block['alignments'])); + + foreach ($cells as $index => $cell) + { + $cell = trim($cell); + + $Element = array( + 'name' => 'td', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $cell, + 'destination' => 'elements', + ) + ); + + if (isset($Block['alignments'][$index])) + { + $Element['attributes'] = array( + 'style' => 'text-align: ' . $Block['alignments'][$index] . ';', + ); + } + + $Elements []= $Element; + } + + $Element = array( + 'name' => 'tr', + 'elements' => $Elements, + ); + + $Block['element']['elements'][1]['elements'] []= $Element; + + return $Block; + } + } + + # + # ~ + # + + protected function paragraph($Line) + { + return array( + 'type' => 'Paragraph', + 'element' => array( + 'name' => 'p', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $Line['text'], + 'destination' => 'elements', + ), + ), + ); + } + + protected function paragraphContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) + { + return; + } + + $Block['element']['handler']['argument'] .= "\n".$Line['text']; + + return $Block; + } + + # + # Inline Elements + # + + protected $InlineTypes = array( + '!' => array('Image'), + '&' => array('SpecialCharacter'), + '*' => array('Emphasis'), + ':' => array('Url'), + '<' => array('UrlTag', 'EmailTag', 'Markup'), + '[' => array('Link'), + '_' => array('Emphasis'), + '`' => array('Code'), + '~' => array('Strikethrough'), + '\\' => array('EscapeSequence'), + ); + + # ~ + + protected $inlineMarkerList = '!*_&[:<`~\\'; + + # + # ~ + # + + public function line($text, $nonNestables = array()) + { + return $this->elements($this->lineElements($text, $nonNestables)); + } + + protected function lineElements($text, $nonNestables = array()) + { + # standardize line breaks + $text = str_replace(array("\r\n", "\r"), "\n", $text); + + $Elements = array(); + + $nonNestables = (empty($nonNestables) + ? array() + : array_combine($nonNestables, $nonNestables) + ); + + # $excerpt is based on the first occurrence of a marker + + while ($excerpt = strpbrk($text, $this->inlineMarkerList)) + { + $marker = $excerpt[0]; + + $markerPosition = strlen($text) - strlen($excerpt); + + $Excerpt = array('text' => $excerpt, 'context' => $text); + + foreach ($this->InlineTypes[$marker] as $inlineType) + { + # check to see if the current inline type is nestable in the current context + + if (isset($nonNestables[$inlineType])) + { + continue; + } + + $Inline = $this->{"inline$inlineType"}($Excerpt); + + if ( ! isset($Inline)) + { + continue; + } + + # makes sure that the inline belongs to "our" marker + + if (isset($Inline['position']) and $Inline['position'] > $markerPosition) + { + continue; + } + + # sets a default inline position + + if ( ! isset($Inline['position'])) + { + $Inline['position'] = $markerPosition; + } + + # cause the new element to 'inherit' our non nestables + + + $Inline['element']['nonNestables'] = isset($Inline['element']['nonNestables']) + ? array_merge($Inline['element']['nonNestables'], $nonNestables) + : $nonNestables + ; + + # the text that comes before the inline + $unmarkedText = substr($text, 0, $Inline['position']); + + # compile the unmarked text + $InlineText = $this->inlineText($unmarkedText); + $Elements[] = $InlineText['element']; + + # compile the inline + $Elements[] = $this->extractElement($Inline); + + # remove the examined text + $text = substr($text, $Inline['position'] + $Inline['extent']); + + continue 2; + } + + # the marker does not belong to an inline + + $unmarkedText = substr($text, 0, $markerPosition + 1); + + $InlineText = $this->inlineText($unmarkedText); + $Elements[] = $InlineText['element']; + + $text = substr($text, $markerPosition + 1); + } + + $InlineText = $this->inlineText($text); + $Elements[] = $InlineText['element']; + + foreach ($Elements as &$Element) + { + if ( ! isset($Element['autobreak'])) + { + $Element['autobreak'] = false; + } + } + + return $Elements; + } + + # + # ~ + # + + protected function inlineText($text) + { + $Inline = array( + 'extent' => strlen($text), + 'element' => array(), + ); + + $Inline['element']['elements'] = self::pregReplaceElements( + $this->breaksEnabled ? '/[ ]*+\n/' : '/(?:[ ]*+\\\\|[ ]{2,}+)\n/', + array( + array('name' => 'br'), + array('text' => "\n"), + ), + $text + ); + + return $Inline; + } + + protected function inlineCode($Excerpt) + { + $marker = $Excerpt['text'][0]; + + if (preg_match('/^(['.$marker.']++)[ ]*+(.+?)[ ]*+(? strlen($matches[0]), + 'element' => array( + 'name' => 'code', + 'text' => $text, + ), + ); + } + } + + protected function inlineEmailTag($Excerpt) + { + $hostnameLabel = '[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?'; + + $commonMarkEmail = '[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]++@' + . $hostnameLabel . '(?:\.' . $hostnameLabel . ')*'; + + if (strpos($Excerpt['text'], '>') !== false + and preg_match("/^<((mailto:)?$commonMarkEmail)>/i", $Excerpt['text'], $matches) + ){ + $url = $matches[1]; + + if ( ! isset($matches[2])) + { + $url = "mailto:$url"; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $matches[1], + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + protected function inlineEmphasis($Excerpt) + { + if ( ! isset($Excerpt['text'][1])) + { + return; + } + + $marker = $Excerpt['text'][0]; + + if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) + { + $emphasis = 'strong'; + } + elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) + { + $emphasis = 'em'; + } + else + { + return; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => $emphasis, + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $matches[1], + 'destination' => 'elements', + ) + ), + ); + } + + protected function inlineEscapeSequence($Excerpt) + { + if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) + { + return array( + 'element' => array('rawHtml' => $Excerpt['text'][1]), + 'extent' => 2, + ); + } + } + + protected function inlineImage($Excerpt) + { + if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') + { + return; + } + + $Excerpt['text']= substr($Excerpt['text'], 1); + + $Link = $this->inlineLink($Excerpt); + + if ($Link === null) + { + return; + } + + $Inline = array( + 'extent' => $Link['extent'] + 1, + 'element' => array( + 'name' => 'img', + 'attributes' => array( + 'src' => $Link['element']['attributes']['href'], + 'alt' => $Link['element']['handler']['argument'], + ), + 'autobreak' => true, + ), + ); + + $Inline['element']['attributes'] += $Link['element']['attributes']; + + unset($Inline['element']['attributes']['href']); + + return $Inline; + } + + protected function inlineLink($Excerpt) + { + $Element = array( + 'name' => 'a', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => null, + 'destination' => 'elements', + ), + 'nonNestables' => array('Url', 'Link'), + 'attributes' => array( + 'href' => null, + 'title' => null, + ), + ); + + $extent = 0; + + $remainder = $Excerpt['text']; + + if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches)) + { + $Element['handler']['argument'] = $matches[1]; + + $extent += strlen($matches[0]); + + $remainder = substr($remainder, $extent); + } + else + { + return; + } + + if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*+"|\'[^\']*+\'))?\s*+[)]/', $remainder, $matches)) + { + $Element['attributes']['href'] = $matches[1]; + + if (isset($matches[2])) + { + $Element['attributes']['title'] = substr($matches[2], 1, - 1); + } + + $extent += strlen($matches[0]); + } + else + { + if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) + { + $definition = strlen($matches[1]) ? $matches[1] : $Element['handler']['argument']; + $definition = strtolower($definition); + + $extent += strlen($matches[0]); + } + else + { + $definition = strtolower($Element['handler']['argument']); + } + + if ( ! isset($this->DefinitionData['Reference'][$definition])) + { + return; + } + + $Definition = $this->DefinitionData['Reference'][$definition]; + + $Element['attributes']['href'] = $Definition['url']; + $Element['attributes']['title'] = $Definition['title']; + } + + return array( + 'extent' => $extent, + 'element' => $Element, + ); + } + + protected function inlineMarkup($Excerpt) + { + if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false) + { + return; + } + + if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*+[ ]*+>/s', $Excerpt['text'], $matches)) + { + return array( + 'element' => array('rawHtml' => $matches[0]), + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) + { + return array( + 'element' => array('rawHtml' => $matches[0]), + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w[\w-]*+(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+\/?>/s', $Excerpt['text'], $matches)) + { + return array( + 'element' => array('rawHtml' => $matches[0]), + 'extent' => strlen($matches[0]), + ); + } + } + + protected function inlineSpecialCharacter($Excerpt) + { + if (substr($Excerpt['text'], 1, 1) !== ' ' and strpos($Excerpt['text'], ';') !== false + and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches) + ) { + return array( + 'element' => array('rawHtml' => '&' . $matches[1] . ';'), + 'extent' => strlen($matches[0]), + ); + } + + return; + } + + protected function inlineStrikethrough($Excerpt) + { + if ( ! isset($Excerpt['text'][1])) + { + return; + } + + if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) + { + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'del', + 'handler' => array( + 'function' => 'lineElements', + 'argument' => $matches[1], + 'destination' => 'elements', + ) + ), + ); + } + } + + protected function inlineUrl($Excerpt) + { + if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') + { + return; + } + + if (strpos($Excerpt['context'], 'http') !== false + and preg_match('/\bhttps?+:[\/]{2}[^\s<]+\b\/*+/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE) + ) { + $url = $matches[0][0]; + + $Inline = array( + 'extent' => strlen($matches[0][0]), + 'position' => $matches[0][1], + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + + return $Inline; + } + } + + protected function inlineUrlTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w++:\/{2}[^ >]++)>/i', $Excerpt['text'], $matches)) + { + $url = $matches[1]; + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + # ~ + + protected function unmarkedText($text) + { + $Inline = $this->inlineText($text); + return $this->element($Inline['element']); + } + + # + # Handlers + # + + protected function handle(array $Element) + { + if (isset($Element['handler'])) + { + if (!isset($Element['nonNestables'])) + { + $Element['nonNestables'] = array(); + } + + if (is_string($Element['handler'])) + { + $function = $Element['handler']; + $argument = $Element['text']; + unset($Element['text']); + $destination = 'rawHtml'; + } + else + { + $function = $Element['handler']['function']; + $argument = $Element['handler']['argument']; + $destination = $Element['handler']['destination']; + } + + $Element[$destination] = $this->{$function}($argument, $Element['nonNestables']); + + if ($destination === 'handler') + { + $Element = $this->handle($Element); + } + + unset($Element['handler']); + } + + return $Element; + } + + protected function handleElementRecursive(array $Element) + { + return $this->elementApplyRecursive(array($this, 'handle'), $Element); + } + + protected function handleElementsRecursive(array $Elements) + { + return $this->elementsApplyRecursive(array($this, 'handle'), $Elements); + } + + protected function elementApplyRecursive($closure, array $Element) + { + $Element = call_user_func($closure, $Element); + + if (isset($Element['elements'])) + { + $Element['elements'] = $this->elementsApplyRecursive($closure, $Element['elements']); + } + elseif (isset($Element['element'])) + { + $Element['element'] = $this->elementApplyRecursive($closure, $Element['element']); + } + + return $Element; + } + + protected function elementApplyRecursiveDepthFirst($closure, array $Element) + { + if (isset($Element['elements'])) + { + $Element['elements'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['elements']); + } + elseif (isset($Element['element'])) + { + $Element['element'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['element']); + } + + $Element = call_user_func($closure, $Element); + + return $Element; + } + + protected function elementsApplyRecursive($closure, array $Elements) + { + foreach ($Elements as &$Element) + { + $Element = $this->elementApplyRecursive($closure, $Element); + } + + return $Elements; + } + + protected function elementsApplyRecursiveDepthFirst($closure, array $Elements) + { + foreach ($Elements as &$Element) + { + $Element = $this->elementApplyRecursiveDepthFirst($closure, $Element); + } + + return $Elements; + } + + protected function element(array $Element) + { + if ($this->safeMode) + { + $Element = $this->sanitiseElement($Element); + } + + # identity map if element has no handler + $Element = $this->handle($Element); + + $hasName = isset($Element['name']); + + $markup = ''; + + if ($hasName) + { + $markup .= '<' . $Element['name']; + + if (isset($Element['attributes'])) + { + foreach ($Element['attributes'] as $name => $value) + { + if ($value === null) + { + continue; + } + + $markup .= " $name=\"".self::escape($value).'"'; + } + } + } + + $permitRawHtml = false; + + if (isset($Element['text'])) + { + $text = $Element['text']; + } + // very strongly consider an alternative if you're writing an + // extension + elseif (isset($Element['rawHtml'])) + { + $text = $Element['rawHtml']; + + $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode']; + $permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode; + } + + $hasContent = isset($text) || isset($Element['element']) || isset($Element['elements']); + + if ($hasContent) + { + $markup .= $hasName ? '>' : ''; + + if (isset($Element['elements'])) + { + $markup .= $this->elements($Element['elements']); + } + elseif (isset($Element['element'])) + { + $markup .= $this->element($Element['element']); + } + else + { + if (!$permitRawHtml) + { + $markup .= self::escape($text, true); + } + else + { + $markup .= $text; + } + } + + $markup .= $hasName ? '' : ''; + } + elseif ($hasName) + { + $markup .= ' />'; + } + + return $markup; + } + + protected function elements(array $Elements) + { + $markup = ''; + + $autoBreak = true; + + foreach ($Elements as $Element) + { + if (empty($Element)) + { + continue; + } + + $autoBreakNext = (isset($Element['autobreak']) + ? $Element['autobreak'] : isset($Element['name']) + ); + // (autobreak === false) covers both sides of an element + $autoBreak = !$autoBreak ? $autoBreak : $autoBreakNext; + + $markup .= ($autoBreak ? "\n" : '') . $this->element($Element); + $autoBreak = $autoBreakNext; + } + + $markup .= $autoBreak ? "\n" : ''; + + return $markup; + } + + # ~ + + protected function li($lines) + { + $Elements = $this->linesElements($lines); + + if ( ! in_array('', $lines) + and isset($Elements[0]) and isset($Elements[0]['name']) + and $Elements[0]['name'] === 'p' + ) { + unset($Elements[0]['name']); + } + + return $Elements; + } + + # + # AST Convenience + # + + /** + * Replace occurrences $regexp with $Elements in $text. Return an array of + * elements representing the replacement. + */ + protected static function pregReplaceElements($regexp, $Elements, $text) + { + $newElements = array(); + + while (preg_match($regexp, $text, $matches, PREG_OFFSET_CAPTURE)) + { + $offset = $matches[0][1]; + $before = substr($text, 0, $offset); + $after = substr($text, $offset + strlen($matches[0][0])); + + $newElements[] = array('text' => $before); + + foreach ($Elements as $Element) + { + $newElements[] = $Element; + } + + $text = $after; + } + + $newElements[] = array('text' => $text); + + return $newElements; + } + + # + # Deprecated Methods + # + + function parse($text) + { + $markup = $this->text($text); + + return $markup; + } + + protected function sanitiseElement(array $Element) + { + static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/'; + static $safeUrlNameToAtt = array( + 'a' => 'href', + 'img' => 'src', + ); + + if ( ! isset($Element['name'])) + { + unset($Element['attributes']); + return $Element; + } + + if (isset($safeUrlNameToAtt[$Element['name']])) + { + $Element = $this->filterUnsafeUrlInAttribute($Element, $safeUrlNameToAtt[$Element['name']]); + } + + if ( ! empty($Element['attributes'])) + { + foreach ($Element['attributes'] as $att => $val) + { + # filter out badly parsed attribute + if ( ! preg_match($goodAttribute, $att)) + { + unset($Element['attributes'][$att]); + } + # dump onevent attribute + elseif (self::striAtStart($att, 'on')) + { + unset($Element['attributes'][$att]); + } + } + } + + return $Element; + } + + protected function filterUnsafeUrlInAttribute(array $Element, $attribute) + { + foreach ($this->safeLinksWhitelist as $scheme) + { + if (self::striAtStart($Element['attributes'][$attribute], $scheme)) + { + return $Element; + } + } + + $Element['attributes'][$attribute] = str_replace(':', '%3A', $Element['attributes'][$attribute]); + + return $Element; + } + + # + # Static Methods + # + + protected static function escape($text, $allowQuotes = false) + { + return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8'); + } + + protected static function striAtStart($string, $needle) + { + $len = strlen($needle); + + if ($len > strlen($string)) + { + return false; + } + else + { + return strtolower(substr($string, 0, $len)) === strtolower($needle); + } + } + + static function instance($name = 'default') + { + if (isset(self::$instances[$name])) + { + return self::$instances[$name]; + } + + $instance = new static(); + + self::$instances[$name] = $instance; + + return $instance; + } + + private static $instances = array(); + + # + # Fields + # + + protected $DefinitionData; + + # + # Read-Only + + protected $specialCharacters = array( + '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', '~' + ); + + protected $StrongRegex = array( + '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*+[*])+?)[*]{2}(?![*])/s', + '_' => '/^__((?:\\\\_|[^_]|_[^_]*+_)+?)__(?!_)/us', + ); + + protected $EmRegex = array( + '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', + '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', + ); + + protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*+(?:\s*+=\s*+(?:[^"\'=<>`\s]+|"[^"]*+"|\'[^\']*+\'))?+'; + + protected $voidElements = array( + 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', + ); + + protected $textLevelElements = array( + 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', + 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', + 'i', 'rp', 'del', 'code', 'strike', 'marquee', + 'q', 'rt', 'ins', 'font', 'strong', + 's', 'tt', 'kbd', 'mark', + 'u', 'xm', 'sub', 'nobr', + 'sup', 'ruby', + 'var', 'span', + 'wbr', 'time', + ); +} diff --git a/vendor/erusev/parsedown/composer.json b/vendor/erusev/parsedown/composer.json new file mode 100644 index 0000000..b145680 --- /dev/null +++ b/vendor/erusev/parsedown/composer.json @@ -0,0 +1,33 @@ +{ + "name": "erusev/parsedown", + "description": "Parser for Markdown.", + "keywords": ["markdown", "parser"], + "homepage": "http://parsedown.org", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "require": { + "php": ">=7.1", + "ext-mbstring": "*" + }, + "require-dev": { + "phpunit/phpunit": "^7.5|^8.5|^9.6" + }, + "autoload": { + "psr-0": {"Parsedown": ""} + }, + "autoload-dev": { + "psr-0": { + "TestParsedown": "test/", + "ParsedownTest": "test/", + "CommonMarkTest": "test/", + "CommonMarkTestWeak": "test/" + } + } +} diff --git a/vendor/ezyang/htmlpurifier/LICENSE b/vendor/ezyang/htmlpurifier/LICENSE new file mode 100644 index 0000000..8c88a20 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/composer.json b/vendor/ezyang/htmlpurifier/composer.json new file mode 100644 index 0000000..cfb7151 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/composer.json @@ -0,0 +1,45 @@ +{ + "name": "ezyang/htmlpurifier", + "description": "Standards compliant HTML filter written in PHP", + "type": "library", + "keywords": ["html"], + "homepage": "http://htmlpurifier.org/", + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "autoload": { + "psr-0": { "HTMLPurifier": "library/" }, + "files": ["library/HTMLPurifier.composer.php"], + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-tidy": "Used for pretty-printing HTML" + }, + "config": { + "sort-packages": true + }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/ezyang/simpletest.git", + "no-api": true + } + ] +} diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php new file mode 100644 index 0000000..1960c39 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php @@ -0,0 +1,11 @@ +purify($html, $config); +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php new file mode 100644 index 0000000..1f99a4a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php @@ -0,0 +1,236 @@ + $attributes) { + $allowed_elements[$element] = true; + foreach ($attributes as $attribute => $x) { + $allowed_attributes["$element.$attribute"] = true; + } + } + $config->set('HTML.AllowedElements', $allowed_elements); + $config->set('HTML.AllowedAttributes', $allowed_attributes); + if ($allowed_protocols !== null) { + $config->set('URI.AllowedSchemes', $allowed_protocols); + } + $purifier = new HTMLPurifier($config); + return $purifier->purify($string); +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php new file mode 100644 index 0000000..39b1b65 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php @@ -0,0 +1,11 @@ +config = HTMLPurifier_Config::create($config); + $this->strategy = new HTMLPurifier_Strategy_Core(); + } + + /** + * Adds a filter to process the output. First come first serve + * + * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object + */ + public function addFilter($filter) + { + trigger_error( + 'HTMLPurifier->addFilter() is deprecated, use configuration directives' . + ' in the Filter namespace or Filter.Custom', + E_USER_WARNING + ); + $this->filters[] = $filter; + } + + /** + * Filters an HTML snippet/document to be XSS-free and standards-compliant. + * + * @param string $html String of HTML to purify + * @param HTMLPurifier_Config $config Config object for this operation, + * if omitted, defaults to the config object specified during this + * object's construction. The parameter can also be any type + * that HTMLPurifier_Config::create() supports. + * + * @return string Purified HTML + */ + public function purify($html, $config = null) + { + // :TODO: make the config merge in, instead of replace + $config = $config ? HTMLPurifier_Config::create($config) : $this->config; + + // implementation is partially environment dependant, partially + // configuration dependant + $lexer = HTMLPurifier_Lexer::create($config); + + $context = new HTMLPurifier_Context(); + + // setup HTML generator + $this->generator = new HTMLPurifier_Generator($config, $context); + $context->register('Generator', $this->generator); + + // set up global context variables + if ($config->get('Core.CollectErrors')) { + // may get moved out if other facilities use it + $language_factory = HTMLPurifier_LanguageFactory::instance(); + $language = $language_factory->create($config, $context); + $context->register('Locale', $language); + + $error_collector = new HTMLPurifier_ErrorCollector($context); + $context->register('ErrorCollector', $error_collector); + } + + // setup id_accumulator context, necessary due to the fact that + // AttrValidator can be called from many places + $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); + $context->register('IDAccumulator', $id_accumulator); + + $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context); + + // setup filters + $filter_flags = $config->getBatch('Filter'); + $custom_filters = $filter_flags['Custom']; + unset($filter_flags['Custom']); + $filters = array(); + foreach ($filter_flags as $filter => $flag) { + if (!$flag) { + continue; + } + if (strpos($filter, '.') !== false) { + continue; + } + $class = "HTMLPurifier_Filter_$filter"; + $filters[] = new $class; + } + foreach ($custom_filters as $filter) { + // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat + $filters[] = $filter; + } + $filters = array_merge($filters, $this->filters); + // maybe prepare(), but later + + for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) { + $html = $filters[$i]->preFilter($html, $config, $context); + } + + // purified HTML + $html = + $this->generator->generateFromTokens( + // list of tokens + $this->strategy->execute( + // list of un-purified tokens + $lexer->tokenizeHTML( + // un-purified HTML + $html, + $config, + $context + ), + $config, + $context + ) + ); + + for ($i = $filter_size - 1; $i >= 0; $i--) { + $html = $filters[$i]->postFilter($html, $config, $context); + } + + $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context); + $this->context =& $context; + return $html; + } + + /** + * Filters an array of HTML snippets + * + * @param string[] $array_of_html Array of html snippets + * @param HTMLPurifier_Config $config Optional config object for this operation. + * See HTMLPurifier::purify() for more details. + * + * @return string[] Array of purified HTML + */ + public function purifyArray($array_of_html, $config = null) + { + $context_array = array(); + $array = array(); + foreach($array_of_html as $key=>$value){ + if (is_array($value)) { + $array[$key] = $this->purifyArray($value, $config); + } else { + $array[$key] = $this->purify($value, $config); + } + $context_array[$key] = $this->context; + } + $this->context = $context_array; + return $array; + } + + /** + * Singleton for enforcing just one HTML Purifier in your system + * + * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype + * HTMLPurifier instance to overload singleton with, + * or HTMLPurifier_Config instance to configure the + * generated version with. + * + * @return HTMLPurifier + */ + public static function instance($prototype = null) + { + if (!self::$instance || $prototype) { + if ($prototype instanceof HTMLPurifier) { + self::$instance = $prototype; + } elseif ($prototype) { + self::$instance = new HTMLPurifier($prototype); + } else { + self::$instance = new HTMLPurifier(); + } + } + return self::$instance; + } + + /** + * Singleton for enforcing just one HTML Purifier in your system + * + * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype + * HTMLPurifier instance to overload singleton with, + * or HTMLPurifier_Config instance to configure the + * generated version with. + * + * @return HTMLPurifier + * @note Backwards compatibility, see instance() + */ + public static function getInstance($prototype = null) + { + return HTMLPurifier::instance($prototype); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php new file mode 100644 index 0000000..8a417d2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php @@ -0,0 +1,230 @@ +getHTMLDefinition(); + $parent = new HTMLPurifier_Token_Start($definition->info_parent); + $stack = array($parent->toNode()); + foreach ($tokens as $token) { + $token->skip = null; // [MUT] + $token->carryover = null; // [MUT] + if ($token instanceof HTMLPurifier_Token_End) { + $token->start = null; // [MUT] + $r = array_pop($stack); + //assert($r->name === $token->name); + //assert(empty($token->attr)); + $r->endCol = $token->col; + $r->endLine = $token->line; + $r->endArmor = $token->armor; + continue; + } + $node = $token->toNode(); + $stack[count($stack)-1]->children[] = $node; + if ($token instanceof HTMLPurifier_Token_Start) { + $stack[] = $node; + } + } + //assert(count($stack) == 1); + return $stack[0]; + } + + public static function flatten($node, $config, $context) { + $level = 0; + $nodes = array($level => new HTMLPurifier_Queue(array($node))); + $closingTokens = array(); + $tokens = array(); + do { + while (!$nodes[$level]->isEmpty()) { + $node = $nodes[$level]->shift(); // FIFO + list($start, $end) = $node->toTokenPair(); + if ($level > 0) { + $tokens[] = $start; + } + if ($end !== NULL) { + $closingTokens[$level][] = $end; + } + if ($node instanceof HTMLPurifier_Node_Element) { + $level++; + $nodes[$level] = new HTMLPurifier_Queue(); + foreach ($node->children as $childNode) { + $nodes[$level]->push($childNode); + } + } + } + $level--; + if ($level && isset($closingTokens[$level])) { + while ($token = array_pop($closingTokens[$level])) { + $tokens[] = $token; + } + } + } while ($level > 0); + return $tokens; + } +} diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php new file mode 100644 index 0000000..c7b17cf --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php @@ -0,0 +1,148 @@ +doConstruct($attr_types, $modules); + } + + public function doConstruct($attr_types, $modules) + { + // load extensions from the modules + foreach ($modules as $module) { + foreach ($module->attr_collections as $coll_i => $coll) { + if (!isset($this->info[$coll_i])) { + $this->info[$coll_i] = array(); + } + foreach ($coll as $attr_i => $attr) { + if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) { + // merge in includes + $this->info[$coll_i][$attr_i] = array_merge( + $this->info[$coll_i][$attr_i], + $attr + ); + continue; + } + $this->info[$coll_i][$attr_i] = $attr; + } + } + } + // perform internal expansions and inclusions + foreach ($this->info as $name => $attr) { + // merge attribute collections that include others + $this->performInclusions($this->info[$name]); + // replace string identifiers with actual attribute objects + $this->expandIdentifiers($this->info[$name], $attr_types); + } + } + + /** + * Takes a reference to an attribute associative array and performs + * all inclusions specified by the zero index. + * @param array &$attr Reference to attribute array + */ + public function performInclusions(&$attr) + { + if (!isset($attr[0])) { + return; + } + $merge = $attr[0]; + $seen = array(); // recursion guard + // loop through all the inclusions + for ($i = 0; isset($merge[$i]); $i++) { + if (isset($seen[$merge[$i]])) { + continue; + } + $seen[$merge[$i]] = true; + // foreach attribute of the inclusion, copy it over + if (!isset($this->info[$merge[$i]])) { + continue; + } + foreach ($this->info[$merge[$i]] as $key => $value) { + if (isset($attr[$key])) { + continue; + } // also catches more inclusions + $attr[$key] = $value; + } + if (isset($this->info[$merge[$i]][0])) { + // recursion + $merge = array_merge($merge, $this->info[$merge[$i]][0]); + } + } + unset($attr[0]); + } + + /** + * Expands all string identifiers in an attribute array by replacing + * them with the appropriate values inside HTMLPurifier_AttrTypes + * @param array &$attr Reference to attribute array + * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance + */ + public function expandIdentifiers(&$attr, $attr_types) + { + // because foreach will process new elements we add, make sure we + // skip duplicates + $processed = array(); + + foreach ($attr as $def_i => $def) { + // skip inclusions + if ($def_i === 0) { + continue; + } + + if (isset($processed[$def_i])) { + continue; + } + + // determine whether or not attribute is required + if ($required = (strpos($def_i, '*') !== false)) { + // rename the definition + unset($attr[$def_i]); + $def_i = trim($def_i, '*'); + $attr[$def_i] = $def; + } + + $processed[$def_i] = true; + + // if we've already got a literal object, move on + if (is_object($def)) { + // preserve previous required + $attr[$def_i]->required = ($required || $attr[$def_i]->required); + continue; + } + + if ($def === false) { + unset($attr[$def_i]); + continue; + } + + if ($t = $attr_types->get($def)) { + $attr[$def_i] = $t; + $attr[$def_i]->required = $required; + } else { + unset($attr[$def_i]); + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php new file mode 100644 index 0000000..739646f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php @@ -0,0 +1,144 @@ + by removing + * leading and trailing whitespace, ignoring line feeds, and replacing + * carriage returns and tabs with spaces. While most useful for HTML + * attributes specified as CDATA, it can also be applied to most CSS + * values. + * + * @note This method is not entirely standards compliant, as trim() removes + * more types of whitespace than specified in the spec. In practice, + * this is rarely a problem, as those extra characters usually have + * already been removed by HTMLPurifier_Encoder. + * + * @warning This processing is inconsistent with XML's whitespace handling + * as specified by section 3.3.3 and referenced XHTML 1.0 section + * 4.7. However, note that we are NOT necessarily + * parsing XML, thus, this behavior may still be correct. We + * assume that newlines have been normalized. + */ + public function parseCDATA($string) + { + $string = trim($string); + $string = str_replace(array("\n", "\t", "\r"), ' ', $string); + return $string; + } + + /** + * Factory method for creating this class from a string. + * @param string $string String construction info + * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string + */ + public function make($string) + { + // default implementation, return a flyweight of this object. + // If $string has an effect on the returned object (i.e. you + // need to overload this method), it is best + // to clone or instantiate new copies. (Instantiation is safer.) + return $this; + } + + /** + * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work + * properly. THIS IS A HACK! + * @param string $string a CSS colour definition + * @return string + */ + protected function mungeRgb($string) + { + $p = '\s*(\d+(\.\d+)?([%]?))\s*'; + + if (preg_match('/(rgba|hsla)\(/', $string)) { + return preg_replace('/(rgba|hsla)\('.$p.','.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8,\11)', $string); + } + + return preg_replace('/(rgb|hsl)\('.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8)', $string); + } + + /** + * Parses a possibly escaped CSS string and returns the "pure" + * version of it. + */ + protected function expandCSSEscape($string) + { + // flexibly parse it + $ret = ''; + for ($i = 0, $c = strlen($string); $i < $c; $i++) { + if ($string[$i] === '\\') { + $i++; + if ($i >= $c) { + $ret .= '\\'; + break; + } + if (ctype_xdigit($string[$i])) { + $code = $string[$i]; + for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) { + if (!ctype_xdigit($string[$i])) { + break; + } + $code .= $string[$i]; + } + // We have to be extremely careful when adding + // new characters, to make sure we're not breaking + // the encoding. + $char = HTMLPurifier_Encoder::unichr(hexdec($code)); + if (HTMLPurifier_Encoder::cleanUTF8($char) === '') { + continue; + } + $ret .= $char; + if ($i < $c && trim($string[$i]) !== '') { + $i--; + } + continue; + } + if ($string[$i] === "\n") { + continue; + } + } + $ret .= $string[$i]; + } + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php new file mode 100644 index 0000000..af6b8a0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php @@ -0,0 +1,140 @@ +parseCDATA($css); + + $definition = $config->getCSSDefinition(); + $allow_duplicates = $config->get("CSS.AllowDuplicates"); + + $universal_attrdef = new HTMLPurifier_AttrDef_Enum( + array( + 'initial', + 'inherit', + 'unset', + ) + ); + + // According to the CSS2.1 spec, the places where a + // non-delimiting semicolon can appear are in strings + // escape sequences. So here is some dumb hack to + // handle quotes. + $len = strlen($css); + $accum = ""; + $declarations = array(); + $quoted = false; + for ($i = 0; $i < $len; $i++) { + $c = strcspn($css, ";'\"", $i); + $accum .= substr($css, $i, $c); + $i += $c; + if ($i == $len) break; + $d = $css[$i]; + if ($quoted) { + $accum .= $d; + if ($d == $quoted) { + $quoted = false; + } + } else { + if ($d == ";") { + $declarations[] = $accum; + $accum = ""; + } else { + $accum .= $d; + $quoted = $d; + } + } + } + if ($accum != "") $declarations[] = $accum; + + $propvalues = array(); + $new_declarations = ''; + + /** + * Name of the current CSS property being validated. + */ + $property = false; + $context->register('CurrentCSSProperty', $property); + + foreach ($declarations as $declaration) { + if (!$declaration) { + continue; + } + if (!strpos($declaration, ':')) { + continue; + } + list($property, $value) = explode(':', $declaration, 2); + $property = trim($property); + $value = trim($value); + $ok = false; + do { + if (isset($definition->info[$property])) { + $ok = true; + break; + } + if (ctype_lower($property)) { + break; + } + $property = strtolower($property); + if (isset($definition->info[$property])) { + $ok = true; + break; + } + } while (0); + if (!$ok) { + continue; + } + $result = $universal_attrdef->validate($value, $config, $context); + if ($result === false) { + $result = $definition->info[$property]->validate( + $value, + $config, + $context + ); + } + if ($result === false) { + continue; + } + if ($allow_duplicates) { + $new_declarations .= "$property:$result;"; + } else { + $propvalues[$property] = $result; + } + } + + $context->destroy('CurrentCSSProperty'); + + // procedure does not write the new CSS simultaneously, so it's + // slightly inefficient, but it's the only way of getting rid of + // duplicates. Perhaps config to optimize it, but not now. + + foreach ($propvalues as $prop => $value) { + $new_declarations .= "$prop:$value;"; + } + + return $new_declarations ? $new_declarations : false; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php new file mode 100644 index 0000000..af2b83d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php @@ -0,0 +1,34 @@ + 1.0) { + $result = '1'; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php new file mode 100644 index 0000000..28c4988 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php @@ -0,0 +1,113 @@ +getCSSDefinition(); + $this->info['background-color'] = $def->info['background-color']; + $this->info['background-image'] = $def->info['background-image']; + $this->info['background-repeat'] = $def->info['background-repeat']; + $this->info['background-attachment'] = $def->info['background-attachment']; + $this->info['background-position'] = $def->info['background-position']; + $this->info['background-size'] = $def->info['background-size']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') { + return false; + } + + // munge rgb() decl if necessary + $string = $this->mungeRgb($string); + + // assumes URI doesn't have spaces in it + $bits = explode(' ', $string); // bits to process + + $caught = array(); + $caught['color'] = false; + $caught['image'] = false; + $caught['repeat'] = false; + $caught['attachment'] = false; + $caught['position'] = false; + $caught['size'] = false; + + $i = 0; // number of catches + + foreach ($bits as $bit) { + if ($bit === '') { + continue; + } + foreach ($caught as $key => $status) { + if ($key != 'position') { + if ($status !== false) { + continue; + } + $r = $this->info['background-' . $key]->validate($bit, $config, $context); + } else { + $r = $bit; + } + if ($r === false) { + continue; + } + if ($key == 'position') { + if ($caught[$key] === false) { + $caught[$key] = ''; + } + $caught[$key] .= $r . ' '; + } else { + $caught[$key] = $r; + } + $i++; + break; + } + } + + if (!$i) { + return false; + } + if ($caught['position'] !== false) { + $caught['position'] = $this->info['background-position']-> + validate($caught['position'], $config, $context); + } + + $ret = array(); + foreach ($caught as $value) { + if ($value === false) { + continue; + } + $ret[] = $value; + } + + if (empty($ret)) { + return false; + } + return implode(' ', $ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php new file mode 100644 index 0000000..4580ef5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php @@ -0,0 +1,157 @@ + | | left | center | right + ] + [ + | | top | center | bottom + ]? + ] | + [ // this signifies that the vertical and horizontal adjectives + // can be arbitrarily ordered, however, there can only be two, + // one of each, or none at all + [ + left | center | right + ] || + [ + top | center | bottom + ] + ] + top, left = 0% + center, (none) = 50% + bottom, right = 100% +*/ + +/* QuirksMode says: + keyword + length/percentage must be ordered correctly, as per W3C + + Internet Explorer and Opera, however, support arbitrary ordering. We + should fix it up. + + Minor issue though, not strictly necessary. +*/ + +// control freaks may appreciate the ability to convert these to +// percentages or something, but it's not necessary + +/** + * Validates the value of background-position. + */ +class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef +{ + + /** + * @type HTMLPurifier_AttrDef_CSS_Length + */ + protected $length; + + /** + * @type HTMLPurifier_AttrDef_CSS_Percentage + */ + protected $percentage; + + public function __construct() + { + $this->length = new HTMLPurifier_AttrDef_CSS_Length(); + $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage(); + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + $bits = explode(' ', $string); + + $keywords = array(); + $keywords['h'] = false; // left, right + $keywords['v'] = false; // top, bottom + $keywords['ch'] = false; // center (first word) + $keywords['cv'] = false; // center (second word) + $measures = array(); + + $i = 0; + + $lookup = array( + 'top' => 'v', + 'bottom' => 'v', + 'left' => 'h', + 'right' => 'h', + 'center' => 'c' + ); + + foreach ($bits as $bit) { + if ($bit === '') { + continue; + } + + // test for keyword + $lbit = ctype_lower($bit) ? $bit : strtolower($bit); + if (isset($lookup[$lbit])) { + $status = $lookup[$lbit]; + if ($status == 'c') { + if ($i == 0) { + $status = 'ch'; + } else { + $status = 'cv'; + } + } + $keywords[$status] = $lbit; + $i++; + } + + // test for length + $r = $this->length->validate($bit, $config, $context); + if ($r !== false) { + $measures[] = $r; + $i++; + } + + // test for percentage + $r = $this->percentage->validate($bit, $config, $context); + if ($r !== false) { + $measures[] = $r; + $i++; + } + } + + if (!$i) { + return false; + } // no valid values were caught + + $ret = array(); + + // first keyword + if ($keywords['h']) { + $ret[] = $keywords['h']; + } elseif ($keywords['ch']) { + $ret[] = $keywords['ch']; + $keywords['cv'] = false; // prevent re-use: center = center center + } elseif (count($measures)) { + $ret[] = array_shift($measures); + } + + if ($keywords['v']) { + $ret[] = $keywords['v']; + } elseif ($keywords['cv']) { + $ret[] = $keywords['cv']; + } elseif (count($measures)) { + $ret[] = array_shift($measures); + } + + if (empty($ret)) { + return false; + } + return implode(' ', $ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php new file mode 100644 index 0000000..16243ba --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php @@ -0,0 +1,56 @@ +getCSSDefinition(); + $this->info['border-width'] = $def->info['border-width']; + $this->info['border-style'] = $def->info['border-style']; + $this->info['border-top-color'] = $def->info['border-top-color']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + $string = $this->mungeRgb($string); + $bits = explode(' ', $string); + $done = array(); // segments we've finished + $ret = ''; // return value + foreach ($bits as $bit) { + foreach ($this->info as $propname => $validator) { + if (isset($done[$propname])) { + continue; + } + $r = $validator->validate($bit, $config, $context); + if ($r !== false) { + $ret .= $r . ' '; + $done[$propname] = true; + break; + } + } + } + return rtrim($ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php new file mode 100644 index 0000000..d7287a0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php @@ -0,0 +1,161 @@ +alpha = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + } + + /** + * @param string $color + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($color, $config, $context) + { + static $colors = null; + if ($colors === null) { + $colors = $config->get('Core.ColorKeywords'); + } + + $color = trim($color); + if ($color === '') { + return false; + } + + $lower = strtolower($color); + if (isset($colors[$lower])) { + return $colors[$lower]; + } + + if (preg_match('#(rgb|rgba|hsl|hsla)\(#', $color, $matches) === 1) { + $length = strlen($color); + if (strpos($color, ')') !== $length - 1) { + return false; + } + + // get used function : rgb, rgba, hsl or hsla + $function = $matches[1]; + + $parameters_size = 3; + $alpha_channel = false; + if (substr($function, -1) === 'a') { + $parameters_size = 4; + $alpha_channel = true; + } + + /* + * Allowed types for values : + * parameter_position => [type => max_value] + */ + $allowed_types = array( + 1 => array('percentage' => 100, 'integer' => 255), + 2 => array('percentage' => 100, 'integer' => 255), + 3 => array('percentage' => 100, 'integer' => 255), + ); + $allow_different_types = false; + + if (strpos($function, 'hsl') !== false) { + $allowed_types = array( + 1 => array('integer' => 360), + 2 => array('percentage' => 100), + 3 => array('percentage' => 100), + ); + $allow_different_types = true; + } + + $values = trim(str_replace($function, '', $color), ' ()'); + + $parts = explode(',', $values); + if (count($parts) !== $parameters_size) { + return false; + } + + $type = false; + $new_parts = array(); + $i = 0; + + foreach ($parts as $part) { + $i++; + $part = trim($part); + + if ($part === '') { + return false; + } + + // different check for alpha channel + if ($alpha_channel === true && $i === count($parts)) { + $result = $this->alpha->validate($part, $config, $context); + + if ($result === false) { + return false; + } + + $new_parts[] = (string)$result; + continue; + } + + if (substr($part, -1) === '%') { + $current_type = 'percentage'; + } else { + $current_type = 'integer'; + } + + if (!array_key_exists($current_type, $allowed_types[$i])) { + return false; + } + + if (!$type) { + $type = $current_type; + } + + if ($allow_different_types === false && $type != $current_type) { + return false; + } + + $max_value = $allowed_types[$i][$current_type]; + + if ($current_type == 'integer') { + // Return value between range 0 -> $max_value + $new_parts[] = (int)max(min($part, $max_value), 0); + } elseif ($current_type == 'percentage') { + $new_parts[] = (float)max(min(rtrim($part, '%'), $max_value), 0) . '%'; + } + } + + $new_values = implode(',', $new_parts); + + $color = $function . '(' . $new_values . ')'; + } else { + // hexadecimal handling + if ($color[0] === '#') { + $hex = substr($color, 1); + } else { + $hex = $color; + $color = '#' . $color; + } + $length = strlen($hex); + if ($length !== 3 && $length !== 6) { + return false; + } + if (!ctype_xdigit($hex)) { + return false; + } + } + return $color; + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php new file mode 100644 index 0000000..9c17505 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php @@ -0,0 +1,48 @@ +defs = $defs; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + foreach ($this->defs as $i => $def) { + $result = $this->defs[$i]->validate($string, $config, $context); + if ($result !== false) { + return $result; + } + } + return false; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php new file mode 100644 index 0000000..9d77cc9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php @@ -0,0 +1,44 @@ +def = $def; + $this->element = $element; + } + + /** + * Checks if CurrentToken is set and equal to $this->element + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $token = $context->get('CurrentToken', true); + if ($token && $token->name == $this->element) { + return false; + } + return $this->def->validate($string, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php new file mode 100644 index 0000000..bde4c33 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php @@ -0,0 +1,77 @@ +intValidator = new HTMLPurifier_AttrDef_Integer(); + } + + /** + * @param string $value + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($value, $config, $context) + { + $value = $this->parseCDATA($value); + if ($value === 'none') { + return $value; + } + // if we looped this we could support multiple filters + $function_length = strcspn($value, '('); + $function = trim(substr($value, 0, $function_length)); + if ($function !== 'alpha' && + $function !== 'Alpha' && + $function !== 'progid:DXImageTransform.Microsoft.Alpha' + ) { + return false; + } + $cursor = $function_length + 1; + $parameters_length = strcspn($value, ')', $cursor); + $parameters = substr($value, $cursor, $parameters_length); + $params = explode(',', $parameters); + $ret_params = array(); + $lookup = array(); + foreach ($params as $param) { + list($key, $value) = explode('=', $param); + $key = trim($key); + $value = trim($value); + if (isset($lookup[$key])) { + continue; + } + if ($key !== 'opacity') { + continue; + } + $value = $this->intValidator->validate($value, $config, $context); + if ($value === false) { + continue; + } + $int = (int)$value; + if ($int > 100) { + $value = '100'; + } + if ($int < 0) { + $value = '0'; + } + $ret_params[] = "$key=$value"; + $lookup[$key] = true; + } + $ret_parameters = implode(',', $ret_params); + $ret_function = "$function($ret_parameters)"; + return $ret_function; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php new file mode 100644 index 0000000..579b97e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php @@ -0,0 +1,176 @@ +getCSSDefinition(); + $this->info['font-style'] = $def->info['font-style']; + $this->info['font-variant'] = $def->info['font-variant']; + $this->info['font-weight'] = $def->info['font-weight']; + $this->info['font-size'] = $def->info['font-size']; + $this->info['line-height'] = $def->info['line-height']; + $this->info['font-family'] = $def->info['font-family']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + static $system_fonts = array( + 'caption' => true, + 'icon' => true, + 'menu' => true, + 'message-box' => true, + 'small-caption' => true, + 'status-bar' => true + ); + + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') { + return false; + } + + // check if it's one of the keywords + $lowercase_string = strtolower($string); + if (isset($system_fonts[$lowercase_string])) { + return $lowercase_string; + } + + $bits = explode(' ', $string); // bits to process + $stage = 0; // this indicates what we're looking for + $caught = array(); // which stage 0 properties have we caught? + $stage_1 = array('font-style', 'font-variant', 'font-weight'); + $final = ''; // output + + for ($i = 0, $size = count($bits); $i < $size; $i++) { + if ($bits[$i] === '') { + continue; + } + switch ($stage) { + case 0: // attempting to catch font-style, font-variant or font-weight + foreach ($stage_1 as $validator_name) { + if (isset($caught[$validator_name])) { + continue; + } + $r = $this->info[$validator_name]->validate( + $bits[$i], + $config, + $context + ); + if ($r !== false) { + $final .= $r . ' '; + $caught[$validator_name] = true; + break; + } + } + // all three caught, continue on + if (count($caught) >= 3) { + $stage = 1; + } + if ($r !== false) { + break; + } + case 1: // attempting to catch font-size and perhaps line-height + $found_slash = false; + if (strpos($bits[$i], '/') !== false) { + list($font_size, $line_height) = + explode('/', $bits[$i]); + if ($line_height === '') { + // ooh, there's a space after the slash! + $line_height = false; + $found_slash = true; + } + } else { + $font_size = $bits[$i]; + $line_height = false; + } + $r = $this->info['font-size']->validate( + $font_size, + $config, + $context + ); + if ($r !== false) { + $final .= $r; + // attempt to catch line-height + if ($line_height === false) { + // we need to scroll forward + for ($j = $i + 1; $j < $size; $j++) { + if ($bits[$j] === '') { + continue; + } + if ($bits[$j] === '/') { + if ($found_slash) { + return false; + } else { + $found_slash = true; + continue; + } + } + $line_height = $bits[$j]; + break; + } + } else { + // slash already found + $found_slash = true; + $j = $i; + } + if ($found_slash) { + $i = $j; + $r = $this->info['line-height']->validate( + $line_height, + $config, + $context + ); + if ($r !== false) { + $final .= '/' . $r; + } + } + $final .= ' '; + $stage = 2; + break; + } + return false; + case 2: // attempting to catch font-family + $font_family = + implode(' ', array_slice($bits, $i, $size - $i)); + $r = $this->info['font-family']->validate( + $font_family, + $config, + $context + ); + if ($r !== false) { + $final .= $r . ' '; + // processing completed successfully + return rtrim($final); + } + return false; + } + } + return false; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php new file mode 100644 index 0000000..799166b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php @@ -0,0 +1,217 @@ +mask = array_reduce($c, function ($carry, $value) { + return $carry . $value; + }, '_- '); + + /* + PHP's internal strcspn implementation is + O(length of string * length of mask), making it inefficient + for large masks. However, it's still faster than + preg_match 8) + for (p = s1;;) { + spanp = s2; + do { + if (*spanp == c || p == s1_end) { + return p - s1; + } + } while (spanp++ < (s2_end - 1)); + c = *++p; + } + */ + // possible optimization: invert the mask. + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + static $generic_names = array( + 'serif' => true, + 'sans-serif' => true, + 'monospace' => true, + 'fantasy' => true, + 'cursive' => true + ); + $allowed_fonts = $config->get('CSS.AllowedFonts'); + + // assume that no font names contain commas in them + $fonts = explode(',', $string); + $final = ''; + foreach ($fonts as $font) { + $font = trim($font); + if ($font === '') { + continue; + } + // match a generic name + if (isset($generic_names[$font])) { + if ($allowed_fonts === null || isset($allowed_fonts[$font])) { + $final .= $font . ', '; + } + continue; + } + // match a quoted name + if ($font[0] === '"' || $font[0] === "'") { + $length = strlen($font); + if ($length <= 2) { + continue; + } + $quote = $font[0]; + if ($font[$length - 1] !== $quote) { + continue; + } + $font = substr($font, 1, $length - 2); + } + + $font = $this->expandCSSEscape($font); + + // $font is a pure representation of the font name + + if ($allowed_fonts !== null && !isset($allowed_fonts[$font])) { + continue; + } + + if (ctype_alnum($font) && $font !== '') { + // very simple font, allow it in unharmed + $final .= $font . ', '; + continue; + } + + // bugger out on whitespace. form feed (0C) really + // shouldn't show up regardless + $font = str_replace(array("\n", "\t", "\r", "\x0C"), ' ', $font); + + // Here, there are various classes of characters which need + // to be treated differently: + // - Alphanumeric characters are essentially safe. We + // handled these above. + // - Spaces require quoting, though most parsers will do + // the right thing if there aren't any characters that + // can be misinterpreted + // - Dashes rarely occur, but they fairly unproblematic + // for parsing/rendering purposes. + // The above characters cover the majority of Western font + // names. + // - Arbitrary Unicode characters not in ASCII. Because + // most parsers give little thought to Unicode, treatment + // of these codepoints is basically uniform, even for + // punctuation-like codepoints. These characters can + // show up in non-Western pages and are supported by most + // major browsers, for example: "MS 明朝" is a + // legitimate font-name + // . See + // the CSS3 spec for more examples: + // + // You can see live samples of these on the Internet: + // + // However, most of these fonts have ASCII equivalents: + // for example, 'MS Mincho', and it's considered + // professional to use ASCII font names instead of + // Unicode font names. Thanks Takeshi Terada for + // providing this information. + // The following characters, to my knowledge, have not been + // used to name font names. + // - Single quote. While theoretically you might find a + // font name that has a single quote in its name (serving + // as an apostrophe, e.g. Dave's Scribble), I haven't + // been able to find any actual examples of this. + // Internet Explorer's cssText translation (which I + // believe is invoked by innerHTML) normalizes any + // quoting to single quotes, and fails to escape single + // quotes. (Note that this is not IE's behavior for all + // CSS properties, just some sort of special casing for + // font-family). So a single quote *cannot* be used + // safely in the font-family context if there will be an + // innerHTML/cssText translation. Note that Firefox 3.x + // does this too. + // - Double quote. In IE, these get normalized to + // single-quotes, no matter what the encoding. (Fun + // fact, in IE8, the 'content' CSS property gained + // support, where they special cased to preserve encoded + // double quotes, but still translate unadorned double + // quotes into single quotes.) So, because their + // fixpoint behavior is identical to single quotes, they + // cannot be allowed either. Firefox 3.x displays + // single-quote style behavior. + // - Backslashes are reduced by one (so \\ -> \) every + // iteration, so they cannot be used safely. This shows + // up in IE7, IE8 and FF3 + // - Semicolons, commas and backticks are handled properly. + // - The rest of the ASCII punctuation is handled properly. + // We haven't checked what browsers do to unadorned + // versions, but this is not important as long as the + // browser doesn't /remove/ surrounding quotes (as IE does + // for HTML). + // + // With these results in hand, we conclude that there are + // various levels of safety: + // - Paranoid: alphanumeric, spaces and dashes(?) + // - International: Paranoid + non-ASCII Unicode + // - Edgy: Everything except quotes, backslashes + // - NoJS: Standards compliance, e.g. sod IE. Note that + // with some judicious character escaping (since certain + // types of escaping doesn't work) this is theoretically + // OK as long as innerHTML/cssText is not called. + // We believe that international is a reasonable default + // (that we will implement now), and once we do more + // extensive research, we may feel comfortable with dropping + // it down to edgy. + + // Edgy: alphanumeric, spaces, dashes, underscores and Unicode. Use of + // str(c)spn assumes that the string was already well formed + // Unicode (which of course it is). + if (strspn($font, $this->mask) !== strlen($font)) { + continue; + } + + // Historical: + // In the absence of innerHTML/cssText, these ugly + // transforms don't pose a security risk (as \\ and \" + // might--these escapes are not supported by most browsers). + // We could try to be clever and use single-quote wrapping + // when there is a double quote present, but I have chosen + // not to implement that. (NOTE: you can reduce the amount + // of escapes by one depending on what quoting style you use) + // $font = str_replace('\\', '\\5C ', $font); + // $font = str_replace('"', '\\22 ', $font); + // $font = str_replace("'", '\\27 ', $font); + + // font possibly with spaces, requires quoting + $final .= "'$font', "; + } + $final = rtrim($final, ', '); + if ($final === '') { + return false; + } + return $final; + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php new file mode 100644 index 0000000..973002c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php @@ -0,0 +1,32 @@ +def = $def; + $this->allow = $allow; + } + + /** + * Intercepts and removes !important if necessary + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + // test for ! and important tokens + $string = trim($string); + $is_important = false; + // :TODO: optimization: test directly for !important and ! important + if (strlen($string) >= 9 && substr($string, -9) === 'important') { + $temp = rtrim(substr($string, 0, -9)); + // use a temp, because we might want to restore important + if (strlen($temp) >= 1 && substr($temp, -1) === '!') { + $string = rtrim(substr($temp, 0, -1)); + $is_important = true; + } + } + $string = $this->def->validate($string, $config, $context); + if ($this->allow && $is_important) { + $string .= ' !important'; + } + return $string; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php new file mode 100644 index 0000000..f12453a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php @@ -0,0 +1,77 @@ +min = $min !== null ? HTMLPurifier_Length::make($min) : null; + $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + + // Optimizations + if ($string === '') { + return false; + } + if ($string === '0') { + return '0'; + } + if (strlen($string) === 1) { + return false; + } + + $length = HTMLPurifier_Length::make($string); + if (!$length->isValid()) { + return false; + } + + if ($this->min) { + $c = $length->compareTo($this->min); + if ($c === false) { + return false; + } + if ($c < 0) { + return false; + } + } + if ($this->max) { + $c = $length->compareTo($this->max); + if ($c === false) { + return false; + } + if ($c > 0) { + return false; + } + } + return $length->toString(); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php new file mode 100644 index 0000000..e74d426 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php @@ -0,0 +1,112 @@ +getCSSDefinition(); + $this->info['list-style-type'] = $def->info['list-style-type']; + $this->info['list-style-position'] = $def->info['list-style-position']; + $this->info['list-style-image'] = $def->info['list-style-image']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') { + return false; + } + + // assumes URI doesn't have spaces in it + $bits = explode(' ', strtolower($string)); // bits to process + + $caught = array(); + $caught['type'] = false; + $caught['position'] = false; + $caught['image'] = false; + + $i = 0; // number of catches + $none = false; + + foreach ($bits as $bit) { + if ($i >= 3) { + return; + } // optimization bit + if ($bit === '') { + continue; + } + foreach ($caught as $key => $status) { + if ($status !== false) { + continue; + } + $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); + if ($r === false) { + continue; + } + if ($r === 'none') { + if ($none) { + continue; + } else { + $none = true; + } + if ($key == 'image') { + continue; + } + } + $caught[$key] = $r; + $i++; + break; + } + } + + if (!$i) { + return false; + } + + $ret = array(); + + // construct type + if ($caught['type']) { + $ret[] = $caught['type']; + } + + // construct image + if ($caught['image']) { + $ret[] = $caught['image']; + } + + // construct position + if ($caught['position']) { + $ret[] = $caught['position']; + } + + if (empty($ret)) { + return false; + } + return implode(' ', $ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php new file mode 100644 index 0000000..e707f87 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php @@ -0,0 +1,71 @@ +single = $single; + $this->max = $max; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->mungeRgb($this->parseCDATA($string)); + if ($string === '') { + return false; + } + $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n + $length = count($parts); + $final = ''; + for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) { + if (ctype_space($parts[$i])) { + continue; + } + $result = $this->single->validate($parts[$i], $config, $context); + if ($result !== false) { + $final .= $result . ' '; + $num++; + } + } + if ($final === '') { + return false; + } + return rtrim($final); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php new file mode 100644 index 0000000..ef49d20 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php @@ -0,0 +1,90 @@ +non_negative = $non_negative; + } + + /** + * @param string $number + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string|bool + * @warning Some contexts do not pass $config, $context. These + * variables should not be used without checking HTMLPurifier_Length + */ + public function validate($number, $config, $context) + { + $number = $this->parseCDATA($number); + + if ($number === '') { + return false; + } + if ($number === '0') { + return '0'; + } + + $sign = ''; + switch ($number[0]) { + case '-': + if ($this->non_negative) { + return false; + } + $sign = '-'; + case '+': + $number = substr($number, 1); + } + + if (ctype_digit($number)) { + $number = ltrim($number, '0'); + return $number ? $sign . $number : '0'; + } + + // Period is the only non-numeric character allowed + if (strpos($number, '.') === false) { + return false; + } + + list($left, $right) = explode('.', $number, 2); + + if ($left === '' && $right === '') { + return false; + } + if ($left !== '' && !ctype_digit($left)) { + return false; + } + + // Remove leading zeros until positive number or a zero stays left + if (ltrim($left, '0') != '') { + $left = ltrim($left, '0'); + } else { + $left = '0'; + } + + $right = rtrim($right, '0'); + + if ($right === '') { + return $left ? $sign . $left : '0'; + } elseif (!ctype_digit($right)) { + return false; + } + return $sign . $left . '.' . $right; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php new file mode 100644 index 0000000..f0f25c5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php @@ -0,0 +1,54 @@ +number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + + if ($string === '') { + return false; + } + $length = strlen($string); + if ($length === 1) { + return false; + } + if ($string[$length - 1] !== '%') { + return false; + } + + $number = substr($string, 0, $length - 1); + $number = $this->number_def->validate($number, $config, $context); + + if ($number === false) { + return false; + } + return "$number%"; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ratio.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ratio.php new file mode 100644 index 0000000..e08e2c4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ratio.php @@ -0,0 +1,46 @@ +parseCDATA($ratio); + + $parts = explode('/', $ratio, 2); + $length = count($parts); + + if ($length < 1 || $length > 2) { + return false; + } + + $num = new \HTMLPurifier_AttrDef_CSS_Number(); + + if ($length === 1) { + return $num->validate($parts[0], $config, $context); + } + + $num1 = $num->validate($parts[0], $config, $context); + $num2 = $num->validate($parts[1], $config, $context); + + if ($num1 === false || $num2 === false) { + return false; + } + + return $num1 . '/' . $num2; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php new file mode 100644 index 0000000..5fd4b7f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php @@ -0,0 +1,46 @@ + true, + 'overline' => true, + 'underline' => true, + ); + + $string = strtolower($this->parseCDATA($string)); + + if ($string === 'none') { + return $string; + } + + $parts = explode(' ', $string); + $final = ''; + foreach ($parts as $part) { + if (isset($allowed_values[$part])) { + $final .= $part . ' '; + } + } + $final = rtrim($final); + if ($final === '') { + return false; + } + return $final; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php new file mode 100644 index 0000000..6617aca --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php @@ -0,0 +1,77 @@ +parseCDATA($uri_string); + if (strpos($uri_string, 'url(') !== 0) { + return false; + } + $uri_string = substr($uri_string, 4); + if (strlen($uri_string) == 0) { + return false; + } + $new_length = strlen($uri_string) - 1; + if ($uri_string[$new_length] != ')') { + return false; + } + $uri = trim(substr($uri_string, 0, $new_length)); + + if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) { + $quote = $uri[0]; + $new_length = strlen($uri) - 1; + if ($uri[$new_length] !== $quote) { + return false; + } + $uri = substr($uri, 1, $new_length - 1); + } + + $uri = $this->expandCSSEscape($uri); + + $result = parent::validate($uri, $config, $context); + + if ($result === false) { + return false; + } + + // extra sanity check; should have been done by URI + $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result); + + // suspicious characters are ()'; we're going to percent encode + // them for safety. + $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result); + + // there's an extra bug where ampersands lose their escaping on + // an innerHTML cycle, so a very unlucky query parameter could + // then change the meaning of the URL. Unfortunately, there's + // not much we can do about that... + return "url(\"$result\")"; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php new file mode 100644 index 0000000..6698a00 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php @@ -0,0 +1,44 @@ +clone = $clone; + } + + /** + * @param string $v + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($v, $config, $context) + { + return $this->clone->validate($v, $config, $context); + } + + /** + * @param string $string + * @return HTMLPurifier_AttrDef + */ + public function make($string) + { + return clone $this->clone; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php new file mode 100644 index 0000000..8abda7f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php @@ -0,0 +1,73 @@ +valid_values = array_flip($valid_values); + $this->case_sensitive = $case_sensitive; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = trim($string); + if (!$this->case_sensitive) { + // we may want to do full case-insensitive libraries + $string = ctype_lower($string) ? $string : strtolower($string); + } + $result = isset($this->valid_values[$string]); + + return $result ? $string : false; + } + + /** + * @param string $string In form of comma-delimited list of case-insensitive + * valid values. Example: "foo,bar,baz". Prepend "s:" to make + * case sensitive + * @return HTMLPurifier_AttrDef_Enum + */ + public function make($string) + { + if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') { + $string = substr($string, 2); + $sensitive = true; + } else { + $sensitive = false; + } + $values = explode(',', $string); + return new HTMLPurifier_AttrDef_Enum($values, $sensitive); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php new file mode 100644 index 0000000..be3bbc8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php @@ -0,0 +1,48 @@ +name = $name; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + return $this->name; + } + + /** + * @param string $string Name of attribute + * @return HTMLPurifier_AttrDef_HTML_Bool + */ + public function make($string) + { + return new HTMLPurifier_AttrDef_HTML_Bool($string); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php new file mode 100644 index 0000000..d501348 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php @@ -0,0 +1,48 @@ +getDefinition('HTML')->doctype->name; + if ($name == "XHTML 1.1" || $name == "XHTML 2.0") { + return parent::split($string, $config, $context); + } else { + return preg_split('/\s+/', $string); + } + } + + /** + * @param array $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + protected function filter($tokens, $config, $context) + { + $allowed = $config->get('Attr.AllowedClasses'); + $forbidden = $config->get('Attr.ForbiddenClasses'); + $ret = array(); + foreach ($tokens as $token) { + if (($allowed === null || isset($allowed[$token])) && + !isset($forbidden[$token]) && + // We need this O(n) check because of PHP's array + // implementation that casts -0 to 0. + !in_array($token, $ret, true) + ) { + $ret[] = $token; + } + } + return $ret; + } +} diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php new file mode 100644 index 0000000..946ebb7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php @@ -0,0 +1,51 @@ +get('Core.ColorKeywords'); + } + + $string = trim($string); + + if (empty($string)) { + return false; + } + $lower = strtolower($string); + if (isset($colors[$lower])) { + return $colors[$lower]; + } + if ($string[0] === '#') { + $hex = substr($string, 1); + } else { + $hex = $string; + } + + $length = strlen($hex); + if ($length !== 3 && $length !== 6) { + return false; + } + if (!ctype_xdigit($hex)) { + return false; + } + if ($length === 3) { + $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2]; + } + return "#$hex"; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php new file mode 100644 index 0000000..5b03d3e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php @@ -0,0 +1,16 @@ +get('HTML.Trusted')) { + $allowed = array('', 'true', 'false'); + } + + $enum = new HTMLPurifier_AttrDef_Enum($allowed); + + return $enum->validate($string, $config, $context); + } +} diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php new file mode 100644 index 0000000..d79ba12 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php @@ -0,0 +1,38 @@ +valid_values === false) { + $this->valid_values = $config->get('Attr.AllowedFrameTargets'); + } + return parent::validate($string, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php new file mode 100644 index 0000000..4ba4561 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php @@ -0,0 +1,113 @@ +selector = $selector; + } + + /** + * @param string $id + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($id, $config, $context) + { + if (!$this->selector && !$config->get('Attr.EnableID')) { + return false; + } + + $id = trim($id); // trim it first + + if ($id === '') { + return false; + } + + $prefix = $config->get('Attr.IDPrefix'); + if ($prefix !== '') { + $prefix .= $config->get('Attr.IDPrefixLocal'); + // prevent re-appending the prefix + if (strpos($id, $prefix) !== 0) { + $id = $prefix . $id; + } + } elseif ($config->get('Attr.IDPrefixLocal') !== '') { + trigger_error( + '%Attr.IDPrefixLocal cannot be used unless ' . + '%Attr.IDPrefix is set', + E_USER_WARNING + ); + } + + if (!$this->selector) { + $id_accumulator =& $context->get('IDAccumulator'); + if (isset($id_accumulator->ids[$id])) { + return false; + } + } + + // we purposely avoid using regex, hopefully this is faster + + if ($config->get('Attr.ID.HTML5') === true) { + if (preg_match('/[\t\n\x0b\x0c ]/', $id)) { + return false; + } + } else { + if (ctype_alpha($id)) { + // OK + } else { + if (!ctype_alpha(@$id[0])) { + return false; + } + // primitive style of regexps, I suppose + $trim = trim( + $id, + 'A..Za..z0..9:-._' + ); + if ($trim !== '') { + return false; + } + } + } + + $regexp = $config->get('Attr.IDBlacklistRegexp'); + if ($regexp && preg_match($regexp, $id)) { + return false; + } + + if (!$this->selector) { + $id_accumulator->add($id); + } + + // if no change was made to the ID, return the result + // else, return the new id if stripping whitespace made it + // valid, or return false. + return $id; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php new file mode 100644 index 0000000..1c4006f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php @@ -0,0 +1,56 @@ + 100) { + return '100%'; + } + return ((string)$points) . '%'; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php new file mode 100644 index 0000000..3decf0c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php @@ -0,0 +1,67 @@ + 'AllowedRel', + 'rev' => 'AllowedRev' + ); + if (!isset($configLookup[$name])) { + throw new Exception('Unrecognized attribute name for link relationship.'); + } + $this->name = $configLookup[$name]; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $allowed = $config->get('Attr.' . $this->name); + if (empty($allowed)) { + return false; + } + + $string = $this->parseCDATA($string); + $parts = explode(' ', $string); + + // lookup to prevent duplicates + $ret_lookup = array(); + foreach ($parts as $part) { + $part = strtolower(trim($part)); + if (!isset($allowed[$part])) { + continue; + } + $ret_lookup[$part] = true; + } + + if (empty($ret_lookup)) { + return false; + } + $string = implode(' ', array_keys($ret_lookup)); + return $string; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php new file mode 100644 index 0000000..bbb20f2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php @@ -0,0 +1,60 @@ +split($string, $config, $context); + $tokens = $this->filter($tokens, $config, $context); + if (empty($tokens)) { + return false; + } + return implode(' ', $tokens); + } + + /** + * Splits a space separated list of tokens into its constituent parts. + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + protected function split($string, $config, $context) + { + // OPTIMIZABLE! + // do the preg_match, capture all subpatterns for reformulation + + // we don't support U+00A1 and up codepoints or + // escaping because I don't know how to do that with regexps + // and plus it would complicate optimization efforts (you never + // see that anyway). + $pattern = '/(?:(?<=\s)|\A)' . // look behind for space or string start + '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)' . + '(?:(?=\s)|\z)/'; // look ahead for space or string end + preg_match_all($pattern, $string, $matches); + return $matches[1]; + } + + /** + * Template method for removing certain tokens based on arbitrary criteria. + * @note If we wanted to be really functional, we'd do an array_filter + * with a callback. But... we're not. + * @param array $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + protected function filter($tokens, $config, $context) + { + return $tokens; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php new file mode 100644 index 0000000..a1d019e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php @@ -0,0 +1,76 @@ +max = $max; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = trim($string); + if ($string === '0') { + return $string; + } + if ($string === '') { + return false; + } + $length = strlen($string); + if (substr($string, $length - 2) == 'px') { + $string = substr($string, 0, $length - 2); + } + if (!is_numeric($string)) { + return false; + } + $int = (int)$string; + + if ($int < 0) { + return '0'; + } + + // upper-bound value, extremely high values can + // crash operating systems, see + // WARNING, above link WILL crash you if you're using Windows + + if ($this->max !== null && $int > $this->max) { + return (string)$this->max; + } + return (string)$int; + } + + /** + * @param string $string + * @return HTMLPurifier_AttrDef + */ + public function make($string) + { + if ($string === '') { + $max = null; + } else { + $max = (int)$string; + } + $class = get_class($this); + return new $class($max); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php new file mode 100644 index 0000000..400e707 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php @@ -0,0 +1,91 @@ +negative = $negative; + $this->zero = $zero; + $this->positive = $positive; + } + + /** + * @param string $integer + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($integer, $config, $context) + { + $integer = $this->parseCDATA($integer); + if ($integer === '') { + return false; + } + + // we could possibly simply typecast it to integer, but there are + // certain fringe cases that must not return an integer. + + // clip leading sign + if ($this->negative && $integer[0] === '-') { + $digits = substr($integer, 1); + if ($digits === '0') { + $integer = '0'; + } // rm minus sign for zero + } elseif ($this->positive && $integer[0] === '+') { + $digits = $integer = substr($integer, 1); // rm unnecessary plus + } else { + $digits = $integer; + } + + // test if it's numeric + if (!ctype_digit($digits)) { + return false; + } + + // perform scope tests + if (!$this->zero && $integer == 0) { + return false; + } + if (!$this->positive && $integer > 0) { + return false; + } + if (!$this->negative && $integer < 0) { + return false; + } + + return $integer; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php new file mode 100644 index 0000000..2a55cea --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php @@ -0,0 +1,86 @@ + 8 || !ctype_alnum($subtags[1])) { + return $new_string; + } + if (!ctype_lower($subtags[1])) { + $subtags[1] = strtolower($subtags[1]); + } + + $new_string .= '-' . $subtags[1]; + if ($num_subtags == 2) { + return $new_string; + } + + // process all other subtags, index 2 and up + for ($i = 2; $i < $num_subtags; $i++) { + $length = strlen($subtags[$i]); + if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) { + return $new_string; + } + if (!ctype_lower($subtags[$i])) { + $subtags[$i] = strtolower($subtags[$i]); + } + $new_string .= '-' . $subtags[$i]; + } + return $new_string; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php new file mode 100644 index 0000000..c7eb319 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php @@ -0,0 +1,53 @@ +tag = $tag; + $this->withTag = $with_tag; + $this->withoutTag = $without_tag; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $token = $context->get('CurrentToken', true); + if (!$token || $token->name !== $this->tag) { + return $this->withoutTag->validate($string, $config, $context); + } else { + return $this->withTag->validate($string, $config, $context); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php new file mode 100644 index 0000000..4553a4e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php @@ -0,0 +1,21 @@ +parseCDATA($string); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php new file mode 100644 index 0000000..c1cd897 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php @@ -0,0 +1,111 @@ +parser = new HTMLPurifier_URIParser(); + $this->embedsResource = (bool)$embeds_resource; + } + + /** + * @param string $string + * @return HTMLPurifier_AttrDef_URI + */ + public function make($string) + { + $embeds = ($string === 'embedded'); + return new HTMLPurifier_AttrDef_URI($embeds); + } + + /** + * @param string $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($uri, $config, $context) + { + if ($config->get('URI.Disable')) { + return false; + } + + $uri = $this->parseCDATA($uri); + + // parse the URI + $uri = $this->parser->parse($uri); + if ($uri === false) { + return false; + } + + // add embedded flag to context for validators + $context->register('EmbeddedURI', $this->embedsResource); + + $ok = false; + do { + + // generic validation + $result = $uri->validate($config, $context); + if (!$result) { + break; + } + + // chained filtering + $uri_def = $config->getDefinition('URI'); + $result = $uri_def->filter($uri, $config, $context); + if (!$result) { + break; + } + + // scheme-specific validation + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) { + break; + } + if ($this->embedsResource && !$scheme_obj->browsable) { + break; + } + $result = $scheme_obj->validate($uri, $config, $context); + if (!$result) { + break; + } + + // Post chained filtering + $result = $uri_def->postFilter($uri, $config, $context); + if (!$result) { + break; + } + + // survived gauntlet + $ok = true; + + } while (false); + + $context->destroy('EmbeddedURI'); + if (!$ok) { + return false; + } + // back to string + return $uri->toString(); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php new file mode 100644 index 0000000..daf32b7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php @@ -0,0 +1,20 @@ +" + // that needs more percent encoding to be done + if ($string == '') { + return false; + } + $string = trim($string); + $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string); + return $result ? $string : false; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php new file mode 100644 index 0000000..17a97c1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php @@ -0,0 +1,136 @@ +ipv4 = new HTMLPurifier_AttrDef_URI_IPv4(); + $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6(); + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $length = strlen($string); + // empty hostname is OK; it's usually semantically equivalent: + // the default host as defined by a URI scheme is used: + // + // If the URI scheme defines a default for host, then that + // default applies when the host subcomponent is undefined + // or when the registered name is empty (zero length). + if ($string === '') { + return ''; + } + if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') { + //IPv6 + $ip = substr($string, 1, $length - 2); + $valid = $this->ipv6->validate($ip, $config, $context); + if ($valid === false) { + return false; + } + return '[' . $valid . ']'; + } + + // need to do checks on unusual encodings too + $ipv4 = $this->ipv4->validate($string, $config, $context); + if ($ipv4 !== false) { + return $ipv4; + } + + // A regular domain name. + + // This doesn't match I18N domain names, but we don't have proper IRI support, + // so force users to insert Punycode. + + // Underscores defined as Unreserved Characters in RFC 3986 are + // allowed in a URI. There are cases where we want to consider a + // URI containing "_" such as "_dmarc.example.com". + // Underscores are not allowed in the default. If you want to + // allow it, set Core.AllowHostnameUnderscore to true. + $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : ''; + + // Based off of RFC 1738, but amended so that + // as per RFC 3696, the top label need only not be all numeric. + // The productions describing this are: + $a = '[a-z]'; // alpha + $an = "[a-z0-9$underscore]"; // alphanum + $and = "[a-z0-9-$underscore]"; // alphanum | "-" + // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum + $domainlabel = "$an(?:$and*$an)?"; + // AMENDED as per RFC 3696 + // toplabel = alphanum | alphanum *( alphanum | "-" ) alphanum + // side condition: not all numeric + $toplabel = "$an(?:$and*$an)?"; + // hostname = *( domainlabel "." ) toplabel [ "." ] + if (preg_match("/^(?:$domainlabel\.)*($toplabel)\.?$/i", $string, $matches)) { + if (!ctype_digit($matches[1])) { + return $string; + } + } + + // PHP 5.3 and later support this functionality natively + if (function_exists('idn_to_ascii')) { + if (defined('IDNA_NONTRANSITIONAL_TO_ASCII') && defined('INTL_IDNA_VARIANT_UTS46')) { + $string = idn_to_ascii($string, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46); + } else { + $string = idn_to_ascii($string); + } + + // If we have Net_IDNA2 support, we can support IRIs by + // punycoding them. (This is the most portable thing to do, + // since otherwise we have to assume browsers support + } elseif ($config->get('Core.EnableIDNA') && class_exists('Net_IDNA2')) { + $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true)); + // we need to encode each period separately + $parts = explode('.', $string); + try { + $new_parts = array(); + foreach ($parts as $part) { + $encodable = false; + for ($i = 0, $c = strlen($part); $i < $c; $i++) { + if (ord($part[$i]) > 0x7a) { + $encodable = true; + break; + } + } + if (!$encodable) { + $new_parts[] = $part; + } else { + $new_parts[] = $idna->encode($part); + } + } + $string = implode('.', $new_parts); + } catch (Exception $e) { + // XXX error reporting + } + } + // Try again + if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) { + return $string; + } + return false; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php new file mode 100644 index 0000000..30ac16c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php @@ -0,0 +1,45 @@ +ip4) { + $this->_loadRegex(); + } + + if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) { + return $aIP; + } + return false; + } + + /** + * Lazy load function to prevent regex from being stuffed in + * cache. + */ + protected function _loadRegex() + { + $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255 + $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})"; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php new file mode 100644 index 0000000..dc4ef62 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php @@ -0,0 +1,89 @@ +ip4) { + $this->_loadRegex(); + } + + $original = $aIP; + + $hex = '[0-9a-fA-F]'; + $blk = '(?:' . $hex . '{1,4})'; + $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128 + + // prefix check + if (strpos($aIP, '/') !== false) { + if (preg_match('#' . $pre . '$#s', $aIP, $find)) { + $aIP = substr($aIP, 0, 0 - strlen($find[0])); + unset($find); + } else { + return false; + } + } + + // IPv4-compatibility check + if (preg_match('#(?<=:' . ')' . $this->ip4 . '$#s', $aIP, $find)) { + $aIP = substr($aIP, 0, 0 - strlen($find[0])); + $ip = explode('.', $find[0]); + $ip = array_map('dechex', $ip); + $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3]; + unset($find, $ip); + } + + // compression check + $aIP = explode('::', $aIP); + $c = count($aIP); + if ($c > 2) { + return false; + } elseif ($c == 2) { + list($first, $second) = $aIP; + $first = explode(':', $first); + $second = explode(':', $second); + + if (count($first) + count($second) > 8) { + return false; + } + + while (count($first) < 8) { + array_push($first, '0'); + } + + array_splice($first, 8 - count($second), 8, $second); + $aIP = $first; + unset($first, $second); + } else { + $aIP = explode(':', $aIP[0]); + } + $c = count($aIP); + + if ($c != 8) { + return false; + } + + // All the pieces should be 16-bit hex strings. Are they? + foreach ($aIP as $piece) { + if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) { + return false; + } + } + return $original; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php new file mode 100644 index 0000000..b428331 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php @@ -0,0 +1,60 @@ +confiscateAttr($attr, 'background'); + // some validation should happen here + + $this->prependCSS($attr, "background-image:url($background);"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php new file mode 100644 index 0000000..d769c6f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php @@ -0,0 +1,27 @@ +get('Attr.DefaultTextDir'); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php new file mode 100644 index 0000000..0f51fd2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php @@ -0,0 +1,28 @@ +confiscateAttr($attr, 'bgcolor'); + // some validation should happen here + + $this->prependCSS($attr, "background-color:$bgcolor;"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php new file mode 100644 index 0000000..f25cd01 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php @@ -0,0 +1,47 @@ +attr = $attr; + $this->css = $css; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } + unset($attr[$this->attr]); + $this->prependCSS($attr, $this->css); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php new file mode 100644 index 0000000..057dc01 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php @@ -0,0 +1,26 @@ +confiscateAttr($attr, 'border'); + // some validation should happen here + $this->prependCSS($attr, "border:{$border_width}px solid;"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php new file mode 100644 index 0000000..7ccd0e3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php @@ -0,0 +1,68 @@ +attr = $attr; + $this->enumToCSS = $enum_to_css; + $this->caseSensitive = (bool)$case_sensitive; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } + + $value = trim($attr[$this->attr]); + unset($attr[$this->attr]); + + if (!$this->caseSensitive) { + $value = strtolower($value); + } + + if (!isset($this->enumToCSS[$value])) { + return $attr; + } + $this->prependCSS($attr, $this->enumToCSS[$value]); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php new file mode 100644 index 0000000..235ebb3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php @@ -0,0 +1,47 @@ +get('Core.RemoveInvalidImg')) { + return $attr; + } + $attr['src'] = $config->get('Attr.DefaultInvalidImage'); + $src = false; + } + + if (!isset($attr['alt'])) { + if ($src) { + $alt = $config->get('Attr.DefaultImageAlt'); + if ($alt === null) { + $attr['alt'] = basename($attr['src']); + } else { + $attr['alt'] = $alt; + } + } else { + $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt'); + } + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php new file mode 100644 index 0000000..350b335 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php @@ -0,0 +1,61 @@ + array('left', 'right'), + 'vspace' => array('top', 'bottom') + ); + + /** + * @param string $attr + */ + public function __construct($attr) + { + $this->attr = $attr; + if (!isset($this->css[$attr])) { + trigger_error(htmlspecialchars($attr) . ' is not valid space attribute'); + } + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } + + $width = $this->confiscateAttr($attr, $this->attr); + // some validation could happen here + + if (!isset($this->css[$this->attr])) { + return $attr; + } + + $style = ''; + foreach ($this->css[$this->attr] as $suffix) { + $property = "margin-$suffix"; + $style .= "$property:{$width}px;"; + } + $this->prependCSS($attr, $style); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php new file mode 100644 index 0000000..3ab47ed --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php @@ -0,0 +1,56 @@ +pixels = new HTMLPurifier_AttrDef_HTML_Pixels(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['type'])) { + $t = 'text'; + } else { + $t = strtolower($attr['type']); + } + if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') { + unset($attr['checked']); + } + if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') { + unset($attr['maxlength']); + } + if (isset($attr['size']) && $t !== 'text' && $t !== 'password') { + $result = $this->pixels->validate($attr['size'], $config, $context); + if ($result === false) { + unset($attr['size']); + } else { + $attr['size'] = $result; + } + } + if (isset($attr['src']) && $t !== 'image') { + unset($attr['src']); + } + if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) { + $attr['value'] = ''; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php new file mode 100644 index 0000000..5b0aff0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php @@ -0,0 +1,31 @@ +name = $name; + $this->cssName = $css_name ? $css_name : $name; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->name])) { + return $attr; + } + $length = $this->confiscateAttr($attr, $this->name); + if (ctype_digit($length)) { + $length .= 'px'; + } + $this->prependCSS($attr, $this->cssName . ":$length;"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php new file mode 100644 index 0000000..63cce68 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php @@ -0,0 +1,33 @@ +get('HTML.Attr.Name.UseCDATA')) { + return $attr; + } + if (!isset($attr['name'])) { + return $attr; + } + $id = $this->confiscateAttr($attr, 'name'); + if (isset($attr['id'])) { + return $attr; + } + $attr['id'] = $id; + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php new file mode 100644 index 0000000..5a1fdbb --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php @@ -0,0 +1,46 @@ +idDef = new HTMLPurifier_AttrDef_HTML_ID(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['name'])) { + return $attr; + } + $name = $attr['name']; + if (isset($attr['id']) && $attr['id'] === $name) { + return $attr; + } + $result = $this->idDef->validate($name, $config, $context); + if ($result === false) { + unset($attr['name']); + } else { + $attr['name'] = $result; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php new file mode 100644 index 0000000..1057ebe --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php @@ -0,0 +1,52 @@ +parser = new HTMLPurifier_URIParser(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['href'])) { + return $attr; + } + + // XXX Kind of inefficient + $url = $this->parser->parse($attr['href']); + $scheme = $url->getSchemeObj($config, $context); + + if ($scheme->browsable && !$url->isLocal($config, $context)) { + if (isset($attr['rel'])) { + $rels = explode(' ', $attr['rel']); + if (!in_array('nofollow', $rels)) { + $rels[] = 'nofollow'; + } + $attr['rel'] = implode(' ', $rels); + } else { + $attr['rel'] = 'nofollow'; + } + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php new file mode 100644 index 0000000..231c81a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php @@ -0,0 +1,25 @@ +uri = new HTMLPurifier_AttrDef_URI(true); // embedded + $this->wmode = new HTMLPurifier_AttrDef_Enum(array('window', 'opaque', 'transparent')); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + // If we add support for other objects, we'll need to alter the + // transforms. + switch ($attr['name']) { + // application/x-shockwave-flash + // Keep this synchronized with Injector/SafeObject.php + case 'allowScriptAccess': + $attr['value'] = 'never'; + break; + case 'allowNetworking': + $attr['value'] = 'internal'; + break; + case 'allowFullScreen': + if ($config->get('HTML.FlashAllowFullScreen')) { + $attr['value'] = ($attr['value'] == 'true') ? 'true' : 'false'; + } else { + $attr['value'] = 'false'; + } + break; + case 'wmode': + $attr['value'] = $this->wmode->validate($attr['value'], $config, $context); + break; + case 'movie': + case 'src': + $attr['name'] = "movie"; + $attr['value'] = $this->uri->validate($attr['value'], $config, $context); + break; + case 'flashvars': + // we're going to allow arbitrary inputs to the SWF, on + // the reasoning that it could only hack the SWF, not us. + break; + // add other cases to support other param name/value pairs + default: + $attr['name'] = $attr['value'] = null; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php new file mode 100644 index 0000000..b7057bb --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php @@ -0,0 +1,23 @@ + + */ +class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform +{ + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['type'])) { + $attr['type'] = 'text/javascript'; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php new file mode 100644 index 0000000..cc30ab8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php @@ -0,0 +1,49 @@ +parser = new HTMLPurifier_URIParser(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['href'])) { + return $attr; + } + + // XXX Kind of inefficient + $url = $this->parser->parse($attr['href']); + + // Ignore invalid schemes (e.g. `javascript:`) + if (!($scheme = $url->getSchemeObj($config, $context))) { + return $attr; + } + + if ($scheme->browsable && !$url->isBenign($config, $context)) { + $attr['target'] = '_blank'; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php new file mode 100644 index 0000000..1db3c6c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php @@ -0,0 +1,37 @@ + + */ +class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform +{ + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + // Calculated from Firefox + if (!isset($attr['cols'])) { + $attr['cols'] = '22'; + } + if (!isset($attr['rows'])) { + $attr['rows'] = '3'; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php new file mode 100644 index 0000000..62575ca --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php @@ -0,0 +1,97 @@ +info['Enum'] = new HTMLPurifier_AttrDef_Enum(); + $this->info['Bool'] = new HTMLPurifier_AttrDef_HTML_Bool(); + + $this->info['CDATA'] = new HTMLPurifier_AttrDef_Text(); + $this->info['ID'] = new HTMLPurifier_AttrDef_HTML_ID(); + $this->info['Length'] = new HTMLPurifier_AttrDef_HTML_Length(); + $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength(); + $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens(); + $this->info['Pixels'] = new HTMLPurifier_AttrDef_HTML_Pixels(); + $this->info['Text'] = new HTMLPurifier_AttrDef_Text(); + $this->info['URI'] = new HTMLPurifier_AttrDef_URI(); + $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang(); + $this->info['Color'] = new HTMLPurifier_AttrDef_HTML_Color(); + $this->info['IAlign'] = self::makeEnum('top,middle,bottom,left,right'); + $this->info['LAlign'] = self::makeEnum('top,bottom,left,right'); + $this->info['FrameTarget'] = new HTMLPurifier_AttrDef_HTML_FrameTarget(); + $this->info['ContentEditable'] = new HTMLPurifier_AttrDef_HTML_ContentEditable(); + + // unimplemented aliases + $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text(); + $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text(); + $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text(); + $this->info['Character'] = new HTMLPurifier_AttrDef_Text(); + + // "proprietary" types + $this->info['Class'] = new HTMLPurifier_AttrDef_HTML_Class(); + + // number is really a positive integer (one or more digits) + // FIXME: ^^ not always, see start and value of list items + $this->info['Number'] = new HTMLPurifier_AttrDef_Integer(false, false, true); + } + + private static function makeEnum($in) + { + return new HTMLPurifier_AttrDef_Clone(new HTMLPurifier_AttrDef_Enum(explode(',', $in))); + } + + /** + * Retrieves a type + * @param string $type String type name + * @return HTMLPurifier_AttrDef Object AttrDef for type + */ + public function get($type) + { + // determine if there is any extra info tacked on + if (strpos($type, '#') !== false) { + list($type, $string) = explode('#', $type, 2); + } else { + $string = ''; + } + + if (!isset($this->info[$type])) { + throw new Exception('Cannot retrieve undefined attribute type ' . $type); + return; + } + return $this->info[$type]->make($string); + } + + /** + * Sets a new implementation for a type + * @param string $type String type name + * @param HTMLPurifier_AttrDef $impl Object AttrDef for type + */ + public function set($type, $impl) + { + $this->info[$type] = $impl; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php new file mode 100644 index 0000000..350330b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php @@ -0,0 +1,178 @@ +getHTMLDefinition(); + $e =& $context->get('ErrorCollector', true); + + // initialize IDAccumulator if necessary + $ok =& $context->get('IDAccumulator', true); + if (!$ok) { + $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); + $context->register('IDAccumulator', $id_accumulator); + } + + // initialize CurrentToken if necessary + $current_token =& $context->get('CurrentToken', true); + if (!$current_token) { + $context->register('CurrentToken', $token); + } + + if (!$token instanceof HTMLPurifier_Token_Start && + !$token instanceof HTMLPurifier_Token_Empty + ) { + return; + } + + // create alias to global definition array, see also $defs + // DEFINITION CALL + $d_defs = $definition->info_global_attr; + + // don't update token until the very end, to ensure an atomic update + $attr = $token->attr; + + // do global transformations (pre) + // nothing currently utilizes this + foreach ($definition->info_attr_transform_pre as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + } + + // do local transformations only applicable to this element (pre) + // ex.

to

+ This directive turns on auto-paragraphing, where double newlines are + converted in to paragraphs whenever possible. Auto-paragraphing: +

+
    +
  • Always applies to inline elements or text in the root node,
  • +
  • Applies to inline elements or text with double newlines in nodes + that allow paragraph tags,
  • +
  • Applies to double newlines in paragraph tags
  • +
+

+ p tags must be allowed for this directive to take effect. + We do not use br tags for paragraphing, as that is + semantically incorrect. +

+

+ To prevent auto-paragraphing as a content-producer, refrain from using + double-newlines except to specify a new paragraph or in contexts where + it has special meaning (whitespace usually has no meaning except in + tags like pre, so this should not be difficult.) To prevent + the paragraphing of inline text adjacent to block elements, wrap them + in div tags (the behavior is slightly different outside of + the root node.) +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt new file mode 100644 index 0000000..2a47648 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt @@ -0,0 +1,12 @@ +AutoFormat.Custom +TYPE: list +VERSION: 2.0.1 +DEFAULT: array() +--DESCRIPTION-- + +

+ This directive can be used to add custom auto-format injectors. + Specify an array of injector names (class name minus the prefix) + or concrete implementations. Injector class must exist. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt new file mode 100644 index 0000000..663064a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt @@ -0,0 +1,11 @@ +AutoFormat.DisplayLinkURI +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ This directive turns on the in-text display of URIs in <a> tags, and disables + those links. For example, example becomes + example (http://example.com). +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt new file mode 100644 index 0000000..3a48ba9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt @@ -0,0 +1,12 @@ +AutoFormat.Linkify +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +

+ This directive turns on linkification, auto-linking http, ftp and + https URLs. a tags with the href attribute + must be allowed. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt new file mode 100644 index 0000000..db58b13 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt @@ -0,0 +1,12 @@ +AutoFormat.PurifierLinkify.DocURL +TYPE: string +VERSION: 2.0.1 +DEFAULT: '#%s' +ALIASES: AutoFormatParam.PurifierLinkifyDocURL +--DESCRIPTION-- +

+ Location of configuration documentation to link to, let %s substitute + into the configuration's namespace and directive names sans the percent + sign. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt new file mode 100644 index 0000000..7996488 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt @@ -0,0 +1,12 @@ +AutoFormat.PurifierLinkify +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +

+ Internal auto-formatter that converts configuration directives in + syntax %Namespace.Directive to links. a tags + with the href attribute must be allowed. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt new file mode 100644 index 0000000..6367fe2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt @@ -0,0 +1,14 @@ +AutoFormat.RemoveEmpty.Predicate +TYPE: hash +VERSION: 4.7.0 +DEFAULT: array('colgroup' => array(), 'th' => array(), 'td' => array(), 'iframe' => array('src')) +--DESCRIPTION-- +

+ Given that an element has no contents, it will be removed by default, unless + this predicate dictates otherwise. The predicate can either be an associative + map from tag name to list of attributes that must be present for the element + to be considered preserved: thus, the default always preserves colgroup, + th and td, and also iframe if it + has a src. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt new file mode 100644 index 0000000..35c393b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt @@ -0,0 +1,11 @@ +AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions +TYPE: lookup +VERSION: 4.0.0 +DEFAULT: array('td' => true, 'th' => true) +--DESCRIPTION-- +

+ When %AutoFormat.RemoveEmpty and %AutoFormat.RemoveEmpty.RemoveNbsp + are enabled, this directive defines what HTML elements should not be + removede if they have only a non-breaking space in them. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt new file mode 100644 index 0000000..9228dee --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt @@ -0,0 +1,15 @@ +AutoFormat.RemoveEmpty.RemoveNbsp +TYPE: bool +VERSION: 4.0.0 +DEFAULT: false +--DESCRIPTION-- +

+ When enabled, HTML Purifier will treat any elements that contain only + non-breaking spaces as well as regular whitespace as empty, and remove + them when %AutoFormat.RemoveEmpty is enabled. +

+

+ See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements + that don't have this behavior applied to them. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt new file mode 100644 index 0000000..34657ba --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt @@ -0,0 +1,46 @@ +AutoFormat.RemoveEmpty +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ When enabled, HTML Purifier will attempt to remove empty elements that + contribute no semantic information to the document. The following types + of nodes will be removed: +

+
  • + Tags with no attributes and no content, and that are not empty + elements (remove <a></a> but not + <br />), and +
  • +
  • + Tags with no content, except for:
      +
    • The colgroup element, or
    • +
    • + Elements with the id or name attribute, + when those attributes are permitted on those elements. +
    • +
  • +
+

+ Please be very careful when using this functionality; while it may not + seem that empty elements contain useful information, they can alter the + layout of a document given appropriate styling. This directive is most + useful when you are processing machine-generated HTML, please avoid using + it on regular user HTML. +

+

+ Elements that contain only whitespace will be treated as empty. Non-breaking + spaces, however, do not count as whitespace. See + %AutoFormat.RemoveEmpty.RemoveNbsp for alternate behavior. +

+

+ This algorithm is not perfect; you may still notice some empty tags, + particularly if a node had elements, but those elements were later removed + because they were not permitted in that context, or tags that, after + being auto-closed by another tag, where empty. This is for safety reasons + to prevent clever code from breaking validation. The general rule of thumb: + if a tag looked empty on the way in, it will get removed; if HTML Purifier + made it empty, it will stay. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt new file mode 100644 index 0000000..dde990a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt @@ -0,0 +1,11 @@ +AutoFormat.RemoveSpansWithoutAttributes +TYPE: bool +VERSION: 4.0.1 +DEFAULT: false +--DESCRIPTION-- +

+ This directive causes span tags without any attributes + to be removed. It will also remove spans that had all attributes + removed during processing. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt new file mode 100644 index 0000000..4d054b1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt @@ -0,0 +1,11 @@ +CSS.AllowDuplicates +TYPE: bool +DEFAULT: false +VERSION: 4.8.0 +--DESCRIPTION-- +

+ By default, HTML Purifier removes duplicate CSS properties, + like color:red; color:blue. If this is set to + true, duplicate properties are allowed. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt new file mode 100644 index 0000000..b324608 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt @@ -0,0 +1,8 @@ +CSS.AllowImportant +TYPE: bool +DEFAULT: false +VERSION: 3.1.0 +--DESCRIPTION-- +This parameter determines whether or not !important cascade modifiers should +be allowed in user CSS. If false, !important will stripped. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt new file mode 100644 index 0000000..748be0e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt @@ -0,0 +1,11 @@ +CSS.AllowTricky +TYPE: bool +DEFAULT: false +VERSION: 3.1.0 +--DESCRIPTION-- +This parameter determines whether or not to allow "tricky" CSS properties and +values. Tricky CSS properties/values can drastically modify page layout or +be used for deceptive practices but do not directly constitute a security risk. +For example, display:none; is considered a tricky property that +will only be allowed if this directive is set to true. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt new file mode 100644 index 0000000..3fd4654 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt @@ -0,0 +1,12 @@ +CSS.AllowedFonts +TYPE: lookup/null +VERSION: 4.3.0 +DEFAULT: NULL +--DESCRIPTION-- +

+ Allows you to manually specify a set of allowed fonts. If + NULL, all fonts are allowed. This directive + affects generic names (serif, sans-serif, monospace, cursive, + fantasy) as well as specific font families. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt new file mode 100644 index 0000000..460112e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt @@ -0,0 +1,18 @@ +CSS.AllowedProperties +TYPE: lookup/null +VERSION: 3.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ If HTML Purifier's style attributes set is unsatisfactory for your needs, + you can overload it with your own list of tags to allow. Note that this + method is subtractive: it does its job by taking away from HTML Purifier + usual feature set, so you cannot add an attribute that HTML Purifier never + supported in the first place. +

+

+ Warning: If another directive conflicts with the + elements here, that directive will win and override. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt new file mode 100644 index 0000000..5cb7dda --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt @@ -0,0 +1,11 @@ +CSS.DefinitionRev +TYPE: int +VERSION: 2.0.0 +DEFAULT: 1 +--DESCRIPTION-- + +

+ Revision identifier for your custom definition. See + %HTML.DefinitionRev for details. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt new file mode 100644 index 0000000..f1f5c5f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt @@ -0,0 +1,13 @@ +CSS.ForbiddenProperties +TYPE: lookup +VERSION: 4.2.0 +DEFAULT: array() +--DESCRIPTION-- +

+ This is the logical inverse of %CSS.AllowedProperties, and it will + override that directive or any other directive. If possible, + %CSS.AllowedProperties is recommended over this directive, + because it can sometimes be difficult to tell whether or not you've + forbidden all of the CSS properties you truly would like to disallow. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt new file mode 100644 index 0000000..63c2730 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt @@ -0,0 +1,16 @@ +CSS.MaxImgLength +TYPE: string/null +DEFAULT: null +VERSION: 3.1.1 +--DESCRIPTION-- +

+ This parameter sets the maximum allowed length on img tags, + effectively the width and height properties. + Only absolute units of measurement (in, pt, pc, mm, cm) and pixels (px) are allowed. This is + in place to prevent imagecrash attacks, disable with null at your own risk. + This directive is similar to %HTML.MaxImgLength, and both should be + concurrently edited, although there are + subtle differences in the input format (the CSS max is a number with + a unit). +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt new file mode 100644 index 0000000..148eedb --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt @@ -0,0 +1,10 @@ +CSS.Proprietary +TYPE: bool +VERSION: 3.0.0 +DEFAULT: false +--DESCRIPTION-- + +

+ Whether or not to allow safe, proprietary CSS values. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt new file mode 100644 index 0000000..e733a61 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt @@ -0,0 +1,9 @@ +CSS.Trusted +TYPE: bool +VERSION: 4.2.1 +DEFAULT: false +--DESCRIPTION-- +Indicates whether or not the user's CSS input is trusted or not. If the +input is trusted, a more expansive set of allowed properties. See +also %HTML.Trusted. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt new file mode 100644 index 0000000..c486724 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt @@ -0,0 +1,14 @@ +Cache.DefinitionImpl +TYPE: string/null +VERSION: 2.0.0 +DEFAULT: 'Serializer' +--DESCRIPTION-- + +This directive defines which method to use when caching definitions, +the complex data-type that makes HTML Purifier tick. Set to null +to disable caching (not recommended, as you will see a definite +performance degradation). + +--ALIASES-- +Core.DefinitionCache +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt new file mode 100644 index 0000000..5403650 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt @@ -0,0 +1,13 @@ +Cache.SerializerPath +TYPE: string/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Absolute path with no trailing slash to store serialized definitions in. + Default is within the + HTML Purifier library inside DefinitionCache/Serializer. This + path must be writable by the webserver. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt new file mode 100644 index 0000000..2e0cc81 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt @@ -0,0 +1,16 @@ +Cache.SerializerPermissions +TYPE: int/null +VERSION: 4.3.0 +DEFAULT: 0755 +--DESCRIPTION-- + +

+ Directory permissions of the files and directories created inside + the DefinitionCache/Serializer or other custom serializer path. +

+

+ In HTML Purifier 4.8.0, this also supports NULL, + which means that no chmod'ing or directory creation shall + occur. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt new file mode 100644 index 0000000..568cbf3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt @@ -0,0 +1,18 @@ +Core.AggressivelyFixLt +TYPE: bool +VERSION: 2.1.0 +DEFAULT: true +--DESCRIPTION-- +

+ This directive enables aggressive pre-filter fixes HTML Purifier can + perform in order to ensure that open angled-brackets do not get killed + during parsing stage. Enabling this will result in two preg_replace_callback + calls and at least two preg_replace calls for every HTML document parsed; + if your users make very well-formed HTML, you can set this directive false. + This has no effect when DirectLex is used. +

+

+ Notice: This directive's default turned from false to true + in HTML Purifier 3.2.0. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt new file mode 100644 index 0000000..b2b6ab1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt @@ -0,0 +1,16 @@ +Core.AggressivelyRemoveScript +TYPE: bool +VERSION: 4.9.0 +DEFAULT: true +--DESCRIPTION-- +

+ This directive enables aggressive pre-filter removal of + script tags. This is not necessary for security, + but it can help work around a bug in libxml where embedded + HTML elements inside script sections cause the parser to + choke. To revert to pre-4.9.0 behavior, set this to false. + This directive has no effect if %Core.Trusted is true, + %Core.RemoveScriptContents is false, or %Core.HiddenElements + does not contain script. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt new file mode 100644 index 0000000..2c910cc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt @@ -0,0 +1,16 @@ +Core.AllowHostnameUnderscore +TYPE: bool +VERSION: 4.6.0 +DEFAULT: false +--DESCRIPTION-- +

+ By RFC 1123, underscores are not permitted in host names. + (This is in contrast to the specification for DNS, RFC + 2181, which allows underscores.) + However, most browsers do the right thing when faced with + an underscore in the host name, and so some poorly written + websites are written with the expectation this should work. + Setting this parameter to true relaxes our allowed character + check so that underscores are permitted. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowParseManyTags.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowParseManyTags.txt new file mode 100644 index 0000000..06278f8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowParseManyTags.txt @@ -0,0 +1,12 @@ +Core.AllowParseManyTags +TYPE: bool +DEFAULT: false +VERSION: 4.10.1 +--DESCRIPTION-- +

+ This directive allows parsing of many nested tags. + If you set true, relaxes any hardcoded limit from the parser. + However, in that case it may cause a Dos attack. + Be careful when enabling it. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt new file mode 100644 index 0000000..d731791 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt @@ -0,0 +1,12 @@ +Core.CollectErrors +TYPE: bool +VERSION: 2.0.0 +DEFAULT: false +--DESCRIPTION-- + +Whether or not to collect errors found while filtering the document. This +is a useful way to give feedback to your users. Warning: +Currently this feature is very patchy and experimental, with lots of +possible error messages not yet implemented. It will not cause any +problems, but it may not help your users either. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt new file mode 100644 index 0000000..a75844c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt @@ -0,0 +1,160 @@ +Core.ColorKeywords +TYPE: hash +VERSION: 2.0.0 +--DEFAULT-- +array ( + 'aliceblue' => '#F0F8FF', + 'antiquewhite' => '#FAEBD7', + 'aqua' => '#00FFFF', + 'aquamarine' => '#7FFFD4', + 'azure' => '#F0FFFF', + 'beige' => '#F5F5DC', + 'bisque' => '#FFE4C4', + 'black' => '#000000', + 'blanchedalmond' => '#FFEBCD', + 'blue' => '#0000FF', + 'blueviolet' => '#8A2BE2', + 'brown' => '#A52A2A', + 'burlywood' => '#DEB887', + 'cadetblue' => '#5F9EA0', + 'chartreuse' => '#7FFF00', + 'chocolate' => '#D2691E', + 'coral' => '#FF7F50', + 'cornflowerblue' => '#6495ED', + 'cornsilk' => '#FFF8DC', + 'crimson' => '#DC143C', + 'cyan' => '#00FFFF', + 'darkblue' => '#00008B', + 'darkcyan' => '#008B8B', + 'darkgoldenrod' => '#B8860B', + 'darkgray' => '#A9A9A9', + 'darkgrey' => '#A9A9A9', + 'darkgreen' => '#006400', + 'darkkhaki' => '#BDB76B', + 'darkmagenta' => '#8B008B', + 'darkolivegreen' => '#556B2F', + 'darkorange' => '#FF8C00', + 'darkorchid' => '#9932CC', + 'darkred' => '#8B0000', + 'darksalmon' => '#E9967A', + 'darkseagreen' => '#8FBC8F', + 'darkslateblue' => '#483D8B', + 'darkslategray' => '#2F4F4F', + 'darkslategrey' => '#2F4F4F', + 'darkturquoise' => '#00CED1', + 'darkviolet' => '#9400D3', + 'deeppink' => '#FF1493', + 'deepskyblue' => '#00BFFF', + 'dimgray' => '#696969', + 'dimgrey' => '#696969', + 'dodgerblue' => '#1E90FF', + 'firebrick' => '#B22222', + 'floralwhite' => '#FFFAF0', + 'forestgreen' => '#228B22', + 'fuchsia' => '#FF00FF', + 'gainsboro' => '#DCDCDC', + 'ghostwhite' => '#F8F8FF', + 'gold' => '#FFD700', + 'goldenrod' => '#DAA520', + 'gray' => '#808080', + 'grey' => '#808080', + 'green' => '#008000', + 'greenyellow' => '#ADFF2F', + 'honeydew' => '#F0FFF0', + 'hotpink' => '#FF69B4', + 'indianred' => '#CD5C5C', + 'indigo' => '#4B0082', + 'ivory' => '#FFFFF0', + 'khaki' => '#F0E68C', + 'lavender' => '#E6E6FA', + 'lavenderblush' => '#FFF0F5', + 'lawngreen' => '#7CFC00', + 'lemonchiffon' => '#FFFACD', + 'lightblue' => '#ADD8E6', + 'lightcoral' => '#F08080', + 'lightcyan' => '#E0FFFF', + 'lightgoldenrodyellow' => '#FAFAD2', + 'lightgray' => '#D3D3D3', + 'lightgrey' => '#D3D3D3', + 'lightgreen' => '#90EE90', + 'lightpink' => '#FFB6C1', + 'lightsalmon' => '#FFA07A', + 'lightseagreen' => '#20B2AA', + 'lightskyblue' => '#87CEFA', + 'lightslategray' => '#778899', + 'lightslategrey' => '#778899', + 'lightsteelblue' => '#B0C4DE', + 'lightyellow' => '#FFFFE0', + 'lime' => '#00FF00', + 'limegreen' => '#32CD32', + 'linen' => '#FAF0E6', + 'magenta' => '#FF00FF', + 'maroon' => '#800000', + 'mediumaquamarine' => '#66CDAA', + 'mediumblue' => '#0000CD', + 'mediumorchid' => '#BA55D3', + 'mediumpurple' => '#9370DB', + 'mediumseagreen' => '#3CB371', + 'mediumslateblue' => '#7B68EE', + 'mediumspringgreen' => '#00FA9A', + 'mediumturquoise' => '#48D1CC', + 'mediumvioletred' => '#C71585', + 'midnightblue' => '#191970', + 'mintcream' => '#F5FFFA', + 'mistyrose' => '#FFE4E1', + 'moccasin' => '#FFE4B5', + 'navajowhite' => '#FFDEAD', + 'navy' => '#000080', + 'oldlace' => '#FDF5E6', + 'olive' => '#808000', + 'olivedrab' => '#6B8E23', + 'orange' => '#FFA500', + 'orangered' => '#FF4500', + 'orchid' => '#DA70D6', + 'palegoldenrod' => '#EEE8AA', + 'palegreen' => '#98FB98', + 'paleturquoise' => '#AFEEEE', + 'palevioletred' => '#DB7093', + 'papayawhip' => '#FFEFD5', + 'peachpuff' => '#FFDAB9', + 'peru' => '#CD853F', + 'pink' => '#FFC0CB', + 'plum' => '#DDA0DD', + 'powderblue' => '#B0E0E6', + 'purple' => '#800080', + 'rebeccapurple' => '#663399', + 'red' => '#FF0000', + 'rosybrown' => '#BC8F8F', + 'royalblue' => '#4169E1', + 'saddlebrown' => '#8B4513', + 'salmon' => '#FA8072', + 'sandybrown' => '#F4A460', + 'seagreen' => '#2E8B57', + 'seashell' => '#FFF5EE', + 'sienna' => '#A0522D', + 'silver' => '#C0C0C0', + 'skyblue' => '#87CEEB', + 'slateblue' => '#6A5ACD', + 'slategray' => '#708090', + 'slategrey' => '#708090', + 'snow' => '#FFFAFA', + 'springgreen' => '#00FF7F', + 'steelblue' => '#4682B4', + 'tan' => '#D2B48C', + 'teal' => '#008080', + 'thistle' => '#D8BFD8', + 'tomato' => '#FF6347', + 'turquoise' => '#40E0D0', + 'violet' => '#EE82EE', + 'wheat' => '#F5DEB3', + 'white' => '#FFFFFF', + 'whitesmoke' => '#F5F5F5', + 'yellow' => '#FFFF00', + 'yellowgreen' => '#9ACD32' +) +--DESCRIPTION-- + +Lookup array of color names to six digit hexadecimal number corresponding +to color, with preceding hash mark. Used when parsing colors. The lookup +is done in a case-insensitive manner. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt new file mode 100644 index 0000000..60cb409 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt @@ -0,0 +1,15 @@ +Core.ConvertDocumentToFragment +TYPE: bool +DEFAULT: true +--DESCRIPTION-- + +This parameter determines whether or not the filter should convert +input that is a full document with html and body tags to a fragment +of just the contents of a body tag. This parameter is simply something +HTML Purifier can do during an edge-case: for most inputs, this +processing is not necessary. Warning: Full HTML purification has not +been implemented. See GitHub issue #7. + +--ALIASES-- +Core.AcceptFullDocuments +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt new file mode 100644 index 0000000..36f16e0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt @@ -0,0 +1,17 @@ +Core.DirectLexLineNumberSyncInterval +TYPE: int +VERSION: 2.0.0 +DEFAULT: 0 +--DESCRIPTION-- + +

+ Specifies the number of tokens the DirectLex line number tracking + implementations should process before attempting to resyncronize the + current line count by manually counting all previous new-lines. When + at 0, this functionality is disabled. Lower values will decrease + performance, and this is only strictly necessary if the counting + algorithm is buggy (in which case you should report it as a bug). + This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is + not being used. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt new file mode 100644 index 0000000..1cd4c2c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt @@ -0,0 +1,14 @@ +Core.DisableExcludes +TYPE: bool +DEFAULT: false +VERSION: 4.5.0 +--DESCRIPTION-- +

+ This directive disables SGML-style exclusions, e.g. the exclusion of + <object> in any descendant of a + <pre> tag. Disabling excludes will allow some + invalid documents to pass through HTML Purifier, but HTML Purifier + will also be less likely to accidentally remove large documents during + processing. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt new file mode 100644 index 0000000..ce243c3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt @@ -0,0 +1,9 @@ +Core.EnableIDNA +TYPE: bool +DEFAULT: false +VERSION: 4.4.0 +--DESCRIPTION-- +Allows international domain names in URLs. This configuration option +requires the PEAR Net_IDNA2 module to be installed. It operates by +punycoding any internationalized host names for maximum portability. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt new file mode 100644 index 0000000..8bfb47c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt @@ -0,0 +1,15 @@ +Core.Encoding +TYPE: istring +DEFAULT: 'utf-8' +--DESCRIPTION-- +If for some reason you are unable to convert all webpages to UTF-8, you can +use this directive as a stop-gap compatibility change to let HTML Purifier +deal with non UTF-8 input. This technique has notable deficiencies: +absolutely no characters outside of the selected character encoding will be +preserved, not even the ones that have been ampersand escaped (this is due +to a UTF-8 specific feature that automatically resolves all +entities), making it pretty useless for anything except the most I18N-blind +applications, although %Core.EscapeNonASCIICharacters offers fixes this +trouble with another tradeoff. This directive only accepts ISO-8859-1 if +iconv is not enabled. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt new file mode 100644 index 0000000..a3881be --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt @@ -0,0 +1,12 @@ +Core.EscapeInvalidChildren +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +

Warning: this configuration option is no longer does anything as of 4.6.0.

+ +

When true, a child is found that is not allowed in the context of the +parent element will be transformed into text as if it were ASCII. When +false, that element and all internal tags will be dropped, though text will +be preserved. There is no option for dropping the element but preserving +child nodes.

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt new file mode 100644 index 0000000..a7a5b24 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt @@ -0,0 +1,7 @@ +Core.EscapeInvalidTags +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +When true, invalid tags will be written back to the document as plain text. +Otherwise, they are silently dropped. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt new file mode 100644 index 0000000..4eedb34 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt @@ -0,0 +1,13 @@ +Core.EscapeNonASCIICharacters +TYPE: bool +VERSION: 1.4.0 +DEFAULT: false +--DESCRIPTION-- +This directive overcomes a deficiency in %Core.Encoding by blindly +converting all non-ASCII characters into decimal numeric entities before +converting it to its native encoding. This means that even characters that +can be expressed in the non-UTF-8 encoding will be entity-ized, which can +be a real downer for encodings like Big5. It also assumes that the ASCII +repertoire is available, although this is the case for almost all encodings. +Anyway, use UTF-8! +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt new file mode 100644 index 0000000..915391e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt @@ -0,0 +1,19 @@ +Core.HiddenElements +TYPE: lookup +--DEFAULT-- +array ( + 'script' => true, + 'style' => true, +) +--DESCRIPTION-- + +

+ This directive is a lookup array of elements which should have their + contents removed when they are not allowed by the HTML definition. + For example, the contents of a script tag are not + normally shown in a document, so if script tags are to be removed, + their contents should be removed to. This is opposed to a b + tag, which defines some presentational changes but does not hide its + contents. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt new file mode 100644 index 0000000..233fca1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt @@ -0,0 +1,10 @@ +Core.Language +TYPE: string +VERSION: 2.0.0 +DEFAULT: 'en' +--DESCRIPTION-- + +ISO 639 language code for localizable things in HTML Purifier to use, +which is mainly error reporting. There is currently only an English (en) +translation, so this directive is currently useless. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt new file mode 100644 index 0000000..392b436 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt @@ -0,0 +1,36 @@ +Core.LegacyEntityDecoder +TYPE: bool +VERSION: 4.9.0 +DEFAULT: false +--DESCRIPTION-- +

+ Prior to HTML Purifier 4.9.0, entities were decoded by performing + a global search replace for all entities whose decoded versions + did not have special meanings under HTML, and replaced them with + their decoded versions. We would match all entities, even if they did + not have a trailing semicolon, but only if there weren't any trailing + alphanumeric characters. +

+ + + + + + +
OriginalTextAttribute
&yen;¥¥
&yen¥¥
&yena&yena&yena
&yen=¥=¥=
+

+ In HTML Purifier 4.9.0, we changed the behavior of entity parsing + to match entities that had missing trailing semicolons in less + cases, to more closely match HTML5 parsing behavior: +

+ + + + + + +
OriginalTextAttribute
&yen;¥¥
&yen¥¥
&yena¥a&yena
&yen=¥=&yen=
+

+ This flag reverts back to pre-HTML Purifier 4.9.0 behavior. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt new file mode 100644 index 0000000..e469b88 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt @@ -0,0 +1,34 @@ +Core.LexerImpl +TYPE: mixed/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ This parameter determines what lexer implementation can be used. The + valid values are: +

+
+
null
+
+ Recommended, the lexer implementation will be auto-detected based on + your PHP-version and configuration. +
+
string lexer identifier
+
+ This is a slim way of manually overriding the implementation. + Currently recognized values are: DOMLex (the default PHP5 +implementation) + and DirectLex (the default PHP4 implementation). Only use this if + you know what you are doing: usually, the auto-detection will + manage things for cases you aren't even aware of. +
+
object lexer instance
+
+ Super-advanced: you can specify your own, custom, implementation that + implements the interface defined by HTMLPurifier_Lexer. + I may remove this option simply because I don't expect anyone + to use it. +
+
+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt new file mode 100644 index 0000000..eb841a7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt @@ -0,0 +1,16 @@ +Core.MaintainLineNumbers +TYPE: bool/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ If true, HTML Purifier will add line number information to all tokens. + This is useful when error reporting is turned on, but can result in + significant performance degradation and should not be used when + unnecessary. This directive must be used with the DirectLex lexer, + as the DOMLex lexer does not (yet) support this functionality. + If the value is null, an appropriate value will be selected based + on other configuration. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt new file mode 100644 index 0000000..d77f536 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt @@ -0,0 +1,11 @@ +Core.NormalizeNewlines +TYPE: bool +VERSION: 4.2.0 +DEFAULT: true +--DESCRIPTION-- +

+ Whether or not to normalize newlines to the operating + system default. When false, HTML Purifier + will attempt to preserve mixed newline files. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveBlanks.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveBlanks.txt new file mode 100644 index 0000000..95e5285 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveBlanks.txt @@ -0,0 +1,10 @@ +Core.RemoveBlanks +TYPE: bool +DEFAULT: false +VERSION: 4.18 +--DESCRIPTION-- +

+ If set to true, blank nodes will be removed. This can be useful for maintaining + backwards compatibility when upgrading from previous versions of PHP. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt new file mode 100644 index 0000000..4070c2a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt @@ -0,0 +1,12 @@ +Core.RemoveInvalidImg +TYPE: bool +DEFAULT: true +VERSION: 1.3.0 +--DESCRIPTION-- + +

+ This directive enables pre-emptive URI checking in img + tags, as the attribute validation strategy is not authorized to + remove elements from the document. Revert to pre-1.3.0 behavior by setting to false. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt new file mode 100644 index 0000000..3397d9f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt @@ -0,0 +1,11 @@ +Core.RemoveProcessingInstructions +TYPE: bool +VERSION: 4.2.0 +DEFAULT: false +--DESCRIPTION-- +Instead of escaping processing instructions in the form <? ... +?>, remove it out-right. This may be useful if the HTML +you are validating contains XML processing instruction gunk, however, +it can also be user-unfriendly for people attempting to post PHP +snippets. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt new file mode 100644 index 0000000..a4cd966 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt @@ -0,0 +1,12 @@ +Core.RemoveScriptContents +TYPE: bool/null +DEFAULT: NULL +VERSION: 2.0.0 +DEPRECATED-VERSION: 2.1.0 +DEPRECATED-USE: Core.HiddenElements +--DESCRIPTION-- +

+ This directive enables HTML Purifier to remove not only script tags + but all of their contents. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt new file mode 100644 index 0000000..3db50ef --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt @@ -0,0 +1,11 @@ +Filter.Custom +TYPE: list +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

+ This directive can be used to add custom filters; it is nearly the + equivalent of the now deprecated HTMLPurifier->addFilter() + method. Specify an array of concrete implementations. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt new file mode 100644 index 0000000..16829bc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt @@ -0,0 +1,14 @@ +Filter.ExtractStyleBlocks.Escaping +TYPE: bool +VERSION: 3.0.0 +DEFAULT: true +ALIASES: Filter.ExtractStyleBlocksEscaping, FilterParam.ExtractStyleBlocksEscaping +--DESCRIPTION-- + +

+ Whether or not to escape the dangerous characters <, > and & + as \3C, \3E and \26, respectively. This is can be safely set to false + if the contents of StyleBlocks will be placed in an external stylesheet, + where there is no risk of it being interpreted as HTML. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt new file mode 100644 index 0000000..7f95f54 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt @@ -0,0 +1,29 @@ +Filter.ExtractStyleBlocks.Scope +TYPE: string/null +VERSION: 3.0.0 +DEFAULT: NULL +ALIASES: Filter.ExtractStyleBlocksScope, FilterParam.ExtractStyleBlocksScope +--DESCRIPTION-- + +

+ If you would like users to be able to define external stylesheets, but + only allow them to specify CSS declarations for a specific node and + prevent them from fiddling with other elements, use this directive. + It accepts any valid CSS selector, and will prepend this to any + CSS declaration extracted from the document. For example, if this + directive is set to #user-content and a user uses the + selector a:hover, the final selector will be + #user-content a:hover. +

+

+ The comma shorthand may be used; consider the above example, with + #user-content, #user-content2, the final selector will + be #user-content a:hover, #user-content2 a:hover. +

+

+ Warning: It is possible for users to bypass this measure + using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML + Purifier, and I am working to get it fixed. Until then, HTML Purifier + performs a basic check to prevent this. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt new file mode 100644 index 0000000..6c231b2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt @@ -0,0 +1,16 @@ +Filter.ExtractStyleBlocks.TidyImpl +TYPE: mixed/null +VERSION: 3.1.0 +DEFAULT: NULL +ALIASES: FilterParam.ExtractStyleBlocksTidyImpl +--DESCRIPTION-- +

+ If left NULL, HTML Purifier will attempt to instantiate a csstidy + class to use for internal cleaning. This will usually be good enough. +

+

+ However, for trusted user input, you can set this to false to + disable cleaning. In addition, you can supply your own concrete implementation + of Tidy's interface to use, although I don't know why you'd want to do that. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt new file mode 100644 index 0000000..078d087 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt @@ -0,0 +1,74 @@ +Filter.ExtractStyleBlocks +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +EXTERNAL: CSSTidy +--DESCRIPTION-- +

+ This directive turns on the style block extraction filter, which removes + style blocks from input HTML, cleans them up with CSSTidy, + and places them in the StyleBlocks context variable, for further + use by you, usually to be placed in an external stylesheet, or a + style block in the head of your document. +

+

+ Sample usage: +

+
';
+?>
+
+
+
+  Filter.ExtractStyleBlocks
+body {color:#F00;} Some text';
+
+    $config = HTMLPurifier_Config::createDefault();
+    $config->set('Filter', 'ExtractStyleBlocks', true);
+    $purifier = new HTMLPurifier($config);
+
+    $html = $purifier->purify($dirty);
+
+    // This implementation writes the stylesheets to the styles/ directory.
+    // You can also echo the styles inside the document, but it's a bit
+    // more difficult to make sure they get interpreted properly by
+    // browsers; try the usual CSS armoring techniques.
+    $styles = $purifier->context->get('StyleBlocks');
+    $dir = 'styles/';
+    if (!is_dir($dir)) mkdir($dir);
+    $hash = sha1($_GET['html']);
+    foreach ($styles as $i => $style) {
+        file_put_contents($name = $dir . $hash . "_$i");
+        echo '';
+    }
+?>
+
+
+  
+ +
+ + +]]>
+

+ Warning: It is possible for a user to mount an + imagecrash attack using this CSS. Counter-measures are difficult; + it is not simply enough to limit the range of CSS lengths (using + relative lengths with many nesting levels allows for large values + to be attained without actually specifying them in the stylesheet), + and the flexible nature of selectors makes it difficult to selectively + disable lengths on image tags (HTML Purifier, however, does disable + CSS width and height in inline styling). There are probably two effective + counter measures: an explicit width and height set to auto in all + images in your document (unlikely) or the disabling of width and + height (somewhat reasonable). Whether or not these measures should be + used is left to the reader. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt new file mode 100644 index 0000000..321eaa2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt @@ -0,0 +1,16 @@ +Filter.YouTube +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +--DESCRIPTION-- +

+ Warning: Deprecated in favor of %HTML.SafeObject and + %Output.FlashCompat (turn both on to allow YouTube videos and other + Flash content). +

+

+ This directive enables YouTube video embedding in HTML Purifier. Check + this document + on embedding videos for more information on what this filter does. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt new file mode 100644 index 0000000..0b2c106 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt @@ -0,0 +1,25 @@ +HTML.Allowed +TYPE: itext/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ This is a preferred convenience directive that combines + %HTML.AllowedElements and %HTML.AllowedAttributes. + Specify elements and attributes that are allowed using: + element1[attr1|attr2],element2.... For example, + if you would like to only allow paragraphs and links, specify + a[href],p. You can specify attributes that apply + to all elements using an asterisk, e.g. *[lang]. + You can also use newlines instead of commas to separate elements. +

+

+ Warning: + All of the constraints on the component directives are still enforced. + The syntax is a subset of TinyMCE's valid_elements + whitelist: directly copy-pasting it here will probably result in + broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes + are set, this directive has no effect. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt new file mode 100644 index 0000000..fcf093f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt @@ -0,0 +1,19 @@ +HTML.AllowedAttributes +TYPE: lookup/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ If HTML Purifier's attribute set is unsatisfactory, overload it! + The syntax is "tag.attr" or "*.attr" for the global attributes + (style, id, class, dir, lang, xml:lang). +

+

+ Warning: If another directive conflicts with the + elements here, that directive will win and override. For + example, %HTML.EnableAttrID will take precedence over *.id in this + directive. You must set that directive to true before you can use + IDs at all. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt new file mode 100644 index 0000000..140e214 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt @@ -0,0 +1,10 @@ +HTML.AllowedComments +TYPE: lookup +VERSION: 4.4.0 +DEFAULT: array() +--DESCRIPTION-- +A whitelist which indicates what explicit comment bodies should be +allowed, modulo leading and trailing whitespace. See also %HTML.AllowedCommentsRegexp +(these directives are union'ed together, so a comment is considered +valid if any directive deems it valid.) +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt new file mode 100644 index 0000000..f22e977 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt @@ -0,0 +1,15 @@ +HTML.AllowedCommentsRegexp +TYPE: string/null +VERSION: 4.4.0 +DEFAULT: NULL +--DESCRIPTION-- +A regexp, which if it matches the body of a comment, indicates that +it should be allowed. Trailing and leading spaces are removed prior +to running this regular expression. +Warning: Make sure you specify +correct anchor metacharacters ^regex$, otherwise you may accept +comments that you did not mean to! In particular, the regex /foo|bar/ +is probably not sufficiently strict, since it also allows foobar. +See also %HTML.AllowedComments (these directives are union'ed together, +so a comment is considered valid if any directive deems it valid.) +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt new file mode 100644 index 0000000..1d3fa79 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt @@ -0,0 +1,23 @@ +HTML.AllowedElements +TYPE: lookup/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- +

+ If HTML Purifier's tag set is unsatisfactory for your needs, you can + overload it with your own list of tags to allow. If you change + this, you probably also want to change %HTML.AllowedAttributes; see + also %HTML.Allowed which lets you set allowed elements and + attributes at the same time. +

+

+ If you attempt to allow an element that HTML Purifier does not know + about, HTML Purifier will raise an error. You will need to manually + tell HTML Purifier about this element by using the + advanced customization features. +

+

+ Warning: If another directive conflicts with the + elements here, that directive will win and override. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt new file mode 100644 index 0000000..5a59a55 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt @@ -0,0 +1,20 @@ +HTML.AllowedModules +TYPE: lookup/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ A doctype comes with a set of usual modules to use. Without having + to mucking about with the doctypes, you can quickly activate or + disable these modules by specifying which modules you wish to allow + with this directive. This is most useful for unit testing specific + modules, although end users may find it useful for their own ends. +

+

+ If you specify a module that does not exist, the manager will silently + fail to use it, so be careful! User-defined modules are not affected + by this directive. Modules defined in %HTML.CoreModules are not + affected by this directive. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt new file mode 100644 index 0000000..151fb7b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt @@ -0,0 +1,11 @@ +HTML.Attr.Name.UseCDATA +TYPE: bool +DEFAULT: false +VERSION: 4.0.0 +--DESCRIPTION-- +The W3C specification DTD defines the name attribute to be CDATA, not ID, due +to limitations of DTD. In certain documents, this relaxed behavior is desired, +whether it is to specify duplicate names, or to specify names that would be +illegal IDs (for example, names that begin with a digit.) Set this configuration +directive to true to use the relaxed parsing rules. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt new file mode 100644 index 0000000..45ae469 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt @@ -0,0 +1,18 @@ +HTML.BlockWrapper +TYPE: string +VERSION: 1.3.0 +DEFAULT: 'p' +--DESCRIPTION-- + +

+ String name of element to wrap inline elements that are inside a block + context. This only occurs in the children of blockquote in strict mode. +

+

+ Example: by default value, + <blockquote>Foo</blockquote> would become + <blockquote><p>Foo</p></blockquote>. + The <p> tags can be replaced with whatever you desire, + as long as it is a block level element. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt new file mode 100644 index 0000000..5246188 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt @@ -0,0 +1,23 @@ +HTML.CoreModules +TYPE: lookup +VERSION: 2.0.0 +--DEFAULT-- +array ( + 'Structure' => true, + 'Text' => true, + 'Hypertext' => true, + 'List' => true, + 'NonXMLCommonAttributes' => true, + 'XMLCommonAttributes' => true, + 'CommonAttributes' => true, +) +--DESCRIPTION-- + +

+ Certain modularized doctypes (XHTML, namely), have certain modules + that must be included for the doctype to be an conforming document + type: put those modules here. By default, XHTML's core modules + are used. You can set this to a blank array to disable core module + protection, but this is not recommended. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt new file mode 100644 index 0000000..6ed70b5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt @@ -0,0 +1,9 @@ +HTML.CustomDoctype +TYPE: string/null +VERSION: 2.0.1 +DEFAULT: NULL +--DESCRIPTION-- + +A custom doctype for power-users who defined their own document +type. This directive only applies when %HTML.Doctype is blank. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt new file mode 100644 index 0000000..103db75 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt @@ -0,0 +1,33 @@ +HTML.DefinitionID +TYPE: string/null +DEFAULT: NULL +VERSION: 2.0.0 +--DESCRIPTION-- + +

+ Unique identifier for a custom-built HTML definition. If you edit + the raw version of the HTMLDefinition, introducing changes that the + configuration object does not reflect, you must specify this variable. + If you change your custom edits, you should change this directive, or + clear your cache. Example: +

+
+$config = HTMLPurifier_Config::createDefault();
+$config->set('HTML', 'DefinitionID', '1');
+$def = $config->getHTMLDefinition();
+$def->addAttribute('a', 'tabindex', 'Number');
+
+

+ In the above example, the configuration is still at the defaults, but + using the advanced API, an extra attribute has been added. The + configuration object normally has no way of knowing that this change + has taken place, so it needs an extra directive: %HTML.DefinitionID. + If someone else attempts to use the default configuration, these two + pieces of code will not clobber each other in the cache, since one has + an extra directive attached to it. +

+

+ You must specify a value to this directive to use the + advanced API features. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt new file mode 100644 index 0000000..229ae02 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt @@ -0,0 +1,16 @@ +HTML.DefinitionRev +TYPE: int +VERSION: 2.0.0 +DEFAULT: 1 +--DESCRIPTION-- + +

+ Revision identifier for your custom definition specified in + %HTML.DefinitionID. This serves the same purpose: uniquely identifying + your custom definition, but this one does so in a chronological + context: revision 3 is more up-to-date then revision 2. Thus, when + this gets incremented, the cache handling is smart enough to clean + up any older revisions of your definition as well as flush the + cache. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt new file mode 100644 index 0000000..9dab497 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt @@ -0,0 +1,11 @@ +HTML.Doctype +TYPE: string/null +DEFAULT: NULL +--DESCRIPTION-- +Doctype to use during filtering. Technically speaking this is not actually +a doctype (as it does not identify a corresponding DTD), but we are using +this name for sake of simplicity. When non-blank, this will override any +older directives like %HTML.XHTML or %HTML.Strict. +--ALLOWED-- +'HTML 4.01 Transitional', 'HTML 4.01 Strict', 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', 'XHTML 1.1' +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt new file mode 100644 index 0000000..7878dc0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt @@ -0,0 +1,11 @@ +HTML.FlashAllowFullScreen +TYPE: bool +VERSION: 4.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit embedded Flash content from + %HTML.SafeObject to expand to the full screen. Corresponds to + the allowFullScreen parameter. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt new file mode 100644 index 0000000..57358f9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt @@ -0,0 +1,21 @@ +HTML.ForbiddenAttributes +TYPE: lookup +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

+ While this directive is similar to %HTML.AllowedAttributes, for + forwards-compatibility with XML, this attribute has a different syntax. Instead of + tag.attr, use tag@attr. To disallow href + attributes in a tags, set this directive to + a@href. You can also disallow an attribute globally with + attr or *@attr (either syntax is fine; the latter + is provided for consistency with %HTML.AllowedAttributes). +

+

+ Warning: This directive complements %HTML.ForbiddenElements, + accordingly, check + out that directive for a discussion of why you + should think twice before using this directive. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt new file mode 100644 index 0000000..93a53e1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt @@ -0,0 +1,20 @@ +HTML.ForbiddenElements +TYPE: lookup +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

+ This was, perhaps, the most requested feature ever in HTML + Purifier. Please don't abuse it! This is the logical inverse of + %HTML.AllowedElements, and it will override that directive, or any + other directive. +

+

+ If possible, %HTML.Allowed is recommended over this directive, because it + can sometimes be difficult to tell whether or not you've forbidden all of + the behavior you would like to disallow. If you forbid img + with the expectation of preventing images on your site, you'll be in for + a nasty surprise when people start using the background-image + CSS property. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Forms.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Forms.txt new file mode 100644 index 0000000..4a432d8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Forms.txt @@ -0,0 +1,11 @@ +HTML.Forms +TYPE: bool +VERSION: 4.13.0 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit form elements in the user input, regardless of + %HTML.Trusted value. Please be very careful when using this functionality, as + enabling forms in untrusted documents may allow for phishing attacks. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt new file mode 100644 index 0000000..b2591e4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt @@ -0,0 +1,14 @@ +HTML.MaxImgLength +TYPE: int/null +DEFAULT: null +VERSION: 3.1.1 +--DESCRIPTION-- +

+ This directive controls the maximum number of pixels in the width and + height attributes in img tags. This is + in place to prevent imagecrash attacks, disable with null at your own risk. + This directive is similar to %CSS.MaxImgLength, and both should be + concurrently edited, although there are + subtle differences in the input format (the HTML max is an integer). +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt new file mode 100644 index 0000000..700b309 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt @@ -0,0 +1,7 @@ +HTML.Nofollow +TYPE: bool +VERSION: 4.3.0 +DEFAULT: FALSE +--DESCRIPTION-- +If enabled, nofollow rel attributes are added to all outgoing links. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt new file mode 100644 index 0000000..62e8e16 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt @@ -0,0 +1,12 @@ +HTML.Parent +TYPE: string +VERSION: 1.3.0 +DEFAULT: 'div' +--DESCRIPTION-- + +

+ String name of element that HTML fragment passed to library will be + inserted in. An interesting variation would be using span as the + parent element, meaning that only inline tags would be allowed. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt new file mode 100644 index 0000000..dfb7204 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt @@ -0,0 +1,12 @@ +HTML.Proprietary +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to allow proprietary elements and attributes in your + documents, as per HTMLPurifier_HTMLModule_Proprietary. + Warning: This can cause your documents to stop + validating! +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt new file mode 100644 index 0000000..cdda09a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt @@ -0,0 +1,13 @@ +HTML.SafeEmbed +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit embed tags in documents, with a number of extra + security features added to prevent script execution. This is similar to + what websites like MySpace do to embed tags. Embed is a proprietary + element and will cause your website to stop validating; you should + see if you can use %Output.FlashCompat with %HTML.SafeObject instead + first.

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt new file mode 100644 index 0000000..5a5c103 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt @@ -0,0 +1,13 @@ +HTML.SafeIframe +TYPE: bool +VERSION: 4.4.0 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit iframe tags in untrusted documents. This + directive must be accompanied by a whitelist of permitted iframes, + such as %URI.SafeIframeRegexp or %URI.SafeIframeHosts, otherwise it will fatally error. + This directive has no effect on strict doctypes, as iframes are not + valid. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt new file mode 100644 index 0000000..ceb342e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt @@ -0,0 +1,13 @@ +HTML.SafeObject +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit object tags in documents, with a number of extra + security features added to prevent script execution. This is similar to + what websites like MySpace do to object tags. You should also enable + %Output.FlashCompat in order to generate Internet Explorer + compatibility code for your object tags. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt new file mode 100644 index 0000000..5ebc7a1 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt @@ -0,0 +1,10 @@ +HTML.SafeScripting +TYPE: lookup +VERSION: 4.5.0 +DEFAULT: array() +--DESCRIPTION-- +

+ Whether or not to permit script tags to external scripts in documents. + Inline scripting is not allowed, and the script must match an explicit whitelist. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt new file mode 100644 index 0000000..a8b1de5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt @@ -0,0 +1,9 @@ +HTML.Strict +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +DEPRECATED-VERSION: 1.7.0 +DEPRECATED-USE: HTML.Doctype +--DESCRIPTION-- +Determines whether or not to use Transitional (loose) or Strict rulesets. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt new file mode 100644 index 0000000..587a167 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt @@ -0,0 +1,8 @@ +HTML.TargetBlank +TYPE: bool +VERSION: 4.4.0 +DEFAULT: FALSE +--DESCRIPTION-- +If enabled, target=blank attributes are added to all outgoing links. +(This includes links from an HTTPS version of a page to an HTTP version.) +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt new file mode 100644 index 0000000..dd514c0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt @@ -0,0 +1,10 @@ +--# vim: et sw=4 sts=4 +HTML.TargetNoopener +TYPE: bool +VERSION: 4.8.0 +DEFAULT: TRUE +--DESCRIPTION-- +If enabled, noopener rel attributes are added to links which have +a target attribute associated with them. This prevents malicious +destinations from overwriting the original window. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt new file mode 100644 index 0000000..cb5a0b0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt @@ -0,0 +1,9 @@ +HTML.TargetNoreferrer +TYPE: bool +VERSION: 4.8.0 +DEFAULT: TRUE +--DESCRIPTION-- +If enabled, noreferrer rel attributes are added to links which have +a target attribute associated with them. This prevents malicious +destinations from overwriting the original window. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt new file mode 100644 index 0000000..b4c271b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt @@ -0,0 +1,8 @@ +HTML.TidyAdd +TYPE: lookup +VERSION: 2.0.0 +DEFAULT: array() +--DESCRIPTION-- + +Fixes to add to the default set of Tidy fixes as per your level. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt new file mode 100644 index 0000000..4186ccd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt @@ -0,0 +1,24 @@ +HTML.TidyLevel +TYPE: string +VERSION: 2.0.0 +DEFAULT: 'medium' +--DESCRIPTION-- + +

General level of cleanliness the Tidy module should enforce. +There are four allowed values:

+
+
none
+
No extra tidying should be done
+
light
+
Only fix elements that would be discarded otherwise due to + lack of support in doctype
+
medium
+
Enforce best practices
+
heavy
+
Transform all deprecated elements and attributes to standards + compliant equivalents
+
+ +--ALLOWED-- +'none', 'light', 'medium', 'heavy' +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt new file mode 100644 index 0000000..996762b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt @@ -0,0 +1,8 @@ +HTML.TidyRemove +TYPE: lookup +VERSION: 2.0.0 +DEFAULT: array() +--DESCRIPTION-- + +Fixes to remove from the default set of Tidy fixes as per your level. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt new file mode 100644 index 0000000..1db9237 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt @@ -0,0 +1,9 @@ +HTML.Trusted +TYPE: bool +VERSION: 2.0.0 +DEFAULT: false +--DESCRIPTION-- +Indicates whether or not the user input is trusted or not. If the input is +trusted, a more expansive set of allowed tags and attributes will be used. +See also %CSS.Trusted. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt new file mode 100644 index 0000000..2a47e38 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt @@ -0,0 +1,11 @@ +HTML.XHTML +TYPE: bool +DEFAULT: true +VERSION: 1.1.0 +DEPRECATED-VERSION: 1.7.0 +DEPRECATED-USE: HTML.Doctype +--DESCRIPTION-- +Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor. +--ALIASES-- +Core.XHTML +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt new file mode 100644 index 0000000..08921fd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt @@ -0,0 +1,10 @@ +Output.CommentScriptContents +TYPE: bool +VERSION: 2.0.0 +DEFAULT: true +--DESCRIPTION-- +Determines whether or not HTML Purifier should attempt to fix up the +contents of script tags for legacy browsers with comments. +--ALIASES-- +Core.CommentScriptContents +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt new file mode 100644 index 0000000..d6f0d9f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt @@ -0,0 +1,15 @@ +Output.FixInnerHTML +TYPE: bool +VERSION: 4.3.0 +DEFAULT: true +--DESCRIPTION-- +

+ If true, HTML Purifier will protect against Internet Explorer's + mishandling of the innerHTML attribute by appending + a space to any attribute that does not contain angled brackets, spaces + or quotes, but contains a backtick. This slightly changes the + semantics of any given attribute, so if this is unacceptable and + you do not use innerHTML on any of your pages, you can + turn this directive off. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt new file mode 100644 index 0000000..93398e8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt @@ -0,0 +1,11 @@ +Output.FlashCompat +TYPE: bool +VERSION: 4.1.0 +DEFAULT: false +--DESCRIPTION-- +

+ If true, HTML Purifier will generate Internet Explorer compatibility + code for all object code. This is highly recommended if you enable + %HTML.SafeObject. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt new file mode 100644 index 0000000..79f8ad8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt @@ -0,0 +1,13 @@ +Output.Newline +TYPE: string/null +VERSION: 2.0.1 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Newline string to format final output with. If left null, HTML Purifier + will auto-detect the default newline type of the system and use that; + you can manually override it here. Remember, \r\n is Windows, \r + is Mac, and \n is Unix. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt new file mode 100644 index 0000000..232b023 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt @@ -0,0 +1,14 @@ +Output.SortAttr +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ If true, HTML Purifier will sort attributes by name before writing them back + to the document, converting a tag like: <el b="" a="" c="" /> + to <el a="" b="" c="" />. This is a workaround for + a bug in FCKeditor which causes it to swap attributes order, adding noise + to text diffs. If you're not seeing this bug, chances are, you don't need + this directive. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt new file mode 100644 index 0000000..06bab00 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt @@ -0,0 +1,25 @@ +Output.TidyFormat +TYPE: bool +VERSION: 1.1.1 +DEFAULT: false +--DESCRIPTION-- +

+ Determines whether or not to run Tidy on the final output for pretty + formatting reasons, such as indentation and wrap. +

+

+ This can greatly improve readability for editors who are hand-editing + the HTML, but is by no means necessary as HTML Purifier has already + fixed all major errors the HTML may have had. Tidy is a non-default + extension, and this directive will silently fail if Tidy is not + available. +

+

+ If you are looking to make the overall look of your page's source + better, I recommend running Tidy on the entire page rather than just + user-content (after all, the indentation relative to the containing + blocks will be incorrect). +

+--ALIASES-- +Core.TidyFormat +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt new file mode 100644 index 0000000..071bc02 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt @@ -0,0 +1,7 @@ +Test.ForceNoIconv +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +When set to true, HTMLPurifier_Encoder will act as if iconv does not exist +and use only pure PHP implementations. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt new file mode 100644 index 0000000..eb97307 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt @@ -0,0 +1,18 @@ +URI.AllowedSchemes +TYPE: lookup +--DEFAULT-- +array ( + 'http' => true, + 'https' => true, + 'mailto' => true, + 'ftp' => true, + 'nntp' => true, + 'news' => true, + 'tel' => true, +) +--DESCRIPTION-- +Whitelist that defines the schemes that a URI is allowed to have. This +prevents XSS attacks from using pseudo-schemes like javascript or mocha. +There is also support for the data and file +URI schemes, but they are not enabled by default. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSymbols.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSymbols.txt new file mode 100644 index 0000000..d89a5f6 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSymbols.txt @@ -0,0 +1,7 @@ +URI.AllowedSymbols +TYPE: string/null +DEFAULT: '!$&\'()*+,;=' +--DESCRIPTION-- +If a system permits templated URLs, then the URI encoder may need extra +hints about which symbols to preserve. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt new file mode 100644 index 0000000..876f068 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt @@ -0,0 +1,17 @@ +URI.Base +TYPE: string/null +VERSION: 2.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ The base URI is the URI of the document this purified HTML will be + inserted into. This information is important if HTML Purifier needs + to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute + is on. You may use a non-absolute URI for this value, but behavior + may vary (%URI.MakeAbsolute deals nicely with both absolute and + relative paths, but forwards-compatibility is not guaranteed). + Warning: If set, the scheme on this URI + overrides the one specified by %URI.DefaultScheme. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt new file mode 100644 index 0000000..834bc08 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt @@ -0,0 +1,15 @@ +URI.DefaultScheme +TYPE: string/null +DEFAULT: 'http' +--DESCRIPTION-- + +

+ Defines through what scheme the output will be served, in order to + select the proper object validator when no scheme information is present. +

+ +

+ Starting with HTML Purifier 4.9.0, the default scheme can be null, in + which case we reject all URIs which do not have explicit schemes. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt new file mode 100644 index 0000000..f05312b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt @@ -0,0 +1,11 @@ +URI.DefinitionID +TYPE: string/null +VERSION: 2.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Unique identifier for a custom-built URI definition. If you want + to add custom URIFilters, you must specify this value. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt new file mode 100644 index 0000000..80cfea9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt @@ -0,0 +1,11 @@ +URI.DefinitionRev +TYPE: int +VERSION: 2.1.0 +DEFAULT: 1 +--DESCRIPTION-- + +

+ Revision identifier for your custom definition. See + %HTML.DefinitionRev for details. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt new file mode 100644 index 0000000..71ce025 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt @@ -0,0 +1,14 @@ +URI.Disable +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- + +

+ Disables all URIs in all forms. Not sure why you'd want to do that + (after all, the Internet's founded on the notion of a hyperlink). +

+ +--ALIASES-- +Attr.DisableURI +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt new file mode 100644 index 0000000..13c122c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt @@ -0,0 +1,11 @@ +URI.DisableExternal +TYPE: bool +VERSION: 1.2.0 +DEFAULT: false +--DESCRIPTION-- +Disables links to external websites. This is a highly effective anti-spam +and anti-pagerank-leech measure, but comes at a hefty price: nolinks or +images outside of your domain will be allowed. Non-linkified URIs will +still be preserved. If you want to be able to link to subdomains or use +absolute URIs, specify %URI.Host for your website. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt new file mode 100644 index 0000000..abcc1ef --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt @@ -0,0 +1,13 @@ +URI.DisableExternalResources +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- +Disables the embedding of external resources, preventing users from +embedding things like images from other hosts. This prevents access +tracking (good for email viewers), bandwidth leeching, cross-site request +forging, goatse.cx posting, and other nasties, but also results in a loss +of end-user functionality (they can't directly post a pic they posted from +Flickr anymore). Use it if you don't have a robust user-content moderation +team. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt new file mode 100644 index 0000000..f891de4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt @@ -0,0 +1,15 @@ +URI.DisableResources +TYPE: bool +VERSION: 4.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ Disables embedding resources, essentially meaning no pictures. You can + still link to them though. See %URI.DisableExternalResources for why + this might be a good idea. +

+

+ Note: While this directive has been available since 1.3.0, + it didn't actually start doing anything until 4.2.0. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt new file mode 100644 index 0000000..ee83b12 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt @@ -0,0 +1,19 @@ +URI.Host +TYPE: string/null +VERSION: 1.2.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Defines the domain name of the server, so we can determine whether or + an absolute URI is from your website or not. Not strictly necessary, + as users should be using relative URIs to reference resources on your + website. It will, however, let you use absolute URIs to link to + subdomains of the domain you post here: i.e. example.com will allow + sub.example.com. However, higher up domains will still be excluded: + if you set %URI.Host to sub.example.com, example.com will be blocked. + Note: This directive overrides %URI.Base because + a given page may be on a sub-domain, but you wish HTML Purifier to be + more relaxed and allow some of the parent domains too. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt new file mode 100644 index 0000000..0b6df76 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt @@ -0,0 +1,9 @@ +URI.HostBlacklist +TYPE: list +VERSION: 1.3.0 +DEFAULT: array() +--DESCRIPTION-- +List of strings that are forbidden in the host of any URI. Use it to kill +domain names of spam, etc. Note that it will catch anything in the domain, +so moo.com will catch moo.com.example.com. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt new file mode 100644 index 0000000..4214900 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt @@ -0,0 +1,13 @@ +URI.MakeAbsolute +TYPE: bool +VERSION: 2.1.0 +DEFAULT: false +--DESCRIPTION-- + +

+ Converts all URIs into absolute forms. This is useful when the HTML + being filtered assumes a specific base path, but will actually be + viewed in a different context (and setting an alternate base URI is + not possible). %URI.Base must be set for this directive to work. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt new file mode 100644 index 0000000..58c81dc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt @@ -0,0 +1,83 @@ +URI.Munge +TYPE: string/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Munges all browsable (usually http, https and ftp) + absolute URIs into another URI, usually a URI redirection service. + This directive accepts a URI, formatted with a %s where + the url-encoded original URI should be inserted (sample: + http://www.google.com/url?q=%s). +

+

+ Uses for this directive: +

+
    +
  • + Prevent PageRank leaks, while being fairly transparent + to users (you may also want to add some client side JavaScript to + override the text in the statusbar). Notice: + Many security experts believe that this form of protection does not deter spam-bots. +
  • +
  • + Redirect users to a splash page telling them they are leaving your + website. While this is poor usability practice, it is often mandated + in corporate environments. +
  • +
+

+ Prior to HTML Purifier 3.1.1, this directive also enabled the munging + of browsable external resources, which could break things if your redirection + script was a splash page or used meta tags. To revert to + previous behavior, please use %URI.MungeResources. +

+

+ You may want to also use %URI.MungeSecretKey along with this directive + in order to enforce what URIs your redirector script allows. Open + redirector scripts can be a security risk and negatively affect the + reputation of your domain name. +

+

+ Starting with HTML Purifier 3.1.1, there is also these substitutions: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyDescriptionExample <a href="">
%r1 - The URI embeds a resource
(blank) - The URI is merely a link
%nThe name of the tag this URI came froma
%mThe name of the attribute this URI came fromhref
%pThe name of the CSS property this URI came from, or blank if irrelevant
+

+ Admittedly, these letters are somewhat arbitrary; the only stipulation + was that they couldn't be a through f. r is for resource (I would have preferred + e, but you take what you can get), n is for name, m + was picked because it came after n (and I couldn't use a), p is for + property. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt new file mode 100644 index 0000000..6fce0fd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt @@ -0,0 +1,17 @@ +URI.MungeResources +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

+ If true, any URI munging directives like %URI.Munge + will also apply to embedded resources, such as <img src="">. + Be careful enabling this directive if you have a redirector script + that does not use the Location HTTP header; all of your images + and other embedded resources will break. +

+

+ Warning: It is strongly advised you use this in conjunction + %URI.MungeSecretKey to mitigate the security risk of an open redirector. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt new file mode 100644 index 0000000..1e17c1d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt @@ -0,0 +1,30 @@ +URI.MungeSecretKey +TYPE: string/null +VERSION: 3.1.1 +DEFAULT: NULL +--DESCRIPTION-- +

+ This directive enables secure checksum generation along with %URI.Munge. + It should be set to a secure key that is not shared with anyone else. + The checksum can be placed in the URI using %t. Use of this checksum + affords an additional level of protection by allowing a redirector + to check if a URI has passed through HTML Purifier with this line: +

+ +
$checksum === hash_hmac("sha256", $url, $secret_key)
+ +

+ If the output is TRUE, the redirector script should accept the URI. +

+ +

+ Please note that it would still be possible for an attacker to procure + secure hashes en-mass by abusing your website's Preview feature or the + like, but this service affords an additional level of protection + that should be combined with website blacklisting. +

+ +

+ Remember this has no effect if %URI.Munge is not on. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt new file mode 100644 index 0000000..23331a4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt @@ -0,0 +1,9 @@ +URI.OverrideAllowedSchemes +TYPE: bool +DEFAULT: true +--DESCRIPTION-- +If this is set to true (which it is by default), you can override +%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme to the +registry. If false, you will also have to update that directive in order +to add more schemes. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeHosts.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeHosts.txt new file mode 100644 index 0000000..c32b52c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeHosts.txt @@ -0,0 +1,14 @@ +URI.SafeIframeHosts +TYPE: lookup/null +DEFAULT: null +--DESCRIPTION-- +

+ A whitelist which indicates what explicit hosts should be + allowed to embed iframe. See also %HTML.SafeIframeRegexp, + it has precedence over this config. Here are some example values: +

+
    +
  • www.youtube.com - Allow YouTube videos
  • +
  • maps.google.com - Allow Embedding a Google map
  • +
+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt new file mode 100644 index 0000000..7908483 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt @@ -0,0 +1,22 @@ +URI.SafeIframeRegexp +TYPE: string/null +VERSION: 4.4.0 +DEFAULT: NULL +--DESCRIPTION-- +

+ A PCRE regular expression that will be matched against an iframe URI. This is + a relatively inflexible scheme, but works well enough for the most common + use-case of iframes: embedded video. This directive only has an effect if + %HTML.SafeIframe is enabled. Here are some example values: +

+
    +
  • %^http://www.youtube.com/embed/% - Allow YouTube videos
  • +
  • %^http://player.vimeo.com/video/% - Allow Vimeo videos
  • +
  • %^http://(www.youtube.com/embed/|player.vimeo.com/video/)% - Allow both
  • +
+

+ Note that this directive does not give you enough granularity to, say, disable + all autoplay videos. Pipe up on the HTML Purifier forums if this + is a capability you want. +

+--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini new file mode 100644 index 0000000..5de4505 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini @@ -0,0 +1,3 @@ +name = "HTML Purifier" + +; vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php new file mode 100644 index 0000000..d342995 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php @@ -0,0 +1,169 @@ + true) indexed by name. + * @type array + * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets + */ + public $lookup = array(); + + /** + * Synchronized list of defined content sets (keys of info). + * @type array + */ + protected $keys = array(); + /** + * Synchronized list of defined content values (values of info). + * @type array + */ + protected $values = array(); + + /** + * Merges in module's content sets, expands identifiers in the content + * sets and populates the keys, values and lookup member variables. + * @param HTMLPurifier_HTMLModule[] $modules List of HTMLPurifier_HTMLModule + */ + public function __construct($modules) + { + if (!is_array($modules)) { + $modules = array($modules); + } + // populate content_sets based on module hints + // sorry, no way of overloading + foreach ($modules as $module) { + foreach ($module->content_sets as $key => $value) { + $temp = $this->convertToLookup($value); + if (isset($this->lookup[$key])) { + // add it into the existing content set + $this->lookup[$key] = array_merge($this->lookup[$key], $temp); + } else { + $this->lookup[$key] = $temp; + } + } + } + $old_lookup = false; + while ($old_lookup !== $this->lookup) { + $old_lookup = $this->lookup; + foreach ($this->lookup as $i => $set) { + $add = array(); + foreach ($set as $element => $x) { + if (isset($this->lookup[$element])) { + $add += $this->lookup[$element]; + unset($this->lookup[$i][$element]); + } + } + $this->lookup[$i] += $add; + } + } + + foreach ($this->lookup as $key => $lookup) { + $this->info[$key] = implode(' | ', array_keys($lookup)); + } + $this->keys = array_keys($this->info); + $this->values = array_values($this->info); + } + + /** + * Accepts a definition; generates and assigns a ChildDef for it + * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef reference + * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef + */ + public function generateChildDef(&$def, $module) + { + if (!empty($def->child)) { // already done! + return; + } + $content_model = $def->content_model; + if (is_string($content_model)) { + // Assume that $this->keys is alphanumeric + $def->content_model = preg_replace_callback( + '/\b(' . implode('|', $this->keys) . ')\b/', + array($this, 'generateChildDefCallback'), + $content_model + ); + //$def->content_model = str_replace( + // $this->keys, $this->values, $content_model); + } + $def->child = $this->getChildDef($def, $module); + } + + public function generateChildDefCallback($matches) + { + return $this->info[$matches[0]]; + } + + /** + * Instantiates a ChildDef based on content_model and content_model_type + * member variables in HTMLPurifier_ElementDef + * @note This will also defer to modules for custom HTMLPurifier_ChildDef + * subclasses that need content set expansion + * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef to have ChildDef extracted + * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef + * @return HTMLPurifier_ChildDef corresponding to ElementDef + */ + public function getChildDef($def, $module) + { + $value = $def->content_model; + if (is_object($value)) { + trigger_error( + 'Literal object child definitions should be stored in '. + 'ElementDef->child not ElementDef->content_model', + E_USER_NOTICE + ); + return $value; + } + switch ($def->content_model_type) { + case 'required': + return new HTMLPurifier_ChildDef_Required($value); + case 'optional': + return new HTMLPurifier_ChildDef_Optional($value); + case 'empty': + return new HTMLPurifier_ChildDef_Empty(); + case 'custom': + return new HTMLPurifier_ChildDef_Custom($value); + } + // defer to its module + $return = false; + if ($module->defines_child_def) { // save a func call + $return = $module->getChildDef($def); + } + if ($return !== false) { + return $return; + } + + throw new Exception( + 'Could not determine which ChildDef class to instantiate', + E_USER_ERROR + ); + } + + /** + * Converts a string list of elements separated by pipes into + * a lookup array. + * @param string $string List of elements + * @return array Lookup array of elements + */ + protected function convertToLookup($string) + { + $array = explode('|', str_replace(' ', '', $string)); + $ret = array(); + foreach ($array as $k) { + $ret[$k] = true; + } + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php new file mode 100644 index 0000000..5a0e7b9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php @@ -0,0 +1,84 @@ +_storage)) { + throw new Exception("Name $name produces collision, cannot re-register"); + } + $this->_storage[$name] =& $ref; + } + + /** + * Retrieves a variable reference from the context. + * @param string $name String name + * @param bool $ignore_error Boolean whether or not to ignore error + * @return mixed + */ + public function &get($name, $ignore_error = false) + { + if (!array_key_exists($name, $this->_storage)) { + if (!$ignore_error) { + throw new Exception("Attempted to retrieve non-existent variable $name"); + } + $var = null; // so we can return by reference + return $var; + } + return $this->_storage[$name]; + } + + /** + * Destroys a variable in the context. + * @param string $name String name + */ + public function destroy($name) + { + if (!array_key_exists($name, $this->_storage)) { + throw new Exception("Attempted to destroy non-existent variable $name"); + } + unset($this->_storage[$name]); + } + + /** + * Checks whether or not the variable exists. + * @param string $name String name + * @return bool + */ + public function exists($name) + { + return array_key_exists($name, $this->_storage); + } + + /** + * Loads a series of variables from an associative array + * @param array $context_array Assoc array of variables to load + */ + public function loadArray($context_array) + { + foreach ($context_array as $key => $discard) { + $this->register($key, $context_array[$key]); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php new file mode 100644 index 0000000..bc6d433 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php @@ -0,0 +1,55 @@ +setup) { + return; + } + $this->setup = true; + $this->doSetup($config); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php new file mode 100644 index 0000000..9aa8ff3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php @@ -0,0 +1,129 @@ +type = $type; + } + + /** + * Generates a unique identifier for a particular configuration + * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config + * @return string + */ + public function generateKey($config) + { + return $config->version . ',' . // possibly replace with function calls + $config->getBatchSerial($this->type) . ',' . + $config->get($this->type . '.DefinitionRev'); + } + + /** + * Tests whether or not a key is old with respect to the configuration's + * version and revision number. + * @param string $key Key to test + * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against + * @return bool + */ + public function isOld($key, $config) + { + if (substr_count($key, ',') < 2) { + return true; + } + list($version, $hash, $revision) = explode(',', $key, 3); + $compare = version_compare($version, $config->version); + // version mismatch, is always old + if ($compare != 0) { + return true; + } + // versions match, ids match, check revision number + if ($hash == $config->getBatchSerial($this->type) && + $revision < $config->get($this->type . '.DefinitionRev')) { + return true; + } + return false; + } + + /** + * Checks if a definition's type jives with the cache's type + * @note Throws an error on failure + * @param HTMLPurifier_Definition $def Definition object to check + * @return bool true if good, false if not + */ + public function checkDefType($def) + { + if ($def->type !== $this->type) { + trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); + return false; + } + return true; + } + + /** + * Adds a definition object to the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + */ + abstract public function add($def, $config); + + /** + * Unconditionally saves a definition object to the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + */ + abstract public function set($def, $config); + + /** + * Replace an object in the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + */ + abstract public function replace($def, $config); + + /** + * Retrieves a definition object from the cache + * @param HTMLPurifier_Config $config + */ + abstract public function get($config); + + /** + * Removes a definition object to the cache + * @param HTMLPurifier_Config $config + */ + abstract public function remove($config); + + /** + * Clears all objects from cache + * @param HTMLPurifier_Config $config + */ + abstract public function flush($config); + + /** + * Clears all expired (older version or revision) objects from cache + * @note Be careful implementing this method as flush. Flush must + * not interfere with other Definition types, and cleanup() + * should not be repeatedly called by userland code. + * @param HTMLPurifier_Config $config + */ + abstract public function cleanup($config); +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php new file mode 100644 index 0000000..b57a51b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php @@ -0,0 +1,112 @@ +copy(); + // reference is necessary for mocks in PHP 4 + $decorator->cache =& $cache; + $decorator->type = $cache->type; + return $decorator; + } + + /** + * Cross-compatible clone substitute + * @return HTMLPurifier_DefinitionCache_Decorator + */ + public function copy() + { + return new HTMLPurifier_DefinitionCache_Decorator(); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function add($def, $config) + { + return $this->cache->add($def, $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function set($def, $config) + { + return $this->cache->set($def, $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function replace($def, $config) + { + return $this->cache->replace($def, $config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function get($config) + { + return $this->cache->get($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function remove($config) + { + return $this->cache->remove($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function flush($config) + { + return $this->cache->flush($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function cleanup($config) + { + return $this->cache->cleanup($config); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php new file mode 100644 index 0000000..4991777 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php @@ -0,0 +1,78 @@ +definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function set($def, $config) + { + $status = parent::set($def, $config); + if ($status) { + $this->definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function replace($def, $config) + { + $status = parent::replace($def, $config); + if ($status) { + $this->definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function get($config) + { + $key = $this->generateKey($config); + if (isset($this->definitions[$key])) { + return $this->definitions[$key]; + } + $this->definitions[$key] = parent::get($config); + return $this->definitions[$key]; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in new file mode 100644 index 0000000..b1fec8d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in @@ -0,0 +1,82 @@ +checkDefType($def)) { + return; + } + $file = $this->generateFilePath($config); + if (file_exists($file)) { + return false; + } + if (!$this->_prepareDir($config)) { + return false; + } + return $this->_write($file, serialize($def), $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return int|bool + */ + public function set($def, $config) + { + if (!$this->checkDefType($def)) { + return; + } + $file = $this->generateFilePath($config); + if (!$this->_prepareDir($config)) { + return false; + } + return $this->_write($file, serialize($def), $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return int|bool + */ + public function replace($def, $config) + { + if (!$this->checkDefType($def)) { + return; + } + $file = $this->generateFilePath($config); + if (!file_exists($file)) { + return false; + } + if (!$this->_prepareDir($config)) { + return false; + } + return $this->_write($file, serialize($def), $config); + } + + /** + * @param HTMLPurifier_Config $config + * @return bool|HTMLPurifier_Config + */ + public function get($config) + { + $file = $this->generateFilePath($config); + if (!file_exists($file)) { + return false; + } + return unserialize(file_get_contents($file)); + } + + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function remove($config) + { + $file = $this->generateFilePath($config); + if (!file_exists($file)) { + return false; + } + return unlink($file); + } + + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function flush($config) + { + if (!$this->_prepareDir($config)) { + return false; + } + $dir = $this->generateDirectoryPath($config); + $dh = opendir($dir); + // Apparently, on some versions of PHP, readdir will return + // an empty string if you pass an invalid argument to readdir. + // So you need this test. See #49. + if (false === $dh) { + return false; + } + while (false !== ($filename = readdir($dh))) { + if (empty($filename)) { + continue; + } + if ($filename[0] === '.') { + continue; + } + unlink($dir . '/' . $filename); + } + closedir($dh); + return true; + } + + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function cleanup($config) + { + if (!$this->_prepareDir($config)) { + return false; + } + $dir = $this->generateDirectoryPath($config); + $dh = opendir($dir); + // See #49 (and above). + if (false === $dh) { + return false; + } + while (false !== ($filename = readdir($dh))) { + if (empty($filename)) { + continue; + } + if ($filename[0] === '.') { + continue; + } + $key = substr($filename, 0, strlen($filename) - 4); + $file = $dir . '/' . $filename; + if ($this->isOld($key, $config) && file_exists($file)) { + unlink($file); + } + } + closedir($dh); + return true; + } + + /** + * Generates the file path to the serial file corresponding to + * the configuration and definition name + * @param HTMLPurifier_Config $config + * @return string + * @todo Make protected + */ + public function generateFilePath($config) + { + $key = $this->generateKey($config); + return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; + } + + /** + * Generates the path to the directory contain this cache's serial files + * @param HTMLPurifier_Config $config + * @return string + * @note No trailing slash + * @todo Make protected + */ + public function generateDirectoryPath($config) + { + $base = $this->generateBaseDirectoryPath($config); + return $base . '/' . $this->type; + } + + /** + * Generates path to base directory that contains all definition type + * serials + * @param HTMLPurifier_Config $config + * @return mixed|string + * @todo Make protected + */ + public function generateBaseDirectoryPath($config) + { + $base = $config->get('Cache.SerializerPath'); + $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; + return $base; + } + + /** + * Convenience wrapper function for file_put_contents + * @param string $file File name to write to + * @param string $data Data to write into file + * @param HTMLPurifier_Config $config + * @return int|bool Number of bytes written if success, or false if failure. + */ + private function _write($file, $data, $config) + { + $result = file_put_contents($file, $data); + if ($result !== false) { + // set permissions of the new file (no execute) + $chmod = $config->get('Cache.SerializerPermissions'); + if ($chmod !== null) { + chmod($file, $chmod & 0666); + } + } + return $result; + } + + /** + * Prepares the directory that this type stores the serials in + * @param HTMLPurifier_Config $config + * @return bool True if successful + */ + private function _prepareDir($config) + { + $directory = $this->generateDirectoryPath($config); + $chmod = $config->get('Cache.SerializerPermissions'); + if ($chmod === null) { + if (!@mkdir($directory) && !is_dir($directory)) { + trigger_error( + 'Could not create directory ' . $directory . '', + E_USER_WARNING + ); + return false; + } + return true; + } + if (!is_dir($directory)) { + $base = $this->generateBaseDirectoryPath($config); + if (!is_dir($base)) { + trigger_error( + 'Base directory ' . $base . ' does not exist, + please create or change using %Cache.SerializerPath', + E_USER_WARNING + ); + return false; + } elseif (!$this->_testPermissions($base, $chmod)) { + return false; + } + if (!@mkdir($directory, $chmod) && !is_dir($directory)) { + trigger_error( + 'Could not create directory ' . $directory . '', + E_USER_WARNING + ); + return false; + } + if (!$this->_testPermissions($directory, $chmod)) { + return false; + } + } elseif (!$this->_testPermissions($directory, $chmod)) { + return false; + } + return true; + } + + /** + * Tests permissions on a directory and throws out friendly + * error messages and attempts to chmod it itself if possible + * @param string $dir Directory path + * @param int $chmod Permissions + * @return bool True if directory is writable + */ + private function _testPermissions($dir, $chmod) + { + // early abort, if it is writable, everything is hunky-dory + if (is_writable($dir)) { + return true; + } + if (!is_dir($dir)) { + // generally, you'll want to handle this beforehand + // so a more specific error message can be given + trigger_error( + 'Directory ' . $dir . ' does not exist', + E_USER_WARNING + ); + return false; + } + if (function_exists('posix_getuid') && $chmod !== null) { + // POSIX system, we can give more specific advice + if (fileowner($dir) === posix_getuid()) { + // we can chmod it ourselves + $chmod = $chmod | 0700; + if (chmod($dir, $chmod)) { + return true; + } + } elseif (filegroup($dir) === posix_getgid()) { + $chmod = $chmod | 0070; + } else { + // PHP's probably running as nobody, it is + // not obvious how to fix this (777 is probably + // bad if you are multi-user), let the user figure it out + $chmod = null; + } + trigger_error( + 'Directory ' . $dir . ' not writable. ' . + ($chmod === null ? '' : 'Please chmod to ' . decoct($chmod)), + E_USER_WARNING + ); + } else { + // generic error message + trigger_error( + 'Directory ' . $dir . ' not writable, ' . + 'please alter file permissions', + E_USER_WARNING + ); + } + return false; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php new file mode 100644 index 0000000..3a0f461 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php @@ -0,0 +1,106 @@ + array()); + + /** + * @type array + */ + protected $implementations = array(); + + /** + * @type HTMLPurifier_DefinitionCache_Decorator[] + */ + protected $decorators = array(); + + /** + * Initialize default decorators + */ + public function setup() + { + $this->addDecorator('Cleanup'); + } + + /** + * Retrieves an instance of global definition cache factory. + * @param HTMLPurifier_DefinitionCacheFactory $prototype + * @return HTMLPurifier_DefinitionCacheFactory + */ + public static function instance($prototype = null) + { + static $instance; + if ($prototype !== null) { + $instance = $prototype; + } elseif ($instance === null || $prototype === true) { + $instance = new HTMLPurifier_DefinitionCacheFactory(); + $instance->setup(); + } + return $instance; + } + + /** + * Registers a new definition cache object + * @param string $short Short name of cache object, for reference + * @param string $long Full class name of cache object, for construction + */ + public function register($short, $long) + { + $this->implementations[$short] = $long; + } + + /** + * Factory method that creates a cache object based on configuration + * @param string $type Name of definitions handled by cache + * @param HTMLPurifier_Config $config Config instance + * @return mixed + */ + public function create($type, $config) + { + $method = $config->get('Cache.DefinitionImpl'); + if ($method === null) { + return new HTMLPurifier_DefinitionCache_Null($type); + } + if (!empty($this->caches[$method][$type])) { + return $this->caches[$method][$type]; + } + if (isset($this->implementations[$method]) && + class_exists($class = $this->implementations[$method])) { + $cache = new $class($type); + } else { + if ($method != 'Serializer') { + trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING); + } + $cache = new HTMLPurifier_DefinitionCache_Serializer($type); + } + foreach ($this->decorators as $decorator) { + $new_cache = $decorator->decorate($cache); + // prevent infinite recursion in PHP 4 + unset($cache); + $cache = $new_cache; + } + $this->caches[$method][$type] = $cache; + return $this->caches[$method][$type]; + } + + /** + * Registers a decorator to add to all new cache objects + * @param HTMLPurifier_DefinitionCache_Decorator|string $decorator An instance or the name of a decorator + */ + public function addDecorator($decorator) + { + if (is_string($decorator)) { + $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; + $decorator = new $class; + } + $this->decorators[$decorator->name] = $decorator; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php new file mode 100644 index 0000000..4acd06e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php @@ -0,0 +1,73 @@ +renderDoctype. + * If structure changes, please update that function. + */ +class HTMLPurifier_Doctype +{ + /** + * Full name of doctype + * @type string + */ + public $name; + + /** + * List of standard modules (string identifiers or literal objects) + * that this doctype uses + * @type array + */ + public $modules = array(); + + /** + * List of modules to use for tidying up code + * @type array + */ + public $tidyModules = array(); + + /** + * Is the language derived from XML (i.e. XHTML)? + * @type bool + */ + public $xml = true; + + /** + * List of aliases for this doctype + * @type array + */ + public $aliases = array(); + + /** + * Public DTD identifier + * @type string + */ + public $dtdPublic; + + /** + * System DTD identifier + * @type string + */ + public $dtdSystem; + + public function __construct( + $name = null, + $xml = true, + $modules = array(), + $tidyModules = array(), + $aliases = array(), + $dtd_public = null, + $dtd_system = null + ) { + $this->name = $name; + $this->xml = $xml; + $this->modules = $modules; + $this->tidyModules = $tidyModules; + $this->aliases = $aliases; + $this->dtdPublic = $dtd_public; + $this->dtdSystem = $dtd_system; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php new file mode 100644 index 0000000..9ad7b4b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php @@ -0,0 +1,142 @@ +doctypes[$doctype->name] = $doctype; + $name = $doctype->name; + // hookup aliases + foreach ($doctype->aliases as $alias) { + if (isset($this->doctypes[$alias])) { + continue; + } + $this->aliases[$alias] = $name; + } + // remove old aliases + if (isset($this->aliases[$name])) { + unset($this->aliases[$name]); + } + return $doctype; + } + + /** + * Retrieves reference to a doctype of a certain name + * @note This function resolves aliases + * @note When possible, use the more fully-featured make() + * @param string $doctype Name of doctype + * @return HTMLPurifier_Doctype Editable doctype object + */ + public function get($doctype) + { + if (isset($this->aliases[$doctype])) { + $doctype = $this->aliases[$doctype]; + } + if (!isset($this->doctypes[$doctype])) { + throw new Exception('Doctype ' . htmlspecialchars($doctype) . ' does not exist'); + $anon = new HTMLPurifier_Doctype($doctype); + return $anon; + } + return $this->doctypes[$doctype]; + } + + /** + * Creates a doctype based on a configuration object, + * will perform initialization on the doctype + * @note Use this function to get a copy of doctype that config + * can hold on to (this is necessary in order to tell + * Generator whether or not the current document is XML + * based or not). + * @param HTMLPurifier_Config $config + * @return HTMLPurifier_Doctype + */ + public function make($config) + { + return clone $this->get($this->getDoctypeFromConfig($config)); + } + + /** + * Retrieves the doctype from the configuration object + * @param HTMLPurifier_Config $config + * @return string + */ + public function getDoctypeFromConfig($config) + { + // recommended test + $doctype = $config->get('HTML.Doctype'); + if (!empty($doctype)) { + return $doctype; + } + $doctype = $config->get('HTML.CustomDoctype'); + if (!empty($doctype)) { + return $doctype; + } + // backwards-compatibility + if ($config->get('HTML.XHTML')) { + $doctype = 'XHTML 1.0'; + } else { + $doctype = 'HTML 4.01'; + } + if ($config->get('HTML.Strict')) { + $doctype .= ' Strict'; + } else { + $doctype .= ' Transitional'; + } + return $doctype; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php new file mode 100644 index 0000000..57cfd2b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php @@ -0,0 +1,216 @@ +setup(), this array may also + * contain an array at index 0 that indicates which attribute + * collections to load into the full array. It may also + * contain string indentifiers in lieu of HTMLPurifier_AttrDef, + * see HTMLPurifier_AttrTypes on how they are expanded during + * HTMLPurifier_HTMLDefinition->setup() processing. + */ + public $attr = array(); + + // XXX: Design note: currently, it's not possible to override + // previously defined AttrTransforms without messing around with + // the final generated config. This is by design; a previous version + // used an associated list of attr_transform, but it was extremely + // easy to accidentally override other attribute transforms by + // forgetting to specify an index (and just using 0.) While we + // could check this by checking the index number and complaining, + // there is a second problem which is that it is not at all easy to + // tell when something is getting overridden. Combine this with a + // codebase where this isn't really being used, and it's perfect for + // nuking. + + /** + * List of tags HTMLPurifier_AttrTransform to be done before validation. + * @type array + */ + public $attr_transform_pre = array(); + + /** + * List of tags HTMLPurifier_AttrTransform to be done after validation. + * @type array + */ + public $attr_transform_post = array(); + + /** + * HTMLPurifier_ChildDef of this tag. + * @type HTMLPurifier_ChildDef + */ + public $child; + + /** + * Abstract string representation of internal ChildDef rules. + * @see HTMLPurifier_ContentSets for how this is parsed and then transformed + * into an HTMLPurifier_ChildDef. + * @warning This is a temporary variable that is not available after + * being processed by HTMLDefinition + * @type string + */ + public $content_model; + + /** + * Value of $child->type, used to determine which ChildDef to use, + * used in combination with $content_model. + * @warning This must be lowercase + * @warning This is a temporary variable that is not available after + * being processed by HTMLDefinition + * @type string + */ + public $content_model_type; + + /** + * Does the element have a content model (#PCDATA | Inline)*? This + * is important for chameleon ins and del processing in + * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't + * have to worry about this one. + * @type bool + */ + public $descendants_are_inline = false; + + /** + * List of the names of required attributes this element has. + * Dynamically populated by HTMLPurifier_HTMLDefinition::getElement() + * @type array + */ + public $required_attr = array(); + + /** + * Lookup table of tags excluded from all descendants of this tag. + * @type array + * @note SGML permits exclusions for all descendants, but this is + * not possible with DTDs or XML Schemas. W3C has elected to + * use complicated compositions of content_models to simulate + * exclusion for children, but we go the simpler, SGML-style + * route of flat-out exclusions, which correctly apply to + * all descendants and not just children. Note that the XHTML + * Modularization Abstract Modules are blithely unaware of such + * distinctions. + */ + public $excludes = array(); + + /** + * This tag is explicitly auto-closed by the following tags. + * @type array + */ + public $autoclose = array(); + + /** + * If a foreign element is found in this element, test if it is + * allowed by this sub-element; if it is, instead of closing the + * current element, place it inside this element. + * @type string + */ + public $wrap; + + /** + * Whether or not this is a formatting element affected by the + * "Active Formatting Elements" algorithm. + * @type bool + */ + public $formatting; + + /** + * Low-level factory constructor for creating new standalone element defs + */ + public static function create($content_model, $content_model_type, $attr) + { + $def = new HTMLPurifier_ElementDef(); + $def->content_model = $content_model; + $def->content_model_type = $content_model_type; + $def->attr = $attr; + return $def; + } + + /** + * Merges the values of another element definition into this one. + * Values from the new element def take precedence if a value is + * not mergeable. + * @param HTMLPurifier_ElementDef $def + */ + public function mergeIn($def) + { + // later keys takes precedence + foreach ($def->attr as $k => $v) { + if ($k === 0) { + // merge in the includes + // sorry, no way to override an include + foreach ($v as $v2) { + $this->attr[0][] = $v2; + } + continue; + } + if ($v === false) { + if (isset($this->attr[$k])) { + unset($this->attr[$k]); + } + continue; + } + $this->attr[$k] = $v; + } + $this->_mergeAssocArray($this->excludes, $def->excludes); + $this->attr_transform_pre = array_merge($this->attr_transform_pre, $def->attr_transform_pre); + $this->attr_transform_post = array_merge($this->attr_transform_post, $def->attr_transform_post); + + if (!empty($def->content_model)) { + $this->content_model = + str_replace("#SUPER", (string)$this->content_model, $def->content_model); + $this->child = false; + } + if (!empty($def->content_model_type)) { + $this->content_model_type = $def->content_model_type; + $this->child = false; + } + if (!is_null($def->child)) { + $this->child = $def->child; + } + if (!is_null($def->formatting)) { + $this->formatting = $def->formatting; + } + if ($def->descendants_are_inline) { + $this->descendants_are_inline = $def->descendants_are_inline; + } + } + + /** + * Merges one array into another, removes values which equal false + * @param $a1 Array by reference that is merged into + * @param $a2 Array that merges into $a1 + */ + private function _mergeAssocArray(&$a1, $a2) + { + foreach ($a2 as $k => $v) { + if ($v === false) { + if (isset($a1[$k])) { + unset($a1[$k]); + } + continue; + } + $a1[$k] = $v; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php new file mode 100644 index 0000000..910181b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php @@ -0,0 +1,615 @@ += $c) { + $r .= self::unsafeIconv($in, $out, substr($text, $i)); + break; + } + // wibble the boundary + if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) { + $chunk_size = $max_chunk_size; + } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) { + $chunk_size = $max_chunk_size - 1; + } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) { + $chunk_size = $max_chunk_size - 2; + } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) { + $chunk_size = $max_chunk_size - 3; + } else { + return false; // rather confusing UTF-8... + } + $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths + $r .= self::unsafeIconv($in, $out, $chunk); + $i += $chunk_size; + } + return $r; + } else { + return false; + } + } else { + return false; + } + } + + /** + * Cleans a UTF-8 string for well-formedness and SGML validity + * + * It will parse according to UTF-8 and return a valid UTF8 string, with + * non-SGML codepoints excluded. + * + * Specifically, it will permit: + * \x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF} + * Source: https://www.w3.org/TR/REC-xml/#NT-Char + * Arguably this function should be modernized to the HTML5 set + * of allowed characters: + * https://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream + * which simultaneously expand and restrict the set of allowed characters. + * + * @param string $str The string to clean + * @param bool $force_php + * @return string + * + * @note Just for reference, the non-SGML code points are 0 to 31 and + * 127 to 159, inclusive. However, we allow code points 9, 10 + * and 13, which are the tab, line feed and carriage return + * respectively. 128 and above the code points map to multibyte + * UTF-8 representations. + * + * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and + * hsivonen@iki.fi at under the + * LGPL license. Notes on what changed are inside, but in general, + * the original code transformed UTF-8 text into an array of integer + * Unicode codepoints. Understandably, transforming that back to + * a string would be somewhat expensive, so the function was modded to + * directly operate on the string. However, this discourages code + * reuse, and the logic enumerated here would be useful for any + * function that needs to be able to understand UTF-8 characters. + * As of right now, only smart lossless character encoding converters + * would need that, and I'm probably not going to implement them. + */ + public static function cleanUTF8($str, $force_php = false) + { + // UTF-8 validity is checked since PHP 4.3.5 + // This is an optimization: if the string is already valid UTF-8, no + // need to do PHP stuff. 99% of the time, this will be the case. + if (preg_match( + '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du', + $str + )) { + return $str; + } + + $mState = 0; // cached expected number of octets after the current octet + // until the beginning of the next UTF8 character sequence + $mUcs4 = 0; // cached Unicode character + $mBytes = 1; // cached expected number of octets in the current sequence + + // original code involved an $out that was an array of Unicode + // codepoints. Instead of having to convert back into UTF-8, we've + // decided to directly append valid UTF-8 characters onto a string + // $out once they're done. $char accumulates raw bytes, while $mUcs4 + // turns into the Unicode code point, so there's some redundancy. + + $out = ''; + $char = ''; + + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + $in = ord($str[$i]); + $char .= $str[$i]; // append byte to char + if (0 == $mState) { + // When mState is zero we expect either a US-ASCII character + // or a multi-octet sequence. + if (0 == (0x80 & ($in))) { + // US-ASCII, pass straight through. + if (($in <= 31 || $in == 127) && + !($in == 9 || $in == 13 || $in == 10) // save \r\t\n + ) { + // control characters, remove + } else { + $out .= $char; + } + // reset + $char = ''; + $mBytes = 1; + } elseif (0xC0 == (0xE0 & ($in))) { + // First octet of 2 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x1F) << 6; + $mState = 1; + $mBytes = 2; + } elseif (0xE0 == (0xF0 & ($in))) { + // First octet of 3 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x0F) << 12; + $mState = 2; + $mBytes = 3; + } elseif (0xF0 == (0xF8 & ($in))) { + // First octet of 4 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x07) << 18; + $mState = 3; + $mBytes = 4; + } elseif (0xF8 == (0xFC & ($in))) { + // First octet of 5 octet sequence. + // + // This is illegal because the encoded codepoint must be + // either: + // (a) not the shortest form or + // (b) outside the Unicode range of 0-0x10FFFF. + // Rather than trying to resynchronize, we will carry on + // until the end of the sequence and let the later error + // handling code catch it. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x03) << 24; + $mState = 4; + $mBytes = 5; + } elseif (0xFC == (0xFE & ($in))) { + // First octet of 6 octet sequence, see comments for 5 + // octet sequence. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 1) << 30; + $mState = 5; + $mBytes = 6; + } else { + // Current octet is neither in the US-ASCII range nor a + // legal first octet of a multi-octet sequence. + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char = ''; + } + } else { + // When mState is non-zero, we expect a continuation of the + // multi-octet sequence + if (0x80 == (0xC0 & ($in))) { + // Legal continuation. + $shift = ($mState - 1) * 6; + $tmp = $in; + $tmp = ($tmp & 0x0000003F) << $shift; + $mUcs4 |= $tmp; + + if (0 == --$mState) { + // End of the multi-octet sequence. mUcs4 now contains + // the final Unicode codepoint to be output + + // Check for illegal sequences and codepoints. + + // From Unicode 3.1, non-shortest form is illegal + if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || + ((3 == $mBytes) && ($mUcs4 < 0x0800)) || + ((4 == $mBytes) && ($mUcs4 < 0x10000)) || + (4 < $mBytes) || + // From Unicode 3.2, surrogate characters = illegal + (($mUcs4 & 0xFFFFF800) == 0xD800) || + // Codepoints outside the Unicode range are illegal + ($mUcs4 > 0x10FFFF) + ) { + + } elseif (0xFEFF != $mUcs4 && // omit BOM + // check for valid Char unicode codepoints + ( + 0x9 == $mUcs4 || + 0xA == $mUcs4 || + 0xD == $mUcs4 || + (0x20 <= $mUcs4 && 0x7E >= $mUcs4) || + // 7F-9F is not strictly prohibited by XML, + // but it is non-SGML, and thus we don't allow it + (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) || + (0xE000 <= $mUcs4 && 0xFFFD >= $mUcs4) || + (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4) + ) + ) { + $out .= $char; + } + // initialize UTF8 cache (reset) + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char = ''; + } + } else { + // ((0xC0 & (*in) != 0x80) && (mState != 0)) + // Incomplete multi-octet sequence. + // used to result in complete fail, but we'll reset + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char =''; + } + } + } + return $out; + } + + /** + * Translates a Unicode codepoint into its corresponding UTF-8 character. + * @note Based on Feyd's function at + * , + * which is in public domain. + * @note While we're going to do code point parsing anyway, a good + * optimization would be to refuse to translate code points that + * are non-SGML characters. However, this could lead to duplication. + * @note This is very similar to the unichr function in + * maintenance/generate-entity-file.php (although this is superior, + * due to its sanity checks). + */ + + // +----------+----------+----------+----------+ + // | 33222222 | 22221111 | 111111 | | + // | 10987654 | 32109876 | 54321098 | 76543210 | bit + // +----------+----------+----------+----------+ + // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F + // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF + // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF + // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF + // +----------+----------+----------+----------+ + // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF) + // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes + // +----------+----------+----------+----------+ + + public static function unichr($code) + { + if ($code > 1114111 or $code < 0 or + ($code >= 55296 and $code <= 57343) ) { + // bits are set outside the "valid" range as defined + // by UNICODE 4.1.0 + return ''; + } + + $x = $y = $z = $w = 0; + if ($code < 128) { + // regular ASCII character + $x = $code; + } else { + // set up bits for UTF-8 + $x = ($code & 63) | 128; + if ($code < 2048) { + $y = (($code & 2047) >> 6) | 192; + } else { + $y = (($code & 4032) >> 6) | 128; + if ($code < 65536) { + $z = (($code >> 12) & 15) | 224; + } else { + $z = (($code >> 12) & 63) | 128; + $w = (($code >> 18) & 7) | 240; + } + } + } + // set up the actual character + $ret = ''; + if ($w) { + $ret .= chr($w); + } + if ($z) { + $ret .= chr($z); + } + if ($y) { + $ret .= chr($y); + } + $ret .= chr($x); + + return $ret; + } + + /** + * @return bool + */ + public static function iconvAvailable() + { + static $iconv = null; + if ($iconv === null) { + $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE; + } + return $iconv; + } + + /** + * Convert a string to UTF-8 based on configuration. + * @param string $str The string to convert + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public static function convertToUTF8($str, $config, $context) + { + $encoding = $config->get('Core.Encoding'); + if ($encoding === 'utf-8') { + return $str; + } + static $iconv = null; + if ($iconv === null) { + $iconv = self::iconvAvailable(); + } + if ($iconv && !$config->get('Test.ForceNoIconv')) { + // unaffected by bugs, since UTF-8 support all characters + $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str); + if ($str === false) { + // $encoding is not a valid encoding + throw new Exception('Invalid encoding ' . $encoding); + return ''; + } + // If the string is bjorked by Shift_JIS or a similar encoding + // that doesn't support all of ASCII, convert the naughty + // characters to their true byte-wise ASCII/UTF-8 equivalents. + $str = strtr($str, self::testEncodingSupportsASCII($encoding)); + return $str; + } elseif ($encoding === 'iso-8859-1' && function_exists('mb_convert_encoding')) { + $str = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1'); + return $str; + } + $bug = HTMLPurifier_Encoder::testIconvTruncateBug(); + if ($bug == self::ICONV_OK) { + throw new Exception('Encoding not supported, please install iconv'); + } else { + throw new Exception( + 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' . + 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541' + ); + } + } + + /** + * Converts a string from UTF-8 based on configuration. + * @param string $str The string to convert + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + * @note Currently, this is a lossy conversion, with unexpressable + * characters being omitted. + */ + public static function convertFromUTF8($str, $config, $context) + { + $encoding = $config->get('Core.Encoding'); + if ($escape = $config->get('Core.EscapeNonASCIICharacters')) { + $str = self::convertToASCIIDumbLossless($str); + } + if ($encoding === 'utf-8') { + return $str; + } + static $iconv = null; + if ($iconv === null) { + $iconv = self::iconvAvailable(); + } + if ($iconv && !$config->get('Test.ForceNoIconv')) { + // Undo our previous fix in convertToUTF8, otherwise iconv will barf + $ascii_fix = self::testEncodingSupportsASCII($encoding); + if (!$escape && !empty($ascii_fix)) { + $clear_fix = array(); + foreach ($ascii_fix as $utf8 => $native) { + $clear_fix[$utf8] = ''; + } + $str = strtr($str, $clear_fix); + } + $str = strtr($str, array_flip($ascii_fix)); + // Normal stuff + $str = self::iconv('utf-8', $encoding . '//IGNORE', $str); + return $str; + } elseif ($encoding === 'iso-8859-1' && function_exists('mb_convert_encoding')) { + $str = mb_convert_encoding($str, 'ISO-8859-1', 'UTF-8'); + return $str; + } + throw new Exception('Encoding not supported'); + // You might be tempted to assume that the ASCII representation + // might be OK, however, this is *not* universally true over all + // encodings. So we take the conservative route here, rather + // than forcibly turn on %Core.EscapeNonASCIICharacters + } + + /** + * Lossless (character-wise) conversion of HTML to ASCII + * @param string $str UTF-8 string to be converted to ASCII + * @return string ASCII encoded string with non-ASCII character entity-ized + * @warning Adapted from MediaWiki, claiming fair use: this is a common + * algorithm. If you disagree with this license fudgery, + * implement it yourself. + * @note Uses decimal numeric entities since they are best supported. + * @note This is a DUMB function: it has no concept of keeping + * character entities that the projected character encoding + * can allow. We could possibly implement a smart version + * but that would require it to also know which Unicode + * codepoints the charset supported (not an easy task). + * @note Sort of with cleanUTF8() but it assumes that $str is + * well-formed UTF-8 + */ + public static function convertToASCIIDumbLossless($str) + { + $bytesleft = 0; + $result = ''; + $working = 0; + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + $bytevalue = ord($str[$i]); + if ($bytevalue <= 0x7F) { //0xxx xxxx + $result .= chr($bytevalue); + $bytesleft = 0; + } elseif ($bytevalue <= 0xBF) { //10xx xxxx + $working = $working << 6; + $working += ($bytevalue & 0x3F); + $bytesleft--; + if ($bytesleft <= 0) { + $result .= "&#" . $working . ";"; + } + } elseif ($bytevalue <= 0xDF) { //110x xxxx + $working = $bytevalue & 0x1F; + $bytesleft = 1; + } elseif ($bytevalue <= 0xEF) { //1110 xxxx + $working = $bytevalue & 0x0F; + $bytesleft = 2; + } else { //1111 0xxx + $working = $bytevalue & 0x07; + $bytesleft = 3; + } + } + return $result; + } + + /** No bugs detected in iconv. */ + const ICONV_OK = 0; + + /** Iconv truncates output if converting from UTF-8 to another + * character set with //IGNORE, and a non-encodable character is found */ + const ICONV_TRUNCATES = 1; + + /** Iconv does not support //IGNORE, making it unusable for + * transcoding purposes */ + const ICONV_UNUSABLE = 2; + + /** + * glibc iconv has a known bug where it doesn't handle the magic + * //IGNORE stanza correctly. In particular, rather than ignore + * characters, it will return an EILSEQ after consuming some number + * of characters, and expect you to restart iconv as if it were + * an E2BIG. Old versions of PHP did not respect the errno, and + * returned the fragment, so as a result you would see iconv + * mysteriously truncating output. We can work around this by + * manually chopping our input into segments of about 8000 + * characters, as long as PHP ignores the error code. If PHP starts + * paying attention to the error code, iconv becomes unusable. + * + * @return int Error code indicating severity of bug. + */ + public static function testIconvTruncateBug() + { + static $code = null; + if ($code === null) { + // better not use iconv, otherwise infinite loop! + $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000)); + if ($r === false) { + $code = self::ICONV_UNUSABLE; + } elseif (($c = strlen($r)) < 9000) { + $code = self::ICONV_TRUNCATES; + } elseif ($c > 9000) { + throw new Exception( + 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' . + 'include your iconv version as per phpversion()' + ); + } else { + $code = self::ICONV_OK; + } + } + return $code; + } + + /** + * This expensive function tests whether or not a given character + * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will + * fail this test, and require special processing. Variable width + * encodings shouldn't ever fail. + * + * @param string $encoding Encoding name to test, as per iconv format + * @param bool $bypass Whether or not to bypass the precompiled arrays. + * @return Array of UTF-8 characters to their corresponding ASCII, + * which can be used to "undo" any overzealous iconv action. + */ + public static function testEncodingSupportsASCII($encoding, $bypass = false) + { + // All calls to iconv here are unsafe, proof by case analysis: + // If ICONV_OK, no difference. + // If ICONV_TRUNCATE, all calls involve one character inputs, + // so bug is not triggered. + // If ICONV_UNUSABLE, this call is irrelevant + static $encodings = array(); + if (!$bypass) { + if (isset($encodings[$encoding])) { + return $encodings[$encoding]; + } + $lenc = strtolower($encoding); + switch ($lenc) { + case 'shift_jis': + return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~'); + case 'johab': + return array("\xE2\x82\xA9" => '\\'); + } + if (strpos($lenc, 'iso-8859-') === 0) { + return array(); + } + } + $ret = array(); + if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) { + return false; + } + for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars + $c = chr($i); // UTF-8 char + $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion + if ($r === '' || + // This line is needed for iconv implementations that do not + // omit characters that do not exist in the target character set + ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c) + ) { + // Reverse engineer: what's the UTF-8 equiv of this byte + // sequence? This assumes that there's no variable width + // encoding that doesn't support ASCII. + $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c; + } + } + $encodings[$encoding] = $ret; + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php new file mode 100644 index 0000000..f12ff13 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php @@ -0,0 +1,48 @@ +table = unserialize(file_get_contents($file)); + } + + /** + * Retrieves sole instance of the object. + * @param bool|HTMLPurifier_EntityLookup $prototype Optional prototype of custom lookup table to overload with. + * @return HTMLPurifier_EntityLookup + */ + public static function instance($prototype = false) + { + // no references, since PHP doesn't copy unless modified + static $instance = null; + if ($prototype) { + $instance = $prototype; + } elseif (!$instance) { + $instance = new HTMLPurifier_EntityLookup(); + $instance->setup(); + } + return $instance; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser new file mode 100644 index 0000000..e8b0812 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser @@ -0,0 +1 @@ +a:253:{s:4:"fnof";s:2:"ƒ";s:5:"Alpha";s:2:"Α";s:4:"Beta";s:2:"Β";s:5:"Gamma";s:2:"Γ";s:5:"Delta";s:2:"Δ";s:7:"Epsilon";s:2:"Ε";s:4:"Zeta";s:2:"Ζ";s:3:"Eta";s:2:"Η";s:5:"Theta";s:2:"Θ";s:4:"Iota";s:2:"Ι";s:5:"Kappa";s:2:"Κ";s:6:"Lambda";s:2:"Λ";s:2:"Mu";s:2:"Μ";s:2:"Nu";s:2:"Ν";s:2:"Xi";s:2:"Ξ";s:7:"Omicron";s:2:"Ο";s:2:"Pi";s:2:"Π";s:3:"Rho";s:2:"Ρ";s:5:"Sigma";s:2:"Σ";s:3:"Tau";s:2:"Τ";s:7:"Upsilon";s:2:"Υ";s:3:"Phi";s:2:"Φ";s:3:"Chi";s:2:"Χ";s:3:"Psi";s:2:"Ψ";s:5:"Omega";s:2:"Ω";s:5:"alpha";s:2:"α";s:4:"beta";s:2:"β";s:5:"gamma";s:2:"γ";s:5:"delta";s:2:"δ";s:7:"epsilon";s:2:"ε";s:4:"zeta";s:2:"ζ";s:3:"eta";s:2:"η";s:5:"theta";s:2:"θ";s:4:"iota";s:2:"ι";s:5:"kappa";s:2:"κ";s:6:"lambda";s:2:"λ";s:2:"mu";s:2:"μ";s:2:"nu";s:2:"ν";s:2:"xi";s:2:"ξ";s:7:"omicron";s:2:"ο";s:2:"pi";s:2:"π";s:3:"rho";s:2:"ρ";s:6:"sigmaf";s:2:"ς";s:5:"sigma";s:2:"σ";s:3:"tau";s:2:"τ";s:7:"upsilon";s:2:"υ";s:3:"phi";s:2:"φ";s:3:"chi";s:2:"χ";s:3:"psi";s:2:"ψ";s:5:"omega";s:2:"ω";s:8:"thetasym";s:2:"ϑ";s:5:"upsih";s:2:"ϒ";s:3:"piv";s:2:"ϖ";s:4:"bull";s:3:"•";s:6:"hellip";s:3:"…";s:5:"prime";s:3:"′";s:5:"Prime";s:3:"″";s:5:"oline";s:3:"‾";s:5:"frasl";s:3:"⁄";s:6:"weierp";s:3:"℘";s:5:"image";s:3:"ℑ";s:4:"real";s:3:"ℜ";s:5:"trade";s:3:"™";s:7:"alefsym";s:3:"ℵ";s:4:"larr";s:3:"←";s:4:"uarr";s:3:"↑";s:4:"rarr";s:3:"→";s:4:"darr";s:3:"↓";s:4:"harr";s:3:"↔";s:5:"crarr";s:3:"↵";s:4:"lArr";s:3:"⇐";s:4:"uArr";s:3:"⇑";s:4:"rArr";s:3:"⇒";s:4:"dArr";s:3:"⇓";s:4:"hArr";s:3:"⇔";s:6:"forall";s:3:"∀";s:4:"part";s:3:"∂";s:5:"exist";s:3:"∃";s:5:"empty";s:3:"∅";s:5:"nabla";s:3:"∇";s:4:"isin";s:3:"∈";s:5:"notin";s:3:"∉";s:2:"ni";s:3:"∋";s:4:"prod";s:3:"∏";s:3:"sum";s:3:"∑";s:5:"minus";s:3:"−";s:6:"lowast";s:3:"∗";s:5:"radic";s:3:"√";s:4:"prop";s:3:"∝";s:5:"infin";s:3:"∞";s:3:"ang";s:3:"∠";s:3:"and";s:3:"∧";s:2:"or";s:3:"∨";s:3:"cap";s:3:"∩";s:3:"cup";s:3:"∪";s:3:"int";s:3:"∫";s:6:"there4";s:3:"∴";s:3:"sim";s:3:"∼";s:4:"cong";s:3:"≅";s:5:"asymp";s:3:"≈";s:2:"ne";s:3:"≠";s:5:"equiv";s:3:"≡";s:2:"le";s:3:"≤";s:2:"ge";s:3:"≥";s:3:"sub";s:3:"⊂";s:3:"sup";s:3:"⊃";s:4:"nsub";s:3:"⊄";s:4:"sube";s:3:"⊆";s:4:"supe";s:3:"⊇";s:5:"oplus";s:3:"⊕";s:6:"otimes";s:3:"⊗";s:4:"perp";s:3:"⊥";s:4:"sdot";s:3:"⋅";s:5:"lceil";s:3:"⌈";s:5:"rceil";s:3:"⌉";s:6:"lfloor";s:3:"⌊";s:6:"rfloor";s:3:"⌋";s:4:"lang";s:3:"〈";s:4:"rang";s:3:"〉";s:3:"loz";s:3:"◊";s:6:"spades";s:3:"♠";s:5:"clubs";s:3:"♣";s:6:"hearts";s:3:"♥";s:5:"diams";s:3:"♦";s:4:"quot";s:1:""";s:3:"amp";s:1:"&";s:2:"lt";s:1:"<";s:2:"gt";s:1:">";s:4:"apos";s:1:"'";s:5:"OElig";s:2:"Œ";s:5:"oelig";s:2:"œ";s:6:"Scaron";s:2:"Š";s:6:"scaron";s:2:"š";s:4:"Yuml";s:2:"Ÿ";s:4:"circ";s:2:"ˆ";s:5:"tilde";s:2:"˜";s:4:"ensp";s:3:" ";s:4:"emsp";s:3:" ";s:6:"thinsp";s:3:" ";s:4:"zwnj";s:3:"‌";s:3:"zwj";s:3:"‍";s:3:"lrm";s:3:"‎";s:3:"rlm";s:3:"‏";s:5:"ndash";s:3:"–";s:5:"mdash";s:3:"—";s:5:"lsquo";s:3:"‘";s:5:"rsquo";s:3:"’";s:5:"sbquo";s:3:"‚";s:5:"ldquo";s:3:"“";s:5:"rdquo";s:3:"”";s:5:"bdquo";s:3:"„";s:6:"dagger";s:3:"†";s:6:"Dagger";s:3:"‡";s:6:"permil";s:3:"‰";s:6:"lsaquo";s:3:"‹";s:6:"rsaquo";s:3:"›";s:4:"euro";s:3:"€";s:4:"nbsp";s:2:" ";s:5:"iexcl";s:2:"¡";s:4:"cent";s:2:"¢";s:5:"pound";s:2:"£";s:6:"curren";s:2:"¤";s:3:"yen";s:2:"¥";s:6:"brvbar";s:2:"¦";s:4:"sect";s:2:"§";s:3:"uml";s:2:"¨";s:4:"copy";s:2:"©";s:4:"ordf";s:2:"ª";s:5:"laquo";s:2:"«";s:3:"not";s:2:"¬";s:3:"shy";s:2:"­";s:3:"reg";s:2:"®";s:4:"macr";s:2:"¯";s:3:"deg";s:2:"°";s:6:"plusmn";s:2:"±";s:4:"sup2";s:2:"²";s:4:"sup3";s:2:"³";s:5:"acute";s:2:"´";s:5:"micro";s:2:"µ";s:4:"para";s:2:"¶";s:6:"middot";s:2:"·";s:5:"cedil";s:2:"¸";s:4:"sup1";s:2:"¹";s:4:"ordm";s:2:"º";s:5:"raquo";s:2:"»";s:6:"frac14";s:2:"¼";s:6:"frac12";s:2:"½";s:6:"frac34";s:2:"¾";s:6:"iquest";s:2:"¿";s:6:"Agrave";s:2:"À";s:6:"Aacute";s:2:"Á";s:5:"Acirc";s:2:"Â";s:6:"Atilde";s:2:"Ã";s:4:"Auml";s:2:"Ä";s:5:"Aring";s:2:"Å";s:5:"AElig";s:2:"Æ";s:6:"Ccedil";s:2:"Ç";s:6:"Egrave";s:2:"È";s:6:"Eacute";s:2:"É";s:5:"Ecirc";s:2:"Ê";s:4:"Euml";s:2:"Ë";s:6:"Igrave";s:2:"Ì";s:6:"Iacute";s:2:"Í";s:5:"Icirc";s:2:"Î";s:4:"Iuml";s:2:"Ï";s:3:"ETH";s:2:"Ð";s:6:"Ntilde";s:2:"Ñ";s:6:"Ograve";s:2:"Ò";s:6:"Oacute";s:2:"Ó";s:5:"Ocirc";s:2:"Ô";s:6:"Otilde";s:2:"Õ";s:4:"Ouml";s:2:"Ö";s:5:"times";s:2:"×";s:6:"Oslash";s:2:"Ø";s:6:"Ugrave";s:2:"Ù";s:6:"Uacute";s:2:"Ú";s:5:"Ucirc";s:2:"Û";s:4:"Uuml";s:2:"Ü";s:6:"Yacute";s:2:"Ý";s:5:"THORN";s:2:"Þ";s:5:"szlig";s:2:"ß";s:6:"agrave";s:2:"à";s:6:"aacute";s:2:"á";s:5:"acirc";s:2:"â";s:6:"atilde";s:2:"ã";s:4:"auml";s:2:"ä";s:5:"aring";s:2:"å";s:5:"aelig";s:2:"æ";s:6:"ccedil";s:2:"ç";s:6:"egrave";s:2:"è";s:6:"eacute";s:2:"é";s:5:"ecirc";s:2:"ê";s:4:"euml";s:2:"ë";s:6:"igrave";s:2:"ì";s:6:"iacute";s:2:"í";s:5:"icirc";s:2:"î";s:4:"iuml";s:2:"ï";s:3:"eth";s:2:"ð";s:6:"ntilde";s:2:"ñ";s:6:"ograve";s:2:"ò";s:6:"oacute";s:2:"ó";s:5:"ocirc";s:2:"ô";s:6:"otilde";s:2:"õ";s:4:"ouml";s:2:"ö";s:6:"divide";s:2:"÷";s:6:"oslash";s:2:"ø";s:6:"ugrave";s:2:"ù";s:6:"uacute";s:2:"ú";s:5:"ucirc";s:2:"û";s:4:"uuml";s:2:"ü";s:6:"yacute";s:2:"ý";s:5:"thorn";s:2:"þ";s:4:"yuml";s:2:"ÿ";} \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php new file mode 100644 index 0000000..1dcd10c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php @@ -0,0 +1,285 @@ +_semiOptionalPrefixRegex = "/&()()()($semi_optional)/"; + + $this->_textEntitiesRegex = + '/&(?:'. + // hex + '[#]x([a-fA-F0-9]+);?|'. + // dec + '[#]0*(\d+);?|'. + // string (mandatory semicolon) + // NB: order matters: match semicolon preferentially + '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'. + // string (optional semicolon) + "($semi_optional)". + ')/'; + + $this->_attrEntitiesRegex = + '/&(?:'. + // hex + '[#]x([a-fA-F0-9]+);?|'. + // dec + '[#]0*(\d+);?|'. + // string (mandatory semicolon) + // NB: order matters: match semicolon preferentially + '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'. + // string (optional semicolon) + // don't match if trailing is equals or alphanumeric (URL + // like) + "($semi_optional)(?![=;A-Za-z0-9])". + ')/'; + + } + + /** + * Substitute entities with the parsed equivalents. Use this on + * textual data in an HTML document (as opposed to attributes.) + * + * @param string $string String to have entities parsed. + * @return string Parsed string. + */ + public function substituteTextEntities($string) + { + return preg_replace_callback( + $this->_textEntitiesRegex, + array($this, 'entityCallback'), + $string + ); + } + + /** + * Substitute entities with the parsed equivalents. Use this on + * attribute contents in documents. + * + * @param string $string String to have entities parsed. + * @return string Parsed string. + */ + public function substituteAttrEntities($string) + { + return preg_replace_callback( + $this->_attrEntitiesRegex, + array($this, 'entityCallback'), + $string + ); + } + + /** + * Callback function for substituteNonSpecialEntities() that does the work. + * + * @param array $matches PCRE matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @return string Replacement string. + */ + + protected function entityCallback($matches) + { + $entity = $matches[0]; + $hex_part = isset($matches[1]) ? $matches[1] : null; + $dec_part = isset($matches[2]) ? $matches[2] : null; + $named_part = empty($matches[3]) ? (empty($matches[4]) ? "" : $matches[4]) : $matches[3]; + if ($hex_part !== NULL && $hex_part !== "") { + return HTMLPurifier_Encoder::unichr(hexdec($hex_part)); + } elseif ($dec_part !== NULL && $dec_part !== "") { + return HTMLPurifier_Encoder::unichr((int) $dec_part); + } else { + if (!$this->_entity_lookup) { + $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); + } + if (isset($this->_entity_lookup->table[$named_part])) { + return $this->_entity_lookup->table[$named_part]; + } else { + // exact match didn't match anything, so test if + // any of the semicolon optional match the prefix. + // Test that this is an EXACT match is important to + // prevent infinite loop + if (!empty($matches[3])) { + return preg_replace_callback( + $this->_semiOptionalPrefixRegex, + array($this, 'entityCallback'), + $entity + ); + } + return $entity; + } + } + } + + // LEGACY CODE BELOW + + /** + * Callback regex string for parsing entities. + * @type string + */ + protected $_substituteEntitiesRegex = + '/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/'; + // 1. hex 2. dec 3. string (XML style) + + /** + * Decimal to parsed string conversion table for special entities. + * @type array + */ + protected $_special_dec2str = + array( + 34 => '"', + 38 => '&', + 39 => "'", + 60 => '<', + 62 => '>' + ); + + /** + * Stripped entity names to decimal conversion table for special entities. + * @type array + */ + protected $_special_ent2dec = + array( + 'quot' => 34, + 'amp' => 38, + 'lt' => 60, + 'gt' => 62 + ); + + /** + * Substitutes non-special entities with their parsed equivalents. Since + * running this whenever you have parsed character is t3h 5uck, we run + * it before everything else. + * + * @param string $string String to have non-special entities parsed. + * @return string Parsed string. + */ + public function substituteNonSpecialEntities($string) + { + // it will try to detect missing semicolons, but don't rely on it + return preg_replace_callback( + $this->_substituteEntitiesRegex, + array($this, 'nonSpecialEntityCallback'), + $string + ); + } + + /** + * Callback function for substituteNonSpecialEntities() that does the work. + * + * @param array $matches PCRE matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @return string Replacement string. + */ + + protected function nonSpecialEntityCallback($matches) + { + // replaces all but big five + $entity = $matches[0]; + $is_num = (@$matches[0][1] === '#'); + if ($is_num) { + $is_hex = (@$entity[2] === 'x'); + $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; + // abort for special characters + if (isset($this->_special_dec2str[$code])) { + return $entity; + } + return HTMLPurifier_Encoder::unichr($code); + } else { + if (isset($this->_special_ent2dec[$matches[3]])) { + return $entity; + } + if (!$this->_entity_lookup) { + $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); + } + if (isset($this->_entity_lookup->table[$matches[3]])) { + return $this->_entity_lookup->table[$matches[3]]; + } else { + return $entity; + } + } + } + + /** + * Substitutes only special entities with their parsed equivalents. + * + * @notice We try to avoid calling this function because otherwise, it + * would have to be called a lot (for every parsed section). + * + * @param string $string String to have non-special entities parsed. + * @return string Parsed string. + */ + public function substituteSpecialEntities($string) + { + return preg_replace_callback( + $this->_substituteEntitiesRegex, + array($this, 'specialEntityCallback'), + $string + ); + } + + /** + * Callback function for substituteSpecialEntities() that does the work. + * + * This callback has same syntax as nonSpecialEntityCallback(). + * + * @param array $matches PCRE-style matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @return string Replacement string. + */ + protected function specialEntityCallback($matches) + { + $entity = $matches[0]; + $is_num = (@$matches[0][1] === '#'); + if ($is_num) { + $is_hex = (@$entity[2] === 'x'); + $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; + return isset($this->_special_dec2str[$int]) ? + $this->_special_dec2str[$int] : + $entity; + } else { + return isset($this->_special_ent2dec[$matches[3]]) ? + $this->_special_dec2str[$this->_special_ent2dec[$matches[3]]] : + $entity; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php new file mode 100644 index 0000000..d47e3f2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php @@ -0,0 +1,244 @@ +locale =& $context->get('Locale'); + $this->context = $context; + $this->_current =& $this->_stacks[0]; + $this->errors =& $this->_stacks[0]; + } + + /** + * Sends an error message to the collector for later use + * @param int $severity Error severity, PHP error style (don't use E_USER_) + * @param string $msg Error message text + */ + public function send($severity, $msg) + { + $args = array(); + if (func_num_args() > 2) { + $args = func_get_args(); + array_shift($args); + unset($args[0]); + } + + $token = $this->context->get('CurrentToken', true); + $line = $token ? $token->line : $this->context->get('CurrentLine', true); + $col = $token ? $token->col : $this->context->get('CurrentCol', true); + $attr = $this->context->get('CurrentAttr', true); + + // perform special substitutions, also add custom parameters + $subst = array(); + if (!is_null($token)) { + $args['CurrentToken'] = $token; + } + if (!is_null($attr)) { + $subst['$CurrentAttr.Name'] = $attr; + if (isset($token->attr[$attr])) { + $subst['$CurrentAttr.Value'] = $token->attr[$attr]; + } + } + + if (empty($args)) { + $msg = $this->locale->getMessage($msg); + } else { + $msg = $this->locale->formatMessage($msg, $args); + } + + if (!empty($subst)) { + $msg = strtr($msg, $subst); + } + + // (numerically indexed) + $error = array( + self::LINENO => $line, + self::SEVERITY => $severity, + self::MESSAGE => $msg, + self::CHILDREN => array() + ); + $this->_current[] = $error; + + // NEW CODE BELOW ... + // Top-level errors are either: + // TOKEN type, if $value is set appropriately, or + // "syntax" type, if $value is null + $new_struct = new HTMLPurifier_ErrorStruct(); + $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN; + if ($token) { + $new_struct->value = clone $token; + } + if (is_int($line) && is_int($col)) { + if (isset($this->lines[$line][$col])) { + $struct = $this->lines[$line][$col]; + } else { + $struct = $this->lines[$line][$col] = $new_struct; + } + // These ksorts may present a performance problem + ksort($this->lines[$line], SORT_NUMERIC); + } else { + if (isset($this->lines[-1])) { + $struct = $this->lines[-1]; + } else { + $struct = $this->lines[-1] = $new_struct; + } + } + ksort($this->lines, SORT_NUMERIC); + + // Now, check if we need to operate on a lower structure + if (!empty($attr)) { + $struct = $struct->getChild(HTMLPurifier_ErrorStruct::ATTR, $attr); + if (!$struct->value) { + $struct->value = array($attr, 'PUT VALUE HERE'); + } + } + if (!empty($cssprop)) { + $struct = $struct->getChild(HTMLPurifier_ErrorStruct::CSSPROP, $cssprop); + if (!$struct->value) { + // if we tokenize CSS this might be a little more difficult to do + $struct->value = array($cssprop, 'PUT VALUE HERE'); + } + } + + // Ok, structs are all setup, now time to register the error + $struct->addError($severity, $msg); + } + + /** + * Retrieves raw error data for custom formatter to use + */ + public function getRaw() + { + return $this->errors; + } + + /** + * Default HTML formatting implementation for error messages + * @param HTMLPurifier_Config $config Configuration, vital for HTML output nature + * @param array $errors Errors array to display; used for recursion. + * @return string + */ + public function getHTMLFormatted($config, $errors = null) + { + $ret = array(); + + $this->generator = new HTMLPurifier_Generator($config, $this->context); + if ($errors === null) { + $errors = $this->errors; + } + + // 'At line' message needs to be removed + + // generation code for new structure goes here. It needs to be recursive. + foreach ($this->lines as $line => $col_array) { + if ($line == -1) { + continue; + } + foreach ($col_array as $col => $struct) { + $this->_renderStruct($ret, $struct, $line, $col); + } + } + if (isset($this->lines[-1])) { + $this->_renderStruct($ret, $this->lines[-1]); + } + + if (empty($errors)) { + return '

' . $this->locale->getMessage('ErrorCollector: No errors') . '

'; + } else { + return '
  • ' . implode('
  • ', $ret) . '
'; + } + + } + + private function _renderStruct(&$ret, $struct, $line = null, $col = null) + { + $stack = array($struct); + $context_stack = array(array()); + while ($current = array_pop($stack)) { + $context = array_pop($context_stack); + foreach ($current->errors as $error) { + list($severity, $msg) = $error; + $string = ''; + $string .= '
'; + // W3C uses an icon to indicate the severity of the error. + $error = $this->locale->getErrorName($severity); + $string .= "$error "; + if (!is_null($line) && !is_null($col)) { + $string .= "Line $line, Column $col: "; + } else { + $string .= 'End of Document: '; + } + $string .= '' . $this->generator->escape($msg) . ' '; + $string .= '
'; + // Here, have a marker for the character on the column appropriate. + // Be sure to clip extremely long lines. + //$string .= '
';
+                //$string .= '';
+                //$string .= '
'; + $ret[] = $string; + } + foreach ($current->children as $array) { + $context[] = $current; + $stack = array_merge($stack, array_reverse($array, true)); + for ($i = count($array); $i > 0; $i--) { + $context_stack[] = $context; + } + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php new file mode 100644 index 0000000..cf869d3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php @@ -0,0 +1,74 @@ +children[$type][$id])) { + $this->children[$type][$id] = new HTMLPurifier_ErrorStruct(); + $this->children[$type][$id]->type = $type; + } + return $this->children[$type][$id]; + } + + /** + * @param int $severity + * @param string $message + */ + public function addError($severity, $message) + { + $this->errors[] = array($severity, $message); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php new file mode 100644 index 0000000..be85b4c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php @@ -0,0 +1,12 @@ +preFilter, + * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter, + * 1->postFilter. + * + * @note Methods are not declared abstract as it is perfectly legitimate + * for an implementation not to want anything to happen on a step + */ + +class HTMLPurifier_Filter +{ + + /** + * Name of the filter for identification purposes. + * @type string + */ + public $name; + + /** + * Pre-processor function, handles HTML before HTML Purifier + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function preFilter($html, $config, $context) + { + return $html; + } + + /** + * Post-processor function, handles HTML after HTML Purifier + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function postFilter($html, $config, $context) + { + return $html; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php new file mode 100644 index 0000000..e7e3cac --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php @@ -0,0 +1,362 @@ + blocks from input HTML, cleans them up + * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks') + * so they can be used elsewhere in the document. + * + * @note + * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for + * sample usage. + * + * @note + * This filter can also be used on stylesheets not included in the + * document--something purists would probably prefer. Just directly + * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS() + */ +class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter +{ + /** + * @type string + */ + public $name = 'ExtractStyleBlocks'; + + /** + * @type array + */ + private $_styleMatches = array(); + + /** + * @type csstidy + */ + private $_tidy; + + /** + * @type HTMLPurifier_AttrDef_HTML_ID + */ + private $_id_attrdef; + + /** + * @type HTMLPurifier_AttrDef_CSS_Ident + */ + private $_class_attrdef; + + /** + * @type HTMLPurifier_AttrDef_Enum + */ + private $_enum_attrdef; + + /** + * @type HTMLPurifier_AttrDef_Enum + */ + private $_universal_attrdef; + + public function __construct() + { + $this->_tidy = new csstidy(); + $this->_tidy->set_cfg('lowercase_s', false); + $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true); + $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident(); + $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum( + array( + 'first-child', + 'link', + 'visited', + 'active', + 'hover', + 'focus' + ) + ); + $this->_universal_attrdef = new HTMLPurifier_AttrDef_Enum( + array( + 'initial', + 'inherit', + 'unset', + ) + ); + } + + /** + * Save the contents of CSS blocks to style matches + * @param array $matches preg_replace style $matches array + */ + protected function styleCallback($matches) + { + $this->_styleMatches[] = $matches[1]; + } + + /** + * Removes inline + // we must not grab foo in a font-family prop). + if ($config->get('Filter.ExtractStyleBlocks.Escaping')) { + $css = str_replace( + array('<', '>', '&'), + array('\3C ', '\3E ', '\26 '), + $css + ); + } + return $css; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php new file mode 100644 index 0000000..d86509c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php @@ -0,0 +1,65 @@ +]+>.+?' . + '(?:http:)?//www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?#s'; + $pre_replace = '\1'; + return preg_replace($pre_regex, $pre_replace, (string)$html); + } + + /** + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function postFilter($html, $config, $context) + { + $post_regex = '#((?:v|cp)/[A-Za-z0-9\-_=]+)#'; + return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), (string)$html); + } + + /** + * @param $url + * @return string + */ + protected function armorUrl($url) + { + return str_replace('--', '--', $url); + } + + /** + * @param array $matches + * @return string + */ + protected function postFilterCallback($matches) + { + $url = $this->armorUrl($matches[1]); + return '' . + '' . + '' . + ''; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php new file mode 100644 index 0000000..457fa90 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php @@ -0,0 +1,286 @@ + tags. + * @type bool + */ + private $_scriptFix = false; + + /** + * Cache of HTMLDefinition during HTML output to determine whether or + * not attributes should be minimized. + * @type HTMLPurifier_HTMLDefinition + */ + private $_def; + + /** + * Cache of %Output.SortAttr. + * @type bool + */ + private $_sortAttr; + + /** + * Cache of %Output.FlashCompat. + * @type bool + */ + private $_flashCompat; + + /** + * Cache of %Output.FixInnerHTML. + * @type bool + */ + private $_innerHTMLFix; + + /** + * Stack for keeping track of object information when outputting IE + * compatibility code. + * @type array + */ + private $_flashStack = array(); + + /** + * Configuration for the generator + * @type HTMLPurifier_Config + */ + protected $config; + + /** + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + */ + public function __construct($config, $context) + { + $this->config = $config; + $this->_scriptFix = $config->get('Output.CommentScriptContents'); + $this->_innerHTMLFix = $config->get('Output.FixInnerHTML'); + $this->_sortAttr = $config->get('Output.SortAttr'); + $this->_flashCompat = $config->get('Output.FlashCompat'); + $this->_def = $config->getHTMLDefinition(); + $this->_xhtml = $this->_def->doctype->xml; + } + + /** + * Generates HTML from an array of tokens. + * @param HTMLPurifier_Token[] $tokens Array of HTMLPurifier_Token + * @return string Generated HTML + */ + public function generateFromTokens($tokens) + { + if (!$tokens) { + return ''; + } + + // Basic algorithm + $html = ''; + for ($i = 0, $size = count($tokens); $i < $size; $i++) { + if ($this->_scriptFix && $tokens[$i]->name === 'script' + && $i + 2 < $size && $tokens[$i+2] instanceof HTMLPurifier_Token_End) { + // script special case + // the contents of the script block must be ONE token + // for this to work. + $html .= $this->generateFromToken($tokens[$i++]); + $html .= $this->generateScriptFromToken($tokens[$i++]); + } + $html .= $this->generateFromToken($tokens[$i]); + } + + // Tidy cleanup + if (extension_loaded('tidy') && $this->config->get('Output.TidyFormat')) { + $tidy = new Tidy; + $tidy->parseString( + $html, + array( + 'indent'=> true, + 'output-xhtml' => $this->_xhtml, + 'show-body-only' => true, + 'indent-spaces' => 2, + 'wrap' => 68, + ), + 'utf8' + ); + $tidy->cleanRepair(); + $html = (string) $tidy; // explicit cast necessary + } + + // Normalize newlines to system defined value + if ($this->config->get('Core.NormalizeNewlines')) { + $nl = $this->config->get('Output.Newline'); + if ($nl === null) { + $nl = PHP_EOL; + } + if ($nl !== "\n") { + $html = str_replace("\n", $nl, $html); + } + } + return $html; + } + + /** + * Generates HTML from a single token. + * @param HTMLPurifier_Token $token HTMLPurifier_Token object. + * @return string Generated HTML + */ + public function generateFromToken($token) + { + if (!$token instanceof HTMLPurifier_Token) { + trigger_error('Cannot generate HTML from non-HTMLPurifier_Token object', E_USER_WARNING); + return ''; + + } elseif ($token instanceof HTMLPurifier_Token_Start) { + $attr = $this->generateAttributes($token->attr, $token->name); + if ($this->_flashCompat) { + if ($token->name == "object") { + $flash = new stdClass(); + $flash->attr = $token->attr; + $flash->param = array(); + $this->_flashStack[] = $flash; + } + } + return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_End) { + $_extra = ''; + if ($this->_flashCompat) { + if ($token->name == "object" && !empty($this->_flashStack)) { + // doesn't do anything for now + } + } + return $_extra . 'name . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + if ($this->_flashCompat && $token->name == "param" && !empty($this->_flashStack)) { + $this->_flashStack[count($this->_flashStack)-1]->param[$token->attr['name']] = $token->attr['value']; + } + $attr = $this->generateAttributes($token->attr, $token->name); + return '<' . $token->name . ($attr ? ' ' : '') . $attr . + ( $this->_xhtml ? ' /': '' ) //
v.
+ . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_Text) { + return $this->escape($token->data, ENT_NOQUOTES); + + } elseif ($token instanceof HTMLPurifier_Token_Comment) { + return ''; + } else { + return ''; + + } + } + + /** + * Special case processor for the contents of script tags + * @param HTMLPurifier_Token $token HTMLPurifier_Token object. + * @return string + * @warning This runs into problems if there's already a literal + * --> somewhere inside the script contents. + */ + public function generateScriptFromToken($token) + { + if (!$token instanceof HTMLPurifier_Token_Text) { + return $this->generateFromToken($token); + } + // Thanks + $data = preg_replace('#//\s*$#', '', $token->data); + return ''; + } + + /** + * Generates attribute declarations from attribute array. + * @note This does not include the leading or trailing space. + * @param array $assoc_array_of_attributes Attribute array + * @param string $element Name of element attributes are for, used to check + * attribute minimization. + * @return string Generated HTML fragment for insertion. + */ + public function generateAttributes($assoc_array_of_attributes, $element = '') + { + $html = ''; + if ($this->_sortAttr) { + ksort($assoc_array_of_attributes); + } + foreach ($assoc_array_of_attributes as $key => $value) { + if (!$this->_xhtml) { + // Remove namespaced attributes + if (strpos($key, ':') !== false) { + continue; + } + // Check if we should minimize the attribute: val="val" -> val + if ($element && !empty($this->_def->info[$element]->attr[$key]->minimized)) { + $html .= $key . ' '; + continue; + } + } + // Workaround for Internet Explorer innerHTML bug. + // Essentially, Internet Explorer, when calculating + // innerHTML, omits quotes if there are no instances of + // angled brackets, quotes or spaces. However, when parsing + // HTML (for example, when you assign to innerHTML), it + // treats backticks as quotes. Thus, + // `` + // becomes + // `` + // becomes + // + // Fortunately, all we need to do is trigger an appropriate + // quoting style, which we do by adding an extra space. + // This also is consistent with the W3C spec, which states + // that user agents may ignore leading or trailing + // whitespace (in fact, most don't, at least for attributes + // like alt, but an extra space at the end is barely + // noticeable). Still, we have a configuration knob for + // this, since this transformation is not necessary if you + // don't process user input with innerHTML or you don't plan + // on supporting Internet Explorer. + if ($this->_innerHTMLFix) { + if (strpos($value, '`') !== false) { + // check if correct quoting style would not already be + // triggered + if (strcspn($value, '"\' <>') === strlen($value)) { + // protect! + $value .= ' '; + } + } + } + $html .= $key.'="'.$this->escape($value).'" '; + } + return rtrim($html); + } + + /** + * Escapes raw text data. + * @todo This really ought to be protected, but until we have a facility + * for properly generating HTML here w/o using tokens, it stays + * public. + * @param string $string String data to escape for HTML. + * @param int $quote Quoting style, like htmlspecialchars. ENT_NOQUOTES is + * permissible for non-attribute output. + * @return string escaped data. + */ + public function escape($string, $quote = null) + { + // Workaround for APC bug on Mac Leopard reported by sidepodcast + // http://htmlpurifier.org/phorum/read.php?3,4823,4846 + if ($quote === null) { + $quote = ENT_COMPAT; + } + return htmlspecialchars($string, $quote, 'UTF-8'); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php new file mode 100644 index 0000000..dc2c33c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php @@ -0,0 +1,488 @@ +getAnonymousModule(); + if (!isset($module->info[$element_name])) { + $element = $module->addBlankElement($element_name); + } else { + $element = $module->info[$element_name]; + } + $element->attr[$attr_name] = $def; + } + + /** + * Adds a custom element to your HTML definition + * @see HTMLPurifier_HTMLModule::addElement() for detailed + * parameter and return value descriptions. + */ + public function addElement($element_name, $type, $contents, $attr_collections, $attributes = array()) + { + $module = $this->getAnonymousModule(); + // assume that if the user is calling this, the element + // is safe. This may not be a good idea + $element = $module->addElement($element_name, $type, $contents, $attr_collections, $attributes); + return $element; + } + + /** + * Adds a blank element to your HTML definition, for overriding + * existing behavior + * @param string $element_name + * @return HTMLPurifier_ElementDef + * @see HTMLPurifier_HTMLModule::addBlankElement() for detailed + * parameter and return value descriptions. + */ + public function addBlankElement($element_name) + { + $module = $this->getAnonymousModule(); + $element = $module->addBlankElement($element_name); + return $element; + } + + /** + * Retrieves a reference to the anonymous module, so you can + * bust out advanced features without having to make your own + * module. + * @return HTMLPurifier_HTMLModule + */ + public function getAnonymousModule() + { + if (!$this->_anonModule) { + $this->_anonModule = new HTMLPurifier_HTMLModule(); + $this->_anonModule->name = 'Anonymous'; + } + return $this->_anonModule; + } + + private $_anonModule = null; + + // PUBLIC BUT INTERNAL VARIABLES -------------------------------------- + + /** + * @type string + */ + public $type = 'HTML'; + + /** + * @type HTMLPurifier_HTMLModuleManager + */ + public $manager; + + /** + * Performs low-cost, preliminary initialization. + */ + public function __construct() + { + $this->manager = new HTMLPurifier_HTMLModuleManager(); + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetup($config) + { + $this->processModules($config); + $this->setupConfigStuff($config); + unset($this->manager); + + // cleanup some of the element definitions + foreach ($this->info as $k => $v) { + unset($this->info[$k]->content_model); + unset($this->info[$k]->content_model_type); + } + } + + /** + * Extract out the information from the manager + * @param HTMLPurifier_Config $config + */ + protected function processModules($config) + { + if ($this->_anonModule) { + // for user specific changes + // this is late-loaded so we don't have to deal with PHP4 + // reference wonky-ness + $this->manager->addModule($this->_anonModule); + unset($this->_anonModule); + } + + $this->manager->setup($config); + $this->doctype = $this->manager->doctype; + + foreach ($this->manager->modules as $module) { + foreach ($module->info_tag_transform as $k => $v) { + if ($v === false) { + unset($this->info_tag_transform[$k]); + } else { + $this->info_tag_transform[$k] = $v; + } + } + foreach ($module->info_attr_transform_pre as $k => $v) { + if ($v === false) { + unset($this->info_attr_transform_pre[$k]); + } else { + $this->info_attr_transform_pre[$k] = $v; + } + } + foreach ($module->info_attr_transform_post as $k => $v) { + if ($v === false) { + unset($this->info_attr_transform_post[$k]); + } else { + $this->info_attr_transform_post[$k] = $v; + } + } + foreach ($module->info_injector as $k => $v) { + if ($v === false) { + unset($this->info_injector[$k]); + } else { + $this->info_injector[$k] = $v; + } + } + } + $this->info = $this->manager->getElements(); + $this->info_content_sets = $this->manager->contentSets->lookup; + } + + /** + * Sets up stuff based on config. We need a better way of doing this. + * @param HTMLPurifier_Config $config + */ + protected function setupConfigStuff($config) + { + $block_wrapper = $config->get('HTML.BlockWrapper'); + if (isset($this->info_content_sets['Block'][$block_wrapper])) { + $this->info_block_wrapper = $block_wrapper; + } else { + throw new Exception( + 'Cannot use non-block element as block wrapper' + ); + } + + $parent = $config->get('HTML.Parent'); + $def = $this->manager->getElement($parent, true); + if ($def) { + $this->info_parent = $parent; + $this->info_parent_def = $def; + } else { + throw new Exception('Cannot use unrecognized element as parent'); + } + + // support template text + $support = "(for information on implementing this, see the support forums) "; + + // setup allowed elements ----------------------------------------- + + $allowed_elements = $config->get('HTML.AllowedElements'); + $allowed_attributes = $config->get('HTML.AllowedAttributes'); // retrieve early + + if (!is_array($allowed_elements) && !is_array($allowed_attributes)) { + $allowed = $config->get('HTML.Allowed'); + if (is_string($allowed)) { + list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed); + } + } + + if (is_array($allowed_elements)) { + foreach ($this->info as $name => $d) { + if (!isset($allowed_elements[$name])) { + unset($this->info[$name]); + } + unset($allowed_elements[$name]); + } + // emit errors + foreach ($allowed_elements as $element => $d) { + $element = htmlspecialchars($element); // PHP doesn't escape errors, be careful! + trigger_error("Element '$element' is not supported $support", E_USER_WARNING); + } + } + + // setup allowed attributes --------------------------------------- + + $allowed_attributes_mutable = $allowed_attributes; // by copy! + if (is_array($allowed_attributes)) { + // This actually doesn't do anything, since we went away from + // global attributes. It's possible that userland code uses + // it, but HTMLModuleManager doesn't! + foreach ($this->info_global_attr as $attr => $x) { + $keys = array($attr, "*@$attr", "*.$attr"); + $delete = true; + foreach ($keys as $key) { + if ($delete && isset($allowed_attributes[$key])) { + $delete = false; + } + if (isset($allowed_attributes_mutable[$key])) { + unset($allowed_attributes_mutable[$key]); + } + } + if ($delete) { + unset($this->info_global_attr[$attr]); + } + } + + foreach ($this->info as $tag => $info) { + foreach ($info->attr as $attr => $x) { + $keys = array("$tag@$attr", $attr, "*@$attr", "$tag.$attr", "*.$attr"); + $delete = true; + foreach ($keys as $key) { + if ($delete && isset($allowed_attributes[$key])) { + $delete = false; + } + if (isset($allowed_attributes_mutable[$key])) { + unset($allowed_attributes_mutable[$key]); + } + } + if ($delete) { + if ($this->info[$tag]->attr[$attr]->required) { + trigger_error( + "Required attribute '$attr' in element '$tag' " . + "was not allowed, which means '$tag' will not be allowed either", + E_USER_WARNING + ); + } + unset($this->info[$tag]->attr[$attr]); + } + } + } + // emit errors + foreach ($allowed_attributes_mutable as $elattr => $d) { + $bits = preg_split('/[.@]/', $elattr, 2); + $c = count($bits); + switch ($c) { + case 2: + if ($bits[0] !== '*') { + $element = htmlspecialchars($bits[0]); + $attribute = htmlspecialchars($bits[1]); + if (!isset($this->info[$element])) { + trigger_error( + "Cannot allow attribute '$attribute' if element " . + "'$element' is not allowed/supported $support" + ); + } else { + trigger_error( + "Attribute '$attribute' in element '$element' not supported $support", + E_USER_WARNING + ); + } + break; + } + // otherwise fall through + case 1: + $attribute = htmlspecialchars($bits[0]); + trigger_error( + "Global attribute '$attribute' is not ". + "supported in any elements $support", + E_USER_WARNING + ); + break; + } + } + } + + // setup forbidden elements --------------------------------------- + + $forbidden_elements = $config->get('HTML.ForbiddenElements'); + $forbidden_attributes = $config->get('HTML.ForbiddenAttributes'); + + foreach ($this->info as $tag => $info) { + if (isset($forbidden_elements[$tag])) { + unset($this->info[$tag]); + continue; + } + foreach ($info->attr as $attr => $x) { + if (isset($forbidden_attributes["$tag@$attr"]) || + isset($forbidden_attributes["*@$attr"]) || + isset($forbidden_attributes[$attr]) + ) { + unset($this->info[$tag]->attr[$attr]); + continue; + } elseif (isset($forbidden_attributes["$tag.$attr"])) { // this segment might get removed eventually + // $tag.$attr are not user supplied, so no worries! + trigger_error( + "Error with $tag.$attr: tag.attr syntax not supported for " . + "HTML.ForbiddenAttributes; use tag@attr instead", + E_USER_WARNING + ); + } + } + } + foreach ($forbidden_attributes as $key => $v) { + if (strlen($key) < 2) { + continue; + } + if ($key[0] != '*') { + continue; + } + if ($key[1] == '.') { + trigger_error( + "Error with $key: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead", + E_USER_WARNING + ); + } + } + + // setup injectors ----------------------------------------------------- + foreach ($this->info_injector as $i => $injector) { + if ($injector->checkNeeded($config) !== false) { + // remove injector that does not have it's required + // elements/attributes present, and is thus not needed. + unset($this->info_injector[$i]); + } + } + } + + /** + * Parses a TinyMCE-flavored Allowed Elements and Attributes list into + * separate lists for processing. Format is element[attr1|attr2],element2... + * @warning Although it's largely drawn from TinyMCE's implementation, + * it is different, and you'll probably have to modify your lists + * @param array $list String list to parse + * @return array + * @todo Give this its own class, probably static interface + */ + public function parseTinyMCEAllowedList($list) + { + $list = str_replace(array(' ', "\t"), '', $list); + + $elements = array(); + $attributes = array(); + + $chunks = preg_split('/(,|[\n\r]+)/', $list); + foreach ($chunks as $chunk) { + if (empty($chunk)) { + continue; + } + // remove TinyMCE element control characters + if (!strpos($chunk, '[')) { + $element = $chunk; + $attr = false; + } else { + list($element, $attr) = explode('[', $chunk); + } + if ($element !== '*') { + $elements[$element] = true; + } + if (!$attr) { + continue; + } + $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ] + $attr = explode('|', $attr); + foreach ($attr as $key) { + $attributes["$element.$key"] = true; + } + } + return array($elements, $attributes); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php new file mode 100644 index 0000000..9dbb987 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php @@ -0,0 +1,285 @@ +info, since the object's data is only info, + * with extra behavior associated with it. + * @type array + */ + public $attr_collections = array(); + + /** + * Associative array of deprecated tag name to HTMLPurifier_TagTransform. + * @type array + */ + public $info_tag_transform = array(); + + /** + * List of HTMLPurifier_AttrTransform to be performed before validation. + * @type array + */ + public $info_attr_transform_pre = array(); + + /** + * List of HTMLPurifier_AttrTransform to be performed after validation. + * @type array + */ + public $info_attr_transform_post = array(); + + /** + * List of HTMLPurifier_Injector to be performed during well-formedness fixing. + * An injector will only be invoked if all of it's pre-requisites are met; + * if an injector fails setup, there will be no error; it will simply be + * silently disabled. + * @type array + */ + public $info_injector = array(); + + /** + * Boolean flag that indicates whether or not getChildDef is implemented. + * For optimization reasons: may save a call to a function. Be sure + * to set it if you do implement getChildDef(), otherwise it will have + * no effect! + * @type bool + */ + public $defines_child_def = false; + + /** + * Boolean flag whether or not this module is safe. If it is not safe, all + * of its members are unsafe. Modules are safe by default (this might be + * slightly dangerous, but it doesn't make much sense to force HTML Purifier, + * which is based off of safe HTML, to explicitly say, "This is safe," even + * though there are modules which are "unsafe") + * + * @type bool + * @note Previously, safety could be applied at an element level granularity. + * We've removed this ability, so in order to add "unsafe" elements + * or attributes, a dedicated module with this property set to false + * must be used. + */ + public $safe = true; + + /** + * Retrieves a proper HTMLPurifier_ChildDef subclass based on + * content_model and content_model_type member variables of + * the HTMLPurifier_ElementDef class. There is a similar function + * in HTMLPurifier_HTMLDefinition. + * @param HTMLPurifier_ElementDef $def + * @return HTMLPurifier_ChildDef subclass + */ + public function getChildDef($def) + { + return false; + } + + // -- Convenience ----------------------------------------------------- + + /** + * Convenience function that sets up a new element + * @param string $element Name of element to add + * @param string|bool $type What content set should element be registered to? + * Set as false to skip this step. + * @param string|HTMLPurifier_ChildDef $contents Allowed children in form of: + * "$content_model_type: $content_model" + * @param array|string $attr_includes What attribute collections to register to + * element? + * @param array $attr What unique attributes does the element define? + * @see HTMLPurifier_ElementDef:: for in-depth descriptions of these parameters. + * @return HTMLPurifier_ElementDef Created element definition object, so you + * can set advanced parameters + */ + public function addElement($element, $type, $contents, $attr_includes = array(), $attr = array()) + { + $this->elements[] = $element; + // parse content_model + list($content_model_type, $content_model) = $this->parseContents($contents); + // merge in attribute inclusions + $this->mergeInAttrIncludes($attr, $attr_includes); + // add element to content sets + if ($type) { + $this->addElementToContentSet($element, $type); + } + // create element + $this->info[$element] = HTMLPurifier_ElementDef::create( + $content_model, + $content_model_type, + $attr + ); + // literal object $contents means direct child manipulation + if (!is_string($contents)) { + $this->info[$element]->child = $contents; + } + return $this->info[$element]; + } + + /** + * Convenience function that creates a totally blank, non-standalone + * element. + * @param string $element Name of element to create + * @return HTMLPurifier_ElementDef Created element + */ + public function addBlankElement($element) + { + if (!isset($this->info[$element])) { + $this->elements[] = $element; + $this->info[$element] = new HTMLPurifier_ElementDef(); + $this->info[$element]->standalone = false; + } else { + trigger_error("Definition for $element already exists in module, cannot redefine"); + } + return $this->info[$element]; + } + + /** + * Convenience function that registers an element to a content set + * @param string $element Element to register + * @param string $type Name content set (warning: case sensitive, usually upper-case + * first letter) + */ + public function addElementToContentSet($element, $type) + { + if (!isset($this->content_sets[$type])) { + $this->content_sets[$type] = ''; + } else { + $this->content_sets[$type] .= ' | '; + } + $this->content_sets[$type] .= $element; + } + + /** + * Convenience function that transforms single-string contents + * into separate content model and content model type + * @param string $contents Allowed children in form of: + * "$content_model_type: $content_model" + * @return array + * @note If contents is an object, an array of two nulls will be + * returned, and the callee needs to take the original $contents + * and use it directly. + */ + public function parseContents($contents) + { + if (!is_string($contents)) { + return array(null, null); + } // defer + switch ($contents) { + // check for shorthand content model forms + case 'Empty': + return array('empty', ''); + case 'Inline': + return array('optional', 'Inline | #PCDATA'); + case 'Flow': + return array('optional', 'Flow | #PCDATA'); + } + list($content_model_type, $content_model) = explode(':', $contents); + $content_model_type = strtolower(trim($content_model_type)); + $content_model = trim($content_model); + return array($content_model_type, $content_model); + } + + /** + * Convenience function that merges a list of attribute includes into + * an attribute array. + * @param array $attr Reference to attr array to modify + * @param array $attr_includes Array of includes / string include to merge in + */ + public function mergeInAttrIncludes(&$attr, $attr_includes) + { + if (!is_array($attr_includes)) { + if (empty($attr_includes)) { + $attr_includes = array(); + } else { + $attr_includes = array($attr_includes); + } + } + $attr[0] = $attr_includes; + } + + /** + * Convenience function that generates a lookup table with boolean + * true as value. + * @param string $list List of values to turn into a lookup + * @note You can also pass an arbitrary number of arguments in + * place of the regular argument + * @return array array equivalent of list + */ + public function makeLookup($list) + { + $args = func_get_args(); + if (is_string($list)) { + $list = $args; + } + $ret = array(); + foreach ($list as $value) { + if (is_null($value)) { + continue; + } + $ret[$value] = true; + } + return $ret; + } + + /** + * Lazy load construction of the module after determining whether + * or not it's needed, and also when a finalized configuration object + * is available. + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php new file mode 100644 index 0000000..1e67c79 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php @@ -0,0 +1,44 @@ + array('dir' => false) + ); + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $bdo = $this->addElement( + 'bdo', + 'Inline', + 'Inline', + array('Core', 'Lang'), + array( + 'dir' => 'Enum#ltr,rtl', // required + // The Abstract Module specification has the attribute + // inclusions wrong for bdo: bdo allows Lang + ) + ); + $bdo->attr_transform_post[] = new HTMLPurifier_AttrTransform_BdoDir(); + + $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl'; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php new file mode 100644 index 0000000..7220c14 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php @@ -0,0 +1,32 @@ + array( + 0 => array('Style'), + // 'xml:space' => false, + 'class' => 'Class', + 'id' => 'ID', + 'title' => 'CDATA', + 'contenteditable' => 'ContentEditable', + ), + 'Lang' => array(), + 'I18N' => array( + 0 => array('Lang'), // proprietary, for xml:lang/lang + ), + 'Common' => array( + 0 => array('Core', 'I18N') + ) + ); +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php new file mode 100644 index 0000000..f02a563 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php @@ -0,0 +1,55 @@ + 'URI', + // 'datetime' => 'Datetime', // not implemented + ); + $this->addElement('del', 'Inline', $contents, 'Common', $attr); + $this->addElement('ins', 'Inline', $contents, 'Common', $attr); + } + + // HTML 4.01 specifies that ins/del must not contain block + // elements when used in an inline context, chameleon is + // a complicated workaround to achieve this effect + + // Inline context ! Block context (exclamation mark is + // separator, see getChildDef for parsing) + + /** + * @type bool + */ + public $defines_child_def = true; + + /** + * @param HTMLPurifier_ElementDef $def + * @return HTMLPurifier_ChildDef_Chameleon + */ + public function getChildDef($def) + { + if ($def->content_model_type != 'chameleon') { + return false; + } + $value = explode('!', $def->content_model); + return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php new file mode 100644 index 0000000..eb0edcf --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php @@ -0,0 +1,194 @@ + 'Form', + 'Inline' => 'Formctrl', + ); + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + if ($config->get('HTML.Forms')) { + $this->safe = true; + } + + $form = $this->addElement( + 'form', + 'Form', + 'Required: Heading | List | Block | fieldset', + 'Common', + array( + 'accept' => 'ContentTypes', + 'accept-charset' => 'Charsets', + 'action*' => 'URI', + 'method' => 'Enum#get,post', + // really ContentType, but these two are the only ones used today + 'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data', + ) + ); + $form->excludes = array('form' => true); + + $input = $this->addElement( + 'input', + 'Formctrl', + 'Empty', + 'Common', + array( + 'accept' => 'ContentTypes', + 'accesskey' => 'Character', + 'alt' => 'Text', + 'checked' => 'Bool#checked', + 'disabled' => 'Bool#disabled', + 'maxlength' => 'Number', + 'name' => 'CDATA', + 'readonly' => 'Bool#readonly', + 'size' => 'Number', + 'src' => 'URI#embedded', + 'tabindex' => 'Number', + 'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image', + 'value' => 'CDATA', + ) + ); + $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input(); + + $this->addElement( + 'select', + 'Formctrl', + 'Required: optgroup | option', + 'Common', + array( + 'disabled' => 'Bool#disabled', + 'multiple' => 'Bool#multiple', + 'name' => 'CDATA', + 'size' => 'Number', + 'tabindex' => 'Number', + ) + ); + + $this->addElement( + 'option', + false, + 'Optional: #PCDATA', + 'Common', + array( + 'disabled' => 'Bool#disabled', + 'label' => 'Text', + 'selected' => 'Bool#selected', + 'value' => 'CDATA', + ) + ); + // It's illegal for there to be more than one selected, but not + // be multiple. Also, no selected means undefined behavior. This might + // be difficult to implement; perhaps an injector, or a context variable. + + $textarea = $this->addElement( + 'textarea', + 'Formctrl', + 'Optional: #PCDATA', + 'Common', + array( + 'accesskey' => 'Character', + 'cols*' => 'Number', + 'disabled' => 'Bool#disabled', + 'name' => 'CDATA', + 'readonly' => 'Bool#readonly', + 'rows*' => 'Number', + 'tabindex' => 'Number', + ) + ); + $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea(); + + $button = $this->addElement( + 'button', + 'Formctrl', + 'Optional: #PCDATA | Heading | List | Block | Inline', + 'Common', + array( + 'accesskey' => 'Character', + 'disabled' => 'Bool#disabled', + 'name' => 'CDATA', + 'tabindex' => 'Number', + 'type' => 'Enum#button,submit,reset', + 'value' => 'CDATA', + ) + ); + + // For exclusions, ideally we'd specify content sets, not literal elements + $button->excludes = $this->makeLookup( + 'form', + 'fieldset', // Form + 'input', + 'select', + 'textarea', + 'label', + 'button', // Formctrl + 'a', // as per HTML 4.01 spec, this is omitted by modularization + 'isindex', + 'iframe' // legacy items + ); + + // Extra exclusion: img usemap="" is not permitted within this element. + // We'll omit this for now, since we don't have any good way of + // indicating it yet. + + // This is HIGHLY user-unfriendly; we need a custom child-def for this + $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common'); + + $label = $this->addElement( + 'label', + 'Formctrl', + 'Optional: #PCDATA | Inline', + 'Common', + array( + 'accesskey' => 'Character', + // 'for' => 'IDREF', // IDREF not implemented, cannot allow + ) + ); + $label->excludes = array('label' => true); + + $this->addElement( + 'legend', + false, + 'Optional: #PCDATA | Inline', + 'Common', + array( + 'accesskey' => 'Character', + ) + ); + + $this->addElement( + 'optgroup', + false, + 'Required: option', + 'Common', + array( + 'disabled' => 'Bool#disabled', + 'label*' => 'Text', + ) + ); + // Don't forget an injector for . This one's a little complex + // because it maps to multiple elements. + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php new file mode 100644 index 0000000..72d7a31 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php @@ -0,0 +1,40 @@ +addElement( + 'a', + 'Inline', + 'Inline', + 'Common', + array( + // 'accesskey' => 'Character', + // 'charset' => 'Charset', + 'href' => 'URI', + // 'hreflang' => 'LanguageCode', + 'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'), + 'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'), + // 'tabindex' => 'Number', + // 'type' => 'ContentType', + ) + ); + $a->formatting = true; + $a->excludes = array('a' => true); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php new file mode 100644 index 0000000..71dfc77 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php @@ -0,0 +1,57 @@ +get('HTML.SafeIframe')) { + $this->safe = true; + } + $attrs = array( + 'src' => 'URI#embedded', + 'width' => 'Length', + 'height' => 'Length', + 'name' => 'ID', + 'scrolling' => 'Enum#yes,no,auto', + 'frameborder' => 'Enum#0,1', + 'longdesc' => 'URI', + 'marginheight' => 'Pixels', + 'marginwidth' => 'Pixels', + ); + + if ($config->get('HTML.Trusted')) { + $attrs['allowfullscreen'] = 'Bool#allowfullscreen'; + } + + $this->addElement( + 'iframe', + 'Inline', + 'Flow', + 'Common', + $attrs + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php new file mode 100644 index 0000000..0f5fdb3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php @@ -0,0 +1,49 @@ +get('HTML.MaxImgLength'); + $img = $this->addElement( + 'img', + 'Inline', + 'Empty', + 'Common', + array( + 'alt*' => 'Text', + // According to the spec, it's Length, but percents can + // be abused, so we allow only Pixels. + 'height' => 'Pixels#' . $max, + 'width' => 'Pixels#' . $max, + 'longdesc' => 'URI', + 'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded + ) + ); + if ($max === null || $config->get('HTML.Trusted')) { + $img->attr['height'] = + $img->attr['width'] = 'Length'; + } + + // kind of strange, but splitting things up would be inefficient + $img->attr_transform_pre[] = + $img->attr_transform_post[] = + new HTMLPurifier_AttrTransform_ImgRequired(); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php new file mode 100644 index 0000000..86b5299 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php @@ -0,0 +1,186 @@ +addElement( + 'basefont', + 'Inline', + 'Empty', + null, + array( + 'color' => 'Color', + 'face' => 'Text', // extremely broad, we should + 'size' => 'Text', // tighten it + 'id' => 'ID' + ) + ); + $this->addElement('center', 'Block', 'Flow', 'Common'); + $this->addElement( + 'dir', + 'Block', + 'Required: li', + 'Common', + array( + 'compact' => 'Bool#compact' + ) + ); + $this->addElement( + 'font', + 'Inline', + 'Inline', + array('Core', 'I18N'), + array( + 'color' => 'Color', + 'face' => 'Text', // extremely broad, we should + 'size' => 'Text', // tighten it + ) + ); + $this->addElement( + 'menu', + 'Block', + 'Required: li', + 'Common', + array( + 'compact' => 'Bool#compact' + ) + ); + + $s = $this->addElement('s', 'Inline', 'Inline', 'Common'); + $s->formatting = true; + + $strike = $this->addElement('strike', 'Inline', 'Inline', 'Common'); + $strike->formatting = true; + + $u = $this->addElement('u', 'Inline', 'Inline', 'Common'); + $u->formatting = true; + + // setup modifications to old elements + + $align = 'Enum#left,right,center,justify'; + + $address = $this->addBlankElement('address'); + $address->content_model = 'Inline | #PCDATA | p'; + $address->content_model_type = 'optional'; + $address->child = false; + + $blockquote = $this->addBlankElement('blockquote'); + $blockquote->content_model = 'Flow | #PCDATA'; + $blockquote->content_model_type = 'optional'; + $blockquote->child = false; + + $br = $this->addBlankElement('br'); + $br->attr['clear'] = 'Enum#left,all,right,none'; + + $caption = $this->addBlankElement('caption'); + $caption->attr['align'] = 'Enum#top,bottom,left,right'; + + $div = $this->addBlankElement('div'); + $div->attr['align'] = $align; + + $dl = $this->addBlankElement('dl'); + $dl->attr['compact'] = 'Bool#compact'; + + for ($i = 1; $i <= 6; $i++) { + $h = $this->addBlankElement("h$i"); + $h->attr['align'] = $align; + } + + $hr = $this->addBlankElement('hr'); + $hr->attr['align'] = $align; + $hr->attr['noshade'] = 'Bool#noshade'; + $hr->attr['size'] = 'Pixels'; + $hr->attr['width'] = 'Length'; + + $img = $this->addBlankElement('img'); + $img->attr['align'] = 'IAlign'; + $img->attr['border'] = 'Pixels'; + $img->attr['hspace'] = 'Pixels'; + $img->attr['vspace'] = 'Pixels'; + + // figure out this integer business + + $li = $this->addBlankElement('li'); + $li->attr['value'] = new HTMLPurifier_AttrDef_Integer(); + $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle'; + + $ol = $this->addBlankElement('ol'); + $ol->attr['compact'] = 'Bool#compact'; + $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer(); + $ol->attr['type'] = 'Enum#s:1,i,I,a,A'; + + $p = $this->addBlankElement('p'); + $p->attr['align'] = $align; + + $pre = $this->addBlankElement('pre'); + $pre->attr['width'] = 'Number'; + + // script omitted + + $table = $this->addBlankElement('table'); + $table->attr['align'] = 'Enum#left,center,right'; + $table->attr['bgcolor'] = 'Color'; + + $tr = $this->addBlankElement('tr'); + $tr->attr['bgcolor'] = 'Color'; + + $th = $this->addBlankElement('th'); + $th->attr['bgcolor'] = 'Color'; + $th->attr['height'] = 'Length'; + $th->attr['nowrap'] = 'Bool#nowrap'; + $th->attr['width'] = 'Length'; + + $td = $this->addBlankElement('td'); + $td->attr['bgcolor'] = 'Color'; + $td->attr['height'] = 'Length'; + $td->attr['nowrap'] = 'Bool#nowrap'; + $td->attr['width'] = 'Length'; + + $ul = $this->addBlankElement('ul'); + $ul->attr['compact'] = 'Bool#compact'; + $ul->attr['type'] = 'Enum#square,disc,circle'; + + // "safe" modifications to "unsafe" elements + // WARNING: If you want to add support for an unsafe, legacy + // attribute, make a new TrustedLegacy module with the trusted + // bit set appropriately + + $form = $this->addBlankElement('form'); + $form->content_model = 'Flow | #PCDATA'; + $form->content_model_type = 'optional'; + $form->attr['target'] = 'FrameTarget'; + + $input = $this->addBlankElement('input'); + $input->attr['align'] = 'IAlign'; + + $legend = $this->addBlankElement('legend'); + $legend->attr['align'] = 'LAlign'; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php new file mode 100644 index 0000000..7a20ff7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php @@ -0,0 +1,51 @@ + 'List'); + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $ol = $this->addElement('ol', 'List', new HTMLPurifier_ChildDef_List(), 'Common'); + $ul = $this->addElement('ul', 'List', new HTMLPurifier_ChildDef_List(), 'Common'); + // XXX The wrap attribute is handled by MakeWellFormed. This is all + // quite unsatisfactory, because we generated this + // *specifically* for lists, and now a big chunk of the handling + // is done properly by the List ChildDef. So actually, we just + // want enough information to make autoclosing work properly, + // and then hand off the tricky stuff to the ChildDef. + $ol->wrap = 'li'; + $ul->wrap = 'li'; + $this->addElement('dl', 'List', 'Required: dt | dd', 'Common'); + + $this->addElement('li', false, 'Flow', 'Common'); + + $this->addElement('dd', false, 'Flow', 'Common'); + $this->addElement('dt', false, 'Inline', 'Common'); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php new file mode 100644 index 0000000..60c0545 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php @@ -0,0 +1,26 @@ +addBlankElement($name); + $element->attr['name'] = 'CDATA'; + if (!$config->get('HTML.Attr.Name.UseCDATA')) { + $element->attr_transform_post[] = new HTMLPurifier_AttrTransform_NameSync(); + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php new file mode 100644 index 0000000..dc9410a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php @@ -0,0 +1,25 @@ +addBlankElement('a'); + $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_Nofollow(); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php new file mode 100644 index 0000000..da72225 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php @@ -0,0 +1,20 @@ + array( + 'lang' => 'LanguageCode', + ) + ); +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php new file mode 100644 index 0000000..2f9efc5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php @@ -0,0 +1,62 @@ + to cater to legacy browsers: this + * module does not allow this sort of behavior + */ +class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule +{ + /** + * @type string + */ + public $name = 'Object'; + + /** + * @type bool + */ + public $safe = false; + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $this->addElement( + 'object', + 'Inline', + 'Optional: #PCDATA | Flow | param', + 'Common', + array( + 'archive' => 'URI', + 'classid' => 'URI', + 'codebase' => 'URI', + 'codetype' => 'Text', + 'data' => 'URI', + 'declare' => 'Bool#declare', + 'height' => 'Length', + 'name' => 'CDATA', + 'standby' => 'Text', + 'tabindex' => 'Number', + 'type' => 'ContentType', + 'width' => 'Length' + ) + ); + + $this->addElement( + 'param', + false, + 'Empty', + null, + array( + 'id' => 'ID', + 'name*' => 'Text', + 'type' => 'Text', + 'value' => 'Text', + 'valuetype' => 'Enum#data,ref,object' + ) + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php new file mode 100644 index 0000000..6458ce9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php @@ -0,0 +1,42 @@ +addElement('hr', 'Block', 'Empty', 'Common'); + $this->addElement('sub', 'Inline', 'Inline', 'Common'); + $this->addElement('sup', 'Inline', 'Inline', 'Common'); + $b = $this->addElement('b', 'Inline', 'Inline', 'Common'); + $b->formatting = true; + $big = $this->addElement('big', 'Inline', 'Inline', 'Common'); + $big->formatting = true; + $i = $this->addElement('i', 'Inline', 'Inline', 'Common'); + $i->formatting = true; + $small = $this->addElement('small', 'Inline', 'Inline', 'Common'); + $small->formatting = true; + $tt = $this->addElement('tt', 'Inline', 'Inline', 'Common'); + $tt->formatting = true; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php new file mode 100644 index 0000000..5ee3c8e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php @@ -0,0 +1,40 @@ +addElement( + 'marquee', + 'Inline', + 'Flow', + 'Common', + array( + 'direction' => 'Enum#left,right,up,down', + 'behavior' => 'Enum#alternate', + 'width' => 'Length', + 'height' => 'Length', + 'scrolldelay' => 'Number', + 'scrollamount' => 'Number', + 'loop' => 'Number', + 'bgcolor' => 'Color', + 'hspace' => 'Pixels', + 'vspace' => 'Pixels', + ) + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php new file mode 100644 index 0000000..d1afde0 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php @@ -0,0 +1,36 @@ +addElement( + 'ruby', + 'Inline', + 'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))', + 'Common' + ); + $this->addElement('rbc', false, 'Required: rb', 'Common'); + $this->addElement('rtc', false, 'Required: rt', 'Common'); + $rb = $this->addElement('rb', false, 'Inline', 'Common'); + $rb->excludes = array('ruby' => true); + $rt = $this->addElement('rt', false, 'Inline', 'Common', array('rbspan' => 'Number')); + $rt->excludes = array('ruby' => true); + $this->addElement('rp', false, 'Optional: #PCDATA', 'Common'); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php new file mode 100644 index 0000000..04e6689 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php @@ -0,0 +1,40 @@ +get('HTML.MaxImgLength'); + $embed = $this->addElement( + 'embed', + 'Inline', + 'Empty', + 'Common', + array( + 'src*' => 'URI#embedded', + 'type' => 'Enum#application/x-shockwave-flash', + 'width' => 'Pixels#' . $max, + 'height' => 'Pixels#' . $max, + 'allowscriptaccess' => 'Enum#never', + 'allownetworking' => 'Enum#internal', + 'flashvars' => 'Text', + 'wmode' => 'Enum#window,transparent,opaque', + 'name' => 'ID', + ) + ); + $embed->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeEmbed(); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php new file mode 100644 index 0000000..1297f80 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php @@ -0,0 +1,62 @@ +get('HTML.MaxImgLength'); + $object = $this->addElement( + 'object', + 'Inline', + 'Optional: param | Flow | #PCDATA', + 'Common', + array( + // While technically not required by the spec, we're forcing + // it to this value. + 'type' => 'Enum#application/x-shockwave-flash', + 'width' => 'Pixels#' . $max, + 'height' => 'Pixels#' . $max, + 'data' => 'URI#embedded', + 'codebase' => new HTMLPurifier_AttrDef_Enum( + array( + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0' + ) + ), + ) + ); + $object->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeObject(); + + $param = $this->addElement( + 'param', + false, + 'Empty', + false, + array( + 'id' => 'ID', + 'name*' => 'Text', + 'value' => 'Text' + ) + ); + $param->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeParam(); + $this->info_injector[] = 'SafeObject'; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php new file mode 100644 index 0000000..aea7584 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php @@ -0,0 +1,40 @@ +get('HTML.SafeScripting'); + $script = $this->addElement( + 'script', + 'Inline', + 'Optional:', // Not `Empty` to not allow to autoclose the #i', '', $html); + } + + return $html; + } + + /** + * Takes a string of HTML (fragment or document) and returns the content + * @todo Consider making protected + */ + public function extractBody($html) + { + $matches = array(); + $result = preg_match('|(.*?)]*>(.*)|is', $html, $matches); + if ($result) { + // Make sure it's not in a comment + $comment_start = strrpos($matches[1], ''); + if ($comment_start === false || + ($comment_end !== false && $comment_end > $comment_start)) { + return $matches[2]; + } + } + return $html; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php new file mode 100644 index 0000000..de79aaa --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php @@ -0,0 +1,411 @@ +factory = new HTMLPurifier_TokenFactory(); + } + + /** + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_Token[] + */ + public function tokenizeHTML($html, $config, $context) + { + $html = $this->normalize($html, $config, $context); + + // attempt to armor stray angled brackets that cannot possibly + // form tags and thus are probably being used as emoticons + if ($config->get('Core.AggressivelyFixLt')) { + $html = $this->aggressivelyFixLt($html); + } + + // preprocess html, essential for UTF-8 + $html = $this->wrapHTML($html, $config, $context); + + $doc = new DOMDocument(); + $doc->encoding = 'UTF-8'; // theoretically, the above has this covered + + $options = 0; + if ($config->get('Core.AllowParseManyTags') && defined('LIBXML_PARSEHUGE')) { + $options |= LIBXML_PARSEHUGE; + } + if ($config->get('Core.RemoveBlanks') && defined('LIBXML_NOBLANKS')) { + $options |= LIBXML_NOBLANKS; + } + + set_error_handler(array($this, 'muteErrorHandler')); + // loadHTML() fails on PHP 5.3 when second parameter is given + if ($options) { + $doc->loadHTML($html, $options); + } else { + $doc->loadHTML($html); + } + restore_error_handler(); + + $body = $doc->getElementsByTagName('html')->item(0)-> // + getElementsByTagName('body')->item(0); // + + $div = $body->getElementsByTagName('div')->item(0); //
+ $tokens = array(); + $this->tokenizeDOM($div, $tokens, $config); + // If the div has a sibling, that means we tripped across + // a premature
tag. So remove the div we parsed, + // and then tokenize the rest of body. We can't tokenize + // the sibling directly as we'll lose the tags in that case. + if ($div->nextSibling) { + $body->removeChild($div); + $this->tokenizeDOM($body, $tokens, $config); + } + return $tokens; + } + + /** + * Iterative function that tokenizes a node, putting it into an accumulator. + * To iterate is human, to recurse divine - L. Peter Deutsch + * @param DOMNode $node DOMNode to be tokenized. + * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens. + */ + protected function tokenizeDOM($node, &$tokens, $config) + { + $level = 0; + $nodes = array($level => new HTMLPurifier_Queue(array($node))); + $closingNodes = array(); + do { + while (!$nodes[$level]->isEmpty()) { + $node = $nodes[$level]->shift(); // FIFO + $collect = $level > 0 ? true : false; + $needEndingTag = $this->createStartNode($node, $tokens, $collect, $config); + if ($needEndingTag) { + $closingNodes[$level][] = $node; + } + if ($node->childNodes && $node->childNodes->length) { + $level++; + $nodes[$level] = new HTMLPurifier_Queue(); + foreach ($node->childNodes as $childNode) { + $nodes[$level]->push($childNode); + } + } + } + $level--; + if ($level && isset($closingNodes[$level])) { + while ($node = array_pop($closingNodes[$level])) { + $this->createEndNode($node, $tokens); + } + } + } while ($level > 0); + } + + /** + * Portably retrieve the tag name of a node; deals with older versions + * of libxml like 2.7.6 + * @param DOMNode $node + */ + protected function getTagName($node) + { + if (isset($node->tagName)) { + return $node->tagName; + } else if (isset($node->nodeName)) { + return $node->nodeName; + } else if (isset($node->localName)) { + return $node->localName; + } + return null; + } + + /** + * Portably retrieve the data of a node; deals with older versions + * of libxml like 2.7.6 + * @param DOMNode $node + */ + protected function getData($node) + { + if (isset($node->data)) { + return $node->data; + } else if (isset($node->nodeValue)) { + return $node->nodeValue; + } else if (isset($node->textContent)) { + return $node->textContent; + } + return null; + } + + + /** + * @param DOMNode $node DOMNode to be tokenized. + * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens. + * @param bool $collect Says whether or start and close are collected, set to + * false at first recursion because it's the implicit DIV + * tag you're dealing with. + * @return bool if the token needs an endtoken + * @todo data and tagName properties don't seem to exist in DOMNode? + */ + protected function createStartNode($node, &$tokens, $collect, $config) + { + // intercept non element nodes. WE MUST catch all of them, + // but we're not getting the character reference nodes because + // those should have been preprocessed + if ($node->nodeType === XML_TEXT_NODE) { + $data = $this->getData($node); // Handle variable data property + if ($data !== null) { + $tokens[] = $this->factory->createText($data); + } + return false; + } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) { + // undo libxml's special treatment of )#si', + array($this, 'scriptCallback'), + $html + ); + } + + $html = $this->normalize($html, $config, $context); + + $cursor = 0; // our location in the text + $inside_tag = false; // whether or not we're parsing the inside of a tag + $array = array(); // result array + + // This is also treated to mean maintain *column* numbers too + $maintain_line_numbers = $config->get('Core.MaintainLineNumbers'); + + if ($maintain_line_numbers === null) { + // automatically determine line numbering by checking + // if error collection is on + $maintain_line_numbers = $config->get('Core.CollectErrors'); + } + + if ($maintain_line_numbers) { + $current_line = 1; + $current_col = 0; + $length = strlen($html); + } else { + $current_line = false; + $current_col = false; + $length = false; + } + $context->register('CurrentLine', $current_line); + $context->register('CurrentCol', $current_col); + $nl = "\n"; + // how often to manually recalculate. This will ALWAYS be right, + // but it's pretty wasteful. Set to 0 to turn off + $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval'); + + $e = false; + if ($config->get('Core.CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + // for testing synchronization + $loops = 0; + + while (++$loops) { + // $cursor is either at the start of a token, or inside of + // a tag (i.e. there was a < immediately before it), as indicated + // by $inside_tag + + if ($maintain_line_numbers) { + // $rcursor, however, is always at the start of a token. + $rcursor = $cursor - (int)$inside_tag; + + // Column number is cheap, so we calculate it every round. + // We're interested at the *end* of the newline string, so + // we need to add strlen($nl) == 1 to $nl_pos before subtracting it + // from our "rcursor" position. + $nl_pos = strrpos($html, $nl, $rcursor - $length); + $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1); + + // recalculate lines + if ($synchronize_interval && // synchronization is on + $cursor > 0 && // cursor is further than zero + $loops % $synchronize_interval === 0) { // time to synchronize! + $current_line = 1 + substr_count($html, $nl, 0, $cursor); + } + } + + $position_next_lt = strpos($html, '<', $cursor); + $position_next_gt = strpos($html, '>', $cursor); + + // triggers on "asdf" but not "asdf " + // special case to set up context + if ($position_next_lt === $cursor) { + $inside_tag = true; + $cursor++; + } + + if (!$inside_tag && $position_next_lt !== false) { + // We are not inside tag and there still is another tag to parse + $token = new + HTMLPurifier_Token_Text( + $this->parseText( + substr( + $html, + $cursor, + $position_next_lt - $cursor + ), $config + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += substr_count($html, $nl, $cursor, $position_next_lt - $cursor); + } + $array[] = $token; + $cursor = $position_next_lt + 1; + $inside_tag = true; + continue; + } elseif (!$inside_tag) { + // We are not inside tag but there are no more tags + // If we're already at the end, break + if ($cursor === strlen($html)) { + break; + } + // Create Text of rest of string + $token = new + HTMLPurifier_Token_Text( + $this->parseText( + substr( + $html, + $cursor + ), $config + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + } + $array[] = $token; + break; + } elseif ($inside_tag && $position_next_gt !== false) { + // We are in tag and it is well formed + // Grab the internals of the tag + $strlen_segment = $position_next_gt - $cursor; + + if ($strlen_segment < 1) { + // there's nothing to process! + $token = new HTMLPurifier_Token_Text('<'); + $cursor++; + continue; + } + + $segment = substr($html, $cursor, $strlen_segment); + + if ($segment === false) { + // somehow, we attempted to access beyond the end of + // the string, defense-in-depth, reported by Nate Abele + break; + } + + // Check if it's a comment + if (substr($segment, 0, 3) === '!--') { + // re-determine segment length, looking for --> + $position_comment_end = strpos($html, '-->', $cursor); + if ($position_comment_end === false) { + // uh oh, we have a comment that extends to + // infinity. Can't be helped: set comment + // end position to end of string + if ($e) { + $e->send(E_WARNING, 'Lexer: Unclosed comment'); + } + $position_comment_end = strlen($html); + $end = true; + } else { + $end = false; + } + $strlen_segment = $position_comment_end - $cursor; + $segment = substr($html, $cursor, $strlen_segment); + $token = new + HTMLPurifier_Token_Comment( + substr( + $segment, + 3, + $strlen_segment - 3 + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += substr_count($html, $nl, $cursor, $strlen_segment); + } + $array[] = $token; + $cursor = $end ? $position_comment_end : $position_comment_end + 3; + $inside_tag = false; + continue; + } + + // Check if it's an end tag + $is_end_tag = (strpos($segment, '/') === 0); + if ($is_end_tag) { + $type = substr($segment, 1); + $token = new HTMLPurifier_Token_End($type); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += substr_count($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + $cursor = $position_next_gt + 1; + continue; + } + + // Check leading character is alnum, if not, we may + // have accidently grabbed an emoticon. Translate into + // text and go our merry way + if (!ctype_alpha($segment[0])) { + // XML: $segment[0] !== '_' && $segment[0] !== ':' + if ($e) { + $e->send(E_NOTICE, 'Lexer: Unescaped lt'); + } + $token = new HTMLPurifier_Token_Text('<'); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += substr_count($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + continue; + } + + // Check if it is explicitly self closing, if so, remove + // trailing slash. Remember, we could have a tag like
, so + // any later token processing scripts must convert improperly + // classified EmptyTags from StartTags. + $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1); + if ($is_self_closing) { + $strlen_segment--; + $segment = substr($segment, 0, $strlen_segment); + } + + // Check if there are any attributes + $position_first_space = strcspn($segment, $this->_whitespace); + + if ($position_first_space >= $strlen_segment) { + if ($is_self_closing) { + $token = new HTMLPurifier_Token_Empty($segment); + } else { + $token = new HTMLPurifier_Token_Start($segment); + } + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += substr_count($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + $cursor = $position_next_gt + 1; + continue; + } + + // Grab out all the data + $type = substr($segment, 0, $position_first_space); + $attribute_string = + trim( + substr( + $segment, + $position_first_space + ) + ); + if ($attribute_string) { + $attr = $this->parseAttributeString( + $attribute_string, + $config, + $context + ); + } else { + $attr = array(); + } + + if ($is_self_closing) { + $token = new HTMLPurifier_Token_Empty($type, $attr); + } else { + $token = new HTMLPurifier_Token_Start($type, $attr); + } + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += substr_count($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $cursor = $position_next_gt + 1; + $inside_tag = false; + continue; + } else { + // inside tag, but there's no ending > sign + if ($e) { + $e->send(E_WARNING, 'Lexer: Missing gt'); + } + $token = new + HTMLPurifier_Token_Text( + '<' . + $this->parseText( + substr($html, $cursor), $config + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + } + // no cursor scroll? Hmm... + $array[] = $token; + break; + } + break; + } + + $context->destroy('CurrentLine'); + $context->destroy('CurrentCol'); + return $array; + } + + /** + * Takes the inside of an HTML tag and makes an assoc array of attributes. + * + * @param string $string Inside of tag excluding name. + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array Assoc array of attributes. + */ + public function parseAttributeString($string, $config, $context) + { + $string = (string)$string; // quick typecast + + if ($string == '') { + return array(); + } // no attributes + + $e = false; + if ($config->get('Core.CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + // let's see if we can abort as quickly as possible + // one equal sign, no spaces => one attribute + $num_equal = substr_count($string, '='); + $has_space = strpos($string, ' '); + if ($num_equal === 0 && !$has_space) { + // bool attribute + return array($string => $string); + } elseif ($num_equal === 1 && !$has_space) { + // only one attribute + list($key, $quoted_value) = explode('=', $string); + $quoted_value = trim($quoted_value); + if (!$key) { + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + return array(); + } + if (!$quoted_value) { + return array($key => ''); + } + $first_char = @$quoted_value[0]; + $last_char = @$quoted_value[strlen($quoted_value) - 1]; + + $same_quote = ($first_char == $last_char); + $open_quote = ($first_char == '"' || $first_char == "'"); + + if ($same_quote && $open_quote) { + // well behaved + $value = substr($quoted_value, 1, strlen($quoted_value) - 2); + } else { + // not well behaved + if ($open_quote) { + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing end quote'); + } + $value = substr($quoted_value, 1); + } else { + $value = $quoted_value; + } + } + if ($value === false) { + $value = ''; + } + return array($key => $this->parseAttr($value, $config)); + } + + // setup loop environment + $array = array(); // return assoc array of attributes + $cursor = 0; // current position in string (moves forward) + $size = strlen($string); // size of the string (stays the same) + + // if we have unquoted attributes, the parser expects a terminating + // space, so let's guarantee that there's always a terminating space. + $string .= ' '; + + $old_cursor = -1; + while ($cursor < $size) { + if ($old_cursor >= $cursor) { + throw new Exception("Infinite loop detected"); + } + $old_cursor = $cursor; + + $cursor += ($value = strspn($string, $this->_whitespace, $cursor)); + // grab the key + + $key_begin = $cursor; //we're currently at the start of the key + + // scroll past all characters that are the key (not whitespace or =) + $cursor += strcspn($string, $this->_whitespace . '=', $cursor); + + $key_end = $cursor; // now at the end of the key + + $key = substr($string, $key_begin, $key_end - $key_begin); + + if (!$key) { + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop + continue; // empty key + } + + // scroll past all whitespace + $cursor += strspn($string, $this->_whitespace, $cursor); + + if ($cursor >= $size) { + $array[$key] = $key; + break; + } + + // if the next character is an equal sign, we've got a regular + // pair, otherwise, it's a bool attribute + $first_char = @$string[$cursor]; + + if ($first_char == '=') { + // key="value" + + $cursor++; + $cursor += strspn($string, $this->_whitespace, $cursor); + + if ($cursor === false) { + $array[$key] = ''; + break; + } + + // we might be in front of a quote right now + + $char = @$string[$cursor]; + + if ($char == '"' || $char == "'") { + // it's quoted, end bound is $char + $cursor++; + $value_begin = $cursor; + $cursor = strpos($string, $char, $cursor); + $value_end = $cursor; + } else { + // it's not quoted, end bound is whitespace + $value_begin = $cursor; + $cursor += strcspn($string, $this->_whitespace, $cursor); + $value_end = $cursor; + } + + // we reached a premature end + if ($cursor === false) { + $cursor = $size; + $value_end = $cursor; + } + + $value = substr($string, $value_begin, $value_end - $value_begin); + if ($value === false) { + $value = ''; + } + $array[$key] = $this->parseAttr($value, $config); + $cursor++; + } else { + // boolattr + if ($key !== '') { + $array[$key] = $key; + } else { + // purely theoretical + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + } + } + } + return $array; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php new file mode 100644 index 0000000..9390279 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php @@ -0,0 +1,4788 @@ +normalize($html, $config, $context); + $new_html = $this->wrapHTML($new_html, $config, $context, false /* no div */); + try { + $parser = new HTML5($new_html); + $doc = $parser->save(); + } catch (DOMException $e) { + // Uh oh, it failed. Punt to DirectLex. + $lexer = new HTMLPurifier_Lexer_DirectLex(); + $context->register('PH5PError', $e); // save the error, so we can detect it + return $lexer->tokenizeHTML($html, $config, $context); // use original HTML + } + $tokens = array(); + $this->tokenizeDOM( + $doc->getElementsByTagName('html')->item(0)-> // + getElementsByTagName('body')->item(0) // + , + $tokens, $config + ); + return $tokens; + } +} + +/* + +Copyright 2007 Jeroen van der Meer + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +class HTML5 +{ + private $data; + private $char; + private $EOF; + private $state; + private $tree; + private $token; + private $content_model; + private $escape = false; + private $entities = array( + 'AElig;', + 'AElig', + 'AMP;', + 'AMP', + 'Aacute;', + 'Aacute', + 'Acirc;', + 'Acirc', + 'Agrave;', + 'Agrave', + 'Alpha;', + 'Aring;', + 'Aring', + 'Atilde;', + 'Atilde', + 'Auml;', + 'Auml', + 'Beta;', + 'COPY;', + 'COPY', + 'Ccedil;', + 'Ccedil', + 'Chi;', + 'Dagger;', + 'Delta;', + 'ETH;', + 'ETH', + 'Eacute;', + 'Eacute', + 'Ecirc;', + 'Ecirc', + 'Egrave;', + 'Egrave', + 'Epsilon;', + 'Eta;', + 'Euml;', + 'Euml', + 'GT;', + 'GT', + 'Gamma;', + 'Iacute;', + 'Iacute', + 'Icirc;', + 'Icirc', + 'Igrave;', + 'Igrave', + 'Iota;', + 'Iuml;', + 'Iuml', + 'Kappa;', + 'LT;', + 'LT', + 'Lambda;', + 'Mu;', + 'Ntilde;', + 'Ntilde', + 'Nu;', + 'OElig;', + 'Oacute;', + 'Oacute', + 'Ocirc;', + 'Ocirc', + 'Ograve;', + 'Ograve', + 'Omega;', + 'Omicron;', + 'Oslash;', + 'Oslash', + 'Otilde;', + 'Otilde', + 'Ouml;', + 'Ouml', + 'Phi;', + 'Pi;', + 'Prime;', + 'Psi;', + 'QUOT;', + 'QUOT', + 'REG;', + 'REG', + 'Rho;', + 'Scaron;', + 'Sigma;', + 'THORN;', + 'THORN', + 'TRADE;', + 'Tau;', + 'Theta;', + 'Uacute;', + 'Uacute', + 'Ucirc;', + 'Ucirc', + 'Ugrave;', + 'Ugrave', + 'Upsilon;', + 'Uuml;', + 'Uuml', + 'Xi;', + 'Yacute;', + 'Yacute', + 'Yuml;', + 'Zeta;', + 'aacute;', + 'aacute', + 'acirc;', + 'acirc', + 'acute;', + 'acute', + 'aelig;', + 'aelig', + 'agrave;', + 'agrave', + 'alefsym;', + 'alpha;', + 'amp;', + 'amp', + 'and;', + 'ang;', + 'apos;', + 'aring;', + 'aring', + 'asymp;', + 'atilde;', + 'atilde', + 'auml;', + 'auml', + 'bdquo;', + 'beta;', + 'brvbar;', + 'brvbar', + 'bull;', + 'cap;', + 'ccedil;', + 'ccedil', + 'cedil;', + 'cedil', + 'cent;', + 'cent', + 'chi;', + 'circ;', + 'clubs;', + 'cong;', + 'copy;', + 'copy', + 'crarr;', + 'cup;', + 'curren;', + 'curren', + 'dArr;', + 'dagger;', + 'darr;', + 'deg;', + 'deg', + 'delta;', + 'diams;', + 'divide;', + 'divide', + 'eacute;', + 'eacute', + 'ecirc;', + 'ecirc', + 'egrave;', + 'egrave', + 'empty;', + 'emsp;', + 'ensp;', + 'epsilon;', + 'equiv;', + 'eta;', + 'eth;', + 'eth', + 'euml;', + 'euml', + 'euro;', + 'exist;', + 'fnof;', + 'forall;', + 'frac12;', + 'frac12', + 'frac14;', + 'frac14', + 'frac34;', + 'frac34', + 'frasl;', + 'gamma;', + 'ge;', + 'gt;', + 'gt', + 'hArr;', + 'harr;', + 'hearts;', + 'hellip;', + 'iacute;', + 'iacute', + 'icirc;', + 'icirc', + 'iexcl;', + 'iexcl', + 'igrave;', + 'igrave', + 'image;', + 'infin;', + 'int;', + 'iota;', + 'iquest;', + 'iquest', + 'isin;', + 'iuml;', + 'iuml', + 'kappa;', + 'lArr;', + 'lambda;', + 'lang;', + 'laquo;', + 'laquo', + 'larr;', + 'lceil;', + 'ldquo;', + 'le;', + 'lfloor;', + 'lowast;', + 'loz;', + 'lrm;', + 'lsaquo;', + 'lsquo;', + 'lt;', + 'lt', + 'macr;', + 'macr', + 'mdash;', + 'micro;', + 'micro', + 'middot;', + 'middot', + 'minus;', + 'mu;', + 'nabla;', + 'nbsp;', + 'nbsp', + 'ndash;', + 'ne;', + 'ni;', + 'not;', + 'not', + 'notin;', + 'nsub;', + 'ntilde;', + 'ntilde', + 'nu;', + 'oacute;', + 'oacute', + 'ocirc;', + 'ocirc', + 'oelig;', + 'ograve;', + 'ograve', + 'oline;', + 'omega;', + 'omicron;', + 'oplus;', + 'or;', + 'ordf;', + 'ordf', + 'ordm;', + 'ordm', + 'oslash;', + 'oslash', + 'otilde;', + 'otilde', + 'otimes;', + 'ouml;', + 'ouml', + 'para;', + 'para', + 'part;', + 'permil;', + 'perp;', + 'phi;', + 'pi;', + 'piv;', + 'plusmn;', + 'plusmn', + 'pound;', + 'pound', + 'prime;', + 'prod;', + 'prop;', + 'psi;', + 'quot;', + 'quot', + 'rArr;', + 'radic;', + 'rang;', + 'raquo;', + 'raquo', + 'rarr;', + 'rceil;', + 'rdquo;', + 'real;', + 'reg;', + 'reg', + 'rfloor;', + 'rho;', + 'rlm;', + 'rsaquo;', + 'rsquo;', + 'sbquo;', + 'scaron;', + 'sdot;', + 'sect;', + 'sect', + 'shy;', + 'shy', + 'sigma;', + 'sigmaf;', + 'sim;', + 'spades;', + 'sub;', + 'sube;', + 'sum;', + 'sup1;', + 'sup1', + 'sup2;', + 'sup2', + 'sup3;', + 'sup3', + 'sup;', + 'supe;', + 'szlig;', + 'szlig', + 'tau;', + 'there4;', + 'theta;', + 'thetasym;', + 'thinsp;', + 'thorn;', + 'thorn', + 'tilde;', + 'times;', + 'times', + 'trade;', + 'uArr;', + 'uacute;', + 'uacute', + 'uarr;', + 'ucirc;', + 'ucirc', + 'ugrave;', + 'ugrave', + 'uml;', + 'uml', + 'upsih;', + 'upsilon;', + 'uuml;', + 'uuml', + 'weierp;', + 'xi;', + 'yacute;', + 'yacute', + 'yen;', + 'yen', + 'yuml;', + 'yuml', + 'zeta;', + 'zwj;', + 'zwnj;' + ); + + const PCDATA = 0; + const RCDATA = 1; + const CDATA = 2; + const PLAINTEXT = 3; + + const DOCTYPE = 0; + const STARTTAG = 1; + const ENDTAG = 2; + const COMMENT = 3; + const CHARACTR = 4; + const EOF = 5; + + public function __construct($data) + { + $this->data = $data; + $this->char = -1; + $this->EOF = strlen($data); + $this->tree = new HTML5TreeConstructer; + $this->content_model = self::PCDATA; + + $this->state = 'data'; + + while ($this->state !== null) { + $this->{$this->state . 'State'}(); + } + } + + public function save() + { + return $this->tree->save(); + } + + private function char() + { + return ($this->char < $this->EOF) + ? $this->data[$this->char] + : false; + } + + private function character($s, $l = 0) + { + if ($s + $l < $this->EOF) { + if ($l === 0) { + return $this->data[$s]; + } else { + return substr($this->data, $s, $l); + } + } + } + + private function characters($char_class, $start) + { + return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start)); + } + + private function dataState() + { + // Consume the next input character + $this->char++; + $char = $this->char(); + + if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { + /* U+0026 AMPERSAND (&) + When the content model flag is set to one of the PCDATA or RCDATA + states: switch to the entity data state. Otherwise: treat it as per + the "anything else" entry below. */ + $this->state = 'entityData'; + + } elseif ($char === '-') { + /* If the content model flag is set to either the RCDATA state or + the CDATA state, and the escape flag is false, and there are at + least three characters before this one in the input stream, and the + last four characters in the input stream, including this one, are + U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, + and U+002D HYPHEN-MINUS (""), + set the escape flag to false. */ + if (($this->content_model === self::RCDATA || + $this->content_model === self::CDATA) && $this->escape === true && + $this->character($this->char, 3) === '-->' + ) { + $this->escape = false; + } + + /* In any case, emit the input character as a character token. + Stay in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + } elseif ($this->char === $this->EOF) { + /* EOF + Emit an end-of-file token. */ + $this->EOF(); + + } elseif ($this->content_model === self::PLAINTEXT) { + /* When the content model flag is set to the PLAINTEXT state + THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of + the text and emit it as a character token. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => substr($this->data, $this->char) + ) + ); + + $this->EOF(); + + } else { + /* Anything else + THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that + otherwise would also be treated as a character token and emit it + as a single character token. Stay in the data state. */ + $len = strcspn($this->data, '<&', $this->char); + $char = substr($this->data, $this->char, $len); + $this->char += $len - 1; + + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + $this->state = 'data'; + } + } + + private function entityDataState() + { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, emit a U+0026 AMPERSAND character token. + // Otherwise, emit the character token that was returned. + $char = (!$entity) ? '&' : $entity; + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + // Finally, switch to the data state. + $this->state = 'data'; + } + + private function tagOpenState() + { + switch ($this->content_model) { + case self::RCDATA: + case self::CDATA: + /* If the next input character is a U+002F SOLIDUS (/) character, + consume it and switch to the close tag open state. If the next + input character is not a U+002F SOLIDUS (/) character, emit a + U+003C LESS-THAN SIGN character token and switch to the data + state to process the next input character. */ + if ($this->character($this->char + 1) === '/') { + $this->char++; + $this->state = 'closeTagOpen'; + + } else { + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<' + ) + ); + + $this->state = 'data'; + } + break; + + case self::PCDATA: + // If the content model flag is set to the PCDATA state + // Consume the next input character: + $this->char++; + $char = $this->char(); + + if ($char === '!') { + /* U+0021 EXCLAMATION MARK (!) + Switch to the markup declaration open state. */ + $this->state = 'markupDeclarationOpen'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Switch to the close tag open state. */ + $this->state = 'closeTagOpen'; + + } elseif (preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new start tag token, set its tag name to the lowercase + version of the input character (add 0x0020 to the character's code + point), then switch to the tag name state. (Don't emit the token + yet; further details will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::STARTTAG, + 'attr' => array() + ); + + $this->state = 'tagName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Emit a U+003C LESS-THAN SIGN character token and a + U+003E GREATER-THAN SIGN character token. Switch to the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<>' + ) + ); + + $this->state = 'data'; + + } elseif ($char === '?') { + /* U+003F QUESTION MARK (?) + Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + + } else { + /* Anything else + Parse error. Emit a U+003C LESS-THAN SIGN character token and + reconsume the current input character in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<' + ) + ); + + $this->char--; + $this->state = 'data'; + } + break; + } + } + + private function closeTagOpenState() + { + $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); + $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; + + if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && + (!$the_same || ($the_same && (!preg_match( + '/[\t\n\x0b\x0c >\/]/', + $this->character($this->char + 1 + strlen($next_node)) + ) || $this->EOF === $this->char))) + ) { + /* If the content model flag is set to the RCDATA or CDATA states then + examine the next few characters. If they do not match the tag name of + the last start tag token emitted (case insensitively), or if they do but + they are not immediately followed by one of the following characters: + * U+0009 CHARACTER TABULATION + * U+000A LINE FEED (LF) + * U+000B LINE TABULATION + * U+000C FORM FEED (FF) + * U+0020 SPACE + * U+003E GREATER-THAN SIGN (>) + * U+002F SOLIDUS (/) + * EOF + ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character + token, a U+002F SOLIDUS character token, and switch to the data state + to process the next input character. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => 'state = 'data'; + + } else { + /* Otherwise, if the content model flag is set to the PCDATA state, + or if the next few characters do match that tag name, consume the + next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new end tag token, set its tag name to the lowercase version + of the input character (add 0x0020 to the character's code point), then + switch to the tag name state. (Don't emit the token yet; further details + will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::ENDTAG + ); + + $this->state = 'tagName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Switch to the data state. */ + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F + SOLIDUS character token. Reconsume the EOF character in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => 'char--; + $this->state = 'data'; + + } else { + /* Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + } + } + } + + private function tagNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } else { + /* Anything else + Append the current input character to the current tag token's tag name. + Stay in the tag name state. */ + $this->token['name'] .= strtolower($char); + $this->state = 'tagName'; + } + } + + private function beforeAttributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Stay in the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function attributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif ($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's name. + Stay in the attribute name state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['name'] .= strtolower($char); + + $this->state = 'attributeName'; + } + } + + private function afterAttributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the after attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif ($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the + before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function beforeAttributeValueState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the attribute value (double-quoted) state. */ + $this->state = 'attributeValueDoubleQuoted'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the attribute value (unquoted) state and reconsume + this input character. */ + $this->char--; + $this->state = 'attributeValueUnquoted'; + + } elseif ($char === '\'') { + /* U+0027 APOSTROPHE (') + Switch to the attribute value (single-quoted) state. */ + $this->state = 'attributeValueSingleQuoted'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Switch to the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function attributeValueDoubleQuotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if ($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('double'); + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (double-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueDoubleQuoted'; + } + } + + private function attributeValueSingleQuotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if ($char === '\'') { + /* U+0022 QUOTATION MARK (') + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('single'); + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (single-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueSingleQuoted'; + } + } + + private function attributeValueUnquotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState(); + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function entityInAttributeValueState() + { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, append a U+0026 AMPERSAND character to the + // current attribute's value. Otherwise, emit the character token that + // was returned. + $char = (!$entity) + ? '&' + : $entity; + + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + } + + private function bogusCommentState() + { + /* Consume every character up to the first U+003E GREATER-THAN SIGN + character (>) or the end of the file (EOF), whichever comes first. Emit + a comment token whose data is the concatenation of all the characters + starting from and including the character that caused the state machine + to switch into the bogus comment state, up to and including the last + consumed character before the U+003E character, if any, or up to the + end of the file otherwise. (If the comment was started by the end of + the file (EOF), the token is empty.) */ + $data = $this->characters('^>', $this->char); + $this->emitToken( + array( + 'data' => $data, + 'type' => self::COMMENT + ) + ); + + $this->char += strlen($data); + + /* Switch to the data state. */ + $this->state = 'data'; + + /* If the end of the file was reached, reconsume the EOF character. */ + if ($this->char === $this->EOF) { + $this->char = $this->EOF - 1; + } + } + + private function markupDeclarationOpenState() + { + /* If the next two characters are both U+002D HYPHEN-MINUS (-) + characters, consume those two characters, create a comment token whose + data is the empty string, and switch to the comment state. */ + if ($this->character($this->char + 1, 2) === '--') { + $this->char += 2; + $this->state = 'comment'; + $this->token = array( + 'data' => null, + 'type' => self::COMMENT + ); + + /* Otherwise if the next seven characters are a case-insensitive match + for the word "DOCTYPE", then consume those characters and switch to the + DOCTYPE state. */ + } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') { + $this->char += 7; + $this->state = 'doctype'; + + /* Otherwise, it is a parse error. Switch to the bogus comment state. + The next character that is consumed, if any, is the first character + that will be in the comment. */ + } else { + $this->char++; + $this->state = 'bogusComment'; + } + } + + private function commentState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if ($char === '-') { + /* Switch to the comment dash state */ + $this->state = 'commentDash'; + + /* EOF */ + } elseif ($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append the input character to the comment token's data. Stay in + the comment state. */ + $this->token['data'] .= $char; + } + } + + private function commentDashState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if ($char === '-') { + /* Switch to the comment end state */ + $this->state = 'commentEnd'; + + /* EOF */ + } elseif ($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append a U+002D HYPHEN-MINUS (-) character and the input + character to the comment token's data. Switch to the comment state. */ + $this->token['data'] .= '-' . $char; + $this->state = 'comment'; + } + } + + private function commentEndState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '-') { + $this->token['data'] .= '-'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['data'] .= '--' . $char; + $this->state = 'comment'; + } + } + + private function doctypeState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'beforeDoctypeName'; + + } else { + $this->char--; + $this->state = 'beforeDoctypeName'; + } + } + + private function beforeDoctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the before DOCTYPE name state. + + } elseif (preg_match('/^[a-z]$/', $char)) { + $this->token = array( + 'name' => strtoupper($char), + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + + } elseif ($char === '>') { + $this->emitToken( + array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + ) + ); + + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken( + array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + ) + ); + + $this->char--; + $this->state = 'data'; + + } else { + $this->token = array( + 'name' => $char, + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + } + } + + private function doctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'AfterDoctypeName'; + + } elseif ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif (preg_match('/^[a-z]$/', $char)) { + $this->token['name'] .= strtoupper($char); + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['name'] .= $char; + } + + $this->token['error'] = ($this->token['name'] === 'HTML') + ? false + : true; + } + + private function afterDoctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the DOCTYPE name state. + + } elseif ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['error'] = true; + $this->state = 'bogusDoctype'; + } + } + + private function bogusDoctypeState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + // Stay in the bogus DOCTYPE state. + } + } + + private function entity() + { + $start = $this->char; + + // This section defines how to consume an entity. This definition is + // used when parsing entities in text and in attributes. + + // The behaviour depends on the identity of the next character (the + // one immediately after the U+0026 AMPERSAND character): + + switch ($this->character($this->char + 1)) { + // U+0023 NUMBER SIGN (#) + case '#': + + // The behaviour further depends on the character after the + // U+0023 NUMBER SIGN: + switch ($this->character($this->char + 1)) { + // U+0078 LATIN SMALL LETTER X + // U+0058 LATIN CAPITAL LETTER X + case 'x': + case 'X': + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 + // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER + // A, through to U+0046 LATIN CAPITAL LETTER F (in other + // words, 0-9, A-F, a-f). + $char = 1; + $char_class = '0-9A-Fa-f'; + break; + + // Anything else + default: + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE (i.e. just 0-9). + $char = 0; + $char_class = '0-9'; + break; + } + + // Consume as many characters as match the range of characters + // given above. + $this->char++; + $e_name = $this->characters($char_class, $this->char + $char + 1); + $entity = $this->character($start, $this->char); + $cond = strlen($e_name) > 0; + + // The rest of the parsing happens below. + break; + + // Anything else + default: + // Consume the maximum number of characters possible, with the + // consumed characters case-sensitively matching one of the + // identifiers in the first column of the entities table. + + $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); + $len = strlen($e_name); + + for ($c = 1; $c <= $len; $c++) { + $id = substr($e_name, 0, $c); + $this->char++; + + if (in_array($id, $this->entities)) { + if ($e_name[$c - 1] !== ';') { + if ($c < $len && $e_name[$c] == ';') { + $this->char++; // consume extra semicolon + } + } + $entity = $id; + break; + } + } + + $cond = isset($entity); + // The rest of the parsing happens below. + break; + } + + if (!$cond) { + // If no match can be made, then this is a parse error. No + // characters are consumed, and nothing is returned. + $this->char = $start; + return false; + } + + // Return a character token for the character corresponding to the + // entity name (as given by the second column of the entities table). + return html_entity_decode('&' . rtrim($entity, ';') . ';', ENT_QUOTES, 'UTF-8'); + } + + private function emitToken($token) + { + $emit = $this->tree->emitToken($token); + + if (is_int($emit)) { + $this->content_model = $emit; + + } elseif ($token['type'] === self::ENDTAG) { + $this->content_model = self::PCDATA; + } + } + + private function EOF() + { + $this->state = null; + $this->tree->emitToken( + array( + 'type' => self::EOF + ) + ); + } +} + +class HTML5TreeConstructer +{ + public $stack = array(); + + private $phase; + private $mode; + private $dom; + private $foster_parent = null; + private $a_formatting = array(); + + private $head_pointer = null; + private $form_pointer = null; + + private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th'); + private $formatting = array( + 'a', + 'b', + 'big', + 'em', + 'font', + 'i', + 'nobr', + 's', + 'small', + 'strike', + 'strong', + 'tt', + 'u' + ); + private $special = array( + 'address', + 'area', + 'base', + 'basefont', + 'bgsound', + 'blockquote', + 'body', + 'br', + 'center', + 'col', + 'colgroup', + 'dd', + 'dir', + 'div', + 'dl', + 'dt', + 'embed', + 'fieldset', + 'form', + 'frame', + 'frameset', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'head', + 'hr', + 'iframe', + 'image', + 'img', + 'input', + 'isindex', + 'li', + 'link', + 'listing', + 'menu', + 'meta', + 'noembed', + 'noframes', + 'noscript', + 'ol', + 'optgroup', + 'option', + 'p', + 'param', + 'plaintext', + 'pre', + 'script', + 'select', + 'spacer', + 'style', + 'tbody', + 'textarea', + 'tfoot', + 'thead', + 'title', + 'tr', + 'ul', + 'wbr' + ); + + // The different phases. + const INIT_PHASE = 0; + const ROOT_PHASE = 1; + const MAIN_PHASE = 2; + const END_PHASE = 3; + + // The different insertion modes for the main phase. + const BEFOR_HEAD = 0; + const IN_HEAD = 1; + const AFTER_HEAD = 2; + const IN_BODY = 3; + const IN_TABLE = 4; + const IN_CAPTION = 5; + const IN_CGROUP = 6; + const IN_TBODY = 7; + const IN_ROW = 8; + const IN_CELL = 9; + const IN_SELECT = 10; + const AFTER_BODY = 11; + const IN_FRAME = 12; + const AFTR_FRAME = 13; + + // The different types of elements. + const SPECIAL = 0; + const SCOPING = 1; + const FORMATTING = 2; + const PHRASING = 3; + + const MARKER = 0; + + public function __construct() + { + $this->phase = self::INIT_PHASE; + $this->mode = self::BEFOR_HEAD; + $this->dom = new DOMDocument; + + $this->dom->encoding = 'UTF-8'; + $this->dom->preserveWhiteSpace = true; + $this->dom->substituteEntities = true; + $this->dom->strictErrorChecking = false; + } + + // Process tag tokens + public function emitToken($token) + { + switch ($this->phase) { + case self::INIT_PHASE: + return $this->initPhase($token); + break; + case self::ROOT_PHASE: + return $this->rootElementPhase($token); + break; + case self::MAIN_PHASE: + return $this->mainPhase($token); + break; + case self::END_PHASE : + return $this->trailingEndPhase($token); + break; + } + } + + private function initPhase($token) + { + /* Initially, the tree construction stage must handle each token + emitted from the tokenisation stage as follows: */ + + /* A DOCTYPE token that is marked as being in error + A comment token + A start tag token + An end tag token + A character token that is not one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE + An end-of-file token */ + if ((isset($token['error']) && $token['error']) || + $token['type'] === HTML5::COMMENT || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF || + ($token['type'] === HTML5::CHARACTR && isset($token['data']) && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) + ) { + /* This specification does not define how to handle this case. In + particular, user agents may ignore the entirety of this specification + altogether for such documents, and instead invoke special parse modes + with a greater emphasis on backwards compatibility. */ + + $this->phase = self::ROOT_PHASE; + return $this->rootElementPhase($token); + + /* A DOCTYPE token marked as being correct */ + } elseif (isset($token['error']) && !$token['error']) { + /* Append a DocumentType node to the Document node, with the name + attribute set to the name given in the DOCTYPE token (which will be + "HTML"), and the other attributes specific to DocumentType objects + set to null, empty lists, or the empty string as appropriate. */ + $doctype = new DOMDocumentType(null, null, 'HTML'); + + /* Then, switch to the root element phase of the tree construction + stage. */ + $this->phase = self::ROOT_PHASE; + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif (isset($token['data']) && preg_match( + '/^[\t\n\x0b\x0c ]+$/', + $token['data'] + ) + ) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + } + } + + private function rootElementPhase($token) + { + /* After the initial phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED + (FF), or U+0020 SPACE + A start tag token + An end tag token + An end-of-file token */ + } elseif (($token['type'] === HTML5::CHARACTR && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF + ) { + /* Create an HTMLElement node with the tag name html, in the HTML + namespace. Append it to the Document object. Switch to the main + phase and reprocess the current token. */ + $html = $this->dom->createElement('html'); + $this->dom->appendChild($html); + $this->stack[] = $html; + + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + } + } + + private function mainPhase($token) + { + /* Tokens in the main phase must be handled as follows: */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A start tag token with the tag name "html" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { + /* If this start tag token was not the first start tag token, then + it is a parse error. */ + + /* For each attribute on the token, check to see if the attribute + is already present on the top element of the stack of open elements. + If it is not, add the attribute and its corresponding value to that + element. */ + foreach ($token['attr'] as $attr) { + if (!$this->stack[0]->hasAttribute($attr['name'])) { + $this->stack[0]->setAttribute($attr['name'], $attr['value']); + } + } + + /* An end-of-file token */ + } elseif ($token['type'] === HTML5::EOF) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Anything else. */ + } else { + /* Depends on the insertion mode: */ + switch ($this->mode) { + case self::BEFOR_HEAD: + return $this->beforeHead($token); + break; + case self::IN_HEAD: + return $this->inHead($token); + break; + case self::AFTER_HEAD: + return $this->afterHead($token); + break; + case self::IN_BODY: + return $this->inBody($token); + break; + case self::IN_TABLE: + return $this->inTable($token); + break; + case self::IN_CAPTION: + return $this->inCaption($token); + break; + case self::IN_CGROUP: + return $this->inColumnGroup($token); + break; + case self::IN_TBODY: + return $this->inTableBody($token); + break; + case self::IN_ROW: + return $this->inRow($token); + break; + case self::IN_CELL: + return $this->inCell($token); + break; + case self::IN_SELECT: + return $this->inSelect($token); + break; + case self::AFTER_BODY: + return $this->afterBody($token); + break; + case self::IN_FRAME: + return $this->inFrameset($token); + break; + case self::AFTR_FRAME: + return $this->afterFrameset($token); + break; + case self::END_PHASE: + return $this->trailingEndPhase($token); + break; + } + } + } + + private function beforeHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "head" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { + /* Create an element for the token, append the new element to the + current node and push it onto the stack of open elements. */ + $element = $this->insertElement($token); + + /* Set the head element pointer to this new element node. */ + $this->head_pointer = $element; + + /* Change the insertion mode to "in head". */ + $this->mode = self::IN_HEAD; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title". Or an end tag with the tag name "html". + Or a character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or any other start tag token */ + } elseif ($token['type'] === HTML5::STARTTAG || + ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || + ($token['type'] === HTML5::CHARACTR && !preg_match( + '/^[\t\n\x0b\x0c ]$/', + $token['data'] + )) + ) { + /* Act as if a start tag token with the tag name "head" and no + attributes had been seen, then reprocess the current token. */ + $this->beforeHead( + array( + 'name' => 'head', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inHead($token); + + /* Any other end tag */ + } elseif ($token['type'] === HTML5::ENDTAG) { + /* Parse error. Ignore the token. */ + } + } + + private function inHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. + + THIS DIFFERS FROM THE SPEC: If the current node is either a title, style + or script element, append the character to the current node regardless + of its content. */ + if (($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( + $token['type'] === HTML5::CHARACTR && in_array( + end($this->stack)->nodeName, + array('title', 'style', 'script') + )) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('title', 'style', 'script')) + ) { + array_pop($this->stack); + return HTML5::PCDATA; + + /* A start tag with the tag name "title" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $element = $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the RCDATA state. */ + return HTML5::RCDATA; + + /* A start tag with the tag name "style" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "script" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { + /* Create an element for the token. */ + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "base", "link", or "meta" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('base', 'link', 'meta') + ) + ) { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + array_pop($this->stack); + + } else { + $this->insertElement($token); + } + + /* An end tag with the tag name "head" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { + /* If the current node is a head element, pop the current node off + the stack of open elements. */ + if ($this->head_pointer->isSameNode(end($this->stack))) { + array_pop($this->stack); + + /* Otherwise, this is a parse error. */ + } else { + // k + } + + /* Change the insertion mode to "after head". */ + $this->mode = self::AFTER_HEAD; + + /* A start tag with the tag name "head" or an end tag except "html". */ + } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || + ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html') + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* If the current node is a head element, act as if an end tag + token with the tag name "head" had been seen. */ + if ($this->head_pointer->isSameNode(end($this->stack))) { + $this->inHead( + array( + 'name' => 'head', + 'type' => HTML5::ENDTAG + ) + ); + + /* Otherwise, change the insertion mode to "after head". */ + } else { + $this->mode = self::AFTER_HEAD; + } + + /* Then, reprocess the current token. */ + return $this->afterHead($token); + } + } + + private function afterHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "body" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { + /* Insert a body element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in body". */ + $this->mode = self::IN_BODY; + + /* A start tag token with the tag name "frameset" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { + /* Insert a frameset element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in frameset". */ + $this->mode = self::IN_FRAME; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('base', 'link', 'meta', 'script', 'style', 'title') + ) + ) { + /* Parse error. Switch the insertion mode back to "in head" and + reprocess the token. */ + $this->mode = self::IN_HEAD; + return $this->inHead($token); + + /* Anything else */ + } else { + /* Act as if a start tag token with the tag name "body" and no + attributes had been seen, and then reprocess the current token. */ + $this->afterHead( + array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inBody($token); + } + } + + private function inBody($token) + { + /* Handle the token as follows: */ + + switch ($token['type']) { + /* A character token */ + case HTML5::CHARACTR: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + break; + + /* A comment token */ + case HTML5::COMMENT: + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + break; + + case HTML5::STARTTAG: + switch ($token['name']) { + /* A start tag token whose tag name is one of: "script", + "style" */ + case 'script': + case 'style': + /* Process the token as if the insertion mode had been "in + head". */ + return $this->inHead($token); + break; + + /* A start tag token whose tag name is one of: "base", "link", + "meta", "title" */ + case 'base': + case 'link': + case 'meta': + case 'title': + /* Parse error. Process the token as if the insertion mode + had been "in head". */ + return $this->inHead($token); + break; + + /* A start tag token with the tag name "body" */ + case 'body': + /* Parse error. If the second element on the stack of open + elements is not a body element, or, if the stack of open + elements has only one node on it, then ignore the token. + (innerHTML case) */ + if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { + // Ignore + + /* Otherwise, for each attribute on the token, check to see + if the attribute is already present on the body element (the + second element) on the stack of open elements. If it is not, + add the attribute and its corresponding value to that + element. */ + } else { + foreach ($token['attr'] as $attr) { + if (!$this->stack[1]->hasAttribute($attr['name'])) { + $this->stack[1]->setAttribute($attr['name'], $attr['value']); + } + } + } + break; + + /* A start tag whose tag name is one of: "address", + "blockquote", "center", "dir", "div", "dl", "fieldset", + "listing", "menu", "ol", "p", "ul" */ + case 'address': + case 'blockquote': + case 'center': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'listing': + case 'menu': + case 'ol': + case 'p': + case 'ul': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "form" */ + case 'form': + /* If the form element pointer is not null, ignore the + token with a parse error. */ + if ($this->form_pointer !== null) { + // Ignore. + + /* Otherwise: */ + } else { + /* If the stack of open elements has a p element in + scope, then act as if an end tag with the tag name p + had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token, and set the + form element pointer to point to the element created. */ + $element = $this->insertElement($token); + $this->form_pointer = $element; + } + break; + + /* A start tag whose tag name is "li", "dd" or "dt" */ + case 'li': + case 'dd': + case 'dt': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + $stack_length = count($this->stack) - 1; + + for ($n = $stack_length; 0 <= $n; $n--) { + /* 1. Initialise node to be the current node (the + bottommost node of the stack). */ + $stop = false; + $node = $this->stack[$n]; + $cat = $this->getElementCategory($node->tagName); + + /* 2. If node is an li, dd or dt element, then pop all + the nodes from the current node up to node, including + node, then stop this algorithm. */ + if ($token['name'] === $node->tagName || ($token['name'] !== 'li' + && ($node->tagName === 'dd' || $node->tagName === 'dt')) + ) { + for ($x = $stack_length; $x >= $n; $x--) { + array_pop($this->stack); + } + + break; + } + + /* 3. If node is not in the formatting category, and is + not in the phrasing category, and is not an address or + div element, then stop this algorithm. */ + if ($cat !== self::FORMATTING && $cat !== self::PHRASING && + $node->tagName !== 'address' && $node->tagName !== 'div' + ) { + break; + } + } + + /* Finally, insert an HTML element with the same tag + name as the token's. */ + $this->insertElement($token); + break; + + /* A start tag token whose tag name is "plaintext" */ + case 'plaintext': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + return HTML5::PLAINTEXT; + break; + + /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + this is a parse error; pop elements from the stack until an + element with one of those tag names has been popped from the + stack. */ + while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { + array_pop($this->stack); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "a" */ + case 'a': + /* If the list of active formatting elements contains + an element whose tag name is "a" between the end of the + list and the last marker on the list (or the start of + the list if there is no marker on the list), then this + is a parse error; act as if an end tag with the tag name + "a" had been seen, then remove that element from the list + of active formatting elements and the stack of open + elements if the end tag didn't already remove it (it + might not have if the element is not in table scope). */ + $leng = count($this->a_formatting); + + for ($n = $leng - 1; $n >= 0; $n--) { + if ($this->a_formatting[$n] === self::MARKER) { + break; + + } elseif ($this->a_formatting[$n]->nodeName === 'a') { + $this->emitToken( + array( + 'name' => 'a', + 'type' => HTML5::ENDTAG + ) + ); + break; + } + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag whose tag name is one of: "b", "big", "em", "font", + "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'b': + case 'big': + case 'em': + case 'font': + case 'i': + case 'nobr': + case 's': + case 'small': + case 'strike': + case 'strong': + case 'tt': + case 'u': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag token whose tag name is "button" */ + case 'button': + /* If the stack of open elements has a button element in scope, + then this is a parse error; act as if an end tag with the tag + name "button" had been seen, then reprocess the token. (We don't + do that. Unnecessary.) */ + if ($this->elementInScope('button')) { + $this->inBody( + array( + 'name' => 'button', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is one of: "marquee", "object" */ + case 'marquee': + case 'object': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is "xmp" */ + case 'xmp': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Switch the content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "table" */ + case 'table': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + break; + + /* A start tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ + case 'area': + case 'basefont': + case 'bgsound': + case 'br': + case 'embed': + case 'img': + case 'param': + case 'spacer': + case 'wbr': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "hr" */ + case 'hr': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "image" */ + case 'image': + /* Parse error. Change the token's tag name to "img" and + reprocess it. (Don't ask.) */ + $token['name'] = 'img'; + return $this->inBody($token); + break; + + /* A start tag whose tag name is "input" */ + case 'input': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an input element for the token. */ + $element = $this->insertElement($token, false); + + /* If the form element pointer is not null, then associate the + input element with the form element pointed to by the form + element pointer. */ + $this->form_pointer !== null + ? $this->form_pointer->appendChild($element) + : end($this->stack)->appendChild($element); + + /* Pop that input element off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "isindex" */ + case 'isindex': + /* Parse error. */ + // w/e + + /* If the form element pointer is not null, + then ignore the token. */ + if ($this->form_pointer === null) { + /* Act as if a start tag token with the tag name "form" had + been seen. */ + $this->inBody( + array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody( + array( + 'name' => 'hr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "p" had + been seen. */ + $this->inBody( + array( + 'name' => 'p', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "label" + had been seen. */ + $this->inBody( + array( + 'name' => 'label', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a stream of character tokens had been seen. */ + $this->insertText( + 'This is a searchable index. ' . + 'Insert your search keywords here: ' + ); + + /* Act as if a start tag token with the tag name "input" + had been seen, with all the attributes from the "isindex" + token, except with the "name" attribute set to the value + "isindex" (ignoring any explicit "name" attribute). */ + $attr = $token['attr']; + $attr[] = array('name' => 'name', 'value' => 'isindex'); + + $this->inBody( + array( + 'name' => 'input', + 'type' => HTML5::STARTTAG, + 'attr' => $attr + ) + ); + + /* Act as if a stream of character tokens had been seen + (see below for what they should say). */ + $this->insertText( + 'This is a searchable index. ' . + 'Insert your search keywords here: ' + ); + + /* Act as if an end tag token with the tag name "label" + had been seen. */ + $this->inBody( + array( + 'name' => 'label', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if an end tag token with the tag name "p" had + been seen. */ + $this->inBody( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody( + array( + 'name' => 'hr', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if an end tag token with the tag name "form" had + been seen. */ + $this->inBody( + array( + 'name' => 'form', + 'type' => HTML5::ENDTAG + ) + ); + } + break; + + /* A start tag whose tag name is "textarea" */ + case 'textarea': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the + RCDATA state. */ + return HTML5::RCDATA; + break; + + /* A start tag whose tag name is one of: "iframe", "noembed", + "noframes" */ + case 'iframe': + case 'noembed': + case 'noframes': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "select" */ + case 'select': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in select". */ + $this->mode = self::IN_SELECT; + break; + + /* A start or end tag whose tag name is one of: "caption", "col", + "colgroup", "frame", "frameset", "head", "option", "optgroup", + "tbody", "td", "tfoot", "th", "thead", "tr". */ + case 'caption': + case 'col': + case 'colgroup': + case 'frame': + case 'frameset': + case 'head': + case 'option': + case 'optgroup': + case 'tbody': + case 'td': + case 'tfoot': + case 'th': + case 'thead': + case 'tr': + // Parse error. Ignore the token. + break; + + /* A start or end tag whose tag name is one of: "event-source", + "section", "nav", "article", "aside", "header", "footer", + "datagrid", "command" */ + case 'event-source': + case 'section': + case 'nav': + case 'article': + case 'aside': + case 'header': + case 'footer': + case 'datagrid': + case 'command': + // Work in progress! + break; + + /* A start tag token not covered by the previous entries */ + default: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + $this->insertElement($token, true, true); + break; + } + break; + + case HTML5::ENDTAG: + switch ($token['name']) { + /* An end tag with the tag name "body" */ + case 'body': + /* If the second element in the stack of open elements is + not a body element, this is a parse error. Ignore the token. + (innerHTML case) */ + if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { + // Ignore. + + /* If the current node is not the body element, then this + is a parse error. */ + } elseif (end($this->stack)->nodeName !== 'body') { + // Parse error. + } + + /* Change the insertion mode to "after body". */ + $this->mode = self::AFTER_BODY; + break; + + /* An end tag with the tag name "html" */ + case 'html': + /* Act as if an end tag with tag name "body" had been seen, + then, if that token wasn't ignored, reprocess the current + token. */ + $this->inBody( + array( + 'name' => 'body', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->afterBody($token); + break; + + /* An end tag whose tag name is one of: "address", "blockquote", + "center", "dir", "div", "dl", "fieldset", "listing", "menu", + "ol", "pre", "ul" */ + case 'address': + case 'blockquote': + case 'center': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'listing': + case 'menu': + case 'ol': + case 'pre': + case 'ul': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with + the same tag name as that of the token, then this + is a parse error. */ + // w/e + + /* If the stack of open elements has an element in + scope with the same tag name as that of the token, + then pop elements from this stack until an element + with that tag name has been popped from the stack. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is "form" */ + case 'form': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + } + + if (end($this->stack)->nodeName !== $token['name']) { + /* Now, if the current node is not an element with the + same tag name as that of the token, then this is a parse + error. */ + // w/e + + } else { + /* Otherwise, if the current node is an element with + the same tag name as that of the token pop that element + from the stack. */ + array_pop($this->stack); + } + + /* In any case, set the form element pointer to null. */ + $this->form_pointer = null; + break; + + /* An end tag whose tag name is "p" */ + case 'p': + /* If the stack of open elements has a p element in scope, + then generate implied end tags, except for p elements. */ + if ($this->elementInScope('p')) { + $this->generateImpliedEndTags(array('p')); + + /* If the current node is not a p element, then this is + a parse error. */ + // k + + /* If the stack of open elements has a p element in + scope, then pop elements from this stack until the stack + no longer has a p element in scope. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->elementInScope('p')) { + array_pop($this->stack); + + } else { + break; + } + } + } + break; + + /* An end tag whose tag name is "dd", "dt", or "li" */ + case 'dd': + case 'dt': + case 'li': + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + generate implied end tags, except for elements with the + same tag name as the token. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(array($token['name'])); + + /* If the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + pop elements from this stack until an element with that + tag name has been popped from the stack. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + generate implied end tags. */ + if ($this->elementInScope($elements)) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as that of the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has in scope an element + whose tag name is one of "h1", "h2", "h3", "h4", "h5", or + "h6", then pop elements from the stack until an element + with one of those tag names has been popped from the stack. */ + while ($this->elementInScope($elements)) { + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "a", "b", "big", "em", + "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'a': + case 'b': + case 'big': + case 'em': + case 'font': + case 'i': + case 'nobr': + case 's': + case 'small': + case 'strike': + case 'strong': + case 'tt': + case 'u': + /* 1. Let the formatting element be the last element in + the list of active formatting elements that: + * is between the end of the list and the last scope + marker in the list, if any, or the start of the list + otherwise, and + * has the same tag name as the token. + */ + while (true) { + for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) { + if ($this->a_formatting[$a] === self::MARKER) { + break; + + } elseif ($this->a_formatting[$a]->tagName === $token['name']) { + $formatting_element = $this->a_formatting[$a]; + $in_stack = in_array($formatting_element, $this->stack, true); + $fe_af_pos = $a; + break; + } + } + + /* If there is no such node, or, if that node is + also in the stack of open elements but the element + is not in scope, then this is a parse error. Abort + these steps. The token is ignored. */ + if (!isset($formatting_element) || ($in_stack && + !$this->elementInScope($token['name'])) + ) { + break; + + /* Otherwise, if there is such a node, but that node + is not in the stack of open elements, then this is a + parse error; remove the element from the list, and + abort these steps. */ + } elseif (isset($formatting_element) && !$in_stack) { + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 2. Let the furthest block be the topmost node in the + stack of open elements that is lower in the stack + than the formatting element, and is not an element in + the phrasing or formatting categories. There might + not be one. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $length = count($this->stack); + + for ($s = $fe_s_pos + 1; $s < $length; $s++) { + $category = $this->getElementCategory($this->stack[$s]->nodeName); + + if ($category !== self::PHRASING && $category !== self::FORMATTING) { + $furthest_block = $this->stack[$s]; + } + } + + /* 3. If there is no furthest block, then the UA must + skip the subsequent steps and instead just pop all + the nodes from the bottom of the stack of open + elements, from the current node up to the formatting + element, and remove the formatting element from the + list of active formatting elements. */ + if (!isset($furthest_block)) { + for ($n = $length - 1; $n >= $fe_s_pos; $n--) { + array_pop($this->stack); + } + + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 4. Let the common ancestor be the element + immediately above the formatting element in the stack + of open elements. */ + $common_ancestor = $this->stack[$fe_s_pos - 1]; + + /* 5. If the furthest block has a parent node, then + remove the furthest block from its parent node. */ + if ($furthest_block->parentNode !== null) { + $furthest_block->parentNode->removeChild($furthest_block); + } + + /* 6. Let a bookmark note the position of the + formatting element in the list of active formatting + elements relative to the elements on either side + of it in the list. */ + $bookmark = $fe_af_pos; + + /* 7. Let node and last node be the furthest block. + Follow these steps: */ + $node = $furthest_block; + $last_node = $furthest_block; + + while (true) { + for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { + /* 7.1 Let node be the element immediately + prior to node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 7.2 If node is not in the list of active + formatting elements, then remove node from + the stack of open elements and then go back + to step 1. */ + if (!in_array($node, $this->a_formatting, true)) { + unset($this->stack[$n]); + $this->stack = array_merge($this->stack); + + } else { + break; + } + } + + /* 7.3 Otherwise, if node is the formatting + element, then go to the next step in the overall + algorithm. */ + if ($node === $formatting_element) { + break; + + /* 7.4 Otherwise, if last node is the furthest + block, then move the aforementioned bookmark to + be immediately after the node in the list of + active formatting elements. */ + } elseif ($last_node === $furthest_block) { + $bookmark = array_search($node, $this->a_formatting, true) + 1; + } + + /* 7.5 If node has any children, perform a + shallow clone of node, replace the entry for + node in the list of active formatting elements + with an entry for the clone, replace the entry + for node in the stack of open elements with an + entry for the clone, and let node be the clone. */ + if ($node->hasChildNodes()) { + $clone = $node->cloneNode(); + $s_pos = array_search($node, $this->stack, true); + $a_pos = array_search($node, $this->a_formatting, true); + + $this->stack[$s_pos] = $clone; + $this->a_formatting[$a_pos] = $clone; + $node = $clone; + } + + /* 7.6 Insert last node into node, first removing + it from its previous parent node if any. */ + if ($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $node->appendChild($last_node); + + /* 7.7 Let last node be node. */ + $last_node = $node; + } + + /* 8. Insert whatever last node ended up being in + the previous step into the common ancestor node, + first removing it from its previous parent node if + any. */ + if ($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $common_ancestor->appendChild($last_node); + + /* 9. Perform a shallow clone of the formatting + element. */ + $clone = $formatting_element->cloneNode(); + + /* 10. Take all of the child nodes of the furthest + block and append them to the clone created in the + last step. */ + while ($furthest_block->hasChildNodes()) { + $child = $furthest_block->firstChild; + $furthest_block->removeChild($child); + $clone->appendChild($child); + } + + /* 11. Append that clone to the furthest block. */ + $furthest_block->appendChild($clone); + + /* 12. Remove the formatting element from the list + of active formatting elements, and insert the clone + into the list of active formatting elements at the + position of the aforementioned bookmark. */ + $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + + $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); + $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); + $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); + + /* 13. Remove the formatting element from the stack + of open elements, and insert the clone into the stack + of open elements immediately after (i.e. in a more + deeply nested position than) the position of the + furthest block in that stack. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $fb_s_pos = array_search($furthest_block, $this->stack, true); + unset($this->stack[$fe_s_pos]); + + $s_part1 = array_slice($this->stack, 0, $fb_s_pos); + $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); + $this->stack = array_merge($s_part1, array($clone), $s_part2); + + /* 14. Jump back to step 1 in this series of steps. */ + unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); + } + break; + + /* An end tag token whose tag name is one of: "button", + "marquee", "object" */ + case 'button': + case 'marquee': + case 'object': + /* If the stack of open elements has an element in scope whose + tag name matches the tag name of the token, then generate implied + tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // k + + /* Now, if the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then pop + elements from the stack until that element has been popped from + the stack, and clear the list of active formatting elements up + to the last marker. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + + $marker = end(array_keys($this->a_formatting, self::MARKER, true)); + + for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) { + array_pop($this->a_formatting); + } + } + break; + + /* Or an end tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "hr", "iframe", "image", "img", + "input", "isindex", "noembed", "noframes", "param", "select", + "spacer", "table", "textarea", "wbr" */ + case 'area': + case 'basefont': + case 'bgsound': + case 'br': + case 'embed': + case 'hr': + case 'iframe': + case 'image': + case 'img': + case 'input': + case 'isindex': + case 'noembed': + case 'noframes': + case 'param': + case 'select': + case 'spacer': + case 'table': + case 'textarea': + case 'wbr': + // Parse error. Ignore the token. + break; + + /* An end tag token not covered by the previous entries */ + default: + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + /* Initialise node to be the current node (the bottommost + node of the stack). */ + $node = end($this->stack); + + /* If node has the same tag name as the end tag token, + then: */ + if ($token['name'] === $node->nodeName) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* If the tag name of the end tag token does not + match the tag name of the current node, this is a + parse error. */ + // k + + /* Pop all the nodes from the current node up to + node, including node, then stop this algorithm. */ + for ($x = count($this->stack) - $n; $x >= $n; $x--) { + array_pop($this->stack); + } + + } else { + $category = $this->getElementCategory($node); + + if ($category !== self::SPECIAL && $category !== self::SCOPING) { + /* Otherwise, if node is in neither the formatting + category nor the phrasing category, then this is a + parse error. Stop this algorithm. The end tag token + is ignored. */ + return false; + } + } + } + break; + } + break; + } + } + + private function inTable($token) + { + $clear = array('html', 'table'); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "caption" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'caption' + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + + /* Insert an HTML element for the token, then switch the + insertion mode to "in caption". */ + $this->insertElement($token); + $this->mode = self::IN_CAPTION; + + /* A start tag whose tag name is "colgroup" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'colgroup' + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the + insertion mode to "in column group". */ + $this->insertElement($token); + $this->mode = self::IN_CGROUP; + + /* A start tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'col' + ) { + $this->inTable( + array( + 'name' => 'colgroup', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + $this->inColumnGroup($token); + + /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('tbody', 'tfoot', 'thead') + ) + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in table body". */ + $this->insertElement($token); + $this->mode = self::IN_TBODY; + + /* A start tag whose tag name is one of: "td", "th", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && + in_array($token['name'], array('td', 'th', 'tr')) + ) { + /* Act as if a start tag token with the tag name "tbody" had been + seen, then reprocess the current token. */ + $this->inTable( + array( + 'name' => 'tbody', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inTableBody($token); + + /* A start tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'table' + ) { + /* Parse error. Act as if an end tag token with the tag name "table" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inTable( + array( + 'name' => 'table', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->mainPhase($token); + + /* An end tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table' + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + return false; + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a table element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a table element has been + popped from the stack. */ + while (true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($current === 'table') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array( + 'body', + 'caption', + 'col', + 'colgroup', + 'html', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Parse error. Process the token as if the insertion mode was "in + body", with the following exception: */ + + /* If the current node is a table, tbody, tfoot, thead, or tr + element, then, whenever a node would be inserted into the current + node, it must instead be inserted into the foster parent element. */ + if (in_array( + end($this->stack)->nodeName, + array('table', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* The foster parent element is the parent element of the last + table element in the stack of open elements, if there is a + table element and it has such a parent element. If there is no + table element in the stack of open elements (innerHTML case), + then the foster parent element is the first element in the + stack of open elements (the html element). Otherwise, if there + is a table element in the stack of open elements, but the last + table element in the stack of open elements has no parent, or + its parent node is not an element, then the foster parent + element is the element before the last table element in the + stack of open elements. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === 'table') { + $table = $this->stack[$n]; + break; + } + } + + if (isset($table) && $table->parentNode !== null) { + $this->foster_parent = $table->parentNode; + + } elseif (!isset($table)) { + $this->foster_parent = $this->stack[0]; + + } elseif (isset($table) && ($table->parentNode === null || + $table->parentNode->nodeType !== XML_ELEMENT_NODE) + ) { + $this->foster_parent = $this->stack[$n - 1]; + } + } + + $this->inBody($token); + } + } + + private function inCaption($token) + { + /* An end tag whose tag name is "caption" */ + if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a caption element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a caption element has + been popped from the stack. */ + while (true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($node === 'caption') { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag + name is "table" */ + } elseif (($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + )) || ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table') + ) { + /* Parse error. Act as if an end tag with the tag name "caption" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inCaption( + array( + 'name' => 'caption', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inTable($token); + + /* An end tag whose tag name is one of: "body", "col", "colgroup", + "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array( + 'body', + 'col', + 'colgroup', + 'html', + 'tbody', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inColumnGroup($token) + { + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { + /* Insert a col element for the token. Immediately pop the current + node off the stack of open elements. */ + $this->insertElement($token); + array_pop($this->stack); + + /* An end tag whose tag name is "colgroup" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'colgroup' + ) { + /* If the current node is the root html element, then this is a + parse error, ignore the token. (innerHTML case) */ + if (end($this->stack)->nodeName === 'html') { + // Ignore + + /* Otherwise, pop the current node (which will be a colgroup + element) from the stack of open elements. Switch the insertion + mode to "in table". */ + } else { + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* An end tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Act as if an end tag with the tag name "colgroup" had been seen, + and then, if that token wasn't ignored, reprocess the current token. */ + $this->inColumnGroup( + array( + 'name' => 'colgroup', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inTable($token); + } + } + + private function inTableBody($token) + { + $clear = array('tbody', 'tfoot', 'thead', 'html'); + + /* A start tag whose tag name is "tr" */ + if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Insert a tr element for the token, then switch the insertion + mode to "in row". */ + $this->insertElement($token); + $this->mode = self::IN_ROW; + + /* A start tag whose tag name is one of: "th", "td" */ + } elseif ($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td') + ) { + /* Parse error. Act as if a start tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inTableBody( + array( + 'name' => 'tr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inRow($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead')) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node from the stack of open elements. Switch + the insertion mode to "in table". */ + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ + } elseif (($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead') + )) || + ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table') + ) { + /* If the stack of open elements does not have a tbody, thead, or + tfoot element in table scope, this is a parse error. Ignore the + token. (innerHTML case) */ + if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Act as if an end tag with the same tag name as the current + node ("tbody", "tfoot", or "thead") had been seen, then + reprocess the current token. */ + $this->inTableBody( + array( + 'name' => end($this->stack)->nodeName, + 'type' => HTML5::ENDTAG + ) + ); + + return $this->mainPhase($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr') + ) + ) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inRow($token) + { + $clear = array('tr', 'html'); + + /* A start tag whose tag name is one of: "th", "td" */ + if ($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td') + ) { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in cell". */ + $this->insertElement($token); + $this->mode = self::IN_CELL; + + /* Insert a marker at the end of the list of active formatting + elements. */ + $this->a_formatting[] = self::MARKER; + + /* An end tag whose tag name is "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node (which will be a tr element) from the + stack of open elements. Switch the insertion mode to "in table + body". */ + array_pop($this->stack); + $this->mode = self::IN_TBODY; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* Act as if an end tag with the tag name "tr" had been seen, then, + if that token wasn't ignored, reprocess the current token. */ + $this->inRow( + array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inCell($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead')) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Otherwise, act as if an end tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inRow( + array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inCell($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr') + ) + ) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inCell($token) + { + /* An end tag whose tag name is one of: "td", "th" */ + if ($token['type'] === HTML5::ENDTAG && + ($token['name'] === 'td' || $token['name'] === 'th') + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token, then this is a + parse error and the token must be ignored. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Generate implied end tags, except for elements with the same + tag name as the token. */ + $this->generateImpliedEndTags(array($token['name'])); + + /* Now, if the current node is not an element with the same tag + name as the token, then this is a parse error. */ + // k + + /* Pop elements from this stack until an element with the same + tag name as the token has been popped from the stack. */ + while (true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($node === $token['name']) { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in row". (The current node + will be a tr element at this point.) */ + $this->mode = self::IN_ROW; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if (!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if (!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html') + ) + ) { + /* Parse error. Ignore the token. */ + + /* An end tag whose tag name is one of: "table", "tbody", "tfoot", + "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('table', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token (which can only + happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), + then this is a parse error and the token must be ignored. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inSelect($token) + { + /* Handle the token as follows: */ + + /* A character token */ + if ($token['type'] === HTML5::CHARACTR) { + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token whose tag name is "option" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'option' + ) { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if (end($this->stack)->nodeName === 'option') { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* A start tag token whose tag name is "optgroup" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'optgroup' + ) { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if (end($this->stack)->nodeName === 'option') { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the current node is an optgroup element, act as if an end tag + with the tag name "optgroup" had been seen. */ + if (end($this->stack)->nodeName === 'optgroup') { + $this->inSelect( + array( + 'name' => 'optgroup', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* An end tag token whose tag name is "optgroup" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'optgroup' + ) { + /* First, if the current node is an option element, and the node + immediately before it in the stack of open elements is an optgroup + element, then act as if an end tag with the tag name "option" had + been seen. */ + $elements_in_stack = count($this->stack); + + if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' && + $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup' + ) { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the current node is an optgroup element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if ($this->stack[$elements_in_stack - 1] === 'optgroup') { + array_pop($this->stack); + } + + /* An end tag token whose tag name is "option" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'option' + ) { + /* If the current node is an option element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if (end($this->stack)->nodeName === 'option') { + array_pop($this->stack); + } + + /* An end tag whose tag name is "select" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'select' + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // w/e + + /* Otherwise: */ + } else { + /* Pop elements from the stack of open elements until a select + element has been popped from the stack. */ + while (true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($current === 'select') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* A start tag whose tag name is "select" */ + } elseif ($token['name'] === 'select' && + $token['type'] === HTML5::STARTTAG + ) { + /* Parse error. Act as if the token had been an end tag with the + tag name "select" instead. */ + $this->inSelect( + array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + ) + ); + + /* An end tag whose tag name is one of: "caption", "table", "tbody", + "tfoot", "thead", "tr", "td", "th" */ + } elseif (in_array( + $token['name'], + array( + 'caption', + 'table', + 'tbody', + 'tfoot', + 'thead', + 'tr', + 'td', + 'th' + ) + ) && $token['type'] === HTML5::ENDTAG + ) { + /* Parse error. */ + // w/e + + /* If the stack of open elements has an element in table scope with + the same tag name as that of the token, then act as if an end tag + with the tag name "select" had been seen, and reprocess the token. + Otherwise, ignore the token. */ + if ($this->elementInScope($token['name'], true)) { + $this->inSelect( + array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + ) + ); + + $this->mainPhase($token); + } + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterBody($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Process the token as it would be processed if the insertion mode + was "in body". */ + $this->inBody($token); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the first element in the stack of open + elements (the html element), with the data attribute set to the + data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->stack[0]->appendChild($comment); + + /* An end tag with the tag name "html" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { + /* If the parser was originally created in order to handle the + setting of an element's innerHTML attribute, this is a parse error; + ignore the token. (The element will be an html element in this + case.) (innerHTML case) */ + + /* Otherwise, switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* Anything else */ + } else { + /* Parse error. Set the insertion mode to "in body" and reprocess + the token. */ + $this->mode = self::IN_BODY; + return $this->inBody($token); + } + } + + private function inFrameset($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag with the tag name "frameset" */ + } elseif ($token['name'] === 'frameset' && + $token['type'] === HTML5::STARTTAG + ) { + $this->insertElement($token); + + /* An end tag with the tag name "frameset" */ + } elseif ($token['name'] === 'frameset' && + $token['type'] === HTML5::ENDTAG + ) { + /* If the current node is the root html element, then this is a + parse error; ignore the token. (innerHTML case) */ + if (end($this->stack)->nodeName === 'html') { + // Ignore + + } else { + /* Otherwise, pop the current node from the stack of open + elements. */ + array_pop($this->stack); + + /* If the parser was not originally created in order to handle + the setting of an element's innerHTML attribute (innerHTML case), + and the current node is no longer a frameset element, then change + the insertion mode to "after frameset". */ + $this->mode = self::AFTR_FRAME; + } + + /* A start tag with the tag name "frame" */ + } elseif ($token['name'] === 'frame' && + $token['type'] === HTML5::STARTTAG + ) { + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + + /* A start tag with the tag name "noframes" */ + } elseif ($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG + ) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterFrameset($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* An end tag with the tag name "html" */ + } elseif ($token['name'] === 'html' && + $token['type'] === HTML5::ENDTAG + ) { + /* Switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* A start tag with the tag name "noframes" */ + } elseif ($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG + ) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function trailingEndPhase($token) + { + /* After the main phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Process the token as it would be processed in the main phase. */ + $this->mainPhase($token); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or a start tag token. Or an end tag token. */ + } elseif (($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG + ) { + /* Parse error. Switch back to the main phase and reprocess the + token. */ + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + + /* An end-of-file token */ + } elseif ($token['type'] === HTML5::EOF) { + /* OMG DONE!! */ + } + } + + private function insertElement($token, $append = true, $check = false) + { + // Proprietary workaround for libxml2's limitations with tag names + if ($check) { + // Slightly modified HTML5 tag-name modification, + // removing anything that's not an ASCII letter, digit, or hyphen + $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']); + // Remove leading hyphens and numbers + $token['name'] = ltrim($token['name'], '-0..9'); + // In theory, this should ever be needed, but just in case + if ($token['name'] === '') { + $token['name'] = 'span'; + } // arbitrary generic choice + } + + $el = $this->dom->createElement($token['name']); + + foreach ($token['attr'] as $attr) { + if (!$el->hasAttribute($attr['name'])) { + $el->setAttribute($attr['name'], (string)$attr['value']); + } + } + + $this->appendToRealParent($el); + $this->stack[] = $el; + + return $el; + } + + private function insertText($data) + { + $text = $this->dom->createTextNode($data); + $this->appendToRealParent($text); + } + + private function insertComment($data) + { + $comment = $this->dom->createComment($data); + $this->appendToRealParent($comment); + } + + private function appendToRealParent($node) + { + if ($this->foster_parent === null) { + end($this->stack)->appendChild($node); + + } elseif ($this->foster_parent !== null) { + /* If the foster parent element is the parent element of the + last table element in the stack of open elements, then the new + node must be inserted immediately before the last table element + in the stack of open elements in the foster parent element; + otherwise, the new node must be appended to the foster parent + element. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === 'table' && + $this->stack[$n]->parentNode !== null + ) { + $table = $this->stack[$n]; + break; + } + } + + if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) { + $this->foster_parent->insertBefore($node, $table); + } else { + $this->foster_parent->appendChild($node); + } + + $this->foster_parent = null; + } + } + + private function elementInScope($el, $table = false) + { + if (is_array($el)) { + foreach ($el as $element) { + if ($this->elementInScope($element, $table)) { + return true; + } + } + + return false; + } + + $leng = count($this->stack); + + for ($n = 0; $n < $leng; $n++) { + /* 1. Initialise node to be the current node (the bottommost node of + the stack). */ + $node = $this->stack[$leng - 1 - $n]; + + if ($node->tagName === $el) { + /* 2. If node is the target node, terminate in a match state. */ + return true; + + } elseif ($node->tagName === 'table') { + /* 3. Otherwise, if node is a table element, terminate in a failure + state. */ + return false; + + } elseif ($table === true && in_array( + $node->tagName, + array( + 'caption', + 'td', + 'th', + 'button', + 'marquee', + 'object' + ) + ) + ) { + /* 4. Otherwise, if the algorithm is the "has an element in scope" + variant (rather than the "has an element in table scope" variant), + and node is one of the following, terminate in a failure state. */ + return false; + + } elseif ($node === $node->ownerDocument->documentElement) { + /* 5. Otherwise, if node is an html element (root element), terminate + in a failure state. (This can only happen if the node is the topmost + node of the stack of open elements, and prevents the next step from + being invoked if there are no more elements in the stack.) */ + return false; + } + + /* Otherwise, set node to the previous entry in the stack of open + elements and return to step 2. (This will never fail, since the loop + will always terminate in the previous step if the top of the stack + is reached.) */ + } + } + + private function reconstructActiveFormattingElements() + { + /* 1. If there are no entries in the list of active formatting elements, + then there is nothing to reconstruct; stop this algorithm. */ + $formatting_elements = count($this->a_formatting); + + if ($formatting_elements === 0) { + return false; + } + + /* 3. Let entry be the last (most recently added) element in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. If the last (most recently added) entry in the list of active + formatting elements is a marker, or if it is an element that is in the + stack of open elements, then there is nothing to reconstruct; stop this + algorithm. */ + if ($entry === self::MARKER || in_array($entry, $this->stack, true)) { + return false; + } + + for ($a = $formatting_elements - 1; $a >= 0; true) { + /* 4. If there are no entries before entry in the list of active + formatting elements, then jump to step 8. */ + if ($a === 0) { + $step_seven = false; + break; + } + + /* 5. Let entry be the entry one earlier than entry in the list of + active formatting elements. */ + $a--; + $entry = $this->a_formatting[$a]; + + /* 6. If entry is neither a marker nor an element that is also in + thetack of open elements, go to step 4. */ + if ($entry === self::MARKER || in_array($entry, $this->stack, true)) { + break; + } + } + + while (true) { + /* 7. Let entry be the element one later than entry in the list of + active formatting elements. */ + if (isset($step_seven) && $step_seven === true) { + $a++; + $entry = $this->a_formatting[$a]; + } + + /* 8. Perform a shallow clone of the element entry to obtain clone. */ + $clone = $entry->cloneNode(); + + /* 9. Append clone to the current node and push it onto the stack + of open elements so that it is the new current node. */ + end($this->stack)->appendChild($clone); + $this->stack[] = $clone; + + /* 10. Replace the entry for entry in the list with an entry for + clone. */ + $this->a_formatting[$a] = $clone; + + /* 11. If the entry for clone in the list of active formatting + elements is not the last entry in the list, return to step 7. */ + if (end($this->a_formatting) !== $clone) { + $step_seven = true; + } else { + break; + } + } + } + + private function clearTheActiveFormattingElementsUpToTheLastMarker() + { + /* When the steps below require the UA to clear the list of active + formatting elements up to the last marker, the UA must perform the + following steps: */ + + while (true) { + /* 1. Let entry be the last (most recently added) entry in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. Remove entry from the list of active formatting elements. */ + array_pop($this->a_formatting); + + /* 3. If entry was a marker, then stop the algorithm at this point. + The list has been cleared up to the last marker. */ + if ($entry === self::MARKER) { + break; + } + } + } + + private function generateImpliedEndTags($exclude = array()) + { + /* When the steps below require the UA to generate implied end tags, + then, if the current node is a dd element, a dt element, an li element, + a p element, a td element, a th element, or a tr element, the UA must + act as if an end tag with the respective tag name had been seen and + then generate implied end tags again. */ + $node = end($this->stack); + $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); + + while (in_array(end($this->stack)->nodeName, $elements)) { + array_pop($this->stack); + } + } + + private function getElementCategory($node) + { + $name = $node->tagName; + if (in_array($name, $this->special)) { + return self::SPECIAL; + } elseif (in_array($name, $this->scoping)) { + return self::SCOPING; + } elseif (in_array($name, $this->formatting)) { + return self::FORMATTING; + } else { + return self::PHRASING; + } + } + + private function clearStackToTableContext($elements) + { + /* When the steps above require the UA to clear the stack back to a + table context, it means that the UA must, while the current node is not + a table element or an html element, pop elements from the stack of open + elements. If this causes any elements to be popped from the stack, then + this is a parse error. */ + while (true) { + $node = end($this->stack)->nodeName; + + if (in_array($node, $elements)) { + break; + } else { + array_pop($this->stack); + } + } + } + + private function resetInsertionMode() + { + /* 1. Let last be false. */ + $last = false; + $leng = count($this->stack); + + for ($n = $leng - 1; $n >= 0; $n--) { + /* 2. Let node be the last node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 3. If node is the first node in the stack of open elements, then + set last to true. If the element whose innerHTML attribute is being + set is neither a td element nor a th element, then set node to the + element whose innerHTML attribute is being set. (innerHTML case) */ + if ($this->stack[0]->isSameNode($node)) { + $last = true; + } + + /* 4. If node is a select element, then switch the insertion mode to + "in select" and abort these steps. (innerHTML case) */ + if ($node->nodeName === 'select') { + $this->mode = self::IN_SELECT; + break; + + /* 5. If node is a td or th element, then switch the insertion mode + to "in cell" and abort these steps. */ + } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') { + $this->mode = self::IN_CELL; + break; + + /* 6. If node is a tr element, then switch the insertion mode to + "in row" and abort these steps. */ + } elseif ($node->nodeName === 'tr') { + $this->mode = self::IN_ROW; + break; + + /* 7. If node is a tbody, thead, or tfoot element, then switch the + insertion mode to "in table body" and abort these steps. */ + } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { + $this->mode = self::IN_TBODY; + break; + + /* 8. If node is a caption element, then switch the insertion mode + to "in caption" and abort these steps. */ + } elseif ($node->nodeName === 'caption') { + $this->mode = self::IN_CAPTION; + break; + + /* 9. If node is a colgroup element, then switch the insertion mode + to "in column group" and abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'colgroup') { + $this->mode = self::IN_CGROUP; + break; + + /* 10. If node is a table element, then switch the insertion mode + to "in table" and abort these steps. */ + } elseif ($node->nodeName === 'table') { + $this->mode = self::IN_TABLE; + break; + + /* 11. If node is a head element, then switch the insertion mode + to "in body" ("in body"! not "in head"!) and abort these steps. + (innerHTML case) */ + } elseif ($node->nodeName === 'head') { + $this->mode = self::IN_BODY; + break; + + /* 12. If node is a body element, then switch the insertion mode to + "in body" and abort these steps. */ + } elseif ($node->nodeName === 'body') { + $this->mode = self::IN_BODY; + break; + + /* 13. If node is a frameset element, then switch the insertion + mode to "in frameset" and abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'frameset') { + $this->mode = self::IN_FRAME; + break; + + /* 14. If node is an html element, then: if the head element + pointer is null, switch the insertion mode to "before head", + otherwise, switch the insertion mode to "after head". In either + case, abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'html') { + $this->mode = ($this->head_pointer === null) + ? self::BEFOR_HEAD + : self::AFTER_HEAD; + + break; + + /* 15. If last is true, then set the insertion mode to "in body" + and abort these steps. (innerHTML case) */ + } elseif ($last) { + $this->mode = self::IN_BODY; + break; + } + } + } + + private function closeCell() + { + /* If the stack of open elements has a td or th element in table scope, + then act as if an end tag token with that tag name had been seen. */ + foreach (array('td', 'th') as $cell) { + if ($this->elementInScope($cell, true)) { + $this->inCell( + array( + 'name' => $cell, + 'type' => HTML5::ENDTAG + ) + ); + + break; + } + } + } + + public function save() + { + return $this->dom; + } +} diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php new file mode 100644 index 0000000..3995fec --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php @@ -0,0 +1,49 @@ +data = $data; + $this->line = $line; + $this->col = $col; + } + + public function toTokenPair() { + return array(new HTMLPurifier_Token_Comment($this->data, $this->line, $this->col), null); + } +} diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php new file mode 100644 index 0000000..6cbf56d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php @@ -0,0 +1,59 @@ + form or the form, i.e. + * is it a pair of start/end tokens or an empty token. + * @bool + */ + public $empty = false; + + public $endCol = null, $endLine = null, $endArmor = array(); + + public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) { + $this->name = $name; + $this->attr = $attr; + $this->line = $line; + $this->col = $col; + $this->armor = $armor; + } + + public function toTokenPair() { + // XXX inefficiency here, normalization is not necessary + if ($this->empty) { + return array(new HTMLPurifier_Token_Empty($this->name, $this->attr, $this->line, $this->col, $this->armor), null); + } else { + $start = new HTMLPurifier_Token_Start($this->name, $this->attr, $this->line, $this->col, $this->armor); + $end = new HTMLPurifier_Token_End($this->name, array(), $this->endLine, $this->endCol, $this->endArmor); + //$end->start = $start; + return array($start, $end); + } + } +} + diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php new file mode 100644 index 0000000..aec9166 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php @@ -0,0 +1,54 @@ +data = $data; + $this->is_whitespace = $is_whitespace; + $this->line = $line; + $this->col = $col; + } + + public function toTokenPair() { + return array(new HTMLPurifier_Token_Text($this->data, $this->line, $this->col), null); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php new file mode 100644 index 0000000..18c8bbb --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php @@ -0,0 +1,111 @@ +preserve[$i] = true; + } + for ($i = 65; $i <= 90; $i++) { // upper-case + $this->preserve[$i] = true; + } + for ($i = 97; $i <= 122; $i++) { // lower-case + $this->preserve[$i] = true; + } + $this->preserve[45] = true; // Dash - + $this->preserve[46] = true; // Period . + $this->preserve[95] = true; // Underscore _ + $this->preserve[126]= true; // Tilde ~ + + // extra letters not to escape + if ($preserve !== false) { + for ($i = 0, $c = strlen($preserve); $i < $c; $i++) { + $this->preserve[ord($preserve[$i])] = true; + } + } + } + + /** + * Our replacement for urlencode, it encodes all non-reserved characters, + * as well as any extra characters that were instructed to be preserved. + * @note + * Assumes that the string has already been normalized, making any + * and all percent escape sequences valid. Percents will not be + * re-escaped, regardless of their status in $preserve + * @param string $string String to be encoded + * @return string Encoded string. + */ + public function encode($string) + { + $ret = ''; + for ($i = 0, $c = strlen($string); $i < $c; $i++) { + if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])])) { + $ret .= '%' . sprintf('%02X', $int); + } else { + $ret .= $string[$i]; + } + } + return $ret; + } + + /** + * Fix up percent-encoding by decoding unreserved characters and normalizing. + * @warning This function is affected by $preserve, even though the + * usual desired behavior is for this not to preserve those + * characters. Be careful when reusing instances of PercentEncoder! + * @param string $string String to normalize + * @return string + */ + public function normalize($string) + { + if ($string == '') { + return ''; + } + $parts = explode('%', $string); + $ret = array_shift($parts); + foreach ($parts as $part) { + $length = strlen($part); + if ($length < 2) { + $ret .= '%25' . $part; + continue; + } + $encoding = substr($part, 0, 2); + $text = substr($part, 2); + if (!ctype_xdigit($encoding)) { + $ret .= '%25' . $part; + continue; + } + $int = hexdec($encoding); + if (isset($this->preserve[$int])) { + $ret .= chr($int) . $text; + continue; + } + $encoding = strtoupper($encoding); + $ret .= '%' . $encoding . $text; + } + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php new file mode 100644 index 0000000..549e4ce --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php @@ -0,0 +1,218 @@ +getAll(); + $context = new HTMLPurifier_Context(); + $this->generator = new HTMLPurifier_Generator($config, $context); + } + + /** + * Main function that renders object or aspect of that object + * @note Parameters vary depending on printer + */ + // function render() {} + + /** + * Returns a start tag + * @param string $tag Tag name + * @param array $attr Attribute array + * @return string + */ + protected function start($tag, $attr = array()) + { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) + ); + } + + /** + * Returns an end tag + * @param string $tag Tag name + * @return string + */ + protected function end($tag) + { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_End($tag) + ); + } + + /** + * Prints a complete element with content inside + * @param string $tag Tag name + * @param string $contents Element contents + * @param array $attr Tag attributes + * @param bool $escape whether or not to escape contents + * @return string + */ + protected function element($tag, $contents, $attr = array(), $escape = true) + { + return $this->start($tag, $attr) . + ($escape ? $this->escape($contents) : $contents) . + $this->end($tag); + } + + /** + * @param string $tag + * @param array $attr + * @return string + */ + protected function elementEmpty($tag, $attr = array()) + { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Empty($tag, $attr) + ); + } + + /** + * @param string $text + * @return string + */ + protected function text($text) + { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Text($text) + ); + } + + /** + * Prints a simple key/value row in a table. + * @param string $name Key + * @param mixed $value Value + * @return string + */ + protected function row($name, $value) + { + if (is_bool($value)) { + $value = $value ? 'On' : 'Off'; + } + return + $this->start('tr') . "\n" . + $this->element('th', $name) . "\n" . + $this->element('td', $value) . "\n" . + $this->end('tr'); + } + + /** + * Escapes a string for HTML output. + * @param string $string String to escape + * @return string + */ + protected function escape($string) + { + $string = HTMLPurifier_Encoder::cleanUTF8($string); + $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); + return $string; + } + + /** + * Takes a list of strings and turns them into a single list + * @param string[] $array List of strings + * @param bool $polite Bool whether or not to add an end before the last + * @return string + */ + protected function listify($array, $polite = false) + { + if (empty($array)) { + return 'None'; + } + $ret = ''; + $i = count($array); + foreach ($array as $value) { + $i--; + $ret .= $value; + if ($i > 0 && !($polite && $i == 1)) { + $ret .= ', '; + } + if ($polite && $i == 1) { + $ret .= 'and '; + } + } + return $ret; + } + + /** + * Retrieves the class of an object without prefixes, as well as metadata + * @param object $obj Object to determine class of + * @param string $sec_prefix Further prefix to remove + * @return string + */ + protected function getClass($obj, $sec_prefix = '') + { + static $five = null; + if ($five === null) { + $five = version_compare(PHP_VERSION, '5', '>='); + } + $prefix = 'HTMLPurifier_' . $sec_prefix; + if (!$five) { + $prefix = strtolower($prefix); + } + $class = str_replace($prefix, '', get_class($obj)); + $lclass = strtolower($class); + $class .= '('; + switch ($lclass) { + case 'enum': + $values = array(); + foreach ($obj->valid_values as $value => $bool) { + $values[] = $value; + } + $class .= implode(', ', $values); + break; + case 'css_composite': + $values = array(); + foreach ($obj->defs as $def) { + $values[] = $this->getClass($def, $sec_prefix); + } + $class .= implode(', ', $values); + break; + case 'css_multiple': + $class .= $this->getClass($obj->single, $sec_prefix) . ', '; + $class .= $obj->max; + break; + case 'css_denyelementdecorator': + $class .= $this->getClass($obj->def, $sec_prefix) . ', '; + $class .= $obj->element; + break; + case 'css_importantdecorator': + $class .= $this->getClass($obj->def, $sec_prefix); + if ($obj->allow) { + $class .= ', !important'; + } + break; + } + $class .= ')'; + return $class; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php new file mode 100644 index 0000000..29505fe --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php @@ -0,0 +1,44 @@ +def = $config->getCSSDefinition(); + $ret = ''; + + $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); + $ret .= $this->start('table'); + + $ret .= $this->element('caption', 'Properties ($info)'); + + $ret .= $this->start('thead'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Property', array('class' => 'heavy')); + $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;')); + $ret .= $this->end('tr'); + $ret .= $this->end('thead'); + + ksort($this->def->info); + foreach ($this->def->info as $property => $obj) { + $name = $this->getClass($obj, 'AttrDef_'); + $ret .= $this->row($property, $name); + } + + $ret .= $this->end('table'); + $ret .= $this->end('div'); + + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css new file mode 100644 index 0000000..3ff1a88 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css @@ -0,0 +1,10 @@ + +.hp-config {} + +.hp-config tbody th {text-align:right; padding-right:0.5em;} +.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;} +.hp-config .namespace th {text-align:center;} +.hp-config .verbose {display:none;} +.hp-config .controls {text-align:center;} + +/* vim: et sw=4 sts=4 */ diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js new file mode 100644 index 0000000..cba00c9 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js @@ -0,0 +1,5 @@ +function toggleWriteability(id_of_patient, checked) { + document.getElementById(id_of_patient).disabled = checked; +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php new file mode 100644 index 0000000..4c3ce17 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php @@ -0,0 +1,456 @@ +docURL = $doc_url; + $this->name = $name; + $this->compress = $compress; + // initialize sub-printers + $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); + $this->fields[HTMLPurifier_VarParser::C_BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); + } + + /** + * Sets default column and row size for textareas in sub-printers + * @param $cols Integer columns of textarea, null to use default + * @param $rows Integer rows of textarea, null to use default + */ + public function setTextareaDimensions($cols = null, $rows = null) + { + if ($cols) { + $this->fields['default']->cols = $cols; + } + if ($rows) { + $this->fields['default']->rows = $rows; + } + } + + /** + * Retrieves styling, in case it is not accessible by webserver + */ + public static function getCSS() + { + return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); + } + + /** + * Retrieves JavaScript, in case it is not accessible by webserver + */ + public static function getJavaScript() + { + return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); + } + + /** + * Returns HTML output for a configuration form + * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array + * where [0] has an HTML namespace and [1] is being rendered. + * @param array|bool $allowed Optional namespace(s) and directives to restrict form to. + * @param bool $render_controls + * @return string + */ + public function render($config, $allowed = true, $render_controls = true) + { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + + $this->config = $config; + $this->genConfig = $gen_config; + $this->prepareGenerator($gen_config); + + $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def); + $all = array(); + foreach ($allowed as $key) { + list($ns, $directive) = $key; + $all[$ns][$directive] = $config->get($ns . '.' . $directive); + } + + $ret = ''; + $ret .= $this->start('table', array('class' => 'hp-config')); + $ret .= $this->start('thead'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); + $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); + $ret .= $this->end('tr'); + $ret .= $this->end('thead'); + foreach ($all as $ns => $directives) { + $ret .= $this->renderNamespace($ns, $directives); + } + if ($render_controls) { + $ret .= $this->start('tbody'); + $ret .= $this->start('tr'); + $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); + $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); + $ret .= '[Reset]'; + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders a single namespace + * @param $ns String namespace name + * @param array $directives array of directives to values + * @return string + */ + protected function renderNamespace($ns, $directives) + { + $ret = ''; + $ret .= $this->start('tbody', array('class' => 'namespace')); + $ret .= $this->start('tr'); + $ret .= $this->element('th', $ns, array('colspan' => 2)); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); + $ret .= $this->start('tbody'); + foreach ($directives as $directive => $value) { + $ret .= $this->start('tr'); + $ret .= $this->start('th'); + if ($this->docURL) { + $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); + $ret .= $this->start('a', array('href' => $url)); + } + $attr = array('for' => "{$this->name}:$ns.$directive"); + + // crop directive name if it's too long + if (!$this->compress || (strlen($directive) < $this->compress)) { + $directive_disp = $directive; + } else { + $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; + $attr['title'] = $directive; + } + + $ret .= $this->element( + 'label', + $directive_disp, + // component printers must create an element with this id + $attr + ); + if ($this->docURL) { + $ret .= $this->end('a'); + } + $ret .= $this->end('th'); + + $ret .= $this->start('td'); + $def = $this->config->def->info["$ns.$directive"]; + if (is_int($def)) { + $allow_null = $def < 0; + $type = abs($def); + } else { + $type = $def->type; + $allow_null = isset($def->allow_null); + } + if (!isset($this->fields[$type])) { + $type = 0; + } // default + $type_obj = $this->fields[$type]; + if ($allow_null) { + $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); + } + $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + } + $ret .= $this->end('tbody'); + return $ret; + } + +} + +/** + * Printer decorator for directives that accept null + */ +class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer +{ + /** + * Printer being decorated + * @type HTMLPurifier_Printer + */ + protected $obj; + + /** + * @param HTMLPurifier_Printer $obj Printer to decorate + */ + public function __construct($obj) + { + parent::__construct(); + $this->obj = $obj; + } + + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + + $ret = ''; + $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' Null/Disabled'); + $ret .= $this->end('label'); + $attr = array( + 'type' => 'checkbox', + 'value' => '1', + 'class' => 'null-toggle', + 'name' => "$name" . "[Null_$ns.$directive]", + 'id' => "$name:Null_$ns.$directive", + 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! + ); + if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) { + // modify inline javascript slightly + $attr['onclick'] = + "toggleWriteability('$name:Yes_$ns.$directive',checked);" . + "toggleWriteability('$name:No_$ns.$directive',checked)"; + } + if ($value === null) { + $attr['checked'] = 'checked'; + } + $ret .= $this->elementEmpty('input', $attr); + $ret .= $this->text(' or '); + $ret .= $this->elementEmpty('br'); + $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config)); + return $ret; + } +} + +/** + * Swiss-army knife configuration form field printer + */ +class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer +{ + /** + * @type int + */ + public $cols = 18; + + /** + * @type int + */ + public $rows = 5; + + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + // this should probably be split up a little + $ret = ''; + $def = $config->def->info["$ns.$directive"]; + if (is_int($def)) { + $type = abs($def); + } else { + $type = $def->type; + } + if (is_array($value)) { + switch ($type) { + case HTMLPurifier_VarParser::LOOKUP: + $array = $value; + $value = array(); + foreach ($array as $val => $b) { + $value[] = $val; + } + //TODO does this need a break? + case HTMLPurifier_VarParser::ALIST: + $value = implode(PHP_EOL, $value); + break; + case HTMLPurifier_VarParser::HASH: + $nvalue = ''; + foreach ($value as $i => $v) { + if (is_array($v)) { + // HACK + $v = implode(";", $v); + } + $nvalue .= "$i:$v" . PHP_EOL; + } + $value = $nvalue; + break; + default: + $value = ''; + } + } + if ($type === HTMLPurifier_VarParser::C_MIXED) { + return 'Not supported'; + $value = serialize($value); + } + $attr = array( + 'name' => "$name" . "[$ns.$directive]", + 'id' => "$name:$ns.$directive" + ); + if ($value === null) { + $attr['disabled'] = 'disabled'; + } + if (isset($def->allowed)) { + $ret .= $this->start('select', $attr); + foreach ($def->allowed as $val => $b) { + $attr = array(); + if ($value == $val) { + $attr['selected'] = 'selected'; + } + $ret .= $this->element('option', $val, $attr); + } + $ret .= $this->end('select'); + } elseif ($type === HTMLPurifier_VarParser::TEXT || + $type === HTMLPurifier_VarParser::ITEXT || + $type === HTMLPurifier_VarParser::ALIST || + $type === HTMLPurifier_VarParser::HASH || + $type === HTMLPurifier_VarParser::LOOKUP) { + $attr['cols'] = $this->cols; + $attr['rows'] = $this->rows; + $ret .= $this->start('textarea', $attr); + $ret .= $this->text($value); + $ret .= $this->end('textarea'); + } else { + $attr['value'] = $value; + $attr['type'] = 'text'; + $ret .= $this->elementEmpty('input', $attr); + } + return $ret; + } +} + +/** + * Bool form field printer + */ +class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer +{ + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + $ret = ''; + $ret .= $this->start('div', array('id' => "$name:$ns.$directive")); + + $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' Yes'); + $ret .= $this->end('label'); + + $attr = array( + 'type' => 'radio', + 'name' => "$name" . "[$ns.$directive]", + 'id' => "$name:Yes_$ns.$directive", + 'value' => '1' + ); + if ($value === true) { + $attr['checked'] = 'checked'; + } + if ($value === null) { + $attr['disabled'] = 'disabled'; + } + $ret .= $this->elementEmpty('input', $attr); + + $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' No'); + $ret .= $this->end('label'); + + $attr = array( + 'type' => 'radio', + 'name' => "$name" . "[$ns.$directive]", + 'id' => "$name:No_$ns.$directive", + 'value' => '0' + ); + if ($value === false) { + $attr['checked'] = 'checked'; + } + if ($value === null) { + $attr['disabled'] = 'disabled'; + } + $ret .= $this->elementEmpty('input', $attr); + + $ret .= $this->end('div'); + + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php new file mode 100644 index 0000000..ae86391 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php @@ -0,0 +1,324 @@ +config =& $config; + + $this->def = $config->getHTMLDefinition(); + + $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); + + $ret .= $this->renderDoctype(); + $ret .= $this->renderEnvironment(); + $ret .= $this->renderContentSets(); + $ret .= $this->renderInfo(); + + $ret .= $this->end('div'); + + return $ret; + } + + /** + * Renders the Doctype table + * @return string + */ + protected function renderDoctype() + { + $doctype = $this->def->doctype; + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Doctype'); + $ret .= $this->row('Name', $doctype->name); + $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No'); + $ret .= $this->row('Default Modules', implode(', ', $doctype->modules)); + $ret .= $this->row('Default Tidy Modules', implode(', ', $doctype->tidyModules)); + $ret .= $this->end('table'); + return $ret; + } + + + /** + * Renders environment table, which is miscellaneous info + * @return string + */ + protected function renderEnvironment() + { + $def = $this->def; + + $ret = ''; + + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Environment'); + + $ret .= $this->row('Parent of fragment', $def->info_parent); + $ret .= $this->renderChildren($def->info_parent_def->child); + $ret .= $this->row('Block wrap name', $def->info_block_wrapper); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Global attributes'); + $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr), null, 0); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Tag transforms'); + $list = array(); + foreach ($def->info_tag_transform as $old => $new) { + $new = $this->getClass($new, 'TagTransform_'); + $list[] = "<$old> with $new"; + } + $ret .= $this->element('td', $this->listify($list)); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); + $ret .= $this->end('tr'); + + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders the Content Sets table + * @return string + */ + protected function renderContentSets() + { + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Content Sets'); + foreach ($this->def->info_content_sets as $name => $lookup) { + $ret .= $this->heavyHeader($name); + $ret .= $this->start('tr'); + $ret .= $this->element('td', $this->listifyTagLookup($lookup)); + $ret .= $this->end('tr'); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders the Elements ($info) table + * @return string + */ + protected function renderInfo() + { + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Elements ($info)'); + ksort($this->def->info); + $ret .= $this->heavyHeader('Allowed tags', 2); + $ret .= $this->start('tr'); + $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2)); + $ret .= $this->end('tr'); + foreach ($this->def->info as $name => $def) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', "<$name>", array('class' => 'heavy', 'colspan' => 2)); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Inline content'); + $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); + $ret .= $this->end('tr'); + if (!empty($def->excludes)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Excludes'); + $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); + $ret .= $this->end('tr'); + } + if (!empty($def->attr_transform_pre)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); + $ret .= $this->end('tr'); + } + if (!empty($def->attr_transform_post)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); + $ret .= $this->end('tr'); + } + if (!empty($def->auto_close)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Auto closed by'); + $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); + $ret .= $this->end('tr'); + } + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Allowed attributes'); + $ret .= $this->element('td', $this->listifyAttr($def->attr), array(), 0); + $ret .= $this->end('tr'); + + if (!empty($def->required_attr)) { + $ret .= $this->row('Required attributes', $this->listify($def->required_attr)); + } + + $ret .= $this->renderChildren($def->child); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders a row describing the allowed children of an element + * @param HTMLPurifier_ChildDef $def HTMLPurifier_ChildDef of pertinent element + * @return string + */ + protected function renderChildren($def) + { + $context = new HTMLPurifier_Context(); + $ret = ''; + $ret .= $this->start('tr'); + $elements = array(); + $attr = array(); + if (isset($def->elements)) { + if ($def->type == 'strictblockquote') { + $def->validateChildren(array(), $this->config, $context); + } + $elements = $def->elements; + } + if ($def->type == 'chameleon') { + $attr['rowspan'] = 2; + } elseif ($def->type == 'empty') { + $elements = array(); + } elseif ($def->type == 'table') { + $elements = array_flip( + array( + 'col', + 'caption', + 'colgroup', + 'thead', + 'tfoot', + 'tbody', + 'tr' + ) + ); + } + $ret .= $this->element('th', 'Allowed children', $attr); + + if ($def->type == 'chameleon') { + + $ret .= $this->element( + 'td', + 'Block: ' . + $this->escape($this->listifyTagLookup($def->block->elements)), + null, + 0 + ); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element( + 'td', + 'Inline: ' . + $this->escape($this->listifyTagLookup($def->inline->elements)), + null, + 0 + ); + + } elseif ($def->type == 'custom') { + + $ret .= $this->element( + 'td', + '' . ucfirst($def->type) . ': ' . + $def->dtd_regex + ); + + } else { + $ret .= $this->element( + 'td', + '' . ucfirst($def->type) . ': ' . + $this->escape($this->listifyTagLookup($elements)), + null, + 0 + ); + } + $ret .= $this->end('tr'); + return $ret; + } + + /** + * Listifies a tag lookup table. + * @param array $array Tag lookup array in form of array('tagname' => true) + * @return string + */ + protected function listifyTagLookup($array) + { + ksort($array); + $list = array(); + foreach ($array as $name => $discard) { + if ($name !== '#PCDATA' && !isset($this->def->info[$name])) { + continue; + } + $list[] = $name; + } + return $this->listify($list); + } + + /** + * Listifies a list of objects by retrieving class names and internal state + * @param array $array List of objects + * @return string + * @todo Also add information about internal state + */ + protected function listifyObjectList($array) + { + ksort($array); + $list = array(); + foreach ($array as $obj) { + $list[] = $this->getClass($obj, 'AttrTransform_'); + } + return $this->listify($list); + } + + /** + * Listifies a hash of attributes to AttrDef classes + * @param array $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) + * @return string + */ + protected function listifyAttr($array) + { + ksort($array); + $list = array(); + foreach ($array as $name => $obj) { + if ($obj === false) { + continue; + } + $list[] = "$name = " . $this->getClass($obj, 'AttrDef_') . ''; + } + return $this->listify($list); + } + + /** + * Creates a heavy header row + * @param string $text + * @param int $num + * @return string + */ + protected function heavyHeader($text, $num = 1) + { + $ret = ''; + $ret .= $this->start('tr'); + $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy')); + $ret .= $this->end('tr'); + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php new file mode 100644 index 0000000..189348f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php @@ -0,0 +1,122 @@ +parent = $parent; + } + + /** + * Recursively retrieves the value for a key + * @param string $name + * @throws HTMLPurifier_Exception + */ + public function get($name) + { + if ($this->has($name)) { + return $this->data[$name]; + } + // possible performance bottleneck, convert to iterative if necessary + if ($this->parent) { + return $this->parent->get($name); + } + throw new HTMLPurifier_Exception("Key '$name' not found"); + } + + /** + * Sets the value of a key, for this plist + * @param string $name + * @param mixed $value + */ + public function set($name, $value) + { + $this->data[$name] = $value; + } + + /** + * Returns true if a given key exists + * @param string $name + * @return bool + */ + public function has($name) + { + return array_key_exists($name, $this->data); + } + + /** + * Resets a value to the value of it's parent, usually the default. If + * no value is specified, the entire plist is reset. + * @param string $name + */ + public function reset($name = null) + { + if ($name == null) { + $this->data = array(); + } else { + unset($this->data[$name]); + } + } + + /** + * Squashes this property list and all of its property lists into a single + * array, and returns the array. This value is cached by default. + * @param bool $force If true, ignores the cache and regenerates the array. + * @return array + */ + public function squash($force = false) + { + if ($this->cache !== null && !$force) { + return $this->cache; + } + if ($this->parent) { + return $this->cache = array_merge($this->parent->squash($force), $this->data); + } else { + return $this->cache = $this->data; + } + } + + /** + * Returns the parent plist. + * @return HTMLPurifier_PropertyList + */ + public function getParent() + { + return $this->parent; + } + + /** + * Sets the parent plist. + * @param HTMLPurifier_PropertyList $plist Parent plist + */ + public function setParent($plist) + { + $this->parent = $plist; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php new file mode 100644 index 0000000..f68fc8c --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php @@ -0,0 +1,43 @@ +l = strlen($filter); + $this->filter = $filter; + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function accept() + { + $key = $this->getInnerIterator()->key(); + if (strncmp($key, $this->filter, $this->l) !== 0) { + return false; + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php new file mode 100644 index 0000000..f58db90 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php @@ -0,0 +1,56 @@ +input = $input; + $this->output = array(); + } + + /** + * Shifts an element off the front of the queue. + */ + public function shift() { + if (empty($this->output)) { + $this->output = array_reverse($this->input); + $this->input = array(); + } + if (empty($this->output)) { + return NULL; + } + return array_pop($this->output); + } + + /** + * Pushes an element onto the front of the queue. + */ + public function push($x) { + array_push($this->input, $x); + } + + /** + * Checks if it's empty. + */ + public function isEmpty() { + return empty($this->input) && empty($this->output); + } +} diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php new file mode 100644 index 0000000..e1ff3b7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php @@ -0,0 +1,26 @@ +strategies as $strategy) { + $tokens = $strategy->execute($tokens, $config, $context); + } + return $tokens; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php new file mode 100644 index 0000000..4414c17 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php @@ -0,0 +1,17 @@ +strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements(); + $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed(); + $this->strategies[] = new HTMLPurifier_Strategy_FixNesting(); + $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes(); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php new file mode 100644 index 0000000..f193933 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php @@ -0,0 +1,181 @@ +getHTMLDefinition(); + + $excludes_enabled = !$config->get('Core.DisableExcludes'); + + // setup the context variable 'IsInline', for chameleon processing + // is 'false' when we are not inline, 'true' when it must always + // be inline, and an integer when it is inline for a certain + // branch of the document tree + $is_inline = $definition->info_parent_def->descendants_are_inline; + $context->register('IsInline', $is_inline); + + // setup error collector + $e =& $context->get('ErrorCollector', true); + + //####################################################################// + // Loop initialization + + // stack that contains all elements that are excluded + // it is organized by parent elements, similar to $stack, + // but it is only populated when an element with exclusions is + // processed, i.e. there won't be empty exclusions. + $exclude_stack = array($definition->info_parent_def->excludes); + + // variable that contains the start token while we are processing + // nodes. This enables error reporting to do its job + $node = $top_node; + // dummy token + list($token, $d) = $node->toTokenPair(); + $context->register('CurrentNode', $node); + $context->register('CurrentToken', $token); + + //####################################################################// + // Loop + + // We need to implement a post-order traversal iteratively, to + // avoid running into stack space limits. This is pretty tricky + // to reason about, so we just manually stack-ify the recursive + // variant: + // + // function f($node) { + // foreach ($node->children as $child) { + // f($child); + // } + // validate($node); + // } + // + // Thus, we will represent a stack frame as array($node, + // $is_inline, stack of children) + // e.g. array_reverse($node->children) - already processed + // children. + + $parent_def = $definition->info_parent_def; + $stack = array( + array($top_node, + $parent_def->descendants_are_inline, + $parent_def->excludes, // exclusions + 0) + ); + + while (!empty($stack)) { + list($node, $is_inline, $excludes, $ix) = array_pop($stack); + // recursive call + $go = false; + $def = empty($stack) ? $definition->info_parent_def : $definition->info[$node->name]; + while (isset($node->children[$ix])) { + $child = $node->children[$ix++]; + if ($child instanceof HTMLPurifier_Node_Element) { + $go = true; + $stack[] = array($node, $is_inline, $excludes, $ix); + $stack[] = array($child, + // ToDo: I don't think it matters if it's def or + // child_def, but double check this... + $is_inline || $def->descendants_are_inline, + empty($def->excludes) ? $excludes + : array_merge($excludes, $def->excludes), + 0); + break; + } + }; + if ($go) continue; + list($token, $d) = $node->toTokenPair(); + // base case + if ($excludes_enabled && isset($excludes[$node->name])) { + $node->dead = true; + if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); + } else { + // XXX I suppose it would be slightly more efficient to + // avoid the allocation here and have children + // strategies handle it + $children = array(); + foreach ($node->children as $child) { + if (!$child->dead) $children[] = $child; + } + $result = $def->child->validateChildren($children, $config, $context); + if ($result === true) { + // nop + $node->children = $children; + } elseif ($result === false) { + $node->dead = true; + if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); + } else { + $node->children = $result; + if ($e) { + // XXX This will miss mutations of internal nodes. Perhaps defer to the child validators + if (empty($result) && !empty($children)) { + $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); + } else if ($result != $children) { + $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); + } + } + } + } + } + + //####################################################################// + // Post-processing + + // remove context variables + $context->destroy('IsInline'); + $context->destroy('CurrentNode'); + $context->destroy('CurrentToken'); + + //####################################################################// + // Return + + return HTMLPurifier_Arborize::flatten($node, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php new file mode 100644 index 0000000..f65e352 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php @@ -0,0 +1,659 @@ +getHTMLDefinition(); + + // local variables + $generator = new HTMLPurifier_Generator($config, $context); + $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); + // used for autoclose early abortion + $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config); + $e = $context->get('ErrorCollector', true); + $i = false; // injector index + list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens); + if ($token === NULL) { + return array(); + } + $reprocess = false; // whether or not to reprocess the same token + $stack = array(); + + // member variables + $this->stack =& $stack; + $this->tokens =& $tokens; + $this->token =& $token; + $this->zipper =& $zipper; + $this->config = $config; + $this->context = $context; + + // context variables + $context->register('CurrentNesting', $stack); + $context->register('InputZipper', $zipper); + $context->register('CurrentToken', $token); + + // -- begin INJECTOR -- + + $this->injectors = array(); + + $injectors = $config->getBatch('AutoFormat'); + $def_injectors = $definition->info_injector; + $custom_injectors = $injectors['Custom']; + unset($injectors['Custom']); // special case + foreach ($injectors as $injector => $b) { + // XXX: Fix with a legitimate lookup table of enabled filters + if (strpos($injector, '.') !== false) { + continue; + } + $injector = "HTMLPurifier_Injector_$injector"; + if (!$b) { + continue; + } + $this->injectors[] = new $injector; + } + foreach ($def_injectors as $injector) { + // assumed to be objects + $this->injectors[] = $injector; + } + foreach ($custom_injectors as $injector) { + if (!$injector) { + continue; + } + if (is_string($injector)) { + $injector = "HTMLPurifier_Injector_$injector"; + $injector = new $injector; + } + $this->injectors[] = $injector; + } + + // give the injectors references to the definition and context + // variables for performance reasons + foreach ($this->injectors as $ix => $injector) { + $error = $injector->prepare($config, $context); + if (!$error) { + continue; + } + array_splice($this->injectors, $ix, 1); // rm the injector + trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING); + } + + // -- end INJECTOR -- + + // a note on reprocessing: + // In order to reduce code duplication, whenever some code needs + // to make HTML changes in order to make things "correct", the + // new HTML gets sent through the purifier, regardless of its + // status. This means that if we add a start token, because it + // was totally necessary, we don't have to update nesting; we just + // punt ($reprocess = true; continue;) and it does that for us. + + // isset is in loop because $tokens size changes during loop exec + for (;; + // only increment if we don't need to reprocess + $reprocess ? $reprocess = false : $token = $zipper->next($token)) { + + // check for a rewind + if (is_int($i)) { + // possibility: disable rewinding if the current token has a + // rewind set on it already. This would offer protection from + // infinite loop, but might hinder some advanced rewinding. + $rewind_offset = $this->injectors[$i]->getRewindOffset(); + if (is_int($rewind_offset)) { + for ($j = 0; $j < $rewind_offset; $j++) { + if (empty($zipper->front)) break; + $token = $zipper->prev($token); + // indicate that other injectors should not process this token, + // but we need to reprocess it. See Note [Injector skips] + unset($token->skip[$i]); + $token->rewind = $i; + if ($token instanceof HTMLPurifier_Token_Start) { + array_pop($this->stack); + } elseif ($token instanceof HTMLPurifier_Token_End) { + $this->stack[] = $token->start; + } + } + } + $i = false; + } + + // handle case of document end + if ($token === NULL) { + // kill processing if stack is empty + if (empty($this->stack)) { + break; + } + + // peek + $top_nesting = array_pop($this->stack); + $this->stack[] = $top_nesting; + + // send error [TagClosedSuppress] + if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting); + } + + // append, don't splice, since this is the end + $token = new HTMLPurifier_Token_End($top_nesting->name); + + // punt! + $reprocess = true; + continue; + } + + //echo '
'; printZipper($zipper, $token);//printTokens($this->stack); + //flush(); + + // quick-check: if it's not a tag, no need to process + if (empty($token->is_tag)) { + if ($token instanceof HTMLPurifier_Token_Text) { + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) { + // See Note [Injector skips] + continue; + } + if ($token->rewind !== null && $token->rewind !== $i) { + continue; + } + // XXX fuckup + $r = $token; + $injector->handleText($r); + $token = $this->processToken($r, $i); + $reprocess = true; + break; + } + } + // another possibility is a comment + continue; + } + + if (isset($definition->info[$token->name])) { + $type = $definition->info[$token->name]->child->type; + } else { + $type = false; // Type is unknown, treat accordingly + } + + // quick tag checks: anything that's *not* an end tag + $ok = false; + if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) { + // claims to be a start tag but is empty + $token = new HTMLPurifier_Token_Empty( + $token->name, + $token->attr, + $token->line, + $token->col, + $token->armor + ); + $ok = true; + } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) { + // claims to be empty but really is a start tag + // NB: this assignment is required + $old_token = $token; + $token = new HTMLPurifier_Token_End($token->name); + $token = $this->insertBefore( + new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor) + ); + // punt (since we had to modify the input stream in a non-trivial way) + $reprocess = true; + continue; + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + // real empty token + $ok = true; + } elseif ($token instanceof HTMLPurifier_Token_Start) { + // start tag + + // ...unless they also have to close their parent + if (!empty($this->stack)) { + + // Performance note: you might think that it's rather + // inefficient, recalculating the autoclose information + // for every tag that a token closes (since when we + // do an autoclose, we push a new token into the + // stream and then /process/ that, before + // re-processing this token.) But this is + // necessary, because an injector can make an + // arbitrary transformations to the autoclosing + // tokens we introduce, so things may have changed + // in the meantime. Also, doing the inefficient thing is + // "easy" to reason about (for certain perverse definitions + // of "easy") + + $parent = array_pop($this->stack); + $this->stack[] = $parent; + + $parent_def = null; + $parent_elements = null; + $autoclose = false; + if (isset($definition->info[$parent->name])) { + $parent_def = $definition->info[$parent->name]; + $parent_elements = $parent_def->child->getAllowedElements($config); + $autoclose = !isset($parent_elements[$token->name]); + } + + if ($autoclose && $definition->info[$token->name]->wrap) { + // Check if an element can be wrapped by another + // element to make it valid in a context (for + // example,

+ foreach ($definition->info[$token->name]->attr_transform_pre as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + } + + // create alias to this element's attribute definition array, see + // also $d_defs (global attribute definition array) + // DEFINITION CALL + $defs = $definition->info[$token->name]->attr; + + $attr_key = false; + $context->register('CurrentAttr', $attr_key); + + // iterate through all the attribute keypairs + // Watch out for name collisions: $key has previously been used + foreach ($attr as $attr_key => $value) { + + // call the definition + if (isset($defs[$attr_key])) { + // there is a local definition defined + if ($defs[$attr_key] === false) { + // We've explicitly been told not to allow this element. + // This is usually when there's a global definition + // that must be overridden. + // Theoretically speaking, we could have a + // AttrDef_DenyAll, but this is faster! + $result = false; + } else { + // validate according to the element's definition + $result = $defs[$attr_key]->validate( + $value, + $config, + $context + ); + } + } elseif (isset($d_defs[$attr_key])) { + // there is a global definition defined, validate according + // to the global definition + $result = $d_defs[$attr_key]->validate( + $value, + $config, + $context + ); + } else { + // system never heard of the attribute? DELETE! + $result = false; + } + + // put the results into effect + if ($result === false || $result === null) { + // this is a generic error message that should replaced + // with more specific ones when possible + if ($e) { + $e->send(E_ERROR, 'AttrValidator: Attribute removed'); + } + + // remove the attribute + unset($attr[$attr_key]); + } elseif (is_string($result)) { + // generally, if a substitution is happening, there + // was some sort of implicit correction going on. We'll + // delegate it to the attribute classes to say exactly what. + + // simple substitution + $attr[$attr_key] = $result; + } else { + // nothing happens + } + + // we'd also want slightly more complicated substitution + // involving an array as the return value, + // although we're not sure how colliding attributes would + // resolve (certain ones would be completely overridden, + // others would prepend themselves). + } + + $context->destroy('CurrentAttr'); + + // post transforms + + // global (error reporting untested) + foreach ($definition->info_attr_transform_post as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + } + + // local (error reporting untested) + foreach ($definition->info[$token->name]->attr_transform_post as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + } + + $token->attr = $attr; + + // destroy CurrentToken if we made it ourselves + if (!$current_token) { + $context->destroy('CurrentToken'); + } + + } + + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php new file mode 100644 index 0000000..8805ecc --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php @@ -0,0 +1,91 @@ + +if (!defined('PHP_EOL')) { + switch (strtoupper(substr(PHP_OS, 0, 3))) { + case 'WIN': + define('PHP_EOL', "\r\n"); + break; + case 'DAR': + define('PHP_EOL', "\r"); + break; + default: + define('PHP_EOL', "\n"); + } +} + +/** + * Bootstrap class that contains meta-functionality for HTML Purifier such as + * the autoload function. + * + * @note + * This class may be used without any other files from HTML Purifier. + */ +class HTMLPurifier_Bootstrap +{ + + /** + * Autoload function for HTML Purifier + * @param string $class Class to load + * @return bool + */ + public static function autoload($class) + { + $file = HTMLPurifier_Bootstrap::getPath($class); + if (!$file) { + return false; + } + // Technically speaking, it should be ok and more efficient to + // just do 'require', but Antonio Parraga reports that with + // Zend extensions such as Zend debugger and APC, this invariant + // may be broken. Since we have efficient alternatives, pay + // the cost here and avoid the bug. + require_once HTMLPURIFIER_PREFIX . '/' . $file; + return true; + } + + /** + * Returns the path for a specific class. + * @param string $class Class path to get + * @return string + */ + public static function getPath($class) + { + if (strncmp('HTMLPurifier', $class, 12) !== 0) { + return false; + } + // Custom implementations + if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) { + $code = str_replace('_', '-', substr($class, 22)); + $file = 'HTMLPurifier/Language/classes/' . $code . '.php'; + } else { + $file = str_replace('_', '/', $class) . '.php'; + } + if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) { + return false; + } + return $file; + } + + /** + * "Pre-registers" our autoloader on the SPL stack. + */ + public static function registerAutoload() + { + $autoload = array('HTMLPurifier_Bootstrap', 'autoload'); + if (spl_autoload_functions() === false) { + spl_autoload_register($autoload); + } else { + // prepend flag exists, no need for shenanigans + spl_autoload_register($autoload, true, true); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php new file mode 100644 index 0000000..923d6f3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php @@ -0,0 +1,570 @@ +info['text-align'] = new HTMLPurifier_AttrDef_Enum( + ['left', 'right', 'center', 'justify'], + false + ); + + $this->info['direction'] = new HTMLPurifier_AttrDef_Enum( + ['ltr', 'rtl'], + false + ); + + $border_style = + $this->info['border-bottom-style'] = + $this->info['border-right-style'] = + $this->info['border-left-style'] = + $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( + [ + 'none', + 'hidden', + 'dotted', + 'dashed', + 'solid', + 'double', + 'groove', + 'ridge', + 'inset', + 'outset' + ], + false + ); + + $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); + + $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( + ['none', 'left', 'right', 'both'], + false + ); + $this->info['float'] = new HTMLPurifier_AttrDef_Enum( + ['none', 'left', 'right'], + false + ); + $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( + ['normal', 'italic', 'oblique'], + false + ); + $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( + ['normal', 'small-caps'], + false + ); + + $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum(['none']), + new HTMLPurifier_AttrDef_CSS_URI() + ] + ); + + $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( + ['inside', 'outside'], + false + ); + $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( + [ + 'disc', + 'circle', + 'square', + 'decimal', + 'lower-roman', + 'upper-roman', + 'lower-alpha', + 'upper-alpha', + 'none' + ], + false + ); + $this->info['list-style-image'] = $uri_or_none; + + $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); + + $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( + ['capitalize', 'uppercase', 'lowercase', 'none'], + false + ); + $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + $this->info['background-image'] = $uri_or_none; + $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( + ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'] + ); + $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( + ['scroll', 'fixed'] + ); + $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); + + $this->info['background-size'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum( + [ + 'auto', + 'cover', + 'contain', + ] + ), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_CSS_Length() + ] + ); + + $border_color = + $this->info['border-top-color'] = + $this->info['border-bottom-color'] = + $this->info['border-left-color'] = + $this->info['border-right-color'] = + $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum(['transparent']), + new HTMLPurifier_AttrDef_CSS_Color() + ] + ); + + $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); + + $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); + + $border_width = + $this->info['border-top-width'] = + $this->info['border-bottom-width'] = + $this->info['border-left-width'] = + $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum(['thin', 'medium', 'thick']), + new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative + ] + ); + + $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); + + $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum(['normal']), + new HTMLPurifier_AttrDef_CSS_Length() + ] + ); + + $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum(['normal']), + new HTMLPurifier_AttrDef_CSS_Length() + ] + ); + + $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum( + [ + 'xx-small', + 'x-small', + 'small', + 'medium', + 'large', + 'x-large', + 'xx-large', + 'larger', + 'smaller' + ] + ), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_CSS_Length() + ] + ); + + $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum(['normal']), + new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true) + ] + ); + + $margin = + $this->info['margin-top'] = + $this->info['margin-bottom'] = + $this->info['margin-left'] = + $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(['auto']) + ] + ); + + $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); + + // non-negative + $padding = + $this->info['padding-top'] = + $this->info['padding-bottom'] = + $this->info['padding-left'] = + $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true) + ] + ); + + $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); + + $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage() + ] + ); + + $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true), + new HTMLPurifier_AttrDef_Enum(['auto']) + ] + ); + $trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true), + ] + ); + $trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true), + new HTMLPurifier_AttrDef_Enum(['none']) + ] + ); + $max = $config->get('CSS.MaxImgLength'); + + $this->info['width'] = + $this->info['height'] = + $max === null ? + $trusted_wh : + new HTMLPurifier_AttrDef_Switch( + 'img', + // For img tags: + new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length('0', $max), + new HTMLPurifier_AttrDef_Enum(['auto']) + ] + ), + // For everyone else: + $trusted_wh + ); + $this->info['min-width'] = + $this->info['min-height'] = + $max === null ? + $trusted_min_wh : + new HTMLPurifier_AttrDef_Switch( + 'img', + // For img tags: + new HTMLPurifier_AttrDef_CSS_Length('0', $max), + // For everyone else: + $trusted_min_wh + ); + $this->info['max-width'] = + $this->info['max-height'] = + $max === null ? + $trusted_max_wh : + new HTMLPurifier_AttrDef_Switch( + 'img', + // For img tags: + new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length('0', $max), + new HTMLPurifier_AttrDef_Enum(['none']) + ] + ), + // For everyone else: + $trusted_max_wh + ); + + $this->info['aspect-ratio'] = new HTMLPurifier_AttrDef_CSS_Multiple( + new HTMLPurifier_AttrDef_CSS_Composite([ + new HTMLPurifier_AttrDef_CSS_Ratio(), + new HTMLPurifier_AttrDef_Enum(['auto']), + ]) + ); + + // text-decoration and related shorthands + $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); + + $this->info['text-decoration-line'] = new HTMLPurifier_AttrDef_Enum( + ['none', 'underline', 'overline', 'line-through'] + ); + + $this->info['text-decoration-style'] = new HTMLPurifier_AttrDef_Enum( + ['solid', 'double', 'dotted', 'dashed', 'wavy'] + ); + + $this->info['text-decoration-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + $this->info['text-decoration-thickness'] = new HTMLPurifier_AttrDef_CSS_Composite([ + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(['auto', 'from-font']) + ]); + + $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); + + // this could use specialized code + $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( + [ + 'normal', + 'bold', + 'bolder', + 'lighter', + '100', + '200', + '300', + '400', + '500', + '600', + '700', + '800', + '900' + ], + false + ); + + // MUST be called after other font properties, as it references + // a CSSDefinition object + $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); + + // same here + $this->info['border'] = + $this->info['border-bottom'] = + $this->info['border-top'] = + $this->info['border-left'] = + $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); + + $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum( + ['collapse', 'separate'] + ); + + $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum( + ['top', 'bottom'] + ); + + $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum( + ['auto', 'fixed'] + ); + + $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Enum( + [ + 'baseline', + 'sub', + 'super', + 'top', + 'text-top', + 'middle', + 'bottom', + 'text-bottom' + ] + ), + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage() + ] + ); + + $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); + + // These CSS properties don't work on many browsers, but we live + // in THE FUTURE! + $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum( + ['nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line'] + ); + + if ($config->get('CSS.Proprietary')) { + $this->doSetupProprietary($config); + } + + if ($config->get('CSS.AllowTricky')) { + $this->doSetupTricky($config); + } + + if ($config->get('CSS.Trusted')) { + $this->doSetupTrusted($config); + } + + $allow_important = $config->get('CSS.AllowImportant'); + // wrap all attr-defs with decorator that handles !important + foreach ($this->info as $k => $v) { + $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important); + } + + $this->setupConfigStuff($config); + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupProprietary($config) + { + // Internet Explorer only scrollbar colors + $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + // vendor specific prefixes of opacity + $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + + // only opacity, for now + $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); + + // more CSS3 + $this->info['page-break-after'] = + $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( + [ + 'auto', + 'always', + 'avoid', + 'left', + 'right' + ] + ); + $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(['auto', 'avoid']); + + $border_radius = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative + new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative + ]); + + $this->info['border-top-left-radius'] = + $this->info['border-top-right-radius'] = + $this->info['border-bottom-right-radius'] = + $this->info['border-bottom-left-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 2); + // TODO: support SLASH syntax + $this->info['border-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 4); + + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupTricky($config) + { + $this->info['display'] = new HTMLPurifier_AttrDef_Enum( + [ + 'inline', + 'block', + 'list-item', + 'run-in', + 'compact', + 'marker', + 'table', + 'inline-block', + 'inline-table', + 'table-row-group', + 'table-header-group', + 'table-footer-group', + 'table-row', + 'table-column-group', + 'table-column', + 'table-cell', + 'table-caption', + 'none' + ] + ); + $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum( + ['visible', 'hidden', 'collapse'] + ); + $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(['visible', 'hidden', 'auto', 'scroll']); + $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupTrusted($config) + { + $this->info['position'] = new HTMLPurifier_AttrDef_Enum( + ['static', 'relative', 'absolute', 'fixed'] + ); + $this->info['top'] = + $this->info['left'] = + $this->info['right'] = + $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(['auto']), + ] + ); + $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite( + [ + new HTMLPurifier_AttrDef_Integer(), + new HTMLPurifier_AttrDef_Enum(['auto']), + ] + ); + } + + /** + * Performs extra config-based processing. Based off of + * HTMLPurifier_HTMLDefinition. + * @param HTMLPurifier_Config $config + * @todo Refactor duplicate elements into common class (probably using + * composition, not inheritance). + */ + protected function setupConfigStuff($config) + { + // setup allowed elements + $support = "(for information on implementing this, see the " . + "support forums) "; + $allowed_properties = $config->get('CSS.AllowedProperties'); + if ($allowed_properties !== null) { + foreach ($this->info as $name => $d) { + if (!isset($allowed_properties[$name])) { + unset($this->info[$name]); + } + unset($allowed_properties[$name]); + } + // emit errors + foreach ($allowed_properties as $name => $d) { + // :TODO: Is this htmlspecialchars() call really necessary? + $name = htmlspecialchars($name); + trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING); + } + } + + $forbidden_properties = $config->get('CSS.ForbiddenProperties'); + if ($forbidden_properties !== null) { + foreach ($this->info as $name => $d) { + if (isset($forbidden_properties[$name])) { + unset($this->info[$name]); + } + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php new file mode 100644 index 0000000..8eb17b8 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php @@ -0,0 +1,52 @@ +elements; + } + + /** + * Validates nodes according to definition and returns modification. + * + * @param HTMLPurifier_Node[] $children Array of HTMLPurifier_Node + * @param HTMLPurifier_Config $config HTMLPurifier_Config object + * @param HTMLPurifier_Context $context HTMLPurifier_Context object + * @return bool|array true to leave nodes as is, false to remove parent node, array of replacement children + */ + abstract public function validateChildren($children, $config, $context); +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php new file mode 100644 index 0000000..7439be2 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php @@ -0,0 +1,67 @@ +inline = new HTMLPurifier_ChildDef_Optional($inline); + $this->block = new HTMLPurifier_ChildDef_Optional($block); + $this->elements = $this->block->elements; + } + + /** + * @param HTMLPurifier_Node[] $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function validateChildren($children, $config, $context) + { + if ($context->get('IsInline') === false) { + return $this->block->validateChildren( + $children, + $config, + $context + ); + } else { + return $this->inline->validateChildren( + $children, + $config, + $context + ); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php new file mode 100644 index 0000000..f515888 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php @@ -0,0 +1,102 @@ +dtd_regex = $dtd_regex; + $this->_compileRegex(); + } + + /** + * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex) + */ + protected function _compileRegex() + { + $raw = str_replace(' ', '', $this->dtd_regex); + if ($raw[0] != '(') { + $raw = "($raw)"; + } + $el = '[#a-zA-Z0-9_.-]+'; + $reg = $raw; + + // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M + // DOING! Seriously: if there's problems, please report them. + + // collect all elements into the $elements array + preg_match_all("/$el/", $reg, $matches); + foreach ($matches[0] as $match) { + $this->elements[$match] = true; + } + + // setup all elements as parentheticals with leading commas + $reg = preg_replace("/$el/", '(,\\0)', $reg); + + // remove commas when they were not solicited + $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg); + + // remove all non-paranthetical commas: they are handled by first regex + $reg = preg_replace("/,\(/", '(', $reg); + + $this->_pcre_regex = $reg; + } + + /** + * @param HTMLPurifier_Node[] $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function validateChildren($children, $config, $context) + { + $list_of_children = ''; + $nesting = 0; // depth into the nest + foreach ($children as $node) { + if (!empty($node->is_whitespace)) { + continue; + } + $list_of_children .= $node->name . ','; + } + // add leading comma to deal with stray comma declarations + $list_of_children = ',' . rtrim($list_of_children, ','); + $okay = + preg_match( + '/^,?' . $this->_pcre_regex . '$/', + $list_of_children + ); + return (bool)$okay; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php new file mode 100644 index 0000000..a8a6cbd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php @@ -0,0 +1,38 @@ + true, 'ul' => true, 'ol' => true); + + public $whitespace; + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + // Flag for subclasses + $this->whitespace = false; + + // if there are no tokens, delete parent node + if (empty($children)) { + return false; + } + + // if li is not allowed, delete parent node + if (!isset($config->getHTMLDefinition()->info['li'])) { + trigger_error("Cannot allow ul/ol without allowing li", E_USER_WARNING); + return false; + } + + // the new set of children + $result = array(); + + // a little sanity check to make sure it's not ALL whitespace + $all_whitespace = true; + + $current_li = null; + + foreach ($children as $node) { + if (!empty($node->is_whitespace)) { + $result[] = $node; + continue; + } + $all_whitespace = false; // phew, we're not talking about whitespace + + if ($node->name === 'li') { + // good + $current_li = $node; + $result[] = $node; + } else { + // we want to tuck this into the previous li + // Invariant: we expect the node to be ol/ul + // ToDo: Make this more robust in the case of not ol/ul + // by distinguishing between existing li and li created + // to handle non-list elements; non-list elements should + // not be appended to an existing li; only li created + // for non-list. This distinction is not currently made. + if ($current_li === null) { + $current_li = new HTMLPurifier_Node_Element('li'); + $result[] = $current_li; + } + $current_li->children[] = $node; + $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo + } + } + if (empty($result)) { + return false; + } + if ($all_whitespace) { + return false; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php new file mode 100644 index 0000000..b946806 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php @@ -0,0 +1,45 @@ +whitespace) { + return $children; + } else { + return array(); + } + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php new file mode 100644 index 0000000..0d1c8f5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php @@ -0,0 +1,118 @@ + $x) { + $elements[$i] = true; + if (empty($i)) { + unset($elements[$i]); + } // remove blank + } + } + $this->elements = $elements; + } + + /** + * @type bool + */ + public $allow_empty = false; + + /** + * @type string + */ + public $type = 'required'; + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + // Flag for subclasses + $this->whitespace = false; + + // if there are no tokens, delete parent node + if (empty($children)) { + return false; + } + + // the new set of children + $result = array(); + + // whether or not parsed character data is allowed + // this controls whether or not we silently drop a tag + // or generate escaped HTML from it + $pcdata_allowed = isset($this->elements['#PCDATA']); + + // a little sanity check to make sure it's not ALL whitespace + $all_whitespace = true; + + $stack = array_reverse($children); + while (!empty($stack)) { + $node = array_pop($stack); + if (!empty($node->is_whitespace)) { + $result[] = $node; + continue; + } + $all_whitespace = false; // phew, we're not talking about whitespace + + if (!isset($this->elements[$node->name])) { + // special case text + // XXX One of these ought to be redundant or something + if ($pcdata_allowed && $node instanceof HTMLPurifier_Node_Text) { + $result[] = $node; + continue; + } + // spill the child contents in + // ToDo: Make configurable + if ($node instanceof HTMLPurifier_Node_Element) { + for ($i = count($node->children) - 1; $i >= 0; $i--) { + $stack[] = $node->children[$i]; + } + continue; + } + continue; + } + $result[] = $node; + } + if (empty($result)) { + return false; + } + if ($all_whitespace) { + $this->whitespace = true; + return false; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php new file mode 100644 index 0000000..3270a46 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php @@ -0,0 +1,110 @@ +init($config); + return $this->fake_elements; + } + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + $this->init($config); + + // trick the parent class into thinking it allows more + $this->elements = $this->fake_elements; + $result = parent::validateChildren($children, $config, $context); + $this->elements = $this->real_elements; + + if ($result === false) { + return array(); + } + if ($result === true) { + $result = $children; + } + + $def = $config->getHTMLDefinition(); + $block_wrap_name = $def->info_block_wrapper; + $block_wrap = false; + $ret = array(); + + foreach ($result as $node) { + if ($block_wrap === false) { + if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) || + ($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) { + $block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper); + $ret[] = $block_wrap; + } + } else { + if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) { + $block_wrap = false; + + } + } + if ($block_wrap) { + $block_wrap->children[] = $node; + } else { + $ret[] = $node; + } + } + return $ret; + } + + /** + * @param HTMLPurifier_Config $config + */ + private function init($config) + { + if (!$this->init) { + $def = $config->getHTMLDefinition(); + // allow all inline elements + $this->real_elements = $this->elements; + $this->fake_elements = $def->info_content_sets['Flow']; + $this->fake_elements['#PCDATA'] = true; + $this->init = true; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php new file mode 100644 index 0000000..d92205b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php @@ -0,0 +1,227 @@ + true, + 'tbody' => true, + 'thead' => true, + 'tfoot' => true, + 'caption' => true, + 'colgroup' => true, + 'col' => true + ); + + public function __construct() + { + } + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + if (empty($children)) { + return false; + } + + // only one of these elements is allowed in a table + $caption = false; + $thead = false; + $tfoot = false; + + // whitespace + $initial_ws = array(); + $after_caption_ws = array(); + $after_thead_ws = array(); + $after_tfoot_ws = array(); + + // as many of these as you want + $cols = array(); + $content = array(); + + $tbody_mode = false; // if true, then we need to wrap any stray + // s with a . + + $ws_accum =& $initial_ws; + + foreach ($children as $node) { + if ($node instanceof HTMLPurifier_Node_Comment) { + $ws_accum[] = $node; + continue; + } + switch ($node->name) { + case 'tbody': + $tbody_mode = true; + // fall through + case 'tr': + $content[] = $node; + $ws_accum =& $content; + break; + case 'caption': + // there can only be one caption! + if ($caption !== false) break; + $caption = $node; + $ws_accum =& $after_caption_ws; + break; + case 'thead': + $tbody_mode = true; + // XXX This breaks rendering properties with + // Firefox, which never floats a to + // the top. Ever. (Our scheme will float the + // first to the top.) So maybe + // s that are not first should be + // turned into ? Very tricky, indeed. + if ($thead === false) { + $thead = $node; + $ws_accum =& $after_thead_ws; + } else { + // Oops, there's a second one! What + // should we do? Current behavior is to + // transmutate the first and last entries into + // tbody tags, and then put into content. + // Maybe a better idea is to *attach + // it* to the existing thead or tfoot? + // We don't do this, because Firefox + // doesn't float an extra tfoot to the + // bottom like it does for the first one. + $node->name = 'tbody'; + $content[] = $node; + $ws_accum =& $content; + } + break; + case 'tfoot': + // see above for some aveats + $tbody_mode = true; + if ($tfoot === false) { + $tfoot = $node; + $ws_accum =& $after_tfoot_ws; + } else { + $node->name = 'tbody'; + $content[] = $node; + $ws_accum =& $content; + } + break; + case 'colgroup': + case 'col': + $cols[] = $node; + $ws_accum =& $cols; + break; + case '#PCDATA': + // How is whitespace handled? We treat is as sticky to + // the *end* of the previous element. So all of the + // nonsense we have worked on is to keep things + // together. + if (!empty($node->is_whitespace)) { + $ws_accum[] = $node; + } + break; + } + } + + if (empty($content) && $thead === false && $tfoot === false) { + return false; + } + + $ret = $initial_ws; + if ($caption !== false) { + $ret[] = $caption; + $ret = array_merge($ret, $after_caption_ws); + } + if ($cols !== false) { + $ret = array_merge($ret, $cols); + } + if ($thead !== false) { + $ret[] = $thead; + $ret = array_merge($ret, $after_thead_ws); + } + if ($tfoot !== false) { + $ret[] = $tfoot; + $ret = array_merge($ret, $after_tfoot_ws); + } + + if ($tbody_mode) { + // we have to shuffle tr into tbody + $current_tr_tbody = null; + + foreach($content as $node) { + if (!isset($node->name)) { + continue; + } + switch ($node->name) { + case 'tbody': + $current_tr_tbody = null; + $ret[] = $node; + break; + case 'tr': + if ($current_tr_tbody === null) { + $current_tr_tbody = new HTMLPurifier_Node_Element('tbody'); + $ret[] = $current_tr_tbody; + } + $current_tr_tbody->children[] = $node; + break; + case '#PCDATA': + //assert($node->is_whitespace); + if ($current_tr_tbody === null) { + $ret[] = $node; + } else { + $current_tr_tbody->children[] = $node; + } + break; + } + } + } else { + $ret = array_merge($ret, $content); + } + + return $ret; + + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php new file mode 100644 index 0000000..256408e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php @@ -0,0 +1,924 @@ +defaultPlist; + $this->plist = new HTMLPurifier_PropertyList($parent); + $this->def = $definition; // keep a copy around for checking + $this->parser = new HTMLPurifier_VarParser_Flexible(); + } + + /** + * Convenience constructor that creates a config object based on a mixed var + * @param mixed $config Variable that defines the state of the config + * object. Can be: a HTMLPurifier_Config() object, + * an array of directives based on loadArray(), + * or a string filename of an ini file. + * @param HTMLPurifier_ConfigSchema $schema Schema object + * @return HTMLPurifier_Config Configured object + */ + public static function create($config, $schema = null) + { + if ($config instanceof HTMLPurifier_Config) { + // pass-through + return $config; + } + if (!$schema) { + $ret = HTMLPurifier_Config::createDefault(); + } else { + $ret = new HTMLPurifier_Config($schema); + } + if (is_string($config)) { + $ret->loadIni($config); + } elseif (is_array($config)) $ret->loadArray($config); + return $ret; + } + + /** + * Creates a new config object that inherits from a previous one. + * @param HTMLPurifier_Config $config Configuration object to inherit from. + * @return HTMLPurifier_Config object with $config as its parent. + */ + public static function inherit(HTMLPurifier_Config $config) + { + return new HTMLPurifier_Config($config->def, $config->plist); + } + + /** + * Convenience constructor that creates a default configuration object. + * @return HTMLPurifier_Config default object. + */ + public static function createDefault() + { + $definition = HTMLPurifier_ConfigSchema::instance(); + $config = new HTMLPurifier_Config($definition); + return $config; + } + + /** + * Retrieves a value from the configuration. + * + * @param string $key String key + * @param mixed $a + * + * @return mixed + */ + public function get($key, $a = null) + { + if ($a !== null) { + $this->triggerError( + "Using deprecated API: use \$config->get('$key.$a') instead", + E_USER_WARNING + ); + $key = "$key.$a"; + } + if (!$this->finalized) { + $this->autoFinalize(); + } + if (!isset($this->def->info[$key])) { + // can't add % due to SimpleTest bug + $this->triggerError( + 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key), + E_USER_WARNING + ); + return; + } + if (isset($this->def->info[$key]->isAlias)) { + $d = $this->def->info[$key]; + $this->triggerError( + 'Cannot get value from aliased directive, use real name ' . $d->key, + E_USER_ERROR + ); + return; + } + if ($this->lock) { + list($ns) = explode('.', $key); + if ($ns !== $this->lock) { + $this->triggerError( + 'Cannot get value of namespace ' . $ns . ' when lock for ' . + $this->lock . + ' is active, this probably indicates a Definition setup method ' . + 'is accessing directives that are not within its namespace', + E_USER_ERROR + ); + return; + } + } + return $this->plist->get($key); + } + + /** + * Retrieves an array of directives to values from a given namespace + * + * @param string $namespace String namespace + * + * @return array + */ + public function getBatch($namespace) + { + if (!$this->finalized) { + $this->autoFinalize(); + } + $full = $this->getAll(); + if (!isset($full[$namespace])) { + $this->triggerError( + 'Cannot retrieve undefined namespace ' . + htmlspecialchars($namespace), + E_USER_WARNING + ); + return; + } + return $full[$namespace]; + } + + /** + * Returns a SHA-1 signature of a segment of the configuration object + * that uniquely identifies that particular configuration + * + * @param string $namespace Namespace to get serial for + * + * @return string + * @note Revision is handled specially and is removed from the batch + * before processing! + */ + public function getBatchSerial($namespace) + { + if (empty($this->serials[$namespace])) { + $batch = $this->getBatch($namespace); + unset($batch['DefinitionRev']); + $this->serials[$namespace] = sha1(serialize($batch)); + } + return $this->serials[$namespace]; + } + + /** + * Returns a SHA-1 signature for the entire configuration object + * that uniquely identifies that particular configuration + * + * @return string + */ + public function getSerial() + { + if (empty($this->serial)) { + $this->serial = sha1(serialize($this->getAll())); + } + return $this->serial; + } + + /** + * Retrieves all directives, organized by namespace + * + * @warning This is a pretty inefficient function, avoid if you can + */ + public function getAll() + { + if (!$this->finalized) { + $this->autoFinalize(); + } + $ret = array(); + foreach ($this->plist->squash() as $name => $value) { + list($ns, $key) = explode('.', $name, 2); + $ret[$ns][$key] = $value; + } + return $ret; + } + + /** + * Sets a value to configuration. + * + * @param string $key key + * @param mixed $value value + * @param mixed $a + */ + public function set($key, $value, $a = null) + { + if (strpos($key, '.') === false) { + $namespace = $key; + $directive = $value; + $value = $a; + $key = "$key.$directive"; + $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE); + } else { + list($namespace) = explode('.', $key); + } + if ($this->isFinalized('Cannot set directive after finalization')) { + return; + } + if (!isset($this->def->info[$key])) { + $this->triggerError( + 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value', + E_USER_WARNING + ); + return; + } + $def = $this->def->info[$key]; + + if (isset($def->isAlias)) { + if ($this->aliasMode) { + $this->triggerError( + 'Double-aliases not allowed, please fix '. + 'ConfigSchema bug with' . $key, + E_USER_ERROR + ); + return; + } + $this->aliasMode = true; + $this->set($def->key, $value); + $this->aliasMode = false; + $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE); + return; + } + + // Raw type might be negative when using the fully optimized form + // of stdClass, which indicates allow_null == true + $rtype = is_int($def) ? $def : $def->type; + if ($rtype < 0) { + $type = -$rtype; + $allow_null = true; + } else { + $type = $rtype; + $allow_null = isset($def->allow_null); + } + + try { + $value = $this->parser->parse($value, $type, $allow_null); + } catch (HTMLPurifier_VarParserException $e) { + $this->triggerError( + 'Value for ' . $key . ' is of invalid type, should be ' . + HTMLPurifier_VarParser::getTypeName($type), + E_USER_WARNING + ); + return; + } + if (is_string($value) && is_object($def)) { + // resolve value alias if defined + if (isset($def->aliases[$value])) { + $value = $def->aliases[$value]; + } + // check to see if the value is allowed + if (isset($def->allowed) && !isset($def->allowed[$value])) { + $this->triggerError( + 'Value not supported, valid values are: ' . + $this->_listify($def->allowed), + E_USER_WARNING + ); + return; + } + } + $this->plist->set($key, $value); + + // reset definitions if the directives they depend on changed + // this is a very costly process, so it's discouraged + // with finalization + if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') { + $this->definitions[$namespace] = null; + } + + $this->serials[$namespace] = false; + } + + /** + * Convenience function for error reporting + * + * @param array $lookup + * + * @return string + */ + private function _listify($lookup) + { + $list = array(); + foreach ($lookup as $name => $b) { + $list[] = $name; + } + return implode(', ', $list); + } + + /** + * Retrieves object reference to the HTML definition. + * + * @param bool $raw Return a copy that has not been setup yet. Must be + * called before it's been setup, otherwise won't work. + * @param bool $optimized If true, this method may return null, to + * indicate that a cached version of the modified + * definition object is available and no further edits + * are necessary. Consider using + * maybeGetRawHTMLDefinition, which is more explicitly + * named, instead. + * + * @return HTMLPurifier_HTMLDefinition|null + */ + public function getHTMLDefinition($raw = false, $optimized = false) + { + return $this->getDefinition('HTML', $raw, $optimized); + } + + /** + * Retrieves object reference to the CSS definition + * + * @param bool $raw Return a copy that has not been setup yet. Must be + * called before it's been setup, otherwise won't work. + * @param bool $optimized If true, this method may return null, to + * indicate that a cached version of the modified + * definition object is available and no further edits + * are necessary. Consider using + * maybeGetRawCSSDefinition, which is more explicitly + * named, instead. + * + * @return HTMLPurifier_CSSDefinition|null + */ + public function getCSSDefinition($raw = false, $optimized = false) + { + return $this->getDefinition('CSS', $raw, $optimized); + } + + /** + * Retrieves object reference to the URI definition + * + * @param bool $raw Return a copy that has not been setup yet. Must be + * called before it's been setup, otherwise won't work. + * @param bool $optimized If true, this method may return null, to + * indicate that a cached version of the modified + * definition object is available and no further edits + * are necessary. Consider using + * maybeGetRawURIDefinition, which is more explicitly + * named, instead. + * + * @return HTMLPurifier_URIDefinition|null + */ + public function getURIDefinition($raw = false, $optimized = false) + { + return $this->getDefinition('URI', $raw, $optimized); + } + + /** + * Retrieves a definition + * + * @param string $type Type of definition: HTML, CSS, etc + * @param bool $raw Whether or not definition should be returned raw + * @param bool $optimized Only has an effect when $raw is true. Whether + * or not to return null if the result is already present in + * the cache. This is off by default for backwards + * compatibility reasons, but you need to do things this + * way in order to ensure that caching is done properly. + * Check out enduser-customize.html for more details. + * We probably won't ever change this default, as much as the + * maybe semantics is the "right thing to do." + * + * @throws HTMLPurifier_Exception + * @return HTMLPurifier_Definition|null + */ + public function getDefinition($type, $raw = false, $optimized = false) + { + if ($optimized && !$raw) { + throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false"); + } + if (!$this->finalized) { + $this->autoFinalize(); + } + // temporarily suspend locks, so we can handle recursive definition calls + $lock = $this->lock; + $this->lock = null; + $factory = HTMLPurifier_DefinitionCacheFactory::instance(); + $cache = $factory->create($type, $this); + $this->lock = $lock; + if (!$raw) { + // full definition + // --------------- + // check if definition is in memory + if (!empty($this->definitions[$type])) { + $def = $this->definitions[$type]; + // check if the definition is setup + if ($def->setup) { + return $def; + } else { + $def->setup($this); + if ($def->optimized) { + $cache->add($def, $this); + } + return $def; + } + } + // check if definition is in cache + $def = $cache->get($this); + if ($def) { + // definition in cache, save to memory and return it + $this->definitions[$type] = $def; + return $def; + } + // initialize it + $def = $this->initDefinition($type); + // set it up + $this->lock = $type; + $def->setup($this); + $this->lock = null; + // save in cache + $cache->add($def, $this); + // return it + return $def; + } else { + // raw definition + // -------------- + // check preconditions + $def = null; + if ($optimized) { + if (is_null($this->get($type . '.DefinitionID'))) { + // fatally error out if definition ID not set + throw new HTMLPurifier_Exception( + "Cannot retrieve raw version without specifying %$type.DefinitionID" + ); + } + } + if (!empty($this->definitions[$type])) { + $def = $this->definitions[$type]; + if ($def->setup && !$optimized) { + $extra = $this->chatty ? + " (try moving this code block earlier in your initialization)" : + ""; + throw new HTMLPurifier_Exception( + "Cannot retrieve raw definition after it has already been setup" . + $extra + ); + } + if ($def->optimized === null) { + $extra = $this->chatty ? " (try flushing your cache)" : ""; + throw new HTMLPurifier_Exception( + "Optimization status of definition is unknown" . $extra + ); + } + if ($def->optimized !== $optimized) { + $msg = $optimized ? "optimized" : "unoptimized"; + $extra = $this->chatty ? + " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)" + : ""; + throw new HTMLPurifier_Exception( + "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra + ); + } + } + // check if definition was in memory + if ($def) { + if ($def->setup) { + // invariant: $optimized === true (checked above) + return null; + } else { + return $def; + } + } + // if optimized, check if definition was in cache + // (because we do the memory check first, this formulation + // is prone to cache slamming, but I think + // guaranteeing that either /all/ of the raw + // setup code or /none/ of it is run is more important.) + if ($optimized) { + // This code path only gets run once; once we put + // something in $definitions (which is guaranteed by the + // trailing code), we always short-circuit above. + $def = $cache->get($this); + if ($def) { + // save the full definition for later, but don't + // return it yet + $this->definitions[$type] = $def; + return null; + } + } + // check invariants for creation + if (!$optimized) { + if (!is_null($this->get($type . '.DefinitionID'))) { + if ($this->chatty) { + $this->triggerError( + 'Due to a documentation error in previous version of HTML Purifier, your ' . + 'definitions are not being cached. If this is OK, you can remove the ' . + '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' . + 'modify your code to use maybeGetRawDefinition, and test if the returned ' . + 'value is null before making any edits (if it is null, that means that a ' . + 'cached version is available, and no raw operations are necessary). See ' . + '' . + 'Customize for more details', + E_USER_WARNING + ); + } else { + $this->triggerError( + "Useless DefinitionID declaration", + E_USER_WARNING + ); + } + } + } + // initialize it + $def = $this->initDefinition($type); + $def->optimized = $optimized; + return $def; + } + throw new HTMLPurifier_Exception("The impossible happened!"); + } + + /** + * Initialise definition + * + * @param string $type What type of definition to create + * + * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition + * @throws HTMLPurifier_Exception + */ + private function initDefinition($type) + { + // quick checks failed, let's create the object + if ($type == 'HTML') { + $def = new HTMLPurifier_HTMLDefinition(); + } elseif ($type == 'CSS') { + $def = new HTMLPurifier_CSSDefinition(); + } elseif ($type == 'URI') { + $def = new HTMLPurifier_URIDefinition(); + } else { + throw new HTMLPurifier_Exception( + "Definition of $type type not supported" + ); + } + $this->definitions[$type] = $def; + return $def; + } + + public function maybeGetRawDefinition($name) + { + return $this->getDefinition($name, true, true); + } + + /** + * @return HTMLPurifier_HTMLDefinition|null + */ + public function maybeGetRawHTMLDefinition() + { + return $this->getDefinition('HTML', true, true); + } + + /** + * @return HTMLPurifier_CSSDefinition|null + */ + public function maybeGetRawCSSDefinition() + { + return $this->getDefinition('CSS', true, true); + } + + /** + * @return HTMLPurifier_URIDefinition|null + */ + public function maybeGetRawURIDefinition() + { + return $this->getDefinition('URI', true, true); + } + + /** + * Loads configuration values from an array with the following structure: + * Namespace.Directive => Value + * + * @param array $config_array Configuration associative array + */ + public function loadArray($config_array) + { + if ($this->isFinalized('Cannot load directives after finalization')) { + return; + } + foreach ($config_array as $key => $value) { + $key = str_replace('_', '.', $key); + if (strpos($key, '.') !== false) { + $this->set($key, $value); + } else { + $namespace = $key; + $namespace_values = $value; + foreach ($namespace_values as $directive => $value2) { + $this->set($namespace .'.'. $directive, $value2); + } + } + } + } + + /** + * Returns a list of array(namespace, directive) for all directives + * that are allowed in a web-form context as per an allowed + * namespaces/directives list. + * + * @param array $allowed List of allowed namespaces/directives + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return array + */ + public static function getAllowedDirectivesForForm($allowed, $schema = null) + { + if (!$schema) { + $schema = HTMLPurifier_ConfigSchema::instance(); + } + if ($allowed !== true) { + if (is_string($allowed)) { + $allowed = array($allowed); + } + $allowed_ns = array(); + $allowed_directives = array(); + $blacklisted_directives = array(); + foreach ($allowed as $ns_or_directive) { + if (strpos($ns_or_directive, '.') !== false) { + // directive + if ($ns_or_directive[0] == '-') { + $blacklisted_directives[substr($ns_or_directive, 1)] = true; + } else { + $allowed_directives[$ns_or_directive] = true; + } + } else { + // namespace + $allowed_ns[$ns_or_directive] = true; + } + } + } + $ret = array(); + foreach ($schema->info as $key => $def) { + list($ns, $directive) = explode('.', $key, 2); + if ($allowed !== true) { + if (isset($blacklisted_directives["$ns.$directive"])) { + continue; + } + if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) { + continue; + } + } + if (isset($def->isAlias)) { + continue; + } + if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') { + continue; + } + $ret[] = array($ns, $directive); + } + return $ret; + } + + /** + * Loads configuration values from $_GET/$_POST that were posted + * via ConfigForm + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return mixed + */ + public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) + { + $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema); + $config = HTMLPurifier_Config::create($ret, $schema); + return $config; + } + + /** + * Merges in configuration values from $_GET/$_POST to object. NOT STATIC. + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix + */ + public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true) + { + $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def); + $this->loadArray($ret); + } + + /** + * Prepares an array from a form into something usable for the more + * strict parts of HTMLPurifier_Config + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return array + */ + public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) + { + if ($index !== false) { + $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array(); + } + $mq = $mq_fix && version_compare(PHP_VERSION, '7.4.0', '<') && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc(); + + $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema); + $ret = array(); + foreach ($allowed as $key) { + list($ns, $directive) = $key; + $skey = "$ns.$directive"; + if (!empty($array["Null_$skey"])) { + $ret[$ns][$directive] = null; + continue; + } + if (!isset($array[$skey])) { + continue; + } + $value = $mq ? stripslashes($array[$skey]) : $array[$skey]; + $ret[$ns][$directive] = $value; + } + return $ret; + } + + /** + * Loads configuration values from an ini file + * + * @param string $filename Name of ini file + */ + public function loadIni($filename) + { + if ($this->isFinalized('Cannot load directives after finalization')) { + return; + } + $array = parse_ini_file($filename, true); + $this->loadArray($array); + } + + /** + * Checks whether or not the configuration object is finalized. + * + * @param string|bool $error String error message, or false for no error + * + * @return bool + */ + public function isFinalized($error = false) + { + if ($this->finalized && $error) { + $this->triggerError($error, E_USER_ERROR); + } + return $this->finalized; + } + + /** + * Finalizes configuration only if auto finalize is on and not + * already finalized + */ + public function autoFinalize() + { + if ($this->autoFinalize) { + $this->finalize(); + } else { + $this->plist->squash(true); + } + } + + /** + * Finalizes a configuration object, prohibiting further change + */ + public function finalize() + { + $this->finalized = true; + $this->parser = null; + } + + /** + * Produces a nicely formatted error message by supplying the + * stack frame information OUTSIDE of HTMLPurifier_Config. + * + * @param string $msg An error message + * @param int $no An error number + */ + protected function triggerError($msg, $no) + { + // determine previous stack frame + $extra = ''; + if ($this->chatty) { + $trace = debug_backtrace(); + // zip(tail(trace), trace) -- but PHP is not Haskell har har + for ($i = 0, $c = count($trace); $i < $c - 1; $i++) { + // XXX this is not correct on some versions of HTML Purifier + if (isset($trace[$i + 1]['class']) && $trace[$i + 1]['class'] === 'HTMLPurifier_Config') { + continue; + } + $frame = $trace[$i]; + $extra = " invoked on line {$frame['line']} in file {$frame['file']}"; + break; + } + } + if ($no == E_USER_ERROR) { + throw new Exception($msg . $extra); + } else { + trigger_error($msg . $extra, $no); + } + } + + /** + * Returns a serialized form of the configuration object that can + * be reconstituted. + * + * @return string + */ + public function serialize() + { + $this->getDefinition('HTML'); + $this->getDefinition('CSS'); + $this->getDefinition('URI'); + return serialize($this); + } + +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php new file mode 100644 index 0000000..42f6604 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php @@ -0,0 +1,176 @@ + array( + * 'Directive' => new stdClass(), + * ) + * ) + * + * The stdClass may have the following properties: + * + * - If isAlias isn't set: + * - type: Integer type of directive, see HTMLPurifier_VarParser for definitions + * - allow_null: If set, this directive allows null values + * - aliases: If set, an associative array of value aliases to real values + * - allowed: If set, a lookup array of allowed (string) values + * - If isAlias is set: + * - namespace: Namespace this directive aliases to + * - name: Directive name this directive aliases to + * + * In certain degenerate cases, stdClass will actually be an integer. In + * that case, the value is equivalent to an stdClass with the type + * property set to the integer. If the integer is negative, type is + * equal to the absolute value of integer, and allow_null is true. + * + * This class is friendly with HTMLPurifier_Config. If you need introspection + * about the schema, you're better of using the ConfigSchema_Interchange, + * which uses more memory but has much richer information. + * @type array + */ + public $info = array(); + + /** + * Application-wide singleton + * @type HTMLPurifier_ConfigSchema + */ + protected static $singleton; + + public function __construct() + { + $this->defaultPlist = new HTMLPurifier_PropertyList(); + } + + /** + * Unserializes the default ConfigSchema. + * @return HTMLPurifier_ConfigSchema + */ + public static function makeFromSerial() + { + $contents = file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser'); + $r = unserialize($contents); + if (!$r) { + $hash = sha1($contents); + throw new Exception("Unserialization of configuration schema failed, sha1 of file was $hash"); + } + return $r; + } + + /** + * Retrieves an instance of the application-wide configuration definition. + * @param HTMLPurifier_ConfigSchema $prototype + * @return HTMLPurifier_ConfigSchema + */ + public static function instance($prototype = null) + { + if ($prototype !== null) { + HTMLPurifier_ConfigSchema::$singleton = $prototype; + } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) { + HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial(); + } + return HTMLPurifier_ConfigSchema::$singleton; + } + + /** + * Defines a directive for configuration + * @warning Will fail of directive's namespace is defined. + * @warning This method's signature is slightly different from the legacy + * define() static method! Beware! + * @param string $key Name of directive + * @param mixed $default Default value of directive + * @param string $type Allowed type of the directive. See + * HTMLPurifier_VarParser::$types for allowed values + * @param bool $allow_null Whether or not to allow null values + */ + public function add($key, $default, $type, $allow_null) + { + $obj = new stdClass(); + $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type]; + if ($allow_null) { + $obj->allow_null = true; + } + $this->info[$key] = $obj; + $this->defaults[$key] = $default; + $this->defaultPlist->set($key, $default); + } + + /** + * Defines a directive value alias. + * + * Directive value aliases are convenient for developers because it lets + * them set a directive to several values and get the same result. + * @param string $key Name of Directive + * @param array $aliases Hash of aliased values to the real alias + */ + public function addValueAliases($key, $aliases) + { + if (!isset($this->info[$key]->aliases)) { + $this->info[$key]->aliases = array(); + } + foreach ($aliases as $alias => $real) { + $this->info[$key]->aliases[$alias] = $real; + } + } + + /** + * Defines a set of allowed values for a directive. + * @warning This is slightly different from the corresponding static + * method definition. + * @param string $key Name of directive + * @param array $allowed Lookup array of allowed values + */ + public function addAllowedValues($key, $allowed) + { + $this->info[$key]->allowed = $allowed; + } + + /** + * Defines a directive alias for backwards compatibility + * @param string $key Directive that will be aliased + * @param string $new_key Directive that the alias will be to + */ + public function addAlias($key, $new_key) + { + $obj = new stdClass; + $obj->key = $new_key; + $obj->isAlias = true; + $this->info[$key] = $obj; + } + + /** + * Replaces any stdClass that only has the type property with type integer. + */ + public function postProcess() + { + foreach ($this->info as $key => $v) { + if (count((array) $v) == 1) { + $this->info[$key] = $v->type; + } elseif (count((array) $v) == 2 && isset($v->allow_null)) { + $this->info[$key] = -$v->type; + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php new file mode 100644 index 0000000..d5906cd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php @@ -0,0 +1,48 @@ +directives as $d) { + $schema->add( + $d->id->key, + $d->default, + $d->type, + $d->typeAllowsNull + ); + if ($d->allowed !== null) { + $schema->addAllowedValues( + $d->id->key, + $d->allowed + ); + } + foreach ($d->aliases as $alias) { + $schema->addAlias( + $alias->key, + $d->id->key + ); + } + if ($d->valueAliases !== null) { + $schema->addValueAliases( + $d->id->key, + $d->valueAliases + ); + } + } + $schema->postProcess(); + return $schema; + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php new file mode 100644 index 0000000..5fa56f7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php @@ -0,0 +1,144 @@ +startElement('div'); + + $purifier = HTMLPurifier::getInstance(); + $html = $purifier->purify($html); + $this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); + $this->writeRaw($html); + + $this->endElement(); // div + } + + /** + * @param mixed $var + * @return string + */ + protected function export($var) + { + if ($var === array()) { + return 'array()'; + } + return var_export($var, true); + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + */ + public function build($interchange) + { + // global access, only use as last resort + $this->interchange = $interchange; + + $this->setIndent(true); + $this->startDocument('1.0', 'UTF-8'); + $this->startElement('configdoc'); + $this->writeElement('title', $interchange->name); + + foreach ($interchange->directives as $directive) { + $this->buildDirective($directive); + } + + if ($this->namespace) { + $this->endElement(); + } // namespace + + $this->endElement(); // configdoc + $this->flush(); + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive + */ + public function buildDirective($directive) + { + // Kludge, although I suppose having a notion of a "root namespace" + // certainly makes things look nicer when documentation is built. + // Depends on things being sorted. + if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) { + if ($this->namespace) { + $this->endElement(); + } // namespace + $this->namespace = $directive->id->getRootNamespace(); + $this->startElement('namespace'); + $this->writeAttribute('id', $this->namespace); + $this->writeElement('name', $this->namespace); + } + + $this->startElement('directive'); + $this->writeAttribute('id', $directive->id->toString()); + + $this->writeElement('name', $directive->id->getDirective()); + + $this->startElement('aliases'); + foreach ($directive->aliases as $alias) { + $this->writeElement('alias', $alias->toString()); + } + $this->endElement(); // aliases + + $this->startElement('constraints'); + if ($directive->version) { + $this->writeElement('version', $directive->version); + } + $this->startElement('type'); + if ($directive->typeAllowsNull) { + $this->writeAttribute('allow-null', 'yes'); + } + $this->text($directive->type); + $this->endElement(); // type + if ($directive->allowed) { + $this->startElement('allowed'); + foreach ($directive->allowed as $value => $x) { + $this->writeElement('value', $value); + } + $this->endElement(); // allowed + } + $this->writeElement('default', $this->export($directive->default)); + $this->writeAttribute('xml:space', 'preserve'); + if ($directive->external) { + $this->startElement('external'); + foreach ($directive->external as $project) { + $this->writeElement('project', $project); + } + $this->endElement(); + } + $this->endElement(); // constraints + + if ($directive->deprecatedVersion) { + $this->startElement('deprecated'); + $this->writeElement('version', $directive->deprecatedVersion); + $this->writeElement('use', $directive->deprecatedUse->toString()); + $this->endElement(); // deprecated + } + + $this->startElement('description'); + $this->writeHTMLDiv($directive->description); + $this->endElement(); // description + + $this->endElement(); // directive + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php new file mode 100644 index 0000000..2671516 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php @@ -0,0 +1,11 @@ + array(directive info) + * @type HTMLPurifier_ConfigSchema_Interchange_Directive[] + */ + public $directives = array(); + + /** + * Adds a directive array to $directives + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive + * @throws HTMLPurifier_ConfigSchema_Exception + */ + public function addDirective($directive) + { + if (isset($this->directives[$i = $directive->id->toString()])) { + throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'"); + } + $this->directives[$i] = $directive; + } + + /** + * Convenience function to perform standard validation. Throws exception + * on failed validation. + */ + public function validate() + { + $validator = new HTMLPurifier_ConfigSchema_Validator(); + return $validator->validate($this); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php new file mode 100644 index 0000000..4902a56 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php @@ -0,0 +1,89 @@ + true). + * Null if all values are allowed. + * @type array + */ + public $allowed; + + /** + * List of aliases for the directive. + * e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))). + * @type HTMLPurifier_ConfigSchema_Interchange_Id[] + */ + public $aliases = array(); + + /** + * Hash of value aliases, e.g. array('alt' => 'real'). Null if value + * aliasing is disabled (necessary for non-scalar types). + * @type array + */ + public $valueAliases; + + /** + * Version of HTML Purifier the directive was introduced, e.g. '1.3.1'. + * Null if the directive has always existed. + * @type string + */ + public $version; + + /** + * ID of directive that supersedes this old directive. + * Null if not deprecated. + * @type HTMLPurifier_ConfigSchema_Interchange_Id + */ + public $deprecatedUse; + + /** + * Version of HTML Purifier this directive was deprecated. Null if not + * deprecated. + * @type string + */ + public $deprecatedVersion; + + /** + * List of external projects this directive depends on, e.g. array('CSSTidy'). + * @type array + */ + public $external = array(); +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php new file mode 100644 index 0000000..126f09d --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php @@ -0,0 +1,58 @@ +key = $key; + } + + /** + * @return string + * @warning This is NOT magic, to ensure that people don't abuse SPL and + * cause problems for PHP 5.0 support. + */ + public function toString() + { + return $this->key; + } + + /** + * @return string + */ + public function getRootNamespace() + { + return substr($this->key, 0, strpos($this->key, ".")); + } + + /** + * @return string + */ + public function getDirective() + { + return substr($this->key, strpos($this->key, ".") + 1); + } + + /** + * @param string $id + * @return HTMLPurifier_ConfigSchema_Interchange_Id + */ + public static function make($id) + { + return new HTMLPurifier_ConfigSchema_Interchange_Id($id); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php new file mode 100644 index 0000000..655e6dd --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php @@ -0,0 +1,226 @@ +varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native(); + } + + /** + * @param string $dir + * @return HTMLPurifier_ConfigSchema_Interchange + */ + public static function buildFromDirectory($dir = null) + { + $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); + $interchange = new HTMLPurifier_ConfigSchema_Interchange(); + return $builder->buildDir($interchange, $dir); + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param string $dir + * @return HTMLPurifier_ConfigSchema_Interchange + */ + public function buildDir($interchange, $dir = null) + { + if (!$dir) { + $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema'; + } + if (file_exists($dir . '/info.ini')) { + $info = parse_ini_file($dir . '/info.ini'); + $interchange->name = $info['name']; + } + + $files = array(); + $dh = opendir($dir); + while (false !== ($file = readdir($dh))) { + if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') { + continue; + } + $files[] = $file; + } + closedir($dh); + + sort($files); + foreach ($files as $file) { + $this->buildFile($interchange, $dir . '/' . $file); + } + return $interchange; + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param string $file + */ + public function buildFile($interchange, $file) + { + $parser = new HTMLPurifier_StringHashParser(); + $this->build( + $interchange, + new HTMLPurifier_StringHash($parser->parseFile($file)) + ); + } + + /** + * Builds an interchange object based on a hash. + * @param HTMLPurifier_ConfigSchema_Interchange $interchange HTMLPurifier_ConfigSchema_Interchange object to build + * @param HTMLPurifier_StringHash $hash source data + * @throws HTMLPurifier_ConfigSchema_Exception + */ + public function build($interchange, $hash) + { + if (!$hash instanceof HTMLPurifier_StringHash) { + $hash = new HTMLPurifier_StringHash($hash); + } + if (!isset($hash['ID'])) { + throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID'); + } + if (strpos($hash['ID'], '.') === false) { + if (count($hash) == 2 && isset($hash['DESCRIPTION'])) { + $hash->offsetGet('DESCRIPTION'); // prevent complaining + } else { + throw new HTMLPurifier_ConfigSchema_Exception('All directives must have a namespace'); + } + } else { + $this->buildDirective($interchange, $hash); + } + $this->_findUnused($hash); + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param HTMLPurifier_StringHash $hash + * @throws HTMLPurifier_ConfigSchema_Exception + */ + public function buildDirective($interchange, $hash) + { + $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive(); + + // These are required elements: + $directive->id = $this->id($hash->offsetGet('ID')); + $id = $directive->id->toString(); // convenience + + if (isset($hash['TYPE'])) { + $type = explode('/', $hash->offsetGet('TYPE')); + if (isset($type[1])) { + $directive->typeAllowsNull = true; + } + $directive->type = $type[0]; + } else { + throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined"); + } + + if (isset($hash['DEFAULT'])) { + try { + $directive->default = $this->varParser->parse( + $hash->offsetGet('DEFAULT'), + $directive->type, + $directive->typeAllowsNull + ); + } catch (HTMLPurifier_VarParserException $e) { + throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'"); + } + } + + if (isset($hash['DESCRIPTION'])) { + $directive->description = $hash->offsetGet('DESCRIPTION'); + } + + if (isset($hash['ALLOWED'])) { + $directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED'))); + } + + if (isset($hash['VALUE-ALIASES'])) { + $directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES')); + } + + if (isset($hash['ALIASES'])) { + $raw_aliases = trim($hash->offsetGet('ALIASES')); + $aliases = preg_split('/\s*,\s*/', $raw_aliases); + foreach ($aliases as $alias) { + $directive->aliases[] = $this->id($alias); + } + } + + if (isset($hash['VERSION'])) { + $directive->version = $hash->offsetGet('VERSION'); + } + + if (isset($hash['DEPRECATED-USE'])) { + $directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE')); + } + + if (isset($hash['DEPRECATED-VERSION'])) { + $directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION'); + } + + if (isset($hash['EXTERNAL'])) { + $directive->external = preg_split('/\s*,\s*/', trim($hash->offsetGet('EXTERNAL'))); + } + + $interchange->addDirective($directive); + } + + /** + * Evaluates an array PHP code string without array() wrapper + * @param string $contents + */ + protected function evalArray($contents) + { + return eval('return array(' . $contents . ');'); + } + + /** + * Converts an array list into a lookup array. + * @param array $array + * @return array + */ + protected function lookup($array) + { + $ret = array(); + foreach ($array as $val) { + $ret[$val] = true; + } + return $ret; + } + + /** + * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id + * object based on a string Id. + * @param string $id + * @return HTMLPurifier_ConfigSchema_Interchange_Id + */ + protected function id($id) + { + return HTMLPurifier_ConfigSchema_Interchange_Id::make($id); + } + + /** + * Triggers errors for any unused keys passed in the hash; such keys + * may indicate typos, missing values, etc. + * @param HTMLPurifier_StringHash $hash Hash to check. + */ + protected function _findUnused($hash) + { + $accessed = $hash->getAccessed(); + foreach ($hash as $k => $v) { + if (!isset($accessed[$k])) { + trigger_error("String hash key '$k' not used by builder", E_USER_NOTICE); + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php new file mode 100644 index 0000000..fb31277 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php @@ -0,0 +1,248 @@ +parser = new HTMLPurifier_VarParser(); + } + + /** + * Validates a fully-formed interchange object. + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @return bool + */ + public function validate($interchange) + { + $this->interchange = $interchange; + $this->aliases = array(); + // PHP is a bit lax with integer <=> string conversions in + // arrays, so we don't use the identical !== comparison + foreach ($interchange->directives as $i => $directive) { + $id = $directive->id->toString(); + if ($i != $id) { + $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'"); + } + $this->validateDirective($directive); + } + return true; + } + + /** + * Validates a HTMLPurifier_ConfigSchema_Interchange_Id object. + * @param HTMLPurifier_ConfigSchema_Interchange_Id $id + */ + public function validateId($id) + { + $id_string = $id->toString(); + $this->context[] = "id '$id_string'"; + if (!$id instanceof HTMLPurifier_ConfigSchema_Interchange_Id) { + // handled by InterchangeBuilder + $this->error(false, 'is not an instance of HTMLPurifier_ConfigSchema_Interchange_Id'); + } + // keys are now unconstrained (we might want to narrow down to A-Za-z0-9.) + // we probably should check that it has at least one namespace + $this->with($id, 'key') + ->assertNotEmpty() + ->assertIsString(); // implicit assertIsString handled by InterchangeBuilder + array_pop($this->context); + } + + /** + * Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d + */ + public function validateDirective($d) + { + $id = $d->id->toString(); + $this->context[] = "directive '$id'"; + $this->validateId($d->id); + + $this->with($d, 'description') + ->assertNotEmpty(); + + // BEGIN - handled by InterchangeBuilder + $this->with($d, 'type') + ->assertNotEmpty(); + $this->with($d, 'typeAllowsNull') + ->assertIsBool(); + try { + // This also tests validity of $d->type + $this->parser->parse($d->default, $d->type, $d->typeAllowsNull); + } catch (HTMLPurifier_VarParserException $e) { + $this->error('default', 'had error: ' . $e->getMessage()); + } + // END - handled by InterchangeBuilder + + if (!is_null($d->allowed) || !empty($d->valueAliases)) { + // allowed and valueAliases require that we be dealing with + // strings, so check for that early. + $d_int = HTMLPurifier_VarParser::$types[$d->type]; + if (!isset(HTMLPurifier_VarParser::$stringTypes[$d_int])) { + $this->error('type', 'must be a string type when used with allowed or value aliases'); + } + } + + $this->validateDirectiveAllowed($d); + $this->validateDirectiveValueAliases($d); + $this->validateDirectiveAliases($d); + + array_pop($this->context); + } + + /** + * Extra validation if $allowed member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d + */ + public function validateDirectiveAllowed($d) + { + if (is_null($d->allowed)) { + return; + } + $this->with($d, 'allowed') + ->assertNotEmpty() + ->assertIsLookup(); // handled by InterchangeBuilder + if (is_string($d->default) && !isset($d->allowed[$d->default])) { + $this->error('default', 'must be an allowed value'); + } + $this->context[] = 'allowed'; + foreach ($d->allowed as $val => $x) { + if (!is_string($val)) { + $this->error("value $val", 'must be a string'); + } + } + array_pop($this->context); + } + + /** + * Extra validation if $valueAliases member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d + */ + public function validateDirectiveValueAliases($d) + { + if (is_null($d->valueAliases)) { + return; + } + $this->with($d, 'valueAliases') + ->assertIsArray(); // handled by InterchangeBuilder + $this->context[] = 'valueAliases'; + foreach ($d->valueAliases as $alias => $real) { + if (!is_string($alias)) { + $this->error("alias $alias", 'must be a string'); + } + if (!is_string($real)) { + $this->error("alias target $real from alias '$alias'", 'must be a string'); + } + if ($alias === $real) { + $this->error("alias '$alias'", "must not be an alias to itself"); + } + } + if (!is_null($d->allowed)) { + foreach ($d->valueAliases as $alias => $real) { + if (isset($d->allowed[$alias])) { + $this->error("alias '$alias'", 'must not be an allowed value'); + } elseif (!isset($d->allowed[$real])) { + $this->error("alias '$alias'", 'must be an alias to an allowed value'); + } + } + } + array_pop($this->context); + } + + /** + * Extra validation if $aliases member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d + */ + public function validateDirectiveAliases($d) + { + $this->with($d, 'aliases') + ->assertIsArray(); // handled by InterchangeBuilder + $this->context[] = 'aliases'; + foreach ($d->aliases as $alias) { + $this->validateId($alias); + $s = $alias->toString(); + if (isset($this->interchange->directives[$s])) { + $this->error("alias '$s'", 'collides with another directive'); + } + if (isset($this->aliases[$s])) { + $other_directive = $this->aliases[$s]; + $this->error("alias '$s'", "collides with alias for directive '$other_directive'"); + } + $this->aliases[$s] = $d->id->toString(); + } + array_pop($this->context); + } + + // protected helper functions + + /** + * Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom + * for validating simple member variables of objects. + * @param $obj + * @param $member + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + protected function with($obj, $member) + { + return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->getFormattedContext(), $obj, $member); + } + + /** + * Emits an error, providing helpful context. + * @throws HTMLPurifier_ConfigSchema_Exception + */ + protected function error($target, $msg) + { + if ($target !== false) { + $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext(); + } else { + $prefix = ucfirst($this->getFormattedContext()); + } + throw new HTMLPurifier_ConfigSchema_Exception(trim($prefix . ' ' . $msg)); + } + + /** + * Returns a formatted context string. + * @return string + */ + protected function getFormattedContext() + { + return implode(' in ', array_reverse($this->context)); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php new file mode 100644 index 0000000..c9aa364 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php @@ -0,0 +1,130 @@ +context = $context; + $this->obj = $obj; + $this->member = $member; + $this->contents =& $obj->$member; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsString() + { + if (!is_string($this->contents)) { + $this->error('must be a string'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsBool() + { + if (!is_bool($this->contents)) { + $this->error('must be a boolean'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsArray() + { + if (!is_array($this->contents)) { + $this->error('must be an array'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertNotNull() + { + if ($this->contents === null) { + $this->error('must not be null'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertAlnum() + { + $this->assertIsString(); + if (!ctype_alnum($this->contents)) { + $this->error('must be alphanumeric'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertNotEmpty() + { + if (empty($this->contents)) { + $this->error('must not be empty'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsLookup() + { + $this->assertIsArray(); + foreach ($this->contents as $v) { + if ($v !== true) { + $this->error('must be a lookup array'); + } + } + return $this; + } + + /** + * @param string $msg + * @throws HTMLPurifier_ConfigSchema_Exception + */ + protected function error($msg) + { + throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg); + } +} + +// vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser new file mode 100644 index 0000000..34ea683 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser @@ -0,0 +1 @@ +O:25:"HTMLPurifier_ConfigSchema":3:{s:8:"defaults";a:130:{s:19:"Attr.AllowedClasses";N;s:24:"Attr.AllowedFrameTargets";a:0:{}s:15:"Attr.AllowedRel";a:0:{}s:15:"Attr.AllowedRev";a:0:{}s:18:"Attr.ClassUseCDATA";N;s:20:"Attr.DefaultImageAlt";N;s:24:"Attr.DefaultInvalidImage";s:0:"";s:27:"Attr.DefaultInvalidImageAlt";s:13:"Invalid image";s:19:"Attr.DefaultTextDir";s:3:"ltr";s:13:"Attr.EnableID";b:0;s:21:"Attr.ForbiddenClasses";a:0:{}s:13:"Attr.ID.HTML5";N;s:16:"Attr.IDBlacklist";a:0:{}s:22:"Attr.IDBlacklistRegexp";N;s:13:"Attr.IDPrefix";s:0:"";s:18:"Attr.IDPrefixLocal";s:0:"";s:24:"AutoFormat.AutoParagraph";b:0;s:17:"AutoFormat.Custom";a:0:{}s:25:"AutoFormat.DisplayLinkURI";b:0;s:18:"AutoFormat.Linkify";b:0;s:33:"AutoFormat.PurifierLinkify.DocURL";s:3:"#%s";s:26:"AutoFormat.PurifierLinkify";b:0;s:32:"AutoFormat.RemoveEmpty.Predicate";a:4:{s:8:"colgroup";a:0:{}s:2:"th";a:0:{}s:2:"td";a:0:{}s:6:"iframe";a:1:{i:0;s:3:"src";}}s:44:"AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions";a:2:{s:2:"td";b:1;s:2:"th";b:1;}s:33:"AutoFormat.RemoveEmpty.RemoveNbsp";b:0;s:22:"AutoFormat.RemoveEmpty";b:0;s:39:"AutoFormat.RemoveSpansWithoutAttributes";b:0;s:19:"CSS.AllowDuplicates";b:0;s:18:"CSS.AllowImportant";b:0;s:15:"CSS.AllowTricky";b:0;s:16:"CSS.AllowedFonts";N;s:21:"CSS.AllowedProperties";N;s:17:"CSS.DefinitionRev";i:1;s:23:"CSS.ForbiddenProperties";a:0:{}s:16:"CSS.MaxImgLength";N;s:15:"CSS.Proprietary";b:0;s:11:"CSS.Trusted";b:0;s:20:"Cache.DefinitionImpl";s:10:"Serializer";s:20:"Cache.SerializerPath";N;s:27:"Cache.SerializerPermissions";i:493;s:22:"Core.AggressivelyFixLt";b:1;s:29:"Core.AggressivelyRemoveScript";b:1;s:28:"Core.AllowHostnameUnderscore";b:0;s:23:"Core.AllowParseManyTags";b:0;s:18:"Core.CollectErrors";b:0;s:18:"Core.ColorKeywords";a:148:{s:9:"aliceblue";s:7:"#F0F8FF";s:12:"antiquewhite";s:7:"#FAEBD7";s:4:"aqua";s:7:"#00FFFF";s:10:"aquamarine";s:7:"#7FFFD4";s:5:"azure";s:7:"#F0FFFF";s:5:"beige";s:7:"#F5F5DC";s:6:"bisque";s:7:"#FFE4C4";s:5:"black";s:7:"#000000";s:14:"blanchedalmond";s:7:"#FFEBCD";s:4:"blue";s:7:"#0000FF";s:10:"blueviolet";s:7:"#8A2BE2";s:5:"brown";s:7:"#A52A2A";s:9:"burlywood";s:7:"#DEB887";s:9:"cadetblue";s:7:"#5F9EA0";s:10:"chartreuse";s:7:"#7FFF00";s:9:"chocolate";s:7:"#D2691E";s:5:"coral";s:7:"#FF7F50";s:14:"cornflowerblue";s:7:"#6495ED";s:8:"cornsilk";s:7:"#FFF8DC";s:7:"crimson";s:7:"#DC143C";s:4:"cyan";s:7:"#00FFFF";s:8:"darkblue";s:7:"#00008B";s:8:"darkcyan";s:7:"#008B8B";s:13:"darkgoldenrod";s:7:"#B8860B";s:8:"darkgray";s:7:"#A9A9A9";s:8:"darkgrey";s:7:"#A9A9A9";s:9:"darkgreen";s:7:"#006400";s:9:"darkkhaki";s:7:"#BDB76B";s:11:"darkmagenta";s:7:"#8B008B";s:14:"darkolivegreen";s:7:"#556B2F";s:10:"darkorange";s:7:"#FF8C00";s:10:"darkorchid";s:7:"#9932CC";s:7:"darkred";s:7:"#8B0000";s:10:"darksalmon";s:7:"#E9967A";s:12:"darkseagreen";s:7:"#8FBC8F";s:13:"darkslateblue";s:7:"#483D8B";s:13:"darkslategray";s:7:"#2F4F4F";s:13:"darkslategrey";s:7:"#2F4F4F";s:13:"darkturquoise";s:7:"#00CED1";s:10:"darkviolet";s:7:"#9400D3";s:8:"deeppink";s:7:"#FF1493";s:11:"deepskyblue";s:7:"#00BFFF";s:7:"dimgray";s:7:"#696969";s:7:"dimgrey";s:7:"#696969";s:10:"dodgerblue";s:7:"#1E90FF";s:9:"firebrick";s:7:"#B22222";s:11:"floralwhite";s:7:"#FFFAF0";s:11:"forestgreen";s:7:"#228B22";s:7:"fuchsia";s:7:"#FF00FF";s:9:"gainsboro";s:7:"#DCDCDC";s:10:"ghostwhite";s:7:"#F8F8FF";s:4:"gold";s:7:"#FFD700";s:9:"goldenrod";s:7:"#DAA520";s:4:"gray";s:7:"#808080";s:4:"grey";s:7:"#808080";s:5:"green";s:7:"#008000";s:11:"greenyellow";s:7:"#ADFF2F";s:8:"honeydew";s:7:"#F0FFF0";s:7:"hotpink";s:7:"#FF69B4";s:9:"indianred";s:7:"#CD5C5C";s:6:"indigo";s:7:"#4B0082";s:5:"ivory";s:7:"#FFFFF0";s:5:"khaki";s:7:"#F0E68C";s:8:"lavender";s:7:"#E6E6FA";s:13:"lavenderblush";s:7:"#FFF0F5";s:9:"lawngreen";s:7:"#7CFC00";s:12:"lemonchiffon";s:7:"#FFFACD";s:9:"lightblue";s:7:"#ADD8E6";s:10:"lightcoral";s:7:"#F08080";s:9:"lightcyan";s:7:"#E0FFFF";s:20:"lightgoldenrodyellow";s:7:"#FAFAD2";s:9:"lightgray";s:7:"#D3D3D3";s:9:"lightgrey";s:7:"#D3D3D3";s:10:"lightgreen";s:7:"#90EE90";s:9:"lightpink";s:7:"#FFB6C1";s:11:"lightsalmon";s:7:"#FFA07A";s:13:"lightseagreen";s:7:"#20B2AA";s:12:"lightskyblue";s:7:"#87CEFA";s:14:"lightslategray";s:7:"#778899";s:14:"lightslategrey";s:7:"#778899";s:14:"lightsteelblue";s:7:"#B0C4DE";s:11:"lightyellow";s:7:"#FFFFE0";s:4:"lime";s:7:"#00FF00";s:9:"limegreen";s:7:"#32CD32";s:5:"linen";s:7:"#FAF0E6";s:7:"magenta";s:7:"#FF00FF";s:6:"maroon";s:7:"#800000";s:16:"mediumaquamarine";s:7:"#66CDAA";s:10:"mediumblue";s:7:"#0000CD";s:12:"mediumorchid";s:7:"#BA55D3";s:12:"mediumpurple";s:7:"#9370DB";s:14:"mediumseagreen";s:7:"#3CB371";s:15:"mediumslateblue";s:7:"#7B68EE";s:17:"mediumspringgreen";s:7:"#00FA9A";s:15:"mediumturquoise";s:7:"#48D1CC";s:15:"mediumvioletred";s:7:"#C71585";s:12:"midnightblue";s:7:"#191970";s:9:"mintcream";s:7:"#F5FFFA";s:9:"mistyrose";s:7:"#FFE4E1";s:8:"moccasin";s:7:"#FFE4B5";s:11:"navajowhite";s:7:"#FFDEAD";s:4:"navy";s:7:"#000080";s:7:"oldlace";s:7:"#FDF5E6";s:5:"olive";s:7:"#808000";s:9:"olivedrab";s:7:"#6B8E23";s:6:"orange";s:7:"#FFA500";s:9:"orangered";s:7:"#FF4500";s:6:"orchid";s:7:"#DA70D6";s:13:"palegoldenrod";s:7:"#EEE8AA";s:9:"palegreen";s:7:"#98FB98";s:13:"paleturquoise";s:7:"#AFEEEE";s:13:"palevioletred";s:7:"#DB7093";s:10:"papayawhip";s:7:"#FFEFD5";s:9:"peachpuff";s:7:"#FFDAB9";s:4:"peru";s:7:"#CD853F";s:4:"pink";s:7:"#FFC0CB";s:4:"plum";s:7:"#DDA0DD";s:10:"powderblue";s:7:"#B0E0E6";s:6:"purple";s:7:"#800080";s:13:"rebeccapurple";s:7:"#663399";s:3:"red";s:7:"#FF0000";s:9:"rosybrown";s:7:"#BC8F8F";s:9:"royalblue";s:7:"#4169E1";s:11:"saddlebrown";s:7:"#8B4513";s:6:"salmon";s:7:"#FA8072";s:10:"sandybrown";s:7:"#F4A460";s:8:"seagreen";s:7:"#2E8B57";s:8:"seashell";s:7:"#FFF5EE";s:6:"sienna";s:7:"#A0522D";s:6:"silver";s:7:"#C0C0C0";s:7:"skyblue";s:7:"#87CEEB";s:9:"slateblue";s:7:"#6A5ACD";s:9:"slategray";s:7:"#708090";s:9:"slategrey";s:7:"#708090";s:4:"snow";s:7:"#FFFAFA";s:11:"springgreen";s:7:"#00FF7F";s:9:"steelblue";s:7:"#4682B4";s:3:"tan";s:7:"#D2B48C";s:4:"teal";s:7:"#008080";s:7:"thistle";s:7:"#D8BFD8";s:6:"tomato";s:7:"#FF6347";s:9:"turquoise";s:7:"#40E0D0";s:6:"violet";s:7:"#EE82EE";s:5:"wheat";s:7:"#F5DEB3";s:5:"white";s:7:"#FFFFFF";s:10:"whitesmoke";s:7:"#F5F5F5";s:6:"yellow";s:7:"#FFFF00";s:11:"yellowgreen";s:7:"#9ACD32";}s:30:"Core.ConvertDocumentToFragment";b:1;s:36:"Core.DirectLexLineNumberSyncInterval";i:0;s:20:"Core.DisableExcludes";b:0;s:15:"Core.EnableIDNA";b:0;s:13:"Core.Encoding";s:5:"utf-8";s:26:"Core.EscapeInvalidChildren";b:0;s:22:"Core.EscapeInvalidTags";b:0;s:29:"Core.EscapeNonASCIICharacters";b:0;s:19:"Core.HiddenElements";a:2:{s:6:"script";b:1;s:5:"style";b:1;}s:13:"Core.Language";s:2:"en";s:24:"Core.LegacyEntityDecoder";b:0;s:14:"Core.LexerImpl";N;s:24:"Core.MaintainLineNumbers";N;s:22:"Core.NormalizeNewlines";b:1;s:17:"Core.RemoveBlanks";b:0;s:21:"Core.RemoveInvalidImg";b:1;s:33:"Core.RemoveProcessingInstructions";b:0;s:25:"Core.RemoveScriptContents";N;s:13:"Filter.Custom";a:0:{}s:34:"Filter.ExtractStyleBlocks.Escaping";b:1;s:31:"Filter.ExtractStyleBlocks.Scope";N;s:34:"Filter.ExtractStyleBlocks.TidyImpl";N;s:25:"Filter.ExtractStyleBlocks";b:0;s:14:"Filter.YouTube";b:0;s:12:"HTML.Allowed";N;s:22:"HTML.AllowedAttributes";N;s:20:"HTML.AllowedComments";a:0:{}s:26:"HTML.AllowedCommentsRegexp";N;s:20:"HTML.AllowedElements";N;s:19:"HTML.AllowedModules";N;s:23:"HTML.Attr.Name.UseCDATA";b:0;s:17:"HTML.BlockWrapper";s:1:"p";s:16:"HTML.CoreModules";a:7:{s:9:"Structure";b:1;s:4:"Text";b:1;s:9:"Hypertext";b:1;s:4:"List";b:1;s:22:"NonXMLCommonAttributes";b:1;s:19:"XMLCommonAttributes";b:1;s:16:"CommonAttributes";b:1;}s:18:"HTML.CustomDoctype";N;s:17:"HTML.DefinitionID";N;s:18:"HTML.DefinitionRev";i:1;s:12:"HTML.Doctype";N;s:25:"HTML.FlashAllowFullScreen";b:0;s:24:"HTML.ForbiddenAttributes";a:0:{}s:22:"HTML.ForbiddenElements";a:0:{}s:10:"HTML.Forms";b:0;s:17:"HTML.MaxImgLength";N;s:13:"HTML.Nofollow";b:0;s:11:"HTML.Parent";s:3:"div";s:16:"HTML.Proprietary";b:0;s:14:"HTML.SafeEmbed";b:0;s:15:"HTML.SafeIframe";b:0;s:15:"HTML.SafeObject";b:0;s:18:"HTML.SafeScripting";a:0:{}s:11:"HTML.Strict";b:0;s:16:"HTML.TargetBlank";b:0;s:19:"HTML.TargetNoopener";b:1;s:21:"HTML.TargetNoreferrer";b:1;s:12:"HTML.TidyAdd";a:0:{}s:14:"HTML.TidyLevel";s:6:"medium";s:15:"HTML.TidyRemove";a:0:{}s:12:"HTML.Trusted";b:0;s:10:"HTML.XHTML";b:1;s:28:"Output.CommentScriptContents";b:1;s:19:"Output.FixInnerHTML";b:1;s:18:"Output.FlashCompat";b:0;s:14:"Output.Newline";N;s:15:"Output.SortAttr";b:0;s:17:"Output.TidyFormat";b:0;s:17:"Test.ForceNoIconv";b:0;s:18:"URI.AllowedSchemes";a:7:{s:4:"http";b:1;s:5:"https";b:1;s:6:"mailto";b:1;s:3:"ftp";b:1;s:4:"nntp";b:1;s:4:"news";b:1;s:3:"tel";b:1;}s:18:"URI.AllowedSymbols";s:11:"!$&'()*+,;=";s:8:"URI.Base";N;s:17:"URI.DefaultScheme";s:4:"http";s:16:"URI.DefinitionID";N;s:17:"URI.DefinitionRev";i:1;s:11:"URI.Disable";b:0;s:19:"URI.DisableExternal";b:0;s:28:"URI.DisableExternalResources";b:0;s:20:"URI.DisableResources";b:0;s:8:"URI.Host";N;s:17:"URI.HostBlacklist";a:0:{}s:16:"URI.MakeAbsolute";b:0;s:9:"URI.Munge";N;s:18:"URI.MungeResources";b:0;s:18:"URI.MungeSecretKey";N;s:26:"URI.OverrideAllowedSchemes";b:1;s:19:"URI.SafeIframeHosts";N;s:20:"URI.SafeIframeRegexp";N;}s:12:"defaultPlist";O:25:"HTMLPurifier_PropertyList":3:{s:7:"*data";a:130:{s:19:"Attr.AllowedClasses";N;s:24:"Attr.AllowedFrameTargets";a:0:{}s:15:"Attr.AllowedRel";a:0:{}s:15:"Attr.AllowedRev";a:0:{}s:18:"Attr.ClassUseCDATA";N;s:20:"Attr.DefaultImageAlt";N;s:24:"Attr.DefaultInvalidImage";s:0:"";s:27:"Attr.DefaultInvalidImageAlt";s:13:"Invalid image";s:19:"Attr.DefaultTextDir";s:3:"ltr";s:13:"Attr.EnableID";b:0;s:21:"Attr.ForbiddenClasses";a:0:{}s:13:"Attr.ID.HTML5";N;s:16:"Attr.IDBlacklist";a:0:{}s:22:"Attr.IDBlacklistRegexp";N;s:13:"Attr.IDPrefix";s:0:"";s:18:"Attr.IDPrefixLocal";s:0:"";s:24:"AutoFormat.AutoParagraph";b:0;s:17:"AutoFormat.Custom";a:0:{}s:25:"AutoFormat.DisplayLinkURI";b:0;s:18:"AutoFormat.Linkify";b:0;s:33:"AutoFormat.PurifierLinkify.DocURL";s:3:"#%s";s:26:"AutoFormat.PurifierLinkify";b:0;s:32:"AutoFormat.RemoveEmpty.Predicate";a:4:{s:8:"colgroup";a:0:{}s:2:"th";a:0:{}s:2:"td";a:0:{}s:6:"iframe";a:1:{i:0;s:3:"src";}}s:44:"AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions";a:2:{s:2:"td";b:1;s:2:"th";b:1;}s:33:"AutoFormat.RemoveEmpty.RemoveNbsp";b:0;s:22:"AutoFormat.RemoveEmpty";b:0;s:39:"AutoFormat.RemoveSpansWithoutAttributes";b:0;s:19:"CSS.AllowDuplicates";b:0;s:18:"CSS.AllowImportant";b:0;s:15:"CSS.AllowTricky";b:0;s:16:"CSS.AllowedFonts";N;s:21:"CSS.AllowedProperties";N;s:17:"CSS.DefinitionRev";i:1;s:23:"CSS.ForbiddenProperties";a:0:{}s:16:"CSS.MaxImgLength";N;s:15:"CSS.Proprietary";b:0;s:11:"CSS.Trusted";b:0;s:20:"Cache.DefinitionImpl";s:10:"Serializer";s:20:"Cache.SerializerPath";N;s:27:"Cache.SerializerPermissions";i:493;s:22:"Core.AggressivelyFixLt";b:1;s:29:"Core.AggressivelyRemoveScript";b:1;s:28:"Core.AllowHostnameUnderscore";b:0;s:23:"Core.AllowParseManyTags";b:0;s:18:"Core.CollectErrors";b:0;s:18:"Core.ColorKeywords";a:148:{s:9:"aliceblue";s:7:"#F0F8FF";s:12:"antiquewhite";s:7:"#FAEBD7";s:4:"aqua";s:7:"#00FFFF";s:10:"aquamarine";s:7:"#7FFFD4";s:5:"azure";s:7:"#F0FFFF";s:5:"beige";s:7:"#F5F5DC";s:6:"bisque";s:7:"#FFE4C4";s:5:"black";s:7:"#000000";s:14:"blanchedalmond";s:7:"#FFEBCD";s:4:"blue";s:7:"#0000FF";s:10:"blueviolet";s:7:"#8A2BE2";s:5:"brown";s:7:"#A52A2A";s:9:"burlywood";s:7:"#DEB887";s:9:"cadetblue";s:7:"#5F9EA0";s:10:"chartreuse";s:7:"#7FFF00";s:9:"chocolate";s:7:"#D2691E";s:5:"coral";s:7:"#FF7F50";s:14:"cornflowerblue";s:7:"#6495ED";s:8:"cornsilk";s:7:"#FFF8DC";s:7:"crimson";s:7:"#DC143C";s:4:"cyan";s:7:"#00FFFF";s:8:"darkblue";s:7:"#00008B";s:8:"darkcyan";s:7:"#008B8B";s:13:"darkgoldenrod";s:7:"#B8860B";s:8:"darkgray";s:7:"#A9A9A9";s:8:"darkgrey";s:7:"#A9A9A9";s:9:"darkgreen";s:7:"#006400";s:9:"darkkhaki";s:7:"#BDB76B";s:11:"darkmagenta";s:7:"#8B008B";s:14:"darkolivegreen";s:7:"#556B2F";s:10:"darkorange";s:7:"#FF8C00";s:10:"darkorchid";s:7:"#9932CC";s:7:"darkred";s:7:"#8B0000";s:10:"darksalmon";s:7:"#E9967A";s:12:"darkseagreen";s:7:"#8FBC8F";s:13:"darkslateblue";s:7:"#483D8B";s:13:"darkslategray";s:7:"#2F4F4F";s:13:"darkslategrey";s:7:"#2F4F4F";s:13:"darkturquoise";s:7:"#00CED1";s:10:"darkviolet";s:7:"#9400D3";s:8:"deeppink";s:7:"#FF1493";s:11:"deepskyblue";s:7:"#00BFFF";s:7:"dimgray";s:7:"#696969";s:7:"dimgrey";s:7:"#696969";s:10:"dodgerblue";s:7:"#1E90FF";s:9:"firebrick";s:7:"#B22222";s:11:"floralwhite";s:7:"#FFFAF0";s:11:"forestgreen";s:7:"#228B22";s:7:"fuchsia";s:7:"#FF00FF";s:9:"gainsboro";s:7:"#DCDCDC";s:10:"ghostwhite";s:7:"#F8F8FF";s:4:"gold";s:7:"#FFD700";s:9:"goldenrod";s:7:"#DAA520";s:4:"gray";s:7:"#808080";s:4:"grey";s:7:"#808080";s:5:"green";s:7:"#008000";s:11:"greenyellow";s:7:"#ADFF2F";s:8:"honeydew";s:7:"#F0FFF0";s:7:"hotpink";s:7:"#FF69B4";s:9:"indianred";s:7:"#CD5C5C";s:6:"indigo";s:7:"#4B0082";s:5:"ivory";s:7:"#FFFFF0";s:5:"khaki";s:7:"#F0E68C";s:8:"lavender";s:7:"#E6E6FA";s:13:"lavenderblush";s:7:"#FFF0F5";s:9:"lawngreen";s:7:"#7CFC00";s:12:"lemonchiffon";s:7:"#FFFACD";s:9:"lightblue";s:7:"#ADD8E6";s:10:"lightcoral";s:7:"#F08080";s:9:"lightcyan";s:7:"#E0FFFF";s:20:"lightgoldenrodyellow";s:7:"#FAFAD2";s:9:"lightgray";s:7:"#D3D3D3";s:9:"lightgrey";s:7:"#D3D3D3";s:10:"lightgreen";s:7:"#90EE90";s:9:"lightpink";s:7:"#FFB6C1";s:11:"lightsalmon";s:7:"#FFA07A";s:13:"lightseagreen";s:7:"#20B2AA";s:12:"lightskyblue";s:7:"#87CEFA";s:14:"lightslategray";s:7:"#778899";s:14:"lightslategrey";s:7:"#778899";s:14:"lightsteelblue";s:7:"#B0C4DE";s:11:"lightyellow";s:7:"#FFFFE0";s:4:"lime";s:7:"#00FF00";s:9:"limegreen";s:7:"#32CD32";s:5:"linen";s:7:"#FAF0E6";s:7:"magenta";s:7:"#FF00FF";s:6:"maroon";s:7:"#800000";s:16:"mediumaquamarine";s:7:"#66CDAA";s:10:"mediumblue";s:7:"#0000CD";s:12:"mediumorchid";s:7:"#BA55D3";s:12:"mediumpurple";s:7:"#9370DB";s:14:"mediumseagreen";s:7:"#3CB371";s:15:"mediumslateblue";s:7:"#7B68EE";s:17:"mediumspringgreen";s:7:"#00FA9A";s:15:"mediumturquoise";s:7:"#48D1CC";s:15:"mediumvioletred";s:7:"#C71585";s:12:"midnightblue";s:7:"#191970";s:9:"mintcream";s:7:"#F5FFFA";s:9:"mistyrose";s:7:"#FFE4E1";s:8:"moccasin";s:7:"#FFE4B5";s:11:"navajowhite";s:7:"#FFDEAD";s:4:"navy";s:7:"#000080";s:7:"oldlace";s:7:"#FDF5E6";s:5:"olive";s:7:"#808000";s:9:"olivedrab";s:7:"#6B8E23";s:6:"orange";s:7:"#FFA500";s:9:"orangered";s:7:"#FF4500";s:6:"orchid";s:7:"#DA70D6";s:13:"palegoldenrod";s:7:"#EEE8AA";s:9:"palegreen";s:7:"#98FB98";s:13:"paleturquoise";s:7:"#AFEEEE";s:13:"palevioletred";s:7:"#DB7093";s:10:"papayawhip";s:7:"#FFEFD5";s:9:"peachpuff";s:7:"#FFDAB9";s:4:"peru";s:7:"#CD853F";s:4:"pink";s:7:"#FFC0CB";s:4:"plum";s:7:"#DDA0DD";s:10:"powderblue";s:7:"#B0E0E6";s:6:"purple";s:7:"#800080";s:13:"rebeccapurple";s:7:"#663399";s:3:"red";s:7:"#FF0000";s:9:"rosybrown";s:7:"#BC8F8F";s:9:"royalblue";s:7:"#4169E1";s:11:"saddlebrown";s:7:"#8B4513";s:6:"salmon";s:7:"#FA8072";s:10:"sandybrown";s:7:"#F4A460";s:8:"seagreen";s:7:"#2E8B57";s:8:"seashell";s:7:"#FFF5EE";s:6:"sienna";s:7:"#A0522D";s:6:"silver";s:7:"#C0C0C0";s:7:"skyblue";s:7:"#87CEEB";s:9:"slateblue";s:7:"#6A5ACD";s:9:"slategray";s:7:"#708090";s:9:"slategrey";s:7:"#708090";s:4:"snow";s:7:"#FFFAFA";s:11:"springgreen";s:7:"#00FF7F";s:9:"steelblue";s:7:"#4682B4";s:3:"tan";s:7:"#D2B48C";s:4:"teal";s:7:"#008080";s:7:"thistle";s:7:"#D8BFD8";s:6:"tomato";s:7:"#FF6347";s:9:"turquoise";s:7:"#40E0D0";s:6:"violet";s:7:"#EE82EE";s:5:"wheat";s:7:"#F5DEB3";s:5:"white";s:7:"#FFFFFF";s:10:"whitesmoke";s:7:"#F5F5F5";s:6:"yellow";s:7:"#FFFF00";s:11:"yellowgreen";s:7:"#9ACD32";}s:30:"Core.ConvertDocumentToFragment";b:1;s:36:"Core.DirectLexLineNumberSyncInterval";i:0;s:20:"Core.DisableExcludes";b:0;s:15:"Core.EnableIDNA";b:0;s:13:"Core.Encoding";s:5:"utf-8";s:26:"Core.EscapeInvalidChildren";b:0;s:22:"Core.EscapeInvalidTags";b:0;s:29:"Core.EscapeNonASCIICharacters";b:0;s:19:"Core.HiddenElements";a:2:{s:6:"script";b:1;s:5:"style";b:1;}s:13:"Core.Language";s:2:"en";s:24:"Core.LegacyEntityDecoder";b:0;s:14:"Core.LexerImpl";N;s:24:"Core.MaintainLineNumbers";N;s:22:"Core.NormalizeNewlines";b:1;s:17:"Core.RemoveBlanks";b:0;s:21:"Core.RemoveInvalidImg";b:1;s:33:"Core.RemoveProcessingInstructions";b:0;s:25:"Core.RemoveScriptContents";N;s:13:"Filter.Custom";a:0:{}s:34:"Filter.ExtractStyleBlocks.Escaping";b:1;s:31:"Filter.ExtractStyleBlocks.Scope";N;s:34:"Filter.ExtractStyleBlocks.TidyImpl";N;s:25:"Filter.ExtractStyleBlocks";b:0;s:14:"Filter.YouTube";b:0;s:12:"HTML.Allowed";N;s:22:"HTML.AllowedAttributes";N;s:20:"HTML.AllowedComments";a:0:{}s:26:"HTML.AllowedCommentsRegexp";N;s:20:"HTML.AllowedElements";N;s:19:"HTML.AllowedModules";N;s:23:"HTML.Attr.Name.UseCDATA";b:0;s:17:"HTML.BlockWrapper";s:1:"p";s:16:"HTML.CoreModules";a:7:{s:9:"Structure";b:1;s:4:"Text";b:1;s:9:"Hypertext";b:1;s:4:"List";b:1;s:22:"NonXMLCommonAttributes";b:1;s:19:"XMLCommonAttributes";b:1;s:16:"CommonAttributes";b:1;}s:18:"HTML.CustomDoctype";N;s:17:"HTML.DefinitionID";N;s:18:"HTML.DefinitionRev";i:1;s:12:"HTML.Doctype";N;s:25:"HTML.FlashAllowFullScreen";b:0;s:24:"HTML.ForbiddenAttributes";a:0:{}s:22:"HTML.ForbiddenElements";a:0:{}s:10:"HTML.Forms";b:0;s:17:"HTML.MaxImgLength";N;s:13:"HTML.Nofollow";b:0;s:11:"HTML.Parent";s:3:"div";s:16:"HTML.Proprietary";b:0;s:14:"HTML.SafeEmbed";b:0;s:15:"HTML.SafeIframe";b:0;s:15:"HTML.SafeObject";b:0;s:18:"HTML.SafeScripting";a:0:{}s:11:"HTML.Strict";b:0;s:16:"HTML.TargetBlank";b:0;s:19:"HTML.TargetNoopener";b:1;s:21:"HTML.TargetNoreferrer";b:1;s:12:"HTML.TidyAdd";a:0:{}s:14:"HTML.TidyLevel";s:6:"medium";s:15:"HTML.TidyRemove";a:0:{}s:12:"HTML.Trusted";b:0;s:10:"HTML.XHTML";b:1;s:28:"Output.CommentScriptContents";b:1;s:19:"Output.FixInnerHTML";b:1;s:18:"Output.FlashCompat";b:0;s:14:"Output.Newline";N;s:15:"Output.SortAttr";b:0;s:17:"Output.TidyFormat";b:0;s:17:"Test.ForceNoIconv";b:0;s:18:"URI.AllowedSchemes";a:7:{s:4:"http";b:1;s:5:"https";b:1;s:6:"mailto";b:1;s:3:"ftp";b:1;s:4:"nntp";b:1;s:4:"news";b:1;s:3:"tel";b:1;}s:18:"URI.AllowedSymbols";s:11:"!$&'()*+,;=";s:8:"URI.Base";N;s:17:"URI.DefaultScheme";s:4:"http";s:16:"URI.DefinitionID";N;s:17:"URI.DefinitionRev";i:1;s:11:"URI.Disable";b:0;s:19:"URI.DisableExternal";b:0;s:28:"URI.DisableExternalResources";b:0;s:20:"URI.DisableResources";b:0;s:8:"URI.Host";N;s:17:"URI.HostBlacklist";a:0:{}s:16:"URI.MakeAbsolute";b:0;s:9:"URI.Munge";N;s:18:"URI.MungeResources";b:0;s:18:"URI.MungeSecretKey";N;s:26:"URI.OverrideAllowedSchemes";b:1;s:19:"URI.SafeIframeHosts";N;s:20:"URI.SafeIframeRegexp";N;}s:9:"*parent";N;s:8:"*cache";N;}s:4:"info";a:143:{s:19:"Attr.AllowedClasses";i:-8;s:24:"Attr.AllowedFrameTargets";i:8;s:15:"Attr.AllowedRel";i:8;s:15:"Attr.AllowedRev";i:8;s:18:"Attr.ClassUseCDATA";i:-7;s:20:"Attr.DefaultImageAlt";i:-1;s:24:"Attr.DefaultInvalidImage";i:1;s:27:"Attr.DefaultInvalidImageAlt";i:1;s:19:"Attr.DefaultTextDir";O:8:"stdClass":2:{s:4:"type";i:1;s:7:"allowed";a:2:{s:3:"ltr";b:1;s:3:"rtl";b:1;}}s:13:"Attr.EnableID";i:7;s:17:"HTML.EnableAttrID";O:8:"stdClass":2:{s:3:"key";s:13:"Attr.EnableID";s:7:"isAlias";b:1;}s:21:"Attr.ForbiddenClasses";i:8;s:13:"Attr.ID.HTML5";i:-7;s:16:"Attr.IDBlacklist";i:9;s:22:"Attr.IDBlacklistRegexp";i:-1;s:13:"Attr.IDPrefix";i:1;s:18:"Attr.IDPrefixLocal";i:1;s:24:"AutoFormat.AutoParagraph";i:7;s:17:"AutoFormat.Custom";i:9;s:25:"AutoFormat.DisplayLinkURI";i:7;s:18:"AutoFormat.Linkify";i:7;s:33:"AutoFormat.PurifierLinkify.DocURL";i:1;s:37:"AutoFormatParam.PurifierLinkifyDocURL";O:8:"stdClass":2:{s:3:"key";s:33:"AutoFormat.PurifierLinkify.DocURL";s:7:"isAlias";b:1;}s:26:"AutoFormat.PurifierLinkify";i:7;s:32:"AutoFormat.RemoveEmpty.Predicate";i:10;s:44:"AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions";i:8;s:33:"AutoFormat.RemoveEmpty.RemoveNbsp";i:7;s:22:"AutoFormat.RemoveEmpty";i:7;s:39:"AutoFormat.RemoveSpansWithoutAttributes";i:7;s:19:"CSS.AllowDuplicates";i:7;s:18:"CSS.AllowImportant";i:7;s:15:"CSS.AllowTricky";i:7;s:16:"CSS.AllowedFonts";i:-8;s:21:"CSS.AllowedProperties";i:-8;s:17:"CSS.DefinitionRev";i:5;s:23:"CSS.ForbiddenProperties";i:8;s:16:"CSS.MaxImgLength";i:-1;s:15:"CSS.Proprietary";i:7;s:11:"CSS.Trusted";i:7;s:20:"Cache.DefinitionImpl";i:-1;s:20:"Core.DefinitionCache";O:8:"stdClass":2:{s:3:"key";s:20:"Cache.DefinitionImpl";s:7:"isAlias";b:1;}s:20:"Cache.SerializerPath";i:-1;s:27:"Cache.SerializerPermissions";i:-5;s:22:"Core.AggressivelyFixLt";i:7;s:29:"Core.AggressivelyRemoveScript";i:7;s:28:"Core.AllowHostnameUnderscore";i:7;s:23:"Core.AllowParseManyTags";i:7;s:18:"Core.CollectErrors";i:7;s:18:"Core.ColorKeywords";i:10;s:30:"Core.ConvertDocumentToFragment";i:7;s:24:"Core.AcceptFullDocuments";O:8:"stdClass":2:{s:3:"key";s:30:"Core.ConvertDocumentToFragment";s:7:"isAlias";b:1;}s:36:"Core.DirectLexLineNumberSyncInterval";i:5;s:20:"Core.DisableExcludes";i:7;s:15:"Core.EnableIDNA";i:7;s:13:"Core.Encoding";i:2;s:26:"Core.EscapeInvalidChildren";i:7;s:22:"Core.EscapeInvalidTags";i:7;s:29:"Core.EscapeNonASCIICharacters";i:7;s:19:"Core.HiddenElements";i:8;s:13:"Core.Language";i:1;s:24:"Core.LegacyEntityDecoder";i:7;s:14:"Core.LexerImpl";i:-11;s:24:"Core.MaintainLineNumbers";i:-7;s:22:"Core.NormalizeNewlines";i:7;s:17:"Core.RemoveBlanks";i:7;s:21:"Core.RemoveInvalidImg";i:7;s:33:"Core.RemoveProcessingInstructions";i:7;s:25:"Core.RemoveScriptContents";i:-7;s:13:"Filter.Custom";i:9;s:34:"Filter.ExtractStyleBlocks.Escaping";i:7;s:33:"Filter.ExtractStyleBlocksEscaping";O:8:"stdClass":2:{s:3:"key";s:34:"Filter.ExtractStyleBlocks.Escaping";s:7:"isAlias";b:1;}s:38:"FilterParam.ExtractStyleBlocksEscaping";O:8:"stdClass":2:{s:3:"key";s:34:"Filter.ExtractStyleBlocks.Escaping";s:7:"isAlias";b:1;}s:31:"Filter.ExtractStyleBlocks.Scope";i:-1;s:30:"Filter.ExtractStyleBlocksScope";O:8:"stdClass":2:{s:3:"key";s:31:"Filter.ExtractStyleBlocks.Scope";s:7:"isAlias";b:1;}s:35:"FilterParam.ExtractStyleBlocksScope";O:8:"stdClass":2:{s:3:"key";s:31:"Filter.ExtractStyleBlocks.Scope";s:7:"isAlias";b:1;}s:34:"Filter.ExtractStyleBlocks.TidyImpl";i:-11;s:38:"FilterParam.ExtractStyleBlocksTidyImpl";O:8:"stdClass":2:{s:3:"key";s:34:"Filter.ExtractStyleBlocks.TidyImpl";s:7:"isAlias";b:1;}s:25:"Filter.ExtractStyleBlocks";i:7;s:14:"Filter.YouTube";i:7;s:12:"HTML.Allowed";i:-4;s:22:"HTML.AllowedAttributes";i:-8;s:20:"HTML.AllowedComments";i:8;s:26:"HTML.AllowedCommentsRegexp";i:-1;s:20:"HTML.AllowedElements";i:-8;s:19:"HTML.AllowedModules";i:-8;s:23:"HTML.Attr.Name.UseCDATA";i:7;s:17:"HTML.BlockWrapper";i:1;s:16:"HTML.CoreModules";i:8;s:18:"HTML.CustomDoctype";i:-1;s:17:"HTML.DefinitionID";i:-1;s:18:"HTML.DefinitionRev";i:5;s:12:"HTML.Doctype";O:8:"stdClass":3:{s:4:"type";i:1;s:10:"allow_null";b:1;s:7:"allowed";a:5:{s:22:"HTML 4.01 Transitional";b:1;s:16:"HTML 4.01 Strict";b:1;s:22:"XHTML 1.0 Transitional";b:1;s:16:"XHTML 1.0 Strict";b:1;s:9:"XHTML 1.1";b:1;}}s:25:"HTML.FlashAllowFullScreen";i:7;s:24:"HTML.ForbiddenAttributes";i:8;s:22:"HTML.ForbiddenElements";i:8;s:10:"HTML.Forms";i:7;s:17:"HTML.MaxImgLength";i:-5;s:13:"HTML.Nofollow";i:7;s:11:"HTML.Parent";i:1;s:16:"HTML.Proprietary";i:7;s:14:"HTML.SafeEmbed";i:7;s:15:"HTML.SafeIframe";i:7;s:15:"HTML.SafeObject";i:7;s:18:"HTML.SafeScripting";i:8;s:11:"HTML.Strict";i:7;s:16:"HTML.TargetBlank";i:7;s:19:"HTML.TargetNoopener";i:7;s:21:"HTML.TargetNoreferrer";i:7;s:12:"HTML.TidyAdd";i:8;s:14:"HTML.TidyLevel";O:8:"stdClass":2:{s:4:"type";i:1;s:7:"allowed";a:4:{s:4:"none";b:1;s:5:"light";b:1;s:6:"medium";b:1;s:5:"heavy";b:1;}}s:15:"HTML.TidyRemove";i:8;s:12:"HTML.Trusted";i:7;s:10:"HTML.XHTML";i:7;s:10:"Core.XHTML";O:8:"stdClass":2:{s:3:"key";s:10:"HTML.XHTML";s:7:"isAlias";b:1;}s:28:"Output.CommentScriptContents";i:7;s:26:"Core.CommentScriptContents";O:8:"stdClass":2:{s:3:"key";s:28:"Output.CommentScriptContents";s:7:"isAlias";b:1;}s:19:"Output.FixInnerHTML";i:7;s:18:"Output.FlashCompat";i:7;s:14:"Output.Newline";i:-1;s:15:"Output.SortAttr";i:7;s:17:"Output.TidyFormat";i:7;s:15:"Core.TidyFormat";O:8:"stdClass":2:{s:3:"key";s:17:"Output.TidyFormat";s:7:"isAlias";b:1;}s:17:"Test.ForceNoIconv";i:7;s:18:"URI.AllowedSchemes";i:8;s:18:"URI.AllowedSymbols";i:-1;s:8:"URI.Base";i:-1;s:17:"URI.DefaultScheme";i:-1;s:16:"URI.DefinitionID";i:-1;s:17:"URI.DefinitionRev";i:5;s:11:"URI.Disable";i:7;s:15:"Attr.DisableURI";O:8:"stdClass":2:{s:3:"key";s:11:"URI.Disable";s:7:"isAlias";b:1;}s:19:"URI.DisableExternal";i:7;s:28:"URI.DisableExternalResources";i:7;s:20:"URI.DisableResources";i:7;s:8:"URI.Host";i:-1;s:17:"URI.HostBlacklist";i:9;s:16:"URI.MakeAbsolute";i:7;s:9:"URI.Munge";i:-1;s:18:"URI.MungeResources";i:7;s:18:"URI.MungeSecretKey";i:-1;s:26:"URI.OverrideAllowedSchemes";i:7;s:19:"URI.SafeIframeHosts";i:-8;s:20:"URI.SafeIframeRegexp";i:-1;}} \ No newline at end of file diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt new file mode 100644 index 0000000..0517fed --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt @@ -0,0 +1,8 @@ +Attr.AllowedClasses +TYPE: lookup/null +VERSION: 4.0.0 +DEFAULT: null +--DESCRIPTION-- +List of allowed class values in the class attribute. By default, this is null, +which means all classes are allowed. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt new file mode 100644 index 0000000..249edd6 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt @@ -0,0 +1,12 @@ +Attr.AllowedFrameTargets +TYPE: lookup +DEFAULT: array() +--DESCRIPTION-- +Lookup table of all allowed link frame targets. Some commonly used link +targets include _blank, _self, _parent and _top. Values should be +lowercase, as validation will be done in a case-sensitive manner despite +W3C's recommendation. XHTML 1.0 Strict does not permit the target attribute +so this directive will have no effect in that doctype. XHTML 1.1 does not +enable the Target module by default, you will have to manually enable it +(see the module documentation for more details.) +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt new file mode 100644 index 0000000..9a8fa6a --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt @@ -0,0 +1,9 @@ +Attr.AllowedRel +TYPE: lookup +VERSION: 1.6.0 +DEFAULT: array() +--DESCRIPTION-- +List of allowed forward document relationships in the rel attribute. Common +values may be nofollow or print. By default, this is empty, meaning that no +document relationships are allowed. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt new file mode 100644 index 0000000..b017883 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt @@ -0,0 +1,9 @@ +Attr.AllowedRev +TYPE: lookup +VERSION: 1.6.0 +DEFAULT: array() +--DESCRIPTION-- +List of allowed reverse document relationships in the rev attribute. This +attribute is a bit of an edge-case; if you don't know what it is for, stay +away. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt new file mode 100644 index 0000000..e774b82 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt @@ -0,0 +1,19 @@ +Attr.ClassUseCDATA +TYPE: bool/null +DEFAULT: null +VERSION: 4.0.0 +--DESCRIPTION-- +If null, class will auto-detect the doctype and, if matching XHTML 1.1 or +XHTML 2.0, will use the restrictive NMTOKENS specification of class. Otherwise, +it will use a relaxed CDATA definition. If true, the relaxed CDATA definition +is forced; if false, the NMTOKENS definition is forced. To get behavior +of HTML Purifier prior to 4.0.0, set this directive to false. + +Some rational behind the auto-detection: +in previous versions of HTML Purifier, it was assumed that the form of +class was NMTOKENS, as specified by the XHTML Modularization (representing +XHTML 1.1 and XHTML 2.0). The DTDs for HTML 4.01 and XHTML 1.0, however +specify class as CDATA. HTML 5 effectively defines it as CDATA, but +with the additional constraint that each name should be unique (this is not +explicitly outlined in previous specifications). +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt new file mode 100644 index 0000000..533165e --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt @@ -0,0 +1,11 @@ +Attr.DefaultImageAlt +TYPE: string/null +DEFAULT: null +VERSION: 3.2.0 +--DESCRIPTION-- +This is the content of the alt tag of an image if the user had not +previously specified an alt attribute. This applies to all images without +a valid alt attribute, as opposed to %Attr.DefaultInvalidImageAlt, which +only applies to invalid images, and overrides in the case of an invalid image. +Default behavior with null is to use the basename of the src tag for the alt. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt new file mode 100644 index 0000000..9eb7e38 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt @@ -0,0 +1,9 @@ +Attr.DefaultInvalidImage +TYPE: string +DEFAULT: '' +--DESCRIPTION-- +This is the default image an img tag will be pointed to if it does not have +a valid src attribute. In future versions, we may allow the image tag to +be removed completely, but due to design issues, this is not possible right +now. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt new file mode 100644 index 0000000..2f17bf4 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt @@ -0,0 +1,8 @@ +Attr.DefaultInvalidImageAlt +TYPE: string +DEFAULT: 'Invalid image' +--DESCRIPTION-- +This is the content of the alt tag of an invalid image if the user had not +previously specified an alt attribute. It has no effect when the image is +valid but there was no alt attribute present. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt new file mode 100644 index 0000000..52654b5 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt @@ -0,0 +1,10 @@ +Attr.DefaultTextDir +TYPE: string +DEFAULT: 'ltr' +--DESCRIPTION-- +Defines the default text direction (ltr or rtl) of the document being +parsed. This generally is the same as the value of the dir attribute in +HTML, or ltr if that is not specified. +--ALLOWED-- +'ltr', 'rtl' +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt new file mode 100644 index 0000000..6440d21 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt @@ -0,0 +1,16 @@ +Attr.EnableID +TYPE: bool +DEFAULT: false +VERSION: 1.2.0 +--DESCRIPTION-- +Allows the ID attribute in HTML. This is disabled by default due to the +fact that without proper configuration user input can easily break the +validation of a webpage by specifying an ID that is already on the +surrounding HTML. If you don't mind throwing caution to the wind, enable +this directive, but I strongly recommend you also consider blacklisting IDs +you use (%Attr.IDBlacklist) or prefixing all user supplied IDs +(%Attr.IDPrefix). When set to true HTML Purifier reverts to the behavior of +pre-1.2.0 versions. +--ALIASES-- +HTML.EnableAttrID +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt new file mode 100644 index 0000000..f31d226 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt @@ -0,0 +1,8 @@ +Attr.ForbiddenClasses +TYPE: lookup +VERSION: 4.0.0 +DEFAULT: array() +--DESCRIPTION-- +List of forbidden class values in the class attribute. By default, this is +empty, which means that no classes are forbidden. See also %Attr.AllowedClasses. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt new file mode 100644 index 0000000..735d4b7 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt @@ -0,0 +1,10 @@ +Attr.ID.HTML5 +TYPE: bool/null +DEFAULT: null +VERSION: 4.8.0 +--DESCRIPTION-- +In HTML5, restrictions on the format of the id attribute have been significantly +relaxed, such that any string is valid so long as it contains no spaces and +is at least one character. In lieu of a general HTML5 compatibility flag, +set this configuration directive to true to use the relaxed rules. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt new file mode 100644 index 0000000..5f2b5e3 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt @@ -0,0 +1,5 @@ +Attr.IDBlacklist +TYPE: list +DEFAULT: array() +DESCRIPTION: Array of IDs not allowed in the document. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt new file mode 100644 index 0000000..6f58245 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt @@ -0,0 +1,9 @@ +Attr.IDBlacklistRegexp +TYPE: string/null +VERSION: 1.6.0 +DEFAULT: NULL +--DESCRIPTION-- +PCRE regular expression to be matched against all IDs. If the expression is +matches, the ID is rejected. Use this with care: may cause significant +degradation. ID matching is done after all other validation. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt new file mode 100644 index 0000000..cc49d43 --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt @@ -0,0 +1,12 @@ +Attr.IDPrefix +TYPE: string +VERSION: 1.2.0 +DEFAULT: '' +--DESCRIPTION-- +String to prefix to IDs. If you have no idea what IDs your pages may use, +you may opt to simply add a prefix to all user-submitted ID attributes so +that they are still usable, but will not conflict with core page IDs. +Example: setting the directive to 'user_' will result in a user submitted +'foo' to become 'user_foo' Be sure to set %HTML.EnableAttrID to true +before using this. +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt new file mode 100644 index 0000000..dc6e30f --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt @@ -0,0 +1,14 @@ +Attr.IDPrefixLocal +TYPE: string +VERSION: 1.2.0 +DEFAULT: '' +--DESCRIPTION-- +Temporary prefix for IDs used in conjunction with %Attr.IDPrefix. If you +need to allow multiple sets of user content on web page, you may need to +have a separate prefix that changes with each iteration. This way, +separately submitted user content displayed on the same page doesn't +clobber each other. Ideal values are unique identifiers for the content it +represents (i.e. the id of the row in the database). Be sure to add a +separator (like an underscore) at the end. Warning: this directive will +not work unless %Attr.IDPrefix is set to a non-empty value! +--# vim: et sw=4 sts=4 diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt new file mode 100644 index 0000000..d5caa1b --- /dev/null +++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt @@ -0,0 +1,31 @@ +AutoFormat.AutoParagraph +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +