From a1bf0d2c0813dd1718c6567f970ba78a5cd02939 Mon Sep 17 00:00:00 2001 From: 3dtours Date: Sat, 27 Jun 2026 21:42:27 +0700 Subject: [PATCH] feat: implement imageProcessor.ts and fix fullscreen photo lightbox alignment --- ANDROID_FIX.md | 94 --------- PHOTO_FIX.md | 181 ++++++++++++++++ backend/public/downloads/yotrip-latest.apk | Bin 13492432 -> 13492787 bytes frontend/dist/index.html | 2 +- frontend/src/components/PublicPhotoModal.tsx | 42 ++-- frontend/src/pages/LandingPage.tsx | 154 +------------- frontend/src/utils/imageProcessor.ts | 205 +++++++++++++++++++ 7 files changed, 424 insertions(+), 254 deletions(-) delete mode 100644 ANDROID_FIX.md create mode 100644 PHOTO_FIX.md create mode 100644 frontend/src/utils/imageProcessor.ts diff --git a/ANDROID_FIX.md b/ANDROID_FIX.md deleted file mode 100644 index 1f31019..0000000 --- a/ANDROID_FIX.md +++ /dev/null @@ -1,94 +0,0 @@ -# To AI Agent: Fix Mobile Dropdown Displacement and Eliminate `.filter` Array Runtime Crashes - -## 1. Context & Identified Bugs -During Android Simulator testing, the frontend app encounters three critical layout and runtime execution failures: -1. **Dropdown Menu Displacement:** The profile/avatar menu container gets forced down to the extreme bottom of the viewport instead of floating as an absolute element directly beneath the user's top-bar avatar anchor. -2. **`Uncaught TypeError: g.filter is not a function`:** Triggering the Friend List components crashes the interface into a blank white screen. -3. **`Error fetching connections: TypeError: (intermediate value).filter is not a function`:** Opening the Live Chat view crashes identical array loops. - - *Root Cause for 2 & 3:* The API response payload from the backend server is **not returning a clean primitive Array**. It returns an object wrapper (e.g., `{ success: true, data: [...] }`) or `undefined`/`null` due to connection timing gaps. Invoking `.filter()` on a non-array instantly kills the React rendering thread. - ---- - -## 2. Refactoring Blueprint - -### Step 1: Fix Dropdown Positioning Context (`MapProfileDropdown.tsx`) -On desktop, absolute drop panels function normally. However, on mobile viewports or custom wrappers, they lose anchoring. We must force the container component to lock its coordinate space relative to the top bar element using modern CSS constraints: - -```jsx -{/* ✅ RESPONSIVE REFACTOR: Force absolute rendering locked beneath the profile button context */} -
- {/* Menu option items: Tạo tour, Hành trình của tôi, Thư viện ảnh... */} -
- -### Step 2: Enforce Defensive Array Check on Friend List Loop (FriendsManagerModal.tsx) -Locate where the system handles friend collections. Implement an explicit array layout typecheck validation using Array.isArray() before doing any mutation logic: - -// ❌ OLD ERROR-PRONE PATTERN: -// const activeFriends = data.filter(f => f.status === 'active'); - -// ✅ NEW IMPERATIVE PROTECTION: -const [friendsList, setFriendsList] = useState([]); - -useEffect(() => { - api.get('/friends/connections') - .then((res) => { - const payload = res.data; - - // Defensively parse and normalize the input shape - if (payload && Array.isArray(payload)) { - setFriendsList(payload); - } else if (payload && Array.isArray(payload.data)) { - setFriendsList(payload.data); // Support nested response architectures safely - } else { - console.error("⚠️ Backend returned non-array structure:", payload); - setFriendsList([]); // Default fallback to shield downstream loops - } - }) - .catch((err) => { - console.error("Error reading friends list data stream:", err); - setFriendsList([]); - }); -}, []); - -// Safely filter verified arrays exclusively -const activeFriends = Array.isArray(friendsList) - ? friendsList.filter((f: any) => f && f.status === 'active') - : []; - -### Step 3: Secure Live Chat Target Connections Handler (LiveChatModal.tsx) -Apply the exact same defensive architecture inside your real-time chat sync queries or global context connection monitors: - -const fetchUserConnections = async () => { - try { - const response = await api.get('/chat/connections'); - const responseBody = response.data; - - // Check array schema context explicitly - const verifiedConnections = Array.isArray(responseBody) - ? responseBody - : (responseBody && Array.isArray(responseBody.connections) ? responseBody.connections : []); - - /* ✅ CRITICAL SEPARATION: Running filter only on verified array collections */ - const onlineConnections = verifiedConnections.filter((conn: any) => conn && conn.isOnline === true); - - setConnections(verifiedConnections); - - } catch (error) { - console.error("[LiveChatModal] Runtime error fetching message feeds intercepted gracefully:", error); - setConnections([]); // Initialize to fallback empty context - } -}; - -## 3. Automated Verification Checklist for AI Agent -[ ] Dropdown Anchor Alignment: Confirm the avatar profile drawer panel renders right under the top-bar avatar, leaving the bottom interaction tools untouched. - -[ ] White Screen Eradication: Mock an empty server exception response (500 Internal Error). Verify the client component stays functional, logs the incident, and updates the empty UI state without crashing. - -[ ] Global Code Polish Check: Scan the repository to ensure no raw .filter() methods are executed directly against fetched network streams without preceding type guards. \ No newline at end of file diff --git a/PHOTO_FIX.md b/PHOTO_FIX.md new file mode 100644 index 0000000..b0514e7 --- /dev/null +++ b/PHOTO_FIX.md @@ -0,0 +1,181 @@ +# To AI Agent: Fix EXIF GPS Extraction, Implement Client-Side 2K Image Resizing, and Fix Android Fullscreen Lightbox Alignment + +## 1. Context & Feature Objectives +We are addressing three crucial image-handling and layout bugs on the mobile/Android web wrapper: +1. **Fix (Missing EXIF Location):** When users upload photos, the system fails to extract the geographic coordinates (Latitude/Longitude) embedded within the image metadata. We need to parse EXIF data completely on the client side before submission. +2. **Feat (Native Save & 2K Downscale):** Whether the user shoots a new photo via the Camera or picks one from the Gallery, the original image must remain safely stored in the phone's native album (handled by native webview permissions). Before uploading the file to our Debian server, the frontend must dynamically resize/downscale the image to a maximum resolution of **2K (2048px on its longest edge)** to optimize network bandwidth and server storage. +3. **Bug (Fullscreen Viewer Displacement):** When clicking an image inside the gallery/photo manager view to preview it in fullscreen mode on an Android device, the image incorrectly aligns to the absolute bottom edge of the viewport instead of centering beautifully. + +--- + +## 2. Technical Execution Strategy + +### 2.1. Client-Side EXIF Processing & Metadata Preservation +Standard browser file inputs often strip EXIF headers during dynamic manipulation or fail to parse them natively. We will introduce `exif-js` or use a standard binary array buffer scanner to extract the `GPSLatitude` and `GPSLongitude` headers right before resizing occurs, attaching them to the final multipart upload payload. + +### 2.2. Downscaling to 2K via HTML5 Canvas +To achieve hardware-accelerated image scaling on mobile devices without losing core image visibility, the source image will be rendered onto an offscreen `` container configured to enforce a `max-dimension` of `2048px`, maintaining the original aspect ratio. + +### 2.3. Flexbox/Absolute Centering Fix for Android Lightbox +The bottom-displacement bug is tied to incorrect layout bounds calculations on mobile screens when toolbars or navigation rows shift view heights. We will refactor the Lightbox container modal to use rigid viewport configurations (`fixed inset-0`) along with standard vertical centering mechanics. + +--- + +## 3. Code Refactoring Blueprint + +### Step 1: Implement Image Metadata Picker & 2K Resizer Logic (`imageProcessor.ts`) +Create a utility service at `frontend/src/utils/imageProcessor.ts` to handle metadata extraction and canvas downscaling sequentially: + +```typescript +import EXIF from 'exif-js'; + +interface ProcessedImageResult { + file: Blob; + latitude: number | null; + longitude: number | null; +} + +// Helper to convert EXIF rational coordinates to standard decimal degrees +const convertDMSToDD = (dms: number[], ref: string): number => { + if (!dms || dms.length < 3) return 0; + const degrees = dms[0] + dms[1] / 60 + dms[2] / 3600; + return ref === 'S' || ref === 'W' ? -degrees : degrees; +}; + +export const processAndResizeImage = (file: File): Promise => { + return new Promise((resolve) => { + let latitude: number | null = null; + let longitude: number | null = null; + + // 1. EXTRACT EXIF METADATA BEFORE CANVAS CLEARING + EXIF.getData(file as any, function (this: any) { + const allTags = EXIF.getAllTags(this); + if (allTags.GPSLatitude && allTags.GPSLatitudeRef) { + latitude = convertDMSToDD(allTags.GPSLatitude, allTags.GPSLatitudeRef); + } + if (allTags.GPSLongitude && allTags.GPSLongitudeRef) { + longitude = convertDMSToDD(allTags.GPSLongitude, allTags.GPSLongitudeRef); + } + + console.log(`📸 Extracted EXIF Metadata - Lat: ${latitude}, Lng: ${longitude}`); + + // Proceed directly to resizing stage + proceedToResize(); + }); + + function proceedToResize() { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = (event) => { + const img = new Image(); + img.src = event.target?.result as string; + img.onload = () => { + const canvas = document.createElement('canvas'); + let width = img.width; + let height = img.height; + const MAX_SIZE = 2048; // Enforce rigid 2K maximum boundary limit + + // Calculate ideal bounding proportions + if (width > height) { + if (width > MAX_SIZE) { + height = Math.round((height * MAX_SIZE) / width); + width = MAX_SIZE; + } + } else { + if (height > MAX_SIZE) { + width = Math.round((width * MAX_SIZE) / height); + height = MAX_SIZE; + } + } + + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext('2d'); + if (!ctx) return resolve({ file, latitude, longitude }); + + // Render image onto downscaled dimensions canvas bounding box + ctx.drawImage(img, 0, 0, width, height); + + canvas.toBlob((blob) => { + if (blob) { + resolve({ + file: blob, + latitude, + longitude + }); + } else { + resolve({ file, latitude, longitude }); + } + }, 'image/jpeg', 0.88); // 88% quality compression sweet-spot + }; + }; + } + }); +}; + +### Step 2: Update Image Upload Handler Layer +Integrate the processor wrapper inside your central upload function (e.g., ImageUploader.tsx or your form submission handler): + +import { processAndResizeImage } from '../../utils/imageProcessor'; + +const handleFileUpload = async (event: React.ChangeEvent) => { + const targetFile = event.target.files?.[0]; + if (!targetFile) return; + + try { + // 1. Process image: Reads EXIF data and forces 2K resizing on device memory + const { file, latitude, longitude } = await processAndResizeImage(targetFile); + + const formData = new FormData(); + formData.append('image', file, 'yotrip_upload.jpg'); + + // 2. Append coordinates safely to standard server fields + if (latitude !== null && longitude !== null) { + formData.append('latitude', latitude.toString()); + formData.append('longitude', longitude.toString()); + } + + // 3. Post to API endpoint + const response = await api.post('/media/upload', formData, { + headers: { 'Content-Type': 'multipart/form-data' } + }); + + console.log("✅ Media successfully synchronized with server backend:", response.data); + } catch (error) { + console.error("Failed to safely prepare media stream:", error); + } +}; + +### Step 3: Fix Fullscreen Image Alignment Layout (ImageLightbox.tsx) +Locate your photo viewer overlay or modal drawer component. Overhaul the tailwind utilities to guarantee true vertical and horizontal centering layout balance on Android devices: + +{/* ❌ BEFORE: Faulty container pinning images to device bottom edges */} +
+ +{/* ✅ AFTER: True viewport overlay centering bounding context */} +
+ {/* Close Button Top Tracker Bar Container */} +
+ +
+ + {/* Image wrapper frame context forcing clean alignment metrics */} +
+ YoTrip Preview +
+
+ +## 4. Automated Verification Checklist for AI Agent +[ ] EXIF Validation Verification: Test uploading a photo embedded with active geolocation values. Inspect the API outgoing transmission payload in the network panel; latitude and longitude fields must contain accurate decimal metrics instead of blank string indicators. + +[ ] Longest-Edge Constraint Check: Upload a ultra-high resolution image (e.g., 4000px wide). Verify that the processed file size shrinks significantly, and confirm through terminal logging that the generated canvas asset limits width/height strictly to 2048px. + +[ ] Android Centering Success: Activate the image preview mode inside the Android Simulator. The image layout must align mathematically dead-center vertically, leaving symmetric padding bars on both the top header and bottom system navigation boundaries. \ No newline at end of file diff --git a/backend/public/downloads/yotrip-latest.apk b/backend/public/downloads/yotrip-latest.apk index b24e6f940f95fad3918229cf04aa900e6b36f744..e2d76a549abfacebfb64aa7a767aea84b38405ce 100644 GIT binary patch delta 443587 zcmZtMWlx<=698b`9g1slFYfN{?ox`o+l?IDi@UqKdnxYvl;Ti|Q#iQ2=LftWu4Iz^ zvOCGnZZfkl+=3?c!Mg2+JRAPNvAhzj%>L=B<=(Sqne^dJThBZvva3}OMXg4jUp zpf4Z}5GRNW#0}yB@q+k3{2&34AV>%#3=#o}g2X`LAPJBpND3qkk^#wr4Nk?`XB?4A;<`13^DfL_I2P3 zrc%>Pm6ty@YRa!rfBfFP-ffOn>zLd?45D z?0AacdXidCcx8X1#G^8q$=M1lL(MY(t{{I8!UA?4-5u(H&2KI9FvIa6Qb3p}PznPk z`d4m_jW7nvWMy}=D3ndxF)^mv*L|71Ye`O3-Bc3FcJOzmeL@}KZOjMfp#UY$@1iyp zyWR)l3L*&8I;8R-^r1|F=kG)+e%#cvIZc6hh>OuB6s1yuj^|{poDaJ!aj<(qml&nd zoHlg7dcW|{=?GiX#c9%0R{%7TWKdq^Hp$o6opSkA68gty<$ABS=61uMz{y;*PW1M= zdY(LaCiHNs?hShd<=r7sJQ1)tf`mkzAiqBzW6D4;f?+4{-uyRW2K;3m~> z6($P76SuFm2uAq0wT1{+%WMg9Y?3ljnZ?`|p^m2L&5G6VE%}^SzChEf)@WDGAhboz z6DplLbt=v=@%B4Ss7{<11De}$sx!{^0`u9g;DuQq%csxbq=iK??Yb+pk;G)i6dmjTHUNiQ#G1UStoF>v8gZrbVdM>$(y0C)f3~-e>)|r1ZFgEXJ9%|U zpfM_z0-TGLoR+@tb}Z%ep5>NCp(S;UxTUg`b_i>&RJ=OQj%L_&%zg+hI=(y=*4PM5 zkWJWZ_2m>~W?Pq>%9IWPvMm-1ufA{mwwn0xf zHxnD`^+j}FRye3Tq$$p5dX#JVoid#lRoR9vEY+VpP@pd~r zd|sQnJP7AGpsn{CdG2i6?d#Zjxk35wua!G<y(*k!}Q0y}q>uey>ak@}4Jmn>5})tWR) zo!hQco!kEXJe9uS@oUJ%|8 zJ`lbTeh~f;0T6)@K@h!qIDnuGYIz$FUCPWrQHbf3YE<_$gK12aTAw&^GF+>SODMT4WIYb3SB}5fOHAD?W zEkqqeJwyXUBSaHKGeiqSD?}SaJ46RWCqx%SH$)FaFGL?iKg0mUAjA;FFvJMNXeZU# z59l0p7;JTw#W4gZ0u(GLx=f7=2f|E@-B|=cQrePB-O1OP&EDg@Kfs6NsGILqhc3v^ zx4d62HXk>pWlK25N}jUvC&q&RR~aiiNAwgM5O<4J{Cb$?6bC#?nr0D}?Nl`uL!0=_ z9%k#aNK4@c2H*vN9(+vJgLXXTZLNhuTlTgv<31UbcF(T|;J34#~?JO&%zL`fe+5`$^)z^@0HAp!(j<#qqX)XwhGn7SFcboy&5g{o$fE zzp24)KSdNNS}!%6#jeOp8?`Pu-u*L`BFFHci89S2$0&eQ(Zp__#c|{Z=jX1~H-VtX zffv+g;q!vxBs-gR9~z)y1oaZmrk15TnvYpB|of|B3qL^~9^Sr-0pF z(T}~SOYS$Ey;KU%AfHI`mFr2&oPo_EM3KOo@SZCKusLzzYtcpT!$LT|=##{#&-_w2 z5oC#L0N5-;Y<)aLydBsqL9G0Z4;0>PB@Yyi(u;LXC;WZsx{`ejTJhNgn`0EdnveKg zl_OdWY!=UlKORyfzOe0zWQN`J|&e7Y?ksRLUxgNy=CC<$}IXcY_XGH zirCrh@%k2hRZx0G|8ElW@^;J5-xaFxbysx<=uaXi<-`&_i@K}QI(;-{Wh3i)xTNj{ zG*BG>{<#&7fGzX(d2%=JtiBkOa=PiaKfX+U>mhrQX#6l{y>aGAGP90K*pJ*f$+#2_ zv_I~DQTuI^G)?l>>KLA}ewl&s-p3tWft`OI@J81j6WkfrF^oXQeF>(=D?o^|G{bsbwc=XTMyZ&;e zON2ca(!6fmQR0p;j^{!Du;=jLlg;4oi+1E;&x=9SRbA~Xo;P08#6JIa{qsk+M%>H% zL_v7+v6u=nu7!S)K`yaNzBl5E&cXlEfM&Wy-$VN9#9((~lL+|1E2toppw_iqa8Hq3v>n`Fw876K-+_yy_;_uHgd&5=NxisdoV zGoQzdgIgSRRMM74dHSO9f|Nb)W9Xk2eHJ;+@G#SqUh~KrM3*~U-DkJV&rNP_?>;2jXLM#+~{pHbGKK5jwqStBUk&| z8O~)@27kxfpsY^9nqIIZkJ%j$ng-q2eG_9Ft-IQl5E}WTmzRq#_|I|`5bT7~a<|I9 zpOD{h;9Z>|D`bO*CJ80)=!{Dl&8~Us{+%H5JFPdYOQXv9qW#3#vr{+jrG}67M;ssP zW88+_sTELpFq;|923W#=Cl8@Vnpq`{&4w`y#07O>j6X%V_u`IW ztF-;T?ioKG!OgF_@Y#O?+-FBGV42uq9!DnUPOyoQ3iVwy!fm^%EW9`_XV~*T51}Ci zhrPUxNY)cUv;_tHJ{cR` zx_G$kD(@~mZ{OUyQO29)4if*0D2K;|5o@T^X*3G%NuOl;BSOXvyww=p8JRBB6?lIW zG$o`cEI@F-d04j(?wszNQK9(v@2$Vf?N@g~Z{=V!iT{*W<>o=;GXLb0dwZAuE#a?N z)E-=8?%n#+veQ4hXcz1G{4M^?FBz;=+9taQq<`3(B(|)Ev|Ha}DhLjw4I?bwLhmmz zdP;|aw;n+|cJNzlK$AhII!n0!t_@V~2@z5md5o**cnNy z{bMqc=bcH?qORQpNqG2Sm;X8_bcX^WN@uIi^ekU_LIy?uYY)Jf^Yj~s0&|) z8GSr=7Qret*6%qU5kILIk*L$TG(3ypau*WQfihRygUTxAEZx;ZpO~bky%l-2IxMM+ zAI!;A)x-@Q_?D{pDH;c_u<=9p*Y;_N(5Ka7=FTJvF@$T%SX||KSZtD>xfLT^Kl6wZ zlB!e`;3-602|C1R#ND%lkWX+ikLxEAJ40uPT0hap`%A5v*xQ}dUOX;ugK=4VW7PA4A2JeSfrhhe`VYX{G%X;cHU!InleR=dBstikTOe67t_& z!7=6B#GP21AR?B{bhnw0^u{V9dP9ORejDx%*PeAZfW7w_ySFgOFqPH9{vqz z*B~}I1dmf0J4^lDFA5kt&=c;F3pmn!ImL%gz&=oi+Gk{8fiVsGT@@6u^5@rXR_mZl zr^oFqSu$IsFCRjwI^$s&b~uskHp^o}4}j}M`e7_IlB#Uo}vJF5Ax>WYavG& z2=bsJ;iD{mGTFVbNam7h4qNrI6P$l=<&=j9CdQsoQR1;j=6{`U z-WHBww#V|pY6lIMqZT`fxq%I+_eJD0VV~D?ObPOYR6GUw5i=-QDkw4|^IjB%qVi5E zfH~+97cZp^^vcbeiA>@{{E!!sem26pr|-|dWV!m5*ePUz1b?NT1`~WF`EiBCd zjxHmf(-mdp{kcH9`Gtiw6DbTbEwV5pyPE&b(t6bYMo6IkM%TSm4)-gX_ir4vZDo`k5`-*5Nfl|PnqAq>w?02l_QLei+OhY$Z^hvSYxseNm`;$j^?*MqjO+5*hWj>m(g+A~m(!;NZ$(4<(AbNu=v!E~pmWV-zd6Z6*~6 z&iI$Vrfv6t(4WG|gbJ77WY-k;=HV9O?MAF@ZpUOVd0r-Wiu8EpjR=fyXR{Y{{8YMi z=#shj>-6~9By|2<#P4;vWVfe$5iCbC-6*4aHnr4C$?)SbVy<7rWjjWwD^fL;f0&i< z($oJ3qbwd_2ET8l_Q)eA;+IhlB4~O&8{|R6>dKriwLrntXX zHlJ`?E=+VAe4=yS`jbXT6>7djOY$?kdr6ftK0kaB2h$)YGP~R;48IgwHR1ur^EcuE z)W}2$e}F*Op~S}J*oLwt9kY(Tk(YtlGE^uOalQW?el#%n3u{20MxZD8lfP&KUX$x6 z>bF-E@F#K%3PZal=dbTXI7oOxGz!T_BO^<(1hxlA9Re2^-bEtpwyKMXcvA%<3Glcy z6gkF|e5l2^IEO)1$wM%l=0P02RP#7X$=77D0W2xvjxNMd`nJg`k?zChCQY+W%@{}P zdE4E1$%X(F{QJF77d(EGZjvM!E-q%^(}gL5JlbsgT=MWaspGhvb696ibgImkr~g=g z@Z{8LycxJWLRuv_}qbNoti z^epw!zDs$FVJHt>tO*gJ>ZFg@;xsj$R8%kJlf^d$Ta{$3(MZbp${j=7YeCuP7qAo< z(r0<9A8052K0w>IKnct9}==7b-XHqOnCMnfMlJLh_!N-0k)b%_Y}*3;dsj z3>&}$UO&KO^6@RKrMuhE{z6Epw(?F;6D+HNWt*K{Vy%F@X74sslrZ#nfp@d(M_p@B zLz{?RFj)w`Q?`5@o~w6=+tQh&Qp)a_)Qlg4c2+F`r<^hprw27ykCi0mExw*WpaO0- zX7pUqKYjFib7G@)Y~^p6V*v(7wK~FD;1JN1g=kPpHlh@g<%%*NPhQQs5P3buh{D*=9Qm;!Z+6FkRCCfuXvC{+AZ6f1EGs`2dhR?A%9c^pz1U`~8 zQQ280P|yngguK8-Zf@8Hnsi`X{X9ar3P>h#hX$2*1*gh!f7di~vAv1b53NQE$Ob$< z3c!yiTRY-O^OCfrzH{4w9`?l~C!@G03J%BZsp9@VeA;2`Eigu80fuZwgWoz9V-PlX zDvNzk(dNqDKywS&7xi3-Ks#}^%Gu#Wn!ktd=3KFba68=4Y$!08mSwB>Y5P*@#UO$q z#Z`7(vLpefYPuv%H+Q0Qi*g)!9zY=;=NacJnR%Ysij|20^dS`A>Es z?@RAPou`1VJ_lb!oBn>`HWJ{nLiK^)x5w!l?tDk-)587Yp2$%#nb6|obrV+~uGP8c zb<_;e)^LB+06nnCzLkFy2xRGHyc$Ub5M#&nf0aWXwb%kX*kKmTTlQTD`H=4qT;ci` z>biUaj6W+~nttoKM2@A!ih>z^npGNMARsri${e=dA(pP*g*g}L|JVnJc>%Bf~=L6br{<>H+e8th-Bj;q{^@4KB z_8_dI;xP_zvpb4AUIak;48BPlPIGJk6*VWhNJQ#xv8cbp(Yo3crMgg=VcuB^35dHy zBQe!o7V~!ED|bzbnWh#oSx*c2PhX$#RMOE_dS!6u^Ml;U7DFC}AgkZgp^%yj%dN8gWjP3*Q5TOX$SSzzd(1Y`O=TGI^q&C;s=|5 zTtNAMO0Bhp19ED%J|gb!O-7@C?`6$%C{hTNU((0Tdhf>wD*A6KlJ9Z9P=nB+m>v~) zO#W@A5H*TEgQpG}E!8=eZ~irPt8IT>qIU_t{T;W?W-^j1!B3Vw5Tg_^X|ydGZw8h% z)(=WHZ5UnW*9C;UA8zCd`h1fMr)rs#2JUC$+S(7fSl<#ymL3V|wj#b%8piL*`2iQV zJ0>qTM15kIaxw*1e{bZLF6Q4F`dXg@h=sJ5@oWrD1uE#eZoq~A5VRal4$mqx#g>GA z45-%mzQEC&7_d7gFlZ2G_zul^F$Lzen%K+r z$>jbTaDdXQTQ%qM&k8i6>7XhfXE7q?dZRRmbd|_=lL%=so4$v zFF&T9l5}}S!Zb^&9k!yyZSfGoSz>`AB!HL)6R;GhlH5WqS*gJJd;H9i8FV!2m&Ox zy-ionmabMC+3G|d)>h{~nr_gFg?-0{WRWUazW5^Ut9wJ~T}e*c9hjL@QtA^?U9x<@ zD^)+3|1|b5sqp@)Ea-}-B8b)&mVXZSNAu&)U3-$5UfSQ0R0kK46!N>O%FLeJFs#8VcLo+%UTPYC|5FNOb0 z#uVVm{gRvg zE@x{mOoSS)3{F^EuXh$&4L>7&Wlv39hX zJ1fQ{GSU3tNM(zoTSVRMK+C&`xLS5DF}$_ZHJ|H8H>)Ri6>ncOXL*I?_VRCfW`3*O zGSR66Kr<)5Z<9~UCd1o#<2u<}gJ7{*#?aj4y9JR~6RwJT@sfy%fj_OQ4a`EfU~ix`|IH^XJdBWVFgS-Q>DuU$>ZaEI26%xBi4xsq$XFizuP?kUr;$~JX}0)- zf*wlXkgqs0V^$1dp`YRLj_O+l_Cm_N8d@$cM?D8Y1eqJszhbSZb%e`pyXEJZcI?0h zVAcaOEC%l!NYMMNhlCF8mYW;b{sX-tjP=)yw6&V`XA2N>tzBqJNa*8*W-pS;N$u$j9rd+75?4 z`U7TYEJ<3<}m8NkL^a3T$sV0I8LO?@=llKW+rd1;qB#S^{gW97toR^=wDj5^s%X%eEE4T zokX?sNxv6*or%@;eT=71)9^Ge!wJuYmgyXnLRW-uB5N`*!(bAOi2i7lN8Ay`R*-F?Xbax81ZS^?dL(PGGkZD%pQu1+wNk8=O z$wGt`CRVGzZso!%u^6gTX@%OAS;&p`T_|63xNBV&`Yzn(*1?0RrEjXhga(DVILe~u1=i!TB%yM`>)-jUL0D02W^iUoBdb}# zJ9`Kyfug}4ccF32N$=06M?TG8PekcUs)!I3eW6OB#4xe=d7#{uF(oQ17$|%pcaOCC z%~gl|bE4%5avo9Zz9+1ta!gP;`(S>7uDq=8l846+aX$Boe%%Ei&!?yv$9dN0Pbqn^ zoQM$h6PCjbm^NEPf4|l&xc%mR$BolGYu(qvlPCDCv$jwa`V^Wi_%2g=0DFotz#DGw zu*Kzod_mvp>7rxVno7+!!l154)OP$9{0|>yF}tSm_2hM`6v$)@ygkpX9qf+Awsbkg zYe?+@A#9vZ7uo>`Nr0~0^>3rvq+m-Bb(_edxMQ7t;L*+5hRm9#1*}MfjT*RuQi%Vi zBxhn281}9cdHwUtiUzZYWH-lIYK^|%6Uw6n@11e$H3_r6@3nmEb*%`Q-km1_R=PvH zcdiy=C5aQ<-bij>^1M71*Vg@ox@fie68u}58}^jyKnn2iE&v&ScOE9&GlLqv5fZ5! zcok$Jfh#~Xe-%6%IR&kSzSwjdP;jd=_))pD@qDjRWfq zdN4dJxab$PUa?x5rKi~M+P(b5pwbKs9-Uj@Fh6~K$1vz@x>~r~f4@;~tjbC=ns0#MuHhh=5(L`|Y zX62xkJ*eIP-Rm_0Tf(h6h3a604ECfNyF8$z37i9_)&6v$Csw9asbCbyIG>>&vVCA} zU-NXUR{wsgLu3kXyd>Rf@*|tp&_VM}e_9>MF%OUoE?M~13mf>VvhetT1Y1{Gsll%^ zJVeZFAM(=BKd)Hirv(4`+AG?tTQMlCVFxVUA*!2s^taE7M;$j9oZT+=I;BbP`%gpc zT)_o5|7Z|~4E#qT@Kb+iXUTqAgUI9KRN*$Ad=vs*olmL_V)3|p56eBuNUmY9(%iYO z-zu>812c@5Ex7q+1sC#nb-jSuBEGqhm(i(>`C^8-qWH_&=C8bZfD!UfdC@(gYTcHO zPr9=W?|K@e-PA&<5 z`HxCF*yEa7D>~|L!vGV3Vuzx<#m@9DeE=0;fn-p!AU&MD&?1rWJnO=48gPp~fvjJP zqA)#k@b`vff=){7V9zbaPEVq48)|J_Vfrz;=+L#}P^Ge@L?= zAbDAkR|<(fue-%l;aRZ6RMTSsyxrbOE^dS&+(NRAAM&~qv#PbgD^aYlbb4B;w9`ka zYA@~VMU!R6Fm}bCg03TV0gaiNRX#=vsNA7*m5@xP zfgH^Ot_8qsEV^hmXirq!aW2tzBi#b<@BIw9b2B7j$>dJn3D1J35&V3t-S+oKrslL& zNPCpWcq=5{z-dYj^%;ju_a>deo_8#lc)Gc++!5 z^K3k>Xzc8TV7s{qP1v#Y46EbJR#F^jdHU6QD4HAqWNMiH9-N`Co+>11 zIkJpIgsiw)r|YY{hG{HbbdgHN1T)#k4aa0L*NK1RquW703%7RsV2{X=+2s<5K_1;d4Qh zP}jTO;WH9T3%tk3T7EStAj&U7Q=^0+*(dQfjKPmxhNw{84d+Wp z4}&JODE+(C20=BjZz>X<0Ua?3O{(_|MHq-&*O906*@;iU>BNxnA7Ze14H94wFl_C%P6ROmtDLA8ZE{36Aq@EGw8dnNgQr^w;b8alXDyW0G|FQxahZCh25*# z)-tpAM{fT}H>K3`??rDwR(#6xq~ic+P_h$s3;iLFrI><`jiI0i%0a)f8fC@IVJm~N zH-@-SQ8X`nu&9I~=33hj4lFEF^W{P=vP`(Fj)g=vbf7XL43v%O^d??RCgs$y`dr{C zDOd~8=f}pfwf>};CJ^@xN!@%TI5_0Y*W!)`hvZFHsDSTL@}9;mW{F^V4QU;>dGG97 zporFjH2UDsf9k=6j$cnA1{Vn@sv_aJkb)yo#Mf%SK0?c@sIGw{WI|5ggij^LD=yLH zS;2fi2$SzK>(0Rv#AN$~yXxY2Hh>%+&%z$?G&R0^O3+x}{4zeZ%pM&Mz4T2ZlBJaX z98(p`bh7WKAm`fK`-xr?If)thUqOd&iwS>GtP9Jz2#=8visEVS+89_hYY#chzSbpv!8HiFLNAGS5pH@u9ZTO4Wt_sa&7f3^4U=5)_4uu%6yGGC!{V4+62eqWW2k3~U`yf5P%g`ivPv6+-+xUNiuT?AlMyiYOW7k1 z;hd-z&L=04R%$q=Lffhgo{>Sc`^n@XfLPUMf?@$#o?R`8O8f>pdHNb}G9X(;-|uEG zy>f?k;4to+Uhv!X)JtJ~;JuH9imqtj=`Rm6hBXlDiEz$&(3G@H8muYI4>6|to@VJ7 z9euLyk$;YEdVjp@L%-J}_H)MyzIfW5Y2~uA+v6!7+j2Yo!az4kz2DrIN>fl|2R^gd z8}Vc?w=T-Tb--d!{n(qZJWBI@FbI$~u{%*y-7Qlycvg<;V{-MWRZGUDrU+R2h5#k+ zCr7qT2<5sHxb$HNwd?k%Ih`R69ivRP7BelX?;PkpiStdg2YjezyJJpEMN90=z*BED zw57NENAWLKLHZB7Q6Ursp(-x)9RLiIYW){S)c^fgIqjp#)Go}z$7^2S(J%Spv=kqZp7y2%dN7KI>*r0&?xIAn@q|7d^im1|&o zGhsu0Yxq~#1&;eYY(%F!9T3n|#dw!PY_zOz+D4pXq-BXVlHX!mT#PbS^%dZ(hua1* zV_ple_-}Y+qqK2Zw^4EAhfT5S60f6@ilRQK6ZMx_pK7>?3L!A5h)w=%XsTT}y%PPx z`N=0vU{Ru&1!m zdkzvu9n|B z5JpX<8?elpS{3@iCDSR1!BNl}rM32E*=tGxSD9FfFGMLxg zs}@g2LgAsBn9m>VKC*r6aGnUG;eC`n-t5lvgJ1J@4A)u{SNt0*avswUVYxM-zs!GY zbG}G>=46jvkUCc(>|FxIdHR0mjfx7hqA5!kpf3mKIE<~I2;}XQl;K`PCDSf=&gk2$ z*8f7fP%yE$h}mxMTf?YJu17Z>uBpTJ6JxSF+WWTO=?=9@P2Ue2Z*I~Mz3T4cEQj0Q zlQ6Ay5fAC@T<_ut2L0YXf#;^=j#?Q@NiBI?8H}?nb2Q_^t9gKnqwX7Uskz9EV)ry2 zbH;i(61)FsmD*7%Ms5Gkl!~2kvrlCcCY#m_%N`W;eraft0$mxUnxJhE zxAVT`inx>0zrw6wpYnLM4F+J^{B$sT(_qOLhf!eC=aer~Wpx-xj-Y7W#@=Se7=6}9u$y>l#& zj!9?y{bt4so1U1^kv$^_3)>0_QWHl%t~VpGcN10ndn~0dbyfZmvSL@ zRRkN|hK*wMlf-|D?<)1z?Q%cV#ho;Tyl1XYmgL{6ejc&{!(duUs%#;6+GH*Qmk92( zzi^xg*~nVaVcAYg@R9PL^M@VZzqp9@J`ZaFzJ(jvcqkOo-_vXs&Fy6v68t_# z5!>&;UR}E|q|X)T|hw!fXNmZ~E!}AShS-8wa5DneUM!&LIBj2n>H4aM$DM zXr+5E-SLvX9ByNf5|mx>Xhf*LG-t>uvpFo0Q~5?1j|gj16s+NJuvp3R5pC_s0}|;w z`Gz4w-1d;ZJK1G_rz^`4?)F7W&c+Uq?=KPBm^>B2TatP8ZVShO9$9Jfo_R@ zZ1N;sDG7)Do4+<6Sh+Uf06NkFZpY`-L769f8F$3+Elxazx&kvn0E5q&uSP!O6JB5w z;9mfvyqmYM7+k53#n}-OuHJH~@T`&(csudrkU4QKjofI>49GHK)ps(^sG1JkuX-S* zj!sjxcur2^!qGZuVlX&;aH#Ietiunu>xl)K--&Q0YnY0^bC zBcw8y<}VYyB^7d4{k+}=DzGJpc^omrfSN*j<)hx}VR=$9yEv`|_DWbxKmIS0Rgwk63>FO~kUTZqwmCA6_unBDIan>!;a^1{?ErGakth?Mht{P8}(b^WQy9 z3B+Gwc?T!fs!fe2s1MgpO3K3JH)?)_)6EOtfA~QKzaI`O0D;Imvq`!XQhm7a3D|~~ zZt%o-P76cO!z{y>_n+rmcO^xEO7>!L9d&OE)DAx{CcP#SdTb!f;sFsZ4H zO$>XU$8JA!OH`z)Q}Wl1@I?f+1wTQ7-9MlG=c%?MdVm;3{u*?*~t?0pTyN7G{mG||~8KvaxnhEVQuz@V#TWiq9Sy1T`f%av4v|QWI(NxQ) zIH5hkGTtygKdQCP#h85=0CcwArV|89jVV=_kX3zr+?ZVsi#ZvM!n#(MiGi;bKNX3W z&`-=#MUade_W$x8hDfDzb}Qo!`RhaZ#->rlp{peNYduR}w;d)l2`MBC!c?WJ;P_q> zVH8C^uo%f9`}8R_06bXcRCk1R8_?TD&nBk0vC=Ie3jOek8gf^5@$b`}Sh>JOijOWu zK*-39Kx9mOnJc;PEwa@|jan^x~_-E+MAlLuaCvwQtl>8KIb@0>l!z(rr>ALe#guOScfH3f4-{QUJ*9#b$E@wuq z8pp3C4~sW}mWAm-B6;6{)$lyCpleutgOeX^iAX6*Oq_P4fC9x0fknh8462YTjA&RJ zX$yQP+>1v4%KO>R8(|0A{fDLh%o+0IPko@5?7r2re{|eGmbZ_Sn*<$EfhVarTLiDy z1#|ZJCrUcr0M{(EZEJD7PL&(mOkOdiK4Ey+Xa%J|lIxv z#QLgbfp%H{x?VrYyfcu$tKQHTmk^Fv!~oF3pOPJ9cXIUD8$v%lU!-z&J${mR6sv&R zGA(f?JD4Cc+KbJXiN|OnIiW(Tv;L~SL0gZNDYq6X4MZg(5re1+<^HW;4Gq7xI2L-d ziPxPVSV47`BVrFqa7DX$(RRv*JQS7F45Z)tXrmALV zGQN-PyEA$U2&IQA@p@=j)l`2Iq31|rStExF{PdlS9*yNh#9EC?DCDaYOaP4%0w;aN zGy1Dk34nh?Tw$<|^`6J-WF|WK31cyiG+GxJ=KH}WfjyEI1mJFY>fM9<@bKQm??gSgEr%e7}y-!#WWRc=PqW% z5?R_0=cVx=QOal%@TZgJU8ReUgz8zD)p1YE;08ic#x7F5tIlrPwa877`I0ib%=156 z;DlA`$hX*fVH=1J_iJO@^fiCHlA5s(Vag-r|M(l@9$lieAumbyfC)@CAp{`A#<&@( zh!se~j}IuCf~o%_P(f!-y--IaRoCe_Wm)YBYk+dzm;Y}}XH4_XqUt`5oqFtKUo8A( z86Nniy(C&ACn#(1q~LnD7n~GZ6~Yng2StxzKDtItLiDFru}!{b1UiX9t*BxfR#6&w*6!jC5E11=#ZuQ=X^(97AIA4tfsPo?W24 z*K`xuDY0U~>G@mczG|2RIm)#$28mc0muCQ3oA_oT&37~`Y%GPXoIMx(yXwlkmVW#v z{e7We_s0gD{k*dGmf;68SZev==tJG7@)oe|PI#rT`OOt12739~Eo?-^qT2l#MCzIJ@D_sKBVGtUrP&xg6`s#%T?vTj zOw9e`|D@tR&S1ovx$LI#itU<_wlX=LnOR@O6@$YgRf7;;7EHHDKD=>5%g4xp;`Fyh z@H-l@e`kF)>5R8#|3F$$SZR@!x&X7z7?DnfO#`TGL7sv2iP3BB?^(TDsRy6b2!;9p zoz}fv~7i86^op3eR-;~RjOi7NR-O(c2DrMzCNK@t~nvndqS6iRt$jy9JO z$t&Uy^r+2UWv`235^D2aIS%77MHcbBlTOKnpeE-C_|wNm{HNXUtye#8(#MvzeEs5r zrl6b0=UM6U?~>9QOPHjNHRy*K%8`|p-DiuzRu7Fc<>lAv`+(?J$RLZ4AsL`ozX6W} z)&8SSCWcOFp-EhG1im~z4CTT^)z$MUVWQ<}=qY+?Z6h7a6)Nb7!b<4Cs)jNtlqv}8 zOlNN|(`R?3P7&r6Z56)mj&?k=zJ0Wui+_@S_R*Zl#e3&XhLIHh7hJG0x4nq0$eSk1MYIXW+cDnu4A4{iuIYitxK87icq9Rno`Fz z9wJtUF1Wz_@v)Na^;_2bva?Zu7#P%E_86$HHA8HVlUyHYB~DOl#86ptLcE)bxGJBS z8*0x+lrfd>z!r~ldD2njklK*$%w+J5<7#%5$uj3)t~|E>6zyc$m>c+wXOy0cB5@VT zEH|>Bs%M*SDZx~r&#t0V>#}>wuu-w3xf3I0^T)=9qUF2i zn~?=V94eR0TwE+DH)k=s6DZIV8#Vi0B0slfu2c37g}Iqp-9^A1RE0!PKh zjw5Wwl<{UpfKz|3tZQX5>(G^dyt~7r1f0WF@+`G0|4|fj74xCt<_XGdT1vjGrc=SS zv(E3u=ocDgtg(nDZnwi=;7K*qeICjAg>d}{OAY^ocNDV=nRIW&;oGWG?a$qvpl|O+v6ED1_IR@RfZ)i zz!XdZGp!Pm?g4t=TN^dqIZ(W{l^P3(DZ=Hd1x(H<_E0e_r<+jz%g9(*S{IG+p5`R| z&lH2KkWgqzEEJGB%xiJmET!Rp6K?GOF~A7toEk;JHq^4CB{l?OdW&M8;w+gtjPvEP zVyJ5k@u&QV_0lKZD`9=N?|6xG@35r}rKK?Wz5hMlk0QLl@nJQ&z%b5wCc7lPQ_0rF z?dK$0e{b9*9mx`6QCBRk6_q`Ek#YM>S)L`A(_mt^sN4zY+gAEM3pB_s>;kDOu(g9BJ1*wd)jSXc2o1GZPEw=GazAE zhF@nLxCh#%%IEBH-Tjsz-?nv$ocTv-n(`7<>!18u>d!tDUCB5<(%Yd-6HAS%hXO40 zn)LzC%IBTs65rD?nU0|aoV4C*P{jx)c)w3MLvophEMAdN%NwVYv6p6rHg5P}x<@leq`v?< z4GhZWAT%1+B(o;kT~+S&dPlt>fX$2W;EVzx0J<|7KW^XinT4oYTbb<$RUw{ms;PK+ zYBXQsd(>ZHHltB$vmsj_t2^F6dRxdv=Q*Q#~D-;^40$|>Ejj5 zICX@Y0dM-4wrst4v`z)2@3vqMKh5;L&B&Am{SQn)v%jY-m6Eqvzgmxi5^|5D59{53 z-~1MAIJ?Ei@HWLC_*Hd1h1{psn@>LO93ZFjQ2!qGl0pCTr4ML^$CfV#`saFt(ULc? zh!^PtDHVZiaGSW1`{|j*_$#5twV7>CvdFpHwZ@r=WX<)vk zI;BrG9X<5|y>&=jXh9<=&_<1l=#`m&(kx|sHE;j8QbgI*=Y}%!S{AjMv zk%U^*M~DxN3UI%P%RyLc!m|a%z>E9hGV*}H^Phh~5l_EZnFQ3wu74WL;I#37TY_Uz zw+tte7V6l-J7Y`J?ghq=9(7<^im3)2w0T_qv414|-jV^r0yXtq{L{p2qXNyj$N#d? z2g&*6#lBy-aH;kqN&G%6E-xX(eU2YMQs2Vy!=`YST+*jd>?=$Sj3_li_rT|2H_QvL zdDM{)sRVhdQ)}?}xe^K?BZ8$>X|biW z#ojKB)Kl#RVz|GJ+)o%K(?4ttH@34zP_HA;q_!;&c1FqD&DRK+FISmWT?XrQQVBO5R0U3%koPa5XQ`$^d6eT9c@1oJ_30SSo|5K3riI za+g#MT0rg#-A=92alK}LT&Z%@BgOeyti9YHcC=8}hn~RZy4!4GnyrbZC<7Pv5}5B4ZXLOGHSz?jJU5q7&J(WWf3UC>Aa2UQSel%9|T z!qD7hAhQo2X3RArtJ}J$T3l{JR~fI$Q&PEG!QkgyfBWt6NGj zgSg;I;ME*w8ooJ>MTxYDfUk~bn{(5GXOTP_bYB(NhgDz%-x}RCq0*!8)_tzfi+s4m z%F5wt5weX?6Lb=Uy zmvRmjP~W#WIb;iepE#=l9f|rRudCivS3Fd=5s+th+P=~UvYKtUIBa)XO~wbTDsmYl z(2qSS>%JtQqVWoh{c;15+G;abk%}#oQsrNC^Aa`Ex|fct^zhYVuXy{~<*t@d-#XqS zxyIlbWrDgnkqYgr>xY+C?p%9t2}>%47?=e zd^7hLw%p{}s-xK?x*WtB(1lCLQ2Htf2W6uNB`qiTz*>Y{Y0~@gmG1k6d`PFG8UpE4 zYBPDH7NgOJeRz4eZra9h)|Mo$fP{0*RoCu-8KK)+S+b%&5}zYovq?HFPVceZMm3%; z77pdQAYplbavhuHrXSA4jh_zLcX|MsX5v2A@!D*`w<$!E2}A+06rcfma02>%!~@i; zcf-cM`WaYo0SEnnwk+XQ^i#Nq%WEK_di&u6WvIOPT9R70>$ifbs97Jdi=cKm1(4?i zdHA_j4b8_9l>;qIk+=vxq^N5P{+Bx|$+_#N8GVU=dTfoTH>_B=Ef<+ecYH~dDo33k zwp*iB&m83a_a}#1Oincy1p#kfFRr!bZAcaMJ%GbWu691tNo>uwM1gPjUj5IPpGA^R zy|RDT%YrL~peYX0szJYSKJ0Tm>*I15+YW}{NiWOe41!)p5jN=Z0|U4GEe*8%==ven z+6!=hV93!?SL%W~P&rfuLiUkz5SFUk3pi*6`V!fT(9g^|^n>(L^wV#(8h_EP0u7@K zROzOLcoDH8M%iYrUM{#QQFAJasqJQ@%}p~9O4<}JaK>-j6F*H0IV5+rp8;;zM1et# z$))mNw2=LEQqJTK<&npPau{-x=55VmVK|w8;I1P^28AkAn>BI@M2y=ZN>{KEHEeBq z;TD5#re$snuTyA#vZ#J?h;ktHXbyUrbqF9WLX>*E3M*Y3)?%PdDRz4|91e(x=N7!U zuuoEm8(y#>YuG6CFCM9b+n})Lvi@VNiTA^JZ(L@^ih}ye60rwMCk1I&-6|0~^y3qM zzs7&>E7-5Yb-bY8iOZ;uiHyUn3K&PK;g+x36v6kQz4V#Wf&5T(b9+!fR#ZqKXP7&R zR8L-^T0kz$7lF6}DEC zxU~?3dM}+tXXLsU;|8MQ91yvwj-GaZS)Kj;_istXN17l{^(u&Q2#!b!vKKM$oZwE0 zxvaW@Oxv^dz3X`0AN9U<=w^CEz zRm!DGPkrZVYL)sT?J;0-a@uX@1!1}i9DfU($^pJ6{dK7Aq0%BuN z5qTPCwA<$RQ#{q6ua}m~P8el<5Te|Z58V;fzGNyy@gzto)g%9@C^-S z5wV1LcfYh}r>$cq9USt=b4IPwFhsK&06glHxHve)gCK0F=~t>$eUUQMAhR3l&svP@ z)INV-*@F$w>sU5gOPT9`t6xQ@yPw}g`$Q*{20&Y1i({{xE1-W0xB~u@Pzn=52JZJe zfM%nlQ*aAMF~3CIuf?H=Qo>qw^)}26KslWfziuzz+VN(H{zJ;kQ&sg%x6eSfhyL4r znywiaqTvYL7MYirP2!5y;33koDuq=gW~;nyF%~gS6a&VZj5))9JDmGUlRV;{(=b}? z+CjrALm4(eKvgT~65dktxuj?(JBI=^4$2`_Ff+#BSd0|`5wAv;=gTL3L4{gHrUvjg zl?7<=5BZ$Lrh3cHS(x25H2)mFSg@T{5s-HdnLxl7R;okJHh6_O+jiog68+Peneu=L z9QA*B7hI2$yE|on05ca!@WtwzbIQcAE|P(Ef&~DhCNnYFX3MtjLgX(T)CQ<1a^2?g zj&ZKU@t$>>UR`GM)!oPNbq=E4eQjZsz} z9;kjURbs?qO)9rrhFIl?XhAQjA$8~JEoDc3ErcL7LOJMvGG~y&75%~`QIYWi0!W3k zU4+nYVaa~AFO_kIkUT3hGNDRH;| z%H<}Q-Xy4n-=55;k9@NrXwmenig;6WeQXnSo#7D1SfT4*KMe=c8Ar-Z5#Zr}Bg1Wi z4b(mZxg2>O>}p`JAZP zY}q{Amc0Iph5gx^wjHNrMN}uZO`zx43}VFKMvc_|l@!(@$jKz1*eEX2Lhfes6L+9A zsw1nI7IeWT<0!Y0v*NHoh>|TxFEBYgoQ_a`%JD$h3}e`rP6EjXZSbQ~0=PyfJb{Y4 zHt1m=vY8;rXWTI5@Clhg_3ae6=CrvFLU+=J3f=zh5ey^uHHGMZ*q}CJn?;7)+spTK z&lL;J4BE;-op9cQvJ7r27RIg*SZ@nF6r5m3_YGlnqo}eU7p$^@#{!=TN=do_kc#bp z$7(dbe1ZJ<6Qr60rOLQswSxUJkrXw&+Ef_5^g%3~t@+j_XaK6u>*Z{s8{urW3j#6n z%{p|Oyd??4u&P?QBp&IlZT-ln0-gZ5IzV+3R?x!xcGC};nhf(Y2`4ii1; z^U^T{2=KBz?x(%F4>L)kS!Y$JR@!3G>*G^nwos~Z6E}cS0I`#^UZ+qhq5k(Yvd|Py z8#>h&F)+D(8__09L7P<;wxLl(_wqC(lzviYq%=vhk>&nvcnV%wx`0&k zOHaXPE2;Lt5t>^v$h=QN3~YH@0Xvwi9WuqNqljk5$k1RZE6IeVARLTZ*4BlDn;d&{ z(}Dq=D(;YgMaqR!9ueQCdXoq6p@Ny30f!nY|GdQWlO9-&=qop2n4uPb3=gT1_=(kq zzf&WI7wdqlQpJNJ{(9I;;l(6n;56_rIYdYyCE!y!RpdyGkeLbD{Mv+`&Gqw*Nji4J zK9jT#ncFf9cL>({{)O}lmxN>&xt#KU?PTVNxj$f3k#{__?1aLK0xv3(L^Tzq;r18*hRGFQ7>+k zr<+LgP~bm79qSRg{I_9$7t$K4J}V0zTmw)Q0F}f10{v4Cqq#!y-?8s-mF^-1Cjvj~ z{j? zP@OzN*~L=@0ZuzoYeLNkHxDJAX&0!;)erh@Zy(^STC2BQMbc&pRO~>UEooJS_3F^#vodka)8@tvS6$^FnBx?4iH^oVm`7?pHvVuH; zySPjYMVgPmaUi-earC0Z?0WO`?U;^>dnrSSUyK_FbC&}tQ~~VvNug9O>Jg#jHlEkH z8V^XhN99<}Dd`oO^dt^k9vdl^h^W1UpQ4)%d!>w{{)Dc7b&`aivNH%UVcHqQOFM%^ z>UVJl=_+TC+DMBtp?FhdX6+kn5*)d(rZ*4=^@Tf%)5@@>)d zei@<9HV;gHLH}9C`CD?>KubMxeOb+w%f$c(6n$%Q6=t9^qIMzo(Ja#lY6)>?&$ihH zIKfsW6*iYVmN2@>-7vn}4CQvTMkAZ_rrE$OLn+J!J5f-G6n}*af37wQj5LCAE$-Cf zDd85xJalQg15aRa2&S3j@tP0_ETU<6&D^bmB4;OmDRSWJAnrE#*7_7rnx{R>V@}P; zV8#Y$(Kt{+GhqD5T#hyU>L_fVNrg>(dDiLvH?m zxEOPP1Oq!u+*8(bbJKm>?DqP7TS6Nd-AnjK-x`ipQQ&60MC8KK?whqK2ae>lpp@Wv z6MaXTh>$f*-K3oqqaS^x-Ks3Cq$Dh@8dhJELFrc7Tbdl>T`BoOCEyp}Nz}GR4(_%C zicE#FzhNA30Ix}yZ$pRqM#zZZJJ;D-nh?;Cdg86a5fV6Vg@6Nj!`lmf1YWHO@{xhzTUp$TQp1W3&v)z94!!Y+ zH|L?UawgM#uTABYvAmWaHzG(XCytMQPgLCoBzySqR~Gj7@VFD)$Nrs_>H%=^2!p?A z!C!=f9E(ulqOinqIXau>ic^{HD5F!L>K8UqWS$c9%@hhUsTex;C@d6<UE8^%BYsW%_RkV z4T4$8TW1kgXoSS2R2$MPBvL(ygjbCo(x=5#qD*baEHZPF_Vr?$Q>&q_DzBlzITX`- z#qqqDysd4@rGS}K0N*lma~k1)aLj5d(WIf6`N+(&MU$R8&vFQ}>pQ5}Mj8-K!?E;4 zC4)557o0X+C+^!QrLuMF4fUhwxB0$j(Wz}Z z@$rxS(7HLBBj>i^-TfYpj?$1J6Kst{5T_Y1fWf}D(di|3u1!iAA)FwYt-gGLKlbCJ z9G7N;Bu62aTfE_`m&j)1uDhM`5|eFOiw?jwx#%e05#&11EEy;gSpp>4T9=e6|N0p= z28#X9DWuo|1`tqoK=XTl9wKzoB54{WtGwohj6yp+017DBVZdqy+X{ss+-mI);bO(D zLXlbm@{H!FlC>4vlR>7EVk0c`%t$-53Bsw6JGh2Sln&VfDLYAq`(_^>Ylm%8*v~WM zQbGzs5eA}VbtJ4V!Qu0PgSucSM0*xY0_wD;4$MB1@0JtjW2)PKUbj1kU8$xMjvTe; zMid+sw86n3`=81!dM1S{X1{k_kxCL`={5Sv?|R_9nbiw>rk1@?e%k?;BmZXfUxf|X zlIvMEXwrscY2%xbVLGq3KFIe#_fpy3LfhrcI(oWB8ILoHBTdMiw@DC&LXMG0A1=wF zwZ5}Von1ymH#o$9LKZgG$vTOx=U?U&4v$VCh$54Z+LIiBpxEIAAdv7=YYUj>q#TAUnd6565LqX#QIM6dR90^khDK6m z*iAcU9hAWIH#*`z=PtXmE;)K3Q8>l>ZK}6^uP?hhFssIY1I#ImbNGD%N}B;FRV+@~ zPz)DR%BS`Wep-D>HXiZkHQ@&dTV-Fr96h~ZiO$&^k#=9+wh6_(=|L;>Fn3`Ya>7_G zo+(4^vQ86e%wpk_&1DN=l^JImAY*G&WwBjHQPVHw_c@yo!vhTng2SFcr4p?U(n=d; zI$Rv*@{nSG*IwWc>So=D`Ep|ZrOcJ(~SdxGc71v&AYk|9TndsB*7ldpn1aQoH=hnbsi?$AOLE#v^Lr*e&q z;Y`qfZ`8xOmZ|&+rT>1T=BV{1+EW7}x>hU5(5zL36K(+4sSrJq*-}oqwXs%|Art-| z2J>Wb7h6{q?i%3wL;{>?Z(%OO!PvSr3u`4_Ug|IIpZqalY}){(G15+%M3lNx%Z?`F zfw5$qGiECg`i)}yv$nCs!CV`)l|9UbtnC4RThI{$;K;GoxFKv}oW5+FI(&kdwJIMf z;h`SNFQC*8^{#m;{N?^)q~jNK7QY3cd8(Yl8Bw@~ZPTCWRwhro?cNlww1_xOn?HZG{XZ&F!JpOGnM%@=7updV$R)ygo7G;2p+7;Q%zD zP^mG?bn;PZOle?%QjyxsUD(jr62jObc(4Q9=*7J*LKJokZNLBi)c4`yf}ln+8o|M+ z6(IWwlxUWJmhTS3FH1594XAy5-BSa9Zuj6LS0W7GiJCy}VT95Lc*L{zfw|#((?LGE zMWW`NK0DE&iHQ?1De1K!+uL43&4JpwjzaXVH&VUx@Yr2rC(j%|cI4+(!o^`x(>8y^ zLdB>ZH3jb-mF^a}escIUj7z8q;l?8YNOcDp$paMAjbVRF(&iDE9+uR3dt=Oh*&9Lb zEr6|!8Pi^RY%c<<5jf|l_Bzp)C!p1u^#Y)i<-eNh4NiUevv5XS^MvdK$i_I+z5o8n z(|a>u9k>j`QF3cM_9mPqFvpdNOdiL55p0Jb%HmEqc$O(jC^jHEWtk3222kaZPrxvA-0Pko zVXUpPNMVL@c4h#yi4hmOjoKbElE#gpzTm+~XW*^q$gK#HTalW4>W0wWl9aXkg3aBK zTxC0Mju9cgAGF0EGokNld+8o7OXU|v3SdLr_Fr4KKBzKXXth1oqyp^yXkzIH%3>IT<{8Wfei&I2q=VL9#F!4+6yryp7 zX6I9$5D226nusJN&~kAW_Kpgcz*dIj1x~0sH$%nPZ2&nq;skOIjvX1B7~6ydywP&iy&Mc3gYKbq{mw0a&u@YdK4&6gA74`2MOkG5C(DJHBpfb+o1^U^;{v|kF8S_>hXiw6~vqLLIkvsc(>lA zf@yH+RdBPgyG7O}WpKFJDkG0=7HSAo{&g7nUji^GJd?l;5K2ls?JSM}l=ecslZL1c zRU*+C$lNdEAUJ@P$lIsy5dRp8sW}0XuKJm~j^;#Dl%G+5&)|&+WFvy?Mg+1Egk@BX z-^~I|Z0Pt_I$?^m`mx~~78N~6jO3Zt%0)ZsE?wu|m<{Sadxv|TY+B&{rgE^jo z`}Q5)vh@%xU!o1y9m-t-DNiF6(#->@2*?mN9*2`LN?HfN@gmMEmXAcd4R{=XaVtdb zPAoZGe=rn(i|9CEB`r5MqZx!rj!zsvId&RVuSgG=UbwUW#9;^f0DV~{tzU9;v``5j ziGr7~TgE6bOAf~BhLW@IrI<84m*4E+x~@+EX(D4`J!k(11E7V}U=#cSZvJ}Eo4;pg zc^|=GU9PROW#ksn0&{f|&Iz#l2)sfM!J1ai{>=z~9%;DaDE68MkrJP(4^%)`_!ROb z7^wZJx2?K&pu-gN&P*xsKH_?g$P`PNjo?Y5-8d{yG)!=xXVrvBJ*`;keG)=zkVnoW zD@ZV(;k&7kCkl;tQGb%4Ci&8j`jp2peQ!4fH!W_+wz_|joU$GaFb2b6lgIunxqjlz zuM=;7gBQqK{N|9BTKx|WVF|MN&ZT~lThjYYHq8_uZ@_yA+LSH7)oTUK`B4@N49Rdi zC^Vo%;{oPj3vUg8zY`fl@%JnME_lcZ5X-_;B)NPENcdq!cd&W+yVT2A7o+c>BEdLO zmas=c*hTYrJLvgI|6a<}Z?FT^(^5LI4Rl_ATPZz0@=tL49}d6F^%r2*fVu5^&`-`U zzk@vVM8wG*pyj|d3o0^+ymGYgqjc=nc5C&zR`?DGr?T!scC$CM@(~Sbj>i!)!29JK zovzv(jGZuh>7u|YA-NdPX`@jDWJc(vK5$1;MMC*EQTaK|8o8jSBFM^V13^rA0Y8TL|qz?!CDw%y&}L}<`wrYpeNLm^vK-$+P*#z$dyuk)jE9<)qyH0yYh zglOb*K=k8MO+G?o4kG_la;01Pu*PAl2zn8bigZIS!m<}Gzc#O&7WR?PmOjT^FwTvf zKv8XE`lAqd%4}xM%v=fFh(33J<1|cg0u*zHQ{Z6ogXF+3jmcXKp?eJSBYXggGJCKn>NnU2QOoA=rqXHcU@|dB2S`_p1?&N8c z22ADB1)QGQe2TA`8%Xh$5Onq-Cw|l?S1y^@UTZbOX10>|4%Z3gR>%i@F<}L6v=bCn z;!|97=W#w-Ov}kCc4lB!F~yh+NGPU$&CMk?m126ZBiUSHcLx3(sVPl$yJOyLFe7;$ zJe}?j{?VKutUEFfeVAK+8~Ft}6vEj(@fJg6S^YHY&H?vK{ZnFZNBXY1JKdKFjPrWs zB^4vjB~B}Lrmsyk3TGhFlF=6GF}@&hZAzu9Lk&CV$_t4{8?0JGk~Kr5`0ALd%&Gl?N!Qu+prt8*eTO58*jsq z?DODL=Q-O4WfnyFy;-Y|1ycSYyCEs%>1U)Lg9A=jr@z(kTZVb;*mQxwA@e?!95tB> zla|^aC;pESL@I?}+67zUcYkrT{;#DV|ax^V!#MJ zhW&-Zrc=MNbdfxpI=J@CFX`Aam}cP4N!$LcSve<)hTt!N#IYWzyURL!PPqevH}0L$ z+w-&g??+*O&A6g{(3`MDXg_o~fn?uLHy4k?((vh|lil0454*aPUEB8D;&MO{-1ph$ z>)6(j#l0TR9q1T}Fr+uFyGXi2r9^o`$9iNBD8M-q=sE7yfdKe#pk7Qd`4#(;{2b1( zlK~21QLyk`>_lT%P`UE}!*;sVP z3@BI#B?pT+L+fENQi@RuQ4peBd}jUL8JSPMX*}2YDUJ|KS*7zIBk{f=$@|KTW}(n2 z#l@|K5dZ$09O92O$s>uO=`4?vyNCX7Do0Ar zu(2wCV7-;s#h!Yl8Tf@XAYjz^uf_6>$ z%|(Po5ZesEwwB+ga8v6vDKeAvpH`Q3J5aA*7pOFw8|vnGEUH^8&_a7_=g6_NE7@Q_ zsmjWmpWNAOB20UKo&6Yv8=D;yRZ7dR2fbA87YQ8{Yfl{|s2qgSBL>E1h$*I!<<`nU z6-R;79oqa3nO#U>usk)Uf-~MHDv-2`Hx7C|bJo_D^&bm#sie-tKL(%(bhPS-wUHa1 z*?>eE)*KS(>O-~GvB}O;Qlyk})l$lBuAVc3=#Z?qS+^s9SmkI_=QxULjgVuYKNKNB z;dJN*BSQ7boO6phn8|V)OotTnb0s8MMpeFyMlfBuK_nwf{-N;{Lyis zm5EEu!^0WXBx(ZIEA*^{8`K3>qD!>HI){TA+p+P}1Hwti@ePu!;q}f@e1PKW@w<+V zokWt<2(68O5Nk`R<{{OPKSCB+pQP+@jz}+5XM@t6$EwIzg}T$|Ldmpt2U^VCsCjK< zjD){5gK0raqMbCrP5HfmEps6jaIdhaon7h{>pBpFXRx436wJ57+*f@?wY4LS^{taI zw=#FWCXX>v81L4}#4{u3bp{woQv3Sl8Z|jg305J0jyB@B-K}ih$_ZDy+tCWFU?i{6uq-T_?QEIU}I(~f*mpjxq zH+O4)%}|og9C^#Av=ct0D*JY4{fgHOTqoO*VG(#rpDBczkqvNxE=}#!J1F&@knaRJ zCqkY*={#defAMQdO~%6ui6T6NBJVa>MBrCT4(^#zg_~2z-5W`JhfS^drFm=#gS9G{ zJ_y9^@rZ{pd>mAUiMG0*^5{|Q48rSQ3chK7*$b8;ki75x8%62V%{kfg)f2?E(aeCR zFx3gJ^~V~K7gGenrVX@0VvksJtN%-t@iIq|huGCsGI)z~#+N9Ke2O#= zMhVu^`feL~RkNcc5Q;NP^_xXo-FO}viG{hK9yco0n-*$||BGUanZ+^d$OS1rwA3Mg z5lvEwTh}?NB|Smq^-&B09n_8lDrjSFO|gYk*P$ASY_D(*H@dUhwWo!gs|~Ln&FNjB#5}{c1YJGE1{Njkko6KkruhTW z2M}Txt1H%iE*_a&kYue@D)lpegS;fjX`@vt|MluqfBfgCPdO*(CvpmXgK9GCqEl7) zC6vOMUW9z3O0Dx>uRe3pfz{RI^|0QqM?ooW^w5*_`fq;gP-5Iy5I_lmjZGR>lPR!> z*2_;m?i?V?042lHvkrU7=>PfB2Q=Gb%a;S|jXJo=M)DHY^dh|lbu9e$Z zu{&bL4#bK*>A6v#Eg61)3hrdrt@ZuDhUwh;Sa3#xD4A=`uBzYGHE8$O$x^oN@1{}~ zuV_G}EO&Ck9qU`F41bUSPMf^ATJ3DUDDuQs!J=1?^D!90b=;x;;A!Ts1ER3GN@FQaFi!Fkf`a0GCvN$Qb^C zK2^y;iLg(sm9~*IXBgGBDmJ0B3mQKH><0M}Y~ZeNT)7#n<79A_4f@Dkwbv`70OA3H*Hl2{98 zq2GYs!$(?{|(MCL4co zPTVx*`G!ZYllt0m#b7#(G(TVz>uc>0$kUhrbn^Y#H>@;D2t4fIl?a8dy@c>8xcd`OwVDE$NvBdO$jP1QM!h$H1E?u11 ztD}w$EaZ!OXHiCyK@Zv;V9_ajt^4p54iF3&k%uH6j?+7yWXS?G_kHdbPic#Su-1er z92s(p`%)W!#=BLSgc>`ha(#>LVGA~;w$2T}z<+lPlQ8sWkhsKbQf1zy-Km@-j%Rb= zILaZd9IJrDUP-2y%>k!e8DJ+DwGqk9BM1H@j5d`bfjdv3+f4yrX0A3Y4??fH;?9w@ z8<5Tsr&24Vu0AeSd8&zYaa6f>4s35US3Y&}h$@SJdwhyQGVmRl=HLNRN12uukfQo^ ztm)IYLKPuIdxLVL<4=zuUapKjLMp2?61%1a)k;$3n?^}bQwY#uxrQu>XEAj8HHiW> zuUWI|__NVjKbcj>y47G;tpc(TsxrH*s{hO)!*yF>{GNe*?D+QWlZDkiv`jZz{^n zN?K?$^1L;)4mEcQ+(Xu6K)nrA#O764%;-i$%Smc{Tf^T&A-@j!wvuwMb{4*^B`By< zQ9P*A;zud%eX2|j1231Tfw&|(jwbo6o7ze6CLLTmAgiM%ypwBKOl!=v3QlP-)txYZ z7bfEvA|=aGB_~pa&Jrb4zTT{wEf_&GB(XnHNxq9Q>uploMC#;ww6RzpI4)48H`0$K zonf!oV^Oq7o30{3h1tkk%K+kkGq@1XzvQ$V%ddw{v%hd!4$#2W)B>96|4Be2n?*b{ zfy}vhGcdz9%?2Cej3fm*j5;!fyZg+4SPIn`8(6MeQrD>FbJ5lJ>Xu~DtADj$5~)hl zsv6^wbn^dtB>ACbeCgvb{`)+Vv>>tk7x=Q0=3$-!@oe4AckG#@1|**(qaKRbkMgB9 zl*vmk1vG&dk;ZB1ya}a*ghM4;wbj7d%6=<<#z6@IleUA>_C5!tlNx_0u_w`gc!)g1 z$-XxsxJbor<3{6k+mJy^UDS2$_{Myd=gyNz5ir~2QuD-|lX4RRkxwERGuFlwd9$dm z5okbJZND9M(K*#=N^S1jK(hVLymL7A$$u^JGZ^e|W1Bm9F3@kbl48+h!{Z$)iP^ME zK3a&i+(|e*R`}tkLy6Hg7k3(ePnsCcE#&{pjx?s~1Xwb%2UA!pyT71LM5hG%6ti$y zu1EN~Jyc^F{LwbDqQRHNoYVk6L}nB+r^G#z@%KI~D1Wc_XKaZyWjI>lU!I1IrVamV z$q~!|An`pp0%>=VNxf_25J1FGENVvfSbqa`=mUUH>WJThg7omh31V!2L+YgTQ;LgC zL6xIz_S*AIcz+8JRnr6twgHj{ZBp)hc|bi5`39`dsO6ffk7Z2NWXVtN9E_E_aTY|< zD|qTr%ub06s20%Vn@A;2evrKx)o|bQEM=Vq7YTEFA_Er2a*tbK9e(x&{3a%rx#q3``i+f4ZbyV z$KJa)$B|ukg8%QQDE71&Rbp1*!AFw?pzrsRRUFHA+x$FivS2BV!T?fW5TgvDZCRNjjgb0twNT^3i&Y;8k6DhAMDllpuWJ& zN7&yv_jPXO&8h-hAI+BC3N;AilW4HN3dm&^8j!&-XM)gZeWnU3QUf(((t;Vq*7A8a#)9# zhV;ck0mhff^u;e4&5`&yh#KekM48Dx%qnV}(*d0NmPy%}Enk-s^~EcHiF*j&fDF+3 z?8VPHX1Q7Ugu=FVVWj$RNoAWMK7gPb;0wju$i;P=s!WPsbiyTE14@1s%X|W}+q@vy zx49fQ38;kAJ-ik)F6cdNYvi0&{n%TAk8wsKjqg(w{dxKPmz9L@AA3CEFcgoQ%Wrhv zkzWK^Z0kvy;6Q<=aNL}K%k(+N8ko)WX6(>#cXl3Dkfcb$*IOS0*2sy6a`wYY^%F!| zkX}$I(_TELtSNMV)E*iUo8yascwBbzC)V8MVL2(lg|x2F;efqh*q3)4IIEr3x(}S! zFm5QDT)#68<1o|Dju|dErLqg9;w7v6hom= z;ZEexgAx1|8gWk451i9VJ4AK~4yiO+osIzFy>6}%r`N}sxkL!!^NYDaOY_i-<3cy3 zogBu>DHUqM&0ny#_|OE9)^mjDdM8v1+dXp)Ymn=oFAm@gDGHYN#UC}uXInsmKl-1LgD;&|qp?Sp zp$a1nQmy9cGVdJnNxo4}#MHJeNSc;pbM9-n+XOw>?|}*mmsIz~Hh+?rJUOXBLGldE z7q7ea%6Y3|mdvR>fiDNCPN_7c$LN*i?P3Xxwn|yhva^g18!DwsdjR9;lPAN5Zz#P6 zJe5wBc^fDnBbk!+OHmp}HesG+Y%VCL2 z4`Qr7?I3d))2x(;Cw~P>bekIscamU4u~4p2?XU&Y5EL)qao*QLQHhFniCCF-)zKaP zlxS8=Vj1}{1FHKX5E3p1n>J7PKGdq`e+V%gDMdS#Dh<3wr>$Me zXnkt<1hA$%ZGXy~-)m=|a%tS=$c9w(RY=9jVkvZdLnxYpqZM|dVIe4ifWTY5s2D84 zH$tHj9IOOZ&S3P`-5>RPuhudiRdy?OOY3rvSYJJKqiFN@V^ZQbZU ziit#Trrq{H7tO73DoUWLDwo~)#TS1inf~|U@ff)YY^;Dkg_NZK^y!I48k@}d9Io=J z12G>|wP;QM(N_*A0c-f2GD-%LU)~haB*DiJ4S|pX)TyHqH>z%~Evt-WO1dhKCCo5L zz($Nf$03Xe&a2BwxQhUVpFZ8OFe33h66PUAka&gC#Mwq^6%b!CirV+sCR%?OPIZhE zeWN-?Beh6lq80CS3~E)~<$X~0h|To6H7@xQ6TS*IprDuxnLfH)WO;?UkRgsHfq{=J zh12(*JfYmOofvfJF4oq7zgzu~!VoxUrb)}74G|U7wQlz+8QpK7qEU<#-T;yhhfTfE zcT|gACR#Zlg$|$ZMViynQC@#GHA2@KkUZ1D;Chm!loqynv>o@54K{@lbG(ZrHOwbS>(7ow}x5R^VcEQ<>b;s}{9e!w{(AHMi& zqo~;Y{D|1kIPKsu96<=CQMn;G*ayH4mG<#_bjJN0xDFi{pp!qUm=S-TJ4!>Ds06p^ z2&n;6llifB`5zMc@cB>MR2=Ln7Zj(` zyY4l1UHuWB#%WxH%WG;l4)%-E7p|*{RJT)QspkN%TUAO4$!Q+3eL5+mzOhZ_7}>my z;vRx7`Ef{YZm5M>CntZK>8Tj)XSj+ffF-+%vdQ`HA%g50Y2?*&m}=w!a}Su0$|q{M z1>A*kmP1hzyKv)4rvt{y|n zNA`CL|4|I%$gzLQCUMUQCp5TU*4)7!>-O8wjuBdDY5WS3wAxgqG<$-^>7F69Cr{|+ zF(OKWfqmxmET63}xhRz>30_`{ePu#{ZZ?iB8dgc--PeMoj<$<#>8QJ65bVdq61fgI zZ8B}!2VUB)hmC%9Y+>GbKxVh1?c&Zc0tz+&2`C)$dWwHCS0{yp**A31sSzmKwKW+; z^a`TH8Xp)?t&zfOKOU_EXOE)JHkzpC->B6fkmh^@LDfEQeEbbf_4;)@5rA1agDl+V zWbtBCfH7YfgRy5Cu-=RkcXrWelQRr>NP!Z=yEGLE<8UGE&y-ZJ5L5m^$3xTECqw%F zjRh95oi=|TrU57~U#EB>LOS*8L4$nIOsb8*Xkx!^4R7_4v1(b9I9cVGp!iD^rKG>) z+)3onTNW;|08xcF5$w(8YXLfj>(8}gY(~M67>u!aUXWW52jRKbHwo+wS?bxp>}e5r z`^8_gd!3zo&7K!qLh;~QSx~+|X@t|0I+s<`^96q^2i8HU|ST{H_=y}evfj7 zoyavW&^db{FpR|9P~#R?tP}HTcrgT8<=`^Q5n5GEsKuBNBp%k7C?5cDUtk}Ljw2>L z!^^bO!((OS!VZy25lG2ZqY6V!;K9h^x=sm&Y@atm(HWtU@*3$b@$YKS&;)X)khrT2 zKfHe+OPkWe3ojt03lv9*AyNYMqX*iKu5DL_;O4eMAP5{vEJr6J#XvVF70@OMTA@3n z?Fx5|^b>h=&h~9MP>`~bif5rp5KO~4Z~)H;(NE4%1_f(0CBw2kXFSKhVla7s9d?kI zcQ~qjH@~6MsZ7H;_8qs8+@s*hM800i*e5P>o3TI3Zh3;Rg}fL*Aq39J9A(>GV^W(M ze4Zd8s8`57)E>!g;~aG6t_obZ%$K46#TJ;<1OQrTuM$Tbn)C?=MqlG=H-9|p>Ij~2XE4>OFSU9Mi zd&FB0Dv05azCblhrzY8=!RsnquG$cSkbwpO@rw(X3Xih0M!eVV53~owfpEc`%f+b)D&k+Ok0{DKXaSf$iDPaT-5EY=}EUs=+qBXgO4Imlie~;l8{N=60v!O^#QLr|w2`_s#FdF)N32?Z)7u zoNy=Dp(~E7!SI9?^DwchSAqXVIjIaCI4;vq2K^)k0G$AZCPn0Mf_z-yEO14tZ1X*eL(bS1iac))?_+mdaHx9A zSyHo*LEyqol3zbR>Y?Q8g)Ka1w5-@9j-%&+O(M!tgRE!;%mg@rXb=*Jf}?+xy|WC) zTg}{#VoC^$P`m(CK&!v*{?xdk?B+ekVl0ZoAipE6o_ocfNQP-44I^x*c^eQf@b^d$ z_ysREmDuheZOjjmN=7Q9I{LCXD9CEUuab~ua0JJTDtz9(oXI5X_M*$uPKAN|EbT}l zhx}&E)^fdzQc8euW8+RTfIZCx9NMjaR!+hT@k8EO48=5S0RIop8S@wCjQ5TiGk3wI zR#2X;56=G<3SL^kEFCDkaDo6Wmkzcgg-Al-Yy&0zu)a?Y0mW)?{Av&oqA?7V)PMqw z1n5Hnvk}9Wr36WqkxQPqNb!4yCu9Tlf-KOnMR7gKlIvk`3R@BoWUu&$-RoL^hEp?z zVfa#^igzhdUA$OS(+zcqkejg5&NAf6qf;0Y?f9JnRUx~+7V@NYmlMN%l(2T?rNcOZ zdTT$}x{qEa4`KBt=?=+_wGEqG-PUI9W``D-Anuexs%f*`LzfvhcGGlsK#rBYg|*LD z$;V>aI*#}+V*$q!DDApwK91slmV;(1NvU(ldY`0d9j*<|G9rdftH6Zl@f#vWU|{ec z@U5jGpw2?py9!TeI<0SIX@f`sV4R?P=lG0sJOXhi9g zN!GO{Il;APLi1wyR?B*`nn*0~Cek{o&g0OE)Gafs;+_IP;XUoKaLb2(j}5VUf}V2K ze=EGr)VT%c5o5!|fNhh$JTAuImP<`C1GxBCr#kZ%=WDDU7)h8kNsl`L#6!ji41^K{ zdz@ZvQ6j?2ephHdDGnQ>Oq08l?Y(~1ye>Boo1{ctA7h`&W3{o?1+$nUHM@*XMBJ)w zK6yf(w5bf$F;NS-vxKXEg=Q64V3-y$%Me=5Gn{R0&iJe`o`Gd75n1Ag`2av(d0rO! zAj)$HBCy;ZQ|+|UO~t!Hn9!;Es64-|$)Y^i;V9=<^72Mo{gbR&9NMnbPYQ$Jzb%JA z?6=P$q|j?-hvY~xZnL(vY991^mI4YOizrgOGGjf$EQ|zLs8K3^aX7IuW*elbfp@9R zLVSdnl)ps$936h;JkD}8F&eRodER9MaK(4a_?OuFR_e0cs{&tjPDGnyiM6ND-?X%v zc2Y1{8Q!2~3KPTAR{3+xT*GK6T(g_OE>P_PLvWQkA2+2hKI`=JB6n1qXhRjc?p zOoHMSWQDRctS*s%0ZQ=NS@8CpInPJCyVJ_#=m!*o>YqyNi!~3pDJ^7rF^Er}f%~D0 z3PnKd{9)7vvSNq|I1D>q_y$WcDp%NTNfJu*IvI7vv25X8&!_TxJNSnW83{~nexC+p z3}!--rTX(s#L?_Mk^M;Q-dA;f?SkUu*(9qEM))12^#qOT8b$7DpmdS&T_RuL=~#BW%5Y zz7^?)d3uq5`5HA>85_h==a|!6Mg?mh*@ow%Llz>zy2PxR^G=+k0q2%6?@RJfJQ^~p zU38sJq61tQpn?jehu?ol^%yuiUXIb_q7b^{FjI@=t*h^#6y6UrTO&e$7UexF zqT=HAi@zba{0oF86N8$=ZUUn}-a+U-vZD#qp-X0e#bOdk_K@xOrz88*`bt5?mIweitz9m~;W;g-^O;!sd6PLGeD_m_*&ejZ&CDWAk^T`{6ep zMTdnO^v3pUBj*ovs%WZJaF_$@1(9R|P)-Va+y)eQ+(iCpg_q+x1!3g;{Wk)fSD5(w z(=qXX*VOXdY$w2|kLE zp{yQBC+)_c-nqV>?hO%OkF49B8Y~{U1)$kKeY$J1`X8h z9M)E(&~9x7r}1vw9-(9^V?=#0KE}jYw`je8n13Ae;pH7~EwqRIg-1&Zf}R#&&!I6{ zJm=-j^-o%np|PVc8KQWkVltXQg6jP84k#EdcaTvsZyUd{rm7!+`9Ax}P$PYH(fb4; zNx+0sp=3b15vKHCfmNbw{(TMScBtS8Bo~04da2?c0*(Ui%dM4`KyV`|gFNPQ%!8+Y z`m2f+RScqSG0LA%T(=y;394OS`2M>(has#w$H;1k)FHcTIIU_^YZpu*rhE|#=2%=c zz|BQ?Ra=E&Q8qGL?ZRR|XD*Y1a2E#Zl?HH~nSWt61>Z5b{!7Ak#01HWcI)ouJKSdi z5e;uRq#^@iHi1I~#6CqaMKxLGCV{zsnS+p!HcKfz11>cM@q-Iaadu>b_FZukTe8Z$ z6_ry*w&QQ7nadt^Re27=;pp-uluB;x2(Yj$g3!@LRMuU>d!Jf7ZXy)KabMTNxtE?N zCX6b+nnM-u*4B3A5l|L%1}t!NoiWttEfF<;+aQ!P4MVDSJ$sz{|o_n{4M@rBAJ{D5D?M-mB6K;P9xm@((9hw_a6_C zGrkV^Dpwd*=pgFJ;}ivlaT&QVx|0!HPe}7cATOsFS>;M7Ue3p0BA;!fb^vAiuL>=F z1!Vy%V-$+&IUMW1UYIoWw}Q<;T9~NHxVGXc^DgRS?6Qvm0fI?eFHmBI^Smc;Gzj7C;EK3@7WR35x%m*5G; zB7Z!BGiUOB|0vbzRHwip#G*2+jd-W&m(Vl;g9GlxQVxf3UBu|Lp z7ZzTR)3PXwvyrujADup(LSbs@8MmgiAoq~QF3+XxTauWBY>q!pn_T7v&fDt*W~Cf| zBS&pq!H&fV7R=}=vL})Ee&U&r6o84c(|`3TmESKa1BxY_5X7CWElpZjOXq8brg3p` z{yDP8#I(thbVt@*?9hYyh1a$VQa&p~-E-Oh%B+auY;n|92v`vdr)U>uwJ+5Wh-C4K zLl74dqV3zV1OB8_c`whG-qRMpOhiwhV4((76=iSkuru>nOLK^g8)zJ?|6)b18h<{> zhN(VaRR#HSdT@RYB^BKEFi?Ab3SwMAld~W>BPj(b-^5>)+P;I`;DgC)kKgCm8=!T? ztXLT+G?6pG>KKLPnFez{Hw-pBF%Sginjg6F=65O+uC322QV2Z42zur7x62q;LRF2-AaRBmy!oc|$fA)qjBbuh;U- z+u=%c7xUiWc=L7db3Q?Xt^&xEWdtMKt{E}*YZ(DWoDYyibS5DAOOp{qMVXRQ_|1w5 zAF)29Y`dr&{Et+s#%erDI8nk1#kWCdXj48Tm`{IXvX8u$P;kW)3Mk2qH3NNp+;{6N z4O^|4w48O^Q&YiXZ(SXG&SB;seE=;Ib`e3k3ZrL}4T2P{LBL*w>=+cGjB;m87e*fP z5B`#o6_D@t+!w-3Aq_OT3*06Y5J+dO%DQy_&9tde(jP4js3rI3M1P^twG{+Iw)3Da zy-A>+6$dtjcTzCupipovf0$X!Cu_M36%vwxk)DFoW>mRz;!Aeg>5V)d`>qrhc}3Yi zSN3|DCCK2KL+=qUN`@1F-HsI8lElg!@{QHqjB1x|62^saHoxptP{rs6IKp%)CI!9` znF2Z_$^HMIqh-3~x@20$T~ z+C+&G;t#VTQ~|p^%r$J884x?iL?q{U6>bsIfp)~HmN)9ztzv;i+?Q+zB_R+o@)Iuci+4?7=NX$KdN_c z-ue@lSbsvhF<|0h{FC;zTTVwub&3DM2xDZN5*8cBgG=Nx!H29wP^&)9Szs(fRe~7f zJEX}Qe6-0uW;#DVC36+<4BP$rdha+myHqmYRD3UYm$44U9DmqTa%Au=2ah9ZoQ_i`k?IS$dK_&6LQJSwq-{iA z-Ykf}O;%e-N|PNgbkqHWvQdr~bk21IsRF5je3lPIh;<>SFZ&~q71L&BCB*0DUBH9< z6n!ptU#p#)>vdBHu<#iGNhDqxx)B zXM?|wF5Ta5BRBQvK4hW2{&*atHS*)ZDjc^ceetQ}^y!QMsz`c!58=C(GJ}G;6G(SQ z?JjW9Sv^aU4@`kFC2Gg)(xb#VU&Yw_$TvXn)7(Jv9>y7%!!&2v$jXX~xvyYpXZxF^I81v;2c#RaBl#`{Z99+KrEjrvB zRfH`qN0+D&#vOmoAE7QX;>(R5_^@<@>WEychXK+5NI@P9_(gKFr>PjV8)qR@Rv2AO z9Ed{dMOVSc!N0-EDcA7rQ3{q9SF1@h(%ik$Uj>6Fd?w-K?-8c5-x#NRsDHNlVHbt$ zC|g1U$iva$-FSei0Vy(-BV%}fm~D+moz?dUw*KBd#4 zuJ*OUQ#%?}uZ~94$Tj3*icwWNt)ZQ>2-1Bgq)H#T9^{$A?LWk8y=nzl!efm6Q{O`f$Y8vH)Dw@9c^e^Qv-%czV@f}ZPovK>JD7}j_8*LYd%1D0 zvA6(%B3sx-V!r`}o`m~1^@V)*ragSGb`Ju|ExpJUY}TV0=y#ex1qWRK6NEn(#ojr~ zw*r5ctBrd^QNu{V%~_q|Zu8XAF-7+r@!uO5Z8O2W$>oN#@%b*UZ7r9sJl2<O=+$SYU@IRf!ssmdnkNC0q@PUpgmEFut3A3?`1xWNAskwyi<*!?bpqg8(} zSEah&2j2x>LQ-IrTpt;tP&0;)vhnJvCF=Od&S$JCU(csyOL9tMljmPiJM0VN3=#NQ z%)6)Bju0_M^)fPjIDWVY6Cggd7-bEpGgsT49+!Qf^&=N8GH~2LJ{MHkfSTj}T)M}} zvJ?XR4iObSK|n8g2~UkzNA)b~toDEFNi>*EvI9-B<7i-rwZl|8SsfIqbb`K51O>LE zEJ~tr)FDcwf9a%E%emU3Jy~5kKRl=*6@hqZU|y0BQ%zmUrG!lKg|C~?MSf&7+8cUF(Wz)>VmzE4a<2pr{)k-!qFp#q{TXPew|wWYR`AJAg+~)IjB7Rs{)9VU5YEnXo$?3cG@W21>Y+=MmE?hqSB#WiUojG0-c$NM$d$ z~73+K--f=f|LF>lbmEHkk5MM~~Jh;Rn&z9=s;!6C@@k)H=jNxc#>rDKO zrDf_}c4mnh<`i`K-hv0vu+N^mc>XLnzWWY(mYumsJ>&O|kI_&^wGPg8rb7*3qDwlQ zx`sdsed_RdwY7n0fYpE2)mAiFMaWebKkN`P3@7_$x{{e8q^oHCOs0pB$|2B@MNjbo znvsXe`a-=gLbEFBs_B_K0ekPzR2Y@ zPrFKrV`bPLjY-nG`km|7_=JWWz>EU*u899Q)~c`LDzYPXFRPMuA5C_U2M;!0#7}i% zu#u(Zi{DsUTt0t?^97~h4DZ9jL2t$?jSNwOnlQxd%<{PpjdUvrYy<)uee>+f$PgH` zU$du})<@sqWyki+U)CG6F`SHhRl*A{t}Qm(3((~>>+QR4VLfu)iqB-o34A75I18(c zUYP0#t+eh!FymjoP4?1if3@C+M0WhBJ*wQ4dIQmW#>Ib$z=t@Z&}b4PE#&Y)u)+vc zY&=6d%(ZMjLvteG#4zHPUbZdBJi9S8KdSDOj_y^QQcdf^3rSh6l(-c*ZbmqxG4-d^ z!Ae1nqijsMD+nBgrWaro(65c`nQMC4%mg_npj{enKYwubHHpxXgd-Q{9uTSeEbD7U zpv^Dw!3uwIo(|`}1}fNdt!>^h#&dkhYU?@6gi#G(ywJ)4c$iTOz<-w)&s|)prXO~m zJQ;u3p%qL&L{91P>dki6Yp}toI{ronbb=N-aBQUVPKrC&$z$B1p(y1e#cx{e81p;~ zFa)YKR?s&FCz((oz_nT0L)H-bs1~tk{;+&~wUK{lUyxjd3Fn+i)rJ4PvGwm48u!k; zzYw9w(V13*inOknl{6AYb*q0bY8&W@TK5OTc$Xr;##H~Yzte}piUmab={}|8aD}9D zG@#OGm@kNeQ~Bp2O(=GyL19?BlQ*M{vRk*KYlVMXRMqRcs-}CCHE$fRjwuFU>rRx#g=aZ^ z&g1B#@Qu%+Pr^4wanvt12IIh18{|~H(^?=y<}NcB;1Bvcl+I_2EN_8F>DC~QCdFIu zpG8|cF@pXJy;77BBehB47S?7rUOjcnGuc}oUY0(L6ZZXu@9$E4{C)k@3Xb+Nm*amO zt8lN~*&4<75Ux+>2vwgej-GsiG34zkTRfK5+HrFn6Fb&_S0P2 zDI%NwXswPTwfyM6fg+kn>w;R3DvT0tHN;wXD4z+gw)^VHKaL)qVDy|9XaVk8T^@`LUNuk@-I9bS94|!B%B*Sjmu)(e&%^1pUH!hS_Edb?4y#wqV=0PhNkyZ=7hE z+R_~g6EzN3N73q(jaToG*iKd>L)v7eOOYJ7pR@;{bmR>wY;-m&Ir3ny6rS50wI9WU z3cT#(IIq+zh?RJ{NBFU)Fsz~$>a%~LQmj~HT^AMZ(I53&Y?X4Ybz|k?!6}3`zxY1; zR6A&(->!^bK6?(R#`C}E!?=GJHit z%CvgjLAVnwus;^0uMq-T&dWtz--6*0#agn%)%VifCQl_fyH@&7o<3>MiJW9wr zg)WkuD-6>!2gj?;gKJ}O;?11gss{%Nc*@|ov8jWDQ5m9?--aC=)NSg%aO=(Nz926i zM2bO(_rrsLQ*g>4M3Ym8l427ek7Aq~ z1vLf&@miZYfH4M;Z^VBNU>2cKnQ5G2w{kBk2RCe&f%SvEo% z`O0qp#a|ub`qK>0Dr~ndP`#p0`GWcYuZbGpaJy*9!S9vdprHtfB4EvX?KP z{S~+$*ePltyZ8msRrLV)1oPKp?(omrlr{~?F}o8!ocWA)5a9|1sdJMU-LqdNb~LOC z0f%91LW=G5c@}@6n8F3HI-;IZ3JH>tQ5o6(1{z~m-yq$swzhQr;2Xeik@@)^;0mZh z4yRFNsi}+vB(=alh`b~?!~ih^x&-c4oQk*!Tq` zf(+IUi6&}q@;xaQMWeik*Lp&qi_5-X6rCz(aGngDfHK z&LQQ&sx|e)P*`(40^w6>6THuKZyG%Z>{Jc@UzSYalBcR4WFEj_pRWl%7S{|>QPJhO zrhU0dW|`6nFBkiYOL>(|ckRySlRnT$*dl7~oY{vcq_}=ZL``uCqz_rf?mt4s`umji z3LYY&ve-F(q*2{jmh3NY=!1FBr39~ zbz5WwpqCWb47*v4L2u-z`v5@SkZ}PAm192KKTqA58z9VHiY>(6})bY4REa* za(I!fu+NZ8>i~2-ndN!M+(^IS#CZ7}jwZLM;qw@|`BeoPtwI^6V%5r&h*Ro!C`dU7 zxa-xsk9wwD45K6&5E)AM#Q?Z*J3%3v-TD@cuhn|pDcH4p0^w!Bn6>IA>cn9>rglPO zFg1Sy)uKEJlX;Sgwzj}SKLNi%NxR3TSiwS2O5t6Wkn6*Cg4{lY0U&+hedIL7)?PY& zdJrQA5_$NM=E&rl7vpb3(>5apaMK08!cYNd!|pDzPh^&AQ;jj0w$_!|@@AY&n#8|% zp(+&f&K~2*D|q`ZnT@ADXE6-uoeBYV!vTNxjR0jB%q|9j{*M_A#|4loL*UaOpVZ?= zcw}sgBDDw5+qA;*k+rE*mXPzRO+H+^ycq0jO)a?9&h)7rmrX4UJO7HNb{SI(<4hq; zY@8hqKr*iMV(Wja=>IAGI7hNa_I3q`BH(tK6%@Yutrc-u+0l#FZJ_u;v(lbqseFIO z-aBko6#dJ)P><8WpuQdVV0BAJO(gS6)2t^Ssqe?z5Bpi&Hl*IciP{8^a?%kGAKSi$ zM%Zkcrc?{ta0(sSH!2h;2uThGfPo7EKro6}K+n2R9+^G9{mk~7$DPLaU)Y?H1BXI!7NO+o^wpg@1R=J3&b z0PVHwoR;prW{Zm%rIRttM`;$uHdD>!d&QxXHui&I@ z5XSiRC+rzd7=_RpDw5PW^%T<8hY_*Cgq0&H#DW--VrhuNM3A{aob7k4zkL}skRhHL zv$WY8Q%FBwUV9lS23+kxMTmb6Q%}@~xFixeGETW@(j-7@g2;A3rC4O5_0lVZQeO+tWmS;^N|Y86QJc*VGf`r${~?D3@E+gf_Vl zH*#Ad;7iBTY|7HJSn-$7{~q;d`|wxbnGoHz#*aXeM+bX@1Ym!0valmmVt;?Xv40l6 zlU)R?A!?1E@n(~9o}91nx9e(1W9;=9CoD$nI1~S>5_iDH$kjO$NTp;8_$WPSwiYXk zmF08ze=8cpdiW5!j<%DmQ=E{w`fV0HmfZjh9fE}pfepa`)ay5(eszEpXz>D?*Xb$+ z)Y!|gHr%{eSz3SYH5Qj{E-l;NE|}kzm+)I>v2w0)Zs}qjp$=y&7weZQ7u%N_7cZQx zsGsQk67DUZKVNTLI(O;D*~;?bV5xET(s`tV`Cxe+5qi}2`Nrb8<;vO068`?+9Q}fp z@g7=6`-^9>y)V@-jxSYk|Kf55UwK?O<%?V041l4@g|iVrd!!sg93{fdvS-|f_(X|c!QA}e040Y z-aNcbQqh=iaFrC@%FRP+TwU*q7j%&le*QjPH}PN7nUkF_KFlw$lnBbxhy2+KkPdNt z>CBc8<#>P7(+^JByI=o+=hJcyE=r#l6n$=@PFIMWX70DnE>pDX5F1DAf2-K&Z);{k zS=CEZpVJszs&lMwXm1mb?xBd5OgqWn-6oE&q7?aDDDpRTf}vh9Qk>>eV%t#-QAbyP zw)MaM;*bBYN-MfiZD~*S&6sS7aM#O|BP4S1G%tU-gkw4RNv~IO0 z@!`kLgz1tHhrXgtL|rUe4Fl4?ir=R|ckm#~AQ4LctG|Qc9ZBlG_`!>(@GZcr@w7sT z={R%9uNoq$@q^;c9>7r$G8$oo=r2VjQ>FA_0m6^M5KPgCF_nN|$Nw5XY)|Ki&tXSo5 zAYRObXfh#C1US!@+>wZiCq@pU1obU18FgyH+WCsQMfw$EXtlsT zr*NZ-Bv4}Rs8zCPpmdHULdwSAOQe7N6x2D0J;4)39zjOY^g5;j0*PUPd3L)9Z6hzd zb{m#XLgA<*;n|GeYhSm??Zft$2p3LJkSTC}!;?j;Tdliae1Ega44>Pa$!`m-(!60d z7cN%foW%Rlh>^qFaEjGO;yLBOaZ@|I~0s$%R#c!e6xR6w;`be zN(~Dg=d?z6PH8sQI;~3C_#03dMW~<1tLUjVNK-;)^O^Ff9G;q`?I1P ztCpUWr$$cBivv~X8vYEs8fpB0#S-(dJRzS0Y*?^#_ko2Y_c?~zwaP~0XRhFL>jPmC+rR{k-fb|AZ0)lD0Rex#5 zM?6c2Y_DwN$sNK*n7Mc#>f4cHQk#hU5kW57LlPsPF|?Qo@e}%o8K_o0tdT5qTJs=@ zC7msBLv}1Hgow1mRA7GvLea1TxOA4SL=9PGw)zbJfa+PDoCte=J(2i9`>WYZeHy{crE z{n8HKBNIEqCz~!dL0KzM-g$455a2WG0eP1o%S-FaMyF^B*Z6;*bo&7kN5JTbp`8T! z^4$6QJY-Yz}0TA*yCBXP`>+18R0$)+@}MHCRH86hH{NgTEQ zCUf1|mw43fFeHBohB5}42`4p5OelGfh2hzkUq#yskaqJMiO*k@^E6IJNQ?Y&us)b? z5tuq^m-wFIywCF-df0<&gmdW|Hi}6!T$D0?!B5)+uN(J(Yq@$bgqH{^H3DW_XiUz( z5nKiGSzKkW!t1PtA+4Oe3=P08jCusq=49A6vnsaXH@ANtH(qx=))9s=LL3m5V;vCz zD1*-7Z)!p0exo%l2dGslh-Y@j{#nSaQtVcxV&F-HeDm7$fLoQyJkYI~;4S&N(2(0e zxc0{so!m@G+#00g*!aT`B$+065e(Dmd7;l;XA{#NH~@N;(hFK-S67w54`5# zgjj#_^e`Djc}*1boMfH_9<540bBL;rglLK2~rNAV;0Xm9ZmK{*3%6MPvMV#Jv+ zHg%^z+G}!9Cr6n8oqoBdn{?=9S!8m60JS$0Q-XXB;SgCJ9E(7|@O=+tfB-(A=1(OE zJIM%KkF0JQke?v3P{8Y_wMD*E-U9?iP$2zN$Ps@*z;lmi-s6jmkJY8fH21e&PXA_pwgdAa0pW+FKc(&k{hw+W4R##$rB=P^h8G+Q4bV2dTKK7oI*w$tt*B`o0ZAy?b{+#(>AM2jZqLL~wF zn4-Vo$wrKLrH`z8$nRE3N0sg>D+((*I`K^mdcPq-0%~GI!dK6#6{Y zrUxTZ0jq;4$eCwZ?iWoMNn3vxo)TFnXn&c>NBad$RO>*H_k<3ld>J|Q1r|56D0%F$ z$>(jMGwzG|q}{?vss=%L3aJ$YDP)K#RjMR3STSyI<$_~7f`W&^-D+q^;Tlr5_B#(L zC|e9zYWbcDPAWf8%=pg{sSIOtI$j~ht&TV-5VEgEo2S?+A;>(Sisye+y3nYDo0;Hh z)~-cnJl>|DP=xY$D=1oY>s3(yE6 zwXp44n0WRC0C!~zl=_w-!<;M^l1W&oCU`hKb}P97MFkitN_>B$+X#`?+ru{*f$~_=nc0&5{qAa9{as2Rf_HBtpHcNd|8b47<7o>L<;7DLq|D^EtBh6;DVJJb zWmns3M`BiOQO5p}A$JWE>a`?uB=w|rFMs&MygFk*Px?Z@!-3_L*0Js#;&1h0WU7BF+~T+H$H;h7xP^!`O56n1 z>`MD^+&qgU?~Le2reb9^Y2vpeMOG91!i$e848>-kx*-mLR`ei_?iTNJ57y&ozj*5` z^tDZs&`cGD;hGVoDC-PmInBJ?1tNCABsQZ;FI0a+1KosC?(*jPCoN~xd5;70A-`-Q zWjaDWVW5A4sL5*S0vX(3MJh4-cpNaF_s?qgIa?Z-fQ8>t$qKLlAu5O%dIS8rV1yebyqRi`*K zb^ZWPJbzbmM5k=OM=-VRMyTG?%#K&?qy7XZL<(An6dk%`_F~*@5PoN*mw?h7=@@$? zr$l0hM087%4kdgFj*pKaY%OHQSfE{2KE799)o8<#`H`aWmdJ$IYahZ$_44_DLJ~g| zKYM@5R`eGzC#ncY+652gP|9{evP*`pA0dkrX$sS}0`G{#+Y$cD{hRmr}Er zo3}T(AK2ND6)cIi=1tI&SUYy}4N}lk?y;52W?R7fdV~o*Xuv&y8ivdUrZHr<5f=8L zKi5@NjVV_4FPkA#ubKw{iE)N!g5fmR4O4%HoO_qNWYH%7j9Heo+&8d=9!R>QE%XXg zliyWukUHp~L4sHeV=5!KDHod~a!vj>I0u7F!8?4x5oY>KW*wf|Z8qDN@MCP>Hln=7 ziA55bFTE8Phjd2{>E`?+0%~ha0q<{O9N1^P%@~_tWDUdV zR*=LL_{)9#gquuga!;N>uL@MAvO=I)K8%Wo`jH;00fnFxWA3Q-VOTS#QJmV|G^X*id3@WubcM1BVi&Q0XtRVLEDbd0S`nV)CQq7y^CNgR|+;@jWoD3C$(=kI^q0cTXpZJDP}-|*O4VRDY6 z&-HA~FIey)KxUsmYJ+Itko(>qTY-MRaxh_WLRltfivl^p@~t0;Gw0%4s+x+Kir(D& z3a8mx3u({)1{j$`cqo4}3Y~cQ{EvaF6W5LrZDHFy<~j4G5Rfl*7_1TR7b3dZZ>Vjs zgUplDm{xI4v*WKev7$UGYz(_6$^^sTk z50V+H^YXbRaKS3emWq$*lP;BK!+nF+rdOWb@8)Lr!0ZU5NnC$?^5m3~LYz;7pwt8= zMce{vw2;>XHCTSqnP$<|LK2|X?#=g)?1zq33-WYgr-w?ny`q#pmWx)m;2JoHseBCz z@Su{RI)GZVF)3$gQ(a~02p8#J>{2@9TWnS`yit`E*d!J4UWL;?6Z{u(`T#pp&L;}# zGSfgiIy*)JqN7HIsku9oSvv(D-C?^EOs9(TMTm z)`}Ut(#cy}nk3BdRXKT1k{`)o|0z`%ao1@G zpBsV*)|G#8fgGUCO2L$&xk8}XXE3_<|i+o{~rJwzW7U+ zL%^0!k>B*qvJkZa=HMjA7rNI@;N3uhaWJlFEQJ?%Uaq2AtJ~(k+U&(_E|1$@Q4<3G zI7G3LxPlZi*#s#yBeN?JwN>z_*>Id`O*&o`5i5V^=GFGOO%5fR<0CbJke*i;BfYs% zpEu&IHg2|282WfMCbu4y$6c(+J^v>lb$Ii2sWCQ+2vTQ$7ZNvcbd+&B$;?`X#?`UI z??#?u9XCd{(UmrZ>$uPzls;N*RhUCG@n9R3Nl@}jGB2}jF%~rbL&_fg^4U)Ty)fW} zJl}sh&NJoUBA{L-CcQ`JD4&3E6rm(fdxsL}s#!-jBs;$dcFyHi-#$CnG^Z9EY5OyH zu$b%|)kTmK2tWsCl{Z^|{-n_-^~hM{3|Uksxn%_)P1Tl?I<`>awPeQg9L2FKqR%{ z%w3hsH*P3e)?yz9ABs}a9xW0k7x+cM+L4~X84bQH!B4qygM+(DsmLl6zHT_9W4wPT zc+Q)FVgOB0RKdwHqtz1L3%>~SUM)H@3(nH4Jy2BMZ6>RW#}q;;2$e-j0+W;XLg@rH zNNVunF9AnKw&ovr5Ry{nn^-=niG7Nw864p>uBM2D)_NLa0~S?Ljqw-FFQ=M?DVI~- zvW9q@d7pV3F9m+csRmCF6Y3o@Zm)m70-u;A;ks_0kj=^UmrkzM+u?V>7)ypntV5}x zGx>mZ1lGI2bV_FMjxC7Po#wjI0BO6gRV6|E3GvsT4=X5|`t0X`Rf$+eM-Z*M*ngE| zm%NRGU;W*LH{>sJJGCR)2`PFc3DlbM+l2!vw{MUXN0slg>Kq+>@;mTW20DLczs|G< zrC=%==lv5bxIkOs?4$@{G7wC67T>Q5V0YGF5Z%UjXI~(^>8eJ1qq9?c8-q{JTN_#( zQ=-o~gxH&Klq-k-c7ElijbR0WRmJL{l+mzF1|Eg>StH0C#B*HGwjJ_JsSCygL@ok# zMS(Kb$mgOi>JDHzHwoZ{=b9@ zrU+S}0CjpPY9kMUeX!nlzayCXCUX6whG8Gbq=hP8)J-g(tC?b)mGpnZ#kI7#c+3#S zSnJ6Z%EZ9(W?~F%db;nUARdfqV{KqFbB@dE*Cu}BX^%$PYJx2HP9w3pJXX)$iTaoh zvgcx=M%midy=H=<;wb)tkQbeKC~9Y`*F;0cv5I!gIqzRV{U&$C218M>13-D(GlxbLnG#TG|)YP!>YrrO!8fsWUF0c0;9fI zGd7yBH|D7^SO`X@;uBslGJrgkXUL1w^z$$wU=vBYxB`s`aV)lZYpF=<*?tw z`XwY;LaNeyGRzi--XM~cd{s95C>RSVGM1@4jeAWM#(W-uz4(6&$HCgj%&bnapy<2_ zw#`LA=OdmuN}IzisSKk|;Dy(FDuX3{qmT9KTNlqif<0ISNWX4iGzaC0U5)nkF+BJk6cMvIc^* zDcm=h#;;aQytsdC6jTbv#UkGxEOmcK(k6-VmCxZ&{4q>+km~=4vVL1iL4T1Ds}SmK z0#dn;ltEgQBlum_7Ai0s+2s)>d5J0yl?zjQ?il72Su|8sbkhk(5S2IXGJK=^^4UKP zE9kcEJQX>}b-57D>LoIx{IE7?oJWAYYY96XG)^UP$LW8lu9Llq@w%Agdswq`g!h}bznG-$z9Op`II@vETBZ@oV8Gc7yf|;0K94`G z%44a3X)}NCdc8Sbm9KFOu2@C8Lu=I=9=Y#hph)wEg^OC+&BEmD?UHG;rw(sFZ^4%| zds=SzQfIH2C(lhEL9rMS;#OiQE3 z=bc6+mA{i&)C$3uI*BNsD~~R@mkp?GZVJrnFYkY367!uv1x1xO)a1O#Wx#l|oN-(_ zn_qmt6s0ux1hdBiX1sTB%&1R)xs&;E>15)VF{anKC(mfi?_~PS$G_YO+%KKLkKj_P z3?MFc=AJ(tMg4Bb&wTvLoxglt7VmNu_7AuEh%4ZOwaA5Qx{S7 z3aEcqET_@$B2&b)# zOoY^u(Jj5tjQnpnd6x>T@Lx!NT$;Y!oF#vzD=aBPJudBv|25=SKPQw}XeLreZEg6$ z$G(!ubulI9_u3L2XnlqdhzylONg_96rx~U=qq!Q`lo8Y?YDLp!9~Eh3kF4tyjbXRs z`bB9n{jPx?Q7NQ;h%)Z{3s3WTIm;bmwlV``8p*cljcqduIjQ0g&rO{PMyp89mPpprs(t(6(z4qvGhO~$P zWI&t0Po9`T6_q{C`^Nj%5*N+A?z-7?auN%p%4x*Bx-jDudIT5B#=_+s0Tx;_o7UUP zUR&`VGVwFz6^Spfz}~z4@nynGN^WWLmkY9gz(ywi$n}ValhF{ha}AT$e_EYfC&yQF zz{MgA`$lnk#a|3}(XaaarFHqr&FdSO6w5v_`!l+v_mA40`VYAc3O#qih~FnL6$U^;girYZA(>R{RA225A(A)qs|g-wJHV$`j2gY zI?kuhtERFzPB>AdA->SZTPinpPM+A&5bC{0&Qsj-VGP6%E6@ZhP+_=kBEqz?y^XhD9mn1pb zT5EUg7Iud~303Oz=JfIWYSps+5@8i6>op zWnGz~Nip_!qF_;GH3H;@YU5PS%IzOW)XR#@3Z<>gv|-l#l5w40+mwK))jLazS2QD-K3~OhapvcI+la z68Yy)LF=2|j8#E1I3d#4Ys+&6y=Jcn#r29^QcJ;wioFRl;TafYQ7w2Coz$W_3?cFU zn@=aDl0wcacv78|YC$obGk<&?!hYQ7C!N8h8;`XxXvsVS3MOl0?GfNS&=h$etRem$ zp>B@>$?bRV)tVn66@fB;byo3sc4~E%ZV(7boCI%fhZH4eGZA8;&0>W3tz!#3am-){ zPr!e%qjr)2B^sOZmhggeeM=*G^1tp31^S3;LVG)zX`sBL>QgW|aaZ=@ZhxXPS#xJ{ zXMAxiM&FJbTyQ2Gtu+#4&4%Vopw6d%(f0}%M@p5RkeWy)ZN#jI= z9P8TZYUunei2UMPTXExlhYGB(HQ=ev`knr;jY5b|o-9IFGr}y(B4R!QI;SB9JI8L3 z{lOWu8c1H1?de|5YCw|RpxQYx;n;M!n%1L!{j&`e((nyyvz9l{dqlSjQWGHxK6*7Z zK^7`InVL{8v^WZXaGfp_eu(aUO@TS9QWuPi7*O6R6{bBc_O0m)1`P-N#NyQMFu}-f z2%05(aUU@PeZ&-75fS3wul}x$c;kQcveGCYH07m9;nxq8QV~`M+DnBkYLyuAEh~}* z-|%Mg?W!$>-iC#6X*0EbpCW7ZQ7&tYFg(<+gt4Kn2?%q4twgYn5W!FZ?adr89!DFr zw_}Qs>1BI^Yw0N58>itgu^3M7Djyg=K1HuEsv86xlLD*SiY$IJYAv)PL$kW_DCLmSTJw$I zCbfW4<*9IgI*u_MNLxaw=BKS|r3x-@NBTiSv0gpH6W&L#NKWYUy{uFZhcy?N0;K}8 z0B@j0PcW6UnQm?l)gBLNZ;wBppk^BBce-XeK9?VAk)h;#9A+XzA14-5TC(@{WE&j3 zf~YD=iHFzSex6cESBUETD^fA+fmqVXu&zuRqKfc;bTYGO8%3+N~|ndxbwE56jg9h-x;8Ex!UF`*=3ccFR##I z7MQ<(w9l&a175CECsDYyFBiKcFAMS+T|9`#E$GUg!oinv$`MXBCqKi0im6h{5$eE^ z)`M!;s%&EHbdZ1E$>PzCg zQpj%)vk4^R=~8}lgebITYq{R-@AknO_P`^5dgAXx6sAMgmI;dFLIzaAZ%+PIqOZpF zjpC`YCiA!)TYK}SauZGRRz+W#mNL!ZSqY17y(vMuv$C#FZ(=ED&@ENFGZSe}InO~Z z&RIg$$U`=4fi3&?yENF_7$Gpw7B-`@*qimmC9?{wDch%K%8K9qT2?%%tQaO5kFN56 z5{*7_zBb!~r_W)cMwQ4nVYVL&o$ThtaNisir`8Jyil2u zzgixE4Zuv1i+_SJ24BoO;pjFviu|F;2|MrNbqE&I)~|KprEkpqAd$3lNVW*^|Ng^!-}rE07j>n9k`k^LWj!c+)F1pjgy4FA`qg$+ zd=^m5g$8aQkOuBy1nsZ1qoNQ%H2f;)Z8q}$ttxJmN?D|q^&*zYdGWRK)*p07anjr} zCi_=JTiK)vp7LfFnJ}qdR%_Pb>`QqauE0;(mQV@+rK2HeXZse_EsMP}Z#^zUa7L}$GD&vM^i(!~Whg=_tj6Ayl>%D7^3&D&1p34;k#tce4R@yOAPN1> zze&phXT+4ryEV`+M?Hl-`nAzO%|Ia6h_laq6|jC2VKm@eKu8cj;oLdk*STCkf)Ttq z4d-Mg1wYXE_4Mu=l!~DLdTk)M;wci_@Ah9jeZ7WmP>vLp*W@%pHdr`+=^)L?e|)`W zZ@&0%ge?5=>$P&CkhvlRQ>lP?oDi%!I)yYk2Y!-MBwhuh=t$P6#J_&}yZ~<+6Nk)npnz&GLXKUa&SjkDu6a)*DN-O;hf*7BoeU$h)f^IhjWK0u()RDF-@>c8P+jo_#&wMRvMeO>sUj%*Uj?5{VvS{1%6GCmV zn~=shFmDk6S)3|HS~ZHP`I|zHJbqn_in9?1;?uCiAay=v;kk45?&jrB?_A#4L_LQM z| z#(qR3BKmlFgbZGdol&}11<)heg$t7tu8x4GJb#RAl}Ki%6aEEe(%3j!zy8mE&^nGX zKzV&3aLO7PvzF)#kez^WC6qQ%g8*rB6htE?A!BTkuea`g@%>FjN8An(Ox$3LkZUs3 zqBE#qzC?@qWp1W_-Gyp59?#nl;s1;a+}M!vra|4L+X!((Upfh~n~7Bave|7O0~Rpc zol$?7_0vRlKwK7UiAkHXl-`UXB34&-vi@vZ#q!O^QL($DaAcq~{W(jlu@n_TVpTH? zv>-RH=hh{KcL|;%q{$N<7EHCE_~m0jP01wCmGx229-7&Ih-!VD&UeD0sTWT&G&Vx~ z$QF7!F$c-Z8`C$XbgP>H)1}7w@Kl!=7?iy*LOEbZMS1mknSvP*OO1aF84xgsvOq{4 zht1bc#(g4h!iVM%Haa%dQfdp_zigds6q;QD6`ZPQjm`%CxIzutht*wD>GK%QgM!O&Yl9>+vq5_{^qeW*^tPbLs~{uYXV9wp5DQ6KtVJHd~a&ws%g@^ji% z@vt!aoB!oAjt*F0xFEWTE|+BWb~Poy79hh)1P87V;{MM%hyq7ql$X!{-sIL(^(dt6 z2G5d`x%cAfAs4{=X+Cvk`TQ1+B0z?F0L(tDOM$~K6sFt{G6axpJBG6u$tIdh5zesY z*$d}?qepEdbVMd}2jfJ-UleghV9Yqao@7-Bm?|WTpG4*kRCAX0$bBU3q1Z44LMomb zusg}*o)qOztX4-o6o~)?t8j!q4=Z0$cdEO!^`)>DXK9xtLepH}ioaWKUo>t~XPD+I zVki;OsQ*J{&cTC6B}=%5r$N5kouBC#7KTP-Zt@5NEKKc=)!-R1+IBss5> zv6P=J1?8+VhhYO7DhL~?<_QIHbG0*cRYlMkvapvuVxg-b zM6TylBk~iwyqx!`=_9eB4 zpx*wp=no+l@rPzWSP8^^nB!-ExUVnjS3&F&E3_mfRT!38v(X8wCzIHjqH#ctuf1 ztQSX@oASC+a0|`CcgknMAcO1-(1ox5=!-sI)`f|jP9@osCnyr4Y^^6n>nvSR(zjKB ziV?<}h%lA}t?P_Y9Z?}W6pgBX0lA-SO~%CXb#56tyT1zl=8^C>_uo`tvk>F3MNbI7 zCTHsppgMEl`s-r3krjsWQlJhMG;B25fBEcRvK$LJVgD37oQg}HydAaQl>Q@6q}FEM zP=L05d6*{hReZ3ngb>$h%T_Z|<5l%h#H5joXbZDlK_N8O=>rvae#4-DB7o%jd-atN$C+Yp!AGd{(9&Y}KZ zdpG`cG;jlkSJhr@RjTOvkNcGY*)it}vDNB?l^$rW3Pfv+<2?inJkzqKVWU;%z zvWb}t=a_=jD;2_$0MS&g0b&n3FrUcr40iFU^MOqmnMLQKVf4av>fjnG&X!m_B zyq6jm&B6Ja!n@eONKo(w<=r=dp?piw#~Ua>*TpGk$nxaUvz)cx6bR&w0qx2IW=>g} zY{L$AP@bl->hq)RU0sgyFe^jVy9ZjbDTEbV6aC z8zTf7E2b)c2D_ys_6qwamDoHS#r6GBd#Htd&hja^0O|YfaheFBw?tg?R#X$ZkM|_l zk*!WNv%msvCkXTe4Im9viF=Cp&7jOKBOR41sp)_C;gg`%1g|U9V({JIqW|QAw2Db7 zM-W5M+MJNe2rF4S2!5PK!LUKa?8M5v0>Vx#(d*-X>w<1mOhduhPF~YZjjqd)fCmS` zf?FhrnUr9Lb#cs#q>(LZvh;qhRR*U&=r>Mge%!(o}_B zdK`RzSeM>!`xBwNDB(Y?;cjnnCgs! zmb`Q*9gP1l#RZUy&x0-d(woDxNKRirzk@t~w^P=lD2e&2fkQ~JT%V3wH>l8{h6k!- zcR=D%;+yV^zuK!*H|}2hc1=!bkk9k?%!$k64g&-|yFKDpQA$_)e5ph>0>+;GlHI?? zM#j)Vv9g@JH?fIpY{F?Om-uH%B_XXH;6RLHFAokZW6W28W??aUW4yE9icak|>|Y*# zbB1ACQfWpU4lZE@}Oq}ID~CRe8WLFtfcS|L0Tmmkd^Ik5YH`-cc%~oIUt$HrzE4Q~iav!|-%RTZ9{|Hdm z3EXV>{n;<`&b5-QeA2B&8{y~3?x^s86!Lp+%P1_a+VYgp;CnDjn;vfCa!MWid4>~H zAan-=f+Vl@FHW|al;e9`%C}zR`-|w##e2B*>08ZFG$tXx7feB)BS(_#h?7h zJKJHa)+KN&kC2ZPwreU7Hfvt|Q&S%6bZj$}RUO$9O9dhEjUL-xUQ>I@gKe9CjO8K> zz33-#HW6iDVnK>eS9hvzd!Ha*_x1cDgei4EcsLqgr_ z2H??cX;k}x2Wr2Yhq6zB3?s*{r;3{6%pRNu#m>?qmEK7w*`S}q^#sv}(3@>Fo+bH* zaUNM`ENse1a_u`(N>3zj%D%LJRmpm7RK~$9|I6zvjcY}$&$_oho4+CJ6Ovwd*D9eK zk!wQe7a~tVrM~RJ)^s*-?D+k9dy=K3=Ck2MSCdk^9&FR|?6-a@*J!+Cr~cBAt#gfpXj z){BTDJL>_CKqd_`cljuPi@33m!%qk*w4C!cYz+8jm+AtoVx`F#%}4ki3L>2FEBO@> z1Xp0MWU+h@G`dmbuP=|N8RlzxJ}fWI=MoHg=yGbZ7_94H-qt1~vlLJCjct&i<^PYP z>)C4cs6W0nM0z+5*BhkcxJg*fyOR#|l5rFEebi7J#M#y;>fc*`#kW7Fe3^GM6qv#q zBB$h5J4(Yh#!)AHV-QWkH@eYI;l?sPF^u*K*O9_(s~7DSu2U@G*8S*F;l?Svak%<> zRRklNnpqU*Qj4}%w_2Z(IL$S9qt;EvQIP@WdwZ=2749ivPo+!h-cuk+BkWngnRojy zs5oy62}4o+43GSOJ&G!Eri?vGLG~1XeB5s%Y?C5PTlb=^gXnIdPh0oU+4X3@aD!)d zGrC&1!EaoNZWV6u8xNxgg&X|F&1j==18=PKcdDo28lan#5$r@jx~yQWE4NqMM});c~`(Oav;hGVxlqRFn9FKA?Q_S+(X~~Y)~j4?urWp|74=)c3*bGR0^QnL)+7*V7R8{B zTfE75#_=^Q8Oj>RvIT)H#miK_kZKoR=SS}9rfqqDM6{g;qt@KVj-wl^9Lh#>60ff7 z1z$n#lT!x*2urb11U{I znYr1NHN&fT1nR0_i&ADOeAe3Z%$JR=09ek23yYO)nBKc1l(T`{JF1gK8Z{(QWanX1 z9w$M6HOksHowTids+0$0x4!kLJ*w90oJtf+sA^I#N>x<_f_3qgaO+eNkr|Dk3pVTj%N7{`MZ!QE_2c@jw2!~J_ z@`9Tlmb#2laqo=mZoC4X%fQVAO*WOHNxHRvd*p`+$oO(GdvGWgTq>9=p@xvqp?ky! z?huTsJvyx26ZE0svBdJp-1ukt6mf;a-V0-(48c}rGJ_Z6u*;e^e;4pJtzZB7e+sDQ zRE`Pbq?31hub(v?14a<+D1HQXc_rRyPX<}F7Cqvmr_2ski2o*4#lH@#N2;#PC=w}u zbDHf4*_uWf6@_e$BWy7KZ4m9n6uv)hZW@V^e3CcY$)r74J3Wjtp7-o-Z(}Q?k*EwWiM}%B78FuU`~H97O7GE`J@kFv3Y7yj#4ugDDQBwQ69eV zR?69z43VqBAqDQ_3M{|Ixqk9Rfa} zFQ3i11Y<}@g`98UrQijige~ye+gJ>-_(5B-PH*CEgZ;ubNRw~HhgZ^lC|0CzJd6)1 z=iXJ6>>ClvA;8pcK(zJ^(aO-3^q^=|vKRlP(!2b}q{sG7vEYi)k#&!MaWY&@&di%U zqxABY%&d_^z#w>GKqx0-6gj45DD@~zxHobX%dCxi&O~G2jFz?ny>n!2Pi8}KIXsJ4 zU1dE~>}OsM^kx~5OtaE5nOx!IN1Cl?|B^sq%u6P;8qkE0=t_z~@Ay8W%d+lU@7xKgEhiPGl_y+}tR8|0YKm6|p|=^^4`ZVEL~8LA=(!fy9>BousvD3pw{J3ag9B)5f(T%dMP7vdZG z?S}S_DZs9}Vu)jJxjXsgE?ug^dH)u7+qWog7bNxK85KXY-ei1#@i%I!2i{aqf>T|> z+Z^@aK-Qdgb{Y-KR*kS7JTJuta-S&?w$u@0xqD7hwtKQx?UWWi5JFNpJVc!ldEA|c zv=h9bwf?K8+Pm|`4^l9jiq6`t@^SnOMR%c{z`FPIS71G7E9`C;pR>ahGk5as;N|@d z>Lh!Jv4gHH(r)B`<{LInvTh;;9s|av?hTXkEy#!p@`tl~%q@I)LPw6tbUn)7scvur zy8H%E;8MH2-}&rPl+p7_JROMePUm&#&FkK8$h>|Gq2b3czU%3&{MJ{OaC_ba?@pay z$+~eg4Sl(fcSIq4Sh%g3jK=$|*e!`#e6k&Cg z4)gN~DYgm-XVKo4_01)AnS&x23_u(54Qcd}o04cx^5G*cx&Uu2>YKv@gG^nU8W>=* zbD6(o`XuxztR%8_W%c#5WYqziD>uU!O{EAaH#(U%$%wvN3!FLB1kcKyrQ97@75x;g zbhJptB6PHWxQ2|)TJ*ra5Sj;oe33Jbewe|rJ;8_&6hPp!cRtu*V-DC_jFDKIUYMNu zaT~DZz@sqiSfgIA-|fQRLCdQ)@S0{OukN{&t^2Zh&jO*;?kT4d7~FD&(e0q+ z{%(&vbs_VezvXkx&F%vBaw)eKEK83mwXbqioxA8Zx3<`mm&KeM9yc@N@rN_V?q=6? zylUQGDY#w9vC+uV8|i*LT5peIump0$dRLqwNA{@SZMOESft*++0|gB*TZhjZV6^Fo@geS@zpY zjZ2Ml3vl^n3!Ii|ya50C!+2DucN;@OJt>#YtG1)wRxMGRcS&&BT0S40Te=s~h093? z*q`Rs(lT8FqGtz*r3eR9xsz4l7FTEtRDU|sV5NtgRV@@ITLoN&vKhfNp{~LKp1|zc zCz~t{1t&nXe16fk1i7+0_%$yR6eDQloVpY>yS zoiI`WqJDo52oHFV=o?XHz5?J$<+BoiUq3++lJ?+6J8LG9`6JnFl5_WNJizdqeS`cv z0vO?VbxgQ}bQOwc0OAFdllpa3TdQ`e zTS+v+TuumUfq4E-6=T95OYqX|Fes}>FgP{o>d^p_?$N3)RCR;~)#7l2$ABU-ef6v3 zt;KuMcxwsYB5(xYh>ZPEcXz5?Bg!4!r=Bq0L*cVLyq($GNs63W!1(MnQlL7=8A=#s zsF#1$NJqO1V^CzLw?uSyl(CIbQ=iJVFqm^*_{C2w)&`lde8?nW%WEz zb1|@Xr%(4Z?j+W@IRWj!mL8`A@O*{DV?Z9kkC4y4vSIpIQ9Ww5;IXwh4-AuV9>>uE zW7sfnTsY#|AZ=65No;SpNvV{Cy^O65 z0mKm)teF5ToLvPggcZ^Scx{Yni0f}2z2Z05fO=>Ldi%oUwVdCW%6DkAI!iVL)jxLLu;2$-@|hBApU->1;t{lDRe!+B{@e^t zCglv}rF1ftkQLk27Q_L7(Qg3yOH#ni_7G4o*U1t=QQAeVfyRkyE{xDmwvhWWNfr2@ zItbTO(88ELuB0q$+>m0Xkxz1%L5hD0uu`N?L-w+xVIxT9A%qlKm=P;DatL_}Bn}ygh-L5vbZVR( z4&vs~!zj9;P)-lBMaO)WsW$f%@OAqHp`X?4r>F97@Pr|8ef0juVXWs zt+qgr*F1Zoi$2~LNL@4cMWd}+A5=*!;XE4Z1nx-I3uXg6cVwbvtE^WGYWkpyOr&&M z2PaK0nq8MddxA=APe8}U=B9uKL{|pwmv^|qG9pViL0p^$bJ~W?DD7d`*6PH+?c!|_ zLQ*vK+2h1cyP-Q`_L@5*>9Bu{kTpw4D=|Pqis8t>p?ISh9n$SL$A0u0`+Trg-OFts z8(*XO8K1$lA1$%6)ePZL*kj-pK~|yW*jN<|8_j)OvDs@6e5nQRg@w@O+TY- z@TzNh9o0d@#4Ooq@m1A)?4~)K0!JLvx1gzAkrg#xImk_3JAsY~>1AO&?300^Nz6V? zcKQH7YtA&ZrcBQ?P>_sD4T*RXHIwRxNcF(K_`FwNw3I*q2*Wap{KE1E5SA~K%*h)1 zNkT=^EWmKcFwbHETSF5ih&fUS4(7HrnRv9qiAZjiJmsIomtkneAb+4&?iR4N&#?1= zctcFe%?6&kg%3_B|%OL)FJi(3xSdM@&XnGZ>LH`?3r0EbbFvTc)24j;fZidL## zz(p$jO**=`i1nDB4z%lGnhZY1&R`=+itw}U27z5c#xEBZq zX1iipIPlhCv|VV5Oq2&U()mujQ>&8I79YMFtrwoww}1Ad&B85eXzOZprEr7$bSruo zzHvFa8NRU*-45S~c+~JOW6n$2>L5=VOn?9Z763BIx_odr#*SI7*4An_JYLVN zN2BQV*ncq!YsQXPuR7*aEA&6)Kd}A@`@HYTlX)_cAX%+$S&~)J&4avWp38fGpSQI6 z$tMqH;=+EKeB8ZhjmDq*`MRGb8f>LSv;P9wwBtHvLmed_$&SAn-PLzL^-Z`f-GuA! z8;AQ|%)FiP9VmC?HKC}d?;$pbTguAj>~3R76>@*Jd;DfNSYMITr6pFi(M%$YCV&O~=CAXl$5 zMx+xSG=lk}g-%|cUAP={`f{gC-A0wK$bDuv&`S&}?X$WZ7B~{F#{rwe4kD%tGVhsf z(tl69gzqgKijffjtkU;s007^DJEvb^fIH1}beJ*n(H(sk3FkCNhAllqIeEHKlHwVn zfs&8P$tceu|3Pb(GAPZNt;4EUOT zekA=I0-Yp2gB2Ogch}+NcvtVWhL}djKmQv!LdeGC%2$X=`SCRc2meWG2Itd3%2mNN z@C8VR+z0gKZuI`Uxc}~F^VvKeu=`y!;S;ty{$l)##7E#<^$fZ!d`LOw14$lZpMTUm zJO%udKw~0~6a`$sd~B5Y&bvM(yCMb?d}IZIE&HE035AWhY{HhA*ESp)A#=OW1BwIf-)dufb+XMEFaZ3xOGJ9}|E z=rmJ{8zK$L+(bp~D@7`MLl^ zLQGSiaML)wLKRCxcrFrku*}1h-HDI`22Yc=OI|73%yRa)jZ;S=Mm5!k`DkAB0Xqr9zK6wCx4f4qleKM z%^YIJ%%(?Jd~jE_`tG=$Zs;pfGP`eN>K@YQ!tbb1I24ja421(`(sqW+LAB9_|=r4-CLd0lo4j0HHI2uVtj%70>B$y#4pN7r>$Fz>l0l(gq<4l0l zv3Wm+Z?%rToPmqa#2-n1eSi8AKySpRP-HsD%<*f2>g^L{`B4K_0lbAGQmUVxwCFSA zf$R2K^E4IW9Tu+thgSEat52=FCoB*|3;v|hPVt(O9@7u$o<6M@6=0fwI3Q~`=b%pW zQR{;$B7Y7Xov2|8)l8B` zobUfi%SnimfwT`vjmS(v`9Qj!aRuZL00m5UC5I$KBD%8l%G@VU{~1xETR z2%jN9()|02n*&gNT`dLb- zp87O-1D=wdWWoE1vdSl&r!0>iz(y!zQat?g%W}L%P)V@@w3=Mi2$-YL$p0f z4@tg7s7HW-$ndnL&tnuyo_xoKf?ygUl8bq!&-|H3_ytrb$xgoB89R^8G4Pc{vJtqfD52BWHf-vzk%M<=jxS_k0$)tdtb4pl&C;G7;i=vX28Tg zN@1SD)}oZwr#+-VL(L7ztYz=mRa+yp)5Pbo1ok5)_+lmyj^g446o#Jaah3nqAoVcp z*fWEZ8fAZjEq?W5{GoK`A2+z?7Es=Xv2{ig^M8{1Ya_fVPptMxu$}o%ipd()Jf_ zt`T$zY{uu$Nu^~`Rqeud?4&Y;*oo81O<(g$wIV*e30M9EFd!Ubi0HX$auFJ8BjIk? zj(=sNV9&1z2q--->j1;05F%vTgouD}m?*asf;cCFISGOYehfcGoyGeR;+FP-C|Gwn zehq#LmUzRMkYq<*1RgQSebfNWI0}Q3K`3Iue`C0wG}jRYNuo1?ARy{G##;nq9ng{B zwlbxXPbM@zq%Xc&<}^Q?}&K|+dmWDrQ9hcE@f6Hgfi-Qy=G9$qmB;-QGMSFmX`X0i}%=34#RnNj_s zHBT5k^Rg>(N*b|lvxKY0acDW}CAyG*sC{oKAcw-j!m+~a0^a0gSOw2H_OL3yy?-2B zcuXlgMLGFG94~p8oTpkep!5i84pSMSq4`Lk5*!%BEhWy;U}A;C?#(Y}R;UO3@L~OP zVGL#!tSKb^%p(H1DS+V>@;O{hPG@4CY|s zYX*-D=M?fMR-Q1eIFc-fe90WIW`BRFPJSkP{iE}1ErEK$udRwEA~Gm4o04LhN zVvLB2E6^w<`Rx7l=Ij!Ot|sI+hg>khz!eSiqbcxYIs_jbEEZbmK`>YRTz}j!+Lb3k z^3YR+u|6|182lJ^R@{0@nrGj66&nZSH$uMoH3WkH$i!Yas!^Q>-jaSHHLIxuoNr(>IXUk9uf&Qr@mUH&!w7*82mnW+Medk>Xj^K^6YZ#qjaGhs- z;1M6A@_0?WoJ*0xh<}izneoX5;K@HJ5pMTldJ9_gT@o1&7NKH}AS}GD;T4As7Rg$a z7${%hEx>w_JO>>x&PPms~W+=I`IP%&(#kp*C5QB^tpD`Imk{Iuqm7g!+#@e1LLK*IMGZ+B@r0z64j$B zoZo}bYXq~7bbowtI&_E7AioDX{MApSr2{c8Y7`IwLmB_UluVlF{B<;x%OL{Aoy3gp z59Xz(;T+ksTw;1!{|^I)n7^bFx&N5G9+Nsu=fwiK+jagQJP5r7uyOjM`U?6~TyFN4 z4JtW3F?yfEe0&|g(*&fijONsPe*~SUHJ=5_kFWgoTz`-l|HMEWQR0Oj4N5_*AUlbQ zSxA8K{0IT2jNa^*F%9>hYENW0=f|K^bk3HWHto^Dxgl1e%?vg6xnfP zRe)$FS0$Ie;-9{@5iU^PD=#6{4l{5ul0QV|eu5oAeruzCjjA2wK1HY)08D7~=+GgD zk<6Ukc7NuNcggYwmIf#I(tHzqABjE9`hB=Xa&v&kAms?}5kn2J?Fd0+Kyv>xLAEKq zDnZty#2r$P)tn~Ff?Dqo8W6R{8M5<|TuV3_9ppii%g)-M!8#T$_Zkv>WIsNL_9%xy zP5Wq=Iaf{xzB1FBI?0HUKo(sNOC<21!VM&yM1Qa;g4forP?B443`FW-JhWHqBsquF zTbnQuEXz0@2b7PFqjOf}62=sK_lNq|;Q7;2z-+Q?1vtJ|9C|2{;1$$P44(sA^+3{Y z@Od)Cm>l0#^hSn9F_EcLsHP5K$^M3)EH4&FlphS!B^~nKJ8W&M}y#|BXuUA)vls)~TJOng_QJ#Wj6zasv9->y1{#RlK!- zP=Gay!Y3i}CotZLJacvsD9yspF;DxsK)ql5^oGb8Cg8@|4mOa}fB+%%JoeB|ZRtP! zU`-l`Epatt74D1lD>04X862@6Y0o>Gu$-}$m1T4dZ(h&OdliPGzd*9`xEJ;qNLHeD z6x2v!?TF`Q;4Ex(VQ-lqlOq#A8!(?nVQbXCaZ~3ID!cPkx^<+@*6`u-*;=>Z=?|Nt zwBtvT0d&VArqg|uD z*f-Wecs*?#e7Hsm3%dI1AILKHV>yu#%MqF)bsqKvvdD(?a7F|DSobg`F(vflG_6f@ zTtiKZb^e5#Daw8{pRmLen5vy?U80r~^7DB~=IQhXxd0Ryg=8?5ri$!4c-g{Tl(-sy+SXh%radzfo1g)R{8SLRfR;wHYaI?S&o;aVv=$}VsheFO#;=t5-GU2P& z)*Q_fzsAVVe}H1kF27|EVV2-qmmHaCnQ~gzd+^?cq>Vl+@N`DbNyFpWr`RML~A<`mjV;{H|lQx+RktHipt5-Fof{fA2fVSWqpbf=O?T$;=4*pJNutfk$=F- z4!tWI8}nZ4yxSRvyHf9B7oL+G?r zAVpz_Uh*WE6gNYHAmuT3)k-(dq<2=ksbabsl~FSwU?OxZjuFVj7K)N)wTB3x3!{97 zk7YFxEx_8K_8P%|vu0=7F@~if9>(T2M_qGr)**b`5F)E2O`k>VhIsYI#Yys-lK7~- z(Ah74_MhQQz;dX=qksxP9GHx->^jQYP3XkTw;rR}80K)c1XDRc&tFX`ApsDUT6icT z2(|Zm^?4vEYeN`CHnY&D{_#+14)XmBz`1+(?2jSaa}DBkt`p0fk;5aH6T3L>H4Q;RuJvS%9H91^4qH4x7hGipIm zk-1TqrbhK2BMuz%qxT`je;7e zFipRI{8A(oMw{ovQ8Y_|vM*!Y>U{~EPk~v3;Rw@|LnWlj7Gz%qX;)e|s@cyalr+0< zf|Vd9;$A249?(tgeUr>e$+n^(C*J4$K^R6LKn84rB02A(ifwRAd;ifGz{Q}!GI)Z8 zLeNX>y^?{*jaj`Baq^0YL@PYchU4q307< zQxE_}WGgCnJhZH$u1^{Yqfo zRpt}mpzEnOSCivoD9S-a2+6LeC)nXe4aFyDF6Mj`a5KcgQw5y>8~G{xN18&QPUa#G}^;%1V6X^Y`L5I$#T;*xR5^OdZl z&~iiK)r@I5!8I%xfO0X#h*Gd)cu_ikqdk~DHV$ZY^boGTLD&okDI<_KRSN`#L3~g( zU=6AI885_!gd7S^gBiy^4ZuUeX}jvQpqPj%f`NzwLazd{3ucQEwd71nFOg(8489E7 zoq+GA07XE$zgZp$N{evhX!j$b=G8j?dmY;MeZ^Pxv=S-xICdaSb8sTCQ@Y$=h&e}h ze+8xvT@0D{kRU>kQX5wNjImX`N<=LS2X=Dt&MURi1%Sf-uo5K}0;i#w5*;4O}$vI(+^E z5&i`ra=?<)0*V5|uzaiGr81F-zeReGfB0umK1068JQ7KR$Wxgup-0uL83?^5DLInl z)rUh>6&x}XF~Y1th6xdGn50|FO>|m{{+m6+@>9fNgG&;nkH(w(fM@XwNBQmh_u;v}TMe$DLzs#dn&Y;7m{NRg}iRx8--|CIy%|T}#q0YF5PxxQ| zw-nj!QFMFUX3IDwt)C-xfgbR`{Ld+aASz+(=-+fU&i?5ye@ai>{px2Oz7uXFAM>Yw zLHmFHXXF5c3+8(`if1(D>wSL6fA{}Gs*2r+>x0dm*6)Ds{+HjUi%cB&G0tz}ne)xM zf4@JcLnS=>PpC35d&lY3@%6X$G2iq5{zHE8zreTO65^YD-CPg&dFXmLJ^{~JVwCu~s5f9nnMs(qA* zQ?e%@W4JZOGfYGbw1xpp6O{|2TOy8RgLDysjOlN}QN!g7fS1vyLR#`7JiQ~gPr0yG zy1w}e`2|3w#9u&Be%hL;$Bk`(y1FQjJh5Si0 z*|rE>chEOr2E}(XRxVi2f5w;*vVg8T=o9=Am3`w{T@ff{+34|dKn)x)TxKvlmPKh57IPg3{=l21!zUoLKl%Pj z2R;KJBrwY-9zj(Df16mq|F)kR*6{@O$}VxjV5T}C>B2~mD@nHR6Qm4_#I1tCkqP5qtm~@TdJi`f6y{O)kUVm;)a& z)YbDtzpr61e+ht7zbS;R2Qh3IHU=a>zUWv%24NC>!YHWYHo;KX!{K1aD7uWk1NgQg zLkA@dC-~~mzCc_D@j?QRicDRam8}130|9RQyu_#!co8XcuI0*^WMrGlBLA;P@!e#7t2CJ)5p>dMNPDoc#TJ#H&u!o=k#QuL5>G30+;g6`dj`z78jl z*!})}b{WSn6L8oWWaors$Ru#px9nZelk>!qYPNymERLan$fxED1&T0GJ&s%(n$RQgTy@Yn@Gwno*%JD=-3m=iM*}jluTWr{hlJLgkQkTGf?mQ z_ltfn05e(p;^b3j=lkq~iN6PsC@<4Hc;UAi{D}6iV(0wa?K6%JrcXzGy;p9R7GJrUElZSXsR$FO%@(^FO*Gh}YLwwa` zD_xm9#8>UM()&{m6BzYZZNr$&TeO?vp3f0()h#PJuwf6JYI z#LJQ7J<7nb|GGYD_-R*47^ygc% ze^9B9+Y9^U3^4tnQ_l?N$I*R*O+I6Usui8gl7CEX&GE6uU^LUxZ{(jv`}+y|>FRpq zUbLk+-RkmM_77&31*YgPBFfFGbR$C#c;t#!~nvP*;Cu zk-1ZmF-$5_;&~FGpL9@8sigQMhIOk6{h2{3X|nyTQl&pZS(Ibx!vZ?{ugtYo@i+S#)Jr2|!6mcvvD3n50ku9n z4KgicI7ms`Ey&^he~C^w@jIa)JE8Eq+6j<5ArDd~d!|SN|`Cx6;RWvI4@Z;W*tHPbeI$r3_G|eDV<2e(S-}FnNg8 zl;${nF?k3#OrBSA++gLWs5H1RW|-TvoB`2k0LRO)gNhoy+Wpzm>^q!;2Pp~YVjL^f zaHH8jP=%Uof0Qs5?4TOr&_v!nZWYwup}XrxW`WY|2b=n}b;$&GmR5yKSjF-0iOGzr z4^n9NMR#9Oe@cBgS=~BP9_|elhwC>6&DPOD8KBE+KY3?{!c*WOL=YuQxSe z&FS<;o7v}7X$LuD$X9W1fLXVB+rjAirp$?tQIeW z-2pq8yT$en`rzNQpVF8xRluL|>&H~7@mK%#D%GU`sVkC(pi+JHKcW>`XjHih6C4d{ zsA*0#kcl}|Glg)mUSX2@#XMeJkJIkt%#%v%=Ma2>Lh(m^xC8zkxj<(XNTq{Ro6GxQ zbJvByfBo-LO>(gQh#af{eEh{vQ*P(0AHx-b2>t(p=sleB-;h{Fi|t2OBvt$f8%0Fz zLoR{W=InL)HqJj-twALzxSS4KT6P%r@rw_hCGsC4qlLOUuyxw4XGO)oR*e4 zf;?h0FsfgYzI*stN_BxfFuW(f4!JW!lNB2Tf1{SbK4@xRzijHONP&RH;Sz83${we! zX(OrH{2e4$7%*GoJj`8uSpj5s+P+g9!mRDwiY--b3qQTI=i61fQ~ zZUX@l5N*>`(iyfny>21oQLg3}d1|BAxn^JK^XL9ccSgtr0j?ID_w-Edje>I*ydgr2 zf2ue-)A!3XGGPnt@m1*pV&OIJ7#P(D@B)#V)RR>ySYqS&c&e!fU53Qn0Yu|3|AI7( zFaMJLZdVH_Ujw0pXzW%R2jMG8G5Y+g{{o&+zyCy8YeL6?|MC8`Z6fH8GV1*bOm+|c zKhUHz`d|hUA`<~yRX6)crSngwN_7jUe{Ki&s7VPv6w5{4c0z>&rzV{yIJb4zYJk{X zfiF{CgX?>U=fBC_BOMVRg7@cdmC}Ry)(;kjo6P(l(p_D7Rl9@ATT0aT`No8k?Drlr zpfUVTc*w+%lTFgSWq?q`C;;=G9erISX(*MC08*pFJa|Zp_f1gH8 zGWud6uF8tweaxT`r!38mpJoGg2#SD$P^3)$5aa{Sd!mdjHmGRDVxet;SW45bMl7T# z1}Tw>v3y8h#yQgU_(e<{V&!1lgPC_-S$WIt8A;;&!jwK(d%Lp|6qEZ9Gn>0sWQjulNxhHQq3|*5duxc2Q zMCd7<=pH=9cl7!Og<%*z{QSAUucPl{ODqCuVKi>dewGEs_Vee#zRrAKf9?aDLrtw; zi`$RGnA7E%pQBhk!{B!wX0S!IOyDD7cs47l?b zmtH@ROQ+Jml0dE#BCiu)e|9pgSY{K(?kO?i6Qj8&6B+ch1Yq@M5%7#ZlTV5TFk=v3 zA;fQHetvW_yZ}-t6%X<2uE<#7b{((<^Ta9A2n zRyl|u@}x0uoH;l3dmr>D>_atAXJ^WBXaEl9mbnuCy-7%%zlQc+e;?k@zK$j#CXRuc zX-P9IDN}@GX;jpNNeYE+lRNugq%R*G;fc=0FxD^JGB zzgm(7H;|42GO+wQe@FtKfCA=sUWz30`VdX8kONDwxB<14dGJ~v2Lw{8T%| zoZa%y^|dRQE!jq-FMR5Cq(4hMcAsP_guTeu4|>fwef-WlNULYzY>(2?Y27nHfqjBX zfasKnB*#a~A&cOj6Jp92WAd94A{VSjf&DQozc9g9*o1&yAT0u~OseJv=-;={9hBqC zU6S-2{DEpRe@FPvNB5Nu3EzUt7v-|#RJwzwhQqDCyZ8tV^H*7bs-<2`@izk2dSt=J zCTS!&?3-NF{WuwqEov2G{V%t!fB268@nJ|31~w-kl8;;4jD<#h_OXlmfK2<-rt*|^ z&5-92G+mXPMiqv>^G?M_Vm2@GY}PthUzp$0gpRFoe@toL$H02lc(XWu)k5%ME7X2f z;g#f-f8bZm?l*b}n?jJw?2EB-c|flkQ!(vXcG$vX039PvAHQ}l23k9wNW|^e(v4CY zg(FI_oq!@_m+{@BoAZ$@W3ZS;Fz(zL{10avW1=A{Z_Otq4@y8v@=OrULxvDaEJ@tokZMbXWV$|FLaQcob&-rzZybR zVU`@orBQJrDRExQH%DzO&7TvEs!4O8It_|G4f$bNk}O$AL1YN5$|*SixD*T*ePZQ7 zmq!9cLcYBMp^-=!Dv=+~Aml0sH3(prg1wCsf48KSnp`POO&m_hr{)e)`IRBk5cd{g zOi*tTuO38hGeuUBhB3HGiL6CeBF22;8znQ~@}K351fz zR0c>YW53jD6z*4jOwwRdkEkI)w?`H{n|vdN=}_!bfZ>W>NXeFS#Hea1cZ1wwfko@+ zn5|nwF_;j6)a(p!l_zm6)hQZndV+>Qe@3e)q>-jxO;eNgnnpk1CNm)DIq4}1a3{REO=c{zH`hze-|1y zg5|Cta3aWCiP-wuVo$1n8O2cuta4#-H!g!480io?93rM+94S5lAlOjI0YDVY$;gbq zr80+iSG_)>?uBppuFQpa+yPF$lm3%6@)LvN3R)9mOeyyrsOIiGC zET(b`xomzux3IXJ%FnN-^7ZwF{OWQ_{>95@acpU2Wqx5jx4yHST3YO7e;1b5R{(pq zwq!z!qkFF`EasL{%c(53*K+g&cgA(NGw#2*49vLo`TS@-h2#096rS={a%Jr!C+#;8 zPD}vAk^|E(4|Kha|1r}8Aw|)7mJXyU9p3(B`W?mjbCNjn!e!dH%>PD+${0yOBStPk ztQ5*+LZG6|a1#jc2xUMxe-t09>&Ff_$%6M+^!=Q4&btrw-IaUbA&dv|Ay?5O^ZMp#wvMjsG;e}>>Q!VkuLZMDV_ zJ9w47d;1~t?hgOoe^|IC=!4K9GduGp>YD5`6Zo>FQkf%nI>Lnr z7wLCf%^itsNuLy~s>`@0N|q#c7sBY`a`H2^fdyvv9hUYCIS2cx!9@!0XdIoTC>c1W zWljSw(l)d!k#rxPe*|aprwn!W;RD^RgA75W2w_INSim9Vhx^t4kZh}B>8?AC(an{A zT4vO0H8Va#B9cY_BdG{E@vk7-s;mb5RPn>FH&C2x^ALjEgqGdKxLx~M62L*=0;wfL zqx6sogN*n9$LHMuX%iq);-st)eA;;j<=nWDv0qNDRv9hwJtUDgA(Ur~@ei5EPpz zZHe`Sq`}SlfAin8jz$OH7JmpC_`k!Knyt~^#>=Hf+ z<%V0seJX;xaF@QH+<70wcuIo7KrVf_ zfQ<&UE5y+cZW?U{kYKtrId5ReykGG7-t*^?h{j+)f1>-;DVrcT!TwDxP?qUHaN7I# zG%6p`fQO^_UVaO_o_vSk`sdF#XQn;Tk6Gd?2?0f38a!YVwBsZ0^C8_q$8UrfI?yi5 z*fXQoV+5q!n2PS+oTCOY5c|hhAfPd@ZiNi~8E%kbsbuq6V6S13gv!Q}c96|I`|gyB zQz`xOf8hM6!L~0PbxuB0-DyNf@NrG(tQsPd=tJ3 zRZ~+aTD=KCh7O<@{QikTW(7b}C}H|61(A#}4K@M)(-|$$wf{y@Sth)rg&TnQ;k(;d zIae8`%;?&+)s<{+1=7#*%KYNm#rg7iuHIU?f5^V@HsP52H_tK;bbSUx_rPIoU;{a4 z-Up}5rsjQ7ClGK5(oYv~F#Hm?+aJH6Sh55wd$il7879jvLLFk9^gh1DgClS_ea1cX z*`G~6i12Kzlf%wiWSp$5rdL*9^A6ER0OxSy)lxpalqWx1z{o?<&H^)Qc7_t69FSfE zf2aY2iwh8qjaQ55d0dzF3ovbHQjEGjQJt3cE_`P!@-e3t3z#$?#XD135PZW|HcL)f za(`+COR=6J!0t&JHj`#_0NM7WoI-6NZG@hpBr^z42l_J~Iw|-iG=)jtSlQ`S_atia zu)mTJF6-|GQ&ibS;sUw<e4$;li8vLH~3%ZC?KZf86=l>Q^Yh>-O5bfHBu z#z#e$&j3ILrIHwQJYaJG&erLFP;uW8U=OG_^o<`fobEten^lp`XRM$AiI7`M!Z0GJ zK4ASZ(TFQ_OkrR#ktkM6o{eGt3Pr^Mxm2~q^UVlF>UF2QVpPIGkNB$Le^W%Al!lo3 zEY(DDK(`JtbMx6ny*Fw-OHGwn^nM8h5?QMqaZgdFmG%tav}PBdefI&*{?MVP3qfiO zeskoYfBvf<{$rvT^uPy``tHYeWM4c*<_|_>fI`Q4lU=L5Rf5m+B*>sEfvlLf= z+I*H>eU@sss79vz?OVS$p9R+MXDPCdZ$2aI__LHWWp6&yE#YdftSYtnY&qCL5*tk3 zP=P7DEwY=eBEf!N5$xSG5Vn_+&HM-muD#|wBMRWVh!duoo6jn!VVPZq{hKV=E2*`G zmHD-W)m7NN*Xpp0f5T{xE)&93dpXev#VcEjly+bLycPEXjE_h6^xan_^^mbe>6-J{Q@yJS(=6+OJbYL zizABxp(78gQd4Ac{pn}_^nd;*LiIINS5oag>CvQ~3gx~@T~7+UQi=B0sZxUIHDQ$^ zH@T)N`LeoR)awQ*gR(YypapW!sr)bx<9esPt#o*@Qsk#af22a>4(s>uU?Zf1R8UsO zR7s=AWBj}Gf0H2e^|hL*iNmDH{``}l6RU-IcKGu@tIFQxTk75Wz)fZU@?F*7^LzXC zV3f{Ax>cfrMHfX?%U5SRU;U3%b0FUZPM#5R%vkkcbt8bfQvP4Ke$$2D3Ra40$RZxAj46hd@> zinl85RqdTK{lwB>-0I;R?b^}+_)p_H(&K*xj;99`Dih$h%={7_sZESmNqi7c>x2^- za`OimBCBUS`5t?a&DfJX)%o^1$4#;m%bRKpe^P;<6S*IVq^C zfN{SZtE$RP)O~4b=Z9ue*icXyzrB2iAqio`*=ed-3cFg@;Cu`h%9ql zgj-YWd@p9eI)gx4RZ151oLD7F4AWEuZrX78p?3Yj7z%L@@K8-{ZRifzSW(=N`5-<( zcV=TPaPat4a>S$d^FNzJ_eXfVK5SFxaMz#1zo}E#c%Vagd4PJ#xjVH=0aHDqe{5kl z7ZAqemm)KmSPcA9WC-~JMwEVPIXo3W)q2@73RnYvHT;7|0krse@fq?MpHG{Xnuku2}rynET=Cuz|Pv`hiP4563MioO) zZQKLuSm;0zSFfCvC`B;!rae~N9w&3J7q(g!qGaq98#t^%)tP`tEl*te2}dz^Wp5=^?_5Bh*0<5#pDS zyYX4(`nz~AM*ud(cq1s3LLXH=+zUJ?pGLY89-Ap$883G8s*}cJ`mdo|e-c6pxpq`Q z5{7p-lmupHO5q59^2u&wh~Mq|0l@%Q0GNnGvG@q!3>o?ck`?-yP=AEDGH%tp`e0ey=BZvaPpAAh$;ylRB17t9I5h2io!vq#-}JWEDQ|i!mzg$&3iOB3#sf?!&`@;;J`I+NxK`@sE2v&R3_1#KK&>VEf0mj# zOPk7Vl|Gv#u1&nEfBKk7FkyrW1Fwc}8N;WID%Fnn z=GUYtx;_7Dc_j%LA=MwuqYUAo*E>h0F-^LEtadsw9+Jj{I=GFPe_dFL&LeiMY35%F zl#pXZ`c^nqgYlz@62cOU#$>}?o+f$g??g5E{uo+d!uZlie+Hw=$--n;?_GIMa{Nkr|lmH@7KCMO-q~!rPE#Xf77{&K~@YRoi^bXj`A1#m!t-Zm7ZYLE< zUYpu;@C6ALl|*tlxpGyei$c^P0=JB!(41YMW}dc=AsWXfaURueu~W@IOuq-GZ+L?k z>6#*RKk+-5e=w&W&i$I`PZdTOk~TTInhiiFrPK8b)r&IiV2V}|?>EeI)oDFSzfqKE zJeSqjnntQZ2Uv71B`QPH={~FiSWHv%*l1CxN%#?+uaaA3j9;ur!&Mw49EaZ<@KEhj zRbNOWVE94_rvRxG>N=os4;zDFEB5k=%E!9y)q_?ff8E@pjmxVuFoV{@5LTJKYr+{j z4jIC0KVl2YiO(S(?7~U0M25V64Y>qH@zlplCGQRbv1Fh1q)4iA0`rPZ-pSlLMJpcW zQWMm3`ZWD56i*b#Ru(`Q#*wI^Pa!ocW@knb?h>&iXqR)`fF8gYFlP=`c#2RHSQA^# zDk*?xf3wK4iPT$YGCnS$hkt?iITCr`?~_*haE3={LZZFx9cGe`%!S!Sin{Kz|NWdo za7}9--16f@UNxu4k^9hmx}83s{7XN6>IA;vaN<~c=^?5a%JT)GL=*F6=l3EqB@xbl zqav~*4N)Ok?IlOt$B4;lZcRlhOI9_m&jE;`fAMcBN=+_BNZ5}Pn+7GljZ-}qe~}6K zHN*`iZRs*A6r9*wg`_swJ@D?66UUqxDfmj;=t{vYAXbHVV4yQ|R0#`jq%84PFbx8`0nwLGdy;B4 zf2F1KzTj4Yy&!^3M(_7e|KW!y;Y|i>pr!+%(DjQN!7hmR`scs;-@l)F*&+;os&zE} z>K_OuDqsze&JsBTRo_8gv1aI>(yjOmWi<}JJ8-jTouvflhx$M0(3nv{o4RLn_}E{D zm4~8GHuyA}oyZ`R#O<5W5apQrngR?he^8SH(O**;qp!m0ok4*l(jdR4vWSl%Wihmc z)BK-^|J31i!-FcfHaz+wR&gge;xke$TP@4!szqRUBe51?O}y$bGyLeSP=QpovX}-s z>B!_Ov6jM1Cv{IbEFTxI0SjToI+#S55CEqQaFVVQ(@i3#HlFhQ`gyg8d6!(ke~)N# z`nsH^2ytQ(I#&@TMLx7$Ko-vAd{U)O3kVOtjoOQlx5s1t5;VXtGU8i~qtKZRh}DEa zVA4K9b1)&?g+E*3OKPJ#J?iECd(^Q^GSeg|w2{CUuERlXpHYa9;Zkp5b>L$b=`eN>!$(UL4 zaUgUSjsNab(L|Fa;g1aO!32<5eJoe({$4@)<`pCrBpuFrrTzX(C`NvCJ*!4>W%}cJ zQIdEuq4y~HYAQ)Wkw;zae>wWr)t-`6d(_DAI{r;jdFb7~j>-eIVEpS-3!qrHuCB-T zL6!!^gnkWA5nlQC!oPx140K@93V2ffs}=qwi408qv*KyL zgq^!n<$S4C|6Z{56T+rGY#Xj)cSL}n$K zg~|deAtUj#E;@IJtX0|b2(*Iz5nTqb^p0xCfK3}+e3^d2OC<6%;MkxD`EXy_Ty&{S0jId*e*&Y}HGN7_NJeH5eUC&o!TeR@PNx6q<4#8@f2mDF+y7l0_s~0|FZIDSk=mfI z^aQ~00_bf?nSdG0UBBEn($L;UOc z7Fl%*xk#q0liwoJfB4HUe;|d2KY`<3q6Wu?Ixa$>%t%CPAOs7)GC7Kj|4AqxFrdZs z1<8m16>y5*2y)6<&kqhPCqu`Emaj@2TRwaGf7tTje=TD>g$n$7xg~-%kyL;M`0pMZ zWzr~OgX|Xp;cF@R?+dCO{^cKq>)7`JPakdngnupL9rz$lYs^FrZF`zdiZ}>Os60FV`QLC@(qE)zcIxA}+z@3Z{ToWD zeR^|46E|&vTpadk_ikssZmChOjgfd$<&4itUsX^ z|Ite1uXW_MJMh9&fEf*4-~IYSry|0pQ;eQE<#%Q9egk+w<*R?7eC;2nGO2?WfeoVK z1R;9ykOo155j_feCQVM%HK;>p)$KyVe}OmJSdI#Mp?RnZ2JtsYQu`ywjKBElFMiZX z^#Kf(PIcQ{Clo*seH0G;;tE-AKkK_`s$ucv7Y$A&pgeTE(N{kja4|q-Q_$e7r_UPg zq^HiC-)+kh+kn}cL;)+h_M@wNLGUe`W`bB;1-BBKzIEdqTb2=KDN}xxsf-Mve^Emj z1t10i#8GM*?3R3L4csdvh0%a5c?Qv8jROXbu6Sw$-vt4Y(YPa>36%hzaGyH=<(GdN zlZIk_fwG~n5aY^_e@}e4G8xhv2cM*N63z?1jx_y$%-j2c$OIeP7?Et#&cgCH154^fFMjhFW zy%&2ZzO!*VfYEX>I2zDvI-FI9BPOSIh{!OAK9CAX;dw!^sY9gZDfo>}^Dw-pw1f5(4hhw;3ho)X#tg4%N8f{r)&5AX?op}fc&24n$#6A8og9aOyumqp-P z3m_AsxruP)p_+;h9S(Bge~00P*iymLQ7M61`f#x7b==;`fNgc9N+x9T7b&C}^BwZa z3_>2`%Z!5*G5L{=Ll^@|kPq>d$lxm*XUEXCK$PGvkti*k@etbDbP=3u=mGJaD%qVa zfkaD4VELQ4bi5#*UNDa!S-KAv$2&vriC*vS303fdv;v(+G&)0+e*+>X70UBviId#R zcDQl29HXIr={>5ZM?j6YIj*G#$leOUJhrjPMfRx3EGUxvldg?7&xEiA{_Tk}{(6Rc zuy{~7a7R7!z9z)c+9Dlv?50!A?wzcSSI0sW_II)G=ya=elsz_gw(Q+KR~UneOJ|O% z*~)EY*ty+4$MvExf50D6E1cTZm^-!h?@w}trxS4 zt%~vXxKH0zqOWqi;@xd+sdP2BeO|}5yNW+%acf+A+4c-Oe{XEl^+)taxaU`e@#%$i zveUq$50B}l_F&n#Z7d&HwcWW>Y+kQp=hi;nj~|KW?7e9n-``zWZ{KEx7|}EF&%&MU z8~(W~-o6|zuU=j(ADdNCZg{k}i>L8X`eWe#()oT44;5R77jJemO?L|$v_JmO_V=ST zJz>;D3mxr`e`EAq92KHscibZ0^a#gJ>PD3wVP6=hgF=PgW8D^~uK&u~)j4!g247Py zjA*ZX(~_~$=vVl&GnvJr*vDDLTImYc;|@lDF;DMn@3|-Zh1h3`3%;K2Va(B9-rn99 zW!IkbjG|G>iF5a5LlnFAoMZIF$&onqw)3KVWZnyLeNSDH%g1brQ`M@9rx(?sVI4(Tr)AST)Wa zY?sGkf2U#BU6C~$+CJFB@nS~cd_I1H(XACM+QzatcdBEt?b^4V;TV;gs5nP>AFojG z@VvXO*msU>VRh}duGlv!199w@FT_^aIuv3c+Ie9*yEQCZt51X8?}|O=pe~B|KF6#W zmJlz+p(P4=d*3mdV$=}(;$U4Ag8SZD)TA^UzxN@O3!f5v8|c zJ8zC1Q8ixL=znbE{x!$AHnwZH|H&ea_Y!7C+O;uhoS9+Xgq&Rp{hQ{3e7Hru8sjqHvv>te2p1z$eF^_XwQq8N5X z%iX&arGbUzaAh<-aqQHxSTV&t$G8>wt~e0Q)l8;r9|+^rsM(_F9!@($Vd-5Af5eq{@K$UM?5c;Z>I~3zCp%)hOz(4GtlFaP zG;O@Ef%)KyVL!7Xjx(ZoWOqH|+yF(n6jk((Yl_U=qG2^e&E2;#f2>Q4r&t;Y*D2kJ z@}fC(j1{_n#oaIBd(8}}sOSyE1y*OKiix$qR3v)Y!8*$vV{PtxebLISgShX~fBZB( z<4&|2=x@C5j$OD${~IsMSZ_yIFJ=0^oN<06M(*K(u#XBip0R7x@V)Nwp(xpQ+cCPv z&LSqEV+u2e?=xHjl&9u7J(_>~z2zMGd;6uRRP1wC^aK|DsZ%Wovn!9=i`YIa(|p_! z#(_~-6qnw~r6@ECSFUkkTsLt2e_>mcy0&whsneoAbYG(D28B~$teIO~td~v~?_YFX zF-PlbB#x-Riy%Jt#$rVjy~7N~w=fpwol(cB-cbqbzqsQVRioJzL+^N1Y}HC_4?U6x z#TK%C~(UDs@i>_}X>)gyd=e-ZTU*uXQpdG?WOHjHf{w#Ca^v9)OT9c*vqu)g+d82Z9nzyJE;;8YYF#g@SF>%8bX)n#Gi zio3YKQE)}yIY603r-=S+8X(;}-oYR<*RZRu(KkkTHSe7M*qw{ay1aj*jP2sKXBtM~ zJhLnsBeCNa<{b0X*e&CIe-1D&@+C`H+lK3jTXBAX?E48xEGH>wt9S3JrQb&;N!&&%^n1hS$aS)kdOh7b>oiHS7lHYjs_ez;gEQ zK%%UC13xn-JU_wotkp|w&%JT%+HVBt)lNg~xx3&tBYWL7 zUK-a9<^%d4<8$naezI$_?uB* z#HT{oupt!*^Ta@xgS}!Y3L8sFm?pYNY@-+Oleq3NG0lSvZ4>7fb>h|50sW+Z2H5(* zt!0QGUb`sIdD;~3(&JIe{pb)=i8T_@lp)SqC@m% z%PE|==8>^F!254qVG)_9E~wLLMeKPyx5BDfH35Fd^t*l_wj0DxFN~HeTHgL1?qA+> z&5q$fp74%df}a+*T;s?X(|kDJ7sX1kj{6zqyr{b;#2@XUhwLRM z8Hq!a=p*{4e@6Uy-*s*w51@a+Z@QisJCGlWITP|~gZKluIsGeFKu=BU2>cK4i#wW` zxsJ%}XI{Gd;O9B(8uM9PEQ-E&SP(|V#v9xG-w<2^3<>ge>e_)X;O>xl2(kd1l zacAJqmg@|KShUNKMhpxI=;uDkAC_nA(RS6vwk5EQ86_a!(6(Ks<1QUPcJ{jXTH=4J z#Qz+Z#wUkuu|(S^G+u=oZS(OeZQEU|=bHP(pZo4^3G3AWz3+<-riNF_XVz+v2Qc5Q zfhf7Ve=DHJ);i7qBJSr_EzEaG?;)y;oFfp`vTb|jp;27~zo7RoTYb~Be}9~HQ6PB;{RMfiP480}Ncjy%15QXZ_jkVliZcO7F{%7=#) zn%|cs@3FjC9%tr+x#K`y?<{9lAunduYec_T9&EZ&K7<;zMDn59hJ0T!Amm;ODIfB7 zeB`sa48LF2V1&_C;Cj2}qnMJY4qLf+pV6nl^l#QFg8^uZhG z8&ZB_`QL%awFrJ~wn@H*yhZfR$UER4b`HpL~b z7bDhpfQFv@SEZZVB@vXRPjLN&?$sQN8r(y({Ve z;Tp-ap#T0h?pJc`3t=q!^q;r4J+V9SeC9v=d^#WWD#nlE@59@YKMjR(e`(;RHBaYP zmzkbZ8e~=+dSCFb%S_Ir_wQPuuS4QL9T$_LT(&@ee11mTK0n*5;CS-)9fChf{swsm z=VSg@(7>Q?Nq#4{YmhgcE6BSO-yiD_$q&sDL^X{cLdrStoJ(Oh$`0M1=||PeKw~QI zgNk0;;E6C2Sc`?q?Rw6De_UDdwqIseMw-4Z=>yFlO+POfL~n0Nf9Lfk*Aqz38#$k) zzK!*}C+V}?#(X&y2M(`Uv@ZU_s+*OMMvcGgq@;I_AEw zPt*CJ7m%NrUa|hg>rHePA%8PJkoE&C<&g{hAM_8_ie3Nv*N8sg33+$&db~gMpSYKK zzQ!ScF6=8jz8Ai|fcS&4dNG$V3T4t~Ao|xzP)*hi7p%@}K;B$rdw{fG#Mg5H`eDPo z^uRx$!VknDF)^l>B(FkZ&*S?_0wh>|ujCi*{(8xHdj$JMGlTObKLvdp`TPvnehsOg zp44HVC_r8YA;2W@+Na=OTZazlrKE4*XRgM7UnG5jRqICfe-qO3i1j(Soyfm5dZY0l z))$;*Q7qfLp3#x|XAPwKNYYc*4|%+7eqVln))zH;uIXE>kK_J@5$Ok2gY;#=`m1#h z)x&TaqAKkzJU=A8WPR2?fjnp2j4*#{OVB?t-=R&heTMBpg*T44mHKJo_f7Ke+sw9q zJ|1ijdw{<`{kYbDiTqnX{x$;%cRjNIs z&jat!$>fiw9#_|2c+lTql|At^`_0Qd*)vEUEhHXKouinCuaS z7UV$#Z*eN^L)Hn=H@2tnd@k;IB4g~VWtOG9R4^_wM~3qfW@6AYQL#=knLN!G({nnR z^$N)^cb99x#u|T$p0K5U%SxVb^PnH}4|aFQHt;`GB`81pu!};A%VctpPsA4N(`0Si z=GGHC)I#*EaO;TOOvV$IEB3hcKs2yTcjVTA!VN9dhUtl0PgJReetyKQLoL}wV92A^ z6ZmwP3?N!@>xfz=0~3KOPPz3&o!SyizuY>ak;y=hfIWYkTi6k)g=T-jts~qF)@|7p zZEm48PzzRb$*m*0nM@5Tqv&z#i7RShdg^oQP$q5w}pOsfB&vhFj2yOr`=mqX6GU>xnyR;rF@c))8-EFBQA4Smf3dS!%KVm$-Gr zawcQLZX$BrdSZot+I=BlXGQB!3-gdG*0_aTf?BA0>)bkGE;C1Zt;lfe88D6JVV5ur zZXE-veNG&>hQ%$sIMl+3SK!t$iZG?ZZfHPQN9!47YOBK7;?^;?!6cw(8#~;3Mul3; zw_R=>YGGA$jXiEX159Nkj-kYJ>lg=_IkL+ehunHbm0H+;uaCHOjN=UK(9p+DxP_gC z+LvIO+&ac7lnD4Kj5@clTTl!8N`qVIX|VUf4s5iz^{~>g4g06dE%aK*7x3E{ZEnGL zsI6nYa0@$QX6^`f7Nf_lXIxQx4i^o#jsbh31HX%L&8=s=p|&B6A-9e(%FI<@cQBy0 zqV|>(J}TWKJ#Y4%9+EGr4t43-&$8 zv8K(fXBMc1{#fMJp%%t^*DP@hI!rC-?-sX?xt)Q39TfK79d13dLTyi&yWBeFUIuy} z*;BanOov(sy$9Sn=3!>N3%jCO<<>KgsO<~$m|NIgGoZte2VQdPnKfz$!aU^`cH7K) z19m;L&aG#jQ+o}2F}IG{g#AEVyC$srXgw2_;2QKi)8*DN+nMzv@doxdZawpo+98N4 zw~pC=%dCS4xaJkNp4q2%1S31Qj(H9G4LQPm!>wlysRcbBaqCc97Gu|h9Rsar-cWlZ z%v)|@=g7dXc;lLP+`{fd?X581a_g9jFsg`K*UWP3nM>4q!X#sh@EkLj$>#<9FDu-7 zChQe?7-P&eZXGiZeOTPN<~p~YIY;e1T$bE_I@B(Td)I;wD zbuF7)&ni$04pHRRu}T@(0T*4X%&li_Q46E)Hn)zolgST6*0n0!de$zrOTyaY*0J_8 zu!}6Y7UT-Fo^?R&vak-hb*Od4vTIej^{gXmArv2T>wuNQ51DhVm)v?*joKABy}5ON ztUByBV#T%2x%I3DwX4Eva_d+v$TMQqwJx~zESK6fVYRt+tWGBHh&9)`sch^(Lb`-%nqxgu7|*1*~G#99}Bav1F2 z>t!qJIz7Y8+Xv3Uz5#vU+&fq?$~DMs)tAPeZLd2=hH)SY_Fc{>UFKWugSETTZKXAL zunsTH$SoX-R@p4OTOHw*t%|$X5&5$1xJ{6^^0wn%-_c%_gUVpv!RQQ88p6NqFIUv_)L*MagoFNaslQz6FN|T> zUu}W@%H^!C2S4nZZQZ#0+lV`${t|{+gB|do2tT4-^A2DUA3)Ep?i;&*uAOtMONLV} z*axujU*^D0R^8HVxwURke+k#V7ca}EaJLSrzsm03q26B=>aXEse~rTaI*j#~N&Qu# z{xZ0~AQfWX**p6b31MY&ZUO5GO#XI``q6+@K!#Nan`W;8c}GB~z#p4uaOE~%&3L7` z_5HQJcuDaWnDbX9a9YrR)n;}5`eND6fWi+lOP$Q=^7_^O5=2ZZ)83zx>tKJ8w@>%q zu4Lds6#Mt|9{C}jo7qMW?B8QOSaTyhGV=znuzyGA_v)>q>y_Pp&)Pc}uQ85}s zW3{WTLM3-JY&)&WZLZqC+?un!oKtea`b2IQ>ub-*=8Bi@>5XxJzMRXrM|+~XoGZ1i z*VnVl%hikX=K7oE?AnDh&JUOGFVF9cy*+aTtB2TzkpwS6{lWj>#E$%fQwIN*scRtA zp?^B~V?e$|1P85OC>`;CCp9B>llU2QT}$pPT!|Xpr&yQU_&$y2bGmCdfV zeFD3gc_p?_g6ZYdOK%-6`e{Q@g-K#t2Ch0SS8226L&dK(8>jb05S3^Z2@Eb*r{}gUT=v?Pu$n6 zEw3^V_g!)8RfZ4>K<_GV5FQ0N!?NJS6?cwR6qSax<5*=;>00M*<*leJTD#!u;_Z>O z>sFQ_G>EsJ1r5@+;1|9XZ%Iz5wx@kyCffgj4gJ>iep`gy$1OA?zY(L65k$*#S!uAvDnLjf5E8@k6_i=-4pw^ zRrRcU5=I(g_dx6~T1PJUTed!T$atj5+SakRdj}!K0Hw5q;~-#S_g*Yl4BNG< zFloYn6ui4AmXEBax4R?`DfGv=fIZiSs}Fp#X24_sQ(f0CdN4X24q$2~26kk%#O{hA zYPR9oaMdotukEy8(ld5Er)-EW_$&BDwQN*87_X{0-`!m^!~pRpyLqv^Xm5GW01VZ( z9E1Q>8}K{Ae+Xr4&#_kxn85d78ZqEFEO@(rb7DCUHQinp)ttTMz^+`)8;)?=h6(?p za1IO;epUffS8gQva&FPObocflEE$elundFzlzTm~S|iq55UUOAjc~3FbAZr}J+vdl z73~ehN!frOc5EOd1pcUkc-e(qK!fC2FrgHMJCF;P$Vfovw6#p~3DE`lZwg&ehxHbJ z*YUrK4f_fFdFkv&g({~h9gNY94|d_;OZL{%6^pr=Em zBfTA>Uk-5-uqaZmL+=(gj3m&rVW%g5y&Lg)m@3et5obd~xzEND$2de>1nJGk@ZTVm zfkX(_i_ghu^3s7fxB&k*eZSj9yhFJn+?-i(%5~AsnPrFQTNy-(=-ZLG<(02VsoQqT zL)d9Sq{^`0=7}iXi%Xm6T^7zbqH{~6-0e9CUWES|dh{jiTL$#qEd1v1mm1f9;^iXg zwF3%WxgftaOkC*6il|Y15<0O~G1^Yi27NH#S9*hZB+wJ0uMN^$+vscqdMD5u;Bs?} zA^eTRuPmbH2o5-sIs|U>@71J7}35Z+qXpJ|re_?#k)8?~dopwcO4Mm;e!d zSKQxN6|b@+7Hc$3FWjX$>%!YBk;HoK?RoCniFNDj+b*VSwzl7Op@FPpF&pCEF4dfI z+upXT&H;i(x8a;RJT)`QKNlWE^OzHVBVQ4 zID_MoadcBS62~3m#49w*CtK~)lftn4a;M$eM(|P1Y`3?IB?r^3(zw zOw%6~-9i1J{pP56Q$8=Y$4+rsoR5v$a&g_mn)Oaf1<`03_k+@ZPOgz}V+}jGX3qT?$X8X!{)9k$I zZjTXBWR8}$v*ls4b91=8IvC!Xx6Y2`j*iT`#hr3)H0-=}cMfXf19QpVX?WvIXT{zb z)NbxOd3)!rb6f4qIXmlc$X^;qm93oTSys1lP`-06i{(mxqjqm!Zq+J7?``RFw_90t z-!5AFtGo7Kv3GgY*sY7~npIof?Te*rQ10CuXW6)Hob2A$a<gAPttADfS=2mwuuebNEYO6hKSl+uItaUDL27CG1+WMu}*|!JzzV-HM|G-&4 zxXdo@pXSzoSFBupzvs-IS}TkDZ_0Bkm+Ra6t1uaKVU{khh^%cloa469>tgb?ugxQS zyXcHh&1`q)?;c_PKd**M+EN|af<-@w2P8n4M|lGh z^6pItz4t!n-pd%>tBS(NWX_y3W<(@quVYma^OqwsYA6UE4 z+&DIW&h=b%PqDG77m-^s`$Sv@?maenag(?+#%#g#b~mVMB-Zly*a{l%=528y8!_yU0q=^`=F4-DcK_v8fDs$^d zE%HX@^Jv@W4_Oc+gUjc#aE?qHYlWysc2Q`u_=?=VaAe7g04-w^4Mp%bUDiN4KJ+Nzi%p z$t>kjg95ijhnmQQKCEV{d#vGKa^ zW^z`?Q()HM7ABm1R^|Mb2*uf!3oDU&=syZ7QMq#^mr=5{&o{YTCwg(FQNt#G`~Exu z$2_sQiz3(O#I-M$+-{SUxy;(GO)~8=ZO_}Jh_7mUek9f9YPT0BX_#x$US`QzyH@Qr zNv`qr)?O#c?Q*5tuQGWs*GYSmlV1B$+S@f5;xDVc?-Tm+6}R_yGH1TZ_7NmY?dz+3 zER%KoMYYdUGP!(hS^&91e{Do9 zr`!JZPy{hGxYt|}&Z*n?wjx=nU-Xe8-O{k=b46CunCn~Is5I&OyCSdC)b0mG@zP`8 zGm3IcGy4rWkD3USK9FG%x$`fhk0kV=~Np)1lu0Dm{L3I zaTG3;-P!x26jNbmUyn*mWu3D~aih)WU3NWAV~c_GHA1MOQse=7r(9+Bw+_v+L>!ft>uVDNg~zoVr#%A&_)kdp#Xu=GArk)A7RK ziT5dEmV9>(PNlZob?4=&j+b6{Il(o1dF-zI>C7zK?%JMzo&;OC?N9w>rFFOWX<$}P zcMnc8ZFT7G%hMuW)!pNCT3%N7?#Z9l%xcy>ON7m}+x6E>jn`kw;ADGkz3zrdW?eQ? zN0phwZ1x?UWMQ#6D|0zZna!-5*Vzdi(XoC59>Rh^R_Z9LNEJf>8&Obuoz`F8_rIdA zv}>fk;{Nl0ufLdH&RnQ%Rq}6)oP2!bsE_dGGtonlY@6ic&iGlC;b8H0f#nXmpxVG0 z2HjU*`XD*@9ry(>UVboF3s2oxpk``zwwkau?NqeN@zU1vZbN6El$EFPpvM*xNNQaB zWLh@9YHYCGv5A0=pqx)z^sp{VZQ4dWD22e?ME3B1T))7pmcf@rL5HR%zu>j^LNHuw z!d5A*_g)|sUPYc)-|C(%JP(*tsN}jYu?wE-@i&LOUMJ5FdIc^vou91PeIGK%>t4`~ zg|zptyT?KmHb+y~q$amW5trOZi#wx=n~E+yH`+V_PrkiCe_OLc)pBXR^Ll>IosVu% zs)4_M*J5|Qoo!y>N~eWXQXgtX2Zq1_WvLGeMYly$gk@{3`2)B~LvcONH9r-B>$-F} z-UHOrNjClBB3%Ms5fttlpb#zuUjt{ZQzkin)S8m*c>-`WwOsJO&&zNr(Om zHM?Y;Ze!6^pb^}JT+s%F(oxQDpKwY-Ns}p;xGoAcm@+rhtw~HHW$ZL$P z(-?=^mk-q9QWn)gG)a?uUTx|3h({Ae)9J<#vVWSpZA(`E4SYxbPKc~&H#{q zo4B4pLBadN6~?F<#fd`wX3hPEQa!t8B4b^wL2PRkIno4>V%~=b-_v82y zK-LM3VH}63>-AE|wPx$x&t~bZw|z=QYV3F_m*^ZtInMpTdRDG&)3vz~PLUHQQ4sZq zWV5s^C3MvDYI>orMzzj)$50N^hBexMI@2B1mfkeKEqi`vr(8j4Um+dccD`nN<=ro& z^HXo^ms$Ct>*E(dK%Rdz?Z`>z>mb2UWtP@OznVUV^6BHC1H1=uOPC2MYg!I z7f()J=t`lZU&+A1HfxrZ9s`?d%W>xj5wfwAG>$DI<@-Ln#BvFOrM9AZd_-<+wpEP+woe&UHV<3 zK;E&P2ww}%*k6mCA|{bqzGvp-Tf-tEozM!F_Q;IflWV29sf2haXm%=zFK83rDd#*_ z&Mp@pd|YpVNj|1G#O~dd$}BSsE=1H}3^V+?$! zGo$jbCWsWq6T5Ber@r!)U7+Owuc_AgZbN@Fen0f88NqSz{iLtMk?&>m`2-?9=s71O zPC-uv%7P^UDi#Se#~OowHPZ(*!2OmHgWFoDnZ0{k?cJJ*T-28W`!Flg!vG%mM8BvX zBO3Yq5Y)2a7NeTim<gy7erP_tsx}c3Spdy1;#XDbEShU7x97QR#L=dNp{6!2j{jy_W7T0&TK|+KZCm zcmsQHm(%l&7YjU*8b(i4(?nMEXbtt}kciI{oWBs$b_v;yfh9qNq=MnLX0H zKj@xXb0^cg+#TM3Va%|6AA?hsy04qlTJtG-9kYeUi*@q~eer5E8+q&W`-7*Y7v-Yt z<&))8fG@-KX4;U0$NiL6xZWm1t~Yp2n8o@Va|y>3eby4^_u4bY$rFi#|9uUD9;VbQ zHcCX)4yvXsx&2I%w6BIeUi~IoYLFJ*=Kj#Dk$aBp?tPAb=*c;&+ogu84m7#e;iH=u zYD&TCZ>=^CMmG~wN;>X+$2qubI%Y2I*1rT!UxyCew|bCd2cgFE$71i(g2qc?T-#zS z0(~aqX>92M0mdu?`Z&&8kTPI>2Ec*2GDKu9kg@sa`e=h5NY&3Z{mxVJZ13c| z>-3=CwE5kRx6;cLn)g@eM_qW?^U2z-l^7u;ZM6Dwx66%alvK>#&pdsF*rQL+b~vF9 zv$oH@x{tM@&BFD=@9w&-#G#&J3F^mICLrE%J{`D!10Z3926E4lyJ5{z6{Cv2a|+y7 ztYcW~Xp&oDjG{|D=1+g}COrROb7L8^9?&W=zH?y1KEoGPK+D)J@ zDk*V>+T2l_)}Xi=^R2L2fZQ={6-l4k?#3;aeUj_~$qlyITlT~F_Fy{L4opKfGwS+k z%UeHxcC9`LFParLM{?uHu@l@LH=rT+ldMtbA61wmv}#$+GzodO>DCy}5$9D)EWA-m z-t{6pF!XV9h`fQqga16nSBZ_3pIi~Ki^La_6U?|tJ9z=id5v@T|*y#yU<{pce9O$#Wb$-4&%NdT@I$@wLV#o-{(b=%f6qivH|pl=}vr~3AC3mLz~``RWOmSzxZ zTfWfZike2XS8JkQvJZV0ih4WFqpC>9&mZ-gm>)7Iqc3wo=KuHjXh@!Hydo0Mf3C@Y zuiVqB)WLJd*C2=blXH@5gFaSs)B0U*EzbdW>jJOeck<;hpJ8>hT*IFv^Eh?Z{3dd$ zo3pFw#-JoJK5{ESn2Ju%u=YJa0x%Jji_+UPm%H(_=&5jDa&tQd0nc8{9R9M6nC5I$ z_8}7+?ldDjP4MoX;6DTu^zop$aRM2C>k9q_Rn7np6x4mPKKdT{J4y;+I>+-+g`hF_#1#)I6-RWCDP!TUm^ zcFdv1^?DqWW-{F^1nc>pkiP2fs%&29lp%hge`^VI*2Xv_T_y4JJ?KHoQ~Ha4r4Q?C zz6F%MpG?n*Gd+`~S0yB0nw>`^pKYLPBJZ29LyG@AN*nV~)mM?1{)#~gmq$K`WdB&B zNsmV?3r+{RzU%u(;`FxpP8inX9*uv@n;@dM^)b~PesBvSPx`SMb zS`0~;hPrp7fW94d*RLx7C?4B?d$t2j8hMbgbE(bFp;llYjmMun7c1`0O3;@;7fW~# z;+{h+($I$BKJjOc_3$&+Ub_5Kvl&CgV@_f{ihyLMm#efvYYH25?}4JhNOOfR(sUUqjW|Q zpn>JnK^FRx<#+<`Ij6~Td7OUvX9O7IJPq=lbPwHP-Kg}Xic6BKW?GcjT8@CHuQ05f zObDM(T4`@zIsmRy9CmgcLZJ(sCK%`GnEUDnZf$=X{}ghVyo{uB zvokDcT(T4_fZ_$+HH5n4W_ZUje!fWG7I~h9HQUu8*%1r&Wg63Xsr9*fyRz!N&u9az zZ9c611!k)nnm+wQi5?Gg(5};P9=wF>|xdaDi64&*)0!x}9 z>S2H4#BFli_7Wd->?Xd@Uj~kCnpurC6W6A!iCTQlO(~t9bAMxgkybl@GOkE1je7gfIDEO0AkNfY-E-8%w>{kYV*Z#E-U5_@+rtYBFN%#y zFX^;ur8H~whrlZPcqMaA!1oiab=s`$Bd_FcvtB&RKsQ2$n=+C}?Hd?lQch2ir-PXr#af8}0 zzde^H|FW9g{Iw)LA3JC9#h=h9c%glV?;>CKxu4Mc<9>eEA7UXnqW!5uL}6jhz?++| zBlw<79m22K7SrsFu>^i^NiHVVXYgWhQJ-VJMb3r1A7f(t9Lv7fne0$=Z&1Y_72`70!ry>sNZ-Vcrz<|d2TzLN9ygwc5B)s2u zy7qNigxT4@7|ro&WQR92tSgp(Z=4eli$-RjraX&7kGVVVg$Yg?FYeYS2bLlT>l~XH z?=!e5w}ugpOS{<58go})x4m+wvRkrsI4{#c^0%3P@tjFKC-+O@F(yYGju(+%j^{m) ze}TuTuZ$`|H{|Cxkw0g2#vO!Bm1|%D;X(93xOT@Ec|TYVN2fiLR^T`~xN3a`>OEdw4w3A2kT>-BY#crgLq)Zhyuj&=`{c zV?3(h50TG9-v4u7suwJ0=I|Mco{tmm%c`}|1HyWHB;(Pl$#@*`IGmG*PTE-KYM)%$ z`Q*@1ApWx+{WUHObxi1)(8IOE6SrVZvFk#2og8+TPGfJCegGQscvJi+snm& zTy5?xm*2sMx=3%>8U?c`kZ05919N7lmSQYpx#YvMsg@poPD|9&@TVa0m?-iHJ^>sT z$2-ow?|4kcOQX7E-TcnmEa?J6r#Ra!Ig8q(p)yP^FDdqw#?W}%IQcGqSC`WiF+tSk z=b3c5gzTzwE<5C}i^NC9Lmotb@j6R?9LcYdltZsWa2cM1pA9;JSfBqnhk*+@l9T?* z9e>4GB*R5lgAQd*2Co3AxJ>;fNoJ}n&Eg9vWqwoBOk4-)VjrBGz+XD36L>T-CIfxY zPnqRJyNF|#c8WPH-CL=+KUb^sYs-i{N)5XW6q99^6;=Y=yhIVO0FMpN*oHgHXYWWUu)9;#<|J*#R=Z< z9SdjRE@$o{?hf0{%BoNNz2jDYFV%p&{Aisd%}DEWtJ8bARJnoR&>?P&e%?yXEZNa+Q03PDjQM;zwm- z{%y}>JVSj5M%k~Jhxqs#^Rc<@C8$&GdRX&@cUbg+a^Ja1kBg1i#K)_La^9HXbpa2U z1i$;4ub;P)vGFZ4A>T&6Z%p37WybfBHL>~5i3aw3BXk$}geOPT}~x#WK(daI-v|jO#m#&%_v+LDe?Buf-XEE4CzlAJDI0C-7&3-jVPb zkq5M>jehzN-?4z;h5rqkgArPh`q~)ZQyMWrM(&N8TtD;qOO$KL2rA7j=rv_4z>Zc0 zmAZCdg85{Id=@pOpHweboGx~HQ>cbDNxJ1LF+9pM9r2($p076maOjg1l#CyRdb%4H z<-XGndxt)Ml+ts;yGLfn@rJ^K54K^dm_LfTjd%t=Hi>Vz8Mr{udy@P7J(qEQ3dY$W zqWAJ$xBl(t<*5yP=9A}IR=x-SAeJAgk+;`}n?&&}IVMBND7A5O(do0m78WZB(2uc8 zYIK1LY5tB4$Dv~MGr+K;4As+=T_(xqL0BidYEdJ9Z>`M|{HXS7dSI=x(m?Rg8}UCO z$N7Cdhfgm0$+v+KeQMOV{vbUfU}>b^forW!bpIl4U(OR{9M$^q@*d`^{k)`34X6;X z`1pERoz>hHekVx^608)4q66#X)b)_!Vh{bLmh`tziLEV9c6NDD%Ng?_ z;lj^pM!5o66BAdwiCqC>0y zWghCnZu_0?EvA?$=<;s%y4VAQ6nU*1cD2ueH?C3>XeO;XcItIA_oB_!EYj;9b>7+$ z7h5}>9@Gtq4LmCmUm9~D*Aso^FFYrGdY8X{`)^+HxzEvDdM(gLA+>snau`3?bbnuH zvb%7uq2inmt_#MUdiUl&T9f&Z+Q5Pq+<7lCTivRmIna-0zk)1(C#|swg0N-T3FDprx*iB4w^EB8qFuQ5V;<*F!6KqJ&rF6 zQZodQZ_Gcyn(;fY?+nz>ADqLZf#dvV&$k!13wO{u>AMgFD6q#-DbMLW!lQZ6ceTH5S{^S1Q&7`gvdj%zW ztz?}USkGIYTieW~bN{ekbIs7j z>1sN0kOLEZ0G~suFOqkBa{d8)1AHF(Y4(3$YTiSy`U{KZ{Zn)qP8?GD8#kMA!q>`< zlM|np@F6e+4{Hc(uW#nCK#~G~;mG(Pey8{{_C>DOf3Lp|7wU0nD%MwuX>;S~d(Caa z4!8`o6w+qS2JXZ(L4p1LJQOjgTs-o5q~AvRQv>S*0uNzp|J>SOcejKNqIt(a}6V zJuGW^5;f2a?)!+R!9xTNVC~T8MrGkx8xQJRJ>MxNT`%M&mZtkN?hlTP_>1Bk=ER@s zQ~!qlhp_}*Mzp-h@qdgZPPnR$umAV41V1@E5U-wyR~AL)C!wI@xu5w-`Z^=8uF6v{dkn-Q#&@Y1x_7%h&fwoc>CZ<+#$vhkq22%TUJzZay|ZIJss!MuY35v*3;7- zYiTSev9W3|ybDev*3*M9yV*Bek>k`q$IU+ZbG z71Df~-Jsq{1519}SWj_1iPGQ1dN^KBk~95W&riI=JpIqu7R^P({tw3EXZv=N$L&5a z@{+9kUL*(Ep?Z+xyrT!W)C#>f>)YLx85Ozhcl=VPhwR+KlUjLa-V-A5Hw)7V>9s605XH^ces@0Y8*9FAU>wU?i^!v^x@DjH*)j=#+jj#M5yKABHsD{3U)@fK zJ14_gpMic*PGAd`VubqOrza{ZEEL@Gn_|GFd1>H}NW;a5MNK(27Vt7-Y7LE{b5^vi zNDV^rYn)#bkwN*1ljFK5e&eNB%dI~>BpW@WL9}G$eLH)qa|@+G-%EA$*6F*r)k7q0 z!ejzff8?Bh2hcS&mWgDcpv40%f`$i~6^R2RJgODRC*T)2`kBB3@$Yva@A>oHq&@^c z?W{BX!&9}BzN*W;2+crL=Z^#TWs3S8*YC!DJvSEBWJd1?4y(Hp=+jXM6!OtStMRHKxhemMgAMaUPlh} zWj(T$)I3+r^aXE)Te6_Dw?BR9D}1kDn0SNmwWf3E{mAE$*^XO<&l~Yr@_DFpkRRb+ z9Lr`3z5NAN$j8HSa))jxTb}5A`(&f%W|_^8Y#dIK7c@!mQYN1#J((T5!WhlJ?-%*H zv3~-8UftlGz-1vA{d~mxPOEkQWDH^8jDuM3FeVc2W$lF*CGMykIi7f#b}RI#)-W5m zWm|~>P6!E$1q~(fyRp@aEocvp2cAbH*|?s!7rCDQr9R9x2DA&_&t@<^aKZ+L0&?7v zH4FV-0lc3rT=-!bdCCYaVl&IQ`3)`-w^5+N=hDw4SK+=1@mT8*E>%8Sm_Df@7V3x!zIM?Avq4 zzhZ4z-_i8c+^A?xPAv@{`!CGyC$?V7QI)%hgN5vPk-)7Nu0v8H@LQ)#n6O7k6-oYr z=TPU1ZyhGQBc@2MAL_8=dS&PQ`*)x6I;>W>wZHN@a!%k^u6OLTmf%O!>6s#<>OhIC@E`zOaA`Cur5 z)bmnBwBPxg#W_*aqtEcdsrwQGd4CJUYqXR1k-aPDuU?8HP1Bnrr`7heq@t^%-XB<; zP>%u!U~P!@zWY^nO2#F)o%2%_$#Rmo<#Y?AX;(>s`SvtuSNX%ehn#zI?BGEU7vf?bQyeFQYb4y5_`C^C zI$g+)uOy;5nL>6=?icv0@TI+pu;{3W>K9{a?CX*mADp~a1MZBR8+8qT=_!x3D(3At zUq{X*bh>|gZQu0)#=q!N?^P0%OIJs$iM@>b3$LEqm3LCSxGWmxSiaBXwQd1H z=02DeiEwGrt}6HS;!CenM(?T2Ze{V(=Ld1-OFC6A4Q^q`fD2;Jd)UKkPVPsXqviBi z6Mi$0OH8&^ZQ}^{X~9e8{a(Ei*7F`rr+5?)kcg)F*CO{e8jqJuXs#IS*
diff --git a/frontend/src/pages/LandingPage.tsx b/frontend/src/pages/LandingPage.tsx index 77162e1..ff721f3 100644 --- a/frontend/src/pages/LandingPage.tsx +++ b/frontend/src/pages/LandingPage.tsx @@ -13,7 +13,7 @@ import { AppDownloadBanner } from '../components/layout/AppDownloadBanner'; import { useNotification } from '@/hooks/useNotification'; import { processImageModeration } from '../hooks/useImageModeration'; import { useTranslation } from '../hooks/useTranslation'; -import { compressImage } from '../utils/image'; +import { processAndResizeImage } from '../utils/imageProcessor'; interface LandingPageProps { onContinue?: () => void; @@ -27,130 +27,6 @@ interface LandingPageProps { onOpenNavigation?: (payload: any) => void; } -// Helper to extract GPS location from EXIF tags in JPEG/JPG files -function getExifGps(file: File): Promise<{ latitude: number; longitude: number } | null> { - return new Promise((resolve) => { - const reader = new FileReader(); - reader.onload = (e) => { - try { - const buffer = e.target?.result as ArrayBuffer; - const view = new DataView(buffer); - if (view.byteLength < 4) { - resolve(null); - return; - } - if (view.getUint16(0, false) !== 0xFFD8) { - resolve(null); - return; - } - let offset = 2; - const length = view.byteLength; - while (offset < length - 2) { - const marker = view.getUint16(offset, false); - if (marker === 0xFFE1) { - const app1Length = view.getUint16(offset + 2, false); - if (offset + 4 + app1Length > length) { - resolve(null); - return; - } - const exifHeader = view.getUint32(offset + 4, false); - if (exifHeader === 0x45786966) { - const tiffOffset = offset + 10; - const bigEndian = view.getUint16(tiffOffset, false) === 0x4D4D; - if (view.getUint16(tiffOffset + 2, bigEndian) !== 0x002A) { - resolve(null); - return; - } - const firstIFD = view.getUint32(tiffOffset + 4, bigEndian); - let ifdOffset = tiffOffset + firstIFD; - if (ifdOffset + 2 > length) { - resolve(null); - return; - } - const numEntries = view.getUint16(ifdOffset, bigEndian); - let gpsInfoOffset = 0; - for (let i = 0; i < numEntries; i++) { - const entryOffset = ifdOffset + 2 + i * 12; - if (entryOffset + 12 > length) break; - const tag = view.getUint16(entryOffset, bigEndian); - if (tag === 0x8825) { - gpsInfoOffset = view.getUint32(entryOffset + 8, bigEndian); - break; - } - } - if (gpsInfoOffset) { - const gpsIFDOffset = tiffOffset + gpsInfoOffset; - if (gpsIFDOffset + 2 > length) { - resolve(null); - return; - } - const numGpsEntries = view.getUint16(gpsIFDOffset, bigEndian); - let latRef = 'N'; - let lonRef = 'E'; - let latVal: number[] = []; - let lonVal: number[] = []; - for (let i = 0; i < numGpsEntries; i++) { - const entryOffset = gpsIFDOffset + 2 + i * 12; - if (entryOffset + 12 > length) break; - const tag = view.getUint16(entryOffset, bigEndian); - if (tag === 1) { - latRef = String.fromCharCode(view.getUint8(entryOffset + 8)); - } else if (tag === 2) { - const offsetVal = view.getUint32(entryOffset + 8, bigEndian); - latVal = readRationalArray(view, tiffOffset + offsetVal, bigEndian, length); - } else if (tag === 3) { - lonRef = String.fromCharCode(view.getUint8(entryOffset + 8)); - } else if (tag === 4) { - const offsetVal = view.getUint32(entryOffset + 8, bigEndian); - lonVal = readRationalArray(view, tiffOffset + offsetVal, bigEndian, length); - } - } - if (latVal.length === 3 && lonVal.length === 3) { - const latitude = convertDMSToDD(latVal[0], latVal[1], latVal[2], latRef); - const longitude = convertDMSToDD(lonVal[0], lonVal[1], lonVal[2], lonRef); - resolve({ latitude, longitude }); - return; - } - } - } - break; - } else if (marker >= 0xFFD0 && marker <= 0xFFD9) { - offset += 2; - } else { - const blockLength = view.getUint16(offset + 2, false); - offset += 2 + blockLength; - } - } - resolve(null); - } catch (err) { - console.error('Error parsing EXIF:', err); - resolve(null); - } - }; - reader.onerror = () => resolve(null); - reader.readAsArrayBuffer(file.slice(0, 128 * 1024)); - }); -} - -function readRationalArray(view: DataView, offset: number, bigEndian: boolean, maxLen: number): number[] { - const values = []; - if (offset + 24 > maxLen) return []; - for (let i = 0; i < 3; i++) { - const num = view.getUint32(offset + i * 8, bigEndian); - const den = view.getUint32(offset + i * 8 + 4, bigEndian); - values.push(den === 0 ? 0 : num / den); - } - return values; -} - -function convertDMSToDD(degrees: number, minutes: number, seconds: number, ref: string): number { - let dd = degrees + minutes / 60 + seconds / 3600; - if (ref === 'S' || ref === 'W') { - dd = -dd; - } - return dd; -} - export const LandingPage: React.FC = ({ onGoToSignup, onGoToMap, @@ -318,30 +194,22 @@ export const LandingPage: React.FC = ({ notify({ title: 'Đang xử lý...', message: 'Vui lòng chờ trong giây lát.', type: 'info' }); try { - // Nén ảnh trước - const compressedFile = await compressImage(file); + // Process image: Reads EXIF data and forces 2K resizing on device memory + const { file: processedFile, latitude: exifLat, longitude: exifLng } = await processAndResizeImage(file); // 0. Kiểm duyệt ảnh - const moderationResult = await processImageModeration(compressedFile); + const moderationResult = await processImageModeration(processedFile); if (moderationResult.blocked) { notify({ title: 'Ảnh bị từ chối', message: `Ảnh ${file.name} chứa nội dung không phù hợp và bị chặn.`, type: 'error' }); return; } - const processedFile = moderationResult.file; + const finalProcessedFile = moderationResult.file; // Determine image upload coordinates based on priority checklist: - let finalLat: number | null = null; - let finalLng: number | null = null; + let finalLat: number | null = exifLat; + let finalLng: number | null = exifLng; - // 1. Read EXIF GPS metadata location from the uploaded image itself - try { - const exifLoc = await getExifGps(file); - if (exifLoc) { - finalLat = exifLoc.latitude; - finalLng = exifLoc.longitude; - console.log('[Upload Location] Priority 1: EXIF data coordinates found:', finalLat, finalLng); - } - } catch (e) { - console.error('[Upload Location] Error reading EXIF from file:', e); + if (finalLat !== null && finalLng !== null) { + console.log('[Upload Location] Priority 1: EXIF data coordinates found:', finalLat, finalLng); } // 2. Get current mobile/device GPS position of the user @@ -396,11 +264,11 @@ export const LandingPage: React.FC = ({ } // Save file and resolved coordinates into state - setPendingPhotoFile(processedFile); + setPendingPhotoFile(finalProcessedFile); setPendingPhotoLocation({ latitude: finalLat, longitude: finalLng }); // Tạo preview URL cho ảnh - const previewUrl = URL.createObjectURL(processedFile); + const previewUrl = URL.createObjectURL(finalProcessedFile); setPhotoPreviewUrl(previewUrl); setIsTagsModalOpen(true); diff --git a/frontend/src/utils/imageProcessor.ts b/frontend/src/utils/imageProcessor.ts new file mode 100644 index 0000000..c98a2de --- /dev/null +++ b/frontend/src/utils/imageProcessor.ts @@ -0,0 +1,205 @@ +// Helper to extract GPS location from EXIF tags in JPEG/JPG files +function getExifGps(file: File): Promise<{ latitude: number; longitude: number } | null> { + return new Promise((resolve) => { + const reader = new FileReader(); + reader.onload = (e) => { + try { + const buffer = e.target?.result as ArrayBuffer; + const view = new DataView(buffer); + if (view.byteLength < 4) { + resolve(null); + return; + } + if (view.getUint16(0, false) !== 0xFFD8) { + resolve(null); + return; + } + let offset = 2; + const length = view.byteLength; + while (offset < length - 2) { + const marker = view.getUint16(offset, false); + if (marker === 0xFFE1) { + const app1Length = view.getUint16(offset + 2, false); + if (offset + 4 + app1Length > length) { + resolve(null); + return; + } + const exifHeader = view.getUint32(offset + 4, false); + if (exifHeader === 0x45786966) { + const tiffOffset = offset + 10; + const bigEndian = view.getUint16(tiffOffset, false) === 0x4D4D; + if (view.getUint16(tiffOffset + 2, bigEndian) !== 0x002A) { + resolve(null); + return; + } + const firstIFD = view.getUint32(tiffOffset + 4, bigEndian); + let ifdOffset = tiffOffset + firstIFD; + if (ifdOffset + 2 > length) { + resolve(null); + return; + } + const numEntries = view.getUint16(ifdOffset, bigEndian); + let gpsInfoOffset = 0; + for (let i = 0; i < numEntries; i++) { + const entryOffset = ifdOffset + 2 + i * 12; + if (entryOffset + 12 > length) break; + const tag = view.getUint16(entryOffset, bigEndian); + if (tag === 0x8825) { + gpsInfoOffset = view.getUint32(entryOffset + 8, bigEndian); + break; + } + } + if (gpsInfoOffset) { + const gpsIFDOffset = tiffOffset + gpsInfoOffset; + if (gpsIFDOffset + 2 > length) { + resolve(null); + return; + } + const numGpsEntries = view.getUint16(gpsIFDOffset, bigEndian); + let latRef = 'N'; + let lonRef = 'E'; + let latVal: number[] = []; + let lonVal: number[] = []; + for (let i = 0; i < numGpsEntries; i++) { + const entryOffset = gpsIFDOffset + 2 + i * 12; + if (entryOffset + 12 > length) break; + const tag = view.getUint16(entryOffset, bigEndian); + if (tag === 1) { + latRef = String.fromCharCode(view.getUint8(entryOffset + 8)); + } else if (tag === 2) { + const offsetVal = view.getUint32(entryOffset + 8, bigEndian); + latVal = readRationalArray(view, tiffOffset + offsetVal, bigEndian, length); + } else if (tag === 3) { + lonRef = String.fromCharCode(view.getUint8(entryOffset + 8)); + } else if (tag === 4) { + const offsetVal = view.getUint32(entryOffset + 8, bigEndian); + lonVal = readRationalArray(view, tiffOffset + offsetVal, bigEndian, length); + } + } + if (latVal.length === 3 && lonVal.length === 3) { + const latitude = convertDMSToDD(latVal[0], latVal[1], latVal[2], latRef); + const longitude = convertDMSToDD(lonVal[0], lonVal[1], lonVal[2], lonRef); + resolve({ latitude, longitude }); + return; + } + } + } + break; + } else if (marker >= 0xFFD0 && marker <= 0xFFD9) { + offset += 2; + } else { + const blockLength = view.getUint16(offset + 2, false); + offset += 2 + blockLength; + } + } + resolve(null); + } catch (err) { + console.error('Error parsing EXIF:', err); + resolve(null); + } + }; + reader.onerror = () => resolve(null); + reader.readAsArrayBuffer(file.slice(0, 128 * 1024)); + }); +} + +function readRationalArray(view: DataView, offset: number, bigEndian: boolean, maxLen: number): number[] { + const values = []; + if (offset + 24 > maxLen) return []; + for (let i = 0; i < 3; i++) { + const num = view.getUint32(offset + i * 8, bigEndian); + const den = view.getUint32(offset + i * 8 + 4, bigEndian); + values.push(den === 0 ? 0 : num / den); + } + return values; +} + +function convertDMSToDD(degrees: number, minutes: number, seconds: number, ref: string): number { + let dd = degrees + minutes / 60 + seconds / 3600; + if (ref === 'S' || ref === 'W') { + dd = -dd; + } + return dd; +} + +interface ProcessedImageResult { + file: File; + latitude: number | null; + longitude: number | null; +} + +export const processAndResizeImage = async (file: File): Promise => { + // 1. Read EXIF coordinates first from the original file + let latitude: number | null = null; + let longitude: number | null = null; + try { + const gps = await getExifGps(file); + if (gps) { + latitude = gps.latitude; + longitude = gps.longitude; + } + } catch (e) { + console.error('[imageProcessor] Failed to read EXIF GPS:', e); + } + + // 2. Perform resizing to maximum 2048px on its longest edge + return new Promise((resolve) => { + if (!file.type.startsWith('image/')) { + return resolve({ file, latitude, longitude }); + } + + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = (event) => { + const img = new Image(); + img.src = event.target?.result as string; + img.onload = () => { + const canvas = document.createElement('canvas'); + let width = img.width; + let height = img.height; + const MAX_SIZE = 2048; + + if (width > MAX_SIZE || height > MAX_SIZE) { + if (width > height) { + height = Math.round((height * MAX_SIZE) / width); + width = MAX_SIZE; + } else { + width = Math.round((width * MAX_SIZE) / height); + height = MAX_SIZE; + } + } + + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext('2d'); + if (!ctx) { + return resolve({ file, latitude, longitude }); + } + + ctx.drawImage(img, 0, 0, width, height); + canvas.toBlob((blob) => { + if (blob) { + const newName = file.name.replace(/\.[^/.]+$/, "") + ".jpg"; + const resizedFile = new File([blob], newName, { + type: 'image/jpeg', + lastModified: Date.now() + }); + resolve({ + file: resizedFile, + latitude, + longitude + }); + } else { + resolve({ file, latitude, longitude }); + } + }, 'image/jpeg', 0.88); // 88% quality sweet-spot + }; + img.onerror = () => { + resolve({ file, latitude, longitude }); + }; + }; + reader.onerror = () => { + resolve({ file, latitude, longitude }); + }; + }); +};