From d18eef2ba343e164bd34309ceeb989f55d3debd3 Mon Sep 17 00:00:00 2001 From: "ct-sdks[bot]" <153784748+ct-sdks[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 07:35:49 +0000 Subject: [PATCH] build(codegen): updating SDK --- .changeset/changes_api.md | 36 ++ changes.md | 31 +- .../src/generated/models/event.ts | 470 +++++++++++++++--- .../src/generated/models/subscription.ts | 28 +- reference.txt | 1 + references.txt | 1 + 6 files changed, 500 insertions(+), 67 deletions(-) create mode 100644 .changeset/changes_api.md create mode 100644 reference.txt diff --git a/.changeset/changes_api.md b/.changeset/changes_api.md new file mode 100644 index 000000000..92f93e938 --- /dev/null +++ b/.changeset/changes_api.md @@ -0,0 +1,36 @@ +--- +'@commercetools/platform-sdk': minor +--- + +**Api changes** + +
+Added Type(s) + +- added type `CheckoutOrderCreationFailedEvent` +- added type `CheckoutPaymentAuthorizationCancelledEvent` +- added type `CheckoutPaymentAuthorizationFailedEvent` +- added type `CheckoutPaymentAuthorizedEvent` +- added type `CheckoutPaymentCancelAuthorizationFailedEvent` +- added type `CheckoutPaymentChargeFailedEvent` +- added type `CheckoutPaymentChargedEvent` +- added type `CheckoutPaymentRefundFailedEvent` +- added type `CheckoutPaymentRefundedEvent` +- added type `CheckoutMessageOrderPayloadBaseData` +- added type `CheckoutMessagePaymentsPayloadBaseData` +
+ +
+Added Enum(s) + +- added enum `checkout` to type `EventSubscriptionResourceTypeId` +- added enum `CheckoutOrderCreationFailed` to type `EventType` +- added enum `CheckoutPaymentAuthorizationCancelled` to type `EventType` +- added enum `CheckoutPaymentAuthorizationFailed` to type `EventType` +- added enum `CheckoutPaymentAuthorized` to type `EventType` +- added enum `CheckoutPaymentCancelAuthorizationFailed` to type `EventType` +- added enum `CheckoutPaymentCharged` to type `EventType` +- added enum `CheckoutPaymentChargeFailed` to type `EventType` +- added enum `CheckoutPaymentRefunded` to type `EventType` +- added enum `CheckoutPaymentRefundFailed` to type `EventType` +
diff --git a/changes.md b/changes.md index 85ea835e2..c13e8a943 100644 --- a/changes.md +++ b/changes.md @@ -1,15 +1,32 @@ -**Import changes** +**Api changes**
-Added Property(s) +Added Type(s) -- added property `/^[a-zA-Z]{2,3}(?:-[a-zA-Z]{4})?(?:-(?:[a-zA-Z]{2}|\d{3}))?$/` to type `SearchKeywords` -- added property `/^[a-zA-Z]{2,3}(?:-[a-zA-Z]{4})?(?:-(?:[a-zA-Z]{2}|\d{3}))?$/` to type `LocalizedString` +- added type `CheckoutOrderCreationFailedEvent` +- added type `CheckoutPaymentAuthorizationCancelledEvent` +- added type `CheckoutPaymentAuthorizationFailedEvent` +- added type `CheckoutPaymentAuthorizedEvent` +- added type `CheckoutPaymentCancelAuthorizationFailedEvent` +- added type `CheckoutPaymentChargeFailedEvent` +- added type `CheckoutPaymentChargedEvent` +- added type `CheckoutPaymentRefundFailedEvent` +- added type `CheckoutPaymentRefundedEvent` +- added type `CheckoutMessageOrderPayloadBaseData` +- added type `CheckoutMessagePaymentsPayloadBaseData`
-Removed Property(s) +Added Enum(s) -- :warning: removed property `/^[a-z]{2}(-[A-Z]{2})?$/` from type `SearchKeywords` -- :warning: removed property `/^[a-z]{2}(-[A-Z]{2})?$/` from type `LocalizedString` +- added enum `checkout` to type `EventSubscriptionResourceTypeId` +- added enum `CheckoutOrderCreationFailed` to type `EventType` +- added enum `CheckoutPaymentAuthorizationCancelled` to type `EventType` +- added enum `CheckoutPaymentAuthorizationFailed` to type `EventType` +- added enum `CheckoutPaymentAuthorized` to type `EventType` +- added enum `CheckoutPaymentCancelAuthorizationFailed` to type `EventType` +- added enum `CheckoutPaymentCharged` to type `EventType` +- added enum `CheckoutPaymentChargeFailed` to type `EventType` +- added enum `CheckoutPaymentRefunded` to type `EventType` +- added enum `CheckoutPaymentRefundFailed` to type `EventType`
diff --git a/packages/platform-sdk/src/generated/models/event.ts b/packages/platform-sdk/src/generated/models/event.ts index af7579efc..0842d10ee 100644 --- a/packages/platform-sdk/src/generated/models/event.ts +++ b/packages/platform-sdk/src/generated/models/event.ts @@ -4,6 +4,10 @@ * For more information about the commercetools platform APIs, visit https://docs.commercetools.com/. */ +import { CartReference } from './cart' +import { ErrorObject } from './error' +import { OrderReference } from './order' +import { PaymentReference } from './payment' import { EventSubscriptionResourceTypeId, EventType } from './subscription' /** @@ -49,6 +53,15 @@ export interface BaseEvent { * */ export type Event = + | CheckoutOrderCreationFailedEvent + | CheckoutPaymentAuthorizationCancelledEvent + | CheckoutPaymentAuthorizationFailedEvent + | CheckoutPaymentAuthorizedEvent + | CheckoutPaymentCancelAuthorizationFailedEvent + | CheckoutPaymentChargeFailedEvent + | CheckoutPaymentChargedEvent + | CheckoutPaymentRefundFailedEvent + | CheckoutPaymentRefundedEvent | ImportContainerCreatedEvent | ImportContainerDeletedEvent | ImportOperationRejectedEvent @@ -84,10 +97,11 @@ export interface IEvent { readonly createdAt: string } /** - * Generated when an [Import Container](ctp:import:type:ImportContainer) is created. + * Generated when an order creation attempt fails in Checkout. This event includes information about why the order could not be created. + * */ -export interface ImportContainerCreatedEvent extends IEvent { - readonly type: 'ImportContainerCreated' +export interface CheckoutOrderCreationFailedEvent extends IEvent { + readonly type: 'CheckoutOrderCreationFailed' /** * Unique identifier of the Event. * @@ -107,46 +121,80 @@ export interface ImportContainerCreatedEvent extends IEvent { */ readonly createdAt: string /** - * An object containing details of the created Import Container. + * An object containing details of the order which could not be created. * * */ - readonly data: ImportContainerCreatedEventData + readonly data: CheckoutMessageOrderPayloadBaseData } /** - * The `data` of the [Import Container Created Event](ctp:api:type:ImportContainerCreatedEvent). + * Generated when a payment authorization is successfully cancelled in Checkout. This event indicates that the payment is cancelled before it is charged. + * */ -export interface ImportContainerCreatedEventData { +export interface CheckoutPaymentAuthorizationCancelledEvent extends IEvent { + readonly type: 'CheckoutPaymentAuthorizationCancelled' /** - * The `key` of the created Import Container. + * Unique identifier of the Event. * + */ + readonly id: string + /** * */ - readonly key: string + readonly notificationType: string /** - * The `version` of the created Import Container. * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. * */ - readonly version: number + readonly createdAt: string /** - * Date and time (UTC) the Import Container was created. + * An object containing details of the payment authorization that was cancelled. * * */ + readonly data: CheckoutMessagePaymentsPayloadBaseData +} +/** + * Generated when an attempt to authorize a payment fails in Checkout. This failure could result from insufficient funds, incorrect payment details, expired cards, or risk related rejections. + * + */ +export interface CheckoutPaymentAuthorizationFailedEvent extends IEvent { + readonly type: 'CheckoutPaymentAuthorizationFailed' + /** + * Unique identifier of the Event. + * + */ + readonly id: string + /** + * + */ + readonly notificationType: string + /** + * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. + * + */ readonly createdAt: string /** - * Date and time (UTC) the Import Container was last updated. + * An object containing details of the payment authorization that failed. * * */ - readonly lastModifiedAt: string + readonly data: CheckoutMessagePaymentsPayloadBaseData } /** - * Generated when an [Import Container](ctp:import:type:ImportContainer) is deleted. + * Generated when a payment is successfully authorized in Checkout. This event indicates the payment has been validated and the amount has been reserved but not yet charged. + * */ -export interface ImportContainerDeletedEvent extends IEvent { - readonly type: 'ImportContainerDeleted' +export interface CheckoutPaymentAuthorizedEvent extends IEvent { + readonly type: 'CheckoutPaymentAuthorized' /** * Unique identifier of the Event. * @@ -166,34 +214,49 @@ export interface ImportContainerDeletedEvent extends IEvent { */ readonly createdAt: string /** - * An object containing details of the deleted Import Container. + * An object containing details of the successful payment authorization. * * */ - readonly data: ImportContainerDeletedEventData + readonly data: CheckoutMessagePaymentsPayloadBaseData } /** - * The `data` of the [Import Container Deleted Event](ctp:api:type:ImportContainerDeletedEvent). + * Generated when an attempt to cancel a payment authorization fails in Checkout. This could happen if the authorization has already been expired, been captured already or no longer valid. + * */ -export interface ImportContainerDeletedEventData { +export interface CheckoutPaymentCancelAuthorizationFailedEvent extends IEvent { + readonly type: 'CheckoutPaymentCancelAuthorizationFailed' /** - * The `key` of the deleted Import Container. + * Unique identifier of the Event. * + */ + readonly id: string + /** * */ - readonly key: string + readonly notificationType: string /** - * The `version` of the deleted Import Container. + * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. + * + */ + readonly createdAt: string + /** + * An object containing details of the payment authorization that could not be cancelled. * * */ - readonly version: number + readonly data: CheckoutMessagePaymentsPayloadBaseData } /** - * Generated when an [Import Operation](ctp:import:type:ImportOperation) has the `rejected` [ProcessingState](ctp:import:type:ProcessingState). + * Generated when an attempt to charge a payment fails in Checkout. Even if a payment was previously authorized, charging it may still fail. + * */ -export interface ImportOperationRejectedEvent extends IEvent { - readonly type: 'ImportOperationRejected' +export interface CheckoutPaymentChargeFailedEvent extends IEvent { + readonly type: 'CheckoutPaymentChargeFailed' /** * Unique identifier of the Event. * @@ -213,28 +276,80 @@ export interface ImportOperationRejectedEvent extends IEvent { */ readonly createdAt: string /** - * An object containing details of the Import Operation with the `rejected` state. + * An object containing details of the failed payment charge. * * */ - readonly data: ImportOperationRejectedEventData + readonly data: CheckoutMessagePaymentsPayloadBaseData } /** - * The `data` of the [Import Operation Rejected Event](ctp:api:type:ImportOperationRejectedEvent). + * Generated when a payment is successfully charged in Checkout. This event indicates that the authorized amount has been successfully debited from your customer's account. + * */ -export interface ImportOperationRejectedEventData { +export interface CheckoutPaymentChargedEvent extends IEvent { + readonly type: 'CheckoutPaymentCharged' + /** + * Unique identifier of the Event. + * + */ + readonly id: string + /** + * + */ + readonly notificationType: string /** - * The `id` of the Import Operation with the `rejected` state. * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. + * + */ + readonly createdAt: string + /** + * An object containing details of the successful payment charge. + * + * + */ + readonly data: CheckoutMessagePaymentsPayloadBaseData +} +/** + * Generated when an attempt to refund a payment refund fails in Checkout. This failure indicates that the planned refund amount was not successfully sent to your customer’s account. + * + */ +export interface CheckoutPaymentRefundFailedEvent extends IEvent { + readonly type: 'CheckoutPaymentRefundFailed' + /** + * Unique identifier of the Event. * */ readonly id: string + /** + * + */ + readonly notificationType: string + /** + * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. + * + */ + readonly createdAt: string + /** + * An object containing details of the failed payment refund attempt. + * + * + */ + readonly data: CheckoutMessagePaymentsPayloadBaseData } /** - * Generated when an [Import Operation](ctp:import:type:ImportOperation) has the `unresolved` [ProcessingState](ctp:import:type:ProcessingState). + * Generated when a payment is successfully refunded in Checkout. This event confirms that the refund has been processed and sent to your customer. + * */ -export interface ImportUnresolvedEvent extends IEvent { - readonly type: 'ImportUnresolved' +export interface CheckoutPaymentRefundedEvent extends IEvent { + readonly type: 'CheckoutPaymentRefunded' /** * Unique identifier of the Event. * @@ -254,40 +369,77 @@ export interface ImportUnresolvedEvent extends IEvent { */ readonly createdAt: string /** - * An object containing details of the Import Operation with the `unresolved` state. + * An object containing details of the successful payment refund. * * */ - readonly data: ImportUnresolvedEventData + readonly data: CheckoutMessagePaymentsPayloadBaseData } /** - * The `data` of the [Import Unresolved Event](ctp:api:type:ImportUnresolvedEvent). + * Generated when an [Import Container](ctp:import:type:ImportContainer) is created. */ -export interface ImportUnresolvedEventData { +export interface ImportContainerCreatedEvent extends IEvent { + readonly type: 'ImportContainerCreated' + /** + * Unique identifier of the Event. + * + */ + readonly id: string /** - * The `id` of the Import Operation with the `unresolved` state. * + */ + readonly notificationType: string + /** + * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. + * + */ + readonly createdAt: string + /** + * An object containing details of the created Import Container. + * + * + */ + readonly data: ImportContainerCreatedEventData +} +/** + * Generated when an [Import Container](ctp:import:type:ImportContainer) is deleted. + */ +export interface ImportContainerDeletedEvent extends IEvent { + readonly type: 'ImportContainerDeleted' + /** + * Unique identifier of the Event. * */ readonly id: string /** - * The `version` of the Import Operation with the `unresolved` state. * + */ + readonly notificationType: string + /** + * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. * */ - readonly version: number + readonly createdAt: string /** - * The `key` of the Import Container. + * An object containing details of the deleted Import Container. * * */ - readonly importContainerKey: string + readonly data: ImportContainerDeletedEventData } /** - * Generated when an [Import Operation](ctp:import:type:ImportOperation) has the `validationFailed` [ProcessingState](ctp:import:type:ProcessingState). + * Generated when an [Import Operation](ctp:import:type:ImportOperation) has the `rejected` [ProcessingState](ctp:import:type:ProcessingState). */ -export interface ImportValidationFailedEvent extends IEvent { - readonly type: 'ImportValidationFailed' +export interface ImportOperationRejectedEvent extends IEvent { + readonly type: 'ImportOperationRejected' /** * Unique identifier of the Event. * @@ -307,34 +459,71 @@ export interface ImportValidationFailedEvent extends IEvent { */ readonly createdAt: string /** - * An object containing details of the Import Operation with the `validationFailed` state. + * An object containing details of the Import Operation with the `rejected` state. * * */ - readonly data: ImportValidationFailedEventData + readonly data: ImportOperationRejectedEventData } /** - * The `data` of the [Import Validation Failed Event](ctp:api:type:ImportValidationFailedEvent). + * Generated when an [Import Operation](ctp:import:type:ImportOperation) has the `unresolved` [ProcessingState](ctp:import:type:ProcessingState). */ -export interface ImportValidationFailedEventData { +export interface ImportUnresolvedEvent extends IEvent { + readonly type: 'ImportUnresolved' /** - * The `id` of the Import Operation with the `validationFailed` state. + * Unique identifier of the Event. * + */ + readonly id: string + /** + * + */ + readonly notificationType: string + /** + * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. + * + */ + readonly createdAt: string + /** + * An object containing details of the Import Operation with the `unresolved` state. + * + * + */ + readonly data: ImportUnresolvedEventData +} +/** + * Generated when an [Import Operation](ctp:import:type:ImportOperation) has the `validationFailed` [ProcessingState](ctp:import:type:ProcessingState). + */ +export interface ImportValidationFailedEvent extends IEvent { + readonly type: 'ImportValidationFailed' + /** + * Unique identifier of the Event. * */ readonly id: string /** - * The `version` of the Import Operation with the `validationFailed` state. * + */ + readonly notificationType: string + /** + * + */ + readonly resourceType: EventSubscriptionResourceTypeId + /** + * Date and time (UTC) the Event was generated. * */ - readonly version: number + readonly createdAt: string /** - * The `key` of the Import Container. + * An object containing details of the Import Operation with the `validationFailed` state. * * */ - readonly importContainerKey: string + readonly data: ImportValidationFailedEventData } /** * Generated when an [Import Operation](ctp:import:type:ImportOperation) has the `waitForMasterVariant` [ProcessingState](ctp:import:type:ProcessingState). @@ -366,6 +555,173 @@ export interface ImportWaitForMasterVariantEvent extends IEvent { */ readonly data: ImportWaitForMasterVariantEventData } +/** + * The `data` payload of all related order event messages. + */ +export interface CheckoutMessageOrderPayloadBaseData { + /** + * `key` of the [Project](ctp:api:type:Project) where the order would belong to. + * + * + */ + readonly projectKey: string + /** + * The [Cart](ctp:api:type:Cart) on which the change or action was performed. + * + * + */ + readonly cart: CartReference + /** + * The [Payments](ctp:api:type:Payment) on which the change or action was performed. + * + * + */ + readonly payments: PaymentReference[] + /** + * Errors associated with the order event. + * + * + */ + readonly errors: ErrorObject[] +} +/** + * The `data` payload of all payment related event messages. + */ +export interface CheckoutMessagePaymentsPayloadBaseData { + /** + * `key` of the [Project](ctp:api:type:Project) where the payment was made. + * + * + */ + readonly projectKey: string + /** + * The [Payment](ctp:api:type:Payment) on which the change or action was performed. + * + * + */ + readonly payment: PaymentReference + /** + * `id` of the [Transaction](/../api/projects/payments#transaction). + * + * + */ + readonly transactionId: string + /** + * The [Cart](ctp:api:type:Cart) on which the change or action was performed. + * + * + */ + readonly cart?: CartReference + /** + * The [Order](ctp:api:type:Order) on which the change or action was performed. + * + * + */ + readonly order?: OrderReference +} +/** + * The `data` of the [Import Container Created Event](ctp:api:type:ImportContainerCreatedEvent). + */ +export interface ImportContainerCreatedEventData { + /** + * The `key` of the created Import Container. + * + * + */ + readonly key: string + /** + * The `version` of the created Import Container. + * + * + */ + readonly version: number + /** + * Date and time (UTC) the Import Container was created. + * + * + */ + readonly createdAt: string + /** + * Date and time (UTC) the Import Container was last updated. + * + * + */ + readonly lastModifiedAt: string +} +/** + * The `data` of the [Import Container Deleted Event](ctp:api:type:ImportContainerDeletedEvent). + */ +export interface ImportContainerDeletedEventData { + /** + * The `key` of the deleted Import Container. + * + * + */ + readonly key: string + /** + * The `version` of the deleted Import Container. + * + * + */ + readonly version: number +} +/** + * The `data` of the [Import Operation Rejected Event](ctp:api:type:ImportOperationRejectedEvent). + */ +export interface ImportOperationRejectedEventData { + /** + * The `id` of the Import Operation with the `rejected` state. + * + * + */ + readonly id: string +} +/** + * The `data` of the [Import Unresolved Event](ctp:api:type:ImportUnresolvedEvent). + */ +export interface ImportUnresolvedEventData { + /** + * The `id` of the Import Operation with the `unresolved` state. + * + * + */ + readonly id: string + /** + * The `version` of the Import Operation with the `unresolved` state. + * + * + */ + readonly version: number + /** + * The `key` of the Import Container. + * + * + */ + readonly importContainerKey: string +} +/** + * The `data` of the [Import Validation Failed Event](ctp:api:type:ImportValidationFailedEvent). + */ +export interface ImportValidationFailedEventData { + /** + * The `id` of the Import Operation with the `validationFailed` state. + * + * + */ + readonly id: string + /** + * The `version` of the Import Operation with the `validationFailed` state. + * + * + */ + readonly version: number + /** + * The `key` of the Import Container. + * + * + */ + readonly importContainerKey: string +} /** * The `data` of the [Import Wait For Master Variant Event](ctp:api:type:ImportWaitForMasterVariantEvent). */ diff --git a/packages/platform-sdk/src/generated/models/subscription.ts b/packages/platform-sdk/src/generated/models/subscription.ts index d781ff22e..6200c759b 100644 --- a/packages/platform-sdk/src/generated/models/subscription.ts +++ b/packages/platform-sdk/src/generated/models/subscription.ts @@ -327,7 +327,7 @@ export interface EventBridgeDestination extends IDestination { */ export interface EventSubscription { /** - * Unique identifier for the type of resource, for example, `import-api`. + * Unique identifier for the type of resource. * * */ @@ -335,7 +335,7 @@ export interface EventSubscription { /** * Must contain valid event types for the resource. * For example, for resource type `import-api` the event type `ImportContainerCreated` is valid. - * If no `types` are given, the Subscription will receive all events for this resource. + * If no `types` are given, the Subscription will receive all events for the defined resource type. * * */ @@ -346,15 +346,28 @@ export interface EventSubscription { * */ export enum EventSubscriptionResourceTypeIdValues { + Checkout = 'checkout', ImportApi = 'import-api', } -export type EventSubscriptionResourceTypeId = 'import-api' | (string & {}) +export type EventSubscriptionResourceTypeId = + | 'checkout' + | 'import-api' + | (string & {}) /** * Type of events supported by [EventSubscriptions](ctp:api:type:EventSubscription). * */ export enum EventTypeValues { + CheckoutOrderCreationFailed = 'CheckoutOrderCreationFailed', + CheckoutPaymentAuthorizationCancelled = 'CheckoutPaymentAuthorizationCancelled', + CheckoutPaymentAuthorizationFailed = 'CheckoutPaymentAuthorizationFailed', + CheckoutPaymentAuthorized = 'CheckoutPaymentAuthorized', + CheckoutPaymentCancelAuthorizationFailed = 'CheckoutPaymentCancelAuthorizationFailed', + CheckoutPaymentChargeFailed = 'CheckoutPaymentChargeFailed', + CheckoutPaymentCharged = 'CheckoutPaymentCharged', + CheckoutPaymentRefundFailed = 'CheckoutPaymentRefundFailed', + CheckoutPaymentRefunded = 'CheckoutPaymentRefunded', ImportContainerCreated = 'ImportContainerCreated', ImportContainerDeleted = 'ImportContainerDeleted', ImportOperationRejected = 'ImportOperationRejected', @@ -364,6 +377,15 @@ export enum EventTypeValues { } export type EventType = + | 'CheckoutOrderCreationFailed' + | 'CheckoutPaymentAuthorizationCancelled' + | 'CheckoutPaymentAuthorizationFailed' + | 'CheckoutPaymentAuthorized' + | 'CheckoutPaymentCancelAuthorizationFailed' + | 'CheckoutPaymentChargeFailed' + | 'CheckoutPaymentCharged' + | 'CheckoutPaymentRefundFailed' + | 'CheckoutPaymentRefunded' | 'ImportContainerCreated' | 'ImportContainerDeleted' | 'ImportOperationRejected' diff --git a/reference.txt b/reference.txt new file mode 100644 index 000000000..f367a7507 --- /dev/null +++ b/reference.txt @@ -0,0 +1 @@ +71c9b92983ecd57382d42939be48f9017769be02 diff --git a/references.txt b/references.txt index 81cd762e3..87cc6d892 100644 --- a/references.txt +++ b/references.txt @@ -411,3 +411,4 @@ f308ced4b427eea3642d2d183f6d15f0c1287aa8 ab2859c84d9f146e5d8556e905538b92af4aa044 5f7c0bef26fa70b6a3ec382455b56146e3088e0e 7c59b29681399c1a3000934fd59a46c10cbe5401 +dd595db3882a9eef83a47515f013be37deae6bff