From 29dc02c8ad37a8e62db220473b15b555db3b33b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20H=C3=B8egh?= Date: Thu, 26 Jan 2023 09:14:37 +0100 Subject: [PATCH] fix(Breadcrumb): ensure focus state is not partially hidden MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With PR #1860 we got this issue: By adding a visual test, simulating the focus state, we should avoid this in the future. Its fixed by removing the `overflow: hidden` – its not used actually, because our animation `HeightAnimation` will add&remove it during the animation anyway. --- .../uilib/components/breadcrumb/Examples.js | 130 ------------------ .../uilib/components/breadcrumb/Examples.tsx | 127 +++++++++++++++++ .../dnb-eufemia/jest.config.screenshots.js | 2 +- ....test.js => Breadcrumb.screenshot.test.ts} | 12 ++ .../__snapshots__/Breadcrumb.test.tsx.snap | 1 - ...atch-breadcrumb-collapse-1-c7a95.snap.png} | Bin ...eadcrumb-collapse-opened-1-f4b6d.snap.png} | Bin ...ch-breadcrumb-focus-state-1-ab51e.snap.png | Bin 0 -> 8894 bytes ...atch-breadcrumb-multiple-1-46050.snap.png} | Bin ...b-multiple-with-children-1-a7948.snap.png} | Bin ...-match-breadcrumb-single-1-21525.snap.png} | Bin .../breadcrumb/style/_breadcrumb.scss | 1 - 12 files changed, 140 insertions(+), 133 deletions(-) delete mode 100644 packages/dnb-design-system-portal/src/docs/uilib/components/breadcrumb/Examples.js create mode 100644 packages/dnb-design-system-portal/src/docs/uilib/components/breadcrumb/Examples.tsx rename packages/dnb-eufemia/src/components/breadcrumb/__tests__/{Breadcrumb.screenshot.test.js => Breadcrumb.screenshot.test.ts} (75%) rename packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/{breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-1-99672.snap.png => breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-1-c7a95.snap.png} (100%) rename packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/{breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-opened-1-2b97c.snap.png => breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-opened-1-f4b6d.snap.png} (100%) create mode 100644 packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-focus-state-1-ab51e.snap.png rename packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/{breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-multiple-1-b85aa.snap.png => breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-multiple-1-46050.snap.png} (100%) rename packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/{breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-multiple-with-children-1-dbdd2.snap.png => breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-multiple-with-children-1-a7948.snap.png} (100%) rename packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/{breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-single-1-5c8af.snap.png => breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-single-1-21525.snap.png} (100%) diff --git a/packages/dnb-design-system-portal/src/docs/uilib/components/breadcrumb/Examples.js b/packages/dnb-design-system-portal/src/docs/uilib/components/breadcrumb/Examples.js deleted file mode 100644 index 2210fb4e1a8..00000000000 --- a/packages/dnb-design-system-portal/src/docs/uilib/components/breadcrumb/Examples.js +++ /dev/null @@ -1,130 +0,0 @@ -/** - * UI lib Component Example - * - */ - -import ComponentBox from 'dnb-design-system-portal/src/shared/tags/ComponentBox' - -export const BreadcrumbSingle = () => ( - - { - /* jsx */ ` - { - console.log('Going back!') - }} -/> -` - } - -) - -export const BreadcrumbMultipleData = () => ( - - { - /* jsx */ ` -() => { - // You can also import pages from a store and only do a remapping - const pages = [ - { - text: "", - href: "/", - }, - { - text: "UI Library", - href: "/uilib", - }, - { - text: "Components", - href: "/uilib/components", - }, - { - text: "Breadcrumbs", - href: "/uilib/components/breadcrumbs" - } - ]; - - return ( - - ) -} -` - } - -) - -export const BreadcrumbMultiple = () => ( - - { - /* jsx */ ` - - {console.log("go home!")}} variant="home" /> - {console.log("go to page 1")}} /> - {console.log("go to page 2")}} variant="current" /> - -` - } - -) - -export const BreadcrumbVariants = () => ( - - { - /* jsx */ ` -() => { - const pages = [ - { - text: "", - href: "/", - }, - { - text: "UI Library", - href: "/uilib", - }, - { - text: "Components", - href: "/uilib/components", - } - ]; - - return ( - // Try changing variant here - - ) -} -` - } - -) - -export const BreadcrumbCollapseOpen = () => ( - - { - /* jsx */ ` -() => { - const pages = [ - { - text: "", - href: "/", - }, - { - text: "UI Library", - href: "/uilib", - }, - { - text: "Components", - href: "/uilib/components", - } - ]; - - return ( - - ) -} -` - } - -) diff --git a/packages/dnb-design-system-portal/src/docs/uilib/components/breadcrumb/Examples.tsx b/packages/dnb-design-system-portal/src/docs/uilib/components/breadcrumb/Examples.tsx new file mode 100644 index 00000000000..a36f7d3a15b --- /dev/null +++ b/packages/dnb-design-system-portal/src/docs/uilib/components/breadcrumb/Examples.tsx @@ -0,0 +1,127 @@ +/** + * UI lib Component Example + * + */ + +import ComponentBox from 'dnb-design-system-portal/src/shared/tags/ComponentBox' +import Breadcrumb from '@dnb/eufemia/src/components/Breadcrumb' + +export const BreadcrumbSingle = () => ( + + { + console.log('Going back!') + }} + /> + +) + +export const BreadcrumbMultipleData = () => ( + + {() => { + // You can also import pages from a store and only do a remapping + const pages = [ + { + text: '', + href: '/', + }, + { + text: 'UI Library', + href: '/uilib', + }, + { + text: 'Components', + href: '/uilib/components', + }, + { + text: 'Breadcrumbs', + href: '/uilib/components/breadcrumbs', + }, + ] + + return + }} + +) + +export const BreadcrumbMultiple = () => ( + + + { + console.log('go home!') + }} + variant="home" + /> + { + console.log('go to page 1') + }} + /> + { + console.log('go to page 2') + }} + variant="current" + /> + + +) + +export const BreadcrumbVariants = () => ( + + {() => { + const pages = [ + { + text: '', + href: '/', + }, + { + text: 'UI Library', + href: '/uilib', + }, + { + text: 'Components', + href: '/uilib/components', + }, + ] + + return ( + // Try changing variant here + + ) + }} + +) + +export const BreadcrumbCollapseOpen = () => ( + + {() => { + const pages = [ + { + text: '', + href: '/', + }, + { + text: 'UI Library', + href: '/uilib', + }, + { + text: 'Components', + href: '/uilib/components', + }, + ] + + return ( + + ) + }} + +) diff --git a/packages/dnb-eufemia/jest.config.screenshots.js b/packages/dnb-eufemia/jest.config.screenshots.js index c5e79481954..f81a30533b7 100644 --- a/packages/dnb-eufemia/jest.config.screenshots.js +++ b/packages/dnb-eufemia/jest.config.screenshots.js @@ -3,7 +3,7 @@ const config = require('./jest.config.js') module.exports = { ...config, ...{ - testRegex: 'screenshot.test.(js|tsx)$', + testRegex: 'screenshot.test.(js|ts|tsx)$', globalSetup: './src/core/jest/jestPuppeteerSetup.js', globalTeardown: './src/core/jest/jestPuppeteerTeardown.js', testEnvironment: './src/core/jest/jestPuppeteerEnvironment.js', diff --git a/packages/dnb-eufemia/src/components/breadcrumb/__tests__/Breadcrumb.screenshot.test.js b/packages/dnb-eufemia/src/components/breadcrumb/__tests__/Breadcrumb.screenshot.test.ts similarity index 75% rename from packages/dnb-eufemia/src/components/breadcrumb/__tests__/Breadcrumb.screenshot.test.js rename to packages/dnb-eufemia/src/components/breadcrumb/__tests__/Breadcrumb.screenshot.test.ts index dcea8400bba..b0ca5d96591 100644 --- a/packages/dnb-eufemia/src/components/breadcrumb/__tests__/Breadcrumb.screenshot.test.js +++ b/packages/dnb-eufemia/src/components/breadcrumb/__tests__/Breadcrumb.screenshot.test.ts @@ -47,4 +47,16 @@ describe('Breadcrumb screenshot', () => { }) expect(screenshot).toMatchImageSnapshot() }) + + it('have to match Breadcrumb focus state', async () => { + const screenshot = await testPageScreenshot({ + selector: '[data-visual-test="breadcrumb-multiple"] .dnb-breadcrumb', + screenshotSelector: + '[data-visual-test="breadcrumb-multiple"] .dnb-breadcrumb .dnb-breadcrumb__bar', + simulateSelector: + '[data-visual-test="breadcrumb-multiple"] .dnb-breadcrumb__list .dnb-breadcrumb__item:nth-of-type(2) a', + simulate: 'focus', + }) + expect(screenshot).toMatchImageSnapshot() + }) }) diff --git a/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/Breadcrumb.test.tsx.snap b/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/Breadcrumb.test.tsx.snap index fe381e4843f..2138449ffb6 100644 --- a/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/Breadcrumb.test.tsx.snap +++ b/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/Breadcrumb.test.tsx.snap @@ -752,7 +752,6 @@ button.dnb-button::-moz-focus-inner { .dnb-breadcrumb__animation { display: flex; flex-direction: column; - overflow: hidden; transition: height 400ms var(--easing-default); } .dnb-breadcrumb__animation .dnb-breadcrumb__item { transition: transform 400ms var(--easing-default) calc(var(--delay) * 50ms); diff --git a/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-1-99672.snap.png b/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-1-c7a95.snap.png similarity index 100% rename from packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-1-99672.snap.png rename to packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-1-c7a95.snap.png diff --git a/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-opened-1-2b97c.snap.png b/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-opened-1-f4b6d.snap.png similarity index 100% rename from packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-js-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-opened-1-2b97c.snap.png rename to packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-collapse-opened-1-f4b6d.snap.png diff --git a/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-focus-state-1-ab51e.snap.png b/packages/dnb-eufemia/src/components/breadcrumb/__tests__/__snapshots__/breadcrumb-screenshot-test-ts-breadcrumb-screenshot-have-to-match-breadcrumb-focus-state-1-ab51e.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..b44ba2c4e57b729f282328ddd9a81f61d5139d5b GIT binary patch literal 8894 zcmb_?Ra{hW)b8kCK@d2N+Viq(d4>r5mI>q`MpG?wA42=Hi^& z^Id#5^P9bYd$0H1@2Y1#YlSI+rO;6cP(dINx{S2A3JCOK8Tc>#1_}7BUT3BQfk;6z z;v%Z<=|{^JnyMBH?PtPjh5o9TZ$p2E8k6V5h2o6QRdnO3PDN6&BIUxCZN3|EQ#-~d z|CEfxF=Y&;R%Yl}!I5~+Anx*BHC!6=)ho*jABSX?5BX?@mv?%2Bs|Uog3cpD-kBb% zc`Ah;MBcv=dB2}wWr9rl#-H>}`P*2R*TB7OztBAT=NstalzPw4d?h8{Lj|ry|HG8g zcz%Zn(up=^H$(l@(-O!7E<{=OI{Ls^g?ACn|0 zs?FDMcNa;tU@i8`62cG}S;4_okY9;;q@&F;)xcjW|DBMZL*%`_7~RIW&j6J1k;!w! zU~O#cjWHG$A^)drRM#ZNkB3u{u}p${OLYn+Arx;qtwkyIsKR8VP3K4S4%_gl4b1b( z`xY|}VUqd8Xz$1w{j%5AgH7x$$IfZkxl?S0e5bVR<^peH7*A?^Y8{h5vR9 zwSQ}%2w|PJ1!pfpj8-0ZSm zZhgop0Y^n;7gj>|)2Z^~7ReVQW!9|k*K1jueK|Qf6LUr={-@#ZW$J?w??|>LBYp7q z_p6}eFVl}~2>B^R{xbC}bzZa$!V==U&QsWv*(!WZLMY#K(u>MRDgTFOzp}yJ2AZ0l zn!6qiB42OK0bWD7ZBtazfS8O^`-EBk^f06eB_7uu z0SjakUmY6uRqa7O(=qiPgk(v}%h?~s0B80(G*3t2V%C=O!I2BHjKnf+`vp)n$F~XR zj7Ofdy8|vRR~|s{OF(e2Gj|RzCKLw}V9t=i*HGDoNie1X5oBd&Srea98(9vuJ9Ky@ za+`)NQ%}&kg88cbsf9ndAeA8UQ{-4o4F~64zX=a$^>}HzfBcRAsT)n)@mqxJ@k^t6 zyUE_E52G(02mrIgl>azK0w|wprMag=?gwCrBJUr2_Y+*a6|>CcH0L5T5QK1w!};jL z&dOXR2+j>{IR&GFf{?cx2MD?A*?Y3Dt**Yd^>>RGyhg%GNq8k7*Xn~!JyvTrsQnuA z!^gjsi}hz$r(fj6D(|`Adk|bCWcEK|$db@wwDzMZRZ2@sw7t1X^}gaV{~Yot{jitq zdsHW-&3hXXZu7(4& zke1BS^EV8hht|8(dArR_$Lxm*)YFCZ zib=}iHznRqASMP1~$QpQRt9Ao&ItRRhS>KUV32`L+>x(X4+PN5cE5OhF zpYL7JxR1}dnUvi!@R9C}t389omju$V1ex2Txt%hdS!b>Nw!Y}iKVH16Spt7EzN6U* zdG))|fXD9OCt8R;66ng)fz7||;UW0LO)o~SKZ(z+-_c_ItOtCvFWPx`j7&vEMOsFN zjGWv*kzRw%Ziz=!R5StKayckCxYdPKZR>2a5Ag^;>F(*7h8avV?U`?Hu?~zz$5&Q< zKb%5&3d3d{n|Mj;b7tJ^df4uHq7Uxv-QYIzN7UY*`aZy&g_tk~&4>4o@Iig#g+^Qq`H$`YQkVq(7i`b9IC#Mm`FjLykf+ZaqYB~mNf=vijaXSJtN zMoE1>*&lnDBBV!FNbuFN(&FC5hk!Q@8w*8U?uU~Kd13ue!B3xV?QTy!$~T&beepoQ zuCFv|b?+$zr~jgmxZQa0gT3#(*1j}1y4fGH5CjGs8r|g2O27vAe$=Z#QgHD@bAw(# zV$%#@GkvR##Z2psmXdD&W9m+-O|#O!+&`Wh-e>pBu!Az_k)GR^5{?N+D>dEr8*Z`9RaYe ziMXJSj!%dSMYfA`{IAw>Dw0T`0;DTQ96g-kNZ8T1b#Y1<_>go{IYwf7DIw2;;r|;fw=8224Gcw-S zS%(0p>snB74wbzr%r58+9#bl#qA@YC8PX67W*J)1H}Y-D&6xuXGvyDD_DB4&)!txV z^iR^xwzimU;%zf^+r(~(A zsmV!qhri@g{6j*J=jZ1Smz#cU52sZ-ZdS_}+O0IpC@H-+s*0)tLYzfsAj;grBj=T^ zj0_4Pm(5yd&|7IrEO~i(d;xbBeSLin%L(yTeRFf_$H&LO;NZBVq~P3K3KFkVk$gv4 zN-WpoB^h^jp1Zp{9)5myn>m*B^vr24pPOa3e>*#qZN9!-c1xk+0G5rU|^sF@Ww)&?I7^f zM}AiZrO3Pk&;1WTk`QOoJk3#ivAa-375f%<40`8;VAd=8kq2j?3E|)KRT%t{m=z7b zzslSGw>Do&NHje3ti2|kx(e%kRT$d4s_F)p6Ji=lEc46Vj;5$6gxB$>+=qv~@kY)D z0P_54at5?BlPRotkq`n(PWo&~J6Ig!@M43VZH(zgx@*b*<%)hSDxrxVPbnu+qJEPlEzLwdEgEb@bq)sQZtiiWuXJ3C8 zZA=xZB_60IIl#;GBV(g5*gdbim2}edl$FsI|HKkyW`2jdys~;E0{mh#I)&ZOBI^z? z+N8ihmI66E^+*BawQp%MP;d4Z=`SPU$V1Wm2D`fP-S;N5B0Ko_B zbL!X0S#iI_3ncL5>0-RiCRekgyNmDV7n=kAug}wJfDI!kXhTI@T^UGN{dW^SyzK0J z)8hGqqS_)iKU+lIM+k_6A8YK00Ovxm7{8J-HlD-6m9!Ii;TKP{X=pb>;|)JIlYV3F z;o)^UqXYVVdMN3*#@uFTZ{8cOoGU&2cRfP*5r7^6_8}Oh7qC)!Z_1^d9CDaNQ9{Cp zkxaqC`D%+479)RAQCV48y!F)J1NTgv^Elj)+89Fe0*x`S2Hg!T>!8AyEpmE z(b2J^tLr}~6k1hPB`q!e6LH}=z^n-DbFt3$>({R=jvL}}adB@@Q8%hbg(%qB8WMWD*h*yQM!JRc3<~6&3A0J^3ECjYtY<>QCQ)%u};7mrE}4JlvWD8SzR?e|6Ks z!V*f(oXZmd30ubrF0CQ7XqS)-y3qrx|K z#&a#no5YrJG5vyz=pgC)Gh7B9L;?(xe&s?VTltn*;UdY!{QWtqYzxbHcatfqBDWnEkq-ci_+b)c`4HLBT zIR%=Dg~TOhjoy9(1urgEFAly{(?T%}kH;4D@`l+jaxsl&F|R%X8S|#~R#ZQ7rBsdH z;|ako5*y2dMl27cTXxrD(}^^DEEdZ+ucpsnu*>~1zmEVkd=y#8v)SB821Rh8CU&-2 z-fI*6*v!0&pDx^ACVuy;xug_3ds3Ew4566V_MbofH+UDPWLkH346e?bMDzWjD>E}S z^lkyU3+PzWxDFM zeoB1(_QRuO;$DZg4y4h|LNb~d)i-{{>mq0|qro|3MP2+TRaIfGL&3+77rC8(q~4Omp(jl&rWW(*e${ljcR ztkk*&ztBIv{o0)?jQ)NY7+HH!+I49H&P zBf0H)Cj{J^z3_t{B25sQ5 z5>it;J1`JSVdwu)G|F_zczEzRIXRu2ocjO%eL+f2{!&Ux3f9TUX+DG>6lbTdjtiI` zCWT}_0E-(N`Gf(7G8sS%nwpx*18lVR(W}w*hz|IC`vE6;z;r)EE#}MN5es?!t|%=o zE*4l%0zd>-QBje&xOo2!MWU=$qswQFa{c_@zuzDuBj33dt8cpG#>MTL*eV#zcPPqI z9ya*2a5bs0l)KrdCeo|@GPSsvj-^nugODdW3G${G7bai~CaJmWiK!+2&ZC5>W%x`M za4Tg~O6lf?7+Kr9XNtEr*Tvw;RmpZ)g;VYw8q@-ikx8$lga;e1FW}H- z$n2*IYO*9Id9Snwucw{$Y(+e#_RCstm1mt# zsj2buSzs6h2eLR_m~%``J)?k#und+x5n}V1788*CsLf;2*`t zhE3+tQ&s8m^YUJWi34C)DjyC6IWiH~(xp~!LQt`jH!B?wmZHHaX@jY33~t^DN!x=b z5Cw%&Q7Ckt>qtdgTRS-=1rz(?5cB8E%uI=HLtL%(ESonFbkNX}xoimlegIf1*Hs4Z zXL)2~b4bBEhoYej7cmtz<&Kf51g_xV!>2xBpcpGmrTc($!NLyN+jNmDCQrOFS~+Dqe@C+Oe?Ub$?Tr3xHzqQkAoVr3w zT`~Y0S=;*;n4N@6q@bX@uGM4*W3A%90-Kvd!waW|*|3=tph7~K7*!?-;3Y?T&cw{B zwBqx#xmnW83Fzo>n$*osjWc~fOUlQl0x*>z_m38CyVJXl07`SSGwT#ONi#ZyngMY0 z7N_;hcMKvvhxN{&oidHoOMo94{P%a%_s`%)PsI4-qzOVbp6>&HSRKre--= zfDSl#p$q)>)*VKZKd~7c5;9x#K}S2BfsRf^Gm|<^RZ?qXaJmRYNkbE#o-W_!)I<=09tCs(jdPUgMK8v@N_|Tz6!{WP(De85Nfbdq-aGJ-LKYFi3YWmZC3f)FOinx4ht(xPt)6I z=&E#n)LQS5mI~P$8F7c6jQH*DdJs(l1z%T%QP&(0Qd_8&;WsDFSNqela#m&^@$tv% zY<2wo{b`xFKZ8|O6Pg3mU0gVT2ntX&gV=UPMr3_aM3A`x>)EpI-d=TSbsBKGl60t~ zq-2fdWH3PcXwd2bVLFqanRY7idZ5+ouG~@^NWr|&{VC`A;zGzTaBO;dNyQ;h)`6PI z2-%-*&rIx=8()6`w4cK3OnrTQeXePxH{qS~To;LwuVr(+_W3TI;C;*}cqlj{U{z*14UEVHM z(dPVf*^ddJCI>pMq(qC6e*Wz(Je<#}k?I9z)#hl&V}3opi09g4GCjlk)UH^aPpICd z+3uN@0dz3WZG!YLQ_^8_VZLNz`*EW3nfDFs?snjz4t@r(zkPl0xCnbAyKI;FR^}`G z8tmH?fI9yr1;zY(f&tlg@AB26wK?rax}P4RpAKfDTe-LZD>xl}fLF4!8da9C$5%#S z6iY^%AKSORU|Emk?jIU7xoU8ho|xd#?Q;ALlsdN_?#~=b&W3RT4{!Ej9!gVAj;8nV zr>0+EwOvCEB8pF+G=0t~0g$Qr@#DIo9k_ou?fY`oYrv|5T@R&2)p7ka%Eo{M?vdrz zViQ&`5rGROD24-SgZ*vz{X6vcZ(5+7i2zb7cJcW9Nd$AN;qg)ffE&{QU}$1(EhjGi zs#v4k9H=I|&i~RRCnx_bD;p_qdz1xgB7hw<0#f;TU`l3YRAwgeN!ybU9qaK=YESqK`MTOF7#kalI3Hw2!)N)jLf!21;DPap zr``Yc+luOHAYv1WOG&ZI%%D`L%V;!uHFQ1+9Un*XRR$E6G4%mNZG4NTmg6>B7Lh<` zN*U9`V!g%DTxBh>iN;tB3ZEA5r)HNFX6osd(lWaIYR_piTxI}k&O{MKxT}-aLAapjjK}H;kfx00a~>bG)Fnn8=}}os06GH1Uam6g+eeYf%3$Ae4IlW($zB%?%UL~d9+_N zwpS>X#)UY0gd=uNjS7zEIwo_-^V8wy9<`PM7WH-vOZCydL;}*)1qvSxtp}qiBxw`$ zg}n|KQ;UkLA3I+onDlbO8u{#Xw9fj5Qka{O=-2@WRKvkB=W<3)!DWxsKHlly{x{w_ z-Qk7#)qc;_KT~S^Rj`O7tDDeMx-#GmR#UX<>AYQWG4JJFT=3294YDDI-e+fLA{rWa zEmk#~!lMDm?>@*54X1MEI`53Qdw8_6z+Uk1@l`o($#U5)bl8H8szF8FcEt zGq)kI^z`(WmX`2&ohT#ln9H_kv|@oZ0V%g|czkklXhQ=pF)^{br)Mr*6YItGbwNc% zj9RgJY-T1HsJqTCFHH+()tw$>DcvT-G4Nk)}aDHJi8A1=u# znNrTL`snN(B-UEb1gp~ZIF1O!v9tYIgNwC{ww1^Oa66~0NP8;)l|a@<8MB9q>ijH? zGd44=c#M#no%!7|wZcClugo2w%+v$;`k$X6beHC(=rSs7EzNkw=3m=u4SeiQGj|Gk zd3U)iRZ1_klyv2NjEsV!l%Zx-rYHe6w)5M2DDAn;0+(qVFr&|>jy^&PoE-nUuJ`G7 z_8@?TCrlLc0O1sLIq=;e$l|0_3rOTMcc*4*s;c64c4eZ`8|PKk)#Jd?(qteIUU@2? zwYTg9BErM_M@OaV3EGBVzkdAz2Pa!E0;6PaZx5ed|j3OzuVL%7@sI6H1$<+5CW20 z9@y&jmzv~>=YLmPYFIf`7ydEi=j-0s*>epjm8a@XrdnCa$~lahXbxXwAO0&Z?zV0! zI+1~{E*69J^d1^e@O~??*=zUQscUGIt9J%j2v%@f!ysm=ikn4)p30r2RvCDYsXG z<7p5=wy7!wCxgtirbmwfAT)RIbQS5F&IrU2pGu3ZS&x#ZXYc3ifeJp!w&{pOPyYtT z8{%hqqq%kv6x6FZy6Ql(6gY$TB}~kAIc~jqK>mq;avX{DubHGW6W$nh=7B zxa+l4C}?~$iB*=r-R8fnsSVYwRw=|bd&69RNCR_8xxnOw!4B`vo$tC1fgZWlW+MJC zomC_kXm?NRfAfmxw=O2jznVTg3JGbo#iln4-1E9(qG-Giq7JdUZ0OP7`uQTDD!}{(qfUvT~9CQrIelEu%>`1x~PmMz1ZAm}e)B*>{rbU5SDudgP&m?YRcnR*PMS!{d{>;2{B;QF!(YZ~T?S$oFQH&B08j>+lll)5PCUUb^FpD`sg4FV(How@0sfK8M0 zTw-ZZR-QuzbUn^{@=$8HI4!%SUyHaCh2|BT&TgDk-FVTG{pbQl3~UY^0_objTr z6o9A48^U)sfsqN?H0j2xT^}m~WTqfTe%3Ic*NrtXAuTOO!!6uaDduUr%V8T1OgSX= z_SSH4<%rSCA@M_V6T=)$La2fH1?m4ge_{MR;(s_^@xL&kapzmzBR5Wl9q>Gz0+Nvc Ki