aws-partitions 1.239.0 → 1.244.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c2955d254cdff4a90f5a656dd69c984b54b21d0
4
- data.tar.gz: 4659969803d11521b729519def50eef5396c057c
3
+ metadata.gz: 3329cfe888500abccafcedd66eb6a19d8be6502c
4
+ data.tar.gz: a3b11b595ea771afc86cd7b8b185afbe85820ea4
5
5
  SHA512:
6
- metadata.gz: 05076d220d5e6ee7412260354353c182d87772e6c4bc4be7b422543b07e3f852c20c26e6eb79a930b102158aba0e323ff53a7ce474dcbcb9ea45d0235ff90e03
7
- data.tar.gz: 3e84be0b9621d87ab0f8fb94c61413e6ff89f4b0157a81a084a84ba1f2723323e531d3ad5dc8685f84050b601427b8f74321b5050ce4edd4985ea88eeb40236d
6
+ metadata.gz: 75baf0133da15731b9a359fab6b1714ca0a07280e05a8d00240fab868fedbd3ef83f4a00813e26155be53df078ee34e58825e72b53ea894d9ed55be71a0f615a
7
+ data.tar.gz: a2a8cbfae88ceb39f345394c80cef432fe85adda98c6ac751aa053b3e55df89e316a751534c96ebf36c69a74c84e0acaa628d932355a9303d1b1a51ffea6bb19
@@ -236,7 +236,7 @@ module Aws
236
236
  'ApplicationInsights' => 'applicationinsights',
237
237
  'Athena' => 'athena',
238
238
  'AutoScaling' => 'autoscaling',
239
- 'AutoScalingPlans' => 'autoscaling',
239
+ 'AutoScalingPlans' => 'autoscaling-plans',
240
240
  'Backup' => 'backup',
241
241
  'Batch' => 'batch',
242
242
  'Budgets' => 'budgets',
@@ -265,6 +265,7 @@ module Aws
265
265
  'ComprehendMedical' => 'comprehendmedical',
266
266
  'ConfigService' => 'config',
267
267
  'Connect' => 'connect',
268
+ 'ConnectParticipant' => 'participant.connect',
268
269
  'CostExplorer' => 'ce',
269
270
  'CostandUsageReportService' => 'cur',
270
271
  'DAX' => 'dax',
@@ -350,6 +351,7 @@ module Aws
350
351
  'MediaStoreData' => 'data.mediastore',
351
352
  'MediaTailor' => 'api.mediatailor',
352
353
  'MigrationHub' => 'mgh',
354
+ 'MigrationHubConfig' => 'migrationhub-config',
353
355
  'Mobile' => 'mobile',
354
356
  'Neptune' => 'rds',
355
357
  'OpsWorks' => 'opsworks',
@@ -2,11 +2,9 @@ module Aws
2
2
  module Partitions
3
3
  # @api private
4
4
  class EndpointProvider
5
-
6
- # when sts_regional_endpoint set to `legacy`
7
- # endpoint pattern stays global for
8
- # following regions
9
- STS_LEGACY_REGIONS = %w(
5
+ # When sts_regional_endpoint is set to `legacy`, the endpoint
6
+ # pattern stays global for the following regions:
7
+ STS_LEGACY_REGIONS = %w[
10
8
  ap-northeast-1
11
9
  ap-south-1
12
10
  ap-southeast-1
@@ -23,13 +21,13 @@ module Aws
23
21
  us-east-2
24
22
  us-west-1
25
23
  us-west-2
26
- )
24
+ ].freeze
27
25
 
28
26
  # Can be removed once S3 endpoint is updated
29
27
  S3_IAD_REGIONAL = {
30
- "hostname" => "s3.us-east-1.amazonaws.com",
31
- "signatureVersions" => [ "s3", "s3v4" ]
32
- }
28
+ 'hostname' => 's3.us-east-1.amazonaws.com',
29
+ 'signatureVersions' => %w[s3 s3v4]
30
+ }.freeze
33
31
 
34
32
  # Intentionally marked private. The format of the endpoint rules
35
33
  # is an implementation detail.
@@ -38,78 +36,74 @@ module Aws
38
36
  @rules = rules
