From f36a91ebe323a03ad823bacc6bece3418d8ce184 Mon Sep 17 00:00:00 2001 From: pluginslab <57633278+pluginslab@users.noreply.github.com> Date: Wed, 27 May 2026 23:59:52 +0100 Subject: [PATCH] feat(ui): WP 7.0 admin UI overhaul + AI Connector support (#222) Closes #220. See PR for the full submission-prep + sidebar deferral story. --- .distpackage | 2 - .eslintrc.js | 14 +- .github/workflows/ci.yml | 7 +- .wordpress-org/.gitignore | 7 + .wordpress-org/_artboards.html | 214 + .wordpress-org/banner-1544x500.png | Bin 0 -> 51950 bytes .wordpress-org/banner-772x250.png | Bin 0 -> 48410 bytes .wordpress-org/icon-128x128.png | Bin 0 -> 6412 bytes .wordpress-org/icon-256x256.png | Bin 0 -> 15585 bytes .wordpress-org/screenshot-1.png | Bin 0 -> 309309 bytes .wordpress-org/screenshot-2.png | Bin 0 -> 228301 bytes .wordpress-org/screenshot-3.png | Bin 0 -> 381582 bytes .wordpress-org/screenshot-4.png | Bin 0 -> 813815 bytes .wordpress-org/screenshot-5.png | Bin 0 -> 359433 bytes .wordpress-org/screenshot-6.png | Bin 0 -> 271278 bytes docs/UI-AUDIT-WP-7.0.md | 218 + .../wp-7.0-before/00-wp-dashboard.png | Bin 0 -> 641317 bytes .../wp-7.0-before/01-plugin-main-initial.png | Bin 0 -> 262666 bytes .../wp-7.0-before/02-settings-tab-full.png | Bin 0 -> 949329 bytes .../wp-7.0-before/02b-settings-tab-on-dev.png | Bin 0 -> 853601 bytes .../wp-7.0-before/03-abilities-tab.png | Bin 0 -> 1584035 bytes .../wp-7.0-before/04-plugin-abilities-tab.png | Bin 0 -> 233605 bytes .../05-admin-sidebar-on-posts.png | Bin 0 -> 308605 bytes .../06-after-token-migration.png | Bin 0 -> 261481 bytes .../07-token-with-modern-scheme.png | Bin 0 -> 263288 bytes .../08-token-with-sunrise-scheme.png | Bin 0 -> 265173 bytes .../09-admin-sidebar-with-close.png | Bin 0 -> 314478 bytes .../wp-7.0-before/10-observe-close-button.png | Bin 0 -> 314016 bytes .../a1-settings-via-tabpanel.png | Bin 0 -> 358338 bytes .../wp-7.0-before/a1-tabs-tabpanel.png | Bin 0 -> 263123 bytes .../wp-7.0-before/a2-abilities-cards.png | Bin 0 -> 403885 bytes .../wp-7.0-before/a5-settings-tables.png | Bin 0 -> 368992 bytes .../wp-7.0-before/a6-chat-hstack.png | Bin 0 -> 263127 bytes .../a7-plugin-abilities-panel.png | Bin 0 -> 229214 bytes .../wp-7.0-before/b1-bundle-dropdown.png | Bin 0 -> 298908 bytes .../wp-7.0-before/b1-composer.png | Bin 0 -> 261559 bytes .../wp-7.0-before/b2-model-status.png | Bin 0 -> 261833 bytes .../wp-7.0-before/c1-chat-rewrite.png | Bin 0 -> 254491 bytes .../wp-7.0-before/glitch-chat-tab.png | Bin 0 -> 258291 bytes .../wp-7.0-before/glitch-fix-1.png | Bin 0 -> 258011 bytes .../glitch-fix-abilities-padding.png | Bin 0 -> 444066 bytes .../wp-7.0-before/glitch-fix-abilities.png | Bin 0 -> 409948 bytes .../glitch-fix-card-radius-2.png | Bin 0 -> 196168 bytes .../glitch-fix-card-radius-3.png | Bin 0 -> 198719 bytes .../wp-7.0-before/glitch-fix-card-radius.png | Bin 0 -> 194794 bytes .../glitch-fix-chatheader-border.png | Bin 0 -> 194877 bytes .../glitch-fix-connector-empty.png | Bin 0 -> 252750 bytes .../wp-7.0-before/glitch-fix-fullwidth.png | Bin 0 -> 251323 bytes .../wp-7.0-before/glitch-fix-p-margin.png | Bin 0 -> 192887 bytes .../wp-7.0-before/glitch-fix-panel-shadow.png | Bin 0 -> 204296 bytes .../glitch-fix-pill-in-toolbar-2.png | Bin 0 -> 214749 bytes .../glitch-fix-pill-in-toolbar.png | Bin 0 -> 214749 bytes .../wp-7.0-before/glitch-fix-pill-left.png | Bin 0 -> 201979 bytes .../glitch-fix-plugin-abilities.png | Bin 0 -> 233036 bytes .../wp-7.0-before/glitch-fix-settings.png | Bin 0 -> 843541 bytes .../wp-7.0-before/glitch-fix-sidebar-2.png | Bin 0 -> 303384 bytes .../wp-7.0-before/glitch-fix-sidebar-3.png | Bin 0 -> 303384 bytes .../wp-7.0-before/glitch-fix-sidebar-4.png | Bin 0 -> 303865 bytes .../wp-7.0-before/glitch-fix-sidebar.png | Bin 0 -> 308323 bytes includes/class-admin-bar.php | 156 - includes/class-admin-page.php | 6 +- includes/class-connectors.php | 459 +++ includes/class-editor-sidebar.php | 103 - package-lock.json | 12 + package.json | 1 + readme.txt | 48 +- src/extensions/App.jsx | 103 +- src/extensions/admin-sidebar.js | 36 +- src/extensions/components/AbilityBrowser.jsx | 357 +- src/extensions/components/AbilityPicker.jsx | 141 +- src/extensions/components/AdminSidebar.jsx | 46 + src/extensions/components/ChatContainer.jsx | 141 +- src/extensions/components/ChatInput.jsx | 460 +-- src/extensions/components/FileView.jsx | 73 +- src/extensions/components/MessageItem.jsx | 715 +--- src/extensions/components/ModelStatus.jsx | 744 ++-- src/extensions/components/ModelStatusPill.jsx | 102 + .../components/PluginAbilitiesPanel.jsx | 316 +- src/extensions/components/SettingsTab.jsx | 596 ++- src/extensions/editor.js | 2 +- src/extensions/index.js | 2 +- src/extensions/services/chat-orchestrator.js | 12 +- src/extensions/services/connector-engine.js | 145 + src/extensions/services/model-loader.js | 188 +- .../services/plugin-abilities-manager.js | 18 +- src/extensions/services/use-connectors.js | 36 + src/extensions/services/use-model-status.js | 77 + src/extensions/styles/_tokens.scss | 45 + src/extensions/styles/admin-sidebar.scss | 221 +- src/extensions/styles/main.scss | 3562 ++++------------- src/extensions/sw.js | 2 +- sw-loader.php | 11 + tests/abilities/e2e-runner.js | 2 +- tests/abilities/runner.js | 2 +- webpack.config.js | 14 +- wp-agentic-admin.php | 26 +- 96 files changed, 3871 insertions(+), 5571 deletions(-) create mode 100644 .wordpress-org/.gitignore create mode 100644 .wordpress-org/_artboards.html create mode 100644 .wordpress-org/banner-1544x500.png create mode 100644 .wordpress-org/banner-772x250.png create mode 100644 .wordpress-org/icon-128x128.png create mode 100644 .wordpress-org/icon-256x256.png create mode 100644 .wordpress-org/screenshot-1.png create mode 100644 .wordpress-org/screenshot-2.png create mode 100644 .wordpress-org/screenshot-3.png create mode 100644 .wordpress-org/screenshot-4.png create mode 100644 .wordpress-org/screenshot-5.png create mode 100644 .wordpress-org/screenshot-6.png create mode 100644 docs/UI-AUDIT-WP-7.0.md create mode 100644 docs/audit-assets/wp-7.0-before/00-wp-dashboard.png create mode 100644 docs/audit-assets/wp-7.0-before/01-plugin-main-initial.png create mode 100644 docs/audit-assets/wp-7.0-before/02-settings-tab-full.png create mode 100644 docs/audit-assets/wp-7.0-before/02b-settings-tab-on-dev.png create mode 100644 docs/audit-assets/wp-7.0-before/03-abilities-tab.png create mode 100644 docs/audit-assets/wp-7.0-before/04-plugin-abilities-tab.png create mode 100644 docs/audit-assets/wp-7.0-before/05-admin-sidebar-on-posts.png create mode 100644 docs/audit-assets/wp-7.0-before/06-after-token-migration.png create mode 100644 docs/audit-assets/wp-7.0-before/07-token-with-modern-scheme.png create mode 100644 docs/audit-assets/wp-7.0-before/08-token-with-sunrise-scheme.png create mode 100644 docs/audit-assets/wp-7.0-before/09-admin-sidebar-with-close.png create mode 100644 docs/audit-assets/wp-7.0-before/10-observe-close-button.png create mode 100644 docs/audit-assets/wp-7.0-before/a1-settings-via-tabpanel.png create mode 100644 docs/audit-assets/wp-7.0-before/a1-tabs-tabpanel.png create mode 100644 docs/audit-assets/wp-7.0-before/a2-abilities-cards.png create mode 100644 docs/audit-assets/wp-7.0-before/a5-settings-tables.png create mode 100644 docs/audit-assets/wp-7.0-before/a6-chat-hstack.png create mode 100644 docs/audit-assets/wp-7.0-before/a7-plugin-abilities-panel.png create mode 100644 docs/audit-assets/wp-7.0-before/b1-bundle-dropdown.png create mode 100644 docs/audit-assets/wp-7.0-before/b1-composer.png create mode 100644 docs/audit-assets/wp-7.0-before/b2-model-status.png create mode 100644 docs/audit-assets/wp-7.0-before/c1-chat-rewrite.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-chat-tab.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-1.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-abilities-padding.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-abilities.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-card-radius-2.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-card-radius-3.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-card-radius.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-chatheader-border.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-connector-empty.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-fullwidth.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-p-margin.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-panel-shadow.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-pill-in-toolbar-2.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-pill-in-toolbar.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-pill-left.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-plugin-abilities.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-settings.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-sidebar-2.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-sidebar-3.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-sidebar-4.png create mode 100644 docs/audit-assets/wp-7.0-before/glitch-fix-sidebar.png delete mode 100644 includes/class-admin-bar.php create mode 100644 includes/class-connectors.php delete mode 100644 includes/class-editor-sidebar.php create mode 100644 src/extensions/components/ModelStatusPill.jsx create mode 100644 src/extensions/services/connector-engine.js create mode 100644 src/extensions/services/use-connectors.js create mode 100644 src/extensions/services/use-model-status.js create mode 100644 src/extensions/styles/_tokens.scss diff --git a/.distpackage b/.distpackage index 6d41aa3..c172ab6 100644 --- a/.distpackage +++ b/.distpackage @@ -5,5 +5,3 @@ uninstall.php build-extensions/ languages/ readme.txt -README.md -docs/ diff --git a/.eslintrc.js b/.eslintrc.js index 741348b..51af2dd 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -25,9 +25,21 @@ module.exports = { // Allow nested ternary in specific cases (model loader status messages) 'no-nested-ternary': 'warn', - // JSDoc: Make missing descriptions a warning instead of error + // We intentionally use HStack/VStack/etc. for now. Track v0.12 migration + // to stable APIs separately when @wordpress/components publishes them. + '@wordpress/no-unsafe-wp-apis': 'warn', + + // Unused vars are noise, not bugs. Track + clean up in a dedicated pass. + 'no-unused-vars': 'warn', + + // JSDoc: missing descriptions/types are downgraded to warnings — the + // recommended preset is too aggressive for our hybrid JS+JSX codebase. 'jsdoc/require-returns-description': 'warn', 'jsdoc/require-param-description': 'warn', + 'jsdoc/require-param-type': 'warn', + 'jsdoc/require-returns-type': 'warn', + 'jsdoc/require-param': 'warn', + 'jsdoc/require-returns': 'warn', // JSX type is valid in WordPress component returns 'jsdoc/no-undefined-types': [ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66058d8..172bffb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,4 +63,9 @@ jobs: run: composer install --no-interaction --prefer-dist - name: Run ${{ matrix.check_name }} - run: ${{ matrix.command }} \ No newline at end of file + run: ${{ matrix.command }} + + # WordPress.org Plugin Check is run locally against an extracted dist zip + # in a Playground instance — see Section "Plugin Check" in CONTRIBUTING.md. + # Adding it to GHA requires wp-env bootstrap that's worth doing in a focused + # follow-up; tracked separately for v0.12. \ No newline at end of file diff --git a/.wordpress-org/.gitignore b/.wordpress-org/.gitignore new file mode 100644 index 0000000..5f027ec --- /dev/null +++ b/.wordpress-org/.gitignore @@ -0,0 +1,7 @@ +# Scratch capture + AI generation artifacts. Design source (_artboards.html) +# is tracked so the listing assets can be regenerated later. +_preview.png +_banner_raw.png +_icon_raw.png +_banner_nb2.png +_icon_nb2.png diff --git a/.wordpress-org/_artboards.html b/.wordpress-org/_artboards.html new file mode 100644 index 0000000..ea0f52d --- /dev/null +++ b/.wordpress-org/_artboards.html @@ -0,0 +1,214 @@ + + +
+ +iC#m+TXijWJIc?|LswwmWi!D;H(-M-~Zb^loMc;H(9ICnOWI9 za=HA2tsLUwwkQP|d8`Yo+7k|Ll8!XSuIqdecRr^s=lWC?b;m;``)G3dsPeEDH{G+X zFHVBR2hz3k$a^Gix55_pJCd*{v{>bx93vx6Z_kLsD(OjpKpb~DBFPZ zKzr0ruBg)O7>IJ^Pf2)6KGQg0dIrdBGfif}&wGFFnjs#m!S3%jzXU$%&OxUV>RMmK zAruuAkA)0a1M%{3`(^z%&aGWBw=p`bzq7;&gkyz{V}@=D=C5CM@?)Wj|9_ r6rqZ3 %msYo^Ilafr6PD&VrCN;Lg7@vu_s z+$#?M^L*M3{$jq6q@~m37!siYrGwlujwy0_dU_)CHi3AHy#eealujhXP4@1ky}GOB zMH~=@^L#hJ>Qw(fr(p93AmA>a_zk=h)qNYz=Wkkl`zJrW<`mT48Bhg!ik*HJ`6Nx& z>V^c`hb6W5tEs+>r`g5(AsiP^```JGp7y&bm~#ur@UQZOtd$*aBgdVW!3${vcGjjd zrIOmJEG+saJz9#2=jwsJZcL>e4W#0p%Y9eJG`k0_c(4Ro@p1YUAEiVl0%9DUq{$n^ zbCqFX9nuOA#}(5yvmybBJ^l8;os 2mic2ur5pP0;u90O_F2J9K11@67~>ot|A qr``E zCqe-eHPJQ`k_>U28b68o*L4GhsJ3uG2$E6y6#-6EJSLdmtOi-x7P=Rq_bG56`4u+2 z6J@mt5aK=$SZ0y_w18q(NKQ1ju~GaVLF;@S=XCRy?;XIqrRfliqNz}}SwvYQ*sy-+ z!5@6)8OZkg^`9K3bs(p1KSicb3fTJ6cXZS}o#>Zt-lla@#7Pk-zet@d#}hwP@XD#i z0kgXhMv8<>{$${~K*DW7KzAOR^5KK6dP6KXOQ%y|+7NTF(T-s& 4BNtP7r~@(s3vUH+*g zwnDa+MiT~t|5E;GTST-~y`>eZ-zMJly$hXNCf(KnW8Y-aXVp6!kWLc&Mcvi)`axWq z-bOhA9ayh)= 9O$P&n)I|Deu$Tno9{@fpu=0u~b~Jk7EDH?KMMT|VRE z%x7O43geY%_^&RQHPs7JRN>V!v?WXC)G-CWqZ(|Q{sSt_-|xIds;G6!TV;q)bXIBt z7@5R3K0reLq!%x7)3X7GZ)A_9{3M;9VIaFIi_P=@c@)T W7^{UxHQ=R??!gz zz5n9UM8Y*lkmIjFsO{~~L(#&L %7&@n%R)9iS?BI+PB_-D3Y|;I`#Y zlOP?cJ$rckGi0gQ=qwdbm{!Wq)qlKSG4tC23;mC*`Y*t_pP(@#uz4qFAlDBmZJJ_Z z3Tggo8OEPH0LwXl 7 zI^_d6@^aEIl2}N2_g~-R4QuKGZsCZ|fCH7uXhb!sJlqxZ7tPNK4%0T*_lv)0fB7fL z{=30xRH!<`oli7FSyuncGFK!_&+-G~`iPE@Lx |B>*S*rOf4rzT#6n-u9Fi-kU*xLG4sLqtYB-I~E9Z6e^zg=X zUlS12R{Urh3rV;hO|>fqecP9hQdCL$1?M_khEIQO3VVM0f1JEZt*|Dwm!T@>sLGd< z-cw5TvQ-_-3!DFX8uA-*=%5j?j;cpYzpF|*!Bo@`fc&^?>5epYrwlmlcDgXcG<06@ zY$3(X r4P^ht+;4?gEG#hFoT35^M;g!w0%~mk9-SONR>4NTL;~=zNYiv4O^|sAFrYSn zt48>neFv3vEDeEH7C~*QJkbFnVB!myfsE?YZ2^h|Fj^*3;Vs>xy{{ne RCBDk>}?+5qk0AJBy5a51M?*RfnE#8SHcmom$) z0G@ETY BJ$gTd=!L}SAX#qNCntDmJg~l?HE!>g^Vk7Od%q8L-F)4CkKUW0MDMG@hsT* zEftm<**P@*?neydunO*{y8M}Qhl2QaH+^-&x<-o)4ImD02F)D-_B!H*Ie;%meub5T z $m`9g8Ojro=X}F_ z;ZGpE3uP5?KkS7c@R?L?6twxS1C|V>XUW9tbpw`(tSe(EAjB|tOv``%#=i~(-x^gR zJ89eXKW9H;2duz(mA`grr-(dr(85MdDE!Os;Q32)H1-6(>QVO-GGC;qF`19 =|$Swi~QlxvbT|yvH z%H}Me1 7g BBaZ|(J=$` zatnTRBNUeS&st6fsMb$*(-|FTeb0xPLzuYHAW~?oL8p)bQ-;YzNjrVihn&8cUyf`+ z%tyPP2*sW0?BikSDABMWQB{DVB132b#-|6&^-f*b`5Uv;;HuRx!Bs8nI;H==!To^q zjZk @+a&PHD>psJ*+l-t<#=fDY4sXBbS;z}HPWM$r_P`;F)BFoGm zy3{P?HesO`^Q2lxQ`C{F=Rd$w23IN+ _pHy;M4)tKY@sr0;X=rL7`k$Bky|6HEQ;;GF%PZ z36yNv&X8=*%+i$j6B5d+TmX!uV&<-WkM0K9R*Up_ZHWcj+$$VRVqoy|Q_=CkF54ux zVm 7(gIcD4|~B( z_ND~+oD7 F9KVI0LWOzEuYAip)L5)pL@6qom z{~QXy3kVN>F%b%xIrck)-+p%=pI~-#n@iBAo*GAL17)6AupU0J(gB6Zorgosxz?I= zn(-**&PAi0$NL$c?mx)ez7&G8ibi(ajH15!!$y})_Gyk6{Poip(dA_1@O1`;qk|Z0 zTyhqcvfXNI`uzkHMVQ$A2^Qf4`*+DV;7LyMy_+>;E6c#3Yqs97fX2?mNs7pKe&6{t zzy2})VJHq23M|eGzkAC8&V@+JK(JRWi~% KG)xyIJSD6Ps+io<& z@2|_EoZjy;1V+sGER)g4^Uf{@l0hmJtC;iN+z 3u;QMlO25{t|V)^&UXZlw00uef6E03#~j-uc19-M*n>_pImrlrvxY8zso2*F(N>l zB;I6!LW4kOb>|J*di5wVFidwx8tiK6_^GJ_iGJsESgFrkP`O*mgK`=i5QwtzjV~#= zY}NGjx{%fSUxz-;Rp2GQ9y)G_7)rTDnwnB^ezewCvA&*4nU7AWW#YJ$H 7KeiGcZ;ab{>ca-o&h_9S{!m4Cr=Ms z9)o$= z;zeb#>%^2}k zdCY1GZZse3wK6FJi+j!6hxQ_RA#CnrlRLAbMcw+~#we4Ma0+n|>wz=!MK!;UTjwQ3 zdNZQN3$rM*Y T~m7hJgfXmM!&oz`ra9c21v+GJya>lb< zyVqvKl!JI=Pbc;jC#-|DX1JNwQas1&om=N;$0#1#`r{+SSh3QbQu5c*yFi1_Y!8+b zodsIt&6+k}R?TvDJloU%Ezm 0sh4(`_6f4HlGbR<4%fix#}Y znQiJD4E8OBbt=J^Kg~=TU3o #C%k-LMU-wXnbLWTvFK)S!SFRA)nw0o@{C2C6_BS@{(tIYT{1b!)s!cFCuzY*t zL5u{V>Fu(Dj=zzt0ou)dih`V*NkV5eI+Q9+d>%c-ORoLX*_qK}o;-SLBSRmPP|8Tq z-r2Bd&FJ6i8XrU>O>1Yv2N4U87sjH(7EdCGW8P8Nyiap`=Jn)v`s9QpoaXR->qoQ- z3FvqcN@K#taB=oO=v>C&8Z&`|UR!e-Wlu&Y9*G5|+1>Q6of$}ek0(wZ0LsIrx3+12 z*|&i=@Rd0MR+!P&*Pd3du?h!ru$;r;vzD+K44YAM3&(i10K~pm*Ct-aRRO_pM?gZ~ z3vA&Pz`lTsOlnk4sR>OPN-Zx=T43xwh b9p4Y?KBzBX`f_Lkd$OZ*@!bHDcwqmsB_fqNN-NLj{4j0r$Tbbhv%d zhdA5Y)(dRPOlR?!tvm{e@E#&{Mh0Vie75${dENGAmD_d(4n0{IQ+Hp+#u>{XIZ{)0 z7OE;en79>VkT&fm<0D*VzS5+l#O;uRwHiPX8-o^k`edbMx^71rN{jQoFDx{q=pi!P zUFSl|Rc3e`K8gs*{mTT)9Lz$MAb1brQg!pucJI(yjp{udOj7%BU_{(IaQyl zjK1Qrb~G!RjKE_{n`*KyVSpTK#LARy&U777BKBhC@3zFHD>MB*IWK_Oh@V4{r!R}h zQ+2<)s>yZL2n)f)Ix3K~RmnNtU6x=0ET9) c_IFF=*wPe*LM=vcoWyl>u{q$NNy=-s%Nnt$zHgr%yvryw zM%+c+dobsWb!>nep-g;j EHS;k0?j-xRjq1T9M9N)@D>AO}` z)^}6v1zLH$NS4CV%WaGPOkNN0#570pl4k34eAUeSfis4bcWOzkTyBq1;mkwMPxkkw zI@TUMK2-16@NOzlgtYd`v6h!C?%2wq*Q6((w_c6e5gM$5FK@rYW0&K}xe um*kziX{Aj!pSn&&iRT?sQW0!>$h`Gg-vUvauu1vKdPeC^vS&YNh| z#6Kq$<^sZNd4~y0m?%lRAz2sVYXG04y~r;>R&7>9-hC8azCdW^43;98Rj4Hq$>=6Q zr2E&aF1 1#bQvXYUN9#mkj z^=RPL_=A??;=p$pL#|u$%GfRQ633RRi}_63@hv6upPnzUHKNKF<2)o_l=&78fxs&} z|Gcz}7Ry}f1TsM!2I^#vyi_pXcfoAE(y>&c{IliQauuIx+lLaJsaI|j ngAM|A>@Ttcm2^3`Dmg_f=5(w4zH%{W-T zXwTf{qf_K*BTL<~zW(e>0Q=;Mylor(SKhX=O{|4uqfIWVbUmY-;2mD-vM3}!297y< z$v@RwDev0zIkI_uKZ3mCt-&i^J4E(kWP+VlkFqzk-^visvw@RWow>`u&cw2h==8U5 z0vn2*;dWGmA3aamD#_QB2tF?BI`Zd{RvFawxIbO$+O`p1Ux#W@8 eQT<0-Rk*kUX$4Kd_OJb!9mjFDt<3b1(xt-BDjSylsdh9&~n|(ZnG%vJFz)lp6(L zPWU|tyIIjcM@yJvB#|AT{n%xZbq3`5^kB?}UJSC({)kWcq@3kZnAcdg4SMsd94EX_ zC*2b`QpPUb`|L1_>DQjm@|iXO14cnjd6JJXhi`QT#fYwLjCgKikt=br+jH<$)B_Pp zbx8;M^Cj55lB9p~-_)qHZ%0%^IMAV+py|03yWWZyb~6rEgG(%EMnn&brU>)3T(Kjj zAy+@*kqh-zdX+L|Gv*U171cg*rIB`<)y(J%mX@wl@ED!>V*}Y4lSg>Vrbc&|9@)Qj z-hMkr{zhCr;;Z!K!!>8TCq){yRba6bR50D$@~sCyJhWVkoJmWgLGIQfDF zcwIA@N$d7~PKkP?9+hfM$|Rl#LQ$+MzKi{yjVPEL;EiC<5_@11S#Cc(Swhj{3?8kR zAeTxQZ_RSFljXg9ed4O7_BBge8+s|sw*4VtIZ`1aI}5jLp5^8)SO6 Wh#Tz>tmcEn*Rnp`-+p$%H@^z=e@~y8Y*Rdq!+yFFkREL?gG-&NF z_s7Oa_ULx2p|;dnBd3|=WVAFP+qXao*@X2}wg1qlCr{~v6BqvUCIY5$E;N}=hPf70 zJ)4Z8EN|Az=RN^P$8zzpVpY1d* Tt74e^wv^zz!@dQst+ZRaIZ0x7t&&V9CeI%f6)4=@**zh zQB`c3v4^Q*G_t1%C_NiPT%cv5vCQ7J3N?}4 feWwQUUn&q;XBUp0dz=Xzs6{w=@tM?$ zwzAxGyjn19p{XM#E)^KdxP9|pc6I~B3E~4aO|Q;zQ#voew#Z^IGWz-R%Pn@%T{Fk8 zdYg!`WIrOsniguc167ON$$xIcC=eraZoB!Dd7@CjQPwH3qfu9YXu>A*6bMs-0 r zPxY21Or|atiWL;_6pfM)Hdc00?DFw(QcFq6(K41zZmWYxc =zZbQE%91G}sncK*aPN11Z;<+-nM;|7#1Mc-m|0LLk}FFl$2*q@L_InpX+X}BCh zZo@ 1uh+AfIvWTw*_A2Hhjsj4xC;D)jyOA1BU zNQcY4ebZWJ8_Aerce5HM**NBicKzHbUdcCB09=>FcSh|ahsE4xmyEYVR1Hw&%lKdz zj_m95*{v$JquNIple5B;q|7TN^)&f2mnLJi&nLgW!mL$kB^YM1A3-6D?57at8C$sq zpVvR%c-+90mw&t|R<@x0r1OBN6E21m@z{Ds>s3LqBIDpIo-z-|< U3zQs~UGsU4?Pldd!gLg Z2v9*i;R zZ;cgU`XXaCQk1>WXKN!=86!{iES@LkdRaGS z%e|c+YTuq1mz9a(xeRDuS%PHAcAqQ|;2G?hk+E=8>pA7|HM1d7&ttUsImx&-@c7Vk zR4q_Ha#NKrtLyIxA+s|}aijCA%n}FX$TtN%kRWO^mX~qc>@T!y!$lshJLSO1(|&AM zf)5JxCf9}j)yyOH8ST7Skx@81dgVe-4_a<@t!3;fIt?{7q2bXLi+Z3pDy2g@7jfwM ztZ;c*2Hs^bf~_}wB-`3@&WyQ$Bw-nS+2Mia{3-@ 2L1fc z=(9$bmquhI6u%@e+X@oS#Cj}$?1 3T-EHUu?Pxs`%`bM)bgeYi~Xea1L9bZWhu{Ur#B3_!EwPu7A`tBx+6i^^sp`+ zF|-cq5$$4BMffB)Zo2iPkKCT`KQ3Dyx=#V}>n78Z* E$4Gk$xrH-G)wk%?@nO7A zf|C{SLNsKYb?rH7ueWxRz4{@jkPef2s5SggW3rR`)# & zJg^z^%M~6>x_PF<|K6==m*Rsg4*W^|1cyMr%}8hK@r{w-z(H{Ir#9@|reoEy_Y2CU zRz4{k-oK>ydGq+!#YxVQ%>wCm`R7Y8*v7rP)%d~ R*$HbYm_tu;kgC7vl^vaYH9B4wP%e~W@iKn^oB(*=Y5Qtm|jrU z%o?$;k+u=js|n=oaIVra>8J`OTP}oW#ol&RBS#+)Fm{;i8blF2b#u6Gc`4?BAgCG| zX jHkvY-g^ibku+fq>HTH?H z1q+cVm;T121ze<@Yim*zw&>Fw|5A_@2scWS2NRv01^HUa{~lB4ElD1;%U>DI0ALM1 z{X_ 7 1#1TEdHl7*=20kKKL2FVw;`#mxl!*nE~E& z^e(>;)@1r<7MdgG!USTRaS;jhQf#Tm>_aXV5G;~+80H31B7)nhz|nvzA4y;@JGKs- zAyo`c$%D| RF?ZUbDM=0C2>`^amA4(OT{2NfL>!AF*r#JF&&HBh)XwO& z6Ic-pq=p&(DyS@#pq4}Sis~l# 5_hh4@;3@FD^&YdAOf;lo zhDCL8Po7}HBiNXANyFOp2-)q4rya2DHGvsoRBv+S?@AQ+&gZ;a$u+u>d}Hc%uyLTt z7OiZXOZp46xbRL>BJiS(pg`cET;u~`mn{(YpM-GQa$8#?C)Oh>Z37j%xNtBL-l>IJ z^Y)P6tlu&s_M*s}d#Wv>m^Qv73`P)_Mc{<@9Fa!Ol^{sF_?e@%_~BUD0Ri$_grz*H z^LhBX$Bi$Qks24)78So#NAkeTA9__Q_z?1WT!DM;9b?t!=kqRC35xf1&7ATVOWe=A z1x0rai@kcHFR}n09>)U7QvNcOTN{4s+yMJz#_jL{y@#A2tN_B)h ?cs(3#S%lBy k;Y`iT_ zzx!6iY}>y3G9EK}>T?DL%m +RRDNB_>0lgpo`htK}J5@z#_tBcy)& z;QM%(I95BdlNKN%OZEpz0>tPSCXZndzoX3Tw7B(KKk%GAwQ*;4F2L`=F^zLUw>&mS zniIu3A}F52-B=IRye!qb5301_Jb$ )buA5449<@PnRKse9utyj%k5b}UwJ|3B_@Q`4W_1%9+A-RPc zfOi7ERYT6~R$eQ&Tgv<>pNLoY+9^`9LHSmf2y*kW=ECV-B06;WI@~baBAisiT%dgG zF&wqzf|(Z=LyiaL%8)dnKs!)`5qC#+dIt5f(mmS-01HFQEl~cFgh^A4 z=o`$n#$gbT&)zCm5fsKaSlP#wWO{9H??e?AD(-~k1ICSU9(mE(!eyWr`K^VM@(hdJ z%);fD73yU+#q1BNNn8Y36 ?*fNJV^LwD?{N-kmb8bZD{DCoWWw zH91C_z&s*fxQ0De;vMhx@6{}cgEoRT%hHLnK5-X3)MWoIA&-S5Fh*uRyE7o?s0-gB znz0#ODqcciSGqe z4@p|s5Sxds+g^^KGjEf#MEEqK#d8d> YA z$PD7#*a3wWDN9d#qhi2B6o55uKMJ@P_R2ubIkmH2z*pj6zG7z2DNad~X*>m|z%&n% zGX~q?77_=CQN2kWdm6b5F;7<6^f1ddj>e7)^(+@3482C6z7Ans8y8}~q+L1AYg=0o z0VhuvL;u3Yx}?pF2?Ix<^pE1s>rXgxRX>H?8hn=!qa1Yn3jUwxF; 0--dd{fpb$ zQy1Pk)!K-xp`Tw3#;)a*Qq$dQ(I6jRr~Q%eQt*2kKkm3V2nzuj+-OFNJ8%2FvE((> zc?80nP!S7bFb&TajZ5d|O0E#<_pc(^R=6rx-=Tjf2GiXThXJnZC1HQ4gf_X|rT zJ9+1s#-yXjZvn#6 lbpkm}X~?mwFS#+fyEcupKEXoI?0mB6xDdUL7|a z=xeX|P~qJ9fXnmEPO+s6Pk!T+CT?kUESYzwsZu|=FtDR|>}V&JT&)^0Vr?V$M6YwZ zRPV8Cqen{_z|;Gyb6e0_`c+zro*UMhNbrwPS7W%NyV}z%a;)cs>}1|WmW$SlZ%yB5 zEjQkkFUp^+CO!A ~t;*WYSA3Ccko z%hz!!@yS-LnO>!c1y1?+lYGbj>JH?P{Mbnd+E>f_nEjKhFAhMq9);3={{vOd4?_d| z{CjhSxcrW1y}f^bX6#?&m|((#=qoEr3J=2yiAx~$lfVXdA%ZG^Q)3@>l!Mu&Q=HU= z;*)zljMwW5?gT&f0QwrraroE1^T&=>NAki;cqRe%IcC(tcP`f?#g6HBIdVrM(_fHm zAC_}dDQ#QV+AREDmXV^Q{{GT@He*6olGZIDN`P`Ow EH=^C9w!%R7QiUDR>O+q_+ zkSqKLjf+4z&YyvAPL0j43PcZ#cxk^Q?c}zOY<^Xy6lb?(F3X~>?1bzTt`TCNY^)rr zeh>l@pi!4CT-l7Q@t!#8+(B6lNPl`Hm^_^O#s<#1amdX^w#x0m8Ru;OW`G2aG5#q> z`VzD#?7tS?Do3EmU&Ow~f@G;3Y4LrA^4r^aAp8x|G3O?rNLS+AMm~lh{o0EXrFj%M zZZWb+Xs$aT+|g;Fryk%Z*r^Pe<9!PXimJV_fP Z}JWX!L ~k!-W1&g4XMh1PP8{R_RRP7 z X-P4?BL)R#9@d?jvNIPr#cXfFu6!Co_10Xk((>}UzZ5FyP5v~0l>owq<89^f z*Q?r^bd-;xwt!T7#7p+_rT?4HKkjXt`H-*cB N9c2FUl2Z2dITOVz z4wQ&RVHWmUC%GKIqV-a1Cd&H&5xMd hGh|Di{%A&R^3o=ApmXH4pGEe~`Fmf^u zRr5W>!Z0=s$_Y(0R25lQ&O&{G!S^AIA5?NeS5w-JFfG{09Mrst#gaNTlv#&BWE?{6 z*OBe~Z-ipawSwT}&EhoFM%c?*<^VrXj^eqgb3lH31a33(S%8Vd>GDLDJkn%2V-ctv z*^cwkcu(hbVq>r!I{>p#vVNFXY6G2##a8LQ)zRQ2MfSpV4c|X zqed=D^0j1|K6@Jv{_kXUBsUB>*5+3<-7&uNH)@lhrw8}!535X)>iG5^m}cze-~oTM zFhDDqja60`pL!i%HWwdeFRKb=O8j_>D9C(mAm=M9dlkO`zaO>zTy><0+%Ux>3sQLA zAu>>{zy<(qj@B~zz4Jgs0g |cAMbS!{*xHNU+7@&4P+bt;!rg8LTZNV_cQvpP(AG=n8o36lRQ@(%B8dR;g zjt_ogz5kDJ`QrwVCMg3>Pa G^f>)RoeO3-W&md-Uf$8xZZX+;#loT|kv^ z^==ieRad&SSKh1kN`UM(()*r#l=yIm*={%w*$O4@Os7Bl91wZuxfAS>rf%N4=tbFV z-;rOd-||LWv;?M!x7>5f2Ijsv>LF>@zcyC%Qb8j|jF6c1-Z+{7#Q )=!MdCN<06CvS~!=n< 4o5&NZF P!U{6F(jCKNLBK#$iAp zq?>XSM61>oV|KuKgOawB%9_(hxdM615su64GGj&8dQpp^c3xXA8S(vV^PRH3!4Kbp z5;n-;dc^jqy7pa%iY|ycFW!U~%qO?9q1iw_+!ll*Fxdw!7RuJBVAO8_6wfDi9XrtJ zqbdZoZ-FxE?v#*(zt9c?(<25mf&-;82NqcV1j+f#fM@pVpcY`jdhlBkWE@AVLA$&% zZ{La?WwVarHZ^oTst%+a^~&9AK=7%(o*B4(UAUpr#eO3r&q7M^Rw~Hrmk}ogSR(_r zp%i*&))1)jR0oklfG32=^&q?>?^v~`7gVd15STumBU$xt15JDV&vEaO<;c~N%`7;v z*4J(epDat##F4YQL3ymcCtGnqb3TaB<1my(rd40}p-;Yr $WJ$_}ttaTK#gwi! zJgO!J4I0-mnHydHhn3Ukn4$dS0knJ3TzAjN`ZLE;c?Kwt>%3eWj?eFnHT0~J9 `1#`&-(f>+5(bNA{lV)Wsvp;C77iIW=r^vZ>}tf36#aTf$a003T6q5Z9iZaj6A>M z+WQ+~+ea7++$RZ@Y{?~gONlxl!zjSmH QX~%JG?@xQ09@ip2%O#yE>V-RfX4N&r@RHp zB=V9oA}o`uD-{@YP2N&U0A=lFuk|^(!Ut0xIG3GK(vf!3HE|rJMn|qluzV@i7Zf1$ zTFQ=qlE!56w-JytGh;0A?4 )#fjuanoU{x*U0zEz552t zS9<#A-!U?A%jPY6%NcD %;5yq_N )m5VjRaqdQJrp5d3gg+ur3)B}GLqFDqicAf?nveQo7( zSRtiFQv|iOPXsmmvQy)VuiOnE@CBfTld|1g3)R37CKopVq_*Ae zUxhN}aF6P>b~DCE!XN4S!^D`ZjB Zv?-sk-%9wghvfUS-Z?p(#ek*1J&pR{X z7%%V`n9JAKKn03FviG0Q7Vx=emF`w7*(-4w7eriEQt)jO2#OIY< )<$dF*1QE~K(O8lX6z|RKD*~m)y<(XJeB&Z05(Q|-9mM=xrWQmL5yuV @qP z^-%=h!VIqtro${3K|$J=`YNSh?lR=?qWav1Zt>|hP{^q+gWOzVITR%^KU`*_X+8Iw zLD2!=o5f1G^?~~3){No)^|$Eqi{=kWU&eg{xh0);de|g0ak-Wo H|8@nN}os-Bt?skc~7~7qo$>7yFS$G_%QQmV@-w^FGLXt6pK3crJ7fq zm&PYToSh$mu*xBk`9=5Nd557pD2iR=ZZ*DKitVa$JZ1wlT{Oh|#JvZ;n%ou|?bhW2 zYSH=aTnD3jNrZaPzW}bQ%%28VLcq*{v+pFJChPEC>9DRGA!E1eMn*ZH1m1lzEMM3N zAd20Ba-N8MFVGt04|-L_Z9v=vDC%3(viUMldkR80k3la1xYj<0X`kM$t{+azlCB43 z@JrVZKtG)T@yH z)fjs(*&KV>q6m6Y=ZrcB*}(3-&F+(S;7MvJr#)!UNC6&}=im&~o}uYBKB$qErMbJ+ zwI1qx7ysivetvIJTVZL&h go!O5qh`|b?p6py}|?M zz5^ e+)3~b1;vW;BUdz<}q79%-Eff OX;;x^dc26ucL_=TF#II%8qqas9xfwfL zO6X^0U@!s&Eu+IIuMvRo^FVh7xZ+#S96Y+s8;?Ojy|ZGyqF-3#R&`fF3keEjZ9zBB z)npB6o3%lltR3*rZN9f~$m fHs>s`i zh3(Wt-X(2BqCX2VJUza_X&1c?NN@DBjYLWU%%M7@;O!j_wSB$@omrd`Hhrs@DD-wk zVXXX<6S?9HPX}Zu>1q(D(1Sa6yilond i52X(}$OTYv8-^Ru-cX 1U}_nlHcR3J`WVLTSh1*ingIeQ?$0u1T~j+)&DJz1jv zMg#tEV^arkWhK?IrtdiQFWS+dvGCq)RpG32y`qY1bxm;sJi~;wBeGE04XH%VKw@FI zIKcuROS&t(hruDcr?1Uq9TY)a0mv5U0d?8sA`nAwelJ#Y ZyVMQOs0=22)wlwd7|~2R59sd%{k|SKy(QQ#btU zere=W&Z!$9U+_1zpiMkF?DifoVR8$#EE)O$-|k=pT8|(f7(D>GwC>!XHRDf!89OdF z>4*LW{T!_(++|ZfqV&{?S6Sl6S{PpZ9CPs$DF~W})M>4&6KVi}h|?_yjNCJ&^=yN- z=a*wo1L!-&AD120lBTT%X|Def41P%c_?j Oy+v%E>xm5l?H|u(z#+?V1tl?7-RVsecAEHX(FH~Wojtgs`qe}TlFxPK@ z{HPHc<&;5doCKqs`1q`Y^;I%K1FG$>t)Ycmcs}qmIu;s15kqSNhsbUbazpVhyCijB zV&om#{1v}4z=NM$>GnAB;9spCl_qEs$8FkkV2sJXwDBrr0niXVK R8p2_ @% zuqG%+97-cNG#|h}R3926^?x*7WK#M1EbY7wlN>6wtb$Xi#4jEB?`XLJCo@1jRkQ5K zo1m>Q+WnU~c3_Cju@G&8#J0WP$JJf 8PERQZp&b+k@!>V!@1CLQVw4$LnT z67&bd!u)RPf1ew3ho-j`pgWw`4tF4Y@b6nQ3>jk&Tr*_hBf{7 zh#R!S&VSZre-}!f!E=dz9LqSEL85w&lm(n% OKpL 7J@8Hx#!~{-Ll=tnK@a;WZnWj~W)H-P1pP5{wf# z^<(hpVYv|jR+jtT07oCPNzmS(tIelv&JQu4{`WU4Dqa@PI9rz3oA>xe_C3!xb|&Nh zT<<7)g3Rvdlft>|VNiu@D82}}{ +=bnszXAN9d o;JWCWuN4btB%QIB-$Rs$xvzV%~*p$BY|s!;pf~(zuzb$#_g3gf2u{Cw|yLq zFJxeFLtS8D@uE0Xa!y@66svUOOJU^5{N?>8g21>hQK8A#ee$Z%u(fFF1kk5XlpnjM zF*EoD*+nRSx#)= rA*nLag{}0rf7A9pCEK;fTgNE< zwuXB5+r`=0JH1pq;`iH@JnsJy_0?ffec#uED5wl!& BB69i zmmnZ1-62SKcXtfk`JTbg_x(MO5C1s#-V=MTz4kumtTP;tziurURe26ck)?r-K@!Bc zgYNi~0i6S?B2oQMx6^d1Jkn^mU1xLj!(4L<4dN~W`jjAs@@5!_G4fJM>60iUbvN~H zl@f$1x=7u*R6N%Q3NF}Dgap^0e7m0~0=c?;E!B(DFt4y-kJSB|_P=#Kw8(3>SYE2{ z> 5S-R+={ 53{R%GV$t=vXKL!n83>D7(j z5Zhgd?mCOtwLQ`BO-K;<@eklILjuNG_ACFV;iltNG2b#(bFU)T^bC`8revwA*~1)y zbN&T%7o0Ws- >iaWp98tg0( !yn$Al-yoG|^5nF!) z(s`*DlvEQ3NFkxFe-f;^HF6}?)%w;IdoQf--VyrnTA_`P(u;^Mi0<-ICJo5m&`=e9 z7`O?Y$UrKsM*oxQ3bl4g_@SL`I{vMqr{EE!YLvkq7=#77SGJ5Ou!beI?@?Wn50D4i zK~71~aDu*ch3iS8i&fnG6$L^d0VdhnOnqL7amfE|Kt8Fn=dTu@gXslqNF^_(4beTE zvn1xHehei*xaI_SX3auxJh2|qh?eg_n3>VmQDuhFTeQt|7w_zhp?D2u2_&&^cHf~e za|cSbsz@a{q*ARv$qc6sNFH%e^+G+M{z}6Tl2$Nm=L+9|Dr)OLR-^&&d)^W7zZ$N? za>z$GHsp(pHj^O4mMWmFD3{;p7Mv;_K(fdvYxEtUCCJ8fD6~ke%+z(+$ti5FGZGgG zAY4IrQmoS>k$R&KMCT&WAYRNdt+V$iy67MPA+8xA++hy(w+S%~z&V_J5hO8~KPH1v zXczE*cR`>G Hi~aTEpy6 zmQV(*^COfgwk5h}pfzDllW;W0-q1<-ec*ZXbpdO| W2%Ww1%yUmXCBf)p*)&s&9ScIf;M$qGxP z;MIcaAry1SNVxn2htU%SXS*8WKa;>53H%9c`$tOacCtg|Me(K4HWCA*rC(iopg_zH zm9`ttt{H{$Z+m+t7Ci~?W4k*ygzB{hdKN~dV0I&pWLhApjBzAG&deJ@%fO`9E@JpM z^y>C`d3SMKeWzwnQ;qKn9Xt^lngYSxpPu(wFB0Z~>NC|Lba@)YQ{ } zsmN)hIM*ug1Me;qjofpb6LO8(#(#KD+=$?xW4Sl?x&uH@BqwlAs^`GXfOMdL)_77X z3Ww8>k_3dp9>d4x{2EVa&H8@%iB}SUA9)DN+)L j`8+PHMwRB9@89hLVt%fSnUY+;`|G@{jWf2 K*Axp+(Fyh92o0&0cQ=^8@Azl?{!d!sW3z#f7K 8v-&>t)B3~WwOB*n1eGCR|a;hQFe TYyhHYht8BYr>%lY*J--< z(S~p%45d4@e7>x8pA^58PU>G5
O8w|$TET?3cIMQG){-5Nw0>Wu0g@1S+K%$W zuNA}L@?|FvZ8i`cs{{lZ3&ui7z*K~MM UiVrD80G5l_KPgY`OjhUiKdR z{WLzto9;uXO9wS@9 W)2rx|o+52;^v&Bsh?{dA70*c)m0KWZE#w`a+x)SWN+ z)50QmVWH{sZZuc5-wp?9HRf+AVg z8g(eW1mIE2QSB^+_Uoe;P0icS-{CQ7ojZWn3{D~g&LJEbsez56OJ$_npWX&$S8wVE ze;W|LX*GT9#ZYF-(LN3ZP1KFKTWGHl(cc9-;dTSC-$i>&TjK%NqUH-t(F3Q~kbC;1 zG?GB&`8KlSpq@TXrxe8*p+N0pc=I=W6OTNi^87m`>U~jP2q1}uZ4g)C?}lmyfRGrV zA0X8^nd*UM>osWmlsux4nkgwmBSbnyZMCeG-}G;fyt6YeUR^N95HQ1AgIU&0wc`MT z?DhZ3Z4e-HrT;yiM;savK>@|P1HOA$y*cdz*X7LB-gH!LptVGfeu9|8YH$GH;v>Lx zF+s`fR-AUA2HeJ=m*O=1nnB~y=o#jd(kVLoCQQys66_QWf38E<6VL@tkRI^8RX*!f zAFD|DxIQ&(*-* ;8nKR>856` i|Ko$A&&QvAf-t5MA6y{{EihTVxJEjK zC+ hkWMH#&K$osf&VqxE0myEi2N!s1S_Eba zsQY1XG?LN*KLH*Na@|*db1f(Sahn1VJU%{Pt@3=pT8{xA?vZo)VWjQ@?Bza?UQ!LA z*K2nO`1c??kb5)e>7)E7{hkfNt>)*zZ@vkuhh@zfhARpBn5>ZCt2+f?_2cCDsm#Cu z93G<74yeM9##`D#0B8%Nu%pWSxxR $5M47ndo z@oI(c+2I~I=XHz5|9<-SkuOR$Fm_0aa=HZV+i#HolzadvH9l{%QnQ_280ZWG5TWV~ z6#~LdheH83hOe^glUspzK_K!^kV`0P|0-p-kE~sPIRKR4$IeW|tyfY)%$8^~#9?Ru zK7p4W`S9kyv#X#zoud^W>vBSI+__XuK#p*%1W+D=V~CCF2=E5zi~(x9%LJl0Qp@y5 z9H2p~IiVh@Z*E}TTObqxDY7fXX|Be7uQg+*GJDtTZNO9^UIe=bJ_<+y=CL^mk&3&7 z(=lc+BNp5JByA5*=dOH6%8oX-$@1M471_IVd`j9}HxfsDGjxl$tw&r6N_WL3L*S zu|aHA%(JDkxBf}Q^aj0m`xqiy5sJ=u8YOEJk`c!Cr^X;bwWRWz;eE?LKzla78M(Y> z+I$U$1;;Ru;G4v)5F!0Pn{@?wGpvjzx}1TC_00{^o2-7`TNtZFU40;5E@yb5FkkvJ zli5q(!CH1yb^&1c(jJaGz!X3R9pLxmI#*3(`YaT7agK3(Y0Ur1f$9`e+6-CIzinm( zXJMfY7|5ly*J*?9r6Ad1HNL>#nMM36erg_y88bM#kUy;JwDFtz=#=rU_yjiyR!mz# z)2_jcTR)nwIO>}oynntm{DP8HWNBHl@-o`RQe3dNX9-c65ugjGRjMP_V(|Qu-b<#W z6s3>B%2TT#m;0SV?t$tp{jjpmVwn;u-|dy^Pydeg?X4pBKmBew-WSqIkD_F_cB%?r z)H}_1!q>ZDa#%I50)3tYKAd?`;C$_Am`MXDFj^NppLnEzT_SBkE9>`-NoPuCzQ9R~ z{Lft@1523C`s$Op;B%@x^ppH=<)Y-5p)pp&IR$%~-Y;BlW|GW^e5*VNV+Z9kl6Xm4 z;7iYP67-#KJOfFNbbBDxK21?~ pxXkeYA2ivAo!i zY;&4|dc<9E)&<(v7o3_iO+ge%&Wum1!*YUSv%{^FjL>U*Q$IOnI6^r`Sz=qcf6Mj- zx4&ShSvsh&BZ>;h9M#k;+gQYhuse)D9PssIM7V*=6?%B6kmc>HTMXIyW&R{zL}8Is zWLZ0|YsdRJntf9r3%9q!SGv*aKZUO6Yl7w?n5XZUE7!KRe!&u8i1sWW-&8Ap=2}E_ z>q|q_v9)AbPD3)C=^5`PXMAyMOi}KMUma)Cq!FUxg5#^`0}s>%$I}@*xq^zCZSCRl zJ(NF;h<&~2$i;5~Bdt{(Mbjs}WtJt|@XV5+qZw=EvdnWE&Aoo|WYPhOzGPTk)AcE5 z#qfPHrWIjBK`EX2oZZjrWG7MOv+v<6l;@MoI^`#GQ*=9KXHlZ}jD_6KItCxaNq-y6 zx~^$Hzjlc9WByxcLLfzJs0LO{nhQY n>Bg$@{ViL?gWmvGw)T&IeWCE@Rc%&@bY8CFQOnt_ zGs!z519WXG@#WaBs-M4|O@elgUHF8HC2RLzj%sZA5`!eatWlI8_$z(qKe=B3;9J6g z@FWa6jmE_(S6CKm=W(snJQ^(unc!Y}T8=l-ykFXi6|>2NTA v8DTn1P`_ H;*I3yrZ9~70YEI1APZU>q+o? z68@2()jTh5`t0K1fw~8$DIf`8=-^tJvRTR2g)sMfQJbC0`M(~c+JO5b{!2YUq!E)X z&@Qu(XGF%DfuATP54oEij>bO~ww!cnk~4lA#XBlpd$NzSdE+OZ6V*=*0?Nr`BCw$Y zr<#%MZnfqs#NE7Krp+LY{F>nO1^#yRbv6fY4qD6Rr bKOpA z_D2?_=$ yh)m&`RyGJ@EKy=7lJ!tUe8&RrUqN6$kc_dsgV>35?8UzgT%ilQEG| zAb4r0%{(tD@g8re |?@@P(hA}y(4iP^&;faz^e-vb0ndCN#`cjHM z$`?6ac4-DFDZ7WA%Ln)6&dT!6aaZ5qv*+0$*dt0%*B9P-RQvEzS2Q39xo6SanLoDG z^1Fkm#udI;svLwZPM`bJ0UDA8NIY*t@Jk}B1hL^BDN9rb*cRwCOLbzxI}Q}27AL^p z!!`Z@03-QqVoZ)0QQJR!*t!;8SOR-Ga|zlpDy TAeytFF{O+!@M3umISN92^Yx}V}H$ev_ 1f6{y!ER`;oQA8hPWPcGmNU8f+4LEk{J)FDwd%Zn)Tgt^%q?#|!_Tddp*SH#_+ z1T~r|-%q3JJy_@2##tFK60A92)J*x(%4W0OqTxcVl1Fsk4K4MNcQxH6OfVwNaZqiS z0rqP;!+VZ;LG-5F^=rr35$OSEiDrK=H71>EiJMpL^jJYK-7w$Vk*)bca+u&S!;&on z?DS|AH6vcrd|rjbeWoCJHi@|W#3ZW0oWVM1HODv$jcFA6JBcz=zH&wn=}VW&yJmJE z)E_}nhKN8t= ^}q^OnlR z(vP>JJW^lq@JPlFp*HkntTws$ *-WZDpY10me0I> z=(uvF wcfNrr! ##;8UG51aR372O%DS HVgWRsU z{w;uM?rH1z?|B5F;L;e`e$naB*7Ub&MojXRk4I;>EA4T+n!fFl* SX9U9`JjK+7}3C3Dg>%T$U 4ZvVVH?;t@MFxF-N?2KiUIy4yb~x})V&Lh;sf zEIFE9&24DbNPqFtTiZ?xCL0S%+R3k7T96(&kVUzgkD6g@(xCZ+ZdGl-aP8W$_b2sN zC(b<$|A}oZU7eZ?#2-Zm 2|mSr$6Ucf ( znP}F>!&j?i$uj$!ScH^YZ&L&)U*4;Aax{uK?p>wNlwWx;E~!Tm{Lq_PqMySE*#>ZR z!RIyaoB=?@dltv_qjH=^dwzYWpALdsDBm~)V6bS93Zu2qbzZr|<6Ap0%&f+xX{cXh z7-tz32vitN%;qPb2UR#q=JESW%~}LE&B*tRYPX)XLE!jh+Q>*1LVeayy_z}rsL=;? z9jw Sstf!~6MhBHiUQFtMMY^(>YGGu =6Ki|?G`=Ko|rsYllP z3V8n7PnBKEQNknW(R{nAAfG9dW^-`Qj5fEMWc77T)1g^!pI5!rSabJPe(Z7iW~K*q z@a0gCcUHjaT0-3qHkgSQf8@DwK*%JVq#a!~SxyE0X0wLNUJ?DKzP4H|{FUTj(
ibLQB#Vc$h; f~j*5UAiq4 YQ#*f`{0(@tl7?-z;$%=Dt< ^nL31x{)wS5@PWjC*BNc8<&{F}o1F9p)1~=woMgez0aJTSlJSH_GlI ze5r5BInx BEyIBdXqdcw)g95^^gVew62GW?Ri|L1?1Z2lo6n29@HbA8&)7 8<#i2==#Ga*GQe}NdA~H-)4)_JH z^9<7wizDi!rlUGNa*Hnw35dn@RGK1_??YLI`Bb={?99}S5A(h&?zQc}u=%amfc&Q2 zm<8o85fUTqR$G_(pE~8Jxt!We*)e5}QR#0>Unu1aTMbGPd?vB|-bbH~zA$fDZ^e8@ zok(&te7d;_d(uxt0$n{|LrpY|)^+PI(I&hHHP=XbQgvWl`C7XJEBTlEEN = zG}eOBHp~6~!{BX4ucMWC(r)JJ`_6Q`w7y#fjiF%XvZ9#(3c 6yiuH7boZ7K1lsa>(w?qUCHfYCZ0DcXt2Qu1W_rEuF|ye<0ds-t*~IsXY${_r9^Y zU)ay4rI6qb!ypEYwevDlOTMZ3KL&7qR%*+o8R<+}>FSc>4}+)NQe3|62e9JV9!w9~ zH0POlzgCY3Zj!vow`HNpSbi>1F*3;=c>627jf6%aMc&*o&VEjD*aZ$$tUn%#l26#? zh}U~uX(OVUzZge~j@Is+sJV5uFLv5}Js^CKc{8%oqn;Dy$m(MMo4y1s^QEH$^Z3^I z`tQt~p6G(-870R-`m370tk&j5lcRg`wl4AK3RaYqNj5Kv#%A=NMKeUE%4!}KjY|%* zSl3y}7s!*r-JC63eR7p_vtE>r{4=02CSCuS&wL++{e$=Ex U}^0 z XglZT!BM6+!JyJ_ z{gK`9c&j8D-xtqnW#pR*={|E&i*-Ed3|Y>*jkm5Z13oWGrl}=qFU1n;*1pW?%&ahu z=2cd4>fFElF+16^Hm|$0J1&wVJ80q9wPR?`hxa&G6?%I9f-kvl+aBI)Vy8Hf`_S!_ zCBb2|O{0fkdqKKe06luhJaVt^rBedAt~ahFt)!IHuvsZ_`D0(^doBr;rp2NA%YIdH z1D)?y`n4@qdVAHYtFbB{+g*5AZJ2F2=CWxW4NHD+Z(p{$uGT)-3=9>9sj@Nc`vsEe zU-MW|hLvv`@S??jb85>LL^`h_M$qcl!qStz3^Ebr1Ju!`9hKQ3->c6n;m7Pio _l5GkFd0I4ias4~k;N2SJ2iQ*YAl}6WNEpwP{B5V znJ>MKY>5Lr`_N$DBtF&$w4>Af;?hD#WvnaUk}}OtVME+)Nnl|HZF7^PoZvTtU(7a5 z?E@9z$&b^P)wO9iVGVxk>fh04v(?q<3RUh^%g`e(%hEW1f|-(G6UAZ4Vq9N^QguWN zf}i>Ui8)8+pzB4NE4x;bc7;B=n>G2~^SnQrC26zrdD9%Louk!PEZs?o!Iv>n5$$Qf zSOAQv(Zjlu61N@M&5yV2K@^;x dJol#Te*e97lX&oqCNXJ&Ya?oa=}ybDbd@ zm>jQ)K3wVC!D3q1+iS!qkUgo}%#STo5Aw^%qnK7AIM2#c0zU1u6V3bvjA}*WS)rq3 zc6IR|ext>nIpeYD&H#G>x7hw|lRM@KgG#)~bXOa1Ic^$d_WkG$xf_j^(8oy({|E^O zb7>4N79#k)3EG2 DBqs zZ0&5Afisn4_%O?WxJ$&A4F=Nqea{NMC%aC1{)$Q9+gkikr2j!yi7P#=Y0J^WYC5Y! z&sx#l{UvX?dJo!It5aW69Z`$&$#vS`c7Cy6d1bWBi;%LLeEAQaAGBM8_)N)98{|5< z1+=Bzsj6mX*pe)w#EN|ajci=y(Onq)NNCV@9f7U!u5Yk+;Idgpxo>|Zo!6}>$;$6Y zPoJXUeuft?`t3PXS8vS(*H;-xuW}!7ne5wyT5D=eO@f(4uZvv;KA_=hof;@SxcXRt z?QCE$p)-{6NIh-vy6lg1Z?e%;WuV3iHsWI-`#6HRDD6_WC$j+iczV9)@XTzZ#e_L} z`Z$RZi~7I{*L-PTy~W-~Yv6eGd#zZd9+;t~0_H=?3t>Q`aCpN5V+cC-%CH^nZ3oA~ zO^E~@^R6Z{X5nxPzc4kbZc>GgV-{-WA?&v7@B>{Laz)vA>Ll&sZA5%^g7&f5p6#kq z$J788HSy9P1BR~A!Ihka!fz-}S}#{ n@cADB0jw9*(&j{O35V+fs0EnDXBKzXm|16C3x74? zI!gNOH*Us`;A*%l*26C{N=tLfD%t?6Qk}bLTMGCu@liw9?4GBW!rhQ4?`?*8yu4|BO^EQ{|u=Ag5Z&EZ& zLKC0V{nVjQReBijcjhmN2FP$X@!JH;q=r)ozje~E?_$Qam(a|`PkDzrJWoAl>v-sO z_?h{;ty7DMnMLJPcGR(n{{0Q-%*} 9HW5BL~z245%GX z<~2d#cgZ1!&iloiL?kW~34K#1-` l>gD@sOO2t15tyeN?JsX)OZ ^QAQGyl!Xq= #NF$7J-%jp$=BkF*o+TVk*{@Yd~%Oy? 72ADF$TOz*MeyRqchTnAyIWf^3KA%5oQa6_XW}`c!i%zBe*mLy1V&wq zpL1veTB;^NF!Ru`nAQZgGuidxH6dbB8S51b7!5gW&Uki_W4OJuez_llzby0-w
Z|@eEfF^VbXzd zba60oog?K!35V-lv6r1d=Q-Ho+6hG*F<@z$EcB266h;z*H(7(;*PDahi)q5L+Bp@9 zL**sdL|+|^Hxu^=bU2sPh?q*{@A-UdUrJ35vw5Jm;duAOOYDop=9!h8j?o0Lly0a4 zoE9UtAIdE%!M;n>Y-Jw2fP(6nX7-O2|D6hr<|z(^nCZ1X 2>|XdMryX87FoY z=a|ieUDOPr G8(D6eK}6OEio>o7%y z