Skip to content

Commit 2352fa7

Browse files
expobrainGithub Actions
andauthored
feat: Updated API at 2024-04-08 (#439)
Co-authored-by: Github Actions <[email protected]>
1 parent 796fbc5 commit 2352fa7

18 files changed

+211
-130
lines changed

incident_io_client/api/catalog_v2/catalog_v2_update_type_schema.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ def sync_detailed(
8181
Args:
8282
id (str):
8383
body (CatalogV2UpdateTypeSchemaRequestBody): Example: {'attributes': [{'array': False,
84-
'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
85-
'Custom["Service"]'}], 'version': 1}.
84+
'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual',
85+
'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1}.
8686
8787
Raises:
8888
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -124,8 +124,8 @@ def sync(
124124
Args:
125125
id (str):
126126
body (CatalogV2UpdateTypeSchemaRequestBody): Example: {'attributes': [{'array': False,
127-
'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
128-
'Custom["Service"]'}], 'version': 1}.
127+
'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual',
128+
'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1}.
129129
130130
Raises:
131131
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -162,8 +162,8 @@ async def asyncio_detailed(
162162
Args:
163163
id (str):
164164
body (CatalogV2UpdateTypeSchemaRequestBody): Example: {'attributes': [{'array': False,
165-
'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
166-
'Custom["Service"]'}], 'version': 1}.
165+
'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual',
166+
'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1}.
167167
168168
Raises:
169169
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -203,8 +203,8 @@ async def asyncio(
203203
Args:
204204
id (str):
205205
body (CatalogV2UpdateTypeSchemaRequestBody): Example: {'attributes': [{'array': False,
206-
'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
207-
'Custom["Service"]'}], 'version': 1}.
206+
'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual',
207+
'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1}.
208208
209209
Raises:
210210
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.

incident_io_client/client.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@ class Client:
3535
"""
3636

3737
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
38-
_base_url: str
39-
_cookies: Dict[str, str] = field(factory=dict, kw_only=True)
40-
_headers: Dict[str, str] = field(factory=dict, kw_only=True)
41-
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True)
42-
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True)
43-
_follow_redirects: bool = field(default=False, kw_only=True)
44-
_httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True)
38+
_base_url: str = field(alias="base_url")
39+
_cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
40+
_headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
41+
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
42+
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(
43+
default=True, kw_only=True, alias="verify_ssl"
44+
)
45+
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
46+
_httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
4547
_client: Optional[httpx.Client] = field(default=None, init=False)
4648
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
4749

@@ -165,13 +167,15 @@ class AuthenticatedClient:
165167
"""
166168

167169
raise_on_unexpected_status: bool = field(default=False, kw_only=True)
168-
_base_url: str
169-
_cookies: Dict[str, str] = field(factory=dict, kw_only=True)
170-
_headers: Dict[str, str] = field(factory=dict, kw_only=True)
171-
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True)
172-
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(default=True, kw_only=True)
173-
_follow_redirects: bool = field(default=False, kw_only=True)
174-
_httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True)
170+
_base_url: str = field(alias="base_url")
171+
_cookies: Dict[str, str] = field(factory=dict, kw_only=True, alias="cookies")
172+
_headers: Dict[str, str] = field(factory=dict, kw_only=True, alias="headers")
173+
_timeout: Optional[httpx.Timeout] = field(default=None, kw_only=True, alias="timeout")
174+
_verify_ssl: Union[str, bool, ssl.SSLContext] = field(
175+
default=True, kw_only=True, alias="verify_ssl"
176+
)
177+
_follow_redirects: bool = field(default=False, kw_only=True, alias="follow_redirects")
178+
_httpx_args: Dict[str, Any] = field(factory=dict, kw_only=True, alias="httpx_args")
175179
_client: Optional[httpx.Client] = field(default=None, init=False)
176180
_async_client: Optional[httpx.AsyncClient] = field(default=None, init=False)
177181

incident_io_client/models/catalog_type_attribute_payload_v2_request_body.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
class CatalogTypeAttributePayloadV2RequestBody:
1616
"""
1717
Example:
18-
{'array': False, 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
19-
'Custom["Service"]'}
18+
{'array': False, 'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name':
19+
'tier', 'type': 'Custom["Service"]'}
2020
2121
Attributes:
2222
array (bool): Whether this attribute is an array
2323
name (str): Unique name of this attribute Example: tier.
2424
type (str): Catalog type name for this attribute Example: Custom["Service"].
25+
backlink_attribute (Union[Unset, str]): The attribute to use (if this is a backlink) Example: abc123.
2526
id (Union[Unset, str]): The ID of this attribute Example: 01GW2G3V0S59R238FAHPDS1R66.
2627
mode (Union[Unset, CatalogTypeAttributePayloadV2RequestBodyMode]): Controls how this attribute is modified
2728
Example: manual.
@@ -30,6 +31,7 @@ class CatalogTypeAttributePayloadV2RequestBody:
3031
array: bool
3132
name: str
3233
type: str
34+
backlink_attribute: Union[Unset, str] = UNSET
3335
id: Union[Unset, str] = UNSET
3436
mode: Union[Unset, CatalogTypeAttributePayloadV2RequestBodyMode] = UNSET
3537
additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
@@ -41,6 +43,8 @@ def to_dict(self) -> Dict[str, Any]:
4143

4244
type = self.type
4345

46+
backlink_attribute = self.backlink_attribute
47+
4448
id = self.id
4549

4650
mode: Union[Unset, str] = UNSET
@@ -56,6 +60,8 @@ def to_dict(self) -> Dict[str, Any]:
5660
"type": type,
5761
}
5862
)
63+
if backlink_attribute is not UNSET:
64+
field_dict["backlink_attribute"] = backlink_attribute
5965
if id is not UNSET:
6066
field_dict["id"] = id
6167
if mode is not UNSET:
@@ -72,6 +78,8 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
7278

7379
type = d.pop("type")
7480

81+
backlink_attribute = d.pop("backlink_attribute", UNSET)
82+
7583
id = d.pop("id", UNSET)
7684

7785
_mode = d.pop("mode", UNSET)
@@ -85,6 +93,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
8593
array=array,
8694
name=name,
8795
type=type,
96+
backlink_attribute=backlink_attribute,
8897
id=id,
8998
mode=mode,
9099
)

incident_io_client/models/catalog_type_attribute_v2_response_body.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
from typing import Any, Dict, List, Type, TypeVar
1+
from typing import Any, Dict, List, Type, TypeVar, Union
22

33
from attrs import define as _attrs_define
44
from attrs import field as _attrs_field
55

66
from ..models.catalog_type_attribute_v2_response_body_mode import (
77
CatalogTypeAttributeV2ResponseBodyMode,
88
)
9+
from ..types import UNSET, Unset
910

1011
T = TypeVar("T", bound="CatalogTypeAttributeV2ResponseBody")
1112

@@ -14,22 +15,24 @@
1415
class CatalogTypeAttributeV2ResponseBody:
1516
"""
1617
Example:
17-
{'array': False, 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
18-
'Custom["Service"]'}
18+
{'array': False, 'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name':
19+
'tier', 'type': 'Custom["Service"]'}
1920
2021
Attributes:
2122
array (bool): Whether this attribute is an array
2223
id (str): The ID of this attribute Example: 01GW2G3V0S59R238FAHPDS1R66.
2324
mode (CatalogTypeAttributeV2ResponseBodyMode): Controls how this attribute is modified Example: manual.
2425
name (str): Unique name of this attribute Example: tier.
2526
type (str): Catalog type name for this attribute Example: Custom["Service"].
27+
backlink_attribute (Union[Unset, str]): The attribute to use (if this is a backlink) Example: abc123.
2628
"""
2729

2830
array: bool
2931
id: str
3032
mode: CatalogTypeAttributeV2ResponseBodyMode
3133
name: str
3234
type: str
35+
backlink_attribute: Union[Unset, str] = UNSET
3336
additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
3437

3538
def to_dict(self) -> Dict[str, Any]:
@@ -43,6 +46,8 @@ def to_dict(self) -> Dict[str, Any]:
4346

4447
type = self.type
4548

49+
backlink_attribute = self.backlink_attribute
50+
4651
field_dict: Dict[str, Any] = {}
4752
field_dict.update(self.additional_properties)
4853
field_dict.update(
@@ -54,6 +59,8 @@ def to_dict(self) -> Dict[str, Any]:
5459
"type": type,
5560
}
5661
)
62+
if backlink_attribute is not UNSET:
63+
field_dict["backlink_attribute"] = backlink_attribute
5764

5865
return field_dict
5966

@@ -70,12 +77,15 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
7077

7178
type = d.pop("type")
7279

80+
backlink_attribute = d.pop("backlink_attribute", UNSET)
81+
7382
catalog_type_attribute_v2_response_body = cls(
7483
array=array,
7584
id=id,
7685
mode=mode,
7786
name=name,
7887
type=type,
88+
backlink_attribute=backlink_attribute,
7989
)
8090

8191
catalog_type_attribute_v2_response_body.additional_properties = d

incident_io_client/models/catalog_type_schema_v2_response_body.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@
1616
class CatalogTypeSchemaV2ResponseBody:
1717
"""
1818
Example:
19-
{'attributes': [{'array': False, 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
20-
'Custom["Service"]'}], 'version': 1}
19+
{'attributes': [{'array': False, 'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode':
20+
'manual', 'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1}
2121
2222
Attributes:
2323
attributes (List['CatalogTypeAttributeV2ResponseBody']): Attributes of this catalog type Example: [{'array':
24-
False, 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type': 'Custom["Service"]'}].
24+
False, 'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier',
25+
'type': 'Custom["Service"]'}].
2526
version (int): The version number of this schema Example: 1.
2627
"""
2728

incident_io_client/models/catalog_type_v2_response_body.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ class CatalogTypeV2ResponseBody:
3030
'dynamic_resource_parameter': 'abc123', 'estimated_count': 7, 'icon': 'bolt', 'id':
3131
'01FCNDV6P870EA6S7TK1DSYDG0', 'is_editable': False, 'last_synced_at': '2021-08-17T13:28:57.801578Z', 'name':
3232
'Kubernetes Cluster', 'ranked': True, 'registry_type': 'PagerDutyService', 'required_integrations':
33-
['pager_duty'], 'schema': {'attributes': [{'array': False, 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual',
34-
'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1}, 'semantic_type': 'custom', 'source_repo_url':
35-
'https://github.com/my-company/incident-io-catalog', 'type_name': 'Custom["BackstageGroup"]', 'updated_at':
36-
'2021-08-17T13:28:57.801578Z'}
33+
['pager_duty'], 'schema': {'attributes': [{'array': False, 'backlink_attribute': 'abc123', 'id':
34+
'01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1},
35+
'semantic_type': 'custom', 'source_repo_url': 'https://github.com/my-company/incident-io-catalog', 'type_name':
36+
'Custom["BackstageGroup"]', 'updated_at': '2021-08-17T13:28:57.801578Z'}
3737
3838
Attributes:
3939
annotations (CatalogTypeV2ResponseBodyAnnotations): Annotations that can track metadata about this type Example:
@@ -47,8 +47,9 @@ class CatalogTypeV2ResponseBody:
4747
is_editable (bool): Catalog types that are synced with external resources can't be edited
4848
name (str): Name is the human readable name of this type Example: Kubernetes Cluster.
4949
ranked (bool): If this type should be ranked Example: True.
50-
schema (CatalogTypeSchemaV2ResponseBody): Example: {'attributes': [{'array': False, 'id':
51-
'01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1}.
50+
schema (CatalogTypeSchemaV2ResponseBody): Example: {'attributes': [{'array': False, 'backlink_attribute':
51+
'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type': 'Custom["Service"]'}],
52+
'version': 1}.
5253
semantic_type (str): Semantic type of this resource (unused) Example: custom.
5354
type_name (str): The type name of this catalog type, to be used when defining attributes. This is immutable once
5455
a CatalogType has been created. For non-externally sync types, it must follow the pattern Custom["SomeName "]

incident_io_client/models/catalog_v2_create_type_response_body.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,22 @@ class CatalogV2CreateTypeResponseBody:
1919
of GKE.', 'dynamic_resource_parameter': 'abc123', 'estimated_count': 7, 'icon': 'bolt', 'id':
2020
'01FCNDV6P870EA6S7TK1DSYDG0', 'is_editable': False, 'last_synced_at': '2021-08-17T13:28:57.801578Z', 'name':
2121
'Kubernetes Cluster', 'ranked': True, 'registry_type': 'PagerDutyService', 'required_integrations':
22-
['pager_duty'], 'schema': {'attributes': [{'array': False, 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual',
23-
'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1}, 'semantic_type': 'custom', 'source_repo_url':
24-
'https://github.com/my-company/incident-io-catalog', 'type_name': 'Custom["BackstageGroup"]', 'updated_at':
25-
'2021-08-17T13:28:57.801578Z'}}
22+
['pager_duty'], 'schema': {'attributes': [{'array': False, 'backlink_attribute': 'abc123', 'id':
23+
'01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1},
24+
'semantic_type': 'custom', 'source_repo_url': 'https://github.com/my-company/incident-io-catalog', 'type_name':
25+
'Custom["BackstageGroup"]', 'updated_at': '2021-08-17T13:28:57.801578Z'}}
2626
2727
Attributes:
2828
catalog_type (CatalogTypeV2ResponseBody): Example: {'annotations': {'incident.io/catalog-importer/id': 'id-of-
2929
config'}, 'color': 'yellow', 'created_at': '2021-08-17T13:28:57.801578Z', 'description': 'Represents Kubernetes
3030
clusters that we run inside of GKE.', 'dynamic_resource_parameter': 'abc123', 'estimated_count': 7, 'icon':
3131
'bolt', 'id': '01FCNDV6P870EA6S7TK1DSYDG0', 'is_editable': False, 'last_synced_at':
3232
'2021-08-17T13:28:57.801578Z', 'name': 'Kubernetes Cluster', 'ranked': True, 'registry_type':
33-
'PagerDutyService', 'required_integrations': ['pager_duty'], 'schema': {'attributes': [{'array': False, 'id':
34-
'01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1},
35-
'semantic_type': 'custom', 'source_repo_url': 'https://github.com/my-company/incident-io-catalog', 'type_name':
36-
'Custom["BackstageGroup"]', 'updated_at': '2021-08-17T13:28:57.801578Z'}.
33+
'PagerDutyService', 'required_integrations': ['pager_duty'], 'schema': {'attributes': [{'array': False,
34+
'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
35+
'Custom["Service"]'}], 'version': 1}, 'semantic_type': 'custom', 'source_repo_url': 'https://github.com/my-
36+
company/incident-io-catalog', 'type_name': 'Custom["BackstageGroup"]', 'updated_at':
37+
'2021-08-17T13:28:57.801578Z'}.
3738
"""
3839

3940
catalog_type: "CatalogTypeV2ResponseBody"

incident_io_client/models/catalog_v2_list_entries_response_body.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ class CatalogV2ListEntriesResponseBody:
3838
'Represents Kubernetes clusters that we run inside of GKE.', 'dynamic_resource_parameter': 'abc123',
3939
'estimated_count': 7, 'icon': 'bolt', 'id': '01FCNDV6P870EA6S7TK1DSYDG0', 'is_editable': False,
4040
'last_synced_at': '2021-08-17T13:28:57.801578Z', 'name': 'Kubernetes Cluster', 'ranked': True, 'registry_type':
41-
'PagerDutyService', 'required_integrations': ['pager_duty'], 'schema': {'attributes': [{'array': False, 'id':
42-
'01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1},
43-
'semantic_type': 'custom', 'source_repo_url': 'https://github.com/my-company/incident-io-catalog', 'type_name':
44-
'Custom["BackstageGroup"]', 'updated_at': '2021-08-17T13:28:57.801578Z'}, 'pagination_meta': {'after':
45-
'01FCNDV6P870EA6S7TK1DSYDG0', 'page_size': 25}}
41+
'PagerDutyService', 'required_integrations': ['pager_duty'], 'schema': {'attributes': [{'array': False,
42+
'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
43+
'Custom["Service"]'}], 'version': 1}, 'semantic_type': 'custom', 'source_repo_url': 'https://github.com/my-
44+
company/incident-io-catalog', 'type_name': 'Custom["BackstageGroup"]', 'updated_at':
45+
'2021-08-17T13:28:57.801578Z'}, 'pagination_meta': {'after': '01FCNDV6P870EA6S7TK1DSYDG0', 'page_size': 25}}
4646
4747
Attributes:
4848
catalog_entries (List['CatalogEntryV2ResponseBody']): Example: [{'aliases': ['[email protected]',
@@ -67,10 +67,11 @@ class CatalogV2ListEntriesResponseBody:
6767
clusters that we run inside of GKE.', 'dynamic_resource_parameter': 'abc123', 'estimated_count': 7, 'icon':
6868
'bolt', 'id': '01FCNDV6P870EA6S7TK1DSYDG0', 'is_editable': False, 'last_synced_at':
6969
'2021-08-17T13:28:57.801578Z', 'name': 'Kubernetes Cluster', 'ranked': True, 'registry_type':
70-
'PagerDutyService', 'required_integrations': ['pager_duty'], 'schema': {'attributes': [{'array': False, 'id':
71-
'01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type': 'Custom["Service"]'}], 'version': 1},
72-
'semantic_type': 'custom', 'source_repo_url': 'https://github.com/my-company/incident-io-catalog', 'type_name':
73-
'Custom["BackstageGroup"]', 'updated_at': '2021-08-17T13:28:57.801578Z'}.
70+
'PagerDutyService', 'required_integrations': ['pager_duty'], 'schema': {'attributes': [{'array': False,
71+
'backlink_attribute': 'abc123', 'id': '01GW2G3V0S59R238FAHPDS1R66', 'mode': 'manual', 'name': 'tier', 'type':
72+
'Custom["Service"]'}], 'version': 1}, 'semantic_type': 'custom', 'source_repo_url': 'https://github.com/my-
73+
company/incident-io-catalog', 'type_name': 'Custom["BackstageGroup"]', 'updated_at':
74+
'2021-08-17T13:28:57.801578Z'}.
7475
pagination_meta (PaginationMetaResultResponseBody): Example: {'after': '01FCNDV6P870EA6S7TK1DSYDG0',
7576
'page_size': 25}.
7677
"""

0 commit comments

Comments
 (0)