adcp 2.18.0__py3-none-any.whl → 3.0.0__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.
- adcp/ADCP_VERSION +1 -1
- adcp/__init__.py +6 -14
- adcp/__main__.py +94 -51
- adcp/adagents.py +91 -19
- adcp/client.py +865 -0
- adcp/protocols/a2a.py +84 -0
- adcp/protocols/base.py +101 -0
- adcp/protocols/mcp.py +87 -1
- adcp/server/__init__.py +49 -0
- adcp/server/base.py +368 -0
- adcp/server/content_standards.py +561 -0
- adcp/server/governance.py +491 -0
- adcp/server/mcp_tools.py +471 -0
- adcp/server/proposal.py +334 -0
- adcp/server/sponsored_intelligence.py +444 -0
- adcp/types/__init__.py +111 -23
- adcp/types/_ergonomic.py +35 -18
- adcp/types/_generated.py +419 -44
- adcp/types/aliases.py +13 -20
- adcp/types/base.py +1 -1
- adcp/types/generated_poc/adagents.py +103 -6
- adcp/types/generated_poc/content_standards/__init__.py +3 -0
- adcp/types/generated_poc/content_standards/artifact.py +208 -0
- adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
- adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
- adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
- adcp/types/generated_poc/content_standards/content_standards.py +66 -0
- adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
- adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
- adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
- adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
- adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
- adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
- adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
- adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
- adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
- adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
- adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
- adcp/types/generated_poc/core/activation_key.py +1 -1
- adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
- adcp/types/generated_poc/core/assets/css_asset.py +1 -1
- adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
- adcp/types/generated_poc/core/assets/html_asset.py +1 -1
- adcp/types/generated_poc/core/assets/image_asset.py +1 -1
- adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
- adcp/types/generated_poc/core/assets/text_asset.py +1 -1
- adcp/types/generated_poc/core/assets/url_asset.py +1 -1
- adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
- adcp/types/generated_poc/core/assets/video_asset.py +1 -1
- adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
- adcp/types/generated_poc/core/async_response_data.py +1 -1
- adcp/types/generated_poc/core/brand_manifest.py +68 -5
- adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
- adcp/types/generated_poc/core/context.py +1 -1
- adcp/types/generated_poc/core/creative_asset.py +8 -7
- adcp/types/generated_poc/core/creative_assignment.py +1 -1
- adcp/types/generated_poc/core/creative_filters.py +4 -14
- adcp/types/generated_poc/core/creative_manifest.py +1 -1
- adcp/types/generated_poc/core/creative_policy.py +1 -1
- adcp/types/generated_poc/core/delivery_metrics.py +1 -1
- adcp/types/generated_poc/core/deployment.py +1 -1
- adcp/types/generated_poc/core/destination.py +1 -1
- adcp/types/generated_poc/core/error.py +1 -1
- adcp/types/generated_poc/core/ext.py +1 -1
- adcp/types/generated_poc/core/format.py +6 -5
- adcp/types/generated_poc/core/format_id.py +1 -1
- adcp/types/generated_poc/core/frequency_cap.py +1 -1
- adcp/types/generated_poc/core/identifier.py +27 -0
- adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
- adcp/types/generated_poc/core/measurement.py +1 -1
- adcp/types/generated_poc/core/media_buy.py +1 -1
- adcp/types/generated_poc/core/media_buy_features.py +29 -0
- adcp/types/generated_poc/core/offering.py +80 -0
- adcp/types/generated_poc/core/package.py +1 -1
- adcp/types/generated_poc/core/performance_feedback.py +1 -1
- adcp/types/generated_poc/core/placement.py +1 -1
- adcp/types/generated_poc/core/pricing_option.py +8 -14
- adcp/types/generated_poc/core/product.py +1 -1
- adcp/types/generated_poc/core/product_allocation.py +48 -0
- adcp/types/generated_poc/core/product_filters.py +72 -7
- adcp/types/generated_poc/core/promoted_offerings.py +12 -21
- adcp/types/generated_poc/core/promoted_products.py +1 -1
- adcp/types/generated_poc/core/property.py +1 -1
- adcp/types/generated_poc/core/property_id.py +1 -1
- adcp/types/generated_poc/core/property_list_ref.py +26 -0
- adcp/types/generated_poc/core/property_tag.py +1 -1
- adcp/types/generated_poc/core/proposal.py +64 -0
- adcp/types/generated_poc/core/protocol_envelope.py +1 -1
- adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
- adcp/types/generated_poc/core/push_notification_config.py +1 -1
- adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
- adcp/types/generated_poc/core/reporting_webhook.py +70 -0
- adcp/types/generated_poc/core/response.py +1 -1
- adcp/types/generated_poc/core/signal_filters.py +1 -1
- adcp/types/generated_poc/core/start_timing.py +4 -4
- adcp/types/generated_poc/core/sub_asset.py +1 -1
- adcp/types/generated_poc/core/targeting.py +55 -14
- adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
- adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
- adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
- adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
- adcp/types/generated_poc/creative/preview_render.py +1 -1
- adcp/types/generated_poc/enums/adcp_domain.py +3 -1
- adcp/types/generated_poc/enums/asset_content_type.py +1 -1
- adcp/types/generated_poc/enums/auth_scheme.py +1 -1
- adcp/types/generated_poc/enums/available_metric.py +1 -1
- adcp/types/generated_poc/enums/channels.py +18 -8
- adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
- adcp/types/generated_poc/enums/creative_action.py +1 -1
- adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
- adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
- adcp/types/generated_poc/enums/creative_status.py +2 -1
- adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
- adcp/types/generated_poc/enums/daast_version.py +1 -1
- adcp/types/generated_poc/enums/delivery_type.py +1 -1
- adcp/types/generated_poc/enums/dimension_unit.py +1 -1
- adcp/types/generated_poc/enums/feed_format.py +1 -1
- adcp/types/generated_poc/enums/feedback_source.py +1 -1
- adcp/types/generated_poc/enums/format_category.py +1 -1
- adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
- adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
- adcp/types/generated_poc/enums/geo_level.py +14 -0
- adcp/types/generated_poc/enums/history_entry_type.py +1 -1
- adcp/types/generated_poc/enums/http_method.py +1 -1
- adcp/types/generated_poc/enums/identifier_types.py +1 -1
- adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
- adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
- adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
- adcp/types/generated_poc/enums/media_buy_status.py +1 -1
- adcp/types/generated_poc/enums/metric_type.py +1 -1
- adcp/types/generated_poc/enums/metro_system.py +15 -0
- adcp/types/generated_poc/enums/notification_type.py +1 -1
- adcp/types/generated_poc/enums/pacing.py +1 -1
- adcp/types/generated_poc/enums/postal_system.py +19 -0
- adcp/types/generated_poc/enums/preview_output_format.py +1 -1
- adcp/types/generated_poc/enums/pricing_model.py +1 -1
- adcp/types/generated_poc/enums/property_type.py +2 -1
- adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
- adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
- adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
- adcp/types/generated_poc/enums/sort_direction.py +1 -1
- adcp/types/generated_poc/enums/task_status.py +1 -1
- adcp/types/generated_poc/enums/task_type.py +7 -1
- adcp/types/generated_poc/enums/update_frequency.py +1 -1
- adcp/types/generated_poc/enums/url_asset_type.py +1 -1
- adcp/types/generated_poc/enums/validation_mode.py +1 -1
- adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
- adcp/types/generated_poc/enums/vast_version.py +1 -1
- adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
- adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
- adcp/types/generated_poc/extensions/__init__.py +3 -0
- adcp/types/generated_poc/extensions/extension_meta.py +58 -0
- adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
- adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
- adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
- adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
- adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
- adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
- adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
- adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
- adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
- adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
- adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
- adcp/types/generated_poc/media_buy/package_request.py +15 -6
- adcp/types/generated_poc/media_buy/package_update.py +119 -0
- adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
- adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
- adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +1 -1
- adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
- adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
- adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
- adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
- adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
- adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
- adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
- adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
- adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
- adcp/types/generated_poc/property/__init__.py +3 -0
- adcp/types/generated_poc/property/base_property_source.py +86 -0
- adcp/types/generated_poc/property/create_property_list_request.py +43 -0
- adcp/types/generated_poc/property/create_property_list_response.py +27 -0
- adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
- adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
- adcp/types/generated_poc/property/feature_requirement.py +42 -0
- adcp/types/generated_poc/property/get_property_list_request.py +34 -0
- adcp/types/generated_poc/property/get_property_list_response.py +61 -0
- adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
- adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
- adcp/types/generated_poc/property/property_error.py +33 -0
- adcp/types/generated_poc/property/property_feature.py +22 -0
- adcp/types/generated_poc/property/property_feature_definition.py +80 -0
- adcp/types/generated_poc/property/property_list.py +62 -0
- adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
- adcp/types/generated_poc/property/property_list_filters.py +47 -0
- adcp/types/generated_poc/property/update_property_list_request.py +46 -0
- adcp/types/generated_poc/property/update_property_list_response.py +21 -0
- adcp/types/generated_poc/protocol/__init__.py +3 -0
- adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
- adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
- adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
- adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
- adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
- adcp/types/generated_poc/signals/get_signals_request.py +1 -1
- adcp/types/generated_poc/signals/get_signals_response.py +1 -1
- adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
- adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
- adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
- adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
- adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
- adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
- adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
- adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
- adcp/utils/format_assets.py +5 -5
- adcp/utils/preview_cache.py +2 -2
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
- adcp-3.0.0.dist-info/RECORD +264 -0
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
- adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
- adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
- adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
- adcp-2.18.0.dist-info/RECORD +0 -195
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
- {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: media_buy/package_request.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ from typing import Annotated
|
|
|
9
9
|
from adcp.types.base import AdCPBaseModel
|
|
10
10
|
from pydantic import ConfigDict, Field
|
|
11
11
|
|
|
12
|
-
from ..core import creative_asset
|
|
12
|
+
from ..core import creative_asset, creative_assignment
|
|
13
13
|
from ..core import ext as ext_1
|
|
14
14
|
from ..core import format_id, targeting
|
|
15
15
|
from ..enums import pacing as pacing_1
|
|
@@ -31,16 +31,16 @@ class PackageRequest(AdCPBaseModel):
|
|
|
31
31
|
Field(description="Budget allocation for this package in the media buy's currency", ge=0.0),
|
|
32
32
|
]
|
|
33
33
|
buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for this package")]
|
|
34
|
-
|
|
35
|
-
list[
|
|
34
|
+
creative_assignments: Annotated[
|
|
35
|
+
list[creative_assignment.CreativeAssignment] | None,
|
|
36
36
|
Field(
|
|
37
|
-
description='
|
|
37
|
+
description='Assign existing library creatives to this package with optional weights and placement targeting'
|
|
38
38
|
),
|
|
39
39
|
] = None
|
|
40
40
|
creatives: Annotated[
|
|
41
41
|
list[creative_asset.CreativeAsset] | None,
|
|
42
42
|
Field(
|
|
43
|
-
description='
|
|
43
|
+
description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
|
|
44
44
|
max_length=100,
|
|
45
45
|
),
|
|
46
46
|
] = None
|
|
@@ -52,7 +52,16 @@ class PackageRequest(AdCPBaseModel):
|
|
|
52
52
|
min_length=1,
|
|
53
53
|
),
|
|
54
54
|
] = None
|
|
55
|
+
impressions: Annotated[
|
|
56
|
+
float | None, Field(description='Impression goal for this package', ge=0.0)
|
|
57
|
+
] = None
|
|
55
58
|
pacing: pacing_1.Pacing | None = None
|
|
59
|
+
paused: Annotated[
|
|
60
|
+
bool | None,
|
|
61
|
+
Field(
|
|
62
|
+
description='Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false.'
|
|
63
|
+
),
|
|
64
|
+
] = False
|
|
56
65
|
pricing_option_id: Annotated[
|
|
57
66
|
str,
|
|
58
67
|
Field(
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: media_buy/package_update.json
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Annotated
|
|
8
|
+
|
|
9
|
+
from adcp.types.base import AdCPBaseModel
|
|
10
|
+
from pydantic import ConfigDict, Field, RootModel
|
|
11
|
+
|
|
12
|
+
from ..core import creative_asset, creative_assignment
|
|
13
|
+
from ..core import ext as ext_1
|
|
14
|
+
from ..core import targeting
|
|
15
|
+
from ..enums import pacing as pacing_1
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class PackageUpdate1(AdCPBaseModel):
|
|
19
|
+
model_config = ConfigDict(
|
|
20
|
+
extra='allow',
|
|
21
|
+
)
|
|
22
|
+
bid_price: Annotated[
|
|
23
|
+
float | None,
|
|
24
|
+
Field(
|
|
25
|
+
description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
|
|
26
|
+
ge=0.0,
|
|
27
|
+
),
|
|
28
|
+
] = None
|
|
29
|
+
budget: Annotated[
|
|
30
|
+
float | None,
|
|
31
|
+
Field(
|
|
32
|
+
description='Updated budget allocation for this package in the currency specified by the pricing option',
|
|
33
|
+
ge=0.0,
|
|
34
|
+
),
|
|
35
|
+
] = None
|
|
36
|
+
buyer_ref: Annotated[
|
|
37
|
+
str | None, Field(description="Buyer's reference for the package to update")
|
|
38
|
+
] = None
|
|
39
|
+
creative_assignments: Annotated[
|
|
40
|
+
list[creative_assignment.CreativeAssignment] | None,
|
|
41
|
+
Field(
|
|
42
|
+
description='Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.'
|
|
43
|
+
),
|
|
44
|
+
] = None
|
|
45
|
+
creatives: Annotated[
|
|
46
|
+
list[creative_asset.CreativeAsset] | None,
|
|
47
|
+
Field(
|
|
48
|
+
description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
|
|
49
|
+
max_length=100,
|
|
50
|
+
),
|
|
51
|
+
] = None
|
|
52
|
+
ext: ext_1.ExtensionObject | None = None
|
|
53
|
+
impressions: Annotated[
|
|
54
|
+
float | None, Field(description='Updated impression goal for this package', ge=0.0)
|
|
55
|
+
] = None
|
|
56
|
+
pacing: pacing_1.Pacing | None = None
|
|
57
|
+
package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
|
|
58
|
+
paused: Annotated[
|
|
59
|
+
bool | None,
|
|
60
|
+
Field(description='Pause/resume specific package (true = paused, false = active)'),
|
|
61
|
+
] = None
|
|
62
|
+
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class PackageUpdate2(AdCPBaseModel):
|
|
66
|
+
model_config = ConfigDict(
|
|
67
|
+
extra='allow',
|
|
68
|
+
)
|
|
69
|
+
bid_price: Annotated[
|
|
70
|
+
float | None,
|
|
71
|
+
Field(
|
|
72
|
+
description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
|
|
73
|
+
ge=0.0,
|
|
74
|
+
),
|
|
75
|
+
] = None
|
|
76
|
+
budget: Annotated[
|
|
77
|
+
float | None,
|
|
78
|
+
Field(
|
|
79
|
+
description='Updated budget allocation for this package in the currency specified by the pricing option',
|
|
80
|
+
ge=0.0,
|
|
81
|
+
),
|
|
82
|
+
] = None
|
|
83
|
+
buyer_ref: Annotated[str, Field(description="Buyer's reference for the package to update")]
|
|
84
|
+
creative_assignments: Annotated[
|
|
85
|
+
list[creative_assignment.CreativeAssignment] | None,
|
|
86
|
+
Field(
|
|
87
|
+
description='Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.'
|
|
88
|
+
),
|
|
89
|
+
] = None
|
|
90
|
+
creatives: Annotated[
|
|
91
|
+
list[creative_asset.CreativeAsset] | None,
|
|
92
|
+
Field(
|
|
93
|
+
description='Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.',
|
|
94
|
+
max_length=100,
|
|
95
|
+
),
|
|
96
|
+
] = None
|
|
97
|
+
ext: ext_1.ExtensionObject | None = None
|
|
98
|
+
impressions: Annotated[
|
|
99
|
+
float | None, Field(description='Updated impression goal for this package', ge=0.0)
|
|
100
|
+
] = None
|
|
101
|
+
pacing: pacing_1.Pacing | None = None
|
|
102
|
+
package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
|
|
103
|
+
None
|
|
104
|
+
)
|
|
105
|
+
paused: Annotated[
|
|
106
|
+
bool | None,
|
|
107
|
+
Field(description='Pause/resume specific package (true = paused, false = active)'),
|
|
108
|
+
] = None
|
|
109
|
+
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class PackageUpdate(RootModel[PackageUpdate1 | PackageUpdate2]):
|
|
113
|
+
root: Annotated[
|
|
114
|
+
PackageUpdate1 | PackageUpdate2,
|
|
115
|
+
Field(
|
|
116
|
+
description='Package update configuration for update_media_buy. Identifies package by package_id or buyer_ref and specifies fields to modify. Fields not present are left unchanged. Note: product_id, format_ids, and pricing_option_id cannot be changed after creation.',
|
|
117
|
+
title='Package Update',
|
|
118
|
+
),
|
|
119
|
+
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: media_buy/update_media_buy_request.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-25T21:17:54+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -10,105 +10,11 @@ from adcp.types.base import AdCPBaseModel
|
|
|
10
10
|
from pydantic import AwareDatetime, ConfigDict, Field, RootModel
|
|
11
11
|
|
|
12
12
|
from ..core import context as context_1
|
|
13
|
-
from ..core import creative_asset, creative_assignment
|
|
14
13
|
from ..core import ext as ext_1
|
|
15
14
|
from ..core import push_notification_config as push_notification_config_1
|
|
16
|
-
from ..core import
|
|
17
|
-
from ..
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class Packages(AdCPBaseModel):
|
|
21
|
-
model_config = ConfigDict(
|
|
22
|
-
extra='allow',
|
|
23
|
-
)
|
|
24
|
-
bid_price: Annotated[
|
|
25
|
-
float | None,
|
|
26
|
-
Field(
|
|
27
|
-
description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
|
|
28
|
-
ge=0.0,
|
|
29
|
-
),
|
|
30
|
-
] = None
|
|
31
|
-
budget: Annotated[
|
|
32
|
-
float | None,
|
|
33
|
-
Field(
|
|
34
|
-
description='Updated budget allocation for this package in the currency specified by the pricing option',
|
|
35
|
-
ge=0.0,
|
|
36
|
-
),
|
|
37
|
-
] = None
|
|
38
|
-
buyer_ref: Annotated[
|
|
39
|
-
str | None, Field(description="Buyer's reference for the package to update")
|
|
40
|
-
] = None
|
|
41
|
-
creative_assignments: Annotated[
|
|
42
|
-
list[creative_assignment.CreativeAssignment] | None,
|
|
43
|
-
Field(
|
|
44
|
-
description='Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids.'
|
|
45
|
-
),
|
|
46
|
-
] = None
|
|
47
|
-
creative_ids: Annotated[
|
|
48
|
-
list[str] | None,
|
|
49
|
-
Field(description='Update creative assignments (references existing library creatives)'),
|
|
50
|
-
] = None
|
|
51
|
-
creatives: Annotated[
|
|
52
|
-
list[creative_asset.CreativeAsset] | None,
|
|
53
|
-
Field(
|
|
54
|
-
description='Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.',
|
|
55
|
-
max_length=100,
|
|
56
|
-
),
|
|
57
|
-
] = None
|
|
58
|
-
pacing: pacing_1.Pacing | None = None
|
|
59
|
-
package_id: Annotated[str, Field(description="Publisher's ID of package to update")]
|
|
60
|
-
paused: Annotated[
|
|
61
|
-
bool | None,
|
|
62
|
-
Field(description='Pause/resume specific package (true = paused, false = active)'),
|
|
63
|
-
] = None
|
|
64
|
-
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
class Packages1(AdCPBaseModel):
|
|
68
|
-
model_config = ConfigDict(
|
|
69
|
-
extra='allow',
|
|
70
|
-
)
|
|
71
|
-
bid_price: Annotated[
|
|
72
|
-
float | None,
|
|
73
|
-
Field(
|
|
74
|
-
description='Updated bid price for auction-based pricing options (only applies when pricing_option is auction-based)',
|
|
75
|
-
ge=0.0,
|
|
76
|
-
),
|
|
77
|
-
] = None
|
|
78
|
-
budget: Annotated[
|
|
79
|
-
float | None,
|
|
80
|
-
Field(
|
|
81
|
-
description='Updated budget allocation for this package in the currency specified by the pricing option',
|
|
82
|
-
ge=0.0,
|
|
83
|
-
),
|
|
84
|
-
] = None
|
|
85
|
-
buyer_ref: Annotated[str, Field(description="Buyer's reference for the package to update")]
|
|
86
|
-
creative_assignments: Annotated[
|
|
87
|
-
list[creative_assignment.CreativeAssignment] | None,
|
|
88
|
-
Field(
|
|
89
|
-
description='Full creative assignment objects with weights and placement targeting (alternative to creative_ids - provides granular control over weights and placement targeting). Uses replacement semantics like creative_ids.'
|
|
90
|
-
),
|
|
91
|
-
] = None
|
|
92
|
-
creative_ids: Annotated[
|
|
93
|
-
list[str] | None,
|
|
94
|
-
Field(description='Update creative assignments (references existing library creatives)'),
|
|
95
|
-
] = None
|
|
96
|
-
creatives: Annotated[
|
|
97
|
-
list[creative_asset.CreativeAsset] | None,
|
|
98
|
-
Field(
|
|
99
|
-
description='Full creative objects to upload and assign to this package (alternative to creative_ids - creatives will be added to library). Supports both static and generative creatives.',
|
|
100
|
-
max_length=100,
|
|
101
|
-
),
|
|
102
|
-
] = None
|
|
103
|
-
pacing: pacing_1.Pacing | None = None
|
|
104
|
-
package_id: Annotated[str | None, Field(description="Publisher's ID of package to update")] = (
|
|
105
|
-
None
|
|
106
|
-
)
|
|
107
|
-
paused: Annotated[
|
|
108
|
-
bool | None,
|
|
109
|
-
Field(description='Pause/resume specific package (true = paused, false = active)'),
|
|
110
|
-
] = None
|
|
111
|
-
targeting_overlay: targeting.TargetingOverlay | None = None
|
|
15
|
+
from ..core import reporting_webhook as reporting_webhook_1
|
|
16
|
+
from ..core import start_timing
|
|
17
|
+
from . import package_update
|
|
112
18
|
|
|
113
19
|
|
|
114
20
|
class UpdateMediaBuyRequest1(AdCPBaseModel):
|
|
@@ -125,7 +31,7 @@ class UpdateMediaBuyRequest1(AdCPBaseModel):
|
|
|
125
31
|
ext: ext_1.ExtensionObject | None = None
|
|
126
32
|
media_buy_id: Annotated[str, Field(description="Publisher's ID of the media buy to update")]
|
|
127
33
|
packages: Annotated[
|
|
128
|
-
list[
|
|
34
|
+
list[package_update.PackageUpdate] | None, Field(description='Package-specific updates')
|
|
129
35
|
] = None
|
|
130
36
|
paused: Annotated[
|
|
131
37
|
bool | None,
|
|
@@ -134,18 +40,18 @@ class UpdateMediaBuyRequest1(AdCPBaseModel):
|
|
|
134
40
|
push_notification_config: Annotated[
|
|
135
41
|
push_notification_config_1.PushNotificationConfig | None,
|
|
136
42
|
Field(
|
|
137
|
-
description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.'
|
|
43
|
+
description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time. This is separate from reporting_webhook which configures ongoing campaign reporting.'
|
|
44
|
+
),
|
|
45
|
+
] = None
|
|
46
|
+
reporting_webhook: Annotated[
|
|
47
|
+
reporting_webhook_1.ReportingWebhook | None,
|
|
48
|
+
Field(
|
|
49
|
+
description='Optional webhook configuration for automated reporting delivery. Updates the reporting configuration for this media buy.'
|
|
138
50
|
),
|
|
139
51
|
] = None
|
|
140
52
|
start_time: start_timing.StartTiming | None = None
|
|
141
53
|
|
|
142
54
|
|
|
143
|
-
Packages2 = Packages
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
Packages3 = Packages1
|
|
147
|
-
|
|
148
|
-
|
|
149
55
|
class UpdateMediaBuyRequest2(AdCPBaseModel):
|
|
150
56
|
model_config = ConfigDict(
|
|
151
57
|
extra='allow',
|
|
@@ -160,7 +66,7 @@ class UpdateMediaBuyRequest2(AdCPBaseModel):
|
|
|
160
66
|
str | None, Field(description="Publisher's ID of the media buy to update")
|
|
161
67
|
] = None
|
|
162
68
|
packages: Annotated[
|
|
163
|
-
list[
|
|
69
|
+
list[package_update.PackageUpdate] | None, Field(description='Package-specific updates')
|
|
164
70
|
] = None
|
|
165
71
|
paused: Annotated[
|
|
166
72
|
bool | None,
|
|
@@ -169,7 +75,13 @@ class UpdateMediaBuyRequest2(AdCPBaseModel):
|
|
|
169
75
|
push_notification_config: Annotated[
|
|
170
76
|
push_notification_config_1.PushNotificationConfig | None,
|
|
171
77
|
Field(
|
|
172
|
-
description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time.'
|
|
78
|
+
description='Optional webhook configuration for async update notifications. Publisher will send webhook when update completes if operation takes longer than immediate response time. This is separate from reporting_webhook which configures ongoing campaign reporting.'
|
|
79
|
+
),
|
|
80
|
+
] = None
|
|
81
|
+
reporting_webhook: Annotated[
|
|
82
|
+
reporting_webhook_1.ReportingWebhook | None,
|
|
83
|
+
Field(
|
|
84
|
+
description='Optional webhook configuration for automated reporting delivery. Updates the reporting configuration for this media buy.'
|
|
173
85
|
),
|
|
174
86
|
] = None
|
|
175
87
|
start_time: start_timing.StartTiming | None = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: pricing_options/cpc_option.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -10,6 +10,19 @@ from adcp.types.base import AdCPBaseModel
|
|
|
10
10
|
from pydantic import ConfigDict, Field
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
class PriceGuidance(AdCPBaseModel):
|
|
14
|
+
p25: Annotated[
|
|
15
|
+
float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
|
|
16
|
+
] = None
|
|
17
|
+
p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
|
|
18
|
+
p75: Annotated[
|
|
19
|
+
float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
|
|
20
|
+
] = None
|
|
21
|
+
p90: Annotated[
|
|
22
|
+
float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
|
|
23
|
+
] = None
|
|
24
|
+
|
|
25
|
+
|
|
13
26
|
class CpcPricingOption(AdCPBaseModel):
|
|
14
27
|
model_config = ConfigDict(
|
|
15
28
|
extra='allow',
|
|
@@ -22,10 +35,20 @@ class CpcPricingOption(AdCPBaseModel):
|
|
|
22
35
|
pattern='^[A-Z]{3}$',
|
|
23
36
|
),
|
|
24
37
|
]
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Field(
|
|
28
|
-
|
|
38
|
+
fixed_price: Annotated[
|
|
39
|
+
float | None,
|
|
40
|
+
Field(
|
|
41
|
+
description='Fixed price per click. If present, this is fixed pricing. If absent, auction-based.',
|
|
42
|
+
ge=0.0,
|
|
43
|
+
),
|
|
44
|
+
] = None
|
|
45
|
+
floor_price: Annotated[
|
|
46
|
+
float | None,
|
|
47
|
+
Field(
|
|
48
|
+
description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
|
|
49
|
+
ge=0.0,
|
|
50
|
+
),
|
|
51
|
+
] = None
|
|
29
52
|
min_spend_per_package: Annotated[
|
|
30
53
|
float | None,
|
|
31
54
|
Field(
|
|
@@ -33,11 +56,13 @@ class CpcPricingOption(AdCPBaseModel):
|
|
|
33
56
|
ge=0.0,
|
|
34
57
|
),
|
|
35
58
|
] = None
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
str,
|
|
59
|
+
price_guidance: Annotated[
|
|
60
|
+
PriceGuidance | None,
|
|
39
61
|
Field(
|
|
40
|
-
description=
|
|
62
|
+
description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
|
|
41
63
|
),
|
|
64
|
+
] = None
|
|
65
|
+
pricing_model: Annotated[Literal['cpc'], Field(description='Cost per click')]
|
|
66
|
+
pricing_option_id: Annotated[
|
|
67
|
+
str, Field(description='Unique identifier for this pricing option within the product')
|
|
42
68
|
]
|
|
43
|
-
rate: Annotated[float, Field(description='Fixed CPC rate (cost per click)', ge=0.0)]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: pricing_options/cpcv_option.json
|
|
3
|
-
# timestamp: 2026-01-
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -10,6 +10,19 @@ from adcp.types.base import AdCPBaseModel
|
|
|
10
10
|
from pydantic import ConfigDict, Field
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
class PriceGuidance(AdCPBaseModel):
|
|
14
|
+
p25: Annotated[
|
|
15
|
+
float | None, Field(description='25th percentile of recent winning bids', ge=0.0)
|
|
16
|
+
] = None
|
|
17
|
+
p50: Annotated[float | None, Field(description='Median of recent winning bids', ge=0.0)] = None
|
|
18
|
+
p75: Annotated[
|
|
19
|
+
float | None, Field(description='75th percentile of recent winning bids', ge=0.0)
|
|
20
|
+
] = None
|
|
21
|
+
p90: Annotated[
|
|
22
|
+
float | None, Field(description='90th percentile of recent winning bids', ge=0.0)
|
|
23
|
+
] = None
|
|
24
|
+
|
|
25
|
+
|
|
13
26
|
class CpcvPricingOption(AdCPBaseModel):
|
|
14
27
|
model_config = ConfigDict(
|
|
15
28
|
extra='allow',
|
|
@@ -22,10 +35,20 @@ class CpcvPricingOption(AdCPBaseModel):
|
|
|
22
35
|
pattern='^[A-Z]{3}$',
|
|
23
36
|
),
|
|
24
37
|
]
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Field(
|
|
28
|
-
|
|
38
|
+
fixed_price: Annotated[
|
|
39
|
+
float | None,
|
|
40
|
+
Field(
|
|
41
|
+
description='Fixed price per completed view. If present, this is fixed pricing. If absent, auction-based.',
|
|
42
|
+
ge=0.0,
|
|
43
|
+
),
|
|
44
|
+
] = None
|
|
45
|
+
floor_price: Annotated[
|
|
46
|
+
float | None,
|
|
47
|
+
Field(
|
|
48
|
+
description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
|
|
49
|
+
ge=0.0,
|
|
50
|
+
),
|
|
51
|
+
] = None
|
|
29
52
|
min_spend_per_package: Annotated[
|
|
30
53
|
float | None,
|
|
31
54
|
Field(
|
|
@@ -33,13 +56,15 @@ class CpcvPricingOption(AdCPBaseModel):
|
|
|
33
56
|
ge=0.0,
|
|
34
57
|
),
|
|
35
58
|
] = None
|
|
59
|
+
price_guidance: Annotated[
|
|
60
|
+
PriceGuidance | None,
|
|
61
|
+
Field(
|
|
62
|
+
description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
|
|
63
|
+
),
|
|
64
|
+
] = None
|
|
36
65
|
pricing_model: Annotated[
|
|
37
66
|
Literal['cpcv'], Field(description='Cost per completed view (100% completion)')
|
|
38
67
|
]
|
|
39
68
|
pricing_option_id: Annotated[
|
|
40
|
-
str,
|
|
41
|
-
Field(
|
|
42
|
-
description="Unique identifier for this pricing option within the product (e.g., 'cpcv_usd_guaranteed')"
|
|
43
|
-
),
|
|
69
|
+
str, Field(description='Unique identifier for this pricing option within the product')
|
|
44
70
|
]
|
|
45
|
-
rate: Annotated[float, Field(description='Fixed CPCV rate (cost per 100% completion)', ge=0.0)]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
|
-
# filename: pricing_options/
|
|
3
|
-
# timestamp: 2026-01-
|
|
2
|
+
# filename: pricing_options/cpm_option.json
|
|
3
|
+
# timestamp: 2026-01-26T11:40:01+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -11,19 +11,13 @@ from pydantic import ConfigDict, Field
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class PriceGuidance(AdCPBaseModel):
|
|
14
|
-
floor: Annotated[
|
|
15
|
-
float,
|
|
16
|
-
Field(
|
|
17
|
-
description='Minimum bid price - publisher will reject bids under this value', ge=0.0
|
|
18
|
-
),
|
|
19
|
-
]
|
|
20
14
|
p25: Annotated[float | None, Field(description='25th percentile winning price', ge=0.0)] = None
|
|
21
15
|
p50: Annotated[float | None, Field(description='Median winning price', ge=0.0)] = None
|
|
22
16
|
p75: Annotated[float | None, Field(description='75th percentile winning price', ge=0.0)] = None
|
|
23
17
|
p90: Annotated[float | None, Field(description='90th percentile winning price', ge=0.0)] = None
|
|
24
18
|
|
|
25
19
|
|
|
26
|
-
class
|
|
20
|
+
class CpmPricingOption(AdCPBaseModel):
|
|
27
21
|
model_config = ConfigDict(
|
|
28
22
|
extra='allow',
|
|
29
23
|
)
|
|
@@ -35,10 +29,20 @@ class CpmAuctionPricingOption(AdCPBaseModel):
|
|
|
35
29
|
pattern='^[A-Z]{3}$',
|
|
36
30
|
),
|
|
37
31
|
]
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
Field(
|
|
41
|
-
|
|
32
|
+
fixed_price: Annotated[
|
|
33
|
+
float | None,
|
|
34
|
+
Field(
|
|
35
|
+
description='Fixed price per unit. If present, this is fixed pricing. If absent, auction-based.',
|
|
36
|
+
ge=0.0,
|
|
37
|
+
),
|
|
38
|
+
] = None
|
|
39
|
+
floor_price: Annotated[
|
|
40
|
+
float | None,
|
|
41
|
+
Field(
|
|
42
|
+
description='Minimum acceptable bid for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.',
|
|
43
|
+
ge=0.0,
|
|
44
|
+
),
|
|
45
|
+
] = None
|
|
42
46
|
min_spend_per_package: Annotated[
|
|
43
47
|
float | None,
|
|
44
48
|
Field(
|
|
@@ -47,12 +51,12 @@ class CpmAuctionPricingOption(AdCPBaseModel):
|
|
|
47
51
|
),
|
|
48
52
|
] = None
|
|
49
53
|
price_guidance: Annotated[
|
|
50
|
-
PriceGuidance
|
|
51
|
-
]
|
|
52
|
-
pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
|
|
53
|
-
pricing_option_id: Annotated[
|
|
54
|
-
str,
|
|
54
|
+
PriceGuidance | None,
|
|
55
55
|
Field(
|
|
56
|
-
description=
|
|
56
|
+
description='Optional pricing guidance for auction-based bidding. Helps buyers calibrate bids with historical percentiles.'
|
|
57
57
|
),
|
|
58
|
+
] = None
|
|
59
|
+
pricing_model: Annotated[Literal['cpm'], Field(description='Cost per 1,000 impressions')]
|
|
60
|
+
pricing_option_id: Annotated[
|
|
61
|
+
str, Field(description='Unique identifier for this pricing option within the product')
|
|
58
62
|
]
|