39
37
  end
40
38
 
41
- # @param [String] region
42
- # @param [String] service The endpoint prefix for the service, e.g. "monitoring" for
43
- # cloudwatch.
44
- # @param [String] sts_regional_endpoints [STS only] Whether to use `legacy` (global endpoint for
45
- # legacy regions) or `regional` mode for using regional endpoint for supported regions
46
- # except 'aws-global'
39
+ # @param [String] region The region for the client.
40
+ # @param [String] service The endpoint prefix for the service, e.g.
41
+ # "monitoring" for cloudwatch.
42
+ # @param [String] sts_regional_endpoints [STS only] Whether to use
43
+ # `legacy` (global endpoint for legacy regions) or `regional` mode for
44
+ # using regional endpoint for supported regions except 'aws-global'
47
45
  # @api private Use the static class methods instead.
48
46
  def resolve(region, service, sts_regional_endpoints)
49
- "https://" + endpoint_for(region, service, sts_regional_endpoints)
47
+ 'https://' + endpoint_for(region, service, sts_regional_endpoints)
50
48
  end
51
49
 
52
50
  # @api private Use the static class methods instead.
53
51
  def signing_region(region, service)
54
- get_partition(region).
55
- fetch("services", {}).
56
- fetch(service, {}).
57
- fetch("endpoints", {}).
58
- fetch(region, {}).
59
- fetch("credentialScope", {}).
60
- fetch("region", region)
52
+ get_partition(region)
53
+ .fetch('services', {})
54
+ .fetch(service, {})
55
+ .fetch('endpoints', {})
56
+ .fetch(region, {})
57
+ .fetch('credentialScope', {})
58
+ .fetch('region', region)
61
59
  end
62
60
 
63
61
  # @api private Use the static class methods instead.
64
62
  def dns_suffix_for(region)
65
- partition = get_partition(region)
66
- partition['dnsSuffix']
63
+ get_partition(region)['dnsSuffix']
67
64
  end
68
65
 
69
66
  private
70
67
 
71
68
  def endpoint_for(region, service, sts_regional_endpoints)
72
69
  partition = get_partition(region)
73
- endpoint = default_endpoint(partition, service, region)
74
- service_cfg = partition.fetch("services", {}).fetch(service, {})
70
+ service_cfg = partition.fetch('services', {}).fetch(service, {})
75
71
 
76
- # Check for service-level default endpoint.
77
- endpoint = service_cfg.fetch("defaults", {}).fetch("hostname", endpoint)
72
+ # Find the default endpoint
73
+ endpoint = service_cfg
74
+ .fetch('defaults', {})
75
+ .fetch('hostname', partition['defaults']['hostname'])
78
76
 
79
77
  # Check for sts legacy behavior
80
78
  sts_legacy = service == 'sts' &&
81
- sts_regional_endpoints == 'legacy' &&
82
- STS_LEGACY_REGIONS.include?(region)
79
+ sts_regional_endpoints == 'legacy' &&
80
+ STS_LEGACY_REGIONS.include?(region)
83
81
 
84
82
  # Check for global endpoint.
85
- if sts_legacy || service_cfg["isRegionalized"] == false
86
- region = service_cfg.fetch("partitionEndpoint", region)
83
+ if sts_legacy || service_cfg['isRegionalized'] == false
84
+ region = service_cfg.fetch('partitionEndpoint', region)
87
85
  end
88
86
 
89
87
  # Can be removed once S3 endpoint is updated
90
- if (service == 's3') && (region == "us-east-1")
91
- service_cfg["endpoints"][region] = S3_IAD_REGIONAL
88
+ if (service == 's3') && (region == 'us-east-1')
89
+ service_cfg['endpoints'][region] = S3_IAD_REGIONAL
92
90
  end
93
91
 
94
92
  # Check for service/region level endpoint.
