From eccd63b793a088a690f4f4b9312e20e33e4fac28 Mon Sep 17 00:00:00 2001 From: Erin Donehoo <105813956+edonehoo@users.noreply.github.com> Date: Mon, 23 Mar 2026 11:23:16 -0400 Subject: [PATCH 01/29] docs(theming): Adds details around new unified theme. --- .../styles/theming/theming.md | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/documentation-site/patternfly-docs/content/foundations-and-styles/styles/theming/theming.md b/packages/documentation-site/patternfly-docs/content/foundations-and-styles/styles/theming/theming.md index 8baa660e31..7aae718ef6 100644 --- a/packages/documentation-site/patternfly-docs/content/foundations-and-styles/styles/theming/theming.md +++ b/packages/documentation-site/patternfly-docs/content/foundations-and-styles/styles/theming/theming.md @@ -14,7 +14,35 @@ Theming is supported in PatternFly through [our design token system](/foundation ## PatternFly themes -The following themes are currently supported across PatternFly components and are designed to meet specific [WCAG accessibility standards](https://www.w3.org/WAI/standards-guidelines/wcag/). You can explore our different themes on our website by toggling your display preferences in our site's masthead dropdown. +PatternFly supports **light**, **dark**, and **high contrast** display modes across components. Those modes are designed to meet specific [WCAG accessibility standards](https://www.w3.org/WAI/standards-guidelines/wcag/). You can explore them on this site by toggling display preferences in the masthead. + +You can also choose between two **theme families**—**default** and **unified**—that layer on top of light, dark, and high contrast. Both families receive the same foundational token and interaction updates described below; the unified theme adds RHDS-aligned styling and enables glass contrast mode by default. + +### Default and unified theme families + +- **Default** — The standard PatternFly theme used by most products today. +- **Unified** — A theme aligned with the [Red Hat Design System (RHDS)](https://ux.redhat.com/) for closer visual consistency with other Red Hat experiences. For RHDS release information, roadmap, and design guidance, see the resources published on [ux.redhat.com](https://ux.redhat.com/) *(update this link to a specific release-notes or changelog page when available)*. + +#### Updates in both default and unified themes + +The following changes apply in **both** the default PatternFly theme and the unified theme (across light, dark, and high contrast modes where applicable): + +- **Control borders** — A new **control border** token improves non-text contrast and makes control boundaries easier to perceive for accessibility. +- **Cards** — Cards use **subtle borders and shadows** to define surfaces without heavy chrome. +- **Navigation** — Selected navigation items show an **accent mark** so the current location is clearer. +- **Expand and collapse** — **Expand/collapse** interactions use an updated **up/down** affordance for a more consistent vertical pattern. + +### Unified theme + +The unified theme is optional: opt in when your product should align with RHDS visuals and token choices. It supports the same **light**, **dark**, and **high contrast** modes as the default theme. + +**Glass contrast mode** is enabled **by default** in the unified theme. Glass adjusts surfaces, layering, and contrast for a distinct glass-like treatment. For implementation details, see [Glass contrast mode](#glass-contrast-mode). + +### Glass contrast mode + +**Glass contrast mode** is a visual mode that works alongside light, dark, and high contrast. The **unified** theme turns it on by default; you can also adopt glass in the **default** theme when your design system allows it. + +Use glass when you want the updated page treatments that depend on it (for example, background imagery, banded mastheads, and floating side navigation in traditional layouts). A dedicated glass / unified theming handbook will be linked here when it is available. ### Light mode From aad3e2087885ee7a30d0744d1daf5915581ba0ae Mon Sep 17 00:00:00 2001 From: Erin Donehoo <105813956+edonehoo@users.noreply.github.com> Date: Tue, 24 Mar 2026 12:45:08 -0400 Subject: [PATCH 02/29] docs(theming): Add new theming details. --- .../styles/theming/theming.md | 97 +++++++++++-------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/packages/documentation-site/patternfly-docs/content/foundations-and-styles/styles/theming/theming.md b/packages/documentation-site/patternfly-docs/content/foundations-and-styles/styles/theming/theming.md index 7aae718ef6..5ae7f27d7d 100644 --- a/packages/documentation-site/patternfly-docs/content/foundations-and-styles/styles/theming/theming.md +++ b/packages/documentation-site/patternfly-docs/content/foundations-and-styles/styles/theming/theming.md @@ -8,45 +8,48 @@ import '../../../components/components.css' import { Alert, AlertActionLink} from '@patternfly/react-core'; import ExternalLinkAltIcon from '@patternfly/react-icons/dist/esm/icons/external-link-alt-icon'; -A **theme** applies a specific visual style to all UI components in order to create a unique, cohesive, and purposeful look. The use of theming can provide more flexibility for user preferences, as well as different options for accessibility needs. +A **theme** applies specific visual styles to UI components to create a unique, cohesive, and purposeful look. Our theming architecture leverages [our design token system](/foundations-and-styles/design-tokens/overview) to flexibly support different brand identities, user preferences, and accessibility needs. -Theming is supported in PatternFly through [our design token system](/foundations-and-styles/design-tokens/overview), which was intentionally structured so that sets of tokens can be adjusted together to create alternate UI styles. By reassigning token values, the fonts, spacing, shadows, and borders in a UI can be changed together to create a theme. This system has enabled us to create multiple PatternFly themes, while also supporting the ability for you to create custom themes. +## Theming architecture -## PatternFly themes +We utilize a tiered theming architecture to consistently manage the appearance of UIs: +- **Theme:** Defines the foundational brand appearance, including core colors, border radii, iconography, and assets. +- **Color scheme:** Controls the brightness and palette shifts between light and dark environments. +- **Contrast mode:** Adjusts the style of surfaces and elements for specific aesthetic or accessibility needs. -PatternFly supports **light**, **dark**, and **high contrast** display modes across components. Those modes are designed to meet specific [WCAG accessibility standards](https://www.w3.org/WAI/standards-guidelines/wcag/). You can explore them on this site by toggling display preferences in the masthead. +## Themes -You can also choose between two **theme families**—**default** and **unified**—that layer on top of light, dark, and high contrast. Both families receive the same foundational token and interaction updates described below; the unified theme adds RHDS-aligned styling and enables glass contrast mode by default. +We support 2 pre-built themes in PatternFly. While the visual identity of each theme differs, they share the same underlying interaction patterns and accessibility standards. -### Default and unified theme families +### Default theme -- **Default** — The standard PatternFly theme used by most products today. -- **Unified** — A theme aligned with the [Red Hat Design System (RHDS)](https://ux.redhat.com/) for closer visual consistency with other Red Hat experiences. For RHDS release information, roadmap, and design guidance, see the resources published on [ux.redhat.com](https://ux.redhat.com/) *(update this link to a specific release-notes or changelog page when available)*. +The Default theme creates the standard, open source PatternFly experience. It is characterized by blue branding, modern, square borders, and simple icons. -#### Updates in both default and unified themes +### Unified theme -The following changes apply in **both** the default PatternFly theme and the unified theme (across light, dark, and high contrast modes where applicable): +The Unified theme is designed for products within the Red Hat portfolio, providing closer alignment with the [Red Hat Design System](https://ux.redhat.com/). It is characterized by red accent colors, smooth, rounded borderds, Red Hat icons, and glass contrast mode. Core interactive elements, such as primary buttons, continue to use blue for usability. -- **Control borders** — A new **control border** token improves non-text contrast and makes control boundaries easier to perceive for accessibility. -- **Cards** — Cards use **subtle borders and shadows** to define surfaces without heavy chrome. -- **Navigation** — Selected navigation items show an **accent mark** so the current location is clearer. -- **Expand and collapse** — **Expand/collapse** interactions use an updated **up/down** affordance for a more consistent vertical pattern. +For implementation guidance, refer to the Unified theme handbook. -### Unified theme +For a detailed look at the design philosophy and research behind the Unified theme, check out our Medium article: Title. -The unified theme is optional: opt in when your product should align with RHDS visuals and token choices. It supports the same **light**, **dark**, and **high contrast** modes as the default theme. +### Custom themes -**Glass contrast mode** is enabled **by default** in the unified theme. Glass adjusts surfaces, layering, and contrast for a distinct glass-like treatment. For implementation details, see [Glass contrast mode](#glass-contrast-mode). +To branch off of our themes and create your own, you can identify the design tokens you'd like to adjust on our [all tokens page](/foundations-and-styles/design-tokens/all-design-tokens) and provide new values to use within your application. -### Glass contrast mode +#### When to customize a theme -**Glass contrast mode** is a visual mode that works alongside light, dark, and high contrast. The **unified** theme turns it on by default; you can also adopt glass in the **default** theme when your design system allows it. +There are a couple of instances when you might want to adjust an existing PatternFly theme: +- One-off adjustments, like changing a single button color, spacer, or font size, when intentional deviation is needed across your product. +- Application-wide adjustments, like changing all button colors and font sizes to adjust the overall brand identity of your product. -Use glass when you want the updated page treatments that depend on it (for example, background imagery, banded mastheads, and floating side navigation in traditional layouts). A dedicated glass / unified theming handbook will be linked here when it is available. +## Color schemes ### Light mode -Generally, light mode is the default appearance of PatternFly. In this mode, dark text is presented on light backgrounds to meet a [text contrast ratio of at least 4.5:1](https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#contrast-minimum), while colors for other UI elements meet a [non-text contrast ratio of at least 3:1](https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#non-text-contrast). Some users might find it easier to read text on light screens, while others might simply prefer the appearance. +Light mode is the standard appearance for most web environments. + +Light mode places dark text on light backgrounds, while maintaining a [text contrast ratio of at least 4.5:1](https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#contrast-minimum) and a [non-text contrast ratio of at least 3:1](https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#non-text-contrast). Some users might find light screens easier to read, while others might simply prefer the appearance.
High contrast mode is still under development and will continue to evolve and be enabled for charts and extensions. This beta allows you to preview our progress.
-Gn0%0~sUm2rQ~{xsG)p$74*IFHS}MX*Z-QAf6eKO29R9{Dy-Mmf$Q0f) zZCDN*pRsLRdzrDg8?4E;s(!y39u9O5-9^*zq$1mbHkk{`<)3V&_BxL;=Yec#p6KQ$ za=zRuCo~GaF2ka)y`$B@Lo3m()RC5;zNmM2t|d3`)Mvfkp5&3|6Cj5l-96#<6(O8~ z!(seyCDs`UUe>+gubL-V;vH&pio>x9avy+iZ11%h?wReVg{1SFiXf`-+q8)p#bwZHR-=x#}qxQD$7QshPAtrR*CV zb6?OeRS{37W K3yhiK&wFpbo1yMJmX7lA zRDTKgpY;m#n5tS_nMOMq@;d&)rGG}%Quh`CEn5aVjESdYEM2|1)a0Zd>;gB)*{-E5 z39xPD= v>hvH_tRqxfKFK*5Xg&EFrKzNc+7x|!Tzh;w>{i5#O%&H|##m|m zVJoUsw?&-HDr)I Rw?-BtPXD-|ql7Eb15Iaa*+ymr3@t 7F*DD!A%o5gk~t{! zMY%{I8>uPcCDKR6N`v}iUfb2zhd@q;h*$&xArUofILp4Jy$!STOOt;OsnP4NYma%4 zrN>pP$6j9swe)wsD}U!wDB{9_BtQJ*Gb%OQ4H0< z7eBRS$VG0#g>6<$nNCsTw8U0{`g?MfdGq^E>kD-!V^(g82XBfOht26JPLSCj%CQif z@aXaS%W)UzVdSpZ&SBwiW~-~;*tvc&RNjYeyVfhzh5D#52Cc0JL25RWZSsmfrM Bwri(+UE%nkLbcLe7sQbb}ws&ZZHuYEY$ZAvZq zkT5YgjoD`__&f6gD5b%r*W7K3kMst@5*TTlaDxhu-iq#b{%R*Io90$;u62WRfNGE6 zy^+I!R6HmT&t#~JQh5j`M=#?A8h@UFLPgUkd{k4MGu7>4v(3U8`tgLU4g!L}H;Mm- zy%wItEd~leXVjCj&cC!S%R%?}i=4(IoQepk
6_cJuAATQFejqFrRFFaOo;q zejv*^(N~OtO>&e(X ~&$;DzFEjmmsJgGYorVhV7jN 4T3KhxoVA6VxWcy>B8M|WUEDXK4Ky} z$4AkV<$?(ui!no~npV7??Yv%db6T#$>VI`a>i?|x*N|u^OAHuqPMLK4MzNlg7Jve) zOnYsthozhKD?J2NX6tiB<4q&}<%t9p@gbc(+jUbe)yTC!L$sO(Z;dwYW?l;|S0(2Z zbnHQLLi)`S3kiW`pheJZy+9+@WL4ioWNA0QZeaqrN;mRD+0*a514PSFY7080I&@~* zbLlEkbO+j#m%lCdlMGlxuYRjNCV;25C5q@d9K8JKsB7<92VJM_` E zNy9fPauq61wLu^2& )7sZc`9kjR8<@^sP3eSM8N3>4Y( Ka9{&a*HQShei`}lw|0C`ZkgR4um7}NwAkl-9&1( zdhLU@@rRTp5+;v=O*ipI87fqvNux>LEMoKTCCctv)o OQ8n8PeDchq|yiMd@Ysk z@TrNUw?a{}>#ZGzNDt*rIe`F5dX^k>`2#%JETyDeT<9fc(d4JdF?pO6bTN8fKZ`z7 z8?N@rNqc)f(LMvqQ|eOxq5!;xFy!GL(KW1$qUZuwzUg!oKTuk4oeGcIT5fmOcxW5* z?EtVT0KOu<4g&zD(H$v4|LfC@-QC^$yDQRboX7RvU_ep>dGvR7cGlL`hK7a))A#?6 zr%Fp}2FOftufm(Tfe|3c!Is5u7vRB~nx{-iUo|y1@45eP&zqZ@?6H6iH#Vkr*5vvV zc;l}6Yd1GHTPp_#m4ErW56h&6*Cub*y34L*$0jBw#>N;=)67qz9|NDZYB&8rpTpY^ z*biq@wng&!=J$0dgMw7%MOh`)>}Mf~`hk*La+Q|tK~BMS`ehCa*)}yJU=C7F0_xHf zCH(y*P}Y3bJ4^Y&LlS(QjjvMsCPk|RL(m_+MZB)kzH{ VbtAvQeTI7VsW zAq~5b0V}y2Dvwlp`tHANE }Eo1-I}=xKs_*? 1r*uNihbHHdg34s1U5!7N{ z7|_$xH-A_&HZWkVxBKux i}ge?Fo#$gk6KY73Iak`G_ z^P2RjFheY``TG9nXZVWd@7+Cnk{w_kI5`~w#F40|=;-LE`^hT6Glo_=5fPDu{{jq5 z;59tg3ON?(?(>n65ddo3-e!*&9UmW$p?_DmcnEOKzkmM*zIStX--|mv-RK82D^d63 z!#md9Mf!K|uYJ0JN(Np7iWzVv0GPS8Rai_+)t|w+I3pticnL5#oXY?&1StEJZhy&a zb-)R!uC6A1`ZVEa>VLwgwT%twxx@SS@7+)+Hi`(q)d2Q*ae=Dq1cVRZ-E|Ec8yl&q zsep>*`)H0fA$xpcK$BkAsrxIa$vEaN6<(|J&zVGh+~`M?#Th=ej-Zvy!@zAk2%|kX zvNXlEH!q2{@OR!mjdYX7 j{D<~%BWW80~rX8b3 z0pG-v55Il?GDUf~w>+KUWp7XqNJLjY OL@8jLI;C*SSJ#@x>Ki;X7WK}Ox9xXTAS_4^;LCw@!PjaC|CSZiW z88)sKc8f0MYG*&m*T_A=;p$DB0gHcYyOeFTIju#{5?yL8RO1^F2&K%5K;J!~4OaDe1=Y~W33FiTy!-y9F=x-`2Q8Rl0j}LuC<7jJJ3P^jE zl@}gjz;6Jw6_2Xo=*USlHZzkhcf$Q_Q@(p`ZGK)?OG^uZuxZraYuekhE1B_>>LtX+ z0;C(h&cE6$2|~WNuJZDsbN0RfOgfP*dIdo6tAO$c6wIejXGhJzdI+AWBh{`+Q7=)> zPaFmc(~^@)AE;*}^1pAt01y?x_&q#4EG;b^9l0Yc+}z%N9#dc;kGy1*tGT_s4eDLr z+%#uTqGez>JU9T{MPO|JbUy=0QmIw_B2dGwBI0k}fMOI%ii?kzTPdRk0i0K-4EFXj zV}HV!b#U)GARV8cegt@9lN;tB0Q;w>qgz^95)l;zaM{DFyU&@KyCzNL<$&u`T~{~l z_?9DS*!R&2-p%}g=jLKR?AAcS@4E2(q7y$=zX|s4&|o2!Rw}y=T&1(*Xe!Z2;Z}rC z{hmT@DND?4D TbFXvm8R3&m9+&mGq?8oRZy>+Q|>alnfq!>q) znTUn3qVU+``r}n~`?5_OaerHytdg$l&a_aUc_)rdm^xp}%Wv6xu2hV(E+IN0{Hn65 zJ|ya_DhfO5!v0z8MU#bOZ{iiPg!&NpgP$fo^+i|@+U=^Hmx}w@!dxq_CS-sEJ1Wh% zw*MpY0@Ms4G&j2jYl28&gHf)V+Bh5T{At>6PQNST*yBVA>%KR@Mv=E|BEv~Er^>#@ z@gT|4M1W_faHO ~RyPp(9>$881aBIE!G3ut Rg}<|7pWm@23{6gIvLrC~ zj#%;oZauK3_FUV5JplFX;!
is1bmAj}6h%d!;^OZHBh9Ni^SVKKs67k#x!0G< zcI`uSwmHJXHqY;eW<_IAwG-Eip%}t1x&@@|#`!6-(vG;WW}T9x>vbB5in0O$o83~{ z2`e&o>atDhEv_dn=Rv~xGDZi~9@T#ovwHqzu6gq?pO$Xt>2*0^p3DVYp(RPtC9{6G zk=vaGGU=&wd@$A*=h%cjd>(mfR0m%PddAybjE?I=h$i~AGT+z+A!qT3qL#NLkgf#) z<;~z`p7&cdT$#jNEA4C5ZfUQ(Av5x%P3)wtqvJ1OKf-m%wE3!z1sQ3SZ;Au%3yiGk z7Ng*d!}YiZBN_SlbDJ_X40uYM1Osml-UjOFD{^noR2)X2cy{9Wt(A@<_Bp`?6caMi zpp+_$Vht*lS}!iUtpF?S%s!V(upJ~ E(qtY#Q zur-qsLes|Ue(d|~cD}7W%N7W)s~61G=CTsOwY4ufFA#6lIOCYh@C}7d(f?+LTc;o} z7jOjEl>I$mxo9fJkce#9lk*TRNw1J!w)-1es>v?5=kRKaxmLd ;W;;#tK9Jm&lp34PcP~h(FNf5W2em{2l>a`{$7{5FMADo&EW<0TP*> z9+36x{QMmA3p-HJ0Em2Wa3GQU!QLM5ig>xXRn^pZxVgViOvJ^+Bvb*Vqor`poSz3& zbWsso+UOe*5&QZ@?XubbWi=cg&d$yPb1<+sV7le}*97QGJ!@WGULr}u+`PQ2?d~5u zJw1V1H8V2<23ki)M=L9~&tt$K0vuPI933YofKFSGJ`ZeN{+JZp{6oO>p}Fbo=jUf- zWd%$}fRGNXMA)UEq-5@}<@U}F0)Z$2w&G&yXV1dJ!hi_^_(v5L6gaio>+1MLMB0Ga zLO?*^)vJ&3f^5Ub3kwUIn+0np&!0a(+27aK*9Yv-&)L~V#>U0|QNYBraC8Z*Q&~{Q zjK8Ts*{8dywkjQ-%~veC|3Wyf>>>+#0(alC%X&~hT~SWsXiR*W2^*f+EPLY`^wj@F zmfaJ@dCn|*RF3_g*xZQSCl<7KVV5qHNi)ogw?_7fn)(6 r fZ(H%8&|gMEfh5e{lre5rd??< z8%dOE&%xYWzWn$3Ub20)$??48mL}cBp5Q*CKh#09OmX*@o0k6xIk)jJNpYwZ($*B_ z#im*g{t#Kyu=H 14Cmm)ON>Bt??GCjYs}04hru(_H%uo ^lDu53WFG(?uqlN}GxPe2Z^Xjr?{Q|L8T~&sd=QaQ$sywhQqfoM*b;R5G_k&9`c<=n#bnTH+P&xO{zCwn0o zze0BR32ebdr5B!o>N%RJv6Vu4Mak)=ym9JVIt6Mh-`u0a%l?kP8jq1YQk2E?xZ=9E z(Tk2$ d<9PwhTDOz3OK2 bO$-Dz|n;-JeXh9RVy{yuD zlAIZR$ $&R~o#JlJu_kDAR$h-x5fNox;D^Pqzz+vx#SAjXGZcEwIX0x6DbY)wCb-o; zOe6%lSB-h3gg^V4kz3@F_|!k&a-yrLdiitTW@u!z*zNs ZhGYi9WHuAlG#RaGYb?6=(>mwm}^5!bgiDcaK#65qGB ztp8q4v8qmRz55Jxb|mJ6DRq4q7KWq-xg;OBJb{J&Cita#N06%Y`=|sewq59W58;}{ z+o=7e&41S^323#H!buBY&J;7ov8XSFBmXw%qJ_V=NlUyoqp CCOxjFSj{ zfi#N89N31(Uni-b1yi5`7z3k4?|vT>l SuSN!>MWZ99 zj2Nc}5tNtk@OB4`=VA(N4h0WO>D_PVjlQVBzM4>8xGbKtdZwr#pG7`%sfg5kNA^__ zL&h-O_^+0Z+9`3d-bae(Gu&nI2mGl{Q{w|F5}b1~c`Qs(4H)Pd3Q@8NboqJ;$;oAv zJDDy?+@dU$way;Q{c}3TxwbMWw(1?D(Fftc=1 cZ82NpKI$ +oFnn4~TATa{*JWLiQ#V-3_sX;f9{1Z@NAg+s< gaE $Z<;~KCkzRg%Mdz^b;Q%x{e1A5_cn93_(uG2i{b!MS4w{4r z+W}c5s0SQ&4< QP|S}Ed974U zL;l7B5+c{Sr|-}{F%`2$6(Rby9&^If)%zkRAq5xpB-#)W9liJ1BO`NqdLTL5Wh f2jp)xDN~8L`jFKr2s-o@=HXm+1+_NQ4 z9V?lsOJnc~Rs3UQ+@JoJ*)2j>8i8YPUKe *i28X0pg@3*4L+B_0B2%rjeZY zka6U_-{|U1Dsba1Y1ga0p6D<#ts(d5Jm)9~?WPTx`!v4NHTrNodTMYz60~B~dt5I4 zyuljZ-Na&}{Qb*#R%GvzWzAbXOZXvlvoNCu%#sqG#3=YW_b|XSR#H#BX*3-* S(C7Ky@Y}_rW{S%4USH1;ddwxyGnE2rDNN37 zDFmZX9AMSyd?m9+4^}FHd{ezoTB~pyuCnH2rLIt|qM&1VuEytpXDeV&h45}@SOuF_DhP3xMtt?3Gc5-UXKZ<4-S}&u 3^qYQOj!L%pf-kXR zl%;E45J2R_KVKhwioHJQoxnn6=?6l)$*7;`m}Z9J>e8~W^;wv;d@xd6!`kYTVT g-lNR@sjlm5b5AQj=~8i54oPAA1)ilat`=w^nh z=4_*r0DY8lEo3#J_ozrb7#Oq`Q%; (UrMwc$%PX8&!)XJK3l zmhG@^bE@Zjn?nf`8r&}$@UkNc=F{$^npZEA+wXjnX+JIaUjfr+yckKdY@HV{_JM#` ziPJB{C)$wQJPqce>?x%J+0#mM-spsB0!`%%(Ml~)G|(O9wuz(}$)Nbu9f8mEwNzCU zYtUK$RTy6W0CV#htG#nyGY*o-edNUT_2pYxy#1a6 SI z?Gi @xA;jfmxIBl2!#PT3!@d55&6$2d5%Qj zX3k=qBhqVfLE{_+OUCCl{#<-w&xGanFD4gpfM<}AX;6+0hn)zWP13W&kKK*TWwZxB zE1H^ltLsmCN6dni+;Hp%k0J@EqfF)RL9m5byI! z)L0OV1rZRCId=ULFDUGpHp3wzo&A-iX;epfbuGterj3_XNO=pRY*AC500rd2zvr=D zI bN3!eyQa+NQc>=teg47{Cl0l}DS{MMh>Gra3!i2} zaWmH9l{G&(>Q3rYhcU`?3`-rgvOASHHtNg??~RkkXz9i2>dkeMIwzb=b@X?UbAPL~ z&*&eb9xO#$Cd=2=Vg(g>qFYAJ%`?8Vfc1}Qj-l$`aBV31PZI1Nkn!Yh{?3-{!u&Dc z3;&y9_=-I M!0#11O (lQ#>%{>)7LE57cC&Drx*g?mtZ z@X6Z``>3C}8=5x@T)5cAzYEKo#pEc%@->+(_&)ybJ4vRkT;v{=%Hz~Pgu)g~JMe7~ zygEtitPK^3XytVyEPcP?JKVo+1+Oq<>~%&>iNEN%ynm5?PQ>*pd-F9~pQ#ufg}ZMq z jd&|%C3@u0|ksOmt}D?*E{L#j=JRtCEU1^x3l@jT#| zM4~3Ko#ld1t^*Rn^Ou%Hnfk*DMa 4VtB`)WpZJ>cNd>&rLgV#6ozuCjZcF)hGgT@1=9iKuH~djwQG`ak#q^x *mNS(gp-xq2kU^Z1~o&35HW6<{`4FAEuqfMXLj)KCOkB)%8iVV@`q}5 zGST;HScXYi-TIe3c;2rR@PWhJ)Q aB 5H}pn^17r}sNq=Y2iDr>iGv1RIy@u;UfvoZWi~_+VVLZ*{d^-tRSThECJ7P+wTR zSbs8W@8@gSyY_k~$slK!uKxLpqV6MBhqqZp(8@f7Z;!CyoONbw}-dwhk}U$utGM z1EYNB+PO*blj#Dtk)P5n3H1PZj1CQDrl}!-ILjwsPsv#U~3#!C!NHo~)y~F5;&B z#jZ*mZ-1d+K#LC$G)Xpu=971TXNdz#nWtn5Wejz{z?c7@1t<&==(Y0BoJu8WF6lq& z+#q3|#f=htCbu-#P-dqVZr}~l_hMxzHkaw}*p0%cj4691-$(bKWhoQ>4-Q$HHNrV| z8Pu7nn&FlK9L@Qxp4XlM&h(Y_-zj&uL*$2>7Q5Qj9IC}O3>*WRdGnPykgUi~u|o0e z5Loj4m0sK(!@BU!Mb?# ~XunZiSFO`eaIPK4ab)?H>r4mb3h(D!D%7!f&x^^d3fESVLQ%CP3)#js zgEeDUMbk~~NW^dlvRcXcm?S+Yx!gqfql~s1A@`jg=hmG*36)}Z*Cg^)GB5UnTs!>^ zRBKvDxpW6UZF3-Uek*~zzq^xmdMc;X7wU&wycxHc3mUh0lf6mtzO+xihXAt`eD~V6 zC3IFO?uQ7}VSsHztZH3ItGsyJvyQ2EX3O^KVVHfVj2-WrA3B0j)e}p$l`zIju-A#9 z{JXN%vCtgx4R@YAoUKw$*H+RW0wM5X{J8N2gYQB_dj#i)e{RjHIvP~Q)+@axcXKiL zx%A{y=c>BoQ12WxB#%Ml6W6>| qF97)tTN%TYblz^hM; zTAsIv;tPqi$v`35n=7K c1oLI2uL8S8oGTbd79CZAMZ4JN7)5#}WFV?*{Kk~d( zEpPu$YIx>uavY}Sljei{^8cv%%BVP+Em~ZIJ0TDp1}6~Q-5mxE?(XgccXxMpcZcBa z?oM!h^Syh&`_^0Q%&eaI(cM*bs_InL*?ZrXD2DML?B39k(~AT@ln8+Gf$p;&-KJhW zaoXUof~>a&t+Ojsfi4F@``@vf0(65|ow2B*U&r@8!d!F0%CT@NVnl0PQ4tBkgX((9 z+3zZ@DZSx&1O3VKly0>I#L8mc6lgfQ3PYtvr)~pteo7C@MG();R(j47qQ%eYOLB0E z%0BPx3?muWkg$-c=Yo#k%jG>ub`=5g1wAG5WhFfs+PC6~Wr&!d(_IOj>yM5D8GVK< z5D0J%gP89Ye6;NMp+@X%Wj>(PPc=g Y~Et3Doh;zg>{Lb!7Q>^~)c^C-nmIbW>M@x49&28X8ux<^;nQ3-iSH zlNk3=dq{!rfjKww?6NGJvOmo@W{&@88?uy}*=3nKWmx)+N=SN`HMfSQ-=JTr*(r8# zAC(f+bUu0T|5cLJ*K4_? ) zB{^|NKrSb$#$BHBnsv!p>P-hfR(0KQdqH`pD5PpVwcrZW fXQK-<70CNFdUev}f1GJEDic){LQGcKepedHK)6Tk67>^A|Lqa{N4)aHtUL`9G zlw-vnReH@N>43@5%r0YCNsH~&QqF?aVVOw>k*^>uk@q`=+FEfdlZFH_wgjbNA*l-E z9_)Ni!!AJUZSeo7(|t??GsW&jZ1Ti`kE1KnGSt9b9~+G91rQZLkoVr|`1U03s;pO) zyhsYyys5d(V4cz8BPI+7>cThb7pcV4087Mvc0OTLV%YmiiYGSK=$d846-ZJ_i6a!6 zZBP%^&NI<@_4f5(5iYw_s3)!}$q1(=WDv}s36tOYl6(bflw516NDc bR*p8(jCyd+nB8`0L3seTgJJ)a zkQW*LkSD8p!&F!+K%;GnGY~m9#-v?9 o7ttCz;T1E&8R@^qX)M z_us=Ll$87a{g9r8_tjO%8*CDX)*q2PX-9emH%eAytB%uy7pSATRJn9Oe&i^A)uLpn zYXkG6alhk7pFZeXKWJS)=-hqKvGW+?4ty+Ia+!d2<1fu`tLC28Mk9Mm%)OKx0~1Uc z`-K5NFAUMRqie-3kMpn;1bGia>9Q=NBC-xaM9%OVuq dQ3&ln875Gw-<_NV?z|uj54tLVqoP}+w|dT;Zso<9r824 zW``7}O}>K!iQ1kaE%+28_XTPU8?{Wr*HUFzP-O-+xso6HcjH)p?^*8lJ>v-W@5VQ^ z06%6pi{~mw7szeR=})DE(LKMP8#rFJjDMjSG6-D-f*v6xu?isG^A^Jnpj4c(4E@T> zi9Z)=AR4g-yDoaefHfq9CE_)2IT|$(>s78us=ZLz=q weC8 =K7$42ReXr6Of9X5SbO9yjY;>mm;}b1nlXEk;Kh>`^qZ zxt{FPi_gSoKiVM>t+15M>s^(~*FE!`r*f>9U}U^wI+KLM`~a%(fAxRD9vj!1-RK@X zhiOy$(L`t`E_UMd#z89Ui_}m0t57B|CTi4Z*h7a~s7h5ST#ypz(p5;ckg(`$7hi|8 z!mUJ{lc#0vY1Odw6?E;8DSj8EF#jXhN#vhspzyr-7Y@5*7TkP!v`X4_^B0%c5x-HR zZt9(57?E+FLsTRHSa=U`ik4rT49i46E-(PLO&a{Xjw?SS!PIb*ul#PV0^?fkj=R*c zX`%D0b&7JZyr 4^##CiE<}rxV@lQ*wrKb3_A!Y^izmrJ30dkV^G`@F!|ttjLWOzw zc_V=t^GLtnMEMDeQOv{=PlUN_8+iB-cp@g2H_F}6eX$!HX-mUJT_-tZDg-7+#8@s2 z_?^1q8q!b #IN2pCzq_o zY;40u)(VHoIY!{`4TA;LlzkHiEU4+K3DzjqgxmhIs>`x8%HWs1CCKJ)R@FvOr;Y^x z?A2I#)W$K|13%zq+d44hu`0$!@0e(Z)9B(r^N#XZ?Qoj)Nrkoc2Hl3TppJ?S0DQTv zZct8vrfFon(sd9EgH|P+y2; gXKD24{9u_6W^&oaw^82Y}B2~-uc=LpPazA z%qutP*sTQ9i%SK=&MjdnW&E%H^fwli+8H_S!3yzIDYlr3nm^wQ;T$A45+6-K*exEl z5&(^hST3i?F>TdhO>+igT$Lw;3j_!?$)DGq@Ja4f63?L}iLO5> zdyC1yzZHwur1{177{Dck&9%~KkSaiX%&Y&npP@f>(B2oh=X9ZNX!eSao0Xypd(eTR zVcTl9IdYWQWRyD(gBl<3@IK818-WfFP$*|B46q1k=C6eFX3u%KJ8;=PHiDUgWS->A zp)R=ws2Uyk{{U_e7(w0o`r?qPoZqx9xom(o)&FW=JtRVIV0kA1SOA4ZfPn%@%lExR zmEITE5~kmZSSZALB`R`(8u5C0ba>`cL2F7o$R(n|o cFw)y1GZ6@dPU;!L?Km9C*Es-xXGwCZ6!_*AV1OiB*im_j;ib@ GfEejnR`VXK8VzQ|jRzDD+5R&~twMY2J>duzI({WDsczp%|fr*w!2s_X22S zlWc`ibzwo4F?Ok-!TZ?+?VuUboOfe?(L#i&5;Pq5VFmNGVJhJ&f!R9Xe*{@#4iRMn zLZJ8p7L<@G#3$=Dpl}x 8e)Ox6+yN9-Y^`LpWv&jL`BPe zG>mm*#a8H3AU*!!bj*=r|JA9CMT%N#X$1xd;dF-mUT-QN5vVq!g+^N;G~7pBCNW%h z=PqTJiBKYKqDu)l)rg`mTr-v25F(~D9F!dS3ocL!F-3?Tsc-_fm`e&wydqu9$D)-Q z`C7F0t9(0nsz+FRDxo+fbk??Q@G#94y_=)?H_xvc$)E(L`BERXN@b343smY+DiwFL z%_a=+c20f^co_|O0ToknyS%KJu}a*ic;@dC_Av5cQhIdU428Q33V%wL+eY4Nzvw#1 z!d&w!&`86bTE>p6#CSc {PS{OF#!>qlnB3 ;{_mc;82?INihw69kZ&iKi=f|Z~ofheUZ2I62aLmM stceKrG2k?2pEu|(sMRFSas-Vp z8T(RWt!PYzRV=E+y-Ie1#_a@w7EfR+hAxwKa3S9C3;uMP9Qajkmp!<;2H^BCa;abg zX<0*9-3+pXMRm!uis3UWg5z2BF|L#|ze@Hqt3t(mhsC=LIt|2*q^sM2IfH@G0mX~f zZzxFu<_*{BkKkKcI(8+$kS929irFPC{&oxLl_4nfQ8c0RKN1EbTw=T(pz_DHQ`!O} zD6a~a-6(}T9tS2oC!0=GIP{hXdvqqT?Uo3u9L=dJ7pi)G^1E_aft}N0t$|r^MlaYO zQ$NtI%WFV7c#j?yvdT6Q$)6)sOs - 6X(76%T7jE=VC3siB%oWen6a+%p)_*pEL`fL7e{)=7V+
&n~c?t(PHd=(spuS?-~fN>)oma-lmzD{;QO+8zIGa zEK02$ZmxXcP%U>56AWX~PEr@b+~FjKP<@NS@-Psi6lZ>h^RL2Y|A}emvuP)^X-+Gc z>hk-&v8!rtoD>sxU%4$rG!(A|opl2?+wHyR4}EI0x&)S)3`m-!{7CGU?oo|(LjhZe z@Vf+8&5XTwz_kiXvh_Am)|RMEl^0#Rl8ZJBFM1ce*Ut~L8_L})6}XC=k?^v1`*1u} z4MW>{1@Dr$KmjvUQ!uFXIXQuN^NbYBV(F&2FK1@)_fGX7y8v0lit~^mmqA^(UQ@T3 zUWZX_x0Q(HgA2$m0{66o_bTSxnl7u>oKTc#J>W;WbLFWUAm+s-fAcAd0uoD!MV zm)hE^p4XS!Hx9rEaDZrcs)3$~dNx>!-@wiDyV_E6+IcsThR4YukR*=vp=B0IsZB|y z lBdIxl83 z3c00_-I?w>CuTG9aAiLenKhnlN-%oTPKz6rHDN?LtU(cNKIzwsk%86vn+MAZ9t^8- zVNF<)%J yrSbsV!xM7D?DUp+`8J7a%4wscV{Co7gnkc7%RL2wrA39tY) z2$2%%D?OLlh-ba%cH8l9w2@xN`ZkQvK2_j&g8+NIVYq7K59o)A2ULm&!kCh!0ANHI z4W N0UCR=R5OvKV=%v |xyRCN*=;EoSnxfcJ-lKfXNF$6_qW9Ax&r>2}ufi&j0p_!=i_A^l;Q z2H_ZZ9dwWwL4J?lEG&EQ$(a{Z{E>V`GPr+2HkrcU)rf8vUrRNa?(xkRz0VMM|M28q zu-GE1n4#^ghmjIS+;sbH3F|SI1gRNu!tKOgkWKR5s-N~5#^MuL!6RzOey(^$crw}Y zyMi>ASO~*} h4xVT9cSS+?m1-3)2$W^#o2EKP3L+yd9}=|r3DH;R)A z8lDksy{Pcp4wPd-UD>H!&Z;l7NbG3S(L=2*MD&R+$J|f>nO^ESkF`BStD`<>NZQbL z_eg+l_VxsYt*vOA14avrC4aoW7o%;1O{{*iMe8x_~Z$94@IZXdk_LpW87$wp9FI zkYIv;`|jj!U)!1n;=)Hp1%}qf!clVa;(rSsUWQ`A&c>CIjwnqbkduw1EFM;hs3p|p z<`I%EFrjomqHw>dwXv?VajpY>`&dJylEEBOz* ZE}T4~=#zf_4hTDrzDYigjYIGB_ehh``;*%=HH?S!g^XaV0k~wf6vI zD+I=MQUi|8W}NlxkhI{C;d2qtIoWe;Q^%Rvmz_+B*ned1sicdHDdT^{OSosGN`qm9 zni(3C@ctmo#*3E05ZbH-Dz&}h6CmSOM8WO=`7ceBvvu$gm4#zdx=Dse6jPoc0T{%N zrTpZ70um*fR8Y0T1Xb;~C2MIgX+8JRDp286f9dqrC6T kU)Y-Sjq|9Zz9)1G>^ zJ~wh+*0Skb=SK3g?%wpwi=BD`cZl&fQ-t0ZgEtor5WMgx7`xx8lwXBgIUY{&%NLn& z1w7aZ^qmq(Q$wr@$=~dM@@gs&>iiNVFsTct5f~)OQncaaYup1Gy`*a_3n%c;3+W#A z=+19l>o0`sFQD$0mGcu=N`oXkO3VCbZ97Ii8>;?JJVXw%atmV*?@V^GF@8V{{o01z zV~~IPeAkBDW4K27i^DjyHMQ*K^HKY7&GORTd`YSC>c23`D98RAEz48-x4B|&8leC# zydIHr+ZUC`Knp`R|3p-G75bet9TH_o9jvkolm+BKb69(*Ga!a6W^bHh*osP*E#_bq zOY&}@f!!oix&eyg-