Version Description
Download this release
Release Info
Developer | aljullu |
Plugin | WooCommerce Gutenberg Products Block |
Version | 4.4.3 |
Comparing to | |
See all releases |
Code changes from version 5.5.0 to 4.4.3
- LICENSE +0 -674
- assets/css/abstracts/_colors.scss +0 -1
- assets/css/abstracts/_mixins.scss +0 -1
- assets/css/editor.scss +5 -11
- assets/css/style.scss +0 -3
- assets/img/avatar.jpg +0 -0
- {images/previews → assets/img}/beanie.jpg +0 -0
- assets/img/block-error.svg +2727 -0
- {images/previews → assets/img}/cap.jpg +0 -0
- {images/previews → assets/img}/collection.jpg +0 -0
- assets/img/grid.svg +50 -0
- assets/img/no-matching-products.svg +1 -0
- assets/img/no-products.svg +1 -0
- {images → assets/img}/payment-methods/alipay.svg +0 -0
- {images → assets/img}/payment-methods/amex.svg +0 -0
- {images → assets/img}/payment-methods/bancontact.svg +0 -0
- {images → assets/img}/payment-methods/diners.svg +0 -0
- {images → assets/img}/payment-methods/discover.svg +0 -0
- {images → assets/img}/payment-methods/eps.svg +0 -0
- {images → assets/img}/payment-methods/giropay.svg +0 -0
- {images → assets/img}/payment-methods/ideal.svg +0 -0
- {images → assets/img}/payment-methods/jcb.svg +0 -0
- {images → assets/img}/payment-methods/laser.svg +0 -0
- {images → assets/img}/payment-methods/maestro.svg +0 -0
- {images → assets/img}/payment-methods/mastercard.svg +0 -0
- {images → assets/img}/payment-methods/multibanco.svg +0 -0
- {images → assets/img}/payment-methods/p24.svg +0 -0
- {images → assets/img}/payment-methods/sepa.svg +0 -0
- {images → assets/img}/payment-methods/sofort.svg +0 -0
- {images → assets/img}/payment-methods/unionpay.svg +0 -0
- {images → assets/img}/payment-methods/visa.svg +0 -0
- {images → assets/img}/payment-methods/wechat.svg +0 -0
- {images/previews → assets/img}/pennant.jpg +0 -0
- assets/img/single-product-preview.svg +5 -0
- assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-select-control.js +2 -4
- assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js +5 -29
- assets/js/atomic/blocks/product-elements/button/block.js +16 -14
- assets/js/atomic/blocks/product-elements/image/block.js +2 -9
- assets/js/atomic/blocks/product-elements/rating/block.js +1 -1
- assets/js/atomic/blocks/product-elements/summary/block.js +4 -2
- assets/js/atomic/blocks/product-elements/title/block.js +0 -7
- assets/js/atomic/utils/index.js +5 -4
- assets/js/atomic/utils/render-inner-blocks.js +69 -0
- assets/js/atomic/utils/render-parent-block.js +41 -0
- assets/js/atomic/utils/render-parent-block.tsx +0 -126
- assets/js/base/components/block-error-boundary/block-error.js +2 -12
- assets/js/base/components/block-error-boundary/index.js +0 -2
- assets/js/base/components/block-error-boundary/style.scss +18 -15
- assets/js/base/components/button/index.js +55 -0
- assets/js/base/components/button/index.tsx +0 -48
- assets/js/base/components/button/style.scss +39 -1
- assets/js/base/components/cart-checkout/address-form/{address-form.tsx → address-form.js} +26 -50
- assets/js/base/components/cart-checkout/address-form/country-address-fields.js +546 -0
- assets/js/{settings/shared/default-address-fields.ts → base/components/cart-checkout/address-form/default-address-fields.js} +23 -73
- assets/js/base/components/cart-checkout/address-form/index.js +3 -0
- assets/js/base/components/cart-checkout/address-form/index.ts +0 -1
- assets/js/base/components/cart-checkout/address-form/prepare-address-fields.ts +0 -131
- assets/js/base/components/cart-checkout/address-form/test/index.js +1 -4
- assets/js/base/components/cart-checkout/index.js +0 -1
- assets/js/base/components/cart-checkout/order-summary/index.js +0 -1
- assets/js/base/components/cart-checkout/order-summary/order-summary-item.js +15 -77
- assets/js/base/components/cart-checkout/order-summary/style.scss +3 -14
- assets/js/base/components/cart-checkout/order-summary/test/index.js +0 -43
- assets/js/base/components/cart-checkout/payment-method-icons/common-icons.js +20 -20
- assets/js/base/components/cart-checkout/place-order-button/index.js +2 -6
- assets/js/base/components/cart-checkout/policies/{index.tsx → index.js} +1 -1
- assets/js/base/components/cart-checkout/product-backorder-badge/{index.tsx → index.js} +1 -1
- assets/js/base/components/cart-checkout/product-badge/{index.tsx → index.js} +6 -9
- assets/js/base/components/cart-checkout/product-details/{index.tsx → index.js} +13 -8
- assets/js/base/components/cart-checkout/product-details/style.scss +0 -4
- assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js} +10 -5
- assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js} +7 -7
- assets/js/base/components/cart-checkout/product-metadata/{index.tsx → index.js} +14 -10
- assets/js/base/components/cart-checkout/product-sale-badge/index.js +50 -0
- assets/js/base/components/cart-checkout/product-sale-badge/index.tsx +0 -62
- assets/js/base/components/cart-checkout/product-summary/{index.tsx → index.js} +10 -8
- assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js} +8 -7
- assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js} +8 -10
- assets/js/base/components/cart-checkout/shipping-location/index.js +67 -0
- assets/js/base/components/cart-checkout/shipping-location/index.tsx +0 -70
- assets/js/base/components/cart-checkout/shipping-rates-control-package/render-package-rate-option.tsx +0 -46
- assets/js/base/components/cart-checkout/shipping-rates-control-package/style.scss +0 -43
- assets/js/base/components/cart-checkout/shipping-rates-control/{index.tsx → index.js} +65 -94
- assets/js/base/components/cart-checkout/totals/coupon/index.js +7 -7
- assets/js/base/components/cart-checkout/totals/coupon/style.scss +7 -17
- assets/js/base/components/cart-checkout/totals/discount/index.js +32 -48
- assets/js/base/components/cart-checkout/totals/discount/style.scss +0 -4
- assets/js/base/components/cart-checkout/totals/footer-item/index.js +15 -23
- assets/js/base/components/cart-checkout/totals/footer-item/style.scss +1 -1
- assets/js/base/components/cart-checkout/totals/footer-item/test/__snapshots__/index.js.snap +0 -79
- assets/js/base/components/cart-checkout/totals/footer-item/test/index.js +0 -81
- assets/js/base/components/cart-checkout/totals/shipping/{index.tsx → index.js} +101 -128
- assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx +0 -17
- assets/js/base/components/cart-checkout/totals/shipping/style.scss +13 -9
- assets/js/base/components/checkbox-control/style.scss +1 -8
- assets/js/base/components/checkbox-list/index.js +2 -2
- assets/js/base/components/chip/stories/index.js +0 -42
- assets/js/base/components/country-input/CountryInputProps.ts +0 -15
- assets/js/base/components/country-input/billing-country-input.js +23 -0
- assets/js/base/components/country-input/billing-country-input.tsx +0 -16
- assets/js/base/components/country-input/{country-input.tsx → country-input.js} +14 -2
- assets/js/base/components/country-input/{index.ts → index.js} +0 -0
- assets/js/base/components/country-input/shipping-country-input.js +23 -0
- assets/js/base/components/country-input/shipping-country-input.tsx +0 -16
- assets/js/base/components/dropdown-selector/index.js +1 -1
- assets/js/base/components/dropdown-selector/menu.js +1 -1
- assets/js/base/components/dropdown-selector/selected-chip.js +1 -1
- assets/js/base/components/filter-submit-button/index.js +1 -1
- assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js} +20 -33
- assets/js/base/components/label/{index.tsx → index.js} +15 -10
- assets/js/base/components/loading-mask/index.js +17 -16
- assets/js/base/components/loading-mask/style.scss +3 -4
- assets/js/base/components/payment-methods/express-payment-methods.js +86 -0
- assets/js/base/components/payment-methods/express-payment/cart-express-payment.js +47 -0
- assets/js/base/components/payment-methods/express-payment/checkout-express-payment.js +78 -0
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/index.js +0 -0
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/style.scss +0 -0
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/index.js +0 -0
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js +0 -0
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss +0 -0
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-card.js +0 -0
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js +2 -2
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-options.js +9 -6
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-methods.js +1 -1
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js +15 -36
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss +27 -24
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/test/payment-methods.js +8 -11
- assets/js/base/components/price-slider/index.js +4 -6
- assets/js/base/components/price-slider/style.scss +6 -6
- assets/js/base/components/{product-list/product-list-item → product-list-item}/index.js +0 -0
- assets/js/base/components/{product-list/product-list-item → product-list-item}/utils.js +0 -0
- assets/js/base/components/product-list/container.js +1 -6
- assets/js/base/components/product-list/product-list.js +12 -32
- assets/js/base/components/product-list/style.scss +0 -5
- assets/js/base/components/product-name/index.js +39 -0
- assets/js/base/components/product-name/index.tsx +0 -48
- assets/js/base/components/product-name/test/__snapshots__/index.js.snap +12 -24
- assets/js/base/components/product-price/index.js +53 -71
- assets/js/base/components/product-price/test/__snapshots__/index.js.snap +0 -57
- assets/js/base/components/product-price/test/index.js +0 -63
- assets/js/base/components/{product-list/product-sort-select → product-sort-select}/index.js +0 -0
- assets/js/base/components/{product-list/product-sort-select → product-sort-select}/style.scss +0 -0
- assets/js/base/components/quantity-selector/{index.tsx → index.js} +17 -19
- assets/js/base/components/quantity-selector/style.scss +2 -15
- assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js} +5 -11
- assets/js/base/components/radio-control/style.scss +3 -10
- assets/js/base/components/reviews/review-list-item/index.js +1 -1
- assets/js/base/components/reviews/review-list/index.js +6 -5
- assets/js/base/components/select/index.js +60 -1
- assets/js/base/components/select/select.js +0 -60
- assets/js/base/components/select/style.scss +3 -28
- assets/js/base/components/select/validated.js +3 -5
- assets/js/base/components/sidebar-layout/style.scss +7 -12
- assets/js/base/components/spinner/index.tsx +0 -10
- assets/js/base/components/spinner/style.scss +0 -37
- assets/js/base/components/state-input/StateInputProps.ts +0 -15
- assets/js/base/components/state-input/billing-state-input.js +23 -0
- assets/js/base/components/state-input/billing-state-input.tsx +0 -16
- assets/js/base/components/state-input/{index.ts → index.js} +0 -0
- assets/js/base/components/state-input/shipping-state-input.js +23 -0
- assets/js/base/components/state-input/shipping-state-input.tsx +0 -16
- assets/js/base/components/state-input/{state-input.tsx → state-input.js} +18 -2
- assets/js/base/components/store-notices-container/index.js +2 -0
- assets/js/base/components/store-notices-container/snackbar-notices.js +29 -0
- assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js +3 -1
- assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/style.scss +21 -0
- assets/js/base/components/summary/{index.tsx → index.js} +1 -8
- assets/js/base/components/text-input/{index.ts → index.js} +0 -0
- assets/js/base/components/text-input/style.scss +0 -20
- assets/js/base/components/text-input/{text-input.tsx → text-input.js} +21 -26
- assets/js/base/components/text-input/{validated-text-input.tsx → validated-text-input.js} +29 -58
- assets/js/base/components/title/index.js +1 -1
- assets/js/base/components/title/style.scss +0 -2
- assets/js/base/{context/providers/validation/components → components/validation}/index.js +0 -0
- assets/js/base/{context/providers/validation/components/validation-input-error → components/validation}/style.scss +0 -0
- assets/js/base/{context/providers/validation/components/validation-input-error/index.js → components/validation/validation-input-error.js} +2 -5
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/actions.js +0 -0
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/constants.js +0 -0
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/event-emit.js +9 -3
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/index.js +34 -37
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/reducer.js +0 -0
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/index.js +1 -1
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/submit/index.js +4 -3
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/index.js +0 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js +0 -0
- assets/js/base/context/cart-checkout/checkout-state/actions.js +82 -0
- assets/js/base/context/cart-checkout/checkout-state/constants.js +51 -0
- assets/js/base/context/cart-checkout/checkout-state/event-emit.js +53 -0
- assets/js/base/context/{providers/cart-checkout/checkout-state/index.tsx → cart-checkout/checkout-state/index.js} +132 -140
- assets/js/base/context/cart-checkout/checkout-state/reducer.js +235 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/index.js +2 -2
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js +19 -34
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/utils.js +0 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/customer/index.js +1 -5
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js +0 -0
- assets/js/base/context/cart-checkout/payment-methods/actions.js +111 -0
- assets/js/base/context/{providers/cart-checkout/payment-methods/constants.ts → cart-checkout/payment-methods/constants.js} +35 -30
- assets/js/base/context/cart-checkout/payment-methods/event-emit.js +41 -0
- assets/js/base/context/{providers/cart-checkout/payment-methods/index.ts → cart-checkout/payment-methods/index.js} +0 -0
- assets/js/base/context/cart-checkout/payment-methods/payment-method-data-context.js +469 -0
- assets/js/base/context/cart-checkout/payment-methods/reducer.js +131 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/payment-methods/test/payment-method-data-context.js +6 -12
- assets/js/base/context/{providers/cart-checkout/payment-methods/use-payment-method-registration.ts → cart-checkout/payment-methods/use-payment-method-registration.js} +42 -58
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/constants.js +0 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/event-emit.js +3 -3
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/index.js +10 -12
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/reducers.js +0 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/utils.js +0 -0
- assets/js/base/context/{providers/container-width-context.js → container-width-context.js} +0 -0
- assets/js/base/context/{providers/editor-context.js → editor/index.js} +1 -13
- assets/js/base/context/event-emit/emitter-callback.ts +0 -16
- assets/js/base/context/event-emit/reducer.ts +0 -65
- assets/js/base/context/event-emit/types.ts +0 -18
- assets/js/base/context/event-emit/utils.ts +0 -15
- assets/js/base/context/hooks/cart/use-store-cart-item-quantity.ts +0 -146
- assets/js/base/context/hooks/collections/index.js +0 -3
- assets/js/base/context/hooks/index.js +0 -14
- assets/js/base/context/hooks/payment-methods/use-payment-methods.js +0 -35
- assets/js/base/context/hooks/payment-methods/utils.ts +0 -85
- assets/js/base/context/hooks/test/use-store-snackbar-notices.js +0 -51
- assets/js/base/context/hooks/use-emit-response.ts +0 -66
- assets/js/base/context/hooks/use-store-events.ts +0 -66
- assets/js/base/context/hooks/use-store-snackbar-notices.js +0 -52
- assets/js/base/context/index.js +7 -0
- assets/js/base/context/index.ts +0 -3
- assets/js/base/context/providers/cart-checkout/checkout-state/actions.ts +0 -110
- assets/js/base/context/providers/cart-checkout/checkout-state/constants.ts +0 -84
- assets/js/base/context/providers/cart-checkout/checkout-state/event-emit.ts +0 -62
- assets/js/base/context/providers/cart-checkout/checkout-state/reducer.ts +0 -197
- assets/js/base/context/providers/cart-checkout/checkout-state/types.ts +0 -103
- assets/js/base/context/providers/cart-checkout/checkout-state/utils.ts +0 -63
- assets/js/base/context/providers/cart-checkout/payment-methods/actions.ts +0 -78
- assets/js/base/context/providers/cart-checkout/payment-methods/event-emit.ts +0 -49
- assets/js/base/context/providers/cart-checkout/payment-methods/payment-method-data-context.tsx +0 -355
- assets/js/base/context/providers/cart-checkout/payment-methods/reducer.ts +0 -120
- assets/js/base/context/providers/cart-checkout/payment-methods/types.ts +0 -161
- assets/js/base/context/providers/cart-checkout/payment-methods/use-active-payment-method.ts +0 -38
- assets/js/base/context/providers/cart-checkout/payment-methods/use-payment-method-dispatchers.ts +0 -105
- assets/js/base/context/providers/cart-checkout/payment-methods/utils.ts +0 -43
- assets/js/base/context/providers/index.js +0 -9
- assets/js/base/context/providers/store-notices/index.js +0 -2
- assets/js/base/context/providers/store-snackbar-notices/components/snackbar-notices-container.js +0 -41
- assets/js/base/context/providers/store-snackbar-notices/components/style.scss +0 -20
- assets/js/base/context/providers/store-snackbar-notices/context.js +0 -125
- assets/js/base/context/providers/store-snackbar-notices/index.ts +0 -1
- assets/js/base/context/providers/validation/index.js +0 -2
- assets/js/base/context/{providers/query-state-context.js → query-state-context.js} +0 -0
- assets/js/base/context/shared/event-emit/emitter-callback.js +15 -0
- assets/js/base/context/{event-emit/emitters.ts → shared/event-emit/emitters.js} +27 -41
- assets/js/base/context/{event-emit/index.ts → shared/event-emit/index.js} +0 -1
- assets/js/base/context/shared/event-emit/reducer.js +61 -0
- assets/js/base/context/{event-emit → shared/event-emit}/test/emitters.js +8 -14
- assets/js/base/context/shared/index.js +2 -0
- assets/js/base/context/{providers/validation/context.js → shared/validation/index.js} +0 -0
- assets/js/base/context/{providers/store-notices/context.js → store-notices-context.js} +22 -17
- assets/js/base/context/test/utils.js +13 -24
- assets/js/base/{context/hooks/cart/index.ts → hooks/cart/index.js} +0 -0
- assets/js/base/{context/hooks → hooks}/cart/test/use-store-cart-item-quantity.js +5 -5
- assets/js/base/{context/hooks → hooks}/cart/test/use-store-cart.js +6 -9
- assets/js/base/{context/hooks/cart/use-store-cart-coupons.ts → hooks/cart/use-store-cart-coupons.js} +8 -18
- assets/js/base/hooks/cart/use-store-cart-item-quantity.js +131 -0
- assets/js/base/{context/hooks/cart/use-store-cart.ts → hooks/cart/use-store-cart.js} +19 -95
- assets/js/base/hooks/checkout/index.js +5 -0
- assets/js/base/hooks/checkout/test/use-checkout-redirect-url.js +74 -0
- assets/js/base/{context/hooks → hooks/checkout}/test/use-checkout-submit.js +2 -11
- assets/js/base/{context/hooks → hooks/checkout}/use-checkout-address.js +5 -15
- assets/js/base/{context/hooks → hooks/checkout}/use-checkout-notices.js +0 -0
- assets/js/base/hooks/checkout/use-checkout-redirect-url.js +16 -0
- assets/js/base/{context/hooks → hooks/checkout}/use-checkout-submit.js +9 -13
- assets/js/base/hooks/checkout/use-emit-response.js +59 -0
- assets/js/base/hooks/customer/index.js +1 -0
- assets/js/base/{context/hooks/use-customer-data.ts → hooks/customer/use-customer-data.js} +8 -65
- assets/js/base/hooks/customer/utils.js +23 -0
- assets/js/base/hooks/index.js +13 -1
- assets/js/base/{context/hooks → hooks}/payment-methods/index.js +0 -0
- assets/js/base/{context/hooks → hooks}/payment-methods/test/use-payment-method-interface.js +1 -6
- assets/js/base/{context/hooks/payment-methods/use-payment-method-interface.ts → hooks/payment-methods/use-payment-method-interface.js} +107 -73
- assets/js/base/hooks/payment-methods/use-payment-methods.js +22 -0
- assets/js/base/{context/hooks → hooks}/shipping/index.js +0 -0
- assets/js/base/{context/hooks/shipping/use-select-shipping-rate.ts → hooks/shipping/use-select-shipping-rate.js} +7 -22
- assets/js/base/{context/hooks/shipping/use-select-shipping-rates.ts → hooks/shipping/use-select-shipping-rates.js} +10 -19
- assets/js/base/{context/hooks/collections → hooks}/test/use-collection.js +0 -0
- assets/js/base/{context/hooks → hooks}/test/use-query-state.js +0 -0
- assets/js/base/hooks/test/use-shallow-equal.js +19 -37
- assets/js/base/{context/hooks → hooks}/test/use-store-notices.js +12 -2
- assets/js/base/{context/hooks → hooks}/test/use-store-products.js +0 -0
- assets/js/base/{context/hooks/collections → hooks}/use-collection-data.js +3 -3
- assets/js/base/{context/hooks/collections → hooks}/use-collection-header.js +5 -1
- assets/js/base/{context/hooks/collections → hooks}/use-collection.js +6 -1
- assets/js/base/hooks/{use-container-queries.ts → use-container-queries.js} +1 -1
- assets/js/base/hooks/use-local-storage-state.ts +0 -36
- assets/js/base/hooks/{use-previous.ts → use-previous.js} +3 -9
- assets/js/base/{context/hooks → hooks}/use-query-state.js +3 -3
- assets/js/base/hooks/{use-shallow-equal.ts → use-shallow-equal.js} +5 -4
- assets/js/base/{context/hooks/use-store-add-to-cart.ts → hooks/use-store-add-to-cart.js} +8 -16
- assets/js/base/{context/hooks → hooks}/use-store-notices.js +6 -6
- assets/js/base/{context/hooks → hooks}/use-store-products.js +2 -1
- assets/js/base/hooks/{use-throw-error.ts → use-throw-error.js} +11 -6
- assets/js/base/hooks/use-trigger-fragment-refresh.js +22 -0
- assets/js/base/utils/address.js +23 -0
- assets/js/base/utils/address.ts +0 -85
- assets/js/base/utils/derive-selected-shipping-rates.js +12 -13
- assets/js/base/utils/from-entries-polyfill.ts +0 -13
- assets/js/base/utils/index.js +0 -1
- assets/js/base/utils/legacy-events.js +1 -11
- assets/js/base/utils/test/address.ts +0 -24
- assets/js/blocks-registry/payment-methods/payment-method-config.js +0 -10
- assets/js/blocks/active-filters/active-attribute-filters.js +1 -4
- assets/js/blocks/active-filters/block.js +1 -1
- assets/js/blocks/active-filters/style.scss +13 -3
- assets/js/blocks/active-filters/utils.js +1 -36
- assets/js/blocks/attribute-filter/block.js +6 -5
- assets/js/blocks/attribute-filter/edit.js +12 -13
- assets/js/blocks/attribute-filter/label.js +1 -1
- assets/js/blocks/cart-checkout/cart/attributes.js +6 -7
- assets/js/blocks/cart-checkout/cart/block.js +1 -1
- assets/js/blocks/cart-checkout/cart/checkout-button/index.js +12 -8
- assets/js/blocks/cart-checkout/cart/edit.js +3 -30
- assets/js/blocks/cart-checkout/cart/empty-cart-edit/index.js +61 -64
- assets/js/blocks/cart-checkout/cart/frontend.js +21 -19
- assets/js/blocks/cart-checkout/cart/full-cart/{cart-line-item-row.tsx → cart-line-item-row.js} +18 -108
LICENSE
DELETED
@@ -1,674 +0,0 @@
|
|
1 |
-
GNU GENERAL PUBLIC LICENSE
|
2 |
-
Version 3, 29 June 2007
|
3 |
-
|
4 |
-
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
5 |
-
Everyone is permitted to copy and distribute verbatim copies
|
6 |
-
of this license document, but changing it is not allowed.
|
7 |
-
|
8 |
-
Preamble
|
9 |
-
|
10 |
-
The GNU General Public License is a free, copyleft license for
|
11 |
-
software and other kinds of works.
|
12 |
-
|
13 |
-
The licenses for most software and other practical works are designed
|
14 |
-
to take away your freedom to share and change the works. By contrast,
|
15 |
-
the GNU General Public License is intended to guarantee your freedom to
|
16 |
-
share and change all versions of a program--to make sure it remains free
|
17 |
-
software for all its users. We, the Free Software Foundation, use the
|
18 |
-
GNU General Public License for most of our software; it applies also to
|
19 |
-
any other work released this way by its authors. You can apply it to
|
20 |
-
your programs, too.
|
21 |
-
|
22 |
-
When we speak of free software, we are referring to freedom, not
|
23 |
-
price. Our General Public Licenses are designed to make sure that you
|
24 |
-
have the freedom to distribute copies of free software (and charge for
|
25 |
-
them if you wish), that you receive source code or can get it if you
|
26 |
-
want it, that you can change the software or use pieces of it in new
|
27 |
-
free programs, and that you know you can do these things.
|
28 |
-
|
29 |
-
To protect your rights, we need to prevent others from denying you
|
30 |
-
these rights or asking you to surrender the rights. Therefore, you have
|
31 |
-
certain responsibilities if you distribute copies of the software, or if
|
32 |
-
you modify it: responsibilities to respect the freedom of others.
|
33 |
-
|
34 |
-
For example, if you distribute copies of such a program, whether
|
35 |
-
gratis or for a fee, you must pass on to the recipients the same
|
36 |
-
freedoms that you received. You must make sure that they, too, receive
|
37 |
-
or can get the source code. And you must show them these terms so they
|
38 |
-
know their rights.
|
39 |
-
|
40 |
-
Developers that use the GNU GPL protect your rights with two steps:
|
41 |
-
(1) assert copyright on the software, and (2) offer you this License
|
42 |
-
giving you legal permission to copy, distribute and/or modify it.
|
43 |
-
|
44 |
-
For the developers' and authors' protection, the GPL clearly explains
|
45 |
-
that there is no warranty for this free software. For both users' and
|
46 |
-
authors' sake, the GPL requires that modified versions be marked as
|
47 |
-
changed, so that their problems will not be attributed erroneously to
|
48 |
-
authors of previous versions.
|
49 |
-
|
50 |
-
Some devices are designed to deny users access to install or run
|
51 |
-
modified versions of the software inside them, although the manufacturer
|
52 |
-
can do so. This is fundamentally incompatible with the aim of
|
53 |
-
protecting users' freedom to change the software. The systematic
|
54 |
-
pattern of such abuse occurs in the area of products for individuals to
|
55 |
-
use, which is precisely where it is most unacceptable. Therefore, we
|
56 |
-
have designed this version of the GPL to prohibit the practice for those
|
57 |
-
products. If such problems arise substantially in other domains, we
|
58 |
-
stand ready to extend this provision to those domains in future versions
|
59 |
-
of the GPL, as needed to protect the freedom of users.
|
60 |
-
|
61 |
-
Finally, every program is threatened constantly by software patents.
|
62 |
-
States should not allow patents to restrict development and use of
|
63 |
-
software on general-purpose computers, but in those that do, we wish to
|
64 |
-
avoid the special danger that patents applied to a free program could
|
65 |
-
make it effectively proprietary. To prevent this, the GPL assures that
|
66 |
-
patents cannot be used to render the program non-free.
|
67 |
-
|
68 |
-
The precise terms and conditions for copying, distribution and
|
69 |
-
modification follow.
|
70 |
-
|
71 |
-
TERMS AND CONDITIONS
|
72 |
-
|
73 |
-
0. Definitions.
|
74 |
-
|
75 |
-
"This License" refers to version 3 of the GNU General Public License.
|
76 |
-
|
77 |
-
"Copyright" also means copyright-like laws that apply to other kinds of
|
78 |
-
works, such as semiconductor masks.
|
79 |
-
|
80 |
-
"The Program" refers to any copyrightable work licensed under this
|
81 |
-
License. Each licensee is addressed as "you". "Licensees" and
|
82 |
-
"recipients" may be individuals or organizations.
|
83 |
-
|
84 |
-
To "modify" a work means to copy from or adapt all or part of the work
|
85 |
-
in a fashion requiring copyright permission, other than the making of an
|
86 |
-
exact copy. The resulting work is called a "modified version" of the
|
87 |
-
earlier work or a work "based on" the earlier work.
|
88 |
-
|
89 |
-
A "covered work" means either the unmodified Program or a work based
|
90 |
-
on the Program.
|
91 |
-
|
92 |
-
To "propagate" a work means to do anything with it that, without
|
93 |
-
permission, would make you directly or secondarily liable for
|
94 |
-
infringement under applicable copyright law, except executing it on a
|
95 |
-
computer or modifying a private copy. Propagation includes copying,
|
96 |
-
distribution (with or without modification), making available to the
|
97 |
-
public, and in some countries other activities as well.
|
98 |
-
|
99 |
-
To "convey" a work means any kind of propagation that enables other
|
100 |
-
parties to make or receive copies. Mere interaction with a user through
|
101 |
-
a computer network, with no transfer of a copy, is not conveying.
|
102 |
-
|
103 |
-
An interactive user interface displays "Appropriate Legal Notices"
|
104 |
-
to the extent that it includes a convenient and prominently visible
|
105 |
-
feature that (1) displays an appropriate copyright notice, and (2)
|
106 |
-
tells the user that there is no warranty for the work (except to the
|
107 |
-
extent that warranties are provided), that licensees may convey the
|
108 |
-
work under this License, and how to view a copy of this License. If
|
109 |
-
the interface presents a list of user commands or options, such as a
|
110 |
-
menu, a prominent item in the list meets this criterion.
|
111 |
-
|
112 |
-
1. Source Code.
|
113 |
-
|
114 |
-
The "source code" for a work means the preferred form of the work
|
115 |
-
for making modifications to it. "Object code" means any non-source
|
116 |
-
form of a work.
|
117 |
-
|
118 |
-
A "Standard Interface" means an interface that either is an official
|
119 |
-
standard defined by a recognized standards body, or, in the case of
|
120 |
-
interfaces specified for a particular programming language, one that
|
121 |
-
is widely used among developers working in that language.
|
122 |
-
|
123 |
-
The "System Libraries" of an executable work include anything, other
|
124 |
-
than the work as a whole, that (a) is included in the normal form of
|
125 |
-
packaging a Major Component, but which is not part of that Major
|
126 |
-
Component, and (b) serves only to enable use of the work with that
|
127 |
-
Major Component, or to implement a Standard Interface for which an
|
128 |
-
implementation is available to the public in source code form. A
|
129 |
-
"Major Component", in this context, means a major essential component
|
130 |
-
(kernel, window system, and so on) of the specific operating system
|
131 |
-
(if any) on which the executable work runs, or a compiler used to
|
132 |
-
produce the work, or an object code interpreter used to run it.
|
133 |
-
|
134 |
-
The "Corresponding Source" for a work in object code form means all
|
135 |
-
the source code needed to generate, install, and (for an executable
|
136 |
-
work) run the object code and to modify the work, including scripts to
|
137 |
-
control those activities. However, it does not include the work's
|
138 |
-
System Libraries, or general-purpose tools or generally available free
|
139 |
-
programs which are used unmodified in performing those activities but
|
140 |
-
which are not part of the work. For example, Corresponding Source
|
141 |
-
includes interface definition files associated with source files for
|
142 |
-
the work, and the source code for shared libraries and dynamically
|
143 |
-
linked subprograms that the work is specifically designed to require,
|
144 |
-
such as by intimate data communication or control flow between those
|
145 |
-
subprograms and other parts of the work.
|
146 |
-
|
147 |
-
The Corresponding Source need not include anything that users
|
148 |
-
can regenerate automatically from other parts of the Corresponding
|
149 |
-
Source.
|
150 |
-
|
151 |
-
The Corresponding Source for a work in source code form is that
|
152 |
-
same work.
|
153 |
-
|
154 |
-
2. Basic Permissions.
|
155 |
-
|
156 |
-
All rights granted under this License are granted for the term of
|
157 |
-
copyright on the Program, and are irrevocable provided the stated
|
158 |
-
conditions are met. This License explicitly affirms your unlimited
|
159 |
-
permission to run the unmodified Program. The output from running a
|
160 |
-
covered work is covered by this License only if the output, given its
|
161 |
-
content, constitutes a covered work. This License acknowledges your
|
162 |
-
rights of fair use or other equivalent, as provided by copyright law.
|
163 |
-
|
164 |
-
You may make, run and propagate covered works that you do not
|
165 |
-
convey, without conditions so long as your license otherwise remains
|
166 |
-
in force. You may convey covered works to others for the sole purpose
|
167 |
-
of having them make modifications exclusively for you, or provide you
|
168 |
-
with facilities for running those works, provided that you comply with
|
169 |
-
the terms of this License in conveying all material for which you do
|
170 |
-
not control copyright. Those thus making or running the covered works
|
171 |
-
for you must do so exclusively on your behalf, under your direction
|
172 |
-
and control, on terms that prohibit them from making any copies of
|
173 |
-
your copyrighted material outside their relationship with you.
|
174 |
-
|
175 |
-
Conveying under any other circumstances is permitted solely under
|
176 |
-
the conditions stated below. Sublicensing is not allowed; section 10
|
177 |
-
makes it unnecessary.
|
178 |
-
|
179 |
-
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
180 |
-
|
181 |
-
No covered work shall be deemed part of an effective technological
|
182 |
-
measure under any applicable law fulfilling obligations under article
|
183 |
-
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
184 |
-
similar laws prohibiting or restricting circumvention of such
|
185 |
-
measures.
|
186 |
-
|
187 |
-
When you convey a covered work, you waive any legal power to forbid
|
188 |
-
circumvention of technological measures to the extent such circumvention
|
189 |
-
is effected by exercising rights under this License with respect to
|
190 |
-
the covered work, and you disclaim any intention to limit operation or
|
191 |
-
modification of the work as a means of enforcing, against the work's
|
192 |
-
users, your or third parties' legal rights to forbid circumvention of
|
193 |
-
technological measures.
|
194 |
-
|
195 |
-
4. Conveying Verbatim Copies.
|
196 |
-
|
197 |
-
You may convey verbatim copies of the Program's source code as you
|
198 |
-
receive it, in any medium, provided that you conspicuously and
|
199 |
-
appropriately publish on each copy an appropriate copyright notice;
|
200 |
-
keep intact all notices stating that this License and any
|
201 |
-
non-permissive terms added in accord with section 7 apply to the code;
|
202 |
-
keep intact all notices of the absence of any warranty; and give all
|
203 |
-
recipients a copy of this License along with the Program.
|
204 |
-
|
205 |
-
You may charge any price or no price for each copy that you convey,
|
206 |
-
and you may offer support or warranty protection for a fee.
|
207 |
-
|
208 |
-
5. Conveying Modified Source Versions.
|
209 |
-
|
210 |
-
You may convey a work based on the Program, or the modifications to
|
211 |
-
produce it from the Program, in the form of source code under the
|
212 |
-
terms of section 4, provided that you also meet all of these conditions:
|
213 |
-
|
214 |
-
a) The work must carry prominent notices stating that you modified
|
215 |
-
it, and giving a relevant date.
|
216 |
-
|
217 |
-
b) The work must carry prominent notices stating that it is
|
218 |
-
released under this License and any conditions added under section
|
219 |
-
7. This requirement modifies the requirement in section 4 to
|
220 |
-
"keep intact all notices".
|
221 |
-
|
222 |
-
c) You must license the entire work, as a whole, under this
|
223 |
-
License to anyone who comes into possession of a copy. This
|
224 |
-
License will therefore apply, along with any applicable section 7
|
225 |
-
additional terms, to the whole of the work, and all its parts,
|
226 |
-
regardless of how they are packaged. This License gives no
|
227 |
-
permission to license the work in any other way, but it does not
|
228 |
-
invalidate such permission if you have separately received it.
|
229 |
-
|
230 |
-
d) If the work has interactive user interfaces, each must display
|
231 |
-
Appropriate Legal Notices; however, if the Program has interactive
|
232 |
-
interfaces that do not display Appropriate Legal Notices, your
|
233 |
-
work need not make them do so.
|
234 |
-
|
235 |
-
A compilation of a covered work with other separate and independent
|
236 |
-
works, which are not by their nature extensions of the covered work,
|
237 |
-
and which are not combined with it such as to form a larger program,
|
238 |
-
in or on a volume of a storage or distribution medium, is called an
|
239 |
-
"aggregate" if the compilation and its resulting copyright are not
|
240 |
-
used to limit the access or legal rights of the compilation's users
|
241 |
-
beyond what the individual works permit. Inclusion of a covered work
|
242 |
-
in an aggregate does not cause this License to apply to the other
|
243 |
-
parts of the aggregate.
|
244 |
-
|
245 |
-
6. Conveying Non-Source Forms.
|
246 |
-
|
247 |
-
You may convey a covered work in object code form under the terms
|
248 |
-
of sections 4 and 5, provided that you also convey the
|
249 |
-
machine-readable Corresponding Source under the terms of this License,
|
250 |
-
in one of these ways:
|
251 |
-
|
252 |
-
a) Convey the object code in, or embodied in, a physical product
|
253 |
-
(including a physical distribution medium), accompanied by the
|
254 |
-
Corresponding Source fixed on a durable physical medium
|
255 |
-
customarily used for software interchange.
|
256 |
-
|
257 |
-
b) Convey the object code in, or embodied in, a physical product
|
258 |
-
(including a physical distribution medium), accompanied by a
|
259 |
-
written offer, valid for at least three years and valid for as
|
260 |
-
long as you offer spare parts or customer support for that product
|
261 |
-
model, to give anyone who possesses the object code either (1) a
|
262 |
-
copy of the Corresponding Source for all the software in the
|
263 |
-
product that is covered by this License, on a durable physical
|
264 |
-
medium customarily used for software interchange, for a price no
|
265 |
-
more than your reasonable cost of physically performing this
|
266 |
-
conveying of source, or (2) access to copy the
|
267 |
-
Corresponding Source from a network server at no charge.
|
268 |
-
|
269 |
-
c) Convey individual copies of the object code with a copy of the
|
270 |
-
written offer to provide the Corresponding Source. This
|
271 |
-
alternative is allowed only occasionally and noncommercially, and
|
272 |
-
only if you received the object code with such an offer, in accord
|
273 |
-
with subsection 6b.
|
274 |
-
|
275 |
-
d) Convey the object code by offering access from a designated
|
276 |
-
place (gratis or for a charge), and offer equivalent access to the
|
277 |
-
Corresponding Source in the same way through the same place at no
|
278 |
-
further charge. You need not require recipients to copy the
|
279 |
-
Corresponding Source along with the object code. If the place to
|
280 |
-
copy the object code is a network server, the Corresponding Source
|
281 |
-
may be on a different server (operated by you or a third party)
|
282 |
-
that supports equivalent copying facilities, provided you maintain
|
283 |
-
clear directions next to the object code saying where to find the
|
284 |
-
Corresponding Source. Regardless of what server hosts the
|
285 |
-
Corresponding Source, you remain obligated to ensure that it is
|
286 |
-
available for as long as needed to satisfy these requirements.
|
287 |
-
|
288 |
-
e) Convey the object code using peer-to-peer transmission, provided
|
289 |
-
you inform other peers where the object code and Corresponding
|
290 |
-
Source of the work are being offered to the general public at no
|
291 |
-
charge under subsection 6d.
|
292 |
-
|
293 |
-
A separable portion of the object code, whose source code is excluded
|
294 |
-
from the Corresponding Source as a System Library, need not be
|
295 |
-
included in conveying the object code work.
|
296 |
-
|
297 |
-
A "User Product" is either (1) a "consumer product", which means any
|
298 |
-
tangible personal property which is normally used for personal, family,
|
299 |
-
or household purposes, or (2) anything designed or sold for incorporation
|
300 |
-
into a dwelling. In determining whether a product is a consumer product,
|
301 |
-
doubtful cases shall be resolved in favor of coverage. For a particular
|
302 |
-
product received by a particular user, "normally used" refers to a
|
303 |
-
typical or common use of that class of product, regardless of the status
|
304 |
-
of the particular user or of the way in which the particular user
|
305 |
-
actually uses, or expects or is expected to use, the product. A product
|
306 |
-
is a consumer product regardless of whether the product has substantial
|
307 |
-
commercial, industrial or non-consumer uses, unless such uses represent
|
308 |
-
the only significant mode of use of the product.
|
309 |
-
|
310 |
-
"Installation Information" for a User Product means any methods,
|
311 |
-
procedures, authorization keys, or other information required to install
|
312 |
-
and execute modified versions of a covered work in that User Product from
|
313 |
-
a modified version of its Corresponding Source. The information must
|
314 |
-
suffice to ensure that the continued functioning of the modified object
|
315 |
-
code is in no case prevented or interfered with solely because
|
316 |
-
modification has been made.
|
317 |
-
|
318 |
-
If you convey an object code work under this section in, or with, or
|
319 |
-
specifically for use in, a User Product, and the conveying occurs as
|
320 |
-
part of a transaction in which the right of possession and use of the
|
321 |
-
User Product is transferred to the recipient in perpetuity or for a
|
322 |
-
fixed term (regardless of how the transaction is characterized), the
|
323 |
-
Corresponding Source conveyed under this section must be accompanied
|
324 |
-
by the Installation Information. But this requirement does not apply
|
325 |
-
if neither you nor any third party retains the ability to install
|
326 |
-
modified object code on the User Product (for example, the work has
|
327 |
-
been installed in ROM).
|
328 |
-
|
329 |
-
The requirement to provide Installation Information does not include a
|
330 |
-
requirement to continue to provide support service, warranty, or updates
|
331 |
-
for a work that has been modified or installed by the recipient, or for
|
332 |
-
the User Product in which it has been modified or installed. Access to a
|
333 |
-
network may be denied when the modification itself materially and
|
334 |
-
adversely affects the operation of the network or violates the rules and
|
335 |
-
protocols for communication across the network.
|
336 |
-
|
337 |
-
Corresponding Source conveyed, and Installation Information provided,
|
338 |
-
in accord with this section must be in a format that is publicly
|
339 |
-
documented (and with an implementation available to the public in
|
340 |
-
source code form), and must require no special password or key for
|
341 |
-
unpacking, reading or copying.
|
342 |
-
|
343 |
-
7. Additional Terms.
|
344 |
-
|
345 |
-
"Additional permissions" are terms that supplement the terms of this
|
346 |
-
License by making exceptions from one or more of its conditions.
|
347 |
-
Additional permissions that are applicable to the entire Program shall
|
348 |
-
be treated as though they were included in this License, to the extent
|
349 |
-
that they are valid under applicable law. If additional permissions
|
350 |
-
apply only to part of the Program, that part may be used separately
|
351 |
-
under those permissions, but the entire Program remains governed by
|
352 |
-
this License without regard to the additional permissions.
|
353 |
-
|
354 |
-
When you convey a copy of a covered work, you may at your option
|
355 |
-
remove any additional permissions from that copy, or from any part of
|
356 |
-
it. (Additional permissions may be written to require their own
|
357 |
-
removal in certain cases when you modify the work.) You may place
|
358 |
-
additional permissions on material, added by you to a covered work,
|
359 |
-
for which you have or can give appropriate copyright permission.
|
360 |
-
|
361 |
-
Notwithstanding any other provision of this License, for material you
|
362 |
-
add to a covered work, you may (if authorized by the copyright holders of
|
363 |
-
that material) supplement the terms of this License with terms:
|
364 |
-
|
365 |
-
a) Disclaiming warranty or limiting liability differently from the
|
366 |
-
terms of sections 15 and 16 of this License; or
|
367 |
-
|
368 |
-
b) Requiring preservation of specified reasonable legal notices or
|
369 |
-
author attributions in that material or in the Appropriate Legal
|
370 |
-
Notices displayed by works containing it; or
|
371 |
-
|
372 |
-
c) Prohibiting misrepresentation of the origin of that material, or
|
373 |
-
requiring that modified versions of such material be marked in
|
374 |
-
reasonable ways as different from the original version; or
|
375 |
-
|
376 |
-
d) Limiting the use for publicity purposes of names of licensors or
|
377 |
-
authors of the material; or
|
378 |
-
|
379 |
-
e) Declining to grant rights under trademark law for use of some
|
380 |
-
trade names, trademarks, or service marks; or
|
381 |
-
|
382 |
-
f) Requiring indemnification of licensors and authors of that
|
383 |
-
material by anyone who conveys the material (or modified versions of
|
384 |
-
it) with contractual assumptions of liability to the recipient, for
|
385 |
-
any liability that these contractual assumptions directly impose on
|
386 |
-
those licensors and authors.
|
387 |
-
|
388 |
-
All other non-permissive additional terms are considered "further
|
389 |
-
restrictions" within the meaning of section 10. If the Program as you
|
390 |
-
received it, or any part of it, contains a notice stating that it is
|
391 |
-
governed by this License along with a term that is a further
|
392 |
-
restriction, you may remove that term. If a license document contains
|
393 |
-
a further restriction but permits relicensing or conveying under this
|
394 |
-
License, you may add to a covered work material governed by the terms
|
395 |
-
of that license document, provided that the further restriction does
|
396 |
-
not survive such relicensing or conveying.
|
397 |
-
|
398 |
-
If you add terms to a covered work in accord with this section, you
|
399 |
-
must place, in the relevant source files, a statement of the
|
400 |
-
additional terms that apply to those files, or a notice indicating
|
401 |
-
where to find the applicable terms.
|
402 |
-
|
403 |
-
Additional terms, permissive or non-permissive, may be stated in the
|
404 |
-
form of a separately written license, or stated as exceptions;
|
405 |
-
the above requirements apply either way.
|
406 |
-
|
407 |
-
8. Termination.
|
408 |
-
|
409 |
-
You may not propagate or modify a covered work except as expressly
|
410 |
-
provided under this License. Any attempt otherwise to propagate or
|
411 |
-
modify it is void, and will automatically terminate your rights under
|
412 |
-
this License (including any patent licenses granted under the third
|
413 |
-
paragraph of section 11).
|
414 |
-
|
415 |
-
However, if you cease all violation of this License, then your
|
416 |
-
license from a particular copyright holder is reinstated (a)
|
417 |
-
provisionally, unless and until the copyright holder explicitly and
|
418 |
-
finally terminates your license, and (b) permanently, if the copyright
|
419 |
-
holder fails to notify you of the violation by some reasonable means
|
420 |
-
prior to 60 days after the cessation.
|
421 |
-
|
422 |
-
Moreover, your license from a particular copyright holder is
|
423 |
-
reinstated permanently if the copyright holder notifies you of the
|
424 |
-
violation by some reasonable means, this is the first time you have
|
425 |
-
received notice of violation of this License (for any work) from that
|
426 |
-
copyright holder, and you cure the violation prior to 30 days after
|
427 |
-
your receipt of the notice.
|
428 |
-
|
429 |
-
Termination of your rights under this section does not terminate the
|
430 |
-
licenses of parties who have received copies or rights from you under
|
431 |
-
this License. If your rights have been terminated and not permanently
|
432 |
-
reinstated, you do not qualify to receive new licenses for the same
|
433 |
-
material under section 10.
|
434 |
-
|
435 |
-
9. Acceptance Not Required for Having Copies.
|
436 |
-
|
437 |
-
You are not required to accept this License in order to receive or
|
438 |
-
run a copy of the Program. Ancillary propagation of a covered work
|
439 |
-
occurring solely as a consequence of using peer-to-peer transmission
|
440 |
-
to receive a copy likewise does not require acceptance. However,
|
441 |
-
nothing other than this License grants you permission to propagate or
|
442 |
-
modify any covered work. These actions infringe copyright if you do
|
443 |
-
not accept this License. Therefore, by modifying or propagating a
|
444 |
-
covered work, you indicate your acceptance of this License to do so.
|
445 |
-
|
446 |
-
10. Automatic Licensing of Downstream Recipients.
|
447 |
-
|
448 |
-
Each time you convey a covered work, the recipient automatically
|
449 |
-
receives a license from the original licensors, to run, modify and
|
450 |
-
propagate that work, subject to this License. You are not responsible
|
451 |
-
for enforcing compliance by third parties with this License.
|
452 |
-
|
453 |
-
An "entity transaction" is a transaction transferring control of an
|
454 |
-
organization, or substantially all assets of one, or subdividing an
|
455 |
-
organization, or merging organizations. If propagation of a covered
|
456 |
-
work results from an entity transaction, each party to that
|
457 |
-
transaction who receives a copy of the work also receives whatever
|
458 |
-
licenses to the work the party's predecessor in interest had or could
|
459 |
-
give under the previous paragraph, plus a right to possession of the
|
460 |
-
Corresponding Source of the work from the predecessor in interest, if
|
461 |
-
the predecessor has it or can get it with reasonable efforts.
|
462 |
-
|
463 |
-
You may not impose any further restrictions on the exercise of the
|
464 |
-
rights granted or affirmed under this License. For example, you may
|
465 |
-
not impose a license fee, royalty, or other charge for exercise of
|
466 |
-
rights granted under this License, and you may not initiate litigation
|
467 |
-
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
468 |
-
any patent claim is infringed by making, using, selling, offering for
|
469 |
-
sale, or importing the Program or any portion of it.
|
470 |
-
|
471 |
-
11. Patents.
|
472 |
-
|
473 |
-
A "contributor" is a copyright holder who authorizes use under this
|
474 |
-
License of the Program or a work on which the Program is based. The
|
475 |
-
work thus licensed is called the contributor's "contributor version".
|
476 |
-
|
477 |
-
A contributor's "essential patent claims" are all patent claims
|
478 |
-
owned or controlled by the contributor, whether already acquired or
|
479 |
-
hereafter acquired, that would be infringed by some manner, permitted
|
480 |
-
by this License, of making, using, or selling its contributor version,
|
481 |
-
but do not include claims that would be infringed only as a
|
482 |
-
consequence of further modification of the contributor version. For
|
483 |
-
purposes of this definition, "control" includes the right to grant
|
484 |
-
patent sublicenses in a manner consistent with the requirements of
|
485 |
-
this License.
|
486 |
-
|
487 |
-
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
488 |
-
patent license under the contributor's essential patent claims, to
|
489 |
-
make, use, sell, offer for sale, import and otherwise run, modify and
|
490 |
-
propagate the contents of its contributor version.
|
491 |
-
|
492 |
-
In the following three paragraphs, a "patent license" is any express
|
493 |
-
agreement or commitment, however denominated, not to enforce a patent
|
494 |
-
(such as an express permission to practice a patent or covenant not to
|
495 |
-
sue for patent infringement). To "grant" such a patent license to a
|
496 |
-
party means to make such an agreement or commitment not to enforce a
|
497 |
-
patent against the party.
|
498 |
-
|
499 |
-
If you convey a covered work, knowingly relying on a patent license,
|
500 |
-
and the Corresponding Source of the work is not available for anyone
|
501 |
-
to copy, free of charge and under the terms of this License, through a
|
502 |
-
publicly available network server or other readily accessible means,
|
503 |
-
then you must either (1) cause the Corresponding Source to be so
|
504 |
-
available, or (2) arrange to deprive yourself of the benefit of the
|
505 |
-
patent license for this particular work, or (3) arrange, in a manner
|
506 |
-
consistent with the requirements of this License, to extend the patent
|
507 |
-
license to downstream recipients. "Knowingly relying" means you have
|
508 |
-
actual knowledge that, but for the patent license, your conveying the
|
509 |
-
covered work in a country, or your recipient's use of the covered work
|
510 |
-
in a country, would infringe one or more identifiable patents in that
|
511 |
-
country that you have reason to believe are valid.
|
512 |
-
|
513 |
-
If, pursuant to or in connection with a single transaction or
|
514 |
-
arrangement, you convey, or propagate by procuring conveyance of, a
|
515 |
-
covered work, and grant a patent license to some of the parties
|
516 |
-
receiving the covered work authorizing them to use, propagate, modify
|
517 |
-
or convey a specific copy of the covered work, then the patent license
|
518 |
-
you grant is automatically extended to all recipients of the covered
|
519 |
-
work and works based on it.
|
520 |
-
|
521 |
-
A patent license is "discriminatory" if it does not include within
|
522 |
-
the scope of its coverage, prohibits the exercise of, or is
|
523 |
-
conditioned on the non-exercise of one or more of the rights that are
|
524 |
-
specifically granted under this License. You may not convey a covered
|
525 |
-
work if you are a party to an arrangement with a third party that is
|
526 |
-
in the business of distributing software, under which you make payment
|
527 |
-
to the third party based on the extent of your activity of conveying
|
528 |
-
the work, and under which the third party grants, to any of the
|
529 |
-
parties who would receive the covered work from you, a discriminatory
|
530 |
-
patent license (a) in connection with copies of the covered work
|
531 |
-
conveyed by you (or copies made from those copies), or (b) primarily
|
532 |
-
for and in connection with specific products or compilations that
|
533 |
-
contain the covered work, unless you entered into that arrangement,
|
534 |
-
or that patent license was granted, prior to 28 March 2007.
|
535 |
-
|
536 |
-
Nothing in this License shall be construed as excluding or limiting
|
537 |
-
any implied license or other defenses to infringement that may
|
538 |
-
otherwise be available to you under applicable patent law.
|
539 |
-
|
540 |
-
12. No Surrender of Others' Freedom.
|
541 |
-
|
542 |
-
If conditions are imposed on you (whether by court order, agreement or
|
543 |
-
otherwise) that contradict the conditions of this License, they do not
|
544 |
-
excuse you from the conditions of this License. If you cannot convey a
|
545 |
-
covered work so as to satisfy simultaneously your obligations under this
|
546 |
-
License and any other pertinent obligations, then as a consequence you may
|
547 |
-
not convey it at all. For example, if you agree to terms that obligate you
|
548 |
-
to collect a royalty for further conveying from those to whom you convey
|
549 |
-
the Program, the only way you could satisfy both those terms and this
|
550 |
-
License would be to refrain entirely from conveying the Program.
|
551 |
-
|
552 |
-
13. Use with the GNU Affero General Public License.
|
553 |
-
|
554 |
-
Notwithstanding any other provision of this License, you have
|
555 |
-
permission to link or combine any covered work with a work licensed
|
556 |
-
under version 3 of the GNU Affero General Public License into a single
|
557 |
-
combined work, and to convey the resulting work. The terms of this
|
558 |
-
License will continue to apply to the part which is the covered work,
|
559 |
-
but the special requirements of the GNU Affero General Public License,
|
560 |
-
section 13, concerning interaction through a network will apply to the
|
561 |
-
combination as such.
|
562 |
-
|
563 |
-
14. Revised Versions of this License.
|
564 |
-
|
565 |
-
The Free Software Foundation may publish revised and/or new versions of
|
566 |
-
the GNU General Public License from time to time. Such new versions will
|
567 |
-
be similar in spirit to the present version, but may differ in detail to
|
568 |
-
address new problems or concerns.
|
569 |
-
|
570 |
-
Each version is given a distinguishing version number. If the
|
571 |
-
Program specifies that a certain numbered version of the GNU General
|
572 |
-
Public License "or any later version" applies to it, you have the
|
573 |
-
option of following the terms and conditions either of that numbered
|
574 |
-
version or of any later version published by the Free Software
|
575 |
-
Foundation. If the Program does not specify a version number of the
|
576 |
-
GNU General Public License, you may choose any version ever published
|
577 |
-
by the Free Software Foundation.
|
578 |
-
|
579 |
-
If the Program specifies that a proxy can decide which future
|
580 |
-
versions of the GNU General Public License can be used, that proxy's
|
581 |
-
public statement of acceptance of a version permanently authorizes you
|
582 |
-
to choose that version for the Program.
|
583 |
-
|
584 |
-
Later license versions may give you additional or different
|
585 |
-
permissions. However, no additional obligations are imposed on any
|
586 |
-
author or copyright holder as a result of your choosing to follow a
|
587 |
-
later version.
|
588 |
-
|
589 |
-
15. Disclaimer of Warranty.
|
590 |
-
|
591 |
-
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
592 |
-
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
593 |
-
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
594 |
-
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
595 |
-
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
596 |
-
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
597 |
-
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
598 |
-
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
599 |
-
|
600 |
-
16. Limitation of Liability.
|
601 |
-
|
602 |
-
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
603 |
-
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
604 |
-
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
605 |
-
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
606 |
-
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
607 |
-
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
608 |
-
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
609 |
-
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
610 |
-
SUCH DAMAGES.
|
611 |
-
|
612 |
-
17. Interpretation of Sections 15 and 16.
|
613 |
-
|
614 |
-
If the disclaimer of warranty and limitation of liability provided
|
615 |
-
above cannot be given local legal effect according to their terms,
|
616 |
-
reviewing courts shall apply local law that most closely approximates
|
617 |
-
an absolute waiver of all civil liability in connection with the
|
618 |
-
Program, unless a warranty or assumption of liability accompanies a
|
619 |
-
copy of the Program in return for a fee.
|
620 |
-
|
621 |
-
END OF TERMS AND CONDITIONS
|
622 |
-
|
623 |
-
How to Apply These Terms to Your New Programs
|
624 |
-
|
625 |
-
If you develop a new program, and you want it to be of the greatest
|
626 |
-
possible use to the public, the best way to achieve this is to make it
|
627 |
-
free software which everyone can redistribute and change under these terms.
|
628 |
-
|
629 |
-
To do so, attach the following notices to the program. It is safest
|
630 |
-
to attach them to the start of each source file to most effectively
|
631 |
-
state the exclusion of warranty; and each file should have at least
|
632 |
-
the "copyright" line and a pointer to where the full notice is found.
|
633 |
-
|
634 |
-
<one line to give the program's name and a brief idea of what it does.>
|
635 |
-
Copyright (C) <year> <name of author>
|
636 |
-
|
637 |
-
This program is free software: you can redistribute it and/or modify
|
638 |
-
it under the terms of the GNU General Public License as published by
|
639 |
-
the Free Software Foundation, either version 3 of the License, or
|
640 |
-
(at your option) any later version.
|
641 |
-
|
642 |
-
This program is distributed in the hope that it will be useful,
|
643 |
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
644 |
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
645 |
-
GNU General Public License for more details.
|
646 |
-
|
647 |
-
You should have received a copy of the GNU General Public License
|
648 |
-
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
649 |
-
|
650 |
-
Also add information on how to contact you by electronic and paper mail.
|
651 |
-
|
652 |
-
If the program does terminal interaction, make it output a short
|
653 |
-
notice like this when it starts in an interactive mode:
|
654 |
-
|
655 |
-
<program> Copyright (C) <year> <name of author>
|
656 |
-
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
657 |
-
This is free software, and you are welcome to redistribute it
|
658 |
-
under certain conditions; type `show c' for details.
|
659 |
-
|
660 |
-
The hypothetical commands `show w' and `show c' should show the appropriate
|
661 |
-
parts of the General Public License. Of course, your program's commands
|
662 |
-
might be different; for a GUI interface, you would use an "about box".
|
663 |
-
|
664 |
-
You should also get your employer (if you work as a programmer) or school,
|
665 |
-
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
666 |
-
For more information on this, and how to apply and follow the GNU GPL, see
|
667 |
-
<https://www.gnu.org/licenses/>.
|
668 |
-
|
669 |
-
The GNU General Public License does not permit incorporating your program
|
670 |
-
into proprietary programs. If your program is a subroutine library, you
|
671 |
-
may consider it more useful to permit linking proprietary applications with
|
672 |
-
the library. If this is what you want to do, use the GNU Lesser General
|
673 |
-
Public License instead of this License. But first, please read
|
674 |
-
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/css/abstracts/_colors.scss
CHANGED
@@ -5,7 +5,6 @@
|
|
5 |
$no-stock-color: $alert-red;
|
6 |
$low-stock-color: $alert-yellow;
|
7 |
$in-stock-color: $alert-green;
|
8 |
-
$discount-color: $alert-green;
|
9 |
|
10 |
$placeholder-color: var(--global--color-primary, $gray-200);
|
11 |
$input-border-gray: #50575e;
|
5 |
$no-stock-color: $alert-red;
|
6 |
$low-stock-color: $alert-yellow;
|
7 |
$in-stock-color: $alert-green;
|
|
|
8 |
|
9 |
$placeholder-color: var(--global--color-primary, $gray-200);
|
10 |
$input-border-gray: #50575e;
|
assets/css/abstracts/_mixins.scss
CHANGED
@@ -124,7 +124,6 @@ $fontSizes: (
|
|
124 |
background: transparent;
|
125 |
box-shadow: none;
|
126 |
display: inline;
|
127 |
-
text-shadow: none;
|
128 |
|
129 |
&:hover,
|
130 |
&:focus,
|
124 |
background: transparent;
|
125 |
box-shadow: none;
|
126 |
display: inline;
|
|
|
127 |
|
128 |
&:hover,
|
129 |
&:focus,
|
assets/css/editor.scss
CHANGED
@@ -48,15 +48,9 @@
|
|
48 |
}
|
49 |
}
|
50 |
|
51 |
-
//
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
}
|
57 |
-
|
58 |
-
.woocommerce-search-list__selected.woocommerce-search-list__selected > ul {
|
59 |
-
list-style: none;
|
60 |
-
margin: 0;
|
61 |
-
padding: 0;
|
62 |
}
|
48 |
}
|
49 |
}
|
50 |
|
51 |
+
// This border has been upstreamed to WooCommerce Admin, so it can be removed
|
52 |
+
// from here once @woocommerce/components gets updated.
|
53 |
+
// https://github.com/woocommerce/woocommerce-admin/pull/5901
|
54 |
+
.woocommerce-search-list__list {
|
55 |
+
border: 1px solid $gray-200;
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
}
|
assets/css/style.scss
CHANGED
@@ -201,9 +201,6 @@
|
|
201 |
.wc-block-components-product-sale-badge {
|
202 |
line-height: 1;
|
203 |
}
|
204 |
-
.editor-styles-wrapper .wp-block-button .wp-block-button__link:not(.has-text-color) {
|
205 |
-
color: #fff;
|
206 |
-
}
|
207 |
}
|
208 |
|
209 |
.theme-twentytwenty {
|
201 |
.wc-block-components-product-sale-badge {
|
202 |
line-height: 1;
|
203 |
}
|
|
|
|
|
|
|
204 |
}
|
205 |
|
206 |
.theme-twentytwenty {
|
assets/img/avatar.jpg
ADDED
Binary file
|
{images/previews → assets/img}/beanie.jpg
RENAMED
File without changes
|
assets/img/block-error.svg
ADDED
@@ -0,0 +1,2727 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<svg
|
2 |
+
width="208.5"
|
3 |
+
height="92"
|
4 |
+
viewBox="0 0 834 368"
|
5 |
+
xmlns="http://www.w3.org/2000/svg"
|
6 |
+
>
|
7 |
+
<g>
|
8 |
+
<g>
|
9 |
+
<path
|
10 |
+
fill="#DCDDDE"
|
11 |
+
d="M77.3,290.2h0.3l0.3,0.1l0.2,0.1l0.4,0.1h0.1l0.4,0.2h0.1l0.2,0.2l0.3,0.2l0,0l0.3,0.3l0.2,0.3l0,0h0.4l2,0.1
|
12 |
+
l2,0.1l2.1,0.2l1.1,0.1l1.1,0.1l1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1,0.1l1.1,0.2l1,0.2l1,0.2l1,0.2l0.9,0.2
|
13 |
+
l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.8,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2
|
14 |
+
l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.2h0.2h1.4h0.6l0,0
|
15 |
+
l-0.2-0.3v-0.1l-0.2-0.3v-0.1l-0.1-0.3v-0.1l-0.1-0.3v-0.1l-0.1-0.4v-0.1l0.1-0.3v-0.1l0.1-0.3v-0.1l0.1-0.3l0.1-0.1l0.1-0.2
|
16 |
+
l0.1-0.2l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
|
17 |
+
l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.5-0.1h0.4h0.5h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.7,0.1l0.7,0.1l0.7,0.1
|
18 |
+
h0.3h0.3h0.3h0.2h0.2h0.2h0.3h0.4h0.8h0.8l0.9-0.1l0.9-0.1l1-0.1l2.2-0.2l2.3-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.3-0.1
|
19 |
+
l1.2-0.1l1.3-0.1h1.2h0.7h0.7h0.7h0.6h0.7h0.6h0.7h0.6h0.7h0.6h0.6l0.6,0.1l0.6,0.1l0.5,0.1l0.6,0.1l0.5,0.1l0.6,0.1l0.5,0.1
|
20 |
+
l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.1l0.2,0.2l0.2,0.2
|
21 |
+
l0.1,0.1l0.2,0.2v0.1l0.2,0.3l0,0l0.2,0.5l0,0l0.1,0.5l0,0l0.1,0.6l0,0l-0.1,0.6l0,0l-0.2,0.5h-0.1l-0.2,0.4h-0.1l-0.1,0.1
|
22 |
+
l1.9,0.3l2.3,0.4l2.2,0.4h1.1l2.5,0.1l2.2,0.1l0.7-0.1l0.6-0.1l0.5-0.1h0.5h0.5h0.6h0.6h0.6h0.6h0.6h0.6h1.1h1.1h1.1h1.1h1.1h5.2
|
23 |
+
h0.4l4-0.2l2-0.1l2-0.1l1.2-0.1l0.1-0.2l0.4-0.4l0.5-0.3l0,0l0.3-0.1l0.4-0.1l0,0l0.4-0.1h0.2h0.4h0.4h2.4h2.4h2.4h2.4h4.8
|
24 |
+
l4.8,0.1l9.5,0.1l4.8,0.1l4.7,0.1h4.8h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4l2.4-0.1l2.4-0.1l2.4-0.1l2.4-0.1h1.2h1.2h1.2h1.2
|
25 |
+
h1.2h1.2h1.2h1.2h2.5h2.4h2.4h1.2h1.2h0.2h0.2h0.5h0.5l0.5-0.1l0.7-0.1l0.7-0.1l1.4-0.2l1.4-0.2l0.8-0.1l0.7-0.1l0.8-0.1l0.7-0.1
|
26 |
+
l0.8-0.1h0.7h0.7h0.4h0.4h0.4h0.4h0.4h0.4h0.3h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.2,0.2l0.2,0.1
|
27 |
+
l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.2v0.2
|
28 |
+
v0.2v0.2l-0.1,0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2
|
29 |
+
l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.2,0.1l-0.1,0.1h0.1l0.5,0.1l0.2,0.1l0.3,0.1l0.2,0.1h0.1h0.2l0.7-0.1
|
30 |
+
l0.7-0.1l0.7-0.1l1.5-0.2l1.6-0.2l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.1h0.1l0,0l0.2-0.4l0.4-0.4l0,0l0.3-0.2l0.3-0.2l0,0l0.4-0.2
|
31 |
+
h0.1l0.4-0.1h0.1l0.3-0.1h0.2h0.4h0.4h0.4h0.4h0.4h0.4h0.7l0.8,0.1l0.8,0.1l1.6,0.1l0.8,0.1h0.7h0.6h0.2h0.2h1.4h1.5h2.9h1.4h1.4
|
32 |
+
h0.7h0.7h0.7h0.7l1.9-0.1l1.9-0.1l1.8-0.1l1.9-0.1l1.9-0.1l1.9-0.1l3.8-0.3l3.7-0.3l2-0.1l1.9-0.1l1.9-0.1l1.9-0.1l2-0.1l1.9-0.1
|
33 |
+
h0.7h0.7h1.4h1.4h1.4h2.7h1.3h1.3h0.5h0.5h0.6h0.7l1.5-0.1l1.4-0.1h0.7h0.7h0.5h0.2h0.3h0.2h0.3h0.1l0.5,0.1h0.1l0.3,0.1l0.3,0.2
|
34 |
+
l0,0l0.5,0.4l0.4,0.5l0,0l0.2,0.5l0.2,0.5v0.5v0.5l0,0l-0.2,0.5L404,306l-0.2,0.4h-0.1l-0.2,0.3l-0.3,0.2l0,0l-0.5,0.3h-0.1
|
35 |
+
l-0.3,0.1l-0.2,0.1l-0.3,0.1l-1.3,0.4l-1.2,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3
|
36 |
+
l-2.6,0.5l-5,1l-3.5,0.7h-0.2l2-0.1l2.1-0.1l2.1-0.1l2-0.1h1.8h1.6h0.8h0.6h0.2h0.6l0.9-0.1l1.1-0.1h0.7h0.7h0.7h0.7h0.8h0.8h0.8
|
37 |
+
h0.8h0.8l0.8,0.1l0.8,0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
|
38 |
+
l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.4,0.3l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3
|
39 |
+
l0.1,0.3v0.3l0.1,0.3v0.3l-0.1,0.3v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3
|
40 |
+
l-0.2,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2L407,323l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
41 |
+
l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.8,0.1l-0.9,0.1
|
42 |
+
l-0.9,0.1l-0.9,0.1l-1,0.1h-0.9h-0.9h-1h-1h-1h-1h-1.1h-1h-1.1h-1h-1.1h-1l-1.1-0.1l-1-0.1l-1-0.1l-1.1-0.1l-1.2-0.1v0.1v0.3v0.1
|
43 |
+
l-0.1,0.3v0.1l-0.1,0.3l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.2l-0.2,0.2l-0.3,0.2
|
44 |
+
l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.7,0.2
|
45 |
+
l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1l-0.7,0.1l-0.5,0.1l-1.1,0.1
|
46 |
+
l-0.9,0.1l-0.8,0.1l-0.7,0.1h-0.5h-0.6h-0.7h-0.7h-0.8h-0.7h-0.8h-0.8h-0.8h-0.8h-0.9h-0.9H349h-0.9h-0.9h-0.9h-1l-0.9-0.1l-1-0.1
|
47 |
+
l-1.1-0.1l-1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2
|
48 |
+
l-1.1-0.2l-1.1-0.2l-1-0.2l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-1-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
|
49 |
+
l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
|
50 |
+
l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3
|
51 |
+
l-0.3-0.3l-0.3-0.3l-0.1-0.1l-0.6,0.1l-0.9,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1.1,0.1l-1,0.1
|
52 |
+
h-0.9h-1h-1.2l-0.1,0.3l0,0l-0.3,0.4l-0.3,0.4l-0.4,0.3l0,0l-0.4,0.2l-0.3,0.2h-0.1l-0.5,0.1h-0.1h-0.4h-0.2h-0.3h-1.5h-1.5h-2.9
|
53 |
+
h-3l-2.9-0.1l-2.9-0.1l-2.9-0.1l-5.8-0.2l-5.7-0.2l-2.9-0.1l-2.9-0.1l-2.9-0.1h-2.8h-2.9h-1.4h-1.4h-2.1h-2.1h-2.1h-2.1h-2.1h-1.1
|
54 |
+
h-1.1h-1.1H225h-1.1h-1.1h-0.3h-0.3h-0.8h-1.8h-1h-1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.2-0.1l-0.2-0.1
|
55 |
+
l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.4
|
56 |
+
l-0.1-0.1l-0.2-0.4v-0.1l-0.2-0.5v-0.1l-0.1-0.5v-0.1l0.1-0.5v-0.1l0.1-0.4l0.1-0.1l0.1-0.4l0.1-0.1l0.1-0.3l0.1-0.1l0.2-0.2
|
57 |
+
l0.1-0.2l0.2-0.3l0.2-0.2l0.4-0.4l0.4-0.3l0.3-0.3h-0.2h-0.1l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.3l-0.8,0.3l-0.7,0.3l-0.8,0.3
|
58 |
+
l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-1.6,0.5l-1.7,0.5l-1.6,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.4
|
59 |
+
l-1.6,0.4l-1.6,0.4l-1.6,0.4l-2.2,0.6l0.2,0.6l0.1,0.1l0.1,0.4l0.1,0.4v0.1v0.4v0.1l0.1,0.1l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3
|
60 |
+
l0.1,0.3v0.3l0.1,0.3l-0.1,0.3v0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
|
61 |
+
l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
|
62 |
+
l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1H175h-0.4h-0.4h-0.4h-0.4H173h-0.8h-0.8h-0.8
|
63 |
+
h-0.8H169h-0.8l-1.5-0.1l-1.5-0.1h-0.7h-0.7h-0.6h-0.6H162h-0.2h-0.2l-6.1,0.5l-3.1,0.2l-3.1,0.2l-3.1,0.2l-3.1,0.2l-3.1,0.2
|
64 |
+
l-3.1,0.2l-3.1,0.2l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1h-1.6h-1.5h-1.5h-1.5h-1.5h-1.5h-1.5h-0.4
|
65 |
+
h-0.4h-0.2l-0.4-0.1h-0.1l-0.5-0.2l0,0l-0.5-0.3l-0.4-0.4l-0.3-0.4l0,0l-0.3-0.6l-0.2-0.6v-0.6l0.1-0.6l0.2-0.6l0,0l0.2-0.4
|
66 |
+
l0.3-0.3l0.4-0.3l0,0l0.5-0.3l0,0l0.3-0.1l0.2-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.7-0.1l0.9-0.1l1-0.1l2.1-0.3l2.2-0.3l2-0.3l0.9-0.1
|
67 |
+
l0.7-0.1l1-0.1l0.9-0.1l0.9-0.1l1-0.1l1.9-0.2l1.9-0.2l1.9-0.2l1.9-0.2l1.9-0.2l0.9-0.1l0.9-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1
|
68 |
+
l0.6-0.2l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.1-0.3l-1.2-0.1l-2.2-0.2l-1.1-0.1l-1.1-0.1l-1.1-0.1l-0.9-0.1l-1-0.1l-0.9-0.1
|
69 |
+
l-0.9-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.7-0.1l-0.7-0.1l-0.5-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1
|
70 |
+
l-0.3-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.4-0.4l-0.1-0.1l-0.3-0.4l0,0l-0.2-0.3l0,0l-0.2-0.5l0,0l-0.1-0.5l0,0v-0.5l0,0l0.1-0.5
|
71 |
+
l0,0l0.2-0.4l0,0l0.2-0.4l0,0l0.3-0.4l0.1-0.1l0.3-0.3h-0.4h-0.7h-0.7h-0.7h-0.3h-0.3h-0.2h-0.3l-0.5-0.1l-0.5-0.1l-0.5-0.1
|
72 |
+
l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.4-0.4
|
73 |
+
l-0.1-0.1l-0.3-0.5h-0.1l-0.2-0.5l0,0l-0.1-0.4v-0.4l0,0V314l0.1-0.4l0,0l0,0h-0.4l-0.8,0.1l-0.7,0.1h-0.7h-0.7h-0.7h-0.7h-0.8
|
74 |
+
h-0.7h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4l-2.7-0.1l-2.5-0.1h-1.2h-1.2h-1.1h-1.1H76.9h-0.2h-0.4h-0.8h-0.9h-0.9h-0.4h-0.4h-0.4h-0.4
|
75 |
+
h-0.3h-0.2l-0.4-0.1l-0.4-0.1l0,0l-0.5-0.3l-0.4-0.4l-0.4-0.5l0,0l-0.2-0.5l-0.2-0.6v-0.6l0.1-0.6l0,0l0.2-0.6l0.4-0.5l0.4-0.4
|
76 |
+
l0,0l0.4-0.2L71,308h0.1l0.3-0.1h0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.1l0.2-0.1l-0.1-0.1l-0.3-0.5l0,0l-0.2-0.5l-0.1-0.5l-0.1-0.6
|
77 |
+
l0.1-0.6l0.2-0.5h0.1l0.3-0.5l0.5-0.5l0,0l0.5-0.3H75l0.4-0.2l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l-0.3-0.1
|
78 |
+
l-0.5-0.4l-0.5-0.4h-0.1h-0.9h-0.9h-0.9H73h-0.9l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.7-0.1l-0.5,0.1l-0.6,0.1h-0.5h-0.6h-0.5
|
79 |
+
h-0.6H64h-0.5h-0.6h-0.5h-0.6h-0.5h-1.1h-1.1h-1l-1.1-0.1l-1.9-0.1l-1.8-0.1h-0.8h-0.7h-0.7h-0.5h-0.4h-0.9l-2.8,0.1l-3.9,0.2
|
80 |
+
l-4.3,0.2l-2.2,0.1l-2.1,0.1l-2,0.1l-1.8,0.1h-0.8h-0.7H28h-0.6h-0.5h-0.5h-0.3h-0.2l-0.4-0.1l0,0l-0.4-0.1l-0.4-0.2l0,0l-0.4-0.3
|
81 |
+
L24,300l-0.3-0.4l0,0l-0.2-0.5l-0.1-0.5v-0.1v-0.3l-0.1-0.1v-0.3l0.1-0.1v-0.3l0.1-0.1l0.1-0.3v-0.1l0.1-0.3l0.1-0.1l0.1-0.3
|
82 |
+
l0.1-0.1l0.1-0.2l0.1-0.2l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.2l0.2-0.2l0.3-0.2L26,294l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0,0h-0.5h-0.6
|
83 |
+
h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
|
84 |
+
l-0.3-0.3l-0.2-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4l-0.1-0.4l0.1-0.4v-0.4l0.1-0.4l0.1-0.3
|
85 |
+
l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.3-0.2l0.1-0.1l0.2-0.2
|
86 |
+
l0.2-0.1l0.4-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.3h0.4h0.3h0.4h0.3h0.4l0.3,0.1l0.4,0.1l0.7,0.1l0.7,0.2l0.7,0.2
|
87 |
+
l0.7,0.2l0.7,0.2l0.7,0.2l1.2,0.4l1.2,0.4l0.6,0.2l0.6,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.4,0.1h0.2h0.2h0.2h0.2l1.7,0.2l1.7,0.2
|
88 |
+
l1.8,0.2l1.8,0.2l3.8,0.5l4,0.5l3.9,0.5l2,0.2l1.8,0.2l1.8,0.2l1.8,0.2l1.7,0.2l1.5,0.1h0.4h0.7h0.5l0.5-0.1l1-0.2l1-0.2l1-0.2
|
89 |
+
l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1h0.5h0.4h0.4h0.4L77.3,290.2z M330.2,321.8l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
|
90 |
+
l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8h-0.8H316h-0.7h-0.7h-0.7h-0.1
|
91 |
+
l0.2,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
|
92 |
+
l0.5,0.1l0.4,0.1l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.2l0.9,0.2l0.9,0.2l1,0.2l0.9,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.1l1,0.1
|
93 |
+
l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l0.9,0.1l0.9,0.1l1,0.1l0.9,0.1h0.9h0.9h0.9h0.9h0.9h0.8h0.8h0.8h0.8h0.8h0.8h0.7h0.7h0.6h0.7h0.5
|
94 |
+
h0.4l0.5-0.1l0.8-0.1l0.9-0.1l1-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.2
|
95 |
+
l0.5-0.2l0.5-0.2l0.2-0.1h-0.1l-0.3-0.1l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.7-0.2l-0.5-0.1h-0.1H363l-0.4-0.1l-0.5-0.1l-0.7-0.1
|
96 |
+
l-0.8-0.1l-0.9-0.1l-1-0.1h-0.2l-0.7-0.1h-0.2h-0.1h-0.8h-0.8h-0.8h0.2h-1.6H352h-1.7h-0.8h-0.9h-0.8h-0.9H346h-0.8h-0.3h-0.3
|
97 |
+
h-0.4h-0.4h-0.4H343l-0.9,0.1l-0.9,0.1l-1,0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.3h-0.2h-0.3h-0.2l-0.3-0.1l-0.3-0.1
|
98 |
+
l-0.2-0.1l-0.3-0.1l-0.3-0.1L334,326l-0.2-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.2l-0.1-0.2l-0.2-0.2
|
99 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.4l-0.1-0.4l-0.1-0.4V322L330.2,321.8z M172.4,323.5l-0.9,0.1l-1,0.1l-1,0.1h-0.9h-1h-0.9h-0.9
|
100 |
+
h-0.9H164h-1.7h-1.6h-1.4h-0.7h-0.5h-0.5h-0.4l-3.4,0.2h-0.1l2.2,0.2l4.7,0.4l3.6,0.3h0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1
|
101 |
+
l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.8-0.2l1.2-0.3L172.4,323.5L172.4,323.5z M394.4,320.2h-0.7H393h-0.7h-0.6l-1.1,0.1h-0.8h-0.6
|
102 |
+
h-0.4h-0.5h-0.7h-1.5h-1.8l-2,0.1l-2,0.1l-2.2,0.1l-4.5,0.2l-3,0.1l0.6,0.1l1.9,0.2l1.9,0.2l2,0.1l1,0.1l1,0.1l1,0.1l1,0.1h1h1
|
103 |
+
h0.9h1h1h1h0.9h0.9h0.9h0.9h0.9h0.9l0.9-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1
|
104 |
+
l0.3-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1h-0.2h-0.3h-0.4h-0.3l-0.7-0.1h-0.7h-0.7h-0.7h-0.7H395h-0.6V320.2z
|
105 |
+
M185.1,311.1v0.5l-0.1,0.5l0,0l-0.2,0.5l-0.3,0.5l0,0l-0.2,0.3l-0.3,0.2l0,0l-0.2,0.2l0,0l0.4,0.4l0.1,0.1l0.2,0.3h0.1l0.2,0.3
|
106 |
+
l0,0l0.1,0.3h0.1l0.1,0.4l0,0l0.1,0.3l0,0l0.1,0.3l0,0l-0.1,0.4v0.1l-0.1,0.5v0.1l-0.2,0.4l-0.1,0.1l-0.2,0.3l-0.1,0.2l-0.2,0.3
|
107 |
+
l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l1.4-0.4l1.5-0.4l1.6-0.4l1.6-0.4l1.7-0.4l1.6-0.4
|
108 |
+
l1.6-0.5l1.7-0.5l1.6-0.5l1.6-0.5l1.6-0.5l0,0h-0.2l-1.1-0.2l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-0.5-0.2l-0.5-0.2
|
109 |
+
l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.2h-0.1l-0.3-0.2l0,0l-0.4-0.3l0,0l-0.2-0.3l-0.2-0.3h-0.1
|
110 |
+
l-0.1-0.3l-0.5-0.1l-0.8-0.2L185.1,311.1z M222.2,319.9h0.4h1.1h1h1.1h1h1.1l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
|
111 |
+
l-0.4-0.2l0,0h-0.6h-0.2H224h-0.1l-0.4-0.1l-0.2-0.1h-0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
112 |
+
l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.3,0.2h-0.1h1.6h0.8L222.2,319.9z M297.2,316.3l-2.4,0.3l-2.4,0.3l-2.4,0.3l-4.8,0.6l-4.8,0.6
|
113 |
+
l-2.4,0.3l-2.4,0.3h1h2.9h1.6h1.7h1.7h1.8l1.8-0.1l2-0.1h0.9h0.9l1-0.1l0.9-0.1l1-0.1l0.9-0.1l0.9-0.1l1-0.1l0.9-0.1l0.9-0.1
|
114 |
+
l1-0.1l0.9-0.1l0,0v-0.1l-0.1-0.3v-0.1l-0.1-0.3v-0.1v-0.3v-0.1v-0.3l0,0h-0.8h-1.2L297.2,316.3z M345.5,317.8L343,318l-0.9,0.1
|
115 |
+
l1.2,0.1l1.4,0.1l1.4,0.1h0.1l-0.1-0.2l0,0v-0.4L345.5,317.8z M159.4,308.6l-1.8,0.1l-1.8,0.1l-1.8,0.1h-0.5h-0.9h-1.3h-0.8h-0.8
|
116 |
+
h-0.9h-1h-1h-1.1h-1.1l-1.1,0.1l-1.1,0.1h-0.2l-0.1,0.2l-0.4,0.5l-0.4,0.3h0.1h0.7h0.6h0.6h0.6h0.6h1.1h1.1l1.2-0.1l1.1-0.1
|
117 |
+
l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l2.4-0.2l2.4-0.2l2-0.2l-0.8-0.2L159.4,308.6z M219.2,306.9l-2,0.1l-1.6,0.1l0.2,0.1
|
118 |
+
l0.3,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2h0.1h0.8l3,0.1l3,0.1l6,0.2l6,0.2l3.5,0.1l3.5,0.1l3.5,0.1h0.1h-0.2
|
119 |
+
l-0.3-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.1-0.1h-0.6l-2-0.1l-2-0.1l-2-0.1l-2-0.1l-2-0.1l-2-0.2l-2-0.2l-0.9-0.1l-0.9-0.1
|
120 |
+
l-0.9-0.1l-0.9-0.1l-1.8-0.2l-1.8-0.2l-1.8-0.2l-1.4-0.2H219.2z M288.8,304.3h-1.2h-0.8l1.2,0.1h0.2l2.5-0.1l2.4-0.1l0,0h-0.8
|
121 |
+
h-1.2h-1.2L288.8,304.3z"
|
122 |
+
/>
|
123 |
+
<path
|
124 |
+
fill="#DCDDDE"
|
125 |
+
d="M582.2,247.8h2.8h1.4h1.4h1.4h1.4h1.4h0.7h0.7h0.7h0.7h0.7h0.7l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1
|
126 |
+
l0.7-0.1l0.7-0.1l0.7-0.1l0.5-0.1l0.6-0.1l1.1-0.2l1.2-0.1l1.1-0.1l2-0.2l0.8-0.1h0.6l0.5,0.1l0.5,0.2l0.5,0.3l0.4,0.4l0.3,0.5
|
127 |
+
l0.2,0.5l0.1,0.6v0.6l-0.1,0.6l-0.2,0.5l-0.3,0.5l-0.4,0.4l-0.5,0.3l-0.5,0.2l-0.4,0.1h1.2h1.9l0.7-0.1l1.7-0.2l0.9-0.1l0.9-0.1
|
128 |
+
l0.8-0.1l0.9-0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.4l0.4,0.1l0.9,0.1l0.9,0.2l0.9,0.2l0.5,0.1l0.4,0.1l0.4,0.1
|
129 |
+
l0.4,0.1l0.2,0.1l0.2,0.1h0.1l0.3,0.2l0.3,0.2h0.1l0,0h0.2h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l1.1,0.1l1.1,0.2l1,0.2l1,0.1
|
130 |
+
l0.9,0.1h0.4h0.4h0.3h0.4l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1.8,0.3h0.1l1-0.1
|
131 |
+
l1.4-0.1l1.4-0.1l0.9-0.1l-0.4-0.2l-0.8-0.4l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2h-0.1l-0.2-0.3h-0.1l-0.3-0.5l0,0
|
132 |
+
l-0.1-0.3l-0.1-0.3l0,0l-0.1-0.4l-0.1-0.4l0,0l0.1-0.4l0.1-0.4l0,0l0.2-0.3l0.2-0.3l0,0l0.4-0.5l0,0l0.4-0.3h0.1l0.2-0.2l0.2-0.1
|
133 |
+
l0.2-0.1l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.8h0.8h0.8h0.8h0.7h0.7l0.6,0.1l0.7,0.1l0.7,0.1
|
134 |
+
l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.8,0.2h1.1h0.8h0.7h0.7h0.6l1.6,0.1l1.6,0.1l1.6,0.1l1.5,0.1l1.6,0.1l1.5,0.1l1.6,0.1l1.5,0.1
|
135 |
+
l3,0.3l2.6,0.2h0.3h1.8h2.2h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1.1,0.1l1.1,0.1l1.2,0.1l0.4,0.1l0.5,0.1l0.5,0.1h0.1
|
136 |
+
l0.1-0.1l0.2-0.2h0.1l0.4-0.2h0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1h0.2h0.2h0.3h0.2h0.3h0.6h0.6l0.6,0.1l0.5,0.2l0.5,0.3l0.5,0.4
|
137 |
+
l0.4,0.4l0.2,0.5l0.2,0.6l0,0h0.2l0.6,0.2l0.6,0.1l1.2,0.1l1.8,0.1l3.6,0.2l1.8,0.1l1.7,0.1l1.8,0.1h0.9h0.8h0.1h0.1h0.1h0.1h0.3
|
138 |
+
h0.3l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.9-0.2l0.9-0.2l1-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.3h0.2h0.3h0.3
|
139 |
+
h0.2h0.3h0.3l0.4,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.2l0.1,0.1l0.2,0.2l0.1,0.1l0.2,0.2l0.1,0.1
|
140 |
+
l0.2,0.3l0.1,0.1l0.1,0.3l0.1,0.1l0.1,0.2l0.1,0.1l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4v0.3v0.3v0.1l-0.1,0.4v0.1l-0.1,0.4v0.1
|
141 |
+
l-0.1,0.1h0.2h0.9h0.8h0.9h0.9h0.9h0.5h0.6h0.6l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.3,0.1l0.4,0.1
|
142 |
+
l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.2l0.2,0.2l0.1,0.1l0.2,0.2l0,0l0.2,0.3h0.1l0.2,0.3l0.5-0.2l0.9-0.3l0.9-0.3
|
143 |
+
l0.9-0.3l1.6-0.5l2-0.6l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l0.9-0.3l0.9-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.3h0.1h0.4h0.1
|
144 |
+
l0.3,0.1l0.3,0.1h0.1l0.4,0.2l0.4,0.2l0.3,0.3h0.1l0.4,0.4l0.2,0.5l0.2,0.5l0.1,0.5l0,0l-0.1,0.6l-0.1,0.5l-0.2,0.5h-0.1l-0.2,0.3
|
145 |
+
l-0.2,0.2h-0.1l-0.3,0.3l-0.1,0.1l-0.2,0.2l-0.4,0.2l-0.4,0.2l-0.6,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.6,0.2l-0.5,0.2l-0.6,0.2
|
146 |
+
l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.2,0.3l-1.2,0.3l0.8,0.1h0.4h7.9
|
147 |
+
h4h3.9h1.9h1.2h1.5h1.5h0.8h0.8h0.8h0.9l0.9,0.1l0.9,0.1l0.8,0.1l0.9,0.1l0.9,0.1l0.8,0.1l0.9,0.1l0.8,0.1l0.8,0.1l0.4,0.1
|
148 |
+
l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2
|
149 |
+
l0.3,0.2l0.3,0.3l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.2l0.2,0.3v0.1l0.1,0.3l0.1,0.1l0.1,0.5v0.1v0.6v0.1v0.3l-0.1,0.3v0.1l-0.1,0.3
|
150 |
+
l-0.2,0.3l0,0l-0.2,0.3l-0.2,0.3l0,0l-0.4,0.3l0,0l-0.4,0.3h-0.1l-0.3,0.1H804l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.3h-0.4h-0.4
|
151 |
+
h-0.4h-0.4h-0.4h-0.4H800l-0.8-0.1l-0.9-0.1l-1.7-0.3l-0.8-0.1h-0.4H795h-0.3h-0.3h-0.2H794h-2.6h-2.5h-1.2h-1.2h-1.2h-1.2h-1.2
|
152 |
+
l-1.2-0.1H781h-0.6h-0.7h-0.6l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
|
153 |
+
l-1.4-0.2l-1.4-0.3l-1.5-0.3l-3.3-0.6h-0.2h-3h-4h-3.9h-4h-4h-2h-2h-0.8l-0.4,0.1l-0.7,0.2l-1.4,0.5l-1.4,0.5l-0.8,0.2l-0.7,0.3
|
154 |
+
l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.3,0.1l-0.7,0.1l-0.7,0.1
|
155 |
+
l-0.7,0.1h-0.8H725h-0.4h-0.4h-0.4h-0.1l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1
|
156 |
+
l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.3,0.2l-1.4,0.1l-1.4,0.1
|
157 |
+
l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1h-1.4h-1.4h-1.3h-1.4h-1.4h-1.4H691h-1.3h-1.4H687h-1.4h-1.3l-1.2-0.1l-1.1-0.1l-1.2-0.1
|
158 |
+
h-0.6l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1.4-0.2l-0.7-0.1
|
159 |
+
l-0.8-0.1l-0.8-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.2-0.2l-0.2-0.1
|
160 |
+
l-0.2-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.1-0.4l-0.1-0.1l-0.1-0.5v-0.1l-0.1-0.5v-0.1
|
161 |
+
l0.1-0.5v-0.1l0.1-0.5v-0.1l0.2-0.4l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2
|
162 |
+
l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.4-0.1l0.7-0.3l0.7-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2
|
163 |
+
l0.7-0.2l0.7-0.2l0.8-0.2l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.1v-0.1v-0.1l0.1-0.4V266l0.1-0.3v-0.1
|
164 |
+
l0.2-0.3v-0.1l0.1-0.1l-0.5-0.1l-0.8-0.1l-0.9-0.1l-0.8-0.2l-0.9-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.6-0.2h-0.2h-0.5
|
165 |
+
h-0.5h-0.5l-0.9-0.1l-0.9-0.1l-0.8-0.1L670,263h-0.7l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1h-0.1l-1.2,0.2
|
166 |
+
l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-0.6,0.1l-0.7,0.1l-0.6,0.1l-0.7,0.1l-0.6,0.1l-0.6,0.1h-0.7
|
167 |
+
H649h-0.6h-0.7h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1l-0.6-0.1l-0.5-0.1
|
168 |
+
l-0.6-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.6-0.2l-0.4-0.2l-3.7,0.5l-2.8,0.3l-2.7,0.3l-0.9,0.1l-0.9,0.1l-0.9,0.1
|
169 |
+
l-0.9,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1l-0.8,0.1h-0.8h-0.9h-0.8h-0.8l-1.6,0.1H612h-1.6h-1.6h-1.7h-1l-0.5,0.2l-0.7,0.3l-0.7,0.3
|
170 |
+
l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.2l-0.7,0.2l-0.7,0.2l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.7,0.2
|
171 |
+
l-0.8,0.2l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-1.5,0.3l-1.5,0.3l-1.5,0.3l-0.7,0.1l-1.1,0.4
|
172 |
+
l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.4,0.5l-1.4,0.5l-1.3,0.5l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2
|
173 |
+
l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2L564,278l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.4,0.1l-0.4,0.1l-0.9,0.2l-2.3,0.6
|
174 |
+
l-1.4,0.3l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.4h-0.4h-0.4
|
175 |
+
H545h-0.4h-0.4h-0.4h-0.4H543h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2
|
176 |
+
l-0.4-0.2l-0.4-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.4v-0.1l-0.1-0.5
|
177 |
+
l-0.1-0.1V277v-0.1v-0.5l0.1-0.1l0.1-0.5v-0.1l0.2-0.4l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.2-0.2
|
178 |
+
l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2
|
179 |
+
l0.8-0.2l0.7-0.2l0.2-0.1l0.3-0.1l1.3-0.4l0.7-0.2l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.8-0.1l0.8-0.1
|
180 |
+
l0.7-0.1l1.4-0.2l0.7-0.1l0.7-0.1l0.8-0.1l0.9-0.2l1.1-0.2l1.2-0.2l1.3-0.2l1.3-0.2l1.4-0.2l1.4-0.2l1.4-0.2l1.4-0.2l2.9-0.4
|
181 |
+
l3-0.5l1.5-0.2l1.5-0.2l1.5-0.2h0.2l0.8-0.4l2.5-1.1l2.5-1.1l-0.1-0.1h-9.7h-0.2h-0.2h-0.4h-0.5h-0.6l-1.2,0.1l-0.7,0.1l-0.6,0.1
|
182 |
+
h-0.7h-0.5h-0.3h-0.3h-0.3h-0.3h-0.2l-0.5-0.1h-0.1l-0.3-0.1l-0.3-0.2l0,0l-0.3-0.2l-0.2-0.2h-0.1l-0.1-0.1l-0.5,0.1l-0.7,0.1
|
183 |
+
l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.7h-0.7h-0.7H561h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
|
184 |
+
l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1-0.2l-2.4,0.6l-1.7,0.4l-1.8,0.4
|
185 |
+
l-2,0.4l-2,0.4L534,264l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2L523,266l-1.1,0.2
|
186 |
+
l-1.1,0.2l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1H512h-1.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5
|
187 |
+
h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.5-0.1
|
188 |
+
l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3
|
189 |
+
l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.3l-0.1-0.3l-0.1-0.2v-0.3v-0.2
|
190 |
+
l-0.1-0.3l0.1-0.2v-0.3v-0.2l0.1-0.3v-0.2l0.1-0.3l0.1-0.1l0.1-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.2-0.2l0.3-0.3l0.3-0.3
|
191 |
+
l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.6-0.1
|
192 |
+
l0.6-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.5h0.3v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3
|
193 |
+
l0.1-0.3l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1
|
194 |
+
l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7h0.6h0.6h0.6h0.6
|
195 |
+
h0.6h0.6h1.1h2.2h1.1h1.1h8.9h0.3h0.2h0.2h0.2h0.2h0.2h0.3h0.3l0.5-0.1l0.6-0.1l0.7-0.1l0.6-0.1l0.7-0.1l0.7-0.2l1.4-0.3l0.7-0.2
|
196 |
+
l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
|
197 |
+
l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.3l0.3,0.3l0.4,0.3l0.3,0.3l0.2,0.3l0.3,0.3l0.1,0.2l0.1,0.2
|
198 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.5,0.1l1.5,0.2l1.4,0.2l0.7,0.1l0.6,0.1l0.6,0.1l0.5,0.1
|
199 |
+
l1,0.1l0.9,0.1l1,0.1l1,0.1l0.9,0.1h0.5l0,0l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.5-0.2l0.5-0.2l0.5-0.2
|
200 |
+
l0.5-0.2l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5
|
201 |
+
h0.4h1.5L582.2,247.8z M689.3,272.3h-0.8h-0.8h-0.8h-0.8h-0.8l-0.8,0.1l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
|
202 |
+
l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.5,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
|
203 |
+
l0.5,0.1h0.5l1.1,0.1l1.1,0.1l1.1,0.1h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3l1.3-0.1l1.3-0.1l1.3-0.1l1.2-0.1l1.3-0.1
|
204 |
+
l1.3-0.1l1.3-0.1l0.6-0.1l0.7-0.1l0.7-0.1l0.6-0.1h0.2h-1.4h-1.5H706h-1.5H703h-1.5H700l-1.2-0.1l-1.2-0.1l-1.3-0.1h-0.7H695
|
205 |
+
l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.1l-0.5-0.1L689.3,272.3z M504.5,259h-0.4h-0.5h-0.5h-0.5
|
206 |
+
h-0.5h-0.5l-0.4,0.1l-0.5,0.1l-0.4,0.1h-0.2H500l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
207 |
+
l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.4h0.4h0.4h0.4h0.4
|
208 |
+
h0.4h0.5h0.4h0.5h0.4h0.5h0.5h0.9h1l1-0.1l1-0.1l1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1
|
209 |
+
l-2.1-0.2l-2.1-0.3l-2.1-0.2l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-0.9-0.1h-0.2h-0.5h-0.7h-0.8L504.5,259L504.5,259z M624.9,258.1
|
210 |
+
l-0.1,0.2l1.5-0.2h0.1l0,0H624.9L624.9,258.1L624.9,258.1z M707.9,257.6l0.5,0.1l0.5,0.1l0.6,0.1l0.7,0.1l1.2,0.2l1.4,0.2h0.2
|
211 |
+
l0.3-0.1l0,0l-0.4-0.2l-0.4-0.2l0,0l-0.9-0.1l-2.3-0.1l-2-0.1h-0.2H707.9z"
|
212 |
+
/>
|
213 |
+
</g>
|
214 |
+
<g transform="matrix(0.998358,0.0572833,-0.0572833,0.998358,15.545,-79.3702)">
|
215 |
+
<g>
|
216 |
+
<g>
|
217 |
+
<g transform="matrix(1,0,0,1,398.965,43.2222)">
|
218 |
+
<path
|
219 |
+
fill="#0096FF"
|
220 |
+
d="M73.8,141.4c0.7,0.2-1.1-1-1.5-1.6c-0.9-1.5,2.2-4.9,2.2-4.9c3.4-5.2,7.1-9.9,11-14.8
|
221 |
+
c1.8-2.2,2.9-7.9,5.5-6.6c2.4,1.2-12.2,20.2-13.7,21.9c-1.4,1.6-4.4,6.5-4.4,4.4c0-8.8,14.7-31.8,23-34.6
|
222 |
+
c1.9-0.6-1.5,3.8-2.7,5.5c-0.4,0.5-9.3,12.1-11.5,9.9c-1.4-1.4,1.7-7,2.2-7.7c4.6-7.2,10.6-13.6,17-19.2
|
223 |
+
c2.6-2.3,5.1-4.9,7.7-7.1c1.3-1.1,3.8-5,3.8-3.3c0,5-10.9,14.5-14.3,18.1c-1.6,1.7-3.8,6-5.5,4.4c-2.2-2.2,3.5-5.2,5.5-7.7
|
224 |
+
c5.4-6.7,11-13,17.6-18.7c2-1.7,5.3-4.6,7.7-6c2-1.2,6.5-6.5,5.5-4.4c-4.5,9-22.9,15.6-11,5.5c17.2-14.6,33.4-19.6,53.8-26.3
|
225 |
+
c11.7-3.9,17.5-13.2,31.3-10.4c6.4,1.3,14.9,1.8,20.9,3.8c7.3,2.4,14.8,8.8,22.5,8.8c1.3,0-2.6,0.2-3.8,0
|
226 |
+
c-2.5-0.4-4.9-1.3-7.1-2.2c-8.1-3.2-16.5-5-24.7-7.7c-0.7-0.2-1.5-7.1-1.1-7.1c1.3,0,3.6,3.6,5.5,3.8
|
227 |
+
c12.3,1.8,20.7,8.4,32.4,13.7c22.6,10.3,41.6,23.5,58.7,40.6c13.3,13.3,10.8,40,15.9,55.4c2.8,8.5,3.1,19,5.5,28.5
|
228 |
+
c1.2,4.7,4.1,11.7,2.2,17.6c-0.7,2-0.2,4.6-1.6,6c-1,1-11-1.2-12.6-1.6c-12.4-3.1-27.3-1.1-40.1-1.1
|
229 |
+
c-13.3,0-31.3,5.8-42.8,11.5c-5.8,2.9-15.5,0.6-21.9,2.7c-6.1,2-17.2-0.7-23-2.2s-12.2-0.5-18.1-1.6c-9.3-1.9-18.1-5.5-28-7.1
|
230 |
+
c-17.9-3-41,1-58.2,4.4c-4.6,0.9-10.8,3.8-15.4,3.8c-5.9,0-11.9-0.5-17.6-0.5c-0.9,0-8.8,1.5-8.8,0.5c0-6.2,10.5-16.6,12.6-23
|
231 |
+
c6.8-20.3,4-39.2,24.7-51.6c5.3-3.2,16.3-10.1,23-7.1c10.2,4.5-3.5,26.8-5.5,30.7c-1.7,3.4-3.8,6.5-5.5,9.9
|
232 |
+
c-0.3,0.7-5.8,12.5-6.6,14.3c-0.7,1.6-2.4,6-1.1,4.9c24.9-21.4,45.1-47,72.4-65.8c7-4.9,19.9-13.4,28-18.1
|
233 |
+
c2.2-1.3,8.3-5,7.1-2.7c-2.1,4.3-14.3,15-15.4,15.9c-16.6,15-33.5,29.5-51,43.3c-2.1,1.7-10.6,10.4-14.3,8.8
|
234 |
+
c-2.9-1.3,1.7-6.1,3.3-8.8c4-6.8,4-6.4,7.7-13.2c8.7-16.1,18.3-32.5,30.7-46.1c5.2-5.8,9.5-10.4,15.4-15.4
|
235 |
+
c1.4-1.2,5.4-4.6,4.9-2.7c-1.1,4.3-7.7,8.4-11,11.5c-13.9,13.2-21.5,20.4-36.2,32.9c-3.8,3.2-7.6,6.3-11.5,9.3
|
236 |
+
c-0.2,0.2-5.1,4.2-5.1,2c0-2.4,15-17.5,17.4-20c19.7-20.9,43.7-41.6,70.3-53.3c3.7-1.6,36.7-14.9,30.5,1.6
|
237 |
+
c-0.9,2.5-2.2,4.8-3.6,7.1c-1.4,2.5-3,4.9-4.7,7.2c-4.6,6.6-11.3,15.3-16.5,21.4c-0.3,0.3-14.5,16.8-19.2,21.9
|
238 |
+
c-12.9,14.2-25.4,29.2-39,42.8c-2.3,2.3,4.9-4.3,7.1-6.6c4.2-4.4,8.3-8.9,12.6-13.2c17-16.7,34.9-32.5,53.2-47.7
|
239 |
+
c2.5-2.1,10.2-9.4,15.4-10.4c2.3-0.5-1.7,4.5-3.1,6.3c-1.5,2-3,3.9-4.5,5.7c-4.9,5.7-14,15.5-19.2,20.9
|
240 |
+
c-15,15.4-30,30.7-45,46.1c-6.9,7.1-6.8,6.8-13.2,14.3c-0.4,0.5-1.7,1.8-1.1,1.6c8.5-1.7,13-11.5,19.2-17.6
|
241 |
+
c20.5-20.2,41.2-40.1,63.6-58.2c4.9-3.9,14.5-11.4,21.2-15.7c1.4-0.9,14.5-8.4,9.5,0.8c-1.4,2.6-3.1,4.9-4.8,7.3
|
242 |
+
c-2,2.7-4.1,5.4-6.1,8c-5.8,7.5-11.3,14.2-17.6,21.4c-10.5,11.9-24.6,23.5-31.8,37.9c-1,2,3.9-2.3,5.5-3.8
|
243 |
+
c3.3-3.1,6.2-6.6,9.3-9.9c14-14.7,28.3-28.8,44.4-41.2c3.5-2.7,7.2-5.3,11-7.7c2.6-1.7,9.6-6.3,8.8-3.3
|
244 |
+
c-2.5,9.5-15.1,18.9-21.4,25.2c-21.4,21.7-43.1,45.9-67.5,64.2c-2.2,1.6,3.5-4.2,5.5-6c4-3.7,7.9-7.5,12.1-11
|
245 |
+
c16-13.6,32.5-27.1,49.9-39c4.5-3,10.5-7.2,16-9.6c2-0.9,6.8-3,6.5-0.8c-1.6,12-23.9,29.7-30.7,36.8c-5.2,5.4-15.4,9-15.4,16.5
|
246 |
+
c0,1.3,2.5-0.6,3.7-1.1c4.1-1.7,4.3-2,8.3-5.2c9.8-7.6,19-16.1,29.2-23.3c2.8-2,5.8-3.7,8.8-5.5c1-0.6,3-2.8,3.3-1.6
|
247 |
+
c1.5,5.8-14,19.7-16.5,22.5c-2.3,2.7-4.5,5.4-6.6,8.2c-0.8,1.1-2.8,4.6-1.6,3.8c5.1-3.1,8.5-6.5,13.2-10.4c2.4-2,4.7-4.1,7.1-6
|
248 |
+
c1.8-1.5,3.5-3.1,5.5-4.4c14.7-9.8-6,15.4-6,18.7c0,2.5,4.7-1.8,6.6-3.3c2.9-2.3,7.3-7.4,11.9-5.9c3.6,1.2-2.4,11.3-0.9,13.6
|
249 |
+
c2.1,3.1,8.1-3.9,9.3-2.7c0.6,0.6,0.8,5.3,0,6c-2.1,2.1-5.8-4.9-7.1-4.9"
|
250 |
+
/>
|
251 |
+
<path
|
252 |
+
fill="#0096FF"
|
253 |
+
d="M210.4,9.7h1l1,0.1l1.2,0.2l1.2,0.2h0.1l1.3,0.3l1.3,0.4h0.1l1,0.4l1,0.4l0.9,0.4l1.5,0.8l1.2,0.8l1,0.7
|
254 |
+
l0.5,0.4l0.3,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
|
255 |
+
l0.7,0.3l1.3,0.5l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6L243,22l1.1,0.6l1.1,0.6l1,0.6l2,1.1l1.9,1l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.4
|
256 |
+
l0.7,0.3l1.3,0.5l1.4,0.7l1.4,0.7l0.1,0.1l0.9,0.4l1.2,0.5l1.2,0.5l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6
|
257 |
+
l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7
|
258 |
+
l1.1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8
|
259 |
+
l1,0.8l1,0.8l1,0.8l0.9,0.8L311,64l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9
|
260 |
+
l0.9,0.9l0.9,0.9l0.5,0.6l0.6,0.6l0.6,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.7l0.5,0.6l0.5,0.6l0.4,0.7l0.4,0.7
|
261 |
+
l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.6l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.6l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.6
|
262 |
+
l0.3,0.7l0.3,0.6l0.2,0.6l0.3,0.7l0.4,1.2l0.4,1.3l0.4,1.3l0.4,1.3l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.2,1.2
|
263 |
+
l0.2,1.2l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.3,2.1l0.3,2l0.5,3.8l0.2,1.8l0.2,1.7l0.1,0.8
|
264 |
+
l0.1,0.8l0.1,0.8l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.4l0.1,0.4l0.1,0.3l0.2,0.5
|
265 |
+
l0.3,1l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.2,1.2l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1l0.2,1l0.2,1l0.3,1.9l0.5,3.7
|
266 |
+
l0.3,1.7l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.6l0.1,0.6l0.1,0.6v0.1v0.2l0.2,0.7l0.6,2l0.4,1.2
|
267 |
+
l0.2,0.7l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.9l0.2,0.9l0.2,1l0.2,1l0.2,1.1l0.2,1.1l0.1,1.2l0.1,1.2l0.1,1.2v0.7v0.7v0.7v0.7v0.7
|
268 |
+
v0.7v0.7l-0.1,0.7l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.1,0.6l0,0l-0.1,0.9l-0.1,1l-0.1,0.8
|
269 |
+
l-0.2,0.8l-0.2,0.8l-0.2,0.9l-0.3,1l-0.4,1.1l-0.4,1.1l-0.5,1.2l-0.6,1.3l-0.7,1.3l-0.8,1.3l-0.9,1.3l-1.1,1.3l-0.7,0.7l-1,1
|
270 |
+
l-1,0.9h-0.1l-0.9,0.7l-0.9,0.7l-1,0.6h-0.1l-1.3,0.7l-1.3,0.7l-1,0.5l-1.9,0.7l-1.6,0.4l-1.4,0.3l-1.2,0.2l-1.2,0.1l-1.5,0.1
|
271 |
+
H326h-1.2l-1-0.1l-0.9-0.1l-0.9-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1.2-0.2l-1.1-0.2l-1-0.2
|
272 |
+
l-0.9-0.2l-0.8-0.2l-0.5-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1h-0.4h-0.4H305
|
273 |
+
h-0.4h-0.4h-0.4h-0.4H303h-0.4h-0.5h-0.4h-1h-1h-1h-1.1h-1.1h-1.1h-1.1h-1.2h-1.2h-1.2l-2.5,0.1l-2.5,0.1l-2.6,0.1h-1.3h-1.4
|
274 |
+
H279h-1.4h-1.4h-1.3h0.1h-0.3h-0.3H274h-0.4h-0.4h-0.4h-0.4H272h-0.4l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1
|
275 |
+
l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.2
|
276 |
+
l-0.6,0.2l-0.6,0.2l-0.5,0.2l-1.2,0.3l-1.2,0.4l-1.2,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1,0.4l-1,0.4
|
277 |
+
l-1,0.4l-0.9,0.4l-0.9,0.4l-0.8,0.4l-1,0.5l-0.7,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.3l-0.8,0.3l-0.9,0.3l-0.8,0.2l-0.8,0.2l-0.8,0.2
|
278 |
+
l-0.8,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.2,0.1l-1.2,0.1l-1.1,0.1l-1.1,0.1h-1h-1H223h-0.8h-1.5
|
279 |
+
h-1.3h-0.5h-0.5H218h-0.3h-0.3l0,0h-0.1l-0.9,0.3l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.8,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
|
280 |
+
l-0.7,0.1l-0.7,0.1h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-1.2l-1.3-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2
|
281 |
+
l-1.1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-0.9-0.2l-0.9-0.2l-1.7-0.4l-1.6-0.4l-1.4-0.3l-1.1-0.3h-0.1l0,0h-0.1h-0.1h-0.1h-0.2
|
282 |
+
h-0.2H181h-0.3h-0.3h-0.3h-0.3h-0.9h-1h-1.2h-1.3l-1.4-0.1h-0.8h-0.8l-0.8-0.1l-0.9-0.1l-0.9-0.1l-1-0.1l-1-0.1l-1-0.1
|
283 |
+
l-1.1-0.2l-1-0.2l-1.2-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.3l-1.1-0.3l-1-0.3l-1-0.3l-1-0.3l-1.9-0.5l-1.9-0.5l-3.5-1l-1.6-0.5
|
284 |
+
l-1.6-0.5l-0.7-0.2l-0.8-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.1l-0.7-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
|
285 |
+
l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1h-0.6h-0.7h-0.7h-0.7H130h-0.7h-0.7h-0.7h-0.7h-0.7h-0.8h-0.8
|
286 |
+
h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-1.7,0.2
|
287 |
+
l-1.7,0.2l-1.7,0.2l-1.7,0.2l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.6,0.3l-1.6,0.3l-1.6,0.3l-1.6,0.3
|
288 |
+
l-1.5,0.3h-0.1l0,0h-0.1h-0.2l-0.2,0.1l-0.2,0.1l-0.7,0.2l-0.8,0.2l-0.9,0.3l-1,0.3l-1.2,0.4l-1.2,0.4l-0.7,0.2l-0.7,0.2
|
289 |
+
l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.9,0.2l-0.9,0.2l-1,0.2l-1,0.2l-1.1,0.2l-1.1,0.1l-1.2,0.1l-1.2,0.1H68h-1.5h-1.3h-1.3h-1.3
|
290 |
+
h-1.2l-1.2-0.1l-2.3-0.1l-2.2-0.1h-1h-1h-0.9h-0.9h-0.3l-1.3,0.2l-0.9,0.1l-1,0.1l-1.1,0.1l-1.2,0.1l-0.7,0.1h-0.7h-0.8H43
|
291 |
+
h-1.1l-1.3-0.1l-1.7-0.2l-2-0.4l-1.8-0.5l-0.8-0.3l-1-0.4l-1-0.4h-0.1l-1.3-0.6l-1.2-0.7h-0.1l-1.1-0.7l-1.1-0.8l-1-0.8l0,0
|
292 |
+
l-1.2-1.1l-1.1-1.2l-1-1.2l0,0l-0.9-1.2l-0.8-1.3l-0.7-1.3l-0.6-1.4l0,0l-0.6-1.5l-0.5-1.6l-0.4-1.6l-0.3-1.6l0,0l-0.1-1.2
|
293 |
+
l-0.1-1.2v-1.2l0-0.9l0.1-1.4l0.2-1.3l0.2-1.3l0.2-1.2l0.3-1.1l0.3-1.1l0.3-1l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.8l0.3-0.8l0.3-0.7
|
294 |
+
l0.4-0.7l0.3-0.7l0.3-0.7l0.3-0.6l0.3-0.6l0.4-0.6l0.7-1.1l0.7-1.1l0.7-1l0.7-1l0.6-0.9l0.6-0.9l1.1-1.6l1.1-1.5l0.5-0.7
|
295 |
+
l0.4-0.6l0.4-0.6l0.3-0.5l0.3-0.4l0.2-0.4l0,0l0.2-0.5l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.8l0.2-0.8l0.2-0.8
|
296 |
+
l0.2-0.8l0.2-0.8l0.4-1.7l0.4-1.7l0.8-3.6l0.4-1.9l0.2-1l0.2-1l0.2-1l0.2-1l0.3-1l0.3-1.1l0.3-1.1L38,152l0.3-1.1l0.3-1.1
|
297 |
+
l0.4-1.1l0.4-1.1l0.4-1.2l0.4-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.3-0.7l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
|
298 |
+
l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.6l0.5-0.6l0.5-0.6l0.5-0.6
|
299 |
+
l0.5-0.6l0.5-0.6l0.5-0.6v-0.1v-0.1l0.4-1l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9
|
300 |
+
l0.5-0.9l0.5-0.9l0.5-0.9l0,0l0.2-0.7l0.3-0.9l0.3-0.8l0.3-0.8l0.3-0.7l0.3-0.7l0.3-0.7l0.5-1.1l0.5-1l0.5-0.9l0.4-0.8l0.4-0.8
|
301 |
+
l0.4-0.8l0.5-0.8l0.7-1.1l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.8l0.6-0.8l0.6-0.8l0.6-0.8l0.7-0.8l0.7-0.8l0.7-0.8
|
302 |
+
l0.7-0.8l0.7-0.8l0.7-0.8l0.7-0.8l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7
|
303 |
+
l0.7-0.6l0.7-0.6l0.7-0.6l0.6-0.6l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.9-0.8l0.9-0.9l1-1l0.2-0.1l0.2-0.3l0.6-0.7l0.6-0.7
|
304 |
+
l0.7-0.7l0.7-0.7l0.1-0.1l0.3-0.6l0.5-1l0.6-1l0.8-1.3l0.9-1.3l0.8-1.1L97,62l0.8-0.9l0.8-0.8l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7
|
305 |
+
l0.8-0.7l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.6l1-0.6l1-0.6l1-0.6l1-0.6l1-0.6
|
306 |
+
l1-0.6l1-0.6l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4
|
307 |
+
l1-0.4l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.6l1.9-0.6l3.7-1.2l3.7-1.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
|
308 |
+
l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.2l0.3-0.1l0.7-0.4l0.7-0.4l0.8-0.4l1.7-1l1-0.6
|
309 |
+
l1.1-0.6l1.1-0.6l0.7-0.4l0.6-0.3l0.7-0.3l0.7-0.3l0.7-0.4l0.7-0.3l0.8-0.4l0.8-0.3l0.8-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3
|
310 |
+
l0.9-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.1l1.1-0.1l1.2-0.1h0.6h0.1l1.4-0.8l1.4-0.7l1.5-0.6l1.5-0.5
|
311 |
+
l1.5-0.4l0,0l1.6-0.3l1.6-0.2l1.6-0.1L210.4,9.7z M55.5,120.7l-0.1,0.1L55.5,120.7L55.5,120.7z"
|
312 |
+
/>
|
313 |
+
</g>
|
314 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
315 |
+
<path
|
316 |
+
fill="#E2F0FD"
|
317 |
+
d="M184.1,73.1l1.4,0.1l1.3,0.2l1,0.2l0.9,0.2l0.9,0.3l0.9,0.3l0.9,0.4l1,0.5l1,0.5l1,0.6l1,0.7l0.9,0.8
|
318 |
+
l0.9,0.9l0.9,0.9l0.8,1l0.7,1.1l0.7,1.1l0.6,1.1l0.5,1.1l0.4,1l0.3,0.9l0.2,0.7l0.2,0.7l0.2,0.7l0.1,0.7l0.1,0.7l0.1,0.7
|
319 |
+
l0.1,0.7l0.1,0.7l0.1,0.7V94v0.7v0.7v0.7v0.7v0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.2,0.6
|
320 |
+
l-0.2,0.6L202,104l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.5l-0.2,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.6l-0.5,0.9
|
321 |
+
l-0.5,1l-0.5,0.9l-0.5,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.8l-0.6,0.8l-0.6,0.8l-0.6,0.8l-0.6,0.7l-0.6,0.7l-0.6,0.7l-0.6,0.7
|
322 |
+
l-0.6,0.7l-0.6,0.7l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-1.1,1l-1.1,1l-1.1,1l-1.9,1.7
|
323 |
+
l-1.7,1.5l-0.7,0.6l-0.6,0.6l-0.5,0.5l-0.2,0.2l-0.2,0.2l-0.4,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3
|
324 |
+
l-0.5,0.3l-0.5,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6
|
325 |
+
h-0.6l0,0l-0.5,0.3l-0.9,0.4l-0.8,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1h-1h-1.1h-1.1
|
326 |
+
l-1.1-0.1l-1-0.1l-1-0.2l-1-0.2l-1-0.3l-1-0.3l-1-0.4l-0.9-0.4l-0.9-0.4l-0.9-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.7-0.5
|
327 |
+
l-0.7-0.6l-0.7-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.3-0.4l-1-0.2l-1.1-0.3l-1.1-0.4l-1.1-0.4l-1-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.6
|
328 |
+
l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.6-0.6l-0.6-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.5-0.9
|
329 |
+
l-0.5-1l-0.4-1l-0.4-0.9l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8l-0.1-0.7l-0.1-0.7
|
330 |
+
l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.7v-0.7l-0.1-1.2v-1.2l0-1.2V101v-1.1l0.1-1.1v-0.6l0.1-0.6
|
331 |
+
l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.8l0.2-1l0.4-1.4l0.3-0.8l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.3-0.5v-0.1l0.3-0.5l0.3-0.5
|
332 |
+
l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
|
333 |
+
l0.5-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1h0.4l0.3-0.2l0.5-0.4l0.5-0.4l0.5-0.3
|
334 |
+
l0.5-0.3l0.5-0.3l0,0l0.5-0.3l0.5-0.3l0.5-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
|
335 |
+
l0.6-0.1h0.6h0.6h0.6h0.6h0.6l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.3,0.2
|
336 |
+
l0.3-0.3l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.5l0.7-0.5l0.7-0.5l0.8-0.6l0.9-0.6l1-0.6l1.1-0.6l1.2-0.6l1.3-0.5l1.2-0.4l1.1-0.3
|
337 |
+
l1.2-0.2l1.2-0.2l1.3-0.1h1.3h1.4l1.4,0.1l1.4,0.2l1.4,0.3l1.5,0.5l1.4,0.6l1.3,0.7l1.3,0.8l0.1,0.1l0.6-0.1l1-0.1l1.1-0.1h1.2
|
338 |
+
L184.1,73.1z"
|
339 |
+
/>
|
340 |
+
</g>
|
341 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
342 |
+
<path
|
343 |
+
fill="#E2F0FD"
|
344 |
+
d="M104.3,122.6h0.2h0.2h0.2h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0,0
|
345 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
346 |
+
l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2
|
347 |
+
l0.1,0.2v0.2l0,0v0.2v0.2v0.2v0.2v0.2v0.2l0,0.3v0.5v0.4l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.6
|
348 |
+
l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.5l-0.3,0.5l-0.3,0.5
|
349 |
+
l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.2,0.3l-0.2,0.2l-0.3,0.3
|
350 |
+
l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.5,0.2l-0.5,0.2l-0.3,0.1l-0.2,0.1H100h-0.2h-0.1h-0.2h-0.2h-0.2H99h-0.2
|
351 |
+
h-0.1h-0.1h-0.2h-0.1h-0.2H98l-0.2,0.1l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.4,0.1h-0.2h-0.2h-0.2H94h-0.2h-0.2
|
352 |
+
h-0.2h-0.2H93h-0.2h-0.2h-0.2l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
|
353 |
+
l-0.3-0.3l-0.5-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6
|
354 |
+
v-0.6l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
|
355 |
+
l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.8-0.6l0.6-0.5
|
356 |
+
l0.5-0.4l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.2l0.8-0.6l0.5-0.4l0.6-0.4l0.6-0.4l0.7-0.4l0.7-0.4l0.4-0.2
|
357 |
+
l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.6-0.2l0.4-0.1l0.4-0.1l0.5-0.1L104.3,122.6z"
|
358 |
+
/>
|
359 |
+
</g>
|
360 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
361 |
+
<path
|
362 |
+
fill="#E2F0FD"
|
363 |
+
d="M77.7,183.2h0.2h0.2h0.2h0.1h0.2h0.2H79l0.3,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.6,0.2l0.6,0.3l0.7,0.3
|
364 |
+
l0.7,0.3l0.7,0.4l0.7,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.5l1.7,0.9l1.6,0.9l1.6,0.9l1.4,0.9l1.3,0.8l1.1,0.7l0.5,0.3
|
365 |
+
l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0,0l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2
|
366 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.2l-0.1,0.3
|
367 |
+
l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.3l-0.2,0.3l-0.1,0.2l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
368 |
+
l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1H100l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.2l-0.5,0.3l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
|
369 |
+
l-0.3,0.1l-0.5,0.1l-0.5,0.1h-0.3h-0.2h-0.2h-0.2h-0.1h-0.2H95h-0.2h-0.4l-0.6-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1
|
370 |
+
l-0.4-0.1l-0.6-0.2l-0.5-0.2l-0.4-0.2H90l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1h-0.9h-1h-1h-1h-1h-0.5h-0.5h-0.5h-0.5
|
371 |
+
h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
|
372 |
+
l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4
|
373 |
+
l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.2-0.3l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
|
374 |
+
l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.1-0.5l-0.1-0.5l-0.1-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.1-0.3l0.1-0.2l0.1-0.2
|
375 |
+
l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.3l0.5-0.4
|
376 |
+
l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2L66,185l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1
|
377 |
+
l0.7-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.6h0.4l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.2-0.1h0.2H77
|
378 |
+
l0.3-0.1l0.6-0.1L77.7,183.2z M82.6,187.1L82.6,187.1h-0.1H82.6z M72.7,185.7L72.7,185.7L72.7,185.7L72.7,185.7z"
|
379 |
+
/>
|
380 |
+
</g>
|
381 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
382 |
+
<path
|
383 |
+
fill="#0065FF"
|
384 |
+
d="M154.3,188.6l1.6-0.1l1.5-0.1l1.5-0.1h0.7h0.7h0.6l0.6-0.1h0.6l0.6-0.1l0.5-0.1l0.6-0.1l3.9-0.6l2-0.3
|
385 |
+
l2-0.3l2.1-0.3l2.1-0.3l2.1-0.3l2.1-0.3l2.1-0.4l2.1-0.4l2.1-0.4l2.1-0.4l2.1-0.4l1-0.2l1.1-0.2l1.1-0.2l1-0.2l1-0.2l1-0.2
|
386 |
+
l1-0.2l1-0.2l1-0.2l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3
|
387 |
+
l0.9-0.3l0.9-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.7-0.3l0.7-0.3l0.7-0.4l0.7-0.3l0.7-0.4l0.7-0.4l0.8-0.5
|
388 |
+
l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.7l0.8-0.7
|
389 |
+
l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8
|
390 |
+
l0.8-0.8l0.8-0.8l0.8-0.8l1.7-1.7l1.6-1.7l1.6-1.7l1.6-1.7l1.6-1.8l3.3-3.5l3.3-3.5l1.7-1.8l1.7-1.8l1.7-1.8l1.7-1.8l1.7-1.7
|
391 |
+
l0.9-0.9l0,0v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.7l0.1-0.8l0.1-0.8l0.1-0.9l0.1-0.9
|
392 |
+
l0.3-1.9l0.3-2l0.1-1.1l0.2-1.1l0.2-1.1l0.2-1.2l0.2-1.2l0.1-0.7l0.1-0.6l0.1-0.6l0.1-0.7l0.2-0.6l0.2-0.7l0.2-0.7l0.2-0.7
|
393 |
+
l0.2-0.7l0.2-0.7l0.2-0.6l0.2-0.6l0.2-0.6l0.2-0.6l0.2-0.5l0.2-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5
|
394 |
+
l0.3-0.5l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.5l0.8-0.7l0.9-0.8l0.9-0.7l0.9-0.7l0.9-0.6l0.9-0.6
|
395 |
+
l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.4l0.9-0.4l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.1l0.8-0.1l0.8-0.1
|
396 |
+
l0.8-0.1l0.8-0.1l0.8-0.1h0.8h0.8h0.8h0.7h0.8h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1
|
397 |
+
l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.4L328,85l0.8,0.3l0.7,0.3l0.7,0.3l0.7,0.4
|
398 |
+
l0.6,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.8,0.7l0.8,0.8l0.8,0.8l0.7,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.5,0.7
|
399 |
+
l0.5,0.7l0.5,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
|
400 |
+
l0.3,0.7l0.5,1.3l0.5,1.3l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.3,1.1l0.6,2l0.6,1.8l0.2,0.8l0.2,0.7l0.2,0.6l0.2,0.5l0.1,0.3
|
401 |
+
l0.1,0.2l0.4,1.1l0.5,1.2l0.5,1.2l0.5,1.2l0.5,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2
|
402 |
+
l0.4,1.2l0.4,1.3l0.4,1.2l0.4,1.3l0.4,1.2l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3
|
403 |
+
l0.3,1.3l0.3,1.3l0.2,1.1l0.1,0.2l0.1,0.3l0.1,0.5l0.2,0.7l0.2,0.8l0.2,0.9l0.2,1l0.2,1.1l0.1,0.6l0.1,0.6l0.1,0.7l0.1,0.7
|
404 |
+
l0.1,0.7l0.1,0.8l0.1,0.8l0.1,0.8v0.9v0.9v1l-0.1,1.1l-0.1,1.1l-0.1,0.8l-0.1,0.7l-0.1,0.7l-0.2,0.7l-0.2,0.8l-0.2,0.5
|
405 |
+
l-0.1,0.3v0.1v0.1v0.1l-0.1,0.5l-0.1,0.6l-0.2,0.7l-0.2,0.8l-0.2,0.9l-0.2,1l-0.3,1.1l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.7
|
406 |
+
l-0.2,0.7L361,192l-0.3,0.7l-0.3,0.7l-0.3,0.8l-0.3,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.7l-0.5,0.7
|
407 |
+
l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.7,0.8l-0.7,0.8l-0.6,0.7l-0.5,0.6l-0.4,0.5l-0.2,0.2l-0.1,0.1l-0.2,0.4
|
408 |
+
l-0.3,0.6l-0.3,0.5l-0.3,0.6l-0.5,0.9l-0.5,0.9l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.6,0.8l-0.6,0.7l-0.6,0.7l-0.6,0.7l-0.6,0.7
|
409 |
+
l-0.6,0.7l-0.6,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.8,0.7l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.5,0.4
|
410 |
+
l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.2
|
411 |
+
l-1.1,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1
|
412 |
+
h-0.9H310h-0.9h-0.9h-0.9h-0.9h-1.7H303h-1.7h-1.7H298h-3.2h-1.5h-1.5h-1.5h-1.4h-1.4h-0.7h-0.7h-0.7h-0.7h-0.6h-0.6h-0.6h-0.6
|
413 |
+
l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1L273,233l-3.6,0.7l-3.6,0.7
|
414 |
+
l-3.6,0.7l-7.2,1.5l-7.2,1.5l-7.3,1.5l-7.3,1.5l-3.7,0.8l-3.7,0.8l-3.7,0.8l-3.8,0.8l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
|
415 |
+
l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.7l-0.7-0.1l-0.7-0.1l-0.7-0.1
|
416 |
+
l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.2-0.3
|
417 |
+
l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.1-0.3l-2.2-0.5l-2-0.5l-2.1-0.5l-0.7-0.2l-0.8-0.2l-0.8-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3
|
418 |
+
l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.6-0.3l-0.9-0.5h-0.1h-0.3h-0.6l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2
|
419 |
+
l-0.7-0.2l-0.7-0.2l-0.8-0.3l-0.7-0.3l-0.3,0.3l-0.9,0.8l-1,0.7l-1,0.6l-1.1,0.6l-1.1,0.5l-1.1,0.4l-1.2,0.3l-1.2,0.2l-0.6,0.1
|
420 |
+
l-0.8,0.1l-0.9,0.1l-0.9,0.1l-1,0.1h-1.1h-1.1l-1.2-0.1l-1.2-0.2l-1.3-0.2l-1.2-0.3l-0.8-0.2l-0.7-0.2l-0.7-0.3l-0.7-0.3
|
421 |
+
l-0.7-0.3l-0.7-0.3l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.6-0.5l-0.5-0.6l-0.5-0.5l-0.5-0.6
|
422 |
+
l-0.4-0.6l-0.4-0.6l-0.5-0.7l-0.6-1l-0.6-1.1l-0.5-1.1l-0.4-1l-0.4-1l-0.3-0.9l-0.3-0.9l-0.2-0.9l-0.2-0.9l-0.2-0.8l-0.2-0.6
|
423 |
+
l-0.2-0.7l-0.2-0.8l-0.2-0.9l-0.2-0.9l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.7l-0.1-0.8l-0.1-0.8l-0.1-1v-1.1V208
|
424 |
+
l0.1-1.4l0.2-1.2l0.3-1.2l0.4-1.3l0.3-0.7l0.3-0.8l0.4-0.8v-0.1l0.4-0.8l0.4-0.7v-0.1l0.7-1l0.7-0.9l0,0l0.5-0.6l0.6-0.6
|
425 |
+
l0.6-0.6l0,0l0.7-0.6l0.8-0.6l0.8-0.5h0.1l0.9-0.5l0.9-0.5l0.9-0.4l0.8-0.3l1.2-0.4l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2
|
426 |
+
l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.1l1-0.1l1-0.1l1-0.1l1-0.1l1-0.1l0.9-0.1h0.9L154.3,188.6z
|
427 |
+
M353.1,204.9L353.1,204.9L353.1,204.9L353.1,204.9z"
|
428 |
+
/>
|
429 |
+
</g>
|
430 |
+
<g transform="matrix(1,0,0,1,381.866,45.2348)">
|
431 |
+
<path
|
432 |
+
fill="#0096FF"
|
433 |
+
d="M100,290.7h0.6h0.6h0.6h0.6h0.6h0.5h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.2
|
434 |
+
l1,0.2l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.8,0.2l1.6,0.4l1.5,0.4l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.1
|
435 |
+
l0.6,0.1h0.1h0.1h0.3h0.3h0.3h0.4h0.4h0.4h0.4h0.5h0.5h0.5h0.5h1.1l1.2-0.1l1.2-0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.8l0.8,0.1
|
436 |
+
l0.8,0.1l0.8,0.1l0.8,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0,0l20.9,0h0.2h0.4h0.4l0.4,0.1l0,0
|
437 |
+
l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l0.5,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.5
|
438 |
+
l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.5l0,0v0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5
|
439 |
+
l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l0,0l-0.5,0.2
|
440 |
+
l-0.5,0.2l-0.5,0.1l-0.4,0.1l-0.7,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.2l-0.4,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.5,0.1h-0.5
|
441 |
+
h-0.5h-0.5h-0.9h-0.9h-0.8h-0.7h-2h-1h-1h-1h-1.1h-1.1l-1.1-0.1h-0.6h-0.6l-0.6,0l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
|
442 |
+
l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.4-0.1H101h-0.6h-0.6l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3
|
443 |
+
l-0.4-0.3l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.2-0.2l-0.1,0.1l-0.6,0.3l-1.3,0.6l-1.3,0.7l-1.4,0.7l-0.7,0.4l-0.8,0.4l-0.8,0.3
|
444 |
+
l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.5,0.2l-0.4,0.1l-0.4,0.1L82,315l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1
|
445 |
+
l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1L77,316h-0.5H76h-0.5h-0.6h-0.6h-0.4l-0.5-0.1l-0.5-0.1l-0.5-0.1l0,0l-0.5-0.2l-0.5-0.2
|
446 |
+
l-0.5-0.2l-0.5-0.2l-0.4-0.3l-0.4-0.3l0,0l-0.4-0.3l-0.4-0.3l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.5
|
447 |
+
l-0.2-0.5l0,0l-0.2-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5v-0.5v-0.5v-0.5l0.1-0.6l0,0l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.5
|
448 |
+
l0.2-0.4l0.2-0.4l0.3-0.4l0,0l0.3-0.4l0.3-0.4l0.3-0.4l0.4-0.4l0.4-0.3l0,0l0.4-0.3L70,300h0.1l0.4-0.2l0.4-0.2l0.4-0.2
|
449 |
+
l0.2-0.1l0.1-0.4l0.2-0.4L72,298l0.3-0.5l0.4-0.6l0.5-0.7l0.3-0.4l0.3-0.3l0.3-0.3l0.4-0.4l0.6-0.5l0.5-0.4l0.5-0.4l0.6-0.3
|
450 |
+
l0.7-0.3l0.7-0.3l0.7-0.2l0.7-0.2l0.8-0.1h0.8h0.8l0.7,0.1l0.6,0.1l0.4,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l0.5,0.3
|
451 |
+
l0.2,0.2l0.5-0.2l0.7-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.5-0.2l0.4-0.1l0.4-0.1l0.5-0.1l0.6-0.2l0.6-0.1l0.6-0.1
|
452 |
+
l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6L100,290.7z M79.4,310.3h0.2l-0.4-0.1L79.4,310.3z"
|
453 |
+
/>
|
454 |
+
</g>
|
455 |
+
<g transform="matrix(1,0,0,1,396.607,49.2944)">
|
456 |
+
<path
|
457 |
+
d="M110.6,285.7h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.7,0.2
|
458 |
+
l0.7,0.2l0.7,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l1.1,0.5l1.1,0.5l1.1,0.4l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
|
459 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.3h0.3h0.3h0.3h0.3h0.3h0.6h0.6h0.6h0.6l0.6,0h0.6h0.7l1.3-0.1l1.4-0.1
|
460 |
+
l1.4-0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.3,0.1h0.2h0.2h0.2h0.3h0.3h0.3h0.3h0.3h0.7
|
461 |
+
h0.8h0.8h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
462 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4
|
463 |
+
l0.1,0.4l0.1,0.4v0.4v0.4v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
|
464 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.3,0.5l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.4
|
465 |
+
l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.6,0.3l-0.6,0.3
|
466 |
+
l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
|
467 |
+
l-0.6,0.1l-0.6,0.1l-0.6,0.1H142h-0.6h-0.6h-0.6h-0.6H139h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
|
468 |
+
l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-2.1-0.6
|
469 |
+
l-2.1-0.6l-1-0.3l-1-0.3h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.4h-0.4h-0.4H113h-0.5l-0.5,0.1l-0.5,0.1
|
470 |
+
l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1L108,309l-0.5,0.1l-0.5,0.1l-0.5,0.1l-1,0.3l-1,0.3l-1,0.3l-1.8,0.6
|
471 |
+
l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.9
|
472 |
+
h-0.9h-0.9h-0.9h-0.9h-0.9l-0.9-0.1l-0.9-0.1l-1.8-0.1l-1.8-0.1l-0.9-0.1h-0.9h-0.8h-0.8h-0.8h-0.8h-0.8h-0.4h-0.4h-0.4h-0.4
|
473 |
+
h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3,0.1l-0.4,0.1l-0.5,0.1l-0.6,0.1l-0.7,0.1l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1h-0.9
|
474 |
+
h-1h-1h-1h-1h-1h-1h-1h-1h-1h-1l-1-0.1l-0.9-0.1h-0.5h-0.5l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
|
475 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
|
476 |
+
l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.2v-0.2v-0.3v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3
|
477 |
+
l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.3-0.5l0.3-0.5l0.3-0.5l0.4-0.8l0.1-0.3l0.1-0.2l0.2-0.4l0.2-0.4
|
478 |
+
l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
|
479 |
+
l0.3-0.3L55,293l0.3-0.2l0.4-0.2l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.7-0.4l0.7-0.3l0.7-0.3l0.7-0.3l0.7-0.3l1.3-0.6
|
480 |
+
l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
|
481 |
+
l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1h0.4h0.4H71l0.3,0.1l0.3,0.1l0.2,0.1h0.1l0.4-0.1
|
482 |
+
l0.4-0.1l0.4-0.1l0.4-0.2l0.9-0.3l0.9-0.4l0.9-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.3h0.3
|
483 |
+
h0.3h0.3h0.3H82h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.5,0.1l0.5,0.1l0.9,0.3l0.9,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.7,0.3l0.7,0.3
|
484 |
+
l1.2,0.5l1.1,0.4l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.2,0.1H96h0.2h0.2h0.2h0.2H97h0.3h0.3h0.3h0.3h0.3
|
485 |
+
h0.3h0.3h0.3h0.3h0.3h0.3h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1
|
486 |
+
l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4L110.6,285.7z M115.3,302.4h0.6h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1
|
487 |
+
l0.3,0.1l0.3,0.1l0.3,0.1l1.1,0.3l1.1,0.3l2.1,0.6l2.1,0.6l1.1,0.3l1,0.3l1,0.3l1,0.3l1,0.2l1,0.2l1,0.2l0.5,0.1l0.5,0.1
|
488 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1
|
489 |
+
l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2
|
490 |
+
l0,0l0.1-0.1l0.2-0.1l0.2-0.2l0.2-0.2l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.2-0.4
|
491 |
+
l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2v-0.1V298v-0.1v-0.1v-0.1v-0.1v-0.1
|
492 |
+
l0,0H156h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.2-0.1H155h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3H153h-0.4h-0.4h-0.8h-0.8h-0.8h-0.4H149
|
493 |
+
h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6H140h-0.7
|
494 |
+
l-1.4,0.1l-1.4,0.1l-1.4,0.1h-0.7h-0.7H133l-0.7,0h-0.7h-0.7h-0.7h-0.4h-0.4H129h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1
|
495 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-1.1-0.5l-1.1-0.5l-1.1-0.4l-0.5-0.2
|
496 |
+
l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1h-0.3h-0.3h-0.3h-0.3
|
497 |
+
H112h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3H109h-0.3h-0.3h-0.3h-0.3l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.5,0.1
|
498 |
+
l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4H99h-0.4
|
499 |
+
h-0.4h-0.4h-0.4H97h-0.4h-0.4l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
|
500 |
+
l-0.6-0.2l-1.2-0.5l-1.2-0.5l-0.6-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.2l-0.4-0.1l-0.4-0.1h-0.1l0,0l0,0
|
501 |
+
H83h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2
|
502 |
+
l-0.9,0.3l-0.9,0.3l-0.9,0.4l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.3h-0.3
|
503 |
+
h-0.1l-0.2,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3
|
504 |
+
l-1.3,0.6l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
|
505 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
|
506 |
+
l-0.2,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.4,0.8l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.2
|
507 |
+
l-0.1,0.2l-0.1,0.2l0,0l0,0l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.3H56h0.4h0.4h0.4l0.9,0.1l0.9,0.1h0.9h0.9h1h1h1h1h1h1
|
508 |
+
h0.9h0.9h0.9h0.9l0.8-0.1l0.8-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4
|
509 |
+
h0.4h0.4h0.4h0.9h0.9H82h0.9h0.9h0.9l0.9,0.1l1.8,0.1l1.8,0.1l0.9,0.1l0.9,0.1h0.9h0.8h0.8h0.8h0.8h0.8h0.4h0.4h0.4h0.4h0.3
|
510 |
+
h0.3h0.3h0.3H99l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l1.8-0.6l1-0.3l1-0.3l1.1-0.3l0.6-0.2l0.6-0.2
|
511 |
+
l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6h0.6L115.3,302.4z"
|
512 |
+
/>
|
513 |
+
</g>
|
514 |
+
<g transform="matrix(1,0,0,1,381.866,45.2348)">
|
515 |
+
<path
|
516 |
+
fill="#0096FF"
|
517 |
+
d="M258.4,272.4h0.5h0.5h0.6h0.4h0.3h0.3h0.2h0.2h0.2l0,0l0.2,0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.1l0.2,0.1
|
518 |
+
l0.2,0.1l0.2,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0v0.2v0.2
|
519 |
+
l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.2l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1h-0.1
|
520 |
+
l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.8,0.3l-0.9,0.2
|
521 |
+
l-0.8,0.2v0.1l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
|
522 |
+
l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.2,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
523 |
+
l-0.5,0.1l-0.5,0.1l-0.6,0.1l-0.6,0.1l-0.7,0.1l-0.7,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1
|
524 |
+
L249,286l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1H248l-0.1,0.1l-0.2,0.1h-0.1h-0.1h-0.1h-0.1h-0.2
|
525 |
+
h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1H246h-0.1h-0.1h-0.1h-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.2
|
526 |
+
l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2h-0.1l-0.8,0.1l-0.8,0.1h-0.8H240h-0.7h-0.7H238h-0.6h-0.5h-0.5h-0.3h-0.3l-0.3-0.1
|
527 |
+
l-0.2-0.1h-0.2l-0.2-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.2-0.1l0,0l-0.8,0.3l-0.9,0.3l-0.9,0.2l-0.5,0.1l-0.4,0.1
|
528 |
+
l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4H227h-0.4h-0.4h-0.4h-0.4H225h-0.4h-0.4l-0.4-0.1
|
529 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.1l-0.2-0.1l-0.2-0.1l0,0l-0.2-0.1l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.2
|
530 |
+
l-0.1-0.2l0,0l-0.1-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.2v-0.3v-0.3l0.1-0.3
|
531 |
+
l0.1-0.4l0.1-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.5
|
532 |
+
l0.4-0.5l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1
|
533 |
+
l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.1-0.1l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2
|
534 |
+
l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
|
535 |
+
l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.6h0.6h0.6h0.6h0.6h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
|
536 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l4.8,1.4l0.9-0.1l1.1-0.1h1L258.4,272.4z"
|
537 |
+
/>
|
538 |
+
</g>
|
539 |
+
<g transform="matrix(1,0,0,1,381.866,45.2348)">
|
540 |
+
<path
|
541 |
+
d="M240.3,267.1h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9l0.9,0h0.8l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1
|
542 |
+
l0.8,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.2l0.5,0.2l0.3,0.1l0.3,0.1l0.3,0.1
|
543 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2
|
544 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.3v0.2v0.3v0.3v0.1v0.1v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
545 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.3,0.3
|
546 |
+
l-0.6,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
|
547 |
+
l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-1.2,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-2.2,0.6
|
548 |
+
l-2.2,0.6l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.2l-1.1,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1L234,291l-0.6,0.1
|
549 |
+
l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6h-0.6h-0.6h-0.6H228h-0.6h-0.6h-0.6h-0.6H225l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
|
550 |
+
L222,291l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2h-0.1l0,0h-0.1h-0.1H216h-0.2h-0.2h-0.2
|
551 |
+
h-0.2h-0.3h-0.3H214h-0.6h-0.7h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
|
552 |
+
l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3
|
553 |
+
l-0.2-0.3l-0.2-0.3l-0.1-0.2v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V285v-0.1v-0.1v-0.1v-0.1v-0.2l0.1-0.3l0.1-0.3
|
554 |
+
l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
|
555 |
+
l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.5-0.2l0.4-0.2l0.4-0.1l0.3-0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.2l0.8-0.2
|
556 |
+
l1.5-0.4l1.4-0.4l1.3-0.3l0.4-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2V275v-0.3v-0.3v-0.3v-0.3
|
557 |
+
l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1
|
558 |
+
l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.1
|
559 |
+
l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1L240.3,267.1z M238.9,273.1
|
560 |
+
l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1
|
561 |
+
l-0.6,0.1l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1
|
562 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1l0,0l-0.1,0.1l-0.2,0.1l0.1,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2
|
563 |
+
l0.1,0.2l0.1,0.2l0.1,0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
|
564 |
+
l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.2l-1.3,0.3l-1.4,0.4l-1.5,0.4l-0.7,0.2l-0.7,0.2
|
565 |
+
l-0.3,0.1h0.1h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.6,0.2l0.5,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
|
566 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
|
567 |
+
l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.3l1.1-0.3l2.2-0.6l2.2-0.6l1.1-0.3l1.1-0.3
|
568 |
+
l1.1-0.3l1.1-0.3l1.2-0.3l1-0.2l0,0l0.2-0.1l0.3-0.1l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.4
|
569 |
+
l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2v-0.1l-0.4-0.1
|
570 |
+
l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1L253,273l-0.8-0.1h-0.8
|
571 |
+
l-0.8,0h-0.8H249h-0.8h-0.8h-0.8h-0.9h-0.9h-0.9H243h-0.9h-0.9h-0.9h-0.9h-0.9L238.9,273.1z"
|
572 |
+
/>
|
573 |
+
</g>
|
574 |
+
<path
|
575 |
+
d="M708.1,249.1h0.2h0.1h0.1h0.1h0.2h0.1h0.1h0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
576 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1v0.1l0.1,0.1
|
577 |
+
v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
578 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
|
579 |
+
l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
580 |
+
l-0.4,0.1h-0.4h-0.4H701h-0.4h-0.4h-0.4H699h-0.8h-0.9h-1h-0.2h-0.3h-0.2h-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.7-0.2
|
581 |
+
l-0.2-0.1l-0.2-0.1h-0.1h-0.1h-0.1h-0.1h-0.2H692h-0.1h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1H691l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
582 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
583 |
+
l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V253v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
584 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1
|
585 |
+
l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.2h0.4h0.2h0.3h0.2h0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.2l0.3,0.1
|
586 |
+
l0.3,0.1l0.2,0.1h0.2h0.7h0.9h0.7h0.8h0.3h0.3h0.4h0.3h0.3h0.2h0.3h0.3h0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1
|
587 |
+
l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.3-0.1l0.4-0.2l0.4-0.2l0.4-0.2l0.1-0.1l0.1-0.1h0.1h0.1h0.2h0.1h0.1h0.2h0.1h-0.1
|
588 |
+
V249.1z M693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9z"
|
589 |
+
/>
|
590 |
+
<path
|
591 |
+
d="M698.7,232.2L698.7,232.2h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1
|
592 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
|
593 |
+
l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1
|
594 |
+
l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
595 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1H700h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1,0.1
|
596 |
+
l-0.2,0.1l-0.2,0.1l-0.3,0.2l-0.5,0.4l-0.7,0.4l-0.7,0.5l-0.8,0.5l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
|
597 |
+
l-0.5,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1h-0.2h-0.3H691h-0.3h-0.2h-0.1h-0.1h-0.1h-0.1H690h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1
|
598 |
+
h-0.1h-0.1h-0.1H689h-0.1h-0.1l-0.1-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
599 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1V241l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1
|
600 |
+
l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1V239v-0.1v-0.1l0.1-0.1v-0.1v-0.1v-0.1l0.1-0.1
|
601 |
+
v-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
602 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1
|
603 |
+
h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.2-0.1l0.3-0.1l0.2-0.2l0.3-0.2l0.4-0.2l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.3-0.2
|
604 |
+
l0.4-0.2l0.3-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.3-0.1l0.3-0.1h0.2h0.1h0.1h0.1h0.1L698.7,232.2L698.7,232.2z M699.1,238.1
|
605 |
+
L699.1,238.1L699.1,238.1L699.1,238.1L699.1,238.1z M692.9,237.4L692.9,237.4L692.9,237.4L692.9,237.4L692.9,237.4z"
|
606 |
+
/>
|
607 |
+
<path
|
608 |
+
d="M688.9,250.5h0.5h0.5h0.5h0.2h0.2h0.2h0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1
|
609 |
+
l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2l0.1,0.2l-0.1,0.2v0.2v0.2
|
610 |
+
l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1
|
611 |
+
l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.5h-0.4H689h-0.4h-0.4h-0.5h-0.4h-0.4l-0.4,0.1l-0.5,0.1
|
612 |
+
l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.9,0.2l-0.8,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.3l-0.9,0.3
|
613 |
+
l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1.8,0.6l-1.8,0.6l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1,0.2
|
614 |
+
l-0.9,0.2l-0.9,0.2h-0.2h-0.2h-0.2H661h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1
|
615 |
+
l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.2v-0.2v-0.2l0.1-0.2
|
616 |
+
v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.2-0.1
|
617 |
+
l0.2-0.1l0.2-0.1l0.2-0.1h0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.9-0.6
|
618 |
+
l1.8-0.6l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.2l1-0.2l0.9-0.2l0.9-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
|
619 |
+
l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5L688.9,250.5z"
|
620 |
+
/>
|
621 |
+
<path
|
622 |
+
fill="#25B3FF"
|
623 |
+
d="M616.5,62.9h0.5h0.5h0.5h0.5L619,63l0.5,0.1l0.5,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1
|
624 |
+
l0.2,0.1l0.4,0.2l0.4,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.2l0.1,0.1h0.1h0.2h0.5h0.5h0.5h0.4h0.5l0.5,0.1l0.5,0.1l0.4,0.1
|
625 |
+
l0.5,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.1,0.1l0.3,0.2h0.1l0.1,0.1l0.1,0.1h0.1l0.2,0.2l0.2,0.2l0,0
|
626 |
+
l0.2,0.2l0.1,0.3l0,0l0.1,0.3l0.1,0.3l0,0v0.4v0.4l0,0l-0.1,0.3l-0.1,0.3l0,0l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2h-0.1
|
627 |
+
l-0.2,0.3h-0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
|
628 |
+
l-0.6,0.2l-0.7,0.2l-0.6,0.2l-0.6,0.1l-1.1,0.2l-0.9,0.2l-0.5,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-1,0.1h-0.1l-0.4,0.3l-0.5,0.4
|
629 |
+
l-0.5,0.4l-0.2,0.1l0.3-0.1h0.2l0.3-0.1h0.3h0.3l0,0h0.4l0.4,0.1l0.3,0.1l0.4,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.2,0.3
|
630 |
+
l0.1,0.3l0.1,0.1h0.4l1.1-0.1l2.3-0.3l1.1-0.1l1.2-0.1l1.2-0.1l1.2-0.1l0.5-0.1h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.1h0.4h0.1
|
631 |
+
l0.3,0.1l0.3,0.1h0.1l0.3,0.1l0.2,0.2l0.3,0.2l0,0l0.2,0.2l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0,0l0.1,0.3v0.3v0.4l-0.1,0.4l0,0
|
632 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.3h-0.1l-0.1,0.2l-0.2,0.2l0,0l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.2l-0.1,0.1l-0.2,0.1l-0.2,0.1
|
633 |
+
l-0.3,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-1.3,0.6l-0.9,0.5l-0.8,0.4l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.5,0.2l-0.5,0.2
|
634 |
+
l-0.5,0.2l-0.6,0.2l-1.4,0.4l-0.4,0.1l-0.4,0.1l-0.9,0.2l-0.9,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3L622,87l0.1,0.1h0.1l0.1,0.3
|
635 |
+
l0.1,0.1l0.1,0.3v0.1l0.1,0.2l0.1,0.3l0.1,0.3l0,0V89l-0.1,0.3l-0.1,0.3l-0.1,0.3h-0.1l-0.1,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2
|
636 |
+
l-0.2,0.2l0,0l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l0,0h-0.1l0,0l-0.3,0.4l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.9,1.2
|
637 |
+
l-0.9,1.3l-0.9,1.3l-0.5,0.7l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
|
638 |
+
l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l-0.3,0.1h-0.1l-0.2,0.1H609h-0.3h-0.2h-0.2H608h-0.1
|
639 |
+
h-0.3h-0.2l-0.3-0.1H607l-0.4-0.1h-0.1l-0.4-0.1l-0.1-0.1l-0.3-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2
|
640 |
+
l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.2l-0.7,0.8l-0.7,0.8
|
641 |
+
l-0.4,0.4l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.3,0.2H599l-0.2,0.1l-0.2,0.1h-0.1h-0.2
|
642 |
+
h-0.2H598h-0.2h-0.2h0.4h-0.3h-0.2h-0.1l-0.3-0.1l-0.3-0.1h-0.1l-0.3-0.1l-0.2-0.2h-0.1l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.2-0.2
|
643 |
+
l-0.1-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.3l-0.1-0.1l-0.1-0.3v-0.2l-0.1-0.3v-0.3V100v-0.1l-0.4,0.4l-0.6,0.9l-0.3,0.4
|
644 |
+
L593,102l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.4l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1
|
645 |
+
l-0.3,0.2h-0.1l-0.2,0.1l-0.3,0.1h-0.1l-0.4,0.1h-0.4H588h-0.3h-0.4l0,0l-0.3-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.2-0.2l-0.2-0.2
|
646 |
+
l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.2l-0.1-0.2l0,0l-0.2-0.3l-0.1-0.3l0,0l-0.1-0.3l-0.1-0.3V103v-0.2l-0.1,0.2l-0.2,0.4l-0.3,0.4
|
647 |
+
l-0.2,0.4l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1
|
648 |
+
l-0.1,0.1l-0.3,0.1h-0.1l-0.3,0.1h-0.2h-0.3h-0.3h-0.3h-0.2h-0.2h-0.2l-0.3-0.1h-0.1l-0.3-0.1h-0.1l-0.2-0.1l-0.2-0.1l0,0
|
649 |
+
l-0.2-0.1l-0.2-0.2h-0.1l-0.2-0.2l-0.1-0.2h-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.3h-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2V104
|
650 |
+
l-0.1-0.1v-0.3v-0.3V103v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.6l0.1-0.6l0.2-0.7l0.2-0.7l0.4-1.4l0.5-1.5l0.2-0.7
|
651 |
+
l0.2-0.6l-0.6,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.2,0.1l-0.6,0.7l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.5,0.5l-0.4,0.5
|
652 |
+
l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2
|
653 |
+
l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1H564h-0.2h-0.3h-0.2H563h-0.2l-0.3-0.1h-0.2l-0.3-0.1h-0.1
|
654 |
+
l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2
|
655 |
+
l-0.1-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.3l-0.1-0.1V101v-0.2v-0.3l0,0h-0.2h-0.4l-0.4-0.1l-0.5-0.1l-0.2-0.1l-0.2-0.1
|
656 |
+
l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1H555h-0.3h-0.2h-0.2h-0.2H554h-0.3h-0.1
|
657 |
+
l-0.3-0.1l0,0l-0.4-0.1l0,0l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.2l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.2l0,0
|
658 |
+
l-0.2-0.3l-0.1-0.3l0,0l-0.1-0.2l-0.1-0.1l-0.3,0.2l-0.4,0.2l-0.5,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1
|
659 |
+
l-0.3,0.1H547h-0.4h-0.4h-0.3h-0.2h-0.2l-0.3-0.1h-0.1l-0.4-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2
|
660 |
+
l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3h-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2V96l0,0v-0.2l0,0l-0.4,0.3
|
661 |
+
l-0.8,0.6l-0.8,0.6l-1.7,1.2l-1.7,1.2l-0.8,0.6l-0.9,0.6l-0.8,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.4,0.3l-0.5,0.3
|
662 |
+
l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.4,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
|
663 |
+
l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.2,0.1h-0.2h-0.2H521h-0.1h-0.3h-0.4l0,0H520l-0.2-0.1l-0.2-0.1h-0.1l-0.3-0.1l-0.2-0.2l-0.3-0.2
|
664 |
+
l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.3l-0.1-0.2l-0.3-0.2l-0.2-0.3l0,0l-0.2-0.3l-0.1-0.3l-0.1-0.1l-0.1-0.3l-0.1-0.3l-0.1-0.1v-0.2
|
665 |
+
l-0.1-0.2v-0.2v-0.4l0.1-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.1-0.2
|
666 |
+
l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.4-0.3l0.3-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.7-0.3l1.2-0.6
|
667 |
+
l0.6-0.3l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l1.1-0.6l1.1-0.6
|
668 |
+
l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l2.2-1.1l2.2-1.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.9-0.5
|
669 |
+
l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.2-0.1l0.2-0.1l0.2-0.1l0,0
|
670 |
+
l0.4-0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.3,0.2l0.4,0.2l0.2,0.2l0.2,0.3l0.1,0.1l2.1-0.4l4.8-1l2.3-0.5l2.3-0.5l0.4-0.2l0.4-0.2
|
671 |
+
l0.4-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1h0.2h0.4h0.1h0.3h0.2h0.1h0.2l0.3,0.1l0,0l0.2,0.1l0.1-0.1
|
672 |
+
l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.3-0.2
|
673 |
+
l0.2-0.2l0.5-0.3l0.6-0.3l0.4-0.2l0.1-0.3l0.1-0.3l0,0l0.2-0.2l0.1-0.2l0.2-0.2l0,0l0.2-0.2l0.2-0.2l0,0l0.3-0.2l0.1-0.1
|
674 |
+
l0.2-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.6-0.1l0.7-0.1l1.2-0.2l1.2-0.2l0.5-0.1l0.6-0.1
|
675 |
+
l0.5-0.1l0.2-0.2l0.6-0.4l0.6-0.4l0.5-0.4l0.6-0.3l0.5-0.3l0.9-0.6l0.8-0.5l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.3l0.5-0.3l0.5-0.4
|
676 |
+
l0.5-0.4l0.5-0.4l0.6-0.4l0.5-0.4l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1l0.3-0.1l0.2-0.1h0.2h0.4h0.2h0.4
|
677 |
+
h0.1h0.2h0.2h0.1l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.2l0.2,0.2h0.1l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2l0,0
|
678 |
+
l0.1,0.2l0.4-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.6h0.5h0.5
|
679 |
+
L616.5,62.9z M609.5,90.5L609.5,90.5l0.1,0.4l0.1,0.2l0.1,0.3v0.2l0.1,0.2v0.4l0,0.4V93v0.4l-0.1,0.4l-0.1,0.8l-0.1,0.9
|
680 |
+
l-0.1,0.9l-0.1,0.1l0.3-0.4l0.5-0.6l0.4-0.6l0.5-0.6L612,93l0.9-1.3l0.4-0.6l0,0l-0.3,0.1l-0.2,0.1l-0.3,0.1h-0.2H612h-0.1h-0.2
|
681 |
+
h-0.2h-0.1l-0.3-0.1l-0.3-0.1h-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.2-0.2l-0.2-0.2L609.5,90.5L609.5,90.5z M586.1,91.5L586.1,91.5
|
682 |
+
l-0.5,0.3l0,0l-0.1,0.4v0.2l0.2-0.3L586.1,91.5l0.1-0.1L586.1,91.5z M599.9,89l-0.8,0.1l-0.1,0.1l-0.5,0.3l-0.4,0.3l-0.5,0.3
|
683 |
+
l-0.3,0.2h0.3h0.2h0.4h0.1h0.2h0.2h0.1l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1v-0.2l0.1-0.3l0.2-0.3l0.1-0.3l0,0l0.2-0.2l0.1-0.2
|
684 |
+
l0,0L599.9,89z"
|
685 |
+
/>
|
686 |
+
<path
|
687 |
+
fill="#25B3FF"
|
688 |
+
d="M474.6,336.5h0.3h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.5,0.3
|
689 |
+
l0.5,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.3,0.2l0.1,0.1l0.1,0.1l0.3,0.1l0.2,0.1l0.2,0.1h0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1
|
690 |
+
l0.5,0.1l0.9,0.2l0.9,0.2l0.9,0.2l1.8,0.4l0.8,0.2l0.8,0.2l0,0l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.2l0.5,0.1
|
691 |
+
l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0,0l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.2
|
692 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2v0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
|
693 |
+
l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.1l-0.1,0.1l-0.2,0.1
|
694 |
+
l-0.2,0.1h-0.1h-0.2h-0.2h-0.2h-0.3h-0.2h-0.3h-0.2H493l-0.5-0.1l-0.5-0.1v0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
|
695 |
+
l-0.1,0.2l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2l0,0h-0.2h-0.1h-0.2h-0.6
|
696 |
+
h-0.6h-0.5h-0.6l-1.2,0.1h-1.2h-0.6h-0.7h-0.6h-0.7h-0.7h-0.7l-0.7-0.1h-0.1H479h-0.8h-0.8h-0.8h-0.8h-1.5h-1.5h-1.5h0.7
|
697 |
+
l-0.9,0.4l-1.1,0.5l-0.7,0.3l-0.2,0.2l-0.3,0.3l-0.4,0.3l-0.5,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
|
698 |
+
l-0.2,0.1l-0.3,0.1l-0.2,0.1h-0.1h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1h-0.2h-0.2h-0.1h-0.1h-0.2h-0.2l-0.2-0.1l-0.2-0.1h-0.1
|
699 |
+
l-0.4,0.1l-0.6,0.2l-0.6,0.1l-0.4,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.4H460h-0.3h-0.3H459h-0.3h-0.4h-0.2h-0.2h-0.2h-0.1h-0.1h-0.2
|
700 |
+
l-0.2-0.1l-0.1-0.1l-0.2-0.1l0,0l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2
|
701 |
+
l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2L455,351v-0.2v-0.2l0,0v-0.2l0.1-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0,0
|
702 |
+
l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.2l0.2-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2
|
703 |
+
l0.4-0.2l0.5-0.2l0.8-0.3l0,0l0.1-0.2l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
|
704 |
+
l0.1-0.1l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.8-0.4l0.7-0.3l0.2-0.1
|
705 |
+
l0,0l1.2-0.6l0.8-0.4l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.2-0.1h0.1l0,0v-0.1v-0.1v-0.2v-0.1l0.1-0.2v-0.2v-0.1l0.1-0.1
|
706 |
+
v-0.1l0.1-0.2l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.1l0.3-0.1l0.3-0.1
|
707 |
+
l0.3-0.1h0.2h0.3L474.6,336.5z"
|
708 |
+
/>
|
709 |
+
<path
|
710 |
+
fill="#25B3FF"
|
711 |
+
d="M632.9,316.7h0.5h0.5h0.4h0.2h0.2l0.2,0h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.2,0.1
|
712 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.1,0.2v0.2v0.2l-0.1,0.2v0.2
|
713 |
+
l-0.1,0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1
|
714 |
+
l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2l-0.4,0h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4,0.1
|
715 |
+
l-0.4,0.1l-0.4,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.3,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
716 |
+
l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.5,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.5,0.1
|
717 |
+
l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-7,0.8h-0.5h-0.6h-0.5h-0.6h-0.8h-0.2h-0.2h-0.2h-0.2h-0.2l-0.1-0.1l-0.2-0.1l-0.2-0.1
|
718 |
+
l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
|
719 |
+
l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.2v-0.2v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
|
720 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.4h0.4h0.4h0.4
|
721 |
+
l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.5-0.1
|
722 |
+
l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1h0.6h0.6h0.6h0.6l1.2-0.1h1.1h0.4l1.3-0.3l1.7-0.4l0.9-0.2l0.8-0.2l0.9-0.2l0.9-0.2l0.9-0.2
|
723 |
+
l0.9-0.2l0.9-0.2l0.9-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.5-0.1h0.5h0.5h0.5L632.9,316.7z"
|
724 |
+
/>
|
725 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
726 |
+
<path
|
727 |
+
d="M208.6,8l0.8,0h0.8l0.8,0h0.8l0.8,0h0.8l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1
|
728 |
+
l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2
|
729 |
+
l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3L239,14l0.8,0.3l1.5,0.6l1.5,0.6l1.5,0.6l1.4,0.6l1.4,0.6
|
730 |
+
l1.4,0.6l1.3,0.6l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.9,0.4
|
731 |
+
l0.9,0.3l0.9,0.3l0.9,0.3l1,0.3l1,0.3l1,0.3l1,0.3l2,0.6l2.1,0.6l2.1,0.6l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.4l1.1,0.4l1.1,0.4
|
732 |
+
l1.1,0.4l1.1,0.4l0.6,0.2l0.6,0.2l0.5,0.2l0.6,0.2l0.6,0.2L284,31l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.5,0.3l0.5,0.3l0.9,0.5
|
733 |
+
l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.6
|
734 |
+
l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6
|
735 |
+
l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.6,0.6l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7
|
736 |
+
l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7
|
737 |
+
l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8
|
738 |
+
l0.5,0.8l0.5,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8
|
739 |
+
l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.9l0.4,0.9l0.7,1.7l0.7,1.7l0.7,1.7l0.7,1.8
|
740 |
+
l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.5,1.9l0.5,1.8l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4
|
741 |
+
l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.4l0.3,0.8l0.3,0.7l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.8,1.6l0.4,0.8l0.4,0.8l0.4,0.9
|
742 |
+
l0.4,0.9l0.4,0.9l0.4,0.9l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5
|
743 |
+
l0.1,0.5l0.1,0.5l0.1,0.6l0.1,0.5l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6v0.6v0.6v0.6v0.5l-0.1,0.9l-0.2,0.9l-0.3,0.8l-0.4,0.8
|
744 |
+
l-0.5,0.7l-0.6,0.6l-0.7,0.5l-0.8,0.4l-0.8,0.3l-0.9,0.1H360l-0.9-0.1l-0.9-0.3l-0.8-0.4l-0.7-0.5l-0.7-0.6l-0.6-0.7l-0.4-0.8
|
745 |
+
l-0.3-0.8l-0.2-0.9l-0.1-0.9v-0.4v-0.3v-0.3v-0.3V153v-0.3v-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
|
746 |
+
l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.3-0.7l-0.3-0.7
|
747 |
+
l-0.4-0.7l-0.4-0.7l-0.4-0.8l-0.4-0.8l-0.8-1.6l-0.4-0.8l-0.4-0.8l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.2-0.5
|
748 |
+
l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.5-1.8l-0.5-1.8l-0.5-1.8l-0.5-1.7
|
749 |
+
l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.6l-0.6-1.6l-0.7-1.6l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8
|
750 |
+
l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.7l-0.4-0.7
|
751 |
+
L331,94l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7L327,87l-0.4-0.7l-0.4-0.7l-0.4-0.7
|
752 |
+
l-0.4-0.7l-0.4-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7
|
753 |
+
l-0.5-0.6l-0.5-0.6L318,74l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.6-0.6
|
754 |
+
l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6
|
755 |
+
l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5
|
756 |
+
l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5
|
757 |
+
l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
|
758 |
+
l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.9-0.4l-0.9-0.4l-0.9-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-2-0.6
|
759 |
+
l-2.1-0.6l-2.1-0.6l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-0.6-0.2l-0.5-0.2l-0.5-0.2
|
760 |
+
l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-1.1-0.6l-1.2-0.6l-1.2-0.6l-1.2-0.6l-1.2-0.6l-1.3-0.6l-1.3-0.6l-1.3-0.6
|
761 |
+
l-1.3-0.5l-1.4-0.5l-1.4-0.5l-0.7-0.3l-0.7-0.2l-0.7-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L230,24l-0.7-0.2
|
762 |
+
l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L223,22l-0.7-0.2l-0.7-0.1l-0.7-0.1l-0.7-0.1
|
763 |
+
l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.1h-0.6h-0.6h-0.6h-0.6l-0.6,0h-0.6h-0.6h-0.6h-0.6
|
764 |
+
h-0.6h-0.5l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
|
765 |
+
l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3
|
766 |
+
l-0.9,0.3l-0.9,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4
|
767 |
+
l-0.9,0.4l-0.9,0.4l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-3.4,1.9l-3.4,1.9l-0.5,0.3
|
768 |
+
l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-1.2,0.5l-1.2,0.5l-1.2,0.5l-1.2,0.4
|
769 |
+
l-1.2,0.4l-2.3,0.9l-2.3,0.8l-1.1,0.4l-1.1,0.4L132,51l-1.1,0.4l-1.1,0.4l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
|
770 |
+
l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.4,0.3l-0.4,0.2l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
|
771 |
+
l-0.4,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-1.1,1.1l-1.2,1.2l-2.3,2.3l-2.4,2.3l-2.4,2.3
|
772 |
+
l-4.7,4.6l-2.3,2.3l-2.3,2.3L99,77.9L97.8,79l-1.2,1.1l-1.1,1.2l-1.1,1.1l-1.1,1.2l-1.1,1.2L91.1,86L90,87.2l-1.1,1.2l-1.1,1.2
|
773 |
+
l-1.1,1.2L85.6,92l-1.1,1.2l-1.1,1.2l-1,1.2l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.2
|
774 |
+
l-0.9,1.2l-0.9,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.3l-0.8,1.3l-0.8,1.3
|
775 |
+
l-0.8,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.6,1.3l-0.6,1.3
|
776 |
+
l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.4,1.4
|
777 |
+
l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.2,1.4l-0.1,0.7
|
778 |
+
l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7
|
779 |
+
l-0.1,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7L42,187l-0.2,0.7l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6
|
780 |
+
l-0.2,0.6l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.1l-0.5,1.1l-1,2.2l-0.1,0.3l-0.2,0.3l-0.3,0.7l-0.2,0.4l-0.2,0.4l-0.2,0.4
|
781 |
+
l-0.2,0.4l-0.2,0.4l0,0v0.1v0.9l-0.2,0.9l-0.3,0.8l-0.4,0.8l-0.5,0.7l-0.6,0.6l-0.7,0.5l-0.8,0.4l-0.8,0.3l-0.9,0.2h-0.9
|
782 |
+
l-0.9-0.1l-0.9-0.2l-0.8-0.4l-0.7-0.5l-0.7-0.6l0,0l-0.6-0.6l0,0l-0.4-0.7l0,0l-0.3-0.7v-0.1l-0.2-0.6l-0.1-0.3l-0.1-0.5
|
783 |
+
l-0.1-0.5v-0.5v-0.7l0.1-0.6l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3l0.1-0.4l0.3-0.6l0.3-0.6l0.3-0.6
|
784 |
+
l0.3-0.5l0.2-0.5l0.4-0.7l0.1-0.1l0.9-2l0.5-1.1l0.5-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
|
785 |
+
l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.5l0.1-0.7l0.1-0.8
|
786 |
+
l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.3-1.5l0.3-1.5l0.3-1.5l0.3-1.5l0.3-1.5l0.4-1.5l0.4-1.5
|
787 |
+
l0.4-1.5l0.4-1.5l0.4-1.5l0.4-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.6-1.5l0.6-1.5l0.6-1.5l0.6-1.5l0.6-1.5
|
788 |
+
l0.6-1.5l0.6-1.5l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.8-1.4l0.8-1.4l0.8-1.4l0.8-1.4l0.8-1.4
|
789 |
+
l0.8-1.4l0.8-1.4l0.8-1.3l0.8-1.3l0.8-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.2l0.9-1.2l0.9-1.2
|
790 |
+
l0.9-1.2l0.9-1.2l0.9-1.2l1-1.2l1-1.2l1-1.2l1-1.1l1.1-1.3l1.1-1.3l1.1-1.3l1.1-1.2l1.1-1.2l1.1-1.2l1.1-1.2l1.2-1.2l1.2-1.2
|
791 |
+
l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l2.4-2.3l2.4-2.3l4.7-4.6l2.3-2.3l2.3-2.3l2.3-2.3l1.1-1.1l1.2-1.2
|
792 |
+
l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.3l0.6-0.3l0.6-0.3
|
793 |
+
l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l1.2-0.5l1.2-0.5l1.2-0.5l1.2-0.5
|
794 |
+
l1.2-0.4l2.3-0.9l2.3-0.8l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1-0.4l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2
|
795 |
+
l0.4-0.2l0.4-0.2l0.4-0.2l3.4-1.8l3.4-1.9l1.7-0.9l1.7-0.9l1.7-0.9l1.8-0.9l1.8-0.9l1.8-0.9l1.8-0.9L167,22l0.9-0.4l0.9-0.4
|
796 |
+
l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4L176,18l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l1-0.4l1-0.4l1-0.4l1-0.4
|
797 |
+
l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.1
|
798 |
+
l1-0.1l1.1-0.1l0.8-0.1l0.8-0.1L208.6,8z M35.3,198.2l-0.1-0.2l-0.1-0.1L35.3,198.2z M34.9,197.7l-0.2-0.3l-0.3-0.3L34.9,197.7
|
799 |
+
z"
|
800 |
+
/>
|
801 |
+
</g>
|
802 |
+
<g transform="matrix(1,0,0,1,381.866,45.2348)">
|
803 |
+
<path
|
804 |
+
d="M223.3,0.9l1.4-0.1l1.4-0.1l1.4-0.1l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0.1
|
805 |
+
l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2
|
806 |
+
l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.3,0.3l1.3,0.3l1.3,0.3l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.4
|
807 |
+
l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.5L292,10l1.3,0.5l1.3,0.5l1.3,0.5l1.3,0.5l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6l1.2,0.6
|
808 |
+
l1.2,0.6l1.2,0.6l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.8l1.1,0.8l1.1,0.8l1.1,0.8l0.6,0.4l0.6,0.4l0.6,0.4
|
809 |
+
l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.5l0.5,0.4l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5
|
810 |
+
l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.6
|
811 |
+
l0.5,0.5l0.5,0.6l0.5,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6
|
812 |
+
l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.1l0.1,0.2
|
813 |
+
l0.1,0.1l0.3,0.4l0.3,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.5,0.4l0.5,0.4l1,0.9l1.1,1l0.6,0.5l0.6,0.5l0.6,0.6l0.6,0.6l0.6,0.6
|
814 |
+
l0.6,0.6l0.6,0.7l0.6,0.7l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.5
|
815 |
+
l0.3,0.5l0.3,0.5l0.3,0.5l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.5,0.8
|
816 |
+
l0.5,0.8l0.5,0.8l0.5,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.6,0.8l1.3,1.7l1.3,1.7l0.7,0.9l0.7,0.9l0.7,0.9l0.7,0.9l0.7,0.9
|
817 |
+
l0.7,0.9l0.7,1l0.7,1l0.6,1l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.7
|
818 |
+
l0.3,0.7l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.2l0.4,1.2l0.4,1.2
|
819 |
+
l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.6,2.3l0.6,2.3l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.4,1.1l0.2,0.5l0.2,0.5
|
820 |
+
l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.3,0.6l0.2,0.4l0.2,0.5l0.2,0.4
|
821 |
+
l0.2,0.5l0.3,0.9l0.3,1l0.4,1.1l0.4,1.1l0.4,1.2l0.4,1.3l0.8,2.7l0.9,2.8l0.9,2.9l0.9,2.9l0.4,1.4l0.4,1.4l0.4,1.3l0.4,1.3
|
822 |
+
l0.4,1.2l0.4,1.1l0.4,1l0.3,0.9l0.2,0.4l0.1,0.3l0.1,0.1l0.7,0.9l0.6,0.9l0.5,1l0.4,1.1l0.2,1.1l0.1,1.1l-0.1,1.1l-0.2,1.1
|
823 |
+
l-0.3,1.1l-0.5,1l-0.6,0.9l-0.7,0.9l-0.8,0.8l0,0l-0.8,0.6l-0.8,0.5l0,0l-0.9,0.4l-1,0.3l0,0l-1,0.2l-1,0.1l0,0h-1l-1-0.1h-0.1
|
824 |
+
l-0.7-0.2l-0.7-0.2h-0.1l-0.6-0.3l-0.6-0.3h-0.1l-0.9-0.6l-0.3-0.3l-0.6-0.5l-0.5-0.5l-0.4-0.4l-0.3-0.4l-0.4-0.6l-0.4-0.6
|
825 |
+
l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.6l-0.4-1.1l-0.4-1.2l-0.4-1.3l-0.4-1.3l-0.5-1.4
|
826 |
+
l-0.5-1.4l-0.5-1.4l-0.5-1.5l-0.9-3l-0.9-2.9l-0.9-2.8l-0.8-2.6l-0.4-1.2l-0.4-1.1l-0.3-1l-0.3-0.9l-0.3-0.7l-0.2-0.6l-0.1-0.2
|
827 |
+
l-0.1-0.1l0,0l0,0l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7
|
828 |
+
l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.4-1.3l-0.4-1.3l-0.4-1.3l-0.4-1.2l-0.3-1.2l-0.3-1.2l-0.3-1.2l-0.6-2.3l-0.6-2.3L366,118
|
829 |
+
l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1l-0.3-1l-0.3-1l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5
|
830 |
+
l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.4l-0.2-0.5l-0.2-0.4L361,104l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4L360,102
|
831 |
+
l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-1.3-1.7
|
832 |
+
l-1.3-1.7l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-1l-0.7-1l-0.6-1l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5
|
833 |
+
l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.2-0.5l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
|
834 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
|
835 |
+
l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.5-0.5l-1.1-1l-1.1-1l-0.6-0.5l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.7l-0.6-0.7l-0.3-0.4
|
836 |
+
l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.4-0.6l-0.3-0.5l-0.3-0.5l-0.3-0.5
|
837 |
+
l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5
|
838 |
+
l-0.4-0.5l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
|
839 |
+
l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
|
840 |
+
l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.3l-0.4-0.4l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.9-0.7l-0.9-0.6
|
841 |
+
l-0.9-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.5l-1-0.5l-1-0.5l-1-0.5l-1-0.5l-1.1-0.5l-1.1-0.5l-1.1-0.5l-1.1-0.5
|
842 |
+
l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4L278,23l-1.2-0.3l-1.2-0.3l-1.2-0.3
|
843 |
+
l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2
|
844 |
+
l-1.2-0.2l-1.2-0.2l-1.2-0.1l-1.2-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1H241
|
845 |
+
l-1.3,0h-1.3h-1.3h-1.3h-1.3l-1.3,0h-1.3h-1.3h-1.3H228l-1.3,0l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1
|
846 |
+
l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.2l-1.3,0.2l-1.3,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2
|
847 |
+
l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.3l-1.2,0.3
|
848 |
+
l-1.3,0.3l-1.3,0.3l-1.3,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.1,0.4l-1.1,0.4
|
849 |
+
l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5
|
850 |
+
l-1,0.5l-1,0.5l-1,0.5l-0.9,0.5l-0.9,0.5l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6
|
851 |
+
l-0.9,0.6l-0.9,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
|
852 |
+
l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7L127,55l-0.8,0.8l-0.8,0.8l-0.8,0.8l-0.8,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8
|
853 |
+
l-0.7,0.8l-0.1,0.1l-0.1,0.2l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.5,0.9l-0.5,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9
|
854 |
+
l-0.6,0.9l-0.6,0.9l-0.7,0.9l-0.7,0.9l-0.7,0.9l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8
|
855 |
+
l-0.7,0.8l-0.7,0.8l-0.7,0.8l-1.5,1.6l-1.5,1.6l-1.5,1.6l-1.1,1.2l-0.2,0.3l-1.4,2l-1.4,2l-1.4,2l-1.4,2l-2.8,4.1l-2.9,4.1
|
856 |
+
l-2.9,4.2l-1.5,2.1l-1.5,2.1l-1.5,2.1l-1.5,2.1l-1.2,1.7l-0.4,0.9l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2
|
857 |
+
l-0.9,2.5l-0.9,2.5l-0.9,2.5l-0.9,2.6l-0.9,2.6l-1.8,5.2l-0.9,2.6l-0.9,2.6l-0.9,2.6l-1,2.6l-1,2.6l-0.5,1.3l-0.5,1.3l-0.5,1.3
|
858 |
+
l-0.5,1.3l-0.5,1.3l-0.5,1.4l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9
|
859 |
+
l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.9,1.6l-0.9,1.6l-0.9,1.5l-0.9,1.5l-1.8,3l-0.9,1.5l-0.8,1.5
|
860 |
+
l-0.2,0.3l-0.2,0.4l-0.2,0.5l-0.3,0.5l-0.3,0.6l-0.3,0.6l-0.6,1.4l-1.4,3l-0.7,1.5l-0.7,1.5l-0.4,0.7l-0.3,0.7l-0.3,0.7
|
861 |
+
l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.4l-0.4,0.5l-0.5,0.5l-0.3,0.3l-0.7,0.6l-0.1,0.1l-0.5,0.4
|
862 |
+
l-0.6,0.4h-0.1l-0.7,0.3l-0.7,0.3l0,0l-0.6,0.2l-0.6,0.2l0,0l-0.7,0.1l-0.7,0.1l0,0h-0.9l-0.9-0.1l0,0l-0.9-0.2l-0.9-0.3l0,0
|
863 |
+
l-0.9-0.4l-0.8-0.5l0,0l-0.6-0.5l-0.6-0.5l0,0l-0.5-0.5l-0.5-0.6l0,0l-0.5-0.7l-0.4-0.7v-0.1l-0.3-0.7l-0.2-0.7v-0.1l-0.2-1
|
864 |
+
l-0.1-0.5l-0.1-0.8v-0.6v-0.6v-0.4l0.1-1.1l0.3-1.1l0.4-1l0.5-1l0.7-0.9l0.8-0.8l0.9-0.7l0.3-0.2l0.5-1.1l0.7-1.4l1.2-2.6v-0.1
|
865 |
+
v-0.5v-0.7V188v-0.7v-0.7v-0.7l0-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
|
866 |
+
l0.1-0.7l0.1-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7
|
867 |
+
l0.2-0.7l0.5-1.4l0.5-1.4l0.5-1.4l0.5-1.4l0.5-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.7-1.4l0.7-1.4
|
868 |
+
l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.2
|
869 |
+
l0.8-1.2l0.8-1.2l0.8-1.2l0.3-0.4l0.6-1.1l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9
|
870 |
+
l0.5-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.4-0.7l0.2-0.5l0.6-1.3l0.6-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3
|
871 |
+
l0.7-1.3l0.7-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.9-1.3l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7
|
872 |
+
l0.5-0.7l0.5-0.7l0.5-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7
|
873 |
+
l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l1.5-1.5l0.9-0.9l1-1l1-1l1.1-1
|
874 |
+
l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.4l0.6-0.4l0.6-0.4l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.3
|
875 |
+
l0.6-0.3l0.8-0.3l0.5-0.1l1-0.2h0.1l0,0l0.2-0.2l0.8-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8
|
876 |
+
l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l1-0.8l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1.1-0.7
|
877 |
+
l1.1-0.7l1.1-0.7l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.2-0.6l1.2-0.6l1.2-0.5l1.2-0.5l1.2-0.5
|
878 |
+
l1.2-0.5l1.2-0.5l1.2-0.5l1.2-0.5l1.3-0.5l1.3-0.5l1.3-0.5l1.3-0.5l1.3-0.4L170,9l1.3-0.4l1.3-0.4l1.4-0.4l1.4-0.4l1.4-0.4
|
879 |
+
l1.4-0.4l1.4-0.4l1.4-0.3l1.4-0.3l1.4-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2
|
880 |
+
l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.4-0.2l1.4-0.2l1.4-0.2l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1
|
881 |
+
l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1L223.3,0.9z M388.7,162.8l-0.7,0.6l0.9-0.7l0.8-0.4L388.7,162.8z M390.5,161.8l-0.5,0.3
|
882 |
+
l0.9-0.4L390.5,161.8z M392.2,161.4l0.4-0.1h-0.2L392.2,161.4z"
|
883 |
+
/>
|
884 |
+
<path
|
885 |
+
d="M156.3,235.9l1.3-0.1l1.3-0.1h1.4h1.3h1.3h1.4h1.3h1.4h1.3h1.3h1.3h1.3h1.3h1.3l1.3,0.1l1.3,0.1l1.3,0.1
|
886 |
+
l1.3,0.1l1.3,0.1l1.3,0.1l2.6,0.2l2.7,0.2l2.6,0.2l2.6,0.2l5.3,0.4l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l1.3,0.1l1.3,0.1
|
887 |
+
l1.3,0.1l1.3,0.1h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.2h1.2l1.2,0h1.2h1.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
|
888 |
+
l1.2-0.1l1.2-0.2l1.2-0.2l1.2-0.2l1.1-0.2l1.1-0.2l1.1-0.2l0.9-0.2l0.9-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.3l1-0.3l1-0.3l1-0.3
|
889 |
+
l2.1-0.6l2.1-0.6l2.1-0.6l4.3-1.3l2.2-0.6l2.2-0.6l2.2-0.6l2.3-0.6l1.1-0.3l1.1-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3
|
890 |
+
l1.2-0.3l1.2-0.3l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
|
891 |
+
l1.2-0.1h1.2h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1
|
892 |
+
l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l2.6,0.5l2.6,0.5l5.4,1.1l2.8,0.6l2.8,0.6l2.9,0.6l2.9,0.6l2.9,0.6l3,0.6l1.5,0.3
|
893 |
+
l1.5,0.3l1.5,0.3l1.5,0.3l1.5,0.3l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2
|
894 |
+
l1.5,0.2l1.5,0.2l1.5,0.1l1.5,0.1l1.5,0.1l1.5,0.1l1.5,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1h1.4h1.4h1.4h1.4h1.4h1.3l1.3-0.1
|
895 |
+
h0.6h0.7h0.7h0.6h0.6h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
|
896 |
+
l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l1-0.1l1-0.1l1-0.1l1-0.1l2-0.1l1.9-0.1h0.9
|
897 |
+
l0.9-0.1l0.9-0.1l0.8-0.1l0.8-0.1h0.4h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
|
898 |
+
l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
899 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1v-0.1
|
900 |
+
v-0.1v-0.1v-0.1v-0.1V228l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1
|
901 |
+
v-0.1v-0.1v-0.1v-0.1V227v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
902 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.1l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
|
903 |
+
l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
|
904 |
+
l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3
|
905 |
+
l-0.9-0.3l-1.7-0.6l-1.8-0.6l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.8-0.3l-0.8-0.2l-0.8-0.2l-0.3-0.1l-0.8,0.4l-0.5,0.2
|
906 |
+
l-0.6,0.3l-0.7,0.2l-0.4,0.1l-0.9,0.2l-0.9,0.1l0,0h-1l-0.9-0.1l-0.9-0.2l-0.9-0.3l0,0l-1.1-0.5l-1-0.6l-0.9-0.7l-0.8-0.9
|
907 |
+
l-0.7-1l0,0l-0.5-0.9l-0.4-1l-0.3-1l-0.1-1v-1l0,0l0.1-1.1l0.2-1.1l0.4-1l0,0l0.4-0.8l0.5-0.8v-0.1l0.7-0.8l0.2-0.3l0.3-0.3
|
908 |
+
l0.9-0.8l1-0.7l1.1-0.5l1.2-0.4h0.1l0.2-0.1l0.7-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.1l0.7-0.1l0.8-0.1
|
909 |
+
l0.8-0.1h0.6h0.5l0.6,0.1l0.5,0.1l0.7,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.3l1.1,0.3l1,0.3l1,0.3l1,0.3l1,0.3
|
910 |
+
l1,0.3l1.8,0.6l1.7,0.6l0.8,0.3l0.8,0.3l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
|
911 |
+
l0.7,0.3l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5
|
912 |
+
l0.6,0.5l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.7l0.6,0.7l0.3,0.4l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4
|
913 |
+
l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.5l0.1,0.5
|
914 |
+
l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5l-0.1,0.5l-0.1,0.6l-0.1,0.5l-0.1,0.5
|
915 |
+
l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
|
916 |
+
l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.5,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.5
|
917 |
+
l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2
|
918 |
+
l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
|
919 |
+
l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1,0.1l-2,0.1l-1.9,0.1h-0.9l-0.9,0.1l-0.8,0.1l-0.8,0.1h-0.3h-0.4h-0.3h-0.3h-0.3
|
920 |
+
l-0.3,0.1H414l-0.3,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
|
921 |
+
l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8l-1.5,0.1h-1.5h-1.5h-1.6h-1.6h-1.6h-1.6l-1.6-0.1l-1.6-0.1
|
922 |
+
l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2
|
923 |
+
l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.3l-1.6-0.3l-1.6-0.3l-1.6-0.3l-1.5-0.3l-1.5-0.3l-1.5-0.3l-3-0.6l-3-0.6
|
924 |
+
l-3-0.6l-2.9-0.6l-2.9-0.6l-2.8-0.6l-5.4-1.1l-2.6-0.5l-2.5-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
|
925 |
+
l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-1l-1,0.1l-1,0.1l-1,0.1
|
926 |
+
l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3
|
927 |
+
l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-2.2,0.6l-2.2,0.6l-2.2,0.6l-2.2,0.6l-4.3,1.3l-2.2,0.6l-2.2,0.6l-2.2,0.6l-1.1,0.3
|
928 |
+
l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.4,0.3l-1.4,0.2l-1.4,0.2l-1.4,0.2
|
929 |
+
l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0h-1.4h-1.4h-1.4
|
930 |
+
h-1.4H220h-1.4h-1.4h-1.4h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-2.7-0.2l-2.7-0.2l-2.7-0.2l-2.7-0.2l-2.7-0.2
|
931 |
+
l-5.3-0.4l-2.6-0.2l-2.6-0.2l-2.6-0.2l-2.6-0.2l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.1l-1.2-0.1h-1.2h-1.2H167h-1.2
|
932 |
+
h-1.2h-1.2h-1.2H161h-1.2h-1.2h-1.3h-1.2h-1.3l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-2.6,0.2l-2.6,0.2l-2.6,0.2
|
933 |
+
l-2.6,0.2l-5.3,0.4l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1
|
934 |
+
l-1.4,0.1h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1
|
935 |
+
l-1.4-0.1l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1-0.2l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1
|
936 |
+
l-0.9-0.1L69,253l-0.9-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1h-1l-2-0.1l-2-0.1l-2-0.1l-2-0.1h-2h-2l-4.1-0.1l-2.1-0.1
|
937 |
+
l-2.1-0.1l-2.1-0.1l-2.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1
|
938 |
+
l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2
|
939 |
+
l-1.1-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L7,246.9l-0.7-0.2l-0.7-0.2L5,246.2l-0.6-0.3l-0.6-0.3l-0.6-0.3
|
940 |
+
L2.6,245L2,244.7l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4
|
941 |
+
l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6
|
942 |
+
l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6l0-0.6v-0.6v-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.5
|
943 |
+
l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.4
|
944 |
+
l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
|
945 |
+
l0.3-0.4l0.4-0.4l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.8-0.7l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
|
946 |
+
l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.4l0.7-0.4l0.1-0.1l0,0l0,0h0.1h0.1l0,0l0.2-0.1l0.2-0.2l0.2-0.2
|
947 |
+
l0.3-0.2l0.3-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.4-0.3l0.8-0.8l0.9-0.8l0.9-0.9l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.5
|
948 |
+
l0.6-0.5l0.6-0.5l0.7-0.5l0.7-0.5l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.2l1.1-0.5l1.2-0.3l1.2-0.2
|
949 |
+
h1.2l1.2,0.2l1.2,0.3l1.1,0.5l1,0.6l0.9,0.8l0.8,0.9l0.7,1l0.6,1.1l0.4,1.1l0.2,1.2l0.1,1.2l-0.1,1.2l-0.3,1.2l-0.4,1.1
|
950 |
+
l-0.6,1.1l-0.7,1l-0.8,0.9l-0.9,0.8l-1,0.6l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.3,0.2
|
951 |
+
l-0.3,0.2l-0.3,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.8l-0.9,0.9l-0.9,0.9l-0.5,0.5
|
952 |
+
l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.4l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
|
953 |
+
l-0.3,0.2l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4
|
954 |
+
l-0.6,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
|
955 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2L9.6,225l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2L9.1,226
|
956 |
+
L9,226.2l-0.1,0.2l-0.1,0.2l-0.1,0.2L8.6,227l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l0,0v0.1l0,0l0,0l0,0
|
957 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1
|
958 |
+
l0.3,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
|
959 |
+
l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1,0.1l0.9,0.1l1,0.1l1,0.1
|
960 |
+
l1,0.1l1,0.1h1h1l2,0.1l2,0.1l2,0.1l2,0.1l4.1,0.1h2.1h2.1l2.1,0.1l2.1,0.1l2.1,0.1l2.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1
|
961 |
+
l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.2l1,0.2l1.2,0.2l1.2,0.2l1.2,0.2
|
962 |
+
l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1h1.2h1.2h1.2h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3
|
963 |
+
l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l2.6-0.2l2.6-0.2l2.6-0.2l2.6-0.2l2.7-0.2l5.3-0.4l2.7-0.2l2.7-0.2
|
964 |
+
l2.7-0.2l2.7-0.2l1.4-0.1l1.3-0.1l1.3-0.1L156.3,235.9z M411.9,211.1L411.9,211.1l0.5-0.6l0.1-0.1L411.9,211.1z"
|
965 |
+
/>
|
966 |
+
</g>
|
967 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
968 |
+
<path
|
969 |
+
d="M6,210.5h0.6h0.6h0.6H9h1.2h1.1h1.1l1.1,0h1h1l1.9,0.1h0.8H19h0.7h0.6l1,0.1l0.9,0.2l0.9,0.4l0.8,0.5
|
970 |
+
l0.7,0.7l0.6,0.8l0.5,0.9l0.3,0.9l0.2,1v1l-0.2,1l-0.3,0.9l-0.5,0.9l-0.6,0.8l-0.7,0.7l-0.8,0.5l-0.9,0.4l-0.9,0.2l-1,0.1h-0.7
|
971 |
+
h-0.8H18h-0.9l-1.8-0.1h-1h-1h-1l-1,0h-1h-1h-1H7.8H7.3H6.8H6.3H5.8H5.3H4.8H4.3l-0.5,0.1l-0.4,0.1L3,222.8l-0.4,0.1L2.2,223
|
972 |
+
l-0.4,0.1l-0.4,0.1L1,223.3l-0.4,0.1l-0.3,0.1L0,223.6l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.2,0.1l-0.2,0.1l0,0l0.2,0.2l0.2,0.2
|
973 |
+
l0.2,0.2l0.2,0.1l0.3,0.1L0,225l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l1.6,0.7l1.6,0.7l1.6,0.7l1.7,0.7l1.7,0.7
|
974 |
+
l0.8,0.3l0.9,0.3L12,230l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.2l0.9,0.2l0.8,0.2
|
975 |
+
l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.4H31h0.4h0.5h0.5h0.5
|
976 |
+
h0.5h0.5h0.5h0.5h0.5h1.1h1.1h1.1l1.1-0.1L41,235l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
|
977 |
+
l1.2-0.2l1.2-0.2l2.3-0.3l2.2-0.3l4-0.6l0.5-0.1l0.5-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1h0.9h0.9H70h0.9h0.9h0.9h0.9l1.7,0.1
|
978 |
+
l1.7,0.1l1.6,0.1h1.6H81h0.8h0.8h0.8h0.8h0.7h0.7h0.7H87l0.7-0.1l0.7-0.1h0.3h0.4l1.7-0.2l1.8-0.2l1.8-0.2l1.8-0.2L98,231
|
979 |
+
l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1
|
980 |
+
l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1h1.8h1.8h1.8h1.8h1.8h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1,0.1l1,0.1l1,0.1
|
981 |
+
l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.2l1,0.2l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
|
982 |
+
l0.9,0.2l0.9,0.2l1.8,0.4l1.8,0.4l1.8,0.5l1.8,0.5l1.8,0.5l1.7,0.5l3.5,1l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.4
|
983 |
+
l1.8,0.4l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.4,0.1l0.4,0.1l0.4,0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4
|
984 |
+
h0.4h0.4h0.4l0.4,0h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.9-0.2l0.9-0.2
|
985 |
+
l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.9-0.6l1.9-0.7l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1.4-0.4l1.4-0.4
|
986 |
+
l1.4-0.4l1.4-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3
|
987 |
+
l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2
|
988 |
+
l1.1-0.2l1.2-0.1l1.2-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1.1,0.1l1.1,0.1
|
989 |
+
l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l2.1,0.3l2.1,0.3l2.1,0.3l2.1,0.3l4.1,0.6l2,0.3
|
990 |
+
l2,0.3l2,0.3l2,0.3l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1h1h1h1h1h1h0.9h0.9h0.9h0.9h0.9h0.9h0.9
|
991 |
+
h0.9l0.9,0.1l0.9,0.1l1.7,0.1l1.7,0.1l1.7,0.1l1.7,0.2l1.7,0.2l3.3,0.3l3.3,0.3l1.6,0.2l1.6,0.2l1.6,0.2l1.6,0.1l1.6,0.1
|
992 |
+
l1.6,0.1l0.8,0.1h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1
|
993 |
+
l0.8-0.1l0.8-0.1l0.7-0.1l0.9-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.2
|
994 |
+
l0.5-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
995 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0,0v-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2V225v-0.2v-0.2v-0.2v-0.2V224
|
996 |
+
v-0.2v-0.2v-0.2v-0.2V223v-0.2v-0.2v-0.2v-0.2v-0.1V222v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V221v-0.1l0-0.1v-0.1
|
997 |
+
v-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
998 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
999 |
+
l-0.2-0.2l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
|
1000 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1h-0.4H406h-0.4h-0.4h-0.4h-0.4H404h-0.4h-0.4l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
1001 |
+
l-0.4,0.1l-0.6,0.2l-0.4,0.1l-0.4,0.1l-0.7,0.1l-0.8,0.1l-0.9,0.1l-1,0.1l-1.1,0.1l-1.1,0.1l-1.2,0.1l-1.2,0.1h-0.6h-0.6h-0.6
|
1002 |
+
h-0.5h-0.5h-0.5h-0.5h-0.5l-0.6-0.1l-0.6-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.5-0.2h-0.1l-0.6-0.3h-0.1l-0.5-0.3l-0.4-0.4l0,0
|
1003 |
+
l-0.5-0.5l-0.4-0.6l0,0l-0.3-0.6l-0.3-0.6l-0.2-0.7l0,0l-0.1-1v-1l0.2-1l0.3-0.9l0.5-0.9l0.6-0.8l0.7-0.7l0.8-0.5l0.9-0.4
|
1004 |
+
l0.9-0.2l1-0.1l1,0.1l0.9,0.2l0.1,0.1h0.2h0.3h0.4h0.4h0.5h0.5h1l1-0.1l1-0.1l1-0.1l0.9-0.1l0.7-0.1l0.6-0.1h0.2l0.4-0.1
|
1005 |
+
l0.7-0.2l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
|
1006 |
+
l0.7,0.1l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.5,0.4l0.3,0.2
|
1007 |
+
l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
|
1008 |
+
l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.4
|
1009 |
+
l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.4l0,0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4
|
1010 |
+
l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4L425,228l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.5l-0.2,0.5
|
1011 |
+
l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3
|
1012 |
+
l-0.3,0.3l-0.3,0.3l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
|
1013 |
+
l-0.4,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
|
1014 |
+
l-0.6,0.1l-0.6,0.1l-1,0.2l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9h-0.9H395h-0.9h-0.9
|
1015 |
+
h-0.9h-0.9h-0.9h-0.9h-0.9h-0.9h-0.9H386h-0.9l-0.9-0.1l-0.9-0.1l-0.9-0.1l-1.7-0.1l-1.7-0.1l-1.7-0.2l-1.7-0.2l-1.6-0.2
|
1016 |
+
l-1.6-0.2l-3.3-0.3l-3.2-0.3l-1.6-0.2l-1.6-0.2l-1.6-0.1l-1.6-0.1l-1.6-0.1l-0.8-0.1h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8
|
1017 |
+
h-0.8h-1.1h-1.1h-1.1h-1.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1
|
1018 |
+
l-1.1-0.1l-1.1-0.1l-2.1-0.3l-2.1-0.3l-2.1-0.3l-2.1-0.3l-4.1-0.6l-2-0.3l-2-0.3l-2-0.3l-2-0.3l-1-0.1l-1-0.1l-1-0.1l-1-0.1
|
1019 |
+
l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1h-1h-1h-1h-1h-1h-1h-1h-1h-1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1
|
1020 |
+
l-1,0.1l-1,0.1l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3
|
1021 |
+
l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.4
|
1022 |
+
l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3
|
1023 |
+
l-1.9,0.7l-1.9,0.7l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1
|
1024 |
+
l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6h-0.6l-0.6,0h-0.6h-0.6h-0.6h-0.6
|
1025 |
+
h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1.9-0.5
|
1026 |
+
l-1.9-0.5l-1.9-0.5l-1.8-0.5l-1.8-0.5l-1.8-0.5l-1.8-0.5l-3.5-1l-1.7-0.5l-1.7-0.5l-1.7-0.4l-1.7-0.4l-1.7-0.4l-1.7-0.4
|
1027 |
+
l-0.8-0.2l-0.8-0.2l-0.9-0.2l-0.8-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.1l-0.9-0.1l-0.9-0.1
|
1028 |
+
l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1H151h-1h-1h-1h-1h-1.7h-1.7h-1.7
|
1029 |
+
h-1.7h-1.7l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1
|
1030 |
+
l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.7,0.2l-1.7,0.2l-1.7,0.2
|
1031 |
+
l-1.7,0.2l-1.7,0.2l-0.4,0.1l-0.5,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9H85h-0.9h-0.9H82h-0.9h-0.9h-0.9l-1.7-0.1l-1.7-0.1
|
1032 |
+
l-1.6-0.1l-1.6-0.1h-0.8h-0.8h-0.8h-0.8h-0.8H68h-0.7h-0.7h-0.7l-0.7,0.1l-0.7,0.1h-0.3h-0.4l-3.9,0.6l-2.2,0.3l-2.3,0.3
|
1033 |
+
l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1h-1.3
|
1034 |
+
h-1.3H35h-0.6h-0.6h-0.6h-0.6H32h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1
|
1035 |
+
l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2L21,245l-0.9-0.2l-0.9-0.2l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3
|
1036 |
+
l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3L8.4,241l-0.9-0.3l-0.9-0.3l-0.9-0.3l-1.8-0.7l-1.8-0.7L0.4,238l-1.7-0.7
|
1037 |
+
l-1.7-0.7l-0.3-0.1l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
|
1038 |
+
l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.5l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
|
1039 |
+
l-0.2-0.3l-0.2-0.3l-0.2-0.4L-13,228l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.5l-0.1-0.5v-0.5V224v-0.5l0-0.5
|
1040 |
+
l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
|
1041 |
+
l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.3
|
1042 |
+
l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
|
1043 |
+
l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6h0.6L6,210.5z M389.5,208l-0.3-0.4l-0.1-0.1L389.5,208z"
|
1044 |
+
/>
|
1045 |
+
</g>
|
1046 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
1047 |
+
<path
|
1048 |
+
d="M168.7,64h0.7h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.2
|
1049 |
+
l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3
|
1050 |
+
l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4
|
1051 |
+
l0.5,0.4l0.5,0.4l0.5,0.4l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5L199,78l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.6
|
1052 |
+
l0.3,0.6l0.3,0.6l0.3,0.6L203,84l0.3,0.6l0.3,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.1,0.6L205,90l0.1,0.6
|
1053 |
+
l0.1,0.6l0.1,0.6l0.1,0.6V93v0.6v0.6v0.6v0.6V96v0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6L205,99l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6
|
1054 |
+
l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6
|
1055 |
+
l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6
|
1056 |
+
l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5
|
1057 |
+
l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.9,1l-0.9,0.9l-0.9,0.9l-1,0.9l-1,0.9
|
1058 |
+
l-1,0.9l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.7l-0.9,0.7l-0.9,0.7l-0.9,0.7l-0.9,0.6L173,141l-0.9,0.6l-0.9,0.6l-0.9,0.5l-0.9,0.5
|
1059 |
+
l-0.8,0.5l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.2l-0.7,0.2
|
1060 |
+
l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.7H153h-0.7h-0.7h-0.7h-0.7
|
1061 |
+
l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
|
1062 |
+
l-0.6-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4
|
1063 |
+
l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5
|
1064 |
+
l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6
|
1065 |
+
l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6
|
1066 |
+
l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.7l-0.1-0.7
|
1067 |
+
l-0.1-0.6l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.7v-0.7v-0.7v-0.7v-0.7l0-0.7v-0.7
|
1068 |
+
v-0.7V101l0.1-0.7l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.3-1.5l0.3-1.7l0.3-1.8l0.2-0.9l0.2-0.9l0.2-1l0.2-1
|
1069 |
+
l0.2-1l0.2-1l0.2-1l0.3-1l0.3-1l0.3-1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
|
1070 |
+
l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3
|
1071 |
+
l0.3-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3L132,69l0.3,0.1
|
1072 |
+
l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
|
1073 |
+
l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.1,0.1h-0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.2
|
1074 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
1075 |
+
l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.3,0.9
|
1076 |
+
l-0.3,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.3,1.8l-0.3,1.7l-0.3,1.5l-0.1,0.6
|
1077 |
+
l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.6l-0.1,0.5l-0.1,0.6v0.6v0.6v0.6v0.6v0.6l0,0.6v0.6v0.6v0.6v0.6v0.6l0.1,0.6l0.1,0.6
|
1078 |
+
l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6
|
1079 |
+
l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5
|
1080 |
+
l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.4,0.4l0.4,0.4
|
1081 |
+
l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3
|
1082 |
+
l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.1
|
1083 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1l0.5-0.1
|
1084 |
+
l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.3l0.6-0.3l0.6-0.3l0.3-0.2
|
1085 |
+
l0.3-0.2l0.4-0.2l0.4-0.2l0.8-0.4l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.6l0.9-0.6l0.9-0.6l0.9-0.7l0.9-0.7l0.9-0.7l0.9-0.7
|
1086 |
+
l0.9-0.7l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.9l0.9-0.9l0.9-0.9l0.4-0.4l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
|
1087 |
+
l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
|
1088 |
+
l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.2-0.5
|
1089 |
+
l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5
|
1090 |
+
l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5V96v-0.5V95v-0.5V94v-0.5V93v-0.5V92l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.4l-0.1-0.5
|
1091 |
+
l-0.1-0.4l-0.1-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4
|
1092 |
+
l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
|
1093 |
+
l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
|
1094 |
+
l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
|
1095 |
+
l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5
|
1096 |
+
h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
1097 |
+
l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
|
1098 |
+
l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.8,0.5l-0.8,0.5l-0.8,0.5l-0.8,0.5l-0.7,0.5l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.5,0.4l-0.5,0.4
|
1099 |
+
l-0.5,0.4l-0.5,0.4l-0.2,0.2h-0.1v0.2l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2
|
1100 |
+
l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.2h-0.2h-0.3h-0.1h-0.2h-0.2h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.2l0,0
|
1101 |
+
l-0.2-0.1l-0.2-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0v-0.3v-0.3V79v-0.2v-0.2v-0.1
|
1102 |
+
v-0.2l0.1-0.2V78l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.2l0.1-0.2l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
|
1103 |
+
l0.6-0.5l0.6-0.5l0.6-0.4l0.6-0.4l0.5-0.3l0.4-0.3l0.5-0.3l0.8-0.5l0.8-0.5l0.8-0.5l0.9-0.5l0.9-0.5l0.5-0.3l0.5-0.3l0.5-0.3
|
1104 |
+
L157,68l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2L162,66l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
|
1105 |
+
l0.5-0.1L165,65l0.5-0.1l0.5-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7L168.7,64z M146,75.9L146,75.9L146,75.9L146,75.9z"
|
1106 |
+
/>
|
1107 |
+
</g>
|
1108 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
1109 |
+
<path
|
1110 |
+
d="M102.5,119.3h0.5h0.5h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2
|
1111 |
+
l0.5,0.2l0.5,0.2l0.5,0.2l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
|
1112 |
+
l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3
|
1113 |
+
l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3
|
1114 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
|
1115 |
+
l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.5,0.5
|
1116 |
+
l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4
|
1117 |
+
l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
|
1118 |
+
l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.3,0.1h-0.2l-0.6,0.1l-0.6,0.1h-0.6h-0.5h-0.5
|
1119 |
+
h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1L87,156l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
|
1120 |
+
l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3L83,153l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4
|
1121 |
+
l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4V147v-0.4v-0.4v-0.4v-0.4V145
|
1122 |
+
v-0.4v-0.4v-0.4v-0.4V143v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4
|
1123 |
+
l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.5L83,135l0.3-0.8l0.4-0.9l0.4-1l0.5-1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
|
1124 |
+
l0.2-0.5l0.2-0.5v-0.1V128v-0.2v-0.2v-0.2l0.1-0.2L86,127l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.3-0.3
|
1125 |
+
l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3L89,124l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.2l0.5-0.2l0.5-0.2
|
1126 |
+
l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
|
1127 |
+
l0.5-0.1h0.5L102.5,119.3z M102,125.2h-0.4h-0.4l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1L98,126
|
1128 |
+
l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l0,0
|
1129 |
+
v0.1v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1
|
1130 |
+
l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4L90,133l-0.2,0.5l-0.2,0.5l-0.4,0.9l-0.4,0.9
|
1131 |
+
l-0.4,0.8l-0.3,0.7l-0.2,0.6l-0.2,0.4l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
|
1132 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l0.1,0.2
|
1133 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
1134 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1h0.1h0.1h0.1h0.1h0.1H89h0.1h0.1h0.1h0.1h0.2h0.2h0.3h0.3h0.3H91h0.3h0.4l0.4-0.1h0.1h0.1
|
1135 |
+
l0.2-0.1l0.2-0.1L93,150l0.3-0.1l0.3-0.1l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
|
1136 |
+
l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.4-0.4l0.4-0.5
|
1137 |
+
l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.2-0.4
|
1138 |
+
l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2v-0.2v-0.2V131v-0.2v-0.2v-0.2v-0.2
|
1139 |
+
V130v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V129v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
|
1140 |
+
l-0.1-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
1141 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.3-0.1l-0.3-0.1
|
1142 |
+
l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1h-0.3h-0.3h-0.3h-0.4h-0.4h-0.4h-0.4L102,125.2z"
|
1143 |
+
/>
|
1144 |
+
</g>
|
1145 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
1146 |
+
<path
|
1147 |
+
d="M80.8,178.7h0.4h0.4H82h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.6,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
|
1148 |
+
l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
|
1149 |
+
l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.7,0.5l0.7,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l1.2,1l1.2,1.1l0.6,0.5
|
1150 |
+
l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.2l0.4,0.2
|
1151 |
+
l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l0.6,0.2l0.6,0.2
|
1152 |
+
l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.5,0.2l0.6,0.2l0.5,0.2l0.5,0.3l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.4,0.2l0.4,0.3
|
1153 |
+
l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.3,0.4l0.2,0.2l0.2,0.2l0.2,0.2
|
1154 |
+
l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3
|
1155 |
+
v0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2
|
1156 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
|
1157 |
+
l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1
|
1158 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3
|
1159 |
+
l-0.7-0.3l-1.4-0.6l-0.7-0.3l-0.6-0.3l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.2h-0.1h-0.2l-0.3-0.1
|
1160 |
+
l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
|
1161 |
+
l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.8-0.6l-0.8-0.6l-0.8-0.6l-0.4-0.3l-0.4-0.3l-0.4-0.3
|
1162 |
+
l-0.4-0.3l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
|
1163 |
+
l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5
|
1164 |
+
h-0.5h-0.5h-0.5h-0.5h-0.5h-0.6h-0.5h-1.1l-1.1,0.1l-1.1,0.1l-2.3,0.2l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1h-1.2h-0.6H72h-0.6
|
1165 |
+
H69h-0.6h-0.6h-0.6h-0.6H66h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.2l-0.6-0.2
|
1166 |
+
l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2L55,202l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
|
1167 |
+
l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.4
|
1168 |
+
l-0.1-0.4l-0.1-0.4l-0.1-0.4V194v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
|
1169 |
+
l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
|
1170 |
+
l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.2-0.1l0,0v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2
|
1171 |
+
l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.2,0.2h0.1l0.5-0.1l0.3-0.1l0.3-0.1l0.3-0.1
|
1172 |
+
h0.3h0.4h0.4h0.4h0.4l0.4,0.1h0.3l0.2,0.1L66,181l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
1173 |
+
h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.2-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l1.1-0.4
|
1174 |
+
l0.5-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.4L80.8,178.7z
|
1175 |
+
M80.5,184.6h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2,0.1l-0.2,0.1l-0.4,0.1L78,185l-0.5,0.2l-0.5,0.2l-0.5,0.2l-1.1,0.4l-0.6,0.2
|
1176 |
+
l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.4h-0.4H70h-0.4h-0.4h-0.4h-0.4H68h-0.4
|
1177 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1L66,187l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.2-0.1l0,0h-0.1H64h-0.2h-0.2h-0.2h-0.2l-0.5,0.1
|
1178 |
+
l-0.5,0.1l-0.5,0.1h-0.2l-0.2,0.2L61,187l-0.3,0.1l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
|
1179 |
+
l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2
|
1180 |
+
l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.2l0,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1
|
1181 |
+
v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2
|
1182 |
+
l0.3,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
|
1183 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.6h0.6h0.6H71h1.1l1.1-0.1l1.1-0.1l1.2-0.1l1.2-0.1
|
1184 |
+
l2.3-0.2l1.2-0.1l1.2-0.1h1.2h0.6h0.6h0.6H85h0.6h0.6h0.6h0.6H88h0.6l0.6,0.1l0.6,0.1l0.6,0.1L91,199l0.6,0.1l0.6,0.1l0.6,0.1
|
1185 |
+
l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.5,0.3l0.5,0.3
|
1186 |
+
l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.4,0.3l0.4,0.3l0.8,0.7l0.8,0.6l0.8,0.6l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.4,0.2l0.4,0.2
|
1187 |
+
l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2l0.2,0.1
|
1188 |
+
l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.6,0.2l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l1.4,0.6l0.7,0.3l0.7,0.3l0.7,0.3
|
1189 |
+
l0.7,0.3l0.7,0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.3h0.3h0.2h0.2h0.2h0.2
|
1190 |
+
h0.2h0.2h0.2h0.1h0.1h0.1l0,0h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1V213v-0.1v-0.1
|
1191 |
+
l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.3
|
1192 |
+
l-0.2-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
|
1193 |
+
l-0.3-0.2l-0.2-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
|
1194 |
+
l-0.5-0.2l-0.5-0.2l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
|
1195 |
+
l-0.6-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.2-0.2l-0.9-0.7l-0.9-0.7l-0.8-0.6
|
1196 |
+
l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.6l-1.2-1.1l-1.2-1l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.6-0.4l-0.5-0.4l-0.6-0.4
|
1197 |
+
l-0.6-0.4l-0.6-0.4l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.4-0.2
|
1198 |
+
l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2H80
|
1199 |
+
h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.2L80.5,184.6z"
|
1200 |
+
/>
|
1201 |
+
</g>
|
1202 |
+
<g transform="matrix(1,0,0,1,400.214,44.558)">
|
1203 |
+
<path
|
1204 |
+
d="M332.3,146.1h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0,0l0.6,0.1
|
1205 |
+
l0.6,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
1206 |
+
l0.2,0.1l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4
|
1207 |
+
l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8
|
1208 |
+
l0.2,0.8l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.3,0.5
|
1209 |
+
l0.3,0.7l0.4,0.7l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5l0.1,0.3v0.3v0.3
|
1210 |
+
v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3L350,181l-0.2,0.3l-0.2,0.3
|
1211 |
+
l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.3h-0.2
|
1212 |
+
h-0.3h-0.3h-0.2H345h-0.2h-0.2h-0.2h-0.2H344h-0.2l-0.2-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
|
1213 |
+
l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3
|
1214 |
+
l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.5-0.7
|
1215 |
+
l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.3-0.7l-0.3-0.6l-0.3-0.6l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
|
1216 |
+
l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4V163v-0.4v-0.4v-0.4v-0.4V161v-0.9v-0.9v-0.8v-1.6v-1.6
|
1217 |
+
v-0.7v-0.8v-0.2v-0.1v-0.1v-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.2-0.4l0.2-0.4l0.1-0.2l0,0v-0.1v-0.1
|
1218 |
+
l-0.1-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
|
1219 |
+
l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2L332.3,146.1z M334.7,152.9l-0.1,0.3l-0.1,0.3v0.1v0.1
|
1220 |
+
l0,0v0.6v0.8l-0.1,1.6v1.6v0.8v0.8v0.8v0.4v0.4v0.4v0.4v0.4v0.3v0.3v0.3v0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.1v0.1
|
1221 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.2,0.5l0.2,0.5l0.3,0.5l0.3,0.6l0.3,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.2,0.3l0.2,0.3l0.2,0.3
|
1222 |
+
l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.2l0.2,0.2l0.2,0.2
|
1223 |
+
l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2l0,0h0.1h0.1h0.1
|
1224 |
+
h0.1h0.1h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V177l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
|
1225 |
+
l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.3l-0.3-0.7l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5
|
1226 |
+
l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.2-0.9l-0.2-0.9l-0.2-0.9
|
1227 |
+
l-0.2-0.9l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.7l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
|
1228 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
1229 |
+
l-0.2-0.1h-0.1h-0.1l-0.1-0.1h-0.1l-0.1-0.1h-0.1h-0.1H336h-0.1h-0.1h-0.1h-0.1l-0.3-0.1l-0.3-0.1h-0.1L334.7,152.9z"
|
1230 |
+
/>
|
1231 |
+
</g>
|
1232 |
+
</g>
|
1233 |
+
</g>
|
1234 |
+
</g>
|
1235 |
+
<g>
|
1236 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1237 |
+
<path
|
1238 |
+
fill="#B5A47D"
|
1239 |
+
d="M-204.2,1379.2L-204.2,1379.2l-0.4-0.9l-0.3-0.8l-0.3-0.9l-0.4-0.9l-0.4-0.9l-0.7-1.9l-0.6-1.7l-0.3-0.8
|
1240 |
+
l-0.2-0.7l-0.2-0.7l-0.2-0.8l-0.3-1.2l-0.2-1l-0.2-0.9l-0.2-0.9l-0.2-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.2-1.6
|
1241 |
+
l-0.2-1.6l-0.2-1.5l-0.2-1.5l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
|
1242 |
+
l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.2-0.6l-0.5-1.6l-0.5-1.7l-0.5-1.7l-0.5-1.7l-0.5-1.7l-0.5-1.8l-0.5-1.8l-0.4-1.8l-0.4-1.8
|
1243 |
+
l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8
|
1244 |
+
l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.2-1.8l-0.2-1.8l-0.2-1.8l-0.1-1.2l-0.2-1.2l-0.2-1.2
|
1245 |
+
l-0.2-1.2l-0.2-1.2l-0.2-1.2l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5
|
1246 |
+
l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.4l-0.1-0.3l-0.5-0.3l-0.6-0.4l-0.4-0.3l-0.4-0.4l-0.6-0.5l-0.4-0.4l-0.8-0.8l-0.1-0.1l-0.8-1
|
1247 |
+
l0,0l-0.6-1l0,0l-0.4-0.7l-0.3-0.8l0,0l-0.4-1.2l-0.2-1.2l0,0l-0.1-1.4v-1.4l0,0l0.2-1.2l0.3-1.2l0.4-1.1l0,0l0.3-0.7l-0.1-0.2
|
1248 |
+
l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.3h-0.2l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
|
1249 |
+
l-0.5-0.2l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3
|
1250 |
+
l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.6-0.6l-0.6-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7
|
1251 |
+
l-0.4-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.1-0.3l-0.1-0.1l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.5-0.7
|
1252 |
+
l-0.5-0.7l-0.4-0.7l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.4-0.9l-0.3-0.8l-0.3-0.6l-0.2-0.4l-0.1-0.2
|
1253 |
+
l-0.8-1.1l-0.5-0.7l-0.5-0.7l-0.5-0.8l-0.6-0.9l-0.6-0.9l-0.6-1l-0.6-1l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6
|
1254 |
+
l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8
|
1255 |
+
l-0.1-0.9l-0.1-0.8v-0.5v-0.5v-0.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.6l0.2-0.5
|
1256 |
+
l0.2-0.6l0.2-0.6l0.3-0.6l0.3-0.5l0.3-0.5l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4
|
1257 |
+
l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.7-0.2l0.8-0.2l0.8-0.2
|
1258 |
+
l0.8-0.1l0.9-0.1l0.8-0.1h0.8h0.9l0.9,0.1h0.4l0.1-0.2l0.4-0.6l0.4-0.6l0.5-0.6l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.4
|
1259 |
+
l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.8-0.3l0.8-0.3l0.8-0.2l0.7-0.2l0.7-0.2l0.7-0.1
|
1260 |
+
l0.7-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.7-0.1l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.4-0.3l0.5-0.3l0.8-0.4
|
1261 |
+
l0.8-0.4l0.8-0.3l0.8-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.6
|
1262 |
+
h0.6h0.7h1.2h1.2h1.2h1.2h1.1l1.1,0.1l1.1,0.1l1,0.1l1.9,0.1l1.7,0.1l1.3,0.1h0.5h0.3h0.1l3-0.1l3.2-0.1l3.2-0.1l3.2-0.1l3.2-0.1
|
1263 |
+
l3.2-0.1l3.6-0.2l0.6-0.5l1.2-0.8l1.3-0.6l1.3-0.4l0,0l1.1-0.2l1.2-0.1h1.2h0.1l0.8,0.1l0.8,0.1l0.5,0.1l0.8,0.2l0.6,0.2l0.7,0.2
|
1264 |
+
l0.5,0.2l0.4,0.2l0.4,0.2h0.1h0.3h0.7h0.8h0.9h1h0.6h0.5h0.6h0.6h0.6h0.6h0.6h0.6h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
|
1265 |
+
l0.6-0.1l0.6-0.1l1.2-0.2l1.2-0.2l1.3-0.2l2.7-0.5l1.4-0.2l1.5-0.2l1.5-0.2l0.8-0.1l0.8-0.1l2.5-0.3l2.5-0.3l2.5-0.3l2.5-0.3
|
1266 |
+
l2.4-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
|
1267 |
+
l1.2-0.1h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1
|
1268 |
+
l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.2l1.2,0.2l1.3,0.2
|
1269 |
+
l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l1.3,0.3l1.3,0.3l1.3,0.3l1.3,0.3l1.2,0.3l1.2,0.3l2.4,0.6h0.1
|
1270 |
+
h0.7l1.2-0.1l1.2-0.1h1.2h1.2h0.3l0.7-0.6l1.1-0.7l1.2-0.6l1.2-0.5l1.3-0.3l1.3-0.2l0,0h1.2l1.2,0.1l1.2,0.2l0,0l1.1,0.3l1,0.4
|
1271 |
+
l0.4,0.2l0.9,0.4l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
|
1272 |
+
l0.8,0.3h0.6h0.4h0.4h0.4h0.3h0.2l0.3-0.2l0.8-0.5l0.5-0.3l0.5-0.3l0.6-0.3l0.6-0.3l0.6-0.4l0.7-0.4l0.8-0.4l0.8-0.3l0.5-0.2
|
1273 |
+
l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.6-0.1l0.7-0.1l0.7-0.1l0.8-0.1h0.9h0.9l0.9,0.1l1,0.1l1.1,0.2l1,0.3l0.5,0.2l1,0.5l0.1,0.1
|
1274 |
+
l0.9,0.5l0.5,0.4l0.5,0.4l0.8,0.7l0.4,0.4l0.8,0.8l0.7,0.9l0.6,0.9l0.5,0.9l0.4,0.8l0.3,0.9l0.3,0.9l0.2,1l0.1,0.5l0.1,1.1v0.6
|
1275 |
+
v0.6l-0.1,0.8l0.3,0.3l0.5,0.4l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.7l0.3,0.7l0.3,0.6l0.3,0.7l0.1,0.3
|
1276 |
+
l0.9,0.5l0.1,0.1l1,0.7l0.1,0.1l0.9,0.8l0.1,0.1l0.9,1l0.1,0.1l0.7,1l0.1,0.1l0.6,1l0.1,0.1l0.5,1l0.3,0.6l0.3,1.1l0.2,1l0.1,1
|
1277 |
+
l0.1,0.9v0.8v0.8l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.8
|
1278 |
+
l-0.3,0.8l-0.4,0.8l-0.3,0.7l-0.4,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1l-0.6,0.9l-0.5,0.7l-0.3,0.5l-0.1,0.1v0.1
|
1279 |
+
l-0.3,0.5l-0.3,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.7,1l-0.7,1l-0.7,1l-0.7,1l-0.7,0.9l-0.2,0.4
|
1280 |
+
l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.5,0.7l-0.5,0.7
|
1281 |
+
l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7
|
1282 |
+
l-0.5,0.7l-0.4,0.5l0,0l0,0l-0.1,0.1l-0.1,0.1l-0.3,0.5l-0.4,0.6l-0.5,0.7l-0.5,0.8l-0.6,0.9l-0.3,0.5l-0.4,0.5l-0.4,0.5
|
1283 |
+
l-0.4,0.5l-0.5,0.6l-0.5,0.6l-0.6,0.6l-0.4,0.4l-0.4,0.4l-0.4,0.3v1.2l-0.1,1.4l-0.3,1.4l-0.4,1.3l-0.2,0.5l-0.5,1.1l-0.3,0.7
|
1284 |
+
l-0.3,0.8l-0.3,0.8l-0.2,0.5l-0.2,0.5l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5
|
1285 |
+
l-0.4,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.5
|
1286 |
+
l-0.9,0.8l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.4,0.3v0.4l-0.1,0.8l-0.1,0.8l-0.1,0.9l-0.2,0.9l-0.2,0.9
|
1287 |
+
l-0.2,0.8l-0.2,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.2,0.4l-0.1,0.2l0,0l-0.2,0.4
|
1288 |
+
l-0.3,0.5l-0.3,0.6l-0.7,1.4l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.6l-0.5,0.7l-0.7,0.8l-0.6,0.6
|
1289 |
+
l-0.3,0.3l-0.8,0.7l0,0l-0.6,0.4l-0.2,0.5l-1,2.3l-1,2.3l-2,4.6l-3.2,7.4l-3.2,7.4l-3.2,7.4l-3.2,7.4l-3.2,7.5l-3.2,7.4l-3.2,7.5
|
1290 |
+
l-3.2,7.5l-3.1,7.5l-3.1,7.5l-3.1,7.5l-3.1,7.5l-6.3,15l-6.3,15l-2.4,5.7l-2.4,5.7l-2.4,5.7l-1.2,2.9l-1.2,2.9l-1.2,2.9l-1.2,2.9
|
1291 |
+
l-1.1,2.9l-1.1,2.9l-1.1,2.8l-1.1,2.9l-1.1,2.9l-1.1,2.9l-0.5,1.3l-0.5,1.2l-0.4,1.1l-0.4,1l-0.4,0.9l-0.3,0.8l-0.6,1.4l-0.6,1.4
|
1292 |
+
l-0.7,1.5l-0.4,0.9l-0.4,1l-0.5,1.1l-0.5,1.3l-0.2,0.6l-0.2,0.6l-0.3,0.7l-0.3,0.7l-0.4,0.8l-0.4,0.8l-0.3,0.5l-0.3,0.5l-0.3,0.5
|
1293 |
+
l-0.3,0.5l-0.3,0.5l-0.4,0.6l-0.4,0.6l-0.5,0.6l-0.6,0.7l-0.7,0.7l-0.5,0.5l-0.5,0.4l-0.6,0.4l-0.7,0.5l-0.8,0.5l-1,0.5l-0.6,0.2
|
1294 |
+
l-1.1,0.4h-0.1l-1.2,0.3h-0.1l-0.7,0.1h-0.4l-0.1,0.4l-0.3,0.9l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.2,0.6l-0.3,0.7l-0.4,0.8l-0.5,0.8
|
1295 |
+
l-0.4,0.6l-0.5,0.6l-0.6,0.7l-0.3,0.4l-0.8,0.8h-0.1l-1,0.8h-0.1l-0.7,0.4l-0.7,0.4h-0.1l-0.9,0.4l-0.4,0.1l-0.8,2l-0.8,2.1
|
1296 |
+
l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.7,2.1l-0.7,2.1l-0.7,2.1l-0.7,2.1l-0.3,1l-0.3,0.8l0,0v0.2v0.2l-0.1,0.6l-0.2,1.6
|
1297 |
+
l-0.1,0.9l-0.1,0.5l-0.1,0.5l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.7l-0.2,0.8l-0.3,0.8l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.7
|
1298 |
+
l-0.5,0.8l-0.6,0.8l-0.4,0.4l-0.9,0.9l-0.1,0.1l-1.1,0.8h-0.1l-0.7,0.4l-0.7,0.4h-0.1l-0.8,0.3l-0.6,0.2v0.1l-0.1,0.9v0.1v0.3
|
1299 |
+
v0.8v1l-0.1,2.6v1.5l-0.1,1.5v0.8v0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.5l-0.1,0.5
|
1300 |
+
l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.6l-0.3,0.6l-0.3,0.7l-0.4,0.8l-0.5,0.9l-0.4,0.5l-0.7,0.9l-0.1,0.1l-0.8,0.8l-0.9,0.7l0,0
|
1301 |
+
l-0.9,0.6l-1,0.5l-1,0.4l0,0l-1.1,0.4l-1.1,0.2l-1.1,0.1h-1.1l0,0l-1.3-0.1l-1.3-0.2l-1.2-0.4l0,0l-1.2-0.5l-1.1-0.6l-1.1-0.8
|
1302 |
+
l0,0l-0.8-0.7l-0.7-0.8l-0.6-0.8l0,0l-0.5-0.7l-0.4-0.7l-0.3-0.5l-0.3-0.8l-0.2-0.6l-0.2-0.5l-0.2-0.7l-0.2-0.7l-0.1-0.6
|
1303 |
+
l-0.1-0.6l-0.1-0.6l-0.1-0.7l-0.2-1.3l-0.2-1.4l-0.2-1.4l-0.2-1.4l-0.2-1.4l-0.4-2.5l-0.2-1.6l-0.1-0.3l-0.2-0.6l-0.2-0.6
|
1304 |
+
l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.1-1.1l-0.1-1.1
|
1305 |
+
l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-2l-0.3-3.9l-0.1-1.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.1-0.8
|
1306 |
+
l-0.1-0.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.9l-0.4-2.8l-0.4-2.9l-0.4-2.8l-0.9-5.7l-0.9-5.7
|
1307 |
+
l-0.9-5.7l-1.8-11.5l-0.9-5.8l-0.9-5.8l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.3-2.3
|
1308 |
+
l-0.3-2.2l-0.6-4.5l-0.3-2.2l-0.2-1.3l-0.2-0.4l-0.3-1.3l-0.2-1.3l-0.6-3.2l-0.7-3.9l-0.3-1.9l-0.3-1.6l-0.2-0.8l-0.2-0.8
|
1309 |
+
l-0.2-0.9l-0.2-0.9l-0.2-1l-0.2-1.1l-0.2-1.1l-0.1-0.6l-0.1-0.6l-0.2-1.1l-0.2-1.1l-0.1-1l-0.1-1l-0.1-0.9l-0.1-0.9l-0.1-0.8
|
1310 |
+
v-0.1l-0.3-1.1l-0.1-0.2l-0.1-0.3l-0.3-1l-0.8-2.2l-0.3-1.1l-0.2-0.6l-0.2-0.7l-0.2-0.7l-0.1-0.4l-0.1-1.2v-1.2l0,0l0.1-1.4
|
1311 |
+
l0.3-1.3l0.4-1.3l0.6-1.2L-204.2,1379.2z M-182.3,1308.4l0.3,1.6h0.1l0,0v-0.1l0.2-0.6l0.1-0.4l-0.1-0.2l-0.7-0.9L-182.3,1308.4z
|
1312 |
+
"
|
1313 |
+
/>
|
1314 |
+
</g>
|
1315 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1316 |
+
<path
|
1317 |
+
fill="#836F40"
|
1318 |
+
d="M-165.2,1548.9l0.5-0.9l0.3-0.5l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
1319 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
1320 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.4-0.3l0.8-0.6l0.5-0.3l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1
|
1321 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2
|
1322 |
+
h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.2h0.1h0.2h0.1h0.1h0.1
|
1323 |
+
l0.2,0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.5,0.2l0.9,0.4l0.4,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
1324 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
1325 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
1326 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
1327 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1v0.2v0.1v0.1v0.2v0.1v0.2v0.1v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2
|
1328 |
+
v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.2v0.1v0.2v0.1v0.1v0.1l-0.1,0.1l-0.1,0.1
|
1329 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
1330 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.2v0.2v0.1v0.1v0.2v0.1v0.1l-0.1,0.1l-0.1,0.1
|
1331 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
1332 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
1333 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
1334 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
1335 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
1336 |
+
l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.2h-0.2h-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2
|
1337 |
+
h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.1h-0.2h-0.2
|
1338 |
+
h-0.1h-0.1h-0.2h-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
1339 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
1340 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
1341 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
1342 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
1343 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1v-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.2v-0.2v-0.2
|
1344 |
+
v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.5v-0.6v-0.7l0.1-0.7l0.1-0.8l0.1-0.8l0.1-0.5l0.1-0.5l0.1-0.5
|
1345 |
+
l0.1-0.5l0.1-0.5l0.2-0.6l0.2-0.6l0.3-0.7L-165.2,1548.9z M-158.6,1564.1L-158.6,1564.1L-158.6,1564.1L-158.6,1564.1l-0.2-0.1
|
1346 |
+
l-0.1-0.1L-158.6,1564.1z"
|
1347 |
+
/>
|
1348 |
+
</g>
|
1349 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1350 |
+
<path
|
1351 |
+
fill="#836F40"
|
1352 |
+
d="M-49.4,1288.3l0.6-1.3l0.6-1.3l0.6-1.2l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
|
1353 |
+
l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.6l0.2-0.2l0.4-0.6l0.5-0.8l0.5-1l0.6-1l0.3-0.6l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6
|
1354 |
+
l0.4-0.6l0.5-0.6l0.5-0.7l0.5-0.6l0.3-0.4l0.3-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4l0.6-0.4l0.7-0.5l0.8-0.5l1-0.4
|
1355 |
+
l0.6-0.2l1.1-0.3h0.1l0.6-0.1l0.6-0.1h0.1l0.7-0.1h0.7h0.1h0.8l0.8,0.1h0.1l0.8,0.1l0.8,0.2h0.1l0.8,0.2l0.8,0.3h0.1l0.7,0.3
|
1356 |
+
l0.7,0.4l0.1,0.1l0.6,0.4l0.6,0.4l0.1,0.1l0.6,0.5l0.5,0.5l0.1,0.1l0.5,0.5l0.5,0.6l0.1,0.1l0.4,0.5l0.4,0.6l0.1,0.1l0.3,0.5
|
1357 |
+
l0.3,0.6l0.1,0.1l0.4,1l0.2,0.6l0.3,1.1l0.2,1l0.1,0.9l0.1,0.8v0.8v0.7v0.7l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.1,0.5
|
1358 |
+
l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.8l-0.3,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6
|
1359 |
+
l-0.3,0.5l-0.5,0.9l-0.4,0.8l-0.3,0.6l-0.1,0.2l-0.3,0.5l-0.4,0.9l-0.9,1.6l-0.9,1.6l-0.8,1.6l-1.7,3.1l-0.8,1.5l-0.8,1.5
|
1360 |
+
l-0.7,1.4l-0.7,1.4l-1.4,2.8l-1.4,2.9l-1.5,2.9l-0.7,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5
|
1361 |
+
l-0.9,1.5l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.5,0.8l-0.3,0.5l-0.1,0.2l-0.4,0.8l-0.3,0.7l-0.1,0.3l-0.1,0.6l-0.2,0.6
|
1362 |
+
l-0.2,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.4l-0.2,0.5l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l0,0l-0.6,1.6l-0.8,2.1
|
1363 |
+
l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.9,2l-0.9,2l-0.9,2l-0.7,1.7v0.1l-0.1,0.3l-0.1,0.5l-0.2,0.6
|
1364 |
+
l-0.2,0.7l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.3,0.6l-0.3,0.7l-0.4,0.7l-0.5,0.8l-0.6,0.8l-0.7,0.9l-0.7,0.8l-0.6,0.5
|
1365 |
+
l-0.5,0.4l-0.5,0.4l-0.6,0.4l-0.7,0.4l-0.7,0.3l-0.7,0.3l0,0l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.3,0.7
|
1366 |
+
l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.5,1.1l-0.4,1l-0.4,0.9l-0.3,0.7l-0.3,0.7l-0.6,1.3l-0.7,1.4l-0.7,1.4l-0.8,1.5l-0.7,1.4
|
1367 |
+
l0,0l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6
|
1368 |
+
l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1.1l-1.1,1.8l-0.4,0.7l-0.1,0.2l-0.1,0.3l-1.1,2.1l-1.2,2.1l-1.2,2.1l-1.2,2.1
|
1369 |
+
l-1.2,2.1l-1.2,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-0.1,0.2l-0.5,1.1l-0.8,1.5l-0.7,1.5l-0.7,1.5
|
1370 |
+
l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.1,0.1v0.1v0.4l-0.1,0.7l-0.1,0.8
|
1371 |
+
l-0.2,1.2l-0.3,1.2l-0.4,1.1l-0.5,1l-0.6,2.4l-0.6,2.5l-0.6,2.5l-0.3,1.3l-0.3,1.3l-0.3,1.3l-0.4,1.3l-0.4,1.3l-0.4,1.3l-0.4,1.3
|
1372 |
+
l-0.4,1.3l-0.4,1.3l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.7l0,0v0.1v0.7v0.6v0.6l-0.1,0.6
|
1373 |
+
l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.8l-0.2,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6
|
1374 |
+
l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.6,1l-0.6,1l-0.5,0.9l-0.9,1.5l-0.4,0.6l-0.3,0.5l-0.7,1.2l-0.7,1.1
|
1375 |
+
l-0.6,1l-0.6,0.9l-0.5,0.7l-0.3,0.8l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1l-0.5,1l-0.5,1
|
1376 |
+
l-0.5,1l-0.6,1l-0.5,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-1.2,1.9l-1.2,1.9l-2.3,3.7l-0.2,0.4l-0.3,0.5l-0.8,1.4
|
1377 |
+
l-0.5,0.8l-0.5,0.9l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.3,1l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.4
|
1378 |
+
l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3v0.3v0.3v0.3v0.2v0.2v0.2v0.2v0.1v0.1l0,0v0.1l0.2,1.2
|
1379 |
+
l0.1,1.2v1.2l-0.2,1.2l-0.3,1.2l-0.4,1.1l-0.5,1.1l-0.6,1l-0.7,1l-0.8,0.9l-0.9,0.8l-1,0.7l-1,0.6l-1.1,0.5l-1.1,0.4l-1.2,0.3
|
1380 |
+
l-1.2,0.1h-1.2l-1.2-0.1l-1.2-0.2l-1.1-0.3l-1.1-0.5l-1.1-0.6l-1-0.7l-0.9-0.8l-0.8-0.9l-0.7-0.9l-0.6-1l-0.5-1.1l-0.4-1.1
|
1381 |
+
l-0.3-1.2l-0.1-0.6l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.1-0.8v-0.8v-0.8v-0.8v-0.8l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
|
1382 |
+
l0.1-0.7l0.1-0.7l0.1-0.7l0.2-0.7l-0.1-0.2l-0.4-1l-0.3-1l-0.2-1l-0.1-1.1l0,0v-1l0.1-1l0.2-1l0.2-1l0,0l0.3-0.8l0.3-0.8l0,0
|
1383 |
+
l0.3-0.6l0.4-0.6l0.3-0.5l0.5-0.7l0.4-0.5l0.3-0.4l0.5-0.6l0.4-0.5l0.2-0.2l2.2-3l0.1-0.1l0.3-0.7l0.3-0.8l0.3-0.8l0.7-1.8
|
1384 |
+
l0.7-1.8l0.6-1.5l0.6-1.6l1.5-3.9l1.5-3.9l3-7.7l3-7.7l1.5-3.8l1.5-3.8l1-2.6l1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6
|
1385 |
+
l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.2-2.6l1.2-2.6l1.2-2.6l1.2-2.6l1.2-2.6l0.2-0.4v-0.2l0.1-0.5l0.1-0.5
|
1386 |
+
l0.1-0.5l0.1-0.5l0.2-0.6l0.3-0.8l0.4-0.8l0.4-0.8l0.4-0.7l0.4-0.7l0.4-0.6l0.4-0.6l0.3-0.4l0.1-0.3l0.3-0.8l0.3-0.8l0.3-0.8
|
1387 |
+
l0.3-0.8l0.4-1.3h-0.1l-1-0.1h-0.1l-0.8-0.2l-0.8-0.2l-0.8-0.3h-0.1l-0.9-0.4l-0.9-0.5l-0.8-0.5l0,0l-0.8-0.6l-0.7-0.7l-0.7-0.8
|
1388 |
+
l0,0l-0.5-0.7l-0.5-0.8l-0.4-0.8v-0.1l-0.4-1l-0.3-1.1v-0.1l-0.2-0.9l-0.1-0.9v-0.1l-0.1-0.7v-0.7v-0.1l0.1-1.1v-0.5l0.1-0.8
|
1389 |
+
l0.2-0.7l0.2-0.7l0.3-0.9l0.3-0.8l0.3-0.7l0.3-0.6l0.3-0.6l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.5-0.9l0.5-0.9l0.5-0.8l0.9-1.5
|
1390 |
+
l0.3-0.5l0.2-0.4l0.6-1.1l0.6-1.1l0.6-1l0.5-0.9l0.5-0.8l0.5-0.7l0.8-1.2l0.7-1.1l0.3-0.5l0.4-0.6l0.4-0.7l0.5-0.8l0.6-1l0.6-1.1
|
1391 |
+
l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l0.9-1.9l0.9-2l0.9-2l0.9-2l0.9-2l0.7-1.5l0.5-1.3l0.5-1.3l0.5-1.3
|
1392 |
+
l0.5-1.2l0.9-2.3l0.4-1.1l0.4-1l0.4-0.9l0.3-0.9l0.3-0.8l0.1-0.3l0.1-0.4v-0.1l0.5-1.1l0.6-1.1l0.7-1l0.8-0.9l0.9-0.9l0.9-0.8
|
1393 |
+
l1-0.7l1.1-0.6l1.1-0.4l1.2-0.3l1.2-0.2l1.2-0.1l1.2,0.1l1.2,0.2l1.2,0.3l1.1,0.4l0.6,0.3l0.7-1.4l1.4-2.7l1.4-2.7l1.3-2.7
|
1394 |
+
l1.3-2.7l1.3-2.7l0.6-1.3l0.7-1.4l0.3-0.7l0.4-0.7l0.4-0.6l0.5-0.8l0.4-0.5l0.7-0.8l0.8-0.7l0,0l0.7-0.6l0.2-0.1l0.5-1.1l0.6-1.2
|
1395 |
+
l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.6-1.1l0.6-1.1l1.2-1.9l0.5-0.9l0.4-0.8l0,0l0.1-0.1l0.1-0.3l0.2-0.4l0.2-0.5l0.3-0.6l0.3-0.7
|
1396 |
+
l0.4-0.7l0.3-0.5l0.3-0.4l0.3-0.5l0.4-0.5l0.5-0.6l0.6-0.7l0.4-0.4l0.8-0.8l0.1-0.1l0.9-0.7l0.4-0.3l0.8-0.5l0.5-0.2l0.6-0.3l0,0
|
1397 |
+
l0.8-2.2l1.1-2.8l0.5-1.4l0.5-1.4l0.5-1.4l0.6-1.4l0.6-1.4l0.6-1.4L-49.4,1288.3z"
|
1398 |
+
/>
|
1399 |
+
</g>
|
1400 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1401 |
+
<path
|
1402 |
+
fill="#836F40"
|
1403 |
+
d="M-235.9,1180.2l0.5-0.9l0.5-0.8l0.6-0.8l0.7-0.7l0.7-0.7l0.8-0.6l0.8-0.5l0.9-0.5l0.9-0.4l0.9-0.3l1-0.2
|
1404 |
+
l1-0.2l1-0.1h0.1h0.5h0.3h0.1l0,0l0.4-0.3l0.4-0.2l0.5-0.3l0.5-0.2l0.5-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.1
|
1405 |
+
l0.7-0.1l0.7-0.1h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.8,0.4l0.8,0.4l0.4,0.2l1.1-0.1l1.2-0.1
|
1406 |
+
l1.2-0.1l1.2-0.1l1.2-0.1l2.5-0.2l2.5-0.2l2.5-0.3l2.5-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l5.2-0.7
|
1407 |
+
l5.2-0.7l5.2-0.7l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.1l2-0.1l2-0.1
|
1408 |
+
l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l1.9-0.1l2-0.1l1.9-0.1l2-0.1h1.9h2h1.9h2l3.9-0.1h3.9h3.9h3.9h3.9h3.9h3.9h3.8
|
1409 |
+
h3.8l7.7,0.1l7.7,0.1l7.6,0.1h3.8h3.8h3.8h3.8h1l1,0.1l1,0.2l0.9,0.3l0.9,0.4l0.9,0.4l0.8,0.5l0.8,0.6l0.7,0.6l0.7,0.7l0.6,0.8
|
1410 |
+
l0.6,0.8l0.5,0.8l0.4,0.9l0.4-0.2l0.6-0.2l0.7-0.3l0.8-0.3l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.7-0.1
|
1411 |
+
l0.8-0.1l0.8-0.1h0.9h1l0.7,0.1l0.6,0.1l0.7,0.1l0.7,0.2l0.8,0.2l0.8,0.3l0.9,0.4l0.9,0.5l0.5,0.3l0.4,0.3l0.4,0.3l0.1,0.1
|
1412 |
+
l0.4,0.3l0.4,0.4l0.1,0.1l0.4,0.4l0.4,0.4l0.1,0.1l0.4,0.5l0.4,0.5l0.1,0.1l0.3,0.5l0.3,0.5v0.1l0.3,0.5l0.3,0.5v0.1l0.2,0.5
|
1413 |
+
l0.2,0.5l0.2,0.6l0.3,1.1l0.2,1.1l0.1,1v0.8v0.8v0.7l-0.1,0.7l-0.1,0.7l-0.1,0.8l-0.2,0.7l-0.2,0.7L14,1187l-0.3,0.7l-0.3,0.7
|
1414 |
+
l-0.3,0.7l-0.3,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.4
|
1415 |
+
l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
|
1416 |
+
l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.9,0.1l-1,0.1l-1,0.1h-1h-0.9
|
1417 |
+
h-0.9h-0.9h-0.9h-0.9h-0.9l-0.9-0.1l-0.9-0.1l-0.9,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.2l-1,0.2l-0.9,0.2
|
1418 |
+
l-0.9,0.2l-1.7,0.4l-1.6,0.3l-1.4,0.3l-1.1,0.2l-1.1,0.2l-0.7,0.1l-0.8,0.1l-0.6,0.1h-0.6h-0.6h-0.6l-1.3,0.1l-1.5,0.1l-1.6,0.1
|
1419 |
+
h-1.6H-45h-1.6h-1.5h-2.7h-0.3l-1.1,0.2l-1.4,0.3l-1.4,0.2l-1.4,0.2l-1.4,0.2l-0.9,0.1l-0.1,0.1h-0.1l-0.7,0.3l-0.7,0.3l-0.4,0.2
|
1420 |
+
l-0.8,0.3l-0.7,0.2l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.9h-0.6h-0.6h-0.6h-0.6h-1h-1h-0.9h-0.8h-0.7h-0.3
|
1421 |
+
h-0.3h-1l-1,0.1l-1,0.1l-1,0.1l-2.2,0.2l-2.2,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-1.9,0.2l-1.9,0.2l-1,0.1l-1,0.1l-1,0.1
|
1422 |
+
l-1.1,0.1l-1.1,0.1h-1.1h-1.1h-1.2h-0.8h-0.5l-0.8-0.1l-0.8-0.2l-0.8-0.2l0,0l-0.6-0.2h-1.1h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1
|
1423 |
+
l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.2l-0.7-0.1l-0.8-0.1l-0.9-0.1l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2
|
1424 |
+
l-0.9-0.2l-0.9-0.2l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.7-0.3l-0.7-0.3
|
1425 |
+
l-0.7-0.3l-0.7-0.3l-0.6-0.3l-0.9,0.1l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1
|
1426 |
+
l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.3
|
1427 |
+
l-1.5-0.1l-0.7-0.1l-0.8-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
|
1428 |
+
l-0.4-0.2l-0.5-0.2l-0.2-0.1h-0.7l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.2l-1.3-0.2l-1.4-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2
|
1429 |
+
l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.4l-1.2-0.4l-1.2-0.4l-1.2-0.4l-0.4-0.1h-0.1l-1.3,0.1
|
1430 |
+
l-1.3,0.1h-1.3h-1.3h-1.3h-1.3h-1.3h-1.3h-0.4h-1l-1-0.1l-1-0.2l-0.9-0.3l-0.9-0.4l-0.9-0.4l-0.9-0.5l-0.8-0.6l-0.8-0.7l-0.7-0.7
|
1431 |
+
l-0.6-0.8l-0.6-0.8l-0.5-0.9l-0.4-0.9l-0.3-0.9l-0.3-1l-0.2-1l-0.1-1v-1l0.1-1l0.1-1l0.2-1l0.3-0.9L-235.9,1180.2z"
|
1432 |
+
/>
|
1433 |
+
</g>
|
1434 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1435 |
+
<path
|
1436 |
+
d="M-214.1,1345.5L-214.1,1345.5l0.2-0.3l0.1-0.1l0.2-0.3l0.3-0.4l0.2-0.2l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3
|
1437 |
+
l0.3-0.3l0.3-0.3l0.3-0.3l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
|
1438 |
+
l0.5-0.3l0.5-0.3l0.5-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l1.3-1.1l1.4-1.1l2.8-2.3l1.4-1.2l1.4-1.2l1.4-1.2l0.7-0.6
|
1439 |
+
l0.7-0.6l0.7-0.6l0.7-0.6l0.8-0.6l0.7-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5
|
1440 |
+
l0.8-0.5l0.8-0.4l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.6l0.9-0.6l0.9-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
|
1441 |
+
l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l1.5-1.4l1.5-1.4
|
1442 |
+
l1.5-1.4l1.5-1.4l1.5-1.4l3-2.9l3-2.9l1.5-1.5l1.5-1.5l1.5-1.4l1.6-1.4l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7
|
1443 |
+
l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.3-0.2l0.4-0.3l0.9-0.7l2.4-1.8l1.4-1.1l1.5-1.1l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
|
1444 |
+
l0.8-0.6l0.8-0.6l0.7-0.6l0.7-0.6l0.7-0.6l0.6-0.6l0.6-0.5l0.5-0.5l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2
|
1445 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1h0.4h0.4l0.4,0.1
|
1446 |
+
l0.4,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.4l0.1,0.4v0.4v0.2v0.3v0.3l-0.1,0.3l-0.1,0.4l-0.2,0.4
|
1447 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.6,0.6
|
1448 |
+
l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-1.5,1.2l-1.4,1.1
|
1449 |
+
l-2.4,1.8l-0.9,0.7l-0.3,0.3l-0.3,0.2l-0.8,0.6l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
|
1450 |
+
l-0.8,0.7l-0.8,0.7l-0.8,0.7l-1.5,1.4l-1.5,1.4l-1.5,1.4l-1.5,1.4l-3,2.9l-3,2.9l-1.5,1.5l-1.5,1.5l-1.5,1.4l-1.5,1.4l-1.6,1.4
|
1451 |
+
l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
|
1452 |
+
l-0.9,0.7l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.5
|
1453 |
+
l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5
|
1454 |
+
l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.7,0.6l-1.4,1.2l-1.4,1.2l-1.4,1.2l-2.8,2.3l-1.4,1.1l-1.4,1.1l-0.4,0.4l-0.5,0.4
|
1455 |
+
l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
|
1456 |
+
l-0.4,0.2l0,0l0,0l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.2,0.3l-0.1,0.1l0,0l-0.2,0.3
|
1457 |
+
l-0.3,0.3l0,0l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.4h-0.4l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.3
|
1458 |
+
l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4v-0.4v-0.4l0.1-0.3l0.1-0.3L-214.1,1345.5z M-112,1262.3L-112,1262.3L-112,1262.3
|
1459 |
+
L-112,1262.3L-112,1262.3z M-209,1348.5L-209,1348.5L-209,1348.5L-209,1348.5L-209,1348.5z"
|
1460 |
+
/>
|
1461 |
+
</g>
|
1462 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1463 |
+
<path
|
1464 |
+
d="M-199.4,1433l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.4l0.3-0.4l0.7-0.8l0.7-0.8l0.8-0.8
|
1465 |
+
l0.8-0.8l0.8-0.8l1.5-1.5l2.3-2.3l1-1l1-1l1-1l1-1l1-1l1-1l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l1-1l1-1
|
1466 |
+
l1-1l1-1l1-1l1-1l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.8-1.6l1.8-1.6l1.8-1.6
|
1467 |
+
l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l3.6-3.2l3.6-3.2l3.6-3.2l3.6-3.2l3.6-3.2l7.2-6.3l7.2-6.3l3.6-3.2l3.6-3.2l3.6-3.2
|
1468 |
+
l3.6-3.2l3.5-3.2l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l1.7-1.6l1.8-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6
|
1469 |
+
l1.7-1.6l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l0.9-0.9l0.9-0.9l0.9-0.9l0.9-0.9l1-0.9l1-0.9l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8
|
1470 |
+
l2-1.6l2-1.6l1.9-1.6l1.9-1.6l1-0.8l1-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.8-0.8
|
1471 |
+
l0.4-0.4l0.5-0.5l1.3-1.4l0.7-0.8l0.8-0.8l0.8-0.9l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4
|
1472 |
+
l0.4-0.3l0.4-0.3l0.4-0.3l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.2h0.3h0.1h0.5
|
1473 |
+
l0.5,0.1l0.5,0.2l0.4,0.3l0.4,0.3l0.3,0.4l0.2,0.5l0.2,0.5l0.1,0.5v0.5l-0.1,0.5l-0.2,0.5l-0.3,0.4l-0.3,0.4l-0.4,0.3l-0.5,0.2
|
1474 |
+
l-0.5,0.2h-0.3l0,0h-0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4
|
1475 |
+
l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.8l-0.8,0.8l-0.7,0.8l-1.3,1.4l-0.5,0.6l-0.5,0.5l-0.9,0.9l-0.9,0.9
|
1476 |
+
l-0.9,0.9l-0.9,0.9l-0.9,0.9l-0.9,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1.9,1.6l-2,1.6l-1.9,1.6l-1.9,1.6l-1,0.8
|
1477 |
+
l-1,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.9l-0.9,0.9l-1.7,1.7l-1.7,1.7l-1.7,1.7
|
1478 |
+
l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6
|
1479 |
+
l-1.8,1.6l-1.8,1.6l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2l-7.2,6.3l-7.2,6.3l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2
|
1480 |
+
l-3.5,3.2l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6
|
1481 |
+
l-1.7,1.6l-1.7,1.6l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1,1l-1,1l-1,1l-1,1l-1,1l-1,1l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-2,1.9
|
1482 |
+
l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-1,1l-1,1l-1,1l-1,1l-1,1l-1,1l-2.3,2.3l-1.5,1.5l-0.8,0.8l-0.8,0.8l-0.7,0.8l-0.7,0.7
|
1483 |
+
l-0.6,0.7l-0.3,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.1l0,0l-0.2,0.4l-0.3,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.2l-0.5,0.1
|
1484 |
+
l-0.5,0.1h-0.5l-0.5-0.1l-0.5-0.2l-0.4-0.3l-0.4-0.4l-0.3-0.4l-0.2-0.5l-0.1-0.5v-0.5v-0.5v-0.1l0.1-0.4v-0.1l0.1-0.3l0.1-0.2
|
1485 |
+
L-199.4,1433z M-1.4,1257.3L-1.4,1257.3L-1.4,1257.3L-1.4,1257.3L-1.4,1257.3z M-194.1,1435.5L-194.1,1435.5l0.1-0.3v-0.1
|
1486 |
+
L-194.1,1435.5z"
|
1487 |
+
/>
|
1488 |
+
</g>
|
1489 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1490 |
+
<path
|
1491 |
+
d="M-186.5,1518.6l0.2-0.4l0.2-0.5l0.3-0.5l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.7l0.4-0.6l0.4-0.6l0.2-0.3l0.2-0.3
|
1492 |
+
l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.3-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.4
|
1493 |
+
l0.2-0.4l0.4-0.8l0.4-0.8l0.4-0.8l0.4-0.8l0.4-0.8l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
|
1494 |
+
l0.3-0.4l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l1.7-2.2l1.7-2.3l1.7-2.3l1.7-2.3
|
1495 |
+
l1.7-2.3l1.7-2.3l1.7-2.3l3.3-4.6l3.3-4.6l0.9-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3
|
1496 |
+
l1-1.3l2-2.5l2-2.5l2-2.5l2.1-2.5l2.1-2.5l2.1-2.5l2.1-2.5l2.1-2.4l2.1-2.4l2.1-2.4l2.1-2.4l2.1-2.4l2.2-2.4l2.2-2.4l2.2-2.4
|
1497 |
+
l2.2-2.4l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l0.3-0.3l0.3-0.3l0.6-0.7l0.7-0.7l0.7-0.8
|
1498 |
+
l0.7-0.8l0.7-0.8l0.7-0.9l0.7-0.9l1.5-1.8l1.6-1.9l1.6-1.9l0.8-1l0.8-1l0.8-1l0.8-1l0.8-0.9l0.8-0.9l0.8-0.9l0.4-0.4l0.4-0.4
|
1499 |
+
l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
|
1500 |
+
l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.5h0.5l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.3l0.3,0.3l0.2,0.4l0.2,0.4
|
1501 |
+
l0.1,0.4v0.5v0.5l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
|
1502 |
+
l-0.3,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
|
1503 |
+
l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,1l-1.6,1.9l-1.6,1.9l-1.5,1.9l-0.8,0.9
|
1504 |
+
l-0.7,0.9l-0.7,0.9l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.7l-0.3,0.4l-0.3,0.3l-2.2,2.2l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3
|
1505 |
+
l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.4l-2.2,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4
|
1506 |
+
l-2.1,2.4l-2.1,2.4l-2,2.5l-2,2.5l-2,2.5l-2,2.5l-2,2.5l-1,1.2l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3
|
1507 |
+
l-0.9,1.3l-0.9,1.3l-0.9,1.3l-0.9,1.3l-3.3,4.6l-3.3,4.6l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3
|
1508 |
+
l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
1509 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.2,0.4
|
1510 |
+
l-0.2,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.1,0.1l-0.1,0.1
|
1511 |
+
l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.4,0.5l-0.4,0.5l-0.4,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.1,0.2l-0.1,0.2l-0.2,0.4
|
1512 |
+
l-0.2,0.4l-0.1,0.2l-0.2,0.2l-0.1,0.1l-0.2,0.2l-0.2,0.2l0,0l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4l0,0h-0.5l-0.5-0.1
|
1513 |
+
l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.3-0.4l-0.2-0.4l-0.2-0.4l0,0l-0.1-0.4v-0.4v-0.4l0.1-0.4l0,0l0.1-0.4l0.1-0.1L-186.5,1518.6z"
|
1514 |
+
/>
|
1515 |
+
</g>
|
1516 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1517 |
+
<path
|
1518 |
+
d="M-226.1,1292.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.9-0.6l0.9-0.6l1-0.7l1.1-0.7
|
1519 |
+
l1.1-0.8l1.2-0.8l1.2-0.9l1.3-0.9l2.7-1.9l2.8-2l2.9-2.1l1.5-1.1l1.5-1.1l1.5-1.1l1.5-1.1l1.6-1.1l1.6-1.1l1.6-1.1l1.6-1l1.6-1
|
1520 |
+
l1.6-1l1.5-1l1.5-1l0.8-0.5l0.8-0.5l0.8-0.4l0.8-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.3l0.2-0.1
|
1521 |
+
l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.1,0.2l0.1,0.2
|
1522 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
|
1523 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.7,0.3l-0.7,0.3l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4
|
1524 |
+
l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-1.5,0.9l-1.5,1l-1.5,1l-1.5,1l-1.5,1l-1.5,1l-1.5,1.1l-1.5,1.1l-1.5,1.1l-1.5,1.1
|
1525 |
+
l-1.5,1.1l-1.5,1.1l-2.9,2.1l-2.8,2l-2.7,1.9l-1.3,0.9l-1.2,0.9l-1.2,0.8l-1.1,0.8l-1.1,0.7l-1,0.7l-1,0.6l-0.9,0.6l-0.2,0.1
|
1526 |
+
l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
|
1527 |
+
l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2
|
1528 |
+
L-226.1,1292.2z"
|
1529 |
+
/>
|
1530 |
+
</g>
|
1531 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1532 |
+
<path
|
1533 |
+
d="M-223.1,1301.8l0.2-0.4l0.3-0.3l0.3-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1
|
1534 |
+
l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l1,0.5l1,0.6l1,0.6
|
1535 |
+
l1,0.6l1,0.6l1,0.6l1,0.6l1,0.6l1,0.7l1,0.7l1,0.7l1,0.7l2,1.3l1.9,1.3l1.8,1.2l1.7,1.1l0.8,0.5l0.8,0.5l0.8,0.5l0.7,0.4l1.9,1.1
|
1536 |
+
l1.9,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1
|
1537 |
+
l1.7,1.2l1.7,1.2l1.7,1.2l1.7,1.2l1.7,1.2l1.6,1.2l1.7,1.2l1.6,1.2l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.4l1.7,1.4
|
1538 |
+
l1.7,1.4l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.7,0.5l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4
|
1539 |
+
l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l2.8,1.6l2.8,1.5l2.8,1.6l1.4,0.8
|
1540 |
+
l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.8,0.5l0.7,0.5l0.7,0.5
|
1541 |
+
l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l1.3,1l1.2,1l1.2,1l1.2,1l1.2,0.9l0.6,0.5l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4
|
1542 |
+
l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4v0.4
|
1543 |
+
l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.3,0.4l-0.3,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4h-0.4l-0.4-0.1l-0.4-0.2l-0.8-0.4
|
1544 |
+
l-0.8-0.4l-0.8-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-1.2-1
|
1545 |
+
l-1.2-1l-1.2-1l-1.2-1l-1.2-1l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.4l-0.6-0.4
|
1546 |
+
l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.7-0.4l-1.3-0.8l-1.3-0.8l-1.3-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-2.8-1.5l-2.8-1.6
|
1547 |
+
l-2.9-1.6l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.9l-1.4-0.9l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.5
|
1548 |
+
l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5
|
1549 |
+
l-1.7-1.4l-1.7-1.4l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2
|
1550 |
+
l-1.6-1.2l-1.6-1.1l-1.6-1.1l-1.6-1.1l-1.6-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1
|
1551 |
+
l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.9-1.1l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.9-0.6l-1.8-1.2l-1.8-1.2l-1.9-1.3l-2-1.3
|
1552 |
+
l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.5l-0.9-0.5l-0.9-0.5l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
|
1553 |
+
l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
|
1554 |
+
l-0.4-0.2l-0.4-0.3l-0.3-0.3l-0.3-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4l0.1-0.4L-223.1,1301.8z"
|
1555 |
+
/>
|
1556 |
+
</g>
|
1557 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1558 |
+
<path
|
1559 |
+
d="M-183.5,1261.5l0.2-0.3l0.3-0.3l0.3-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.1l0.2-0.1l0.3-0.1l0.4-0.1l0.3-0.1h0.2
|
1560 |
+
h0.3h0.1h0.3h0.1l0.4,0.1h0.1l0.2,0.1l0.2,0.1h0.1l0.3,0.1l0.5,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.6,0.4
|
1561 |
+
l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.5,0.4l1.3,1.1l1.3,1.1l1.3,1.1l1.3,1.1l2.6,2.3l2.6,2.2l1.3,1.1
|
1562 |
+
l1.3,1.1l1.3,1.1l1.3,1.1l1.3,1.1l0.6,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.7
|
1563 |
+
l2.2,1.7l4.3,3.3l4.3,3.3l4.3,3.3l4.3,3.4l4.3,3.3l4.3,3.3l4.3,3.3l2.2,1.7l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6
|
1564 |
+
l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l0.3,0.2l0.4,0.3l0.7,0.6l0.8,0.6l0.8,0.6l0.8,0.7l0.8,0.7l1.7,1.5l1.8,1.5l0.9,0.8
|
1565 |
+
l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3
|
1566 |
+
l0.5,0.3l0.5,0.3l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.2
|
1567 |
+
h0.2h0.2h0.2h0.1h0.1h0.1h0.2h0.4l0.4,0.1l0.4,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.1,0.4l0.1,0.4v0.4v0.4l-0.1,0.4
|
1568 |
+
l-0.2,0.4l-0.2,0.4l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1H-50h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3H-52h-0.3l-0.5-0.1
|
1569 |
+
l-0.6-0.1l-0.6-0.1l-0.5-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
|
1570 |
+
l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-1.1-0.8l-1-0.8
|
1571 |
+
l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1.8-1.6l-1.7-1.5l-0.8-0.7l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.5l-0.3-0.2l-0.3-0.2
|
1572 |
+
l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.7l-2.2-1.7l-4.3-3.3
|
1573 |
+
l-4.3-3.3l-4.3-3.3l-4.3-3.4l-4.3-3.3l-4.3-3.3l-4.3-3.3l-2.1-1.6l-2.2-1.6l-2.1-1.6l-2.1-1.6l-2.2-1.6l-2.2-1.6l-0.7-0.5
|
1574 |
+
l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-1.3-1.1l-1.3-1.1l-1.3-1.1l-1.3-1.1l-1.3-1.1l-2.6-2.2l-2.6-2.2l-1.3-1.1
|
1575 |
+
l-1.3-1.1l-1.3-1.1l-1.3-1.1l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.6-0.4l-0.6-0.3l-0.6-0.3l-0.6-0.3
|
1576 |
+
l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.4-0.2l-0.2,0.1l-0.3,0.1l0,0h-0.2h-0.2l0,0h-0.3h-0.3l0,0l-0.4-0.1l-0.4-0.1l-0.3-0.2l0,0
|
1577 |
+
l-0.3-0.2l-0.3-0.2l-0.2-0.3l-0.2-0.3l0,0l-0.2-0.4l-0.1-0.4l-0.1-0.4l0,0v-0.4v-0.4l0,0v-0.2v-0.2l0,0l0.1-0.4L-183.5,1261.5z
|
1578 |
+
M-178.1,1263.7v-0.2v-0.2V1263.7z M-178,1263.2v-0.2v-0.1V1263.2z"
|
1579 |
+
/>
|
1580 |
+
</g>
|
1581 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1582 |
+
<path
|
1583 |
+
d="M-82.3,1264.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1
|
1584 |
+
l0.3-0.1h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.3,0.3l0.3,0.3l0.3,0.3
|
1585 |
+
l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.5l0.3,0.5l0.3,0.5l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1
|
1586 |
+
l0.1,0.1l0,0l0,0l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.6l0.7,0.6l0.7,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6
|
1587 |
+
l0.6,0.6l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l2.4,2.4l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.4l0.5,0.4
|
1588 |
+
l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l1.2,0.8l1.2,0.8l1.2,0.8l1.2,0.8l1.2,0.8
|
1589 |
+
l1.2,0.8l2.3,1.5l0.3,0.2l0.4,0.2l0.9,0.6l0.5,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.6,0.4l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2
|
1590 |
+
l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.2l0.1,0.3v0.1v0.1v0.1v0.1v0.2v0.2v0.1v0.3v0.3v0.3
|
1591 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3
|
1592 |
+
h-0.3H-30h-0.3l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1
|
1593 |
+
l0,0l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-1-0.6l-0.4-0.3
|
1594 |
+
l-0.4-0.2l-2.3-1.5l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.9l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.5l-0.6-0.5
|
1595 |
+
l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-2.4-2.4l-1.2-1.2
|
1596 |
+
l-1.2-1.2l-1.2-1.2l-1.2-1.2l-1.2-1.1l-1.2-1.1l-1.2-1.1l-0.6-0.5l-0.6-0.6l-0.6-0.6l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5
|
1597 |
+
l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.7-0.5l-0.2-0.1l-0.2-0.2l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3
|
1598 |
+
l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.3-0.5l-0.3-0.5l-0.3-0.4l-0.1-0.2l-0.1-0.2l0,0h-0.1H-80h-0.3l-0.3-0.1
|
1599 |
+
l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3
|
1600 |
+
v-0.3l0.1-0.3l0.1-0.2L-82.3,1264.1z M-33,1307.9L-33,1307.9L-33,1307.9L-33,1307.9z"
|
1601 |
+
/>
|
1602 |
+
</g>
|
1603 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1604 |
+
<path
|
1605 |
+
d="M-214.8,1340L-214.8,1340l0.2-0.3l0.1-0.2l0,0l0.2-0.2l0,0l0.3-0.3l0,0l0.3-0.2l0,0l0.3-0.2l0,0l0.3-0.1l0,0
|
1606 |
+
l0.2-0.1h0.2h0.1h0.3h0.3h0.1h0.2h0.2h0.1l0.3,0.1h0.1l0.2,0.1l0.2,0.1l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
|
1607 |
+
l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.5l0.9,0.9l0.9,1l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.4l0.4,0.4l0.4,0.4l0.4,0.4
|
1608 |
+
l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l1.1,0.6
|
1609 |
+
l1.1,0.6l1.1,0.6l1,0.6l1,0.6l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1.9,1.5l1.9,1.5
|
1610 |
+
l1.9,1.5l1.9,1.5l1.9,1.5l1.8,1.4l3.7,2.9l3.7,2.9l3.7,2.9l3.7,2.9l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.6,3l3.6,3l3.6,3
|
1611 |
+
l3.6,3.1l3.6,3.1l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.6,0.4l0.6,0.4l0.6,0.4l0.7,0.4l0.7,0.5l0.7,0.5l1.5,1l1.5,1l1.6,1l0.8,0.5
|
1612 |
+
l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.6l0.8,0.6l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3
|
1613 |
+
l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.4l0.1,0.4
|
1614 |
+
l0.1,0.4v0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4H-91l-0.4-0.1
|
1615 |
+
l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
|
1616 |
+
l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.2l-0.3-0.3l-0.3-0.2
|
1617 |
+
l-0.3-0.3l-0.3-0.2l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-1.5-1l-1.5-1l-1.5-1l-0.7-0.5l-0.7-0.5
|
1618 |
+
l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-3.6-3.1l-3.6-3l-3.6-3l-3.6-3l-3.6-3l-3.6-3l-3.6-3
|
1619 |
+
l-3.7-3l-3.7-3l-3.7-3l-3.7-3l-3.7-2.9l-3.7-2.9l-3.7-2.9l-3.7-2.9l-3.7-2.9l-1.8-1.4l-1.9-1.5l-1.9-1.5l-1.9-1.5l-1.9-1.5
|
1620 |
+
l-1.9-1.5l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6
|
1621 |
+
l-1-0.6l-1-0.5l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
|
1622 |
+
l-0.3-0.2l-0.3-0.2l-0.5-0.4l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.9-1l-0.9-0.9l-0.4-0.4l-0.4-0.4l-0.4-0.4
|
1623 |
+
l-0.3-0.3h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.3v-0.3
|
1624 |
+
l0.1-0.3v-0.1l0.1-0.4v-0.1l0.1-0.2L-214.8,1340z"
|
1625 |
+
/>
|
1626 |
+
</g>
|
1627 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1628 |
+
<path
|
1629 |
+
d="M-204.5,1408.5l0.2-0.3l0.2-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1h0.4h0.4h0.4l0.3,0.1l0.3,0.1
|
1630 |
+
l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
|
1631 |
+
l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.8,0.8l0.9,0.8l0.9,0.8l0.9,0.8
|
1632 |
+
l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1.1,0.8l2.1,1.6l2.1,1.6l2.1,1.6l1,0.8l1,0.8l1,0.8l0.9,0.8l0.9,0.8l0.9,0.7l3.8,3.3l3.9,3.3
|
1633 |
+
l1.9,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.6l2,1.6l2,1.6l2,1.6l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8
|
1634 |
+
l1,0.8l1,0.8l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.6
|
1635 |
+
l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.1,0.3
|
1636 |
+
l0.1,0.3l0.1,0.4v0.4v0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.4,0.1
|
1637 |
+
h-0.4h-0.4l-0.4-0.1l-0.3-0.1l-0.3-0.1l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.7l-1.1-0.7
|
1638 |
+
l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.8
|
1639 |
+
l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1-0.8l-1-0.8l-1-0.8l-2.1-1.6l-2.1-1.6
|
1640 |
+
l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-3.9-3.3l-3.8-3.3l-0.8-0.7l-0.9-0.7l-0.9-0.7l-0.9-0.8l-1-0.8
|
1641 |
+
l-1-0.8l-2.1-1.6l-2.1-1.6l-2.1-1.6l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-0.9-0.8l-0.9-0.8l-0.4-0.4
|
1642 |
+
l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4
|
1643 |
+
l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.3l-0.1-0.3v-0.4v-0.4v-0.4l0.1-0.3l0.1-0.3L-204.5,1408.5z"
|
1644 |
+
/>
|
1645 |
+
</g>
|
1646 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1647 |
+
<path
|
1648 |
+
d="M-196.1,1467.1l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0,0l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3
|
1649 |
+
h0.3h0.3l0,0l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.1l0.2,0.2l0.3,0.4l0.4,0.4l0.4,0.5
|
1650 |
+
l0.5,0.5l1,1.1l0.9,1l0.7,0.7l0.2,0.2l0.1,0.1l0.4,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.9,0.7l0.9,0.7
|
1651 |
+
l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l2,1.4l2.1,1.4l0.9,0.6l0.9,0.6l0.9,0.6l0.9,0.6l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5
|
1652 |
+
l0.9,0.5l0.9,0.5l0.9,0.5l1.8,1l1.8,1l1.9,1l1.9,1l1.9,1l1.9,1l1.9,1l1.9,1l0.9,0.5l0.9,0.5l0.9,0.5l1,0.5l0.5,0.3l0.6,0.3
|
1653 |
+
l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l1.2,0.8l1.2,0.9l1.2,0.9l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4
|
1654 |
+
l0.6,0.3l0.6,0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
1655 |
+
l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3
|
1656 |
+
l0.1,0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1
|
1657 |
+
l-0.3,0.1h-0.3h-0.3h-0.3h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
|
1658 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4
|
1659 |
+
l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.6-0.4l-1.3-0.9l-1.2-0.9l-1.2-0.8l-0.5-0.4l-0.5-0.4l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3
|
1660 |
+
l-0.9-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.5l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-0.9-0.5l-0.9-0.5l-0.9-0.5
|
1661 |
+
l-0.9-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-2.1-1.4l-2-1.4l-1-0.7l-1-0.7l-1-0.7
|
1662 |
+
l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.8l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.2-0.2
|
1663 |
+
l-0.3-0.3l-0.8-0.8l-0.9-1l-1-1.1l-0.5-0.6l-0.5-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.4l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.3v-0.1
|
1664 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.3v-0.3v-0.3v-0.3l0,0l0.1-0.3l0.1-0.3L-196.1,1467.1z"
|
1665 |
+
/>
|
1666 |
+
</g>
|
1667 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1668 |
+
<path
|
1669 |
+
fill="#DACEB3"
|
1670 |
+
d="M-197.1,1289.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2
|
1671 |
+
l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.2l0.2-0.1l0.3-0.1h0.1l0.1-0.1h0.1h0.1h0.2h0.2h0.1h0.3h0.1h0.2h0.2h0.1h0.3h0.1h0.3h0.1
|
1672 |
+
l0.3,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0,0l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
|
1673 |
+
l0.2-0.1l0,0l0.2-0.1l0.2-0.1l0,0h0.2h0.2l0,0h0.2h0.2l0,0h0.2h0.2l0,0h0.2h0.2l0,0l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0.1,0.1
|
1674 |
+
l0.2,0.2l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.3,0.5l0.3,0.6l0.3,0.6l0.4,0.6l0.4,0.7
|
1675 |
+
l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.2,0.3l0.2,0.1l0.3,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3
|
1676 |
+
l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.2l0.2,0.4l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.4l0.1,0.3v0.2l0.1,0.8
|
1677 |
+
l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,1.5l0.1,1.5l0.1,1.5l0.1,1.5l0.1,1.6v1.6v1.6v1.6v1.6v1.6v1.6v0.7l0,0l0.2,0.2
|
1678 |
+
l0.2,0.2l0,0l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2v0.1v0.2v0.2v0.2l0.1,0.6v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5
|
1679 |
+
v0.5v0.5v0.1v0.2v0.5v0.5v0.5v0.5v0.5v0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.8
|
1680 |
+
l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.1,0.3l-0.2,0.7l-0.1,2l-0.1,3l-0.1,3v0.4v0.5v1.1v1.3v1.5v0.8v0.8v0.8v0.9v0.9v0.9l-0.1,0.9
|
1681 |
+
l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
|
1682 |
+
l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.3l-0.3,0.3
|
1683 |
+
l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3
|
1684 |
+
h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1h-0.1l-0.2,0.1l0,0l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l0,0
|
1685 |
+
l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2
|
1686 |
+
v-0.3v-0.2l-0.1-0.4v-0.5v-0.6v-0.7v-0.8l-0.1-1.7l0,0v-0.1l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.8l-0.3-0.8l-0.3-0.9l-0.3-0.9
|
1687 |
+
l-0.3-0.9l-0.3-0.9l-0.6-1.8l-0.6-1.8l-0.5-1.7l-0.5-1.6l-0.8-2.5v-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
|
1688 |
+
v-0.2l-0.1-0.3l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8l-0.1-0.8
|
1689 |
+
l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.6l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3
|
1690 |
+
l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.2-0.5l-0.2-0.5l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
|
1691 |
+
l-0.1-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.5v-0.1v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6
|
1692 |
+
v-0.6v-0.6v-0.6l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.4-2.3l0.4-2.3
|
1693 |
+
l0.1-0.5l0.1-0.5l0.2-1.3l0.1-0.7l0.1-0.7l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4L-197.1,1289.5l0-0.4l0.2-0.4
|
1694 |
+
L-197.1,1289.5z M-184.6,1294.6L-184.6,1294.6v-0.2l-0.1-0.3L-184.6,1294.6z"
|
1695 |
+
/>
|
1696 |
+
</g>
|
1697 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1698 |
+
<path
|
1699 |
+
fill="#DACEB3"
|
1700 |
+
d="M-182,1397.3L-182,1397.3L-182,1397.3l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0v-0.3
|
1701 |
+
v-0.1v-0.1v-0.1l0,0v-0.2v-0.2v-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
1702 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.1l0.1,0.1l0.1,0.1
|
1703 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1
|
1704 |
+
v0.1v0.1v0.2v0.4v0.4v0.5l0.1,1.3v0.7h0.1h0.1h0.1h0.1l0,0h0.1h0.1h0.1h0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1
|
1705 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1v0.1v0.1v0.1v0.1
|
1706 |
+
v0.1v0.1v0.1v0.1v0.2v0.2v0.1v0.1v0.3v0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.6l-0.2,0.6l-0.1,0.3v0.1v0.5v0.5v0.6v0.6
|
1707 |
+
v0.6v0.6v0.6v0.6v0.6v0.6v0.6v0.6v0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.3l-0.1,0.3l-0.1,0.3
|
1708 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.1
|
1709 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0h-0.1h-0.1h-0.1l0,0h-0.1h-0.1
|
1710 |
+
h-0.1h-0.1l0,0h-0.1h-0.1h-0.1h-0.1l0,0h-0.2h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0h-0.1h-0.1h-0.1h-0.1l-0.1-0.1
|
1711 |
+
l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0
|
1712 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.4v-0.2l0,0l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4
|
1713 |
+
l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4l0.1-0.8l0.1-0.8l0.1-0.9l0.1-0.6
|
1714 |
+
v-0.1v-0.5v-0.6v-0.6v-0.4v-0.6v-0.8v-0.8v-0.8v-0.8v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3v-0.1
|
1715 |
+
v-0.1v-0.1l0.1-0.1L-182,1397.3z"
|
1716 |
+
/>
|
1717 |
+
</g>
|
1718 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1719 |
+
<path
|
1720 |
+
fill="#DACEB3"
|
1721 |
+
d="M-240.6,1222l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
1722 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.3-0.1l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.2-0.1l0,0l0.1-0.1l0.1-0.1
|
1723 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.4-0.1
|
1724 |
+
h0.4h0.3h0.3h0.3h0.3h0.3h0.3l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.1l0.8,0.2h0.2h0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1
|
1725 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2h0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3
|
1726 |
+
l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l1.5,0.7l1.5,0.7l1.5,0.7l1.5,0.7l1.4,0.7l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
|
1727 |
+
l0.7,0.3l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.3,0.1l0.4,0.1l0.3,0.1h0.2h0.2h0.4h0.5h0.5h0.5h0.5l0.5,0.1l1,0.1
|
1728 |
+
l0.5,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0,0
|
1729 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.2,0.2
|
1730 |
+
l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.1h-0.2h-0.2h-0.1h-0.1h-0.1h-0.2l0,0l0.1,0.2l0.1,0.2v0.2
|
1731 |
+
l0,0v0.2v0.2l0,0v0.2v0.2l0,0v0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0
|
1732 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3l-0.5,0.1h-0.5
|
1733 |
+
h-0.5h-0.5h-0.5h-0.5h-0.6h-0.6h-0.6h-0.6h-0.6l-1.1-0.1l-1.1-0.1l-1-0.1l-0.9-0.1l-0.8-0.1l-0.6-0.1l-0.3-0.1l-0.3-0.1l-0.7-0.2
|
1734 |
+
l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3
|
1735 |
+
l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.6-0.3l-0.7-0.1l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-2.5-0.4l-2.5-0.4
|
1736 |
+
l-2.5-0.4l-2.5-0.5h-0.1h-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
|
1737 |
+
l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
|
1738 |
+
l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.2v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2v-0.2v-0.1v-0.2
|
1739 |
+
v-0.2v-0.1v-0.2l0.1-0.2v-0.1l0.1-0.2l0.1-0.2L-240.6,1222z"
|
1740 |
+
/>
|
1741 |
+
</g>
|
1742 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1743 |
+
<path
|
1744 |
+
d="M-236.9,1244.6l0.5-0.8l0.6-0.7l0.7-0.6l0.8-0.4l0.9-0.3l0.9-0.2h0.9l0.9,0.1l0.9,0.3l0.8,0.4l0.8,0.5
|
1745 |
+
l0.7,0.6l0.1,0.1l0.5,0.6l0.1,0.1l0.4,0.6v0.1l0.3,0.7v0.1l0.2,0.8v0.1l0.1,0.6v0.1v0.7v0.1v0.5v0.3l-0.1,0.5l-0.1,0.5l-0.1,0.4
|
1746 |
+
l-0.1,0.4l-0.2,0.5l-0.2,0.5l-0.1,0.2v0.1v0.4v0.4v0.3l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.3,1.6l0.3,1.6
|
1747 |
+
l0.3,1.6l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.6,2.9l0.6,2.9l0.6,2.9l1.2,5.9l0.6,3l0.6,3l0.6,3l0.3,1.5l0.3,1.5
|
1748 |
+
l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.2,1.5l0.2,1.6l0.2,1.6l0.3,2.4l0.1,0.8l0.1,0.9l0.1,0.8l0.3,1.7l0.3,1.7l0.3,1.7l0.3,1.7
|
1749 |
+
l0.3,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.8,3.5l0.8,3.5l0.8,3.5l0.8,3.5l0.4,1.8l0.4,1.8l0.4,1.8l0.4,1.8l0.4,1.8
|
1750 |
+
l0.4,1.8l0.3,1.8l0.3,1.8l0.3,1.8l0.3,1.8l0.1,0.9l0.1,0.9l0.1,0.9l0.1,0.9l0.5,3.8l0.5,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8
|
1751 |
+
l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l1.3,7.5l1.3,7.5l1.3,7.5l1.3,7.5l2.6,15l1.3,7.5l1.3,7.5l1.3,7.5l1.3,7.5
|
1752 |
+
l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.7,5.2l0.7,5.2l0.7,5.1l0.7,5.1l0.7,5.1l0.4,2.5l0.4,2.5
|
1753 |
+
l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.5,2.5l0.5,2.5l0.5,2.5v0.2v0.2l0.1,0.2v0.2l0.1,0.4
|
1754 |
+
l0.1,0.4l0.1,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.5l0.5,1l1.1,2.1l0.6,1.1l0.3,0.6
|
1755 |
+
l0.3,0.6l0.3,0.6l0,0l0.2-0.4l0.4-1l0.4-1.1l0.2-0.6l0.2-0.6l0.2-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.4-0.6
|
1756 |
+
l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7
|
1757 |
+
l0.5-0.7l0.5-0.7l0.5-0.8l0.5-0.8l0.5-0.8l0.9-1.5l0.9-1.5l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l1.7-3.3l1.7-3.3
|
1758 |
+
l1.8-3.3l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.6l1-1.6l1-1.6l0.5-0.8l0.5-0.8l0.5-0.8l0.5-0.8l0.9-1.4l0.9-1.4l0.9-1.4
|
1759 |
+
l0.8-1.4l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.6
|
1760 |
+
l1.5-3.1l3-6.3l1.5-3.2l1.5-3.1l0.8-1.6l0.8-1.6l0.8-1.6l0.8-1.6l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7
|
1761 |
+
l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.2-2.7l1.2-2.7l1.2-2.7l1.2-2.7l2.5-5.5l2.4-5.5l2.4-5.5l2.4-5.5l4.9-11l2.4-5.5
|
1762 |
+
l2.4-5.5l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1
|
1763 |
+
l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3l1.4-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.1-2.1
|
1764 |
+
l1.1-2.1l1-2.1l1-2.1l1-2.2l1-2.2l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.4-1.1l0.4-1.1
|
1765 |
+
l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.1-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
|
1766 |
+
l0.2-0.3l0.2-0.3l0.4-0.6l0.4-0.6l0.6-1l0.3-0.4l0.2-0.4l0.1-0.2l0.1-0.1l0.1-0.1v-0.1l0.1-0.4l0.3-0.9l0.4-0.8l0.5-0.8l0.6-0.7
|
1767 |
+
l0.7-0.6l0.8-0.4l0.9-0.3l0.9-0.2h0.9l0.9,0.1l0.9,0.3l0.8,0.4l0.8,0.5l0.7,0.6l0.6,0.7l0.4,0.8l0.3,0.9l0.2,0.9v0.9v0.4
|
1768 |
+
l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.4,0.6l-0.4,0.6l-0.7,1
|
1769 |
+
l-0.3,0.4l-0.3,0.4l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1v0.1v0.1l0,0v0.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1
|
1770 |
+
l-0.4,1.1l-0.4,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1
|
1771 |
+
l-0.5,1.1l-1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.1l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3
|
1772 |
+
l-1.5,3l-1.5,3l-1.5,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1
|
1773 |
+
l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-2.4,5.5l-2.4,5.5l-4.9,11l-2.4,5.5l-2.4,5.5l-2.5,5.5
|
1774 |
+
l-2.5,5.5l-1.2,2.8l-1.2,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7
|
1775 |
+
l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.7,1.5l-1.5,3.1l-1.5,3.1l-3,6.3l-1.5,3.2l-0.8,1.6l-0.8,1.6
|
1776 |
+
l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.9,1.6l-0.9,1.5l-0.9,1.5l-0.9,1.5
|
1777 |
+
l-0.9,1.5l-0.9,1.5l-0.9,1.5l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6
|
1778 |
+
l-0.9,1.6l-0.9,1.6l-1.7,3.3l-1.7,3.3l-1.7,3.3l-0.9,1.7l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-1,1.6l-0.5,0.8
|
1779 |
+
l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.6,0.8
|
1780 |
+
l-0.6,0.8l-0.5,0.7l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4
|
1781 |
+
l-0.2,0.4l-0.2,0.5l-0.2,0.5l-0.4,1l-0.4,1.1l-0.5,1.1l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6
|
1782 |
+
l-0.4,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.4,0.3
|
1783 |
+
l-0.5,0.3l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4h-0.5h-0.4l-0.5-0.1l-0.4-0.1l-0.6-0.2l-0.5-0.2
|
1784 |
+
l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3
|
1785 |
+
l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.4l-0.3-0.4l-0.3-0.5l-0.2-0.5l-0.2-0.7l-0.2-0.5l-0.2-0.5l-0.2-0.5
|
1786 |
+
l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.5-1l-1.1-2.1l-0.6-1.1l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6
|
1787 |
+
l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.5-2.6l-0.5-2.5
|
1788 |
+
l-0.5-2.5l-0.5-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.7-5.1
|
1789 |
+
l-0.7-5.1l-0.7-5.1l-0.7-5.1l-0.7-5.1l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.5l-0.4-2.5l-0.4-2.5l-1.2-7.4
|
1790 |
+
l-1.3-7.4l-1.3-7.5l-1.3-7.5l-2.6-15l-1.3-7.5l-1.3-7.5l-1.3-7.5l-1.3-7.5l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8
|
1791 |
+
l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.5-3.8l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.3-1.7l-0.3-1.7
|
1792 |
+
l-0.3-1.7l-0.3-1.7l-0.3-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.8-3.5l-0.8-3.5l-0.8-3.5l-0.8-3.5l-0.4-1.8
|
1793 |
+
l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.2-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9
|
1794 |
+
l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.6-3l-0.6-2.9l-0.6-2.9l-1.2-5.9
|
1795 |
+
l-0.6-3l-0.6-3l-0.6-3l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.6l-0.3-1.6l-0.3-1.7l-0.1-0.9l-0.1-0.9
|
1796 |
+
l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9v-0.5v-0.5v-0.5v-0.5v-0.5v-0.6v-0.5l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4
|
1797 |
+
l0.2-0.5l0.1-0.2v-0.3l0.1-0.9l0.3-0.9L-236.9,1244.6z M-3,1245.6v0.2l0,0V1245.6L-3,1245.6z M-236.3,1251.3l0.2,0.2l-0.4-0.6
|
1798 |
+
L-236.3,1251.3z"
|
1799 |
+
/>
|
1800 |
+
</g>
|
1801 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1802 |
+
<path
|
1803 |
+
d="M-269.9,1186.4l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
|
1804 |
+
l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2
|
1805 |
+
l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
|
1806 |
+
l0.1,0.3v0.3l0,0v0.3v0.3v0.3v0.3l0,0v0.2v0.2l-0.1,0.2l-0.1,0.3l-0.1,0.4l-0.2,0.4l-0.3,0.9l-0.4,0.9l-0.4,0.9l-0.3,0.8
|
1807 |
+
l-0.1,0.3l-0.1,0.2l-0.2,1.4l-0.1,0.9l-0.1,0.9l-0.1,1l-0.1,1l-0.1,0.5l-0.1,0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.4v0.4v0.4v0.4v0.4
|
1808 |
+
v0.3v0.3v0.3v0.3l0.1,0.2v0.1v0.1v0.1v0.1l0.4,1.1l0.4,1.2l0.5,1.3l0.2,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
|
1809 |
+
l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7
|
1810 |
+
l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.5,0.7l0.5,0.7l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.5l0.2,0.3l0.2,0.3
|
1811 |
+
l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
|
1812 |
+
l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
1813 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1
|
1814 |
+
l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3
|
1815 |
+
l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
1816 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
|
1817 |
+
l-0.3,0.1h-0.3h-0.3h1.6h-0.4h-0.5h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
|
1818 |
+
l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
|
1819 |
+
l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
|
1820 |
+
l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.6-0.7l-0.6-0.7l-0.6-0.7l-0.6-0.8l-0.6-0.8l-0.6-0.8
|
1821 |
+
l-0.6-0.8l-0.6-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.4-0.8l-0.4-0.8
|
1822 |
+
l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8
|
1823 |
+
l-0.3-0.8l-0.3-0.7l-0.3-0.7l-0.5-1.4l-0.5-1.4l-0.4-1.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.6l-0.1-0.7l-0.1-0.7
|
1824 |
+
l-0.1-0.7l-0.1-0.7v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-1.1l0.1-1.1l0.2-1l0.2-1
|
1825 |
+
l0.3-1.8l0.1-0.3l0.1-0.4l0.1-0.5l0.2-0.5l0.2-0.5l0.4-1l0.4-1l0.3-0.9l0.3-0.7v-0.1v-0.2l0.1-0.3l0.1-0.3L-269.9,1186.4z
|
1826 |
+
M-270.5,1188.7v0.6v-0.3V1188.7l0.1-0.3v-0.1L-270.5,1188.7z M-270.4,1187.7L-270.4,1187.7L-270.4,1187.7L-270.4,1187.7z"
|
1827 |
+
/>
|
1828 |
+
</g>
|
1829 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1830 |
+
<path
|
1831 |
+
d="M-5,1240.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
|
1832 |
+
l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
|
1833 |
+
l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.3l0.3-0.3l0.3-0.3
|
1834 |
+
l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
|
1835 |
+
l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
|
1836 |
+
l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.5-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9
|
1837 |
+
l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-1l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.1-0.9
|
1838 |
+
l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9v-0.9v-0.9v-0.9v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.3l0.2-0.3l0.2-0.3
|
1839 |
+
l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4
|
1840 |
+
l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.3l0.2,0.3
|
1841 |
+
l0.2,0.3l0.2,0.3l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v1v1.1v1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.2,1.1
|
1842 |
+
l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1
|
1843 |
+
l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1l-0.5,1l-0.5,1l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
|
1844 |
+
l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
|
1845 |
+
l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
|
1846 |
+
l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.3l-0.5,0.3
|
1847 |
+
l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2
|
1848 |
+
l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1H0.8H0.4H0h-0.4l-0.4-0.1
|
1849 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
|
1850 |
+
l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4L-5,1240.4z"
|
1851 |
+
/>
|
1852 |
+
</g>
|
1853 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1854 |
+
<path
|
1855 |
+
d="M-271.2,1188.2l0.2-0.4l0.2-0.4l0.1-0.2l0.3-0.4l0.3-0.4l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.3-0.3l0.3-0.3
|
1856 |
+
l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.3l0.6-0.3l0.7-0.3l0.6-0.3l0.6-0.3
|
1857 |
+
l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.4-0.1l0.4-0.1l0.5-0.1h0.5h0.5h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1
|
1858 |
+
l0.4,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3
|
1859 |
+
l0.8,0.3l1.5,0.6l1.4,0.5l1.3,0.5l1.1,0.5l1,0.4l1.1,0.4l1,0.4l1.1,0.4l1,0.4l1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4
|
1860 |
+
l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3
|
1861 |
+
l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2
|
1862 |
+
l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1
|
1863 |
+
l1.1,0.1l1.1,0.1l1.1,0.1h1.1h1.1h1.1h1.1h1.1h1.1h1.6h1.6h1.6h1.6h1.6l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1
|
1864 |
+
l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l3.2,0.3l3.2,0.3l3.2,0.3l6.5,0.6l3.2,0.3l3.2,0.3l3.2,0.3l3.2,0.3l3.2,0.3
|
1865 |
+
l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1h1.6h1.6h1.6h1.6h1.6
|
1866 |
+
h1.6h1.6h1.6h1.6l1.6-0.1l1.6-0.1l1.6-0.1l1.6-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1
|
1867 |
+
l0.9-0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.3
|
1868 |
+
l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.8-0.7l1.8-0.7l1.8-0.7
|
1869 |
+
l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l3.5-1.5l3.5-1.5l0.5-0.2l0.5-0.2l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
|
1870 |
+
l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l1.1-0.7l1.1-0.7l1.2-0.7l1.2-0.7l0.6-0.4l0.6-0.4l0.6-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4
|
1871 |
+
l0.7-0.4l0.7-0.3l0.7-0.3l0.7-0.3l0.8-0.3l0.8-0.3l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5l0.5,0.1
|
1872 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3
|
1873 |
+
l0.2,0.2l0.2,0.3l0.4,0.4l0.3,0.4l0.3,0.4l0.5,0.7l0.2,0.3l0.2,0.2v0.1l0.5,0.1l0.7,0.3l0.7,0.4l0.6,0.4l0.6,0.5l0.5,0.6l0.4,0.7
|
1874 |
+
l0.3,0.7l0.2,0.7l0.1,0.8v0.8l-0.1,0.8l-0.2,0.8l-0.3,0.7l-0.4,0.7l-0.4,0.6l-0.5,0.6l-0.6,0.5l-0.7,0.4l-0.7,0.3l-0.7,0.2
|
1875 |
+
l-0.8,0.1h-0.8h-0.4h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.3-0.3
|
1876 |
+
l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.3l-0.3,0.1
|
1877 |
+
l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-1.1,0.7l-1.2,0.7
|
1878 |
+
l-1.2,0.8l-1.2,0.8l-0.6,0.4l-0.6,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.3l-0.7,0.3l-0.7,0.3l-3.6,1.5
|
1879 |
+
l-3.6,1.5l-1.8,0.8l-1.8,0.8l-1.8,0.8l-1.8,0.8l-1.8,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1,0.3l-1,0.3l-1,0.3
|
1880 |
+
l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.2
|
1881 |
+
l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1.7,0.1
|
1882 |
+
l-1.7,0.1l-1.7,0.1l-1.7,0.1h-1.7h-1.7h-1.7h-1.7h-1.7h-1.7H-80h-1.6h-1.6l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1
|
1883 |
+
l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-3.3-0.3l-3.3-0.3l-3.3-0.3l-3.2-0.3l-3.2-0.3
|
1884 |
+
l-6.5-0.6l-3.2-0.3l-3.2-0.3l-3.2-0.3l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1
|
1885 |
+
l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1h-1.6h-1.6h-1.6h-1.6h-1.6h-1.2h-1.2h-1.2h-1.2h-1.2h-1.2l-1.2-0.1l-1.2-0.1l-1.2-0.1
|
1886 |
+
l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2
|
1887 |
+
l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3
|
1888 |
+
l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-1.1-0.4
|
1889 |
+
l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4
|
1890 |
+
l-1.1-0.4l-1.1-0.4l-1.1-0.4l-0.9-0.4l-1.1-0.4l-1.2-0.5l-1.3-0.5l-1.4-0.5l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3
|
1891 |
+
l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.6-0.1l-0.6-0.1l-0.6-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2
|
1892 |
+
h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0l0,0l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
|
1893 |
+
l-0.4,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.2,0.3v0.1l0.1-0.1l-0.4,0.6l-0.5,0.6
|
1894 |
+
l-0.6,0.5l-0.6,0.4l-0.7,0.3l-0.7,0.2l-0.8,0.1h-0.8l0,0l-0.8-0.1l-0.8-0.2l-0.7-0.3l-0.7-0.4l-0.6-0.4l-0.6-0.5l-0.5-0.6
|
1895 |
+
l-0.4-0.7l-0.3-0.7l-0.2-0.7l-0.1-0.8v-0.8l0.1-0.8l0.2-0.8L-271.2,1188.2L-271.2,1188.2z M-260.6,1193.4l0.2-0.4l0,0
|
1896 |
+
L-260.6,1193.4L-260.6,1193.4z"
|
1897 |
+
/>
|
1898 |
+
</g>
|
1899 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1900 |
+
<path
|
1901 |
+
d="M-265.5,1181.6l0.4-0.7l0.5-0.6l0.6-0.5l0.4-0.3l0.4-0.4l0.4-0.3l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
|
1902 |
+
l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
|
1903 |
+
l0.5-0.1l0.5-0.1l0.5-0.1l0.9-0.3l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l1.8-0.3l1.7-0.3l0.8-0.2l0.8-0.2l0.8-0.2
|
1904 |
+
l0.8-0.2l0.8-0.2l0.7-0.2l0.7-0.2l0.7-0.2l1.3-0.4l1.3-0.4l1.3-0.4l1.3-0.4l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3
|
1905 |
+
l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2
|
1906 |
+
l1.4-0.2l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l5.1-0.3l5.1-0.3l5.2-0.3l5.2-0.3l10.4-0.7l5.2-0.3l5.2-0.3l5.2-0.3
|
1907 |
+
l5.2-0.3l5.2-0.3l5.2-0.3l5.2-0.3l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1
|
1908 |
+
l2.6-0.1l2.6-0.1l2.6-0.1h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1
|
1909 |
+
l2.6,0.1l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l3.2,0.3l3.2,0.3l1.7,0.1l1.7,0.2l1.7,0.2l1.7,0.2l1.7,0.2l1.7,0.2
|
1910 |
+
l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
|
1911 |
+
l0.9,0.2l0.9,0.2l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.8,0.3l0.8,0.3l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4
|
1912 |
+
l0.8,0.4l0.8,0.4l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3
|
1913 |
+
l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.5,0.6l0.4,0.6l0.3,0.7l0.3,0.7l0.2,0.8l0.1,0.8v0.8l-0.1,0.8l-0.2,0.7
|
1914 |
+
l-0.3,0.7l-0.4,0.6l-0.5,0.6l-0.6,0.5l-0.6,0.4l-0.7,0.3l-0.7,0.3l-0.8,0.2l-0.8,0.1H22l-0.8-0.1l-0.7-0.2l-0.7-0.3l-0.6-0.4
|
1915 |
+
l-0.6-0.5l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
|
1916 |
+
l-0.3-0.2l-0.3-0.2l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.7-0.3
|
1917 |
+
l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2
|
1918 |
+
l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1L-9,1173l-0.8-0.1l-0.8-0.1l-0.8-0.1
|
1919 |
+
l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.1l-3.2-0.3l-3.2-0.3l-2.6-0.2l-2.5-0.2l-2.5-0.2l-2.5-0.2l-2.6-0.2
|
1920 |
+
l-2.6-0.2l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6
|
1921 |
+
h-2.6h-2.6l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1
|
1922 |
+
l-2.6,0.1l-2.6,0.1l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-10.4,0.7l-5.2,0.3l-5.2,0.3l-5.2,0.3
|
1923 |
+
l-5.1,0.3l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2
|
1924 |
+
l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3
|
1925 |
+
l-1.2,0.3l-1.2,0.3l-1.3,0.3l-1.3,0.3l-1.3,0.4l-1.3,0.4l-1.3,0.4l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
|
1926 |
+
l-0.9,0.2l-0.9,0.2l-1.7,0.3l-1.7,0.3l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.4,0.1
|
1927 |
+
l-0.4,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
|
1928 |
+
l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.6,0.5l-0.7,0.4
|
1929 |
+
l-0.7,0.3l-0.8,0.2l-0.8,0.1h-0.8l-0.8-0.1l-0.7-0.2l-0.7-0.3l-0.7-0.4l-0.6-0.5l-0.5-0.6l-0.5-0.6l-0.4-0.7l-0.3-0.7l-0.2-0.8
|
1930 |
+
l-0.1-0.8v-0.8l0.1-0.8l0.2-0.7L-265.5,1181.6z"
|
1931 |
+
/>
|
1932 |
+
</g>
|
1933 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1934 |
+
<path
|
1935 |
+
d="M-231.8,1244l0.4-0.6l0.4-0.5l0.5-0.5l0.5-0.4l0.6-0.4l0,0l0.5-0.2l0.5-0.2l0.6-0.1l0.6-0.1l0,0h0.5h0.5h0.3
|
1936 |
+
l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.8,0.3l0.9,0.3l1,0.4l2.1,0.8l2.2,0.9l1.1,0.4l1,0.4l0.9,0.3l0.4,0.1l0.4,0.1l0.3,0.1
|
1937 |
+
l0.2,0.1h0.2h0.1l1.5,0.3l1.6,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l6.1,1.6l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.3
|
1938 |
+
l1.5,0.3l1.5,0.3l1.5,0.3l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
|
1939 |
+
l0.7,0.1l0.7,0.1l0.7,0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7l1.6-0.1l1.6-0.1h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6
|
1940 |
+
l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2
|
1941 |
+
l3.2,0.2l3.2,0.2l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6l1.6-0.1l1.5-0.1
|
1942 |
+
l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.2l1.5-0.2l1.5-0.2l1.2-0.1l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.1-0.2
|
1943 |
+
l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3
|
1944 |
+
l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1-0.4l1-0.4l1-0.4l1-0.4
|
1945 |
+
l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.5l1-0.5l1-0.5l2.1-0.9l2.1-1l2.1-1l2.1-1l2.1-1l2.1-1L5,1233
|
1946 |
+
l0.6-0.3l0.7-0.2l0.7-0.1h0.7h0.7l0.7,0.1l0.7,0.2l0.6,0.3l0.6,0.3l0.5,0.4l0.5,0.5l0.4,0.5l0.4,0.6l0.3,0.6l0.2,0.6l0.2,0.7
|
1947 |
+
l0.1,0.7v0.7l-0.1,0.7l-0.2,0.7l-0.2,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.5l-0.5,0.5l-0.6,0.4l-0.6,0.3l-2.2,1.1l-2.2,1.1l-2.2,1
|
1948 |
+
l-2.2,1l-2.2,1l-2.2,1l-2.2,1l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.4l-1.1,0.4l-1.1,0.4
|
1949 |
+
l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4
|
1950 |
+
l-1.1,0.4l-1.1,0.4l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3
|
1951 |
+
l-1.2,0.3l-1.2,0.3l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.2l-1.3,0.2
|
1952 |
+
l-1.3,0.2l-1.6,0.2l-1.7,0.2l-1.6,0.2l-1.7,0.1l-1.6,0.1l-1.7,0.1l-1.6,0.1l-1.6,0.1l-1.6,0.1l-1.6,0.1h-1.6h-1.6h-1.6h-1.6h-1.6
|
1953 |
+
h-1.6h-1.6h-1.6h-1.6h-1.6l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2
|
1954 |
+
l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1h-1.6h-1.6h-1.6h-1.6h-1.6
|
1955 |
+
h-1.6h-1.6h-1.6h-1.5h-1.5h-1.5l-1.5,0.1l-1.6,0.1h-0.8h-0.9h-0.9h-0.9h-0.9h-0.9h-0.8h-0.8h-0.9l-0.8-0.1l-0.8-0.1l-0.8-0.1
|
1956 |
+
l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
|
1957 |
+
l-0.8-0.2l-1.6-0.3l-1.6-0.3l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.5-0.4l-3.1-0.8l-3-0.8l-1.5-0.4l-1.5-0.4
|
1958 |
+
l-1.5-0.4l-1.5-0.4l-1.5-0.3l-1.5-0.3l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-1-0.4l-1.1-0.4l-1.1-0.4l-2.3-0.9
|
1959 |
+
l-2.1-0.8l-0.9-0.4l-0.8-0.3l-0.6-0.2h-0.1h-0.1l-0.7-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.5-0.5l-0.5-0.5l-0.4-0.6l-0.3-0.6
|
1960 |
+
l-0.3-0.6l-0.2-0.7l-0.1-0.7v-0.7l0.1-0.7l0.1-0.7l0.2-0.7L-231.8,1244z M-226.5,1252.7l0.5-0.1l0,0L-226.5,1252.7h-0.3H-226.5z"
|
1961 |
+
/>
|
1962 |
+
</g>
|
1963 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
1964 |
+
<path
|
1965 |
+
d="M-196.9,1287.6l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0,0
|
1966 |
+
l0.2-0.1h0.3l0,0h0.3h0.3h0.3l0,0h0.3l0.3,0.1l0.2,0.1h0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.2l0.3-0.1l0.3-0.1
|
1967 |
+
l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1
|
1968 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4
|
1969 |
+
l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5
|
1970 |
+
l0.3,0.5l0.3,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.4,0.9l0.4,0.9l0.4,0.9l0.3,0.8l0.3,0.8l0.3,0.8l0.2,0.7
|
1971 |
+
l0.2,0.7l0.2,0.6l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
|
1972 |
+
l0.1,0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,1.6l-0.2,1.6
|
1973 |
+
l-0.2,1.6l-0.2,1.6l-0.2,1.6l-0.2,1.6l-0.2,1.5l-0.2,1.5l-0.4,3.1l-0.4,3l-0.2,1.5l-0.2,1.5l-0.2,1.5l-0.2,1.5l-0.1,1.1l-0.1,1.2
|
1974 |
+
l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6
|
1975 |
+
l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
1976 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
|
1977 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3
|
1978 |
+
h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
|
1979 |
+
l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4
|
1980 |
+
l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.4-0.8l-0.4-0.8l-0.4-0.8
|
1981 |
+
l-0.4-0.8l-0.3-0.7l-0.3-0.7l-0.3-0.6l-0.5-1.1l-0.4-0.8l-0.1-0.3l-0.1-0.2l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7
|
1982 |
+
l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8
|
1983 |
+
l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8
|
1984 |
+
l-0.1-0.8v-0.8v-0.8v-0.8v-0.8l-0.1-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-3.1v-3.1v-1.5v-1.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5
|
1985 |
+
l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.3-1l0.3-1l0.3-1
|
1986 |
+
l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.1-0.3l0.1-0.3l0.3-0.6l0.3-0.6l0.3-0.6l0.7-1.3l0.3-0.6l0.3-0.6v-0.1v-0.2v-0.3v-0.3v-0.3
|
1987 |
+
l0.1-0.3l0.1-0.3L-196.9,1287.6z M-194.5,1297.5l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.1,0.4l-0.1,0.4
|
1988 |
+
l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4v0.4v0.4v0.4v0.4v0.4v1.5
|
1989 |
+
v1.5v3.1v3.1v1.6v1.6v1.6v1.6v1.6v1.6v1.6v1.6v0.8v0.8v0.8v0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
|
1990 |
+
l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7
|
1991 |
+
l0.2,0.7l0.2,0.7l0.2,0.6l0.2,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.7l0.1,0.3l0.2,0.4l0.4,0.9l0.5,1.1l0.3,0.6l0.3,0.6
|
1992 |
+
l0.3,0.7l0.3,0.7l0.3,0.7l0.4,0.7l0.4,0.7l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
|
1993 |
+
l0.2,0.3l0.2,0.3l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0,0h0.1h0.1l0,0l0,0h0.1h0.1l0,0l0,0
|
1994 |
+
l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2
|
1995 |
+
l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.5
|
1996 |
+
l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6
|
1997 |
+
l0.1-0.6l0.1-0.6l0.1-0.5l0.1-1.1l0.1-1.1l0.2-1.5l0.2-1.5l0.2-1.5l0.2-1.5l0.4-3l0.4-3.1l0.2-1.5l0.2-1.5l0.2-1.5l0.2-1.5
|
1998 |
+
l0.2-1.5l0.2-1.5l0.1-1.5l0.1-1.5l0.1-0.8l0.1-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.7v-0.8v-0.7v-0.7v-0.7v-0.7v-0.7
|
1999 |
+
v-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.2-0.7
|
2000 |
+
l-0.2-0.7l-0.1-0.5l-0.2-0.5l-0.2-0.6l-0.2-0.7l-0.3-0.7l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.4-0.8l-0.2-0.4l-0.2-0.4l-0.2-0.4
|
2001 |
+
l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4
|
2002 |
+
l-0.2-0.4l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
|
2003 |
+
l-0.2-0.1h-0.1l-0.1-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0h-0.1l0,0l0,0l0,0l0,0h-0.1
|
2004 |
+
h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3l-0.3-0.1l-0.2-0.1
|
2005 |
+
l-0.1,0.1l-0.1,0.3l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1.2l-0.3,0.6l-0.3,0.5l-0.2,0.5l-0.1,0.2l-0.1,0.2L-194.5,1297.5z"
|
2006 |
+
/>
|
2007 |
+
</g>
|
2008 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
2009 |
+
<path
|
2010 |
+
d="M-181.5,1393.6L-181.5,1393.6l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2
|
2011 |
+
l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.3h0.4h0.5h0.4l0.4,0.1l0.4,0.1l0.4,0.1
|
2012 |
+
l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3
|
2013 |
+
l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.4l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4
|
2014 |
+
l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4l-0.1,0.4
|
2015 |
+
l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
|
2016 |
+
l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
2017 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1
|
2018 |
+
l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2
|
2019 |
+
l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.3
|
2020 |
+
l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
|
2021 |
+
l-0.1-0.6l-0.1-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-1.1v-1.1v-1l0.1-0.9v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.3
|
2022 |
+
l0.1-0.3l0.1-0.3l0.1-0.4l0.1-0.2l0.1-0.2l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0,0l-0.1-0.2v-0.2v-0.2v-0.2
|
2023 |
+
v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2L-181.5,1393.6z M-176.3,1397.1v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2
|
2024 |
+
l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0v0.1v0.3v0.3v0.3v0.4l-0.1,0.8v0.9v0.9v1v0.5v0.5v0.5v0.5v0.5v0.6v0.5v0.5v0.5
|
2025 |
+
v0.5v0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.3l0.1,0.2l0,0l0.1-0.1l0.1-0.2
|
2026 |
+
l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3
|
2027 |
+
l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3v-0.3v-0.3v-0.4v-0.3v-0.3v-0.3v-0.3
|
2028 |
+
v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.2
|
2029 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1
|
2030 |
+
l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.2h-0.2L-176.3,1397.1L-176.3,1397.1L-176.3,1397.1z M-180.9,1400.2
|
2031 |
+
l0.2,0.1l-0.1-0.1H-180.9L-180.9,1400.2l-0.2-0.2L-180.9,1400.2z"
|
2032 |
+
/>
|
2033 |
+
</g>
|
2034 |
+
<g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
|
2035 |
+
<path
|
2036 |
+
d="M-240.4,1219l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3
|
2037 |
+
l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
|
2038 |
+
l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.4h0.3h0.1h0.1h0.1l0.2,0.1l0.2,0.1h0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1
|
2039 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0,0l0.1,0.1l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0,0v0.2v0.2l0,0v0.2v0.2
|
2040 |
+
v0.1v0.2v0.2v0.1v0.1v0.1v0.2l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1
|
2041 |
+
l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.3h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l0,0l0,0h-0.2h-0.2
|
2042 |
+
h-0.2h-0.2l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2
|
2043 |
+
l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.2v0.2v0.2v0.2l0,0v0.1l0,0v0.1v0.1l0,0
|
2044 |
+
l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.4,0.3l0.4,0.3l0.5,0.3
|
2045 |
+
l0.5,0.3l0.5,0.3l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2
|
2046 |
+
l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l1.3,0.2l1.3,0.2l1.3,0.2l1.3,0.2l2.7,0.3l1.3,0.2l1.3,0.2
|
2047 |
+
l1.3,0.2l1.3,0.2l1.3,0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.7,0.2
|
2048 |
+
l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.4h0.4h0.4h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2
|
2049 |
+
h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1l0,0v-0.1l0,0l0,0l0,0
|
2050 |
+
v-0.1l0,0v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2051 |
+
l-0.1-0.1l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
|
2052 |
+
l-0.3-0.2l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-1-0.3l-1-0.3
|
2053 |
+
l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-2.1-0.5l-2.1-0.5l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3
|
2054 |
+
l-1.1-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
|
2055 |
+
l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2
|
2056 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.3v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2
|
2057 |
+
l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.3h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.3
|
2058 |
+
l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2
|
2059 |
+
l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l2.1,0.5l2.1,0.5l1.1,0.3l1.1,0.3l1.1,0.3
|
2060 |
+
l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.3,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
|
2061 |
+
l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.2,0.2l0.2,0.2l0.2,0.2
|
2062 |
+
l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3
|
2063 |
+
v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
2064 |
+
l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
|
2065 |
+
l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
|
2066 |
+
l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.8-0.2l-0.7-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
|
2067 |
+
l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1.2-0.2l-1.2-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-2.7-0.3l-1.4-0.2l-1.4-0.2
|
2068 |
+
l-1.4-0.2l-1.4-0.2l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2
|
2069 |
+
l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3
|
2070 |
+
l-0.6-0.4l-0.6-0.4l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
|
2071 |
+
l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
|
2072 |
+
l-0.1-0.3v-0.2v-0.3v-0.2v-0.2v-0.2v-0.2v-0.3v-0.4l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.4L-240.4,1219z
|
2073 |
+
M-233.2,1215.7L-233.2,1215.7L-233.2,1215.7L-233.2,1215.7z"
|
2074 |
+
/>
|
2075 |
+
</g>
|
2076 |
+
<path
|
2077 |
+
d="M402.7,260L402.7,260h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
2078 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1
|
2079 |
+
l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2080 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2081 |
+
l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1L403,266l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
|
2082 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.1,0.2
|
2083 |
+
l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.1,0.5
|
2084 |
+
l-0.1,0.3l0,0v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2085 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1
|
2086 |
+
h-0.1h-0.1h-0.1H394h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H393h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2087 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2088 |
+
l-0.1-0.1l-0.1-0.1l0,0v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1V275v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.3l0.1-0.5l0.1-0.6
|
2089 |
+
l0.2-0.7l0.2-0.8l0.2-0.8l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
|
2090 |
+
l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.3-0.2
|
2091 |
+
l0.3-0.2l0.3-0.2l0.4-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1
|
2092 |
+
h1.5V260z"
|
2093 |
+
/>
|
2094 |
+
<path
|
2095 |
+
d="M413.3,271L413.3,271h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
2096 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1
|
2097 |
+
v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1L416,275l-0.1,0.1l-0.1,0.1
|
2098 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1L415,276l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2099 |
+
l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.5,0.3l-0.5,0.3l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2
|
2100 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.1v0.1l0,0v0.1l0.1,0.2
|
2101 |
+
l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.5l0.1,0.5l0.1,0.3l0.1,0.3l0.1,0.3v0.2v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1v0.1l-0.1,0.1v0.1
|
2102 |
+
l0,0l-0.1,0.1v0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1h-0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1
|
2103 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1H407l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1l0,0h-0.1
|
2104 |
+
h-0.1h-0.1h-0.1H406h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0h-0.1H405h-0.1h-0.2l-0.3-0.1h-0.2h-0.1H404h-0.1h-0.1h-0.1
|
2105 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2106 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1V286v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1
|
2107 |
+
v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0,0l-0.1-0.1l-0.1-0.5l-0.2-0.5l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4
|
2108 |
+
v-0.4v-0.4l0.1-0.4v-0.3l0.1-0.2l0.1-0.3l0.1-0.3l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.3
|
2109 |
+
l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.7-0.5l0.7-0.4l0.7-0.4l0.6-0.4
|
2110 |
+
l0.3-0.2l0.3-0.2l0.2-0.2l0.2-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h1.2V271z M406.4,283.1L406.4,283.1
|
2111 |
+
L406.4,283.1L406.4,283.1z"
|
2112 |
+
/>
|
2113 |
+
<path
|
2114 |
+
d="M393,250.3L393,250.3h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
2115 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
|
2116 |
+
l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2117 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1L395,255l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2
|
2118 |
+
l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.4,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1
|
2119 |
+
l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2120 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.4l-0.1,0.4l-0.2,0.9l-0.1,0.5l-0.1,0.3l-0.1,0.3l-0.1,0.3
|
2121 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3L385,266l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2122 |
+
L384,267l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H383h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H382h-0.1
|
2123 |
+
h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2124 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1
|
2125 |
+
v-0.1v-0.1v-0.1v-0.1v-0.1V264l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
2126 |
+
l0.1-0.1l0.1-0.1l0,0h0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.4l0.2-0.9l0.1-0.5l0.2-0.5l0.1-0.3l0.1-0.3l0.1-0.3
|
2127 |
+
l0.2-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.2-0.2
|
2128 |
+
l0.3-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1
|
2129 |
+
l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1h0.1h0.1h0.1h0.1
|
2130 |
+
h0.1h0.1h0.1h0.1h0.1h0.1h0.1L393,250.3z"
|
2131 |
+
/>
|
2132 |
+
<path
|
2133 |
+
d="M400,91h0.2h0.1h0.2h0.1h0.2h0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
2134 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1L403,93l0,0v0.1l0.1,0.1v0.1v0.1v0.1l0,0v0.1
|
2135 |
+
l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.3,0.5l-0.2,0.5l-0.4,0.6l-0.7,1.2l-0.7,1.2l-0.4,0.6
|
2136 |
+
l-0.2,0.5l-0.2,0.4l-0.1,0.2l-0.1,0.1l-0.3,0.8l-0.4,0.8l-0.3,0.8l-0.2,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.4l-0.1,0.4
|
2137 |
+
l-0.2,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
|
2138 |
+
l-0.1,0.4v0.4l-0.1,0.4l-0.1,0.4v0.4v0.4v0.4v0.2l-0.1,0.2v0.2v0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2139 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.1
|
2140 |
+
h-0.2H393h-0.2h-0.2h-0.1h-0.2h-0.2H392h-0.2h-0.2h-0.1h-0.2l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1
|
2141 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2v-0.2l-0.1-0.2V114v-0.2
|
2142 |
+
v-0.2v-0.5v-0.5l0.1-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5
|
2143 |
+
l0.2-0.5l0.1-0.5l0.2-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.4-0.9l0.4-0.9l0.4-0.9l0.1-0.3l0.2-0.3
|
2144 |
+
l0.2-0.6l0.4-0.6l0.4-0.6l0.7-1.2l0.7-1.2l0.2-0.3l0,0v-0.2v-0.2l0.1-0.2V92l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
2145 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1h0.1h0.1
|
2146 |
+
h0.1h0.2h0.1h0.1h0.2l0,0h0.1h0.2V91z"
|
2147 |
+
/>
|
2148 |
+
<path
|
2149 |
+
d="M408.1,107.3h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
2150 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
|
2151 |
+
v0.1v0.1l0,0v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.3,0.9l-0.4,1l-0.4,1.1l-0.5,1.2
|
2152 |
+
l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.1l-0.4,1l-0.4,0.8l-0.3,0.7l-0.2,0.4l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2153 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1
|
2154 |
+
h-0.1h-0.2h-0.1h-0.1h-0.1h-0.3h-0.1H402h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2155 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2156 |
+
l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.1v-0.1V124l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
|
2157 |
+
l0.2-0.4l0.3-0.6l0.4-0.8l0.4-0.9l0.4-1.1l0.5-1.1l0.5-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.4-1.1l0.4-1l0.3-0.8l0.1-0.3l0.1-0.3
|
2158 |
+
l0.1-0.2V110v-0.1v-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
2159 |
+
l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.1h-0.2V107.3z
|
2160 |
+
M405,110.4v0.2V110.4L405,110.4L405,110.4L405,110.4z"
|
2161 |
+
/>
|
2162 |
+
<path
|
2163 |
+
fill="#25B3FF"
|
2164 |
+
d="M483.4,329.1L483.4,329.1h0.3h0.1h0.1h0.1h0.2h0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
2165 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1h0.1l1.4-0.3l0.8-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.6-0.1h0.4
|
2166 |
+
h0.4h0.2h0.3h0.2h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.2l0.1,0.1l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0
|
2167 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2v0.1l0.1,0.1v0.1l0.1,0.2v0.2v0.1v0.2l-0.1,0.2
|
2168 |
+
v0.1v0.2l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2169 |
+
l-0.1,0.1l0,0L494,334l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
2170 |
+
l-0.4,0.1l-0.9,0.2l-0.8,0.2l-0.9,0.2l-0.2,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.2,0.1l-0.1,0.1h-0.1h-0.1h-0.1
|
2171 |
+
h-0.2h-0.1h-0.1H486l-1.4,0.1l-0.5,0.1l-0.5,0.1h-0.1l0,0l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1h-0.2h-0.1h-0.2h-0.1h-0.2h-0.2
|
2172 |
+
h-0.1h-0.2h-0.2h-0.1h-0.1l-0.7,0.4l-0.8,0.4l-0.8,0.4l-0.5,0.2l-0.4,0.2l-0.4,0.2l-0.5,0.2l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
|
2173 |
+
l-0.5,0.2l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.2h-0.2h-0.3h-0.2h0.4H472h-0.3h-0.3l-0.3-0.1l-0.2-0.1h-0.1l-0.1-0.1h-0.1
|
2174 |
+
l-0.1-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2175 |
+
l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1v-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.2v-0.2l0,0v-0.1v-0.1v-0.1
|
2176 |
+
l0.1-0.1v-0.1l0.1-0.1V337v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1V336l0.1-0.1l0.1-0.1
|
2177 |
+
l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0,0l0.2-0.1l0.2-0.1l0.2-0.1
|
2178 |
+
l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.9-0.2l0.4-0.1
|
2179 |
+
l0.1-0.1v-0.2l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
|
2180 |
+
l0.2-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1L483.4,329.1L483.4,329.1z"
|
2181 |
+
/>
|
2182 |
+
<path
|
2183 |
+
fill="#25B3FF"
|
2184 |
+
d="M489.4,325L489.4,325h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
2185 |
+
l0.1,0.1l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.2l0.2,0.2l0.1,0.1v0.1l0.1,0.1l0.1,0.3l0.1,0.3
|
2186 |
+
l0.1,0.1v0.1l0.1,0.1l0.1,0.3l0.1,0.4l0.1,0.4v0.4v0.4v0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
|
2187 |
+
l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
|
2188 |
+
l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3L486,339l-0.4,0.3l-0.3,0.2l-0.3,0.2l-0.2,0.2l0,0l-0.3,0.4
|
2189 |
+
l-0.4,0.5l-0.4,0.5l-0.5,0.7l-0.7,0.8l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2190 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1H481h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1
|
2191 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0h-0.1L478,343l-0.3-0.1l-0.1-0.1h-0.1
|
2192 |
+
h-0.1h-0.1h-0.1h-0.1H477h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.2L476,342l-0.2-0.2l-0.1-0.2l-0.1-0.2v-0.1
|
2193 |
+
l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1V340v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2
|
2194 |
+
V339l0.1-0.3l0.1-0.3l0.1-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3
|
2195 |
+
l0.3-0.3l0.5-0.6l0.3-0.3l-0.1-0.3l-0.1-0.2l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1
|
2196 |
+
v-0.1l-0.1-0.1v-0.1v-0.1V331v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.1l0,0v-0.1V330l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1
|
2197 |
+
h0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.4-0.2l0.3-0.2l0.4-0.2
|
2198 |
+
l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.8-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1
|
2199 |
+
l0.4-0.1l0.4-0.1l0.4-0.1h0.3h0.4h0.3L489.4,325L489.4,325z"
|
2200 |
+
/>
|
2201 |
+
</g>
|
2202 |
+
<path
|
2203 |
+
fill="#0096FF"
|
2204 |
+
d="M447.3,221.9h0.8h0.8h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.1
|
2205 |
+
l0.5,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.3l0.1,0.2l0.1,0.1
|
2206 |
+
l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.2v0.2l0.1,0.1v0.2l0.1,0.2v0.1v0.1v0.1v0.2v0.3l-0.1,0.2
|
2207 |
+
v0.3l-0.1,0.3l-0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3
|
2208 |
+
l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.3,0.3l0.3,0.3l0.1,0.2l0.1,0.2l0.5,0.8l0.2,0.4
|
2209 |
+
l0.1,0.1l0.1,0.1l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.2,0.6
|
2210 |
+
l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.3,1.2l0.7,2.5
|
2211 |
+
l0.4,1.2l0.3,1.2l0.4,1.1l0.2,0.4l0.4,0.5l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.2,0.6l0.1,0.3
|
2212 |
+
l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3
|
2213 |
+
l-0.1,0.3v0.2l0.1,0.6l0.2,1.1l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.4v0.3v0.2v0.2l-0.1,0.3
|
2214 |
+
l-0.1,0.3l-0.1,0.2v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.2l-0.2,0.2l0,0l-0.2,0.2l-0.1,0.2l-0.2,0.1h-0.1l-0.1,0.1
|
2215 |
+
l-0.1,0.1h-0.1l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.2
|
2216 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.2,0.1l0,0h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.1H476h-0.1h-0.1h-0.2h-0.2
|
2217 |
+
h-0.1h-0.2l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.2
|
2218 |
+
l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.3-0.5l-0.3-0.5l-0.2-0.4h-0.1h-0.4H470h-0.4h-0.4h-0.4h-0.4
|
2219 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1L466,280l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.3-0.2
|
2220 |
+
l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.3l-0.4-0.3l-0.3-0.3
|
2221 |
+
l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.6-0.6l-0.7-0.6l-0.5-0.6l-0.6-0.6l-0.6-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7
|
2222 |
+
l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.4-0.7l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.2-0.4l-0.1-0.4l-0.1-0.2
|
2223 |
+
l0,0h-0.1h-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2
|
2224 |
+
l-0.2-0.2l-0.2-0.2l-0.5-0.4l-0.5-0.5l-0.7-0.6l-0.7-0.7l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5
|
2225 |
+
l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5L433,249l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
|
2226 |
+
l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3l0,0h-0.1l-0.4-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
|
2227 |
+
l-0.3-0.4l-0.4-0.4l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.2h-0.1l-0.1-0.1l-0.3-0.2l-0.2-0.3l-0.3-0.3
|
2228 |
+
l-0.3-0.3l-0.2-0.3l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.2l-0.1-0.1v-0.1v-0.2l-0.1-0.2v-0.1l0.1-0.1v-0.1
|
2229 |
+
v-0.1v-0.1v-0.1l0.1-0.1v-0.1l0.1-0.2l0.1-0.2l0.1-0.1l0,0l-0.1-0.1l0,0l-0.5-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.1
|
2230 |
+
l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.2l-0.1-0.2H420
|
2231 |
+
l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.3l0,0v-0.2v-0.2v-0.1v-0.1l0.1-0.1v-0.3l0.1-0.4l0.1-0.4l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3
|
2232 |
+
l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1
|
2233 |
+
l0.3-0.1l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.1l0.7-0.1l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1
|
2234 |
+
l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.8h0.8h0.8h0.8h0.8h0.8h2.5V221.9z M463.1,271.3l-0.2,0.1l0,0l-0.2,0.1
|
2235 |
+
l-0.2,0.1h-0.1h-0.2H462h-0.2l0,0l0,0l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2
|
2236 |
+
l0.2,0.1l0.3,0.1l0.2,0.1l0.1,0.1l-0.7-0.9l-0.7-1L463.1,271.3l-0.1-0.1l-0.2-0.1L463.1,271.3z"
|
2237 |
+
/>
|
2238 |
+
<path
|
2239 |
+
d="M438.7,215.5h0.6h0.6h0.5h0.6h0.5h0.6h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.1l0.9,0.2l0.9,0.2
|
2240 |
+
l0.8,0.2l0.8,0.2l0.7,0.2l0,0h0.1h0.2h0.2h0.2h0.3l0.6-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.8-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4
|
2241 |
+
l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.5,0.5l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.5
|
2242 |
+
l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.5,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6
|
2243 |
+
l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
|
2244 |
+
l0.3,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.1,0.8l0.2,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
|
2245 |
+
l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8v0.8v0.8v0.8l-0.1,0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.4l-0.1,0.4l-0.1,0.5
|
2246 |
+
l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.1,0.4l-0.2,0.4l-0.1,0.4l-0.2,0.4l-0.1,0.4
|
2247 |
+
l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
2248 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.3l-0.3,0.2l-0.2,0.2
|
2249 |
+
l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.3,0.2l-0.3,0.1l-0.4,0.1l-0.3,0.1
|
2250 |
+
l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.3h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4
|
2251 |
+
h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
|
2252 |
+
l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2
|
2253 |
+
l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3
|
2254 |
+
l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.4-0.4l-1-1.4l-1-1.3l-0.9-1.3
|
2255 |
+
l-0.9-1.3l-0.9-1.3l-0.9-1.3l-0.9-1.3l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6
|
2256 |
+
l-0.4-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.7l-0.2-0.7
|
2257 |
+
l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.7l-0.2-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7
|
2258 |
+
l-0.1-0.7l-0.1-0.7v-0.7v-0.7V231l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
|
2259 |
+
l-0.1-0.2L419,229l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3
|
2260 |
+
l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2
|
2261 |
+
l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.5-0.2
|
2262 |
+
l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1h0.6h0.5h0.6h0.6h0.6h0.6h3.2
|
2263 |
+
V215.5z M437.6,221.4h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1L432,222l-0.4,0.1l-0.4,0.1
|
2264 |
+
l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l0,0l0.1,0.2l0.1,0.2
|
2265 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3v0.3l-0.1,0.3l-0.1,0.7l-0.1,0.6l-0.1,0.6v0.6l-0.1,0.6v0.6v0.6v0.6v0.6v0.6l0.1,0.6v0.6
|
2266 |
+
l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.2,0.6l0.1,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6
|
2267 |
+
l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6
|
2268 |
+
l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.8,1.2l0.9,1.2l0.9,1.3l0.9,1.3l0.9,1.3l0.9,1.3l1,1.3l0.3,0.4
|
2269 |
+
l0.3,0.4l0.3,0.4l0.3,0.4l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3
|
2270 |
+
l0.3,0.3l0.3,0.3l0.2,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.3,0.2
|
2271 |
+
l0.2,0.2l0.2,0.2l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
2272 |
+
l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.2-0.1l0.2-0.1
|
2273 |
+
l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.2
|
2274 |
+
l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.3l0.1-0.3
|
2275 |
+
l0.2-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.1-0.3l0.1-0.4l0.2-0.4l0.1-0.4
|
2276 |
+
l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.5l0.1-0.3l0.1-0.3l0.1-0.7
|
2277 |
+
l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.7v-0.6v-0.7v-0.7v-0.7l-0.1-0.7V252l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7
|
2278 |
+
l-0.2-0.7l-0.1-0.7l-0.2-0.7l-0.1-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.3-0.6l-0.2-0.6
|
2279 |
+
l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.5
|
2280 |
+
l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.4l-0.4-0.4
|
2281 |
+
l-0.4-0.4l-0.4-0.4l-0.4-0.4h-0.1h-0.2h-0.2h-0.3h-0.2h-0.3h-0.3l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.4h-0.4H450h-0.4
|
2282 |
+
h-0.4h-0.4h-0.4l-0.3-0.1l-0.8-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.1l-0.8-0.1l-0.9-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5
|
2283 |
+
h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h0.7V221.4z"
|
2284 |
+
/>
|
2285 |
+
<path
|
2286 |
+
fill="#0096FF"
|
2287 |
+
d="M481.7,317.6L481.7,317.6h0.3h0.2h0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.2l0.4,0.2
|
2288 |
+
l0.4,0.2l0.7,0.4l0.2,0.2l0.2,0.1l0.2,0.1h0.1l0,0l0.2,0.1l0.7,0.2l0.9,0.3l1,0.3l0.6,0.2l0.6,0.2l0.7,0.2l0.7,0.2l0.7,0.3l0.7,0.3
|
2289 |
+
l0.7,0.3l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3
|
2290 |
+
l0.3,0.3l0.2,0.3l0.2,0.3l0,0l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.4h0.5h0.5h0.5l0.5,0.1l0.4,0.1
|
2291 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.9,0.2l0.9,0.2l0.4,0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.1
|
2292 |
+
l0.7-0.1l0.7-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.8-0.1l0.7-0.1h0.5h0.3h0.2h0.3l0.3,0.1l0.2,0.1l0.2,0.1
|
2293 |
+
l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.1l0.2,0.2l0.2,0.2h0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2h0.1l0.1,0.2l0.1,0.2h0.1
|
2294 |
+
l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0,0l0.2,0.1l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0,0l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2
|
2295 |
+
l0.1,0.2l0,0l0.1,0.2v0.2l0.1,0.2l0,0v0.2l-0.1,0.2v0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.2,0.2l0,0l-0.1,0.2
|
2296 |
+
l-0.2,0.2l0,0l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1H523l-0.1,0.3
|
2297 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.3l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4
|
2298 |
+
l-0.4,0.4l-0.7,0.8l-0.2,0.2v0.1l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3
|
2299 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l0,0l-0.1,0.1l-0.2,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.1
|
2300 |
+
l-0.2,0.1h-0.2h-0.2l0,0h-0.3h-0.2h-0.3h-0.1h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l0,0
|
2301 |
+
l-0.2-0.2l-0.1-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l0,0v-0.1v-0.1l-0.1-0.2v-0.3v-0.2l0.1-0.3v-0.2l0.1-0.3
|
2302 |
+
l0.1-0.3l0.1-0.1l-0.4,0.5l-0.4,0.5l-0.3,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.1,0.2l0,0l-0.1,0.1v0.1v0.1l-0.1,0.1l0,0l0.1,0.1
|
2303 |
+
l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4l-0.1,0.4l0.5,0.2
|
2304 |
+
l0.8,0.3l0.8,0.3l0.8,0.3l0.2,0.1h0.2l1.3,0.2l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.7,0.1l0.6,0.2l0.5,0.2l0.4,0.1l0.5-0.1l0.4-0.1
|
2305 |
+
l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
|
2306 |
+
l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.2l0.2,0.1l0.2,0.1h0.1l0.2,0.2l0,0
|
2307 |
+
l0.2,0.1l0.1,0.1h0.1l0.1,0.2l0.2,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0,0v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
|
2308 |
+
l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l0,0l-0.2,0.2l-0.2,0.2l-0.2,0.1l0,0l-0.2,0.1l-0.2,0.1H535h-0.2h-0.1h-0.2h-0.1
|
2309 |
+
h-0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.2,0.1h-0.3h-0.3l-0.5,0.1h-0.6h-0.5h-0.6l-1.2,0.1h-0.5h-0.5h-0.4h-0.3h-0.2h-0.4
|
2310 |
+
l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5-0.1h-0.3h-0.1
|
2311 |
+
l-0.9,0.4l-1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-0.7,0.2l-0.6,0.2l-0.6,0.2l-0.7,0.2l-0.7,0.2l-0.6,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2
|
2312 |
+
l-0.7,0.2l-0.6,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1h-0.7h-0.7h-0.6h-0.3h-0.3h-0.4h-0.3h-0.3H496
|
2313 |
+
h-0.3h-0.3l-0.3-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.2
|
2314 |
+
l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l0,0h-0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
2315 |
+
l-0.5,0.1h-0.4H487h-0.4h-0.4h-0.4h-0.5h-0.8h-0.9h-0.8H482h-0.8h-0.9h-0.8l-0.8-0.1l-1.5-0.1l-1.5-0.1l-1.4-0.1h-0.7H473h-0.6
|
2316 |
+
h-0.5h-0.2h-0.2h-0.6h-0.7l-0.8,0.1l-0.8,0.1l-0.8,0.1H467h-0.4h-0.4h-0.4h-0.4H465h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.2-0.1
|
2317 |
+
l-0.3-0.1l-0.3-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.2l-0.2-0.2H461l-0.1-0.2l-0.1-0.2v-0.1
|
2318 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.2v-0.2v-0.2v-0.1v-0.3v-0.3v-0.1l0.1-0.2l0.1-0.2V356l0.1-0.2l0.1-0.2v-0.1l0.1-0.1
|
2319 |
+
l0.1-0.1v-0.1l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1
|
2320 |
+
l0.5-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l1.1-0.2l0.6-0.1l0,0l0.1-0.2l0.1-0.2l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
|
2321 |
+
l0.3-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.4-0.4l0.3-0.3l0.3-0.4l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.3-0.3
|
2322 |
+
l0.3-0.2l0.3-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.3l0.6-0.3l0.5-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.4-0.2l0,0l-0.3-0.1l-0.3-0.1
|
2323 |
+
l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.2l-0.3-0.2l-0.3-0.2
|
2324 |
+
l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1h-3.7
|
2325 |
+
h-0.3h-0.2l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.3
|
2326 |
+
l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.2-0.1
|
2327 |
+
l0.3-0.1h0.2h0.3h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.6-0.2l0.5-0.2l0.6-0.2
|
2328 |
+
l0.6-0.2l0.3-0.1l-0.1-0.2v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1
|
2329 |
+
l0.2-0.1l0.3-0.1h0.3h0.3h0.2h0.1h0.4h0.4l0.5-0.1l0.5-0.1l0.5-0.1h0.2l0.1-0.1l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2
|
2330 |
+
l0.3-0.2l0.3-0.2l0.2-0.2l-0.4-0.1l-0.5-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2
|
2331 |
+
l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2
|
2332 |
+
l-0.1-0.2l-0.1-0.1l-0.1-0.2v-0.2l-0.1-0.1v-0.2v-0.2l-0.1-0.1v-0.2v-0.2l0.1-0.1v-0.2v-0.2l0.1-0.2l0.1-0.2v-0.1l0.1-0.1l0,0
|
2333 |
+
l0.1-0.2l0.1-0.2l0,0l0.1-0.2l0.1-0.2l0,0l0.1-0.1l0.2-0.1l0,0l0.2-0.2l0.2-0.1l0,0l0.2-0.1l0.2-0.1h0.1l0.2-0.1l0.2-0.1l0,0
|
2334 |
+
l0.2-0.1l0.2-0.1l0,0h0.2h0.2h0.1h0.3L481.7,317.6z M492.7,346.7l-1.1,0.8l-1.1,0.8l-1.1,0.8l-1.2,0.8l-1.1,0.8l-0.8,0.6l0.4-0.1
|
2335 |
+
l0.6-0.2l0.7-0.2l0.5-0.2l0.2-0.1l0.2-0.2l0.7-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.9-0.7l0,0v-0.1v-0.1v-0.1v-0.1v-0.1V347v-0.1
|
2336 |
+
v-0.1l-0.1-0.1v-0.1L492.7,346.7L492.7,346.7L492.7,346.7L492.7,346.7z M491.1,334.8v0.3l0.1,0.3v0.3l0,0h0.2l0.3,0.1l0.2,0.1
|
2337 |
+
l0.2,0.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.1h-0.2h-0.4h-0.5h-0.4h-0.4H491L491.1,334.8z"
|
2338 |
+
/>
|
2339 |
+
<path
|
2340 |
+
d="M521.4,320.1h0.5h0.5l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1
|
2341 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.4l0.2,0.4
|
2342 |
+
l0.1,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.3l-0.1,0.4l-0.1,0.3l-0.1,0.3
|
2343 |
+
l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
|
2344 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.4,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3
|
2345 |
+
l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.9,0.6l-0.9,0.6l-0.8,0.5l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.2l-0.2,0.2
|
2346 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l0,0l0,0h-0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0
|
2347 |
+
l0,0v0.1v0.1l0,0l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1h0.2h0.3h0.3h0.4l0.8,0.1
|
2348 |
+
l0.9,0.1l1.1,0.1l2.4,0.1l1.2,0.1l1.4,0.1l1.3,0.1l1.4,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
|
2349 |
+
l0.7,0.1l0.7,0.1l0.6,0.1l0.7,0.1l0.6,0.2l0.7,0.2l0.6,0.2l0.5,0.2l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.3,0.1
|
2350 |
+
l0.2,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
|
2351 |
+
l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4l-0.1,0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3
|
2352 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
|
2353 |
+
l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
|
2354 |
+
l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4H530h-0.4h-0.8H528h-0.8h-0.8h-0.8h-1.5h-1.5h-0.7h-0.7h-0.7h-0.7h-0.7
|
2355 |
+
h-0.3h-0.4l-2.6,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.1l-1.4,0.1l-1.4,0.1
|
2356 |
+
l-1.3,0.1H486h-1.4h-1.3h-1.4h-1.4h-1.4h-1.3h-1.4H475h-0.3h-0.4h-0.4h-0.4l-1.1,0.1l-1.2,0.1l-1.3,0.1l-1.4,0.1l-0.7,0.1h-0.7
|
2357 |
+
h-0.8h-0.7h-0.8H464h-0.7h-0.8h-0.7h-0.7h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
|
2358 |
+
l-0.3-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3
|
2359 |
+
l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3l-0.1-0.3v-0.3l0.1-0.3v-0.3l0.1-0.3l0.1-0.3
|
2360 |
+
l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.4
|
2361 |
+
l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.5-0.4l0.4-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
|
2362 |
+
l0.5-0.3l1-0.6l1-0.6l0.9-0.6l1-0.6l0.9-0.5l1.8-1l0.8-0.5l0.7-0.4l0.3-0.2l0.3-0.2l0.3-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.1-0.1l0,0
|
2363 |
+
h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0h-0.1l0,0l0,0h-0.1l0,0h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2364 |
+
l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.1l-0.4-0.1l-0.4-0.1
|
2365 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3l-0.8-0.3l-1.6-0.5l-0.8-0.2l-0.7-0.2l-0.7-0.2l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1
|
2366 |
+
l-0.3-0.1l-0.3-0.2l-0.4-0.2l-0.3-0.2L457,339l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2v-0.1
|
2367 |
+
l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.2l-0.1-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.1l0.1-0.2v-0.2l0.1-0.1v-0.2l0.1-0.2l0.1-0.1l0.1-0.1
|
2368 |
+
l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
|
2369 |
+
l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.4-0.2l0.4-0.2
|
2370 |
+
l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2h0.1L470,325l-0.3-0.3l-0.2-0.3l-0.3-0.3l-0.1-0.2
|
2371 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.3v-0.3v-0.3v-0.2V321l0.1-0.2l0.1-0.2l0.1-0.2
|
2372 |
+
l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.3l0.2-0.4l0.2-0.3l0.3-0.3l0.2-0.3l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
|
2373 |
+
l0.3-0.2l0.3-0.2l0.3-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.6-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l1.2-0.3
|
2374 |
+
l1.1-0.3l0.4-0.1l0.4-0.1h0.5h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.2l0.4,0.2
|
2375 |
+
l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.6,0.4l0.6,0.4l0.7,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.6,0.4l1.1,0.8l0.5,0.4l0.5,0.4
|
2376 |
+
l0.5,0.4l0.5,0.3l0.5,0.3l0.5,0.3l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1h0.1h0.1h0.1l0,0h0.1
|
2377 |
+
h0.1h0.2h0.2h0.2h0.3h0.2h0.3l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.9-0.1l2-0.3l1-0.2l1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1-0.1
|
2378 |
+
h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5L521.4,320.1z M485.3,319L485.3,319L485.3,319h-0.2l-1.1,0.3l-1.2,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2
|
2379 |
+
l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.1h0.1l0.2,0.2l0.3,0.2l0.4,0.2
|
2380 |
+
l0.4,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3h0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
|
2381 |
+
l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2
|
2382 |
+
l-0.2,0.2l-0.3,0.2l-0.2,0.1l-0.3,0.1H480h-0.1l-0.3,0.1l-0.7,0.1l-1.9,0.3l-1.1,0.2l-0.9,0.2l-0.4,0.1l-0.4,0.1H474h-0.1l-0.4,0.1
|
2383 |
+
l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
|
2384 |
+
l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l0.5,0.1l1.6,0.5l0.8,0.3l0.9,0.3l0.4,0.2l0.5,0.2
|
2385 |
+
l0.4,0.2l0.4,0.2l0.5,0.2l0.4,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.2,0.2
|
2386 |
+
l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
|
2387 |
+
l0.1,0.3l0.1,0.3v0.3l0.1,0.3v0.3v0.3v0.3l-0.1,0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2
|
2388 |
+
l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.8,0.5
|
2389 |
+
l-0.8,0.5l-1.8,1l-0.9,0.5l-0.9,0.5l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.4,0.3l-0.5,0.3l-0.5,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
|
2390 |
+
l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2391 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l0,0l0,0h-0.1l0,0l0,0l0,0h0.1v0.1h0.1l0.1,0.1v0.1h0.1h0.1h0.1h0.1h0.1h0.1
|
2392 |
+
h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.2h0.6h0.7h0.6h0.7h0.7h0.7h0.7h0.7h0.7h0.7l1.4-0.1l1.3-0.1l1.2-0.1l1.1-0.1h0.5
|
2393 |
+
h0.5h0.5h0.5h1.3h1.4h1.3h1.3h1.3h1.4h1.3h1.4h1.3l1.3-0.1l1.4-0.1l1.3-0.1l2.6-0.1l2.7-0.2l2.7-0.2l2.7-0.2l2.6-0.2l2.7-0.2
|
2394 |
+
l2.7-0.2l2.6-0.2l2.7-0.2l2.7-0.2h0.4h0.4h0.8h0.8h0.8h0.8h0.8h1.5h1.5h0.7h0.7h0.7h0.7h0.7h0.4h0.3h0.3h0.4h0.3h0.3l0.3-0.1
|
2395 |
+
l0.3-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
|
2396 |
+
l0.2-0.1l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.3l0.2-0.3l0.1-0.1l0.1-0.1l0.1-0.1
|
2397 |
+
l0.1-0.1l0.1-0.1v-0.1l0,0h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1
|
2398 |
+
l-0.2-0.1l-0.2-0.1l-0.4-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1
|
2399 |
+
l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.1l-1.3-0.1l-2.4-0.1l-1.1-0.1l-1.1-0.1l-0.9-0.1h-0.5l-0.4-0.1
|
2400 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1
|
2401 |
+
l-0.4-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
|
2402 |
+
L510,346l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.3
|
2403 |
+
l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.3
|
2404 |
+
l0.4-0.3l0.5-0.3l0.4-0.3l0.9-0.6l0.9-0.6l0.9-0.6l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.3-0.3l0.4-0.3
|
2405 |
+
l0.3-0.3l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1
|
2406 |
+
l0.1-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1V330v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2l-0.1-0.2v-0.2l-0.1-0.2l-0.1-0.2
|
2407 |
+
l-0.1-0.2L524,328l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.1h-0.1l0,0h-0.1l-0.2-0.1l-0.1-0.1L523,327h-0.2h-0.2h-0.3H522h-0.4h-0.3h-0.4
|
2408 |
+
h-0.4h-0.4h-0.4h-0.4h-0.4h-0.5H518h-0.5l-0.9,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-0.9,0.1l-2,0.3l-0.9,0.1l-0.9,0.1l-0.8,0.1
|
2409 |
+
l-0.8,0.1l-0.8,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.1
|
2410 |
+
l-0.3-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.6-0.4l-0.5-0.4l-0.6-0.4l-0.6-0.4l-0.5-0.4l-0.6-0.4l-1.1-0.8
|
2411 |
+
l-0.5-0.4l-0.5-0.4l-0.6-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.3l-0.5-0.3l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1L487,320
|
2412 |
+
l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1h-0.2h-0.2h-0.1h-0.1h-0.1h-0.1h-0.2V319z"
|
2413 |
+
/>
|
2414 |
+
<path
|
2415 |
+
fill="#25B3FF"
|
2416 |
+
d="M486.3,321.2h0.2h0.1h0.2h0.1h0.2h0.1l0.1,0.1l0.2,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.3,0.2l0.2,0.2
|
2417 |
+
l0.1,0.1l0,0h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.4,0.1h0.1
|
2418 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2
|
2419 |
+
l0.1,0.2l0.1,0.2v0.2l0.1,0.1h0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.3,0.1
|
2420 |
+
l0.2,0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.3,0.2l0.1,0.1h0.2h0.3h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.4,0.1l0.3,0.1l0.3,0.1l0.4,0.1
|
2421 |
+
l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.3v0.2v0.2v0.2v0.3v0.3
|
2422 |
+
l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2423 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
|
2424 |
+
l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4H500l-0.9,0.1h-0.3l0.1,0.1l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2
|
2425 |
+
v0.2l0.1,0.2v0.2v0.1v0.2l-0.1,0.2v0.2v0.2l-0.1,0.1v0.1l-0.1,0.1L499,341v0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.3l-0.1,0.2
|
2426 |
+
l-0.2,0.2l-0.2,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.8,0.6l-0.9,0.6l-0.9,0.6l-0.8,0.5
|
2427 |
+
l-0.8,0.5l-0.2,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.2l0.1,0.1l0.1,0.2l0,0l0.1,0.1v0.1l0.1,0.1l0,0v0.1l0.1,0.1v0.2l0,0
|
2428 |
+
l-0.1,0.2v0.2l0,0v0.2l-0.1,0.2l0,0l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2429 |
+
l-0.1,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.5,0.5l-0.5,0.5l-1.1,0.9l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.2,0.2l-0.1,0.1
|
2430 |
+
l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1
|
2431 |
+
l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
|
2432 |
+
l-0.1-0.2l-0.1-0.2V354v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.2-0.1
|
2433 |
+
l0.2-0.3l0.3-0.3l0.5-0.5l0.1-0.1l-0.1-0.1L482,350l-0.1-0.1l0,0l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1
|
2434 |
+
l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0v-0.2l-0.1-0.2v-0.2l0,0V348v-0.2v-0.1l0,0v-0.2v-0.2l0.1-0.2l0,0
|
2435 |
+
l0.1-0.2l0.1-0.2l0.1-0.2v-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1
|
2436 |
+
l0.4-0.2l0.4-0.2l0.4-0.2l0.7-0.4l0.7-0.3l0.2-0.1l0.2-0.1l0.5-0.3l0.5-0.3l0.6-0.4l0.3-0.2h-0.1H487h-0.4l-0.4-0.1l-0.4-0.1
|
2437 |
+
l-0.4-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1
|
2438 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.2h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l0,0v-0.1h-0.1h-0.1l-0.5,0.2l-0.5,0.2l-0.5,0.2
|
2439 |
+
l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.2h-0.2h-0.3h-0.2h-0.3h-0.3l-0.3-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1
|
2440 |
+
l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1L474,339l-0.1-0.1l-0.1-0.1
|
2441 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.2l-0.1-0.1l-0.8-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
|
2442 |
+
l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2
|
2443 |
+
l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0,0
|
2444 |
+
l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1h0.1l0.1-0.1l0.2-0.1l0.2-0.1h0.1h0.2
|
2445 |
+
h0.1h0.2h0.1h0.2h0.2h0.6h0.3h0.1l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.4-0.1h-0.1v-0.2L475,330l0,0v-0.2l-0.1-0.2v-0.2v-0.2
|
2446 |
+
V329l0.1-0.1v-0.1v-0.2l0.1-0.1v-0.1l0.1-0.2v-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.3l0.2-0.4
|
2447 |
+
l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
|
2448 |
+
l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.2l0,0l0.1-0.2v-0.1l0.1-0.2v-0.2h0.1v-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1
|
2449 |
+
l0.1-0.1h0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.2-0.1l0,0l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1h0.1l0.2-0.1l0.1-0.1h0.2h0.2h0.2l0,0
|
2450 |
+
h0.2h0.2L486.3,321.2z"
|
2451 |
+
/>
|
2452 |
+
<path
|
2453 |
+
fill="#25B3FF"
|
2454 |
+
d="M455.7,235.5L455.7,235.5h0.2h0.1h0.1h0.2l0,0h0.1h0.2l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0.2,0.1l0,0l0.1,0.1
|
2455 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1v0.1h0.1v0.1
|
2456 |
+
l0.1,0.1v0.1l0,0l0.1,0.2v0.2v0.2v0.2v0.2v0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1
|
2457 |
+
l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1
|
2458 |
+
l0.1,0.1l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.1l0.1,0.1v0.1l0.1,0.1v0.1l0.1,0.2v0.3v0.2v0.1v0.1v0.1v0.1l-0.1,0.2v0.2l-0.1,0.2
|
2459 |
+
l-0.1,0.4l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2l0,0l0.1,0.1l0.1,0.2
|
2460 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2l0.1,0.2v0.2l-0.1,0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1
|
2461 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.2h-0.2H459
|
2462 |
+
h-0.2h-0.2h-0.2h-0.1h-0.1H458h-0.1h-0.1h-0.2h-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1
|
2463 |
+
h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2v-0.1l-0.1-0.1l-0.1-0.1
|
2464 |
+
l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3V249v-0.3v-0.4l0.1-0.4v-0.4l0.1-0.1h-0.1l-0.6,0.3l-0.7,0.3l-0.7,0.3l-0.4,0.2
|
2465 |
+
l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1l-0.5,0.1L447,250h-0.5H446h-0.5h-0.3
|
2466 |
+
H445h-0.2h-0.2h-0.3l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2467 |
+
l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1L441,248l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1
|
2468 |
+
l-0.1-0.1l-0.1-0.1l0,0v-0.1h-0.1h-0.1h-0.2H440h-0.2h-0.1h-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1
|
2469 |
+
l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1
|
2470 |
+
l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.2v-0.1v-0.1l0,0l0.1-0.2V244l0.1-0.2l0,0l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
|
2471 |
+
l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.3l0.3-0.3l0.3-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.4l0.7-0.4l0.7-0.4
|
2472 |
+
l0.5-0.3H442l-0.8,0.1h-0.4h-0.5h-0.4h-0.4h-0.4h-0.5h-0.4h-0.4h-0.4h-0.5l-0.4-0.1l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1
|
2473 |
+
l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1
|
2474 |
+
l-0.1-0.1h-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.1v-0.1l-0.1-0.1l0,0l0,0l-0.4-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1
|
2475 |
+
l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
|
2476 |
+
v-0.1l-0.1-0.2l-0.1-0.2L429,234l-0.1-0.2v-0.1v-0.2l-0.1-0.2v-0.2v-0.2v-0.1v-0.2v-0.2l0.1-0.2V232l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
|
2477 |
+
v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.3-0.3l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.3-0.1
|
2478 |
+
l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1h0.6
|
2479 |
+
h0.5h0.6l1.1-0.1l2.1-0.1l0.9-0.1h0.4h0.4h0.3h0.3h0.2h0.2l0.8-0.2l0.8-0.2l0.8-0.2l0.8-0.2l0.1-0.1l0.2-0.1l0.2-0.1l0.5-0.2
|
2480 |
+
l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1
|
2481 |
+
l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.1,0.2
|
2482 |
+
v0.2v0.2v0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2483 |
+
l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l0,0l-0.2,0.1L454,231l-0.2,0.1l-0.4,0.2l-0.6,0.2l-0.7,0.3l-0.5,0.2l0,0l0.1,0.2v0.2v0.2v0.2
|
2484 |
+
v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1h0.1l0.1,0.1
|
2485 |
+
l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.2l0.1,0.2v0.1l0.1,0.1v0.1l0.1,0.1v0.1v0.1v0.1
|
2486 |
+
l0.2-0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1L455.7,235.5z M458.8,246.9L458.8,246.9h-0.2H458.8z"
|
2487 |
+
/>
|
2488 |
+
<g>
|
2489 |
+
<g transform="matrix(1,0,0,1,454.698,46.683)">
|
2490 |
+
<path
|
2491 |
+
d="M343.4,257.1h0.9h0.9h0.9h0.9h0.5h0.2l0.3-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.3h0.3h0.3h0.3h0.3h0.3h0.3
|
2492 |
+
l0.3,0.1l0.7,0.1l0.7,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.4,0.1l0.6,0.1l0.6,0.1h0.2h0.2h0.3h0.3l0.8,0.1
|
2493 |
+
l0.9,0.1l1,0.1l1.1,0.1l1.1,0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.2l0.5,0.2
|
2494 |
+
l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.3
|
2495 |
+
l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3v0.2v0.2v0.2v0.1v0.2v0.2l0,0v0.3v0.3l0,0v0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2
|
2496 |
+
l-0.1,0.2l0,0l-0.2,0.2l-0.2,0.2l-0.2,0.2l0,0l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.1l-0.2,0.1l0,0H374h-0.2l0,0h-0.3h-0.1
|
2497 |
+
h-0.2H373h-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.5-0.2l-0.5-0.2l-1.1-0.5l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1
|
2498 |
+
l-0.2-0.1l-0.2-0.1h-0.1h-0.1h-0.1l0,0h-0.3h-0.4h-0.4h-0.3h-0.3h-0.3h-0.3H365l-0.3-0.1l-0.3-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.2
|
2499 |
+
l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-1.2-0.4l-0.5-0.2l-0.4-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
|
2500 |
+
l-0.7-0.1l-0.7-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1H349l-0.4,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
|
2501 |
+
l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.4,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1h-1.5h-1.5h-1.5h-1.5h-2.4h-0.9l0,0
|
2502 |
+
l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.3l-0.7,0.3l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
|
2503 |
+
l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
|
2504 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1h0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.9,0.1l1,0.1l1,0.1
|
2505 |
+
l1,0.1l2,0.2l1,0.1l1,0.1l0.9,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
|
2506 |
+
l0.4,0.2l0.4,0.2l0.2,0.1l0.3,0.2h0.1l0.1,0.1l0.1,0.1l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.3l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2
|
2507 |
+
l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3
|
2508 |
+
l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
|
2509 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1
|
2510 |
+
l-0.5,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
|
2511 |
+
l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.3,0.1L312,289l-1.2,0.1
|
2512 |
+
l-1.2,0.1l-1.1,0.1h-1l-1.8,0.1h-1.3h-0.5h-0.2h-0.1h-0.3H303h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.3-0.2l-0.2-0.2l-0.2-0.2
|
2513 |
+
l-0.2-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3V286l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0,0l0.2-0.2l0.2-0.2
|
2514 |
+
l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0,0h0.2h0.2h0.2h0.4h0.5h1.3l1.7-0.1h1l1.1-0.1l1.1-0.1l1.2-0.1l1.2-0.1
|
2515 |
+
l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
|
2516 |
+
l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.4-0.2l0.3-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0
|
2517 |
+
h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.1l0,0h-0.1h-0.1
|
2518 |
+
l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1h-0.4l-0.9-0.1l-0.9-0.1l-1-0.1
|
2519 |
+
l-2-0.2l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1
|
2520 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2
|
2521 |
+
l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3
|
2522 |
+
l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.3l0.3-0.3
|
2523 |
+
l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0,0l-1.4-0.1l-1.4-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.2l-0.4-0.1h-0.5l-1.1-0.1
|
2524 |
+
l-1.2-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
|
2525 |
+
l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3
|
2526 |
+
l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4V255
|
2527 |
+
v-0.5V254v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2
|
2528 |
+
l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2
|
2529 |
+
l0.4-0.2l0.4-0.2l0.4-0.2l0.8-0.4l0.8-0.4l1.4-0.7l0.6-0.3l0.5-0.3l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
|
2530 |
+
l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.6h0.6h0.6h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
|
2531 |
+
l0.5,0.1l0.5,0.1l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
|
2532 |
+
l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1h0.7h0.7h0.8h0.8h0.8l1.5,0.1h1.5h1.5h1.5h1.5h3h2.9h1.1h1.1h1.1l1.1-0.1l1.1-0.1l1.1-0.1
|
2533 |
+
l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.2l1.1-0.2l1.1-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.1h0.1
|
2534 |
+
l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.6-0.3l0.6-0.3l0.6-0.3l0.7-0.3l0.6-0.3l0.6-0.3l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
|
2535 |
+
l0.4-0.1l0.3-0.1h0.3h0.2h0.2h0.2h0.1h0.2h0.2l0,0l0.3,0.1l0.3,0.1l0,0l0.2,0.1l0.2,0.1l0.2,0.2l0,0l0.2,0.2l0.2,0.2l0.2,0.2l0,0
|
2536 |
+
l0.1,0.2l0.1,0.2l0.1,0.3l0,0l0.1,0.2v0.2v0.2l0,0v0.3v0.3v0.1v0.2v0.2v0.1l-0.1,0.3l-0.1,0.2l-0.1,0.3l-0.1,0.2l-0.1,0.2
|
2537 |
+
l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.2l0,0l-0.6,0.3l-0.6,0.3
|
2538 |
+
l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.1L357,248l-0.4,0.1l-0.3,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
|
2539 |
+
l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1h-1.2
|
2540 |
+
h-1.2h-1.2h-2.9h-3h-1.5h-1.6h-1.6h-1.6l-1.6-0.1h-0.8h-0.8h-0.8h-0.8l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
|
2541 |
+
l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.4-0.1l-0.4-0.1
|
2542 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.1H304h-0.4h-0.4h-0.4h-0.4H302h-0.2h-0.2h-0.2h-0.2H301h-0.2h-0.2h-0.2h-0.2H300l-0.2,0.1l-0.2,0.1
|
2543 |
+
l-0.2,0.1l-0.2,0.1L299,248l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.6,0.3l-0.7,0.3l-1.4,0.6l-0.7,0.3l-0.7,0.4l-0.4,0.2l-0.3,0.2
|
2544 |
+
l-0.3,0.2L293,251l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1
|
2545 |
+
l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.1v0.1l0,0l0,0l0,0l0,0l0,0l0,0v0.2v0.2v0.2v0.2v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1
|
2546 |
+
v0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
2547 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1
|
2548 |
+
l0.6,0.1l1.1,0.1l1.1,0.1l0.5,0.1l0.5,0.1l1.2,0.1l1.2,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1
|
2549 |
+
l1.4,0.1l1.5,0.1h1.5h1.4h0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l1-0.1l0.9-0.1
|
2550 |
+
l1-0.1l1-0.1h0.9h0.9h0.9h0.9h0.9h0.9h0.9L343.4,257.1z M303.7,289.4L303.7,289.4L303.7,289.4L303.7,289.4z"
|
2551 |
+
/>
|
2552 |
+
</g>
|
2553 |
+
<g transform="matrix(1,0,0,1,381.866,45.2348)">
|
2554 |
+
<path
|
2555 |
+
d="M-30.6-41.7h1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.3l1,0.3l0.5,0.2
|
2556 |
+
l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
|
2557 |
+
l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.9,0.7l0.8,0.8l0.7,0.9l0.6,1l0.5,1l0.3,1.1l0.2,1.1l0.1,1.1
|
2558 |
+
l-0.1,1.1l-0.2,1.1L-2-23.3l-0.5,1l-0.6,0.9l-0.7,0.8l-0.8,0.8l-0.9,0.6l-1,0.5l-1,0.4L-8.6-18l-1.1,0.1h-1.1l-1.1-0.2l-1.1-0.3
|
2559 |
+
l-1-0.4l-1-0.6l-0.3-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
|
2560 |
+
l-0.3-0.1l-0.3-0.1L-19-21l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.6-0.2
|
2561 |
+
l-0.6-0.2l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7
|
2562 |
+
h-0.7l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.6,0.2l-0.6,0.2
|
2563 |
+
l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
|
2564 |
+
l-0.3,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
|
2565 |
+
l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.7,0.7l-0.7,0.7l-1.4,1.4l-1.5,1.4
|
2566 |
+
l-1.5,1.4l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.6,0.7l-0.3,0.3L-66.5-3l-0.3,0.4
|
2567 |
+
l-0.3,0.3L-67.4-2l-0.3,0.3L-68-1.4l-0.3,0.3l-0.3,0.3l-0.2,0.3L-69-0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3L-69.8,1L-70,1.3l-0.2,0.3
|
2568 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3L-71,2.8l-0.1,0.3l-0.1,0.3l-0.1,0.3L-71.4,4l-0.1,0.3l-0.1,0.3l-0.1,0.3l0,0.1v0.2v0.1v0.2v0.4v0.4
|
2569 |
+
l-0.1,0.5l-0.1,1.3l-0.2,3l-0.1,1.7l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.2,0.9l-0.2,0.9l-0.1,0.5
|
2570 |
+
l-0.1,0.4l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.7,0.4
|
2571 |
+
l-0.3,0.4l-0.6,0.6l-0.4,0.3l-0.5,0.4L-79,30l-0.5,0.3l-0.4,0.2l-1.9,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,1l-1.7,1
|
2572 |
+
l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1
|
2573 |
+
l-1.7,1.1l-1.7,1.1l-1.7,1.2l-1.7,1.2l-3.4,2.3l-3.4,2.4l-3.4,2.4l-6.9,4.8l-3.5,2.4l-3.5,2.4l-3.5,2.4l-3.5,2.4l-1.8,1.2
|
2574 |
+
l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.1l-1.8,1.1l-1.8,1.1L-177,93l-1.8,1.1l-1.8,1.1
|
2575 |
+
l-1.8,1.1l-1.8,1.1l-1.8,1.1l-1.8,1.1l-1.9,1l-1.8,1l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-2.1,1.2l-2.1,1.2
|
2576 |
+
l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3
|
2577 |
+
l-2.1,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.4l-2,1.4
|
2578 |
+
l-2,1.4l-2,1.4l-2,1.4l-2,1.4l-2,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4
|
2579 |
+
l-1.9,1.4l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.7l-1,0.7l-1,0.7l-1,0.7l-1,0.7l-1,0.7
|
2580 |
+
l-1,0.7l-1,0.7l-2,1.3l-2,1.3l-4,2.6l-2,1.3l-1,0.6l-1,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.7
|
2581 |
+
l-0.9,0.7l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2v0.4l-0.1,1.1l-0.2,1.1l-0.3,1.1l-0.5,1l-0.6,0.9
|
2582 |
+
l-0.7,0.9l-0.8,0.8l-0.9,0.7l-1,0.5l-1,0.4l-1.1,0.3l-1.1,0.1h-1.1l-1.1-0.1l-1.1-0.3l-1-0.4l-1-0.5l-0.9-0.7l-0.8-0.8l-0.7-0.9
|
2583 |
+
l-0.3-0.4l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.6l0.1-0.6l0.1-0.6l0.1-0.6
|
2584 |
+
l0.1-0.6l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.5
|
2585 |
+
l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.7-0.6l0.7-0.5l0.6-0.5l1-0.8l1-0.7l1-0.7l1-0.7
|
2586 |
+
l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l2-1.3l4-2.6l2-1.3l2-1.3l1-0.6l1-0.6l0.9-0.6l0.9-0.6l0.9-0.6l0.9-0.6l0.9-0.7l0.9-0.7
|
2587 |
+
l0.9-0.7l0.9-0.7l0.9-0.7l0.9-0.7l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l2-1.5l2-1.5l2-1.5l2-1.5l2-1.5l2-1.4l2-1.4
|
2588 |
+
l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2.1-1.4l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3
|
2589 |
+
l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3
|
2590 |
+
l2.1-1.3l2.1-1.2l2.1-1.2l2.1-1.2l2.1-1.2l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l1.8-1l1.7-1l1.7-1l1.7-1l1.8-1l1.7-1
|
2591 |
+
l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.2l1.7-1.2l1.7-1.2l3.5-2.4
|
2592 |
+
l3.5-2.4l3.5-2.4l3.5-2.4l6.9-4.8l3.5-2.4l3.5-2.4l3.5-2.4l1.7-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.1
|
2593 |
+
l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1l1.8-1l1.8-1l1.8-1l1.8-1l1.8-1l1-0.5
|
2594 |
+
v-0.2l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.8l0.1-0.8l0.1-1.5l0.2-3l0.1-1.4l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
|
2595 |
+
l0.1-0.4l0.1-0.4l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
|
2596 |
+
l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
|
2597 |
+
l0.4-0.5l0.4-0.5l0.8-0.9l0.8-0.9l0.8-0.9l0.8-0.9l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l1.5-1.5l1.5-1.4l1.4-1.3l0.6-0.6
|
2598 |
+
l0.6-0.6l0.3-0.3l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
|
2599 |
+
l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.5-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
|
2600 |
+
l0.5-0.2l0.5-0.2l0.5-0.2l0.9-0.4l1-0.4l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.1l1-0.1l1-0.1l1-0.1
|
2601 |
+
l1-0.1l1-0.1h1h1h1L-30.6-41.7z M-356,204.7l-0.1-0.1l-0.2-0.3v-0.1L-356,204.7z"
|
2602 |
+
/>
|
2603 |
+
<path
|
2604 |
+
d="M-5.6-32.2l0.8,0.1l0.7,0.2l0,0l0.7,0.2l0.7,0.3l0.6,0.3l0,0l0.8,0.5l0.7,0.6l0,0l0.4,0.4l0.4,0.5l0.3,0.3
|
2605 |
+
l0.4,0.5l0.3,0.4l0.3,0.6l0.3,0.5l0.3,0.5l0.4,0.9l0.4,0.9l0.2,0.3l0.1,0.3l0.1,0.1l0,0l0.1,0.1l0.2,0.2l0.6,0.6l0.4,0.4L5-22
|
2606 |
+
l0.4,0.6L5.7-21l0.2,0.4l0.3,0.4l0.3,0.4l0.3,0.5L7-18.8l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.6L8-16.1l0.1,0.4l0.1,0.5l0.1,0.4
|
2607 |
+
l0.1,0.5l0.2,0.5l0.2,0.6L9-12.6l0.2,0.7l0.2,0.7l0.3,0.7L10-9.7l0.3,0.8l0.3,0.8l0.3,0.8l0.3,0.8l0.4,0.8L12-4.9l0.4,0.8
|
2608 |
+
l0.4,0.8l0.4,0.8l0.2,0.3l0.2,0.3l0.2,0.3L14-1.3L14.2-1l0.2,0.3l0.2,0.3l0.2,0.3L15,0.2l0.2,0.2l0.2,0.2l0.2,0.2L15.8,1l0.1,0.2
|
2609 |
+
L16,1.4l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.2,0.1L17,2.1l0.5,0.3L18,2.7L18.5,3L19,3.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4L21,5.3
|
2610 |
+
l0.4,0.4l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.4L23,7.7l0.3,0.4l0.3,0.4l0.2,0.4L24,9.3l0.2,0.4l0.2,0.4l0.2,0.4l0.4,0.7l0.3,0.7
|
2611 |
+
l0.3,0.7l0.3,0.7l0.3,0.6l0.3,0.6l0.5,1.1l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.3l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
|
2612 |
+
l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0,0l0.1,0.1l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5
|
2613 |
+
l0.4,0.5l0.4,0.5l0.4,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.6,1l0.6,1l0.6,1l0.6,1l0.5,1l0.5,1l0.5,1
|
2614 |
+
l0.5,1l0.5,1l0.5,1l0.5,1l0.5,1l0.4,1l0.4,1l0.4,1l0.4,1l0.4,1l0.4,1l0.8,2l0.8,2l1.5,4l0.8,2l0.8,2l0.4,1l0.4,1l0.4,0.9l0.4,0.9
|
2615 |
+
l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.5,0.8l0.2,0.3
|
2616 |
+
l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.4l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.3,0.4l0.5,0.6l0.5,0.6l0.5,0.6l0.4,0.7
|
2617 |
+
l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
|
2618 |
+
l0.3,0.7l0.3,0.7l0.2,0.7l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.3l0.4,1.3l0.4,1.2l0.4,1.2l0.4,1.2l0.7,2.4l0.3,1.1l0.3,1.1
|
2619 |
+
l0.3,1.1l0.3,1.1l0.3,1.1l0.4,1.1l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.4
|
2620 |
+
l0.2,0.5l0.9,1.7l0.9,1.8l0.9,1.8l0.9,1.8l0.9,1.9l0.9,1.9l0.9,1.9l0.9,2l0.9,2l0.9,2l0.9,2l0.8,2l0.8,2.1l0.8,2.1l0.8,2.1
|
2621 |
+
l0.8,2.1l0.8,2.1l0.8,2.2l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.3,1.1l0.3,1.1
|
2622 |
+
l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.2l0.3,1.1l0.3,1.2
|
2623 |
+
l0.3,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.1,1.2
|
2624 |
+
l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1
|
2625 |
+
l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1
|
2626 |
+
l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.4,1.1l-0.4,1l-0.4,1l-0.4,1l-0.4,1
|
2627 |
+
l-0.4,1l-0.5,1l-0.5,1l-0.5,1.1l-0.3,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.3,0.2
|
2628 |
+
l-0.3,0.2l-0.4,0.2l-0.6,0.4l-0.6,0.3l-0.6,0.3L89,261l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-1,0.4l-1,0.3
|
2629 |
+
l-0.9,0.3l-0.8,0.3l-0.3,0.1l-0.3,0.1l-0.2,0.1L81,264l-0.1,0.1l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.3l-0.8,0.5l-0.8,0.4
|
2630 |
+
l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
|
2631 |
+
l-0.9,0.2l-0.9,0.2l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9h-0.9h-0.9h-0.9h-0.9H53h-0.9h-0.9h-0.9l-0.9-0.1
|
2632 |
+
l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
|
2633 |
+
l-0.8-0.2l-0.8-0.2l-0.8-0.2L35,269l-1.6-0.3l-1.6-0.4l-1.5-0.4l-1.5-0.4l-1.6-0.4l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.3
|
2634 |
+
l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-1.1-0.5l-2.1-1.1l-1-0.5l-0.9-0.4l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.1l-0.2-0.1
|
2635 |
+
l-0.2-0.1h-0.1h-0.3l-1-0.2l-0.9-0.3l-0.9-0.4l-0.9-0.5L9,259.1l-0.7-0.7l-0.6-0.8l-0.6-0.8l-0.5-0.9L6.2,255L6,254l-0.1-1v-1
|
2636 |
+
l0.1-1l0.2-1l0.3-0.9l0.4-0.9l0.5-0.9l0.6-0.8l0.7-0.7l0.8-0.6l0.8-0.6l0.9-0.5l0.9-0.4l1-0.3l1-0.1h1h0.3h0.5l0.5,0.1l0.5,0.1
|
2637 |
+
l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l1.1,0.5l1.1,0.5l2.1,1l1,0.5
|
2638 |
+
l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1h0.1h0.2l1.3,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3
|
2639 |
+
l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
|
2640 |
+
l0.7,0.1H52h0.6h0.6h0.6h0.6H55h0.6h0.6h0.6h0.6H58h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1
|
2641 |
+
l0.5-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.3l0.5-0.3l0.2-0.1l0.2-0.1
|
2642 |
+
l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.3l0.5-0.3l0.6-0.3l0.6-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.9-0.3l0.9-0.3l0.9-0.3
|
2643 |
+
l0.9-0.3l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.2-0.4l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.2-0.8
|
2644 |
+
l0.2-0.8l0.2-0.8l0.2-0.8l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9
|
2645 |
+
l0.1-0.9l0.1-0.9l0.1-0.9V221v-1v-1v-1v-1v-1v-1v-1v-1v-1v-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1
|
2646 |
+
l-0.1-1l-0.1-1l-0.1-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1
|
2647 |
+
l-0.2-1.1l-0.2-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1l-0.3-1l-0.3-1.1l-0.3-1
|
2648 |
+
l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.7-2l-0.8-2l-0.8-2l-0.8-2l-0.8-2
|
2649 |
+
l-0.8-2l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.8l-0.8-1.8l-0.8-1.8l-0.8-1.8l-0.8-1.7l-0.8-1.7l-0.8-1.7l-0.3-0.6
|
2650 |
+
l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.6l-0.2-0.7l-0.2-0.7l-0.2-0.6l-0.2-0.7l-0.4-1.3l-0.4-1.3
|
2651 |
+
l-0.4-1.2l-0.4-1.2l-0.4-1.2l-0.3-1.2l-0.7-2.3l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.4-1.1l-0.2-0.5l-0.2-0.5l-0.2-0.5
|
2652 |
+
L51,99.4l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5L50,96.9l-0.2-0.5l-0.2-0.5l-0.2-0.4l-0.2-0.4L49,94.7l-0.2-0.4l-0.2-0.4l-0.2-0.4
|
2653 |
+
l-0.2-0.4L48,92.7l-0.2-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4L46,89.9l-0.3-0.4L45.3,89l-0.4-0.5L44.5,88l-0.4-0.5
|
2654 |
+
L43.8,87l-0.3-0.5L43.2,86l-0.3-0.5L42.6,85l-0.3-0.5L42,84l-0.6-1l-0.6-1l-0.6-1l-0.6-1l-0.5-1l-0.5-1l-0.5-1l-0.5-1l-0.5-1
|
2655 |
+
l-0.5-1l-0.5-1l-0.5-1l-0.4-1l-0.4-1l-0.4-1L34,68l-0.4-1l-0.4-1l-0.8-2l-0.8-2l-1.5-4l-0.8-2l-0.8-2l-0.4-1l-0.4-0.9l-0.4-0.9
|
2656 |
+
l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8
|
2657 |
+
l-0.5-0.8l-0.5-0.7l-0.2-0.3l-0.2-0.4l-0.2-0.3l-0.2-0.3L20.1,37l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3L19,35.5l-0.2-0.3l-0.3-0.3
|
2658 |
+
l-0.3-0.3l-0.3-0.3L17.6,34l-0.3-0.3L17,33.4l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.4l-0.3-0.4L14.8,31l-0.3-0.4l-0.3-0.4
|
2659 |
+
l-0.3-0.4l-0.3-0.4L13.4,29l-0.2-0.4L13,28.2l-0.2-0.4l-0.4-0.7L12,26.4l-0.3-0.7L11.4,25l-0.3-0.6l-0.3-0.6l-0.5-1.1l-0.2-0.5
|
2660 |
+
l-0.2-0.5l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4L9,20l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1
|
2661 |
+
l-0.1-0.1L8.1,19l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l-0.2-0.1l-0.5-0.3l-0.6-0.4l-0.6-0.4l-0.6-0.4L5.1,17
|
2662 |
+
l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.4L2.9,15l-0.4-0.4l-0.4-0.5l-0.4-0.4l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5
|
2663 |
+
l-0.3-0.5l-0.3-0.5L-1,9.2l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.5-1l-0.5-1l-0.5-1l-0.5-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1
|
2664 |
+
l-0.4-1l-0.3-1l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.2-0.8L-8.5-9l-0.2-0.7l-0.2-0.2l-0.3-0.3l-0.4-0.4l-0.4-0.5l-0.4-0.5
|
2665 |
+
l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.3-0.7l-0.5-0.5l-0.5-0.8l-0.5-0.9l-0.4-0.9l-0.2-1
|
2666 |
+
l-0.1-1v-0.5v-0.5v-0.7l0.1-0.7v-0.1l0.1-0.7l0.2-0.7l0.2-0.6l0,0l0.3-0.7l0.4-0.7l0.4-0.7l0,0l0.6-0.7L-12-29l0.7-0.5l0.7-0.5
|
2667 |
+
l0,0l0.7-0.4l0.8-0.3l0.8-0.2l0.8-0.2l0.8-0.1l0,0h0.8L-5.6-32.2z M14.2,260.9h0.2l0,0H14H14.2z M2.1-22.5L2.1-22.5v-0.2V-22.5z
|
2668 |
+
M2.1-23.1v-0.5v-0.2V-23.1z"
|
2669 |
+
/>
|
2670 |
+
<path
|
2671 |
+
d="M-358.4,223.5l1.1,0.2l0,0l0.6,0.2l0.6,0.2l0.2,0.1l1.3,0.5l1.7,0.7l0.7,0.3l0.5,0.2l0.2,0.1l0.2,0.1
|
2672 |
+
l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1.2,0.2l1.3,0.3l0.7,0.2l0.8,0.2l0.8,0.2l0.7,0.2
|
2673 |
+
l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.8,0.1
|
2674 |
+
l0.8,0.1l1.6,0.1l1.6,0.1l1.7,0.1l1.7,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1,0.1l1,0.1l1,0.2l1,0.2l0.9,0.2l1.2,0.2
|
2675 |
+
l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.1l1.2,0.1
|
2676 |
+
l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l2.6,0.2l2.6,0.1l2.6,0.1
|
2677 |
+
l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1h2.6h2.6h2.6h2.6h2.5h2.5h5h5.3h5.3h5.3l5.3,0.1l5.3,0.1l5.3,0.1
|
2678 |
+
l5.3,0.1l5.3,0.1l5.3,0.1l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.3l5.3,0.3l5.3,0.3
|
2679 |
+
l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.4l5.3,0.4l5.2,0.4l1.7,0.1l1.7,0.1l3.4,0.2l3.4,0.2
|
2680 |
+
l3.4,0.2l3.5,0.2l3.5,0.2l3.5,0.1l3.5,0.1l3.5,0.1l3.5,0.1l3.5,0.1l3.4,0.1h3.4h3.4h3.4h3.3h0.6h0.6h0.7h0.7h0.7l0.8-0.1l1.7-0.1
|
2681 |
+
l1.8-0.1l1.9-0.1l1-0.1l1-0.1l1-0.1l1-0.1h1h1.1h1.1h1.1h1.1h0.6h0.5h0.5h0.5h0.5h0.5l0.5,0.1L12,245l0.6,0.1l0.5,0.1l0.6,0.1
|
2682 |
+
l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.4,0.2l1,0.5l0.9,0.7l0.8,0.8l0.7,0.9
|
2683 |
+
l0.6,0.9l0.5,1l0.3,1.1l0.2,1.1l0.1,1.1l-0.1,1.1l-0.2,1.1l-0.4,1.1l-0.5,1l-0.6,0.9l-0.7,0.9l-0.8,0.8l-0.9,0.7l-1,0.5l-1,0.4
|
2684 |
+
l-1.1,0.3l-1.1,0.1h-1.1l-1.1-0.1l-1.1-0.3l-1-0.4l-0.2-0.1l0,0h-0.1h-0.1H12h-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.3h-0.3H9.8
|
2685 |
+
H9.5H9.2H8.9H8.6H8.3H7.9H7.6H6.8H6H5.2H4.4H3.5H2.6l-0.9,0.1l-0.9,0.1l-0.9,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-0.9,0.1l-0.9,0.1
|
2686 |
+
h-0.9h-0.9H-10h-0.8h-3.5h-3.5h-3.5h-3.5l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.2l-3.5-0.2l-3.5-0.2
|
2687 |
+
l-3.5-0.2l-3.5-0.2l-1.7-0.1l-1.7-0.1l-5.2-0.4l-5.2-0.4l-5.2-0.4l-5.2-0.4l-5.2-0.3l-5.2-0.3l-5.2-0.3l-5.3-0.3l-5.2-0.3
|
2688 |
+
l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2
|
2689 |
+
l-5.3-0.1l-5.3-0.1l-5.3-0.1l-5.3-0.1l-5.2-0.1l-5.2-0.1l-5.2-0.1h-5.2h-5.2h-5.2h-5.1h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6
|
2690 |
+
l-2.6-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.2l-2.7-0.2l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1
|
2691 |
+
l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2
|
2692 |
+
l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.2-0.2l-0.7-0.1l-0.7-0.1
|
2693 |
+
l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.8-0.1l-0.8-0.1l-1.6-0.1l-1.6-0.1l-1.7-0.1l-1.7-0.1l-0.9-0.1
|
2694 |
+
l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-1-0.1l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1
|
2695 |
+
l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1.2-0.2l-1.3-0.3l-0.7-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.4-0.1
|
2696 |
+
l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.8-0.3l-0.9-0.4l-1.7-0.8l-0.8-0.3l-0.7-0.3l-0.3-0.1l-1-0.6l-0.9-0.7l-0.8-0.8
|
2697 |
+
l-0.7-0.9l-0.6-1l-0.4-1l-0.3-1.1l-0.2-1.1v-1.1l0.1-1.1l0.3-1.1l0.4-1.1l0.5-1l0.7-0.9l0.8-0.8l0.9-0.7l1-0.6l1-0.5l1.1-0.4
|
2698 |
+
l1.1-0.2l1.1-0.1L-358.4,223.5z"
|
2699 |
+
/>
|
2700 |
+
<path
|
2701 |
+
d="M-365,199.4h0.3h0.3h0.3l0.4,0.1l0.7,0.2l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.1l0.2,0.1l0.2,0.1l0.2,0.1
|
2702 |
+
l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2h0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.2l0.2,0.2
|
2703 |
+
l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3v0.1l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.1l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
|
2704 |
+
l0.1,0.3v0.3v0.1v0.3v0.3v0.3v0.3v0.3v0.1v0.3v0.3v0.3v0.3l-0.1,0.3v0.1l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3v0.1l-0.1,0.3
|
2705 |
+
l-0.1,0.3l-0.1,0.3l-0.2,0.4l-0.4,0.7l-0.3,0.5l-0.3,0.4l-0.3,0.4l-0.5,0.6l-0.5,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.7,0.6
|
2706 |
+
l-0.7,0.6l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.1,0.1l-0.1,0.5v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.2v0.2v0.2
|
2707 |
+
v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l0,0v0.1h0.1l0.1,0.1h0.1l0.1,0.1
|
2708 |
+
l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.1l0.3,0.1l0.3,0.1
|
2709 |
+
l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
|
2710 |
+
l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3
|
2711 |
+
v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3
|
2712 |
+
l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
|
2713 |
+
l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3
|
2714 |
+
h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.3l-0.7-0.3l-0.6-0.3l-0.6-0.3
|
2715 |
+
l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.4-0.5l-0.4-0.5
|
2716 |
+
l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6
|
2717 |
+
l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.5l-0.1-0.6v-0.6v-0.5v-0.5v-0.5v-0.5v-0.5v-0.6v-0.5
|
2718 |
+
v-0.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-1l0.1-1l0.2-1.1l0.1-0.7l0.2-0.7l0.2-0.7l0.2-0.6l0.3-0.6l0.3-0.5l0.3-0.5
|
2719 |
+
l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.4-0.4l0,0l0.1-0.2l0.1-0.3
|
2720 |
+
l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2
|
2721 |
+
l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3
|
2722 |
+
L-365,199.4z M-366.9,217h0.1H-366.9L-366.9,217z"
|
2723 |
+
/>
|
2724 |
+
</g>
|
2725 |
+
</g>
|
2726 |
+
</g>
|
2727 |
+
</svg>
|
{images/previews → assets/img}/cap.jpg
RENAMED
File without changes
|
{images/previews → assets/img}/collection.jpg
RENAMED
File without changes
|
assets/img/grid.svg
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="231" height="252" fill="none">
|
2 |
+
<rect width="65.374" height="65.374" x=".162" y=".779" fill="#E1E3E6" rx="3"/>
|
3 |
+
<rect width="47.266" height="5.148" x="9.216" y="76.153" fill="#E1E3E6" rx="2.574"/>
|
4 |
+
<rect width="62.8" height="15" x="1.565" y="101.448" fill="#E1E3E6" rx="5"/>
|
5 |
+
<rect width="65.374" height="65.374" x=".162" y="136.277" fill="#E1E3E6" rx="3"/>
|
6 |
+
<rect width="47.266" height="5.148" x="9.216" y="211.651" fill="#E1E3E6" rx="2.574"/>
|
7 |
+
<rect width="62.8" height="15" x="1.565" y="236.946" fill="#E1E3E6" rx="5"/>
|
8 |
+
<rect width="65.374" height="65.374" x="82.478" y=".779" fill="#E1E3E6" rx="3"/>
|
9 |
+
<rect width="47.266" height="5.148" x="91.532" y="76.153" fill="#E1E3E6" rx="2.574"/>
|
10 |
+
<rect width="62.8" height="15" x="83.882" y="101.448" fill="#E1E3E6" rx="5"/>
|
11 |
+
<rect width="65.374" height="65.374" x="82.478" y="136.277" fill="#E1E3E6" rx="3"/>
|
12 |
+
<rect width="47.266" height="5.148" x="91.532" y="211.651" fill="#E1E3E6" rx="2.574"/>
|
13 |
+
<rect width="62.8" height="15" x="83.882" y="236.946" fill="#E1E3E6" rx="5"/>
|
14 |
+
<rect width="65.374" height="65.374" x="164.788" y=".779" fill="#E1E3E6" rx="3"/>
|
15 |
+
<rect width="47.266" height="5.148" x="173.843" y="76.153" fill="#E1E3E6" rx="2.574"/>
|
16 |
+
<rect width="62.8" height="15" x="166.192" y="101.448" fill="#E1E3E6" rx="5"/>
|
17 |
+
<rect width="65.374" height="65.374" x="164.788" y="136.277" fill="#E1E3E6" rx="3"/>
|
18 |
+
<rect width="47.266" height="5.148" x="173.843" y="211.651" fill="#E1E3E6" rx="2.574"/>
|
19 |
+
<rect width="62.8" height="15" x="166.192" y="236.946" fill="#E1E3E6" rx="5"/>
|
20 |
+
<rect width="6.177" height="6.177" x="13.283" y="86.301" fill="#E1E3E6" rx="3"/>
|
21 |
+
<rect width="6.177" height="6.177" x="21.498" y="86.301" fill="#E1E3E6" rx="3"/>
|
22 |
+
<rect width="6.177" height="6.177" x="29.713" y="86.301" fill="#E1E3E6" rx="3"/>
|
23 |
+
<rect width="6.177" height="6.177" x="37.927" y="86.301" fill="#E1E3E6" rx="3"/>
|
24 |
+
<rect width="6.177" height="6.177" x="46.238" y="86.301" fill="#E1E3E6" rx="3"/>
|
25 |
+
<rect width="6.177" height="6.177" x="95.599" y="86.301" fill="#E1E3E6" rx="3"/>
|
26 |
+
<rect width="6.177" height="6.177" x="103.814" y="86.301" fill="#E1E3E6" rx="3"/>
|
27 |
+
<rect width="6.177" height="6.177" x="112.029" y="86.301" fill="#E1E3E6" rx="3"/>
|
28 |
+
<rect width="6.177" height="6.177" x="120.243" y="86.301" fill="#E1E3E6" rx="3"/>
|
29 |
+
<rect width="6.177" height="6.177" x="128.554" y="86.301" fill="#E1E3E6" rx="3"/>
|
30 |
+
<rect width="6.177" height="6.177" x="177.909" y="86.301" fill="#E1E3E6" rx="3"/>
|
31 |
+
<rect width="6.177" height="6.177" x="186.124" y="86.301" fill="#E1E3E6" rx="3"/>
|
32 |
+
<rect width="6.177" height="6.177" x="194.339" y="86.301" fill="#E1E3E6" rx="3"/>
|
33 |
+
<rect width="6.177" height="6.177" x="202.553" y="86.301" fill="#E1E3E6" rx="3"/>
|
34 |
+
<rect width="6.177" height="6.177" x="210.864" y="86.301" fill="#E1E3E6" rx="3"/>
|
35 |
+
<rect width="6.177" height="6.177" x="13.283" y="221.798" fill="#E1E3E6" rx="3"/>
|
36 |
+
<rect width="6.177" height="6.177" x="21.498" y="221.798" fill="#E1E3E6" rx="3"/>
|
37 |
+
<rect width="6.177" height="6.177" x="29.713" y="221.798" fill="#E1E3E6" rx="3"/>
|
38 |
+
<rect width="6.177" height="6.177" x="37.927" y="221.798" fill="#E1E3E6" rx="3"/>
|
39 |
+
<rect width="6.177" height="6.177" x="46.238" y="221.798" fill="#E1E3E6" rx="3"/>
|
40 |
+
<rect width="6.177" height="6.177" x="95.599" y="221.798" fill="#E1E3E6" rx="3"/>
|
41 |
+
<rect width="6.177" height="6.177" x="103.814" y="221.798" fill="#E1E3E6" rx="3"/>
|
42 |
+
<rect width="6.177" height="6.177" x="112.029" y="221.798" fill="#E1E3E6" rx="3"/>
|
43 |
+
<rect width="6.177" height="6.177" x="120.243" y="221.798" fill="#E1E3E6" rx="3"/>
|
44 |
+
<rect width="6.177" height="6.177" x="128.554" y="221.798" fill="#E1E3E6" rx="3"/>
|
45 |
+
<rect width="6.177" height="6.177" x="177.909" y="221.798" fill="#E1E3E6" rx="3"/>
|
46 |
+
<rect width="6.177" height="6.177" x="186.124" y="221.798" fill="#E1E3E6" rx="3"/>
|
47 |
+
<rect width="6.177" height="6.177" x="194.339" y="221.798" fill="#E1E3E6" rx="3"/>
|
48 |
+
<rect width="6.177" height="6.177" x="202.553" y="221.798" fill="#E1E3E6" rx="3"/>
|
49 |
+
<rect width="6.177" height="6.177" x="210.864" y="221.798" fill="#E1E3E6" rx="3"/>
|
50 |
+
</svg>
|
assets/img/no-matching-products.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg viewBox="0 0 797.12 564.08" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m216.92 118.87 1 .15 1 .25.61.2.7.28.25.12.67.35.25.13.63.4.54.37.78.63.7.7.63.72.55.73.52.8.42.77.36.81.29.8.23.8.17.77.11.77.07.71v2.14l-.13 1.16-.22 1.2-.26 1.17-.34 1.13-.45 1.07-.42 1.1-.45 1.1-.5 1.09-.28.61.41.57.37.6.08.13.27.52.22.53.06.17.3 1v.18l.07.28.72-.48.75-.48.76-.47.79-.45.83-.43.9-.4 1-.39.73-.23.79-.18.4-.09.76-.11.49-.07h1.35l.78.08h.17l.86.17h.15l.95.3.14.05.5.2.46.23.14.08.5.29.46.33.14.08.43.35.42.39.11.1.39.4.36.43.1.12.32.41.28.45.09.14.45.86.08.17.3.8.07.18.21.74.12.53.13.85.07.82v1.21l-.07 1.2-.13 1.19-.2 1.15-.27 1.11-.31 1.09-.35 1.06-.09.24.62-.34 1-.55 1.1-.53 1.12-.48.72-.29.71-.23.8-.22.87-.18.62-.08.76-.07h1.52l.57.07.57.1.25.05.63.17.63.21.24.09.68.3.67.38.2.12.66.45.62.51.18.17.55.57.5.61.15.2.4.6.35.64.14.25.25.56.21.6.1.3.22.84.17.8.15 1.11.06 1.1v1.67h.17l1.45-.08h2.88l1.44.07 1.43.11 1.42.15 1.41.2 1.42.24 1.4.26.58.12 1.14-.27 1.35-.25 1.35-.18 1.38-.15 1.4-.1h5.85l1.52.08 1.55.12 1.58.15 1.6.17 1.63.2 1.65.21 1.67.25 1.7.27 1.7.3 1.73.32 1.74.35 1.75.35 1.76.38 1.79.4 1.78.42 1.8.43 1.78.47 1.8.46 1.8.49 1.8.5 1.79.51 1.78.54 1.78.53 1.77.57 1.77.55 1.75.58 1.71.58 1.72.6 1.7.6 1.67.62 1.65.62 1.61.63 1.6.63 1.57.64 1.53.65 1.52.65 1.47.66 1.43.65 1.4.67 1.37.67 1.31.68 1.29.68 1.23.69 1.2.68 1.17.7 1.1.72 1.08.71 1 .74 1 .76.95.8.91.84.85.86.74.82.66.8.64.83.6.85.56.87.52.87.48.88.47.9.42.9.4.9.36.92.35.91.32.94.28.91.27.94.25.93.22.93.2.94.18.93.17.93.16.94.14 1 .23 1.84.17 1.86.13 1.87.1 1.85.07 1.83v1.15l.09.14.83 1.38.82 1.43.78 1.47.73 1.48.7 1.52.65 1.52.29.68.56.05h.15l.87.17h.15l.88.27h.14l.8.35.15.07.73.4.13.1.65.45.14.1.56.46.37.35.55.59.3.38.48.67.22.31.45.79.35.7.42 1 .31 1 .25 1 .2.93.17.92.12.92.08.91.08.92.05.93v4.82l-.08 2-.12 2-.17 2.05-.18 2.07v.62l.15.35.32.8.25.8.23.8.18.8.14.78.1.78.08.77v.53l.18-.21 1.23-1.6.65-.8.55-1.15.42-.8.38-.69.37-.6.52-.83.7-1.07.85-1.26 1-1.4.58-.77.58-.77.64-.8.66-.78.69-.82.73-.8.77-.8.81-.78.87-.78.92-.77 1-.75 1-.67.62-.36.6-.34.61-.31.65-.3.7-.27.74-.25.78-.22.82-.16.86-.14.92-.06h.93l1 .08 1 .15 1 .25 1 .33.94.42.9.5.83.55.78.62.65.6.59.6.5.53.48.57.47.56.45.57.41.6.42.58.38.62.39.6.38.67.63 1.21.6 1.29.55 1.3.49 1.33.43 1.33.38 1.35.34 1.37.3 1.38.25 1.39.21 1.4.19 1.41.13 1.42.12 1.43.08 1.44.05 1.45v3.91l.66.27.72.4.13.07.65.43.6.48.14.12.48.47.45.51.12.14.33.46.32.47.1.17.45.85.08.2.3.71.18.54.22.83.15.77.1.73.07.7.05.68v3.29l-.06 1.61-.12 1.62-.17 1.62-.2 1.6-.25 1.58-.3 1.58-.33 1.57-.38 1.55-.4 1.55-.45 1.53-.49 1.54-.51 1.51-.55 1.5-.59 1.49-.6 1.48-.63 1.47-.67 1.46-.68 1.45-.7 1.44-.73 1.43-.75 1.42-.77 1.41-.78 1.4-.82 1.39-.82 1.38-.85 1.37-.85 1.36-.86 1.35-.87 1.34-.9 1.35-.43.61-.77 3.07-.43 1.63-.42 1.54-.42 1.43-.43 1.4-.59 1.56-.5 1.4-.55 1.4-.6 1.49-.68 1.56-.75 1.7-1.82 4.05-.36.75-.44.82-.46.83-.52.84-.55.83-.58.85-.62.85-.68.87-.77.86-.83.84-.6.51-.64.5-.46.3-.67.4-.18.1-.49.24-.5.21-.16.07-.67.22-.68.16h-.17l-.93.13h-1.09l-.76-.05-.75-.14-.75-.2-.14-.05-.78-.28-.43-.22-1.45 2-1.33 1.88-.24.35-.23.37-.23.38-.22.4-.52 1-.51 1.05-.54 1.16-.58 1.25-.62 1.32-.66 1.38-.74 1.4-.41.77-.45.75-.47.75-.5.77-.55.76-.58.77-.64.75-.7.75-.73.73-.8.72-.4.32-.45 1.06-.8 1.84-.8 1.8-.83 1.76-.84 1.75-.85 1.74-.88 1.7-.88 1.66-.92 1.65-.93 1.62-.95 1.57-1 1.55-1 1.5-1 1.48-1 1.43-1.08 1.39-1.1 1.35-1.15 1.3-1.15 1.23-.62.63-.61.6-.62.59-.63.56-.64.55-.65.55-.66.52-.67.52-.7.5-.75.51-.57.35-.7.37-.43.2-.73.27-.15.05-.85.23h-.14l-1 .15h-1.98l-.59-.09h-.11l-.62-.13-.6-.19h-.1l-.57-.21-.55-.27-.1-.05-.51-.3-.5-.32-.09-.08-.43-.32-.38-.35-.1-.08-.65-.7-.09-.1-.51-.65-.07-.12-.53-.88-.13-.31-.23-.46-.18-.49-.12-.31-.25-.77-.08-.32v.05l-.2 1.15-.24 1.1-.26 1.07-.3 1.05-.34 1-.36 1-.44 1-.5 1-.4.65-.4.6-.75.94-.73.85-.77.8-.8.76-.81.72-.85.68-.89.64-.88.58-.92.55-.91.5-.95.47-.95.41-1 .39-1 .35-1 .3-1 .26-1 .24-1 .18-1 .17-1 .13-1 .1-1 .07-1 .05h-2l-1-.05-1-.05-1-.1-1-.12-1-.13-1-.15-.95-.19-.95-.21-.95-.22-.94-.25-.15-.05-.06.07-.84.55-.83.55-.87.51-.88.49-.9.46-.92.45-.93.4-.95.39-1 .35-1 .31-.8.22-.81.18-.79.15-.8.14-.76.08-.77.07h-2.98l-1.34-.08-1.33-.15-1-.14-.2.1-1.17.59-1.2.55-1.23.51-1.25.45-1.28.4-1.27.34-.72.16-.68.14-.7.1-.7.08-.72.07h-2.26l-.79-.06-.81-.1-.84-.17-.85-.22-.88-.28-.87-.37-.88-.43-.8-.5-.82-.57-.71-.55-.22-.18-.92.2-1.48.3-1.48.25-1.42.18-.8.09-.73.05h-2.35l-.82-.07-.88-.13-.89-.18-.88-.25-.83-.29-.8-.33-.77-.38-.75-.4-.7-.45-.67-.49-.63-.5-.6-.51-.55-.54-.19-.55-.49-.57-.46-.58-.44-.59-.4-.58-.38-.62-.35-.6-.32-.6-.31-.61-.3-.67-.5-1.18-.44-1.24-.38-1.25-.33-1.25-.27-1.25-.22-1.25-.18-1.25-.13-1.25-.09-1.25-.01-1.21v-2.42l.07-1.2.11-1.2.15-1.18.2-1.17.24-1.17.3-1.15.36-1.15.42-1.15.48-1.06.34-.65.25-.42.5-.78.16-.24.59-.7.41-.46.65-.64.64-.56.65-.55.7-.57.71-.55-.06-.22-.19-.81-.13-.69-.1-.68-.07-.68v-.25l-.82.05h-.18l-.69-.05-.66-.09h-.17l-.85-.2-.82-.28h-.15l-.91-.44-.85-.55-.14-.1-.56-.45-.54-.5-.48-.55-.08-.11-.6-.84-.49-.9-.06-.15-.32-.8-.25-.81v-.19l-.14-.66-.06-.67v-1.78l.06-1 .14-1 .16-.95.22-.92.25-.92.28-.88.32-.85.35-.83.37-.84.38-.8.2-.4-.9-.53-1.92-1.17-1.91-1.2-1.94-1.25-1.97-1.29-2-1.3-2-1.34-2-1.35-2-1.4-2-1.4-2-1.43-2-1.45-1.95-1.48-2-1.49-1.93-1.5-1.95-1.53-1.92-1.53-1.92-1.54-1.88-1.55-1.88-1.56-1.85-1.57-1.57-1.58-1.8-1.58-1.79-1.59-1.75-1.56-1.71-1.57-1.7-1.57-.49-.45-.56.32-1.2.55-1.25.53-1.26.54-1.3.51-1.34.49-1.33.46-1.37.44-1.36.41-1.4.4-1.39.35-1.41.34-1.4.28-1.42.25-1.4.2-1.42.17-1.43.1-1.32-.02h-1.5l-.71-.05-.74-.06-.73-.09-.75-.11-.75-.15-.77-.19-.76-.21-.77-.27-.78-.3-.85-.4-.64-.35-.73-.47-.3-.2-.77-.61-.25-.24-.4-.36-.36-.4-.2-.25-.37-.45-.32-.49-.16-.25-.32-.51-.27-.54-.11-.28-.24-.53-.18-.57-.08-.3-.14-.55-.11-.55v-.3l-.06-.53v-2.09l.12-.83.11-.68.12-.4h-.4l-.85-.05-.48-.05-.79-.13-.78-.2-.78-.27-.74-.31-.73-.37-.68-.42-.64-.46-.58-.49-.37-.33-.51-.55-.49-.58v-.07l-.46-.72-.4-.76-.32-.8v-.09l-.21-.71-.14-.74-.08-.73v-.92l.07-.81v-.1l.12-.6.15-.62v-.12l.29-.8.06-.13.4-.85.17-.28.4-.65.37-.54.53-.7.5-.61.52-.59 1-1.1 1.06-1.13 1.05-1.13 1-1.17.47-.55.45-.55.43-.52.39-.51.33-.47.28-.42.09-.15-.09-.3-.15-.73v-.17l-.1-.88v-1.38l.07-.62.12-.62v-.11l.15-.64.22-.61v-.1l.26-.62.32-.58.05-.1.33-.52.35-.48.09-.09.33-.4.37-.38.08-.08.43-.39.45-.35.2-.15.74-.46.33-.75.42-.95.4-1 .4-1 .36-1 .37-1 .37-1.05.35-1.07.23-.73h-.67l-1-.06-1-.19-1-.31-.92-.42-.86-.53-.79-.64-.71-.73-.62-.8-.27-.47-1 .17-1 .05-1-.05-1-.19-.92-.28-.88-.37-.74-.46-.7-.51-.65-.59-.58-.63-.5-.7v-.08l-.44-.75-.36-.8-.27-.84v-.11l-.15-.69-.09-.68v-2.18l.13-1 .13-.82-.33-.5-.16.25-.54.71-.53.72-.55.68-.58.67-.64.67-.66.65-.77.66-.57.44-.63.41-.33.2-.84.45-.3.15-.85.34-.46.15-.47.11-.75.17h-.13l-.85.08h-1.48l-1-.11-.52-.1-.48-.14-.79-.26-.11-.05-.82-.35-.12-.07-.78-.47-.12-.06-.76-.59-.1-.08-.69-.65-.08-.08-.63-.75-.07-.1-.5-.74-.07-.11-.4-.77v-.12l-.21-.51-.19-.55-.08-.25-.15-.62-.12-.63v-.29l-.08-1v-1.83l.15-.93.19-.85.21-.77.24-.73.23-.69.28-.7.5-1.2.57-1.2.57-1.13.56-1.07 1-1.83.82-1.5.58-1.08.65-1.14.65-1.11.67-1.1.67-1.09.66-1.08 1.35-2.05 1.35-2 1.32-2 1.3-1.94 1.27-1.9 3.05-4.7.15-.26 1-1.94 1.39-2.6.45-.86-.17-1-.25-1.65-.22-1.67-.18-1.7h-.2l-1-.07h-.1l-.95-.16-.93-.29h-.1l-.8-.35-.75-.4-.1-.07-.59-.4-.55-.43-.1-.1-.4-.38-.38-.4-.1-.12-.55-.72-.3-.41-.42-.72-.31-.67-.25-.56-.3-.79-.27-.73-.25-.75-.25-.78-.42-1.47-.36-1.52-.3-1.53-.25-1.53-.2-1.54-.15-1.56-.1-1.55v-4.7l.08-1.59.12-1.56.16-1.59.22-1.58.23-1.58.27-1.59.32-1.56.05-.25-.27-.42-.42-.7-.36-.68-.32-.7-.3-.7-.25-.7-.22-.69-.18-.7-.15-.66-.13-.69-.12-.73-.15-1.23-.08-1.3v-2.54l.07-1.23.12-1.22.15-1.2.18-1.2.22-1.16.23-1.15.25-1.14.27-1.11.26-1.09.3-1.06.3-1.07.6-1.95.6-1.83.57-1.67 1-2.68.36-.95.4-1 .42-1 .47-1 .48-1 .5-1.05.55-1 .57-1.07.58-1.08.62-1.09.63-1.1.67-1.1.68-1.11.72-1.12.73-1.12.75-1.13.78-1.13.8-1.14.82-1.13.83-1.13.87-1.14.88-1.13.9-1.13.92-1.14.93-1.11 1-1.1 1-1.12 1-1.08 1-1.09 1-1.06 1-1.07 1-1 1.06-1 1.09-1 1.1-1 1.11-1 1.14-1 1.15-.94 1.15-.9 1.18-.86 1.18-.85 1.2-.84 1.24-.78 1.23-.77 1.25-.71 1.27-.7 1.28-.65 1.3-.62 1.32-.57 1.33-.53 1.35-.48 1.37-.42 1.4-.38 1.4-.32 1.43-.27 1.38-.2.79-.06.73-.07h3.7l.75.07.73.08.75.1.75.12.75.15.75.16.74.19.75.21.88.27.47.2.81.37.2.1.84.5.16.11.79.62.15.13.71.7.14.15.63.79.12.16.48.77.08.18.39.8.08.19.27.73.18.55.18.88.12.84.05.76v1.52l-.11 1.13-.14.65.24-.15 1-.56.62-.3.6-.27.63-.25.65-.23.7-.22.72-.18.78-.15.82-.12h1.75zm129.63 298.13.09.2.06.2v-.6zm-128.31-72.17.33.25-.1-.31zm-4.72-18.38v2.33h.5l.16-.05-.48-2-.12-.5zm84.25-11.62.4 1.1.33 1.12.3 1.12.25 1.11.24 1.14.2 1.16.06.49.17-.55.2-.79.15-.73.13-.73v-3.09l-.09-.07-.31-.25-.35-.28-.35-.25-.34-.23-.33-.22-.32-.2-.25-.15zm-143.22-.53v.05zm83.1-12.25-.36 1-.34 1-.31 1-.3 1-.29.95-.28.95-.23.95-.24.94-.21.93-.2.92-.07.35.48-.55.89-1.07.1-.53.4-2 .45-2 .45-2 .45-1.85-.27-.17zm-55.83 6.58-.22.7.5.1-.11-1.2v-.2zm235.7-17.1-1.75 1.94-1.2 1.33.05.18.18.77.15.75.12.77.1.73.07.75.05.73v1.4l.05-.06.75-1.45.75-1.4.75-1.35.25-.45v-.07l.18-1.32.19-1.31.16-1.32.14-1.3.06-.55zm.3-19-.38 1.13-.42 1.1-.47 1.1-.35.84.49.21.88.54.8.65.65.66-.07-1.1-.08-1.05-.1-1-.12-1-.15-.95-.16-.91-.19-.87-.06-.22zm-60-41.38.47-.07.71-.08h.42l-.1-.06-.42-.25-.42-.24-.4-.2-.4-.18-.23-.12zm-7.7-26.54.23 1.3.24 1.09.08.36.1.37.42 1.53.73 2.67.15.55h2.73l1 .06 1 .12 1 .13 1 .19.86.2-.06-.2-.19-.5-.18-.47-.2-.47-.2-.43-.22-.42-.21-.38-.24-.38-.23-.35-.23-.34-.25-.33-.25-.3-.24-.27-.23-.25-.33-.28-.42-.35-.52-.4-.6-.43-.7-.47-.76-.48-.84-.52-.91-.52-1-.55-.56-.3zm-105.47 1.85.19.64.31 1 .12.49.43.06 1.1.22-.45-.7-.78-1.23-.38-.65zm25.4-4.35h-2.76l-1.4.08-1.44.1-1.43.13h-.1l.1.12.48.51.49.52.48.5.52.5.5.48.53.47.53.47.54.46.55.45.55.44.4.3.43-.65.45-.64.43-.6.47-.58.48-.57.5-.58.54-.55.56-.57.62-.53.37-.32h-2.04zm48.82-10.11 1.37 1 .28.2.3.2.43.27.55.3.64.33.7.35 1.66.82 1.84.86 2 1 2.05 1 .9.46v-2.85l-1.25-.43-1.61-.55-1.62-.53-1.63-.52-1.65-.52-1.65-.5-1.67-.5-1.57-.45zm-121.77-39-1.35 1.3-1.35 1.34-1.35 1.36-1.35 1.37-1.35 1.36-1.33 1.4-1.32 1.4-1.31 1.42-1.3 1.43-1.3 1.44-1.29 1.45-1.25 1.46-.26.3-.49.92-1.58 3.05-3.22 6.16-.4.75.39-.51.56-.75.74-1 1.85-2.27 5.13-6.25 2-2.5 1.2-1.67 1.4-1.93 1.42-1.92 1.45-1.91 1.5-1.92 1.53-1.92 1.57-1.88.83-1 .82-.95.33-.36.35-.49zm480.9-96.23.8.13.52.13.76.25h.17l.9.4.15.07.55.3.52.35.11.08.57.44.53.5.1.1.39.41.36.45.4.55.55.87.47.9.38 1 .3.93.22 1 .15.94v.25l1.18-.84 1.73-1.23 1.8-1.27 1-.65 1-.63 1-.65 1-.62 1-.6 1.08-.58 1.12-.57 1.16-.51 1.17-.45.68-.25.65-.2.67-.19.67-.16.7-.15.71-.14.78-.13.76-.08h2.37l.8.09.83.13.84.17.81.23.82.27.82.33.8.37.76.43.75.47.72.5.73.56.64.57.63.65.55.67.5.7.45.71.38.72.34.72.28.71.25.7.2.72.17.68.11.69.1.66.09.74.08 1.23v1.28l-.05 1.27-.12 1.25-.16 1.25-.2 1.27-.25 1.26-.29 1.27-.33 1.28-.35 1.3-.38 1.3-.45 1.33-.43 1.33-.25.72h.55l.78-.05h1.57l.8.07.88.11.68.14.77.2.35.1.8.3.33.13.8.38.3.17.8.5.27.2.62.48h.05l.56-.23h.09l.75-.25.75-.18h.1l.91-.1h1l1 .1 1 .23h.09l.93.34.88.43h.09l.73.47.67.55.08.06.52.52.46.55.09.08.31.45.3.47.07.12.42.81.2.44.16.48.24.77.18.68.27 1.53.18 1.44.13 1.45.07 1.46v2.92l-.07 1.48-.1 1.49-.15 1.5-.18 1.5-.23 1.51-.25 1.52-.29 1.53-.31 1.54-.35 1.55-.37 1.56-.4 1.57-.4 1.48-.45 1.58-.46 1.58-.49 1.6-.5 1.6-.53 1.62-.53 1.6-.55 1.62-.59 1.63-1.18 3.23-1.22 3.24-1.3 3.25-1.29 3.23-1.3 3.2-1.31 3.17-1.32 3.13-2.57 6.12-2.46 5.87-1.15 2.8-1.1 2.71-1 2.62-1 2.48-.88 2.39-.38 1.1-.39 1.1-.33 1.05-.32 1-.28.95-.12.4-.16 1.25-.29 2.1-.36 2.7-.47 3.21-.52 3.57-.63 3.8-.34 2-.35 2-.38 2-.38 2-.42 2-.42 1.91-.45 1.87-.43 1.72-.48 1.75-.5 1.65-.27.85-.28.78-.28.78-.32.79-.32.75-.36.76-.39.77-.45.78-.53.8-.42.55-.48.59-.25.25-.53.53-.07.77-.13 1.2-.17 1.2-.2 1.2-.22 1.18-.26 1.2-.29 1.18-.3 1.2-.35 1.19-.35 1.18-.38 1.18-.42 1.19-.43 1.18-.45 1.18-.47 1.19-.5 1.18-.5 1.17-.53 1.18-.55 1.17-.55 1.16-.58 1.17-.59 1.17-.61 1.16-.64 1.17-1.26 2.28-1.32 2.29-1.37 2.26-.61.95-.4 2.07-.24 1.17-.3 1.35-.7 3-1.78 7.28-1 4.14-.52 2.15-.5 2.2-.5 2.23-.5 2.27-.46 2.26-.19.94.6.06.84.12.68.15.77.2.38.12.8.3.35.15.83.41.32.19.82.51.28.22.75.62.25.23.68.72.22.25.57.76.2.29.45.76.16.32.35.75.14.33.25.72.2.68.21 1 .14 1 .06.95v1.75l-.09.83-.11.82-.14.78-.16.78-.19.75-.2.75-.21.72-.25.73-.25.7-.29.75-.56 1.35-.64 1.35-.66 1.32-.7 1.3-.75 1.25-.77 1.23-.8 1.17-.82 1.13-.85 1.09-.86 1-.89 1-.51.51-.5.47-.52.47-.57.45-.61.45-.67.45-.77.43-.55.27-.7.3-.23.08-.9.28-.22.05-.58.12-.57.08h-.21l-.72.05h-.9l-.82-.1-.78-.17h-.18l-.85-.28-.82-.37-.17-.08-.78-.47-.73-.53-.15-.14-.6-.55-.55-.61-.14-.17-.31-.43-.3-.45-.47-.77-.55-1.07-.47-1.06-.38-1.07-.33-1.05-.27-1.07-.23-1.06-.19-1.07-.15-1.07-.11-1.08-.07-.82-1.13.55-1.33.76-1.33.8-1.34.84-1.36.86-1.35.89-1 .66-.07.62-.11.77-.14.75-.16.75-.2.73-.22.72-.23.71-.25.7-.29.69-.3.66-.31.65-.34.65-.35.64-.36.61-.39.62-.41.65-.79 1.12-.88 1.13-.92 1.08-1 1.05-1 1-1.05 1-.67.58-.13.53-.2.69-.25.66-.25.65-.29.62-.3.62-.31.56-.37.64-.67 1-.73 1-.77.92-.8.86-.81.8-.84.77-.83.7-.85.68-.85.64-.85.6-.85.56-.85.54-.83.51-.85.5-1.57.87-1.53.8-1.4.7-1.27.6-1 .47-.37.18-.47.25-1.36.75-1.59.88-.91.5-1 .47-1 .47-1.05.43-.72.23-.75.22-.51.1-.77.13h-.23l-.52.05h-1.47l-.73-.12h-.17l-1-.25-1-.4-.13-.07-.79-.42-.71-.48-.67-.58-.12-.1-.63-.67-.57-.75-.43-.75-.25.23-.8.62-.88.5-.94.4-1 .28-1 .17h-1l-1-.08-1-.2-1-.33-.92-.44-.85-.55-.67-.55-.78 2.35-1 2.9-.51 1.47-.33 1.38-.53 1.43-.55 1.45-.57 1.42-.6 1.4-.63 1.38-.67 1.39-.7 1.33-.75 1.28-.42.69-.41.65-.45.63-.47.63-.48.62-.5.62-.54.6-.63.65-.8.73-.65.52-.4.26-.68.44-.15.06-.47.25-.48.2-.14.05-.7.24-.71.18h-.12l-1 .13h-1.09l-.85-.08-.81-.17-.82-.25h-.07l-.83-.35-.77-.45-.73-.52-.07-.07-.58-.51-.53-.57-.49-.62-.05-.06-.46-.77-.4-.82v-.1l-.23-.61-.18-.64v-.11l-.16-.9v-.15l-.07-1v-1.19l.06-.7.15-1 .19-.88.2-.87.23-.85.25-.88.55-1.75v-.12l-.38-.48-.62-.95-.52-.95-.4-.9-.35-.88-.33-.87-.3-.9-.28-.92-.29-1-.28-1-.53-2.09-.57-2.25-.2-.86-.47-.09.14 1.07.1 1v1.89l-.11.85-.2.83-.29.8-.36.78-.55.87-.65.81-.75.72-.82.62-.9.51-1 .39-1 .28-.8.12-.1.81-.17 1-.2 1-.22 1-.26 1-.32 1-.37 1-.41 1-.5 1-.57 1-.65 1-.77 1-.81.87-.55.52-.52.41-.53.42-.57.38-.6.37-.65.33-1 .47-1 .38-1.05.34-1 .25-1 .18-1.05.12-1 .05h-1l-1-.06-1-.1-1-.14-.95-.18-.92-.23-.9-.25-.88-.29-.87-.31-.85-.34-.83-.35-.82-.38-.8-.4-.78-.43-.77-.44-.77-.45-.75-.48-.75-.48-.73-.49-.72-.51-.73-.54-1.35-1.05-1.49-1.04-1.32-1.14-1.26-1.16-1.22-1.19-.92-.91-.6.28-.66.28-.69.24-.71.2-.74.16-.76.12-.79.07h-1.6l-.8-.08-.8-.15-.76-.19-.77-.25-.73-.28-.67-.32-.75-.38-.68-.4-.67-.43-.65-.47-.63-.47-.6-.5-.57-.51-.55-.55-.53-.55-.5-.57-.49-.58-.45-.59-.43-.61-.42-.62-.38-.62-.37-.63-.35-.65-.33-.65-.1-.22-.37.32-.78.62-.87.51-.91.4-1 .3-1 .19h-1l-1-.07-1-.18-1-.3-.82-.47-.85-.51-.8-.62-.7-.72-.61-.8-.52-.86-.42-.92-.28-1-.18-1-.05-1 .06-1 .19-1 .3-1 .41-.91.54-.85.61-.79.59-.58.1-.13.11-.22.14-.28.16-.33.17-.39.18-.43.19-.45.4-1.1.41-1.22.42-1.33.43-1.4.9-3.12.94-3.3.48-1.71.5-1.74.53-1.73.55-1.73.59-1.74.61-1.71.65-1.67.37-.87.37-.83.38-.83.4-.82.42-.82.43-.8.48-.8.5-.78.54-.78.58-.77.62-.75.68-.75.75-.73.8-.7.9-.67.67-.43.08-.15.82-1.27.86-1.23.9-1.2.94-1.15 1-1.14 1-1 .57-.55.55-.51.56-.5.57-.5.58-.47.6-.47.62-.45.63-.43.64-.4.66-.4.67-.38.68-.37v-.01l.15-1.37.18-1.38.2-1.42.24-1.43.25-1.45.26-1.47.3-1.48.32-1.5.35-1.5.35-1.52.4-1.52.4-1.51.42-1.54.45-1.51.46-1.5.5-1.52.5-1.5.54-1.47.55-1.48.56-1.45.59-1.42.6-1.41.63-1.39.65-1.36.67-1.32.7-1.32.73-1.26.22-.35.45-1 .48-1.05.52-1 .53-1 .55-1 .58-1 .6-1 .65-1 .67-.93.7-.92.73-.9.79-.86.9-.95.51-.47.65-.52.42-.31.42-.27.8-.42.11-.06.52-.22.53-.2h.12l.67-.19.68-.11h.1l.82-.08h.91l.92.1.88.2h.1l.87.3.82.38.08.05.75.45.68.52.07.06.53.5.5.55.07.07.35.47.32.46.4.17.8.37.78.41.75.45.72.49.36.28.29-.25.73-.63.75-.62.77-.58.78-.59.8-.55.82-.55.83-.51.83-.49.87-.46.87-.45.9-.44.9-.4.91-.36.94-.35 1-.32 1-.28 1-.27 1-.23 1-.19 1-.16 1-.15 1-.1 1.05-.07h2.31l-.41-.61-.1-.17-.37-.67-.23-.5-.3-.78-.22-.67-.23-.85-.19-.78-.18-.78-.17-.8-.15-.79-.15-.81-.21-1.55-.15-1.57-.1-1.58v-3.15l.06-1.57.1-1.55.15-1.57.2-1.55.24-1.53.16-1.64.32-1.54.35-1.51.38-1.52.42-1.52.45-1.5.47-1.5.5-1.48.51-1.48.55-1.49.57-1.46.58-1.47.62-1.47.47-1.11v-.09l-.72-3.18-.68-3.2-.63-3.25-.25-1.35-.42.42-.7.75-.73.76-.75.75-.75.74-.79.71-.78.7-.8.69-.8.66-.83.65-.85.62-.87.6-.88.57-.92.55-.93.53-1 .48-1 .45-1 .42-1 .38-.82.24-.87.21-.6.09-.82.15h-1.97l-.55-.08h-.2l-.63-.14-.62-.18-.18-.07-.69-.26-.65-.34-.16-.08-.67-.42-.62-.46-.15-.12-.56-.52-.52-.56-.12-.14-.43-.58-.4-.63-.1-.17-.28-.55-.25-.58-.07-.19-.18-.53-.15-.53v-.22l-.15-.88v-.22l-.06-.77v-1.25l-.16-.56-.27-1.19-.2-1.23-.13-1.23-.07-1.22v-2.4l.1-1.18.14-1.19.18-1.16.22-1.17.25-1.15.28-1.15.32-1.15.33-1.15.37-1.15.4-1.15.41-1.13.12-.32-.18-.22-.42-.53-.4-.53-.38-.57-.37-.57-.35-.58-.33-.58-.3-.6-.27-.6-.27-.6-.23-.62-.23-.68-.35-1.19-.29-1.25-.2-1.25-.13-1.23-.07-1.23v-1.22l.07-1.22.11-1.18.17-1.17.23-1.16.27-1.14.3-1.13.33-1.1.39-1.1.41-1.08.44-1.07.46-1.05.5-1 .52-1 .55-1 .55-1 .6-1 .6-1 .62-1 .65-1 .65-.95.66-.93.69-.92.7-.92.71-.9.72-.88.72-.87.73-.86.75-.84.75-.83.75-.82.77-.81 1.5-1.52 1.53-1.47 1.52-1.4 1.51-1.31 1.5-1.24 1.45-1.13.75-.57.74-.51.71-.5.55-.37.12-1.4.27-3.25.33-3.22.35-3.18.38-3.1.39-3.18.28-2.12.33-2.4.42-2.6.25-1.38.25-1.42.28-1.45.32-1.47.33-1.5.37-1.5.4-1.51.43-1.52.47-1.52.52-1.51.55-1.5.6-1.5.63-1.44.37-.75.36-.73.4-.72.4-.71.42-.7.45-.7.47-.7.5-.67.51-.68.55-.65.59-.65.61-.64.67-.61.68-.59.74-.56.78-.55.82-.5.8-.44 1-.48.94-.42 1-.38.95-.37 1-.31 1-.29 1-.23 1-.22 1-.16 1-.12 1-.08h1l.42-.25.6-.33.61-.33.64-.32.65-.28.66-.29.69-.25.7-.23.71-.22.74-.18.75-.15.76-.13.77-.1.78-.05h1.62l.82.05.81.09.82.11.83.17.82.22.8.23.82.28.78.34.78.35.77.4.75.43.45.3.7-.47 1.52-.95.93-.57 1-.58 1.05-.6 1.13-.62 1.18-.65.97-.79 1.3-.65 1.35-.65 1.39-.63 1.41-.64 1.47-.6 1.48-.56 1.52-.54 1.53-.5 1.54-.43.81-.22.8-.18.82-.17.8-.15.83-.13.82-.1.85-.08.85-.07h2.65l.92.09 1 .15 1 .2 1 .25 1 .35 1 .41 1 .5.95.6.93.69.88.78.55.6.49.55.5.65.66 1 .55 1 .44 1 .31.85.27.76.15.54.3-.09 1-.31 1-.29 1-.26 1-.25 1-.22 1-.2 1-.17 1-.13 1.08-.08h1.08l.75.05zm-149 296.91-.48.89-.5.86-.5.84-.52.81-.15.22-.1.3-.38 1.12-.39 1v1.15l-.07 2.09v1.86l-.12 1-.1.42.33.33 1 .92 1 .88 1 .85 1 .8 1 .77.47.33.47.33.46.34.47.3.47.28.45.27.43.25.42.23.41.2.4.18.37.17.37.13.33.14.32.1.28.08.27.05.23.05h.15l.1-.33.08-.43.1-.49.09-.51.08-.59.07-.61.05-.67v-4.63l-.07-1.77-.1-1.82-.15-1.85-.18-1.9-.2-1.91-.13-1.1-3-.95-3.9-1.2-1.15-.34zm136.2-52.88-.48.6-1.13 1.42-1.22 1.53-1.3 1.65-.78 1 .76-.38 1.45-.68 1.44-.65.56-.25.14-.82.43-2.45.18-1zm-34.2 3.82-1.77 2.2.89-.09h1.23l1.12.05-.12-.65-.15-1.27-.08-1.26v-.34zm-29.5-12.25v.83l-.06.52-.1.5.75.41.45.29.68.5.57.5.55.51.66.74.65.8.55.81.49.8.43.82.38.82.32.8.3.8.25.81.23.8.2.8.1.42 1-1.3 2.62-3.28.75-.95-.45-.1-.72-.19-.71-.21-.72-.24-.7-.28-.7-.3-.7-.33-.67-.37-.66-.4-.64-.43-.63-.45-.62-.49-.6-.5-.56-.53-.84-.83-.78-.85-.75-.9-.27-.35zm-22-24.77-.78.58-.77.59-.75.58-.7.55-1.28 1.1-1.15 1-.93.85-.67.64-.32.31-.31.37-.34.4-.35.43-.35.49-.36.53-.37.57-.38.6-.39.63-.36.67-.39.7-.36.73-.39.77-.36.78-.35.8-.37.85-.35.85-.33.87 1.33-1.62 1.87-2.35 1.86-2.35 1.85-2.37 3.67-4.73 1.82-2.35 1.26-1.6zm17.12 13-.43 1.28-.45 1.3-.15.4.51.22.14.05.51.26.5.3.12.09.17.13-.24-.88-.23-1.07-.17-1.07-.13-1.06v-.37zm40.38-12.53-.45.7-1.48 2.23-1 1.5-1.07 1.68-1.26 1.82-.82 1.16.72-.55.55-.41.3-.39 2.91-3.85 1.59-2.11.26-2v-.18zm-17-4.55-.47.61-.45.64-.45.63-.43.63-.43.62-.4.63-.39.62-.1.17.12-.07 1.14-1.6 1.08-1.59 1-1.51v-.09zm-9.85-14.9h-1.32v.68l.1 1v.31l.37-.45 1.35-1.55zm-18.68-5.7-.5.86-.5.85-.54.84-.13.2h.5l.83.05.82.1v-3.72zm36.23-12.7-.32.95-.31.91-.34.9-.35.9-.35.85.67-.48 1-.73v-.62l.18-2.45.12-1.4zm52.73-36.69-1.6 3.79-.43 1 .43.14.82.31.77.4.55.38v-7.39zm-60.2-23.4-.46.72-.49.7-.45.72-.93 1.5-.88 1.51-.87 1.57-.83 1.58-.82 1.62-.78 1.65-.79 1.68-.73 1.7-.73 1.72-.52 1.27 1.9-2.92.13-.2.49-1.1.7-1.55.4-.85.41-.83.45-.85.49-.85.51-.87.57-.87.62-.86.7-.89.76-.86.57-.57.23-1 .39-1.95.18-1.05v-.2zm-30.83 5.94-.1.13.2 1.65.08.58.2-.38v-2.45zm49.12-40.7-2.52 1.56-2.55 1.59-2.6 1.58-5.18 3.13-2.14 1.29h.09l.86-.26.37-.09.5-.1.53-.08h1.84l.63.05.65.1.28.05.67.15.65.22.27.1.61.25.6.32.25.13.55.33.52.39.23.18.44.37.41.4.2.21.55.64 1-2.72 1.25-3.32 1.27-3.3 1.32-3.26.45-1.07zm76.9-28.07-.8.65-.84.72-.86.75-.89.81-.88.85-.92.92-.91.93-.94 1-.95 1-1 1-.33.37-.27.53-1.35 2.5-1.3 2.4-1.18 2.34-1.18 2.11v1.22l-.05.57-.1.86-.13.95-.32 2.22-.37 2.55-.35 2.6-.15 1.18-.11 1.09-.09.88v.68l-.05 1.12v2.92l.15-.35 1.11-2.69 1.15-2.68 2.29-5.28 2.31-5.25 2.32-5.2 2.32-5.29.36-.75.52-1 .63-1.33.75-1.6.82-1.82.4-.93.42-1 .4-1 .38-1 .23-.61zm-107.42-8.3-1 1.5-1 1.5-1 1.53-1 1.55-1 1.55-.95 1.57-1 1.58-.35.62.08.06.33.35.62-.91 1.45-2.19 1.42-2.21 1.4-2.27.66-1.12.67-1.13.65-1.13.22-.39v-.8zm49.22 6h.06l.42-.47zm48.15-30.5-.62.33-.66.39-.7.43-.74.47-.75.5-.76.51-1.65 1.17-.34.23v.27l.06.92v2.7l-.06.88-.09.88-.11.87-.12.88-.17.87-.16.87-.19.88-.2.87-.23.9-.47 1.7-.53 1.75-.58 1.75-.62 1.75-.61 1.73-.68 1.75-.72 1.75-.72 1.7.14.2.26.45.44-.81 1.3-2.59 1.28-2.61 1.25-2.62 1.22-2.6 1.16-2.55 1.1-2.57.5-1.22.5-1.23.46-1.2.44-1.18.41-1.17.4-1.12.35-1.08.34-1 .3-1 .26-1 .22-.92.2-.85.15-.8.07-.35zm-55.18-10.15-.35.05-.39.07-.4.06-.43.09-.45.11-.43.1-1 .3-1 .34-1.08.38-1.1.43-1.12.45-1.13.5-1.12.5-1.08.54-1.11.53-1 .53-1 .54-.94.51-.86.5-.8.47-.7.42-1.2.75-.15.11.08.37.17.73.15.75.11.75.1.74.07.75v.73l.05.75v.53l.82-.78.91-.87.94-.86.93-.84 1-.83 1-.82 1-.81 1-.79 1-.78 1-.77 1-.75 1-.73 1-.72 1.05-.71 1.06-.69 1.09-.66 1.1-.67 1.02-.65.31-.17v-.23l-.05-.27zm-150.99 344.98 1.34.1 1.33.15 1.37.2.7.14.71.16.7.19.69.21.66.24.67.28.67.28.63.34.62.35.6.38.58.4.57.43.53.45.52.47.48.48.47.5.43.54.42.51.36.54.42.61.58 1 .07.13.43-.33 1.34-.95 1.3-.87.71-.45.69-.4.7-.4.7-.37.73-.35.75-.35.78-.3.82-.3.87-.25.93-.21 1-.15.71-.07h2.09l.33.05.52.1.53.11.3.09.38.11.39.14.38.15.27.13.4.18.38.2.37.24.25.15.36.26.37.27.33.3.24.2.31.3.3.32.29.33.2.23.25.34.23.33.22.35.16.28.19.34.18.35.22.5.3.71.25.72.21.77.17.78.12.78.08.8v1.64l-.08.8-.12.8-.18.76-.23.75-.27.74-.28.68-.34.65-.35.62-.38.6-.38.56-.42.54-.42.5-.48.53-.83.82-.92.8-.95.71-1 .67-1 .6-1 .57-1 .53-1 .5-1.05.47-1.08.45-1.1.41-1.12.39-1.13.38-1.15.35-1.17.35-1.18.32-1.18.3-1.22.3-1.22.26-1.21.27-1.22.23-.33.37-.54.72-1.51 2-.62.8-.3.35-.38.42-.44.42-.43.36-.48.34-.5.3-.52.28-.53.23-.55.19-.55.16-.57.12-.58.07-.59.05h-1.16l-.57-.1-.57-.12-.56-.17-.55-.2-.52-.25-.52-.26-.5-.32-.46-.35-.44-.38-.41-.4-.39-.44-.36-.46-.32-.49-.28-.51-.25-.52-.1-.25h-5.38l-1-.05-1-.07-1-.08-1-.1-1-.12-.95-.15-.94-.16-.93-.2-.93-.25-.95-.3-1-.39-.68-.31-.35-.19-.33-.18-.64-.37-1-.7-.77-.6-.37.33-.4.3-.42.27-.43.27-.43.21-.55.27-.7.3-.72.27-.72.23-.72.39-.72.16-.72.15-.71.14-.7.1-.7.06-.7.05h-2.1l-1.27-.08-1.28-.17-1.25-.21-1.22-.27h-.18l-.45.07-1.07.37-1.08.35-1.12.32-1.11.28-1.14.27-1.16.21-1.19.2-1.2.15-1.21.1-1.24.07h-1.65l-.55-.05-.55-.07-.53-.13-.53-.15-.54-.19-.5-.21-.5-.27-.47-.28-.43-.32-.32.1-.56.14-.59.08-.58.05h-1.15l-.58-.08-.57-.12-.57-.15-.55-.18-.53-.23-.52-.27h-.05l-.58-.07-1.17-.18-1.2-.22-.71-.18-.72-.19-.75-.25-.8-.3-.87-.38-.6-.32-.33-.18-.32-.22-.28-.18-.38-.28-.39-.3-.23-.2-.3-.25-.28-.29-.27-.28-.18-.22-.34-.4-.3-.41-.08-.12-.2-.32-.2-.31-.07-.12-.21-.42-.2-.43-.09-.2-.2-.52-.16-.53-.05-.2-.1-.4-.07-.4-.07-.42v-2.45l.07-.41v-.19l.09-.38.1-.38.11-.39.07-.16.18-.5.22-.49.08-.18.22-.42.25-.4.1-.16.23-.35.25-.34.35-.43.6-.63.57-.54.63-.51.2-.14v-.27l.05-.43.08-.43.1-.44.07-.3.13-.45.17-.43.25-.65.45-.93.48-.82.48-.75.52-.68.42-.49v-.26l.06-1.14.14-1.11.18-1.1.23-1.07.27-1.05.32-1 .36-1 .39-1 .43-1 .47-1 .5-.91.51-.92.55-.9.59-.87.6-.86.61-.84.65-.81.69-.8.68-.79.72-.76.73-.74.75-.73.77-.7.78-.68.82-.67.81-.63.85-.62.85-.6.87-.57.88-.55.92-.51.92-.5.93-.47.95-.43 1-.4 1-.39 1-.33 1-.3 1-.27 1.05-.23 1.07-.18 1.07-.14 1.1-.08h2.4l.41.07.44.08.25.07.5.11.48.17.48.18.22.1.52.24.5.28.46.32.19.11.36.27.34.28.33.3.32.32.15.17.35.41.33.44.3.45.12.2.23.41.22.44.2.45.08.21.13.39.14.36.1.39.05.25.1.5.06.48v1.67l-.05.9v.11h.19l.88.07.92.11.95.17 1 .27.68.23.4.15.39.17.35.16.46.24.45.26.3.2.47.32.43.33.27.22.3.27.28.28.27.28.22.25.25.29.23.31.23.32.19.27.3.5.26.51.15.3.22.49.18.5.1.31.15.47.12.48.07.35.08.44.05.45v1.86l-.08 1.05-.1.69.2-.09 1.07-.41 1.06-.4 1.1-.37 1.14-.35 1.13-.33 1.15-.29 1.18-.26 1.2-.24 1.22-.18 1.25-.17 1.25-.11 1.27-.07h2.6zm-.2 17.3-.45.6-.48.59-.5.53-.35.33 1.75-.11 1.83-.17v-1.57l-.05-.23-.05-.2-.05-.15h-.08l-.79-.11-.33-.05z" fill="#808080"/><path d="m105.75 43.78.9.19 1 .31.92.42.85.53.8.64.7.71v.07l.55.7.46.75.39.8v.13l.2.54.16.55.12.46.1.55.13 1.09v1.08l-.03 1.08-.3 1-.43 1v.1l-.13 1.27-.19 1.92-.3 3.3-.25 2.03-.17 1.9-.16 1.91-.14 1.94-.13 1.91-.12 1.94-.1 2-.08 1.93-.15 3.9-.1 3.88-.07 3.9v9.36l-.05 2.78-.09 2.77-.1 2.76-.11 2.77-.14 2.75-.15 2.77-.33 5.46-.37 5.47-.4 5.43-.44 5.47-.4 5.42-.4 5.38-.35 5.37-.33 5.35-.13 2.65-.14 2.66-.11 2.67-.1 2.65-.07 2.65-.07 2.63v82.92l-.06 15.6v7.8l-.07 7.8-.08 7.82-.1 7.8-.12 7.81-.15 7.8-.17 7.82-.18 7.8-.22 7.8-.25 7.82-.28 7.8-.3 7.8-.35 7.78-.37 7.8-.41 7.78-.45 7.79-.5 7.76-.54 7.77-.58 7.77-.62 7.73-.15 1.07-.3 1.05-.43 1-.57.93-.66.87-.79.75-.88.65-1 .53-1 .4-1.07.27-1.08.13h-1.08l-1.09-.23-1-.29-1-.43-.93-.57-.85-.66-.77-.79-.65-.88-.53-1-.4-1-.27-1.05-.13-1.08v-1.08l.61-7.69.59-7.66.51-7.69.49-7.68.45-7.7.41-7.7.37-7.72.35-7.71.3-7.74.27-7.73.25-7.73.21-7.75.19-7.75.16-7.77.15-7.75.12-7.77.1-7.76.08-7.77.07-7.77.05-7.78.07-15.55v-83.12l.06-2.78.09-2.77.1-2.77.11-2.75.14-2.76.15-2.75.33-5.47.37-5.47.38-5.45.42-5.41.4-5.4.38-5.39.37-5.36.33-5.37.13-2.65.14-2.67.11-2.65.09-2.65.08-2.65.07-2.65v-13.35l.1-4.08.17-4.07.08-2.07.12-2.05.12-2 .13-2 .15-2 .17-2 .18-2 .18-2 .3-3.28.2-2.05.22-2 .12-1 .13-1 .18-1 .15-.69.22-.73v-.15l.37-1 .06-.1.39-.73.45-.69.53-.63.05-.07.8-.76.9-.67 1-.53 1-.39.88-.22.9-.12h.92zm-9.12 10.47.1.35-.1-.37z"/><path d="m619.78 0 1.3.1 1.29.14 1.25.16 1.21.22 1.17.26 1.16.25 1.14.29 1.11.3 1.07.3 1.08.31 2 .64 2 .65 1.88.6 1.83.58.87.25.87.23.85.24.83.2.82.18.81.17.8.13.82.12 2.63.3 2.7.3 2.7.25 2.72.23 2.73.2 2.75.2 2.75.15 2.79.15 2.78.12 2.8.11 2.8.1 2.82.09 5.68.13 5.7.12 11.48.2 5.79.13 5.78.17 2.9.1 2.92.11 2.9.14 2.91.15 2.9.16 2.92.2 2.92.22 2.91.25 1.37.15 1.37.15 1.33.17 1.32.16 1.3.2 1.26.22 1.27.23 1.23.25 1.2.25 1.2.29 1.17.3 1.15.3 1.13.33 1.1.33 1.1.37 1.07.38 1 .39 1 .41 1 .44 1 .43 1 .47 1 .48.94.5.91.52.9.53.87.55.87.57.83.58.82.6.8.62.78.63.75.65.73.67.72.66.7.7.67.72.65.72.63.73.6.75.58.77.57.76.55.79.52.8.5.8.48.81.45.84.43.83.42.83.4.85.38.85.37.87.33.87.34.86.3.89.3.88.26.88.27.89.23.9.24.9.21 1 .39 1.78.31 1.85.29 1.85.23 1.87.2 1.88.15 1.9.12 1.92.08 1.91.05 1.94v6l-.05 2-.07 2-.08 2-.08 2-.24 4.05-.26 4.12-.23 4.06-.3 4.12-.25 4.2-.24 4.23-.1 2.1-.08 2.12-.07 2.11v26.73l.05 6.84.06 6.81.1 6.85.1 6.85.12 6.85.13 6.85.15 6.87.19 6.87.18 6.86.2 6.89.22 6.86.23 6.89.27 6.86.26 6.87.3 6.88.3 6.87.34 6.87.33 6.85.37 6.85.38 6.85.4 6.85.42 6.83.43 6.83.47 6.82.46 6.8.5 6.8.52 6.78.53 6.77.55 6.77.82 9.8.78 9.73.39 4.87.35 4.85.35 4.85.31 4.86.3 4.89.25 4.88.24 4.92.2 4.93.16 5 .12 5 .07 5.05v6.35l.1 1.65.13 1.88.15 2.08.17 2.24.16 2.36.12 2.44.05 1.28v3.87l-.05 1.31-.08 1.32-.12 1.33-.15 1.34-.2 1.33-.27 1.35-.3 1.28-.21.74-.2.66-.24.69-.25.68-.26.67-.3.68-.34.68-.36.67-.4.67-.42.66-.47.65-.5.65-.53.62-.58.6-.54.53-.56.49-.59.45-.6.43-.63.38-.65.37-.65.32-.67.3-.66.25-.67.21-.68.17-.65.15-.67.12-.73.08-1.17.08h-1.2l-1.15-.09-1.08-.15-1.05-.18-1-.23-.95-.25-.9-.29-.86-.28-.84-.32-.81-.3-1.49-.6-1.38-.58-1.27-.52-1.15-.45-.46-.16-.45-.15-.39-.12-.26-.07-.27-.05-.25-.05-1.28-.17-1.42-.17-1.45-.16-1.48-.14-1.54-.11-1.55-.12-1.58-.08-1.62-.09-1.63-.05h-8.4l-1.7.05-1.7.06-1.7.1-1.68.1-1.69.12-1.66.15-1.65.17-1.64.18-1.6.2-1.58.22-1.55.23-1.52.27-1.46.26-1.45.29-1.39.31-1.35.32-1.28.35-1.25.35-2 .62-2 .66-2 .69-2 .73-2 .77-2 .78-2 .82-2 .83-2.05.85-2 .87-4.13 1.78-4.17 1.82-4.2 1.81-2.11.92-2.15.9-2.15.88-2.17.89-2.18.85-2.2.85-2.24.81-2.23.79-2.27.75-2.28.71-2.3.69-2.33.65-2.34.58-1.2.3-1.2.27-1.2.25-1.2.23-1.21.23-1.22.2-1.93.32-2 .28-1.92.25-1.93.22-1.92.2-1.9.17-1.9.13-1.9.13-1.88.09-1.89.08-1.86.05h-9.25l-1.84-.07-1.81-.08-1.82-.08-1.83-.12-3.59-.25-3.58-.3-3.55-.33-3.55-.35-3.52-.4-3.5-.4-7-.84-6.9-.83-3.43-.4-3.42-.37-3.41-.35-3.4-.31-3.42-.27-1.68-.12-1.7-.11-1.7-.1-1.7-.09-1.7-.06-1.69-.05h-10.2l-1.73.04-1.73.08-25.8 1.55-25.8 1.52-12.9.75-12.9.71-12.92.69-12.9.65-6.46.3-6.47.3-6.47.28-6.46.25-6.47.25-6.47.23-6.48.22-6.48.2-6.49.18-6.48.15-6.5.14-6.5.11-6.5.09-6.52.06h-21.2l-2.73-.05-5.43-.14-5.42-.18-5.42-.22-5.38-.25-5.4-.28-5.37-.3-10.71-.62-10.69-.67-5.32-.3-5.31-.28-5.29-.25-5.28-.24-5.27-.2-5.26-.15-2.62-.06h-15.67l-2.6.05-2.6.07-2.58.08-2.6.08-2.58.14-2.57.06-2.58.15-2.58.18-2.57.2-2.58.24-2.57.25-2.57.28-2.55.3-2.56.32-2.55.36-2.57.37-2.55.42-2.55.43-2.53.47-2.55.5-2.6.53-1.9.4-2.84.55-3.63.68-4.27.77-4.78.83-2.57.42-2.63.43-2.7.42-2.75.42-2.78.4-2.8.38-2.8.37-2.8.33-2.75.32-2.74.26-2.66.24-2.59.2-2.51.15-2.4.08h-5.67l-1.07-.07-1-.08-1-.13-1-.15-1-.2-1-.25-1.07-.32-1.23-.45-1.07-.52-.7-.42-.61-.43-.64-.5-.38-.33-.6-.62-.22-.25-.6-.77-.18-.26-.45-.72-.17-.3-.33-.68-.28-.64-.32-.95-.25-.9-.18-.86-.14-.85-.08-.8-.07-.82v-2.33l.05-.82.11-1.52.17-1.56.22-1.57.26-1.6.3-1.62.34-1.63.35-1.65.36-1.65.39-1.65.8-3.27.81-3.21.77-3.07.7-2.88.32-1.32.26-1.25.25-1.13.19-1 .15-.88.1-.73.06-.59v-.45l.15-1.44.42-1.4.63-1.3.85-1.18 1-1 1.22-.82 1.32-.58 1.41-.35 1.45-.1 1.44.17 1.4.4 1.3.63 1.18.85 1 1.05.82 1.22.58 1.31.35 1.42.1 1.45v1.25l-.12 1.27-.18 1.31-.22 1.34-.26 1.36-.29 1.4-.31 1.44-.35 1.48-.74 3-.8 3.11-.78 3.15-.77 3.14-.35 1.51-.35 1.5-.3 1.45-.28 1.4-.25 1.34-.2 1.23-.17 1.17-.08.76h4.03l2.09-.08 2.2-.14 2.35-.16 2.43-.22 2.53-.27 2.6-.28 2.65-.33 2.69-.34 2.68-.38 2.68-.38 2.65-.4 2.62-.4 2.55-.42 2.47-.4 4.67-.74 4.15-.73 3.48-.67 2.7-.53 1.82-.37 2.67-.55 2.73-.53 2.73-.5 2.74-.48 2.73-.44 2.73-.4 2.74-.38 2.73-.35 2.73-.32 2.72-.3 2.73-.26 2.72-.24 2.73-.21 2.72-.19 2.72-.18 2.71-.13 2.72-.14 2.72-.1 2.71-.08 2.72-.07h16.23l2.7.05 2.72.05 5.38.16 5.39.2 5.38.24 5.37.25 5.36.3 5.37.3 10.7.61 10.67.64 5.31.28 5.32.28 5.32.25 5.3.22 5.3.17 5.3.13 2.63.05h20.8l6.45-.07 6.45-.08 6.43-.12 6.44-.13 6.45-.15 6.43-.19 6.42-.18 6.43-.22 6.43-.23 6.44-.25 6.41-.27 6.44-.26 6.43-.3 6.42-.3 12.86-.65 12.85-.69 12.87-.71 12.87-.74 25.8-1.53 25.85-1.53 1.88-.1 1.9-.09 1.88-.05h7.49l1.86.05h1.84l1.85.06 1.81.1 1.84.1 1.81.12 1.82.13 3.6.29 3.57.33 3.56.35 3.54.4 3.5.4 7 .83 6.9.84 3.44.4 3.4.36 3.41.35 3.39.32 3.38.28 3.4.24 1.67.1 1.68.08 1.68.08 1.69.05h10.08l1.68-.06 1.69-.09 1.68-.1 1.68-.13 1.7-.15 1.69-.17 1.7-.2 1.7-.21 1.7-.25 1.7-.27 1-.17 1-.2 1-.2 1-.2 1-.23 1-.23 2-.52 2-.55 2-.6 2-.63 2-.67 2-.72 2-.73 2-.77 2-.8 2-.81 2-.85 2.05-.87 2-.87 4.15-1.8 4.17-1.81 4.2-1.82 2.13-.9 2.15-.9 2.15-.88 2.17-.87 2.18-.85 2.22-.83 2.21-.8 2.25-.79 2.25-.73 2.3-.72 1.59-.45 1.63-.43 1.67-.4 1.7-.38 1.71-.35 1.75-.32 1.77-.3 1.8-.28 1.8-.25 1.83-.22 1.85-.22 1.85-.18 1.87-.15 1.87-.15 1.88-.12 1.88-.1 1.89-.06 1.86-.07h9.3l1.82.06 1.8.09 1.77.1 1.76.11 1.74.15 1.7.15 1.66.19 1.65.2 1.69.21 1 .17 1 .22.93.25.89.26.86.29.85.31 1.5.59 1.44.58 1.33.55 1.25.52.53.2.52.18.48.17.44.13.38.1h.1v-.11l.07-.2.08-.24.07-.23.06-.23.15-.64.14-.66.11-.75.09-.79.08-.86v-5.84l-.1-2.15-.15-2.17.12-2.08-.16-2.12-.14-2.06-.11-2v-6.9l-.07-4.89-.11-4.85-.15-4.83-.2-4.82-.22-4.78-.27-4.78-.28-4.79-.32-4.78-.33-4.78-.35-4.8-.38-4.8-.79-9.69-.81-9.8-.55-6.8-.54-6.81-.51-6.84-.5-6.85-.49-6.85-.45-6.86-.45-6.87-.41-6.88-.4-6.9-.39-6.89-.36-6.9-.35-6.91-.34-6.9-.3-6.92-.3-6.92-.26-6.91-.27-6.92-.23-6.92-.24-6.9-.2-6.91-.18-6.92-.17-6.9-.16-6.92-.14-6.9-.11-6.88-.1-6.88-.09-6.89-.08-6.86v-29.69l.05-2.26v-2.27l.07-2.23.08-2.24.1-2.21.25-4.37.25-4.3.29-4.2.26-4.13.27-4 .22-3.93.08-1.9.08-1.89.07-1.85v-8.78l-.08-1.64-.09-1.6-.13-1.55-.15-1.51-.36-1.47-.22-1.43-.25-1.39-.28-1.35-.15-.61-.17-.64-.17-.61-.16-.62-.19-.6-.2-.58-.2-.59-.2-.55-.21-.55-.24-.55-.23-.51-.25-.52-.25-.5-.25-.5-.27-.48-.28-.47-.28-.47-.3-.45-.3-.45-.32-.43-.33-.42-.3-.43-.35-.4-.36-.4-.39-.4-.38-.38-.4-.39-.42-.38-.43-.37-.45-.36-.45-.35-.48-.37-.5-.35-.52-.33-.55-.34-.55-.33-.57-.32-.6-.31-.6-.32-.63-.3-.67-.3-.68-.3-.72-.28-.73-.27-.77-.27-.78-.26-.82-.25-.83-.25-.87-.24-.9-.21-.92-.22-1-.2-1-.2-1-.18-1-.17-1-.17-1.1-.15-1.1-.13-1.15-.13-1.18-.12-2.78-.2-2.77-.2-2.77-.2-2.78-.17-2.8-.13-2.8-.14-2.82-.16-2.81-.1-5.67-.15-5.7-.14-11.45-.18-5.75-.11-5.76-.15-2.89-.09-2.9-.1-2.88-.1-2.88-.13-2.94-.15-2.89-.17-2.88-.2-2.86-.23-2.89-.25-2.88-.27-2.88-.32-2.9-.35-1.25-.16-1.24-.22-1.21-.23-1.19-.2-1.16-.28-1.14-.3-1.1-.3-1.08-.34-2.05-.63-2-.63-1.89-.62-1.81-.57-.85-.25-.85-.25-.84-.21-.8-.2-.78-.17-.78-.17-.75-.11-.74-.1-.71-.09-.72-.05h-2.07l-.7.05-.68.1-.73.12-1 .23-1.05.25-1 .3-1.07.33-1.06.37-1.09.4-1.08.43-1.08.45-1.1.5-1.12.52-1.12.53-1.11.57-1.14.58-1.11.6-2.32 1.29-2.33 1.31-2.4 1.34-2.39 1.4-2.41 1.4-2.45 1.38-1.25.7-1.25.69-1.29.66-1.28.65-1.28.64-1.3.61-2 .89-1.95.86-2 .85-2 .84-2 .83-2.05.82-2.09.8-2.08.78-2.12.78-2.13.75-2.15.75-2.17.74-2.18.71-2.22.72-2.21.68-2.24.69-2.25.66-2.26.65-2.29.64-2.28.61-2.3.62-2.32.58-2.31.59-2.34.55-2.33.55-2.35.53-2.37.5-2.35.5-2.38.48-2.37.47-2.33.45-2.37.43-2.38.42-2.4.4-2.38.38-2.39.35-2.38.35-2.38.34-2.39.31-2.38.29-2.38.28-2.37.25-2.36.23-2.37.24-2.35.2-2.35.18-2.35.15-2.33.15-2.34.12-2.31.11-2.3.09h-13.59l-2.21-.06-2.2-.09-2.19-.11-2.18-.01-2.15-.17-2.12-.16-2.1-.2-3.68-.47-3.65-.4-3.64-.4-3.61-.43-7.17-.88-7.12-.89-7.06-.86-3.52-.42-3.5-.42-3.5-.38-3.48-.38-3.47-.35-3.47-.32-3.45-.3-3.45-.27-3.43-.2-3.45-.18-3.43-.17-3.45-.1-3.45-.07h-8.57l-1.73.05-1.72.07-1.71.1-1.74.08-1.71.12-1.74.13-1.71.15-1.74.17-1.73.16-1.73.2-1.74.22-1.73.23-1.75.25-1.7.27-1.7.28-3.45.59-3.45.63-3.47.72-3.48.71-3.47.74-3.5.76-3.5.79-7.07 1.63-7.08 1.63-3.57.84-3.58.8-3.6.8-3.6.78-3.63.75-3.64.73-3.65.69-3.66.65-3.67.6-1.85.28-1.85.28-1.87.25-1.85.25-1.86.22-1.87.22-1.87.18-1.88.18-1.87.15-1.88.15-1.9.12-1.88.08-1.9.09h-9.54l-1.91-.05-1.94-.1-1.91-.12-1.94-.08-1.63-.15-1.63-.18-1.64-.2-1.6-.23-1.63-.24-1.6-.29-1.6-.3-1.59-.31-1.58-.34-1.57-.36-1.54-.4-1.52-.4-1.55-.4-1.55-.42-1.53-.43-1.55-.45-3-.92-3-1-3-1-3-1-2.95-1-2.92-1-5.8-2-2.85-1-2.83-1-2.82-.92-2.78-.87-2.87-.69-1.37-.38-1.37-.39-1.35-.36-1.33-.37-1.35-.32-1.35-.32-1.33-.3-1.32-.26-1.31-.25-1.32-.24-1.32-.21-1.28-.2-1.3-.17-1.28-.13-1.29-.12-1.26-.1-1.27-.07h-5l-1.32.07h-1.46l-1.42-.38-1.35-.55-1.22-.77-1.08-1-.9-1.14-.67-1.28-.45-1.38-.2-1.45v-1.45l.3-1.42.55-1.35.82-1.21 1-1.07 1.14-.9 1.28-.68 1.38-.44 1.45-.2 1.52-.08h4.82l1.6.06 1.6.09 1.58.11 1.58.15 1.57.19 1.57.2 1.56.23 1.55.25 1.57.27 1.53.3 1.55.31 1.54.35 1.53.35 1.52.37 1.51.4 1.52.4 1.52.42 1.51.43 3 .88 3 .94 3 1 2.95 1 2.93 1 5.82 2 2.9 1 2.88 1 2.87 1 2.85.94 2.83.9 2.85.85 1.38.4 1.4.4 1.4.38 1.4.37 1.4.33 1.39.33 1.38.32 1.38.3 1.29.15 1.37.25 1.36.24 1.37.21 1.37.2 1.35.17 1.35.15 1.35.12 1.7.13 1.68.1 1.7.08 1.7.07h6.8l1.7-.05 1.7-.07 1.7-.1 1.72-.1 1.7-.13 1.71-.14 1.72-.16 1.72-.19 1.71-.18 1.72-.22 1.72-.21 1.73-.24 1.72-.25 1.71-.26 3.49-.59 3.46-.61 3.47-.65 3.5-.7 3.48-.72 3.5-.77 3.52-.76 3.52-.8 3.53-.82 7.1-1.65 7.1-1.63 3.58-.8 3.6-.79 3.59-.76 3.61-.74 3.62-.71 3.63-.67 3.64-.62 1.83-.3 1.83-.28 1.92-.27 1.9-.26 1.9-.24 1.9-.21 1.88-.19 1.9-.18 1.89-.17 1.86-.13 1.89-.13 1.86-.1 1.87-.1 1.87-.07h11.07l3.65.06 3.66.12 3.64.17 3.63.2 3.62.23 3.61.28 3.6.32 3.59.33 3.61.29 3.58.39 3.57.41 3.57.42 3.55.42 7.11.88 7.1.88 7.12.87 3.55.42 3.57.41 3.56.39 3.55.36 1.94.19 1.93.15 1.95.15 2 .11 2 .1 2 .07 2.05.07h10.55l2.15-.07 2.17-.08 2.17-.09 2.2-.11 2.2-.15 2.21-.15 2.22-.17 2.23-.18 2.24-.22 2.25-.22 2.25-.25 2.25-.26 2.26-.27 2.27-.3 2.27-.32 2.26-.33 2.27-.33 2.27-.37 2.26-.38 2.27-.4 2.27-.4 2.26-.44 2.27-.45 2.25-.45 2.25-.46 2.23-.5 2.24-.5 2.23-.52 2.22-.53 2.2-.55 2.2-.55 2.18-.59 2.17-.58 2.16-.6 2.15-.62 2.12-.63 2.12-.63 2.1-.67 2.08-.67 2-.66 2.05-.7 2-.7 2-.72 2-.72 1.95-.73 1.93-.75 1.9-.77 1.89-.76 1.85-.77 1.83-.78 1.8-.8 1.75-.8 1.07-.52 1.06-.52 1.09-.55 1.1-.58 1.1-.6 1.11-.6 2.29-1.3 2.36-1.37 2.37-1.4 2.43-1.4 2.45-1.42 2.54-1.4 1.3-.7 1.34-.68 1.34-.67 1.33-.65 1.37-.63 1.38-.62 1.4-.58 1.41-.57 1.45-.53 1.47-.5 1.5-.47 1.52-.43 1.57-.35 1.58-.38 1.4-.25 1.42-.19 1.4-.11 1.38-.07h1.35z"/><path d="m201.17 342.78h1.11l.35.07.27.06.28.07.27.08.28.09.35.13.22.1.22.1.21.1.22.12.22.1.28.18.2.12.2.15.2.13.2.15.18.15.25.22.2.18.2.18.19.19.16.2.24.28.15.17.13.2.15.18.12.18.18.3.13.22.12.22.12.23.16.33.1.22.09.22.08.21.07.24.08.21.07.27.06.23.07.24v.23l.05.25v3.48l-.05.29-.07.28-.07.27-.08.28-.08.27-.1.26-.12.27-.1.27-.13.25-.14.25-.15.25-.15.23-.15.23-.16.24-.17.23-.18.22-.2.21-.2.2-.2.2-.2.19-.22.2-.23.16-.22.17-.23.17-.25.15-.24.15-.25.13-.26.13-.25.12-.27.12-.27.1-.26.08-.27.08-.28.09-.27.06-.28.05h-.29l-.2.27-.78 1.08-.8 1.17-.82 1.23-.83 1.3-.83 1.32-.82 1.35-.78 1.32-.74 1.3-.7 1.25-.63 1.18-.37.7v2.43l-.07.29-.06.26-.07.29-.08.26-.1.27-.1.27-.12.26-.12.25-.13.27-.13.23-.15.25-.15.24-.17.23-.17.23-.18.22-.18.22-.2.21-.2.2-.2.2-.47.42-.45.35-.18.17-.22.15-.2.13-.22.15-.2.12-.2.13-.21.12-.22.11-.22.1-.16.09-.25.11-.25.1-.25.1-.27.1-.27.07-.26.08-.18.24-.27.05h-.13l-.28.05h-2.55l-.27-.05-.25-.05-.25-.07-.27-.06-.25-.07-.23-.08-.25-.1-.25-.1-.23-.1-.24-.12-.25-.14-.25-.13-.23-.15-.23-.17-.24-.15-.23-.18-.22-.18-.21-.19-.2-.2-.18-.18-.18-.2-.19-.2-.16-.22-.15-.2-.17-.22-.13-.23-.15-.22-.14-.23v-.05l-.14-.25-.13-.25-.1-.25-.12-.25-.1-.27-.08-.26-.08-.25-.07-.29-.07-.26v-.14l-.05-.26v-2.66l.05-.27.08-.58.2-.84.24-.75.43-1.16.5-1.2.58-1.24.64-1.28.7-1.33.75-1.4.8-1.45.85-1.49.9-1.5.91-1.51.94-1.5 1-1.5 1-1.45 1-1.4 1-1.37 1-1.28 1-1.24.95-1.11.55-.59.53-.55.57-.55.63-.55.73-.56.54-.35.23-.15.23-.14.25-.13.25-.13.2-.12.22-.1.22-.08.21-.1.22-.09.23-.08.25-.08.27-.09.25-.06.27-.07-.2-.05.27-.05h1.87zm16.38 18.75h1.25l.25.05.23.05.25.07.24.06.25.07.23.08.23.1.24.1.23.1.22.1.23.14.22.11.21.14.2.13.22.15.2.15.2.15.18.17.2.16.19.17.16.18.17.19.17.18.16.2.15.2.15.2.15.22.14.2.13.21.12.24.11.21.12.24.1.21.08.24.1.25.09.23.06.23.07.25.05.25.07.24v3.35l-.07.25v.25l-.06.23-.09.25-.08.23-.08.24-.1.23-.1.23-.12.22-.12.23-.13.22-.12.22-.15.2-.13.21-.15.2-.17.2-.15.19-.18.18-.17.18-1.05 1.07-1 1.08-1.12 1.19-1 1.16-2.2 2.52-2.25 2.57-2.26 2.58-1.17 1.3-1.17 1.28-1.2 1.24-1.2 1.21-1.26 1.14-1.15 1-.19.17-.2.15-.18.16-.22.15-.2.14-.21.13-.22.13-.22.12-.21.12-.24.11-.23.1-.23.1-.24.09-.23.08-.25.07-.23.06-.25.07-.25.05-.24.05h-2.51l-.25-.05-.25-.05h-.24l-.25-.05-.25-.08-.23-.07-.23-.08-.24-.1-.23-.08-.23-.12-.24-.1-.21-.12-.22-.13-.22-.13-.21-.14-.2-.15-.2-.15-.2-.15-.2-.16-.19-.17-.18-.17-.17-.18-.18-.18-.17-.19-.15-.2-.16-.2-.15-.2-.14-.2-.13-.21-.13-.22-.12-.22-.12-.23-.11-.22-.1-.23-.1-.23-.09-.24-.08-.23-.07-.25-.06-.23-.07-.25-.05-.25v-3l.05-.25v-.25l.06-.24.07-.25.07-.23.15-.22.1-.23.08-.24.12-.21.1-.24.12-.21.13-.22.13-.22.14-.21.15-.2.15-.2.15-.2.16-.2.17-.19.17-.18.18-.18.18-.17.95-.87.9-.86.95-1 1-1 1-1.1 1-1.16 2.18-2.47 2.23-2.57 2.29-2.6 1.18-1.31 1.18-1.29 1.19-1.28 1.15-1.17.18-.18.18-.17.2-.16.19-.17.2-.15.2-.15.21-.13.22-.14.22-.13.21-.13.22-.12.23-.1.24-.1.23-.1.23-.08.24-.09.23-.08.25-.07h.25l.23-.05.25-.05h1.52zm58.37-103.15h.4l.4.05.38.05.4.08.38.1.39.12.36.13.37.15.37.17.35.18.33.2.33.22.32.23.32.25.3.27.28.27.27.3.25.3.25.31.23.32.2.33.2.35.18.35.15.37.15.37.1.33.32.12 2.73 1 1.5.57.8.33.82.33.82.37.83.42.85.45.88.51.89.6.76.59 1.07.86.92.75 2 1.54 2 1.53 2.09 1.53 2.11 1.55 2.17 1.57 4.4 3.18 2.22 1.62 2.21 1.67 2.22 1.68 2.17 1.72 1.1.88 1.08.9 1.07.9 1.05.92 1.05.93 1 .95 1 1 .95.91.28.29.25.3.25.31.24.32.21.33.2.34.19.35.16.36.17.37.12.37.11.38.1.38.09.4.06.39v1.98l-.07.38-.06.4-.09.39-.11.38-.12.37-.15.38-.17.35-.16.37-.2.33-.22.33-.22.34-.25.31-.25.3-.28.29-.28.28-.3.27-.3.23-.32.23-.33.22-.35.22-.35.18-.35.17-.37.15-.38.13-.41.07-.38.08-.38.08-.4.07h-2.37l-.38-.09-.39-.08-.38-.12-.38-.11-.37-.15-.37-.15-.35-.19-.35-.2-.33-.21-.32-.22-.31-.25-.3-.25-.3-.27-.84-.83-.81-.78-.85-.77-.87-.78-.9-.77-.9-.78-.95-.77-.93-.77-2-1.56-2-1.55-2.07-1.58-2.14-1.55-4.35-3.15-2.2-1.6-2.2-1.6-2.2-1.64-2.18-1.66-2.15-1.69-1.08-.88-.92-.75-.1-.07h-.05l-.15-.1-.27-.13-.35-.17-.4-.18-.48-.22-.52-.2-1.23-.47-1.32-.48-1.43-.52-1.43-.53-.79-.32-.78-.33-.78-.37-.82-.4-.85-.46-.88-.57-.64-.45-.28-.23-.3-.25-.58-.52-.59-.6-.5-.6-.5-.68-.26-.45-.2-.35-.19-.35-.06-.17-.12-.25-.1-.23-.1-.27-.07-.15-.1-.3-.08-.3-.08-.3v-.17l-.06-.3-.07-.3v-3.04l.05-.3.06-.3v-.18l.06-.28.09-.3.08-.29.07-.18.13-.37.15-.35.08-.2.15-.33.19-.33.25-.47.46-.72.34-.43.25-.3.26-.3.29-.28.28-.29.3-.25.32-.25.33-.21.33-.22.34-.2.36-.17.35-.16.39-.15.36-.12.39-.12.38-.08.4-.07.38-.05h.8z"/><path d="m315.58 245.38h.82l.4.07.4.08.4.1.38.12.39.13.38.17.37.18.35.18.35.22.35.23.31.25.32.25.3.29.28.28.29.32.25.31.25.32.21.35.22.35.18.37.19.36.15.39.05.15.1.28.1.28.08.29v.16l.07.27.05.28v.45l.05.37v2.27l-.05.38-.07.38-.08.42v.28l-.09.29-.08.28-.23.77-.42 1-.45.93-.48.89-.5.83-.54.82-.55.8-.58.78-.6.8-.65.82-1.25 1.68-1.43 1.65-1.57 1.7-1.6 1.74-1.65 1.78-3.46 3.63-3.57 3.77-1.72 1.88-1.75 1.9-1.74 1.9-1.68 1.88-1.6 1.85-1.55 1.84-.7.88-.7.88-.68.87-.64.83-.6.84-.56.8-.54.78-.48.75-.45.72-.4.68-.35.65-.32.6-.26.55-.21.5-.15.43-.12.37-.07.27-.05.26v.97l-.07.42-.07.4-.1.4-.11.38-.15.38-.15.39-.17.36-.2.37-.2.35-.23.35-.24.32-.26.31-.27.32-.3.28-.3.29-.32.25-.31.25-.35.23-.35.2-.35.2-.37.17-.38.16-.39.14-.4.13-.38.1-.4.07-.42.06-.4.05h-1.63l-.4-.07-.4-.08-.4-.08-.4-.12-.38-.15-.39-.15-.36-.17-.35-.2-.37-.2-.33-.23-.34-.25-.31-.25-.3-.27-.3-.3-.27-.3-.27-.31-.23-.32-.23-.35-.22-.35-.18-.35-.19-.37-.16-.38-.14-.38-.11-.4-.1-.39-.09-.4-.06-.41v-2.42l.06-.67.1-.71.24-1.2.3-1.22.38-1.18.42-1.15.48-1.12.52-1.1.55-1.08.58-1.09.62-1.05.65-1.05.68-1.05.72-1.05.73-1 .75-1 .78-1.05.8-1 .82-1 .85-1 1.72-2.05 1.76-2 1.82-2 1.83-2 1.85-2 1.85-2 3.6-3.8 3.4-3.6 1.59-1.69 1.48-1.61 1.37-1.5 1.21-1.42 1.07-1.3.45-.55.42-.53.35-.49.3-.43.13-.2v-.72l.07-.4.08-.4.1-.4.12-.38.15-.38.15-.39.18-.36.2-.37.2-.35.23-.33.25-.34.27-.3.27-.3.3-.3.3-.26.31-.27.34-.23.33-.24.35-.2.37-.18.36-.18.39-.15.38-.14.4-.11.4-.1.4-.09h1.22zm-8.16 11 .1.29-.12-.37zm-20.55-118.71h1l.31.05.34.07.31.08.32.08.32.1.31.12.3.13.3.14.3.16.29.15.28.19.27.18.26.2.27.2.25.22.23.23.24.23.23.25.2.25.2.27.2.27.18.28.17.28.15.29.15.3.13.3.14.31.1.32.1.32.08.31.07.32.06.33.05.34v2.43l-.1.52-.22 1.11-.27 1.42-.26 1.52-.22 1.28v3.25l-.05.15-.05.17-.05.15-.05.16-.07.15-.05.15-.06.15-.07.15-.07.15-.39.15-.07.15-.08.15-.08.14-.09.15-.1.13-.08.15-.1.13-.08.14-.1.13-.1.13-.12.14-.1.11-.12.14-.1.11-.11.12-.12.12-.07.06-.11.12-.12.12-.12.1-.13.11-.12.1-.13.1-.13.1-.12.1-.13.09-.14.1-.15.08-.13.08-.13.09-.15.08-.14.08-.15.07-.15.08-.15.07-.15.07-.15.06-.15.07-.15.05-.15.07-.15.05h-.32l-.15.05h-4.33l-.17-.05h-.17l-.15-.06-.15-.05h-.16l-.15-.07-.15-.07-.15-.06-.15-.07-.15-.07-.15-.08-.15-.08-.14-.09-.15-.08-.13-.08-.15-.09-.13-.1-.14-.1-.13-.08-.13-.12-.12-.1-.13-.1-.14-.11-.11-.1-.12-.12-.12-.12-.11-.11-.12-.12-.12-.13-.1-.12-.11-.13-.1-.13-.1-.13-.1-.12-.08-.13-.1-.14-.08-.13-.09-.15-.08-.13-.08-.14-.09-.15-.06-.13-.09-.15-.06-.15-.07-.15-.07-.15-.05-.15-.06-.15-.05-.15-.05-.15v-.15l-.05-.15-.05-.17v-2.88l.06-.92.1-.88.14-.88.26-1.7.32-1.72.28-1.48.2-1-.06.31v.22-1.85l.05-.17v-.15l.07-.17v-.15l.05-.15.07-.16.06-.15.07-.15.08-.15.07-.15.08-.14.09-.15.08-.15.08-.13.09-.15.1-.13.08-.14.1-.13.1-.13.1-.14.12-.11.1-.14.11-.11.1-.14.12-.11.12-.12.11-.12.14-.11.11-.1.14-.12.11-.1.14-.1.13-.1.13-.1.14-.1.15-.08.13-.09.15-.1.13-.08.15-.07.15-.08.14-.08.15-.07.15-.07.16-.06.15-.07.15-.05.15-.07h.17l.15-.05.17-.05h2.45zm17.26-13h1.22l.3.06h.3l.28.09.3.08.29.1.28.1.28.12.29.13.26.13.27.15.27.17.25.17.25.16.23.19.25.2.22.2.23.2.2.23.22.22.18.23.2.23.17.25.16.25.17.27.15.27.15.26.12.27.13.28v.12l.19.2.2.23.18.25.17.25.16.25.17.27.13.27.15.26.12.27.12.28.11.29.09.3.08.28.08.3.07.3.05.3v4.2l-.05.08v.29l-.21.5-.25.46-.05.09v.08l-.05.08-.05.07-.05.08-.05.09v.08l-.05.07-.05.08-.05.08-.05.07-.08.12-.05.08-.07.07-.66.23-.06.08-.07.09v.06l-.07.09-.06.06-.07.09-.07.06-.06.09-.07.06-.07.07-.06.08-.09.07-.06.07-.07.06-.07.07-.06.07-.09.06-.06.07-.09.07-.06.06-.09.07-.06.05-.09.07-.08.06h-.07l-.08.07h-.08l-.09.07-.05.18-.07.05h-.08l-.08.05-.09.06h-.08l-.08.05h-.09l-.08.05h-.1l-.08.05-.09.05h-.18l-.1.05h-6.95l-.09-.05h-.1l-.08-.05h-.25l-.08-.05-.1-.05h-.17l-.08-.05-.1-.05h-.09l-.08-.05-.08-.06h-.09l-.08-.05-.08-.07-.09-.05-.06-.07-.09-.05-.08-.06h-.08l-.07-.07-.08-.07h-.07l-.08-.06-.07-.07-.08-.07-.07-.06-.07-.07-.08-.07-.07-.06-.06-.07-.07-.07-.07-.06-.06-.09-.07-.06-.07-.07-.06-.08-.07-.09-.07-.06-.06-.07-.05-.08-.07-.07-.05-.08-.07-.07-.05-.08-.06-.07-.05-.08-.05-.09v-.06l-.07-.09v-.08l-.05-.08-.12-.2-.05-.09-.05-.08-.05-.08v-.09l-.05-.08-.05-.08v-.09l-.05-.08v-.27l-.26-.56-.3-.82-.2-.68-.19-.65-.23-1-.15-.87-.07-.43v-4.24l.05-.1v-.18l.05-.1v-.18l.05-.09v-.08l.05-.1.05-.08v-.1l.05-.09.05-.08.05-.08.06-.09v-.1l.05-.08.05-.08.07-.09.05-.08.07-.08.06-.09.05-.06.07-.09.07-.08.06-.08.07-.07.07-.08.06-.07.07-.08.07-.07.06-.08.07-.07.08-.08.07-.07.07-.07.08-.06.07-.07.08-.07.08-.06.07-.07.08-.07.09-.06.08-.07.07-.05.08-.07h.08l.09-.06h.08l.08-.07h.17l.1-.07h.35l.08-.05h4zm8.2 7.63v.3-.32zm-14.33-.18-.07.15.05-.1v-.07zm36.07-22.42h1.23l.3.05.3.06.3.07.3.08.3.1.28.12h.12l.37.07.3.06.3.09.3.1.28.1.3.11.28.12.27.15.28.13.27.17.25.17.27.16.25.19.23.2.23.2.24.21.21.22.2.23.22.24.18.23.19.25.18.27.15.26.17.27.13.27.13.28.14.28.1.29.11.3.09.3.08.3.07.3v.3l.05.3v5.03l-.05.08v.27l-.05.07v.06l-.05.07v.13l-.05.07-.05.07-.05.06v.07l-.05.07-.05.06v.07l-.05.07-.05.06-.05.07-.05.05-.05.07-.05.06h-.05l-.05.07h-.05v.07l-.07.05-.05.06h-.16l-.07.05h-.05l-.07.07h-.05l-.06.05h-.3l-.05.05h-.92l-.08.05h-11.31l-.07-.05h-.25l-.06-.05h-.32l-.05-.05h-.18l-.07-.05h-.13l-.05-.05-.05-.07h-.12l-.1-.1-.05-.06h-.1l-.05-.07-.05-.07h-.05l-.05-.06-.05-.05v-.07h-.05l-.05-.07-.05-.06-.05-.07v-.07l-.05-.06v-.07l-.31-.47-.05-.06v-.2l-.05-.07v-.07l-.05-.06v-.14l-.05-.06v-7.98l.05-.07v-.13l.05-.07v-.13l.05-.07v-.06l.05-.07v-.07l.05-.06h.05v-.14l.05-.06h.05l.05-.07v-.07h.05l.05-.06.05-.07.05-.07h.05l.05-.06h.05l.07-.07h.05l.05-.07.06-.05h.1l.07-.06h.05l.07-.05h.18l.07-.05h.55l.06-.05h.4l.07-.05h4.13zm6.73 3.53.1.12-.1-.13zm54.28-11.66h.94l.46.06.45.1.47.12.43.15.44.17.43.2.42.21.4.25.38.25.37.29.36.31.34.32.31.35.3.35.29.38.25.4.23.4.22.42.18.43.17.44.13.45.12.45.08.46.07.47v2.75h-12.44v-1.11.36-3.03h.3-1.18 3.64l.5-.05h.85zm-5.66 15.1.2.15h-.1zm10.4-13 .2.18-.22-.23-.3-.22zm36.78 11.73h1.32l.31.06.32.07.33.08.3.1.32.12.3.13.3.14.3.15.28.16.29.17.28.18.27.19.26.21.25.22.24.22.23.23.23.23.22.27.2.25.18.27.19.28.18.28.2.34.15.3.15.28.12.3.1.23.11.32.1.32.1.31.07.32.07.33.06.32v5.4l-.05.07v.13l-.05.08v.07l-.05.07v.06l-.05.07-.05.07v.06l-.06.1v.14l-.05.06-.05.07-.05.05v.07l-.05.06-.05.07-.05.07-.05.06v.05l-.05.07-.05.07-.06.05-.05.06v.07l-.05.05-.07.07-.05.05h-.07l-.05.06-.06.05v.06l-.05.07v.07l-.05.06-.05.07-.05.07-.05.06v.07l-.05.05-.05.07-.07.06-.05.07-.05.05-.05.07-.07.06h-.05v.07l-.06.07h-.05l-.07.06-.05.05-.07.05-.06.07h-.05l-1.61.41h-.07l-.05.05h-.06l-.07.05-.07.06-.06.05h-.07l-.07.05h-.06l-.07.05h-.07l-.06.05h-.07l-.07.05-.06.05h-.14l-.08.05h-.42l-.08.05h-.37l-.08.05h-7l-.07-.05h-.37l-.06-.05h-.09l-.06-.05h-.14l-.08-.05h-.07l-.06-.05h-.07l-.07-.05h-.13l-.07-.05-.06-.05h-.07l-.07-.05h-.06l-.07-.07-.07-.05h-.06l-.07-.05v-.07l-.07-.05-.06-.06h-.05l-.07-.05-.05-.07-.07-.07-.05-.05-.06-.06-.05-.05-.05-.07-.07-.07-.05-.05v-.06l-.05-.07-.23-.14-.05-.07-.07-.05-.05-.07v-.06l-.05-.07-.05-.07v-.08l-.05-.07-.05-.06v-.07l-.05-.07-.05-.06v-.09l-.05-.06v-.07l-.05-.07v-.15l-.05-.06v-6.33l.07-.22v-1.55l.09-.18.05-.07v-.22l.05-.06v-.07l.05-.08v-.2l.05-.07v-.07l.05-.06.05-.07.05-.07v-.06l.05-.07.05-.07.05-.06.05-.06v-.24l.05-.06v-.22l.05-.07v-.06l.05-.09v-.13l.05-.07.05-.06.05-.07v-.13l.05-.07.05-.07.05-.06.05-.07v-.07l.06-.06.05-.07h.05l.05-.07v-.06h.07v-.07l.07-.07.05-.06.06-.05.05-.07h.07l.07-.07h.11l.07-.06h.12l.06-.05h.07l.07-.07h.06l.05-.05h.35l.07-.05h.2l.07-.05h.36l.07-.05h4.61zm-7.53 12.12.23.41v-.51zm14.7-1v.63l.05-.13v-.52zm18.36 20.83h1.42l.28.07.29.07.26.06.29.09.26.1.27.1.27.11.25.12.25.13.25.14.25.15.25.16.23.15.22.19.23.18.22.18.2.2.2.2.2.2.18.22.18.22.19.23.16.23.15.24.15.25.14.25.13.25.13.26.12.25.1.27.1.28.08.27.07.27.08.28.05.28v3.82l-.05.15v.13l-.05.14-.05.13-.05.13-.05.14v.13l-.05.13-.06.14v.21l.05.72.07.73v3.09l-.05.13v.28l-.05.14-.05.13-.05.13v.14l-.05.13-.05.13-.05.14-.06.13-.07.12-.05.13-.07.13-.06.12-.09.13-.06.12-.07.13-.08.12-.09.12-.06.11-.09.12-.1.12-.08.11-.08.12-.09.1-.1.12-.1.1-.08.11-.1.1-.1.1-.1.1-.1.1-.12.1-.1.1-.11.09-.1.1-.12.08-.12.1-.1.08-.11.09-.12.08-.12.08-.13.07-.12.08-.11.07-.14.08-.11.07-.14.07-.11.06-.14.07h-.13l-.13.07h-.14l-.11.05-.14.06h-.41l-.14.05h-4.93l-.13-.05h-.14l-.13-.05h-.13l-.14-.07-.13-.05-.13-.05-.14-.06-.11-.07-.14-.07-.13-.06-.12-.07-.13-.07-.12-.06-.11-.09-.14-.08-.11-.07-.12-.08-.12-.08-.11-.09-.1-.1-.12-.08-.12-.08-.1-.1-.11-.1-.1-.1-.1-.09-.1-.1-.1-.11-.1-.1-.1-.1-.1-.12-.09-.1-.1-.12-.08-.1-.08-.11-.09-.12-.08-.12-.08-.11-.09-.12-.08-.13-.07-.12-.08-.12-.07-.13-.06-.12-.07-.13-.07-.12-.06-.13-.05-.13-.07-.14-.05-.13-.05-.13-.05-.14v-.13l-.05-.13-.05-.14v-.28l-.05-.13v-1.89l-.05-.68-.09-1.05v-3.05l.09-1 .18-1.08.18-.75v-.72l.15-.45.33-.78.27-.49.07-.11.06-.12.07-.13.08-.12.07-.12.08-.11.1-.15.07-.1.08-.1.07-.1.08-.1.07-.1.08-.1.09-.1.08-.1.1-.12.1-.1.08-.1.09-.1.1-.08.08-.1.1-.09.1-.1.1-.08.1-.08.12-.1.1-.1.11-.09.1-.08.12-.1.12-.08.11-.09.12-.06.13-.09.12-.08.12-.07.11-.08.14-.07.13-.06.12-.07.13-.07.13-.05.12-.06h.13l.14-.07h.13l.13-.05h.27l.15-.05h.13l.14-.05h.98-.57 1.15zm5.77 14.27-.1.1-.1.08-.12.1-.1.1.34-.28.1-.12zm6.32 23.13h.96l.32.05.32.06.31.07.3.08.32.1.3.12.3.12.3.13.28.13.29.17.26.15.29.18.25.19.26.2.25.2.24.21.23.22.22.23.21.25.2.25.2.25.12.19.17.21.15.19.2.2.78.73.87.83.21.24.24.23.2.23.2.27.2.25.16.27.19.28.15.27.15.3.13.28.13.3.12.3.1.3.08.32.09.3.06.31.05.32.05.33v3.9l-.05.1v.29l-.05.1v.1l-.05.1-.05.1v.08l-.05.1-.05.1-.05.08-.06.1v.09l-.05.1-.07.08-.05.1-.07.08-.05.09-.06.1-.07.08-.07.08-.06.09-.07.08-.07.08-.06.09-.07.08-.07.08-.08.09-.07.06-.06.09-.09.08-.06.07-.09.08-.08.07-.07.08-.08.07-.08.06-.09.07-.08.07-.08.08-.09.07h-.08l-.08.06-.09.07-.08.07-.1.06h-.08l-.09.07h-.1l-.08.07-.1.05-.08.05h-.1l-.1.05h-.09l-.1.05-.1.05h-.1l-.08.05h-.2l-.1.05h-.2l-.1.05h-5.98l-.1-.05h-.1l-.1-.05h-.19l-.1-.05-.1-.05h-.1l-.08-.05h-.1l-.1-.05-.08-.05-.1-.06h-.09l-.1-.05-.08-.07-.08-.05-.1-.07-.09-.06-.08-.07-.08-.05-.09-.07-.08-.06-.08-.07-.09-.08-.08-.07-.08-.07-.09-.06-.08-.09-.07-.06-.85-.82-1-.92-.64-.65-.68-.75-.72-.88-.5-.73-.06-.09-.05-.1-.07-.08-.05-.1-.05-.08-.07-.1-.05-.09-.05-.1v-.1l-.05-.08-.05-.1-.05-.1v-.1l-.05-.1-.05-.08v-.1l-.05-.1v-.2l-.05-.1v-1.79.05-3.82l.05-.1v-.2l.05-.1v-.2l.05-.08v-.1l.05-.1.05-.1.05-.08.05-.1v-.09l.07-.1v-.1l.05-.08.06-.08.05-.1.07-.09.07-.08.06-.1.05-.08.07-.09.07-.08.06-.08.07-.09.08-.08.07-.08.07-.07.06-.08.09-.09.06-.06.09-.09.06-.08.09-.07.08-.06.08-.09.07-.06.08-.07.09-.07.08-.06.08-.07.09-.07.08-.06.1-.07.08-.07.09-.06.08-.05.1-.07h.08l.1-.07h.09l.1-.05h.08l.1-.06.1-.05.08-.05h.2l.1-.05.1-.05h.29l.1-.05h3.15zm14.66 34.8h1.22l.25.05.23.05h.24l.23.06.23.07.24.08.23.09.23.1.22.1.22.1.21.11.22.12.22.12.2.13.2.13.2.15.2.15.18.15.2.17.17.17.18.16.17.17.16.18.17.19.15.2.15.18.13.2.55.23.77.37.22.12.21.11.2.12.22.13.2.14.2.13.2.15.2.15.18.15.19.17.16.16.19.19.16.16.17.19.15.2.15.18.15.2.13.2.14.2.13.22.12.2.11.21.12.24.1.21.1.22.08.23.09.24.08.23.07.23.05.24.06.23.05.25v3.87l-.05.11v.24l-.05.11v.24l-.05.11v.22l-.05.12-.05.1-.07.11-.05.12-.05.1-.06.12-.07.1-.05.1-.07.11-.06.1-.07.1-.07.1-.06.1-.07.1-.08.1-.07.1-.08.1-.07.09-.08.1-.09.1-.08.08-.07.1-.08.08-.1.09-.08.08-.09.1-.08.08-.1.09-.08.08-.1.07-.09.08-.1.08-.1.07-.08.08-.1.07-.1.08-.1.07-.1.07-.1.06-.1.07-.12.07-.1.06-.1.05-.11.07-.1.07-.12.05h-.1l-.12.06-.1.05-.11.05h-.24l-.1.05-.11.05h-6.32l-.12-.05-.11-.05h-.22l-.12-.06-.11-.05-.52-.25-.32-.14-.25-.1-.21-.08-.62-.22-.55-.2-.43-.18-.12-.05-.1-.05h-.12l-.11-.07-.1-.05-.12-.06-.1-.05-.18-.1-.1-.07-.1-.05-.1-.07-.1-.06-.1-.07-.1-.07-.1-.06-.1-.07-.1-.07-.09-.06-.16-.14-.1-.06-.09-.09-.1-.06-.08-.09-.08-.06-.1-.09-.09-.08-.08-.08-.08-.09-.09-.08-.08-.08-.15-.17-.08-.08-.07-.09-.08-.08-.07-.08-.08-.09-.07-.08-.07-.1-.06-.08-.09-.09-.06-.1-.14-.2-.06-.1-.07-.1-.07-.1-.06-.1-.07-.1-.07-.1-.06-.1-.29-.5-.36-.75-.45-1.06-.05-.1v-.12l-.05-.12v-.11l-.05-.12v-4.98l.05-.11v-.24l.05-.11v-.12l.05-.12.05-.11.05-.1v-.12l.05-.12.05-.1.07-.11.05-.1.05-.12.06-.1.07-.1.07-.12.05-.1.06-.1.07-.1.08-.1.07-.1.07-.1.08-.1.07-.1.08-.1.07-.08.08-.1.08-.08.09-.1.08-.09.08-.1.09-.08.08-.08.08-.09.1-.08.09-.08.1-.09.08-.08.1-.07.1-.08.08-.07.1-.08.1-.07.1-.06.1-.09.1-.06.12-.07.1-.07.1-.05.1-.06.12-.07h.1l.11-.07h.1l.12-.05h.1l.12-.05.11-.05h.12l.1-.05h.23l.12-.35h2.88zm22 25.07h1.35l.49.08h.23l.23.05h.22l.23.07.22.06.22.09.23.08.22.08.2.1.21.1.2.1.22.12.25.15.5.15h.38l.24.05h.23l.22.05.23.07.22.08.21.07.22.08.22.1.21.1.22.1.2.1.2.12.22.12.18.13.2.13.18.14.2.13.17.15.18.15.19.15.16.17.17.16.15.17.17.18.15.19.13.18.15.18.13.19.12.2.13.2.12.2.12.2.1.21.1.2.1.22.08.22.08.21.09.24.06.21.07.22v.47l.05.23v4.38l-.05.12v.22l-.05.1v.21l-.05.12v.1l-.05.12v.2l-.05.1v.11l-.06.1v.1l-.07.1v.1l-.07.1-.06.1-.07.1-.07.09-.06.1-.07.1-.07.08-.06.1-.09.1-.06.08-.07.09-.08.1-.09.08-.75.08-.09.09-.08.08-.08.08-.09.09-.08.08-.08.08-.1.07-.09.08-.08.09-.1.06-.08.07-.1.08-.09.07-.1.07-.1.06-.08.07-.1.07-.1.06-.1.07-.1.05-.1.07-.1.05-.1.06-.1.05-.1.05-.12.07-.1.05h-.21l-.1.05h-.12l-.1.05h-.22l-.11.05h-4.55l-.5-.1-1.1-.29-1.1-.35-1.05-.35-1.05-.38-.69-.3-.1-.05h-.11l-.1-.05-.1-.05-.1-.05-.1-.05-.12-.07-.1-.05-.1-.06-.1-.05-.1-.07-.1-.07-.1-.06-.08-.05-.1-.07-.1-.07-.09-.06-.1-.07-.08-.08-.1-.07-.08-.07-.09-.08-.1-.07-.08-.08-.08-.07-.09-.08-.06.35-.08-.09-.09-.06-.06-.09-.09-.08-.08-.08-.07-.1-.08-.09-.07-.08-.06-.08-.09-.1-.06-.09-.07-.1-.07-.08-.06-.1-.07-.1-.07-.08-.06-.1v-.1l-.07-.1-.05-.1-.06-.12v-.1l-.05-.1-.07-.1-.05-.1-.05-.11-.05-.1-.05-.1v-.12l-.05-.1-.22-.15v-.21l-.05-.12v-5.25l.05-.1v-.34l.05-.11v-.1l.05-.12.05-.1v-.1l.05-.12.05-.1.05-.1.06-.1v-.1l.05-.11.07-.1.07-.1v-.09l.06-.1.07-.1.07-.1.06-.1.07-.08.08-.1.07-.08.07-.1.08-.09.07-.1.08-.08.08-.08.07-.09.08-.08.09-.08.35-.17.09-.08.08-.09.1-.08.1-.08.08-.07.09-.08.1-.07.08-.07.1-.06.08-.07.1-.07.1-.06.09-.07.1-.07.1-.06.1-.05.1-.07.1-.05h.1l.1-.07.1-.05.1-.05h.1l.1-.05h.21l.1-.05.12-.05h3.19zm-.68 16.66h-.35zm5.57-15.28h.23-.2zm27 17.12h.95l.25.05h.23l.23.05.22.05.23.06.24.07.21.08.24.07.21.1.22.08.22.1.21.12.22.1.2.13.2.12.2.13.2.14.22.15.31.05h.24l.23.05.23.05.24.07.21.06.24.09.21.06.24.1.21.09.22.1.22.1.2.11.21.12.2.13.2.12.2.13.19.15.18.14.18.15.19.16.18.17.17.15.16.18.17.17.15.18.15.19.15.18.13.2.14.2.13.2.12.2.11.2.12.22.1.21.1.22.1.22.08.21.09.24.06.21.07.24.07.23.05.23v4.35l-.05.1v.24l-.05.11v.22l-.05.1v.22l-.05.11v.1l-.07.1v.12l-.06.1v.1l-.07.1-.07.1-.05.1-.06.1-.07.1-.07.1-.08.1-.07.1-.06.08-.07.1-.08.1-.09.09-.06.08-.09.1-.08.08-.08.09-.09.08-.08.1-.08.08-.09.09-.08.06-.08.09-.1.08-.09.08-.1.07-.08.08-.1.07-.08.07-.1.06-.1.09-.1.06-.1.07-.1.07-.1.05-.1.06-.1.07-.1.05-.12.07-.1.05h-.1l-.12.06-.1.05-.1.05-.11.05h-.12l-.1.05-.12.05h-.1l-.11.05h-.24l-.1.05h-3.2l-.75-.07-1.8.52-.72-.12-.66-.15-.7-.16-.74-.2-.81-.29-.57-.23h-.2l-.1-.05-.1-.05-.1-.05-.1-.05h-.12l-.25-.14-.1-.05-.1-.06-.1-.05-.1-.05-.08-.07-.1-.07-.1-.05-.1-.06-.08-.07-.1-.07-.09-.06-.2-.15-.08-.07-.08-.07-.1-.06-.09-.07-.08-.07-.08-.08-.09-.07-.08-.08-.08-.07-.09-.08-.08-.08-.08-.09-.07-.06-.07-.09-.08-.08-.08-.08-.09-.1-.06-.09-.09-.08-.06-.1-.09-.08-.06-.1-.07-.1-.07-.09-.06-.1-.07-.1v-.08l-.07-.08-.06-.1v-.1l-.07-.1-.07-.1v-.2l-.06-.1v-.12l-.05-.1v-.42l-.05-.11v-6.59l.05-.1v-.2l.05-.11v-.1l.05-.1v-.19l.05-.1v-.1l.05-.1.07-.1.05-.1.06-.08v-.1l.07-.1.07-.1.06-.08.07-.1.07-.09.06-.1.07-.08.07-.08.08-.1.07-.07.06-.1.09-.08.06-.09.09-.08.08-.08.08-.09.09-.08.08-.08.08-.09.09-.08.08-.07.08-.08.1-.08.1-.07.09-.08.1-.07.08-.08.1-.07.1-.07.1-.06.1-.07.1-.07.1-.06.1-.07.1-.07h.1l.1-.06.1-.05.12-.07.1-.05.1-.05.11-.05h.1l.12-.05.1-.05h.12l.11-.05.1-.05h.24l.11-.05h2.62zm5.78 14.16-.08.09-.09.08-.08.08-.1.09-.08.08-.09.08.44-.38.15-.18zm.83-1 .06-.07v-.05zm36.42-31.73h1.23l.3.07.3.06.3.09.3.08.3.1.29.12.28.11.28.14.27.15.27.15.26.16.27.17.25.18.23.19.24.2.23.21.22.22.21.22.2.23.2.25.19.25.18.25.17.27.15.26.15.27.13.28.13.29.12.28.1.28.1.3.08.3.07.3.07.3v4.22l-.05.15v.15l-.05.13-.07.15-.07.13v.15l-.06.14-.09.15-.06.13-.07.13-.08.14-.09.13-.08.13-.08.14-.09.11-.08.14-.1.13-.08.12-.1.11-.1.12-.1.13-.1.12-.1.1-.12.12-.1.11-.12.1-.11.12-.1.1-.12.1-.13.1-.12.1-.12.1-.13.08-.12.1-.13.09-.12.08-.13.08-.5.09-.14.08h-.08l-.11.1-.15.13-.47.45-.53.54-.55.6-.57.63-.53.62-1 1.21-.81 1-.32.35-.1.1-.1.1-.1.12-.12.1-.1.1-.11.1-.12.1-.12.1-.11.1-.12.08-.12.1-.13.09-.12.08-.13.08-.12.09-.13.08-.13.08-.14.07-.13.07-.13.06-.14.07-.13.07-.15.06-.13.07h-.14l-.15.05-.13.05-.15.05-.15.05h-.15l-.15.05h-4.28l-.15-.05h-.3l-.15-.05-.15-.05-.14-.05-.15-.07-.13-.05-.15-.06-.13-.07-.15-.07-.14-.06-.13-.07-.13-.08-.15-.07-.12-.08-.13-.09-.14-.08-.13-.08-.12-.1-.13-.09-.12-.1-.13-.1-.12-.1-.11-.1-.12-.1-.12-.1-.1-.11-.11-.1-.1-.12-.12-.12-.1-.1-.1-.11-.1-.14-.1-.11-.08-.12-.1-.13-.09-.12-.1-.13-.08-.14-.08-.11-.09-.14-.06-.13-.09-.13-.06-.15-.07-.14-.07-.13-.06-.15-.05-.15-.07-.13-.05-.15-.06-.15v-.15l-.05-.14v-4.67l.05-.15v-.3l.05-.15v-.14l.07-.15v-.15l.07-.13.06-.15.07-.13.07-.17.06-.12.07-.13.07-.12.06-.11.07-.14.07-.11.25-.39.08-.13.08-.13.09-.12.08-.13.1-.12.1-.13.08-.12.1-.12.1-.11.1-.12.12-.12.1-.11.12-.1.1-.12.11-.1.12-.1.12-.1.11-.1.64-.75.68-.8.75-.84.82-.86.85-.89.88-.83.53-.48.52-.44.57-.45.63-.45.72-.46.51-.29.14-.06.15-.09.13-.06.13-.07.15-.07h.14l.15-.06.15-.05h.13l.15-.05.15-.05h.3l.15-.05h2.03zm24.52-21.67h1.63l.23.05h.22l.23.06.22.07.22.08.23.09.22.08.2.1.21.1.22.12.2.11.2.12.2.12.2.13.18.13.2.15.19.14.16.16.19.15.16.17.17.17.17.16.15.17.15.18.15.19.13.18.13.2.14.2.13.2.12.2.11.2.1.22.1.2.1.21.09.22.08.23.08.22.07.22.07.23.05.22v5.25l-.05.12v.22l-.05.1v.21l-.05.1v.1l-.05.07v2.75l-.05.11v.54l-.05.11v.1l-.05.1v.22l-.06.1v.1l-.07.1v.1l-.07.1-.06.1-.07.1-.07.1-.06.1-.07.1-.07.08-.06.1-.09.09-.06.1-.07.08-.08.1-.09.08-.06.09-.09.08-.08.08-.08.09-.09.08-.08.08-.08.09-.1.08-.09.07-.08.08-.1.07-.08.08-.1.07-.09.08-.1.07-.1.06-.08.07-.1.07-.1.06-.1.05-.12.09-.1.06h-.1l-.1.07h-.11l-.1.07-.1.05-.1.05h-.1l-.12.05h-.1l-.1.05h-.12l-.1.05h-.2l-.11.05h-7.51l-.1-.05h-.22l-.1-.05-.12-.05h-.1l-.1-.05h-.1l-.1-.05-.11-.05-.1-.07h-.1l-.09-.05-.1-.07-.1-.06h-.05l-.1-.06-.1-.05-.08-.07-.1-.07-.1-.06-.08-.09-.09-.06-.1-.07-.08-.07-.08-.08-.09-.07-.1-.08-.08-.07-.08-.08-.09-.08-.06-.09-.09-.08-.08-.08-.08-.09-.07-.08-.08-.08-.07-.09-.07-.08-.08-.1-.07-.08-.06-.1-.07-.09-.07-.1-.06-.08-.07-.1-.07-.1-.07-.1v-.1l-.06-.1-.05-.1-.07-.1-.05-.1v-.1l-.05-.1v-.22l-.05-.1v-.1l-.05-.11v-5.17l.12-.62.23-.85.24-.73.23-.67.28-.7.47-1.08.32-.63.35-.64.25-.4.05-.1.06-.08v-.08l.07-.1v-.09l.07-.08.06-.08.07-.09.07-.08.1-.15.08-.08.07-.09.08-.1.07-.08.08-.08.08-.1.09-.09.06-.08.09-.08.08-.09.1-.06.08-.09.09-.08.08-.08.1-.07.08-.08.1-.07.09-.07.1-.06.1-.09.08-.06.1-.07.1-.07h.1l.1-.06.1-.07.1-.05.1-.07.1-.05h.12l.1-.06.1-.05.11-.05h.1l.1-.05h.12l.1-.05h.22l.11-.05h1.49-.6 1.29zm6.58 13.3-.07.09-.06.1.18-.24zm-11.73-8.25-.37.24.1-.07h.1l.1-.07h.1l.1-.06zm1.26-.56h-.06.09zm26.22-33.62h.88l.44.05.43.08.42.12.38.1.82.26.41.17.4.17.4.2.39.21.36.24.37.26.33.27.34.3.31.3.3.33.29.34.25.36.25.37.21.38.2.39.19.4.16.41.14.42.11.43.09.44.06.43v4.77h-9.72l-1.86 4.05h-.7v-13.1h.85-.15 2.38z"/><path d="m677.68 113.33 1.27.17 1.25.25 1.22.35 1.21.42 1.19.51 1.15.57 1.13.67 1.08.71 1.07.79 1 .85.51.45.49.48.45.5.43.5.4.52.43.6.62 1 .58 1.1.5 1.12.4 1.12.34 1.11.26 1.14.2 1.11.17 1.12.1 1.12.05 1.1v2.21l-.07 1.12-.1 1.1-.11 1.12-.17 1.1-.18 1.11-.22 1.1-.23 1.1-.27 1.1-.28 1.1-.32 1.1-.35 1.1-.35 1.09-.38 1.08-.42 1.08-.42 1.07-.45 1.07-.46 1.06-.49 1-.5 1.05-.53 1-.55 1-.57 1-.56 1-.6 1-.64 1-.63.93-.65.92-.68.88-.7.89-.72.85-.75.83-.77.8-.8.78-.81.75-.85.72-.9.7-.92.65-1 .62-1 .56-1.06.54-1.1.46-1.15.4-1.22.34-1.17.23-.73.08-.65.07h-2.02l-.68-.05-.68-.1-.69-.12-.66-.15-.69-.18-.65-.22-.63-.25-.63-.26-.6-.32-.6-.33-.57-.37-.53-.38-.6-.49-.6-.55-.19-.18-.18-.18-.18-.2-.34-.37-.25-.28-.21-.3-.52-.69-.63-1-.54-1-.45-1-.36-1-.32-1-.23-1-.2-1-.14-1-.11-1-.05-1v-3l.07-1 .1-1 .08-.61v-.24l-.22-1-.16-1-.14-1-.1-1v-4l.07-1 .08-1 .12-1 .15-1 .18-1 .18-1 .24-1 .23-1 .27-1 .3-1 .31-1 .34-1 .36-1 .39-.95.4-1 .43-.94.47-.91.46-.92.5-.9.54-.88.55-.89.58-.85.62-.85.63-.81.67-.8.68-.79.73-.76.77-.74.8-.7.85-.68.88-.65.92-.6 1-.57 1-.51 1.06-.47 1.09-.42 1.15-.33 1.16-.27 1.22-.2 1.23-.1h1.25zm-3.53 35.54v-.65zm-.13-5-.2.19-.24.23-.25.25-.26.3-.27.33-.27.35-.28.4-.27.42-.28.43-.15.29.35-.44.48-.58 1-1.37.65-.83z" fill="#fff"/><path d="m684.42 115.93h2.15l.38-.05h2.5l.35.07.35.08h.1l.37.1.33.12.5-.18.69-.24.7-.2.71-.18.74-.13.75-.1.75-.07h2.3l.76.08.77.12.75.15.75.2.73.21.74.27.7.28.7.34.68.35.67.36.65.4.63.44.62.45.56.43.54.43.51.47.52.48.48.5.47.52.43.53.44.54.4.55.38.56.37.59.33.6.32.58.28.62.27.61.25.62.21.62.22.68.32 1.2.23 1.25.15 1.27.08 1.23v1.23l-.05 1.22-.06.6.15.37.28.93.18.87.14.81.1.79v3.41l-.11 1.22-.15 1.12-.17 1-.18 1-.32 1.48-.22 1-.36 1.52-.25.9-.25.92-.29.95-.31 1-.35 1-.37 1-.4 1-.43 1-.47 1.06-.5 1.07-.55 1.07-.58 1.06-.64 1.07-.68 1-.73 1.05-.8 1-.84 1-.5.55-.48.48-.5.49-.53.46-.55.47-.59.45-.64.7-.64.41-.66.4-.69.37-.73.33-.75.32-.77.27-.81.25-.82.18-.85.17-.87.1-.86.06h-1.77l-.88-.08-.87-.14-.88-.18-.85-.23-.85-.27-.84-.3-.7-.3-.7-.33-.66-.37-.65-.38-.64-.4-.61-.44-.59-.45-.55-.46-.51-.53-.52-.52-.5-.52-.46-.53-.44-.55-.41-.57-.4-.56-.14-.19-.65-.11-.71-.17-.64-.17-.65-.18-.65-.22-.63-.21-.63-.27-.64-.27-.65-.31-.83-.45-.85-.5-.8-.54-.77-.56-.75-.62-.7-.65-.66-.67-.62-.7-.58-.73-.54-.75-.5-.75-.45-.78-.41-.79-.37-.8-.33-.8-.3-.8-.25-.8-.24-.81-.2-.8-.15-.8-.15-.8-.1-.79-.08-.8-.07-.78v-3.91l.07-.78.15-1.45.2-1.47.26-1.45.32-1.42.35-1.4.38-1.36.42-1.34.45-1.31.47-1.27.5-1.25.51-1.2.54-1.15.53-1.13.57-1.07.56-1 .6-1 .6-1 .55-.8.64-.82.68-.8.78-.78.6-.5.2-.17.2-.15.22-.15.33-.23.24-.15.21-.15.24-.13.35-.2.25-.14.23-.11.25-.12.37-.15.23-.1.25-.1.25-.08.72-.24 1-.25 1-.15.9-.08.82-.05h2.01zm-570.8 299.49h.53l.42.07.41.06.42.1.42.12.4.13.4.15.38.19h.07l.4.22.38.21.37.25.36.29.34.28.33.3.32.33.05.05.28.34.27.35.25.35.23.36.2.39.18.38v.08l.19.44.15.45.13.45.12.45v.11l.07.4.07.4v2.15l-.08 1.1-.15 1.09-.2 1.06-.23 1-.3 1-.34 1-.35.95-.4.93-.43.9-.45.89-.48.85-.5.83-.52.82-.12.16.07.22.1.37.1.38v.07l.06.41.07.4v2.12l-.05.37v.25l-.1.45-.12.46-.16.6-.34.87-.33.77-.35.73-.38.73-.42.74-.47.8-1 1.63-1.24 1.9-1.06 1.57.08.13.1.13.23.4.24.4.18.4.08.15.15.4.15.4.12.4.07.22.38-.25.77-.42.86-.4.6-.21.4-.14.4-.11.29-.07.45-.12.48-.06h3.04l.42.08.42.09.4.1.26.08.4.13.4.15.39.17.25.13.36.19.37.2.35.21.25.17.3.22.3.23.28.23.24.22.28.25.27.27.25.28.23.28.1.12.23.33.24.34.2.33.2.37.16.35.07.15.17.4.15.4.13.41.1.44v.15l.09.38v2.71l.08.5-.08.45v.22l-.1.36-.1.35-.17.5v.09l.25.28.29.4.28.4.25.42.22.45.2.45.16.45.15.46.12.49.08.48.05.48v1.47l-.07.48-.08.49-.12.48-.13.47-.17.46-.2.45-.21.44-.25.43v.08l-.24.34-.23.33-.25.3-.27.32-.35.36-.56.54-.57.48-1.13 1-1.39 1.08-1.6 1.24-1.78 1.33-1.92 1.4-2 1.45-2.07 1.45-2.18 1.4-2 1.35-2 1.25-.95.6-.92.55-.9.52-.86.5-.89.45-.91.42-1 .43-.75.22-.42.11-.43.1h-.17l-.43.08h-2.17l-.4.22-2.63 1.43-2.48 1.29-2.28 1.13-1.1.52-1 .46-1 .42-1 .38-1 .37-1 .3-.51.12-.37.06-.38.05h-1.93l-.47-.05-.43-.08-.45-.1-.43-.14h-.09l-.45-.15-.43-.18-.42-.2-.4-.24-.4-.25-.38-.26-.37-.3-.33-.3-.33-.34v-.05l-.32-.36-.3-.37-.27-.4-.25-.4-.23-.43-.2-.44-.17-.43-.16-.45-.12-.47-.07-.33h-2.05l-.4-.07-.4-.06h-.16l-.44-.1-.43-.11-.43-.15-.42-.19-.12-.05-.38-.18-.38-.2-.39-.23-.35-.25-.35-.27-.33-.28-.07-.07-.33-.32-.32-.33-.3-.35-.28-.37-.25-.38-.23-.4-.22-.4v-.08l-.18-.4-.15-.42-.14-.42-.11-.41-.1-.44-.07-.43v-2.3l.06-.43v-.12l.06-.38.1-.39.12-.36.13-.37.05-.13.12-.32.15-.3.15-.3.25-.47.48-.76.69-.89.66-.73.64-.67 1.08-1 1-.93.39-.37.26-.27.1-.11.07-.09 1.35-1.75 1.39-1.94 1.49-1.82 1.51-1.78 1.54-1.84.85-1-.12-.15-.25-.4v-.1l-.47-.09-.48-.11-.47-.14-.45-.15-.44-.19-.43-.21-.42-.24-.4-.26-.46-.29-.37-.3-.35-.33-.31-.34-.32-.36-.3-.37-.27-.4-.23-.4-.23-.42-.19-.43-.18-.45-.13-.45-.14-.47-.08-.45-.07-.48v-1.93l.08-.49.08-.46.12-.45.13-.41.15-.4.18-.4.2-.4.22-.39.23-.36.25-.35.29-.35v-.05l.26-.3.3-.3.32-.29.38-.33.64-.5 1.15-.8 1.46-1 1.75-1.17 2-1.3 1.3-.83.85-.79.93-.81.92-.79 1.73-1.48.72-.63.6-.57.2-.18.15-.17.08-.08v-.07l1.49-1.92 1.13-1.51.87-1.2.76-1.12.82-1.2 1-1.43 1.27-1.8 1.65-2.27 1.25-1.68 1.28-1.72 1.35-1.7.72-.9.68-.8 1.18-1.42.8-.93.49-.55.51-.53.59-.59.7-.63.83-.63.43-.29.34-.2.31-.18.14-.05.31-.17.32-.13.33-.13h.1l.37-.11.35-.12.37-.08.38-.07h.08l.45-.06h1.34z" fill="#fff"/><path d="m161.32 358.78.75.05.75.09.75.1.71.13.74.15.7.17.7.18.7.22.66.23.72.25 1.27.52 1.3.6 1.25.63 1.25.7 1.21.73 1.2.79 1.17.8 1.17.86 1.15.87 1.13.92 1.13 1 1.1 1 1.1 1 1.09 1 1.06 1 1.07 1 1 1.09 1 1.08 1 1.1 1 1.12 1 1.11 1 1.12 1 1.13.91 1.14.92 1.11.88 1.14.87 1.11.83 1.12.82 1.12.82 1.11 1.5 2.14 1.4 2.08 1.26 2 .62 1 .57.95.53.94.52.9.46.88.45.85.42.83.38.84.35.81.32.85.3.87.27 1 .13.69.08.46.05.47v1.92l-.06.58-.12.55-.07.33-.11.44-.12.43-.23.68-.42 1-.45.85-.45.78-.48.74-.5.7-.52.68-.53.67-.55.66-.6.69-1.19 1.3-1.3 1.33-1.38 1.35-1.45 1.38-1.52 1.4-1.56 1.4-1.64 1.44-1.65 1.43-1.71 1.34-1.72 1.43-3.4 2.8-3.33 2.77-3.18 2.55-2.94 2.33-2.56 2.07-2.14 1.71-.83.69-.67.56-.43.39-.27.23-2.73 2.69-2.8 2.78-2.83 2.78-2.85 2.75-2.85 2.75-2.85 2.72-5.72 5.44-5.75 5.41-5.75 5.39-11.5 10.76-11.48 10.69-5.72 5.31-5.68 5.37-5.65 5.38-2.82 2.7-2.8 2.7-2.8 2.72-2.78 2.71-2.77 2.74-2.73 2.73-.54.55-.5.52-1 1.13-1 1.17-1 1.2-1 1.23-1 1.25-2 2.62-2 2.61-1 1.34-1 1.31-1.08 1.32-1.12 1.3-1.15 1.25-.62.65-.63.62-.63.61-.65.6-.69.59-.7.58-.71.57-.75.55-.77.53-.8.5-.83.5-.85.45-.89.43-.91.4-.94.35-1 .34-1 .28-1 .23-1 .19-1 .13-1.06.1h-2.35l-1.08-.05-1.09-.12-1.1-.17-1.1-.21-1.1-.27-1.08-.3-1.1-.37-1.05-.36-1.1-.45-1.1-.48-1.1-.54-.72-.36-.7-.4-.68-.4-.69-.44-.65-.41-.66-.49-1.22-.88-1.18-1-1.15-1-1.12-1-1.07-1-1-1-1-1-.95-1-.94-1-1.7-1.89-1.55-1.78-1.31-1.52-1.25-1.5-1.2-1.46-1.16-1.38-1.07-1.42-1-1.38-1-1.37-.83-1.35-.82-1.3-.76-1.34-.7-1.31-.62-1.35-.59-1.3-.53-1.3-.47-1.3-.4-1.3-.36-1.3-.27-1.3-.2-1.32-.13-1.31v-1.32l-.05-1.25.11-1.28.19-1.32.25-1.25.32-1.22.38-1.18.45-1.13.5-1.1.53-1.07.59-1 .61-1 .65-.95.67-.92.7-.86.72-.85.75-.84.75-.81.76-.79.79-.76.8-.77.83-.77 1.65-1.46 1.7-1.47 1.71-1.48 1.75-1.49 1.77-1.51 1.78-1.57 1.82-1.63.88-.8.9-.85.9-.87.9-.88.9-.9.9-.92.89-.95.91-1 7.19-8 3.63-4 3.65-4 3.67-4 3.71-3.95 3.74-3.93 3.76-3.9 1.94-1.85 1.92-1.94 1.93-1.93 2-1.92 2-1.9 2-1.9 2-1.88 2-1.88 2-1.85 2-1.85 2-1.85 1.95-1.82 2.08-1.82 2.1-1.8 2.12-1.76 2.1-1.74 2.13-1.78 2.09-1.78 2-1.8 2-1.82 2-1.85 2-1.85 2-1.88 2-1.9 4-3.84 4.09-3.86 2.08-1.95 2.1-1.95 2.13-1.94 2.2-2 1.55-1.33 2.32-1.94 2.8-2.3 3-2.45 5.27-4.28 1.71-1.37.7-.53.34-.23.68-.42.72-.35.75-.28.51-.14-.06-.79v-.8l.08-.78.15-.78.22-.77.3-.73.35-.7.43-.67.49-.63.55-.57.48-.47.63-.55.67-.53.67-.5.71-.45.74-.43.73-.39.77-.35.76-.31.79-.27.78-.23.8-.2.8-.15.78-.12.8-.08h2.34zm-.95 16.65h-.22l-.06.05-.07.06-.2.2-.6.52-.65.47-.68.4-.72.31-.75.27-.35.08.08.7v.8l-.06.8-.14.79-.21.76-.29.74-.36.71-.42.69-.48.63-.55.58-.59.52-.53.38.07-.07-.19.15-1.56 1.25-5.2 4.22-2.94 2.4-2.73 2.27-2.22 1.83-1.31 1.13-2 1.8-2 1.85-2 1.89-2 1.88-4.05 3.83-4.39 4.01-2 1.94-2.08 1.93-2.1 1.95-2.13 1.93-2.17 1.92-2.2 1.91-2.25 1.92-2.25 1.87-2 1.7-2 1.68-2 1.7-2 1.73-2 1.74-2 1.75-1.95 1.76-1.87 1.81-1.92 1.8-1.9 1.8-1.88 1.83-1.88 1.83-1.89 1.85-1.85 1.87-1.86 1.87-1.82 1.88-3.68 3.8-3.65 3.83-3.67 3.89-3.62 3.9-3.6 3.91-3.58 3.95-7.2 8-1 1.11-1 1.12-1 1.1-1.17 1.09-1 1-1 1-1 1-1 .95-2 1.76-1.91 1.69-1.92 1.5-1.75 1.5-1.67 1.42-1.58 1.33-1.44 1.28-.56.57-.62.59-.58.56-.53.55-.5.54-.45.51-.42.49-.37.46-.33.45-.28.42-.25.4-.22.37-.17.35-.15.31-.11.3-.1.3-.07.29-.07.26v1.65l.06.42.1.48.14.52.18.58.23.64.27.68.33.73.4.8.45.85.52.9.58 1 .65 1 .74 1 .78 1.1.87 1.15.95 1.2 1 1.25 1.09 1.32 1.18 1.37 1.43 1.63 1.55 1.72.72.86.78.82.8.81.8.79.8.73.79.72.76.65.75.6.77.56.32.22.33.22.33.21.32.19.3.16.28.15.64.3.6.27.58.23.53.2.5.15.47.14.42.1.4.08.36.05h1.75l.24-.05h.25l.23-.07.25-.08.25-.1.25-.1.27-.13.28-.15.28-.17.32-.2.3-.22.33-.25.35-.25.34-.3.36-.31.37-.34.38-.36.39-.39.38-.4.83-.91.85-1 .89-1 .9-1.13.91-1.2 2-2.57 2.08-2.7 1.1-1.41 1.14-1.56 1.2-1.43 1.25-1.45 1.3-1.42.7-.73.7-.7 2.82-2.82 2.81-2.78 2.84-2.77 2.83-2.75 2.85-2.75 2.85-2.73 5.72-5.43 5.73-5.4 5.73-5.39 11.5-10.7 11.5-10.7 5.7-5.35 5.7-5.36 5.67-5.34 2.82-2.7 2.8-2.71 2.8-2.72 2.8-2.73 2.76-2.74 2.87-2.85.63-.6.79-.68.85-.73 1-.8 2.22-1.8 2.61-2.09 2.92-2.33 3.13-2.52 3.27-2.63 3.28-2.72 1.62-1.35 1.6-1.35 1.55-1.33 1.5-1.32 1.42-1.28 1.35-1.25 1.25-1.18 1.13-1.12 1-1 .88-1 .23-.27-.08-.15-.33-.61-.39-.69-.41-.71-.47-.77-.47-.78-1.1-1.72-1.21-1.8-1.34-1.9-.68-.95-.72-1-.75-1-.76-1-.77-1-.8-1-.82-1-.83-1-.83-1-.85-1-.87-1-.87-.95-.88-.92-.87-.9-.88-.88-.88-.87-.89-.82-.88-.8-.87-.76-.86-.72-.85-.68-.84-.65-.81-.6-.82-.55-.77-.5-.75-.47-.71-.4-.69-.33-.63-.3-.63-.25-.24-.09-.25-.1-.25-.06-.21-.07-.22-.05h-.98z"/><path d="m336.5 188.15 1.07.1 1 .13 1 .19 1 .2.95.21.94.24.9.25.9.26 1.65.54 1.58.55 1.52.53 1.38.48 1 .19 2.13.43 1 .17 1.27.21 2.93.47 1.34.23.66.14.82.18.53.17.69.25.63.3.62.36.6.42.56.48.52.52.47.56.41.6.1.19h.12l.2.05.68.19.67.23.2.08.53.25.52.27.2.12.42.26.4.29.2.13.3.25.3.27.43.38.58.62.5.6.42.56.4.59.27.43.25.17 4.2 2.81 1.63 1.12.77.57.45.36.58.52.52.57.1.13.43.57.38.6.34.63.28.67.22.66.15.71.07.4.52.29 1.25.71.68.42.68.42.7.46.7.5.74.55.75.64.75.73.51.58.49.6.46.62.42.67.37.68.18.42.18.43.15.43.05.12.15.52.1.53.09.53v.09l.05.76v.75l-.09.77-.15.73v.07l-.2.65-.24.63-.3.62-.35.58-.4.55-.43.54-.47.48h-.05l-.35.3.2.64.24.9.2.9.18.88.15.88.12.87.1.85.1.88.11 1.6v1.19l.27 1 .35 1.43.18 1.12.29 1.78.35 2.37.36 2.65.17 1.38.15 1.35.13 1.32.1 1.25.05 1.18v1.45l-.05.53-.07.47-.08.45-.05.18-.17.67-.23.65-.27.62-.07.11.05.07.3.5.24.41.4.84.3.73.26.75.24.75.2.75.18.73.13.74.12.73.08.73.07.72v2.87l-.08 1.33-.14 1.37-.2 1.35-.23 1.35-.27 1.31-.31 1.3-.35 1.3-.39 1.27-.4 1.27-.41 1.25-.45 1.21-.47 1.2-.23.55v2.94l-.05.76-.1.77-.19.75-.25.72-.31.7-.37.68-.43.63-.5.59-.55.53-.59.5-.65.43-.66.37-.57.25-.1.17-.83 1.36-.39.65-.65 1.14-.85 1.48-.5.85-.55.87-.58.9-.63.9-.7.93-.17.2-.85 1.6-1 1.68-.83 1.42-.8 1.25-.77 1.13-.82 1.19-1 1.41-.32.45-.28 1.1-.37 1.1-.4 1-.45 1-.47 1-.51 1-.54 1-.36.68-.17.53v.12l-.22.6-.27.57-.08.15-.23.41-.25.4-.42.64-.65.83-.63.73v.05l-.35.55-.66 1-.67 1-.67.95-.65.91-.66.89-.67.83-.68.8-.72.78-.82.8-.9.77-.73.52-.45.26-.42.24-.41.2-.14.06-.61.25h-.05l-1.59 1.59-3.25 3.13-.13.13-.27.54-.41.63-.47.6-.52.55-.83.83-.95.9-1.18 1.12-1.32 1.23-1.4 1.27-1.4 1.2-.73.62-.65.51-2.55 2-1.5 1.15-1.5 1.39-1.73 1.28-1.84 1.35-1.9 1.3-1 .66-1 .65-1 .65-1 .64-1 .61-1.05.6-1.05.59-1.08.55-1.07.53-1.1.5-1.11.48-1.14.44-1.15.4-1.18.35-1.22.3-1.2.21-.71.1-.69.07h-1.95l-.76-.08-.74-.15-.73-.23-.37-.15-.26.11-1.97.87-2 .81-2 .79-1.07.38-1.05.37-1 .33-1.05.33-1.05.29-1.06.26-1.07.24-1.1.2-1.13.15-1.19.1h-1.33l-.78-.05-.74-.09-.76-.15-.84-.2-.51-.18-.72-.27-.2-.1-.35-.21-.23.07-.45.07-1 .11-1 .05-1.15.05h-1.94l-.78-.08-.93-.13-1-.24-1.31-.43-1.12-.4-1.08-.43-1-.44-.23-.11h-4.35l-.76-.1-.74-.18-.73-.23-.7-.32-.67-.37-.63-.43-.6-.48-.53-.54-.5-.6-.44-.61-.25-.45-.53-.17-2.53-.85-1.55-.5-.92-.28-.12.06-1 .54-1 .43-1 .33-1 .27-1 .17-1 .1h-1.88l-.88-.09-.87-.13-.83-.17-.8-.2-.77-.23-.75-.25-.73-.27-.7-.3-.69-.31-.68-.34-.65-.33-.65-.37-.67-.38-1.18-.75-1.18-.82-1.17-.83-1.12-.87-1.08-.9-1.07-.9-1-.91-1-.92-.8-.78-.14-.07-.43-.28-.27-.19-.36-.25-.35-.28-.52-.45-.68-.67-.6-.65-.55-.63-.54-.65-.53-.7-1-1.35-1-1.45-.89-1.28-1.88-2.59-1.25-1.73-1.23-1.72-1.07-1.55-.5-.75-.29-.59-.37-.66-.13-.27-.3-.68-.24-.72-.16-.73v-.07l-.1-.7v-1.4l.07-.68.13-.7.2-.67.25-.65.1-.21-.36-.7-1-1.9-.93-1.9-.45-1-.45-1-.42-1-.42-1-.4-1-.38-1-.37-1.05-.35-1.06-.36-1.22-.34-1.22-.3-1.2-.28-1.2-.27-1.16-.23-1.19-.43-2.26-.75-4.32-.39-2.05-.18-1-.2-.91-.3-1.37-.42-1.83-.18-1-.1-.63-.05-.44v-1.21l.05-.74.11-.73.19-.7.13-.38-.27-.4-.4-.75-.33-.74-.27-.73-.21-.7-.15-.68-.14-.67-.1-.72-.08-1.1v-1.15l.05-1.08.1-1.05.15-1 .18-1 .2-1 .24-.95.25-.92.26-.91.29-.9.3-.89.3-.88.61-1.63.62-1.57.62-1.43.56-1.32.54-1.15.8-1.65.36-.7.3-.55v-.07l.07-.51v-.15l.17-.77v-.17l.12-.4.15-.38.27-.7.45-1 .41-.75.39-.65.36-.58.54-.82.13-.48.22-.74.23-.73.27-.73.51-1.32.57-1.3.57-1.23.58-1.19.58-1.13.57-1.08.43-.82.57-1.27.78-1.66.25-.55.15-.47.44-1.27.48-1.25.53-1.21.55-1.19.59-1.16.6-1.15.63-1.14.63-1.11.65-1.09.67-1.06.67-1.05.68-1 .27-.4v-.08l.2-.38.12-.72.13-.7.17-.68.18-.67.2-.65.23-.63.25-.67.5-1.13.57-1.15.6-1.1.65-1 .67-1 .68-1 .73-1 .74-1 .75-.92.76-.9.77-.88.78-.85.79-.87 1.53-1.56 1.52-1.52 1.46-1.4 2.57-2.45 1.07-1 1.1-1.08 1.63-1.42 3-2.58 3.11-2.64 1.24-1 .91-.73.72-.48.63-.4 1.22-.72 1.3-.7.75-.38.73-.34.79-.33.58-.23.35-.25.72-.54.71-.48.72-.48.75-.47.75-.45.77-.43.78-.42.8-.38.83-.39.87-.33.88-.32.94-.28 1-.22 1-.18 1.08-.12h1.12l1.16.07.82.1.38.06.39.09.45.1.4.11.38.12.43.15.4.15.39.17.41.18.34.17 1-.17 1.07-.52v-.15l.1-.7.15-.68.2-.67.24-.58.28-.58.33-.54.37-.53.43-.5.45-.49.5-.43.52-.38.56-.35h.07l.58-.32.62-.25.62-.22.63-.16h.13l.69-.12.7-.06h1.6l.75.1 1 .18 1 .22.92.25 1.68.48 1.62.47.68.2.55.13.34.09h.16l.77.1.95.09 1.07.06 1.15.09 2.51.13 1.35.08 1.4.12 1.45.13 1.49.17 1.48.22.8.15.77.15.8.16.78.2.8.22.8.25.82.27.81.31.82.35.67.3.68.37.17.1.5.32.46.35.45.38v.05l.53.53.48.59.1.15h.6l.3-.27.62-.46.65-.4.7-.35.72-.29.75-.2.75-.15.78-.06h1.7zm-35.93 17-2.14.33-2.13.3-2 .29-1.89.25-1.68.2-1.43.15-1.19.11-.81.05-1.54.78-3.11 1.6-1.65.79h-.08l-.07.05-.73.41-.75.44-1.4.73-1.42.7-1.35.63-1.26.55-1.15.49-1 .4-1 .35-.62.18-.38.1-.38.08-.54.1-.73.12-1.32.17h-.25l-.6.12-.91.15h-.27l-1.38 1-1.49 1-1.4 1-1 .65-.65.58-1 .87-1 .83-.64.48-.4.69-.76 1.16-.77 1.15-.78 1.12-.79 1.08-.8 1.07-.8 1-.8 1-1.55 1.92-1.43 1.73-.28.35-.34.43-.76 1.07-.17.4-.32.77-.35.76-.66 1.44-.7 1.38-.7 1.35-.7 1.28-1.29 2.34-.55 1-.48.93-.38.79-.3.65-.2.51-.29.79-.73 2.11-.82 2.42-.45 1.27-.46 1.26-.49 1.25-.51 1.19-.35.7-.37.68-.45.75-.37.5-.28.37-.3.36-.17.19-.53.53-.58.5-.17.12-.48.35-.5.3-.54.26h-.06l-.4.16v.17l.12.57.16 1.33.1 1.18v3.4l.12.33.2.73.13.77.05.77v1.26l-.07.55-.1.55-.13.55v.09l-.2.63-.26.62-.3.58-.37.57-.2.26-.2 1-.45 1.88-.9 3.54-.42 1.68-.38 1.6-.33 1.57-.1.53.53.47.53.56.47.6.42.65.36.67.3.72.22.73.15.75.1.77v1.45l-.08.9-.14 1-.15.63-.08.38-.12.39-.1.26-.16.45-.19.45-.1.22-.28.55-.32.52-.11.18-.45.6-.49.57-.13.13-.43.42-.45.38-.49.35-.13.1-.58.35h-.07l.43 1.45.3.92.3.88.3.84.35.91.27.74.33.9.62 1.9.62 2 .28 1 .28 1 .24 1 .21 1 .2 1 .09.71v1.55l-.05.54v.13l-.1.62-.14.6-.05.16.77 1.44.9 1.63.93 1.63 1 1.67 2 3.38 1 1.7 1 1.74 1 1.76.87 1.59.05.08.13.2.25.32.7.86.44.59.5.7.16.23.57-.08h2.35l1.1.09 1.06.13 1 .15 1 .2 1 .23 1 .27 1 .28 1 .3 1 .32.95.33.95.35.94.39.93.38 1.78.77 1.75.8 1.69.81 1.63.8 1.55.79 2.83 1.43 1.25.63 2.07 1 .93.47 1.59.82.78.2.92.21.93.22.72.15h.18l1.82-.35 1.91-.37 1.94-.35 1.71-.28 1.19-.19 1.23-.15.8-.06h2l.5.07.27.05.68.13.67.2h.08l.72.29.66.33h.07l.52.3.23.17 2.5-.34 1.5-.2 1.53-.16 1.57-.17 1.62-.12 1.65-.06h1.46l2.6-1.2 1.9-.86.12-.05.39-.22.5-.31.65-.4 1.53-1 .87-.55.93-.57.95-.55.62-.3.6-.3.68-.28.78-.27.55-.15.39-.1.38-.08.25-.05.48.17.51-.05h.92l.7.05h.2l.6.08.6.15.57.17.18.06.52.2.65-.46 1.55-1.2 1.5-1.13 1.42-1.09 2.45-1.88.43-.35.45-.37 1.12-1 1.18-1.07.87-.82.25-.45.38-.6.45-.55.27-.31 1.88-1.87 1.64-1.6 3.21-3.12 1.55-1.51 1.14-1.15.35-.69.35-.65.38-.6.4-.61.73-1.05.8-1 .84-1 .85-1 .85-.94.86-.88.85-.83.35-.34v-.26l.1-.69.13-.75.17-.83.23-.9.27-1 .38-1.09.45-1.06.37-.7.38-.67.48-.72.37-.45.5-.56.17-.19.31-.31.35-.3.17-.15.42-.34.45-.3.18-.11.53-.3.1-.05.69-.81.76-1.12.34-.46-.07-.32-.07-.48v-1.57l.05-.5v-.32l.06-.48.1-.47.17-.71.32-1 .35-.85.35-.78.36-.72.39-.68.4-.7.75-1.22.8-1.18.8-1.12.73-1 .7-.9 1.05-1.32.42-.52.5-.56.55-.52.61-.47.64-.4.68-.35.7-.28.22-.07.41-.86.17-.35v-8.3l.05-.9.09-.92.05-.5.05-4.3v-13.1l-.05-.17-.24-.7-.35-1.28-.33-1.35-.28-1.38-.25-1.4-.24-1.42-.2-1.45-.18-1.47-.17-1.46-.15-1.47-.11-1.45-.12-1.45-.2-2.75-.13-2.57v-.11l-.37-.79-1-1.93-1-1.92-1.07-2-1.1-2-2.25-4-1.13-2-.37-.67-.51-.32-1.64-.91-1.65-.89-1.68-.86-1.73-.89-1.77-.86-3.63-1.8-1.87-.94-1.88-1-1.9-1-1.93-.94-1-.57-1-.56-1-.6-1-.62-.94-.63-.88-.64-.8-.61-.68-.59-.44-.38h-4.6l-2.48.05h-11.6l-1.57-.07-1.58-.08-1.6-.12-1.62-.15-1.61-.17-1.62-.21-1.63-.25-1.64-.3-1.61-.34-1.59-.38z" fill="#fff"/><path d="m318.07 198.68h2.53l1.27.05 1.26.07 1.27.08 1.25.1 1.27.12 1.25.15 1.25.15 1.23.17 1.25.18 1.23.22 1.24.21 1.21.25 1.22.25 1.2.32 1.2.3 1.2.33 1.2.33 1.18.37 1.18.37 1.17.4 1.17.43 1.15.43 1.13.47 1.13.48 1.12.52 1.17.57 1.1.55 1.08.59 1.08.6 1.07.61 1.05.65 1 .67 1 .7 1 .72 1 .75 1 .76 1 .8.94.82.91.83.9.87.89.9.86.92.84.95.81 1 .8 1 .77 1 .75 1 .72 1.07.7 1.08.68 1.12.63 1.15.64 1.16.58 1.19.57 1.21.53 1.24.52 1.25.46 1.28.45 1.3.44 1.32.38 1.35.37 1.36.31 1.39.3 1.41.32 1.65.27 1.69.25 1.68.2 1.7.16 1.7.12 1.7.1 1.72.07 1.71v5.2l-.07 1.74-.1 1.73-.13 1.75-.17 1.73-.25 1.73-.22 1.75-.25 1.74-.28 1.75-.3 1.73-.32 1.75-.36 1.73-.37 1.74-.42 1.73-.41 1.73-.47 1.74-.47 1.71-.51 1.72-.52 1.7-.55 1.7-.57 1.7-.6 1.68-.6 1.69-.63 1.66-.67 1.65-.66 1.65-.7 1.64-.7 1.63-.74 1.62-.75 1.6-.78 1.6-.78 1.56-.8 1.57-.84 1.55-.83 1.53-.8 1.55-.88 1.5-.89 1.47-.9 1.46-.91 1.45-.94 1.44-.95 1.4-1 1.4-1 1.36-1 1.34-1 1.33-1 1.3-1 1.28-1 1.25-1.07 1.24-1.06 1.2-1.09 1.18-1.1 1.15-1.21 1.15-1.08 1-1.17 1-1.2 1-1.25 1-1.3 1-1.32.9-1.35.87-1.38.83-1.4.8-1.44.77-1.46.75-1.49.71-1.5.7-1.5.65-1.53.65-1.53.6-1.55.57-1.57.55-1.55.52-1.57.48-1.56.45-1.55.42-1.55.38-1.55.35-1.55.32-1.52.28-1.52.23-1.51.2-1.49.17-1.48.12-1.45.06h-3.78l-2.4-.06-2.45-.12-2.49-.18-2.53-.22-2.57-.28-2.56-.34-1.35-.23-1.3-.2-1.31-.23-1.32-.24-1.33-.25-1.32-.25-1.33-.28-1.34-.3-1.31-.32-1.34-.33-1.33-.33-1.33-.37-1.32-.38-1.32-.4-1.33-.42-1.32-.43-1.3-.47-1.31-.47-1.3-.5-1.29-.51-1.28-.54-1.28-.55-1.27-.58-1.27-.6-1.25-.62-1.23-.65-1.23-.66-1.22-.69-1.2-.71-1.18-.74-1.17-.76-1.17-.79-1.13-.81-1.12-.84-1.1-.86-1.08-.9-1.07-.92-1-.95-1-1-1-1-1-1-.95-1.06-.9-1.1-.9-1.12-.85-1.15-.82-1.2-.78-1.2-.75-1.25-.72-1.27-.7-1.35-.57-1.18-.5-1.25-.46-1.28-.4-1.29-.35-1.3-.3-1.31-.27-1.34-.23-1.33-.19-1.37-.15-1.36-.11-1.39-.09-1.4-.06-1.41v-5.77l.08-1.47.09-1.48.11-1.48.14-1.49.15-1.5.18-1.5.18-1.51.22-1.52.22-1.52.25-1.5.25-1.51.26-1.52.29-1.53.6-3 .65-3 .68-2.95.73-2.91.75-2.87.77-2.8.78-2.72.82-2.65.8-2.55.82-2.43.8-2.33.8-2.22.8-2.08.76-1.95.77-1.82.75-1.65.65-1.38.28-.6.25-.57.25-.68.29-.77.28-.83.3-.9.62-2 .63-2.15.68-2.22.35-1.15.39-1.15.38-1.15.42-1.15.45-1.17.46-1.15.52-1.15.58-1.15.62-1.08.38-.63.4-.57.42-.58.45-.59.5-.58.55-.57.62-.56.66-.55.74-.54.83-.5.88-.45.62-.25.4-.14.35-.12.3-.08.38-.12.39-.08h.28l.4-.08.4-.05h2.88l.37.07.68.11.27.07.27-.17 1-.63 1-.62 1-.6 1-.58 1-.58 1-.57 1-.57 1-.53 1.07-.55 1.07-.52 1.08-.51 1.1-.5 1.1-.5 1.12-.49 1.13-.46 1.13-.45 1.14-.45 1.15-.44 1.16-.43 1.17-.42 1.18-.4 1.19-.38 1.24-.37 1.22-.37 2.4-.68 2.41-.65 1.25-.3 1.24-.3 1.23-.29 1.25-.26 1.23-.25 1.25-.24 1.27-.23 1.25-.22 1.27-.2 1.26-.18 1.25-.17 1.29-.16 1.26-.15 1.27-.12 1.27-.12 1.28-.1 1.27-.1 1.28-.06 1.27-.07h5.1zm-2.3 16.67h-2.15l-1.07.05-1.08.05-1.09.08-1.08.08-1.08.1-1.09.12-1.08.12-1.1.13-1.08.15-1.09.17-1.08.16-1.07.19-1.08.2-1.08.2-1.07.21-1.07.24-1.06.23-1.07.27-1 .25-2.12.56-2.08.6-1 .3-1 .34-1 .33-1 .33-1 .35-1 .37-1 .37-1 .38-1 .38-.95.4-.93.4-.93.42-.9.42-.92.43-.88.43-.89.45-.85.45-.85.45-.85.47-.81.47-.8.46-.8.49-.79.5-.75.48-.75.5-.71.5-.64.62-.7.5-.67.51-.66.52-.64.52-.61.53-.6.52-.59.53-.56.53-.6.59-.5.46-.55.42-.59.37-.61.31-.64.29-.65.21-.48.12-.58 1.93-.65 2.19-.69 2.18-.36 1.13-.37 1.1-.4 1.1-.43 1.1-.47 1.1-.45 1-.58 1.22-.57 1.28-.63 1.5-.67 1.67-.7 1.83-.72 2-.73 2.12-.75 2.23-.73 2.35-.75 2.44-.74 2.53-.71 2.58-.69 2.65-.66 2.69-.64 2.71-.6 2.74-.55 2.76-.25 1.35-.28 1.29-.21 1.37-.22 1.35-.2 1.35-.18 1.33-.17 1.33-.17 1.3-.13 1.3-.1 1.29-.1 1.25-.08 1.23v1.22l-.05 1.18v4.47l.06 1 .09 1 .11.95.12.9.15.87.15.82.18.75.19.7.21.65.2.6.22.51.25.52.4.8.47.8.48.8.5.78.53.77.55.75.59.73.6.74.63.7.65.7.68.7.7.66.72.67.75.65.78.63.79.62.81.62.84.6.86.58.89.57.88.56.92.54 1 .53 1 .52 1 .5 1 .5 1 .46 1 .47 1 .45 1 .43 1.05.42 1.06.4 1.09.4 1.08.38 1.1.37 1.1.35 1.12.33 1.11.32 1.14.32 1.13.28 1.13.28 1.14.27 1.13.27 1.15.23 1.15.23 1.13.22 1.15.2 1.14.18 1.13.19 1.12.15 2.28.3 2.23.25 2.2.18 2.17.15 2.12.12 2.06.05h3.85l1-.08 1.05-.12 1.09-.15 1.13-.16 1.17-.22 1.18-.25 1.22-.27 1.23-.3 1.25-.35 1.25-.35 1.27-.4 1.26-.41 1.27-.44 1.27-.46 1.25-.5 1.23-.52 1.22-.52 1.18-.56 1.17-.57 1.15-.58 1.1-.6 1.06-.6 1-.62 1-.63.93-.64.87-.61.82-.64.76-.63.69-.6.66-.63.87-.89.9-.95.9-1 .88-1 .89-1 .88-1.05.87-1.09.86-1.11.87-1.12.85-1.17.83-1.16.84-1.2.83-1.22.8-1.25.8-1.25.8-1.28.77-1.3.76-1.32.75-1.32.74-1.35.73-1.36.7-1.37.7-1.4.68-1.4.65-1.42.65-1.41.64-1.44.61-1.45.59-1.45.58-1.46.57-1.47.53-1.48.52-1.49.5-1.48.48-1.5.47-1.5.43-1.5.42-1.5.4-1.5.36-1.5.35-1.5.34-1.5.3-1.5.28-1.5.27-1.5.23-1.48.2-1.49.18-1.48.17-1.48.13-1.45.12-1.47.08-1.45.05-1.43v-5.66l-.08-1.37-.1-1.37-.14-1.35-.15-1.33-.18-1.32-.22-1.3-.23-1.28-.22-1-.25-1-.25-1-.26-1-.3-.92-.32-.9-.32-.88-.35-.87-.36-.83-.39-.82-.38-.78-.42-.79-.43-.75-.45-.73-.45-.73-.48-.7-.49-.69-.51-.66-.52-.65-.53-.64-.55-.63-.57-.6-.58-.6-.6-.57-.62-.56-.63-.55-.64-.54-.66-.51-.67-.52-.68-.48-.72-.49-.72-.46-.73-.45-.75-.44-.75-.43-.78-.4-.79-.4-.81-.38-.82-.39-.83-.35-.84-.35-.86-.33-.87-.32-.88-.3-.9-.28-.9-.28-.94-.25-.91-.25-.95-.24-.95-.23-.95-.2-1-.2-1-.17-1-.16-1-.15-1-.15-1-.12-1-.12-1-.08-1-.08-1-.09h-1.05l-1.05-.05h-4.4z"/><path d="m296.1 170.57 2 .05 2 .08 2 .13 2 .15 2 .19 1.95.2 1.95.23 1.92.25 1.91.27 1.92.26 3.75.59 7.4 1.21 3.67.59 1.78.26 1.9.29 1.53.25 1.22.21 1.38.27 1.55.32 1.69.36 1.78.42 1.82.45 1.81.48.94.29.9.28.9.28.9.32.88.35.88.37.9.4.9.46 1 .59.92.65.61.51h.17l1.25.12 1.25.13 1.23.15 1.22.19 1.22.21 1.18.24 1.18.25 1.17.26 1.15.3 1.13.34 1.14.33 1.1.38 1.1.39 1.08.41 1.07.44 1.05.45 1 .46 1 .5 1 .52 1 .53 1 .55 1 .59.93.58.94.62.9.63.9.63.86.67.87.68.85.7.82.7.81.74.8.73.79.77.75.76.75.79.73.8.72.8.7.83.68.83.67.85.65.85.63.87.62.88.6.89.6.9.56.91.57.92.55.93.52.94.51.93.5 1 .5.95.47 1 .47 1 .43 1 .43 1 .42 1 .42 1 .38 1 .38 1 .37 1 .35 1.05.67 2 .61 2.09.57 2.11.52 2.12.48 2.13.42 2.15.38 2.15.33 2.17.3 2.18.24 2.17.21 2.18.17 2.19.12 2.2.06 2.18.05 2.18v2.17l-.05 2.18-.08 2.17-.12 2.15-.15 2.15-.2 2.13-.23 2.12-.27 2.1-.3 2.08-.35 2.07-.36 2.05-.42 2-.45 2-.48 2-.52 2-.55 1.9-.53 1.68-.54 1.68-.55 1.67-.58 1.65-.6 1.67-.62 1.65-.65 1.63-.65 1.65-.68 1.63-.7 1.62-.73 1.62-.74 1.61-.88 1.62-.79 1.58-.8 1.6-.81 1.59-.84 1.56-.85 1.57-.86 1.57-.9 1.55-.92 1.53-.92 1.53-.95 1.52-1 1.5-1 1.5-1 1.5-1 1.48-1 1.47-1 1.45-1.05 1.45-1.08 1.43-1.1 1.42-1.13 1.4-1.12 1.4-1.15 1.38-1.15 1.37-1.16 1.35-1.2 1.33-1.2 1.33-1.22 1.34-1.23 1.3-1.24 1.28-1.26 1.27-1.27 1.27-1.3 1.23-1.3 1.23-1.3 1.2-1.33 1.2-1.35 1.17-1.35 1.15-1.37 1.15-1.37 1.12-1.4 1.11-1.4 1.09-1.41 1.06-1.44 1.05-1.43 1-1.45 1-1.47 1-1.48 1-1.48.95-1.5.94-1.5.91-1.52.89-1.53.86-1.54.85-1.55.82-1.56.8-1.57.78-1.58.75-1.59.74-1.6.71-1.61.69-1.62.66-1.63.64-1.64.6-1.63.58-1.65.57-1.67.53-1.66.5-1.69.48-1.68.45-1.65.42-1.7.38-1.7.38-1.72.34-1.72.31-1.71.29-1.74.25-1.73.21-1.75.2-1.75.15-1.75.14-1.75.1-1.77.06h-5.3l-1.78-.07-1.77-.1-1.78-.13-1.78-.17-1.79-.2-1.81-.14-1.8-.27-1.78-.3-1.79-.33-1.8-.38-1.78-.4-1.8-.45-1.78-.49-1.79-.51-1.78-.55-1.8-.6-1.78-.64-1.77-.66-1.78-.7-1.79-.75-1.76-.79-1.77-.81-1.77-.87-1.76-.88-1.75-.95-1.77-1-1.75-1-1.73-1.05-1.74-1.1-1.75-1.13-1.7-1.17-1.66-1.2-1.62-1.23-1.58-1.25-1.54-1.3-1.5-1.32-1.45-1.35-1.41-1.38-1.39-1.4-1.31-1.43-1.3-1.45-1.25-1.49-1.2-1.51-1.17-1.52-1.13-1.57-1.09-1.56-1-1.6-1-1.62-.95-1.63-.93-1.65-.88-1.69-.85-1.68-.8-1.72-.77-1.71-.73-1.74-.69-1.75-.65-1.78-.61-1.77-.59-1.8-.53-1.8-.5-1.81-.47-1.84-.43-1.83-.4-1.85-.37-1.85-.33-1.87-.28-1.88-.27-1.88-.23-1.89-.19-1.88-.16-1.9-.14-1.92-.08-1.9-.07-1.91v-5.77l.06-1.93.09-1.92.11-1.93.14-1.94.18-1.93.2-1.93.23-1.94.27-1.93.28-1.93.32-1.92.33-1.93.39-1.94.38-1.91.43-1.92.45-1.92.47-1.9.5-1.9.52-1.9.55-1.9.58-1.88.6-1.88.62-1.89.65-1.86.66-1.85.7-1.85.72-1.85.73-1.82.77-1.83.78-1.8.82-1.82.82-1.78.86-1.79.87-1.76.9-1.75.92-1.74.93-1.73 1-1.72 1-1.7 1-1.68 1-1.67 1-1.65 1.07-1.63 1.07-1.62 1.1-1.6 1.11-1.58 1.14-1.58 1.16-1.54 1.09-1.57 1.18-1.52 1.22-1.48 1.22-1.47 1.25-1.45 1.26-1.41 1.29-1.4 1.3-1.39 1.31-1.36 1.34-1.34 1.35-1.3 1.35-1.28 1.38-1.27 1.4-1.23 1.42-1.2 1.43-1.18 1.45-1.15 1.47-1.12 1.48-1.1 1.48-1.07 1.52-1 1.53-1 1.54-1 1.56-.94 1.57-.91 1.58-.89 1.6-.83 1.62-.82 1.63-.76 1.64-.74 1.65-.7 1.68-.66 1.68-.64 1.67-.58 1.08-.35 1.07-.32 1.07-.31 1.05-.29 1.06-.26 1.07-.25 1.05-.24 1.05-.21 1.07-.2 1.05-.19 1.05-.16 1-.14 1-.15 1.05-.11 1-.1 1.07-.09 2-.15 2-.08h2.05zm-3.55 16.7-1.65.06-1.67.12-.8.07-.81.08-.82.08-.8.1-.82.12-.8.13-.81.14-.8.16-.8.15-.82.19-.8.18-.8.22-.8.21-.8.22-.8.25-.8.27-1.35.46-1.32.49-1.33.53-1.32.55-1.31.6-1.32.62-1.3.65-1.3.68-1.3.72-1.28.75-1.29.78-1.26.8-1.27.83-1.27.87-1.25.88-1.23.92-1.23.95-1.24 1-1.2 1-1.21 1-1.19 1.05-1.18 1.08-1.18 1.1-1.17 1.14-1.15 1.15-1.13 1.16-1.14 1.2-1.1 1.22-1.11 1.25-1.09 1.27-1.06 1.28-1.07 1.3-1 1.33-1 1.35-1 1.37-1 1.38-1 1.4-1 1.42-.95 1.43-.93 1.47-.93 1.47-.9 1.48-.9 1.5-.87 1.52-.85 1.51-.83 1.55-.82 1.55-.8 1.57-.78 1.58-.77 1.59-.73 1.6-.74 1.61-.7 1.62-.68 1.63-.67 1.64-.63 1.65-.62 1.65-.6 1.66-.58 1.67-.55 1.67-.53 1.68-.52 1.68-.48 1.69-.47 1.68-.45 1.7-.42 1.7-.5 1.7-.38 1.7-.35 1.7-.32 1.7-.3 1.7-.28 1.7-.25 1.7-.23 1.68-.2 1.7-.19 1.69-.15 1.7-.13 1.68-.1 1.67-.07 1.68-.05 1.67v4.96l.07 1.64.08 1.63.1 1.62.15 1.61.15 1.62.2 1.58.22 1.59.25 1.56.27 1.57.3 1.55.33 1.53.37 1.52.38 1.52.42 1.48.43 1.48.48 1.47.5 1.45.54 1.43.55 1.44.58 1.4.62 1.38.65 1.37.68 1.35.7 1.35.73 1.31.77 1.3.8 1.29.82 1.26.86 1.24.89 1.23.93 1.2 1 1.2 1 1.17 1 1.15 1 1.13 1.08 1.1 1.14 1.1 1.15 1.07 1.18 1.05 1.22 1 1.26 1 1.3 1 1.34 1 1.38.93 1.48 1 1.49.95 1.48.88 1.5.87 1.48.83 1.49.8 1.48.75 1.5.74 1.48.68 1.49.65 1.48.63 1.5.59 1.48.56 1.49.52 1.48.5 1.48.45 1.49.43 1.48.4 1.47.37 1.48.35 1.48.3 1.47.28 1.48.25 1.47.22 1.48.2 1.47.15 1.47.15 1.46.1 1.47.08 1.47.05h4.38l1.47-.05 1.45-.09 1.45-.1 1.45-.13 1.45-.17 1.45-.18 1.45-.22 1.43-.23 1.43-.25 1.45-.3 1.44-.3 1.41-.33 1.44-.37 1.41-.38 1.42-.4 1.42-.44 1.41-.45 1.4-.46 1.4-.5 1.4-.54 1.39-.53 1.38-.57 1.38-.58 1.39-.62 1.36-.63 1.37-.65 1.43-.76 1.35-.7 1.35-.71 1.33-.74 1.34-.75 1.33-.78 1.32-.8 1.3-.8 1.3-.83 1.3-.87 1.28-.87 1.28-.88 1.27-.92 1.25-.91 1.25-1 1.25-.95 1.23-1 1.22-1 1.22-1 1.2-1 1.18-1.05 1.18-1.05 1.17-1.08 1.17-1.09 1.15-1.1 1.13-1.13 1.12-1.13 1.11-1.15 1.1-1.15 1.09-1.19 1.08-1.18 1.07-1.2 1.05-1.22 1-1.23 1-1.23 1-1.25 1-1.27 1-1.27 1-1.28 1-1.3.94-1.32.91-1.3.92-1.33.88-1.33.89-1.35.86-1.35.85-1.37.82-1.37.82-1.36.8-1.4.78-1.39.77-1.4.75-1.4.73-1.41.7-1.42.7-1.43.68-1.44.65-1.43.65-1.43.62-1.45.62-1.45.58-1.45.57-1.47.55-1.47.53-1.45.5-1.46.5-1.49.47-1.46.45-1.45.46-1.62.44-1.62.4-1.66.38-1.69.35-1.71.32-1.74.3-1.76.25-1.79.23-1.8.2-1.81.17-1.84.13-1.85.1-1.85.08-1.86v-5.62l-.06-1.88-.1-1.87-.15-1.87-.17-1.86-.22-1.85-.25-1.84-.32-1.72-.32-1.82-.35-1.8-.4-1.77-.41-1.75-.52-1.76-.5-1.7-.55-1.7-.28-.8-.29-.82-.31-.8-.3-.81-.32-.79-.33-.78-.35-.78-.34-.77-.36-.75-.37-.75-.37-.75-.38-.72-.4-.71-.4-.72-.4-.7-.42-.68-.43-.69-.43-.66-.45-.65-.45-.64-.47-.63-.47-.63-.48-.6-.48-.6-.5-.59-.52-.56-.52-.57-.51-.55-.54-.53-.53-.54-.55-.51-.57-.5-.56-.49-.59-.48-.58-.45-.6-.45-.6-.45-.62-.42-.61-.41-.65-.4-.64-.39-.66-.38-.67-.35-.68-.35-.69-.33-.7-.34-.71-.3-.72-.3-.75-.28-.75-.27-.75-.25-.78-.23-.79-.23-.81-.2-.82-.2-.83-.19-.85-.15-.85-.15-.89-.13-.9-.12-.9-.1-.93-.08-.93-.07h-3.83l-.8-.12-.8-.21-.77-.29-.73-.35-.7-.43-.65-.48-.6-.55-.55-.62-.48-.67-.35-.61-.58-.2-.65-.19-.65-.2-1.49-.4-1.51-.38-1.48-.48-1.48-.32-1.37-.28-1.22-.23-1-.17-1.25-.22-1.8-.26-1.9-.29-3.73-.6-7.37-1.2-3.61-.56-1.79-.25-1.76-.25-1.77-.24-1.75-.2-1.75-.18-1.72-.17-1.71-.13-1.72-.1-1.68-.07-1.69-.05h-1.66zm393.75-86.22 1.53.08 1.54.14 1.55.16 1.55.24.75.15.75.15.73.18.75.2.72.22.71.23.72.25.7.27.68.28.69.3.68.32.7.35 1.28.68 1.27.77 1.23.81 1.22.85 1.18.92 1.14 1 1.11 1 1.09 1 1 1.05 1 1.1 1 1.13 1 1.17.94 1.18.9 1.23.86 1.24.85 1.28.82 1.28.78 1.32.75 1.35.72 1.35.68 1.38.67 1.39.62 1.41.6 1.44.56 1.43.52 1.45.5 1.47.45 1.46.42 1.49.38 1.5.35 1.5.3 1.5.27 1.5.23 1.51.18 1.52.14 1.52.1 1.51.05 1.52v1.52l-.05 1.5-.1 1.51-.15 1.5-.22 1.5-.27 1.49-.31 1.43-.2.78-.22.74-.22.73-.23.72-.25.71-.28.72-.29.72-.31.7-.32.7-.35.7-.37.68-.38.68-.4.67-.42.67-.45.65-.45.63-.48.63-.5.62-.52.6-.53.6-.57.58-.56.57-.6.55-.62.53-.63.52-.65.52-.92.65-.92.63-.93.58-.95.57-1 .53-1 .5-1 .45-1 .45-1 .4-1 .37-1 .35-1 .33-1 .29-1 .28-1 .23-1 .24-1 .2-1 .16-1 .17-1 .13-1 .12-1 .1-1 .08-1 .09-1.93.08-2 .05h-1.66l-1.92-.05-1.91-.08-1.89-.1-1.88-.14-1.85-.15-3.62-.33-3.51-.35-3.4-.32-1.64-.15-1.6-.13-1.55-.1-1.5-.08h-3.45l-.48-.05-.5-.08-.48-.1-.47-.13-.47-.17-.45-.18-.45-.22-.43-.25-.42-.27-.4-.3-.36-.31-.37-.34-.33-.36-.22-.24-.17.07-.46.15-.49.13-.48.1-.48.07h-1.97l-.48-.08-.49-.1-.48-.13-.47-.17-.45-.18-.45-.22-.43-.25-.42-.27-.43-.28-.62-.5-.56-.52-.54-.53-.46-.53-.49-.6-.66-1-.59-1.05-.5-1-.4-1-.35-1-.28-1-.23-1-.22-1-.17-1-.15-1-.13-.95-.1-.93-.08-1-.14-1.8-.08-1.8v-10.7l.06-1.3.12-1.3.15-1.3.17-1.28.2-1.28.23-1.29.27-1.28.28-1.28.32-1.27.35-1.27.38-1.25.4-1.25.43-1.25.47-1.23.48-1.22.52-1.21.53-1.22.59-1.18.6-1.19.61-1.16.65-1.15.69-1.15.7-1.12.73-1.12.75-1.1.78-1.06.82-1.07.83-1 .87-1 .88-1 .92-1 1-1 1-.94 1-.9 1-.88 1-.87 1.07-.81 1.1-.8 1.12-.77 1.15-.73 1.18-.7 1.2-.69 1.22-.63 1.25-.6 1.26-.57 1.3-.51 1.32-.49 1.33-.45 1.37-.4 1.38-.35 1.4-.31 1.42-.27 1.43-.22 1.45-.18 1.49-.12 1.48-.08h1.5zm-2.43 16.67h-.94l-.9.06-.9.12-.86.13-.87.17-.87.18-.83.22-.83.25-.82.27-.82.3-.8.31-.78.35-.78.39-.77.4-.75.41-.75.45-.73.47-.72.5-.72.52-.7.53-.68.57-.68.58-.67.6-.65.63-.63.64-.62.66-.62.69-.6.71-.58.72-.57.73-.53.75-.53.79-.52.78-.5.8-.48.8-.47.83-.45.84-.43.85-.4.85-.4.86-.37.89-.35.88-.33.88-.32.9-.28.9-.29.9-.25.92-.21.9-.22.92-.18.91-.17.9-.13.92-.14.9-.1.9-.06.9-.07.9v9.35l.06 1.4.09 1.4.06.62.07.63.08.59.09.55.08.51.1.45.1.4.1.32v.07l.23.21.33.35.24.29.2-.09.46-.15.49-.13.48-.1.5-.07h2.65l1.78.05 1.79.1 1.78.11 1.77.14 1.78.16 3.5.34 3.48.35 3.46.3 1.69.14 1.66.11 1.65.1 1.64.07h4.68l1.53-.07h.7l.72-.06.72-.09.7-.08.7-.08.66-.12.67-.12.65-.13.65-.15.63-.15.62-.17.6-.18.6-.18.58-.22.59-.22.55-.23.55-.23.55-.27.51-.27.54-.28.5-.32.51-.31.49-.34.5-.36.26-.2.25-.2.25-.22.24-.22.21-.23.24-.22.2-.23.21-.25.2-.25.2-.25.19-.27.21-.25.18-.27.17-.28.17-.3.16-.3.15-.32.15-.31.15-.34.14-.33.13-.35.12-.35.11-.37.12-.38.12-.37.08-.35.18-.85.15-.85.14-.86.08-.9.07-.92v-3l-.07-1-.08-1-.14-1.05-.16-1.07-.19-1.07-.21-1.08-.25-1.08-.29-1.1-.31-1.09-.34-1.1-.36-1.08-.39-1.08-.43-1.09-.43-1.06-.52-1.05-.5-1.05-.52-1-.53-1-.55-1-.58-1-.6-.94-.6-.93-.64-.88-.63-.87-.65-.83-.67-.82-.68-.77-.67-.73-.7-.68-.68-.67-.68-.62-.7-.56-.69-.54-.7-.48-.68-.45-.67-.4-.7-.38-.28-.14-.33-.16-.32-.14-.32-.13-.31-.12-.3-.11-.32-.1-.3-.09-.3-.08-.3-.07-.28-.06h-.29l-1-.15-1-.12-1-.08h-2zm-30.65 50.76h-.05z"/></g></svg>
|
assets/img/no-products.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg viewBox="0 0 923.65 1082.82" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m296.42 899.72h6.81l3.44.07 3.45.1h.2l.18-.1 1.48-.68 1.49-.63 1.53-.48 1.5-.5 1.5-.5 1.5-.43 1.52-.37 1.51-.35 1.52-.31 1.53-.27 1.54-.25 1.55-.23 1.53-.19 1.57-.18 1.55-.15 1.56-.12 1.57-.11 1.55-.04 1.59-.08h7.93l3.18.05 3.19.09 3.11-.06 3.15.17 3.12.18 3.07.2 3.05.22 5.83.47 5.57.46 5.15.42 2.38.18 2.23.15 2.09.14 1.88.1h11.98l8.87-.07 8.87-.12 8.86-.15 8.9-.18 8.89-.2 17.85-.45 16.88-.42 1-.08 2-.13 2.58-.15 3.05-.15 3.39-.14h11.56l2 .08h3.55l.15-.15 1.22-1 1.06-.73.95-.57 1-.53 1.24-.55 1.23-.45 1.12-.35 1.05-.27 1-.22 1-.18.93-.15 1-.15 1.75-.2 1.86-.15 1.9-.12 2-.08h12.53l4.3.13 4.27.17 4.11.2 3.85.2 3.52.21 5.53.34 1.77.1h1l3 .08 3.15.13 3.13.14 3.12.16 6.15.35 6.08.39 6 .38 6 .37 3 .15h.18l1.45-.05 6.08-.2 6.09-.2 6.1-.16 6.11-.15 6.14-.14 6.13-.1 6.15-.05h6.62l3-.2 2-.12 2.25-.08 2.41-.07h5.4l1.4.05 1.44.08 1.45.1 1.46.13 1.49.19 1.5.21 1.53.27 1.57.33 1.5.39.9.26.83.29.87.3.86.33.89.4.91.43.94.5 1 .57 1 .65 1.2.9.57.52.93-.2 1.92-.39 1.91-.35 2-.35 2-.31 2.05-.27 2-.23 1.1-.1 1.08-.07 1.08-.07h4.47l1.15.05 1.17.08 1.16.12 1.19.13 1.2.19 1.2.21 1.21.27 1.22.3 1.23.35 1.24.4 1.23.45 1.23.52 1.24.55 1.21.61 1.2.67 1.19.73 1.16.79 1.14.83 1.11.9 1.07.95 1.1 1.05.8.83.85 1.05.87 1.24.85 1.5.76 1.75.6 2 .35 2.28v2.43l-.37 2.45-.7 2.29-1 2-1.1 1.72-1.15 1.4-1.13 1.13-1.08.9-1.19.85-1.6.94-1.58.73-1.38.53-1.27.4-1.17.34-1.1.25-1.06.21-1 .19-1 .16-1 .15-1.85.24-1.82.18-1.72.17-3 .25-1.14.11-.91.1-3.54.45-3.53.42-3.42.38-3.33.35-3.27.32-3.2.3-3.18.25-3.17.23-3.16.2-3.19.19-3.23.16-3.3.14-3.37.13-3.48.1-3.6.1-3.68.08h-2.15l-2.44.14-2.6.15-2.81.2-3 .25-3.15.26-6.75.6-7.19.64-3.75.31-3.81.32-3.89.28-3.91.29-4 .25-4 .2-4 .16-2 .09-2 .05h-12l-2-.07-2-.08-1.95-.1-1.93-.14-1.93-.15-1.92-.18-1.92-.22-1.88-.23-1.88-.27-1.87-.3-1.85-.33-1.4-.28h-4.05l-2.72.12-2.71.1-5.29.17-10.11.3-4.79.16-2.28.1-2.27.12-8.5.43-8.56.42-8.59.4-3.13.13.4.05 1.27.24 1.41.33 1.5.48 1.17.49 1.2.58 1.4.87 1.62 1.26 1.8 1.9.81 1.29.82 1.5.63 1.6v.1l.48 1.83.23 1.88v1.95l-.25 1.84-.35 1.66-1.21 2.74-1.34 2-1.26 1.4-1.12 1-1 .77-.88.61-.77.45-.88.5-.87.45-1.56.79-1.64.71-1.63.67-1.64.83-1.64.52-1.6.47-1.61.41-1.59.37-1.58.32-1.55.26-1.55.24-1.52.21-1.5.17-1.48.15-1.47.13-1.43.1-1.45.09-2.75.15-2.68.1-2.59.1-2.48.1-2.42.11-1.1.07-1.11.08-1.07.09-1.13.11-4.15.44-4.24.41-4.23.4-4.22.37-4.23.37-4.22.31-4.23.32-4.22.28-4.21.29-4.22.23-4.22.23-4.21.2-4.24.19-4.21.16-4.22.15-4.22.12-4.21.18-4.22.08-4.22.07h-21.11l-4.22-.05-4.23-.1-4.24-.1-4-.1-.76.16-4.19 1-4.2.9-4.18.85-4.2.84-4.2.78-4.2.75-4.22.72-4.2.68-4.21.65-4.22.6-4.22.58-4.21.55-4.22.54-4.22.48-4.21.47-4.22.45-4.22.4-4.23.38-4.22.37-4.21.33-4.22.32-4.22.3-4.21.26-4.22.25-4.22.24-4.2.2-4.21.2-4.2.18-2.3.08-2.54.44-2.56.41-2.57.4-2.58.4-2.59.37-2.58.37-2.58.33-2.59.33-2.54.32-2.67.32-3 .4-3.25.43-3.45.45-3.61.44-1.9.21-1.9.19-2 .18-2 .17h-.47l-.63.19-1.07.26-1.08.24-1.08.2-1.09.16-1.08.14-1.08.1-1.1.06h-3.3l-1.12-.06-1.13-.1-1.14-.15-1.13-.2-1.17-.24-1.16-.3-1.17-.35-.52-.16-1-.13-1-.15h-.07l-2.38.18-2.4.15-2.42.1h-6.1l-1.21-.05h-1.24l-1.23-.08-1.23-.1-1.24-.12-1.23-.13-1.23-.17-1.24-.18-1.23-.22-1.23-.23-1.24-.27-1.23-.28-1.23-.34-1.24-.35-1.23-.4-1.22-.43-1.23-.47-1.22-.5-1.2-.56-1.21-.59-1.19-.65-1.18-.7-1.37-.86-1.48-1.12-2-2-.94-1.47-.78-1.43-.6-1.5-.45-1.3-.45-2.91.17-2.9.7-2.71 1.1-2.3 1.48-2.14 2-2 2-1.33 1.55-.77 1.25-.5 1-.33 1-.27 1.45-.32 1.43-.23 1.33-.18 1.27-.14 1.22-.11 1.16-.09 2-.13 1.5-.1 3.81-.25 3.84-.28 2.86-.22.92-.92 1.95-1.36 2.15-1 2.3-.63 2.37-.24h2.68l.63-.47.94-.67 1-.63 1-.6 1-.58 1-.55 1-.54 1-.5 1-.5 1-.46 1.05-.45 1.07-.44 1.07-.41 1.08-.4 1.1-.37 1.12-.37 1.11-.33 1.12-.32 1.13-.3 1.15-.28 1.15-.25 1.17-.23 1.18-.2 1.17-.2 1.2-.15 1.2-.14.55-.05-.37-.08-1.16-.28-1.15-.32-1.17-.32-1.15-.35-1.15-.36-1.15-.4-1.15-.42-1.23-.47-.95-.41-1.54-.79-.91-.66-1.87-1.55-1.57-1.85-1.11-1.9-.87-2-.55-2.1-.21-2.17-9.42 3.27-3.75 1.3-2.12.7-4.6 1.38-4.61 1.37-4.79 1.37-2.5.7-2.5.68-2.55.68-2.58.67-2.63.65-2.64.63-2.68.62-2.7.6-2.72.57-2.73.55-2.77.51-2.76.49-2.79.43-2.8.4-2.81.37-2.8.31-2.79.25h-.16l-1.29.08-1.41.07-1.42.07-1.42.05h-7.06l-1.4-.07-1.42-.06-1.4-.1-1.4-.17-1.4-.13-1.4-.15-1.4-.19-1.4-.2-2.08-.33-1.83-.5-1.49-.6-1-.46-1-.47-1.69-.88-1.73-1-1.73-1-1.34-.84-1.41-.16-1.2-.12h-4.95l-1.77-.08-1.77-.09-1.76-.13-1.75-.13-1.75-.17-1.74-.2-1.76-.27-1.73-.25-1.72-.29-1.72-.31-1.7-.37-1.68-.38-1.68-.44-1.67-.46-1.67-.5-1.63-.57-1.63-.6-1.64-.65-1.6-.7-1.58-.8-1.57-.81-1.75-1-1.45-1-2.06-1.87-1-1.4-1.17-2.08-.85-2.27v-.08l-.42-2-.13-2 .17-2v-.17l.4-1.86.65-1.79.89-1.68.05-.08 1.18-1.65 1.38-1.47 1.07-1 2-1.25 1.48-.68 1.32-.48 1.51-.42 1.34-.27 1.15-.16 1-.12 1-.1h.94l1-.05h3.35l3.08.22 2.69.2 2.38.22 2.15.23 1.95.23 1.78.24 1.65.23 1.52.23 2.88.45 1.45.22 1.57.23 1.72.22 2 .23 2.25.25h.6l.13-.56.58-1.32.85-1.65 1.05-1.52.1-.11 1.14-1.38 1.47-1.23 1.2-.89 2.18-1.06 1.7-.59 1.35-.33 1.12-.18 1.06-.15 1.49-.1h3.96l2.12.1 1.75.1h30.46l1.85.05 1.89.09 1.93.11 2 .15 2 .19 2.1.23 2.15.28 2 .3.86.14 1 .11 3 .29 4.48-.09 6-.15 6-.16 6-.22 6-.23h.95l-.28-.63-.6-2-.3-2.08v-2.58l.48-2.53.9-2.42 1.32-2.22 1.66-2 2-1.65 1.85-1.08 2-.82 2.07-.52 2.13-.21 1.47-.05 2 .3 1.05.23 1.21.32 1.24.36 2.56.79 2.87.86 1.42.42 1.35.4 1.21.33 1 .25.77.17h.16l1.69.22 1.76.18 1.8.17 1.82.15 1.85.12 1.87.1 1.9.08 1.68.07h51.2l.83-.08 1.09-.05h4.66l1.54.05 1.23.07 1.07.06 2.51.4 2.42.8 2.23 1.2 2 1.59 1.7 1.88 1.37 2.15.13.33h10.04zm-87.32 57.86h.17-.34z" fill="#808080"/><path d="m419.77 413.53 1.43.19 1.37.26 1.3.35 1.4.44 1.45.58 1.53.77 1.45.93 1.35 1 1.22 1.14 1.08 1.21.93 1.24.79 1.25.65 1.23.53 1.22.43 1.18.34 1.13.25 1.1.2 1.07.13 1 .08 1v1.98l-.09 1.6-.2 1.67-.26 1.58-.37 1.52-.42 1.48-.48 1.44-.55 1.41-.5 1.17-.1.22-.68 1.36-.75 1.34-.82 1.31-.9 1.32-1 1.28-1 1.19-.67.71-.63.64-.69.61-.71.62-.79.6-.81.6-.89.57-.95.55-1 .51-1.09.47-1.15.43-1.23.37-1.3.28-1.35.2-1.42.1h-1.43l-1.45-.13-1.38-.23-1.22-.3-1.15-.37-1.13-.45-1.12-.47-1.07-.6-1-.69-.93-.71-.9-.8-.82-.83-.75-.87-.67-.88-.6-.9-.51-.92-.55-1.07-.64-1.61-.51-1.74-.32-1.7-.17-1.61v-1.57l.09-1.52.16-1.46.09-.39.21-1 .4-1.38.5-1.35.25-.59v-1.81l.05-1 .12-1 .15-1 .2-1 .26-1 .32-1.07.27-.77.11-.31.49-1.1.56-1.1.67-1.12.75-1.1.87-1.12 1-1.06 1.08-1 1.22-1 1.32-.9 1.41-.8 1.49-.68 1.53-.55 1.57-.42 1.58-.28 1.57-.14h1.51zm3.38 29.8-.28.15 1.18-.61v-.22.22l.05-.64v-.48l.05.52-.09-1.07.09.5-.19-1.15.12.47-.27-1-6.35 4.41h1.14-.35l1.18-.08-.35.05 1.23-.17-.31.07 1.25-.29-.32.1 1.27-.4-.3.12zm.65-.3.25-.15zm.05-3.08.1.3zm-6.33-15.72h-.75l.48.15.9.3.58.26 1.52 2.19 5.55.13-.37-.33.19.16-1.05-.8.2.17-1.2-.75.21.13-1.31-.65.21.1-1.45-.55.24.1-1.54-.41.25.06-1.58-.26.25.05-1.6-.1z" fill="#fff"/><path d="m463.47 357.9 1.9.33 1.83.57 1.73.83h.09l1.45.93 1.33 1.1 1.2 1.34 1 1.23 1.22 2.27.55 1.45.37 1.2.28 1 .25 1 .25 1.06.45 2.12.43 2.35.44 2.55.43 2.75.42 2.93.25 1.94.43.71.73 1.45.64 1.5.48 1.4.4 1.34.33 1.31.3 1.3.25 1.3.22 1.3.2 1.34.17 1.36.15 1.39.15 1.41.11 1.44.1 1.46.1 1.5.07 1.54.07 1.55.05 1.58v6.53l-.05 3.39-.1 3.41-.15 3.44-.2 3.41-.13 1.75-.13 1.72-.14 1.72-.16 1.7-.17 1.68-.2 1.67-.2 1.66-.22 1.64-.21 1.61-.07.35-.08 1.12-.17 1.6-.18 1.58-.22 1.55-.12.79.42.8.45 1.05.42 1.1.35 1.16.26 1.2.2 1.24.14 1.25v2.51l-.12 1.24-.18 1.21-.07.3-.23.85-.39 1.12-.51 1.23-.87 1.72-.98 1.67-1.13 1.49-1.15 1.26-1.15 1.12-1.16 1-1.14.87-1.13.78-1.12.69-1.11.63-1.1.57-1.1.53-1.09.48-1.1.45-1.08.42-1.1.38-1.1.37-1.1.33-1.12.32-1.11.3-1.12.28-1.12.27-1.13.23-1.12.24-1.15.2-1.13.18-1.13.18-1.15.17-1.14.13-1.15.14-1.13.11-1.15.09-1.15.08-1.13.07-1.14.05h-5.65l-1.13-.07-1.12-.08-1.13-.12-1.12-.14-1.13-.17-1.13-.18-1.15-.24-1.15-.26-1.19-.32-1.2-.37-1.25-.46-1.27-.52-1.53-.71-1.58-.94-1.7-1.31-1.52-1.52-4.93 1.55-2.69.83-2.71.85-2.77.82-2.8.82-2.82.8-2.83.75-2.83.7-1.45.35-1.44.33-1.43.3-1.43.3-1.44.27-1.45.26-1.43.24-1.43.21-1.45.2-1.44.17-1.45.15-1.45.12-1.45.08h-4.38l-1.48-.06-1.49-.12-1.5-.17h-.28l-1.23-.17-1.52-.28-1.55-.35-1.53-.43-1.57-.5-1.45-.59-.88-.38-1.3-.62-2.1-1.31-1.19-1.12-1.11-1.25-1-1.35-.93-1.45-1.07-3-.4-2.71v-2.27l.28-1.82.43-1.7.72-1.85.8-1.55.15-.21-.32-.32-1.41-2.07-1.05-2.2-.64-2.18-.28-2-.05-1.8.13-1.58.24-1.37.3-1.18.33-1.05.35-.93.37-.84.4-.86.48-.89v-.06l-.72-1-.66-1.08-.59-1.17-.5-1.2-.4-1.23-.3-1.25-.21-1.24-.12-1.21v-1.19l.06-1.35.24-1.86.46-1.89.59-1.65.65-1.46.7-1.3.71-1.19.74-1.06.73-1 .77-.91.75-.87.76-.83.79-.79.8-.76.78-.75.82-.72.81-.7.84-.7.88-.7 1.67-1.3 1.73-1.28 1.78-1.27 1.79-1.23 1.8-1.2 1.8-1.15 1.78-1.14 1.77-1.08 1.71-1.05 1.7-1 3.12-1.81 2.8-1.6 2.32-1.3 1.68-.94.92-.53 1.65-1 .23-.14 2.55-1.48 1.45-.82 1.5-.81 1.55-.8 1.58-.79 1.59-.73.95-.38.56-.22 2.44-2 2.66-2.07 2.42-1.85 2.1-1.36 2.32-1 1.8-.42 1.36-.83 1.39-.82 1.4-.78 1.4-.77 1.4-.73 1.41-.7 1.42-.7 1.42-.67 1.41-.63 1.42-.63 1.42-.6 1.4-.59 1.41-.58 2.72-1.05 2.7-1 2.62-.92 2.51-.85 2.4-.76 2.29-.7 2.11-.64.43-1.07.65-1.33 1.18-1.85.94-1 1.6-1.48 1.8-1.24h.08l2.12-1 2.26-.65 2.35-.25h.07z" fill="#808080"/><path d="m69 892.63 12.82.17 6.5.07h19.62l3.25-.06 3.25-.09 3.23-.11 3.22-.14 3.2-.16 3.16-.19 3.15-.23 3.14-.27 3.1-.28 3.05-.33 3-.39 3-.41 1.47-.22 1.46-.23 1.47-.24 1.45-.26 1.46-.26 1.42-.28 1.4-.29 1.4-.3 1.95-.45 2-.45 2-.48 1.95-.5 4-1 4-1.06 4-1.07 4.08-1 2.07-.52 2.07-.5 2.1-.5 2.1-.48 2.11-.45 2.12-.43 2.15-.42 2.15-.38 2.17-.35 2.18-.32 2.2-.28 2.22-.24 2.23-.2 2.25-.15 2.23-.1h5.77l1.15.05 1.17.06 1.15.07 1.18.1 1.13.1 4 .4 4 .37 4 .35 4 .35 4 .31 4 .3 4 .3 4 .27 4 .27 4 .23 3.95.23 4 .2 4 .2 3.95.19 4 .16 3.95.15 3.95.14 3.95.13 3.95.12 4 .08 3.95.08 3.93.09h3.95l3.95.05h23.7l7.9-.1 7.92-.14 7.92-.18 7.93-.22 7.93-.26 7.95-.3 7.95-.34 8-.38 8-.4 8-.43 8-.47 8.05-.5 8.05-.53 8.08-.55 8.1-.57 8.13-.6 8.19-.62 1.63-.11 1.68-.09h8.35l1.67.08 1.65.08 1.67.12 1.65.13 1.63.15 1.65.17 1.63.18 1.64.2 1.65.2 3.23.47 3.23.5 3.22.53 3.2.55 3.17.57 3.16.58 5.81 1.13 3.1.55 3.08.53 3 .52 3 .47 3 .43 1.47.18 1.5.19 1.46.16 1.49.15 1.46.14 1.45.11 1.45.1 1.45.09 1.44.06h7.05l1.38-.06 1.37-.09 1.36-.11 1.37-.15 1.35-.17 1.35-.2 1.33-.22 1.4-.26 2.14-.42 2.23-.4 2.23-.4 2.25-.37 2.27-.35 2.27-.35 2.3-.31 2.28-.3 2.32-.27 2.3-.27 2.33-.25 2.33-.23 2.34-.22 2.35-.2 2.36-.18 2.37-.17 2.37-.16 2.36-.14 2.39-.13 2.4-.12 2.38-.1 2.42-.08 4.78-.13 4.83-.09 4.82-.05h9.67l4.83.08 4.83.1 4.82.15 4.82.17 4.78.2 4.77.21 4.75.25 4.71.27 4.7.28 4.65.3 4.62.32 4.57.32 9 .66 8.76.67 2.92.2 2.88.2 2.89.17 2.88.13 2.88.13 2.89.1 2.9.09 2.88.08 2.9.05h14.47l2.9-.05 2.9-.07 2.9-.06 2.9-.09 5.81-.2 5.82-.25 5.83-.3 5.82-.31 5.83-.35 5.85-.37 5.84-.4 11.71-.83 11.74-.85 11.75-.82 5.9-.4 5.9-.38 5.9-.34 5.9-.33 5.91-.28 5.94-.24 5.91-.2 3-.08 3-.07 3-.05h8.95l1.62.17 1.56.46 1.45.77 1.27 1 1 1.27.79 1.43.46 1.57.17 1.62-.15 1.63-.48 1.54-.76 1.43-1 1.27-1.26 1-1.44.78-1.54.52-1.62.15h-5.8l-2.9.05h-2.88l-2.9.07-2.89.06-5.8.2-5.8.24-5.81.28-5.82.32-5.82.35-5.83.36-5.83.39-11.72.83-11.72.85-11.76.82-5.89.4-5.91.38-5.9.35-5.92.33-5.93.3-5.94.25-5.93.22-3 .08-3 .07-3 .07h-18l-3-.07-3-.07-3-.08-3-.12-3-.13-3-.15-3-.17-3-.2-3-.21-8.77-.67-8.95-.67-4.53-.31-4.57-.3-4.58-.3-4.63-.29-4.65-.25-4.67-.25-4.68-.21-4.7-.2-4.7-.17-4.72-.13-4.72-.12-4.7-.07h-14.08l-4.65.1-4.65.14-2.3.08-2.3.08-2.28.12-2.29.12-2.28.13-2.27.15-2.25.17-2.25.18-2.23.18-2.23.2-2.22.24-2.2.23-2.18.25-2.17.27-2.17.26-2.15.3-2.13.32-2.12.33-2.1.35-2.08.37-2.07.38-2.11.4-1.62.32-1.68.28-1.7.24-1.67.21-1.68.17-1.69.15-1.68.12-1.67.06-1.68.07h-5l-1.65-.05-1.67-.06-1.65-.1-1.65-.1-1.65-.14-1.63-.16-1.65-.17-1.63-.18-1.64-.2-1.46-.09-3.23-.47-3.22-.5-3.22-.53-3.2-.55-3.16-.59-6.3-1.15-3.14-.58-3.1-.55-3.08-.55-3-.5-3-.47-3-.43-1.48-.18-1.48-.19-1.49-.16-1.48-.15-1.47-.14-1.45-.11-1.45-.1-1.45-.09-1.43-.05h-7.08l-1.39.07-1.41.1-8.15.62-8.17.6-8.15.58-8.12.55-8.11.53-8.1.5-8.07.47-8.07.45-8.06.4-8 .38-8 .34-8 .3-8 .26-8 .24-8 .18-8 .13-8 .1h-24l-4-.05-4-.06-4-.07-4-.08-4-.1-4-.1-4-.14-4-.13-4-.17-4-.16-4-.19-4-.2-4-.21-4-.24-4-.23-4-.27-4-.28-4-.3-4-.3-4-.33-4.05-.35-4-.35-4-.39-4-.4-1-.08-.94-.07-.93-.06h-7.22l-1.9.09-1.89.13-1.88.17-1.9.2-1.9.25-1.9.26-1.92.32-1.91.33-1.92.39-1.93.38-1.95.43-1.94.44-2 .46-2 .49-2 .48-4 1-4 1.05-4.05 1.07-4.07 1.05-2.06.53-2.07.5-2.08.49-2.1.48-1.55.33-1.59.34-1.58.3-1.58.3-1.59.28-1.6.27-1.61.25-1.64.25-3.21.45-3.27.4-3.3.36-3.3.32-3.32.27-3.33.23-3.35.22-3.35.16-3.37.15-3.36.12-3.37.08-3.37.07h-13.31l-6.61-.05-6.57-.06-12.82-.17-6.2-.07h-40.4l-.28.06-.28.07-.89.25-1 .32-1.1.35-1.2.4-1.25.36-.72.2-.73.19-.77.16-.82.15-.86.14-1 .06h-1.07l-.75-.07-.9-.11-.35-.07-1.06-.27-.32-.11-.88-.32-.48-.21-.45-.27-.63-.4-.14-.08-.6-.47-.13-.1-.57-.47-.1-.1-.54-.58-.1-.14-.46-.63-.09-.13-.4-.64-.25-.46-.36-.82-.27-.78-.2-.77-.1-.5-.13-1.68.17-1.64.48-1.55.78-1.43 1.05-1.27 1.27-1 1.45-.77 1.57-.47 1.61-.15 1.64.17 1.55.48 1.11.6.82-.26 1.17-.37 1.25-.4 1.33-.38.77-.2.76-.17.82-.17.87-.11 1-.1h41.28zm-52.51 7.62v-.08l-.1-.39-.13-.4z"/><path d="m365.47 647.05.85.15.85.23.8.32.76.42.74.48.66.55.62.63.53.69.47.73.38.78.3.82.22.85.12.87v1.73l-.05 1-.07 1-.08 1-.1 1-.13 1-.15.94-.19 1-.18.93-.2.93-.23.92-.24.93-.26.92-.27.93-.57 1.79-.63 1.81-.68 1.79-.72 1.76-.75 1.75-.78 1.75-.82 1.72-.83 1.72-.84 1.41-.87 1.68-.88 1.65-.88 1.64-.9 1.61-1.77 3.12-1.7 3.1-1.73 2.9-1.59 2.82-.73 1.33-.7 1.3-.67 1.27-.58 1.28-1.45 2.95-1.44 3-1.4 3-1.39 3.05-1.32 3.05-1.34 3.12-1.3 3.13-1.3 3.15-1.26 3.18-1.27 3.19-1.28 3.18-1.25 3.27-2.47 6.51-2.43 6.55-2.45 6.59-2.45 6.6-2.5 6.6-1.27 3.31-1.27 3.3-1.3 3.29-1.31 3.3-1.34 3.26-1.36 3.29-1.39 3.25-1.41 3.25-1.45 3.23-1.45 3.15-.79 1.73-.73 1.67-.72 1.7-.7 1.72-.66 1.71-.65 1.72-.63 1.75-.62 1.76-.6 1.77-.6 1.78-.57 1.8-.56 1.79-1.1 3.65-1.09 3.7-1.05 3.7-1 3.75-2.15 7.55-1.08 3.82-1.13 3.82-.59 1.91-.6 1.92-.61 1.93-.6 1.84-.07.18v.08l-.1.44-.08.45-.07.56-.06.65-.05.72v10.78l-.07 1.12-.12 1.17-.15 1.18-.21 1.22-.34 1.21-.2.72-.22.63-.25.68-.28.67-.32.68-.38.69-.43.7-.49.7-.53.68-.62.65-.68.63-.73.6-.79.54-.83.48-.87.43-.9.35-.91.27-.92.22-.9.15-.67.05h-1.73l-.87-.15-.83-.23-.82-.32-.76-.42-.74-.48-.66-.55-.6-.63-.55-.69-.47-.73-.38-.78-.3-.82-.22-.85-.15-.87v-.88l.07-.87.13-.85.24-.85.33-.8.4-.78.48-.72.57-.68.62-.6.68-.55.73-.47.79-.38.05-.57.05-.7v-9.7l.05-1.13.07-1.17.12-1.18.16-1.22.22-1.23.27-1.22.2-.7.18-.56.62-1.89.56-1.8.57-1.8.55-1.81 1.08-3.67 1.07-3.7 2.14-7.52 1.07-3.79 1.07-3.8 1.11-3.81 1.15-3.8.62-1.94.62-1.91.63-1.92.65-1.93.68-1.92.7-1.92.72-1.91.75-1.92.78-1.92.8-1.91.84-1.9.85-1.87 1.43-3.1 1.37-3.07 1.36-3.11 1.32-3.12 1.32-3.15 1.3-3.18 1.26-3.19 1.27-3.21 1.25-3.24 1.25-3.23 2.45-6.53 2.45-6.55 2.43-6.6 2.47-6.6 2.48-6.59 1.27-3.3 1.28-3.28 1.3-3.28 1.3-3.29 1.35-3.25 1.35-3.26 1.39-3.24 1.41-3.21 1.44-3.22 1.48-3.18 1.52-3.17 1.55-3.15.71-1.42.75-1.43.79-1.45.8-1.47 1.65-2.91 1.71-3 1.72-3 1.72-3.05.83-1.52.83-1.52.8-1.51.8-1.52.75-1.52.74-1.5.71-1.48.65-1.48.64-1.45.58-1.44.53-1.41.49-1.39.45-1.4.18-.63.18-.65.17-.65.17-.63.13-.64.12-.61.11-.6.1-.6.1-.65v-.56l.05-.55.05-.55v-1.14l.07-.87.15-.85.23-.85.32-.8.42-.78.48-.72.57-.66.61-.62.69-.53.73-.47.78-.38.84-.3.83-.22.87-.13h.86zm27.53 6.95.83.1.82.18.8.27.77.35.73.42.68.5.64.55.56.63.52.67.43.73.35.77.29.8.2.81.1.84v1.93l-.06 1.23-.1 1.22-.15 1.22-.19 1.2-.21 1.2-.25 1.18-.29 1.17-.31 1.16-.34 1.15-.36 1.15-.4 1.14-.42 1.13-.43 1.12-.45 1.1-.49 1.1-.48 1.1-.52 1.08-.51 1.08-.55 1.09-.55 1.06-.59 1.07-1.15 2.08-1.2 2.09-1.23 2.06-1.27 2-1.26 2-1.29 2-1.28 2-2.53 3.88-1.24 1.9-1.2 1.89-1.16 1.85-1.14 1.81-1.06 1.79-1 1.75-.95 1.71-.43.82-.42.83-.42.82-.38.8-.35.78-.35.77-.32.75-.28.75-.27.72-.26.76-1.22 3.64-1.25 3.68-2.53 7.32-2.55 7.3-2.57 7.25-5.15 14.48-2.56 7.22-2.52 7.21-2.48 7.22-1.23 3.6-1.2 3.62-1.2 3.61-1.17 3.64-1.16 3.62-1.14 3.63-1.13 3.65-1.1 3.63-1.07 3.65-1.05 3.67-1 3.67-1 3.68-1 3.68-1 3.84-.32 1.13-.41 1.3-.49 1.37-.53 1.43-.58 1.52-.65 1.61-1.37 3.42-1.55 3.68-1.67 3.92-1.66 3.95-1.65 4-1.59 3.88-.73 1.88-.72 1.82-.65 1.75-.6 1.67-.53 1.56-.48 1.45-.39 1.3-.31 1.17-.12.47-.08.43-.09.37v.11l.13.49.12.83v.85l-.05.85-.13.83-.23.8-.3.8-.39.75-.45.7-.53.67-.58.6-.65.55-.7.47-.75.4-.79.31-.8.25-.83.15-.83.09h-.85l-.84-.1-.83-.18-.8-.27-.77-.33-.73-.44-.68-.48-.64-.57-.58-.61-.5-.67-.43-.73-.14-.24-.28-.6-.25-.63-.1-.35-.15-.5-.13-.54-.07-.31-.12-.8-.06-.69v-1.91l.06-.85.12-.84.13-.81.15-.82.19-.82.2-.83.43-1.63.52-1.7.56-1.77.64-1.83.68-1.87.72-1.93.75-1.95.8-2 1.63-4 1.7-4.07 1.68-4 1.64-3.83 1.51-3.62 1.34-3.27.58-1.45.52-1.35.45-1.18.35-1 .25-.78.18-.65.95-3.72 1-3.82 1-3.8 1.07-3.78 1.08-3.78 1.1-3.75 1.14-3.74 1.15-3.73 1.16-3.72 1.19-3.7 1.21-3.7 1.22-3.68 1.23-3.67 1.24-3.68 2.51-7.28 2.55-7.29 2.57-7.25 5.15-14.48 2.55-7.22 2.53-7.23 2.5-7.25 1.22-3.62 1.23-3.68.35-1 .4-1.05.42-1 .43-1 .47-1.05.47-1 .5-1 .5-1 .53-1 .55-1 1.1-2 1.15-2 1.2-2 1.23-2 1.24-2 1.26-2 1.27-2 2.53-3.88 1.25-1.92 1.22-1.92 1.2-1.88 1.15-1.88 1.12-1.85 1.06-1.85 1-1.84.47-.86.46-.9.44-.87.43-.88.4-.87.38-.85.37-.85.35-.83.32-.82.3-.82.26-.8.27-.78.22-.78.2-.75.18-.75.17-.74.11-.71.12-.7.08-.69v-2.11l.07-.85.13-.84.24-.81.3-.79.38-.75.47-.7.53-.66.58-.6.65-.54.7-.46.75-.4.79-.32.81-.25.82-.15.85-.07zm-78.3 232.38-.05-.18-.2-.35z"/><path d="m395.53 658.87h.22l.63.09.64.13.23.07.53.15.52.2.25.08.4.18.4.2.25.14.65.38.55.35.73.58.5.42.6.6.55.63.49.7.4.74.33.78.25.8.17.83.08.84v.85l-.08.83-.18.83-.25.8-.34.79-.41.73-.49.68-.55.64-.61.58-.69.52-.13.08v.67l.05 1.11.06 1.17.17 2.52.22 2.58.23 2.63.22 2.59.18 2.48.08 1.23.07 1.17v5.5l-.05 1.62-.07 1.61-.08 1.6-.1 1.6-.22 3.15-.28 3.14-.3 3.11-.32 3.09-.33 3.05-.32 3-.31 3-.29 3-.25 3-.21 3-.1 1.45-.07 1.47-.07 1.45v13.27l-.08 4.45-.09 4.45-.11 4.43-.15 4.45-.17 4.43-.17 4.44-.2 4.43-.2 4.43-.45 8.85-.46 8.84-.5 8.85-.49 8.81-.46 8.84-.45 8.81-.2 4.4-.19 4.42-.18 4.4-.15 4.4-.15 4.42-.12 4.4-.08 4.4-.08 4.4v9.68l-.14.83-.2.82-.3.78-.38.77-.45.72-.52.66-.58.6-.63.55-.7.49-.74.4-.78.33-.8.25-.83.17-.84.08h-1.06l-.83-.08-.83-.19-.8-.25-.79-.33-.73-.42-.68-.48-.65-.55-.59-.62-.5-.66-.45-.72-.36-.77-.3-.78-.2-.82-.14-.83v-5.33l.05-4.52.06-4.5.1-4.48.12-4.49.13-4.48.17-4.48.17-4.47.2-4.45.2-4.47.45-8.88.48-8.87.48-8.85.49-8.81.48-8.8.43-8.79.2-4.38.2-4.38.17-4.37.17-4.37.13-4.36.12-4.37.1-4.35.06-4.35v-12l.05-1.65.07-1.63.08-1.62.1-1.63.24-3.17.26-3.17.3-3.13.32-3.1.33-3 .32-3 .32-3 .28-3 .27-2.93.21-2.93.09-1.44.06-1.43.07-1.43.05-1.44v-4.45l-.05-1-.07-1-.18-2.3-.22-2.52-.21-2.65-.24-2.73-.18-2.72-.08-1.37-.05-1.35v-5.2l.1-1.28.16-1.23.12-.72.15-.68.18-.74.24-.75.31-.81.42-.87.32-.53.25-.4.26-.39.14-.18.35-.43.38-.42.15-.17.47-.43.5-.4.16-.12.64-.43.65-.35.18-.1.72-.3.73-.25.2-.05.77-.18.8-.1h.93zm28.79-8.37.83.08.83.17.8.27.77.33.75.42.68.48.64.55.58.62.52.66.45.72.36.77.29.78.21.82.12.83v6.07l-.05 5.26-.1 5.25-.14 5.25-.15 5.25-.2 5.25-.2 5.25-.25 5.25-.25 5.24-.26 5.25-.3 5.25-.3 5.25-.64 10.46-.65 10.49-.66 10.48-.63 10.47-.3 5.23-.28 5.23-.27 5.25-.27 5.22-.23 5.23-.2 5.24-.18 5.23-.17 5.23-.12 5.24-.1 5.21-.06 5.24v6.78l-.07 2.35-.28 6.88-.35 9-.37 9.94-.15 5-.13 4.77-.1 4.42-.07 3.93v6.14l.17.83.1.83v.86l-.08.84-.15.83-.25.8-.34.78-.4.74-.48.7-.53.65-.62.58-.67.52-.7.45-.76.38-.79.3-.81.22-.84.13-.85.05h-.83l-.83-.12-.82-.22-.8-.28-.77-.37-.71-.43-.53-.4-.52-.45-.46-.49-.44-.51-.4-.55-.34-.6-.3-.62-.05-.13-.23-.6-.18-.64-.12-.5-.15-.86-.13-1.2-.07-1.27-.05-1.38v-5.09l.07-4.08.1-4.53.13-4.85.17-5 .37-10 .35-9 .26-6.85.09-2.2v-6.45l.05-5.33.1-5.33.13-5.34.15-5.33.18-5.32.22-5.3.23-5.3.27-5.3.27-5.28.3-5.28.3-5.27.63-10.52.65-10.5.65-10.46.63-10.44.3-5.21.29-5.2.26-5.19.27-5.18.23-5.18.2-5.17.19-5.17.16-5.16.12-5.15.1-5.14.05-5.13v-5.17l.05-.83.13-.85.22-.82.3-.78.36-.75.53-.92.52-.66.58-.62.65-.55.7-.47.74-.41.81-.29.8-.25.83-.16.84-.07zm-1.55 227.65.35.62-.19-.4-.45-.62z"/><path d="m436 653.85.83.12.82.21.78.3.77.37.71.45.67.52.6.58.55.63.48.7.42.74.33.78.25.8.17.83.08.84v.85l-.08.83-.18.83-.17.55.12.47.15.57.18.58.42 1.33.46 1.39.5 1.38.5 1.35.5 1.27.87 2.16.55 1.35.8 2 .82 1.9.83 1.9.88 1.92.9 1.9.92 1.9.95 1.92 1 1.91 2 3.87 2 3.9 2.05 3.93 2 4 1 2 1 2 1 2.05 1 2.09.95 2.1.93 2.11.92 2.14.86 2.18.85 2.18.82 2.24.77 2.25.71 2.26.35 1.19.34 1.15.33 1.16.3 1.19.3 1.18.28 1.2.27 1.2.23 1.18.59 2.82.6 2.92.63 3 .67 3.13.71 3.22.75 3.32.79 3.38.81 3.47.85 3.51.89 3.55.91 3.6.95 3.64 1 3.66 1 3.65 1.05 3.67 1.16 3.73 1.1 3.63 1.13 3.62 1.15 3.56 1.2 3.54 1.2 3.48 1.25 3.42.62 1.65.65 1.66.63 1.64.65 1.6.65 1.58.65 1.57.67 1.53.67 1.5.66 1.48.67 1.45.68 1.4.69 1.39.68 1.35.68 1.3.7 1.28.69 1.22.7 1.2.68 1.15.7 1.1.75 1.15.3.46.35.6.57 1 .53 1.1.48 1.1.47 1.12.43 1.13.42 1.14.4 1.16.8 2.32.78 2.32.79 2.3.38 1.08.4 1.07.4 1 .4 1 .38.9.4.85.39.75.38.7.15.26.17.27.15.23.15.2.11.17.55.1.8.25.79.32.73.4.7.48.65.53.58.62.54.65.45.72.38.75.3.8.22.81.13.84.07.83v.85l-.13.83-.2.82-.28.8-.37.75-.43.73-.52.67-.57.62-.63.56-.68.49-.74.41-.78.34-.8.26-.82.19-.85.1h-1.56l-1-.11-1-.22-1-.28-1-.34-.89-.41-.83-.45-.78-.49-.72-.51-.68-.55-.64-.55-.58-.57-.53-.6-.52-.58-.48-.6-.45-.6-.42-.6-.42-.62-.38-.62-.38-.65-.67-1.2-.62-1.26-.6-1.27-.55-1.27-.51-1.28-.5-1.27-.56-1.3-.45-1.29-.85-2.43-.78-2.35-.75-2.2-.35-1-.35-.94-.32-.85-.32-.75-.26-.63-.25-.5-.22-.4v-.07l-.12-.16-.78-1.22-.85-1.35-.84-1.38-.83-1.42-.82-1.45-.8-1.47-.78-1.5-.78-1.53-.77-1.57-.75-1.56-.75-1.62-.75-1.63-.73-1.65-.72-1.67-.72-1.7-.7-1.72-.7-1.73-.68-1.75-.67-1.77-.68-1.8-1.32-3.6-1.26-3.65-1.28-3.69-1.22-3.74-1.18-3.76-1.12-3.77-1.1-3.8-1.09-3.78-1-3.78-1-3.77-1-3.75-.95-3.7-.9-3.67-.88-3.6-.84-3.53-.8-3.48-.76-3.39-.74-3.3-.74-3.18-.65-3.1-.62-3-.56-2.83-.22-1-.22-1-.23-1-.25-1-.25-1-.27-1-.28-1-.28-.95-.64-2-.65-1.93-.7-1.94-.75-1.91-.76-1.92-.82-1.92-.85-1.9-.87-1.91-.9-1.92-.91-1.92-.95-1.91-1-1.92-2-3.87-2-3.9-2.05-3.93-2-4-1-2-1-2-1-2.05-1-2.07-1-2.08-.94-2.1-.91-2.13-.85-2.09-.59-1.41-.91-2.3-.55-1.44-.59-1.55-.58-1.61-.57-1.69-.53-1.66-.25-.89-.25-.85-.22-.86-.2-.89-.16-.86-.15-.92-.12-1-.07-1v-1.63l.05-.38.07-.45.1-.45v-.17l.2-.73.05-.15.15-.42.18-.42.07-.13.23-.48.29-.49.06-.11.37-.54.42-.5.08-.1.5-.53.55-.48.1-.09.63-.45.67-.4.12-.06.7-.34.73-.26h.12l.81-.21.85-.14h.84zm2.41 15.95-.8.28.64-.2.35-.18zm17.67-36.8.49.07.86.13.35.09.52.13.52.15.35.13.45.17.41.2.37.18.7.39.68.41.89.65.8.69.7.7.66.7.6.71.55.72.54.75.51.75.49.77.46.78.45.8.45.8.45.87.82 1.66.82 1.77.78 1.82.77 1.86.75 1.92.73 1.93.7 1.95.68 2 .67 2 .65 2 .62 1.95 1.16 3.73 1.07 3.52 1.75 5.93.65 2.2.48 1.53.7 2.07.74 2.13.75 2.14.76 2.13.79 2.13.81 2.15.82 2.15.82 2.14 1.71 4.33 1.75 4.33 1.8 4.35 1.84 4.37 1.88 4.37 1.9 4.4 1.93 4.41 2 4.42 3.93 8.92 4 9 2 4.5 2 4.51 1.95 4.54 1.92 4.53 1.77 4.47 1.87 4.58 1.81 4.58 1.79 4.6.86 2.34.87 2.3.85 2.31.83 2.34.82 2.31.8 2.34.78 2.33.77 2.35.75 2.33.73 2.35.7 2.35.7 2.37.67 2.35.65 2.37.63 2.38.59 2.32.3 1.1.28 1.05.33 1.08.35 1.1.37 1.12.4 1.11.42 1.15.43 1.14.47 1.16.48 1.15.5 1.19.53 1.16.54 1.17.55 1.17.58 1.18.58 1.17.6 1.16.62 1.17.63 1.15.64 1.15.65 1.13.66 1.14.67 1.11.67 1.1.68 1.09.68 1.08.7 1.05.7 1 .7 1 .7 1 .7 1 .79 1 .35.5.38.61.35.62.35.65.5 1.1.43 1.13.37 1.12.3 1.08.25 1.07.22 1 .2 1 .16 1 .29 1.86.23 1.77.25 1.76.6.3.73.48.67.55.62.62.55.66.48.74.38.78.32.82.22.83.15.87v1.75l-.13.85-.22.85-.32.81-.4.77-.46.73-.55.69-.64.61-.66.55-.74.47-.78.4-.55.25-.87.3-.56.17-.74.16h-.25l-.81.11h-2.5l-.54-.12-.48-.12-.2-.05-.47-.15-.46-.17-.19-.06-.45-.2-.41-.22-.19-.08-.76-.47-.19-.13-.66-.5-.17-.15-.58-.54-.39-.4-.56-.66-.47-.67-.4-.63-.35-.64-.32-.66-.43-1.05-.35-1.07-.28-1-.24-1-.2-1-.16-1-.15-.94-.27-1.78-.22-1.66-.25-1.63-.12-.73-.13-.69-.14-.61-.13-.55-.12-.49-.13-.36-.08-.25-.07-.15-.72-.95-.81-1.14-.82-1.15-.8-1.16-.8-1.19-.78-1.2-.79-1.23-.78-1.23-.77-1.25-.75-1.27-.75-1.27-.73-1.3-.73-1.3-.7-1.31-.7-1.32-.69-1.32-.68-1.35-.65-1.33-.63-1.35-.62-1.35-.62-1.37-.58-1.35-.57-1.35-.53-1.36-.53-1.37-.5-1.37-.49-1.35-.45-1.36-.43-1.35-.4-1.37-.38-1.35-.34-1.28-.58-2.29-.58-2.21-.62-2.22-.63-2.22-.65-2.23-.67-2.22-.7-2.23-.72-2.22-.71-2.21-.75-2.24-.77-2.21-.78-2.24-.8-2.23-.82-2.22-.82-2.23-.83-2.22-1.73-4.46-1.77-4.45-1.82-4.45-1.85-4.47-1.88-4.45-1.92-4.47-1.91-4.47-1.95-4.48-3.95-8.93-4-8.9-2-4.47-1.95-4.45-1.93-4.46-1.92-4.45-1.88-4.47-1.83-4.45-1.74-4.42-1.75-4.45-.87-2.25-.85-2.21-.83-2.24-.83-2.23-.8-2.25-.79-2.23-.76-2.24-.79-2.28-.56-1.83-.7-2.34-1.75-5.9-1-3.4-1.12-3.6-.58-1.81-.6-1.82-.62-1.83-.63-1.8-.65-1.79-.65-1.71-.65-1.69-.65-1.58-.65-1.5-.63-1.4-.65-1.28-.29-.57-.3-.53-.28-.5-.27-.45-.25-.4-.23-.34-.22-.3-.2-.06-.8-.34-.76-.43-.72-.5-.65-.57-.6-.65-.52-.68-.45-.75-.36-.8-.29-.82-.2-.85-.1-.86v-.94l.08-.86.17-.85.25-.84.35-.8.41-.76.52-.72.57-.65.63-.6.7-.52.75-.45.8-.36.82-.29.85-.2.86-.1h1.35zm-1.21 16.64h.13-.43zm-77.97-37.57h1l.33.05.34.07.31.08.32.1.33.1.3.12.32.13.3.15.3.15.28.17.29.18.28.2.27.2.25.22.25.21.25.24.23.25.22.25.21.26.2.27.19.27.18.28.17.3.15.3.15.3.11.3.14.32.1.31.08.34.08.31.07.34.05.33.05.33v2.25l-.07.7-.1.74-.23 1.23-.32 1.27-.37 1.26-.4 1.24-.51 1.31-.48 1.25-.52 1.25-.55 1.25-.58 1.27-.6 1.26-.62 1.27-.66 1.3-1.32 2.52-1.37 2.53-1.4 2.5-1.36 2.42-1.34 2.31-2.43 4.25-1 1.84-.92 1.66-.17.3-.16.29-.2.26-.2.29-.2.25-.24.25-.21.25-.25.23-.25.22-.27.21-.27.2-.26.2-.29.19-.28.16-.3.15-.3.15-.32.14-.31.11-.32.1-.32.1-.33.09-.32.06h-3l-.32-.07-.33-.08-.32-.08-.32-.12-.31-.12-.32-.13-.3-.13-.3-.15-.28-.17-.29-.18-.28-.19-.27-.21-.26-.2-.25-.24-.25-.21-.24-.25-.21-.25-.22-.25-.2-.27-.18-.28-.19-.29-.16-.28-.17-.3-.15-.3-.13-.32-.12-.31-.1-.32-.1-.32-.08-.33-.07-.32-.05-.33-.05-.33v-2.01l.05-.33.07-.32.08-.33.1-.32.1-.32.12-.31.13-.32.14-.3.16-.3 1-1.77 1.12-2 2.46-4.3 1.3-2.28 1.34-2.34 1.3-2.35 1.27-2.35 1.22-2.31.57-1.1.53-1.1.5-1 .47-1 .43-1 .4-.93.33-.87.29-.8.23-.72.18-.63.14-.5.08-.45v-1.37l.05-.33.08-.32.07-.33.1-.32.12-.31.11-.32.14-.3.13-.32.17-.28.16-.3.19-.28.18-.27.22-.27.2-.26.23-.25.23-.24.24-.23.25-.23.26-.2.27-.2.28-.2.29-.17.28-.17.3-.16.3-.14.32-.13.31-.12.32-.1.32-.1.33-.08.33-.07h1.34z"/><path d="m444.32 609.3 1.1.07 1.11.11 1.12.15 1.12.22 1.15.27 1.13.35 1.13.41 1.14.5 1.11.57 1 .63.6.4.52.39.51.41.5.42.49.45.46.47.45.46.44.5.41.52.4.53.39.54.36.55.35.56.37.64.58 1.13.54 1.22.48 1.26.42 1.3.36 1.32.32 1.38.27 1.4.23 1.45.17 1.5.13 1.54.1 1.6.07 1.63v2.6l-.06.48-.1.49-.14.48-.15.47-.18.46-.2.45-.23.44-.27.41-.28.4-.3.4-.34.37-.35.35-.36.32-.39.3-.41.28-.42.27-.43.21-.45.22-.47.17-.47.15-.48.11-.48.1-.49.07h-2l-.48-.09-.49-.11-.46-.14-.47-.16-.45-.2-.45-.22-.42-.25-.41-.27-.4-.3-.39-.31-.35-.34-.33-.36-.32-.39-.3-.4-.26-.41-.25-.42-.22-.45-.18-.45-.17-.47-.13-.48-.1-.48-.09-.49v-2.38l-.05-1.23-.07-1.15-.1-1-.1-1-.15-.88-.15-.8-.15-.7-.18-.63-.17-.54-.18-.45-.17-.38-.18-.37-.05-.08-.07-.12-.06-.1-.07-.08-.05-.07-.05-.06-.07-.07h-.1l-.17-.1-.11-.06-.15-.07-.19-.07-.23-.06-.28-.07-.34-.07-.38-.05h-3.56l-.72.05-.75.08-.78.1-.8.1-1.78.28-1.87.32-2 .37-4.25.81-2.25.44-2.35.4-2.4.4-1.25.18-1.25.17-1.28.16-1.28.14-1.32.13-1.32.12-1.33.08-1.37.07h-3.65l-.68.09-.82.13-.9.15-1 .22-1.05.21-1.1.27-2.35.58-2.41.62-2.45.65-2.4.62-2.32.56-1.15.25-1.12.24-1.11.18-1.14.17-1.11.1h-1.4l-.77-.05-.88-.11-.55-.12-.47-.12-.45-.13-.18-.07-.39-.15-.38-.15-.38-.18-.15-.08-.35-.2-.34-.2-.33-.24-.33-.23-.12-.1-.37-.32-.36-.33-.34-.37-.31-.38-.09-.1-.26-.37-.24-.35-.21-.38-.22-.38-.17-.4-.06-.14-.15-.4-.14-.4-.11-.4-.09-.41-.08-.42v-.13l-.05-.47v-1.57l.05-.48.07-.48.12-.47.05-.18.1-.37.11-.37.13-.56.08-.2.17-.38.18-.38.28-.54.49-.75.48-.65.37-.45.31-.38.35-.35.37-.33.38-.32.4-.28.42-.27.43-.23.44-.22.46-.18.47-.17.47-.13.48-.1.5-.07h1.97l.48.07.48.1.49.13.46.15.45.18.45.22.44.23.41.27.1.08.74-.18 2.25-.58 2.43-.64 2.53-.65 2.55-.65 1.32-.3 1.3-.28 1.28-.27 1.27-.23 1.28-.18 1.29-.17 1.23-.1h4.48l1.07-.09 1.07-.08 1.05-.1 1.06-.12 1.09-.13 1.06-.15 1.05-.15 2.17-.35 2.13-.38 2.15-.4 4.25-.82 2.12-.4 2.12-.37 2.08-.31 1.07-.15 1.06-.14 1.07-.1 1.05-.1 1.07-.06h2.16z"/><path d="m417.2 620.8h1.13l.39.08.36.08.35.12.37.12.35.15.35.15.33.18.34.18.31.2.32.22.3.23.28.25.29.25.26.27.25.28.25.3.22.3.22.32.2.32.18.33.17.33.15.35.15.35.11.37.1.37.09.36.08.37v1.92l.15 1.71.22 2.4.3 2.94.37 3.35.41 3.65.47 3.81.47 3.87.5 3.82.5 3.63.5 3.33.46 2.94.2 1.21.2 1.09.19.86.05.24.11.2.15.35.15.35.14.35.11.36.1.37.07.37.07.38.05.37v1.51l-.05.39-.05.36-.06.39-.1.36-.1.37-.14.35-.13.35-.17.35-.16.33-.19.34-.2.31-.21.32-.24.3-.25.3-.25.27-.26.26-.29.27-.28.23-.32.24-.3.21-.33.2-.33.19-.34.16-.35.15-.35.15-.36.12-.35.1-.39.1-.35.07-.37.05h-2.18l-.37-.07-.36-.07-.33-.09-.33-.1-.34-.11-.31-.12-.32-.15-.32-.15-.3-.17-.3-.18-.3-.18-.28-.2-.27-.22-.06-.07-.29-.23-.26-.25-.25-.25-.25-.27-.22-.28-.23-.3-.2-.3-.07-.1-.17-.25-.13-.25-.13-.25-.14-.25-.23-.48-.27-.72-.21-.67-.29-1.05-.25-1.11-.25-1.22-.25-1.32-.25-1.43-.5-3.15-.51-3.5-.52-3.77-.5-3.91-.5-4-.47-3.9-.43-3.73-.37-3.44-.31-3.06-.25-2.59-.15-2-.05-.88v-1.73l.05-.37.07-.38.08-.37.1-.37.12-.36.13-.35.15-.35.17-.34.18-.33.2-.33.2-.32.24-.3.23-.3.25-.28.27-.27.26-.27.3-.25.3-.23.3-.22.32-.2.33-.2.34-.16.35-.17.35-.15.35-.13.36-.1.37-.1.37-.09.38-.06h1.13z"/><path d="m401.65 620.8h.4l.42.07.4.07.4.1.38.11.4.12.37.17.38.16.37.19.35.2.33.23.33.23.32.25.32.29.28.28.28.3.27.3.25.33.23.34.22.35.2.35.17.36.16.39.15.38.12.38.1.4.1.4v.4l.05.42v2.97l-.07 2.33-.12 2.4-.16 2.47-.2 2.53-.25 2.55-.29 2.58-.33 2.6-.37 2.59-.41 2.58-.47 2.53-.48 2.49-.29 1.26-.28 1.22-.28 1.2-.3 1.18-.32 1.17-.33 1.15-.34 1.13-.31.95v.25l-.05.25-.05.29-.13.93-.12 1.07-.1 1.2-.08 1.26-.15 2.59-.15 2.33-.09 1.13-.13 1.12-.1.52-.07.28-.06.27-.07.26-.05.17-.12.33-.11.32-.14.33-.15.32-.16.3-.17.3-.05.1-.22.32-.21.31-.24.3-.25.3-.26.29-.27.26-.3.25-.3.25-.3.24-.33.2-.32.2-.35.18-.36.16-.37.17-.37.13-.36.12-.39.1-.38.08-.38.07-.4.05h-1.57l-.4-.05-.38-.07-.36-.08-.39-.1-.36-.12-.37-.13-.35-.15-.35-.17-.33-.18-.34-.2-.33-.2-.3-.23-.3-.25-.29-.25-.26-.25-.25-.27-.25-.28-.24-.28-.21-.3-.21-.35-.22-.35-.18-.37-.17-.37-.08-.16-.12-.29-.1-.28-.1-.3-.15-.5-.15-.6-.08-.4-.07-.4-.05-.42v-2.03l.08-.4.08-.4.12-.4.13-.38.15-.39.12-.26v-.37l.16-2.68.1-1.49.14-1.51.15-1.54.21-1.48.15-.82.15-.78.22-.82.2-.71.32-1 .26-.87.27-.9.25-.93.25-1 .23-1 .24-1 .23-1 .43-2.19.4-2.23.37-2.3.33-2.32.3-2.31.27-2.34.22-2.3.18-2.26.13-2.2.1-2.12.07-2v-2.81l.05-.4.08-.4.08-.4.12-.4.13-.39.15-.38.17-.37.2-.36.2-.35.22-.35.25-.34.25-.31.26-.3.29-.3.3-.29.31-.25.34-.25.33-.23.35-.22.35-.2.37-.18.38-.17.38-.13.39-.13.4-.1.4-.09.4-.06h1.23z"/><path d="m489.6 554.8h2l1 .07 1 .08 1 .1 1 .14 1 .15 1 .18 1 .22 1 .25 1 .26 1 .32 1 .37.95.4.95.45.95.5.94.56.9.64.9.68.86.77.82.81.77.9.71 1 .67 1 .53 1 .5 1 .42.95.4.93.37.95.35 1 .31 1 .3 1 .27 1 .23 1 .22.95.18 1 .17 1 .13 1 .1 1 .09 1 .06.95v4.81l-.1.94-.1.91-.13.92-.17.92-.17.9-.2.9-.21.9-.24.88-.26.87-.27.86-.3.87-.32.85-.33.85-.35.83-.37.84-.38.81-.4.8-.42.8-.43.8-.43.79-.47.76-.48.77-.49.75-.5.75-.51.73-.54.74-.55.71-.55.7-.56.7-.59.69-.58.68-.62.67-.6.65-.63.65-.65.66-1.75.76-1.35 1.2-1.37 1.15-1.42 1.12-1.45 1.08-1.48 1-1.52 1-1.53.93-1.58.89-1.59.85-1.63.78-1.63.73-1.67.7-1.68.64-1.67.56-.9.29-.85.25-.88.23-.87.23-.87.2-.88.2-.88.19-.89.16-.88.15-.88.14-.9.11-.89.1-.9.09-.9.06h-5.4l-.9-.05-.91-.08-.9-.1-.9-.14-.9-.13-.9-.17-.89-.16-.9-.22-.88-.22-.9-.25-.88-.26-.87-.29-.88-.31-.87-.34-.87-.36-.85-.39-.85-.4-.85-.43-.83-.45-.82-.47-.81-.5-.72-.46-.65-.47-.6-.52-.53-.58-.5-.62-.42-.66-.37-.72-.28-.73-.23-.77-.14-.77-.08-.8v-.78l.08-.8.15-.77.24-.76.3-.74.36-.7.44-.66.48-.62.55-.58.6-.52.65-.45.68-.4.74-.33.75-.25.76-.19.79-.11h1.58l.78.12.77.18.75.27.73.33.69.4.51.34.45.28.45.25.45.25.47.23.45.22.47.22.48.18.48.2.49.17.48.16.5.15.5.14.52.13.51.12.52.1.52.1.53.08.53.07.55.06h.54l.55.05h3.4l.58-.05h.58l.59-.07.58-.08.6-.08.58-.1.6-.12.59-.12.6-.13.6-.13.6-.17.6-.17.58-.16.57-.19 1.23-.41 1.18-.45 1.19-.49 1.16-.53 1.17-.55 1.13-.62 1.14-.63 1.11-.67 1.09-.7 1.06-.75 1-.76 1-.79 1-.83.95-.85.95-.9.42-.42.43-.45.42-.45.41-.46.4-.45.4-.49.39-.46.38-.47.37-.48.35-.5.33-.49.33-.48.34-.5.3-.48.3-.5.28-.5.27-.5.26-.5.25-.52.24-.5.23-.52.2-.5.22-.51.18-.5.17-.52.16-.52.15-.5.21-.48.13-.52.12-.52.1-.5.08-.51.07-.5.06-.52.05-.52v-3.1l-.05-.51-.07-.52-.06-.53-.09-.52-.1-.52-.11-.53-.14-.53-.15-.54-.16-.55-.19-.53-.2-.55-.21-.55-.24-.55-.25-.55-.23-.47-.05-.11v-.05h-.05l-.09-.06-.11-.09-.17-.08-.18-.12-.24-.1-.28-.11-.32-.14-.36-.11-.4-.12-.44-.1-.48-.1-.5-.1-.55-.08-.57-.09-.6-.06h-.63l-.65-.05h-5.13l-1.59.08-1.61.13-1.65.15-1.67.17-1.67.2-1.66.22-1.64.21-3.25.45-3.06.44-1.49.21-1.45.17-1.38.17-1.35.11-1.33.09h-24.45l-4.59.06-4.75.12-4.86.15-5 .18-2.52.12-2.53.13-2.57.15-2.58.15-2.59.19-2.58.2-2.6.2-2.6.23-2.6.25-2.6.27-2.58.28-2.59.32-2.56.33-2.55.35-2.54.38-2.51.4-2.49.42-2.46.45-2.44.48-2.4.5-2.35.52-2.33.57-2.27.56-2.27.55-2.18.63-2.14.67-2.1.7-1 .35-1 .35-1 .38-1 .37-.95.38-.93.4-.93.39-.9.41-.89.4-.86.42-.84.42-.83.43-.82.43-.78.45-.77.44-.75.45-.73.46-.7.47-.68.47-.67.46-.63.49-.64.46-.6.5-.56.49-.55.48-.54.5-.51.5-.49.5-.46.52-.45.5-.42.51-.4.52-.22.28.05.09.15.26.19.32.21.33.27.37.3.38.33.4.37.44.4.45.43.45.47.46.48.47.54.48.53.49.57.48.58.48.62.5.61.49.62.46 1.35 1 1.35 1 1.4.91 1.4.9 1.42.85 1.38.82 1.38.75 1.32.72 1.28.65 1.2.56 1.14.52 1 .43.88.35.7.25.57.17h5.58l2.6-.07 2.84-.1 5.91-.2 3-.08h7.95l1.16.07 1.17.11 1.1.17.7.13.7.17.82.27.5.2.46.21.45.24.15.08.6.37.59.43.11.08.54.49.5.51.45.57.06.1.42.63.35.65.3.69.23.71v.1l.15.64.1.65.05.63v.65l-.05.65v.12l-.1.66-.16.67-.22.63-.27.64v.11l-.38.7-.43.65-.5.62-.55.57-.62.51-.65.45-.7.39-.72.31-.75.25-.78.19-.78.1h-.8l-.79-.05-.78-.11-.77-.2-.75-.29-.71-.33-.27-.17h-6.68l-2.78.07-5.85.2-2.88.1-2.74.08h-6.9l-1.07-.08-1.05-.17-.78-.17-.73-.2-1.24-.36-1.31-.49-1.37-.53-1.42-.6-1.46-.67-1.52-.73-1.57-.8-1.61-.85-1.65-.92-1.67-1-1.68-1-1.69-1.08-1.7-1.12-1.66-1.17-1.64-1.2-.83-.63-.82-.63-.8-.64-.78-.66-.78-.67-.75-.68-.75-.69-.74-.7-.71-.71-.7-.74-.69-.75-.66-.76-.64-.79-.61-.8-.6-.83-.57-.87-.53-.88-.52-.92-.47-1-.43-1-.38-1-.32-1.1-.27-1.13-.28-1.16-.08-1.23v-1.27l.11-1.18.12-.74.13-.65.17-.63.18-.63.24-.64.25-.61.28-.6.3-.6.33-.57.34-.53.66-1 .67-.92.7-.9.72-.87.73-.85.77-.83.78-.8.82-.8.81-.77.85-.75.87-.73.88-.72.9-.7.92-.68.95-.67.95-.65 1-.63 1-.62 1-.6 1-.58 1-.58 1-.55 1.06-.55 1.07-.54 1.07-.51 1.1-.52 1.1-.48 1.11-.49 1.14-.46 1.13-.47 1.15-.45 1.17-.43 1.18-.42 1.2-.43 2.37-.79 2.43-.76 2.48-.72 2.5-.68 2.54-.64 2.55-.58 2.59-.59 2.61-.55 2.64-.5 2.66-.5 2.67-.45 2.68-.43 2.7-.4 2.72-.37 2.72-.35 2.73-.33 2.72-.3 2.73-.28 2.72-.27 2.71-.23 2.72-.22 2.7-.2 2.68-.18 2.67-.17 2.67-.15 2.63-.15 2.62-.12 5.11-.2 5-.15 4.87-.11 4.68-.07h24.7l.95-.09 1.12-.13 1.25-.15 1.36-.18 3-.44 3.32-.46 1.75-.24 1.8-.23 1.83-.22 1.88-.18 1.9-.18 1.92-.15 1.93-.1 1.95-.07h1.92z"/><path d="m389.85 479.05h.5l.52.07.5.1.48.13.48.15.47.2.47.22.45.25.43.27.4.3.4.31.37.35.36.37.32.38.32.44.26.4.24.41.21.42.2.45.15.43.15.47.1.47.1.46v2.09l-.06.51-.1.52-.14.5-.15.5-.2.48-.21.49-.25.45-.15.4-.35 1-.4 1.18-.43 1.35-.47 1.45-.45 1.52-.37 1.56-.4 1.52-.35 1.45-.3 1.35-.1.55-.08.51-.07.47v3.45l-.07 2.77-.13 2.85-.18 2.86-.24 2.9-.26 2.92-.3 2.93-.35 2.94-.39 2.93-.41 2.92-.45 2.88-.47 2.87-.5 2.81-.53 2.77-.55 2.72-.54 2.48-.06.32v.3l-.27.43v5.28l.07 1.85.11 3.72.05 1.8v2.65l-.05.9-.11 1-.12.7-.1.42-.1.4-.1.35-.15.47-.18.46v.15l-.2.42-.22.42-.07.11-.21.37-.24.35-.25.35-.08.1-.27.32-.28.31-.3.3-.32.27-.06.08-.35.27-.35.27-.39.23-.38.22-.38.2h-.09l-.45.2-.46.17-.47.13-.47.12-.48.08h-.1l-.47.06h-2l-.48-.09-.48-.11-.47-.14-.55-.16-.11-.05-.45-.19-.44-.23-.43-.23-.12-.09-.31-.2-.3-.21-.29-.22-.13-.12-.3-.25-.3-.28-.35-.37-.58-.66-.5-.7-.3-.44-.27-.45-.23-.46-.22-.47-.17-.5-.15-.5-.11-.52-.09-.51-.05-.52v-1l.05-.52.09-.51.11-.52.14-.5.18-.5.2-.47.25-.46.27-.45.28-.44.17-.23-.12-3.45-.07-2v-6l.07-1 .1-1 .15-1 .18-.92.55-2.6.52-2.52.48-2.56.47-2.64.45-2.66.41-2.7.39-2.72.36-2.73.32-2.74.28-2.71.25-2.69.2-2.66.17-2.62.12-2.55.08-2.52v-3.35l.09-.93.1-.92.11-.9.15-.88.19-.93.38-1.77.43-1.83.49-1.82.51-1.8.52-1.75.53-1.65.5-1.55.49-1.4.43-1.23.42-1.09.4-1 .35-.71.25-.44.23-.36.25-.34.25-.33.28-.33.31-.35.35-.32.37-.3.38-.26.39-.27.41-.23.42-.2.43-.19.44-.16.5-.15.49-.12.51-.08.5-.05h.5zm24.42-1.7h.48l.47.07.48.08.45.13.47.14.45.18.43.2.42.22.41.25.4.26.39.3.35.32.35.33.35.39.28.35.27.38.26.38.22.4.22.42.18.42.15.43v.07l.13.45.12.45.08.45.08.56.07.92v2.32l-.06.48-.09.48-.13.49-.15.46-.17.47-.2.42-.06.71-.32 3.37-.27 3.43-.11 1.54-.07 1.35-.05 1v3.58l-.05 1.47-.06 1.43-.09 1.43-.1 1.44-.23 2.76-.28 2.72-.3 2.68-.32 2.65-.33 2.59-.32 2.55-.32 2.53-.28 2.48-.25 2.49-.22 2.46-.08 1.2-.07 1.22-.06 1.22-.05 1.21v4.04l-.06.78-.09.83-.18 1.57-.22 1.65-.26 1.65-.27 1.63-.5 3-.13.82.05.25.06.48.05.5v.98l-.05.49-.07.5-.1.48-.13.47-.15.46-.18.47-.25.58-.24.47-.2.37-.2.35-.11.18-.25.38-.29.37-.3.37-.05.05-.28.3-.3.3-.32.26-.33.27-.35.25-.42.26-.43.24-.44.21-.46.19-.47.15-.47.13-.48.1-.48.07h-1.99l-.49-.08-.48-.1-.47-.12-.46-.16-.47-.19-.43-.2-.44-.25-.41-.25-.4-.3-.39-.3-.35-.34-.33-.33-.32-.37-.3-.38-.28-.38-.24-.42-.23-.42-.2-.45-.18-.45-.14-.45v-.1l-.13-.48-.1-.48-.07-.49v-1.98l.13-1.15.17-1.23.43-2.65.52-3 .25-1.5.21-1.47.19-1.36.15-1.22.05-.48v-3.75l.05-1.43.06-1.42.09-1.42.1-1.4.23-2.73.28-2.7.3-2.67.32-2.61.33-2.59.32-2.56.32-2.54.28-2.5.25-2.5.22-2.5.08-1.23.08-1.23v-1.25l.05-1.24v-3.63l.07-1.37.1-1.53.12-1.7.28-3.62.33-3.58.17-1.67.17-1.48.18-1.32.2-1.18.1-.5.12-.43.15-.45.05-.15.16-.42.19-.42.2-.41.23-.39.23-.38.27-.39.3-.35.32-.35.33-.31.35-.3.37-.29.4-.26.38-.24.42-.21.41-.2.44-.17.45-.15.45-.12.47-.09.48-.08h.95zm26.58 3.52.5.05.48.08.49.12.46.15.47.16.45.2.43.22.44.25.41.28.39.3.38.32.35.35.33.35.32.38.28.4.27.42.25.43.2.45.2.45.15.47.13.48.1.49.09.48.05.5v6l.05 2.78.08 2.82.1 2.83.12 2.87.15 2.87.18 2.9.22 2.9.25 2.91.26 2.92.32 2.92.35 2.9.38 2.91.42 2.9.45 2.89.65 3.71.38 2.25.42 2.45.4 2.57.37 2.6.18 1.33.15 1.32.15 1.3.12 1.3.1 1.28.06 1.25v2.49l-.05 1.25-.1 1.18-.1.72-.12.68-.17.7-.2.77-.28.8-.23.53-.15.33-.19.35-.11.2-.22.4-.27.39-.11.18-.22.3-.23.28-.25.29-.14.15-.3.31-.31.29-.34.28-.15.12-.38.3-.42.26-.41.25-.17.09-.35.18-.37.17-.36.15-.39.13h-.16l-.39.12-.38.08-.38.07-.39.06h-2.31l-.42-.07-.43-.08h-.22l-.35-.1-.35-.1-.35-.12-.23-.08-.44-.17-.41-.18-.25-.14-.23-.14-.33-.19-.52-.33-.75-.53-.5-.4-.36-.32-.37-.35-.33-.37-.3-.38-.3-.4-.25-.42-.25-.43-.2-.45-.19-.45-.16-.48-.14-.47-.1-.48-.06-.5v-1.99l.08-.48.1-.49.13-.48.15-.47.19-.45.21-.45.25-.43.27-.42.28-.4.32-.38.33-.37.35-.33.37-.33.18-.14v-.28l-.08-1-.12-1.09-.13-1.11-.15-1.15-.35-2.39-.37-2.38-.4-2.32-.37-2.21-.66-3.82-.5-3.12-.45-3.11-.42-3.12-.37-3.12-.33-3.11-.28-3.1-.27-3.1-.22-3.07-.2-3.07-.16-3-.14-3-.1-3-.08-2.95v-9.12l.05-.48.06-.5.1-.49.14-.46.15-.47.18-.47.22-.45.15-.38.27-.42.28-.4.32-.38.33-.37.35-.35.37-.31.4-.3.4-.29.43-.25.43-.23.45-.2.47-.17.47-.15.48-.11.48-.09.49-.06h1zm20.5-5.27h.65l.48.07.48.08.47.12h.13l.4.12.42.15.4.15.12.07.35.16.33.17.32.18.13.09.4.26.38.29.14.1.3.26.3.27.38.37.53.6.52.65.63 1 .54 1 .45 1 .4 1 .35 1 .31 1 .32 1 .28 1 .29 1.1.28 1.14.27 1.18.26 1.25.5 2.53.5 2.7.49 2.85.46 3 .45 3 .45 3.14.44 3.18.41 3.23.42 3.24.38 3.25.75 6.35.69 6.06.61 5.6.55 4.94.49 4.11.2 1.64.18 1.35.15 1 .13.72.07.48.05.49v1.45l-.07.48-.1.48-.12.47-.15.45-.18.45-.2.45-.23.43-.25.4-.27.4-.3.39-.32.36-.35.35-.35.32-.38.3-.4.28-.42.27-.41.23-.44.2-.45.19-.46.15-.47.13-.47.1-.48.07h-1.96l-.5-.09-.48-.1-.47-.12-.45-.15-.45-.18-.45-.2-.43-.24-.4-.25-.4-.26-.38-.3-.37-.32-.35-.35-.32-.35-.3-.38-.28-.4-.27-.42-.23-.42-.2-.43-.18-.45-.15-.47-.14-.46-.1-.47-.18-1-.2-1.35-.2-1.55-.23-1.8-.49-4.2-.56-5-.62-5.6-.68-6-.74-6.29-.38-3.16-.4-3.17-.4-3.15-.42-3.1-.43-3-.43-2.91-.45-2.79-.45-2.65-.45-2.46-.45-2.29-.24-1-.21-1-.22-.91-.22-.84-.2-.73-.2-.67-.18-.53-.35-.33-.33-.35-.32-.39-.28-.38-.27-.4-.23-.43-.22-.44-.2-.43-.17-.47-.13-.46-.12-.47-.08-.48-.05-.47v-1.47l.07-.46.08-.49.1-.46.15-.47.17-.47.18-.43.22-.43.25-.42.26-.42.29-.38.31-.37.34-.35.35-.33.38-.32.38-.28.4-.27.44-.25.43-.21.43-.19.47-.16.45-.14.48-.11.47-.09.48-.05h.49zm-1.58 16.58.6.05-.49-.06-.38-.07z"/><path d="m459.68 356.52 1.74.05 1.71.08 1.72.13 1.68.15 1.67.2 1.65.25 1.63.29 1.6.33 1.6.38 1.54.44.81.25.77.26.77.27.75.28.76.3.75.32.74.35.63.3.35.18.35.2.15.09.52.35.5.38.13.12.38.33.35.37.14.13.28.32.25.31.33.44.45.7.39.66.3.64.28.65.38 1.05.34 1.1.26 1.06.25 1.1.2 1.1.19 1.12.16 1.13.17 1.17.13 1.17.14 1.21.2 2.37.23 2.4.13 2.31.12 2.19.08 2 .05 1.8v5.73l.06.87.17 2 .23 2.22.3 2.42.34 2.6.38 2.78.42 2.9.88 6.22.95 6.55.47 3.4.45 3.41.43 3.47.4 3.48.37 3.47.33 3.45.13 1.75.14 1.7.11 1.72.1 1.7.07 1.68.07 1.67.05 1.65v4.85l-.05 1.58-.07 1.57-.1 1.53-.13 1.52-.17 1.5-.2 1.48-.25 1.45-.26 1.43-.34 1.42-.36 1.38-.44 1.39-.46 1.28-.3.72-.29.66-.31.65-.32.65-.35.65-.38.64-.4.63-.44.62-.45.61-.48.6-.5.59-.53.55-.55.51-.55.5-.57.47-.57.45-.58.42-.58.4-.62.38-.6.37-.62.33-.66.37-1.22.58-1.28.55-1.32.52-1.33.46-1.37.42-1.38.38-1.42.35-1.43.32-1.47.3-1.48.27-1.5.23-1.54.22-1.55.18-1.56.17-1.59.15-1.6.13-1.61.12-1.65.1-1.65.08-1.65.07-1.69.05h-10.18l-3.42-.06-3.38-.12-3.37-.13-3.31-.15-3.27-.19-3.2-.18-6.08-.38-5.62-.37-5-.3-2.22-.13-2-.09-1.76-.05h-13.6l-1.62.07-1.62.08-1.6.1-1.56.13-1.59.15-1.55.2-1.56.22-1.55.25-1.62.3-9.68 1.9-.7.12-.7.05h-.72l-.7-.08-.68-.12-.6-.16-.66-.25-.64-.3-.61-.35-.59-.42-.53-.45-.27-.25-.21.35-.42.57-.47.53-.51.49-.55.45-.59.4-.61.33-.65.3-.67.23-.68.19-.69.11-.71.05h-1.34l-.6-.09-.37-.05-.36-.08-.59-.13-.91-.29-.87-.35-.8-.41-.75-.47-.68-.48-.62-.52-.55-.53-.5-.58-.45-.53-.42-.53-.43-.62-.58-1-.55-1.05-.47-1-.38-1-.34-1-.3-1-.25-1-.23-1-.18-1-.17-1-.15-1-.12-1-.1-1-.06-1-.07-.95v-5.3l.06-.81.09-.8.1-.8.11-.65.22-1.2.17-1.07.15-1.12.13-1.13.1-1.18.07-1.2.06-1.24v-6.52l-.07-1.37-.08-1.4-.1-1.43-.1-1.42-.27-2.95-.31-3-.35-3-.39-3.09-.81-6.3-.82-6.36-.4-3.22-.38-3.22-.34-3.21-.28-3.2-.12-1.64-.11-1.6-.09-1.6-.08-1.6v-6.33l.05-1.58.06-1.57.09-1.57.13-1.55.17-1.55.18-1.53.23-1.53.29-1.52.3-1.52.36-1.5.4-1.5.45-1.48.5-1.45.57-1.45.6-1.43.73-1.55.3-.52.22-.37.25-.35.17-.25.23-.3.25-.3.43-.5.7-.68.7-.6.7-.52.69-.45.7-.4.68-.36.67-.32.66-.28.67-.27.67-.25.71-.23 1.3-.39 1.37-.33 1.37-.3 1.4-.27 1.41-.23 1.44-.2 1.43-.17 1.45-.16 1.45-.14 1.45-.11 1.45-.1 1.42-.09 1.43-.06 2.72-.1 2.56-.07h8.59l1.11-.05 1.17-.05 1.22-.08 1.26-.1 1.3-.12 1.37-.15 1.4-.17 1.43-.18 1.45-.18 3.07-.45 3.18-.52 3.29-.55 3.38-.6 3.47-.62 7.16-1.31 3.65-.67 3.7-.67 3.74-.65 3.73-.63 3.77-.58 3.73-.55 1.88-.27 1.87-.25 1.87-.22 1.86-.21 1.85-.2 1.85-.17 1.84-.17 1.81-.13 1.82-.12 1.8-.08 1.8-.07h3.53zm-3.3 16.65h-1.51l-1.55.05-1.59.08-1.61.1-1.64.12-1.65.15-1.68.15-1.7.18-1.72.2-1.73.22-1.75.22-1.75.25-3.57.51-3.6.57-3.61.62-3.64.63-3.63.65-3.62.65-7.16 1.32-3.54.65-3.48.6-3.42.58-3.35.53-3.26.49-1.62.21-1.6.2-1.57.19-1.53.16-1.52.14-1.5.13-1.48.08-1.45.09h-10.05l-2.37.05-2.5.1-1.25.06-1.28.07-1.27.08-1.25.12-1.23.1-1.2.13-1.15.15-1.12.15-1 .17-1 .18-.89.2-.76.19-.72.21h-.17l-.08.22-.35.88-.3.92-.3.95-.27 1-.23 1-.22 1.05-.2 1.08-.16 1.12-.15 1.15-.12 1.17-.1 1.21-.08 1.24-.05 1.26v6.69l.07 1.41.08 1.42.1 1.43.12 1.45.26 3 .32 3 .35 3.06.38 3.09.82 6.31.82 6.35.4 3.2.36 3.2.34 3.2.28 3.19.13 1.6.1 1.58.1 1.58.07 1.59.05 1.58v4.68l-.05 1.55-.06 1.55-.1 1.54-.14 1.53-.16 1.52-.2 1.51-.24 1.5-.25 1.35v5.17l.05.65.07.65.08.65.09.62.1.6.11.58.12.53.12.49.1.33h.06l.62.35.58.4.55.45.37.33.3-.47.42-.55.48-.53.52-.48.56-.44.59-.38.63-.33.65-.29.67-.21.68-.17 9.7-1.71 1.88-.35 1.94-.31 1.91-.27 1.89-.23 1.88-.19 1.87-.15 1.85-.11 1.83-.1 1.83-.07 1.82-.05h12.68l2 .06 2.2.1 2.35.12 5.1.32 5.61.36 6 .39 3.1.18 3.18.17 3.2.15 3.25.13 3.23.1 3.24.07h9.56l1.53-.05 1.5-.05 1.48-.08 1.45-.09 1.44-.1 1.4-.11 1.36-.12 1.34-.15 1.28-.17 1.25-.16 1.22-.2 1.15-.2 1.1-.22 1.06-.23 1-.25.93-.27.88-.27.8-.28.73-.32.67-.28.61-.32.22-.1.23-.13.27-.17.18-.14.18-.11.15-.12.14-.1.11-.1.1-.08.07-.07.05-.05.05-.07.07-.06.06-.1.09-.12.08-.13.1-.15.1-.19.1-.2.1-.23.12-.25.08-.22.23-.66.22-.69.22-.76.18-.85.18-.9.17-1 .13-1.05.12-1.1.12-1.16.06-1.22.07-1.25v-6.92l-.07-1.48-.07-1.52-.08-1.53-.12-1.57-.11-1.58-.14-1.58-.3-3.27-.35-3.28-.38-3.32-.42-3.33-.43-3.34-.47-3.3-.91-6.5-.9-6.21-.44-3-.38-2.87-.37-2.75-.31-2.61-.25-2.49-.2-2.31-.09-1.14-.05-1.1v-5.07l-.05-1.67-.07-1.86-.1-2-.13-2.12-.15-2.11-.2-2.12-.1-1-.12-.95-.12-.92-.13-.85-.12-.78-.06-.3-.44-.12-.45-.15-1-.28-1.05-.25-1.1-.24-1.15-.2-1.18-.16-1.25-.15-1.3-.14-1.33-.08-1.39-.08h-4.35zm-108.21 111.18h-.24z"/><path d="m422.05 401.57 1.3.05 1.22.11.71.09.67.11.68.14.74.18.76.25.84.32.51.26.39.2.38.22.18.12.3.18.29.2.26.22.17.13.25.22.25.21.25.25.22.25.13.14.25.3.25.31.23.34.2.33.1.15.19.32.16.33.07.17.88.26 1.14.39 1.08.43 1.08.45 1 .48 1 .52 1 .55.95.6.91.62.89.65.85.7.81.71.79.75.73.79.68.8.67.85.6.85.57.88.53.9.47.92.43 1 .4.93.33 1 .3 1 .25 1 .22 1 .18 1 .14 1 .08 1 .07 1v1.93l-.05 1-.09 1-.11.95-.15 1-.17.95-.2.93-.23.93-.25.94-.29.9-.3.91-.33.9-.35.9-.38.89-.4.88-.42.87-.43.85-.47.85-.48.85-.5.83-.54.82-.53.81-.57.8-.58.8-.6.79-.62.76-.63.77-.65.73-.67.74-.7.73-.7.7-.71.7-.75.68-.75.67-.77.65-.78.65-.8.62-.82.6-.83.58-.85.58-.87.55-.88.54-.89.51-.91.49-.92.48-.95.45-.95.42-.95.41-1 .39-1 .35-1 .33-1 .3-1 .28-1 .25-1.05.22-1.06.18-1.07.17-1.08.13-1.1.09-1.09.06h-3.35l-1.11-.08-1.14-.12-1.13-.15-1.13-.2-1.14-.23-1.13-.27-1.13-.32-1.14-.36-1.11-.39-1.12-.45-1.12-.46-1.11-.54-1.1-.55-1.1-.6-1.09-.65-1.06-.68-1.07-.72-1.07-.76-1-.8-1-.85-1-.89-1-.93-1-1-.7-.73-.68-.83-.62-.85-.57-.89-.51-.9-.44-.91-.4-.92-.33-.93-.28-.94-.25-.91-.2-.94-.15-.93-.12-.92-.08-.91-.05-.9v-2.69l.05-.88.08-.87.12-.88.12-.87.15-.85.15-.86.18-.85.18-.84.22-.83.23-.88.47-1.62.53-1.62.57-1.6.62-1.56.65-1.55.66-1.5.7-1.47.7-1.42.74-1.38.75-1.33.75-1.27.75-1.22.76-1.16.77-1.12.78-1.05.79-1 .81-.93.85-.9.64-.62.66-.55.65-.5.67-.47.67-.41.66-.4.69-.37.68-.35.68-.32.72-.33 1.35-.53 1.42-.52 1.43-.45 1.45-.43 1.45-.37 1.47-.35 1.48-.3 1.47-.27 1.45-.21 1.45-.2 1.41-.15 1.4-.14 1.37-.08h1.33zm-10.18 17.91-1 .27-1 .28-.9.3-.85.3-.78.32-.29.13-.28.14-.27.13-.21.12-.19.11-.13.09-.1.06-.21.24-.34.38-.4.52-.46.63-.52.73-.52.8-.55.89-.56.95-.55 1-.57 1.05-.55 1.1-.53 1.11-.5 1.15-.49 1.17-.46 1.17-.42 1.16-.38 1.15-.34 1.19-.15.51-.13.55-.12.55-.11.54-.1.51-.09.5-.06.49-.05.48-.05.45v2.23l.05.29v.26l.05.22.05.18.05.17v.13l.05.12.07.15.08.12.08.08.62.6.67.6.65.58.65.54.66.5.64.46.65.44.63.41.63.37.62.35.63.32.6.28.62.27.62.23.6.2.58.2.6.17.6.13.58.13.59.1.58.09.58.05.59.05h2.31l.59-.05.58-.07.58-.1.57-.1.58-.11.59-.14.56-.16.59-.17.56-.18.59-.22.56-.22.57-.25.57-.25.56-.26.55-.29.55-.3.55-.31.55-.34.54-.35.53-.35.53-.36.52-.4.52-.39.5-.41.48-.42.5-.43.47-.44.46-.45.45-.45.45-.46.44-.47.41-.48.4-.5.4-.49.39-.5.36-.5.35-.5.34-.51.33-.5.3-.52.3-.52.28-.5.25-.51.25-.5.24-.52.21-.5.19-.5.18-.48.17-.49.15-.48.13-.47.1-.46.1-.45.08-.45.07-.42.05-.42v-2.25l-.05-.31-.05-.32-.07-.3-.06-.28-.1-.29-.09-.26-.11-.25-.1-.25-.14-.24-.13-.23-.15-.23-.17-.24-.09-.2-.18-.23-.22-.22-.25-.23-.25-.24-.28-.23-.32-.23-.35-.24-.37-.23-.41-.23-.45-.22-.47-.23-.53-.22-.55-.22-.6-.2-.64-.2-.68-.18-.73-.18-.77-.15-.8-.15-.85-.14-.9-.11-1-.09-1-.08-1-.05h-3.15l-.41-.07-.42-.08-.42-.1-.41-.12-.4-.15-.4-.16-.39-.19-.38-.21-.37-.22-.35-.25-.33-.25-.33-.28-.32-.3-.28-.3-.29-.34zm233.56-183.11 1 .18 1 .3.95.43.88.55.82.65.73.77.62.83.51.92.4 1 .29 1 .13 1v1.05l-.12 1-.25 1-.37 1-.48.94-.62.85-.7.76-.8.69-.86.56-1 .47-1 .33-1 .22-1 .07h-.56l-.7.07-.74.08-.78.14-.87.16-.91.22-1 .27-1 .3-1.06.35-1.12.38-1.15.43-1.18.49-1.24.51-1.25.55-1.28.59-1.32.61-1.33.67-1.35.7-1.38.72-1.4.75-1.42.78-1.43.82-1.45.83-1.47.85-1.47.88-1.46.9-3 1.87-3 1.92-3 2-3 2-3 2.07-3 2.08-2.95 2.09-2.91 2.1-2.85 2.08-2.8 2.05-2.72 2-5.2 3.9-4.81 3.7-4.3 3.27-3.78 2.88-2.62 1.95-2.62 2-2.63 1.92-2.65 1.91-2.65 1.92-2.67 1.9-2.68 1.88-2.68 1.89-2.7 1.86-2.7 1.85-2.72 1.85-2.73 1.85-2.74 1.84-2.75 1.81-5.51 3.57-5.55 3.58-5.57 3.55-5.62 3.5-5.63 3.49-5.67 3.43-5.7 3.42-5.7 3.38-5.73 3.33-5.7 3.32-5.77 3.28-5.78 3.27-5.8 3.22-5.8 3.2-5.85 3.11-5.81 3.14-5.84 3.11-5.83 3.09-5.83 3.05-5.84 3-5.83 3-5.82 3-5.83 3-5.8 2.93-5.77 2.89-.56.28-.59.32-1.45.8-1.68 1-1.92 1.15-2.11 1.28-2.29 1.4-5.05 3.17-11.4 7.18-6.06 3.8-3.1 1.92-3.09 1.92-3.08 1.88-3 1.83-3 1.8-2.95 1.72-2.9 1.65-2.8 1.57-2.7 1.46-1.33.7-1.3.65-1.27.64-1.23.6-1.22.56-1.18.54-1.15.5-1.13.46-1.12.44-1.1.38-1.08.35-1.12.3-1.13.25-1.19.2-1.18.1h-1.52l-.82-.09-.87-.15-.53-.13-.75-.23-.18-.07-1-.42-.9-.53-.83-.63-.74-.74-.65-.83-.53-.9-.42-1-.3-1-.16-1v-1l.1-1.05.22-1 .37-1 .46-.94.59-.86.7-.8.78-.69.85-.6.93-.46 1-.37 1-.23 1-.1h1.05l.5.08.43-.11.54-.19.65-.21.71-.29.82-.33.88-.38.94-.42 1-.47 1.05-.51 1.11-.55 1.15-.59 1.17-.61 2.52-1.37 2.63-1.47 2.73-1.56 2.85-1.65 2.9-1.74 3-1.78 3-1.85 3-1.87 3-1.88 6-3.78 11.41-7.19 5.12-3.2 2.37-1.46 2.21-1.35 2.07-1.24 1.9-1.1 1.72-.95.83-.45.75-.38 5.8-2.92 5.78-2.9 5.77-2.95 5.78-2.95 5.79-3 5.78-3 5.78-3 5.79-3.07 5.76-3.07 5.77-3.11 5.75-3.14 5.73-3.15 5.74-3.18 5.7-3.22 5.7-3.23 5.66-3.28 5.65-3.29 5.64-3.33 5.6-3.37 5.56-3.38 5.55-3.42 5.52-3.45 5.48-3.48 5.45-3.52 5.42-3.56 2.7-1.77 2.67-1.8 2.68-1.8 2.67-1.82 2.65-1.81 2.63-1.84 2.63-1.83 2.62-1.85 2.6-1.87 2.6-1.86 2.58-1.87 2.57-1.88 2.57-1.89 2.55-1.9 3.68-2.78 4.28-3.27 4.84-3.66 5.38-3.95 2.78-2.07 2.87-2.1 2.93-2.13 3-2.15 3-2.17 3.1-2.17 3.14-2.13 3.15-2.12 3.16-2.08 3.19-2 3.15-2 1.6-1 1.58-1 1.58-.94 1.59-.9 1.56-.88 1.57-.87 1.55-.83 1.55-.82 1.53-.78 1.54-.75 1.51-.73 1.52-.69 1.5-.66 1.48-.64 1.49-.58 1.48-.55 1.45-.52 1.45-.48 1.45-.43 1.45-.39 1.43-.33 1.44-.28 1.41-.24 1.44-.18 1.38-.1h1.38zm-339.21 199.33-.19-.07-.36-.08z"/><path d="m580.5 154 .88.14.82.18.77.23.7.25.66.29.62.3.58.31.6.35 1 .62.95.7.9.73.85.74.82.75.78.78.77.78.73.8.72.8.71.82.7.82 1.3 1.56 1.22 1.54 1.13 1.43 1 1.27.85 1.05.69.8.16.2.2.21 1 1 1.2 1.27 1.35 1.46 1.47 1.62 1.61 1.8 1.74 2 1.83 2.08 1.92 2.24 2 2.33 2.07 2.43 2.13 2.54 2.17 2.61 2.2 2.67 2.22 2.72 2.21 2.75 2.2 2.76 2.19 2.79 2.15 2.78 2.03 2.7 2 2.72 1.95 2.68 1.89 2.63 1.75 2.55.85 1.25.81 1.24.79 1.21.76 1.19.72 1.16.68 1.15.65 1.14.62 1.1.58 1.08.54 1.07.51 1.06.45 1.05.44 1.05.38 1.07.33 1.12.29 1.18.18 1.18.07.77v1.57l-.18 1.08-.32 1-.45 1-.56.92-.7.85-.8.73-.89.64-1 .51-1 .39-1.07.25-1.08.1h-1.08l-1.09-.18-1-.32-1-.45-.92-.58-.85-.68-.73-.8-.63-.89-.52-1-.38-1-.25-1.07-.09-.83v-.07l-.08-.23-.13-.37-.19-.48-.25-.57-.31-.66-.37-.72-.43-.8-.47-.85-.53-.9-.57-.95-.6-1-.67-1-.68-1.07-.73-1.1-.77-1.13-1.63-2.37-1.75-2.45-1.85-2.53-1.94-2.64-2-2.64-2.06-2.68-2.14-2.68-2.13-2.69-2.15-2.68-2.15-2.63-2.15-2.6-2.12-2.55-2.1-2.45-2-2.4-2-2.27-1.87-2.17-1.76-2-1.67-1.87-1.48-1.69-1.4-1.53-1.24-1.32-1.05-1.15-.93-1-.45-.49-.53-.6-1-1.13-1-1.25-1-1.32-1.1-1.38-1.12-1.38-1.15-1.39-.55-.65-.55-.63-.55-.62-.53-.56-.5-.54-.49-.46-.18-.17-3.85 1.93-6.8 3.49-6.78 3.51-6.77 3.64-6.7 3.6-6.75 3.65-6.73 3.68-6.72 3.72-6.8 3.77-6.7 3.78-6.65 3.8-6.7 3.85-6.68 3.89-6.67 3.91-6.67 3.95-6.66 4-6.67 4-6.65 4-6.67 4.05-6.65 4-6.63 4.12-6.65 4.1-13.35 8.21-13.31 8.29-13.32 8.31-26.72 16.7-1.45.9-1.5.9-1.5.9-1.53.89-1.55.88-1.57.88-3.15 1.72-3.21 1.72-3.19 1.68-3.3 1.67-3.34 1.66-3.36 1.67-3.39 1.65-6.8 3.28-6.8 3.3-3.38 1.67-3.37 1.67-3.35 1.66-3.3 1.7-3.28 1.72-3.22 1.72-3.21 1.78-1.55.88-1.55.88-1.52.9-1.51.9-1.49.9-1.48.9-1.45.92-1.43.93-1.4.94-1.39.93-1.36.93-1.34.95-1.31 1-1.29 1-1.25 1-1.23 1-1.2 1-1.17 1-1.13 1-1.1 1-1.08 1-.14.13v1.37l.06.7.12.78.13.87.19.93.2 1 .25 1 .28 1.1.3 1.15.35 1.18.37 1.24.4 1.26.41 1.3.45 1.34.49 1.35.48 1.38.52 1.4 1.08 2.87 1.15 2.93 1.22 3 1.23 3 1.27 3 1.3 3 1.32 2.76 2.57 5.74 2.45 5.4 2.23 4.95 1 2.28.93 2.12.85 2 .75 1.8.63 1.64.3.8.2.58.19.5.21.48.29.64.38.71.43.82.5.87.54.93.58.95 1.28 2 1.34 2.07 2.7 4.07 1.25 1.91 1.13 1.79.53.86.49.85.46.87.47 1 .28.71.25.72.05.18.19.75v.15l.1.64v1.7l-.13.95v.1l-.25.95-.35.91-.45.87v.07l-.53.78-.62.72-.7.63-.75.55-.06.05-1 .55-1.05.4-1.1.27h-.09l-1.13.12-1.13-.05h-.12l-.7-.1-.7-.16h-.15l-.88-.3-.47-.2-.72-.35-.65-.38-.78-.5-.87-.65-.78-.77-.67-.86-.56-.94-.42-1-.3-1-.15-1.08v-1.13l-.83-1.29-2.72-4.11-1.45-2.22-1.4-2.23-.71-1.17-.67-1.13-.63-1.14-.62-1.13-.58-1.13-.55-1.15-.5-1.17-.39-1-.2-.57-.16-.5-.52-1.3-.65-1.55-.78-1.81-.89-2-1-2.2-2.22-5.13-2.45-5.43-2.6-5.82-1.34-3-1.31-3.07-1.32-3.1-1.3-3.1-1.27-3.12-1.21-3.1-1.12-3.09-.57-1.54-.53-1.51-.53-1.5-.5-1.49-.49-1.46-.45-1.45-.43-1.44-.4-1.41-.38-1.4-.35-1.39-.32-1.36-.28-1.34-.25-1.33-.22-1.3-.17-1.3-.13-1.3-.08-1.28v-2.52l.05-.72.09-.66.08-.69.12-.66.16-.69.19-.7.21-.71.27-.72.32-.72.36-.73.44-.72.5-.71.55-.7.53-.59 1.37-1.33 1.3-1.22 1.31-1.21 1.35-1.19 1.39-1.16 1.4-1.15 1.41-1.14 1.45-1.11 1.47-1.12 1.48-1.08 1.5-1.07 1.54-1.05 1.53-1.05 1.57-1 1.56-1 1.59-1 1.6-1 1.61-1 1.64-1 1.65-.95 1.65-.95 1.66-.95 3.35-1.84 3.39-1.81 3.4-1.79 3.43-1.75 3.43-1.73 3.45-1.72 3.45-1.68 6.84-3.32 6.78-3.28 3.33-1.62 3.3-1.63 3.24-1.62 3.18-1.61 3.13-1.62 3-1.62 3-1.63 1.43-.82 1.43-.81 1.42-.82 1.38-.82 1.37-.81 1.35-.84 26.67-16.68 13.35-8.33 13.33-8.3 13.33-8.24 6.69-4.11 6.68-4.09 6.68-4.08 6.69-4.05 6.7-4 6.7-4 6.7-4 6.71-4 6.74-4 6.73-3.91 6.75-3.89 6.75-3.86 6.77-3.84 6.78-3.78 6.78-3.77 6.82-3.71 6.82-3.7 6.83-3.65 6.85-3.6 6.87-3.57 6.88-3.53 7.08-3.57.42-.18.83-.32.24-.07.81-.21.25-.05.82-.12h1.65z"/><path d="m596.1 112.83h1.17l1.15.06 1.16.1 1.15.12 1.14.15 1.13.18 1.13.2 1.12.22 1.12.25 1.11.28 1.1.29 1.1.31 1.09.35 1.06.37 1.09.38 1.05.4 1.03.51 1 .45 1 .46 1 .49 1 .5 1 .51 1 .55 1 .55 1 .59 1 .58 1 .6 1 .63 1 .64 1 .65.93.66.94.69.91.7.92.71.92.72.9.73.88.75.88.77.89.78.86.79.89.81 1.66 1.6 1.67 1.69 1.63 1.7 1.6 1.75 1.59 1.8 1.53 1.81 1.52 1.85 1.46 1.89 1.45 1.9 1.42 1.93 1.38 2 1.35 2 1.32 2 1.28 2 1.25 2 1.22 2.05 1.18 2.05 1.15 2 1.12 2.06 1.08 2.09 1.05 2.06 1 2.09 1 2.06.93 2.07.9 2.07.87 2.05.83 2 .8 2 .75 2 .72 2 .66 2 .64 2 .6 2 .55 1.93.51 1.92.47 1.88.43 1.87.35 1.68v.15l.17.57.27.78.36 1 .45 1.17.54 1.33 1.23 3.07 1.38 3.43 1.47 3.74.77 2 .75 2 .75 2 .71 2.05.7 2.06.67 2.07.62 2.07.56 2 .27 1 .25 1 .23 1 .22 1 .18 1 .19 1 .15 1 .11 1 .1 1 .07 1v2l-.05 1-.06 1.35-.17 1.08-.25 1.1-.33 1.14-.32.8-.13.35-.17.35-.36.73-.4.67-.39.56-.43.59-.47.55-.51.51-.54.52-.6.48-.61.44-.65.4-.62.33-.82.38-.78.34-.78.3-.8.26-.79.22-.78.18-.8.17-.78.12-.77.1-.77.06-.76.05h-2.22l-.73-.05-.75-.06-1.35-.17-1.35-.22-1.32-.28-1.28-.3-1.25-.33-1.22-.37-1.18-.38-1.17-.39-2.18-.78-2.09-.77-2-.73-.9-.32-.87-.3-.83-.26-.77-.22-.71-.2-.64-.15-.58-.12-.55-.06h-1.45l-.65-.1-.65-.13-.62-.18-.61-.25-.59-.29-.56-.31-.54-.39-.51-.41-.47-.45-.43-.49-.4-.51-.35-.55-.32-.59-.27-.6-.21-.61-.17-.64-.12-.63-.06-.65v-.67l.05-.65.08-.65.14-.63.18-.63.25-.6.28-.6.32-.57.38-.53.42-.5.45-.49.48-.43.52-.4.55-.35.58-.3.6-.27.62-.21.63-.17.64-.12.66-.06h1.9l.69.05.71.08 1.24.19 1.25.23 1.21.28 1.19.32 1.16.35 1.12.37 1.12.36 1.08.39 2.1.67 2 .75 2 .7.9.3.88.29.87.26.83.22.78.18.74.15.68.12.68.08h1.02v-.48l-.07-.57-.1-.61-.12-.67-.13-.68-.15-.74-.17-.76-.2-.77-.2-.8-.46-1.7-.54-1.75-.58-1.8-.62-1.83-.65-1.87-.68-1.87-.7-1.86-.72-1.84-1.43-3.61-1.37-3.4-1.25-3.12-.56-1.45-.54-1.35-.46-1.27-.42-1.21-.35-1.12-.17-.68-.13-.54-.35-1.65-.35-1.55-.4-1.6-.51-1.6-.49-1.67-.51-1.7-.55-1.73-.6-1.75-.64-1.78-.66-1.79-.72-1.81-.73-1.84-.79-1.85-.8-1.85-.85-1.85-.88-1.86-.9-1.87-.95-1.88-1-1.85-1-1.87-1-1.85-1.06-1.85-1.09-1.83-1.11-1.82-1.15-1.8-1.19-1.78-1.2-1.75-1.21-1.74-1.25-1.71-1.29-1.67-1.28-1.65-1.32-1.62-1.33-1.58-1.37-1.55-1.36-1.5-1.4-1.45-1.4-1.42-1.45-1.38-.7-.65-.72-.65-.72-.65-.73-.62-.73-.61-.74-.6-.73-.59-.73-.58-.75-.55-.74-.55-.75-.53-.75-.5-.75-.5-.75-.49-.75-.48-.75-.45-.75-.43-.75-.42-.76-.42-.75-.38-.77-.37-.75-.36-.75-.34-.77-.33-.75-.3-.76-.28-.75-.29-.77-.25-.75-.23-.77-.23-.75-.2-.76-.19-.75-.16-.77-.15-.77-.14-.75-.11-.76-.1-.77-.09-.75-.06h-4.62l-.76.06-.79.1-.78.1-.78.12-.8.15-.79.17-.78.2-.32.06-.26.09-.25.08-.25.1-.2.08-.2.09-.19.08-.16.08-.15.1-.14.09-.13.08-.12.08-.1.09-.1.08-.1.08-.08.09-.08.08-.09.1-.06.1-.09.08-.06.12-.09.12-.06.11-.09.14-.06.13-.07.15-.07.15-.05.12-.15.43-.13.42-.1.46-.1.5-.08.57-.07.6v3.55l.07.8.08.83.1.85.13.87.14.87.16.9.19.9.18.91.2.89.47 1.86.48 1.85.5 1.82.53 1.8.52 1.75 1 3.35.46 1.58.44 1.54.36 1.45.17.78.15.75.13.78.1.85v2.84l-.08.58-.13.6-.07.25-.18.58-.24.57v.12l-.22.43-.23.43v.1l-.32.5-.35.49-.06.06-.44.5-.45.47-.08.07-.5.41-.52.39-.56.35-.59.28-.6.25-.61.22-.65.15-.64.1-.66.05h-.65l-.65-.05-.65-.12-.64-.15-.69-.2-.6-.25-.59-.3-.56-.33-.54-.4-.48-.42-.47-.47-.43-.5-.38-.51-.34-.57-.3-.58-.31-.67-.2-.64-.15-.63-.1-.65-.05-.65v-.65l.05-.65.1-.65v-.1l-.27-1-.33-1.22-.42-1.41-1-3.3-.55-1.84-.57-1.95-.56-2-.57-2.12-.52-2.16-.26-1.14-.24-1.13-.21-1.13-.22-1.15-.18-1.17-.19-1.18-.15-1.19-.11-1.2-.1-1.2-.07-1.2v-3.68l.08-1.25.14-1.23.18-1.27.25-1.25.3-1.27.38-1.26.42-1.2.28-.67.29-.63.28-.62.32-.62.35-.6.36-.6.39-.6.41-.58.44-.58.46-.55.49-.55.5-.54.53-.51.55-.5.57-.49.58-.46.62-.45.63-.42.63-.4.67-.37.68-.36.69-.34.71-.31.72-.29.73-.26.74-.25.75-.22.76-.2 1.2-.28 1.19-.27 1.2-.22 1.18-.18 1.18-.17 1.19-.13 1.18-.1 1.18-.07h3.52zm-21.3 51.55-.22.29.17-.2.45-.45z"/><path d="m674.83 51.18.54.07.53.08.52.14.51.16.5.19.49.21.46.27.45.28.44.3.41.35.39.37.36.38.35.42.3.43.3.45.25.47.22.48.2.5.17.5.11.52.1.53.07.54v1.63l-.05.37-.06.53-.2.87-.25.8-.3.75-.2.43-.2.35-.2.37-.22.33-.23.38-.27.37-.27.35-.23.28-.25.29-.52.56-.78.72-.75.62-.75.56-.75.5-.73.45-.72.44-.73.4-.75.38-1.37.68-1.38.62-1.32.57-2.32 1-.93.4-.7.3-.38.2-1.69 1.05-1.83 1.18-3.63 2.33-3.69 2.3-3.7 2.25-3.68 2.25-3.7 2.22-7.37 4.42-3.63 2.21-3.62 2.22-3.55 2.25-1.77 1.12-1.76 1.13-1.74 1.14-1.73 1.15-1.72 1.15-1.7 1.16-1.68 1.15-1.65 1.18-1.65 1.19-1.6 1.2-1.37 1.05-2.33 1.83-1.38 1.1-1.52 1.22-1.5 1.25-1.5 1.28-1.41 1.25-1.32 1.22-.55.53-.52.5-.43.47-.14.5-.18.5-.22.5-.25.47-.28.47-.3.43-.33.42-.35.4-.39.36-.41.35-.42.32-.45.3-.47.25-.48.23-.5.2-.5.19-.52.13-.51.1-.54.07h-1.6l-.53-.07-.53-.1-.52-.13-.5-.17-.5-.2-.48-.23-.47-.25-.4-.31-.44-.32-.41-.35-.39-.37-.35-.4-.08-.08-.33-.42-.3-.43-.29-.45-.25-.47v-.11l-.2-.45-.18-.49-.15-.48-.12-.48v-.12l-.07-.42-.05-.4v-1.86l.05-.44v-.15l.1-.51.12-.5.05-.15.12-.39.13-.38.18-.47.39-.8.58-1 .67-.94.63-.81.67-.79.68-.73.72-.73.73-.74.78-.75 1.57-1.45 1.65-1.45 1.67-1.43 1.66-1.4 1.6-1.3 1.5-1.22 2.36-1.94 1.55-1.18 1.78-1.32 1.78-1.28 1.79-1.28 1.8-1.25 1.81-1.25 1.82-1.22 1.83-1.22 1.84-1.18 1.83-1.18 1.87-1.19 3.68-2.3 3.72-2.28 3.71-2.25 7.39-4.43 3.66-2.2 3.64-2.2 3.6-2.22 3.55-2.22 3.5-2.23 1.71-1.12 1.85-1.21.55-.35.67-.37 1.07-.5 1.1-.5 1.1-.46 2.25-.94 1.09-.46 1-.47 1-.48.38-.2.37-.2.26-.15v-.1l.23-.49.28-.45.29-.45.33-.41.35-.4.38-.39.4-.35.42-.33.45-.3.45-.27.48-.25.49-.2.51-.18.5-.13.54-.12.51-.08h1.6zm-81.3 67.14v-.17zm-1.15-2.14.3.44.2.33-.21-.47-.62-.71zm199.62 76.5.57.07.57.12.55.15.53.2.52.21.5.27.5.28.46.34.44.36.41.39.4.41.35.44.34.46.3.49.26.5.22.51.2.55.15.54.12.56.08.57v1.7l-.07.57-.11.55-.15.55-.14.53-.23.53-.25.5-.3.49-.33.46-.35.45-.39.42-.41.38-.45.37-.45.33-.5.3-.5.25-.52.24-.53.2-.55.15-.55.11-.57.09h-1.27l-.33.06-.43.12-.5.15-.59.2-.63.23-.7.29-.75.31-.78.35-.84.39-.86.43-.9.47-.94.48-1 .53-1 .55-1 .57-2.12 1.25-2.18 1.33-2.25 1.42-2.3 1.48-2.35 1.55-2.37 1.6-2.38 1.64-2.4 1.66-2.4 1.69-2.37 1.7-2.35 1.68-4.6 3.35-4.38 3.2-4.09 3-3.71 2.72-1.7 1.33-1.6 1.15-1.48 1-1.35.93-2.85 1.92-2.89 1.83-2.91 1.82-2.92 1.78-2.92 1.77-2.9 1.73-5.73 3.44-.57.31-.68.37-1.48.78-1.67.89-1.68.9-1.52.83-.52.3-.1.1-.41.4-.45.35-.47.33-.48.29-.52.26-.52.22-.53.2-.5.1-.55.12-.57.06h-1.71l-.55-.08-.62-.1-.55-.15-.53-.2-.52-.23-.5-.25-.48-.3-.47-.33-.45-.37-.4-.38-.4-.42-.35-.45-.3-.43-.26-.43-.25-.45-.22-.47-.18-.48-.15-.5-.14-.5-.1-.55-.06-.53v-1.1l.05-.54.08-.55.12-.53.15-.52v-.08l.2-.53.21-.5.27-.5.28-.47.32-.47.07-.08.26-.33.3-.38.3-.3.11-.11.35-.32.37-.28.58-.47.9-.6.85-.52.87-.5 1.78-1 1.84-1 1.68-.88 1.37-.72.41-.25.29-.15 5.61-3.35 2.87-1.71 2.85-1.72 2.82-1.73 2.78-1.74 2.72-1.73 2.65-1.73 1.15-.79 1.33-.93 1.5-1.07 1.63-1.16 3.65-2.67 4.09-3 4.41-3.22 4.65-3.4 2.42-1.71 2.45-1.75 2.45-1.74 2.48-1.73 2.5-1.7 2.49-1.68 2.48-1.64 2.45-1.58 2.43-1.53 2.4-1.47 2.34-1.37 1.16-.68 1.15-.63 1.15-.62 1.12-.58 1.12-.54 1.1-.55 1.08-.52 1.08-.48 1.07-.45 1.07-.42 1.06-.4 1.05-.35 1.07-.33 1.08-.27 1.09-.25 1.13-.18 1.17-.12h1.45z"/><path d="m714 0 1.83.07 1.82.12 1.8.16 1.8.2 1.78.25 1.77.29 1.76.31 1.74.37 1.73.4 1.72.45 1.71.47 1.69.51 1.68.55 1.67.59 1.65.63 1.63.65 1.63.68 1.6.72 1.6.75 1.59.78 1.56.82 1.55.85 1.54.87 1.53.9 1.5.93 1.5 1 1.48 1 1.47 1 1.45 1 1.45 1.06 1.43 1.07 1.4 1.12 1.42 1.11 1.38 1.15 1.39 1.17 1.37 1.2 1.38 1.2 1.33 1.23 1.33 1.25 1.3 1.29 1.3 1.28 1.3 1.3 1.27 1.33 1.27 1.34 1.25 1.35 1.23 1.38 1.22 1.38 1.21 1.4 1.2 1.42 1.2 1.43 1.17 1.44 1.17 1.46 1.16 1.47 1.09 1.47 1.13 1.5 1.13 1.5 1.1 1.51 1.1 1.52 1.09 1.53 1.08 1.54 1.07 1.55 1 1.55 1.05 1.58 2 3.13 2 3.17 2 3.2 1.92 3.2 1.88 3.22 1.83 3.23 1.8 3.22 1.87 3.23 1.7 3.23 1.68 3.22 1.64 3.22 1.58 3.2 1.55 3.13 1.5 3.15 1.47 3.14 1.43 3.1 1.38 3 1.35 3 1.3 3 1.27 2.93 1.22 2.88 1.2 2.84 1.13 2.76 1.1 2.72 1.07 2.63 2.6 6.45 1.41 3.6.74 1.9.73 1.94.73 2 .74 2 .73 2.06.7 2.09.7 2.13.68 2.15.65 2.18.62 2.2.58 2.22.54 2.25.5 2.25.45 2.23.2 1.15.2 1.14.16 1.15.17 1.13.15 1.13.12 1.15.11 1.14.09 1.15.06 1.13v5.72l.02 1.21-.1 1.13-.12 1.14-.15 1.13-.18 1.13-.2 1.12-.25 1.13-.28 1.1-.3 1.12-.37 1.15-.4 1.08-.47 1.09-.53 1.06-.6 1-.67 1-.73.93-.8.89-.85.8-.92.75-.95.67-1 .6-1 .52-1 .43-1 .37-1 .3-1 .21-1 .17-1 .12-1 .05h-2.95l-.92-.1-.91-.13-.9-.17-.89-.18-.88-.2-.87-.24-.85-.23-.85-.27-.81-.28-.84-.3-.8-.32-.83-.33-1.53-.67-1.54-.71-1.48-.77-1.43-.77-1.4-.8-1.32-.8-1.28-.8-1.2-.8-1.07-.73-.47.4-.66.47-.72.4-.75.31-.78.25-.8.19-.82.08h-.82l-.81-.07-.8-.15-.79-.23-.76-.3-.72-.37-.68-.45-.65-.5-.59-.58-.53-.62-.47-.67-.38-.71-.33-.75-.25-.79-.17-.8-.1-.81v-.82l.07-.82.15-.8.21-.78.3-.77.39-.71v-.19l-.07-.4-.08-.47-.1-.52-.13-.56-.17-.62-.18-.67-.22-.7-.23-.71-.25-.77-.29-.78-.3-.79-.66-1.71-.75-1.75-.8-1.82-.85-1.85-.9-1.87-1-1.86-1-1.89-1-1.85-1-1.81-1-1.79-1-1.73-1-1.65-.95-1.57-.93-1.46-.87-1.35-.83-1.24-.75-1.08-.67-.92-.55-.71-.43-.52-.08-.1-.14-.13-.66-.69-.75-.8-.72-.8-.7-.81-.68-.82-.67-.83-.65-.85-.63-.85-.64-.85-.6-.87-.58-.87-.58-.88-1.1-1.73-1.01-1.7-1-1.78-1-1.79-1-1.8-.92-1.78-.9-1.78-.86-1.79-1.7-3.5-1.67-3.45-.82-1.68-.83-1.65-.82-1.62-.83-1.56-.83-1.54-.85-1.5-.87-1.43-.88-1.42-.44-.65-.43-.66-.45-.65-.47-.64-.45-.61-.46-.6-.47-.59-.47-.56-.48-.55-.48-.54-.49-.51-.5-.52-1.71-1.68-1.75-1.69-1.8-1.65-1.85-1.65-1.87-1.61-1.92-1.62-2-1.6-2-1.58-2-1.57-2-1.55-2.06-1.53-2.1-1.52-2.12-1.48-2.13-1.49-2.17-1.46-2.18-1.44-2.2-1.43-2.22-1.4-2.22-1.38-2.25-1.39-2.25-1.33-2.25-1.33-2.26-1.32-2.27-1.28-2.27-1.29-2.28-1.25-2.2-1.28-2.26-1.2-2.27-1.2-2.27-1.17-2.25-1.15-2.35-1.18-1-.52-1-.65-1-.68-1-.72-.92-.78-.85-.8-.82-.85-.76-.87-.74-.9-.66-.91-.65-.95-.6-1-.55-1-.54-1-.48-1-.45-1-.42-1-.38-1-.35-1.07-.33-1.06-.29-1.09-.26-1.08-.24-1.1-.2-1.1-.16-1.1-.15-1.12-.12-1.1-.08-1.11-.07-1.14v-3.35l.05-1.11.08-1.12.1-1.12.13-1.11.15-1.1.19-1.12.21-1.1.25-1.08.27-1.09.3-1.06.33-1.09.37-1.05.4-1.05.43-1 .47-1 .52-1 .53-1 .58-1 .62-1 .65-.93.7-.9.75-.9.78-.85.84-.84.88-.78.89-.8 1-.72 1-.66 1.07-.6 1.1-.55 1.15-.5 1.1-.42 2-.65 1.95-.57 1.94-.53 1.93-.48 1.92-.44 1.91-.38 1.92-.33 1.9-.3 1.9-.24 1.88-.2 1.93-.15 1.88-.1 1.85-.08h1.85zm-3.35 16.65-1.45.05-1.49.09-1.46.11-1.5.15-1.5.2-1.52.24-1.52.26-1.55.3-1.55.35-1.56.4-1.57.42-1.6.48-1.53.49-.35.13-.27.12-.27.13-.26.15-.27.17-.25.2-.28.21-.27.24-.27.26-.26.3-.27.32-.27.35-.26.38-.27.4-.27.45-.25.45-.23.5-.25.5-.22.55-.21.55-.2.59-.19.6-.18.61-.15.64-.15.66-.13.67-.12.67-.1.68-.07.7-.06.7v4.35l.07.71.07.7.1.69.1.68.13.67.13.66.15.65.17.62.18.62.2.58.22.58.22.55.23.52.23.5.25.48.25.44.27.43.27.38.26.37.27.33.28.32.27.28.27.25.26.22.27.22.27.18.26.15.39.2 2.2 1.12 2.33 1.2 2.35 1.21 2.37 1.24 2.36 1.26 2.37 1.29 2.37 1.3 2.36 1.28 2.39 1.35 2.34 1.35 2.37 1.4 2.37 1.41 2.36 1.44 2.35 1.46 2.34 1.49 2.33 1.51 2.32 1.54 2.3 1.55 2.28 1.58 2.25 1.62 2.23 1.62 2.23 1.65 2.2 1.66 2.19 1.69 2.15 1.71 2.11 1.75 2.09 1.75 2.06 1.8 2 1.8 2 1.84 2 1.86 1.91 1.9.74.75.73.79.72.78.68.8.68.82.65.81.64.84.63.83.6.85.6.85.57.85.58.88 1.07 1.72 1 1.75 1 1.77 1 1.76.94 1.79.91 1.76.89 1.79.86 1.76 1.69 3.49 1.66 3.45.84 1.68.83 1.65.83 1.62.84 1.6.85 1.55.86 1.5.94 1.48.92 1.45.43.65.45.68.47.65.46.65.47.63.48.62.49.6.48.58.5.57.5.55.5.55.62.62.38.41.48.54.84 1 .88 1.15.9 1.23.93 1.35 1 1.45 1 1.57 1 1.65 1.07 1.73 1.06 1.82 1.1 1.9 1.1 1.93 1.09 2 1.08 2 1.08 2.07 1 2.08 1 2.09 1 2.1.93 2.08.87 2.08.8 2 .38 1 .37 1 .33 1 .34 1 .3 1v.1h.07l.77.25.75.33.71.4.67.49.62.53.36.33.37.34.5.41.62.49.71.53.79.58.86.59.94.61 1 .62 1 .62 1.05.6 1.08.58 1.05.57 1.06.52 1.12.48.5.2.52.2.5.19.5.16.48.15.48.15.45.12.44.1.41.08.39.07.36.05h1.62l.05-.08.07-.14.08-.2.12-.3.16-.53.17-.62.17-.63.13-.65.13-.65.1-.7.1-.7.07-.73.07-.74v-4.81l-.05-.85-.06-.87-.09-.87-.1-.9-.1-.88-.13-.92-.13-.91-.17-.92-.17-.92-.36-1.91-.44-1.9-.46-1.92-.5-1.93-.55-1.95-.59-2-.6-1.94-.63-1.93-.65-1.92-.68-1.91-.69-1.89-.6-1.75-.7-1.83-.68-1.8-1.39-3.5-2.58-6.4-1-2.6-1.15-2.65-1.11-2.7-1.15-2.75-1.19-2.8-1.23-2.85-1.27-2.9-1.3-2.92-1.35-3-1.36-3-1.42-3-1.45-3-1.5-3.06-1.53-3.07-1.57-3.08-1.57-3.09-1.63-3.08-1.69-3.1-1.68-3.1-1.75-3.07-1.79-3.05-1.83-3-1.85-3-1.9-3-1.93-3-1-1.46-1-1.45-1-1.45-1-1.44-1-1.43-1-1.42-1-1.4-1-1.4-1.05-1.36-1.07-1.37-1.05-1.35-1.18-1.37-1.08-1.32-1.09-1.31-1.1-1.29-1.1-1.28-1.11-1.25-1.12-1.25-1.13-1.22-1.14-1.21-1.15-1.19-1.15-1.16-1.15-1.15-1.16-1.14-1.19-1.1-1.18-1.1-1.18-1.06-1.2-1-1.2-1-1.2-1-1.22-1-1.23-1-1.22-.92-1.23-.92-1.25-.83-1.25-.87-1.25-.82-1.25-.81-1.27-.77-1.28-.73-1.27-.73-1.28-.7-1.3-.67-1.29-.63-1.3-.62-1.31-.65-1.32-.55-1.32-.54-1.31-.5-1.34-.41-1.33-.44-1.35-.41-1.35-.37-1.35-.35-1.37-.32-1.36-.28-1.37-.3-1.38-.21-1.38-.19-1.44-.13-1.4-.12-1.42-.1-1.43-.05h-1.43zm91.55 180.67-.13.16.21-.23zm-542.03 178.3.71.06.65.12.7.13 1.07.29 1.05.35 1 .4.9.4.85.43.82.43.8.45 1.4.84 1.28.81h.6l.55.05.53.07.53.12.54.13.51.18.5.2.49.25.48.27.45.32.43.33.4.35.39.4.36.4.32.43.3.47.28.47.24.48.21.52.17.51.13.52.1.4.09.43.06.44v2.35l-.06.46-.09.47-.11.45v.1l-.13.43-.17.42-.18.42-.2.4-.05.08-.22.38-.25.37-.25.35-.28.35-.3.32-.05.06-.32.32-.33.3-.35.27-.37.26-.38.24-.07.05-.45.25-.45.21-.46.19-.49.16h-.08l-.4.1-.42.1-.4.06-.41.05h-1.9l-.45-.06-.44-.09-.25-.05-.36-.1-.37-.1-.35-.11-.63-.24-.87-.4-.73-.38-.65-.37-.62-.38-1.12-.7-1.11-.72-1.07-.68-1-.62-.44-.25-.26-.13-.29.15-.75.43-1.58.92-1.58 1-1.6 1-1.64 1.08-1.63 1.15-1.63 1.18-1.67 1.22-1.67 1.27-1.68 1.31-1.7 1.34-1.7 1.36-1.7 1.39-3.47 2.86-3.48 2.9-3.5 3-3.55 2.95-3.55 2.92-1.8 1.45-1.8 1.43-1.82 1.42-1.93 1.39-1.84 1.37-1.83 1.33-1.85 1.3-1.88 1.29-.64.4-.68.41-1.37.8-1.5.84-1.6.88-1.65.92-1.68.95-1.67 1-1.65 1-.75.48-.75.47-.7.48-.65.45-.6.43-.53.42-.47.38-.38.35-.22.2-.13.49-.18.51-.22.5-.25.49-.28.46-.3.45-.35.44-.37.4-.38.38-.42.35-.43.32-.47.3-.47.26-.5.24-.5.2-.51.16-.54.14-.53.1-.55.06h-1.63l-.54-.09-.53-.11-.53-.15-.52-.19-.5-.21-.48-.25-.47-.29-.45-.3-.42-.33-.41-.37-.37-.4-.37-.41-.31-.44-.3-.45-.27-.48-.23-.5-.2-.5-.17-.52-.13-.53-.1-.53-.07-.55v-2.09l.08-.61.2-.9.27-.85.3-.79.33-.71.37-.67.36-.63.4-.57.44-.6.76-.93.84-.9.86-.82.87-.78.9-.74.9-.7.93-.68.94-.67 1-.63.95-.62 1-.61 1.9-1.14 1.9-1.1 1.82-1 1.71-.95 1.55-.87 1.34-.75 1.08-.63.37-.22.3-.18 1.6-1.1 1.65-1.15 1.65-1.2 1.66-1.24 1.67-1.28 1.68-1.32 1.7-1.35 1.7-1.36 3.45-2.84 3.47-2.88 3.5-2.93 3.53-3 3.55-2.92 1.79-1.46 1.8-1.44 1.8-1.43 1.81-1.4 1.82-1.38 1.83-1.35 1.85-1.34 1.85-1.28 1.87-1.25 1.87-1.22 1.9-1.16 1.88-1.1 1-.55.95-.52 1-.52 1.11-.56.42-.19.35-.15.37-.13.21-.07.31-.17.35-.1.55-.12.87-.15.85-.07h.78zm25.7 44.06h.86l.42.07.43.08.42.1.4.13h.1l.43.16.44.19.43.21.4.24.4.26.38.29.35.3.35.31.07.07.32.35.31.35.29.38.26.39.24.41.21.42.2.43.17.44v.1l.15.48.12.48.1.5.05.5v1.5l-.07.5-.08.5-.12.49-.15.48-.18.48-.2.45-.24.45-.26.44-.29.41-.3.4-.33.37-.35.37-.38.33-.4.3-.42.3-.42.25-.45.25-.46.2-.47.18-.48.15-.49.12h-.06l-.52.36-.72.54-.8.6-1.83 1.41-2 1.62-2.1 1.73-2.15 1.79-2.1 1.78-3.92 3.33-3.1 2.62-1.17 1-.56.45-.55.38-1.55 1.15-1.57 1-1.61 1-1.67 1-1.7 1-1.73 1-1.77 1-1.8 1-3.65 1.73-3.7 1.94-3.7 1.95-3.68 1.93-3.64 1.95-1.75 1-1.73 1-1.68 1-1.65 1-1.6.95-1.54 1-1.46.94-1.4.95-1.34.91-1.23.92-1.18.9-.52.43-.52.42-.48.43-.47.42-.43.4-.47.47-.36.33-.4.33-.4.29-.44.26-.43.25-.47.22-.46.18-.47.17-.5.12-.48.1-.5.08h-1.5l-.52-.05-.48-.09-.5-.1-.49-.15-.46-.16-.47-.2-.45-.22-.43-.25-.42-.28-.4-.3-.38-.34-.37-.35-.35-.36-.32-.4-.28-.4-.28-.44-.24-.43-.21-.45-.19-.47-.16-.48-.14-.48-.1-.5-.06-.5v-1.5l.05-.5.07-.5.11-.5.15-.49.17-.46.2-.47.22-.45.25-.43.28-.42.3-.4.33-.38.35-.37.59-.58.68-.64.7-.63.72-.62.73-.61.75-.62 1.5-1.17 1.58-1.15 1.62-1.13 1.67-1.12 1.71-1.1 1.75-1.08 1.8-1.25 1.8-1.06 1.83-1.05 1.85-1 1.88-1 3.75-2 3.77-2 3.73-2 3.65-1.92 3.55-1.86 1.7-.94 1.67-.9 1.62-.9 1.53-.88 1.48-.87 1.42-.85 1.33-.83 1.14-.75.16-.12.9-.75 3-2.51 3.91-3.34 2.17-1.83 2.16-1.84 2.21-1.82 2.17-1.75 2-1.58 1-.75.95-.7.91-.65.92-.6.92-.58.95-.52.68-.32.75-.3.5-.15.33-.1.34-.08.35-.07h.15l.4-.07h1.18z"/><path d="m148.25 408.62.6.08.6.12.6.16.17.07h1.71l.62.06.62.1.6.17.6.2.56.25.55.28.54.34.5.36.48.4.43.44.42.48.37.5.33.52.3.55.25.56.22.59v.1l1.75 1.25 3.44 2.5 3.16 2.3 2.54 1.83 1.63 1.18 1.67 1.25 1.7 1.32 1.69 1.42 1.7 1.42 1.68 1.45 1.67 1.5 1.63 1.53.82.82.82.8.8.81.78.84.78.83.77.85.75.87.73.88.74.88.71.9.7.92.67.93.67.94.65.95.61 1 .6 1 .67 1.11.65 1.15.65 1.19.65 1.21.65 1.27.65 1.3.65 1.33.63 1.37.64 1.4.63 1.42.62 1.46.61 1.49.6 1.5.59 1.53.58 1.57.57 1.58.55 1.6.51 1.62.52 1.65.5 1.65.47 1.66.45 1.7.43 1.7.4 1.7.37 1.74.35 1.71.33 1.74.28 1.75.25 1.75.24 1.75.18 1.76.15 1.75.1 1.77.08 1.75v3.52l-.06 1.75-.12 1.73-.2 1.65-.21 1.68-.15.9-.15.87-.15.85-.19.87-.2.83-.2.85-.23.85-.25.85-.27.82-.28.83-.3.83-.32.82-.33.82-.35.8-.38.8-.39.8-.41.8-.45.76-.45.77-.49.77-.5.75-.51.73-.55.73-.57.72-.58.7-.62.68-.62.67-.66.67-.67.63-.7.63-.72.62-.73.58-.75.59-.78.55-.8.53-.82.52-.83.5-.87.48-.87.45-.9.43-.9.42-.93.4-.95.38-1 .35-1 .34-1 .3-1 .3-1.09.28-.85.2-.91.15-.92.13-.92.1-.91.07-.94.05h-2.95l-1-.06-1-.1-1-.14-1-.16-1-.2-1-.22-1-.27-1-.3-1-.35-1-.38-1-.43-1-.49-1-.53-1-.6-.95-.67-.93-.73-.92-.8-.86-.9-.77-.92-.45-.58-.37-.55-.35-.57-.35-.6-.3-.6-.3-.63-.26-.63-.22-.64-.23-.73-.24-.75-.35-1.37-.3-1.38-.23-1.37-.2-1.35-.13-1.31-.12-1.3-.08-1.29v-13.23l-.07-.91-.1-.89-.1-.85-.13-.83-.15-.8-.18-.75-.22-.8-.1-.32-.12-.35-.13-.35-.13-.35-.15-.33-.15-.35-.17-.33-.17-.34-.18-.33-.2-.33-.67-1.1-.73-1.15-.8-1.2-.87-1.25-.9-1.29-.95-1.33-1-1.35-1-1.38-2.16-2.89-2.27-2.95-4.7-6.15-2.4-3.16-2.37-3.19-1.16-1.63-1.17-1.62-1.13-1.63-.89-1.72-1-1.64-1.07-1.63-1-1.63-1-1.65-1-1.65-.93-1.67-.87-1.65-.83-1.67-.75-1.63-.38-.87-.35-.83-.34-.85-.31-.84-.29-.85-.28-.85-.27-.85-.25-.86-.21-.89-.2-.86-.17-.87-.15-.9-.13-.9-.09-.9-.06-.9v-2.77l.08-.93.12-.93.16-.95.2-.94.25-.93.3-.93.35-.92.4-.92.45-.9.5-.86.55-.85.59-.82.63-.8.67-.77.71-.71.75-.7.79-.67.81-.63.85-.59.87-.56.9-.54.93-.5 1-.46 1-.44 1-.41 1-.39 1-.36 1.09-.34 1.1-.3 1.13-.3 1.17-.26 1.18-.24 1.22-.23 1.18-.18 1.28-.18 1.32-.17 1.33-.13 1.38-.14 1.42-.1h.5l.4-.15.57-.18.58-.15.58-.1.6-.07h.61zm-3.4 17.3-1.15.08-1.12.1-1.06.12-1 .11-1 .15-.91.15-.89.15-.83.17-.78.18-.74.2-.68.19-.65.2-.6.2-.55.21-.5.2-.47.22-.41.2-.39.22-.33.18-.3.2-.27.18-.23.19-.2.16-.17.15-.13.15-.13.14-.1.13-.09.13-.08.12-.07.12-.06.11-.05.14v.13l-.05.13v.17l-.05.17v2.18l.05.37.06.4.09.43.1.43.13.47.13.48.15.5.17.52.18.53.22.55.22.57.23.57.25.56.58 1.25.64 1.27.68 1.32.75 1.33.8 1.37.85 1.41.9 1.42.95 1.45 1 1.47 1 1.48 1.05 1.5 1.01 1.5 1.1 1.52 2.27 3.06 2.32 3.05 4.68 6.12 2.3 3 2.23 3 1.1 1.47 1.07 1.46 1 1.45 1 1.44 1 1.43.93 1.4.9 1.4.85 1.4.42.7.38.72.38.71.34.72.33.73.3.72.28.72.27.71.25.74.23.76.39 1.37.33 1.42.27 1.4.21 1.36.17 1.35.13 1.34.1 1.3.07 1.28v12.18l.05.92.08.88.1.85.1.8.15.78.15.75.2.75.1.3v.2l.13.12.12.1.18.12.22.13.25.15.3.13.35.15.37.15.4.14.41.13.45.12.47.1.47.1.5.08.48.07.48.05h3l.3-.05h.25l.25-.07.62-.15.63-.18.62-.2.58-.2.59-.22.55-.22.53-.21.5-.24.5-.25.48-.25.45-.25.45-.26.42-.27.42-.28.4-.29.38-.28.37-.3.35-.3.35-.32.33-.31.32-.34.31-.33.3-.33.3-.35.29-.37.26-.35.27-.38.25-.39.25-.4.25-.4.23-.41.22-.42.22-.43.2-.44.2-.45.2-.46.18-.49.17-.48.16-.48.17-.52.15-.52.13-.51.15-.54.12-.55.12-.55.1-.56.1-.59.1-.55.15-1.21.11-1.24.09-1.25.05-1.28v-2.73l-.05-1.35-.09-1.38-.13-1.4-.15-1.42-.17-1.42-.21-1.43-.25-1.45-.27-1.45-.28-1.47-.32-1.45-.35-1.46-.37-1.45-.38-1.45-.42-1.45-.41-1.44-.45-1.43-.47-1.42-.48-1.4-.3-1.38-.51-1.37-.5-1.35-.54-1.31-.53-1.3-.55-1.29-.53-1.23-.57-1.22-.55-1.18-.55-1.13-.55-1.12-.55-1.07-.55-1-.55-1-.53-.94-.52-.88-.42-.67-.43-.66-.45-.69-.47-.66-.5-.69-.51-.66-.54-.69-.56-.68-.57-.67-.58-.68-.6-.67-.64-.66-.63-.67-.63-.67-.67-.66-.65-.64-1.4-1.3-1.4-1.26-1.43-1.25-1.45-1.2-1.47-1.19-1.48-1.13-1.47-1.1-1.5-1.1-2.53-1.82-3.19-2.31-3.43-2.5-3.32-2.38-2.12-1.5z"/><path d="m381.28 343.38.6.1.6.15.59.19.56.23.55.28.52.32.52.35.46.38.45.44.42.45.37.48.35.52.3.53.26.55.22.58.18.59.14.6.08.6.05.61v.67l-.05.62-.08.6-.14.6-.18.6-.22.56-.26.55-.3.54-.35.51-.37.49-.42.45-.45.43-.75.65.1.33.05.3 1.42-.8 4.83-2.81 4.5-2.62 5.09-2.95 5-2.88 2.27-1.27.3-.22.88-.53.65-.33.47-.22h.1l1.61-.87 1.5-.78.77-.37.52-.22.4-.16.41-.14.22-.06.58-.17.59-.1.58-.08h1.27l.61.07.6.1.6.15.59.18.58.25.55.27.52.31 2.01-1.98 1-1 1-.91 1-.89 1-.86 1-.84 1-.78 1-.77 1-.68.65-.38.62-.34.67-.33.73-.32.83-.28.57-.17.37-.08.36-.07.25-.05.45-.06.45-.05h1.97l.43.07.42.06.2.05.47.12.45.15.45.17.2.06.46.22.45.23.44.27.16.1.44.3.4.3.38.35.15.15.33.33.34.35.28.39.13.18.25.33.24.35.2.37.11.22.24.48.21.5.09.25.15.43.13.44.07.3.1.36.06.37.1.62.09.93v1.82l-.1.85-.15.78-.2.74-.23.66-.29.7-.5 1-.58 1-.63.91-.64.85-.68.8-.7.79-.73.76-.75.74-.8.75-.82.73-.85.73-.88.75-.9.74-.95.73-1 .77-2 1.48-2.12 1.52-2.14 1.59-2.28 1.52-2.32 1.52-2.4 1.51-2.4 1.5-2.42 1.49-2.43 1.46-2.42 1.44-2.41 1.43-2.35 1.35-2.3 1.28-2.22 1.24-2.13 1.13-2.05 1.08-1.92 1-1.8.93-1.67.83-1.51.75-1.37.67-1.23.55-1 .42-1.36.56-1.4.64-1.54.7-1.61.78-1.69.82-1.66.85-3.32 1.68-3 1.57-2.41 1.3-2.24 1.21-.55.29-.56.23-.6.18-.6.15-.62.1h-.4l-.72.45-1 .6-1 .55-1 .53-1.09.58-1 .48-1 .47-1 .43-.43.17-1.18.78-1.37.9-1.38.87-1.4.83-1.4.82-1.42.8-.32.16h-.06l-1.4 1.05-1.42 1-1.47 1-1.48 1-1.79 1.24-.86.46-.9.44-1.84.83-1 .43-.34.37-2.21 2.42-1.1 1.18-.59.62-.6.58-.61.6-.69.6-.78.63-.62.4-.38.25-.4.24-.32.16-.46.22-.47.2h-.15l-.42.15-.43.13h-.13l-.55.11-.59.1h-.04l-.49.05h-1.06l-.55-.05-.57-.08-.55-.13h-.1l-.47-.13-.45-.17-.43-.18-.42-.22-.1-.05-.53-.3-.52-.35-.48-.38-.08-.07-.44-.4-.4-.42-.36-.45-.09-.1-.26-.38-.25-.4-.24-.4-.06-.12-.25-.51-.22-.54-.05-.15-.15-.45-.13-.46-.12-.52-.18-.76-.06-.76v-1.84l.06-.48v-.15l.08-.42.12-.41v-.15l.12-.39.15-.36.18-.49.37-.73.25-.43.2-.32.2-.3.23-.32.25-.33.27-.33.5-.55.73-.74.73-.63.49-.37-.24-.16-.33-.25-.1-.09-.38-.33-.35-.35-.09-.1-.38-.42-.35-.45-.07-.1-.33-.5-.3-.51-.05-.1-.2-.4-.17-.4-.15-.4v-.1l-.13-.42-.1-.43-.09-.42v-.12l-.07-.41v-1.54l.05-.56v-.12l.08-.53.12-.54v-.11l.13-.44.14-.41.05-.12.21-.52.24-.48.13-.25.28-.5.34-.47.18-.26.25-.32.27-.33.54-.54.68-.65.58-.5-.08-.81v-2.04l.12-.59.13-.58.2-.55v-.15l.15-.4.19-.4.2-.37.1-.16.23-.4.25-.39.32-.43.51-.62.55-.58.85-.8.92-.75.92-.7 1-.7 1-.68 1.06-.7 1.1-.72 1.17-.72 1.22-.73 2.46-1.45 2.57-1.48.2-.1.12-.3.18-.4.22-.4.13-.24.27-.41.26-.4.32-.39.17-.2.38-.43.43-.4.1-.08.3-.27.34-.25.23-.18 4.75-3.19 5.23-3.55 5.5-3.76 5.35-3.69 8.79-6.05 3.61-2.5.52-.33.55-.28.55-.25.58-.22.59-.17.61-.11.6-.09h1.24zm20.54 83.62.66-1.07.8-1 .89-.95 1.81-1.3 1.07-.48 3.35 1.08 1.28-1.72 1.64-1.55 1.88-1.23 2.07-.9 2.18-.52 2.25-.13 2.23.27 2.15.63 2 1 1.8 1.33 1.53 1.63 1.25 1.89.89 2.06.51 2.19.15.91.09 1.47.16 1.3-.56.55-.25 1.15-.42 1.7-.27 1.05-.05.19-.18.93-.27 1.18-.3 1.25-.36 1.3-.44 1.37-.5 1.42-.56 1.38-.39.82-.36.75-.42.78-.45.78-.48.79-.55.8-.6.81-.67.82-.75.82-.82.8h-.05l-.85.75-1 .75-1.1.72-1.17.66-1.26.59-1.35.48-1.4.38-1.45.27-1.47.13h-1.47l-1.43-.1-1.42-.2-1.36-.32-1.49-.45-1.38-.55-1.38-.78-1.19-.85-1.2-1.07-1.31-1.55-1-1.63-.7-1.48-.48-1.32-.33-1.23-.25-1.14-.15-1.08-.12-1.05-.05-1v-2l.05-.85v-.15l.15-1 .18-1 .24-1 .28-1.05.37-1.08.45-1.13.55-1.17.7-1.23.71-1.07.42-1.25.55-1.18zm7.33 19.7-.22-.07.34.12-.69-.3-.16-.05zm-3.42-2.49.47.42-.57-.57-.08-.08zm11.09-2.86-.22.16.8-.5-.37-.36zm13.11-4.95 2.37.5 1.6-4.4zm4-4 .14-.38v-.35z" fill="#fff"/><path d="m579.92 998.37h1.11l1.59.05 1.58.1 1.62.15 1.63.2 1.58.27.92.18.88.18.89.24.91.26.94.3 1 .37 1 .43 1 .52 1.1.62 1.13.73 1.18.88 1.19 1.07 1.16 1.28 1 1.34.75 1.21.62 1.19.57 1.3.46 1.43.37 1.52.22 1.61v1.67l-.12 1.67-.28 1.65-.44 1.55-.55 1.45-.66 1.31-.7 1.19-.77 1-.77.93-.76.8-.75.72-.87.73-1.28 1-1.37.85-1.28.68-1.24.59-1.18.5-1.15.43-1.12.38-1.1.34-1.06.31-1.07.29-1.07.26-2 .44-1.73.46-1.8.33-1.62.3-2.68.47-2.88.53-3.25.57-3.5.57-3.67.55-1.82.26v.14h.35l2.5.72 2.34 1.11 2.1 1.54 1.81 1.85 1.45 2.15 1.07 2.36.65 2.5.2 2.6-.23 2.59-.7 2.5-1.1 2.33-1.5 2.13-1.85 1.82-2.14 1.48-2.35 1.1-2.5.67h-.31l-.05.13-.62 1.54-1.5 2.16-1.13 1.25-.9.85-.82.7-.85.64-.83.58-.85.53-.95.52-1.37.65-1.32.5-1 .33-.9.27-.27.08.5-.18.5-.22.37-.2.43-.25.47-.31.48-.35.45-.4.44-.42.36-.42.34-.4.26-.36.2-.34.09-.15-6 1.84h1.09-.5l-1.14.16h-.21l-12.35 3.8-1-3.14-14.78.12-11.19.08h-8.71l-2.52-.23-2.47-.65-2.3-1.07-2.08-1.45-1.8-1.8-.85-1.22-.67-.21-.88-.34-.92-.4-.95-.48-1-.55-1.05-.68-1.06-.82-1.09-1-1.08-1.15-1-1.32-.95-1.51-.15-.3h-30.47l-2.21.15-1.34.09-1.46.08h-4.25l-1-.07-1-.1-1.13-.15-1.23-.25-1.39-.35-1.55-.51-1.73-.79-1.68-1-1.22-.91-1-.92-1-1.07-1-1.25-.88-1.38-.74-1.52-.58-1.6-.4-1.63-.22-1.6-.05-1.55.09-1.45.18-1.35.28-1.23.37-1.24.58-1.51.77-1.55.88-1.45 1-1.34 1.07-1.2 1.12-1.06 1.13-.92 1.12-.78 1.1-.69 1.06-.56 1-.49 1-.4.93-.33.89-.3.85-.23.88-.24 1.4-.31 1.35-.25 1.2-.19 1-.15.56-.1.35-1.73.42-1.62 1.35-2.6 1.42-1.86 1.51-1.54 1.84-1.36 1.53-.85 1-.5.82-.35.82-.34.88-.33 1.5-.5 1.57-.47 1.55-.38 1.55-.35 1.55-.3 1.55-.27 1.55-.23 1.56-.22 1.57-.2 1.57-.16 1.56-.15 1.59-.15 2.11-.17 1-.07 3.05-.2 2.95-.16 5.48-.3 2.42-.15 2.15-.17.88-.07.82-.08.68-.08.6-.09 3.94-.61 4-.65 4-.69 4.05-.71 4.06-.74 4.09-.75 8.21-1.51 4.15-.77 4.17-.75 4.18-.73 4.2-.72 4.24-.68 4.25-.67 4.26-.62 4.2-.56 1.84-.25 1.66-.22 2-.23 2.37-.27 2.62-.23 2.76-.22 1.49-.1 1.5-.07 1.51-.06h3.54z" fill="#808080"/></g></svg>
|
{images → assets/img}/payment-methods/alipay.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/amex.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/bancontact.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/diners.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/discover.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/eps.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/giropay.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/ideal.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/jcb.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/laser.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/maestro.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/mastercard.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/multibanco.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/p24.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/sepa.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/sofort.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/unionpay.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/visa.svg
RENAMED
File without changes
|
{images → assets/img}/payment-methods/wechat.svg
RENAMED
File without changes
|
{images/previews → assets/img}/pennant.jpg
RENAMED
File without changes
|
assets/img/single-product-preview.svg
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 230 100">
|
2 |
+
<g fill="#E1E3E6" fill-rule="nonzero">
|
3 |
+
<path d="M76 0h11v6H76zM76 11h88v11H76zM76 27h28v6H76zM76 44h154v28H76zM76 83h22v17H76zM104 83h44v17h-44zM0 0h66v66H0z"/>
|
4 |
+
</g>
|
5 |
+
</svg>
|
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-select-control.js
CHANGED
@@ -4,12 +4,10 @@
|
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { decodeEntities } from '@wordpress/html-entities';
|
6 |
import { SelectControl } from '@wordpress/components';
|
|
|
7 |
import { useEffect } from 'react';
|
8 |
import classnames from 'classnames';
|
9 |
-
import {
|
10 |
-
ValidationInputError,
|
11 |
-
useValidationContext,
|
12 |
-
} from '@woocommerce/base-context';
|
13 |
|
14 |
// Default option for select boxes.
|
15 |
const selectAnOption = {
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { decodeEntities } from '@wordpress/html-entities';
|
6 |
import { SelectControl } from '@wordpress/components';
|
7 |
+
import { useValidationContext } from '@woocommerce/base-context';
|
8 |
import { useEffect } from 'react';
|
9 |
import classnames from 'classnames';
|
10 |
+
import { ValidationInputError } from '@woocommerce/base-components/validation';
|
|
|
|
|
|
|
11 |
|
12 |
// Default option for select boxes.
|
13 |
const selectAnOption = {
|
assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js
CHANGED
@@ -6,11 +6,7 @@ import Button from '@woocommerce/base-components/button';
|
|
6 |
import { Icon, done as doneIcon } from '@woocommerce/icons';
|
7 |
import { useState, useEffect } from '@wordpress/element';
|
8 |
import { useAddToCartFormContext } from '@woocommerce/base-context';
|
9 |
-
import {
|
10 |
-
useStoreEvents,
|
11 |
-
useStoreAddToCart,
|
12 |
-
} from '@woocommerce/base-context/hooks';
|
13 |
-
import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
|
14 |
|
15 |
/**
|
16 |
* Add to Cart Form Button Component.
|
@@ -28,8 +24,6 @@ const AddToCartButton = () => {
|
|
28 |
hasError,
|
29 |
dispatchActions,
|
30 |
} = useAddToCartFormContext();
|
31 |
-
const { parentName } = useInnerBlockLayoutContext();
|
32 |
-
const { dispatchStoreEvent } = useStoreEvents();
|
33 |
const { cartQuantity } = useStoreAddToCart( product.id || 0 );
|
34 |
const [ addedToCart, setAddedToCart ] = useState( false );
|
35 |
const addToCartButtonData = product.add_to_cart || {
|
@@ -75,13 +69,7 @@ const AddToCartButton = () => {
|
|
75 |
isDisabled={ isDisabled }
|
76 |
isProcessing={ isProcessing }
|
77 |
isDone={ addedToCart }
|
78 |
-
onClick={ () =>
|
79 |
-
dispatchActions.submitForm();
|
80 |
-
dispatchStoreEvent( 'cart-add-item', {
|
81 |
-
product,
|
82 |
-
listName: parentName,
|
83 |
-
} );
|
84 |
-
} }
|
85 |
/>
|
86 |
) : (
|
87 |
<LinkComponent
|
@@ -91,12 +79,6 @@ const AddToCartButton = () => {
|
|
91 |
addToCartButtonData.text ||
|
92 |
__( 'View Product', 'woo-gutenberg-products-block' )
|
93 |
}
|
94 |
-
onClick={ () => {
|
95 |
-
dispatchStoreEvent( 'product-view-link', {
|
96 |
-
product,
|
97 |
-
listName: parentName,
|
98 |
-
} );
|
99 |
-
} }
|
100 |
/>
|
101 |
);
|
102 |
};
|
@@ -108,16 +90,10 @@ const AddToCartButton = () => {
|
|
108 |
* @param {string} props.className Css classnames.
|
109 |
* @param {string} props.href Link for button.
|
110 |
* @param {string} props.text Text content for button.
|
111 |
-
* @param {function():any} props.onClick Callback to execute when button is clicked.
|
112 |
*/
|
113 |
-
const LinkComponent = ( { className, href, text
|
114 |
return (
|
115 |
-
<Button
|
116 |
-
className={ className }
|
117 |
-
href={ href }
|
118 |
-
onClick={ onClick }
|
119 |
-
rel="nofollow"
|
120 |
-
>
|
121 |
{ text }
|
122 |
</Button>
|
123 |
);
|
@@ -151,7 +127,7 @@ const ButtonComponent = ( {
|
|
151 |
>
|
152 |
{ isDone && quantityInCart > 0
|
153 |
? sprintf(
|
154 |
-
|
155 |
_n(
|
156 |
'%d in cart',
|
157 |
'%d in cart',
|
6 |
import { Icon, done as doneIcon } from '@woocommerce/icons';
|
7 |
import { useState, useEffect } from '@wordpress/element';
|
8 |
import { useAddToCartFormContext } from '@woocommerce/base-context';
|
9 |
+
import { useStoreAddToCart } from '@woocommerce/base-hooks';
|
|
|
|
|
|
|
|
|
10 |
|
11 |
/**
|
12 |
* Add to Cart Form Button Component.
|
24 |
hasError,
|
25 |
dispatchActions,
|
26 |
} = useAddToCartFormContext();
|
|
|
|
|
27 |
const { cartQuantity } = useStoreAddToCart( product.id || 0 );
|
28 |
const [ addedToCart, setAddedToCart ] = useState( false );
|
29 |
const addToCartButtonData = product.add_to_cart || {
|
69 |
isDisabled={ isDisabled }
|
70 |
isProcessing={ isProcessing }
|
71 |
isDone={ addedToCart }
|
72 |
+
onClick={ () => dispatchActions.submitForm() }
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
/>
|
74 |
) : (
|
75 |
<LinkComponent
|
79 |
addToCartButtonData.text ||
|
80 |
__( 'View Product', 'woo-gutenberg-products-block' )
|
81 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
/>
|
83 |
);
|
84 |
};
|
90 |
* @param {string} props.className Css classnames.
|
91 |
* @param {string} props.href Link for button.
|
92 |
* @param {string} props.text Text content for button.
|
|
|
93 |
*/
|
94 |
+
const LinkComponent = ( { className, href, text } ) => {
|
95 |
return (
|
96 |
+
<Button className={ className } href={ href } rel="nofollow">
|
|
|
|
|
|
|
|
|
|
|
97 |
{ text }
|
98 |
</Button>
|
99 |
);
|
127 |
>
|
128 |
{ isDone && quantityInCart > 0
|
129 |
? sprintf(
|
130 |
+
// translators: %s number of products in cart.
|
131 |
_n(
|
132 |
'%d in cart',
|
133 |
'%d in cart',
|
assets/js/atomic/blocks/product-elements/button/block.js
CHANGED
@@ -4,11 +4,10 @@
|
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
import { __, _n, sprintf } from '@wordpress/i18n';
|
7 |
-
import {
|
8 |
-
|
9 |
-
useStoreAddToCart,
|
10 |
-
} from '@woocommerce/base-context/hooks';
|
11 |
import { decodeEntities } from '@wordpress/html-entities';
|
|
|
12 |
import {
|
13 |
useInnerBlockLayoutContext,
|
14 |
useProductDataContext,
|
@@ -52,6 +51,8 @@ const Block = ( { className } ) => {
|
|
52 |
};
|
53 |
|
54 |
const AddToCartButton = ( { product } ) => {
|
|
|
|
|
55 |
const {
|
56 |
id,
|
57 |
permalink,
|
@@ -60,9 +61,18 @@ const AddToCartButton = ( { product } ) => {
|
|
60 |
is_purchasable: isPurchasable,
|
61 |
is_in_stock: isInStock,
|
62 |
} = product;
|
63 |
-
|
64 |
const { cartQuantity, addingToCart, addToCart } = useStoreAddToCart( id );
|
65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
const addedToCart = Number.isFinite( cartQuantity ) && cartQuantity > 0;
|
67 |
const allowAddToCart = ! hasOptions && isPurchasable && isInStock;
|
68 |
const buttonAriaLabel = decodeEntities(
|
@@ -70,7 +80,7 @@ const AddToCartButton = ( { product } ) => {
|
|
70 |
);
|
71 |
const buttonText = addedToCart
|
72 |
? sprintf(
|
73 |
-
|
74 |
_n(
|
75 |
'%d in cart',
|
76 |
'%d in cart',
|
@@ -90,17 +100,9 @@ const AddToCartButton = ( { product } ) => {
|
|
90 |
if ( ! allowAddToCart ) {
|
91 |
buttonProps.href = permalink;
|
92 |
buttonProps.rel = 'nofollow';
|
93 |
-
buttonProps.onClick = () => {
|
94 |
-
dispatchStoreEvent( 'product-view-link', {
|
95 |
-
product,
|
96 |
-
} );
|
97 |
-
};
|
98 |
} else {
|
99 |
buttonProps.onClick = () => {
|
100 |
addToCart();
|
101 |
-
dispatchStoreEvent( 'cart-add-item', {
|
102 |
-
product,
|
103 |
-
} );
|
104 |
};
|
105 |
}
|
106 |
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
import { __, _n, sprintf } from '@wordpress/i18n';
|
7 |
+
import { useEffect, useRef } from '@wordpress/element';
|
8 |
+
import { useStoreAddToCart } from '@woocommerce/base-hooks';
|
|
|
|
|
9 |
import { decodeEntities } from '@wordpress/html-entities';
|
10 |
+
import { triggerFragmentRefresh } from '@woocommerce/base-utils';
|
11 |
import {
|
12 |
useInnerBlockLayoutContext,
|
13 |
useProductDataContext,
|
51 |
};
|
52 |
|
53 |
const AddToCartButton = ( { product } ) => {
|
54 |
+
const firstMount = useRef( true );
|
55 |
+
|
56 |
const {
|
57 |
id,
|
58 |
permalink,
|
61 |
is_purchasable: isPurchasable,
|
62 |
is_in_stock: isInStock,
|
63 |
} = product;
|
64 |
+
|
65 |
const { cartQuantity, addingToCart, addToCart } = useStoreAddToCart( id );
|
66 |
|
67 |
+
useEffect( () => {
|
68 |
+
// Avoid running on first mount when cart quantity is first set.
|
69 |
+
if ( firstMount.current ) {
|
70 |
+
firstMount.current = false;
|
71 |
+
return;
|
72 |
+
}
|
73 |
+
triggerFragmentRefresh();
|
74 |
+
}, [ cartQuantity ] );
|
75 |
+
|
76 |
const addedToCart = Number.isFinite( cartQuantity ) && cartQuantity > 0;
|
77 |
const allowAddToCart = ! hasOptions && isPurchasable && isInStock;
|
78 |
const buttonAriaLabel = decodeEntities(
|
80 |
);
|
81 |
const buttonText = addedToCart
|
82 |
? sprintf(
|
83 |
+
// translators: %s number of products in cart.
|
84 |
_n(
|
85 |
'%d in cart',
|
86 |
'%d in cart',
|
100 |
if ( ! allowAddToCart ) {
|
101 |
buttonProps.href = permalink;
|
102 |
buttonProps.rel = 'nofollow';
|
|
|
|
|
|
|
|
|
|
|
103 |
} else {
|
104 |
buttonProps.onClick = () => {
|
105 |
addToCart();
|
|
|
|
|
|
|
106 |
};
|
107 |
}
|
108 |
|
assets/js/atomic/blocks/product-elements/image/block.js
CHANGED
@@ -5,13 +5,12 @@ import PropTypes from 'prop-types';
|
|
5 |
import { useState, Fragment } from '@wordpress/element';
|
6 |
import { __, sprintf } from '@wordpress/i18n';
|
7 |
import classnames from 'classnames';
|
8 |
-
import { PLACEHOLDER_IMG_SRC } from '@woocommerce/settings';
|
9 |
import {
|
10 |
useInnerBlockLayoutContext,
|
11 |
useProductDataContext,
|
12 |
} from '@woocommerce/shared-context';
|
13 |
import { withProductDataContext } from '@woocommerce/shared-hocs';
|
14 |
-
import { useStoreEvents } from '@woocommerce/base-context/hooks';
|
15 |
|
16 |
/**
|
17 |
* Internal dependencies
|
@@ -40,7 +39,6 @@ export const Block = ( {
|
|
40 |
const { parentClassName } = useInnerBlockLayoutContext();
|
41 |
const { product } = useProductDataContext();
|
42 |
const [ imageLoaded, setImageLoaded ] = useState( false );
|
43 |
-
const { dispatchStoreEvent } = useStoreEvents();
|
44 |
|
45 |
if ( ! product.id ) {
|
46 |
return (
|
@@ -62,7 +60,7 @@ export const Block = ( {
|
|
62 |
const image = hasProductImages ? product.images[ 0 ] : null;
|
63 |
const ParentComponent = showProductLink ? 'a' : Fragment;
|
64 |
const anchorLabel = sprintf(
|
65 |
-
/*
|
66 |
__( 'Link to %s', 'woo-gutenberg-products-block' ),
|
67 |
product.name
|
68 |
);
|
@@ -70,11 +68,6 @@ export const Block = ( {
|
|
70 |
href: product.permalink,
|
71 |
rel: 'nofollow',
|
72 |
...( ! hasProductImages && { 'aria-label': anchorLabel } ),
|
73 |
-
onClick: () => {
|
74 |
-
dispatchStoreEvent( 'product-view-link', {
|
75 |
-
product,
|
76 |
-
} );
|
77 |
-
},
|
78 |
};
|
79 |
|
80 |
return (
|
5 |
import { useState, Fragment } from '@wordpress/element';
|
6 |
import { __, sprintf } from '@wordpress/i18n';
|
7 |
import classnames from 'classnames';
|
8 |
+
import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
|
9 |
import {
|
10 |
useInnerBlockLayoutContext,
|
11 |
useProductDataContext,
|
12 |
} from '@woocommerce/shared-context';
|
13 |
import { withProductDataContext } from '@woocommerce/shared-hocs';
|
|
|
14 |
|
15 |
/**
|
16 |
* Internal dependencies
|
39 |
const { parentClassName } = useInnerBlockLayoutContext();
|
40 |
const { product } = useProductDataContext();
|
41 |
const [ imageLoaded, setImageLoaded ] = useState( false );
|
|
|
42 |
|
43 |
if ( ! product.id ) {
|
44 |
return (
|
60 |
const image = hasProductImages ? product.images[ 0 ] : null;
|
61 |
const ParentComponent = showProductLink ? 'a' : Fragment;
|
62 |
const anchorLabel = sprintf(
|
63 |
+
/* Translators: %s is referring to the product name */
|
64 |
__( 'Link to %s', 'woo-gutenberg-products-block' ),
|
65 |
product.name
|
66 |
);
|
68 |
href: product.permalink,
|
69 |
rel: 'nofollow',
|
70 |
...( ! hasProductImages && { 'aria-label': anchorLabel } ),
|
|
|
|
|
|
|
|
|
|
|
71 |
};
|
72 |
|
73 |
return (
|
assets/js/atomic/blocks/product-elements/rating/block.js
CHANGED
@@ -36,7 +36,7 @@ const Block = ( { className } ) => {
|
|
36 |
};
|
37 |
|
38 |
const ratingText = sprintf(
|
39 |
-
/*
|
40 |
__( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
|
41 |
rating
|
42 |
);
|
36 |
};
|
37 |
|
38 |
const ratingText = sprintf(
|
39 |
+
/* Translators: %f is referring to the average rating value */
|
40 |
__( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
|
41 |
rating
|
42 |
);
|
assets/js/atomic/blocks/product-elements/summary/block.js
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
import Summary from '@woocommerce/base-components/summary';
|
7 |
-
import {
|
8 |
import {
|
9 |
useInnerBlockLayoutContext,
|
10 |
useProductDataContext,
|
@@ -49,6 +49,8 @@ const Block = ( { className } ) => {
|
|
49 |
return null;
|
50 |
}
|
51 |
|
|
|
|
|
52 |
return (
|
53 |
<Summary
|
54 |
className={ classnames(
|
@@ -60,7 +62,7 @@ const Block = ( { className } ) => {
|
|
60 |
) }
|
61 |
source={ source }
|
62 |
maxLength={ 150 }
|
63 |
-
countType={
|
64 |
/>
|
65 |
);
|
66 |
};
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
import Summary from '@woocommerce/base-components/summary';
|
7 |
+
import { getSetting } from '@woocommerce/settings';
|
8 |
import {
|
9 |
useInnerBlockLayoutContext,
|
10 |
useProductDataContext,
|
49 |
return null;
|
50 |
}
|
51 |
|
52 |
+
const countType = getSetting( 'wordCountType', 'words' );
|
53 |
+
|
54 |
return (
|
55 |
<Summary
|
56 |
className={ classnames(
|
62 |
) }
|
63 |
source={ source }
|
64 |
maxLength={ 150 }
|
65 |
+
countType={ countType }
|
66 |
/>
|
67 |
);
|
68 |
};
|
assets/js/atomic/blocks/product-elements/title/block.js
CHANGED
@@ -12,7 +12,6 @@ import { isFeaturePluginBuild } from '@woocommerce/block-settings';
|
|
12 |
import { gatedStyledText } from '@woocommerce/atomic-utils';
|
13 |
import { withProductDataContext } from '@woocommerce/shared-hocs';
|
14 |
import ProductName from '@woocommerce/base-components/product-name';
|
15 |
-
import { useStoreEvents } from '@woocommerce/base-context/hooks';
|
16 |
|
17 |
/**
|
18 |
* Internal dependencies
|
@@ -46,7 +45,6 @@ export const Block = ( {
|
|
46 |
} ) => {
|
47 |
const { parentClassName } = useInnerBlockLayoutContext();
|
48 |
const { product } = useProductDataContext();
|
49 |
-
const { dispatchStoreEvent } = useStoreEvents();
|
50 |
const TagName = `h${ headingLevel }`;
|
51 |
|
52 |
const colorClass = getColorClassName( 'color', color );
|
@@ -106,11 +104,6 @@ export const Block = ( {
|
|
106 |
color: customColor,
|
107 |
fontSize: customFontSize,
|
108 |
} ) }
|
109 |
-
onClick={ () => {
|
110 |
-
dispatchStoreEvent( 'product-view-link', {
|
111 |
-
product,
|
112 |
-
} );
|
113 |
-
} }
|
114 |
/>
|
115 |
</TagName>
|
116 |
);
|
12 |
import { gatedStyledText } from '@woocommerce/atomic-utils';
|
13 |
import { withProductDataContext } from '@woocommerce/shared-hocs';
|
14 |
import ProductName from '@woocommerce/base-components/product-name';
|
|
|
15 |
|
16 |
/**
|
17 |
* Internal dependencies
|
45 |
} ) => {
|
46 |
const { parentClassName } = useInnerBlockLayoutContext();
|
47 |
const { product } = useProductDataContext();
|
|
|
48 |
const TagName = `h${ headingLevel }`;
|
49 |
|
50 |
const colorClass = getColorClassName( 'color', color );
|
104 |
color: customColor,
|
105 |
fontSize: customFontSize,
|
106 |
} ) }
|
|
|
|
|
|
|
|
|
|
|
107 |
/>
|
108 |
</TagName>
|
109 |
);
|
assets/js/atomic/utils/index.js
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
-
export * from './get-block-map';
|
2 |
-
export * from './create-blocks-from-template';
|
3 |
-
export * from './render-parent-block';
|
|
|
4 |
export * from './block-styling.js';
|
5 |
-
export * from './render-standalone-blocks';
|
1 |
+
export * from './get-block-map.js';
|
2 |
+
export * from './create-blocks-from-template.js';
|
3 |
+
export * from './render-parent-block.js';
|
4 |
+
export * from './render-inner-blocks.js';
|
5 |
export * from './block-styling.js';
|
6 |
+
export * from './render-standalone-blocks.js';
|
assets/js/atomic/utils/render-inner-blocks.js
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { Suspense, cloneElement, isValidElement } from '@wordpress/element';
|
5 |
+
import parse from 'html-react-parser';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import { getBlockMap } from './get-block-map';
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Replaces saved block HTML markup with Inner Block Components.
|
14 |
+
*
|
15 |
+
* @param {Object} props Render props.
|
16 |
+
* @param {Array} props.children Children/inner blocks to render.
|
17 |
+
* @param {string} props.blockName Parent Block Name used to get the block map and for keys.
|
18 |
+
* @param {number} [props.depth] Depth of inner blocks being rendered.
|
19 |
+
*/
|
20 |
+
export const renderInnerBlocks = ( {
|
21 |
+
children,
|
22 |
+
blockName: parentBlockName,
|
23 |
+
depth = 1,
|
24 |
+
} ) => {
|
25 |
+
const blockMap = getBlockMap( parentBlockName );
|
26 |
+
|
27 |
+
return Array.from( children ).map( ( el, index ) => {
|
28 |
+
const componentProps = {
|
29 |
+
...el.dataset,
|
30 |
+
key: `${ parentBlockName }_${ depth }_${ index }`,
|
31 |
+
};
|
32 |
+
|
33 |
+
const componentChildren =
|
34 |
+
el.children && el.children.length
|
35 |
+
? renderInnerBlocks( {
|
36 |
+
children: el.children,
|
37 |
+
blockName: parentBlockName,
|
38 |
+
depth: depth + 1,
|
39 |
+
} )
|
40 |
+
: null;
|
41 |
+
|
42 |
+
const LayoutComponent =
|
43 |
+
componentProps.blockName && blockMap[ componentProps.blockName ]
|
44 |
+
? blockMap[ componentProps.blockName ]
|
45 |
+
: null;
|
46 |
+
|
47 |
+
if ( ! LayoutComponent ) {
|
48 |
+
const element = parse( el.outerHTML );
|
49 |
+
|
50 |
+
if ( isValidElement( element ) ) {
|
51 |
+
return componentChildren
|
52 |
+
? cloneElement( element, componentProps, componentChildren )
|
53 |
+
: cloneElement( element, componentProps );
|
54 |
+
}
|
55 |
+
return null;
|
56 |
+
}
|
57 |
+
|
58 |
+
return (
|
59 |
+
<Suspense
|
60 |
+
key={ `${ parentBlockName }_${ depth }_${ index }_suspense` }
|
61 |
+
fallback={ <div className="wc-block-placeholder" /> }
|
62 |
+
>
|
63 |
+
<LayoutComponent { ...componentProps }>
|
64 |
+
{ componentChildren }
|
65 |
+
</LayoutComponent>
|
66 |
+
</Suspense>
|
67 |
+
);
|
68 |
+
} );
|
69 |
+
};
|
assets/js/atomic/utils/render-parent-block.js
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { renderFrontend } from '@woocommerce/base-utils';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Internal dependencies
|
8 |
+
*/
|
9 |
+
import { renderInnerBlocks } from './render-inner-blocks';
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Renders a block component in the place of a specified set of selectors.
|
13 |
+
*
|
14 |
+
* @param {Object} props Render props.
|
15 |
+
* @param {Function} props.Block React component to use as a replacement.
|
16 |
+
* @param {string} props.selector CSS selector to match the elements to replace.
|
17 |
+
* @param {string} [props.blockName] Optional Block Name. Used for inner block component mapping.
|
18 |
+
* @param {Function} [props.getProps] Function to generate the props object for the block.
|
19 |
+
*/
|
20 |
+
export const renderParentBlock = ( {
|
21 |
+
Block,
|
22 |
+
selector,
|
23 |
+
blockName = '',
|
24 |
+
getProps = () => {},
|
25 |
+
} ) => {
|
26 |
+
const getPropsWithChildren = ( el, i ) => {
|
27 |
+
const children =
|
28 |
+
el.children && el.children.length
|
29 |
+
? renderInnerBlocks( {
|
30 |
+
blockName,
|
31 |
+
children: el.children,
|
32 |
+
} )
|
33 |
+
: null;
|
34 |
+
return { ...getProps( el, i ), children };
|
35 |
+
};
|
36 |
+
renderFrontend( {
|
37 |
+
Block,
|
38 |
+
selector,
|
39 |
+
getProps: getPropsWithChildren,
|
40 |
+
} );
|
41 |
+
};
|
assets/js/atomic/utils/render-parent-block.tsx
DELETED
@@ -1,126 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { renderFrontend } from '@woocommerce/base-utils';
|
5 |
-
import {
|
6 |
-
Fragment,
|
7 |
-
Suspense,
|
8 |
-
cloneElement,
|
9 |
-
isValidElement,
|
10 |
-
} from '@wordpress/element';
|
11 |
-
import parse from 'html-react-parser';
|
12 |
-
|
13 |
-
interface renderBlockProps {
|
14 |
-
// Parent Block Name. Used for inner block component mapping.
|
15 |
-
blockName: string;
|
16 |
-
// Map of block names to block components for children.
|
17 |
-
blockMap: Record< string, React.ReactNode >;
|
18 |
-
// Wrapper for inner components.
|
19 |
-
blockWrapper?: React.ReactNode;
|
20 |
-
}
|
21 |
-
|
22 |
-
interface renderParentBlockProps extends renderBlockProps {
|
23 |
-
// React component to use as a replacement.
|
24 |
-
Block: React.FunctionComponent;
|
25 |
-
// CSS selector to match the elements to replace.
|
26 |
-
selector: string;
|
27 |
-
// Function to generate the props object for the block.
|
28 |
-
getProps: ( el: Element, i: number ) => Record< string, unknown >;
|
29 |
-
}
|
30 |
-
|
31 |
-
interface renderInnerBlockProps extends renderBlockProps {
|
32 |
-
children: HTMLCollection;
|
33 |
-
depth?: number;
|
34 |
-
}
|
35 |
-
|
36 |
-
/**
|
37 |
-
* Replaces saved block HTML markup with Inner Block Components.
|
38 |
-
*/
|
39 |
-
const renderInnerBlocks = ( {
|
40 |
-
blockName: parentBlockName,
|
41 |
-
blockMap,
|
42 |
-
blockWrapper,
|
43 |
-
depth = 1,
|
44 |
-
children,
|
45 |
-
}: renderInnerBlockProps ): ( JSX.Element | null )[] | null => {
|
46 |
-
return Array.from( children ).map( ( el: Element, index: number ) => {
|
47 |
-
const { blockName = '', ...componentProps } = {
|
48 |
-
key: `${ parentBlockName }_${ depth }_${ index }`,
|
49 |
-
...( el instanceof HTMLElement ? el.dataset : {} ),
|
50 |
-
};
|
51 |
-
|
52 |
-
const componentChildren =
|
53 |
-
el.children && el.children.length
|
54 |
-
? renderInnerBlocks( {
|
55 |
-
children: el.children,
|
56 |
-
blockName: parentBlockName,
|
57 |
-
blockMap,
|
58 |
-
depth: depth + 1,
|
59 |
-
blockWrapper,
|
60 |
-
} )
|
61 |
-
: null;
|
62 |
-
|
63 |
-
const LayoutComponent =
|
64 |
-
blockName && blockMap[ blockName ]
|
65 |
-
? ( blockMap[ blockName ] as React.ElementType )
|
66 |
-
: null;
|
67 |
-
|
68 |
-
if ( ! LayoutComponent ) {
|
69 |
-
const element = parse( el.outerHTML );
|
70 |
-
|
71 |
-
if ( isValidElement( element ) ) {
|
72 |
-
return componentChildren
|
73 |
-
? cloneElement( element, componentProps, componentChildren )
|
74 |
-
: cloneElement( element, componentProps );
|
75 |
-
}
|
76 |
-
return null;
|
77 |
-
}
|
78 |
-
|
79 |
-
const LayoutComponentWrapper = ( blockWrapper
|
80 |
-
? blockWrapper
|
81 |
-
: Fragment ) as React.ElementType;
|
82 |
-
|
83 |
-
return (
|
84 |
-
<Suspense
|
85 |
-
key={ `${ parentBlockName }_${ depth }_${ index }_suspense` }
|
86 |
-
fallback={ <div className="wc-block-placeholder" /> }
|
87 |
-
>
|
88 |
-
<LayoutComponentWrapper>
|
89 |
-
<LayoutComponent { ...componentProps }>
|
90 |
-
{ componentChildren }
|
91 |
-
</LayoutComponent>
|
92 |
-
</LayoutComponentWrapper>
|
93 |
-
</Suspense>
|
94 |
-
);
|
95 |
-
} );
|
96 |
-
};
|
97 |
-
|
98 |
-
/**
|
99 |
-
* Renders a block component in the place of a specified set of selectors.
|
100 |
-
*/
|
101 |
-
export const renderParentBlock = ( {
|
102 |
-
Block,
|
103 |
-
selector,
|
104 |
-
blockName,
|
105 |
-
getProps = () => ( {} ),
|
106 |
-
blockMap,
|
107 |
-
blockWrapper,
|
108 |
-
}: renderParentBlockProps ): void => {
|
109 |
-
const getPropsWithChildren = ( el: Element, i: number ) => {
|
110 |
-
const children =
|
111 |
-
el.children && el.children.length
|
112 |
-
? renderInnerBlocks( {
|
113 |
-
blockName,
|
114 |
-
blockMap,
|
115 |
-
children: el.children,
|
116 |
-
blockWrapper,
|
117 |
-
} )
|
118 |
-
: null;
|
119 |
-
return { ...getProps( el, i ), children };
|
120 |
-
};
|
121 |
-
renderFrontend( {
|
122 |
-
Block,
|
123 |
-
selector,
|
124 |
-
getProps: getPropsWithChildren,
|
125 |
-
} );
|
126 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/block-error-boundary/block-error.js
CHANGED
@@ -2,11 +2,11 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
|
|
5 |
import PropTypes from 'prop-types';
|
6 |
-
import { WC_BLOCKS_IMAGE_URL } from '@woocommerce/block-settings';
|
7 |
|
8 |
const BlockError = ( {
|
9 |
-
imageUrl = `${
|
10 |
header = __( 'Oops!', 'woo-gutenberg-products-block' ),
|
11 |
text = __(
|
12 |
'There was an error loading the content.',
|
@@ -14,7 +14,6 @@ const BlockError = ( {
|
|
14 |
),
|
15 |
errorMessage,
|
16 |
errorMessagePrefix = __( 'Error:', 'woo-gutenberg-products-block' ),
|
17 |
-
button,
|
18 |
} ) => {
|
19 |
return (
|
20 |
<div className="wc-block-error wc-block-components-error">
|
@@ -42,11 +41,6 @@ const BlockError = ( {
|
|
42 |
{ errorMessage }
|
43 |
</p>
|
44 |
) }
|
45 |
-
{ button && (
|
46 |
-
<p className="wc-block-error__button wc-block-components-error__button">
|
47 |
-
{ button }
|
48 |
-
</p>
|
49 |
-
) }
|
50 |
</div>
|
51 |
</div>
|
52 |
);
|
@@ -79,10 +73,6 @@ BlockError.propTypes = {
|
|
79 |
* Text preceeding the error message.
|
80 |
*/
|
81 |
errorMessagePrefix: PropTypes.string,
|
82 |
-
/**
|
83 |
-
* Button cta.
|
84 |
-
*/
|
85 |
-
button: PropTypes.node,
|
86 |
};
|
87 |
|
88 |
export default BlockError;
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
+
import { WC_BLOCKS_ASSET_URL } from '@woocommerce/block-settings';
|
6 |
import PropTypes from 'prop-types';
|
|
|
7 |
|
8 |
const BlockError = ( {
|
9 |
+
imageUrl = `${ WC_BLOCKS_ASSET_URL }img/block-error.svg`,
|
10 |
header = __( 'Oops!', 'woo-gutenberg-products-block' ),
|
11 |
text = __(
|
12 |
'There was an error loading the content.',
|
14 |
),
|
15 |
errorMessage,
|
16 |
errorMessagePrefix = __( 'Error:', 'woo-gutenberg-products-block' ),
|
|
|
17 |
} ) => {
|
18 |
return (
|
19 |
<div className="wc-block-error wc-block-components-error">
|
41 |
{ errorMessage }
|
42 |
</p>
|
43 |
) }
|
|
|
|
|
|
|
|
|
|
|
44 |
</div>
|
45 |
</div>
|
46 |
);
|
73 |
* Text preceeding the error message.
|
74 |
*/
|
75 |
errorMessagePrefix: PropTypes.string,
|
|
|
|
|
|
|
|
|
76 |
};
|
77 |
|
78 |
export default BlockError;
|
assets/js/base/components/block-error-boundary/index.js
CHANGED
@@ -40,7 +40,6 @@ class BlockErrorBoundary extends Component {
|
|
40 |
text,
|
41 |
errorMessagePrefix,
|
42 |
renderError,
|
43 |
-
button,
|
44 |
} = this.props;
|
45 |
const { errorMessage, hasError } = this.state;
|
46 |
|
@@ -55,7 +54,6 @@ class BlockErrorBoundary extends Component {
|
|
55 |
imageUrl={ imageUrl }
|
56 |
text={ text }
|
57 |
errorMessagePrefix={ errorMessagePrefix }
|
58 |
-
button={ button }
|
59 |
/>
|
60 |
);
|
61 |
}
|
40 |
text,
|
41 |
errorMessagePrefix,
|
42 |
renderError,
|
|
|
43 |
} = this.props;
|
44 |
const { errorMessage, hasError } = this.state;
|
45 |
|
54 |
imageUrl={ imageUrl }
|
55 |
text={ text }
|
56 |
errorMessagePrefix={ errorMessagePrefix }
|
|
|
57 |
/>
|
58 |
);
|
59 |
}
|
assets/js/base/components/block-error-boundary/style.scss
CHANGED
@@ -1,34 +1,37 @@
|
|
1 |
.wc-block-components-error {
|
2 |
display: flex;
|
3 |
-
|
4 |
-
|
|
|
5 |
align-items: center;
|
6 |
justify-content: center;
|
7 |
flex-direction: column;
|
8 |
color: $gray-700;
|
9 |
-
text-align: center;
|
10 |
}
|
|
|
11 |
.wc-block-components-error__header {
|
12 |
@include font-size(larger);
|
|
|
13 |
margin: 0;
|
14 |
-
color: $studio-gray-50;
|
15 |
}
|
|
|
16 |
.wc-block-components-error__image {
|
17 |
-
width: 25%;
|
18 |
-
margin: 0 0 $gap-large 0;
|
19 |
}
|
20 |
.wc-block-components-error__text {
|
21 |
-
margin:
|
22 |
-
color: $studio-gray-30;
|
23 |
-
@include font-size(large);
|
24 |
-
max-width: 60ch;
|
25 |
}
|
26 |
.wc-block-components-error__message {
|
27 |
-
margin: 1em 0 0;
|
28 |
font-style: italic;
|
29 |
-
color: $studio-gray-30;
|
30 |
-
max-width: 60ch;
|
31 |
}
|
32 |
-
|
33 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
}
|
1 |
.wc-block-components-error {
|
2 |
display: flex;
|
3 |
+
background-color: $gray-100;
|
4 |
+
border-left: 4px solid $gray-300;
|
5 |
+
padding: $gap-larger $gap;
|
6 |
align-items: center;
|
7 |
justify-content: center;
|
8 |
flex-direction: column;
|
9 |
color: $gray-700;
|
|
|
10 |
}
|
11 |
+
|
12 |
.wc-block-components-error__header {
|
13 |
@include font-size(larger);
|
14 |
+
font-weight: bold;
|
15 |
margin: 0;
|
|
|
16 |
}
|
17 |
+
|
18 |
.wc-block-components-error__image {
|
19 |
+
max-width: 25%;
|
|
|
20 |
}
|
21 |
.wc-block-components-error__text {
|
22 |
+
margin: 0;
|
|
|
|
|
|
|
23 |
}
|
24 |
.wc-block-components-error__message {
|
25 |
+
margin: 1em 0 0 0;
|
26 |
font-style: italic;
|
|
|
|
|
27 |
}
|
28 |
+
|
29 |
+
@include breakpoint(">480px") {
|
30 |
+
.wc-block-components-error {
|
31 |
+
flex-direction: row;
|
32 |
+
}
|
33 |
+
|
34 |
+
.wc-block-components-error__image + .wc-block-components-error__content {
|
35 |
+
margin-left: $gap-large;
|
36 |
+
}
|
37 |
}
|
assets/js/base/components/button/index.js
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { Button as WPButton } from 'wordpress-components';
|
5 |
+
import PropTypes from 'prop-types';
|
6 |
+
import classNames from 'classnames';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Internal dependencies
|
10 |
+
*/
|
11 |
+
import './style.scss';
|
12 |
+
|
13 |
+
/** @typedef {import('react')} React */
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Component that visually renders a button but semantically might be `<button>` or `<a>` depending
|
17 |
+
* on the props.
|
18 |
+
*
|
19 |
+
* @param {Object} props Incoming props for the component.
|
20 |
+
* @param {string} props.className CSS classname used.
|
21 |
+
* @param {boolean} props.showSpinner Whether to show spinner or not.
|
22 |
+
* @param {React.ReactChildren} props.children Child components passed in.
|
23 |
+
* @param {Object} props.props Rest of incoming props.
|
24 |
+
*/
|
25 |
+
const Button = ( { className, showSpinner = false, children, ...props } ) => {
|
26 |
+
const buttonClassName = classNames(
|
27 |
+
'wc-block-components-button',
|
28 |
+
className,
|
29 |
+
{
|
30 |
+
'wc-block-components-button--loading': showSpinner,
|
31 |
+
}
|
32 |
+
);
|
33 |
+
|
34 |
+
return (
|
35 |
+
<WPButton className={ buttonClassName } { ...props }>
|
36 |
+
{ showSpinner && (
|
37 |
+
<span
|
38 |
+
className="wc-block-components-button__spinner"
|
39 |
+
aria-hidden="true"
|
40 |
+
/>
|
41 |
+
) }
|
42 |
+
<span className="wc-block-components-button__text">
|
43 |
+
{ children }
|
44 |
+
</span>
|
45 |
+
</WPButton>
|
46 |
+
);
|
47 |
+
};
|
48 |
+
|
49 |
+
Button.propTypes = {
|
50 |
+
className: PropTypes.string,
|
51 |
+
showSpinner: PropTypes.bool,
|
52 |
+
children: PropTypes.node,
|
53 |
+
};
|
54 |
+
|
55 |
+
export default Button;
|
assets/js/base/components/button/index.tsx
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { Button as WPButton } from 'wordpress-components';
|
5 |
-
import type { ReactNode } from 'react';
|
6 |
-
import classNames from 'classnames';
|
7 |
-
import Spinner from '@woocommerce/base-components/spinner';
|
8 |
-
|
9 |
-
/**
|
10 |
-
* Internal dependencies
|
11 |
-
*/
|
12 |
-
import './style.scss';
|
13 |
-
|
14 |
-
interface ButtonProps extends WPButton.ButtonProps {
|
15 |
-
className?: string;
|
16 |
-
showSpinner?: boolean;
|
17 |
-
children?: ReactNode;
|
18 |
-
}
|
19 |
-
|
20 |
-
/**
|
21 |
-
* Component that visually renders a button but semantically might be `<button>` or `<a>` depending
|
22 |
-
* on the props.
|
23 |
-
*/
|
24 |
-
const Button = ( {
|
25 |
-
className,
|
26 |
-
showSpinner = false,
|
27 |
-
children,
|
28 |
-
...props
|
29 |
-
}: ButtonProps ): JSX.Element => {
|
30 |
-
const buttonClassName = classNames(
|
31 |
-
'wc-block-components-button',
|
32 |
-
className,
|
33 |
-
{
|
34 |
-
'wc-block-components-button--loading': showSpinner,
|
35 |
-
}
|
36 |
-
);
|
37 |
-
|
38 |
-
return (
|
39 |
-
<WPButton className={ buttonClassName } { ...props }>
|
40 |
-
{ showSpinner && <Spinner /> }
|
41 |
-
<span className="wc-block-components-button__text">
|
42 |
-
{ children }
|
43 |
-
</span>
|
44 |
-
</WPButton>
|
45 |
-
);
|
46 |
-
};
|
47 |
-
|
48 |
-
export default Button;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/button/style.scss
CHANGED
@@ -29,7 +29,45 @@
|
|
29 |
fill: currentColor;
|
30 |
}
|
31 |
}
|
32 |
-
.wc-block-components-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
visibility: hidden;
|
34 |
}
|
35 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
fill: currentColor;
|
30 |
}
|
31 |
}
|
32 |
+
.wc-block-components-button__spinner {
|
33 |
+
width: 1em;
|
34 |
+
height: 1em;
|
35 |
+
position: absolute;
|
36 |
+
top: 50%;
|
37 |
+
left: 0;
|
38 |
+
width: 100%;
|
39 |
+
height: 100%;
|
40 |
+
margin-top: -0.5em;
|
41 |
+
color: inherit;
|
42 |
+
box-sizing: content-box;
|
43 |
+
|
44 |
+
&::after {
|
45 |
+
content: " ";
|
46 |
+
display: inline-block;
|
47 |
+
margin: 0 auto;
|
48 |
+
width: 1em;
|
49 |
+
height: 1em;
|
50 |
+
box-sizing: border-box;
|
51 |
+
transform-origin: 50% 50%;
|
52 |
+
transform: translateZ(0) scale(0.5);
|
53 |
+
backface-visibility: hidden;
|
54 |
+
border-radius: 50%;
|
55 |
+
border: 0.2em solid currentColor;
|
56 |
+
border-left-color: transparent;
|
57 |
+
animation: wc-block-components-button__spinner__animation 1s infinite linear;
|
58 |
+
}
|
59 |
+
}
|
60 |
+
.wc-block-components-button__spinner + .wc-block-components-button__text {
|
61 |
visibility: hidden;
|
62 |
}
|
63 |
}
|
64 |
+
|
65 |
+
@keyframes wc-block-components-button__spinner__animation {
|
66 |
+
0% {
|
67 |
+
animation-timing-function: cubic-bezier(0.5856, 0.0703, 0.4143, 0.9297);
|
68 |
+
transform: rotate(0deg);
|
69 |
+
}
|
70 |
+
100% {
|
71 |
+
transform: rotate(360deg);
|
72 |
+
}
|
73 |
+
}
|
assets/js/base/components/cart-checkout/address-form/{address-form.tsx → address-form.js}
RENAMED
@@ -12,31 +12,24 @@ import {
|
|
12 |
ShippingStateInput,
|
13 |
} from '@woocommerce/base-components/state-input';
|
14 |
import { useValidationContext } from '@woocommerce/base-context';
|
15 |
-
import { useEffect
|
16 |
import { __ } from '@wordpress/i18n';
|
17 |
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
18 |
-
import { useShallowEqual } from '@woocommerce/base-hooks';
|
19 |
-
import {
|
20 |
-
AddressField,
|
21 |
-
AddressFields,
|
22 |
-
AddressType,
|
23 |
-
defaultAddressFields,
|
24 |
-
EnteredAddress,
|
25 |
-
} from '@woocommerce/settings';
|
26 |
|
27 |
/**
|
28 |
* Internal dependencies
|
29 |
*/
|
30 |
-
import
|
|
|
31 |
|
32 |
// If it's the shipping address form and the user starts entering address
|
33 |
// values without having set the country first, show an error.
|
34 |
const validateShippingCountry = (
|
35 |
-
values
|
36 |
-
setValidationErrors
|
37 |
-
clearValidationError
|
38 |
-
hasValidationError
|
39 |
-
)
|
40 |
if (
|
41 |
! hasValidationError &&
|
42 |
! values.country &&
|
@@ -57,15 +50,6 @@ const validateShippingCountry = (
|
|
57 |
}
|
58 |
};
|
59 |
|
60 |
-
interface AddressFormProps {
|
61 |
-
id: string;
|
62 |
-
instanceId: string;
|
63 |
-
fields: ( keyof AddressFields )[];
|
64 |
-
fieldConfig: Record< keyof AddressFields, Partial< AddressField > >;
|
65 |
-
onChange: ( newValue: EnteredAddress ) => void;
|
66 |
-
type: AddressType;
|
67 |
-
values: EnteredAddress;
|
68 |
-
}
|
69 |
/**
|
70 |
* Checkout address form.
|
71 |
*
|
@@ -80,45 +64,37 @@ interface AddressFormProps {
|
|
80 |
*/
|
81 |
const AddressForm = ( {
|
82 |
id,
|
83 |
-
fields =
|
84 |
-
|
85 |
-
) as unknown ) as ( keyof AddressFields )[],
|
86 |
-
fieldConfig = {} as Record< keyof AddressFields, Partial< AddressField > >,
|
87 |
instanceId,
|
88 |
onChange,
|
89 |
type = 'shipping',
|
90 |
values,
|
91 |
-
}
|
92 |
const {
|
93 |
getValidationError,
|
94 |
setValidationErrors,
|
95 |
clearValidationError,
|
96 |
} = useValidationContext();
|
97 |
-
|
98 |
-
const
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
const
|
108 |
-
|
109 |
-
currentFields,
|
110 |
-
fieldConfig,
|
111 |
-
values.country
|
112 |
-
);
|
113 |
-
}, [ currentFields, fieldConfig, values.country ] );
|
114 |
-
|
115 |
useEffect( () => {
|
116 |
if ( type === 'shipping' ) {
|
117 |
validateShippingCountry(
|
118 |
values,
|
119 |
setValidationErrors,
|
120 |
clearValidationError,
|
121 |
-
|
122 |
! countryValidationError.hidden
|
123 |
);
|
124 |
}
|
@@ -135,7 +111,7 @@ const AddressForm = ( {
|
|
135 |
|
136 |
return (
|
137 |
<div id={ id } className="wc-block-components-address-form">
|
138 |
-
{
|
139 |
if ( field.hidden ) {
|
140 |
return null;
|
141 |
}
|
@@ -216,7 +192,7 @@ const AddressForm = ( {
|
|
216 |
value={ values[ field.key ] }
|
217 |
autoCapitalize={ field.autocapitalize }
|
218 |
autoComplete={ field.autocomplete }
|
219 |
-
onChange={ ( newValue
|
220 |
onChange( {
|
221 |
...values,
|
222 |
[ field.key ]: newValue,
|
12 |
ShippingStateInput,
|
13 |
} from '@woocommerce/base-components/state-input';
|
14 |
import { useValidationContext } from '@woocommerce/base-context';
|
15 |
+
import { useEffect } from '@wordpress/element';
|
16 |
import { __ } from '@wordpress/i18n';
|
17 |
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
/**
|
20 |
* Internal dependencies
|
21 |
*/
|
22 |
+
import defaultAddressFields from './default-address-fields';
|
23 |
+
import countryAddressFields from './country-address-fields';
|
24 |
|
25 |
// If it's the shipping address form and the user starts entering address
|
26 |
// values without having set the country first, show an error.
|
27 |
const validateShippingCountry = (
|
28 |
+
values,
|
29 |
+
setValidationErrors,
|
30 |
+
clearValidationError,
|
31 |
+
hasValidationError
|
32 |
+
) => {
|
33 |
if (
|
34 |
! hasValidationError &&
|
35 |
! values.country &&
|
50 |
}
|
51 |
};
|
52 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
/**
|
54 |
* Checkout address form.
|
55 |
*
|
64 |
*/
|
65 |
const AddressForm = ( {
|
66 |
id,
|
67 |
+
fields = Object.keys( defaultAddressFields ),
|
68 |
+
fieldConfig = {},
|
|
|
|
|
69 |
instanceId,
|
70 |
onChange,
|
71 |
type = 'shipping',
|
72 |
values,
|
73 |
+
} ) => {
|
74 |
const {
|
75 |
getValidationError,
|
76 |
setValidationErrors,
|
77 |
clearValidationError,
|
78 |
} = useValidationContext();
|
79 |
+
const countryLocale = countryAddressFields[ values.country ] || {};
|
80 |
+
const addressFields = fields.map( ( field ) => ( {
|
81 |
+
key: field,
|
82 |
+
...defaultAddressFields[ field ],
|
83 |
+
...countryLocale[ field ],
|
84 |
+
...fieldConfig[ field ],
|
85 |
+
} ) );
|
86 |
+
const sortedAddressFields = addressFields.sort(
|
87 |
+
( a, b ) => a.index - b.index
|
88 |
+
);
|
89 |
+
const countryValidationError =
|
90 |
+
getValidationError( 'shipping-missing-country' ) || {};
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
useEffect( () => {
|
92 |
if ( type === 'shipping' ) {
|
93 |
validateShippingCountry(
|
94 |
values,
|
95 |
setValidationErrors,
|
96 |
clearValidationError,
|
97 |
+
countryValidationError.message &&
|
98 |
! countryValidationError.hidden
|
99 |
);
|
100 |
}
|
111 |
|
112 |
return (
|
113 |
<div id={ id } className="wc-block-components-address-form">
|
114 |
+
{ sortedAddressFields.map( ( field ) => {
|
115 |
if ( field.hidden ) {
|
116 |
return null;
|
117 |
}
|
192 |
value={ values[ field.key ] }
|
193 |
autoCapitalize={ field.autocapitalize }
|
194 |
autoComplete={ field.autocomplete }
|
195 |
+
onChange={ ( newValue ) =>
|
196 |
onChange( {
|
197 |
...values,
|
198 |
[ field.key ]: newValue,
|
assets/js/base/components/cart-checkout/address-form/country-address-fields.js
ADDED
@@ -0,0 +1,546 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/** @typedef { import('@woocommerce/type-defs/address-fields').CountryAddressFields } CountryAddressFields */
|
2 |
+
/** @typedef { import('@woocommerce/type-defs/address-fields').AddressFieldKey } AddressFieldKey */
|
3 |
+
/** @typedef { import('@woocommerce/type-defs/address-fields').AddressField } AddressField */
|
4 |
+
|
5 |
+
/**
|
6 |
+
* External dependencies
|
7 |
+
*/
|
8 |
+
import { __ } from '@wordpress/i18n';
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Used to render postcode before the city field.
|
12 |
+
*
|
13 |
+
* @type {Object <AddressFieldKey, AddressField>}
|
14 |
+
*/
|
15 |
+
const postcodeBeforeCity = {
|
16 |
+
city: {
|
17 |
+
index: 9,
|
18 |
+
},
|
19 |
+
postcode: {
|
20 |
+
index: 7,
|
21 |
+
},
|
22 |
+
};
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Used to make the state field optional.
|
26 |
+
*
|
27 |
+
* @type {Object <AddressFieldKey, AddressField>}
|
28 |
+
*/
|
29 |
+
const optionalState = {
|
30 |
+
state: {
|
31 |
+
required: false,
|
32 |
+
},
|
33 |
+
};
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Used to hide the state field.
|
37 |
+
*
|
38 |
+
* @type {Object <AddressFieldKey, AddressField>}
|
39 |
+
*/
|
40 |
+
const hiddenState = {
|
41 |
+
state: {
|
42 |
+
required: false,
|
43 |
+
hidden: true,
|
44 |
+
},
|
45 |
+
};
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Used to hide the postcode field.
|
49 |
+
*
|
50 |
+
* @type {Object <AddressFieldKey, AddressField>}
|
51 |
+
*/
|
52 |
+
const hiddenPostcode = {
|
53 |
+
postcode: {
|
54 |
+
required: false,
|
55 |
+
hidden: true,
|
56 |
+
},
|
57 |
+
};
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Country specific address field properties.
|
61 |
+
*
|
62 |
+
* @type {CountryAddressFields}
|
63 |
+
*/
|
64 |
+
const countryAddressFields = {
|
65 |
+
AE: {
|
66 |
+
...hiddenPostcode,
|
67 |
+
...optionalState,
|
68 |
+
},
|
69 |
+
AF: hiddenState,
|
70 |
+
AO: {
|
71 |
+
...hiddenPostcode,
|
72 |
+
state: {
|
73 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
74 |
+
optionalLabel: __(
|
75 |
+
'Province (optional)',
|
76 |
+
'woo-gutenberg-products-block'
|
77 |
+
),
|
78 |
+
},
|
79 |
+
},
|
80 |
+
AT: {
|
81 |
+
...postcodeBeforeCity,
|
82 |
+
...hiddenState,
|
83 |
+
},
|
84 |
+
AU: {
|
85 |
+
city: {
|
86 |
+
label: __( 'Suburb', 'woo-gutenberg-products-block' ),
|
87 |
+
optionalLabel: __(
|
88 |
+
'Suburb (optional)',
|
89 |
+
'woo-gutenberg-products-block'
|
90 |
+
),
|
91 |
+
},
|
92 |
+
postcode: {
|
93 |
+
label: __( 'Postcode', 'woo-gutenberg-products-block' ),
|
94 |
+
optionalLabel: __(
|
95 |
+
'Postcode (optional)',
|
96 |
+
'woo-gutenberg-products-block'
|
97 |
+
),
|
98 |
+
},
|
99 |
+
state: {
|
100 |
+
label: __( 'State', 'woo-gutenberg-products-block' ),
|
101 |
+
optionalLabel: __(
|
102 |
+
'State (optional)',
|
103 |
+
'woo-gutenberg-products-block'
|
104 |
+
),
|
105 |
+
},
|
106 |
+
},
|
107 |
+
AX: {
|
108 |
+
...postcodeBeforeCity,
|
109 |
+
...hiddenState,
|
110 |
+
},
|
111 |
+
BD: {
|
112 |
+
postcode: {
|
113 |
+
required: false,
|
114 |
+
},
|
115 |
+
state: {
|
116 |
+
label: __( 'District', 'woo-gutenberg-products-block' ),
|
117 |
+
optionalLabel: __(
|
118 |
+
'District (optional)',
|
119 |
+
'woo-gutenberg-products-block'
|
120 |
+
),
|
121 |
+
},
|
122 |
+
},
|
123 |
+
BE: {
|
124 |
+
...postcodeBeforeCity,
|
125 |
+
...hiddenState,
|
126 |
+
},
|
127 |
+
BH: {
|
128 |
+
postcode: {
|
129 |
+
required: false,
|
130 |
+
},
|
131 |
+
...hiddenState,
|
132 |
+
},
|
133 |
+
BI: hiddenState,
|
134 |
+
BO: hiddenPostcode,
|
135 |
+
BS: hiddenPostcode,
|
136 |
+
CA: {
|
137 |
+
state: {
|
138 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
139 |
+
optionalLabel: __(
|
140 |
+
'Province (optional)',
|
141 |
+
'woo-gutenberg-products-block'
|
142 |
+
),
|
143 |
+
},
|
144 |
+
},
|
145 |
+
CH: {
|
146 |
+
...postcodeBeforeCity,
|
147 |
+
state: {
|
148 |
+
label: __( 'Canton', 'woo-gutenberg-products-block' ),
|
149 |
+
optionalLabel: __(
|
150 |
+
'Canton (optional)',
|
151 |
+
'woo-gutenberg-products-block'
|
152 |
+
),
|
153 |
+
required: false,
|
154 |
+
},
|
155 |
+
},
|
156 |
+
CL: {
|
157 |
+
city: {
|
158 |
+
require: true,
|
159 |
+
},
|
160 |
+
postcode: {
|
161 |
+
required: false,
|
162 |
+
},
|
163 |
+
state: {
|
164 |
+
label: __( 'Region', 'woo-gutenberg-products-block' ),
|
165 |
+
optionalLabel: __(
|
166 |
+
'Region (optional)',
|
167 |
+
'woo-gutenberg-products-block'
|
168 |
+
),
|
169 |
+
},
|
170 |
+
},
|
171 |
+
CN: {
|
172 |
+
state: {
|
173 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
174 |
+
optionalLabel: __(
|
175 |
+
'Province (optional)',
|
176 |
+
'woo-gutenberg-products-block'
|
177 |
+
),
|
178 |
+
},
|
179 |
+
},
|
180 |
+
CO: {
|
181 |
+
postcode: {
|
182 |
+
required: false,
|
183 |
+
},
|
184 |
+
},
|
185 |
+
CZ: hiddenState,
|
186 |
+
DE: {
|
187 |
+
...postcodeBeforeCity,
|
188 |
+
...hiddenState,
|
189 |
+
},
|
190 |
+
DK: {
|
191 |
+
...postcodeBeforeCity,
|
192 |
+
...hiddenState,
|
193 |
+
},
|
194 |
+
EE: {
|
195 |
+
...postcodeBeforeCity,
|
196 |
+
...hiddenState,
|
197 |
+
},
|
198 |
+
ES: {
|
199 |
+
...postcodeBeforeCity,
|
200 |
+
state: {
|
201 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
202 |
+
optionalLabel: __(
|
203 |
+
'Province (optional)',
|
204 |
+
'woo-gutenberg-products-block'
|
205 |
+
),
|
206 |
+
},
|
207 |
+
},
|
208 |
+
FI: {
|
209 |
+
...postcodeBeforeCity,
|
210 |
+
...hiddenState,
|
211 |
+
},
|
212 |
+
FR: {
|
213 |
+
...postcodeBeforeCity,
|
214 |
+
...hiddenState,
|
215 |
+
},
|
216 |
+
GB: {
|
217 |
+
postcode: {
|
218 |
+
label: __( 'Postcode', 'woo-gutenberg-products-block' ),
|
219 |
+
optionalLabel: __(
|
220 |
+
'Postcode (optional)',
|
221 |
+
'woo-gutenberg-products-block'
|
222 |
+
),
|
223 |
+
},
|
224 |
+
state: {
|
225 |
+
label: __( 'County', 'woo-gutenberg-products-block' ),
|
226 |
+
optionalLabel: __(
|
227 |
+
'County (optional)',
|
228 |
+
'woo-gutenberg-products-block'
|
229 |
+
),
|
230 |
+
},
|
231 |
+
},
|
232 |
+
GP: hiddenState,
|
233 |
+
GF: hiddenState,
|
234 |
+
GR: optionalState,
|
235 |
+
HK: {
|
236 |
+
postcode: {
|
237 |
+
required: false,
|
238 |
+
},
|
239 |
+
city: {
|
240 |
+
label: __( 'Town/District', 'woo-gutenberg-products-block' ),
|
241 |
+
optionalLabel: __(
|
242 |
+
'Town/District (optional)',
|
243 |
+
'woo-gutenberg-products-block'
|
244 |
+
),
|
245 |
+
},
|
246 |
+
state: {
|
247 |
+
label: __( 'Region', 'woo-gutenberg-products-block' ),
|
248 |
+
optionalLabel: __(
|
249 |
+
'Region (optional)',
|
250 |
+
'woo-gutenberg-products-block'
|
251 |
+
),
|
252 |
+
},
|
253 |
+
},
|
254 |
+
HU: {
|
255 |
+
state: {
|
256 |
+
label: __( 'County', 'woo-gutenberg-products-block' ),
|
257 |
+
optionalLabel: __(
|
258 |
+
'County (optional)',
|
259 |
+
'woo-gutenberg-products-block'
|
260 |
+
),
|
261 |
+
},
|
262 |
+
},
|
263 |
+
ID: {
|
264 |
+
state: {
|
265 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
266 |
+
optionalLabel: __(
|
267 |
+
'Province (optional)',
|
268 |
+
'woo-gutenberg-products-block'
|
269 |
+
),
|
270 |
+
},
|
271 |
+
},
|
272 |
+
IE: {
|
273 |
+
postcode: {
|
274 |
+
label: __( 'Eircode', 'woo-gutenberg-products-block' ),
|
275 |
+
optionalLabel: __(
|
276 |
+
'Eircode (optional)',
|
277 |
+
'woo-gutenberg-products-block'
|
278 |
+
),
|
279 |
+
required: false,
|
280 |
+
},
|
281 |
+
state: {
|
282 |
+
label: __( 'County', 'woo-gutenberg-products-block' ),
|
283 |
+
optionalLabel: __(
|
284 |
+
'County (optional)',
|
285 |
+
'woo-gutenberg-products-block'
|
286 |
+
),
|
287 |
+
},
|
288 |
+
},
|
289 |
+
IS: {
|
290 |
+
...postcodeBeforeCity,
|
291 |
+
...hiddenState,
|
292 |
+
},
|
293 |
+
IL: {
|
294 |
+
...postcodeBeforeCity,
|
295 |
+
...hiddenState,
|
296 |
+
},
|
297 |
+
IM: hiddenState,
|
298 |
+
IT: {
|
299 |
+
...postcodeBeforeCity,
|
300 |
+
state: {
|
301 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
302 |
+
optionalLabel: __(
|
303 |
+
'Province (optional)',
|
304 |
+
'woo-gutenberg-products-block'
|
305 |
+
),
|
306 |
+
},
|
307 |
+
},
|
308 |
+
JP: {
|
309 |
+
first_name: {
|
310 |
+
index: 2,
|
311 |
+
},
|
312 |
+
last_name: {
|
313 |
+
index: 1,
|
314 |
+
},
|
315 |
+
address_1: {
|
316 |
+
index: 7,
|
317 |
+
},
|
318 |
+
address_2: {
|
319 |
+
index: 8,
|
320 |
+
},
|
321 |
+
postcode: {
|
322 |
+
index: 4,
|
323 |
+
},
|
324 |
+
city: {
|
325 |
+
index: 6,
|
326 |
+
},
|
327 |
+
state: {
|
328 |
+
label: __( 'Prefecture', 'woo-gutenberg-products-block' ),
|
329 |
+
optionalLabel: __(
|
330 |
+
'Prefecture (optional)',
|
331 |
+
'woo-gutenberg-products-block'
|
332 |
+
),
|
333 |
+
index: 5,
|
334 |
+
},
|
335 |
+
},
|
336 |
+
KR: hiddenState,
|
337 |
+
KW: hiddenState,
|
338 |
+
LB: hiddenState,
|
339 |
+
LI: {
|
340 |
+
...postcodeBeforeCity,
|
341 |
+
state: {
|
342 |
+
label: __( 'Municipality', 'woo-gutenberg-products-block' ),
|
343 |
+
optionalLabel: __(
|
344 |
+
'Municipality (optional)',
|
345 |
+
'woo-gutenberg-products-block'
|
346 |
+
),
|
347 |
+
required: false,
|
348 |
+
},
|
349 |
+
},
|
350 |
+
LK: hiddenState,
|
351 |
+
LU: hiddenState,
|
352 |
+
LV: {
|
353 |
+
state: {
|
354 |
+
label: __( 'Municipality', 'woo-gutenberg-products-block' ),
|
355 |
+
optionalLabel: __(
|
356 |
+
'Municipality (optional)',
|
357 |
+
'woo-gutenberg-products-block'
|
358 |
+
),
|
359 |
+
required: false,
|
360 |
+
},
|
361 |
+
},
|
362 |
+
MQ: hiddenState,
|
363 |
+
MT: hiddenState,
|
364 |
+
MZ: {
|
365 |
+
...hiddenPostcode,
|
366 |
+
state: {
|
367 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
368 |
+
optionalLabel: __(
|
369 |
+
'Province (optional)',
|
370 |
+
'woo-gutenberg-products-block'
|
371 |
+
),
|
372 |
+
},
|
373 |
+
},
|
374 |
+
NL: {
|
375 |
+
...postcodeBeforeCity,
|
376 |
+
...hiddenState,
|
377 |
+
},
|
378 |
+
NG: {
|
379 |
+
...hiddenPostcode,
|
380 |
+
state: {
|
381 |
+
label: __( 'State', 'woo-gutenberg-products-block' ),
|
382 |
+
optionalLabel: __(
|
383 |
+
'State (optional)',
|
384 |
+
'woo-gutenberg-products-block'
|
385 |
+
),
|
386 |
+
},
|
387 |
+
},
|
388 |
+
NO: {
|
389 |
+
...postcodeBeforeCity,
|
390 |
+
...hiddenState,
|
391 |
+
},
|
392 |
+
NP: {
|
393 |
+
postcode: {
|
394 |
+
required: false,
|
395 |
+
},
|
396 |
+
state: {
|
397 |
+
label: __( 'State', 'woo-gutenberg-products-block' ),
|
398 |
+
optionalLabel: __(
|
399 |
+
'State (optional)',
|
400 |
+
'woo-gutenberg-products-block'
|
401 |
+
),
|
402 |
+
},
|
403 |
+
},
|
404 |
+
NZ: {
|
405 |
+
postcode: {
|
406 |
+
label: __( 'Postcode', 'woo-gutenberg-products-block' ),
|
407 |
+
optionalLabel: __(
|
408 |
+
'Postcode (optional)',
|
409 |
+
'woo-gutenberg-products-block'
|
410 |
+
),
|
411 |
+
},
|
412 |
+
state: {
|
413 |
+
label: __( 'Region', 'woo-gutenberg-products-block' ),
|
414 |
+
optionalLabel: __(
|
415 |
+
'Region (optional)',
|
416 |
+
'woo-gutenberg-products-block'
|
417 |
+
),
|
418 |
+
},
|
419 |
+
},
|
420 |
+
PL: {
|
421 |
+
...postcodeBeforeCity,
|
422 |
+
...hiddenState,
|
423 |
+
},
|
424 |
+
PT: hiddenState,
|
425 |
+
RE: hiddenState,
|
426 |
+
RO: {
|
427 |
+
state: {
|
428 |
+
label: __( 'County', 'woo-gutenberg-products-block' ),
|
429 |
+
optionalLabel: __(
|
430 |
+
'County (optional)',
|
431 |
+
'woo-gutenberg-products-block'
|
432 |
+
),
|
433 |
+
},
|
434 |
+
},
|
435 |
+
RS: hiddenState,
|
436 |
+
SE: {
|
437 |
+
...postcodeBeforeCity,
|
438 |
+
...hiddenState,
|
439 |
+
},
|
440 |
+
SG: {
|
441 |
+
city: {
|
442 |
+
required: false,
|
443 |
+
},
|
444 |
+
...hiddenState,
|
445 |
+
},
|
446 |
+
SK: {
|
447 |
+
...postcodeBeforeCity,
|
448 |
+
...hiddenState,
|
449 |
+
},
|
450 |
+
SI: {
|
451 |
+
...postcodeBeforeCity,
|
452 |
+
...hiddenState,
|
453 |
+
},
|
454 |
+
SR: {
|
455 |
+
...hiddenPostcode,
|
456 |
+
},
|
457 |
+
ST: {
|
458 |
+
...hiddenPostcode,
|
459 |
+
state: {
|
460 |
+
label: __( 'District', 'woo-gutenberg-products-block' ),
|
461 |
+
optionalLabel: __(
|
462 |
+
'District (optional)',
|
463 |
+
'woo-gutenberg-products-block'
|
464 |
+
),
|
465 |
+
},
|
466 |
+
},
|
467 |
+
MD: {
|
468 |
+
state: {
|
469 |
+
label: __(
|
470 |
+
'Municipality/District',
|
471 |
+
'woo-gutenberg-products-block'
|
472 |
+
),
|
473 |
+
optionalLabel: __(
|
474 |
+
'Municipality/District (optional)',
|
475 |
+
'woo-gutenberg-products-block'
|
476 |
+
),
|
477 |
+
},
|
478 |
+
},
|
479 |
+
TR: {
|
480 |
+
...postcodeBeforeCity,
|
481 |
+
state: {
|
482 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
483 |
+
optionalLabel: __(
|
484 |
+
'Province (optional)',
|
485 |
+
'woo-gutenberg-products-block'
|
486 |
+
),
|
487 |
+
},
|
488 |
+
},
|
489 |
+
UG: {
|
490 |
+
...hiddenPostcode,
|
491 |
+
city: {
|
492 |
+
label: __( 'Town/Village', 'woo-gutenberg-products-block' ),
|
493 |
+
optionalLabel: __(
|
494 |
+
'Town/Village (optional)',
|
495 |
+
'woo-gutenberg-products-block'
|
496 |
+
),
|
497 |
+
},
|
498 |
+
state: {
|
499 |
+
label: __( 'District', 'woo-gutenberg-products-block' ),
|
500 |
+
optionalLabel: __(
|
501 |
+
'District (optional)',
|
502 |
+
'woo-gutenberg-products-block'
|
503 |
+
),
|
504 |
+
},
|
505 |
+
},
|
506 |
+
US: {
|
507 |
+
postcode: {
|
508 |
+
label: __( 'ZIP', 'woo-gutenberg-products-block' ),
|
509 |
+
optionalLabel: __(
|
510 |
+
'ZIP (optional)',
|
511 |
+
'woo-gutenberg-products-block'
|
512 |
+
),
|
513 |
+
},
|
514 |
+
state: {
|
515 |
+
label: __( 'State', 'woo-gutenberg-products-block' ),
|
516 |
+
optionalLabel: __(
|
517 |
+
'State (optional)',
|
518 |
+
'woo-gutenberg-products-block'
|
519 |
+
),
|
520 |
+
},
|
521 |
+
},
|
522 |
+
VN: {
|
523 |
+
city: {
|
524 |
+
index: 8,
|
525 |
+
},
|
526 |
+
postcode: {
|
527 |
+
index: 7,
|
528 |
+
required: false,
|
529 |
+
},
|
530 |
+
...hiddenState,
|
531 |
+
},
|
532 |
+
WS: hiddenPostcode,
|
533 |
+
YT: hiddenState,
|
534 |
+
ZA: {
|
535 |
+
state: {
|
536 |
+
label: __( 'Province', 'woo-gutenberg-products-block' ),
|
537 |
+
optionalLabel: __(
|
538 |
+
'Province (optional)',
|
539 |
+
'woo-gutenberg-products-block'
|
540 |
+
),
|
541 |
+
},
|
542 |
+
},
|
543 |
+
ZW: hiddenPostcode,
|
544 |
+
};
|
545 |
+
|
546 |
+
export default countryAddressFields;
|
assets/js/{settings/shared/default-address-fields.ts → base/components/cart-checkout/address-form/default-address-fields.js}
RENAMED
@@ -1,74 +1,24 @@
|
|
|
|
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
|
6 |
-
export interface AddressField {
|
7 |
-
// The label for the field.
|
8 |
-
label: string;
|
9 |
-
// The label for the field if made optional.
|
10 |
-
optionalLabel: string;
|
11 |
-
// The HTML autocomplete attribute value. See https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
|
12 |
-
autocomplete: string;
|
13 |
-
// How this field value is capitalized.
|
14 |
-
autocapitalize?: string;
|
15 |
-
// Set to true if the field is required.
|
16 |
-
required: boolean;
|
17 |
-
// Set to true if the field should not be rendered.
|
18 |
-
hidden: boolean;
|
19 |
-
// Fields will be sorted and render in this order, lowest to highest.
|
20 |
-
index: number;
|
21 |
-
}
|
22 |
-
|
23 |
-
export interface LocaleSpecificAddressField extends AddressField {
|
24 |
-
priority: number;
|
25 |
-
}
|
26 |
-
|
27 |
-
export interface AddressFields {
|
28 |
-
// eslint-disable-next-line camelcase
|
29 |
-
first_name: AddressField;
|
30 |
-
// eslint-disable-next-line camelcase
|
31 |
-
last_name: AddressField;
|
32 |
-
company: AddressField;
|
33 |
-
// eslint-disable-next-line camelcase
|
34 |
-
address_1: AddressField;
|
35 |
-
// eslint-disable-next-line camelcase
|
36 |
-
address_2: AddressField;
|
37 |
-
country: AddressField;
|
38 |
-
city: AddressField;
|
39 |
-
state: AddressField;
|
40 |
-
postcode: AddressField;
|
41 |
-
}
|
42 |
-
|
43 |
-
export type AddressType = 'billing' | 'shipping';
|
44 |
-
export interface EnteredAddress {
|
45 |
-
// eslint-disable-next-line camelcase
|
46 |
-
first_name: string;
|
47 |
-
// eslint-disable-next-line camelcase
|
48 |
-
last_name: string;
|
49 |
-
company: string;
|
50 |
-
// eslint-disable-next-line camelcase
|
51 |
-
address_1: string;
|
52 |
-
// eslint-disable-next-line camelcase
|
53 |
-
address_2: string;
|
54 |
-
country: string;
|
55 |
-
city: string;
|
56 |
-
state: string;
|
57 |
-
postcode: string;
|
58 |
-
}
|
59 |
-
|
60 |
-
export type KeyedAddressField = AddressField & {
|
61 |
-
key: keyof AddressFields;
|
62 |
-
errorMessage?: string;
|
63 |
-
};
|
64 |
-
export type ShippingAddress = EnteredAddress;
|
65 |
-
export type BillingAddress = EnteredAddress;
|
66 |
-
export type CountryAddressFields = Record< string, AddressFields >;
|
67 |
-
|
68 |
/**
|
69 |
* Default address field properties.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
*/
|
71 |
-
|
72 |
first_name: {
|
73 |
label: __( 'First name', 'woo-gutenberg-products-block' ),
|
74 |
optionalLabel: __(
|
@@ -79,7 +29,7 @@ export const defaultAddressFields: AddressFields = {
|
|
79 |
autocapitalize: 'sentences',
|
80 |
required: true,
|
81 |
hidden: false,
|
82 |
-
index:
|
83 |
},
|
84 |
last_name: {
|
85 |
label: __( 'Last name', 'woo-gutenberg-products-block' ),
|
@@ -91,7 +41,7 @@ export const defaultAddressFields: AddressFields = {
|
|
91 |
autocapitalize: 'sentences',
|
92 |
required: true,
|
93 |
hidden: false,
|
94 |
-
index:
|
95 |
},
|
96 |
company: {
|
97 |
label: __( 'Company', 'woo-gutenberg-products-block' ),
|
@@ -103,7 +53,7 @@ export const defaultAddressFields: AddressFields = {
|
|
103 |
autocapitalize: 'sentences',
|
104 |
required: false,
|
105 |
hidden: false,
|
106 |
-
index:
|
107 |
},
|
108 |
address_1: {
|
109 |
label: __( 'Address', 'woo-gutenberg-products-block' ),
|
@@ -115,7 +65,7 @@ export const defaultAddressFields: AddressFields = {
|
|
115 |
autocapitalize: 'sentences',
|
116 |
required: true,
|
117 |
hidden: false,
|
118 |
-
index:
|
119 |
},
|
120 |
address_2: {
|
121 |
label: __( 'Apartment, suite, etc.', 'woo-gutenberg-products-block' ),
|
@@ -127,7 +77,7 @@ export const defaultAddressFields: AddressFields = {
|
|
127 |
autocapitalize: 'sentences',
|
128 |
required: false,
|
129 |
hidden: false,
|
130 |
-
index:
|
131 |
},
|
132 |
country: {
|
133 |
label: __( 'Country/Region', 'woo-gutenberg-products-block' ),
|
@@ -138,7 +88,7 @@ export const defaultAddressFields: AddressFields = {
|
|
138 |
autocomplete: 'country',
|
139 |
required: true,
|
140 |
hidden: false,
|
141 |
-
index:
|
142 |
},
|
143 |
city: {
|
144 |
label: __( 'City', 'woo-gutenberg-products-block' ),
|
@@ -147,7 +97,7 @@ export const defaultAddressFields: AddressFields = {
|
|
147 |
autocapitalize: 'sentences',
|
148 |
required: true,
|
149 |
hidden: false,
|
150 |
-
index:
|
151 |
},
|
152 |
state: {
|
153 |
label: __( 'State/County', 'woo-gutenberg-products-block' ),
|
@@ -159,7 +109,7 @@ export const defaultAddressFields: AddressFields = {
|
|
159 |
autocapitalize: 'sentences',
|
160 |
required: true,
|
161 |
hidden: false,
|
162 |
-
index:
|
163 |
},
|
164 |
postcode: {
|
165 |
label: __( 'Postal code', 'woo-gutenberg-products-block' ),
|
@@ -171,8 +121,8 @@ export const defaultAddressFields: AddressFields = {
|
|
171 |
autocapitalize: 'characters',
|
172 |
required: true,
|
173 |
hidden: false,
|
174 |
-
index:
|
175 |
},
|
176 |
};
|
177 |
|
178 |
-
export default
|
1 |
+
/** @typedef { import('@woocommerce/type-defs/address-fields').AddressField } AddressField */
|
2 |
+
|
3 |
/**
|
4 |
* External dependencies
|
5 |
*/
|
6 |
import { __ } from '@wordpress/i18n';
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
/**
|
9 |
* Default address field properties.
|
10 |
+
*
|
11 |
+
* @property {AddressField} first_name Customer first name.
|
12 |
+
* @property {AddressField} last_name Customer last name.
|
13 |
+
* @property {AddressField} company Company name.
|
14 |
+
* @property {AddressField} address_1 Street address.
|
15 |
+
* @property {AddressField} address_2 Second line of address.
|
16 |
+
* @property {AddressField} country Country code.
|
17 |
+
* @property {AddressField} city City name.
|
18 |
+
* @property {AddressField} state State name or code.
|
19 |
+
* @property {AddressField} postcode Postal code.
|
20 |
*/
|
21 |
+
const AddressFields = {
|
22 |
first_name: {
|
23 |
label: __( 'First name', 'woo-gutenberg-products-block' ),
|
24 |
optionalLabel: __(
|
29 |
autocapitalize: 'sentences',
|
30 |
required: true,
|
31 |
hidden: false,
|
32 |
+
index: 1,
|
33 |
},
|
34 |
last_name: {
|
35 |
label: __( 'Last name', 'woo-gutenberg-products-block' ),
|
41 |
autocapitalize: 'sentences',
|
42 |
required: true,
|
43 |
hidden: false,
|
44 |
+
index: 2,
|
45 |
},
|
46 |
company: {
|
47 |
label: __( 'Company', 'woo-gutenberg-products-block' ),
|
53 |
autocapitalize: 'sentences',
|
54 |
required: false,
|
55 |
hidden: false,
|
56 |
+
index: 3,
|
57 |
},
|
58 |
address_1: {
|
59 |
label: __( 'Address', 'woo-gutenberg-products-block' ),
|
65 |
autocapitalize: 'sentences',
|
66 |
required: true,
|
67 |
hidden: false,
|
68 |
+
index: 4,
|
69 |
},
|
70 |
address_2: {
|
71 |
label: __( 'Apartment, suite, etc.', 'woo-gutenberg-products-block' ),
|
77 |
autocapitalize: 'sentences',
|
78 |
required: false,
|
79 |
hidden: false,
|
80 |
+
index: 5,
|
81 |
},
|
82 |
country: {
|
83 |
label: __( 'Country/Region', 'woo-gutenberg-products-block' ),
|
88 |
autocomplete: 'country',
|
89 |
required: true,
|
90 |
hidden: false,
|
91 |
+
index: 6,
|
92 |
},
|
93 |
city: {
|
94 |
label: __( 'City', 'woo-gutenberg-products-block' ),
|
97 |
autocapitalize: 'sentences',
|
98 |
required: true,
|
99 |
hidden: false,
|
100 |
+
index: 7,
|
101 |
},
|
102 |
state: {
|
103 |
label: __( 'State/County', 'woo-gutenberg-products-block' ),
|
109 |
autocapitalize: 'sentences',
|
110 |
required: true,
|
111 |
hidden: false,
|
112 |
+
index: 8,
|
113 |
},
|
114 |
postcode: {
|
115 |
label: __( 'Postal code', 'woo-gutenberg-products-block' ),
|
121 |
autocapitalize: 'characters',
|
122 |
required: true,
|
123 |
hidden: false,
|
124 |
+
index: 9,
|
125 |
},
|
126 |
};
|
127 |
|
128 |
+
export default AddressFields;
|
assets/js/base/components/cart-checkout/address-form/index.js
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
export { default as AddressForm } from './address-form';
|
2 |
+
export { default as countryAddressFields } from './country-address-fields';
|
3 |
+
export { default as defaultAddressFields } from './default-address-fields';
|
assets/js/base/components/cart-checkout/address-form/index.ts
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
export { default as AddressForm } from './address-form';
|
|
assets/js/base/components/cart-checkout/address-form/prepare-address-fields.ts
DELETED
@@ -1,131 +0,0 @@
|
|
1 |
-
/** @typedef { import('@woocommerce/type-defs/address-fields').CountryAddressFields } CountryAddressFields */
|
2 |
-
|
3 |
-
/**
|
4 |
-
* External dependencies
|
5 |
-
*/
|
6 |
-
import {
|
7 |
-
AddressField,
|
8 |
-
AddressFields,
|
9 |
-
CountryAddressFields,
|
10 |
-
defaultAddressFields,
|
11 |
-
getSetting,
|
12 |
-
KeyedAddressField,
|
13 |
-
LocaleSpecificAddressField,
|
14 |
-
} from '@woocommerce/settings';
|
15 |
-
import { __, sprintf } from '@wordpress/i18n';
|
16 |
-
import { isNumber, isString } from '@woocommerce/types';
|
17 |
-
|
18 |
-
/**
|
19 |
-
* This is locale data from WooCommerce countries class. This doesn't match the shape of the new field data blocks uses,
|
20 |
-
* but we can import part of it to set which fields are required.
|
21 |
-
*
|
22 |
-
* This supports new properties such as optionalLabel which are not used by core (yet).
|
23 |
-
*/
|
24 |
-
const coreLocale = getSetting< CountryAddressFields >( 'countryLocale', {} );
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Gets props from the core locale, then maps them to the shape we require in the client.
|
28 |
-
*
|
29 |
-
* Ignores "class", "type", "placeholder", and "autocomplete" props from core.
|
30 |
-
*
|
31 |
-
* @param {Object} localeField Locale fields from WooCommerce.
|
32 |
-
* @return {Object} Supported locale fields.
|
33 |
-
*/
|
34 |
-
const getSupportedCoreLocaleProps = (
|
35 |
-
localeField: LocaleSpecificAddressField
|
36 |
-
): Partial< AddressField > => {
|
37 |
-
const fields: Partial< AddressField > = {};
|
38 |
-
|
39 |
-
if ( localeField.label !== undefined ) {
|
40 |
-
fields.label = localeField.label;
|
41 |
-
}
|
42 |
-
|
43 |
-
if ( localeField.required !== undefined ) {
|
44 |
-
fields.required = localeField.required;
|
45 |
-
}
|
46 |
-
|
47 |
-
if ( localeField.hidden !== undefined ) {
|
48 |
-
fields.hidden = localeField.hidden;
|
49 |
-
}
|
50 |
-
|
51 |
-
if ( localeField.label !== undefined && ! localeField.optionalLabel ) {
|
52 |
-
fields.optionalLabel = sprintf(
|
53 |
-
/* translators: %s Field label. */
|
54 |
-
__( '%s (optional)', 'woo-gutenberg-products-block' ),
|
55 |
-
localeField.label
|
56 |
-
);
|
57 |
-
}
|
58 |
-
|
59 |
-
if ( localeField.priority ) {
|
60 |
-
if ( isNumber( localeField.priority ) ) {
|
61 |
-
fields.index = localeField.priority;
|
62 |
-
}
|
63 |
-
if ( isString( localeField.priority ) ) {
|
64 |
-
fields.index = parseInt( localeField.priority, 10 );
|
65 |
-
}
|
66 |
-
}
|
67 |
-
|
68 |
-
if ( localeField.hidden ) {
|
69 |
-
fields.required = false;
|
70 |
-
}
|
71 |
-
|
72 |
-
return fields;
|
73 |
-
};
|
74 |
-
|
75 |
-
const countryAddressFields: CountryAddressFields = Object.entries( coreLocale )
|
76 |
-
.map( ( [ country, countryLocale ] ) => [
|
77 |
-
country,
|
78 |
-
Object.entries( countryLocale )
|
79 |
-
.map( ( [ localeFieldKey, localeField ] ) => [
|
80 |
-
localeFieldKey,
|
81 |
-
getSupportedCoreLocaleProps( localeField ),
|
82 |
-
] )
|
83 |
-
.reduce( ( obj, [ key, val ] ) => {
|
84 |
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
85 |
-
// @ts-ignore - Ignoring because it should be fine as long as the data from the server is correct. TS won't catch it anyway if it's not.
|
86 |
-
obj[ key ] = val;
|
87 |
-
return obj;
|
88 |
-
}, {} ),
|
89 |
-
] )
|
90 |
-
.reduce( ( obj, [ key, val ] ) => {
|
91 |
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
92 |
-
// @ts-ignore - Ignoring because it should be fine as long as the data from the server is correct. TS won't catch it anyway if it's not.
|
93 |
-
obj[ key ] = val;
|
94 |
-
return obj;
|
95 |
-
}, {} );
|
96 |
-
|
97 |
-
/**
|
98 |
-
* Combines address fields, including fields from the locale, and sorts them by index.
|
99 |
-
*
|
100 |
-
* @param {Array} fields List of field keys--only address fields matching these will be returned.
|
101 |
-
* @param {Object} fieldConfigs Fields config contains field specific overrides at block level which may, for example, hide a field.
|
102 |
-
* @param {string} addressCountry Address country code. If unknown, locale fields will not be merged.
|
103 |
-
* @return {CountryAddressFields} Object containing address fields.
|
104 |
-
*/
|
105 |
-
const prepareAddressFields = (
|
106 |
-
fields: ( keyof AddressFields )[],
|
107 |
-
fieldConfigs: Record< string, Partial< AddressField > >,
|
108 |
-
addressCountry = ''
|
109 |
-
): KeyedAddressField[] => {
|
110 |
-
const localeConfigs: AddressFields =
|
111 |
-
addressCountry && countryAddressFields[ addressCountry ] !== undefined
|
112 |
-
? countryAddressFields[ addressCountry ]
|
113 |
-
: ( {} as AddressFields );
|
114 |
-
|
115 |
-
return fields
|
116 |
-
.map( ( field ) => {
|
117 |
-
const defaultConfig = defaultAddressFields[ field ] || {};
|
118 |
-
const localeConfig = localeConfigs[ field ] || {};
|
119 |
-
const fieldConfig = fieldConfigs[ field ] || {};
|
120 |
-
|
121 |
-
return {
|
122 |
-
key: field,
|
123 |
-
...defaultConfig,
|
124 |
-
...localeConfig,
|
125 |
-
...fieldConfig,
|
126 |
-
};
|
127 |
-
} )
|
128 |
-
.sort( ( a, b ) => a.index - b.index );
|
129 |
-
};
|
130 |
-
|
131 |
-
export default prepareAddressFields;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/address-form/test/index.js
CHANGED
@@ -3,8 +3,8 @@
|
|
3 |
*/
|
4 |
import { render, screen } from '@testing-library/react';
|
5 |
import userEvent from '@testing-library/user-event';
|
|
|
6 |
import { CheckoutProvider } from '@woocommerce/base-context';
|
7 |
-
import { useCheckoutAddress } from '@woocommerce/base-context/hooks';
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
@@ -149,9 +149,6 @@ describe( 'AddressForm Component', () => {
|
|
149 |
|
150 |
// Verify state input has been removed.
|
151 |
expect( screen.queryByText( stateRegExp ) ).not.toBeInTheDocument();
|
152 |
-
|
153 |
-
inputAddress( tertiaryAddress );
|
154 |
-
|
155 |
// Verify postal code input label changed.
|
156 |
expect( screen.getByLabelText( /Postal code/ ) ).toBeInTheDocument();
|
157 |
} );
|
3 |
*/
|
4 |
import { render, screen } from '@testing-library/react';
|
5 |
import userEvent from '@testing-library/user-event';
|
6 |
+
import { useCheckoutAddress } from '@woocommerce/base-hooks';
|
7 |
import { CheckoutProvider } from '@woocommerce/base-context';
|
|
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
149 |
|
150 |
// Verify state input has been removed.
|
151 |
expect( screen.queryByText( stateRegExp ) ).not.toBeInTheDocument();
|
|
|
|
|
|
|
152 |
// Verify postal code input label changed.
|
153 |
expect( screen.getByLabelText( /Postal code/ ) ).toBeInTheDocument();
|
154 |
} );
|
assets/js/base/components/cart-checkout/index.js
CHANGED
@@ -14,7 +14,6 @@ export { default as ReturnToCartButton } from './return-to-cart-button';
|
|
14 |
export { default as ShippingCalculator } from './shipping-calculator';
|
15 |
export { default as ShippingLocation } from './shipping-location';
|
16 |
export { default as ShippingRatesControl } from './shipping-rates-control';
|
17 |
-
export { default as ShippingRatesControlPackage } from './shipping-rates-control-package';
|
18 |
export { default as PaymentMethodIcons } from './payment-method-icons';
|
19 |
export { default as PaymentMethodLabel } from './payment-method-label';
|
20 |
export * from './totals';
|
14 |
export { default as ShippingCalculator } from './shipping-calculator';
|
15 |
export { default as ShippingLocation } from './shipping-location';
|
16 |
export { default as ShippingRatesControl } from './shipping-rates-control';
|
|
|
17 |
export { default as PaymentMethodIcons } from './payment-method-icons';
|
18 |
export { default as PaymentMethodLabel } from './payment-method-label';
|
19 |
export * from './totals';
|
assets/js/base/components/cart-checkout/order-summary/index.js
CHANGED
@@ -23,7 +23,6 @@ const OrderSummary = ( { cartItems = [] } ) => {
|
|
23 |
<Panel
|
24 |
className="wc-block-components-order-summary"
|
25 |
initialOpen={ isLarge }
|
26 |
-
hasBorder={ false }
|
27 |
title={
|
28 |
<span className="wc-block-components-order-summary__button-text">
|
29 |
{ __( 'Order summary', 'woo-gutenberg-products-block' ) }
|
23 |
<Panel
|
24 |
className="wc-block-components-order-summary"
|
25 |
initialOpen={ isLarge }
|
|
|
26 |
title={
|
27 |
<span className="wc-block-components-order-summary__button-text">
|
28 |
{ __( 'Order summary', 'woo-gutenberg-products-block' ) }
|
assets/js/base/components/cart-checkout/order-summary/order-summary-item.js
CHANGED
@@ -5,16 +5,9 @@ import { __, sprintf } from '@wordpress/i18n';
|
|
5 |
import Label from '@woocommerce/base-components/label';
|
6 |
import ProductPrice from '@woocommerce/base-components/product-price';
|
7 |
import ProductName from '@woocommerce/base-components/product-name';
|
8 |
-
import {
|
9 |
-
import {
|
10 |
-
__experimentalApplyCheckoutFilter,
|
11 |
-
mustContain,
|
12 |
-
} from '@woocommerce/blocks-checkout';
|
13 |
import PropTypes from 'prop-types';
|
14 |
import Dinero from 'dinero.js';
|
15 |
-
import { getSetting } from '@woocommerce/settings';
|
16 |
-
import { useCallback, useMemo } from '@wordpress/element';
|
17 |
-
import { useStoreCart } from '@woocommerce/base-context/hooks';
|
18 |
|
19 |
/**
|
20 |
* Internal dependencies
|
@@ -29,7 +22,7 @@ const OrderSummaryItem = ( { cartItem } ) => {
|
|
29 |
images,
|
30 |
low_stock_remaining: lowStockRemaining = null,
|
31 |
show_backorder_badge: showBackorderBadge = false,
|
32 |
-
name
|
33 |
permalink,
|
34 |
prices,
|
35 |
quantity,
|
@@ -37,76 +30,26 @@ const OrderSummaryItem = ( { cartItem } ) => {
|
|
37 |
description: fullDescription,
|
38 |
item_data: itemData = [],
|
39 |
variation,
|
40 |
-
totals,
|
41 |
-
extensions = {},
|
42 |
} = cartItem;
|
43 |
|
44 |
-
|
45 |
-
// We need to pluck out receiveCart.
|
46 |
-
// eslint-disable-next-line no-unused-vars
|
47 |
-
const { receiveCart, ...cart } = useStoreCart();
|
48 |
-
|
49 |
-
const productPriceValidation = useCallback(
|
50 |
-
( value ) => mustContain( value, '<price/>' ),
|
51 |
-
[]
|
52 |
-
);
|
53 |
-
|
54 |
-
const arg = useMemo(
|
55 |
-
() => ( {
|
56 |
-
context: 'summary',
|
57 |
-
cartItem,
|
58 |
-
cart,
|
59 |
-
} ),
|
60 |
-
[ cartItem, cart ]
|
61 |
-
);
|
62 |
-
|
63 |
-
const priceCurrency = getCurrencyFromPriceResponse( prices );
|
64 |
-
|
65 |
-
const name = __experimentalApplyCheckoutFilter( {
|
66 |
-
filterName: 'itemName',
|
67 |
-
defaultValue: initialName,
|
68 |
-
extensions,
|
69 |
-
arg,
|
70 |
-
} );
|
71 |
-
|
72 |
const regularPriceSingle = Dinero( {
|
73 |
amount: parseInt( prices.raw_prices.regular_price, 10 ),
|
74 |
precision: parseInt( prices.raw_prices.precision, 10 ),
|
75 |
} )
|
76 |
-
.convertPrecision(
|
77 |
.getAmount();
|
78 |
-
const
|
79 |
amount: parseInt( prices.raw_prices.price, 10 ),
|
80 |
precision: parseInt( prices.raw_prices.precision, 10 ),
|
81 |
-
} )
|
82 |
-
.convertPrecision( priceCurrency.minorUnit )
|
83 |
-
.getAmount();
|
84 |
-
const totalsCurrency = getCurrencyFromPriceResponse( totals );
|
85 |
-
|
86 |
-
let lineSubtotal = parseInt( totals.line_subtotal, 10 );
|
87 |
-
if ( getSetting( 'displayCartPricesIncludingTax', false ) ) {
|
88 |
-
lineSubtotal += parseInt( totals.line_subtotal_tax, 10 );
|
89 |
-
}
|
90 |
-
const subtotalPrice = Dinero( {
|
91 |
-
amount: lineSubtotal,
|
92 |
-
precision: totalsCurrency.minorUnit,
|
93 |
-
} ).getAmount();
|
94 |
-
const subtotalPriceFormat = __experimentalApplyCheckoutFilter( {
|
95 |
-
filterName: 'subtotalPriceFormat',
|
96 |
-
defaultValue: '<price/>',
|
97 |
-
extensions,
|
98 |
-
arg,
|
99 |
-
validation: productPriceValidation,
|
100 |
-
} );
|
101 |
-
|
102 |
-
// Allow extensions to filter how the price is displayed. Ie: prepending or appending some values.
|
103 |
-
const productPriceFormat = __experimentalApplyCheckoutFilter( {
|
104 |
-
filterName: 'cartItemPrice',
|
105 |
-
defaultValue: '<price/>',
|
106 |
-
extensions,
|
107 |
-
arg,
|
108 |
-
validation: productPriceValidation,
|
109 |
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
|
111 |
return (
|
112 |
<div className="wc-block-components-order-summary-item">
|
@@ -130,13 +73,12 @@ const OrderSummaryItem = ( { cartItem } ) => {
|
|
130 |
permalink={ permalink }
|
131 |
/>
|
132 |
<ProductPrice
|
133 |
-
currency={
|
134 |
-
price={
|
135 |
regularPrice={ regularPriceSingle }
|
136 |
className="wc-block-components-order-summary-item__individual-prices"
|
137 |
priceClassName="wc-block-components-order-summary-item__individual-price"
|
138 |
regularPriceClassName="wc-block-components-order-summary-item__regular-individual-price"
|
139 |
-
format={ subtotalPriceFormat }
|
140 |
/>
|
141 |
{ showBackorderBadge ? (
|
142 |
<ProductBackorderBadge />
|
@@ -155,11 +97,7 @@ const OrderSummaryItem = ( { cartItem } ) => {
|
|
155 |
/>
|
156 |
</div>
|
157 |
<div className="wc-block-components-order-summary-item__total-price">
|
158 |
-
<ProductPrice
|
159 |
-
currency={ totalsCurrency }
|
160 |
-
format={ productPriceFormat }
|
161 |
-
price={ subtotalPrice }
|
162 |
-
/>
|
163 |
</div>
|
164 |
</div>
|
165 |
);
|
5 |
import Label from '@woocommerce/base-components/label';
|
6 |
import ProductPrice from '@woocommerce/base-components/product-price';
|
7 |
import ProductName from '@woocommerce/base-components/product-name';
|
8 |
+
import { getCurrency } from '@woocommerce/price-format';
|
|
|
|
|
|
|
|
|
9 |
import PropTypes from 'prop-types';
|
10 |
import Dinero from 'dinero.js';
|
|
|
|
|
|
|
11 |
|
12 |
/**
|
13 |
* Internal dependencies
|
22 |
images,
|
23 |
low_stock_remaining: lowStockRemaining = null,
|
24 |
show_backorder_badge: showBackorderBadge = false,
|
25 |
+
name,
|
26 |
permalink,
|
27 |
prices,
|
28 |
quantity,
|
30 |
description: fullDescription,
|
31 |
item_data: itemData = [],
|
32 |
variation,
|
|
|
|
|
33 |
} = cartItem;
|
34 |
|
35 |
+
const currency = getCurrency( prices );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
const regularPriceSingle = Dinero( {
|
37 |
amount: parseInt( prices.raw_prices.regular_price, 10 ),
|
38 |
precision: parseInt( prices.raw_prices.precision, 10 ),
|
39 |
} )
|
40 |
+
.convertPrecision( currency.minorUnit )
|
41 |
.getAmount();
|
42 |
+
const unconvertedLinePrice = Dinero( {
|
43 |
amount: parseInt( prices.raw_prices.price, 10 ),
|
44 |
precision: parseInt( prices.raw_prices.precision, 10 ),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
} );
|
46 |
+
const linePriceSingle = unconvertedLinePrice
|
47 |
+
.convertPrecision( currency.minorUnit )
|
48 |
+
.getAmount();
|
49 |
+
const linePrice = unconvertedLinePrice
|
50 |
+
.multiply( quantity )
|
51 |
+
.convertPrecision( currency.minorUnit )
|
52 |
+
.getAmount();
|
53 |
|
54 |
return (
|
55 |
<div className="wc-block-components-order-summary-item">
|
73 |
permalink={ permalink }
|
74 |
/>
|
75 |
<ProductPrice
|
76 |
+
currency={ currency }
|
77 |
+
price={ linePriceSingle }
|
78 |
regularPrice={ regularPriceSingle }
|
79 |
className="wc-block-components-order-summary-item__individual-prices"
|
80 |
priceClassName="wc-block-components-order-summary-item__individual-price"
|
81 |
regularPriceClassName="wc-block-components-order-summary-item__regular-individual-price"
|
|
|
82 |
/>
|
83 |
{ showBackorderBadge ? (
|
84 |
<ProductBackorderBadge />
|
97 |
/>
|
98 |
</div>
|
99 |
<div className="wc-block-components-order-summary-item__total-price">
|
100 |
+
<ProductPrice currency={ currency } price={ linePrice } />
|
|
|
|
|
|
|
|
|
101 |
</div>
|
102 |
</div>
|
103 |
);
|
assets/js/base/components/cart-checkout/order-summary/style.scss
CHANGED
@@ -1,12 +1,7 @@
|
|
1 |
.wc-block-components-order-summary {
|
2 |
-
|
3 |
-
.wc-block-components-panel__button {
|
4 |
-
padding-top: 0;
|
5 |
margin-top: 0;
|
6 |
-
|
7 |
-
|
8 |
-
.wc-block-components-panel__content {
|
9 |
-
margin-bottom: 0;
|
10 |
}
|
11 |
}
|
12 |
|
@@ -23,10 +18,6 @@
|
|
23 |
padding-top: $gap;
|
24 |
width: 100%;
|
25 |
|
26 |
-
&:first-child {
|
27 |
-
padding-top: 0;
|
28 |
-
}
|
29 |
-
|
30 |
&:last-child {
|
31 |
> div {
|
32 |
padding-bottom: 0;
|
@@ -74,7 +65,7 @@
|
|
74 |
justify-content: center;
|
75 |
min-width: 20px;
|
76 |
right: 0;
|
77 |
-
top:
|
78 |
transform: translate(50%, -50%);
|
79 |
white-space: nowrap;
|
80 |
z-index: 1;
|
@@ -82,7 +73,6 @@
|
|
82 |
|
83 |
.wc-block-components-order-summary-item__description {
|
84 |
padding-left: $gap-large;
|
85 |
-
padding-right: $gap-small;
|
86 |
padding-bottom: $gap;
|
87 |
|
88 |
p,
|
@@ -95,7 +85,6 @@
|
|
95 |
.wc-block-components-order-summary-item__total-price {
|
96 |
font-weight: bold;
|
97 |
margin-left: auto;
|
98 |
-
text-align: right;
|
99 |
}
|
100 |
|
101 |
|
1 |
.wc-block-components-order-summary {
|
2 |
+
.wc-blocks-components-panel__button {
|
|
|
|
|
3 |
margin-top: 0;
|
4 |
+
padding-top: 0;
|
|
|
|
|
|
|
5 |
}
|
6 |
}
|
7 |
|
18 |
padding-top: $gap;
|
19 |
width: 100%;
|
20 |
|
|
|
|
|
|
|
|
|
21 |
&:last-child {
|
22 |
> div {
|
23 |
padding-bottom: 0;
|
65 |
justify-content: center;
|
66 |
min-width: 20px;
|
67 |
right: 0;
|
68 |
+
top: $gap;
|
69 |
transform: translate(50%, -50%);
|
70 |
white-space: nowrap;
|
71 |
z-index: 1;
|
73 |
|
74 |
.wc-block-components-order-summary-item__description {
|
75 |
padding-left: $gap-large;
|
|
|
76 |
padding-bottom: $gap;
|
77 |
|
78 |
p,
|
85 |
.wc-block-components-order-summary-item__total-price {
|
86 |
font-weight: bold;
|
87 |
margin-left: auto;
|
|
|
88 |
}
|
89 |
|
90 |
|
assets/js/base/components/cart-checkout/order-summary/test/index.js
DELETED
@@ -1,43 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { render, screen } from '@testing-library/react';
|
5 |
-
import { previewCart } from '@woocommerce/resource-previews';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import OrderSummary from '../index';
|
11 |
-
|
12 |
-
jest.mock( '@woocommerce/base-context', () => ( {
|
13 |
-
...jest.requireActual( '@woocommerce/base-context' ),
|
14 |
-
useContainerWidthContext: () => ( {
|
15 |
-
isLarge: false,
|
16 |
-
hasContainerWidth: true,
|
17 |
-
} ),
|
18 |
-
} ) );
|
19 |
-
|
20 |
-
describe( 'Order Summary', () => {
|
21 |
-
it( 'renders correct cart line subtotal when currency has 0 decimals', async () => {
|
22 |
-
render(
|
23 |
-
<OrderSummary
|
24 |
-
cartItems={ [
|
25 |
-
{
|
26 |
-
...previewCart.items[ 0 ],
|
27 |
-
totals: {
|
28 |
-
...previewCart.items[ 0 ].totals,
|
29 |
-
// Change price format so there are no decimals.
|
30 |
-
currency_minor_unit: 0,
|
31 |
-
currency_prefix: '',
|
32 |
-
currency_suffix: '€',
|
33 |
-
line_subtotal: '16',
|
34 |
-
line_total: '18',
|
35 |
-
},
|
36 |
-
},
|
37 |
-
] }
|
38 |
-
/>
|
39 |
-
);
|
40 |
-
|
41 |
-
expect( screen.getByText( '16€' ) ).toBeTruthy();
|
42 |
-
} );
|
43 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/payment-method-icons/common-icons.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import {
|
5 |
|
6 |
/**
|
7 |
* Array of common assets.
|
@@ -10,97 +10,97 @@ export const commonIcons = [
|
|
10 |
{
|
11 |
id: 'alipay',
|
12 |
alt: 'Alipay',
|
13 |
-
src:
|
14 |
},
|
15 |
{
|
16 |
id: 'amex',
|
17 |
alt: 'American Express',
|
18 |
-
src:
|
19 |
},
|
20 |
{
|
21 |
id: 'bancontact',
|
22 |
alt: 'Bancontact',
|
23 |
-
src:
|
24 |
},
|
25 |
{
|
26 |
id: 'diners',
|
27 |
alt: 'Diners Club',
|
28 |
-
src:
|
29 |
},
|
30 |
{
|
31 |
id: 'discover',
|
32 |
alt: 'Discover',
|
33 |
-
src:
|
34 |
},
|
35 |
{
|
36 |
id: 'eps',
|
37 |
alt: 'EPS',
|
38 |
-
src:
|
39 |
},
|
40 |
{
|
41 |
id: 'giropay',
|
42 |
alt: 'Giropay',
|
43 |
-
src:
|
44 |
},
|
45 |
{
|
46 |
id: 'ideal',
|
47 |
alt: 'iDeal',
|
48 |
-
src:
|
49 |
},
|
50 |
{
|
51 |
id: 'jcb',
|
52 |
alt: 'JCB',
|
53 |
-
src:
|
54 |
},
|
55 |
{
|
56 |
id: 'laser',
|
57 |
alt: 'Laser',
|
58 |
-
src:
|
59 |
},
|
60 |
{
|
61 |
id: 'maestro',
|
62 |
alt: 'Maestro',
|
63 |
-
src:
|
64 |
},
|
65 |
{
|
66 |
id: 'mastercard',
|
67 |
alt: 'Mastercard',
|
68 |
-
src:
|
69 |
},
|
70 |
{
|
71 |
id: 'multibanco',
|
72 |
alt: 'Multibanco',
|
73 |
-
src:
|
74 |
},
|
75 |
{
|
76 |
id: 'p24',
|
77 |
alt: 'Przelewy24',
|
78 |
-
src:
|
79 |
},
|
80 |
{
|
81 |
id: 'sepa',
|
82 |
alt: 'Sepa',
|
83 |
-
src:
|
84 |
},
|
85 |
{
|
86 |
id: 'sofort',
|
87 |
alt: 'Sofort',
|
88 |
-
src:
|
89 |
},
|
90 |
{
|
91 |
id: 'unionpay',
|
92 |
alt: 'Union Pay',
|
93 |
-
src:
|
94 |
},
|
95 |
{
|
96 |
id: 'visa',
|
97 |
alt: 'Visa',
|
98 |
-
src:
|
99 |
},
|
100 |
{
|
101 |
id: 'wechat',
|
102 |
alt: 'WeChat',
|
103 |
-
src:
|
104 |
},
|
105 |
];
|
106 |
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { WC_BLOCKS_ASSET_URL } from '@woocommerce/block-settings';
|
5 |
|
6 |
/**
|
7 |
* Array of common assets.
|
10 |
{
|
11 |
id: 'alipay',
|
12 |
alt: 'Alipay',
|
13 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/alipay.svg',
|
14 |
},
|
15 |
{
|
16 |
id: 'amex',
|
17 |
alt: 'American Express',
|
18 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/amex.svg',
|
19 |
},
|
20 |
{
|
21 |
id: 'bancontact',
|
22 |
alt: 'Bancontact',
|
23 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/bancontact.svg',
|
24 |
},
|
25 |
{
|
26 |
id: 'diners',
|
27 |
alt: 'Diners Club',
|
28 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/diners.svg',
|
29 |
},
|
30 |
{
|
31 |
id: 'discover',
|
32 |
alt: 'Discover',
|
33 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/discover.svg',
|
34 |
},
|
35 |
{
|
36 |
id: 'eps',
|
37 |
alt: 'EPS',
|
38 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/eps.svg',
|
39 |
},
|
40 |
{
|
41 |
id: 'giropay',
|
42 |
alt: 'Giropay',
|
43 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/giropay.svg',
|
44 |
},
|
45 |
{
|
46 |
id: 'ideal',
|
47 |
alt: 'iDeal',
|
48 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/ideal.svg',
|
49 |
},
|
50 |
{
|
51 |
id: 'jcb',
|
52 |
alt: 'JCB',
|
53 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/jcb.svg',
|
54 |
},
|
55 |
{
|
56 |
id: 'laser',
|
57 |
alt: 'Laser',
|
58 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/laser.svg',
|
59 |
},
|
60 |
{
|
61 |
id: 'maestro',
|
62 |
alt: 'Maestro',
|
63 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/maestro.svg',
|
64 |
},
|
65 |
{
|
66 |
id: 'mastercard',
|
67 |
alt: 'Mastercard',
|
68 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/mastercard.svg',
|
69 |
},
|
70 |
{
|
71 |
id: 'multibanco',
|
72 |
alt: 'Multibanco',
|
73 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/multibanco.svg',
|
74 |
},
|
75 |
{
|
76 |
id: 'p24',
|
77 |
alt: 'Przelewy24',
|
78 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/p24.svg',
|
79 |
},
|
80 |
{
|
81 |
id: 'sepa',
|
82 |
alt: 'Sepa',
|
83 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/sepa.svg',
|
84 |
},
|
85 |
{
|
86 |
id: 'sofort',
|
87 |
alt: 'Sofort',
|
88 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/sofort.svg',
|
89 |
},
|
90 |
{
|
91 |
id: 'unionpay',
|
92 |
alt: 'Union Pay',
|
93 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/unionpay.svg',
|
94 |
},
|
95 |
{
|
96 |
id: 'visa',
|
97 |
alt: 'Visa',
|
98 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/visa.svg',
|
99 |
},
|
100 |
{
|
101 |
id: 'wechat',
|
102 |
alt: 'WeChat',
|
103 |
+
src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/wechat.svg',
|
104 |
},
|
105 |
];
|
106 |
|
assets/js/base/components/cart-checkout/place-order-button/index.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
-
import { useCheckoutSubmit } from '@woocommerce/base-
|
6 |
import { Icon, done } from '@woocommerce/icons';
|
7 |
import Button from '@woocommerce/base-components/button';
|
8 |
|
@@ -11,7 +11,6 @@ const PlaceOrderButton = () => {
|
|
11 |
submitButtonText,
|
12 |
onSubmit,
|
13 |
isCalculating,
|
14 |
-
isDisabled,
|
15 |
waitingForProcessing,
|
16 |
waitingForRedirect,
|
17 |
} = useCheckoutSubmit();
|
@@ -21,10 +20,7 @@ const PlaceOrderButton = () => {
|
|
21 |
className="wc-block-components-checkout-place-order-button"
|
22 |
onClick={ onSubmit }
|
23 |
disabled={
|
24 |
-
isCalculating ||
|
25 |
-
isDisabled ||
|
26 |
-
waitingForProcessing ||
|
27 |
-
waitingForRedirect
|
28 |
}
|
29 |
showSpinner={ waitingForProcessing }
|
30 |
>
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
+
import { useCheckoutSubmit } from '@woocommerce/base-hooks';
|
6 |
import { Icon, done } from '@woocommerce/icons';
|
7 |
import Button from '@woocommerce/base-components/button';
|
8 |
|
11 |
submitButtonText,
|
12 |
onSubmit,
|
13 |
isCalculating,
|
|
|
14 |
waitingForProcessing,
|
15 |
waitingForRedirect,
|
16 |
} = useCheckoutSubmit();
|
20 |
className="wc-block-components-checkout-place-order-button"
|
21 |
onClick={ onSubmit }
|
22 |
disabled={
|
23 |
+
isCalculating || waitingForProcessing || waitingForRedirect
|
|
|
|
|
|
|
24 |
}
|
25 |
showSpinner={ waitingForProcessing }
|
26 |
>
|
assets/js/base/components/cart-checkout/policies/{index.tsx → index.js}
RENAMED
@@ -15,7 +15,7 @@ import { decodeEntities } from '@wordpress/html-entities';
|
|
15 |
*/
|
16 |
import './style.scss';
|
17 |
|
18 |
-
const Policies = ()
|
19 |
return (
|
20 |
<ul className="wc-block-components-checkout-policies">
|
21 |
{ PRIVACY_URL && (
|
15 |
*/
|
16 |
import './style.scss';
|
17 |
|
18 |
+
const Policies = () => {
|
19 |
return (
|
20 |
<ul className="wc-block-components-checkout-policies">
|
21 |
{ PRIVACY_URL && (
|
assets/js/base/components/cart-checkout/product-backorder-badge/{index.tsx → index.js}
RENAMED
@@ -11,7 +11,7 @@ import ProductBadge from '../product-badge';
|
|
11 |
/**
|
12 |
* Returns a backorder badge.
|
13 |
*/
|
14 |
-
const ProductBackorderBadge = ()
|
15 |
return (
|
16 |
<ProductBadge className="wc-block-components-product-backorder-badge">
|
17 |
{ __( 'Available on backorder', 'woo-gutenberg-products-block' ) }
|
11 |
/**
|
12 |
* Returns a backorder badge.
|
13 |
*/
|
14 |
+
const ProductBackorderBadge = () => {
|
15 |
return (
|
16 |
<ProductBadge className="wc-block-components-product-backorder-badge">
|
17 |
{ __( 'Available on backorder', 'woo-gutenberg-products-block' ) }
|
assets/js/base/components/cart-checkout/product-badge/{index.tsx → index.js}
RENAMED
@@ -2,21 +2,14 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import classNames from 'classnames';
|
5 |
-
import
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
10 |
import './style.scss';
|
11 |
|
12 |
-
|
13 |
-
children?: ReactNode;
|
14 |
-
className?: string;
|
15 |
-
}
|
16 |
-
const ProductBadge = ( {
|
17 |
-
children,
|
18 |
-
className,
|
19 |
-
}: ProductBadgeProps ): JSX.Element => {
|
20 |
return (
|
21 |
<div
|
22 |
className={ classNames(
|
@@ -29,4 +22,8 @@ const ProductBadge = ( {
|
|
29 |
);
|
30 |
};
|
31 |
|
|
|
|
|
|
|
|
|
32 |
export default ProductBadge;
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import classNames from 'classnames';
|
5 |
+
import PropTypes from 'prop-types';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
10 |
import './style.scss';
|
11 |
|
12 |
+
const ProductBadge = ( { children, className } ) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
return (
|
14 |
<div
|
15 |
className={ classNames(
|
22 |
);
|
23 |
};
|
24 |
|
25 |
+
ProductBadge.propTypes = {
|
26 |
+
className: PropTypes.string,
|
27 |
+
};
|
28 |
+
|
29 |
export default ProductBadge;
|
assets/js/base/components/cart-checkout/product-details/{index.tsx → index.js}
RENAMED
@@ -1,22 +1,17 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import { kebabCase } from 'lodash';
|
5 |
import { decodeEntities } from '@wordpress/html-entities';
|
6 |
-
import type { ProductResponseItemData } from '@woocommerce/type-defs/product-response';
|
7 |
|
8 |
/**
|
9 |
* Internal dependencies
|
10 |
*/
|
11 |
import './style.scss';
|
12 |
|
13 |
-
interface ProductDetailsProps {
|
14 |
-
details: ProductResponseItemData[];
|
15 |
-
}
|
16 |
// Component to display cart item data and variations.
|
17 |
-
const ProductDetails = ( {
|
18 |
-
details = [],
|
19 |
-
}: ProductDetailsProps ): JSX.Element | null => {
|
20 |
if ( ! Array.isArray( details ) ) {
|
21 |
return null;
|
22 |
}
|
@@ -37,7 +32,7 @@ const ProductDetails = ( {
|
|
37 |
: '';
|
38 |
return (
|
39 |
<li
|
40 |
-
key={ detail.name + ( detail.display || detail.
|
41 |
className={ className }
|
42 |
>
|
43 |
{ detail.name && (
|
@@ -57,4 +52,14 @@ const ProductDetails = ( {
|
|
57 |
);
|
58 |
};
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
export default ProductDetails;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
import { kebabCase } from 'lodash';
|
6 |
import { decodeEntities } from '@wordpress/html-entities';
|
|
|
7 |
|
8 |
/**
|
9 |
* Internal dependencies
|
10 |
*/
|
11 |
import './style.scss';
|
12 |
|
|
|
|
|
|
|
13 |
// Component to display cart item data and variations.
|
14 |
+
const ProductDetails = ( { details = [] } ) => {
|
|
|
|
|
15 |
if ( ! Array.isArray( details ) ) {
|
16 |
return null;
|
17 |
}
|
32 |
: '';
|
33 |
return (
|
34 |
<li
|
35 |
+
key={ detail.name + ( detail.display || detail.name ) }
|
36 |
className={ className }
|
37 |
>
|
38 |
{ detail.name && (
|
52 |
);
|
53 |
};
|
54 |
|
55 |
+
ProductDetails.propTypes = {
|
56 |
+
details: PropTypes.arrayOf(
|
57 |
+
PropTypes.shape( {
|
58 |
+
display: PropTypes.string,
|
59 |
+
name: PropTypes.string,
|
60 |
+
value: PropTypes.string.isRequired,
|
61 |
+
} )
|
62 |
+
),
|
63 |
+
};
|
64 |
+
|
65 |
export default ProductDetails;
|
assets/js/base/components/cart-checkout/product-details/style.scss
CHANGED
@@ -7,10 +7,6 @@
|
|
7 |
&:last-of-type {
|
8 |
margin-bottom: 0;
|
9 |
}
|
10 |
-
|
11 |
-
li {
|
12 |
-
margin-left: 0;
|
13 |
-
}
|
14 |
}
|
15 |
|
16 |
.wc-block-components-product-details__name,
|
7 |
&:last-of-type {
|
8 |
margin-bottom: 0;
|
9 |
}
|
|
|
|
|
|
|
|
|
10 |
}
|
11 |
|
12 |
.wc-block-components-product-details__name,
|
assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js}
RENAMED
@@ -2,18 +2,16 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { decodeEntities } from '@wordpress/html-entities';
|
5 |
-
import { PLACEHOLDER_IMG_SRC } from '@woocommerce/settings';
|
|
|
6 |
|
7 |
-
interface ProductImageProps {
|
8 |
-
image: { alt?: string; thumbnail?: string };
|
9 |
-
}
|
10 |
/**
|
11 |
* Formats and returns an image element.
|
12 |
*
|
13 |
* @param {Object} props Incoming props for the component.
|
14 |
* @param {Object} props.image Image properties.
|
15 |
*/
|
16 |
-
const ProductImage = ( { image = {} }
|
17 |
const imageProps = {
|
18 |
src: image.thumbnail || PLACEHOLDER_IMG_SRC,
|
19 |
alt: decodeEntities( image.alt ) || '',
|
@@ -22,4 +20,11 @@ const ProductImage = ( { image = {} }: ProductImageProps ): JSX.Element => {
|
|
22 |
return <img { ...imageProps } alt={ imageProps.alt } />;
|
23 |
};
|
24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
export default ProductImage;
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { decodeEntities } from '@wordpress/html-entities';
|
5 |
+
import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
|
|
|
|
|
|
|
8 |
/**
|
9 |
* Formats and returns an image element.
|
10 |
*
|
11 |
* @param {Object} props Incoming props for the component.
|
12 |
* @param {Object} props.image Image properties.
|
13 |
*/
|
14 |
+
const ProductImage = ( { image = {} } ) => {
|
15 |
const imageProps = {
|
16 |
src: image.thumbnail || PLACEHOLDER_IMG_SRC,
|
17 |
alt: decodeEntities( image.alt ) || '',
|
20 |
return <img { ...imageProps } alt={ imageProps.alt } />;
|
21 |
};
|
22 |
|
23 |
+
ProductImage.propTypes = {
|
24 |
+
image: PropTypes.shape( {
|
25 |
+
alt: PropTypes.string,
|
26 |
+
thumbnail: PropTypes.string,
|
27 |
+
} ),
|
28 |
+
};
|
29 |
+
|
30 |
export default ProductImage;
|
assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js}
RENAMED
@@ -2,24 +2,20 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
|
|
5 |
|
6 |
/**
|
7 |
* Internal dependencies
|
8 |
*/
|
9 |
import ProductBadge from '../product-badge';
|
10 |
|
11 |
-
interface ProductLowStockBadgeProps {
|
12 |
-
lowStockRemaining: number | null;
|
13 |
-
}
|
14 |
/**
|
15 |
* Returns a low stock badge.
|
16 |
*
|
17 |
* @param {Object} props Incoming props for the component.
|
18 |
-
* @param {
|
19 |
*/
|
20 |
-
const ProductLowStockBadge = ( {
|
21 |
-
lowStockRemaining,
|
22 |
-
}: ProductLowStockBadgeProps ): JSX.Element | null => {
|
23 |
if ( ! lowStockRemaining ) {
|
24 |
return null;
|
25 |
}
|
@@ -35,4 +31,8 @@ const ProductLowStockBadge = ( {
|
|
35 |
);
|
36 |
};
|
37 |
|
|
|
|
|
|
|
|
|
38 |
export default ProductLowStockBadge;
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
+
import PropTypes from 'prop-types';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
10 |
import ProductBadge from '../product-badge';
|
11 |
|
|
|
|
|
|
|
12 |
/**
|
13 |
* Returns a low stock badge.
|
14 |
*
|
15 |
* @param {Object} props Incoming props for the component.
|
16 |
+
* @param {boolean} props.lowStockRemaining Whether or not there is low stock remaining.
|
17 |
*/
|
18 |
+
const ProductLowStockBadge = ( { lowStockRemaining } ) => {
|
|
|
|
|
19 |
if ( ! lowStockRemaining ) {
|
20 |
return null;
|
21 |
}
|
31 |
);
|
32 |
};
|
33 |
|
34 |
+
ProductLowStockBadge.propTypes = {
|
35 |
+
lowStockRemaining: PropTypes.number,
|
36 |
+
};
|
37 |
+
|
38 |
export default ProductLowStockBadge;
|
assets/js/base/components/cart-checkout/product-metadata/{index.tsx → index.js}
RENAMED
@@ -1,8 +1,7 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import
|
5 |
-
import { CartVariationItem } from '@woocommerce/type-defs/cart';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
@@ -11,19 +10,12 @@ import ProductDetails from '../product-details';
|
|
11 |
import ProductSummary from '../product-summary';
|
12 |
import './style.scss';
|
13 |
|
14 |
-
interface ProductMetadataProps {
|
15 |
-
shortDescription?: string;
|
16 |
-
fullDescription?: string;
|
17 |
-
itemData: ProductResponseItemData[];
|
18 |
-
variation?: CartVariationItem[];
|
19 |
-
}
|
20 |
-
|
21 |
const ProductMetadata = ( {
|
22 |
shortDescription = '',
|
23 |
fullDescription = '',
|
24 |
itemData = [],
|
25 |
variation = [],
|
26 |
-
}
|
27 |
return (
|
28 |
<div className="wc-block-components-product-metadata">
|
29 |
<ProductSummary
|
@@ -42,4 +34,16 @@ const ProductMetadata = ( {
|
|
42 |
);
|
43 |
};
|
44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
export default ProductMetadata;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import PropTypes from 'prop-types';
|
|
|
5 |
|
6 |
/**
|
7 |
* Internal dependencies
|
10 |
import ProductSummary from '../product-summary';
|
11 |
import './style.scss';
|
12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
const ProductMetadata = ( {
|
14 |
shortDescription = '',
|
15 |
fullDescription = '',
|
16 |
itemData = [],
|
17 |
variation = [],
|
18 |
+
} ) => {
|
19 |
return (
|
20 |
<div className="wc-block-components-product-metadata">
|
21 |
<ProductSummary
|
34 |
);
|
35 |
};
|
36 |
|
37 |
+
ProductMetadata.propTypes = {
|
38 |
+
shortDescription: PropTypes.string,
|
39 |
+
fullDescription: PropTypes.string,
|
40 |
+
itemData: PropTypes.array,
|
41 |
+
variation: PropTypes.arrayOf(
|
42 |
+
PropTypes.shape( {
|
43 |
+
attribute: PropTypes.string,
|
44 |
+
value: PropTypes.string.isRequired,
|
45 |
+
} )
|
46 |
+
),
|
47 |
+
};
|
48 |
+
|
49 |
export default ProductMetadata;
|
assets/js/base/components/cart-checkout/product-sale-badge/index.js
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { createInterpolateElement } from 'wordpress-element';
|
5 |
+
import { __ } from '@wordpress/i18n';
|
6 |
+
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
7 |
+
import PropTypes from 'prop-types';
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Internal dependencies
|
11 |
+
*/
|
12 |
+
import ProductBadge from '../product-badge';
|
13 |
+
|
14 |
+
/**
|
15 |
+
* ProductSaleBadge
|
16 |
+
*
|
17 |
+
* @param {Object} props Incoming props.
|
18 |
+
* @param {Object} props.currency Currency object.
|
19 |
+
* @param {number} props.saleAmount Discounted amount.
|
20 |
+
*
|
21 |
+
* @return {*} The component.
|
22 |
+
*/
|
23 |
+
const ProductSaleBadge = ( { currency, saleAmount } ) => {
|
24 |
+
if ( ! saleAmount || saleAmount <= 0 ) {
|
25 |
+
return null;
|
26 |
+
}
|
27 |
+
return (
|
28 |
+
<ProductBadge className="wc-block-components-sale-badge">
|
29 |
+
{ createInterpolateElement(
|
30 |
+
/* translators: <price/> will be replaced by the discount amount */
|
31 |
+
__( 'Save <price/>', 'woo-gutenberg-products-block' ),
|
32 |
+
{
|
33 |
+
price: (
|
34 |
+
<FormattedMonetaryAmount
|
35 |
+
currency={ currency }
|
36 |
+
value={ saleAmount }
|
37 |
+
/>
|
38 |
+
),
|
39 |
+
}
|
40 |
+
) }
|
41 |
+
</ProductBadge>
|
42 |
+
);
|
43 |
+
};
|
44 |
+
|
45 |
+
ProductSaleBadge.propTypes = {
|
46 |
+
currency: PropTypes.object,
|
47 |
+
saleAmount: PropTypes.number,
|
48 |
+
};
|
49 |
+
|
50 |
+
export default ProductSaleBadge;
|
assets/js/base/components/cart-checkout/product-sale-badge/index.tsx
DELETED
@@ -1,62 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { createInterpolateElement } from 'wordpress-element';
|
5 |
-
import { __, sprintf } from '@wordpress/i18n';
|
6 |
-
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
7 |
-
import type { Currency } from '@woocommerce/price-format';
|
8 |
-
|
9 |
-
/**
|
10 |
-
* Internal dependencies
|
11 |
-
*/
|
12 |
-
import ProductBadge from '../product-badge';
|
13 |
-
|
14 |
-
interface ProductSaleBadgeProps {
|
15 |
-
currency: Currency;
|
16 |
-
saleAmount: number;
|
17 |
-
format: string;
|
18 |
-
}
|
19 |
-
/**
|
20 |
-
* ProductSaleBadge
|
21 |
-
*
|
22 |
-
* @param {Object} props Incoming props.
|
23 |
-
* @param {Object} props.currency Currency object.
|
24 |
-
* @param {number} props.saleAmount Discounted amount.
|
25 |
-
* @param {string} [props.format] Format to change the price.
|
26 |
-
* @return {*} The component.
|
27 |
-
*/
|
28 |
-
const ProductSaleBadge = ( {
|
29 |
-
currency,
|
30 |
-
saleAmount,
|
31 |
-
format = '<price/>',
|
32 |
-
}: ProductSaleBadgeProps ): JSX.Element | null => {
|
33 |
-
if ( ! saleAmount || saleAmount <= 0 ) {
|
34 |
-
return null;
|
35 |
-
}
|
36 |
-
if ( ! format.includes( '<price/>' ) ) {
|
37 |
-
format = '<price/>';
|
38 |
-
// eslint-disable-next-line no-console
|
39 |
-
console.error( 'Price formats need to include the `<price/>` tag.' );
|
40 |
-
}
|
41 |
-
|
42 |
-
const formattedMessage = sprintf(
|
43 |
-
/* translators: %s will be replaced by the discount amount */
|
44 |
-
__( `Save %s`, 'woo-gutenberg-products-block' ),
|
45 |
-
format
|
46 |
-
);
|
47 |
-
|
48 |
-
return (
|
49 |
-
<ProductBadge className="wc-block-components-sale-badge">
|
50 |
-
{ createInterpolateElement( formattedMessage, {
|
51 |
-
price: (
|
52 |
-
<FormattedMonetaryAmount
|
53 |
-
currency={ currency }
|
54 |
-
value={ saleAmount }
|
55 |
-
/>
|
56 |
-
),
|
57 |
-
} ) }
|
58 |
-
</ProductBadge>
|
59 |
-
);
|
60 |
-
};
|
61 |
-
|
62 |
-
export default ProductSaleBadge;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/product-summary/{index.tsx → index.js}
RENAMED
@@ -1,14 +1,10 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import Summary from '@woocommerce/base-components/summary';
|
5 |
-
import {
|
6 |
|
7 |
-
interface ProductSummaryProps {
|
8 |
-
className?: string;
|
9 |
-
shortDescription?: string;
|
10 |
-
fullDescription?: string;
|
11 |
-
}
|
12 |
/**
|
13 |
* Returns an element containing a summary of the product.
|
14 |
*
|
@@ -21,7 +17,7 @@ const ProductSummary = ( {
|
|
21 |
className,
|
22 |
shortDescription = '',
|
23 |
fullDescription = '',
|
24 |
-
}
|
25 |
const source = shortDescription ? shortDescription : fullDescription;
|
26 |
|
27 |
if ( ! source ) {
|
@@ -33,9 +29,15 @@ const ProductSummary = ( {
|
|
33 |
className={ className }
|
34 |
source={ source }
|
35 |
maxLength={ 15 }
|
36 |
-
countType={
|
37 |
/>
|
38 |
);
|
39 |
};
|
40 |
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
export default ProductSummary;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
import Summary from '@woocommerce/base-components/summary';
|
6 |
+
import { getSetting } from '@woocommerce/settings';
|
7 |
|
|
|
|
|
|
|
|
|
|
|
8 |
/**
|
9 |
* Returns an element containing a summary of the product.
|
10 |
*
|
17 |
className,
|
18 |
shortDescription = '',
|
19 |
fullDescription = '',
|
20 |
+
} ) => {
|
21 |
const source = shortDescription ? shortDescription : fullDescription;
|
22 |
|
23 |
if ( ! source ) {
|
29 |
className={ className }
|
30 |
source={ source }
|
31 |
maxLength={ 15 }
|
32 |
+
countType={ getSetting( 'wordCountType', 'words' ) }
|
33 |
/>
|
34 |
);
|
35 |
};
|
36 |
|
37 |
+
ProductSummary.propTypes = {
|
38 |
+
className: PropTypes.string,
|
39 |
+
shortDescription: PropTypes.string,
|
40 |
+
fullDescription: PropTypes.string,
|
41 |
+
};
|
42 |
+
|
43 |
export default ProductSummary;
|
assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js}
RENAMED
@@ -1,12 +1,12 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import Button from '@woocommerce/base-components/button';
|
6 |
import { useState } from '@wordpress/element';
|
7 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
8 |
import { useValidationContext } from '@woocommerce/base-context';
|
9 |
-
import type { EnteredAddress, AddressFields } from '@woocommerce/settings';
|
10 |
|
11 |
/**
|
12 |
* Internal dependencies
|
@@ -14,16 +14,11 @@ import type { EnteredAddress, AddressFields } from '@woocommerce/settings';
|
|
14 |
import './style.scss';
|
15 |
import { AddressForm } from '../address-form';
|
16 |
|
17 |
-
interface ShippingCalculatorAddressProps {
|
18 |
-
address: EnteredAddress;
|
19 |
-
onUpdate: ( address: EnteredAddress ) => void;
|
20 |
-
addressFields: Partial< keyof AddressFields >[];
|
21 |
-
}
|
22 |
const ShippingCalculatorAddress = ( {
|
23 |
address: initialAddress,
|
24 |
onUpdate,
|
25 |
addressFields,
|
26 |
-
}
|
27 |
const [ address, setAddress ] = useState( initialAddress );
|
28 |
const {
|
29 |
hasValidationErrors,
|
@@ -60,4 +55,10 @@ const ShippingCalculatorAddress = ( {
|
|
60 |
);
|
61 |
};
|
62 |
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
export default ShippingCalculatorAddress;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
import { __ } from '@wordpress/i18n';
|
6 |
import Button from '@woocommerce/base-components/button';
|
7 |
import { useState } from '@wordpress/element';
|
8 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
9 |
import { useValidationContext } from '@woocommerce/base-context';
|
|
|
10 |
|
11 |
/**
|
12 |
* Internal dependencies
|
14 |
import './style.scss';
|
15 |
import { AddressForm } from '../address-form';
|
16 |
|
|
|
|
|
|
|
|
|
|
|
17 |
const ShippingCalculatorAddress = ( {
|
18 |
address: initialAddress,
|
19 |
onUpdate,
|
20 |
addressFields,
|
21 |
+
} ) => {
|
22 |
const [ address, setAddress ] = useState( initialAddress );
|
23 |
const {
|
24 |
hasValidationErrors,
|
55 |
);
|
56 |
};
|
57 |
|
58 |
+
ShippingCalculatorAddress.propTypes = {
|
59 |
+
address: PropTypes.object.isRequired,
|
60 |
+
onUpdate: PropTypes.func.isRequired,
|
61 |
+
addressFields: PropTypes.array.isRequired,
|
62 |
+
};
|
63 |
+
|
64 |
export default ShippingCalculatorAddress;
|
assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js}
RENAMED
@@ -1,8 +1,8 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import { useShippingDataContext } from '@woocommerce/base-context';
|
5 |
-
import type { EnteredAddress } from '@woocommerce/settings';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
@@ -10,17 +10,10 @@ import type { EnteredAddress } from '@woocommerce/settings';
|
|
10 |
import ShippingCalculatorAddress from './address';
|
11 |
import './style.scss';
|
12 |
|
13 |
-
interface ShippingCalculatorProps {
|
14 |
-
onUpdate?: ( newAddress: EnteredAddress ) => void;
|
15 |
-
addressFields?: Partial< keyof EnteredAddress >[];
|
16 |
-
}
|
17 |
-
|
18 |
const ShippingCalculator = ( {
|
19 |
-
onUpdate = () => {
|
20 |
-
/* Do nothing */
|
21 |
-
},
|
22 |
addressFields = [ 'country', 'state', 'city', 'postcode' ],
|
23 |
-
}
|
24 |
const { shippingAddress, setShippingAddress } = useShippingDataContext();
|
25 |
return (
|
26 |
<div className="wc-block-components-shipping-calculator">
|
@@ -36,4 +29,9 @@ const ShippingCalculator = ( {
|
|
36 |
);
|
37 |
};
|
38 |
|
|
|
|
|
|
|
|
|
|
|
39 |
export default ShippingCalculator;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
import { useShippingDataContext } from '@woocommerce/base-context';
|
|
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
10 |
import ShippingCalculatorAddress from './address';
|
11 |
import './style.scss';
|
12 |
|
|
|
|
|
|
|
|
|
|
|
13 |
const ShippingCalculator = ( {
|
14 |
+
onUpdate = () => {},
|
|
|
|
|
15 |
addressFields = [ 'country', 'state', 'city', 'postcode' ],
|
16 |
+
} ) => {
|
17 |
const { shippingAddress, setShippingAddress } = useShippingDataContext();
|
18 |
return (
|
19 |
<div className="wc-block-components-shipping-calculator">
|
29 |
);
|
30 |
};
|
31 |
|
32 |
+
ShippingCalculator.propTypes = {
|
33 |
+
onUpdate: PropTypes.func,
|
34 |
+
addressFields: PropTypes.array,
|
35 |
+
};
|
36 |
+
|
37 |
export default ShippingCalculator;
|
assets/js/base/components/cart-checkout/shipping-location/index.js
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { __, sprintf } from '@wordpress/i18n';
|
6 |
+
import {
|
7 |
+
SHIPPING_COUNTRIES,
|
8 |
+
SHIPPING_STATES,
|
9 |
+
} from '@woocommerce/block-settings';
|
10 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Shows a formatted shipping location.
|
14 |
+
*
|
15 |
+
* @param {Object} props Incoming props for the component.
|
16 |
+
* @param {Object} props.address Incoming address information.
|
17 |
+
*/
|
18 |
+
const ShippingLocation = ( { address } ) => {
|
19 |
+
// we bail early if we don't have an address.
|
20 |
+
if ( Object.values( address ).length === 0 ) {
|
21 |
+
return null;
|
22 |
+
}
|
23 |
+
const formattedCountry =
|
24 |
+
typeof SHIPPING_COUNTRIES[ address.country ] === 'string'
|
25 |
+
? decodeEntities( SHIPPING_COUNTRIES[ address.country ] )
|
26 |
+
: '';
|
27 |
+
|
28 |
+
const formattedState =
|
29 |
+
typeof SHIPPING_STATES[ address.country ] === 'object' &&
|
30 |
+
typeof SHIPPING_STATES[ address.country ][ address.state ] === 'string'
|
31 |
+
? decodeEntities(
|
32 |
+
SHIPPING_STATES[ address.country ][ address.state ]
|
33 |
+
)
|
34 |
+
: address.state;
|
35 |
+
|
36 |
+
const addressParts = [];
|
37 |
+
|
38 |
+
addressParts.push( address.postcode.toUpperCase() );
|
39 |
+
addressParts.push( address.city );
|
40 |
+
addressParts.push( formattedState );
|
41 |
+
addressParts.push( formattedCountry );
|
42 |
+
|
43 |
+
const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
|
44 |
+
|
45 |
+
return (
|
46 |
+
formattedLocation && (
|
47 |
+
<span className="wc-block-components-shipping-address">
|
48 |
+
{ sprintf(
|
49 |
+
/* Translators: %s location. */
|
50 |
+
__( 'Shipping to %s', 'woo-gutenberg-products-block' ),
|
51 |
+
formattedLocation
|
52 |
+
) + ' ' }
|
53 |
+
</span>
|
54 |
+
)
|
55 |
+
);
|
56 |
+
};
|
57 |
+
|
58 |
+
ShippingLocation.propTypes = {
|
59 |
+
address: PropTypes.shape( {
|
60 |
+
city: PropTypes.string,
|
61 |
+
state: PropTypes.string,
|
62 |
+
postcode: PropTypes.string,
|
63 |
+
country: PropTypes.string,
|
64 |
+
} ),
|
65 |
+
};
|
66 |
+
|
67 |
+
export default ShippingLocation;
|
assets/js/base/components/cart-checkout/shipping-location/index.tsx
DELETED
@@ -1,70 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { __, sprintf } from '@wordpress/i18n';
|
5 |
-
import { EnteredAddress, getSetting } from '@woocommerce/settings';
|
6 |
-
import { decodeEntities } from '@wordpress/html-entities';
|
7 |
-
|
8 |
-
interface ShippingLocationProps {
|
9 |
-
address: EnteredAddress;
|
10 |
-
}
|
11 |
-
|
12 |
-
/**
|
13 |
-
* Shows a formatted shipping location.
|
14 |
-
*
|
15 |
-
* @param {Object} props Incoming props for the component.
|
16 |
-
* @param {Object} props.address Incoming address information.
|
17 |
-
*/
|
18 |
-
const ShippingLocation = ( {
|
19 |
-
address,
|
20 |
-
}: ShippingLocationProps ): JSX.Element | null => {
|
21 |
-
// we bail early if we don't have an address.
|
22 |
-
if ( Object.values( address ).length === 0 ) {
|
23 |
-
return null;
|
24 |
-
}
|
25 |
-
const shippingCountries = getSetting( 'shippingCountries', {} ) as Record<
|
26 |
-
string,
|
27 |
-
string
|
28 |
-
>;
|
29 |
-
const shippingStates = getSetting( 'shippingStates', {} ) as Record<
|
30 |
-
string,
|
31 |
-
Record< string, string >
|
32 |
-
>;
|
33 |
-
const formattedCountry =
|
34 |
-
typeof shippingCountries[ address.country ] === 'string'
|
35 |
-
? decodeEntities( shippingCountries[ address.country ] )
|
36 |
-
: '';
|
37 |
-
|
38 |
-
const formattedState =
|
39 |
-
typeof shippingStates[ address.country ] === 'object' &&
|
40 |
-
typeof shippingStates[ address.country ][ address.state ] === 'string'
|
41 |
-
? decodeEntities(
|
42 |
-
shippingStates[ address.country ][ address.state ]
|
43 |
-
)
|
44 |
-
: address.state;
|
45 |
-
|
46 |
-
const addressParts = [];
|
47 |
-
|
48 |
-
addressParts.push( address.postcode.toUpperCase() );
|
49 |
-
addressParts.push( address.city );
|
50 |
-
addressParts.push( formattedState );
|
51 |
-
addressParts.push( formattedCountry );
|
52 |
-
|
53 |
-
const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
|
54 |
-
|
55 |
-
if ( ! formattedLocation ) {
|
56 |
-
return null;
|
57 |
-
}
|
58 |
-
|
59 |
-
return (
|
60 |
-
<span className="wc-block-components-shipping-address">
|
61 |
-
{ sprintf(
|
62 |
-
/* translators: %s location. */
|
63 |
-
__( 'Shipping to %s', 'woo-gutenberg-products-block' ),
|
64 |
-
formattedLocation
|
65 |
-
) + ' ' }
|
66 |
-
</span>
|
67 |
-
);
|
68 |
-
};
|
69 |
-
|
70 |
-
export default ShippingLocation;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/shipping-rates-control-package/render-package-rate-option.tsx
DELETED
@@ -1,46 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { decodeEntities } from '@wordpress/html-entities';
|
5 |
-
import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
|
6 |
-
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
7 |
-
import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
|
8 |
-
import { getSetting } from '@woocommerce/settings';
|
9 |
-
import { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
|
10 |
-
|
11 |
-
/**
|
12 |
-
* Default render function for package rate options.
|
13 |
-
*
|
14 |
-
* @param {Object} rate Rate data.
|
15 |
-
*/
|
16 |
-
export const renderPackageRateOption = (
|
17 |
-
rate: CartShippingPackageShippingRate
|
18 |
-
): PackageRateOption => {
|
19 |
-
const priceWithTaxes: number = getSetting(
|
20 |
-
'displayCartPricesIncludingTax',
|
21 |
-
false
|
22 |
-
)
|
23 |
-
? parseInt( rate.price, 10 ) + parseInt( rate.taxes, 10 )
|
24 |
-
: parseInt( rate.price, 10 );
|
25 |
-
|
26 |
-
return {
|
27 |
-
label: decodeEntities( rate.name ),
|
28 |
-
value: rate.rate_id,
|
29 |
-
description: (
|
30 |
-
<>
|
31 |
-
{ Number.isFinite( priceWithTaxes ) && (
|
32 |
-
<FormattedMonetaryAmount
|
33 |
-
currency={ getCurrencyFromPriceResponse( rate ) }
|
34 |
-
value={ priceWithTaxes }
|
35 |
-
/>
|
36 |
-
) }
|
37 |
-
{ Number.isFinite( priceWithTaxes ) && rate.delivery_time
|
38 |
-
? ' — '
|
39 |
-
: null }
|
40 |
-
{ decodeEntities( rate.delivery_time ) }
|
41 |
-
</>
|
42 |
-
),
|
43 |
-
};
|
44 |
-
};
|
45 |
-
|
46 |
-
export default renderPackageRateOption;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/shipping-rates-control-package/style.scss
DELETED
@@ -1,43 +0,0 @@
|
|
1 |
-
.wc-block-components-shipping-rates-control__package {
|
2 |
-
.wc-block-components-panel__button {
|
3 |
-
margin-bottom: 0;
|
4 |
-
margin-top: 0;
|
5 |
-
padding-bottom: em($gap-small);
|
6 |
-
padding-top: em($gap-small);
|
7 |
-
}
|
8 |
-
|
9 |
-
// Remove panel padding because we are adding bottom padding to `.wc-block-components-radio-control`
|
10 |
-
// and `.wc-block-components-radio-control__option-layout` in the next ruleset.
|
11 |
-
.wc-block-components-panel__content {
|
12 |
-
padding-bottom: 0;
|
13 |
-
}
|
14 |
-
|
15 |
-
.wc-block-components-radio-control,
|
16 |
-
.wc-block-components-radio-control__option-layout {
|
17 |
-
padding-bottom: 0;
|
18 |
-
}
|
19 |
-
|
20 |
-
.wc-block-components-radio-control .wc-block-components-radio-control__option-layout {
|
21 |
-
padding-bottom: 0;
|
22 |
-
}
|
23 |
-
}
|
24 |
-
|
25 |
-
.wc-block-components-shipping-rates-control__package-items {
|
26 |
-
@include font-size(small);
|
27 |
-
display: block;
|
28 |
-
list-style: none;
|
29 |
-
margin: 0;
|
30 |
-
padding: 0;
|
31 |
-
}
|
32 |
-
|
33 |
-
.wc-block-components-shipping-rates-control__package-item {
|
34 |
-
@include wrap-break-word();
|
35 |
-
display: inline-block;
|
36 |
-
margin: 0;
|
37 |
-
padding: 0;
|
38 |
-
}
|
39 |
-
|
40 |
-
.wc-block-components-shipping-rates-control__package-item:not(:last-child)::after {
|
41 |
-
content: ", ";
|
42 |
-
white-space: pre;
|
43 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/shipping-rates-control/{index.tsx → index.js}
RENAMED
@@ -3,85 +3,22 @@
|
|
3 |
*/
|
4 |
import { __, _n, sprintf } from '@wordpress/i18n';
|
5 |
import { useEffect } from '@wordpress/element';
|
|
|
6 |
import { speak } from '@wordpress/a11y';
|
7 |
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
8 |
-
import {
|
|
|
|
|
|
|
9 |
import {
|
10 |
getShippingRatesPackageCount,
|
11 |
getShippingRatesRateCount,
|
12 |
} from '@woocommerce/base-utils';
|
13 |
-
import { useStoreCart } from '@woocommerce/base-context/hooks';
|
14 |
-
import { CartResponseShippingRate } from '@woocommerce/type-defs/cart-response';
|
15 |
-
import { ReactElement } from 'react';
|
16 |
|
17 |
/**
|
18 |
-
*
|
19 |
-
*/
|
20 |
-
import ShippingRatesControlPackage, {
|
21 |
-
PackageRateRenderOption,
|
22 |
-
} from '../shipping-rates-control-package';
|
23 |
-
|
24 |
-
interface PackagesProps {
|
25 |
-
packages: CartResponseShippingRate[];
|
26 |
-
collapse?: boolean;
|
27 |
-
collapsible?: boolean;
|
28 |
-
showItems?: boolean;
|
29 |
-
noResultsMessage: ReactElement;
|
30 |
-
renderOption: PackageRateRenderOption;
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Renders multiple packages within the slotfill.
|
35 |
-
*
|
36 |
-
* @param {Object} props Incoming props.
|
37 |
-
* @param {Array} props.packages Array of packages.
|
38 |
-
* @param {boolean} props.collapsible If the package should be rendered as a
|
39 |
-
* @param {ReactElement} props.noResultsMessage Rendered when there are no rates in a package.
|
40 |
-
* collapsible panel.
|
41 |
-
* @param {boolean} props.collapse If the panel should be collapsed by default,
|
42 |
-
* only works if collapsible is true.
|
43 |
-
* @param {boolean} props.showItems If we should items below the package name.
|
44 |
-
* @param {PackageRateRenderOption} [props.renderOption] Function to render a shipping rate.
|
45 |
-
* @return {JSX.Element|null} Rendered components.
|
46 |
*/
|
47 |
-
const Packages = ( {
|
48 |
-
packages,
|
49 |
-
collapse,
|
50 |
-
showItems,
|
51 |
-
collapsible,
|
52 |
-
noResultsMessage,
|
53 |
-
renderOption,
|
54 |
-
}: PackagesProps ): JSX.Element | null => {
|
55 |
-
// If there are no packages, return nothing.
|
56 |
-
if ( ! packages.length ) {
|
57 |
-
return null;
|
58 |
-
}
|
59 |
-
return (
|
60 |
-
<>
|
61 |
-
{ packages.map( ( { package_id: packageId, ...packageData } ) => (
|
62 |
-
<ShippingRatesControlPackage
|
63 |
-
key={ packageId }
|
64 |
-
packageId={ packageId }
|
65 |
-
packageData={ packageData }
|
66 |
-
collapsible={ collapsible }
|
67 |
-
collapse={ collapse }
|
68 |
-
showItems={ showItems }
|
69 |
-
noResultsMessage={ noResultsMessage }
|
70 |
-
renderOption={ renderOption }
|
71 |
-
/>
|
72 |
-
) ) }
|
73 |
-
</>
|
74 |
-
);
|
75 |
-
};
|
76 |
|
77 |
-
interface ShippingRatesControlProps {
|
78 |
-
collapsible?: boolean;
|
79 |
-
shippingRates: CartResponseShippingRate[];
|
80 |
-
className?: string;
|
81 |
-
shippingRatesLoading: boolean;
|
82 |
-
noResultsMessage: ReactElement;
|
83 |
-
renderOption: PackageRateRenderOption;
|
84 |
-
}
|
85 |
/**
|
86 |
* Renders the shipping rates control element.
|
87 |
*
|
@@ -89,9 +26,9 @@ interface ShippingRatesControlProps {
|
|
89 |
* @param {Array} props.shippingRates Array of packages containing shipping rates.
|
90 |
* @param {boolean} props.shippingRatesLoading True when rates are being loaded.
|
91 |
* @param {string} props.className Class name for package rates.
|
92 |
-
* @param {boolean}
|
93 |
-
* @param {ReactElement} props.noResultsMessage Rendered when there are no packages.
|
94 |
-
* @param {Function}
|
95 |
*/
|
96 |
const ShippingRatesControl = ( {
|
97 |
shippingRates,
|
@@ -100,7 +37,7 @@ const ShippingRatesControl = ( {
|
|
100 |
collapsible = false,
|
101 |
noResultsMessage,
|
102 |
renderOption,
|
103 |
-
}
|
104 |
useEffect( () => {
|
105 |
if ( shippingRatesLoading ) {
|
106 |
return;
|
@@ -110,7 +47,7 @@ const ShippingRatesControl = ( {
|
|
110 |
if ( packageCount === 1 ) {
|
111 |
speak(
|
112 |
sprintf(
|
113 |
-
|
114 |
_n(
|
115 |
'%d shipping option was found.',
|
116 |
'%d shipping options were found.',
|
@@ -123,7 +60,7 @@ const ShippingRatesControl = ( {
|
|
123 |
} else {
|
124 |
speak(
|
125 |
sprintf(
|
126 |
-
|
127 |
_n(
|
128 |
'Shipping option searched for %d package.',
|
129 |
'Shipping options searched for %d packages.',
|
@@ -134,7 +71,7 @@ const ShippingRatesControl = ( {
|
|
134 |
) +
|
135 |
' ' +
|
136 |
sprintf(
|
137 |
-
|
138 |
_n(
|
139 |
'%d shipping option was found',
|
140 |
'%d shipping options were found',
|
@@ -147,22 +84,6 @@ const ShippingRatesControl = ( {
|
|
147 |
}
|
148 |
}, [ shippingRatesLoading, shippingRates ] );
|
149 |
|
150 |
-
// Prepare props to pass to the ExperimentalOrderShippingPackages slot fill.
|
151 |
-
// We need to pluck out receiveCart.
|
152 |
-
// eslint-disable-next-line no-unused-vars
|
153 |
-
const { extensions, ...cart } = useStoreCart();
|
154 |
-
const slotFillProps = {
|
155 |
-
className,
|
156 |
-
collapsible,
|
157 |
-
noResultsMessage,
|
158 |
-
renderOption,
|
159 |
-
extensions,
|
160 |
-
cart,
|
161 |
-
components: {
|
162 |
-
ShippingRatesControlPackage,
|
163 |
-
},
|
164 |
-
};
|
165 |
-
|
166 |
return (
|
167 |
<LoadingMask
|
168 |
isLoading={ shippingRatesLoading }
|
@@ -172,16 +93,66 @@ const ShippingRatesControl = ( {
|
|
172 |
) }
|
173 |
showSpinner={ true }
|
174 |
>
|
175 |
-
<ExperimentalOrderShippingPackages.Slot
|
|
|
|
|
|
|
|
|
|
|
176 |
<ExperimentalOrderShippingPackages>
|
177 |
<Packages
|
178 |
packages={ shippingRates }
|
179 |
noResultsMessage={ noResultsMessage }
|
180 |
-
renderOption={ renderOption }
|
181 |
/>
|
182 |
</ExperimentalOrderShippingPackages>
|
183 |
</LoadingMask>
|
184 |
);
|
185 |
};
|
186 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
187 |
export default ShippingRatesControl;
|
3 |
*/
|
4 |
import { __, _n, sprintf } from '@wordpress/i18n';
|
5 |
import { useEffect } from '@wordpress/element';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
import { speak } from '@wordpress/a11y';
|
8 |
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
9 |
+
import {
|
10 |
+
ShippingRatesControlPackage,
|
11 |
+
ExperimentalOrderShippingPackages,
|
12 |
+
} from '@woocommerce/blocks-checkout';
|
13 |
import {
|
14 |
getShippingRatesPackageCount,
|
15 |
getShippingRatesRateCount,
|
16 |
} from '@woocommerce/base-utils';
|
|
|
|
|
|
|
17 |
|
18 |
/**
|
19 |
+
* @typedef {import('react')} React
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
/**
|
23 |
* Renders the shipping rates control element.
|
24 |
*
|
26 |
* @param {Array} props.shippingRates Array of packages containing shipping rates.
|
27 |
* @param {boolean} props.shippingRatesLoading True when rates are being loaded.
|
28 |
* @param {string} props.className Class name for package rates.
|
29 |
+
* @param {boolean} props.collapsible If true, when multiple packages are rendered they can be toggled open and closed.
|
30 |
+
* @param {React.ReactElement} props.noResultsMessage Rendered when there are no packages.
|
31 |
+
* @param {Function} props.renderOption Function to render a shipping rate.
|
32 |
*/
|
33 |
const ShippingRatesControl = ( {
|
34 |
shippingRates,
|
37 |
collapsible = false,
|
38 |
noResultsMessage,
|
39 |
renderOption,
|
40 |
+
} ) => {
|
41 |
useEffect( () => {
|
42 |
if ( shippingRatesLoading ) {
|
43 |
return;
|
47 |
if ( packageCount === 1 ) {
|
48 |
speak(
|
49 |
sprintf(
|
50 |
+
// translators: %d number of shipping options found.
|
51 |
_n(
|
52 |
'%d shipping option was found.',
|
53 |
'%d shipping options were found.',
|
60 |
} else {
|
61 |
speak(
|
62 |
sprintf(
|
63 |
+
// translators: %d number of shipping packages packages.
|
64 |
_n(
|
65 |
'Shipping option searched for %d package.',
|
66 |
'Shipping options searched for %d packages.',
|
71 |
) +
|
72 |
' ' +
|
73 |
sprintf(
|
74 |
+
// translators: %d number of shipping options available.
|
75 |
_n(
|
76 |
'%d shipping option was found',
|
77 |
'%d shipping options were found',
|
84 |
}
|
85 |
}, [ shippingRatesLoading, shippingRates ] );
|
86 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
return (
|
88 |
<LoadingMask
|
89 |
isLoading={ shippingRatesLoading }
|
93 |
) }
|
94 |
showSpinner={ true }
|
95 |
>
|
96 |
+
<ExperimentalOrderShippingPackages.Slot
|
97 |
+
className={ className }
|
98 |
+
collapsible={ collapsible }
|
99 |
+
noResultsMessage={ noResultsMessage }
|
100 |
+
renderOption={ renderOption }
|
101 |
+
/>
|
102 |
<ExperimentalOrderShippingPackages>
|
103 |
<Packages
|
104 |
packages={ shippingRates }
|
105 |
noResultsMessage={ noResultsMessage }
|
|
|
106 |
/>
|
107 |
</ExperimentalOrderShippingPackages>
|
108 |
</LoadingMask>
|
109 |
);
|
110 |
};
|
111 |
|
112 |
+
/**
|
113 |
+
* Renders multiple packages within the slotfill.
|
114 |
+
*
|
115 |
+
* @param {Object} props Incoming props.
|
116 |
+
* @param {Array} props.packages Array of packages.
|
117 |
+
* @param {React.ReactElement} props.noResultsMessage Rendered when there are no rates in a package.
|
118 |
+
* @param {boolean} props.collapsible If the package should be rendered as a
|
119 |
+
* collapsible panel.
|
120 |
+
* @param {boolean} props.collapse If the panel should be collapsed by default,
|
121 |
+
* only works if collapsible is true.
|
122 |
+
* @param {boolean} props.showItems If we should items below the package name.
|
123 |
+
* @return {React.ReactElement|Array|null} Rendered components.
|
124 |
+
*/
|
125 |
+
const Packages = ( {
|
126 |
+
packages,
|
127 |
+
collapse,
|
128 |
+
showItems,
|
129 |
+
collapsible,
|
130 |
+
noResultsMessage,
|
131 |
+
} ) => {
|
132 |
+
// If there are no packages, return nothing.
|
133 |
+
if ( ! packages.length ) {
|
134 |
+
return null;
|
135 |
+
}
|
136 |
+
|
137 |
+
return packages.map( ( { package_id: packageId, ...packageData } ) => (
|
138 |
+
<ShippingRatesControlPackage
|
139 |
+
key={ packageId }
|
140 |
+
packageId={ packageId }
|
141 |
+
packageData={ packageData }
|
142 |
+
collapsible={ collapsible }
|
143 |
+
collapse={ collapse }
|
144 |
+
showItems={ showItems }
|
145 |
+
noResultsMessage={ noResultsMessage }
|
146 |
+
/>
|
147 |
+
) );
|
148 |
+
};
|
149 |
+
|
150 |
+
ShippingRatesControl.propTypes = {
|
151 |
+
noResultsMessage: PropTypes.node.isRequired,
|
152 |
+
renderOption: PropTypes.func,
|
153 |
+
className: PropTypes.string,
|
154 |
+
collapsible: PropTypes.bool,
|
155 |
+
shippingRates: PropTypes.array,
|
156 |
+
shippingRatesLoading: PropTypes.bool,
|
157 |
+
};
|
158 |
export default ShippingRatesControl;
|
assets/js/base/components/cart-checkout/totals/coupon/index.js
CHANGED
@@ -6,13 +6,11 @@ import { useState, useEffect, useRef } from '@wordpress/element';
|
|
6 |
import Button from '@woocommerce/base-components/button';
|
7 |
import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
|
8 |
import Label from '@woocommerce/base-components/label';
|
|
|
9 |
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
10 |
import PropTypes from 'prop-types';
|
11 |
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
12 |
-
import {
|
13 |
-
ValidationInputError,
|
14 |
-
useValidationContext,
|
15 |
-
} from '@woocommerce/base-context';
|
16 |
import { Panel } from '@woocommerce/blocks-checkout';
|
17 |
|
18 |
/**
|
@@ -29,6 +27,7 @@ const TotalsCoupon = ( {
|
|
29 |
const [ couponValue, setCouponValue ] = useState( '' );
|
30 |
const currentIsLoading = useRef( false );
|
31 |
const { getValidationError, getValidationErrorId } = useValidationContext();
|
|
|
32 |
const validationError = getValidationError( 'coupon' );
|
33 |
|
34 |
useEffect( () => {
|
@@ -45,21 +44,22 @@ const TotalsCoupon = ( {
|
|
45 |
return (
|
46 |
<Panel
|
47 |
className="wc-block-components-totals-coupon"
|
48 |
-
hasBorder={
|
49 |
initialOpen={ initialOpen }
|
50 |
title={
|
51 |
<Label
|
52 |
label={ __(
|
53 |
-
'Coupon
|
54 |
'woo-gutenberg-products-block'
|
55 |
) }
|
56 |
screenReaderLabel={ __(
|
57 |
-
'
|
58 |
'woo-gutenberg-products-block'
|
59 |
) }
|
60 |
htmlFor={ textInputId }
|
61 |
/>
|
62 |
}
|
|
|
63 |
>
|
64 |
<LoadingMask
|
65 |
screenReaderLabel={ __(
|
6 |
import Button from '@woocommerce/base-components/button';
|
7 |
import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
|
8 |
import Label from '@woocommerce/base-components/label';
|
9 |
+
import { ValidationInputError } from '@woocommerce/base-components/validation';
|
10 |
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
11 |
import PropTypes from 'prop-types';
|
12 |
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
13 |
+
import { useValidationContext } from '@woocommerce/base-context';
|
|
|
|
|
|
|
14 |
import { Panel } from '@woocommerce/blocks-checkout';
|
15 |
|
16 |
/**
|
27 |
const [ couponValue, setCouponValue ] = useState( '' );
|
28 |
const currentIsLoading = useRef( false );
|
29 |
const { getValidationError, getValidationErrorId } = useValidationContext();
|
30 |
+
|
31 |
const validationError = getValidationError( 'coupon' );
|
32 |
|
33 |
useEffect( () => {
|
44 |
return (
|
45 |
<Panel
|
46 |
className="wc-block-components-totals-coupon"
|
47 |
+
hasBorder={ true }
|
48 |
initialOpen={ initialOpen }
|
49 |
title={
|
50 |
<Label
|
51 |
label={ __(
|
52 |
+
'Coupon Code?',
|
53 |
'woo-gutenberg-products-block'
|
54 |
) }
|
55 |
screenReaderLabel={ __(
|
56 |
+
'Introduce Coupon Code',
|
57 |
'woo-gutenberg-products-block'
|
58 |
) }
|
59 |
htmlFor={ textInputId }
|
60 |
/>
|
61 |
}
|
62 |
+
titleTag="h2"
|
63 |
>
|
64 |
<LoadingMask
|
65 |
screenReaderLabel={ __(
|
assets/js/base/components/cart-checkout/totals/coupon/style.scss
CHANGED
@@ -1,19 +1,7 @@
|
|
1 |
-
.wc-block-components-totals-coupon {
|
2 |
-
|
3 |
-
.wc-block-components-panel__button {
|
4 |
-
margin-top: 0;
|
5 |
-
padding-top: 0;
|
6 |
-
}
|
7 |
-
|
8 |
-
.wc-block-components-panel__content {
|
9 |
-
padding-bottom: 0;
|
10 |
-
}
|
11 |
-
}
|
12 |
-
|
13 |
.wc-block-components-totals-coupon__form {
|
14 |
display: flex;
|
15 |
-
width: 100%;
|
16 |
margin-bottom: 0;
|
|
|
17 |
|
18 |
.wc-block-components-totals-coupon__input {
|
19 |
margin-bottom: 0;
|
@@ -29,13 +17,15 @@
|
|
29 |
padding-right: $gap-large;
|
30 |
white-space: nowrap;
|
31 |
}
|
32 |
-
|
33 |
-
.wc-block-components-totals-coupon__button.no-margin {
|
34 |
-
margin: 0;
|
35 |
-
}
|
36 |
}
|
37 |
|
38 |
.wc-block-components-totals-coupon__content {
|
39 |
flex-direction: column;
|
40 |
position: relative;
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
.wc-block-components-totals-coupon__form {
|
2 |
display: flex;
|
|
|
3 |
margin-bottom: 0;
|
4 |
+
width: 100%;
|
5 |
|
6 |
.wc-block-components-totals-coupon__input {
|
7 |
margin-bottom: 0;
|
17 |
padding-right: $gap-large;
|
18 |
white-space: nowrap;
|
19 |
}
|
|
|
|
|
|
|
|
|
20 |
}
|
21 |
|
22 |
.wc-block-components-totals-coupon__content {
|
23 |
flex-direction: column;
|
24 |
position: relative;
|
25 |
+
|
26 |
+
.wc-block-components-validation-error {
|
27 |
+
margin-top: $gap-smaller;
|
28 |
+
position: relative;
|
29 |
+
width: 100%;
|
30 |
+
}
|
31 |
}
|
assets/js/base/components/cart-checkout/totals/discount/index.js
CHANGED
@@ -2,14 +2,11 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
|
|
5 |
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
6 |
import { RemovableChip } from '@woocommerce/base-components/chip';
|
7 |
import PropTypes from 'prop-types';
|
8 |
-
import {
|
9 |
-
__experimentalApplyCheckoutFilter,
|
10 |
-
TotalsItem,
|
11 |
-
} from '@woocommerce/blocks-checkout';
|
12 |
-
import { getSetting } from '@woocommerce/settings';
|
13 |
|
14 |
/**
|
15 |
* Internal dependencies
|
@@ -34,27 +31,16 @@ const TotalsDiscount = ( {
|
|
34 |
}
|
35 |
|
36 |
const discountTaxValue = parseInt( totalDiscountTax, 10 );
|
37 |
-
const discountTotalValue =
|
38 |
-
'displayCartPricesIncludingTax',
|
39 |
-
false
|
40 |
-
)
|
41 |
? discountValue + discountTaxValue
|
42 |
: discountValue;
|
43 |
|
44 |
-
const filteredCartCoupons = __experimentalApplyCheckoutFilter( {
|
45 |
-
arg: {
|
46 |
-
context: 'summary',
|
47 |
-
},
|
48 |
-
filterName: 'coupons',
|
49 |
-
defaultValue: cartCoupons,
|
50 |
-
} );
|
51 |
-
|
52 |
return (
|
53 |
<TotalsItem
|
54 |
className="wc-block-components-totals-discount"
|
55 |
currency={ currency }
|
56 |
description={
|
57 |
-
|
58 |
<LoadingMask
|
59 |
screenReaderLabel={ __(
|
60 |
'Removing coupon…',
|
@@ -64,36 +50,34 @@ const TotalsDiscount = ( {
|
|
64 |
showSpinner={ false }
|
65 |
>
|
66 |
<ul className="wc-block-components-totals-discount__coupon-list">
|
67 |
-
{
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
);
|
96 |
-
} ) }
|
97 |
</ul>
|
98 |
</LoadingMask>
|
99 |
)
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
+
import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
|
6 |
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
7 |
import { RemovableChip } from '@woocommerce/base-components/chip';
|
8 |
import PropTypes from 'prop-types';
|
9 |
+
import { TotalsItem } from '@woocommerce/blocks-checkout';
|
|
|
|
|
|
|
|
|
10 |
|
11 |
/**
|
12 |
* Internal dependencies
|
31 |
}
|
32 |
|
33 |
const discountTaxValue = parseInt( totalDiscountTax, 10 );
|
34 |
+
const discountTotalValue = DISPLAY_CART_PRICES_INCLUDING_TAX
|
|
|
|
|
|
|
35 |
? discountValue + discountTaxValue
|
36 |
: discountValue;
|
37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
return (
|
39 |
<TotalsItem
|
40 |
className="wc-block-components-totals-discount"
|
41 |
currency={ currency }
|
42 |
description={
|
43 |
+
cartCoupons.length !== 0 && (
|
44 |
<LoadingMask
|
45 |
screenReaderLabel={ __(
|
46 |
'Removing coupon…',
|
50 |
showSpinner={ false }
|
51 |
>
|
52 |
<ul className="wc-block-components-totals-discount__coupon-list">
|
53 |
+
{ cartCoupons.map( ( cartCoupon ) => (
|
54 |
+
<RemovableChip
|
55 |
+
key={ 'coupon-' + cartCoupon.code }
|
56 |
+
className="wc-block-components-totals-discount__coupon-list-item"
|
57 |
+
text={ cartCoupon.code }
|
58 |
+
screenReaderText={ sprintf(
|
59 |
+
/* Translators: %s Coupon code. */
|
60 |
+
__(
|
61 |
+
'Coupon: %s',
|
62 |
+
'woo-gutenberg-products-block'
|
63 |
+
),
|
64 |
+
cartCoupon.code
|
65 |
+
) }
|
66 |
+
disabled={ isRemovingCoupon }
|
67 |
+
onRemove={ () => {
|
68 |
+
removeCoupon( cartCoupon.code );
|
69 |
+
} }
|
70 |
+
radius="large"
|
71 |
+
ariaLabel={ sprintf(
|
72 |
+
/* Translators: %s is a coupon code. */
|
73 |
+
__(
|
74 |
+
'Remove coupon "%s"',
|
75 |
+
'woo-gutenberg-products-block'
|
76 |
+
),
|
77 |
+
cartCoupon.code
|
78 |
+
) }
|
79 |
+
/>
|
80 |
+
) ) }
|
|
|
|
|
81 |
</ul>
|
82 |
</LoadingMask>
|
83 |
)
|
assets/js/base/components/cart-checkout/totals/discount/style.scss
CHANGED
@@ -3,7 +3,3 @@
|
|
3 |
margin: 0;
|
4 |
padding: 0;
|
5 |
}
|
6 |
-
|
7 |
-
.wc-block-components-totals-discount .wc-block-components-totals-item__value {
|
8 |
-
color: $discount-color;
|
9 |
-
}
|
3 |
margin: 0;
|
4 |
padding: 0;
|
5 |
}
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/totals/footer-item/index.js
CHANGED
@@ -2,40 +2,32 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
|
|
|
|
|
|
|
|
5 |
import { createInterpolateElement } from 'wordpress-element';
|
6 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
7 |
import PropTypes from 'prop-types';
|
8 |
import {
|
9 |
-
|
10 |
TotalsItem,
|
11 |
} from '@woocommerce/blocks-checkout';
|
12 |
-
import {
|
13 |
-
import { getSetting } from '@woocommerce/settings';
|
14 |
|
15 |
/**
|
16 |
* Internal dependencies
|
17 |
*/
|
18 |
import './style.scss';
|
19 |
|
20 |
-
const
|
21 |
-
const SHOW_TAXES =
|
22 |
-
getSetting( 'taxesEnabled', true ) &&
|
23 |
-
getSetting( 'displayCartPricesIncludingTax', false );
|
24 |
|
|
|
25 |
const { total_price: totalPrice, total_tax: totalTax } = values;
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
const { receiveCart, ...cart } = useStoreCart();
|
31 |
-
const label = __experimentalApplyCheckoutFilter( {
|
32 |
-
filterName: 'totalLabel',
|
33 |
-
defaultValue: __( 'Total', 'woo-gutenberg-products-block' ),
|
34 |
-
extensions: cart.extensions,
|
35 |
-
arg: { cart },
|
36 |
-
} );
|
37 |
-
|
38 |
-
const parsedTaxValue = parseInt( totalTax, 10 );
|
39 |
|
40 |
return (
|
41 |
<TotalsItem
|
@@ -44,8 +36,7 @@ const TotalsFooterItem = ( { currency, values } ) => {
|
|
44 |
label={ label }
|
45 |
value={ parseInt( totalPrice, 10 ) }
|
46 |
description={
|
47 |
-
SHOW_TAXES &&
|
48 |
-
parsedTaxValue !== 0 && (
|
49 |
<p className="wc-block-components-totals-footer-item-tax">
|
50 |
{ createInterpolateElement(
|
51 |
__(
|
@@ -57,7 +48,8 @@ const TotalsFooterItem = ( { currency, values } ) => {
|
|
57 |
<FormattedMonetaryAmount
|
58 |
className="wc-block-components-totals-footer-item-tax-value"
|
59 |
currency={ currency }
|
60 |
-
|
|
|
61 |
/>
|
62 |
),
|
63 |
}
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
+
import {
|
6 |
+
TAXES_ENABLED,
|
7 |
+
DISPLAY_CART_PRICES_INCLUDING_TAX,
|
8 |
+
} from '@woocommerce/block-settings';
|
9 |
import { createInterpolateElement } from 'wordpress-element';
|
10 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
11 |
import PropTypes from 'prop-types';
|
12 |
import {
|
13 |
+
__EXPERIMENTAL_TOTAL_LABEL_FILTER,
|
14 |
TotalsItem,
|
15 |
} from '@woocommerce/blocks-checkout';
|
16 |
+
import { applyFilters } from '@wordpress/hooks';
|
|
|
17 |
|
18 |
/**
|
19 |
* Internal dependencies
|
20 |
*/
|
21 |
import './style.scss';
|
22 |
|
23 |
+
const SHOW_TAXES = TAXES_ENABLED && DISPLAY_CART_PRICES_INCLUDING_TAX;
|
|
|
|
|
|
|
24 |
|
25 |
+
const TotalsFooterItem = ( { currency, values } ) => {
|
26 |
const { total_price: totalPrice, total_tax: totalTax } = values;
|
27 |
+
const label = applyFilters(
|
28 |
+
__EXPERIMENTAL_TOTAL_LABEL_FILTER,
|
29 |
+
__( 'Total', 'woo-gutenberg-products-block' )
|
30 |
+
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
|
32 |
return (
|
33 |
<TotalsItem
|
36 |
label={ label }
|
37 |
value={ parseInt( totalPrice, 10 ) }
|
38 |
description={
|
39 |
+
SHOW_TAXES && (
|
|
|
40 |
<p className="wc-block-components-totals-footer-item-tax">
|
41 |
{ createInterpolateElement(
|
42 |
__(
|
48 |
<FormattedMonetaryAmount
|
49 |
className="wc-block-components-totals-footer-item-tax-value"
|
50 |
currency={ currency }
|
51 |
+
displayType="text"
|
52 |
+
value={ parseInt( totalTax, 10 ) }
|
53 |
/>
|
54 |
),
|
55 |
}
|
assets/js/base/components/cart-checkout/totals/footer-item/style.scss
CHANGED
@@ -5,7 +5,7 @@
|
|
5 |
}
|
6 |
|
7 |
.wc-block-components-totals-item__label {
|
8 |
-
font-weight:
|
9 |
}
|
10 |
|
11 |
.wc-block-components-totals-footer-item-tax {
|
5 |
}
|
6 |
|
7 |
.wc-block-components-totals-item__label {
|
8 |
+
font-weight: normal;
|
9 |
}
|
10 |
|
11 |
.wc-block-components-totals-footer-item-tax {
|
assets/js/base/components/cart-checkout/totals/footer-item/test/__snapshots__/index.js.snap
DELETED
@@ -1,79 +0,0 @@
|
|
1 |
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2 |
-
|
3 |
-
exports[`TotalsFooterItem Does not show the "including %s of tax" line if tax is 0 1`] = `
|
4 |
-
<div>
|
5 |
-
<div
|
6 |
-
class="wc-block-components-totals-item wc-block-components-totals-footer-item"
|
7 |
-
>
|
8 |
-
<span
|
9 |
-
class="wc-block-components-totals-item__label"
|
10 |
-
>
|
11 |
-
Total
|
12 |
-
</span>
|
13 |
-
<span
|
14 |
-
class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
|
15 |
-
>
|
16 |
-
£85.00
|
17 |
-
</span>
|
18 |
-
<div
|
19 |
-
class="wc-block-components-totals-item__description"
|
20 |
-
/>
|
21 |
-
</div>
|
22 |
-
</div>
|
23 |
-
`;
|
24 |
-
|
25 |
-
exports[`TotalsFooterItem Does not show the "including %s of tax" line if tax is disabled 1`] = `
|
26 |
-
<div>
|
27 |
-
<div
|
28 |
-
class="wc-block-components-totals-item wc-block-components-totals-footer-item"
|
29 |
-
>
|
30 |
-
<span
|
31 |
-
class="wc-block-components-totals-item__label"
|
32 |
-
>
|
33 |
-
Total
|
34 |
-
</span>
|
35 |
-
<span
|
36 |
-
class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
|
37 |
-
>
|
38 |
-
£85.00
|
39 |
-
</span>
|
40 |
-
<div
|
41 |
-
class="wc-block-components-totals-item__description"
|
42 |
-
/>
|
43 |
-
</div>
|
44 |
-
</div>
|
45 |
-
`;
|
46 |
-
|
47 |
-
exports[`TotalsFooterItem Shows the "including %s of tax" line if tax is greater than 0 1`] = `
|
48 |
-
<div>
|
49 |
-
<div
|
50 |
-
class="wc-block-components-totals-item wc-block-components-totals-footer-item"
|
51 |
-
>
|
52 |
-
<span
|
53 |
-
class="wc-block-components-totals-item__label"
|
54 |
-
>
|
55 |
-
Total
|
56 |
-
</span>
|
57 |
-
<span
|
58 |
-
class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
|
59 |
-
>
|
60 |
-
£85.00
|
61 |
-
</span>
|
62 |
-
<div
|
63 |
-
class="wc-block-components-totals-item__description"
|
64 |
-
>
|
65 |
-
<p
|
66 |
-
class="wc-block-components-totals-footer-item-tax"
|
67 |
-
>
|
68 |
-
Including
|
69 |
-
<span
|
70 |
-
class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-footer-item-tax-value"
|
71 |
-
>
|
72 |
-
£1.00
|
73 |
-
</span>
|
74 |
-
in taxes
|
75 |
-
</p>
|
76 |
-
</div>
|
77 |
-
</div>
|
78 |
-
</div>
|
79 |
-
`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/totals/footer-item/test/index.js
DELETED
@@ -1,81 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { render } from '@testing-library/react';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import TotalsFooterItem from '../index';
|
10 |
-
import { allSettings } from '../../../../../../settings/shared/settings-init';
|
11 |
-
|
12 |
-
describe( 'TotalsFooterItem', () => {
|
13 |
-
beforeEach( () => {
|
14 |
-
allSettings.taxesEnabled = true;
|
15 |
-
allSettings.displayCartPricesIncludingTax = true;
|
16 |
-
} );
|
17 |
-
const currency = {
|
18 |
-
code: 'GBP',
|
19 |
-
decimalSeparator: '.',
|
20 |
-
minorUnit: 2,
|
21 |
-
prefix: '£',
|
22 |
-
suffix: '',
|
23 |
-
symbol: '£',
|
24 |
-
thousandSeparator: ',',
|
25 |
-
};
|
26 |
-
|
27 |
-
const values = {
|
28 |
-
currency_code: 'GBP',
|
29 |
-
currency_decimal_separator: '.',
|
30 |
-
currency_minor_unit: 2,
|
31 |
-
currency_prefix: '£',
|
32 |
-
currency_suffix: '',
|
33 |
-
currency_symbol: '£',
|
34 |
-
currency_thousand_separator: ',',
|
35 |
-
tax_lines: [],
|
36 |
-
length: 2,
|
37 |
-
total_discount: '0',
|
38 |
-
total_discount_tax: '0',
|
39 |
-
total_fees: '0',
|
40 |
-
total_fees_tax: '0',
|
41 |
-
total_items: '7100',
|
42 |
-
total_items_tax: '0',
|
43 |
-
total_price: '8500',
|
44 |
-
total_shipping: '0',
|
45 |
-
total_shipping_tax: '0',
|
46 |
-
total_tax: '0',
|
47 |
-
};
|
48 |
-
|
49 |
-
it( 'Does not show the "including %s of tax" line if tax is 0', () => {
|
50 |
-
const { container } = render(
|
51 |
-
<TotalsFooterItem currency={ currency } values={ values } />
|
52 |
-
);
|
53 |
-
expect( container ).toMatchSnapshot();
|
54 |
-
} );
|
55 |
-
|
56 |
-
it( 'Does not show the "including %s of tax" line if tax is disabled', () => {
|
57 |
-
allSettings.taxesEnabled = false;
|
58 |
-
/* This shouldn't ever happen if taxes are disabled, but this is to test whether the taxesEnabled setting works */
|
59 |
-
const valuesWithTax = {
|
60 |
-
...values,
|
61 |
-
total_tax: '100',
|
62 |
-
total_items_tax: '100',
|
63 |
-
};
|
64 |
-
const { container } = render(
|
65 |
-
<TotalsFooterItem currency={ currency } values={ valuesWithTax } />
|
66 |
-
);
|
67 |
-
expect( container ).toMatchSnapshot();
|
68 |
-
} );
|
69 |
-
|
70 |
-
it( 'Shows the "including %s of tax" line if tax is greater than 0', () => {
|
71 |
-
const valuesWithTax = {
|
72 |
-
...values,
|
73 |
-
total_tax: '100',
|
74 |
-
total_items_tax: '100',
|
75 |
-
};
|
76 |
-
const { container } = render(
|
77 |
-
<TotalsFooterItem currency={ currency } values={ valuesWithTax } />
|
78 |
-
);
|
79 |
-
expect( container ).toMatchSnapshot();
|
80 |
-
} );
|
81 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/totals/shipping/{index.tsx → index.js}
RENAMED
@@ -3,127 +3,42 @@
|
|
3 |
*/
|
4 |
import classnames from 'classnames';
|
5 |
import { __ } from '@wordpress/i18n';
|
|
|
|
|
6 |
import { useState } from '@wordpress/element';
|
7 |
-
import { useStoreCart } from '@woocommerce/base-
|
|
|
|
|
|
|
|
|
8 |
import { TotalsItem } from '@woocommerce/blocks-checkout';
|
9 |
-
import type { Currency } from '@woocommerce/price-format';
|
10 |
-
import type { ReactElement } from 'react';
|
11 |
-
import { getSetting, EnteredAddress } from '@woocommerce/settings';
|
12 |
-
import { ShippingVia } from '@woocommerce/base-components/cart-checkout/totals/shipping/shipping-via';
|
13 |
|
14 |
/**
|
15 |
* Internal dependencies
|
16 |
*/
|
17 |
import ShippingRateSelector from './shipping-rate-selector';
|
18 |
import hasShippingRate from './has-shipping-rate';
|
19 |
-
import ShippingCalculator from '../../shipping-calculator';
|
20 |
-
import ShippingLocation from '../../shipping-location';
|
21 |
import './style.scss';
|
22 |
|
23 |
-
|
24 |
-
label?: string;
|
25 |
-
isShippingCalculatorOpen: boolean;
|
26 |
-
setIsShippingCalculatorOpen: ( isShippingCalculatorOpen: boolean ) => void;
|
27 |
-
}
|
28 |
-
|
29 |
-
const CalculatorButton = ( {
|
30 |
-
label = __( 'Calculate', 'woo-gutenberg-products-block' ),
|
31 |
-
isShippingCalculatorOpen,
|
32 |
-
setIsShippingCalculatorOpen,
|
33 |
-
}: CalculatorButtonProps ): ReactElement => {
|
34 |
-
return (
|
35 |
-
<button
|
36 |
-
className="wc-block-components-totals-shipping__change-address-button"
|
37 |
-
onClick={ () => {
|
38 |
-
setIsShippingCalculatorOpen( ! isShippingCalculatorOpen );
|
39 |
-
} }
|
40 |
-
aria-expanded={ isShippingCalculatorOpen }
|
41 |
-
>
|
42 |
-
{ label }
|
43 |
-
</button>
|
44 |
-
);
|
45 |
-
};
|
46 |
-
|
47 |
-
interface ShippingAddressProps {
|
48 |
-
showCalculator: boolean;
|
49 |
-
isShippingCalculatorOpen: boolean;
|
50 |
-
setIsShippingCalculatorOpen: CalculatorButtonProps[ 'setIsShippingCalculatorOpen' ];
|
51 |
-
shippingAddress: EnteredAddress;
|
52 |
-
}
|
53 |
-
|
54 |
-
const ShippingAddress = ( {
|
55 |
-
showCalculator,
|
56 |
-
isShippingCalculatorOpen,
|
57 |
-
setIsShippingCalculatorOpen,
|
58 |
-
shippingAddress,
|
59 |
-
}: ShippingAddressProps ): ReactElement | null => {
|
60 |
-
return (
|
61 |
-
<>
|
62 |
-
<ShippingLocation address={ shippingAddress } />
|
63 |
-
{ showCalculator && (
|
64 |
-
<CalculatorButton
|
65 |
-
label={ __(
|
66 |
-
'(change address)',
|
67 |
-
'woo-gutenberg-products-block'
|
68 |
-
) }
|
69 |
-
isShippingCalculatorOpen={ isShippingCalculatorOpen }
|
70 |
-
setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
|
71 |
-
/>
|
72 |
-
) }
|
73 |
-
</>
|
74 |
-
);
|
75 |
-
};
|
76 |
-
|
77 |
-
interface NoShippingPlaceholderProps {
|
78 |
-
showCalculator: boolean;
|
79 |
-
isShippingCalculatorOpen: boolean;
|
80 |
-
setIsShippingCalculatorOpen: CalculatorButtonProps[ 'setIsShippingCalculatorOpen' ];
|
81 |
-
}
|
82 |
-
|
83 |
-
const NoShippingPlaceholder = ( {
|
84 |
-
showCalculator,
|
85 |
-
isShippingCalculatorOpen,
|
86 |
-
setIsShippingCalculatorOpen,
|
87 |
-
}: NoShippingPlaceholderProps ): ReactElement => {
|
88 |
-
if ( ! showCalculator ) {
|
89 |
-
return (
|
90 |
-
<em>
|
91 |
-
{ __(
|
92 |
-
'Calculated during checkout',
|
93 |
-
'woo-gutenberg-products-block'
|
94 |
-
) }
|
95 |
-
</em>
|
96 |
-
);
|
97 |
-
}
|
98 |
-
|
99 |
-
return (
|
100 |
-
<CalculatorButton
|
101 |
-
isShippingCalculatorOpen={ isShippingCalculatorOpen }
|
102 |
-
setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
|
103 |
-
/>
|
104 |
-
);
|
105 |
-
};
|
106 |
-
|
107 |
-
interface TotalShippingProps {
|
108 |
-
currency: Currency;
|
109 |
-
values: {
|
110 |
-
// eslint-disable-next-line camelcase
|
111 |
-
total_shipping: string;
|
112 |
-
// eslint-disable-next-line camelcase
|
113 |
-
total_shipping_tax: string;
|
114 |
-
}; // Values in use
|
115 |
-
showCalculator?: boolean; //Whether to display the rate selector below the shipping total.
|
116 |
-
showRateSelector?: boolean; // Whether to show shipping calculator or not.
|
117 |
-
className?: string;
|
118 |
-
}
|
119 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
const TotalsShipping = ( {
|
121 |
currency,
|
122 |
values,
|
123 |
showCalculator = true,
|
124 |
showRateSelector = true,
|
125 |
className,
|
126 |
-
}
|
127 |
const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
|
128 |
false
|
129 |
);
|
@@ -134,10 +49,7 @@ const TotalsShipping = ( {
|
|
134 |
shippingRatesLoading,
|
135 |
} = useStoreCart();
|
136 |
|
137 |
-
const totalShippingValue =
|
138 |
-
'displayCartPricesIncludingTax',
|
139 |
-
false
|
140 |
-
)
|
141 |
? parseInt( values.total_shipping, 10 ) +
|
142 |
parseInt( values.total_shipping_tax, 10 )
|
143 |
: parseInt( values.total_shipping, 10 );
|
@@ -147,14 +59,6 @@ const TotalsShipping = ( {
|
|
147 |
setIsShippingCalculatorOpen,
|
148 |
};
|
149 |
|
150 |
-
const selectedShippingRates = shippingRates.flatMap(
|
151 |
-
( shippingPackage ) => {
|
152 |
-
return shippingPackage.shipping_rates
|
153 |
-
.filter( ( rate ) => rate.selected )
|
154 |
-
.flatMap( ( rate ) => rate.name );
|
155 |
-
}
|
156 |
-
);
|
157 |
-
|
158 |
return (
|
159 |
<div
|
160 |
className={ classnames(
|
@@ -177,18 +81,11 @@ const TotalsShipping = ( {
|
|
177 |
description={
|
178 |
<>
|
179 |
{ cartHasCalculatedShipping && (
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
/>
|
186 |
-
<ShippingAddress
|
187 |
-
shippingAddress={ shippingAddress }
|
188 |
-
showCalculator={ showCalculator }
|
189 |
-
{ ...calculatorButtonProps }
|
190 |
-
/>
|
191 |
-
</>
|
192 |
) }
|
193 |
</>
|
194 |
}
|
@@ -212,4 +109,80 @@ const TotalsShipping = ( {
|
|
212 |
);
|
213 |
};
|
214 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
215 |
export default TotalsShipping;
|
3 |
*/
|
4 |
import classnames from 'classnames';
|
5 |
import { __ } from '@wordpress/i18n';
|
6 |
+
import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
|
7 |
+
import PropTypes from 'prop-types';
|
8 |
import { useState } from '@wordpress/element';
|
9 |
+
import { useStoreCart } from '@woocommerce/base-hooks';
|
10 |
+
import {
|
11 |
+
ShippingCalculator,
|
12 |
+
ShippingLocation,
|
13 |
+
} from '@woocommerce/base-components/cart-checkout';
|
14 |
import { TotalsItem } from '@woocommerce/blocks-checkout';
|
|
|
|
|
|
|
|
|
15 |
|
16 |
/**
|
17 |
* Internal dependencies
|
18 |
*/
|
19 |
import ShippingRateSelector from './shipping-rate-selector';
|
20 |
import hasShippingRate from './has-shipping-rate';
|
|
|
|
|
21 |
import './style.scss';
|
22 |
|
23 |
+
/** @typedef {import('react')} React */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
+
/**
|
26 |
+
* Renders the shipping totals row, rates, and calculator if enabled.
|
27 |
+
*
|
28 |
+
* @param {Object} props Incoming props for the component.
|
29 |
+
* @param {Object} props.currency Currency information.
|
30 |
+
* @param {Object} props.values Values in use.
|
31 |
+
* @param {boolean} props.showRateSelector Whether to display the rate selector below the shipping total.
|
32 |
+
* @param {boolean} props.showCalculator Whether to show shipping calculator or not.
|
33 |
+
* @param {string} props.className CSS Class supplied by consumer.
|
34 |
+
*/
|
35 |
const TotalsShipping = ( {
|
36 |
currency,
|
37 |
values,
|
38 |
showCalculator = true,
|
39 |
showRateSelector = true,
|
40 |
className,
|
41 |
+
} ) => {
|
42 |
const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
|
43 |
false
|
44 |
);
|
49 |
shippingRatesLoading,
|
50 |
} = useStoreCart();
|
51 |
|
52 |
+
const totalShippingValue = DISPLAY_CART_PRICES_INCLUDING_TAX
|
|
|
|
|
|
|
53 |
? parseInt( values.total_shipping, 10 ) +
|
54 |
parseInt( values.total_shipping_tax, 10 )
|
55 |
: parseInt( values.total_shipping, 10 );
|
59 |
setIsShippingCalculatorOpen,
|
60 |
};
|
61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
return (
|
63 |
<div
|
64 |
className={ classnames(
|
81 |
description={
|
82 |
<>
|
83 |
{ cartHasCalculatedShipping && (
|
84 |
+
<ShippingAddress
|
85 |
+
shippingAddress={ shippingAddress }
|
86 |
+
showCalculator={ showCalculator }
|
87 |
+
{ ...calculatorButtonProps }
|
88 |
+
/>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
) }
|
90 |
</>
|
91 |
}
|
109 |
);
|
110 |
};
|
111 |
|
112 |
+
const ShippingAddress = ( {
|
113 |
+
showCalculator,
|
114 |
+
isShippingCalculatorOpen,
|
115 |
+
setIsShippingCalculatorOpen,
|
116 |
+
shippingAddress,
|
117 |
+
} ) => {
|
118 |
+
return (
|
119 |
+
<>
|
120 |
+
<ShippingLocation address={ shippingAddress } />
|
121 |
+
{ showCalculator && (
|
122 |
+
<CalculatorButton
|
123 |
+
label={ __(
|
124 |
+
'(change address)',
|
125 |
+
'woo-gutenberg-products-block'
|
126 |
+
) }
|
127 |
+
isShippingCalculatorOpen={ isShippingCalculatorOpen }
|
128 |
+
setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
|
129 |
+
/>
|
130 |
+
) }
|
131 |
+
</>
|
132 |
+
);
|
133 |
+
};
|
134 |
+
|
135 |
+
const NoShippingPlaceholder = ( {
|
136 |
+
showCalculator,
|
137 |
+
isShippingCalculatorOpen,
|
138 |
+
setIsShippingCalculatorOpen,
|
139 |
+
} ) => {
|
140 |
+
if ( ! showCalculator ) {
|
141 |
+
return (
|
142 |
+
<em>
|
143 |
+
{ __(
|
144 |
+
'Calculated during checkout',
|
145 |
+
'woo-gutenberg-products-block'
|
146 |
+
) }
|
147 |
+
</em>
|
148 |
+
);
|
149 |
+
}
|
150 |
+
|
151 |
+
return (
|
152 |
+
<CalculatorButton
|
153 |
+
isShippingCalculatorOpen={ isShippingCalculatorOpen }
|
154 |
+
setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
|
155 |
+
/>
|
156 |
+
);
|
157 |
+
};
|
158 |
+
|
159 |
+
const CalculatorButton = ( {
|
160 |
+
label = __( 'Calculate', 'woo-gutenberg-products-block' ),
|
161 |
+
isShippingCalculatorOpen,
|
162 |
+
setIsShippingCalculatorOpen,
|
163 |
+
} ) => {
|
164 |
+
return (
|
165 |
+
<button
|
166 |
+
className="wc-block-components-totals-shipping__change-address-button"
|
167 |
+
onClick={ () => {
|
168 |
+
setIsShippingCalculatorOpen( ! isShippingCalculatorOpen );
|
169 |
+
} }
|
170 |
+
aria-expanded={ isShippingCalculatorOpen }
|
171 |
+
>
|
172 |
+
{ label }
|
173 |
+
</button>
|
174 |
+
);
|
175 |
+
};
|
176 |
+
|
177 |
+
TotalsShipping.propTypes = {
|
178 |
+
currency: PropTypes.object.isRequired,
|
179 |
+
values: PropTypes.shape( {
|
180 |
+
total_shipping: PropTypes.string,
|
181 |
+
total_shipping_tax: PropTypes.string,
|
182 |
+
} ).isRequired,
|
183 |
+
showRateSelector: PropTypes.bool,
|
184 |
+
showCalculator: PropTypes.bool,
|
185 |
+
className: PropTypes.string,
|
186 |
+
};
|
187 |
+
|
188 |
export default TotalsShipping;
|
assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx
DELETED
@@ -1,17 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { __ } from '@wordpress/i18n';
|
5 |
-
|
6 |
-
export const ShippingVia = ( {
|
7 |
-
selectedShippingRates,
|
8 |
-
}: {
|
9 |
-
selectedShippingRates: string[];
|
10 |
-
} ): JSX.Element => {
|
11 |
-
return (
|
12 |
-
<div className="wc-block-components-totals-item__description wc-block-components-totals-shipping__via">
|
13 |
-
{ __( 'via', 'woo-gutenberg-products-block' ) }{ ' ' }
|
14 |
-
{ selectedShippingRates.join( ', ' ) }
|
15 |
-
</div>
|
16 |
-
);
|
17 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/totals/shipping/style.scss
CHANGED
@@ -1,4 +1,6 @@
|
|
1 |
.wc-block-components-totals-shipping {
|
|
|
|
|
2 |
// Added extra label for specificity.
|
3 |
fieldset.wc-block-components-totals-shipping__fieldset {
|
4 |
background-color: transparent;
|
@@ -7,10 +9,6 @@
|
|
7 |
border: 0;
|
8 |
}
|
9 |
|
10 |
-
.wc-block-components-totals-shipping__via {
|
11 |
-
margin-bottom: $gap;
|
12 |
-
}
|
13 |
-
|
14 |
.wc-block-components-totals-shipping__options {
|
15 |
.wc-block-components-radio-control__label,
|
16 |
.wc-block-components-radio-control__description,
|
@@ -21,8 +19,15 @@
|
|
21 |
}
|
22 |
}
|
23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
.wc-block-components-shipping-rates-control__no-results-notice {
|
25 |
-
margin:
|
26 |
}
|
27 |
|
28 |
.wc-block-components-totals-shipping__change-address-button {
|
@@ -34,9 +39,8 @@
|
|
34 |
opacity: 0.8;
|
35 |
}
|
36 |
}
|
37 |
-
}
|
38 |
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
}
|
1 |
.wc-block-components-totals-shipping {
|
2 |
+
@include with-translucent-border(1px 0 0);
|
3 |
+
|
4 |
// Added extra label for specificity.
|
5 |
fieldset.wc-block-components-totals-shipping__fieldset {
|
6 |
background-color: transparent;
|
9 |
border: 0;
|
10 |
}
|
11 |
|
|
|
|
|
|
|
|
|
12 |
.wc-block-components-totals-shipping__options {
|
13 |
.wc-block-components-radio-control__label,
|
14 |
.wc-block-components-radio-control__description,
|
19 |
}
|
20 |
}
|
21 |
|
22 |
+
.wc-block-components-radio-control__option,
|
23 |
+
.wc-block-components-radio-control__option-layout {
|
24 |
+
&:last-child::after {
|
25 |
+
display: none;
|
26 |
+
}
|
27 |
+
}
|
28 |
+
|
29 |
.wc-block-components-shipping-rates-control__no-results-notice {
|
30 |
+
margin-bottom: em($gap-small);
|
31 |
}
|
32 |
|
33 |
.wc-block-components-totals-shipping__change-address-button {
|
39 |
opacity: 0.8;
|
40 |
}
|
41 |
}
|
|
|
42 |
|
43 |
+
.wc-blocks-components-panel:last-child::after {
|
44 |
+
border-bottom-width: 0;
|
45 |
+
}
|
46 |
}
|
assets/js/base/components/checkbox-control/style.scss
CHANGED
@@ -6,7 +6,6 @@
|
|
6 |
position: relative;
|
7 |
|
8 |
.wc-block-components-checkbox__input[type="checkbox"] {
|
9 |
-
font-size: 1em;
|
10 |
appearance: none;
|
11 |
border: 2px solid $input-border-gray;
|
12 |
border-radius: 2px;
|
@@ -25,11 +24,6 @@
|
|
25 |
border-color: $input-border-gray;
|
26 |
}
|
27 |
|
28 |
-
&::before,
|
29 |
-
&::after {
|
30 |
-
content: "";
|
31 |
-
}
|
32 |
-
|
33 |
&:not(:checked) + .wc-block-components-checkbox__mark {
|
34 |
display: none;
|
35 |
}
|
@@ -81,8 +75,7 @@
|
|
81 |
}
|
82 |
|
83 |
.wc-block-components-checkbox__input[type="checkbox"]:checked,
|
84 |
-
.has-dark-controls
|
85 |
-
.wc-block-components-checkbox__input[type="checkbox"]:checked {
|
86 |
background-color: #fff;
|
87 |
border-color: var(--form--border-color);
|
88 |
}
|
6 |
position: relative;
|
7 |
|
8 |
.wc-block-components-checkbox__input[type="checkbox"] {
|
|
|
9 |
appearance: none;
|
10 |
border: 2px solid $input-border-gray;
|
11 |
border-radius: 2px;
|
24 |
border-color: $input-border-gray;
|
25 |
}
|
26 |
|
|
|
|
|
|
|
|
|
|
|
27 |
&:not(:checked) + .wc-block-components-checkbox__mark {
|
28 |
display: none;
|
29 |
}
|
75 |
}
|
76 |
|
77 |
.wc-block-components-checkbox__input[type="checkbox"]:checked,
|
78 |
+
.has-dark-controls .wc-block-components-checkbox__input[type="checkbox"]:checked {
|
|
|
79 |
background-color: #fff;
|
80 |
border-color: var(--form--border-color);
|
81 |
}
|
assets/js/base/components/checkbox-list/index.js
CHANGED
@@ -58,7 +58,7 @@ const CheckboxList = ( {
|
|
58 |
} }
|
59 |
aria-expanded={ false }
|
60 |
aria-label={ sprintf(
|
61 |
-
/*
|
62 |
_n(
|
63 |
'Show %s more option',
|
64 |
'Show %s more options',
|
@@ -69,7 +69,7 @@ const CheckboxList = ( {
|
|
69 |
) }
|
70 |
>
|
71 |
{ sprintf(
|
72 |
-
|
73 |
_n(
|
74 |
'Show %s more',
|
75 |
'Show %s more',
|
58 |
} }
|
59 |
aria-expanded={ false }
|
60 |
aria-label={ sprintf(
|
61 |
+
/* Translators: %s is referring the remaining count of options */
|
62 |
_n(
|
63 |
'Show %s more option',
|
64 |
'Show %s more options',
|
69 |
) }
|
70 |
>
|
71 |
{ sprintf(
|
72 |
+
// translators: %s number of options to reveal.
|
73 |
_n(
|
74 |
'Show %s more',
|
75 |
'Show %s more',
|
assets/js/base/components/chip/stories/index.js
DELETED
@@ -1,42 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { text, select, boolean } from '@storybook/addon-knobs';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import * as components from '../';
|
10 |
-
|
11 |
-
export default {
|
12 |
-
title: 'WooCommerce Blocks/@base-components/Chip',
|
13 |
-
component: Chip,
|
14 |
-
};
|
15 |
-
|
16 |
-
const radii = [ 'none', 'small', 'medium', 'large' ];
|
17 |
-
|
18 |
-
export const Chip = () => (
|
19 |
-
<components.Chip
|
20 |
-
text={ text( 'Text', 'example' ) }
|
21 |
-
radius={ select( 'Radius', radii ) }
|
22 |
-
screenReaderText={ text(
|
23 |
-
'Screen reader text',
|
24 |
-
'Example screen reader text'
|
25 |
-
) }
|
26 |
-
element={ select( 'Element', [ 'li', 'div', 'span' ], 'li' ) }
|
27 |
-
/>
|
28 |
-
);
|
29 |
-
|
30 |
-
export const RemovableChip = () => (
|
31 |
-
<components.RemovableChip
|
32 |
-
text={ text( 'Text', 'example' ) }
|
33 |
-
radius={ select( 'Radius', radii ) }
|
34 |
-
screenReaderText={ text(
|
35 |
-
'Screen reader text',
|
36 |
-
'Example screen reader text'
|
37 |
-
) }
|
38 |
-
disabled={ boolean( 'Disabled', false ) }
|
39 |
-
removeOnAnyClick={ boolean( 'Remove on any click', false ) }
|
40 |
-
element={ select( 'Element', [ 'li', 'div', 'span' ], 'li' ) }
|
41 |
-
/>
|
42 |
-
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/country-input/CountryInputProps.ts
DELETED
@@ -1,15 +0,0 @@
|
|
1 |
-
export interface CountryInputProps {
|
2 |
-
className?: string;
|
3 |
-
label: string;
|
4 |
-
id: string;
|
5 |
-
autoComplete?: string;
|
6 |
-
value: string;
|
7 |
-
onChange: ( value: string ) => void;
|
8 |
-
required?: boolean;
|
9 |
-
errorMessage?: string;
|
10 |
-
errorId: null | 'shipping-missing-country';
|
11 |
-
}
|
12 |
-
|
13 |
-
export type CountryInputWithCountriesProps = CountryInputProps & {
|
14 |
-
countries: Record< string, string >;
|
15 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/country-input/billing-country-input.js
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { ALLOWED_COUNTRIES } from '@woocommerce/block-settings';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import CountryInput from './country-input.js';
|
11 |
+
|
12 |
+
const BillingCountryInput = ( props ) => {
|
13 |
+
return <CountryInput countries={ ALLOWED_COUNTRIES } { ...props } />;
|
14 |
+
};
|
15 |
+
|
16 |
+
BillingCountryInput.propTypes = {
|
17 |
+
onChange: PropTypes.func.isRequired,
|
18 |
+
className: PropTypes.string,
|
19 |
+
label: PropTypes.string,
|
20 |
+
value: PropTypes.string,
|
21 |
+
};
|
22 |
+
|
23 |
+
export default BillingCountryInput;
|
assets/js/base/components/country-input/billing-country-input.tsx
DELETED
@@ -1,16 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { ALLOWED_COUNTRIES } from '@woocommerce/block-settings';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import CountryInput from './country-input';
|
10 |
-
import type { CountryInputProps } from './CountryInputProps';
|
11 |
-
|
12 |
-
const BillingCountryInput = ( props: CountryInputProps ): JSX.Element => {
|
13 |
-
return <CountryInput countries={ ALLOWED_COUNTRIES } { ...props } />;
|
14 |
-
};
|
15 |
-
|
16 |
-
export default BillingCountryInput;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/country-input/{country-input.tsx → country-input.js}
RENAMED
@@ -3,6 +3,7 @@
|
|
3 |
*/
|
4 |
import { useMemo } from '@wordpress/element';
|
5 |
import { __ } from '@wordpress/i18n';
|
|
|
6 |
import { decodeEntities } from '@wordpress/html-entities';
|
7 |
import classnames from 'classnames';
|
8 |
|
@@ -11,7 +12,6 @@ import classnames from 'classnames';
|
|
11 |
*/
|
12 |
import { ValidatedSelect } from '../select';
|
13 |
import './style.scss';
|
14 |
-
import type { CountryInputWithCountriesProps } from './CountryInputProps';
|
15 |
|
16 |
const CountryInput = ( {
|
17 |
className,
|
@@ -27,7 +27,7 @@ const CountryInput = ( {
|
|
27 |
'Please select a country.',
|
28 |
'woo-gutenberg-products-block'
|
29 |
),
|
30 |
-
}
|
31 |
const options = useMemo(
|
32 |
() =>
|
33 |
Object.keys( countries ).map( ( key ) => ( {
|
@@ -81,4 +81,16 @@ const CountryInput = ( {
|
|
81 |
);
|
82 |
};
|
83 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
export default CountryInput;
|
3 |
*/
|
4 |
import { useMemo } from '@wordpress/element';
|
5 |
import { __ } from '@wordpress/i18n';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
import { decodeEntities } from '@wordpress/html-entities';
|
8 |
import classnames from 'classnames';
|
9 |
|
12 |
*/
|
13 |
import { ValidatedSelect } from '../select';
|
14 |
import './style.scss';
|
|
|
15 |
|
16 |
const CountryInput = ( {
|
17 |
className,
|
27 |
'Please select a country.',
|
28 |
'woo-gutenberg-products-block'
|
29 |
),
|
30 |
+
} ) => {
|
31 |
const options = useMemo(
|
32 |
() =>
|
33 |
Object.keys( countries ).map( ( key ) => ( {
|
81 |
);
|
82 |
};
|
83 |
|
84 |
+
CountryInput.propTypes = {
|
85 |
+
countries: PropTypes.objectOf( PropTypes.string ).isRequired,
|
86 |
+
onChange: PropTypes.func.isRequired,
|
87 |
+
className: PropTypes.string,
|
88 |
+
id: PropTypes.string,
|
89 |
+
label: PropTypes.string,
|
90 |
+
value: PropTypes.string,
|
91 |
+
autoComplete: PropTypes.string,
|
92 |
+
errorId: PropTypes.string,
|
93 |
+
errorMessage: PropTypes.string,
|
94 |
+
};
|
95 |
+
|
96 |
export default CountryInput;
|
assets/js/base/components/country-input/{index.ts → index.js}
RENAMED
File without changes
|
assets/js/base/components/country-input/shipping-country-input.js
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { SHIPPING_COUNTRIES } from '@woocommerce/block-settings';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import CountryInput from './country-input.js';
|
11 |
+
|
12 |
+
const ShippingCountryInput = ( props ) => {
|
13 |
+
return <CountryInput countries={ SHIPPING_COUNTRIES } { ...props } />;
|
14 |
+
};
|
15 |
+
|
16 |
+
ShippingCountryInput.propTypes = {
|
17 |
+
onChange: PropTypes.func.isRequired,
|
18 |
+
className: PropTypes.string,
|
19 |
+
label: PropTypes.string,
|
20 |
+
value: PropTypes.string,
|
21 |
+
};
|
22 |
+
|
23 |
+
export default ShippingCountryInput;
|
assets/js/base/components/country-input/shipping-country-input.tsx
DELETED
@@ -1,16 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { SHIPPING_COUNTRIES } from '@woocommerce/block-settings';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import CountryInput from './country-input';
|
10 |
-
import { CountryInputProps } from './CountryInputProps';
|
11 |
-
|
12 |
-
const ShippingCountryInput = ( props: CountryInputProps ): JSX.Element => {
|
13 |
-
return <CountryInput countries={ SHIPPING_COUNTRIES } { ...props } />;
|
14 |
-
};
|
15 |
-
|
16 |
-
export default ShippingCountryInput;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/dropdown-selector/index.js
CHANGED
@@ -155,7 +155,7 @@ const DropdownSelector = ( {
|
|
155 |
checked.length > 0 && multiple
|
156 |
? null
|
157 |
: sprintf(
|
158 |
-
|
159 |
__(
|
160 |
'Any %s',
|
161 |
'woo-gutenberg-products-block'
|
155 |
checked.length > 0 && multiple
|
156 |
? null
|
157 |
: sprintf(
|
158 |
+
// Translators: %s attribute name.
|
159 |
__(
|
160 |
'Any %s',
|
161 |
'woo-gutenberg-products-block'
|
assets/js/base/components/dropdown-selector/menu.js
CHANGED
@@ -38,7 +38,7 @@ const DropdownSelectorMenu = ( {
|
|
38 |
item: option.value,
|
39 |
'aria-label': selected
|
40 |
? sprintf(
|
41 |
-
/*
|
42 |
__(
|
43 |
'Remove %s filter',
|
44 |
'woo-gutenberg-products-block'
|
38 |
item: option.value,
|
39 |
'aria-label': selected
|
40 |
? sprintf(
|
41 |
+
/* Translators: %s is referring to the filter option being removed. */
|
42 |
__(
|
43 |
'Remove %s filter',
|
44 |
'woo-gutenberg-products-block'
|
assets/js/base/components/dropdown-selector/selected-chip.js
CHANGED
@@ -13,7 +13,7 @@ const DropdownSelectorSelectedChip = ( { onRemoveItem, option } ) => {
|
|
13 |
onRemoveItem( option.value );
|
14 |
} }
|
15 |
ariaLabel={ sprintf(
|
16 |
-
/*
|
17 |
__( 'Remove %s filter', 'woo-gutenberg-products-block' ),
|
18 |
option.name
|
19 |
) }
|
13 |
onRemoveItem( option.value );
|
14 |
} }
|
15 |
ariaLabel={ sprintf(
|
16 |
+
/* Translators: %s is referring to the filter option being removed. */
|
17 |
__( 'Remove %s filter', 'woo-gutenberg-products-block' ),
|
18 |
option.name
|
19 |
) }
|
assets/js/base/components/filter-submit-button/index.js
CHANGED
@@ -14,7 +14,7 @@ import './style.scss';
|
|
14 |
const FilterSubmitButton = ( {
|
15 |
className,
|
16 |
disabled,
|
17 |
-
|
18 |
label = __( 'Go', 'woo-gutenberg-products-block' ),
|
19 |
onClick,
|
20 |
screenReaderLabel = __( 'Apply filter', 'woo-gutenberg-products-block' ),
|
14 |
const FilterSubmitButton = ( {
|
15 |
className,
|
16 |
disabled,
|
17 |
+
// translators: Submit button text for filters.
|
18 |
label = __( 'Go', 'woo-gutenberg-products-block' ),
|
19 |
onClick,
|
20 |
screenReaderLabel = __( 'Apply filter', 'woo-gutenberg-products-block' ),
|
assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js}
RENAMED
@@ -1,33 +1,21 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import NumberFormat
|
5 |
-
NumberFormatValues,
|
6 |
-
NumberFormatProps,
|
7 |
-
} from 'react-number-format';
|
8 |
import classNames from 'classnames';
|
9 |
-
import type { Currency } from '@woocommerce/price-format';
|
10 |
-
import type { ReactElement } from 'react';
|
11 |
|
12 |
/**
|
13 |
* Internal dependencies
|
14 |
*/
|
15 |
import './style.scss';
|
16 |
|
17 |
-
interface FormattedMonetaryAmountProps {
|
18 |
-
className?: string;
|
19 |
-
displayType?: NumberFormatProps[ 'displayType' ];
|
20 |
-
value: number | string; // Value of money amount.
|
21 |
-
currency: Currency | Record< string, never >; // Currency configuration object.
|
22 |
-
onValueChange?: ( unit: number ) => void; // Function to call when value changes.
|
23 |
-
}
|
24 |
-
|
25 |
/**
|
26 |
* Formats currency data into the expected format for NumberFormat.
|
|
|
|
|
|
|
27 |
*/
|
28 |
-
const currencyToNumberFormat = (
|
29 |
-
currency: FormattedMonetaryAmountProps[ 'currency' ]
|
30 |
-
) => {
|
31 |
return {
|
32 |
thousandSeparator: currency.thousandSeparator,
|
33 |
decimalSeparator: currency.decimalSeparator,
|
@@ -40,22 +28,25 @@ const currencyToNumberFormat = (
|
|
40 |
};
|
41 |
|
42 |
/**
|
43 |
-
*
|
44 |
*
|
45 |
* Takes a price and returns a formatted price using the NumberFormat component.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
*/
|
47 |
const FormattedMonetaryAmount = ( {
|
48 |
className,
|
49 |
-
value
|
50 |
currency,
|
51 |
onValueChange,
|
52 |
-
displayType = 'text',
|
53 |
...props
|
54 |
-
}
|
55 |
-
|
56 |
-
typeof rawValue === 'string' ? parseInt( rawValue, 10 ) : rawValue;
|
57 |
-
|
58 |
-
if ( ! Number.isFinite( value ) ) {
|
59 |
return null;
|
60 |
}
|
61 |
|
@@ -71,6 +62,7 @@ const FormattedMonetaryAmount = ( {
|
|
71 |
className
|
72 |
);
|
73 |
const numberFormatProps = {
|
|
|
74 |
...props,
|
75 |
...currencyToNumberFormat( currency ),
|
76 |
value: undefined,
|
@@ -80,20 +72,15 @@ const FormattedMonetaryAmount = ( {
|
|
80 |
|
81 |
// Wrapper for NumberFormat onValueChange which handles subunit conversion.
|
82 |
const onValueChangeWrapper = onValueChange
|
83 |
-
? ( values
|
84 |
-
const minorUnitValue =
|
85 |
-
( ( values.value as unknown ) as number ) *
|
86 |
-
10 ** currency.minorUnit;
|
87 |
onValueChange( minorUnitValue );
|
88 |
}
|
89 |
-
: () => {
|
90 |
-
/* not used */
|
91 |
-
};
|
92 |
|
93 |
return (
|
94 |
<NumberFormat
|
95 |
className={ classes }
|
96 |
-
displayType={ displayType }
|
97 |
{ ...numberFormatProps }
|
98 |
value={ priceValue }
|
99 |
onValueChange={ onValueChangeWrapper }
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import NumberFormat from 'react-number-format';
|
|
|
|
|
|
|
5 |
import classNames from 'classnames';
|
|
|
|
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
10 |
import './style.scss';
|
11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
/**
|
13 |
* Formats currency data into the expected format for NumberFormat.
|
14 |
+
*
|
15 |
+
* @param {Object} currency Currency data.
|
16 |
+
* @return {Object} Formatted props for NumberFormat.
|
17 |
*/
|
18 |
+
const currencyToNumberFormat = ( currency ) => {
|
|
|
|
|
19 |
return {
|
20 |
thousandSeparator: currency.thousandSeparator,
|
21 |
decimalSeparator: currency.decimalSeparator,
|
28 |
};
|
29 |
|
30 |
/**
|
31 |
+
* Formatted price component.
|
32 |
*
|
33 |
* Takes a price and returns a formatted price using the NumberFormat component.
|
34 |
+
*
|
35 |
+
* @param {Object} props Component props.
|
36 |
+
* @param {string} props.className CSS class used.
|
37 |
+
* @param {number} props.value Value of money amount.
|
38 |
+
* @param {Object} props.currency Currency configuration object.
|
39 |
+
* @param {function():any} props.onValueChange Function to call when value changes.
|
40 |
+
* @param {Object} props.props Rest of props passed into component.
|
41 |
*/
|
42 |
const FormattedMonetaryAmount = ( {
|
43 |
className,
|
44 |
+
value,
|
45 |
currency,
|
46 |
onValueChange,
|
|
|
47 |
...props
|
48 |
+
} ) => {
|
49 |
+
if ( value === '-' ) {
|
|
|
|
|
|
|
50 |
return null;
|
51 |
}
|
52 |
|
62 |
className
|
63 |
);
|
64 |
const numberFormatProps = {
|
65 |
+
displayType: 'text',
|
66 |
...props,
|
67 |
...currencyToNumberFormat( currency ),
|
68 |
value: undefined,
|
72 |
|
73 |
// Wrapper for NumberFormat onValueChange which handles subunit conversion.
|
74 |
const onValueChangeWrapper = onValueChange
|
75 |
+
? ( values ) => {
|
76 |
+
const minorUnitValue = values.value * 10 ** currency.minorUnit;
|
|
|
|
|
77 |
onValueChange( minorUnitValue );
|
78 |
}
|
79 |
+
: () => {};
|
|
|
|
|
80 |
|
81 |
return (
|
82 |
<NumberFormat
|
83 |
className={ classes }
|
|
|
84 |
{ ...numberFormatProps }
|
85 |
value={ priceValue }
|
86 |
onValueChange={ onValueChangeWrapper }
|
assets/js/base/components/label/{index.tsx → index.js}
RENAMED
@@ -1,29 +1,27 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import
|
|
|
5 |
import classNames from 'classnames';
|
6 |
-
import type { ReactElement, HTMLProps } from 'react';
|
7 |
-
|
8 |
-
interface LabelProps extends HTMLProps< HTMLElement > {
|
9 |
-
label?: string;
|
10 |
-
screenReaderLabel?: string;
|
11 |
-
wrapperElement?: string;
|
12 |
-
wrapperProps?: HTMLProps< HTMLElement >;
|
13 |
-
}
|
14 |
|
15 |
/**
|
16 |
* Component used to render an accessible text given a label and/or a
|
17 |
* screenReaderLabel. The wrapper element and wrapper props can also be
|
18 |
* specified via props.
|
19 |
*
|
|
|
|
|
|
|
|
|
|
|
20 |
*/
|
21 |
const Label = ( {
|
22 |
label,
|
23 |
screenReaderLabel,
|
24 |
wrapperElement,
|
25 |
wrapperProps = {},
|
26 |
-
}
|
27 |
let Wrapper;
|
28 |
|
29 |
const hasLabel = typeof label !== 'undefined' && label !== null;
|
@@ -59,4 +57,11 @@ const Label = ( {
|
|
59 |
return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
|
60 |
};
|
61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
export default Label;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { Fragment } from 'react';
|
6 |
import classNames from 'classnames';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
/**
|
9 |
* Component used to render an accessible text given a label and/or a
|
10 |
* screenReaderLabel. The wrapper element and wrapper props can also be
|
11 |
* specified via props.
|
12 |
*
|
13 |
+
* @param {Object} props Incoming props for the component.
|
14 |
+
* @param {string} [props.label] Label content.
|
15 |
+
* @param {string} [props.screenReaderLabel] Content for screen readers.
|
16 |
+
* @param {string} [props.wrapperElement] What element is used to wrap the label.
|
17 |
+
* @param {Object} [props.wrapperProps] Props passed into wrapper element.
|
18 |
*/
|
19 |
const Label = ( {
|
20 |
label,
|
21 |
screenReaderLabel,
|
22 |
wrapperElement,
|
23 |
wrapperProps = {},
|
24 |
+
} ) => {
|
25 |
let Wrapper;
|
26 |
|
27 |
const hasLabel = typeof label !== 'undefined' && label !== null;
|
57 |
return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
|
58 |
};
|
59 |
|
60 |
+
Label.propTypes = {
|
61 |
+
label: PropTypes.node,
|
62 |
+
screenReaderLabel: PropTypes.node,
|
63 |
+
wrapperElement: PropTypes.elementType,
|
64 |
+
wrapperProps: PropTypes.object,
|
65 |
+
};
|
66 |
+
|
67 |
export default Label;
|
assets/js/base/components/loading-mask/index.js
CHANGED
@@ -4,14 +4,13 @@
|
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import PropTypes from 'prop-types';
|
6 |
import classNames from 'classnames';
|
|
|
7 |
|
8 |
/**
|
9 |
* Internal dependencies
|
10 |
*/
|
11 |
import './style.scss';
|
12 |
-
import Spinner from '../spinner';
|
13 |
|
14 |
-
// @todo Find a way to block buttons/form components when LoadingMask isLoading
|
15 |
const LoadingMask = ( {
|
16 |
children,
|
17 |
className,
|
@@ -19,27 +18,29 @@ const LoadingMask = ( {
|
|
19 |
showSpinner = false,
|
20 |
isLoading = true,
|
21 |
} ) => {
|
|
|
|
|
|
|
|
|
|
|
22 |
return (
|
23 |
<div
|
24 |
-
className={ classNames(
|
25 |
-
|
26 |
-
|
|
|
27 |
>
|
28 |
-
{
|
29 |
<div
|
30 |
-
className=
|
31 |
-
|
32 |
-
} ) }
|
33 |
-
aria-hidden={ isLoading }
|
34 |
>
|
35 |
{ children }
|
36 |
</div>
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
</span>
|
42 |
-
) }
|
43 |
</div>
|
44 |
);
|
45 |
};
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import PropTypes from 'prop-types';
|
6 |
import classNames from 'classnames';
|
7 |
+
import { Spinner } from 'wordpress-components';
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
11 |
*/
|
12 |
import './style.scss';
|
|
|
13 |
|
|
|
14 |
const LoadingMask = ( {
|
15 |
children,
|
16 |
className,
|
18 |
showSpinner = false,
|
19 |
isLoading = true,
|
20 |
} ) => {
|
21 |
+
// If nothing is loading, just pass through the children.
|
22 |
+
if ( ! isLoading ) {
|
23 |
+
return children;
|
24 |
+
}
|
25 |
+
|
26 |
return (
|
27 |
<div
|
28 |
+
className={ classNames(
|
29 |
+
className,
|
30 |
+
'wc-block-components-loading-mask'
|
31 |
+
) }
|
32 |
>
|
33 |
+
{ showSpinner && <Spinner /> }
|
34 |
<div
|
35 |
+
className="wc-block-components-loading-mask__children"
|
36 |
+
aria-hidden={ true }
|
|
|
|
|
37 |
>
|
38 |
{ children }
|
39 |
</div>
|
40 |
+
<span className="screen-reader-text">
|
41 |
+
{ screenReaderLabel ||
|
42 |
+
__( 'Loading…', 'woo-gutenberg-products-block' ) }
|
43 |
+
</span>
|
|
|
|
|
44 |
</div>
|
45 |
);
|
46 |
};
|
assets/js/base/components/loading-mask/style.scss
CHANGED
@@ -1,7 +1,6 @@
|
|
1 |
.wc-block-components-loading-mask {
|
2 |
position: relative;
|
3 |
min-height: 18px + $gap;
|
4 |
-
pointer-events: none;
|
5 |
|
6 |
.components-spinner {
|
7 |
position: absolute;
|
@@ -10,8 +9,8 @@
|
|
10 |
left: 50%;
|
11 |
transform: translate(-50%, -50%);
|
12 |
}
|
|
|
13 |
|
14 |
-
|
15 |
-
|
16 |
-
}
|
17 |
}
|
1 |
.wc-block-components-loading-mask {
|
2 |
position: relative;
|
3 |
min-height: 18px + $gap;
|
|
|
4 |
|
5 |
.components-spinner {
|
6 |
position: absolute;
|
9 |
left: 50%;
|
10 |
transform: translate(-50%, -50%);
|
11 |
}
|
12 |
+
}
|
13 |
|
14 |
+
.wc-block-components-loading-mask__children {
|
15 |
+
opacity: 0.5;
|
|
|
16 |
}
|
assets/js/base/components/payment-methods/express-payment-methods.js
ADDED
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import {
|
5 |
+
useExpressPaymentMethods,
|
6 |
+
usePaymentMethodInterface,
|
7 |
+
} from '@woocommerce/base-hooks';
|
8 |
+
import {
|
9 |
+
cloneElement,
|
10 |
+
isValidElement,
|
11 |
+
useCallback,
|
12 |
+
useRef,
|
13 |
+
} from '@wordpress/element';
|
14 |
+
import {
|
15 |
+
useEditorContext,
|
16 |
+
usePaymentMethodDataContext,
|
17 |
+
} from '@woocommerce/base-context';
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Internal dependencies
|
21 |
+
*/
|
22 |
+
import PaymentMethodErrorBoundary from './payment-method-error-boundary';
|
23 |
+
|
24 |
+
const ExpressPaymentMethods = () => {
|
25 |
+
const { isEditor } = useEditorContext();
|
26 |
+
const {
|
27 |
+
setActivePaymentMethod,
|
28 |
+
activePaymentMethod,
|
29 |
+
paymentMethodData,
|
30 |
+
setPaymentStatus,
|
31 |
+
} = usePaymentMethodDataContext();
|
32 |
+
const paymentMethodInterface = usePaymentMethodInterface();
|
33 |
+
const { paymentMethods } = useExpressPaymentMethods();
|
34 |
+
const previousActivePaymentMethod = useRef( activePaymentMethod );
|
35 |
+
const previousPaymentMethodData = useRef( paymentMethodData );
|
36 |
+
|
37 |
+
const onExpressPaymentClick = useCallback(
|
38 |
+
( paymentMethodId ) => () => {
|
39 |
+
previousActivePaymentMethod.current = activePaymentMethod;
|
40 |
+
previousPaymentMethodData.current = paymentMethodData;
|
41 |
+
setPaymentStatus().started();
|
42 |
+
setActivePaymentMethod( paymentMethodId );
|
43 |
+
},
|
44 |
+
[
|
45 |
+
activePaymentMethod,
|
46 |
+
paymentMethodData,
|
47 |
+
setActivePaymentMethod,
|
48 |
+
setPaymentStatus,
|
49 |
+
]
|
50 |
+
);
|
51 |
+
const onExpressPaymentClose = useCallback( () => {
|
52 |
+
setActivePaymentMethod( previousActivePaymentMethod.current );
|
53 |
+
if ( previousPaymentMethodData.current.isSavedToken ) {
|
54 |
+
setPaymentStatus().success( previousPaymentMethodData.current );
|
55 |
+
}
|
56 |
+
}, [ setActivePaymentMethod, setPaymentStatus ] );
|
57 |
+
const paymentMethodIds = Object.keys( paymentMethods );
|
58 |
+
const content =
|
59 |
+
paymentMethodIds.length > 0 ? (
|
60 |
+
paymentMethodIds.map( ( id ) => {
|
61 |
+
const expressPaymentMethod = isEditor
|
62 |
+
? paymentMethods[ id ].edit
|
63 |
+
: paymentMethods[ id ].content;
|
64 |
+
return isValidElement( expressPaymentMethod ) ? (
|
65 |
+
<li key={ id } id={ `express-payment-method-${ id }` }>
|
66 |
+
{ cloneElement( expressPaymentMethod, {
|
67 |
+
...paymentMethodInterface,
|
68 |
+
onClick: onExpressPaymentClick( id ),
|
69 |
+
onClose: onExpressPaymentClose,
|
70 |
+
} ) }
|
71 |
+
</li>
|
72 |
+
) : null;
|
73 |
+
} )
|
74 |
+
) : (
|
75 |
+
<li key="noneRegistered">No registered Payment Methods</li>
|
76 |
+
);
|
77 |
+
return (
|
78 |
+
<PaymentMethodErrorBoundary isEditor={ isEditor }>
|
79 |
+
<ul className="wc-block-components-express-payment__event-buttons">
|
80 |
+
{ content }
|
81 |
+
</ul>
|
82 |
+
</PaymentMethodErrorBoundary>
|
83 |
+
);
|
84 |
+
};
|
85 |
+
|
86 |
+
export default ExpressPaymentMethods;
|
assets/js/base/components/payment-methods/express-payment/cart-express-payment.js
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import {
|
6 |
+
useEmitResponse,
|
7 |
+
useExpressPaymentMethods,
|
8 |
+
} from '@woocommerce/base-hooks';
|
9 |
+
import { StoreNoticesProvider } from '@woocommerce/base-context';
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Internal dependencies
|
13 |
+
*/
|
14 |
+
import ExpressPaymentMethods from '../express-payment-methods';
|
15 |
+
import './style.scss';
|
16 |
+
|
17 |
+
const CartExpressPayment = () => {
|
18 |
+
const { paymentMethods, isInitialized } = useExpressPaymentMethods();
|
19 |
+
const { noticeContexts } = useEmitResponse();
|
20 |
+
|
21 |
+
if (
|
22 |
+
! isInitialized ||
|
23 |
+
( isInitialized && Object.keys( paymentMethods ).length === 0 )
|
24 |
+
) {
|
25 |
+
return null;
|
26 |
+
}
|
27 |
+
|
28 |
+
return (
|
29 |
+
<>
|
30 |
+
<div className="wc-block-components-express-payment wc-block-components-express-payment--cart">
|
31 |
+
<div className="wc-block-components-express-payment__content">
|
32 |
+
<StoreNoticesProvider
|
33 |
+
context={ noticeContexts.EXPRESS_PAYMENTS }
|
34 |
+
>
|
35 |
+
<ExpressPaymentMethods />
|
36 |
+
</StoreNoticesProvider>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
<div className="wc-block-components-express-payment-continue-rule wc-block-components-express-payment-continue-rule--cart">
|
40 |
+
{ /* translators: Shown in the Cart block between the express payment methods and the Proceed to Checkout button */ }
|
41 |
+
{ __( 'Or', 'woo-gutenberg-products-block' ) }
|
42 |
+
</div>
|
43 |
+
</>
|
44 |
+
);
|
45 |
+
};
|
46 |
+
|
47 |
+
export default CartExpressPayment;
|
assets/js/base/components/payment-methods/express-payment/checkout-express-payment.js
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import {
|
6 |
+
useEmitResponse,
|
7 |
+
useExpressPaymentMethods,
|
8 |
+
} from '@woocommerce/base-hooks';
|
9 |
+
import {
|
10 |
+
StoreNoticesProvider,
|
11 |
+
useEditorContext,
|
12 |
+
} from '@woocommerce/base-context';
|
13 |
+
import Title from '@woocommerce/base-components/title';
|
14 |
+
import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Internal dependencies
|
18 |
+
*/
|
19 |
+
import ExpressPaymentMethods from '../express-payment-methods';
|
20 |
+
import './style.scss';
|
21 |
+
|
22 |
+
const CheckoutExpressPayment = () => {
|
23 |
+
const { paymentMethods, isInitialized } = useExpressPaymentMethods();
|
24 |
+
const { isEditor } = useEditorContext();
|
25 |
+
const { noticeContexts } = useEmitResponse();
|
26 |
+
|
27 |
+
if (
|
28 |
+
! isInitialized ||
|
29 |
+
( isInitialized && Object.keys( paymentMethods ).length === 0 )
|
30 |
+
) {
|
31 |
+
// Make sure errors are shown in the editor and for admins. For example,
|
32 |
+
// when a payment method fails to register.
|
33 |
+
if ( isEditor || CURRENT_USER_IS_ADMIN ) {
|
34 |
+
return (
|
35 |
+
<StoreNoticesProvider
|
36 |
+
context={ noticeContexts.EXPRESS_PAYMENTS }
|
37 |
+
></StoreNoticesProvider>
|
38 |
+
);
|
39 |
+
}
|
40 |
+
return null;
|
41 |
+
}
|
42 |
+
|
43 |
+
return (
|
44 |
+
<>
|
45 |
+
<div className="wc-block-components-express-payment wc-block-components-express-payment--checkout">
|
46 |
+
<div className="wc-block-components-express-payment__title-container">
|
47 |
+
<Title
|
48 |
+
className="wc-block-components-express-payment__title"
|
49 |
+
headingLevel="2"
|
50 |
+
>
|
51 |
+
{ __(
|
52 |
+
'Express checkout',
|
53 |
+
'woo-gutenberg-products-block'
|
54 |
+
) }
|
55 |
+
</Title>
|
56 |
+
</div>
|
57 |
+
<div className="wc-block-components-express-payment__content">
|
58 |
+
<StoreNoticesProvider
|
59 |
+
context={ noticeContexts.EXPRESS_PAYMENTS }
|
60 |
+
>
|
61 |
+
<p>
|
62 |
+
{ __(
|
63 |
+
'In a hurry? Use one of our express checkout options below:',
|
64 |
+
'woo-gutenberg-products-block'
|
65 |
+
) }
|
66 |
+
</p>
|
67 |
+
<ExpressPaymentMethods />
|
68 |
+
</StoreNoticesProvider>
|
69 |
+
</div>
|
70 |
+
</div>
|
71 |
+
<div className="wc-block-components-express-payment-continue-rule wc-block-components-express-payment-continue-rule--checkout">
|
72 |
+
{ __( 'Or continue below', 'woo-gutenberg-products-block' ) }
|
73 |
+
</div>
|
74 |
+
</>
|
75 |
+
);
|
76 |
+
};
|
77 |
+
|
78 |
+
export default CheckoutExpressPayment;
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/index.js
RENAMED
File without changes
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/style.scss
RENAMED
File without changes
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/index.js
RENAMED
File without changes
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js
RENAMED
File without changes
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss
RENAMED
File without changes
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-card.js
RENAMED
File without changes
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js
RENAMED
@@ -3,9 +3,9 @@
|
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { Component } from 'react';
|
|
|
6 |
import PropTypes from 'prop-types';
|
7 |
-
import { CURRENT_USER_IS_ADMIN } from '@woocommerce/settings';
|
8 |
-
import { StoreNoticesContainer } from '@woocommerce/base-context';
|
9 |
|
10 |
class PaymentMethodErrorBoundary extends Component {
|
11 |
state = { errorMessage: '', hasError: false };
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { Component } from 'react';
|
6 |
+
import { StoreNoticesContainer } from '@woocommerce/base-components/store-notices-container';
|
7 |
import PropTypes from 'prop-types';
|
8 |
+
import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
|
|
|
9 |
|
10 |
class PaymentMethodErrorBoundary extends Component {
|
11 |
state = { errorMessage: '', hasError: false };
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-options.js
RENAMED
@@ -4,21 +4,21 @@
|
|
4 |
import {
|
5 |
usePaymentMethods,
|
6 |
usePaymentMethodInterface,
|
7 |
-
useEmitResponse,
|
8 |
useStoreNotices,
|
9 |
-
|
|
|
10 |
import { cloneElement } from '@wordpress/element';
|
11 |
import {
|
12 |
useEditorContext,
|
13 |
usePaymentMethodDataContext,
|
14 |
} from '@woocommerce/base-context';
|
15 |
import classNames from 'classnames';
|
16 |
-
import RadioControlAccordion from '@woocommerce/base-components/radio-control-accordion';
|
17 |
|
18 |
/**
|
19 |
* Internal dependencies
|
20 |
*/
|
21 |
import PaymentMethodCard from './payment-method-card';
|
|
|
22 |
|
23 |
/**
|
24 |
* Component used to render all non-saved payment method options.
|
@@ -30,7 +30,7 @@ const PaymentMethodOptions = () => {
|
|
30 |
setActivePaymentMethod,
|
31 |
activeSavedToken,
|
32 |
setActiveSavedToken,
|
33 |
-
|
34 |
customerPaymentMethods,
|
35 |
} = usePaymentMethodDataContext();
|
36 |
const { paymentMethods } = usePaymentMethods();
|
@@ -38,6 +38,9 @@ const PaymentMethodOptions = () => {
|
|
38 |
activePaymentMethod,
|
39 |
...paymentMethodInterface
|
40 |
} = usePaymentMethodInterface();
|
|
|
|
|
|
|
41 |
const { noticeContexts } = useEmitResponse();
|
42 |
const { removeNotice } = useStoreNotices();
|
43 |
const { isEditor } = useEditorContext();
|
@@ -55,7 +58,7 @@ const PaymentMethodOptions = () => {
|
|
55 |
} ),
|
56 |
name: `wc-saved-payment-method-token-${ name }`,
|
57 |
content: (
|
58 |
-
<PaymentMethodCard
|
59 |
{ cloneElement( component, {
|
60 |
activePaymentMethod,
|
61 |
...paymentMethodInterface,
|
@@ -79,7 +82,7 @@ const PaymentMethodOptions = () => {
|
|
79 |
'disable-radio-control': isSinglePaymentMethod,
|
80 |
} );
|
81 |
|
82 |
-
return
|
83 |
<RadioControlAccordion
|
84 |
id={ 'wc-payment-method-options' }
|
85 |
className={ singleOptionClass }
|
4 |
import {
|
5 |
usePaymentMethods,
|
6 |
usePaymentMethodInterface,
|
|
|
7 |
useStoreNotices,
|
8 |
+
useEmitResponse,
|
9 |
+
} from '@woocommerce/base-hooks';
|
10 |
import { cloneElement } from '@wordpress/element';
|
11 |
import {
|
12 |
useEditorContext,
|
13 |
usePaymentMethodDataContext,
|
14 |
} from '@woocommerce/base-context';
|
15 |
import classNames from 'classnames';
|
|
|
16 |
|
17 |
/**
|
18 |
* Internal dependencies
|
19 |
*/
|
20 |
import PaymentMethodCard from './payment-method-card';
|
21 |
+
import RadioControlAccordion from '../radio-control-accordion';
|
22 |
|
23 |
/**
|
24 |
* Component used to render all non-saved payment method options.
|
30 |
setActivePaymentMethod,
|
31 |
activeSavedToken,
|
32 |
setActiveSavedToken,
|
33 |
+
expressPaymentMethods,
|
34 |
customerPaymentMethods,
|
35 |
} = usePaymentMethodDataContext();
|
36 |
const { paymentMethods } = usePaymentMethods();
|
38 |
activePaymentMethod,
|
39 |
...paymentMethodInterface
|
40 |
} = usePaymentMethodInterface();
|
41 |
+
const expressPaymentMethodActive = Object.keys(
|
42 |
+
expressPaymentMethods
|
43 |
+
).includes( activePaymentMethod );
|
44 |
const { noticeContexts } = useEmitResponse();
|
45 |
const { removeNotice } = useStoreNotices();
|
46 |
const { isEditor } = useEditorContext();
|
58 |
} ),
|
59 |
name: `wc-saved-payment-method-token-${ name }`,
|
60 |
content: (
|
61 |
+
<PaymentMethodCard allowsSaving={ supports.savePaymentInfo }>
|
62 |
{ cloneElement( component, {
|
63 |
activePaymentMethod,
|
64 |
...paymentMethodInterface,
|
82 |
'disable-radio-control': isSinglePaymentMethod,
|
83 |
} );
|
84 |
|
85 |
+
return expressPaymentMethodActive ? null : (
|
86 |
<RadioControlAccordion
|
87 |
id={ 'wc-payment-method-options' }
|
88 |
className={ singleOptionClass }
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-methods.js
RENAMED
@@ -1,7 +1,7 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import { usePaymentMethods } from '@woocommerce/base-
|
5 |
import { __ } from '@wordpress/i18n';
|
6 |
import Label from '@woocommerce/base-components/label';
|
7 |
import { usePaymentMethodDataContext } from '@woocommerce/base-context';
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { usePaymentMethods } from '@woocommerce/base-hooks';
|
5 |
import { __ } from '@wordpress/i18n';
|
6 |
import Label from '@woocommerce/base-components/label';
|
7 |
import { usePaymentMethodDataContext } from '@woocommerce/base-context';
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js
RENAMED
@@ -1,19 +1,10 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import {
|
5 |
-
useEffect,
|
6 |
-
useRef,
|
7 |
-
useCallback,
|
8 |
-
cloneElement,
|
9 |
-
} from '@wordpress/element';
|
10 |
import { __, sprintf } from '@wordpress/i18n';
|
11 |
import { usePaymentMethodDataContext } from '@woocommerce/base-context';
|
12 |
import RadioControl from '@woocommerce/base-components/radio-control';
|
13 |
-
import {
|
14 |
-
usePaymentMethodInterface,
|
15 |
-
usePaymentMethods,
|
16 |
-
} from '@woocommerce/base-context/hooks';
|
17 |
import { getPaymentMethods } from '@woocommerce/blocks-registry';
|
18 |
|
19 |
/**
|
@@ -37,7 +28,7 @@ const getCcOrEcheckPaymentMethodOption = (
|
|
37 |
return {
|
38 |
value: tokenId + '',
|
39 |
label: sprintf(
|
40 |
-
/*
|
41 |
__(
|
42 |
'%1$s ending in %2$s (expires %3$s)',
|
43 |
'woo-gutenberg-product-blocks'
|
@@ -50,7 +41,7 @@ const getCcOrEcheckPaymentMethodOption = (
|
|
50 |
onChange: ( token ) => {
|
51 |
const savedTokenKey = `wc-${ method.gateway }-payment-token`;
|
52 |
setActivePaymentMethod( method.gateway );
|
53 |
-
setPaymentStatus().
|
54 |
payment_method: method.gateway,
|
55 |
[ savedTokenKey ]: token + '',
|
56 |
isSavedToken: true,
|
@@ -76,7 +67,7 @@ const getDefaultPaymentMethodOptions = (
|
|
76 |
return {
|
77 |
value: tokenId + '',
|
78 |
label: sprintf(
|
79 |
-
|
80 |
__( 'Saved token for %s', 'woo-gutenberg-products-block' ),
|
81 |
method.gateway
|
82 |
),
|
@@ -84,7 +75,7 @@ const getDefaultPaymentMethodOptions = (
|
|
84 |
onChange: ( token ) => {
|
85 |
const savedTokenKey = `wc-${ method.gateway }-payment-token`;
|
86 |
setActivePaymentMethod( method.gateway );
|
87 |
-
setPaymentStatus().
|
88 |
payment_method: method.gateway,
|
89 |
[ savedTokenKey ]: token + '',
|
90 |
isSavedToken: true,
|
@@ -103,8 +94,6 @@ const SavedPaymentMethodOptions = () => {
|
|
103 |
setActiveSavedToken,
|
104 |
} = usePaymentMethodDataContext();
|
105 |
const standardMethods = getPaymentMethods();
|
106 |
-
const { paymentMethods } = usePaymentMethods();
|
107 |
-
const paymentMethodInterface = usePaymentMethodInterface();
|
108 |
|
109 |
/**
|
110 |
* @type {Object} Options
|
@@ -114,9 +103,12 @@ const SavedPaymentMethodOptions = () => {
|
|
114 |
|
115 |
const updateToken = useCallback(
|
116 |
( token ) => {
|
|
|
|
|
|
|
117 |
setActiveSavedToken( token );
|
118 |
},
|
119 |
-
[ setActiveSavedToken ]
|
120 |
);
|
121 |
|
122 |
useEffect( () => {
|
@@ -160,26 +152,13 @@ const SavedPaymentMethodOptions = () => {
|
|
160 |
standardMethods,
|
161 |
] );
|
162 |
|
163 |
-
const savedPaymentMethodHandler =
|
164 |
-
!! activeSavedToken &&
|
165 |
-
paymentMethods[ activePaymentMethod ] &&
|
166 |
-
paymentMethods[ activePaymentMethod ]?.savedTokenComponent
|
167 |
-
? cloneElement(
|
168 |
-
paymentMethods[ activePaymentMethod ]?.savedTokenComponent,
|
169 |
-
{ token: activeSavedToken, ...paymentMethodInterface }
|
170 |
-
)
|
171 |
-
: null;
|
172 |
-
|
173 |
return currentOptions.current.length > 0 ? (
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
/>
|
181 |
-
{ savedPaymentMethodHandler }
|
182 |
-
</>
|
183 |
) : null;
|
184 |
};
|
185 |
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { useEffect, useRef, useCallback } from '@wordpress/element';
|
|
|
|
|
|
|
|
|
|
|
5 |
import { __, sprintf } from '@wordpress/i18n';
|
6 |
import { usePaymentMethodDataContext } from '@woocommerce/base-context';
|
7 |
import RadioControl from '@woocommerce/base-components/radio-control';
|
|
|
|
|
|
|
|
|
8 |
import { getPaymentMethods } from '@woocommerce/blocks-registry';
|
9 |
|
10 |
/**
|
28 |
return {
|
29 |
value: tokenId + '',
|
30 |
label: sprintf(
|
31 |
+
/* Translators: %1$s is referring to the payment method brand, %2$s is referring to the last 4 digits of the payment card, %3$s is referring to the expiry date. */
|
32 |
__(
|
33 |
'%1$s ending in %2$s (expires %3$s)',
|
34 |
'woo-gutenberg-product-blocks'
|
41 |
onChange: ( token ) => {
|
42 |
const savedTokenKey = `wc-${ method.gateway }-payment-token`;
|
43 |
setActivePaymentMethod( method.gateway );
|
44 |
+
setPaymentStatus().success( {
|
45 |
payment_method: method.gateway,
|
46 |
[ savedTokenKey ]: token + '',
|
47 |
isSavedToken: true,
|
67 |
return {
|
68 |
value: tokenId + '',
|
69 |
label: sprintf(
|
70 |
+
// Translators: %s is the name of the payment method gateway.
|
71 |
__( 'Saved token for %s', 'woo-gutenberg-products-block' ),
|
72 |
method.gateway
|
73 |
),
|
75 |
onChange: ( token ) => {
|
76 |
const savedTokenKey = `wc-${ method.gateway }-payment-token`;
|
77 |
setActivePaymentMethod( method.gateway );
|
78 |
+
setPaymentStatus().success( {
|
79 |
payment_method: method.gateway,
|
80 |
[ savedTokenKey ]: token + '',
|
81 |
isSavedToken: true,
|
94 |
setActiveSavedToken,
|
95 |
} = usePaymentMethodDataContext();
|
96 |
const standardMethods = getPaymentMethods();
|
|
|
|
|
97 |
|
98 |
/**
|
99 |
* @type {Object} Options
|
103 |
|
104 |
const updateToken = useCallback(
|
105 |
( token ) => {
|
106 |
+
if ( token === '0' ) {
|
107 |
+
setPaymentStatus().started();
|
108 |
+
}
|
109 |
setActiveSavedToken( token );
|
110 |
},
|
111 |
+
[ setActiveSavedToken, setPaymentStatus ]
|
112 |
);
|
113 |
|
114 |
useEffect( () => {
|
152 |
standardMethods,
|
153 |
] );
|
154 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
155 |
return currentOptions.current.length > 0 ? (
|
156 |
+
<RadioControl
|
157 |
+
id={ 'wc-payment-method-saved-tokens' }
|
158 |
+
selected={ activeSavedToken }
|
159 |
+
onChange={ updateToken }
|
160 |
+
options={ currentOptions.current }
|
161 |
+
/>
|
|
|
|
|
|
|
162 |
) : null;
|
163 |
};
|
164 |
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss
RENAMED
@@ -143,6 +143,21 @@
|
|
143 |
}
|
144 |
}
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
.wc-block-components-checkout-payment-methods * {
|
147 |
pointer-events: all; // Overrides parent disabled component in editor context
|
148 |
}
|
@@ -169,10 +184,13 @@
|
|
169 |
}
|
170 |
}
|
171 |
|
|
|
|
|
|
|
|
|
172 |
.wc-block-checkout__payment-method {
|
173 |
.wc-block-components-radio-control__option {
|
174 |
padding-left: 56px;
|
175 |
-
|
176 |
&::after {
|
177 |
content: none;
|
178 |
}
|
@@ -182,31 +200,20 @@
|
|
182 |
}
|
183 |
}
|
184 |
|
185 |
-
|
186 |
-
.wc-block-components-radio-
|
187 |
-
|
188 |
-
.wc-block-components-radio-control__option:last-child {
|
189 |
-
margin: 0;
|
190 |
-
padding-bottom: em($gap);
|
191 |
-
padding-top: em($gap);
|
192 |
-
}
|
193 |
-
|
194 |
-
.wc-block-components-radio-control__option-checked {
|
195 |
-
font-weight: bold;
|
196 |
}
|
197 |
|
198 |
.wc-block-components-radio-control-accordion-option,
|
199 |
.wc-block-components-radio-control__option {
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
.wc-block-components-radio-control__option:last-child::after,
|
204 |
-
.wc-block-components-radio-control-accordion-option:last-child::after {
|
205 |
-
border-width: 1px;
|
206 |
}
|
207 |
|
208 |
.wc-block-components-radio-control-accordion-option {
|
209 |
-
.wc-block-components-radio-control__option
|
210 |
border-width: 0;
|
211 |
}
|
212 |
.wc-block-components-radio-control__label img {
|
@@ -232,11 +239,7 @@
|
|
232 |
}
|
233 |
|
234 |
.wc-block-components-radio-control-accordion-content {
|
235 |
-
padding:
|
236 |
-
|
237 |
-
&:empty {
|
238 |
-
display: none;
|
239 |
-
}
|
240 |
}
|
241 |
|
242 |
.wc-block-checkout__order-notes {
|
143 |
}
|
144 |
}
|
145 |
|
146 |
+
.wc-blocks-credit-card-images {
|
147 |
+
padding-top: $gap-small;
|
148 |
+
display: flex;
|
149 |
+
|
150 |
+
.wc-blocks-credit-cart-icon {
|
151 |
+
height: 18px;
|
152 |
+
width: auto;
|
153 |
+
margin-right: $gap-small;
|
154 |
+
|
155 |
+
&:last-child {
|
156 |
+
margin-right: 0;
|
157 |
+
}
|
158 |
+
}
|
159 |
+
}
|
160 |
+
|
161 |
.wc-block-components-checkout-payment-methods * {
|
162 |
pointer-events: all; // Overrides parent disabled component in editor context
|
163 |
}
|
184 |
}
|
185 |
}
|
186 |
|
187 |
+
.wc-block-components-radio-control__option-checked.wc-block-components-radio-control__option-checked {
|
188 |
+
font-weight: bold;
|
189 |
+
}
|
190 |
+
|
191 |
.wc-block-checkout__payment-method {
|
192 |
.wc-block-components-radio-control__option {
|
193 |
padding-left: 56px;
|
|
|
194 |
&::after {
|
195 |
content: none;
|
196 |
}
|
200 |
}
|
201 |
}
|
202 |
|
203 |
+
.wc-block-components-radio-control__option:last-child,
|
204 |
+
.wc-block-components-radio-control-accordion-option:last-child {
|
205 |
+
border-width: 1px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
}
|
207 |
|
208 |
.wc-block-components-radio-control-accordion-option,
|
209 |
.wc-block-components-radio-control__option {
|
210 |
+
border-width: 1px 1px 0 1px;
|
211 |
+
border-style: solid;
|
212 |
+
border-color: $gray-200;
|
|
|
|
|
|
|
213 |
}
|
214 |
|
215 |
.wc-block-components-radio-control-accordion-option {
|
216 |
+
.wc-block-components-radio-control__option {
|
217 |
border-width: 0;
|
218 |
}
|
219 |
.wc-block-components-radio-control__label img {
|
239 |
}
|
240 |
|
241 |
.wc-block-components-radio-control-accordion-content {
|
242 |
+
padding: 8px 16px 16px 16px;
|
|
|
|
|
|
|
|
|
243 |
}
|
244 |
|
245 |
.wc-block-checkout__order-notes {
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/test/payment-methods.js
RENAMED
@@ -25,17 +25,14 @@ jest.mock( '../saved-payment-method-options', () => ( { onChange } ) => {
|
|
25 |
);
|
26 |
} );
|
27 |
|
28 |
-
jest.mock(
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
</>
|
37 |
-
)
|
38 |
-
);
|
39 |
|
40 |
const registerMockPaymentMethods = () => {
|
41 |
[ 'stripe' ].forEach( ( name ) => {
|
25 |
);
|
26 |
} );
|
27 |
|
28 |
+
jest.mock( '../../radio-control-accordion', () => ( { onChange } ) => (
|
29 |
+
<>
|
30 |
+
<span>Payment method options</span>
|
31 |
+
<button onClick={ () => onChange( 'stripe' ) }>
|
32 |
+
Select new payment
|
33 |
+
</button>
|
34 |
+
</>
|
35 |
+
) );
|
|
|
|
|
|
|
36 |
|
37 |
const registerMockPaymentMethods = () => {
|
38 |
[ 'stripe' ].forEach( ( name ) => {
|
assets/js/base/components/price-slider/index.js
CHANGED
@@ -12,7 +12,6 @@ import {
|
|
12 |
import PropTypes from 'prop-types';
|
13 |
import classnames from 'classnames';
|
14 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
15 |
-
import { isObject } from '@woocommerce/types';
|
16 |
|
17 |
/**
|
18 |
* Internal dependencies
|
@@ -242,13 +241,10 @@ const PriceSlider = ( {
|
|
242 |
! hasValidConstraints && 'is-disabled'
|
243 |
);
|
244 |
|
245 |
-
const activeElement = isObject( minRange.current )
|
246 |
-
? minRange.current.ownerDocument.activeElement
|
247 |
-
: undefined;
|
248 |
const minRangeStep =
|
249 |
-
|
250 |
const maxRangeStep =
|
251 |
-
|
252 |
|
253 |
return (
|
254 |
<div className={ classes }>
|
@@ -356,11 +352,13 @@ const PriceSlider = ( {
|
|
356 |
:
|
357 |
<FormattedMonetaryAmount
|
358 |
currency={ currency }
|
|
|
359 |
value={ minPrice }
|
360 |
/>
|
361 |
–
|
362 |
<FormattedMonetaryAmount
|
363 |
currency={ currency }
|
|
|
364 |
value={ maxPrice }
|
365 |
/>
|
366 |
</div>
|
12 |
import PropTypes from 'prop-types';
|
13 |
import classnames from 'classnames';
|
14 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
|
|
15 |
|
16 |
/**
|
17 |
* Internal dependencies
|
241 |
! hasValidConstraints && 'is-disabled'
|
242 |
);
|
243 |
|
|
|
|
|
|
|
244 |
const minRangeStep =
|
245 |
+
minRange && document.activeElement === minRange.current ? stepValue : 1;
|
246 |
const maxRangeStep =
|
247 |
+
maxRange && document.activeElement === maxRange.current ? stepValue : 1;
|
248 |
|
249 |
return (
|
250 |
<div className={ classes }>
|
352 |
:
|
353 |
<FormattedMonetaryAmount
|
354 |
currency={ currency }
|
355 |
+
displayType="text"
|
356 |
value={ minPrice }
|
357 |
/>
|
358 |
–
|
359 |
<FormattedMonetaryAmount
|
360 |
currency={ currency }
|
361 |
+
displayType="text"
|
362 |
value={ maxPrice }
|
363 |
/>
|
364 |
</div>
|
assets/js/base/components/price-slider/style.scss
CHANGED
@@ -2,8 +2,8 @@
|
|
2 |
@mixin thumb {
|
3 |
background-color: transparent;
|
4 |
background-position: 0 0;
|
5 |
-
width:
|
6 |
-
height:
|
7 |
border: 0;
|
8 |
padding: 0;
|
9 |
margin: 0;
|
@@ -11,8 +11,7 @@
|
|
11 |
cursor: pointer;
|
12 |
z-index: 20;
|
13 |
pointer-events: auto;
|
14 |
-
background-image: url("data:image/svg+xml,%3Csvg
|
15 |
-
|
16 |
transition: transform .2s ease-in-out;
|
17 |
-webkit-appearance: none;
|
18 |
-moz-appearance: none;
|
@@ -20,11 +19,12 @@
|
|
20 |
|
21 |
&:hover {
|
22 |
@include thumbFocus;
|
|
|
23 |
}
|
24 |
}
|
25 |
@mixin thumbFocus {
|
26 |
-
background-position-y: -
|
27 |
-
|
28 |
}
|
29 |
/* stylelint-enable */
|
30 |
@mixin track {
|
2 |
@mixin thumb {
|
3 |
background-color: transparent;
|
4 |
background-position: 0 0;
|
5 |
+
width: 26px;
|
6 |
+
height: 21px;
|
7 |
border: 0;
|
8 |
padding: 0;
|
9 |
margin: 0;
|
11 |
cursor: pointer;
|
12 |
z-index: 20;
|
13 |
pointer-events: auto;
|
14 |
+
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='52' height='42'%3E%3Cdefs%3E%3Cpath id='a' d='M23.3176 7.9423l-8.4163-6.1432C13.1953.5706 11.2618-.0997 9.2146.0121h-.1137C4.2103.347.1159 4.368.0022 9.2827-.1115 14.644 4.2102 19 9.6696 19h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3Cpath id='b' d='M23.3176 7.9423l-8.4163-6.1432C13.1953.5706 11.2618-.0997 9.2146.0121h-.1137C4.2103.347.1159 4.368.0022 9.2827-.1115 14.644 4.2102 19 9.6696 19h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='#{encode-color($gray-700)}' d='M24.3176 8.9423l-8.4163-6.1432c-1.706-1.2285-3.6395-1.8988-5.6867-1.787h-.1137c-4.8906.335-8.985 4.356-9.0987 9.2706C.8885 15.644 5.2102 20 10.6696 20h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3Cpath stroke='%23B8B8B8' d='M9 6v9m3-9v9'/%3E%3Cg fill-rule='nonzero' transform='translate(1 22)'%3E%3Cuse fill='%23F8F3F7' stroke='%23FFF' stroke-opacity='.75' stroke-width='3' xlink:href='%23a'/%3E%3Cuse stroke='#{encode-color($gray-700)}' xlink:href='%23a'/%3E%3C/g%3E%3Cpath stroke='#{encode-color($gray-700)}' d='M9 27v9m3-9v9'/%3E%3Cg%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='#{encode-color($gray-700)}' d='M27.6824 8.9423l8.4163-6.1432c1.706-1.2285 3.6395-1.8988 5.6867-1.787h.1137c4.8906.335 8.985 4.356 9.0987 9.2706C51.1115 15.644 46.7898 20 41.3304 20h-.1137c-1.8197 0-3.6395-.6702-5.118-1.787l-8.4163-6.255c-.9099-.8935-.9099-2.2338 0-3.0157z'/%3E%3Cpath stroke='%23B8B8B8' d='M43 6v9m-3-9v9'/%3E%3C/g%3E%3Cg%3E%3Cg fill-rule='nonzero' transform='matrix(-1 0 0 1 51 22)'%3E%3Cuse fill='%23F8F3F7' stroke='%23FFF' stroke-opacity='.75' stroke-width='3' xlink:href='%23b'/%3E%3Cuse stroke='#{encode-color($gray-700)}' xlink:href='%23b'/%3E%3C/g%3E%3Cpath stroke='#{encode-color($gray-700)}' d='M43 27v9m-3-9v9'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
|
|
|
15 |
transition: transform .2s ease-in-out;
|
16 |
-webkit-appearance: none;
|
17 |
-moz-appearance: none;
|
19 |
|
20 |
&:hover {
|
21 |
@include thumbFocus;
|
22 |
+
transform: scale(1.1);
|
23 |
}
|
24 |
}
|
25 |
@mixin thumbFocus {
|
26 |
+
background-position-y: -21px;
|
27 |
+
filter: drop-shadow(3px 0 0 rgba(255, 255, 255, .75)) drop-shadow(-3px 0 0 rgba(255, 255, 255, .75));
|
28 |
}
|
29 |
/* stylelint-enable */
|
30 |
@mixin track {
|
assets/js/base/components/{product-list/product-list-item → product-list-item}/index.js
RENAMED
File without changes
|
assets/js/base/components/{product-list/product-list-item → product-list-item}/utils.js
RENAMED
File without changes
|
assets/js/base/components/product-list/container.js
CHANGED
@@ -9,10 +9,7 @@ import PropTypes from 'prop-types';
|
|
9 |
*/
|
10 |
import ProductList from './product-list';
|
11 |
|
12 |
-
const ProductListContainer = ( {
|
13 |
-
attributes,
|
14 |
-
hideOutOfStockItems = false,
|
15 |
-
} ) => {
|
16 |
const [ currentPage, setPage ] = useState( 1 );
|
17 |
const [ currentSort, setSort ] = useState( attributes.orderby );
|
18 |
useEffect( () => {
|
@@ -31,7 +28,6 @@ const ProductListContainer = ( {
|
|
31 |
return (
|
32 |
<ProductList
|
33 |
attributes={ attributes }
|
34 |
-
hideOutOfStockItems={ hideOutOfStockItems }
|
35 |
currentPage={ currentPage }
|
36 |
onPageChange={ onPageChange }
|
37 |
onSortChange={ onSortChange }
|
@@ -42,7 +38,6 @@ const ProductListContainer = ( {
|
|
42 |
|
43 |
ProductListContainer.propTypes = {
|
44 |
attributes: PropTypes.object.isRequired,
|
45 |
-
hideOutOfStockItems: PropTypes.bool,
|
46 |
};
|
47 |
|
48 |
export default ProductListContainer;
|
9 |
*/
|
10 |
import ProductList from './product-list';
|
11 |
|
12 |
+
const ProductListContainer = ( { attributes } ) => {
|
|
|
|
|
|
|
13 |
const [ currentPage, setPage ] = useState( 1 );
|
14 |
const [ currentSort, setSort ] = useState( attributes.orderby );
|
15 |
useEffect( () => {
|
28 |
return (
|
29 |
<ProductList
|
30 |
attributes={ attributes }
|
|
|
31 |
currentPage={ currentPage }
|
32 |
onPageChange={ onPageChange }
|
33 |
onSortChange={ onSortChange }
|
38 |
|
39 |
ProductListContainer.propTypes = {
|
40 |
attributes: PropTypes.object.isRequired,
|
|
|
41 |
};
|
42 |
|
43 |
export default ProductListContainer;
|
assets/js/base/components/product-list/product-list.js
CHANGED
@@ -6,14 +6,15 @@ import { isEqual } from 'lodash';
|
|
6 |
import PropTypes from 'prop-types';
|
7 |
import classnames from 'classnames';
|
8 |
import Pagination from '@woocommerce/base-components/pagination';
|
|
|
|
|
9 |
import { useEffect } from '@wordpress/element';
|
10 |
-
import { usePrevious } from '@woocommerce/base-hooks';
|
11 |
import {
|
12 |
-
|
13 |
useStoreProducts,
|
14 |
useSynchronizedQueryState,
|
15 |
useQueryStateByKey,
|
16 |
-
} from '@woocommerce/base-
|
17 |
import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
|
18 |
import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
|
19 |
import { speak } from '@wordpress/a11y';
|
@@ -21,18 +22,11 @@ import { speak } from '@wordpress/a11y';
|
|
21 |
/**
|
22 |
* Internal dependencies
|
23 |
*/
|
|
|
24 |
import NoProducts from './no-products';
|
25 |
import NoMatchingProducts from './no-matching-products';
|
26 |
-
import ProductSortSelect from './product-sort-select';
|
27 |
-
import ProductListItem from './product-list-item';
|
28 |
-
import './style.scss';
|
29 |
|
30 |
-
const generateQuery = ( {
|
31 |
-
sortValue,
|
32 |
-
currentPage,
|
33 |
-
attributes,
|
34 |
-
hideOutOfStockItems,
|
35 |
-
} ) => {
|
36 |
const { columns, rows } = attributes;
|
37 |
const getSortArgs = ( orderName ) => {
|
38 |
switch ( orderName ) {
|
@@ -56,15 +50,11 @@ const generateQuery = ( {
|
|
56 |
};
|
57 |
}
|
58 |
};
|
59 |
-
|
60 |
return {
|
61 |
...getSortArgs( sortValue ),
|
62 |
catalog_visibility: 'catalog',
|
63 |
per_page: columns * rows,
|
64 |
page: currentPage,
|
65 |
-
...( hideOutOfStockItems && {
|
66 |
-
stock_status: [ 'instock', 'onbackorder' ],
|
67 |
-
} ),
|
68 |
};
|
69 |
};
|
70 |
|
@@ -93,7 +83,7 @@ const announceLoadingCompletion = ( totalProducts ) => {
|
|
93 |
} else {
|
94 |
speak(
|
95 |
sprintf(
|
96 |
-
|
97 |
_n(
|
98 |
'%d product found',
|
99 |
'%d products found',
|
@@ -118,22 +108,19 @@ const ProductList = ( {
|
|
118 |
onSortChange,
|
119 |
sortValue,
|
120 |
scrollToTop,
|
121 |
-
hideOutOfStockItems = false,
|
122 |
} ) => {
|
123 |
const [ queryState ] = useSynchronizedQueryState(
|
124 |
generateQuery( {
|
125 |
attributes,
|
126 |
sortValue,
|
127 |
currentPage,
|
128 |
-
hideOutOfStockItems,
|
129 |
} )
|
130 |
);
|
131 |
const { products, totalProducts, productsLoading } = useStoreProducts(
|
132 |
queryState
|
133 |
);
|
134 |
-
const { parentClassName
|
135 |
const totalQuery = extractPaginationAndSortAttributes( queryState );
|
136 |
-
const { dispatchStoreEvent } = useStoreEvents();
|
137 |
|
138 |
// These are possible filters.
|
139 |
const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
|
@@ -143,21 +130,15 @@ const ProductList = ( {
|
|
143 |
const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
|
144 |
const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
|
145 |
|
146 |
-
// Only update previous query totals if the query is different and
|
|
|
147 |
const previousQueryTotals = usePrevious(
|
148 |
{ totalQuery, totalProducts },
|
149 |
areQueryTotalsDifferent
|
150 |
);
|
151 |
|
152 |
-
// If
|
153 |
-
|
154 |
-
dispatchStoreEvent( 'product-list-render', {
|
155 |
-
products,
|
156 |
-
listName: parentName,
|
157 |
-
} );
|
158 |
-
}, [ products, parentName, dispatchStoreEvent ] );
|
159 |
-
|
160 |
-
// If query state (excluding pagination/sorting attributes) changed, reset pagination to the first page.
|
161 |
useEffect( () => {
|
162 |
if ( isEqual( totalQuery, previousQueryTotals?.totalQuery ) ) {
|
163 |
return;
|
@@ -254,7 +235,6 @@ const ProductList = ( {
|
|
254 |
|
255 |
ProductList.propTypes = {
|
256 |
attributes: PropTypes.object.isRequired,
|
257 |
-
hideOutOfStockItems: PropTypes.bool,
|
258 |
// From withScrollToTop.
|
259 |
scrollToTop: PropTypes.func,
|
260 |
};
|
6 |
import PropTypes from 'prop-types';
|
7 |
import classnames from 'classnames';
|
8 |
import Pagination from '@woocommerce/base-components/pagination';
|
9 |
+
import ProductSortSelect from '@woocommerce/base-components/product-sort-select';
|
10 |
+
import ProductListItem from '@woocommerce/base-components/product-list-item';
|
11 |
import { useEffect } from '@wordpress/element';
|
|
|
12 |
import {
|
13 |
+
usePrevious,
|
14 |
useStoreProducts,
|
15 |
useSynchronizedQueryState,
|
16 |
useQueryStateByKey,
|
17 |
+
} from '@woocommerce/base-hooks';
|
18 |
import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
|
19 |
import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
|
20 |
import { speak } from '@wordpress/a11y';
|
22 |
/**
|
23 |
* Internal dependencies
|
24 |
*/
|
25 |
+
import './style.scss';
|
26 |
import NoProducts from './no-products';
|
27 |
import NoMatchingProducts from './no-matching-products';
|
|
|
|
|
|
|
28 |
|
29 |
+
const generateQuery = ( { sortValue, currentPage, attributes } ) => {
|
|
|
|
|
|
|
|
|
|
|
30 |
const { columns, rows } = attributes;
|
31 |
const getSortArgs = ( orderName ) => {
|
32 |
switch ( orderName ) {
|
50 |
};
|
51 |
}
|
52 |
};
|
|
|
53 |
return {
|
54 |
...getSortArgs( sortValue ),
|
55 |
catalog_visibility: 'catalog',
|
56 |
per_page: columns * rows,
|
57 |
page: currentPage,
|
|
|
|
|
|
|
58 |
};
|
59 |
};
|
60 |
|
83 |
} else {
|
84 |
speak(
|
85 |
sprintf(
|
86 |
+
// translators: %s is an integer higher than 0 (1, 2, 3...)
|
87 |
_n(
|
88 |
'%d product found',
|
89 |
'%d products found',
|
108 |
onSortChange,
|
109 |
sortValue,
|
110 |
scrollToTop,
|
|
|
111 |
} ) => {
|
112 |
const [ queryState ] = useSynchronizedQueryState(
|
113 |
generateQuery( {
|
114 |
attributes,
|
115 |
sortValue,
|
116 |
currentPage,
|
|
|
117 |
} )
|
118 |
);
|
119 |
const { products, totalProducts, productsLoading } = useStoreProducts(
|
120 |
queryState
|
121 |
);
|
122 |
+
const { parentClassName } = useInnerBlockLayoutContext();
|
123 |
const totalQuery = extractPaginationAndSortAttributes( queryState );
|
|
|
124 |
|
125 |
// These are possible filters.
|
126 |
const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
|
130 |
const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
|
131 |
const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
|
132 |
|
133 |
+
// Only update previous query totals if the query is different and
|
134 |
+
// the total number of products is a finite number.
|
135 |
const previousQueryTotals = usePrevious(
|
136 |
{ totalQuery, totalProducts },
|
137 |
areQueryTotalsDifferent
|
138 |
);
|
139 |
|
140 |
+
// If query state (excluding pagination/sorting attributes) changed,
|
141 |
+
// reset pagination to the first page.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
142 |
useEffect( () => {
|
143 |
if ( isEqual( totalQuery, previousQueryTotals?.totalQuery ) ) {
|
144 |
return;
|
235 |
|
236 |
ProductList.propTypes = {
|
237 |
attributes: PropTypes.object.isRequired,
|
|
|
238 |
// From withScrollToTop.
|
239 |
scrollToTop: PropTypes.func,
|
240 |
};
|
assets/js/base/components/product-list/style.scss
CHANGED
@@ -55,11 +55,6 @@
|
|
55 |
list-style: none;
|
56 |
}
|
57 |
|
58 |
-
// Increased specificity necessary as Gutenberg's generic reset overrides box sizing
|
59 |
-
.wc-block-grid__product.wc-block-grid__product {
|
60 |
-
box-sizing: border-box;
|
61 |
-
}
|
62 |
-
|
63 |
.theme-twentytwenty .wc-block-grid,
|
64 |
.wc-block-grid {
|
65 |
&.has-aligned-buttons {
|
55 |
list-style: none;
|
56 |
}
|
57 |
|
|
|
|
|
|
|
|
|
|
|
58 |
.theme-twentytwenty .wc-block-grid,
|
59 |
.wc-block-grid {
|
60 |
&.has-aligned-buttons {
|
assets/js/base/components/product-name/index.js
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
6 |
+
import classnames from 'classnames';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Internal dependencies
|
10 |
+
*/
|
11 |
+
import './style.scss';
|
12 |
+
|
13 |
+
const ProductName = ( {
|
14 |
+
className = '',
|
15 |
+
disabled = false,
|
16 |
+
name,
|
17 |
+
permalink = '',
|
18 |
+
...props
|
19 |
+
} ) => {
|
20 |
+
const classes = classnames( 'wc-block-components-product-name', className );
|
21 |
+
return disabled ? (
|
22 |
+
<span className={ classes } { ...props }>
|
23 |
+
{ decodeEntities( name ) }
|
24 |
+
</span>
|
25 |
+
) : (
|
26 |
+
<a className={ classes } href={ permalink } { ...props }>
|
27 |
+
{ decodeEntities( name ) }
|
28 |
+
</a>
|
29 |
+
);
|
30 |
+
};
|
31 |
+
|
32 |
+
ProductName.propTypes = {
|
33 |
+
className: PropTypes.string,
|
34 |
+
disabled: PropTypes.bool,
|
35 |
+
name: PropTypes.string.isRequired,
|
36 |
+
permalink: PropTypes.string,
|
37 |
+
};
|
38 |
+
|
39 |
+
export default ProductName;
|
assets/js/base/components/product-name/index.tsx
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { decodeEntities } from '@wordpress/html-entities';
|
5 |
-
import classnames from 'classnames';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import './style.scss';
|
11 |
-
|
12 |
-
/**
|
13 |
-
* Render the Product name.
|
14 |
-
*
|
15 |
-
* The store API runs titles through `wp_kses_post()` which removes dangerous HTML tags, so using it inside `dangerouslySetInnerHTML` is considered safe.
|
16 |
-
*/
|
17 |
-
export default ( {
|
18 |
-
className = '',
|
19 |
-
disabled = false,
|
20 |
-
name,
|
21 |
-
permalink = '',
|
22 |
-
...props
|
23 |
-
}: {
|
24 |
-
className: string;
|
25 |
-
disabled: boolean;
|
26 |
-
name: string;
|
27 |
-
permalink: string;
|
28 |
-
} ): JSX.Element => {
|
29 |
-
const classes = classnames( 'wc-block-components-product-name', className );
|
30 |
-
return disabled ? (
|
31 |
-
<span
|
32 |
-
className={ classes }
|
33 |
-
{ ...props }
|
34 |
-
dangerouslySetInnerHTML={ {
|
35 |
-
__html: decodeEntities( name ),
|
36 |
-
} }
|
37 |
-
/>
|
38 |
-
) : (
|
39 |
-
<a
|
40 |
-
className={ classes }
|
41 |
-
href={ permalink }
|
42 |
-
{ ...props }
|
43 |
-
dangerouslySetInnerHTML={ {
|
44 |
-
__html: decodeEntities( name ),
|
45 |
-
} }
|
46 |
-
/>
|
47 |
-
);
|
48 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/product-name/test/__snapshots__/index.js.snap
CHANGED
@@ -3,47 +3,35 @@
|
|
3 |
exports[`ProductName should merge classes and props 1`] = `
|
4 |
<a
|
5 |
className="wc-block-components-product-name lorem-ipsum"
|
6 |
-
dangerouslySetInnerHTML={
|
7 |
-
Object {
|
8 |
-
"__html": "Test product",
|
9 |
-
}
|
10 |
-
}
|
11 |
href="/"
|
12 |
rel="nofollow"
|
13 |
-
|
|
|
|
|
14 |
`;
|
15 |
|
16 |
exports[`ProductName should not render a link if disabled is true 1`] = `
|
17 |
<span
|
18 |
className="wc-block-components-product-name"
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
}
|
23 |
-
}
|
24 |
-
/>
|
25 |
`;
|
26 |
|
27 |
exports[`ProductName should render a link if disabled is false 1`] = `
|
28 |
<a
|
29 |
className="wc-block-components-product-name"
|
30 |
-
dangerouslySetInnerHTML={
|
31 |
-
Object {
|
32 |
-
"__html": "Test product",
|
33 |
-
}
|
34 |
-
}
|
35 |
href="/"
|
36 |
-
|
|
|
|
|
37 |
`;
|
38 |
|
39 |
exports[`ProductName should render a link if disabled is not defined 1`] = `
|
40 |
<a
|
41 |
className="wc-block-components-product-name"
|
42 |
-
dangerouslySetInnerHTML={
|
43 |
-
Object {
|
44 |
-
"__html": "Test product",
|
45 |
-
}
|
46 |
-
}
|
47 |
href="/"
|
48 |
-
|
|
|
|
|
49 |
`;
|
3 |
exports[`ProductName should merge classes and props 1`] = `
|
4 |
<a
|
5 |
className="wc-block-components-product-name lorem-ipsum"
|
|
|
|
|
|
|
|
|
|
|
6 |
href="/"
|
7 |
rel="nofollow"
|
8 |
+
>
|
9 |
+
Test product
|
10 |
+
</a>
|
11 |
`;
|
12 |
|
13 |
exports[`ProductName should not render a link if disabled is true 1`] = `
|
14 |
<span
|
15 |
className="wc-block-components-product-name"
|
16 |
+
>
|
17 |
+
Test product
|
18 |
+
</span>
|
|
|
|
|
|
|
19 |
`;
|
20 |
|
21 |
exports[`ProductName should render a link if disabled is false 1`] = `
|
22 |
<a
|
23 |
className="wc-block-components-product-name"
|
|
|
|
|
|
|
|
|
|
|
24 |
href="/"
|
25 |
+
>
|
26 |
+
Test product
|
27 |
+
</a>
|
28 |
`;
|
29 |
|
30 |
exports[`ProductName should render a link if disabled is not defined 1`] = `
|
31 |
<a
|
32 |
className="wc-block-components-product-name"
|
|
|
|
|
|
|
|
|
|
|
33 |
href="/"
|
34 |
+
>
|
35 |
+
Test product
|
36 |
+
</a>
|
37 |
`;
|
assets/js/base/components/product-price/index.js
CHANGED
@@ -1,12 +1,10 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import { __
|
5 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
6 |
import classNames from 'classnames';
|
7 |
import PropTypes from 'prop-types';
|
8 |
-
import { createInterpolateElement } from 'wordpress-element';
|
9 |
-
import { formatPrice } from '@woocommerce/price-format';
|
10 |
|
11 |
/**
|
12 |
* Internal dependencies
|
@@ -14,6 +12,7 @@ import { formatPrice } from '@woocommerce/price-format';
|
|
14 |
import './style.scss';
|
15 |
|
16 |
const PriceRange = ( {
|
|
|
17 |
currency,
|
18 |
maxPrice,
|
19 |
minPrice,
|
@@ -21,44 +20,32 @@ const PriceRange = ( {
|
|
21 |
priceStyle,
|
22 |
} ) => {
|
23 |
return (
|
24 |
-
|
25 |
-
<
|
26 |
-
{
|
27 |
-
|
28 |
-
|
29 |
-
'Price between %1$s and %2$s',
|
30 |
-
'woo-gutenberg-products-block'
|
31 |
-
),
|
32 |
-
formatPrice( minPrice ),
|
33 |
-
formatPrice( maxPrice )
|
34 |
) }
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
priceClassName
|
51 |
-
) }
|
52 |
-
currency={ currency }
|
53 |
-
value={ maxPrice }
|
54 |
-
style={ priceStyle }
|
55 |
-
/>
|
56 |
-
</span>
|
57 |
-
</>
|
58 |
);
|
59 |
};
|
60 |
|
61 |
const SalePrice = ( {
|
|
|
62 |
currency,
|
63 |
regularPriceClassName,
|
64 |
regularPriceStyle,
|
@@ -68,7 +55,7 @@ const SalePrice = ( {
|
|
68 |
price,
|
69 |
} ) => {
|
70 |
return (
|
71 |
-
|
72 |
<span className="screen-reader-text">
|
73 |
{ __( 'Previous price:', 'woo-gutenberg-products-block' ) }
|
74 |
</span>
|
@@ -106,7 +93,7 @@ const SalePrice = ( {
|
|
106 |
) }
|
107 |
value={ price }
|
108 |
/>
|
109 |
-
|
110 |
);
|
111 |
};
|
112 |
|
@@ -114,7 +101,6 @@ const ProductPrice = ( {
|
|
114 |
align,
|
115 |
className,
|
116 |
currency,
|
117 |
-
format = '<price/>',
|
118 |
maxPrice = null,
|
119 |
minPrice = null,
|
120 |
price = null,
|
@@ -133,25 +119,12 @@ const ProductPrice = ( {
|
|
133 |
}
|
134 |
);
|
135 |
|
136 |
-
if ( ! format.includes( '<price/>' ) ) {
|
137 |
-
format = '<price/>';
|
138 |
-
// eslint-disable-next-line no-console
|
139 |
-
console.error( 'Price formats need to include the `<price/>` tag.' );
|
140 |
-
}
|
141 |
-
|
142 |
const isDiscounted = regularPrice && price !== regularPrice;
|
143 |
-
let priceComponent = (
|
144 |
-
<span
|
145 |
-
className={ classNames(
|
146 |
-
'wc-block-components-product-price__value',
|
147 |
-
priceClassName
|
148 |
-
) }
|
149 |
-
/>
|
150 |
-
);
|
151 |
|
152 |
if ( isDiscounted ) {
|
153 |
-
|
154 |
<SalePrice
|
|
|
155 |
currency={ currency }
|
156 |
price={ price }
|
157 |
priceClassName={ priceClassName }
|
@@ -161,9 +134,12 @@ const ProductPrice = ( {
|
|
161 |
regularPriceStyle={ regularPriceStyle }
|
162 |
/>
|
163 |
);
|
164 |
-
}
|
165 |
-
|
|
|
|
|
166 |
<PriceRange
|
|
|
167 |
currency={ currency }
|
168 |
maxPrice={ maxPrice }
|
169 |
minPrice={ minPrice }
|
@@ -171,25 +147,32 @@ const ProductPrice = ( {
|
|
171 |
priceStyle={ priceStyle }
|
172 |
/>
|
173 |
);
|
174 |
-
}
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
|
|
|
|
|
|
|
|
185 |
);
|
186 |
}
|
187 |
|
188 |
return (
|
189 |
<span className={ wrapperClassName }>
|
190 |
-
|
191 |
-
|
192 |
-
|
|
|
|
|
|
|
193 |
</span>
|
194 |
);
|
195 |
};
|
@@ -198,7 +181,6 @@ ProductPrice.propTypes = {
|
|
198 |
align: PropTypes.oneOf( [ 'left', 'center', 'right' ] ),
|
199 |
className: PropTypes.string,
|
200 |
currency: PropTypes.object,
|
201 |
-
format: PropTypes.string,
|
202 |
price: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
|
203 |
priceClassName: PropTypes.string,
|
204 |
priceStyle: PropTypes.object,
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
6 |
import classNames from 'classnames';
|
7 |
import PropTypes from 'prop-types';
|
|
|
|
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
12 |
import './style.scss';
|
13 |
|
14 |
const PriceRange = ( {
|
15 |
+
className,
|
16 |
currency,
|
17 |
maxPrice,
|
18 |
minPrice,
|
20 |
priceStyle,
|
21 |
} ) => {
|
22 |
return (
|
23 |
+
<span className={ className }>
|
24 |
+
<FormattedMonetaryAmount
|
25 |
+
className={ classNames(
|
26 |
+
'wc-block-components-product-price__value',
|
27 |
+
priceClassName
|
|
|
|
|
|
|
|
|
|
|
28 |
) }
|
29 |
+
currency={ currency }
|
30 |
+
value={ minPrice }
|
31 |
+
style={ priceStyle }
|
32 |
+
/>
|
33 |
+
—
|
34 |
+
<FormattedMonetaryAmount
|
35 |
+
className={ classNames(
|
36 |
+
'wc-block-components-product-price__value',
|
37 |
+
priceClassName
|
38 |
+
) }
|
39 |
+
currency={ currency }
|
40 |
+
value={ maxPrice }
|
41 |
+
style={ priceStyle }
|
42 |
+
/>
|
43 |
+
</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
);
|
45 |
};
|
46 |
|
47 |
const SalePrice = ( {
|
48 |
+
className,
|
49 |
currency,
|
50 |
regularPriceClassName,
|
51 |
regularPriceStyle,
|
55 |
price,
|
56 |
} ) => {
|
57 |
return (
|
58 |
+
<span className={ className }>
|
59 |
<span className="screen-reader-text">
|
60 |
{ __( 'Previous price:', 'woo-gutenberg-products-block' ) }
|
61 |
</span>
|
93 |
) }
|
94 |
value={ price }
|
95 |
/>
|
96 |
+
</span>
|
97 |
);
|
98 |
};
|
99 |
|
101 |
align,
|
102 |
className,
|
103 |
currency,
|
|
|
104 |
maxPrice = null,
|
105 |
minPrice = null,
|
106 |
price = null,
|
119 |
}
|
120 |
);
|
121 |
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
const isDiscounted = regularPrice && price !== regularPrice;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
|
124 |
if ( isDiscounted ) {
|
125 |
+
return (
|
126 |
<SalePrice
|
127 |
+
className={ wrapperClassName }
|
128 |
currency={ currency }
|
129 |
price={ price }
|
130 |
priceClassName={ priceClassName }
|
134 |
regularPriceStyle={ regularPriceStyle }
|
135 |
/>
|
136 |
);
|
137 |
+
}
|
138 |
+
|
139 |
+
if ( minPrice !== null && maxPrice !== null ) {
|
140 |
+
return (
|
141 |
<PriceRange
|
142 |
+
className={ wrapperClassName }
|
143 |
currency={ currency }
|
144 |
maxPrice={ maxPrice }
|
145 |
minPrice={ minPrice }
|
147 |
priceStyle={ priceStyle }
|
148 |
/>
|
149 |
);
|
150 |
+
}
|
151 |
+
|
152 |
+
if ( price !== null ) {
|
153 |
+
return (
|
154 |
+
<span className={ wrapperClassName }>
|
155 |
+
<FormattedMonetaryAmount
|
156 |
+
className={ classNames(
|
157 |
+
'wc-block-components-product-price__value',
|
158 |
+
priceClassName
|
159 |
+
) }
|
160 |
+
currency={ currency }
|
161 |
+
value={ price }
|
162 |
+
style={ priceStyle }
|
163 |
+
/>
|
164 |
+
</span>
|
165 |
);
|
166 |
}
|
167 |
|
168 |
return (
|
169 |
<span className={ wrapperClassName }>
|
170 |
+
<span
|
171 |
+
className={ classNames(
|
172 |
+
'wc-block-components-product-price__value',
|
173 |
+
priceClassName
|
174 |
+
) }
|
175 |
+
/>
|
176 |
</span>
|
177 |
);
|
178 |
};
|
181 |
align: PropTypes.oneOf( [ 'left', 'center', 'right' ] ),
|
182 |
className: PropTypes.string,
|
183 |
currency: PropTypes.object,
|
|
|
184 |
price: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
|
185 |
priceClassName: PropTypes.string,
|
186 |
priceStyle: PropTypes.object,
|
assets/js/base/components/product-price/test/__snapshots__/index.js.snap
DELETED
@@ -1,57 +0,0 @@
|
|
1 |
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2 |
-
|
3 |
-
exports[`ProductPrice should apply the format if one is provided 1`] = `
|
4 |
-
<span
|
5 |
-
className="price wc-block-components-product-price"
|
6 |
-
>
|
7 |
-
pre price
|
8 |
-
<span
|
9 |
-
className="screen-reader-text"
|
10 |
-
>
|
11 |
-
Previous price:
|
12 |
-
</span>
|
13 |
-
<del
|
14 |
-
className="wc-block-components-product-price__regular"
|
15 |
-
>
|
16 |
-
£1.00
|
17 |
-
</del>
|
18 |
-
<span
|
19 |
-
className="screen-reader-text"
|
20 |
-
>
|
21 |
-
Discounted price:
|
22 |
-
</span>
|
23 |
-
<ins
|
24 |
-
className="wc-block-components-product-price__value is-discounted"
|
25 |
-
>
|
26 |
-
£0.50
|
27 |
-
</ins>
|
28 |
-
Test format
|
29 |
-
</span>
|
30 |
-
`;
|
31 |
-
|
32 |
-
exports[`ProductPrice should use default price if no format is provided 1`] = `
|
33 |
-
<span
|
34 |
-
className="price wc-block-components-product-price"
|
35 |
-
>
|
36 |
-
<span
|
37 |
-
className="screen-reader-text"
|
38 |
-
>
|
39 |
-
Previous price:
|
40 |
-
</span>
|
41 |
-
<del
|
42 |
-
className="wc-block-components-product-price__regular"
|
43 |
-
>
|
44 |
-
£1.00
|
45 |
-
</del>
|
46 |
-
<span
|
47 |
-
className="screen-reader-text"
|
48 |
-
>
|
49 |
-
Discounted price:
|
50 |
-
</span>
|
51 |
-
<ins
|
52 |
-
className="wc-block-components-product-price__value is-discounted"
|
53 |
-
>
|
54 |
-
£0.50
|
55 |
-
</ins>
|
56 |
-
</span>
|
57 |
-
`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/product-price/test/index.js
DELETED
@@ -1,63 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import TestRenderer from 'react-test-renderer';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import ProductPrice from '../index';
|
10 |
-
|
11 |
-
describe( 'ProductPrice', () => {
|
12 |
-
const currency = {
|
13 |
-
code: 'GBP',
|
14 |
-
currency_code: 'GBP',
|
15 |
-
currency_decimal_separator: '.',
|
16 |
-
currency_minor_unit: 2,
|
17 |
-
currency_prefix: '£',
|
18 |
-
currency_suffix: '',
|
19 |
-
currency_symbol: '£',
|
20 |
-
currency_thousand_separator: ',',
|
21 |
-
decimalSeparator: '.',
|
22 |
-
minorUnit: 2,
|
23 |
-
prefix: '£',
|
24 |
-
price: '61400',
|
25 |
-
price_range: null,
|
26 |
-
raw_prices: {
|
27 |
-
precision: 6,
|
28 |
-
price: '614000000',
|
29 |
-
regular_price: '614000000',
|
30 |
-
sale_price: '614000000',
|
31 |
-
},
|
32 |
-
regular_price: '61400',
|
33 |
-
sale_price: '61400',
|
34 |
-
suffix: '',
|
35 |
-
symbol: '£',
|
36 |
-
thousandSeparator: ',',
|
37 |
-
};
|
38 |
-
|
39 |
-
test( 'should use default price if no format is provided', () => {
|
40 |
-
const component = TestRenderer.create(
|
41 |
-
<ProductPrice
|
42 |
-
price={ 50 }
|
43 |
-
regularPrice={ 100 }
|
44 |
-
currency={ currency }
|
45 |
-
/>
|
46 |
-
);
|
47 |
-
|
48 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
49 |
-
} );
|
50 |
-
|
51 |
-
test( 'should apply the format if one is provided', () => {
|
52 |
-
const component = TestRenderer.create(
|
53 |
-
<ProductPrice
|
54 |
-
price={ 50 }
|
55 |
-
regularPrice={ 100 }
|
56 |
-
currency={ currency }
|
57 |
-
format="pre price <price/> Test format"
|
58 |
-
/>
|
59 |
-
);
|
60 |
-
|
61 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
62 |
-
} );
|
63 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/{product-list/product-sort-select → product-sort-select}/index.js
RENAMED
File without changes
|
assets/js/base/components/{product-list/product-sort-select → product-sort-select}/style.scss
RENAMED
File without changes
|
assets/js/base/components/quantity-selector/{index.tsx → index.js}
RENAMED
@@ -3,37 +3,25 @@
|
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
import { speak } from '@wordpress/a11y';
|
|
|
6 |
import classNames from 'classnames';
|
7 |
import { useCallback } from '@wordpress/element';
|
8 |
import { DOWN, UP } from '@wordpress/keycodes';
|
9 |
-
import { isNumber } from '@woocommerce/types';
|
10 |
|
11 |
/**
|
12 |
* Internal dependencies
|
13 |
*/
|
14 |
import './style.scss';
|
15 |
|
16 |
-
interface QuantitySelectorProps {
|
17 |
-
className?: string;
|
18 |
-
quantity?: number;
|
19 |
-
minimum?: number;
|
20 |
-
maximum: number;
|
21 |
-
onChange: ( newQuantity: number ) => void;
|
22 |
-
itemName?: string;
|
23 |
-
disabled: boolean;
|
24 |
-
}
|
25 |
-
|
26 |
const QuantitySelector = ( {
|
27 |
className,
|
28 |
quantity = 1,
|
29 |
minimum = 1,
|
30 |
maximum,
|
31 |
-
onChange = () =>
|
32 |
-
/* Do nothing. */
|
33 |
-
},
|
34 |
itemName = '',
|
35 |
disabled,
|
36 |
-
}
|
37 |
const classes = classNames(
|
38 |
'wc-block-components-quantity-selector',
|
39 |
className
|
@@ -84,7 +72,7 @@ const QuantitySelector = ( {
|
|
84 |
onKeyDown={ quantityInputOnKeyDown }
|
85 |
onChange={ ( event ) => {
|
86 |
let value =
|
87 |
-
|
88 |
? 0
|
89 |
: parseInt( event.target.value, 10 );
|
90 |
if ( hasMaximum ) {
|
@@ -96,7 +84,7 @@ const QuantitySelector = ( {
|
|
96 |
}
|
97 |
} }
|
98 |
aria-label={ sprintf(
|
99 |
-
/*
|
100 |
__(
|
101 |
'Quantity of %s in your cart.',
|
102 |
'woo-gutenberg-products-block'
|
@@ -116,7 +104,7 @@ const QuantitySelector = ( {
|
|
116 |
onChange( newQuantity );
|
117 |
speak(
|
118 |
sprintf(
|
119 |
-
/*
|
120 |
__(
|
121 |
'Quantity reduced to %s.',
|
122 |
'woo-gutenberg-products-block'
|
@@ -140,7 +128,7 @@ const QuantitySelector = ( {
|
|
140 |
onChange( newQuantity );
|
141 |
speak(
|
142 |
sprintf(
|
143 |
-
/*
|
144 |
__(
|
145 |
'Quantity increased to %s.',
|
146 |
'woo-gutenberg-products-block'
|
@@ -156,4 +144,14 @@ const QuantitySelector = ( {
|
|
156 |
);
|
157 |
};
|
158 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
159 |
export default QuantitySelector;
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
import { speak } from '@wordpress/a11y';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
import classNames from 'classnames';
|
8 |
import { useCallback } from '@wordpress/element';
|
9 |
import { DOWN, UP } from '@wordpress/keycodes';
|
|
|
10 |
|
11 |
/**
|
12 |
* Internal dependencies
|
13 |
*/
|
14 |
import './style.scss';
|
15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
const QuantitySelector = ( {
|
17 |
className,
|
18 |
quantity = 1,
|
19 |
minimum = 1,
|
20 |
maximum,
|
21 |
+
onChange = () => null,
|
|
|
|
|
22 |
itemName = '',
|
23 |
disabled,
|
24 |
+
} ) => {
|
25 |
const classes = classNames(
|
26 |
'wc-block-components-quantity-selector',
|
27 |
className
|
72 |
onKeyDown={ quantityInputOnKeyDown }
|
73 |
onChange={ ( event ) => {
|
74 |
let value =
|
75 |
+
isNaN( event.target.value ) || ! event.target.value
|
76 |
? 0
|
77 |
: parseInt( event.target.value, 10 );
|
78 |
if ( hasMaximum ) {
|
84 |
}
|
85 |
} }
|
86 |
aria-label={ sprintf(
|
87 |
+
/* Translators: %s refers to the item name in the cart. */
|
88 |
__(
|
89 |
'Quantity of %s in your cart.',
|
90 |
'woo-gutenberg-products-block'
|
104 |
onChange( newQuantity );
|
105 |
speak(
|
106 |
sprintf(
|
107 |
+
/* Translators: %s refers to the item name in the cart. */
|
108 |
__(
|
109 |
'Quantity reduced to %s.',
|
110 |
'woo-gutenberg-products-block'
|
128 |
onChange( newQuantity );
|
129 |
speak(
|
130 |
sprintf(
|
131 |
+
/* Translators: %s refers to the item name in the cart. */
|
132 |
__(
|
133 |
'Quantity increased to %s.',
|
134 |
'woo-gutenberg-products-block'
|
144 |
);
|
145 |
};
|
146 |
|
147 |
+
QuantitySelector.propTypes = {
|
148 |
+
className: PropTypes.string,
|
149 |
+
quantity: PropTypes.number,
|
150 |
+
minimum: PropTypes.number,
|
151 |
+
maximum: PropTypes.number,
|
152 |
+
onChange: PropTypes.func,
|
153 |
+
itemName: PropTypes.string,
|
154 |
+
disabled: PropTypes.bool,
|
155 |
+
};
|
156 |
+
|
157 |
export default QuantitySelector;
|
assets/js/base/components/quantity-selector/style.scss
CHANGED
@@ -67,7 +67,6 @@
|
|
67 |
-webkit-appearance: none;
|
68 |
margin: 0;
|
69 |
}
|
70 |
-
|
71 |
.wc-block-components-quantity-selector__button {
|
72 |
@include reset-button;
|
73 |
@include font-size(regular);
|
@@ -76,7 +75,6 @@
|
|
76 |
color: $gray-900;
|
77 |
font-style: normal;
|
78 |
text-align: center;
|
79 |
-
text-decoration: none;
|
80 |
|
81 |
&:hover,
|
82 |
&:focus {
|
@@ -101,21 +99,10 @@
|
|
101 |
}
|
102 |
}
|
103 |
}
|
104 |
-
|
105 |
-
> .wc-block-components-quantity-selector__button--minus {
|
106 |
order: 1;
|
107 |
}
|
108 |
-
|
109 |
-
> .wc-block-components-quantity-selector__button--plus {
|
110 |
order: 3;
|
111 |
}
|
112 |
}
|
113 |
-
|
114 |
-
.theme-twentyseventeen {
|
115 |
-
.wc-block-components-quantity-selector .wc-block-components-quantity-selector__button {
|
116 |
-
&:hover,
|
117 |
-
&:focus {
|
118 |
-
background: none transparent;
|
119 |
-
}
|
120 |
-
}
|
121 |
-
}
|
67 |
-webkit-appearance: none;
|
68 |
margin: 0;
|
69 |
}
|
|
|
70 |
.wc-block-components-quantity-selector__button {
|
71 |
@include reset-button;
|
72 |
@include font-size(regular);
|
75 |
color: $gray-900;
|
76 |
font-style: normal;
|
77 |
text-align: center;
|
|
|
78 |
|
79 |
&:hover,
|
80 |
&:focus {
|
99 |
}
|
100 |
}
|
101 |
}
|
102 |
+
.wc-block-components-quantity-selector__button--minus {
|
|
|
103 |
order: 1;
|
104 |
}
|
105 |
+
.wc-block-components-quantity-selector__button--plus {
|
|
|
106 |
order: 3;
|
107 |
}
|
108 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js}
RENAMED
@@ -1,22 +1,16 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import type { ReactElement } from 'react';
|
5 |
-
import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
|
6 |
-
|
7 |
const OptionLayout = ( {
|
8 |
label,
|
9 |
secondaryLabel,
|
10 |
description,
|
11 |
secondaryDescription,
|
12 |
id,
|
13 |
-
}
|
14 |
return (
|
15 |
<div className="wc-block-components-radio-control__option-layout">
|
16 |
<div className="wc-block-components-radio-control__label-group">
|
17 |
{ label && (
|
18 |
<span
|
19 |
-
id={ id
|
20 |
className="wc-block-components-radio-control__label"
|
21 |
>
|
22 |
{ label }
|
@@ -24,7 +18,7 @@ const OptionLayout = ( {
|
|
24 |
) }
|
25 |
{ secondaryLabel && (
|
26 |
<span
|
27 |
-
id={ id
|
28 |
className="wc-block-components-radio-control__secondary-label"
|
29 |
>
|
30 |
{ secondaryLabel }
|
@@ -34,7 +28,7 @@ const OptionLayout = ( {
|
|
34 |
<div className="wc-block-components-radio-control__description-group">
|
35 |
{ description && (
|
36 |
<span
|
37 |
-
id={ id
|
38 |
className="wc-block-components-radio-control__description"
|
39 |
>
|
40 |
{ description }
|
@@ -42,7 +36,7 @@ const OptionLayout = ( {
|
|
42 |
) }
|
43 |
{ secondaryDescription && (
|
44 |
<span
|
45 |
-
id={ id
|
46 |
className="wc-block-components-radio-control__secondary-description"
|
47 |
>
|
48 |
{ secondaryDescription }
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
const OptionLayout = ( {
|
2 |
label,
|
3 |
secondaryLabel,
|
4 |
description,
|
5 |
secondaryDescription,
|
6 |
id,
|
7 |
+
} ) => {
|
8 |
return (
|
9 |
<div className="wc-block-components-radio-control__option-layout">
|
10 |
<div className="wc-block-components-radio-control__label-group">
|
11 |
{ label && (
|
12 |
<span
|
13 |
+
id={ id ? `${ id }__label` : null }
|
14 |
className="wc-block-components-radio-control__label"
|
15 |
>
|
16 |
{ label }
|
18 |
) }
|
19 |
{ secondaryLabel && (
|
20 |
<span
|
21 |
+
id={ id ? `${ id }__secondary-label` : null }
|
22 |
className="wc-block-components-radio-control__secondary-label"
|
23 |
>
|
24 |
{ secondaryLabel }
|
28 |
<div className="wc-block-components-radio-control__description-group">
|
29 |
{ description && (
|
30 |
<span
|
31 |
+
id={ id ? `${ id }__description` : null }
|
32 |
className="wc-block-components-radio-control__description"
|
33 |
>
|
34 |
{ description }
|
36 |
) }
|
37 |
{ secondaryDescription && (
|
38 |
<span
|
39 |
+
id={ id ? `${ id }__secondary-description` : null }
|
40 |
className="wc-block-components-radio-control__secondary-description"
|
41 |
>
|
42 |
{ secondaryDescription }
|
assets/js/base/components/radio-control/style.scss
CHANGED
@@ -1,19 +1,12 @@
|
|
1 |
.wc-block-components-radio-control__option {
|
2 |
@include reset-typography();
|
|
|
3 |
display: block;
|
4 |
-
|
5 |
-
padding: 0 0 0 em($gap-largest);
|
6 |
-
position: relative;
|
7 |
-
|
8 |
-
&:first-child {
|
9 |
-
margin-top: 0;
|
10 |
-
}
|
11 |
-
&:last-child {
|
12 |
-
margin-bottom: 0;
|
13 |
-
}
|
14 |
}
|
15 |
|
16 |
.wc-block-components-radio-control__option-layout {
|
|
|
17 |
display: table;
|
18 |
width: 100%;
|
19 |
}
|
1 |
.wc-block-components-radio-control__option {
|
2 |
@include reset-typography();
|
3 |
+
@include with-translucent-border( 0 0 1px );
|
4 |
display: block;
|
5 |
+
padding: em($gap) 0 em($gap) em($gap-largest);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
}
|
7 |
|
8 |
.wc-block-components-radio-control__option-layout {
|
9 |
+
@include with-translucent-border( 0 0 1px );
|
10 |
display: table;
|
11 |
width: 100%;
|
12 |
}
|
assets/js/base/components/reviews/review-list-item/index.js
CHANGED
@@ -125,7 +125,7 @@ function getReviewRating( review ) {
|
|
125 |
width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
|
126 |
};
|
127 |
const ratingText = sprintf(
|
128 |
-
/*
|
129 |
__( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
|
130 |
rating
|
131 |
);
|
125 |
width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
|
126 |
};
|
127 |
const ratingText = sprintf(
|
128 |
+
/* Translators: %f is referring to the average rating value */
|
129 |
__( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
|
130 |
rating
|
131 |
);
|
assets/js/base/components/reviews/review-list/index.js
CHANGED
@@ -2,7 +2,10 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
-
import {
|
|
|
|
|
|
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
@@ -11,13 +14,11 @@ import ReviewListItem from '../review-list-item';
|
|
11 |
import './style.scss';
|
12 |
|
13 |
const ReviewList = ( { attributes, reviews } ) => {
|
14 |
-
const showAvatars = getSetting( 'showAvatars', true );
|
15 |
-
const reviewRatingsEnabled = getSetting( 'reviewRatingsEnabled', true );
|
16 |
const showReviewImage =
|
17 |
-
(
|
18 |
attributes.showReviewImage;
|
19 |
const showReviewRating =
|
20 |
-
|
21 |
const attrs = {
|
22 |
...attributes,
|
23 |
showReviewImage,
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
+
import {
|
6 |
+
REVIEW_RATINGS_ENABLED,
|
7 |
+
SHOW_AVATARS,
|
8 |
+
} from '@woocommerce/block-settings';
|
9 |
|
10 |
/**
|
11 |
* Internal dependencies
|
14 |
import './style.scss';
|
15 |
|
16 |
const ReviewList = ( { attributes, reviews } ) => {
|
|
|
|
|
17 |
const showReviewImage =
|
18 |
+
( SHOW_AVATARS || attributes.imageType === 'product' ) &&
|
19 |
attributes.showReviewImage;
|
20 |
const showReviewRating =
|
21 |
+
REVIEW_RATINGS_ENABLED && attributes.showReviewRating;
|
22 |
const attrs = {
|
23 |
...attributes,
|
24 |
showReviewImage,
|
assets/js/base/components/select/index.js
CHANGED
@@ -1,2 +1,61 @@
|
|
1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
export { default as ValidatedSelect } from './validated';
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import classnames from 'classnames';
|
6 |
+
import { CustomSelectControl } from 'wordpress-components';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Internal dependencies
|
10 |
+
*/
|
11 |
+
import './style.scss';
|
12 |
+
|
13 |
+
const Select = ( {
|
14 |
+
className,
|
15 |
+
feedback,
|
16 |
+
id,
|
17 |
+
label,
|
18 |
+
onChange,
|
19 |
+
options,
|
20 |
+
value,
|
21 |
+
} ) => {
|
22 |
+
return (
|
23 |
+
<div
|
24 |
+
id={ id }
|
25 |
+
className={ classnames( 'wc-block-components-select', className, {
|
26 |
+
'is-active': value,
|
27 |
+
} ) }
|
28 |
+
>
|
29 |
+
<CustomSelectControl
|
30 |
+
label={ label }
|
31 |
+
onChange={ ( { selectedItem } ) => {
|
32 |
+
onChange( selectedItem.key );
|
33 |
+
} }
|
34 |
+
options={ options }
|
35 |
+
value={ value || null }
|
36 |
+
/>
|
37 |
+
{ feedback }
|
38 |
+
</div>
|
39 |
+
);
|
40 |
+
};
|
41 |
+
|
42 |
+
Select.propTypes = {
|
43 |
+
onChange: PropTypes.func.isRequired,
|
44 |
+
options: PropTypes.arrayOf(
|
45 |
+
PropTypes.shape( {
|
46 |
+
key: PropTypes.string.isRequired,
|
47 |
+
name: PropTypes.string.isRequired,
|
48 |
+
} ).isRequired
|
49 |
+
).isRequired,
|
50 |
+
className: PropTypes.string,
|
51 |
+
feedback: PropTypes.node,
|
52 |
+
id: PropTypes.string,
|
53 |
+
label: PropTypes.string,
|
54 |
+
value: PropTypes.shape( {
|
55 |
+
key: PropTypes.string.isRequired,
|
56 |
+
name: PropTypes.string.isRequired,
|
57 |
+
} ),
|
58 |
+
};
|
59 |
+
|
60 |
+
export default Select;
|
61 |
export { default as ValidatedSelect } from './validated';
|
assets/js/base/components/select/select.js
DELETED
@@ -1,60 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import PropTypes from 'prop-types';
|
5 |
-
import classnames from 'classnames';
|
6 |
-
import { CustomSelectControl } from 'wordpress-components';
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Internal dependencies
|
10 |
-
*/
|
11 |
-
import './style.scss';
|
12 |
-
|
13 |
-
const Select = ( {
|
14 |
-
className,
|
15 |
-
feedback,
|
16 |
-
id,
|
17 |
-
label,
|
18 |
-
onChange,
|
19 |
-
options,
|
20 |
-
value,
|
21 |
-
} ) => {
|
22 |
-
return (
|
23 |
-
<div
|
24 |
-
id={ id }
|
25 |
-
className={ classnames( 'wc-block-components-select', className, {
|
26 |
-
'is-active': value,
|
27 |
-
} ) }
|
28 |
-
>
|
29 |
-
<CustomSelectControl
|
30 |
-
label={ label }
|
31 |
-
onChange={ ( { selectedItem } ) => {
|
32 |
-
onChange( selectedItem.key );
|
33 |
-
} }
|
34 |
-
options={ options }
|
35 |
-
value={ value || null }
|
36 |
-
/>
|
37 |
-
{ feedback }
|
38 |
-
</div>
|
39 |
-
);
|
40 |
-
};
|
41 |
-
|
42 |
-
Select.propTypes = {
|
43 |
-
onChange: PropTypes.func.isRequired,
|
44 |
-
options: PropTypes.arrayOf(
|
45 |
-
PropTypes.shape( {
|
46 |
-
key: PropTypes.string.isRequired,
|
47 |
-
name: PropTypes.string.isRequired,
|
48 |
-
} ).isRequired
|
49 |
-
).isRequired,
|
50 |
-
className: PropTypes.string,
|
51 |
-
feedback: PropTypes.node,
|
52 |
-
id: PropTypes.string,
|
53 |
-
label: PropTypes.string,
|
54 |
-
value: PropTypes.shape( {
|
55 |
-
key: PropTypes.string.isRequired,
|
56 |
-
name: PropTypes.string.isRequired,
|
57 |
-
} ),
|
58 |
-
};
|
59 |
-
|
60 |
-
export default Select;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/select/style.scss
CHANGED
@@ -1,9 +1,8 @@
|
|
1 |
-
.wc-block-components-form .wc-block-components-select,
|
2 |
.wc-block-components-select {
|
3 |
height: 3em;
|
4 |
position: relative;
|
5 |
|
6 |
-
label
|
7 |
@include reset-typography();
|
8 |
@include font-size(regular);
|
9 |
line-height: 1.375; // =22px when font-size is 16px.
|
@@ -56,7 +55,7 @@
|
|
56 |
&:focus,
|
57 |
&:active {
|
58 |
@include font-size(regular);
|
59 |
-
background: #fff;
|
60 |
box-shadow: none;
|
61 |
color: $input-text-active;
|
62 |
font-family: inherit;
|
@@ -71,10 +70,8 @@
|
|
71 |
text-transform: none;
|
72 |
white-space: nowrap;
|
73 |
width: 100%;
|
74 |
-
opacity: initial;
|
75 |
-
border-radius: 4px;
|
76 |
.has-dark-controls & {
|
77 |
-
background: $input-background-dark;
|
78 |
border-color: $input-border-dark;
|
79 |
color: $input-text-dark;
|
80 |
}
|
@@ -124,12 +121,6 @@
|
|
124 |
}
|
125 |
|
126 |
.theme-twentytwentyone {
|
127 |
-
// Extra classes for specificity.
|
128 |
-
&.theme-twentytwentyone.theme-twentytwentyone .components-custom-select-control__button {
|
129 |
-
background-color: #fff;
|
130 |
-
color: $input-text-active;
|
131 |
-
}
|
132 |
-
|
133 |
&.is-dark-theme {
|
134 |
// If the theme is in dark mode, as well as the block, then this selector will match.
|
135 |
.has-dark-controls {
|
@@ -144,19 +135,3 @@
|
|
144 |
}
|
145 |
}
|
146 |
}
|
147 |
-
|
148 |
-
.theme-twentyseventeen {
|
149 |
-
// Extra classes for specificity.
|
150 |
-
&.theme-twentyseventeen.theme-twentyseventeen {
|
151 |
-
.components-custom-select-control__button {
|
152 |
-
background-color: $select-dropdown-light;
|
153 |
-
color: $input-text-active;
|
154 |
-
}
|
155 |
-
.has-dark-controls {
|
156 |
-
.components-custom-select-control__button {
|
157 |
-
background-color: $select-dropdown-dark;
|
158 |
-
color: $input-text-dark;
|
159 |
-
}
|
160 |
-
}
|
161 |
-
}
|
162 |
-
}
|
|
|
1 |
.wc-block-components-select {
|
2 |
height: 3em;
|
3 |
position: relative;
|
4 |
|
5 |
+
label {
|
6 |
@include reset-typography();
|
7 |
@include font-size(regular);
|
8 |
line-height: 1.375; // =22px when font-size is 16px.
|
55 |
&:focus,
|
56 |
&:active {
|
57 |
@include font-size(regular);
|
58 |
+
background-color: #fff;
|
59 |
box-shadow: none;
|
60 |
color: $input-text-active;
|
61 |
font-family: inherit;
|
70 |
text-transform: none;
|
71 |
white-space: nowrap;
|
72 |
width: 100%;
|
|
|
|
|
73 |
.has-dark-controls & {
|
74 |
+
background-color: $input-background-dark;
|
75 |
border-color: $input-border-dark;
|
76 |
color: $input-text-dark;
|
77 |
}
|
121 |
}
|
122 |
|
123 |
.theme-twentytwentyone {
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
&.is-dark-theme {
|
125 |
// If the theme is in dark mode, as well as the block, then this selector will match.
|
126 |
.has-dark-controls {
|
135 |
}
|
136 |
}
|
137 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/select/validated.js
CHANGED
@@ -3,19 +3,17 @@
|
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { useEffect } from 'react';
|
|
|
6 |
import { useShallowEqual } from '@woocommerce/base-hooks';
|
7 |
import PropTypes from 'prop-types';
|
8 |
import classnames from 'classnames';
|
9 |
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
10 |
-
import {
|
11 |
-
ValidationInputError,
|
12 |
-
useValidationContext,
|
13 |
-
} from '@woocommerce/base-context';
|
14 |
|
15 |
/**
|
16 |
* Internal dependencies
|
17 |
*/
|
18 |
-
import
|
|
|
19 |
import './style.scss';
|
20 |
|
21 |
const ValidatedSelect = ( {
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { useEffect } from 'react';
|
6 |
+
import { useValidationContext } from '@woocommerce/base-context';
|
7 |
import { useShallowEqual } from '@woocommerce/base-hooks';
|
8 |
import PropTypes from 'prop-types';
|
9 |
import classnames from 'classnames';
|
10 |
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
|
|
|
|
|
|
|
|
11 |
|
12 |
/**
|
13 |
* Internal dependencies
|
14 |
*/
|
15 |
+
import { ValidationInputError } from '../validation';
|
16 |
+
import Select from './index';
|
17 |
import './style.scss';
|
18 |
|
19 |
const ValidatedSelect = ( {
|
assets/js/base/components/sidebar-layout/style.scss
CHANGED
@@ -18,9 +18,11 @@
|
|
18 |
padding-left: percentage($gap-large / 1060px);
|
19 |
width: 35%;
|
20 |
|
21 |
-
.wc-
|
22 |
-
|
23 |
-
|
|
|
|
|
24 |
}
|
25 |
}
|
26 |
|
@@ -45,23 +47,16 @@
|
|
45 |
.is-large {
|
46 |
.wc-block-components-sidebar {
|
47 |
.wc-block-components-totals-item,
|
48 |
-
.wc-
|
49 |
padding-left: $gap;
|
50 |
padding-right: $gap;
|
51 |
}
|
52 |
}
|
53 |
}
|
54 |
|
55 |
-
.wc-block-components-sidebar .wc-block-components-panel > h2 {
|
56 |
-
@include reset-typography();
|
57 |
-
.wc-block-components-panel__button {
|
58 |
-
font-weight: 400;
|
59 |
-
}
|
60 |
-
}
|
61 |
-
|
62 |
// For Twenty Twenty we need to increase specificity a bit more.
|
63 |
.theme-twentytwenty {
|
64 |
-
.wc-block-components-sidebar .wc-
|
65 |
@include font-size(large);
|
66 |
@include reset-box();
|
67 |
}
|
18 |
padding-left: percentage($gap-large / 1060px);
|
19 |
width: 35%;
|
20 |
|
21 |
+
.wc-blocks-components-panel {
|
22 |
+
> h2 {
|
23 |
+
@include font-size(large);
|
24 |
+
@include reset-box();
|
25 |
+
}
|
26 |
}
|
27 |
}
|
28 |
|
47 |
.is-large {
|
48 |
.wc-block-components-sidebar {
|
49 |
.wc-block-components-totals-item,
|
50 |
+
.wc-blocks-components-panel {
|
51 |
padding-left: $gap;
|
52 |
padding-right: $gap;
|
53 |
}
|
54 |
}
|
55 |
}
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
// For Twenty Twenty we need to increase specificity a bit more.
|
58 |
.theme-twentytwenty {
|
59 |
+
.wc-block-components-sidebar .wc-blocks-components-panel > h2 {
|
60 |
@include font-size(large);
|
61 |
@include reset-box();
|
62 |
}
|
assets/js/base/components/spinner/index.tsx
DELETED
@@ -1,10 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import './style.scss';
|
5 |
-
|
6 |
-
const Spinner = (): JSX.Element => {
|
7 |
-
return <span className="wc-block-components-spinner" aria-hidden="true" />;
|
8 |
-
};
|
9 |
-
|
10 |
-
export default Spinner;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/spinner/style.scss
DELETED
@@ -1,37 +0,0 @@
|
|
1 |
-
.wc-block-components-spinner {
|
2 |
-
position: absolute;
|
3 |
-
width: 100%;
|
4 |
-
height: 100%;
|
5 |
-
color: inherit;
|
6 |
-
box-sizing: content-box;
|
7 |
-
text-align: center;
|
8 |
-
font-size: 1.25em;
|
9 |
-
|
10 |
-
&::after {
|
11 |
-
content: " ";
|
12 |
-
position: absolute;
|
13 |
-
top: 50%;
|
14 |
-
left: 50%;
|
15 |
-
margin: -0.5em 0 0 -0.5em;
|
16 |
-
width: 1em;
|
17 |
-
height: 1em;
|
18 |
-
box-sizing: border-box;
|
19 |
-
transform-origin: 50% 50%;
|
20 |
-
transform: translateZ(0) scale(0.5);
|
21 |
-
backface-visibility: hidden;
|
22 |
-
border-radius: 50%;
|
23 |
-
border: 0.2em solid currentColor;
|
24 |
-
border-left-color: transparent;
|
25 |
-
animation: wc-block-components-spinner__animation 1s infinite linear;
|
26 |
-
}
|
27 |
-
}
|
28 |
-
|
29 |
-
@keyframes wc-block-components-spinner__animation {
|
30 |
-
0% {
|
31 |
-
animation-timing-function: cubic-bezier(0.5856, 0.0703, 0.4143, 0.9297);
|
32 |
-
transform: rotate(0deg);
|
33 |
-
}
|
34 |
-
100% {
|
35 |
-
transform: rotate(360deg);
|
36 |
-
}
|
37 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/state-input/StateInputProps.ts
DELETED
@@ -1,15 +0,0 @@
|
|
1 |
-
export interface StateInputProps {
|
2 |
-
className?: string;
|
3 |
-
label: string;
|
4 |
-
id: string;
|
5 |
-
autoComplete?: string;
|
6 |
-
value: string;
|
7 |
-
country: string;
|
8 |
-
onChange: ( value: string ) => void;
|
9 |
-
required?: boolean;
|
10 |
-
errorMessage?: string;
|
11 |
-
}
|
12 |
-
|
13 |
-
export type StateInputWithStatesProps = StateInputProps & {
|
14 |
-
states: Record< string, Record< string, string > >;
|
15 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/state-input/billing-state-input.js
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { ALLOWED_STATES } from '@woocommerce/block-settings';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import StateInput from './state-input.js';
|
11 |
+
|
12 |
+
const BillingStateInput = ( props ) => {
|
13 |
+
return <StateInput states={ ALLOWED_STATES } { ...props } />;
|
14 |
+
};
|
15 |
+
|
16 |
+
BillingStateInput.propTypes = {
|
17 |
+
onChange: PropTypes.func.isRequired,
|
18 |
+
className: PropTypes.string,
|
19 |
+
label: PropTypes.string,
|
20 |
+
value: PropTypes.string,
|
21 |
+
};
|
22 |
+
|
23 |
+
export default BillingStateInput;
|
assets/js/base/components/state-input/billing-state-input.tsx
DELETED
@@ -1,16 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { ALLOWED_STATES } from '@woocommerce/block-settings';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import StateInput from './state-input';
|
10 |
-
import type { StateInputProps } from './StateInputProps';
|
11 |
-
|
12 |
-
const BillingStateInput = ( props: StateInputProps ): JSX.Element => {
|
13 |
-
return <StateInput states={ ALLOWED_STATES } { ...props } />;
|
14 |
-
};
|
15 |
-
|
16 |
-
export default BillingStateInput;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/state-input/{index.ts → index.js}
RENAMED
File without changes
|
assets/js/base/components/state-input/shipping-state-input.js
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { SHIPPING_STATES } from '@woocommerce/block-settings';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import StateInput from './state-input.js';
|
11 |
+
|
12 |
+
const ShippingStateInput = ( props ) => {
|
13 |
+
return <StateInput states={ SHIPPING_STATES } { ...props } />;
|
14 |
+
};
|
15 |
+
|
16 |
+
ShippingStateInput.propTypes = {
|
17 |
+
onChange: PropTypes.func.isRequired,
|
18 |
+
className: PropTypes.string,
|
19 |
+
label: PropTypes.string,
|
20 |
+
value: PropTypes.string,
|
21 |
+
};
|
22 |
+
|
23 |
+
export default ShippingStateInput;
|
assets/js/base/components/state-input/shipping-state-input.tsx
DELETED
@@ -1,16 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { SHIPPING_STATES } from '@woocommerce/block-settings';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import StateInput from './state-input';
|
10 |
-
import type { StateInputProps } from './StateInputProps';
|
11 |
-
|
12 |
-
const ShippingStateInput = ( props: StateInputProps ): JSX.Element => {
|
13 |
-
return <StateInput states={ SHIPPING_STATES } { ...props } />;
|
14 |
-
};
|
15 |
-
|
16 |
-
export default ShippingStateInput;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/state-input/{state-input.tsx → state-input.js}
RENAMED
@@ -2,6 +2,7 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
|
|
5 |
import { decodeEntities } from '@wordpress/html-entities';
|
6 |
import { useCallback, useMemo } from '@wordpress/element';
|
7 |
import classnames from 'classnames';
|
@@ -12,7 +13,6 @@ import classnames from 'classnames';
|
|
12 |
import { ValidatedTextInput } from '../text-input';
|
13 |
import { ValidatedSelect } from '../select';
|
14 |
import './style.scss';
|
15 |
-
import type { StateInputWithStatesProps } from './StateInputProps';
|
16 |
|
17 |
const StateInput = ( {
|
18 |
className,
|
@@ -24,7 +24,7 @@ const StateInput = ( {
|
|
24 |
autoComplete = 'off',
|
25 |
value = '',
|
26 |
required = false,
|
27 |
-
}
|
28 |
const countryStates = states[ country ];
|
29 |
const options = useMemo(
|
30 |
() =>
|
@@ -112,4 +112,20 @@ const StateInput = ( {
|
|
112 |
);
|
113 |
};
|
114 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
export default StateInput;
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
+
import PropTypes from 'prop-types';
|
6 |
import { decodeEntities } from '@wordpress/html-entities';
|
7 |
import { useCallback, useMemo } from '@wordpress/element';
|
8 |
import classnames from 'classnames';
|
13 |
import { ValidatedTextInput } from '../text-input';
|
14 |
import { ValidatedSelect } from '../select';
|
15 |
import './style.scss';
|
|
|
16 |
|
17 |
const StateInput = ( {
|
18 |
className,
|
24 |
autoComplete = 'off',
|
25 |
value = '',
|
26 |
required = false,
|
27 |
+
} ) => {
|
28 |
const countryStates = states[ country ];
|
29 |
const options = useMemo(
|
30 |
() =>
|
112 |
);
|
113 |
};
|
114 |
|
115 |
+
StateInput.propTypes = {
|
116 |
+
states: PropTypes.objectOf(
|
117 |
+
PropTypes.oneOfType( [
|
118 |
+
PropTypes.array,
|
119 |
+
PropTypes.objectOf( PropTypes.string ),
|
120 |
+
] )
|
121 |
+
).isRequired,
|
122 |
+
onChange: PropTypes.func.isRequired,
|
123 |
+
autoComplete: PropTypes.string,
|
124 |
+
id: PropTypes.string,
|
125 |
+
className: PropTypes.string,
|
126 |
+
country: PropTypes.string,
|
127 |
+
label: PropTypes.string,
|
128 |
+
value: PropTypes.string,
|
129 |
+
};
|
130 |
+
|
131 |
export default StateInput;
|
assets/js/base/components/store-notices-container/index.js
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
1 |
+
export { default as StoreNoticesContainer } from './store-notices-container';
|
2 |
+
export { default as SnackbarNoticesContainer } from './snackbar-notices';
|
assets/js/base/components/store-notices-container/snackbar-notices.js
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { SnackbarList } from 'wordpress-components';
|
5 |
+
import { useStoreNotices } from '@woocommerce/base-hooks';
|
6 |
+
import { useEditorContext } from '@woocommerce/base-context';
|
7 |
+
|
8 |
+
const NoticesContainer = () => {
|
9 |
+
const { isEditor } = useEditorContext();
|
10 |
+
const { notices, removeNotice } = useStoreNotices();
|
11 |
+
|
12 |
+
if ( isEditor ) {
|
13 |
+
return null;
|
14 |
+
}
|
15 |
+
|
16 |
+
const snackbarNotices = notices.filter(
|
17 |
+
( notice ) => notice.type === 'snackbar'
|
18 |
+
);
|
19 |
+
|
20 |
+
return (
|
21 |
+
<SnackbarList
|
22 |
+
notices={ snackbarNotices }
|
23 |
+
className={ 'wc-block-components-notices__snackbar' }
|
24 |
+
onRemove={ removeNotice }
|
25 |
+
/>
|
26 |
+
);
|
27 |
+
};
|
28 |
+
|
29 |
+
export default NoticesContainer;
|
assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js
RENAMED
@@ -4,6 +4,7 @@
|
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
import { Notice } from 'wordpress-components';
|
|
|
7 |
|
8 |
/**
|
9 |
* Internal dependencies
|
@@ -23,7 +24,8 @@ const getWooClassName = ( { status = 'default' } ) => {
|
|
23 |
return '';
|
24 |
};
|
25 |
|
26 |
-
const StoreNoticesContainer = ( { className, notices
|
|
|
27 |
const regularNotices = notices.filter(
|
28 |
( notice ) => notice.type !== 'snackbar'
|
29 |
);
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
import { Notice } from 'wordpress-components';
|
7 |
+
import { useStoreNoticesContext } from '@woocommerce/base-context';
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
24 |
return '';
|
25 |
};
|
26 |
|
27 |
+
const StoreNoticesContainer = ( { className, notices } ) => {
|
28 |
+
const { removeNotice } = useStoreNoticesContext();
|
29 |
const regularNotices = notices.filter(
|
30 |
( notice ) => notice.type !== 'snackbar'
|
31 |
);
|
assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/style.scss
RENAMED
@@ -22,3 +22,24 @@
|
|
22 |
margin-top: 1em;
|
23 |
}
|
24 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
margin-top: 1em;
|
23 |
}
|
24 |
}
|
25 |
+
|
26 |
+
.wc-block-components-notices__snackbar {
|
27 |
+
position: fixed;
|
28 |
+
bottom: 20px;
|
29 |
+
left: 16px;
|
30 |
+
width: auto;
|
31 |
+
|
32 |
+
@include breakpoint( "<782px" ) {
|
33 |
+
position: fixed;
|
34 |
+
top: 10px;
|
35 |
+
left: 0;
|
36 |
+
bottom: auto;
|
37 |
+
}
|
38 |
+
|
39 |
+
.components-snackbar-list__notice-container {
|
40 |
+
@include breakpoint( "<782px" ) {
|
41 |
+
margin-left: 10px;
|
42 |
+
margin-right: 10px;
|
43 |
+
}
|
44 |
+
}
|
45 |
+
}
|
assets/js/base/components/summary/{index.tsx → index.js}
RENAMED
@@ -2,19 +2,12 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { RawHTML, useMemo } from '@wordpress/element';
|
5 |
-
import { WordCountType } from '@woocommerce/block-settings';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
10 |
import { generateSummary } from './utils';
|
11 |
|
12 |
-
interface SummaryProps {
|
13 |
-
className?: string;
|
14 |
-
source: string;
|
15 |
-
maxLength?: number;
|
16 |
-
countType?: WordCountType;
|
17 |
-
}
|
18 |
/**
|
19 |
* Summary component.
|
20 |
*
|
@@ -29,7 +22,7 @@ export const Summary = ( {
|
|
29 |
maxLength = 15,
|
30 |
countType = 'words',
|
31 |
className = '',
|
32 |
-
}
|
33 |
const summaryText = useMemo( () => {
|
34 |
return generateSummary( source, maxLength, countType );
|
35 |
}, [ source, maxLength, countType ] );
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { RawHTML, useMemo } from '@wordpress/element';
|
|
|
5 |
|
6 |
/**
|
7 |
* Internal dependencies
|
8 |
*/
|
9 |
import { generateSummary } from './utils';
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
/**
|
12 |
* Summary component.
|
13 |
*
|
22 |
maxLength = 15,
|
23 |
countType = 'words',
|
24 |
className = '',
|
25 |
+
} ) => {
|
26 |
const summaryText = useMemo( () => {
|
27 |
return generateSummary( source, maxLength, countType );
|
28 |
}, [ source, maxLength, countType ] );
|
assets/js/base/components/text-input/{index.ts → index.js}
RENAMED
File without changes
|
assets/js/base/components/text-input/style.scss
CHANGED
@@ -1,4 +1,3 @@
|
|
1 |
-
.wc-block-components-form .wc-block-components-text-input,
|
2 |
.wc-block-components-text-input {
|
3 |
position: relative;
|
4 |
margin-top: em($gap-large);
|
@@ -40,7 +39,6 @@
|
|
40 |
input[type="tel"],
|
41 |
input[type="url"],
|
42 |
input[type="text"],
|
43 |
-
input[type="number"],
|
44 |
input[type="email"] {
|
45 |
@include font-size(regular);
|
46 |
background-color: #fff;
|
@@ -58,35 +56,17 @@
|
|
58 |
|
59 |
&:focus {
|
60 |
background-color: #fff;
|
61 |
-
color: $input-text-active;
|
62 |
}
|
63 |
-
|
64 |
.has-dark-controls & {
|
65 |
background-color: $input-background-dark;
|
66 |
border-color: $input-border-dark;
|
67 |
color: $input-text-dark;
|
68 |
-
|
69 |
-
&:focus {
|
70 |
-
background-color: $input-background-dark;
|
71 |
-
color: $input-text-dark;
|
72 |
-
}
|
73 |
-
}
|
74 |
-
}
|
75 |
-
|
76 |
-
input[type="number"] {
|
77 |
-
-moz-appearance: textfield;
|
78 |
-
|
79 |
-
&::-webkit-outer-spin-button,
|
80 |
-
&::-webkit-inner-spin-button {
|
81 |
-
appearance: none;
|
82 |
-
margin: 0;
|
83 |
}
|
84 |
}
|
85 |
|
86 |
&.is-active input[type="tel"],
|
87 |
&.is-active input[type="url"],
|
88 |
&.is-active input[type="text"],
|
89 |
-
&.is-active input[type="number"],
|
90 |
&.is-active input[type="email"] {
|
91 |
padding: em($gap-large) 0 em($gap-smallest) $gap;
|
92 |
}
|
|
|
1 |
.wc-block-components-text-input {
|
2 |
position: relative;
|
3 |
margin-top: em($gap-large);
|
39 |
input[type="tel"],
|
40 |
input[type="url"],
|
41 |
input[type="text"],
|
|
|
42 |
input[type="email"] {
|
43 |
@include font-size(regular);
|
44 |
background-color: #fff;
|
56 |
|
57 |
&:focus {
|
58 |
background-color: #fff;
|
|
|
59 |
}
|
|
|
60 |
.has-dark-controls & {
|
61 |
background-color: $input-background-dark;
|
62 |
border-color: $input-border-dark;
|
63 |
color: $input-text-dark;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
}
|
65 |
}
|
66 |
|
67 |
&.is-active input[type="tel"],
|
68 |
&.is-active input[type="url"],
|
69 |
&.is-active input[type="text"],
|
|
|
70 |
&.is-active input[type="email"] {
|
71 |
padding: em($gap-large) 0 em($gap-smallest) $gap;
|
72 |
}
|
assets/js/base/components/text-input/{text-input.tsx → text-input.js}
RENAMED
@@ -1,7 +1,8 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import { forwardRef
|
|
|
5 |
import classnames from 'classnames';
|
6 |
import { useState } from '@wordpress/element';
|
7 |
|
@@ -11,24 +12,7 @@ import { useState } from '@wordpress/element';
|
|
11 |
import Label from '../label';
|
12 |
import './style.scss';
|
13 |
|
14 |
-
|
15 |
-
extends Omit<
|
16 |
-
InputHTMLAttributes< HTMLInputElement >,
|
17 |
-
'onChange' | 'onBlur'
|
18 |
-
> {
|
19 |
-
id: string;
|
20 |
-
ariaLabel?: string;
|
21 |
-
label?: string;
|
22 |
-
ariaDescribedBy?: string;
|
23 |
-
screenReaderLabel?: string;
|
24 |
-
help?: string;
|
25 |
-
feedback?: boolean | JSX.Element;
|
26 |
-
autoComplete?: string;
|
27 |
-
onChange: ( newValue: string ) => void;
|
28 |
-
onBlur?: ( newValue: string ) => void;
|
29 |
-
}
|
30 |
-
|
31 |
-
const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
|
32 |
(
|
33 |
{
|
34 |
className,
|
@@ -45,11 +29,8 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
|
|
45 |
value = '',
|
46 |
onChange,
|
47 |
required = false,
|
48 |
-
onBlur = () => {
|
49 |
-
/* Do nothing */
|
50 |
-
},
|
51 |
feedback,
|
52 |
-
...rest
|
53 |
},
|
54 |
ref
|
55 |
) => {
|
@@ -76,8 +57,8 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
|
|
76 |
onChange( event.target.value );
|
77 |
} }
|
78 |
onFocus={ () => setIsActive( true ) }
|
79 |
-
onBlur={ (
|
80 |
-
onBlur(
|
81 |
setIsActive( false );
|
82 |
} }
|
83 |
aria-label={ ariaLabel || label }
|
@@ -88,7 +69,6 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
|
|
88 |
: ariaDescribedBy
|
89 |
}
|
90 |
required={ required }
|
91 |
-
{ ...rest }
|
92 |
/>
|
93 |
<Label
|
94 |
label={ label }
|
@@ -113,4 +93,19 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
|
|
113 |
}
|
114 |
);
|
115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
export default TextInput;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { forwardRef } from 'react';
|
5 |
+
import PropTypes from 'prop-types';
|
6 |
import classnames from 'classnames';
|
7 |
import { useState } from '@wordpress/element';
|
8 |
|
12 |
import Label from '../label';
|
13 |
import './style.scss';
|
14 |
|
15 |
+
const TextInput = forwardRef(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
(
|
17 |
{
|
18 |
className,
|
29 |
value = '',
|
30 |
onChange,
|
31 |
required = false,
|
32 |
+
onBlur = () => {},
|
|
|
|
|
33 |
feedback,
|
|
|
34 |
},
|
35 |
ref
|
36 |
) => {
|
57 |
onChange( event.target.value );
|
58 |
} }
|
59 |
onFocus={ () => setIsActive( true ) }
|
60 |
+
onBlur={ () => {
|
61 |
+
onBlur();
|
62 |
setIsActive( false );
|
63 |
} }
|
64 |
aria-label={ ariaLabel || label }
|
69 |
: ariaDescribedBy
|
70 |
}
|
71 |
required={ required }
|
|
|
72 |
/>
|
73 |
<Label
|
74 |
label={ label }
|
93 |
}
|
94 |
);
|
95 |
|
96 |
+
TextInput.propTypes = {
|
97 |
+
id: PropTypes.string.isRequired,
|
98 |
+
onChange: PropTypes.func.isRequired,
|
99 |
+
value: PropTypes.string,
|
100 |
+
ariaLabel: PropTypes.string,
|
101 |
+
ariaDescribedBy: PropTypes.string,
|
102 |
+
label: PropTypes.string,
|
103 |
+
screenReaderLabel: PropTypes.string,
|
104 |
+
disabled: PropTypes.bool,
|
105 |
+
help: PropTypes.string,
|
106 |
+
autoCapitalize: PropTypes.string,
|
107 |
+
autoComplete: PropTypes.string,
|
108 |
+
required: PropTypes.bool,
|
109 |
+
};
|
110 |
+
|
111 |
export default TextInput;
|
assets/js/base/components/text-input/{validated-text-input.tsx → validated-text-input.js}
RENAMED
@@ -3,13 +3,11 @@
|
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { useCallback, useRef, useEffect, useState } from 'react';
|
|
|
6 |
import classnames from 'classnames';
|
7 |
-
import {
|
8 |
-
|
9 |
-
useValidationContext,
|
10 |
-
} from '@woocommerce/base-context';
|
11 |
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
12 |
-
import { isString } from '@woocommerce/types';
|
13 |
|
14 |
/**
|
15 |
* Internal dependencies
|
@@ -17,30 +15,6 @@ import { isString } from '@woocommerce/types';
|
|
17 |
import TextInput from './text-input';
|
18 |
import './style.scss';
|
19 |
|
20 |
-
interface ValidatedTextInputPropsWithId {
|
21 |
-
instanceId?: string;
|
22 |
-
id: string;
|
23 |
-
}
|
24 |
-
|
25 |
-
interface ValidatedTextInputPropsWithInstanceId {
|
26 |
-
instanceId: string;
|
27 |
-
id?: string;
|
28 |
-
}
|
29 |
-
|
30 |
-
type ValidatedTextInputProps = (
|
31 |
-
| ValidatedTextInputPropsWithId
|
32 |
-
| ValidatedTextInputPropsWithInstanceId
|
33 |
-
) & {
|
34 |
-
className?: string;
|
35 |
-
ariaDescribedBy?: string;
|
36 |
-
errorId?: string;
|
37 |
-
validateOnMount?: boolean;
|
38 |
-
focusOnMount?: boolean;
|
39 |
-
showError?: boolean;
|
40 |
-
errorMessage?: string;
|
41 |
-
onChange: ( newValue: string ) => void;
|
42 |
-
};
|
43 |
-
|
44 |
const ValidatedTextInput = ( {
|
45 |
className,
|
46 |
instanceId,
|
@@ -51,11 +25,10 @@ const ValidatedTextInput = ( {
|
|
51 |
focusOnMount = false,
|
52 |
onChange,
|
53 |
showError = true,
|
54 |
-
errorMessage: passedErrorMessage = '',
|
55 |
...rest
|
56 |
-
}
|
57 |
const [ isPristine, setIsPristine ] = useState( true );
|
58 |
-
const inputRef = useRef
|
59 |
const {
|
60 |
getValidationError,
|
61 |
hideValidationError,
|
@@ -64,9 +37,8 @@ const ValidatedTextInput = ( {
|
|
64 |
getValidationErrorId,
|
65 |
} = useValidationContext();
|
66 |
|
67 |
-
const textInputId =
|
68 |
-
|
69 |
-
const errorIdString = errorId !== undefined ? errorId : textInputId;
|
70 |
|
71 |
const validateInput = useCallback(
|
72 |
( errorsHidden = true ) => {
|
@@ -78,10 +50,10 @@ const ValidatedTextInput = ( {
|
|
78 |
inputObject.value = inputObject.value.trim();
|
79 |
const inputIsValid = inputObject.checkValidity();
|
80 |
if ( inputIsValid ) {
|
81 |
-
clearValidationError(
|
82 |
} else {
|
83 |
setValidationErrors( {
|
84 |
-
[
|
85 |
message:
|
86 |
inputObject.validationMessage ||
|
87 |
__(
|
@@ -93,13 +65,13 @@ const ValidatedTextInput = ( {
|
|
93 |
} );
|
94 |
}
|
95 |
},
|
96 |
-
[ clearValidationError,
|
97 |
);
|
98 |
|
99 |
useEffect( () => {
|
100 |
if ( isPristine ) {
|
101 |
if ( focusOnMount ) {
|
102 |
-
inputRef.current
|
103 |
}
|
104 |
setIsPristine( false );
|
105 |
}
|
@@ -117,22 +89,15 @@ const ValidatedTextInput = ( {
|
|
117 |
// Remove validation errors when unmounted.
|
118 |
useEffect( () => {
|
119 |
return () => {
|
120 |
-
clearValidationError(
|
121 |
};
|
122 |
-
}, [ clearValidationError,
|
123 |
|
124 |
-
|
125 |
-
const errorMessage = ( getValidationError( errorIdString ) || {} ) as {
|
126 |
-
message?: string;
|
127 |
-
hidden?: boolean;
|
128 |
-
};
|
129 |
-
if ( isString( passedErrorMessage ) && passedErrorMessage !== '' ) {
|
130 |
-
errorMessage.message = passedErrorMessage;
|
131 |
-
}
|
132 |
const hasError = errorMessage.message && ! errorMessage.hidden;
|
133 |
const describedBy =
|
134 |
-
showError && hasError && getValidationErrorId(
|
135 |
-
? getValidationErrorId(
|
136 |
: ariaDescribedBy;
|
137 |
|
138 |
return (
|
@@ -145,16 +110,11 @@ const ValidatedTextInput = ( {
|
|
145 |
validateInput( false );
|
146 |
} }
|
147 |
feedback={
|
148 |
-
showError &&
|
149 |
-
<ValidationInputError
|
150 |
-
errorMessage={ passedErrorMessage }
|
151 |
-
propertyName={ errorIdString }
|
152 |
-
/>
|
153 |
-
)
|
154 |
}
|
155 |
ref={ inputRef }
|
156 |
onChange={ ( val ) => {
|
157 |
-
hideValidationError(
|
158 |
onChange( val );
|
159 |
} }
|
160 |
ariaDescribedBy={ describedBy }
|
@@ -163,4 +123,15 @@ const ValidatedTextInput = ( {
|
|
163 |
);
|
164 |
};
|
165 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
export default withInstanceId( ValidatedTextInput );
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { useCallback, useRef, useEffect, useState } from 'react';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
import classnames from 'classnames';
|
8 |
+
import { useValidationContext } from '@woocommerce/base-context';
|
9 |
+
import { ValidationInputError } from '@woocommerce/base-components/validation';
|
|
|
|
|
10 |
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
|
|
11 |
|
12 |
/**
|
13 |
* Internal dependencies
|
15 |
import TextInput from './text-input';
|
16 |
import './style.scss';
|
17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
const ValidatedTextInput = ( {
|
19 |
className,
|
20 |
instanceId,
|
25 |
focusOnMount = false,
|
26 |
onChange,
|
27 |
showError = true,
|
|
|
28 |
...rest
|
29 |
+
} ) => {
|
30 |
const [ isPristine, setIsPristine ] = useState( true );
|
31 |
+
const inputRef = useRef();
|
32 |
const {
|
33 |
getValidationError,
|
34 |
hideValidationError,
|
37 |
getValidationErrorId,
|
38 |
} = useValidationContext();
|
39 |
|
40 |
+
const textInputId = id || 'textinput-' + instanceId;
|
41 |
+
errorId = errorId || textInputId;
|
|
|
42 |
|
43 |
const validateInput = useCallback(
|
44 |
( errorsHidden = true ) => {
|
50 |
inputObject.value = inputObject.value.trim();
|
51 |
const inputIsValid = inputObject.checkValidity();
|
52 |
if ( inputIsValid ) {
|
53 |
+
clearValidationError( errorId );
|
54 |
} else {
|
55 |
setValidationErrors( {
|
56 |
+
[ errorId ]: {
|
57 |
message:
|
58 |
inputObject.validationMessage ||
|
59 |
__(
|
65 |
} );
|
66 |
}
|
67 |
},
|
68 |
+
[ clearValidationError, errorId, setValidationErrors ]
|
69 |
);
|
70 |
|
71 |
useEffect( () => {
|
72 |
if ( isPristine ) {
|
73 |
if ( focusOnMount ) {
|
74 |
+
inputRef.current.focus();
|
75 |
}
|
76 |
setIsPristine( false );
|
77 |
}
|
89 |
// Remove validation errors when unmounted.
|
90 |
useEffect( () => {
|
91 |
return () => {
|
92 |
+
clearValidationError( errorId );
|
93 |
};
|
94 |
+
}, [ clearValidationError, errorId ] );
|
95 |
|
96 |
+
const errorMessage = getValidationError( errorId ) || {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
const hasError = errorMessage.message && ! errorMessage.hidden;
|
98 |
const describedBy =
|
99 |
+
showError && hasError && getValidationErrorId( errorId )
|
100 |
+
? getValidationErrorId( errorId )
|
101 |
: ariaDescribedBy;
|
102 |
|
103 |
return (
|
110 |
validateInput( false );
|
111 |
} }
|
112 |
feedback={
|
113 |
+
showError && <ValidationInputError propertyName={ errorId } />
|
|
|
|
|
|
|
|
|
|
|
114 |
}
|
115 |
ref={ inputRef }
|
116 |
onChange={ ( val ) => {
|
117 |
+
hideValidationError( errorId );
|
118 |
onChange( val );
|
119 |
} }
|
120 |
ariaDescribedBy={ describedBy }
|
123 |
);
|
124 |
};
|
125 |
|
126 |
+
ValidatedTextInput.propTypes = {
|
127 |
+
onChange: PropTypes.func.isRequired,
|
128 |
+
id: PropTypes.string,
|
129 |
+
value: PropTypes.string,
|
130 |
+
ariaDescribedBy: PropTypes.string,
|
131 |
+
errorId: PropTypes.string,
|
132 |
+
validateOnMount: PropTypes.bool,
|
133 |
+
focusOnMount: PropTypes.bool,
|
134 |
+
showError: PropTypes.bool,
|
135 |
+
};
|
136 |
+
|
137 |
export default withInstanceId( ValidatedTextInput );
|
assets/js/base/components/title/index.js
CHANGED
@@ -15,7 +15,7 @@ import './style.scss';
|
|
15 |
* Component that renders a block title.
|
16 |
*
|
17 |
* @param {Object} props Incoming props for the component.
|
18 |
-
* @param {React.
|
19 |
* @param {string} [props.className] CSS class used.
|
20 |
* @param {string} props.headingLevel Heading level for title.
|
21 |
* @param {Object} [props.props] Rest of props passed through to component.
|
15 |
* Component that renders a block title.
|
16 |
*
|
17 |
* @param {Object} props Incoming props for the component.
|
18 |
+
* @param {React.ReactChildren} [props.children] Children elements this component wraps.
|
19 |
* @param {string} [props.className] CSS class used.
|
20 |
* @param {string} props.headingLevel Heading level for title.
|
21 |
* @param {Object} [props.props] Rest of props passed through to component.
|
assets/js/base/components/title/style.scss
CHANGED
@@ -2,7 +2,6 @@
|
|
2 |
.wc-block-components-title.wc-block-components-title {
|
3 |
@include reset-box();
|
4 |
@include font-size(large);
|
5 |
-
word-break: break-word;
|
6 |
}
|
7 |
|
8 |
// For Twenty Twenty we need to increase specificity a bit more.
|
@@ -10,6 +9,5 @@
|
|
10 |
.wc-block-components-title.wc-block-components-title {
|
11 |
@include reset-box();
|
12 |
@include font-size(large);
|
13 |
-
word-break: break-word;
|
14 |
}
|
15 |
}
|
2 |
.wc-block-components-title.wc-block-components-title {
|
3 |
@include reset-box();
|
4 |
@include font-size(large);
|
|
|
5 |
}
|
6 |
|
7 |
// For Twenty Twenty we need to increase specificity a bit more.
|
9 |
.wc-block-components-title.wc-block-components-title {
|
10 |
@include reset-box();
|
11 |
@include font-size(large);
|
|
|
12 |
}
|
13 |
}
|
assets/js/base/{context/providers/validation/components → components/validation}/index.js
RENAMED
File without changes
|
assets/js/base/{context/providers/validation/components/validation-input-error → components/validation}/style.scss
RENAMED
File without changes
|
assets/js/base/{context/providers/validation/components/validation-input-error/index.js → components/validation/validation-input-error.js}
RENAMED
@@ -1,12 +1,12 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import PropTypes from 'prop-types';
|
5 |
|
6 |
/**
|
7 |
* Internal dependencies
|
8 |
*/
|
9 |
-
import { useValidationContext } from '../../context';
|
10 |
import './style.scss';
|
11 |
|
12 |
export const ValidationInputError = ( {
|
@@ -15,8 +15,7 @@ export const ValidationInputError = ( {
|
|
15 |
elementId = '',
|
16 |
} ) => {
|
17 |
const { getValidationError, getValidationErrorId } = useValidationContext();
|
18 |
-
|
19 |
-
if ( ! errorMessage || typeof errorMessage !== 'string' ) {
|
20 |
const error = getValidationError( propertyName ) || {};
|
21 |
if ( error.message && ! error.hidden ) {
|
22 |
errorMessage = error.message;
|
@@ -37,5 +36,3 @@ ValidationInputError.propTypes = {
|
|
37 |
propertyName: PropTypes.string,
|
38 |
elementId: PropTypes.string,
|
39 |
};
|
40 |
-
|
41 |
-
export default ValidationInputError;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { useValidationContext } from '@woocommerce/base-context';
|
5 |
import PropTypes from 'prop-types';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
|
|
10 |
import './style.scss';
|
11 |
|
12 |
export const ValidationInputError = ( {
|
15 |
elementId = '',
|
16 |
} ) => {
|
17 |
const { getValidationError, getValidationErrorId } = useValidationContext();
|
18 |
+
if ( ! errorMessage ) {
|
|
|
19 |
const error = getValidationError( propertyName ) || {};
|
20 |
if ( error.message && ! error.hidden ) {
|
21 |
errorMessage = error.message;
|
36 |
propertyName: PropTypes.string,
|
37 |
elementId: PropTypes.string,
|
38 |
};
|
|
|
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/actions.js
RENAMED
File without changes
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/constants.js
RENAMED
File without changes
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/event-emit.js
RENAMED
@@ -6,7 +6,7 @@ import {
|
|
6 |
reducer,
|
7 |
emitEvent,
|
8 |
emitEventWithAbort,
|
9 |
-
} from '
|
10 |
|
11 |
const EMIT_TYPES = {
|
12 |
ADD_TO_CART_BEFORE_PROCESSING: 'add_to_cart_before_processing',
|
@@ -28,7 +28,7 @@ const EMIT_TYPES = {
|
|
28 |
*
|
29 |
* @return {Object} An object with the add to cart form emitter registration
|
30 |
*/
|
31 |
-
const
|
32 |
onAddToCartAfterProcessingWithSuccess: emitterCallback(
|
33 |
EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
|
34 |
dispatcher
|
@@ -43,4 +43,10 @@ const emitterObservers = ( dispatcher ) => ( {
|
|
43 |
),
|
44 |
} );
|
45 |
|
46 |
-
export {
|
|
|
|
|
|
|
|
|
|
|
|
6 |
reducer,
|
7 |
emitEvent,
|
8 |
emitEventWithAbort,
|
9 |
+
} from '../../shared/event-emit';
|
10 |
|
11 |
const EMIT_TYPES = {
|
12 |
ADD_TO_CART_BEFORE_PROCESSING: 'add_to_cart_before_processing',
|
28 |
*
|
29 |
* @return {Object} An object with the add to cart form emitter registration
|
30 |
*/
|
31 |
+
const emitterSubscribers = ( dispatcher ) => ( {
|
32 |
onAddToCartAfterProcessingWithSuccess: emitterCallback(
|
33 |
EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
|
34 |
dispatcher
|
43 |
),
|
44 |
} );
|
45 |
|
46 |
+
export {
|
47 |
+
EMIT_TYPES,
|
48 |
+
emitterSubscribers,
|
49 |
+
reducer,
|
50 |
+
emitEvent,
|
51 |
+
emitEventWithAbort,
|
52 |
+
};
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/index.js
RENAMED
@@ -9,7 +9,11 @@ import {
|
|
9 |
useEffect,
|
10 |
} from '@wordpress/element';
|
11 |
import { __ } from '@wordpress/i18n';
|
12 |
-
import {
|
|
|
|
|
|
|
|
|
13 |
import {
|
14 |
productIsPurchasable,
|
15 |
productSupportsAddToCartForm,
|
@@ -23,14 +27,12 @@ import { reducer } from './reducer';
|
|
23 |
import { DEFAULT_STATE, STATUS } from './constants';
|
24 |
import {
|
25 |
EMIT_TYPES,
|
26 |
-
|
27 |
emitEvent,
|
28 |
emitEventWithAbort,
|
29 |
reducer as emitReducer,
|
30 |
} from './event-emit';
|
31 |
-
import { useValidationContext } from '../../validation';
|
32 |
-
import { useStoreNotices } from '../../../hooks/use-store-notices';
|
33 |
-
import { useEmitResponse } from '../../../hooks/use-emit-response';
|
34 |
|
35 |
/**
|
36 |
* @typedef {import('@woocommerce/type-defs/add-to-cart-form').AddToCartFormDispatchActions} AddToCartFormDispatchActions
|
@@ -97,7 +99,7 @@ export const AddToCartFormStateContextProvider = ( {
|
|
97 |
reducer,
|
98 |
DEFAULT_STATE
|
99 |
);
|
100 |
-
const [ observers,
|
101 |
const currentObservers = useShallowEqual( observers );
|
102 |
const { addErrorNotice, removeNotices } = useStoreNotices();
|
103 |
const { setValidationErrors } = useValidationContext();
|
@@ -112,16 +114,16 @@ export const AddToCartFormStateContextProvider = ( {
|
|
112 |
*/
|
113 |
const eventRegistration = useMemo(
|
114 |
() => ( {
|
115 |
-
onAddToCartAfterProcessingWithSuccess:
|
116 |
-
|
117 |
).onAddToCartAfterProcessingWithSuccess,
|
118 |
-
onAddToCartAfterProcessingWithError:
|
119 |
-
|
120 |
).onAddToCartAfterProcessingWithError,
|
121 |
-
onAddToCartBeforeProcessing:
|
122 |
.onAddToCartBeforeProcessing,
|
123 |
} ),
|
124 |
-
[
|
125 |
);
|
126 |
|
127 |
/**
|
@@ -206,31 +208,17 @@ export const AddToCartFormStateContextProvider = ( {
|
|
206 |
*/
|
207 |
useEffect( () => {
|
208 |
if ( addToCartFormState.status === STATUS.AFTER_PROCESSING ) {
|
209 |
-
// @todo: This data package differs from what is passed through in
|
210 |
-
// the checkout state context. Should we introduce a "context"
|
211 |
-
// property in the data package for this emitted event so that
|
212 |
-
// observers are able to know what context the event is firing in?
|
213 |
const data = {
|
214 |
processingResponse: addToCartFormState.processingResponse,
|
215 |
};
|
216 |
|
217 |
-
const handleErrorResponse = (
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
message
|
225 |
-
) {
|
226 |
-
const errorOptions = messageContext
|
227 |
-
? { context: messageContext }
|
228 |
-
: undefined;
|
229 |
-
handled = true;
|
230 |
-
addErrorNotice( message, errorOptions );
|
231 |
-
}
|
232 |
-
} );
|
233 |
-
return handled;
|
234 |
};
|
235 |
|
236 |
if ( addToCartFormState.hasError ) {
|
@@ -239,8 +227,13 @@ export const AddToCartFormStateContextProvider = ( {
|
|
239 |
currentObservers,
|
240 |
EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_ERROR,
|
241 |
data
|
242 |
-
).then( (
|
243 |
-
if (
|
|
|
|
|
|
|
|
|
|
|
244 |
// no error handling in place by anything so let's fall back to default
|
245 |
const message =
|
246 |
data.processingResponse?.message ||
|
@@ -261,8 +254,12 @@ export const AddToCartFormStateContextProvider = ( {
|
|
261 |
currentObservers,
|
262 |
EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
|
263 |
data
|
264 |
-
).then( (
|
265 |
-
if (
|
|
|
|
|
|
|
|
|
266 |
// this will set an error which will end up
|
267 |
// triggering the onAddToCartAfterProcessingWithError emitter.
|
268 |
// and then setting to IDLE state.
|
9 |
useEffect,
|
10 |
} from '@wordpress/element';
|
11 |
import { __ } from '@wordpress/i18n';
|
12 |
+
import {
|
13 |
+
useStoreNotices,
|
14 |
+
useEmitResponse,
|
15 |
+
useShallowEqual,
|
16 |
+
} from '@woocommerce/base-hooks';
|
17 |
import {
|
18 |
productIsPurchasable,
|
19 |
productSupportsAddToCartForm,
|
27 |
import { DEFAULT_STATE, STATUS } from './constants';
|
28 |
import {
|
29 |
EMIT_TYPES,
|
30 |
+
emitterSubscribers,
|
31 |
emitEvent,
|
32 |
emitEventWithAbort,
|
33 |
reducer as emitReducer,
|
34 |
} from './event-emit';
|
35 |
+
import { useValidationContext } from '../../shared/validation';
|
|
|
|
|
36 |
|
37 |
/**
|
38 |
* @typedef {import('@woocommerce/type-defs/add-to-cart-form').AddToCartFormDispatchActions} AddToCartFormDispatchActions
|
99 |
reducer,
|
100 |
DEFAULT_STATE
|
101 |
);
|
102 |
+
const [ observers, subscriber ] = useReducer( emitReducer, {} );
|
103 |
const currentObservers = useShallowEqual( observers );
|
104 |
const { addErrorNotice, removeNotices } = useStoreNotices();
|
105 |
const { setValidationErrors } = useValidationContext();
|
114 |
*/
|
115 |
const eventRegistration = useMemo(
|
116 |
() => ( {
|
117 |
+
onAddToCartAfterProcessingWithSuccess: emitterSubscribers(
|
118 |
+
subscriber
|
119 |
).onAddToCartAfterProcessingWithSuccess,
|
120 |
+
onAddToCartAfterProcessingWithError: emitterSubscribers(
|
121 |
+
subscriber
|
122 |
).onAddToCartAfterProcessingWithError,
|
123 |
+
onAddToCartBeforeProcessing: emitterSubscribers( subscriber )
|
124 |
.onAddToCartBeforeProcessing,
|
125 |
} ),
|
126 |
+
[ subscriber ]
|
127 |
);
|
128 |
|
129 |
/**
|
208 |
*/
|
209 |
useEffect( () => {
|
210 |
if ( addToCartFormState.status === STATUS.AFTER_PROCESSING ) {
|
|
|
|
|
|
|
|
|
211 |
const data = {
|
212 |
processingResponse: addToCartFormState.processingResponse,
|
213 |
};
|
214 |
|
215 |
+
const handleErrorResponse = ( response ) => {
|
216 |
+
if ( response.message ) {
|
217 |
+
const errorOptions = response.messageContext
|
218 |
+
? { context: response.messageContext }
|
219 |
+
: undefined;
|
220 |
+
addErrorNotice( response.message, errorOptions );
|
221 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
222 |
};
|
223 |
|
224 |
if ( addToCartFormState.hasError ) {
|
227 |
currentObservers,
|
228 |
EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_ERROR,
|
229 |
data
|
230 |
+
).then( ( response ) => {
|
231 |
+
if (
|
232 |
+
isErrorResponse( response ) ||
|
233 |
+
isFailResponse( response )
|
234 |
+
) {
|
235 |
+
handleErrorResponse( response );
|
236 |
+
} else {
|
237 |
// no error handling in place by anything so let's fall back to default
|
238 |
const message =
|
239 |
data.processingResponse?.message ||
|
254 |
currentObservers,
|
255 |
EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
|
256 |
data
|
257 |
+
).then( ( response ) => {
|
258 |
+
if (
|
259 |
+
isErrorResponse( response ) ||
|
260 |
+
isFailResponse( response )
|
261 |
+
) {
|
262 |
+
handleErrorResponse( response );
|
263 |
// this will set an error which will end up
|
264 |
// triggering the onAddToCartAfterProcessingWithError emitter.
|
265 |
// and then setting to IDLE state.
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/reducer.js
RENAMED
File without changes
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/index.js
RENAMED
@@ -2,7 +2,7 @@
|
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
import { AddToCartFormStateContextProvider } from '../form-state';
|
5 |
-
import { ValidationContextProvider } from '../../
|
6 |
import FormSubmit from './submit';
|
7 |
|
8 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
import { AddToCartFormStateContextProvider } from '../form-state';
|
5 |
+
import { ValidationContextProvider } from '../../shared';
|
6 |
import FormSubmit from './submit';
|
7 |
|
8 |
/**
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/submit/index.js
RENAMED
@@ -4,15 +4,15 @@
|
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import triggerFetch from '@wordpress/api-fetch';
|
6 |
import { useEffect, useCallback, useState } from '@wordpress/element';
|
|
|
7 |
import { decodeEntities } from '@wordpress/html-entities';
|
|
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
11 |
*/
|
12 |
import { useAddToCartFormContext } from '../../form-state';
|
13 |
-
import { useValidationContext } from '../../../
|
14 |
-
import { useStoreCart } from '../../../../hooks/cart/use-store-cart';
|
15 |
-
import { useStoreNotices } from '../../../../hooks/use-store-notices';
|
16 |
|
17 |
/**
|
18 |
* FormSubmit.
|
@@ -109,6 +109,7 @@ const FormSubmit = () => {
|
|
109 |
}
|
110 |
dispatchActions.setAfterProcessing( response );
|
111 |
setIsSubmitting( false );
|
|
|
112 |
} );
|
113 |
} )
|
114 |
.catch( ( error ) => {
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import triggerFetch from '@wordpress/api-fetch';
|
6 |
import { useEffect, useCallback, useState } from '@wordpress/element';
|
7 |
+
import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
|
8 |
import { decodeEntities } from '@wordpress/html-entities';
|
9 |
+
import { triggerFragmentRefresh } from '@woocommerce/base-utils';
|
10 |
|
11 |
/**
|
12 |
* Internal dependencies
|
13 |
*/
|
14 |
import { useAddToCartFormContext } from '../../form-state';
|
15 |
+
import { useValidationContext } from '../../../shared';
|
|
|
|
|
16 |
|
17 |
/**
|
18 |
* FormSubmit.
|
109 |
}
|
110 |
dispatchActions.setAfterProcessing( response );
|
111 |
setIsSubmitting( false );
|
112 |
+
triggerFragmentRefresh();
|
113 |
} );
|
114 |
} )
|
115 |
.catch( ( error ) => {
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/index.js
RENAMED
File without changes
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js
RENAMED
File without changes
|
assets/js/base/context/cart-checkout/checkout-state/actions.js
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import { TYPES } from './constants';
|
5 |
+
|
6 |
+
const {
|
7 |
+
SET_PRISTINE,
|
8 |
+
SET_IDLE,
|
9 |
+
SET_PROCESSING,
|
10 |
+
SET_BEFORE_PROCESSING,
|
11 |
+
SET_AFTER_PROCESSING,
|
12 |
+
SET_PROCESSING_RESPONSE,
|
13 |
+
SET_REDIRECT_URL,
|
14 |
+
SET_COMPLETE,
|
15 |
+
SET_HAS_ERROR,
|
16 |
+
SET_NO_ERROR,
|
17 |
+
INCREMENT_CALCULATING,
|
18 |
+
DECREMENT_CALCULATING,
|
19 |
+
SET_CUSTOMER_ID,
|
20 |
+
SET_ORDER_ID,
|
21 |
+
SET_SHOULD_CREATE_ACCOUNT,
|
22 |
+
SET_ORDER_NOTES,
|
23 |
+
} = TYPES;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* All the actions that can be dispatched for the checkout.
|
27 |
+
*/
|
28 |
+
export const actions = {
|
29 |
+
setPristine: () => ( {
|
30 |
+
type: SET_PRISTINE,
|
31 |
+
} ),
|
32 |
+
setIdle: () => ( {
|
33 |
+
type: SET_IDLE,
|
34 |
+
} ),
|
35 |
+
setProcessing: () => ( {
|
36 |
+
type: SET_PROCESSING,
|
37 |
+
} ),
|
38 |
+
setRedirectUrl: ( url ) => ( {
|
39 |
+
type: SET_REDIRECT_URL,
|
40 |
+
url,
|
41 |
+
} ),
|
42 |
+
setProcessingResponse: ( data ) => ( {
|
43 |
+
type: SET_PROCESSING_RESPONSE,
|
44 |
+
data,
|
45 |
+
} ),
|
46 |
+
setComplete: ( data ) => ( {
|
47 |
+
type: SET_COMPLETE,
|
48 |
+
data,
|
49 |
+
} ),
|
50 |
+
setBeforeProcessing: () => ( {
|
51 |
+
type: SET_BEFORE_PROCESSING,
|
52 |
+
} ),
|
53 |
+
setAfterProcessing: () => ( {
|
54 |
+
type: SET_AFTER_PROCESSING,
|
55 |
+
} ),
|
56 |
+
setHasError: ( hasError = true ) => {
|
57 |
+
const type = hasError ? SET_HAS_ERROR : SET_NO_ERROR;
|
58 |
+
return { type };
|
59 |
+
},
|
60 |
+
incrementCalculating: () => ( {
|
61 |
+
type: INCREMENT_CALCULATING,
|
62 |
+
} ),
|
63 |
+
decrementCalculating: () => ( {
|
64 |
+
type: DECREMENT_CALCULATING,
|
65 |
+
} ),
|
66 |
+
setCustomerId: ( customerId ) => ( {
|
67 |
+
type: SET_CUSTOMER_ID,
|
68 |
+
customerId,
|
69 |
+
} ),
|
70 |
+
setOrderId: ( orderId ) => ( {
|
71 |
+
type: SET_ORDER_ID,
|
72 |
+
orderId,
|
73 |
+
} ),
|
74 |
+
setShouldCreateAccount: ( shouldCreateAccount ) => ( {
|
75 |
+
type: SET_SHOULD_CREATE_ACCOUNT,
|
76 |
+
shouldCreateAccount,
|
77 |
+
} ),
|
78 |
+
setOrderNotes: ( orderNotes ) => ( {
|
79 |
+
type: SET_ORDER_NOTES,
|
80 |
+
orderNotes,
|
81 |
+
} ),
|
82 |
+
};
|
assets/js/base/context/cart-checkout/checkout-state/constants.js
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { getSetting } from '@woocommerce/settings';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* @type {import("@woocommerce/type-defs/checkout").CheckoutStatusConstants}
|
8 |
+
*/
|
9 |
+
export const STATUS = {
|
10 |
+
PRISTINE: 'pristine',
|
11 |
+
IDLE: 'idle',
|
12 |
+
PROCESSING: 'processing',
|
13 |
+
COMPLETE: 'complete',
|
14 |
+
BEFORE_PROCESSING: 'before_processing',
|
15 |
+
AFTER_PROCESSING: 'after_processing',
|
16 |
+
};
|
17 |
+
|
18 |
+
const checkoutData = getSetting( 'checkoutData', {
|
19 |
+
order_id: 0,
|
20 |
+
customer_id: 0,
|
21 |
+
} );
|
22 |
+
|
23 |
+
export const DEFAULT_STATE = {
|
24 |
+
redirectUrl: '',
|
25 |
+
status: STATUS.PRISTINE,
|
26 |
+
hasError: false,
|
27 |
+
calculatingCount: 0,
|
28 |
+
orderId: checkoutData.order_id,
|
29 |
+
orderNotes: '',
|
30 |
+
customerId: checkoutData.customer_id,
|
31 |
+
shouldCreateAccount: false,
|
32 |
+
processingResponse: null,
|
33 |
+
};
|
34 |
+
|
35 |
+
export const TYPES = {
|
36 |
+
SET_IDLE: 'set_idle',
|
37 |
+
SET_PRISTINE: 'set_pristine',
|
38 |
+
SET_REDIRECT_URL: 'set_redirect_url',
|
39 |
+
SET_COMPLETE: 'set_checkout_complete',
|
40 |
+
SET_BEFORE_PROCESSING: 'set_before_processing',
|
41 |
+
SET_AFTER_PROCESSING: 'set_after_processing',
|
42 |
+
SET_PROCESSING_RESPONSE: 'set_processing_response',
|
43 |
+
SET_PROCESSING: 'set_checkout_is_processing',
|
44 |
+
SET_HAS_ERROR: 'set_checkout_has_error',
|
45 |
+
SET_NO_ERROR: 'set_checkout_no_error',
|
46 |
+
SET_CUSTOMER_ID: 'set_checkout_customer_id',
|
47 |
+
SET_ORDER_ID: 'set_checkout_order_id',
|
48 |
+
SET_ORDER_NOTES: 'set_checkout_order_notes',
|
49 |
+
INCREMENT_CALCULATING: 'increment_calculating',
|
50 |
+
DECREMENT_CALCULATING: 'decrement_calculating',
|
51 |
+
};
|
assets/js/base/context/cart-checkout/checkout-state/event-emit.js
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import {
|
5 |
+
emitterCallback,
|
6 |
+
reducer,
|
7 |
+
emitEvent,
|
8 |
+
emitEventWithAbort,
|
9 |
+
} from '../../shared/event-emit';
|
10 |
+
|
11 |
+
const EMIT_TYPES = {
|
12 |
+
CHECKOUT_BEFORE_PROCESSING: 'checkout_before_processing',
|
13 |
+
CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS:
|
14 |
+
'checkout_after_processing_with_success',
|
15 |
+
CHECKOUT_AFTER_PROCESSING_WITH_ERROR:
|
16 |
+
'checkout_after_processing_with_error',
|
17 |
+
};
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Receives a reducer dispatcher and returns an object with the
|
21 |
+
* callback registration function for the checkout emit
|
22 |
+
* events.
|
23 |
+
*
|
24 |
+
* Calling the event registration function with the callback will register it
|
25 |
+
* for the event emitter and will return a dispatcher for removing the
|
26 |
+
* registered callback (useful for implementation in `useEffect`).
|
27 |
+
*
|
28 |
+
* @param {Function} dispatcher The emitter reducer dispatcher.
|
29 |
+
*
|
30 |
+
* @return {Object} An object with the checkout emmitter registration
|
31 |
+
*/
|
32 |
+
const emitterSubscribers = ( dispatcher ) => ( {
|
33 |
+
onCheckoutAfterProcessingWithSuccess: emitterCallback(
|
34 |
+
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
|
35 |
+
dispatcher
|
36 |
+
),
|
37 |
+
onCheckoutAfterProcessingWithError: emitterCallback(
|
38 |
+
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
|
39 |
+
dispatcher
|
40 |
+
),
|
41 |
+
onCheckoutBeforeProcessing: emitterCallback(
|
42 |
+
EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
|
43 |
+
dispatcher
|
44 |
+
),
|
45 |
+
} );
|
46 |
+
|
47 |
+
export {
|
48 |
+
EMIT_TYPES,
|
49 |
+
emitterSubscribers,
|
50 |
+
reducer,
|
51 |
+
emitEvent,
|
52 |
+
emitEventWithAbort,
|
53 |
+
};
|
assets/js/base/context/{providers/cart-checkout/checkout-state/index.tsx → cart-checkout/checkout-state/index.js}
RENAMED
@@ -11,45 +11,70 @@ import {
|
|
11 |
useCallback,
|
12 |
} from '@wordpress/element';
|
13 |
import { __ } from '@wordpress/i18n';
|
14 |
-
import {
|
15 |
-
|
16 |
-
|
|
|
|
|
|
|
17 |
|
18 |
/**
|
19 |
* Internal dependencies
|
20 |
*/
|
21 |
import { actions } from './actions';
|
22 |
-
import { reducer } from './reducer';
|
23 |
-
import {
|
24 |
-
import {
|
25 |
-
DEFAULT_STATE,
|
26 |
-
STATUS,
|
27 |
-
DEFAULT_CHECKOUT_STATE_DATA,
|
28 |
-
} from './constants';
|
29 |
-
import type {
|
30 |
-
CheckoutStateDispatchActions,
|
31 |
-
CheckoutStateContextType,
|
32 |
-
} from './types';
|
33 |
import {
|
34 |
EMIT_TYPES,
|
35 |
-
|
36 |
emitEvent,
|
37 |
emitEventWithAbort,
|
38 |
reducer as emitReducer,
|
39 |
} from './event-emit';
|
40 |
-
import { useValidationContext } from '../../validation';
|
41 |
-
import { useStoreNotices } from '../../../hooks/use-store-notices';
|
42 |
-
import { useStoreEvents } from '../../../hooks/use-store-events';
|
43 |
-
import { useCheckoutNotices } from '../../../hooks/use-checkout-notices';
|
44 |
-
import { useEmitResponse } from '../../../hooks/use-emit-response';
|
45 |
|
46 |
/**
|
|
|
47 |
* @typedef {import('@woocommerce/type-defs/contexts').CheckoutDataContext} CheckoutDataContext
|
48 |
*/
|
49 |
|
50 |
-
const CheckoutContext = createContext(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
|
52 |
-
|
|
|
|
|
|
|
53 |
return useContext( CheckoutContext );
|
54 |
};
|
55 |
|
@@ -67,18 +92,15 @@ export const CheckoutStateProvider = ( {
|
|
67 |
children,
|
68 |
redirectUrl,
|
69 |
isCart = false,
|
70 |
-
}
|
71 |
-
children: React.ReactChildren;
|
72 |
-
redirectUrl: string;
|
73 |
-
isCart: boolean;
|
74 |
-
} ): JSX.Element => {
|
75 |
// note, this is done intentionally so that the default state now has
|
76 |
// the redirectUrl for when checkout is reset to PRISTINE state.
|
77 |
DEFAULT_STATE.redirectUrl = redirectUrl;
|
78 |
const [ checkoutState, dispatch ] = useReducer( reducer, DEFAULT_STATE );
|
|
|
|
|
79 |
const { setValidationErrors } = useValidationContext();
|
80 |
const { addErrorNotice, removeNotices } = useStoreNotices();
|
81 |
-
const { dispatchCheckoutEvent } = useStoreEvents();
|
82 |
const isCalculating = checkoutState.calculatingCount > 0;
|
83 |
const {
|
84 |
isSuccessResponse,
|
@@ -92,42 +114,31 @@ export const CheckoutStateProvider = ( {
|
|
92 |
expressPaymentNotices,
|
93 |
} = useCheckoutNotices();
|
94 |
|
95 |
-
const [ observers, observerDispatch ] = useReducer( emitReducer, {} );
|
96 |
-
const currentObservers = useRef( observers );
|
97 |
-
const {
|
98 |
-
onCheckoutAfterProcessingWithSuccess,
|
99 |
-
onCheckoutAfterProcessingWithError,
|
100 |
-
onCheckoutValidationBeforeProcessing,
|
101 |
-
} = useEventEmitters( observerDispatch );
|
102 |
-
|
103 |
// set observers on ref so it's always current.
|
104 |
useEffect( () => {
|
105 |
currentObservers.current = observers;
|
106 |
}, [ observers ] );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
|
108 |
/**
|
109 |
-
* @
|
110 |
-
*
|
111 |
-
* To prevent the deprecation message being shown at render time
|
112 |
-
* we need an extra function between useMemo and event emitters
|
113 |
-
* so that the deprecated message gets shown only at invocation time.
|
114 |
-
* (useMemo calls the passed function at render time)
|
115 |
-
* See: https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/4039/commits/a502d1be8828848270993264c64220731b0ae181
|
116 |
*/
|
117 |
-
const onCheckoutBeforeProcessing = useMemo( () => {
|
118 |
-
return function (
|
119 |
-
...args: Parameters< typeof onCheckoutValidationBeforeProcessing >
|
120 |
-
) {
|
121 |
-
deprecated( 'onCheckoutBeforeProcessing', {
|
122 |
-
alternative: 'onCheckoutValidationBeforeProcessing',
|
123 |
-
plugin: 'WooCommerce Blocks',
|
124 |
-
} );
|
125 |
-
return onCheckoutValidationBeforeProcessing( ...args );
|
126 |
-
};
|
127 |
-
}, [ onCheckoutValidationBeforeProcessing ] );
|
128 |
-
|
129 |
const dispatchActions = useMemo(
|
130 |
-
()
|
131 |
resetCheckout: () => void dispatch( actions.setPristine() ),
|
132 |
setRedirectUrl: ( url ) =>
|
133 |
void dispatch( actions.setRedirectUrl( url ) ),
|
@@ -144,17 +155,35 @@ export const CheckoutStateProvider = ( {
|
|
144 |
setOrderNotes: ( orderNotes ) =>
|
145 |
void dispatch( actions.setOrderNotes( orderNotes ) ),
|
146 |
setAfterProcessing: ( response ) => {
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
dispatch(
|
153 |
-
actions.
|
|
|
|
|
154 |
);
|
155 |
}
|
156 |
-
dispatch( actions.
|
157 |
-
dispatch( actions.setAfterProcessing() );
|
158 |
},
|
159 |
} ),
|
160 |
[]
|
@@ -167,7 +196,7 @@ export const CheckoutStateProvider = ( {
|
|
167 |
removeNotices( 'error' );
|
168 |
emitEvent(
|
169 |
currentObservers.current,
|
170 |
-
EMIT_TYPES.
|
171 |
{}
|
172 |
).then( ( response ) => {
|
173 |
if ( response !== true ) {
|
@@ -203,32 +232,12 @@ export const CheckoutStateProvider = ( {
|
|
203 |
) {
|
204 |
return;
|
205 |
}
|
206 |
-
|
207 |
-
const handleErrorResponse = ( observerResponses: unknown[] ) => {
|
208 |
-
let errorResponse = null;
|
209 |
-
observerResponses.forEach( ( response ) => {
|
210 |
-
if (
|
211 |
-
isErrorResponse( response ) ||
|
212 |
-
isFailResponse( response )
|
213 |
-
) {
|
214 |
-
if ( response.message ) {
|
215 |
-
const errorOptions = response.messageContext
|
216 |
-
? { context: response.messageContext }
|
217 |
-
: undefined;
|
218 |
-
errorResponse = response;
|
219 |
-
addErrorNotice( response.message, errorOptions );
|
220 |
-
}
|
221 |
-
}
|
222 |
-
} );
|
223 |
-
return errorResponse;
|
224 |
-
};
|
225 |
-
|
226 |
if ( checkoutState.status === STATUS.AFTER_PROCESSING ) {
|
227 |
const data = {
|
228 |
redirectUrl: checkoutState.redirectUrl,
|
229 |
orderId: checkoutState.orderId,
|
230 |
customerId: checkoutState.customerId,
|
231 |
-
|
232 |
processingResponse: checkoutState.processingResponse,
|
233 |
};
|
234 |
if ( checkoutState.hasError ) {
|
@@ -238,30 +247,34 @@ export const CheckoutStateProvider = ( {
|
|
238 |
currentObservers.current,
|
239 |
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
|
240 |
data
|
241 |
-
).then( (
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
246 |
// irrecoverable error so set complete
|
247 |
-
if ( ! shouldRetry(
|
248 |
-
dispatch( actions.setComplete(
|
249 |
} else {
|
250 |
dispatch( actions.setIdle() );
|
251 |
}
|
252 |
} else {
|
253 |
const hasErrorNotices =
|
254 |
checkoutNotices.some(
|
255 |
-
( notice
|
256 |
-
notice.status === 'error'
|
257 |
) ||
|
258 |
expressPaymentNotices.some(
|
259 |
-
( notice
|
260 |
-
notice.status === 'error'
|
261 |
) ||
|
262 |
paymentNotices.some(
|
263 |
-
( notice
|
264 |
-
notice.status === 'error'
|
265 |
);
|
266 |
if ( ! hasErrorNotices ) {
|
267 |
// no error handling in place by anything so let's fall
|
@@ -285,43 +298,21 @@ export const CheckoutStateProvider = ( {
|
|
285 |
currentObservers.current,
|
286 |
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
|
287 |
data
|
288 |
-
).then( (
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
observerResponses.forEach( ( response ) => {
|
299 |
-
if ( isSuccessResponse( response ) ) {
|
300 |
-
// the last observer response always "wins" for success.
|
301 |
-
successResponse = response;
|
302 |
-
}
|
303 |
-
if (
|
304 |
-
isErrorResponse( response ) ||
|
305 |
-
isFailResponse( response )
|
306 |
-
) {
|
307 |
-
errorResponse = response;
|
308 |
-
}
|
309 |
-
} );
|
310 |
-
|
311 |
-
if ( successResponse && ! errorResponse ) {
|
312 |
-
dispatch( actions.setComplete( successResponse ) );
|
313 |
-
} else if ( isObject( errorResponse ) ) {
|
314 |
-
if ( errorResponse.message ) {
|
315 |
-
const errorOptions = errorResponse.messageContext
|
316 |
-
? { context: errorResponse.messageContext }
|
317 |
: undefined;
|
318 |
-
addErrorNotice(
|
319 |
-
errorResponse.message,
|
320 |
-
errorOptions
|
321 |
-
);
|
322 |
}
|
323 |
-
if ( ! shouldRetry(
|
324 |
-
dispatch( actions.setComplete(
|
325 |
} else {
|
326 |
// this will set an error which will end up
|
327 |
// triggering the onCheckoutAfterProcessingWithError emitter.
|
@@ -342,7 +333,7 @@ export const CheckoutStateProvider = ( {
|
|
342 |
checkoutState.redirectUrl,
|
343 |
checkoutState.orderId,
|
344 |
checkoutState.customerId,
|
345 |
-
checkoutState.
|
346 |
checkoutState.processingResponse,
|
347 |
previousStatus,
|
348 |
previousHasError,
|
@@ -358,11 +349,13 @@ export const CheckoutStateProvider = ( {
|
|
358 |
] );
|
359 |
|
360 |
const onSubmit = useCallback( () => {
|
361 |
-
dispatchCheckoutEvent( 'submit' );
|
362 |
dispatch( actions.setBeforeProcessing() );
|
363 |
-
}, [
|
364 |
|
365 |
-
|
|
|
|
|
|
|
366 |
onSubmit,
|
367 |
isComplete: checkoutState.status === STATUS.COMPLETE,
|
368 |
isIdle: checkoutState.status === STATUS.IDLE,
|
@@ -372,10 +365,9 @@ export const CheckoutStateProvider = ( {
|
|
372 |
isAfterProcessing: checkoutState.status === STATUS.AFTER_PROCESSING,
|
373 |
hasError: checkoutState.hasError,
|
374 |
redirectUrl: checkoutState.redirectUrl,
|
375 |
-
onCheckoutBeforeProcessing,
|
376 |
-
onCheckoutValidationBeforeProcessing,
|
377 |
onCheckoutAfterProcessingWithSuccess,
|
378 |
onCheckoutAfterProcessingWithError,
|
|
|
379 |
dispatchActions,
|
380 |
isCart,
|
381 |
orderId: checkoutState.orderId,
|
11 |
useCallback,
|
12 |
} from '@wordpress/element';
|
13 |
import { __ } from '@wordpress/i18n';
|
14 |
+
import {
|
15 |
+
useCheckoutNotices,
|
16 |
+
useStoreNotices,
|
17 |
+
useEmitResponse,
|
18 |
+
usePrevious,
|
19 |
+
} from '@woocommerce/base-hooks';
|
20 |
|
21 |
/**
|
22 |
* Internal dependencies
|
23 |
*/
|
24 |
import { actions } from './actions';
|
25 |
+
import { reducer, prepareResponseData } from './reducer';
|
26 |
+
import { DEFAULT_STATE, STATUS } from './constants';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
import {
|
28 |
EMIT_TYPES,
|
29 |
+
emitterSubscribers,
|
30 |
emitEvent,
|
31 |
emitEventWithAbort,
|
32 |
reducer as emitReducer,
|
33 |
} from './event-emit';
|
34 |
+
import { useValidationContext } from '../../shared/validation';
|
|
|
|
|
|
|
|
|
35 |
|
36 |
/**
|
37 |
+
* @typedef {import('@woocommerce/type-defs/checkout').CheckoutDispatchActions} CheckoutDispatchActions
|
38 |
* @typedef {import('@woocommerce/type-defs/contexts').CheckoutDataContext} CheckoutDataContext
|
39 |
*/
|
40 |
|
41 |
+
const CheckoutContext = createContext( {
|
42 |
+
isComplete: false,
|
43 |
+
isIdle: false,
|
44 |
+
isCalculating: false,
|
45 |
+
isProcessing: false,
|
46 |
+
isBeforeProcessing: false,
|
47 |
+
isAfterProcessing: false,
|
48 |
+
hasError: false,
|
49 |
+
redirectUrl: '',
|
50 |
+
orderId: 0,
|
51 |
+
orderNotes: '',
|
52 |
+
customerId: 0,
|
53 |
+
onSubmit: () => void null,
|
54 |
+
onCheckoutAfterProcessingWithSuccess: ( callback ) => void callback,
|
55 |
+
onCheckoutAfterProcessingWithError: ( callback ) => void callback,
|
56 |
+
onCheckoutBeforeProcessing: ( callback ) => void callback,
|
57 |
+
dispatchActions: {
|
58 |
+
resetCheckout: () => void null,
|
59 |
+
setRedirectUrl: ( url ) => void url,
|
60 |
+
setHasError: ( hasError ) => void hasError,
|
61 |
+
setAfterProcessing: ( response ) => void response,
|
62 |
+
incrementCalculating: () => void null,
|
63 |
+
decrementCalculating: () => void null,
|
64 |
+
setCustomerId: ( id ) => void id,
|
65 |
+
setOrderId: ( id ) => void id,
|
66 |
+
setOrderNotes: ( orderNotes ) => void orderNotes,
|
67 |
+
},
|
68 |
+
hasOrder: false,
|
69 |
+
isCart: false,
|
70 |
+
shouldCreateAccount: false,
|
71 |
+
setShouldCreateAccount: ( value ) => void value,
|
72 |
+
} );
|
73 |
|
74 |
+
/**
|
75 |
+
* @return {CheckoutDataContext} Returns the checkout data context value
|
76 |
+
*/
|
77 |
+
export const useCheckoutContext = () => {
|
78 |
return useContext( CheckoutContext );
|
79 |
};
|
80 |
|
92 |
children,
|
93 |
redirectUrl,
|
94 |
isCart = false,
|
95 |
+
} ) => {
|
|
|
|
|
|
|
|
|
96 |
// note, this is done intentionally so that the default state now has
|
97 |
// the redirectUrl for when checkout is reset to PRISTINE state.
|
98 |
DEFAULT_STATE.redirectUrl = redirectUrl;
|
99 |
const [ checkoutState, dispatch ] = useReducer( reducer, DEFAULT_STATE );
|
100 |
+
const [ observers, subscriber ] = useReducer( emitReducer, {} );
|
101 |
+
const currentObservers = useRef( observers );
|
102 |
const { setValidationErrors } = useValidationContext();
|
103 |
const { addErrorNotice, removeNotices } = useStoreNotices();
|
|
|
104 |
const isCalculating = checkoutState.calculatingCount > 0;
|
105 |
const {
|
106 |
isSuccessResponse,
|
114 |
expressPaymentNotices,
|
115 |
} = useCheckoutNotices();
|
116 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
// set observers on ref so it's always current.
|
118 |
useEffect( () => {
|
119 |
currentObservers.current = observers;
|
120 |
}, [ observers ] );
|
121 |
+
const onCheckoutAfterProcessingWithSuccess = useMemo(
|
122 |
+
() =>
|
123 |
+
emitterSubscribers( subscriber )
|
124 |
+
.onCheckoutAfterProcessingWithSuccess,
|
125 |
+
[ subscriber ]
|
126 |
+
);
|
127 |
+
const onCheckoutAfterProcessingWithError = useMemo(
|
128 |
+
() =>
|
129 |
+
emitterSubscribers( subscriber ).onCheckoutAfterProcessingWithError,
|
130 |
+
[ subscriber ]
|
131 |
+
);
|
132 |
+
const onCheckoutBeforeProcessing = useMemo(
|
133 |
+
() => emitterSubscribers( subscriber ).onCheckoutBeforeProcessing,
|
134 |
+
[ subscriber ]
|
135 |
+
);
|
136 |
|
137 |
/**
|
138 |
+
* @type {CheckoutDispatchActions}
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
const dispatchActions = useMemo(
|
141 |
+
() => ( {
|
142 |
resetCheckout: () => void dispatch( actions.setPristine() ),
|
143 |
setRedirectUrl: ( url ) =>
|
144 |
void dispatch( actions.setRedirectUrl( url ) ),
|
155 |
setOrderNotes: ( orderNotes ) =>
|
156 |
void dispatch( actions.setOrderNotes( orderNotes ) ),
|
157 |
setAfterProcessing: ( response ) => {
|
158 |
+
// capture general error message if this is an error response.
|
159 |
+
if (
|
160 |
+
! response.payment_result &&
|
161 |
+
response.message &&
|
162 |
+
response?.data?.status !== 200
|
163 |
+
) {
|
164 |
+
response.payment_result = {
|
165 |
+
...response.payment_result,
|
166 |
+
message: response.message,
|
167 |
+
};
|
168 |
+
}
|
169 |
+
if ( response.payment_result ) {
|
170 |
+
if (
|
171 |
+
// eslint-disable-next-line camelcase
|
172 |
+
response.payment_result?.redirect_url
|
173 |
+
) {
|
174 |
+
dispatch(
|
175 |
+
actions.setRedirectUrl(
|
176 |
+
response.payment_result.redirect_url
|
177 |
+
)
|
178 |
+
);
|
179 |
+
}
|
180 |
dispatch(
|
181 |
+
actions.setProcessingResponse(
|
182 |
+
prepareResponseData( response.payment_result )
|
183 |
+
)
|
184 |
);
|
185 |
}
|
186 |
+
void dispatch( actions.setAfterProcessing() );
|
|
|
187 |
},
|
188 |
} ),
|
189 |
[]
|
196 |
removeNotices( 'error' );
|
197 |
emitEvent(
|
198 |
currentObservers.current,
|
199 |
+
EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
|
200 |
{}
|
201 |
).then( ( response ) => {
|
202 |
if ( response !== true ) {
|
232 |
) {
|
233 |
return;
|
234 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
235 |
if ( checkoutState.status === STATUS.AFTER_PROCESSING ) {
|
236 |
const data = {
|
237 |
redirectUrl: checkoutState.redirectUrl,
|
238 |
orderId: checkoutState.orderId,
|
239 |
customerId: checkoutState.customerId,
|
240 |
+
customerNote: checkoutState.customerNote,
|
241 |
processingResponse: checkoutState.processingResponse,
|
242 |
};
|
243 |
if ( checkoutState.hasError ) {
|
247 |
currentObservers.current,
|
248 |
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
|
249 |
data
|
250 |
+
).then( ( response ) => {
|
251 |
+
if (
|
252 |
+
isErrorResponse( response ) ||
|
253 |
+
isFailResponse( response )
|
254 |
+
) {
|
255 |
+
if ( response.message ) {
|
256 |
+
const errorOptions = {
|
257 |
+
id: response?.messageContext,
|
258 |
+
context: response?.messageContext,
|
259 |
+
};
|
260 |
+
addErrorNotice( response.message, errorOptions );
|
261 |
+
}
|
262 |
// irrecoverable error so set complete
|
263 |
+
if ( ! shouldRetry( response ) ) {
|
264 |
+
dispatch( actions.setComplete( response ) );
|
265 |
} else {
|
266 |
dispatch( actions.setIdle() );
|
267 |
}
|
268 |
} else {
|
269 |
const hasErrorNotices =
|
270 |
checkoutNotices.some(
|
271 |
+
( notice ) => notice.status === 'error'
|
|
|
272 |
) ||
|
273 |
expressPaymentNotices.some(
|
274 |
+
( notice ) => notice.status === 'error'
|
|
|
275 |
) ||
|
276 |
paymentNotices.some(
|
277 |
+
( notice ) => notice.status === 'error'
|
|
|
278 |
);
|
279 |
if ( ! hasErrorNotices ) {
|
280 |
// no error handling in place by anything so let's fall
|
298 |
currentObservers.current,
|
299 |
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
|
300 |
data
|
301 |
+
).then( ( response ) => {
|
302 |
+
if ( isSuccessResponse( response ) ) {
|
303 |
+
dispatch( actions.setComplete( response ) );
|
304 |
+
} else if (
|
305 |
+
isErrorResponse( response ) ||
|
306 |
+
isFailResponse( response )
|
307 |
+
) {
|
308 |
+
if ( response.message ) {
|
309 |
+
const errorOptions = response.messageContext
|
310 |
+
? { context: response.messageContext }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
311 |
: undefined;
|
312 |
+
addErrorNotice( response.message, errorOptions );
|
|
|
|
|
|
|
313 |
}
|
314 |
+
if ( ! shouldRetry( response ) ) {
|
315 |
+
dispatch( actions.setComplete( response ) );
|
316 |
} else {
|
317 |
// this will set an error which will end up
|
318 |
// triggering the onCheckoutAfterProcessingWithError emitter.
|
333 |
checkoutState.redirectUrl,
|
334 |
checkoutState.orderId,
|
335 |
checkoutState.customerId,
|
336 |
+
checkoutState.customerNote,
|
337 |
checkoutState.processingResponse,
|
338 |
previousStatus,
|
339 |
previousHasError,
|
349 |
] );
|
350 |
|
351 |
const onSubmit = useCallback( () => {
|
|
|
352 |
dispatch( actions.setBeforeProcessing() );
|
353 |
+
}, [] );
|
354 |
|
355 |
+
/**
|
356 |
+
* @type {CheckoutDataContext}
|
357 |
+
*/
|
358 |
+
const checkoutData = {
|
359 |
onSubmit,
|
360 |
isComplete: checkoutState.status === STATUS.COMPLETE,
|
361 |
isIdle: checkoutState.status === STATUS.IDLE,
|
365 |
isAfterProcessing: checkoutState.status === STATUS.AFTER_PROCESSING,
|
366 |
hasError: checkoutState.hasError,
|
367 |
redirectUrl: checkoutState.redirectUrl,
|
|
|
|
|
368 |
onCheckoutAfterProcessingWithSuccess,
|
369 |
onCheckoutAfterProcessingWithError,
|
370 |
+
onCheckoutBeforeProcessing,
|
371 |
dispatchActions,
|
372 |
isCart,
|
373 |
orderId: checkoutState.orderId,
|
assets/js/base/context/cart-checkout/checkout-state/reducer.js
ADDED
@@ -0,0 +1,235 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Internal dependencies
|
8 |
+
*/
|
9 |
+
import { TYPES, DEFAULT_STATE, STATUS } from './constants';
|
10 |
+
|
11 |
+
const {
|
12 |
+
SET_PRISTINE,
|
13 |
+
SET_IDLE,
|
14 |
+
SET_PROCESSING,
|
15 |
+
SET_BEFORE_PROCESSING,
|
16 |
+
SET_AFTER_PROCESSING,
|
17 |
+
SET_PROCESSING_RESPONSE,
|
18 |
+
SET_REDIRECT_URL,
|
19 |
+
SET_COMPLETE,
|
20 |
+
SET_HAS_ERROR,
|
21 |
+
SET_NO_ERROR,
|
22 |
+
INCREMENT_CALCULATING,
|
23 |
+
DECREMENT_CALCULATING,
|
24 |
+
SET_CUSTOMER_ID,
|
25 |
+
SET_ORDER_ID,
|
26 |
+
SET_ORDER_NOTES,
|
27 |
+
SET_SHOULD_CREATE_ACCOUNT,
|
28 |
+
} = TYPES;
|
29 |
+
|
30 |
+
const {
|
31 |
+
PRISTINE,
|
32 |
+
IDLE,
|
33 |
+
PROCESSING,
|
34 |
+
BEFORE_PROCESSING,
|
35 |
+
AFTER_PROCESSING,
|
36 |
+
COMPLETE,
|
37 |
+
} = STATUS;
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Prepares the payment_result data from the server checkout endpoint response.
|
41 |
+
*
|
42 |
+
* @param {Object} data The value of `payment_result` from the checkout
|
43 |
+
* processing endpoint response.
|
44 |
+
* @param {string} data.message If there was a general error message it will appear
|
45 |
+
* on this property.
|
46 |
+
* @param {string} data.payment_status The payment status. One of 'success', 'failure',
|
47 |
+
* 'pending', 'error'.
|
48 |
+
* @param {Array<Object>} data.payment_details An array of Objects with a 'key' property that is a
|
49 |
+
* string and value property that is a string. These are
|
50 |
+
* converted to a flat object where the key becomes the
|
51 |
+
* object property and value the property value.
|
52 |
+
*
|
53 |
+
* @return {Object} A new object with 'paymentStatus', and 'paymentDetails' as the properties.
|
54 |
+
*/
|
55 |
+
export const prepareResponseData = ( data ) => {
|
56 |
+
const responseData = {
|
57 |
+
message: data?.message || '',
|
58 |
+
paymentStatus: data.payment_status,
|
59 |
+
paymentDetails: {},
|
60 |
+
};
|
61 |
+
if ( Array.isArray( data.payment_details ) ) {
|
62 |
+
data.payment_details.forEach( ( { key, value } ) => {
|
63 |
+
responseData.paymentDetails[ key ] = decodeEntities( value );
|
64 |
+
} );
|
65 |
+
}
|
66 |
+
return responseData;
|
67 |
+
};
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Reducer for the checkout state
|
71 |
+
*
|
72 |
+
* @param {Object} state Current state.
|
73 |
+
* @param {Object} action Incoming action object.
|
74 |
+
* @param {string} action.url URL passed in.
|
75 |
+
* @param {string} action.type Type of action.
|
76 |
+
* @param {string} action.customerId Customer ID.
|
77 |
+
* @param {string} action.orderId Order ID.
|
78 |
+
* @param {Array} action.orderNotes Order notes.
|
79 |
+
* @param {boolean} action.shouldCreateAccount True if shopper has requested a user account (signup checkbox).
|
80 |
+
* @param {Object} action.data Other action payload.
|
81 |
+
*/
|
82 |
+
export const reducer = (
|
83 |
+
state = DEFAULT_STATE,
|
84 |
+
{ url, type, customerId, orderId, orderNotes, shouldCreateAccount, data }
|
85 |
+
) => {
|
86 |
+
let newState = state;
|
87 |
+
switch ( type ) {
|
88 |
+
case SET_PRISTINE:
|
89 |
+
newState = DEFAULT_STATE;
|
90 |
+
break;
|
91 |
+
case SET_IDLE:
|
92 |
+
newState =
|
93 |
+
state.status !== IDLE
|
94 |
+
? {
|
95 |
+
...state,
|
96 |
+
status: IDLE,
|
97 |
+
}
|
98 |
+
: state;
|
99 |
+
break;
|
100 |
+
case SET_REDIRECT_URL:
|
101 |
+
newState =
|
102 |
+
url !== state.url
|
103 |
+
? {
|
104 |
+
...state,
|
105 |
+
redirectUrl: url,
|
106 |
+
}
|
107 |
+
: state;
|
108 |
+
break;
|
109 |
+
case SET_PROCESSING_RESPONSE:
|
110 |
+
newState = {
|
111 |
+
...state,
|
112 |
+
processingResponse: data,
|
113 |
+
};
|
114 |
+
break;
|
115 |
+
|
116 |
+
case SET_COMPLETE:
|
117 |
+
newState =
|
118 |
+
state.status !== COMPLETE
|
119 |
+
? {
|
120 |
+
...state,
|
121 |
+
status: COMPLETE,
|
122 |
+
redirectUrl: data?.redirectUrl || state.redirectUrl,
|
123 |
+
}
|
124 |
+
: state;
|
125 |
+
break;
|
126 |
+
case SET_PROCESSING:
|
127 |
+
newState =
|
128 |
+
state.status !== PROCESSING
|
129 |
+
? {
|
130 |
+
...state,
|
131 |
+
status: PROCESSING,
|
132 |
+
hasError: false,
|
133 |
+
}
|
134 |
+
: state;
|
135 |
+
// clear any error state.
|
136 |
+
newState =
|
137 |
+
newState.hasError === false
|
138 |
+
? newState
|
139 |
+
: { ...newState, hasError: false };
|
140 |
+
break;
|
141 |
+
case SET_BEFORE_PROCESSING:
|
142 |
+
newState =
|
143 |
+
state.status !== BEFORE_PROCESSING
|
144 |
+
? {
|
145 |
+
...state,
|
146 |
+
status: BEFORE_PROCESSING,
|
147 |
+
hasError: false,
|
148 |
+
}
|
149 |
+
: state;
|
150 |
+
break;
|
151 |
+
case SET_AFTER_PROCESSING:
|
152 |
+
newState =
|
153 |
+
state.status !== AFTER_PROCESSING
|
154 |
+
? {
|
155 |
+
...state,
|
156 |
+
status: AFTER_PROCESSING,
|
157 |
+
}
|
158 |
+
: state;
|
159 |
+
break;
|
160 |
+
case SET_HAS_ERROR:
|
161 |
+
newState = state.hasError
|
162 |
+
? state
|
163 |
+
: {
|
164 |
+
...state,
|
165 |
+
hasError: true,
|
166 |
+
};
|
167 |
+
newState =
|
168 |
+
state.status === PROCESSING ||
|
169 |
+
state.status === BEFORE_PROCESSING
|
170 |
+
? {
|
171 |
+
...newState,
|
172 |
+
status: IDLE,
|
173 |
+
}
|
174 |
+
: newState;
|
175 |
+
break;
|
176 |
+
case SET_NO_ERROR:
|
177 |
+
newState = state.hasError
|
178 |
+
? {
|
179 |
+
...state,
|
180 |
+
hasError: false,
|
181 |
+
}
|
182 |
+
: state;
|
183 |
+
break;
|
184 |
+
case INCREMENT_CALCULATING:
|
185 |
+
newState = {
|
186 |
+
...state,
|
187 |
+
calculatingCount: state.calculatingCount + 1,
|
188 |
+
};
|
189 |
+
break;
|
190 |
+
case DECREMENT_CALCULATING:
|
191 |
+
newState = {
|
192 |
+
...state,
|
193 |
+
calculatingCount: Math.max( 0, state.calculatingCount - 1 ),
|
194 |
+
};
|
195 |
+
break;
|
196 |
+
case SET_CUSTOMER_ID:
|
197 |
+
newState = {
|
198 |
+
...state,
|
199 |
+
customerId,
|
200 |
+
};
|
201 |
+
break;
|
202 |
+
case SET_ORDER_ID:
|
203 |
+
newState = {
|
204 |
+
...state,
|
205 |
+
orderId,
|
206 |
+
};
|
207 |
+
break;
|
208 |
+
case SET_SHOULD_CREATE_ACCOUNT:
|
209 |
+
if ( shouldCreateAccount !== state.shouldCreateAccount ) {
|
210 |
+
newState = {
|
211 |
+
...state,
|
212 |
+
shouldCreateAccount,
|
213 |
+
};
|
214 |
+
}
|
215 |
+
break;
|
216 |
+
case SET_ORDER_NOTES:
|
217 |
+
if ( state.orderNotes !== orderNotes ) {
|
218 |
+
newState = {
|
219 |
+
...state,
|
220 |
+
orderNotes,
|
221 |
+
};
|
222 |
+
}
|
223 |
+
break;
|
224 |
+
}
|
225 |
+
// automatically update state to idle from pristine as soon as it
|
226 |
+
// initially changes.
|
227 |
+
if (
|
228 |
+
newState !== state &&
|
229 |
+
type !== SET_PRISTINE &&
|
230 |
+
newState.status === PRISTINE
|
231 |
+
) {
|
232 |
+
newState.status = IDLE;
|
233 |
+
}
|
234 |
+
return newState;
|
235 |
+
};
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/index.js
RENAMED
@@ -2,7 +2,7 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { PluginArea } from '@wordpress/plugins';
|
5 |
-
import { CURRENT_USER_IS_ADMIN } from '@woocommerce/settings';
|
6 |
import BlockErrorBoundary from '@woocommerce/base-components/block-error-boundary';
|
7 |
import { SlotFillProvider } from '@woocommerce/blocks-checkout';
|
8 |
|
@@ -47,7 +47,7 @@ export const CheckoutProvider = ( {
|
|
47 |
CURRENT_USER_IS_ADMIN ? null : () => null
|
48 |
}
|
49 |
>
|
50 |
-
<PluginArea
|
51 |
</BlockErrorBoundary>
|
52 |
</SlotFillProvider>
|
53 |
<CheckoutProcessor />
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { PluginArea } from '@wordpress/plugins';
|
5 |
+
import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
|
6 |
import BlockErrorBoundary from '@woocommerce/base-components/block-error-boundary';
|
7 |
import { SlotFillProvider } from '@woocommerce/blocks-checkout';
|
8 |
|
47 |
CURRENT_USER_IS_ADMIN ? null : () => null
|
48 |
}
|
49 |
>
|
50 |
+
<PluginArea />
|
51 |
</BlockErrorBoundary>
|
52 |
</SlotFillProvider>
|
53 |
<CheckoutProcessor />
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js
RENAMED
@@ -10,10 +10,8 @@ import {
|
|
10 |
useState,
|
11 |
useMemo,
|
12 |
} from '@wordpress/element';
|
13 |
-
import {
|
14 |
-
|
15 |
-
formatStoreApiErrorMessage,
|
16 |
-
} from '@woocommerce/base-utils';
|
17 |
|
18 |
/**
|
19 |
* Internal dependencies
|
@@ -23,9 +21,7 @@ import { useCheckoutContext } from '../../checkout-state';
|
|
23 |
import { useShippingDataContext } from '../../shipping';
|
24 |
import { useCustomerDataContext } from '../../customer';
|
25 |
import { usePaymentMethodDataContext } from '../../payment-methods';
|
26 |
-
import { useValidationContext } from '../../../
|
27 |
-
import { useStoreCart } from '../../../../hooks/cart/use-store-cart';
|
28 |
-
import { useStoreNotices } from '../../../../hooks/use-store-notices';
|
29 |
|
30 |
/**
|
31 |
* CheckoutProcessor component.
|
@@ -37,7 +33,7 @@ import { useStoreNotices } from '../../../../hooks/use-store-notices';
|
|
37 |
const CheckoutProcessor = () => {
|
38 |
const {
|
39 |
hasError: checkoutHasError,
|
40 |
-
|
41 |
dispatchActions,
|
42 |
redirectUrl,
|
43 |
isProcessing: checkoutIsProcessing,
|
@@ -52,7 +48,6 @@ const CheckoutProcessor = () => {
|
|
52 |
const { cartNeedsPayment, receiveCart } = useStoreCart();
|
53 |
const {
|
54 |
activePaymentMethod,
|
55 |
-
isExpressPaymentMethodActive,
|
56 |
currentStatus: currentPaymentStatus,
|
57 |
paymentMethodData,
|
58 |
expressPaymentMethods,
|
@@ -64,6 +59,9 @@ const CheckoutProcessor = () => {
|
|
64 |
const currentShippingAddress = useRef( shippingAddress );
|
65 |
const currentRedirectUrl = useRef( redirectUrl );
|
66 |
const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
|
|
|
|
|
|
|
67 |
|
68 |
const paymentMethodId = useMemo( () => {
|
69 |
const merged = { ...expressPaymentMethods, ...paymentMethods };
|
@@ -71,20 +69,20 @@ const CheckoutProcessor = () => {
|
|
71 |
}, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
|
72 |
|
73 |
const checkoutWillHaveError =
|
74 |
-
( hasValidationErrors && !
|
75 |
currentPaymentStatus.hasError ||
|
76 |
shippingErrorStatus.hasError;
|
77 |
|
78 |
// If express payment method is active, let's suppress notices
|
79 |
useEffect( () => {
|
80 |
-
setIsSuppressed(
|
81 |
-
}, [
|
82 |
|
83 |
useEffect( () => {
|
84 |
if (
|
85 |
checkoutWillHaveError !== checkoutHasError &&
|
86 |
( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
|
87 |
-
!
|
88 |
) {
|
89 |
dispatchActions.setHasError( checkoutWillHaveError );
|
90 |
}
|
@@ -93,7 +91,7 @@ const CheckoutProcessor = () => {
|
|
93 |
checkoutHasError,
|
94 |
checkoutIsProcessing,
|
95 |
checkoutIsBeforeProcessing,
|
96 |
-
|
97 |
dispatchActions,
|
98 |
] );
|
99 |
|
@@ -144,33 +142,29 @@ const CheckoutProcessor = () => {
|
|
144 |
|
145 |
useEffect( () => {
|
146 |
let unsubscribeProcessing;
|
147 |
-
if ( !
|
148 |
-
unsubscribeProcessing =
|
149 |
checkValidation,
|
150 |
0
|
151 |
);
|
152 |
}
|
153 |
return () => {
|
154 |
-
if ( !
|
155 |
unsubscribeProcessing();
|
156 |
}
|
157 |
};
|
158 |
}, [
|
159 |
-
|
160 |
checkValidation,
|
161 |
-
|
162 |
] );
|
163 |
|
164 |
const processOrder = useCallback( () => {
|
165 |
setIsProcessingOrder( true );
|
166 |
removeNotice( 'checkout' );
|
167 |
let data = {
|
168 |
-
billing_address:
|
169 |
-
|
170 |
-
),
|
171 |
-
shipping_address: emptyHiddenAddressFields(
|
172 |
-
currentShippingAddress.current
|
173 |
-
),
|
174 |
customer_note: orderNotes,
|
175 |
should_create_account: shouldCreateAccount,
|
176 |
};
|
@@ -236,15 +230,6 @@ const CheckoutProcessor = () => {
|
|
236 |
addErrorNotice( formatStoreApiErrorMessage( response ), {
|
237 |
id: 'checkout',
|
238 |
} );
|
239 |
-
|
240 |
-
response.additional_errors?.forEach?.(
|
241 |
-
( additionalError ) => {
|
242 |
-
addErrorNotice( additionalError.message, {
|
243 |
-
id: additionalError.error_code,
|
244 |
-
} );
|
245 |
-
}
|
246 |
-
);
|
247 |
-
|
248 |
dispatchActions.setHasError();
|
249 |
dispatchActions.setAfterProcessing( response );
|
250 |
setIsProcessingOrder( false );
|
10 |
useState,
|
11 |
useMemo,
|
12 |
} from '@wordpress/element';
|
13 |
+
import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
|
14 |
+
import { formatStoreApiErrorMessage } from '@woocommerce/base-utils';
|
|
|
|
|
15 |
|
16 |
/**
|
17 |
* Internal dependencies
|
21 |
import { useShippingDataContext } from '../../shipping';
|
22 |
import { useCustomerDataContext } from '../../customer';
|
23 |
import { usePaymentMethodDataContext } from '../../payment-methods';
|
24 |
+
import { useValidationContext } from '../../../shared';
|
|
|
|
|
25 |
|
26 |
/**
|
27 |
* CheckoutProcessor component.
|
33 |
const CheckoutProcessor = () => {
|
34 |
const {
|
35 |
hasError: checkoutHasError,
|
36 |
+
onCheckoutBeforeProcessing,
|
37 |
dispatchActions,
|
38 |
redirectUrl,
|
39 |
isProcessing: checkoutIsProcessing,
|
48 |
const { cartNeedsPayment, receiveCart } = useStoreCart();
|
49 |
const {
|
50 |
activePaymentMethod,
|
|
|
51 |
currentStatus: currentPaymentStatus,
|
52 |
paymentMethodData,
|
53 |
expressPaymentMethods,
|
59 |
const currentShippingAddress = useRef( shippingAddress );
|
60 |
const currentRedirectUrl = useRef( redirectUrl );
|
61 |
const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
|
62 |
+
const expressPaymentMethodActive = Object.keys(
|
63 |
+
expressPaymentMethods
|
64 |
+
).includes( activePaymentMethod );
|
65 |
|
66 |
const paymentMethodId = useMemo( () => {
|
67 |
const merged = { ...expressPaymentMethods, ...paymentMethods };
|
69 |
}, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
|
70 |
|
71 |
const checkoutWillHaveError =
|
72 |
+
( hasValidationErrors && ! expressPaymentMethodActive ) ||
|
73 |
currentPaymentStatus.hasError ||
|
74 |
shippingErrorStatus.hasError;
|
75 |
|
76 |
// If express payment method is active, let's suppress notices
|
77 |
useEffect( () => {
|
78 |
+
setIsSuppressed( expressPaymentMethodActive );
|
79 |
+
}, [ expressPaymentMethodActive, setIsSuppressed ] );
|
80 |
|
81 |
useEffect( () => {
|
82 |
if (
|
83 |
checkoutWillHaveError !== checkoutHasError &&
|
84 |
( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
|
85 |
+
! expressPaymentMethodActive
|
86 |
) {
|
87 |
dispatchActions.setHasError( checkoutWillHaveError );
|
88 |
}
|
91 |
checkoutHasError,
|
92 |
checkoutIsProcessing,
|
93 |
checkoutIsBeforeProcessing,
|
94 |
+
expressPaymentMethodActive,
|
95 |
dispatchActions,
|
96 |
] );
|
97 |
|
142 |
|
143 |
useEffect( () => {
|
144 |
let unsubscribeProcessing;
|
145 |
+
if ( ! expressPaymentMethodActive ) {
|
146 |
+
unsubscribeProcessing = onCheckoutBeforeProcessing(
|
147 |
checkValidation,
|
148 |
0
|
149 |
);
|
150 |
}
|
151 |
return () => {
|
152 |
+
if ( ! expressPaymentMethodActive ) {
|
153 |
unsubscribeProcessing();
|
154 |
}
|
155 |
};
|
156 |
}, [
|
157 |
+
onCheckoutBeforeProcessing,
|
158 |
checkValidation,
|
159 |
+
expressPaymentMethodActive,
|
160 |
] );
|
161 |
|
162 |
const processOrder = useCallback( () => {
|
163 |
setIsProcessingOrder( true );
|
164 |
removeNotice( 'checkout' );
|
165 |
let data = {
|
166 |
+
billing_address: currentBillingData.current,
|
167 |
+
shipping_address: currentShippingAddress.current,
|
|
|
|
|
|
|
|
|
168 |
customer_note: orderNotes,
|
169 |
should_create_account: shouldCreateAccount,
|
170 |
};
|
230 |
addErrorNotice( formatStoreApiErrorMessage( response ), {
|
231 |
id: 'checkout',
|
232 |
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
dispatchActions.setHasError();
|
234 |
dispatchActions.setAfterProcessing( response );
|
235 |
setIsProcessingOrder( false );
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/utils.js
RENAMED
File without changes
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/customer/index.js
RENAMED
@@ -2,11 +2,7 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { createContext, useContext } from '@wordpress/element';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import { useCustomerData } from '../../../hooks/use-customer-data';
|
10 |
|
11 |
/**
|
12 |
* @typedef {import('@woocommerce/type-defs/contexts').CustomerDataContext} CustomerDataContext
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { createContext, useContext } from '@wordpress/element';
|
5 |
+
import { useCustomerData } from '@woocommerce/base-hooks';
|
|
|
|
|
|
|
|
|
6 |
|
7 |
/**
|
8 |
* @typedef {import('@woocommerce/type-defs/contexts').CustomerDataContext} CustomerDataContext
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js
RENAMED
File without changes
|
assets/js/base/context/cart-checkout/payment-methods/actions.js
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import { ACTION_TYPES } from './constants';
|
5 |
+
|
6 |
+
const {
|
7 |
+
ERROR,
|
8 |
+
FAILED,
|
9 |
+
SUCCESS,
|
10 |
+
SET_REGISTERED_PAYMENT_METHODS,
|
11 |
+
SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
|
12 |
+
SET_SHOULD_SAVE_PAYMENT_METHOD,
|
13 |
+
} = ACTION_TYPES;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Used to dispatch a status update only for the given type.
|
17 |
+
*
|
18 |
+
* @param {string} type
|
19 |
+
*
|
20 |
+
* @return {Object} The action object.
|
21 |
+
*/
|
22 |
+
export const statusOnly = ( type ) => ( { type } );
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Used to dispatch an error message along with setting current payment status
|
26 |
+
* to ERROR.
|
27 |
+
*
|
28 |
+
* @param {string} errorMessage Whatever error message accompanying the error
|
29 |
+
* condition.
|
30 |
+
*
|
31 |
+
* @return {Object} The action object.
|
32 |
+
*/
|
33 |
+
export const error = ( errorMessage ) => ( {
|
34 |
+
type: ERROR,
|
35 |
+
errorMessage,
|
36 |
+
} );
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Used to dispatch a payment failed status update.
|
40 |
+
*
|
41 |
+
* @param {Object} action Incoming data for the
|
42 |
+
* action.
|
43 |
+
* @param {string} action.errorMessage Any message accompanying
|
44 |
+
* the failed payment.
|
45 |
+
* @param {Object} action.paymentMethodData Arbitrary extra
|
46 |
+
* information about the
|
47 |
+
* payment method in use
|
48 |
+
* (varies per payment
|
49 |
+
* method).
|
50 |
+
*
|
51 |
+
* @return {Object} An action object.
|
52 |
+
*/
|
53 |
+
export const failed = ( { errorMessage, paymentMethodData } ) => ( {
|
54 |
+
type: FAILED,
|
55 |
+
errorMessage,
|
56 |
+
paymentMethodData,
|
57 |
+
} );
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Used to dispatch a payment success status update.
|
61 |
+
*
|
62 |
+
* @param {Object} action Incoming data for the
|
63 |
+
* action.
|
64 |
+
* @param {Object} action.paymentMethodData Arbitrary extra
|
65 |
+
* information about the
|
66 |
+
* payment method in use
|
67 |
+
* (varies per payment
|
68 |
+
* method).
|
69 |
+
*
|
70 |
+
* @return {Object} An action object.
|
71 |
+
*/
|
72 |
+
export const success = ( { paymentMethodData } ) => ( {
|
73 |
+
type: SUCCESS,
|
74 |
+
paymentMethodData,
|
75 |
+
} );
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Used to dispatch an action for updating a registered payment method in the
|
79 |
+
* state.
|
80 |
+
*
|
81 |
+
* @param {Object} paymentMethods Payment methods to register.
|
82 |
+
* @return {Object} An action object.
|
83 |
+
*/
|
84 |
+
export const setRegisteredPaymentMethods = ( paymentMethods ) => ( {
|
85 |
+
type: SET_REGISTERED_PAYMENT_METHODS,
|
86 |
+
paymentMethods,
|
87 |
+
} );
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Used to dispatch an action for updating a registered express payment
|
91 |
+
* method in the state.
|
92 |
+
*
|
93 |
+
* @param {Object} paymentMethods Payment methods to register.
|
94 |
+
* @return {Object} An action object.
|
95 |
+
*/
|
96 |
+
export const setRegisteredExpressPaymentMethods = ( paymentMethods ) => ( {
|
97 |
+
type: SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
|
98 |
+
paymentMethods,
|
99 |
+
} );
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Set a flag indicating that the payment method info (e.g. a payment card)
|
103 |
+
* should be saved to user account after order completion.
|
104 |
+
*
|
105 |
+
* @param {boolean} shouldSavePaymentMethod
|
106 |
+
* @return {Object} An action object.
|
107 |
+
*/
|
108 |
+
export const setShouldSavePaymentMethod = ( shouldSavePaymentMethod ) => ( {
|
109 |
+
type: SET_SHOULD_SAVE_PAYMENT_METHOD,
|
110 |
+
shouldSavePaymentMethod,
|
111 |
+
} );
|
assets/js/base/context/{providers/cart-checkout/payment-methods/constants.ts → cart-checkout/payment-methods/constants.js}
RENAMED
@@ -1,33 +1,39 @@
|
|
1 |
/**
|
2 |
-
*
|
3 |
*/
|
4 |
-
import type {
|
5 |
-
PaymentMethodDataContextType,
|
6 |
-
PaymentMethodDataContextState,
|
7 |
-
} from './types';
|
8 |
|
9 |
-
export
|
10 |
-
PRISTINE
|
11 |
-
STARTED
|
12 |
-
PROCESSING
|
13 |
-
ERROR
|
14 |
-
FAILED
|
15 |
-
SUCCESS
|
16 |
-
COMPLETE
|
17 |
-
}
|
18 |
|
19 |
-
export
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
|
|
|
|
24 |
|
25 |
-
|
26 |
-
|
|
|
|
|
|
|
|
|
|
|
27 |
currentStatus: STATUS.PRISTINE,
|
28 |
shouldSavePaymentMethod: false,
|
29 |
paymentMethodData: {
|
30 |
payment_method: '',
|
|
|
|
|
|
|
31 |
},
|
32 |
hasSavedToken: false,
|
33 |
errorMessage: '',
|
@@ -35,13 +41,15 @@ export const DEFAULT_PAYMENT_DATA_CONTEXT_STATE: PaymentMethodDataContextState =
|
|
35 |
expressPaymentMethods: {},
|
36 |
};
|
37 |
|
38 |
-
|
|
|
|
|
|
|
39 |
setPaymentStatus: () => ( {
|
40 |
-
pristine: () => void null,
|
41 |
started: () => void null,
|
42 |
processing: () => void null,
|
43 |
completed: () => void null,
|
44 |
-
error: ( errorMessage
|
45 |
failed: ( errorMessage, paymentMethodData ) =>
|
46 |
void [ errorMessage, paymentMethodData ],
|
47 |
success: ( paymentMethodData, billingData ) =>
|
@@ -55,7 +63,6 @@ export const DEFAULT_PAYMENT_METHOD_DATA: PaymentMethodDataContextType = {
|
|
55 |
hasError: false,
|
56 |
hasFailed: false,
|
57 |
isSuccessful: false,
|
58 |
-
isDoingExpressPayment: false,
|
59 |
},
|
60 |
paymentStatuses: STATUS,
|
61 |
paymentMethodData: {},
|
@@ -69,9 +76,7 @@ export const DEFAULT_PAYMENT_METHOD_DATA: PaymentMethodDataContextType = {
|
|
69 |
expressPaymentMethods: {},
|
70 |
paymentMethodsInitialized: false,
|
71 |
expressPaymentMethodsInitialized: false,
|
72 |
-
onPaymentProcessing: () =>
|
73 |
-
|
74 |
-
|
75 |
-
setShouldSavePayment: () => void null,
|
76 |
-
shouldSavePayment: false,
|
77 |
};
|
1 |
/**
|
2 |
+
* @typedef {import('@woocommerce/type-defs/contexts').PaymentMethodDataContext} PaymentMethodDataContext
|
3 |
*/
|
|
|
|
|
|
|
|
|
4 |
|
5 |
+
export const STATUS = {
|
6 |
+
PRISTINE: 'pristine',
|
7 |
+
STARTED: 'started',
|
8 |
+
PROCESSING: 'processing',
|
9 |
+
ERROR: 'has_error',
|
10 |
+
FAILED: 'failed',
|
11 |
+
SUCCESS: 'success',
|
12 |
+
COMPLETE: 'complete',
|
13 |
+
};
|
14 |
|
15 |
+
export const ACTION_TYPES = {
|
16 |
+
...STATUS,
|
17 |
+
SET_REGISTERED_PAYMENT_METHODS: 'set_registered_payment_methods',
|
18 |
+
SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
|
19 |
+
'set_registered_express_payment_methods',
|
20 |
+
SET_SHOULD_SAVE_PAYMENT_METHOD: 'set_should_save_payment_method',
|
21 |
+
};
|
22 |
|
23 |
+
/**
|
24 |
+
* @todo do typedefs for the payment event state.
|
25 |
+
*/
|
26 |
+
|
27 |
+
// Note - if fields are added/shape is changed, you may want to update
|
28 |
+
// PRISTINE reducer clause to preserve your new field.
|
29 |
+
export const DEFAULT_PAYMENT_DATA = {
|
30 |
currentStatus: STATUS.PRISTINE,
|
31 |
shouldSavePaymentMethod: false,
|
32 |
paymentMethodData: {
|
33 |
payment_method: '',
|
34 |
+
// arbitrary data the payment method
|
35 |
+
// wants to pass along for payment
|
36 |
+
// processing server side.
|
37 |
},
|
38 |
hasSavedToken: false,
|
39 |
errorMessage: '',
|
41 |
expressPaymentMethods: {},
|
42 |
};
|
43 |
|
44 |
+
/**
|
45 |
+
* @type {PaymentMethodDataContext}
|
46 |
+
*/
|
47 |
+
export const DEFAULT_PAYMENT_METHOD_DATA = {
|
48 |
setPaymentStatus: () => ( {
|
|
|
49 |
started: () => void null,
|
50 |
processing: () => void null,
|
51 |
completed: () => void null,
|
52 |
+
error: ( errorMessage ) => void errorMessage,
|
53 |
failed: ( errorMessage, paymentMethodData ) =>
|
54 |
void [ errorMessage, paymentMethodData ],
|
55 |
success: ( paymentMethodData, billingData ) =>
|
63 |
hasError: false,
|
64 |
hasFailed: false,
|
65 |
isSuccessful: false,
|
|
|
66 |
},
|
67 |
paymentStatuses: STATUS,
|
68 |
paymentMethodData: {},
|
76 |
expressPaymentMethods: {},
|
77 |
paymentMethodsInitialized: false,
|
78 |
expressPaymentMethodsInitialized: false,
|
79 |
+
onPaymentProcessing: () => void null,
|
80 |
+
onPaymentSuccess: () => void null,
|
81 |
+
onPaymentFail: () => void null,
|
|
|
|
|
82 |
};
|
assets/js/base/context/cart-checkout/payment-methods/event-emit.js
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import {
|
5 |
+
reducer,
|
6 |
+
emitEvent,
|
7 |
+
emitEventWithAbort,
|
8 |
+
emitterCallback,
|
9 |
+
} from '../../shared/event-emit';
|
10 |
+
|
11 |
+
const EMIT_TYPES = {
|
12 |
+
PAYMENT_PROCESSING: 'payment_processing',
|
13 |
+
};
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Receives a reducer dispatcher and returns an object with the
|
17 |
+
* various event emitters for the payment processing events.
|
18 |
+
*
|
19 |
+
* Calling the event registration function with the callback will register it
|
20 |
+
* for the event emitter and will return a dispatcher for removing the
|
21 |
+
* registered callback (useful for implementation in `useEffect`).
|
22 |
+
*
|
23 |
+
* @param {Function} dispatcher The emitter reducer dispatcher.
|
24 |
+
*
|
25 |
+
* @return {Object} An object with the various payment event emitter
|
26 |
+
* registration functions
|
27 |
+
*/
|
28 |
+
const emitterSubscribers = ( dispatcher ) => ( {
|
29 |
+
onPaymentProcessing: emitterCallback(
|
30 |
+
EMIT_TYPES.PAYMENT_PROCESSING,
|
31 |
+
dispatcher
|
32 |
+
),
|
33 |
+
} );
|
34 |
+
|
35 |
+
export {
|
36 |
+
EMIT_TYPES,
|
37 |
+
emitterSubscribers,
|
38 |
+
reducer,
|
39 |
+
emitEvent,
|
40 |
+
emitEventWithAbort,
|
41 |
+
};
|
assets/js/base/context/{providers/cart-checkout/payment-methods/index.ts → cart-checkout/payment-methods/index.js}
RENAMED
File without changes
|
assets/js/base/context/cart-checkout/payment-methods/payment-method-data-context.js
ADDED
@@ -0,0 +1,469 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import {
|
5 |
+
createContext,
|
6 |
+
useContext,
|
7 |
+
useState,
|
8 |
+
useReducer,
|
9 |
+
useCallback,
|
10 |
+
useEffect,
|
11 |
+
useRef,
|
12 |
+
useMemo,
|
13 |
+
} from '@wordpress/element';
|
14 |
+
import { getSetting } from '@woocommerce/settings';
|
15 |
+
import { useStoreNotices, useEmitResponse } from '@woocommerce/base-hooks';
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Internal dependencies
|
19 |
+
*/
|
20 |
+
import {
|
21 |
+
STATUS,
|
22 |
+
DEFAULT_PAYMENT_DATA,
|
23 |
+
DEFAULT_PAYMENT_METHOD_DATA,
|
24 |
+
} from './constants';
|
25 |
+
import reducer from './reducer';
|
26 |
+
import {
|
27 |
+
statusOnly,
|
28 |
+
error,
|
29 |
+
failed,
|
30 |
+
success,
|
31 |
+
setRegisteredPaymentMethods,
|
32 |
+
setRegisteredExpressPaymentMethods,
|
33 |
+
setShouldSavePaymentMethod,
|
34 |
+
} from './actions';
|
35 |
+
import {
|
36 |
+
usePaymentMethods,
|
37 |
+
useExpressPaymentMethods,
|
38 |
+
} from './use-payment-method-registration';
|
39 |
+
import { useCustomerDataContext } from '../customer';
|
40 |
+
import { useCheckoutContext } from '../checkout-state';
|
41 |
+
import { useShippingDataContext } from '../shipping';
|
42 |
+
import { useEditorContext } from '../../editor';
|
43 |
+
import {
|
44 |
+
EMIT_TYPES,
|
45 |
+
emitterSubscribers,
|
46 |
+
emitEventWithAbort,
|
47 |
+
reducer as emitReducer,
|
48 |
+
} from './event-emit';
|
49 |
+
import { useValidationContext } from '../../shared/validation';
|
50 |
+
|
51 |
+
/**
|
52 |
+
* @typedef {import('@woocommerce/type-defs/contexts').PaymentMethodDataContext} PaymentMethodDataContext
|
53 |
+
* @typedef {import('@woocommerce/type-defs/contexts').PaymentStatusDispatch} PaymentStatusDispatch
|
54 |
+
* @typedef {import('@woocommerce/type-defs/contexts').PaymentStatusDispatchers} PaymentStatusDispatchers
|
55 |
+
* @typedef {import('@woocommerce/type-defs/billing').BillingData} BillingData
|
56 |
+
* @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
|
57 |
+
* @typedef {import('@woocommerce/type-defs/contexts').ShippingDataResponse} ShippingDataResponse
|
58 |
+
*/
|
59 |
+
|
60 |
+
const {
|
61 |
+
STARTED,
|
62 |
+
PROCESSING,
|
63 |
+
COMPLETE,
|
64 |
+
PRISTINE,
|
65 |
+
ERROR,
|
66 |
+
FAILED,
|
67 |
+
SUCCESS,
|
68 |
+
} = STATUS;
|
69 |
+
|
70 |
+
const PaymentMethodDataContext = createContext( DEFAULT_PAYMENT_METHOD_DATA );
|
71 |
+
|
72 |
+
/**
|
73 |
+
* @return {PaymentMethodDataContext} The data and functions exposed by the
|
74 |
+
* payment method context provider.
|
75 |
+
*/
|
76 |
+
export const usePaymentMethodDataContext = () => {
|
77 |
+
return useContext( PaymentMethodDataContext );
|
78 |
+
};
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Gets the payment methods saved for the current user after filtering out
|
82 |
+
* disabled ones.
|
83 |
+
*
|
84 |
+
* @param {Object} availablePaymentMethods List of available payment methods.
|
85 |
+
* @return {Object} Object containing the payment methods saved for a specific
|
86 |
+
* user which are available.
|
87 |
+
*/
|
88 |
+
const getCustomerPaymentMethods = ( availablePaymentMethods = {} ) => {
|
89 |
+
const customerPaymentMethods = getSetting( 'customerPaymentMethods', {} );
|
90 |
+
const paymentMethodKeys = Object.keys( customerPaymentMethods );
|
91 |
+
const enabledCustomerPaymentMethods = {};
|
92 |
+
paymentMethodKeys.forEach( ( type ) => {
|
93 |
+
const methods = customerPaymentMethods[ type ].filter(
|
94 |
+
( { method: { gateway } } ) => {
|
95 |
+
const isAvailable = gateway in availablePaymentMethods;
|
96 |
+
return (
|
97 |
+
isAvailable &&
|
98 |
+
availablePaymentMethods[ gateway ].supports?.showSavedCards
|
99 |
+
);
|
100 |
+
}
|
101 |
+
);
|
102 |
+
if ( methods.length ) {
|
103 |
+
enabledCustomerPaymentMethods[ type ] = methods;
|
104 |
+
}
|
105 |
+
} );
|
106 |
+
return enabledCustomerPaymentMethods;
|
107 |
+
};
|
108 |
+
|
109 |
+
/**
|
110 |
+
* PaymentMethodDataProvider is automatically included in the
|
111 |
+
* CheckoutDataProvider.
|
112 |
+
*
|
113 |
+
* This provides the api interface (via the context hook) for payment method
|
114 |
+
* status and data.
|
115 |
+
*
|
116 |
+
* @param {Object} props Incoming props for provider
|
117 |
+
* @param {Object} props.children The wrapped components in this
|
118 |
+
* provider.
|
119 |
+
*/
|
120 |
+
export const PaymentMethodDataProvider = ( { children } ) => {
|
121 |
+
const { setBillingData } = useCustomerDataContext();
|
122 |
+
const {
|
123 |
+
isProcessing: checkoutIsProcessing,
|
124 |
+
isIdle: checkoutIsIdle,
|
125 |
+
isCalculating: checkoutIsCalculating,
|
126 |
+
hasError: checkoutHasError,
|
127 |
+
} = useCheckoutContext();
|
128 |
+
const {
|
129 |
+
isSuccessResponse,
|
130 |
+
isErrorResponse,
|
131 |
+
isFailResponse,
|
132 |
+
noticeContexts,
|
133 |
+
} = useEmitResponse();
|
134 |
+
// The active payment method - e.g. Stripe CC or BACS.
|
135 |
+
const [ activePaymentMethod, setActive ] = useState( '' );
|
136 |
+
// If a previously saved payment method is active, the token for that method.
|
137 |
+
// For example, a for a Stripe CC card saved to user account.
|
138 |
+
const [ activeSavedToken, setActiveSavedToken ] = useState( '' );
|
139 |
+
const [ observers, subscriber ] = useReducer( emitReducer, {} );
|
140 |
+
const currentObservers = useRef( observers );
|
141 |
+
|
142 |
+
const { isEditor, previewData } = useEditorContext();
|
143 |
+
const [ paymentData, dispatch ] = useReducer(
|
144 |
+
reducer,
|
145 |
+
DEFAULT_PAYMENT_DATA
|
146 |
+
);
|
147 |
+
const setActivePaymentMethod = useCallback(
|
148 |
+
( paymentMethodSlug ) => {
|
149 |
+
setActive( paymentMethodSlug );
|
150 |
+
dispatch( statusOnly( PRISTINE ) );
|
151 |
+
},
|
152 |
+
[ setActive, dispatch ]
|
153 |
+
);
|
154 |
+
const paymentMethodsDispatcher = useCallback(
|
155 |
+
( paymentMethods ) => {
|
156 |
+
dispatch( setRegisteredPaymentMethods( paymentMethods ) );
|
157 |
+
},
|
158 |
+
[ dispatch ]
|
159 |
+
);
|
160 |
+
const expressPaymentMethodsDispatcher = useCallback(
|
161 |
+
( paymentMethods ) => {
|
162 |
+
dispatch( setRegisteredExpressPaymentMethods( paymentMethods ) );
|
163 |
+
},
|
164 |
+
[ dispatch ]
|
165 |
+
);
|
166 |
+
const paymentMethodsInitialized = usePaymentMethods(
|
167 |
+
paymentMethodsDispatcher
|
168 |
+
);
|
169 |
+
const expressPaymentMethodsInitialized = useExpressPaymentMethods(
|
170 |
+
expressPaymentMethodsDispatcher
|
171 |
+
);
|
172 |
+
const { setValidationErrors } = useValidationContext();
|
173 |
+
const { addErrorNotice, removeNotice } = useStoreNotices();
|
174 |
+
const { setShippingAddress } = useShippingDataContext();
|
175 |
+
const setShouldSavePayment = useCallback(
|
176 |
+
( shouldSave ) => {
|
177 |
+
dispatch( setShouldSavePaymentMethod( shouldSave ) );
|
178 |
+
},
|
179 |
+
[ dispatch ]
|
180 |
+
);
|
181 |
+
|
182 |
+
const customerPaymentMethods = useMemo( () => {
|
183 |
+
if ( isEditor && previewData.previewSavedPaymentMethods ) {
|
184 |
+
return previewData.previewSavedPaymentMethods;
|
185 |
+
}
|
186 |
+
if (
|
187 |
+
! paymentMethodsInitialized ||
|
188 |
+
Object.keys( paymentData.paymentMethods ).length === 0
|
189 |
+
) {
|
190 |
+
return {};
|
191 |
+
}
|
192 |
+
return getCustomerPaymentMethods( paymentData.paymentMethods );
|
193 |
+
}, [
|
194 |
+
isEditor,
|
195 |
+
previewData.previewSavedPaymentMethods,
|
196 |
+
paymentMethodsInitialized,
|
197 |
+
paymentData.paymentMethods,
|
198 |
+
] );
|
199 |
+
|
200 |
+
const setExpressPaymentError = useCallback(
|
201 |
+
( message ) => {
|
202 |
+
if ( message ) {
|
203 |
+
addErrorNotice( message, {
|
204 |
+
id: 'wc-express-payment-error',
|
205 |
+
context: noticeContexts.EXPRESS_PAYMENTS,
|
206 |
+
} );
|
207 |
+
} else {
|
208 |
+
removeNotice(
|
209 |
+
'wc-express-payment-error',
|
210 |
+
noticeContexts.EXPRESS_PAYMENTS
|
211 |
+
);
|
212 |
+
}
|
213 |
+
},
|
214 |
+
[ addErrorNotice, noticeContexts.EXPRESS_PAYMENTS, removeNotice ]
|
215 |
+
);
|
216 |
+
// ensure observers are always current.
|
217 |
+
useEffect( () => {
|
218 |
+
currentObservers.current = observers;
|
219 |
+
}, [ observers ] );
|
220 |
+
const onPaymentProcessing = useMemo(
|
221 |
+
() => emitterSubscribers( subscriber ).onPaymentProcessing,
|
222 |
+
[ subscriber ]
|
223 |
+
);
|
224 |
+
|
225 |
+
const currentStatus = useMemo(
|
226 |
+
() => ( {
|
227 |
+
isPristine: paymentData.currentStatus === PRISTINE,
|
228 |
+
isStarted: paymentData.currentStatus === STARTED,
|
229 |
+
isProcessing: paymentData.currentStatus === PROCESSING,
|
230 |
+
isFinished: [ ERROR, FAILED, SUCCESS ].includes(
|
231 |
+
paymentData.currentStatus
|
232 |
+
),
|
233 |
+
hasError: paymentData.currentStatus === ERROR,
|
234 |
+
hasFailed: paymentData.currentStatus === FAILED,
|
235 |
+
isSuccessful: paymentData.currentStatus === SUCCESS,
|
236 |
+
} ),
|
237 |
+
[ paymentData.currentStatus ]
|
238 |
+
);
|
239 |
+
|
240 |
+
/**
|
241 |
+
* @type {PaymentStatusDispatch}
|
242 |
+
*/
|
243 |
+
const setPaymentStatus = useCallback(
|
244 |
+
() => ( {
|
245 |
+
started: () => dispatch( statusOnly( STARTED ) ),
|
246 |
+
processing: () => dispatch( statusOnly( PROCESSING ) ),
|
247 |
+
completed: () => dispatch( statusOnly( COMPLETE ) ),
|
248 |
+
/**
|
249 |
+
* @param {string} errorMessage An error message
|
250 |
+
*/
|
251 |
+
error: ( errorMessage ) => dispatch( error( errorMessage ) ),
|
252 |
+
/**
|
253 |
+
* @param {string} errorMessage An error message
|
254 |
+
* @param {Object} paymentMethodData Arbitrary payment method data to
|
255 |
+
* accompany the checkout submission.
|
256 |
+
* @param {BillingData|null} [billingData] The billing data accompanying the
|
257 |
+
* payment method.
|
258 |
+
*/
|
259 |
+
failed: ( errorMessage, paymentMethodData, billingData = null ) => {
|
260 |
+
if ( billingData ) {
|
261 |
+
setBillingData( billingData );
|
262 |
+
}
|
263 |
+
dispatch(
|
264 |
+
failed( {
|
265 |
+
errorMessage,
|
266 |
+
paymentMethodData,
|
267 |
+
} )
|
268 |
+
);
|
269 |
+
},
|
270 |
+
/**
|
271 |
+
* @param {Object} [paymentMethodData] Arbitrary payment method data to
|
272 |
+
* accompany the checkout.
|
273 |
+
* @param {BillingData|null} [billingData] The billing data accompanying the
|
274 |
+
* payment method.
|
275 |
+
* @param {ShippingDataResponse|null} [shippingData] The shipping data accompanying the
|
276 |
+
* payment method.
|
277 |
+
*/
|
278 |
+
success: (
|
279 |
+
paymentMethodData = {},
|
280 |
+
billingData = null,
|
281 |
+
shippingData = null
|
282 |
+
) => {
|
283 |
+
if ( billingData ) {
|
284 |
+
setBillingData( billingData );
|
285 |
+
}
|
286 |
+
if ( shippingData !== null && shippingData?.address ) {
|
287 |
+
setShippingAddress( shippingData.address );
|
288 |
+
}
|
289 |
+
dispatch(
|
290 |
+
success( {
|
291 |
+
paymentMethodData,
|
292 |
+
} )
|
293 |
+
);
|
294 |
+
},
|
295 |
+
} ),
|
296 |
+
[ dispatch, setBillingData, setShippingAddress ]
|
297 |
+
);
|
298 |
+
|
299 |
+
// flip payment to processing if checkout processing is complete, there are
|
300 |
+
// no errors, and payment status is started.
|
301 |
+
useEffect( () => {
|
302 |
+
if (
|
303 |
+
checkoutIsProcessing &&
|
304 |
+
! checkoutHasError &&
|
305 |
+
! checkoutIsCalculating &&
|
306 |
+
! currentStatus.isFinished
|
307 |
+
) {
|
308 |
+
setPaymentStatus().processing();
|
309 |
+
}
|
310 |
+
}, [
|
311 |
+
checkoutIsProcessing,
|
312 |
+
checkoutHasError,
|
313 |
+
checkoutIsCalculating,
|
314 |
+
currentStatus.isFinished,
|
315 |
+
setPaymentStatus,
|
316 |
+
] );
|
317 |
+
|
318 |
+
// When checkout is returned to idle, set payment status to pristine
|
319 |
+
// but only if payment status is already not finished.
|
320 |
+
useEffect( () => {
|
321 |
+
if ( checkoutIsIdle && ! currentStatus.isSuccessful ) {
|
322 |
+
dispatch( statusOnly( PRISTINE ) );
|
323 |
+
}
|
324 |
+
}, [ checkoutIsIdle, currentStatus.isSuccessful ] );
|
325 |
+
|
326 |
+
// if checkout has an error and payment is not being made with a saved token
|
327 |
+
// and payment status is success, then let's sync payment status back to
|
328 |
+
// pristine.
|
329 |
+
useEffect( () => {
|
330 |
+
if (
|
331 |
+
checkoutHasError &&
|
332 |
+
currentStatus.isSuccessful &&
|
333 |
+
! paymentData.hasSavedToken
|
334 |
+
) {
|
335 |
+
dispatch( statusOnly( PRISTINE ) );
|
336 |
+
}
|
337 |
+
}, [
|
338 |
+
checkoutHasError,
|
339 |
+
currentStatus.isSuccessful,
|
340 |
+
paymentData.hasSavedToken,
|
341 |
+
] );
|
342 |
+
|
343 |
+
// Set active (selected) payment method as needed.
|
344 |
+
useEffect( () => {
|
345 |
+
const paymentMethodKeys = Object.keys( paymentData.paymentMethods );
|
346 |
+
const allPaymentMethodKeys = [
|
347 |
+
...paymentMethodKeys,
|
348 |
+
...Object.keys( paymentData.expressPaymentMethods ),
|
349 |
+
];
|
350 |
+
if ( ! paymentMethodsInitialized || ! paymentMethodKeys.length ) {
|
351 |
+
return;
|
352 |
+
}
|
353 |
+
|
354 |
+
setActive( ( currentActivePaymentMethod ) => {
|
355 |
+
// If there's no active payment method, or the active payment method has
|
356 |
+
// been removed (e.g. COD vs shipping methods), set one as active.
|
357 |
+
// Note: It's possible that the active payment method might be an
|
358 |
+
// express payment method. So registered express payment methods are
|
359 |
+
// included in the check here.
|
360 |
+
if (
|
361 |
+
! currentActivePaymentMethod ||
|
362 |
+
! allPaymentMethodKeys.includes( currentActivePaymentMethod )
|
363 |
+
) {
|
364 |
+
dispatch( statusOnly( PRISTINE ) );
|
365 |
+
return Object.keys( paymentData.paymentMethods )[ 0 ];
|
366 |
+
}
|
367 |
+
return currentActivePaymentMethod;
|
368 |
+
} );
|
369 |
+
}, [
|
370 |
+
paymentMethodsInitialized,
|
371 |
+
paymentData.paymentMethods,
|
372 |
+
paymentData.expressPaymentMethods,
|
373 |
+
setActive,
|
374 |
+
] );
|
375 |
+
|
376 |
+
// emit events.
|
377 |
+
useEffect( () => {
|
378 |
+
// Note: the nature of this event emitter is that it will bail on any
|
379 |
+
// observer that returns a response that !== true. However, this still
|
380 |
+
// allows for other observers that return true for continuing through
|
381 |
+
// to the next observer (or bailing if there's a problem).
|
382 |
+
if ( currentStatus.isProcessing ) {
|
383 |
+
removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
|
384 |
+
emitEventWithAbort(
|
385 |
+
currentObservers.current,
|
386 |
+
EMIT_TYPES.PAYMENT_PROCESSING,
|
387 |
+
{}
|
388 |
+
).then( ( response ) => {
|
389 |
+
if ( isSuccessResponse( response ) ) {
|
390 |
+
setPaymentStatus().success(
|
391 |
+
response?.meta?.paymentMethodData,
|
392 |
+
response?.meta?.billingData,
|
393 |
+
response?.meta?.shippingData
|
394 |
+
);
|
395 |
+
} else if ( isFailResponse( response ) ) {
|
396 |
+
if ( response.message && response.message.length ) {
|
397 |
+
addErrorNotice( response.message, {
|
398 |
+
id: 'wc-payment-error',
|
399 |
+
isDismissible: false,
|
400 |
+
context:
|
401 |
+
response?.messageContext ||
|
402 |
+
noticeContexts.PAYMENTS,
|
403 |
+
} );
|
404 |
+
}
|
405 |
+
setPaymentStatus().failed(
|
406 |
+
response?.message,
|
407 |
+
response?.meta?.paymentMethodData,
|
408 |
+
response?.meta?.billingData
|
409 |
+
);
|
410 |
+
} else if ( isErrorResponse( response ) ) {
|
411 |
+
if ( response.message && response.message.length ) {
|
412 |
+
addErrorNotice( response.message, {
|
413 |
+
id: 'wc-payment-error',
|
414 |
+
isDismissible: false,
|
415 |
+
context:
|
416 |
+
response?.messageContext ||
|
417 |
+
noticeContexts.PAYMENTS,
|
418 |
+
} );
|
419 |
+
}
|
420 |
+
setPaymentStatus().error( response.message );
|
421 |
+
setValidationErrors( response?.validationErrors );
|
422 |
+
} else {
|
423 |
+
// otherwise there are no payment methods doing anything so
|
424 |
+
// just consider success
|
425 |
+
setPaymentStatus().success();
|
426 |
+
}
|
427 |
+
} );
|
428 |
+
}
|
429 |
+
}, [
|
430 |
+
currentStatus.isProcessing,
|
431 |
+
setValidationErrors,
|
432 |
+
setPaymentStatus,
|
433 |
+
removeNotice,
|
434 |
+
noticeContexts.PAYMENTS,
|
435 |
+
isSuccessResponse,
|
436 |
+
isFailResponse,
|
437 |
+
isErrorResponse,
|
438 |
+
addErrorNotice,
|
439 |
+
] );
|
440 |
+
|
441 |
+
/**
|
442 |
+
* @type {PaymentMethodDataContext}
|
443 |
+
*/
|
444 |
+
const paymentContextData = {
|
445 |
+
setPaymentStatus,
|
446 |
+
currentStatus,
|
447 |
+
paymentStatuses: STATUS,
|
448 |
+
paymentMethodData: paymentData.paymentMethodData,
|
449 |
+
errorMessage: paymentData.errorMessage,
|
450 |
+
activePaymentMethod,
|
451 |
+
setActivePaymentMethod,
|
452 |
+
activeSavedToken,
|
453 |
+
setActiveSavedToken,
|
454 |
+
onPaymentProcessing,
|
455 |
+
customerPaymentMethods,
|
456 |
+
paymentMethods: paymentData.paymentMethods,
|
457 |
+
expressPaymentMethods: paymentData.expressPaymentMethods,
|
458 |
+
paymentMethodsInitialized,
|
459 |
+
expressPaymentMethodsInitialized,
|
460 |
+
setExpressPaymentError,
|
461 |
+
shouldSavePayment: paymentData.shouldSavePaymentMethod,
|
462 |
+
setShouldSavePayment,
|
463 |
+
};
|
464 |
+
return (
|
465 |
+
<PaymentMethodDataContext.Provider value={ paymentContextData }>
|
466 |
+
{ children }
|
467 |
+
</PaymentMethodDataContext.Provider>
|
468 |
+
);
|
469 |
+
};
|
assets/js/base/context/cart-checkout/payment-methods/reducer.js
ADDED
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import { ACTION_TYPES, DEFAULT_PAYMENT_DATA } from './constants';
|
5 |
+
const {
|
6 |
+
STARTED,
|
7 |
+
ERROR,
|
8 |
+
FAILED,
|
9 |
+
SUCCESS,
|
10 |
+
PROCESSING,
|
11 |
+
PRISTINE,
|
12 |
+
COMPLETE,
|
13 |
+
SET_REGISTERED_PAYMENT_METHODS,
|
14 |
+
SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
|
15 |
+
SET_SHOULD_SAVE_PAYMENT_METHOD,
|
16 |
+
} = ACTION_TYPES;
|
17 |
+
|
18 |
+
const hasSavedPaymentToken = ( paymentMethodData ) => {
|
19 |
+
return !! (
|
20 |
+
typeof paymentMethodData === 'object' && paymentMethodData.isSavedToken
|
21 |
+
);
|
22 |
+
};
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Reducer for payment data state
|
26 |
+
*
|
27 |
+
* @param {Object} state Current state.
|
28 |
+
* @param {Object} action Current action.
|
29 |
+
* @param {string} action.type Action type.
|
30 |
+
* @param {Object} action.paymentMethodData Payment method data payload.
|
31 |
+
* @param {boolean} action.shouldSavePaymentMethod Should save payment method flag.
|
32 |
+
* @param {string} action.errorMessage Error message to store in state.
|
33 |
+
* @param {Object} action.paymentMethods Registered payment methods.
|
34 |
+
*/
|
35 |
+
const reducer = (
|
36 |
+
state = DEFAULT_PAYMENT_DATA,
|
37 |
+
{
|
38 |
+
type,
|
39 |
+
paymentMethodData,
|
40 |
+
shouldSavePaymentMethod,
|
41 |
+
errorMessage,
|
42 |
+
paymentMethods,
|
43 |
+
}
|
44 |
+
) => {
|
45 |
+
switch ( type ) {
|
46 |
+
case STARTED:
|
47 |
+
return state.currentStatus !== STARTED
|
48 |
+
? {
|
49 |
+
...state,
|
50 |
+
currentStatus: STARTED,
|
51 |
+
}
|
52 |
+
: state;
|
53 |
+
case ERROR:
|
54 |
+
return state.currentStatus !== ERROR
|
55 |
+
? {
|
56 |
+
...state,
|
57 |
+
currentStatus: ERROR,
|
58 |
+
errorMessage: errorMessage || state.errorMessage,
|
59 |
+
}
|
60 |
+
: state;
|
61 |
+
case FAILED:
|
62 |
+
return state.currentStatus !== FAILED
|
63 |
+
? {
|
64 |
+
...state,
|
65 |
+
currentStatus: FAILED,
|
66 |
+
paymentMethodData:
|
67 |
+
paymentMethodData || state.paymentMethodData,
|
68 |
+
errorMessage: errorMessage || state.errorMessage,
|
69 |
+
}
|
70 |
+
: state;
|
71 |
+
case SUCCESS:
|
72 |
+
return state.currentStatus !== SUCCESS
|
73 |
+
? {
|
74 |
+
...state,
|
75 |
+
currentStatus: SUCCESS,
|
76 |
+
paymentMethodData:
|
77 |
+
paymentMethodData || state.paymentMethodData,
|
78 |
+
hasSavedToken: hasSavedPaymentToken(
|
79 |
+
paymentMethodData
|
80 |
+
),
|
81 |
+
}
|
82 |
+
: state;
|
83 |
+
case PROCESSING:
|
84 |
+
return state.currentStatus !== PROCESSING
|
85 |
+
? {
|
86 |
+
...state,
|
87 |
+
currentStatus: PROCESSING,
|
88 |
+
errorMessage: '',
|
89 |
+
}
|
90 |
+
: state;
|
91 |
+
case COMPLETE:
|
92 |
+
return state.currentStatus !== COMPLETE
|
93 |
+
? {
|
94 |
+
...state,
|
95 |
+
currentStatus: COMPLETE,
|
96 |
+
}
|
97 |
+
: state;
|
98 |
+
|
99 |
+
case PRISTINE:
|
100 |
+
return {
|
101 |
+
...DEFAULT_PAYMENT_DATA,
|
102 |
+
currentStatus: PRISTINE,
|
103 |
+
// keep payment method registration state
|
104 |
+
paymentMethods: {
|
105 |
+
...state.paymentMethods,
|
106 |
+
},
|
107 |
+
expressPaymentMethods: {
|
108 |
+
...state.expressPaymentMethods,
|
109 |
+
},
|
110 |
+
shouldSavePaymentMethod: state.shouldSavePaymentMethod,
|
111 |
+
};
|
112 |
+
case SET_REGISTERED_PAYMENT_METHODS:
|
113 |
+
return {
|
114 |
+
...state,
|
115 |
+
paymentMethods,
|
116 |
+
};
|
117 |
+
case SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
|
118 |
+
return {
|
119 |
+
...state,
|
120 |
+
expressPaymentMethods: paymentMethods,
|
121 |
+
};
|
122 |
+
case SET_SHOULD_SAVE_PAYMENT_METHOD:
|
123 |
+
return {
|
124 |
+
...state,
|
125 |
+
shouldSavePaymentMethod,
|
126 |
+
};
|
127 |
+
}
|
128 |
+
return state;
|
129 |
+
};
|
130 |
+
|
131 |
+
export default reducer;
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/payment-methods/test/payment-method-data-context.js
RENAMED
@@ -11,8 +11,10 @@ import {
|
|
11 |
__experimentalDeRegisterPaymentMethod,
|
12 |
__experimentalDeRegisterExpressPaymentMethod,
|
13 |
} from '@woocommerce/blocks-registry';
|
14 |
-
import {
|
15 |
-
|
|
|
|
|
16 |
/**
|
17 |
* Internal dependencies
|
18 |
*/
|
@@ -20,15 +22,10 @@ import {
|
|
20 |
usePaymentMethodDataContext,
|
21 |
PaymentMethodDataProvider,
|
22 |
} from '../payment-method-data-context';
|
23 |
-
import {
|
24 |
-
CheckoutExpressPayment,
|
25 |
-
SavedPaymentMethodOptions,
|
26 |
-
} from '../../../../../../blocks/cart-checkout/payment-methods';
|
27 |
-
import { defaultCartState } from '../../../../../../data/default-states';
|
28 |
|
29 |
jest.mock( '@woocommerce/settings', () => {
|
30 |
const originalModule = jest.requireActual( '@woocommerce/settings' );
|
31 |
-
|
32 |
return {
|
33 |
// @ts-ignore We know @woocommerce/settings is an object.
|
34 |
...originalModule,
|
@@ -130,11 +127,10 @@ describe( 'Testing Payment Method Data Context Provider', () => {
|
|
130 |
if ( req.url.match( /wc\/store\/cart/ ) ) {
|
131 |
return Promise.resolve( JSON.stringify( previewCart ) );
|
132 |
}
|
133 |
-
return Promise.resolve( '' );
|
134 |
} );
|
135 |
// need to clear the store resolution state between tests.
|
136 |
await dispatch( storeKey ).invalidateResolutionForStore();
|
137 |
-
await dispatch( storeKey ).receiveCart( defaultCartState
|
138 |
} );
|
139 |
afterEach( async () => {
|
140 |
resetMockPaymentMethods();
|
@@ -185,8 +181,6 @@ describe( 'Testing Payment Method Data Context Provider', () => {
|
|
185 |
);
|
186 |
expect( activePaymentMethod ).not.toBeNull();
|
187 |
} );
|
188 |
-
// ["`select` control in `@wordpress/data-controls` is deprecated. Please use built-in `resolveSelect` control in `@wordpress/data` instead."]
|
189 |
-
expect( console ).toHaveWarned();
|
190 |
} );
|
191 |
|
192 |
it( 'resets saved payment method data after starting and closing an express payment method', async () => {
|
11 |
__experimentalDeRegisterPaymentMethod,
|
12 |
__experimentalDeRegisterExpressPaymentMethod,
|
13 |
} from '@woocommerce/blocks-registry';
|
14 |
+
import {
|
15 |
+
CheckoutExpressPayment,
|
16 |
+
SavedPaymentMethodOptions,
|
17 |
+
} from '@woocommerce/base-components/payment-methods';
|
18 |
/**
|
19 |
* Internal dependencies
|
20 |
*/
|
22 |
usePaymentMethodDataContext,
|
23 |
PaymentMethodDataProvider,
|
24 |
} from '../payment-method-data-context';
|
25 |
+
import { defaultCartState } from '../../../../../data/default-states';
|
|
|
|
|
|
|
|
|
26 |
|
27 |
jest.mock( '@woocommerce/settings', () => {
|
28 |
const originalModule = jest.requireActual( '@woocommerce/settings' );
|
|
|
29 |
return {
|
30 |
// @ts-ignore We know @woocommerce/settings is an object.
|
31 |
...originalModule,
|
127 |
if ( req.url.match( /wc\/store\/cart/ ) ) {
|
128 |
return Promise.resolve( JSON.stringify( previewCart ) );
|
129 |
}
|
|
|
130 |
} );
|
131 |
// need to clear the store resolution state between tests.
|
132 |
await dispatch( storeKey ).invalidateResolutionForStore();
|
133 |
+
await dispatch( storeKey ).receiveCart( defaultCartState );
|
134 |
} );
|
135 |
afterEach( async () => {
|
136 |
resetMockPaymentMethods();
|
181 |
);
|
182 |
expect( activePaymentMethod ).not.toBeNull();
|
183 |
} );
|
|
|
|
|
184 |
} );
|
185 |
|
186 |
it( 'resets saved payment method data after starting and closing an express payment method', async () => {
|
assets/js/base/context/{providers/cart-checkout/payment-methods/use-payment-method-registration.ts → cart-checkout/payment-methods/use-payment-method-registration.js}
RENAMED
@@ -7,48 +7,51 @@ import {
|
|
7 |
getExpressPaymentMethods,
|
8 |
} from '@woocommerce/blocks-registry';
|
9 |
import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
|
10 |
-
import {
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
/**
|
14 |
* Internal dependencies
|
15 |
*/
|
16 |
-
import { useEditorContext } from '../../editor
|
17 |
import { useShippingDataContext } from '../shipping';
|
18 |
-
import { useCustomerDataContext } from '../customer';
|
19 |
-
import type {
|
20 |
-
PaymentMethodsDispatcherType,
|
21 |
-
PaymentMethods,
|
22 |
-
ExpressPaymentMethods,
|
23 |
-
PaymentMethodConfig,
|
24 |
-
ExpressPaymentMethodConfig,
|
25 |
-
} from './types';
|
26 |
-
import { useStoreCart } from '../../../hooks/cart/use-store-cart';
|
27 |
-
import { useStoreNotices } from '../../../hooks/use-store-notices';
|
28 |
-
import { useEmitResponse } from '../../../hooks/use-emit-response';
|
29 |
|
30 |
/**
|
31 |
* This hook handles initializing registered payment methods and exposing all
|
32 |
* registered payment methods that can be used in the current environment (via
|
33 |
* the payment method's `canMakePayment` property).
|
34 |
*
|
35 |
-
* @param {function(Object):undefined} dispatcher A dispatcher for setting registered
|
36 |
-
*
|
37 |
-
*
|
38 |
-
* @param {
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
*
|
40 |
-
* @return {boolean} Whether the payment methods have been initialized or not. True when all payment
|
|
|
41 |
*/
|
42 |
const usePaymentMethodRegistration = (
|
43 |
-
dispatcher
|
44 |
-
registeredPaymentMethods
|
45 |
-
paymentMethodsSortOrder
|
46 |
-
noticeContext
|
47 |
) => {
|
48 |
const [ isInitialized, setIsInitialized ] = useState( false );
|
49 |
const { isEditor } = useEditorContext();
|
50 |
-
const { selectedRates } = useShippingDataContext();
|
51 |
-
const { billingData, shippingAddress } = useCustomerDataContext();
|
52 |
const selectedShippingMethods = useShallowEqual( selectedRates );
|
53 |
const paymentMethodsOrder = useShallowEqual( paymentMethodsSortOrder );
|
54 |
const {
|
@@ -59,7 +62,6 @@ const usePaymentMethodRegistration = (
|
|
59 |
const canPayArgument = useRef( {
|
60 |
cartTotals,
|
61 |
cartNeedsShipping,
|
62 |
-
billingData,
|
63 |
shippingAddress,
|
64 |
selectedShippingMethods,
|
65 |
paymentRequirements,
|
@@ -70,7 +72,6 @@ const usePaymentMethodRegistration = (
|
|
70 |
canPayArgument.current = {
|
71 |
cartTotals,
|
72 |
cartNeedsShipping,
|
73 |
-
billingData,
|
74 |
shippingAddress,
|
75 |
selectedShippingMethods,
|
76 |
paymentRequirements,
|
@@ -78,7 +79,6 @@ const usePaymentMethodRegistration = (
|
|
78 |
}, [
|
79 |
cartTotals,
|
80 |
cartNeedsShipping,
|
81 |
-
billingData,
|
82 |
shippingAddress,
|
83 |
selectedShippingMethods,
|
84 |
paymentRequirements,
|
@@ -87,9 +87,7 @@ const usePaymentMethodRegistration = (
|
|
87 |
const refreshCanMakePayments = useCallback( async () => {
|
88 |
let availablePaymentMethods = {};
|
89 |
|
90 |
-
const addAvailablePaymentMethod = (
|
91 |
-
paymentMethod: PaymentMethodConfig | ExpressPaymentMethodConfig
|
92 |
-
) => {
|
93 |
availablePaymentMethods = {
|
94 |
...availablePaymentMethods,
|
95 |
[ paymentMethod.name ]: paymentMethod,
|
@@ -103,25 +101,15 @@ const usePaymentMethodRegistration = (
|
|
103 |
continue;
|
104 |
}
|
105 |
|
106 |
-
//
|
107 |
try {
|
108 |
-
const canPay =
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
)
|
114 |
-
);
|
115 |
-
|
116 |
-
if ( !! canPay ) {
|
117 |
-
if (
|
118 |
-
typeof canPay === 'object' &&
|
119 |
-
canPay !== null &&
|
120 |
-
canPay.error
|
121 |
-
) {
|
122 |
throw new Error( canPay.error.message );
|
123 |
}
|
124 |
-
|
125 |
addAvailablePaymentMethod( paymentMethod );
|
126 |
}
|
127 |
} catch ( e ) {
|
@@ -147,7 +135,7 @@ const usePaymentMethodRegistration = (
|
|
147 |
|
148 |
// Note: some payment methods use the `canMakePayment` callback to initialize / setup.
|
149 |
// Example: Stripe CC, Stripe Payment Request.
|
150 |
-
// That's why we track "is
|
151 |
setIsInitialized( true );
|
152 |
}, [
|
153 |
addErrorNotice,
|
@@ -180,16 +168,14 @@ const usePaymentMethodRegistration = (
|
|
180 |
*
|
181 |
* @return {boolean} True when standard payment methods have been initialized.
|
182 |
*/
|
183 |
-
export const usePaymentMethods = (
|
184 |
-
|
185 |
-
): boolean => {
|
186 |
-
const standardMethods: PaymentMethods = getPaymentMethods() as PaymentMethods;
|
187 |
const { noticeContexts } = useEmitResponse();
|
188 |
// Ensure all methods are present in order.
|
189 |
-
// Some payment methods may not be present in
|
190 |
// depend on state, e.g. COD can depend on shipping method.
|
191 |
const displayOrder = new Set( [
|
192 |
-
...
|
193 |
...Object.keys( standardMethods ),
|
194 |
] );
|
195 |
return usePaymentMethodRegistration(
|
@@ -207,10 +193,8 @@ export const usePaymentMethods = (
|
|
207 |
*
|
208 |
* @return {boolean} True when express payment methods have been initialized.
|
209 |
*/
|
210 |
-
export const useExpressPaymentMethods = (
|
211 |
-
|
212 |
-
): boolean => {
|
213 |
-
const expressMethods: ExpressPaymentMethods = getExpressPaymentMethods() as ExpressPaymentMethods;
|
214 |
const { noticeContexts } = useEmitResponse();
|
215 |
return usePaymentMethodRegistration(
|
216 |
dispatcher,
|
7 |
getExpressPaymentMethods,
|
8 |
} from '@woocommerce/blocks-registry';
|
9 |
import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
|
10 |
+
import {
|
11 |
+
useEmitResponse,
|
12 |
+
useShallowEqual,
|
13 |
+
useStoreCart,
|
14 |
+
useStoreNotices,
|
15 |
+
} from '@woocommerce/base-hooks';
|
16 |
+
import {
|
17 |
+
CURRENT_USER_IS_ADMIN,
|
18 |
+
PAYMENT_GATEWAY_SORT_ORDER,
|
19 |
+
} from '@woocommerce/block-settings';
|
20 |
|
21 |
/**
|
22 |
* Internal dependencies
|
23 |
*/
|
24 |
+
import { useEditorContext } from '../../editor';
|
25 |
import { useShippingDataContext } from '../shipping';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
|
27 |
/**
|
28 |
* This hook handles initializing registered payment methods and exposing all
|
29 |
* registered payment methods that can be used in the current environment (via
|
30 |
* the payment method's `canMakePayment` property).
|
31 |
*
|
32 |
+
* @param {function(Object):undefined} dispatcher A dispatcher for setting registered
|
33 |
+
* payment methods to an external
|
34 |
+
* state.
|
35 |
+
* @param {Object} registeredPaymentMethods Registered payment methods to
|
36 |
+
* process.
|
37 |
+
* @param {Array} paymentMethodsSortOrder Array of payment method names to
|
38 |
+
* sort by. This should match keys of
|
39 |
+
* registeredPaymentMethods.
|
40 |
+
* @param {string} noticeContext Id of the context to append
|
41 |
+
* notices to.
|
42 |
*
|
43 |
+
* @return {boolean} Whether the payment methods have been initialized or not. True when all payment
|
44 |
+
* methods have been initialized.
|
45 |
*/
|
46 |
const usePaymentMethodRegistration = (
|
47 |
+
dispatcher,
|
48 |
+
registeredPaymentMethods,
|
49 |
+
paymentMethodsSortOrder,
|
50 |
+
noticeContext
|
51 |
) => {
|
52 |
const [ isInitialized, setIsInitialized ] = useState( false );
|
53 |
const { isEditor } = useEditorContext();
|
54 |
+
const { selectedRates, shippingAddress } = useShippingDataContext();
|
|
|
55 |
const selectedShippingMethods = useShallowEqual( selectedRates );
|
56 |
const paymentMethodsOrder = useShallowEqual( paymentMethodsSortOrder );
|
57 |
const {
|
62 |
const canPayArgument = useRef( {
|
63 |
cartTotals,
|
64 |
cartNeedsShipping,
|
|
|
65 |
shippingAddress,
|
66 |
selectedShippingMethods,
|
67 |
paymentRequirements,
|
72 |
canPayArgument.current = {
|
73 |
cartTotals,
|
74 |
cartNeedsShipping,
|
|
|
75 |
shippingAddress,
|
76 |
selectedShippingMethods,
|
77 |
paymentRequirements,
|
79 |
}, [
|
80 |
cartTotals,
|
81 |
cartNeedsShipping,
|
|
|
82 |
shippingAddress,
|
83 |
selectedShippingMethods,
|
84 |
paymentRequirements,
|
87 |
const refreshCanMakePayments = useCallback( async () => {
|
88 |
let availablePaymentMethods = {};
|
89 |
|
90 |
+
const addAvailablePaymentMethod = ( paymentMethod ) => {
|
|
|
|
|
91 |
availablePaymentMethods = {
|
92 |
...availablePaymentMethods,
|
93 |
[ paymentMethod.name ]: paymentMethod,
|
101 |
continue;
|
102 |
}
|
103 |
|
104 |
+
// In front end, ask payment method if it should be available.
|
105 |
try {
|
106 |
+
const canPay = await Promise.resolve(
|
107 |
+
paymentMethod.canMakePayment( canPayArgument.current )
|
108 |
+
);
|
109 |
+
if ( canPay ) {
|
110 |
+
if ( canPay.error ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
111 |
throw new Error( canPay.error.message );
|
112 |
}
|
|
|
113 |
addAvailablePaymentMethod( paymentMethod );
|
114 |
}
|
115 |
} catch ( e ) {
|
135 |
|
136 |
// Note: some payment methods use the `canMakePayment` callback to initialize / setup.
|
137 |
// Example: Stripe CC, Stripe Payment Request.
|
138 |
+
// That's why we track "is initialised" state here.
|
139 |
setIsInitialized( true );
|
140 |
}, [
|
141 |
addErrorNotice,
|
168 |
*
|
169 |
* @return {boolean} True when standard payment methods have been initialized.
|
170 |
*/
|
171 |
+
export const usePaymentMethods = ( dispatcher ) => {
|
172 |
+
const standardMethods = getPaymentMethods();
|
|
|
|
|
173 |
const { noticeContexts } = useEmitResponse();
|
174 |
// Ensure all methods are present in order.
|
175 |
+
// Some payment methods may not be present in PAYMENT_GATEWAY_SORT_ORDER if they
|
176 |
// depend on state, e.g. COD can depend on shipping method.
|
177 |
const displayOrder = new Set( [
|
178 |
+
...PAYMENT_GATEWAY_SORT_ORDER,
|
179 |
...Object.keys( standardMethods ),
|
180 |
] );
|
181 |
return usePaymentMethodRegistration(
|
193 |
*
|
194 |
* @return {boolean} True when express payment methods have been initialized.
|
195 |
*/
|
196 |
+
export const useExpressPaymentMethods = ( dispatcher ) => {
|
197 |
+
const expressMethods = getExpressPaymentMethods();
|
|
|
|
|
198 |
const { noticeContexts } = useEmitResponse();
|
199 |
return usePaymentMethodRegistration(
|
200 |
dispatcher,
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/constants.js
RENAMED
File without changes
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/event-emit.js
RENAMED
@@ -1,7 +1,7 @@
|
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
-
import { emitterCallback, reducer, emitEvent } from '
|
5 |
|
6 |
const EMIT_TYPES = {
|
7 |
SHIPPING_RATES_SUCCESS: 'shipping_rates_success',
|
@@ -21,7 +21,7 @@ const EMIT_TYPES = {
|
|
21 |
* @param {Function} dispatcher A reducer dispatcher
|
22 |
* @return {Object} An object with `onSuccess` and `onFail` emitter registration.
|
23 |
*/
|
24 |
-
const
|
25 |
onSuccess: emitterCallback( EMIT_TYPES.SHIPPING_RATES_SUCCESS, dispatcher ),
|
26 |
onFail: emitterCallback( EMIT_TYPES.SHIPPING_RATES_FAIL, dispatcher ),
|
27 |
onSelectSuccess: emitterCallback(
|
@@ -34,4 +34,4 @@ const emitterObservers = ( dispatcher ) => ( {
|
|
34 |
),
|
35 |
} );
|
36 |
|
37 |
-
export { EMIT_TYPES,
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
+
import { emitterCallback, reducer, emitEvent } from '../../shared/event-emit';
|
5 |
|
6 |
const EMIT_TYPES = {
|
7 |
SHIPPING_RATES_SUCCESS: 'shipping_rates_success',
|
21 |
* @param {Function} dispatcher A reducer dispatcher
|
22 |
* @return {Object} An object with `onSuccess` and `onFail` emitter registration.
|
23 |
*/
|
24 |
+
const emitterSubscribers = ( dispatcher ) => ( {
|
25 |
onSuccess: emitterCallback( EMIT_TYPES.SHIPPING_RATES_SUCCESS, dispatcher ),
|
26 |
onFail: emitterCallback( EMIT_TYPES.SHIPPING_RATES_FAIL, dispatcher ),
|
27 |
onSelectSuccess: emitterCallback(
|
34 |
),
|
35 |
} );
|
36 |
|
37 |
+
export { EMIT_TYPES, emitterSubscribers, reducer, emitEvent };
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/index.js
RENAMED
@@ -9,6 +9,7 @@ import {
|
|
9 |
useMemo,
|
10 |
useRef,
|
11 |
} from '@wordpress/element';
|
|
|
12 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
13 |
import { deriveSelectedShippingRates } from '@woocommerce/base-utils';
|
14 |
|
@@ -20,14 +21,12 @@ import { hasInvalidShippingAddress } from './utils';
|
|
20 |
import { errorStatusReducer } from './reducers';
|
21 |
import {
|
22 |
EMIT_TYPES,
|
23 |
-
|
24 |
reducer as emitReducer,
|
25 |
emitEvent,
|
26 |
} from './event-emit';
|
27 |
import { useCheckoutContext } from '../checkout-state';
|
28 |
import { useCustomerDataContext } from '../customer';
|
29 |
-
import { useStoreCart } from '../../../hooks/cart/use-store-cart';
|
30 |
-
import { useSelectShippingRates } from '../../../hooks/shipping/use-select-shipping-rates';
|
31 |
|
32 |
/**
|
33 |
* @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
|
@@ -65,19 +64,18 @@ export const ShippingDataProvider = ( { children } ) => {
|
|
65 |
errorStatusReducer,
|
66 |
NONE
|
67 |
);
|
68 |
-
const [ observers,
|
69 |
const currentObservers = useRef( observers );
|
70 |
-
const
|
71 |
() => ( {
|
72 |
-
onShippingRateSuccess:
|
73 |
-
|
74 |
-
|
75 |
-
onShippingRateSelectSuccess: emitterObservers( observerDispatch )
|
76 |
.onSelectSuccess,
|
77 |
-
onShippingRateSelectFail:
|
78 |
.onSelectFail,
|
79 |
} ),
|
80 |
-
[
|
81 |
);
|
82 |
|
83 |
// set observers on ref so it's always current.
|
@@ -219,7 +217,7 @@ export const ShippingDataProvider = ( { children } ) => {
|
|
219 |
setShippingAddress,
|
220 |
needsShipping,
|
221 |
hasCalculatedShipping,
|
222 |
-
...
|
223 |
};
|
224 |
|
225 |
return (
|
9 |
useMemo,
|
10 |
useRef,
|
11 |
} from '@wordpress/element';
|
12 |
+
import { useStoreCart, useSelectShippingRates } from '@woocommerce/base-hooks';
|
13 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
14 |
import { deriveSelectedShippingRates } from '@woocommerce/base-utils';
|
15 |
|
21 |
import { errorStatusReducer } from './reducers';
|
22 |
import {
|
23 |
EMIT_TYPES,
|
24 |
+
emitterSubscribers,
|
25 |
reducer as emitReducer,
|
26 |
emitEvent,
|
27 |
} from './event-emit';
|
28 |
import { useCheckoutContext } from '../checkout-state';
|
29 |
import { useCustomerDataContext } from '../customer';
|
|
|
|
|
30 |
|
31 |
/**
|
32 |
* @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
|
64 |
errorStatusReducer,
|
65 |
NONE
|
66 |
);
|
67 |
+
const [ observers, subscriber ] = useReducer( emitReducer, {} );
|
68 |
const currentObservers = useRef( observers );
|
69 |
+
const eventSubscribers = useMemo(
|
70 |
() => ( {
|
71 |
+
onShippingRateSuccess: emitterSubscribers( subscriber ).onSuccess,
|
72 |
+
onShippingRateFail: emitterSubscribers( subscriber ).onFail,
|
73 |
+
onShippingRateSelectSuccess: emitterSubscribers( subscriber )
|
|
|
74 |
.onSelectSuccess,
|
75 |
+
onShippingRateSelectFail: emitterSubscribers( subscriber )
|
76 |
.onSelectFail,
|
77 |
} ),
|
78 |
+
[ subscriber ]
|
79 |
);
|
80 |
|
81 |
// set observers on ref so it's always current.
|
217 |
setShippingAddress,
|
218 |
needsShipping,
|
219 |
hasCalculatedShipping,
|
220 |
+
...eventSubscribers,
|
221 |
};
|
222 |
|
223 |
return (
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/reducers.js
RENAMED
File without changes
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/utils.js
RENAMED
File without changes
|
assets/js/base/context/{providers/container-width-context.js → container-width-context.js}
RENAMED
File without changes
|
assets/js/base/context/{providers/editor-context.js → editor/index.js}
RENAMED
@@ -1,7 +1,7 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import { createContext, useContext
|
5 |
import { useSelect } from '@wordpress/data';
|
6 |
|
7 |
/**
|
@@ -13,7 +13,6 @@ const EditorContext = createContext( {
|
|
13 |
isEditor: false,
|
14 |
currentPostId: 0,
|
15 |
previewData: {},
|
16 |
-
getPreviewData: () => void null,
|
17 |
} );
|
18 |
|
19 |
/**
|
@@ -50,16 +49,6 @@ export const EditorProvider = ( {
|
|
50 |
[ currentPostId ]
|
51 |
);
|
52 |
|
53 |
-
const getPreviewData = useCallback(
|
54 |
-
( name ) => {
|
55 |
-
if ( name in previewData ) {
|
56 |
-
return previewData[ name ];
|
57 |
-
}
|
58 |
-
return {};
|
59 |
-
},
|
60 |
-
[ previewData ]
|
61 |
-
);
|
62 |
-
|
63 |
/**
|
64 |
* @type {EditorDataContext}
|
65 |
*/
|
@@ -67,7 +56,6 @@ export const EditorProvider = ( {
|
|
67 |
isEditor: true,
|
68 |
currentPostId: editingPostId,
|
69 |
previewData,
|
70 |
-
getPreviewData,
|
71 |
};
|
72 |
|
73 |
return (
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { createContext, useContext } from '@wordpress/element';
|
5 |
import { useSelect } from '@wordpress/data';
|
6 |
|
7 |
/**
|
13 |
isEditor: false,
|
14 |
currentPostId: 0,
|
15 |
previewData: {},
|
|
|
16 |
} );
|
17 |
|
18 |
/**
|
49 |
[ currentPostId ]
|
50 |
);
|
51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
/**
|
53 |
* @type {EditorDataContext}
|
54 |
*/
|
56 |
isEditor: true,
|
57 |
currentPostId: editingPostId,
|
58 |
previewData,
|
|
|
59 |
};
|
60 |
|
61 |
return (
|
assets/js/base/context/event-emit/emitter-callback.ts
DELETED
@@ -1,16 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import { actions } from './reducer';
|
5 |
-
import type { ActionType, ActionCallbackType } from './types';
|
6 |
-
|
7 |
-
export const emitterCallback = (
|
8 |
-
type: string,
|
9 |
-
observerDispatch: React.Dispatch< ActionType >
|
10 |
-
) => ( callback: ActionCallbackType, priority = 10 ): ( () => void ) => {
|
11 |
-
const action = actions.addEventCallback( type, callback, priority );
|
12 |
-
observerDispatch( action );
|
13 |
-
return () => {
|
14 |
-
observerDispatch( actions.removeEventCallback( type, action.id ) );
|
15 |
-
};
|
16 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/event-emit/reducer.ts
DELETED
@@ -1,65 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { uniqueId } from 'lodash';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import {
|
10 |
-
ACTION,
|
11 |
-
ActionType,
|
12 |
-
ActionCallbackType,
|
13 |
-
EventObserversType,
|
14 |
-
} from './types';
|
15 |
-
|
16 |
-
export const actions = {
|
17 |
-
addEventCallback: (
|
18 |
-
eventType: string,
|
19 |
-
callback: ActionCallbackType,
|
20 |
-
priority = 10
|
21 |
-
): ActionType => {
|
22 |
-
return {
|
23 |
-
id: uniqueId(),
|
24 |
-
type: ACTION.ADD_EVENT_CALLBACK,
|
25 |
-
eventType,
|
26 |
-
callback,
|
27 |
-
priority,
|
28 |
-
};
|
29 |
-
},
|
30 |
-
removeEventCallback: ( eventType: string, id: string ): ActionType => {
|
31 |
-
return {
|
32 |
-
id,
|
33 |
-
type: ACTION.REMOVE_EVENT_CALLBACK,
|
34 |
-
eventType,
|
35 |
-
};
|
36 |
-
},
|
37 |
-
};
|
38 |
-
|
39 |
-
const initialState = {} as EventObserversType;
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Handles actions for emitters
|
43 |
-
*/
|
44 |
-
export const reducer = (
|
45 |
-
state = initialState,
|
46 |
-
{ type, eventType, id, callback, priority }: ActionType
|
47 |
-
): typeof initialState => {
|
48 |
-
const newEvents = state.hasOwnProperty( eventType )
|
49 |
-
? new Map( state[ eventType ] )
|
50 |
-
: new Map();
|
51 |
-
switch ( type ) {
|
52 |
-
case ACTION.ADD_EVENT_CALLBACK:
|
53 |
-
newEvents.set( id, { priority, callback } );
|
54 |
-
return {
|
55 |
-
...state,
|
56 |
-
[ eventType ]: newEvents,
|
57 |
-
};
|
58 |
-
case ACTION.REMOVE_EVENT_CALLBACK:
|
59 |
-
newEvents.delete( id );
|
60 |
-
return {
|
61 |
-
...state,
|
62 |
-
[ eventType ]: newEvents,
|
63 |
-
};
|
64 |
-
}
|
65 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/event-emit/types.ts
DELETED
@@ -1,18 +0,0 @@
|
|
1 |
-
export enum ACTION {
|
2 |
-
ADD_EVENT_CALLBACK = 'add_event_callback',
|
3 |
-
REMOVE_EVENT_CALLBACK = 'remove_event_callback',
|
4 |
-
}
|
5 |
-
|
6 |
-
export type ActionCallbackType = ( ...args: unknown[] ) => unknown;
|
7 |
-
|
8 |
-
export type ActionType = {
|
9 |
-
type: ACTION;
|
10 |
-
eventType: string;
|
11 |
-
id: string;
|
12 |
-
callback?: ActionCallbackType;
|
13 |
-
priority?: number;
|
14 |
-
};
|
15 |
-
|
16 |
-
export type ObserverType = { priority: number; callback: ActionCallbackType };
|
17 |
-
export type ObserversType = Map< string, ObserverType >;
|
18 |
-
export type EventObserversType = Record< string, ObserversType >;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/event-emit/utils.ts
DELETED
@@ -1,15 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import type { EventObserversType, ObserverType } from './types';
|
5 |
-
|
6 |
-
export const getObserversByPriority = (
|
7 |
-
observers: EventObserversType,
|
8 |
-
eventType: string
|
9 |
-
): ObserverType[] => {
|
10 |
-
return observers[ eventType ]
|
11 |
-
? Array.from( observers[ eventType ].values() ).sort( ( a, b ) => {
|
12 |
-
return a.priority - b.priority;
|
13 |
-
} )
|
14 |
-
: [];
|
15 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/cart/use-store-cart-item-quantity.ts
DELETED
@@ -1,146 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useSelect, useDispatch } from '@wordpress/data';
|
5 |
-
import { useState, useEffect } from '@wordpress/element';
|
6 |
-
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
-
import { useDebounce } from 'use-debounce';
|
8 |
-
import { usePrevious } from '@woocommerce/base-hooks';
|
9 |
-
import { triggerFragmentRefresh } from '@woocommerce/base-utils';
|
10 |
-
import {
|
11 |
-
CartItem,
|
12 |
-
StoreCartItemQuantity,
|
13 |
-
isNumber,
|
14 |
-
isObject,
|
15 |
-
isString,
|
16 |
-
objectHasProp,
|
17 |
-
} from '@woocommerce/types';
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Internal dependencies
|
21 |
-
*/
|
22 |
-
import { useStoreCart } from './use-store-cart';
|
23 |
-
import { useCheckoutContext } from '../../providers/cart-checkout';
|
24 |
-
|
25 |
-
/**
|
26 |
-
* Ensures the object passed has props key: string and quantity: number
|
27 |
-
*/
|
28 |
-
const cartItemHasQuantityAndKey = (
|
29 |
-
cartItem: unknown /* Object that may have quantity and key */
|
30 |
-
): cartItem is Partial< CartItem > =>
|
31 |
-
isObject( cartItem ) &&
|
32 |
-
objectHasProp( cartItem, 'key' ) &&
|
33 |
-
objectHasProp( cartItem, 'quantity' ) &&
|
34 |
-
isString( cartItem.key ) &&
|
35 |
-
isNumber( cartItem.quantity );
|
36 |
-
|
37 |
-
/**
|
38 |
-
* This is a custom hook for loading the Store API /cart/ endpoint and actions for removing or changing item quantity.
|
39 |
-
*
|
40 |
-
* @see https://github.com/woocommerce/woocommerce-gutenberg-products-block/tree/trunk/src/RestApi/StoreApi
|
41 |
-
*
|
42 |
-
* @param {CartItem} cartItem The cartItem to get quantity info from and will have quantity updated on.
|
43 |
-
* @return {StoreCartItemQuantity} An object exposing data and actions relating to cart items.
|
44 |
-
*/
|
45 |
-
export const useStoreCartItemQuantity = (
|
46 |
-
cartItem: CartItem | Record< string, unknown >
|
47 |
-
): StoreCartItemQuantity => {
|
48 |
-
const verifiedCartItem = { key: '', quantity: 1 };
|
49 |
-
|
50 |
-
if ( cartItemHasQuantityAndKey( cartItem ) ) {
|
51 |
-
verifiedCartItem.key = cartItem.key;
|
52 |
-
verifiedCartItem.quantity = cartItem.quantity;
|
53 |
-
}
|
54 |
-
const {
|
55 |
-
key: cartItemKey = '',
|
56 |
-
quantity: cartItemQuantity = 1,
|
57 |
-
} = verifiedCartItem;
|
58 |
-
const { cartErrors } = useStoreCart();
|
59 |
-
const { dispatchActions } = useCheckoutContext();
|
60 |
-
|
61 |
-
// Store quantity in hook state. This is used to keep the UI updated while server request is updated.
|
62 |
-
const [ quantity, setQuantity ] = useState< number >( cartItemQuantity );
|
63 |
-
const [ debouncedQuantity ] = useDebounce< number >( quantity, 400 );
|
64 |
-
const previousDebouncedQuantity = usePrevious( debouncedQuantity );
|
65 |
-
const { removeItemFromCart, changeCartItemQuantity } = useDispatch(
|
66 |
-
storeKey
|
67 |
-
);
|
68 |
-
|
69 |
-
// Track when things are already pending updates.
|
70 |
-
const isPending = useSelect(
|
71 |
-
( select ) => {
|
72 |
-
if ( ! cartItemKey ) {
|
73 |
-
return {
|
74 |
-
quantity: false,
|
75 |
-
delete: false,
|
76 |
-
};
|
77 |
-
}
|
78 |
-
const store = select( storeKey );
|
79 |
-
return {
|
80 |
-
quantity: store.isItemPendingQuantity( cartItemKey ),
|
81 |
-
delete: store.isItemPendingDelete( cartItemKey ),
|
82 |
-
};
|
83 |
-
},
|
84 |
-
[ cartItemKey ]
|
85 |
-
);
|
86 |
-
|
87 |
-
const removeItem = () => {
|
88 |
-
return cartItemKey
|
89 |
-
? removeItemFromCart( cartItemKey ).then( () => {
|
90 |
-
triggerFragmentRefresh();
|
91 |
-
return true;
|
92 |
-
} )
|
93 |
-
: Promise.resolve( false );
|
94 |
-
};
|
95 |
-
|
96 |
-
// Observe debounced quantity value, fire action to update server on change.
|
97 |
-
useEffect( () => {
|
98 |
-
if (
|
99 |
-
cartItemKey &&
|
100 |
-
isNumber( previousDebouncedQuantity ) &&
|
101 |
-
Number.isFinite( previousDebouncedQuantity ) &&
|
102 |
-
previousDebouncedQuantity !== debouncedQuantity
|
103 |
-
) {
|
104 |
-
changeCartItemQuantity( cartItemKey, debouncedQuantity );
|
105 |
-
}
|
106 |
-
}, [
|
107 |
-
cartItemKey,
|
108 |
-
changeCartItemQuantity,
|
109 |
-
debouncedQuantity,
|
110 |
-
previousDebouncedQuantity,
|
111 |
-
] );
|
112 |
-
|
113 |
-
useEffect( () => {
|
114 |
-
if ( isPending.delete ) {
|
115 |
-
dispatchActions.incrementCalculating();
|
116 |
-
} else {
|
117 |
-
dispatchActions.decrementCalculating();
|
118 |
-
}
|
119 |
-
return () => {
|
120 |
-
if ( isPending.delete ) {
|
121 |
-
dispatchActions.decrementCalculating();
|
122 |
-
}
|
123 |
-
};
|
124 |
-
}, [ dispatchActions, isPending.delete ] );
|
125 |
-
|
126 |
-
useEffect( () => {
|
127 |
-
if ( isPending.quantity || debouncedQuantity !== quantity ) {
|
128 |
-
dispatchActions.incrementCalculating();
|
129 |
-
} else {
|
130 |
-
dispatchActions.decrementCalculating();
|
131 |
-
}
|
132 |
-
return () => {
|
133 |
-
if ( isPending.quantity || debouncedQuantity !== quantity ) {
|
134 |
-
dispatchActions.decrementCalculating();
|
135 |
-
}
|
136 |
-
};
|
137 |
-
}, [ dispatchActions, isPending.quantity, debouncedQuantity, quantity ] );
|
138 |
-
|
139 |
-
return {
|
140 |
-
isPendingDelete: isPending.delete,
|
141 |
-
quantity,
|
142 |
-
setItemQuantity: setQuantity,
|
143 |
-
removeItem,
|
144 |
-
cartItemQuantityErrors: cartErrors,
|
145 |
-
};
|
146 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/collections/index.js
DELETED
@@ -1,3 +0,0 @@
|
|
1 |
-
export * from './use-collection-data';
|
2 |
-
export * from './use-collection-header';
|
3 |
-
export * from './use-collection';
|
|
|
|
|
|
assets/js/base/context/hooks/index.js
DELETED
@@ -1,14 +0,0 @@
|
|
1 |
-
export * from './cart';
|
2 |
-
export * from './collections';
|
3 |
-
export * from './shipping';
|
4 |
-
export * from './payment-methods';
|
5 |
-
export * from './use-store-notices';
|
6 |
-
export * from './use-store-events';
|
7 |
-
export * from './use-query-state';
|
8 |
-
export * from './use-store-products';
|
9 |
-
export * from './use-store-add-to-cart';
|
10 |
-
export * from './use-customer-data';
|
11 |
-
export * from './use-checkout-address';
|
12 |
-
export * from './use-checkout-notices';
|
13 |
-
export * from './use-checkout-submit';
|
14 |
-
export * from './use-emit-response';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/payment-methods/use-payment-methods.js
DELETED
@@ -1,35 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useShallowEqual } from '@woocommerce/base-hooks';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import { usePaymentMethodDataContext } from '../../providers/cart-checkout/payment-methods';
|
10 |
-
|
11 |
-
const usePaymentMethodState = ( express = false ) => {
|
12 |
-
const {
|
13 |
-
paymentMethods,
|
14 |
-
expressPaymentMethods,
|
15 |
-
paymentMethodsInitialized,
|
16 |
-
expressPaymentMethodsInitialized,
|
17 |
-
} = usePaymentMethodDataContext();
|
18 |
-
|
19 |
-
const currentPaymentMethods = useShallowEqual( paymentMethods );
|
20 |
-
const currentExpressPaymentMethods = useShallowEqual(
|
21 |
-
expressPaymentMethods
|
22 |
-
);
|
23 |
-
|
24 |
-
return {
|
25 |
-
paymentMethods: express
|
26 |
-
? currentExpressPaymentMethods
|
27 |
-
: currentPaymentMethods,
|
28 |
-
isInitialized: express
|
29 |
-
? expressPaymentMethodsInitialized
|
30 |
-
: paymentMethodsInitialized,
|
31 |
-
};
|
32 |
-
};
|
33 |
-
|
34 |
-
export const usePaymentMethods = () => usePaymentMethodState();
|
35 |
-
export const useExpressPaymentMethods = () => usePaymentMethodState( true );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/payment-methods/utils.ts
DELETED
@@ -1,85 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { __ } from '@wordpress/i18n';
|
5 |
-
import {
|
6 |
-
CartResponseTotals,
|
7 |
-
objectHasProp,
|
8 |
-
isString,
|
9 |
-
} from '@woocommerce/types';
|
10 |
-
|
11 |
-
export interface CartTotalItem {
|
12 |
-
key: string;
|
13 |
-
label: string;
|
14 |
-
value: number;
|
15 |
-
valueWithTax: number;
|
16 |
-
}
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Prepares the total items into a shape usable for display as passed on to
|
20 |
-
* registered payment methods.
|
21 |
-
*
|
22 |
-
* @param {Object} totals Current cart total items
|
23 |
-
* @param {boolean} needsShipping Whether or not shipping is needed.
|
24 |
-
*/
|
25 |
-
export const prepareTotalItems = (
|
26 |
-
totals: CartResponseTotals,
|
27 |
-
needsShipping: boolean
|
28 |
-
): CartTotalItem[] => {
|
29 |
-
const newTotals = [];
|
30 |
-
|
31 |
-
const factory = ( label: string, property: string ): CartTotalItem => {
|
32 |
-
const taxProperty = property + '_tax';
|
33 |
-
const value =
|
34 |
-
objectHasProp( totals, property ) && isString( totals[ property ] )
|
35 |
-
? parseInt( totals[ property ] as string, 10 )
|
36 |
-
: 0;
|
37 |
-
const tax =
|
38 |
-
objectHasProp( totals, taxProperty ) &&
|
39 |
-
isString( totals[ taxProperty ] )
|
40 |
-
? parseInt( totals[ taxProperty ] as string, 10 )
|
41 |
-
: 0;
|
42 |
-
return {
|
43 |
-
key: property,
|
44 |
-
label,
|
45 |
-
value,
|
46 |
-
valueWithTax: value + tax,
|
47 |
-
};
|
48 |
-
};
|
49 |
-
|
50 |
-
newTotals.push(
|
51 |
-
factory(
|
52 |
-
__( 'Subtotal:', 'woo-gutenberg-products-block' ),
|
53 |
-
'total_items'
|
54 |
-
)
|
55 |
-
);
|
56 |
-
|
57 |
-
newTotals.push(
|
58 |
-
factory( __( 'Fees:', 'woo-gutenberg-products-block' ), 'total_fees' )
|
59 |
-
);
|
60 |
-
|
61 |
-
newTotals.push(
|
62 |
-
factory(
|
63 |
-
__( 'Discount:', 'woo-gutenberg-products-block' ),
|
64 |
-
'total_discount'
|
65 |
-
)
|
66 |
-
);
|
67 |
-
|
68 |
-
newTotals.push( {
|
69 |
-
key: 'total_tax',
|
70 |
-
label: __( 'Taxes:', 'woo-gutenberg-products-block' ),
|
71 |
-
value: parseInt( totals.total_tax, 10 ),
|
72 |
-
valueWithTax: parseInt( totals.total_tax, 10 ),
|
73 |
-
} );
|
74 |
-
|
75 |
-
if ( needsShipping ) {
|
76 |
-
newTotals.push(
|
77 |
-
factory(
|
78 |
-
__( 'Shipping:', 'woo-gutenberg-products-block' ),
|
79 |
-
'total_shipping'
|
80 |
-
)
|
81 |
-
);
|
82 |
-
}
|
83 |
-
|
84 |
-
return newTotals;
|
85 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/test/use-store-snackbar-notices.js
DELETED
@@ -1,51 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { render, act } from '@testing-library/react';
|
5 |
-
import { StoreSnackbarNoticesProvider } from '@woocommerce/base-context/providers';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import { useStoreSnackbarNotices } from '../use-store-snackbar-notices';
|
11 |
-
|
12 |
-
describe( 'useStoreNoticesWithSnackbar', () => {
|
13 |
-
function setup() {
|
14 |
-
const returnVal = {};
|
15 |
-
|
16 |
-
function TestComponent() {
|
17 |
-
Object.assign( returnVal, useStoreSnackbarNotices() );
|
18 |
-
|
19 |
-
return null;
|
20 |
-
}
|
21 |
-
|
22 |
-
render(
|
23 |
-
<StoreSnackbarNoticesProvider>
|
24 |
-
<TestComponent />
|
25 |
-
</StoreSnackbarNoticesProvider>
|
26 |
-
);
|
27 |
-
|
28 |
-
return returnVal;
|
29 |
-
}
|
30 |
-
|
31 |
-
test( 'allows adding and removing notices and checking if there are notices of a specific type', () => {
|
32 |
-
const storeNoticesData = setup();
|
33 |
-
|
34 |
-
// Assert initial state.
|
35 |
-
expect( storeNoticesData.notices ).toEqual( [] );
|
36 |
-
|
37 |
-
// Add snackbar notice.
|
38 |
-
act( () => {
|
39 |
-
storeNoticesData.addSnackbarNotice( 'Snackbar notice' );
|
40 |
-
} );
|
41 |
-
|
42 |
-
expect( storeNoticesData.notices.length ).toBe( 1 );
|
43 |
-
|
44 |
-
// Remove all remaining notices.
|
45 |
-
act( () => {
|
46 |
-
storeNoticesData.removeNotices();
|
47 |
-
} );
|
48 |
-
|
49 |
-
expect( storeNoticesData.notices.length ).toBe( 0 );
|
50 |
-
} );
|
51 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/use-emit-response.ts
DELETED
@@ -1,66 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { isObject } from '@woocommerce/types';
|
5 |
-
|
6 |
-
export enum responseTypes {
|
7 |
-
SUCCESS = 'success',
|
8 |
-
FAIL = 'failure',
|
9 |
-
ERROR = 'error',
|
10 |
-
}
|
11 |
-
|
12 |
-
export enum noticeContexts {
|
13 |
-
PAYMENTS = 'wc/payment-area',
|
14 |
-
EXPRESS_PAYMENTS = 'wc/express-payment-area',
|
15 |
-
}
|
16 |
-
|
17 |
-
export interface ResponseType extends Record< string, unknown > {
|
18 |
-
type: responseTypes;
|
19 |
-
retry?: boolean;
|
20 |
-
}
|
21 |
-
|
22 |
-
const isResponseOf = (
|
23 |
-
response: unknown,
|
24 |
-
type: string
|
25 |
-
): response is ResponseType => {
|
26 |
-
return isObject( response ) && 'type' in response && response.type === type;
|
27 |
-
};
|
28 |
-
|
29 |
-
export const isSuccessResponse = (
|
30 |
-
response: unknown
|
31 |
-
): response is ResponseType => {
|
32 |
-
return isResponseOf( response, responseTypes.SUCCESS );
|
33 |
-
};
|
34 |
-
|
35 |
-
export const isErrorResponse = (
|
36 |
-
response: unknown
|
37 |
-
): response is ResponseType => {
|
38 |
-
return isResponseOf( response, responseTypes.ERROR );
|
39 |
-
};
|
40 |
-
|
41 |
-
export const isFailResponse = (
|
42 |
-
response: unknown
|
43 |
-
): response is ResponseType => {
|
44 |
-
return isResponseOf( response, responseTypes.FAIL );
|
45 |
-
};
|
46 |
-
|
47 |
-
export const shouldRetry = ( response: unknown ): boolean => {
|
48 |
-
return (
|
49 |
-
! isObject( response ) ||
|
50 |
-
typeof response.retry === 'undefined' ||
|
51 |
-
response.retry === true
|
52 |
-
);
|
53 |
-
};
|
54 |
-
|
55 |
-
/**
|
56 |
-
* A custom hook exposing response utilities for emitters.
|
57 |
-
*/
|
58 |
-
export const useEmitResponse = () =>
|
59 |
-
( {
|
60 |
-
responseTypes,
|
61 |
-
noticeContexts,
|
62 |
-
shouldRetry,
|
63 |
-
isSuccessResponse,
|
64 |
-
isErrorResponse,
|
65 |
-
isFailResponse,
|
66 |
-
} as const );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/use-store-events.ts
DELETED
@@ -1,66 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { doAction } from '@wordpress/hooks';
|
5 |
-
import { useCallback, useRef, useEffect } from '@wordpress/element';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import { useStoreCart } from './cart/use-store-cart';
|
11 |
-
|
12 |
-
type StoreEvent = (
|
13 |
-
eventName: string,
|
14 |
-
eventParams?: Partial< Record< string, unknown > >
|
15 |
-
) => void;
|
16 |
-
|
17 |
-
/**
|
18 |
-
* Abstraction on top of @wordpress/hooks for dispatching events via doAction for 3rd parties to hook into.
|
19 |
-
*/
|
20 |
-
export const useStoreEvents = (): {
|
21 |
-
dispatchStoreEvent: StoreEvent;
|
22 |
-
dispatchCheckoutEvent: StoreEvent;
|
23 |
-
} => {
|
24 |
-
const storeCart = useStoreCart();
|
25 |
-
const currentStoreCart = useRef( storeCart );
|
26 |
-
|
27 |
-
// Track the latest version of the cart so we can use the current value in our callback function below without triggering
|
28 |
-
// other useEffect hooks using dispatchCheckoutEvent as a dependency.
|
29 |
-
useEffect( () => {
|
30 |
-
currentStoreCart.current = storeCart;
|
31 |
-
}, [ storeCart ] );
|
32 |
-
|
33 |
-
const dispatchStoreEvent = useCallback( ( eventName, eventParams = {} ) => {
|
34 |
-
try {
|
35 |
-
doAction(
|
36 |
-
`experimental__woocommerce_blocks-${ eventName }`,
|
37 |
-
eventParams
|
38 |
-
);
|
39 |
-
} catch ( e ) {
|
40 |
-
// We don't handle thrown errors but just console.log for troubleshooting.
|
41 |
-
// eslint-disable-next-line no-console
|
42 |
-
console.error( e );
|
43 |
-
}
|
44 |
-
}, [] );
|
45 |
-
|
46 |
-
const dispatchCheckoutEvent = useCallback(
|
47 |
-
( eventName, eventParams = {} ) => {
|
48 |
-
try {
|
49 |
-
doAction(
|
50 |
-
`experimental__woocommerce_blocks-checkout-${ eventName }`,
|
51 |
-
{
|
52 |
-
...eventParams,
|
53 |
-
storeCart: currentStoreCart.current,
|
54 |
-
}
|
55 |
-
);
|
56 |
-
} catch ( e ) {
|
57 |
-
// We don't handle thrown errors but just console.log for troubleshooting.
|
58 |
-
// eslint-disable-next-line no-console
|
59 |
-
console.error( e );
|
60 |
-
}
|
61 |
-
},
|
62 |
-
[]
|
63 |
-
);
|
64 |
-
|
65 |
-
return { dispatchStoreEvent, dispatchCheckoutEvent };
|
66 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/use-store-snackbar-notices.js
DELETED
@@ -1,52 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useMemo, useRef, useEffect } from '@wordpress/element';
|
5 |
-
import { useStoreSnackbarNoticesContext } from '@woocommerce/base-context/providers';
|
6 |
-
|
7 |
-
export const useStoreSnackbarNotices = () => {
|
8 |
-
const {
|
9 |
-
notices,
|
10 |
-
createSnackbarNotice,
|
11 |
-
removeSnackbarNotice,
|
12 |
-
setIsSuppressed,
|
13 |
-
} = useStoreSnackbarNoticesContext();
|
14 |
-
// Added to a ref so the surface for notices doesn't change frequently
|
15 |
-
// and thus can be used as dependencies on effects.
|
16 |
-
const currentNotices = useRef( notices );
|
17 |
-
|
18 |
-
// Update notices ref whenever they change
|
19 |
-
useEffect( () => {
|
20 |
-
currentNotices.current = notices;
|
21 |
-
}, [ notices ] );
|
22 |
-
|
23 |
-
const noticesApi = useMemo(
|
24 |
-
() => ( {
|
25 |
-
removeNotices: ( status = null ) => {
|
26 |
-
currentNotices.current.forEach( ( notice ) => {
|
27 |
-
if ( status === null || notice.status === status ) {
|
28 |
-
removeSnackbarNotice( notice.id );
|
29 |
-
}
|
30 |
-
} );
|
31 |
-
},
|
32 |
-
removeSnackbarNotice,
|
33 |
-
} ),
|
34 |
-
[ removeSnackbarNotice ]
|
35 |
-
);
|
36 |
-
|
37 |
-
const noticeCreators = useMemo(
|
38 |
-
() => ( {
|
39 |
-
addSnackbarNotice: ( text, noticeProps = {} ) => {
|
40 |
-
createSnackbarNotice( text, noticeProps );
|
41 |
-
},
|
42 |
-
} ),
|
43 |
-
[ createSnackbarNotice ]
|
44 |
-
);
|
45 |
-
|
46 |
-
return {
|
47 |
-
notices,
|
48 |
-
...noticesApi,
|
49 |
-
...noticeCreators,
|
50 |
-
setIsSuppressed,
|
51 |
-
};
|
52 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/index.js
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export * from './cart-checkout';
|
2 |
+
export * from './container-width-context';
|
3 |
+
export * from './query-state-context';
|
4 |
+
export * from './store-notices-context';
|
5 |
+
export * from './editor';
|
6 |
+
export * from './add-to-cart-form';
|
7 |
+
export * from './shared';
|
assets/js/base/context/index.ts
DELETED
@@ -1,3 +0,0 @@
|
|
1 |
-
export * from './event-emit';
|
2 |
-
export * from './hooks';
|
3 |
-
export * from './providers';
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/checkout-state/actions.ts
DELETED
@@ -1,110 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import type { PaymentResultDataType } from './types';
|
5 |
-
|
6 |
-
export enum ACTION {
|
7 |
-
SET_IDLE = 'set_idle',
|
8 |
-
SET_PRISTINE = 'set_pristine',
|
9 |
-
SET_REDIRECT_URL = 'set_redirect_url',
|
10 |
-
SET_COMPLETE = 'set_checkout_complete',
|
11 |
-
SET_BEFORE_PROCESSING = 'set_before_processing',
|
12 |
-
SET_AFTER_PROCESSING = 'set_after_processing',
|
13 |
-
SET_PROCESSING_RESPONSE = 'set_processing_response',
|
14 |
-
SET_PROCESSING = 'set_checkout_is_processing',
|
15 |
-
SET_HAS_ERROR = 'set_checkout_has_error',
|
16 |
-
SET_NO_ERROR = 'set_checkout_no_error',
|
17 |
-
SET_CUSTOMER_ID = 'set_checkout_customer_id',
|
18 |
-
SET_ORDER_ID = 'set_checkout_order_id',
|
19 |
-
SET_ORDER_NOTES = 'set_checkout_order_notes',
|
20 |
-
INCREMENT_CALCULATING = 'increment_calculating',
|
21 |
-
DECREMENT_CALCULATING = 'decrement_calculating',
|
22 |
-
SET_SHOULD_CREATE_ACCOUNT = 'set_should_create_account',
|
23 |
-
}
|
24 |
-
|
25 |
-
export interface ActionType {
|
26 |
-
type: ACTION;
|
27 |
-
data?:
|
28 |
-
| Record< string, unknown >
|
29 |
-
| Record< string, never >
|
30 |
-
| PaymentResultDataType;
|
31 |
-
url?: string;
|
32 |
-
customerId?: number;
|
33 |
-
orderId?: number;
|
34 |
-
shouldCreateAccount?: boolean;
|
35 |
-
hasError?: boolean;
|
36 |
-
orderNotes?: string;
|
37 |
-
}
|
38 |
-
|
39 |
-
/**
|
40 |
-
* All the actions that can be dispatched for the checkout.
|
41 |
-
*/
|
42 |
-
export const actions = {
|
43 |
-
setPristine: () =>
|
44 |
-
( {
|
45 |
-
type: ACTION.SET_PRISTINE,
|
46 |
-
} as const ),
|
47 |
-
setIdle: () =>
|
48 |
-
( {
|
49 |
-
type: ACTION.SET_IDLE,
|
50 |
-
} as const ),
|
51 |
-
setProcessing: () =>
|
52 |
-
( {
|
53 |
-
type: ACTION.SET_PROCESSING,
|
54 |
-
} as const ),
|
55 |
-
setRedirectUrl: ( url: string ) =>
|
56 |
-
( {
|
57 |
-
type: ACTION.SET_REDIRECT_URL,
|
58 |
-
url,
|
59 |
-
} as const ),
|
60 |
-
setProcessingResponse: ( data: PaymentResultDataType ) =>
|
61 |
-
( {
|
62 |
-
type: ACTION.SET_PROCESSING_RESPONSE,
|
63 |
-
data,
|
64 |
-
} as const ),
|
65 |
-
setComplete: ( data: Record< string, unknown > = {} ) =>
|
66 |
-
( {
|
67 |
-
type: ACTION.SET_COMPLETE,
|
68 |
-
data,
|
69 |
-
} as const ),
|
70 |
-
setBeforeProcessing: () =>
|
71 |
-
( {
|
72 |
-
type: ACTION.SET_BEFORE_PROCESSING,
|
73 |
-
} as const ),
|
74 |
-
setAfterProcessing: () =>
|
75 |
-
( {
|
76 |
-
type: ACTION.SET_AFTER_PROCESSING,
|
77 |
-
} as const ),
|
78 |
-
setHasError: ( hasError = true ) =>
|
79 |
-
( {
|
80 |
-
type: hasError ? ACTION.SET_HAS_ERROR : ACTION.SET_NO_ERROR,
|
81 |
-
} as const ),
|
82 |
-
incrementCalculating: () =>
|
83 |
-
( {
|
84 |
-
type: ACTION.INCREMENT_CALCULATING,
|
85 |
-
} as const ),
|
86 |
-
decrementCalculating: () =>
|
87 |
-
( {
|
88 |
-
type: ACTION.DECREMENT_CALCULATING,
|
89 |
-
} as const ),
|
90 |
-
setCustomerId: ( customerId: number ) =>
|
91 |
-
( {
|
92 |
-
type: ACTION.SET_CUSTOMER_ID,
|
93 |
-
customerId,
|
94 |
-
} as const ),
|
95 |
-
setOrderId: ( orderId: number ) =>
|
96 |
-
( {
|
97 |
-
type: ACTION.SET_ORDER_ID,
|
98 |
-
orderId,
|
99 |
-
} as const ),
|
100 |
-
setShouldCreateAccount: ( shouldCreateAccount: boolean ) =>
|
101 |
-
( {
|
102 |
-
type: ACTION.SET_SHOULD_CREATE_ACCOUNT,
|
103 |
-
shouldCreateAccount,
|
104 |
-
} as const ),
|
105 |
-
setOrderNotes: ( orderNotes: string ) =>
|
106 |
-
( {
|
107 |
-
type: ACTION.SET_ORDER_NOTES,
|
108 |
-
orderNotes,
|
109 |
-
} as const ),
|
110 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/checkout-state/constants.ts
DELETED
@@ -1,84 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { getSetting } from '@woocommerce/settings';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import type {
|
10 |
-
CheckoutStateContextType,
|
11 |
-
CheckoutStateContextState,
|
12 |
-
} from './types';
|
13 |
-
|
14 |
-
export enum STATUS {
|
15 |
-
// Checkout is in it's initialized state.
|
16 |
-
PRISTINE = 'pristine',
|
17 |
-
// When checkout state has changed but there is no activity happening.
|
18 |
-
IDLE = 'idle',
|
19 |
-
// After BEFORE_PROCESSING status emitters have finished successfully. Payment processing is started on this checkout status.
|
20 |
-
PROCESSING = 'processing',
|
21 |
-
// After the AFTER_PROCESSING event emitters have completed. This status triggers the checkout redirect.
|
22 |
-
COMPLETE = 'complete',
|
23 |
-
// This is the state before checkout processing begins after the checkout button has been pressed/submitted.
|
24 |
-
BEFORE_PROCESSING = 'before_processing',
|
25 |
-
// After server side checkout processing is completed this status is set
|
26 |
-
AFTER_PROCESSING = 'after_processing',
|
27 |
-
}
|
28 |
-
|
29 |
-
const preloadedApiRequests = getSetting( 'preloadedApiRequests', {} ) as Record<
|
30 |
-
string,
|
31 |
-
{ body: Record< string, unknown > }
|
32 |
-
>;
|
33 |
-
|
34 |
-
const checkoutData = {
|
35 |
-
order_id: 0,
|
36 |
-
customer_id: 0,
|
37 |
-
...( preloadedApiRequests[ '/wc/store/checkout' ]?.body || {} ),
|
38 |
-
};
|
39 |
-
|
40 |
-
export const DEFAULT_CHECKOUT_STATE_DATA: CheckoutStateContextType = {
|
41 |
-
dispatchActions: {
|
42 |
-
resetCheckout: () => void null,
|
43 |
-
setRedirectUrl: ( url ) => void url,
|
44 |
-
setHasError: ( hasError ) => void hasError,
|
45 |
-
setAfterProcessing: ( response ) => void response,
|
46 |
-
incrementCalculating: () => void null,
|
47 |
-
decrementCalculating: () => void null,
|
48 |
-
setCustomerId: ( id ) => void id,
|
49 |
-
setOrderId: ( id ) => void id,
|
50 |
-
setOrderNotes: ( orderNotes ) => void orderNotes,
|
51 |
-
},
|
52 |
-
onSubmit: () => void null,
|
53 |
-
isComplete: false,
|
54 |
-
isIdle: false,
|
55 |
-
isCalculating: false,
|
56 |
-
isProcessing: false,
|
57 |
-
isBeforeProcessing: false,
|
58 |
-
isAfterProcessing: false,
|
59 |
-
hasError: false,
|
60 |
-
redirectUrl: '',
|
61 |
-
orderId: 0,
|
62 |
-
orderNotes: '',
|
63 |
-
customerId: 0,
|
64 |
-
onCheckoutAfterProcessingWithSuccess: () => () => void null,
|
65 |
-
onCheckoutAfterProcessingWithError: () => () => void null,
|
66 |
-
onCheckoutBeforeProcessing: () => () => void null, // deprecated for onCheckoutValidationBeforeProcessing
|
67 |
-
onCheckoutValidationBeforeProcessing: () => () => void null,
|
68 |
-
hasOrder: false,
|
69 |
-
isCart: false,
|
70 |
-
shouldCreateAccount: false,
|
71 |
-
setShouldCreateAccount: ( value ) => void value,
|
72 |
-
};
|
73 |
-
|
74 |
-
export const DEFAULT_STATE: CheckoutStateContextState = {
|
75 |
-
redirectUrl: '',
|
76 |
-
status: STATUS.PRISTINE,
|
77 |
-
hasError: false,
|
78 |
-
calculatingCount: 0,
|
79 |
-
orderId: checkoutData.order_id,
|
80 |
-
orderNotes: '',
|
81 |
-
customerId: checkoutData.customer_id,
|
82 |
-
shouldCreateAccount: false,
|
83 |
-
processingResponse: null,
|
84 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/checkout-state/event-emit.ts
DELETED
@@ -1,62 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useMemo } from '@wordpress/element';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import {
|
10 |
-
emitterCallback,
|
11 |
-
reducer,
|
12 |
-
emitEvent,
|
13 |
-
emitEventWithAbort,
|
14 |
-
ActionType,
|
15 |
-
} from '../../../event-emit';
|
16 |
-
|
17 |
-
const EMIT_TYPES = {
|
18 |
-
CHECKOUT_VALIDATION_BEFORE_PROCESSING:
|
19 |
-
'checkout_validation_before_processing',
|
20 |
-
CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS:
|
21 |
-
'checkout_after_processing_with_success',
|
22 |
-
CHECKOUT_AFTER_PROCESSING_WITH_ERROR:
|
23 |
-
'checkout_after_processing_with_error',
|
24 |
-
};
|
25 |
-
|
26 |
-
type EventEmittersType = Record< string, ReturnType< typeof emitterCallback > >;
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Receives a reducer dispatcher and returns an object with the
|
30 |
-
* various event emitters for the payment processing events.
|
31 |
-
*
|
32 |
-
* Calling the event registration function with the callback will register it
|
33 |
-
* for the event emitter and will return a dispatcher for removing the
|
34 |
-
* registered callback (useful for implementation in `useEffect`).
|
35 |
-
*
|
36 |
-
* @param {Function} observerDispatch The emitter reducer dispatcher.
|
37 |
-
* @return {Object} An object with the various payment event emitter registration functions
|
38 |
-
*/
|
39 |
-
const useEventEmitters = (
|
40 |
-
observerDispatch: React.Dispatch< ActionType >
|
41 |
-
): EventEmittersType => {
|
42 |
-
const eventEmitters = useMemo(
|
43 |
-
() => ( {
|
44 |
-
onCheckoutAfterProcessingWithSuccess: emitterCallback(
|
45 |
-
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
|
46 |
-
observerDispatch
|
47 |
-
),
|
48 |
-
onCheckoutAfterProcessingWithError: emitterCallback(
|
49 |
-
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
|
50 |
-
observerDispatch
|
51 |
-
),
|
52 |
-
onCheckoutValidationBeforeProcessing: emitterCallback(
|
53 |
-
EMIT_TYPES.CHECKOUT_VALIDATION_BEFORE_PROCESSING,
|
54 |
-
observerDispatch
|
55 |
-
),
|
56 |
-
} ),
|
57 |
-
[ observerDispatch ]
|
58 |
-
);
|
59 |
-
return eventEmitters;
|
60 |
-
};
|
61 |
-
|
62 |
-
export { EMIT_TYPES, useEventEmitters, reducer, emitEvent, emitEventWithAbort };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/checkout-state/reducer.ts
DELETED
@@ -1,197 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import { DEFAULT_STATE, STATUS } from './constants';
|
5 |
-
import { ActionType, ACTION } from './actions';
|
6 |
-
import type { CheckoutStateContextState, PaymentResultDataType } from './types';
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Reducer for the checkout state
|
10 |
-
*
|
11 |
-
* @param {Object} state Current state.
|
12 |
-
* @param {Object} action Incoming action object.
|
13 |
-
* @param {string} action.url URL passed in.
|
14 |
-
* @param {string} action.type Type of action.
|
15 |
-
* @param {string} action.customerId Customer ID.
|
16 |
-
* @param {string} action.orderId Order ID.
|
17 |
-
* @param {Array} action.orderNotes Order notes.
|
18 |
-
* @param {boolean} action.shouldCreateAccount True if shopper has requested a user account (sign-up checkbox).
|
19 |
-
* @param {Object} action.data Other action payload.
|
20 |
-
*/
|
21 |
-
export const reducer = (
|
22 |
-
state = DEFAULT_STATE,
|
23 |
-
{
|
24 |
-
url,
|
25 |
-
type,
|
26 |
-
customerId,
|
27 |
-
orderId,
|
28 |
-
orderNotes,
|
29 |
-
shouldCreateAccount,
|
30 |
-
data,
|
31 |
-
}: ActionType
|
32 |
-
): CheckoutStateContextState => {
|
33 |
-
let newState = state;
|
34 |
-
switch ( type ) {
|
35 |
-
case ACTION.SET_PRISTINE:
|
36 |
-
newState = DEFAULT_STATE;
|
37 |
-
break;
|
38 |
-
case ACTION.SET_IDLE:
|
39 |
-
newState =
|
40 |
-
state.status !== STATUS.IDLE
|
41 |
-
? {
|
42 |
-
...state,
|
43 |
-
status: STATUS.IDLE,
|
44 |
-
}
|
45 |
-
: state;
|
46 |
-
break;
|
47 |
-
case ACTION.SET_REDIRECT_URL:
|
48 |
-
newState =
|
49 |
-
url !== undefined && url !== state.redirectUrl
|
50 |
-
? {
|
51 |
-
...state,
|
52 |
-
redirectUrl: url,
|
53 |
-
}
|
54 |
-
: state;
|
55 |
-
break;
|
56 |
-
case ACTION.SET_PROCESSING_RESPONSE:
|
57 |
-
newState = {
|
58 |
-
...state,
|
59 |
-
processingResponse: data as PaymentResultDataType,
|
60 |
-
};
|
61 |
-
break;
|
62 |
-
|
63 |
-
case ACTION.SET_COMPLETE:
|
64 |
-
newState =
|
65 |
-
state.status !== STATUS.COMPLETE
|
66 |
-
? {
|
67 |
-
...state,
|
68 |
-
status: STATUS.COMPLETE,
|
69 |
-
// @todo Investigate why redirectURL could be non-truthy and whether this would cause a bug if multiple gateways were used for payment e.g. 1st set the redirect URL but failed, and then the 2nd did not provide a redirect URL and succeeded.
|
70 |
-
redirectUrl:
|
71 |
-
data !== undefined &&
|
72 |
-
typeof data.redirectUrl === 'string' &&
|
73 |
-
data.redirectUrl
|
74 |
-
? data.redirectUrl
|
75 |
-
: state.redirectUrl,
|
76 |
-
}
|
77 |
-
: state;
|
78 |
-
break;
|
79 |
-
case ACTION.SET_PROCESSING:
|
80 |
-
newState =
|
81 |
-
state.status !== STATUS.PROCESSING
|
82 |
-
? {
|
83 |
-
...state,
|
84 |
-
status: STATUS.PROCESSING,
|
85 |
-
hasError: false,
|
86 |
-
}
|
87 |
-
: state;
|
88 |
-
// clear any error state.
|
89 |
-
newState =
|
90 |
-
newState.hasError === false
|
91 |
-
? newState
|
92 |
-
: { ...newState, hasError: false };
|
93 |
-
break;
|
94 |
-
case ACTION.SET_BEFORE_PROCESSING:
|
95 |
-
newState =
|
96 |
-
state.status !== STATUS.BEFORE_PROCESSING
|
97 |
-
? {
|
98 |
-
...state,
|
99 |
-
status: STATUS.BEFORE_PROCESSING,
|
100 |
-
hasError: false,
|
101 |
-
}
|
102 |
-
: state;
|
103 |
-
break;
|
104 |
-
case ACTION.SET_AFTER_PROCESSING:
|
105 |
-
newState =
|
106 |
-
state.status !== STATUS.AFTER_PROCESSING
|
107 |
-
? {
|
108 |
-
...state,
|
109 |
-
status: STATUS.AFTER_PROCESSING,
|
110 |
-
}
|
111 |
-
: state;
|
112 |
-
break;
|
113 |
-
case ACTION.SET_HAS_ERROR:
|
114 |
-
newState = state.hasError
|
115 |
-
? state
|
116 |
-
: {
|
117 |
-
...state,
|
118 |
-
hasError: true,
|
119 |
-
};
|
120 |
-
newState =
|
121 |
-
state.status === STATUS.PROCESSING ||
|
122 |
-
state.status === STATUS.BEFORE_PROCESSING
|
123 |
-
? {
|
124 |
-
...newState,
|
125 |
-
status: STATUS.IDLE,
|
126 |
-
}
|
127 |
-
: newState;
|
128 |
-
break;
|
129 |
-
case ACTION.SET_NO_ERROR:
|
130 |
-
newState = state.hasError
|
131 |
-
? {
|
132 |
-
...state,
|
133 |
-
hasError: false,
|
134 |
-
}
|
135 |
-
: state;
|
136 |
-
break;
|
137 |
-
case ACTION.INCREMENT_CALCULATING:
|
138 |
-
newState = {
|
139 |
-
...state,
|
140 |
-
calculatingCount: state.calculatingCount + 1,
|
141 |
-
};
|
142 |
-
break;
|
143 |
-
case ACTION.DECREMENT_CALCULATING:
|
144 |
-
newState = {
|
145 |
-
...state,
|
146 |
-
calculatingCount: Math.max( 0, state.calculatingCount - 1 ),
|
147 |
-
};
|
148 |
-
break;
|
149 |
-
case ACTION.SET_CUSTOMER_ID:
|
150 |
-
newState =
|
151 |
-
customerId !== undefined
|
152 |
-
? {
|
153 |
-
...state,
|
154 |
-
customerId,
|
155 |
-
}
|
156 |
-
: state;
|
157 |
-
break;
|
158 |
-
case ACTION.SET_ORDER_ID:
|
159 |
-
newState =
|
160 |
-
orderId !== undefined
|
161 |
-
? {
|
162 |
-
...state,
|
163 |
-
orderId,
|
164 |
-
}
|
165 |
-
: state;
|
166 |
-
break;
|
167 |
-
case ACTION.SET_SHOULD_CREATE_ACCOUNT:
|
168 |
-
if (
|
169 |
-
shouldCreateAccount !== undefined &&
|
170 |
-
shouldCreateAccount !== state.shouldCreateAccount
|
171 |
-
) {
|
172 |
-
newState = {
|
173 |
-
...state,
|
174 |
-
shouldCreateAccount,
|
175 |
-
};
|
176 |
-
}
|
177 |
-
break;
|
178 |
-
case ACTION.SET_ORDER_NOTES:
|
179 |
-
if ( orderNotes !== undefined && state.orderNotes !== orderNotes ) {
|
180 |
-
newState = {
|
181 |
-
...state,
|
182 |
-
orderNotes,
|
183 |
-
};
|
184 |
-
}
|
185 |
-
break;
|
186 |
-
}
|
187 |
-
// automatically update state to idle from pristine as soon as it
|
188 |
-
// initially changes.
|
189 |
-
if (
|
190 |
-
newState !== state &&
|
191 |
-
type !== ACTION.SET_PRISTINE &&
|
192 |
-
newState.status === STATUS.PRISTINE
|
193 |
-
) {
|
194 |
-
newState.status = STATUS.IDLE;
|
195 |
-
}
|
196 |
-
return newState;
|
197 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/checkout-state/types.ts
DELETED
@@ -1,103 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import { STATUS } from './constants';
|
5 |
-
import type { emitterCallback } from '../../../event-emit';
|
6 |
-
|
7 |
-
export interface CheckoutResponseError {
|
8 |
-
code: string;
|
9 |
-
message: string;
|
10 |
-
data: {
|
11 |
-
status: number;
|
12 |
-
};
|
13 |
-
}
|
14 |
-
|
15 |
-
export interface CheckoutResponseSuccess {
|
16 |
-
// eslint-disable-next-line camelcase
|
17 |
-
payment_result: {
|
18 |
-
// eslint-disable-next-line camelcase
|
19 |
-
payment_status: 'success' | 'failure' | 'pending' | 'error';
|
20 |
-
// eslint-disable-next-line camelcase
|
21 |
-
payment_details: Record< string, string > | Record< string, never >;
|
22 |
-
// eslint-disable-next-line camelcase
|
23 |
-
redirect_url: string;
|
24 |
-
};
|
25 |
-
}
|
26 |
-
|
27 |
-
export type CheckoutResponse = CheckoutResponseSuccess | CheckoutResponseError;
|
28 |
-
|
29 |
-
export interface PaymentResultDataType {
|
30 |
-
message: string;
|
31 |
-
paymentStatus: string;
|
32 |
-
paymentDetails: Record< string, string > | Record< string, never >;
|
33 |
-
redirectUrl: string;
|
34 |
-
}
|
35 |
-
|
36 |
-
export type CheckoutStateContextState = {
|
37 |
-
redirectUrl: string;
|
38 |
-
status: STATUS;
|
39 |
-
hasError: boolean;
|
40 |
-
calculatingCount: number;
|
41 |
-
orderId: number;
|
42 |
-
orderNotes: string;
|
43 |
-
customerId: number;
|
44 |
-
shouldCreateAccount: boolean;
|
45 |
-
processingResponse: PaymentResultDataType | null;
|
46 |
-
};
|
47 |
-
|
48 |
-
export type CheckoutStateDispatchActions = {
|
49 |
-
resetCheckout: () => void;
|
50 |
-
setRedirectUrl: ( url: string ) => void;
|
51 |
-
setHasError: ( hasError: boolean ) => void;
|
52 |
-
setAfterProcessing: ( response: CheckoutResponse ) => void;
|
53 |
-
incrementCalculating: () => void;
|
54 |
-
decrementCalculating: () => void;
|
55 |
-
setCustomerId: ( id: number ) => void;
|
56 |
-
setOrderId: ( id: number ) => void;
|
57 |
-
setOrderNotes: ( orderNotes: string ) => void;
|
58 |
-
};
|
59 |
-
|
60 |
-
export type CheckoutStateContextType = {
|
61 |
-
// Dispatch actions to the checkout provider.
|
62 |
-
dispatchActions: CheckoutStateDispatchActions;
|
63 |
-
// Submits the checkout and begins processing.
|
64 |
-
onSubmit: () => void;
|
65 |
-
// True when checkout is complete and ready for redirect.
|
66 |
-
isComplete: boolean;
|
67 |
-
// True when the checkout state has changed and checkout has no activity.
|
68 |
-
isIdle: boolean;
|
69 |
-
// True when something in the checkout is resulting in totals being calculated.
|
70 |
-
isCalculating: boolean;
|
71 |
-
// True when checkout has been submitted and is being processed. Note, payment related processing happens during this state. When payment status is success, processing happens on the server.
|
72 |
-
isProcessing: boolean;
|
73 |
-
// True during any observers executing logic before checkout processing (eg. validation).
|
74 |
-
isBeforeProcessing: boolean;
|
75 |
-
// True when checkout status is AFTER_PROCESSING.
|
76 |
-
isAfterProcessing: boolean;
|
77 |
-
// True when the checkout is in an error state. Whatever caused the error (validation/payment method) will likely have triggered a notice.
|
78 |
-
hasError: boolean;
|
79 |
-
// This is the url that checkout will redirect to when it's ready.
|
80 |
-
redirectUrl: string;
|
81 |
-
// This is the ID for the draft order if one exists.
|
82 |
-
orderId: number;
|
83 |
-
// Order notes introduced by the user in the checkout form.
|
84 |
-
orderNotes: string;
|
85 |
-
// This is the ID of the customer the draft order belongs to.
|
86 |
-
customerId: number;
|
87 |
-
// Used to register a callback that will fire after checkout has been processed and there are no errors.
|
88 |
-
onCheckoutAfterProcessingWithSuccess: ReturnType< typeof emitterCallback >;
|
89 |
-
// Used to register a callback that will fire when the checkout has been processed and has an error.
|
90 |
-
onCheckoutAfterProcessingWithError: ReturnType< typeof emitterCallback >;
|
91 |
-
// Deprecated in favour of onCheckoutValidationBeforeProcessing.
|
92 |
-
onCheckoutBeforeProcessing: ReturnType< typeof emitterCallback >;
|
93 |
-
// Used to register a callback that will fire when the checkout has been submitted before being sent off to the server.
|
94 |
-
onCheckoutValidationBeforeProcessing: ReturnType< typeof emitterCallback >;
|
95 |
-
// True when the checkout has a draft order from the API.
|
96 |
-
hasOrder: boolean;
|
97 |
-
// When true, means the provider is providing data for the cart.
|
98 |
-
isCart: boolean;
|
99 |
-
// Should a user account be created?
|
100 |
-
shouldCreateAccount: boolean;
|
101 |
-
// Set if user account should be created.
|
102 |
-
setShouldCreateAccount: ( shouldCreateAccount: boolean ) => void;
|
103 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/checkout-state/utils.ts
DELETED
@@ -1,63 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { __ } from '@wordpress/i18n';
|
5 |
-
import { decodeEntities } from '@wordpress/html-entities';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import type { PaymentResultDataType, CheckoutResponse } from './types';
|
11 |
-
|
12 |
-
/**
|
13 |
-
* Prepares the payment_result data from the server checkout endpoint response.
|
14 |
-
*/
|
15 |
-
export const getPaymentResultFromCheckoutResponse = (
|
16 |
-
response: CheckoutResponse
|
17 |
-
): PaymentResultDataType => {
|
18 |
-
const paymentResult = {
|
19 |
-
message: '',
|
20 |
-
paymentStatus: '',
|
21 |
-
redirectUrl: '',
|
22 |
-
paymentDetails: {},
|
23 |
-
} as PaymentResultDataType;
|
24 |
-
|
25 |
-
// payment_result is present in successful responses.
|
26 |
-
if ( 'payment_result' in response ) {
|
27 |
-
paymentResult.paymentStatus = response.payment_result.payment_status;
|
28 |
-
paymentResult.redirectUrl = response.payment_result.redirect_url;
|
29 |
-
|
30 |
-
if (
|
31 |
-
response.payment_result.hasOwnProperty( 'payment_details' ) &&
|
32 |
-
Array.isArray( response.payment_result.payment_details )
|
33 |
-
) {
|
34 |
-
response.payment_result.payment_details.forEach(
|
35 |
-
( { key, value }: { key: string; value: string } ) => {
|
36 |
-
paymentResult.paymentDetails[ key ] = decodeEntities(
|
37 |
-
value
|
38 |
-
);
|
39 |
-
}
|
40 |
-
);
|
41 |
-
}
|
42 |
-
}
|
43 |
-
|
44 |
-
// message is present in error responses.
|
45 |
-
if ( 'message' in response ) {
|
46 |
-
paymentResult.message = decodeEntities( response.message );
|
47 |
-
}
|
48 |
-
|
49 |
-
// If there was an error code but no message, set a default message.
|
50 |
-
if (
|
51 |
-
! paymentResult.message &&
|
52 |
-
'data' in response &&
|
53 |
-
'status' in response.data &&
|
54 |
-
response.data.status > 299
|
55 |
-
) {
|
56 |
-
paymentResult.message = __(
|
57 |
-
'Something went wrong. Please contact us to get assistance.',
|
58 |
-
'woo-gutenberg-products-block'
|
59 |
-
);
|
60 |
-
}
|
61 |
-
|
62 |
-
return paymentResult;
|
63 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/payment-methods/actions.ts
DELETED
@@ -1,78 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import { ACTION, STATUS } from './constants';
|
5 |
-
import type { PaymentMethods, ExpressPaymentMethods } from './types';
|
6 |
-
|
7 |
-
export interface ActionType {
|
8 |
-
type: ACTION | STATUS;
|
9 |
-
errorMessage?: string;
|
10 |
-
paymentMethodData?: Record< string, unknown >;
|
11 |
-
paymentMethods?: PaymentMethods | ExpressPaymentMethods;
|
12 |
-
shouldSavePaymentMethod?: boolean;
|
13 |
-
}
|
14 |
-
|
15 |
-
/**
|
16 |
-
* All the actions that can be dispatched for payment methods.
|
17 |
-
*/
|
18 |
-
export const actions = {
|
19 |
-
statusOnly: ( type: STATUS ): { type: STATUS } => ( { type } as const ),
|
20 |
-
error: ( errorMessage: string ): ActionType =>
|
21 |
-
( {
|
22 |
-
type: STATUS.ERROR,
|
23 |
-
errorMessage,
|
24 |
-
} as const ),
|
25 |
-
failed: ( {
|
26 |
-
errorMessage,
|
27 |
-
paymentMethodData,
|
28 |
-
}: {
|
29 |
-
errorMessage: string;
|
30 |
-
paymentMethodData: Record< string, unknown >;
|
31 |
-
} ): ActionType =>
|
32 |
-
( {
|
33 |
-
type: STATUS.FAILED,
|
34 |
-
errorMessage,
|
35 |
-
paymentMethodData,
|
36 |
-
} as const ),
|
37 |
-
success: ( {
|
38 |
-
paymentMethodData,
|
39 |
-
}: {
|
40 |
-
paymentMethodData?: Record< string, unknown >;
|
41 |
-
} ): ActionType =>
|
42 |
-
( {
|
43 |
-
type: STATUS.SUCCESS,
|
44 |
-
paymentMethodData,
|
45 |
-
} as const ),
|
46 |
-
started: ( {
|
47 |
-
paymentMethodData,
|
48 |
-
}: {
|
49 |
-
paymentMethodData?: Record< string, unknown >;
|
50 |
-
} ): ActionType =>
|
51 |
-
( {
|
52 |
-
type: STATUS.STARTED,
|
53 |
-
paymentMethodData,
|
54 |
-
} as const ),
|
55 |
-
setRegisteredPaymentMethods: (
|
56 |
-
paymentMethods: PaymentMethods
|
57 |
-
): ActionType =>
|
58 |
-
( {
|
59 |
-
type: ACTION.SET_REGISTERED_PAYMENT_METHODS,
|
60 |
-
paymentMethods,
|
61 |
-
} as const ),
|
62 |
-
setRegisteredExpressPaymentMethods: (
|
63 |
-
paymentMethods: ExpressPaymentMethods
|
64 |
-
): ActionType =>
|
65 |
-
( {
|
66 |
-
type: ACTION.SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
|
67 |
-
paymentMethods,
|
68 |
-
} as const ),
|
69 |
-
setShouldSavePaymentMethod: (
|
70 |
-
shouldSavePaymentMethod: boolean
|
71 |
-
): ActionType =>
|
72 |
-
( {
|
73 |
-
type: ACTION.SET_SHOULD_SAVE_PAYMENT_METHOD,
|
74 |
-
shouldSavePaymentMethod,
|
75 |
-
} as const ),
|
76 |
-
};
|
77 |
-
|
78 |
-
export default actions;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/payment-methods/event-emit.ts
DELETED
@@ -1,49 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useMemo } from '@wordpress/element';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import {
|
10 |
-
reducer,
|
11 |
-
emitEvent,
|
12 |
-
emitEventWithAbort,
|
13 |
-
emitterCallback,
|
14 |
-
ActionType,
|
15 |
-
} from '../../../event-emit';
|
16 |
-
|
17 |
-
const EMIT_TYPES = {
|
18 |
-
PAYMENT_PROCESSING: 'payment_processing',
|
19 |
-
};
|
20 |
-
|
21 |
-
type EventEmittersType = Record< string, ReturnType< typeof emitterCallback > >;
|
22 |
-
|
23 |
-
/**
|
24 |
-
* Receives a reducer dispatcher and returns an object with the
|
25 |
-
* various event emitters for the payment processing events.
|
26 |
-
*
|
27 |
-
* Calling the event registration function with the callback will register it
|
28 |
-
* for the event emitter and will return a dispatcher for removing the
|
29 |
-
* registered callback (useful for implementation in `useEffect`).
|
30 |
-
*
|
31 |
-
* @param {Function} observerDispatch The emitter reducer dispatcher.
|
32 |
-
* @return {Object} An object with the various payment event emitter registration functions
|
33 |
-
*/
|
34 |
-
const useEventEmitters = (
|
35 |
-
observerDispatch: React.Dispatch< ActionType >
|
36 |
-
): EventEmittersType => {
|
37 |
-
const eventEmitters = useMemo(
|
38 |
-
() => ( {
|
39 |
-
onPaymentProcessing: emitterCallback(
|
40 |
-
EMIT_TYPES.PAYMENT_PROCESSING,
|
41 |
-
observerDispatch
|
42 |
-
),
|
43 |
-
} ),
|
44 |
-
[ observerDispatch ]
|
45 |
-
);
|
46 |
-
return eventEmitters;
|
47 |
-
};
|
48 |
-
|
49 |
-
export { EMIT_TYPES, useEventEmitters, reducer, emitEvent, emitEventWithAbort };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/payment-methods/payment-method-data-context.tsx
DELETED
@@ -1,355 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import {
|
5 |
-
createContext,
|
6 |
-
useContext,
|
7 |
-
useReducer,
|
8 |
-
useCallback,
|
9 |
-
useRef,
|
10 |
-
useEffect,
|
11 |
-
useMemo,
|
12 |
-
} from '@wordpress/element';
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Internal dependencies
|
16 |
-
*/
|
17 |
-
import type {
|
18 |
-
CustomerPaymentMethods,
|
19 |
-
PaymentMethodDataContextType,
|
20 |
-
} from './types';
|
21 |
-
import {
|
22 |
-
STATUS,
|
23 |
-
DEFAULT_PAYMENT_DATA_CONTEXT_STATE,
|
24 |
-
DEFAULT_PAYMENT_METHOD_DATA,
|
25 |
-
} from './constants';
|
26 |
-
import reducer from './reducer';
|
27 |
-
import {
|
28 |
-
usePaymentMethods,
|
29 |
-
useExpressPaymentMethods,
|
30 |
-
} from './use-payment-method-registration';
|
31 |
-
import { usePaymentMethodDataDispatchers } from './use-payment-method-dispatchers';
|
32 |
-
import { useActivePaymentMethod } from './use-active-payment-method';
|
33 |
-
import { useCheckoutContext } from '../checkout-state';
|
34 |
-
import { useEditorContext } from '../../editor-context';
|
35 |
-
import {
|
36 |
-
EMIT_TYPES,
|
37 |
-
useEventEmitters,
|
38 |
-
emitEventWithAbort,
|
39 |
-
reducer as emitReducer,
|
40 |
-
} from './event-emit';
|
41 |
-
import { useValidationContext } from '../../validation';
|
42 |
-
import { useStoreNotices } from '../../../hooks/use-store-notices';
|
43 |
-
import { useEmitResponse } from '../../../hooks/use-emit-response';
|
44 |
-
import { getCustomerPaymentMethods } from './utils';
|
45 |
-
|
46 |
-
const PaymentMethodDataContext = createContext( DEFAULT_PAYMENT_METHOD_DATA );
|
47 |
-
|
48 |
-
export const usePaymentMethodDataContext = (): PaymentMethodDataContextType => {
|
49 |
-
return useContext( PaymentMethodDataContext );
|
50 |
-
};
|
51 |
-
|
52 |
-
/**
|
53 |
-
* PaymentMethodDataProvider is automatically included in the CheckoutDataProvider.
|
54 |
-
*
|
55 |
-
* This provides the api interface (via the context hook) for payment method status and data.
|
56 |
-
*
|
57 |
-
* @param {Object} props Incoming props for provider
|
58 |
-
* @param {Object} props.children The wrapped components in this provider.
|
59 |
-
*/
|
60 |
-
export const PaymentMethodDataProvider = ( {
|
61 |
-
children,
|
62 |
-
}: {
|
63 |
-
children: React.ReactChildren;
|
64 |
-
} ): JSX.Element => {
|
65 |
-
const {
|
66 |
-
isProcessing: checkoutIsProcessing,
|
67 |
-
isIdle: checkoutIsIdle,
|
68 |
-
isCalculating: checkoutIsCalculating,
|
69 |
-
hasError: checkoutHasError,
|
70 |
-
} = useCheckoutContext();
|
71 |
-
const { isEditor, getPreviewData } = useEditorContext();
|
72 |
-
const { setValidationErrors } = useValidationContext();
|
73 |
-
const { addErrorNotice, removeNotice } = useStoreNotices();
|
74 |
-
const {
|
75 |
-
isSuccessResponse,
|
76 |
-
isErrorResponse,
|
77 |
-
isFailResponse,
|
78 |
-
noticeContexts,
|
79 |
-
} = useEmitResponse();
|
80 |
-
const [ observers, observerDispatch ] = useReducer( emitReducer, {} );
|
81 |
-
const { onPaymentProcessing } = useEventEmitters( observerDispatch );
|
82 |
-
const currentObservers = useRef( observers );
|
83 |
-
|
84 |
-
// ensure observers are always current.
|
85 |
-
useEffect( () => {
|
86 |
-
currentObservers.current = observers;
|
87 |
-
}, [ observers ] );
|
88 |
-
|
89 |
-
const [ paymentData, dispatch ] = useReducer(
|
90 |
-
reducer,
|
91 |
-
DEFAULT_PAYMENT_DATA_CONTEXT_STATE
|
92 |
-
);
|
93 |
-
const {
|
94 |
-
dispatchActions,
|
95 |
-
setPaymentStatus,
|
96 |
-
} = usePaymentMethodDataDispatchers( dispatch );
|
97 |
-
|
98 |
-
const paymentMethodsInitialized = usePaymentMethods(
|
99 |
-
dispatchActions.setRegisteredPaymentMethods
|
100 |
-
);
|
101 |
-
|
102 |
-
const expressPaymentMethodsInitialized = useExpressPaymentMethods(
|
103 |
-
dispatchActions.setRegisteredExpressPaymentMethods
|
104 |
-
);
|
105 |
-
|
106 |
-
const {
|
107 |
-
activePaymentMethod,
|
108 |
-
activeSavedToken,
|
109 |
-
setActivePaymentMethod,
|
110 |
-
setActiveSavedToken,
|
111 |
-
} = useActivePaymentMethod();
|
112 |
-
|
113 |
-
const customerPaymentMethods = useMemo( (): CustomerPaymentMethods => {
|
114 |
-
if ( isEditor ) {
|
115 |
-
return getPreviewData(
|
116 |
-
'previewSavedPaymentMethods'
|
117 |
-
) as CustomerPaymentMethods;
|
118 |
-
}
|
119 |
-
return paymentMethodsInitialized
|
120 |
-
? getCustomerPaymentMethods( paymentData.paymentMethods )
|
121 |
-
: {};
|
122 |
-
}, [
|
123 |
-
isEditor,
|
124 |
-
getPreviewData,
|
125 |
-
paymentMethodsInitialized,
|
126 |
-
paymentData.paymentMethods,
|
127 |
-
] );
|
128 |
-
|
129 |
-
const setExpressPaymentError = useCallback(
|
130 |
-
( message ) => {
|
131 |
-
if ( message ) {
|
132 |
-
addErrorNotice( message, {
|
133 |
-
id: 'wc-express-payment-error',
|
134 |
-
context: noticeContexts.EXPRESS_PAYMENTS,
|
135 |
-
} );
|
136 |
-
} else {
|
137 |
-
removeNotice(
|
138 |
-
'wc-express-payment-error',
|
139 |
-
noticeContexts.EXPRESS_PAYMENTS
|
140 |
-
);
|
141 |
-
}
|
142 |
-
},
|
143 |
-
[ addErrorNotice, noticeContexts.EXPRESS_PAYMENTS, removeNotice ]
|
144 |
-
);
|
145 |
-
|
146 |
-
const isExpressPaymentMethodActive = Object.keys(
|
147 |
-
paymentData.expressPaymentMethods
|
148 |
-
).includes( activePaymentMethod );
|
149 |
-
|
150 |
-
const currentStatus = useMemo(
|
151 |
-
() => ( {
|
152 |
-
isPristine: paymentData.currentStatus === STATUS.PRISTINE,
|
153 |
-
isStarted: paymentData.currentStatus === STATUS.STARTED,
|
154 |
-
isProcessing: paymentData.currentStatus === STATUS.PROCESSING,
|
155 |
-
isFinished: [
|
156 |
-
STATUS.ERROR,
|
157 |
-
STATUS.FAILED,
|
158 |
-
STATUS.SUCCESS,
|
159 |
-
].includes( paymentData.currentStatus ),
|
160 |
-
hasError: paymentData.currentStatus === STATUS.ERROR,
|
161 |
-
hasFailed: paymentData.currentStatus === STATUS.FAILED,
|
162 |
-
isSuccessful: paymentData.currentStatus === STATUS.SUCCESS,
|
163 |
-
isDoingExpressPayment:
|
164 |
-
paymentData.currentStatus !== STATUS.PRISTINE &&
|
165 |
-
isExpressPaymentMethodActive,
|
166 |
-
} ),
|
167 |
-
[ paymentData.currentStatus, isExpressPaymentMethodActive ]
|
168 |
-
);
|
169 |
-
|
170 |
-
// Update the active (selected) payment method when it is empty, or invalid.
|
171 |
-
useEffect( () => {
|
172 |
-
const paymentMethodKeys = Object.keys( paymentData.paymentMethods );
|
173 |
-
const allPaymentMethodKeys = [
|
174 |
-
...paymentMethodKeys,
|
175 |
-
...Object.keys( paymentData.expressPaymentMethods ),
|
176 |
-
];
|
177 |
-
if ( ! paymentMethodsInitialized || ! paymentMethodKeys.length ) {
|
178 |
-
return;
|
179 |
-
}
|
180 |
-
|
181 |
-
setActivePaymentMethod( ( currentActivePaymentMethod ) => {
|
182 |
-
// If there's no active payment method, or the active payment method has
|
183 |
-
// been removed (e.g. COD vs shipping methods), set one as active.
|
184 |
-
// Note: It's possible that the active payment method might be an
|
185 |
-
// express payment method. So registered express payment methods are
|
186 |
-
// included in the check here.
|
187 |
-
if (
|
188 |
-
! currentActivePaymentMethod ||
|
189 |
-
! allPaymentMethodKeys.includes( currentActivePaymentMethod )
|
190 |
-
) {
|
191 |
-
setPaymentStatus().pristine();
|
192 |
-
return Object.keys( paymentData.paymentMethods )[ 0 ];
|
193 |
-
}
|
194 |
-
return currentActivePaymentMethod;
|
195 |
-
} );
|
196 |
-
}, [
|
197 |
-
paymentMethodsInitialized,
|
198 |
-
paymentData.paymentMethods,
|
199 |
-
paymentData.expressPaymentMethods,
|
200 |
-
setActivePaymentMethod,
|
201 |
-
setPaymentStatus,
|
202 |
-
] );
|
203 |
-
|
204 |
-
// flip payment to processing if checkout processing is complete, there are no errors, and payment status is started.
|
205 |
-
useEffect( () => {
|
206 |
-
if (
|
207 |
-
checkoutIsProcessing &&
|
208 |
-
! checkoutHasError &&
|
209 |
-
! checkoutIsCalculating &&
|
210 |
-
! currentStatus.isFinished
|
211 |
-
) {
|
212 |
-
setPaymentStatus().processing();
|
213 |
-
}
|
214 |
-
}, [
|
215 |
-
checkoutIsProcessing,
|
216 |
-
checkoutHasError,
|
217 |
-
checkoutIsCalculating,
|
218 |
-
currentStatus.isFinished,
|
219 |
-
setPaymentStatus,
|
220 |
-
] );
|
221 |
-
|
222 |
-
// When checkout is returned to idle, set payment status to pristine but only if payment status is already not finished.
|
223 |
-
useEffect( () => {
|
224 |
-
if ( checkoutIsIdle && ! currentStatus.isSuccessful ) {
|
225 |
-
setPaymentStatus().pristine();
|
226 |
-
}
|
227 |
-
}, [ checkoutIsIdle, currentStatus.isSuccessful, setPaymentStatus ] );
|
228 |
-
|
229 |
-
// if checkout has an error and payment is not being made with a saved token and payment status is success, then let's sync payment status back to pristine.
|
230 |
-
useEffect( () => {
|
231 |
-
if (
|
232 |
-
checkoutHasError &&
|
233 |
-
currentStatus.isSuccessful &&
|
234 |
-
! paymentData.hasSavedToken
|
235 |
-
) {
|
236 |
-
setPaymentStatus().pristine();
|
237 |
-
}
|
238 |
-
}, [
|
239 |
-
checkoutHasError,
|
240 |
-
currentStatus.isSuccessful,
|
241 |
-
paymentData.hasSavedToken,
|
242 |
-
setPaymentStatus,
|
243 |
-
] );
|
244 |
-
|
245 |
-
useEffect( () => {
|
246 |
-
// Note: the nature of this event emitter is that it will bail on any
|
247 |
-
// observer that returns a response that !== true. However, this still
|
248 |
-
// allows for other observers that return true for continuing through
|
249 |
-
// to the next observer (or bailing if there's a problem).
|
250 |
-
if ( currentStatus.isProcessing ) {
|
251 |
-
removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
|
252 |
-
emitEventWithAbort(
|
253 |
-
currentObservers.current,
|
254 |
-
EMIT_TYPES.PAYMENT_PROCESSING,
|
255 |
-
{}
|
256 |
-
).then( ( observerResponses ) => {
|
257 |
-
let successResponse, errorResponse;
|
258 |
-
observerResponses.forEach( ( response ) => {
|
259 |
-
if ( isSuccessResponse( response ) ) {
|
260 |
-
// the last observer response always "wins" for success.
|
261 |
-
successResponse = response;
|
262 |
-
}
|
263 |
-
if (
|
264 |
-
isErrorResponse( response ) ||
|
265 |
-
isFailResponse( response )
|
266 |
-
) {
|
267 |
-
errorResponse = response;
|
268 |
-
}
|
269 |
-
} );
|
270 |
-
if ( successResponse && ! errorResponse ) {
|
271 |
-
setPaymentStatus().success(
|
272 |
-
successResponse?.meta?.paymentMethodData,
|
273 |
-
successResponse?.meta?.billingData,
|
274 |
-
successResponse?.meta?.shippingData
|
275 |
-
);
|
276 |
-
} else if ( errorResponse && isFailResponse( errorResponse ) ) {
|
277 |
-
if (
|
278 |
-
errorResponse.message &&
|
279 |
-
errorResponse.message.length
|
280 |
-
) {
|
281 |
-
addErrorNotice( errorResponse.message, {
|
282 |
-
id: 'wc-payment-error',
|
283 |
-
isDismissible: false,
|
284 |
-
context:
|
285 |
-
errorResponse?.messageContext ||
|
286 |
-
noticeContexts.PAYMENTS,
|
287 |
-
} );
|
288 |
-
}
|
289 |
-
setPaymentStatus().failed(
|
290 |
-
errorResponse?.message,
|
291 |
-
errorResponse?.meta?.paymentMethodData,
|
292 |
-
errorResponse?.meta?.billingData
|
293 |
-
);
|
294 |
-
} else if ( errorResponse ) {
|
295 |
-
if (
|
296 |
-
errorResponse.message &&
|
297 |
-
errorResponse.message.length
|
298 |
-
) {
|
299 |
-
addErrorNotice( errorResponse.message, {
|
300 |
-
id: 'wc-payment-error',
|
301 |
-
isDismissible: false,
|
302 |
-
context:
|
303 |
-
errorResponse?.messageContext ||
|
304 |
-
noticeContexts.PAYMENTS,
|
305 |
-
} );
|
306 |
-
}
|
307 |
-
setPaymentStatus().error( errorResponse.message );
|
308 |
-
setValidationErrors( errorResponse?.validationErrors );
|
309 |
-
} else {
|
310 |
-
// otherwise there are no payment methods doing anything so
|
311 |
-
// just consider success
|
312 |
-
setPaymentStatus().success();
|
313 |
-
}
|
314 |
-
} );
|
315 |
-
}
|
316 |
-
}, [
|
317 |
-
currentStatus.isProcessing,
|
318 |
-
setValidationErrors,
|
319 |
-
setPaymentStatus,
|
320 |
-
removeNotice,
|
321 |
-
noticeContexts.PAYMENTS,
|
322 |
-
isSuccessResponse,
|
323 |
-
isFailResponse,
|
324 |
-
isErrorResponse,
|
325 |
-
addErrorNotice,
|
326 |
-
] );
|
327 |
-
|
328 |
-
const paymentContextData: PaymentMethodDataContextType = {
|
329 |
-
setPaymentStatus,
|
330 |
-
currentStatus,
|
331 |
-
paymentStatuses: STATUS,
|
332 |
-
paymentMethodData: paymentData.paymentMethodData,
|
333 |
-
errorMessage: paymentData.errorMessage,
|
334 |
-
activePaymentMethod,
|
335 |
-
setActivePaymentMethod,
|
336 |
-
activeSavedToken,
|
337 |
-
setActiveSavedToken,
|
338 |
-
onPaymentProcessing,
|
339 |
-
customerPaymentMethods,
|
340 |
-
paymentMethods: paymentData.paymentMethods,
|
341 |
-
expressPaymentMethods: paymentData.expressPaymentMethods,
|
342 |
-
paymentMethodsInitialized,
|
343 |
-
expressPaymentMethodsInitialized,
|
344 |
-
setExpressPaymentError,
|
345 |
-
isExpressPaymentMethodActive,
|
346 |
-
shouldSavePayment: paymentData.shouldSavePaymentMethod,
|
347 |
-
setShouldSavePayment: dispatchActions.setShouldSavePayment,
|
348 |
-
};
|
349 |
-
|
350 |
-
return (
|
351 |
-
<PaymentMethodDataContext.Provider value={ paymentContextData }>
|
352 |
-
{ children }
|
353 |
-
</PaymentMethodDataContext.Provider>
|
354 |
-
);
|
355 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/payment-methods/reducer.ts
DELETED
@@ -1,120 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import {
|
5 |
-
ACTION,
|
6 |
-
STATUS,
|
7 |
-
DEFAULT_PAYMENT_DATA_CONTEXT_STATE,
|
8 |
-
} from './constants';
|
9 |
-
import type { PaymentMethodDataContextState } from './types';
|
10 |
-
import type { ActionType } from './actions';
|
11 |
-
|
12 |
-
const hasSavedPaymentToken = (
|
13 |
-
paymentMethodData: Record< string, unknown > | undefined
|
14 |
-
): boolean => {
|
15 |
-
return !! (
|
16 |
-
typeof paymentMethodData === 'object' && paymentMethodData.isSavedToken
|
17 |
-
);
|
18 |
-
};
|
19 |
-
|
20 |
-
/**
|
21 |
-
* Reducer for payment data state
|
22 |
-
*/
|
23 |
-
const reducer = (
|
24 |
-
state = DEFAULT_PAYMENT_DATA_CONTEXT_STATE,
|
25 |
-
{
|
26 |
-
type,
|
27 |
-
paymentMethodData,
|
28 |
-
shouldSavePaymentMethod = false,
|
29 |
-
errorMessage = '',
|
30 |
-
paymentMethods = {},
|
31 |
-
}: ActionType
|
32 |
-
): PaymentMethodDataContextState => {
|
33 |
-
switch ( type ) {
|
34 |
-
case STATUS.STARTED:
|
35 |
-
return {
|
36 |
-
...state,
|
37 |
-
currentStatus: STATUS.STARTED,
|
38 |
-
paymentMethodData: paymentMethodData || state.paymentMethodData,
|
39 |
-
hasSavedToken: hasSavedPaymentToken(
|
40 |
-
paymentMethodData || state.paymentMethodData
|
41 |
-
),
|
42 |
-
};
|
43 |
-
case STATUS.ERROR:
|
44 |
-
return state.currentStatus !== STATUS.ERROR
|
45 |
-
? {
|
46 |
-
...state,
|
47 |
-
currentStatus: STATUS.ERROR,
|
48 |
-
errorMessage: errorMessage || state.errorMessage,
|
49 |
-
}
|
50 |
-
: state;
|
51 |
-
case STATUS.FAILED:
|
52 |
-
return state.currentStatus !== STATUS.FAILED
|
53 |
-
? {
|
54 |
-
...state,
|
55 |
-
currentStatus: STATUS.FAILED,
|
56 |
-
paymentMethodData:
|
57 |
-
paymentMethodData || state.paymentMethodData,
|
58 |
-
errorMessage: errorMessage || state.errorMessage,
|
59 |
-
}
|
60 |
-
: state;
|
61 |
-
case STATUS.SUCCESS:
|
62 |
-
return state.currentStatus !== STATUS.SUCCESS
|
63 |
-
? {
|
64 |
-
...state,
|
65 |
-
currentStatus: STATUS.SUCCESS,
|
66 |
-
paymentMethodData:
|
67 |
-
paymentMethodData || state.paymentMethodData,
|
68 |
-
hasSavedToken: hasSavedPaymentToken(
|
69 |
-
paymentMethodData || state.paymentMethodData
|
70 |
-
),
|
71 |
-
}
|
72 |
-
: state;
|
73 |
-
case STATUS.PROCESSING:
|
74 |
-
return state.currentStatus !== STATUS.PROCESSING
|
75 |
-
? {
|
76 |
-
...state,
|
77 |
-
currentStatus: STATUS.PROCESSING,
|
78 |
-
errorMessage: '',
|
79 |
-
}
|
80 |
-
: state;
|
81 |
-
case STATUS.COMPLETE:
|
82 |
-
return state.currentStatus !== STATUS.COMPLETE
|
83 |
-
? {
|
84 |
-
...state,
|
85 |
-
currentStatus: STATUS.COMPLETE,
|
86 |
-
}
|
87 |
-
: state;
|
88 |
-
|
89 |
-
case STATUS.PRISTINE:
|
90 |
-
return {
|
91 |
-
...DEFAULT_PAYMENT_DATA_CONTEXT_STATE,
|
92 |
-
currentStatus: STATUS.PRISTINE,
|
93 |
-
// keep payment method registration state
|
94 |
-
paymentMethods: {
|
95 |
-
...state.paymentMethods,
|
96 |
-
},
|
97 |
-
expressPaymentMethods: {
|
98 |
-
...state.expressPaymentMethods,
|
99 |
-
},
|
100 |
-
shouldSavePaymentMethod: state.shouldSavePaymentMethod,
|
101 |
-
};
|
102 |
-
case ACTION.SET_REGISTERED_PAYMENT_METHODS:
|
103 |
-
return {
|
104 |
-
...state,
|
105 |
-
paymentMethods,
|
106 |
-
};
|
107 |
-
case ACTION.SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
|
108 |
-
return {
|
109 |
-
...state,
|
110 |
-
expressPaymentMethods: paymentMethods,
|
111 |
-
};
|
112 |
-
case ACTION.SET_SHOULD_SAVE_PAYMENT_METHOD:
|
113 |
-
return {
|
114 |
-
...state,
|
115 |
-
shouldSavePaymentMethod,
|
116 |
-
};
|
117 |
-
}
|
118 |
-
};
|
119 |
-
|
120 |
-
export default reducer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/payment-methods/types.ts
DELETED
@@ -1,161 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import type { ReactNode } from 'react';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import type { emitterCallback } from '../../../event-emit';
|
10 |
-
import { STATUS } from './constants';
|
11 |
-
|
12 |
-
type ObjectType = Record< string, unknown >;
|
13 |
-
type EmptyObjectType = Record< string, never >;
|
14 |
-
|
15 |
-
export interface PaymentMethodConfig {
|
16 |
-
// A unique string to identify the payment method client side.
|
17 |
-
name: string;
|
18 |
-
// A react node for your payment method UI.
|
19 |
-
content: ReactNode;
|
20 |
-
// A react node to display a preview of your payment method in the editor.
|
21 |
-
edit: ReactNode;
|
22 |
-
// A callback to determine whether the payment method should be shown in the checkout.
|
23 |
-
canMakePayment: (
|
24 |
-
cartData: ObjectType
|
25 |
-
) => Promise< boolean | { error: { message: string } } >;
|
26 |
-
// A unique string to represent the payment method server side. If not provided, defaults to name.
|
27 |
-
paymentMethodId?: string;
|
28 |
-
// Object that describes various features provided by the payment method.
|
29 |
-
supports: ObjectType;
|
30 |
-
// Array of card types (brands) supported by the payment method. (See stripe/credit-card for example.)
|
31 |
-
icons: ObjectType;
|
32 |
-
// A react node that will be used as a label for the payment method in the checkout.
|
33 |
-
label: ReactNode;
|
34 |
-
// An accessibility label. Screen readers will output this label when the payment method is selected.
|
35 |
-
ariaLabel: string;
|
36 |
-
// Optionally customize the label text for the checkout submit (`Place Order`) button.
|
37 |
-
placeOrderButtonLabel?: string;
|
38 |
-
}
|
39 |
-
|
40 |
-
export type ExpressPaymentMethodConfig = Omit<
|
41 |
-
PaymentMethodConfig,
|
42 |
-
'icons' | 'label' | 'ariaLabel' | 'placeOrderButtonLabel'
|
43 |
-
>;
|
44 |
-
|
45 |
-
export type PaymentMethods =
|
46 |
-
| Record< string, PaymentMethodConfig >
|
47 |
-
| EmptyObjectType;
|
48 |
-
|
49 |
-
export type ExpressPaymentMethods =
|
50 |
-
| Record< string, ExpressPaymentMethodConfig >
|
51 |
-
| EmptyObjectType;
|
52 |
-
|
53 |
-
export interface CustomerPaymentMethod {
|
54 |
-
method: PaymentMethodConfig;
|
55 |
-
expires: string;
|
56 |
-
// eslint-disable-next-line camelcase
|
57 |
-
is_default: boolean;
|
58 |
-
tokenId: number;
|
59 |
-
actions: ObjectType;
|
60 |
-
}
|
61 |
-
export type CustomerPaymentMethods =
|
62 |
-
| Record< string, CustomerPaymentMethod >
|
63 |
-
| EmptyObjectType;
|
64 |
-
|
65 |
-
export type PaymentMethodDispatchers = {
|
66 |
-
setRegisteredPaymentMethods: ( paymentMethods: PaymentMethods ) => void;
|
67 |
-
setRegisteredExpressPaymentMethods: (
|
68 |
-
paymentMethods: ExpressPaymentMethods
|
69 |
-
) => void;
|
70 |
-
setShouldSavePayment: ( shouldSave: boolean ) => void;
|
71 |
-
};
|
72 |
-
|
73 |
-
export interface PaymentStatusDispatchers {
|
74 |
-
pristine: () => void;
|
75 |
-
started: ( paymentMethodData?: ObjectType | EmptyObjectType ) => void;
|
76 |
-
processing: () => void;
|
77 |
-
completed: () => void;
|
78 |
-
error: ( error: string ) => void;
|
79 |
-
failed: (
|
80 |
-
error?: string,
|
81 |
-
paymentMethodData?: ObjectType | EmptyObjectType,
|
82 |
-
billingData?: ObjectType | EmptyObjectType
|
83 |
-
) => void;
|
84 |
-
success: (
|
85 |
-
paymentMethodData?: ObjectType | EmptyObjectType,
|
86 |
-
billingData?: ObjectType | EmptyObjectType,
|
87 |
-
shippingData?: ObjectType | EmptyObjectType
|
88 |
-
) => void;
|
89 |
-
}
|
90 |
-
|
91 |
-
export interface PaymentMethodDataContextState {
|
92 |
-
currentStatus: STATUS;
|
93 |
-
shouldSavePaymentMethod: boolean;
|
94 |
-
paymentMethodData: ObjectType | EmptyObjectType;
|
95 |
-
hasSavedToken: boolean;
|
96 |
-
errorMessage: string;
|
97 |
-
paymentMethods: PaymentMethods;
|
98 |
-
expressPaymentMethods: ExpressPaymentMethods;
|
99 |
-
}
|
100 |
-
|
101 |
-
export type PaymentMethodCurrentStatusType = {
|
102 |
-
// If true then the payment method state in checkout is pristine.
|
103 |
-
isPristine: boolean;
|
104 |
-
// If true then the payment method has been initialized and has started.
|
105 |
-
isStarted: boolean;
|
106 |
-
// If true then the payment method is processing payment.
|
107 |
-
isProcessing: boolean;
|
108 |
-
// If true then the payment method is in a finished state (which may mean it's status is either error, failed, or success).
|
109 |
-
isFinished: boolean;
|
110 |
-
// If true then the payment method is in an error state.
|
111 |
-
hasError: boolean;
|
112 |
-
// If true then the payment method has failed (usually indicates a problem with the payment method used, not logic error).
|
113 |
-
hasFailed: boolean;
|
114 |
-
// If true then the payment method has completed it's processing successfully.
|
115 |
-
isSuccessful: boolean;
|
116 |
-
// If true, an express payment is in progress.
|
117 |
-
isDoingExpressPayment: boolean;
|
118 |
-
};
|
119 |
-
|
120 |
-
export type PaymentMethodDataContextType = {
|
121 |
-
// Sets the payment status for the payment method.
|
122 |
-
setPaymentStatus: () => PaymentStatusDispatchers;
|
123 |
-
// The current payment status.
|
124 |
-
currentStatus: PaymentMethodCurrentStatusType;
|
125 |
-
// An object of payment status constants.
|
126 |
-
paymentStatuses: ObjectType;
|
127 |
-
// Arbitrary data to be passed along for processing by the payment method on the server.
|
128 |
-
paymentMethodData: ObjectType | EmptyObjectType;
|
129 |
-
// An error message provided by the payment method if there is an error.
|
130 |
-
errorMessage: string;
|
131 |
-
// The active payment method slug.
|
132 |
-
activePaymentMethod: string;
|
133 |
-
// A function for setting the active payment method.
|
134 |
-
setActivePaymentMethod: ( paymentMethod: string ) => void;
|
135 |
-
// Current active token.
|
136 |
-
activeSavedToken: string;
|
137 |
-
// A function for setting the active payment method token.
|
138 |
-
setActiveSavedToken: ( activeSavedToken: string ) => void;
|
139 |
-
// Returns the customer payment for the customer if it exists.
|
140 |
-
customerPaymentMethods:
|
141 |
-
| Record< string, CustomerPaymentMethod >
|
142 |
-
| EmptyObjectType;
|
143 |
-
// Registered payment methods.
|
144 |
-
paymentMethods: PaymentMethods;
|
145 |
-
// Registered express payment methods.
|
146 |
-
expressPaymentMethods: ExpressPaymentMethods;
|
147 |
-
// True when all registered payment methods have been initialized.
|
148 |
-
paymentMethodsInitialized: boolean;
|
149 |
-
// True when all registered express payment methods have been initialized.
|
150 |
-
expressPaymentMethodsInitialized: boolean;
|
151 |
-
// Event registration callback for registering observers for the payment processing event.
|
152 |
-
onPaymentProcessing: ReturnType< typeof emitterCallback >;
|
153 |
-
// A function used by express payment methods to indicate an error for checkout to handle. It receives an error message string. Does not change payment status.
|
154 |
-
setExpressPaymentError: ( error: string ) => void;
|
155 |
-
// True if an express payment method is active.
|
156 |
-
isExpressPaymentMethodActive: boolean;
|
157 |
-
// A function used to set the shouldSavePayment value.
|
158 |
-
setShouldSavePayment: ( shouldSavePayment: boolean ) => void;
|
159 |
-
// True means that the configured payment method option is saved for the customer.
|
160 |
-
shouldSavePayment: boolean;
|
161 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/payment-methods/use-active-payment-method.ts
DELETED
@@ -1,38 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useState, useEffect } from '@wordpress/element';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import { useStoreEvents } from '../../../hooks/use-store-events';
|
10 |
-
|
11 |
-
export const useActivePaymentMethod = (): {
|
12 |
-
activePaymentMethod: string;
|
13 |
-
activeSavedToken: string;
|
14 |
-
setActivePaymentMethod: React.Dispatch< React.SetStateAction< string > >;
|
15 |
-
setActiveSavedToken: ( token: string ) => void;
|
16 |
-
} => {
|
17 |
-
const { dispatchCheckoutEvent } = useStoreEvents();
|
18 |
-
|
19 |
-
// The active payment method - e.g. Stripe CC or BACS.
|
20 |
-
const [ activePaymentMethod, setActivePaymentMethod ] = useState( '' );
|
21 |
-
|
22 |
-
// If a previously saved payment method is active, the token for that method. For example, a for a Stripe CC card saved to user account.
|
23 |
-
const [ activeSavedToken, setActiveSavedToken ] = useState( '' );
|
24 |
-
|
25 |
-
// Trigger event on change.
|
26 |
-
useEffect( () => {
|
27 |
-
dispatchCheckoutEvent( 'set-active-payment-method', {
|
28 |
-
activePaymentMethod,
|
29 |
-
} );
|
30 |
-
}, [ dispatchCheckoutEvent, activePaymentMethod ] );
|
31 |
-
|
32 |
-
return {
|
33 |
-
activePaymentMethod,
|
34 |
-
activeSavedToken,
|
35 |
-
setActivePaymentMethod,
|
36 |
-
setActiveSavedToken,
|
37 |
-
};
|
38 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/payment-methods/use-payment-method-dispatchers.ts
DELETED
@@ -1,105 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useCallback, useMemo } from '@wordpress/element';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import { actions, ActionType } from './actions';
|
10 |
-
import { STATUS } from './constants';
|
11 |
-
import { useCustomerDataContext } from '../customer';
|
12 |
-
import { useShippingDataContext } from '../shipping';
|
13 |
-
import type {
|
14 |
-
PaymentStatusDispatchers,
|
15 |
-
PaymentMethodDispatchers,
|
16 |
-
} from './types';
|
17 |
-
|
18 |
-
export const usePaymentMethodDataDispatchers = (
|
19 |
-
dispatch: React.Dispatch< ActionType >
|
20 |
-
): {
|
21 |
-
dispatchActions: PaymentMethodDispatchers;
|
22 |
-
setPaymentStatus: () => PaymentStatusDispatchers;
|
23 |
-
} => {
|
24 |
-
const { setBillingData } = useCustomerDataContext();
|
25 |
-
const { setShippingAddress } = useShippingDataContext();
|
26 |
-
|
27 |
-
const dispatchActions = useMemo(
|
28 |
-
(): PaymentMethodDispatchers => ( {
|
29 |
-
setRegisteredPaymentMethods: ( paymentMethods ) =>
|
30 |
-
void dispatch(
|
31 |
-
actions.setRegisteredPaymentMethods( paymentMethods )
|
32 |
-
),
|
33 |
-
setRegisteredExpressPaymentMethods: ( paymentMethods ) =>
|
34 |
-
void dispatch(
|
35 |
-
actions.setRegisteredExpressPaymentMethods( paymentMethods )
|
36 |
-
),
|
37 |
-
setShouldSavePayment: ( shouldSave ) =>
|
38 |
-
void dispatch(
|
39 |
-
actions.setShouldSavePaymentMethod( shouldSave )
|
40 |
-
),
|
41 |
-
} ),
|
42 |
-
[ dispatch ]
|
43 |
-
);
|
44 |
-
|
45 |
-
const setPaymentStatus = useCallback(
|
46 |
-
(): PaymentStatusDispatchers => ( {
|
47 |
-
pristine: () => dispatch( actions.statusOnly( STATUS.PRISTINE ) ),
|
48 |
-
started: ( paymentMethodData ) => {
|
49 |
-
dispatch(
|
50 |
-
actions.started( {
|
51 |
-
paymentMethodData,
|
52 |
-
} )
|
53 |
-
);
|
54 |
-
},
|
55 |
-
processing: () =>
|
56 |
-
dispatch( actions.statusOnly( STATUS.PROCESSING ) ),
|
57 |
-
completed: () => dispatch( actions.statusOnly( STATUS.COMPLETE ) ),
|
58 |
-
error: ( errorMessage ) =>
|
59 |
-
dispatch( actions.error( errorMessage ) ),
|
60 |
-
failed: (
|
61 |
-
errorMessage,
|
62 |
-
paymentMethodData,
|
63 |
-
billingData = undefined
|
64 |
-
) => {
|
65 |
-
if ( billingData ) {
|
66 |
-
setBillingData( billingData );
|
67 |
-
}
|
68 |
-
dispatch(
|
69 |
-
actions.failed( {
|
70 |
-
errorMessage: errorMessage || '',
|
71 |
-
paymentMethodData: paymentMethodData || {},
|
72 |
-
} )
|
73 |
-
);
|
74 |
-
},
|
75 |
-
success: (
|
76 |
-
paymentMethodData,
|
77 |
-
billingData = undefined,
|
78 |
-
shippingData = undefined
|
79 |
-
) => {
|
80 |
-
if ( billingData ) {
|
81 |
-
setBillingData( billingData );
|
82 |
-
}
|
83 |
-
if (
|
84 |
-
typeof shippingData !== undefined &&
|
85 |
-
shippingData?.address
|
86 |
-
) {
|
87 |
-
setShippingAddress(
|
88 |
-
shippingData.address as Record< string, unknown >
|
89 |
-
);
|
90 |
-
}
|
91 |
-
dispatch(
|
92 |
-
actions.success( {
|
93 |
-
paymentMethodData,
|
94 |
-
} )
|
95 |
-
);
|
96 |
-
},
|
97 |
-
} ),
|
98 |
-
[ dispatch, setBillingData, setShippingAddress ]
|
99 |
-
);
|
100 |
-
|
101 |
-
return {
|
102 |
-
dispatchActions,
|
103 |
-
setPaymentStatus,
|
104 |
-
};
|
105 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/cart-checkout/payment-methods/utils.ts
DELETED
@@ -1,43 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { getSetting } from '@woocommerce/settings';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import type { PaymentMethods, CustomerPaymentMethod } from './types';
|
10 |
-
|
11 |
-
/**
|
12 |
-
* Gets the payment methods saved for the current user after filtering out disabled ones.
|
13 |
-
*/
|
14 |
-
export const getCustomerPaymentMethods = (
|
15 |
-
availablePaymentMethods: PaymentMethods = {}
|
16 |
-
): Record< string, CustomerPaymentMethod > => {
|
17 |
-
if ( Object.keys( availablePaymentMethods ).length === 0 ) {
|
18 |
-
return {};
|
19 |
-
}
|
20 |
-
const customerPaymentMethods = getSetting( 'customerPaymentMethods', {} );
|
21 |
-
const paymentMethodKeys = Object.keys( customerPaymentMethods );
|
22 |
-
const enabledCustomerPaymentMethods = {} as Record<
|
23 |
-
string,
|
24 |
-
CustomerPaymentMethod
|
25 |
-
>;
|
26 |
-
paymentMethodKeys.forEach( ( type ) => {
|
27 |
-
const methods = customerPaymentMethods[ type ].filter(
|
28 |
-
( {
|
29 |
-
method: { gateway },
|
30 |
-
}: {
|
31 |
-
method: {
|
32 |
-
gateway: string;
|
33 |
-
};
|
34 |
-
} ) =>
|
35 |
-
gateway in availablePaymentMethods &&
|
36 |
-
availablePaymentMethods[ gateway ].supports?.showSavedCards
|
37 |
-
);
|
38 |
-
if ( methods.length ) {
|
39 |
-
enabledCustomerPaymentMethods[ type ] = methods;
|
40 |
-
}
|
41 |
-
} );
|
42 |
-
return enabledCustomerPaymentMethods;
|
43 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/index.js
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
export * from './editor-context';
|
2 |
-
export * from './add-to-cart-form';
|
3 |
-
export * from './cart-checkout';
|
4 |
-
export * from './store-notices';
|
5 |
-
export * from './store-snackbar-notices';
|
6 |
-
export * from './validation';
|
7 |
-
export * from './container-width-context';
|
8 |
-
export * from './editor-context';
|
9 |
-
export * from './query-state-context';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/store-notices/index.js
DELETED
@@ -1,2 +0,0 @@
|
|
1 |
-
export * from './components/store-notices-container';
|
2 |
-
export * from './context';
|
|
|
|
assets/js/base/context/providers/store-snackbar-notices/components/snackbar-notices-container.js
DELETED
@@ -1,41 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { SnackbarList } from 'wordpress-components';
|
5 |
-
import classnames from 'classnames';
|
6 |
-
import { __experimentalApplyCheckoutFilter } from '@woocommerce/blocks-checkout';
|
7 |
-
|
8 |
-
const SnackbarNoticesContainer = ( {
|
9 |
-
className,
|
10 |
-
notices,
|
11 |
-
removeNotice,
|
12 |
-
isEditor,
|
13 |
-
} ) => {
|
14 |
-
if ( isEditor ) {
|
15 |
-
return null;
|
16 |
-
}
|
17 |
-
|
18 |
-
const snackbarNotices = notices.filter(
|
19 |
-
( notice ) => notice.type === 'snackbar'
|
20 |
-
);
|
21 |
-
|
22 |
-
const filteredNotices = __experimentalApplyCheckoutFilter( {
|
23 |
-
filterName: 'snackbarNotices',
|
24 |
-
defaultValue: snackbarNotices,
|
25 |
-
} );
|
26 |
-
|
27 |
-
const wrapperClass = classnames(
|
28 |
-
className,
|
29 |
-
'wc-block-components-notices__snackbar'
|
30 |
-
);
|
31 |
-
|
32 |
-
return (
|
33 |
-
<SnackbarList
|
34 |
-
notices={ filteredNotices }
|
35 |
-
className={ wrapperClass }
|
36 |
-
onRemove={ removeNotice }
|
37 |
-
/>
|
38 |
-
);
|
39 |
-
};
|
40 |
-
|
41 |
-
export default SnackbarNoticesContainer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/store-snackbar-notices/components/style.scss
DELETED
@@ -1,20 +0,0 @@
|
|
1 |
-
.wc-block-components-notices__snackbar {
|
2 |
-
position: fixed;
|
3 |
-
bottom: 20px;
|
4 |
-
left: 16px;
|
5 |
-
width: auto;
|
6 |
-
|
7 |
-
@include breakpoint( "<782px" ) {
|
8 |
-
position: fixed;
|
9 |
-
top: 10px;
|
10 |
-
left: 0;
|
11 |
-
bottom: auto;
|
12 |
-
}
|
13 |
-
|
14 |
-
.components-snackbar-list__notice-container {
|
15 |
-
@include breakpoint( "<782px" ) {
|
16 |
-
margin-left: 10px;
|
17 |
-
margin-right: 10px;
|
18 |
-
}
|
19 |
-
}
|
20 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/store-snackbar-notices/context.js
DELETED
@@ -1,125 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import PropTypes from 'prop-types';
|
5 |
-
import {
|
6 |
-
createContext,
|
7 |
-
useContext,
|
8 |
-
useCallback,
|
9 |
-
useState,
|
10 |
-
} from '@wordpress/element';
|
11 |
-
import { useSelect, useDispatch } from '@wordpress/data';
|
12 |
-
import SnackbarNoticesContainer from '@woocommerce/base-context/providers/store-snackbar-notices/components/snackbar-notices-container';
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Internal dependencies
|
16 |
-
*/
|
17 |
-
import { useStoreEvents } from '../../hooks/use-store-events';
|
18 |
-
import { useEditorContext } from '../editor-context';
|
19 |
-
|
20 |
-
/**
|
21 |
-
* @typedef {import('@woocommerce/type-defs/contexts').NoticeContext} NoticeContext
|
22 |
-
* @typedef {import('react')} React
|
23 |
-
*/
|
24 |
-
|
25 |
-
const StoreSnackbarNoticesContext = createContext( {
|
26 |
-
notices: [],
|
27 |
-
createSnackbarNotice: ( content, options ) => void { content, options },
|
28 |
-
removeSnackbarNotice: ( id, ctxt ) => void { id, ctxt },
|
29 |
-
setIsSuppressed: ( val ) => void { val },
|
30 |
-
context: 'wc/core',
|
31 |
-
} );
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Returns the notices context values.
|
35 |
-
*
|
36 |
-
* @return {NoticeContext} The notice context value from the notice context.
|
37 |
-
*/
|
38 |
-
export const useStoreSnackbarNoticesContext = () => {
|
39 |
-
return useContext( StoreSnackbarNoticesContext );
|
40 |
-
};
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Provides an interface for blocks to add notices to the frontend UI.
|
44 |
-
*
|
45 |
-
* Statuses map to https://github.com/WordPress/gutenberg/tree/master/packages/components/src/notice
|
46 |
-
* - Default (no status)
|
47 |
-
* - Error
|
48 |
-
* - Warning
|
49 |
-
* - Info
|
50 |
-
* - Success
|
51 |
-
*
|
52 |
-
* @param {Object} props Incoming props for the component.
|
53 |
-
* @param {React.ReactChildren} props.children The Elements wrapped by this component.
|
54 |
-
* @param {string} props.context The notice context for notices being rendered.
|
55 |
-
*/
|
56 |
-
export const StoreSnackbarNoticesProvider = ( {
|
57 |
-
children,
|
58 |
-
context = 'wc/core',
|
59 |
-
} ) => {
|
60 |
-
const { createNotice, removeNotice } = useDispatch( 'core/notices' );
|
61 |
-
const [ isSuppressed, setIsSuppressed ] = useState( false );
|
62 |
-
const { dispatchStoreEvent } = useStoreEvents();
|
63 |
-
const { isEditor } = useEditorContext();
|
64 |
-
|
65 |
-
const createSnackbarNotice = useCallback(
|
66 |
-
( content = '', options = {} ) => {
|
67 |
-
createNotice( 'default', content, {
|
68 |
-
...options,
|
69 |
-
type: 'snackbar',
|
70 |
-
context: options.context || context,
|
71 |
-
} );
|
72 |
-
dispatchStoreEvent( 'store-notice-create', {
|
73 |
-
status: 'default',
|
74 |
-
content,
|
75 |
-
options,
|
76 |
-
} );
|
77 |
-
},
|
78 |
-
[ createNotice, dispatchStoreEvent, context ]
|
79 |
-
);
|
80 |
-
|
81 |
-
const removeSnackbarNotice = useCallback(
|
82 |
-
( id, ctxt = context ) => {
|
83 |
-
removeNotice( id, ctxt );
|
84 |
-
},
|
85 |
-
[ removeNotice, context ]
|
86 |
-
);
|
87 |
-
|
88 |
-
const { notices } = useSelect(
|
89 |
-
( select ) => {
|
90 |
-
return {
|
91 |
-
notices: select( 'core/notices' ).getNotices( context ),
|
92 |
-
};
|
93 |
-
},
|
94 |
-
[ context ]
|
95 |
-
);
|
96 |
-
|
97 |
-
const contextValue = {
|
98 |
-
notices,
|
99 |
-
createSnackbarNotice,
|
100 |
-
removeSnackbarNotice,
|
101 |
-
context,
|
102 |
-
setIsSuppressed,
|
103 |
-
};
|
104 |
-
|
105 |
-
const snackbarNoticeOutput = isSuppressed ? null : (
|
106 |
-
<SnackbarNoticesContainer
|
107 |
-
notices={ contextValue.notices }
|
108 |
-
removeNotice={ contextValue.removeSnackbarNotice }
|
109 |
-
isEditor={ isEditor }
|
110 |
-
/>
|
111 |
-
);
|
112 |
-
|
113 |
-
return (
|
114 |
-
<StoreSnackbarNoticesContext.Provider value={ contextValue }>
|
115 |
-
{ children }
|
116 |
-
{ snackbarNoticeOutput }
|
117 |
-
</StoreSnackbarNoticesContext.Provider>
|
118 |
-
);
|
119 |
-
};
|
120 |
-
|
121 |
-
StoreSnackbarNoticesProvider.propTypes = {
|
122 |
-
className: PropTypes.string,
|
123 |
-
children: PropTypes.node,
|
124 |
-
context: PropTypes.string,
|
125 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/providers/store-snackbar-notices/index.ts
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
export * from './context';
|
|
assets/js/base/context/providers/validation/index.js
DELETED
@@ -1,2 +0,0 @@
|
|
1 |
-
export * from './context';
|
2 |
-
export * from './components';
|
|
|
|
assets/js/base/context/{providers/query-state-context.js → query-state-context.js}
RENAMED
File without changes
|
assets/js/base/context/shared/event-emit/emitter-callback.js
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import { actions } from './reducer';
|
5 |
+
|
6 |
+
export const emitterCallback = ( type, dispatcher ) => (
|
7 |
+
callback,
|
8 |
+
priority = 10
|
9 |
+
) => {
|
10 |
+
const action = actions.addEventCallback( type, callback, priority );
|
11 |
+
dispatcher( action );
|
12 |
+
return () => {
|
13 |
+
dispatcher( actions.removeEventCallback( type, action.id ) );
|
14 |
+
};
|
15 |
+
};
|
assets/js/base/context/{event-emit/emitters.ts → shared/event-emit/emitters.js}
RENAMED
@@ -1,9 +1,10 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
|
|
7 |
|
8 |
/**
|
9 |
* Emits events on registered observers for the provided type and passes along
|
@@ -15,15 +16,13 @@ import { isErrorResponse, isFailResponse } from '../hooks/use-emit-response';
|
|
15 |
*
|
16 |
* @param {Object} observers The registered observers to omit to.
|
17 |
* @param {string} eventType The event type being emitted.
|
18 |
-
* @param {*} data Data passed along to the observer when it is
|
|
|
19 |
*
|
20 |
-
* @return {Promise} A promise that resolves to true after all observers have
|
|
|
21 |
*/
|
22 |
-
export const emitEvent = async (
|
23 |
-
observers: EventObserversType,
|
24 |
-
eventType: string,
|
25 |
-
data: unknown
|
26 |
-
): Promise< unknown > => {
|
27 |
const observersByType = getObserversByPriority( observers, eventType );
|
28 |
const observerResponses = [];
|
29 |
for ( const observer of observersByType ) {
|
@@ -35,7 +34,8 @@ export const emitEvent = async (
|
|
35 |
observerResponses.push( observerResponse );
|
36 |
}
|
37 |
} catch ( e ) {
|
38 |
-
// we don't care about errors blocking execution, but will
|
|
|
39 |
// eslint-disable-next-line no-console
|
40 |
console.error( e );
|
41 |
}
|
@@ -45,51 +45,37 @@ export const emitEvent = async (
|
|
45 |
|
46 |
/**
|
47 |
* Emits events on registered observers for the provided type and passes along
|
48 |
-
* the provided data. This event emitter will abort
|
49 |
-
*
|
50 |
-
*
|
51 |
-
* Any successful observer responses before abort will be included in the returned package.
|
52 |
*
|
53 |
* @param {Object} observers The registered observers to omit to.
|
54 |
* @param {string} eventType The event type being emitted.
|
55 |
-
* @param {*} data Data passed along to the observer when it is
|
|
|
56 |
*
|
57 |
-
* @return {Promise} Returns a promise that resolves to either boolean
|
58 |
-
*
|
59 |
*/
|
60 |
-
export const emitEventWithAbort = async (
|
61 |
-
observers: EventObserversType,
|
62 |
-
eventType: string,
|
63 |
-
data: unknown
|
64 |
-
): Promise< Array< unknown > > => {
|
65 |
-
const observerResponses = [];
|
66 |
const observersByType = getObserversByPriority( observers, eventType );
|
67 |
for ( const observer of observersByType ) {
|
68 |
try {
|
69 |
const response = await Promise.resolve( observer.callback( data ) );
|
70 |
-
if ( typeof response !== 'object'
|
71 |
continue;
|
72 |
}
|
73 |
-
if (
|
74 |
throw new Error(
|
75 |
-
'
|
76 |
);
|
77 |
}
|
78 |
-
|
79 |
-
observerResponses.push( response );
|
80 |
-
// early abort.
|
81 |
-
return observerResponses;
|
82 |
-
}
|
83 |
-
// all potential abort conditions have been considered push the
|
84 |
-
// response to the array.
|
85 |
-
observerResponses.push( response );
|
86 |
} catch ( e ) {
|
87 |
// We don't handle thrown errors but just console.log for troubleshooting.
|
88 |
// eslint-disable-next-line no-console
|
89 |
console.error( e );
|
90 |
-
|
91 |
-
return observerResponses;
|
92 |
}
|
93 |
}
|
94 |
-
return
|
95 |
};
|
1 |
+
const getObserversByPriority = ( observers, eventType ) => {
|
2 |
+
return observers[ eventType ]
|
3 |
+
? Array.from( observers[ eventType ].values() ).sort( ( a, b ) => {
|
4 |
+
return a.priority - b.priority;
|
5 |
+
} )
|
6 |
+
: [];
|
7 |
+
};
|
8 |
|
9 |
/**
|
10 |
* Emits events on registered observers for the provided type and passes along
|
16 |
*
|
17 |
* @param {Object} observers The registered observers to omit to.
|
18 |
* @param {string} eventType The event type being emitted.
|
19 |
+
* @param {*} data Data passed along to the observer when it is
|
20 |
+
* invoked.
|
21 |
*
|
22 |
+
* @return {Promise} A promise that resolves to true after all observers have
|
23 |
+
* executed.
|
24 |
*/
|
25 |
+
export const emitEvent = async ( observers, eventType, data ) => {
|
|
|
|
|
|
|
|
|
26 |
const observersByType = getObserversByPriority( observers, eventType );
|
27 |
const observerResponses = [];
|
28 |
for ( const observer of observersByType ) {
|
34 |
observerResponses.push( observerResponse );
|
35 |
}
|
36 |
} catch ( e ) {
|
37 |
+
// we don't care about errors blocking execution, but will
|
38 |
+
// console.error for troubleshooting.
|
39 |
// eslint-disable-next-line no-console
|
40 |
console.error( e );
|
41 |
}
|
45 |
|
46 |
/**
|
47 |
* Emits events on registered observers for the provided type and passes along
|
48 |
+
* the provided data. This event emitter will abort and return any value from
|
49 |
+
* observers that return an object which should contain a type property.
|
|
|
|
|
50 |
*
|
51 |
* @param {Object} observers The registered observers to omit to.
|
52 |
* @param {string} eventType The event type being emitted.
|
53 |
+
* @param {*} data Data passed along to the observer when it is
|
54 |
+
* invoked.
|
55 |
*
|
56 |
+
* @return {Promise} Returns a promise that resolves to either boolean or the
|
57 |
+
* return value of the aborted observer.
|
58 |
*/
|
59 |
+
export const emitEventWithAbort = async ( observers, eventType, data ) => {
|
|
|
|
|
|
|
|
|
|
|
60 |
const observersByType = getObserversByPriority( observers, eventType );
|
61 |
for ( const observer of observersByType ) {
|
62 |
try {
|
63 |
const response = await Promise.resolve( observer.callback( data ) );
|
64 |
+
if ( typeof response !== 'object' ) {
|
65 |
continue;
|
66 |
}
|
67 |
+
if ( typeof response.type === 'undefined' ) {
|
68 |
throw new Error(
|
69 |
+
'If you want to abort event emitter processing, your observer must return an object with a type property'
|
70 |
);
|
71 |
}
|
72 |
+
return response;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
} catch ( e ) {
|
74 |
// We don't handle thrown errors but just console.log for troubleshooting.
|
75 |
// eslint-disable-next-line no-console
|
76 |
console.error( e );
|
77 |
+
return { type: 'error' };
|
|
|
78 |
}
|
79 |
}
|
80 |
+
return true;
|
81 |
};
|
assets/js/base/context/{event-emit/index.ts → shared/event-emit/index.js}
RENAMED
@@ -1,4 +1,3 @@
|
|
1 |
export * from './reducer';
|
2 |
export * from './emitters';
|
3 |
export * from './emitter-callback';
|
4 |
-
export * from './types';
|
1 |
export * from './reducer';
|
2 |
export * from './emitters';
|
3 |
export * from './emitter-callback';
|
|
assets/js/base/context/shared/event-emit/reducer.js
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { uniqueId } from 'lodash';
|
5 |
+
|
6 |
+
export const TYPES = {
|
7 |
+
ADD_EVENT_CALLBACK: 'add_event_callback',
|
8 |
+
REMOVE_EVENT_CALLBACK: 'remove_event_callback',
|
9 |
+
};
|
10 |
+
|
11 |
+
export const actions = {
|
12 |
+
addEventCallback: ( eventType, callback, priority = 10 ) => {
|
13 |
+
return {
|
14 |
+
id: uniqueId(),
|
15 |
+
type: TYPES.ADD_EVENT_CALLBACK,
|
16 |
+
eventType,
|
17 |
+
callback,
|
18 |
+
priority,
|
19 |
+
};
|
20 |
+
},
|
21 |
+
removeEventCallback: ( eventType, id ) => {
|
22 |
+
return {
|
23 |
+
id,
|
24 |
+
type: TYPES.REMOVE_EVENT_CALLBACK,
|
25 |
+
eventType,
|
26 |
+
};
|
27 |
+
},
|
28 |
+
};
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Handles actions for emmitters
|
32 |
+
*
|
33 |
+
* @param {Object} state Current state.
|
34 |
+
* @param {Object} action Incoming action object
|
35 |
+
* @param {string} action.type The type of action.
|
36 |
+
* @param {string} action.eventType What type of event is emitted.
|
37 |
+
* @param {string} action.id The id for the event.
|
38 |
+
* @param {function(any):any} action.callback The registered callback for the event.
|
39 |
+
* @param {number} action.priority The priority for the event.
|
40 |
+
*/
|
41 |
+
export const reducer = (
|
42 |
+
state = {},
|
43 |
+
{ type, eventType, id, callback, priority }
|
44 |
+
) => {
|
45 |
+
const newEvents = new Map( state[ eventType ] );
|
46 |
+
switch ( type ) {
|
47 |
+
case TYPES.ADD_EVENT_CALLBACK:
|
48 |
+
newEvents.set( id, { priority, callback } );
|
49 |
+
return {
|
50 |
+
...state,
|
51 |
+
[ eventType ]: newEvents,
|
52 |
+
};
|
53 |
+
case TYPES.REMOVE_EVENT_CALLBACK:
|
54 |
+
newEvents.delete( id );
|
55 |
+
return {
|
56 |
+
...state,
|
57 |
+
[ eventType ]: newEvents,
|
58 |
+
};
|
59 |
+
}
|
60 |
+
return state;
|
61 |
+
};
|
assets/js/base/context/{event-emit → shared/event-emit}/test/emitters.js
RENAMED
@@ -30,13 +30,6 @@ describe( 'Testing emitters', () => {
|
|
30 |
'observerPromiseWithResolvedValue',
|
31 |
{ priority: 10, callback: observerPromiseWithResolvedValue },
|
32 |
],
|
33 |
-
[
|
34 |
-
'observerSuccessType',
|
35 |
-
{
|
36 |
-
priority: 10,
|
37 |
-
callback: jest.fn().mockReturnValue( { type: 'success' } ),
|
38 |
-
},
|
39 |
-
],
|
40 |
] );
|
41 |
} );
|
42 |
describe( 'Testing emitEvent()', () => {
|
@@ -46,11 +39,11 @@ describe( 'Testing emitters', () => {
|
|
46 |
expect( console ).toHaveErroredWith( 'an error' );
|
47 |
expect( observerA ).toHaveBeenCalledTimes( 1 );
|
48 |
expect( observerB ).toHaveBeenCalledWith( 'foo' );
|
49 |
-
expect( response ).
|
50 |
} );
|
51 |
} );
|
52 |
describe( 'Testing emitEventWithAbort()', () => {
|
53 |
-
it( 'does not abort on any return value other than an object with
|
54 |
observerMocks.delete( 'observerPromiseWithReject' );
|
55 |
const observers = { test: observerMocks };
|
56 |
const response = await emitEventWithAbort(
|
@@ -61,16 +54,17 @@ describe( 'Testing emitters', () => {
|
|
61 |
expect( console ).not.toHaveErrored();
|
62 |
expect( observerB ).toHaveBeenCalledTimes( 1 );
|
63 |
expect( observerPromiseWithResolvedValue ).toHaveBeenCalled();
|
64 |
-
expect( response ).
|
65 |
} );
|
66 |
-
it( 'Aborts on a return value with an object that has a
|
67 |
const validObjectResponse = jest
|
68 |
.fn()
|
69 |
-
.mockReturnValue( { type: '
|
70 |
observerMocks.set( 'observerValidObject', {
|
71 |
priority: 5,
|
72 |
callback: validObjectResponse,
|
73 |
} );
|
|
|
74 |
const observers = { test: observerMocks };
|
75 |
const response = await emitEventWithAbort(
|
76 |
observers,
|
@@ -80,7 +74,7 @@ describe( 'Testing emitters', () => {
|
|
80 |
expect( console ).not.toHaveErrored();
|
81 |
expect( validObjectResponse ).toHaveBeenCalledTimes( 1 );
|
82 |
expect( observerPromiseWithResolvedValue ).not.toHaveBeenCalled();
|
83 |
-
expect( response ).toEqual(
|
84 |
} );
|
85 |
it( 'throws an error on an object returned from observer without a type property', async () => {
|
86 |
const failingObjectResponse = jest.fn().mockReturnValue( {} );
|
@@ -97,7 +91,7 @@ describe( 'Testing emitters', () => {
|
|
97 |
expect( console ).toHaveErrored();
|
98 |
expect( failingObjectResponse ).toHaveBeenCalledTimes( 1 );
|
99 |
expect( observerPromiseWithResolvedValue ).not.toHaveBeenCalled();
|
100 |
-
expect( response ).toEqual(
|
101 |
} );
|
102 |
} );
|
103 |
describe( 'Test Priority', () => {
|
30 |
'observerPromiseWithResolvedValue',
|
31 |
{ priority: 10, callback: observerPromiseWithResolvedValue },
|
32 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
] );
|
34 |
} );
|
35 |
describe( 'Testing emitEvent()', () => {
|
39 |
expect( console ).toHaveErroredWith( 'an error' );
|
40 |
expect( observerA ).toHaveBeenCalledTimes( 1 );
|
41 |
expect( observerB ).toHaveBeenCalledWith( 'foo' );
|
42 |
+
expect( response ).toBe( true );
|
43 |
} );
|
44 |
} );
|
45 |
describe( 'Testing emitEventWithAbort()', () => {
|
46 |
+
it( 'does not abort on any return value other than an object with a type property', async () => {
|
47 |
observerMocks.delete( 'observerPromiseWithReject' );
|
48 |
const observers = { test: observerMocks };
|
49 |
const response = await emitEventWithAbort(
|
54 |
expect( console ).not.toHaveErrored();
|
55 |
expect( observerB ).toHaveBeenCalledTimes( 1 );
|
56 |
expect( observerPromiseWithResolvedValue ).toHaveBeenCalled();
|
57 |
+
expect( response ).toBe( true );
|
58 |
} );
|
59 |
+
it( 'Aborts on a return value with an object that has a type property', async () => {
|
60 |
const validObjectResponse = jest
|
61 |
.fn()
|
62 |
+
.mockReturnValue( { type: 'success' } );
|
63 |
observerMocks.set( 'observerValidObject', {
|
64 |
priority: 5,
|
65 |
callback: validObjectResponse,
|
66 |
} );
|
67 |
+
observerMocks.delete( 'observerPromiseWithReject' );
|
68 |
const observers = { test: observerMocks };
|
69 |
const response = await emitEventWithAbort(
|
70 |
observers,
|
74 |
expect( console ).not.toHaveErrored();
|
75 |
expect( validObjectResponse ).toHaveBeenCalledTimes( 1 );
|
76 |
expect( observerPromiseWithResolvedValue ).not.toHaveBeenCalled();
|
77 |
+
expect( response ).toEqual( { type: 'success' } );
|
78 |
} );
|
79 |
it( 'throws an error on an object returned from observer without a type property', async () => {
|
80 |
const failingObjectResponse = jest.fn().mockReturnValue( {} );
|
91 |
expect( console ).toHaveErrored();
|
92 |
expect( failingObjectResponse ).toHaveBeenCalledTimes( 1 );
|
93 |
expect( observerPromiseWithResolvedValue ).not.toHaveBeenCalled();
|
94 |
+
expect( response ).toEqual( { type: 'error' } );
|
95 |
} );
|
96 |
} );
|
97 |
describe( 'Test Priority', () => {
|
assets/js/base/context/shared/index.js
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
1 |
+
export * from './validation';
|
2 |
+
export * from './event-emit';
|
assets/js/base/context/{providers/validation/context.js → shared/validation/index.js}
RENAMED
File without changes
|
assets/js/base/context/{providers/store-notices/context.js → store-notices-context.js}
RENAMED
@@ -9,13 +9,10 @@ import {
|
|
9 |
useState,
|
10 |
} from '@wordpress/element';
|
11 |
import { useSelect, useDispatch } from '@wordpress/data';
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
import { useStoreEvents } from '../../hooks/use-store-events';
|
17 |
-
import { useEditorContext } from '../editor-context';
|
18 |
-
import StoreNoticesContainer from './components/store-notices-container';
|
19 |
|
20 |
/**
|
21 |
* @typedef {import('@woocommerce/type-defs/contexts').NoticeContext} NoticeContext
|
@@ -25,6 +22,7 @@ import StoreNoticesContainer from './components/store-notices-container';
|
|
25 |
const StoreNoticesContext = createContext( {
|
26 |
notices: [],
|
27 |
createNotice: ( status, text, props ) => void { status, text, props },
|
|
|
28 |
removeNotice: ( id, ctxt ) => void { id, ctxt },
|
29 |
setIsSuppressed: ( val ) => void { val },
|
30 |
context: 'wc/core',
|
@@ -63,8 +61,6 @@ export const StoreNoticesProvider = ( {
|
|
63 |
} ) => {
|
64 |
const { createNotice, removeNotice } = useDispatch( 'core/notices' );
|
65 |
const [ isSuppressed, setIsSuppressed ] = useState( false );
|
66 |
-
const { dispatchStoreEvent } = useStoreEvents();
|
67 |
-
const { isEditor } = useEditorContext();
|
68 |
|
69 |
const createNoticeWithContext = useCallback(
|
70 |
( status = 'default', content = '', options = {} ) => {
|
@@ -72,13 +68,8 @@ export const StoreNoticesProvider = ( {
|
|
72 |
...options,
|
73 |
context: options.context || context,
|
74 |
} );
|
75 |
-
dispatchStoreEvent( 'store-notice-create', {
|
76 |
-
status,
|
77 |
-
content,
|
78 |
-
options,
|
79 |
-
} );
|
80 |
},
|
81 |
-
[ createNotice,
|
82 |
);
|
83 |
|
84 |
const removeNoticeWithContext = useCallback(
|
@@ -88,6 +79,16 @@ export const StoreNoticesProvider = ( {
|
|
88 |
[ removeNotice, context ]
|
89 |
);
|
90 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
const { notices } = useSelect(
|
92 |
( select ) => {
|
93 |
return {
|
@@ -100,6 +101,7 @@ export const StoreNoticesProvider = ( {
|
|
100 |
const contextValue = {
|
101 |
notices,
|
102 |
createNotice: createNoticeWithContext,
|
|
|
103 |
removeNotice: removeNoticeWithContext,
|
104 |
context,
|
105 |
setIsSuppressed,
|
@@ -109,15 +111,18 @@ export const StoreNoticesProvider = ( {
|
|
109 |
<StoreNoticesContainer
|
110 |
className={ className }
|
111 |
notices={ contextValue.notices }
|
112 |
-
removeNotice={ contextValue.removeNotice }
|
113 |
-
isEditor={ isEditor }
|
114 |
/>
|
115 |
);
|
116 |
|
|
|
|
|
|
|
|
|
117 |
return (
|
118 |
<StoreNoticesContext.Provider value={ contextValue }>
|
119 |
{ createNoticeContainer && noticeOutput }
|
120 |
{ children }
|
|
|
121 |
</StoreNoticesContext.Provider>
|
122 |
);
|
123 |
};
|
9 |
useState,
|
10 |
} from '@wordpress/element';
|
11 |
import { useSelect, useDispatch } from '@wordpress/data';
|
12 |
+
import {
|
13 |
+
StoreNoticesContainer,
|
14 |
+
SnackbarNoticesContainer,
|
15 |
+
} from '@woocommerce/base-components/store-notices-container';
|
|
|
|
|
|
|
16 |
|
17 |
/**
|
18 |
* @typedef {import('@woocommerce/type-defs/contexts').NoticeContext} NoticeContext
|
22 |
const StoreNoticesContext = createContext( {
|
23 |
notices: [],
|
24 |
createNotice: ( status, text, props ) => void { status, text, props },
|
25 |
+
createSnackbarNotice: ( content, options ) => void { content, options },
|
26 |
removeNotice: ( id, ctxt ) => void { id, ctxt },
|
27 |
setIsSuppressed: ( val ) => void { val },
|
28 |
context: 'wc/core',
|
61 |
} ) => {
|
62 |
const { createNotice, removeNotice } = useDispatch( 'core/notices' );
|
63 |
const [ isSuppressed, setIsSuppressed ] = useState( false );
|
|
|
|
|
64 |
|
65 |
const createNoticeWithContext = useCallback(
|
66 |
( status = 'default', content = '', options = {} ) => {
|
68 |
...options,
|
69 |
context: options.context || context,
|
70 |
} );
|
|
|
|
|
|
|
|
|
|
|
71 |
},
|
72 |
+
[ createNotice, context ]
|
73 |
);
|
74 |
|
75 |
const removeNoticeWithContext = useCallback(
|
79 |
[ removeNotice, context ]
|
80 |
);
|
81 |
|
82 |
+
const createSnackbarNotice = useCallback(
|
83 |
+
( content = '', options = {} ) => {
|
84 |
+
createNoticeWithContext( 'default', content, {
|
85 |
+
...options,
|
86 |
+
type: 'snackbar',
|
87 |
+
} );
|
88 |
+
},
|
89 |
+
[ createNoticeWithContext ]
|
90 |
+
);
|
91 |
+
|
92 |
const { notices } = useSelect(
|
93 |
( select ) => {
|
94 |
return {
|
101 |
const contextValue = {
|
102 |
notices,
|
103 |
createNotice: createNoticeWithContext,
|
104 |
+
createSnackbarNotice,
|
105 |
removeNotice: removeNoticeWithContext,
|
106 |
context,
|
107 |
setIsSuppressed,
|
111 |
<StoreNoticesContainer
|
112 |
className={ className }
|
113 |
notices={ contextValue.notices }
|
|
|
|
|
114 |
/>
|
115 |
);
|
116 |
|
117 |
+
const snackbarNoticeOutput = isSuppressed ? null : (
|
118 |
+
<SnackbarNoticesContainer />
|
119 |
+
);
|
120 |
+
|
121 |
return (
|
122 |
<StoreNoticesContext.Provider value={ contextValue }>
|
123 |
{ createNoticeContainer && noticeOutput }
|
124 |
{ children }
|
125 |
+
{ snackbarNoticeOutput }
|
126 |
</StoreNoticesContext.Provider>
|
127 |
);
|
128 |
};
|
assets/js/base/context/test/utils.js
CHANGED
@@ -16,13 +16,15 @@ describe( 'assertValidContextValue', () => {
|
|
16 |
},
|
17 |
};
|
18 |
it.each`
|
19 |
-
testValue
|
20 |
-
${ {} }
|
21 |
-
${ 10 }
|
22 |
-
${ { amountKetchup: '
|
|
|
|
|
23 |
`(
|
24 |
-
'The value of $testValue is
|
25 |
-
( { testValue } ) => {
|
26 |
const invokeTest = () => {
|
27 |
assertValidContextValue(
|
28 |
contextName,
|
@@ -30,24 +32,11 @@ describe( 'assertValidContextValue', () => {
|
|
30 |
testValue
|
31 |
);
|
32 |
};
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
${ { amountKetchup: 20 } }
|
39 |
-
${ { cheeseburger: 'fries', amountKetchup: 20 } }
|
40 |
-
`(
|
41 |
-
'The value of $testValue is not expected to trigger an Error',
|
42 |
-
( { testValue } ) => {
|
43 |
-
const invokeTest = () => {
|
44 |
-
assertValidContextValue(
|
45 |
-
contextName,
|
46 |
-
validationMap,
|
47 |
-
testValue
|
48 |
-
);
|
49 |
-
};
|
50 |
-
expect( invokeTest ).not.toThrow();
|
51 |
}
|
52 |
);
|
53 |
} );
|
16 |
},
|
17 |
};
|
18 |
it.each`
|
19 |
+
testValue | expectedMessage | expectError
|
20 |
+
${ {} } | ${ 'expected' } | ${ true }
|
21 |
+
${ 10 } | ${ 'expected' } | ${ true }
|
22 |
+
${ { amountKetchup: 20 } } | ${ 'not expected' } | ${ false }
|
23 |
+
${ { amountKetchup: '10' } } | ${ 'expected' } | ${ true }
|
24 |
+
${ { cheeseburger: 'fries', amountKetchup: 20 } } | ${ 'not expected' } | ${ false }
|
25 |
`(
|
26 |
+
'The value of $testValue is $expectedMessage to trigger an Error',
|
27 |
+
( { testValue, expectError } ) => {
|
28 |
const invokeTest = () => {
|
29 |
assertValidContextValue(
|
30 |
contextName,
|
32 |
testValue
|
33 |
);
|
34 |
};
|
35 |
+
if ( expectError ) {
|
36 |
+
expect( invokeTest ).toThrow();
|
37 |
+
} else {
|
38 |
+
expect( invokeTest ).not.toThrow();
|
39 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
}
|
41 |
);
|
42 |
} );
|
assets/js/base/{context/hooks/cart/index.ts → hooks/cart/index.js}
RENAMED
File without changes
|
assets/js/base/{context/hooks → hooks}/cart/test/use-store-cart-item-quantity.js
RENAMED
@@ -95,14 +95,14 @@ describe( 'useStoreCartItemQuantity', () => {
|
|
95 |
);
|
96 |
} );
|
97 |
|
98 |
-
const {
|
99 |
'div'
|
100 |
).props;
|
101 |
|
102 |
expect( quantity ).toBe( 1 );
|
103 |
|
104 |
act( () => {
|
105 |
-
|
106 |
} );
|
107 |
|
108 |
const { quantity: newQuantity } = renderer.root.findByType(
|
@@ -133,7 +133,7 @@ describe( 'useStoreCartItemQuantity', () => {
|
|
133 |
expect( mockRemoveItemFromCart ).toHaveBeenCalledWith( '123' );
|
134 |
} );
|
135 |
|
136 |
-
it( '
|
137 |
const TestComponent = getTestComponent( {
|
138 |
key: '123',
|
139 |
quantity: 1,
|
@@ -145,10 +145,10 @@ describe( 'useStoreCartItemQuantity', () => {
|
|
145 |
);
|
146 |
} );
|
147 |
|
148 |
-
const {
|
149 |
|
150 |
act( () => {
|
151 |
-
|
152 |
} );
|
153 |
|
154 |
expect( mockChangeCartItemQuantity.mock.calls ).toEqual( [
|
95 |
);
|
96 |
} );
|
97 |
|
98 |
+
const { changeQuantity, quantity } = renderer.root.findByType(
|
99 |
'div'
|
100 |
).props;
|
101 |
|
102 |
expect( quantity ).toBe( 1 );
|
103 |
|
104 |
act( () => {
|
105 |
+
changeQuantity( 2 );
|
106 |
} );
|
107 |
|
108 |
const { quantity: newQuantity } = renderer.root.findByType(
|
133 |
expect( mockRemoveItemFromCart ).toHaveBeenCalledWith( '123' );
|
134 |
} );
|
135 |
|
136 |
+
it( 'changeQuantity should call the dispatch action', () => {
|
137 |
const TestComponent = getTestComponent( {
|
138 |
key: '123',
|
139 |
quantity: 1,
|
145 |
);
|
146 |
} );
|
147 |
|
148 |
+
const { changeQuantity } = renderer.root.findByType( 'div' ).props;
|
149 |
|
150 |
act( () => {
|
151 |
+
changeQuantity( 2 );
|
152 |
} );
|
153 |
|
154 |
expect( mockChangeCartItemQuantity.mock.calls ).toEqual( [
|
assets/js/base/{context/hooks → hooks}/cart/test/use-store-cart.js
RENAMED
@@ -3,6 +3,7 @@
|
|
3 |
*/
|
4 |
import TestRenderer, { act } from 'react-test-renderer';
|
5 |
import { createRegistry, RegistryProvider } from '@wordpress/data';
|
|
|
6 |
import { previewCart } from '@woocommerce/resource-previews';
|
7 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
8 |
|
@@ -10,9 +11,8 @@ import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
|
10 |
* Internal dependencies
|
11 |
*/
|
12 |
import { defaultCartData, useStoreCart } from '../use-store-cart';
|
13 |
-
import { useEditorContext } from '../../../providers/editor-context';
|
14 |
|
15 |
-
jest.mock( '
|
16 |
useEditorContext: jest.fn(),
|
17 |
} ) );
|
18 |
|
@@ -29,7 +29,6 @@ describe( 'useStoreCart', () => {
|
|
29 |
const previewCartData = {
|
30 |
cartCoupons: previewCart.coupons,
|
31 |
cartItems: previewCart.items,
|
32 |
-
cartFees: previewCart.fees,
|
33 |
cartItemsCount: previewCart.items_count,
|
34 |
cartItemsWeight: previewCart.items_weight,
|
35 |
cartNeedsPayment: previewCart.needs_payment,
|
@@ -38,6 +37,7 @@ describe( 'useStoreCart', () => {
|
|
38 |
cartIsLoading: false,
|
39 |
cartItemErrors: [],
|
40 |
cartErrors: [],
|
|
|
41 |
billingAddress: {
|
42 |
first_name: '',
|
43 |
last_name: '',
|
@@ -75,7 +75,6 @@ describe( 'useStoreCart', () => {
|
|
75 |
const mockCartData = {
|
76 |
coupons: [],
|
77 |
items: mockCartItems,
|
78 |
-
fees: [],
|
79 |
itemsCount: 1,
|
80 |
itemsWeight: 10,
|
81 |
needsPayment: true,
|
@@ -84,8 +83,6 @@ describe( 'useStoreCart', () => {
|
|
84 |
shippingAddress: mockShippingAddress,
|
85 |
shippingRates: [],
|
86 |
hasCalculatedShipping: true,
|
87 |
-
extensions: {},
|
88 |
-
errors: [],
|
89 |
};
|
90 |
const mockCartTotals = {
|
91 |
currency_code: 'USD',
|
@@ -150,12 +147,12 @@ describe( 'useStoreCart', () => {
|
|
150 |
} );
|
151 |
|
152 |
afterEach( () => {
|
153 |
-
useEditorContext.mockReset();
|
154 |
} );
|
155 |
|
156 |
describe( 'in frontend', () => {
|
157 |
beforeEach( () => {
|
158 |
-
useEditorContext.mockReturnValue( {
|
159 |
isEditor: false,
|
160 |
} );
|
161 |
} );
|
@@ -200,7 +197,7 @@ describe( 'useStoreCart', () => {
|
|
200 |
|
201 |
describe( 'in editor', () => {
|
202 |
beforeEach( () => {
|
203 |
-
useEditorContext.mockReturnValue( {
|
204 |
isEditor: true,
|
205 |
previewData: {
|
206 |
previewCart: {
|
3 |
*/
|
4 |
import TestRenderer, { act } from 'react-test-renderer';
|
5 |
import { createRegistry, RegistryProvider } from '@wordpress/data';
|
6 |
+
import * as mockBaseContext from '@woocommerce/base-context';
|
7 |
import { previewCart } from '@woocommerce/resource-previews';
|
8 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
9 |
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
import { defaultCartData, useStoreCart } from '../use-store-cart';
|
|
|
14 |
|
15 |
+
jest.mock( '@woocommerce/base-context', () => ( {
|
16 |
useEditorContext: jest.fn(),
|
17 |
} ) );
|
18 |
|
29 |
const previewCartData = {
|
30 |
cartCoupons: previewCart.coupons,
|
31 |
cartItems: previewCart.items,
|
|
|
32 |
cartItemsCount: previewCart.items_count,
|
33 |
cartItemsWeight: previewCart.items_weight,
|
34 |
cartNeedsPayment: previewCart.needs_payment,
|
37 |
cartIsLoading: false,
|
38 |
cartItemErrors: [],
|
39 |
cartErrors: [],
|
40 |
+
cartFees: [],
|
41 |
billingAddress: {
|
42 |
first_name: '',
|
43 |
last_name: '',
|
75 |
const mockCartData = {
|
76 |
coupons: [],
|
77 |
items: mockCartItems,
|
|
|
78 |
itemsCount: 1,
|
79 |
itemsWeight: 10,
|
80 |
needsPayment: true,
|
83 |
shippingAddress: mockShippingAddress,
|
84 |
shippingRates: [],
|
85 |
hasCalculatedShipping: true,
|
|
|
|
|
86 |
};
|
87 |
const mockCartTotals = {
|
88 |
currency_code: 'USD',
|
147 |
} );
|
148 |
|
149 |
afterEach( () => {
|
150 |
+
mockBaseContext.useEditorContext.mockReset();
|
151 |
} );
|
152 |
|
153 |
describe( 'in frontend', () => {
|
154 |
beforeEach( () => {
|
155 |
+
mockBaseContext.useEditorContext.mockReturnValue( {
|
156 |
isEditor: false,
|
157 |
} );
|
158 |
} );
|
197 |
|
198 |
describe( 'in editor', () => {
|
199 |
beforeEach( () => {
|
200 |
+
mockBaseContext.useEditorContext.mockReturnValue( {
|
201 |
isEditor: true,
|
202 |
previewData: {
|
203 |
previewCart: {
|
assets/js/base/{context/hooks/cart/use-store-cart-coupons.ts → hooks/cart/use-store-cart-coupons.js}
RENAMED
@@ -6,15 +6,13 @@
|
|
6 |
import { __, sprintf } from '@wordpress/i18n';
|
7 |
import { useSelect } from '@wordpress/data';
|
8 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
|
|
9 |
import { decodeEntities } from '@wordpress/html-entities';
|
10 |
-
import type { StoreCartCoupon } from '@woocommerce/types';
|
11 |
|
12 |
/**
|
13 |
* Internal dependencies
|
14 |
*/
|
15 |
import { useStoreCart } from './use-store-cart';
|
16 |
-
import { useStoreSnackbarNotices } from '../use-store-snackbar-notices';
|
17 |
-
import { useValidationContext } from '../../providers/validation';
|
18 |
import { useStoreNotices } from '../use-store-notices';
|
19 |
|
20 |
/**
|
@@ -25,16 +23,12 @@ import { useStoreNotices } from '../use-store-notices';
|
|
25 |
* @return {StoreCartCoupon} An object exposing data and actions from/for the
|
26 |
* store api /cart/coupons endpoint.
|
27 |
*/
|
28 |
-
export const useStoreCartCoupons = ()
|
29 |
const { cartCoupons, cartIsLoading } = useStoreCart();
|
30 |
-
const { addErrorNotice } = useStoreNotices();
|
31 |
-
const { addSnackbarNotice } = useStoreSnackbarNotices();
|
32 |
const { setValidationErrors } = useValidationContext();
|
33 |
|
34 |
-
const results
|
35 |
-
StoreCartCoupon,
|
36 |
-
'applyCoupon' | 'removeCoupon' | 'isApplyingCoupon' | 'isRemovingCoupon'
|
37 |
-
> = useSelect(
|
38 |
( select, { dispatch } ) => {
|
39 |
const store = select( storeKey );
|
40 |
const isApplyingCoupon = store.isApplyingCoupon();
|
@@ -43,19 +37,15 @@ export const useStoreCartCoupons = (): StoreCartCoupon => {
|
|
43 |
applyCoupon,
|
44 |
removeCoupon,
|
45 |
receiveApplyingCoupon,
|
46 |
-
}: {
|
47 |
-
applyCoupon: ( coupon: string ) => Promise< boolean >;
|
48 |
-
removeCoupon: ( coupon: string ) => Promise< boolean >;
|
49 |
-
receiveApplyingCoupon: ( coupon: string ) => void;
|
50 |
} = dispatch( storeKey );
|
51 |
|
52 |
-
const applyCouponWithNotices = ( couponCode
|
53 |
applyCoupon( couponCode )
|
54 |
.then( ( result ) => {
|
55 |
if ( result === true ) {
|
56 |
addSnackbarNotice(
|
57 |
sprintf(
|
58 |
-
|
59 |
__(
|
60 |
'Coupon code "%s" has been applied to your cart.',
|
61 |
'woo-gutenberg-products-block'
|
@@ -80,13 +70,13 @@ export const useStoreCartCoupons = (): StoreCartCoupon => {
|
|
80 |
} );
|
81 |
};
|
82 |
|
83 |
-
const removeCouponWithNotices = ( couponCode
|
84 |
removeCoupon( couponCode )
|
85 |
.then( ( result ) => {
|
86 |
if ( result === true ) {
|
87 |
addSnackbarNotice(
|
88 |
sprintf(
|
89 |
-
|
90 |
__(
|
91 |
'Coupon code "%s" has been removed from your cart.',
|
92 |
'woo-gutenberg-products-block'
|
6 |
import { __, sprintf } from '@wordpress/i18n';
|
7 |
import { useSelect } from '@wordpress/data';
|
8 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
9 |
+
import { useValidationContext } from '@woocommerce/base-context';
|
10 |
import { decodeEntities } from '@wordpress/html-entities';
|
|
|
11 |
|
12 |
/**
|
13 |
* Internal dependencies
|
14 |
*/
|
15 |
import { useStoreCart } from './use-store-cart';
|
|
|
|
|
16 |
import { useStoreNotices } from '../use-store-notices';
|
17 |
|
18 |
/**
|
23 |
* @return {StoreCartCoupon} An object exposing data and actions from/for the
|
24 |
* store api /cart/coupons endpoint.
|
25 |
*/
|
26 |
+
export const useStoreCartCoupons = () => {
|
27 |
const { cartCoupons, cartIsLoading } = useStoreCart();
|
28 |
+
const { addErrorNotice, addSnackbarNotice } = useStoreNotices();
|
|
|
29 |
const { setValidationErrors } = useValidationContext();
|
30 |
|
31 |
+
const results = useSelect(
|
|
|
|
|
|
|
32 |
( select, { dispatch } ) => {
|
33 |
const store = select( storeKey );
|
34 |
const isApplyingCoupon = store.isApplyingCoupon();
|
37 |
applyCoupon,
|
38 |
removeCoupon,
|
39 |
receiveApplyingCoupon,
|
|
|
|
|
|
|
|
|
40 |
} = dispatch( storeKey );
|
41 |
|
42 |
+
const applyCouponWithNotices = ( couponCode ) => {
|
43 |
applyCoupon( couponCode )
|
44 |
.then( ( result ) => {
|
45 |
if ( result === true ) {
|
46 |
addSnackbarNotice(
|
47 |
sprintf(
|
48 |
+
// translators: %s coupon code.
|
49 |
__(
|
50 |
'Coupon code "%s" has been applied to your cart.',
|
51 |
'woo-gutenberg-products-block'
|
70 |
} );
|
71 |
};
|
72 |
|
73 |
+
const removeCouponWithNotices = ( couponCode ) => {
|
74 |
removeCoupon( couponCode )
|
75 |
.then( ( result ) => {
|
76 |
if ( result === true ) {
|
77 |
addSnackbarNotice(
|
78 |
sprintf(
|
79 |
+
// translators: %s coupon code.
|
80 |
__(
|
81 |
'Coupon code "%s" has been removed from your cart.',
|
82 |
'woo-gutenberg-products-block'
|
assets/js/base/hooks/cart/use-store-cart-item-quantity.js
ADDED
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { useSelect, useDispatch } from '@wordpress/data';
|
5 |
+
import { useState, useEffect } from '@wordpress/element';
|
6 |
+
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
+
import { useDebounce } from 'use-debounce';
|
8 |
+
import { useCheckoutContext } from '@woocommerce/base-context';
|
9 |
+
import { triggerFragmentRefresh } from '@woocommerce/base-utils';
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Internal dependencies
|
13 |
+
*/
|
14 |
+
import { useStoreCart } from './use-store-cart';
|
15 |
+
import { usePrevious } from '../use-previous';
|
16 |
+
|
17 |
+
/**
|
18 |
+
* @typedef {import('@woocommerce/type-defs/hooks').StoreCartItemQuantity} StoreCartItemQuantity
|
19 |
+
* @typedef {import('@woocommerce/type-defs/cart').CartItem} CartItem
|
20 |
+
*/
|
21 |
+
|
22 |
+
/**
|
23 |
+
* This is a custom hook for loading the Store API /cart/ endpoint and
|
24 |
+
* actions for removing or changing item quantity.
|
25 |
+
*
|
26 |
+
* @see https://github.com/woocommerce/woocommerce-gutenberg-products-block/tree/trunk/src/RestApi/StoreApi
|
27 |
+
*
|
28 |
+
* @param {CartItem} cartItem The cartItem to get quantity info from and
|
29 |
+
* will have quantity updated on.
|
30 |
+
* @return {StoreCartItemQuantity} An object exposing data and actions relating
|
31 |
+
* to cart items.
|
32 |
+
*/
|
33 |
+
export const useStoreCartItemQuantity = ( cartItem ) => {
|
34 |
+
const { key: cartItemKey = '', quantity: cartItemQuantity = 1 } = cartItem;
|
35 |
+
const { cartErrors } = useStoreCart();
|
36 |
+
const { dispatchActions } = useCheckoutContext();
|
37 |
+
|
38 |
+
// Store quantity in hook state. This is used to keep the UI
|
39 |
+
// updated while server request is updated.
|
40 |
+
const [ quantity, changeQuantity ] = useState( cartItemQuantity );
|
41 |
+
const [ debouncedQuantity ] = useDebounce( quantity, 400 );
|
42 |
+
const previousDebouncedQuantity = usePrevious( debouncedQuantity );
|
43 |
+
const { removeItemFromCart, changeCartItemQuantity } = useDispatch(
|
44 |
+
storeKey
|
45 |
+
);
|
46 |
+
|
47 |
+
const isPendingQuantity = useSelect(
|
48 |
+
( select ) => {
|
49 |
+
if ( ! cartItemKey ) {
|
50 |
+
return false;
|
51 |
+
}
|
52 |
+
|
53 |
+
const store = select( storeKey );
|
54 |
+
return store.isItemPendingQuantity( cartItemKey );
|
55 |
+
},
|
56 |
+
[ cartItemKey ]
|
57 |
+
);
|
58 |
+
const previousIsPendingQuantity = usePrevious( isPendingQuantity );
|
59 |
+
|
60 |
+
const isPendingDelete = useSelect(
|
61 |
+
( select ) => {
|
62 |
+
if ( ! cartItemKey ) {
|
63 |
+
return false;
|
64 |
+
}
|
65 |
+
|
66 |
+
const store = select( storeKey );
|
67 |
+
return store.isItemPendingDelete( cartItemKey );
|
68 |
+
},
|
69 |
+
[ cartItemKey ]
|
70 |
+
);
|
71 |
+
const previousIsPendingDelete = usePrevious( isPendingDelete );
|
72 |
+
|
73 |
+
const removeItem = () => {
|
74 |
+
return cartItemKey
|
75 |
+
? removeItemFromCart( cartItemKey ).then( () => {
|
76 |
+
triggerFragmentRefresh();
|
77 |
+
} )
|
78 |
+
: false;
|
79 |
+
};
|
80 |
+
|
81 |
+
// Observe debounced quantity value, fire action to update server on change.
|
82 |
+
useEffect( () => {
|
83 |
+
if (
|
84 |
+
cartItemKey &&
|
85 |
+
Number.isFinite( previousDebouncedQuantity ) &&
|
86 |
+
previousDebouncedQuantity !== debouncedQuantity
|
87 |
+
) {
|
88 |
+
changeCartItemQuantity( cartItemKey, debouncedQuantity ).then(
|
89 |
+
triggerFragmentRefresh
|
90 |
+
);
|
91 |
+
}
|
92 |
+
}, [
|
93 |
+
cartItemKey,
|
94 |
+
changeCartItemQuantity,
|
95 |
+
debouncedQuantity,
|
96 |
+
previousDebouncedQuantity,
|
97 |
+
] );
|
98 |
+
|
99 |
+
useEffect( () => {
|
100 |
+
if ( previousIsPendingQuantity !== isPendingQuantity ) {
|
101 |
+
if ( isPendingQuantity ) {
|
102 |
+
dispatchActions.incrementCalculating();
|
103 |
+
} else {
|
104 |
+
dispatchActions.decrementCalculating();
|
105 |
+
}
|
106 |
+
}
|
107 |
+
}, [ dispatchActions, isPendingQuantity, previousIsPendingQuantity ] );
|
108 |
+
|
109 |
+
useEffect( () => {
|
110 |
+
if ( previousIsPendingDelete !== isPendingDelete ) {
|
111 |
+
if ( isPendingDelete ) {
|
112 |
+
dispatchActions.incrementCalculating();
|
113 |
+
} else {
|
114 |
+
dispatchActions.decrementCalculating();
|
115 |
+
}
|
116 |
+
}
|
117 |
+
return () => {
|
118 |
+
if ( isPendingDelete ) {
|
119 |
+
dispatchActions.decrementCalculating();
|
120 |
+
}
|
121 |
+
};
|
122 |
+
}, [ dispatchActions, isPendingDelete, previousIsPendingDelete ] );
|
123 |
+
|
124 |
+
return {
|
125 |
+
isPendingDelete,
|
126 |
+
quantity,
|
127 |
+
changeQuantity,
|
128 |
+
removeItem,
|
129 |
+
cartItemQuantityErrors: cartErrors,
|
130 |
+
};
|
131 |
+
};
|
assets/js/base/{context/hooks/cart/use-store-cart.ts → hooks/cart/use-store-cart.js}
RENAMED
@@ -3,35 +3,13 @@
|
|
3 |
/**
|
4 |
* External dependencies
|
5 |
*/
|
6 |
-
import { isEqual } from 'lodash';
|
7 |
-
import { useRef } from '@wordpress/element';
|
8 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
9 |
import { useSelect } from '@wordpress/data';
|
|
|
10 |
import { decodeEntities } from '@wordpress/html-entities';
|
11 |
-
import
|
12 |
-
StoreCart,
|
13 |
-
CartResponseTotals,
|
14 |
-
CartResponseFeeItem,
|
15 |
-
CartResponseBillingAddress,
|
16 |
-
CartResponseShippingAddress,
|
17 |
-
CartResponseCouponItem,
|
18 |
-
CartResponseCouponItemWithLabel,
|
19 |
-
} from '@woocommerce/types';
|
20 |
-
import {
|
21 |
-
emptyHiddenAddressFields,
|
22 |
-
fromEntriesPolyfill,
|
23 |
-
} from '@woocommerce/base-utils';
|
24 |
|
25 |
-
|
26 |
-
* Internal dependencies
|
27 |
-
*/
|
28 |
-
import { useEditorContext } from '../../providers/editor-context';
|
29 |
-
|
30 |
-
declare module '@wordpress/html-entities' {
|
31 |
-
// eslint-disable-next-line @typescript-eslint/no-shadow
|
32 |
-
export function decodeEntities< T >( coupon: T ): T;
|
33 |
-
}
|
34 |
-
const defaultShippingAddress: CartResponseShippingAddress = {
|
35 |
first_name: '',
|
36 |
last_name: '',
|
37 |
company: '',
|
@@ -43,48 +21,20 @@ const defaultShippingAddress: CartResponseShippingAddress = {
|
|
43 |
country: '',
|
44 |
};
|
45 |
|
46 |
-
const defaultBillingAddress
|
47 |
...defaultShippingAddress,
|
48 |
email: '',
|
49 |
phone: '',
|
50 |
};
|
51 |
|
52 |
-
const
|
53 |
-
|
54 |
-
total_items_tax: '',
|
55 |
-
total_fees: '',
|
56 |
-
total_fees_tax: '',
|
57 |
-
total_discount: '',
|
58 |
-
total_discount_tax: '',
|
59 |
-
total_shipping: '',
|
60 |
-
total_shipping_tax: '',
|
61 |
-
total_price: '',
|
62 |
-
total_tax: '',
|
63 |
-
tax_lines: [],
|
64 |
-
currency_code: '',
|
65 |
-
currency_symbol: '',
|
66 |
-
currency_minor_unit: 2,
|
67 |
-
currency_decimal_separator: '',
|
68 |
-
currency_thousand_separator: '',
|
69 |
-
currency_prefix: '',
|
70 |
-
currency_suffix: '',
|
71 |
-
};
|
72 |
-
|
73 |
-
const decodeValues = (
|
74 |
-
object: Record< string, unknown >
|
75 |
-
): Record< string, unknown > =>
|
76 |
-
fromEntriesPolyfill(
|
77 |
-
Object.entries( object ).map( ( [ key, value ] ) => [
|
78 |
-
key,
|
79 |
-
decodeEntities( value ),
|
80 |
-
] )
|
81 |
-
);
|
82 |
|
83 |
/**
|
84 |
* @constant
|
85 |
* @type {StoreCart} Object containing cart data.
|
86 |
*/
|
87 |
-
export const defaultCartData
|
88 |
cartCoupons: [],
|
89 |
cartItems: [],
|
90 |
cartFees: [],
|
@@ -93,7 +43,7 @@ export const defaultCartData: StoreCart = {
|
|
93 |
cartNeedsPayment: true,
|
94 |
cartNeedsShipping: true,
|
95 |
cartItemErrors: [],
|
96 |
-
cartTotals:
|
97 |
cartIsLoading: true,
|
98 |
cartErrors: [],
|
99 |
billingAddress: defaultBillingAddress,
|
@@ -102,8 +52,7 @@ export const defaultCartData: StoreCart = {
|
|
102 |
shippingRatesLoading: false,
|
103 |
cartHasCalculatedShipping: false,
|
104 |
paymentRequirements: [],
|
105 |
-
receiveCart: () =>
|
106 |
-
extensions: {},
|
107 |
};
|
108 |
|
109 |
/**
|
@@ -118,15 +67,12 @@ export const defaultCartData: StoreCart = {
|
|
118 |
*
|
119 |
* @return {StoreCart} Object containing cart data.
|
120 |
*/
|
121 |
-
export const useStoreCart = (
|
122 |
-
options: { shouldSelect: boolean } = { shouldSelect: true }
|
123 |
-
): StoreCart => {
|
124 |
const { isEditor, previewData } = useEditorContext();
|
125 |
const previewCart = previewData?.previewCart || {};
|
126 |
const { shouldSelect } = options;
|
127 |
-
const currentResults = useRef();
|
128 |
|
129 |
-
const results
|
130 |
( select, { dispatch } ) => {
|
131 |
if ( ! shouldSelect ) {
|
132 |
return defaultCartData;
|
@@ -156,7 +102,7 @@ export const useStoreCart = (
|
|
156 |
receiveCart:
|
157 |
typeof previewCart?.receiveCart === 'function'
|
158 |
? previewCart.receiveCart
|
159 |
-
: () =>
|
160 |
};
|
161 |
}
|
162 |
|
@@ -169,28 +115,14 @@ export const useStoreCart = (
|
|
169 |
);
|
170 |
const shippingRatesLoading = store.isCustomerDataUpdating();
|
171 |
const { receiveCart } = dispatch( storeKey );
|
172 |
-
const billingAddress =
|
173 |
const shippingAddress = cartData.needsShipping
|
174 |
-
?
|
175 |
: billingAddress;
|
176 |
-
const cartFees = cartData.fees.map( ( fee: CartResponseFeeItem ) =>
|
177 |
-
decodeValues( fee )
|
178 |
-
);
|
179 |
-
|
180 |
-
// Add a text property to the coupon to allow extensions to modify
|
181 |
-
// the text used to display the coupon, without affecting the
|
182 |
-
// functionality when it comes to removing the coupon.
|
183 |
-
const cartCoupons: CartResponseCouponItemWithLabel[] = cartData.coupons.map(
|
184 |
-
( coupon: CartResponseCouponItem ) => ( {
|
185 |
-
...coupon,
|
186 |
-
label: coupon.code,
|
187 |
-
} )
|
188 |
-
);
|
189 |
-
|
190 |
return {
|
191 |
-
cartCoupons,
|
192 |
cartItems: cartData.items || [],
|
193 |
-
cartFees,
|
194 |
cartItemsCount: cartData.itemsCount,
|
195 |
cartItemsWeight: cartData.itemsWeight,
|
196 |
cartNeedsPayment: cartData.needsPayment,
|
@@ -199,8 +131,8 @@ export const useStoreCart = (
|
|
199 |
cartTotals,
|
200 |
cartIsLoading,
|
201 |
cartErrors,
|
202 |
-
billingAddress
|
203 |
-
shippingAddress
|
204 |
extensions: cartData.extensions || {},
|
205 |
shippingRates: cartData.shippingRates || [],
|
206 |
shippingRatesLoading,
|
@@ -211,13 +143,5 @@ export const useStoreCart = (
|
|
211 |
},
|
212 |
[ shouldSelect ]
|
213 |
);
|
214 |
-
|
215 |
-
if (
|
216 |
-
! currentResults.current ||
|
217 |
-
! isEqual( currentResults.current, results )
|
218 |
-
) {
|
219 |
-
currentResults.current = results;
|
220 |
-
}
|
221 |
-
|
222 |
-
return currentResults.current;
|
223 |
};
|
3 |
/**
|
4 |
* External dependencies
|
5 |
*/
|
|
|
|
|
6 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
import { useSelect } from '@wordpress/data';
|
8 |
+
import { useEditorContext } from '@woocommerce/base-context';
|
9 |
import { decodeEntities } from '@wordpress/html-entities';
|
10 |
+
import { mapValues } from 'lodash';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
+
const defaultShippingAddress = {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
first_name: '',
|
14 |
last_name: '',
|
15 |
company: '',
|
21 |
country: '',
|
22 |
};
|
23 |
|
24 |
+
const defaultBillingAddress = {
|
25 |
...defaultShippingAddress,
|
26 |
email: '',
|
27 |
phone: '',
|
28 |
};
|
29 |
|
30 |
+
const decodeAddress = ( address ) =>
|
31 |
+
mapValues( address, ( value ) => decodeEntities( value ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
|
33 |
/**
|
34 |
* @constant
|
35 |
* @type {StoreCart} Object containing cart data.
|
36 |
*/
|
37 |
+
export const defaultCartData = {
|
38 |
cartCoupons: [],
|
39 |
cartItems: [],
|
40 |
cartFees: [],
|
43 |
cartNeedsPayment: true,
|
44 |
cartNeedsShipping: true,
|
45 |
cartItemErrors: [],
|
46 |
+
cartTotals: {},
|
47 |
cartIsLoading: true,
|
48 |
cartErrors: [],
|
49 |
billingAddress: defaultBillingAddress,
|
52 |
shippingRatesLoading: false,
|
53 |
cartHasCalculatedShipping: false,
|
54 |
paymentRequirements: [],
|
55 |
+
receiveCart: () => {},
|
|
|
56 |
};
|
57 |
|
58 |
/**
|
67 |
*
|
68 |
* @return {StoreCart} Object containing cart data.
|
69 |
*/
|
70 |
+
export const useStoreCart = ( options = { shouldSelect: true } ) => {
|
|
|
|
|
71 |
const { isEditor, previewData } = useEditorContext();
|
72 |
const previewCart = previewData?.previewCart || {};
|
73 |
const { shouldSelect } = options;
|
|
|
74 |
|
75 |
+
const results = useSelect(
|
76 |
( select, { dispatch } ) => {
|
77 |
if ( ! shouldSelect ) {
|
78 |
return defaultCartData;
|
102 |
receiveCart:
|
103 |
typeof previewCart?.receiveCart === 'function'
|
104 |
? previewCart.receiveCart
|
105 |
+
: () => {},
|
106 |
};
|
107 |
}
|
108 |
|
115 |
);
|
116 |
const shippingRatesLoading = store.isCustomerDataUpdating();
|
117 |
const { receiveCart } = dispatch( storeKey );
|
118 |
+
const billingAddress = decodeAddress( cartData.billingAddress );
|
119 |
const shippingAddress = cartData.needsShipping
|
120 |
+
? decodeAddress( cartData.shippingAddress )
|
121 |
: billingAddress;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
return {
|
123 |
+
cartCoupons: cartData.coupons,
|
124 |
cartItems: cartData.items || [],
|
125 |
+
cartFees: cartData.fees || [],
|
126 |
cartItemsCount: cartData.itemsCount,
|
127 |
cartItemsWeight: cartData.itemsWeight,
|
128 |
cartNeedsPayment: cartData.needsPayment,
|
131 |
cartTotals,
|
132 |
cartIsLoading,
|
133 |
cartErrors,
|
134 |
+
billingAddress,
|
135 |
+
shippingAddress,
|
136 |
extensions: cartData.extensions || {},
|
137 |
shippingRates: cartData.shippingRates || [],
|
138 |
shippingRatesLoading,
|
143 |
},
|
144 |
[ shouldSelect ]
|
145 |
);
|
146 |
+
return results;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
147 |
};
|
assets/js/base/hooks/checkout/index.js
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export * from './use-checkout-redirect-url';
|
2 |
+
export * from './use-checkout-address';
|
3 |
+
export * from './use-checkout-notices';
|
4 |
+
export * from './use-checkout-submit';
|
5 |
+
export * from './use-emit-response';
|
assets/js/base/hooks/checkout/test/use-checkout-redirect-url.js
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import TestRenderer, { act } from 'react-test-renderer';
|
5 |
+
import { createRegistry, RegistryProvider } from '@wordpress/data';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import { useCheckoutRedirectUrl } from '../use-checkout-redirect-url';
|
11 |
+
|
12 |
+
const mockRedirectUrl = 'https://www.example.com/mock-check-out';
|
13 |
+
const mockUseCheckoutContext = {
|
14 |
+
redirectUrl: mockRedirectUrl,
|
15 |
+
dispatchActions: {
|
16 |
+
setRedirectUrl: jest.fn(),
|
17 |
+
},
|
18 |
+
};
|
19 |
+
jest.mock( '@woocommerce/base-context', () => ( {
|
20 |
+
useCheckoutContext: () => mockUseCheckoutContext,
|
21 |
+
} ) );
|
22 |
+
|
23 |
+
describe( 'useCheckoutRedirectUrl', () => {
|
24 |
+
let registry, renderer;
|
25 |
+
|
26 |
+
const getWrappedComponents = ( Component ) => (
|
27 |
+
<RegistryProvider value={ registry }>
|
28 |
+
<Component />
|
29 |
+
</RegistryProvider>
|
30 |
+
);
|
31 |
+
|
32 |
+
const getTestComponent = () => () => {
|
33 |
+
const data = useCheckoutRedirectUrl();
|
34 |
+
return <div { ...data } />;
|
35 |
+
};
|
36 |
+
|
37 |
+
beforeEach( () => {
|
38 |
+
registry = createRegistry();
|
39 |
+
renderer = null;
|
40 |
+
} );
|
41 |
+
|
42 |
+
it( 'redirectUrl matches the value provided by the checkout context', () => {
|
43 |
+
const TestComponent = getTestComponent();
|
44 |
+
|
45 |
+
act( () => {
|
46 |
+
renderer = TestRenderer.create(
|
47 |
+
getWrappedComponents( TestComponent )
|
48 |
+
);
|
49 |
+
} );
|
50 |
+
|
51 |
+
const { redirectUrl } = renderer.root.findByType( 'div' ).props;
|
52 |
+
|
53 |
+
expect( redirectUrl ).toBe( mockRedirectUrl );
|
54 |
+
} );
|
55 |
+
|
56 |
+
it( 'setRedirectUrl calls the correct action in the checkout context', () => {
|
57 |
+
const checkoutUrl = 'https://www.example.com/check-out';
|
58 |
+
const TestComponent = getTestComponent();
|
59 |
+
|
60 |
+
act( () => {
|
61 |
+
renderer = TestRenderer.create(
|
62 |
+
getWrappedComponents( TestComponent )
|
63 |
+
);
|
64 |
+
} );
|
65 |
+
|
66 |
+
const { setRedirectUrl } = renderer.root.findByType( 'div' ).props;
|
67 |
+
|
68 |
+
setRedirectUrl( checkoutUrl );
|
69 |
+
|
70 |
+
expect(
|
71 |
+
mockUseCheckoutContext.dispatchActions.setRedirectUrl
|
72 |
+
).toHaveBeenCalledWith( checkoutUrl );
|
73 |
+
} );
|
74 |
+
} );
|
assets/js/base/{context/hooks → hooks/checkout}/test/use-checkout-submit.js
RENAMED
@@ -12,18 +12,9 @@ import { useCheckoutSubmit } from '../use-checkout-submit';
|
|
12 |
const mockUseCheckoutContext = {
|
13 |
onSubmit: jest.fn(),
|
14 |
};
|
15 |
-
const mockUsePaymentMethodDataContext = {
|
16 |
-
|
17 |
-
currentStatus: {
|
18 |
-
isDoingExpressPayment: false,
|
19 |
-
},
|
20 |
-
};
|
21 |
-
|
22 |
-
jest.mock( '../../providers/cart-checkout/checkout-state', () => ( {
|
23 |
useCheckoutContext: () => mockUseCheckoutContext,
|
24 |
-
} ) );
|
25 |
-
|
26 |
-
jest.mock( '../../providers/cart-checkout/payment-methods', () => ( {
|
27 |
usePaymentMethodDataContext: () => mockUsePaymentMethodDataContext,
|
28 |
} ) );
|
29 |
|
12 |
const mockUseCheckoutContext = {
|
13 |
onSubmit: jest.fn(),
|
14 |
};
|
15 |
+
const mockUsePaymentMethodDataContext = {};
|
16 |
+
jest.mock( '@woocommerce/base-context', () => ( {
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
useCheckoutContext: () => mockUseCheckoutContext,
|
|
|
|
|
|
|
18 |
usePaymentMethodDataContext: () => mockUsePaymentMethodDataContext,
|
19 |
} ) );
|
20 |
|
assets/js/base/{context/hooks → hooks/checkout}/use-checkout-address.js
RENAMED
@@ -1,17 +1,13 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import { defaultAddressFields } from '@woocommerce/
|
5 |
import { useState, useEffect, useCallback, useRef } from '@wordpress/element';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
import {
|
11 |
useShippingDataContext,
|
12 |
useCustomerDataContext,
|
13 |
useCheckoutContext,
|
14 |
-
} from '
|
15 |
|
16 |
/**
|
17 |
* Compare two addresses and see if they are the same.
|
@@ -87,16 +83,10 @@ export const useCheckoutAddress = () => {
|
|
87 |
previousBillingData.current = billingData;
|
88 |
setBillingData( shippingAddress );
|
89 |
} else {
|
90 |
-
const {
|
91 |
-
// We need to pluck out email and phone from previous billing data because they can be empty, causing the current email and phone to get emptied. See issue #4155
|
92 |
-
/* eslint-disable no-unused-vars */
|
93 |
-
email,
|
94 |
-
phone,
|
95 |
-
/* eslint-enable no-unused-vars */
|
96 |
-
...billingAddress
|
97 |
-
} = previousBillingData.current;
|
98 |
setBillingData( {
|
99 |
-
...
|
|
|
|
|
100 |
} );
|
101 |
}
|
102 |
currentShippingAsBilling.current = shippingAsBilling;
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { defaultAddressFields } from '@woocommerce/base-components/cart-checkout';
|
5 |
import { useState, useEffect, useCallback, useRef } from '@wordpress/element';
|
|
|
|
|
|
|
|
|
6 |
import {
|
7 |
useShippingDataContext,
|
8 |
useCustomerDataContext,
|
9 |
useCheckoutContext,
|
10 |
+
} from '@woocommerce/base-context';
|
11 |
|
12 |
/**
|
13 |
* Compare two addresses and see if they are the same.
|
83 |
previousBillingData.current = billingData;
|
84 |
setBillingData( shippingAddress );
|
85 |
} else {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
setBillingData( {
|
87 |
+
...previousBillingData.current,
|
88 |
+
email: undefined,
|
89 |
+
phone: undefined,
|
90 |
} );
|
91 |
}
|
92 |
currentShippingAsBilling.current = shippingAsBilling;
|
assets/js/base/{context/hooks → hooks/checkout}/use-checkout-notices.js
RENAMED
File without changes
|
assets/js/base/hooks/checkout/use-checkout-redirect-url.js
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { useCheckoutContext } from '@woocommerce/base-context';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Returns redirect url interface from checkout context.
|
8 |
+
*/
|
9 |
+
export const useCheckoutRedirectUrl = () => {
|
10 |
+
const { redirectUrl, dispatchActions } = useCheckoutContext();
|
11 |
+
|
12 |
+
return {
|
13 |
+
redirectUrl,
|
14 |
+
setRedirectUrl: dispatchActions.setRedirectUrl,
|
15 |
+
};
|
16 |
+
};
|
assets/js/base/{context/hooks → hooks/checkout}/use-checkout-submit.js
RENAMED
@@ -2,13 +2,15 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
|
|
|
|
|
|
|
|
5 |
|
6 |
/**
|
7 |
* Internal dependencies
|
8 |
*/
|
9 |
-
import {
|
10 |
-
import { usePaymentMethodDataContext } from '../providers/cart-checkout/payment-methods';
|
11 |
-
import { usePaymentMethods } from './payment-methods/use-payment-methods';
|
12 |
|
13 |
/**
|
14 |
* Returns the submitButtonText, onSubmit interface from the checkout context,
|
@@ -25,14 +27,8 @@ export const useCheckoutSubmit = () => {
|
|
25 |
hasError,
|
26 |
} = useCheckoutContext();
|
27 |
const { paymentMethods = {} } = usePaymentMethods();
|
28 |
-
const {
|
29 |
-
activePaymentMethod,
|
30 |
-
currentStatus: paymentStatus,
|
31 |
-
} = usePaymentMethodDataContext();
|
32 |
const paymentMethod = paymentMethods[ activePaymentMethod ] || {};
|
33 |
-
const waitingForProcessing =
|
34 |
-
isProcessing || isAfterProcessing || isBeforeProcessing;
|
35 |
-
const waitingForRedirect = isComplete && ! hasError;
|
36 |
|
37 |
return {
|
38 |
submitButtonText:
|
@@ -40,8 +36,8 @@ export const useCheckoutSubmit = () => {
|
|
40 |
__( 'Place Order', 'woo-gutenberg-products-block' ),
|
41 |
onSubmit,
|
42 |
isCalculating,
|
43 |
-
|
44 |
-
|
45 |
-
waitingForRedirect,
|
46 |
};
|
47 |
};
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
+
import {
|
6 |
+
useCheckoutContext,
|
7 |
+
usePaymentMethodDataContext,
|
8 |
+
} from '@woocommerce/base-context';
|
9 |
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
+
import { usePaymentMethods } from '../payment-methods';
|
|
|
|
|
14 |
|
15 |
/**
|
16 |
* Returns the submitButtonText, onSubmit interface from the checkout context,
|
27 |
hasError,
|
28 |
} = useCheckoutContext();
|
29 |
const { paymentMethods = {} } = usePaymentMethods();
|
30 |
+
const { activePaymentMethod } = usePaymentMethodDataContext();
|
|
|
|
|
|
|
31 |
const paymentMethod = paymentMethods[ activePaymentMethod ] || {};
|
|
|
|
|
|
|
32 |
|
33 |
return {
|
34 |
submitButtonText:
|
36 |
__( 'Place Order', 'woo-gutenberg-products-block' ),
|
37 |
onSubmit,
|
38 |
isCalculating,
|
39 |
+
waitingForProcessing:
|
40 |
+
isProcessing || isAfterProcessing || isBeforeProcessing,
|
41 |
+
waitingForRedirect: isComplete && ! hasError,
|
42 |
};
|
43 |
};
|
assets/js/base/hooks/checkout/use-emit-response.js
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* @typedef {import('@woocommerce/type-defs/hooks').EmitResponseTypes} EmitResponseTypes
|
3 |
+
* @typedef {import('@woocommerce/type-defs/hooks').NoticeContexts} NoticeContexts
|
4 |
+
* @typedef {import('@woocommerce/type-defs/hooks').EmitResponseApi} EmitResponseApi
|
5 |
+
*/
|
6 |
+
|
7 |
+
const isResponseOf = ( response, type ) => {
|
8 |
+
return !! response.type && response.type === type;
|
9 |
+
};
|
10 |
+
|
11 |
+
/**
|
12 |
+
* @type {EmitResponseTypes}
|
13 |
+
*/
|
14 |
+
const responseTypes = {
|
15 |
+
SUCCESS: 'success',
|
16 |
+
FAIL: 'failure',
|
17 |
+
ERROR: 'error',
|
18 |
+
};
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @type {NoticeContexts}
|
22 |
+
*/
|
23 |
+
const noticeContexts = {
|
24 |
+
PAYMENTS: 'wc/payment-area',
|
25 |
+
EXPRESS_PAYMENTS: 'wc/express-payment-area',
|
26 |
+
};
|
27 |
+
|
28 |
+
const isSuccessResponse = ( response ) => {
|
29 |
+
return isResponseOf( response, responseTypes.SUCCESS );
|
30 |
+
};
|
31 |
+
|
32 |
+
const isErrorResponse = ( response ) => {
|
33 |
+
return isResponseOf( response, responseTypes.ERROR );
|
34 |
+
};
|
35 |
+
|
36 |
+
const isFailResponse = ( response ) => {
|
37 |
+
return isResponseOf( response, responseTypes.FAIL );
|
38 |
+
};
|
39 |
+
|
40 |
+
const shouldRetry = ( response ) => {
|
41 |
+
return typeof response.retry === 'undefined' || response.retry === true;
|
42 |
+
};
|
43 |
+
|
44 |
+
/**
|
45 |
+
* A custom hook exposing response utilities for emitters.
|
46 |
+
*
|
47 |
+
* @return {EmitResponseApi} Various interfaces for validating and implementing
|
48 |
+
* emitter response properties.
|
49 |
+
*/
|
50 |
+
export const useEmitResponse = () => {
|
51 |
+
return {
|
52 |
+
responseTypes,
|
53 |
+
noticeContexts,
|
54 |
+
shouldRetry,
|
55 |
+
isSuccessResponse,
|
56 |
+
isErrorResponse,
|
57 |
+
isFailResponse,
|
58 |
+
};
|
59 |
+
};
|
assets/js/base/hooks/customer/index.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
export * from './use-customer-data';
|
assets/js/base/{context/hooks/use-customer-data.ts → hooks/customer/use-customer-data.js}
RENAMED
@@ -6,75 +6,19 @@ import { useEffect, useState, useCallback, useRef } from '@wordpress/element';
|
|
6 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
import { useDebounce } from 'use-debounce';
|
8 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
9 |
-
import {
|
10 |
-
formatStoreApiErrorMessage,
|
11 |
-
pluckAddress,
|
12 |
-
pluckEmail,
|
13 |
-
} from '@woocommerce/base-utils';
|
14 |
-
import type {
|
15 |
-
CartResponseBillingAddress,
|
16 |
-
CartResponseShippingAddress,
|
17 |
-
} from '@woocommerce/types';
|
18 |
-
|
19 |
-
declare type CustomerData = {
|
20 |
-
billingData: CartResponseBillingAddress;
|
21 |
-
shippingAddress: CartResponseShippingAddress;
|
22 |
-
};
|
23 |
|
24 |
/**
|
25 |
* Internal dependencies
|
26 |
*/
|
27 |
-
import {
|
28 |
-
import { useStoreNotices } from '
|
29 |
-
|
30 |
-
function instanceOfCartResponseBillingAddress(
|
31 |
-
address: CartResponseBillingAddress | CartResponseShippingAddress
|
32 |
-
): address is CartResponseBillingAddress {
|
33 |
-
return 'email' in address;
|
34 |
-
}
|
35 |
-
|
36 |
-
/**
|
37 |
-
* Does a shallow compare of important address data to determine if the cart needs updating on the server.
|
38 |
-
*
|
39 |
-
* This takes the current and previous address into account, as well as the billing email field.
|
40 |
-
*
|
41 |
-
* @param {Object} previousAddress An object containing all previous address information
|
42 |
-
* @param {Object} address An object containing all address information
|
43 |
-
*
|
44 |
-
* @return {boolean} True if the store needs updating due to changed data.
|
45 |
-
*/
|
46 |
-
const shouldUpdateAddressStore = <
|
47 |
-
T extends CartResponseBillingAddress | CartResponseShippingAddress
|
48 |
-
>(
|
49 |
-
previousAddress: T,
|
50 |
-
address: T
|
51 |
-
): boolean => {
|
52 |
-
if (
|
53 |
-
instanceOfCartResponseBillingAddress( address ) &&
|
54 |
-
pluckEmail( address ) !==
|
55 |
-
pluckEmail( previousAddress as CartResponseBillingAddress )
|
56 |
-
) {
|
57 |
-
return true;
|
58 |
-
}
|
59 |
-
|
60 |
-
return (
|
61 |
-
!! address.country &&
|
62 |
-
! isShallowEqual(
|
63 |
-
pluckAddress( previousAddress ),
|
64 |
-
pluckAddress( address )
|
65 |
-
)
|
66 |
-
);
|
67 |
-
};
|
68 |
|
69 |
/**
|
70 |
* This is a custom hook for syncing customer address data (billing and shipping) with the server.
|
71 |
*/
|
72 |
-
export const useCustomerData = ()
|
73 |
-
billingData: CartResponseBillingAddress;
|
74 |
-
shippingAddress: CartResponseShippingAddress;
|
75 |
-
setBillingData: ( data: CartResponseBillingAddress ) => void;
|
76 |
-
setShippingAddress: ( data: CartResponseShippingAddress ) => void;
|
77 |
-
} => {
|
78 |
const { updateCustomerData } = useDispatch( storeKey );
|
79 |
const { addErrorNotice, removeNotice } = useStoreNotices();
|
80 |
|
@@ -82,18 +26,16 @@ export const useCustomerData = (): {
|
|
82 |
const {
|
83 |
billingAddress: initialBillingAddress,
|
84 |
shippingAddress: initialShippingAddress,
|
85 |
-
}: Omit< CustomerData, 'billingData' > & {
|
86 |
-
billingAddress: CartResponseBillingAddress;
|
87 |
} = useStoreCart();
|
88 |
|
89 |
// State of customer data is tracked here from this point, using the initial values from the useStoreCart hook.
|
90 |
-
const [ customerData, setCustomerData ] = useState
|
91 |
billingData: initialBillingAddress,
|
92 |
shippingAddress: initialShippingAddress,
|
93 |
} );
|
94 |
|
95 |
// Store values last sent to the server in a ref to avoid requests unless important fields are changed.
|
96 |
-
const previousCustomerData = useRef
|
97 |
|
98 |
// Debounce updates to the customerData state so it's not triggered excessively.
|
99 |
const [ debouncedCustomerData ] = useDebounce( customerData, 1000, {
|
@@ -172,6 +114,7 @@ export const useCustomerData = (): {
|
|
172 |
removeNotice,
|
173 |
updateCustomerData,
|
174 |
] );
|
|
|
175 |
return {
|
176 |
billingData: customerData.billingData,
|
177 |
shippingAddress: customerData.shippingAddress,
|
6 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
import { useDebounce } from 'use-debounce';
|
8 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
9 |
+
import { formatStoreApiErrorMessage } from '@woocommerce/base-utils';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
/**
|
12 |
* Internal dependencies
|
13 |
*/
|
14 |
+
import { shouldUpdateAddressStore } from './utils';
|
15 |
+
import { useStoreNotices } from '../use-store-notices';
|
16 |
+
import { useStoreCart } from '../cart';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
/**
|
19 |
* This is a custom hook for syncing customer address data (billing and shipping) with the server.
|
20 |
*/
|
21 |
+
export const useCustomerData = () => {
|
|
|
|
|
|
|
|
|
|
|
22 |
const { updateCustomerData } = useDispatch( storeKey );
|
23 |
const { addErrorNotice, removeNotice } = useStoreNotices();
|
24 |
|
26 |
const {
|
27 |
billingAddress: initialBillingAddress,
|
28 |
shippingAddress: initialShippingAddress,
|
|
|
|
|
29 |
} = useStoreCart();
|
30 |
|
31 |
// State of customer data is tracked here from this point, using the initial values from the useStoreCart hook.
|
32 |
+
const [ customerData, setCustomerData ] = useState( {
|
33 |
billingData: initialBillingAddress,
|
34 |
shippingAddress: initialShippingAddress,
|
35 |
} );
|
36 |
|
37 |
// Store values last sent to the server in a ref to avoid requests unless important fields are changed.
|
38 |
+
const previousCustomerData = useRef( customerData );
|
39 |
|
40 |
// Debounce updates to the customerData state so it's not triggered excessively.
|
41 |
const [ debouncedCustomerData ] = useDebounce( customerData, 1000, {
|
114 |
removeNotice,
|
115 |
updateCustomerData,
|
116 |
] );
|
117 |
+
|
118 |
return {
|
119 |
billingData: customerData.billingData,
|
120 |
shippingAddress: customerData.shippingAddress,
|
assets/js/base/hooks/customer/utils.js
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import isShallowEqual from '@wordpress/is-shallow-equal';
|
5 |
+
import { pluckAddress } from '@woocommerce/base-utils';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Does a shallow compare of important address data to determine if the cart needs updating.
|
9 |
+
*
|
10 |
+
* @param {Object} previousAddress An object containing all previous address information
|
11 |
+
* @param {Object} address An object containing all address information
|
12 |
+
*
|
13 |
+
* @return {boolean} True if the store needs updating due to changed data.
|
14 |
+
*/
|
15 |
+
export const shouldUpdateAddressStore = ( previousAddress, address ) => {
|
16 |
+
if ( ! address.country ) {
|
17 |
+
return false;
|
18 |
+
}
|
19 |
+
return ! isShallowEqual(
|
20 |
+
pluckAddress( previousAddress ),
|
21 |
+
pluckAddress( address )
|
22 |
+
);
|
23 |
+
};
|
assets/js/base/hooks/index.js
CHANGED
@@ -1,6 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
export * from './use-container-queries';
|
2 |
-
export * from './use-local-storage-state';
|
3 |
export * from './use-position-relative-to-viewport';
|
4 |
export * from './use-previous';
|
5 |
export * from './use-shallow-equal';
|
|
|
|
|
|
|
|
|
6 |
export * from './use-throw-error';
|
|
1 |
+
export * from './cart';
|
2 |
+
export * from './checkout';
|
3 |
+
export * from './customer';
|
4 |
+
export * from './payment-methods';
|
5 |
+
export * from './shipping';
|
6 |
+
export * from './use-collection';
|
7 |
+
export * from './use-collection-header';
|
8 |
+
export * from './use-collection-data';
|
9 |
export * from './use-container-queries';
|
|
|
10 |
export * from './use-position-relative-to-viewport';
|
11 |
export * from './use-previous';
|
12 |
export * from './use-shallow-equal';
|
13 |
+
export * from './use-store-products';
|
14 |
+
export * from './use-store-add-to-cart';
|
15 |
+
export * from './use-store-notices';
|
16 |
+
export * from './use-query-state';
|
17 |
export * from './use-throw-error';
|
18 |
+
export * from './use-trigger-fragment-refresh';
|
assets/js/base/{context/hooks → hooks}/payment-methods/index.js
RENAMED
File without changes
|
assets/js/base/{context/hooks → hooks}/payment-methods/test/use-payment-method-interface.js
RENAMED
@@ -1,7 +1,7 @@
|
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
-
import { prepareTotalItems } from '../
|
5 |
|
6 |
describe( 'prepareTotalItems', () => {
|
7 |
const fixture = {
|
@@ -17,25 +17,21 @@ describe( 'prepareTotalItems', () => {
|
|
17 |
};
|
18 |
const expected = [
|
19 |
{
|
20 |
-
key: 'total_items',
|
21 |
label: 'Subtotal:',
|
22 |
value: 200,
|
23 |
valueWithTax: 220,
|
24 |
},
|
25 |
{
|
26 |
-
key: 'total_fees',
|
27 |
label: 'Fees:',
|
28 |
value: 100,
|
29 |
valueWithTax: 110,
|
30 |
},
|
31 |
{
|
32 |
-
key: 'total_discount',
|
33 |
label: 'Discount:',
|
34 |
value: 350,
|
35 |
valueWithTax: 400,
|
36 |
},
|
37 |
{
|
38 |
-
key: 'total_tax',
|
39 |
label: 'Taxes:',
|
40 |
value: 30,
|
41 |
valueWithTax: 30,
|
@@ -44,7 +40,6 @@ describe( 'prepareTotalItems', () => {
|
|
44 |
const expectedWithShipping = [
|
45 |
...expected,
|
46 |
{
|
47 |
-
key: 'total_shipping',
|
48 |
label: 'Shipping:',
|
49 |
value: 50,
|
50 |
valueWithTax: 55,
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
+
import { prepareTotalItems } from '../use-payment-method-interface';
|
5 |
|
6 |
describe( 'prepareTotalItems', () => {
|
7 |
const fixture = {
|
17 |
};
|
18 |
const expected = [
|
19 |
{
|
|
|
20 |
label: 'Subtotal:',
|
21 |
value: 200,
|
22 |
valueWithTax: 220,
|
23 |
},
|
24 |
{
|
|
|
25 |
label: 'Fees:',
|
26 |
value: 100,
|
27 |
valueWithTax: 110,
|
28 |
},
|
29 |
{
|
|
|
30 |
label: 'Discount:',
|
31 |
value: 350,
|
32 |
valueWithTax: 400,
|
33 |
},
|
34 |
{
|
|
|
35 |
label: 'Taxes:',
|
36 |
value: 30,
|
37 |
valueWithTax: 30,
|
40 |
const expectedWithShipping = [
|
41 |
...expected,
|
42 |
{
|
|
|
43 |
label: 'Shipping:',
|
44 |
value: 50,
|
45 |
valueWithTax: 55,
|
assets/js/base/{context/hooks/payment-methods/use-payment-method-interface.ts → hooks/payment-methods/use-payment-method-interface.js}
RENAMED
@@ -1,40 +1,95 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
|
6 |
-
import {
|
7 |
-
import
|
8 |
-
import
|
9 |
-
import {
|
10 |
-
|
|
|
|
|
11 |
|
12 |
/**
|
13 |
* Internal dependencies
|
14 |
*/
|
15 |
-
import {
|
16 |
-
import { useStoreCart } from '../cart/use-store-cart';
|
17 |
-
import { useStoreCartCoupons } from '../cart/use-store-cart-coupons';
|
18 |
-
import { useEmitResponse } from '../use-emit-response';
|
19 |
-
import { useCheckoutContext } from '../../providers/cart-checkout/checkout-state';
|
20 |
-
import { usePaymentMethodDataContext } from '../../providers/cart-checkout/payment-methods';
|
21 |
-
import { useShippingDataContext } from '../../providers/cart-checkout/shipping';
|
22 |
-
import { useCustomerDataContext } from '../../providers/cart-checkout/customer';
|
23 |
-
import { prepareTotalItems } from './utils';
|
24 |
|
25 |
/**
|
26 |
-
*
|
|
|
27 |
*/
|
28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
const {
|
30 |
isCalculating,
|
31 |
isComplete,
|
32 |
isIdle,
|
33 |
isProcessing,
|
34 |
-
onCheckoutBeforeProcessing,
|
35 |
-
onCheckoutValidationBeforeProcessing,
|
36 |
onCheckoutAfterProcessingWithSuccess,
|
37 |
onCheckoutAfterProcessingWithError,
|
|
|
38 |
onSubmit,
|
39 |
customerId,
|
40 |
} = useCheckoutContext();
|
@@ -43,7 +98,6 @@ export const usePaymentMethodInterface = (): Record< string, unknown > => {
|
|
43 |
activePaymentMethod,
|
44 |
onPaymentProcessing,
|
45 |
setExpressPaymentError,
|
46 |
-
shouldSavePayment,
|
47 |
} = usePaymentMethodDataContext();
|
48 |
const {
|
49 |
shippingErrorStatus,
|
@@ -53,6 +107,7 @@ export const usePaymentMethodInterface = (): Record< string, unknown > => {
|
|
53 |
selectedRates,
|
54 |
setSelectedRates,
|
55 |
isSelectingRate,
|
|
|
56 |
onShippingRateSuccess,
|
57 |
onShippingRateFail,
|
58 |
onShippingRateSelectSuccess,
|
@@ -86,79 +141,58 @@ export const usePaymentMethodInterface = (): Record< string, unknown > => {
|
|
86 |
};
|
87 |
}, [ cartTotals, needsShipping ] );
|
88 |
|
89 |
-
const deprecatedSetExpressPaymentError = useCallback(
|
90 |
-
( errorMessage = '' ) => {
|
91 |
-
deprecated(
|
92 |
-
'setExpressPaymentError should only be used by Express Payment Methods (using the provided onError handler).',
|
93 |
-
{
|
94 |
-
alternative: '',
|
95 |
-
plugin: 'woocommerce-gutenberg-products-block',
|
96 |
-
link:
|
97 |
-
'https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/4228',
|
98 |
-
}
|
99 |
-
);
|
100 |
-
setExpressPaymentError( errorMessage );
|
101 |
-
},
|
102 |
-
[ setExpressPaymentError ]
|
103 |
-
);
|
104 |
-
|
105 |
return {
|
106 |
-
activePaymentMethod,
|
107 |
-
billing: {
|
108 |
-
billingData,
|
109 |
-
cartTotal: currentCartTotal.current,
|
110 |
-
currency: getCurrencyFromPriceResponse( cartTotals ),
|
111 |
-
cartTotalItems: currentCartTotals.current,
|
112 |
-
displayPricesIncludingTax: getSetting(
|
113 |
-
'displayCartPricesIncludingTax',
|
114 |
-
false
|
115 |
-
) as boolean,
|
116 |
-
appliedCoupons,
|
117 |
-
customerId,
|
118 |
-
},
|
119 |
checkoutStatus: {
|
120 |
isCalculating,
|
121 |
isComplete,
|
122 |
isIdle,
|
123 |
isProcessing,
|
124 |
},
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
},
|
130 |
-
|
131 |
-
|
132 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
133 |
},
|
134 |
eventRegistration: {
|
135 |
-
onCheckoutBeforeProcessing,
|
136 |
-
onCheckoutValidationBeforeProcessing,
|
137 |
onCheckoutAfterProcessingWithSuccess,
|
138 |
onCheckoutAfterProcessingWithError,
|
|
|
139 |
onShippingRateSuccess,
|
140 |
onShippingRateFail,
|
141 |
onShippingRateSelectSuccess,
|
142 |
onShippingRateSelectFail,
|
143 |
onPaymentProcessing,
|
144 |
},
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
shippingRates,
|
150 |
-
shippingRatesLoading,
|
151 |
-
selectedRates,
|
152 |
-
setSelectedRates,
|
153 |
-
isSelectingRate,
|
154 |
-
shippingAddress,
|
155 |
-
setShippingAddress,
|
156 |
-
needsShipping,
|
157 |
},
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
},
|
162 |
-
|
|
|
|
|
163 |
};
|
164 |
};
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import {
|
5 |
+
useCheckoutContext,
|
6 |
+
usePaymentMethodDataContext,
|
7 |
+
useShippingDataContext,
|
8 |
+
useCustomerDataContext,
|
9 |
+
} from '@woocommerce/base-context';
|
10 |
import { __ } from '@wordpress/i18n';
|
11 |
import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
|
12 |
+
import { useEffect, useRef } from '@wordpress/element';
|
13 |
+
import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
|
14 |
+
import { ValidationInputError } from '@woocommerce/base-components/validation';
|
15 |
+
import {
|
16 |
+
PaymentMethodIcons,
|
17 |
+
PaymentMethodLabel,
|
18 |
+
} from '@woocommerce/base-components/cart-checkout';
|
19 |
|
20 |
/**
|
21 |
* Internal dependencies
|
22 |
*/
|
23 |
+
import { useStoreCartCoupons, useStoreCart, useEmitResponse } from '..';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
/**
|
26 |
+
* @typedef {import('@woocommerce/type-defs/registered-payment-method-props').RegisteredPaymentMethodProps} RegisteredPaymentMethodProps
|
27 |
+
* @typedef {import('@woocommerce/type-defs/cart').CartTotalItem} CartTotalItem
|
28 |
*/
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Prepares the total items into a shape usable for display as passed on to
|
32 |
+
* registered payment methods.
|
33 |
+
*
|
34 |
+
* @param {Object} totals Current cart total items
|
35 |
+
* @param {boolean} needsShipping Whether or not shipping is needed.
|
36 |
+
*
|
37 |
+
* @return {CartTotalItem[]} Array for cart total items prepared for use.
|
38 |
+
*/
|
39 |
+
export const prepareTotalItems = ( totals, needsShipping ) => {
|
40 |
+
const newTotals = [];
|
41 |
+
const factory = ( label, property ) => {
|
42 |
+
const value = parseInt( totals[ property ], 10 );
|
43 |
+
const tax = parseInt( totals[ property + '_tax' ], 10 );
|
44 |
+
return {
|
45 |
+
label,
|
46 |
+
value,
|
47 |
+
valueWithTax: value + tax,
|
48 |
+
};
|
49 |
+
};
|
50 |
+
newTotals.push(
|
51 |
+
factory(
|
52 |
+
__( 'Subtotal:', 'woo-gutenberg-products-block' ),
|
53 |
+
'total_items'
|
54 |
+
)
|
55 |
+
);
|
56 |
+
newTotals.push(
|
57 |
+
factory( __( 'Fees:', 'woo-gutenberg-products-block' ), 'total_fees' )
|
58 |
+
);
|
59 |
+
newTotals.push(
|
60 |
+
factory(
|
61 |
+
__( 'Discount:', 'woo-gutenberg-products-block' ),
|
62 |
+
'total_discount'
|
63 |
+
)
|
64 |
+
);
|
65 |
+
newTotals.push( {
|
66 |
+
label: __( 'Taxes:', 'woo-gutenberg-products-block' ),
|
67 |
+
value: parseInt( totals.total_tax, 10 ),
|
68 |
+
valueWithTax: parseInt( totals.total_tax, 10 ),
|
69 |
+
} );
|
70 |
+
if ( needsShipping ) {
|
71 |
+
newTotals.push(
|
72 |
+
factory(
|
73 |
+
__( 'Shipping:', 'woo-gutenberg-products-block' ),
|
74 |
+
'total_shipping'
|
75 |
+
)
|
76 |
+
);
|
77 |
+
}
|
78 |
+
return newTotals;
|
79 |
+
};
|
80 |
+
|
81 |
+
/**
|
82 |
+
* @return {RegisteredPaymentMethodProps} Interface to use as payment method props.
|
83 |
+
*/
|
84 |
+
export const usePaymentMethodInterface = () => {
|
85 |
const {
|
86 |
isCalculating,
|
87 |
isComplete,
|
88 |
isIdle,
|
89 |
isProcessing,
|
|
|
|
|
90 |
onCheckoutAfterProcessingWithSuccess,
|
91 |
onCheckoutAfterProcessingWithError,
|
92 |
+
onCheckoutBeforeProcessing,
|
93 |
onSubmit,
|
94 |
customerId,
|
95 |
} = useCheckoutContext();
|
98 |
activePaymentMethod,
|
99 |
onPaymentProcessing,
|
100 |
setExpressPaymentError,
|
|
|
101 |
} = usePaymentMethodDataContext();
|
102 |
const {
|
103 |
shippingErrorStatus,
|
107 |
selectedRates,
|
108 |
setSelectedRates,
|
109 |
isSelectingRate,
|
110 |
+
|
111 |
onShippingRateSuccess,
|
112 |
onShippingRateFail,
|
113 |
onShippingRateSelectSuccess,
|
141 |
};
|
142 |
}, [ cartTotals, needsShipping ] );
|
143 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
return {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
checkoutStatus: {
|
146 |
isCalculating,
|
147 |
isComplete,
|
148 |
isIdle,
|
149 |
isProcessing,
|
150 |
},
|
151 |
+
paymentStatus: currentStatus,
|
152 |
+
shippingStatus: {
|
153 |
+
shippingErrorStatus,
|
154 |
+
shippingErrorTypes,
|
155 |
},
|
156 |
+
shippingData: {
|
157 |
+
shippingRates,
|
158 |
+
shippingRatesLoading,
|
159 |
+
selectedRates,
|
160 |
+
setSelectedRates,
|
161 |
+
isSelectingRate,
|
162 |
+
shippingAddress,
|
163 |
+
setShippingAddress,
|
164 |
+
needsShipping,
|
165 |
+
},
|
166 |
+
billing: {
|
167 |
+
billingData,
|
168 |
+
cartTotal: currentCartTotal.current,
|
169 |
+
currency: getCurrencyFromPriceResponse( cartTotals ),
|
170 |
+
cartTotalItems: currentCartTotals.current,
|
171 |
+
displayPricesIncludingTax: DISPLAY_CART_PRICES_INCLUDING_TAX,
|
172 |
+
appliedCoupons,
|
173 |
+
customerId,
|
174 |
},
|
175 |
eventRegistration: {
|
|
|
|
|
176 |
onCheckoutAfterProcessingWithSuccess,
|
177 |
onCheckoutAfterProcessingWithError,
|
178 |
+
onCheckoutBeforeProcessing,
|
179 |
onShippingRateSuccess,
|
180 |
onShippingRateFail,
|
181 |
onShippingRateSelectSuccess,
|
182 |
onShippingRateSelectFail,
|
183 |
onPaymentProcessing,
|
184 |
},
|
185 |
+
components: {
|
186 |
+
ValidationInputError,
|
187 |
+
PaymentMethodIcons,
|
188 |
+
PaymentMethodLabel,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
189 |
},
|
190 |
+
emitResponse: {
|
191 |
+
noticeContexts,
|
192 |
+
responseTypes,
|
193 |
},
|
194 |
+
onSubmit,
|
195 |
+
activePaymentMethod,
|
196 |
+
setExpressPaymentError,
|
197 |
};
|
198 |
};
|
assets/js/base/hooks/payment-methods/use-payment-methods.js
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { usePaymentMethodDataContext } from '@woocommerce/base-context';
|
5 |
+
|
6 |
+
const usePaymentMethodState = ( express = false ) => {
|
7 |
+
const {
|
8 |
+
paymentMethods,
|
9 |
+
expressPaymentMethods,
|
10 |
+
paymentMethodsInitialized,
|
11 |
+
expressPaymentMethodsInitialized,
|
12 |
+
} = usePaymentMethodDataContext();
|
13 |
+
return express
|
14 |
+
? {
|
15 |
+
paymentMethods: expressPaymentMethods,
|
16 |
+
isInitialized: expressPaymentMethodsInitialized,
|
17 |
+
}
|
18 |
+
: { paymentMethods, isInitialized: paymentMethodsInitialized };
|
19 |
+
};
|
20 |
+
|
21 |
+
export const usePaymentMethods = () => usePaymentMethodState();
|
22 |
+
export const useExpressPaymentMethods = () => usePaymentMethodState( true );
|
assets/js/base/{context/hooks → hooks}/shipping/index.js
RENAMED
File without changes
|
assets/js/base/{context/hooks/shipping/use-select-shipping-rate.ts → hooks/shipping/use-select-shipping-rate.js}
RENAMED
@@ -3,13 +3,11 @@
|
|
3 |
*/
|
4 |
import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
|
5 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
6 |
-
import { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
|
7 |
|
8 |
/**
|
9 |
* Internal dependencies
|
10 |
*/
|
11 |
import { useSelectShippingRates } from './use-select-shipping-rates';
|
12 |
-
import { useStoreEvents } from '../use-store-events';
|
13 |
|
14 |
/**
|
15 |
* Selected rates are derived by looping over the shipping rates.
|
@@ -18,9 +16,8 @@ import { useStoreEvents } from '../use-store-events';
|
|
18 |
* @return {string} Selected rate id.
|
19 |
*/
|
20 |
// This will find the selected rate ID in an array of shipping rates.
|
21 |
-
const deriveSelectedRateId = (
|
22 |
-
shippingRates
|
23 |
-
) => shippingRates.find( ( rate ) => rate.selected )?.rate_id;
|
24 |
|
25 |
/**
|
26 |
* This is a custom hook for tracking selected shipping rates for a package and selecting a rate. State is used so
|
@@ -33,16 +30,7 @@ const deriveSelectedRateId = (
|
|
33 |
* - selectedShippingRate: The selected rate id.
|
34 |
* - isSelectingRate: True when rates are being resolved to the API.
|
35 |
*/
|
36 |
-
export const useSelectShippingRate = (
|
37 |
-
packageId: string | number,
|
38 |
-
shippingRates: CartShippingPackageShippingRate[]
|
39 |
-
): {
|
40 |
-
selectShippingRate: ( newShippingRateId: string ) => unknown;
|
41 |
-
selectedShippingRate: string | undefined;
|
42 |
-
isSelectingRate: boolean;
|
43 |
-
} => {
|
44 |
-
const { dispatchCheckoutEvent } = useStoreEvents();
|
45 |
-
|
46 |
// Rates are selected via the shipping data context provider.
|
47 |
const { selectShippingRate, isSelectingRate } = useSelectShippingRates();
|
48 |
|
@@ -63,14 +51,11 @@ export const useSelectShippingRate = (
|
|
63 |
|
64 |
// Sets a rate for a package in state (so changes are shown right away to consumers of the hook) and in the stores.
|
65 |
const setPackageRateId = useCallback(
|
66 |
-
(
|
67 |
-
setSelectedShippingRate(
|
68 |
-
selectShippingRate(
|
69 |
-
dispatchCheckoutEvent( 'set-selected-shipping-rate', {
|
70 |
-
shippingRateId: newShippingRateId,
|
71 |
-
} );
|
72 |
},
|
73 |
-
[ packageId, selectShippingRate
|
74 |
);
|
75 |
|
76 |
return {
|
3 |
*/
|
4 |
import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
|
5 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
|
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
10 |
import { useSelectShippingRates } from './use-select-shipping-rates';
|
|
|
11 |
|
12 |
/**
|
13 |
* Selected rates are derived by looping over the shipping rates.
|
16 |
* @return {string} Selected rate id.
|
17 |
*/
|
18 |
// This will find the selected rate ID in an array of shipping rates.
|
19 |
+
const deriveSelectedRateId = ( shippingRates ) =>
|
20 |
+
shippingRates.find( ( rate ) => rate.selected )?.rate_id;
|
|
|
21 |
|
22 |
/**
|
23 |
* This is a custom hook for tracking selected shipping rates for a package and selecting a rate. State is used so
|
30 |
* - selectedShippingRate: The selected rate id.
|
31 |
* - isSelectingRate: True when rates are being resolved to the API.
|
32 |
*/
|
33 |
+
export const useSelectShippingRate = ( packageId, shippingRates ) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
// Rates are selected via the shipping data context provider.
|
35 |
const { selectShippingRate, isSelectingRate } = useSelectShippingRates();
|
36 |
|
51 |
|
52 |
// Sets a rate for a package in state (so changes are shown right away to consumers of the hook) and in the stores.
|
53 |
const setPackageRateId = useCallback(
|
54 |
+
( newShippingRate ) => {
|
55 |
+
setSelectedShippingRate( newShippingRate );
|
56 |
+
selectShippingRate( newShippingRate, packageId );
|
|
|
|
|
|
|
57 |
},
|
58 |
+
[ packageId, selectShippingRate ]
|
59 |
);
|
60 |
|
61 |
return {
|
assets/js/base/{context/hooks/shipping/use-select-shipping-rates.ts → hooks/shipping/use-select-shipping-rates.js}
RENAMED
@@ -4,7 +4,11 @@
|
|
4 |
import { useDispatch, useSelect } from '@wordpress/data';
|
5 |
import { useCallback } from '@wordpress/element';
|
6 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
-
|
|
|
|
|
|
|
|
|
8 |
|
9 |
/**
|
10 |
* This is a custom hook for selecting shipping rates
|
@@ -13,27 +17,14 @@ import { useThrowError } from '@woocommerce/base-hooks';
|
|
13 |
* - selectShippingRate: A function that immediately returns the selected rate and dispatches an action generator.
|
14 |
* - isSelectingRate: True when rates are being resolved to the API.
|
15 |
*/
|
16 |
-
export const useSelectShippingRates = ()
|
17 |
-
selectShippingRate: (
|
18 |
-
newShippingRateId: string,
|
19 |
-
packageId: string | number
|
20 |
-
) => unknown;
|
21 |
-
isSelectingRate: boolean;
|
22 |
-
} => {
|
23 |
const throwError = useThrowError();
|
24 |
-
const { selectShippingRate } =
|
25 |
-
selectShippingRate: unknown;
|
26 |
-
} ) as {
|
27 |
-
selectShippingRate: (
|
28 |
-
newShippingRateId: string,
|
29 |
-
packageId: string | number
|
30 |
-
) => Promise< unknown >;
|
31 |
-
};
|
32 |
|
33 |
// Sets a rate for a package in state (so changes are shown right away to consumers of the hook) and in the stores.
|
34 |
const setRate = useCallback(
|
35 |
-
(
|
36 |
-
selectShippingRate(
|
37 |
( error ) => {
|
38 |
// we throw this error because an error on selecting a rate is problematic.
|
39 |
throwError( error );
|
@@ -44,7 +35,7 @@ export const useSelectShippingRates = (): {
|
|
44 |
);
|
45 |
|
46 |
// See if rates are being selected.
|
47 |
-
const isSelectingRate = useSelect
|
48 |
return select( storeKey ).isShippingRateBeingSelected();
|
49 |
}, [] );
|
50 |
|
4 |
import { useDispatch, useSelect } from '@wordpress/data';
|
5 |
import { useCallback } from '@wordpress/element';
|
6 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Internal dependencies
|
10 |
+
*/
|
11 |
+
import { useThrowError } from '../use-throw-error';
|
12 |
|
13 |
/**
|
14 |
* This is a custom hook for selecting shipping rates
|
17 |
* - selectShippingRate: A function that immediately returns the selected rate and dispatches an action generator.
|
18 |
* - isSelectingRate: True when rates are being resolved to the API.
|
19 |
*/
|
20 |
+
export const useSelectShippingRates = () => {
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
const throwError = useThrowError();
|
22 |
+
const { selectShippingRate } = useDispatch( storeKey );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
|
24 |
// Sets a rate for a package in state (so changes are shown right away to consumers of the hook) and in the stores.
|
25 |
const setRate = useCallback(
|
26 |
+
( newShippingRate, packageId ) => {
|
27 |
+
selectShippingRate( newShippingRate, packageId ).catch(
|
28 |
( error ) => {
|
29 |
// we throw this error because an error on selecting a rate is problematic.
|
30 |
throwError( error );
|
35 |
);
|
36 |
|
37 |
// See if rates are being selected.
|
38 |
+
const isSelectingRate = useSelect( ( select ) => {
|
39 |
return select( storeKey ).isShippingRateBeingSelected();
|
40 |
}, [] );
|
41 |
|
assets/js/base/{context/hooks/collections → hooks}/test/use-collection.js
RENAMED
File without changes
|
assets/js/base/{context/hooks → hooks}/test/use-query-state.js
RENAMED
File without changes
|
assets/js/base/hooks/test/use-shallow-equal.js
CHANGED
@@ -16,15 +16,21 @@ describe( 'useShallowEqual', () => {
|
|
16 |
let renderer;
|
17 |
beforeEach( () => ( renderer = null ) );
|
18 |
it.each`
|
19 |
-
testValueA | aType | testValueB | bType
|
20 |
-
${ { a: 'b', foo: 'bar' } } | ${ 'object' } | ${ { foo: 'bar', a: 'b' } } | ${ 'object' }
|
21 |
-
${
|
22 |
-
${
|
23 |
-
${ '
|
24 |
-
${
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
`(
|
26 |
-
'$testValueA ($aType) and $testValueB ($bType) are expected to be equal',
|
27 |
-
( { testValueA, testValueB } ) => {
|
28 |
let testPropValue;
|
29 |
act( () => {
|
30 |
renderer = TestRenderer.create(
|
@@ -38,35 +44,11 @@ describe( 'useShallowEqual', () => {
|
|
38 |
renderer.update( <TestComponent testValue={ testValueB } /> );
|
39 |
} );
|
40 |
testPropValue = renderer.root.findByType( 'div' ).props.newValue;
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
testValueA | aType | testValueB | bType
|
47 |
-
${ { a: 'b', foo: 'bar' } } | ${ 'object' } | ${ { foo: 'bar', a: 'c' } } | ${ 'object' }
|
48 |
-
${ [ 'b', 'bar' ] } | ${ 'array' } | ${ [ 'bar', 'b' ] } | ${ 'array' }
|
49 |
-
${ 1 } | ${ 'number' } | ${ '1' } | ${ 'string' }
|
50 |
-
${ 1 } | ${ 'number' } | ${ 2 } | ${ 'number' }
|
51 |
-
${ 1 } | ${ 'number' } | ${ true } | ${ 'bool' }
|
52 |
-
${ 0 } | ${ 'number' } | ${ false } | ${ 'bool' }
|
53 |
-
`(
|
54 |
-
'$testValueA ($aType) and $testValueB ($bType) are expected to not be equal',
|
55 |
-
( { testValueA, testValueB } ) => {
|
56 |
-
let testPropValue;
|
57 |
-
act( () => {
|
58 |
-
renderer = TestRenderer.create(
|
59 |
-
<TestComponent testValue={ testValueA } />
|
60 |
-
);
|
61 |
-
} );
|
62 |
-
testPropValue = renderer.root.findByType( 'div' ).props.newValue;
|
63 |
-
expect( testPropValue ).toBe( testValueA );
|
64 |
-
// do update
|
65 |
-
act( () => {
|
66 |
-
renderer.update( <TestComponent testValue={ testValueB } /> );
|
67 |
-
} );
|
68 |
-
testPropValue = renderer.root.findByType( 'div' ).props.newValue;
|
69 |
-
expect( testPropValue ).toBe( testValueB );
|
70 |
}
|
71 |
);
|
72 |
} );
|
16 |
let renderer;
|
17 |
beforeEach( () => ( renderer = null ) );
|
18 |
it.each`
|
19 |
+
testValueA | aType | testValueB | bType | expectEqual
|
20 |
+
${ { a: 'b', foo: 'bar' } } | ${ 'object' } | ${ { foo: 'bar', a: 'b' } } | ${ 'object' } | ${ true }
|
21 |
+
${ { a: 'b', foo: 'bar' } } | ${ 'object' } | ${ { foo: 'bar', a: 'c' } } | ${ 'object' } | ${ false }
|
22 |
+
${ [ 'b', 'bar' ] } | ${ 'array' } | ${ [ 'b', 'bar' ] } | ${ 'array' } | ${ true }
|
23 |
+
${ [ 'b', 'bar' ] } | ${ 'array' } | ${ [ 'bar', 'b' ] } | ${ 'array' } | ${ false }
|
24 |
+
${ 1 } | ${ 'number' } | ${ 1 } | ${ 'number' } | ${ true }
|
25 |
+
${ 1 } | ${ 'number' } | ${ '1' } | ${ 'string' } | ${ false }
|
26 |
+
${ '1' } | ${ 'string' } | ${ '1' } | ${ 'string' } | ${ true }
|
27 |
+
${ 1 } | ${ 'number' } | ${ 2 } | ${ 'number' } | ${ false }
|
28 |
+
${ 1 } | ${ 'number' } | ${ true } | ${ 'bool' } | ${ false }
|
29 |
+
${ 0 } | ${ 'number' } | ${ false } | ${ 'bool' } | ${ false }
|
30 |
+
${ true } | ${ 'bool' } | ${ true } | ${ 'bool' } | ${ true }
|
31 |
`(
|
32 |
+
'$testValueA ($aType) and $testValueB ($bType) are expected to be equal ($expectEqual)',
|
33 |
+
( { testValueA, testValueB, expectEqual } ) => {
|
34 |
let testPropValue;
|
35 |
act( () => {
|
36 |
renderer = TestRenderer.create(
|
44 |
renderer.update( <TestComponent testValue={ testValueB } /> );
|
45 |
} );
|
46 |
testPropValue = renderer.root.findByType( 'div' ).props.newValue;
|
47 |
+
if ( expectEqual ) {
|
48 |
+
expect( testPropValue ).toBe( testValueA );
|
49 |
+
} else {
|
50 |
+
expect( testPropValue ).toBe( testValueB );
|
51 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
}
|
53 |
);
|
54 |
} );
|
assets/js/base/{context/hooks → hooks}/test/use-store-notices.js
RENAMED
@@ -34,6 +34,7 @@ describe( 'useStoreNotices', () => {
|
|
34 |
// Assert initial state.
|
35 |
expect( storeNoticesData.notices ).toEqual( [] );
|
36 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
|
|
37 |
|
38 |
// Add error notice.
|
39 |
act( () => {
|
@@ -42,17 +43,25 @@ describe( 'useStoreNotices', () => {
|
|
42 |
|
43 |
expect( storeNoticesData.notices.length ).toBe( 1 );
|
44 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( true );
|
|
|
45 |
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
47 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( true );
|
|
|
48 |
|
49 |
// Remove error notice.
|
50 |
act( () => {
|
51 |
storeNoticesData.removeNotices( 'error' );
|
52 |
} );
|
53 |
|
54 |
-
expect( storeNoticesData.notices.length ).toBe(
|
55 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
|
|
56 |
|
57 |
// Remove all remaining notices.
|
58 |
act( () => {
|
@@ -61,5 +70,6 @@ describe( 'useStoreNotices', () => {
|
|
61 |
|
62 |
expect( storeNoticesData.notices.length ).toBe( 0 );
|
63 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
|
|
64 |
} );
|
65 |
} );
|
34 |
// Assert initial state.
|
35 |
expect( storeNoticesData.notices ).toEqual( [] );
|
36 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
37 |
+
expect( storeNoticesData.hasNoticesOfType( 'snackbar' ) ).toBe( false );
|
38 |
|
39 |
// Add error notice.
|
40 |
act( () => {
|
43 |
|
44 |
expect( storeNoticesData.notices.length ).toBe( 1 );
|
45 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( true );
|
46 |
+
expect( storeNoticesData.hasNoticesOfType( 'snackbar' ) ).toBe( false );
|
47 |
|
48 |
+
// Add snackbar notice.
|
49 |
+
act( () => {
|
50 |
+
storeNoticesData.addSnackbarNotice( 'Snackbar notice' );
|
51 |
+
} );
|
52 |
+
|
53 |
+
expect( storeNoticesData.notices.length ).toBe( 2 );
|
54 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( true );
|
55 |
+
expect( storeNoticesData.hasNoticesOfType( 'snackbar' ) ).toBe( true );
|
56 |
|
57 |
// Remove error notice.
|
58 |
act( () => {
|
59 |
storeNoticesData.removeNotices( 'error' );
|
60 |
} );
|
61 |
|
62 |
+
expect( storeNoticesData.notices.length ).toBe( 1 );
|
63 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
64 |
+
expect( storeNoticesData.hasNoticesOfType( 'snackbar' ) ).toBe( true );
|
65 |
|
66 |
// Remove all remaining notices.
|
67 |
act( () => {
|
70 |
|
71 |
expect( storeNoticesData.notices.length ).toBe( 0 );
|
72 |
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
73 |
+
expect( storeNoticesData.hasNoticesOfType( 'snackbar' ) ).toBe( false );
|
74 |
} );
|
75 |
} );
|
assets/js/base/{context/hooks → hooks}/test/use-store-products.js
RENAMED
File without changes
|
assets/js/base/{context/hooks/collections → hooks}/use-collection-data.js
RENAMED
@@ -2,16 +2,16 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { useState, useEffect, useMemo } from '@wordpress/element';
|
|
|
5 |
import { useDebounce } from 'use-debounce';
|
6 |
import { sortBy } from 'lodash';
|
7 |
-
import { useShallowEqual } from '@woocommerce/base-hooks';
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
11 |
*/
|
12 |
-
import {
|
|
|
13 |
import { useCollection } from './use-collection';
|
14 |
-
import { useQueryStateContext } from '../../providers/query-state-context';
|
15 |
|
16 |
const buildCollectionDataQuery = ( collectionDataQueryState ) => {
|
17 |
const query = collectionDataQueryState;
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { useState, useEffect, useMemo } from '@wordpress/element';
|
5 |
+
import { useQueryStateContext } from '@woocommerce/base-context';
|
6 |
import { useDebounce } from 'use-debounce';
|
7 |
import { sortBy } from 'lodash';
|
|
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
11 |
*/
|
12 |
+
import { useShallowEqual } from './use-shallow-equal';
|
13 |
+
import { useQueryStateByContext, useQueryStateByKey } from './use-query-state';
|
14 |
import { useCollection } from './use-collection';
|
|
|
15 |
|
16 |
const buildCollectionDataQuery = ( collectionDataQueryState ) => {
|
17 |
const query = collectionDataQueryState;
|
assets/js/base/{context/hooks/collections → hooks}/use-collection-header.js
RENAMED
@@ -3,7 +3,11 @@
|
|
3 |
*/
|
4 |
import { COLLECTIONS_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
5 |
import { useSelect } from '@wordpress/data';
|
6 |
-
|
|
|
|
|
|
|
|
|
7 |
|
8 |
/**
|
9 |
* This is a custom hook that is wired up to the `wc/store/collections` data
|
3 |
*/
|
4 |
import { COLLECTIONS_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
5 |
import { useSelect } from '@wordpress/data';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import { useShallowEqual } from './use-shallow-equal';
|
11 |
|
12 |
/**
|
13 |
* This is a custom hook that is wired up to the `wc/store/collections` data
|
assets/js/base/{context/hooks/collections → hooks}/use-collection.js
RENAMED
@@ -4,7 +4,12 @@
|
|
4 |
import { COLLECTIONS_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
5 |
import { useSelect } from '@wordpress/data';
|
6 |
import { useRef } from '@wordpress/element';
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
/**
|
10 |
* This is a custom hook that is wired up to the `wc/store/collections` data
|
4 |
import { COLLECTIONS_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
5 |
import { useSelect } from '@wordpress/data';
|
6 |
import { useRef } from '@wordpress/element';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Internal dependencies
|
10 |
+
*/
|
11 |
+
import { useShallowEqual } from './use-shallow-equal';
|
12 |
+
import { useThrowError } from './use-throw-error';
|
13 |
|
14 |
/**
|
15 |
* This is a custom hook that is wired up to the `wc/store/collections` data
|
assets/js/base/hooks/{use-container-queries.ts → use-container-queries.js}
RENAMED
@@ -29,7 +29,7 @@ import { useResizeObserver } from 'wordpress-compose';
|
|
29 |
* };
|
30 |
* ```
|
31 |
*/
|
32 |
-
export const useContainerQueries = ()
|
33 |
const [ resizeListener, { width } ] = useResizeObserver();
|
34 |
|
35 |
let className = '';
|
29 |
* };
|
30 |
* ```
|
31 |
*/
|
32 |
+
export const useContainerQueries = () => {
|
33 |
const [ resizeListener, { width } ] = useResizeObserver();
|
34 |
|
35 |
let className = '';
|
assets/js/base/hooks/use-local-storage-state.ts
DELETED
@@ -1,36 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useEffect, useState } from '@wordpress/element';
|
5 |
-
|
6 |
-
export const useLocalStorageState = < T >(
|
7 |
-
key: string,
|
8 |
-
initialValue: T
|
9 |
-
): [ T, ( arg0: T ) => void ] => {
|
10 |
-
const [ state, setState ] = useState< T >( () => {
|
11 |
-
const valueInLocalStorage = window.localStorage.getItem( key );
|
12 |
-
if ( valueInLocalStorage ) {
|
13 |
-
try {
|
14 |
-
return JSON.parse( valueInLocalStorage );
|
15 |
-
} catch {
|
16 |
-
// eslint-disable-next-line no-console
|
17 |
-
console.error(
|
18 |
-
`Value for key '${ key }' could not be retrieved from localStorage because it can't be parsed.`
|
19 |
-
);
|
20 |
-
}
|
21 |
-
}
|
22 |
-
return initialValue;
|
23 |
-
} );
|
24 |
-
useEffect( () => {
|
25 |
-
try {
|
26 |
-
window.localStorage.setItem( key, JSON.stringify( state ) );
|
27 |
-
} catch {
|
28 |
-
// eslint-disable-next-line no-console
|
29 |
-
console.error(
|
30 |
-
`Value for key '${ key }' could not be saved in localStorage because it can't be converted into a string.`
|
31 |
-
);
|
32 |
-
}
|
33 |
-
}, [ key, state ] );
|
34 |
-
|
35 |
-
return [ state, setState ];
|
36 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/hooks/{use-previous.ts → use-previous.js}
RENAMED
@@ -3,9 +3,6 @@
|
|
3 |
*/
|
4 |
import { useRef, useEffect } from 'react';
|
5 |
|
6 |
-
interface Validation< T > {
|
7 |
-
( value: T, previousValue: T | undefined ): boolean;
|
8 |
-
}
|
9 |
/**
|
10 |
* Use Previous based on https://usehooks.com/usePrevious/.
|
11 |
*
|
@@ -13,11 +10,8 @@ interface Validation< T > {
|
|
13 |
* @param {Function} [validation] Function that needs to validate for the value
|
14 |
* to be updated.
|
15 |
*/
|
16 |
-
export
|
17 |
-
|
18 |
-
validation?: Validation< T >
|
19 |
-
): T | undefined {
|
20 |
-
const ref = useRef< T >();
|
21 |
|
22 |
useEffect( () => {
|
23 |
if (
|
@@ -29,4 +23,4 @@ export function usePrevious< T >(
|
|
29 |
}, [ value, validation ] );
|
30 |
|
31 |
return ref.current;
|
32 |
-
}
|
3 |
*/
|
4 |
import { useRef, useEffect } from 'react';
|
5 |
|
|
|
|
|
|
|
6 |
/**
|
7 |
* Use Previous based on https://usehooks.com/usePrevious/.
|
8 |
*
|
10 |
* @param {Function} [validation] Function that needs to validate for the value
|
11 |
* to be updated.
|
12 |
*/
|
13 |
+
export const usePrevious = ( value, validation ) => {
|
14 |
+
const ref = useRef();
|
|
|
|
|
|
|
15 |
|
16 |
useEffect( () => {
|
17 |
if (
|
23 |
}, [ value, validation ] );
|
24 |
|
25 |
return ref.current;
|
26 |
+
};
|
assets/js/base/{context/hooks → hooks}/use-query-state.js
RENAMED
@@ -4,14 +4,14 @@
|
|
4 |
import { QUERY_STATE_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
5 |
import { useSelect, useDispatch } from '@wordpress/data';
|
6 |
import { useRef, useEffect, useCallback } from '@wordpress/element';
|
|
|
7 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
8 |
-
import { useShallowEqual, usePrevious } from '@woocommerce/base-hooks';
|
9 |
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
-
|
14 |
-
import {
|
15 |
|
16 |
/**
|
17 |
* A custom hook that exposes the current query state and a setter for the query
|
4 |
import { QUERY_STATE_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
5 |
import { useSelect, useDispatch } from '@wordpress/data';
|
6 |
import { useRef, useEffect, useCallback } from '@wordpress/element';
|
7 |
+
import { useQueryStateContext } from '@woocommerce/base-context';
|
8 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
|
|
9 |
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
+
import { useShallowEqual } from './use-shallow-equal';
|
14 |
+
import { usePrevious } from './use-previous';
|
15 |
|
16 |
/**
|
17 |
* A custom hook that exposes the current query state and a setter for the query
|
assets/js/base/hooks/{use-shallow-equal.ts → use-shallow-equal.js}
RENAMED
@@ -13,12 +13,13 @@ import isShallowEqual from '@wordpress/is-shallow-equal';
|
|
13 |
*
|
14 |
* @param {*} value Value to keep the same if satisfies shallow equality.
|
15 |
*
|
16 |
-
* @return {*} The previous cached instance of the value if the current has
|
|
|
17 |
*/
|
18 |
-
export
|
19 |
-
const ref = useRef
|
20 |
if ( ! isShallowEqual( value, ref.current ) ) {
|
21 |
ref.current = value;
|
22 |
}
|
23 |
return ref.current;
|
24 |
-
}
|
13 |
*
|
14 |
* @param {*} value Value to keep the same if satisfies shallow equality.
|
15 |
*
|
16 |
+
* @return {*} The previous cached instance of the value if the current has
|
17 |
+
* shallow equality with it.
|
18 |
*/
|
19 |
+
export const useShallowEqual = ( value ) => {
|
20 |
+
const ref = useRef();
|
21 |
if ( ! isShallowEqual( value, ref.current ) ) {
|
22 |
ref.current = value;
|
23 |
}
|
24 |
return ref.current;
|
25 |
+
};
|
assets/js/base/{context/hooks/use-store-add-to-cart.ts → hooks/use-store-add-to-cart.js}
RENAMED
@@ -5,24 +5,17 @@ import { useState, useEffect, useRef } from '@wordpress/element';
|
|
5 |
import { useDispatch } from '@wordpress/data';
|
6 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
import { decodeEntities } from '@wordpress/html-entities';
|
8 |
-
import type { CartItem } from '@woocommerce/types';
|
9 |
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
-
import { useStoreCart } from './cart/use-store-cart';
|
14 |
import { useStoreNotices } from './use-store-notices';
|
|
|
15 |
|
16 |
/**
|
17 |
* @typedef {import('@woocommerce/type-defs/hooks').StoreCartItemAddToCart} StoreCartItemAddToCart
|
18 |
*/
|
19 |
|
20 |
-
interface StoreAddToCart {
|
21 |
-
cartQuantity: number;
|
22 |
-
addingToCart: boolean;
|
23 |
-
cartIsLoading: boolean;
|
24 |
-
addToCart: ( quantity?: number ) => Promise< boolean >;
|
25 |
-
}
|
26 |
/**
|
27 |
* Get the quantity of a product in the cart.
|
28 |
*
|
@@ -30,10 +23,7 @@ interface StoreAddToCart {
|
|
30 |
* @param {number} productId The product id to look for.
|
31 |
* @return {number} Quantity in the cart.
|
32 |
*/
|
33 |
-
const getQuantityFromCartItems = (
|
34 |
-
cartItems: Array< CartItem >,
|
35 |
-
productId: number
|
36 |
-
): number => {
|
37 |
const productItem = cartItems.find( ( { id } ) => id === productId );
|
38 |
|
39 |
return productItem ? productItem.quantity : 0;
|
@@ -49,7 +39,7 @@ const getQuantityFromCartItems = (
|
|
49 |
* @return {StoreCartItemAddToCart} An object exposing data and actions relating
|
50 |
* to add to cart functionality.
|
51 |
*/
|
52 |
-
export const useStoreAddToCart = ( productId
|
53 |
const { addItemToCart } = useDispatch( storeKey );
|
54 |
const { cartItems, cartIsLoading } = useStoreCart();
|
55 |
const { addErrorNotice, removeNotice } = useStoreNotices();
|
@@ -61,9 +51,11 @@ export const useStoreAddToCart = ( productId: number ): StoreAddToCart => {
|
|
61 |
|
62 |
const addToCart = ( quantity = 1 ) => {
|
63 |
setAddingToCart( true );
|
64 |
-
|
65 |
-
.then( () => {
|
66 |
-
|
|
|
|
|
67 |
} )
|
68 |
.catch( ( error ) => {
|
69 |
addErrorNotice( decodeEntities( error.message ), {
|
5 |
import { useDispatch } from '@wordpress/data';
|
6 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
7 |
import { decodeEntities } from '@wordpress/html-entities';
|
|
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
11 |
*/
|
|
|
12 |
import { useStoreNotices } from './use-store-notices';
|
13 |
+
import { useStoreCart } from './cart';
|
14 |
|
15 |
/**
|
16 |
* @typedef {import('@woocommerce/type-defs/hooks').StoreCartItemAddToCart} StoreCartItemAddToCart
|
17 |
*/
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
/**
|
20 |
* Get the quantity of a product in the cart.
|
21 |
*
|
23 |
* @param {number} productId The product id to look for.
|
24 |
* @return {number} Quantity in the cart.
|
25 |
*/
|
26 |
+
const getQuantityFromCartItems = ( cartItems, productId ) => {
|
|
|
|
|
|
|
27 |
const productItem = cartItems.find( ( { id } ) => id === productId );
|
28 |
|
29 |
return productItem ? productItem.quantity : 0;
|
39 |
* @return {StoreCartItemAddToCart} An object exposing data and actions relating
|
40 |
* to add to cart functionality.
|
41 |
*/
|
42 |
+
export const useStoreAddToCart = ( productId ) => {
|
43 |
const { addItemToCart } = useDispatch( storeKey );
|
44 |
const { cartItems, cartIsLoading } = useStoreCart();
|
45 |
const { addErrorNotice, removeNotice } = useStoreNotices();
|
51 |
|
52 |
const addToCart = ( quantity = 1 ) => {
|
53 |
setAddingToCart( true );
|
54 |
+
addItemToCart( productId, quantity )
|
55 |
+
.then( ( result ) => {
|
56 |
+
if ( result === true ) {
|
57 |
+
removeNotice( 'add-to-cart' );
|
58 |
+
}
|
59 |
} )
|
60 |
.catch( ( error ) => {
|
61 |
addErrorNotice( decodeEntities( error.message ), {
|
assets/js/base/{context/hooks → hooks}/use-store-notices.js
RENAMED
@@ -1,18 +1,15 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import { useMemo, useRef, useEffect } from '@wordpress/element';
|
5 |
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import { useStoreNoticesContext } from '../providers/store-notices/context';
|
10 |
-
|
11 |
export const useStoreNotices = () => {
|
12 |
const {
|
13 |
notices,
|
14 |
createNotice,
|
15 |
removeNotice,
|
|
|
16 |
setIsSuppressed,
|
17 |
} = useStoreNoticesContext();
|
18 |
// Added to a ref so the surface for notices doesn't change frequently
|
@@ -65,8 +62,11 @@ export const useStoreNotices = () => {
|
|
65 |
void createNotice( 'success', text, {
|
66 |
...noticeProps,
|
67 |
} ),
|
|
|
|
|
|
|
68 |
} ),
|
69 |
-
[ createNotice ]
|
70 |
);
|
71 |
|
72 |
return {
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { useStoreNoticesContext } from '@woocommerce/base-context';
|
5 |
import { useMemo, useRef, useEffect } from '@wordpress/element';
|
6 |
|
|
|
|
|
|
|
|
|
|
|
7 |
export const useStoreNotices = () => {
|
8 |
const {
|
9 |
notices,
|
10 |
createNotice,
|
11 |
removeNotice,
|
12 |
+
createSnackbarNotice,
|
13 |
setIsSuppressed,
|
14 |
} = useStoreNoticesContext();
|
15 |
// Added to a ref so the surface for notices doesn't change frequently
|
62 |
void createNotice( 'success', text, {
|
63 |
...noticeProps,
|
64 |
} ),
|
65 |
+
addSnackbarNotice: ( text, noticeProps = {} ) => {
|
66 |
+
createSnackbarNotice( text, noticeProps );
|
67 |
+
},
|
68 |
} ),
|
69 |
+
[ createNotice, createSnackbarNotice ]
|
70 |
);
|
71 |
|
72 |
return {
|
assets/js/base/{context/hooks → hooks}/use-store-products.js
RENAMED
@@ -1,7 +1,8 @@
|
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
-
import {
|
|
|
5 |
|
6 |
/**
|
7 |
* This is a custom hook that is wired up to the `wc/store/collections` data
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
+
import { useCollection } from './use-collection';
|
5 |
+
import { useCollectionHeader } from './use-collection-header';
|
6 |
|
7 |
/**
|
8 |
* This is a custom hook that is wired up to the `wc/store/collections` data
|
assets/js/base/hooks/{use-throw-error.ts → use-throw-error.js}
RENAMED
@@ -10,11 +10,16 @@ import { useState, useCallback } from '@wordpress/element';
|
|
10 |
*
|
11 |
* @return {function(Object)} A function receiving the error that will be thrown.
|
12 |
*/
|
13 |
-
export const useThrowError = ()
|
14 |
const [ , setState ] = useState();
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
|
|
|
|
|
|
|
|
|
|
20 |
};
|
10 |
*
|
11 |
* @return {function(Object)} A function receiving the error that will be thrown.
|
12 |
*/
|
13 |
+
export const useThrowError = () => {
|
14 |
const [ , setState ] = useState();
|
15 |
+
|
16 |
+
const throwError = useCallback(
|
17 |
+
( error ) =>
|
18 |
+
setState( () => {
|
19 |
+
throw error;
|
20 |
+
} ),
|
21 |
+
[]
|
22 |
+
);
|
23 |
+
|
24 |
+
return throwError;
|
25 |
};
|
assets/js/base/hooks/use-trigger-fragment-refresh.js
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { useRef, useEffect } from '@wordpress/element';
|
5 |
+
import { triggerFragmentRefresh } from '@woocommerce/base-utils';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Helper that implements triggerFragmentRefresh.
|
9 |
+
*
|
10 |
+
* @param {number} quantityInCart Quantity of the item in the cart.
|
11 |
+
*/
|
12 |
+
export const useTriggerFragmentRefresh = ( quantityInCart ) => {
|
13 |
+
const firstMount = useRef( true );
|
14 |
+
|
15 |
+
useEffect( () => {
|
16 |
+
if ( firstMount.current ) {
|
17 |
+
firstMount.current = false;
|
18 |
+
return;
|
19 |
+
}
|
20 |
+
triggerFragmentRefresh();
|
21 |
+
}, [ quantityInCart ] );
|
22 |
+
};
|
assets/js/base/utils/address.js
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* pluckAddress takes a full address object and returns relevant fields for calculating
|
3 |
+
* shipping, so we can track when one of them change to update rates.
|
4 |
+
*
|
5 |
+
* @param {Object} address An object containing all address information
|
6 |
+
* @param {string} address.country The country.
|
7 |
+
* @param {string} address.state The state.
|
8 |
+
* @param {string} address.city The city.
|
9 |
+
* @param {string} address.postcode The postal code.
|
10 |
+
*
|
11 |
+
* @return {Object} pluckedAddress An object containing shipping address that are needed to fetch an address.
|
12 |
+
*/
|
13 |
+
export const pluckAddress = ( {
|
14 |
+
country = '',
|
15 |
+
state = '',
|
16 |
+
city = '',
|
17 |
+
postcode = '',
|
18 |
+
} ) => ( {
|
19 |
+
country: country.trim(),
|
20 |
+
state: state.trim(),
|
21 |
+
city: city.trim(),
|
22 |
+
postcode: postcode ? postcode.replace( ' ', '' ).toUpperCase() : '',
|
23 |
+
} );
|
assets/js/base/utils/address.ts
DELETED
@@ -1,85 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { defaultAddressFields } from '@woocommerce/settings';
|
5 |
-
import prepareAddressFields from '@woocommerce/base-components/cart-checkout/address-form/prepare-address-fields';
|
6 |
-
import { isEmail } from '@wordpress/url';
|
7 |
-
import type {
|
8 |
-
CartResponseBillingAddress,
|
9 |
-
CartResponseShippingAddress,
|
10 |
-
} from '@woocommerce/types';
|
11 |
-
|
12 |
-
/**
|
13 |
-
* pluckAddress takes a full address object and returns relevant fields for calculating
|
14 |
-
* shipping, so we can track when one of them change to update rates.
|
15 |
-
*
|
16 |
-
* @param {Object} address An object containing all address information
|
17 |
-
* @param {string} address.country The country.
|
18 |
-
* @param {string} address.state The state.
|
19 |
-
* @param {string} address.city The city.
|
20 |
-
* @param {string} address.postcode The postal code.
|
21 |
-
*
|
22 |
-
* @return {Object} pluckedAddress An object containing shipping address that are needed to fetch an address.
|
23 |
-
*/
|
24 |
-
export const pluckAddress = ( {
|
25 |
-
country = '',
|
26 |
-
state = '',
|
27 |
-
city = '',
|
28 |
-
postcode = '',
|
29 |
-
}: CartResponseBillingAddress | CartResponseShippingAddress ): {
|
30 |
-
country: string;
|
31 |
-
state: string;
|
32 |
-
city: string;
|
33 |
-
postcode: string;
|
34 |
-
} => ( {
|
35 |
-
country: country.trim(),
|
36 |
-
state: state.trim(),
|
37 |
-
city: city.trim(),
|
38 |
-
postcode: postcode ? postcode.replace( ' ', '' ).toUpperCase() : '',
|
39 |
-
} );
|
40 |
-
|
41 |
-
/**
|
42 |
-
* pluckEmail takes a full address object and returns only the email address, if set and valid. Otherwise returns an empty string.
|
43 |
-
*
|
44 |
-
* @param {Object} address An object containing all address information
|
45 |
-
* @param {string} address.email The email address.
|
46 |
-
* @return {string} The email address.
|
47 |
-
*/
|
48 |
-
export const pluckEmail = ( {
|
49 |
-
email = '',
|
50 |
-
}: CartResponseBillingAddress ): string =>
|
51 |
-
isEmail( email ) ? email.trim() : '';
|
52 |
-
|
53 |
-
/**
|
54 |
-
* Type-guard.
|
55 |
-
*/
|
56 |
-
const isValidAddressKey = (
|
57 |
-
key: string,
|
58 |
-
address: CartResponseBillingAddress | CartResponseShippingAddress
|
59 |
-
): key is keyof typeof address => {
|
60 |
-
return key in address;
|
61 |
-
};
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Sets fields to an empty string in an address if they are hidden by the settings in countryLocale.
|
65 |
-
*
|
66 |
-
* @param {Object} address The address to empty fields from.
|
67 |
-
* @return {Object} The address with hidden fields values removed.
|
68 |
-
*/
|
69 |
-
export const emptyHiddenAddressFields = <
|
70 |
-
T extends CartResponseBillingAddress | CartResponseShippingAddress
|
71 |
-
>(
|
72 |
-
address: T
|
73 |
-
): T => {
|
74 |
-
const fields = Object.keys( defaultAddressFields );
|
75 |
-
const addressFields = prepareAddressFields( fields, {}, address.country );
|
76 |
-
const newAddress = Object.assign( {}, address ) as T;
|
77 |
-
|
78 |
-
addressFields.forEach( ( { key = '', hidden = false } ) => {
|
79 |
-
if ( hidden && isValidAddressKey( key, address ) ) {
|
80 |
-
newAddress[ key ] = '';
|
81 |
-
}
|
82 |
-
} );
|
83 |
-
|
84 |
-
return newAddress;
|
85 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/utils/derive-selected-shipping-rates.js
CHANGED
@@ -1,8 +1,3 @@
|
|
1 |
-
/**
|
2 |
-
* Internal dependencies
|
3 |
-
*/
|
4 |
-
import { fromEntriesPolyfill } from './from-entries-polyfill';
|
5 |
-
|
6 |
/**
|
7 |
* Get an array of selected shipping rates keyed by Package ID.
|
8 |
*
|
@@ -10,11 +5,15 @@ import { fromEntriesPolyfill } from './from-entries-polyfill';
|
|
10 |
* @return {Object} Object containing the package IDs and selected rates in the format: { [packageId:string]: rateId:string }
|
11 |
*/
|
12 |
export const deriveSelectedShippingRates = ( shippingRates ) =>
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
)
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
/**
|
2 |
* Get an array of selected shipping rates keyed by Package ID.
|
3 |
*
|
5 |
* @return {Object} Object containing the package IDs and selected rates in the format: { [packageId:string]: rateId:string }
|
6 |
*/
|
7 |
export const deriveSelectedShippingRates = ( shippingRates ) =>
|
8 |
+
shippingRates
|
9 |
+
.map( ( { package_id: packageId, shipping_rates: packageRates } ) => [
|
10 |
+
packageId,
|
11 |
+
packageRates.find( ( rate ) => rate.selected )?.rate_id,
|
12 |
+
] )
|
13 |
+
// A fromEntries polyfill, creates an object from an array of arrays.
|
14 |
+
.reduce( ( obj, [ key, val ] ) => {
|
15 |
+
if ( val ) {
|
16 |
+
obj[ key ] = val;
|
17 |
+
}
|
18 |
+
return obj;
|
19 |
+
}, {} );
|
assets/js/base/utils/from-entries-polyfill.ts
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* A polyfill for Object.fromEntries function.
|
3 |
-
*
|
4 |
-
* @param {Array<[string, unknown]>} array Array to be turned back to object
|
5 |
-
* @return {Record< string, unknown >} the newly created object
|
6 |
-
*/
|
7 |
-
export const fromEntriesPolyfill = (
|
8 |
-
array: Array< [ string, unknown ] >
|
9 |
-
): Record< string, unknown > =>
|
10 |
-
array.reduce< Record< string, unknown > >( ( obj, [ key, val ] ) => {
|
11 |
-
obj[ key ] = val;
|
12 |
-
return obj;
|
13 |
-
}, {} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/utils/index.js
CHANGED
@@ -7,4 +7,3 @@ export * from './get-intersection-observer';
|
|
7 |
export * from './get-valid-block-attributes';
|
8 |
export * from './product-data';
|
9 |
export * from './derive-selected-shipping-rates';
|
10 |
-
export * from './from-entries-polyfill';
|
7 |
export * from './get-valid-block-attributes';
|
8 |
export * from './product-data';
|
9 |
export * from './derive-selected-shipping-rates';
|
|
assets/js/base/utils/legacy-events.js
CHANGED
@@ -34,21 +34,11 @@ export const dispatchEvent = (
|
|
34 |
}
|
35 |
};
|
36 |
|
37 |
-
let fragmentRequestTimeoutId;
|
38 |
-
|
39 |
// This is a hack to trigger cart updates till we migrate to block based cart
|
40 |
// that relies on the store, see
|
41 |
// https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues/1247
|
42 |
export const triggerFragmentRefresh = () => {
|
43 |
-
|
44 |
-
clearTimeout( fragmentRequestTimeoutId );
|
45 |
-
}
|
46 |
-
fragmentRequestTimeoutId = setTimeout( () => {
|
47 |
-
dispatchEvent( 'wc_fragment_refresh', {
|
48 |
-
bubbles: true,
|
49 |
-
cancelable: true,
|
50 |
-
} );
|
51 |
-
}, 50 );
|
52 |
};
|
53 |
|
54 |
/**
|
34 |
}
|
35 |
};
|
36 |
|
|
|
|
|
37 |
// This is a hack to trigger cart updates till we migrate to block based cart
|
38 |
// that relies on the store, see
|
39 |
// https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues/1247
|
40 |
export const triggerFragmentRefresh = () => {
|
41 |
+
dispatchEvent( 'wc_fragment_refresh', { bubbles: true, cancelable: true } );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
};
|
43 |
|
44 |
/**
|
assets/js/base/utils/test/address.ts
DELETED
@@ -1,24 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { emptyHiddenAddressFields } from '@woocommerce/base-utils';
|
5 |
-
|
6 |
-
describe( 'emptyHiddenAddressFields', () => {
|
7 |
-
it( "Removes state from an address where the country doesn't use states", () => {
|
8 |
-
const address = {
|
9 |
-
first_name: 'Jonny',
|
10 |
-
last_name: 'Awesome',
|
11 |
-
company: 'WordPress',
|
12 |
-
address_1: '123 Address Street',
|
13 |
-
address_2: 'Address 2',
|
14 |
-
city: 'Vienna',
|
15 |
-
postcode: '1120',
|
16 |
-
country: 'AT',
|
17 |
-
state: 'CA', // This should be removed.
|
18 |
-
email: 'jonny.awesome@email.com',
|
19 |
-
phone: '',
|
20 |
-
};
|
21 |
-
const filteredAddress = emptyHiddenAddressFields( address );
|
22 |
-
expect( filteredAddress ).toHaveProperty( 'state', '' );
|
23 |
-
} );
|
24 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/blocks-registry/payment-methods/payment-method-config.js
CHANGED
@@ -14,10 +14,6 @@ import {
|
|
14 |
|
15 |
import { canMakePaymentWithFeaturesCheck } from './payment-method-config-helper';
|
16 |
|
17 |
-
const NullComponent = () => {
|
18 |
-
return null;
|
19 |
-
};
|
20 |
-
|
21 |
export default class PaymentMethodConfig {
|
22 |
constructor( config ) {
|
23 |
// validate config
|
@@ -27,7 +23,6 @@ export default class PaymentMethodConfig {
|
|
27 |
this.placeOrderButtonLabel = config.placeOrderButtonLabel;
|
28 |
this.ariaLabel = config.ariaLabel;
|
29 |
this.content = config.content;
|
30 |
-
this.savedTokenComponent = config.savedTokenComponent;
|
31 |
this.icons = config.icons;
|
32 |
this.edit = config.edit;
|
33 |
this.paymentMethodId = config.paymentMethodId || this.name;
|
@@ -46,10 +41,6 @@ export default class PaymentMethodConfig {
|
|
46 |
}
|
47 |
|
48 |
static assertValidConfig = ( config ) => {
|
49 |
-
// set default for optional
|
50 |
-
config.savedTokenComponent = config.savedTokenComponent || (
|
51 |
-
<NullComponent />
|
52 |
-
);
|
53 |
assertConfigHasProperties( config, [
|
54 |
'name',
|
55 |
'label',
|
@@ -91,7 +82,6 @@ export default class PaymentMethodConfig {
|
|
91 |
assertValidElementOrString( config.label, 'label' );
|
92 |
assertValidElement( config.content, 'content' );
|
93 |
assertValidElement( config.edit, 'edit' );
|
94 |
-
assertValidElement( config.savedTokenComponent, 'savedTokenComponent' );
|
95 |
if ( typeof config.ariaLabel !== 'string' ) {
|
96 |
throw new TypeError(
|
97 |
'The ariaLabel property for the payment method must be a string'
|
14 |
|
15 |
import { canMakePaymentWithFeaturesCheck } from './payment-method-config-helper';
|
16 |
|
|
|
|
|
|
|
|
|
17 |
export default class PaymentMethodConfig {
|
18 |
constructor( config ) {
|
19 |
// validate config
|
23 |
this.placeOrderButtonLabel = config.placeOrderButtonLabel;
|
24 |
this.ariaLabel = config.ariaLabel;
|
25 |
this.content = config.content;
|
|
|
26 |
this.icons = config.icons;
|
27 |
this.edit = config.edit;
|
28 |
this.paymentMethodId = config.paymentMethodId || this.name;
|
41 |
}
|
42 |
|
43 |
static assertValidConfig = ( config ) => {
|
|
|
|
|
|
|
|
|
44 |
assertConfigHasProperties( config, [
|
45 |
'name',
|
46 |
'label',
|
82 |
assertValidElementOrString( config.label, 'label' );
|
83 |
assertValidElement( config.content, 'content' );
|
84 |
assertValidElement( config.edit, 'edit' );
|
|
|
85 |
if ( typeof config.ariaLabel !== 'string' ) {
|
86 |
throw new TypeError(
|
87 |
'The ariaLabel property for the payment method must be a string'
|
assets/js/blocks/active-filters/active-attribute-filters.js
CHANGED
@@ -1,10 +1,7 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import {
|
5 |
-
useCollection,
|
6 |
-
useQueryStateByKey,
|
7 |
-
} from '@woocommerce/base-context/hooks';
|
8 |
import { decodeEntities } from '@wordpress/html-entities';
|
9 |
import { __ } from '@wordpress/i18n';
|
10 |
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { useCollection, useQueryStateByKey } from '@woocommerce/base-hooks';
|
|
|
|
|
|
|
5 |
import { decodeEntities } from '@wordpress/html-entities';
|
6 |
import { __ } from '@wordpress/i18n';
|
7 |
|
assets/js/blocks/active-filters/block.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
-
import { useQueryStateByKey } from '@woocommerce/base-
|
6 |
import { useMemo } from '@wordpress/element';
|
7 |
import classnames from 'classnames';
|
8 |
import PropTypes from 'prop-types';
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
+
import { useQueryStateByKey } from '@woocommerce/base-hooks';
|
6 |
import { useMemo } from '@wordpress/element';
|
7 |
import classnames from 'classnames';
|
8 |
import PropTypes from 'prop-types';
|
assets/js/blocks/active-filters/style.scss
CHANGED
@@ -69,14 +69,24 @@
|
|
69 |
background: transparent;
|
70 |
border: 0;
|
71 |
appearance: none;
|
72 |
-
height:
|
|
|
73 |
width: 16px;
|
74 |
-
|
75 |
position: absolute;
|
76 |
right: 0;
|
77 |
top: 50%;
|
78 |
margin: -8px 0 0 0;
|
79 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
}
|
81 |
|
82 |
.wc-block-active-filters__list--chips {
|
69 |
background: transparent;
|
70 |
border: 0;
|
71 |
appearance: none;
|
72 |
+
height: 0;
|
73 |
+
padding: 16px 0 0 0;
|
74 |
width: 16px;
|
75 |
+
overflow: hidden;
|
76 |
position: absolute;
|
77 |
right: 0;
|
78 |
top: 50%;
|
79 |
margin: -8px 0 0 0;
|
80 |
+
|
81 |
+
&::before {
|
82 |
+
width: 16px;
|
83 |
+
height: 16px;
|
84 |
+
background: transparent url("data:image/svg+xml,%3Csvg viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='9' cy='9' r='9' fill='%2324292d'/%3E%3Crect x='4.5' y='6.8866' width='3.375' height='9.9466' transform='rotate(-45 4.5 6.8866)' fill='white'/%3E%3Crect x='11.5334' y='4.5' width='3.375' height='9.9466' transform='rotate(45 11.5334 4.5)' fill='white'/%3E%3C/svg%3E%0A") center center no-repeat; /* stylelint-disable-line */
|
85 |
+
display: block;
|
86 |
+
content: "";
|
87 |
+
position: absolute;
|
88 |
+
top: 0;
|
89 |
+
}
|
90 |
}
|
91 |
|
92 |
.wc-block-active-filters__list--chips {
|
assets/js/blocks/active-filters/utils.js
CHANGED
@@ -4,7 +4,6 @@
|
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
import { formatPrice } from '@woocommerce/price-format';
|
6 |
import { RemovableChip } from '@woocommerce/base-components/chip';
|
7 |
-
import Label from '@woocommerce/base-components/label';
|
8 |
|
9 |
/**
|
10 |
* Format a min/max price range to display.
|
@@ -97,41 +96,7 @@ export const renderRemovableListItem = ( {
|
|
97 |
className="wc-block-active-filters__list-item-remove"
|
98 |
onClick={ removeCallback }
|
99 |
>
|
100 |
-
|
101 |
-
width="16"
|
102 |
-
height="16"
|
103 |
-
viewBox="0 0 16 16"
|
104 |
-
fill="none"
|
105 |
-
xmlns="http://www.w3.org/2000/svg"
|
106 |
-
>
|
107 |
-
<ellipse
|
108 |
-
cx="8"
|
109 |
-
cy="8"
|
110 |
-
rx="8"
|
111 |
-
ry="8"
|
112 |
-
transform="rotate(-180 8 8)"
|
113 |
-
fill="currentColor"
|
114 |
-
fillOpacity="0.7"
|
115 |
-
/>
|
116 |
-
<rect
|
117 |
-
x="10.636"
|
118 |
-
y="3.94983"
|
119 |
-
width="2"
|
120 |
-
height="9.9466"
|
121 |
-
transform="rotate(45 10.636 3.94983)"
|
122 |
-
fill="white"
|
123 |
-
/>
|
124 |
-
<rect
|
125 |
-
x="12.0503"
|
126 |
-
y="11.0209"
|
127 |
-
width="2"
|
128 |
-
height="9.9466"
|
129 |
-
transform="rotate(135 12.0503 11.0209)"
|
130 |
-
fill="white"
|
131 |
-
/>
|
132 |
-
</svg>
|
133 |
-
|
134 |
-
<Label screenReaderLabel={ removeText } />
|
135 |
</button>
|
136 |
</span>
|
137 |
) }
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
import { formatPrice } from '@woocommerce/price-format';
|
6 |
import { RemovableChip } from '@woocommerce/base-components/chip';
|
|
|
7 |
|
8 |
/**
|
9 |
* Format a min/max price range to display.
|
96 |
className="wc-block-active-filters__list-item-remove"
|
97 |
onClick={ removeCallback }
|
98 |
>
|
99 |
+
{ removeText }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
</button>
|
101 |
</span>
|
102 |
) }
|
assets/js/blocks/attribute-filter/block.js
CHANGED
@@ -3,13 +3,14 @@
|
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
import { speak } from '@wordpress/a11y';
|
6 |
-
import { usePrevious, useShallowEqual } from '@woocommerce/base-hooks';
|
7 |
import {
|
8 |
useCollection,
|
9 |
useQueryStateByKey,
|
10 |
useQueryStateByContext,
|
11 |
useCollectionData,
|
12 |
-
|
|
|
|
|
13 |
import { useCallback, useEffect, useState, useMemo } from '@wordpress/element';
|
14 |
import CheckboxList from '@woocommerce/base-components/checkbox-list';
|
15 |
import DropdownSelector from '@woocommerce/base-components/dropdown-selector';
|
@@ -254,7 +255,7 @@ const AttributeFilterBlock = ( {
|
|
254 |
if ( filterAddedName && filterRemovedName ) {
|
255 |
speak(
|
256 |
sprintf(
|
257 |
-
/*
|
258 |
__(
|
259 |
'%1$s filter replaced with %2$s.',
|
260 |
'woo-gutenberg-products-block'
|
@@ -266,7 +267,7 @@ const AttributeFilterBlock = ( {
|
|
266 |
} else if ( filterAddedName ) {
|
267 |
speak(
|
268 |
sprintf(
|
269 |
-
/*
|
270 |
__(
|
271 |
'%s filter added.',
|
272 |
'woo-gutenberg-products-block'
|
@@ -277,7 +278,7 @@ const AttributeFilterBlock = ( {
|
|
277 |
} else if ( filterRemovedName ) {
|
278 |
speak(
|
279 |
sprintf(
|
280 |
-
/*
|
281 |
__(
|
282 |
'%s filter removed.',
|
283 |
'woo-gutenberg-products-block'
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
import { speak } from '@wordpress/a11y';
|
|
|
6 |
import {
|
7 |
useCollection,
|
8 |
useQueryStateByKey,
|
9 |
useQueryStateByContext,
|
10 |
useCollectionData,
|
11 |
+
usePrevious,
|
12 |
+
useShallowEqual,
|
13 |
+
} from '@woocommerce/base-hooks';
|
14 |
import { useCallback, useEffect, useState, useMemo } from '@wordpress/element';
|
15 |
import CheckboxList from '@woocommerce/base-components/checkbox-list';
|
16 |
import DropdownSelector from '@woocommerce/base-components/dropdown-selector';
|
255 |
if ( filterAddedName && filterRemovedName ) {
|
256 |
speak(
|
257 |
sprintf(
|
258 |
+
/* Translators: %1$s and %2$s are attribute terms (for example: 'red', 'blue', 'large'...). */
|
259 |
__(
|
260 |
'%1$s filter replaced with %2$s.',
|
261 |
'woo-gutenberg-products-block'
|
267 |
} else if ( filterAddedName ) {
|
268 |
speak(
|
269 |
sprintf(
|
270 |
+
/* Translators: %s attribute term (for example: 'red', 'blue', 'large'...) */
|
271 |
__(
|
272 |
'%s filter added.',
|
273 |
'woo-gutenberg-products-block'
|
278 |
} else if ( filterRemovedName ) {
|
279 |
speak(
|
280 |
sprintf(
|
281 |
+
/* Translators: %s attribute term (for example: 'red', 'blue', 'large'...) */
|
282 |
__(
|
283 |
'%s filter removed.',
|
284 |
'woo-gutenberg-products-block'
|
assets/js/blocks/attribute-filter/edit.js
CHANGED
@@ -15,8 +15,9 @@ import {
|
|
15 |
} from '@wordpress/components';
|
16 |
import { Icon, server, external } from '@woocommerce/icons';
|
17 |
import { SearchListControl } from '@woocommerce/components';
|
18 |
-
import { mapValues, toArray, sortBy } from 'lodash';
|
19 |
-
import {
|
|
|
20 |
import HeadingToolbar from '@woocommerce/editor-components/heading-toolbar';
|
21 |
import BlockTitle from '@woocommerce/editor-components/block-title';
|
22 |
import ToggleButtonControl from '@woocommerce/editor-components/toggle-button-control';
|
@@ -27,8 +28,6 @@ import ToggleButtonControl from '@woocommerce/editor-components/toggle-button-co
|
|
27 |
import Block from './block.js';
|
28 |
import './editor.scss';
|
29 |
|
30 |
-
const ATTRIBUTES = getSetting( 'attributes', [] );
|
31 |
-
|
32 |
const Edit = ( { attributes, setAttributes, debouncedSpeak } ) => {
|
33 |
const {
|
34 |
attributeId,
|
@@ -212,7 +211,7 @@ const Edit = ( { attributes, setAttributes, debouncedSpeak } ) => {
|
|
212 |
) }
|
213 |
initialOpen={ false }
|
214 |
>
|
215 |
-
{ renderAttributeControl(
|
216 |
</PanelBody>
|
217 |
</InspectorControls>
|
218 |
);
|
@@ -274,9 +273,10 @@ const Edit = ( { attributes, setAttributes, debouncedSpeak } ) => {
|
|
274 |
}
|
275 |
|
276 |
const selectedId = selected[ 0 ].id;
|
277 |
-
const productAttribute =
|
278 |
-
|
279 |
-
|
|
|
280 |
|
281 |
if ( ! productAttribute || attributeId === selectedId ) {
|
282 |
return;
|
@@ -287,14 +287,14 @@ const Edit = ( { attributes, setAttributes, debouncedSpeak } ) => {
|
|
287 |
setAttributes( {
|
288 |
attributeId: selectedId,
|
289 |
heading: sprintf(
|
290 |
-
|
291 |
__( 'Filter by %s', 'woo-gutenberg-products-block' ),
|
292 |
attributeName
|
293 |
),
|
294 |
} );
|
295 |
};
|
296 |
|
297 |
-
const renderAttributeControl = (
|
298 |
const messages = {
|
299 |
clear: __(
|
300 |
'Clear selected attribute',
|
@@ -311,7 +311,7 @@ const Edit = ( { attributes, setAttributes, debouncedSpeak } ) => {
|
|
311 |
),
|
312 |
selected: ( n ) =>
|
313 |
sprintf(
|
314 |
-
|
315 |
_n(
|
316 |
'%d attribute selected',
|
317 |
'%d attributes selected',
|
@@ -346,7 +346,6 @@ const Edit = ( { attributes, setAttributes, debouncedSpeak } ) => {
|
|
346 |
onChange={ onChange }
|
347 |
messages={ messages }
|
348 |
isSingle
|
349 |
-
isCompact={ isCompact }
|
350 |
/>
|
351 |
);
|
352 |
};
|
@@ -366,7 +365,7 @@ const Edit = ( { attributes, setAttributes, debouncedSpeak } ) => {
|
|
366 |
) }
|
367 |
>
|
368 |
<div className="wc-block-attribute-filter__selection">
|
369 |
-
{ renderAttributeControl(
|
370 |
<Button isPrimary onClick={ onDone }>
|
371 |
{ __( 'Done', 'woo-gutenberg-products-block' ) }
|
372 |
</Button>
|
15 |
} from '@wordpress/components';
|
16 |
import { Icon, server, external } from '@woocommerce/icons';
|
17 |
import { SearchListControl } from '@woocommerce/components';
|
18 |
+
import { mapValues, toArray, sortBy, find } from 'lodash';
|
19 |
+
import { ATTRIBUTES } from '@woocommerce/block-settings';
|
20 |
+
import { getAdminLink } from '@woocommerce/settings';
|
21 |
import HeadingToolbar from '@woocommerce/editor-components/heading-toolbar';
|
22 |
import BlockTitle from '@woocommerce/editor-components/block-title';
|
23 |
import ToggleButtonControl from '@woocommerce/editor-components/toggle-button-control';
|
28 |
import Block from './block.js';
|
29 |
import './editor.scss';
|
30 |
|
|
|
|
|
31 |
const Edit = ( { attributes, setAttributes, debouncedSpeak } ) => {
|
32 |
const {
|
33 |
attributeId,
|
211 |
) }
|
212 |
initialOpen={ false }
|
213 |
>
|
214 |
+
{ renderAttributeControl() }
|
215 |
</PanelBody>
|
216 |
</InspectorControls>
|
217 |
);
|
273 |
}
|
274 |
|
275 |
const selectedId = selected[ 0 ].id;
|
276 |
+
const productAttribute = find( ATTRIBUTES, [
|
277 |
+
'attribute_id',
|
278 |
+
selectedId.toString(),
|
279 |
+
] );
|
280 |
|
281 |
if ( ! productAttribute || attributeId === selectedId ) {
|
282 |
return;
|
287 |
setAttributes( {
|
288 |
attributeId: selectedId,
|
289 |
heading: sprintf(
|
290 |
+
// Translators: %s attribute name.
|
291 |
__( 'Filter by %s', 'woo-gutenberg-products-block' ),
|
292 |
attributeName
|
293 |
),
|
294 |
} );
|
295 |
};
|
296 |
|
297 |
+
const renderAttributeControl = () => {
|
298 |
const messages = {
|
299 |
clear: __(
|
300 |
'Clear selected attribute',
|
311 |
),
|
312 |
selected: ( n ) =>
|
313 |
sprintf(
|
314 |
+
// Translators: %d is the number of attributes selected.
|
315 |
_n(
|
316 |
'%d attribute selected',
|
317 |
'%d attributes selected',
|
346 |
onChange={ onChange }
|
347 |
messages={ messages }
|
348 |
isSingle
|
|
|
349 |
/>
|
350 |
);
|
351 |
};
|
365 |
) }
|
366 |
>
|
367 |
<div className="wc-block-attribute-filter__selection">
|
368 |
+
{ renderAttributeControl() }
|
369 |
<Button isPrimary onClick={ onDone }>
|
370 |
{ __( 'Done', 'woo-gutenberg-products-block' ) }
|
371 |
</Button>
|
assets/js/blocks/attribute-filter/label.js
CHANGED
@@ -19,7 +19,7 @@ const AttributeFilterLabel = ( { name, count } ) => {
|
|
19 |
<Label
|
20 |
label={ count }
|
21 |
screenReaderLabel={ sprintf(
|
22 |
-
|
23 |
_n(
|
24 |
'%s product',
|
25 |
'%s products',
|
19 |
<Label
|
20 |
label={ count }
|
21 |
screenReaderLabel={ sprintf(
|
22 |
+
// translators: %s number of products.
|
23 |
_n(
|
24 |
'%s product',
|
25 |
'%s products',
|
assets/js/blocks/cart-checkout/cart/attributes.js
CHANGED
@@ -1,7 +1,10 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
-
import {
|
|
|
|
|
|
|
5 |
|
6 |
const blockAttributes = {
|
7 |
isPreview: {
|
@@ -11,7 +14,7 @@ const blockAttributes = {
|
|
11 |
},
|
12 |
isShippingCalculatorEnabled: {
|
13 |
type: 'boolean',
|
14 |
-
default:
|
15 |
},
|
16 |
checkoutPageId: {
|
17 |
type: 'number',
|
@@ -19,11 +22,7 @@ const blockAttributes = {
|
|
19 |
},
|
20 |
hasDarkControls: {
|
21 |
type: 'boolean',
|
22 |
-
default:
|
23 |
-
},
|
24 |
-
showRateAfterTaxName: {
|
25 |
-
type: 'boolean',
|
26 |
-
default: true,
|
27 |
},
|
28 |
};
|
29 |
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import {
|
5 |
+
IS_SHIPPING_CALCULATOR_ENABLED,
|
6 |
+
HAS_DARK_EDITOR_STYLE_SUPPORT,
|
7 |
+
} from '@woocommerce/block-settings';
|
8 |
|
9 |
const blockAttributes = {
|
10 |
isPreview: {
|
14 |
},
|
15 |
isShippingCalculatorEnabled: {
|
16 |
type: 'boolean',
|
17 |
+
default: IS_SHIPPING_CALCULATOR_ENABLED,
|
18 |
},
|
19 |
checkoutPageId: {
|
20 |
type: 'number',
|
22 |
},
|
23 |
hasDarkControls: {
|
24 |
type: 'boolean',
|
25 |
+
default: HAS_DARK_EDITOR_STYLE_SUPPORT,
|
|
|
|
|
|
|
|
|
26 |
},
|
27 |
};
|
28 |
|
assets/js/blocks/cart-checkout/cart/block.js
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
*/
|
4 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
5 |
import { dispatch } from '@wordpress/data';
|
6 |
-
import { useStoreCart } from '@woocommerce/base-
|
7 |
import { useEffect, RawHTML } from '@wordpress/element';
|
8 |
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
9 |
import { ValidationContextProvider } from '@woocommerce/base-context';
|
3 |
*/
|
4 |
import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
|
5 |
import { dispatch } from '@wordpress/data';
|
6 |
+
import { useStoreCart } from '@woocommerce/base-hooks';
|
7 |
import { useEffect, RawHTML } from '@wordpress/element';
|
8 |
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
9 |
import { ValidationContextProvider } from '@woocommerce/base-context';
|
assets/js/blocks/cart-checkout/cart/checkout-button/index.js
CHANGED
@@ -7,8 +7,10 @@ import { PaymentMethodIcons } from '@woocommerce/base-components/cart-checkout';
|
|
7 |
import Button from '@woocommerce/base-components/button';
|
8 |
import { CHECKOUT_URL } from '@woocommerce/block-settings';
|
9 |
import { useCheckoutContext } from '@woocommerce/base-context';
|
10 |
-
import {
|
11 |
-
|
|
|
|
|
12 |
|
13 |
/**
|
14 |
* Internal dependencies
|
@@ -40,12 +42,14 @@ const CheckoutButton = ( { link } ) => {
|
|
40 |
const { paymentMethods } = usePaymentMethods();
|
41 |
|
42 |
useEffect( () => {
|
43 |
-
// Add a listener
|
44 |
-
//
|
|
|
45 |
|
46 |
if (
|
47 |
-
|
48 |
-
typeof
|
|
|
49 |
) {
|
50 |
return;
|
51 |
}
|
@@ -54,10 +58,10 @@ const CheckoutButton = ( { link } ) => {
|
|
54 |
setShowSpinner( false );
|
55 |
};
|
56 |
|
57 |
-
|
58 |
|
59 |
return () => {
|
60 |
-
|
61 |
};
|
62 |
}, [] );
|
63 |
|
7 |
import Button from '@woocommerce/base-components/button';
|
8 |
import { CHECKOUT_URL } from '@woocommerce/block-settings';
|
9 |
import { useCheckoutContext } from '@woocommerce/base-context';
|
10 |
+
import {
|
11 |
+
usePaymentMethods,
|
12 |
+
usePositionRelativeToViewport,
|
13 |
+
} from '@woocommerce/base-hooks';
|
14 |
|
15 |
/**
|
16 |
* Internal dependencies
|
42 |
const { paymentMethods } = usePaymentMethods();
|
43 |
|
44 |
useEffect( () => {
|
45 |
+
// Add a listener for when the page is unloaded (specifically needed for Safari)
|
46 |
+
// to remove the spinner on the checkout button, so the saved page snapshot does not
|
47 |
+
// contain the spinner class. See https://archive.is/lOEW0 for why this is needed.
|
48 |
|
49 |
if (
|
50 |
+
! window ||
|
51 |
+
typeof window.addEventListener !== 'function' ||
|
52 |
+
typeof window.removeEventListener !== 'function'
|
53 |
) {
|
54 |
return;
|
55 |
}
|
58 |
setShowSpinner( false );
|
59 |
};
|
60 |
|
61 |
+
window.addEventListener( 'beforeunload', hideSpinner );
|
62 |
|
63 |
return () => {
|
64 |
+
window.removeEventListener( 'beforeunload', hideSpinner );
|
65 |
};
|
66 |
}, [] );
|
67 |
|
assets/js/blocks/cart-checkout/cart/edit.js
CHANGED
@@ -12,10 +12,9 @@ import {
|
|
12 |
Notice,
|
13 |
} from '@wordpress/components';
|
14 |
import PropTypes from 'prop-types';
|
15 |
-
import { CartCheckoutCompatibilityNotice } from '@woocommerce/editor-components/compatibility-notices';
|
16 |
import ViewSwitcher from '@woocommerce/editor-components/view-switcher';
|
17 |
import PageSelector from '@woocommerce/editor-components/page-selector';
|
18 |
-
import { CART_PAGE_ID } from '@woocommerce/block-settings';
|
19 |
import BlockErrorBoundary from '@woocommerce/base-components/block-error-boundary';
|
20 |
import {
|
21 |
EditorProvider,
|
@@ -24,7 +23,7 @@ import {
|
|
24 |
} from '@woocommerce/base-context';
|
25 |
import { createInterpolateElement } from 'wordpress-element';
|
26 |
import { useRef } from '@wordpress/element';
|
27 |
-
import { getAdminLink
|
28 |
import { previewCart } from '@woocommerce/resource-previews';
|
29 |
|
30 |
/**
|
@@ -39,7 +38,6 @@ const BlockSettings = ( { attributes, setAttributes } ) => {
|
|
39 |
isShippingCalculatorEnabled,
|
40 |
checkoutPageId,
|
41 |
hasDarkControls,
|
42 |
-
showRateAfterTaxName,
|
43 |
} = attributes;
|
44 |
const { currentPostId } = useEditorContext();
|
45 |
const { current: savedCheckoutPageId } = useRef( checkoutPageId );
|
@@ -71,7 +69,7 @@ const BlockSettings = ( { attributes, setAttributes } ) => {
|
|
71 |
) }
|
72 |
</Notice>
|
73 |
) }
|
74 |
-
{
|
75 |
<PanelBody
|
76 |
title={ __(
|
77 |
'Shipping rates',
|
@@ -96,30 +94,6 @@ const BlockSettings = ( { attributes, setAttributes } ) => {
|
|
96 |
/>
|
97 |
</PanelBody>
|
98 |
) }
|
99 |
-
{ getSetting( 'taxesEnabled' ) &&
|
100 |
-
getSetting( 'displayItemizedTaxes', false ) &&
|
101 |
-
! getSetting( 'displayCartPricesIncludingTax', false ) && (
|
102 |
-
<PanelBody
|
103 |
-
title={ __( 'Taxes', 'woo-gutenberg-products-block' ) }
|
104 |
-
>
|
105 |
-
<ToggleControl
|
106 |
-
label={ __(
|
107 |
-
'Show rate after tax name',
|
108 |
-
'woo-gutenberg-products-block'
|
109 |
-
) }
|
110 |
-
help={ __(
|
111 |
-
'Show the percentage rate alongside each tax line in the summary.',
|
112 |
-
'woo-gutenberg-products-block'
|
113 |
-
) }
|
114 |
-
checked={ showRateAfterTaxName }
|
115 |
-
onChange={ () =>
|
116 |
-
setAttributes( {
|
117 |
-
showRateAfterTaxName: ! showRateAfterTaxName,
|
118 |
-
} )
|
119 |
-
}
|
120 |
-
/>
|
121 |
-
</PanelBody>
|
122 |
-
) }
|
123 |
{ ! (
|
124 |
currentPostId === CART_PAGE_ID && savedCheckoutPageId === 0
|
125 |
) && (
|
@@ -235,7 +209,6 @@ const CartEditor = ( { className, attributes, setAttributes } ) => {
|
|
235 |
</BlockErrorBoundary>
|
236 |
) }
|
237 |
/>
|
238 |
-
<CartCheckoutCompatibilityNotice blockName="cart" />
|
239 |
</div>
|
240 |
);
|
241 |
};
|
12 |
Notice,
|
13 |
} from '@wordpress/components';
|
14 |
import PropTypes from 'prop-types';
|
|
|
15 |
import ViewSwitcher from '@woocommerce/editor-components/view-switcher';
|
16 |
import PageSelector from '@woocommerce/editor-components/page-selector';
|
17 |
+
import { SHIPPING_ENABLED, CART_PAGE_ID } from '@woocommerce/block-settings';
|
18 |
import BlockErrorBoundary from '@woocommerce/base-components/block-error-boundary';
|
19 |
import {
|
20 |
EditorProvider,
|
23 |
} from '@woocommerce/base-context';
|
24 |
import { createInterpolateElement } from 'wordpress-element';
|
25 |
import { useRef } from '@wordpress/element';
|
26 |
+
import { getAdminLink } from '@woocommerce/settings';
|
27 |
import { previewCart } from '@woocommerce/resource-previews';
|
28 |
|
29 |
/**
|
38 |
isShippingCalculatorEnabled,
|
39 |
checkoutPageId,
|
40 |
hasDarkControls,
|
|
|
41 |
} = attributes;
|
42 |
const { currentPostId } = useEditorContext();
|
43 |
const { current: savedCheckoutPageId } = useRef( checkoutPageId );
|
69 |
) }
|
70 |
</Notice>
|
71 |
) }
|
72 |
+
{ SHIPPING_ENABLED && (
|
73 |
<PanelBody
|
74 |
title={ __(
|
75 |
'Shipping rates',
|
94 |
/>
|
95 |
</PanelBody>
|
96 |
) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
{ ! (
|
98 |
currentPostId === CART_PAGE_ID && savedCheckoutPageId === 0
|
99 |
) && (
|
209 |
</BlockErrorBoundary>
|
210 |
) }
|
211 |
/>
|
|
|
212 |
</div>
|
213 |
);
|
214 |
};
|
assets/js/blocks/cart-checkout/cart/empty-cart-edit/index.js
CHANGED
@@ -12,69 +12,6 @@ import PropTypes from 'prop-types';
|
|
12 |
import iconDataUri from './icon-data-uri.js';
|
13 |
import './style.scss';
|
14 |
|
15 |
-
const templateItemBrowseStore = SHOP_URL
|
16 |
-
? [
|
17 |
-
'core/paragraph',
|
18 |
-
{
|
19 |
-
align: 'center',
|
20 |
-
content: sprintf(
|
21 |
-
/* translators: %s is the link to the store product directory. */
|
22 |
-
__(
|
23 |
-
'<a href="%s">Browse store</a>.',
|
24 |
-
'woo-gutenberg-products-block'
|
25 |
-
),
|
26 |
-
SHOP_URL
|
27 |
-
),
|
28 |
-
dropCap: false,
|
29 |
-
},
|
30 |
-
]
|
31 |
-
: null;
|
32 |
-
|
33 |
-
const templateItems = [
|
34 |
-
[
|
35 |
-
'core/image',
|
36 |
-
{
|
37 |
-
align: 'center',
|
38 |
-
url: iconDataUri,
|
39 |
-
sizeSlug: 'small',
|
40 |
-
},
|
41 |
-
],
|
42 |
-
[
|
43 |
-
'core/heading',
|
44 |
-
{
|
45 |
-
textAlign: 'center',
|
46 |
-
content: __(
|
47 |
-
'Your cart is currently empty!',
|
48 |
-
'woo-gutenberg-products-block'
|
49 |
-
),
|
50 |
-
level: 2,
|
51 |
-
className: 'wc-block-cart__empty-cart__title',
|
52 |
-
},
|
53 |
-
],
|
54 |
-
templateItemBrowseStore,
|
55 |
-
[
|
56 |
-
'core/separator',
|
57 |
-
{
|
58 |
-
className: 'is-style-dots',
|
59 |
-
},
|
60 |
-
],
|
61 |
-
[
|
62 |
-
'core/heading',
|
63 |
-
{
|
64 |
-
textAlign: 'center',
|
65 |
-
content: __( 'New in store', 'woo-gutenberg-products-block' ),
|
66 |
-
level: 2,
|
67 |
-
},
|
68 |
-
],
|
69 |
-
[
|
70 |
-
'woocommerce/product-new',
|
71 |
-
{
|
72 |
-
columns: 3,
|
73 |
-
rows: 1,
|
74 |
-
},
|
75 |
-
],
|
76 |
-
].filter( Boolean );
|
77 |
-
|
78 |
/**
|
79 |
* Component to handle edit mode for the Cart block when cart is empty.
|
80 |
*
|
@@ -86,7 +23,67 @@ const EmptyCartEdit = ( { hidden = false } ) => {
|
|
86 |
<div hidden={ hidden }>
|
87 |
<InnerBlocks
|
88 |
templateInsertUpdatesSelection={ false }
|
89 |
-
template={
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
/>
|
91 |
</div>
|
92 |
);
|
12 |
import iconDataUri from './icon-data-uri.js';
|
13 |
import './style.scss';
|
14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
/**
|
16 |
* Component to handle edit mode for the Cart block when cart is empty.
|
17 |
*
|
23 |
<div hidden={ hidden }>
|
24 |
<InnerBlocks
|
25 |
templateInsertUpdatesSelection={ false }
|
26 |
+
template={ [
|
27 |
+
[
|
28 |
+
'core/image',
|
29 |
+
{
|
30 |
+
align: 'center',
|
31 |
+
url: iconDataUri,
|
32 |
+
sizeSlug: 'small',
|
33 |
+
},
|
34 |
+
],
|
35 |
+
[
|
36 |
+
'core/heading',
|
37 |
+
{
|
38 |
+
align: 'center',
|
39 |
+
content: __(
|
40 |
+
'Your cart is currently empty!',
|
41 |
+
'woo-gutenberg-products-block'
|
42 |
+
),
|
43 |
+
level: 2,
|
44 |
+
className: 'wc-block-cart__empty-cart__title',
|
45 |
+
},
|
46 |
+
],
|
47 |
+
[
|
48 |
+
'core/paragraph',
|
49 |
+
{
|
50 |
+
align: 'center',
|
51 |
+
content: sprintf(
|
52 |
+
// Translators: %s is the link to the store product directory.
|
53 |
+
__(
|
54 |
+
'<a href="%s">Browse store</a>.',
|
55 |
+
'woo-gutenberg-products-block'
|
56 |
+
),
|
57 |
+
SHOP_URL
|
58 |
+
),
|
59 |
+
dropCap: false,
|
60 |
+
},
|
61 |
+
],
|
62 |
+
[
|
63 |
+
'core/separator',
|
64 |
+
{
|
65 |
+
className: 'is-style-dots',
|
66 |
+
},
|
67 |
+
],
|
68 |
+
[
|
69 |
+
'core/heading',
|
70 |
+
{
|
71 |
+
align: 'center',
|
72 |
+
content: __(
|
73 |
+
'New in store',
|
74 |
+
'woo-gutenberg-products-block'
|
75 |
+
),
|
76 |
+
level: 2,
|
77 |
+
},
|
78 |
+
],
|
79 |
+
[
|
80 |
+
'woocommerce/product-new',
|
81 |
+
{
|
82 |
+
columns: 3,
|
83 |
+
rows: 1,
|
84 |
+
},
|
85 |
+
],
|
86 |
+
] }
|
87 |
/>
|
88 |
</div>
|
89 |
);
|
assets/js/blocks/cart-checkout/cart/frontend.js
CHANGED
@@ -2,19 +2,18 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import {
|
5 |
-
withStoreCartApiHydration,
|
6 |
withRestApiHydration,
|
|
|
7 |
} from '@woocommerce/block-hocs';
|
8 |
import { __ } from '@wordpress/i18n';
|
9 |
-
import {
|
10 |
-
|
11 |
-
|
12 |
-
} from '@woocommerce/base-context/providers';
|
13 |
-
import { CURRENT_USER_IS_ADMIN } from '@woocommerce/settings';
|
14 |
import {
|
15 |
renderFrontend,
|
16 |
getValidBlockAttributes,
|
17 |
} from '@woocommerce/base-utils';
|
|
|
18 |
/**
|
19 |
* Internal dependencies
|
20 |
*/
|
@@ -29,11 +28,9 @@ const reloadPage = () => void window.location.reload( true );
|
|
29 |
*/
|
30 |
const CartFrontend = ( props ) => {
|
31 |
return (
|
32 |
-
<
|
33 |
-
<
|
34 |
-
|
35 |
-
</StoreNoticesProvider>
|
36 |
-
</StoreSnackbarNoticesProvider>
|
37 |
);
|
38 |
};
|
39 |
|
@@ -47,16 +44,21 @@ const getProps = ( el ) => {
|
|
47 |
const getErrorBoundaryProps = () => {
|
48 |
return {
|
49 |
header: __( 'Something went wrong…', 'woo-gutenberg-products-block' ),
|
50 |
-
text:
|
51 |
-
|
52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
),
|
54 |
showErrorMessage: CURRENT_USER_IS_ADMIN,
|
55 |
-
button: (
|
56 |
-
<button className="wc-block-button" onClick={ reloadPage }>
|
57 |
-
{ __( 'Reload the page', 'woo-gutenberg-products-block' ) }
|
58 |
-
</button>
|
59 |
-
),
|
60 |
};
|
61 |
};
|
62 |
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import {
|
|
|
5 |
withRestApiHydration,
|
6 |
+
withStoreCartApiHydration,
|
7 |
} from '@woocommerce/block-hocs';
|
8 |
import { __ } from '@wordpress/i18n';
|
9 |
+
import { StoreNoticesProvider } from '@woocommerce/base-context';
|
10 |
+
import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
|
11 |
+
import { createInterpolateElement } from 'wordpress-element';
|
|
|
|
|
12 |
import {
|
13 |
renderFrontend,
|
14 |
getValidBlockAttributes,
|
15 |
} from '@woocommerce/base-utils';
|
16 |
+
|
17 |
/**
|
18 |
* Internal dependencies
|
19 |
*/
|
28 |
*/
|
29 |
const CartFrontend = ( props ) => {
|
30 |
return (
|
31 |
+
<StoreNoticesProvider context="wc/cart">
|
32 |
+
<Block { ...props } />
|
33 |
+
</StoreNoticesProvider>
|
|
|
|
|
34 |
);
|
35 |
};
|
36 |
|
44 |
const getErrorBoundaryProps = () => {
|
45 |
return {
|
46 |
header: __( 'Something went wrong…', 'woo-gutenberg-products-block' ),
|
47 |
+
text: createInterpolateElement(
|
48 |
+
__(
|
49 |
+
'The cart has encountered an unexpected error. <button>Try reloading the page</button>. If the error persists, please get in touch with us so we can assist.',
|
50 |
+
'woo-gutenberg-products-block'
|
51 |
+
),
|
52 |
+
{
|
53 |
+
button: (
|
54 |
+
<button
|
55 |
+
className="wc-block-link-button"
|
56 |
+
onClick={ reloadPage }
|
57 |
+
/>
|
58 |
+
),
|
59 |
+
}
|
60 |
),
|
61 |
showErrorMessage: CURRENT_USER_IS_ADMIN,
|
|
|
|
|
|
|
|
|
|
|
62 |
};
|
63 |
};
|
64 |
|
assets/js/blocks/cart-checkout/cart/full-cart/{cart-line-item-row.tsx → cart-line-item-row.js}
RENAMED
@@ -3,14 +3,11 @@
|
|
3 |
*/
|
4 |
import classnames from 'classnames';
|
5 |
import { __ } from '@wordpress/i18n';
|
|
|
6 |
import QuantitySelector from '@woocommerce/base-components/quantity-selector';
|
7 |
import ProductPrice from '@woocommerce/base-components/product-price';
|
8 |
import ProductName from '@woocommerce/base-components/product-name';
|
9 |
-
import {
|
10 |
-
useStoreCartItemQuantity,
|
11 |
-
useStoreEvents,
|
12 |
-
useStoreCart,
|
13 |
-
} from '@woocommerce/base-context/hooks';
|
14 |
import {
|
15 |
ProductBackorderBadge,
|
16 |
ProductImage,
|
@@ -18,19 +15,12 @@ import {
|
|
18 |
ProductMetadata,
|
19 |
ProductSaleBadge,
|
20 |
} from '@woocommerce/base-components/cart-checkout';
|
21 |
-
import {
|
22 |
-
getCurrencyFromPriceResponse,
|
23 |
-
Currency,
|
24 |
-
} from '@woocommerce/price-format';
|
25 |
-
import {
|
26 |
-
__experimentalApplyCheckoutFilter,
|
27 |
-
mustContain,
|
28 |
-
} from '@woocommerce/blocks-checkout';
|
29 |
import Dinero from 'dinero.js';
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
|
35 |
/**
|
36 |
* Convert a Dinero object with precision to store currency minor unit.
|
@@ -39,10 +29,7 @@ import { getSetting } from '@woocommerce/settings';
|
|
39 |
* @param {Object} currency Currency data.
|
40 |
* @return {number} Amount with new minor unit precision.
|
41 |
*/
|
42 |
-
const getAmountFromRawPrice = (
|
43 |
-
priceObject: Dinero.Dinero,
|
44 |
-
currency: Currency
|
45 |
-
) => {
|
46 |
return priceObject.convertPrecision( currency.minorUnit ).getAmount();
|
47 |
};
|
48 |
|
@@ -52,14 +39,10 @@ const getAmountFromRawPrice = (
|
|
52 |
* @param {Object} props
|
53 |
* @param {CartItem|Object} props.lineItem
|
54 |
*/
|
55 |
-
const CartLineItemRow = ( {
|
56 |
-
lineItem,
|
57 |
-
}: {
|
58 |
-
lineItem: CartItem | Record< string, never >;
|
59 |
-
} ): JSX.Element => {
|
60 |
const {
|
61 |
-
name
|
62 |
-
catalog_visibility: catalogVisibility = '
|
63 |
short_description: shortDescription = '',
|
64 |
description: fullDescription = '',
|
65 |
low_stock_remaining: lowStockRemaining = null,
|
@@ -88,105 +71,34 @@ const CartLineItemRow = ( {
|
|
88 |
sale_price: '0',
|
89 |
},
|
90 |
},
|
91 |
-
totals = {
|
92 |
-
currency_code: 'USD',
|
93 |
-
currency_minor_unit: 2,
|
94 |
-
currency_symbol: '$',
|
95 |
-
currency_prefix: '$',
|
96 |
-
currency_suffix: '',
|
97 |
-
currency_decimal_separator: '.',
|
98 |
-
currency_thousand_separator: ',',
|
99 |
-
line_subtotal: '0',
|
100 |
-
line_subtotal_tax: '0',
|
101 |
-
},
|
102 |
-
extensions = {},
|
103 |
} = lineItem;
|
104 |
|
105 |
const {
|
106 |
quantity,
|
107 |
-
|
108 |
removeItem,
|
109 |
isPendingDelete,
|
110 |
} = useStoreCartItemQuantity( lineItem );
|
111 |
-
const { dispatchStoreEvent } = useStoreEvents();
|
112 |
-
|
113 |
-
const productPriceValidation = useCallback(
|
114 |
-
( value ) => mustContain( value, '<price/>' ),
|
115 |
-
[]
|
116 |
-
);
|
117 |
-
|
118 |
-
// Prepare props to pass to the __experimentalApplyCheckoutFilter filter.
|
119 |
-
// We need to pluck out receiveCart.
|
120 |
-
// eslint-disable-next-line no-unused-vars
|
121 |
-
const { receiveCart, ...cart } = useStoreCart();
|
122 |
-
const arg = useMemo(
|
123 |
-
() => ( {
|
124 |
-
context: 'cart',
|
125 |
-
cartItem: lineItem,
|
126 |
-
cart,
|
127 |
-
} ),
|
128 |
-
[ lineItem, cart ]
|
129 |
-
);
|
130 |
-
const priceCurrency = getCurrencyFromPriceResponse( prices );
|
131 |
-
const name = __experimentalApplyCheckoutFilter( {
|
132 |
-
filterName: 'itemName',
|
133 |
-
defaultValue: initialName,
|
134 |
-
extensions,
|
135 |
-
arg,
|
136 |
-
} );
|
137 |
|
|
|
138 |
const regularAmountSingle = Dinero( {
|
139 |
amount: parseInt( prices.raw_prices.regular_price, 10 ),
|
140 |
-
precision: prices.raw_prices.precision,
|
141 |
} );
|
142 |
const purchaseAmountSingle = Dinero( {
|
143 |
amount: parseInt( prices.raw_prices.price, 10 ),
|
144 |
-
precision: prices.raw_prices.precision,
|
145 |
} );
|
|
|
|
|
146 |
const saleAmountSingle = regularAmountSingle.subtract(
|
147 |
purchaseAmountSingle
|
148 |
);
|
149 |
-
const saleAmount =
|
150 |
-
const totalsCurrency = getCurrencyFromPriceResponse( totals );
|
151 |
-
let lineSubtotal = parseInt( totals.line_subtotal, 10 );
|
152 |
-
if ( getSetting( 'displayCartPricesIncludingTax', false ) ) {
|
153 |
-
lineSubtotal += parseInt( totals.line_subtotal_tax, 10 );
|
154 |
-
}
|
155 |
-
const subtotalPrice = Dinero( {
|
156 |
-
amount: lineSubtotal,
|
157 |
-
precision: totalsCurrency.minorUnit,
|
158 |
-
} );
|
159 |
-
|
160 |
const firstImage = images.length ? images[ 0 ] : {};
|
161 |
const isProductHiddenFromCatalog =
|
162 |
catalogVisibility === 'hidden' || catalogVisibility === 'search';
|
163 |
|
164 |
-
// Allow extensions to filter how the price is displayed. Ie: prepending or appending some values.
|
165 |
-
|
166 |
-
const productPriceFormat = __experimentalApplyCheckoutFilter( {
|
167 |
-
filterName: 'cartItemPrice',
|
168 |
-
defaultValue: '<price/>',
|
169 |
-
extensions,
|
170 |
-
arg,
|
171 |
-
validation: productPriceValidation,
|
172 |
-
} );
|
173 |
-
|
174 |
-
const subtotalPriceFormat = __experimentalApplyCheckoutFilter( {
|
175 |
-
filterName: 'subtotalPriceFormat',
|
176 |
-
defaultValue: '<price/>',
|
177 |
-
extensions,
|
178 |
-
arg,
|
179 |
-
validation: productPriceValidation,
|
180 |
-
} );
|
181 |
-
|
182 |
-
const saleBadgePriceFormat = __experimentalApplyCheckoutFilter( {
|
183 |
-
filterName: 'saleBadgePriceFormat',
|
184 |
-
defaultValue: '<price/>',
|
185 |
-
extensions,
|
186 |
-
arg,
|
187 |
-
validation: productPriceValidation,
|
188 |
-
} );
|
189 |
-
|
190 |
return (
|
191 |
<tr
|
192 |
className={ classnames( 'wc-block-cart-items__row', {
|
@@ -196,9 +108,7 @@ const CartLineItemRow = ( {
|
|
196 |
{ /* If the image has no alt text, this link is unnecessary and can be hidden. */ }
|
197 |
<td
|
198 |
className="wc-block-cart-item__image"
|
199 |
-
aria-hidden={
|
200 |
-
! objectHasProp( firstImage, 'alt'
|
3 |
*/
|
4 |
import classnames from 'classnames';
|
5 |
import { __ } from '@wordpress/i18n';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
import QuantitySelector from '@woocommerce/base-components/quantity-selector';
|
8 |
import ProductPrice from '@woocommerce/base-components/product-price';
|
9 |
import ProductName from '@woocommerce/base-components/product-name';
|
10 |
+
import { useStoreCartItemQuantity } from '@woocommerce/base-hooks';
|
|
|
|
|
|
|
|
|
11 |
import {
|
12 |
ProductBackorderBadge,
|
13 |
ProductImage,
|
15 |
ProductMetadata,
|
16 |
ProductSaleBadge,
|
17 |
} from '@woocommerce/base-components/cart-checkout';
|
18 |
+
import { getCurrency } from '@woocommerce/price-format';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
import Dinero from 'dinero.js';
|
20 |
+
|
21 |
+
/**
|
22 |
+
* @typedef {import('@woocommerce/type-defs/cart').CartItem} CartItem
|
23 |
+
*/
|
24 |
|
25 |
/**
|
26 |
* Convert a Dinero object with precision to store currency minor unit.
|
29 |
* @param {Object} currency Currency data.
|
30 |
* @return {number} Amount with new minor unit precision.
|
31 |
*/
|
32 |
+
const getAmountFromRawPrice = ( priceObject, currency ) => {
|
|
|
|
|
|
|
33 |
return priceObject.convertPrecision( currency.minorUnit ).getAmount();
|
34 |
};
|
35 |
|
39 |
* @param {Object} props
|
40 |
* @param {CartItem|Object} props.lineItem
|
41 |
*/
|
42 |
+
const CartLineItemRow = ( { lineItem = {} } ) => {
|
|
|
|
|
|
|
|
|
43 |
const {
|
44 |
+
name = '',
|
45 |
+
catalog_visibility: catalogVisibility = '',
|
46 |
short_description: shortDescription = '',
|
47 |
description: fullDescription = '',
|
48 |
low_stock_remaining: lowStockRemaining = null,
|
71 |
sale_price: '0',
|
72 |
},
|
73 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
} = lineItem;
|
75 |
|
76 |
const {
|
77 |
quantity,
|
78 |
+
changeQuantity,
|
79 |
removeItem,
|
80 |
isPendingDelete,
|
81 |
} = useStoreCartItemQuantity( lineItem );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
|
83 |
+
const currency = getCurrency( prices );
|
84 |
const regularAmountSingle = Dinero( {
|
85 |
amount: parseInt( prices.raw_prices.regular_price, 10 ),
|
86 |
+
precision: parseInt( prices.raw_prices.precision, 10 ),
|
87 |
} );
|
88 |
const purchaseAmountSingle = Dinero( {
|
89 |
amount: parseInt( prices.raw_prices.price, 10 ),
|
90 |
+
precision: parseInt( prices.raw_prices.precision, 10 ),
|
91 |
} );
|
92 |
+
const regularAmount = regularAmountSingle.multiply( quantity );
|
93 |
+
const purchaseAmount = purchaseAmountSingle.multiply( quantity );
|
94 |
const saleAmountSingle = regularAmountSingle.subtract(
|
95 |
purchaseAmountSingle
|
96 |
);
|
97 |
+
const saleAmount = regularAmount.subtract( purchaseAmount );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
const firstImage = images.length ? images[ 0 ] : {};
|
99 |
const isProductHiddenFromCatalog =
|
100 |
catalogVisibility === 'hidden' || catalogVisibility === 'search';
|
101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
return (
|
103 |
<tr
|
104 |
className={ classnames( 'wc-block-cart-items__row', {
|
108 |
{ /* If the image has no alt text, this link is unnecessary and can be hidden. */ }
|
109 |
<td
|
110 |
className="wc-block-cart-item__image"
|
|
|
|