From b4a6bdce62a0d98d2fc27cdae1625491662813e1 Mon Sep 17 00:00:00 2001 From: Drew Rowan Date: Mon, 2 Sep 2024 11:52:22 +0200 Subject: [PATCH] Release 3.0.12 --- README.md | 4 +- assets/css/admin.css | 9 +- assets/css/checkout.css | 9 +- build/index.asset.php | 1 + build/index.css | 1 + build/index.js | 1 + changelog.txt | 7 + docs/en/documentation.html | 2 +- docs/en/resource/method.png | Bin 81299 -> 80226 bytes ...ass-wc-weareplanet-admin-settings-page.php | 2 +- includes/class-wc-weareplanet-autoloader.php | 11 +- includes/class-wc-weareplanet-migration.php | 14 +- .../class-wc-weareplanet-webhook-handler.php | 43 ++- ...class-wc-weareplanet-service-line-item.php | 109 +++++-- .../class-wc-weareplanet-service-webhook.php | 73 +++-- .../class-wc-weareplanet-webhook-abstract.php | 2 + ...eareplanet-webhook-delivery-indication.php | 2 + .../class-wc-weareplanet-webhook-entity.php | 1 + ...ass-wc-weareplanet-webhook-manual-task.php | 2 + ...areplanet-webhook-method-configuration.php | 2 + ...eplanet-webhook-order-related-abstract.php | 2 + .../class-wc-weareplanet-webhook-refund.php | 2 + .../class-wc-weareplanet-webhook-request.php | 27 +- ...s-wc-weareplanet-webhook-token-version.php | 2 + .../class-wc-weareplanet-webhook-token.php | 2 + ...eplanet-webhook-transaction-completion.php | 2 + ...eareplanet-webhook-transaction-invoice.php | 2 + ...c-weareplanet-webhook-transaction-void.php | 2 + ...ass-wc-weareplanet-webhook-transaction.php | 2 + ...t-webhook-delivery-indication-strategy.php | 100 +++++++ ...areplanet-webhook-manual-task-strategy.php | 47 +++ ...-webhook-method-configuration-strategy.php | 47 +++ ...wc-weareplanet-webhook-refund-strategy.php | 145 ++++++++++ ...s-wc-weareplanet-webhook-strategy-base.php | 65 +++++ ...weareplanet-webhook-strategy-interface.php | 42 +++ ...c-weareplanet-webhook-strategy-manager.php | 158 ++++++++++ ...-wc-weareplanet-webhook-token-strategy.php | 48 ++++ ...eplanet-webhook-token-version-strategy.php | 48 ++++ ...ebhook-transaction-completion-strategy.php | 272 ++++++++++++++++++ ...t-webhook-transaction-invoice-strategy.php | 92 ++++++ ...areplanet-webhook-transaction-strategy.php | 197 +++++++++++++ ...anet-webhook-transaction-void-strategy.php | 146 ++++++++++ languages/woo-weareplanet-de_DE.mo | Bin 15423 -> 15634 bytes languages/woo-weareplanet-de_DE.po | 4 + languages/woo-weareplanet.pot | 6 +- readme.txt | 8 +- woocommerce-weareplanet.php | 14 +- 47 files changed, 1682 insertions(+), 95 deletions(-) create mode 100644 build/index.asset.php create mode 100644 build/index.css create mode 100644 build/index.js create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-delivery-indication-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-manual-task-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-method-configuration-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-refund-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-base.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-interface.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-manager.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-token-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-token-version-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-completion-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-invoice-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-strategy.php create mode 100644 includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-void-strategy.php diff --git a/README.md b/README.md index b059291..3de17e3 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This repository contains the WeArePlanet plugin that enables WooCommerce to proc ## Documentation -* [Documentation](https://plugin-documentation.weareplanet.com/weareplanet/woocommerce/3.0.11/docs/en/documentation.html) +* [Documentation](https://plugin-documentation.weareplanet.com/weareplanet/woocommerce/3.0.12/docs/en/documentation.html) ## Support @@ -33,4 +33,4 @@ ____________________________________________________________________________ ## License -Please see the [license file](https://github.com/weareplanet/woocommerce/blob/3.0.11/LICENSE) for more information. +Please see the [license file](https://github.com/weareplanet/woocommerce/blob/3.0.12/LICENSE) for more information. diff --git a/assets/css/admin.css b/assets/css/admin.css index 732ccd7..5e20056 100644 --- a/assets/css/admin.css +++ b/assets/css/admin.css @@ -1,10 +1,13 @@ /** * WeArePlanet WooCommerce * - * This WooCommerce plugin enables to process payments with WeArePlanet (https://www.weareplanet.com/). + * WeArePlanet + * This plugin will add support for all WeArePlanet payments methods and connect the WeArePlanet servers to your WooCommerce webshop (https://www.weareplanet.com/). * - * @author Planet Merchant Services Ltd (https://www.weareplanet.com) - * @license http://www.apache.org/licenses/LICENSE-2.0 Apache Software License (ASL 2.0) + * @category Class + * @package WeArePlanet + * @author Planet Merchant Services Ltd (https://www.weareplanet.com) + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache Software License (ASL 2.0) */ /* Icons for status */ @font-face { diff --git a/assets/css/checkout.css b/assets/css/checkout.css index de8133f..7e7db0e 100644 --- a/assets/css/checkout.css +++ b/assets/css/checkout.css @@ -1,10 +1,13 @@ /** * WeArePlanet WooCommerce * - * This WooCommerce plugin enables to process payments with WeArePlanet (https://www.weareplanet.com/). + * WeArePlanet + * This plugin will add support for all WeArePlanet payments methods and connect the WeArePlanet servers to your WooCommerce webshop (https://www.weareplanet.com/). * - * @author Planet Merchant Services Ltd (https://www.weareplanet.com) - * @license http://www.apache.org/licenses/LICENSE-2.0 Apache Software License (ASL 2.0) + * @category Class + * @package WeArePlanet + * @author Planet Merchant Services Ltd (https://www.weareplanet.com) + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache Software License (ASL 2.0) */ /* Order button disabled */ #place_order.weareplanet-disabled{ diff --git a/build/index.asset.php b/build/index.asset.php new file mode 100644 index 0000000..b8b5579 --- /dev/null +++ b/build/index.asset.php @@ -0,0 +1 @@ + array('@woocommerce/blocks-registry', 'react', 'wp-element', 'wp-polyfill'), 'version' => 'b53687c38b284a0c8c13'); diff --git a/build/index.css b/build/index.css new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/index.css @@ -0,0 +1 @@ + diff --git a/build/index.js b/build/index.js new file mode 100644 index 0000000..8552c0d --- /dev/null +++ b/build/index.js @@ -0,0 +1 @@ +!function(){"use strict";var e=window.wp.element,n=window.React,o=function({paymentMethodConfigurationId:o,eventRegistration:t}){const{onCheckoutSuccess:i,onCheckoutFail:a,onCheckoutValidation:c,onPaymentProcessing:r,onPaymentSetup:s}=t,[l,u]=(0,n.useState)(!0),d=`payment-method-${o}`;let m=window.IframeCheckoutHandler(o);const g=(0,n.useCallback)((()=>{m.create(d),u(!1)}),[o,d]);return(0,n.useEffect)((()=>{document.getElementById(d)&&g();const e=i((()=>(console.log("onCheckoutSuccess"),new Promise((e=>{console.log("Running submit"),m.submit(),setTimeout((function(){e(!1)}),3e4)}))))),n=c((()=>{console.log("onCheckoutValidation");let e=new Promise((e=>{m.setValidationCallback((n=>{console.log("Validation was ",n),void 0!==n.success?e(n.success):(console.error("Validation result did not return a success status."),e(!1))}))}));return m.validate(),e})),o=a((()=>{console.log("onCheckoutFail")})),t=r((()=>{console.log("onPaymentProcessing")})),l=s((()=>{console.log("onPaymentSetup")}));return()=>{e(),o(),n(),t(),l()}}),[g,d,i,a,c,r,s]),(0,e.createElement)("div",null,l&&(0,e.createElement)("div",null,"Loading payment method..."),(0,e.createElement)("div",{id:d}))},t=function({paymentMethodConfigurationId:e,eventRegistration:o}){console.log("LightboxComponent");const{onCheckoutSuccess:t,onCheckoutValidationBeforeProcessing:i,onCheckoutError:a}=o,[c,r]=(0,n.useState)(!0);(0,n.useEffect)((()=>{const n=t((()=>new Promise(((n,o)=>{console.log("onCheckoutSuccess"),window.LightboxCheckoutHandler.startPayment(e,(function(e,t){!e||e.error?o(e):n(e)}))})).then((e=>{console.log("Payment process finished",e)})).catch((e=>{alert("An error occurred during the initialization of the payment lightbox."),console.error(e)}))));return()=>{n()}}),[t,e])},i=window.wc.wcBlocksRegistry;jQuery((function(n){const a=wp.apiFetch.nonceEndpoint;n.post(a,{action:"get_payment_methods"},(function(c){c.map((function(c){let r;r="iframe"===c.integration_mode?(0,e.createElement)(o,{paymentMethodConfigurationId:c.configuration_id}):(0,e.createElement)(t,{paymentMethodConfigurationId:c.configuration_id});let s={name:c.name,label:c.label,content:r,edit:(0,e.createElement)("div",null,c.description),ariaLabel:c.ariaLabel,canMakePayment:async e=>await async function(){try{return new Promise(((e,o)=>{n.post(a,{action:"is_payment_method_available",payment_method:c.name,configuration_id:c.configuration_id},(function(n){e(n)})).fail((function(e){console.error("Error:",e),o(!1)}))}))}catch(e){return console.error("Error:",e),!1}}()};(0,i.registerPaymentMethod)(s)}))})).fail((function(e){console.error("Error getting payment methods. ",e)}))}))}(); \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index b44a8f3..4b602cf 100644 --- a/changelog.txt +++ b/changelog.txt @@ -804,3 +804,10 @@ Tested against: - [Tested Against] Woocommerce 9.1.4 - [Tested Against] PHP SDK 4.5.0 += 3.0.12 - Aug 21 2024 = +- [Feature] Implemented the Webhook Signing Mechanism +- [Tested Against] PHP 8.0 and PHP 7.4 +- [Tested Against] Wordpress 6.6 +- [Tested Against] Woocommerce 9.1.4 +- [Tested Against] PHP SDK 4.5.0 + diff --git a/docs/en/documentation.html b/docs/en/documentation.html index 4764649..cb84f08 100644 --- a/docs/en/documentation.html +++ b/docs/en/documentation.html @@ -23,7 +23,7 @@

