@alipay/ams-checkout 0.0.1725951289-dev.4 → 0.0.1726046231-dev.0

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.
Files changed (133) hide show
  1. package/dist/umd/ams-checkout.min.js +1 -1
  2. package/esm/config/index.d.ts +7 -7
  3. package/esm/config/index.js +7 -7
  4. package/esm/constant/index.d.ts +6 -8
  5. package/esm/constant/index.js +9 -81
  6. package/esm/core/bus/ability/globalData.d.ts +10 -0
  7. package/esm/core/bus/ability/globalData.js +89 -0
  8. package/esm/core/bus/ability/request.d.ts +10 -0
  9. package/esm/core/bus/ability/request.js +151 -0
  10. package/esm/core/bus/interface.d.ts +12 -0
  11. package/esm/core/bus/interface.js +16 -2
  12. package/esm/core/component/address.d.ts +2 -2
  13. package/esm/core/component/appPreloadProcessing.js +2 -0
  14. package/esm/core/component/ckp/index.d.ts +3 -3
  15. package/esm/core/component/ckp/index.js +3 -3
  16. package/esm/core/component/element/components/address.d.ts +17 -0
  17. package/esm/core/component/element/components/address.js +63 -0
  18. package/esm/core/component/element/components/auth.d.ts +17 -0
  19. package/esm/core/component/element/components/auth.js +54 -0
  20. package/esm/core/component/element/components/payment.d.ts +17 -0
  21. package/esm/core/component/element/components/payment.js +67 -0
  22. package/esm/core/component/element/index.d.ts +44 -0
  23. package/esm/core/component/element/index.js +615 -0
  24. package/esm/core/component/element/mock.d.ts +3 -0
  25. package/esm/core/component/element/mock.js +1156 -0
  26. package/esm/core/component/element/type.d.ts +120 -0
  27. package/esm/core/component/element/type.js +14 -0
  28. package/esm/core/component/element/utils.d.ts +13 -0
  29. package/esm/core/component/element/utils.js +6 -0
  30. package/esm/core/component/index.d.ts +5 -5
  31. package/esm/core/component/index.js +20 -16
  32. package/esm/core/drop-in/index.d.ts +2 -2
  33. package/esm/core/drop-in/index.js +2 -2
  34. package/esm/core/instance/index.d.ts +5 -6
  35. package/esm/core/instance/index.js +11 -14
  36. package/esm/foundation/core/index.d.ts +26 -0
  37. package/esm/foundation/core/index.js +301 -0
  38. package/esm/foundation/index.d.ts +71 -0
  39. package/esm/foundation/index.js +42 -0
  40. package/esm/foundation/product-processor/easysafepay/deps.d.ts +15 -0
  41. package/esm/foundation/product-processor/easysafepay/deps.js +9 -0
  42. package/esm/foundation/product-processor/easysafepay/index.d.ts +26 -0
  43. package/esm/foundation/product-processor/easysafepay/index.js +536 -0
  44. package/esm/foundation/service/container/index.d.ts +28 -0
  45. package/esm/foundation/service/container/index.js +255 -0
  46. package/esm/foundation/service/container/popup.d.ts +17 -0
  47. package/esm/foundation/service/container/popup.js +103 -0
  48. package/esm/foundation/service/container/utils.d.ts +7 -0
  49. package/esm/foundation/service/container/utils.js +48 -0
  50. package/esm/foundation/service/event-bus/ability/callback.d.ts +9 -0
  51. package/esm/foundation/service/event-bus/ability/callback.js +55 -0
  52. package/esm/foundation/service/event-bus/ability/globalData.d.ts +10 -0
  53. package/esm/foundation/service/event-bus/ability/globalData.js +89 -0
  54. package/esm/foundation/service/event-bus/ability/request.d.ts +10 -0
  55. package/esm/foundation/service/event-bus/ability/request.js +151 -0
  56. package/esm/foundation/service/event-bus/ability/security.d.ts +12 -0
  57. package/esm/foundation/service/event-bus/ability/security.js +151 -0
  58. package/esm/foundation/service/event-bus/ability/tracker.d.ts +9 -0
  59. package/esm/foundation/service/event-bus/ability/tracker.js +80 -0
  60. package/esm/foundation/service/event-bus/busManager.d.ts +127 -0
  61. package/esm/foundation/service/event-bus/busManager.js +398 -0
  62. package/esm/foundation/service/event-bus/index.d.ts +20 -0
  63. package/esm/foundation/service/event-bus/index.js +88 -0
  64. package/esm/foundation/service/event-center.d.ts +75 -0
  65. package/esm/foundation/service/event-center.js +244 -0
  66. package/esm/foundation/service/global-data/index.d.ts +11 -0
  67. package/esm/foundation/service/global-data/index.js +69 -0
  68. package/esm/foundation/service/index.d.ts +19 -0
  69. package/esm/foundation/service/index.js +82 -0
  70. package/esm/foundation/service/log/index.d.ts +43 -0
  71. package/esm/foundation/service/log/index.js +235 -0
  72. package/esm/foundation/service/log/types.d.ts +32 -0
  73. package/esm/foundation/service/log/types.js +1 -0
  74. package/esm/foundation/service/requester/deps.d.ts +17 -0
  75. package/esm/foundation/service/requester/deps.js +11 -0
  76. package/esm/foundation/service/requester/requester.d.ts +22 -0
  77. package/esm/foundation/service/requester/requester.js +211 -0
  78. package/esm/foundation/service/security/index.d.ts +26 -0
  79. package/esm/foundation/service/security/index.js +216 -0
  80. package/esm/{util → foundation/service/security}/security.d.ts +2 -2
  81. package/esm/{util → foundation/service/security}/security.js +3 -3
  82. package/esm/foundation/types/index.d.ts +4 -0
  83. package/esm/foundation/types/index.js +4 -0
  84. package/esm/foundation/utils/gray_scale_utils.d.ts +7 -0
  85. package/esm/foundation/utils/gray_scale_utils.js +40 -0
  86. package/esm/foundation/utils/payment_context_utils.d.ts +13 -0
  87. package/esm/foundation/utils/payment_context_utils.js +57 -0
  88. package/esm/foundation/utils/redirect_utils.d.ts +6 -0
  89. package/esm/foundation/utils/redirect_utils.js +99 -0
  90. package/esm/foundation/utils/system_events.d.ts +4 -0
  91. package/esm/foundation/utils/system_events.js +71 -0
  92. package/esm/foundation/utils/web_app_url_utils.d.ts +37 -0
  93. package/esm/foundation/utils/web_app_url_utils.js +97 -0
  94. package/esm/index.d.ts +16 -10
  95. package/esm/index.js +70 -59
  96. package/esm/plugin/applepay/component.js +3 -3
  97. package/esm/plugin/applepay/service.d.ts +2 -2
  98. package/esm/plugin/applepay/service.js +2 -2
  99. package/esm/plugin/component/cashierApp.d.ts +7 -5
  100. package/esm/plugin/component/cashierApp.js +16 -8
  101. package/esm/plugin/component/channel.d.ts +3 -4
  102. package/esm/plugin/component/channel.js +1 -37
  103. package/esm/plugin/component/component.inline.style.d.ts +4 -4
  104. package/esm/plugin/component/component.inline.style.js +10 -7
  105. package/esm/plugin/component/component.popup.style.d.ts +15 -6
  106. package/esm/plugin/component/component.popup.style.js +33 -15
  107. package/esm/plugin/component/index.d.ts +7 -8
  108. package/esm/plugin/component/index.js +130 -176
  109. package/esm/plugin/const.js +5 -5
  110. package/esm/plugin/drop-in/index.d.ts +5 -5
  111. package/esm/plugin/drop-in/index.js +7 -7
  112. package/esm/plugin/payment-element/utils.d.ts +1 -1
  113. package/esm/plugin/payment-element/utils.js +2 -1
  114. package/esm/plugin/type.d.ts +4 -4
  115. package/esm/service/element.d.ts +4 -0
  116. package/esm/service/element.js +51 -0
  117. package/esm/service/index.d.ts +1 -0
  118. package/esm/service/index.js +2 -0
  119. package/esm/types/index.d.ts +257 -39
  120. package/esm/types/index.js +107 -59
  121. package/esm/util/createIframeNode.d.ts +2 -2
  122. package/esm/util/createIframeNode.js +3 -3
  123. package/esm/util/index.d.ts +1 -1
  124. package/esm/util/index.js +3 -4
  125. package/package.json +2 -2
  126. package/esm/util/getBackScheme.d.ts +0 -5
  127. package/esm/util/getBackScheme.js +0 -42
  128. package/esm/util/ua/index.d.ts +0 -2
  129. package/esm/util/ua/index.js +0 -2
  130. package/esm/util/ua/isAndroid.d.ts +0 -4
  131. package/esm/util/ua/isAndroid.js +0 -7
  132. package/esm/util/ua/isIOS.d.ts +0 -4
  133. package/esm/util/ua/isIOS.js +0 -7
