From 8df20c7b2be49f9ebb545e710d49619447988225 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Mon, 22 Jun 2026 19:58:44 -0400 Subject: [PATCH 1/5] feat(Text): add noWrap prop for white-space control Co-authored-by: Cursor --- src/components/Text/Text.module.css | 8 ++++++++ src/components/Text/Text.stories.tsx | 4 ++++ src/components/Text/Text.test.tsx | 14 ++++++++++++++ src/components/Text/Text.tsx | 9 ++++++++- tests/display/text.spec.ts | 1 + 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/components/Text/Text.module.css b/src/components/Text/Text.module.css index 320d2686a..b44d4b4e0 100644 --- a/src/components/Text/Text.module.css +++ b/src/components/Text/Text.module.css @@ -9,6 +9,14 @@ width: 100%; } +.text_no-wrap { + white-space: nowrap; +} + +.text_wrap { + white-space: normal; +} + /* font shorthand depends on both size and weight; one class per pairing mirrors the single `font:` declaration emitted by styled-components. */ diff --git a/src/components/Text/Text.stories.tsx b/src/components/Text/Text.stories.tsx index 2a0d6be22..eebdf4c7c 100644 --- a/src/components/Text/Text.stories.tsx +++ b/src/components/Text/Text.stories.tsx @@ -116,3 +116,7 @@ export const FillWidth: Story = { ), }; + +export const NoWrap: Story = { + render: () => {sample}, +}; diff --git a/src/components/Text/Text.test.tsx b/src/components/Text/Text.test.tsx index 41510743c..3029bd6bb 100644 --- a/src/components/Text/Text.test.tsx +++ b/src/components/Text/Text.test.tsx @@ -15,4 +15,18 @@ describe('Text', () => { expect(rendered.getAllByTestId('test-testid').length).toEqual(1); }); + + test('given noWrap, should apply nowrap styling', () => { + const text = 'text to render'; + const rendered = renderCUI({text}); + + expect(rendered.getByText(text).className).toMatch(/text_no-wrap/); + }); + + test('given noWrap false, should apply normal white-space styling', () => { + const text = 'text to render'; + const rendered = renderCUI({text}); + + expect(rendered.getByText(text).className).toMatch(/text_wrap/); + }); }); diff --git a/src/components/Text/Text.tsx b/src/components/Text/Text.tsx index 458a42053..2347e0acb 100644 --- a/src/components/Text/Text.tsx +++ b/src/components/Text/Text.tsx @@ -30,6 +30,8 @@ export interface TextProps { component?: T; /** Whether the text should fill the full width of its container */ fillWidth?: boolean; + /** Whether the text should stay on a single line */ + noWrap?: boolean; } type TextPolymorphicComponent = ( @@ -53,6 +55,10 @@ const textVariants = cva(styles.text, { fillWidth: { true: styles['text_fill-width'], }, + noWrap: { + true: styles['text_no-wrap'], + false: styles['text_wrap'], + }, size: { xs: '', sm: '', @@ -107,6 +113,7 @@ const _Text = ( children, component, fillWidth, + noWrap, ...props }: Omit, keyof TextProps> & TextProps, ref: ComponentPropsWithRef['ref'] @@ -116,7 +123,7 @@ const _Text = ( {children} diff --git a/tests/display/text.spec.ts b/tests/display/text.spec.ts index 816fe6176..9ba28aca7 100644 --- a/tests/display/text.spec.ts +++ b/tests/display/text.spec.ts @@ -26,6 +26,7 @@ const variants = [ { story: 'align-center', name: 'align-center' }, { story: 'align-right', name: 'align-right' }, { story: 'fill-width', name: 'fill-width' }, + { story: 'no-wrap', name: 'no-wrap' }, ] as const; describe('Text Visual Regression', () => { From b39d2459dc6298f3fffca55ee2c295401dcfb559 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Mon, 22 Jun 2026 20:08:11 -0400 Subject: [PATCH 2/5] Syntax fix --- src/components/Text/Text.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Text/Text.tsx b/src/components/Text/Text.tsx index 2347e0acb..d528583ec 100644 --- a/src/components/Text/Text.tsx +++ b/src/components/Text/Text.tsx @@ -123,7 +123,10 @@ const _Text = ( {children} From 9a12d22f073153481a0f7589dda477a9c160879b Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Mon, 22 Jun 2026 20:43:06 -0400 Subject: [PATCH 3/5] Updating snapshots --- .../text-no-wrap-dark-chromium-linux.png | Bin 0 -> 2472 bytes .../text-no-wrap-light-chromium-linux.png | Bin 0 -> 2374 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/display/text.spec.ts-snapshots/text-no-wrap-dark-chromium-linux.png create mode 100644 tests/display/text.spec.ts-snapshots/text-no-wrap-light-chromium-linux.png diff --git a/tests/display/text.spec.ts-snapshots/text-no-wrap-dark-chromium-linux.png b/tests/display/text.spec.ts-snapshots/text-no-wrap-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..39a0e7f1ce17e98ba57053305c44b73f9642a5d0 GIT binary patch literal 2472 zcmb7``9Bj51IL#%EVd|f6ETG_M=M9kJww=#GsiGTCik6V>WgO@=C(wnC2}rueidTw zJ9m%J$ZcO&czXVW=lSLHdcQuuzhAF+qM4}y7f28U006jX*~=2Eym%~ zs<9}r?x7(%STMVJTH881kLSyac>1b~gA=$2j@EHf}Q7M_M%5K)8<hlf~AwdrjzlD{bk^z)#K9XWh5L#hlv{${{9XbW;R{D7&5bIgu@rlZ}B?ktEQvX>`1I6{izIDazgBl5PfY+GypiW6+;K4$j*?&2}C zq)YCbw?Ly3wYz;Ti^7SxB`SY|ZS}|)kCL}t2+9V6cg!$HRYH+(qwkP*Md&<| zS=)2G6D!lm^Mc+*noAWVJV=P5EykO(xb8&VcMX<01(tq_5swgH) zGA2m_74Bin@969?;1X+P@hh$h{R)}b_5vCC1RFowYJ?#ovw)yoqerCBd)ZP^L$SK< zovuEm?U2`WCj2fXxpG0qO;A0t^)yWBnix$6J};&@B&Irj>1QtseVBXcDrD8)MA{}r zy!=SxemLQk#tdt?!LXy4+q*OnkkRyzYJyUDq;nMd$a_6ZvWg=fmB9=&lkIr(IswSu zx%l+>1fLi?ncGiQp3E6y9K;ytS68+7xLmrfV9q-hyv3;Xs4b9eAG`g0Pm+Uugpl>= zrcWMhRk-b&56+C@&fJ-)@tGBrm5H;MF?Xd4}q!+N{b)F|2zK83xmdywegcb79O2?(o zc1k183k8c!W~Vs4oC*O-`Bkl}-ud#%4d8cT0Mm(1O0c`w^^x7EtSNOBj02cWRHe!K zIhG*o-Yo59y>8{!;;HlyzRiX_&VDkVU-{u9c<=>`Pb}qyxv{iU{FWKw1zwM0ivy^X zo5f&RAOdLUD(!TRWSXMmU>+Ek%ilP4ok$)eRJ`rRL0UMB)-=EUbe~b#eMLkBWYKL9s+DC+9o$}wXukS(8WwPPN z_2LuNY3hE$4JHoWxy5WIN|v7`1@7{^$<6R5a{6Bx9nFktnmW{s%dc%nwSz(i<`OKsJHp=kKNyJXOTiv-&*Jy4laW6+U~0W;btx=rb0(kF8^amOk(PY-VY^@p-6 z?>E+#t;k+HxrnK~`I`tWC8!w=Y!S@6$3=pxr-~6aGDqWj7Y$y4(|oT1=X0)IKi zz*!DcY^8Ke!X#6IQexHc1#H1-r^f{%)BU9K*RWzI?kcO`?ET(q;Lce2d=798Jii0hc?l7`Seo5g_iW6Mehh)e0%ZRg$FQ!e(3A< z@x~pRc2Ha}?yrUw0n&hbat)!*sIF?O$V@rnZuL+D28!he3FH-_^DmhDKDrgZZ7&`? zN=_K9iE}D%wD-)Wk(+K?4*MqMG$fpgT~%CDNKeMd=iGQ;Gn_YE*6TlZ;N~`GCTd$r zQu$fR+fZX(G~w3Vms+<$>vp1i?6EKpmm-vsU)c2$&TQU9Ot6aoO8o#g>Ix&HJP@V}vT9w0~7;wiDWO#Jfzkb0)N71~a5 F{{h}UoXP+I literal 0 HcmV?d00001 diff --git a/tests/display/text.spec.ts-snapshots/text-no-wrap-light-chromium-linux.png b/tests/display/text.spec.ts-snapshots/text-no-wrap-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..bb017cffa39394041e3881fe06072bdb753e6119 GIT binary patch literal 2374 zcmZ{mc{~%01IC5C!_*wna?CYea&E3hdEMsBjFDS8Q{aO z0XcIvHoy_m*Z_SyZzEqnWWqwCTU$H#p&~kJ!88t2sPVV;qQ*Nu;(2M0oeNVzh%LZ5XQqx=~ljpfKMOrPY3k@+;XAc=g1zD!W@Kk#{8_5>`mXj;!Hc;*#Puf+r6YQcA@!X)V z+h?urcHp}`**UfJxCA9@=hUCF-Q#=kmJ{&b(*Z|%HLJ)F|23dq9 zh!1gf7hEat|)5DPexwqk3RWjvYqQc!YDmnSt|BiRW{=(^m z=UA7$N!V5(*Ld#)`^s1FQT%aWstLJyx#1`=re(}Ll$WtD z`B0M{y_4HB)o!K_LM4`6($Q(WMG_kM2&6N!^8TimGd|Qs(|vM0FoREeWNCFnRD_P- z+G7)Jt^3*HpD|mT&ckUU?b(WJCR&uNa0{boc)OBu8)-qfjt zeO#-gAHy*>u1PsK>h6OhuDZZI56?}*TJXp)y;v0onSjh<<>EBclczo~M4%^)#~NlH z4J#2w?L~Kym{%FJ=rkdZADgXLn8OF@6&4(@ON0wa4B*y8RMk zb+)_^P@|%`!o`^^=H$e_J44lOP_aad*jf}WTG6jkpnG_@Q|{`dx`Le?>PGi9Df3mM zAK^xSioFaLlBG3Uf+89SC3zg%}*-~25`FX4%$j^H=Vt@9{7pR#skyb zFkGsMN%HZ(5ueKArRKOYu1$ZrR(gGcz%|^`KfxnKR_)SunXA9ZDD0sx?Veu8b=;;J zt&D+HMt;?1O``{mt$icboBTv6%8S@YUT)Ml(@s}HL1FN)e6Q@r33ftfB29`Ix)JcL z?ZEk>JjdPfU)llh#n0y?0QhkZ!J^(mY~Fa=_VIq8jg#cS*2uMfAu`5IRn1VxA;#~s729X-Jx>q1K20Qb{Y^;WdoW<{3}0)UqJA6^%}lQ zz%1~|Jj|=t(d@e(tIS=qwRTm`Fensy>4&S4UzaH=tu&i@B>hGj3Z>7m#62{>$%NZX zuZ)Ae^RR7OdNpUWo|b&j84Qdm5%@AiRojr6KR@h&>Nq%eY#*&?OwgjJAiiz63;>Nm zZ3p9c?1%&J(9BGH-Bx@ov+cShO)R}iHi4FD3VQ_|xCue@ar9j-QRz~RV&p&dN}RhD zieCcX-TVE;G~nCi7RirENu|x-EFTp`9MQ%=?*!Fl4fs1Ya<%ThdMq?G@Y^m~)$gZf zsTpVy^Y}u}Fd$tqwWL^2W5SGUy&;@*ru~6|(WY2&^-DqiH%FPnQ4%#ocL7s=kAw>u zmLQriw&o4lwxGj_D$9uA`sqCd_Ck7AAc-GM-He}2&o36L%V`**I(G8skUhqLlBR5+ z2_mzqFFB?Ag1rL}CWbAJYkN=-J&3hphScw&63T~4SJk2dXnvUw!j{C5+N;w=5~<`{ z&ve~NSYKhMj?QPEDtbO1|KJuGsvTJ0FH*n0(EHYX_v6MzWUgRO@jG@13f+2jT{wT% z=>WQabyJeHzVuj249erMvV5weAU zkPS)u_ID4<+xQ( z&;}8$U9h--NT!UewXTJ|Z>LCb-q5S3&xW-GY++q^iTMl99mo=RLQU9lVV~XW4#JhF zx>585WZyE;G*S(eZ55+zW8RdJ8b(zfqxAKyksZh2yh*MEj?KVUxJ+tWfs2d}yl$DA zf>Nz{B7`#Utft(BC~|*b+!HXVUea3s$JLS|gXgux74Qoan((9WaAy=EmfdjvTW{WF ziEAchH5w5Xvw0En!0xj~f#HQ}KdKG8*Qrr@(8L%7t*hCuz|UeUZh~_TN_*8w9Y0G= zbgilOi+uh2Z{%>s=MgZYOSET&gj)&JAK8E7jz03Nr4+y03%Q>d<8@H#_QL0xM3Qt$ z5Yg=Otj?MK&BvScpydit1~{&sLh?k;);Dc!yx2w;8wIXCTspk9nUz{ns z*c&_R9w&6{2p8-GQmcZ-ej}K?oU$zxH!TW--W7{s(hk3GD%r-m6inbqzBK{ji!m|cpTwZ2<9a!xeG=bJ0wc=~jD& Date: Wed, 24 Jun 2026 10:11:37 -0400 Subject: [PATCH 4/5] chore: add changeset for Text noWrap prop Co-authored-by: Cursor --- .changeset/feat-text-no-wrap.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/feat-text-no-wrap.md diff --git a/.changeset/feat-text-no-wrap.md b/.changeset/feat-text-no-wrap.md new file mode 100644 index 000000000..9e7f35a0f --- /dev/null +++ b/.changeset/feat-text-no-wrap.md @@ -0,0 +1,5 @@ +--- +'@clickhouse/click-ui': patch +--- + +Add noWrap prop to Text to control white-space wrapping From af4531dff62f8f0322d47b1edcb436a3682bed9c Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Wed, 24 Jun 2026 12:08:43 -0400 Subject: [PATCH 5/5] Removing tests --- src/components/Text/Text.stories.tsx | 9 ++++++++- src/components/Text/Text.test.tsx | 14 -------------- .../text-no-wrap-dark-chromium-linux.png | Bin 2472 -> 1695 bytes .../text-no-wrap-light-chromium-linux.png | Bin 2374 -> 1650 bytes 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/components/Text/Text.stories.tsx b/src/components/Text/Text.stories.tsx index eebdf4c7c..abca65f4d 100644 --- a/src/components/Text/Text.stories.tsx +++ b/src/components/Text/Text.stories.tsx @@ -118,5 +118,12 @@ export const FillWidth: Story = { }; export const NoWrap: Story = { - render: () => {sample}, + render: () => ( +
+ {sample} +
+ ), }; diff --git a/src/components/Text/Text.test.tsx b/src/components/Text/Text.test.tsx index 3029bd6bb..41510743c 100644 --- a/src/components/Text/Text.test.tsx +++ b/src/components/Text/Text.test.tsx @@ -15,18 +15,4 @@ describe('Text', () => { expect(rendered.getAllByTestId('test-testid').length).toEqual(1); }); - - test('given noWrap, should apply nowrap styling', () => { - const text = 'text to render'; - const rendered = renderCUI({text}); - - expect(rendered.getByText(text).className).toMatch(/text_no-wrap/); - }); - - test('given noWrap false, should apply normal white-space styling', () => { - const text = 'text to render'; - const rendered = renderCUI({text}); - - expect(rendered.getByText(text).className).toMatch(/text_wrap/); - }); }); diff --git a/tests/display/text.spec.ts-snapshots/text-no-wrap-dark-chromium-linux.png b/tests/display/text.spec.ts-snapshots/text-no-wrap-dark-chromium-linux.png index 39a0e7f1ce17e98ba57053305c44b73f9642a5d0..321fe0820ddbaa600851d5e65fab5881ed6679ff 100644 GIT binary patch literal 1695 zcmV;Q24MM#P)cul+pDyZNZxdyh`>=qZU5G)qAfo;GBY=B0X*#R13qimt< z&1ft%7H2HZP@JJqD0ZP(Nh7IDWwzm6bq`qotPmFUMl(104C7#4@_WC$@B4kLiiY1Imv4k-xmM|v862_!h!k83G7?WZNV^S<(Oo}CpN%@vA zgpExui$|Z-)~D+JYKC=?5ZoJ(dcJaSxE7%M`-HaXwSz-G?D*mQobNBboHr5R-oe9_ z`?Gp{qV6xaNpKe)4{3vxH?^`Dq||-k-G*{D>0y}sy4y7unBP$mcvz68HX02=)exYr zHT`qhbk9J_6HYKhy_iUd<*Ekmg0V1=^hA>^S&qJV!z?s3jx6g)Zg4|b#_>$S_No^;S$ns5+$t-6WdemhOQoiJJ%7?ur9ZeTy;7V`{tPNg7 zc6g{pVaDg1%9NWXB#k7XUgt|fMM0JMfV>2? zuSOUe$JD_nT#f)X3Byo|WV|cWTY5*FYYM8=AIbgJrKF2$V-4d`T?BqZpmXS6O0wSl@cr1RrQtyWb)PL7XOGB^_osMWf5(W9&& z%1(dTSR(x*8JriwH%maImP>->T-cI!w^njd?6kUmlbGM+$_NY#r7MONqpM0&C+r@Y zC~G=FGXa)t@}&ylag#`?w+7c~_vaWM%;rY6Af8^Hq$`cjVCq_qSebe_%(&?m>7(@u zCy!DFH(?Cmd4&dNX#i5i^h_E!6J?!d;}I7D zbghYOkxVWXj|XTZ3l*#~LfGiwQ;O(CBFM?!H`J=D2!hj!xVP8&R8%mAPPGArj?@aS z89T%HeUv5%2K&pWwEKKMLduCJnbtfVZAaM21W<1K`D`X=Ck?fxGHf3W35uqmTIRE_ zeZTs-DzJIJdUU%@%v+^ryv86+Dx`V)Vq|5@CSU`U>mU&fg4T8{FLte^TYCOLGNBeF zL@}Y~lVf@nA8u@NBAZX;Qsca=Lnj*zxwK-imhZ0zyvPYPn4D&S#%F2k0{=IyCCo8f}()^2I1N_Nc( zX=3(G3g$8yZWeS_yN&s|d`0hj5bT~R3o`Qgv`w*LaBB#!Jtf@}&gMgBO<731&I_H@ zcqH%WWHNV=NxLbgBJ;x^!1UTuJWXcfsnUy1>P_igs!-PM7V~!LJ-W$zWzZH_F2xCc zb|zD~#S|F?-u`dr?7|G2t^G$4|0g_pxEKBi+U0WkLJ0LiiY1Imv4k-xmM|v862_!h!k83G7?WZNV^aPF p00960%fy7y00006NklWgO@=C(wnC2}rueidTw zJ9m%J$ZcO&czXVW=lSLHdcQuuzhAF+qM4}y7f28U006jX*~=2Eym%~ zs<9}r?x7(%STMVJTH881kLSyac>1b~gA=$2j@EHf}Q7M_M%5K)8<hlf~AwdrjzlD{bk^z)#K9XWh5L#hlv{${{9XbW;R{D7&5bIgu@rlZ}B?ktEQvX>`1I6{izIDazgBl5PfY+GypiW6+;K4$j*?&2}C zq)YCbw?Ly3wYz;Ti^7SxB`SY|ZS}|)kCL}t2+9V6cg!$HRYH+(qwkP*Md&<| zS=)2G6D!lm^Mc+*noAWVJV=P5EykO(xb8&VcMX<01(tq_5swgH) zGA2m_74Bin@969?;1X+P@hh$h{R)}b_5vCC1RFowYJ?#ovw)yoqerCBd)ZP^L$SK< zovuEm?U2`WCj2fXxpG0qO;A0t^)yWBnix$6J};&@B&Irj>1QtseVBXcDrD8)MA{}r zy!=SxemLQk#tdt?!LXy4+q*OnkkRyzYJyUDq;nMd$a_6ZvWg=fmB9=&lkIr(IswSu zx%l+>1fLi?ncGiQp3E6y9K;ytS68+7xLmrfV9q-hyv3;Xs4b9eAG`g0Pm+Uugpl>= zrcWMhRk-b&56+C@&fJ-)@tGBrm5H;MF?Xd4}q!+N{b)F|2zK83xmdywegcb79O2?(o zc1k183k8c!W~Vs4oC*O-`Bkl}-ud#%4d8cT0Mm(1O0c`w^^x7EtSNOBj02cWRHe!K zIhG*o-Yo59y>8{!;;HlyzRiX_&VDkVU-{u9c<=>`Pb}qyxv{iU{FWKw1zwM0ivy^X zo5f&RAOdLUD(!TRWSXMmU>+Ek%ilP4ok$)eRJ`rRL0UMB)-=EUbe~b#eMLkBWYKL9s+DC+9o$}wXukS(8WwPPN z_2LuNY3hE$4JHoWxy5WIN|v7`1@7{^$<6R5a{6Bx9nFktnmW{s%dc%nwSz(i<`OKsJHp=kKNyJXOTiv-&*Jy4laW6+U~0W;btx=rb0(kF8^amOk(PY-VY^@p-6 z?>E+#t;k+HxrnK~`I`tWC8!w=Y!S@6$3=pxr-~6aGDqWj7Y$y4(|oT1=X0)IKi zz*!DcY^8Ke!X#6IQexHc1#H1-r^f{%)BU9K*RWzI?kcO`?ET(q;Lce2d=798Jii0hc?l7`Seo5g_iW6Mehh)e0%ZRg$FQ!e(3A< z@x~pRc2Ha}?yrUw0n&hbat)!*sIF?O$V@rnZuL+D28!he3FH-_^DmhDKDrgZZ7&`? zN=_K9iE}D%wD-)Wk(+K?4*MqMG$fpgT~%CDNKeMd=iGQ;Gn_YE*6TlZ;N~`GCTd$r zQu$fR+fZX(G~w3Vms+<$>vp1i?6EKpmm-vsU)c2$&TQU9Ot6aoO8o#g>Ix&HJP@V}vT9w0~7;wiDWO#Jfzkb0)N71~a5 F{{h}UoXP+I diff --git a/tests/display/text.spec.ts-snapshots/text-no-wrap-light-chromium-linux.png b/tests/display/text.spec.ts-snapshots/text-no-wrap-light-chromium-linux.png index bb017cffa39394041e3881fe06072bdb753e6119..908e4d59b5ca6dbc01f5ba3598778cd14472bac8 100644 GIT binary patch literal 1650 zcmV-&295cNP)CiXK|Gk`u1FpVUIG~m9t!SYSPU5q z9UMF~uo#vG4?TJ4p`}(Qm|#Ln?s*cEG^GNE_#a?wUt`@>pJR~UlYaMmzwht&dk>?T zPoF*k8|(26u(2ezFc!rY#-iB5SQJ|ri((67QEXu>iY<&qv4ycHwlEgO7RI93!dR5+ zgwfme+`6BA^bkIJ%89uTZ4G=yuoPt%#45fzqjzhf_gUy&TmN#;@ZxL=e06lSo>+cL z&&_+&%H1M0Q5YvxecB^*%!a}CnOB+ACjUG<3=uuyvfvm4VLriGDeBL z_eH@?fx9p>eoAZPk|oR)j&?XW7zl<0Def0GGd?EcgW!IlkdQC*FYx%Oua1tfL3>w& zoab(;fJqgDm5QV~Lt*bZ2_PE|G5Dyg^rLa9&vYw6^eoXB6tLDTr(SaC(L?&NFO;k{ z2ZMwAL#cF#eKe1LD*U?4u<^#Q-t}%JgiLGdRYx?n7UQ3}=zcFvSBJfHe3!d0rM0Um z(ez~Axxj^z<)(K2o=`3?a*yZXw+y#lIvyHs6h&^q1?OC7Nlev8G{liMH95h~EkqC1 z)^E$MIYy}AF^&x*AlC6X_w;W0#aLl18HtfeL3iEQs? z1P0gEL-G2ln}&K=J|ek|Lg9`7#~)mpT>IRKbu8Bv@Pzl!myH?fQ99qGS5vudfjKEh zSCSv5Z>3mDzlzs-D6(D1{Okco$xyu79lCB{x!Pf42gk?nW6owKmhESWCTC(>3S7-e zf0Yvmm*dHrs!wB+V$<@+zjKSUJABao*evp+Tgq7kUbAqVdn82O@vTfVbU;9oxHRmb zDKm_QG4?sVYgQDDmUabKUsJ!&P4I8Z4VCi%K+Lkj?v6N^&;ie6i*-fw`6&HFt|}C} zgGQ}pmQR)PgLQJqftS)1xx2*AgX__|a!CSwW+y#pyqu2#{LB5i%AGnu5KJ%}@R`@H zKr~Pb9=257198uQC=lQn2$uLso-qjG@h(7o6FQSQ} z)FlY=MmDeIECQ2Ek@U=X11>j#6uM~@$YsLIx z?w}AnR}HtZc?jUm2j3>y=uE_VLU}T@2h&+MgxWPnvQYK$l~>gK*yy z(2+aCgwRx_snLwnG3g;4cd;>#IB~n$_%p?VmelIq)#h#7n{ZqS#1S0t|poPTPb3c|g#Ykt>?=%{3(-P?`c&FK5z!y&vaXPk&D5F)*mI0RwG81Ig zoBJZ4)%~e-ge8=k)b0@sB<^POcJ9qgdK9vW>K~~1wpiL)%lG=*B|%V5dYG_~P42ul zl0|Xl#NiG^1s2x^$QbKUaiyPYvurrG6JSU%>M&*Qvn*AqP=asV(g@loglB8n zwP24%-e7JovNZiys8dhGQ%@Z3)$QUhlfQtG%<6VVjV9KYN`2R#@EhAvmb#nG+qw7P zChwK$-Rk;_bT3re6K<0tqcD&Eyx0mJyr1$^^S|N2{k`y~i;HV^M5jEQ&3R wMX`mkDE|Tg0RR7*!7}pz000I_L_t&o0N1D|>o=Eg0{{R307*qoM6N<$f{JM%J^%m! literal 2374 zcmZ{mc{~%01IC5C!_*wna?CYea&E3hdEMsBjFDS8Q{aO z0XcIvHoy_m*Z_SyZzEqnWWqwCTU$H#p&~kJ!88t2sPVV;qQ*Nu;(2M0oeNVzh%LZ5XQqx=~ljpfKMOrPY3k@+;XAc=g1zD!W@Kk#{8_5>`mXj;!Hc;*#Puf+r6YQcA@!X)V z+h?urcHp}`**UfJxCA9@=hUCF-Q#=kmJ{&b(*Z|%HLJ)F|23dq9 zh!1gf7hEat|)5DPexwqk3RWjvYqQc!YDmnSt|BiRW{=(^m z=UA7$N!V5(*Ld#)`^s1FQT%aWstLJyx#1`=re(}Ll$WtD z`B0M{y_4HB)o!K_LM4`6($Q(WMG_kM2&6N!^8TimGd|Qs(|vM0FoREeWNCFnRD_P- z+G7)Jt^3*HpD|mT&ckUU?b(WJCR&uNa0{boc)OBu8)-qfjt zeO#-gAHy*>u1PsK>h6OhuDZZI56?}*TJXp)y;v0onSjh<<>EBclczo~M4%^)#~NlH z4J#2w?L~Kym{%FJ=rkdZADgXLn8OF@6&4(@ON0wa4B*y8RMk zb+)_^P@|%`!o`^^=H$e_J44lOP_aad*jf}WTG6jkpnG_@Q|{`dx`Le?>PGi9Df3mM zAK^xSioFaLlBG3Uf+89SC3zg%}*-~25`FX4%$j^H=Vt@9{7pR#skyb zFkGsMN%HZ(5ueKArRKOYu1$ZrR(gGcz%|^`KfxnKR_)SunXA9ZDD0sx?Veu8b=;;J zt&D+HMt;?1O``{mt$icboBTv6%8S@YUT)Ml(@s}HL1FN)e6Q@r33ftfB29`Ix)JcL z?ZEk>JjdPfU)llh#n0y?0QhkZ!J^(mY~Fa=_VIq8jg#cS*2uMfAu`5IRn1VxA;#~s729X-Jx>q1K20Qb{Y^;WdoW<{3}0)UqJA6^%}lQ zz%1~|Jj|=t(d@e(tIS=qwRTm`Fensy>4&S4UzaH=tu&i@B>hGj3Z>7m#62{>$%NZX zuZ)Ae^RR7OdNpUWo|b&j84Qdm5%@AiRojr6KR@h&>Nq%eY#*&?OwgjJAiiz63;>Nm zZ3p9c?1%&J(9BGH-Bx@ov+cShO)R}iHi4FD3VQ_|xCue@ar9j-QRz~RV&p&dN}RhD zieCcX-TVE;G~nCi7RirENu|x-EFTp`9MQ%=?*!Fl4fs1Ya<%ThdMq?G@Y^m~)$gZf zsTpVy^Y}u}Fd$tqwWL^2W5SGUy&;@*ru~6|(WY2&^-DqiH%FPnQ4%#ocL7s=kAw>u zmLQriw&o4lwxGj_D$9uA`sqCd_Ck7AAc-GM-He}2&o36L%V`**I(G8skUhqLlBR5+ z2_mzqFFB?Ag1rL}CWbAJYkN=-J&3hphScw&63T~4SJk2dXnvUw!j{C5+N;w=5~<`{ z&ve~NSYKhMj?QPEDtbO1|KJuGsvTJ0FH*n0(EHYX_v6MzWUgRO@jG@13f+2jT{wT% z=>WQabyJeHzVuj249erMvV5weAU zkPS)u_ID4<+xQ( z&;}8$U9h--NT!UewXTJ|Z>LCb-q5S3&xW-GY++q^iTMl99mo=RLQU9lVV~XW4#JhF zx>585WZyE;G*S(eZ55+zW8RdJ8b(zfqxAKyksZh2yh*MEj?KVUxJ+tWfs2d}yl$DA zf>Nz{B7`#Utft(BC~|*b+!HXVUea3s$JLS|gXgux74Qoan((9WaAy=EmfdjvTW{WF ziEAchH5w5Xvw0En!0xj~f#HQ}KdKG8*Qrr@(8L%7t*hCuz|UeUZh~_TN_*8w9Y0G= zbgilOi+uh2Z{%>s=MgZYOSET&gj)&JAK8E7jz03Nr4+y03%Q>d<8@H#_QL0xM3Qt$ z5Yg=Otj?MK&BvScpydit1~{&sLh?k;);Dc!yx2w;8wIXCTspk9nUz{ns z*c&_R9w&6{2p8-GQmcZ-ej}K?oU$zxH!TW--W7{s(hk3GD%r-m6inbqzBK{ji!m|cpTwZ2<9a!xeG=bJ0wc=~jD&