aws-sdk 1.8.5 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/README.rdoc +8 -0
- data/lib/aws-sdk.rb +39 -35
- data/lib/aws/api_config/CloudFront-2012-07-01.yml +2398 -0
- data/lib/aws/api_config/DirectConnect-2012-10-25.yml +475 -0
- data/lib/aws/api_config/DynamoDB-2011-12-05.yml +8 -0
- data/lib/aws/api_config/DynamoDB-2012-08-10.yml +1516 -0
- data/lib/aws/api_config/OpsWorks-2013-02-18.yml +2 -2
- data/lib/aws/auto_scaling.rb +44 -44
- data/lib/aws/auto_scaling/activity.rb +1 -1
- data/lib/aws/auto_scaling/activity_collection.rb +14 -15
- data/lib/aws/auto_scaling/client.rb +277 -277
- data/lib/aws/auto_scaling/config.rb +1 -1
- data/lib/aws/auto_scaling/group.rb +35 -36
- data/lib/aws/auto_scaling/group_collection.rb +10 -10
- data/lib/aws/auto_scaling/group_options.rb +19 -19
- data/lib/aws/auto_scaling/instance.rb +27 -27
- data/lib/aws/auto_scaling/instance_collection.rb +10 -10
- data/lib/aws/auto_scaling/launch_configuration.rb +3 -3
- data/lib/aws/auto_scaling/launch_configuration_collection.rb +1 -1
- data/lib/aws/auto_scaling/notification_configuration.rb +2 -2
- data/lib/aws/auto_scaling/notification_configuration_collection.rb +37 -38
- data/lib/aws/auto_scaling/scaling_policy.rb +3 -3
- data/lib/aws/auto_scaling/scaling_policy_collection.rb +6 -6
- data/lib/aws/auto_scaling/scaling_policy_options.rb +8 -7
- data/lib/aws/auto_scaling/scheduled_action.rb +3 -3
- data/lib/aws/auto_scaling/scheduled_action_collection.rb +28 -28
- data/lib/aws/auto_scaling/tag_collection.rb +30 -28
- data/lib/aws/cloud_formation.rb +95 -94
- data/lib/aws/cloud_formation/client.rb +136 -133
- data/lib/aws/cloud_formation/config.rb +1 -1
- data/lib/aws/cloud_formation/stack.rb +37 -37
- data/lib/aws/cloud_formation/stack_collection.rb +28 -27
- data/lib/aws/cloud_formation/stack_event.rb +9 -11
- data/lib/aws/cloud_formation/stack_output.rb +1 -1
- data/lib/aws/cloud_formation/stack_resource.rb +6 -6
- data/lib/aws/cloud_formation/stack_resource_collection.rb +11 -12
- data/lib/aws/cloud_formation/stack_resource_summary_collection.rb +11 -11
- data/lib/aws/cloud_formation/stack_summary_collection.rb +39 -39
- data/lib/aws/cloud_front.rb +21 -21
- data/lib/aws/cloud_front/client.rb +853 -652
- data/lib/aws/cloud_front/request.rb +3 -0
- data/lib/aws/cloud_search.rb +22 -22
- data/lib/aws/cloud_search/client.rb +322 -315
- data/lib/aws/cloud_search/config.rb +1 -1
- data/lib/aws/cloud_watch.rb +39 -39
- data/lib/aws/cloud_watch/alarm.rb +55 -37
- data/lib/aws/cloud_watch/alarm_collection.rb +18 -18
- data/lib/aws/cloud_watch/alarm_history_item_collection.rb +2 -2
- data/lib/aws/cloud_watch/client.rb +360 -146
- data/lib/aws/cloud_watch/config.rb +1 -1
- data/lib/aws/cloud_watch/metric.rb +15 -15
- data/lib/aws/cloud_watch/metric_alarm_collection.rb +17 -17
- data/lib/aws/cloud_watch/metric_collection.rb +16 -16
- data/lib/aws/cloud_watch/metric_statistics.rb +11 -11
- data/lib/aws/core.rb +243 -225
- data/lib/aws/core/async_handle.rb +13 -13
- data/lib/aws/core/cacheable.rb +14 -15
- data/lib/aws/core/client.rb +40 -15
- data/lib/aws/core/collection.rb +42 -46
- data/lib/aws/core/collection/with_limit_and_next_token.rb +1 -1
- data/lib/aws/core/collection/with_next_token.rb +1 -1
- data/lib/aws/core/configuration.rb +97 -133
- data/lib/aws/core/credential_providers.rb +16 -16
- data/lib/aws/core/data.rb +23 -23
- data/lib/aws/core/http/connection_pool.rb +348 -0
- data/lib/aws/core/http/net_http_handler.rb +17 -26
- data/lib/aws/core/http/patch.rb +102 -0
- data/lib/aws/core/http/request.rb +13 -19
- data/lib/aws/core/http/response.rb +2 -2
- data/lib/aws/core/lazy_error_classes.rb +17 -17
- data/lib/aws/core/log_formatter.rb +70 -104
- data/lib/aws/core/options/json_serializer.rb +1 -1
- data/lib/aws/core/options/validator.rb +4 -4
- data/lib/aws/core/page_result.rb +8 -8
- data/lib/aws/core/policy.rb +49 -49
- data/lib/aws/core/region.rb +72 -0
- data/lib/aws/core/region_collection.rb +106 -0
- data/lib/aws/core/resource.rb +5 -5
- data/lib/aws/core/response.rb +20 -17
- data/lib/aws/core/rest_request_builder.rb +4 -4
- data/lib/aws/core/service_interface.rb +24 -2
- data/lib/aws/core/signature/version_3.rb +2 -2
- data/lib/aws/core/uri_escape.rb +1 -1
- data/lib/aws/core/xml/frame_stack.rb +1 -1
- data/lib/aws/core/xml/grammar.rb +3 -4
- data/lib/aws/core/xml/sax_handlers/libxml.rb +2 -2
- data/lib/aws/core/xml/sax_handlers/nokogiri.rb +3 -3
- data/lib/aws/core/xml/sax_handlers/rexml.rb +5 -5
- data/lib/aws/core/xml/stub.rb +9 -9
- data/lib/aws/data_pipeline.rb +21 -21
- data/lib/aws/data_pipeline/client.rb +189 -133
- data/lib/aws/data_pipeline/config.rb +1 -1
- data/lib/aws/direct_connect.rb +74 -0
- data/lib/aws/direct_connect/client.rb +253 -0
- data/lib/aws/direct_connect/config.rb +18 -0
- data/lib/aws/direct_connect/errors.rb +22 -0
- data/lib/aws/direct_connect/request.rb +27 -0
- data/lib/aws/dynamo_db.rb +71 -69
- data/lib/aws/dynamo_db/attribute_collection.rb +53 -58
- data/lib/aws/dynamo_db/batch_get.rb +23 -23
- data/lib/aws/dynamo_db/batch_write.rb +43 -43
- data/lib/aws/dynamo_db/binary.rb +9 -9
- data/lib/aws/dynamo_db/client.rb +494 -509
- data/lib/aws/dynamo_db/client_base.rb +91 -0
- data/lib/aws/dynamo_db/client_v2.rb +825 -0
- data/lib/aws/dynamo_db/config.rb +1 -1
- data/lib/aws/dynamo_db/item.rb +10 -10
- data/lib/aws/dynamo_db/item_collection.rb +75 -75
- data/lib/aws/dynamo_db/table.rb +85 -85
- data/lib/aws/dynamo_db/table_collection.rb +13 -13
- data/lib/aws/ec2.rb +132 -142
- data/lib/aws/ec2/attachment.rb +31 -36
- data/lib/aws/ec2/attachment_collection.rb +1 -1
- data/lib/aws/ec2/availability_zone.rb +4 -4
- data/lib/aws/ec2/client.rb +2272 -2125
- data/lib/aws/ec2/config.rb +1 -1
- data/lib/aws/ec2/customer_gateway.rb +6 -6
- data/lib/aws/ec2/customer_gateway_collection.rb +6 -6
- data/lib/aws/ec2/dhcp_options.rb +3 -3
- data/lib/aws/ec2/dhcp_options_collection.rb +10 -10
- data/lib/aws/ec2/elastic_ip.rb +15 -15
- data/lib/aws/ec2/elastic_ip_collection.rb +11 -15
- data/lib/aws/ec2/export_task.rb +4 -4
- data/lib/aws/ec2/export_task_collection.rb +11 -11
- data/lib/aws/ec2/filtered_collection.rb +6 -8
- data/lib/aws/ec2/image.rb +46 -40
- data/lib/aws/ec2/image_collection.rb +44 -52
- data/lib/aws/ec2/instance.rb +64 -62
- data/lib/aws/ec2/instance_collection.rb +47 -50
- data/lib/aws/ec2/internet_gateway.rb +6 -6
- data/lib/aws/ec2/internet_gateway/attachment.rb +13 -13
- data/lib/aws/ec2/internet_gateway_collection.rb +3 -3
- data/lib/aws/ec2/key_pair.rb +3 -3
- data/lib/aws/ec2/key_pair_collection.rb +12 -12
- data/lib/aws/ec2/network_acl.rb +39 -39
- data/lib/aws/ec2/network_acl/association.rb +2 -2
- data/lib/aws/ec2/network_acl/entry.rb +22 -22
- data/lib/aws/ec2/network_acl_collection.rb +2 -2
- data/lib/aws/ec2/network_interface.rb +13 -4
- data/lib/aws/ec2/network_interface/attachment.rb +3 -3
- data/lib/aws/ec2/network_interface_collection.rb +5 -5
- data/lib/aws/ec2/permission_collection.rb +1 -1
- data/lib/aws/ec2/region.rb +6 -6
- data/lib/aws/ec2/region_collection.rb +1 -1
- data/lib/aws/ec2/reserved_instances_collection.rb +2 -2
- data/lib/aws/ec2/reserved_instances_offering_collection.rb +2 -2
- data/lib/aws/ec2/resource_tag_collection.rb +5 -5
- data/lib/aws/ec2/route_table.rb +14 -14
- data/lib/aws/ec2/route_table/association.rb +22 -22
- data/lib/aws/ec2/route_table/route.rb +8 -8
- data/lib/aws/ec2/route_table_collection.rb +3 -3
- data/lib/aws/ec2/security_group.rb +39 -41
- data/lib/aws/ec2/security_group_collection.rb +19 -21
- data/lib/aws/ec2/snapshot.rb +3 -3
- data/lib/aws/ec2/snapshot_collection.rb +11 -12
- data/lib/aws/ec2/subnet.rb +2 -2
- data/lib/aws/ec2/subnet_collection.rb +17 -17
- data/lib/aws/ec2/tag_collection.rb +1 -1
- data/lib/aws/ec2/tagged_collection.rb +7 -7
- data/lib/aws/ec2/tagged_item.rb +10 -10
- data/lib/aws/ec2/volume.rb +16 -16
- data/lib/aws/ec2/volume_collection.rb +9 -12
- data/lib/aws/ec2/vpc.rb +6 -6
- data/lib/aws/ec2/vpc_collection.rb +10 -10
- data/lib/aws/ec2/vpn_connection.rb +4 -4
- data/lib/aws/ec2/vpn_connection/telemetry.rb +1 -1
- data/lib/aws/ec2/vpn_connection_collection.rb +6 -6
- data/lib/aws/ec2/vpn_gateway.rb +2 -2
- data/lib/aws/ec2/vpn_gateway_collection.rb +5 -5
- data/lib/aws/elastic_beanstalk.rb +12 -12
- data/lib/aws/elastic_beanstalk/client.rb +376 -368
- data/lib/aws/elastic_beanstalk/config.rb +1 -1
- data/lib/aws/elastic_transcoder.rb +5 -5
- data/lib/aws/elastic_transcoder/client.rb +283 -283
- data/lib/aws/elastic_transcoder/config.rb +1 -1
- data/lib/aws/elasticache.rb +12 -12
- data/lib/aws/elasticache/client.rb +484 -479
- data/lib/aws/elasticache/config.rb +1 -1
- data/lib/aws/elb.rb +23 -23
- data/lib/aws/elb/availability_zone_collection.rb +34 -34
- data/lib/aws/elb/backend_server_policy_collection.rb +24 -24
- data/lib/aws/elb/client.rb +153 -153
- data/lib/aws/elb/config.rb +1 -1
- data/lib/aws/elb/errors.rb +1 -1
- data/lib/aws/elb/instance_collection.rb +20 -25
- data/lib/aws/elb/listener.rb +3 -3
- data/lib/aws/elb/listener_collection.rb +8 -8
- data/lib/aws/elb/load_balancer.rb +15 -16
- data/lib/aws/elb/load_balancer_collection.rb +36 -24
- data/lib/aws/elb/load_balancer_policy.rb +1 -1
- data/lib/aws/elb/load_balancer_policy_collection.rb +5 -5
- data/lib/aws/emr.rb +28 -26
- data/lib/aws/emr/client.rb +165 -149
- data/lib/aws/emr/config.rb +1 -1
- data/lib/aws/emr/instance_group.rb +1 -1
- data/lib/aws/emr/instance_group_collection.rb +1 -1
- data/lib/aws/emr/job_flow.rb +27 -26
- data/lib/aws/emr/job_flow_collection.rb +34 -34
- data/lib/aws/errors.rb +7 -7
- data/lib/aws/glacier.rb +21 -21
- data/lib/aws/glacier/archive_collection.rb +2 -2
- data/lib/aws/glacier/client.rb +139 -140
- data/lib/aws/glacier/config.rb +1 -1
- data/lib/aws/glacier/vault.rb +2 -2
- data/lib/aws/glacier/vault_collection.rb +1 -1
- data/lib/aws/iam.rb +133 -144
- data/lib/aws/iam/access_key.rb +17 -17
- data/lib/aws/iam/access_key_collection.rb +22 -22
- data/lib/aws/iam/account_alias_collection.rb +2 -2
- data/lib/aws/iam/client.rb +429 -420
- data/lib/aws/iam/collection.rb +1 -1
- data/lib/aws/iam/config.rb +2 -2
- data/lib/aws/iam/group.rb +8 -8
- data/lib/aws/iam/group_collection.rb +16 -16
- data/lib/aws/iam/group_policy_collection.rb +6 -6
- data/lib/aws/iam/group_user_collection.rb +3 -3
- data/lib/aws/iam/mfa_device.rb +1 -1
- data/lib/aws/iam/mfa_device_collection.rb +9 -9
- data/lib/aws/iam/policy_collection.rb +4 -4
- data/lib/aws/iam/resource.rb +2 -2
- data/lib/aws/iam/server_certificate.rb +1 -1
- data/lib/aws/iam/server_certificate_collection.rb +15 -15
- data/lib/aws/iam/signing_certificate.rb +29 -29
- data/lib/aws/iam/signing_certificate_collection.rb +23 -23
- data/lib/aws/iam/user.rb +33 -38
- data/lib/aws/iam/user_collection.rb +27 -27
- data/lib/aws/iam/user_group_collection.rb +3 -3
- data/lib/aws/iam/user_policy_collection.rb +6 -6
- data/lib/aws/iam/virtual_mfa_device.rb +12 -12
- data/lib/aws/iam/virtual_mfa_device_collection.rb +4 -4
- data/lib/aws/import_export.rb +22 -21
- data/lib/aws/import_export/client.rb +47 -43
- data/lib/aws/ops_works.rb +5 -5
- data/lib/aws/ops_works/client.rb +484 -438
- data/lib/aws/ops_works/config.rb +1 -1
- data/lib/aws/rails.rb +34 -34
- data/lib/aws/rds.rb +18 -18
- data/lib/aws/rds/client.rb +1286 -1277
- data/lib/aws/rds/config.rb +1 -1
- data/lib/aws/rds/db_instance.rb +15 -4
- data/lib/aws/rds/db_snapshot.rb +1 -1
- data/lib/aws/record.rb +50 -24
- data/lib/aws/record/abstract_base.rb +52 -60
- data/lib/aws/record/attributes.rb +79 -79
- data/lib/aws/record/conversion.rb +1 -1
- data/lib/aws/record/dirty_tracking.rb +69 -67
- data/lib/aws/record/errors.rb +21 -21
- data/lib/aws/record/exceptions.rb +2 -2
- data/lib/aws/record/hash_model.rb +20 -21
- data/lib/aws/record/hash_model/attributes.rb +13 -15
- data/lib/aws/record/hash_model/finder_methods.rb +46 -46
- data/lib/aws/record/hash_model/scope.rb +31 -31
- data/lib/aws/record/model.rb +136 -136
- data/lib/aws/record/model/attributes.rb +57 -59
- data/lib/aws/record/model/finder_methods.rb +67 -67
- data/lib/aws/record/model/scope.rb +48 -49
- data/lib/aws/record/naming.rb +1 -1
- data/lib/aws/record/scope.rb +23 -19
- data/lib/aws/record/validations.rb +253 -271
- data/lib/aws/record/validator.rb +3 -3
- data/lib/aws/record/validators/acceptance.rb +1 -3
- data/lib/aws/record/validators/block.rb +1 -3
- data/lib/aws/record/validators/confirmation.rb +1 -3
- data/lib/aws/record/validators/count.rb +2 -4
- data/lib/aws/record/validators/exclusion.rb +2 -4
- data/lib/aws/record/validators/format.rb +2 -4
- data/lib/aws/record/validators/inclusion.rb +1 -3
- data/lib/aws/record/validators/length.rb +5 -7
- data/lib/aws/record/validators/method.rb +1 -3
- data/lib/aws/record/validators/numericality.rb +6 -8
- data/lib/aws/record/validators/presence.rb +1 -3
- data/lib/aws/redshift.rb +14 -14
- data/lib/aws/redshift/client.rb +596 -592
- data/lib/aws/redshift/config.rb +1 -1
- data/lib/aws/route_53.rb +30 -30
- data/lib/aws/route_53/change_batch.rb +7 -7
- data/lib/aws/route_53/client.rb +188 -152
- data/lib/aws/route_53/hosted_zone.rb +4 -4
- data/lib/aws/route_53/hosted_zone_collection.rb +7 -7
- data/lib/aws/route_53/resource_record_set.rb +10 -10
- data/lib/aws/route_53/resource_record_set_collection.rb +6 -6
- data/lib/aws/s3.rb +79 -79
- data/lib/aws/s3/access_control_list.rb +44 -36
- data/lib/aws/s3/acl_options.rb +51 -51
- data/lib/aws/s3/bucket.rb +146 -146
- data/lib/aws/s3/bucket_collection.rb +21 -21
- data/lib/aws/s3/bucket_lifecycle_configuration.rb +81 -82
- data/lib/aws/s3/bucket_tag_collection.rb +4 -2
- data/lib/aws/s3/cipher_io.rb +5 -4
- data/lib/aws/s3/client.rb +89 -84
- data/lib/aws/s3/client/xml.rb +1 -1
- data/lib/aws/s3/config.rb +7 -1
- data/lib/aws/s3/cors_rule.rb +2 -0
- data/lib/aws/s3/cors_rule_collection.rb +42 -40
- data/lib/aws/s3/data_options.rb +16 -11
- data/lib/aws/s3/encryption_utils.rb +2 -2
- data/lib/aws/s3/errors.rb +7 -7
- data/lib/aws/s3/multipart_upload.rb +30 -33
- data/lib/aws/s3/multipart_upload_collection.rb +8 -6
- data/lib/aws/s3/object_collection.rb +35 -35
- data/lib/aws/s3/object_metadata.rb +6 -6
- data/lib/aws/s3/object_version.rb +4 -4
- data/lib/aws/s3/object_version_collection.rb +15 -15
- data/lib/aws/s3/policy.rb +2 -2
- data/lib/aws/s3/prefixed_collection.rb +9 -5
- data/lib/aws/s3/presigned_post.rb +39 -37
- data/lib/aws/s3/request.rb +11 -11
- data/lib/aws/s3/s3_object.rb +210 -200
- data/lib/aws/s3/tree.rb +25 -27
- data/lib/aws/s3/tree/child_collection.rb +3 -3
- data/lib/aws/s3/tree/leaf_node.rb +2 -2
- data/lib/aws/s3/tree/parent.rb +1 -1
- data/lib/aws/s3/website_configuration.rb +13 -13
- data/lib/aws/simple_db.rb +83 -83
- data/lib/aws/simple_db/attribute.rb +9 -7
- data/lib/aws/simple_db/attribute_collection.rb +22 -13
- data/lib/aws/simple_db/client.rb +107 -107
- data/lib/aws/simple_db/config.rb +7 -1
- data/lib/aws/simple_db/consistent_read_option.rb +5 -5
- data/lib/aws/simple_db/domain.rb +4 -2
- data/lib/aws/simple_db/domain_collection.rb +4 -4
- data/lib/aws/simple_db/domain_metadata.rb +5 -5
- data/lib/aws/simple_db/errors.rb +9 -9
- data/lib/aws/simple_db/item.rb +5 -5
- data/lib/aws/simple_db/item_collection.rb +83 -81
- data/lib/aws/simple_db/item_data.rb +4 -4
- data/lib/aws/simple_db/put_attributes.rb +3 -3
- data/lib/aws/simple_email_service.rb +140 -140
- data/lib/aws/simple_email_service/client.rb +82 -76
- data/lib/aws/simple_email_service/config.rb +1 -2
- data/lib/aws/simple_email_service/email_address_collection.rb +3 -3
- data/lib/aws/simple_email_service/identity.rb +8 -8
- data/lib/aws/simple_email_service/quotas.rb +8 -6
- data/lib/aws/simple_workflow.rb +106 -106
- data/lib/aws/simple_workflow/activity_task.rb +15 -22
- data/lib/aws/simple_workflow/activity_task_collection.rb +15 -15
- data/lib/aws/simple_workflow/activity_type.rb +23 -23
- data/lib/aws/simple_workflow/activity_type_collection.rb +23 -23
- data/lib/aws/simple_workflow/client.rb +1004 -956
- data/lib/aws/simple_workflow/config.rb +1 -1
- data/lib/aws/simple_workflow/count.rb +5 -5
- data/lib/aws/simple_workflow/decision_task.rb +129 -129
- data/lib/aws/simple_workflow/decision_task_collection.rb +59 -59
- data/lib/aws/simple_workflow/domain.rb +11 -11
- data/lib/aws/simple_workflow/domain_collection.rb +26 -26
- data/lib/aws/simple_workflow/history_event.rb +32 -32
- data/lib/aws/simple_workflow/history_event_collection.rb +3 -3
- data/lib/aws/simple_workflow/option_formatters.rb +5 -5
- data/lib/aws/simple_workflow/request.rb +1 -1
- data/lib/aws/simple_workflow/resource.rb +1 -1
- data/lib/aws/simple_workflow/type.rb +8 -8
- data/lib/aws/simple_workflow/type_collection.rb +15 -15
- data/lib/aws/simple_workflow/workflow_execution.rb +70 -72
- data/lib/aws/simple_workflow/workflow_execution_collection.rb +130 -130
- data/lib/aws/simple_workflow/workflow_type.rb +27 -25
- data/lib/aws/simple_workflow/workflow_type_collection.rb +20 -20
- data/lib/aws/sns.rb +25 -25
- data/lib/aws/sns/client.rb +55 -55
- data/lib/aws/sns/config.rb +1 -1
- data/lib/aws/sns/policy.rb +1 -1
- data/lib/aws/sns/subscription.rb +7 -7
- data/lib/aws/sns/subscription_collection.rb +5 -5
- data/lib/aws/sns/topic.rb +49 -49
- data/lib/aws/sns/topic_collection.rb +2 -2
- data/lib/aws/sns/topic_subscription_collection.rb +5 -5
- data/lib/aws/sqs.rb +20 -20
- data/lib/aws/sqs/client.rb +78 -78
- data/lib/aws/sqs/config.rb +1 -1
- data/lib/aws/sqs/errors.rb +12 -12
- data/lib/aws/sqs/queue.rb +66 -67
- data/lib/aws/sqs/queue_collection.rb +16 -8
- data/lib/aws/sqs/received_message.rb +7 -6
- data/lib/aws/storage_gateway.rb +21 -21
- data/lib/aws/storage_gateway/client.rb +269 -202
- data/lib/aws/storage_gateway/config.rb +1 -1
- data/lib/aws/sts.rb +10 -8
- data/lib/aws/sts/client.rb +35 -35
- data/lib/aws/sts/session.rb +3 -3
- data/lib/aws/version.rb +1 -2
- metadata +23 -21
- data/lib/aws/core/autoloader.rb +0 -64
- data/lib/net/http/connection_pool.rb +0 -226
- data/lib/net/http/connection_pool/connection.rb +0 -189
- data/lib/net/http/connection_pool/session.rb +0 -126
data/lib/aws/s3/client/xml.rb
CHANGED
data/lib/aws/s3/config.rb
CHANGED
|
@@ -13,7 +13,13 @@
|
|
|
13
13
|
|
|
14
14
|
AWS::Core::Configuration.module_eval do
|
|
15
15
|
|
|
16
|
-
add_service 'S3', 's3'
|
|
16
|
+
add_service 'S3', 's3' do |region|
|
|
17
|
+
if region == 'us-east-1'
|
|
18
|
+
's3.amazonaws.com'
|
|
19
|
+
else
|
|
20
|
+
's3-%s.amazonaws.com' % region
|
|
21
|
+
end
|
|
22
|
+
end
|
|
17
23
|
|
|
18
24
|
add_option :s3_force_path_style, false, :boolean => true
|
|
19
25
|
|
data/lib/aws/s3/cors_rule.rb
CHANGED
|
@@ -16,50 +16,49 @@ module AWS
|
|
|
16
16
|
|
|
17
17
|
# Manages the CORS rules for a single bucket.
|
|
18
18
|
#
|
|
19
|
-
#
|
|
19
|
+
# ## Getting Rules
|
|
20
20
|
#
|
|
21
21
|
# To get the CORS rules for a bucket, use the {Bucket#cors} method. This
|
|
22
22
|
# returns a CORSRuleCollection for the bucket. The collection is
|
|
23
23
|
# enumerable.
|
|
24
24
|
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
25
|
+
# # enumerating all rules for a buck
|
|
26
|
+
# bucket.cors.each do |rule|
|
|
27
|
+
# # rule is a CORSRule object
|
|
28
|
+
# end
|
|
29
29
|
#
|
|
30
|
-
#
|
|
30
|
+
# ## Setting Rules
|
|
31
31
|
#
|
|
32
32
|
# You can set the rules for a bucket (replacing all existing rules) using
|
|
33
33
|
# the {#set} method.
|
|
34
34
|
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
35
|
+
# # accepts a list of one or more rules
|
|
36
|
+
# bucket.rules.set(rule1, rule2)
|
|
37
37
|
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
38
|
+
# # rules can be an array of rules
|
|
39
|
+
# bucket.rules.set(rules)
|
|
40
40
|
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
41
|
+
# # passing an empty list or array removes all rules
|
|
42
|
+
# bucket.rules.set([])
|
|
43
|
+
# bucket.rules.clear # does the same thing
|
|
44
44
|
#
|
|
45
45
|
# Each rule can be a Hash, a {CORSRule} or another {CORSRuleCollection}.
|
|
46
46
|
# See {Client#put_bucket_cors} for a list of keys for a rule hash.
|
|
47
47
|
#
|
|
48
|
-
#
|
|
48
|
+
# ## Adding Rules
|
|
49
49
|
#
|
|
50
50
|
# Adding rules is the same as setting rules. Rules you add will be
|
|
51
51
|
# appended to the end of the existing list of rules.
|
|
52
52
|
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
53
|
+
# # add one or more rules
|
|
54
|
+
# bucket.rules.add(rules)
|
|
55
55
|
#
|
|
56
|
-
#
|
|
56
|
+
# ## Deleting Rules
|
|
57
57
|
#
|
|
58
58
|
# To remove a rule, use the {#delete_if} method.
|
|
59
59
|
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
60
|
+
# # delete rules that allow access from any domain
|
|
61
|
+
# bucket.cors.delete_if{|rule| rule.allowed_origins.include?('*')
|
|
63
62
|
class CORSRuleCollection
|
|
64
63
|
|
|
65
64
|
include Core::Collection::Simple
|
|
@@ -77,18 +76,18 @@ module AWS
|
|
|
77
76
|
# Replaces the CORS rules attached to this bucket. You can pass
|
|
78
77
|
# one or more rules as an array or a list.
|
|
79
78
|
#
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
#
|
|
79
|
+
# # replace all exisitng rules with a single rule
|
|
80
|
+
# bucket.cors.set(
|
|
81
|
+
# :allowed_methods => %w(GET),
|
|
82
|
+
# :allowed_origins => %w(http://*.mydomain.com),
|
|
83
|
+
# :max_age_seconds => 3600)
|
|
85
84
|
#
|
|
86
85
|
# If you pass an empty array, all of the rules will be removed from
|
|
87
86
|
# the bucket.
|
|
88
87
|
#
|
|
89
|
-
#
|
|
90
|
-
#
|
|
91
|
-
#
|
|
88
|
+
# # these two lines are equivilent
|
|
89
|
+
# bucket.cors.clear
|
|
90
|
+
# bucket.cors.set([])
|
|
92
91
|
#
|
|
93
92
|
# @param [Hash,CORSRule,CORSRuleCollection] rules A list or array
|
|
94
93
|
# of one or more rules to set. Each rule may be a Hash, a CORSRule
|
|
@@ -113,19 +112,19 @@ module AWS
|
|
|
113
112
|
|
|
114
113
|
# Add one or more CORS rules to this bucket.
|
|
115
114
|
#
|
|
116
|
-
#
|
|
117
|
-
#
|
|
118
|
-
#
|
|
119
|
-
#
|
|
120
|
-
#
|
|
115
|
+
# # adding a single rule as a hash
|
|
116
|
+
# bucket.cors.add(
|
|
117
|
+
# :allowed_methods => %w(GET HEAD),
|
|
118
|
+
# :allowed_origins => %w(*),
|
|
119
|
+
# :max_age_seconds => 3600)
|
|
121
120
|
#
|
|
122
121
|
# You can add multiple rules in a single call:
|
|
123
122
|
#
|
|
124
|
-
#
|
|
125
|
-
#
|
|
123
|
+
# # each rule may be a hash, CORSRule or a CORSRuleCollection,
|
|
124
|
+
# bucket.cors.add(rules)
|
|
126
125
|
#
|
|
127
|
-
#
|
|
128
|
-
#
|
|
126
|
+
# # alternatively you can pass a list of rules
|
|
127
|
+
# bucket.cors.add(rule1, rule2, ...)
|
|
129
128
|
#
|
|
130
129
|
# @param (see #set)
|
|
131
130
|
# @return (see #set)
|
|
@@ -134,14 +133,15 @@ module AWS
|
|
|
134
133
|
end
|
|
135
134
|
alias_method :create, :add
|
|
136
135
|
|
|
137
|
-
# Deletes every rule for which the block evaluates to
|
|
136
|
+
# Deletes every rule for which the block evaluates to `true`.
|
|
137
|
+
#
|
|
138
|
+
# @example Remove all rules that are open to the 'world'
|
|
138
139
|
#
|
|
139
|
-
# # remove all rules that are open to the 'world'
|
|
140
140
|
# bucket.cors.delete_if{|rule| rule.allowed_origins.include?('*') }
|
|
141
141
|
#
|
|
142
142
|
# @yield [rule]
|
|
143
143
|
# @yieldparam [CORSRule] rule
|
|
144
|
-
# @yieldreturn [Boolean] Return
|
|
144
|
+
# @yieldreturn [Boolean] Return `true` for each rule you want to delete.
|
|
145
145
|
# @return (see #set)
|
|
146
146
|
def delete_if &block
|
|
147
147
|
rules = []
|
|
@@ -153,6 +153,8 @@ module AWS
|
|
|
153
153
|
|
|
154
154
|
# Removes all CORS rules attached to this bucket.
|
|
155
155
|
#
|
|
156
|
+
# @example
|
|
157
|
+
#
|
|
156
158
|
# bucket.cors.count #=> 3
|
|
157
159
|
# bucket.cors.clear
|
|
158
160
|
# bucket.cors.count #=> 0
|
data/lib/aws/s3/data_options.rb
CHANGED
|
@@ -126,8 +126,8 @@ module AWS
|
|
|
126
126
|
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
-
# @return [Boolean] Returns
|
|
130
|
-
#
|
|
129
|
+
# @return [Boolean] Returns `true` if the object responds to
|
|
130
|
+
# `#read` and `#eof?`.
|
|
131
131
|
def io_like? io
|
|
132
132
|
io.respond_to?(:read) and io.respond_to?(:eof?)
|
|
133
133
|
end
|
|
@@ -153,16 +153,13 @@ module AWS
|
|
|
153
153
|
@eof = false
|
|
154
154
|
end
|
|
155
155
|
|
|
156
|
-
def read bytes = nil
|
|
157
|
-
if bytes
|
|
158
|
-
|
|
159
|
-
@write_block.call(buffer, bytes)
|
|
160
|
-
buffer.rewind
|
|
161
|
-
@eof = true if buffer.size < bytes
|
|
162
|
-
buffer.size == 0 ? nil : buffer.read
|
|
156
|
+
def read bytes = nil, output_buffer = nil
|
|
157
|
+
data = if bytes
|
|
158
|
+
(@eof) ? nil : read_chunk(bytes)
|
|
163
159
|
else
|
|
164
|
-
read_all
|
|
160
|
+
(@eof) ? "" : read_all
|
|
165
161
|
end
|
|
162
|
+
output_buffer ? output_buffer.replace(data || '') : data
|
|
166
163
|
end
|
|
167
164
|
|
|
168
165
|
def eof?
|
|
@@ -171,9 +168,17 @@ module AWS
|
|
|
171
168
|
|
|
172
169
|
protected
|
|
173
170
|
|
|
171
|
+
def read_chunk bytes
|
|
172
|
+
buffer = StringIO.new
|
|
173
|
+
@write_block.call(buffer, bytes)
|
|
174
|
+
buffer.rewind
|
|
175
|
+
@eof = true if buffer.size < bytes
|
|
176
|
+
buffer.read
|
|
177
|
+
end
|
|
178
|
+
|
|
174
179
|
def read_all
|
|
175
180
|
buffer = StringIO.new
|
|
176
|
-
buffer <<
|
|
181
|
+
buffer << read_chunk(1024 * 1024 * 5) until @eof
|
|
177
182
|
buffer.rewind
|
|
178
183
|
buffer.read
|
|
179
184
|
end
|
|
@@ -31,7 +31,7 @@ module AWS
|
|
|
31
31
|
# @return [String] Returns the data encrypted with the key given.
|
|
32
32
|
def encrypt data, key
|
|
33
33
|
rsa = OpenSSL::PKey::RSA
|
|
34
|
-
|
|
34
|
+
# Encrypting data key
|
|
35
35
|
case key
|
|
36
36
|
when rsa # Asymmetric encryption
|
|
37
37
|
key.public_encrypt(data)
|
|
@@ -97,7 +97,7 @@ module AWS
|
|
|
97
97
|
#
|
|
98
98
|
# @param [String] iv IV for the cipher.
|
|
99
99
|
#
|
|
100
|
-
# @return [OpenSSL::Cipher] Will return a configured
|
|
100
|
+
# @return [OpenSSL::Cipher] Will return a configured `OpenSSL::Cipher`.
|
|
101
101
|
def get_aes_cipher mode, block_mode, key = nil, iv = nil
|
|
102
102
|
|
|
103
103
|
# If no key given, default to 256 bit
|
data/lib/aws/s3/errors.rb
CHANGED
|
@@ -18,13 +18,13 @@ module AWS
|
|
|
18
18
|
# types that S3 can return. You can use these classes to rescue
|
|
19
19
|
# specific errors, for example:
|
|
20
20
|
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
21
|
+
# begin
|
|
22
|
+
# S3.new.buckets.mybucket.
|
|
23
|
+
# objects.myobj.write("HELLO")
|
|
24
|
+
# rescue S3::Errors::NoSuchBucket => e
|
|
25
|
+
# S3.new.buckets.create("mybucket")
|
|
26
|
+
# retry
|
|
27
|
+
# end
|
|
28
28
|
#
|
|
29
29
|
# All errors raised as a result of error responses from the
|
|
30
30
|
# service are instances of either {ClientError} or {ServerError}.
|
|
@@ -70,17 +70,17 @@ module AWS
|
|
|
70
70
|
true
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
# @return The upload initiator. This object will have
|
|
74
|
-
# and
|
|
75
|
-
# user, the
|
|
73
|
+
# @return The upload initiator. This object will have `:id`
|
|
74
|
+
# and `:display_name` methods; if the initiator is an IAM
|
|
75
|
+
# user, the `:id` method will return the ARN of the user, and
|
|
76
76
|
# if the initiator is an AWS account, this method will return
|
|
77
77
|
# the same data as {#owner}.
|
|
78
78
|
def initiator
|
|
79
79
|
client.list_parts(base_opts).initiator
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
# @return The upload owner. This object will have
|
|
83
|
-
# and
|
|
82
|
+
# @return The upload owner. This object will have `:id`
|
|
83
|
+
# and `:display_name` methods.
|
|
84
84
|
def owner
|
|
85
85
|
client.list_parts(base_opts).owner
|
|
86
86
|
end
|
|
@@ -88,8 +88,8 @@ module AWS
|
|
|
88
88
|
# @return [Symbol] The class of storage used to store the
|
|
89
89
|
# uploaded object. Possible values:
|
|
90
90
|
#
|
|
91
|
-
# *
|
|
92
|
-
# *
|
|
91
|
+
# * `:standard`
|
|
92
|
+
# * `:reduced_redundancy?`
|
|
93
93
|
def storage_class
|
|
94
94
|
client.list_parts(base_opts).storage_class.downcase.to_sym
|
|
95
95
|
end
|
|
@@ -129,57 +129,54 @@ module AWS
|
|
|
129
129
|
#
|
|
130
130
|
# @overload add_part(data, options = {})
|
|
131
131
|
#
|
|
132
|
-
# @param data The data to upload.
|
|
132
|
+
# @param data The data to upload.
|
|
133
|
+
# Valid values include:
|
|
133
134
|
#
|
|
134
|
-
#
|
|
135
|
+
# * A string
|
|
136
|
+
# * A Pathname object
|
|
137
|
+
# * Any object responding to `read` and `eof?`; the object
|
|
138
|
+
# must support the following access methods:
|
|
135
139
|
#
|
|
136
|
-
#
|
|
140
|
+
# read # all at once
|
|
141
|
+
# read(length) until eof? # in chunks
|
|
137
142
|
#
|
|
138
|
-
#
|
|
139
|
-
#
|
|
140
|
-
#
|
|
141
|
-
# read # all at once
|
|
142
|
-
# read(length) until eof? # in chunks
|
|
143
|
-
#
|
|
144
|
-
# If you specify data this way, you must also include
|
|
145
|
-
# the +:content_length+ option.
|
|
143
|
+
# If you specify data this way, you must also include
|
|
144
|
+
# the `:content_length` option.
|
|
146
145
|
#
|
|
147
146
|
# @param [Hash] options Additional options for the upload.
|
|
148
147
|
#
|
|
149
148
|
# @option options [Integer] :content_length If provided,
|
|
150
149
|
# this option must match the total number of bytes written
|
|
151
150
|
# to S3 during the operation. This option is required if
|
|
152
|
-
#
|
|
151
|
+
# `:data` is an IO-like object without a `size` method.
|
|
153
152
|
#
|
|
154
153
|
# @overload add_part(options)
|
|
155
154
|
#
|
|
156
155
|
# @param [Hash] options Options for the upload. Either
|
|
157
|
-
#
|
|
156
|
+
# `:data` or `:file` is required.
|
|
158
157
|
#
|
|
159
158
|
# @option options :data The data to upload. Valid values
|
|
160
159
|
# include:
|
|
161
160
|
#
|
|
162
|
-
#
|
|
163
|
-
#
|
|
164
|
-
#
|
|
165
|
-
#
|
|
166
|
-
# * Any object responding to +read+ and +eof?+; the object
|
|
167
|
-
# must support the following access methods:
|
|
161
|
+
# * A string
|
|
162
|
+
# * A Pathname object
|
|
163
|
+
# * Any object responding to `read` and `eof?`; the object
|
|
164
|
+
# must support the following access methods:
|
|
168
165
|
#
|
|
169
|
-
#
|
|
170
|
-
#
|
|
166
|
+
# read # all at once
|
|
167
|
+
# read(length) until eof? # in chunks
|
|
171
168
|
#
|
|
172
|
-
#
|
|
173
|
-
#
|
|
169
|
+
# If you specify data this way, you must also include
|
|
170
|
+
# the `:content_length` option.
|
|
174
171
|
#
|
|
175
172
|
# @option options [String] :file Can be specified instead of
|
|
176
|
-
#
|
|
173
|
+
# `:data`; its value specifies the path of a file to
|
|
177
174
|
# upload.
|
|
178
175
|
#
|
|
179
176
|
# @option options [Integer] :content_length If provided,
|
|
180
177
|
# this option must match the total number of bytes written
|
|
181
178
|
# to S3 during the operation. This option is required if
|
|
182
|
-
#
|
|
179
|
+
# `:data` is an IO-like object without a `size` method.
|
|
183
180
|
#
|
|
184
181
|
# @option options [Integer] :part_number The part number.
|
|
185
182
|
def add_part(data_or_options, options = {})
|
|
@@ -257,7 +254,7 @@ module AWS
|
|
|
257
254
|
# enabled, returns the {ObjectVersion} representing the
|
|
258
255
|
# version that was uploaded. If versioning is disabled,
|
|
259
256
|
# returns the object. If no upload was attempted (e.g. if it
|
|
260
|
-
# was aborted or if no parts were uploaded), returns
|
|
257
|
+
# was aborted or if no parts were uploaded), returns `nil`.
|
|
261
258
|
def close
|
|
262
259
|
if aborted?
|
|
263
260
|
nil
|
|
@@ -17,14 +17,16 @@ module AWS
|
|
|
17
17
|
# Represents the uploads in progress for a bucket.
|
|
18
18
|
#
|
|
19
19
|
# @example Finding uploads by prefix
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
20
|
+
#
|
|
21
|
+
# bucket.multipart_uploads.with_prefix("photos/").
|
|
22
|
+
# map { |upload| upload.object.key }
|
|
23
|
+
# # => ["photos/1.jpg", "photos/2.jpg", ...]
|
|
23
24
|
#
|
|
24
25
|
# @example Browsing with a tree interface
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
26
|
+
#
|
|
27
|
+
# bucket.multipart_uploads.with_prefix("photos").as_tree.
|
|
28
|
+
# children.select(&:branch?).map(&:prefix)
|
|
29
|
+
# # => ["photos/2010", "photos/2011", ...]
|
|
28
30
|
#
|
|
29
31
|
# @see Tree
|
|
30
32
|
class MultipartUploadCollection
|
|
@@ -16,45 +16,45 @@ module AWS
|
|
|
16
16
|
|
|
17
17
|
# Represents a collection of S3 objects.
|
|
18
18
|
#
|
|
19
|
-
#
|
|
19
|
+
# ## Getting an S3Object by Key
|
|
20
20
|
#
|
|
21
21
|
# If you know the key of the object you want, you can reference it this way:
|
|
22
22
|
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
23
|
+
# # this will not make any requests against S3
|
|
24
|
+
# object = bucket.objects['foo.jpg']
|
|
25
|
+
# object.key #=> 'foo.jpg'
|
|
26
26
|
#
|
|
27
|
-
#
|
|
27
|
+
# ## Finding objects with a Prefix
|
|
28
28
|
#
|
|
29
29
|
# Given a bucket with the following keys:
|
|
30
30
|
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
31
|
+
# photos/sunset.jpg
|
|
32
|
+
# photos/sunrise.jpg
|
|
33
|
+
# photos/winter.jpg
|
|
34
|
+
# videos/comedy.mpg
|
|
35
|
+
# videos/dancing.mpg
|
|
36
36
|
#
|
|
37
37
|
# You can list objects that share a prefix:
|
|
38
38
|
#
|
|
39
|
-
#
|
|
40
|
-
#
|
|
39
|
+
# bucket.objects.with_prefix('videos').collect(&:key)
|
|
40
|
+
# #=> ['videos/comedy.mpg', 'videos/dancing.mpg']
|
|
41
41
|
#
|
|
42
|
-
#
|
|
42
|
+
# ## Exploring Objects with a Tree Interface
|
|
43
43
|
#
|
|
44
44
|
# Given a bucket with the following keys:
|
|
45
45
|
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
#
|
|
46
|
+
# README.txt
|
|
47
|
+
# videos/wedding.mpg
|
|
48
|
+
# videos/family_reunion.mpg
|
|
49
|
+
# photos/2010/house.jpg
|
|
50
|
+
# photos/2011/fall/leaves.jpg
|
|
51
|
+
# photos/2011/summer/vacation.jpg
|
|
52
|
+
# photos/2011/summer/family.jpg
|
|
53
53
|
#
|
|
54
|
-
#
|
|
54
|
+
# tree = bucket.objects.with_prefix('photos').as_tree
|
|
55
55
|
#
|
|
56
|
-
#
|
|
57
|
-
#
|
|
56
|
+
# directories = tree.children.select(&:branch?).collect(&:prefix)
|
|
57
|
+
# #=> ['photos/2010', 'photos/2011']
|
|
58
58
|
#
|
|
59
59
|
class ObjectCollection
|
|
60
60
|
|
|
@@ -105,25 +105,25 @@ module AWS
|
|
|
105
105
|
|
|
106
106
|
# Deletes the objects provided in as few requests as possible.
|
|
107
107
|
#
|
|
108
|
-
#
|
|
109
|
-
#
|
|
108
|
+
# # delete 2 objects (by key) in a single request
|
|
109
|
+
# bucket.objects.delete('abc', 'xyz')
|
|
110
110
|
#
|
|
111
111
|
# You can delete objects also by passing their S3Object representation:
|
|
112
112
|
#
|
|
113
|
-
#
|
|
114
|
-
#
|
|
115
|
-
#
|
|
113
|
+
# to_delete = []
|
|
114
|
+
# to_delete << buckets.objects['foo']
|
|
115
|
+
# to_delete << buckets.objects['bar']
|
|
116
116
|
#
|
|
117
|
-
#
|
|
117
|
+
# bucket.objects.delete(to_delete)
|
|
118
118
|
#
|
|
119
119
|
# @overload delete(objects)
|
|
120
120
|
# @param [Mixed] objects One or more objects to delete. Each object
|
|
121
121
|
# can be one of the following:
|
|
122
122
|
#
|
|
123
|
-
#
|
|
124
|
-
#
|
|
125
|
-
#
|
|
126
|
-
#
|
|
123
|
+
# * An object key (string)
|
|
124
|
+
# * A hash with :key and :version_id (for versioned objects)
|
|
125
|
+
# * An {S3Object} instance
|
|
126
|
+
# * An {ObjectVersion} instance
|
|
127
127
|
#
|
|
128
128
|
# @overload delete(objects, options)
|
|
129
129
|
# Deletes multiple objects, with additional options. The array can
|
|
@@ -195,8 +195,8 @@ module AWS
|
|
|
195
195
|
# Deletes each object in the collection that returns a true value
|
|
196
196
|
# from block passed to this method. Deletes are batched for efficiency.
|
|
197
197
|
#
|
|
198
|
-
#
|
|
199
|
-
#
|
|
198
|
+
# # delete text files in the 2009 "folder"
|
|
199
|
+
# bucket.objects.with_prefix('2009/').delete_if {|o| o.key =~ /\.txt$/ }
|
|
200
200
|
#
|
|
201
201
|
# @yieldparam [S3Object] object
|
|
202
202
|
#
|