Backward incompatible changes in 1.1.0
There are quite a number of backward incompatible changes in this release, but we expect the impact to be limited, as many are in classes and interfaces not commonly used for checkout customizations.
We expect the most impact to be for custom form field implementations, which is why those changes are listed first. Other changes that will impact most implementations are a new translation phrase and a template change.
The following backward incompatible changes are included in release 1.1.0.
Backward incompatible localization changes
New phrase "Preparing form"
A new translation phrase "Preparing form" was added, in addition to the previously used phrase "Preparing address form".
Add the new phrase to all localizations before upgrading. Ensure to also keep the previous phrase "Preparing address form" in place.
Backward incompatible template changes
src/view/frontend/templates/checkout/address-view/address-list/form.phtml
DOM section "Save in address book" moved
Previously the "Save in address book" checkbox was rendered by this template if $magewire->canSaveToAddressBook() was true.
Now the checkbox is added as a form field dynamically using the form modifier API.
If you override the template in your theme, be sure to remove the section from the template after the upgrade, to avoid the checkbox being rendered twice.
src/view/frontend/templates/breadcrumbs.phtml
CSS selector changed
In the template breadcrumbs.phtml a typo in the CSS class nav-braincrumbs was fixed. The new CSS class is nav-breadcrumbs.
Any custom JavaScript, CSS, or tests using the old CSS class need to be changed after the upgrade.
di.xml preference changes
Other DI configuration changes in regard to constructor argument changes are listed with the respective classes below.
Preference for Hyva\Checkout\Model\Form\EntityFieldInterface changed
The preference for the interface configured in etc/di.xml has changed from \Hyva\Checkout\Model\Form\EntityField\EavAttributeField to \Hyva\Checkout\Model\Form\EntityField\Input.
Backward incompatible PHP Class and Interface changes
Class \Hyva\Checkout\Model\Form\EntityFormFieldFactory
The changes in this class will likely impact any instance using custom field implementations because of how they are registered in di.xml.
Method __construct signature change
This mainly affects how field types are registered in di.xml.
The $customFields argument is no longer present
Previously field types were registered using:
<type name="Hyva\Checkout\Model\Form\EntityFormFieldFactory">
<arguments>
<argument name="customFields" xsi:type="array">
<item name="telephone" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\TelephoneAttributeField</item>
<item name="email" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityCustomer\EmailAttributeField</item>
<item name="password" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\Password</item>
<item name="street" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\StreetAttributeField</item>
<item name="region" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\RegionAttributeField</item>
<item name="country_id" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\CountryAttributeField</item>
<item name="postcode" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\PostcodeAttributeField</item>
<item name="prefix" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\PrefixAttributeField</item>
<item name="gender" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\GenderAttributeField</item>
</argument>
</arguments>
</type>
Before the upgrade, add any custom fields to the
EntityFormFactory constructor argument $elements.
<type name="Hyva\Checkout\Model\Form\EntityFormFactory">
<arguments>
<argument name="elements" xsi:type="array">
<!-- Default EAV fields -->
<item name="telephone" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\TelephoneAttributeField</item>
<item name="email" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityCustomer\EmailAttributeField</item>
<item name="street" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\StreetAttributeField</item>
<item name="region" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\RegionAttributeField</item>
<item name="country_id" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\CountryAttributeField</item>
<item name="postcode" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\PostcodeAttributeField</item>
<item name="prefix" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\PrefixAttributeField</item>
<item name="gender" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\GenderAttributeField</item>
<!-- Regular fields -->
<item name="id" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\PrimaryKey</item>
<item name="save" xsi:type="string">Hyva\Checkout\Model\Form\EntityField\SaveAs</item>
</argument>
</arguments>
</type>
di.xml registration completely.
After the upgrade, the old $customFields configuration for custom fields can be removed.
Method create signature change
The signature of create changed from
create(string $id, string $form = null, array $data = [], string $default = null)
to
create(string $name, EntityFormInterface $form, array $arguments = [], string $type = null)
Any custom code calling this method needs to be changed after the upgrade.
Method getCustomFields removed
The method has no replacement after the upgrade.
Any plugins to the method will no longer be called. To dynamically add fields, change the code to the new form modifier API instead.
Interface \Hyva\Checkout\Model\Form\EntityFieldInterface
Method addAttribute deprecated.
The method remains for backward compatibility.
No action in custom code is required, but we recommend using the new setAttribute method instead:
Method getFrontendInputAlias deprecated
The method remains for backward compatibility, but now simply returns getFrontendInput.
It is no longer called, so plugins to this method will no longer be triggered.
Before the upgrade, custom logic calling this method should be implemented additionally using the new form modifier API.
Custom form field implementations need to be prepared to no longer rely on this method.
After the upgrade, the old implementation using getFrontendInputAlias can be removed.
Method getBlockNameAffix deprecated
The method remains for backward compatibility, but now simply returns getFrontendInput.
It is no longer called, so plugins using this method will not be triggered after the upgrade.
Custom form field implementations need to be prepared to no longer rely on this method.
Method reset added
Before the upgrade implement the method in custom form field implementations unless they extend from \Hyva\Checkout\Model\Form\EntityField\AbstractEntityField which provides a default implementation.
Method setValidationRuleadded
Before the upgrade implement the method in custom form field implementations unless they extend from \Hyva\Checkout\Model\Form\EntityField\AbstractEntityField which provides a default implementation.
Method removeValidationRule added
Before the upgrade implement the method in custom form field implementations unless they extend from \Hyva\Checkout\Model\Form\EntityField\AbstractEntityField which provides a default implementation.
Class \Hyva\Checkout\Model\Form\EntityField\AbstractEntityField
The changes to this class will impact instances with custom form field implementations overriding the constructor.
Method __construct signature change
All parent dependencies have been encapsulated in a container to avoid future constructor signature changes.
This change affects all custom form field implementations overriding__construct.
Be aware the required change to keep your code compatible can not be done before the upgrade.After the upgrade, change the overridden constructor to receive the new
\Hyva\Checkout\Model\Form\EntityField\FormFieldDependencies dependency and pass it on to the parent.
Method renderValidationRules removed
Rendering validation rule attributes now is done via element attributes.
For Hyvä-Checkout native fields, these attributes are set by \Hyva\Checkout\Model\Form\EntityFormModifier\MagewireAddressModifier::applyHyvaValidationApiModifications.
Plugins to renderValidationRules method will need to be changed to use MagewireAddressModifier::applyHyvaValidationApiModifications instead, as the plugin no longer will be triggered.
Custom field implementations have to be changed to render the rules via renderAttributes instead.
Note the helper method setValidationRule can be used to set a rule on a field without accidentally removing already existing rules.
Method addAttribute deprecated
The method remains for backward compatibility.
No action in custom code is required, but we recommend using the new setAttribute method instead:
Class \Hyva\Checkout\Model\Form\EntityField\EavAttributeField
The changes to this class will impact instances with custom form field implementations overriding the constructor.
Method __construct signature change
All parent dependencies have been encapsulated in a container to avoid future constructor signature changes.
This change affects all custom form field implementations overriding__construct.
Be aware the required change to keep your code compatible can not be done before the upgrade.After the upgrade, change the overridden constructor to receive the new
\Hyva\Checkout\Model\Form\EntityField\FormFieldDependencies dependency and pass it on to the parent.
Interface \Hyva\Checkout\Model\Form\EntityFormInterface
Method submit signature changed
Previously, the values to submit to a form were passed as an array argument to the submit method.
After the upgrade, submit no longer receives an argument.
The values should instead be set on the form using $form->fill($values), followed by $form->submit() without any argument.
Method createField signature changed
The old method signature is createField(string $name, array $data = [])
The new method signature is createField(string $name, string $type = 'text', array $arguments = [])
After the upgrade, change any custom code calling the method to use the new signature.
Also, plugins on createField referring to the arguments need to be changed accordingly.
Method store removed
Previously this method was called by the frontend via Magewire to trigger state synchronization. The store method implementation in AbstractEntityForm did nothing at all.
If code in your instance calls the method store on a form instance, the call can be removed without issues.
New method group
The purpose of the method is to assign an array of elements as relatives to an ancestor.
Add this method to custom entity form implementations before the upgrade unless your custom form implementation extends from \Hyva\Checkout\Model\Form\AbstractEntityForm which provides a default implementation.
Method fill signature changed
Custom form implementations need to change the fill method to match the new signature defined in the interface.
This will only affect custom implementations not extending from \Hyva\Checkout\Model\Form\AbstractEntityForm.
The signature change is backward compatible for custom code calling fill, so no change is required there.
Plugins to the method should also continue to work without changes.
Method addField signature changed
The old method signature is public function addField(string $name, EntityFieldInterface $field)
The new method signature is public function addField(EntityFieldInterface $field)
Custom form implementations need to change the fill method to match the new signature defined in the interface.
This will only affect custom implementations not extending from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Custom code calling addField will need to be changed after the upgrade to no longer supply the field name as the first argument.
Method removeField signature changed
The old method signature is public function removeField(string $name)
The new method signature is public function removeField(EntityFieldInterface $field)
Custom form implementations need to change the removeField method to match the new signature defined in the interface unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Custom code calling the method needs to be changed after the upgrade to supply the field instance instead of the field name.
Method createElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method addElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method getElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method removeElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method reinstateElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method createField signature changed
The old method signature is createField(string $name, array $data = [])
The new method signature is createField(string $name, string $type = 'text', array $arguments = [])
Custom implementations need to be changed to match the new signature after the upgrade.
Also, change any custom code calling the method to use the new signature, and plugins on createField referring to the arguments need to be changed accordingly, too.
Method getFactoryFor added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method getSaveService added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method registerModificationListener added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method unregisterModificationListener added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method dispatchModificationHook added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Class \Hyva\Checkout\Magewire\Checkout\AddressView\AbstractMagewireAddressForm
Method updatingAddressCountryId removed
Now the generic lifecycle method updated($value, $name) is used.
This potentially affects custom plugins for updatingAddressCountryId.
If such plugins exist in your Magento instance, before upgrading, add a matching plugin for the updated method.
In the plugin, place your custom code in a condition checking
After the upgrade, the original plugin method on updatingAddressCountryId can be removed.
saveDateTime and getSaveDateTime() deprecated
The property and the method still exist, but they have been deprecated without a replacement. If you are referring to these in your code, please change your code to keep track of the value with custom logic depending on your needs.
Any plugins to getSaveDateTime will no longer be executed after the upgrade, because the method is no longer called.
Interface \Hyva\Checkout\Model\Form\EntityFormInterface
Method submit signature changed
Previously, the values to submit to a form were passed as an array argument to the submit method.
After the upgrade, submit no longer receives an argument.
The values should instead be set on the form using $form->fill($values), followed by $form->submit() without any argument.
Method createField signature changed
The old method signature is createField(string $name, array $data = [])
The new method signature is createField(string $name, string $type = 'text', array $arguments = [])
After the upgrade, change any custom code calling the method to use the new signature.
Also, plugins on createField referring to the arguments need to be changed accordingly.
Method store removed
Previously this method was called by the frontend via Magewire to trigger state synchronization. The store method implementation in AbstractEntityForm did nothing at all.
If code in your instance calls the method store on a form instance, the call can be removed without issues.
New method group
The purpose of the method is to assign an array of elements as relatives to an ancestor.
Add this method to custom entity form implementations before the upgrade unless your custom form implementation extends from \Hyva\Checkout\Model\Form\AbstractEntityForm which provides a default implementation.
Method fill signature changed
Custom form implementations need to change the fill method to match the new signature defined in the interface.
This will only affect custom implementations not extending from \Hyva\Checkout\Model\Form\AbstractEntityForm.
The signature change is backward compatible for custom code calling fill, so no change is required there.
Plugins to the method should also continue to work without changes.
Method addField signature changed
The old method signature is public function addField(string $name, EntityFieldInterface $field)
The new method signature is public function addField(EntityFieldInterface $field)
Custom form implementations need to change the fill method to match the new signature defined in the interface.
This will only affect custom implementations not extending from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Custom code calling addField will need to be changed after the upgrade to no longer supply the field name as the first argument.
Method removeField signature changed
The old method signature is public function removeField(string $name)
The new method signature is public function removeField(EntityFieldInterface $field)
Custom form implementations need to change the removeField method to match the new signature defined in the interface unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Custom code calling the method needs to be changed after the upgrade to supply the field instance instead of the field name.
Method createElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method addElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method getElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method removeElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method reinstateElement added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method createField signature changed
The old method signature is createField(string $name, array $data = [])
The new method signature is createField(string $name, string $type = 'text', array $arguments = [])
Custom implementations need to be changed to match the new signature after the upgrade.
Also, change any custom code calling the method to use the new signature and plugins on createField referring to the arguments need to be changed accordingly, too.
Method getFactoryFor added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method getSaveService added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method registerModificationListener added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method unregisterModificationListener added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Method dispatchModificationHook added
Custom form implementations need to implement the method unless they extend from \Hyva\Checkout\Model\Form\AbstractEntityForm.
Interface \Hyva\Checkout\Magewire\Checkout\AddressView\MagewireAddressFormInterface
Method getAutoSaveTimeout deprecated
The method remains in the interface for backward compatibility.
Instead of the method, the $autoSaveTimeout public property of the implementation \Hyva\Checkout\Magewire\Checkout\AddressView\AbstractMagewireAddressForm should be used.
If code in your instance calls getAutoSaveTimeout() on Magewire components, no action is required.
If there are plugins to getAutoSaveTimeout in your instance, they probably to be changed since the getAutoSaveTimeout
method is no longer called, and thus the plugins will not be executed.
Method canSaveToAddressBook deprecated
The method remains in the interface for backward compatibility.
It is no longer called, so any plugins on the method will no longer be triggered.
Instead of this method, the form modifier \Hyva\Checkout\Model\Form\EntityFormModifier\WithAuthenticationModifier now registers a hook method that adds the "Save to Address Book" field if possible.
Class \Hyva\Checkout\Model\Component\AbstractAddressType
Method getComponentViewBlock is now abstract
As before, the method is also declared in the interface \Hyva\Checkout\Model\Component\AddressTypeInterface.
Now however, the getComponentViewBlock method is declared as abstract on AbstractAddressType, so any implementing class is required to implement it.
Example implementations can be found in the child classes AddressTypeBilling or AddressTypeShipping.
This will only impact you if you implement AbstractAddressType in custom code. In that case, you now will need to implement the method.
The previous default implementation simply returned false.
Class \Hyva\Checkout\Model\Form\AbstractEntityForm
Method __construct signature change
A new optional constructor argument $factories = [] was added as the last parameter.
If an implementation of AbstractEntityForm overrides the default constructor, the new argument needs to be added to the constructor signature and passed to the parent constructor.
Technically, the new argument is optional (it defaults to an empty array), but if it is empty, an undefined index exception will be thrown, so it needs to be present.
Method store removed
Previously this method was called by the frontend via Magewire to trigger state synchronization. The store method itself did nothing at all.
If code in your instance calls the method store on a form instance, the call can be removed without issues.
New abstract method populate
This will only affect custom implementations of AbstractEntityForm.
In this case, have a look at one of the implementations of the method in EavAttributeBillingAddressForm or EavAttributeShippingAddressForm.
The purpose of the method is to create all required form field elements and add them to the form instance.
New abstract method getTitle
As with populate, this change will only affect custom implementations of AbstractEntityForm.
The method simply returns the form name as an (untranslated) string.
Protected property entityFormFieldFactory removed
Instead of calling $this->entityFormFieldFactory->createField(...), use $this->createField(...) and pass the type of field to create as a fourth argument.
The possible field factory types are the array keys declared in etc/frontend/di.xml for the Hyva\Checkout\Model\Form\AbstractEntityForm argument factories, that is, one of elements, fields or eav_fields.
For example:
Protected property layout deprecated
The property remains present for backward compatibility. The reason it is deprecated is that referring to it in the form is a layer violation.
The form instance should not directly handle rendering. This should instead be handled by renderer blocks, Magewire components, or view models.
No action is required before upgrading, but should there be a custom form implementation in your instance, we recommend refactoring the code accordingly.
Protected property $fields renamed to $elements
This change will impact instances with custom form implementations extending from AbstractEntityForm.
Before the upgrade, change your code to create a temporary getter or setter that uses either $this->fields - if it is present, or $this->elements as a fallback.
For example:
public function myGetFields()
{
return property_exists($this, 'fields') ? $this->fields : $this->elements;
}
public function mySetField($key, $value)
{
if (property_exists($this, 'fields')) {
$this->fields[$key] = $value;
} else {
$this->elements[$key] = $value;
}
}
After the upgrade, the custom form implementation can be changed to refer to $this->elements directly, and the temporary getter and setter can be removed.
Interface \Hyva\Checkout\Model\Form\EntityFieldFactoryInterface renamed to EntityElementFactoryInterface
This change will affect any custom field factory implementation, or any custom form implementation that depends on the interface.
Should this be the case in your instance, be aware the required changes can not be done before the upgrade to keep your code compatible.
After the upgrade, change your code accordingly to use the new interface.
Class \Hyva\Checkout\Model\Form\EntityField\Config\EavAttributeMappingConfig
Method hasTooltip removed
Before the upgrade, plugins to this method have to be changed to use getTooltip instead, as the original method will no longer be called.
Custom code calling hasTooltip needs to be changed to use getTooltip and use the return value in a boolean context instead.
Interface \Hyva\Checkout\Model\Form\EntityField\EavAttributeMappingConfigInterface
Method getComment added
Before the upgrade, add this method to custom implementations of the interface.
Class \Hyva\Checkout\Model\Form\EntityField\EavEntityAddress\RegionAttributeField
Method setIsRequired removed
The isRequired method now returns $this->attribute->getIsRequired() || $this->getConfig()->getRequired(), so setting it via property is no longer possible.
Plugins to this method and custom code calling it need to be changed accordingly before the upgrade.
Class \Hyva\Checkout\Model\Form\EntityField\Renderer\Regular removed
The class is replaced by \Hyva\Checkout\Model\Form\EntityFormElement\Renderer\Element.
The method signatures also changed slightly, as the $form argument is no longer required.
The new renderer class also implements a new interface \Hyva\Checkout\Model\Form\EntityFormElement\RendererInterface instead of the old \Hyva\Checkout\Model\Form\EntityField\RendererInterface.
Class \Hyva\Checkout\Model\Form\EntityFormModifier\MagewireAddressModifier
Method applyCustomModificationsForField removed
Plugins to this method will no longer be triggered after the upgrade. Before the upgrade, implement the same customizations that were done in the plugin using the new form modifier API.
The same is true for custom code calling the method.
Method applyHyvaValidationApiModifications signature changed
Custom code calling the method as well as plugins to the method have to be changed accordingly after the upgrade.
Method withComponent removed
Plugins to this method will no longer be triggered after the upgrade.
Custom code calling the method will cease to function.
Change the code to use the new form modifier API, where the component can be received as an argument in specific hook method callbacks.
Class \Hyva\Checkout\Model\Form\EntityFormModifier\MagewireAuthenticationModifier
Method withEmail removed
Plugins to this method will no longer be triggered after the upgrade.
Custom code calling the method will cease to function.
Change the code to use the new form modifier API, where the field value can be retrieved by from the email form field.
Method withComponent removed
Plugins to this method will no longer be triggered after the upgrade.
Custom code calling the method will cease to function.
Change the code to use the new form modifier API, where the component can be received as an argument in specific hook method callbacks.
Class \Hyva\Checkout\ViewModel\Checkout\AddressView
Method __construct signature change
The constructor of the abstract class AddressView changed.
After the upgrade, all custom implementations overriding the constructor need to be changed to pass all required arguments to the parent.
Class \Hyva\Checkout\ViewModel\Checkout\AddressView\AbstractAddressList
Method __construct signature change
The constructor of the abstract class AbstractAddressList changed.
After the upgrade, all custom implementations overriding the constructor need to be changed to pass only the required arguments to the parent.
Interface \Hyva\Checkout\ViewModel\Checkout\AddressView\AddressListInterface
Method getAddressListItems signature changed
The return type changed from being not declared to array.
Any custom implementation not extending from \Hyva\Checkout\ViewModel\Checkout\AddressView\AbstractAddressList needs to be changed after the upgrade to match the new signature.
Interface \Hyva\Checkout\Model\Form\EntityFormFieldsFilterInterface removed
The interface was never used, so any custom implementations need to be changed to use a custom interface instead.
Interface \Hyva\Checkout\Model\Form\EntityField\RendererInterface deprecated
The new release introduces the concept of form elements, which are a superset of form fields.
Because of this change, the new interface Hyva\Checkout\Model\Form\EntityFormElement\RendererInterface was introduced as a replacement.
The old interface remains for backward compatibility, but because the signatures of the methods it defines are incompatible with the same methods in the new interface, it can no longer be used.
After the upgrade, and custom code referring to EntityField\RendererInterface has to be changed to refer to EntityFormElement\RendererInterface instead.