pulumi-consul 3.12.0a1709360320__py3-none-any.whl → 3.13.0a1736832526__py3-none-any.whl
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.
Potentially problematic release.
This version of pulumi-consul might be problematic. Click here for more details.
- pulumi_consul/__init__.py +10 -0
- pulumi_consul/_inputs.py +1592 -31
- pulumi_consul/_utilities.py +41 -5
- pulumi_consul/acl_auth_method.py +17 -14
- pulumi_consul/acl_binding_rule.py +12 -5
- pulumi_consul/acl_policy.py +9 -4
- pulumi_consul/acl_role.py +39 -30
- pulumi_consul/acl_role_policy_attachment.py +15 -8
- pulumi_consul/acl_token.py +36 -27
- pulumi_consul/acl_token_policy_attachment.py +7 -2
- pulumi_consul/acl_token_role_attachment.py +11 -4
- pulumi_consul/admin_partition.py +13 -4
- pulumi_consul/agent_service.py +7 -0
- pulumi_consul/autopilot_config.py +5 -0
- pulumi_consul/catalog_entry.py +16 -62
- pulumi_consul/certificate_authority.py +10 -51
- pulumi_consul/config/__init__.pyi +5 -0
- pulumi_consul/config/outputs.py +5 -0
- pulumi_consul/config/vars.py +5 -0
- pulumi_consul/config_entry.py +75 -26
- pulumi_consul/config_entry_service_defaults.py +58 -51
- pulumi_consul/config_entry_service_intentions.py +80 -71
- pulumi_consul/config_entry_service_resolver.py +94 -87
- pulumi_consul/config_entry_service_router.py +31 -62
- pulumi_consul/config_entry_service_splitter.py +104 -93
- pulumi_consul/config_entry_v2_exported_services.py +479 -0
- pulumi_consul/get_acl_auth_method.py +26 -8
- pulumi_consul/get_acl_policy.py +20 -5
- pulumi_consul/get_acl_role.py +24 -5
- pulumi_consul/get_acl_token.py +25 -5
- pulumi_consul/get_acl_token_secret_id.py +29 -11
- pulumi_consul/get_agent_config.py +17 -5
- pulumi_consul/get_agent_self.py +82 -5
- pulumi_consul/get_autopilot_health.py +16 -5
- pulumi_consul/get_catalog_nodes.py +21 -9
- pulumi_consul/get_catalog_service.py +56 -13
- pulumi_consul/get_catalog_services.py +53 -9
- pulumi_consul/get_config_entry.py +20 -5
- pulumi_consul/get_config_entry_v2_exported_services.py +232 -0
- pulumi_consul/get_datacenters.py +12 -5
- pulumi_consul/get_key_prefix.py +55 -38
- pulumi_consul/get_keys.py +44 -30
- pulumi_consul/get_network_area_members.py +26 -16
- pulumi_consul/get_network_segments.py +22 -14
- pulumi_consul/get_nodes.py +21 -9
- pulumi_consul/get_peering.py +22 -5
- pulumi_consul/get_peerings.py +14 -5
- pulumi_consul/get_service.py +56 -13
- pulumi_consul/get_service_health.py +28 -5
- pulumi_consul/get_services.py +53 -9
- pulumi_consul/intention.py +17 -12
- pulumi_consul/key_prefix.py +48 -50
- pulumi_consul/keys.py +26 -30
- pulumi_consul/license.py +9 -2
- pulumi_consul/namespace.py +13 -4
- pulumi_consul/namespace_policy_attachment.py +11 -4
- pulumi_consul/namespace_role_attachment.py +11 -4
- pulumi_consul/network_area.py +11 -15
- pulumi_consul/node.py +19 -19
- pulumi_consul/outputs.py +30 -27
- pulumi_consul/peering.py +13 -18
- pulumi_consul/peering_token.py +55 -11
- pulumi_consul/prepared_query.py +101 -101
- pulumi_consul/provider.py +11 -6
- pulumi_consul/pulumi-plugin.json +2 -1
- pulumi_consul/service.py +144 -19
- {pulumi_consul-3.12.0a1709360320.dist-info → pulumi_consul-3.13.0a1736832526.dist-info}/METADATA +7 -6
- pulumi_consul-3.13.0a1736832526.dist-info/RECORD +72 -0
- {pulumi_consul-3.12.0a1709360320.dist-info → pulumi_consul-3.13.0a1736832526.dist-info}/WHEEL +1 -1
- pulumi_consul-3.12.0a1709360320.dist-info/RECORD +0 -70
- {pulumi_consul-3.12.0a1709360320.dist-info → pulumi_consul-3.13.0a1736832526.dist-info}/top_level.txt +0 -0
|
@@ -4,9 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
import copy
|
|
6
6
|
import warnings
|
|
7
|
+
import sys
|
|
7
8
|
import pulumi
|
|
8
9
|
import pulumi.runtime
|
|
9
10
|
from typing import Any, Mapping, Optional, Sequence, Union, overload
|
|
11
|
+
if sys.version_info >= (3, 11):
|
|
12
|
+
from typing import NotRequired, TypedDict, TypeAlias
|
|
13
|
+
else:
|
|
14
|
+
from typing_extensions import NotRequired, TypedDict, TypeAlias
|
|
10
15
|
from . import _utilities
|
|
11
16
|
from . import outputs
|
|
12
17
|
from ._inputs import *
|
|
@@ -26,8 +31,8 @@ class ConfigEntryServiceSplitterArgs:
|
|
|
26
31
|
:param pulumi.Input[Sequence[pulumi.Input['ConfigEntryServiceSplitterSplitArgs']]] splits: Defines how much traffic to send to sets of service instances during a traffic split.
|
|
27
32
|
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] meta: Specifies key-value pairs to add to the KV store.
|
|
28
33
|
:param pulumi.Input[str] name: Specifies a name for the configuration entry.
|
|
29
|
-
:param pulumi.Input[str] namespace: Specifies the namespace to
|
|
30
|
-
:param pulumi.Input[str] partition: Specifies the admin partition to
|
|
34
|
+
:param pulumi.Input[str] namespace: Specifies the namespace to apply the configuration entry.
|
|
35
|
+
:param pulumi.Input[str] partition: Specifies the admin partition to apply the configuration entry.
|
|
31
36
|
"""
|
|
32
37
|
pulumi.set(__self__, "splits", splits)
|
|
33
38
|
if meta is not None:
|
|
@@ -79,7 +84,7 @@ class ConfigEntryServiceSplitterArgs:
|
|
|
79
84
|
@pulumi.getter
|
|
80
85
|
def namespace(self) -> Optional[pulumi.Input[str]]:
|
|
81
86
|
"""
|
|
82
|
-
Specifies the namespace to
|
|
87
|
+
Specifies the namespace to apply the configuration entry.
|
|
83
88
|
"""
|
|
84
89
|
return pulumi.get(self, "namespace")
|
|
85
90
|
|
|
@@ -91,7 +96,7 @@ class ConfigEntryServiceSplitterArgs:
|
|
|
91
96
|
@pulumi.getter
|
|
92
97
|
def partition(self) -> Optional[pulumi.Input[str]]:
|
|
93
98
|
"""
|
|
94
|
-
Specifies the admin partition to
|
|
99
|
+
Specifies the admin partition to apply the configuration entry.
|
|
95
100
|
"""
|
|
96
101
|
return pulumi.get(self, "partition")
|
|
97
102
|
|
|
@@ -112,8 +117,8 @@ class _ConfigEntryServiceSplitterState:
|
|
|
112
117
|
Input properties used for looking up and filtering ConfigEntryServiceSplitter resources.
|
|
113
118
|
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] meta: Specifies key-value pairs to add to the KV store.
|
|
114
119
|
:param pulumi.Input[str] name: Specifies a name for the configuration entry.
|
|
115
|
-
:param pulumi.Input[str] namespace: Specifies the namespace to
|
|
116
|
-
:param pulumi.Input[str] partition: Specifies the admin partition to
|
|
120
|
+
:param pulumi.Input[str] namespace: Specifies the namespace to apply the configuration entry.
|
|
121
|
+
:param pulumi.Input[str] partition: Specifies the admin partition to apply the configuration entry.
|
|
117
122
|
:param pulumi.Input[Sequence[pulumi.Input['ConfigEntryServiceSplitterSplitArgs']]] splits: Defines how much traffic to send to sets of service instances during a traffic split.
|
|
118
123
|
"""
|
|
119
124
|
if meta is not None:
|
|
@@ -155,7 +160,7 @@ class _ConfigEntryServiceSplitterState:
|
|
|
155
160
|
@pulumi.getter
|
|
156
161
|
def namespace(self) -> Optional[pulumi.Input[str]]:
|
|
157
162
|
"""
|
|
158
|
-
Specifies the namespace to
|
|
163
|
+
Specifies the namespace to apply the configuration entry.
|
|
159
164
|
"""
|
|
160
165
|
return pulumi.get(self, "namespace")
|
|
161
166
|
|
|
@@ -167,7 +172,7 @@ class _ConfigEntryServiceSplitterState:
|
|
|
167
172
|
@pulumi.getter
|
|
168
173
|
def partition(self) -> Optional[pulumi.Input[str]]:
|
|
169
174
|
"""
|
|
170
|
-
Specifies the admin partition to
|
|
175
|
+
Specifies the admin partition to apply the configuration entry.
|
|
171
176
|
"""
|
|
172
177
|
return pulumi.get(self, "partition")
|
|
173
178
|
|
|
@@ -197,7 +202,7 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
197
202
|
name: Optional[pulumi.Input[str]] = None,
|
|
198
203
|
namespace: Optional[pulumi.Input[str]] = None,
|
|
199
204
|
partition: Optional[pulumi.Input[str]] = None,
|
|
200
|
-
splits: Optional[pulumi.Input[Sequence[pulumi.Input[
|
|
205
|
+
splits: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ConfigEntryServiceSplitterSplitArgs', 'ConfigEntryServiceSplitterSplitArgsDict']]]]] = None,
|
|
201
206
|
__props__=None):
|
|
202
207
|
"""
|
|
203
208
|
## Example Usage
|
|
@@ -208,6 +213,7 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
208
213
|
import pulumi_consul as consul
|
|
209
214
|
|
|
210
215
|
web = consul.ConfigEntry("web",
|
|
216
|
+
name="web",
|
|
211
217
|
kind="service-defaults",
|
|
212
218
|
config_json=json.dumps({
|
|
213
219
|
"Protocol": "http",
|
|
@@ -215,74 +221,76 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
215
221
|
"MeshGateway": {},
|
|
216
222
|
"TransparentProxy": {},
|
|
217
223
|
}))
|
|
218
|
-
service_resolver = consul.ConfigEntryServiceResolver("
|
|
224
|
+
service_resolver = consul.ConfigEntryServiceResolver("service_resolver",
|
|
225
|
+
name="service-resolver",
|
|
219
226
|
default_subset="v1",
|
|
220
227
|
subsets=[
|
|
221
|
-
|
|
222
|
-
name
|
|
223
|
-
filter
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
name
|
|
227
|
-
filter
|
|
228
|
-
|
|
228
|
+
{
|
|
229
|
+
"name": "v1",
|
|
230
|
+
"filter": "Service.Meta.version == v1",
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"name": "v2",
|
|
234
|
+
"filter": "Service.Meta.version == v2",
|
|
235
|
+
},
|
|
229
236
|
])
|
|
230
237
|
foo = consul.ConfigEntryServiceSplitter("foo",
|
|
238
|
+
name=service_resolver.name,
|
|
231
239
|
meta={
|
|
232
240
|
"key": "value",
|
|
233
241
|
},
|
|
234
242
|
splits=[
|
|
235
|
-
|
|
236
|
-
weight
|
|
237
|
-
service
|
|
238
|
-
service_subset
|
|
239
|
-
request_headers
|
|
240
|
-
set
|
|
243
|
+
{
|
|
244
|
+
"weight": 80,
|
|
245
|
+
"service": "web",
|
|
246
|
+
"service_subset": "v1",
|
|
247
|
+
"request_headers": {
|
|
248
|
+
"set": {
|
|
241
249
|
"x-web-version": "from-v1",
|
|
242
250
|
},
|
|
243
|
-
|
|
244
|
-
response_headers
|
|
245
|
-
set
|
|
251
|
+
},
|
|
252
|
+
"response_headers": {
|
|
253
|
+
"set": {
|
|
246
254
|
"x-web-version": "to-v1",
|
|
247
255
|
},
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
weight
|
|
252
|
-
service
|
|
253
|
-
service_subset
|
|
254
|
-
request_headers
|
|
255
|
-
set
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"weight": 10,
|
|
260
|
+
"service": "web",
|
|
261
|
+
"service_subset": "v2",
|
|
262
|
+
"request_headers": {
|
|
263
|
+
"set": {
|
|
256
264
|
"x-web-version": "from-v2",
|
|
257
265
|
},
|
|
258
|
-
|
|
259
|
-
response_headers
|
|
260
|
-
set
|
|
266
|
+
},
|
|
267
|
+
"response_headers": {
|
|
268
|
+
"set": {
|
|
261
269
|
"x-web-version": "to-v2",
|
|
262
270
|
},
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
weight
|
|
267
|
-
service
|
|
268
|
-
service_subset
|
|
269
|
-
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"weight": 10,
|
|
275
|
+
"service": "web",
|
|
276
|
+
"service_subset": "v2",
|
|
277
|
+
},
|
|
270
278
|
])
|
|
271
279
|
```
|
|
272
280
|
|
|
273
281
|
## Import
|
|
274
282
|
|
|
275
283
|
```sh
|
|
276
|
-
|
|
284
|
+
$ pulumi import consul:index/configEntryServiceSplitter:ConfigEntryServiceSplitter foo web
|
|
277
285
|
```
|
|
278
286
|
|
|
279
287
|
:param str resource_name: The name of the resource.
|
|
280
288
|
:param pulumi.ResourceOptions opts: Options for the resource.
|
|
281
289
|
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] meta: Specifies key-value pairs to add to the KV store.
|
|
282
290
|
:param pulumi.Input[str] name: Specifies a name for the configuration entry.
|
|
283
|
-
:param pulumi.Input[str] namespace: Specifies the namespace to
|
|
284
|
-
:param pulumi.Input[str] partition: Specifies the admin partition to
|
|
285
|
-
:param pulumi.Input[Sequence[pulumi.Input[
|
|
291
|
+
:param pulumi.Input[str] namespace: Specifies the namespace to apply the configuration entry.
|
|
292
|
+
:param pulumi.Input[str] partition: Specifies the admin partition to apply the configuration entry.
|
|
293
|
+
:param pulumi.Input[Sequence[pulumi.Input[Union['ConfigEntryServiceSplitterSplitArgs', 'ConfigEntryServiceSplitterSplitArgsDict']]]] splits: Defines how much traffic to send to sets of service instances during a traffic split.
|
|
286
294
|
"""
|
|
287
295
|
...
|
|
288
296
|
@overload
|
|
@@ -299,6 +307,7 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
299
307
|
import pulumi_consul as consul
|
|
300
308
|
|
|
301
309
|
web = consul.ConfigEntry("web",
|
|
310
|
+
name="web",
|
|
302
311
|
kind="service-defaults",
|
|
303
312
|
config_json=json.dumps({
|
|
304
313
|
"Protocol": "http",
|
|
@@ -306,65 +315,67 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
306
315
|
"MeshGateway": {},
|
|
307
316
|
"TransparentProxy": {},
|
|
308
317
|
}))
|
|
309
|
-
service_resolver = consul.ConfigEntryServiceResolver("
|
|
318
|
+
service_resolver = consul.ConfigEntryServiceResolver("service_resolver",
|
|
319
|
+
name="service-resolver",
|
|
310
320
|
default_subset="v1",
|
|
311
321
|
subsets=[
|
|
312
|
-
|
|
313
|
-
name
|
|
314
|
-
filter
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
name
|
|
318
|
-
filter
|
|
319
|
-
|
|
322
|
+
{
|
|
323
|
+
"name": "v1",
|
|
324
|
+
"filter": "Service.Meta.version == v1",
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"name": "v2",
|
|
328
|
+
"filter": "Service.Meta.version == v2",
|
|
329
|
+
},
|
|
320
330
|
])
|
|
321
331
|
foo = consul.ConfigEntryServiceSplitter("foo",
|
|
332
|
+
name=service_resolver.name,
|
|
322
333
|
meta={
|
|
323
334
|
"key": "value",
|
|
324
335
|
},
|
|
325
336
|
splits=[
|
|
326
|
-
|
|
327
|
-
weight
|
|
328
|
-
service
|
|
329
|
-
service_subset
|
|
330
|
-
request_headers
|
|
331
|
-
set
|
|
337
|
+
{
|
|
338
|
+
"weight": 80,
|
|
339
|
+
"service": "web",
|
|
340
|
+
"service_subset": "v1",
|
|
341
|
+
"request_headers": {
|
|
342
|
+
"set": {
|
|
332
343
|
"x-web-version": "from-v1",
|
|
333
344
|
},
|
|
334
|
-
|
|
335
|
-
response_headers
|
|
336
|
-
set
|
|
345
|
+
},
|
|
346
|
+
"response_headers": {
|
|
347
|
+
"set": {
|
|
337
348
|
"x-web-version": "to-v1",
|
|
338
349
|
},
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
weight
|
|
343
|
-
service
|
|
344
|
-
service_subset
|
|
345
|
-
request_headers
|
|
346
|
-
set
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"weight": 10,
|
|
354
|
+
"service": "web",
|
|
355
|
+
"service_subset": "v2",
|
|
356
|
+
"request_headers": {
|
|
357
|
+
"set": {
|
|
347
358
|
"x-web-version": "from-v2",
|
|
348
359
|
},
|
|
349
|
-
|
|
350
|
-
response_headers
|
|
351
|
-
set
|
|
360
|
+
},
|
|
361
|
+
"response_headers": {
|
|
362
|
+
"set": {
|
|
352
363
|
"x-web-version": "to-v2",
|
|
353
364
|
},
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
weight
|
|
358
|
-
service
|
|
359
|
-
service_subset
|
|
360
|
-
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
"weight": 10,
|
|
369
|
+
"service": "web",
|
|
370
|
+
"service_subset": "v2",
|
|
371
|
+
},
|
|
361
372
|
])
|
|
362
373
|
```
|
|
363
374
|
|
|
364
375
|
## Import
|
|
365
376
|
|
|
366
377
|
```sh
|
|
367
|
-
|
|
378
|
+
$ pulumi import consul:index/configEntryServiceSplitter:ConfigEntryServiceSplitter foo web
|
|
368
379
|
```
|
|
369
380
|
|
|
370
381
|
:param str resource_name: The name of the resource.
|
|
@@ -386,7 +397,7 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
386
397
|
name: Optional[pulumi.Input[str]] = None,
|
|
387
398
|
namespace: Optional[pulumi.Input[str]] = None,
|
|
388
399
|
partition: Optional[pulumi.Input[str]] = None,
|
|
389
|
-
splits: Optional[pulumi.Input[Sequence[pulumi.Input[
|
|
400
|
+
splits: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ConfigEntryServiceSplitterSplitArgs', 'ConfigEntryServiceSplitterSplitArgsDict']]]]] = None,
|
|
390
401
|
__props__=None):
|
|
391
402
|
opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
|
|
392
403
|
if not isinstance(opts, pulumi.ResourceOptions):
|
|
@@ -417,7 +428,7 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
417
428
|
name: Optional[pulumi.Input[str]] = None,
|
|
418
429
|
namespace: Optional[pulumi.Input[str]] = None,
|
|
419
430
|
partition: Optional[pulumi.Input[str]] = None,
|
|
420
|
-
splits: Optional[pulumi.Input[Sequence[pulumi.Input[
|
|
431
|
+
splits: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ConfigEntryServiceSplitterSplitArgs', 'ConfigEntryServiceSplitterSplitArgsDict']]]]] = None) -> 'ConfigEntryServiceSplitter':
|
|
421
432
|
"""
|
|
422
433
|
Get an existing ConfigEntryServiceSplitter resource's state with the given name, id, and optional extra
|
|
423
434
|
properties used to qualify the lookup.
|
|
@@ -427,9 +438,9 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
427
438
|
:param pulumi.ResourceOptions opts: Options for the resource.
|
|
428
439
|
:param pulumi.Input[Mapping[str, pulumi.Input[str]]] meta: Specifies key-value pairs to add to the KV store.
|
|
429
440
|
:param pulumi.Input[str] name: Specifies a name for the configuration entry.
|
|
430
|
-
:param pulumi.Input[str] namespace: Specifies the namespace to
|
|
431
|
-
:param pulumi.Input[str] partition: Specifies the admin partition to
|
|
432
|
-
:param pulumi.Input[Sequence[pulumi.Input[
|
|
441
|
+
:param pulumi.Input[str] namespace: Specifies the namespace to apply the configuration entry.
|
|
442
|
+
:param pulumi.Input[str] partition: Specifies the admin partition to apply the configuration entry.
|
|
443
|
+
:param pulumi.Input[Sequence[pulumi.Input[Union['ConfigEntryServiceSplitterSplitArgs', 'ConfigEntryServiceSplitterSplitArgsDict']]]] splits: Defines how much traffic to send to sets of service instances during a traffic split.
|
|
433
444
|
"""
|
|
434
445
|
opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))
|
|
435
446
|
|
|
@@ -462,7 +473,7 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
462
473
|
@pulumi.getter
|
|
463
474
|
def namespace(self) -> pulumi.Output[Optional[str]]:
|
|
464
475
|
"""
|
|
465
|
-
Specifies the namespace to
|
|
476
|
+
Specifies the namespace to apply the configuration entry.
|
|
466
477
|
"""
|
|
467
478
|
return pulumi.get(self, "namespace")
|
|
468
479
|
|
|
@@ -470,7 +481,7 @@ class ConfigEntryServiceSplitter(pulumi.CustomResource):
|
|
|
470
481
|
@pulumi.getter
|
|
471
482
|
def partition(self) -> pulumi.Output[Optional[str]]:
|
|
472
483
|
"""
|
|
473
|
-
Specifies the admin partition to
|
|
484
|
+
Specifies the admin partition to apply the configuration entry.
|
|
474
485
|
"""
|
|
475
486
|
return pulumi.get(self, "partition")
|
|
476
487
|
|