95
- endpoint = service_cfg.fetch("endpoints", {}).
96
- fetch(region, {}).fetch("hostname", endpoint)
97
-
98
- endpoint
99
- end
100
-
101
- def default_endpoint(partition, service, region)
102
- hostname_template = partition["defaults"]["hostname"]
103
- hostname_template.
104
- sub('{region}', region).
105
- sub('{service}', service).
106
- sub('{dnsSuffix}', partition["dnsSuffix"])
93
+ endpoint = service_cfg
94
+ .fetch('endpoints', {})
95
+ .fetch(region, {}).fetch('hostname', endpoint)
96
+
97
+ # Replace placeholders from the endpoints
98
+ endpoint.sub('{region}', region)
99
+ .sub('{service}', service)
100
+ .sub('{dnsSuffix}', partition['dnsSuffix'])
107
101
  end
108
102
 
109
103
  def get_partition(region)
110
104
  partition_containing_region(region) ||
111
- partition_matching_region(region) ||
112
- default_partition
105
+ partition_matching_region(region) ||
106
+ default_partition
113
107
  end
114
108
 
115
109
  def partition_containing_region(region)
@@ -120,23 +114,20 @@ module Aws
120
114
 
121
115
  def partition_matching_region(region)
122
116
  @rules['partitions'].find do |p|
123
- region.match(p["regionRegex"]) ||
124
- p['services'].values.find { |svc| svc['endpoints'].key?(region) if svc.key? 'endpoints' }
117
+ region.match(p['regionRegex']) ||
118
+ p['services'].values.find do |svc|
119
+ svc['endpoints'].key?(region) if svc.key?('endpoints')
120
+ end
125
121
  end
126
122
  end
127
123
 
128
124
  def default_partition
129
- @rules['partitions'].find { |p| p["partition"] == "aws" } ||
130
- @rules['partitions'].first
125
+ @rules['partitions'].find { |p| p['partition'] == 'aws' } ||
126
+ @rules['partitions'].first
131
127
  end
132
128
 
133
129
  class << self
134
-
135
- def resolve(
136
- region,
137
- service,
138
- sts_regional_endpoints = 'legacy'
139
- )
130
+ def resolve(region, service, sts_regional_endpoints = 'legacy')
140
131
  default_provider.resolve(region, service, sts_regional_endpoints)
141
132
  end
142
133
 
@@ -153,7 +144,6 @@ module Aws
153
144
  def default_provider
154
145
  @default_provider ||= EndpointProvider.new(Partitions.defaults)
155
146
  end
156
-
157
147
  end
158
148
  end
159
149
  end
@@ -1,7 +1,6 @@
1
1
  module Aws
2
2
  module Partitions
3
3
  class Partition
4
-
5
4
  # @option options [required, String] :name
6
5
  # @option options [required, Hash<String,Region>] :regions
7
6
  # @option options [required, Hash<String,Service>] :services
@@ -23,7 +22,7 @@ module Aws
23
22
  @regions[region_name]
24
23
  else
25
24
  msg = "invalid region name #{region_name.inspect}; valid region "
26
- msg << "names include %s" % [@regions.keys.join(', ')]
25
+ msg << "names include #{@regions.keys.join(', ')}"
27
26
  raise ArgumentError, msg
28
27
  end
29
28
  end
@@ -33,6 +32,12 @@ module Aws
33
32
  @regions.values
34
33
  end
35
34
 
35
+ # @param [String] region_name The name of the region, e.g. "us-east-1".
36
+ # @return [Boolean] true if the region is in the partition.
37
+ def region?(region_name)
38
+ @regions.key?(region_name)
39
+ end
40
+
36
41
  # @param [String] service_name The service module name.
37
42
  # @return [Service]
38
43
  # @raise [ArgumentError] Raises `ArgumentError` for unknown service name.
@@ -41,7 +46,7 @@ module Aws
41
46
  @services[service_name]
42
47
  else
43
48
  msg = "invalid service name #{service_name.inspect}; valid service "
44
- msg << "names include %s" % [@services.keys.join(', ')]
49
+ msg << "names include #{@services.keys.join(', ')}"
45
50
  raise ArgumentError, msg
46
51
  end
47
52
  end
@@ -51,14 +56,19 @@ module Aws
51
56
  @services.values
52
57
  end
53
58
 
54
- class << self
59
+ # @param [String] service_name The service module name.
60
+ # @return [Boolean] true if the service is in the partition.
61
+ def service?(service_name)
62
+ @services.key?(service_name)
63
+ end
55
64
 
