Cart Discounts
Cart Discounts are used to change the Prices of different elements within a Cart.
Cart Discounts are recalculated every time LineItems or CustomLineItems are added or removed from the Cart or an Order is created from the Cart.
The number of active CartDiscounts that do not require a Discount Code (isActive=true
and requiresDiscountCode=false
) is limited to 100. Learn more about this limit.
Representations
CartDiscount
id String | Unique identifier of the CartDiscount. |
version Int | Current version of the CartDiscount. |
key String | User-defined unique identifier of the CartDiscount. MinLength:2 MaxLength: 256 Pattern: ^[A-Za-z0-9_-]+$ |
name | Name of the CartDiscount. |
description | Description of the CartDiscount. |
value | Effect of the CartDiscount. |
cartPredicate String | Valid Cart Predicate. |
target | Sets a CartDiscountTarget. Empty if |
sortOrder String | Value between |
isActive Boolean | Indicates if the CartDiscount is active and can be applied to the Cart. |
validFrom | Date and time (UTC) from which the Discount is effective. |
validUntil | Date and time (UTC) until which the Discount is effective. |
requiresDiscountCode Boolean | Indicates if the Discount can be used in connection with a DiscountCode. |
references Array of Reference | References of all resources that are addressed in the predicate. The API generates this array from the predicate. |
stackingMode | Indicates whether the application of the CartDiscount causes other discounts to be ignored. Default:Stacking |
custom | Custom Fields of the CartDiscount. |
createdAt | Date and time (UTC) for the CartDiscount was initially created. |
createdBy BETA | Present on resources created after 1 February 2019 except for events not tracked. |
lastModifiedAt | Date and time (UTC) for the CartDiscount was last updated. |
lastModifiedBy BETA | Present on resources updated after 1 February 2019 except for events not tracked. |
CartDiscountDraft
key String | User-defined unique identifier for the CartDiscount. MinLength:2 MaxLength: 256 Pattern: ^[A-Za-z0-9_-]+$ |
name | Name of the CartDiscount. |
description | Description of the CartDiscount. |
value | Effect of the CartDiscount. For a target, relative or absolute Discount values or a fixed item Price value can be specified. If no target is specified, a Gift Line Item can be added to the Cart. |
cartPredicate String | Valid Cart Predicate. |
target | Must not be set when the |
sortOrder String | Value between |
isActive Boolean | Only active Discounts can be applied to the Cart. Default:true |
validFrom | Date and time (UTC) from which the Discount is effective. |
validUntil | Date and time (UTC) until which the Discount is effective. |
requiresDiscountCode Boolean | States whether the Discount can only be used in a connection with a DiscountCode. Default:false |
stackingMode | Specifies whether the application of this discount causes the following discounts to be ignored. Default:Stacking |
custom | Custom Fields of the CartDiscount. |
CartDiscountPagedQueryResponse
PagedQueryResult with results
containing an array of CartDiscount.
limit Int | Number of results requested. |
offset Int | Number of elements skipped. |
count Int | Actual number of results returned. |
total Int | Total number of results matching the query.
This number is an estimation that is not strongly consistent.
This field is returned by default.
For improved performance, calculating this field can be deactivated by using the query parameter |
results Array of CartDiscount | CartDiscounts matching the query. |
CartDiscountReference
Reference to a CartDiscount.
id String | Unique identifier of the referenced CartDiscount. |
typeId String | "cart-discount" References a CartDiscount. |
obj | Contains the representation of the expanded CartDiscount. Only present in responses to requests with Reference Expansion for CartDiscounts. |
CartDiscountResourceIdentifier
id String | Unique identifier of the referenced CartDiscount. Either |
key String | User-defined unique identifier of the referenced CartDiscount. Either |
typeId String | "cart-discount" References a CartDiscount. |
CartDiscountValue
Defines the effect the Discount will have. For a target, relative or absolute Discount values or a fixed item Price value can be specified. If no target is specified, a Gift Line Item can be added to the Cart.
CartDiscountValueRelative
Discounts the CartDiscountTarget relative to its price.
type String | "relative" |
permyriad Int | Fraction (per ten thousand) the price is reduced by. For example, |
With previous Discounts already applied, the target may already have a discounted Price. The Discount is then calculated based on the already discounted Price.
CartDiscountValueAbsolute
Discounts the CartDiscountTarget by an absolute amount (not allowed for MultiBuyLineItemsTarget and MultiBuyCustomLineItemsTarget).
type String | "absolute" |
money Array of CentPrecisionMoney | Cent precision money values in different currencies. |
CartDiscountValueFixed
Sets the DiscountedLineItemPrice of the CartDiscountLineItemsTarget or CartDiscountCustomLineItemsTarget to the value specified in the money
field, if it is lower than the current Line Item price for the same currency. If the Line Item price is already discounted to a price equal to or lower than the respective price in the money
field, this Discount is not applied.
type String | "fixed" |
money Array of CentPrecisionMoney | Cent precision money values in different currencies. |
CartDiscountValueGiftLineItem
Adds a free Line Item as a gift to the Cart.
A Gift Line Item is automatically added to the Cart when the Discount Predicate evaluates as true. However, only one Gift Line Item can be added to a Cart.
The Gift Line Item has the following characteristics:
- LineItemMode
GiftLineItem
and aquantity
of1
. - Like all other Line Items, it has the
price
field set (it is, therefore, necessary that the Product Variant has a Price defined that can be selected for each Cart the Discount should be applied to). - The
totalPrice
has acentAmount
of0
. - The
discountedPricePerQuantity
shows adiscountedPrice
with acentAmount
of0
andincludedDiscounts
references the Cart Discount that was evaluated to add the Gift Line Item.
If at creation time the Discount can not be applied to any Cart (for example because the Product, the Product Variant, or a Channel does not exist), the creation fails.
The Discount will not be applied to a Cart if it either has become invalid since the creation (for example because the Product, the Product Variant, or a Channel have been deleted) or because no Price can be selected for the particular Cart.
type String | "giftLineItem" |
product | Reference to a Product. |
variantId Int | ProductVariant of the Product. |
supplyChannel | Channel must have the ChannelRoleEnum |
distributionChannel | Channel must have the ChannelRoleEnum |
Cannot be combined with MultiBuyLineItemsTarget.
CartDiscountValueDraft
Defines the effect the Discount will have. For a target, relative or absolute Discount values or a fixed item Price value can be specified. If no target is specified, a Gift Line Item can be added to the Cart.
CartDiscountValueRelativeDraft
type String | "relative" |
permyriad Int | Fraction (per ten thousand) the price is reduced by. For example, |
CartDiscountValueAbsoluteDraft
type String | "absolute" |
money Array of Money | Money values in different currencies. An absolute Cart Discount will only match a price if this array contains a value with the same currency. If it contains 10€ and 15$, the matching € price will be decreased by 10€ and the matching $ price will be decreased by 15$. |
CartDiscountValueFixedDraft
Sets the DiscountedLineItemPrice of the CartDiscountLineItemsTarget or CartDiscountCustomLineItemsTarget to the value specified in the money
field, if it is lower than the current Line Item price for the same currency. If the Line Item price is already discounted to a price equal to or lower than the respective price in the money
field, this Discount is not applied.
type String | "fixed" |
money Array of Money | Money values in different currencies. A fixed Cart Discount will only match a price if this array contains a value with the same currency. If it contains 10€ and 15$, the matching € price will be discounted by 10€ and the matching $ price will be discounted to 15$. |
CartDiscountValueGiftLineItemDraft
type String | "giftLineItem" |
product | ResourceIdentifier of a Product. |
variantId Int | ProductVariant of the Product. |
supplyChannel | Channel must have the role |
distributionChannel | Channel must have the role |
CartDiscountTarget
Defines what part of the Cart will be discounted.
Discounts can be applied on LineItems, CustomLineItems, and ShippingInfo.
Additionally, MultiBuyLineItemsTarget discounts certain quantities of Line Items and MultiBuyCustomLineItemsTarget discounts certain quantities of Custom Line Items.
CartDiscountLineItemsTarget
Discount is applied to LineItems matching the predicate
.
type String | "lineItems" |
predicate String | Valid LineItem target predicate. |
CartDiscountCustomLineItemsTarget
Discount is applied to CustomLineItems matching the predicate
.
type String | "customLineItems" |
predicate String |
CartDiscountShippingCostTarget
Discount is applied to the shipping costs of the Cart.
type String | "shipping" |
MultiBuyLineItemsTarget BETA
A multi-buy Discount is not applied on each Line Item as a whole (like with the LineItems Target), but on the individual items that are contained in all matching Line Items and subsumed under their quantity
fields.
A multi-buy Discount can occur multiple times in a Cart.
A single application of a multi-buy Discount is described by the following two numbers:
triggerQuantity
- How many items need to match per occurrence?discountedQuantity
- How many of these items will be discounted per occurrence?
Multi-buy Discount represents a "Buy 4 items, get 2 of them at a discounted rate" type of discount. In this example, the triggerQuantity
is 6
, and the discountedQuantity
is 2
.
The triggerQuantity
must be greater than 1
.
The discountedQuantity
must be greater than 0
and less than or equal to the triggerQuantity
.
A multi-buy Discount can have more than one occurrence in a Cart. Yet, any item will only be considered once per multi-buy Discount. Sticking to the example above:
Given a Cart with
6
items, the Discount can be applied only once. As a result,2
items will be discounted and4
items will be marked as participating in this Discount.Given a Cart with
8
items, the Discount can still be applied only once. As a result,2
items will be discounted and4
items will be marked as participating while the Remaining2
items will be disregarded by this Discount.Given a Cart with
12
items, the Discount can be applied twice. As a result,2*2
items will be discounted and2*4
items will be marked as participating in this Discount.
A participation is represented by a DiscountedLineItemPortion with discountedAmount.centAmount = 0
.
You can limit the number of occurrences ("applications") of a multi-buy Discount per Cart by defining the maxOccurrence
parameter.
A LineItemPredicate is applied to select the items relevant for the Discount.
The Discount value to be applied is defined in the Discount's CartDiscountValue.
Currently only Relative values are allowed.
To recap, the matching items of a Discount application will be sliced into up to maxOccurence
groups of size triggerQuantity
. Remaining items (for example, the ninth of a "buy 8, get 2 for free" Discount) do not participate in the Discount. Of any such group only discountedQuantity
items will actually be discounted (for example, the second of a "buy 8, get 2 for free" Discount); the others are only participating, meaning they are part of this occurrence and thus, cannot participate in another group and the Price remains unchanged. To determine which items of a group will actually be discounted, a SelectionMode needs to be set.
type String | "multiBuyLineItems" |
predicate String | Valid LineItem target predicate. The Discount will be applied to Line Items that are matched by the predicate. |
triggerQuantity Int | Number of Line Items to be present in order to trigger an application of this Discount. |
discountedQuantity Int | Number of Line Items that are discounted per application of this Discount. |
maxOccurrence Int | Maximum number of times this Discount can be applied. |
selectionMode | Discounts particular Line Items only according to the SelectionMode. |
MultiBuyCustomLineItemsTarget BETA
This Discount target is similar to MultiBuyLineItems
, but is applied on Custom Line Items instead of Line Items.
type String | "multiBuyCustomLineItems" |
predicate String | Valid CustomLineItems target predicate. The Discount will be applied to Custom Line Items that are matched by the predicate. |
triggerQuantity Int | Number of Custom Line Items to be present in order to trigger an application of this Discount. |
discountedQuantity Int | Number of Custom Line Items that are discounted per application of this Discount. |
maxOccurrence Int | Maximum number of times this Discount can be applied. |
selectionMode | Discounts particular Line Items only according to the SelectionMode. |
SelectionMode
Defines which matching items are to be discounted.
Cheapest
Select the cheapest items.
MostExpensive
Select the most expensive items.
If the Discount occurs multiple times, it is guaranteed that, out of all matching items, the cheapest or most expensive ones will be discounted, depending on this setting.
If two or more items have the same Price, it is not predictable which of the items are participating in the Discount and which are not. What we guarantee is that the total Discount over all participating items is correct.
Discount always refers to the current Price including already applied Discounts.
StackingMode
Describes how the Cart Discount interacts with other Discounts.
Stacking
Applies other matching Discounts after applying this one.
StopAfterThisDiscount
Doesn't apply any more matching Discounts after this one if it's successfully applied.
The stacking mode does not control free shipping as defined via freeAbove
on a ShippingRate. To avoid unwanted scenarios, we highly recommend not using Cart Discounts on shipping
target and freeAbove
together.
Get CartDiscount
Get CartDiscount by ID
view_orders:{projectKey},
view_cart_discounts:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
id String |
|
expand | The parameter can be passed multiple times. |
curl --get https://api.{region}.commercetools.com/{projectKey}/cart-discounts/{id} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}'
{"id" : "c2f93298-c967-44af-8c2a-d2220bf39eb2","version" : 1,"createdAt" : "1970-01-01T00:00:00.001Z","lastModifiedAt" : "1970-01-01T00:00:00.001Z","name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false,"references" : [ ],"stackingMode" : "Stacking"}
Get CartDiscount by Key
view_orders:{projectKey},
view_cart_discounts:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
key String |
|
expand | The parameter can be passed multiple times. |
curl --get https://api.{region}.commercetools.com/{projectKey}/cart-discounts/key={key} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}'
{"id" : "c2f93298-c967-44af-8c2a-d2220bf39eb2","version" : 1,"createdAt" : "1970-01-01T00:00:00.001Z","lastModifiedAt" : "1970-01-01T00:00:00.001Z","name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false,"references" : [ ],"stackingMode" : "Stacking"}
Query CartDiscounts
view_orders:{projectKey},
view_cart_discounts:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
where | The parameter can be passed multiple times. |
/^var[.][a-zA-Z0-9]+$/ Any string parameter matching this regular expression | Predicate parameter values. The parameter can be passed multiple times. |
sort | The parameter can be passed multiple times. |
expand | The parameter can be passed multiple times. |
limit Int | Number of results requested. |
offset Int | Number of elements skipped. |
withTotal Boolean | Controls the calculation of the total number of query results. Set to |
curl --get https://api.{region}.commercetools.com/{projectKey}/cart-discounts -i \--header 'Authorization: Bearer ${BEARER_TOKEN}'
{"limit" : 20,"offset" : 0,"count" : 1,"total" : 1,"results" : [ {"id" : "c2f93298-c967-44af-8c2a-d2220bf39eb2","version" : 1,"createdAt" : "1970-01-01T00:00:00.001Z","lastModifiedAt" : "1970-01-01T00:00:00.001Z","name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false,"references" : [ ],"stackingMode" : "Stacking"} ]}
Create CartDiscount
manage_orders:{projectKey},
manage_cart_discounts:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
expand | The parameter can be passed multiple times. |
application/json
application/json
curl https://api.{region}.commercetools.com/{projectKey}/cart-discounts -i \--header 'Authorization: Bearer ${BEARER_TOKEN}' \--header 'Content-Type: application/json' \--data-binary @- << DATA{"name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false}DATA
{"id" : "c2f93298-c967-44af-8c2a-d2220bf39eb2","version" : 1,"createdAt" : "1970-01-01T00:00:00.001Z","lastModifiedAt" : "1970-01-01T00:00:00.001Z","name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false,"references" : [ ],"stackingMode" : "Stacking"}
Update CartDiscount
Update CartDiscount by ID
manage_orders:{projectKey},
manage_cart_discounts:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
id String |
|
expand | The parameter can be passed multiple times. |
application/json
version Int | Expected version of the CartDiscount on which the changes should be applied. If the expected version does not match the actual version, a ConcurrentModification error is returned. |
actions Array of CartDiscountUpdateAction | Update actions to be performed on the CartDiscount. |
application/json
curl https://api.{region}.commercetools.com/{projectKey}/cart-discounts/{id} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}' \--header 'Content-Type: application/json' \--data-binary @- << DATA{"version" : 1,"actions" : [ {"action" : "changeValue","value" : {"type" : "relative","permyriad" : 1000}} ]}DATA
{"id" : "c2f93298-c967-44af-8c2a-d2220bf39eb2","version" : 1,"createdAt" : "1970-01-01T00:00:00.001Z","lastModifiedAt" : "1970-01-01T00:00:00.001Z","name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false,"references" : [ ],"stackingMode" : "Stacking"}
Update CartDiscount by Key
manage_orders:{projectKey},
manage_cart_discounts:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
key String |
|
expand | The parameter can be passed multiple times. |
application/json
version Int | Expected version of the CartDiscount on which the changes should be applied. If the expected version does not match the actual version, a ConcurrentModification error is returned. |
actions Array of CartDiscountUpdateAction | Update actions to be performed on the CartDiscount. |
application/json
curl https://api.{region}.commercetools.com/{projectKey}/cart-discounts/key={key} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}' \--header 'Content-Type: application/json' \--data-binary @- << DATA{"version" : 1,"actions" : [ {"action" : "changeValue","value" : {"type" : "relative","permyriad" : 1000}} ]}DATA
{"id" : "c2f93298-c967-44af-8c2a-d2220bf39eb2","version" : 1,"createdAt" : "1970-01-01T00:00:00.001Z","lastModifiedAt" : "1970-01-01T00:00:00.001Z","name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false,"references" : [ ],"stackingMode" : "Stacking"}
Update actions
Set Key
action String | "setKey" |
key String | Value to set. If empty, any existing value will be removed. MinLength:2 MaxLength: 256 Pattern: ^[A-Za-z0-9_-]+$ |
Change Value
action String | "changeValue" |
value | New value to set. |
{"action" : "changeValue","value" : {"type" : "absolute","money" : [ {"currencyCode" : "EUR","centAmount" : 40099} ]}}
Change Cart Predicate
action String | "changeCartPredicate" |
cartPredicate String | New value to set. |
{"action" : "changeCartPredicate","cartPredicate" : "cartPredicateString"}
Change Target
action String | "changeTarget" |
target | New value to set. |
{"action" : "changeTarget","target" : {"type" : "lineItems","predicate" : "sku = \"myOtherSKU\""}}
Change IsActive
action String | "changeIsActive" |
isActive Boolean | New value to set.
If set to |
{"action" : "changeIsActive","isActive" : false}
Change Name
action String | "changeName" |
name | New value to set. |
{"action" : "changeName","name" : {"en" : "NewNameEN","de" : "NewNameDE"}}
Set Description
action String | "setDescription" |
description | Value to set. If empty, any existing value will be removed. |
{"action" : "setDescription","description" : {"en" : "New Description EN","de" : "New Description DE"}}
Change Sort Order
action String | "changeSortOrder" |
sortOrder String | New value to set (between |
{"action" : "changeSortOrder","sortOrder" : "0.2"}
Change Requires DiscountCode
action String | "changeRequiresDiscountCode" |
requiresDiscountCode Boolean | New value to set.
If set to |
{"action" : "changeRequiresDiscountCode","requiresDiscountCode" : true}
Set Valid From
action String | "setValidFrom" |
validFrom | Value to set. If empty, any existing value will be removed. |
{"action" : "setValidFrom","validFrom" : "2017-10-15T15:00:00.000Z"}
Set Valid Until
action String | "setValidUntil" |
validUntil | Value to set. If empty, any existing value will be removed. |
{"action" : "setValidUntil","validUntil" : "2017-10-15T20:00:00.000Z"}
Set Valid From and Until
action String | "setValidFromAndUntil" |
validFrom | Value to set. If empty, any existing value will be removed. |
validUntil | Value to set. If empty, any existing value will be removed. |
{"action" : "setValidFromAndUntil","validFrom" : "2017-10-15T15:00:00.000Z","validUntil" : "2017-10-15T15:05:00.000Z"}
Change Stacking Mode
action String | "changeStackingMode" |
stackingMode | New value to set. |
{"action" : "changeStackingMode","stackingMode" : "Stacking"}
Set Custom Type
action String | "setCustomType" |
type | Defines the Type that extends the CartDiscount with Custom Fields. If absent, any existing Type and Custom Fields are removed from the CartDiscount. |
fields | Sets the Custom Fields fields for the CartDiscount. |
{"action" : "setCustomType","type" : {"id" : "{{type-id}}","typeId" : "type"},"fields" : {"exampleStringTypeField" : "TextString"}}
Set CustomField
action String | "setCustomField" |
name String | Name of the Custom Field. |
value | If |
{"action" : "setCustomField","name" : "ExampleStringTypeField","value" : "TextString"}
Delete CartDiscount
Delete CartDiscount by ID
manage_orders:{projectKey},
manage_cart_discounts:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
id String |
|
version Int | Last seen version of the resource. |
expand | The parameter can be passed multiple times. |
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/cart-discounts/{id}?version={version} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}'
{"id" : "c2f93298-c967-44af-8c2a-d2220bf39eb2","version" : 1,"createdAt" : "1970-01-01T00:00:00.001Z","lastModifiedAt" : "1970-01-01T00:00:00.001Z","name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false,"references" : [ ],"stackingMode" : "Stacking"}
Delete CartDiscount by Key
manage_orders:{projectKey},
manage_cart_discounts:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
key String |
|
version Int | Last seen version of the resource. |
expand | The parameter can be passed multiple times. |
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/cart-discounts/key={key}?version={version} -i \--header 'Authorization: Bearer ${BEARER_TOKEN}'
{"id" : "c2f93298-c967-44af-8c2a-d2220bf39eb2","version" : 1,"createdAt" : "1970-01-01T00:00:00.001Z","lastModifiedAt" : "1970-01-01T00:00:00.001Z","name" : {"en" : "Summer Sale"},"value" : {"type" : "relative","permyriad" : 1000},"cartPredicate" : "1=1","target" : {"type" : "lineItems","predicate" : "1=1"},"sortOrder" : "0.1","isActive" : true,"requiresDiscountCode" : false,"references" : [ ],"stackingMode" : "Stacking"}