Version Description
Download this release
Release Info
Developer | aljullu |
Plugin | WooCommerce Gutenberg Products Block |
Version | 3.4.1 |
Comparing to | |
See all releases |
Code changes from version 5.5.0 to 3.4.1
- .prettierrc.js +0 -3
- LICENSE +0 -674
- assets/css/abstracts/_breakpoints.scss +0 -2
- assets/css/abstracts/_colors.scss +51 -8
- assets/css/abstracts/_mixins.scss +3 -47
- assets/css/abstracts/_variables.scss +18 -8
- assets/css/editor.scss +10 -10
- assets/css/style.scss +8 -38
- 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/frontend.js +2 -1
- 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/product-types/variable/variation-attributes/index.js +0 -4
- assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/style.scss +2 -2
- assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js +6 -43
- assets/js/atomic/blocks/product-elements/add-to-cart/shared/quantity-input.js +0 -7
- assets/js/atomic/blocks/product-elements/button/block.js +16 -14
- assets/js/atomic/blocks/product-elements/button/style.scss +0 -10
- assets/js/atomic/blocks/product-elements/image/block.js +51 -48
- assets/js/atomic/blocks/product-elements/image/edit.js +2 -2
- assets/js/atomic/blocks/product-elements/image/frontend.js +2 -1
- assets/js/atomic/blocks/product-elements/image/test/block.test.js +0 -139
- assets/js/atomic/blocks/product-elements/price/block.js +2 -1
- assets/js/atomic/blocks/product-elements/rating/block.js +1 -1
- assets/js/atomic/blocks/product-elements/shared/editor.scss +1 -1
- assets/js/atomic/blocks/product-elements/shared/with-product-selector.js +4 -4
- assets/js/atomic/blocks/product-elements/stock-indicator/style.scss +3 -3
- assets/js/atomic/blocks/product-elements/summary/block.js +4 -2
- assets/js/atomic/blocks/product-elements/title/block.js +31 -21
- assets/js/atomic/blocks/product-elements/title/frontend.js +2 -1
- 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 +3 -13
- assets/js/base/components/block-error-boundary/style.scss +18 -16
- assets/js/base/components/button/{index.tsx → index.js} +15 -17
- assets/js/base/components/button/style.scss +41 -3
- 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/{address-form.tsx → index.js} +29 -63
- 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 +0 -178
- assets/js/base/components/cart-checkout/form-step/index.js +0 -1
- assets/js/base/components/cart-checkout/form-step/style.scss +10 -16
- assets/js/base/components/cart-checkout/form-step/test/__snapshots__/index.js.snap +1 -1
- assets/js/base/components/cart-checkout/index.js +4 -4
- assets/js/base/components/cart-checkout/order-summary/index.js +1 -2
- assets/js/base/components/cart-checkout/order-summary/order-summary-item.js +20 -104
- assets/js/base/components/cart-checkout/order-summary/style.scss +12 -29
- 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/payment-method-icons/index.js +2 -3
- assets/js/base/components/cart-checkout/payment-method-icons/payment-method-icon.js +0 -5
- 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/policies/style.scss +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 +0 -60
- assets/js/base/components/cart-checkout/product-details/style.scss +0 -25
- assets/js/base/components/cart-checkout/product-details/test/__snapshots__/index.js.snap +0 -76
- assets/js/base/components/cart-checkout/product-details/test/index.js +0 -57
- assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js} +10 -8
- assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js} +6 -9
- assets/js/base/components/cart-checkout/product-metadata/index.js +39 -0
- assets/js/base/components/cart-checkout/product-metadata/index.tsx +0 -45
- assets/js/base/components/cart-checkout/product-metadata/style.scss +1 -1
- assets/js/base/components/cart-checkout/product-name/index.js +32 -0
- assets/js/base/components/{product-name → cart-checkout/product-name}/style.scss +2 -0
- 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.js +38 -0
- assets/js/base/components/cart-checkout/product-summary/index.tsx +0 -41
- assets/js/base/components/cart-checkout/product-variation-data/index.js +49 -0
- assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js} +30 -8
- assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js} +8 -10
- assets/js/base/components/cart-checkout/shipping-location/index.js +64 -0
- assets/js/base/components/cart-checkout/shipping-location/index.tsx +0 -70
- assets/js/base/components/cart-checkout/shipping-rates-control-package/index.tsx +0 -152
- assets/js/base/components/cart-checkout/shipping-rates-control-package/package-rates.tsx +0 -69
- 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.js +113 -0
- assets/js/base/components/cart-checkout/shipping-rates-control/index.tsx +0 -187
- assets/js/base/components/cart-checkout/shipping-rates-control/package-options.js +71 -0
- assets/js/base/components/cart-checkout/shipping-rates-control/package.js +126 -0
- assets/js/base/components/cart-checkout/shipping-rates-control/packages.js +71 -0
- assets/js/base/components/cart-checkout/shipping-rates-control/style.scss +35 -0
- assets/js/base/components/cart-checkout/totals/discount/stories/index.js +0 -37
- assets/js/base/components/cart-checkout/totals/discount/style.scss +0 -9
- assets/js/base/components/cart-checkout/totals/footer-item/stories/index.js +0 -32
- 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/index.js +8 -4
- assets/js/base/components/cart-checkout/totals/shipping/index.tsx +0 -215
- assets/js/base/components/cart-checkout/totals/shipping/shipping-rate-selector.js +0 -48
- assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx +0 -17
- assets/js/base/components/cart-checkout/totals/shipping/stories/index.js +0 -35
- assets/js/base/components/cart-checkout/totals/subtotals-item/index.js +39 -0
- assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/index.js +11 -11
- assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/stories/index.js +4 -5
- assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/style.scss +8 -18
- assets/js/base/components/cart-checkout/totals/{discount → totals-discount-item}/index.js +35 -51
- assets/js/base/components/cart-checkout/totals/totals-discount-item/style.scss +5 -0
- assets/js/base/components/cart-checkout/totals/totals-fees-item/index.js +50 -0
- assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/index.js +8 -29
- assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/style.scss +1 -1
- assets/js/base/components/cart-checkout/totals/totals-item/index.js +52 -0
- {packages/checkout/totals/item → assets/js/base/components/cart-checkout/totals/totals-item}/style.scss +2 -6
- assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/has-shipping-rate.js +0 -0
- assets/js/base/components/cart-checkout/totals/totals-shipping-item/index.js +148 -0
- assets/js/base/components/cart-checkout/totals/totals-shipping-item/shipping-rate-selector.js +65 -0
- assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/style.scss +11 -9
- assets/js/base/components/cart-checkout/totals/totals-taxes-item/index.js +57 -0
- assets/js/base/components/cart-checkout/totals/totals-taxes-item/style.scss +3 -0
- assets/js/base/components/checkbox-control/index.js +0 -8
- assets/js/base/components/checkbox-control/stories/index.js +0 -27
- assets/js/base/components/checkbox-control/style.scss +15 -45
- assets/js/base/components/checkbox-list/index.js +3 -14
- assets/js/base/components/chip/chip.js +0 -11
- assets/js/base/components/chip/removable-chip.js +1 -11
- assets/js/base/components/chip/stories/index.js +0 -42
- assets/js/base/components/chip/style.scss +4 -4
- assets/js/base/components/chip/test/__snapshots__/index.js.snap +12 -12
- 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/country-input/stories/index.js +1 -1
- assets/js/base/components/dropdown-selector/index.js +1 -12
- assets/js/base/components/dropdown-selector/menu.js +0 -1
- assets/js/base/components/dropdown-selector/selected-chip.js +0 -1
- assets/js/base/components/dropdown-selector/style.scss +4 -4
- assets/js/base/components/filter-submit-button/index.js +1 -1
- assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js} +15 -33
- assets/js/base/components/label/{index.tsx → index.js} +15 -12
- assets/js/base/components/loading-mask/index.js +17 -16
- assets/js/base/components/loading-mask/style.scss +3 -4
- packages/checkout/panel/index.tsx → assets/js/base/components/panel/index.js +15 -16
- assets/js/base/components/panel/style.scss +50 -0
- assets/js/base/components/payment-methods/express-payment-methods.js +68 -0
- assets/js/base/components/payment-methods/express-payment/cart-express-payment.js +41 -0
- assets/js/base/components/payment-methods/express-payment/checkout-express-payment.js +58 -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 -1
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js +1 -1
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss +1 -1
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js +7 -11
- assets/js/base/components/payment-methods/payment-methods.js +178 -0
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js +79 -85
- assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss +19 -80
- assets/js/base/components/price-slider/constrain-range-slider-values.js +2 -2
- assets/js/base/components/price-slider/index.js +17 -28
- assets/js/base/components/price-slider/style.scss +181 -251
- 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 +2 -7
- assets/js/base/components/product-list/index.js +236 -2
- assets/js/base/components/product-list/product-list.js +0 -262
- assets/js/base/components/product-list/style.scss +6 -21
- assets/js/base/components/product-name/index.tsx +0 -48
- assets/js/base/components/product-name/stories/index.js +0 -26
- assets/js/base/components/product-name/test/__snapshots__/index.js.snap +0 -49
- assets/js/base/components/product-name/test/index.js +0 -48
- assets/js/base/components/product-price/index.js +53 -71
- assets/js/base/components/product-price/stories/index.js +32 -7
- 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 +11 -25
- assets/js/base/components/radio-control-accordion/index.js +0 -73
- assets/js/base/components/radio-control/_mixin.scss +114 -0
- assets/js/base/components/radio-control/index.js +1 -1
- assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js} +5 -11
- assets/js/base/components/radio-control/option.js +1 -6
- assets/js/base/components/radio-control/style.scss +3 -114
- assets/js/base/components/read-more/test/index.js +3 -3
- assets/js/base/components/reviews/review-list-item/index.js +9 -7
- 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 +8 -50
- assets/js/base/components/select/validated.js +10 -15
- assets/js/base/components/sidebar-layout/style.scss +7 -12
- assets/js/base/components/sort-select/index.js +0 -11
- 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} +20 -4
- assets/js/base/components/store-notices-container/index.js +2 -0
- assets/js/base/components/store-notices-container/snackbar-notices.js +27 -0
- assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js +4 -3
- assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/style.scss +24 -3
- assets/js/base/components/summary/{index.tsx → index.js} +1 -8
- assets/js/base/components/summary/utils.js +1 -1
- assets/js/base/components/tabs/index.js +1 -2
- assets/js/base/components/text-input/debounced-validated.js +35 -0
- assets/js/base/components/text-input/{text-input.tsx → index.js} +23 -26
- assets/js/base/components/text-input/index.ts +0 -2
- assets/js/base/components/text-input/style.scss +4 -24
- assets/js/base/components/text-input/validated-text-input.tsx +0 -166
- assets/js/base/components/text-input/validated.js +117 -0
- assets/js/base/components/textarea/style.scss +0 -7
- assets/js/base/components/title/index.js +0 -8
- 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 +1 -1
- 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 -3
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/index.js +5 -1
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/submit/index.js +7 -8
- assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/index.js +0 -0
- assets/js/base/context/cart-checkout/billing/constants.js +50 -0
- assets/js/base/context/cart-checkout/billing/index.js +51 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js +10 -4
- assets/js/base/context/cart-checkout/checkout-state/actions.js +72 -0
- assets/js/base/context/cart-checkout/checkout-state/constants.js +49 -0
- assets/js/base/context/cart-checkout/checkout-state/event-emit.js +53 -0
- assets/js/base/context/cart-checkout/checkout-state/index.js +344 -0
- assets/js/base/context/cart-checkout/checkout-state/reducer.js +207 -0
- assets/js/base/context/cart-checkout/checkout/index.js +34 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js +67 -71
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js +1 -1
- assets/js/base/context/cart-checkout/payment-methods/actions.js +115 -0
- assets/js/base/context/cart-checkout/payment-methods/constants.js +80 -0
- 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 +449 -0
- assets/js/base/context/cart-checkout/payment-methods/reducer.js +129 -0
- assets/js/base/context/cart-checkout/payment-methods/use-payment-method-registration.js +189 -0
- assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/constants.js +3 -2
- 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 +81 -54
- assets/js/base/context/{providers/container-width-context.js → container-width-context.js} +0 -5
- 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/cart/use-store-cart.ts +0 -223
- 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/shipping/index.js +0 -2
- assets/js/base/context/hooks/shipping/use-select-shipping-rate.ts +0 -81
- assets/js/base/context/hooks/shipping/use-select-shipping-rates.ts +0 -55
- assets/js/base/context/hooks/test/use-store-notices.js +0 -65
- assets/js/base/context/hooks/test/use-store-snackbar-notices.js +0 -51
- assets/js/base/context/hooks/use-checkout-address.js +0 -130
- assets/js/base/context/hooks/use-checkout-notices.js +0 -57
- assets/js/base/context/hooks/use-checkout-submit.js +0 -47
- assets/js/base/context/hooks/use-customer-data.ts +0 -181
- assets/js/base/context/hooks/use-emit-response.ts +0 -26
.prettierrc.js
DELETED
@@ -1,3 +0,0 @@
|
|
1 |
-
// Import the default config file and expose it in the project root.
|
2 |
-
// Useful for editor integrations.
|
3 |
-
module.exports = require( '@wordpress/prettier-config' );
|
|
|
|
|
|
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/_breakpoints.scss
CHANGED
@@ -8,8 +8,6 @@
|
|
8 |
// See https://github.com/WordPress/gutenberg/tree/master/packages/viewport#usage
|
9 |
$breakpoints: 480px, 600px, 782px, 960px, 1280px, 1440px;
|
10 |
|
11 |
-
// @todo refactor breakpoints so they use the mixins from Gutenberg
|
12 |
-
// https://github.com/WordPress/gutenberg/blob/master/packages/base-styles/_mixins.scss
|
13 |
@mixin breakpoint( $sizes... ) {
|
14 |
@each $size in $sizes {
|
15 |
@if type-of( $size ) == string {
|
8 |
// See https://github.com/WordPress/gutenberg/tree/master/packages/viewport#usage
|
9 |
$breakpoints: 480px, 600px, 782px, 960px, 1280px, 1440px;
|
10 |
|
|
|
|
|
11 |
@mixin breakpoint( $sizes... ) {
|
12 |
@each $size in $sizes {
|
13 |
@if type-of( $size ) == string {
|
assets/css/abstracts/_colors.scss
CHANGED
@@ -1,14 +1,56 @@
|
|
1 |
-
|
2 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
// Bright colors
|
5 |
-
$
|
6 |
-
$
|
7 |
-
$
|
8 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
-
$
|
11 |
-
$input-border-gray: #50575e;
|
12 |
$input-border-dark: rgba(255, 255, 255, 0.4);
|
13 |
$input-disabled-dark: rgba(255, 255, 255, 0.3);
|
14 |
$controls-border-dark: rgba(255, 255, 255, 0.6);
|
@@ -19,3 +61,4 @@ $input-background-dark: rgba(0, 0, 0, 0.1);
|
|
19 |
$select-dropdown-dark: #1e1e1e;
|
20 |
$select-dropdown-light: #fff;
|
21 |
$select-item-dark: rgba(0, 0, 0, 0.4);
|
|
1 |
+
// Greys
|
2 |
+
$core-grey-light-100: #f8f9f9;
|
3 |
+
$core-grey-light-200: #f3f4f5;
|
4 |
+
$core-grey-light-300: #edeff0;
|
5 |
+
$core-grey-light-400: #e8eaeb;
|
6 |
+
$core-grey-light-500: #e2e4e7;
|
7 |
+
$core-grey-light-600: #d7dade;
|
8 |
+
$core-grey-light-700: #ccd0d4;
|
9 |
+
$core-grey-light-800: #b5bcc2;
|
10 |
+
$core-grey-light-900: #a2aab2;
|
11 |
+
$core-grey-dark-100: #86909b;
|
12 |
+
$core-grey-dark-200: #78848f;
|
13 |
+
$core-grey-dark-300: #6c7781; // This & below have 4.5+ contrast against white
|
14 |
+
$core-grey-dark-400: #606a73;
|
15 |
+
$core-grey-dark-500: #555d66;
|
16 |
+
$core-grey-dark-600: #40464d;
|
17 |
+
$core-grey-dark-700: #32373c;
|
18 |
+
$core-grey-dark-800: #23282d;
|
19 |
+
$core-grey-dark-900: #191e23;
|
20 |
+
|
21 |
+
$gray-text: $core-grey-dark-500;
|
22 |
+
|
23 |
+
// WooCommerce Purples
|
24 |
+
$woocommerce-100: #ffd7ff;
|
25 |
+
$woocommerce-200: #e2a5d7;
|
26 |
+
$woocommerce-300: #c88bbd;
|
27 |
+
$woocommerce-400: #af72a4;
|
28 |
+
$woocommerce-500: #95588a;
|
29 |
+
$woocommerce-600: #7c3f71;
|
30 |
+
$woocommerce-700: #622557;
|
31 |
+
$woocommerce-800: #490c3e;
|
32 |
+
$woocommerce-900: #2f0024;
|
33 |
+
$woocommerce: $woocommerce-500;
|
34 |
+
|
35 |
+
$wp-admin-background: #f1f1f1;
|
36 |
+
$black: #24292d; // same as wp-admin sidebar
|
37 |
+
|
38 |
+
$white: #fff;
|
39 |
|
40 |
// Bright colors
|
41 |
+
$valid-green: #4ab866;
|
42 |
+
$notice-yellow: #ffb900;
|
43 |
+
$error-red: #d94f4f;
|
44 |
+
$box-shadow-blue: #5b9dd9;
|
45 |
+
$core-orange: #ca4a1f;
|
46 |
+
|
47 |
+
$gray-10: #c3c4c7;
|
48 |
+
$gray-20: #a7aaad;
|
49 |
+
$gray-50: #646970;
|
50 |
+
$gray-60: #50575e;
|
51 |
+
$gray-80: #2c3338;
|
52 |
|
53 |
+
$input-border-gray: #8d96a0;
|
|
|
54 |
$input-border-dark: rgba(255, 255, 255, 0.4);
|
55 |
$input-disabled-dark: rgba(255, 255, 255, 0.3);
|
56 |
$controls-border-dark: rgba(255, 255, 255, 0.6);
|
61 |
$select-dropdown-dark: #1e1e1e;
|
62 |
$select-dropdown-light: #fff;
|
63 |
$select-item-dark: rgba(0, 0, 0, 0.4);
|
64 |
+
|
assets/css/abstracts/_mixins.scss
CHANGED
@@ -26,13 +26,11 @@ $fontSizes: (
|
|
26 |
// Adds animation to placeholder section
|
27 |
@mixin placeholder() {
|
28 |
animation: loading-fade 1.2s ease-in-out infinite;
|
29 |
-
background-color: $
|
30 |
-
color: $
|
31 |
-
|
32 |
-
border: 0 !important;
|
33 |
box-shadow: none;
|
34 |
pointer-events: none;
|
35 |
-
max-width: 100%;
|
36 |
|
37 |
// Forces direct descendants to keep layout but lose visibility.
|
38 |
> * {
|
@@ -52,7 +50,6 @@ $fontSizes: (
|
|
52 |
|
53 |
// Hide an element from sighted users, but available to screen reader users.
|
54 |
@mixin visually-hidden() {
|
55 |
-
border: 0;
|
56 |
clip: rect(1px, 1px, 1px, 1px);
|
57 |
clip-path: inset(50%);
|
58 |
height: 1px;
|
@@ -62,29 +59,6 @@ $fontSizes: (
|
|
62 |
/* Many screen reader and browser combinations announce broken words as they would appear visually. */
|
63 |
overflow-wrap: normal !important;
|
64 |
word-wrap: normal !important;
|
65 |
-
padding: 0;
|
66 |
-
position: absolute !important;
|
67 |
-
width: 1px;
|
68 |
-
}
|
69 |
-
|
70 |
-
@mixin visually-hidden-focus-reveal() {
|
71 |
-
background-color: #fff;
|
72 |
-
border-radius: 3px;
|
73 |
-
box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
|
74 |
-
clip: auto !important;
|
75 |
-
clip-path: none;
|
76 |
-
color: $input-text-active;
|
77 |
-
display: block;
|
78 |
-
font-size: 0.875rem;
|
79 |
-
font-weight: 700;
|
80 |
-
height: auto;
|
81 |
-
left: 5px;
|
82 |
-
line-height: normal;
|
83 |
-
padding: 15px 23px 14px;
|
84 |
-
text-decoration: none;
|
85 |
-
top: 5px;
|
86 |
-
width: auto;
|
87 |
-
z-index: 100000;
|
88 |
}
|
89 |
|
90 |
@mixin reset-box() {
|
@@ -124,7 +98,6 @@ $fontSizes: (
|
|
124 |
background: transparent;
|
125 |
box-shadow: none;
|
126 |
display: inline;
|
127 |
-
text-shadow: none;
|
128 |
|
129 |
&:hover,
|
130 |
&:focus,
|
@@ -170,24 +143,7 @@ $fontSizes: (
|
|
170 |
}
|
171 |
}
|
172 |
|
173 |
-
// Wraps the content with a media query specially targeting IE11.
|
174 |
-
@mixin ie11() {
|
175 |
-
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
|
176 |
-
@content;
|
177 |
-
}
|
178 |
-
}
|
179 |
-
|
180 |
// Converts a px unit to em.
|
181 |
@function em($size, $base: 16px) {
|
182 |
@return $size / $base * 1em;
|
183 |
}
|
184 |
-
|
185 |
-
// Encodes hex colors so they can be used in URL content.
|
186 |
-
@function encode-color($color) {
|
187 |
-
@if type-of($color) != "color" or str-index(#{$color}, "#") != 1 {
|
188 |
-
@return $color;
|
189 |
-
}
|
190 |
-
|
191 |
-
$hex: str-slice(ie-hex-str($color), 4);
|
192 |
-
@return "%23" + unquote("#{$hex}");
|
193 |
-
}
|
26 |
// Adds animation to placeholder section
|
27 |
@mixin placeholder() {
|
28 |
animation: loading-fade 1.2s ease-in-out infinite;
|
29 |
+
background-color: $core-grey-light-500 !important;
|
30 |
+
border-color: $core-grey-light-500 !important;
|
31 |
+
color: $core-grey-light-500 !important;
|
|
|
32 |
box-shadow: none;
|
33 |
pointer-events: none;
|
|
|
34 |
|
35 |
// Forces direct descendants to keep layout but lose visibility.
|
36 |
> * {
|
50 |
|
51 |
// Hide an element from sighted users, but available to screen reader users.
|
52 |
@mixin visually-hidden() {
|
|
|
53 |
clip: rect(1px, 1px, 1px, 1px);
|
54 |
clip-path: inset(50%);
|
55 |
height: 1px;
|
59 |
/* Many screen reader and browser combinations announce broken words as they would appear visually. */
|
60 |
overflow-wrap: normal !important;
|
61 |
word-wrap: normal !important;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
}
|
63 |
|
64 |
@mixin reset-box() {
|
98 |
background: transparent;
|
99 |
box-shadow: none;
|
100 |
display: inline;
|
|
|
101 |
|
102 |
&:hover,
|
103 |
&:focus,
|
143 |
}
|
144 |
}
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
// Converts a px unit to em.
|
147 |
@function em($size, $base: 16px) {
|
148 |
@return $size / $base * 1em;
|
149 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/css/abstracts/_variables.scss
CHANGED
@@ -1,12 +1,22 @@
|
|
1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
$
|
6 |
-
$
|
7 |
-
|
8 |
-
|
9 |
-
$
|
|
|
|
|
|
|
|
|
10 |
|
11 |
// Cart block
|
12 |
$cart-image-width: 5rem;
|
1 |
+
$gap-largest: 40px;
|
2 |
+
$gap-larger: 36px;
|
3 |
+
$gap-large: 24px;
|
4 |
+
$gap: 16px;
|
5 |
+
$gap-small: 12px;
|
6 |
+
$gap-smaller: 8px;
|
7 |
+
$gap-smallest: 4px;
|
8 |
|
9 |
+
// Variables pulled from Gutenberg.
|
10 |
+
// Editor Widths
|
11 |
+
$sidebar-width: 280px;
|
12 |
+
$content-width: 610px; // For the visual width, subtract 30px (2 * $block-padding + 2px borders). This comes to 580px, which is optimized for 70 characters.
|
13 |
+
|
14 |
+
// Blocks
|
15 |
+
$block-padding: 14px; // Space between block footprint and focus boundaries. These are drawn outside the block footprint, and do not affect the size.
|
16 |
+
$block-spacing: 4px; // Vertical space between blocks.
|
17 |
+
$block-side-ui-width: 28px; // Width of the movers/drag handle UI.
|
18 |
+
$block-side-ui-clearance: 2px; // Space between movers/drag handle UI, and block.
|
19 |
+
$block-container-side-padding: $block-side-ui-width + $block-padding + 2 * $block-side-ui-clearance; // Total space left and right of the block footprint.
|
20 |
|
21 |
// Cart block
|
22 |
$cart-image-width: 5rem;
|
assets/css/editor.scss
CHANGED
@@ -19,7 +19,6 @@
|
|
19 |
.wc-block-grid__products {
|
20 |
list-style: none;
|
21 |
margin: 0 (-$gap/2) $gap;
|
22 |
-
padding: 0;
|
23 |
|
24 |
.wc-block-grid__product {
|
25 |
margin: 0 0 $gap-large 0;
|
@@ -48,15 +47,16 @@
|
|
48 |
}
|
49 |
}
|
50 |
|
51 |
-
//
|
52 |
-
.
|
53 |
-
|
54 |
-
margin: 0;
|
55 |
-
padding: 0;
|
56 |
}
|
57 |
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
|
|
|
|
|
|
62 |
}
|
19 |
.wc-block-grid__products {
|
20 |
list-style: none;
|
21 |
margin: 0 (-$gap/2) $gap;
|
|
|
22 |
|
23 |
.wc-block-grid__product {
|
24 |
margin: 0 0 $gap-large 0;
|
47 |
}
|
48 |
}
|
49 |
|
50 |
+
// Adds border to placeholder lists, so they can be distinguished from the white background.
|
51 |
+
.components-placeholder .woocommerce-search-list__list {
|
52 |
+
border: 1px solid $core-grey-light-500;
|
|
|
|
|
53 |
}
|
54 |
|
55 |
+
// Work-around to make the SearchList component work fine with the last versions of @wordpress/components.
|
56 |
+
// Ideally it should be possible to remove this once this issue is fixed in WC Admin:
|
57 |
+
// https://github.com/woocommerce/woocommerce-admin/issues/4349
|
58 |
+
.components-placeholder .woocommerce-search-list__list .woocommerce-search-list__item {
|
59 |
+
border-radius: 0;
|
60 |
+
height: auto;
|
61 |
+
text-align: left;
|
62 |
}
|
assets/css/style.scss
CHANGED
@@ -21,7 +21,6 @@
|
|
21 |
}
|
22 |
|
23 |
img {
|
24 |
-
height: auto;
|
25 |
width: 100%;
|
26 |
|
27 |
&[hidden] {
|
@@ -47,56 +46,38 @@
|
|
47 |
margin-right: 0.5em;
|
48 |
}
|
49 |
}
|
50 |
-
.wc-block-grid__product-add-to-cart
|
51 |
word-break: break-word;
|
52 |
white-space: normal;
|
53 |
-
|
|
|
54 |
word-break: break-word;
|
55 |
white-space: normal;
|
56 |
margin: 0 auto !important;
|
57 |
display: inline-flex;
|
58 |
justify-content: center;
|
59 |
-
text-align: center;
|
60 |
-
// Set button font size and padding so it inherits from parent.
|
61 |
-
padding: 0.5em 1em;
|
62 |
-
font-size: 1em;
|
63 |
|
64 |
&.loading {
|
65 |
opacity: 0.25;
|
66 |
}
|
67 |
|
|
|
|
|
|
|
|
|
|
|
68 |
&.added::after {
|
69 |
font-family: WooCommerce; /* stylelint-disable-line */
|
70 |
content: "\e017";
|
71 |
-
margin-left: 0.5em;
|
72 |
-
display: inline-block;
|
73 |
-
width: auto;
|
74 |
-
height: auto;
|
75 |
}
|
76 |
|
77 |
&.loading::after {
|
78 |
font-family: WooCommerce; /* stylelint-disable-line */
|
79 |
content: "\e031";
|
80 |
animation: spin 2s linear infinite;
|
81 |
-
margin-left: 0.5em;
|
82 |
-
display: inline-block;
|
83 |
-
width: auto;
|
84 |
-
height: auto;
|
85 |
}
|
86 |
}
|
87 |
}
|
88 |
-
// Remove button sugar if unlikely to fit.
|
89 |
-
.has-5-columns:not(.alignfull),
|
90 |
-
.has-6-columns,
|
91 |
-
.has-7-columns,
|
92 |
-
.has-8-columns,
|
93 |
-
.has-9-columns {
|
94 |
-
.wc-block-grid__product-add-to-cart.wp-block-button .wp-block-button__link::after {
|
95 |
-
content: "";
|
96 |
-
margin: 0;
|
97 |
-
}
|
98 |
-
}
|
99 |
-
|
100 |
.wc-block-grid__product-rating {
|
101 |
display: block;
|
102 |
|
@@ -201,9 +182,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 {
|
@@ -307,11 +285,3 @@
|
|
307 |
}
|
308 |
}
|
309 |
}
|
310 |
-
|
311 |
-
// Default screen-reader styles. Included as a fallback for themes that don't have support.
|
312 |
-
.screen-reader-text {
|
313 |
-
@include visually-hidden();
|
314 |
-
}
|
315 |
-
.screen-reader-text:focus {
|
316 |
-
@include visually-hidden-focus-reveal();
|
317 |
-
}
|
21 |
}
|
22 |
|
23 |
img {
|
|
|
24 |
width: 100%;
|
25 |
|
26 |
&[hidden] {
|
46 |
margin-right: 0.5em;
|
47 |
}
|
48 |
}
|
49 |
+
.wc-block-grid__product-add-to-cart {
|
50 |
word-break: break-word;
|
51 |
white-space: normal;
|
52 |
+
a,
|
53 |
+
button {
|
54 |
word-break: break-word;
|
55 |
white-space: normal;
|
56 |
margin: 0 auto !important;
|
57 |
display: inline-flex;
|
58 |
justify-content: center;
|
|
|
|
|
|
|
|
|
59 |
|
60 |
&.loading {
|
61 |
opacity: 0.25;
|
62 |
}
|
63 |
|
64 |
+
&::after {
|
65 |
+
margin-left: 0.5em;
|
66 |
+
display: inline-block;
|
67 |
+
}
|
68 |
+
|
69 |
&.added::after {
|
70 |
font-family: WooCommerce; /* stylelint-disable-line */
|
71 |
content: "\e017";
|
|
|
|
|
|
|
|
|
72 |
}
|
73 |
|
74 |
&.loading::after {
|
75 |
font-family: WooCommerce; /* stylelint-disable-line */
|
76 |
content: "\e031";
|
77 |
animation: spin 2s linear infinite;
|
|
|
|
|
|
|
|
|
78 |
}
|
79 |
}
|
80 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
.wc-block-grid__product-rating {
|
82 |
display: block;
|
83 |
|
182 |
.wc-block-components-product-sale-badge {
|
183 |
line-height: 1;
|
184 |
}
|
|
|
|
|
|
|
185 |
}
|
186 |
|
187 |
.theme-twentytwenty {
|
285 |
}
|
286 |
}
|
287 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/frontend.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
|
5 |
|
6 |
/**
|
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
|
|
9 |
import Block from './block';
|
10 |
import attributes from './attributes';
|
11 |
|
12 |
-
export default withFilteredAttributes( attributes )( Block );
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { compose } from '@wordpress/compose';
|
5 |
import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
|
6 |
|
7 |
/**
|
10 |
import Block from './block';
|
11 |
import attributes from './attributes';
|
12 |
|
13 |
+
export default compose( withFilteredAttributes( attributes ) )( Block );
|
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/product-types/variable/variation-attributes/index.js
CHANGED
@@ -7,10 +7,6 @@ import { getAttributes, getVariationAttributes } from './utils';
|
|
7 |
|
8 |
/**
|
9 |
* VariationAttributes component.
|
10 |
-
*
|
11 |
-
* @param {Object} props Incoming props
|
12 |
-
* @param {Object} props.product Product
|
13 |
-
* @param {Object} props.dispatchers An object where values are dispatching functions.
|
14 |
*/
|
15 |
const VariationAttributes = ( { product, dispatchers } ) => {
|
16 |
const attributes = getAttributes( product.attributes );
|
7 |
|
8 |
/**
|
9 |
* VariationAttributes component.
|
|
|
|
|
|
|
|
|
10 |
*/
|
11 |
const VariationAttributes = ( { product, dispatchers } ) => {
|
12 |
const attributes = getAttributes( product.attributes );
|
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/style.scss
CHANGED
@@ -23,9 +23,9 @@
|
|
23 |
margin-bottom: $gap-large;
|
24 |
|
25 |
select {
|
26 |
-
border-color: $
|
27 |
&:focus {
|
28 |
-
outline-color: $
|
29 |
}
|
30 |
}
|
31 |
}
|
23 |
margin-bottom: $gap-large;
|
24 |
|
25 |
select {
|
26 |
+
border-color: $error-red;
|
27 |
&:focus {
|
28 |
+
outline-color: $error-red;
|
29 |
}
|
30 |
}
|
31 |
}
|
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,33 +79,16 @@ 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 |
};
|
103 |
|
104 |
/**
|
105 |
-
* Button
|
106 |
-
*
|
107 |
-
* @param {Object} props Incoming props.
|
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 |
);
|
@@ -125,14 +96,6 @@ const LinkComponent = ( { className, href, text, onClick } ) => {
|
|
125 |
|
126 |
/**
|
127 |
* Button for purchasable products.
|
128 |
-
*
|
129 |
-
* @param {Object} props Incoming props for component
|
130 |
-
* @param {string} props.className Incoming css class name.
|
131 |
-
* @param {number} props.quantityInCart Quantity of item in cart.
|
132 |
-
* @param {boolean} props.isProcessing Whether processing action is occurring.
|
133 |
-
* @param {boolean} props.isDisabled Whether the button is disabled or not.
|
134 |
-
* @param {boolean} props.isDone Whether processing is done.
|
135 |
-
* @param {function():any} props.onClick Callback to execute when button is clicked.
|
136 |
*/
|
137 |
const ButtonComponent = ( {
|
138 |
className,
|
@@ -151,7 +114,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 |
};
|
85 |
|
86 |
/**
|
87 |
+
* Button for non-purchasable products.
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
*/
|
89 |
+
const LinkComponent = ( { className, href, text } ) => {
|
90 |
return (
|
91 |
+
<Button className={ className } href={ href } rel="nofollow">
|
|
|
|
|
|
|
|
|
|
|
92 |
{ text }
|
93 |
</Button>
|
94 |
);
|
96 |
|
97 |
/**
|
98 |
* Button for purchasable products.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
*/
|
100 |
const ButtonComponent = ( {
|
101 |
className,
|
114 |
>
|
115 |
{ isDone && quantityInCart > 0
|
116 |
? sprintf(
|
117 |
+
// translators: %s number of products in cart.
|
118 |
_n(
|
119 |
'%d in cart',
|
120 |
'%d in cart',
|
assets/js/atomic/blocks/product-elements/add-to-cart/shared/quantity-input.js
CHANGED
@@ -1,12 +1,5 @@
|
|
1 |
/**
|
2 |
* Quantity Input Component.
|
3 |
-
*
|
4 |
-
* @param {Object} props Incoming props for component
|
5 |
-
* @param {boolean} props.disabled Whether input is disabled or not.
|
6 |
-
* @param {number} props.min Minimum value for input.
|
7 |
-
* @param {number} props.max Maximum value for input.
|
8 |
-
* @param {number} props.value Value for input.
|
9 |
-
* @param {function():any} props.onChange Function to call on input change event.
|
10 |
*/
|
11 |
const QuantityInput = ( { disabled, min, max, value, onChange } ) => {
|
12 |
return (
|
1 |
/**
|
2 |
* Quantity Input Component.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
*/
|
4 |
const QuantityInput = ( { disabled, min, max, value, onChange } ) => {
|
5 |
return (
|
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/button/style.scss
CHANGED
@@ -24,13 +24,3 @@
|
|
24 |
min-width: 8em;
|
25 |
min-height: 3em;
|
26 |
}
|
27 |
-
|
28 |
-
|
29 |
-
.theme-twentytwentyone {
|
30 |
-
// Prevent buttons appearing disabled in the editor.
|
31 |
-
.editor-styles-wrapper .wc-block-components-product-button .wp-block-button__link {
|
32 |
-
background-color: var(--button--color-background);
|
33 |
-
color: var(--button--color-text);
|
34 |
-
border-color: var(--button--color-background);
|
35 |
-
}
|
36 |
-
}
|
24 |
min-width: 8em;
|
25 |
min-height: 3em;
|
26 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/atomic/blocks/product-elements/image/block.js
CHANGED
@@ -2,16 +2,15 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
-
import { useState
|
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 {
|
15 |
|
16 |
/**
|
17 |
* Internal dependencies
|
@@ -30,17 +29,16 @@ import './style.scss';
|
|
30 |
* @param {string} [props.saleBadgeAlign] How should the sale badge be aligned if displayed.
|
31 |
* @return {*} The component.
|
32 |
*/
|
33 |
-
|
34 |
className,
|
35 |
imageSizing = 'full-size',
|
36 |
-
productLink
|
37 |
showSaleBadge,
|
38 |
saleBadgeAlign = 'right',
|
39 |
} ) => {
|
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 (
|
@@ -58,24 +56,8 @@ export const Block = ( {
|
|
58 |
</div>
|
59 |
);
|
60 |
}
|
61 |
-
|
62 |
-
const image =
|
63 |
-
const ParentComponent = showProductLink ? 'a' : Fragment;
|
64 |
-
const anchorLabel = sprintf(
|
65 |
-
/* translators: %s is referring to the product name */
|
66 |
-
__( 'Link to %s', 'woo-gutenberg-products-block' ),
|
67 |
-
product.name
|
68 |
-
);
|
69 |
-
const anchorProps = {
|
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 (
|
81 |
<div
|
@@ -87,21 +69,37 @@ export const Block = ( {
|
|
87 |
}
|
88 |
) }
|
89 |
>
|
90 |
-
|
91 |
-
{
|
92 |
-
|
93 |
-
|
94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
/>
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
</div>
|
106 |
);
|
107 |
};
|
@@ -112,22 +110,28 @@ const ImagePlaceholder = () => {
|
|
112 |
);
|
113 |
};
|
114 |
|
115 |
-
const Image = ( { image, onLoad, loaded, showFullSize
|
116 |
const { thumbnail, src, srcset, sizes, alt } = image || {};
|
117 |
-
|
118 |
-
|
|
|
119 |
onLoad,
|
120 |
hidden: ! loaded,
|
121 |
src: thumbnail,
|
122 |
-
...( showFullSize && { src, srcSet: srcset, sizes } ),
|
123 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
|
125 |
return (
|
126 |
<>
|
127 |
-
{
|
128 |
-
|
129 |
-
<img data-testid="product-image" { ...imageProps } />
|
130 |
-
) }
|
131 |
{ ! loaded && <ImagePlaceholder /> }
|
132 |
</>
|
133 |
);
|
@@ -135,7 +139,6 @@ const Image = ( { image, onLoad, loaded, showFullSize, fallbackAlt } ) => {
|
|
135 |
|
136 |
Block.propTypes = {
|
137 |
className: PropTypes.string,
|
138 |
-
fallbackAlt: PropTypes.string,
|
139 |
productLink: PropTypes.bool,
|
140 |
showSaleBadge: PropTypes.bool,
|
141 |
saleBadgeAlign: PropTypes.string,
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
+
import { useState } from '@wordpress/element';
|
|
|
6 |
import classnames from 'classnames';
|
7 |
+
import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
|
8 |
import {
|
9 |
useInnerBlockLayoutContext,
|
10 |
useProductDataContext,
|
11 |
} from '@woocommerce/shared-context';
|
12 |
import { withProductDataContext } from '@woocommerce/shared-hocs';
|
13 |
+
import { isEmpty } from 'lodash';
|
14 |
|
15 |
/**
|
16 |
* Internal dependencies
|
29 |
* @param {string} [props.saleBadgeAlign] How should the sale badge be aligned if displayed.
|
30 |
* @return {*} The component.
|
31 |
*/
|
32 |
+
const Block = ( {
|
33 |
className,
|
34 |
imageSizing = 'full-size',
|
35 |
+
productLink = true,
|
36 |
showSaleBadge,
|
37 |
saleBadgeAlign = 'right',
|
38 |
} ) => {
|
39 |
const { parentClassName } = useInnerBlockLayoutContext();
|
40 |
const { product } = useProductDataContext();
|
41 |
const [ imageLoaded, setImageLoaded ] = useState( false );
|
|
|
42 |
|
43 |
if ( ! product.id ) {
|
44 |
return (
|
56 |
</div>
|
57 |
);
|
58 |
}
|
59 |
+
|
60 |
+
const image = ! isEmpty( product.images ) ? product.images[ 0 ] : null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
|
62 |
return (
|
63 |
<div
|
69 |
}
|
70 |
) }
|
71 |
>
|
72 |
+
{ productLink ? (
|
73 |
+
<a href={ product.permalink } rel="nofollow">
|
74 |
+
{ !! showSaleBadge && (
|
75 |
+
<ProductSaleBadge
|
76 |
+
align={ saleBadgeAlign }
|
77 |
+
product={ product }
|
78 |
+
/>
|
79 |
+
) }
|
80 |
+
<Image
|
81 |
+
image={ image }
|
82 |
+
onLoad={ () => setImageLoaded( true ) }
|
83 |
+
loaded={ imageLoaded }
|
84 |
+
showFullSize={ imageSizing !== 'cropped' }
|
85 |
/>
|
86 |
+
</a>
|
87 |
+
) : (
|
88 |
+
<>
|
89 |
+
{ !! showSaleBadge && (
|
90 |
+
<ProductSaleBadge
|
91 |
+
align={ saleBadgeAlign }
|
92 |
+
product={ product }
|
93 |
+
/>
|
94 |
+
) }
|
95 |
+
<Image
|
96 |
+
image={ image }
|
97 |
+
onLoad={ () => setImageLoaded( true ) }
|
98 |
+
loaded={ imageLoaded }
|
99 |
+
showFullSize={ imageSizing !== 'cropped' }
|
100 |
+
/>
|
101 |
+
</>
|
102 |
+
) }
|
103 |
</div>
|
104 |
);
|
105 |
};
|
110 |
);
|
111 |
};
|
112 |
|
113 |
+
const Image = ( { image, onLoad, loaded, showFullSize } ) => {
|
114 |
const { thumbnail, src, srcset, sizes, alt } = image || {};
|
115 |
+
|
116 |
+
let imageProps = {
|
117 |
+
alt,
|
118 |
onLoad,
|
119 |
hidden: ! loaded,
|
120 |
src: thumbnail,
|
|
|
121 |
};
|
122 |
+
if ( showFullSize ) {
|
123 |
+
imageProps = {
|
124 |
+
...imageProps,
|
125 |
+
src,
|
126 |
+
srcSet: srcset,
|
127 |
+
sizes,
|
128 |
+
};
|
129 |
+
}
|
130 |
|
131 |
return (
|
132 |
<>
|
133 |
+
{ /* eslint-disable-next-line jsx-a11y/alt-text */ }
|
134 |
+
<img { ...imageProps } />
|
|
|
|
|
135 |
{ ! loaded && <ImagePlaceholder /> }
|
136 |
</>
|
137 |
);
|
139 |
|
140 |
Block.propTypes = {
|
141 |
className: PropTypes.string,
|
|
|
142 |
productLink: PropTypes.bool,
|
143 |
showSaleBadge: PropTypes.bool,
|
144 |
saleBadgeAlign: PropTypes.string,
|
assets/js/atomic/blocks/product-elements/image/edit.js
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { Disabled, PanelBody, ToggleControl } from '@wordpress/components';
|
6 |
import { InspectorControls } from '@wordpress/block-editor';
|
7 |
-
import {
|
8 |
import ToggleButtonControl from '@woocommerce/editor-components/toggle-button-control';
|
9 |
import { getAdminLink } from '@woocommerce/settings';
|
10 |
|
@@ -101,7 +101,7 @@ const Edit = ( { attributes, setAttributes } ) => {
|
|
101 |
'Image Sizing',
|
102 |
'woo-gutenberg-products-block'
|
103 |
) }
|
104 |
-
help={
|
105 |
__(
|
106 |
'Product image cropping can be modified in the <a>Customizer</a>.',
|
107 |
'woo-gutenberg-products-block'
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { Disabled, PanelBody, ToggleControl } from '@wordpress/components';
|
6 |
import { InspectorControls } from '@wordpress/block-editor';
|
7 |
+
import { __experimentalCreateInterpolateElement } from 'wordpress-element';
|
8 |
import ToggleButtonControl from '@woocommerce/editor-components/toggle-button-control';
|
9 |
import { getAdminLink } from '@woocommerce/settings';
|
10 |
|
101 |
'Image Sizing',
|
102 |
'woo-gutenberg-products-block'
|
103 |
) }
|
104 |
+
help={ __experimentalCreateInterpolateElement(
|
105 |
__(
|
106 |
'Product image cropping can be modified in the <a>Customizer</a>.',
|
107 |
'woo-gutenberg-products-block'
|
assets/js/atomic/blocks/product-elements/image/frontend.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
|
5 |
|
6 |
/**
|
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
|
|
9 |
import Block from './block';
|
10 |
import attributes from './attributes';
|
11 |
|
12 |
-
export default withFilteredAttributes( attributes )( Block );
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { compose } from '@wordpress/compose';
|
5 |
import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
|
6 |
|
7 |
/**
|
10 |
import Block from './block';
|
11 |
import attributes from './attributes';
|
12 |
|
13 |
+
export default compose( withFilteredAttributes( attributes ) )( Block );
|
assets/js/atomic/blocks/product-elements/image/test/block.test.js
DELETED
@@ -1,139 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { render, fireEvent } from '@testing-library/react';
|
5 |
-
import { ProductDataContextProvider } from '@woocommerce/shared-context';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import { Block } from '../block';
|
11 |
-
|
12 |
-
jest.mock( '@woocommerce/block-settings', () => ( {
|
13 |
-
__esModule: true,
|
14 |
-
PLACEHOLDER_IMG_SRC: 'placeholder.jpg',
|
15 |
-
} ) );
|
16 |
-
|
17 |
-
const productWithoutImages = {
|
18 |
-
name: 'Test product',
|
19 |
-
id: 1,
|
20 |
-
fallbackAlt: 'Test product',
|
21 |
-
permalink: 'http://test.com/product/test-product/',
|
22 |
-
images: [],
|
23 |
-
};
|
24 |
-
|
25 |
-
const productWithImages = {
|
26 |
-
name: 'Test product',
|
27 |
-
id: 1,
|
28 |
-
fallbackAlt: 'Test product',
|
29 |
-
permalink: 'http://test.com/product/test-product/',
|
30 |
-
images: [
|
31 |
-
{
|
32 |
-
id: 56,
|
33 |
-
src: 'logo-1.jpg',
|
34 |
-
thumbnail: 'logo-1-324x324.jpg',
|
35 |
-
srcset:
|
36 |
-
'logo-1.jpg 800w, logo-1-300x300.jpg 300w, logo-1-150x150.jpg 150w, logo-1-768x767.jpg 768w, logo-1-324x324.jpg 324w, logo-1-416x415.jpg 416w, logo-1-100x100.jpg 100w',
|
37 |
-
sizes: '(max-width: 800px) 100vw, 800px',
|
38 |
-
name: 'logo-1.jpg',
|
39 |
-
alt: '',
|
40 |
-
},
|
41 |
-
{
|
42 |
-
id: 55,
|
43 |
-
src: 'beanie-with-logo-1.jpg',
|
44 |
-
thumbnail: 'beanie-with-logo-1-324x324.jpg',
|
45 |
-
srcset:
|
46 |
-
'beanie-with-logo-1.jpg 800w, beanie-with-logo-1-300x300.jpg 300w, beanie-with-logo-1-150x150.jpg 150w, beanie-with-logo-1-768x768.jpg 768w, beanie-with-logo-1-324x324.jpg 324w, beanie-with-logo-1-416x416.jpg 416w, beanie-with-logo-1-100x100.jpg 100w',
|
47 |
-
sizes: '(max-width: 800px) 100vw, 800px',
|
48 |
-
name: 'beanie-with-logo-1.jpg',
|
49 |
-
alt: '',
|
50 |
-
},
|
51 |
-
],
|
52 |
-
};
|
53 |
-
|
54 |
-
describe( 'Product Image Block', () => {
|
55 |
-
describe( 'with product link', () => {
|
56 |
-
test( 'should render an anchor with the product image', () => {
|
57 |
-
const component = render(
|
58 |
-
<ProductDataContextProvider product={ productWithImages }>
|
59 |
-
<Block productLink />
|
60 |
-
</ProductDataContextProvider>
|
61 |
-
);
|
62 |
-
|
63 |
-
// use testId as alt is added after image is loaded
|
64 |
-
const image = component.getByTestId( 'product-image' );
|
65 |
-
fireEvent.load( image );
|
66 |
-
|
67 |
-
const productImage = component.getByAltText(
|
68 |
-
productWithImages.name
|
69 |
-
);
|
70 |
-
expect( productImage.getAttribute( 'src' ) ).toBe(
|
71 |
-
productWithImages.images[ 0 ].src
|
72 |
-
);
|
73 |
-
|
74 |
-
const anchor = productImage.closest( 'a' );
|
75 |
-
expect( anchor.getAttribute( 'href' ) ).toBe(
|
76 |
-
productWithImages.permalink
|
77 |
-
);
|
78 |
-
} );
|
79 |
-
|
80 |
-
test( 'should render an anchor with the placeholder image', () => {
|
81 |
-
const component = render(
|
82 |
-
<ProductDataContextProvider product={ productWithoutImages }>
|
83 |
-
<Block productLink />
|
84 |
-
</ProductDataContextProvider>
|
85 |
-
);
|
86 |
-
|
87 |
-
const placeholderImage = component.getByAltText( '' );
|
88 |
-
expect( placeholderImage.getAttribute( 'src' ) ).toBe(
|
89 |
-
'placeholder.jpg'
|
90 |
-
);
|
91 |
-
|
92 |
-
const anchor = placeholderImage.closest( 'a' );
|
93 |
-
expect( anchor.getAttribute( 'href' ) ).toBe(
|
94 |
-
productWithoutImages.permalink
|
95 |
-
);
|
96 |
-
expect( anchor.getAttribute( 'aria-label' ) ).toBe(
|
97 |
-
`Link to ${ productWithoutImages.name }`
|
98 |
-
);
|
99 |
-
} );
|
100 |
-
} );
|
101 |
-
|
102 |
-
describe( 'without product link', () => {
|
103 |
-
test( 'should render the product image without an anchor wrapper', () => {
|
104 |
-
const component = render(
|
105 |
-
<ProductDataContextProvider product={ productWithImages }>
|
106 |
-
<Block productLink={ false } />
|
107 |
-
</ProductDataContextProvider>
|
108 |
-
);
|
109 |
-
const image = component.getByTestId( 'product-image' );
|
110 |
-
fireEvent.load( image );
|
111 |
-
|
112 |
-
const productImage = component.getByAltText(
|
113 |
-
productWithImages.name
|
114 |
-
);
|
115 |
-
expect( productImage.getAttribute( 'src' ) ).toBe(
|
116 |
-
productWithImages.images[ 0 ].src
|
117 |
-
);
|
118 |
-
|
119 |
-
const anchor = productImage.closest( 'a' );
|
120 |
-
expect( anchor ).toBe( null );
|
121 |
-
} );
|
122 |
-
|
123 |
-
test( 'should render the placeholder image without an anchor wrapper', () => {
|
124 |
-
const component = render(
|
125 |
-
<ProductDataContextProvider product={ productWithoutImages }>
|
126 |
-
<Block productLink={ false } />
|
127 |
-
</ProductDataContextProvider>
|
128 |
-
);
|
129 |
-
|
130 |
-
const placeholderImage = component.getByAltText( '' );
|
131 |
-
expect( placeholderImage.getAttribute( 'src' ) ).toBe(
|
132 |
-
'placeholder.jpg'
|
133 |
-
);
|
134 |
-
|
135 |
-
const anchor = placeholderImage.closest( 'a' );
|
136 |
-
expect( anchor ).toBe( null );
|
137 |
-
} );
|
138 |
-
} );
|
139 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/atomic/blocks/product-elements/price/block.js
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
import ProductPrice from '@woocommerce/base-components/product-price';
|
7 |
-
import { getCurrencyFromPriceResponse } from '@woocommerce/
|
8 |
import {
|
9 |
useInnerBlockLayoutContext,
|
10 |
useProductDataContext,
|
@@ -27,6 +27,7 @@ import { withProductDataContext } from '@woocommerce/shared-hocs';
|
|
27 |
* @param {string} [props.customColor] Normal Price custom text color.
|
28 |
* @param {string} [props.saleColor] Original Price text color.
|
29 |
* @param {string} [props.customSaleColor] Original Price custom text color.
|
|
|
30 |
* context will be used if this is not provided.
|
31 |
* @return {*} The component.
|
32 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
import ProductPrice from '@woocommerce/base-components/product-price';
|
7 |
+
import { getCurrencyFromPriceResponse } from '@woocommerce/base-utils';
|
8 |
import {
|
9 |
useInnerBlockLayoutContext,
|
10 |
useProductDataContext,
|
27 |
* @param {string} [props.customColor] Normal Price custom text color.
|
28 |
* @param {string} [props.saleColor] Original Price text color.
|
29 |
* @param {string} [props.customSaleColor] Original Price custom text color.
|
30 |
+
* @param {Object} [props.product] Optional product object. Product from
|
31 |
* context will be used if this is not provided.
|
32 |
* @return {*} The component.
|
33 |
*/
|
assets/js/atomic/blocks/product-elements/rating/block.js
CHANGED
@@ -36,7 +36,6 @@ const Block = ( { className } ) => {
|
|
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 |
);
|
@@ -45,6 +44,7 @@ const Block = ( { className } ) => {
|
|
45 |
<div
|
46 |
className={ classnames(
|
47 |
className,
|
|
|
48 |
'wc-block-components-product-rating',
|
49 |
{
|
50 |
[ `${ parentClassName }__product-rating` ]: parentClassName,
|
36 |
};
|
37 |
|
38 |
const ratingText = sprintf(
|
|
|
39 |
__( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
|
40 |
rating
|
41 |
);
|
44 |
<div
|
45 |
className={ classnames(
|
46 |
className,
|
47 |
+
'star-rating',
|
48 |
'wc-block-components-product-rating',
|
49 |
{
|
50 |
[ `${ parentClassName }__product-rating` ]: parentClassName,
|
assets/js/atomic/blocks/product-elements/shared/editor.scss
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
}
|
4 |
.wc-atomic-blocks-product__edit-card {
|
5 |
padding: 16px;
|
6 |
-
border-top: 1px solid
|
7 |
|
8 |
.wc-atomic-blocks-product__edit-card-title {
|
9 |
margin: 0 0 $gap;
|
3 |
}
|
4 |
.wc-atomic-blocks-product__edit-card {
|
5 |
padding: 16px;
|
6 |
+
border-top: 1px solid #e2e4e7;
|
7 |
|
8 |
.wc-atomic-blocks-product__edit-card-title {
|
9 |
margin: 0 0 $gap;
|
assets/js/atomic/blocks/product-elements/shared/with-product-selector.js
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { useState } from '@wordpress/element';
|
6 |
import ProductControl from '@woocommerce/editor-components/product-control';
|
7 |
-
import { Placeholder, Button,
|
8 |
import { BlockControls } from '@wordpress/block-editor';
|
9 |
import TextToolbarButton from '@woocommerce/editor-components/text-toolbar-button';
|
10 |
import { useProductDataContext } from '@woocommerce/shared-context';
|
@@ -55,7 +55,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
|
|
55 |
} }
|
56 |
/>
|
57 |
<Button
|
58 |
-
|
59 |
disabled={ ! productId }
|
60 |
onClick={ () => {
|
61 |
setIsEditing( false );
|
@@ -68,7 +68,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
|
|
68 |
) : (
|
69 |
<>
|
70 |
<BlockControls>
|
71 |
-
<
|
72 |
<TextToolbarButton
|
73 |
onClick={ () => setIsEditing( true ) }
|
74 |
>
|
@@ -77,7 +77,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
|
|
77 |
'woo-gutenberg-products-block'
|
78 |
) }
|
79 |
</TextToolbarButton>
|
80 |
-
</
|
81 |
</BlockControls>
|
82 |
<OriginalComponent { ...props } />
|
83 |
</>
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { useState } from '@wordpress/element';
|
6 |
import ProductControl from '@woocommerce/editor-components/product-control';
|
7 |
+
import { Placeholder, Button, Toolbar } from '@wordpress/components';
|
8 |
import { BlockControls } from '@wordpress/block-editor';
|
9 |
import TextToolbarButton from '@woocommerce/editor-components/text-toolbar-button';
|
10 |
import { useProductDataContext } from '@woocommerce/shared-context';
|
55 |
} }
|
56 |
/>
|
57 |
<Button
|
58 |
+
isDefault
|
59 |
disabled={ ! productId }
|
60 |
onClick={ () => {
|
61 |
setIsEditing( false );
|
68 |
) : (
|
69 |
<>
|
70 |
<BlockControls>
|
71 |
+
<Toolbar>
|
72 |
<TextToolbarButton
|
73 |
onClick={ () => setIsEditing( true ) }
|
74 |
>
|
77 |
'woo-gutenberg-products-block'
|
78 |
) }
|
79 |
</TextToolbarButton>
|
80 |
+
</Toolbar>
|
81 |
</BlockControls>
|
82 |
<OriginalComponent { ...props } />
|
83 |
</>
|
assets/js/atomic/blocks/product-elements/stock-indicator/style.scss
CHANGED
@@ -5,13 +5,13 @@
|
|
5 |
@include font-size(small);
|
6 |
|
7 |
&--in-stock {
|
8 |
-
color: $
|
9 |
}
|
10 |
&--out-of-stock {
|
11 |
-
color: $
|
12 |
}
|
13 |
&--low-stock,
|
14 |
&--available-on-backorder {
|
15 |
-
color: $
|
16 |
}
|
17 |
}
|
5 |
@include font-size(small);
|
6 |
|
7 |
&--in-stock {
|
8 |
+
color: $valid-green;
|
9 |
}
|
10 |
&--out-of-stock {
|
11 |
+
color: $error-red;
|
12 |
}
|
13 |
&--low-stock,
|
14 |
&--available-on-backorder {
|
15 |
+
color: $notice-yellow;
|
16 |
}
|
17 |
}
|
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
@@ -3,6 +3,7 @@
|
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
|
|
6 |
import {
|
7 |
useInnerBlockLayoutContext,
|
8 |
useProductDataContext,
|
@@ -11,8 +12,6 @@ import { getColorClassName, getFontSizeClass } from '@wordpress/block-editor';
|
|
11 |
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
|
@@ -31,6 +30,7 @@ import './style.scss';
|
|
31 |
* @param {string} [props.customColor] Custom title color value.
|
32 |
* @param {string} [props.fontSize] Title font size name.
|
33 |
* @param {number } [props.customFontSize] Custom font size value.
|
|
|
34 |
* will be used if this is not provided.
|
35 |
* @return {*} The component.
|
36 |
*/
|
@@ -46,7 +46,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 );
|
@@ -81,6 +80,8 @@ export const Block = ( {
|
|
81 |
);
|
82 |
}
|
83 |
|
|
|
|
|
84 |
return (
|
85 |
// @ts-ignore
|
86 |
<TagName
|
@@ -94,24 +95,33 @@ export const Block = ( {
|
|
94 |
}
|
95 |
) }
|
96 |
>
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
</TagName>
|
116 |
);
|
117 |
};
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
import classnames from 'classnames';
|
6 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
7 |
import {
|
8 |
useInnerBlockLayoutContext,
|
9 |
useProductDataContext,
|
12 |
import { isFeaturePluginBuild } from '@woocommerce/block-settings';
|
13 |
import { gatedStyledText } from '@woocommerce/atomic-utils';
|
14 |
import { withProductDataContext } from '@woocommerce/shared-hocs';
|
|
|
|
|
15 |
|
16 |
/**
|
17 |
* Internal dependencies
|
30 |
* @param {string} [props.customColor] Custom title color value.
|
31 |
* @param {string} [props.fontSize] Title font size name.
|
32 |
* @param {number } [props.customFontSize] Custom font size value.
|
33 |
+
* @param {Object} [props.product] Optional product object. Product from context
|
34 |
* will be used if this is not provided.
|
35 |
* @return {*} The component.
|
36 |
*/
|
46 |
} ) => {
|
47 |
const { parentClassName } = useInnerBlockLayoutContext();
|
48 |
const { product } = useProductDataContext();
|
|
|
49 |
const TagName = `h${ headingLevel }`;
|
50 |
|
51 |
const colorClass = getColorClassName( 'color', color );
|
80 |
);
|
81 |
}
|
82 |
|
83 |
+
const productName = decodeEntities( product.name );
|
84 |
+
|
85 |
return (
|
86 |
// @ts-ignore
|
87 |
<TagName
|
95 |
}
|
96 |
) }
|
97 |
>
|
98 |
+
{ productLink ? (
|
99 |
+
<a
|
100 |
+
href={ product.permalink }
|
101 |
+
rel="nofollow"
|
102 |
+
className={ classnames( {
|
103 |
+
[ titleClasses ]: isFeaturePluginBuild(),
|
104 |
+
} ) }
|
105 |
+
style={ gatedStyledText( {
|
106 |
+
color: customColor,
|
107 |
+
fontSize: customFontSize,
|
108 |
+
} ) }
|
109 |
+
>
|
110 |
+
{ productName }
|
111 |
+
</a>
|
112 |
+
) : (
|
113 |
+
<span
|
114 |
+
className={ classnames( {
|
115 |
+
[ titleClasses ]: isFeaturePluginBuild(),
|
116 |
+
} ) }
|
117 |
+
style={ gatedStyledText( {
|
118 |
+
color: customColor,
|
119 |
+
fontSize: customFontSize,
|
120 |
+
} ) }
|
121 |
+
>
|
122 |
+
{ productName }
|
123 |
+
</span>
|
124 |
+
) }
|
125 |
</TagName>
|
126 |
);
|
127 |
};
|
assets/js/atomic/blocks/product-elements/title/frontend.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
|
|
4 |
import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
|
5 |
|
6 |
/**
|
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
|
|
9 |
import Block from './block';
|
10 |
import attributes from './attributes';
|
11 |
|
12 |
-
export default withFilteredAttributes( attributes )( Block );
|
1 |
/**
|
2 |
* External dependencies
|
3 |
*/
|
4 |
+
import { compose } from '@wordpress/compose';
|
5 |
import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
|
6 |
|
7 |
/**
|
10 |
import Block from './block';
|
11 |
import attributes from './attributes';
|
12 |
|
13 |
+
export default compose( withFilteredAttributes( attributes ) )( Block );
|
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
@@ -2,7 +2,7 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
-
import { Component } from 'react';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
@@ -20,10 +20,10 @@ class BlockErrorBoundary extends Component {
|
|
20 |
) {
|
21 |
return {
|
22 |
errorMessage: (
|
23 |
-
|
24 |
<strong>{ error.status }</strong>:
|
25 |
{ error.statusText }
|
26 |
-
|
27 |
),
|
28 |
hasError: true,
|
29 |
};
|
@@ -39,15 +39,10 @@ class BlockErrorBoundary extends Component {
|
|
39 |
showErrorMessage,
|
40 |
text,
|
41 |
errorMessagePrefix,
|
42 |
-
renderError,
|
43 |
-
button,
|
44 |
} = this.props;
|
45 |
const { errorMessage, hasError } = this.state;
|
46 |
|
47 |
if ( hasError ) {
|
48 |
-
if ( typeof renderError === 'function' ) {
|
49 |
-
return renderError( { errorMessage } );
|
50 |
-
}
|
51 |
return (
|
52 |
<BlockError
|
53 |
errorMessage={ showErrorMessage ? errorMessage : null }
|
@@ -55,7 +50,6 @@ class BlockErrorBoundary extends Component {
|
|
55 |
imageUrl={ imageUrl }
|
56 |
text={ text }
|
57 |
errorMessagePrefix={ errorMessagePrefix }
|
58 |
-
button={ button }
|
59 |
/>
|
60 |
);
|
61 |
}
|
@@ -91,10 +85,6 @@ BlockErrorBoundary.propTypes = {
|
|
91 |
* Text preceeding the error message.
|
92 |
*/
|
93 |
errorMessagePrefix: PropTypes.string,
|
94 |
-
/**
|
95 |
-
* Render function to show a custom error component.
|
96 |
-
*/
|
97 |
-
renderError: PropTypes.func,
|
98 |
};
|
99 |
|
100 |
BlockErrorBoundary.defaultProps = {
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
+
import { Component, Fragment } from 'react';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
20 |
) {
|
21 |
return {
|
22 |
errorMessage: (
|
23 |
+
<Fragment>
|
24 |
<strong>{ error.status }</strong>:
|
25 |
{ error.statusText }
|
26 |
+
</Fragment>
|
27 |
),
|
28 |
hasError: true,
|
29 |
};
|
39 |
showErrorMessage,
|
40 |
text,
|
41 |
errorMessagePrefix,
|
|
|
|
|
42 |
} = this.props;
|
43 |
const { errorMessage, hasError } = this.state;
|
44 |
|
45 |
if ( hasError ) {
|
|
|
|
|
|
|
46 |
return (
|
47 |
<BlockError
|
48 |
errorMessage={ showErrorMessage ? errorMessage : null }
|
50 |
imageUrl={ imageUrl }
|
51 |
text={ text }
|
52 |
errorMessagePrefix={ errorMessagePrefix }
|
|
|
53 |
/>
|
54 |
);
|
55 |
}
|
85 |
* Text preceeding the error message.
|
86 |
*/
|
87 |
errorMessagePrefix: PropTypes.string,
|
|
|
|
|
|
|
|
|
88 |
};
|
89 |
|
90 |
BlockErrorBoundary.defaultProps = {
|
assets/js/base/components/block-error-boundary/style.scss
CHANGED
@@ -1,34 +1,36 @@
|
|
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: #f3f3f4;
|
4 |
+
border-left: 4px solid #6d6d6d;
|
5 |
+
padding: $gap-larger $gap;
|
6 |
align-items: center;
|
7 |
justify-content: center;
|
8 |
flex-direction: column;
|
|
|
|
|
9 |
}
|
10 |
+
|
11 |
.wc-block-components-error__header {
|
12 |
@include font-size(larger);
|
13 |
+
font-weight: bold;
|
14 |
margin: 0;
|
|
|
15 |
}
|
16 |
+
|
17 |
.wc-block-components-error__image {
|
18 |
+
max-width: 25%;
|
|
|
19 |
}
|
20 |
.wc-block-components-error__text {
|
21 |
+
margin: 0;
|
|
|
|
|
|
|
22 |
}
|
23 |
.wc-block-components-error__message {
|
24 |
+
margin: 1em 0 0 0;
|
25 |
font-style: italic;
|
|
|
|
|
26 |
}
|
27 |
+
|
28 |
+
@include breakpoint( ">480px" ) {
|
29 |
+
.wc-block-components-error {
|
30 |
+
flex-direction: row;
|
31 |
+
}
|
32 |
+
|
33 |
+
.wc-block-components-error__image + .wc-block-components-error__content {
|
34 |
+
margin-left: $gap-large;
|
35 |
+
}
|
36 |
}
|
assets/js/base/components/button/{index.tsx → index.js}
RENAMED
@@ -2,31 +2,18 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { Button as WPButton } from 'wordpress-components';
|
5 |
-
import
|
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,
|
@@ -37,7 +24,12 @@ const Button = ( {
|
|
37 |
|
38 |
return (
|
39 |
<WPButton className={ buttonClassName } { ...props }>
|
40 |
-
{ showSpinner &&
|
|
|
|
|
|
|
|
|
|
|
41 |
<span className="wc-block-components-button__text">
|
42 |
{ children }
|
43 |
</span>
|
@@ -45,4 +37,10 @@ const Button = ( {
|
|
45 |
);
|
46 |
};
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
export default Button;
|
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 |
/**
|
14 |
+
* Component that visually renders a button but semantically might be `<button>` or `<a>` depending on the props.
|
|
|
15 |
*/
|
16 |
+
const Button = ( { className, showSpinner = false, children, ...props } ) => {
|
|
|
|
|
|
|
|
|
|
|
17 |
const buttonClassName = classNames(
|
18 |
'wc-block-components-button',
|
19 |
className,
|
24 |
|
25 |
return (
|
26 |
<WPButton className={ buttonClassName } { ...props }>
|
27 |
+
{ showSpinner && (
|
28 |
+
<span
|
29 |
+
className="wc-block-components-button__spinner"
|
30 |
+
aria-hidden="true"
|
31 |
+
/>
|
32 |
+
) }
|
33 |
<span className="wc-block-components-button__text">
|
34 |
{ children }
|
35 |
</span>
|
37 |
);
|
38 |
};
|
39 |
|
40 |
+
Button.propTypes = {
|
41 |
+
className: PropTypes.string,
|
42 |
+
showSpinner: PropTypes.bool,
|
43 |
+
children: PropTypes.node,
|
44 |
+
};
|
45 |
+
|
46 |
export default Button;
|
assets/js/base/components/button/style.scss
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
.wc-block-components-button:not(.is-link) {
|
2 |
@include reset-typography();
|
3 |
align-items: center;
|
4 |
-
background-color: $
|
5 |
color: $white;
|
6 |
display: inline-flex;
|
7 |
font-weight: bold;
|
@@ -18,7 +18,7 @@
|
|
18 |
&:hover,
|
19 |
&:focus,
|
20 |
&:active {
|
21 |
-
background-color: $
|
22 |
color: $white;
|
23 |
}
|
24 |
|
@@ -29,7 +29,45 @@
|
|
29 |
fill: currentColor;
|
30 |
}
|
31 |
}
|
32 |
-
.wc-block-components-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
visibility: hidden;
|
34 |
}
|
35 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
.wc-block-components-button:not(.is-link) {
|
2 |
@include reset-typography();
|
3 |
align-items: center;
|
4 |
+
background-color: $black;
|
5 |
color: $white;
|
6 |
display: inline-flex;
|
7 |
font-weight: bold;
|
18 |
&:hover,
|
19 |
&:focus,
|
20 |
&:active {
|
21 |
+
background-color: $black;
|
22 |
color: $white;
|
23 |
}
|
24 |
|
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/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: __( 'State', 'woo-gutenberg-products-block' ),
|
202 |
+
optionalLabel: __(
|
203 |
+
'State (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/{address-form.tsx → index.js}
RENAMED
@@ -2,7 +2,7 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
-
import {
|
6 |
import {
|
7 |
BillingCountryInput,
|
8 |
ShippingCountryInput,
|
@@ -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,75 +50,48 @@ 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 |
-
*
|
72 |
-
* @param {Object} props Incoming props for component.
|
73 |
-
* @param {string} props.id Id for component.
|
74 |
-
* @param {Array} props.fields Array of fields in form.
|
75 |
-
* @param {Object} props.fieldConfig Field configuration for fields in form.
|
76 |
-
* @param {string} props.instanceId Unique id for form.
|
77 |
-
* @param {function(any):any} props.onChange Function to all for an form onChange event.
|
78 |
-
* @param {string} props.type Type of form.
|
79 |
-
* @param {Object} props.values Values for fields.
|
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 |
}
|
125 |
}, [
|
126 |
values,
|
127 |
-
countryValidationError
|
128 |
-
countryValidationError.hidden,
|
129 |
setValidationErrors,
|
130 |
clearValidationError,
|
131 |
type,
|
@@ -135,7 +101,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 |
}
|
@@ -206,7 +172,7 @@ const AddressForm = ( {
|
|
206 |
}
|
207 |
|
208 |
return (
|
209 |
-
<
|
210 |
key={ field.key }
|
211 |
id={ `${ id }-${ field.key }` }
|
212 |
className={ `wc-block-components-address-form__${ field.key }` }
|
@@ -216,7 +182,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,
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import PropTypes from 'prop-types';
|
5 |
+
import { DebouncedValidatedTextInput } from '@woocommerce/base-components/text-input';
|
6 |
import {
|
7 |
BillingCountryInput,
|
8 |
ShippingCountryInput,
|
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 |
*/
|
56 |
const AddressForm = ( {
|
57 |
id,
|
58 |
+
fields = Object.keys( defaultAddressFields ),
|
59 |
+
fieldConfig = {},
|
|
|
|
|
60 |
instanceId,
|
61 |
onChange,
|
62 |
type = 'shipping',
|
63 |
values,
|
64 |
+
} ) => {
|
65 |
const {
|
66 |
getValidationError,
|
67 |
setValidationErrors,
|
68 |
clearValidationError,
|
69 |
} = useValidationContext();
|
70 |
+
const countryLocale = countryAddressFields[ values.country ] || {};
|
71 |
+
const addressFields = fields.map( ( field ) => ( {
|
72 |
+
key: field,
|
73 |
+
...defaultAddressFields[ field ],
|
74 |
+
...countryLocale[ field ],
|
75 |
+
...fieldConfig[ field ],
|
76 |
+
} ) );
|
77 |
+
const sortedAddressFields = addressFields.sort(
|
78 |
+
( a, b ) => a.index - b.index
|
79 |
+
);
|
80 |
+
const countryValidationError =
|
81 |
+
getValidationError( 'shipping-missing-country' ) || {};
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
useEffect( () => {
|
83 |
if ( type === 'shipping' ) {
|
84 |
validateShippingCountry(
|
85 |
values,
|
86 |
setValidationErrors,
|
87 |
clearValidationError,
|
88 |
+
countryValidationError.message &&
|
89 |
! countryValidationError.hidden
|
90 |
);
|
91 |
}
|
92 |
}, [
|
93 |
values,
|
94 |
+
countryValidationError,
|
|
|
95 |
setValidationErrors,
|
96 |
clearValidationError,
|
97 |
type,
|
101 |
|
102 |
return (
|
103 |
<div id={ id } className="wc-block-components-address-form">
|
104 |
+
{ sortedAddressFields.map( ( field ) => {
|
105 |
if ( field.hidden ) {
|
106 |
return null;
|
107 |
}
|
172 |
}
|
173 |
|
174 |
return (
|
175 |
+
<DebouncedValidatedTextInput
|
176 |
key={ field.key }
|
177 |
id={ `${ id }-${ field.key }` }
|
178 |
className={ `wc-block-components-address-form__${ field.key }` }
|
182 |
value={ values[ field.key ] }
|
183 |
autoCapitalize={ field.autocapitalize }
|
184 |
autoComplete={ field.autocomplete }
|
185 |
+
onChange={ ( newValue ) =>
|
186 |
onChange( {
|
187 |
...values,
|
188 |
[ field.key ]: newValue,
|
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
DELETED
@@ -1,178 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
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
|
11 |
-
*/
|
12 |
-
import AddressForm from '../address-form';
|
13 |
-
|
14 |
-
const renderInCheckoutProvider = ( ui, options = {} ) => {
|
15 |
-
const Wrapper = ( { children } ) => {
|
16 |
-
return <CheckoutProvider>{ children }</CheckoutProvider>;
|
17 |
-
};
|
18 |
-
return render( ui, { wrapper: Wrapper, ...options } );
|
19 |
-
};
|
20 |
-
|
21 |
-
// Countries used in testing addresses must be in the wcSettings global.
|
22 |
-
// See: tests/js/setup-globals.js
|
23 |
-
const primaryAddress = {
|
24 |
-
country: 'United Kingdom (UK)',
|
25 |
-
countryKey: 'GB',
|
26 |
-
city: 'London',
|
27 |
-
state: 'Greater London',
|
28 |
-
postcode: 'ABCD',
|
29 |
-
};
|
30 |
-
const secondaryAddress = {
|
31 |
-
country: 'Austria', // We use Austria because it doesn't have states.
|
32 |
-
countryKey: 'AU',
|
33 |
-
city: 'Vienna',
|
34 |
-
postcode: 'DCBA',
|
35 |
-
};
|
36 |
-
const tertiaryAddress = {
|
37 |
-
country: 'Canada', // We use Canada because it has a select for the state.
|
38 |
-
countryKey: 'CA',
|
39 |
-
city: 'Toronto',
|
40 |
-
state: 'Ontario',
|
41 |
-
postcode: 'EFGH',
|
42 |
-
};
|
43 |
-
|
44 |
-
const countryRegExp = /country/i;
|
45 |
-
const cityRegExp = /city/i;
|
46 |
-
const stateRegExp = /county|province|state/i;
|
47 |
-
const postalCodeRegExp = /postal code|postcode|zip/i;
|
48 |
-
|
49 |
-
const inputAddress = ( {
|
50 |
-
country = null,
|
51 |
-
city = null,
|
52 |
-
state = null,
|
53 |
-
postcode = null,
|
54 |
-
} ) => {
|
55 |
-
if ( country ) {
|
56 |
-
const countryButton = screen.getByRole( 'button', {
|
57 |
-
name: countryRegExp,
|
58 |
-
} );
|
59 |
-
userEvent.click( countryButton );
|
60 |
-
userEvent.click( screen.getByRole( 'option', { name: country } ) );
|
61 |
-
}
|
62 |
-
if ( city ) {
|
63 |
-
const cityInput = screen.getByLabelText( cityRegExp );
|
64 |
-
userEvent.type( cityInput, city );
|
65 |
-
}
|
66 |
-
if ( state ) {
|
67 |
-
const stateButton = screen.queryByRole( 'button', {
|
68 |
-
name: stateRegExp,
|
69 |
-
} );
|
70 |
-
// State input might be a select or a text input.
|
71 |
-
if ( stateButton ) {
|
72 |
-
userEvent.click( stateButton );
|
73 |
-
userEvent.click( screen.getByRole( 'option', { name: state } ) );
|
74 |
-
} else {
|
75 |
-
const stateInput = screen.getByLabelText( stateRegExp );
|
76 |
-
userEvent.type( stateInput, state );
|
77 |
-
}
|
78 |
-
}
|
79 |
-
if ( postcode ) {
|
80 |
-
const postcodeInput = screen.getByLabelText( postalCodeRegExp );
|
81 |
-
userEvent.type( postcodeInput, postcode );
|
82 |
-
}
|
83 |
-
};
|
84 |
-
|
85 |
-
describe( 'AddressForm Component', () => {
|
86 |
-
const WrappedAddressForm = ( { type } ) => {
|
87 |
-
const {
|
88 |
-
defaultAddressFields,
|
89 |
-
setShippingFields,
|
90 |
-
shippingFields,
|
91 |
-
} = useCheckoutAddress();
|
92 |
-
|
93 |
-
return (
|
94 |
-
<AddressForm
|
95 |
-
type={ type }
|
96 |
-
onChange={ setShippingFields }
|
97 |
-
values={ shippingFields }
|
98 |
-
fields={ Object.keys( defaultAddressFields ) }
|
99 |
-
/>
|
100 |
-
);
|
101 |
-
};
|
102 |
-
const ShippingFields = () => {
|
103 |
-
const { shippingFields } = useCheckoutAddress();
|
104 |
-
|
105 |
-
return (
|
106 |
-
<ul>
|
107 |
-
{ Object.keys( shippingFields ).map( ( key ) => (
|
108 |
-
<li key={ key }>{ key + ': ' + shippingFields[ key ] }</li>
|
109 |
-
) ) }
|
110 |
-
</ul>
|
111 |
-
);
|
112 |
-
};
|
113 |
-
|
114 |
-
it( 'updates context value when interacting with form elements', () => {
|
115 |
-
renderInCheckoutProvider(
|
116 |
-
<>
|
117 |
-
<WrappedAddressForm type="shipping" />
|
118 |
-
<ShippingFields />
|
119 |
-
</>
|
120 |
-
);
|
121 |
-
|
122 |
-
inputAddress( primaryAddress );
|
123 |
-
|
124 |
-
expect( screen.getByText( /country/ ) ).toHaveTextContent(
|
125 |
-
`country: ${ primaryAddress.countryKey }`
|
126 |
-
);
|
127 |
-
expect( screen.getByText( /city/ ) ).toHaveTextContent(
|
128 |
-
`city: ${ primaryAddress.city }`
|
129 |
-
);
|
130 |
-
expect( screen.getByText( /state/ ) ).toHaveTextContent(
|
131 |
-
`state: ${ primaryAddress.state }`
|
132 |
-
);
|
133 |
-
expect( screen.getByText( /postcode/ ) ).toHaveTextContent(
|
134 |
-
`postcode: ${ primaryAddress.postcode }`
|
135 |
-
);
|
136 |
-
} );
|
137 |
-
|
138 |
-
it( 'input fields update when changing the country', () => {
|
139 |
-
renderInCheckoutProvider( <WrappedAddressForm type="shipping" /> );
|
140 |
-
|
141 |
-
inputAddress( primaryAddress );
|
142 |
-
|
143 |
-
// Verify correct labels are used.
|
144 |
-
expect( screen.getByLabelText( /City/ ) ).toBeInTheDocument();
|
145 |
-
expect( screen.getByLabelText( /County/ ) ).toBeInTheDocument();
|
146 |
-
expect( screen.getByLabelText( /Postcode/ ) ).toBeInTheDocument();
|
147 |
-
|
148 |
-
inputAddress( secondaryAddress );
|
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 |
-
} );
|
158 |
-
|
159 |
-
it( 'input values are reset after changing the country', () => {
|
160 |
-
renderInCheckoutProvider( <WrappedAddressForm type="shipping" /> );
|
161 |
-
|
162 |
-
inputAddress( secondaryAddress );
|
163 |
-
// Only update `country` to verify other values are reset.
|
164 |
-
inputAddress( { country: primaryAddress.country } );
|
165 |
-
|
166 |
-
expect( screen.getByLabelText( cityRegExp ).value ).toBe( '' );
|
167 |
-
expect( screen.getByLabelText( stateRegExp ).value ).toBe( '' );
|
168 |
-
expect( screen.getByLabelText( postalCodeRegExp ).value ).toBe( '' );
|
169 |
-
|
170 |
-
// Repeat the test with an address which has a select for the state.
|
171 |
-
inputAddress( tertiaryAddress );
|
172 |
-
inputAddress( { country: primaryAddress.country } );
|
173 |
-
|
174 |
-
expect( screen.getByLabelText( cityRegExp ).value ).toBe( '' );
|
175 |
-
expect( screen.getByLabelText( stateRegExp ).value ).toBe( '' );
|
176 |
-
expect( screen.getByLabelText( postalCodeRegExp ).value ).toBe( '' );
|
177 |
-
} );
|
178 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/form-step/index.js
CHANGED
@@ -49,7 +49,6 @@ const FormStep = ( {
|
|
49 |
'wc-block-components-checkout-step',
|
50 |
{
|
51 |
'wc-block-components-checkout-step--with-step-number': showStepNumber,
|
52 |
-
'wc-block-components-checkout-step--disabled': disabled,
|
53 |
}
|
54 |
) }
|
55 |
id={ id }
|
49 |
'wc-block-components-checkout-step',
|
50 |
{
|
51 |
'wc-block-components-checkout-step--with-step-number': showStepNumber,
|
|
|
52 |
}
|
53 |
) }
|
54 |
id={ id }
|
assets/js/base/components/cart-checkout/form-step/style.scss
CHANGED
@@ -12,20 +12,6 @@
|
|
12 |
.is-large & {
|
13 |
padding-right: $gap-large;
|
14 |
}
|
15 |
-
|
16 |
-
.wc-block-components-checkout-step__heading::after {
|
17 |
-
content: "";
|
18 |
-
border-left: 1px solid;
|
19 |
-
opacity: 0.3;
|
20 |
-
position: absolute;
|
21 |
-
left: -$gap-larger/2;
|
22 |
-
top: 2.5em;
|
23 |
-
bottom: em($gap) * -1;
|
24 |
-
}
|
25 |
-
}
|
26 |
-
|
27 |
-
.wc-block-components-checkout-step--disabled {
|
28 |
-
opacity: 0.6;
|
29 |
}
|
30 |
|
31 |
.wc-block-components-checkout-step__container {
|
@@ -36,6 +22,10 @@
|
|
36 |
padding-bottom: em($gap-large);
|
37 |
}
|
38 |
|
|
|
|
|
|
|
|
|
39 |
.wc-block-components-checkout-step__heading {
|
40 |
display: flex;
|
41 |
justify-content: space-between;
|
@@ -43,8 +33,6 @@
|
|
43 |
flex-wrap: wrap;
|
44 |
margin: em($gap-small) 0 em($gap);
|
45 |
position: relative;
|
46 |
-
align-items: center;
|
47 |
-
gap: em($gap);
|
48 |
}
|
49 |
|
50 |
.wc-block-components-checkout-step:first-child .wc-block-components-checkout-step__heading {
|
@@ -57,6 +45,8 @@
|
|
57 |
|
58 |
.wc-block-components-checkout-step__heading-content {
|
59 |
@include font-size(smaller);
|
|
|
|
|
60 |
|
61 |
a {
|
62 |
font-weight: bold;
|
@@ -94,4 +84,8 @@
|
|
94 |
left: -$gap-larger/2;
|
95 |
top: 0;
|
96 |
}
|
|
|
|
|
|
|
|
|
97 |
}
|
12 |
.is-large & {
|
13 |
padding-right: $gap-large;
|
14 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
}
|
16 |
|
17 |
.wc-block-components-checkout-step__container {
|
22 |
padding-bottom: em($gap-large);
|
23 |
}
|
24 |
|
25 |
+
.wc-block-components-form .wc-block-components-checkout-step:disabled {
|
26 |
+
opacity: 0.6;
|
27 |
+
}
|
28 |
+
|
29 |
.wc-block-components-checkout-step__heading {
|
30 |
display: flex;
|
31 |
justify-content: space-between;
|
33 |
flex-wrap: wrap;
|
34 |
margin: em($gap-small) 0 em($gap);
|
35 |
position: relative;
|
|
|
|
|
36 |
}
|
37 |
|
38 |
.wc-block-components-checkout-step:first-child .wc-block-components-checkout-step__heading {
|
45 |
|
46 |
.wc-block-components-checkout-step__heading-content {
|
47 |
@include font-size(smaller);
|
48 |
+
position: absolute;
|
49 |
+
right: 0;
|
50 |
|
51 |
a {
|
52 |
font-weight: bold;
|
84 |
left: -$gap-larger/2;
|
85 |
top: 0;
|
86 |
}
|
87 |
+
|
88 |
+
&:last-of-type .wc-block-components-checkout-step__container::after {
|
89 |
+
content: none;
|
90 |
+
}
|
91 |
}
|
assets/js/base/components/cart-checkout/form-step/test/__snapshots__/index.js.snap
CHANGED
@@ -231,7 +231,7 @@ exports[`FormStep should render step heading content 1`] = `
|
|
231 |
|
232 |
exports[`FormStep should set disabled prop to the fieldset element when disabled is true 1`] = `
|
233 |
<fieldset
|
234 |
-
className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number
|
235 |
disabled={true}
|
236 |
>
|
237 |
<legend
|
231 |
|
232 |
exports[`FormStep should set disabled prop to the fieldset element when disabled is true 1`] = `
|
233 |
<fieldset
|
234 |
+
className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
|
235 |
disabled={true}
|
236 |
>
|
237 |
<legend
|
assets/js/base/components/cart-checkout/index.js
CHANGED
@@ -1,20 +1,20 @@
|
|
1 |
-
export
|
2 |
export { default as FormStep } from './form-step';
|
3 |
export { default as OrderSummary } from './order-summary';
|
4 |
export { default as PlaceOrderButton } from './place-order-button';
|
5 |
export { default as Policies } from './policies';
|
6 |
export { default as ProductBackorderBadge } from './product-backorder-badge';
|
7 |
-
export { default as ProductDetails } from './product-details';
|
8 |
export { default as ProductImage } from './product-image';
|
9 |
export { default as ProductLowStockBadge } from './product-low-stock-badge';
|
10 |
export { default as ProductSummary } from './product-summary';
|
11 |
export { default as ProductMetadata } from './product-metadata';
|
|
|
12 |
export { default as ProductSaleBadge } from './product-sale-badge';
|
|
|
13 |
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';
|
1 |
+
export { default as AddressForm } from './address-form';
|
2 |
export { default as FormStep } from './form-step';
|
3 |
export { default as OrderSummary } from './order-summary';
|
4 |
export { default as PlaceOrderButton } from './place-order-button';
|
5 |
export { default as Policies } from './policies';
|
6 |
export { default as ProductBackorderBadge } from './product-backorder-badge';
|
|
|
7 |
export { default as ProductImage } from './product-image';
|
8 |
export { default as ProductLowStockBadge } from './product-low-stock-badge';
|
9 |
export { default as ProductSummary } from './product-summary';
|
10 |
export { default as ProductMetadata } from './product-metadata';
|
11 |
+
export { default as ProductName } from './product-name';
|
12 |
export { default as ProductSaleBadge } from './product-sale-badge';
|
13 |
+
export { default as ProductVariationData } from './product-variation-data';
|
14 |
export { default as ReturnToCartButton } from './return-to-cart-button';
|
15 |
export { default as ShippingCalculator } from './shipping-calculator';
|
16 |
export { default as ShippingLocation } from './shipping-location';
|
17 |
export { default as ShippingRatesControl } from './shipping-rates-control';
|
|
|
18 |
export { default as PaymentMethodIcons } from './payment-method-icons';
|
19 |
export { default as PaymentMethodLabel } from './payment-method-label';
|
20 |
+
export * from './totals/index.js';
|
assets/js/base/components/cart-checkout/order-summary/index.js
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import PropTypes from 'prop-types';
|
6 |
import { useContainerWidthContext } from '@woocommerce/base-context';
|
7 |
-
import
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
@@ -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' ) }
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import PropTypes from 'prop-types';
|
6 |
import { useContainerWidthContext } from '@woocommerce/base-context';
|
7 |
+
import Panel from '@woocommerce/base-components/panel';
|
8 |
|
9 |
/**
|
10 |
* Internal dependencies
|
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
@@ -2,111 +2,41 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
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 { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
|
9 |
import {
|
10 |
-
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
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
|
21 |
-
*/
|
22 |
-
import ProductBackorderBadge from '../product-backorder-badge';
|
23 |
-
import ProductImage from '../product-image';
|
24 |
-
import ProductLowStockBadge from '../product-low-stock-badge';
|
25 |
-
import ProductMetadata from '../product-metadata';
|
26 |
|
27 |
const OrderSummaryItem = ( { cartItem } ) => {
|
28 |
const {
|
29 |
images,
|
30 |
low_stock_remaining: lowStockRemaining = null,
|
31 |
show_backorder_badge: showBackorderBadge = false,
|
32 |
-
name
|
33 |
permalink,
|
34 |
prices,
|
35 |
quantity,
|
36 |
short_description: shortDescription,
|
37 |
description: fullDescription,
|
38 |
-
item_data: itemData = [],
|
39 |
variation,
|
40 |
-
totals,
|
41 |
-
extensions = {},
|
42 |
} = cartItem;
|
43 |
|
44 |
-
|
45 |
-
|
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( priceCurrency.minorUnit )
|
77 |
-
.getAmount();
|
78 |
-
const priceSingle = Dinero( {
|
79 |
amount: parseInt( prices.raw_prices.price, 10 ),
|
80 |
precision: parseInt( prices.raw_prices.precision, 10 ),
|
81 |
} )
|
82 |
-
.
|
|
|
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">
|
@@ -124,20 +54,14 @@ const OrderSummaryItem = ( { cartItem } ) => {
|
|
124 |
<ProductImage image={ images.length ? images[ 0 ] : {} } />
|
125 |
</div>
|
126 |
<div className="wc-block-components-order-summary-item__description">
|
127 |
-
<
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
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 />
|
143 |
) : (
|
@@ -150,17 +74,9 @@ const OrderSummaryItem = ( { cartItem } ) => {
|
|
150 |
<ProductMetadata
|
151 |
shortDescription={ shortDescription }
|
152 |
fullDescription={ fullDescription }
|
153 |
-
itemData={ itemData }
|
154 |
variation={ variation }
|
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 |
);
|
166 |
};
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __, sprintf } from '@wordpress/i18n';
|
5 |
+
import { getCurrency } from '@woocommerce/base-utils';
|
6 |
import Label from '@woocommerce/base-components/label';
|
7 |
import ProductPrice from '@woocommerce/base-components/product-price';
|
|
|
|
|
8 |
import {
|
9 |
+
ProductBackorderBadge,
|
10 |
+
ProductImage,
|
11 |
+
ProductLowStockBadge,
|
12 |
+
ProductMetadata,
|
13 |
+
ProductName,
|
14 |
+
} from '@woocommerce/base-components/cart-checkout';
|
15 |
import PropTypes from 'prop-types';
|
16 |
import Dinero from 'dinero.js';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
const OrderSummaryItem = ( { cartItem } ) => {
|
19 |
const {
|
20 |
images,
|
21 |
low_stock_remaining: lowStockRemaining = null,
|
22 |
show_backorder_badge: showBackorderBadge = false,
|
23 |
+
name,
|
24 |
permalink,
|
25 |
prices,
|
26 |
quantity,
|
27 |
short_description: shortDescription,
|
28 |
description: fullDescription,
|
|
|
29 |
variation,
|
|
|
|
|
30 |
} = cartItem;
|
31 |
|
32 |
+
const currency = getCurrency( prices );
|
33 |
+
const linePrice = Dinero( {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
amount: parseInt( prices.raw_prices.price, 10 ),
|
35 |
precision: parseInt( prices.raw_prices.precision, 10 ),
|
36 |
} )
|
37 |
+
.multiply( quantity )
|
38 |
+
.convertPrecision( currency.minorUnit )
|
39 |
.getAmount();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
return (
|
42 |
<div className="wc-block-components-order-summary-item">
|
54 |
<ProductImage image={ images.length ? images[ 0 ] : {} } />
|
55 |
</div>
|
56 |
<div className="wc-block-components-order-summary-item__description">
|
57 |
+
<div className="wc-block-components-order-summary-item__header">
|
58 |
+
<ProductName permalink={ permalink } name={ name } />
|
59 |
+
<ProductPrice
|
60 |
+
currency={ currency }
|
61 |
+
price={ linePrice }
|
62 |
+
priceClassName="wc-block-components-order-summary-item__total-price"
|
63 |
+
/>
|
64 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
{ showBackorderBadge ? (
|
66 |
<ProductBackorderBadge />
|
67 |
) : (
|
74 |
<ProductMetadata
|
75 |
shortDescription={ shortDescription }
|
76 |
fullDescription={ fullDescription }
|
|
|
77 |
variation={ variation }
|
78 |
/>
|
79 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
</div>
|
81 |
);
|
82 |
};
|
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 |
|
@@ -17,16 +12,10 @@
|
|
17 |
|
18 |
.wc-block-components-order-summary-item {
|
19 |
@include with-translucent-border(0 0 1px);
|
20 |
-
|
21 |
-
display: flex;
|
22 |
padding-bottom: 1px;
|
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;
|
@@ -36,10 +25,6 @@
|
|
36 |
display: none;
|
37 |
}
|
38 |
}
|
39 |
-
|
40 |
-
.wc-block-components-product-metadata {
|
41 |
-
@include font-size(regular);
|
42 |
-
}
|
43 |
}
|
44 |
|
45 |
.wc-block-components-order-summary-item__image,
|
@@ -50,6 +35,7 @@
|
|
50 |
|
51 |
.wc-block-components-order-summary-item__image {
|
52 |
width: #{$gap-large * 2};
|
|
|
53 |
padding-bottom: $gap;
|
54 |
position: relative;
|
55 |
|
@@ -60,6 +46,7 @@
|
|
60 |
}
|
61 |
|
62 |
.wc-block-components-order-summary-item__quantity {
|
|
|
63 |
align-items: center;
|
64 |
background: #fff;
|
65 |
border: 2px solid;
|
@@ -74,7 +61,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,8 +69,9 @@
|
|
82 |
|
83 |
.wc-block-components-order-summary-item__description {
|
84 |
padding-left: $gap-large;
|
85 |
-
padding-
|
86 |
padding-bottom: $gap;
|
|
|
87 |
|
88 |
p,
|
89 |
.wc-block-components-product-metadata {
|
@@ -92,13 +80,8 @@
|
|
92 |
}
|
93 |
}
|
94 |
|
95 |
-
.wc-block-components-order-summary-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
}
|
100 |
-
|
101 |
-
|
102 |
-
.wc-block-components-order-summary-item__individual-prices {
|
103 |
-
display: block;
|
104 |
}
|
1 |
.wc-block-components-order-summary {
|
2 |
+
.wc-blocks-components-panel__button {
|
|
|
|
|
3 |
margin-top: 0;
|
4 |
+
padding-top: 0;
|
|
|
|
|
|
|
5 |
}
|
6 |
}
|
7 |
|
12 |
|
13 |
.wc-block-components-order-summary-item {
|
14 |
@include with-translucent-border(0 0 1px);
|
15 |
+
display: table-row;
|
|
|
16 |
padding-bottom: 1px;
|
|
|
17 |
width: 100%;
|
18 |
|
|
|
|
|
|
|
|
|
19 |
&:last-child {
|
20 |
> div {
|
21 |
padding-bottom: 0;
|
25 |
display: none;
|
26 |
}
|
27 |
}
|
|
|
|
|
|
|
|
|
28 |
}
|
29 |
|
30 |
.wc-block-components-order-summary-item__image,
|
35 |
|
36 |
.wc-block-components-order-summary-item__image {
|
37 |
width: #{$gap-large * 2};
|
38 |
+
padding-top: $gap;
|
39 |
padding-bottom: $gap;
|
40 |
position: relative;
|
41 |
|
46 |
}
|
47 |
|
48 |
.wc-block-components-order-summary-item__quantity {
|
49 |
+
@include font-size(smaller);
|
50 |
align-items: center;
|
51 |
background: #fff;
|
52 |
border: 2px solid;
|
61 |
justify-content: center;
|
62 |
min-width: 20px;
|
63 |
right: 0;
|
64 |
+
top: $gap;
|
65 |
transform: translate(50%, -50%);
|
66 |
white-space: nowrap;
|
67 |
z-index: 1;
|
69 |
|
70 |
.wc-block-components-order-summary-item__description {
|
71 |
padding-left: $gap-large;
|
72 |
+
padding-top: $gap;
|
73 |
padding-bottom: $gap;
|
74 |
+
line-height: 1.375;
|
75 |
|
76 |
p,
|
77 |
.wc-block-components-product-metadata {
|
80 |
}
|
81 |
}
|
82 |
|
83 |
+
.wc-block-components-order-summary-item__header {
|
84 |
+
display: flex;
|
85 |
+
flex-wrap: wrap;
|
86 |
+
justify-content: space-between;
|
|
|
|
|
|
|
|
|
|
|
87 |
}
|
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/payment-method-icons/index.js
CHANGED
@@ -15,9 +15,8 @@ import './style.scss';
|
|
15 |
* For a given list of icons, render each as a list item, using common icons
|
16 |
* where available.
|
17 |
*
|
18 |
-
* @param {Object} props
|
19 |
-
* @param {Array}
|
20 |
-
* @param {string} props.align How to align the icon.
|
21 |
*/
|
22 |
export const PaymentMethodIcons = ( { icons = [], align = 'center' } ) => {
|
23 |
const iconConfigs = normalizeIconConfig( icons );
|
15 |
* For a given list of icons, render each as a list item, using common icons
|
16 |
* where available.
|
17 |
*
|
18 |
+
* @param {Object} props Component props.
|
19 |
+
* @param {Array} props.icons Array of icons object configs or ids as strings.
|
|
|
20 |
*/
|
21 |
export const PaymentMethodIcons = ( { icons = [], align = 'center' } ) => {
|
22 |
const iconConfigs = normalizeIconConfig( icons );
|
assets/js/base/components/cart-checkout/payment-method-icons/payment-method-icon.js
CHANGED
@@ -9,11 +9,6 @@ const getIconClassName = ( id ) => {
|
|
9 |
|
10 |
/**
|
11 |
* Return an element for an icon.
|
12 |
-
*
|
13 |
-
* @param {Object} props Incoming props for component.
|
14 |
-
* @param {string} props.id Id for component.
|
15 |
-
* @param {string|null} props.src Optional src value for icon.
|
16 |
-
* @param {string} props.alt Optional alt value for icon.
|
17 |
*/
|
18 |
const PaymentMethodIcon = ( { id, src = null, alt = '' } ) => {
|
19 |
if ( ! src ) {
|
9 |
|
10 |
/**
|
11 |
* Return an element for an icon.
|
|
|
|
|
|
|
|
|
|
|
12 |
*/
|
13 |
const PaymentMethodIcon = ( { id, src = null, alt = '' } ) => {
|
14 |
if ( ! src ) {
|
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/policies/style.scss
CHANGED
@@ -14,7 +14,7 @@
|
|
14 |
margin: 0;
|
15 |
|
16 |
&:not(:first-child) {
|
17 |
-
border-left: 1px solid $gray-
|
18 |
}
|
19 |
|
20 |
> a {
|
14 |
margin: 0;
|
15 |
|
16 |
&:not(:first-child) {
|
17 |
+
border-left: 1px solid $gray-10;
|
18 |
}
|
19 |
|
20 |
> a {
|
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
DELETED
@@ -1,60 +0,0 @@
|
|
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 |
-
}
|
23 |
-
|
24 |
-
details = details.filter( ( detail ) => ! detail.hidden );
|
25 |
-
|
26 |
-
if ( details.length === 0 ) {
|
27 |
-
return null;
|
28 |
-
}
|
29 |
-
|
30 |
-
return (
|
31 |
-
<ul className="wc-block-components-product-details">
|
32 |
-
{ details.map( ( detail ) => {
|
33 |
-
const className = detail.name
|
34 |
-
? `wc-block-components-product-details__${ kebabCase(
|
35 |
-
detail.name
|
36 |
-
) }`
|
37 |
-
: '';
|
38 |
-
return (
|
39 |
-
<li
|
40 |
-
key={ detail.name + ( detail.display || detail.value ) }
|
41 |
-
className={ className }
|
42 |
-
>
|
43 |
-
{ detail.name && (
|
44 |
-
<>
|
45 |
-
<span className="wc-block-components-product-details__name">
|
46 |
-
{ decodeEntities( detail.name ) }:
|
47 |
-
</span>{ ' ' }
|
48 |
-
</>
|
49 |
-
) }
|
50 |
-
<span className="wc-block-components-product-details__value">
|
51 |
-
{ decodeEntities( detail.display || detail.value ) }
|
52 |
-
</span>
|
53 |
-
</li>
|
54 |
-
);
|
55 |
-
} ) }
|
56 |
-
</ul>
|
57 |
-
);
|
58 |
-
};
|
59 |
-
|
60 |
-
export default ProductDetails;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/product-details/style.scss
DELETED
@@ -1,25 +0,0 @@
|
|
1 |
-
// Extra class added for specificity so styles are applied in the editor.
|
2 |
-
.wc-block-components-product-details.wc-block-components-product-details {
|
3 |
-
list-style: none;
|
4 |
-
margin: 0.5em 0;
|
5 |
-
padding: 0;
|
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,
|
17 |
-
.wc-block-components-product-details__value {
|
18 |
-
display: inline-block;
|
19 |
-
}
|
20 |
-
|
21 |
-
.is-large:not(.wc-block-checkout) {
|
22 |
-
.wc-block-components-product-details__name {
|
23 |
-
font-weight: bold;
|
24 |
-
}
|
25 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/product-details/test/__snapshots__/index.js.snap
DELETED
@@ -1,76 +0,0 @@
|
|
1 |
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2 |
-
|
3 |
-
exports[`ProductDetails should not render hidden details 1`] = `
|
4 |
-
<ul
|
5 |
-
className="wc-block-components-product-details"
|
6 |
-
>
|
7 |
-
<li
|
8 |
-
className="wc-block-components-product-details__lorem"
|
9 |
-
>
|
10 |
-
<span
|
11 |
-
className="wc-block-components-product-details__name"
|
12 |
-
>
|
13 |
-
LOREM
|
14 |
-
:
|
15 |
-
</span>
|
16 |
-
|
17 |
-
<span
|
18 |
-
className="wc-block-components-product-details__value"
|
19 |
-
>
|
20 |
-
IPSUM
|
21 |
-
</span>
|
22 |
-
</li>
|
23 |
-
</ul>
|
24 |
-
`;
|
25 |
-
|
26 |
-
exports[`ProductDetails should not rendering anything if all details are hidden 1`] = `null`;
|
27 |
-
|
28 |
-
exports[`ProductDetails should not rendering anything if details is an empty array 1`] = `null`;
|
29 |
-
|
30 |
-
exports[`ProductDetails should render details 1`] = `
|
31 |
-
<ul
|
32 |
-
className="wc-block-components-product-details"
|
33 |
-
>
|
34 |
-
<li
|
35 |
-
className="wc-block-components-product-details__lorem"
|
36 |
-
>
|
37 |
-
<span
|
38 |
-
className="wc-block-components-product-details__name"
|
39 |
-
>
|
40 |
-
Lorem
|
41 |
-
:
|
42 |
-
</span>
|
43 |
-
|
44 |
-
<span
|
45 |
-
className="wc-block-components-product-details__value"
|
46 |
-
>
|
47 |
-
Ipsum
|
48 |
-
</span>
|
49 |
-
</li>
|
50 |
-
<li
|
51 |
-
className="wc-block-components-product-details__lorem"
|
52 |
-
>
|
53 |
-
<span
|
54 |
-
className="wc-block-components-product-details__name"
|
55 |
-
>
|
56 |
-
LOREM
|
57 |
-
:
|
58 |
-
</span>
|
59 |
-
|
60 |
-
<span
|
61 |
-
className="wc-block-components-product-details__value"
|
62 |
-
>
|
63 |
-
IPSUM
|
64 |
-
</span>
|
65 |
-
</li>
|
66 |
-
<li
|
67 |
-
className=""
|
68 |
-
>
|
69 |
-
<span
|
70 |
-
className="wc-block-components-product-details__value"
|
71 |
-
>
|
72 |
-
Ipsum
|
73 |
-
</span>
|
74 |
-
</li>
|
75 |
-
</ul>
|
76 |
-
`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/product-details/test/index.js
DELETED
@@ -1,57 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import TestRenderer from 'react-test-renderer';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import ProductDetails from '..';
|
10 |
-
|
11 |
-
describe( 'ProductDetails', () => {
|
12 |
-
test( 'should render details', () => {
|
13 |
-
const details = [
|
14 |
-
{ name: 'Lorem', value: 'Ipsum' },
|
15 |
-
{ name: 'LOREM', value: 'Ipsum', display: 'IPSUM' },
|
16 |
-
{ value: 'Ipsum' },
|
17 |
-
];
|
18 |
-
const component = TestRenderer.create(
|
19 |
-
<ProductDetails details={ details } />
|
20 |
-
);
|
21 |
-
|
22 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
23 |
-
} );
|
24 |
-
|
25 |
-
test( 'should not render hidden details', () => {
|
26 |
-
const details = [
|
27 |
-
{ name: 'Lorem', value: 'Ipsum', hidden: true },
|
28 |
-
{ name: 'LOREM', value: 'Ipsum', display: 'IPSUM' },
|
29 |
-
];
|
30 |
-
const component = TestRenderer.create(
|
31 |
-
<ProductDetails details={ details } />
|
32 |
-
);
|
33 |
-
|
34 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
35 |
-
} );
|
36 |
-
|
37 |
-
test( 'should not rendering anything if all details are hidden', () => {
|
38 |
-
const details = [
|
39 |
-
{ name: 'Lorem', value: 'Ipsum', hidden: true },
|
40 |
-
{ name: 'LOREM', value: 'Ipsum', display: 'IPSUM', hidden: true },
|
41 |
-
];
|
42 |
-
const component = TestRenderer.create(
|
43 |
-
<ProductDetails details={ details } />
|
44 |
-
);
|
45 |
-
|
46 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
47 |
-
} );
|
48 |
-
|
49 |
-
test( 'should not rendering anything if details is an empty array', () => {
|
50 |
-
const details = [];
|
51 |
-
const component = TestRenderer.create(
|
52 |
-
<ProductDetails details={ details } />
|
53 |
-
);
|
54 |
-
|
55 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
56 |
-
} );
|
57 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js}
RENAMED
@@ -2,18 +2,13 @@
|
|
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 +17,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 |
+
const ProductImage = ( { image = {} } ) => {
|
12 |
const imageProps = {
|
13 |
src: image.thumbnail || PLACEHOLDER_IMG_SRC,
|
14 |
alt: decodeEntities( image.alt ) || '',
|
17 |
return <img { ...imageProps } alt={ imageProps.alt } />;
|
18 |
};
|
19 |
|
20 |
+
ProductImage.propTypes = {
|
21 |
+
image: PropTypes.shape( {
|
22 |
+
alt: PropTypes.string,
|
23 |
+
thumbnail: PropTypes.string,
|
24 |
+
} ),
|
25 |
+
};
|
26 |
+
|
27 |
export default ProductImage;
|
assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js}
RENAMED
@@ -2,24 +2,17 @@
|
|
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 {number} props.lowStockRemaining Whether or not there is low stock remaining.
|
19 |
*/
|
20 |
-
const ProductLowStockBadge = ( {
|
21 |
-
lowStockRemaining,
|
22 |
-
}: ProductLowStockBadgeProps ): JSX.Element | null => {
|
23 |
if ( ! lowStockRemaining ) {
|
24 |
return null;
|
25 |
}
|
@@ -35,4 +28,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 |
+
const ProductLowStockBadge = ( { lowStockRemaining } ) => {
|
|
|
|
|
16 |
if ( ! lowStockRemaining ) {
|
17 |
return null;
|
18 |
}
|
28 |
);
|
29 |
};
|
30 |
|
31 |
+
ProductLowStockBadge.propTypes = {
|
32 |
+
lowStockRemaining: PropTypes.number,
|
33 |
+
};
|
34 |
+
|
35 |
export default ProductLowStockBadge;
|
assets/js/base/components/cart-checkout/product-metadata/index.js
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Internal dependencies
|
8 |
+
*/
|
9 |
+
import ProductVariationData from '../product-variation-data';
|
10 |
+
import ProductSummary from '../product-summary';
|
11 |
+
import './style.scss';
|
12 |
+
|
13 |
+
const ProductMetadata = ( {
|
14 |
+
shortDescription = '',
|
15 |
+
fullDescription = '',
|
16 |
+
variation = [],
|
17 |
+
} ) => {
|
18 |
+
return (
|
19 |
+
<div className="wc-block-components-product-metadata">
|
20 |
+
<ProductSummary
|
21 |
+
className="wc-block-components-product-metadata__description"
|
22 |
+
shortDescription={ shortDescription }
|
23 |
+
fullDescription={ fullDescription }
|
24 |
+
/>
|
25 |
+
<ProductVariationData
|
26 |
+
className="wc-block-components-product-metadata__variation-data"
|
27 |
+
variation={ variation }
|
28 |
+
/>
|
29 |
+
</div>
|
30 |
+
);
|
31 |
+
};
|
32 |
+
|
33 |
+
ProductMetadata.propTypes = {
|
34 |
+
shortDescription: PropTypes.string,
|
35 |
+
fullDescription: PropTypes.string,
|
36 |
+
variation: PropTypes.array,
|
37 |
+
};
|
38 |
+
|
39 |
+
export default ProductMetadata;
|
assets/js/base/components/cart-checkout/product-metadata/index.tsx
DELETED
@@ -1,45 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { ProductResponseItemData } from '@woocommerce/type-defs/product-response';
|
5 |
-
import { CartVariationItem } from '@woocommerce/type-defs/cart';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
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 |
-
}: ProductMetadataProps ): JSX.Element => {
|
27 |
-
return (
|
28 |
-
<div className="wc-block-components-product-metadata">
|
29 |
-
<ProductSummary
|
30 |
-
className="wc-block-components-product-metadata__description"
|
31 |
-
shortDescription={ shortDescription }
|
32 |
-
fullDescription={ fullDescription }
|
33 |
-
/>
|
34 |
-
<ProductDetails details={ itemData } />
|
35 |
-
<ProductDetails
|
36 |
-
details={ variation.map( ( { attribute = '', value } ) => ( {
|
37 |
-
name: attribute,
|
38 |
-
value,
|
39 |
-
} ) ) }
|
40 |
-
/>
|
41 |
-
</div>
|
42 |
-
);
|
43 |
-
};
|
44 |
-
|
45 |
-
export default ProductMetadata;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/product-metadata/style.scss
CHANGED
@@ -3,6 +3,6 @@
|
|
3 |
|
4 |
.wc-block-components-product-metadata__description > p,
|
5 |
.wc-block-components-product-metadata__variation-data {
|
6 |
-
margin: 0.25em 0;
|
7 |
}
|
8 |
}
|
3 |
|
4 |
.wc-block-components-product-metadata__description > p,
|
5 |
.wc-block-components-product-metadata__variation-data {
|
6 |
+
margin: 0.25em 0 0 0;
|
7 |
}
|
8 |
}
|
assets/js/base/components/cart-checkout/product-name/index.js
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import './style.scss';
|
11 |
+
|
12 |
+
const ProductName = ( { name, permalink, disabled = false } ) => {
|
13 |
+
return (
|
14 |
+
// we use tabIndex -1 to prevent the link from being focused, pointer-events
|
15 |
+
// disabled click events, so we get an almost disabled link.
|
16 |
+
<a
|
17 |
+
className="wc-block-components-product-name"
|
18 |
+
href={ permalink }
|
19 |
+
tabIndex={ disabled ? -1 : 0 }
|
20 |
+
>
|
21 |
+
{ decodeEntities( name ) }
|
22 |
+
</a>
|
23 |
+
);
|
24 |
+
};
|
25 |
+
|
26 |
+
ProductName.propTypes = {
|
27 |
+
disabled: PropTypes.bool,
|
28 |
+
name: PropTypes.string,
|
29 |
+
permalink: PropTypes.string,
|
30 |
+
};
|
31 |
+
|
32 |
+
export default ProductName;
|
assets/js/base/components/{product-name → cart-checkout/product-name}/style.scss
RENAMED
@@ -1,4 +1,6 @@
|
|
1 |
.wc-block-components-product-name {
|
2 |
@include font-size(regular);
|
3 |
@include wrap-break-word();
|
|
|
|
|
4 |
}
|
1 |
.wc-block-components-product-name {
|
2 |
@include font-size(regular);
|
3 |
@include wrap-break-word();
|
4 |
+
display: block;
|
5 |
+
max-width: max-content;
|
6 |
}
|
assets/js/base/components/cart-checkout/product-sale-badge/index.js
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __experimentalCreateInterpolateElement } 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 |
+
{ __experimentalCreateInterpolateElement(
|
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.js
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
*/
|
11 |
+
const ProductSummary = ( {
|
12 |
+
className,
|
13 |
+
shortDescription = '',
|
14 |
+
fullDescription = '',
|
15 |
+
} ) => {
|
16 |
+
const source = shortDescription ? shortDescription : fullDescription;
|
17 |
+
|
18 |
+
if ( ! source ) {
|
19 |
+
return null;
|
20 |
+
}
|
21 |
+
|
22 |
+
return (
|
23 |
+
<Summary
|
24 |
+
className={ className }
|
25 |
+
source={ source }
|
26 |
+
maxLength={ 15 }
|
27 |
+
countType={ getSetting( 'wordCountType', 'words' ) }
|
28 |
+
/>
|
29 |
+
);
|
30 |
+
};
|
31 |
+
|
32 |
+
ProductSummary.propTypes = {
|
33 |
+
className: PropTypes.string,
|
34 |
+
shortDescription: PropTypes.string,
|
35 |
+
fullDescription: PropTypes.string,
|
36 |
+
};
|
37 |
+
|
38 |
+
export default ProductSummary;
|
assets/js/base/components/cart-checkout/product-summary/index.tsx
DELETED
@@ -1,41 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import Summary from '@woocommerce/base-components/summary';
|
5 |
-
import { blocksConfig } from '@woocommerce/block-settings';
|
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 |
-
*
|
15 |
-
* @param {Object} props Incoming props for the component.
|
16 |
-
* @param {string} props.className CSS class name used.
|
17 |
-
* @param {string} props.shortDescription Short description for the product.
|
18 |
-
* @param {string} props.fullDescription Full description for the product.
|
19 |
-
*/
|
20 |
-
const ProductSummary = ( {
|
21 |
-
className,
|
22 |
-
shortDescription = '',
|
23 |
-
fullDescription = '',
|
24 |
-
}: ProductSummaryProps ): JSX.Element | null => {
|
25 |
-
const source = shortDescription ? shortDescription : fullDescription;
|
26 |
-
|
27 |
-
if ( ! source ) {
|
28 |
-
return null;
|
29 |
-
}
|
30 |
-
|
31 |
-
return (
|
32 |
-
<Summary
|
33 |
-
className={ className }
|
34 |
-
source={ source }
|
35 |
-
maxLength={ 15 }
|
36 |
-
countType={ blocksConfig.wordCountType || 'words' }
|
37 |
-
/>
|
38 |
-
);
|
39 |
-
};
|
40 |
-
|
41 |
-
export default ProductSummary;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/product-variation-data/index.js
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
5 |
+
import PropTypes from 'prop-types';
|
6 |
+
import classNames from 'classnames';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Returns a formatted element containing variation details.
|
10 |
+
*/
|
11 |
+
const ProductVariationData = ( { className, variation = [] } ) => {
|
12 |
+
if ( ! variation || variation.length === 0 ) {
|
13 |
+
return null;
|
14 |
+
}
|
15 |
+
|
16 |
+
const variationsText = variation
|
17 |
+
.map( ( v ) => {
|
18 |
+
if ( v.attribute ) {
|
19 |
+
return `${ decodeEntities( v.attribute ) }: ${ decodeEntities(
|
20 |
+
v.value
|
21 |
+
) }`;
|
22 |
+
}
|
23 |
+
// Support for product attributes with no name/key
|
24 |
+
return `${ decodeEntities( v.value ) }`;
|
25 |
+
} )
|
26 |
+
.join( ' / ' );
|
27 |
+
|
28 |
+
return (
|
29 |
+
<div
|
30 |
+
className={ classNames(
|
31 |
+
'wc-block-components-product-variation-data',
|
32 |
+
className
|
33 |
+
) }
|
34 |
+
>
|
35 |
+
{ variationsText }
|
36 |
+
</div>
|
37 |
+
);
|
38 |
+
};
|
39 |
+
|
40 |
+
ProductVariationData.propTypes = {
|
41 |
+
variation: PropTypes.arrayOf(
|
42 |
+
PropTypes.shape( {
|
43 |
+
attribute: PropTypes.string,
|
44 |
+
value: PropTypes.string.isRequired,
|
45 |
+
} )
|
46 |
+
),
|
47 |
+
};
|
48 |
+
|
49 |
+
export default ProductVariationData;
|
assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js}
RENAMED
@@ -1,29 +1,24 @@
|
|
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
|
13 |
*/
|
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,
|
@@ -35,10 +30,31 @@ const ShippingCalculatorAddress = ( {
|
|
35 |
return ! hasValidationErrors;
|
36 |
};
|
37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
return (
|
39 |
<form className="wc-block-components-shipping-calculator-address">
|
40 |
<AddressForm
|
41 |
fields={ addressFields }
|
|
|
42 |
onChange={ setAddress }
|
43 |
values={ address }
|
44 |
/>
|
@@ -60,4 +76,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 { AddressForm } from '@woocommerce/base-components/cart-checkout';
|
7 |
import Button from '@woocommerce/base-components/button';
|
8 |
import { useState } from '@wordpress/element';
|
9 |
import isShallowEqual from '@wordpress/is-shallow-equal';
|
10 |
import { useValidationContext } from '@woocommerce/base-context';
|
|
|
11 |
|
12 |
/**
|
13 |
* Internal dependencies
|
14 |
*/
|
15 |
import './style.scss';
|
|
|
16 |
|
|
|
|
|
|
|
|
|
|
|
17 |
const ShippingCalculatorAddress = ( {
|
18 |
address: initialAddress,
|
19 |
onUpdate,
|
20 |
addressFields,
|
21 |
+
} ) => {
|
22 |
const [ address, setAddress ] = useState( initialAddress );
|
23 |
const {
|
24 |
hasValidationErrors,
|
30 |
return ! hasValidationErrors;
|
31 |
};
|
32 |
|
33 |
+
// Make all fields optional except 'country'.
|
34 |
+
const fieldConfig = {};
|
35 |
+
addressFields.forEach( ( field ) => {
|
36 |
+
if ( field === 'country' ) {
|
37 |
+
fieldConfig[ field ] = {
|
38 |
+
...fieldConfig[ field ],
|
39 |
+
errorMessage: __(
|
40 |
+
'Please select a country to calculate rates.',
|
41 |
+
'woo-gutenberg-products-block'
|
42 |
+
),
|
43 |
+
required: true,
|
44 |
+
};
|
45 |
+
} else {
|
46 |
+
fieldConfig[ field ] = {
|
47 |
+
...fieldConfig[ field ],
|
48 |
+
required: false,
|
49 |
+
};
|
50 |
+
}
|
51 |
+
} );
|
52 |
+
|
53 |
return (
|
54 |
<form className="wc-block-components-shipping-calculator-address">
|
55 |
<AddressForm
|
56 |
fields={ addressFields }
|
57 |
+
fieldConfig={ fieldConfig }
|
58 |
onChange={ setAddress }
|
59 |
values={ address }
|
60 |
/>
|
76 |
);
|
77 |
};
|
78 |
|
79 |
+
ShippingCalculatorAddress.propTypes = {
|
80 |
+
address: PropTypes.object.isRequired,
|
81 |
+
onUpdate: PropTypes.func.isRequired,
|
82 |
+
addressFields: PropTypes.array.isRequired,
|
83 |
+
};
|
84 |
+
|
85 |
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,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
const ShippingLocation = ( { address } ) => {
|
16 |
+
// we bail early if we don't have an address.
|
17 |
+
if ( Object.values( address ).length === 0 ) {
|
18 |
+
return null;
|
19 |
+
}
|
20 |
+
const formattedCountry =
|
21 |
+
typeof SHIPPING_COUNTRIES[ address.country ] === 'string'
|
22 |
+
? decodeEntities( SHIPPING_COUNTRIES[ address.country ] )
|
23 |
+
: '';
|
24 |
+
|
25 |
+
const formattedState =
|
26 |
+
typeof SHIPPING_STATES[ address.country ] === 'object' &&
|
27 |
+
typeof SHIPPING_STATES[ address.country ][ address.state ] === 'string'
|
28 |
+
? decodeEntities(
|
29 |
+
SHIPPING_STATES[ address.country ][ address.state ]
|
30 |
+
)
|
31 |
+
: address.state;
|
32 |
+
|
33 |
+
const addressParts = [];
|
34 |
+
|
35 |
+
addressParts.push( address.postcode.toUpperCase() );
|
36 |
+
addressParts.push( address.city );
|
37 |
+
addressParts.push( formattedState );
|
38 |
+
addressParts.push( formattedCountry );
|
39 |
+
|
40 |
+
const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
|
41 |
+
|
42 |
+
return (
|
43 |
+
formattedLocation && (
|
44 |
+
<span className="wc-block-components-shipping-address">
|
45 |
+
{ sprintf(
|
46 |
+
/* Translators: %s location. */
|
47 |
+
__( 'Shipping to %s', 'woo-gutenberg-products-block' ),
|
48 |
+
formattedLocation
|
49 |
+
) + ' ' }
|
50 |
+
</span>
|
51 |
+
)
|
52 |
+
);
|
53 |
+
};
|
54 |
+
|
55 |
+
ShippingLocation.propTypes = {
|
56 |
+
address: PropTypes.shape( {
|
57 |
+
city: PropTypes.string,
|
58 |
+
state: PropTypes.string,
|
59 |
+
postcode: PropTypes.string,
|
60 |
+
country: PropTypes.string,
|
61 |
+
} ),
|
62 |
+
};
|
63 |
+
|
64 |
+
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/index.tsx
DELETED
@@ -1,152 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import classNames from 'classnames';
|
5 |
-
import { _n, sprintf } from '@wordpress/i18n';
|
6 |
-
import { decodeEntities } from '@wordpress/html-entities';
|
7 |
-
import type { ReactElement } from 'react';
|
8 |
-
import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
|
9 |
-
import { Panel } from '@woocommerce/blocks-checkout';
|
10 |
-
import Label from '@woocommerce/base-components/label';
|
11 |
-
import { useSelectShippingRate } from '@woocommerce/base-context/hooks';
|
12 |
-
import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Internal dependencies
|
16 |
-
*/
|
17 |
-
import PackageRates from './package-rates';
|
18 |
-
import './style.scss';
|
19 |
-
|
20 |
-
interface PackageItem {
|
21 |
-
name: string;
|
22 |
-
key: string;
|
23 |
-
quantity: number;
|
24 |
-
}
|
25 |
-
|
26 |
-
interface Destination {
|
27 |
-
// eslint-disable-next-line camelcase
|
28 |
-
address_1: string;
|
29 |
-
// eslint-disable-next-line camelcase
|
30 |
-
address_2: string;
|
31 |
-
city: string;
|
32 |
-
state: string;
|
33 |
-
postcode: string;
|
34 |
-
country: string;
|
35 |
-
}
|
36 |
-
|
37 |
-
export interface PackageData {
|
38 |
-
destination: Destination;
|
39 |
-
name: string;
|
40 |
-
// eslint-disable-next-line camelcase
|
41 |
-
shipping_rates: CartShippingPackageShippingRate[];
|
42 |
-
items: PackageItem[];
|
43 |
-
}
|
44 |
-
|
45 |
-
export type PackageRateRenderOption = (
|
46 |
-
option: CartShippingPackageShippingRate
|
47 |
-
) => PackageRateOption;
|
48 |
-
|
49 |
-
interface PackageProps {
|
50 |
-
/* PackageId can be a string, WooCommerce Subscriptions uses strings for example, but WooCommerce core uses numbers */
|
51 |
-
packageId: string | number;
|
52 |
-
renderOption: PackageRateRenderOption;
|
53 |
-
collapse?: boolean;
|
54 |
-
packageData: PackageData;
|
55 |
-
className?: string;
|
56 |
-
collapsible?: boolean;
|
57 |
-
noResultsMessage: ReactElement;
|
58 |
-
showItems?: boolean;
|
59 |
-
}
|
60 |
-
|
61 |
-
export const ShippingRatesControlPackage = ( {
|
62 |
-
packageId,
|
63 |
-
className,
|
64 |
-
noResultsMessage,
|
65 |
-
renderOption,
|
66 |
-
packageData,
|
67 |
-
collapsible = false,
|
68 |
-
collapse = false,
|
69 |
-
showItems = false,
|
70 |
-
}: PackageProps ): ReactElement => {
|
71 |
-
const { selectShippingRate, selectedShippingRate } = useSelectShippingRate(
|
72 |
-
packageId,
|
73 |
-
packageData.shipping_rates
|
74 |
-
);
|
75 |
-
|
76 |
-
const header = (
|
77 |
-
<>
|
78 |
-
{ ( showItems || collapsible ) && (
|
79 |
-
<div className="wc-block-components-shipping-rates-control__package-title">
|
80 |
-
{ packageData.name }
|
81 |
-
</div>
|
82 |
-
) }
|
83 |
-
{ showItems && (
|
84 |
-
<ul className="wc-block-components-shipping-rates-control__package-items">
|
85 |
-
{ Object.values( packageData.items ).map( ( v ) => {
|
86 |
-
const name = decodeEntities( v.name );
|
87 |
-
const quantity = v.quantity;
|
88 |
-
return (
|
89 |
-
<li
|
90 |
-
key={ v.key }
|
91 |
-
className="wc-block-components-shipping-rates-control__package-item"
|
92 |
-
>
|
93 |
-
<Label
|
94 |
-
label={
|
95 |
-
quantity > 1
|
96 |
-
? `${ name } × ${ quantity }`
|
97 |
-
: `${ name }`
|
98 |
-
}
|
99 |
-
screenReaderLabel={ sprintf(
|
100 |
-
/* translators: %1$s name of the product (ie: Sunglasses), %2$d number of units in the current cart package */
|
101 |
-
_n(
|
102 |
-
'%1$s (%2$d unit)',
|
103 |
-
'%1$s (%2$d units)',
|
104 |
-
quantity,
|
105 |
-
'woo-gutenberg-products-block'
|
106 |
-
),
|
107 |
-
name,
|
108 |
-
quantity
|
109 |
-
) }
|
110 |
-
/>
|
111 |
-
</li>
|
112 |
-
);
|
113 |
-
} ) }
|
114 |
-
</ul>
|
115 |
-
) }
|
116 |
-
</>
|
117 |
-
);
|
118 |
-
const body = (
|
119 |
-
<PackageRates
|
120 |
-
className={ className }
|
121 |
-
noResultsMessage={ noResultsMessage }
|
122 |
-
rates={ packageData.shipping_rates }
|
123 |
-
onSelectRate={ selectShippingRate }
|
124 |
-
selected={ selectedShippingRate }
|
125 |
-
renderOption={ renderOption }
|
126 |
-
/>
|
127 |
-
);
|
128 |
-
if ( collapsible ) {
|
129 |
-
return (
|
130 |
-
<Panel
|
131 |
-
className="wc-block-components-shipping-rates-control__package"
|
132 |
-
initialOpen={ ! collapse }
|
133 |
-
title={ header }
|
134 |
-
>
|
135 |
-
{ body }
|
136 |
-
</Panel>
|
137 |
-
);
|
138 |
-
}
|
139 |
-
return (
|
140 |
-
<div
|
141 |
-
className={ classNames(
|
142 |
-
'wc-block-components-shipping-rates-control__package',
|
143 |
-
className
|
144 |
-
) }
|
145 |
-
>
|
146 |
-
{ header }
|
147 |
-
{ body }
|
148 |
-
</div>
|
149 |
-
);
|
150 |
-
};
|
151 |
-
|
152 |
-
export default ShippingRatesControlPackage;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/shipping-rates-control-package/package-rates.tsx
DELETED
@@ -1,69 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import RadioControl, {
|
5 |
-
RadioControlOptionLayout,
|
6 |
-
} from '@woocommerce/base-components/radio-control';
|
7 |
-
import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
|
8 |
-
import type { ReactElement } from 'react';
|
9 |
-
import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
|
10 |
-
|
11 |
-
/**
|
12 |
-
* Internal dependencies
|
13 |
-
*/
|
14 |
-
import { renderPackageRateOption } from './render-package-rate-option';
|
15 |
-
|
16 |
-
interface PackageRates {
|
17 |
-
onSelectRate: ( selectedRateId: string ) => void;
|
18 |
-
rates: CartShippingPackageShippingRate[];
|
19 |
-
renderOption?: (
|
20 |
-
option: CartShippingPackageShippingRate
|
21 |
-
) => PackageRateOption;
|
22 |
-
className?: string;
|
23 |
-
noResultsMessage: ReactElement;
|
24 |
-
selected?: string;
|
25 |
-
}
|
26 |
-
|
27 |
-
const PackageRates = ( {
|
28 |
-
className,
|
29 |
-
noResultsMessage,
|
30 |
-
onSelectRate,
|
31 |
-
rates,
|
32 |
-
renderOption = renderPackageRateOption,
|
33 |
-
selected,
|
34 |
-
}: PackageRates ): ReactElement => {
|
35 |
-
if ( rates.length === 0 ) {
|
36 |
-
return noResultsMessage;
|
37 |
-
}
|
38 |
-
|
39 |
-
if ( rates.length > 1 ) {
|
40 |
-
return (
|
41 |
-
<RadioControl
|
42 |
-
className={ className }
|
43 |
-
onChange={ ( selectedRateId: string ) => {
|
44 |
-
onSelectRate( selectedRateId );
|
45 |
-
} }
|
46 |
-
selected={ selected }
|
47 |
-
options={ rates.map( renderOption ) }
|
48 |
-
/>
|
49 |
-
);
|
50 |
-
}
|
51 |
-
|
52 |
-
const {
|
53 |
-
label,
|
54 |
-
secondaryLabel,
|
55 |
-
description,
|
56 |
-
secondaryDescription,
|
57 |
-
} = renderOption( rates[ 0 ] );
|
58 |
-
|
59 |
-
return (
|
60 |
-
<RadioControlOptionLayout
|
61 |
-
label={ label }
|
62 |
-
secondaryLabel={ secondaryLabel }
|
63 |
-
description={ description }
|
64 |
-
secondaryDescription={ secondaryDescription }
|
65 |
-
/>
|
66 |
-
);
|
67 |
-
};
|
68 |
-
|
69 |
-
export default PackageRates;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.js
ADDED
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __, _n, sprintf } from '@wordpress/i18n';
|
5 |
+
import { useEffect } from 'react';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
+
import { speak } from '@wordpress/a11y';
|
8 |
+
import LoadingMask from '@woocommerce/base-components/loading-mask';
|
9 |
+
import {
|
10 |
+
getShippingRatesPackageCount,
|
11 |
+
getShippingRatesRateCount,
|
12 |
+
} from '@woocommerce/base-utils';
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Internal dependencies
|
16 |
+
*/
|
17 |
+
import Packages from './packages';
|
18 |
+
import './style.scss';
|
19 |
+
|
20 |
+
const ShippingRatesControl = ( {
|
21 |
+
shippingRates,
|
22 |
+
shippingRatesLoading,
|
23 |
+
className,
|
24 |
+
collapsibleWhenMultiple = false,
|
25 |
+
noResultsMessage,
|
26 |
+
renderOption,
|
27 |
+
} ) => {
|
28 |
+
useEffect( () => {
|
29 |
+
if ( shippingRatesLoading ) {
|
30 |
+
return;
|
31 |
+
}
|
32 |
+
const packages = getShippingRatesPackageCount( shippingRates );
|
33 |
+
const shippingOptions = getShippingRatesRateCount( shippingRates );
|
34 |
+
if ( shippingOptions === 0 ) {
|
35 |
+
speak(
|
36 |
+
__(
|
37 |
+
'No shipping options were found.',
|
38 |
+
'woo-gutenberg-products-block'
|
39 |
+
)
|
40 |
+
);
|
41 |
+
} else if ( packages === 1 ) {
|
42 |
+
speak(
|
43 |
+
sprintf(
|
44 |
+
// translators: %d number of shipping options found.
|
45 |
+
_n(
|
46 |
+
'%d shipping option was found.',
|
47 |
+
'%d shipping options were found.',
|
48 |
+
shippingOptions,
|
49 |
+
'woo-gutenberg-products-block'
|
50 |
+
),
|
51 |
+
shippingOptions
|
52 |
+
)
|
53 |
+
);
|
54 |
+
} else {
|
55 |
+
speak(
|
56 |
+
sprintf(
|
57 |
+
// translators: %d number of shipping packages packages.
|
58 |
+
_n(
|
59 |
+
'Shipping option searched for %d package.',
|
60 |
+
'Shipping options searched for %d packages.',
|
61 |
+
packages,
|
62 |
+
'woo-gutenberg-products-block'
|
63 |
+
),
|
64 |
+
packages
|
65 |
+
) +
|
66 |
+
' ' +
|
67 |
+
sprintf(
|
68 |
+
// translators: %d number of shipping options available.
|
69 |
+
_n(
|
70 |
+
'%d shipping option was found',
|
71 |
+
'%d shipping options were found',
|
72 |
+
shippingOptions,
|
73 |
+
'woo-gutenberg-products-block'
|
74 |
+
),
|
75 |
+
shippingOptions
|
76 |
+
)
|
77 |
+
);
|
78 |
+
}
|
79 |
+
}, [ shippingRatesLoading, shippingRates ] );
|
80 |
+
|
81 |
+
return (
|
82 |
+
<LoadingMask
|
83 |
+
isLoading={ shippingRatesLoading }
|
84 |
+
screenReaderLabel={ __(
|
85 |
+
'Loading shipping rates…',
|
86 |
+
'woo-gutenberg-products-block'
|
87 |
+
) }
|
88 |
+
showSpinner={ true }
|
89 |
+
>
|
90 |
+
<Packages
|
91 |
+
className={ className }
|
92 |
+
collapsible={
|
93 |
+
shippingRates.length > 1 && collapsibleWhenMultiple
|
94 |
+
}
|
95 |
+
noResultsMessage={ noResultsMessage }
|
96 |
+
renderOption={ renderOption }
|
97 |
+
shippingRates={ shippingRates }
|
98 |
+
/>
|
99 |
+
</LoadingMask>
|
100 |
+
);
|
101 |
+
};
|
102 |
+
|
103 |
+
ShippingRatesControl.propTypes = {
|
104 |
+
noResultsMessage: PropTypes.string.isRequired,
|
105 |
+
renderOption: PropTypes.func.isRequired,
|
106 |
+
className: PropTypes.string,
|
107 |
+
collapsibleWhenMultiple: PropTypes.bool,
|
108 |
+
shippingRates: PropTypes.array,
|
109 |
+
shippingRatesLoading: PropTypes.bool,
|
110 |
+
};
|
111 |
+
|
112 |
+
export default ShippingRatesControl;
|
113 |
+
export { Packages };
|
assets/js/base/components/cart-checkout/shipping-rates-control/index.tsx
DELETED
@@ -1,187 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
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 { ExperimentalOrderShippingPackages } from '@woocommerce/blocks-checkout';
|
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 |
-
* Internal dependencies
|
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 |
-
*
|
88 |
-
* @param {Object} props Incoming props.
|
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} [props.collapsible] If true, when multiple packages are rendered they can be toggled open and closed.
|
93 |
-
* @param {ReactElement} props.noResultsMessage Rendered when there are no packages.
|
94 |
-
* @param {Function} [props.renderOption] Function to render a shipping rate.
|
95 |
-
*/
|
96 |
-
const ShippingRatesControl = ( {
|
97 |
-
shippingRates,
|
98 |
-
shippingRatesLoading,
|
99 |
-
className,
|
100 |
-
collapsible = false,
|
101 |
-
noResultsMessage,
|
102 |
-
renderOption,
|
103 |
-
}: ShippingRatesControlProps ): JSX.Element => {
|
104 |
-
useEffect( () => {
|
105 |
-
if ( shippingRatesLoading ) {
|
106 |
-
return;
|
107 |
-
}
|
108 |
-
const packageCount = getShippingRatesPackageCount( shippingRates );
|
109 |
-
const shippingOptions = getShippingRatesRateCount( shippingRates );
|
110 |
-
if ( packageCount === 1 ) {
|
111 |
-
speak(
|
112 |
-
sprintf(
|
113 |
-
/* translators: %d number of shipping options found. */
|
114 |
-
_n(
|
115 |
-
'%d shipping option was found.',
|
116 |
-
'%d shipping options were found.',
|
117 |
-
shippingOptions,
|
118 |
-
'woo-gutenberg-products-block'
|
119 |
-
),
|
120 |
-
shippingOptions
|
121 |
-
)
|
122 |
-
);
|
123 |
-
} else {
|
124 |
-
speak(
|
125 |
-
sprintf(
|
126 |
-
/* translators: %d number of shipping packages packages. */
|
127 |
-
_n(
|
128 |
-
'Shipping option searched for %d package.',
|
129 |
-
'Shipping options searched for %d packages.',
|
130 |
-
packageCount,
|
131 |
-
'woo-gutenberg-products-block'
|
132 |
-
),
|
133 |
-
packageCount
|
134 |
-
) +
|
135 |
-
' ' +
|
136 |
-
sprintf(
|
137 |
-
/* translators: %d number of shipping options available. */
|
138 |
-
_n(
|
139 |
-
'%d shipping option was found',
|
140 |
-
'%d shipping options were found',
|
141 |
-
shippingOptions,
|
142 |
-
'woo-gutenberg-products-block'
|
143 |
-
),
|
144 |
-
shippingOptions
|
145 |
-
)
|
146 |
-
);
|
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 }
|
169 |
-
screenReaderLabel={ __(
|
170 |
-
'Loading shipping rates…',
|
171 |
-
'woo-gutenberg-products-block'
|
172 |
-
) }
|
173 |
-
showSpinner={ true }
|
174 |
-
>
|
175 |
-
<ExperimentalOrderShippingPackages.Slot { ...slotFillProps } />
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/shipping-rates-control/package-options.js
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import RadioControl, {
|
6 |
+
RadioControlOptionLayout,
|
7 |
+
} from '@woocommerce/base-components/radio-control';
|
8 |
+
import { Notice } from 'wordpress-components';
|
9 |
+
import classnames from 'classnames';
|
10 |
+
|
11 |
+
const PackageOptions = ( {
|
12 |
+
className,
|
13 |
+
noResultsMessage,
|
14 |
+
onChange,
|
15 |
+
options,
|
16 |
+
renderOption,
|
17 |
+
selected,
|
18 |
+
} ) => {
|
19 |
+
if ( options.length === 0 ) {
|
20 |
+
return (
|
21 |
+
<Notice
|
22 |
+
isDismissible={ false }
|
23 |
+
className={ classnames(
|
24 |
+
'wc-block-components-shipping-rates-control__no-results-notice',
|
25 |
+
'woocommerce-message',
|
26 |
+
'woocommerce-info'
|
27 |
+
) }
|
28 |
+
>
|
29 |
+
{ noResultsMessage }
|
30 |
+
</Notice>
|
31 |
+
);
|
32 |
+
}
|
33 |
+
|
34 |
+
if ( options.length > 1 ) {
|
35 |
+
return (
|
36 |
+
<RadioControl
|
37 |
+
className={ className }
|
38 |
+
onChange={ onChange }
|
39 |
+
selected={ selected }
|
40 |
+
options={ options.map( renderOption ) }
|
41 |
+
/>
|
42 |
+
);
|
43 |
+
}
|
44 |
+
|
45 |
+
const {
|
46 |
+
label,
|
47 |
+
secondaryLabel,
|
48 |
+
description,
|
49 |
+
secondaryDescription,
|
50 |
+
} = renderOption( options[ 0 ] );
|
51 |
+
|
52 |
+
return (
|
53 |
+
<RadioControlOptionLayout
|
54 |
+
label={ label }
|
55 |
+
secondaryLabel={ secondaryLabel }
|
56 |
+
description={ description }
|
57 |
+
secondaryDescription={ secondaryDescription }
|
58 |
+
/>
|
59 |
+
);
|
60 |
+
};
|
61 |
+
|
62 |
+
PackageOptions.propTypes = {
|
63 |
+
onChange: PropTypes.func.isRequired,
|
64 |
+
options: PropTypes.arrayOf( PropTypes.object ).isRequired,
|
65 |
+
renderOption: PropTypes.func.isRequired,
|
66 |
+
className: PropTypes.string,
|
67 |
+
noResultsMessage: PropTypes.string,
|
68 |
+
selected: PropTypes.string,
|
69 |
+
};
|
70 |
+
|
71 |
+
export default PackageOptions;
|
assets/js/base/components/cart-checkout/shipping-rates-control/package.js
ADDED
@@ -0,0 +1,126 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { _n, sprintf } from '@wordpress/i18n';
|
6 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
7 |
+
import Label from '@woocommerce/base-components/label';
|
8 |
+
import Title from '@woocommerce/base-components/title';
|
9 |
+
import Panel from '@woocommerce/base-components/panel';
|
10 |
+
import classNames from 'classnames';
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Internal dependencies
|
14 |
+
*/
|
15 |
+
import PackageOptions from './package-options';
|
16 |
+
import './style.scss';
|
17 |
+
|
18 |
+
const Package = ( {
|
19 |
+
className,
|
20 |
+
collapsible = false,
|
21 |
+
noResultsMessage,
|
22 |
+
onChange,
|
23 |
+
renderOption,
|
24 |
+
selected,
|
25 |
+
shippingRate,
|
26 |
+
showItems,
|
27 |
+
title,
|
28 |
+
} ) => {
|
29 |
+
const header = (
|
30 |
+
<>
|
31 |
+
{ title && (
|
32 |
+
<Title
|
33 |
+
className="wc-block-components-shipping-rates-control__package-title"
|
34 |
+
headingLevel="3"
|
35 |
+
>
|
36 |
+
{ title }
|
37 |
+
</Title>
|
38 |
+
) }
|
39 |
+
{ showItems && (
|
40 |
+
<ul className="wc-block-components-shipping-rates-control__package-items">
|
41 |
+
{ Object.values( shippingRate.items ).map( ( v ) => {
|
42 |
+
const name = decodeEntities( v.name );
|
43 |
+
const quantity = v.quantity;
|
44 |
+
return (
|
45 |
+
<li
|
46 |
+
key={ name }
|
47 |
+
className="wc-block-components-shipping-rates-control__package-item"
|
48 |
+
>
|
49 |
+
<Label
|
50 |
+
label={ `${ name } ×${ quantity }` }
|
51 |
+
screenReaderLabel={ sprintf(
|
52 |
+
// translators: %s name of the product (ie: Sunglasses), %d number of units in the current cart package
|
53 |
+
_n(
|
54 |
+
'%s (%d unit)',
|
55 |
+
'%s (%d units)',
|
56 |
+
quantity,
|
57 |
+
'woo-gutenberg-products-block'
|
58 |
+
),
|
59 |
+
name,
|
60 |
+
quantity
|
61 |
+
) }
|
62 |
+
/>
|
63 |
+
</li>
|
64 |
+
);
|
65 |
+
} ) }
|
66 |
+
</ul>
|
67 |
+
) }
|
68 |
+
</>
|
69 |
+
);
|
70 |
+
const body = (
|
71 |
+
<PackageOptions
|
72 |
+
className={ className }
|
73 |
+
noResultsMessage={ noResultsMessage }
|
74 |
+
onChange={ onChange }
|
75 |
+
options={ shippingRate.shipping_rates }
|
76 |
+
renderOption={ renderOption }
|
77 |
+
selected={ selected }
|
78 |
+
/>
|
79 |
+
);
|
80 |
+
if ( collapsible ) {
|
81 |
+
return (
|
82 |
+
<Panel
|
83 |
+
className="wc-block-components-shipping-rates-control__package"
|
84 |
+
hasBorder={ true }
|
85 |
+
initialOpen={ true }
|
86 |
+
title={ header }
|
87 |
+
>
|
88 |
+
{ body }
|
89 |
+
</Panel>
|
90 |
+
);
|
91 |
+
}
|
92 |
+
return (
|
93 |
+
<div
|
94 |
+
className={ classNames(
|
95 |
+
'wc-block-components-shipping-rates-control__package',
|
96 |
+
className
|
97 |
+
) }
|
98 |
+
>
|
99 |
+
{ header }
|
100 |
+
{ body }
|
101 |
+
</div>
|
102 |
+
);
|
103 |
+
};
|
104 |
+
|
105 |
+
Package.propTypes = {
|
106 |
+
onChange: PropTypes.func.isRequired,
|
107 |
+
renderOption: PropTypes.func.isRequired,
|
108 |
+
shippingRate: PropTypes.shape( {
|
109 |
+
shipping_rates: PropTypes.arrayOf( PropTypes.object ).isRequired,
|
110 |
+
items: PropTypes.arrayOf(
|
111 |
+
PropTypes.shape( {
|
112 |
+
name: PropTypes.string.isRequired,
|
113 |
+
key: PropTypes.string.isRequired,
|
114 |
+
quantity: PropTypes.number.isRequired,
|
115 |
+
} ).isRequired
|
116 |
+
).isRequired,
|
117 |
+
} ).isRequired,
|
118 |
+
className: PropTypes.string,
|
119 |
+
collapsible: PropTypes.bool,
|
120 |
+
noResultsMessage: PropTypes.string,
|
121 |
+
selected: PropTypes.string,
|
122 |
+
showItems: PropTypes.bool,
|
123 |
+
title: PropTypes.string,
|
124 |
+
};
|
125 |
+
|
126 |
+
export default Package;
|
assets/js/base/components/cart-checkout/shipping-rates-control/packages.js
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import { useSelectShippingRate } from '@woocommerce/base-hooks';
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Internal dependencies
|
9 |
+
*/
|
10 |
+
import Package from './package';
|
11 |
+
import './style.scss';
|
12 |
+
|
13 |
+
const Packages = ( {
|
14 |
+
className,
|
15 |
+
collapsible = false,
|
16 |
+
noResultsMessage,
|
17 |
+
renderOption,
|
18 |
+
shippingRates = [],
|
19 |
+
} ) => {
|
20 |
+
const { selectShippingRate, selectedShippingRates } = useSelectShippingRate(
|
21 |
+
shippingRates
|
22 |
+
);
|
23 |
+
/* eslint-disable camelcase */
|
24 |
+
return (
|
25 |
+
<div className="wc-block-components-shipping-rates-control">
|
26 |
+
{ shippingRates.map( ( { package_id, ...shippingRate } ) => (
|
27 |
+
<Package
|
28 |
+
key={ package_id }
|
29 |
+
className={ className }
|
30 |
+
collapsible={ collapsible }
|
31 |
+
noResultsMessage={ noResultsMessage }
|
32 |
+
onChange={ ( newShippingRate ) => {
|
33 |
+
selectShippingRate( newShippingRate, package_id );
|
34 |
+
} }
|
35 |
+
renderOption={ renderOption }
|
36 |
+
selected={ selectedShippingRates[ package_id ] }
|
37 |
+
shippingRate={ shippingRate }
|
38 |
+
showItems={ shippingRates.length > 1 }
|
39 |
+
title={
|
40 |
+
shippingRates.length > 1 ? shippingRate.name : null
|
41 |
+
}
|
42 |
+
/>
|
43 |
+
) ) }
|
44 |
+
</div>
|
45 |
+
);
|
46 |
+
/* eslint-enable */
|
47 |
+
};
|
48 |
+
|
49 |
+
Packages.propTypes = {
|
50 |
+
renderOption: PropTypes.func.isRequired,
|
51 |
+
className: PropTypes.string,
|
52 |
+
collapsible: PropTypes.bool,
|
53 |
+
noResultsMessage: PropTypes.string,
|
54 |
+
shippingRates: PropTypes.arrayOf(
|
55 |
+
PropTypes.shape( {
|
56 |
+
items: PropTypes.arrayOf(
|
57 |
+
PropTypes.shape( {
|
58 |
+
key: PropTypes.string,
|
59 |
+
name: PropTypes.string,
|
60 |
+
quantity: PropTypes.number,
|
61 |
+
} )
|
62 |
+
).isRequired,
|
63 |
+
package_id: PropTypes.number,
|
64 |
+
name: PropTypes.string,
|
65 |
+
destination: PropTypes.object,
|
66 |
+
shipping_rates: PropTypes.arrayOf( PropTypes.object ),
|
67 |
+
} ).isRequired
|
68 |
+
).isRequired,
|
69 |
+
};
|
70 |
+
|
71 |
+
export default Packages;
|
assets/js/base/components/cart-checkout/shipping-rates-control/style.scss
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.wc-block-components-shipping-rates-control__package {
|
2 |
+
.wc-block-components-shipping-rates-control__package-title {
|
3 |
+
margin: 0;
|
4 |
+
}
|
5 |
+
}
|
6 |
+
|
7 |
+
.wc-block-components-shipping-rates-control__package-items {
|
8 |
+
@include font-size(small);
|
9 |
+
display: block;
|
10 |
+
list-style: none;
|
11 |
+
margin: 0;
|
12 |
+
padding: 0;
|
13 |
+
}
|
14 |
+
|
15 |
+
.wc-block-components-shipping-rates-control__package-item {
|
16 |
+
@include wrap-break-word();
|
17 |
+
display: inline-block;
|
18 |
+
margin: 0;
|
19 |
+
padding: 0;
|
20 |
+
}
|
21 |
+
|
22 |
+
.wc-block-components-shipping-rates-control__package-item:not(:last-child)::after {
|
23 |
+
content: ", ";
|
24 |
+
white-space: pre;
|
25 |
+
}
|
26 |
+
|
27 |
+
.components-notice.wc-block-components-shipping-rates-control__no-results-notice {
|
28 |
+
margin-bottom: 0;
|
29 |
+
}
|
30 |
+
|
31 |
+
.wc-block-components-shipping-rates-control {
|
32 |
+
.wc-blocks-components-panel__content {
|
33 |
+
padding-bottom: 0;
|
34 |
+
}
|
35 |
+
}
|
assets/js/base/components/cart-checkout/totals/discount/stories/index.js
DELETED
@@ -1,37 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { text, boolean } from '@storybook/addon-knobs';
|
5 |
-
import { currencyKnob } from '@woocommerce/knobs';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import TotalsDiscount from '../';
|
11 |
-
|
12 |
-
export default {
|
13 |
-
title:
|
14 |
-
'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsDiscount',
|
15 |
-
component: TotalsDiscount,
|
16 |
-
};
|
17 |
-
|
18 |
-
export const Default = () => {
|
19 |
-
const cartCoupons = [ { code: 'COUPON' } ];
|
20 |
-
const currency = currencyKnob();
|
21 |
-
const isRemovingCoupon = boolean( 'Toggle isRemovingCoupon state', false );
|
22 |
-
const totalDiscount = text( 'Total discount', '1000' );
|
23 |
-
const totalDiscountTax = text( 'Total discount tax', '200' );
|
24 |
-
|
25 |
-
return (
|
26 |
-
<TotalsDiscount
|
27 |
-
cartCoupons={ cartCoupons }
|
28 |
-
currency={ currency }
|
29 |
-
isRemovingCoupon={ isRemovingCoupon }
|
30 |
-
removeCoupon={ () => void null }
|
31 |
-
values={ {
|
32 |
-
total_discount: totalDiscount,
|
33 |
-
total_discount_tax: totalDiscountTax,
|
34 |
-
} }
|
35 |
-
/>
|
36 |
-
);
|
37 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/totals/discount/style.scss
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
.wc-block-components-totals-discount__coupon-list {
|
2 |
-
list-style: none;
|
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 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/totals/footer-item/stories/index.js
DELETED
@@ -1,32 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { text } from '@storybook/addon-knobs';
|
5 |
-
import { currencyKnob } from '@woocommerce/knobs';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import TotalsFooterItem from '../';
|
11 |
-
|
12 |
-
export default {
|
13 |
-
title:
|
14 |
-
'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsFooterItem',
|
15 |
-
component: TotalsFooterItem,
|
16 |
-
};
|
17 |
-
|
18 |
-
export const Default = () => {
|
19 |
-
const currency = currencyKnob();
|
20 |
-
const totalPrice = text( 'Total price', '1200' );
|
21 |
-
const totalTax = text( 'Total tax', '200' );
|
22 |
-
|
23 |
-
return (
|
24 |
-
<TotalsFooterItem
|
25 |
-
currency={ currency }
|
26 |
-
values={ {
|
27 |
-
total_price: totalPrice,
|
28 |
-
total_tax: totalTax,
|
29 |
-
} }
|
30 |
-
/>
|
31 |
-
);
|
32 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/index.js
CHANGED
@@ -1,4 +1,8 @@
|
|
1 |
-
export { default as
|
2 |
-
export { default as
|
3 |
-
export { default as
|
4 |
-
export { default as
|
|
|
|
|
|
|
|
1 |
+
export { default as SubtotalsItem } from './subtotals-item';
|
2 |
+
export { default as TotalsCouponCodeInput } from './totals-coupon-code-input';
|
3 |
+
export { default as TotalsDiscountItem } from './totals-discount-item';
|
4 |
+
export { default as TotalsFeesItem } from './totals-fees-item';
|
5 |
+
export { default as TotalsFooterItem } from './totals-footer-item';
|
6 |
+
export { default as TotalsItem } from './totals-item';
|
7 |
+
export { default as TotalsShippingItem } from './totals-shipping-item';
|
8 |
+
export { default as TotalsTaxesItem } from './totals-taxes-item';
|
assets/js/base/components/cart-checkout/totals/shipping/index.tsx
DELETED
@@ -1,215 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import classnames from 'classnames';
|
5 |
-
import { __ } from '@wordpress/i18n';
|
6 |
-
import { useState } from '@wordpress/element';
|
7 |
-
import { useStoreCart } from '@woocommerce/base-context/hooks';
|
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 |
-
interface CalculatorButtonProps {
|
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 |
-
}: TotalShippingProps ): ReactElement => {
|
127 |
-
const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
|
128 |
-
false
|
129 |
-
);
|
130 |
-
const {
|
131 |
-
shippingAddress,
|
132 |
-
cartHasCalculatedShipping,
|
133 |
-
shippingRates,
|
134 |
-
shippingRatesLoading,
|
135 |
-
} = useStoreCart();
|
136 |
-
|
137 |
-
const totalShippingValue = getSetting(
|
138 |
-
'displayCartPricesIncludingTax',
|
139 |
-
false
|
140 |
-
)
|
141 |
-
? parseInt( values.total_shipping, 10 ) +
|
142 |
-
parseInt( values.total_shipping_tax, 10 )
|
143 |
-
: parseInt( values.total_shipping, 10 );
|
144 |
-
const hasRates = hasShippingRate( shippingRates ) || totalShippingValue;
|
145 |
-
const calculatorButtonProps = {
|
146 |
-
isShippingCalculatorOpen,
|
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(
|
161 |
-
'wc-block-components-totals-shipping',
|
162 |
-
className
|
163 |
-
) }
|
164 |
-
>
|
165 |
-
<TotalsItem
|
166 |
-
label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
|
167 |
-
value={
|
168 |
-
cartHasCalculatedShipping ? (
|
169 |
-
totalShippingValue
|
170 |
-
) : (
|
171 |
-
<NoShippingPlaceholder
|
172 |
-
showCalculator={ showCalculator }
|
173 |
-
{ ...calculatorButtonProps }
|
174 |
-
/>
|
175 |
-
)
|
176 |
-
}
|
177 |
-
description={
|
178 |
-
<>
|
179 |
-
{ cartHasCalculatedShipping && (
|
180 |
-
<>
|
181 |
-
<ShippingVia
|
182 |
-
selectedShippingRates={
|
183 |
-
selectedShippingRates
|
184 |
-
}
|
185 |
-
/>
|
186 |
-
<ShippingAddress
|
187 |
-
shippingAddress={ shippingAddress }
|
188 |
-
showCalculator={ showCalculator }
|
189 |
-
{ ...calculatorButtonProps }
|
190 |
-
/>
|
191 |
-
</>
|
192 |
-
) }
|
193 |
-
</>
|
194 |
-
}
|
195 |
-
currency={ currency }
|
196 |
-
/>
|
197 |
-
{ showCalculator && isShippingCalculatorOpen && (
|
198 |
-
<ShippingCalculator
|
199 |
-
onUpdate={ () => {
|
200 |
-
setIsShippingCalculatorOpen( false );
|
201 |
-
} }
|
202 |
-
/>
|
203 |
-
) }
|
204 |
-
{ showRateSelector && cartHasCalculatedShipping && (
|
205 |
-
<ShippingRateSelector
|
206 |
-
hasRates={ hasRates }
|
207 |
-
shippingRates={ shippingRates }
|
208 |
-
shippingRatesLoading={ shippingRatesLoading }
|
209 |
-
/>
|
210 |
-
) }
|
211 |
-
</div>
|
212 |
-
);
|
213 |
-
};
|
214 |
-
|
215 |
-
export default TotalsShipping;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/totals/shipping/shipping-rate-selector.js
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { __ } from '@wordpress/i18n';
|
5 |
-
import { Notice } from 'wordpress-components';
|
6 |
-
import classnames from 'classnames';
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Internal dependencies
|
10 |
-
*/
|
11 |
-
import ShippingRatesControl from '../../shipping-rates-control';
|
12 |
-
|
13 |
-
const ShippingRateSelector = ( {
|
14 |
-
hasRates,
|
15 |
-
shippingRates,
|
16 |
-
shippingRatesLoading,
|
17 |
-
} ) => {
|
18 |
-
const legend = hasRates
|
19 |
-
? __( 'Shipping options', 'woo-gutenberg-products-block' )
|
20 |
-
: __( 'Choose a shipping option', 'woo-gutenberg-products-block' );
|
21 |
-
return (
|
22 |
-
<fieldset className="wc-block-components-totals-shipping__fieldset">
|
23 |
-
<legend className="screen-reader-text">{ legend }</legend>
|
24 |
-
<ShippingRatesControl
|
25 |
-
className="wc-block-components-totals-shipping__options"
|
26 |
-
collapsible={ true }
|
27 |
-
noResultsMessage={
|
28 |
-
<Notice
|
29 |
-
isDismissible={ false }
|
30 |
-
className={ classnames(
|
31 |
-
'wc-block-components-shipping-rates-control__no-results-notice',
|
32 |
-
'woocommerce-error'
|
33 |
-
) }
|
34 |
-
>
|
35 |
-
{ __(
|
36 |
-
'No shipping options were found.',
|
37 |
-
'woo-gutenberg-products-block'
|
38 |
-
) }
|
39 |
-
</Notice>
|
40 |
-
}
|
41 |
-
shippingRates={ shippingRates }
|
42 |
-
shippingRatesLoading={ shippingRatesLoading }
|
43 |
-
/>
|
44 |
-
</fieldset>
|
45 |
-
);
|
46 |
-
};
|
47 |
-
|
48 |
-
export default ShippingRateSelector;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/stories/index.js
DELETED
@@ -1,35 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { boolean, text } from '@storybook/addon-knobs';
|
5 |
-
import { currencyKnob } from '@woocommerce/knobs';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import TotalsShipping from '../';
|
11 |
-
|
12 |
-
export default {
|
13 |
-
title: 'WooCommerce Blocks/@blocks-checkout/TotalsShipping',
|
14 |
-
component: TotalsShipping,
|
15 |
-
};
|
16 |
-
|
17 |
-
export const Default = () => {
|
18 |
-
const currency = currencyKnob();
|
19 |
-
const showCalculator = boolean( 'Show calculator', true );
|
20 |
-
const showRateSelector = boolean( 'Show rate selector', true );
|
21 |
-
const totalShipping = text( 'Total shipping', '1000' );
|
22 |
-
const totalShippingTax = text( 'Total shipping tax', '200' );
|
23 |
-
|
24 |
-
return (
|
25 |
-
<TotalsShipping
|
26 |
-
currency={ currency }
|
27 |
-
showCalculator={ showCalculator }
|
28 |
-
showRateSelector={ showRateSelector }
|
29 |
-
values={ {
|
30 |
-
total_shipping: totalShipping,
|
31 |
-
total_shipping_tax: totalShippingTax,
|
32 |
-
} }
|
33 |
-
/>
|
34 |
-
);
|
35 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/cart-checkout/totals/subtotals-item/index.js
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Internal dependencies
|
10 |
+
*/
|
11 |
+
import TotalsItem from '../totals-item';
|
12 |
+
|
13 |
+
const SubtotalsItem = ( { currency, values } ) => {
|
14 |
+
const { total_items: totalItems, total_items_tax: totalItemsTax } = values;
|
15 |
+
const itemsValue = parseInt( totalItems, 10 );
|
16 |
+
const itemsTaxValue = parseInt( totalItemsTax, 10 );
|
17 |
+
|
18 |
+
return (
|
19 |
+
<TotalsItem
|
20 |
+
currency={ currency }
|
21 |
+
label={ __( 'Subtotal', 'woo-gutenberg-products-block' ) }
|
22 |
+
value={
|
23 |
+
DISPLAY_CART_PRICES_INCLUDING_TAX
|
24 |
+
? itemsValue + itemsTaxValue
|
25 |
+
: itemsValue
|
26 |
+
}
|
27 |
+
/>
|
28 |
+
);
|
29 |
+
};
|
30 |
+
|
31 |
+
SubtotalsItem.propTypes = {
|
32 |
+
currency: PropTypes.object.isRequired,
|
33 |
+
values: PropTypes.shape( {
|
34 |
+
total_items: PropTypes.string,
|
35 |
+
total_items_tax: PropTypes.string,
|
36 |
+
} ).isRequired,
|
37 |
+
};
|
38 |
+
|
39 |
+
export default SubtotalsItem;
|
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/index.js
RENAMED
@@ -6,21 +6,19 @@ 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 |
-
|
14 |
-
useValidationContext,
|
15 |
-
} from '@woocommerce/base-context';
|
16 |
-
import { Panel } from '@woocommerce/blocks-checkout';
|
17 |
|
18 |
/**
|
19 |
* Internal dependencies
|
20 |
*/
|
21 |
import './style.scss';
|
22 |
|
23 |
-
const
|
24 |
instanceId,
|
25 |
isLoading = false,
|
26 |
initialOpen = false,
|
@@ -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={ __(
|
@@ -113,9 +113,9 @@ const TotalsCoupon = ( {
|
|
113 |
);
|
114 |
};
|
115 |
|
116 |
-
|
117 |
onSubmit: PropTypes.func,
|
118 |
isLoading: PropTypes.bool,
|
119 |
};
|
120 |
|
121 |
-
export default withInstanceId(
|
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/base-components/panel';
|
|
|
|
|
|
|
15 |
|
16 |
/**
|
17 |
* Internal dependencies
|
18 |
*/
|
19 |
import './style.scss';
|
20 |
|
21 |
+
const TotalsCouponCodeInput = ( {
|
22 |
instanceId,
|
23 |
isLoading = false,
|
24 |
initialOpen = false,
|
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={ __(
|
113 |
);
|
114 |
};
|
115 |
|
116 |
+
TotalsCouponCodeInput.propTypes = {
|
117 |
onSubmit: PropTypes.func,
|
118 |
isLoading: PropTypes.bool,
|
119 |
};
|
120 |
|
121 |
+
export default withInstanceId( TotalsCouponCodeInput );
|
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/stories/index.js
RENAMED
@@ -10,12 +10,11 @@ import {
|
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
-
import
|
14 |
|
15 |
export default {
|
16 |
-
title:
|
17 |
-
|
18 |
-
component: TotalsCoupon,
|
19 |
};
|
20 |
|
21 |
const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
|
@@ -25,7 +24,7 @@ const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
|
|
25 |
setValidationErrors( { coupon: invalidCouponText } );
|
26 |
}
|
27 |
};
|
28 |
-
return <
|
29 |
};
|
30 |
|
31 |
export const Default = () => {
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
+
import CouponInput from '../';
|
14 |
|
15 |
export default {
|
16 |
+
title: 'WooCommerce Blocks/@base-components/CouponInput',
|
17 |
+
component: CouponInput,
|
|
|
18 |
};
|
19 |
|
20 |
const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
|
24 |
setValidationErrors( { coupon: invalidCouponText } );
|
25 |
}
|
26 |
};
|
27 |
+
return <CouponInput isLoading={ isLoading } onSubmit={ onSubmit } />;
|
28 |
};
|
29 |
|
30 |
export const Default = () => {
|
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/style.scss
RENAMED
@@ -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;
|
@@ -22,20 +10,22 @@
|
|
22 |
}
|
23 |
|
24 |
.wc-block-components-totals-coupon__button {
|
25 |
-
height:
|
26 |
flex-shrink: 0;
|
27 |
margin-left: $gap-smaller;
|
28 |
padding-left: $gap-large;
|
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;
|
10 |
}
|
11 |
|
12 |
.wc-block-components-totals-coupon__button {
|
13 |
+
height: 48px;
|
14 |
flex-shrink: 0;
|
15 |
margin-left: $gap-smaller;
|
16 |
padding-left: $gap-large;
|
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 → totals-discount-item}/index.js
RENAMED
@@ -2,21 +2,18 @@
|
|
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
|
16 |
*/
|
|
|
17 |
import './style.scss';
|
18 |
|
19 |
-
const
|
20 |
cartCoupons = [],
|
21 |
currency,
|
22 |
isRemovingCoupon,
|
@@ -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 |
)
|
@@ -108,7 +92,7 @@ const TotalsDiscount = ( {
|
|
108 |
);
|
109 |
};
|
110 |
|
111 |
-
|
112 |
cartCoupons: PropTypes.arrayOf(
|
113 |
PropTypes.shape( {
|
114 |
code: PropTypes.string.isRequired,
|
@@ -123,4 +107,4 @@ TotalsDiscount.propTypes = {
|
|
123 |
} ).isRequired,
|
124 |
};
|
125 |
|
126 |
-
export default
|
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 |
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
+
import TotalsItem from '../totals-item';
|
14 |
import './style.scss';
|
15 |
|
16 |
+
const TotalsDiscountItem = ( {
|
17 |
cartCoupons = [],
|
18 |
currency,
|
19 |
isRemovingCoupon,
|
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 |
)
|
92 |
);
|
93 |
};
|
94 |
|
95 |
+
TotalsDiscountItem.propTypes = {
|
96 |
cartCoupons: PropTypes.arrayOf(
|
97 |
PropTypes.shape( {
|
98 |
code: PropTypes.string.isRequired,
|
107 |
} ).isRequired,
|
108 |
};
|
109 |
|
110 |
+
export default TotalsDiscountItem;
|
assets/js/base/components/cart-checkout/totals/totals-discount-item/style.scss
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.wc-block-components-totals-discount__coupon-list {
|
2 |
+
list-style: none;
|
3 |
+
margin: 0;
|
4 |
+
padding: 0;
|
5 |
+
}
|
assets/js/base/components/cart-checkout/totals/totals-fees-item/index.js
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
|
6 |
+
import { useShippingDataContext } from '@woocommerce/base-context';
|
7 |
+
import PropTypes from 'prop-types';
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Internal dependencies
|
11 |
+
*/
|
12 |
+
import TotalsItem from '../totals-item';
|
13 |
+
|
14 |
+
const TotalsFeesItem = ( { currency, values } ) => {
|
15 |
+
const { needsShipping } = useShippingDataContext();
|
16 |
+
if ( ! needsShipping ) {
|
17 |
+
return null;
|
18 |
+
}
|
19 |
+
const { total_fees: totalFees, total_fees_tax: totalFeesTax } = values;
|
20 |
+
const feesValue = parseInt( totalFees, 10 );
|
21 |
+
|
22 |
+
if ( ! feesValue ) {
|
23 |
+
return null;
|
24 |
+
}
|
25 |
+
|
26 |
+
const feesTaxValue = parseInt( totalFeesTax, 10 );
|
27 |
+
|
28 |
+
return (
|
29 |
+
<TotalsItem
|
30 |
+
className="wc-block-components-totals-fees"
|
31 |
+
currency={ currency }
|
32 |
+
label={ __( 'Fees', 'woo-gutenberg-products-block' ) }
|
33 |
+
value={
|
34 |
+
DISPLAY_CART_PRICES_INCLUDING_TAX
|
35 |
+
? feesValue + feesTaxValue
|
36 |
+
: feesValue
|
37 |
+
}
|
38 |
+
/>
|
39 |
+
);
|
40 |
+
};
|
41 |
+
|
42 |
+
TotalsFeesItem.propTypes = {
|
43 |
+
currency: PropTypes.object.isRequired,
|
44 |
+
values: PropTypes.shape( {
|
45 |
+
total_fees: PropTypes.string,
|
46 |
+
total_fees_tax: PropTypes.string,
|
47 |
+
} ).isRequired,
|
48 |
+
};
|
49 |
+
|
50 |
+
export default TotalsFeesItem;
|
assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/index.js
RENAMED
@@ -2,52 +2,30 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
-
import {
|
|
|
6 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
7 |
import PropTypes from 'prop-types';
|
8 |
-
import {
|
9 |
-
__experimentalApplyCheckoutFilter,
|
10 |
-
TotalsItem,
|
11 |
-
} from '@woocommerce/blocks-checkout';
|
12 |
-
import { useStoreCart } from '@woocommerce/base-context/hooks';
|
13 |
-
import { getSetting } from '@woocommerce/settings';
|
14 |
|
15 |
/**
|
16 |
* Internal dependencies
|
17 |
*/
|
|
|
18 |
import './style.scss';
|
19 |
|
20 |
const TotalsFooterItem = ( { currency, values } ) => {
|
21 |
-
const SHOW_TAXES =
|
22 |
-
getSetting( 'taxesEnabled', true ) &&
|
23 |
-
getSetting( 'displayCartPricesIncludingTax', false );
|
24 |
-
|
25 |
const { total_price: totalPrice, total_tax: totalTax } = values;
|
26 |
|
27 |
-
// Prepare props to pass to the __experimentalApplyCheckoutFilter filter.
|
28 |
-
// We need to pluck out receiveCart.
|
29 |
-
// eslint-disable-next-line no-unused-vars
|
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
|
42 |
className="wc-block-components-totals-footer-item"
|
43 |
currency={ currency }
|
44 |
-
label={
|
45 |
value={ parseInt( totalPrice, 10 ) }
|
46 |
description={
|
47 |
-
|
48 |
-
parsedTaxValue !== 0 && (
|
49 |
<p className="wc-block-components-totals-footer-item-tax">
|
50 |
-
{
|
51 |
__(
|
52 |
'Including <TaxAmount/> in taxes',
|
53 |
'woo-gutenberg-products-block'
|
@@ -57,7 +35,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 { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
|
6 |
+
import { __experimentalCreateInterpolateElement } from 'wordpress-element';
|
7 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
8 |
import PropTypes from 'prop-types';
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
+
import TotalsItem from '../totals-item';
|
14 |
import './style.scss';
|
15 |
|
16 |
const TotalsFooterItem = ( { currency, values } ) => {
|
|
|
|
|
|
|
|
|
17 |
const { total_price: totalPrice, total_tax: totalTax } = values;
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
return (
|
20 |
<TotalsItem
|
21 |
className="wc-block-components-totals-footer-item"
|
22 |
currency={ currency }
|
23 |
+
label={ __( 'Total', 'woo-gutenberg-products-block' ) }
|
24 |
value={ parseInt( totalPrice, 10 ) }
|
25 |
description={
|
26 |
+
DISPLAY_CART_PRICES_INCLUDING_TAX && (
|
|
|
27 |
<p className="wc-block-components-totals-footer-item-tax">
|
28 |
+
{ __experimentalCreateInterpolateElement(
|
29 |
__(
|
30 |
'Including <TaxAmount/> in taxes',
|
31 |
'woo-gutenberg-products-block'
|
35 |
<FormattedMonetaryAmount
|
36 |
className="wc-block-components-totals-footer-item-tax-value"
|
37 |
currency={ currency }
|
38 |
+
displayType="text"
|
39 |
+
value={ parseInt( totalTax, 10 ) }
|
40 |
/>
|
41 |
),
|
42 |
}
|
assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/style.scss
RENAMED
@@ -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/totals-item/index.js
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import PropTypes from 'prop-types';
|
5 |
+
import classnames from 'classnames';
|
6 |
+
import { isValidElement } from '@wordpress/element';
|
7 |
+
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Internal dependencies
|
11 |
+
*/
|
12 |
+
import './style.scss';
|
13 |
+
|
14 |
+
const TotalsItem = ( { className, currency, label, value, description } ) => {
|
15 |
+
return (
|
16 |
+
<div
|
17 |
+
className={ classnames(
|
18 |
+
'wc-block-components-totals-item',
|
19 |
+
className
|
20 |
+
) }
|
21 |
+
>
|
22 |
+
<span className="wc-block-components-totals-item__label">
|
23 |
+
{ label }
|
24 |
+
</span>
|
25 |
+
{ isValidElement( value ) ? (
|
26 |
+
<div className="wc-block-components-totals-item__value">
|
27 |
+
{ value }
|
28 |
+
</div>
|
29 |
+
) : (
|
30 |
+
<FormattedMonetaryAmount
|
31 |
+
className="wc-block-components-totals-item__value"
|
32 |
+
currency={ currency }
|
33 |
+
displayType="text"
|
34 |
+
value={ value }
|
35 |
+
/>
|
36 |
+
) }
|
37 |
+
<div className="wc-block-components-totals-item__description">
|
38 |
+
{ description }
|
39 |
+
</div>
|
40 |
+
</div>
|
41 |
+
);
|
42 |
+
};
|
43 |
+
|
44 |
+
TotalsItem.propTypes = {
|
45 |
+
currency: PropTypes.object,
|
46 |
+
label: PropTypes.string.isRequired,
|
47 |
+
value: PropTypes.oneOfType( [ PropTypes.number, PropTypes.node ] ),
|
48 |
+
className: PropTypes.string,
|
49 |
+
description: PropTypes.node,
|
50 |
+
};
|
51 |
+
|
52 |
+
export default TotalsItem;
|
{packages/checkout/totals/item → assets/js/base/components/cart-checkout/totals/totals-item}/style.scss
RENAMED
@@ -1,20 +1,16 @@
|
|
1 |
.wc-block-components-totals-item {
|
2 |
display: flex;
|
3 |
flex-wrap: wrap;
|
4 |
-
|
5 |
width: 100%;
|
6 |
-
|
7 |
-
&:first-child {
|
8 |
-
margin-top: 0;
|
9 |
-
}
|
10 |
}
|
11 |
|
12 |
.wc-block-components-totals-item__label {
|
13 |
flex-grow: 1;
|
|
|
14 |
}
|
15 |
|
16 |
.wc-block-components-totals-item__value {
|
17 |
-
font-weight: bold;
|
18 |
white-space: nowrap;
|
19 |
}
|
20 |
|
1 |
.wc-block-components-totals-item {
|
2 |
display: flex;
|
3 |
flex-wrap: wrap;
|
4 |
+
padding: em($gap-small) 0;
|
5 |
width: 100%;
|
|
|
|
|
|
|
|
|
6 |
}
|
7 |
|
8 |
.wc-block-components-totals-item__label {
|
9 |
flex-grow: 1;
|
10 |
+
font-weight: bold;
|
11 |
}
|
12 |
|
13 |
.wc-block-components-totals-item__value {
|
|
|
14 |
white-space: nowrap;
|
15 |
}
|
16 |
|
assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/has-shipping-rate.js
RENAMED
File without changes
|
assets/js/base/components/cart-checkout/totals/totals-shipping-item/index.js
ADDED
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
|
6 |
+
import {
|
7 |
+
ShippingCalculator,
|
8 |
+
ShippingLocation,
|
9 |
+
} from '@woocommerce/base-components/cart-checkout';
|
10 |
+
import PropTypes from 'prop-types';
|
11 |
+
import { useState } from '@wordpress/element';
|
12 |
+
import { useStoreCart } from '@woocommerce/base-hooks';
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Internal dependencies
|
16 |
+
*/
|
17 |
+
import TotalsItem from '../totals-item';
|
18 |
+
import ShippingRateSelector from './shipping-rate-selector';
|
19 |
+
import hasShippingRate from './has-shipping-rate';
|
20 |
+
import './style.scss';
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Renders the shipping totals row, rates, and calculator if enabled.
|
24 |
+
*/
|
25 |
+
const TotalsShippingItem = ( {
|
26 |
+
currency,
|
27 |
+
values,
|
28 |
+
isCheckout = false,
|
29 |
+
showCalculator = true,
|
30 |
+
showRatesWithoutAddress = false,
|
31 |
+
} ) => {
|
32 |
+
const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
|
33 |
+
false
|
34 |
+
);
|
35 |
+
const {
|
36 |
+
shippingRates,
|
37 |
+
shippingRatesLoading,
|
38 |
+
hasShippingAddress,
|
39 |
+
shippingAddress,
|
40 |
+
} = useStoreCart();
|
41 |
+
const totalShippingValue = DISPLAY_CART_PRICES_INCLUDING_TAX
|
42 |
+
? parseInt( values.total_shipping, 10 ) +
|
43 |
+
parseInt( values.total_shipping_tax, 10 )
|
44 |
+
: parseInt( values.total_shipping, 10 );
|
45 |
+
const hasRates = hasShippingRate( shippingRates ) || totalShippingValue;
|
46 |
+
const showingRates = showRatesWithoutAddress || hasShippingAddress;
|
47 |
+
|
48 |
+
// If we have no rates, and an address is needed.
|
49 |
+
if ( ! hasRates && ! hasShippingAddress && ! isCheckout ) {
|
50 |
+
return (
|
51 |
+
<>
|
52 |
+
<TotalsItem
|
53 |
+
className="wc-block-components-totals-shipping"
|
54 |
+
label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
|
55 |
+
value={
|
56 |
+
showCalculator ? (
|
57 |
+
<button
|
58 |
+
className="wc-block-components-totals-shipping__change-address-button"
|
59 |
+
onClick={ () => {
|
60 |
+
setIsShippingCalculatorOpen(
|
61 |
+
! isShippingCalculatorOpen
|
62 |
+
);
|
63 |
+
} }
|
64 |
+
>
|
65 |
+
{ __(
|
66 |
+
'Calculate',
|
67 |
+
'woo-gutenberg-products-block'
|
68 |
+
) }
|
69 |
+
</button>
|
70 |
+
) : (
|
71 |
+
<em>
|
72 |
+
{ __(
|
73 |
+
'Calculated during checkout',
|
74 |
+
'woo-gutenberg-products-block'
|
75 |
+
) }
|
76 |
+
</em>
|
77 |
+
)
|
78 |
+
}
|
79 |
+
/>
|
80 |
+
{ showCalculator && isShippingCalculatorOpen && (
|
81 |
+
<ShippingCalculator
|
82 |
+
onUpdate={ () => {
|
83 |
+
setIsShippingCalculatorOpen( false );
|
84 |
+
} }
|
85 |
+
/>
|
86 |
+
) }
|
87 |
+
</>
|
88 |
+
);
|
89 |
+
}
|
90 |
+
|
91 |
+
return (
|
92 |
+
<div className="wc-block-components-totals-shipping">
|
93 |
+
<TotalsItem
|
94 |
+
label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
|
95 |
+
value={ totalShippingValue ? totalShippingValue : '' }
|
96 |
+
description={
|
97 |
+
<>
|
98 |
+
<ShippingLocation address={ shippingAddress } />{ ' ' }
|
99 |
+
{ showCalculator && (
|
100 |
+
<button
|
101 |
+
className="wc-block-components-totals-shipping__change-address-button"
|
102 |
+
onClick={ () => {
|
103 |
+
setIsShippingCalculatorOpen(
|
104 |
+
! isShippingCalculatorOpen
|
105 |
+
);
|
106 |
+
} }
|
107 |
+
aria-expanded={ isShippingCalculatorOpen }
|
108 |
+
>
|
109 |
+
{ __(
|
110 |
+
'(change address)',
|
111 |
+
'woo-gutenberg-products-block'
|
112 |
+
) }
|
113 |
+
</button>
|
114 |
+
) }
|
115 |
+
</>
|
116 |
+
}
|
117 |
+
currency={ currency }
|
118 |
+
/>
|
119 |
+
{ showCalculator && isShippingCalculatorOpen && (
|
120 |
+
<ShippingCalculator
|
121 |
+
onUpdate={ () => {
|
122 |
+
setIsShippingCalculatorOpen( false );
|
123 |
+
} }
|
124 |
+
/>
|
125 |
+
) }
|
126 |
+
{ ! isCheckout && showingRates && (
|
127 |
+
<ShippingRateSelector
|
128 |
+
hasRates={ hasRates }
|
129 |
+
shippingRates={ shippingRates }
|
130 |
+
shippingRatesLoading={ shippingRatesLoading }
|
131 |
+
/>
|
132 |
+
) }
|
133 |
+
</div>
|
134 |
+
);
|
135 |
+
};
|
136 |
+
|
137 |
+
TotalsShippingItem.propTypes = {
|
138 |
+
currency: PropTypes.object.isRequired,
|
139 |
+
values: PropTypes.shape( {
|
140 |
+
total_shipping: PropTypes.string,
|
141 |
+
total_shipping_tax: PropTypes.string,
|
142 |
+
} ).isRequired,
|
143 |
+
isCheckout: PropTypes.bool,
|
144 |
+
showCalculator: PropTypes.bool,
|
145 |
+
showRatesWithoutAddress: PropTypes.bool,
|
146 |
+
};
|
147 |
+
|
148 |
+
export default TotalsShippingItem;
|
assets/js/base/components/cart-checkout/totals/totals-shipping-item/shipping-rate-selector.js
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
6 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
7 |
+
import { getCurrencyFromPriceResponse } from '@woocommerce/base-utils';
|
8 |
+
import { ShippingRatesControl } from '@woocommerce/base-components/cart-checkout';
|
9 |
+
import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
|
10 |
+
|
11 |
+
const renderShippingRatesControlOption = ( option ) => {
|
12 |
+
const priceWithTaxes = DISPLAY_CART_PRICES_INCLUDING_TAX
|
13 |
+
? parseInt( option.price, 10 ) + parseInt( option.taxes, 10 )
|
14 |
+
: parseInt( option.price, 10 );
|
15 |
+
return {
|
16 |
+
label: decodeEntities( option.name ),
|
17 |
+
value: option.rate_id,
|
18 |
+
description: (
|
19 |
+
<>
|
20 |
+
{ Number.isFinite( priceWithTaxes ) && (
|
21 |
+
<FormattedMonetaryAmount
|
22 |
+
currency={ getCurrencyFromPriceResponse( option ) }
|
23 |
+
value={ priceWithTaxes }
|
24 |
+
/>
|
25 |
+
) }
|
26 |
+
{ Number.isFinite( priceWithTaxes ) && option.delivery_time
|
27 |
+
? ' — '
|
28 |
+
: null }
|
29 |
+
{ decodeEntities( option.delivery_time ) }
|
30 |
+
</>
|
31 |
+
),
|
32 |
+
};
|
33 |
+
};
|
34 |
+
|
35 |
+
const ShippingRateSelector = ( {
|
36 |
+
hasRates,
|
37 |
+
shippingRates,
|
38 |
+
shippingRatesLoading,
|
39 |
+
} ) => {
|
40 |
+
return (
|
41 |
+
<fieldset className="wc-block-components-totals-shipping__fieldset">
|
42 |
+
<legend className="screen-reader-text">
|
43 |
+
{ hasRates
|
44 |
+
? __( 'Shipping options', 'woo-gutenberg-products-block' )
|
45 |
+
: __(
|
46 |
+
'Choose a shipping option',
|
47 |
+
'woo-gutenberg-products-block'
|
48 |
+
) }
|
49 |
+
</legend>
|
50 |
+
<ShippingRatesControl
|
51 |
+
className="wc-block-components-totals-shipping__options"
|
52 |
+
collapsibleWhenMultiple={ true }
|
53 |
+
noResultsMessage={ __(
|
54 |
+
'No shipping options were found.',
|
55 |
+
'woo-gutenberg-products-block'
|
56 |
+
) }
|
57 |
+
renderOption={ renderShippingRatesControlOption }
|
58 |
+
shippingRates={ shippingRates }
|
59 |
+
shippingRatesLoading={ shippingRatesLoading }
|
60 |
+
/>
|
61 |
+
</fieldset>
|
62 |
+
);
|
63 |
+
};
|
64 |
+
|
65 |
+
export default ShippingRateSelector;
|
assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/style.scss
RENAMED
@@ -7,10 +7,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 +17,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 +37,8 @@
|
|
34 |
opacity: 0.8;
|
35 |
}
|
36 |
}
|
37 |
-
}
|
38 |
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
}
|
7 |
border: 0;
|
8 |
}
|
9 |
|
|
|
|
|
|
|
|
|
10 |
.wc-block-components-totals-shipping__options {
|
11 |
.wc-block-components-radio-control__label,
|
12 |
.wc-block-components-radio-control__description,
|
17 |
}
|
18 |
}
|
19 |
|
20 |
+
.wc-block-components-radio-control__option,
|
21 |
+
.wc-block-components-radio-control__option-layout {
|
22 |
+
&:last-child::after {
|
23 |
+
display: none;
|
24 |
+
}
|
25 |
+
}
|
26 |
+
|
27 |
.wc-block-components-shipping-rates-control__no-results-notice {
|
28 |
+
margin-bottom: em($gap-small);
|
29 |
}
|
30 |
|
31 |
.wc-block-components-totals-shipping__change-address-button {
|
37 |
opacity: 0.8;
|
38 |
}
|
39 |
}
|
|
|
40 |
|
41 |
+
.wc-blocks-components-panel:last-child::after {
|
42 |
+
border-bottom-width: 0;
|
43 |
+
}
|
44 |
}
|
assets/js/base/components/cart-checkout/totals/totals-taxes-item/index.js
ADDED
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import PropTypes from 'prop-types';
|
6 |
+
import {
|
7 |
+
TAXES_ENABLED,
|
8 |
+
DISPLAY_ITEMIZED_TAXES,
|
9 |
+
} from '@woocommerce/block-settings';
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Internal dependencies
|
13 |
+
*/
|
14 |
+
import TotalsItem from '../totals-item';
|
15 |
+
import './style.scss';
|
16 |
+
|
17 |
+
const TotalsTaxesItem = ( { currency, values } ) => {
|
18 |
+
const { total_tax: totalTax, tax_lines: taxLines } = values;
|
19 |
+
|
20 |
+
if ( ! TAXES_ENABLED ) {
|
21 |
+
return null;
|
22 |
+
}
|
23 |
+
|
24 |
+
if ( ! DISPLAY_ITEMIZED_TAXES ) {
|
25 |
+
return (
|
26 |
+
<TotalsItem
|
27 |
+
className="wc-block-components-totals-taxes"
|
28 |
+
currency={ currency }
|
29 |
+
label={ __( 'Taxes', 'woo-gutenberg-products-block' ) }
|
30 |
+
value={ parseInt( totalTax, 10 ) }
|
31 |
+
/>
|
32 |
+
);
|
33 |
+
}
|
34 |
+
|
35 |
+
return (
|
36 |
+
<>
|
37 |
+
{ taxLines.map( ( { name, price }, i ) => (
|
38 |
+
<TotalsItem
|
39 |
+
key={ `tax-line-${ i }` }
|
40 |
+
className="wc-block-components-totals-taxes"
|
41 |
+
currency={ currency }
|
42 |
+
label={ name }
|
43 |
+
value={ parseInt( price, 10 ) }
|
44 |
+
/>
|
45 |
+
) ) }{ ' ' }
|
46 |
+
</>
|
47 |
+
);
|
48 |
+
};
|
49 |
+
|
50 |
+
TotalsTaxesItem.propTypes = {
|
51 |
+
currency: PropTypes.object.isRequired,
|
52 |
+
values: PropTypes.shape( {
|
53 |
+
total_tax: PropTypes.string,
|
54 |
+
} ).isRequired,
|
55 |
+
};
|
56 |
+
|
57 |
+
export default TotalsTaxesItem;
|
assets/js/base/components/cart-checkout/totals/totals-taxes-item/style.scss
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
1 |
+
.wc-block-components-totals-taxes {
|
2 |
+
@include with-translucent-border(1px 0 0);
|
3 |
+
}
|
assets/js/base/components/checkbox-control/index.js
CHANGED
@@ -12,14 +12,6 @@ import './style.scss';
|
|
12 |
|
13 |
/**
|
14 |
* Component used to show a checkbox control with styles.
|
15 |
-
*
|
16 |
-
* @param {Object} props Incoming props for the component.
|
17 |
-
* @param {string} props.className CSS class used.
|
18 |
-
* @param {string} props.label Label for component.
|
19 |
-
* @param {string} props.id Id for component.
|
20 |
-
* @param {string} props.instanceId Unique id for instance of component.
|
21 |
-
* @param {function():any} props.onChange Function called when input changes.
|
22 |
-
* @param {Object} props.rest Rest of properties spread.
|
23 |
*/
|
24 |
const CheckboxControl = ( {
|
25 |
className,
|
12 |
|
13 |
/**
|
14 |
* Component used to show a checkbox control with styles.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
*/
|
16 |
const CheckboxControl = ( {
|
17 |
className,
|
assets/js/base/components/checkbox-control/stories/index.js
DELETED
@@ -1,27 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { text } from '@storybook/addon-knobs';
|
5 |
-
import { useState } from 'react';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import CheckboxControl from '../';
|
11 |
-
|
12 |
-
export default {
|
13 |
-
title: 'WooCommerce Blocks/@base-components/CheckboxControl',
|
14 |
-
component: CheckboxControl,
|
15 |
-
};
|
16 |
-
|
17 |
-
export const Default = () => {
|
18 |
-
const [ checked, setChecked ] = useState( false );
|
19 |
-
|
20 |
-
return (
|
21 |
-
<CheckboxControl
|
22 |
-
label={ text( 'Label', 'Yes please' ) }
|
23 |
-
checked={ checked }
|
24 |
-
onChange={ ( value ) => setChecked( value ) }
|
25 |
-
/>
|
26 |
-
);
|
27 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/checkbox-control/style.scss
CHANGED
@@ -6,28 +6,22 @@
|
|
6 |
position: relative;
|
7 |
|
8 |
.wc-block-components-checkbox__input[type="checkbox"] {
|
9 |
-
font-size: 1em;
|
10 |
appearance: none;
|
11 |
-
border: 2px solid
|
12 |
border-radius: 2px;
|
13 |
-
height: em(
|
14 |
-
width: em(
|
15 |
margin: 0;
|
16 |
-
min-height:
|
17 |
-
min-width:
|
18 |
overflow: hidden;
|
19 |
position: static;
|
20 |
vertical-align: middle;
|
21 |
background-color: #fff;
|
22 |
|
23 |
&:checked {
|
24 |
-
background:
|
25 |
-
border-color:
|
26 |
-
}
|
27 |
-
|
28 |
-
&::before,
|
29 |
-
&::after {
|
30 |
-
content: "";
|
31 |
}
|
32 |
|
33 |
&:not(:checked) + .wc-block-components-checkbox__mark {
|
@@ -36,57 +30,33 @@
|
|
36 |
|
37 |
.has-dark-controls & {
|
38 |
border-color: $controls-border-dark;
|
39 |
-
background-color:
|
40 |
|
41 |
&:checked {
|
42 |
-
background:
|
43 |
border-color: $controls-border-dark;
|
44 |
}
|
45 |
}
|
46 |
}
|
47 |
|
48 |
.wc-block-components-checkbox__mark {
|
49 |
-
fill: #
|
50 |
position: absolute;
|
51 |
-
left: em(
|
52 |
top: em(-2px);
|
53 |
-
width: em(
|
54 |
-
height: em(
|
55 |
-
|
56 |
-
.has-dark-controls & {
|
57 |
-
fill: #fff;
|
58 |
-
}
|
59 |
}
|
60 |
|
61 |
.wc-block-components-checkbox__label {
|
62 |
-
padding-left: $gap;
|
63 |
vertical-align: middle;
|
64 |
}
|
65 |
}
|
66 |
|
67 |
// Hack to hide the check mark in IE11
|
68 |
// See comment: https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/2320/#issuecomment-621936576
|
69 |
-
@
|
70 |
-
.wc-block-components-checkbox__mark {
|
71 |
-
display: none;
|
72 |
-
}
|
73 |
-
}
|
74 |
-
|
75 |
-
.theme-twentytwentyone {
|
76 |
-
.wc-block-components-checkbox__input[type="checkbox"],
|
77 |
-
.has-dark-controls .wc-block-components-checkbox__input[type="checkbox"] {
|
78 |
-
background-color: #fff;
|
79 |
-
border-color: var(--form--border-color);
|
80 |
-
position: relative;
|
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 |
-
}
|
89 |
-
|
90 |
.wc-block-components-checkbox__mark {
|
91 |
display: none;
|
92 |
}
|
6 |
position: relative;
|
7 |
|
8 |
.wc-block-components-checkbox__input[type="checkbox"] {
|
|
|
9 |
appearance: none;
|
10 |
+
border: 2px solid currentColor;
|
11 |
border-radius: 2px;
|
12 |
+
height: em(18px);
|
13 |
+
width: em(18px);
|
14 |
margin: 0;
|
15 |
+
min-height: 18px;
|
16 |
+
min-width: 18px;
|
17 |
overflow: hidden;
|
18 |
position: static;
|
19 |
vertical-align: middle;
|
20 |
background-color: #fff;
|
21 |
|
22 |
&:checked {
|
23 |
+
background: currentColor;
|
24 |
+
border-color: currentColor;
|
|
|
|
|
|
|
|
|
|
|
25 |
}
|
26 |
|
27 |
&:not(:checked) + .wc-block-components-checkbox__mark {
|
30 |
|
31 |
.has-dark-controls & {
|
32 |
border-color: $controls-border-dark;
|
33 |
+
background-color: transparent;
|
34 |
|
35 |
&:checked {
|
36 |
+
background: transparent;
|
37 |
border-color: $controls-border-dark;
|
38 |
}
|
39 |
}
|
40 |
}
|
41 |
|
42 |
.wc-block-components-checkbox__mark {
|
43 |
+
fill: #fff;
|
44 |
position: absolute;
|
45 |
+
left: em(1px);
|
46 |
top: em(-2px);
|
47 |
+
width: em(16px);
|
48 |
+
height: em(16px);
|
|
|
|
|
|
|
|
|
49 |
}
|
50 |
|
51 |
.wc-block-components-checkbox__label {
|
52 |
+
padding-left: $gap-smaller;
|
53 |
vertical-align: middle;
|
54 |
}
|
55 |
}
|
56 |
|
57 |
// Hack to hide the check mark in IE11
|
58 |
// See comment: https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/2320/#issuecomment-621936576
|
59 |
+
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
.wc-block-components-checkbox__mark {
|
61 |
display: none;
|
62 |
}
|
assets/js/base/components/checkbox-list/index.js
CHANGED
@@ -13,15 +13,6 @@ import './style.scss';
|
|
13 |
|
14 |
/**
|
15 |
* Component used to show a list of checkboxes in a group.
|
16 |
-
*
|
17 |
-
* @param {Object} props Incoming props for the component.
|
18 |
-
* @param {string} props.className CSS class used.
|
19 |
-
* @param {function(string):any} props.onChange Function called when inputs change.
|
20 |
-
* @param {Array} props.options Options for list.
|
21 |
-
* @param {Array} props.checked Which items are checked.
|
22 |
-
* @param {boolean} props.isLoading If loading or not.
|
23 |
-
* @param {boolean} props.isDisabled If inputs are disabled or not.
|
24 |
-
* @param {number} props.limit Whether to limit the number of inputs showing.
|
25 |
*/
|
26 |
const CheckboxList = ( {
|
27 |
className,
|
@@ -58,7 +49,6 @@ const CheckboxList = ( {
|
|
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,7 +59,7 @@ const CheckboxList = ( {
|
|
69 |
) }
|
70 |
>
|
71 |
{ sprintf(
|
72 |
-
|
73 |
_n(
|
74 |
'Show %s more',
|
75 |
'Show %s more',
|
@@ -110,7 +100,7 @@ const CheckboxList = ( {
|
|
110 |
const optionCount = options.length;
|
111 |
const shouldTruncateOptions = optionCount > limit + 5;
|
112 |
return (
|
113 |
-
|
114 |
{ options.map( ( option, index ) => (
|
115 |
<Fragment key={ option.value }>
|
116 |
<li
|
@@ -138,11 +128,10 @@ const CheckboxList = ( {
|
|
138 |
</Fragment>
|
139 |
) ) }
|
140 |
{ shouldTruncateOptions && renderedShowLess }
|
141 |
-
|
142 |
);
|
143 |
}, [
|
144 |
options,
|
145 |
-
onChange,
|
146 |
checked,
|
147 |
showExpanded,
|
148 |
limit,
|
13 |
|
14 |
/**
|
15 |
* Component used to show a list of checkboxes in a group.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
*/
|
17 |
const CheckboxList = ( {
|
18 |
className,
|
49 |
} }
|
50 |
aria-expanded={ false }
|
51 |
aria-label={ sprintf(
|
|
|
52 |
_n(
|
53 |
'Show %s more option',
|
54 |
'Show %s more options',
|
59 |
) }
|
60 |
>
|
61 |
{ sprintf(
|
62 |
+
// translators: %s number of options to reveal.
|
63 |
_n(
|
64 |
'Show %s more',
|
65 |
'Show %s more',
|
100 |
const optionCount = options.length;
|
101 |
const shouldTruncateOptions = optionCount > limit + 5;
|
102 |
return (
|
103 |
+
<Fragment>
|
104 |
{ options.map( ( option, index ) => (
|
105 |
<Fragment key={ option.value }>
|
106 |
<li
|
128 |
</Fragment>
|
129 |
) ) }
|
130 |
{ shouldTruncateOptions && renderedShowLess }
|
131 |
+
</Fragment>
|
132 |
);
|
133 |
}, [
|
134 |
options,
|
|
|
135 |
checked,
|
136 |
showExpanded,
|
137 |
limit,
|
assets/js/base/components/chip/chip.js
CHANGED
@@ -9,22 +9,11 @@ import classNames from 'classnames';
|
|
9 |
*/
|
10 |
import './style.scss';
|
11 |
|
12 |
-
/** @typedef {import('react')} React */
|
13 |
-
|
14 |
/**
|
15 |
* Component used to render a "chip" -- a list item containing some text.
|
16 |
*
|
17 |
* Each chip defaults to a list element but this can be customized by providing
|
18 |
* a wrapperElement.
|
19 |
-
*
|
20 |
-
* @param {Object} props Incoming props for the component.
|
21 |
-
* @param {string} props.text Text for chip content.
|
22 |
-
* @param {string} props.screenReaderText Screenreader text for the content.
|
23 |
-
* @param {string} props.element The element type for the chip.
|
24 |
-
* @param {string} props.className CSS class used.
|
25 |
-
* @param {string} props.radius Radius size.
|
26 |
-
* @param {React.ReactChildren|null} props.children React children.
|
27 |
-
* @param {Object} props.props Rest of props passed through to component.
|
28 |
*/
|
29 |
const Chip = ( {
|
30 |
text,
|
9 |
*/
|
10 |
import './style.scss';
|
11 |
|
|
|
|
|
12 |
/**
|
13 |
* Component used to render a "chip" -- a list item containing some text.
|
14 |
*
|
15 |
* Each chip defaults to a list element but this can be customized by providing
|
16 |
* a wrapperElement.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
*/
|
18 |
const Chip = ( {
|
19 |
text,
|
assets/js/base/components/chip/removable-chip.js
CHANGED
@@ -9,21 +9,11 @@ import { Icon, noAlt } from '@woocommerce/icons';
|
|
9 |
/**
|
10 |
* Internal dependencies
|
11 |
*/
|
12 |
-
import Chip from './
|
13 |
|
14 |
/**
|
15 |
* Component used to render a "chip" -- an item containing some text with
|
16 |
* an X button to remove/dismiss each chip.
|
17 |
-
*
|
18 |
-
* @param {Object} props Incoming props for the component.
|
19 |
-
* @param {string} props.ariaLabel Aria label content.
|
20 |
-
* @param {string} props.className CSS class used.
|
21 |
-
* @param {boolean} props.disabled Whether action is disabled or not.
|
22 |
-
* @param {function():any} props.onRemove Function to call when remove event is fired.
|
23 |
-
* @param {boolean} props.removeOnAnyClick Whether to expand click area for remove event.
|
24 |
-
* @param {string} props.text The text for the chip.
|
25 |
-
* @param {string} props.screenReaderText The screen reader text for the chip.
|
26 |
-
* @param {Object} props.props Rest of props passed into component.
|
27 |
*/
|
28 |
const RemovableChip = ( {
|
29 |
ariaLabel = '',
|
9 |
/**
|
10 |
* Internal dependencies
|
11 |
*/
|
12 |
+
import { Chip } from './index.js';
|
13 |
|
14 |
/**
|
15 |
* Component used to render a "chip" -- an item containing some text with
|
16 |
* an X button to remove/dismiss each chip.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
*/
|
18 |
const RemovableChip = ( {
|
19 |
ariaLabel = '',
|
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/chip/style.scss
CHANGED
@@ -14,8 +14,8 @@
|
|
14 |
&:hover,
|
15 |
&:focus,
|
16 |
&:active {
|
17 |
-
background: $
|
18 |
-
color: $
|
19 |
}
|
20 |
|
21 |
&.wc-block-components-chip--radius-small {
|
@@ -55,11 +55,11 @@ button.wc-block-components-chip:hover > .wc-block-components-chip__remove,
|
|
55 |
button.wc-block-components-chip:focus > .wc-block-components-chip__remove,
|
56 |
.wc-block-components-chip__remove:hover,
|
57 |
.wc-block-components-chip__remove:focus {
|
58 |
-
fill:
|
59 |
}
|
60 |
|
61 |
button.wc-block-components-chip:disabled > .wc-block-components-chip__remove,
|
62 |
.wc-block-components-chip__remove:disabled {
|
63 |
-
fill: $
|
64 |
cursor: not-allowed;
|
65 |
}
|
14 |
&:hover,
|
15 |
&:focus,
|
16 |
&:active {
|
17 |
+
background: $core-grey-light-500;
|
18 |
+
color: $core-grey-dark-800;
|
19 |
}
|
20 |
|
21 |
&.wc-block-components-chip--radius-small {
|
55 |
button.wc-block-components-chip:focus > .wc-block-components-chip__remove,
|
56 |
.wc-block-components-chip__remove:hover,
|
57 |
.wc-block-components-chip__remove:focus {
|
58 |
+
fill: #d94f4f;
|
59 |
}
|
60 |
|
61 |
button.wc-block-components-chip:disabled > .wc-block-components-chip__remove,
|
62 |
.wc-block-components-chip__remove:disabled {
|
63 |
+
fill: $core-grey-dark-100;
|
64 |
cursor: not-allowed;
|
65 |
}
|
assets/js/base/components/chip/test/__snapshots__/index.js.snap
CHANGED
@@ -106,9 +106,9 @@ exports[`RemovableChip should render custom aria label 1`] = `
|
|
106 |
onKeyDown={[Function]}
|
107 |
>
|
108 |
<svg
|
109 |
-
aria-hidden=
|
110 |
className="wc-block-components-chip__remove-icon"
|
111 |
-
focusable=
|
112 |
height={16}
|
113 |
role="img"
|
114 |
viewBox="0 0 20 20"
|
@@ -148,9 +148,9 @@ exports[`RemovableChip should render default aria label if text is a node 1`] =
|
|
148 |
onKeyDown={[Function]}
|
149 |
>
|
150 |
<svg
|
151 |
-
aria-hidden=
|
152 |
className="wc-block-components-chip__remove-icon"
|
153 |
-
focusable=
|
154 |
height={16}
|
155 |
role="img"
|
156 |
viewBox="0 0 20 20"
|
@@ -188,9 +188,9 @@ exports[`RemovableChip should render screen reader text aria label 1`] = `
|
|
188 |
onKeyDown={[Function]}
|
189 |
>
|
190 |
<svg
|
191 |
-
aria-hidden=
|
192 |
className="wc-block-components-chip__remove-icon"
|
193 |
-
focusable=
|
194 |
height={16}
|
195 |
role="img"
|
196 |
viewBox="0 0 20 20"
|
@@ -223,9 +223,9 @@ exports[`RemovableChip should render text and the remove button 1`] = `
|
|
223 |
onKeyDown={[Function]}
|
224 |
>
|
225 |
<svg
|
226 |
-
aria-hidden=
|
227 |
className="wc-block-components-chip__remove-icon"
|
228 |
-
focusable=
|
229 |
height={16}
|
230 |
role="img"
|
231 |
viewBox="0 0 20 20"
|
@@ -258,9 +258,9 @@ exports[`RemovableChip should render with disabled remove button 1`] = `
|
|
258 |
onKeyDown={[Function]}
|
259 |
>
|
260 |
<svg
|
261 |
-
aria-hidden=
|
262 |
className="wc-block-components-chip__remove-icon"
|
263 |
-
focusable=
|
264 |
height={16}
|
265 |
role="img"
|
266 |
viewBox="0 0 20 20"
|
@@ -294,9 +294,9 @@ exports[`RemovableChip with removeOnAnyClick should be a button when removeOnAny
|
|
294 |
className="wc-block-components-chip__remove"
|
295 |
>
|
296 |
<svg
|
297 |
-
aria-hidden=
|
298 |
className="wc-block-components-chip__remove-icon"
|
299 |
-
focusable=
|
300 |
height={16}
|
301 |
role="img"
|
302 |
viewBox="0 0 20 20"
|
106 |
onKeyDown={[Function]}
|
107 |
>
|
108 |
<svg
|
109 |
+
aria-hidden="true"
|
110 |
className="wc-block-components-chip__remove-icon"
|
111 |
+
focusable="false"
|
112 |
height={16}
|
113 |
role="img"
|
114 |
viewBox="0 0 20 20"
|
148 |
onKeyDown={[Function]}
|
149 |
>
|
150 |
<svg
|
151 |
+
aria-hidden="true"
|
152 |
className="wc-block-components-chip__remove-icon"
|
153 |
+
focusable="false"
|
154 |
height={16}
|
155 |
role="img"
|
156 |
viewBox="0 0 20 20"
|
188 |
onKeyDown={[Function]}
|
189 |
>
|
190 |
<svg
|
191 |
+
aria-hidden="true"
|
192 |
className="wc-block-components-chip__remove-icon"
|
193 |
+
focusable="false"
|
194 |
height={16}
|
195 |
role="img"
|
196 |
viewBox="0 0 20 20"
|
223 |
onKeyDown={[Function]}
|
224 |
>
|
225 |
<svg
|
226 |
+
aria-hidden="true"
|
227 |
className="wc-block-components-chip__remove-icon"
|
228 |
+
focusable="false"
|
229 |
height={16}
|
230 |
role="img"
|
231 |
viewBox="0 0 20 20"
|
258 |
onKeyDown={[Function]}
|
259 |
>
|
260 |
<svg
|
261 |
+
aria-hidden="true"
|
262 |
className="wc-block-components-chip__remove-icon"
|
263 |
+
focusable="false"
|
264 |
height={16}
|
265 |
role="img"
|
266 |
viewBox="0 0 20 20"
|
294 |
className="wc-block-components-chip__remove"
|
295 |
>
|
296 |
<svg
|
297 |
+
aria-hidden="true"
|
298 |
className="wc-block-components-chip__remove-icon"
|
299 |
+
focusable="false"
|
300 |
height={16}
|
301 |
role="img"
|
302 |
viewBox="0 0 20 20"
|
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/country-input/stories/index.js
CHANGED
@@ -27,7 +27,7 @@ const StoryComponent = ( { label, errorMessage } ) => {
|
|
27 |
} = useValidationContext();
|
28 |
useEffect( () => {
|
29 |
setValidationErrors( { country: errorMessage } );
|
30 |
-
}, [ errorMessage
|
31 |
const updateCountry = ( country ) => {
|
32 |
clearValidationError( 'country' );
|
33 |
selectCountry( country );
|
27 |
} = useValidationContext();
|
28 |
useEffect( () => {
|
29 |
setValidationErrors( { country: errorMessage } );
|
30 |
+
}, [ errorMessage ] );
|
31 |
const updateCountry = ( country ) => {
|
32 |
clearValidationError( 'country' );
|
33 |
selectCountry( country );
|
assets/js/base/components/dropdown-selector/index.js
CHANGED
@@ -19,17 +19,6 @@ import './style.scss';
|
|
19 |
|
20 |
/**
|
21 |
* Component used to show an input box with a dropdown with suggestions.
|
22 |
-
*
|
23 |
-
* @param {Object} props Incoming props for the component.
|
24 |
-
* @param {string} props.attributeLabel Label for the attributes.
|
25 |
-
* @param {string} props.className CSS class used.
|
26 |
-
* @param {Array} props.checked Which items are checked.
|
27 |
-
* @param {string} props.inputLabel Label used for the input.
|
28 |
-
* @param {boolean} props.isDisabled Whether the input is disabled or not.
|
29 |
-
* @param {boolean} props.isLoading Whether the input is loading.
|
30 |
-
* @param {boolean} props.multiple Whether multi-select is allowed.
|
31 |
-
* @param {function():any} props.onChange Function to be called when onChange event fires.
|
32 |
-
* @param {Array} props.options The option values to show in the select.
|
33 |
*/
|
34 |
const DropdownSelector = ( {
|
35 |
attributeLabel = '',
|
@@ -155,7 +144,7 @@ const DropdownSelector = ( {
|
|
155 |
checked.length > 0 && multiple
|
156 |
? null
|
157 |
: sprintf(
|
158 |
-
|
159 |
__(
|
160 |
'Any %s',
|
161 |
'woo-gutenberg-products-block'
|
19 |
|
20 |
/**
|
21 |
* Component used to show an input box with a dropdown with suggestions.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
*/
|
23 |
const DropdownSelector = ( {
|
24 |
attributeLabel = '',
|
144 |
checked.length > 0 && multiple
|
145 |
? null
|
146 |
: sprintf(
|
147 |
+
// Translators: %s attribute name.
|
148 |
__(
|
149 |
'Any %s',
|
150 |
'woo-gutenberg-products-block'
|
assets/js/base/components/dropdown-selector/menu.js
CHANGED
@@ -38,7 +38,6 @@ const DropdownSelectorMenu = ( {
|
|
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'
|
38 |
item: option.value,
|
39 |
'aria-label': selected
|
40 |
? sprintf(
|
|
|
41 |
__(
|
42 |
'Remove %s filter',
|
43 |
'woo-gutenberg-products-block'
|
assets/js/base/components/dropdown-selector/selected-chip.js
CHANGED
@@ -13,7 +13,6 @@ const DropdownSelectorSelectedChip = ( { onRemoveItem, option } ) => {
|
|
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 |
) }
|
13 |
onRemoveItem( option.value );
|
14 |
} }
|
15 |
ariaLabel={ sprintf(
|
|
|
16 |
__( 'Remove %s filter', 'woo-gutenberg-products-block' ),
|
17 |
option.name
|
18 |
) }
|
assets/js/base/components/dropdown-selector/style.scss
CHANGED
@@ -20,7 +20,7 @@ $dropdown-selector-line-height: 18/14;
|
|
20 |
padding: 2px $gap-smaller;
|
21 |
|
22 |
.is-disabled & {
|
23 |
-
background-color: $
|
24 |
}
|
25 |
|
26 |
.is-multiple.has-checked > & {
|
@@ -102,7 +102,7 @@ $dropdown-selector-line-height: 18/14;
|
|
102 |
.wc-block-components-dropdown-selector__selected-value {
|
103 |
@include font-size(small);
|
104 |
align-items: center;
|
105 |
-
color: $
|
106 |
display: inline-flex;
|
107 |
margin: em($gap-small/4) 0;
|
108 |
padding: em($gap-smallest * 0.75) 0 em($gap-smallest * 0.75);
|
@@ -155,14 +155,14 @@ $dropdown-selector-line-height: 18/14;
|
|
155 |
|
156 |
.wc-block-components-dropdown-selector__list-item {
|
157 |
@include font-size(small);
|
158 |
-
color: $
|
159 |
cursor: default;
|
160 |
list-style: none;
|
161 |
margin: 0;
|
162 |
padding: 0 $gap-smallest;
|
163 |
|
164 |
&.is-selected {
|
165 |
-
background-color: $
|
166 |
}
|
167 |
|
168 |
&:hover,
|
20 |
padding: 2px $gap-smaller;
|
21 |
|
22 |
.is-disabled & {
|
23 |
+
background-color: $core-grey-light-500;
|
24 |
}
|
25 |
|
26 |
.is-multiple.has-checked > & {
|
102 |
.wc-block-components-dropdown-selector__selected-value {
|
103 |
@include font-size(small);
|
104 |
align-items: center;
|
105 |
+
color: $core-grey-dark-600;
|
106 |
display: inline-flex;
|
107 |
margin: em($gap-small/4) 0;
|
108 |
padding: em($gap-smallest * 0.75) 0 em($gap-smallest * 0.75);
|
155 |
|
156 |
.wc-block-components-dropdown-selector__list-item {
|
157 |
@include font-size(small);
|
158 |
+
color: $core-grey-dark-600;
|
159 |
cursor: default;
|
160 |
list-style: none;
|
161 |
margin: 0;
|
162 |
padding: 0 $gap-smallest;
|
163 |
|
164 |
&.is-selected {
|
165 |
+
background-color: $core-grey-light-600;
|
166 |
}
|
167 |
|
168 |
&:hover,
|
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,20 @@ 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 +57,7 @@ const FormattedMonetaryAmount = ( {
|
|
71 |
className
|
72 |
);
|
73 |
const numberFormatProps = {
|
|
|
74 |
...props,
|
75 |
...currencyToNumberFormat( currency ),
|
76 |
value: undefined,
|
@@ -80,20 +67,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 |
*/
|
37 |
const FormattedMonetaryAmount = ( {
|
38 |
className,
|
39 |
+
value,
|
40 |
currency,
|
41 |
onValueChange,
|
|
|
42 |
...props
|
43 |
+
} ) => {
|
44 |
+
if ( value === '-' ) {
|
|
|
|
|
|
|
45 |
return null;
|
46 |
}
|
47 |
|
57 |
className
|
58 |
);
|
59 |
const numberFormatProps = {
|
60 |
+
displayType: 'text',
|
61 |
...props,
|
62 |
...currencyToNumberFormat( currency ),
|
63 |
value: undefined,
|
67 |
|
68 |
// Wrapper for NumberFormat onValueChange which handles subunit conversion.
|
69 |
const onValueChangeWrapper = onValueChange
|
70 |
+
? ( values ) => {
|
71 |
+
const minorUnitValue = values.value * 10 ** currency.minorUnit;
|
|
|
|
|
72 |
onValueChange( minorUnitValue );
|
73 |
}
|
74 |
+
: () => {};
|
|
|
|
|
75 |
|
76 |
return (
|
77 |
<NumberFormat
|
78 |
className={ classes }
|
|
|
79 |
{ ...numberFormatProps }
|
80 |
value={ priceValue }
|
81 |
onValueChange={ onValueChangeWrapper }
|
assets/js/base/components/label/{index.tsx → index.js}
RENAMED
@@ -1,29 +1,21 @@
|
|
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 +51,15 @@ 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 |
const Label = ( {
|
14 |
label,
|
15 |
screenReaderLabel,
|
16 |
wrapperElement,
|
17 |
+
wrapperProps,
|
18 |
+
} ) => {
|
19 |
let Wrapper;
|
20 |
|
21 |
const hasLabel = typeof label !== 'undefined' && label !== null;
|
51 |
return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
|
52 |
};
|
53 |
|
54 |
+
Label.propTypes = {
|
55 |
+
label: PropTypes.node,
|
56 |
+
screenReaderLabel: PropTypes.node,
|
57 |
+
wrapperElement: PropTypes.elementType,
|
58 |
+
wrapperProps: PropTypes.object,
|
59 |
+
};
|
60 |
+
|
61 |
+
Label.defaultProps = {
|
62 |
+
wrapperProps: {},
|
63 |
+
};
|
64 |
+
|
65 |
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 |
}
|
packages/checkout/panel/index.tsx → assets/js/base/components/panel/index.js
RENAMED
@@ -2,8 +2,8 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { useState } from '@wordpress/element';
|
5 |
-
import type { ReactNode, ReactElement } from 'react';
|
6 |
import classNames from 'classnames';
|
|
|
7 |
import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
|
8 |
|
9 |
/**
|
@@ -11,15 +11,6 @@ import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
|
|
11 |
*/
|
12 |
import './style.scss';
|
13 |
|
14 |
-
interface PanelProps {
|
15 |
-
children?: ReactNode;
|
16 |
-
className?: string;
|
17 |
-
initialOpen?: boolean;
|
18 |
-
hasBorder?: boolean;
|
19 |
-
title?: ReactNode;
|
20 |
-
titleTag?: keyof JSX.IntrinsicElements;
|
21 |
-
}
|
22 |
-
|
23 |
const Panel = ( {
|
24 |
children,
|
25 |
className,
|
@@ -27,31 +18,31 @@ const Panel = ( {
|
|
27 |
hasBorder = false,
|
28 |
title,
|
29 |
titleTag: TitleTag = 'div',
|
30 |
-
}
|
31 |
-
const [ isOpen, setIsOpen ] = useState
|
32 |
|
33 |
return (
|
34 |
<div
|
35 |
-
className={ classNames( className, 'wc-
|
36 |
'has-border': hasBorder,
|
37 |
} ) }
|
38 |
>
|
39 |
<TitleTag>
|
40 |
<button
|
41 |
aria-expanded={ isOpen }
|
42 |
-
className="wc-
|
43 |
onClick={ () => setIsOpen( ! isOpen ) }
|
44 |
>
|
45 |
<Icon
|
46 |
aria-hidden="true"
|
47 |
-
className="wc-
|
48 |
srcElement={ isOpen ? chevronUp : chevronDown }
|
49 |
/>
|
50 |
{ title }
|
51 |
</button>
|
52 |
</TitleTag>
|
53 |
<div
|
54 |
-
className="wc-
|
55 |
hidden={ ! isOpen }
|
56 |
>
|
57 |
{ children }
|
@@ -60,4 +51,12 @@ const Panel = ( {
|
|
60 |
);
|
61 |
};
|
62 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
export default Panel;
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { useState } from '@wordpress/element';
|
|
|
5 |
import classNames from 'classnames';
|
6 |
+
import PropTypes from 'prop-types';
|
7 |
import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
|
8 |
|
9 |
/**
|
11 |
*/
|
12 |
import './style.scss';
|
13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
const Panel = ( {
|
15 |
children,
|
16 |
className,
|
18 |
hasBorder = false,
|
19 |
title,
|
20 |
titleTag: TitleTag = 'div',
|
21 |
+
} ) => {
|
22 |
+
const [ isOpen, setIsOpen ] = useState( initialOpen );
|
23 |
|
24 |
return (
|
25 |
<div
|
26 |
+
className={ classNames( className, 'wc-blocks-components-panel', {
|
27 |
'has-border': hasBorder,
|
28 |
} ) }
|
29 |
>
|
30 |
<TitleTag>
|
31 |
<button
|
32 |
aria-expanded={ isOpen }
|
33 |
+
className="wc-blocks-components-panel__button"
|
34 |
onClick={ () => setIsOpen( ! isOpen ) }
|
35 |
>
|
36 |
<Icon
|
37 |
aria-hidden="true"
|
38 |
+
className="wc-blocks-components-panel__button-icon"
|
39 |
srcElement={ isOpen ? chevronUp : chevronDown }
|
40 |
/>
|
41 |
{ title }
|
42 |
</button>
|
43 |
</TitleTag>
|
44 |
<div
|
45 |
+
className="wc-blocks-components-panel__content"
|
46 |
hidden={ ! isOpen }
|
47 |
>
|
48 |
{ children }
|
51 |
);
|
52 |
};
|
53 |
|
54 |
+
Panel.propTypes = {
|
55 |
+
className: PropTypes.string,
|
56 |
+
hasBorder: PropTypes.bool,
|
57 |
+
initialOpen: PropTypes.bool,
|
58 |
+
title: PropTypes.element,
|
59 |
+
titleTag: PropTypes.string,
|
60 |
+
};
|
61 |
+
|
62 |
export default Panel;
|
assets/js/base/components/panel/style.scss
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.wc-blocks-components-panel.has-border {
|
2 |
+
@include with-translucent-border( 1px 0 );
|
3 |
+
|
4 |
+
+ .wc-blocks-components-panel.has-border::after {
|
5 |
+
border-top-width: 0;
|
6 |
+
}
|
7 |
+
}
|
8 |
+
|
9 |
+
.wc-blocks-components-panel__button {
|
10 |
+
@include reset-box();
|
11 |
+
height: auto;
|
12 |
+
line-height: 1;
|
13 |
+
margin-bottom: em(6px);
|
14 |
+
margin-top: em(6px);
|
15 |
+
padding-bottom: em($gap-small - 6px);
|
16 |
+
padding-right: #{24px + $gap-smaller};
|
17 |
+
padding-top: em($gap-small - 6px);
|
18 |
+
position: relative;
|
19 |
+
text-align: left;
|
20 |
+
width: 100%;
|
21 |
+
|
22 |
+
&,
|
23 |
+
&:hover,
|
24 |
+
&:focus,
|
25 |
+
&:active {
|
26 |
+
@include reset-typography();
|
27 |
+
background: transparent;
|
28 |
+
box-shadow: none;
|
29 |
+
}
|
30 |
+
|
31 |
+
> .wc-blocks-components-panel__button-icon {
|
32 |
+
fill: currentColor;
|
33 |
+
position: absolute;
|
34 |
+
right: 0;
|
35 |
+
top: 50%;
|
36 |
+
transform: translateY(-50%);
|
37 |
+
width: auto;
|
38 |
+
}
|
39 |
+
}
|
40 |
+
|
41 |
+
.wc-blocks-components-panel__content {
|
42 |
+
padding-bottom: em($gap);
|
43 |
+
overflow: auto;
|
44 |
+
}
|
45 |
+
|
46 |
+
.theme-twentytwenty .wc-blocks-components-panel__button,
|
47 |
+
.theme-twentyseventeen .wc-blocks-components-panel__button {
|
48 |
+
background: transparent;
|
49 |
+
color: inherit;
|
50 |
+
}
|
assets/js/base/components/payment-methods/express-payment-methods.js
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
const ExpressPaymentMethods = () => {
|
20 |
+
const { isEditor } = useEditorContext();
|
21 |
+
const {
|
22 |
+
setActivePaymentMethod,
|
23 |
+
activePaymentMethod,
|
24 |
+
setPaymentStatus,
|
25 |
+
} = usePaymentMethodDataContext();
|
26 |
+
const paymentMethodInterface = usePaymentMethodInterface();
|
27 |
+
const { paymentMethods } = useExpressPaymentMethods();
|
28 |
+
const previousActivePaymentMethod = useRef( activePaymentMethod );
|
29 |
+
|
30 |
+
const onExpressPaymentClick = useCallback(
|
31 |
+
( paymentMethodId ) => () => {
|
32 |
+
previousActivePaymentMethod.current = activePaymentMethod;
|
33 |
+
setPaymentStatus().started();
|
34 |
+
setActivePaymentMethod( paymentMethodId );
|
35 |
+
},
|
36 |
+
[ setActivePaymentMethod, setPaymentStatus, activePaymentMethod ]
|
37 |
+
);
|
38 |
+
const onExpressPaymentClose = useCallback( () => {
|
39 |
+
setActivePaymentMethod( previousActivePaymentMethod.current );
|
40 |
+
}, [ setActivePaymentMethod ] );
|
41 |
+
const paymentMethodIds = Object.keys( paymentMethods );
|
42 |
+
const content =
|
43 |
+
paymentMethodIds.length > 0 ? (
|
44 |
+
paymentMethodIds.map( ( id ) => {
|
45 |
+
const expressPaymentMethod = isEditor
|
46 |
+
? paymentMethods[ id ].edit
|
47 |
+
: paymentMethods[ id ].content;
|
48 |
+
return isValidElement( expressPaymentMethod ) ? (
|
49 |
+
<li key={ id } id={ `express-payment-method-${ id }` }>
|
50 |
+
{ cloneElement( expressPaymentMethod, {
|
51 |
+
...paymentMethodInterface,
|
52 |
+
onClick: onExpressPaymentClick( id ),
|
53 |
+
onClose: onExpressPaymentClose,
|
54 |
+
} ) }
|
55 |
+
</li>
|
56 |
+
) : null;
|
57 |
+
} )
|
58 |
+
) : (
|
59 |
+
<li key="noneRegistered">No registered Payment Methods</li>
|
60 |
+
);
|
61 |
+
return (
|
62 |
+
<ul className="wc-block-components-express-payment__event-buttons">
|
63 |
+
{ content }
|
64 |
+
</ul>
|
65 |
+
);
|
66 |
+
};
|
67 |
+
|
68 |
+
export default ExpressPaymentMethods;
|
assets/js/base/components/payment-methods/express-payment/cart-express-payment.js
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import { useExpressPaymentMethods } from '@woocommerce/base-hooks';
|
6 |
+
import { StoreNoticesProvider } from '@woocommerce/base-context';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Internal dependencies
|
10 |
+
*/
|
11 |
+
import ExpressPaymentMethods from '../express-payment-methods';
|
12 |
+
import './style.scss';
|
13 |
+
|
14 |
+
const CartExpressPayment = () => {
|
15 |
+
const { paymentMethods, isInitialized } = useExpressPaymentMethods();
|
16 |
+
|
17 |
+
if (
|
18 |
+
! isInitialized ||
|
19 |
+
( isInitialized && Object.keys( paymentMethods ).length === 0 )
|
20 |
+
) {
|
21 |
+
return null;
|
22 |
+
}
|
23 |
+
|
24 |
+
return (
|
25 |
+
<>
|
26 |
+
<div className="wc-block-components-express-payment wc-block-components-express-payment--cart">
|
27 |
+
<div className="wc-block-components-express-payment__content">
|
28 |
+
<StoreNoticesProvider context="wc/express-payment-area">
|
29 |
+
<ExpressPaymentMethods />
|
30 |
+
</StoreNoticesProvider>
|
31 |
+
</div>
|
32 |
+
</div>
|
33 |
+
<div className="wc-block-components-express-payment-continue-rule wc-block-components-express-payment-continue-rule--cart">
|
34 |
+
{ /* translators: Shown in the Cart block between the express payment methods and the Proceed to Checkout button */ }
|
35 |
+
{ __( 'Or', 'woo-gutenberg-products-block' ) }
|
36 |
+
</div>
|
37 |
+
</>
|
38 |
+
);
|
39 |
+
};
|
40 |
+
|
41 |
+
export default CartExpressPayment;
|
assets/js/base/components/payment-methods/express-payment/checkout-express-payment.js
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import { useExpressPaymentMethods } from '@woocommerce/base-hooks';
|
6 |
+
import { StoreNoticesProvider } from '@woocommerce/base-context';
|
7 |
+
import Title from '@woocommerce/base-components/title';
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Internal dependencies
|
11 |
+
*/
|
12 |
+
import ExpressPaymentMethods from '../express-payment-methods';
|
13 |
+
import './style.scss';
|
14 |
+
|
15 |
+
const CheckoutExpressPayment = () => {
|
16 |
+
const { paymentMethods, isInitialized } = useExpressPaymentMethods();
|
17 |
+
|
18 |
+
if (
|
19 |
+
! isInitialized ||
|
20 |
+
( isInitialized && Object.keys( paymentMethods ).length === 0 )
|
21 |
+
) {
|
22 |
+
return null;
|
23 |
+
}
|
24 |
+
|
25 |
+
return (
|
26 |
+
<>
|
27 |
+
<div className="wc-block-components-express-payment wc-block-components-express-payment--checkout">
|
28 |
+
<div className="wc-block-components-express-payment__title-container">
|
29 |
+
<Title
|
30 |
+
className="wc-block-components-express-payment__title"
|
31 |
+
headingLevel="2"
|
32 |
+
>
|
33 |
+
{ __(
|
34 |
+
'Express checkout',
|
35 |
+
'woo-gutenberg-products-block'
|
36 |
+
) }
|
37 |
+
</Title>
|
38 |
+
</div>
|
39 |
+
<div className="wc-block-components-express-payment__content">
|
40 |
+
<StoreNoticesProvider context="wc/express-payment-area">
|
41 |
+
<p>
|
42 |
+
{ __(
|
43 |
+
'In a hurry? Use one of our express checkout options below:',
|
44 |
+
'woo-gutenberg-products-block'
|
45 |
+
) }
|
46 |
+
</p>
|
47 |
+
<ExpressPaymentMethods />
|
48 |
+
</StoreNoticesProvider>
|
49 |
+
</div>
|
50 |
+
</div>
|
51 |
+
<div className="wc-block-components-express-payment-continue-rule wc-block-components-express-payment-continue-rule--checkout">
|
52 |
+
{ __( 'Or continue below', 'woo-gutenberg-products-block' ) }
|
53 |
+
</div>
|
54 |
+
</>
|
55 |
+
);
|
56 |
+
};
|
57 |
+
|
58 |
+
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
@@ -1,4 +1,3 @@
|
|
1 |
export { default as PaymentMethods } from './payment-methods';
|
2 |
export { default as ExpressPaymentMethods } from './express-payment-methods';
|
3 |
export { CartExpressPayment, CheckoutExpressPayment } from './express-payment';
|
4 |
-
export { default as SavedPaymentMethodOptions } from './saved-payment-method-options';
|
1 |
export { default as PaymentMethods } from './payment-methods';
|
2 |
export { default as ExpressPaymentMethods } from './express-payment-methods';
|
3 |
export { CartExpressPayment, CheckoutExpressPayment } from './express-payment';
|
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js
RENAMED
@@ -43,7 +43,7 @@ const NoPaymentMethodsPlaceholder = () => {
|
|
43 |
) }
|
44 |
</span>
|
45 |
<Button
|
46 |
-
|
47 |
href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=checkout` }
|
48 |
target="_blank"
|
49 |
rel="noopener noreferrer"
|
43 |
) }
|
44 |
</span>
|
45 |
<Button
|
46 |
+
isDefault
|
47 |
href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=checkout` }
|
48 |
target="_blank"
|
49 |
rel="noopener noreferrer"
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss
RENAMED
@@ -9,7 +9,7 @@
|
|
9 |
display: block;
|
10 |
|
11 |
.components-button {
|
12 |
-
background-color: $
|
13 |
color: $white;
|
14 |
}
|
15 |
|
9 |
display: block;
|
10 |
|
11 |
.components-button {
|
12 |
+
background-color: $black;
|
13 |
color: $white;
|
14 |
}
|
15 |
|
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 };
|
@@ -36,15 +36,11 @@ class PaymentMethodErrorBoundary extends Component {
|
|
36 |
);
|
37 |
}
|
38 |
}
|
39 |
-
|
40 |
-
{
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
status: 'error',
|
45 |
-
},
|
46 |
-
];
|
47 |
-
return <StoreNoticesContainer notices={ notices } />;
|
48 |
}
|
49 |
|
50 |
return this.props.children;
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import { Component } from 'react';
|
6 |
+
import { Notice } from 'wordpress-components';
|
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 };
|
36 |
);
|
37 |
}
|
38 |
}
|
39 |
+
return (
|
40 |
+
<Notice isDismissible={ false } status="error">
|
41 |
+
{ errorText }
|
42 |
+
</Notice>
|
43 |
+
);
|
|
|
|
|
|
|
|
|
44 |
}
|
45 |
|
46 |
return this.props.children;
|
assets/js/base/components/payment-methods/payment-methods.js
ADDED
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import {
|
5 |
+
usePaymentMethods,
|
6 |
+
usePaymentMethodInterface,
|
7 |
+
useStoreNotices,
|
8 |
+
useEmitResponse,
|
9 |
+
} from '@woocommerce/base-hooks';
|
10 |
+
import {
|
11 |
+
cloneElement,
|
12 |
+
useRef,
|
13 |
+
useEffect,
|
14 |
+
useState,
|
15 |
+
useCallback,
|
16 |
+
} from '@wordpress/element';
|
17 |
+
import { __ } from '@wordpress/i18n';
|
18 |
+
import {
|
19 |
+
useCheckoutContext,
|
20 |
+
useEditorContext,
|
21 |
+
usePaymentMethodDataContext,
|
22 |
+
} from '@woocommerce/base-context';
|
23 |
+
import CheckboxControl from '@woocommerce/base-components/checkbox-control';
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Internal dependencies
|
27 |
+
*/
|
28 |
+
import Tabs from '../tabs';
|
29 |
+
import NoPaymentMethods from './no-payment-methods';
|
30 |
+
import SavedPaymentMethodOptions from './saved-payment-method-options';
|
31 |
+
import PaymentMethodErrorBoundary from './payment-method-error-boundary';
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Returns a payment method for the given context.
|
35 |
+
*
|
36 |
+
* @param {string} name The payment method slug to return.
|
37 |
+
* @param {Object} paymentMethods The current registered payment methods
|
38 |
+
* @param {boolean} isEditor Whether in the editor context (true) or not (false).
|
39 |
+
*
|
40 |
+
* @return {Object} The payment method matching the name for the given context.
|
41 |
+
*/
|
42 |
+
const getPaymentMethod = ( name, paymentMethods, isEditor ) => {
|
43 |
+
let paymentMethod = paymentMethods[ name ] || null;
|
44 |
+
if ( paymentMethod ) {
|
45 |
+
paymentMethod = isEditor ? paymentMethod.edit : paymentMethod.content;
|
46 |
+
}
|
47 |
+
return paymentMethod;
|
48 |
+
};
|
49 |
+
|
50 |
+
/**
|
51 |
+
* PaymentMethods component.
|
52 |
+
*
|
53 |
+
* @return {*} The rendered component.
|
54 |
+
*/
|
55 |
+
const PaymentMethods = () => {
|
56 |
+
const { isEditor } = useEditorContext();
|
57 |
+
const {
|
58 |
+
customerPaymentMethods = {},
|
59 |
+
setActivePaymentMethod,
|
60 |
+
shouldSavePayment,
|
61 |
+
setShouldSavePayment,
|
62 |
+
} = usePaymentMethodDataContext();
|
63 |
+
const { isInitialized, paymentMethods } = usePaymentMethods();
|
64 |
+
const currentPaymentMethods = useRef( paymentMethods );
|
65 |
+
const {
|
66 |
+
activePaymentMethod,
|
67 |
+
...paymentMethodInterface
|
68 |
+
} = usePaymentMethodInterface();
|
69 |
+
const currentPaymentMethodInterface = useRef( paymentMethodInterface );
|
70 |
+
const [ selectedToken, setSelectedToken ] = useState( '0' );
|
71 |
+
const { noticeContexts } = useEmitResponse();
|
72 |
+
const { removeNotice } = useStoreNotices();
|
73 |
+
const { customerId } = useCheckoutContext();
|
74 |
+
|
75 |
+
// update ref on change.
|
76 |
+
useEffect( () => {
|
77 |
+
currentPaymentMethods.current = paymentMethods;
|
78 |
+
currentPaymentMethodInterface.current = paymentMethodInterface;
|
79 |
+
}, [ paymentMethods, paymentMethodInterface, activePaymentMethod ] );
|
80 |
+
|
81 |
+
const getRenderedTab = useCallback(
|
82 |
+
( selectedTab ) => {
|
83 |
+
const paymentMethod = getPaymentMethod(
|
84 |
+
selectedTab,
|
85 |
+
currentPaymentMethods.current,
|
86 |
+
isEditor
|
87 |
+
);
|
88 |
+
const { supports = {} } =
|
89 |
+
paymentMethod &&
|
90 |
+
currentPaymentMethods.current[ activePaymentMethod ]
|
91 |
+
? currentPaymentMethods.current[ activePaymentMethod ]
|
92 |
+
: {};
|
93 |
+
return paymentMethod && activePaymentMethod ? (
|
94 |
+
<PaymentMethodErrorBoundary isEditor={ isEditor }>
|
95 |
+
{ cloneElement( paymentMethod, {
|
96 |
+
activePaymentMethod,
|
97 |
+
...currentPaymentMethodInterface.current,
|
98 |
+
} ) }
|
99 |
+
{ customerId > 0 && supports.savePaymentInfo && (
|
100 |
+
<CheckboxControl
|
101 |
+
className="wc-block-components-payment-methods__save-card-info"
|
102 |
+
label={ __(
|
103 |
+
'Save payment information to my account for future purchases.',
|
104 |
+
'woo-gutenberg-products-block'
|
105 |
+
) }
|
106 |
+
checked={ shouldSavePayment }
|
107 |
+
onChange={ () =>
|
108 |
+
setShouldSavePayment( ! shouldSavePayment )
|
109 |
+
}
|
110 |
+
/>
|
111 |
+
) }
|
112 |
+
</PaymentMethodErrorBoundary>
|
113 |
+
) : null;
|
114 |
+
},
|
115 |
+
[
|
116 |
+
isEditor,
|
117 |
+
activePaymentMethod,
|
118 |
+
shouldSavePayment,
|
119 |
+
setShouldSavePayment,
|
120 |
+
customerId,
|
121 |
+
]
|
122 |
+
);
|
123 |
+
if (
|
124 |
+
isInitialized &&
|
125 |
+
Object.keys( currentPaymentMethods.current ).length === 0
|
126 |
+
) {
|
127 |
+
return <NoPaymentMethods />;
|
128 |
+
}
|
129 |
+
const renderedTabs = (
|
130 |
+
<Tabs
|
131 |
+
className="wc-block-components-checkout-payment-methods"
|
132 |
+
onSelect={ ( tabName ) => {
|
133 |
+
setActivePaymentMethod( tabName );
|
134 |
+
removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
|
135 |
+
} }
|
136 |
+
tabs={ Object.keys( paymentMethods ).map( ( name ) => {
|
137 |
+
const { label, ariaLabel } = paymentMethods[ name ];
|
138 |
+
return {
|
139 |
+
name,
|
140 |
+
title:
|
141 |
+
typeof label === 'string'
|
142 |
+
? label
|
143 |
+
: cloneElement( label, {
|
144 |
+
components:
|
145 |
+
currentPaymentMethodInterface.current
|
146 |
+
.components,
|
147 |
+
} ),
|
148 |
+
ariaLabel,
|
149 |
+
content: getRenderedTab( name ),
|
150 |
+
};
|
151 |
+
} ) }
|
152 |
+
initialTabName={ activePaymentMethod }
|
153 |
+
ariaLabel={ __(
|
154 |
+
'Payment Methods',
|
155 |
+
'woo-gutenberg-products-block'
|
156 |
+
) }
|
157 |
+
id="wc-block-payment-methods"
|
158 |
+
/>
|
159 |
+
);
|
160 |
+
|
161 |
+
const renderedSavedPaymentOptions = (
|
162 |
+
<SavedPaymentMethodOptions onSelect={ setSelectedToken } />
|
163 |
+
);
|
164 |
+
|
165 |
+
const renderedTabsAndSavedPaymentOptions = (
|
166 |
+
<>
|
167 |
+
{ renderedSavedPaymentOptions }
|
168 |
+
{ renderedTabs }
|
169 |
+
</>
|
170 |
+
);
|
171 |
+
|
172 |
+
return Object.keys( customerPaymentMethods ).length > 0 &&
|
173 |
+
selectedToken !== '0'
|
174 |
+
? renderedSavedPaymentOptions
|
175 |
+
: renderedTabsAndSavedPaymentOptions;
|
176 |
+
};
|
177 |
+
|
178 |
+
export default PaymentMethods;
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js
RENAMED
@@ -1,20 +1,13 @@
|
|
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 |
-
|
15 |
-
|
16 |
-
} from '@woocommerce/base-context
|
17 |
-
import
|
18 |
|
19 |
/**
|
20 |
* @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
|
@@ -37,7 +30,6 @@ const getCcOrEcheckPaymentMethodOption = (
|
|
37 |
return {
|
38 |
value: tokenId + '',
|
39 |
label: sprintf(
|
40 |
-
/* 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. */
|
41 |
__(
|
42 |
'%1$s ending in %2$s (expires %3$s)',
|
43 |
'woo-gutenberg-product-blocks'
|
@@ -50,9 +42,9 @@ 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,
|
57 |
} );
|
58 |
},
|
@@ -76,7 +68,6 @@ const getDefaultPaymentMethodOptions = (
|
|
76 |
return {
|
77 |
value: tokenId + '',
|
78 |
label: sprintf(
|
79 |
-
/* translators: %s is the name of the payment method gateway. */
|
80 |
__( 'Saved token for %s', 'woo-gutenberg-products-block' ),
|
81 |
method.gateway
|
82 |
),
|
@@ -84,102 +75,105 @@ 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,
|
91 |
} );
|
92 |
},
|
93 |
};
|
94 |
};
|
95 |
|
96 |
-
const SavedPaymentMethodOptions = () => {
|
|
|
97 |
const {
|
98 |
setPaymentStatus,
|
99 |
customerPaymentMethods,
|
100 |
-
activePaymentMethod,
|
101 |
setActivePaymentMethod,
|
102 |
-
activeSavedToken,
|
103 |
-
setActiveSavedToken,
|
104 |
} = usePaymentMethodDataContext();
|
105 |
-
const
|
106 |
-
const { paymentMethods } = usePaymentMethods();
|
107 |
-
const paymentMethodInterface = usePaymentMethodInterface();
|
108 |
|
109 |
/**
|
110 |
* @type {Object} Options
|
111 |
* @property {Array} current The current options on the type.
|
112 |
*/
|
113 |
const currentOptions = useRef( [] );
|
114 |
-
|
115 |
-
const updateToken = useCallback(
|
116 |
-
( token ) => {
|
117 |
-
setActiveSavedToken( token );
|
118 |
-
},
|
119 |
-
[ setActiveSavedToken ]
|
120 |
-
);
|
121 |
-
|
122 |
useEffect( () => {
|
123 |
-
|
124 |
-
const
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
149 |
} );
|
150 |
-
}
|
151 |
-
|
152 |
-
currentOptions.current = options;
|
153 |
}, [
|
154 |
customerPaymentMethods,
|
155 |
-
|
156 |
-
activeSavedToken,
|
157 |
-
activePaymentMethod,
|
158 |
setActivePaymentMethod,
|
159 |
setPaymentStatus,
|
160 |
-
standardMethods,
|
161 |
] );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
162 |
|
163 |
-
|
164 |
-
|
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, useState, useRef, useCallback } from '@wordpress/element';
|
|
|
|
|
|
|
|
|
|
|
5 |
import { __, sprintf } from '@wordpress/i18n';
|
|
|
|
|
6 |
import {
|
7 |
+
useEditorContext,
|
8 |
+
usePaymentMethodDataContext,
|
9 |
+
} from '@woocommerce/base-context';
|
10 |
+
import RadioControl from '@woocommerce/base-components/radio-control';
|
11 |
|
12 |
/**
|
13 |
* @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
|
30 |
return {
|
31 |
value: tokenId + '',
|
32 |
label: sprintf(
|
|
|
33 |
__(
|
34 |
'%1$s ending in %2$s (expires %3$s)',
|
35 |
'woo-gutenberg-product-blocks'
|
42 |
onChange: ( token ) => {
|
43 |
const savedTokenKey = `wc-${ method.gateway }-payment-token`;
|
44 |
setActivePaymentMethod( method.gateway );
|
45 |
+
setPaymentStatus().success( {
|
46 |
payment_method: method.gateway,
|
47 |
+
[ savedTokenKey ]: token,
|
48 |
isSavedToken: true,
|
49 |
} );
|
50 |
},
|
68 |
return {
|
69 |
value: tokenId + '',
|
70 |
label: sprintf(
|
|
|
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,
|
82 |
} );
|
83 |
},
|
84 |
};
|
85 |
};
|
86 |
|
87 |
+
const SavedPaymentMethodOptions = ( { onSelect } ) => {
|
88 |
+
const { isEditor } = useEditorContext();
|
89 |
const {
|
90 |
setPaymentStatus,
|
91 |
customerPaymentMethods,
|
|
|
92 |
setActivePaymentMethod,
|
|
|
|
|
93 |
} = usePaymentMethodDataContext();
|
94 |
+
const [ selectedToken, setSelectedToken ] = useState( '' );
|
|
|
|
|
95 |
|
96 |
/**
|
97 |
* @type {Object} Options
|
98 |
* @property {Array} current The current options on the type.
|
99 |
*/
|
100 |
const currentOptions = useRef( [] );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
useEffect( () => {
|
102 |
+
let options = [];
|
103 |
+
const paymentMethodKeys = Object.keys( customerPaymentMethods );
|
104 |
+
if ( paymentMethodKeys.length > 0 ) {
|
105 |
+
paymentMethodKeys.forEach( ( type ) => {
|
106 |
+
const paymentMethods = customerPaymentMethods[ type ];
|
107 |
+
if ( paymentMethods.length > 0 ) {
|
108 |
+
options = options.concat(
|
109 |
+
paymentMethods.map( ( paymentMethod ) => {
|
110 |
+
const option =
|
111 |
+
type === 'cc' || type === 'echeck'
|
112 |
+
? getCcOrEcheckPaymentMethodOption(
|
113 |
+
paymentMethod,
|
114 |
+
setActivePaymentMethod,
|
115 |
+
setPaymentStatus
|
116 |
+
)
|
117 |
+
: getDefaultPaymentMethodOptions(
|
118 |
+
paymentMethod,
|
119 |
+
setActivePaymentMethod,
|
120 |
+
setPaymentStatus
|
121 |
+
);
|
122 |
+
if (
|
123 |
+
paymentMethod.is_default &&
|
124 |
+
selectedToken === ''
|
125 |
+
) {
|
126 |
+
setSelectedToken( paymentMethod.tokenId + '' );
|
127 |
+
option.onChange( paymentMethod.tokenId );
|
128 |
+
}
|
129 |
+
return option;
|
130 |
+
} )
|
131 |
+
);
|
132 |
+
}
|
133 |
+
} );
|
134 |
+
if ( options.length > 0 ) {
|
135 |
+
currentOptions.current = options;
|
136 |
+
currentOptions.current.push( {
|
137 |
+
value: '0',
|
138 |
+
label: __(
|
139 |
+
'Use a new payment method',
|
140 |
+
'woo-gutenberg-product-blocks'
|
141 |
+
),
|
142 |
+
name: `wc-saved-payment-method-token-new`,
|
143 |
} );
|
144 |
+
}
|
145 |
+
}
|
|
|
146 |
}, [
|
147 |
customerPaymentMethods,
|
148 |
+
selectedToken,
|
|
|
|
|
149 |
setActivePaymentMethod,
|
150 |
setPaymentStatus,
|
|
|
151 |
] );
|
152 |
+
const updateToken = useCallback(
|
153 |
+
( token ) => {
|
154 |
+
if ( token === '0' ) {
|
155 |
+
setPaymentStatus().started();
|
156 |
+
}
|
157 |
+
setSelectedToken( token );
|
158 |
+
onSelect( token );
|
159 |
+
},
|
160 |
+
[ setSelectedToken, setPaymentStatus, onSelect ]
|
161 |
+
);
|
162 |
+
useEffect( () => {
|
163 |
+
if ( selectedToken && currentOptions.current.length > 0 ) {
|
164 |
+
updateToken( selectedToken );
|
165 |
+
}
|
166 |
+
}, [ selectedToken, updateToken ] );
|
167 |
|
168 |
+
// In the editor, show `Use a new payment method` option as selected.
|
169 |
+
const selectedOption = isEditor ? '0' : selectedToken + '';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
return currentOptions.current.length > 0 ? (
|
171 |
+
<RadioControl
|
172 |
+
id={ 'wc-payment-method-saved-tokens' }
|
173 |
+
selected={ selectedOption }
|
174 |
+
onChange={ updateToken }
|
175 |
+
options={ currentOptions.current }
|
176 |
+
/>
|
|
|
|
|
|
|
177 |
) : null;
|
178 |
};
|
179 |
|
assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss
RENAMED
@@ -67,7 +67,7 @@
|
|
67 |
left: 0;
|
68 |
top: 0;
|
69 |
transform-origin: top left;
|
70 |
-
color: $gray-
|
71 |
transition: transform 200ms ease;
|
72 |
margin: 0 0 0 #{$gap + 1px};
|
73 |
overflow: hidden;
|
@@ -109,14 +109,14 @@
|
|
109 |
}
|
110 |
|
111 |
.wc-block-gateway-input.has-error {
|
112 |
-
border-color: $
|
113 |
&:focus {
|
114 |
-
outline-color: $
|
115 |
}
|
116 |
}
|
117 |
|
118 |
.wc-block-gateway-input.has-error + label {
|
119 |
-
color: $
|
120 |
}
|
121 |
}
|
122 |
|
@@ -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 |
}
|
@@ -168,79 +183,3 @@
|
|
168 |
margin-left: $gap-smaller;
|
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 |
-
}
|
179 |
-
|
180 |
-
.wc-block-components-radio-control__input {
|
181 |
-
left: 16px;
|
182 |
-
}
|
183 |
-
}
|
184 |
-
|
185 |
-
// We need to add the first-child and last-child pseudoclasses for specificity.
|
186 |
-
.wc-block-components-radio-control__option,
|
187 |
-
.wc-block-components-radio-control__option:first-child,
|
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 |
-
@include with-translucent-border(1px 1px 0 1px);
|
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::after {
|
210 |
-
border-width: 0;
|
211 |
-
}
|
212 |
-
.wc-block-components-radio-control__label img {
|
213 |
-
height: 24px;
|
214 |
-
}
|
215 |
-
}
|
216 |
-
|
217 |
-
.wc-block-components-radio-control.disable-radio-control {
|
218 |
-
.wc-block-components-radio-control__option {
|
219 |
-
padding-left: 16px;
|
220 |
-
}
|
221 |
-
|
222 |
-
.wc-block-components-radio-control__input {
|
223 |
-
display: none;
|
224 |
-
}
|
225 |
-
}
|
226 |
-
|
227 |
-
.wc-block-components-checkout-step__description-payments-aligned {
|
228 |
-
padding-top: 14px;
|
229 |
-
height: 28px;
|
230 |
-
}
|
231 |
-
|
232 |
-
}
|
233 |
-
|
234 |
-
.wc-block-components-radio-control-accordion-content {
|
235 |
-
padding: 0 $gap em($gap) $gap;
|
236 |
-
|
237 |
-
&:empty {
|
238 |
-
display: none;
|
239 |
-
}
|
240 |
-
}
|
241 |
-
|
242 |
-
.wc-block-checkout__order-notes {
|
243 |
-
.wc-block-components-checkout-step__content {
|
244 |
-
padding-bottom: 0;
|
245 |
-
}
|
246 |
-
}
|
67 |
left: 0;
|
68 |
top: 0;
|
69 |
transform-origin: top left;
|
70 |
+
color: $gray-50;
|
71 |
transition: transform 200ms ease;
|
72 |
margin: 0 0 0 #{$gap + 1px};
|
73 |
overflow: hidden;
|
109 |
}
|
110 |
|
111 |
.wc-block-gateway-input.has-error {
|
112 |
+
border-color: $error-red;
|
113 |
&:focus {
|
114 |
+
outline-color: $error-red;
|
115 |
}
|
116 |
}
|
117 |
|
118 |
.wc-block-gateway-input.has-error + label {
|
119 |
+
color: $error-red;
|
120 |
}
|
121 |
}
|
122 |
|
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 |
}
|
183 |
margin-left: $gap-smaller;
|
184 |
}
|
185 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/price-slider/constrain-range-slider-values.js
CHANGED
@@ -2,8 +2,8 @@
|
|
2 |
* Validate a min and max value for a range slider against defined constraints (min, max, step).
|
3 |
*
|
4 |
* @param {Array} values Array containing min and max values.
|
5 |
-
* @param {number
|
6 |
-
* @param {number
|
7 |
* @param {number} step Step value for the sliders.
|
8 |
* @param {boolean} isMin Whether we're currently interacting with the min range slider or not, so we update the correct values.
|
9 |
* @return {Array} Validated and updated min/max values that fit within the range slider constraints.
|
2 |
* Validate a min and max value for a range slider against defined constraints (min, max, step).
|
3 |
*
|
4 |
* @param {Array} values Array containing min and max values.
|
5 |
+
* @param {number} min Min allowed value for the sliders.
|
6 |
+
* @param {number} max Max allowed value for the sliders.
|
7 |
* @param {number} step Step value for the sliders.
|
8 |
* @param {boolean} isMin Whether we're currently interacting with the min range slider or not, so we update the correct values.
|
9 |
* @return {Array} Validated and updated min/max values that fit within the range slider constraints.
|
assets/js/base/components/price-slider/index.js
CHANGED
@@ -3,6 +3,7 @@
|
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import {
|
|
|
6 |
useState,
|
7 |
useEffect,
|
8 |
useCallback,
|
@@ -12,7 +13,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
|
@@ -25,17 +25,6 @@ import FilterSubmitButton from '../filter-submit-button';
|
|
25 |
* Price slider component.
|
26 |
*
|
27 |
* @param {Object} props Component props.
|
28 |
-
* @param {number} props.minPrice Minimum price for slider.
|
29 |
-
* @param {number} props.maxPrice Maximum price for slider.
|
30 |
-
* @param {number} props.minConstraint Minimum constraint.
|
31 |
-
* @param {number} props.maxConstraint Maximum constraint.
|
32 |
-
* @param {function(any):any} props.onChange Function to call on the change event.
|
33 |
-
* @param {number} props.step What step values the slider uses.
|
34 |
-
* @param {Object} props.currency Currency configuration object.
|
35 |
-
* @param {boolean} props.showInputFields Whether to show input fields for the values or not.
|
36 |
-
* @param {boolean} props.showFilterButton Whether to show the filter button for the slider.
|
37 |
-
* @param {boolean} props.isLoading Whether values are loading or not.
|
38 |
-
* @param {function():any} props.onSubmit Function to call when submit event fires.
|
39 |
*/
|
40 |
const PriceSlider = ( {
|
41 |
minPrice,
|
@@ -112,6 +101,7 @@ const PriceSlider = ( {
|
|
112 |
minConstraint,
|
113 |
maxConstraint,
|
114 |
hasValidConstraints,
|
|
|
115 |
] );
|
116 |
|
117 |
/**
|
@@ -185,14 +175,7 @@ const PriceSlider = ( {
|
|
185 |
parseInt( values[ 1 ], 10 ),
|
186 |
] );
|
187 |
},
|
188 |
-
[
|
189 |
-
onChange,
|
190 |
-
minPrice,
|
191 |
-
maxPrice,
|
192 |
-
minConstraint,
|
193 |
-
maxConstraint,
|
194 |
-
stepValue,
|
195 |
-
]
|
196 |
);
|
197 |
|
198 |
/**
|
@@ -227,7 +210,14 @@ const PriceSlider = ( {
|
|
227 |
parseInt( values[ 1 ], 10 ),
|
228 |
] );
|
229 |
},
|
230 |
-
[
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
231 |
);
|
232 |
|
233 |
const classes = classnames(
|
@@ -242,13 +232,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 }>
|
@@ -308,7 +295,7 @@ const PriceSlider = ( {
|
|
308 |
</div>
|
309 |
<div className="wc-block-price-filter__controls wc-block-components-price-slider__controls">
|
310 |
{ showInputFields && (
|
311 |
-
|
312 |
<FormattedMonetaryAmount
|
313 |
currency={ currency }
|
314 |
displayType="input"
|
@@ -345,7 +332,7 @@ const PriceSlider = ( {
|
|
345 |
disabled={ isLoading || ! hasValidConstraints }
|
346 |
value={ maxPriceInput }
|
347 |
/>
|
348 |
-
|
349 |
) }
|
350 |
{ ! showInputFields &&
|
351 |
! isLoading &&
|
@@ -356,11 +343,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>
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import {
|
6 |
+
Fragment,
|
7 |
useState,
|
8 |
useEffect,
|
9 |
useCallback,
|
13 |
import PropTypes from 'prop-types';
|
14 |
import classnames from 'classnames';
|
15 |
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
|
|
|
16 |
|
17 |
/**
|
18 |
* Internal dependencies
|
25 |
* Price slider component.
|
26 |
*
|
27 |
* @param {Object} props Component props.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
*/
|
29 |
const PriceSlider = ( {
|
30 |
minPrice,
|
101 |
minConstraint,
|
102 |
maxConstraint,
|
103 |
hasValidConstraints,
|
104 |
+
stepValue,
|
105 |
] );
|
106 |
|
107 |
/**
|
175 |
parseInt( values[ 1 ], 10 ),
|
176 |
] );
|
177 |
},
|
178 |
+
[ minPrice, maxPrice, minConstraint, maxConstraint, stepValue ]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
179 |
);
|
180 |
|
181 |
/**
|
210 |
parseInt( values[ 1 ], 10 ),
|
211 |
] );
|
212 |
},
|
213 |
+
[
|
214 |
+
minConstraint,
|
215 |
+
maxConstraint,
|
216 |
+
stepValue,
|
217 |
+
minPriceInput,
|
218 |
+
maxPriceInput,
|
219 |
+
currency,
|
220 |
+
]
|
221 |
);
|
222 |
|
223 |
const classes = classnames(
|
232 |
! hasValidConstraints && 'is-disabled'
|
233 |
);
|
234 |
|
|
|
|
|
|
|
235 |
const minRangeStep =
|
236 |
+
minRange && document.activeElement === minRange.current ? stepValue : 1;
|
237 |
const maxRangeStep =
|
238 |
+
maxRange && document.activeElement === maxRange.current ? stepValue : 1;
|
239 |
|
240 |
return (
|
241 |
<div className={ classes }>
|
295 |
</div>
|
296 |
<div className="wc-block-price-filter__controls wc-block-components-price-slider__controls">
|
297 |
{ showInputFields && (
|
298 |
+
<Fragment>
|
299 |
<FormattedMonetaryAmount
|
300 |
currency={ currency }
|
301 |
displayType="input"
|
332 |
disabled={ isLoading || ! hasValidConstraints }
|
333 |
value={ maxPriceInput }
|
334 |
/>
|
335 |
+
</Fragment>
|
336 |
) }
|
337 |
{ ! showInputFields &&
|
338 |
! isLoading &&
|
343 |
:
|
344 |
<FormattedMonetaryAmount
|
345 |
currency={ currency }
|
346 |
+
displayType="text"
|
347 |
value={ minPrice }
|
348 |
/>
|
349 |
–
|
350 |
<FormattedMonetaryAmount
|
351 |
currency={ currency }
|
352 |
+
displayType="text"
|
353 |
value={ maxPrice }
|
354 |
/>
|
355 |
</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 {
|
@@ -49,6 +49,46 @@
|
|
49 |
.wc-block-components-price-slider {
|
50 |
margin-bottom: $gap-large;
|
51 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
&.wc-block-components-price-slider--has-filter-button {
|
53 |
.wc-block-components-price-slider__controls {
|
54 |
justify-content: flex-end;
|
@@ -59,211 +99,172 @@
|
|
59 |
}
|
60 |
}
|
61 |
}
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
|
|
|
|
|
|
70 |
}
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
animation: none;
|
78 |
}
|
79 |
-
}
|
80 |
-
}
|
81 |
-
|
82 |
-
.wc-block-components-price-slider__range-input-wrapper {
|
83 |
-
@include reset;
|
84 |
-
height: 9px;
|
85 |
-
clear: both;
|
86 |
-
position: relative;
|
87 |
-
box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.1);
|
88 |
-
background: #e1e1e1;
|
89 |
-
margin: 15px 0;
|
90 |
-
}
|
91 |
-
|
92 |
-
.wc-block-components-price-slider__range-input-progress {
|
93 |
-
height: 9px;
|
94 |
-
width: 100%;
|
95 |
-
position: absolute;
|
96 |
-
left: 0;
|
97 |
-
top: 0;
|
98 |
-
--track-background: linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
|
99 |
-
--range-color: #{$studio-woocommerce-purple-30};
|
100 |
-
/*rtl:ignore*/
|
101 |
-
background: var(--track-background);
|
102 |
-
}
|
103 |
-
|
104 |
-
.wc-block-components-price-slider__controls {
|
105 |
-
display: flex;
|
106 |
-
|
107 |
-
.wc-block-components-price-slider__amount {
|
108 |
-
margin: 0;
|
109 |
-
border-radius: 4px;
|
110 |
-
width: auto;
|
111 |
-
max-width: 100px;
|
112 |
-
min-width: 0;
|
113 |
|
114 |
-
|
115 |
-
|
116 |
}
|
117 |
-
|
118 |
-
|
119 |
}
|
120 |
-
|
121 |
-
|
122 |
-
.wc-block-components-price-slider__range-input {
|
123 |
-
@include reset;
|
124 |
-
width: 100%;
|
125 |
-
height: 0;
|
126 |
-
display: block;
|
127 |
-
position: relative;
|
128 |
-
pointer-events: none;
|
129 |
-
outline: none !important;
|
130 |
-
position: absolute;
|
131 |
-
left: 0;
|
132 |
-
top: 0;
|
133 |
-
|
134 |
-
&::-webkit-slider-runnable-track {
|
135 |
-
@include track;
|
136 |
-
}
|
137 |
-
&::-webkit-slider-thumb {
|
138 |
-
@include thumb;
|
139 |
-
margin: -6px 0 0 0;
|
140 |
-
}
|
141 |
-
&::-webkit-slider-progress {
|
142 |
-
@include reset;
|
143 |
-
}
|
144 |
-
|
145 |
-
&::-moz-focus-outer {
|
146 |
-
border: 0;
|
147 |
-
}
|
148 |
-
&::-moz-range-track {
|
149 |
-
@include track;
|
150 |
-
}
|
151 |
-
&::-moz-range-progress {
|
152 |
-
@include reset;
|
153 |
-
}
|
154 |
-
&::-moz-range-thumb {
|
155 |
-
@include thumb;
|
156 |
-
}
|
157 |
-
|
158 |
-
&::-ms-thumb {
|
159 |
-
@include thumb;
|
160 |
-
}
|
161 |
-
|
162 |
-
&:focus {
|
163 |
-
&::-webkit-slider-thumb {
|
164 |
-
@include thumbFocus;
|
165 |
}
|
166 |
&::-moz-range-thumb {
|
167 |
-
@include
|
168 |
}
|
|
|
169 |
&::-ms-thumb {
|
170 |
-
@include
|
171 |
}
|
172 |
-
}
|
173 |
-
|
174 |
-
&.wc-block-components-price-slider__range-input--min {
|
175 |
-
z-index: 21;
|
176 |
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
|
|
|
|
|
|
184 |
}
|
185 |
-
|
186 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
187 |
}
|
188 |
-
}
|
189 |
|
190 |
-
|
191 |
-
|
192 |
|
193 |
-
|
194 |
-
|
195 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
196 |
}
|
197 |
-
|
198 |
-
|
199 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
200 |
}
|
201 |
-
|
202 |
-
|
|
|
|
|
|
|
|
|
|
|
203 |
}
|
204 |
}
|
205 |
}
|
206 |
|
207 |
.rtl {
|
208 |
-
.wc-block-components-price-slider__range-input-progress {
|
209 |
--track-background: linear-gradient(to left, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
|
210 |
-
--range-color: #
|
211 |
background: var(--track-background);
|
212 |
}
|
213 |
}
|
214 |
|
215 |
-
@mixin ie
|
216 |
-
.wc-block-components-price-
|
217 |
-
|
218 |
-
box-shadow: none;
|
219 |
-
height: 24px;
|
220 |
-
}
|
221 |
-
.wc-block-components-price-slider__range-input-progress {
|
222 |
-
background: #{$studio-woocommerce-purple-30};
|
223 |
-
width: 100%;
|
224 |
-
top: 7px;
|
225 |
-
}
|
226 |
-
.wc-block-components-price-slider__range-input {
|
227 |
-
height: 24px;
|
228 |
-
pointer-events: auto;
|
229 |
-
|
230 |
-
&::-ms-track {
|
231 |
-
/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
|
232 |
background: transparent;
|
|
|
|
|
233 |
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
}
|
241 |
-
&::-ms-fill-lower {
|
242 |
-
background: #e1e1e1;
|
243 |
-
box-shadow: 0 0 0 1px inset #b8b8b8;
|
244 |
-
}
|
245 |
-
&::-ms-fill-upper {
|
246 |
-
background: transparent;
|
247 |
-
}
|
248 |
-
&::-ms-tooltip {
|
249 |
-
display: none;
|
250 |
}
|
251 |
-
|
252 |
-
|
253 |
pointer-events: auto;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
254 |
}
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
}
|
264 |
-
}
|
265 |
|
266 |
-
.wc-block-components-price-slider {
|
267 |
&.is-loading,
|
268 |
&.is-disabled {
|
269 |
.wc-block-components-price-slider__range-input-wrapper {
|
@@ -281,80 +282,9 @@
|
|
281 |
}
|
282 |
|
283 |
/* IE 11 will not support multi-range slider due to poor pointer-events support on the thumb. Reverts to 2 sliders. */
|
284 |
-
@
|
285 |
-
@include ie
|
286 |
}
|
287 |
-
|
288 |
-
// Targets Edge <= 18.
|
289 |
@supports (-ms-ime-align:auto) {
|
290 |
-
@include ie
|
291 |
-
}
|
292 |
-
|
293 |
-
.theme-twentytwentyone {
|
294 |
-
$border-width: 3px;
|
295 |
-
|
296 |
-
.wc-block-components-price-slider__range-input-wrapper {
|
297 |
-
background: transparent;
|
298 |
-
border: $border-width solid currentColor;
|
299 |
-
box-sizing: border-box;
|
300 |
-
}
|
301 |
-
|
302 |
-
.wc-block-components-price-slider__range-input-progress {
|
303 |
-
--range-color: currentColor;
|
304 |
-
margin: -$border-width;
|
305 |
-
}
|
306 |
-
|
307 |
-
.wc-block-price-filter__range-input {
|
308 |
-
background: transparent;
|
309 |
-
margin: -$border-width;
|
310 |
-
width: calc(100% + #{$border-width * 2});
|
311 |
-
|
312 |
-
&:hover,
|
313 |
-
&:focus {
|
314 |
-
&::-webkit-slider-thumb {
|
315 |
-
filter: none;
|
316 |
-
}
|
317 |
-
&::-moz-range-thumb {
|
318 |
-
filter: none;
|
319 |
-
}
|
320 |
-
&::-ms-thumb {
|
321 |
-
filter: none;
|
322 |
-
}
|
323 |
-
}
|
324 |
-
|
325 |
-
&::-webkit-slider-thumb {
|
326 |
-
margin-top: -9px;
|
327 |
-
}
|
328 |
-
|
329 |
-
&.wc-block-components-price-slider__range-input--max::-moz-range-thumb {
|
330 |
-
transform: translate(2px, 1px);
|
331 |
-
}
|
332 |
-
|
333 |
-
&.wc-block-components-price-slider__range-input--min::-moz-range-thumb {
|
334 |
-
transform: translate(-2px, 1px);
|
335 |
-
}
|
336 |
-
|
337 |
-
&::-ms-track {
|
338 |
-
border-color: transparent !important;
|
339 |
-
}
|
340 |
-
}
|
341 |
-
|
342 |
-
@include ie11() {
|
343 |
-
.wc-block-components-price-slider__range-input-wrapper {
|
344 |
-
border: 0;
|
345 |
-
height: auto;
|
346 |
-
position: relative;
|
347 |
-
height: 50px;
|
348 |
-
}
|
349 |
-
|
350 |
-
.wc-block-components-price-slider__range-input-progress {
|
351 |
-
display: none;
|
352 |
-
}
|
353 |
-
|
354 |
-
.wc-block-price-filter__range-input {
|
355 |
-
height: 100%;
|
356 |
-
margin: 0;
|
357 |
-
width: 100%;
|
358 |
-
}
|
359 |
-
}
|
360 |
}
|
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='%2395588A' 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='%2395588A' xlink:href='%23a'/%3E%3C/g%3E%3Cpath stroke='%2395588A' d='M9 27v9m3-9v9'/%3E%3Cg%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='%2395588A' 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='%2395588A' xlink:href='%23b'/%3E%3C/g%3E%3Cpath stroke='%2395588A' 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 {
|
49 |
.wc-block-components-price-slider {
|
50 |
margin-bottom: $gap-large;
|
51 |
|
52 |
+
.wc-block-components-price-slider__range-input-wrapper {
|
53 |
+
@include reset;
|
54 |
+
height: 9px;
|
55 |
+
clear: both;
|
56 |
+
position: relative;
|
57 |
+
box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.1);
|
58 |
+
background: #e1e1e1;
|
59 |
+
margin: 15px 0;
|
60 |
+
|
61 |
+
.wc-block-components-price-slider__range-input-progress {
|
62 |
+
height: 9px;
|
63 |
+
width: 100%;
|
64 |
+
position: absolute;
|
65 |
+
left: 0;
|
66 |
+
top: 0;
|
67 |
+
--track-background: linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
|
68 |
+
--range-color: #a8739d;
|
69 |
+
/*rtl:ignore*/
|
70 |
+
background: var(--track-background);
|
71 |
+
}
|
72 |
+
}
|
73 |
+
|
74 |
+
.wc-block-components-price-slider__controls {
|
75 |
+
display: flex;
|
76 |
+
|
77 |
+
.wc-block-components-price-slider__amount {
|
78 |
+
margin: 0;
|
79 |
+
border-radius: 4px;
|
80 |
+
width: auto;
|
81 |
+
max-width: 100px;
|
82 |
+
min-width: 0;
|
83 |
+
|
84 |
+
&.wc-block-components-price-slider__amount--min {
|
85 |
+
margin-right: 10px;
|
86 |
+
}
|
87 |
+
&.wc-block-components-price-slider__amount--max {
|
88 |
+
margin-left: auto;
|
89 |
+
}
|
90 |
+
}
|
91 |
+
}
|
92 |
&.wc-block-components-price-slider--has-filter-button {
|
93 |
.wc-block-components-price-slider__controls {
|
94 |
justify-content: flex-end;
|
99 |
}
|
100 |
}
|
101 |
}
|
102 |
+
.wc-block-components-price-slider__range-input {
|
103 |
+
@include reset;
|
104 |
+
width: 100%;
|
105 |
+
height: 0;
|
106 |
+
display: block;
|
107 |
+
position: relative;
|
108 |
+
pointer-events: none;
|
109 |
+
outline: none !important;
|
110 |
+
|
111 |
+
&::-webkit-slider-runnable-track {
|
112 |
+
@include track;
|
113 |
}
|
114 |
+
&::-webkit-slider-thumb {
|
115 |
+
@include thumb;
|
116 |
+
margin: -6px 0 0 0;
|
117 |
+
}
|
118 |
+
&::-webkit-slider-progress {
|
119 |
+
@include reset;
|
|
|
120 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
|
122 |
+
&::-moz-focus-outer {
|
123 |
+
border: 0;
|
124 |
}
|
125 |
+
&::-moz-range-track {
|
126 |
+
@include track;
|
127 |
}
|
128 |
+
&::-moz-range-progress {
|
129 |
+
@include reset;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
}
|
131 |
&::-moz-range-thumb {
|
132 |
+
@include thumb;
|
133 |
}
|
134 |
+
|
135 |
&::-ms-thumb {
|
136 |
+
@include thumb;
|
137 |
}
|
|
|
|
|
|
|
|
|
138 |
|
139 |
+
&:focus {
|
140 |
+
&::-webkit-slider-thumb {
|
141 |
+
@include thumbFocus;
|
142 |
+
}
|
143 |
+
&::-moz-range-thumb {
|
144 |
+
@include thumbFocus;
|
145 |
+
}
|
146 |
+
&::-ms-thumb {
|
147 |
+
@include thumbFocus;
|
148 |
+
}
|
149 |
}
|
150 |
+
|
151 |
+
&.wc-block-components-price-slider__range-input--min {
|
152 |
+
z-index: 21;
|
153 |
+
|
154 |
+
&::-webkit-slider-thumb {
|
155 |
+
margin-left: -2px;
|
156 |
+
background-position-x: left;
|
157 |
+
}
|
158 |
+
&::-moz-range-thumb {
|
159 |
+
background-position-x: left;
|
160 |
+
transform: translate(-2px, 4px);
|
161 |
+
}
|
162 |
+
&::-ms-thumb {
|
163 |
+
background-position-x: left;
|
164 |
+
}
|
165 |
}
|
|
|
166 |
|
167 |
+
&.wc-block-components-price-slider__range-input--max {
|
168 |
+
z-index: 20;
|
169 |
|
170 |
+
&::-webkit-slider-thumb {
|
171 |
+
background-position-x: right;
|
172 |
+
margin-left: 2px;
|
173 |
+
}
|
174 |
+
&::-moz-range-thumb {
|
175 |
+
background-position-x: right;
|
176 |
+
transform: translate(2px, 4px);
|
177 |
+
}
|
178 |
+
&::-ms-thumb {
|
179 |
+
background-position-x: right;
|
180 |
+
}
|
181 |
}
|
182 |
+
}
|
183 |
+
|
184 |
+
&.is-loading,
|
185 |
+
&.is-disabled {
|
186 |
+
.wc-block-components-price-slider__range-input-wrapper,
|
187 |
+
.wc-block-components-price-slider__amount,
|
188 |
+
.wc-block-components-price-slider__button {
|
189 |
+
@include placeholder();
|
190 |
+
box-shadow: none;
|
191 |
}
|
192 |
+
}
|
193 |
+
|
194 |
+
&.is-disabled:not(.is-loading) {
|
195 |
+
.wc-block-components-price-slider__range-input-wrapper,
|
196 |
+
.wc-block-components-price-slider__amount,
|
197 |
+
.wc-block-components-price-slider__button {
|
198 |
+
animation: none;
|
199 |
}
|
200 |
}
|
201 |
}
|
202 |
|
203 |
.rtl {
|
204 |
+
.wc-block-components-price-slider .wc-block-components-price-slider__range-input-wrapper .wc-block-components-price-slider__range-input-progress {
|
205 |
--track-background: linear-gradient(to left, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
|
206 |
+
--range-color: #a8739d;
|
207 |
background: var(--track-background);
|
208 |
}
|
209 |
}
|
210 |
|
211 |
+
@mixin ie {
|
212 |
+
.wc-block-components-price-slider {
|
213 |
+
.wc-block-components-price-slider__range-input-wrapper {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
214 |
background: transparent;
|
215 |
+
box-shadow: none;
|
216 |
+
height: 24px;
|
217 |
|
218 |
+
.wc-block-components-price-slider__range-input-progress {
|
219 |
+
background: #a8739d;
|
220 |
+
box-shadow: 0 0 0 1px inset #95588a;
|
221 |
+
width: 100%;
|
222 |
+
top: 7px;
|
223 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
}
|
225 |
+
.wc-block-components-price-slider__range-input {
|
226 |
+
height: 24px;
|
227 |
pointer-events: auto;
|
228 |
+
position: absolute;
|
229 |
+
left: 0;
|
230 |
+
top: 0;
|
231 |
+
|
232 |
+
&::-ms-track {
|
233 |
+
/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
|
234 |
+
background: transparent;
|
235 |
+
|
236 |
+
/*leave room for the larger thumb to overflow with a transparent border */
|
237 |
+
border-color: transparent;
|
238 |
+
border-width: 7px 0;
|
239 |
+
|
240 |
+
/*remove default tick marks*/
|
241 |
+
color: transparent;
|
242 |
+
}
|
243 |
+
&::-ms-fill-lower {
|
244 |
+
background: #e1e1e1;
|
245 |
+
box-shadow: 0 0 0 1px inset #b8b8b8;
|
246 |
+
}
|
247 |
+
&::-ms-fill-upper {
|
248 |
+
background: transparent;
|
249 |
+
}
|
250 |
+
&::-ms-tooltip {
|
251 |
+
display: none;
|
252 |
+
}
|
253 |
+
&::-ms-thumb {
|
254 |
+
transform: translate(1px, 0);
|
255 |
+
pointer-events: auto;
|
256 |
+
}
|
257 |
}
|
258 |
+
.wc-block-components-price-slider__range-input--max {
|
259 |
+
&::-ms-fill-upper {
|
260 |
+
background: #e1e1e1;
|
261 |
+
box-shadow: 0 0 0 1px inset #b8b8b8;
|
262 |
+
}
|
263 |
+
&::-ms-fill-lower {
|
264 |
+
background: transparent;
|
265 |
+
}
|
266 |
}
|
|
|
267 |
|
|
|
268 |
&.is-loading,
|
269 |
&.is-disabled {
|
270 |
.wc-block-components-price-slider__range-input-wrapper {
|
282 |
}
|
283 |
|
284 |
/* IE 11 will not support multi-range slider due to poor pointer-events support on the thumb. Reverts to 2 sliders. */
|
285 |
+
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
|
286 |
+
@include ie;
|
287 |
}
|
|
|
|
|
288 |
@supports (-ms-ime-align:auto) {
|
289 |
+
@include ie;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
290 |
}
|
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
@@ -7,12 +7,9 @@ import PropTypes from 'prop-types';
|
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
10 |
-
import ProductList from './
|
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;
|
7 |
/**
|
8 |
* Internal dependencies
|
9 |
*/
|
10 |
+
import ProductList from './index';
|
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/index.js
CHANGED
@@ -1,2 +1,236 @@
|
|
1 |
-
|
2 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __, _n, sprintf } from '@wordpress/i18n';
|
5 |
+
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 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';
|
21 |
+
|
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 ) {
|
33 |
+
case 'menu_order':
|
34 |
+
case 'popularity':
|
35 |
+
case 'rating':
|
36 |
+
case 'price':
|
37 |
+
return {
|
38 |
+
orderby: orderName,
|
39 |
+
order: 'asc',
|
40 |
+
};
|
41 |
+
case 'price-desc':
|
42 |
+
return {
|
43 |
+
orderby: 'price',
|
44 |
+
order: 'desc',
|
45 |
+
};
|
46 |
+
case 'date':
|
47 |
+
return {
|
48 |
+
orderby: 'date',
|
49 |
+
order: 'desc',
|
50 |
+
};
|
51 |
+
}
|
52 |
+
};
|
53 |
+
return {
|
54 |
+
...getSortArgs( sortValue ),
|
55 |
+
catalog_visibility: 'catalog',
|
56 |
+
per_page: columns * rows,
|
57 |
+
page: currentPage,
|
58 |
+
};
|
59 |
+
};
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Given a query state, returns the same query without the attributes related to
|
63 |
+
* pagination and sorting.
|
64 |
+
*
|
65 |
+
* @param {Object} query Query to extract the attributes from.
|
66 |
+
*
|
67 |
+
* @return {Object} Same query without pagination and sorting attributes.
|
68 |
+
*/
|
69 |
+
|
70 |
+
const extractPaginationAndSortAttributes = ( query ) => {
|
71 |
+
/* eslint-disable-next-line no-unused-vars, camelcase */
|
72 |
+
const { order, orderby, page, per_page, ...totalQuery } = query;
|
73 |
+
return totalQuery;
|
74 |
+
};
|
75 |
+
|
76 |
+
const announceLoadingCompletion = ( totalProducts ) => {
|
77 |
+
if ( ! Number.isFinite( totalProducts ) ) {
|
78 |
+
return;
|
79 |
+
}
|
80 |
+
|
81 |
+
if ( totalProducts === 0 ) {
|
82 |
+
speak( __( 'No products found', 'woo-gutenberg-products-block' ) );
|
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',
|
90 |
+
totalProducts,
|
91 |
+
'woo-gutenberg-products-block'
|
92 |
+
),
|
93 |
+
totalProducts
|
94 |
+
)
|
95 |
+
);
|
96 |
+
}
|
97 |
+
};
|
98 |
+
|
99 |
+
const ProductList = ( {
|
100 |
+
attributes,
|
101 |
+
currentPage,
|
102 |
+
onPageChange,
|
103 |
+
onSortChange,
|
104 |
+
sortValue,
|
105 |
+
scrollToTop,
|
106 |
+
} ) => {
|
107 |
+
const [ queryState ] = useSynchronizedQueryState(
|
108 |
+
generateQuery( {
|
109 |
+
attributes,
|
110 |
+
sortValue,
|
111 |
+
currentPage,
|
112 |
+
} )
|
113 |
+
);
|
114 |
+
const { products, totalProducts, productsLoading } = useStoreProducts(
|
115 |
+
queryState
|
116 |
+
);
|
117 |
+
const { parentClassName } = useInnerBlockLayoutContext();
|
118 |
+
const totalQuery = extractPaginationAndSortAttributes( queryState );
|
119 |
+
|
120 |
+
// These are possible filters.
|
121 |
+
const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
|
122 |
+
'attributes',
|
123 |
+
[]
|
124 |
+
);
|
125 |
+
const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
|
126 |
+
const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
|
127 |
+
|
128 |
+
// Only update previous query totals if the query is different and
|
129 |
+
// the total number of products is a finite number.
|
130 |
+
const previousQueryTotals = usePrevious(
|
131 |
+
{ totalQuery, totalProducts },
|
132 |
+
(
|
133 |
+
{ totalQuery: nextQuery, totalProducts: nextProducts },
|
134 |
+
{ totalQuery: currentQuery } = {}
|
135 |
+
) =>
|
136 |
+
! isEqual( nextQuery, currentQuery ) &&
|
137 |
+
Number.isFinite( nextProducts )
|
138 |
+
);
|
139 |
+
const isPreviousTotalQueryEqual =
|
140 |
+
typeof previousQueryTotals === 'object' &&
|
141 |
+
isEqual( totalQuery, previousQueryTotals.totalQuery );
|
142 |
+
useEffect( () => {
|
143 |
+
// If query state (excluding pagination/sorting attributes) changed,
|
144 |
+
// reset pagination to the first page.
|
145 |
+
if ( ! isPreviousTotalQueryEqual ) {
|
146 |
+
onPageChange( 1 );
|
147 |
+
|
148 |
+
// Make sure there was a previous query, so we don't announce it on page load.
|
149 |
+
if ( previousQueryTotals ) {
|
150 |
+
announceLoadingCompletion( totalProducts );
|
151 |
+
}
|
152 |
+
}
|
153 |
+
}, [ queryState ] );
|
154 |
+
|
155 |
+
const onPaginationChange = ( newPage ) => {
|
156 |
+
scrollToTop( { focusableSelector: 'a, button' } );
|
157 |
+
onPageChange( newPage );
|
158 |
+
};
|
159 |
+
|
160 |
+
const getClassnames = () => {
|
161 |
+
const { columns, rows, alignButtons, align } = attributes;
|
162 |
+
const alignClass = typeof align !== 'undefined' ? 'align' + align : '';
|
163 |
+
|
164 |
+
return classnames(
|
165 |
+
parentClassName,
|
166 |
+
alignClass,
|
167 |
+
'has-' + columns + '-columns',
|
168 |
+
{
|
169 |
+
'has-multiple-rows': rows > 1,
|
170 |
+
'has-aligned-buttons': alignButtons,
|
171 |
+
}
|
172 |
+
);
|
173 |
+
};
|
174 |
+
|
175 |
+
const { contentVisibility } = attributes;
|
176 |
+
const perPage = attributes.columns * attributes.rows;
|
177 |
+
const totalPages =
|
178 |
+
! Number.isFinite( totalProducts ) && isPreviousTotalQueryEqual
|
179 |
+
? Math.ceil( previousQueryTotals.totalProducts / perPage )
|
180 |
+
: Math.ceil( totalProducts / perPage );
|
181 |
+
const listProducts = products.length
|
182 |
+
? products
|
183 |
+
: Array.from( { length: perPage } );
|
184 |
+
const hasProducts = products.length !== 0 || productsLoading;
|
185 |
+
const hasFilters =
|
186 |
+
productAttributes.length > 0 ||
|
187 |
+
Number.isFinite( minPrice ) ||
|
188 |
+
Number.isFinite( maxPrice );
|
189 |
+
|
190 |
+
return (
|
191 |
+
<div className={ getClassnames() }>
|
192 |
+
{ contentVisibility.orderBy && hasProducts && (
|
193 |
+
<ProductSortSelect
|
194 |
+
onChange={ onSortChange }
|
195 |
+
value={ sortValue }
|
196 |
+
/>
|
197 |
+
) }
|
198 |
+
{ ! hasProducts && hasFilters && (
|
199 |
+
<NoMatchingProducts
|
200 |
+
resetCallback={ () => {
|
201 |
+
setProductAttributes( [] );
|
202 |
+
setMinPrice( null );
|
203 |
+
setMaxPrice( null );
|
204 |
+
} }
|
205 |
+
/>
|
206 |
+
) }
|
207 |
+
{ ! hasProducts && ! hasFilters && <NoProducts /> }
|
208 |
+
{ hasProducts && (
|
209 |
+
<ul className={ `${ parentClassName }__products` }>
|
210 |
+
{ listProducts.map( ( product = {}, i ) => (
|
211 |
+
<ProductListItem
|
212 |
+
key={ product.id || i }
|
213 |
+
attributes={ attributes }
|
214 |
+
product={ product }
|
215 |
+
/>
|
216 |
+
) ) }
|
217 |
+
</ul>
|
218 |
+
) }
|
219 |
+
{ totalPages > 1 && (
|
220 |
+
<Pagination
|
221 |
+
currentPage={ currentPage }
|
222 |
+
onPageChange={ onPaginationChange }
|
223 |
+
totalPages={ totalPages }
|
224 |
+
/>
|
225 |
+
) }
|
226 |
+
</div>
|
227 |
+
);
|
228 |
+
};
|
229 |
+
|
230 |
+
ProductList.propTypes = {
|
231 |
+
attributes: PropTypes.object.isRequired,
|
232 |
+
// From withScrollToTop.
|
233 |
+
scrollToTop: PropTypes.func,
|
234 |
+
};
|
235 |
+
|
236 |
+
export default withScrollToTop( ProductList );
|
assets/js/base/components/product-list/product-list.js
DELETED
@@ -1,262 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { __, _n, sprintf } from '@wordpress/i18n';
|
5 |
-
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 |
-
useStoreEvents,
|
13 |
-
useStoreProducts,
|
14 |
-
useSynchronizedQueryState,
|
15 |
-
useQueryStateByKey,
|
16 |
-
} from '@woocommerce/base-context/hooks';
|
17 |
-
import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
|
18 |
-
import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
|
19 |
-
import { speak } from '@wordpress/a11y';
|
20 |
-
|
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 ) {
|
39 |
-
case 'menu_order':
|
40 |
-
case 'popularity':
|
41 |
-
case 'rating':
|
42 |
-
case 'price':
|
43 |
-
return {
|
44 |
-
orderby: orderName,
|
45 |
-
order: 'asc',
|
46 |
-
};
|
47 |
-
case 'price-desc':
|
48 |
-
return {
|
49 |
-
orderby: 'price',
|
50 |
-
order: 'desc',
|
51 |
-
};
|
52 |
-
case 'date':
|
53 |
-
return {
|
54 |
-
orderby: 'date',
|
55 |
-
order: 'desc',
|
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 |
-
|
71 |
-
/**
|
72 |
-
* Given a query state, returns the same query without the attributes related to
|
73 |
-
* pagination and sorting.
|
74 |
-
*
|
75 |
-
* @param {Object} query Query to extract the attributes from.
|
76 |
-
*
|
77 |
-
* @return {Object} Same query without pagination and sorting attributes.
|
78 |
-
*/
|
79 |
-
|
80 |
-
const extractPaginationAndSortAttributes = ( query ) => {
|
81 |
-
/* eslint-disable-next-line no-unused-vars, camelcase */
|
82 |
-
const { order, orderby, page, per_page, ...totalQuery } = query;
|
83 |
-
return totalQuery || {};
|
84 |
-
};
|
85 |
-
|
86 |
-
const announceLoadingCompletion = ( totalProducts ) => {
|
87 |
-
if ( ! Number.isFinite( totalProducts ) ) {
|
88 |
-
return;
|
89 |
-
}
|
90 |
-
|
91 |
-
if ( totalProducts === 0 ) {
|
92 |
-
speak( __( 'No products found', 'woo-gutenberg-products-block' ) );
|
93 |
-
} else {
|
94 |
-
speak(
|
95 |
-
sprintf(
|
96 |
-
/* translators: %s is an integer higher than 0 (1, 2, 3...) */
|
97 |
-
_n(
|
98 |
-
'%d product found',
|
99 |
-
'%d products found',
|
100 |
-
totalProducts,
|
101 |
-
'woo-gutenberg-products-block'
|
102 |
-
),
|
103 |
-
totalProducts
|
104 |
-
)
|
105 |
-
);
|
106 |
-
}
|
107 |
-
};
|
108 |
-
|
109 |
-
const areQueryTotalsDifferent = (
|
110 |
-
{ totalQuery: nextQuery, totalProducts: nextProducts },
|
111 |
-
{ totalQuery: currentQuery } = {}
|
112 |
-
) => ! isEqual( nextQuery, currentQuery ) && Number.isFinite( nextProducts );
|
113 |
-
|
114 |
-
const ProductList = ( {
|
115 |
-
attributes,
|
116 |
-
currentPage,
|
117 |
-
onPageChange,
|
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, parentName } = useInnerBlockLayoutContext();
|
135 |
-
const totalQuery = extractPaginationAndSortAttributes( queryState );
|
136 |
-
const { dispatchStoreEvent } = useStoreEvents();
|
137 |
-
|
138 |
-
// These are possible filters.
|
139 |
-
const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
|
140 |
-
'attributes',
|
141 |
-
[]
|
142 |
-
);
|
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 the total number of products is a finite number.
|
147 |
-
const previousQueryTotals = usePrevious(
|
148 |
-
{ totalQuery, totalProducts },
|
149 |
-
areQueryTotalsDifferent
|
150 |
-
);
|
151 |
-
|
152 |
-
// If the product list changes, trigger an event.
|
153 |
-
useEffect( () => {
|
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;
|
164 |
-
}
|
165 |
-
onPageChange( 1 );
|
166 |
-
|
167 |
-
// Make sure there was a previous query, so we don't announce it on page load.
|
168 |
-
if ( previousQueryTotals?.totalQuery ) {
|
169 |
-
announceLoadingCompletion( totalProducts );
|
170 |
-
}
|
171 |
-
}, [
|
172 |
-
previousQueryTotals?.totalQuery,
|
173 |
-
totalProducts,
|
174 |
-
onPageChange,
|
175 |
-
totalQuery,
|
176 |
-
] );
|
177 |
-
|
178 |
-
const onPaginationChange = ( newPage ) => {
|
179 |
-
scrollToTop( { focusableSelector: 'a, button' } );
|
180 |
-
onPageChange( newPage );
|
181 |
-
};
|
182 |
-
|
183 |
-
const getClassnames = () => {
|
184 |
-
const { columns, rows, alignButtons, align } = attributes;
|
185 |
-
const alignClass = typeof align !== 'undefined' ? 'align' + align : '';
|
186 |
-
|
187 |
-
return classnames(
|
188 |
-
parentClassName,
|
189 |
-
alignClass,
|
190 |
-
'has-' + columns + '-columns',
|
191 |
-
{
|
192 |
-
'has-multiple-rows': rows > 1,
|
193 |
-
'has-aligned-buttons': alignButtons,
|
194 |
-
}
|
195 |
-
);
|
196 |
-
};
|
197 |
-
|
198 |
-
const { contentVisibility } = attributes;
|
199 |
-
const perPage = attributes.columns * attributes.rows;
|
200 |
-
const totalPages =
|
201 |
-
! Number.isFinite( totalProducts ) &&
|
202 |
-
Number.isFinite( previousQueryTotals?.totalProducts ) &&
|
203 |
-
isEqual( totalQuery, previousQueryTotals?.totalQuery )
|
204 |
-
? Math.ceil( previousQueryTotals.totalProducts / perPage )
|
205 |
-
: Math.ceil( totalProducts / perPage );
|
206 |
-
const listProducts = products.length
|
207 |
-
? products
|
208 |
-
: Array.from( { length: perPage } );
|
209 |
-
const hasProducts = products.length !== 0 || productsLoading;
|
210 |
-
const hasFilters =
|
211 |
-
productAttributes.length > 0 ||
|
212 |
-
Number.isFinite( minPrice ) ||
|
213 |
-
Number.isFinite( maxPrice );
|
214 |
-
|
215 |
-
return (
|
216 |
-
<div className={ getClassnames() }>
|
217 |
-
{ contentVisibility.orderBy && hasProducts && (
|
218 |
-
<ProductSortSelect
|
219 |
-
onChange={ onSortChange }
|
220 |
-
value={ sortValue }
|
221 |
-
/>
|
222 |
-
) }
|
223 |
-
{ ! hasProducts && hasFilters && (
|
224 |
-
<NoMatchingProducts
|
225 |
-
resetCallback={ () => {
|
226 |
-
setProductAttributes( [] );
|
227 |
-
setMinPrice( null );
|
228 |
-
setMaxPrice( null );
|
229 |
-
} }
|
230 |
-
/>
|
231 |
-
) }
|
232 |
-
{ ! hasProducts && ! hasFilters && <NoProducts /> }
|
233 |
-
{ hasProducts && (
|
234 |
-
<ul className={ `${ parentClassName }__products` }>
|
235 |
-
{ listProducts.map( ( product = {}, i ) => (
|
236 |
-
<ProductListItem
|
237 |
-
key={ product.id || i }
|
238 |
-
attributes={ attributes }
|
239 |
-
product={ product }
|
240 |
-
/>
|
241 |
-
) ) }
|
242 |
-
</ul>
|
243 |
-
) }
|
244 |
-
{ totalPages > 1 && (
|
245 |
-
<Pagination
|
246 |
-
currentPage={ currentPage }
|
247 |
-
onPageChange={ onPaginationChange }
|
248 |
-
totalPages={ totalPages }
|
249 |
-
/>
|
250 |
-
) }
|
251 |
-
</div>
|
252 |
-
);
|
253 |
-
};
|
254 |
-
|
255 |
-
ProductList.propTypes = {
|
256 |
-
attributes: PropTypes.object.isRequired,
|
257 |
-
hideOutOfStockItems: PropTypes.bool,
|
258 |
-
// From withScrollToTop.
|
259 |
-
scrollToTop: PropTypes.func,
|
260 |
-
};
|
261 |
-
|
262 |
-
export default withScrollToTop( ProductList );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 {
|
@@ -79,25 +74,15 @@
|
|
79 |
max-width: 100% / $i;
|
80 |
}
|
81 |
}
|
82 |
-
|
83 |
-
&.has-
|
84 |
-
|
85 |
-
|
86 |
-
&.has-
|
87 |
-
&.has-5-columns {
|
88 |
-
.wc-block-grid__product {
|
89 |
-
font-size: 0.58em;
|
90 |
-
}
|
91 |
-
}
|
92 |
-
&.has-5-columns.alignfull,
|
93 |
-
&.has-4-columns:not(.alignwide):not(.alignfull) {
|
94 |
.wc-block-grid__product {
|
95 |
-
font-size: 0.
|
96 |
}
|
97 |
}
|
98 |
-
&.has-3-columns:not(.alignwide):not(.alignfull) {
|
99 |
-
font-size: 0.92em;
|
100 |
-
}
|
101 |
}
|
102 |
|
103 |
@include breakpoint( "<480px" ) {
|
55 |
list-style: none;
|
56 |
}
|
57 |
|
|
|
|
|
|
|
|
|
|
|
58 |
.theme-twentytwenty .wc-block-grid,
|
59 |
.wc-block-grid {
|
60 |
&.has-aligned-buttons {
|
74 |
max-width: 100% / $i;
|
75 |
}
|
76 |
}
|
77 |
+
&.has-4-columns:not(.alignwide):not(.alignfull),
|
78 |
+
&.has-5-columns:not(.alignfull),
|
79 |
+
&.has-6-columns:not(.alignfull),
|
80 |
+
&.has-7-columns,
|
81 |
+
&.has-8-columns {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
.wc-block-grid__product {
|
83 |
+
font-size: 0.8em;
|
84 |
}
|
85 |
}
|
|
|
|
|
|
|
86 |
}
|
87 |
|
88 |
@include breakpoint( "<480px" ) {
|
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/stories/index.js
DELETED
@@ -1,26 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { boolean } from '@storybook/addon-knobs';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import ProductName from '../';
|
10 |
-
|
11 |
-
export default {
|
12 |
-
title: 'WooCommerce Blocks/@base-components/cart-checkout/ProductName',
|
13 |
-
component: ProductName,
|
14 |
-
};
|
15 |
-
|
16 |
-
export const Default = () => {
|
17 |
-
const disabled = boolean( 'disabled', false );
|
18 |
-
|
19 |
-
return (
|
20 |
-
<ProductName
|
21 |
-
disabled={ disabled }
|
22 |
-
name={ 'Test product' }
|
23 |
-
permalink={ '/' }
|
24 |
-
/>
|
25 |
-
);
|
26 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/product-name/test/__snapshots__/index.js.snap
DELETED
@@ -1,49 +0,0 @@
|
|
1 |
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2 |
-
|
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 |
-
dangerouslySetInnerHTML={
|
20 |
-
Object {
|
21 |
-
"__html": "Test product",
|
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 |
-
`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/product-name/test/index.js
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import TestRenderer from 'react-test-renderer';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import ProductName from '..';
|
10 |
-
|
11 |
-
describe( 'ProductName', () => {
|
12 |
-
test( 'should not render a link if disabled is true', () => {
|
13 |
-
const component = TestRenderer.create(
|
14 |
-
<ProductName disabled={ true } name="Test product" permalink="/" />
|
15 |
-
);
|
16 |
-
|
17 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
18 |
-
} );
|
19 |
-
|
20 |
-
test( 'should render a link if disabled is false', () => {
|
21 |
-
const component = TestRenderer.create(
|
22 |
-
<ProductName disabled={ false } name="Test product" permalink="/" />
|
23 |
-
);
|
24 |
-
|
25 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
26 |
-
} );
|
27 |
-
|
28 |
-
test( 'should render a link if disabled is not defined', () => {
|
29 |
-
const component = TestRenderer.create(
|
30 |
-
<ProductName name="Test product" permalink="/" />
|
31 |
-
);
|
32 |
-
|
33 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
34 |
-
} );
|
35 |
-
|
36 |
-
test( 'should merge classes and props', () => {
|
37 |
-
const component = TestRenderer.create(
|
38 |
-
<ProductName
|
39 |
-
className="lorem-ipsum"
|
40 |
-
name="Test product"
|
41 |
-
permalink="/"
|
42 |
-
rel="nofollow"
|
43 |
-
/>
|
44 |
-
);
|
45 |
-
|
46 |
-
expect( component.toJSON() ).toMatchSnapshot();
|
47 |
-
} );
|
48 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/stories/index.js
CHANGED
@@ -2,7 +2,6 @@
|
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { number, select } from '@storybook/addon-knobs';
|
5 |
-
import { currencyKnob } from '@woocommerce/knobs';
|
6 |
|
7 |
/**
|
8 |
* Internal dependencies
|
@@ -14,9 +13,37 @@ export default {
|
|
14 |
component: ProductPrice,
|
15 |
};
|
16 |
|
17 |
-
|
18 |
const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
|
19 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
const price = number( 'Price', 4000 );
|
21 |
|
22 |
return (
|
@@ -25,8 +52,7 @@ export const standard = () => {
|
|
25 |
};
|
26 |
|
27 |
export const sale = () => {
|
28 |
-
const align
|
29 |
-
const currency = currencyKnob();
|
30 |
const price = number( 'Price', 3000 );
|
31 |
const regularPrice = number( 'Regular price', 4000 );
|
32 |
|
@@ -41,8 +67,7 @@ export const sale = () => {
|
|
41 |
};
|
42 |
|
43 |
export const range = () => {
|
44 |
-
const align
|
45 |
-
const currency = currencyKnob();
|
46 |
const minPrice = number( 'Min price', 3000 );
|
47 |
const maxPrice = number( 'Max price', 5000 );
|
48 |
|
2 |
* External dependencies
|
3 |
*/
|
4 |
import { number, select } from '@storybook/addon-knobs';
|
|
|
5 |
|
6 |
/**
|
7 |
* Internal dependencies
|
13 |
component: ProductPrice,
|
14 |
};
|
15 |
|
16 |
+
const getKnobs = () => {
|
17 |
const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
|
18 |
+
const currencies = [
|
19 |
+
{
|
20 |
+
label: 'USD',
|
21 |
+
code: 'USD',
|
22 |
+
symbol: '$',
|
23 |
+
thousandSeparator: ',',
|
24 |
+
decimalSeparator: '.',
|
25 |
+
minorUnit: 2,
|
26 |
+
prefix: '$',
|
27 |
+
suffix: '',
|
28 |
+
},
|
29 |
+
{
|
30 |
+
label: 'EUR',
|
31 |
+
code: 'EUR',
|
32 |
+
symbol: '€',
|
33 |
+
thousandSeparator: '.',
|
34 |
+
decimalSeparator: ',',
|
35 |
+
minorUnit: 2,
|
36 |
+
prefix: '',
|
37 |
+
suffix: '€',
|
38 |
+
},
|
39 |
+
];
|
40 |
+
const currency = select( 'Currency', currencies, currencies[ 0 ] );
|
41 |
+
|
42 |
+
return { align, currency };
|
43 |
+
};
|
44 |
+
|
45 |
+
export const standard = () => {
|
46 |
+
const { align, currency } = getKnobs();
|
47 |
const price = number( 'Price', 4000 );
|
48 |
|
49 |
return (
|
52 |
};
|
53 |
|
54 |
export const sale = () => {
|
55 |
+
const { align, currency } = getKnobs();
|
|
|
56 |
const price = number( 'Price', 3000 );
|
57 |
const regularPrice = number( 'Regular price', 4000 );
|
58 |
|
67 |
};
|
68 |
|
69 |
export const range = () => {
|
70 |
+
const { align, currency } = getKnobs();
|
|
|
71 |
const minPrice = number( 'Min price', 3000 );
|
72 |
const maxPrice = number( 'Max price', 5000 );
|
73 |
|
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,8 +84,8 @@ const QuantitySelector = ( {
|
|
96 |
}
|
97 |
} }
|
98 |
aria-label={ sprintf(
|
99 |
-
/* translators: %s refers to the item name in the cart. */
|
100 |
__(
|
|
|
101 |
'Quantity of %s in your cart.',
|
102 |
'woo-gutenberg-products-block'
|
103 |
),
|
@@ -116,8 +104,8 @@ const QuantitySelector = ( {
|
|
116 |
onChange( newQuantity );
|
117 |
speak(
|
118 |
sprintf(
|
119 |
-
/* translators: %s refers to the item name in the cart. */
|
120 |
__(
|
|
|
121 |
'Quantity reduced to %s.',
|
122 |
'woo-gutenberg-products-block'
|
123 |
),
|
@@ -140,8 +128,8 @@ const QuantitySelector = ( {
|
|
140 |
onChange( newQuantity );
|
141 |
speak(
|
142 |
sprintf(
|
143 |
-
/* translators: %s refers to the item name in the cart. */
|
144 |
__(
|
|
|
145 |
'Quantity increased to %s.',
|
146 |
'woo-gutenberg-products-block'
|
147 |
),
|
@@ -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 |
__(
|
88 |
+
// translators: %s Item name.
|
89 |
'Quantity of %s in your cart.',
|
90 |
'woo-gutenberg-products-block'
|
91 |
),
|
104 |
onChange( newQuantity );
|
105 |
speak(
|
106 |
sprintf(
|
|
|
107 |
__(
|
108 |
+
// translators: %s Quantity amount.
|
109 |
'Quantity reduced to %s.',
|
110 |
'woo-gutenberg-products-block'
|
111 |
),
|
128 |
onChange( newQuantity );
|
129 |
speak(
|
130 |
sprintf(
|
|
|
131 |
__(
|
132 |
+
// translators: %s Quantity amount.
|
133 |
'Quantity increased to %s.',
|
134 |
'woo-gutenberg-products-block'
|
135 |
),
|
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
@@ -6,19 +6,18 @@
|
|
6 |
box-shadow: none;
|
7 |
|
8 |
&:focus {
|
9 |
-
outline: 2px solid $
|
10 |
}
|
11 |
}
|
12 |
|
13 |
.wc-block-components-quantity-selector {
|
14 |
display: flex;
|
15 |
-
width:
|
16 |
-
border: 1px solid $
|
17 |
background: #fff;
|
18 |
border-radius: 4px;
|
19 |
// needed so that buttons fill the container.
|
20 |
box-sizing: content-box;
|
21 |
-
margin: 0 0 0.25em 0;
|
22 |
|
23 |
.has-dark-controls & {
|
24 |
background-color: transparent;
|
@@ -43,11 +42,11 @@
|
|
43 |
-moz-appearance: textfield;
|
44 |
|
45 |
&:focus {
|
46 |
-
background: $
|
47 |
-
outline: 1px solid $
|
48 |
}
|
49 |
&:disabled {
|
50 |
-
color: $
|
51 |
}
|
52 |
|
53 |
.has-dark-controls & {
|
@@ -67,24 +66,22 @@
|
|
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);
|
74 |
min-width: 30px;
|
75 |
cursor: pointer;
|
76 |
-
color: $
|
77 |
font-style: normal;
|
78 |
text-align: center;
|
79 |
-
text-decoration: none;
|
80 |
|
81 |
&:hover,
|
82 |
&:focus {
|
83 |
@include reset-button;
|
84 |
-
color: $
|
85 |
}
|
86 |
&:disabled {
|
87 |
-
color: $
|
88 |
cursor: default;
|
89 |
@include reset-button;
|
90 |
}
|
@@ -101,21 +98,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 |
-
}
|
6 |
box-shadow: none;
|
7 |
|
8 |
&:focus {
|
9 |
+
outline: 2px solid $core-grey-light-600;
|
10 |
}
|
11 |
}
|
12 |
|
13 |
.wc-block-components-quantity-selector {
|
14 |
display: flex;
|
15 |
+
min-width: 100px;
|
16 |
+
border: 1px solid $core-grey-light-600;
|
17 |
background: #fff;
|
18 |
border-radius: 4px;
|
19 |
// needed so that buttons fill the container.
|
20 |
box-sizing: content-box;
|
|
|
21 |
|
22 |
.has-dark-controls & {
|
23 |
background-color: transparent;
|
42 |
-moz-appearance: textfield;
|
43 |
|
44 |
&:focus {
|
45 |
+
background: $core-grey-light-200;
|
46 |
+
outline: 1px solid $core-grey-light-600;
|
47 |
}
|
48 |
&:disabled {
|
49 |
+
color: $core-grey-dark-100;
|
50 |
}
|
51 |
|
52 |
.has-dark-controls & {
|
66 |
-webkit-appearance: none;
|
67 |
margin: 0;
|
68 |
}
|
|
|
69 |
.wc-block-components-quantity-selector__button {
|
70 |
@include reset-button;
|
71 |
@include font-size(regular);
|
72 |
min-width: 30px;
|
73 |
cursor: pointer;
|
74 |
+
color: $core-grey-dark-700;
|
75 |
font-style: normal;
|
76 |
text-align: center;
|
|
|
77 |
|
78 |
&:hover,
|
79 |
&:focus {
|
80 |
@include reset-button;
|
81 |
+
color: $core-grey-dark-900;
|
82 |
}
|
83 |
&:disabled {
|
84 |
+
color: $core-grey-dark-100;
|
85 |
cursor: default;
|
86 |
@include reset-button;
|
87 |
}
|
98 |
}
|
99 |
}
|
100 |
}
|
101 |
+
.wc-block-components-quantity-selector__button--minus {
|
|
|
102 |
order: 1;
|
103 |
}
|
104 |
+
.wc-block-components-quantity-selector__button--plus {
|
|
|
105 |
order: 3;
|
106 |
}
|
107 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/radio-control-accordion/index.js
DELETED
@@ -1,73 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import classnames from 'classnames';
|
5 |
-
import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import RadioControlOption from '../radio-control/option';
|
11 |
-
|
12 |
-
const RadioControlAccordion = ( {
|
13 |
-
className,
|
14 |
-
instanceId,
|
15 |
-
id,
|
16 |
-
selected,
|
17 |
-
onChange,
|
18 |
-
options = [],
|
19 |
-
} ) => {
|
20 |
-
const radioControlId = id || instanceId;
|
21 |
-
|
22 |
-
return (
|
23 |
-
options.length && (
|
24 |
-
<div
|
25 |
-
className={ classnames(
|
26 |
-
'wc-block-components-radio-control',
|
27 |
-
className
|
28 |
-
) }
|
29 |
-
>
|
30 |
-
{ options.map( ( option ) => {
|
31 |
-
const hasOptionContent =
|
32 |
-
typeof option === 'object' && 'content' in option;
|
33 |
-
const checked = option.value === selected;
|
34 |
-
return (
|
35 |
-
<div
|
36 |
-
className="wc-block-components-radio-control-accordion-option"
|
37 |
-
key={ option.value }
|
38 |
-
>
|
39 |
-
<RadioControlOption
|
40 |
-
name={ `radio-control-${ radioControlId }` }
|
41 |
-
checked={ checked }
|
42 |
-
option={ option }
|
43 |
-
onChange={ ( value ) => {
|
44 |
-
onChange( value );
|
45 |
-
if (
|
46 |
-
typeof option.onChange === 'function'
|
47 |
-
) {
|
48 |
-
option.onChange( value );
|
49 |
-
}
|
50 |
-
} }
|
51 |
-
/>
|
52 |
-
{ hasOptionContent && checked && (
|
53 |
-
<div
|
54 |
-
className={ classnames(
|
55 |
-
'wc-block-components-radio-control-accordion-content',
|
56 |
-
{
|
57 |
-
'wc-block-components-radio-control-accordion-content-hide': ! checked,
|
58 |
-
}
|
59 |
-
) }
|
60 |
-
>
|
61 |
-
{ option.content }
|
62 |
-
</div>
|
63 |
-
) }
|
64 |
-
</div>
|
65 |
-
);
|
66 |
-
} ) }
|
67 |
-
</div>
|
68 |
-
)
|
69 |
-
);
|
70 |
-
};
|
71 |
-
|
72 |
-
export default withInstanceId( RadioControlAccordion );
|
73 |
-
export { RadioControlAccordion };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/radio-control/_mixin.scss
ADDED
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@mixin radio-control-styles {
|
2 |
+
.wc-block-components-radio-control__option {
|
3 |
+
@include reset-typography();
|
4 |
+
@include with-translucent-border(0 0 1px);
|
5 |
+
display: block;
|
6 |
+
padding: $gap-small $gap-small 0 #{$gap-larger * 2};
|
7 |
+
}
|
8 |
+
|
9 |
+
.wc-block-components-radio-control__option-layout {
|
10 |
+
@include with-translucent-border(0 0 1px);
|
11 |
+
display: table;
|
12 |
+
width: 100%;
|
13 |
+
padding-bottom: $gap-small;
|
14 |
+
}
|
15 |
+
|
16 |
+
.wc-block-components-radio-control__option .wc-block-components-radio-control__option-layout {
|
17 |
+
&::after {
|
18 |
+
display: none;
|
19 |
+
}
|
20 |
+
}
|
21 |
+
|
22 |
+
.wc-block-components-radio-control__input {
|
23 |
+
left: $gap-large;
|
24 |
+
position: absolute;
|
25 |
+
top: $gap-small;
|
26 |
+
}
|
27 |
+
|
28 |
+
.wc-block-components-radio-control__label-group,
|
29 |
+
.wc-block-components-radio-control__description-group {
|
30 |
+
display: table-row;
|
31 |
+
|
32 |
+
> span {
|
33 |
+
display: table-cell;
|
34 |
+
}
|
35 |
+
|
36 |
+
.wc-block-components-radio-control__secondary-label,
|
37 |
+
.wc-block-components-radio-control__secondary-description {
|
38 |
+
text-align: right;
|
39 |
+
min-width: 50%;
|
40 |
+
}
|
41 |
+
}
|
42 |
+
|
43 |
+
.wc-block-components-radio-control__label,
|
44 |
+
.wc-block-components-radio-control__secondary-label {
|
45 |
+
line-height: 20px;
|
46 |
+
// Currently, max() CSS function calls need to be wrapped with unquote.
|
47 |
+
// See: https://github.com/sass/sass/issues/2378#issuecomment-367490840
|
48 |
+
line-height: unquote("max(1rem, 20px)");
|
49 |
+
}
|
50 |
+
|
51 |
+
.wc-block-components-radio-control__description,
|
52 |
+
.wc-block-components-radio-control__secondary-description {
|
53 |
+
@include font-size(small);
|
54 |
+
line-height: 20px;
|
55 |
+
}
|
56 |
+
}
|
57 |
+
|
58 |
+
@mixin radio-control-input-styles {
|
59 |
+
// Extra class for specificity.
|
60 |
+
.wc-block-components-radio-control {
|
61 |
+
.wc-block-components-radio-control__input {
|
62 |
+
appearance: none;
|
63 |
+
background: transparent;
|
64 |
+
border: 2px solid currentColor;
|
65 |
+
border-radius: 50%;
|
66 |
+
display: inline-block;
|
67 |
+
height: 1.25rem;
|
68 |
+
min-height: 20px;
|
69 |
+
min-width: 20px;
|
70 |
+
width: 1.25rem;
|
71 |
+
|
72 |
+
&:checked::before {
|
73 |
+
background: currentColor;
|
74 |
+
border-radius: 50%;
|
75 |
+
content: "";
|
76 |
+
display: block;
|
77 |
+
height: 0.625em;
|
78 |
+
left: 50%;
|
79 |
+
margin: 0;
|
80 |
+
min-height: 10px;
|
81 |
+
min-width: 10px;
|
82 |
+
position: absolute;
|
83 |
+
top: 50%;
|
84 |
+
transform: translate(-50%, -50%);
|
85 |
+
width: 0.625em;
|
86 |
+
}
|
87 |
+
|
88 |
+
.has-dark-controls & {
|
89 |
+
border-color: $controls-border-dark;
|
90 |
+
|
91 |
+
&:checked::before {
|
92 |
+
background: $input-text-dark;
|
93 |
+
}
|
94 |
+
}
|
95 |
+
}
|
96 |
+
|
97 |
+
@include breakpoint( ">782px" ) {
|
98 |
+
.wc-block-components-radio-control__input {
|
99 |
+
height: 1rem;
|
100 |
+
margin-top: 2px;
|
101 |
+
min-height: 16px;
|
102 |
+
min-width: 16px;
|
103 |
+
width: 1rem;
|
104 |
+
|
105 |
+
&:checked::before {
|
106 |
+
height: 0.5em;
|
107 |
+
min-height: 8px;
|
108 |
+
min-width: 8px;
|
109 |
+
width: 0.5em;
|
110 |
+
}
|
111 |
+
}
|
112 |
+
}
|
113 |
+
}
|
114 |
+
}
|
assets/js/base/components/radio-control/index.js
CHANGED
@@ -30,7 +30,7 @@ const RadioControl = ( {
|
|
30 |
>
|
31 |
{ options.map( ( option ) => (
|
32 |
<RadioControlOption
|
33 |
-
key={
|
34 |
name={ `radio-control-${ radioControlId }` }
|
35 |
checked={ option.value === selected }
|
36 |
option={ option }
|
30 |
>
|
31 |
{ options.map( ( option ) => (
|
32 |
<RadioControlOption
|
33 |
+
key={ option.value }
|
34 |
name={ `radio-control-${ radioControlId }` }
|
35 |
checked={ option.value === selected }
|
36 |
option={ option }
|
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/option.js
CHANGED
@@ -20,12 +20,7 @@ const Option = ( { checked, name, onChange, option } ) => {
|
|
20 |
|
21 |
return (
|
22 |
<label
|
23 |
-
className=
|
24 |
-
'wc-block-components-radio-control__option',
|
25 |
-
{
|
26 |
-
'wc-block-components-radio-control__option-checked': checked,
|
27 |
-
}
|
28 |
-
) }
|
29 |
htmlFor={ `${ name }-${ value }` }
|
30 |
>
|
31 |
<input
|
20 |
|
21 |
return (
|
22 |
<label
|
23 |
+
className="wc-block-components-radio-control__option"
|
|
|
|
|
|
|
|
|
|
|
24 |
htmlFor={ `${ name }-${ value }` }
|
25 |
>
|
26 |
<input
|
assets/js/base/components/radio-control/style.scss
CHANGED
@@ -1,115 +1,4 @@
|
|
1 |
-
|
2 |
-
@include reset-typography();
|
3 |
-
display: block;
|
4 |
-
margin: em($gap) 0;
|
5 |
-
padding: 0 0 0 em($gap-largest);
|
6 |
-
position: relative;
|
7 |
|
8 |
-
|
9 |
-
|
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 |
-
}
|
20 |
-
|
21 |
-
.wc-block-components-radio-control__option .wc-block-components-radio-control__option-layout {
|
22 |
-
&::after {
|
23 |
-
display: none;
|
24 |
-
}
|
25 |
-
}
|
26 |
-
|
27 |
-
.wc-block-components-radio-control__label-group,
|
28 |
-
.wc-block-components-radio-control__description-group {
|
29 |
-
display: table-row;
|
30 |
-
|
31 |
-
> span {
|
32 |
-
display: table-cell;
|
33 |
-
}
|
34 |
-
|
35 |
-
.wc-block-components-radio-control__secondary-label,
|
36 |
-
.wc-block-components-radio-control__secondary-description {
|
37 |
-
text-align: right;
|
38 |
-
min-width: 50%;
|
39 |
-
}
|
40 |
-
}
|
41 |
-
|
42 |
-
.wc-block-components-radio-control__label,
|
43 |
-
.wc-block-components-radio-control__secondary-label {
|
44 |
-
// Currently, max() CSS function calls need to be wrapped with unquote.
|
45 |
-
// See: https://github.com/sass/sass/issues/2378#issuecomment-367490840
|
46 |
-
// These values should be the same as the control input height.
|
47 |
-
line-height: unquote("max(1.5rem, 24px)");
|
48 |
-
}
|
49 |
-
|
50 |
-
.wc-block-components-radio-control__description,
|
51 |
-
.wc-block-components-radio-control__secondary-description {
|
52 |
-
@include font-size( small );
|
53 |
-
line-height: 20px;
|
54 |
-
}
|
55 |
-
|
56 |
-
// Extra class for specificity.
|
57 |
-
.wc-block-components-radio-control {
|
58 |
-
.wc-block-components-radio-control__input {
|
59 |
-
appearance: none;
|
60 |
-
background: #fff;
|
61 |
-
border: 2px solid $input-border-gray;
|
62 |
-
border-radius: 50%;
|
63 |
-
display: inline-block;
|
64 |
-
height: em(24px); // =1.5rem
|
65 |
-
min-height: 24px;
|
66 |
-
min-width: 24px;
|
67 |
-
width: em(24px);
|
68 |
-
// The code belows centers the input vertically.
|
69 |
-
position: absolute;
|
70 |
-
left: 0;
|
71 |
-
top: 50%;
|
72 |
-
transform: translate(0, -50%);
|
73 |
-
|
74 |
-
&:checked::before {
|
75 |
-
background: #000;
|
76 |
-
border-radius: 50%;
|
77 |
-
content: "";
|
78 |
-
display: block;
|
79 |
-
height: em(12px);
|
80 |
-
left: 50%;
|
81 |
-
margin: 0;
|
82 |
-
min-height: 12px;
|
83 |
-
min-width: 12px;
|
84 |
-
position: absolute;
|
85 |
-
top: 50%;
|
86 |
-
transform: translate(-50%, -50%);
|
87 |
-
width: em(12px);
|
88 |
-
}
|
89 |
-
|
90 |
-
.has-dark-controls & {
|
91 |
-
border-color: $controls-border-dark;
|
92 |
-
background-color: $input-background-dark;
|
93 |
-
|
94 |
-
&:checked::before {
|
95 |
-
background: $input-text-dark;
|
96 |
-
}
|
97 |
-
}
|
98 |
-
}
|
99 |
-
}
|
100 |
-
|
101 |
-
.theme-twentytwentyone {
|
102 |
-
.wc-block-components-radio-control .wc-block-components-radio-control__input {
|
103 |
-
&:checked {
|
104 |
-
border-width: 2px;
|
105 |
-
|
106 |
-
&::before {
|
107 |
-
background-color: var(--form--color-text);
|
108 |
-
}
|
109 |
-
}
|
110 |
-
|
111 |
-
&::after {
|
112 |
-
display: none;
|
113 |
-
}
|
114 |
-
}
|
115 |
-
}
|
1 |
+
@import "./mixin";
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
+
@include radio-control-styles;
|
4 |
+
@include radio-control-input-styles;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/read-more/test/index.js
CHANGED
@@ -11,19 +11,19 @@ const longContent =
|
|
11 |
|
12 |
describe( 'ReadMore Component', () => {
|
13 |
describe( 'Test the truncateHtml function', () => {
|
14 |
-
it( 'Truncate long HTML content to length of 10', () => {
|
15 |
const truncatedContent = truncateHtml( longContent, 10 );
|
16 |
|
17 |
expect( truncatedContent ).toEqual( '<p>Lorem ipsum...</p>' );
|
18 |
} );
|
19 |
-
it( 'Truncate long HTML content, but avoid cutting off HTML tags.', () => {
|
20 |
const truncatedContent = truncateHtml( longContent, 40 );
|
21 |
|
22 |
expect( truncatedContent ).toEqual(
|
23 |
'<p>Lorem ipsum dolor sit amet, <strong>consectetur...</strong></p>'
|
24 |
);
|
25 |
} );
|
26 |
-
it( 'No need to truncate short HTML content.', () => {
|
27 |
const truncatedContent = truncateHtml( shortContent, 100 );
|
28 |
|
29 |
expect( truncatedContent ).toEqual(
|
11 |
|
12 |
describe( 'ReadMore Component', () => {
|
13 |
describe( 'Test the truncateHtml function', () => {
|
14 |
+
it( 'Truncate long HTML content to length of 10', async () => {
|
15 |
const truncatedContent = truncateHtml( longContent, 10 );
|
16 |
|
17 |
expect( truncatedContent ).toEqual( '<p>Lorem ipsum...</p>' );
|
18 |
} );
|
19 |
+
it( 'Truncate long HTML content, but avoid cutting off HTML tags.', async () => {
|
20 |
const truncatedContent = truncateHtml( longContent, 40 );
|
21 |
|
22 |
expect( truncatedContent ).toEqual(
|
23 |
'<p>Lorem ipsum dolor sit amet, <strong>consectetur...</strong></p>'
|
24 |
);
|
25 |
} );
|
26 |
+
it( 'No need to truncate short HTML content.', async () => {
|
27 |
const truncatedContent = truncateHtml( shortContent, 100 );
|
28 |
|
29 |
expect( truncatedContent ).toEqual(
|
assets/js/base/components/reviews/review-list-item/index.js
CHANGED
@@ -124,19 +124,21 @@ function getReviewRating( review ) {
|
|
124 |
const starStyle = {
|
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 |
-
);
|
132 |
return (
|
133 |
<div className="wc-block-review-list-item__rating wc-block-components-review-list-item__rating">
|
134 |
<div
|
135 |
className="wc-block-review-list-item__rating__stars wc-block-components-review-list-item__rating__stars"
|
136 |
role="img"
|
137 |
-
aria-label={ ratingText }
|
138 |
>
|
139 |
-
<span style={ starStyle }>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
</div>
|
141 |
</div>
|
142 |
);
|
124 |
const starStyle = {
|
125 |
width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
|
126 |
};
|
|
|
|
|
|
|
|
|
|
|
127 |
return (
|
128 |
<div className="wc-block-review-list-item__rating wc-block-components-review-list-item__rating">
|
129 |
<div
|
130 |
className="wc-block-review-list-item__rating__stars wc-block-components-review-list-item__rating__stars"
|
131 |
role="img"
|
|
|
132 |
>
|
133 |
+
<span style={ starStyle }>
|
134 |
+
{ sprintf(
|
135 |
+
__(
|
136 |
+
'Rated %f out of 5',
|
137 |
+
'woo-gutenberg-products-block'
|
138 |
+
),
|
139 |
+
rating
|
140 |
+
) }
|
141 |
+
</span>
|
142 |
</div>
|
143 |
</div>
|
144 |
);
|
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 }
|
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.
|
@@ -11,7 +10,7 @@
|
|
11 |
transform: translateY(0.75em);
|
12 |
transform-origin: top left;
|
13 |
transition: all 200ms ease;
|
14 |
-
color: $gray-
|
15 |
z-index: 1;
|
16 |
margin: 0 0 0 #{$gap + 1px};
|
17 |
overflow: hidden;
|
@@ -37,17 +36,17 @@
|
|
37 |
&:hover,
|
38 |
&:focus,
|
39 |
&:active {
|
40 |
-
border-color: $
|
41 |
}
|
42 |
&:focus {
|
43 |
-
outline: 1px dotted $
|
44 |
outline-offset: 2px;
|
45 |
}
|
46 |
}
|
47 |
}
|
48 |
|
49 |
&.has-error label {
|
50 |
-
color: $
|
51 |
}
|
52 |
|
53 |
.components-custom-select-control__button {
|
@@ -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 |
}
|
@@ -89,11 +86,10 @@
|
|
89 |
}
|
90 |
|
91 |
.components-custom-select-control__menu {
|
92 |
-
background-color: $select-dropdown-
|
93 |
margin: 0;
|
94 |
max-height: 300px;
|
95 |
overflow: auto;
|
96 |
-
color: $input-text-active;
|
97 |
|
98 |
// Required by IE11.
|
99 |
&:empty {
|
@@ -122,41 +118,3 @@
|
|
122 |
display: none;
|
123 |
}
|
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 {
|
136 |
-
.components-custom-select-control__item {
|
137 |
-
color: $input-text-dark;
|
138 |
-
}
|
139 |
-
}
|
140 |
-
|
141 |
-
// If the theme is in dark mode, but the block isn't, then this selector will match.
|
142 |
-
.components-custom-select-control__item {
|
143 |
-
color: $input-text-active;
|
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.
|
10 |
transform: translateY(0.75em);
|
11 |
transform-origin: top left;
|
12 |
transition: all 200ms ease;
|
13 |
+
color: $gray-50;
|
14 |
z-index: 1;
|
15 |
margin: 0 0 0 #{$gap + 1px};
|
16 |
overflow: hidden;
|
36 |
&:hover,
|
37 |
&:focus,
|
38 |
&:active {
|
39 |
+
border-color: $error-red;
|
40 |
}
|
41 |
&:focus {
|
42 |
+
outline: 1px dotted $error-red;
|
43 |
outline-offset: 2px;
|
44 |
}
|
45 |
}
|
46 |
}
|
47 |
|
48 |
&.has-error label {
|
49 |
+
color: $error-red;
|
50 |
}
|
51 |
|
52 |
.components-custom-select-control__button {
|
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 |
}
|
86 |
}
|
87 |
|
88 |
.components-custom-select-control__menu {
|
89 |
+
background-color: $select-dropdown-dark;
|
90 |
margin: 0;
|
91 |
max-height: 300px;
|
92 |
overflow: auto;
|
|
|
93 |
|
94 |
// Required by IE11.
|
95 |
&:empty {
|
118 |
display: none;
|
119 |
}
|
120 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 = ( {
|
@@ -43,7 +41,7 @@ const ValidatedSelect = ( {
|
|
43 |
clearValidationError,
|
44 |
} = useValidationContext();
|
45 |
|
46 |
-
|
47 |
if ( ! required || currentValue ) {
|
48 |
clearValidationError( errorId );
|
49 |
} else {
|
@@ -54,21 +52,18 @@ const ValidatedSelect = ( {
|
|
54 |
},
|
55 |
} );
|
56 |
}
|
57 |
-
}
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
required,
|
63 |
-
setValidationErrors,
|
64 |
-
] );
|
65 |
|
66 |
// Remove validation errors when unmounted.
|
67 |
useEffect( () => {
|
68 |
return () => {
|
69 |
clearValidationError( errorId );
|
70 |
};
|
71 |
-
}, [
|
72 |
|
73 |
const error = getValidationError( errorId ) || {};
|
74 |
|
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 = ( {
|
41 |
clearValidationError,
|
42 |
} = useValidationContext();
|
43 |
|
44 |
+
const validateSelect = () => {
|
45 |
if ( ! required || currentValue ) {
|
46 |
clearValidationError( errorId );
|
47 |
} else {
|
52 |
},
|
53 |
} );
|
54 |
}
|
55 |
+
};
|
56 |
+
|
57 |
+
useEffect( () => {
|
58 |
+
validateSelect();
|
59 |
+
}, [ currentValue ] );
|
|
|
|
|
|
|
60 |
|
61 |
// Remove validation errors when unmounted.
|
62 |
useEffect( () => {
|
63 |
return () => {
|
64 |
clearValidationError( errorId );
|
65 |
};
|
66 |
+
}, [ errorId ] );
|
67 |
|
68 |
const error = getValidationError( errorId ) || {};
|
69 |
|
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/sort-select/index.js
CHANGED
@@ -14,17 +14,6 @@ import './style.scss';
|
|
14 |
/**
|
15 |
* Component used for 'Order by' selectors, which renders a label
|
16 |
* and a <select> with the options provided in the props.
|
17 |
-
*
|
18 |
-
* @param {Object} props Incoming props for the component.
|
19 |
-
* @param {string} props.className CSS class used.
|
20 |
-
* @param {string} props.instanceId Unique id for component instance.
|
21 |
-
* @param {string} props.defaultValue Default value for the select.
|
22 |
-
* @param {string} props.label Label for the select.
|
23 |
-
* @param {function():any} props.onChange Function to call on the change event.
|
24 |
-
* @param {Array} props.options Option values for the select.
|
25 |
-
* @param {string} props.screenReaderLabel Screen reader label.
|
26 |
-
* @param {boolean} props.readOnly Whether the select is read only or not.
|
27 |
-
* @param {string} props.value The selected value.
|
28 |
*/
|
29 |
const SortSelect = ( {
|
30 |
className,
|
14 |
/**
|
15 |
* Component used for 'Order by' selectors, which renders a label
|
16 |
* and a <select> with the options provided in the props.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
*/
|
18 |
const SortSelect = ( {
|
19 |
className,
|
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';
|
@@ -9,10 +10,9 @@ import classnames from 'classnames';
|
|
9 |
/**
|
10 |
* Internal dependencies
|
11 |
*/
|
12 |
-
import {
|
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 |
() =>
|
@@ -100,7 +100,7 @@ const StateInput = ( {
|
|
100 |
);
|
101 |
}
|
102 |
return (
|
103 |
-
<
|
104 |
className={ className }
|
105 |
id={ id }
|
106 |
label={ label }
|
@@ -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';
|
10 |
/**
|
11 |
* Internal dependencies
|
12 |
*/
|
13 |
+
import { DebouncedValidatedTextInput } 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 |
() =>
|
100 |
);
|
101 |
}
|
102 |
return (
|
103 |
+
<DebouncedValidatedTextInput
|
104 |
className={ className }
|
105 |
id={ id }
|
106 |
label={ label }
|
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,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
const snackbarNotices = notices.filter(
|
12 |
+
( notice ) => notice.type === 'snackbar'
|
13 |
+
);
|
14 |
+
|
15 |
+
if ( isEditor ) {
|
16 |
+
return null;
|
17 |
+
}
|
18 |
+
return (
|
19 |
+
<SnackbarList
|
20 |
+
notices={ snackbarNotices }
|
21 |
+
className={ 'wc-block-components-notices__snackbar' }
|
22 |
+
onRemove={ removeNotice }
|
23 |
+
/>
|
24 |
+
);
|
25 |
+
};
|
26 |
+
|
27 |
+
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,9 @@ const getWooClassName = ( { status = 'default' } ) => {
|
|
23 |
return '';
|
24 |
};
|
25 |
|
26 |
-
const StoreNoticesContainer = ( { className, notices
|
|
|
|
|
27 |
const regularNotices = notices.filter(
|
28 |
( notice ) => notice.type !== 'snackbar'
|
29 |
);
|
@@ -32,8 +35,6 @@ const StoreNoticesContainer = ( { className, notices, removeNotice } ) => {
|
|
32 |
return null;
|
33 |
}
|
34 |
|
35 |
-
const wrapperClass = classnames( className, 'wc-block-components-notices' );
|
36 |
-
|
37 |
return (
|
38 |
<div className={ wrapperClass }>
|
39 |
{ regularNotices.map( ( props ) => (
|
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 wrapperClass = classnames( className, 'wc-block-components-notices' );
|
30 |
const regularNotices = notices.filter(
|
31 |
( notice ) => notice.type !== 'snackbar'
|
32 |
);
|
35 |
return null;
|
36 |
}
|
37 |
|
|
|
|
|
38 |
return (
|
39 |
<div className={ wrapperClass }>
|
40 |
{ regularNotices.map( ( props ) => (
|
assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/style.scss
RENAMED
@@ -8,12 +8,12 @@
|
|
8 |
.components-notice__dismiss {
|
9 |
background: transparent none;
|
10 |
padding: 0;
|
11 |
-
margin: 0 0 0
|
12 |
border: 0;
|
13 |
outline: 0;
|
14 |
-
color:
|
15 |
svg {
|
16 |
-
fill:
|
17 |
vertical-align: text-top;
|
18 |
}
|
19 |
}
|
@@ -22,3 +22,24 @@
|
|
22 |
margin-top: 1em;
|
23 |
}
|
24 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
.components-notice__dismiss {
|
9 |
background: transparent none;
|
10 |
padding: 0;
|
11 |
+
margin: 0 0 0 0.5em;
|
12 |
border: 0;
|
13 |
outline: 0;
|
14 |
+
color: #fff;
|
15 |
svg {
|
16 |
+
fill: #fff;
|
17 |
vertical-align: text-top;
|
18 |
}
|
19 |
}
|
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/summary/utils.js
CHANGED
@@ -6,7 +6,7 @@ import { autop } from '@wordpress/autop';
|
|
6 |
|
7 |
/**
|
8 |
* Generates the summary text from a string of text.
|
9 |
-
*
|
10 |
* @param {string} source Source text.
|
11 |
* @param {number} maxLength Limit number of countType returned if text has multiple paragraphs.
|
12 |
* @param {string} countType What is being counted. One of words, characters_excluding_spaces, or characters_including_spaces.
|
6 |
|
7 |
/**
|
8 |
* Generates the summary text from a string of text.
|
9 |
+
*a
|
10 |
* @param {string} source Source text.
|
11 |
* @param {number} maxLength Limit number of countType returned if text has multiple paragraphs.
|
12 |
* @param {string} countType What is being counted. One of words, characters_excluding_spaces, or characters_including_spaces.
|
assets/js/base/components/tabs/index.js
CHANGED
@@ -69,8 +69,7 @@ const Tabs = ( {
|
|
69 |
tabId={ `${ instanceId }-${ name }` }
|
70 |
className="wc-block-components-tabs__content"
|
71 |
>
|
72 |
-
{
|
73 |
-
content }
|
74 |
</TabPanel>
|
75 |
) ) }
|
76 |
</div>
|
69 |
tabId={ `${ instanceId }-${ name }` }
|
70 |
className="wc-block-components-tabs__content"
|
71 |
>
|
72 |
+
{ content }
|
|
|
73 |
</TabPanel>
|
74 |
) ) }
|
75 |
</div>
|
assets/js/base/components/text-input/debounced-validated.js
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { useState, useEffect } from '@wordpress/element';
|
5 |
+
import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
|
6 |
+
import { useShallowEqual } from '@woocommerce/base-hooks';
|
7 |
+
import { useDebouncedCallback } from 'use-debounce';
|
8 |
+
import PropTypes from 'prop-types';
|
9 |
+
|
10 |
+
const DebouncedValidatedTextInput = ( { onChange, value = '', ...props } ) => {
|
11 |
+
// Keep a local copy of the value so we can debounce updates.
|
12 |
+
const [ inputValue, setInputValue ] = useState( value );
|
13 |
+
const [ debouncedCallback ] = useDebouncedCallback( ( newValue ) => {
|
14 |
+
onChange( newValue );
|
15 |
+
}, 400 );
|
16 |
+
const debouncedOnChange = useShallowEqual( debouncedCallback );
|
17 |
+
useEffect( () => {
|
18 |
+
debouncedOnChange( inputValue );
|
19 |
+
}, [ debouncedOnChange, inputValue ] );
|
20 |
+
|
21 |
+
return (
|
22 |
+
<ValidatedTextInput
|
23 |
+
onChange={ setInputValue }
|
24 |
+
value={ inputValue }
|
25 |
+
{ ...props }
|
26 |
+
/>
|
27 |
+
);
|
28 |
+
};
|
29 |
+
|
30 |
+
DebouncedValidatedTextInput.propTypes = {
|
31 |
+
onChange: PropTypes.func.isRequired,
|
32 |
+
value: PropTypes.string,
|
33 |
+
};
|
34 |
+
|
35 |
+
export default DebouncedValidatedTextInput;
|
assets/js/base/components/text-input/{text-input.tsx → index.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,21 @@ 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;
|
112 |
+
export { default as ValidatedTextInput } from './validated';
|
113 |
+
export { default as DebouncedValidatedTextInput } from './debounced-validated';
|
assets/js/base/components/text-input/index.ts
DELETED
@@ -1,2 +0,0 @@
|
|
1 |
-
export { default as TextInput } from './text-input';
|
2 |
-
export { default as ValidatedTextInput } from './validated-text-input';
|
|
|
|
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);
|
@@ -13,7 +12,7 @@
|
|
13 |
top: 0;
|
14 |
transform-origin: top left;
|
15 |
line-height: 1.375; // =22px when font-size is 16px.
|
16 |
-
color: $gray-
|
17 |
transition: transform 200ms ease;
|
18 |
margin: 0 0 0 #{$gap + 1px};
|
19 |
overflow: hidden;
|
@@ -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 |
}
|
@@ -96,16 +76,16 @@
|
|
96 |
&:hover,
|
97 |
&:focus,
|
98 |
&:active {
|
99 |
-
border-color: $
|
100 |
}
|
101 |
&:focus {
|
102 |
-
outline: 1px dotted $
|
103 |
outline-offset: 2px;
|
104 |
}
|
105 |
}
|
106 |
|
107 |
&.has-error label {
|
108 |
-
color: $
|
109 |
}
|
110 |
|
111 |
&:only-child {
|
|
|
1 |
.wc-block-components-text-input {
|
2 |
position: relative;
|
3 |
margin-top: em($gap-large);
|
12 |
top: 0;
|
13 |
transform-origin: top left;
|
14 |
line-height: 1.375; // =22px when font-size is 16px.
|
15 |
+
color: $gray-50;
|
16 |
transition: transform 200ms ease;
|
17 |
margin: 0 0 0 #{$gap + 1px};
|
18 |
overflow: hidden;
|
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 |
}
|
76 |
&:hover,
|
77 |
&:focus,
|
78 |
&:active {
|
79 |
+
border-color: $error-red;
|
80 |
}
|
81 |
&:focus {
|
82 |
+
outline: 1px dotted $error-red;
|
83 |
outline-offset: 2px;
|
84 |
}
|
85 |
}
|
86 |
|
87 |
&.has-error label {
|
88 |
+
color: $error-red;
|
89 |
}
|
90 |
|
91 |
&:only-child {
|
assets/js/base/components/text-input/validated-text-input.tsx
DELETED
@@ -1,166 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { __ } from '@wordpress/i18n';
|
5 |
-
import { useCallback, useRef, useEffect, useState } from 'react';
|
6 |
-
import classnames from 'classnames';
|
7 |
-
import {
|
8 |
-
ValidationInputError,
|
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
|
16 |
-
*/
|
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,
|
47 |
-
id,
|
48 |
-
ariaDescribedBy,
|
49 |
-
errorId,
|
50 |
-
validateOnMount = true,
|
51 |
-
focusOnMount = false,
|
52 |
-
onChange,
|
53 |
-
showError = true,
|
54 |
-
errorMessage: passedErrorMessage = '',
|
55 |
-
...rest
|
56 |
-
}: ValidatedTextInputProps ) => {
|
57 |
-
const [ isPristine, setIsPristine ] = useState( true );
|
58 |
-
const inputRef = useRef< HTMLInputElement >( null );
|
59 |
-
const {
|
60 |
-
getValidationError,
|
61 |
-
hideValidationError,
|
62 |
-
setValidationErrors,
|
63 |
-
clearValidationError,
|
64 |
-
getValidationErrorId,
|
65 |
-
} = useValidationContext();
|
66 |
-
|
67 |
-
const textInputId =
|
68 |
-
typeof id !== 'undefined' ? id : 'textinput-' + instanceId;
|
69 |
-
const errorIdString = errorId !== undefined ? errorId : textInputId;
|
70 |
-
|
71 |
-
const validateInput = useCallback(
|
72 |
-
( errorsHidden = true ) => {
|
73 |
-
const inputObject = inputRef.current || null;
|
74 |
-
if ( ! inputObject ) {
|
75 |
-
return;
|
76 |
-
}
|
77 |
-
// Trim white space before validation.
|
78 |
-
inputObject.value = inputObject.value.trim();
|
79 |
-
const inputIsValid = inputObject.checkValidity();
|
80 |
-
if ( inputIsValid ) {
|
81 |
-
clearValidationError( errorIdString );
|
82 |
-
} else {
|
83 |
-
setValidationErrors( {
|
84 |
-
[ errorIdString ]: {
|
85 |
-
message:
|
86 |
-
inputObject.validationMessage ||
|
87 |
-
__(
|
88 |
-
'Invalid value.',
|
89 |
-
'woo-gutenberg-products-block'
|
90 |
-
),
|
91 |
-
hidden: errorsHidden,
|
92 |
-
},
|
93 |
-
} );
|
94 |
-
}
|
95 |
-
},
|
96 |
-
[ clearValidationError, errorIdString, setValidationErrors ]
|
97 |
-
);
|
98 |
-
|
99 |
-
useEffect( () => {
|
100 |
-
if ( isPristine ) {
|
101 |
-
if ( focusOnMount ) {
|
102 |
-
inputRef.current?.focus();
|
103 |
-
}
|
104 |
-
setIsPristine( false );
|
105 |
-
}
|
106 |
-
}, [ focusOnMount, isPristine, setIsPristine ] );
|
107 |
-
|
108 |
-
useEffect( () => {
|
109 |
-
if ( isPristine ) {
|
110 |
-
if ( validateOnMount ) {
|
111 |
-
validateInput();
|
112 |
-
}
|
113 |
-
setIsPristine( false );
|
114 |
-
}
|
115 |
-
}, [ isPristine, setIsPristine, validateOnMount, validateInput ] );
|
116 |
-
|
117 |
-
// Remove validation errors when unmounted.
|
118 |
-
useEffect( () => {
|
119 |
-
return () => {
|
120 |
-
clearValidationError( errorIdString );
|
121 |
-
};
|
122 |
-
}, [ clearValidationError, errorIdString ] );
|
123 |
-
|
124 |
-
// @todo - When useValidationContext is converted to TypeScript, remove this cast and use the correct type.
|
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( errorIdString )
|
135 |
-
? getValidationErrorId( errorIdString )
|
136 |
-
: ariaDescribedBy;
|
137 |
-
|
138 |
-
return (
|
139 |
-
<TextInput
|
140 |
-
className={ classnames( className, {
|
141 |
-
'has-error': hasError,
|
142 |
-
} ) }
|
143 |
-
id={ textInputId }
|
144 |
-
onBlur={ () => {
|
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( errorIdString );
|
158 |
-
onChange( val );
|
159 |
-
} }
|
160 |
-
ariaDescribedBy={ describedBy }
|
161 |
-
{ ...rest }
|
162 |
-
/>
|
163 |
-
);
|
164 |
-
};
|
165 |
-
|
166 |
-
export default withInstanceId( ValidatedTextInput );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/text-input/validated.js
ADDED
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import { useRef, useEffect } 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
|
14 |
+
*/
|
15 |
+
import TextInput from './index';
|
16 |
+
import './style.scss';
|
17 |
+
|
18 |
+
const ValidatedTextInput = ( {
|
19 |
+
className,
|
20 |
+
instanceId,
|
21 |
+
id,
|
22 |
+
ariaDescribedBy,
|
23 |
+
errorId,
|
24 |
+
validateOnMount = true,
|
25 |
+
focusOnMount = false,
|
26 |
+
onChange,
|
27 |
+
showError = true,
|
28 |
+
...rest
|
29 |
+
} ) => {
|
30 |
+
const inputRef = useRef();
|
31 |
+
const {
|
32 |
+
getValidationError,
|
33 |
+
hideValidationError,
|
34 |
+
setValidationErrors,
|
35 |
+
clearValidationError,
|
36 |
+
getValidationErrorId,
|
37 |
+
} = useValidationContext();
|
38 |
+
|
39 |
+
const textInputId = id || 'textinput-' + instanceId;
|
40 |
+
errorId = errorId || textInputId;
|
41 |
+
|
42 |
+
const validateInput = ( errorsHidden = true ) => {
|
43 |
+
if ( inputRef.current.checkValidity() ) {
|
44 |
+
clearValidationError( errorId );
|
45 |
+
} else {
|
46 |
+
setValidationErrors( {
|
47 |
+
[ errorId ]: {
|
48 |
+
message:
|
49 |
+
inputRef.current.validationMessage ||
|
50 |
+
__( 'Invalid value.', 'woo-gutenberg-products-block' ),
|
51 |
+
hidden: errorsHidden,
|
52 |
+
},
|
53 |
+
} );
|
54 |
+
}
|
55 |
+
};
|
56 |
+
|
57 |
+
useEffect( () => {
|
58 |
+
if ( focusOnMount ) {
|
59 |
+
inputRef.current.focus();
|
60 |
+
}
|
61 |
+
}, [ focusOnMount ] );
|
62 |
+
|
63 |
+
useEffect( () => {
|
64 |
+
if ( validateOnMount ) {
|
65 |
+
validateInput();
|
66 |
+
}
|
67 |
+
}, [ validateOnMount ] );
|
68 |
+
|
69 |
+
// Remove validation errors when unmounted.
|
70 |
+
useEffect( () => {
|
71 |
+
return () => {
|
72 |
+
clearValidationError( errorId );
|
73 |
+
};
|
74 |
+
}, [ errorId ] );
|
75 |
+
|
76 |
+
const errorMessage = getValidationError( errorId ) || {};
|
77 |
+
const hasError = errorMessage.message && ! errorMessage.hidden;
|
78 |
+
const describedBy =
|
79 |
+
showError && hasError && getValidationErrorId( errorId )
|
80 |
+
? getValidationErrorId( errorId )
|
81 |
+
: ariaDescribedBy;
|
82 |
+
|
83 |
+
return (
|
84 |
+
<TextInput
|
85 |
+
className={ classnames( className, {
|
86 |
+
'has-error': hasError,
|
87 |
+
} ) }
|
88 |
+
id={ textInputId }
|
89 |
+
onBlur={ () => {
|
90 |
+
validateInput( false );
|
91 |
+
} }
|
92 |
+
feedback={
|
93 |
+
showError && <ValidationInputError propertyName={ errorId } />
|
94 |
+
}
|
95 |
+
ref={ inputRef }
|
96 |
+
onChange={ ( val ) => {
|
97 |
+
hideValidationError( errorId );
|
98 |
+
onChange( val );
|
99 |
+
} }
|
100 |
+
ariaDescribedBy={ describedBy }
|
101 |
+
{ ...rest }
|
102 |
+
/>
|
103 |
+
);
|
104 |
+
};
|
105 |
+
|
106 |
+
ValidatedTextInput.propTypes = {
|
107 |
+
onChange: PropTypes.func.isRequired,
|
108 |
+
id: PropTypes.string,
|
109 |
+
value: PropTypes.string,
|
110 |
+
ariaDescribedBy: PropTypes.string,
|
111 |
+
errorId: PropTypes.string,
|
112 |
+
validateOnMount: PropTypes.bool,
|
113 |
+
focusOnMount: PropTypes.bool,
|
114 |
+
showError: PropTypes.bool,
|
115 |
+
};
|
116 |
+
|
117 |
+
export default withInstanceId( ValidatedTextInput );
|
assets/js/base/components/textarea/style.scss
CHANGED
@@ -20,10 +20,3 @@
|
|
20 |
}
|
21 |
}
|
22 |
}
|
23 |
-
|
24 |
-
.theme-twentytwentyone {
|
25 |
-
.has-dark-controls .wc-block-components-textarea {
|
26 |
-
background-color: $input-background-dark;
|
27 |
-
color: $input-text-dark;
|
28 |
-
}
|
29 |
-
}
|
20 |
}
|
21 |
}
|
22 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/components/title/index.js
CHANGED
@@ -9,16 +9,8 @@ import PropTypes from 'prop-types';
|
|
9 |
*/
|
10 |
import './style.scss';
|
11 |
|
12 |
-
/** @typedef {import('react')} React */
|
13 |
-
|
14 |
/**
|
15 |
* Component that renders a block title.
|
16 |
-
*
|
17 |
-
* @param {Object} props Incoming props for the component.
|
18 |
-
* @param {React.ReactNode} [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.
|
22 |
*/
|
23 |
const Title = ( { children, className, headingLevel, ...props } ) => {
|
24 |
const buttonClassName = classNames(
|
9 |
*/
|
10 |
import './style.scss';
|
11 |
|
|
|
|
|
12 |
/**
|
13 |
* Component that renders a block title.
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
*/
|
15 |
const Title = ( { children, className, headingLevel, ...props } ) => {
|
16 |
const buttonClassName = classNames(
|
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
@@ -1,6 +1,6 @@
|
|
1 |
.wc-block-components-validation-error {
|
2 |
@include font-size(smaller);
|
3 |
-
color: $
|
4 |
max-width: 100%;
|
5 |
position: absolute;
|
6 |
top: calc(100% - 1px);
|
1 |
.wc-block-components-validation-error {
|
2 |
@include font-size(smaller);
|
3 |
+
color: $error-red;
|
4 |
max-width: 100%;
|
5 |
position: absolute;
|
6 |
top: calc(100% - 1px);
|
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
@@ -31,9 +31,6 @@ const {
|
|
31 |
*
|
32 |
* @param {Object} state Current state.
|
33 |
* @param {Object} action Incoming action object.
|
34 |
-
* @param {number} action.quantity Incoming quantity.
|
35 |
-
* @param {string} action.type Type of action.
|
36 |
-
* @param {Object} action.data Incoming payload for action.
|
37 |
*/
|
38 |
export const reducer = ( state = DEFAULT_STATE, { quantity, type, data } ) => {
|
39 |
let newState;
|
31 |
*
|
32 |
* @param {Object} state Current state.
|
33 |
* @param {Object} action Incoming action object.
|
|
|
|
|
|
|
34 |
*/
|
35 |
export const reducer = ( state = DEFAULT_STATE, { quantity, type, data } ) => {
|
36 |
let newState;
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/index.js
RENAMED
@@ -1,8 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
import { AddToCartFormStateContextProvider } from '../form-state';
|
5 |
-
import { ValidationContextProvider } from '../../validation';
|
6 |
import FormSubmit from './submit';
|
7 |
|
8 |
/**
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { ValidationContextProvider } from '@woocommerce/base-context';
|
5 |
+
|
6 |
/**
|
7 |
* Internal dependencies
|
8 |
*/
|
9 |
import { AddToCartFormStateContextProvider } from '../form-state';
|
|
|
10 |
import FormSubmit from './submit';
|
11 |
|
12 |
/**
|
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/submit/index.js
RENAMED
@@ -3,16 +3,14 @@
|
|
3 |
*/
|
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 '../../../validation';
|
14 |
-
import { useStoreCart } from '../../../../hooks/cart/use-store-cart';
|
15 |
-
import { useStoreNotices } from '../../../../hooks/use-store-notices';
|
16 |
|
17 |
/**
|
18 |
* FormSubmit.
|
@@ -109,6 +107,7 @@ const FormSubmit = () => {
|
|
109 |
}
|
110 |
dispatchActions.setAfterProcessing( response );
|
111 |
setIsSubmitting( false );
|
|
|
112 |
} );
|
113 |
} )
|
114 |
.catch( ( error ) => {
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import triggerFetch from '@wordpress/api-fetch';
|
6 |
+
import {
|
7 |
+
useAddToCartFormContext,
|
8 |
+
useValidationContext,
|
9 |
+
} from '@woocommerce/base-context';
|
10 |
import { useEffect, useCallback, useState } from '@wordpress/element';
|
11 |
+
import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
|
12 |
import { decodeEntities } from '@wordpress/html-entities';
|
13 |
+
import { triggerFragmentRefresh } from '@woocommerce/base-utils';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
|
15 |
/**
|
16 |
* FormSubmit.
|
107 |
}
|
108 |
dispatchActions.setAfterProcessing( response );
|
109 |
setIsSubmitting( false );
|
110 |
+
triggerFragmentRefresh();
|
111 |
} );
|
112 |
} )
|
113 |
.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/cart-checkout/billing/constants.js
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* @typedef {import('@woocommerce/type-defs/billing').BillingData} BillingData
|
3 |
+
* @typedef {import('@woocommerce/type-defs/contexts').BillingDataContext} BillingDataContext
|
4 |
+
*/
|
5 |
+
|
6 |
+
/**
|
7 |
+
* External dependencies
|
8 |
+
*/
|
9 |
+
import { getSetting } from '@woocommerce/settings';
|
10 |
+
import { mapValues } from 'lodash';
|
11 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
12 |
+
|
13 |
+
const checkoutData = getSetting( 'checkoutData', {} );
|
14 |
+
|
15 |
+
/**
|
16 |
+
* @type {BillingData}
|
17 |
+
*/
|
18 |
+
export const DEFAULT_BILLING_DATA = {
|
19 |
+
first_name: '',
|
20 |
+
last_name: '',
|
21 |
+
company: '',
|
22 |
+
address_1: '',
|
23 |
+
address_2: '',
|
24 |
+
city: '',
|
25 |
+
state: '',
|
26 |
+
postcode: '',
|
27 |
+
country: '',
|
28 |
+
email: '',
|
29 |
+
phone: '',
|
30 |
+
};
|
31 |
+
|
32 |
+
const billingAddress = mapValues( checkoutData.billing_address, ( value ) =>
|
33 |
+
decodeEntities( value )
|
34 |
+
);
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @type {BillingData}
|
38 |
+
*/
|
39 |
+
export const DEFAULT_STATE = {
|
40 |
+
...DEFAULT_BILLING_DATA,
|
41 |
+
...billingAddress,
|
42 |
+
};
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @type {BillingDataContext}
|
46 |
+
*/
|
47 |
+
export const DEFAULT_BILLING_CONTEXT_DATA = {
|
48 |
+
billingData: DEFAULT_BILLING_DATA,
|
49 |
+
setBillingData: () => null,
|
50 |
+
};
|
assets/js/base/context/cart-checkout/billing/index.js
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import {
|
5 |
+
createContext,
|
6 |
+
useContext,
|
7 |
+
useState,
|
8 |
+
useCallback,
|
9 |
+
} from '@wordpress/element';
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Internal dependencies
|
13 |
+
*/
|
14 |
+
import { DEFAULT_STATE, DEFAULT_BILLING_CONTEXT_DATA } from './constants';
|
15 |
+
|
16 |
+
/**
|
17 |
+
* @typedef {import('@woocommerce/type-defs/contexts').BillingDataContext} BillingDataContext
|
18 |
+
*/
|
19 |
+
|
20 |
+
const BillingDataContext = createContext( DEFAULT_BILLING_CONTEXT_DATA );
|
21 |
+
|
22 |
+
/**
|
23 |
+
* @return {BillingDataContext} Returns data and functions related to billing.
|
24 |
+
*/
|
25 |
+
export const useBillingDataContext = () => {
|
26 |
+
return useContext( BillingDataContext );
|
27 |
+
};
|
28 |
+
|
29 |
+
export const BillingDataProvider = ( { children } ) => {
|
30 |
+
const [ billingData, setBillingDataState ] = useState( DEFAULT_STATE );
|
31 |
+
|
32 |
+
const setBillingData = useCallback( ( newData ) => {
|
33 |
+
setBillingDataState( ( prevState ) => ( {
|
34 |
+
...prevState,
|
35 |
+
...newData,
|
36 |
+
} ) );
|
37 |
+
}, [] );
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @type {BillingDataContext}
|
41 |
+
*/
|
42 |
+
const billingDataValue = {
|
43 |
+
billingData,
|
44 |
+
setBillingData,
|
45 |
+
};
|
46 |
+
return (
|
47 |
+
<BillingDataContext.Provider value={ billingDataValue }>
|
48 |
+
{ children }
|
49 |
+
</BillingDataContext.Provider>
|
50 |
+
);
|
51 |
+
};
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js
RENAMED
@@ -1,7 +1,9 @@
|
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
-
import {
|
|
|
|
|
5 |
|
6 |
/**
|
7 |
* Cart provider
|
@@ -16,8 +18,12 @@ import { CheckoutProvider } from '../checkout';
|
|
16 |
*/
|
17 |
export const CartProvider = ( { children, redirectUrl } ) => {
|
18 |
return (
|
19 |
-
<
|
20 |
-
|
21 |
-
|
|
|
|
|
|
|
|
|
22 |
);
|
23 |
};
|
1 |
/**
|
2 |
* Internal dependencies
|
3 |
*/
|
4 |
+
import { ShippingDataProvider } from '../shipping';
|
5 |
+
import { CheckoutStateProvider } from '../checkout-state';
|
6 |
+
import { PaymentMethodDataProvider } from '../payment-methods';
|
7 |
|
8 |
/**
|
9 |
* Cart provider
|
18 |
*/
|
19 |
export const CartProvider = ( { children, redirectUrl } ) => {
|
20 |
return (
|
21 |
+
<CheckoutStateProvider redirectUrl={ redirectUrl } isCart={ true }>
|
22 |
+
<ShippingDataProvider>
|
23 |
+
<PaymentMethodDataProvider>
|
24 |
+
{ children }
|
25 |
+
</PaymentMethodDataProvider>
|
26 |
+
</ShippingDataProvider>
|
27 |
+
</CheckoutStateProvider>
|
28 |
);
|
29 |
};
|
assets/js/base/context/cart-checkout/checkout-state/actions.js
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_ORDER_ID,
|
20 |
+
SET_ORDER_NOTES,
|
21 |
+
} = TYPES;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* All the actions that can be dispatched for the checkout.
|
25 |
+
*/
|
26 |
+
export const actions = {
|
27 |
+
setPristine: () => ( {
|
28 |
+
type: SET_PRISTINE,
|
29 |
+
} ),
|
30 |
+
setIdle: () => ( {
|
31 |
+
type: SET_IDLE,
|
32 |
+
} ),
|
33 |
+
setProcessing: () => ( {
|
34 |
+
type: SET_PROCESSING,
|
35 |
+
} ),
|
36 |
+
setRedirectUrl: ( url ) => ( {
|
37 |
+
type: SET_REDIRECT_URL,
|
38 |
+
url,
|
39 |
+
} ),
|
40 |
+
setProcessingResponse: ( data ) => ( {
|
41 |
+
type: SET_PROCESSING_RESPONSE,
|
42 |
+
data,
|
43 |
+
} ),
|
44 |
+
setComplete: ( data ) => ( {
|
45 |
+
type: SET_COMPLETE,
|
46 |
+
data,
|
47 |
+
} ),
|
48 |
+
setBeforeProcessing: () => ( {
|
49 |
+
type: SET_BEFORE_PROCESSING,
|
50 |
+
} ),
|
51 |
+
setAfterProcessing: () => ( {
|
52 |
+
type: SET_AFTER_PROCESSING,
|
53 |
+
} ),
|
54 |
+
setHasError: ( hasError = true ) => {
|
55 |
+
const type = hasError ? SET_HAS_ERROR : SET_NO_ERROR;
|
56 |
+
return { type };
|
57 |
+
},
|
58 |
+
incrementCalculating: () => ( {
|
59 |
+
type: INCREMENT_CALCULATING,
|
60 |
+
} ),
|
61 |
+
decrementCalculating: () => ( {
|
62 |
+
type: DECREMENT_CALCULATING,
|
63 |
+
} ),
|
64 |
+
setOrderId: ( orderId ) => ( {
|
65 |
+
type: SET_ORDER_ID,
|
66 |
+
orderId,
|
67 |
+
} ),
|
68 |
+
setOrderNotes: ( orderNotes ) => ( {
|
69 |
+
type: SET_ORDER_NOTES,
|
70 |
+
orderNotes,
|
71 |
+
} ),
|
72 |
+
};
|
assets/js/base/context/cart-checkout/checkout-state/constants.js
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
processingResponse: null,
|
32 |
+
};
|
33 |
+
|
34 |
+
export const TYPES = {
|
35 |
+
SET_IDLE: 'set_idle',
|
36 |
+
SET_PRISTINE: 'set_pristine',
|
37 |
+
SET_REDIRECT_URL: 'set_redirect_url',
|
38 |
+
SET_COMPLETE: 'set_checkout_complete',
|
39 |
+
SET_BEFORE_PROCESSING: 'set_before_processing',
|
40 |
+
SET_AFTER_PROCESSING: 'set_after_processing',
|
41 |
+
SET_PROCESSING_RESPONSE: 'set_processing_response',
|
42 |
+
SET_PROCESSING: 'set_checkout_is_processing',
|
43 |
+
SET_HAS_ERROR: 'set_checkout_has_error',
|
44 |
+
SET_NO_ERROR: 'set_checkout_no_error',
|
45 |
+
SET_ORDER_ID: 'set_checkout_order_id',
|
46 |
+
SET_ORDER_NOTES: 'set_checkout_order_notes',
|
47 |
+
INCREMENT_CALCULATING: 'increment_calculating',
|
48 |
+
DECREMENT_CALCULATING: 'decrement_calculating',
|
49 |
+
};
|
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/cart-checkout/checkout-state/index.js
ADDED
@@ -0,0 +1,344 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import {
|
5 |
+
createContext,
|
6 |
+
useContext,
|
7 |
+
useReducer,
|
8 |
+
useRef,
|
9 |
+
useMemo,
|
10 |
+
useEffect,
|
11 |
+
useCallback,
|
12 |
+
} from '@wordpress/element';
|
13 |
+
import { __ } from '@wordpress/i18n';
|
14 |
+
import { useStoreNotices, useEmitResponse } from '@woocommerce/base-hooks';
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Internal dependencies
|
18 |
+
*/
|
19 |
+
import { actions } from './actions';
|
20 |
+
import { reducer, prepareResponseData } from './reducer';
|
21 |
+
import { DEFAULT_STATE, STATUS } from './constants';
|
22 |
+
import {
|
23 |
+
EMIT_TYPES,
|
24 |
+
emitterSubscribers,
|
25 |
+
emitEvent,
|
26 |
+
emitEventWithAbort,
|
27 |
+
reducer as emitReducer,
|
28 |
+
} from './event-emit';
|
29 |
+
import { useValidationContext } from '../../shared/validation';
|
30 |
+
|
31 |
+
/**
|
32 |
+
* @typedef {import('@woocommerce/type-defs/checkout').CheckoutDispatchActions} CheckoutDispatchActions
|
33 |
+
* @typedef {import('@woocommerce/type-defs/contexts').CheckoutDataContext} CheckoutDataContext
|
34 |
+
*/
|
35 |
+
|
36 |
+
const CheckoutContext = createContext( {
|
37 |
+
isComplete: false,
|
38 |
+
isIdle: false,
|
39 |
+
isCalculating: false,
|
40 |
+
isProcessing: false,
|
41 |
+
isBeforeProcessing: false,
|
42 |
+
isAfterProcessing: false,
|
43 |
+
hasError: false,
|
44 |
+
redirectUrl: '',
|
45 |
+
orderId: 0,
|
46 |
+
orderNotes: '',
|
47 |
+
customerId: 0,
|
48 |
+
onSubmit: () => void null,
|
49 |
+
onCheckoutAfterProcessingWithSuccess: ( callback ) => void callback,
|
50 |
+
onCheckoutAfterProcessingWithError: ( callback ) => void callback,
|
51 |
+
onCheckoutBeforeProcessing: ( callback ) => void callback,
|
52 |
+
dispatchActions: {
|
53 |
+
resetCheckout: () => void null,
|
54 |
+
setRedirectUrl: ( url ) => void url,
|
55 |
+
setHasError: ( hasError ) => void hasError,
|
56 |
+
setAfterProcessing: ( response ) => void response,
|
57 |
+
incrementCalculating: () => void null,
|
58 |
+
decrementCalculating: () => void null,
|
59 |
+
setOrderId: ( id ) => void id,
|
60 |
+
setOrderNotes: ( orderNotes ) => void orderNotes,
|
61 |
+
},
|
62 |
+
hasOrder: false,
|
63 |
+
isCart: false,
|
64 |
+
} );
|
65 |
+
|
66 |
+
/**
|
67 |
+
* @return {CheckoutDataContext} Returns the checkout data context value
|
68 |
+
*/
|
69 |
+
export const useCheckoutContext = () => {
|
70 |
+
return useContext( CheckoutContext );
|
71 |
+
};
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Checkout state provider
|
75 |
+
* This provides provides an api interface exposing checkout state for use with
|
76 |
+
* cart or checkout blocks.
|
77 |
+
*
|
78 |
+
* @param {Object} props Incoming props for the provider.
|
79 |
+
* @param {Object} props.children The children being wrapped.
|
80 |
+
* @param {string} props.redirectUrl Initialize what the checkout will
|
81 |
+
* redirect to after successful
|
82 |
+
* submit.
|
83 |
+
* @param {boolean} props.isCart If context provider is being used
|
84 |
+
* in cart context.
|
85 |
+
*/
|
86 |
+
export const CheckoutStateProvider = ( {
|
87 |
+
children,
|
88 |
+
redirectUrl,
|
89 |
+
isCart = false,
|
90 |
+
} ) => {
|
91 |
+
// note, this is done intentionally so that the default state now has
|
92 |
+
// the redirectUrl for when checkout is reset to PRISTINE state.
|
93 |
+
DEFAULT_STATE.redirectUrl = redirectUrl;
|
94 |
+
const [ checkoutState, dispatch ] = useReducer( reducer, DEFAULT_STATE );
|
95 |
+
const [ observers, subscriber ] = useReducer( emitReducer, {} );
|
96 |
+
const currentObservers = useRef( observers );
|
97 |
+
const { setValidationErrors } = useValidationContext();
|
98 |
+
const { addErrorNotice, removeNotices } = useStoreNotices();
|
99 |
+
const isCalculating = checkoutState.calculatingCount > 0;
|
100 |
+
const {
|
101 |
+
isSuccessResponse,
|
102 |
+
isErrorResponse,
|
103 |
+
isFailResponse,
|
104 |
+
} = useEmitResponse();
|
105 |
+
|
106 |
+
// set observers on ref so it's always current.
|
107 |
+
useEffect( () => {
|
108 |
+
currentObservers.current = observers;
|
109 |
+
}, [ observers ] );
|
110 |
+
const onCheckoutAfterProcessingWithSuccess = useMemo(
|
111 |
+
() =>
|
112 |
+
emitterSubscribers( subscriber )
|
113 |
+
.onCheckoutAfterProcessingWithSuccess,
|
114 |
+
[ subscriber ]
|
115 |
+
);
|
116 |
+
const onCheckoutAfterProcessingWithError = useMemo(
|
117 |
+
() =>
|
118 |
+
emitterSubscribers( subscriber ).onCheckoutAfterProcessingWithError,
|
119 |
+
[ subscriber ]
|
120 |
+
);
|
121 |
+
const onCheckoutBeforeProcessing = useMemo(
|
122 |
+
() => emitterSubscribers( subscriber ).onCheckoutBeforeProcessing,
|
123 |
+
[ subscriber ]
|
124 |
+
);
|
125 |
+
|
126 |
+
/**
|
127 |
+
* @type {CheckoutDispatchActions}
|
128 |
+
*/
|
129 |
+
const dispatchActions = useMemo(
|
130 |
+
() => ( {
|
131 |
+
resetCheckout: () => void dispatch( actions.setPristine() ),
|
132 |
+
setRedirectUrl: ( url ) =>
|
133 |
+
void dispatch( actions.setRedirectUrl( url ) ),
|
134 |
+
setHasError: ( hasError ) =>
|
135 |
+
void dispatch( actions.setHasError( hasError ) ),
|
136 |
+
incrementCalculating: () =>
|
137 |
+
void dispatch( actions.incrementCalculating() ),
|
138 |
+
decrementCalculating: () =>
|
139 |
+
void dispatch( actions.decrementCalculating() ),
|
140 |
+
setOrderId: ( orderId ) =>
|
141 |
+
void dispatch( actions.setOrderId( orderId ) ),
|
142 |
+
setOrderNotes: ( orderNotes ) =>
|
143 |
+
void dispatch( actions.setOrderNotes( orderNotes ) ),
|
144 |
+
setAfterProcessing: ( response ) => {
|
145 |
+
// capture general error message if this is an error response.
|
146 |
+
if (
|
147 |
+
! response.payment_result &&
|
148 |
+
response.message &&
|
149 |
+
response?.data?.status !== 200
|
150 |
+
) {
|
151 |
+
response.payment_result = {
|
152 |
+
...response.payment_result,
|
153 |
+
message: response.message,
|
154 |
+
};
|
155 |
+
}
|
156 |
+
if ( response.payment_result ) {
|
157 |
+
if (
|
158 |
+
// eslint-disable-next-line camelcase
|
159 |
+
response.payment_result?.redirect_url
|
160 |
+
) {
|
161 |
+
dispatch(
|
162 |
+
actions.setRedirectUrl(
|
163 |
+
response.payment_result.redirect_url
|
164 |
+
)
|
165 |
+
);
|
166 |
+
}
|
167 |
+
dispatch(
|
168 |
+
actions.setProcessingResponse(
|
169 |
+
prepareResponseData( response.payment_result )
|
170 |
+
)
|
171 |
+
);
|
172 |
+
}
|
173 |
+
void dispatch( actions.setAfterProcessing() );
|
174 |
+
},
|
175 |
+
} ),
|
176 |
+
[]
|
177 |
+
);
|
178 |
+
|
179 |
+
// emit events.
|
180 |
+
useEffect( () => {
|
181 |
+
const status = checkoutState.status;
|
182 |
+
if ( status === STATUS.BEFORE_PROCESSING ) {
|
183 |
+
removeNotices( 'error' );
|
184 |
+
emitEvent(
|
185 |
+
currentObservers.current,
|
186 |
+
EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
|
187 |
+
{}
|
188 |
+
).then( ( response ) => {
|
189 |
+
if ( response !== true ) {
|
190 |
+
if ( Array.isArray( response ) ) {
|
191 |
+
response.forEach(
|
192 |
+
( { errorMessage, validationErrors } ) => {
|
193 |
+
addErrorNotice( errorMessage );
|
194 |
+
setValidationErrors( validationErrors );
|
195 |
+
}
|
196 |
+
);
|
197 |
+
}
|
198 |
+
dispatch( actions.setIdle() );
|
199 |
+
} else {
|
200 |
+
dispatch( actions.setProcessing() );
|
201 |
+
}
|
202 |
+
} );
|
203 |
+
}
|
204 |
+
}, [
|
205 |
+
checkoutState.status,
|
206 |
+
setValidationErrors,
|
207 |
+
addErrorNotice,
|
208 |
+
removeNotices,
|
209 |
+
dispatch,
|
210 |
+
] );
|
211 |
+
|
212 |
+
useEffect( () => {
|
213 |
+
if ( checkoutState.status === STATUS.AFTER_PROCESSING ) {
|
214 |
+
const data = {
|
215 |
+
redirectUrl: checkoutState.redirectUrl,
|
216 |
+
orderId: checkoutState.orderId,
|
217 |
+
customerId: checkoutState.customerId,
|
218 |
+
customerNote: checkoutState.customerNote,
|
219 |
+
processingResponse: checkoutState.processingResponse,
|
220 |
+
};
|
221 |
+
if ( checkoutState.hasError ) {
|
222 |
+
// allow payment methods or other things to customize the error
|
223 |
+
// with a fallback if nothing customizes it.
|
224 |
+
emitEventWithAbort(
|
225 |
+
currentObservers.current,
|
226 |
+
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
|
227 |
+
data
|
228 |
+
).then( ( response ) => {
|
229 |
+
if (
|
230 |
+
isErrorResponse( response ) ||
|
231 |
+
isFailResponse( response )
|
232 |
+
) {
|
233 |
+
if ( response.message ) {
|
234 |
+
const errorOptions = response.messageContext
|
235 |
+
? { context: response.messageContext }
|
236 |
+
: undefined;
|
237 |
+
addErrorNotice( response.message, errorOptions );
|
238 |
+
}
|
239 |
+
// irrecoverable error so set complete
|
240 |
+
if (
|
241 |
+
typeof response.retry !== 'undefined' &&
|
242 |
+
response.retry !== true
|
243 |
+
) {
|
244 |
+
dispatch( actions.setComplete( response ) );
|
245 |
+
} else {
|
246 |
+
dispatch( actions.setIdle() );
|
247 |
+
}
|
248 |
+
} else {
|
249 |
+
// no error handling in place by anything so let's fall
|
250 |
+
// back to default
|
251 |
+
const message =
|
252 |
+
data.processingResponse?.message ||
|
253 |
+
__(
|
254 |
+
'Something went wrong. Please contact us to get assistance.',
|
255 |
+
'woo-gutenberg-products-block'
|
256 |
+
);
|
257 |
+
addErrorNotice( message, {
|
258 |
+
id: 'checkout',
|
259 |
+
} );
|
260 |
+
dispatch( actions.setIdle() );
|
261 |
+
}
|
262 |
+
} );
|
263 |
+
} else {
|
264 |
+
emitEventWithAbort(
|
265 |
+
currentObservers.current,
|
266 |
+
EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
|
267 |
+
data
|
268 |
+
).then( ( response ) => {
|
269 |
+
if ( isSuccessResponse( response ) ) {
|
270 |
+
dispatch( actions.setComplete( response ) );
|
271 |
+
} else if (
|
272 |
+
isErrorResponse( response ) ||
|
273 |
+
isFailResponse( response )
|
274 |
+
) {
|
275 |
+
if ( response.message ) {
|
276 |
+
const errorOptions = response.messageContext
|
277 |
+
? { context: response.messageContext }
|
278 |
+
: undefined;
|
279 |
+
addErrorNotice( response.message, errorOptions );
|
280 |
+
}
|
281 |
+
if ( ! response.retry ) {
|
282 |
+
dispatch( actions.setComplete( response ) );
|
283 |
+
} else {
|
284 |
+
// this will set an error which will end up
|
285 |
+
// triggering the onCheckoutAfterProcessingWithErrors emitter.
|
286 |
+
// and then setting checkout to IDLE state.
|
287 |
+
dispatch( actions.setHasError( true ) );
|
288 |
+
}
|
289 |
+
} else {
|
290 |
+
// nothing hooked in had any response type so let's just
|
291 |
+
// consider successful
|
292 |
+
dispatch( actions.setComplete() );
|
293 |
+
}
|
294 |
+
} );
|
295 |
+
}
|
296 |
+
}
|
297 |
+
}, [
|
298 |
+
checkoutState.status,
|
299 |
+
checkoutState.hasError,
|
300 |
+
checkoutState.redirectUrl,
|
301 |
+
checkoutState.orderId,
|
302 |
+
checkoutState.customerId,
|
303 |
+
checkoutState.customerNote,
|
304 |
+
checkoutState.processingResponse,
|
305 |
+
dispatchActions,
|
306 |
+
addErrorNotice,
|
307 |
+
isErrorResponse,
|
308 |
+
isFailResponse,
|
309 |
+
isSuccessResponse,
|
310 |
+
] );
|
311 |
+
|
312 |
+
const onSubmit = useCallback( () => {
|
313 |
+
dispatch( actions.setBeforeProcessing() );
|
314 |
+
}, [] );
|
315 |
+
|
316 |
+
/**
|
317 |
+
* @type {CheckoutDataContext}
|
318 |
+
*/
|
319 |
+
const checkoutData = {
|
320 |
+
onSubmit,
|
321 |
+
isComplete: checkoutState.status === STATUS.COMPLETE,
|
322 |
+
isIdle: checkoutState.status === STATUS.IDLE,
|
323 |
+
isCalculating,
|
324 |
+
isProcessing: checkoutState.status === STATUS.PROCESSING,
|
325 |
+
isBeforeProcessing: checkoutState.status === STATUS.BEFORE_PROCESSING,
|
326 |
+
isAfterProcessing: checkoutState.status === STATUS.AFTER_PROCESSING,
|
327 |
+
hasError: checkoutState.hasError,
|
328 |
+
redirectUrl: checkoutState.redirectUrl,
|
329 |
+
onCheckoutAfterProcessingWithSuccess,
|
330 |
+
onCheckoutAfterProcessingWithError,
|
331 |
+
onCheckoutBeforeProcessing,
|
332 |
+
dispatchActions,
|
333 |
+
isCart,
|
334 |
+
orderId: checkoutState.orderId,
|
335 |
+
hasOrder: !! checkoutState.orderId,
|
336 |
+
customerId: checkoutState.customerId,
|
337 |
+
orderNotes: checkoutState.orderNotes,
|
338 |
+
};
|
339 |
+
return (
|
340 |
+
<CheckoutContext.Provider value={ checkoutData }>
|
341 |
+
{ children }
|
342 |
+
</CheckoutContext.Provider>
|
343 |
+
);
|
344 |
+
};
|
assets/js/base/context/cart-checkout/checkout-state/reducer.js
ADDED
@@ -0,0 +1,207 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import { TYPES, DEFAULT_STATE, STATUS } 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_ORDER_ID,
|
20 |
+
SET_ORDER_NOTES,
|
21 |
+
} = TYPES;
|
22 |
+
|
23 |
+
const {
|
24 |
+
PRISTINE,
|
25 |
+
IDLE,
|
26 |
+
PROCESSING,
|
27 |
+
BEFORE_PROCESSING,
|
28 |
+
AFTER_PROCESSING,
|
29 |
+
COMPLETE,
|
30 |
+
} = STATUS;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Prepares the payment_result data from the server checkout endpoint response.
|
34 |
+
*
|
35 |
+
* @param {Object} data The value of `payment_result` from the checkout
|
36 |
+
* processing endpoint response.
|
37 |
+
* @param {string} data.message If there was a general error message it will appear
|
38 |
+
* on this property.
|
39 |
+
* @param {string} data.payment_status The payment status. One of 'success', 'failure',
|
40 |
+
* 'pending', 'error'.
|
41 |
+
* @param {Array<Object>} data.payment_details An array of Objects with a 'key' property that is a
|
42 |
+
* string and value property that is a string. These are
|
43 |
+
* converted to a flat object where the key becomes the
|
44 |
+
* object property and value the property value.
|
45 |
+
*
|
46 |
+
* @return {Object} A new object with 'paymentStatus', and 'paymentDetails' as the properties.
|
47 |
+
*/
|
48 |
+
export const prepareResponseData = ( data ) => {
|
49 |
+
const responseData = {
|
50 |
+
message: data?.message || '',
|
51 |
+
paymentStatus: data.payment_status,
|
52 |
+
paymentDetails: {},
|
53 |
+
};
|
54 |
+
if ( Array.isArray( data.payment_details ) ) {
|
55 |
+
data.payment_details.forEach( ( { key, value } ) => {
|
56 |
+
responseData.paymentDetails[ key ] = value;
|
57 |
+
} );
|
58 |
+
}
|
59 |
+
return responseData;
|
60 |
+
};
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Reducer for the checkout state
|
64 |
+
*
|
65 |
+
* @param {Object} state Current state.
|
66 |
+
* @param {Object} action Incoming action object.
|
67 |
+
*/
|
68 |
+
export const reducer = (
|
69 |
+
state = DEFAULT_STATE,
|
70 |
+
{ url, type, orderId, orderNotes, data }
|
71 |
+
) => {
|
72 |
+
let newState = state;
|
73 |
+
switch ( type ) {
|
74 |
+
case SET_PRISTINE:
|
75 |
+
newState = DEFAULT_STATE;
|
76 |
+
break;
|
77 |
+
case SET_IDLE:
|
78 |
+
newState =
|
79 |
+
state.status !== IDLE
|
80 |
+
? {
|
81 |
+
...state,
|
82 |
+
status: IDLE,
|
83 |
+
}
|
84 |
+
: state;
|
85 |
+
break;
|
86 |
+
case SET_REDIRECT_URL:
|
87 |
+
newState =
|
88 |
+
url !== state.url
|
89 |
+
? {
|
90 |
+
...state,
|
91 |
+
redirectUrl: url,
|
92 |
+
}
|
93 |
+
: state;
|
94 |
+
break;
|
95 |
+
case SET_PROCESSING_RESPONSE:
|
96 |
+
newState = {
|
97 |
+
...state,
|
98 |
+
processingResponse: data,
|
99 |
+
};
|
100 |
+
break;
|
101 |
+
|
102 |
+
case SET_COMPLETE:
|
103 |
+
newState =
|
104 |
+
state.status !== COMPLETE
|
105 |
+
? {
|
106 |
+
...state,
|
107 |
+
status: COMPLETE,
|
108 |
+
redirectUrl: data?.redirectUrl || state.redirectUrl,
|
109 |
+
}
|
110 |
+
: state;
|
111 |
+
break;
|
112 |
+
case SET_PROCESSING:
|
113 |
+
newState =
|
114 |
+
state.status !== PROCESSING
|
115 |
+
? {
|
116 |
+
...state,
|
117 |
+
status: PROCESSING,
|
118 |
+
hasError: false,
|
119 |
+
}
|
120 |
+
: state;
|
121 |
+
// clear any error state.
|
122 |
+
newState =
|
123 |
+
newState.hasError === false
|
124 |
+
? newState
|
125 |
+
: { ...newState, hasError: false };
|
126 |
+
break;
|
127 |
+
case SET_BEFORE_PROCESSING:
|
128 |
+
newState =
|
129 |
+
state.status !== BEFORE_PROCESSING
|
130 |
+
? {
|
131 |
+
...state,
|
132 |
+
status: BEFORE_PROCESSING,
|
133 |
+
hasError: false,
|
134 |
+
}
|
135 |
+
: state;
|
136 |
+
break;
|
137 |
+
case SET_AFTER_PROCESSING:
|
138 |
+
newState =
|
139 |
+
state.status !== AFTER_PROCESSING
|
140 |
+
? {
|
141 |
+
...state,
|
142 |
+
status: AFTER_PROCESSING,
|
143 |
+
}
|
144 |
+
: state;
|
145 |
+
break;
|
146 |
+
case SET_HAS_ERROR:
|
147 |
+
newState = state.hasError
|
148 |
+
? state
|
149 |
+
: {
|
150 |
+
...state,
|
151 |
+
hasError: true,
|
152 |
+
};
|
153 |
+
newState =
|
154 |
+
state.status === PROCESSING ||
|
155 |
+
state.status === BEFORE_PROCESSING
|
156 |
+
? {
|
157 |
+
...newState,
|
158 |
+
status: IDLE,
|
159 |
+
}
|
160 |
+
: newState;
|
161 |
+
break;
|
162 |
+
case SET_NO_ERROR:
|
163 |
+
newState = state.hasError
|
164 |
+
? {
|
165 |
+
...state,
|
166 |
+
hasError: false,
|
167 |
+
}
|
168 |
+
: state;
|
169 |
+
break;
|
170 |
+
case INCREMENT_CALCULATING:
|
171 |
+
newState = {
|
172 |
+
...state,
|
173 |
+
calculatingCount: state.calculatingCount + 1,
|
174 |
+
};
|
175 |
+
break;
|
176 |
+
case DECREMENT_CALCULATING:
|
177 |
+
newState = {
|
178 |
+
...state,
|
179 |
+
calculatingCount: Math.max( 0, state.calculatingCount - 1 ),
|
180 |
+
};
|
181 |
+
break;
|
182 |
+
case SET_ORDER_ID:
|
183 |
+
newState = {
|
184 |
+
...state,
|
185 |
+
orderId,
|
186 |
+
};
|
187 |
+
break;
|
188 |
+
case SET_ORDER_NOTES:
|
189 |
+
if ( state.orderNotes !== orderNotes ) {
|
190 |
+
newState = {
|
191 |
+
...state,
|
192 |
+
orderNotes,
|
193 |
+
};
|
194 |
+
}
|
195 |
+
break;
|
196 |
+
}
|
197 |
+
// automatically update state to idle from pristine as soon as it
|
198 |
+
// initially changes.
|
199 |
+
if (
|
200 |
+
newState !== state &&
|
201 |
+
type !== SET_PRISTINE &&
|
202 |
+
newState.status === PRISTINE
|
203 |
+
) {
|
204 |
+
newState.status = IDLE;
|
205 |
+
}
|
206 |
+
return newState;
|
207 |
+
};
|
assets/js/base/context/cart-checkout/checkout/index.js
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import { PaymentMethodDataProvider } from '../payment-methods';
|
5 |
+
import { ShippingDataProvider } from '../shipping';
|
6 |
+
import { BillingDataProvider } from '../billing';
|
7 |
+
import { CheckoutStateProvider } from '../checkout-state';
|
8 |
+
import CheckoutProcessor from './processor';
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Checkout provider
|
12 |
+
* This wraps the checkout and provides an api interface for the checkout to
|
13 |
+
* children via various hooks.
|
14 |
+
*
|
15 |
+
* @param {Object} props Incoming props for the provider.
|
16 |
+
* @param {Object} props.children The children being wrapped.
|
17 |
+
* @param {string} [props.redirectUrl] Initialize what the checkout will
|
18 |
+
* redirect to after successful
|
19 |
+
* submit.
|
20 |
+
*/
|
21 |
+
export const CheckoutProvider = ( { children, redirectUrl } ) => {
|
22 |
+
return (
|
23 |
+
<CheckoutStateProvider redirectUrl={ redirectUrl } isCart={ false }>
|
24 |
+
<BillingDataProvider>
|
25 |
+
<ShippingDataProvider>
|
26 |
+
<PaymentMethodDataProvider>
|
27 |
+
{ children }
|
28 |
+
<CheckoutProcessor />
|
29 |
+
</PaymentMethodDataProvider>
|
30 |
+
</ShippingDataProvider>
|
31 |
+
</BillingDataProvider>
|
32 |
+
</CheckoutStateProvider>
|
33 |
+
);
|
34 |
+
};
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js
RENAMED
@@ -3,6 +3,13 @@
|
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import triggerFetch from '@wordpress/api-fetch';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
import {
|
7 |
useEffect,
|
8 |
useRef,
|
@@ -10,22 +17,34 @@ import {
|
|
10 |
useState,
|
11 |
useMemo,
|
12 |
} from '@wordpress/element';
|
13 |
-
import {
|
14 |
-
emptyHiddenAddressFields,
|
15 |
-
formatStoreApiErrorMessage,
|
16 |
-
} from '@woocommerce/base-utils';
|
17 |
|
18 |
/**
|
19 |
-
*
|
20 |
*/
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
|
30 |
/**
|
31 |
* CheckoutProcessor component.
|
@@ -37,22 +56,20 @@ import { useStoreNotices } from '../../../../hooks/use-store-notices';
|
|
37 |
const CheckoutProcessor = () => {
|
38 |
const {
|
39 |
hasError: checkoutHasError,
|
40 |
-
|
41 |
dispatchActions,
|
42 |
redirectUrl,
|
43 |
isProcessing: checkoutIsProcessing,
|
44 |
isBeforeProcessing: checkoutIsBeforeProcessing,
|
45 |
isComplete: checkoutIsComplete,
|
46 |
orderNotes,
|
47 |
-
shouldCreateAccount,
|
48 |
} = useCheckoutContext();
|
49 |
const { hasValidationErrors } = useValidationContext();
|
50 |
-
const { shippingErrorStatus } = useShippingDataContext();
|
51 |
-
const { billingData
|
52 |
const { cartNeedsPayment, receiveCart } = useStoreCart();
|
53 |
const {
|
54 |
activePaymentMethod,
|
55 |
-
isExpressPaymentMethodActive,
|
56 |
currentStatus: currentPaymentStatus,
|
57 |
paymentMethodData,
|
58 |
expressPaymentMethods,
|
@@ -64,6 +81,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 +91,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 +113,7 @@ const CheckoutProcessor = () => {
|
|
93 |
checkoutHasError,
|
94 |
checkoutIsProcessing,
|
95 |
checkoutIsBeforeProcessing,
|
96 |
-
|
97 |
dispatchActions,
|
98 |
] );
|
99 |
|
@@ -144,35 +164,30 @@ 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 |
};
|
177 |
if ( cartNeedsPayment ) {
|
178 |
data = {
|
@@ -196,55 +211,37 @@ const CheckoutProcessor = () => {
|
|
196 |
// Update nonce.
|
197 |
triggerFetch.setNonce( fetchResponse.headers );
|
198 |
|
199 |
-
// Update user using headers.
|
200 |
-
dispatchActions.setCustomerId(
|
201 |
-
fetchResponse.headers.get( 'X-WC-Store-API-User' )
|
202 |
-
);
|
203 |
-
|
204 |
// Handle response.
|
205 |
fetchResponse.json().then( function ( response ) {
|
206 |
if ( ! fetchResponse.ok ) {
|
207 |
// We received an error response.
|
208 |
-
|
209 |
-
|
210 |
-
{
|
211 |
id: 'checkout',
|
212 |
-
}
|
213 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
214 |
dispatchActions.setHasError();
|
215 |
}
|
216 |
dispatchActions.setAfterProcessing( response );
|
217 |
setIsProcessingOrder( false );
|
218 |
} );
|
219 |
} )
|
220 |
-
.catch( (
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
// If new customer ID returned, update the store.
|
225 |
-
if ( errorResponse.headers?.get( 'X-WC-Store-API-User' ) ) {
|
226 |
-
dispatchActions.setCustomerId(
|
227 |
-
errorResponse.headers.get( 'X-WC-Store-API-User' )
|
228 |
-
);
|
229 |
-
}
|
230 |
-
|
231 |
-
errorResponse.json().then( function ( response ) {
|
232 |
-
// If updated cart state was returned, update the store.
|
233 |
if ( response.data?.cart ) {
|
234 |
receiveCart( response.data.cart );
|
235 |
}
|
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 );
|
@@ -261,7 +258,6 @@ const CheckoutProcessor = () => {
|
|
261 |
receiveCart,
|
262 |
dispatchActions,
|
263 |
orderNotes,
|
264 |
-
shouldCreateAccount,
|
265 |
] );
|
266 |
// redirect when checkout is complete and there is a redirect url.
|
267 |
useEffect( () => {
|
3 |
*/
|
4 |
import { __ } from '@wordpress/i18n';
|
5 |
import triggerFetch from '@wordpress/api-fetch';
|
6 |
+
import {
|
7 |
+
useCheckoutContext,
|
8 |
+
useShippingDataContext,
|
9 |
+
useBillingDataContext,
|
10 |
+
usePaymentMethodDataContext,
|
11 |
+
useValidationContext,
|
12 |
+
} from '@woocommerce/base-context';
|
13 |
import {
|
14 |
useEffect,
|
15 |
useRef,
|
17 |
useState,
|
18 |
useMemo,
|
19 |
} from '@wordpress/element';
|
20 |
+
import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
|
|
|
|
|
|
|
21 |
|
22 |
/**
|
23 |
+
* @typedef {import('@woocommerce/type-defs/payments').PaymentDataItem} PaymentDataItem
|
24 |
*/
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Utility function for preparing payment data for the request.
|
28 |
+
*
|
29 |
+
* @param {Object} paymentData Arbitrary payment data provided by the payment method.
|
30 |
+
* @param {boolean} shouldSave Whether to save the payment method info to user account.
|
31 |
+
* @param {Object} activePaymentMethod The current active payment method.
|
32 |
+
*
|
33 |
+
* @return {PaymentDataItem[]} Returns the payment data as an array of
|
34 |
+
* PaymentDataItem objects.
|
35 |
+
*/
|
36 |
+
const preparePaymentData = ( paymentData, shouldSave, activePaymentMethod ) => {
|
37 |
+
const apiData = Object.keys( paymentData ).map( ( property ) => {
|
38 |
+
const value = paymentData[ property ];
|
39 |
+
return { key: property, value };
|
40 |
+
}, [] );
|
41 |
+
const savePaymentMethodKey = `wc-${ activePaymentMethod }-new-payment-method`;
|
42 |
+
apiData.push( {
|
43 |
+
key: savePaymentMethodKey,
|
44 |
+
value: shouldSave,
|
45 |
+
} );
|
46 |
+
return apiData;
|
47 |
+
};
|
48 |
|
49 |
/**
|
50 |
* CheckoutProcessor component.
|
56 |
const CheckoutProcessor = () => {
|
57 |
const {
|
58 |
hasError: checkoutHasError,
|
59 |
+
onCheckoutBeforeProcessing,
|
60 |
dispatchActions,
|
61 |
redirectUrl,
|
62 |
isProcessing: checkoutIsProcessing,
|
63 |
isBeforeProcessing: checkoutIsBeforeProcessing,
|
64 |
isComplete: checkoutIsComplete,
|
65 |
orderNotes,
|
|
|
66 |
} = useCheckoutContext();
|
67 |
const { hasValidationErrors } = useValidationContext();
|
68 |
+
const { shippingAddress, shippingErrorStatus } = useShippingDataContext();
|
69 |
+
const { billingData } = useBillingDataContext();
|
70 |
const { cartNeedsPayment, receiveCart } = useStoreCart();
|
71 |
const {
|
72 |
activePaymentMethod,
|
|
|
73 |
currentStatus: currentPaymentStatus,
|
74 |
paymentMethodData,
|
75 |
expressPaymentMethods,
|
81 |
const currentShippingAddress = useRef( shippingAddress );
|
82 |
const currentRedirectUrl = useRef( redirectUrl );
|
83 |
const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
|
84 |
+
const expressPaymentMethodActive = Object.keys(
|
85 |
+
expressPaymentMethods
|
86 |
+
).includes( activePaymentMethod );
|
87 |
|
88 |
const paymentMethodId = useMemo( () => {
|
89 |
const merged = { ...expressPaymentMethods, ...paymentMethods };
|
91 |
}, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
|
92 |
|
93 |
const checkoutWillHaveError =
|
94 |
+
( hasValidationErrors && ! expressPaymentMethodActive ) ||
|
95 |
currentPaymentStatus.hasError ||
|
96 |
shippingErrorStatus.hasError;
|
97 |
|
98 |
// If express payment method is active, let's suppress notices
|
99 |
useEffect( () => {
|
100 |
+
setIsSuppressed( expressPaymentMethodActive );
|
101 |
+
}, [ expressPaymentMethodActive, setIsSuppressed ] );
|
102 |
|
103 |
useEffect( () => {
|
104 |
if (
|
105 |
checkoutWillHaveError !== checkoutHasError &&
|
106 |
( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
|
107 |
+
! expressPaymentMethodActive
|
108 |
) {
|
109 |
dispatchActions.setHasError( checkoutWillHaveError );
|
110 |
}
|
113 |
checkoutHasError,
|
114 |
checkoutIsProcessing,
|
115 |
checkoutIsBeforeProcessing,
|
116 |
+
expressPaymentMethodActive,
|
117 |
dispatchActions,
|
118 |
] );
|
119 |
|
164 |
|
165 |
useEffect( () => {
|
166 |
let unsubscribeProcessing;
|
167 |
+
if ( ! expressPaymentMethodActive ) {
|
168 |
+
unsubscribeProcessing = onCheckoutBeforeProcessing(
|
169 |
checkValidation,
|
170 |
0
|
171 |
);
|
172 |
}
|
173 |
return () => {
|
174 |
+
if ( ! expressPaymentMethodActive ) {
|
175 |
unsubscribeProcessing();
|
176 |
}
|
177 |
};
|
178 |
}, [
|
179 |
+
onCheckoutBeforeProcessing,
|
180 |
checkValidation,
|
181 |
+
expressPaymentMethodActive,
|
182 |
] );
|
183 |
|
184 |
const processOrder = useCallback( () => {
|
185 |
setIsProcessingOrder( true );
|
186 |
removeNotice( 'checkout' );
|
187 |
let data = {
|
188 |
+
billing_address: currentBillingData.current,
|
189 |
+
shipping_address: currentShippingAddress.current,
|
|
|
|
|
|
|
|
|
190 |
customer_note: orderNotes,
|
|
|
191 |
};
|
192 |
if ( cartNeedsPayment ) {
|
193 |
data = {
|
211 |
// Update nonce.
|
212 |
triggerFetch.setNonce( fetchResponse.headers );
|
213 |
|
|
|
|
|
|
|
|
|
|
|
214 |
// Handle response.
|
215 |
fetchResponse.json().then( function ( response ) {
|
216 |
if ( ! fetchResponse.ok ) {
|
217 |
// We received an error response.
|
218 |
+
if ( response.body && response.body.message ) {
|
219 |
+
addErrorNotice( response.body.message, {
|
|
|
220 |
id: 'checkout',
|
221 |
+
} );
|
222 |
+
} else {
|
223 |
+
addErrorNotice(
|
224 |
+
__(
|
225 |
+
'Something went wrong. Please contact us to get assistance.',
|
226 |
+
'woo-gutenberg-products-block'
|
227 |
+
),
|
228 |
+
{
|
229 |
+
id: 'checkout',
|
230 |
+
}
|
231 |
+
);
|
232 |
+
}
|
233 |
dispatchActions.setHasError();
|
234 |
}
|
235 |
dispatchActions.setAfterProcessing( response );
|
236 |
setIsProcessingOrder( false );
|
237 |
} );
|
238 |
} )
|
239 |
+
.catch( ( error ) => {
|
240 |
+
error.json().then( function ( response ) {
|
241 |
+
// If updated cart state was returned, also update that.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
242 |
if ( response.data?.cart ) {
|
243 |
receiveCart( response.data.cart );
|
244 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
245 |
dispatchActions.setHasError();
|
246 |
dispatchActions.setAfterProcessing( response );
|
247 |
setIsProcessingOrder( false );
|
258 |
receiveCart,
|
259 |
dispatchActions,
|
260 |
orderNotes,
|
|
|
261 |
] );
|
262 |
// redirect when checkout is complete and there is a redirect url.
|
263 |
useEffect( () => {
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js
RENAMED
@@ -1,6 +1,6 @@
|
|
1 |
export * from './payment-methods';
|
2 |
export * from './shipping';
|
3 |
-
export * from './
|
4 |
export * from './checkout';
|
5 |
export * from './cart';
|
6 |
export { useCheckoutContext } from './checkout-state';
|
1 |
export * from './payment-methods';
|
2 |
export * from './shipping';
|
3 |
+
export * from './billing';
|
4 |
export * from './checkout';
|
5 |
export * from './cart';
|
6 |
export { useCheckoutContext } from './checkout-state';
|
assets/js/base/context/cart-checkout/payment-methods/actions.js
ADDED
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Internal dependencies
|
3 |
+
*/
|
4 |
+
import { ACTION_TYPES } from './constants';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* @typedef {import('@woocommerce/type-defs/cart').CartBillingData} CartBillingData
|
8 |
+
*/
|
9 |
+
|
10 |
+
const {
|
11 |
+
ERROR,
|
12 |
+
FAILED,
|
13 |
+
SUCCESS,
|
14 |
+
SET_REGISTERED_PAYMENT_METHODS,
|
15 |
+
SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
|
16 |
+
SET_SHOULD_SAVE_PAYMENT_METHOD,
|
17 |
+
} = ACTION_TYPES;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Used to dispatch a status update only for the given type.
|
21 |
+
*
|
22 |
+
* @param {string} type
|
23 |
+
*
|
24 |
+
* @return {Object} The action object.
|
25 |
+
*/
|
26 |
+
export const statusOnly = ( type ) => ( { type } );
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Used to dispatch an error message along with setting current payment status
|
30 |
+
* to ERROR.
|
31 |
+
*
|
32 |
+
* @param {string} errorMessage Whatever error message accompanying the error
|
33 |
+
* condition.
|
34 |
+
*
|
35 |
+
* @return {Object} The action object.
|
36 |
+
*/
|
37 |
+
export const error = ( errorMessage ) => ( {
|
38 |
+
type: ERROR,
|
39 |
+
errorMessage,
|
40 |
+
} );
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Used to dispatch a payment failed status update.
|
44 |
+
*
|
45 |
+
* @param {Object} action Incoming data for the
|
46 |
+
* action.
|
47 |
+
* @param {string} action.errorMessage Any message accompanying
|
48 |
+
* the failed payment.
|
49 |
+
* @param {Object} action.paymentMethodData Arbitrary extra
|
50 |
+
* information about the
|
51 |
+
* payment method in use
|
52 |
+
* (varies per payment
|
53 |
+
* method).
|
54 |
+
*
|
55 |
+
* @return {Object} An action object.
|
56 |
+
*/
|
57 |
+
export const failed = ( { errorMessage, paymentMethodData } ) => ( {
|
58 |
+
type: FAILED,
|
59 |
+
errorMessage,
|
60 |
+
paymentMethodData,
|
61 |
+
} );
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Used to dispatch a payment success status update.
|
65 |
+
*
|
66 |
+
* @param {Object} action Incoming data for the
|
67 |
+
* action.
|
68 |
+
* @param {Object} action.paymentMethodData Arbitrary extra
|
69 |
+
* information about the
|
70 |
+
* payment method in use
|
71 |
+
* (varies per payment
|
72 |
+
* method).
|
73 |
+
*
|
74 |
+
* @return {Object} An action object.
|
75 |
+
*/
|
76 |
+
export const success = ( { paymentMethodData } ) => ( {
|
77 |
+
type: SUCCESS,
|
78 |
+
paymentMethodData,
|
79 |
+
} );
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Used to dispatch an action for updating a registered payment method in the
|
83 |
+
* state.
|
84 |
+
*
|
85 |
+
* @param {Object} paymentMethods Payment methods to register.
|
86 |
+
* @return {Object} An action object.
|
87 |
+
*/
|
88 |
+
export const setRegisteredPaymentMethods = ( paymentMethods ) => ( {
|
89 |
+
type: SET_REGISTERED_PAYMENT_METHODS,
|
90 |
+
paymentMethods,
|
91 |
+
} );
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Used to dispatch an action for updating a registered express payment
|
95 |
+
* method in the state.
|
96 |
+
*
|
97 |
+
* @param {Object} paymentMethods Payment methods to register.
|
98 |
+
* @return {Object} An action object.
|
99 |
+
*/
|
100 |
+
export const setRegisteredExpressPaymentMethods = ( paymentMethods ) => ( {
|
101 |
+
type: SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
|
102 |
+
paymentMethods,
|
103 |
+
} );
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Set a flag indicating that the payment method info (e.g. a payment card)
|
107 |
+
* should be saved to user account after order completion.
|
108 |
+
*
|
109 |
+
* @param {boolean} shouldSavePaymentMethod
|
110 |
+
* @return {Object} An action object.
|
111 |
+
*/
|
112 |
+
export const setShouldSavePaymentMethod = ( shouldSavePaymentMethod ) => ( {
|
113 |
+
type: SET_SHOULD_SAVE_PAYMENT_METHOD,
|
114 |
+
shouldSavePaymentMethod,
|
115 |
+
} );
|
assets/js/base/context/cart-checkout/payment-methods/constants.js
ADDED
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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: '',
|
40 |
+
paymentMethods: {},
|
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 ) =>
|
56 |
+
void [ paymentMethodData, billingData ],
|
57 |
+
} ),
|
58 |
+
currentStatus: {
|
59 |
+
isPristine: true,
|
60 |
+
isStarted: false,
|
61 |
+
isProcessing: false,
|
62 |
+
isFinished: false,
|
63 |
+
hasError: false,
|
64 |
+
hasFailed: false,
|
65 |
+
isSuccessful: false,
|
66 |
+
},
|
67 |
+
paymentStatuses: STATUS,
|
68 |
+
paymentMethodData: {},
|
69 |
+
errorMessage: '',
|
70 |
+
activePaymentMethod: '',
|
71 |
+
setActivePaymentMethod: () => void null,
|
72 |
+
customerPaymentMethods: {},
|
73 |
+
paymentMethods: {},
|
74 |
+
expressPaymentMethods: {},
|
75 |
+
paymentMethodsInitialized: false,
|
76 |
+
expressPaymentMethodsInitialized: false,
|
77 |
+
onPaymentProcessing: () => void null,
|
78 |
+
onPaymentSuccess: () => void null,
|
79 |
+
onPaymentFail: () => void null,
|
80 |
+
};
|
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,449 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
import { useEditorContext } from '@woocommerce/base-context';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Internal dependencies
|
20 |
+
*/
|
21 |
+
import {
|
22 |
+
STATUS,
|
23 |
+
DEFAULT_PAYMENT_DATA,
|
24 |
+
DEFAULT_PAYMENT_METHOD_DATA,
|
25 |
+
} from './constants';
|
26 |
+
import reducer from './reducer';
|
27 |
+
import {
|
28 |
+
statusOnly,
|
29 |
+
error,
|
30 |
+
failed,
|
31 |
+
success,
|
32 |
+
setRegisteredPaymentMethods,
|
33 |
+
setRegisteredExpressPaymentMethods,
|
34 |
+
setShouldSavePaymentMethod,
|
35 |
+
} from './actions';
|
36 |
+
import {
|
37 |
+
usePaymentMethods,
|
38 |
+
useExpressPaymentMethods,
|
39 |
+
} from './use-payment-method-registration';
|
40 |
+
import { useBillingDataContext } from '../billing';
|
41 |
+
import { useCheckoutContext } from '../checkout-state';
|
42 |
+
import { useShippingDataContext } from '../shipping';
|
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 |
+
if ( paymentMethodKeys.length === 0 ) {
|
92 |
+
return {};
|
93 |
+
}
|
94 |
+
const enabledCustomerPaymentMethods = {};
|
95 |
+
paymentMethodKeys.forEach( ( type ) => {
|
96 |
+
enabledCustomerPaymentMethods[ type ] = customerPaymentMethods[
|
97 |
+
type
|
98 |
+
].filter( ( paymentMethod ) => {
|
99 |
+
return Object.keys( availablePaymentMethods ).includes(
|
100 |
+
paymentMethod.method.gateway
|
101 |
+
);
|
102 |
+
} );
|
103 |
+
} );
|
104 |
+
return enabledCustomerPaymentMethods;
|
105 |
+
};
|
106 |
+
|
107 |
+
/**
|
108 |
+
* PaymentMethodDataProvider is automatically included in the
|
109 |
+
* CheckoutDataProvider.
|
110 |
+
*
|
111 |
+
* This provides the api interface (via the context hook) for payment method
|
112 |
+
* status and data.
|
113 |
+
*
|
114 |
+
* @param {Object} props Incoming props for provider
|
115 |
+
* @param {Object} props.children The wrapped components in this
|
116 |
+
* provider.
|
117 |
+
*/
|
118 |
+
export const PaymentMethodDataProvider = ( { children } ) => {
|
119 |
+
const { setBillingData } = useBillingDataContext();
|
120 |
+
const {
|
121 |
+
isProcessing: checkoutIsProcessing,
|
122 |
+
isIdle: checkoutIsIdle,
|
123 |
+
isCalculating: checkoutIsCalculating,
|
124 |
+
hasError: checkoutHasError,
|
125 |
+
} = useCheckoutContext();
|
126 |
+
const {
|
127 |
+
isSuccessResponse,
|
128 |
+
isErrorResponse,
|
129 |
+
isFailResponse,
|
130 |
+
noticeContexts,
|
131 |
+
} = useEmitResponse();
|
132 |
+
const [ activePaymentMethod, setActive ] = useState( '' );
|
133 |
+
const [ observers, subscriber ] = useReducer( emitReducer, {} );
|
134 |
+
const currentObservers = useRef( observers );
|
135 |
+
|
136 |
+
const { isEditor, previewData } = useEditorContext();
|
137 |
+
const [ paymentData, dispatch ] = useReducer(
|
138 |
+
reducer,
|
139 |
+
DEFAULT_PAYMENT_DATA
|
140 |
+
);
|
141 |
+
const setActivePaymentMethod = useCallback(
|
142 |
+
( paymentMethodSlug ) => {
|
143 |
+
setActive( paymentMethodSlug );
|
144 |
+
dispatch( statusOnly( PRISTINE ) );
|
145 |
+
},
|
146 |
+
[ setActive, dispatch ]
|
147 |
+
);
|
148 |
+
const paymentMethodsDispatcher = useCallback(
|
149 |
+
( paymentMethods ) => {
|
150 |
+
dispatch( setRegisteredPaymentMethods( paymentMethods ) );
|
151 |
+
},
|
152 |
+
[ dispatch ]
|
153 |
+
);
|
154 |
+
const expressPaymentMethodsDispatcher = useCallback(
|
155 |
+
( paymentMethods ) => {
|
156 |
+
dispatch( setRegisteredExpressPaymentMethods( paymentMethods ) );
|
157 |
+
},
|
158 |
+
[ dispatch ]
|
159 |
+
);
|
160 |
+
const paymentMethodsInitialized = usePaymentMethods(
|
161 |
+
paymentMethodsDispatcher
|
162 |
+
);
|
163 |
+
const expressPaymentMethodsInitialized = useExpressPaymentMethods(
|
164 |
+
expressPaymentMethodsDispatcher
|
165 |
+
);
|
166 |
+
const { setValidationErrors } = useValidationContext();
|
167 |
+
const { addErrorNotice, removeNotice } = useStoreNotices();
|
168 |
+
const { setShippingAddress } = useShippingDataContext();
|
169 |
+
const setShouldSavePayment = useCallback(
|
170 |
+
( shouldSave ) => {
|
171 |
+
dispatch( setShouldSavePaymentMethod( shouldSave ) );
|
172 |
+
},
|
173 |
+
[ dispatch ]
|
174 |
+
);
|
175 |
+
|
176 |
+
const customerPaymentMethods = useMemo( () => {
|
177 |
+
if ( isEditor && previewData.previewSavedPaymentMethods ) {
|
178 |
+
return previewData.previewSavedPaymentMethods;
|
179 |
+
}
|
180 |
+
if (
|
181 |
+
! paymentMethodsInitialized ||
|
182 |
+
paymentData.paymentMethods.length === 0
|
183 |
+
) {
|
184 |
+
return {};
|
185 |
+
}
|
186 |
+
return getCustomerPaymentMethods( paymentData.paymentMethods );
|
187 |
+
}, [
|
188 |
+
isEditor,
|
189 |
+
previewData.previewSavedPaymentMethods,
|
190 |
+
paymentMethodsInitialized,
|
191 |
+
paymentData.paymentMethods,
|
192 |
+
] );
|
193 |
+
|
194 |
+
const setExpressPaymentError = useCallback(
|
195 |
+
( message ) => {
|
196 |
+
if ( message ) {
|
197 |
+
addErrorNotice( message, {
|
198 |
+
context: 'wc/express-payment-area',
|
199 |
+
id: 'wc-express-payment-error',
|
200 |
+
} );
|
201 |
+
} else {
|
202 |
+
removeNotice(
|
203 |
+
'wc-express-payment-error',
|
204 |
+
'wc/express-payment-area'
|
205 |
+
);
|
206 |
+
}
|
207 |
+
},
|
208 |
+
[ addErrorNotice, removeNotice ]
|
209 |
+
);
|
210 |
+
// ensure observers are always current.
|
211 |
+
useEffect( () => {
|
212 |
+
currentObservers.current = observers;
|
213 |
+
}, [ observers ] );
|
214 |
+
const onPaymentProcessing = useMemo(
|
215 |
+
() => emitterSubscribers( subscriber ).onPaymentProcessing,
|
216 |
+
[ subscriber ]
|
217 |
+
);
|
218 |
+
|
219 |
+
const currentStatus = useMemo(
|
220 |
+
() => ( {
|
221 |
+
isPristine: paymentData.currentStatus === PRISTINE,
|
222 |
+
isStarted: paymentData.currentStatus === STARTED,
|
223 |
+
isProcessing: paymentData.currentStatus === PROCESSING,
|
224 |
+
isFinished: [ ERROR, FAILED, SUCCESS ].includes(
|
225 |
+
paymentData.currentStatus
|
226 |
+
),
|
227 |
+
hasError: paymentData.currentStatus === ERROR,
|
228 |
+
hasFailed: paymentData.currentStatus === FAILED,
|
229 |
+
isSuccessful: paymentData.currentStatus === SUCCESS,
|
230 |
+
} ),
|
231 |
+
[ paymentData.currentStatus ]
|
232 |
+
);
|
233 |
+
|
234 |
+
/**
|
235 |
+
* @type {PaymentStatusDispatch}
|
236 |
+
*/
|
237 |
+
const setPaymentStatus = useCallback(
|
238 |
+
() => ( {
|
239 |
+
started: () => dispatch( statusOnly( STARTED ) ),
|
240 |
+
processing: () => dispatch( statusOnly( PROCESSING ) ),
|
241 |
+
completed: () => dispatch( statusOnly( COMPLETE ) ),
|
242 |
+
/**
|
243 |
+
* @param {string} errorMessage An error message
|
244 |
+
*/
|
245 |
+
error: ( errorMessage ) => dispatch( error( errorMessage ) ),
|
246 |
+
/**
|
247 |
+
* @param {string} errorMessage An error message
|
248 |
+
* @param {Object} paymentMethodData Arbitrary payment method data to
|
249 |
+
* accompany the checkout submission.
|
250 |
+
* @param {BillingData|null} [billingData] The billing data accompanying the
|
251 |
+
* payment method.
|
252 |
+
*/
|
253 |
+
failed: ( errorMessage, paymentMethodData, billingData = null ) => {
|
254 |
+
if ( billingData ) {
|
255 |
+
setBillingData( billingData );
|
256 |
+
}
|
257 |
+
dispatch(
|
258 |
+
failed( {
|
259 |
+
errorMessage,
|
260 |
+
paymentMethodData,
|
261 |
+
} )
|
262 |
+
);
|
263 |
+
},
|
264 |
+
/**
|
265 |
+
* @param {Object} [paymentMethodData] Arbitrary payment method data to
|
266 |
+
* accompany the checkout.
|
267 |
+
* @param {BillingData|null} [billingData] The billing data accompanying the
|
268 |
+
* payment method.
|
269 |
+
* @param {ShippingDataResponse|null} [shippingData] The shipping data accompanying the
|
270 |
+
* payment method.
|
271 |
+
*/
|
272 |
+
success: (
|
273 |
+
paymentMethodData = {},
|
274 |
+
billingData = null,
|
275 |
+
shippingData = null
|
276 |
+
) => {
|
277 |
+
if ( billingData ) {
|
278 |
+
setBillingData( billingData );
|
279 |
+
}
|
280 |
+
if ( shippingData !== null && shippingData?.address ) {
|
281 |
+
setShippingAddress( shippingData.address );
|
282 |
+
}
|
283 |
+
dispatch(
|
284 |
+
success( {
|
285 |
+
paymentMethodData,
|
286 |
+
} )
|
287 |
+
);
|
288 |
+
},
|
289 |
+
} ),
|
290 |
+
[ dispatch, setBillingData, setShippingAddress ]
|
291 |
+
);
|
292 |
+
|
293 |
+
// flip payment to processing if checkout processing is complete, there are
|
294 |
+
// no errors, and payment status is started.
|
295 |
+
useEffect( () => {
|
296 |
+
if (
|
297 |
+
checkoutIsProcessing &&
|
298 |
+
! checkoutHasError &&
|
299 |
+
! checkoutIsCalculating &&
|
300 |
+
! currentStatus.isFinished
|
301 |
+
) {
|
302 |
+
setPaymentStatus().processing();
|
303 |
+
}
|
304 |
+
}, [
|
305 |
+
checkoutIsProcessing,
|
306 |
+
checkoutHasError,
|
307 |
+
checkoutIsCalculating,
|
308 |
+
currentStatus.isFinished,
|
309 |
+
setPaymentStatus,
|
310 |
+
] );
|
311 |
+
|
312 |
+
// When checkout is returned to idle, set payment status to pristine
|
313 |
+
// but only if payment status is already not finished.
|
314 |
+
useEffect( () => {
|
315 |
+
if ( checkoutIsIdle && ! currentStatus.isSuccessful ) {
|
316 |
+
dispatch( statusOnly( PRISTINE ) );
|
317 |
+
}
|
318 |
+
}, [ checkoutIsIdle, currentStatus.isSuccessful ] );
|
319 |
+
|
320 |
+
// if checkout has an error and payment is not being made with a saved token
|
321 |
+
// and payment status is success, then let's sync payment status back to
|
322 |
+
// pristine.
|
323 |
+
useEffect( () => {
|
324 |
+
if (
|
325 |
+
checkoutHasError &&
|
326 |
+
currentStatus.isSuccessful &&
|
327 |
+
! paymentData.hasSavedToken
|
328 |
+
) {
|
329 |
+
dispatch( statusOnly( PRISTINE ) );
|
330 |
+
}
|
331 |
+
}, [
|
332 |
+
checkoutHasError,
|
333 |
+
currentStatus.isSuccessful,
|
334 |
+
paymentData.hasSavedToken,
|
335 |
+
] );
|
336 |
+
|
337 |
+
// Set active (selected) payment method as needed.
|
338 |
+
useEffect( () => {
|
339 |
+
const paymentMethodKeys = Object.keys( paymentData.paymentMethods );
|
340 |
+
if ( ! paymentMethodsInitialized || ! paymentMethodKeys.length ) {
|
341 |
+
return;
|
342 |
+
}
|
343 |
+
|
344 |
+
setActive( ( currentActivePaymentMethod ) => {
|
345 |
+
// If there's no active payment method, or the active payment method has
|
346 |
+
// been removed (e.g. COD vs shipping methods), set one as active.
|
347 |
+
if (
|
348 |
+
! currentActivePaymentMethod ||
|
349 |
+
! paymentMethodKeys.includes( currentActivePaymentMethod )
|
350 |
+
) {
|
351 |
+
dispatch( statusOnly( PRISTINE ) );
|
352 |
+
return Object.keys( paymentData.paymentMethods )[ 0 ];
|
353 |
+
}
|
354 |
+
return currentActivePaymentMethod;
|
355 |
+
} );
|
356 |
+
}, [ paymentMethodsInitialized, paymentData.paymentMethods, setActive ] );
|
357 |
+
|
358 |
+
// emit events.
|
359 |
+
useEffect( () => {
|
360 |
+
// Note: the nature of this event emitter is that it will bail on any
|
361 |
+
// observer that returns a response that !== true. However, this still
|
362 |
+
// allows for other observers that return true for continuing through
|
363 |
+
// to the next observer (or bailing if there's a problem).
|
364 |
+
if ( currentStatus.isProcessing ) {
|
365 |
+
removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
|
366 |
+
emitEventWithAbort(
|
367 |
+
currentObservers.current,
|
368 |
+
EMIT_TYPES.PAYMENT_PROCESSING,
|
369 |
+
{}
|
370 |
+
).then( ( response ) => {
|
371 |
+
if ( isSuccessResponse( response ) ) {
|
372 |
+
setPaymentStatus().success(
|
373 |
+
response?.meta?.paymentMethodData,
|
374 |
+
response?.meta?.billingData,
|
375 |
+
response?.meta?.shippingData
|
376 |
+
);
|
377 |
+
} else if ( isFailResponse( response ) ) {
|
378 |
+
if ( response.message && response.message.length ) {
|
379 |
+
addErrorNotice( response.message, {
|
380 |
+
id: 'wc-payment-error',
|
381 |
+
isDismissible: false,
|
382 |
+
context:
|
383 |
+
response?.messageContext ||
|
384 |
+
noticeContexts.PAYMENTS,
|
385 |
+
} );
|
386 |
+
}
|
387 |
+
setPaymentStatus().failed(
|
388 |
+
response?.message,
|
389 |
+
response?.meta?.paymentMethodData,
|
390 |
+
response?.meta?.billingData
|
391 |
+
);
|
392 |
+
} else if ( isErrorResponse( response ) ) {
|
393 |
+
if ( response.message && response.message.length ) {
|
394 |
+
addErrorNotice( response.message, {
|
395 |
+
id: 'wc-payment-error',
|
396 |
+
isDismissible: false,
|
397 |
+
context:
|
398 |
+
response?.messageContext ||
|
399 |
+
noticeContexts.PAYMENTS,
|
400 |
+
} );
|
401 |
+
}
|
402 |
+
setPaymentStatus().error( response.message );
|
403 |
+
setValidationErrors( response?.validationErrors );
|
404 |
+
} else {
|
405 |
+
// otherwise there are no payment methods doing anything so
|
406 |
+
// just consider success
|
407 |
+
setPaymentStatus().success();
|
408 |
+
}
|
409 |
+
} );
|
410 |
+
}
|
411 |
+
}, [
|
412 |
+
currentStatus.isProcessing,
|
413 |
+
setValidationErrors,
|
414 |
+
setPaymentStatus,
|
415 |
+
removeNotice,
|
416 |
+
noticeContexts.PAYMENTS,
|
417 |
+
isSuccessResponse,
|
418 |
+
isFailResponse,
|
419 |
+
isErrorResponse,
|
420 |
+
addErrorNotice,
|
421 |
+
] );
|
422 |
+
|
423 |
+
/**
|
424 |
+
* @type {PaymentMethodDataContext}
|
425 |
+
*/
|
426 |
+
const paymentContextData = {
|
427 |
+
setPaymentStatus,
|
428 |
+
currentStatus,
|
429 |
+
paymentStatuses: STATUS,
|
430 |
+
paymentMethodData: paymentData.paymentMethodData,
|
431 |
+
errorMessage: paymentData.errorMessage,
|
432 |
+
activePaymentMethod,
|
433 |
+
setActivePaymentMethod,
|
434 |
+
onPaymentProcessing,
|
435 |
+
customerPaymentMethods,
|
436 |
+
paymentMethods: paymentData.paymentMethods,
|
437 |
+
expressPaymentMethods: paymentData.expressPaymentMethods,
|
438 |
+
paymentMethodsInitialized,
|
439 |
+
expressPaymentMethodsInitialized,
|
440 |
+
setExpressPaymentError,
|
441 |
+
shouldSavePayment: paymentData.shouldSavePaymentMethod,
|
442 |
+
setShouldSavePayment,
|
443 |
+
};
|
444 |
+
return (
|
445 |
+
<PaymentMethodDataContext.Provider value={ paymentContextData }>
|
446 |
+
{ children }
|
447 |
+
</PaymentMethodDataContext.Provider>
|
448 |
+
);
|
449 |
+
};
|
assets/js/base/context/cart-checkout/payment-methods/reducer.js
ADDED
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
*/
|
30 |
+
const reducer = (
|
31 |
+
state = DEFAULT_PAYMENT_DATA,
|
32 |
+
{
|
33 |
+
type,
|
34 |
+
paymentMethodData,
|
35 |
+
shouldSavePaymentMethod,
|
36 |
+
errorMessage,
|
37 |
+
paymentMethods,
|
38 |
+
}
|
39 |
+
) => {
|
40 |
+
switch ( type ) {
|
41 |
+
case STARTED:
|
42 |
+
return state.currentStatus !== STARTED
|
43 |
+
? {
|
44 |
+
...state,
|
45 |
+
currentStatus: STARTED,
|
46 |
+
}
|
47 |
+
: state;
|
48 |
+
case ERROR:
|
49 |
+
return state.currentStatus !== ERROR
|
50 |
+
? {
|
51 |
+
...state,
|
52 |
+
currentStatus: ERROR,
|
53 |
+
errorMessage: errorMessage || state.errorMessage,
|
54 |
+
}
|
55 |
+
: state;
|
56 |
+
case FAILED:
|
57 |
+
return state.currentStatus !== FAILED
|
58 |
+
? {
|
59 |
+
...state,
|
60 |
+
currentStatus: FAILED,
|
61 |
+
paymentMethodData:
|
62 |
+
paymentMethodData || state.paymentMethodData,
|
63 |
+
errorMessage: errorMessage || state.errorMessage,
|
64 |
+
}
|
65 |
+
: state;
|
66 |
+
case SUCCESS:
|
67 |
+
return state.currentStatus !== SUCCESS
|
68 |
+
? {
|
69 |
+
...state,
|
70 |
+
currentStatus: SUCCESS,
|
71 |
+
paymentMethodData:
|
72 |
+
paymentMethodData || state.paymentMethodData,
|
73 |
+
hasSavedToken: hasSavedPaymentToken(
|
74 |
+
paymentMethodData
|
75 |
+
),
|
76 |
+
}
|
77 |
+
: state;
|
78 |
+
case PROCESSING:
|
79 |
+
return state.currentStatus !== PROCESSING
|
80 |
+
? {
|
81 |
+
...state,
|
82 |
+
currentStatus: PROCESSING,
|
83 |
+
errorMessage: '',
|
84 |
+
}
|
85 |
+
: state;
|
86 |
+
case COMPLETE:
|
87 |
+
return state.currentStatus !== COMPLETE
|
88 |
+
? {
|
89 |
+
...state,
|
90 |
+
currentStatus: COMPLETE,
|
91 |
+
}
|
92 |
+
: state;
|
93 |
+
|
94 |
+
case PRISTINE:
|
95 |
+
return {
|
96 |
+
...DEFAULT_PAYMENT_DATA,
|
97 |
+
currentStatus: PRISTINE,
|
98 |
+
// keep payment method registration state
|
99 |
+
paymentMethods: {
|
100 |
+
...state.paymentMethods,
|
101 |
+
},
|
102 |
+
expressPaymentMethods: {
|
103 |
+
...state.expressPaymentMethods,
|
104 |
+
},
|
105 |
+
shouldSavePaymentMethod: state.shouldSavePaymentMethod,
|
106 |
+
};
|
107 |
+
case SET_REGISTERED_PAYMENT_METHODS:
|
108 |
+
return {
|
109 |
+
...state,
|
110 |
+
paymentMethods,
|
111 |
+
};
|
112 |
+
case SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
|
113 |
+
return {
|
114 |
+
...state,
|
115 |
+
expressPaymentMethods: {
|
116 |
+
...state.expressPaymentMethods,
|
117 |
+
...paymentMethods,
|
118 |
+
},
|
119 |
+
};
|
120 |
+
case SET_SHOULD_SAVE_PAYMENT_METHOD:
|
121 |
+
return {
|
122 |
+
...state,
|
123 |
+
shouldSavePaymentMethod,
|
124 |
+
};
|
125 |
+
}
|
126 |
+
return state;
|
127 |
+
};
|
128 |
+
|
129 |
+
export default reducer;
|
assets/js/base/context/cart-checkout/payment-methods/use-payment-method-registration.js
ADDED
@@ -0,0 +1,189 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { __, sprintf } from '@wordpress/i18n';
|
5 |
+
import {
|
6 |
+
getPaymentMethods,
|
7 |
+
getExpressPaymentMethods,
|
8 |
+
} from '@woocommerce/blocks-registry';
|
9 |
+
import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
|
10 |
+
import {
|
11 |
+
useEditorContext,
|
12 |
+
useShippingDataContext,
|
13 |
+
} from '@woocommerce/base-context';
|
14 |
+
import { useStoreCart, useShallowEqual } from '@woocommerce/base-hooks';
|
15 |
+
import {
|
16 |
+
CURRENT_USER_IS_ADMIN,
|
17 |
+
PAYMENT_GATEWAY_SORT_ORDER,
|
18 |
+
} from '@woocommerce/block-settings';
|
19 |
+
|
20 |
+
/**
|
21 |
+
* If there was an error registering a payment method, alert the admin.
|
22 |
+
*
|
23 |
+
* @param {Object} error Error object.
|
24 |
+
*/
|
25 |
+
const handleRegistrationError = ( error ) => {
|
26 |
+
if ( CURRENT_USER_IS_ADMIN ) {
|
27 |
+
throw new Error(
|
28 |
+
sprintf(
|
29 |
+
__(
|
30 |
+
// translators: %s is the error method returned by the payment method.
|
31 |
+
'Problem with payment method initialization: %s',
|
32 |
+
'woo-gutenberg-products-block'
|
33 |
+
),
|
34 |
+
error.message
|
35 |
+
)
|
36 |
+
);
|
37 |
+
}
|
38 |
+
};
|
39 |
+
|
40 |
+
/**
|
41 |
+
* This hook handles initializing registered payment methods and exposing all
|
42 |
+
* registered payment methods that can be used in the current environment (via
|
43 |
+
* the payment method's `canMakePayment` property).
|
44 |
+
*
|
45 |
+
* @param {function(Object):undefined} dispatcher A dispatcher for setting registered
|
46 |
+
* payment methods to an external
|
47 |
+
* state.
|
48 |
+
* @param {Object} registeredPaymentMethods Registered payment methods to
|
49 |
+
* process.
|
50 |
+
* @param {Array} paymentMethodsSortOrder Array of payment method names to
|
51 |
+
* sort by. This should match keys of
|
52 |
+
* registeredPaymentMethods.
|
53 |
+
*
|
54 |
+
* @return {boolean} Whether the payment methods have been initialized or not. True when all payment
|
55 |
+
* methods have been initialized.
|
56 |
+
*/
|
57 |
+
const usePaymentMethodRegistration = (
|
58 |
+
dispatcher,
|
59 |
+
registeredPaymentMethods,
|
60 |
+
paymentMethodsSortOrder
|
61 |
+
) => {
|
62 |
+
const [ isInitialized, setIsInitialized ] = useState( false );
|
63 |
+
const { isEditor } = useEditorContext();
|
64 |
+
const { selectedRates, shippingAddress } = useShippingDataContext();
|
65 |
+
const selectedShippingMethods = useShallowEqual( selectedRates );
|
66 |
+
const paymentMethodsOrder = useShallowEqual( paymentMethodsSortOrder );
|
67 |
+
const { cartTotals, cartNeedsShipping } = useStoreCart();
|
68 |
+
const canPayArgument = useRef( {
|
69 |
+
cartTotals,
|
70 |
+
cartNeedsShipping,
|
71 |
+
shippingAddress,
|
72 |
+
selectedShippingMethods,
|
73 |
+
} );
|
74 |
+
|
75 |
+
useEffect( () => {
|
76 |
+
canPayArgument.current = {
|
77 |
+
cartTotals,
|
78 |
+
cartNeedsShipping,
|
79 |
+
shippingAddress,
|
80 |
+
selectedShippingMethods,
|
81 |
+
};
|
82 |
+
}, [
|
83 |
+
cartTotals,
|
84 |
+
cartNeedsShipping,
|
85 |
+
shippingAddress,
|
86 |
+
selectedShippingMethods,
|
87 |
+
] );
|
88 |
+
|
89 |
+
const refreshCanMakePayments = useCallback( async () => {
|
90 |
+
let availablePaymentMethods = {};
|
91 |
+
const addAvailablePaymentMethod = ( paymentMethod ) => {
|
92 |
+
availablePaymentMethods = {
|
93 |
+
...availablePaymentMethods,
|
94 |
+
[ paymentMethod.name ]: paymentMethod,
|
95 |
+
};
|
96 |
+
};
|
97 |
+
|
98 |
+
for ( let i = 0; i < paymentMethodsOrder.length; i++ ) {
|
99 |
+
const paymentMethodName = paymentMethodsOrder[ i ];
|
100 |
+
const paymentMethod = registeredPaymentMethods[ paymentMethodName ];
|
101 |
+
if ( ! paymentMethod ) {
|
102 |
+
continue;
|
103 |
+
}
|
104 |
+
|
105 |
+
// In editor, shortcut so all payment methods show as available.
|
106 |
+
if ( isEditor ) {
|
107 |
+
addAvailablePaymentMethod( paymentMethod );
|
108 |
+
continue;
|
109 |
+
}
|
110 |
+
|
111 |
+
// In front end, ask payment method if it should be available.
|
112 |
+
try {
|
113 |
+
const canPay = await Promise.resolve(
|
114 |
+
paymentMethod.canMakePayment( canPayArgument.current )
|
115 |
+
);
|
116 |
+
if ( canPay ) {
|
117 |
+
if ( canPay.error ) {
|
118 |
+
throw new Error( canPay.error.message );
|
119 |
+
}
|
120 |
+
addAvailablePaymentMethod( paymentMethod );
|
121 |
+
}
|
122 |
+
} catch ( e ) {
|
123 |
+
// If user is admin, show payment `canMakePayment` errors as a notice.
|
124 |
+
handleRegistrationError( e );
|
125 |
+
}
|
126 |
+
}
|
127 |
+
|
128 |
+
// Re-dispatch available payment methods to store.
|
129 |
+
dispatcher( availablePaymentMethods );
|
130 |
+
|
131 |
+
// Note: some payment methods use the `canMakePayment` callback to initialize / setup.
|
132 |
+
// Example: Stripe CC, Stripe Payment Request.
|
133 |
+
// That's why we track "is initialised" state here.
|
134 |
+
setIsInitialized( true );
|
135 |
+
}, [
|
136 |
+
dispatcher,
|
137 |
+
isEditor,
|
138 |
+
registeredPaymentMethods,
|
139 |
+
paymentMethodsOrder,
|
140 |
+
] );
|
141 |
+
|
142 |
+
// Determine which payment methods are available initially and whenever
|
143 |
+
// shipping methods change.
|
144 |
+
// Some payment methods (e.g. COD) can be disabled for specific shipping methods.
|
145 |
+
useEffect( () => {
|
146 |
+
refreshCanMakePayments();
|
147 |
+
}, [ refreshCanMakePayments, selectedShippingMethods ] );
|
148 |
+
|
149 |
+
return isInitialized;
|
150 |
+
};
|
151 |
+
|
152 |
+
/**
|
153 |
+
* Custom hook for setting up payment methods (standard, non-express).
|
154 |
+
*
|
155 |
+
* @param {function(Object):undefined} dispatcher
|
156 |
+
*
|
157 |
+
* @return {boolean} True when standard payment methods have been initialized.
|
158 |
+
*/
|
159 |
+
export const usePaymentMethods = ( dispatcher ) => {
|
160 |
+
const standardMethods = getPaymentMethods();
|
161 |
+
// Ensure all methods are present in order.
|
162 |
+
// Some payment methods may not be present in PAYMENT_GATEWAY_SORT_ORDER if they
|
163 |
+
// depend on state, e.g. COD can depend on shipping method.
|
164 |
+
const displayOrder = new Set( [
|
165 |
+
...PAYMENT_GATEWAY_SORT_ORDER,
|
166 |
+
...Object.keys( standardMethods ),
|
167 |
+
] );
|
168 |
+
return usePaymentMethodRegistration(
|
169 |
+
dispatcher,
|
170 |
+
standardMethods,
|
171 |
+
Array.from( displayOrder )
|
172 |
+
);
|
173 |
+
};
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Custom hook for setting up express payment methods.
|
177 |
+
*
|
178 |
+
* @param {function(Object):undefined} dispatcher
|
179 |
+
*
|
180 |
+
* @return {boolean} True when express payment methods have been initialized.
|
181 |
+
*/
|
182 |
+
export const useExpressPaymentMethods = ( dispatcher ) => {
|
183 |
+
const expressMethods = getExpressPaymentMethods();
|
184 |
+
return usePaymentMethodRegistration(
|
185 |
+
dispatcher,
|
186 |
+
expressMethods,
|
187 |
+
Object.keys( expressMethods )
|
188 |
+
);
|
189 |
+
};
|
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/constants.js
RENAMED
@@ -1,6 +1,6 @@
|
|
1 |
/**
|
2 |
* @typedef {import('@woocommerce/type-defs/contexts').ShippingErrorTypes} ShippingErrorTypes
|
3 |
-
* @typedef {import('@woocommerce/type-defs/
|
4 |
* @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
|
5 |
*/
|
6 |
|
@@ -20,7 +20,7 @@ export const shippingErrorCodes = {
|
|
20 |
};
|
21 |
|
22 |
/**
|
23 |
-
* @type {
|
24 |
*/
|
25 |
export const DEFAULT_SHIPPING_ADDRESS = {
|
26 |
first_name: '',
|
@@ -47,6 +47,7 @@ export const DEFAULT_SHIPPING_CONTEXT_DATA = {
|
|
47 |
dispatchErrorStatus: () => null,
|
48 |
shippingErrorTypes: ERROR_TYPES,
|
49 |
shippingRates: [],
|
|
|
50 |
shippingRatesLoading: false,
|
51 |
selectedRates: [],
|
52 |
setSelectedRates: () => null,
|
1 |
/**
|
2 |
* @typedef {import('@woocommerce/type-defs/contexts').ShippingErrorTypes} ShippingErrorTypes
|
3 |
+
* @typedef {import('@woocommerce/type-defs/cart').CartShippingAddress} CartShippingAddress
|
4 |
* @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
|
5 |
*/
|
6 |
|
20 |
};
|
21 |
|
22 |
/**
|
23 |
+
* @type {CartShippingAddress}
|
24 |
*/
|
25 |
export const DEFAULT_SHIPPING_ADDRESS = {
|
26 |
first_name: '',
|
47 |
dispatchErrorStatus: () => null,
|
48 |
shippingErrorTypes: ERROR_TYPES,
|
49 |
shippingRates: [],
|
50 |
+
setShippingRates: () => null,
|
51 |
shippingRatesLoading: false,
|
52 |
selectedRates: [],
|
53 |
setSelectedRates: () => null,
|
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,75 +9,105 @@ import {
|
|
9 |
useMemo,
|
10 |
useRef,
|
11 |
} from '@wordpress/element';
|
12 |
-
import
|
13 |
-
|
|
|
|
|
|
|
|
|
14 |
|
15 |
/**
|
16 |
* Internal dependencies
|
17 |
*/
|
18 |
-
import {
|
19 |
-
|
20 |
-
|
|
|
|
|
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
|
34 |
-
* @typedef {import('react')} React
|
35 |
*/
|
36 |
|
37 |
const { NONE, INVALID_ADDRESS, UNKNOWN } = ERROR_TYPES;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
const ShippingDataContext = createContext( DEFAULT_SHIPPING_CONTEXT_DATA );
|
39 |
|
40 |
/**
|
41 |
-
* @return {ShippingDataContext} Returns data and functions related to
|
|
|
42 |
*/
|
43 |
export const useShippingDataContext = () => {
|
44 |
return useContext( ShippingDataContext );
|
45 |
};
|
46 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
/**
|
48 |
-
* The shipping data provider exposes the interface for shipping in the
|
|
|
49 |
*
|
50 |
* @param {Object} props Incoming props for provider
|
51 |
-
* @param {React.ReactElement} props.children
|
52 |
*/
|
53 |
export const ShippingDataProvider = ( { children } ) => {
|
54 |
const { dispatchActions } = useCheckoutContext();
|
55 |
-
const { shippingAddress, setShippingAddress } = useCustomerDataContext();
|
56 |
const {
|
57 |
cartNeedsShipping: needsShipping,
|
58 |
-
cartHasCalculatedShipping: hasCalculatedShipping,
|
59 |
shippingRates,
|
60 |
shippingRatesLoading,
|
61 |
cartErrors,
|
62 |
} = useStoreCart();
|
63 |
-
const { selectShippingRate, isSelectingRate } = useSelectShippingRates();
|
64 |
const [ shippingErrorStatus, dispatchErrorStatus ] = useReducer(
|
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.
|
@@ -85,19 +115,6 @@ export const ShippingDataProvider = ( { children } ) => {
|
|
85 |
currentObservers.current = observers;
|
86 |
}, [ observers ] );
|
87 |
|
88 |
-
// set selected rates on ref so it's always current.
|
89 |
-
const selectedRates = useRef( () =>
|
90 |
-
deriveSelectedShippingRates( shippingRates )
|
91 |
-
);
|
92 |
-
useEffect( () => {
|
93 |
-
const derivedSelectedRates = deriveSelectedShippingRates(
|
94 |
-
shippingRates
|
95 |
-
);
|
96 |
-
if ( ! isShallowEqual( selectedRates.current, derivedSelectedRates ) ) {
|
97 |
-
selectedRates.current = derivedSelectedRates;
|
98 |
-
}
|
99 |
-
}, [ shippingRates ] );
|
100 |
-
|
101 |
// increment/decrement checkout calculating counts when shipping is loading.
|
102 |
useEffect( () => {
|
103 |
if ( shippingRatesLoading ) {
|
@@ -107,7 +124,8 @@ export const ShippingDataProvider = ( { children } ) => {
|
|
107 |
}
|
108 |
}, [ shippingRatesLoading, dispatchActions ] );
|
109 |
|
110 |
-
// increment/decrement checkout calculating counts when shipping rates are
|
|
|
111 |
useEffect( () => {
|
112 |
if ( isSelectingRate ) {
|
113 |
dispatchActions.incrementCalculating();
|
@@ -178,10 +196,7 @@ export const ShippingDataProvider = ( { children } ) => {
|
|
178 |
|
179 |
// emit shipping rate selection events.
|
180 |
useEffect( () => {
|
181 |
-
if ( isSelectingRate ) {
|
182 |
-
return;
|
183 |
-
}
|
184 |
-
if ( currentErrorStatus.hasError ) {
|
185 |
emitEvent(
|
186 |
currentObservers.current,
|
187 |
EMIT_TYPES.SHIPPING_RATE_SELECT_FAIL,
|
@@ -190,19 +205,28 @@ export const ShippingDataProvider = ( { children } ) => {
|
|
190 |
hasInvalidAddress: currentErrorStatus.hasInvalidAddress,
|
191 |
}
|
192 |
);
|
193 |
-
} else {
|
194 |
-
emitEvent(
|
195 |
-
currentObservers.current,
|
196 |
-
EMIT_TYPES.SHIPPING_RATE_SELECT_SUCCESS,
|
197 |
-
selectedRates.current
|
198 |
-
);
|
199 |
}
|
200 |
}, [
|
|
|
201 |
isSelectingRate,
|
202 |
currentErrorStatus.hasError,
|
203 |
currentErrorStatus.hasInvalidAddress,
|
204 |
] );
|
205 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
/**
|
207 |
* @type {ShippingDataContext}
|
208 |
*/
|
@@ -211,17 +235,20 @@ export const ShippingDataProvider = ( { children } ) => {
|
|
211 |
dispatchErrorStatus,
|
212 |
shippingErrorTypes: ERROR_TYPES,
|
213 |
shippingRates,
|
|
|
214 |
shippingRatesLoading,
|
215 |
-
selectedRates
|
216 |
-
setSelectedRates
|
217 |
isSelectingRate,
|
218 |
shippingAddress,
|
219 |
setShippingAddress,
|
|
|
|
|
|
|
|
|
|
|
220 |
needsShipping,
|
221 |
-
hasCalculatedShipping,
|
222 |
-
...eventObservers,
|
223 |
};
|
224 |
-
|
225 |
return (
|
226 |
<>
|
227 |
<ShippingDataContext.Provider value={ ShippingData }>
|
9 |
useMemo,
|
10 |
useRef,
|
11 |
} from '@wordpress/element';
|
12 |
+
import {
|
13 |
+
useShippingAddress,
|
14 |
+
useStoreCart,
|
15 |
+
useSelectShippingRate,
|
16 |
+
} from '@woocommerce/base-hooks';
|
17 |
+
import { useCheckoutContext } from '@woocommerce/base-context';
|
18 |
|
19 |
/**
|
20 |
* Internal dependencies
|
21 |
*/
|
22 |
+
import {
|
23 |
+
ERROR_TYPES,
|
24 |
+
DEFAULT_SHIPPING_CONTEXT_DATA,
|
25 |
+
shippingErrorCodes,
|
26 |
+
} from './constants';
|
27 |
import {
|
28 |
EMIT_TYPES,
|
29 |
+
emitterSubscribers,
|
30 |
reducer as emitReducer,
|
31 |
emitEvent,
|
32 |
} from './event-emit';
|
|
|
|
|
|
|
|
|
33 |
|
34 |
/**
|
35 |
* @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
|
|
|
36 |
*/
|
37 |
|
38 |
const { NONE, INVALID_ADDRESS, UNKNOWN } = ERROR_TYPES;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Reducer for shipping status state
|
42 |
+
*
|
43 |
+
* @param {string} state The current status.
|
44 |
+
* @param {Object} action The incoming action.
|
45 |
+
*/
|
46 |
+
const errorStatusReducer = ( state, { type } ) => {
|
47 |
+
if ( Object.values( ERROR_TYPES ).includes( type ) ) {
|
48 |
+
return type;
|
49 |
+
}
|
50 |
+
return state;
|
51 |
+
};
|
52 |
+
|
53 |
const ShippingDataContext = createContext( DEFAULT_SHIPPING_CONTEXT_DATA );
|
54 |
|
55 |
/**
|
56 |
+
* @return {ShippingDataContext} Returns data and functions related to
|
57 |
+
* shipping methods.
|
58 |
*/
|
59 |
export const useShippingDataContext = () => {
|
60 |
return useContext( ShippingDataContext );
|
61 |
};
|
62 |
|
63 |
+
const hasInvalidShippingAddress = ( errors ) => {
|
64 |
+
return errors.some( ( error ) => {
|
65 |
+
if (
|
66 |
+
error.code &&
|
67 |
+
Object.values( shippingErrorCodes ).includes( error.code )
|
68 |
+
) {
|
69 |
+
return true;
|
70 |
+
}
|
71 |
+
return false;
|
72 |
+
} );
|
73 |
+
};
|
74 |
+
|
75 |
/**
|
76 |
+
* The shipping data provider exposes the interface for shipping in the
|
77 |
+
* checkout/cart.
|
78 |
*
|
79 |
* @param {Object} props Incoming props for provider
|
|
|
80 |
*/
|
81 |
export const ShippingDataProvider = ( { children } ) => {
|
82 |
const { dispatchActions } = useCheckoutContext();
|
|
|
83 |
const {
|
84 |
cartNeedsShipping: needsShipping,
|
|
|
85 |
shippingRates,
|
86 |
shippingRatesLoading,
|
87 |
cartErrors,
|
88 |
} = useStoreCart();
|
|
|
89 |
const [ shippingErrorStatus, dispatchErrorStatus ] = useReducer(
|
90 |
errorStatusReducer,
|
91 |
NONE
|
92 |
);
|
93 |
+
const [ observers, subscriber ] = useReducer( emitReducer, {} );
|
94 |
+
const { shippingAddress, setShippingAddress } = useShippingAddress();
|
95 |
const currentObservers = useRef( observers );
|
96 |
+
const {
|
97 |
+
selectShippingRate: setSelectedRates,
|
98 |
+
selectedShippingRates: selectedRates,
|
99 |
+
isSelectingRate,
|
100 |
+
} = useSelectShippingRate( shippingRates );
|
101 |
+
const eventSubscribers = useMemo(
|
102 |
() => ( {
|
103 |
+
onShippingRateSuccess: emitterSubscribers( subscriber ).onSuccess,
|
104 |
+
onShippingRateFail: emitterSubscribers( subscriber ).onFail,
|
105 |
+
onShippingRateSelectSuccess: emitterSubscribers( subscriber )
|
|
|
106 |
.onSelectSuccess,
|
107 |
+
onShippingRateSelectFail: emitterSubscribers( subscriber )
|
108 |
.onSelectFail,
|
109 |
} ),
|
110 |
+
[ subscriber ]
|
111 |
);
|
112 |
|
113 |
// set observers on ref so it's always current.
|
115 |
currentObservers.current = observers;
|
116 |
}, [ observers ] );
|
117 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
118 |
// increment/decrement checkout calculating counts when shipping is loading.
|
119 |
useEffect( () => {
|
120 |
if ( shippingRatesLoading ) {
|
124 |
}
|
125 |
}, [ shippingRatesLoading, dispatchActions ] );
|
126 |
|
127 |
+
// increment/decrement checkout calculating counts when shipping rates are
|
128 |
+
// being selected.
|
129 |
useEffect( () => {
|
130 |
if ( isSelectingRate ) {
|
131 |
dispatchActions.incrementCalculating();
|
196 |
|
197 |
// emit shipping rate selection events.
|
198 |
useEffect( () => {
|
199 |
+
if ( ! isSelectingRate && currentErrorStatus.hasError ) {
|
|
|
|
|
|
|
200 |
emitEvent(
|
201 |
currentObservers.current,
|
202 |
EMIT_TYPES.SHIPPING_RATE_SELECT_FAIL,
|
205 |
hasInvalidAddress: currentErrorStatus.hasInvalidAddress,
|
206 |
}
|
207 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
208 |
}
|
209 |
}, [
|
210 |
+
selectedRates,
|
211 |
isSelectingRate,
|
212 |
currentErrorStatus.hasError,
|
213 |
currentErrorStatus.hasInvalidAddress,
|
214 |
] );
|
215 |
|
216 |
+
useEffect( () => {
|
217 |
+
if (
|
218 |
+
! isSelectingRate &&
|
219 |
+
selectedRates &&
|
220 |
+
! currentErrorStatus.hasError
|
221 |
+
) {
|
222 |
+
emitEvent(
|
223 |
+
currentObservers.current,
|
224 |
+
EMIT_TYPES.SHIPPING_RATE_SELECT_SUCCESS,
|
225 |
+
selectedRates
|
226 |
+
);
|
227 |
+
}
|
228 |
+
}, [ selectedRates, isSelectingRate, currentErrorStatus.hasError ] );
|
229 |
+
|
230 |
/**
|
231 |
* @type {ShippingDataContext}
|
232 |
*/
|
235 |
dispatchErrorStatus,
|
236 |
shippingErrorTypes: ERROR_TYPES,
|
237 |
shippingRates,
|
238 |
+
setShippingRates: setSelectedRates,
|
239 |
shippingRatesLoading,
|
240 |
+
selectedRates,
|
241 |
+
setSelectedRates,
|
242 |
isSelectingRate,
|
243 |
shippingAddress,
|
244 |
setShippingAddress,
|
245 |
+
onShippingRateSuccess: eventSubscribers.onShippingRateSuccess,
|
246 |
+
onShippingRateFail: eventSubscribers.onShippingRateFail,
|
247 |
+
onShippingRateSelectSuccess:
|
248 |
+
eventSubscribers.onShippingRateSelectSuccess,
|
249 |
+
onShippingRateSelectFail: eventSubscribers.onShippingRateSelectFail,
|
250 |
needsShipping,
|
|
|
|
|
251 |
};
|
|
|
252 |
return (
|
253 |
<>
|
254 |
<ShippingDataContext.Provider value={ ShippingData }>
|
assets/js/base/context/{providers/container-width-context.js → container-width-context.js}
RENAMED
@@ -8,7 +8,6 @@ import classNames from 'classnames';
|
|
8 |
|
9 |
/**
|
10 |
* @typedef {import('@woocommerce/type-defs/contexts').ContainerWidthContext} ContainerWidthContext
|
11 |
-
* @typedef {import('react')} React
|
12 |
*/
|
13 |
|
14 |
const ContainerWidthContext = createContext( {
|
@@ -30,10 +29,6 @@ export const useContainerWidthContext = () => {
|
|
30 |
/**
|
31 |
* Provides an interface to useContainerQueries so children can see what size is being used by the
|
32 |
* container.
|
33 |
-
*
|
34 |
-
* @param {Object} props Incoming props for the component.
|
35 |
-
* @param {React.ReactChildren} props.children React elements wrapped by the component.
|
36 |
-
* @param {string} props.className CSS class in use.
|
37 |
*/
|
38 |
export const ContainerWidthContextProvider = ( {
|
39 |
children,
|
8 |
|
9 |
/**
|
10 |
* @typedef {import('@woocommerce/type-defs/contexts').ContainerWidthContext} ContainerWidthContext
|
|
|
11 |
*/
|
12 |
|
13 |
const ContainerWidthContext = createContext( {
|
29 |
/**
|
30 |
* Provides an interface to useContainerQueries so children can see what size is being used by the
|
31 |
* container.
|
|
|
|
|
|
|
|
|
32 |
*/
|
33 |
export const ContainerWidthContextProvider = ( {
|
34 |
children,
|
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/cart/use-store-cart.ts
DELETED
@@ -1,223 +0,0 @@
|
|
1 |
-
/** @typedef { import('@woocommerce/type-defs/hooks').StoreCart } StoreCart */
|
2 |
-
|
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 type {
|
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: '',
|
38 |
-
address_1: '',
|
39 |
-
address_2: '',
|
40 |
-
city: '',
|
41 |
-
state: '',
|
42 |
-
postcode: '',
|
43 |
-
country: '',
|
44 |
-
};
|
45 |
-
|
46 |
-
const defaultBillingAddress: CartResponseBillingAddress = {
|
47 |
-
...defaultShippingAddress,
|
48 |
-
email: '',
|
49 |
-
phone: '',
|
50 |
-
};
|
51 |
-
|
52 |
-
const defaultCartTotals: CartResponseTotals = {
|
53 |
-
total_items: '',
|
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: StoreCart = {
|
88 |
-
cartCoupons: [],
|
89 |
-
cartItems: [],
|
90 |
-
cartFees: [],
|
91 |
-
cartItemsCount: 0,
|
92 |
-
cartItemsWeight: 0,
|
93 |
-
cartNeedsPayment: true,
|
94 |
-
cartNeedsShipping: true,
|
95 |
-
cartItemErrors: [],
|
96 |
-
cartTotals: defaultCartTotals,
|
97 |
-
cartIsLoading: true,
|
98 |
-
cartErrors: [],
|
99 |
-
billingAddress: defaultBillingAddress,
|
100 |
-
shippingAddress: defaultShippingAddress,
|
101 |
-
shippingRates: [],
|
102 |
-
shippingRatesLoading: false,
|
103 |
-
cartHasCalculatedShipping: false,
|
104 |
-
paymentRequirements: [],
|
105 |
-
receiveCart: () => undefined,
|
106 |
-
extensions: {},
|
107 |
-
};
|
108 |
-
|
109 |
-
/**
|
110 |
-
* This is a custom hook that is wired up to the `wc/store/cart` data
|
111 |
-
* store.
|
112 |
-
*
|
113 |
-
* @param {Object} options An object declaring the various
|
114 |
-
* collection arguments.
|
115 |
-
* @param {boolean} options.shouldSelect If false, the previous results will be
|
116 |
-
* returned and internal selects will not
|
117 |
-
* fire.
|
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: StoreCart = useSelect(
|
130 |
-
( select, { dispatch } ) => {
|
131 |
-
if ( ! shouldSelect ) {
|
132 |
-
return defaultCartData;
|
133 |
-
}
|
134 |
-
|
135 |
-
if ( isEditor ) {
|
136 |
-
return {
|
137 |
-
cartCoupons: previewCart.coupons,
|
138 |
-
cartItems: previewCart.items,
|
139 |
-
cartFees: previewCart.fees,
|
140 |
-
cartItemsCount: previewCart.items_count,
|
141 |
-
cartItemsWeight: previewCart.items_weight,
|
142 |
-
cartNeedsPayment: previewCart.needs_payment,
|
143 |
-
cartNeedsShipping: previewCart.needs_shipping,
|
144 |
-
cartItemErrors: [],
|
145 |
-
cartTotals: previewCart.totals,
|
146 |
-
cartIsLoading: false,
|
147 |
-
cartErrors: [],
|
148 |
-
billingAddress: defaultBillingAddress,
|
149 |
-
shippingAddress: defaultShippingAddress,
|
150 |
-
extensions: {},
|
151 |
-
shippingRates: previewCart.shipping_rates,
|
152 |
-
shippingRatesLoading: false,
|
153 |
-
cartHasCalculatedShipping:
|
154 |
-
previewCart.has_calculated_shipping,
|
155 |
-
paymentRequirements: previewCart.paymentRequirements,
|
156 |
-
receiveCart:
|
157 |
-
typeof previewCart?.receiveCart === 'function'
|
158 |
-
? previewCart.receiveCart
|
159 |
-
: () => undefined,
|
160 |
-
};
|
161 |
-
}
|
162 |
-
|
163 |
-
const store = select( storeKey );
|
164 |
-
const cartData = store.getCartData();
|
165 |
-
const cartErrors = store.getCartErrors();
|
166 |
-
const cartTotals = store.getCartTotals();
|
167 |
-
const cartIsLoading = ! store.hasFinishedResolution(
|
168 |
-
'getCartData'
|
169 |
-
);
|
170 |
-
const shippingRatesLoading = store.isCustomerDataUpdating();
|
171 |
-
const { receiveCart } = dispatch( storeKey );
|
172 |
-
const billingAddress = decodeValues( cartData.billingAddress );
|
173 |
-
const shippingAddress = cartData.needsShipping
|
174 |
-
? decodeValues( cartData.shippingAddress )
|
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,
|
197 |
-
cartNeedsShipping: cartData.needsShipping,
|
198 |
-
cartItemErrors: cartData.errors || [],
|
199 |
-
cartTotals,
|
200 |
-
cartIsLoading,
|
201 |
-
cartErrors,
|
202 |
-
billingAddress: emptyHiddenAddressFields( billingAddress ),
|
203 |
-
shippingAddress: emptyHiddenAddressFields( shippingAddress ),
|
204 |
-
extensions: cartData.extensions || {},
|
205 |
-
shippingRates: cartData.shippingRates || [],
|
206 |
-
shippingRatesLoading,
|
207 |
-
cartHasCalculatedShipping: cartData.hasCalculatedShipping,
|
208 |
-
paymentRequirements: cartData.paymentRequirements || [],
|
209 |
-
receiveCart,
|
210 |
-
};
|
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 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/shipping/index.js
DELETED
@@ -1,2 +0,0 @@
|
|
1 |
-
export * from './use-select-shipping-rate';
|
2 |
-
export * from './use-select-shipping-rates';
|
|
|
|
assets/js/base/context/hooks/shipping/use-select-shipping-rate.ts
DELETED
@@ -1,81 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
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.
|
16 |
-
*
|
17 |
-
* @param {Array} shippingRates Array of shipping rates.
|
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: CartShippingPackageShippingRate[]
|
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
|
27 |
-
* changes are reflected in the UI instantly.
|
28 |
-
*
|
29 |
-
* @param {string} packageId Package ID to select rates for.
|
30 |
-
* @param {Array} shippingRates an array of packages with shipping rates.
|
31 |
-
* @return {Object} This hook will return an object with these properties:
|
32 |
-
* - selectShippingRate: A function that immediately returns the selected rate and dispatches an action generator.
|
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 |
-
|
49 |
-
// Selected rates are stored in state. This allows shipping rates changes to be shown in the UI instantly.
|
50 |
-
// Defaults to the currently selected rate_id.
|
51 |
-
const [ selectedShippingRate, setSelectedShippingRate ] = useState( () =>
|
52 |
-
deriveSelectedRateId( shippingRates )
|
53 |
-
);
|
54 |
-
|
55 |
-
// This ref is used to track when changes come in via the props. When the incoming shipping rates change, update our local state if there are changes to selected methods.
|
56 |
-
const currentShippingRates = useRef( shippingRates );
|
57 |
-
useEffect( () => {
|
58 |
-
if ( ! isShallowEqual( currentShippingRates.current, shippingRates ) ) {
|
59 |
-
currentShippingRates.current = shippingRates;
|
60 |
-
setSelectedShippingRate( deriveSelectedRateId( shippingRates ) );
|
61 |
-
}
|
62 |
-
}, [ shippingRates ] );
|
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 |
-
( newShippingRateId ) => {
|
67 |
-
setSelectedShippingRate( newShippingRateId );
|
68 |
-
selectShippingRate( newShippingRateId, packageId );
|
69 |
-
dispatchCheckoutEvent( 'set-selected-shipping-rate', {
|
70 |
-
shippingRateId: newShippingRateId,
|
71 |
-
} );
|
72 |
-
},
|
73 |
-
[ packageId, selectShippingRate, dispatchCheckoutEvent ]
|
74 |
-
);
|
75 |
-
|
76 |
-
return {
|
77 |
-
selectShippingRate: setPackageRateId,
|
78 |
-
selectedShippingRate,
|
79 |
-
isSelectingRate,
|
80 |
-
};
|
81 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/shipping/use-select-shipping-rates.ts
DELETED
@@ -1,55 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
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 |
-
import { useThrowError } from '@woocommerce/base-hooks';
|
8 |
-
|
9 |
-
/**
|
10 |
-
* This is a custom hook for selecting shipping rates
|
11 |
-
*
|
12 |
-
* @return {Object} This hook will return an object with these properties:
|
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 } = ( useDispatch( storeKey ) as {
|
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 |
-
( newShippingRateId, packageId ) => {
|
36 |
-
selectShippingRate( newShippingRateId, packageId ).catch(
|
37 |
-
( error ) => {
|
38 |
-
// we throw this error because an error on selecting a rate is problematic.
|
39 |
-
throwError( error );
|
40 |
-
}
|
41 |
-
);
|
42 |
-
},
|
43 |
-
[ throwError, selectShippingRate ]
|
44 |
-
);
|
45 |
-
|
46 |
-
// See if rates are being selected.
|
47 |
-
const isSelectingRate = useSelect< boolean >( ( select ) => {
|
48 |
-
return select( storeKey ).isShippingRateBeingSelected();
|
49 |
-
}, [] );
|
50 |
-
|
51 |
-
return {
|
52 |
-
selectShippingRate: setRate,
|
53 |
-
isSelectingRate,
|
54 |
-
};
|
55 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/test/use-store-notices.js
DELETED
@@ -1,65 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { render, act } from '@testing-library/react';
|
5 |
-
import { StoreNoticesProvider } from '@woocommerce/base-context';
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Internal dependencies
|
9 |
-
*/
|
10 |
-
import { useStoreNotices } from '../use-store-notices';
|
11 |
-
|
12 |
-
describe( 'useStoreNotices', () => {
|
13 |
-
function setup() {
|
14 |
-
const returnVal = {};
|
15 |
-
|
16 |
-
function TestComponent() {
|
17 |
-
Object.assign( returnVal, useStoreNotices() );
|
18 |
-
|
19 |
-
return null;
|
20 |
-
}
|
21 |
-
|
22 |
-
render(
|
23 |
-
<StoreNoticesProvider>
|
24 |
-
<TestComponent />
|
25 |
-
</StoreNoticesProvider>
|
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 |
-
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
37 |
-
|
38 |
-
// Add error notice.
|
39 |
-
act( () => {
|
40 |
-
storeNoticesData.addErrorNotice( 'Error notice' );
|
41 |
-
} );
|
42 |
-
|
43 |
-
expect( storeNoticesData.notices.length ).toBe( 1 );
|
44 |
-
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( true );
|
45 |
-
|
46 |
-
expect( storeNoticesData.notices.length ).toBe( 1 );
|
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( 0 );
|
55 |
-
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
56 |
-
|
57 |
-
// Remove all remaining notices.
|
58 |
-
act( () => {
|
59 |
-
storeNoticesData.removeNotices();
|
60 |
-
} );
|
61 |
-
|
62 |
-
expect( storeNoticesData.notices.length ).toBe( 0 );
|
63 |
-
expect( storeNoticesData.hasNoticesOfType( 'default' ) ).toBe( false );
|
64 |
-
} );
|
65 |
-
} );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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-checkout-address.js
DELETED
@@ -1,130 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { defaultAddressFields } from '@woocommerce/settings';
|
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 '../providers/cart-checkout';
|
15 |
-
|
16 |
-
/**
|
17 |
-
* Compare two addresses and see if they are the same.
|
18 |
-
*
|
19 |
-
* @param {Object} address1 First address.
|
20 |
-
* @param {Object} address2 Second address.
|
21 |
-
*/
|
22 |
-
const isSameAddress = ( address1, address2 ) => {
|
23 |
-
return Object.keys( defaultAddressFields ).every(
|
24 |
-
( field ) => address1[ field ] === address2[ field ]
|
25 |
-
);
|
26 |
-
};
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Custom hook for exposing address related functionality for the checkout address form.
|
30 |
-
*/
|
31 |
-
export const useCheckoutAddress = () => {
|
32 |
-
const { customerId } = useCheckoutContext();
|
33 |
-
const { needsShipping } = useShippingDataContext();
|
34 |
-
const {
|
35 |
-
billingData,
|
36 |
-
setBillingData,
|
37 |
-
shippingAddress,
|
38 |
-
setShippingAddress,
|
39 |
-
} = useCustomerDataContext();
|
40 |
-
|
41 |
-
// This tracks the state of the "shipping as billing" address checkbox. It's
|
42 |
-
// initial value is true (if shipping is needed), however, if the user is
|
43 |
-
// logged in and they have a different billing address, we can toggle this off.
|
44 |
-
const [ shippingAsBilling, setShippingAsBilling ] = useState(
|
45 |
-
() =>
|
46 |
-
needsShipping &&
|
47 |
-
( ! customerId || isSameAddress( shippingAddress, billingData ) )
|
48 |
-
);
|
49 |
-
|
50 |
-
const currentShippingAsBilling = useRef( shippingAsBilling );
|
51 |
-
const previousBillingData = useRef( billingData );
|
52 |
-
|
53 |
-
/**
|
54 |
-
* Sets shipping address data, and also billing if using the same address.
|
55 |
-
*/
|
56 |
-
const setShippingFields = useCallback(
|
57 |
-
( value ) => {
|
58 |
-
setShippingAddress( value );
|
59 |
-
|
60 |
-
if ( shippingAsBilling ) {
|
61 |
-
setBillingData( value );
|
62 |
-
}
|
63 |
-
},
|
64 |
-
[ shippingAsBilling, setShippingAddress, setBillingData ]
|
65 |
-
);
|
66 |
-
|
67 |
-
/**
|
68 |
-
* Sets billing address data, and also shipping if shipping is disabled.
|
69 |
-
*/
|
70 |
-
const setBillingFields = useCallback(
|
71 |
-
( value ) => {
|
72 |
-
setBillingData( value );
|
73 |
-
|
74 |
-
if ( ! needsShipping ) {
|
75 |
-
setShippingAddress( value );
|
76 |
-
}
|
77 |
-
},
|
78 |
-
[ needsShipping, setShippingAddress, setBillingData ]
|
79 |
-
);
|
80 |
-
|
81 |
-
// When the "Use same address" checkbox is toggled we need to update the current billing address to reflect this;
|
82 |
-
// that is either setting the billing address to the shipping address, or restoring the billing address to it's
|
83 |
-
// previous state.
|
84 |
-
useEffect( () => {
|
85 |
-
if ( currentShippingAsBilling.current !== shippingAsBilling ) {
|
86 |
-
if ( shippingAsBilling ) {
|
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 |
-
...billingAddress,
|
100 |
-
} );
|
101 |
-
}
|
102 |
-
currentShippingAsBilling.current = shippingAsBilling;
|
103 |
-
}
|
104 |
-
}, [ shippingAsBilling, setBillingData, shippingAddress, billingData ] );
|
105 |
-
|
106 |
-
const setEmail = ( value ) =>
|
107 |
-
void setBillingData( {
|
108 |
-
email: value,
|
109 |
-
} );
|
110 |
-
const setPhone = ( value ) =>
|
111 |
-
void setBillingData( {
|
112 |
-
phone: value,
|
113 |
-
} );
|
114 |
-
|
115 |
-
// Note that currentShippingAsBilling is returned rather than the current state of shippingAsBilling--this is so that
|
116 |
-
// the billing fields are not rendered before sync (billing field values are debounced and would be outdated)
|
117 |
-
return {
|
118 |
-
defaultAddressFields,
|
119 |
-
shippingFields: shippingAddress,
|
120 |
-
setShippingFields,
|
121 |
-
billingFields: billingData,
|
122 |
-
setBillingFields,
|
123 |
-
setEmail,
|
124 |
-
setPhone,
|
125 |
-
shippingAsBilling,
|
126 |
-
setShippingAsBilling,
|
127 |
-
showBillingFields:
|
128 |
-
! needsShipping || ! currentShippingAsBilling.current,
|
129 |
-
};
|
130 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/use-checkout-notices.js
DELETED
@@ -1,57 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useSelect } from '@wordpress/data';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import { useEmitResponse } from './use-emit-response';
|
10 |
-
|
11 |
-
/**
|
12 |
-
* @typedef {import('@woocommerce/type-defs/contexts').StoreNoticeObject} StoreNoticeObject
|
13 |
-
* @typedef {import('@woocommerce/type-defs/hooks').CheckoutNotices} CheckoutNotices
|
14 |
-
*/
|
15 |
-
|
16 |
-
/**
|
17 |
-
* A hook that returns all notices visible in the Checkout block.
|
18 |
-
*
|
19 |
-
* @return {CheckoutNotices} Notices from the checkout form or payment methods.
|
20 |
-
*/
|
21 |
-
export const useCheckoutNotices = () => {
|
22 |
-
const { noticeContexts } = useEmitResponse();
|
23 |
-
|
24 |
-
/**
|
25 |
-
* @type {StoreNoticeObject[]}
|
26 |
-
*/
|
27 |
-
const checkoutNotices = useSelect(
|
28 |
-
( select ) => select( 'core/notices' ).getNotices( 'wc/checkout' ),
|
29 |
-
[]
|
30 |
-
);
|
31 |
-
|
32 |
-
/**
|
33 |
-
* @type {StoreNoticeObject[]}
|
34 |
-
*/
|
35 |
-
const expressPaymentNotices = useSelect(
|
36 |
-
( select ) =>
|
37 |
-
select( 'core/notices' ).getNotices(
|
38 |
-
noticeContexts.EXPRESS_PAYMENTS
|
39 |
-
),
|
40 |
-
[ noticeContexts.EXPRESS_PAYMENTS ]
|
41 |
-
);
|
42 |
-
|
43 |
-
/**
|
44 |
-
* @type {StoreNoticeObject[]}
|
45 |
-
*/
|
46 |
-
const paymentNotices = useSelect(
|
47 |
-
( select ) =>
|
48 |
-
select( 'core/notices' ).getNotices( noticeContexts.PAYMENTS ),
|
49 |
-
[ noticeContexts.PAYMENTS ]
|
50 |
-
);
|
51 |
-
|
52 |
-
return {
|
53 |
-
checkoutNotices,
|
54 |
-
expressPaymentNotices,
|
55 |
-
paymentNotices,
|
56 |
-
};
|
57 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/use-checkout-submit.js
DELETED
@@ -1,47 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { __ } from '@wordpress/i18n';
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Internal dependencies
|
8 |
-
*/
|
9 |
-
import { useCheckoutContext } from '../providers/cart-checkout/checkout-state';
|
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,
|
15 |
-
* and an indication of submission status.
|
16 |
-
*/
|
17 |
-
export const useCheckoutSubmit = () => {
|
18 |
-
const {
|
19 |
-
onSubmit,
|
20 |
-
isCalculating,
|
21 |
-
isBeforeProcessing,
|
22 |
-
isProcessing,
|
23 |
-
isAfterProcessing,
|
24 |
-
isComplete,
|
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:
|
39 |
-
paymentMethod?.placeOrderButtonLabel ||
|
40 |
-
__( 'Place Order', 'woo-gutenberg-products-block' ),
|
41 |
-
onSubmit,
|
42 |
-
isCalculating,
|
43 |
-
isDisabled: isProcessing || paymentStatus.isDoingExpressPayment,
|
44 |
-
waitingForProcessing,
|
45 |
-
waitingForRedirect,
|
46 |
-
};
|
47 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/base/context/hooks/use-customer-data.ts
DELETED
@@ -1,181 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* External dependencies
|
3 |
-
*/
|
4 |
-
import { useDispatch } from '@wordpress/data';
|
5 |
-
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 { useStoreCart } from './cart/use-store-cart';
|
28 |
-
import { useStoreNotices } from './use-store-notices';
|
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 |
-
|
81 |
-
// Grab the initial values from the store cart hook.
|
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< CustomerData >( {
|
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< CustomerData >( customerData );
|
97 |
-
|
98 |
-
// Debounce updates to the customerData state so it's not triggered excessively.
|
99 |
-
const [ debouncedCustomerData ] = useDebounce( customerData, 1000, {
|
100 |
-
// Default equalityFn is prevData === newData.
|
101 |
-
equalityFn: ( prevData, newData ) => {
|
102 |
-
return (
|
103 |
-
isShallowEqual( prevData.billingData, newData.billingData ) &&
|
104 |
-
isShallowEqual(
|
105 |
-
prevData.shippingAddress,
|
106 |
-
newData.shippingAddress
|
107 |
-
)
|
108 |
-
);
|
109 |
-
},
|
110 |
-
} );
|
111 |
-
|
112 |
-
/**
|
113 |
-
* Set billing data.
|
114 |
-
*
|
115 |
-
* Contains special handling for email and phone so those fields are not overwritten if simply updating address.
|
116 |
-
*/
|
117 |
-
const setBillingData = useCallback( ( newData ) => {
|
118 |
-
setCustomerData( ( prevState ) => {
|
119 |
-
return {
|
120 |
-
...prevState,
|
121 |
-
billingData: {
|
122 |
-
...prevState.billingData,
|
123 |
-
...newData,
|
124 |
-
},
|
125 |
-
};
|
126 |
-
} );
|
127 |
-
}, [] );
|
128 |
-
|
129 |
-
/**
|
130 |
-
* Set shipping data.
|
131 |
-
*/
|
132 |
-
const setShippingAddress = useCallback( ( newData ) => {
|
133 |
-
setCustomerData( ( prevState ) => ( {
|
134 |
-
...prevState,
|
135 |
-
shippingAddress: newData,
|
136 |
-
} ) );
|
137 |
-
}, [] );
|
138 |
-
|
139 |
-
/**
|
140 |
-
* This pushes changes to the API when the local state differs from the address in the cart.
|
141 |
-
*/
|
142 |
-
useEffect( () => {
|
143 |
-
// Only push updates when enough fields are populated.
|
144 |
-
if (
|
145 |
-
! shouldUpdateAddressStore(
|
146 |
-
previousCustomerData.current.billingData,
|
147 |
-
debouncedCustomerData.billingData
|
148 |
-
) &&
|
149 |
-
! shouldUpdateAddressStore(
|
150 |
-
previousCustomerData.current.shippingAddress,
|
151 |
-
debouncedCustomerData.shippingAddress
|
152 |
-
)
|
153 |
-
) {
|
154 |
-
return;
|
155 |
-
}
|
156 |
-
previousCustomerData.current = debouncedCustomerData;
|
157 |
-
updateCustomerData( {
|
158 |
-
billing_address: debouncedCustomerData.billingData,
|
159 |
-
shipping_address: debouncedCustomerData.shippingAddress,
|
160 |
-
} )
|
161 |
-
.then( () => {
|
162 |
-
removeNotice( 'checkout' );
|
163 |
-
} )
|
164 |
-
.catch( ( response ) => {
|
165 |
-
addErrorNotice( formatStoreApiErrorMessage( response ), {
|
166 |
-
id: 'checkout',
|
167 |
-
} );
|
168 |
-
} );
|
169 |
-
}, [
|
170 |
-
debouncedCustomerData,
|
171 |
-
addErrorNotice,
|
172 |
-
removeNotice,
|
173 |
-
updateCustomerData,
|
174 |
-
] );
|
175 |
-
return {
|
176 |
-
billingData: customerData.billingData,
|
177 |
-
shippingAddress: customerData.shippingAddress,
|
178 |
-
setBillingData,
|
179 |
-
setShippingAddress,
|
180 |
-
};
|
181 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 ) &
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|