65
+ class << self
56
66
  # @api private
57
67
  def build(partition)
58
68
  Partition.new(
59
69
  name: partition['partition'],
60
70
  regions: build_regions(partition),
61
- services: build_services(partition),
71
+ services: build_services(partition)
62
72
  )
63
73
  end
64
74
 
@@ -67,28 +77,29 @@ module Aws
67
77
  # @param [Hash] partition
68
78
  # @return [Hash<String,Region>]
69
79
  def build_regions(partition)
70
- partition['regions'].inject({}) do |regions, (region_name, region)|
71
- unless region_name == "#{partition['partition']}-global"
72
- regions[region_name] = Region.build(region_name, region, partition)
73
- end
74
- regions
80
+ partition['regions'].each_with_object({}) do
81
+ |(region_name, region), regions|
82
+ next if region_name == "#{partition['partition']}-global"
83
+
84
+ regions[region_name] = Region.build(
85
+ region_name, region, partition
86
+ )
75
87
  end
76
88
  end
77
89
 
78
90
  # @param [Hash] partition
79
91
  # @return [Hash<String,Service>]
80
92
  def build_services(partition)
81
- Partitions.service_ids.inject({}) do |services, (svc_name, svc_id)|
82
- if partition['services'].key?(svc_id)
83
- svc_data = partition['services'][svc_id]
84
- services[svc_name] = Service.build(svc_name, svc_data, partition)
85
- else
86
- services[svc_name] = Service.build(svc_name, {'endpoints' => {}}, partition)
87
- end
88
- services
93
+ Partitions.service_ids.each_with_object({}) do
94
+ |(service_name, service), services|
95
+ service_data = partition['services'].fetch(
96
+ service, 'endpoints' => {}
97
+ )
98
+ services[service_name] = Service.build(
99
+ service_name, service_data, partition
100
+ )
89
101
  end
90
102
  end
91
-
92
103
  end
93
104
  end
94
105
  end
@@ -322,10 +322,6 @@
322
322
  },