Documentation

  • - + Source
  • diff --git a/docs/en/resource/method.png b/docs/en/resource/method.png index a29d1b9ae587fd0ec5d1115139e313704606d4aa..166965f9912dcb0b9b288f95d9b38ab54a5026b0 100644 GIT binary patch literal 80226 zcmeFZXIN8hvo=fz2_5N85CQ3+^d=~vB1L*9NH3uyy+{=iqtXN-O*#PrQbPw3Y0^Up z9jT#8uf7YtpZmF=ee7eu@BZ`s`tnan*1FbQGjq+HbDk?kOGA~En2{I@3ybv8!w1?} zSa=95EZkKh0^onXn-HS0utKpOJy6v3HQ$&fOt@|kEPn1Sdns=ha51?pjV?Y2d+=Q` z6zko)drCO(JXMr9R%C@42%>u5hJU*u%JcRPiPVZDr$ZH{3N$N~*;WwXdhoB$?mFQz9>-swY~MDl*q48O78r5)|MiDg zPU*OCgI7uWUrc8;m#w5k#`0HFY%pI;GyeMWHvt1|lv6I>!|2jRPLZG@YXS55Yp7P_ zcvRiA{g>gU>*7LI6KRTR)Sf|qu9@BDyz%9_#Rs%l9Wi3^`Fg3+%cs=ubDXxD(!nh7 zSjY!-oQmwGn&nj9z^ zQL9qx@99Dp1mwv@V(a5cdv|JIjy5%DS4McP&6vpB56_5`OM9&eLS($k)qOshb(V_W zmeM;VXXMo@8msPu8kF+}6lXLTYrneA2T4n3noo~ToK>9CG#9W;OEM`ZS=ccyn5`{@ z_{X9)bJv+%C-bN&uRa~|8q@xdPk2Wm!zNXmJflvdRq98$rFH>9`!T1k-+TD_OsW$d z#Tw-@p5^itILUh=P3Cdn)Z7~1;<+_{7&MFkqSEX0ynvQq>0CJa#pJ7?Kb8Y zKtF%KTq5&$8O~1w{y@l`3c7TARwY!H#LwNIE*Gx~WqnlWkr=)_>adfP>a+IK2JNq* zUt+{3;X0GBlu`O#IX1bw3NvQ2c}mJF+6D?>-Je@7GXlBpl)4i7Jvom11CgJuH z!t&ddvVFsx&JI5!C-O3+y^YO^Q-&`>!9-))Wr@6YX~_oSt`l5AXQY+t&>a2gsGmFY z_W>vI3e9cjIae(%c5S}U58g|g{Zuo71DaAt9Tt~4{ zP@#9d#`HBYeU6M#g1P-O^Mk`?`?M zV72qzHaYU-P-!C0a5I(+Au4M34F!=2TmIPlU4NJo%>H`3=2z&5 z(+H<9+k8({T$(d_1N9j?)#$T*c2P`wmqqRYZY+Ay6!{6I?Cb-!iE>t z-#^^ye8UDcx_VrL5`8lUITs}@J|5XJu0G@Oq&St@m3MTC%;um*g>`OnPmdps`l;v;szXr9JNIAJawDNgWoKQf~hvPtr+2${Z(iRr(8lLQn#gt1FbqL|5#QmE^gM*8LJ?h) za+EcLRTKhHgmcO(y`{rVnW8rKx{jYj6%>w^e!9}mLbo8V))!A*_L7R;2kv)a6`D5c z-@tk`64x7RnAk`&L-dRWY;;2TrSafa`#(JOa?mm;6k>|13 zg+7^E&=faW2AKXi1DfYjt#^l(iVR+l#xY6YV$(()DXxZNb{Sn!24i`RsQ6l!&t>E+H za$a1|=DQerL+KWz|3Q&J1K=uEPGdMd9kMN{Z()MBb@J2(-`ha;TK?Xk(b8E%ao1@s z+-MSm;lVcR!zq4mgm-9U3sE9g&AV)Q-<^B-X3OH(G%hW3mX2u!_V$BeoOICW6O>>? zyJ{S%vw_Ly=Z(a~ZcNxoRrTy)ci?5)pG2)JC}cmJQN{t=p%;v27>w^;GU=UADtCsb zexG-?4jo%5D*;OQQYGRSl-xD{fR&2^(-1%M#B%-v@Rym@@>xt&U&UK1V-o$k4IZGex0u>3E*}&YsB2|!peRPV zz+TYah5Rktcvw$Yu<{4e`>dMyt8gD9I4g#oz`w@D%0ng3F*g!TgxCoi+S4kec$F3T zA*vglci#@(^x&qxjcXzsc9Mmn>E8D26ord%{yZtkL8qxWqeg#w*^Tdv;CcB&wga<} zn=i0HWz_uPTV=?ttO>_7+|?u9-}hZy!!OCCct6hwG9v<<#oPc@ z8W;K&xUo?^Q?>+YaNN^b)y&8<+t5fLX+W}NtaIF}dM(&T!arvygqUBPW|ASA&bDOg z+~$?QP3Gcx*!u4lY;KANcm`x`sK5_97{Q7BCXe(4E7KM2BfFhQ5m>4kJ7o4cOIz|Fpt5S$S4Z*L+GG7vA4|-i?x|a*UfS8hw58VeqBi zgvpX>=#l}2LG!Lm(XY?mjH&NY@ZlEVq=KbKTPVU9z}RoD%}DNYy}|;m$tEd|DK?TA z+vpXVn@p>?MN`mELqrOKYRuWXk)%wcOzc}}&_};5_k%kh3ncI4A3i?I0B32gt=+NHdls7)y?mJI1eJGu!iT|^Ay8`vsYIKv zrWe#>XFG7b*K3shTBYP9aP9#-5;m&#TKve|#A-n7jcYqBfvzOzcOz?LC4$DwyVO&w;zeJ0<%c^KCEJV z0DdK5PZC_~G0G@LZszp#Xiy0h-nf`XG-9()UK8A|_}hpHbTAzL{kKZV(swyqA*T7x zlMP}6Jgt3Vq@~fqg2JWKyOHvxF>q|!(nJJVa3*B@<=~5;0)T0r5|?AM2zDWW$yyoQ?X zg@JlkZ1#Rfd#o~44i9i~I$Q$SeVg{@Lgo!WOpX+*uUs1F0|zhrfmCb{+-`R8lt3LEB2ZE}UAr5N9X^brr03MzhvJEh-15E&tR6 zKi}(wMxyBj@v&)24=8QtQwbIgF*YAd9T5D+53<;aOJjlBs6gn#I~2dRNf}f$L}Tt; z>xHF9Da+2C(7uGtjtK-B-H}z?>%w8f&oGt_zFN}eDPzHs)(UzRv?b! zcVSqw!%S&C3STT0lK5Q}K9yAjM{GqPSKynldOg9R&t1ezo{YduUeWPrw5p#;!FlZBNK3I$giW29^f=SXTx<; z(oW^fc~Y(J1Nyr!vM+!=bbdFbQsjnjCYuy=m;Q@fGTmR*Ddj{~k7aQ+iylVsu4MW5 z`+1oG)z=>YWwP&1=DK2DXFV~U`5KzulLT`-iBqh1CiuR}H^x<$#SntakLLF8JOsOJoaCV~t_dZcD=-toI5 zy=o5seMt`9S_=7-)~V7iy-?+SQA-Ls3q|JN2Bv&RO~|4IH2 z9=ON->-m93ObqzqU!Ut^^x(g~PWjZ->i_KrPn%9B`h!*eT;h67saZYO`QBl)=$#&s z8hY^4CQ&}lKi7OJ>&JitxA=8Bmj2@q=nopbdWrvJ)d$x#i5)`^VlB?|ozc5>oO!n2 zxWl6Y!n_fJ)s%f~xcvTWA86kHX^45!ua96kt*lrS3iEoROebm`in$F5f!!WF7iq~( zeq+S`Cy-t)JW?b@yyw=8?;5sEjW_#cIsIe5aM{`*gaomgYo-72ucqEtTMHK+9IpB; z^?<3bOEIMRV$-$n(F+Bjp?|Q~i4|)uZ5zq?=ew`Cg-k*Z_A-7cCGlI_{>07M{Ziyw zg>?sSo##<{9X)_O@O@UI`tz_I)Xg~XVY~jWn%T=K7(bnm#XD}z^wfArh(W1&ylc}* zij>rbMJ<-o`u>Ed?=k&Eqfhh3bjU-M*Xmk|s9)#(zwiWryMJqgzx``-cE6NiIkgNt z_1HRB_N?IK%rCytwI(EBg@k>RhiH(U(FwLFVfZ2}Psw}0Er*@Z48x>np~~04{QCkw zY(NNj2vNybPR_1~oV%X1|GDCLLjuF*%Y!nTz3Pwe-zIRy6f#sS?g`=ImYCqerHo>K zjK?^q$OojqW>k12Z`P>MbT(SH&o!E%6Y9OVEWjY{-*yDOqns`qWc%GVRN30*-zHwL z3$5B19<9K{PAdvuCXgXekSYH7{65|Jq3~$(Ti%cJoY5zBsdl6Yl{X&?jMXi74x*)` z9B0!lY)RqG?|IT4 z+bQF{41e-mP=a1S>=M^sH)5NnL42d(>}BKNbaapAW*C= z|NXR7#aI}$Ye=aQj~B~G2vJUY&_x^)LSVQe)G&^U+0fzLskl@oMl_u)+lksA(;HRp z>v-zV0RizY@*mC%$KgL`&oTadd56aIV%?zm{Sx2Ux9nU#oIRj@Iq&Gv1r-4)yxID& zArf%Gq89O8y4x*nq1&t9zX?V>5KQ@ZynGS8a*T5vc4Hk<7AcL$CkkhWCSv_0h-Cp& z4l6FsLcu5jO^Ok@)g0{<-##GvVX{m&<;1_xFT?)=3Wdq6RN5&75zhHV2X-%=yd|rM)(9 z#jNSva@r-n%4!|ry_?$ew*Rmj2CJtpgABoO5mXmY#;C)08&b6Xs`lBau>pb~0Ol+L zo8#;+e~Ps@q6_PZKdGocd|%pl=KniOSh^$=OZg@nbDE0B5w*>O-%&!H}7GC|l>_Acbh$kr`2BLQT$-&{# zYNL$a&OLtD5U-MW_y8b^Zs+kJRke-Br-!?u+S$&^XfINz5r0M}hF8C+VUpbQwCC%; zgEj&?>8QDu1o4%Nvj-0E7^;A9JIo+IS%2@=RzzuQ_B*)|U z+fxQf>srW!JqeS@Rkv@SR+_8+{jHu8YBH~L2smPGfPMq=-`-{5v`D}4>x(l(0^I84 zVpBPLDd6G1IMT6#6tAHZFLQoe>=pT0c^xxnJOFf zCdYRCe%=(G;iT#XLH8$BXwCx0wcrdWAmZzcKtDDnJS*(Bz11H2`dZ*XF1Jn$ptKJ`lR(t9xz$=9^;8M>Y?9Mc#hF|{8$xv^!QOS z4W9v!MgDxc?MM&}zdF1_^%|cCb-_O0dq0%_DCKb(dijhJoLHu9mM#~-1z?{~k0|9K zGe~s+5H$y&mRn<`7RjY@rv-ij##QkkI>91vf!fhbh0knomoegD-~G^oxmH{n!GqHs zs}y<9>h+@W1{)JGHf+>lCv<5~s3`$JKa1X8+mrF$EL`S(@;Is3pset0Tio?FlLRDb zV?*cX@UvW&BM>`dI&S)6RKNJ6cw2#-R+H@lm-n@^XP<(3=h}k)KDbX}e>({of{Qa> ztvg{&yVBYSExU8GMTw6K?-AP(TaL@kw?(=owm_dNS7KVFGMz3Slm~!gnqc!1B&l93 z-;_$|fiSn~CiivXpkXOKGYwDfieO0_= zON4hN2?l`S7K7KYK+voeA(Kl7t>mv`kL6}r{{_TnpLbyOoLQI>8ZL6>7QLA2TT5lb zrVW;(m?t-uTXV2qiV*bAC^aoH7AP^V*HAAr%Fl9C&PD#n%~M;<+r~#JhDN%)KtWum zt8Y@!vzr>%N&Aw(-Kn_>1;dHj5ab7pV%Jikip$(wP2($WXSqNX#XizwYnM?Gsb>*b zhZf(ovDW`)DEWMYUKyN3*CXiDD{Aeh($BAuWHTeulWe0NER3PTjDl?a5Y9i}7&Y-@ z!rEocACyN3e}%_iHv-nJ{3=<`>VC?wm;w$QwJBXlYe=t342={FrEhjTg-aEAk1pi) z;3`t;78@D7ALi=GYFE{@zbodMm&)o$;ggT$bX-vGu|DE3xVy^tJ)aa} z0Rvc!Bw}lHn|xz{@>5tf&>sQb_>;)|$Q zvRnOWSbMmh8=~-&hs$qvJ85Rf>lxwsKhAnV92qUDWE2Eo!POqU0v0%M?IqrxjT5z; zUvJ-4`x(0cw&_D7+;wjFw)yI<64Nl+ zrJU$3kHpGmvg{~wEx;-YT5);dxB4?0H)6LEcF3n28o67S6oTY+V`Co&YHtSc5@k9p zV#Uj&rD88?X^l<7#zEuLs$}9VjDT|Z0k3S5`UV0H63n+!eGnNggiVV)jAPDNb)r*x z%`{r@=nlR>*%j&y%t#U^4;Tw=2I45X%ts|=bdLsYwzrO4U5=ISO=XCR=}Zgiloug? z&39ht(cO!> zw|WV_xB}|X%wo0;#!=Y%Gjm;!d^NZU`DI)U(=Xk1l9unjdZS}hF{6Fgu&m8$;tN?1 za?V5g`2$_aS~A44pea{lJD#Bn*bI089A?tyVnSRm?8s>s*>8uSdkNDT0odIQdrr{yO&xtXC0FEC;x93%*C1eNU7WUYQiK~ZK=^O za6V}f$t#9)G`K)4kmbfC(9YO!prK{>gT`1nWzh_~jo-P(rM(7Mpd8MzX&_lP2LELI zL77o)!^R4Tq5qYwjH|XejA9KQKAY5ClK~e5j)c7AGo;0Ur}a1MC#%)24q2-g+}!h0 zADIyw4VHeVo$5xZ!#vU&HeLQ|gWyJDs13CY5Q{x)Dxw)^RU}M91 zqA{Sxw9$W5Tw!La&QsN8rokbNHDZLF4ZWd$vo;OS{na_N54 zb_zYGs1lP`-l>-`v7<-LO??o_U5|5)!8041t(#zE+R?}Jx!)EChbo_R1A8>L^y2}# z8j|Lx}8?{@TrqkjpyAgm1b3fnybPdH*4>mkmkNoopfSZjvSZ z+Ue$y5F@0Q!#C=Dd-c@2k8Hog9MZN%v+hS*kCmELuMPgJm+j9`5V{{l^3-Oc*g!~+ zn~y6<_UVE@07QDu23q6TRQCaOE%W5_p~} z1+Vx7s|If$1#6y6&t90_HmQa``5>$a6als-^6Biork`!&ApVuG?jfhf(ZlW8vh~@Q zlsBFC76udf40P*M0(N~*_Z?Cs-Lw5a0x+>Ye*dzlK2RR$E?EUNZw%$eK1mZ-{|=L~ zGBIy=3cfr)sb1Uty6qp?PnTf8^VzPyS|Gy&b<|)lZ*gSskr_aY4VLr@!nT zvOhS<+t@f2nDgDVpER%tqNyOu%g3;;pD{DRqy#oJau9nsm37A3xBQ!sBjUI0~* zG{HJVJE3efCEGRj-)mrRSSV@8NDw?0DKw(A4KP>>u*w{po}>!r2~jDZEm&%lYk^y9 zDCl)KA^9XKhHwxDmifr+DE|=cXyaO$1Bu}TDIFQO7<^zcqc&~e5O;X$b!SPt3ymV3=71b+4Spp*J`59GylB9 z;ym&-!=10yfwK2`0OP6yQ*f!o+%f;+c^n|?1s64OJP}*zOuMQ2rXaRXOMqp%C6awc zXCM`OThli~G`U;}m|Q%b?estHWsnc74gA@~UAnoifZ;=~!89JhQRwjxIIiqQOMqQ7FM(jnd-TI;*}3_J;}CI<+kqF?}C4tn(H zQ90x$RavJH6)?zQexlhPfPQ~V4QGX-oCJ|AHT&mi5N^p1v;h+2j)zAWh$t|?B{)8B z#m2^_3kVO~VYe`0|9yLJ$}n=<%GU#X;;u9N!1WXR<u^}}O* zoA8e3#9ebXI<` zIt>};np^Jr0eTv%?<={r>`C%F(Q^P8Y{|2ZS3^i|C-1Yh;r#Wwr2HGn)i(DhN>> z&kq`ms~ihONB5+kZxpnVCSVkP?J20O4dv>wbT+(xO;Yte<6+Z43!H+O8Z5*=WMOsN64;)t=7LERU>;y2k3lm%6q zjzGhuqy1l_->nN6YaVQ(4a|Dyaj5zk(5+_-ho6AdUA+Qs3-DG_3Y%07WQ_nNiQQ=# z+F81`&glYN+-y@}=4_CWi0Z@XPN*$t8Y({#Jw zrmtu_{93=hd1iubqvH)_mO)DjdDUHHg&_3obWc`WO4;Ac!6Nu1H#NH77q1@m^OYAX zjYCEW8v3QbqRDIR{V9iMPm;h3hw&O9qZMfp?TL_<-Q>?#*rTY(=HHbH^Du1iEr+1r zy|JkEY8hp}1*k5iMO<8u#4h!>Bp=p=XkX?T6k@*n4dO0`AaOjqb;p(8yO*CEu6CTG*h9&%P!g3}QX+o^*E5b#v*e@tW#BV=xWP zeC<9TbMaLcsACgux-2R&FNGrTxl^PKy;5B_H5PSipsaF5>%8l20A8(E5H&{dCbI6= zeC=&DPh(DC!3iKF)xtBJBll+)v9h==N%+XhgXJ1|@D47G|9m#BB3*UtNo{S)9lJNkIIBqS-PDVo=5sZNk%D*r)7d7gY!`!U zg)S@~EDE)6od5v8r*|7v_>*<$0w~4#Roc4ZiLN{=Pqd#GG%=UY2ljaTSe` z&BR}>mt8)Nbhl-QSo{+fWNW43zWr@ZQ_>1km>~yN<2H`D`@-R4YXwg~jRZD`@1IG` z;O;NZHDY(-*4!L5F}?9j9;G_niO=&!z*ukof|f2Gg07Amk7E|7-I<9v;$im5*VhIf zUzQvWJ>r^Dy=Xb3>c*vmj^|Z@*t=;g{LLv#~7OtPw`5oKoe`iVm3)W=h;?j0cwokle=Ac(9%Lomg|wf-VEGor=a z&p0r1Pa>urqZj=e4P}|mZZJv$c6i%aoS^D?r{|ZwuR-}9#7D@szze_7evv2bPQ*)* z!Xs<4yhHM7{R+&@J&a|Li`4t{5f`l(stnKLhIX%n@B>-AjHTmq#oAYk5fx(X;}1K9 zMx?TICL%$Io%ENY%3xap!#b(&?+!aZKn|C;0lf1XRi&-$( z?M03z?+(4cyvBGhH7ksNH9pq&8bXVU=o1#Vv}9{*jh{c3sp-8rrANtW@`J;(rZ`Pi z4~*ta)B;VMHZ?x=bg73%9#B%18dvcOv(Yu3hM^{NSh)QpyHI8-h>-D8?`GJsS$Y8> zk&YWx%u2**MCccPrB@(v(=V7aZVedG$UHzvJ4myFWiCi9hM^pq7{JO!Xh~aNfmJ_4 zHgwlE7AE6zEkl`kqeU;yYQYZUh%98>={fY*G1Rf%U%rhWkFz!otJq~4`NGe)bX;CA z$!&Hrl0twg7#RLojG9cTBBG9NZzP+~#^@ONm(+xgCCbkj&icQ*zUIAlmz+*3Bly$- zoF1%jZ*G;V<&~~$pI}67W=(b2KvqhVt5W7mkT^#9)4^VA1Qw_VbEH-&-0Io6rwCHv z4?psDCNI-$Oc!fu+iO27PLBpTT?A9C-MOhPwJ09uhG$zFw-Q=`5X3~y9uQ{;@x*HF zla~Na_M&X8)rl%Y@id5e>DAe>Y};O&)6A(KbWSZg8lbZIp2I^QmPt(`J12h<0^c9<0v}}4YQMfy@f}(62HKJ=yPQS3b(paB#C)}U9?_SB0FtE6yBCwyfH%s0*EqA1 zoAvn9RQ)qOYfSD~mI|?A&2rA0+#8q&F?Y`;dWk?EHG#%8BPbh$$WLvW0m0E3B^h%rVS_6S>4X$)6`(BcBw zHWQK7KsO=XdTl0XYyk_c`Z8x$2>Z;Q1xm1uvE>tR3eC;o?Oe=kfwXfwL>-CQPf za$iUm|GsCt-_0gxrHht;H!iu6$nea`Q)bE=MhdPU-&hn}9sAKI0LO;U@!~RUEZqBs z_h)?C2LZ5;hta@TQ91UnZaFMDo*Fi?&_1;>RyH5;AX?x!lc4f#`OqxwLi-H!OM{Sc z%v=0fR0`%3)6;@@VpG%k2!dJbXTRL2BK28zX~8LGMCwEcxFSJPO|T5;REg%7yVA>w z%I~Tz6oM^7bXk&v%B$h%c|qAeYF<;fY-V?u+d`DSM;3B3a?#Fjq3t?dpDl>YlqZXI zPKoTuz1248QUl0a+${%&^y5PLC$^z9r7nx&f`RVX&L5!^H=1$zKZCNa9S~co%}agi zA?zLpcs0)sW-m8qM+)MMMC4jyKp3 zXcBO)9rYF2-bTA8I?JnWWP`6dJv{|i+MC@F~=|A;_EGW@!^DY0R zC<0~O9yvpbwcwcESSa63RehP)S@;U5Aq!#H8Ij{Y&h3F2UOm4%%g@RwU4aS@7%(7v z1c9Msldr(MA-mQ+C#S%|AJ@T(vO)Tx!%k#YObdP{glwvEts*E(3gqhAO04K$iTm$7 zl(Cy50fqNyIscrzLX1JLuVn>Bg67?e1y`nJfi-~4|o2Au-Emam?+nv{H zS@}}CpJmJW59LN;q}M-gbvv3Pr0@+<(vhxy-ad@^C+0Z(8`K(s2eQm}U@tp8LnB2# z2`61g%B(s_?gGh_$Ha^2%f7;KxPsPF*qS*mKgp_jiE&kCr|OYFWkM?iKnQ0%cP7Vr z78ZyXA?yR?E(%on75mz**xT=xZ*)kTwt2qXN4~zRNmz8+M&YIyEBy*tv~u$pwYMwJ zq8^Ix8-m(aJBA7|Q-~Um5stW;)*2sy%DC~E-hGYx$p;)oZD%=EAnFIFy)SjYpUNMy zlo`p&ujhHQP3_d11Nm_Ngu@ZykB43e2r zGBcJ)1LdY&5b}tmMud&da&;(NwEZs3cRf}%5EHZHemMELgylE=}v4 zUsKj#gQ<;pIvcMadvPOkX3e#;4AIPkPD9&S^5=l ziq?r;Ot7S7XOQXKGZ;UfDhhjW)_0M#%JieOH_mVaf#E9G>m+R+)d(y4=C$q1t!>>{ zp7ge{Vo~P4n`HrY;7*v5ES(qYPHj&^h^a>5}5zGAW*9I^Nx@F7KC*ENluK^r`_jas7CXh{v22v@jw z1D7eq+!tIrt>d|`_~Dms&rcDZkAyV7Bjh!f-G&O99Z0+@!ZJbA*WEZGmPAzWHALN8 zqo~`p=%h7%V~l2Zv1v0qXqvjd919#nJqFb=?hCJC?Rq< z6#zN6o50EqT+btchwINO_yD0EL>UwR7#{2KRoq)bt_CPyOdl>jpg+sO(5J_GgB|w5 z`T!tI4uz|{*k&GrUcWmF)JIlP741%hZaA;wy-lB__KPt8hGxIqZo#QEJQ-HF(4o;{ zzutDaApSLfs3)_SwT-iP_{x<+$A}3cJIg@XVsvd(c-kLUu7l^>aGGBp9{~)g_27%s zgV8`Q*Yhh}!<^9HOaeeD)f$yEnTzoG=5PqSLD-tVE0uztRhPoqJG-Z&X1-YSw`cgY zLY^+y+5;TK`9_mpJ9vVp1Ca#iRy*t&ayNHZ$VYJGSQ=S?){1-JQ8`-tXb66cxP@<5Kqs{?0xNk zq-UXrw9z?dk4NHc1Ar({6yGyp@QjYk&drK9YS-u)aSrhMahF2r7%{v{Wa37ZzrFZj z(bu>hzc$feDF!&Tgab|z`Qn@0?#tc(ILh7cvJ&uug4CwOBp94}xd!o^aGOfVmFgou zR#r-gB#UR2^UpEPSUn*Uqj2$Ku;OKIc;n6<{Zo8Js&(;`^FdI9IHJVBjrNZ`Qrs{oII>M}sy(8V*gt-FDsKERf;jVuB!QqCZ~x;^QgxDT56H2=wDI4g5GA;V1~CVKyd-^;*fmW@g?7VMY@6uppGND8BGKGm zx!WYRvo!46uV!kM4G~~a7VFp2ic6)ro|Z!Xz0Wh+mo3Wt#-FoCpXLY=a9IAAdC$LE zlYdW$Vpe{BvHElpTpQZ$&_q`|r(8qib#TuI&r3%MB59M!v@X$L!L94sv7pUlSz$*9S=+ z(Eo>D{m&E6|L#8j|1bXg>G1#FR`+$WQGCj3{?AG^bFStZz8+NR!(G@t-60Nor+HxX!~R!KOL2kkqKFn@iKU{LMM!5M2U>pZ^o5=(^C&D^AhXNN?ZcZ)zOn zyW3;fsPPEvl*B4SL?wtG+^tm4AHVZ2vfb}1(i&Tg{*jge97B)9VnTrxv6fWvAltc1&Dg{w zKp*uDP|jS@ZqPr?ZR|4M2jfPM=jm+xO-FnAEdii;5oeA5So7o*vxV0!OyZ`(m?=Q`ARI*J?ey?6x3|PWK`#0Vp<<;_I!JS&$StCs%~+)#_M;y zlLeFa)Q^f|rgk^#4)}-FPH4e;Wo8zlEBtSB_8qkIhA`D9b)*Q#k7t4gbt{7V9V z)7vOh0zrtc>W}qs>(YkB%CKn(AexWW4XEOWf3!o-)M6@VM$e7CnYw{FSdRH8E=3HB zyoW9qS6;zZhH6yQW&i(B@m<%^v*&$M45&EUFzG}@5K20afCkC6`stAa26CMH_LYgLVtekT3R z3VZpa3C}RMTQ6y1FZtmWv2gD$K(TzKH>-uMfA)PEXV{!iPs97p#=(5&&|Ha6j(YU> z7k)Op`iaG3rH`O9L8BKN8+6!7!xafNe{+Q&SpU4$qLf_!Zjm}@QwbXQNtA1I@fMrB#{*IvC|aXOd**LuGUdB2 z@4vY3TrD2Bm{SJuD12D!O@`#{8rRvU&Acx~;Kr4XbRVE@ppr_BkMcLK_+JyApKGenb$lo z`&8_{1h6QPf5#iJsL`SzIv_16Q4Qxkp2fbu^y%`xX=??*cdmAv9j!Lwo%)AaJXpXq z0#Ee;irQ0v;oH;e7b^=e9c!+9@i)=(Tf@(TF$=ZBLY?(wE+~rvJ20H65Lm1M$jB-e zMYmYdFas^{ufawXY^z2FkieA+HR+a`Haezd&^54Te9Yhe#&r8Ew>zh?bmTmELa2Y{ zGbH*CC%eJ(FH*%RDZBFI4-&sB>$=QNfv45)dtq{8-oBJ^7zvkxPU9;75@bdd_#HCj zhBITC(5LtP3?&cb6;T;bFf7p=|g0?0qqN<=d4RsUPGl+#tBpidyRJcUj0XG%klHg zA4KZ(+Pq%0;PmL?{^ct5M732u3=rSq3j%^+tzpWo515kR0bf3H21Yu33k{XDJd=*1NB;M{%Mg9)6{?*wS( zw3{A#qdmAPt9i|lVF|^$>dQi=@U{lCj1cxuUp3x}(i9g#OzWRdSEpO_E-qSsncTtF z&#=kQ-D``lUbFfa|NbQGuQfYNyh>abq4@D(Z{TMU!2kOOjlG^6n=Cl7eAasV#x51u zGDOXwfER;ut?a{P0m}tDyE^3dSnePI%GbMEQp6J=y;jN>>(yi>l$n|(#!IpFQ$ynh zzQb1N@)xa$>A+%X?z&AUOTWH-at*l^m(L1Nw|^7P6A1rcG&vbS&J;>CFS`w8Q>g9> z2Y8u<2%BFo!q?@ECHhio?p>(~uf*C$p38-6L>^blVt{=Ka9&*>L*;|6RF>770!GzJ zRU1Xab0sa$cbUEKRoGyjJIofQIbN#@=$9YmCEjyFIn2?IWZF<66`%ETd9pqrMr0}% zKVPR4FR^?#yf=iczx>)rROGfYz6PMjWSd-?v(8^zmPjrvJ$;s`|RvP$lB0Si>N(m)LL?x>AS&2u7Zlu zJ=hy)Jdl)1MsPh228AB{`q*?9)TkCLqH#r%|NRO1Gv|NUJQcEY5AqAhwCLqX9YFI< zvwZ$z^!?DzrjMR*c#`IJjq^=_GpLVNY8geEaeIff+oj=PY@ei+vX<$LrHgu>J{d)V z1oDKhgoP{LKN?_@ZhbmqX`}HBfk%zuT~#};Q*T7<>C{W=fS00^?v5kEp5J* zM7fCO_&dOeTM1MQOudVj;QgSIMy;q-MoGvizm%uAS7^A~H4IE4q*YvqIbjz#Z3=!W zVI`%eXB{r}oyOtz@c)`c*#d!8_!VoobGC2Sor<@mD5+A@F`wlv%L?nG@BK|WH5Qsv zfb`&x>=IxkUXewHgrcF$dT7-ic29FjA_Ri$YxmIbzyjeg+>)k^jpU7a%{&@#2-ZgZ zA{enM9L*#em|!dcumsOs>M639D2?UWD@9fuG_X;?F*_RgS`7F@dNLVe;Ab~-8iMvI zSfgiVJL+3m$^%&fEMr~z$WGyv$Z&o0px5`P&O$p;ivep`#olM%UxfB;{$BM^HLU9$ zp~BgB@sEFrS>7r9<*^n!nCIh7WJXi>LL-w5P!2@u-TMA!-i_@ymW&@yUaty@(BjiC z)vuuwFruy8+NI_m*`FdX3^?48(wBECQfbS(4MftwYzST`& z9FfxBqaHf?xxaH=iXCBhSft7j5Uon>(`u%gvbj?VAFn`(Z-nii6kXm z!ycW2`n@jjkm>dYG01#aH`ht4kw z&}srJg*%F23Is!zz4!pwOp%Jt*gpM&ST^$*A3qSALw^niYiVc2<(BJ{?bcKAC5-^{#7Vubvbf+1vaAy-Xt zcrd#Vczp%0{lq~>vLnNtRfc5YN9z5+FtofuSU-Vv@iy!sb`oogtQ5opoSL?hiwg&i z76O4!opkNs)mqozMh<46vT|YvHw0gF2;Fp){?PpmmbJwu9r$3{0%8AXz{8jS33LRf z2XIk94D86c9e-hv@%VeqY~c>?+4ue&+wNEkHtWAK><^(o)8I9U2oYac(*;41`@1(R z3Ry~ImCLPVq%MFe65(8c1!~TYwpeZ#nq}uyd>H=$miIMOX-vM689AI-XsCB}U;(86 zqBD~v$Ep#lXb^%`zW3=_s73c@0zv(2F}H`Z^<>aq@j$5EqM9eaQQHPy{xI`Nb2f7~ zZ|Z7$*zctYi#)n`b^}SfKzF$V3YI>;lR=l%ajb8#IYVv8l@N4BUI6)&OH=JWH^)vR z9>x873q^yab16qhPeJF`;Q154@-0Ai0gNCmD0w?T zP~lypLHgtF!(!e6(RRMS{SDBh{SJ(Pot>=LEDBHKqHTgq@eGNcz$@Pq%`!y&xxwUL&evHIj#xxZFO2*Efbh)HJZ5-2=o@SHg0z_*fS)gri zda>gd)h*zOr*;BAoWvaBtz9CpPB{!70!bPynBRSqO-HB!23`zLgOps?=Admpr2weuufn$ zJJ3d`7%eq>4Y|xB>tz_1cHJeYl2%FW#aJP|4`N%#>K8?7``xHke?%4wJB~zfu1(gL{Sn+PKQDCqM|XHtLf^i1 z|EuQX&sXwGt~`w@_53Sx?w=(-c)$fTr2khP4Q0wz8Ox{hRG#6kQeN)|zLd`^YR#?f zxsGwt)k_U{hCr{I|6zDOG5gj?1JFpJm+SP9N;Fk0crN4mIdgIU(R|dA{a<7=?a|~* z6QAw0>w~S(4NtAO3;X~r0wiq(b=8tRjkmoj=Bi3ky%{Hyvc~_jxBhQCVdV1*Bxi0O zdU;d9O$#6}&I53-z9CUraB3{dG(qMc%_7j%S18$w{r&0_u@+__jteNC-#=%mC%7W}7k@is zk;&DrN_8}^l9@J9ZcX9LA-x5k-ZzA@%#=TQ=QZw~Z^{5LRDO z#1-&x^_G?{hLjg;K*{mWrBOcNR*ya&4!p990gygMX1*AwwC%H~HM|m20o@r;z)_iR zbVjok5Af=SirKHat&LRKfhTB7&^^Gbf+W8Mu>P~ptHE*t-rDegh`j+%ba75F{W5#m85YPcm4c8W++&eCTa@bHh^Hq8>Lh6 z0pdW|O13u=a3l402|fmLYAtX^-PX%2Gfq=^Q$)c`)_I`6v;b59-PGWBOwYUdk10M% znGg0rrISACKtBH!$S8#=V8FY`>R&qm!2}3x*=cSovR_R^ zY9!fd#tsW{=ube~KlWJI192WNis1f^uipV&NW1KZ)6+BqGjqr`zivUxhqOzStscuG zVH7ZqKUZ-q@Hfa*3fI`Eq2+S2cz~?hUjE*gbb%LE`7FVjuIQTF4AGmt(oOeHFHw;2 zZ3@ty7kJwa$6JR>?ABrAIGnEtUvB664YB~1C|NCL|G_gqv>=4I#i_Y|+9{rR@8FMx z^k4ICrL$(aPC?*;dvvK((}qU`?j?#q=`j94xXH~O?@KUZ}59PKPS@vc5a?#)k6)JYKa4o zoTT$x@)inwf3W|34*yG?@VAQibo_r&P@jJL^6#|J>hOS60%*RGr!L&Qn5~f-19mb3 z*7y7pp-cnpJ5GryEWo*kr#YPclbUc&IH#P@;NT$O$(Q?X7v$@IQX)MUcRgS-pkGjj3FW&{+Xp zDBh<;AOLs^_Gf&I@A(}jv*epD@~q;HwuveKh}XMY|4yE#gMk6s>R2NPkn|HIoP_}9 z76W+g$EHoIJk-!J-iM^^sYZIas2bmGJSHzK@qCQkXl+ef+;s);yjhh_l5m^JZ*NQ7 z7hrRvb#nX8Pg>vs*Z;+8SFijI9RISwV->~V>=|rg~ zOZ8yjhW%n^%}-=mumMpZjPS*x)V5o`(rqri^2U6#DaJ7#FP?H_i=K$$3;?6qldZwI zsn-}n_a0ytge_CK6_CQT5}fN$TT_6;{nQ&U-*W9;LYtNNi@~}t#|!fx)dN0iIs_$6 z+$S3iCZ)OEx8a5E@!;CIWMXyfL(b;DPvoky}H}UbQq%jS@Ao-U~N7BPPUl#{I^;ZYevLKf(2KJ6o zJv)7r^LYL0%~|nXV7DeFY!nzgb^6qpG5XJRE%3ga zhkW-$woPMYo?Xj-{^R6lR{3i|N?x*FCVHoamE6Os?h&mTCdR$SuWM>Fg|qVmxk`#p zfqJv9!ntzS8Fi*WuDgu~TpRL|=A%Fio719Owju9j1!sS8y_{9dezJUJfb*8@GyeSN zkD0AldF%J?)J5|J;az`*x8Z&7_y^SUNxE&O-16B%@2{74W-Po?crrh&pzk+ZvJYaw zlEXD)wA1$}IA6|u-9cPJ-BO#H7^nHbuC!#2>y$aKh+UZ9+3~-<%hLbOyw>H*A+%`` zwEuk>9uH?Xo;7Y|P%@WvV{<)gmd3``l6B|#F(lg+gEM2h(lWK+ zbVs2#o*YkeJ8zMA+-Tz#Nbl<#5K&YO=Z;ZxM1J>_DdI}v6(7=*ZcHE8MLwNJ1Aq_-Jf1w7qOf;vD^4GZ|d;15$EbmBUXiQrBi_qWP24GKDKbObJWz~ z;b#ZSO&8zQd%v~8x(86J$r@&ZROes1gv^dc%&>igbx6hk%0&oD0PQrk#{R7rnkL3;r zCSutuE_AJ_nqAuCC>42h{7!Z>2`|BFg*`r@)wy$ar23EfoEQFZX6c*t+ZFG=V|J@S@S_DTF|^?{v@ zvz(4#aa;41Ul`=8WB(kCCP(tuXF91XUz&3?Ni^sw17Y1KI2+2Y>&Y<-#jyiC+M(Zr z;hZF#2kc~ob7yG;Uo*s+r811qnteN2gmD~9uiTzvmdS&mw1_|YC}|0e81NEmo>3-yuoh1+xMopQR*KO_<(ijJe2H|m#; z7rJdrMRoS&g2my;d1P`yDDo|NP;Tkok`s82Fa(kj`?(Nr^=4cPc!ds}^6E#S<4YfMov%E$wSen{1_oE!F73UO+M$ z4jEh*Z`VHyq`Y&I@>J=L3tl|~M7$A2rwqEx%$(e)8qY!FY(SW9drkeU{OKUk{l(z4jyc_{j_j=%ZNMT`Ue)6i@)4LT57f+`#A2U=w@3;Dy8i{5Jr{Ci3 z@sB4c1A5RaI7Q`ggXUvlzbBH}V{f2KZx z&kmE^Ycw-TA&yTE$dD=c6i$Q2g^paBM)Qg&YeihVc2C`il949E^K!qPbK~J zd2K*~-AG^2$L}PJeovN?cOgz)y{q#0Q@RGe{LtlaEDRPGQe3_PS$})6`tw%X+(5u$ z)rhb_=!BKfOvnf<=jq5tncCwV-N_6`Iuh4!m+gsUOW(;8FFm#XaRQtUl0GA0eVMD-{fmsxe*Kuc42m}(+TXqBtN_gyZ>q*qJ zu1XpUn=u^a^#kp4tZJ0RDs52lBU$lZt~_snX9XF}F1aYbE$)`6z#@KfhaD-#K&4P0 z8y%flDfnoJ&+U!HtnzQjV(c!HS&dd{2G8`~-Go2#*8gYLz@O;K|J14EbUfe^{HGJJ z+kckz+6_yMd^Xw55}h_D{`v~<6(ze3_x>031yuWC#Ue~o@9$i)Y!t;fJio@^S3(GQ=D03b}2 z?4f++_QAav0Yffw!avchk+W;XUn@lR6b2CEy~I<=SFTH{0p;~o=bH7}gi(OWf)pve z)SmEAhC^N?$ZXnQ>p$*Cj7!p3E9*gQ`juAv^iv#UVW?uAFX|Z?ja{8@8~mhI`el8I zo>j_7%6;j)Ubf=Gmi_ttGk+Nv4%c{U{POXLSh^tRqBX3Zn8Y>HVS0S8|89`}I*Smj z>~sp^AM1}yaxsFGG4v+_@CQV)4)hOQTN!--F6D1%Q}=EpUJ>daE7?P@B090y|ZjTGH8 z4C3$rK?XtKrdK`xD7phK0-qL;m;N%dXt)Qs7ova- z|3a|s>VLB#`%46@*+0xEfFIMjYhH0=;Ep`+bqkH(JIN4pG-)mL&1IJ_MK#nfgH-}8 zlV2#;v(wH(dP_JDzXQqW_YHkloogZ9J6{zXS-5ay|46UkrFi1)3Y&jSnf^zB$p&CC zoB=T4O@>=cyf6d6uE;uw1?XVHmi_l9^M|u8CrZ5R9tXkzDr?u19~@PvHH?9m@;R(x zrR|B+xBd$P2zF9n2yqWP&h&2QaG;9zT1A2D@VaN*@{iLT+x?6D;%Hm#g&niNnn1=u5dncx}z#Yo_A z55CeKQ0pN*kc6UmI`->WfH}Uqf>$OU%$F5{4=9_>ea<7h|E)dPeYb^)O-9@%uP*XN z!>JR${*|G{EpXFfDwN?bXBz3tzkYOkmWR`f%bE6{Z(l%YPcV7h`}Mm(1`6ggeE(dR zi&EgS&Hxw1uV2X@)w`Edq(J%Wo1o)Gk(%bAM}K{D9Ar#s|6cH~dU^R^_A|eJbMbCq zaL~Wk{a?9I$+%s~6;6|~y*xS08QPJuN9#8Vz1FteVF=3`;U;L|T0d4#M+hX+li{Ch zMl!932iPB)4^a>U-Z3Tk3J7JWXmsy3FCMZ7)GwvF{dhD~OaZw)0{nY^-^y*6j=o1j zux7TC%qxf1*Ln0D1Yw>!2j_NKRvc(4uomt}r6+gT@BHcV5a;Tz$BJZf?vQ#!mCacM zuliK@6aRjT{_LqHb~XrPl0E)Zkw2*=5nBrNWs`A13hGtzsg_1;^0h}*q`Ig#-c>0&T4^@a{GQ}=_A7Z^=i3S@vl+7$nO`p87jB`xpr@!pV(@8 zFh1n7pTES}#98`|Hi96hertBR(g3lCalm2lJU1w?K)$*3sZ&<-ko#e`eYJ0gvuW#YQKI0~%`{SKXab~%SoaH#MS}eKi zwFb1)@4ggGmUQKIO3hEWZV^Iv;pR1`8eEO9XW|VT^`X5sO-;0YKOetoZFRJeF&^mj z&911%lzJ@T2Y1(JCNPIwA*a~wd$ZJBTS2~53Vv2K<-5H+7(&OUMVFl(a`OBmHVLQK zhNgukGM??3D$!2>%4gA@C{ZTnfc*kbi~&Pe)yZ$P0uaUq_TIV?v_q_Mb==nEfsaO| z3Hv9NXg=6SB|1;IMRRyNj3I^t;RKu(UmMaxgx`S`ydIlhx@GLsgo@Z36gCYvoUt=y zzho4_VmQF%`p#cFdz3OusqX2?vQ9qsnSgXYDk#fw~VBKBD_n$3*>gBY=`%7-77 zFhBrMzH~R$djX3=xz2PHq_t7vsuQnH=_Iv1;4ig`D zd6<%hP_62LnUKql>x_M+&Z8snUVvG$rb+|3JXfT%Y2{6xb6h)o8ATyU3ZtXiV^Z2%Jb+Mze{D+p|>%!7SoT*iM{ z(-`6aY*(gEF${uTlzC$a79h2TC6@PJSzN7t_~K(rCMXtGy}Hb4Hs=M9Z#4K6y)b6M zA(=kn)(kECEw3(iej{P?z$uW?eh-$Ga2k4nBGe+Pq$9TO0~j1}Ot!wqd&5NMy4a&H zF9y2WK|78Cu+)c3MwACjtc=kKe4iTD=MlLy54em6JjTDA@T4b2%2B}q(En!hL~^rp zmGh`9j;Hj^avEQ4AJ2x#ra@{WumJ(@^~bg(gBcwgIH!d5>;dhu3{RIZxG_j;6uGH! z_-<|Px&DbFMx9OeYXc-}MJ8^W4*zlgOY6&Hmtg6RU(1&Q9R0VO2w0R2CvnE~P^e%@ z@vO(Uqzs7aok(P?{Q2lY8ztbQzxQmX3O8B;9=&Qo2wI?(uZG(nQ|2^$&MlY^XokhF z@>^pI2S5#CB0L&;R1Xr!nfID9pU0HczSb^jEvzB!xH7scf{~S`zyi$M0as|M@mZI4 zxYE59{;})s=U#w58;iZAzncL-av?`4zn!9`ks1P2(Jn3l&uGS*G255>p7tiQu*qV` zN8SNVU(xy=N%uuC@hh$=Eihqn{lAnT%LqYTrtIVtxytg`n5seUMKKR+S>HDwak zzP@EZux;4Fjq)Wus>(mAxAOWN9QUq{!ELFV5G-S`O~9=YdZzf7dL3|!Xg{int=;Rq z+G$9l@`gm=RG5QrcM!V>4_E-#?Hz~qaz;qU@Rf9ljz4~w!*cX^^K?)#OM_K%Sbw2i zS~BI_$PhG#FrJDzgeQQb4=!EqS`E!9XA(9Z0ffa11c{SHZu#7T232sTyX-f2oL)H$ z7Q2=K?su19C`C;6;|1M1@Al~q(^->+O5kYA=8!68lLF0s*gPVj`9;cYIVRn}VI2#{ z=35!I>VC)(gAX=|!$(*hv;#8{?uf!_{d%ZJ^3LjDEI^;~#TKwt#D_(;yxZHNJo2It zNXey-5Qp{(YNxd=V_jL*VlZQ1_Lc4n)0m%kUOnTeOKo6-QrhW5#b|69eRe&dBRgr< zG+=(;4fu`)?oTXUc9N`Sc7{}H-DzPopOnHc#E(}hJ`FEu)yPlbNLGl39hA$izC31u z?9%eeTDTzY7{{hGLvTA4EM^{Jwbw#0q3fW&xej%8--g5De**CHqo5&arAxq{VYSJ&MR{T}B+RB@Ae#En*8Dx+={ ziD6f`!ryN@|7tMoy>%PM*@)KBZARvlkMggKpAFj4!EwZxlX{X8;(*uH>%f8Q=!9Ae{9wq$k23{ z$P(N#ICzHfpWw!2K~$qd#1_Qe%)6rOZVYMGseMmH<3Cbh+Y`$cqa{W#po(AdK?SiH zD_l3fmo66@Lfw(Hz8I!&KoL_nEi{~pFn@K5YY4FGYoO)jOZZPXaYy_jWfn&bu|j;) z&Nz><{E~9SAn>_g0&66KbWDdL=2@{UiMoPhSZcTOOrZTI(=k1oLX*8=HlcC?=oUlt z&D@SZ3xz`9Vx&fNAah!I)%-szQaRvR2eHe)z0V{(NCYLjzgWK6f?3Ebs{J_Qc5|=h4Yd{ylPbQKZpOLo{7gNP z>0=QMOi&NS&X0Ut>>78HC^DnP(v8E*kdA|8j(^2yFR|HiCI&RGq^87CPOJXGkrshO;MS|EPJtExzPYj>T+ zXfqt?=foY5+g;4mz?-C96`oggcWe+?DjH9<)pM;3pa^9s|Bu!#E4$fO7b7KkYb1;O ztlm+6;BK!wEXg=X+XClsrLY7|bYG!gm8=HB$p99(>GAdqFZV;|zWhwu>e35zMWv|e zqE`o5I_9u#6U1;y$7YjZu<<}HZVpgA>*SP0>sduX9h^8(rd^J7=qi!N7O|>5O`xA( zG^0CrO8}cC97r?4ENsldVrEC+TDklcgVrB4%^s)KyJ~Wr_u}9*<+J%Tdk@) zl=-^1cvNq${pr+^{MpMtx*@8g6gqF9b^ZtzO5Sr1yWW`uW{z1PU-Uc?t=H=5^{}AguV&*Yfoj$U-p+znf(-(>^UA9Y~h1y&ONsa<+gmK)=RG3dV%J@ z<+ZYUy6nO!E*;ynA1%&=YN&MH!z%y9O$~i=xDHkX%(&c(H~g?Yk@6x`VHd%1dHcLE z?kBza7c5wX(W>zG#H?otfVWw>Nt1~$)sUo)*;9La#%dT0bkFnSebh`(eB9Z@UD7h~ zP_7)0fTRsd0lLF=b8YY*cCrq1EB%<*#5}6meGiFiUJtu6PK@{CN>fL&Q@2~%pQ6X~ zD8k%~** z^MZ)c{(U{!$X?$UDP&iiL7F1BRINk@K0L=Uy*=6N-7>$a7~+&$t`;wM9SfD)-boTe z!>pfKB{g0d7aa{zT~Xd{qNjST<(@3p0U}>*9eZBUzKlIPD!qBm%BI=7E6U*)(kN*m z{;AI?u+kr!s$LE?Zkkvh5oo7iJf@v{Ued>CO-|lMD_^@mW~<)_@bPuHrU*1F0b7Ka z^vss8*g0x{y7-aKA zn}tXrI>o*x=gjOngx`3MmcXm>uss(PySF#BnL)4_6)#!DIQbw&>e3b-055tyvDbp5 zg5MFtDL*Qz##H>^u7NmMKauOYykHOx_Uvpv7-}vgK}jw7dMi55$G#zBMRlu}rf4Hm zS%C-$R7_O|v)adnjml^DGWYUELOaqn6FODQos#$77?)?ZD7L?k28+;MXt>TcFmqL- zHNlkMPZ*G$!m3PuzfSDag$UFz)^%%EBS4KDfy7YqQYmsl@gVQAlZJNhc+g$xvz$m! zyCZ4#Uyva_7Cu?DF?lzD zlzU#zzgoI(`g||xAv6J*?-mZ40an08PgHYH<4E1xH`Uq-JeEFgU8_GcEI}2EHz6Sb zgbiZ%RpJFuz};PQC_wTWt$;A4$4_%lZim&K^$R+8PcbcuFEQ)N;g3SjxQ|O$T6FH6 zHna2R8l65OK=r`i_#8+@WJR#xc-N5GC`1Hiz7l|EkKVN#K}O;cfzTqo+<^nI@m4y! zvx>SjqGd@N2}J5>ntaaX&|`YUQx_gA;|j~if@*63VY`@zo)28yv3tVKD>dY_Jvp-D zL^O57#j5-1t9mVGyYKgq-}}WQP<_OcchU9(S zYopS$>pr_GLQ{12EGmyi)m6lOw(D~+iw}MXka>&(Ge4vQGc_T`hwc&2F3H^$JQ>Rv zWXnc%kESV|kYx?b^n_mbh}p}@4f?q81+894AA5|~z-6dh3FbeLu{VXX&3WOKKELJm z&=9QeL8I+@o8Z3VU$&!{)4P;cc&ewb4mZ!r;AHwL($AKJ$x}u(s}fTz(&NF$8yMucLrLb>>WfF%30IoTf)KBA&0;&8hu* zR+r}37|=Ir(G~5>(%kHq%TiCC4_74zr?HnPV)&$|1&pj^_GD?FYrP+YsG4^)^JrAu z?`y=wz@^Fqt}^Lta*Fn~+huZ2BdVSWlCl)#;%2M^`zsMVp6m&CN6PAUJx)u=z4I^c zR0-T%%iA3)Qd-IuCwYEt>BpE)Ob^t`S(%5n-KQz)<6&eBPN&cWu^gsXfkMcnauP2Z zrTISA;hAdjd{gjH`!=yyz;1Xih5ZbQh!LDZD6zRA0soNVDhc`KHd#Y<3e^W~hfuw|rgoP72 zxi1t6AFR#*sM64rvj}H>0i*jqxVeKaVSk94JKgkEh{kap#rFYSDn832H46bv2qXrnT6tv|nTK+0K}+er*>I3X zKw(yHg`&YP8?Fq8mX0JYYizi}#0(7xuVncV>bK_3Lu$$IDkV$Yc4zj&dHJiz+MYu@ zjZ{g(h>%eO>2dx`j95iQh>IN?Dj;q@BKR3s4YpdBhAO7eXvzeDdz)-d9h{`d zLWk~s{i^LncY-z8*Uo*!i%mX!nvCWDqIE7C=kq8n#ea62#7iq}sjlLDW*d0km&1E# zi#80_-{uB5glB_RfED%kp=vZXyVPxD)&qn_W4(sKuc|&gcpBBf&zZ&R*yBJa*N3)0<1u_h z=IO)6Q|Oulq3ZpX#O1l5y_K!x&S|&fNAiK7u)OZ0k1!slU;%bnogVUql$ereRDHNM>92qduj5+I3Gf920tV5NXr+m5y!)9Wc# z^_2Kt`HTZ9Jy*t)aM4gMNxAG{@VDSF763pHh3ePd7m!B{M|0KZ~a-TW}9I|K100tyE{%=X{bW zZf-?y$It>iXm+SZZK)6KsR3bbS=#iH`BX43v1}Ryl=3Kj<`D?QTO;d8e#Z5)j$g{} zyDZ#LCC;B4+uO+b>poP)iXZ0A1T(L)y{DULk3Mr|XEs4+>TGhp48JH>b*jXJRuKBD zT^IPN$nXn9U-a3SRP|lG>CgbK8(7WTO93Ns3&KD5Kta0~orRuHsqV|&656Gxt?t^* z#L`#NLMD#?7AUNw>U(a18ol_Zv`bC+{9Vq~|AW$ldPSgS))9e=5<&m3 zix=QC{?AlN{*PYhaC+3u)Z%vf|Ig!cwUbKkP;tdw-EBCa&*BXUhrkj7@UHMzn}_;^ z?oJ4=*PP=4=Zd;%9!Q%}y(bAjmuN;`nh8oi{ksw+<}Fm8;JTk+Oxlm&#WE#&f7{@( z8x3Y$uwk#VF00*l9lBmJ5pbdCJ1nVss$+e!GXPB;uoH$L4v)f{x;2*S7Lz}5oj+dq z>(g#ePgOwjwtBXWUu>*|I=)1)xvst&J|vkgPE?s@3~UWOA0_P57c{e9$~&0ga9H{% zZ94E-L++E-r_nc1AClkXDV9i-EJE6e)6#U{#P9lA&-)q5{6qIuYa(&99Vsl!Z0Nal zpzTm~V4-_D(*vdbH42kgwpi{U#FsA4OEp`^_+^Xg z{E5k=P*2QPV~qn|B7E{7Y%6u&AqQ%^cZc``dzLtX8!f+$Y8%>qM8Fz7X`AM#TMo~@ zy*T@(875v)vtQk~jOJ_gag>?BkUWn_3>GIwpk~_?FuOxCRquwf9QNcwoY1J56+&{h z=^*}w=i=xVfkFD9Q)&4HdZ}`wo~HBWIfuN`A20Im<&~`FB;T(!JruRirkxI1lwBDq z>_A;y4N#FS9L?_N*Ap4||L+-E_2gtijo^_>fD5a^OPj)}a4W!dMmoIG^;Iho)GiR!8 zq~EW!?}pYzB-#k@1Siw~o}xF_EI|UGVjdlnh&t$k3fp;qIS9inP8d3Q_dN}BI-VB8 z-yt^+&hm@}WSbT=nmed72hqsm2`2^OmpX zlevfn{u)^1)*xq{#~7#q(hXIkud1naLKxF64?6d>&m z2gxj>M{u0A2TcZr#H*MZf81Gi5Kk47g#%HaJj5`q>%T;kcCW_ zDhoL4yPSEULxUB9DQ<+H-Z(OQdwi*C?b}G*u0W(#pu4n4T1`NJY}c!v_sp9%KSL$7 zFRYAl9y~IZNDU_(gwjZ}|GMehu*vU`g}SA(&s2H|nxwG8gZXFtC|ziG>fsiODbAz5 z_F!6CS3h&}>`09xu~1gU<+W+}AQNqli2X{*TokC-n+a6My!(!Oys~XtQSotEmehjJ z_l2oV(c#^N6a%O7zJ8(BJH!>CirvivH|g&aEZ{UnqDftKAaj%|K=w3oRwg}5)m8!8l(G}?pt7hvBOn3NebY=y8fA@|K7_ZybQy^=gcykcsDpGUHsmzeGLoqY^EYe^B8ykR;BW<#= zXz~WNI95#)5`ta`Ue!x&( z^n1Ah7~AB+{|&}v5XOVAl)77NW>(GQ$u|;L-FdJA_H49O*0A%(Y-+y!m$E;FRiG-) z+?>ty=6)#$!}V%T{`{PGtwKh^Ms&+fR#t2-d6xU8^W_)GfRJU?Tl+B@K)nl~l?Ay7 zZVbrB7*LEI1iiQ>!hf&Ol+;w9gXat_IxDLIlsXuovls-$AzMJVRKo$`fFmg0i(9wF zl~4S-zrdMLzzjL<@nyyeh&sew#=n$rrqAa;9tMSTlv<*=%fheeP`|DKm=!0aC)NQG z!YA>T_mfxdfYXBp)j$KF`Y|SeJ9z|W5jJsCIMMj$Co_3`8;UUq?5_(5AUETX@!RPF zm3Zqg7U6I-0RPDM5b5=sbTW+r0K{SGXJ9p82z>F4`=7PQO)FQ^RU1F6V=a(nzYJtdydLsJAqN@jp1%iF-uRsW00a`ESHCQBO};88RM z9Jjm}%2FV-62&u&)Uak2md!yFimf91jy7$J~$D zI#H-vC`VlU#MnR*Q6Pd*0-T4~%t$%}wCI4sYW=+VjVnvVY`f}J zVg%+6hUEed{D!vVg2DsVChwOG6e4~md zWT#^S5H1a2uby8Bc%@m0xE*m78v}vpOd97<8~uACetpqASvg&v+#u*qJ2RTj{yNQHJO{ zAQ6qPG8Jr7#LyEMzuCPy608O^T*aV9d(kPCOkhwf+-{4%v7D4E^G(T3(5Dc{dEOYu zHWYw2SQQ8dtxa5rmY`WHE?RD5DCI0=34uEREFV5T^N9J@6l85wd&V zfYZJWn9Lpo+Z^*$SwueIp#U{6Jt*+%IR;SO2MsSifs#nok2%m@gO@V@iMbonoefSn!6LkVTC4a~yLw zk$!B~9|cuqce^?fFztv_vei}Y3o&#Yw+4(;vpl^=F0nmeljqOqdv8i0WM60Dz;JcB4B$Q}R*CAAYbTGcwB*2R|QR z^jaGH)Ew*v4tyFOG;sl1lsz$@L@txF^;`wS9JkLp<+9`|m#3)?DQmURrZZ*PWXA)V z*$>*7FlX^HI%4zVX{&%5!v+B19xGsVKq5K*Www>5aD_jMd(ABiriMI6oq8*cZu)y9 ze;cdhlZ?cCBPM7!4G;9p+_`_sv18YeS~NIS9||l`w;3nO^Qfg4SaBA;EV$2=#Fw_= z&&aJfgVv&oKQ;7HZ2UliyCWtnKuBg&h?+Re`ws{0*hJML0 z;58BkqsWTPw!bQv_vk*;qwa-%2AQQi$xmQv=cV4A(LukDxxr@k68Tk&Z8?sW?tY&) z*w3aYMcE}-&B#0+%o31ejyLc@p9e2MATR!<@m z{j4)k@O_mjJ$Fx4fliDX2iPDMOa9+13@ETYnX1DX#BTHO1nRIqUYP5v>HMzPywX|P z_n2;Ht42iX(&5c^ad3id@7U+wf6ra<^nHJ|OTMst$SVQbJ<@Tja zhwh+7*~N!(8EFVs@f@ofUA22F3OAFLo4bSNE5kvrr}EumM!#TOp8Yj=A`BY0oF;z- znlqQ+M(?)bc2dUW;SBD}h5;-(cI#mrHcO4o($qUI&+tu30=UP}WI>{}HO_l!5N z2lF7cdNk_*GX3=c0ifkGGUl2D{@HF>noz&vnUH(y%22>Pco@5?P1zlw$|Ohm|e z%-}RXui{xHoE)>&lV2IG>_YfeqID9a`H~0=HQOVuGY^@fQm*AVte#B=g}rasQaf#2 z!8Q{@4$OP0U^TpwhULk^`?9-}XC15)H0s5uUmJ&Se;;0>-V*tDQ${gZf}6f z@ZfY0_+!Za&D?oqCPg2EQJ_3$39FlVsu;)ci_ZoN9pL*}mkq-hmR zng5ssz)VL#l>w)qBEMlVlD3FXw-Cjw=9!`@po!Pq*rZ}62QZMylYa+C z3IN&Wl=nLPd?ZoEvzE39TR<@LTpm$7ZN^*eGw10%@ZzBb9JefkEwZEK*T+11^-}p) z{B?Vo>vsqwK`u2()^G&{t40-*i_TlVpy*7d=o!T^ah&~qwSPjfM*0&)0Ck?hdM;yo zo7Cbitb+D8=6(|K{JPe5)rsX%k*0#d( zOV($Ezp(%P9Mu3-r%9d`Fma*^i++Xjoml!y+@r_Mu*N*E<^VQUj?e-TZ;`@uNZV08 z8#ze;+uX2`b1D2t#_W-g`V%~++w?)e*6E0UJ-C%OT5X+bQpN1~;MX8Uu9sXe%Wbfq zsr7sx@S%_$mv!5rwE%(5urlN~DoJWjsOy^-cXFbQMU?>B{UAVY3Ezs}8=)uxEUf?P?D$lQp5=nhG9q9)Ny?$(4#?1LK#C`!Ta{4x-VGxp!r00 zThX(xs?EmqYqfvhGqA-#tMuE0Ug^6fz>rZ?5pc+MSHfgm2fJ(e*1pU=Kh~yF+$EqLc)u_@?!_`c4-V^QxNdpEg5l-wUZJnu($7~ z;7eIcuu4BDzX>M&P5jONV?1xdtC%Md=AjQt6D6E0uJIccy3cf^mVIm<@r3G`OaB_o zZ!-F)iljDY7x;1-Hd8{Fw>aNTf@8-Xu)jJ{xQrDx%u-2<*g_MAUCduapk9lqzv%76 zBQkVgUqAzOr~n2PdxAo3T8UWrFnUz&Lg5781%4P(eh7VWJiz*KCWBtvXw~_=cxoVeuPZ?AR$&BM!#o<#SbTLQ`p;ubsnAyp`NenrV$7>u;5Yi>^DxZaM%n%IqiJFlUcESldG(< zH$A&WSp0au&=j8aHvLy}0JsLXsP0ek;fh3}k=e(QJ?qv_)17MhND_|k|H^Esuot2- zFgJ{PR?@?iXAu9Ye;mI$arz%ALl-?wQ6T64pJE0uN&mmB2c$Vt>lIE3TW+$J6{V1l z=||KaAx}FO0_6OOf5aVE4Jlx0fNX``&%`_#wq_HzuU3nbY877@a(JKB>GBy?E)yB^ zud1Vj$&9xs;ksuUAn6HU)YGt8OTPIQWg{+xBX(6 zQ8TQVDx+a3%P4;D2=-x&Pb2e!^bR|D^DKbxN5#Wx)Efu<;nJR-jST3aTxHIMp^t@E z-o(dMkHQiq171ew8C}A_zar7_t!J4SyJi!^azC`#4sIRrQNL$(n%KTcKx3#{VO8_s zSwp^T@u&LLSa7Sm<8B0eSIK)=_Hbx(V)xHQ8$*diRc#T#cGHAbK$O^NX7V2^AIs#^@3F zw#VCd1!~cjZMbN!KerepEU%XK72~;JI5J2pI3|P|DZ*zkmXQ`f@ZfyB&;ZE;`v5pt z?yS64aTyA3h3S71XNTYGIVVwi4UhHgk`}jbVDywBY;!#57ALRMa=QwZb|0tNG)#P% zm!hN0A4(-~R5-H;&4n;{EON-{6JL9WpDoXAu z&;f?!3zyMQ9dPEjf7V6g>GHP&)0QuEyQ(K#Z>D2$qrj&00cfxWTI%Lqrmnz>CdC*N z^S$C<@nV|SS^in-nlVQNfE`#JYOuULSOuBmLqau>0}DbCJl0nv&7{z%Zjegd04x69 zrtOVP+T)hj-r|mZUJ^kX>rgvDyFojxdytP`f=1&pv7bH%@>h&DV;l03fRPAiQn52_ zk0w)e9C|!5TjlatdmZSWKR~@Y*{S>IM#Xr`ZXlKNQo9DAn9$MYYfb1EUGAS3b-NQa zU85BzhUjP**w;q0iMlgsE?^ej-d9Cjkmgkk%sheHoRpWjuSvwhhi-WcfrVT#FVyaw zd1AO~+k0!H0VGm_4$@26W6xW0j-?a|@5e`2QtJL(vfivCy0t255_Y}=+^m(^V?oGB z8iG!IG~OSS0EBoiYk$?T*Pzj1$dW|sL^EMBm7&JbNSw#aDMIAAf2RrQ1B72<2f}X@ zk(%}Ihp!n0_G7f^9fs3XfvQOKUs+ew45dJ|-oF$2-&_%Fc>nv7um77}($6GC7GV!M zL|TP3kbWKa_3J>C4m4brPX7y7C+FXxF99HHC;;YcjfHaJLDb*tKG$<45f}%(Ie&wD z`R1<={;~Uam|F&%b3SvcC!H%Z(Me`1kPbMg20R#UCmE2=7;?z@JEkJG^k18V5~{y# z$S7}LL9a;5^|6@x0hzdT&4dF9IPHvM>s|odYEsrhFx#^;C3F^TISIfga^_sV`7V*f zTpvOITVq!N2c|jV-fNSL3*j6x_GFk2^uVpefK>l09_S}$L(YUWgD~7XEaWg&K)(mT zYg4urpn)OCt3;;J53*JyuBb#k9)&kx@&U?~Ld^Uif2PKy%qdw6cq2JgC6zq-O5-q6 zU14~t6D3}oCv(GXRx?o?o?xiHk|IOj?eP8H^J8?5fTruRaAmP90Y3p;dRzz;Uf2K5 ze+XK%MSI&T&SXai(6bU>WZvlbbNp*D@Q{E&{4W4t;qZ;FVlx1)^1;3F9>4=0@_y;v zPAKIwE*S@4nvl+Fv_=KH8E;_s#wmkSz~FMT#@04!M8=on312-8aS8m*un}g=17dRW zPn_3KKU#QuiGT~%uYCh@>_E=YYxQeVZnI{WlwLn>Mc$5=a8Ai<>!EKq0Pf9JIC1c_ zi88((uMlD^(}2`65zdP|IfpAurTr%5xx6TUVblY-^00~8MnX{r{qtDVLij?S>BjTD zpc7{uiCas{3GVC%)qAIU08q`?n910Xt74>3vSC1++gs?*vjK3i2k_q*zyMX3do#}M zggp*eG0<~*z-dG)J(lc&cEqz#top%r-XAiZ#hX&r;G>6!(txt26zHt<0RlL*_qR;P z=wkZ9P2Vj?f%+cdBkpw(?9$BAF|{^x)d1{#jauKnv)x&TCH6>yHmyr03sRc~X|2E& z#u4;e&P^cz@k@9%Q6DgPx6dngPAvgU0Rih)$pGnR6>%XnS5U909>Kk5w5i%bhKQFo zycc``JNq=j6No>GE40AK&cuKRTHs67`oEZa^KhvD_kYxqyi?LUX&Ffi$u4UYN-0dp zGGkv_EMw1_Wza$;p|WI8jAblimu-m3PG&G6RI-dU>tsLo)ce!t^Zj1u`d;V!&hMP- z_)iU9^PJb~`MmGP{aCWy$#Y|^vBRqm+Ea+Q4porIFRnm)FfbsVi=35uP8;;?sOC-7 z#@aSU94q*Es@gZY&jYtaBv+JP^PwDH^-WjO2Z7Thhy+8FUN20z=~r&Hk1t#s(laR@ znvgZPc#7zEAF zRL)jR8n}FCKD6=0qTJOAbbtvvbr*Rq-+jdL3=jg)J%r|)wpsma{=8`W>yZyT?|&BDlrTV(bs)_fb{|H?r1>AfIuY|8lS z%sy$`Jh3gMb&gFS`R1Ie{b;}ON*U0!PyToW={A=&wFLO89K-?E8~F6c+Zovo7f&&7 z3wX+QXkYM(%k16JL@#*0d3TK zjJ!g!-W{hB!CjBHOR*i;*w{rq%*L`Illl4zh0t;N?dv*)n%o(}J$2L*D^RFb5)QMi z3}0c^SyBa=6k07!LpWeaay3+XT6OU(zNSZ_mgIV;L$@-oc+ks^vcGxU7^ZDsnexXs ze@TO=(cOep4kMDs#B9vyG~0cH;5|&@r2s~>^fA$XhdOdtOJeA?X zGy*?T)=hr7QJ`Ov9(b+g`q91Y`F?xG?;n`vl!wX}@^=i{YxKV$tL|mnPLXx>s z-xR8JqI&Fy;>1FSU0_t_n$~om$|18Sn@6Z??u*r@x*RBZiT2u#yG2k&f!-PHWEQG%$tw^_4H`3lT#h=|Csr+SvSck5DpFcTvjU5Hr^KatS&z>y zkIX>ZOoq-r{}OYK#LLk6hVb?jF5Kj!;P6A(%ZNdI%H7VJw&s~R+YJv@&vxaBMs}8r zFFgB!{V87!NBtrVnGB^#VCLbS`M2KpY4#MDIG3#(Z>sdze7ROO{VmEK^tpEnjs=5c ztiU?=>@UczEq!{qJ##LaU|I0#cAp3J>vDhb%`(k6rG}80-0_|RVn*%YS77JCEmuZw zEQT)3ep(eh>o71n-IKkw$G7PGX>JMk2bEzX_HyZG1m>ai{B;j+oCKE=BF_TB>2PX*mDgc_HJIAUGa{2{o<~DofnUZV_b$%U%G|_kM_kw zdOJ;lc?)PS2W|E3AcuF?oV(-K!Ve z*9&$7%9 zpBBqMi7|QsWTsnJ0RU^7ghco>RLyl#EuGmk6veo5z ze_XC{Vz5{vK52dE$LcdL5OtPe+C#>b^AB}yd$p>2D33nLMqXx&PT%>_?@CLIxEFzI zyKR!lhRb30_{I8yQsnGVz{W=cZ@$cxaP#aC)eE6@CsEf{c!}NV^1=H=FiA(NwM1RO zNhxSw#r8I@?*gR#C<}}Q%2jZeNrijXPLdx=8+0Hnhx`j~i%!PLFqUx~0`~j5%Nbsw z2VbA69ANSE;ed)ZBvIw)2>Wt9k{5Yxf zbMw_6o#eZOZRBk$P%pvtDp3{aQ?VI>GI6E=-{DvD*TvWL{lwX<9~cpz=eiEKTfnnX z=L@?v_TjHRdy%F>Gajnva>CpQXnQgGFj@$Z#TbqoGU0LfjzwZUihUT(vr%zq74*et1HsYps)vUXo zmQW4Za`8QQXtNSCG@kktERXL|LHP-u(mRz-3DSrxDcc!y_4ah535Xs07dcXhBI9xw z;%cQ7SDA3){Hs^w&+VpnEWeZjwv((kH4oVM(yF<7`804DD>)E zGv&~=jQXZ%QIpS?rsFu(w@~?M*DdUjzdjdU2G!(Ifz|8g4Z0qo!73Ad8+_x>fmGuN zyM5p#+QlfdJ_;)u1ZQj<>wGJ0v${K-_xX%(j;p(NE*)c$?hKJpbkrUTYvz`g{xe=m-9 zNbr;XQgq&x{&A47;PzVv(IEf!_p=n$S<(n1e6z|;;`rdC8|_#mlL&UUXRS+SyvBdC zD1S(3yi1-G@4Ty4+n^LgaC_?HcJ3?D0{Xa1)>Yhu*m+W6@N(|JVrcN{N`wYoTT>GN z@Yd&Lw(Kr+na;w#F|teT_BP`N&}V5cIzq|NZJGK(yFj#Zxp#uy#PP?E&S>$KzPiaP zgD_ecyI?W882(yghMX#%yvlC#Mj1A+Io*-x!FN}9lTgP-E^d=|ACK5s_8Mh`>ExKf zE2!rpE)B^^KPwlqsVn7G8PmmugiR;sy)^Tgh0&MBX%R8ueZ{!tLDhPudIm88oYzd~ zco8bX6&Me1WKk1Te_P#!uGK*NbLqv?rpa7vDP78SOIc0hQlx^{8}f?Ofg)HZ>s#)k zY`eK$scsQfsa0{L6UH7d5sn!T5f3IA*B3|B0{PjZU|K*8X4o%g{((gkp)lUhrNt$T zdMjEPfuExtLy^(brj57}Ty{^Tz|K`!#qMj}rilG7bpmn2ljn4^{W(plZan3lI9RRq zUGx{IptddO!YZR_w;>f3e-z86u0Myv<9{@Hdf#PIWq(FqH^8un(uv%#uD8GHHP}pU zRH4~kNSFJNKB?1np&-enW86;nmH^<+7nB<9ZJg6H?SJKUxp#^MIq+cGCpRS+fzBKO z*)~9TW{+@IJT=G;V!`A7D`D|dCtW!JN{0CnbkKV*Tz{ex^X$ZxbcJ3S$tz!zgAsN| zQu9T{KVB;b-cBW3X+AqcMA-<)bp*Bvy(AUl3B`#**^AN_6mMU1)6LRk?0J_}L?5^~ z8GdbDL7E0d^$m*YlB`=zZkc#Zduby~i*CoGvQa~Dw_0}Ff3D-Pcx!+|cnr)*Q+i&H z*gIIy-uV0L*#Jn0W&vv;rM(>RIu8U~qr!Dr>a z{5zvLUAcI~E$7NUU!QX>Z`u~pGPtc44Zn1a?~t$XPl{v)t`yzV3e~u)KPFLZIuW`BkxwPZr?*Xvj?MXei_4}NqZj>WsejBUo^a=4Tuyxp5 z1{}*fN*Xa@j{n%8FeGvO(*!MH`QCh}+P4E@d#qP>?k}Q`6&;iN#Vm+7z)d~O zBsuQy)CQybAKC^A{rj_jOw0{806M`CICh^73cULbI!Ow^n4!#lMT71Z(Vhnm!@e6U zW8scJ^7(|p$~}r;I*{J}GU~<}gaR2wAv~tqm{fBvjyZ|_wcrRjD_(2k)tS@d1+;-x z(f(4CUjca0j(HQ4Qvzdj!-7&USECT`P+h$o$=0o677|z5WZv z{`TPAGypSjh;Fz64g?<42#qt>=k>v~Bxhr0sVqk|e%W)Rxk#4f7G2HEq2*`G9$)Ix zfaxpLOusJ$P)ZKiLs$VAR3wDL(}Q>%!HA-u6b{t>m#1&$0BNiTteE5F-K-sKH^I-; zv>)hFx#0HfIrmMKA`7mAv z^~WA4eBgHG^8EU#a+aqQqM1wzbVp2sqKDA4W*7Ov3GTZ}9yrA}3_u;>FSPFrka=2R zJbnYfl~V9B1~t#y7kwrrc2)=XZqJ&4CFuHvAiWew-PqRJ!j&zkmt|t$tf}zywgv& zWa0+RH9WxLJ@n!20WD1V&6pW<#)TJ#{Tr+trZU}Y4azS4<8Ks*&Kxl3GaRT1Q0^Hd z>KWLBtlK1P_p#9JhWP!yE8Tu#FXz_;CG=E5H6DKhZsu}@o;)|9I|~FxhM!qFTv1Hv zXT4_L^*lYI*f-jdJXE+XnhA2Mc8erPt0A|t!(`AnR zqos5<*3sMl@DmE%TIZn z8wQn+oDJ&{e8d(mu8=2G_8KsMWc}V$=+H8+-!;|(21Q`H6)HfL)-9oGRynlXMU^U$ zW!DtZ&(RN=h6@+$bg2Qy@prl5x=T^PyLSUYjBbqtu!zef7mTx;oxPT)df)s@9*5;a64k^Ldf50Xg z`{6J!IQS0!#$)9LfzDgc%5@l(sap>?s(<4npE0egF$NCpX&{v z`Ex+%-`#{@rM-ZPm|qe`=j7ATpRZf~1JLa_0+i&rIIbgXQtB{YGfTPQNVh=-8g0c0 z00*9I`LM*CCSE`w6N0WtP2$g1Dx$dK$4^#)!zgoVlb?9ae0rji+XqLt*+E6Q&WfZx znJbyFr+zz$rs!>TDLMR9qeUw7x?r3H*%!#pZU;n+zYX3ODwe)mfiIROL?ypdOa)Zr zg^ED+ASBaeZzErt_sLZsK+WOyh$1Yra;*n~#m46?NEug?siRZ65vuT*-T8aq&F%Ui zeQsF?7lJmJa|G|0Xu3!D1MAi^*jmC65gLX7v`r3e^)hS0y{F(gWeY6OLO2)RXym|d zmho3URG`*i93Nf@rE7%mzwUCFV2s}JaZNsHuDm$oD_GiJ?Uh^|UGr*ZseY4wsupwQ z9jXz7`^>txZ}zp@YwwW+L$H=Gy@P8ab*D3^YtzU|YcAA>7^+<=K4_Z=d@Pj1z1+G&QGpR|@nRJZ1_6gmjMC>IVO0w=8BXXP9 zNI#G|$C$(v9rJ+-D^^U>+is9+9Ay{i@wJXcE+aZDW16mEU0wo3q}|KNMF$P2K7RQ9 zgQuVJsYp&bcrbB&eXX>E?C=6ocq(=b)h|(@i253A+_Oiut%1uab!Zh9MBJ%5QxZv8 zxIKS>I_?5qe&)AU%NBrrmZz)WK-T+9=1^rouE2h~p8;SPgLAYJ;pza(#IL__2~CM^Zokf{HcD%=#yzl65er|@$&sZ zM8Lpkd0&|(n(LHtvt|fSUW4|38F#I6AgnC{HcGHRI~z)^2ewzbuY@SBPDy1O=Au8B zrYNw-eFEQ(n}jP*6D==340mq+ z-#A`$JnLTYFkI{JCuYW_7Rn9L~$A_zd7W$@Dw!JRoTSV`Ie03?@z=XX6~t?!4Bpu zcA2wm>+Ffk{jKr~4%86T@|U+44MsplobhQ+#$j&wMaDFQZ^#CG-3v#4d5Ik@$Ba_w zJFDb11?h(kJtt=Wb21+7FjU?TR(#?!H5UgDU5EHk_0GW@)Y&z1^5(7k!Td(O8r=>n z&E3n?l1Ttf0R6c05^MqA1))@-txK$=^?hhF$-P5mb21m*=sdm8T<}!<8LNu3o9$-4 zQ=@Grd7AwbKRHiodR*L#T3G^zj)B$P2dDbD90VDJjqz1a4=T1NiVKX6tF-@n77h%J zx>sRlKA(CV&rX4}oS3_=Dr)0Ho7vjk`?D1(cm3D=SVAh~iza03qG$HhNz^JpGN8lR z5-e@NYxzUJs>A1Zf}X3by@n>6D(?qA8*OagT>u3^aeSFme+bGxN3F><&n(IUe|YB* z>t6AHnMbD3SwoNN>`t=xu8j}B@SI%cp&56h@ew{iDi0MZ-RENkt=`9rHHkvyi(}Kr z`5i{$JZ>*I3VzfD=c9DdzBeh4*s6e`HI9Gxy8rm>UwX}$k zUaJnS%uk}}eQzKuT+k?sc`s3M6 z81M#*TrRsZ_)A_2&p;r3h|JzX4l5dM_v$t@&iH7%&@-Lar%r&KZseqaxEV2|Ki#Y5 zg4m+awc^MU2l87OP$IIw85cQSba-r=YX~N>|)*i{4||BO-3}h&P~$-e%?pr zqB=^bO9w3csbM_C1AI`4|Kis%r~rZKlJ-)iFN9OBbOd-_h)OzsXK`Z~on;K1^Yiwz zMCKXHecFt&3zq@Nd1Zs(x-vK?N|Ml-F35T&fG(&@AHSZMZtm7LJLBeZ z9Hp!~p0M*)xzU_*>UMf-|M`1>++VuLf*R?1rT#=(KusKYgz=xuw0T4G3{cTY=f^GV z_j>N2X(Qj>zzsxP60I?MmAOW^C#2akQ>L?IP@gV(bGkA9-%p}vV3ZnvGupL&k1x1F z10|yHP|;|G07vkPmJ|Qx2#sGkWT`$jQ~g;&m7S++-NZ^r|7rjB|KRy3_c82LX8$vb z{$KDD{jpW##rsjm%$qpdEk%|pN*^02pUsOc8x58zyFcKV|Mq)=)CbGwZ@1rXk{{zM zWcd41`_W5#RRSX(G#Y@Ch{RQR zZiQ5lQC>@oNe%z{y``oshPh|mqq;=T-deuLFL_+Z_=W*r<3yT%mT_eshM-qd5Sn;! zxMIdgfi@)!5Tkoy!{pol{OQM&H_?yJV=h!cXq2R7WFL+D@oN6;Ji9vWww1m9l>m8>SNjL>zvME1r zK8}^K*!x1RIftcy^xA{f%{-gXgL8UbBFJr3`|;Um9}CjJ`jDLU=(((|>rxBGLvAzQ ztO|SF+9D6RrTKNo<*n6czyEWwub4$-{O8@(d#eWgpxepN513`PFqxC&!f7@*oy@@- zw^XLN_)ob~N!iJfx%vYS4D9vfkN~IR9Ntez9rN3JXF$>_3zN@ergS9)A#c5(;B#}Bz1s~~d{Jkm*nuwo2XD6-&e=cL48##CX@^ej znAFu=qIAVBTn$*;{BOUgKJB}vi6&R%mN$E@tkcj)_8V6KvC4{F@#ZI-J)%n|3z8@| z4FXFx))-oPosmODrXvXJ9j}uJW`t*1n)XnoP}RL_aA_yfyRsjG$3o2*!RHbJnQPwPf;NZ{fTIao*6APcM$3bh7&fhep)< zyV(=eEuA`@*rKh%b1U=0lurx{Uq=20&>a!*Sr?sWB;Leb)Ic!dh%a}W!Lp6t|~Y#gVo3jV}{9xGr0+89l7w`%O&)gsY_T% zbG8G{uH$eKR8YE*CT75GuKDW*`|I)s*F(*}JidKkHZVCVHss5_qN+Bs;y$b7Y8hlfA2x(B|Oca6n zkr<0r)AF@z=)>hg%(98kSXjkdR{A;o9QzCiU^as#?a+H~70wQI=aGLlrN7z@EU-}{ z;$Xi>U=FOR+mR1hsrD-ni}W1|F&U?G^Q9X%n#Hn+-y_!TCd7&;-4ie5G%J_8?U~@E z&|-7m=^cv-wuBzYJrO$o6lf9YR~J}o>%w*5fB<%FIchhL!uL$zSx8>5+a~Y7{>J_= z!<}w<#^~+30UMJRBVg4j^`pgj!t}tbAkT-O?u!3=DgWf4>vrUxyBj@nI=WEfXa-G*9Gk?1O-~`ncJ`b zb%|&cMq*@r;r;9upB!=ZgV%b$@}}xw!g8$NOP9}w?JcTLMlc}ndUDVRx z6w#cJ{dvuEX0?^F_2Fs!$!%m`QG=|COWGmNpzV!cU{_i{$kNt==yc;w4u7o_aj!A}y?xb<9k45y%LnB-2opVY=xmsFgI-*`jSE47s`R@6^=R z4gK6DVr$abAxe6(wsLqW3Xe9q9L^&S*7=f-&rV!Ms(dp(bXLh&X*DfMe(UxVv@3Pq zYQcZihhkHSGivEcH+F<9c%s!)2$PTYV|k+S-mc^pv_7M5boV40(Px15X`II0I{vhF z)~B~1Pl8xlqTVFw{`1sAb*C)PMdhLm#S1P;T$b!S3i>1xiB4vdgkU`*7|;=*t~qbM zRK*}XH>FtQy%vqMxFw$)&mb%%r3XAKpy|C@6#&p`R&#(^%i+0??{?b0=unbBJ*~n zu4_nEpOA60uf^(ptLX~%G^_aKQ6F|kp!R;>83z+kLAZrv2^4{hxRE=EOVk21c4Ku~ z#dZCiI>p!D|L3DB)T>83GSU2eabJ+(iMI(BHOHX)ih}sk#`HE5&7-)lotw<8nw7zh zJPKYh)oaTw3En%?uFa87?jg%gXAc>$KZ!(ZVj|KV+e}L5g3VWhwNK=SkPy?kXyo0$zLPwUAu69%OxB#`Z2u?+&>yf4UrypOE*w%t)^ z3*Zonei5<-32y~<{a&Q_a8jT=RBGh zyYXr4nD|zE_Q(X!TuV|u6&k9OY7?KUW8?{3ItYKv`^Y2C1H^j$)4jB`3fhFdP<6sh z_DX36ddcxw+ID`ZL9Jedy?3!BEcDCM`+D-#q1I#0 zY3{aP`_R_v&T3fE5jEQv$$s(?$!f39RLz5r%C!@nmC0Er-SYGRBX|Z)?a$Q-+9vR_ zh@RCwHLknf`oc(cQEmm8jn6-QGPHPw1EKhLRL4#@t%faHNpEL2m&-)P+@Nt%LL)TH zDm_J8ys?rwXd7xkykq+ob4j7meKE5TLr~%BHND@f!oa{pSNjwSe1Gyv`QS`{K&^-g z8Gk%CloTT5NM^8Kf7e7LB6@5i+{PE`CFQLvb~vs#kn$TIC}n8Hiw$m2|@ws=p{Z20!*X<&0`DUhHP5dgqb(i40)aOxD zTxL7azNC2GrEq6HiA?4f5)wk*`Lhfa8CEa(AGD87w=1XY&WGWFgRBS5VsECl_|>ad zrEAWS_=77wr{_yBH9&ZatuCCRL2vBz&r=x^tcIBR6!4f*E#&S!_~rVE)`IHCm7JDT z-7~p^r0Un}1TR1mYe{V4xz|VxYQmw5W%$*|dQ>(=Z8%)%S+_lLh@&ML{Xibc!QUItid#Y~ zb$5PoNDGE?doiJ?!@!d<8vTI!{L&UJZl9DWG7y*CRAUxnwbyb(0v1PMY<8e>OhG%4 zZvA)5K(H(3J?q)J4V`gL z8982{WP4G#R4d`fW&oTF-(ju-U0mZedC&DX;*SdZr6Wlr0jmlb3`jX)ie}RWa?K#m z*b$$cplMPfq|xAtPc3dn3KQmQOhj5p7XyrQaq+LuHXzifw7MPc?$kt{gz3Q|gHne9 z>t$KveQQ{W3=0qS8!!#_D3UmKo8WTR&M1r+YSjFd*qd z>Ia61tKFG8_2;;HdW+34uW*zJ(uHX`Z`U3+Ko27nfA^yoRqyi*1e(>qb{i9a=~nT$ z(kU*_*N_@K?IV`KFbNUR*6Ls8qvp~zvtJY!;wvo-Q}0GO<>zUyk#DkxE+VjfNm%XO z?C!;EQ?0$bIK!xVe=jK}p1(rNCHY>}1aEQCf%9f^;TDDNr}sLN6eoXw_;@ZawZTW~F#;A_#|#*If^(_54(;ZG z6W7BNxmUMza`BLs=2DUcn%S2Edkbk?3=D695&o+plYZGLu#S;Pz56U!rNZLH*63I0 z;d~A!N7zQQMnf4eC};{PQItFj+7hMt)HFexLcW=cCedy);cPm29b`_CMjo!dyU6Y( zeQTb>ebL8J9O??A<7XV+*;;gWgZX2dyqQvF%ikUgKanw2H3Qvy)Rj{Qvz1n~V@_II z`vhD(tQOc^q#eMiM78x;w5i==~-Z$ESk&Nm-x&nZ#K!N zSw8~< z7Q=|P@)M^^0mC0?+RH@^J%DT5H0;Qi4kVxU;5c0wPT~*UT)VYGZu`EpmWG{@eULOm z01W%UhsjDE`52gnS@CnhDQ4%=Qed`6xqTQ z;YaSsLzljqsmhJ%O;2rUNG|nQ+9>GG=|4Xqv-!#6h`4~S%JFmVWM8v(pi@Bi^$QFC z8lBBx??KvbR3fW-!yu>q2E<(F5leTRmP)fu+@80PLh`MZh?TGko;+u+^=~*pp?0+x zdw{ZXo)72vj6*3+h0XlWe+Hea6@tj7tFfmW^i|}?UZ2!lILtAZkSq)`$>&x(>~YXP zUo|Px?r*AlbEo5F)?P)Abp1?pO9H_-J1J`%T5;n69GAt$!_dX2y?IEE*vdPxIhq5v z1_^+MjQXv$D_YfFbFKl&XdKOajG8*kapd%6XwYx<0h5e>WBZlne4XK2-3qxUkr5x- zjFr6n9z_2^oyvFTUk-g5-NRF1ty5`!f;{+hIJ)q5zgQL^89O2YrqL*Gmci*hrSW-_ z(U{JP`;kHhMhIDqQ&_*pj98R?&*|$V($7nRfIs)P*pb6JZuL#E=x$VVq=9to`RJhq z#SUM6y!n-$J0H4mk5KlMsK6O#!OadKw ziPB7M&|WUVc<4_=^UV9-KY6mY53m{ioQd26B&O8)Q=uM&lRFC$A))Lz^dHWv zXJDJT=7R-WUM!`|Zm9QjC0ScICqWjgoV%Mm=ZfG>`2*pZKwQ*R^d5y~bdDItglyIR z`i;og2EfN@K>f~6JS-Sr7GK-4BXXT!cCf5Y-<>)+gWaxCSD{Z1m}vDTzG~h9r`e79 z^y&1tmU469y2Yf$gk>`S6D^>FV!ogXO`{GsT(SLwB`(*|)4@{toUC3ue5#OY8Pwfm z?D_m2Su|yj!*}@&>EDQjtoS149M>p&H5f3!mQtFzX4)2R<`f22@yr5d_r`0yqQp=M zB}aQG9b1^7O-8iV@QLC-&?O*>-Q`!5i!!1#`?>wQ>b4n_OvpS3ja;lI$>XAjBU!UE zUfS8peDcFgMQi?zCE8U~SH`qLd`J$73qN|$vc$GueN-%D0fnSq{((g2$r2J7vO%Ra zie=r+4L|miJSHL?h0>~-V#-PQ@E>n2dJ<-?Nj9B7Fe7nG#Acy^i*|E`sPqu^@GDP~ z`2f+0-Gda)m3AP#67tt9JVfag7l!k;!L(RWsEf4yr6AyDd2^t7S*x zME-de1ttH3e=yiOnAGn6^WFaspx^&DF=o~EiCiY82T%TN4F4cMzc$7H0gnFPd`;%f z48j&~U(b7{d{gpqpzR1^3PQe|n_l=i_lXX!A3bQ{Epqm`V4DH&3%deVT=TbD6f}>g zzGk-e1{fvztwh;FK-iD@JA%wP%&Z(u!1EjdeTovWeO`P`{m>Y{GUTz;k^A$(rC8aU zrIUX7gM=YNB}{jZ$B_;jI@TFzDWc%6x@qrPv2GF0wv*$H3O+&K-0!@<690fHZSjp& z$p;Fzhwo;K?unUIeC|i~LdLGFnL)zCmytP*ZH8fH$H_3hnD`N@>SkBmW< zC1J5xWOObc*y%=rz%=e=?s`blzMCHuJyt`nCd-?!#henxvhIoof1)NxxZsnwx=-y- zGur9KYak`nc92)vZemsB$FKRtc?pg7et{923}j!==e7TWFU~b@GmOG_OCss^`_^G{ z&b`)kY0&022fnTU{?w0UWTE~czvHkq=Ev6tQt8bDjDv%WR+D7!}R#=07TYk<~3qNm(MeE55lUZI0(m44n_5?`K?04oPp zjJM3zim3=Pei}bEJ|n%sxIKPqVx70P)E{J;%t@CNeR(LTtMQi_1RBUw$;|%`@~W&wgWNZ z#Gl7O^g^h?u9YqV&O#Y1y?9{7fp%n}FJMQCm|D8Yp(hfuR=Ok5e|URmyUe##wQ2A}qYs8zWS|)PEix+@t-LfopgkyxZl*w6f2e3| zHLT%^wk%3#b66j;a@O;8O00Rv*0WwwM0>CEjL}kI=-Vq6vp+cUrLU3KDERF6$mlqY z`~yq--dEMar81?yMVXo=EKc_ufHE&46_kt3pr`x(b8a~AHp3Ux*fv9i+Qt$gAZnJl z)_$;Pvass(l9as5aDhB=^E-!itmV@;9c=}_(P3~%I}TP=64#@)RwgL~Bv3w~8oYGZ z8%SnS6Ly*zsBs=Gz?xH?6P6yQEPGeo0g_52C^|uqb>%zAkL2mf7!lJq*FYyaj$mal z_kb7-6bf-we#>ueO}XhQfjGyrwHzMsOfCa^lK13cxdy=0cktDcUg04iN)oapMaCYo zbDx9|l{APw2;{wxv?D)wH!pwL?B}LJN+jBm%CWCv$^}Nkg%F@+5s%iuL`6cA?OMCz zMf%Uav!2smcjiYDd+dZVHd05En}E?Zb4KOK=dN5&QwvGpH3Sz_&#JQgA2C`Pui-nhO9!$fSMcYYwTy|v1kNC0M@%Th}&M0Ylh zXYR;b(5MN}OK*2cYM zcO6CcOBa()cO=(XhUw{&TT6_&++?Km_KSpg3@BGk?Kq?XamderY-lB)ft>sWjT`d>3p>P=-3(8?C$_Xd6o)jEG3*YASs$`*DV&pu5%8*{ngaRe0 ztx-aIk4N7JRqgh|#oGYNVAeYYMvvIE#+@h{YmeF1QB%K3nXKn-*3T45F1E9Ye%wck ziBS};MS!DO8V=XAu|~53`EDVYKUu*1Kd@@Tn-Tr3*VlSsSu}>&=&B^gh)y3HtAJ*> zSs>Z(cw3xIOCkGRvFSW?u5mP8Xv4WsOtC9@Ck)RVgxpfemFBNAQf_T3S7_?48>xq@PnfYbadp zJ}a_JY>tIJA`3g_M6b8@%J{$bK2=+^Y)4{1u8k*IsW%Cx+aY7HcJZ5*S-vSidKok& zq(p32(R!(uVy78f<5J*Vtt8*=cZA({(J-4>Oq%`q_(dKqq0I7G>_x;K%%i2I49B*D z?FLV74ErIC5?!v=3p-LIoLYJutsmO~T-nA^k0^~2GUydaQM^4L2|IYcX1!6aNSAMq zi+Tg;w1?J*tMSL^XZ~rjP25V}-MrEOfbe(t${Zy5l6|{|0r-N!`f7z`r|u{wvBls+ zyk(Z!<3bWtM&M)795I2l%pLhhY9y>SPZooGB0fYUj^TDYR(u{dggZJO|Jy3yjF#g z84fG+lawsH_!eR8f$KH^HNBf78(1q9#?W09jOh;)@ZFz5ZMus8A)QIG6B^)Xqo$@j zK?})4;)QqeEpHg<^hT66RrTb*!%*0cvb%%8_m)ZuU-nPg^h?+{%} zirj99C_RJHLGV%6Z13P2R+;mH<+ZF{prz>Waiw|v>1tN?qQ##^$iGVVHdB=at>bp+ zEtSmd%;-jK(o(sMc`6qr2qhsp*&o-3kj#Yh(AE+YWUDXN7eG#8{4fu-vbA8d)cF2> z_KL-|sYQyNNN%6&%*ELj3>k;;$>p@foXR?uxMi-5u*U4c4Ba$e%3(lKo#$EE5qt#& z1x7-B|92pHt&w7-eX9QhBtJotG25LHXMYHI zJnmti|3nu?PbO`c>TSl9fn-?V5;=ZA%v}2Bgs$?MIV@U5R+U?hwtCm;L~MB^`X+GQ z-#u{Y>jCJ^O*w3@l~6OxfUXX~?O^=&dnj(rpDL+{&23@YP$rNV@YabOem8rsNBM_O zxotWEJcSOIcQj^9=W=K-KzmWES6J^EV{u4UnZLTOt&TxluMaLLZ7CBcWr@;G0)T=Rtuf5T0H^?$sV_k^d- zj!&SL)b^=FQ%;v6BpzTqg2N_5@R0MjJV$ydbp1(;Uyb;45}PQz%udF}C@ocUt(}q8 zaB~O=NiWR&@XsM48yC!(1hD_)6lcTvE~Sca>h+LtCf z4KS$G-EP5-j=erP9DN@{aybR6OaKxLO!!UOIwaH(#w#~$zsIT!b82L2ht)$d_}rXA z@_e;dVwMS}C4KrX^6{m1=TmRWUwDf4#*9SGP`+DWzKg#Eiq14CqII_$`klbb$wdzd za0p9pYn4>lDsb;j7ONps5JJ=sKeXbvYgXLFW-^PIX=QfX#fV|IVm-DbYy?xc2X4}` zXeljHfX=M-e*HG1=!vpkfzSu1e>KJ)-f<^|0Uz z6{pL^P-OQ0r39V|mg$Fk7ak1yPD`$7!Y>2;!bxkr)<&Ny9 zegErZEr|lRZue#5CEVLsB~=|}NvvIZ>ExKZ3Q!Lcm_@M1(`N`H#gpkX2olxbqP-du z)E8TH=;RwRjWnmiV~P2c=4+o=^QD@@Oe2%lnWtyqmh&~mDV@+FISaM+auvxwkwI8q zrfpq5J>60IYqXO!A-;RkRekNq0v8ai6Bnf1gzTE>zo> zFJl(c)+?;4I91?wQO=rz$A^aQGKjDEvJ#N2^emzp;u`(}J~W+gmy(8DTNLzJRYEk| zeo65?-$tLQH|#cBXBJWH5%@x#uLZBbrn5m$;(-hmX^PpCx4ginWbfp_4P2WZtH+jT20=;ZqxTI9Yil4hY+lQa((JQ{nWet0V2vs|R8czV zukT~d%vY^Fa80p`G5W~l$!WwU)!*FsQ2N&w{)EJ4DYMb6X+#f|liwp;n1_5wyQaY> z849e^*I$aM7RQ8+T7joT1oR#i?KU=Bn;X_-%e8Yre7HP&#%B4A&}rx7#oowc%wIw*>;hL*IEIl)?M~Q{pW{8ew{-D zm0p@bFR@BzjjM4tsUDv3B!;WBwfTVNp(n3W2D-CjiNjEe#tHD+MckncDlYV6#{M2& zLdeds1ntJ+Unrq;@1OOZs?wqvP$ARr(&ftNgGWBATb;|&mO zyFnhw%^Ex^WLOiX9uqdH-Tag_+>D-w6T|xZlL{nNf53O+?UPzFkD-CyAZS?JWq(M2 zgr88c6RuLvtt8N>40zTx+7h6C-yTpKYvY}gm-Xg;+|mz-c!}GKFwDt-v9M?7*{z&xleZwc?=G5udr3L%P$)9)GLKk z;{V`|%4cfn6zj!92L;JvV$XYbMym~7s82J+A@cmo+4Bd*^iBO2w60UUzq9|D3T%8~ zuwQ(mE~)HUE^Xh7j`Js7w(ba*xzIxxYF}M^3p2VUZkZ_P}A!}+(JcGTCL&DTRnFaLzeEiMUJRIKl|MLpxGg7*X<#$>&hnDA+ zS~BMVx274Ow6yCltX)@IjSeZ zlYXXZ-)iZZPB*KUFbf+uC17=B)0!Z?Pcw)Dw68`<|M=xZegNl8p;^;~Ud&hC@xNh% zLw8n>*mPJoCRMN9a&2|@mfEUJ&jsc2_;WKv{{gNKP$guXV2{$Qze*d9T z42YSKek!m1K4xNSX{$m-f5@k|7|}ovvRbY?6MM!ZdY`D-VD}M+z;2wcIOpQ{q@bQn zBXrd^7)mK<*qR~BHqE<5_T;S!*AaY`-kUd7280wNpF2Ra;RMQWk6wFn%~50wL7K8( z7-gPkQ6mQ31h9S2K2F+qf;Kx8;XMTWjR*#LD>6lxHVKz}CAEM2wj3($se!L|@Rk zSHwQ^$&J><*D z^8t3Rw_id=i^&m&2t%J9SVI+k?739Zc0{v; zEhCGyv4`P5@y*{1a+guASxl-L&2ad(V$aQ*TX_7ruY*Kt5mMJfdK(9nX6c9VQMLN? zg5lIQT}8TSYplY}XhKI(G*|j;pCc2mK4nWH$lYGE17nkf zDAVdS_Q+nhvH06dePL$4FJ;;Dty?|CUvy0f=JpvUzClC!fu&H^V%2s-D4se(6Lz9I2@83%p;$RAk28d*euiW*3YZLR}Q z+gJetNd!>;?r|bWXoch5jN5Q`BjV(J&G(6*81%J7c!I23q^YMfOPpnTWJX$0a4eNJg2VGN~(c9_PNqayq_T( zQxxqArpkhP1^8K0m2ZdzrPWn$#-6+m&lY^Qy`Q5`cov3R^V4#bFSh&7G;jZNa8^2a z#?QfBEqaga&mT8ArK55U+q%=WsV2+rCp;k`SV&`yYCTp_bxqD#+^F<9G{rbSgc2&p znEc=pf{j`N+^5sXb>p(xTlkDPY5VIRCgfZmVJHIIXRZ$M*Z5aPl$$5ZW)4$7%=b9~ zS?CnzPWrLOGsDbMYO%v}_I9EHU}tnUcg>*Z+YOBq(=I#1qIiK>HERE1DpbJ7h?ULs(Cj=`pT>(ml^-d6CB8#lll0xq|>}KjNGXu z3c*;VGU?y+Fhls0n`_Q=;;02KbHt91@h) zNt=m>%hPxhtw5_}gWtr2e^1b$>p^VCet!Kl6d|WRDr&xeU-e}|o5d;jyCmWUE9fhd z@)qdLBcIelTyK1fQ+><7WetJMB41SV|Ft*&Kah~@iee2U1 zy)f2!>}!PI+)pGW`4Ih~Vd(vb@}h72ekS74U3kM`a>s;Tt*7q&Z$ zfQq9C2T}oB2Ch5oWG~kyxNhXCc2}|3zA%c0 z!)G=M**#mz&>)4n9tRo!@yYYl*|40Kc{NtQ?o#0G^s}HC;(N*Vbb>%1j^);jQ!oY; zYIR!|UAs}QnD|n9v!fqa@O^(Rc+0l3^6}r^!rq*7McZO|ELXYpUcIblYEy3gx?LcQ zy_+|^(qEirC)I=!^Rs&#k@ec8)cS@=Y5f)7!I~kyL&j0RErsCYsC%8EW}ej%Pd?`~ zF%}wAz~h~#oj=@uS5AVqahGM$<2Ub#P(n;>WE$o7$4<)K`r^Rg=lGq8wTRs-;17R^ zrQDE=2QSO;hb^%%foe{ZYhHLEk}cEa(=mhXrjD%LDVgq5H7e3yzb5IaH_2Z+vkA%p zhwr0*X5SL0?*fxco3@%EA~F0CgR6LJzTBG;u}9zbE5OJeB?Ycng`~aC&wszrkQ-Ef zN!aQ5{&m}^3<(ajq3b$PgozR{j+WGp5_YDRr(53FMeZ)^iSGWy9)ETF$#|rS%m zz4Y@j<{8Fw>%Ie7yF#NOGkOT+y#A`?wJ#dPdd3L`wU1bckA8}#aer&o)X5|W{bhHU zpDV|^Tu+|lu;W{Slcw19_(D^5f*iqM+3^&NN7wPKjUfVD(UMEcPNyHr7a2DXj*TD1 z=Mx%QnY^coAuIxg@XmugC7z!;WpJF_S>>2AUHqxo{9mthNo$6m}Q+u z%TBBVB2CMoI~*QvwuJ-NPZwK&q28BGOlYFca?x|w9y!DJZTi3g)%oD1=o$sjw>yBz z0=3U<%-GIygcPSVieOfydTsHbZ}TlglWKGxsC};H!%c~Ga;E12(#=e?@rK9srZc0k z&yEKNVjmr8*tq^HC~wimi0yRD-`pwVo3xKES>?HJquLaU=6W^jl+;w-+Y?%GwC7Jo zV|t~+FV8VspB8tQ{DW-_ze7^fvNt z_UkpEvds)H@c(18>^S098!*!G;KuPc@+OIa&G+5_@kTpAPuT^+c_5tD0;EX|br*i! zRgsQkG+y*0jwlBsT+?YOFojj(Yk$|PpC9>(eTHJz5c_EbEf0Qq^sT{eqtG^2D77MH z$?*W^_Dbj+$HS_bjf4l^Q7Mn{NS#7JRniOuY@HJA*wjmR?5C>iB$Wn_*~-Q(ILp5! zEd2_~)T@t18vN=**MI&yJa}e(lv?wHC`ou7OHdFcw=>p zGF7aX(IJq)UitZnMNhP=HkRtbeCq6@kB5ocdjYM#!!;4Omqket9Ritbx8V))rvdq{ zUbF@tY24f4&m`()c)}>~;CwV(^RCT?Dy@sZVL?1BV4QXC&Aj%fjYS>O=E8ApRFjVZ<8VvHI{H4BErlnO)1MY;b=2{o5Q768jgG|{Nk_wphp<`}FS7@CuR;V!D z_&mOZh@!wZ1m&=%5@zo!^Ne#nqp{{2USIqeGWM%CjsA97B+el+wi?(503}4KMgJ)&5zp7X_p@#4aWV z!5P@%{}41ki@oI6HGFH^D;VIRC(-a1v9_}9xV?71?_NlDQRwA&)U0m=SJVH{kjRa> zWNATpmRu^DS^3Q%u}t&ACmj!R)@gZ>v<(c|l84;y-^};(WoPJj1by-IrDCq&L4-q4 zl?)sMXQF)~PFc`PalBj0{AOJPN=tAskex0sTeW9+!TH*=7&b4sl6kFT{If8?M7G+(z1Kqubw;c(*lD7=K#T{dF7jczle)}Emg@^rS8E3km8 z3OYi~aYhaU1ODs#842tLWX5`I+@ZhXY+O*hH6WBXtA5t9i0FI*V3R$^-cK;bm}oey z1IHZZ!84~J;-~5P_zL}kTu!*pFypszK!ug3@BB+d9^^foSR8P8kstz)nP5e0$K&0%5+wxS$Z(IdQk=tRwaqv5hz5>xdWx#HV^O%yf3ijf(%vHBT zDF}OR>{^4+`(;}E%Y0@k-Ly;0WDIo1lFRN@IKHWE0$eWfvPayW$^cm}UOB^CX~d+@ zVz_;tS0xY3MH>OskPlyr5Bu`vSk&4|m2UKMyAN?ZRxPIg@b~%!aYkw6M6@M6I*C*v7LONY~DM~@xS{b%fYoAaI=&EGUI|N7a&g_2<4>k$}#{1%b|D~pc-y(v) z_K{o;cnyU>gLE}Gx8H0k5uzohsG-Xo_4%VkgUNb(6B4g+)TPsGWO<%H9C?v>Sq=)+ z%pE3L!isunpPm}^Iw<}Tt(5vEwbygKM9Mqrm2%n>ok(LF-$L8E^HDxd)qJc`g*w6- zk^Yt-6vpDH1Kx7XmQH{@SwxAjV~Re{-~BVtHUsPJ%eEeH2#duJ8-W5;T#9a`$GzWW zS2NSalEwjt)_%y^b0=J|As`9l)AJDMUj7XLV`KL=D&5>x-c&tnX$UQAYWuOE;W-f! zul4mHZg18Magn_42RBb0su>D+Q(+-{F3s{jIrHosV|N(`1$l<+i|?HDF%+AoBp@?> zKV~eZdiyEpWN+bJ$*FI>zr}u-h}U3p*AGnPeLKhNUb)H0yiblA){Gv9)o_h}cc?A6 zYa_VC8~QT9#2L-ftY`GPt93lyB}#3Uu5oTWc|odL6} z9-=A!+RF<2JuZEKnYtD3-zG<}fGVZJ`t_n(IYfnKVECv90MI zKqH+OK%&{C*wh03i?gH}B+|8`I?a;{Z{DoqgaXC6oyJ$4jw_hMUk=uL^)|#R*jJt; zp$;nFut5ioC>JW;R9$BSJy9Ajfw4O6ACodp$Z2$gk|iazEW;UN3K`0-=>Q$^6adT9 z^w($Mw&7=|8Jx!@Aq}x|_%7`A3H_7k*9fJzPsaMWnUggzVGk z?bE+FlGN@yIG!YZ!(Cr0)@`Yx-I%(ROF6HB{SqjthVVIHt?>E!SsKt17M1rr*nF3;jQsY*OWE&`n>;nFtcKv` zX7#b#5v|ItilD?D_Oxwd~S#&=q$CAz#CBIZHU0N*sO3JyZZKZ9sMUPxVz* zk8=BW7A&}P5N4*Ltt~h~D4*~=6PL$uXl)Ua688$O- z-yx`oSOb9ha&$v1HMs;8G91?Bfw#yc6MwFZUZzuNI)NWf)CkhCr0WYcW6&7zW-l?& zI@w64AoRhXL<{??+8~5liTl&s4D;#3ZiSH*b@(n*fQoSX!fv}xgZK{RCmr+{^IZRX zB2oADf2*I7K@FQKwvuwDTL0JtnY;mU#HYZ?Hl;rc9qn8n0y1Lpt5_b#pBWmUCLiI&wlau ztDe|u1I%FY1at*@A&Wt_Ig^(G5(~Mw;Tz$1m@UA@2WNmJ76h-~6f4CFJiHII;NxZ-r&0qpQg&}!SYv2aZ3wt;WC_UCpS==w$tm^{^Ine5otsja$QEu`4O<`x2hchX1ZaM3S zB2m+`X1C3&tu|^7Qtc*e6jjqKPTC~^PKkxt%C6|Y}B4qU77T{HrV)iV?;Af49H%rO11d)lJUr!4x$2+MqipVP9zXO%I zM?%IM2$`yi#T^qYN_3k^#z91ufh_+&-e!7dkJyKxPx}h>Ir$itWZ)2H&k&zk2~gtCBbPKyDs!D&Ft!?OO8{olGFfSp$YP^f7s5|EFk z>5%jr+@XLHPR;W1mJc<57M67k}4RdDYnqkV00e~Hti9w22?J&OpYHytquwgeix8U|Hvw{P#b{dRG(*#@3+f!G4M^Ttf^bWu!`RU3PrY7lt zqcI`suNQ{axfC&`GG~j*8S(FD&I48QO(^K`%QK35#8sZx8q*5nCR0v?OdZAqvx?3^ zhT6jR{-pGG)gH(AT0nD3hi%Dybg4_%GZY^*J_*ISLMs>`=<%*zrb>v2})O{20m=e=fR+TjbwQe+J@skt0LV6_A2|LC$b)B$*2$|87_Sqj^K z?cKl&l>W#6`SSo!UT^b+N4_EYL8VKp{3eu^r3$SWV$1=_!nJP&1GWuK7W{u0+DF7y ztS$snuu5V2w>?*LM24wKXD4nBJsvpWWtbf>h8|n41#%*+HdM1U@leR&EnBqq8(+F` z^8sLL=`zIyMaDosO$F5OpT;_X_fUJ=x9JW+zUAi!E>eJ4+#Q^vb7yhd%{fkj2jfv#(tX+4=#=H(x1Zm1-J-IV{Rn`o4FE74!yo#l0Z6)yQ?0Z3B; z0sgQt@&9N(`+s6p8&QDZ)G+{B{^B_9Q+l%*9rf#LdaPI7v?9RR_T0p$1~_L{ceL)3 zjm!0#J>~-B|375GfLho8I~0}lA501Wf7RblvL;vE4iNqo(x8%*jvwE_KW}ecx&jz zOKSI~&S>F_IJwi}aHcQNSDWy!v|;%FP9P)*eSiu*K>&(oXv zSM)SKI5Tv9j-S&4hCvSANeUmlp@2%Ns7E`8v)K!a`6&>`=D^01*+Y_U<#q3i7QCdu z`bZdbC=_=pCS6@IV3KFGXOsE#D!OMYsl-PaVq0F1iM^enHzF!Kp6?t!@c3B!y9<36 zx0gX+)W(G@A9xn|eWDq%^;Q6Cs5Ei9X+jBtki@f)hc>nDeq-luFGFF6Io%KhG}kwz zmD61}8eO}2_d>7!Z;L6?eek%|*@1+CS#i^N_6N&c-U~Sfi7wz znhK4`jMgXRIehn=11|uW2{)m%Q0*Uho9YzgJF+~0%#*|cboneF706!wmFpv+jP+q? z#L9L4=okXR9pff(WRZiO<&z5A%V02G+rnO0WTkY(hmM6maEshFRX=p0PefGARyj8NTjO|io44tpS58nX9u|a1*UNB~d!iYX!x}LO@ zx|P&8&VA46x3Z`$M@LPb9m7@N+;ygx)knM?uk8*hld3(s89d*~?Wr`^;WtfOp@#t- z3ERrR6x8~@-^zw>qR6dvmLegPC0X@Jbre9=u`^x7rs@(xO&`#We3GDQd<|2i2@J z8VEje{y1QP;=_2Qul?Pf#Ys>9TG1VLQV^_Hw?x=^74VN|p&oH-zSXBR>~56zNx9+caQM&wxvn)u9}8wT zEEE+%HMf#TBiNE=7(Q=gmm(rR8LGSiILlhL=HMN_^F-W_CkYj;G}i+@kl)Ad1;fVq zq41SOnT6_78{rE!7vFTu9y;I#UK$2O^l+S~oaH`?Is_%c6|lEB%6F^Q)30XqqgX>w z%Jvb!B;%f@r07gcaq^)sU5&l}d5_*zzY!2FmL6QxAu;i z+RZICTG?t4-nH*GxMs|;xX3k?Pv?I;OU#x5{*(?b1&^QqpZ}%29I9cF=|3DL?y9O0 zsJfMO9JXqu!?>4ZE5$+5AcN-G)5`-6)|*>%L5H&L0{wE=wJs+RTMK5sBMY}eaIDFN zCA=(zD`46#)E}_Oif*Fn^J@=+M$cVqB*yJVD^@gk+mSY%(AjP+s!Qc?C@iShd4!DP zmAkKrSK4f(wbFlf4e}F9;O@d)HP$3qA%o$YER8y{y0Xf_;1~TWY*lxp5{T zyk}gr(QCIze z{j6o?v)j4yN`=bUd0D0A-m%3;3h=`p%5<>|EU$4NX^SF3))8{K?Ws~pVB>lZXO8J4VK*r8}k)b4X6&E-^!k zup%Aya*d6YV2lw9Q*O~-=<;ffj-}Iyb@|D9ufbIVnx$rhfPX?2uVKPflv?W06cK5Q?$ zvnMyEVl(z&wkUGZtAna|q^7?6z+ty(4cKC9V=WMP!hZS$k6{`sRUUf%!+!vExVQnv z91Y@YbR_g^fBk15R{;Sb;aG0;NaHw2gH8YpD2P}xdO&e(#jopJ zIQGnBS4{>{DT29lYg^fx-$d(PLDfP7ethAe6fUH`DrOschn-MO9J_RP!al_@Y1T>& zqOma#_F2vfnWXX87CGP200?srZ)NSU+w(k1T+Hp`W`K+3>rkZcy}2WGEhvnU0#l3d zU=PL+1VpB>vB+Q&o2u1kRl<#l<{W@YyO1X&4cE~Q78`=MlFPg+#X6YZFE zAer%i3X*l|y3vsf{q!vL-Jd2Y z*Yc+H&v=oxC8^@S^@p|Jw$Lap=+AHZdG3}!zSM=Sq+K~p?-pt(TNio>%Ki~!VdOWS z@U9%M{^^VV{Kkbpuk+vrp~rq)RClHFuQ>hiuMoVgEJ+1ZkQcGB^Lq$(iRmb`YW-^u zzS=_T(P0E6N-tHFOr&mjHH#D_JXM3F-$*q4^9FN(YL--B!(|=L%7KwuvNJibexfZ+ zfcUh*Vvm@aaRauM!JJ{O9CQS>ZlRg60cNDoDdVf02n#cHKqqjOgYHmtRc9Nh=>8SY ze{oYX;5LQR%Inb1+`-b=NV48A8#H=$hrM8fIRJ|ds@h7rl7ox3;{c)xeaX6W-@=(C z#kG!snA*JPRSCmN>tdvG{o)%AoC^z@gSkZh_)f%AEhe;5RFI^sPxff#x;1iW^ZX*^ zCReEq9b%%#cjfemn7$2Tb=L{I+vi~csX5l$KMg>yc#FT~#Zv!@X0&tgw6)bF;C!3s zG>}pkE6IWCV+WVY8IciCJapV(O;G(*)89xII{ImjHtdh|=gUU6I}wmP;Mkx!SRftM zue$KAv?5U4ImTG$%PT`_dhGD551PBM_&S_Z9XcGQXoE_Tj_q=aPv?nhPgRCbTic4T z;->QXwJ>|gKuiwSuk=`uDX7znnme+YrxuZPG@)$&5ezlYpp5WP+*!Ab%wa?l7imu> zSDPlfM~G$!dMed5XkrmaLMIB)6W)$pN>m{0@@2#jcPB*knt&1OqM132DJye-NDN_Q zMg|s19!pft42yL+`HyRCj%%z#NkN)QoTG=P!7N(=wSVO!;L+X&HZE{5@wfGb{LIhK zPNClyAtgW5Jh;dQ9Ol_TERX_@aRU_KF(xAcNo3Ir_S;J8aJ1OgdKwbv{u4zkw|TV| z>56GevZ>(SXsy4KqC5N2Y6P%qzn`)y8dm4hU=+#}Vtui&4lU-gXJ=47QSaD>80({oX=#CrsBRaMED!=>{0fj2X z#N^H!m%i0j20neP8$K`bY>6lWwWL^g#KG5W*JYuS-k(nkh~jS3yI7c|m<@}hB2?xu zqs98QEj%=F?}A!gQ(e=#^FmQhpyURH8-G6`{>*zDnPQzu0%$zOj{ca2ga|m*u+a?K z$^i=*hx=v~kQ0%e+M6j~DD4Ga0**&QTXROr>&7+L5YK48r%3C8Aor@DI3BDhcj&p2 z(;OWb^PxNf2O04HATmIoc*sm?H~&D^3`o+5ug&)5;tIQFUYR5>CLGoAiD zqJxz0ep;w2o+j;L?XnYk)H}vVkb(qcI7QFy<6PTihXgo4p#-T$wGBQ26bMB7p&%Uc z!PQy$tV6bfrN?Fou2;K4E9`>Tb04_O#@UhekP1o_ZFt8GD!Np!XSG<)dc)#q+9A7C zLbusG%k)W@R`57aT=>1~26C%SgYnOs4B>c~H}I_GxQQb5#x*7R7863zonxb6DJj>U zI)?W!(X2qIs1mYQ8WLc3a5gZ4G(<=ckbiOWS{I{FZCC@#X3g!?raw4fyQeb5;$3hQ zBTA5L81zyQiYP_hdkmz0d4?@00v%fJl%bapn3_t<3`{@{uB2Jf;9q7rBepwlR?Tej zAD9eHM>Gz{mM4S_-Wt&EpZ;TRE9qb;S19R#h4!DM$2BV`P)m_V#&myDn+3j8wj{{m zTKqvMef@LzSeW848ZsRB6I|^40`GZ>Xn9VE2U{1rn(aS~<;$L1L)h3B=LOF=DOPIi zw98VVVc2MhWJ2*n>%c7r;at=Bu-=YhQ6d-cACO{1u+64FO$eSnRL^(ecRjp=KN9g_ z-ve-!wS(c<=kca>ox};uUK@G}yN4U+Hm5Q0#TS@5M~dmXvKo6t(Y z<16VH-w<{7DC{)1*(5V9?69ML`Kgvp0e>Fa5>&$jLWbwc<(4&V*L$UBKrjm}_VR?S zK&@MgK$LQ@^1|NH>#BTUH5;7?^_iYolHk723%AF_)ro-Oi4=`7!D+w6bBZk{rlq5! zdVN%_KCtT8ZZax26DR~Q(GemS#za7)=SS;knUl%l-_2Rjf9MxCIXem1bH-466L4m@ zf+63CcZa(J!7O9(j~%mpBC2{dSfG2Diz3(qvAz$cq zv&}5r*Xd__;tog5UR!C9sY79RUAN2aA8u~X&y_v6FK=FJSV&{9Zysh_U9YxnDHZh@ z`;iGKoopEf6PpuVr%bt+{A8`bZ!gei@ghL3GR7U=%vDZcUPI}=)`>NNePP@vAA6dwM_u>BkVqM|iTmLr~a{gWLe;54! zONGUM?eSlG{MR18!$JRUg@3ogzgyw|Xe-#+R`53<#R=uzNnk)3X~pNy8lCBcf(K}H7AH{;wbvhT8nLSfD z&js-0^))QNIDvbXlLW`pjZ? zMB2KiH0TunlepzmY9^}>A-LtY5?b{O{xNm3nXoiXaOKauIO3B&yqCV-Q3OGsMUU72fv5otZ0P`C zD;Po&`||r4Bji+W%nW8Bn+B2C5cJyOfCDW5OE|e$AEYtHn)rRv9PGN@R+m^wHH6NC zgiSx8@NtP|W{ro*qd~OF`3`q{UPw5F8z}T-ARrmZ_QdKx|bBKLZX4NRzb`NU3daA4AL zwmN*pJ$ofw16XI;m`N3O7>YyK1Y*4%qbN)EB|S`1!J(UB)aH?5eeT1O;8f9#L7@dl z$^z@-AGbrK#zOE4=`m7DAFICdA{oq`X5%#)KvkprkQ+KtN20Bo;-(&=SEp>??EWDjde z0e)L{6if+kamS;PaqEtueO^W{_I%J5+&ZyuWcv7SGv^&K69iW&lKUx~?~0FnOSC(5 zs9HtzE|Eaw0l>$m>DWJU=4!1(L2j%7+=9A1gAg~JP~Jy%i??4N?sGE>%oq2IX9M$S zw=P;fKXe6{%f;ztlxeQbrIF!6(79!moA!dHWP7S3rown%TF~5vtNtgB{$hI+Ql&?m z`}Os6LkAD)niq0=^5JOVf!XwX-^<&|4^>-MKV;y>^{bh!sei1@9RwjY&9)(8++a7;I>$SBgvlgnk7eepagzMTT?q!6z=`6oZwP{?*VMnKKC>$=OJ;x(f zy2e5&=ep|Fb~qU!BHJpZMGatoheiVa+sQA>G@b+<^_njV5m zQ%r@#JOKQaN!Nrpt3lAFq$LOp8gpCqc~TGRD8Jvwz@RSojw1j9UN&qlkaKLvyM`rw zF7ZJa+)2}#KzV_Y>w9HCyl)bhu-#t9BPm&`+b70~t`43JRNHZFtf+8AMv;Sij^AOR$#A36rCfO+6swY zSj0NSw$xRBk+un*iiBlQ9j#L5Ga-7^P=+B4?7A_4m~mn?Q$*c~C%MVlM-a2XCh7-= zjDNHhRZ#TF4gI_r)mh1#JIk+s(6?JAc(gNijF?!t+UCfRYy+4Ky&N_qHex!C(=?&} zEPI7U+0f+b@|+5LEX7OSA28SP8P_gn4s|x+V2iJh?UQf>l^frC1k6I4b%!BhV>n|l z=-QIIlZ&liT&^ae!^bZsmrl0F>Dm^V>OHNk`!rlJa*{tjk5>WsB@^ndTx%AXw$`m_ zQrFSN`g}jd4>ZPEavv@8xIA^fj`A8Wj7V~1*s(U;n9Y2oN{p8su`7dpem*mmntW_v zSU+_3N?iL51$4go`B*zT03)7f&ORcA3dyk=YWBiwyK2iF8?Jl8vJVYJ!P-*4+Vkt$ zwK;xwMOu=qdP+i)_4Rv#74Q`naU43vo#nhcW=YXiHkqXrKCOGabw-Da&`lsV*f@@; zqM}z)QiQ2{wNkQGS~_b(qW4bc1{_J3`ArLg>`SJCwGt&0*XQn1PyqQQ(r>u%=nsD& zTp6Mo+L1;U(aCapMxHg-j*V*En1MM>c_s!gbnf-uAbvDf?%xErMP)l5oSH-lh03=g zgmH`2{zd7s9?zcXck$eO2B$6?E1wAcsu%YK*+8F}@H7x#!9>`?xicfS&RsW$K0kdw z(k7= z^IQEt6g8nCFfQEPN%>mn4P9l{d>Z3|Ux4a}VyhU+T-3A~CfLmt6;NC9?$cd2R_k8t z_-%Wx;rxK;K-A!Mdsv`sT^7>@F2Z@94c7#>a*6{}`!AVC2G&paOvE}mN&}r}(3~y5 z^0Q)gsVj%&rsnU^!BDNX~*Aq?mWyUgKu@i(=tRkObkAM8&(vXEWC1<**H1Zy*0iMcm z-XK;V__pRg9qJ{`+!%uK$?4>k94^&lI;kEBfH#M51=2Py7 zws)A3JJOwTKr4$F-l68RK>5|x(=&%e-o1rr6IlKtNP(;yl}o>`mGJa^Ul}dlNo6WC zebT)r!#j^}A=B#PT-vRjV56l#s9KVutkOS8hm3EbEm?0RdH$3Zn$wi54VDz1%8cWR zH7&Av~s5(K?}CT(oqrl8^w5}XQ| zVhJpF+6@hz2 z+$G;r8d%be59zsU$OSe$n#2p$>E(4fY^)69$yw||bW&{#Q|=>TA9IcvdAqB1;h4<`GM$j_Sk=KE3)ZRNq# zTC!^c?K75)c7;sj>=|Fu>sgVGpg`(>>sl>P4*lX70Dclyhvrqs;_rj+_3SWF40K^P z^xZm9PG$;Lc8AAw?dn}=hy0AUuip}i+Ss8HK^*ZM`bO;1QsKV3R$zAx~XdV zea&{%te4qWS)8S%GVLeBdV#>Ln+&Ymo`xYvsi_ow`6j#D@oA9lp-heOOg#m6AurM| zx37?nm&do^hh%3w&kBHUuxe!IqmlFUl4696`KMmXFx6V=FsW&F%48gCgt8Z@K*+8w z$H$IOWt@ou4~4U&6@NvlDj+@f3>w)cn=1A-Bx|%}2Rurr%8;viKs5D?1A|M4rG#F$ zZBaxXCmey~!iNvzZfDhY+0!)997%j3oLRn*{J z>=Y80<{~+{Vo%9ZkWLnAL<(jm^4rD!7rc>n5yK(KBZDs9R*Rd@< zQ8(lEDUmaI%u4f&(9$NXQ^w5sTw2?xV$|A)=#uZ4`;_J8LiFp(q95pC><(KzV?7N~ z4wqNS4f&e4_iNB+=WS&u6Z-&QtwuwSA*5~6^CmF+I?iF-jKySq<+GCt8b;ge=*HZ> zZpHFPOj9ulc%E5!vag0lcwSes=cxVD>hW32Iy4zN9R?~7UpjjVsU+@QlWsu2grDH0 z$1sE8{xMCNzM;=E$OeI>?cwd~@7uQcHwE>eJ8AZP5AOtC%?wT@7@w>yf+otfWUm!g zITcJtiTz>*^yZS3l;kZDz9OmH?HZiTU4o`>DYdG{Hb4tq4mnDBjFp42JMPUUr*5|# zpX}#EUdXzBYDA90oZ6Ci$X)`QxlmiQMe+3?k-wS7XOa=zbLG>$Hye~az%-1eBHg~Z zaqMI(4W&YgdNVE#28Y?TW&!?FZQoVXq6ecq1Ep`h4Z%k;TD)EZd{BO&O>eY?T=WzRRAD4i+3OV~Tv^e?X?r~|FjXyfTdu|78rW#;N^199U*~P%FmEueftVCS zV%ldi?DqQ(BgmN^cIi1b9zyszZGgd~SCgtH4mVOa z49{cGUOf(VP3Vr`{93>ll~oJs zwcnkPxxU4{w?~e{7V~BIQdN8}AV^<%u=(WkrwAS57qsY9)8YrNlNeF~3fqI}np&`| z2G7+_Snl5>PPP|Te%hkQbSEZ)D5EK$XlWJ6Hpt`S<+T6{mA43UczVs{yj+$GU^GSf zLO;D2q`Dl%v=Bh#Ecw^n=VAArt3E`E*-d{vDsDU3-1w`wzArZGmD`#S=gvp1jehI( zG9zBmQD;RGCz=H#l~x#Gmn;Ymg%P!DO`MK>9yTXyGksZRt%F{-U+yWKkN1yHQ})Y( zRPQv*7I^b~&D6r#64Unrm{|S%9d@Y({)nXUBQKc(&v*_0vEExM;$4%-%QI3>mu_j& zwDch)rP#61s>Z?L!?ZwBjK|@eFK)sH2hN-CGK|vmoqe{tI!d(-YqjsyJ>`7dZ44;c)UE2-7DYxdT<5h>gLF!=LDl}?9d zO`9t#Dm>+#Q7J;_2j+Kt3fT0XO`eTSaD|+))$=38Ljf^h36E_*ZPTdBW8t@YC6*it%e^d(dapDOWrj zoaRrgnNk*m$3F*!eoWh)r|U|uN(ZZr%LXvx&-ssur6+S82>e_q<%xJrR8LH+s!ULC zr+X8k>z1E~T3IFpTjl8HQ0&=&k~gJ2?4VoDO1`}QD;H$yx*`mOE)&J)M}k7PujrcR z&BPkVr%^4ooE?9wlTs6FwLO(!*B;$dy*@yZ+y)nL>n-Xg85{O|L9$?Zai!c=FiF-f z6(7;PvAxVb>~NGyn^dOCxfYYWr+5ADJ&56J^0d0BN1bVN4TWje9~P_Ht_THJ%i8zV z-3!wLtfea>wK`^l8AVie7p`O~d2_5M_X-u529W?F>n%T>IZYt({@b*8$p<}5N0vqg z=M&`__Mm8h+Y1;}6e5&T(uLq^@n3dKd)jd%X7A-nu~fd>)O*(%X~-yi(Qp2=DrE!g zWIiqnG-J~~ygM{$WLDb`50kzQJT`S>QZ)ul_Nz&L9hRpsJ?c}v#~pjUXZ;EO(3n;- zRaZqoJ#uPH9uJsP-%R#N>N2ldhnCI{Duhl(0vdNeDk^8>TRI6$2Ur?v7C z<^)0XI8GZ>G-*5>s+L!vMNy+tFC)P52YH(MLUG~3LIJ(bC(5I%^9ih?LMvzbNuBp+ z>fo=6p>0#^cE65!h{+3gJJ`B7U2~c5if&fju(W|Ijwlk02{kePmFT}MsC%br_*|C$ z?i8odLSK44R-?tl|Ji(G4Oo3)@T)RY1g88d^hOqr_3${x&8%;{3n3k*{HD$3VCwDy zds=!@Wtowv`K%HAy28l0-3X@ug)?1s$1uNlzlY4ftH~VB6jt=^&M0b$lGggI(4|^5 z>gi;2Yqh?8-Kt3E#X8%muWF3T=nKkc`W}1EU(A#=?w$gq!Be@nvr%YvF7ZAr_T9RH zQCt%^d?RB7DH9uWnA4JPA)F#$q_qkb$+O$}NnrSm?;fd*x+~XrJ(Z-lN2D@jTdF)e z3fY%;meM<|em3EZg#J*7&&zdc{hG18%ZDP3omaoxPmH{}K7STR-35@inZrr z;2Eyx)*LK2trB&az_If-Ktdv+EBH-zR`CZ@@sH<;%&hheIX*vkZN{^@VzNf4ax=Zg zC+tY`h#)jkhg2+-6+rJ~vCrY(Nay{t{2l8?M-7P2B|G^VyPnl>AkVe!th%?hgr@Ps zX6&pR-w_)`-vT3}LIoWjD`oz*wbF)EE1+5CG%?1*zbx0sE4JDNgU(q?n*b8%hf{|U zti0S2>KaT};OO_AWH@AKzM-J<;K~qhYTK=VtlHsvADgkvI#Ji3g`7hy^=S%Ii1PVw zV%rM6u1SMv?BrhN>270uy7NHUG*Z!?qU(cYBPZX@Up>Gn_f50zGHfI~>fZ2lbJ)5p0=F)f9OS{$9T!XjbqUz4xXNmjcb0YHb8dhcB8@k--T}=^ zt?J5vDm^jS@ySp>zxGNsM3T{Qj^y;=-BQtHRpzkEH%*5Tbev}IJ6}7Z#tvIkcal%w zsD;@$tsaKkgUgO&fv>AtD)-c*qzq@CaU zAY$~rjGmv+ayB~@y{+4H z4sZyQ>%y{oEJV2)PFH{0x#c(4?`zMC=@fymXg{Tb;vd@grYVm_%muj(fPTjqSvAxY zLctBcWB1*EeJ<1@b?we&Q|?D9Kj#`SwnqB@UO&eF5-VC2Y~3$j8V%|`Ee8;)wisVF Lzf^J2?cVWOb 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 GgeCyQ`SLda diff --git a/includes/admin/class-wc-weareplanet-admin-settings-page.php b/includes/admin/class-wc-weareplanet-admin-settings-page.php index 67b9abf..5538412 100644 --- a/includes/admin/class-wc-weareplanet-admin-settings-page.php +++ b/includes/admin/class-wc-weareplanet-admin-settings-page.php @@ -187,7 +187,7 @@ public function get_settings() { $settings = array( array( 'links' => array( - 'https://plugin-documentation.weareplanet.com/weareplanet/woocommerce/3.0.11/docs/en/documentation.html' => __( 'Documentation', 'woo-weareplanet' ), + 'https://plugin-documentation.weareplanet.com/weareplanet/woocommerce/3.0.12/docs/en/documentation.html' => __( 'Documentation', 'woo-weareplanet' ), 'https://www.weareplanet.com/contact/sales' => __( 'Sign Up', 'woo-weareplanet' ), ), 'type' => 'weareplanet_links', diff --git a/includes/class-wc-weareplanet-autoloader.php b/includes/class-wc-weareplanet-autoloader.php index 2107143..597d9e2 100644 --- a/includes/class-wc-weareplanet-autoloader.php +++ b/includes/class-wc-weareplanet-autoloader.php @@ -52,7 +52,8 @@ public function __construct() { * @return string */ private function get_file_name_from_class( $class ) { - return 'class-' . str_replace( '_', '-', $class ) . '.php'; + $class = preg_replace( '/(?include_path . 'provider/'; } elseif ( strpos( $class, 'wc_weareplanet_webhook' ) === 0 ) { - $path = $this->include_path . 'webhook/'; + if (strpos($class, 'strategy') !== false) { + $path = $this->include_path . 'webhook/strategies/'; + } else { + $path = $this->include_path . 'webhook/'; + } } elseif ( strpos( $class, 'wc_weareplanet_exception' ) === 0 ) { $path = $this->include_path . 'exception/'; } elseif ( strpos( $class, 'wc_weareplanet_admin' ) === 0 ) { @@ -101,8 +106,6 @@ public function autoload( $class ) { if ( empty( $path ) || ! $this->load_file( $path . $file ) ) { $this->load_file( $this->include_path . $file ); } - - $this->load_file( $this->include_path . $file ); } } diff --git a/includes/class-wc-weareplanet-migration.php b/includes/class-wc-weareplanet-migration.php index ebe80fd..1a00694 100644 --- a/includes/class-wc-weareplanet-migration.php +++ b/includes/class-wc-weareplanet-migration.php @@ -249,7 +249,7 @@ public static function check_version() { public static function plugin_row_meta( $links, $file ) { if ( WC_WEAREPLANET_PLUGIN_BASENAME === $file ) { $row_meta = array( - 'docs' => '' . esc_html__( 'Documentation', 'woo-weareplanet' ) . '', + 'docs' => '' . esc_html__( 'Documentation', 'woo-weareplanet' ) . '', ); return array_merge( $links, $row_meta ); @@ -584,10 +584,20 @@ public static function update_1_0_6_shorten_table_names() { * @return void */ public static function supported_payments_integration_notice(): void { + if (!class_exists( 'WooCommerce' )) { + add_action('admin_notices', function() { + ?> +
    +

    +
    + ' )) { - $notice_id = "weareplanet-{$woocommerce_data['Version']}-not-yet-supported"; + $notice_id = "weareplanet-{$woocommerce_data['Version']}-not-yet-supported"; if (!WC_Admin_Notices::user_has_dismissed_notice($notice_id)) { $message = sprintf(__( 'The plugin WeArePlanet has been tested up to WooCommerce %1$s but you have installed the version %2$s. Please notice that this is not recommended.' , 'woo-weareplanet'), WC_WEAREPLANET_REQUIRED_WC_MAXIMUM_VERSION, $woocommerce_data['Version']); WC_Admin_Notices::add_custom_notice($notice_id, esc_html( $message )); diff --git a/includes/class-wc-weareplanet-webhook-handler.php b/includes/class-wc-weareplanet-webhook-handler.php index 4da8f84..4b6925c 100644 --- a/includes/class-wc-weareplanet-webhook-handler.php +++ b/includes/class-wc-weareplanet-webhook-handler.php @@ -57,32 +57,47 @@ public static function handle_webhook_errors( $errno, $errstr, $errfile, $errlin } /** - * Process the webhook call. + * Processes incoming webhook calls. + * This method handles both signed and unsigned payloads by determining the presence of a digital signature. + * It sets an initial HTTP 500 status to indicate a failure if the process crashes unexpectedly. */ public static function process() { - $webhook_service = WC_WeArePlanet_Service_Webhook::instance(); + global $wp_filesystem; + if ( empty( $wp_filesystem ) ) { + require_once ABSPATH . '/wp-admin/includes/file.php'; + WP_Filesystem(); + } // We set the status to 500, so if we encounter a state where the process crashes the webhook is marked as failed. header( 'HTTP/1.1 500 Internal Server Error' ); - $request_body = trim( file_get_contents( 'php://input' ) ); + $raw_post_data = $wp_filesystem->get_contents( 'php://input' ); + $signature = isset( $_SERVER['HTTP_X_SIGNATURE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_SIGNATURE'] ) ) : ''; set_error_handler( array( __CLASS__, 'handle_webhook_errors' ) ); try { - $request = new WC_WeArePlanet_Webhook_Request( json_decode( $request_body ) ); - $webhook_model = $webhook_service->get_webhook_entity_for_id( $request->get_listener_entity_id() ); - if ( null === $webhook_model ) { - WooCommerce_WeArePlanet::instance()->log( sprintf( 'Could not retrieve webhook model for listener entity id: %s', $request->get_listener_entity_id() ), WC_Log_Levels::ERROR ); - // phpcs:ignore - echo esc_html__( sprintf( 'Could not retrieve webhook model for listener entity id: %s', $request->get_listener_entity_id() ) ); - exit(); + $clean_data = wp_kses_post( wp_unslash( $raw_post_data ) ); + $request = new WC_WeArePlanet_Webhook_Request( json_decode( $clean_data ) ); + $client = WC_Wallee_Helper::instance()->get_api_client(); + $webhook_service = WC_WeArePlanet_Service_Webhook::instance(); + + // Handling of payloads without a signature (legacy method). + // Deprecated since 3.0.12 + if ( empty( $signature ) ) { + $webhook_model = $webhook_service->get_webhook_entity_for_id( $request->get_listener_entity_id() ); + $webhook_handler_class_name = $webhook_model->get_handler_class_name(); + $webhook_handler = $webhook_handler_class_name::instance(); + $webhook_handler->process( $request ); + } + // Handling of payloads with a valid signature. + // This payload signed has the transaction state + if ( !empty( $signature ) && $client->getWebhookEncryptionService()->isContentValid( $signature, $clean_data ) ) { + WC_WeArePlanet_Webhook_Strategy_Manager::instance()->process( $request ); } - $webhook_handler_class_name = $webhook_model->get_handler_class_name(); - $webhook_handler = $webhook_handler_class_name::instance(); - $webhook_handler->process( $request ); + header( 'HTTP/1.1 200 OK' ); } catch ( Exception $e ) { WooCommerce_WeArePlanet::instance()->log( $e->getMessage(), WC_Log_Levels::ERROR ); - // phpcs:ignore + // phpcs:ignore echo esc_textarea($e->getMessage()); exit(); } diff --git a/includes/service/class-wc-weareplanet-service-line-item.php b/includes/service/class-wc-weareplanet-service-line-item.php index 46a67d0..44e5132 100644 --- a/includes/service/class-wc-weareplanet-service-line-item.php +++ b/includes/service/class-wc-weareplanet-service-line-item.php @@ -241,7 +241,6 @@ protected function create_shipping_line_items_from_session( $packages, $chosen_m */ protected function create_coupons_line_items_from_session() { $coupons = array(); - $currency = get_woocommerce_currency(); $cart = WC()->cart; if ( empty( $cart->get_applied_coupons() ) ) { @@ -249,8 +248,10 @@ protected function create_coupons_line_items_from_session() { } $discount = $cart->get_discount_total() + $cart->get_discount_tax(); - $line_item = $this->create_coupon_line_item( current($cart->get_coupons()), $discount ); - $coupons[] = $line_item; + $line_items = $this->create_coupon_line_items( current( $cart->get_coupons() ), $discount ); + if ( is_array( $line_items ) ) { + $coupons = array_merge( $coupons, $line_items ); + } return $coupons; } @@ -260,27 +261,86 @@ protected function create_coupons_line_items_from_session() { * @param float $amount * @return \WeArePlanet\Sdk\Model\LineItemCreate|null */ - private function create_coupon_line_item( $coupon, float $amount = 0 ) { - //check if the coupon is valid + private function create_coupon_line_items( $coupon, float $total_discount_amount = 0 ) { if ( !$coupon instanceof WC_Coupon && !$coupon instanceof WC_Order_Item_Coupon ) { - return null; + return []; } - + $coupon = new WC_Coupon( $coupon->get_code() ); - - $amount = $amount * -1; $sku = $this->fix_length( $coupon->get_discount_type(), 150 ); $sku = str_replace( array( "\n", "\r", ), '', $sku ); + + // Calculate the proportional discount amounts for each tax rate + $discounts = $this->calculate_discount_rates_proportionally( $total_discount_amount ); + + $line_items = []; + + foreach ( $discounts as $discount ) { + $line_item = new \WeArePlanet\Sdk\Model\LineItemCreate(); + $line_item->setAmountIncludingTax( $discount['amount'] * -1 ); + $line_item->setName( sprintf( '%s: %s (%s%% tax)', WC_WeArePlanet_Packages_Coupon_Discount::COUPON, $coupon->get_code(), $discount['rate_id']) ); + $line_item->setQuantity( 1 ); + $line_item->setShippingRequired( false ); + $line_item->setSku( $sku, 200 ); + $line_item->setType( \WeArePlanet\Sdk\Model\LineItemType::DISCOUNT ); + $line_item->setUniqueId( 'coupon-' . $coupon->get_id() . '-' . $discount['rate_id'] ); + + $tax_rate = new \WeArePlanet\Sdk\Model\TaxCreate([ + 'title' => 'Discount Tax: ' . $discount['rate_id'], + 'rate' => $discount['rate_id'], + ]); + + $line_item->setTaxes( [$tax_rate] ); + + $line_items[] = $line_item; + } + + return $line_items; + } - $line_item = new \WeArePlanet\Sdk\Model\LineItemCreate(); - $line_item->setAmountIncludingTax( $amount ); - $line_item->setName( sprintf( '%s: %s', WC_WeArePlanet_Packages_Coupon_Discount::COUPON, $coupon->get_code() ) ); - $line_item->setQuantity( 1 ); - $line_item->setShippingRequired( false ); - $line_item->setSku( $sku, 200 ); - $line_item->setType( \WeArePlanet\Sdk\Model\LineItemType::DISCOUNT ); - $line_item->setUniqueId( 'coupon-' . $coupon->get_id() ); - return $line_item; + /** + * @param float $total_discount_amount + * @return array + */ + private function calculate_discount_rates_proportionally(float $total_discount_amount): array { + $cart = WC()->cart; + $tax_totals = []; + $total_amount = 0; + + foreach ( $cart->get_cart() as $cart_item ) { + $product = $cart_item['data']; + $tax_class = $product->get_tax_class(); + $tax_rates_class = WC_Tax::get_rates( $tax_class ); + + foreach ( $tax_rates_class as $rate ) { + $rate_id = $rate['rate']; + $line_total_with_tax = $cart_item['line_total'] + $cart_item['line_tax']; + + if ( !isset($tax_totals[$rate_id]) ) { + $tax_totals[$rate_id] = [ + 'total' => 0, + 'rate_percentage' => $rate_id + ]; + } + + $tax_totals[$rate_id]['total'] += $line_total_with_tax; + $total_amount += $line_total_with_tax; + } + } + + $discounts = []; + + foreach ($tax_totals as $rate_id => $data) { + $proportional_discount_amount = $total_discount_amount * ($data['total'] / $total_amount); + + $discounts[] = [ + 'rate_id' => $rate_id, + 'amount' => $proportional_discount_amount, + 'rate_percentage' => $rate_id, + ]; + } + + return $discounts; } /** * Returns the line items from the given cart @@ -514,8 +574,11 @@ protected function create_coupons_line_items_from_order( WC_Order $order ) { /** @var WC_Order_Item_Coupon $coupon */ $discount += (float)$coupon->get_discount() + (float)$coupon->get_discount_tax(); } - $line_item = $this->create_coupon_line_item( current($order->get_coupons()), $discount ); - $coupons[] = $this->clean_line_item( $line_item ); + + $line_items = $this->create_coupon_line_items( current($order->get_coupons()), $discount ); + foreach ($line_items as $line_item) { + $coupons[] = $this->clean_line_item( $line_item ); + } return $coupons; } @@ -568,11 +631,11 @@ protected function create_product_line_items_from_backend( array $backend_items, //At this point, if there is a discount applied by coupon, the price already has the discount applied, //and to be able to send the discount to the portal, it is necessary to restore the discounted amount, - //the original price must be restored before being applied, otherwise it would be discounting twice in the portal. + //the original price must be restored before being applied, otherwise it would be discounting twice in the portal. $item_data_coupon = $item->get_meta( '_weareplanet_coupon_discount_line_item_discounts' ); if ( !empty ( $item_data_coupon ) ) { - $discount_tax = $item->get_subtotal_tax() - $item->get_total_tax(); - $discount_amount = $item->get_subtotal() - $item->get_total(); + $discount_tax = $item->get_subtotal_tax() - $item->get_total_tax(); + $discount_amount = $item->get_subtotal() - $item->get_total(); $discounts = $discount_tax + $discount_amount; } diff --git a/includes/service/class-wc-weareplanet-service-webhook.php b/includes/service/class-wc-weareplanet-service-webhook.php index 092f342..88b8063 100644 --- a/includes/service/class-wc-weareplanet-service-webhook.php +++ b/includes/service/class-wc-weareplanet-service-webhook.php @@ -20,6 +20,17 @@ */ class WC_WeArePlanet_Service_Webhook extends WC_WeArePlanet_Service_Abstract { + const WEAREPLANET_MANUAL_TASK = 1487165678181; + const WEAREPLANET_PAYMENT_METHOD_CONFIGURATION = 1472041857405; + const WEAREPLANET_TRANSACTION = 1472041829003; + const WEAREPLANET_DELIVERY_INDICATION = 1472041819799; + const WEAREPLANET_TRANSACTION_INVOICE = 1472041816898; + const WEAREPLANET_TRANSACTION_COMPLETION = 1472041831364; + const WEAREPLANET_TRANSACTION_VOID = 1472041867364; + const WEAREPLANET_REFUND = 1472041839405; + const WEAREPLANET_TOKEN = 1472041806455; + const WEAREPLANET_TOKEN_VERSION = 1472041811051; + /** * The webhook listener API service. * @@ -48,8 +59,15 @@ class WC_WeArePlanet_Service_Webhook extends WC_WeArePlanet_Service_Abstract { * Constructor to register the webhook entites. */ public function __construct() { - $this->webhook_entities[1487165678181] = new WC_WeArePlanet_Webhook_Entity( - 1487165678181, + $this->init_webhook_entities(); + } + + /** + * Initializes webhook entities with their specific configurations. + */ + private function init_webhook_entities() { + $this->webhook_entities[self::WEAREPLANET_MANUAL_TASK] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_MANUAL_TASK, 'Manual Task', array( \WeArePlanet\Sdk\Model\ManualTaskState::DONE, @@ -58,8 +76,8 @@ public function __construct() { ), 'WC_WeArePlanet_Webhook_Manual_Task' ); - $this->webhook_entities[1472041857405] = new WC_WeArePlanet_Webhook_Entity( - 1472041857405, + $this->webhook_entities[self::WEAREPLANET_PAYMENT_METHOD_CONFIGURATION] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_PAYMENT_METHOD_CONFIGURATION, 'Payment Method Configuration', array( \WeArePlanet\Sdk\Model\CreationEntityState::ACTIVE, @@ -70,8 +88,8 @@ public function __construct() { 'WC_WeArePlanet_Webhook_Method_Configuration', true ); - $this->webhook_entities[1472041829003] = new WC_WeArePlanet_Webhook_Entity( - 1472041829003, + $this->webhook_entities[self::WEAREPLANET_TRANSACTION] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_TRANSACTION, 'Transaction', array( \WeArePlanet\Sdk\Model\TransactionState::CONFIRMED, @@ -85,8 +103,8 @@ public function __construct() { ), 'WC_WeArePlanet_Webhook_Transaction' ); - $this->webhook_entities[1472041819799] = new WC_WeArePlanet_Webhook_Entity( - 1472041819799, + $this->webhook_entities[self::WEAREPLANET_DELIVERY_INDICATION] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_DELIVERY_INDICATION, 'Delivery Indication', array( \WeArePlanet\Sdk\Model\DeliveryIndicationState::MANUAL_CHECK_REQUIRED, @@ -94,8 +112,8 @@ public function __construct() { 'WC_WeArePlanet_Webhook_Delivery_Indication' ); - $this->webhook_entities[1472041816898] = new WC_WeArePlanet_Webhook_Entity( - 1472041816898, + $this->webhook_entities[self::WEAREPLANET_TRANSACTION_INVOICE] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_TRANSACTION_INVOICE, 'Transaction Invoice', array( \WeArePlanet\Sdk\Model\TransactionInvoiceState::NOT_APPLICABLE, @@ -105,8 +123,8 @@ public function __construct() { 'WC_WeArePlanet_Webhook_Transaction_Invoice' ); - $this->webhook_entities[1472041831364] = new WC_WeArePlanet_Webhook_Entity( - 1472041831364, + $this->webhook_entities[self::WEAREPLANET_TRANSACTION_COMPLETION] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_TRANSACTION_COMPLETION, 'Transaction Completion', array( \WeArePlanet\Sdk\Model\TransactionCompletionState::FAILED, @@ -115,8 +133,8 @@ public function __construct() { 'WC_WeArePlanet_Webhook_Transaction_Completion' ); - $this->webhook_entities[1472041867364] = new WC_WeArePlanet_Webhook_Entity( - 1472041867364, + $this->webhook_entities[self::WEAREPLANET_TRANSACTION_VOID] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_TRANSACTION_VOID, 'Transaction Void', array( \WeArePlanet\Sdk\Model\TransactionVoidState::FAILED, @@ -125,8 +143,8 @@ public function __construct() { 'WC_WeArePlanet_Webhook_Transaction_Void' ); - $this->webhook_entities[1472041839405] = new WC_WeArePlanet_Webhook_Entity( - 1472041839405, + $this->webhook_entities[self::WEAREPLANET_REFUND] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_REFUND, 'Refund', array( \WeArePlanet\Sdk\Model\RefundState::FAILED, @@ -134,8 +152,8 @@ public function __construct() { ), 'WC_WeArePlanet_Webhook_Refund' ); - $this->webhook_entities[1472041806455] = new WC_WeArePlanet_Webhook_Entity( - 1472041806455, + $this->webhook_entities[self::WEAREPLANET_TOKEN] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_TOKEN, 'Token', array( \WeArePlanet\Sdk\Model\CreationEntityState::ACTIVE, @@ -145,8 +163,8 @@ public function __construct() { ), 'WC_WeArePlanet_Webhook_Token' ); - $this->webhook_entities[1472041811051] = new WC_WeArePlanet_Webhook_Entity( - 1472041811051, + $this->webhook_entities[self::WEAREPLANET_TOKEN_VERSION] = new WC_WeArePlanet_Webhook_Entity( + self::WEAREPLANET_TOKEN_VERSION, 'Token Version', array( \WeArePlanet\Sdk\Model\TokenVersionState::ACTIVE, @@ -183,16 +201,18 @@ public function install() { } /** - * Get webhook entity for id. + * Get the webhook entity for a specific ID or throws an exception if not found. * - * @param int|string $id id. - * @return WC_WeArePlanet_Webhook_Entity + * @param mixed $id The ID of the webhook entity to retrieve. + * @return WC_WeArePlanet_Webhook_Entity The webhook entity associated with the given ID. + * @throws Exception If the webhook entity cannot be found. */ public function get_webhook_entity_for_id( $id ) { - if ( isset( $this->webhook_entities[ $id ] ) ) { - return $this->webhook_entities[ $id ]; + if ( !isset( $this->webhook_entities[ $id ] ) ) { + throw new Exception( sprintf( 'Could not retrieve webhook model for listener entity id: %s', $id ) ); } - return null; + + return $this->webhook_entities[ $id ]; } /** @@ -213,6 +233,7 @@ protected function create_webhook_listener( WC_WeArePlanet_Webhook_Entity $entit $webhook_listener->setState( \WeArePlanet\Sdk\Model\CreationEntityState::ACTIVE ); $webhook_listener->setUrl( $webhook_url->getId() ); $webhook_listener->setNotifyEveryChange( $entity->is_notify_every_change() ); + $webhook_listener->setEnablePayloadSignatureAndState( true ); return $this->get_webhook_listener_service()->create( $space_id, $webhook_listener ); } diff --git a/includes/webhook/class-wc-weareplanet-webhook-abstract.php b/includes/webhook/class-wc-weareplanet-webhook-abstract.php index e9486c2..457907b 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-abstract.php +++ b/includes/webhook/class-wc-weareplanet-webhook-abstract.php @@ -17,6 +17,8 @@ } /** * Abstract webhook processor. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Strategy_Interface */ abstract class WC_WeArePlanet_Webhook_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-delivery-indication.php b/includes/webhook/class-wc-weareplanet-webhook-delivery-indication.php index 1741828..7410305 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-delivery-indication.php +++ b/includes/webhook/class-wc-weareplanet-webhook-delivery-indication.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle delivery indication state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Delivery_Indication_Strategy */ class WC_WeArePlanet_Webhook_Delivery_Indication extends WC_WeArePlanet_Webhook_Order_Related_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-entity.php b/includes/webhook/class-wc-weareplanet-webhook-entity.php index 6d7d777..dcb73ac 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-entity.php +++ b/includes/webhook/class-wc-weareplanet-webhook-entity.php @@ -111,6 +111,7 @@ public function is_notify_every_change() { * Get Handler class name. * * @return mixed + * @deprecated This method will be deprecated in a future version as it is no longer necessary for webhook strategies. */ public function get_handler_class_name() { return $this->handler_class_name; diff --git a/includes/webhook/class-wc-weareplanet-webhook-manual-task.php b/includes/webhook/class-wc-weareplanet-webhook-manual-task.php index 7a33a4a..591d1f4 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-manual-task.php +++ b/includes/webhook/class-wc-weareplanet-webhook-manual-task.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle manual task state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Manual_Task_Strategy */ class WC_WeArePlanet_Webhook_Manual_Task extends WC_WeArePlanet_Webhook_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-method-configuration.php b/includes/webhook/class-wc-weareplanet-webhook-method-configuration.php index 05cc958..0be426a 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-method-configuration.php +++ b/includes/webhook/class-wc-weareplanet-webhook-method-configuration.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle payment method configuration state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Method_Configuration_Strategy */ class WC_WeArePlanet_Webhook_Method_Configuration extends WC_WeArePlanet_Webhook_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-order-related-abstract.php b/includes/webhook/class-wc-weareplanet-webhook-order-related-abstract.php index 13498c9..a29335e 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-order-related-abstract.php +++ b/includes/webhook/class-wc-weareplanet-webhook-order-related-abstract.php @@ -17,6 +17,8 @@ } /** * Abstract webhook processor for order related entities. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Strategy_Base */ abstract class WC_WeArePlanet_Webhook_Order_Related_Abstract extends WC_WeArePlanet_Webhook_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-refund.php b/includes/webhook/class-wc-weareplanet-webhook-refund.php index b3a2641..b1e7da9 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-refund.php +++ b/includes/webhook/class-wc-weareplanet-webhook-refund.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle refund state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Service_Refund */ class WC_WeArePlanet_Webhook_Refund extends WC_WeArePlanet_Webhook_Order_Related_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-request.php b/includes/webhook/class-wc-weareplanet-webhook-request.php index 1550d58..f4390b6 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-request.php +++ b/includes/webhook/class-wc-weareplanet-webhook-request.php @@ -68,6 +68,13 @@ class WC_WeArePlanet_Webhook_Request { */ private $timestamp; + /** + * Entity state. + * + * @var mixed + */ + private $state; + /** * Constructor. * @@ -75,17 +82,18 @@ class WC_WeArePlanet_Webhook_Request { */ public function __construct( $model ) { $this->event_id = $model->eventId; - // phpcs:ignore + // phpcs:ignore $this->entity_id = $model->entityId; - // phpcs:ignore + // phpcs:ignore $this->listener_entity_id = $model->listenerEntityId; - // phpcs:ignore + // phpcs:ignore $this->listener_entity_technical_name = $model->listenerEntityTechnicalName; - // phpcs:ignore + // phpcs:ignore $this->space_id = $model->spaceId; - // phpcs:ignore + // phpcs:ignore $this->webhook_listener_id = $model->webhookListenerId; $this->timestamp = $model->timestamp; + $this->state = $model->state; } /** @@ -150,4 +158,13 @@ public function get_webhook_listener_id() { public function get_timestamp() { return $this->timestamp; } + + /** + * Returns the state of the webhook event's entity. + * + * @return string + */ + public function get_state() { + return $this->state; + } } diff --git a/includes/webhook/class-wc-weareplanet-webhook-token-version.php b/includes/webhook/class-wc-weareplanet-webhook-token-version.php index 314bd7f..8f78e16 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-token-version.php +++ b/includes/webhook/class-wc-weareplanet-webhook-token-version.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle token version state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Token_Version_Strategy */ class WC_WeArePlanet_Webhook_Token_Version extends WC_WeArePlanet_Webhook_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-token.php b/includes/webhook/class-wc-weareplanet-webhook-token.php index cef3dc5..49647a8 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-token.php +++ b/includes/webhook/class-wc-weareplanet-webhook-token.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle token state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Token_Strategy */ class WC_WeArePlanet_Webhook_Token extends WC_WeArePlanet_Webhook_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-transaction-completion.php b/includes/webhook/class-wc-weareplanet-webhook-transaction-completion.php index d260e31..057b46c 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-transaction-completion.php +++ b/includes/webhook/class-wc-weareplanet-webhook-transaction-completion.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle transaction completion state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Transaction_Completion_Strategy */ class WC_WeArePlanet_Webhook_Transaction_Completion extends WC_WeArePlanet_Webhook_Order_Related_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-transaction-invoice.php b/includes/webhook/class-wc-weareplanet-webhook-transaction-invoice.php index aee0e1c..c0d6f19 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-transaction-invoice.php +++ b/includes/webhook/class-wc-weareplanet-webhook-transaction-invoice.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle transaction completion state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Transaction_Invoice_Strategy */ class WC_WeArePlanet_Webhook_Transaction_Invoice extends WC_WeArePlanet_Webhook_Order_Related_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-transaction-void.php b/includes/webhook/class-wc-weareplanet-webhook-transaction-void.php index 037b4b9..f9b2355 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-transaction-void.php +++ b/includes/webhook/class-wc-weareplanet-webhook-transaction-void.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle transaction void state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Transaction_Void_Strategy */ class WC_WeArePlanet_Webhook_Transaction_Void extends WC_WeArePlanet_Webhook_Order_Related_Abstract { diff --git a/includes/webhook/class-wc-weareplanet-webhook-transaction.php b/includes/webhook/class-wc-weareplanet-webhook-transaction.php index f117b0a..56469a6 100644 --- a/includes/webhook/class-wc-weareplanet-webhook-transaction.php +++ b/includes/webhook/class-wc-weareplanet-webhook-transaction.php @@ -17,6 +17,8 @@ } /** * Webhook processor to handle transaction state transitions. + * @deprecated 3.0.12 No longer used by internal code and not recommended. + * @see WC_WeArePlanet_Webhook_Transaction_Strategy */ class WC_WeArePlanet_Webhook_Transaction extends WC_WeArePlanet_Webhook_Order_Related_Abstract { diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-delivery-indication-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-delivery-indication-strategy.php new file mode 100644 index 0000000..a01c6f0 --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-delivery-indication-strategy.php @@ -0,0 +1,100 @@ +get_api_client() ); + return $transaction_invoice_service->read( $request->get_space_id(), $request->get_entity_id() ); + } + + /** + * @inheritDoc + */ + protected function get_order_id( $object ) { + /* @var \Wallee\Sdk\Model\DeliveryIndication $object */ + return WC_WeArePlanet_Entity_Transaction_Info::load_by_transaction( + $object->getTransaction()->getLinkedSpaceId(), + $object->getTransaction()->getId() + )->get_order_id(); + } + + /** + * Processes the incoming webhook request pertaining to delivery indications. + * + * This method retrieves the delivery indication details from the API and updates the associated + * WooCommerce order based on the indication state. + * + * @param WC_WeArePlanet_Webhook_Request $request The webhook request object. + * @return void + */ + public function process( WC_WeArePlanet_Webhook_Request $request ) { + /* @var \WeArePlanet\Sdk\Model\DeliveryIndication $delivery_indication */ + $delivery_indication = $this->load_entity( $request ); + $order = $this->get_order( $delivery_indication ); + if ( false != $order && $order->get_id() ) { + $this->process_order_related_inner( $order, $delivery_indication, $request ); + } + } + + /** + * Additional processing on the order based on the state of the delivery indication. + * + * @param WC_Order $order The WooCommerce order linked to the delivery indication. + * @param \WeArePlanet\Sdk\Model\DeliveryIndication $delivery_indication The delivery indication object. + * @param WC_WeArePlanet_Webhook_Request $request The webhook request. + * @return void + */ + protected function process_order_related_inner( WC_Order $order, \WeArePlanet\Sdk\Model\DeliveryIndication $delivery_indication, WC_WeArePlanet_Webhook_Request $request ) { + switch ( $request->get_state() ) { + case \WeArePlanet\Sdk\Model\DeliveryIndicationState::MANUAL_CHECK_REQUIRED: + $this->review( $order ); + break; + default: + // Nothing to do. + break; + } + } + + /** + * Review and potentially update the order status based on manual review requirements. + * + * @param WC_Order $order The associated WooCommerce order. + * @return void + */ + protected function review( WC_Order $order ) { + $status = apply_filters( 'wc_weareplanet_manual_task_status', 'wearep-manual', $order ); + $order->add_meta_data( '_weareplanet_manual_check', true ); + $order->update_status( $status, __( 'A manual decision about whether to accept the payment is required.', 'woo-weareplanet' ) ); + } +} \ No newline at end of file diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-manual-task-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-manual-task-strategy.php new file mode 100644 index 0000000..3bd4d1e --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-manual-task-strategy.php @@ -0,0 +1,47 @@ +update(); + } +} diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-method-configuration-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-method-configuration-strategy.php new file mode 100644 index 0000000..2c87396 --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-method-configuration-strategy.php @@ -0,0 +1,47 @@ +synchronize(); + } +} diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-refund-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-refund-strategy.php new file mode 100644 index 0000000..5e4d928 --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-refund-strategy.php @@ -0,0 +1,145 @@ +get_api_client() ); + return $refund_service->read( $request->get_space_id(), $request->get_entity_id() ); + } + + /** + * @inheritDoc + */ + protected function get_order_id( $object ) { + /* @var \Wallee\Sdk\Model\Refund $object */ + return WC_WeArePlanet_Entity_Transaction_Info::load_by_transaction( + $object->getTransaction()->getLinkedSpaceId(), + $object->getTransaction()->getId() + )->get_order_id(); + } + + /** + * Processes the incoming webhook request related to refunds. + * + * This method retrieves the refund details from the API and updates the associated order + * based on the refund's state. + * + * @param WC_WeArePlanet_Webhook_Request $request The webhook request object. + * @return void + */ + public function process( WC_WeArePlanet_Webhook_Request $request ) { + /* @var \WeArePlanet\Sdk\Model\Refund $refund */ + $refund = $this->load_entity( $request ); + $order = $this->get_order( $refund ); + if ( false != $order && $order->get_id() ) { + $this->process_order_related_inner( $order, $refund, $request ); + } + } + + /** + * Performs additional order-related processing based on the refund state. + * + * @param WC_Order $order The WooCommerce order associated with the refund. + * @param \WeArePlanet\Sdk\Model\Refund $refund The transaction refund object. + * @param WC_WeArePlanet_Webhook_Request $request The webhook request object. + * @return void + */ + protected function process_order_related_inner( WC_Order $order, \WeArePlanet\Sdk\Model\Refund $refund, WC_WeArePlanet_Webhook_Request $request ) { + /* @var \WeArePlanet\Sdk\Model\Refund $refund */ + switch ( $request->get_state() ) { + case \WeArePlanet\Sdk\Model\RefundState::FAILED: + // fallback. + $this->failed( $refund, $order ); + break; + case \WeArePlanet\Sdk\Model\RefundState::SUCCESSFUL: + $this->refunded( $refund, $order ); + // Nothing to do. + default: + // Nothing to do. + break; + } + } + + /** + * Handles actions to be performed when a refund transaction fails. + * + * @param \WeArePlanet\Sdk\Model\Refund $refund refund. + * @param WC_Order $order order. + * @return void + * @throws Exception Exception. + */ + protected function failed( \WeArePlanet\Sdk\Model\Refund $refund, WC_Order $order ) { + $refund_job = WC_WeArePlanet_Entity_Refund_Job::load_by_external_id( $refund->getLinkedSpaceId(), $refund->getExternalId() ); + if ( $refund_job->get_id() ) { + $refund_job->set_state( WC_WeArePlanet_Entity_Refund_Job::STATE_FAILURE ); + if ( $refund->getFailureReason() != null ) { + $refund_job->set_failure_reason( $refund->getFailureReason()->getDescription() ); + } + $refund_job->save(); + $refunds = $order->get_refunds(); + foreach ( $refunds as $wc_refund ) { + if ( $wc_refund->get_meta( '_weareplanet_refund_job_id', true ) == $refund_job->get_id() ) { + $wc_refund->set_status( 'failed' ); + $wc_refund->save(); + break; + } + } + } + } + + /** + * Handles actions to be performed when a refund transaction is successful. + * + * @param \WeArePlanet\Sdk\Model\Refund $refund refund. + * @param WC_Order $order order. + * @return void + * @throws Exception Exception. + */ + protected function refunded( \WeArePlanet\Sdk\Model\Refund $refund, WC_Order $order ) { + $refund_job = WC_WeArePlanet_Entity_Refund_Job::load_by_external_id( $refund->getLinkedSpaceId(), $refund->getExternalId() ); + + if ( $refund_job->get_id() ) { + $refund_job->set_state( WC_WeArePlanet_Entity_Refund_Job::STATE_SUCCESS ); + $refund_job->save(); + $refunds = $order->get_refunds(); + foreach ( $refunds as $wc_refund ) { + if ( $wc_refund->get_meta( '_weareplanet_refund_job_id', true ) == $refund_job->get_id() ) { + $wc_refund->set_status( 'completed' ); + $wc_refund->save(); + break; + } + } + } + } +} diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-base.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-base.php new file mode 100644 index 0000000..b89e85b --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-base.php @@ -0,0 +1,65 @@ +get_api_client() ); + return $transaction_service->read( $request->get_space_id(), $request->get_entity_id() ); + } + + /** + * Get the WooCommerce order associated with the webhook request. + * + * This method uses the Order Factory to fetch the order based on the ID retrieved from the transaction linked to the webhook request. + * + * @param WC_WeArePlanet_Webhook_Request|mixed $object The webhook request or transaction that containing data needed to identify the order. + * @return \WC_Order The WooCommerce order object associated with the request. + */ + protected function get_order( $object ) { + return WC_Order_Factory::get_order( $this->get_order_id( $object ) ); + } + + /** + * Extracts the order ID from a transaction. + * + * This method fetches the order ID by using the transaction information available in the webhook request. + * It is typically used to link the transaction data retrieved via API to a specific WooCommerce order. + * + * @param WC_WeArePlanet_Webhook_Request|mixed $object. + * @return int|string + */ + protected function get_order_id( $object ) { + return WC_WeArePlanet_Entity_Transaction_Info::load_by_transaction( $object->get_space_id(), $object->get_entity_id() )->get_order_id(); + } +} \ No newline at end of file diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-interface.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-interface.php new file mode 100644 index 0000000..984a0ca --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-strategy-interface.php @@ -0,0 +1,42 @@ +webhook_service = WC_WeArePlanet_Service_Webhook::instance(); + $this->helper = WC_WeArePlanet_Helper::instance(); + $this->configure_strategies_to_handle_webhooks(); + } + + /** + * Initializes the list of strategies for handling different types of webhook events. + * + * This method populates the 'strategies' array with instances of various webhook handling strategies. + * Each strategy corresponds to a specific type of webhook event, ensuring that the appropriate + * processing logic is applied based on the type of the incoming webhook request. + * + * @return void + */ + private function configure_strategies_to_handle_webhooks() { + $this->strategies[] = new WC_WeArePlanet_Webhook_Manual_Task_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Method_Configuration_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Transaction_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Delivery_Indication_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Transaction_Invoice_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Transaction_Completion_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Transaction_Void_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Refund_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Token_Strategy(); + $this->strategies[] = new WC_WeArePlanet_Webhook_Token_Version_Strategy(); + } + + /** + * Resolves the appropriate strategy for handling the given webhook request based on webhook type. + * + * This method fetches the webhook entity using the listener entity ID from the request, checks if a corresponding + * strategy exists, and returns the strategy if found. + * + * @param WC_WeArePlanet_Webhook_Request $request The incoming webhook request. + * @return WC_WeArePlanet_Webhook_Strategy_Interface The strategy to handle the request. + * @throws Exception If no strategy can be resolved. + */ + private function resolve_strategy( WC_WeArePlanet_Webhook_Request $request ) { + /** @var WC_WeArePlanet_Webhook_Entity $webhook_model */ + $webhook_model = $this->webhook_service->get_webhook_entity_for_id( $request->get_listener_entity_id() ); + + // Check if the webhook model exists for this listener entity ID. + if ( is_null( $webhook_model ) ) { + throw new Exception( sprintf( 'Could not retrieve webhook model for listener entity id: %s', $request->get_listener_entity_id() ) ); + } + + $webhook_transaction_id = $webhook_model->get_id(); + + // Check if the strategy exists for the retrieved transaction ID. + foreach ($this->strategies as $strategy) { + /** @var WC_WeArePlanet_Webhook_Strategy_Interface $strategy */ + if ( $strategy->match( $webhook_transaction_id ) ) { + return $strategy; + } + } + + // No strategy found for the transaction ID + throw new Exception( sprintf( 'No strategy available for the transaction ID: %s', $webhook_transaction_id ) ); + } + + /** + * Processes the incoming webhook by delegating to the appropriate strategy. + * + * This method determines the type of the incoming webhook request and uses it + * to look up the corresponding strategy. If a strategy is found, it delegates the + * request processing to that strategy. If no strategy is found for the type, it + * throws an exception. + * + * @param WC_WeArePlanet_Webhook_Request $request The incoming webhook request object. + * @throws Exception If no strategy is available for the webhook type provided in the request. + */ + public function process( WC_WeArePlanet_Webhook_Request $request ) { + $this->helper->start_database_transaction(); + + try { + $this->helper->lock_by_transaction_id( $request->get_space_id(), $request->get_entity_id() ); + + $strategy = $this->resolve_strategy( $request ); + $strategy->process( $request ); + + $this->helper->commit_database_transaction(); + } catch ( Exception $e ) { + $this->helper->rollback_database_transaction(); + throw $e; + } + } +} \ No newline at end of file diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-token-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-token-strategy.php new file mode 100644 index 0000000..2d8abef --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-token-strategy.php @@ -0,0 +1,48 @@ +update_token( $request->get_space_id(), $request->get_entity_id() ); + } +} diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-token-version-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-token-version-strategy.php new file mode 100644 index 0000000..60e1bbb --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-token-version-strategy.php @@ -0,0 +1,48 @@ +update_token_version( $request->get_space_id(), $request->get_entity_id() ); + } +} diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-completion-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-completion-strategy.php new file mode 100644 index 0000000..4dd7238 --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-completion-strategy.php @@ -0,0 +1,272 @@ +get_api_client() ); + return $transaction_invoice_service->read( $request->get_space_id(), $request->get_entity_id() ); + } + + /** + * @inheritDoc + */ + protected function get_order_id( $object ) { + /* @var \Wallee\Sdk\Model\TransactionCompletion $object */ + return WC_WeArePlanet_Entity_Transaction_Info::load_by_transaction( + $object->getLineItemVersion()->getTransaction()->getLinkedSpaceId(), + $object->getLineItemVersion()->getTransaction()->getId() + )->get_order_id(); + } + + /** + * Processes the incoming webhook request pertaining to transaction completions. + * + * This method retrieves the transaction completion details from the API and updates the associated + * WooCommerce order based on the state of the completion. + * + * @param WC_WeArePlanet_Webhook_Request $request The webhook request object. + * @return void + */ + public function process( WC_WeArePlanet_Webhook_Request $request ) { + /* @var \WeArePlanet\Sdk\Model\TransactionCompletion $completion */ + $completion = $this->load_entity( $request ); + $order = $this->get_order( $completion ); + if ( false != $order && $order->get_id() ) { + $this->process_order_related_inner( $order, $completion, $request ); + } + } + + /** + * Additional processing on the order based on the state of the transaction completion. + * + * @param WC_Order $order The WooCommerce order linked to the completion. + * @param \WeArePlanet\Sdk\Model\TransactionCompletion $completion The transaction completion object. + * @param WC_WeArePlanet_Webhook_Request $request The webhook request. + * @return void + */ + protected function process_order_related_inner( WC_Order $order, \WeArePlanet\Sdk\Model\TransactionCompletion $completion, WC_WeArePlanet_Webhook_Request $request ) { + switch ( $request->get_state() ) { + case \WeArePlanet\Sdk\Model\TransactionCompletionState::FAILED: + $this->failed( $order, $completion ); + break; + case \WeArePlanet\Sdk\Model\TransactionCompletionState::SUCCESSFUL: + $this->success( $order, $completion ); + break; + default: + // Nothing to do. + break; + } + } + + /** + * Handles successful transaction completion. + * + * @param WC_Order $order The associated WooCommerce order. + * @param \WeArePlanet\Sdk\Model\TransactionCompletion $completion The transaction completion data. + * @return void + */ + protected function success( WC_Order $order, \WeArePlanet\Sdk\Model\TransactionCompletion $completion ) { + $completion_job = WC_WeArePlanet_Entity_Completion_Job::load_by_completion( $completion->getLinkedSpaceId(), $completion->getId() ); + if ( ! $completion_job->get_id() ) { + // We have no completion job with this id -> the server could not store the id of the completion after sending the request. (e.g. connection issue or crash) + // We only have on running completion which was not yet processed successfully and use it as it should be the one the webhook is for. + $completion_job = WC_WeArePlanet_Entity_Completion_Job::load_running_completion_for_transaction( + $completion->getLinkedSpaceId(), + $completion->getLinkedTransaction() + ); + if ( ! $completion_job->get_id() ) { + // completion not initiated in shop backend ignore. + return; + } + $completion_job->set_completion_id( $completion->getId() ); + } + $completion_job->set_state( WC_WeArePlanet_Entity_Completion_Job::STATE_DONE ); + + if ( $completion_job->get_restock() ) { + $this->restock_non_completed_items( (array) $completion_job->get_items(), $order ); + } + $this->adapt_order_items( (array) $completion_job->get_items(), $order ); + $completion_job->save(); + } + + /** + * Restock non completed items. + * + * @param array $completed_items completed items. + * @param WC_Order $order order. + * @return void + */ + private function restock_non_completed_items( array $completed_items, WC_Order $order ) { + if ( 'yes' === get_option( 'woocommerce_manage_stock' ) && $order && count( $order->get_items() ) > 0 ) { + foreach ( $order->get_items() as $item_id => $item ) { + $product = $item->get_product(); + if ( $item->is_type( 'line_item' ) && $product && $product->managing_stock() ) { + + $changed_qty = $item->get_quantity(); + if ( isset( $completed_items[ $item_id ] ) ) { + $changed_qty = $changed_qty - $completed_items[ $item_id ]['qty']; + } + if ( $changed_qty > 0 ) { + $item_name = esc_attr( $product->get_formatted_name() ); + $new_stock = wc_update_product_stock( $product, $changed_qty, 'increase' ); + $old_stock = $new_stock - $changed_qty; + + $order->add_order_note( + /* translators: %1$s, %2$s, %3$s are replaced with "string" */ + sprintf( __( '%1$s stock increased from %2$s to %3$s.', 'woo-weareplanet' ), $item_name, $old_stock, $new_stock ) + ); + do_action( 'wc_weareplanet_restock_not_completed_item', $product->get_id(), $old_stock, $new_stock, $order, $product ); + } + } + } + } + } + + /** + * Adapt order items. + * + * @param array $completed_items completed items. + * @param WC_Order $order order. + * @return void + */ + private function adapt_order_items( array $completed_items, WC_Order $order ) { + foreach ( $order->get_items() as $item_id => $item ) { + if ( ! isset( $completed_items[ $item_id ] ) || + $completed_items[ $item_id ]['completion_total'] + array_sum( $completed_items[ $item_id ]['completion_tax'] ) == 0 ) { + $order_item = $order->get_item( $item_id ); + $order_item->delete( true ); + continue; + } + $old_total = $item->get_total(); + $subtotal = $item->get_subtotal(); + $ratio = $old_total / $completed_items[ $item_id ]['completion_total']; + if ( 0 != $ratio ) { + $subtotal = $subtotal / $ratio; + } + $old_taxes = $item->get_taxes(); + $new_taxes = array( + 'total' => array(), + 'subtotal' => array(), + ); + foreach ( array_keys( $old_taxes['total'] ) as $id ) { + $old_tax = $old_taxes['total'][ $id ]; + $subtax = $old_taxes['subtotal'][ $id ]; + if ( 0 != $completed_items[ $item_id ]['completion_tax'][ $id ] ) { + $ration = $old_tax / $completed_items[ $item_id ]['completion_tax'][ $id ]; + if ( 0 != $ration ) { + $subtax = $subtax / $ratio; + } + } + $new_taxes['total'][ $id ] = wc_format_decimal( $completed_items[ $item_id ]['completion_tax'][ $id ], wc_get_price_decimals() ); + $new_taxes['subtotal'][ $id ] = wc_format_decimal( $subtax, wc_get_price_decimals() ); + } + + $item->set_props( + array( + 'quantity' => $completed_items[ $item_id ]['qty'], + 'total' => wc_format_decimal( $completed_items[ $item_id ]['completion_total'], wc_get_price_decimals() ), + 'subtotal' => wc_format_decimal( $subtotal, wc_get_price_decimals() ), + 'taxes' => $new_taxes, + ) + ); + $item->save(); + } + foreach ( $order->get_fees() as $fee_id => $fee ) { + if ( ! isset( $completed_items[ $fee_id ] ) || + $completed_items[ $fee_id ]['completion_total'] + array_sum( $completed_items[ $fee_id ]['completion_tax'] ) == 0 ) { + $order_fee = $order->get_item( $fee_id ); + $order_fee->delete(); + continue; + } + $fee->set_props( + array( + 'total' => $completed_items[ $fee_id ]['completion_total'], + 'taxes' => array( + 'total' => $completed_items[ $fee_id ]['completion_tax'], + ), + ) + ); + $fee->save(); + } + foreach ( $order->get_shipping_methods() as $shipping_id => $shipping ) { + + if ( ! isset( $completed_items[ $shipping_id ] ) || + $completed_items[ $shipping_id ]['completion_total'] + array_sum( $completed_items[ $shipping_id ]['completion_tax'] ) == 0 ) { + $order_shipping = $order->get_item( $shipping_id ); + $order_shipping->delete(); + continue; + } + $shipping->set_props( + array( + 'total' => $completed_items[ $shipping_id ]['completion_total'], + 'taxes' => array( + 'total' => $completed_items[ $shipping_id ]['completion_tax'], + ), + ) + ); + + $shipping->save(); + } + $order->save(); + $order = WC_Order_Factory::get_order( $order->get_id() ); + $order->update_taxes(); + $order->calculate_totals( false ); + } + + /** + * Handles failed transaction completion. + * + * @param WC_Order $order The associated WooCommerce order. + * @param \WeArePlanet\Sdk\Model\TransactionCompletion $completion The transaction completion data that failed. + * @return void + */ + protected function failed( WC_Order $order, \WeArePlanet\Sdk\Model\TransactionCompletion $completion ) { + $completion_job = WC_WeArePlanet_Entity_Completion_Job::load_by_completion( $completion->getLinkedSpaceId(), $completion->getId() ); + if ( ! $completion_job->get_id() ) { + $completion_job = WC_WeArePlanet_Entity_Completion_Job::load_running_completion_for_transaction( + $completion->getLinkedSpaceId(), + $completion->getLinkedTransaction() + ); + if ( ! $completion_job->get_id() ) { + return; + } + $completion_job->set_completion_id( $completion->getId() ); + } + if ( $completion->getFailureReason() != null ) { + $completion_job->set_failure_reason( $completion->getFailureReason()->getDescription() ); + } + $completion_job->set_state( WC_WeArePlanet_Entity_Completion_Job::STATE_DONE ); + $completion_job->save(); + } +} \ No newline at end of file diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-invoice-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-invoice-strategy.php new file mode 100644 index 0000000..1309ef5 --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-invoice-strategy.php @@ -0,0 +1,92 @@ +get_api_client() ); + return $transaction_invoice_service->read( $request->get_space_id(), $request->get_entity_id() ); + } + + /** + * @inheritDoc + */ + protected function get_order_id( $object ) { + /* @var \Wallee\Sdk\Model\TransactionInvoice $object */ + return WC_WeArePlanet_Entity_Transaction_Info::load_by_transaction( + $object->getLinkedSpaceId(), + $object->getCompletion()->getLineItemVersion()->getTransaction()->getId() + )->get_order_id(); + } + + /** + * Processes the incoming webhook request pertaining to transaction invoices. + * + * This method retrieves the transaction invoice details from the API and updates the associated + * WooCommerce order based on the state of the invoice. + * + * @param WC_WeArePlanet_Webhook_Request $request The webhook request object. + * @return void + */ + public function process( WC_WeArePlanet_Webhook_Request $request ) { + /* @var \WeArePlanet\Sdk\Model\TransactionInvoice $transaction_invoice */ + $transaction_invoice = $this->load_entity( $request ); + $order = $this->get_order( $transaction_invoice ); + if ( false != $order && $order->get_id() ) { + $this->process_order_related_inner( $order, $transaction_invoice, $request ); + } + } + + /** + * Additional processing on the order based on the state of the transaction invoice. + * + * @param WC_Order $order The WooCommerce order linked to the invoice. + * @param \WeArePlanet\Sdk\Model\TransactionInvoice $transaction_invoice The transaction invoice object. + * @param WC_WeArePlanet_Webhook_Request $request The webhook request object. + * @return void + */ + protected function process_order_related_inner( WC_Order $order, \WeArePlanet\Sdk\Model\TransactionInvoice $transaction_invoice, WC_WeArePlanet_Webhook_Request $request ) { + switch ( $request->get_state() ) { + case \WeArePlanet\Sdk\Model\TransactionInvoiceState::DERECOGNIZED: + $order->add_order_note( __( 'Invoice Not Settled' ) ); + break; + case \WeArePlanet\Sdk\Model\TransactionInvoiceState::NOT_APPLICABLE: + case \WeArePlanet\Sdk\Model\TransactionInvoiceState::PAID: + $order->add_order_note( __( 'Invoice Settled' ) ); + break; + default: + // Nothing to do. + break; + } + } +} diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-strategy.php new file mode 100644 index 0000000..78068b3 --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-strategy.php @@ -0,0 +1,197 @@ +get_order( $request ); + if ( false != $order && $order->get_id() ) { + $this->process_order_related_inner( $order, $request ); + } + } + + /** + * Process order related inner. + * + * @param WC_Order $order order. + * @param WC_WeArePlanet_Webhook_Request $request request. + * @return void + * @throws Exception Exception. + */ + protected function process_order_related_inner( WC_Order $order, WC_WeArePlanet_Webhook_Request $request ) { + $transaction_info = WC_WeArePlanet_Entity_Transaction_Info::load_by_order_id( $order->get_id() ); + if ( $request->get_state() != $transaction_info->get_state() ) { + switch ( $request->get_state() ) { + case \WeArePlanet\Sdk\Model\TransactionState::CONFIRMED: + case \WeArePlanet\Sdk\Model\TransactionState::PROCESSING: + $this->confirm( $request, $order ); + break; + case \WeArePlanet\Sdk\Model\TransactionState::AUTHORIZED: + $this->authorize( $request, $order ); + break; + case \WeArePlanet\Sdk\Model\TransactionState::DECLINE: + $this->decline( $request, $order ); + break; + case \WeArePlanet\Sdk\Model\TransactionState::FAILED: + $this->failed( $request, $order ); + break; + case \WeArePlanet\Sdk\Model\TransactionState::FULFILL: + $this->authorize( $request, $order ); + $this->fulfill( $request, $order ); + break; + case \WeArePlanet\Sdk\Model\TransactionState::VOIDED: + $this->voided( $request, $order ); + break; + case \WeArePlanet\Sdk\Model\TransactionState::COMPLETED: + $this->authorize( $request, $order ); + $this->waiting( $request, $order ); + break; + default: + // Nothing to do. + break; + } + } + + WC_WeArePlanet_Service_Transaction::instance()->update_transaction_info( $this->load_entity( $request ), $order ); + } + + /** + * Confirm. + * + * @param WC_WeArePlanet_Webhook_Request $request request. + * @param WC_Order $order order. + * @return void + */ + protected function confirm( WC_WeArePlanet_Webhook_Request $request, WC_Order $order ) { + if ( ! $order->get_meta( '_weareplanet_confirmed', true ) && ! $order->get_meta( '_weareplanet_authorized', true ) ) { + do_action( 'wc_weareplanet_confirmed', $this->load_entity( $request ), $order ); + $order->add_meta_data( '_weareplanet_confirmed', 'true', true ); + $status = apply_filters( 'wc_weareplanet_confirmed_status', 'wearep-redirected', $order ); + $order->update_status( $status ); + wc_maybe_reduce_stock_levels( $order->get_id() ); + } + } + + /** + * Authorize. + * + * @param WC_WeArePlanet_Webhook_Request $request request. + * @param \WC_Order $order order. + */ + protected function authorize( WC_WeArePlanet_Webhook_Request $request, WC_Order $order ) { + if ( ! $order->get_meta( '_weareplanet_authorized', true ) ) { + do_action( 'wc_weareplanet_authorized', $this->load_entity( $request ), $order ); + $status = apply_filters( 'wc_weareplanet_authorized_status', 'on-hold', $order ); + $order->add_meta_data( '_weareplanet_authorized', 'true', true ); + $order->update_status( $status ); + wc_maybe_reduce_stock_levels( $order->get_id() ); + if ( isset( WC()->cart ) ) { + WC()->cart->empty_cart(); + } + } + } + + /** + * Waiting. + * + * @param WC_WeArePlanet_Webhook_Request $request request. + * @param WC_Order $order order. + * @return void + */ + protected function waiting( WC_WeArePlanet_Webhook_Request $request, WC_Order $order ) { + if ( ! $order->get_meta( '_weareplanet_manual_check', true ) ) { + do_action( 'wc_weareplanet_completed', $this->load_entity( $request ), $order ); + $status = apply_filters( 'wc_weareplanet_completed_status', 'wearep-waiting', $order ); + $order->update_status( $status ); + } + } + + /** + * Decline. + * + * @param WC_WeArePlanet_Webhook_Request $request request. + * @param WC_Order $order order. + * @return void + */ + protected function decline( WC_WeArePlanet_Webhook_Request $request, WC_Order $order ) { + do_action( 'wc_weareplanet_declined', $this->load_entity( $request ), $order ); + $status = apply_filters( 'wc_weareplanet_decline_status', 'cancelled', $order ); + $order->update_status( $status ); + WC_WeArePlanet_Helper::instance()->maybe_restock_items_for_order( $order ); + } + + /** + * Failed. + * + * @param WC_WeArePlanet_Webhook_Request $request request. + * @param WC_Order $order order. + * @return void + */ + protected function failed( WC_WeArePlanet_Webhook_Request $request, WC_Order $order ) { + do_action( 'wc_weareplanet_failed', $this->load_entity( $request ), $order ); + if ( $order->get_status( 'edit' ) == 'pending' || $order->get_status( 'edit' ) == 'wearep-redirected' ) { + $status = apply_filters( 'wc_weareplanet_failed_status', 'failed', $order ); + $order->update_status( $status ); + WC_WeArePlanet_Helper::instance()->maybe_restock_items_for_order( $order ); + } + } + + /** + * Fulfill. + * + * @param WC_WeArePlanet_Webhook_Request $request request. + * @param WC_Order $order order. + * @return void + */ + protected function fulfill( WC_WeArePlanet_Webhook_Request $request, WC_Order $order ) { + do_action( 'wc_weareplanet_fulfill', $this->load_entity( $request ), $order ); + // Sets the status to procesing or complete depending on items. + $order->payment_complete( $request->get_entity_id() ); + } + + /** + * Voided. + * + * @param WC_WeArePlanet_Webhook_Request $request request. + * @param WC_Order $order order. + * @return void + */ + protected function voided( WC_WeArePlanet_Webhook_Request $request, WC_Order $order ) { + $status = apply_filters( 'wc_weareplanet_voided_status', 'cancelled', $order ); + $order->update_status( $status ); + do_action( 'wc_weareplanet_voided', $this->load_entity( $request ), $order ); + } +} diff --git a/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-void-strategy.php b/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-void-strategy.php new file mode 100644 index 0000000..12a43c0 --- /dev/null +++ b/includes/webhook/strategies/class-wc-weareplanet-webhook-transaction-void-strategy.php @@ -0,0 +1,146 @@ +get_api_client() ); + return $void_service->read( $request->get_space_id(), $request->get_entity_id() ); + } + + /** + * @inheritDoc + */ + protected function get_order_id( $object ) { + /* @var \Wallee\Sdk\Model\TransactionVoid $object */ + return WC_WeArePlanet_Entity_Transaction_Info::load_by_transaction( + $object->getTransaction()->getLinkedSpaceId(), + $object->getTransaction()->getId() + )->get_order_id(); + } + + /** + * Processes the incoming webhook request related to transaction voids. + * + * This method checks if the corresponding order exists and if so, it further processes the order + * based on the transaction void state obtained from the webhook request. + * + * @param WC_WeArePlanet_Webhook_Request $request The webhook request. + * @return void + */ + public function process( WC_WeArePlanet_Webhook_Request $request ) { + /* @var \WeArePlanet\Sdk\Model\TransactionVoid $void_transaction */ + $void = $this->load_entity( $request ); + $order = $this->get_order( $void ); + if ( false != $order && $order->get_id() ) { + $this->process_order_related_inner( $order, $void, $request ); + } + } + + /** + * Processes additional order-related operations based on the transaction void's state. + * + * @param WC_Order $order The WooCommerce order associated with the void request. + * @param \WeArePlanet\Sdk\Model\TransactionVoid $void The transaction void object. + * @param WC_WeArePlanet_Webhook_Request $request The webhook request object. + * @return void + */ + protected function process_order_related_inner( WC_Order $order, \WeArePlanet\Sdk\Model\TransactionVoid $void, WC_WeArePlanet_Webhook_Request $request ) { + + switch ( $request->get_state() ) { + case \WeArePlanet\Sdk\Model\TransactionVoidState::FAILED: + $this->failed( $order, $void ); + break; + case \WeArePlanet\Sdk\Model\TransactionVoidState::SUCCESSFUL: + $this->success( $order, $void ); + break; + default: + // Nothing to do. + break; + } + } + + /** + * Successfully processes a transaction void. + * + * @param WC_Order $order The order to process. + * @param \WeArePlanet\Sdk\Model\TransactionVoid $void The transaction void. + * @return void + */ + protected function success( WC_Order $order, \WeArePlanet\Sdk\Model\TransactionVoid $void ) { + $void_job = WC_WeArePlanet_Entity_Void_Job::load_by_void( $void->getLinkedSpaceId(), $void->getId() ); + if ( ! $void_job->get_id() ) { + // We have no void job with this id -> the server could not store the id of the void after sending the request. (e.g. connection issue or crash) + // We only have on running void which was not yet processed successfully and use it as it should be the one the webhook is for. + $void_job = WC_WeArePlanet_Entity_Void_Job::load_running_void_for_transaction( $void->getLinkedSpaceId(), $void->getLinkedTransaction() ); + if ( ! $void_job->get_id() ) { + // void not initiated in shop backend ignore. + return; + } + $void_job->set_void_id( $void->getId() ); + } + $void_job->set_state( WC_WeArePlanet_Entity_Void_Job::STATE_DONE ); + + if ( $void_job->get_restock() ) { + WC_WeArePlanet_Helper::instance()->maybe_restock_items_for_order( $order ); + } + $void_job->save(); + } + + /** + * Handles a failed transaction void. + * + * @param WC_Order $order The order linked to the failed void. + * @param \WeArePlanet\Sdk\Model\TransactionVoid $void The transaction void. + * @return void + */ + protected function failed( WC_Order $order, \WeArePlanet\Sdk\Model\TransactionVoid $void ) { + $void_job = WC_WeArePlanet_Entity_Void_Job::load_by_void( $void->getLinkedSpaceId(), $void->getId() ); + + if ( ! $void_job->get_id() ) { + // We have no void job with this id -> the server could not store the id of the void after sending the request. (e.g. connection issue or crash) + // We only have on running void which was not yet processed successfully and use it as it should be the one the webhook is for. + $void_job = WC_WeArePlanet_Entity_Void_Job::load_running_void_for_transaction( $void->getLinkedSpaceId(), $void->getLinkedTransaction() ); + if ( ! $void_job->get_id() ) { + // void not initiated in shop backend ignore. + return; + } + $void_job->set_void_id( $void->getId() ); + } + if ( $void_job->getFailureReason() != null ) { + $void_job->set_failure_reason( $void->getFailureReason()->getDescription() ); + } + $void_job->set_state( WC_WeArePlanet_Entity_Void_Job::STATE_DONE ); + $void_job->save(); + } +} diff --git a/languages/woo-weareplanet-de_DE.mo b/languages/woo-weareplanet-de_DE.mo index 79f48bbd7dd22fc6d319cd46e336fd5237df2d0c..e11b2eb6f831fcc3c42370efb15f5e6c7f943a6e 100644 GIT binary patch delta 2570 zcmYk-e@syk{i4+}C-YbDrn>Jm2$u z;Ox%k-LXrfk`Ea_ukxGAZ)>tzX2G=oox)`S?YD3ZrsGX4#Y7raxCGVzCSOzW1Qy^0 ztiZ&fX63jFN8w@2GK<+sE;O(cQ}JtLZu{Qv@5Pa{ulW4~m`^(}EFPc`3u$k_N_+{m zfNsA(B_sZP5eDdAk4#~;ID+^V<${krd%MHzWz431)bD>6wV)0hj$Jq!yD^N{F^E;% zRN%d+1)f6f^rCMcvL+iqZ8SZT`G{{LxzNfSQd^D+*y{Jck9z(yzkS}n z|1r2tgv7LFoQTIz0Y1hd_$#i! z>!{}zP(iH0R$>WOV=*2^E&N;5xF1n*E+cEP8+Z>UXOsUeTufp6SFjnc;xjq);np#v z4G-cHJcFNN(p_fD@C$S>YixYS#W;g@2$$mPs0IIo+Hr84nTt>2L)a7JLVO2Oq-|wHo`>3W}iw|NareMN^cy$L*nHi1Rc^<0h=Abe&A9d1WrCcZ_ zWvBf8Z(9z&)se`>+CEK^>!BRP9{FI!t8sB+0g;YGog;!w#H;6Yi$4aUtHX z^S_geBsxx_j#)bv;2C7Ib_Eq6;P849m;jZDQ_S`e_MpbS!3$N2TX7>^L-nt^_jVxL zfLhQ&^zbWe()nLRg((9cq5^f{FuaWEcpX(l|N8CZym)FeQTHcdF$PiZd?QZ7cd#BW zpaPfWn>~!r;XLfXG~(L;7YZ1l5U4xLLcNOVetRBLCRT}hHCs{7$55$0fE2W~;%fW= z`B(;pvk;3>HPVRM=xNlrPcTMdS`QaG_cu|2Qz`iXW}yb;B86@<@Bl7D1^f>62c{2) zU_WXDNo-&9jzf(vLKR~fD#PngwGy31{&kLf=$MUvpmsKCdVI%)r~u`tovg!jY(Wa% zTJaG)hx;)z7(cEpxR`baF2x}Q@qa!QNYPmfYTj=O$iH^pONRzrL#3vOKU+n(0#&tp zkj>dKWYTSFc1G{hxE+lCigqsh_gEE-Wek3G}bwr=&Py;ZEK8dZn$H9 TXLq9$Y4moxk@i_7!xR1k4?IBb delta 2367 zcmYM!e@xX?7{~Dk1@yw@M<`xMQ1T}ixk3n`K$@%zf*LgD1pPw>MT@e9IKy0h$s%Ln zB+)fftkx*!*4DgkF0~xaq7eA#IZjKg2B9K*N;ix|{+FK^j+6a#n(YcPye zSRQYdf;~9f%&|9V@R^;)SiFF&X`i~|m+>z8-?`(HxP<-`D!@Fi*>c=~wYUehff0B7 zPt^ApC78{?^~hAK!(`&yHX6L_>Hh}Ip2t-B2i)-i)P_Qsh#%oB9KpwN0&}sN4;A$?7GAzLcY{Nsi2xEy> zjLYy|Y{mjSjLY#e)FYm9oyKXZ=_kx0|76eV8JLSLNKD&{^RN#U;1tfpuW*7yTY^p4g&O}A6)23_h<~BkPJ9G+;WwC~ z`(I0iDNr+daW}@{%c$ac&F#N|O6h>xKZ8Z|FQT6HUzmey7MtzBR#f0Id;rsyaFwwE zwZT6065sl1P;Yh;^#}&t{wPu&b{+Ldq9_z?Fcp>J1xO)V3D#i^^0Ie$TZ5lt8OBpU zdc^Bc^R^=OXzl3ezVD}@z{hX~ojg-Eb>ECf*a{?#%>%y z*0#J{vj?#OEATj0;m@dA$O}Z)Z9yG;SAhI$LKg!{%`g_?kEp8k@$;pHS0RtlnlS;p zaTC6dI@u)ZikafdXi zn9gA>-oY=ia)sIbn9iB;A14F{f$a-fJ^-x?!hV~LI%%cr7E}hdM?QCK4-FOFKAeLG zP$_-a?Vm?4{VV9f35>-XScA7wf!4A+&D)4=*o;2Bib0%2Zm6vwoiwc;R~m)WM`IcT iBbbDv$m6$hoQnzEAua3=`91xqp{)6x86i)ZC+c4h>id!a diff --git a/languages/woo-weareplanet-de_DE.po b/languages/woo-weareplanet-de_DE.po index ec23b98..875d6c6 100644 --- a/languages/woo-weareplanet-de_DE.po +++ b/languages/woo-weareplanet-de_DE.po @@ -67,6 +67,10 @@ msgstr "Dokumentation" msgid "A version of the WeArePlanet plugin is yet to be released for this version of WooCommerce." msgstr "Eine Version des WeArePlanet Plugin ist für diese Version von WooCommerce noch nicht freigegeben." +#: includes/class-wc-weareplanet-migration.php:602 +msgid "WooCommerce is not activated. Please activate WooCommerce to use the payment integration." +msgstr "WooCommerce ist nicht aktiviert. Bitte aktivieren Sie WooCommerce, um die Zahlungsintegration zu nutzen." + #: includes/class-wc-weareplanet-customer-document.php:57 msgid "Order Documents" msgstr "Bestelldokumente" diff --git a/languages/woo-weareplanet.pot b/languages/woo-weareplanet.pot index 06bdd5f..bb002c2 100644 --- a/languages/woo-weareplanet.pot +++ b/languages/woo-weareplanet.pot @@ -34,7 +34,7 @@ msgstr "PHP %s+ ist erforderlich. (Sie verwenden die Version %s)" msgid "Wordpress %s+ is required. (You're running version %s)" msgstr "Wordpress %s+ ist erforderlich. (Sie verwenden die Version %s)" -#: includes/class-wc-weareplanet-migration.php:98 +#: includes/class-wc-weareplanet-migration.php:98 #, php-format msgid "Woocommerce %s+ has to be active." msgstr "Woocommerce %s+ muss aktiviert sein." @@ -66,6 +66,10 @@ msgstr "Dokumentation" msgid "A version of the WeArePlanet plugin is yet to be released for this version of WooCommerce." msgstr "Eine Version des WeArePlanet Plugin ist für diese Version von WooCommerce noch nicht freigegeben." +#: includes/class-wc-weareplanet-migration.php:602 +msgid "WooCommerce is not activated. Please activate WooCommerce to use the payment integration." +msgstr "WooCommerce ist nicht aktiviert. Bitte aktivieren Sie WooCommerce, um die Zahlungsintegration zu nutzen." + #: includes/class-wc-weareplanet-customer-document.php:57 msgid "Order Documents" msgstr "Bestellungsdokumente" diff --git a/readme.txt b/readme.txt index f697509..8a90cf7 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ Contributors: Planet Merchant Services Ltd Tags: woocommerce WeArePlanet, woocommerce, WeArePlanet, payment, e-commerce, webshop, psp, invoice, packing slips, pdf, customer invoice, processing Requires at least: 4.7 Tested up to: 6.5 -Stable tag: 3.0.11 +Stable tag: 3.0.12 License: Apache 2 License URI: http://www.apache.org/licenses/LICENSE-2.0 @@ -23,7 +23,7 @@ To use this extension, a WeArePlanet account is required. Sign up on [WeArePlane == Documentation == -Additional documentation for this plugin is available [here](https://plugin-documentation.weareplanet.com/weareplanet/woocommerce/3.0.11/docs/en/documentation.html). +Additional documentation for this plugin is available [here](https://plugin-documentation.weareplanet.com/weareplanet/woocommerce/3.0.12/docs/en/documentation.html). == Support == @@ -58,8 +58,8 @@ Support queries can be issued on the [WeArePlanet support site](https://payments == Changelog == -= 3.0.11 - Aug 16 2024 = -- [Bugfix] Fixed errors of undefined payment methods += 3.0.12 - Aug 21 2024 = +- [Feature] Implemented the Webhook Signing Mechanism - [Tested Against] PHP 8.0 and PHP 7.4 - [Tested Against] Wordpress 6.6 - [Tested Against] Woocommerce 9.1.4 diff --git a/woocommerce-weareplanet.php b/woocommerce-weareplanet.php index 3fcc607..db49fa5 100644 --- a/woocommerce-weareplanet.php +++ b/woocommerce-weareplanet.php @@ -4,14 +4,14 @@ * * Description: Process WooCommerce payments with WeArePlanet. * License: Apache2 - * Version: 3.0.11 + * Version: 3.0.12 * License URI: http://www.apache.org/licenses/LICENSE-2.0 * Author: Planet Merchant Services Ltd * Author URI: https://www.weareplanet.com * Requires at least: 6.0 * Requires PHP: 7.4 * WC requires at least: 8.0.0 - * WC tested up to: 9.0.2 + * WC tested up to: 9.2.3 * * Text Domain: weareplanet * Domain Path: /languages/ @@ -39,14 +39,14 @@ final class WooCommerce_WeArePlanet { const CK_INTEGRATION = 'wc_weareplanet_integration'; const CK_ORDER_REFERENCE = 'wc_weareplanet_order_reference'; const CK_ENFORCE_CONSISTENCY = 'wc_weareplanet_enforce_consistency'; - const WC_MAXIMUM_VERSION = '9.1.4'; + const WC_MAXIMUM_VERSION = '9.2.3'; /** * WooCommerce WeArePlanet version. * * @var string */ - private $version = '3.0.11'; + private $version = '3.0.12'; /** * The single instance of the class. @@ -1054,8 +1054,10 @@ public function woocommerce_rest_insert_product_attribute( $attribute, $request, * @return mixed */ public function add_cache_no_store( $headers ) { - if ( is_checkout() && isset( $headers['Cache-Control'] ) && stripos( $headers['Cache-Control'], 'no-store' ) === false ) { - $headers['Cache-Control'] .= ', no-store '; + if ( class_exists( 'WooCommerce' ) ) { + if ( is_checkout() && isset( $headers['Cache-Control'] ) && stripos( $headers['Cache-Control'], 'no-store' ) === false ) { + $headers['Cache-Control'] .= ', no-store '; + } } return $headers; }