@@ -0,0 +1,63 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
4
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
5
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
7
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
+ import { AddressComponent } from "../../address";
9
+ export var ElementAddressComponent = /*#__PURE__*/function () {
10
+ function ElementAddressComponent() {
11
+ _classCallCheck(this, ElementAddressComponent);
12
+ _defineProperty(this, "sdk", void 0);
13
+ _defineProperty(this, "elementContainer", void 0);
14
+ }
15
+ _createClass(ElementAddressComponent, [{
16
+ key: "create",
17
+ value: function create(options) {
18
+ this.sdk = new AddressComponent({
19
+ environment: options.environment,
20
+ locale: options.locale,
21
+ appVersion: ''
22
+ });
23
+ }
24
+ }, {
25
+ key: "mount",
26
+ value: function mount(sessionData, options) {
27
+ var _this = this;
28
+ var elementContainer = document.querySelector(options.selector);
29
+ elementContainer.style.display = 'none';
30
+ var selector = options.selector.indexOf('#') === 0 ? options.selector.slice(1) : options.selector;
31
+ return new Promise(function (resolve) {
32
+ _this.sdk.mountComponent({
33
+ sessionData: sessionData,
34
+ debugProps: options.debugProps,
35
+ appendAliasContainerId: true
36
+ }, selector).then(function () {
37
+ var _elementContainer$get;
38
+ _this.elementContainer = elementContainer;
39
+ var iframes = elementContainer === null || elementContainer === void 0 || (_elementContainer$get = elementContainer.getElementsByTagName) === null || _elementContainer$get === void 0 ? void 0 : _elementContainer$get.call(elementContainer, 'iframe');
40
+ resolve(iframes === null || iframes === void 0 ? void 0 : iframes[0]);
41
+ });
42
+ });
43
+ }
44
+ }, {
45
+ key: "update",
46
+ value: function update() {
47
+ if (this.elementContainer) {
48
+ this.elementContainer.style.display = 'initial';
49
+ }
50
+ // 下发数据
51
+ }
52
+ }, {
53
+ key: "unmount",
54
+ value: function unmount() {
55
+ var _this$elementContaine, _this$elementContaine2;
56
+ var containers = (_this$elementContaine = this.elementContainer) === null || _this$elementContaine === void 0 || (_this$elementContaine2 = _this$elementContaine.getElementsByTagName) === null || _this$elementContaine2 === void 0 ? void 0 : _this$elementContaine2.call(_this$elementContaine, 'div');
57
+ if (containers[0]) {
58
+ containers[0].remove();
59
+ }
60
+ }
61
+ }]);
62
+ return ElementAddressComponent;
63
+ }();
@@ -0,0 +1,17 @@
1
+ import { LinkAuthMountOptions } from '../type';
2
+ interface ElementAuthMountOptions extends Omit<LinkAuthMountOptions, 'type' | 'debugProps'> {
3
+ selector: string;
4
+ url: string;
5
+ }
6
+ export declare class ElementAuthComponent {
7
+ private elementContainer;
8
+ constructor();
9
+ create(options: {
10
+ environment: string;
11
+ locale: string;
12
+ }): void;
13
+ mount(options: ElementAuthMountOptions): Promise<HTMLIFrameElement>;
14
+ update(height?: number): void;
15
+ unmount(): void;
16
+ }
17
+ export {};
@@ -0,0 +1,54 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
4
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
5
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
7
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
+ import { createIframe } from "../../../../foundation/service/container/utils";
9
+ import { createInlineBaseElement } from "../../../../plugin/component/component.inline.style";
10
+ export var ElementAuthComponent = /*#__PURE__*/function () {
11
+ function ElementAuthComponent() {
12
+ _classCallCheck(this, ElementAuthComponent);
13
+ _defineProperty(this, "elementContainer", void 0);
14
+ }
15
+ _createClass(ElementAuthComponent, [{
16
+ key: "create",
17
+ value: function create(options) {}
18
+ }, {
19
+ key: "mount",
20
+ value: function mount(options) {
21
+ var _this = this;
22
+ return new Promise(function (resolve) {
23
+ var selector = options.selector,
24
+ url = options.url;
25
+ var containerSelector = "antom-sdk-web-app-".concat(selector);
26
+ var container = createInlineBaseElement(selector);
27
+ var webApp = createIframe(containerSelector);
28
+ webApp.src = url;
29
+ container.appendChild(webApp);
30
+ _this.elementContainer = container;
31
+ resolve(webApp);
32
+ });
33
+ }
34
+ }, {
35
+ key: "update",
36
+ value: function update() {
37
+ var _this$elementContaine, _this$elementContaine2;
38
+ var height = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;
39
+ var iframes = (_this$elementContaine = this.elementContainer) === null || _this$elementContaine === void 0 || (_this$elementContaine2 = _this$elementContaine.getElementsByTagName) === null || _this$elementContaine2 === void 0 ? void 0 : _this$elementContaine2.call(_this$elementContaine, 'iframe');
40
+ if (iframes[0]) {
41
+ var iframe = iframes[0];
42
+ iframe.style.opacity = '1';
43
+ iframe.style.overflow = 'visible';
44
+ iframe.style.height = "".concat(height, "px");
45
+ }
46
+ }
47
+ }, {
48
+ key: "unmount",
49
+ value: function unmount() {
50
+ this.elementContainer.remove();
51
+ }
52
+ }]);
53
+ return ElementAuthComponent;
54
+ }();
@@ -0,0 +1,17 @@
1
+ import { PaymentMountOptions } from '../type';
2
+ interface ElementPaymentMountOptions extends Omit<PaymentMountOptions, 'type'> {
3
+ selector: string;
4
+ }
5
+ export declare class ElementPaymentComponent {
6
+ private sdk;
7
+ private elementContainer;
8
+ constructor();
9
+ create(options: {
10
+ environment: string;
11
+ locale: string;
12
+ }): void;
13
+ mount(sessionData: string, options: ElementPaymentMountOptions): Promise<HTMLIFrameElement>;
14
+ update(): void;
15
+ unmount(): void;
16
+ }
17
+ export {};
@@ -0,0 +1,67 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
4
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
5
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
7
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
+ import AMSPaymentElement from "../../../../index";
9
+ export var ElementPaymentComponent = /*#__PURE__*/function () {
10
+ function ElementPaymentComponent() {
11
+ _classCallCheck(this, ElementPaymentComponent);
12
+ _defineProperty(this, "sdk", void 0);
13
+ _defineProperty(this, "elementContainer", void 0);
14
+ }
15
+ _createClass(ElementPaymentComponent, [{
16
+ key: "create",
17
+ value: function create(options) {
18
+ this.sdk = new AMSPaymentElement({
19
+ environment: options.environment,
20
+ locale: options.locale,
21
+ analytics: {
22
+ enabled: true
23
+ },
24
+ onEventCallback: function onEventCallback(state) {}
25
+ });
26
+ }
27
+ }, {
28
+ key: "mount",
29
+ value: function mount(sessionData, options) {
30
+ var _this = this;
31
+ var elementContainer = document.querySelector(options.selector);
32
+ elementContainer.style.display = 'none';
33
+ var selector = options.selector.indexOf('#') === 0 ? options.selector.slice(1) : options.selector;
34
+ return new Promise(function (resolve) {
35
+ _this.sdk.mountComponent({
36
+ sessionData: sessionData,
37
+ debugProps: options.debugProps,
38
+ notRedirectAfterComplete: true,
39
+ appendAliasContainerId: true
40
+ }, selector).then(function () {
41
+ var _elementContainer$get;
42
+ _this.elementContainer = elementContainer;
43
+ var iframes = elementContainer === null || elementContainer === void 0 || (_elementContainer$get = elementContainer.getElementsByTagName) === null || _elementContainer$get === void 0 ? void 0 : _elementContainer$get.call(elementContainer, 'iframe');
44
+ resolve(iframes === null || iframes === void 0 ? void 0 : iframes[0]);
45
+ });
46
+ });
47
+ }
48
+ }, {
49
+ key: "update",
50
+ value: function update() {
51
+ if (this.elementContainer) {
52
+ this.elementContainer.style.display = 'initial';
53
+ }
54
+ // 下发数据
55
+ }
56
+ }, {
57
+ key: "unmount",
58
+ value: function unmount() {
59
+ var _this$elementContaine, _this$elementContaine2;
60
+ var containers = (_this$elementContaine = this.elementContainer) === null || _this$elementContaine === void 0 || (_this$elementContaine2 = _this$elementContaine.getElementsByTagName) === null || _this$elementContaine2 === void 0 ? void 0 : _this$elementContaine2.call(_this$elementContaine, 'div');
61
+ if (containers[0]) {
62
+ containers[0].remove();
63
+ }
64
+ }
65
+ }]);
66
+ return ElementPaymentComponent;
67
+ }();
@@ -0,0 +1,44 @@
1
+ import { IElementOptions } from '../../../types';
2
+ import type { AddressMountOptions, AddressMountResult, LinkAuthMountOptions, LinkAuthMountResult, PaymentMountOptions, PaymentMountResult, SubmitFuncResult } from './type';
3
+ export declare class ElementComponent {
4
+ private parseData;
5
+ private loading;
6
+ private sessionData;
7
+ private elementContainer;
8
+ private authBase;
9
+ private addressBase;
10
+ private paymentBase;
11
+ private _options;
12
+ private eventService;
13
+ private requestService;
14
+ private sdkActionRes;
15
+ private oneAccountRes;
16
+ private launchSource;
17
+ private mountOptions;
18
+ private iframes;
19
+ private componentsCount;
20
+ private eventCallback;
21
+ constructor(options: IElementOptions);
22
+ private launchFunc;
23
+ private sdkActionQuery;
24
+ private oneAccountQuery;
25
+ private sendRenderData;
26
+ private addListener;
27
+ private removeListener;
28
+ private createElement;
29
+ private registerEventListener;
30
+ private mountAuth;
31
+ private mountAddress;
32
+ private mountPayment;
33
+ mount(renderOptions: AddressMountOptions, sdkSelector: string): AddressMountResult;
34
+ mount(renderOptions: PaymentMountOptions, sdkSelector: string): PaymentMountResult;
35
+ mount(renderOptions: LinkAuthMountOptions, sdkSelector: string): LinkAuthMountResult;
36
+ private removeSdk;
37
+ unmount(): void;
38
+ private onValidateFunc;
39
+ private onAfterSubmitFunc;
40
+ private onSubmitRiskFunc;
41
+ private onSubmit;
42
+ private validatePromiseFuncs;
43
+ submitPayment(): Promise<SubmitFuncResult>;
44
+ }