323
323
  "application-autoscaling" : {
324
324
  "defaults" : {
325
- "credentialScope" : {
326
- "service" : "application-autoscaling"
327
- },
328
- "hostname" : "autoscaling.{region}.amazonaws.com",
329
325
  "protocols" : [ "http", "https" ]
330
326
  },
331
327
  "endpoints" : {
@@ -454,10 +450,6 @@
454
450
  },
455
451
  "autoscaling-plans" : {
456
452
  "defaults" : {
457
- "credentialScope" : {
458
- "service" : "autoscaling-plans"
459
- },
460
- "hostname" : "autoscaling.{region}.amazonaws.com",
461
453
  "protocols" : [ "http", "https" ]
462
454
  },
463
455
  "endpoints" : {
@@ -1028,12 +1020,15 @@
1028
1020
  },
1029
1021
  "datasync" : {
1030
1022
  "endpoints" : {
1023
+ "ap-east-1" : { },
1031
1024
  "ap-northeast-1" : { },
1032
1025
  "ap-northeast-2" : { },
1026
+ "ap-south-1" : { },
1033
1027
  "ap-southeast-1" : { },
1034
1028
  "ap-southeast-2" : { },
1035
1029
  "ca-central-1" : { },
1036
1030
  "eu-central-1" : { },
1031
+ "eu-north-1" : { },
1037
1032
  "eu-west-1" : { },
1038
1033
  "eu-west-2" : { },
1039
1034
  "eu-west-3" : { },
@@ -1062,6 +1057,7 @@
1062
1057
  "hostname" : "datasync-fips.us-west-2.amazonaws.com"
1063
1058
  },
1064
1059
  "me-south-1" : { },
1060
+ "sa-east-1" : { },
1065
1061
  "us-east-1" : { },
1066
1062
  "us-east-2" : { },
1067
1063
  "us-west-1" : { },
@@ -1114,6 +1110,7 @@
1114
1110
  },
1115
1111
  "discovery" : {
1116
1112
  "endpoints" : {
1113
+ "eu-central-1" : { },
1117
1114
  "us-west-2" : { }
1118
1115
  }
1119
1116
  },
@@ -1396,6 +1393,7 @@
1396
1393
  },
1397
1394
  "elasticfilesystem" : {
1398
1395
  "endpoints" : {
1396
+ "ap-east-1" : { },
1399
1397
  "ap-northeast-1" : { },
1400
1398
  "ap-northeast-2" : { },
1401
1399
  "ap-south-1" : { },
@@ -1403,9 +1401,12 @@
1403
1401
  "ap-southeast-2" : { },
1404
1402
  "ca-central-1" : { },
1405
1403
  "eu-central-1" : { },
1404
+ "eu-north-1" : { },
1406
1405
  "eu-west-1" : { },
1407
1406
  "eu-west-2" : { },
1408
1407
  "eu-west-3" : { },
1408
+ "me-south-1" : { },
1409
+ "sa-east-1" : { },
1409
1410
  "us-east-1" : { },
1410
1411
  "us-east-2" : { },
1411
1412
  "us-west-1" : { },
@@ -1578,11 +1579,16 @@
1578
1579
  "endpoints" : {
1579
1580
  "ap-northeast-1" : { },
1580
1581
  "ap-northeast-2" : { },
1582
+ "ap-south-1" : { },
1581
1583
  "ap-southeast-1" : { },
1582
1584
  "ap-southeast-2" : { },
1585
+ "ca-central-1" : { },
1583
1586
  "eu-central-1" : { },
1587
+ "eu-north-1" : { },
1584
1588
  "eu-west-1" : { },
1585
1589
  "eu-west-2" : { },
1590
+ "eu-west-3" : { },
1591
+ "sa-east-1" : { },
1586
1592
  "us-east-1" : { },
1587
1593
  "us-east-2" : { },
1588
1594
  "us-west-1" : { },
@@ -2036,12 +2042,17 @@
2036
2042
  "lakeformation" : {
2037
2043
  "endpoints" : {
2038
2044
  "ap-northeast-1" : { },
2045
+ "ap-northeast-2" : { },
2039
2046
  "ap-south-1" : { },
2040
2047
  "ap-southeast-1" : { },
2041
2048
  "ap-southeast-2" : { },
2049
+ "ca-central-1" : { },
2050
+ "eu-central-1" : { },
2042
2051
  "eu-west-1" : { },
2052
+ "eu-west-2" : { },
2043
2053
  "us-east-1" : { },
2044
2054
  "us-east-2" : { },
2055
+ "us-west-1" : { },
2045
2056
  "us-west-2" : { }
2046
2057
  }
2047
2058
  },
@@ -2253,6 +2264,7 @@
2253
2264
  },
2254
2265
  "mgh" : {
2255
2266
  "endpoints" : {
2267
+ "eu-central-1" : { },
2256
2268
  "us-west-2" : { }
2257
2269
  }
2258
2270
  },
@@ -2646,6 +2658,10 @@
2646
2658
  "qldb" : {
2647
2659
  "endpoints" : {
2648
2660
  "ap-northeast-1" : { },
2661
+ "ap-northeast-2" : { },
2662
+ "ap-southeast-1" : { },
2663
+ "ap-southeast-2" : { },
2664
+ "eu-central-1" : { },
2649
2665
  "eu-west-1" : { },
2650
2666
  "us-east-1" : { },
2651
2667
  "us-east-2" : { },
@@ -3321,6 +3337,10 @@
3321
3337
  "session.qldb" : {
3322
3338
  "endpoints" : {
3323
3339
  "ap-northeast-1" : { },
3340
+ "ap-northeast-2" : { },
3341
+ "ap-southeast-1" : { },
3342
+ "ap-southeast-2" : { },
3343
+ "eu-central-1" : { },
3324
3344
  "eu-west-1" : { },
3325
3345
  "us-east-1" : { },
3326
3346
  "us-east-2" : { },
@@ -3330,25 +3350,10 @@
3330
3350
  "shield" : {
3331
3351
  "defaults" : {
3332
3352
  "protocols" : [ "https" ],
3333
- "sslCommonName" : "shield.ca-central-1.amazonaws.com"
3353
+ "sslCommonName" : "shield.us-east-1.amazonaws.com"
3334
3354
  },
3335
3355
  "endpoints" : {
3336
- "ap-northeast-1" : { },
3337
- "ap-northeast-2" : { },
3338
- "ap-south-1" : { },
3339
- "ap-southeast-1" : { },
3340
- "ap-southeast-2" : { },
3341
- "ca-central-1" : { },
3342
- "eu-central-1" : { },
3343
- "eu-north-1" : { },
3344
- "eu-west-1" : { },
3345
- "eu-west-2" : { },
3346
- "eu-west-3" : { },
3347
- "sa-east-1" : { },
3348
- "us-east-1" : { },
3349
- "us-east-2" : { },
3350
- "us-west-1" : { },
3351
- "us-west-2" : { }
3356
+ "us-east-1" : { }
3352
3357
  },
3353
3358
  "isRegionalized" : false
3354
3359
  },
@@ -3929,10 +3934,6 @@
3929
3934
  },
3930
3935
  "application-autoscaling" : {
3931
3936
  "defaults" : {
3932
- "credentialScope" : {
3933
- "service" : "application-autoscaling"
3934
- },
3935
- "hostname" : "autoscaling.{region}.amazonaws.com",
3936
3937
  "protocols" : [ "http", "https" ]
3937
3938
  },
3938
3939
  "endpoints" : {
@@ -4015,6 +4016,11 @@
4015
4016
  "cn-northwest-1" : { }
4016
4017
  }
4017
4018
  },
4019
+ "dax" : {
4020
+ "endpoints" : {
4021
+ "cn-northwest-1" : { }
4022
+ }
4023
+ },
4018
4024
  "directconnect" : {
4019
4025
  "endpoints" : {
4020
4026
  "cn-north-1" : { },
@@ -4360,6 +4366,11 @@
4360
4366
  "hostname" : "cn.transcribe.cn-northwest-1.amazonaws.com.cn"
4361
4367
  }
4362
4368
  }
4369
+ },
4370
+ "workspaces" : {
4371
+ "endpoints" : {
4372
+ "cn-northwest-1" : { }
4373
+ }
4363
4374
  }
4364
4375
  }
4365
4376
  }, {
@@ -4424,6 +4435,9 @@
4424
4435
  }
4425
4436
  },
4426
4437
  "application-autoscaling" : {
4438
+ "defaults" : {
4439
+ "protocols" : [ "http", "https" ]
4440
+ },
4427
4441
  "endpoints" : {
4428
4442
  "us-gov-east-1" : { },
4429
4443
  "us-gov-west-1" : { }
@@ -4556,6 +4570,7 @@
4556
4570
  },
4557
4571
  "hostname" : "datasync-fips.us-gov-west-1.amazonaws.com"
4558
4572
  },
4573
+ "us-gov-east-1" : { },
4559
4574
  "us-gov-west-1" : { }
4560
4575
  }
4561
4576
  },
@@ -5147,10 +5162,7 @@
5147
5162
  },
5148
5163
  "application-autoscaling" : {
5149
5164
  "defaults" : {
5150
- "credentialScope" : {
5151
- "service" : "application-autoscaling"
5152
- },
5153
- "hostname" : "autoscaling.{region}.amazonaws.com",
5165
+ "hostname" : "autoscaling.us-iso-east-1.c2s.ic.gov",
5154
5166
  "protocols" : [ "http", "https" ]
5155
5167
  },
5156
5168
  "endpoints" : {
@@ -5420,10 +5432,7 @@
5420
5432
  "services" : {
5421
5433
  "application-autoscaling" : {
5422
5434
  "defaults" : {
5423
- "credentialScope" : {
5424
- "service" : "application-autoscaling"
5425
- },
5426
- "hostname" : "autoscaling.{region}.amazonaws.com",
5435
+ "hostname" : "autoscaling.us-isob-east-1.sc2s.sgov.gov",
5427
5436
  "protocols" : [ "http", "https" ]
5428
5437
  },
5429
5438
  "endpoints" : {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-partitions
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.239.0
4
+ version: 1.244.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amazon Web Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-13 00:00:00.000000000 Z
11
+ date: 2019-11-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Provides interfaces to enumerate AWS partitions, regions, and services.
14
14
  email: