From 1142fd7f33af34909562590851c38fdcd5aa56a7 Mon Sep 17 00:00:00 2001 From: Med Kamel Date: Thu, 17 Apr 2025 02:26:15 +0100 Subject: [PATCH] user registration and login --- app/index.tsx | 2 +- app/screens/auth/OpeningScreen.tsx | 0 app/screens/auth/SignIn-Screen.tsx | 41 +++--- app/screens/auth/SignUpScreen.tsx | 219 ++++++++++++++++++++++++++--- assets/images/Flag_Tunisia.png | Bin 0 -> 19509 bytes 5 files changed, 222 insertions(+), 40 deletions(-) delete mode 100644 app/screens/auth/OpeningScreen.tsx create mode 100644 assets/images/Flag_Tunisia.png diff --git a/app/index.tsx b/app/index.tsx index 6e68ea0..e413290 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -9,7 +9,7 @@ const OpeningScreen = () => { return ( - + Bienvenue chez Brix Café diff --git a/app/screens/auth/OpeningScreen.tsx b/app/screens/auth/OpeningScreen.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/app/screens/auth/SignIn-Screen.tsx b/app/screens/auth/SignIn-Screen.tsx index e110129..7a6a33a 100644 --- a/app/screens/auth/SignIn-Screen.tsx +++ b/app/screens/auth/SignIn-Screen.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; import {View,Text,TextInput,Pressable,StyleSheet,Image,Alert,TouchableOpacity,} from "react-native"; -import { Eye, EyeOff,ArrowLeft } from "lucide-react-native"; +import { Eye, EyeOff,ArrowLeft,Check } from "lucide-react-native"; import { router } from "expo-router"; import { signIn } from "../../../firebase/auth"; // Assure-toi que le chemin est correct import { Link } from "expo-router"; @@ -62,13 +62,12 @@ const SignInScreen = () => { keyboardShouldPersistTaps="handled" // Ensures that taps on the inputs won't dismiss the keyboard > - setStep(1)} - > - - - + router.back()} + > + + Se connecter @@ -131,18 +130,22 @@ const SignInScreen = () => { - setForm({ ...form, rememberMe: !form.rememberMe })} + setForm({ ...form, rememberMe: !form.rememberMe })} + > + - - Rester Connecté - + {form.rememberMe && } + + + Rester Connecté + + Mot de passe oublié? diff --git a/app/screens/auth/SignUpScreen.tsx b/app/screens/auth/SignUpScreen.tsx index fe8e9df..6a6122f 100644 --- a/app/screens/auth/SignUpScreen.tsx +++ b/app/screens/auth/SignUpScreen.tsx @@ -1,13 +1,48 @@ import React, { useState } from 'react'; -import {View,Text,TextInput,TouchableOpacity,ScrollView,StyleSheet,SafeAreaView,Image,Pressable,} from 'react-native'; +import {View,Text,TextInput,TouchableOpacity,ScrollView,StyleSheet,SafeAreaView,Image,Pressable,Modal} from 'react-native'; import { StatusBar } from 'expo-status-bar'; -import { ArrowLeft, Eye, EyeOff, MapPin } from 'lucide-react-native'; +import { ArrowLeft, Eye, EyeOff, MapPin,Check } from 'lucide-react-native'; import { doc, setDoc } from 'firebase/firestore'; import { db } from '../../../firebase/config'; import { signUp } from '../../../firebase/auth'; import { Alert } from 'react-native'; import { router } from "expo-router"; +const cities = [ + 'Ariana', 'Ben Arous', 'Bizerte', 'Béja', 'El Kef', 'Ettadhamen', 'Gabes', + 'Gafsa', 'Jendouba', 'Kairouan', 'Kasserine', 'Kebili', 'Mahdia', 'Medenine', + 'Monastir', 'Nabeul', 'Sfax', 'Siliana', 'Sidi Bouzid', 'Sousse', 'Tataouine', + 'Tozeur', 'Tunis', 'Zaghouan' +]; + +const delegationsByGouvernorat: Record = { + Ariana: ['Ariana Medina', 'Ettadhamen', 'Kalaat El Andalous', 'Mnihla', 'Raoued', 'Sidi Thabet', 'Soukra'], + Béja: ['Amdoun', 'Beja North', 'Beja South', 'Goubellat', 'Mejez El Bab', 'Nefza', 'Teboursouk', 'Testour', 'Thibar'], + 'Ben Arous': ['Ben Arous', 'Boumhel', 'El Mourouj', 'Ezzahra', 'Fouchana', 'Hammam Chott', 'Hammam Lif', 'M\'Hamdia', 'Medina Jedida', 'Mégrine', 'Mornag', 'Rades'], + Bizerte: ['Bizerte Nord', 'Bizerte Sud', 'Joumine', 'El Alia', 'Ghar El Melh', 'Mateur', 'Menzel Bourguiba', 'Menzel Jemil', 'Ras Jebel', 'Sejnane', 'Tinja', 'Utique', 'Zarzouna','Manzel Abderrahmen','El Alia','Ghezala'], + Gabès: ['Gabès', 'El Hamma', 'Matmata', 'Mareth', 'Nouvelle Matmata', 'Chouchet'], + Gafsa: ['Gafsa', 'El Guettar', 'Mdhila', 'Redeyef', 'Metlaoui', 'Sidi Aich', 'Belkhir', 'Om Larayes'], + Jendouba: ['Jendouba', 'Ain Draham', 'Fernana', 'Ghardimaou', 'Tabarka', 'Balta Bou Aouane', 'Oued Meliz'], + Kairouan: ['Kairouan', 'Bou Hajla', 'Chebika', 'El Alaa', 'El Fahs', 'Haffouz', 'Nasrallah', 'Oueslatia', 'Sbiba', 'Sidi Alouane', 'Soliman', 'Thala'], + Kasserine: ['Kasserine', 'Foussana', 'Hassi El Ferid', 'Haidra', 'Sbeitla', 'Thala', 'Tounine', 'Sidi Bouali'], + Kébili: ['Kébili', 'Douz', 'Souk Lahad', 'El Faouar', 'Chbika'], + Kef: ['Kef', 'Dahmani', 'El Ksour', 'Kalaa Khasba', 'Nebeur', 'Sers', 'Tajerouine', 'Zouila'], + Mahdia: ['Mahdia', 'Bou Merdes', 'Chorbane', 'El Jem', 'Ksour Essef', 'Melloulèche', 'Rejiche', 'Sahline', 'Sidi Alouane'], + Manouba: ['Manouba', 'Borj El Amri', 'El Battan', 'Jedaida', 'Mornaguia', 'Tebourba'], + Medenine: ['Medenine', 'Ben Guerdane', 'Beni Khedache', 'Djerba', 'Zarzis', 'Ajim', 'Houmt Souk'], + Monastir: ['Monastir', 'Bekalta', 'Ksibet El Mediouni', 'Ksar Hellal', 'Menzel Harb', 'Sahline', 'Sayada', 'Téboulba'], + Nabeul: ['Nabeul', 'Hammamet', 'Kelibia', 'Korba', 'Menzel Temime', 'Takelsa', 'Soliman', 'Dar Chaâbane El Fehri', 'Bou Argoub'], + Sfax: ['Sfax', 'El Amra', 'El Hencha', 'El Ouardia', 'Kerkennah', 'Menzel Chaker', 'Skhira', 'Thyna'], + 'Sidi Bouzid': ['Sidi Bouzid', 'Bir El Hafey', 'Menzel Bouzelfa', 'Meknassy', 'Regueb', 'Sidi Ali Ben Aoun', 'Sbiba'], + Siliana: ['Siliana', 'Bou Arada', 'Gaafour', 'Kesra', 'Makthar', 'Rouhia', 'Sidi Bou Rouis'], + Sousse: ['Sousse', 'Akouda', 'Enfidha', 'Hergla', 'Kalaa Sghira', 'Khezama', 'Msaken', 'Sidi Bou Ali', 'Sidi El Hani'], + Tataouine: ['Tataouine', 'Beni Khedache', 'Dhehiba', 'Ghomrassen', 'Ksar Ouled Soltane', 'Remada'], + Tozeur: ['Tozeur', 'Nefta', 'Degache', 'Chbika'], + Tunis: ['Tunis', 'Carthage', 'Le Bardo', 'La Goulette', 'La Marsa', 'Medina', 'El Omrane', 'El Menzah', 'Ettadhamen', 'El Kabaria', 'El Kram', 'Ezzahra', 'Fouchana', 'Hammam Chott', 'Hammam Linf', 'Mornag', 'Raoued', 'Sidi Thabet', 'Soukra','Boumhel', 'El Mourouj', 'Fouchana', 'Hammam Chott', 'Hammam Lif', 'M\'Hamdia', 'Medina Jedida', 'Mégrine'], + Zaghouan: ['Bir Mcherga', 'El Fahs', 'Nadhour', 'Saouaf', 'Zriba', 'Zaghouan'] +}; + + export default function App() { @@ -30,6 +65,19 @@ export default function App() { fiscalId: '', acceptTerms: false, }); + const [showCityPicker, setShowCityPicker] = useState(false); + const [showDelegationPicker, setShowDelegationPicker] = useState(false); + + const handleCitySelect = (city: string) => { + setFormData(prev => ({ ...prev, city, delegation: '' })); + setShowCityPicker(false); + }; + + const handleDelegationSelect = (delegation: string) => { + setFormData(prev => ({ ...prev, delegation })); + setShowDelegationPicker(false); + }; + const handleInputChange = (name: string, value: string | boolean) => { setFormData(prev => ({ @@ -38,6 +86,19 @@ export default function App() { })); }; + const formatPhoneNumber = (phone: string) => { + const cleaned = phone.replace(/\D/g, "").slice(0, 8); // Garde que les chiffres (max 8) + const part1 = cleaned.slice(0, 2); + const part2 = cleaned.slice(2, 5); + const part3 = cleaned.slice(5, 8); + return [part1, part2, part3].filter(Boolean).join(" "); + }; + + const handlePhoneChange = (value: string) => { + const cleaned = value.replace(/\D/g, "").slice(0, 8); // que les chiffres, max 8 + setFormData({ ...formData, phone: cleaned }); + }; + const handleNext = () => { setStep(2); }; @@ -104,21 +165,30 @@ export default function App() { - Numéro de téléphone - handleInputChange('phone', value)} + Numéro de téléphone + + + +216 + handlePhoneChange(value)} + maxLength={11} + /> + Mot de passe handleInputChange('password', value)} @@ -137,6 +207,7 @@ export default function App() { handleInputChange('confirmPassword', value)} @@ -190,9 +261,7 @@ export default function App() { { - // Add city picker logic here - }} + onPress={() => setShowCityPicker(true)} > {formData.city || 'Sélectionner une ville'} @@ -201,15 +270,62 @@ export default function App() { + setShowCityPicker(false)} + > + + + Sélectionner une Ville + + {cities.map((city, index) => ( + handleCitySelect(city)}> + {city} + + ))} + + setShowCityPicker(false)} + > + Fermer + + + + + + setShowDelegationPicker(false)} + > + + + Sélectionner une Délégation + + {availableDelegations.map((del, index) => ( + handleDelegationSelect(del)}> + {del} + + ))} + + setShowDelegationPicker(false)} > + Fermer + + + + + Délégation { - // Add delegation picker logic here - }} + onPress={() => setShowDelegationPicker(true)} > {formData.delegation || 'Sélectionner une délégation'} @@ -233,17 +349,23 @@ export default function App() { handleInputChange('acceptTerms', !formData.acceptTerms)} - /> + > + {formData.acceptTerms && } + + J'accepte les conditions générales et la politique de confidentialité. + Valider ); + const availableDelegations = delegationsByGouvernorat[formData.city] || []; + return ( @@ -354,7 +476,7 @@ const styles = StyleSheet.create({ }, selectText: { fontSize: 16, - color: '#9ca3af', + color: '#000', }, checkboxContainer: { flexDirection: 'row', @@ -365,14 +487,14 @@ const styles = StyleSheet.create({ width: 20, height: 20, borderWidth: 2, - borderColor: '#d1d5db', + borderColor: "#B17741", borderRadius: 4, marginRight: 8, marginTop: 2, }, checkboxChecked: { - backgroundColor: '#22C55E', - borderColor: '#22C55E', + backgroundColor: '#B17741', + borderColor: "#B17741", }, checkboxLabel: { flex: 1, @@ -404,4 +526,61 @@ const styles = StyleSheet.create({ fontSize: 14, color: '#B77729', }, + modalOverlay: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: 'rgba(0, 0, 0, 0.5)', + }, + modalContainer: { + backgroundColor: 'white', + padding: 20, + borderRadius: 10, + width: '90%', + height: '80%' + }, + modalTitle: { + fontSize: 18, + fontWeight: '600', + marginBottom: 12, + }, + cityItem: { + fontSize: 16, + paddingVertical: 8, + paddingHorizontal: 10, + borderBottomWidth: 1, + borderBottomColor: '#d1d5db', + }, + closeButton: { + backgroundColor: '#B77729', + borderRadius: 8, + padding: 10, + alignItems: 'center', + marginTop: 12, + }, + phoneContainer: { + flexDirection: 'row', + alignItems: 'center', + borderRadius: 8, + padding: 3, + borderWidth: 1, + borderColor: '#ddd', + }, + flag: { + width: 18, + height: 12, + borderRadius: 2, + marginRight: 8, + marginLeft: 8, + }, + prefix: { + fontSize: 16, + color: '#B77729', + marginRight: 5, + }, + phoneNum:{ + color: '#000', + fontSize: 16, + width: '100%', + } }); \ No newline at end of file diff --git a/assets/images/Flag_Tunisia.png b/assets/images/Flag_Tunisia.png new file mode 100644 index 0000000000000000000000000000000000000000..530d8a640d847a96b1999e2e500e4d9d1ac3c21b GIT binary patch literal 19509 zcmeIaWmr~i*DiWfQX)u82ue3d2}mg+-JOEcozjTX^+-2JcXui&NOyOqbPDU5_Xhdi*7z{(=t%xEFhVUH*gZD;(2fvw3 z^uq-oh{nP)!Z27_IQq>yB=9r2;af!+7|fL#2J`*`gI$4Nd2hmCj;t`)wmuBT8wZ0C z*d)~}yaIoCU?3$f0=t9$r8VV5g5MxJNXUpHZ$7}pKxCozZK{F6q~mjyNif|QO+wzu^N_*IrspJ{+^huOSijDkMN zg%H3M(F9z)VHn_wl?Df{@EqVG=$VcSO>A2?=Z^CC2W+m{m$Cy9g>Ch0>XhNx~sBJP~2(00Kne${Epc zEiA;oosst%Scpt5LW77*B;!FrNE)j4N29wWoHTNM-6{jCCOma!vc(C>1@DbaZ(&Ht z-Vw=Tawy%(a4=@fVA1>tqasC#d}ZPMBx;p>T9tfqm3$LArR^Y2VSX1)9(NHQcjfM0 z-fO|umiP4W;)p6)UiW9ub>Q2fZM7z6A!l(#wpzt_iD7|~Qph1;X>tN1gP^fr^}(Y9 zKCF2!)=HNKSKh>Z1nAsH-DGY#OcIS&aMu0s9KjfOt;$4OlfDv-%IIq4JO8=E?ayU_ zVL6kBbz+e0%}i=>SLo>afbLV%)TR#2F14d20*iS=-RnYKv;823MHEUbpI7vJTS5g?nHPQk6l zc(7|*Q?Zj=UC)`QixbDm{d-NVXUOnxqvtPPN}b`$%pth(@YUcHCbhZ7=jPw+ zX)b)}{!|z2D<9wrnP?#q$_=!&q`8J#vTfse%S0KhOu3XZFSfSx?)Pi4ZGRsnO_W4s zyy3L}!(*2zL2OLG!F8D9a;B=;HWJ<*A2sMTKQzAYluBA5U1Lqb*MZN*^C#pnbZFx> znh*6ZI%S5@(DEKYYepEG<&f`YLv~Jqz$g)@{Ki@H-B+(+hXXA#+Los|M37g|XBGF()$GNPfyKiyn11awF2f+~VTY~wPHp%?41G)vE*7FNzi0XHC1V78 zd<8V97Z(&#uia<;t$7=qzu{gW+>M5``lpVep@HuJYkAY@WZ3p4ZzYr7Gz#8Jg6GIw zc;Ls8Gcow<+~Fe*Sd&H(8%2tQZo@w(A@={!$H-}NvRL(+TXe$pLVOZ!7ITZrQsUQm&n%Wt@ev<%ZEapRQ?^4jN~voGrCrjX17)>-*jafF0}ogf2DOz@!&AMoQP4R!$pYQ zf6b%ig|{C%-HmENa&y6dOjXFrF|L$<0K?zasgtdU{JDF=l#u zJoEnM-k$k-jiY)|#g3yWcr`!eVvAvCbkdrdY+RV+qY@h!EnTs|+)7sq#iT{lGIv6D z%1gZdUd0#TxyI#HNv}9*)c7Ma)>rd+ToNW2OnhSW$WeT#e;F^V;qmWR(5MBY9{SJ* zJPoJf8G_t`Of@AV2LYraYCa;?m@e>tcr3cGYQ(b2T-{uiz|b(g z4n0WEv*KfWqIL*0!y$qt0c9C_hYvkix3TTZxPeV?^t3nWI$z?yj_#%K$=;fIthg2g zW(An^T^XV&qA>!)S3~1;&EWzJ?yEe)Ds{|oz}^r>Q+9-V(YW?+s>&sQRV#|*wm>af zAenBGlgC}D9y6;ND}HA_{1dnaUP0Um zl%ocVn~s7we;`S%g=)#v*P9k8j14VuiSHPl8F7o=xNU!WVt?d@@%Z(#Vg=}Eh$YDE zo?UF=Bso`wkFw;tc>M5{LeOK0iY-w+Mt{EU2CT4Aw?;--_R**Ovc^RJei zaC{WIJa}+`Sv!@Nov3=_cTGl~!`s`F)3WH1{){7tYfxvP4_lRW;Mps(vYj94p33^X zX)CVpr+a02tJB1pnu?AOJb?H7all*(t8w{C*xMNwHQk2pyYAKRNuru%-1WR1T%9gz zZfbYedosl0nyJO=krUteb_Sujcc79$9ie%7u!YN}_qLA(r8i;YdU51;${&UK8ep?) zuN<6D_uff_Ch>{d%yYXqpFeJWSF8gK*tJw0JKKGCcb@7+vy90I*FoIj51wF2s~RJv zc^VQY@eQYxZv5>F&9-S)KUTb?$i+uLt4}rqiV*1*A8O|!6 z`R15?=~&5%r$bsn*PIV!{GWyk8X1<&>)d`~M+7iI0bFI)cQePUSV~?<$S#W()Iw7imgWXnG(?l9SR$&rS4;xQ^{%BzD4 zwp1G8lop4K_6w=XL{?T)P5sWKbOLegWET67=4`uNh5^2YIl6%KCuF&HGjlX7dNP90 zPN01Za6#laOEqPCA`7+Uf)2+ClFJ-5Z`qegqVZtj;0=2n3$vNEMO(p&8l5*-XH$5z7j~L&!taRZ>_-{a&hjOtkL6|BUcDZ{%Pr+c(h}C zh4me24vP-X8$C$ON^Nd_ddzvvuqH;p6Bu(@!BTQ=Eye3zt8&X`pDDTC9tQgX763Da?hA!z+TMhUW4U zB9@POb>qC8$+-L<*xcq=RhJ>y=(4d0Y(1UrVk{cFfjjs)blK#WD;_@N?5ZG_eCQ=0 z)7M?KV3%Q16HjrX)*_3J_-2P|!~@nJif01bcxOGwXxhzKK_Wm?GNU}W@%WJ#+oP>% zdele(-~>NQ__QQU>^Cn)L_3f`Gb1G!?WSR>KoZ|DpqW2#SjQ1V_lRs7`|F?1GvBZ`Zo%I&KNi49l9=*7d=7UpOw zKZq;KEi>nEHYHTa%4ijBj|0P-FvgS@>!qqDXY7A|i#1;%Sh?Zxf z-zj9y6S&Gbb7^>Y)#{O!Y%aR=Rvi=H>~Q~DuvC6TRu^UcH3?VHvN1yjog$XE(o(Ho zrUv~RRs}q?LiT|kd!hrS-^8rGoflyS`88pyG*|}6`U5Br8S3%AkTZjNJ6eWX0~wno zMVCu6CalH)K{|;t>*iHpFTOJ9-So_Kw28AZL0!GjI?E1?R2^X7FCGX|yx3%25Kk4A za8}1&CUu@)YHY}85>*=7d-2hnGga@_$&%bqSAU*cQ+NsKmQL+1<&dm}O1#HsNOLbUnO{G zxv)nj*e&>BoJThT;6pi0wwY3zqE*Lw!IxgBI1mE#zDq?nFjPD%;$FYf`*`uAwF{(3)na4F+Dd{#`SGK03Fw|x# z2W0@9%xU0iHFJ9O^m&n&gRJC9st3-5LGLWIq7WHmYlt`np5ocmcEx@HkgNU_K@;SUA6xzqkknNarqD zHBz;&YP`@Y*U79rNv9(3XyjS_!vIZuNtj4Qt+O~06F-9>X;0H$N`S-wz`}=-f|A+^ z!ma`==6%}|zglGDIENyxW_rRBk|SsG?LlnnXO?49)75;4{RauaGZ6~6Ux}ooR_v;- z0#46sRE$sC^M2-*9;e9CU5_`oI(;bB(H?qa<%GFQ6_8Gj0<1)1wN5A(Wm59Yl(nU- zF`PoM+DmT}DhWDh?#EbVgDcaQXSJsNo%TY%Y{xJVbK8cjRL4B5l)~38FHc)AG(O)f z)zRZK?Sp6QG)!9eJtzHHJfn@`zePum20Xe5-T7xsLVAAmpoj%S`S+Q|AfWATnD{5< z?wRI)vmj!@>6aKv1FP@#oIfY%36a4K`C0CI zo8TT_1&77d5a#gD*9iP>J}aIoFe~!Z8LqJ>-J53p&dj2f?68sS{F9*tomq>jvuoPg z!X#>gDqO2{YV||GCI$I42!2Es?Cm>_Kxf$c*NKmM4(zNO#N~07)W(L&EL&H@+b>=| zP)8jK3PQgUAc|{ZwLN^e()ct3$!BVUOBuu<$Z!h2&S{@=agIx9LL*b6DO%PS_`c6> zX+%KbViKS4iFSJXWZV}G978>i=ClngD)wKrMRvTe1_WgfU<%w6&}8D}DRxACP84Z) z249JfvOYh{Txl5_xFH|T_wI^DYzBk194WT&q?wo3_HrWqmubKQ-`B?ZTwJo*$TmpO z5MtwEQ#s$d;v;_h{moc9Ifdzi6itzakZW@*iKSMD$A#G8aS36TFqc*@I^%1EAzwTb z@}RdMhMj8>F4YVjB)l`$!#{EBZS1HVFHC{VT-mD?Ndn37A%NriWow8tI3=B2BY*!$ z-69~@+|SudTb$QG8!@!%MrgbSPamJs^lHHVQuVyx`RzHD| z;8)sk^7?VGQ{uB*MNx%vb1n?Bi$Gbp^yMch*f53Ga-54s<+_UZYPuuBu5d&@-=&4}opEkb2 ziM<_25R?bVDKgvGEm90s&%-K-sWR9v9L;jJXA&Rr2g(*;{f6E-V{S=VLumi2&`GTh zf-BKCst%S=MbCZ?Lk!E%Z5mH@r4zy}wTUGg&v4`_pVwlwwzd8zc!sY=;ee%N?ACDCuyYm1Lj1|HO$XRH#BywyA4q>aY>XePoJcD zv9~Vyc!r~X`{&ZAyF3erK(>OCny|tJpwZib9Jb!jHV_B^ss{nM34Me9{=LishOPOB z2b(9P>4f43YzQ0LvGLYmv`~nlO6Ga5_pF zEn8_Rsd|%48kSr?b1NNR9W|Vdzzd5tC@|L}lck|R(UpdT%J6Pq;^utF^1Bj~4&4zI zma{4X(!H6u^gIxy2I~=advl|>?HGw&n3F;C72C?67Q64C^QHRW%* zzlZLrn2Xb%bIY?wgvemTHVR3kGnzdy<24wcwkp;f6MI#-**YUxorCuM9rfT(rDZ+O zKam_-1|*utD~8QzDIh~J`}-5YS5&z4M7Q-@+xX}6Z_TUBWu~`|wom741mFKA{^Taa z5_G==fdC_{jIUo+|2V&N0G!`?eqx0^A7EBw=1xUfLLOR9cT%PCb&(cjp{@O0ffVw| zih|}G9+UE2k3am8G68DQf!C`#Bj+A3lNJpBQB`kONjq06Ty3mj{{TS_>9(<|$YzY+ za&d(u0tUtD9bR1HD8?yw_C3$SF1R}FEx6%1pq0f2GoijSI$8#&Nxn(S+4(-4r0KwM zcKn4wr;z@*_T6f{Hu_chSP6xWQamp-@6>76^|4;d%4?IT>@vP|-DTEIB=6eNY<`Xa zXk*W_>COhowdYVvqgvyg>s!Bk*9BtZ;-HQu!Jdc&&{XL73eEN5@cVd%*W$%i&Wec8 z%xxBq6<1}ejg-LwqBJ^{T}GKrJQ4rvm0<}$B_xMM$EWH!*;QALe|J5{hKKXk4D5i9 zES`Q*-EiU388I9g`~(92mHNTsh*hRX_YZa6Y2e$w*!ot)_lCGSE>|1ioFdKw@gwiW z0P8<2-H&kZ&k%FoYaa8^d|s~aeACju24dR3#4X8*-sH;5856wvU7BX9O7&+YezRb-9INUE*pJ*sk(@J^&+Jc0Kob8(PrMwO;us3 z`>7mn&=ZUXkfo-E_mQtf1}15V&LmBaor)iOF!xq7(ZNGYA(B34Wj&-k0Q)l)OHHrV z8!Q*ZY>XQkE+0VA?1(;C!$n}hb$@~h!}iuY4J<-*Q<=SL*c$KBG|Z?}7!S6cy(&Yo zz;5yle`VYmQ;<_pB{bNMSz}vvMoi2q4hNRRZ^dLrvP?Lo`TfYqi%Oc0pz%pLprD8<@2=zqqtaxMx1+Q;IP^UgYb(gcN zM>sEPw5>t<&#hmhlhQuZ9*gaK_#vhB-MH)AnBN~K;28iH|0(41sI$l?Us7dQ(Wwx7 zWkuS<#m{NKyDlXa8~$;tB&zpMeY)iQ6}T@yI)3#)?Lf<9{3Q|FS zR`V1MG%8-wePK+IOA}Pf8I@P=%DcHsVkXib7d`>*7h;}H6Yp;14E3HEHI%)h#MQyI z4BfG(r-W96ygJcpa3_N^Rj~GBod(+4_E?`HZ#3MB#}0ycffitzCfK-mk z(}2pXzMXm&eKhjT{;nZrboGlV4x&U*QqF94D4{cCwiE)Gb55_OT|Hd&&t8vE#yxPf zyu$0Td3@#I1Y%5Vf&na%vP}Dm#&=TWhMvE7kbu1<;L7f}kn2(}rpJ*$s^M(Zb(oZK zn8X4*7pvO>V|)ATGpp!VHBaN1*L4q03@UGGKo}2Phs#qkZAC-Fm2siYo9~5n+ub7s zr{etK7x)~SxC z*JUjCF;P>*sauKKt&uO7XYQEPyM!ZqBM_H#d2yX7+Eom&l-w{w*&O4c4^!x`taf+C z%_hXm@+?oy*yf@0{6`}KJL^bo>u3lJ8gLDL3Rz!1lGa$T3*2ptkQ62IG&t7{77zTw zWL78o83#xtk0)Mu8z5ROuntElu23#(q#fgG0)}guIwb5jeQp%PU3)ri=X^UHnC)-15!^u>6eN8@~Bb85XS90T7iRk@!KlEe;>{4!2>DM z*zg#cqgy|6l(T9?lML*Ri-Cn$`k3%^YZ79LES0nkIIx6s>Lq#U6XO2W2V7ko&MHsL z$IJ=oJ6AnxTQWxW6wYVe9I5J`0=zVMAge7=lT}!%q3dlm9cODW*wvCSX1MT?j-F*E z=tKZaI+mleK~b(ck9#`_+*P(;2o3^va@ZHs717wp4PD5sDLhVlvv9!vt0c`rhKNn} zA+6JHZtmQmOny@5y~e_!5oZS{t!?3eThv1&c0`pX+17xgpP6(P!BuQ;qDFNc4{}aI zU9h4NG>4BRJi6Z14Oxo(1wr$8~mi4mrfp3@9yxD{TD9P@L|$1c9u&MwWUk%@0{JnXyzab zB#byWI&W+kwI@7ta=w!L$Y@4aFI$)BI9lb=&f(%R95KphtO10JgOlA{7~)9wSt^b66i+*TOxdokTP_4qwsl#840 zx|Ng>*Vr;c8-aZL;D-ciy?b#&q;c3)CJ|%C4Gs4|f_cn@{_V33oxQowuJ(Di@juZZ zoRv1fKe;zdBV@c0M@ov zZzj;vc+?=&+4wg}VTNqn+mcdVW6~pfRYOoBE7t;GqR{Aw`D3X^@e~>DAB!iA^XgoF z`2GUsc6F@)a3FgK6{ah3Ui{riX6?ZQzz_u3xiT4;{vbcSWa2j7KqM$ZdEbl9tV8wX zb%+GmFQ|uyN`mV@tqgS=@1MQ!*-^87xVIc$$KX^U>?yiu#fw^f37hVk*DrhJZ>()s z=3|EG<^7NKk%*vey!EtjfN#);QQX)gsxae6T`WWaZT$5Qp3H@|6*X@qnYG)i;R7XGP(0I@|EYq}~{!MT`E(zR-Gs6^2p9evO#2o@LXiw*mJ zSsvDgO-$kX%7<1l)LuZ-l(83LnpmB*hfJv^8MP*Li?80Q49|vRNNU#5a@vc}x>4-O z5Pi+OQv@_ydXArxKRQv8LW>Hzz8R2b#nZ#6Re10IAtZBN6FgUbjaQV$ny}LrjxzA< z-Fi-cv9qGTz0&cK9F5K!QdlIQidflH(@yil0ql3vFKI^_kxZT>xa;r_JF`S2PNcud z{{15djCpkF)q5^}MBp18Py=}Px-4Qa5Q~L880or;b?2}Nq!}FT?xraF!rMk0Z+ucd zBZ)4daW38;H4*+M{4!{!mEG55+NA{_Qv0*_l9PIq0Y2820gziT(-eOxtRmZ$i; zI8h@G)8QH?aTG-PQ+2$!U3+#8wM?Ez;#sm}H%t;;9b!w1jGmWFE~l={!!1o8H9kQe z`{dgQ|71jxNf<0SvS1}An0dom;%f9$`=uTrV9GPaM#8IAs?s*}Il04somi)M{=Lhg z4*B}#N}7aj9mOZ181Cwva?jxuj+gCOsqVzx3zh}_!5iZ8;`4cu^k!*jQQ2SzL>GI70GR|Ig= zCZBPjZ5jhhPRYHf)w_ZcSDWYEGpe19Cm}!r@Rl@7G#mrnt0lZ(jGO=h z5m=|^`pK$kqLGC{4DlL%sh^oZBH2LfRpiykcvRC4;14@BIfoxj48s4o+5gPp<&8d$ za)0A@e)ZHAq!`J>6+GRw()h4rz*+=9Ih5}CBx4*|S>%}<@FW*-_(3U8eju5D`Fo0- z5_C&!GNZZ0y}54DP8MjkRxKHnyr!Olh!Ic)KC}rQg;xR>94`-ui>DS4I1c{HKssJ& z>E|hm+P~8O=&`+JaeP*yOx5>iG7V%<6xp3cgd&(Xj|1#h)tG1QT0Wu!&^4ar- zdB&W)I}MN}^X0M#Jd;uz`Iv}wf6$qCF*mDFm~^x{aH$NC4OSc_Uf#{aDR{QmxGqQG zqrAX}?4JintZW|D0T9yrb^Pp>92glKLyYN+E;MBRCu5k8*JsHdK#Lv47?CIET|Jg> z6?A2CD`c|qv@>uBu{q%&^(ALes$2Mrdl?MrLHkvaP~v+j&Uj$c^M03YvTf}hu$;?UCbKr+hzL>-(fJ;VpZYUs>a#u&TW3O4YX**+< zXvl5i(&yT@W06^71(&NzL6QnZ#O&9p-Lyt-fYnC+ z#o$nLsD6dczAZ`r!C{)JJRuSRBOK%$SX=*q1)$$!vVP3C9w!EGPhkFuJY$VyxwDA^ zKt~VD^4(U8i?9LwKc1Uz2UXBJ*5(IsO`6rbkB*2+9XF8W&ke4?#J^JvW{l9S*Nzs*h4{D zUed5fH65X3I@=e`nN{d>AVm~K=csV!3nT~~EFmF-#&b*$d7y_8!nw}KGSTiFPer`9 zp6g}wJqo=}8ai44^stMcfVz)ihUrQzTS+u;^|?hvOiy&vcfoCs^A!N49;;gRk)a%1 zq$nUm<67w?iE86>+Bx0oXWr{m%>BLZ@eI4y%Lae(J4JiiXIV zq7av@_+zW{XC~kbh>zjqJl_^}-jS7w`5S90Y+k6fg`L&t#E=peKNJieydyKi$qs9n zjAgjJ^q=0I2n6PKJ6sD86u~ZAPXOn3x4!^%ldH~Tgc9QJ$A5XQQnw1v77E-sX7L8D zY}CO><9r%9c6}g7d*4!37l!d)RvVLefZ9~+53kpudaY~I`5q?4CY>`o0w%NthnrmH zjGDrf9wYvks*2P=%R>6FP%EJzplNZs)86=^mpqgwF%t|&n!l2Nzv=54b?EJNQA9d{ zm>-vA@RxLRO_LEPBYN@|0W@FU=fgz&qWH}L8?_UO0smtptH9J(bX}e2t)w)6xz*1z4yNYqsaWstX=Itm^HEEIv|U}bE<^~dkzn{^Hmhj z3dI^@+nlzkx@6GP_4P}dfskoi?DNAJG1&nh^0)u(=oWG2<3IH5+5He3TZju$l!VMe zJFfmtr!5O2RYze&88e+;^>(Mb+x2%(D=Jm#y`ul(m}RjRv$G5p2lr+qfO3D=tX3sD zxCge*SC& z%vsrJxH@H3s0z|^Q#-!QF!`9oUp}*Hjh(1$Ge!RlH~kUh(4HNPEEEp13!OKs0WpXo z1K`~kx)dsD9CpoFfEH$hXlSEV`-n*t;y^=OQ*{fCy@B3}r}tRtwJ=sAg?Paf&k!ps z5RZOLA%v(pmnr&t>`WMCccKo|p@0QEZpXrjmg@V(;<*(XK!$gph!enKl)kt^IhZdX z;TOAS0awu6tAx7bYB&pxt*0je4H$a&9P*WzC<-B|FUJ+DIb!{+V&8YV|9$+m6~AG1 zGlq?zX||||umW1@g&N>2LGl3zUTt(Xe+rs2-}m_;6A)B-#40BzTh*wx^o!s{suiM2 zU-Ldk{tUoG+*cMGg-zN@`*4st{L2OE=#RhR7u3ZC2b)8!1C5L{JEcFY^c}hD?4e#5 z!Jbnw3O`F{ygltb#Rz}9#aoh7|Fl*PtY9F0_WCM5Kj*7fKVhJ!&?wMtTT8R|z6~Ns zgJNoSc~2ga={oVQ2O!@MlEIPuj?(d22O68Pu|NY00BJ4$3Ep)1o69v;M`*TtpQW82 z#DFMQGJ2#}rP2raDG-ST0`4F`v%~9%Sq(1sUh@%LXD`=>g)2IMKWV`>fXS&gG^%8b z_JIH0RdbCdPx%a1>$|&?si=Eq76aJoA6dL)p6lBqbAVM`&({JPsb zeWyyhQ`c;K&F>j;&rTaH--#TM(@L)n;DYtdg7o`Bu=)>;!i6I`LJYgl>YT>oJZF! zao^k+47wVv>fh$vIMB9CUg<@$Y4T0WrnRZC)?oGYRC z>n#IrT?FIop~oQ5xOFx@Gf4m<+@AYnKtx1571;i6>>wG)y^@V33RJZ(y#nbH%!*Vf z)~g7f{1$V$(rixHONEvN=h)+>?iNR8YZS25iN7!3bhp%a0d*Kiten*17|Gx!KN4#Y zzUY!kzt5`#BCRuXwHm}3Z<1?$uFoz=S;t&;+Z;9Jw zc*sRA%njfHrP&qtn}}tau*Vi$BV%&>k&zQ+{t1c3z3V&&TdUh6$?vR4Ku%+E<1=(7 zw=QX9RqX8?t^KN;>NmQd88PaEps7(cdF%#0gHt-c_v_pPx7nV)W4RQG`?E7L;_i8O z!4fhU5%+i?;pD?-kU|7<&5@v{2WF9D3BT7~vI&Gewjyc96c}q1xZmd@@CTEqn&i1| z>>~dB`y=Ow5-&dZ&6iTO{6f%_=X&dAaQ7z(sJ22Zg|QqK3Jz;%#?malEbPM9!e{0n za;w0er>vi9loY=&P?Nfo$T4scR#@XC?o}59bon>O#3W~D+&!mcGEsxsu<<@bh4&Wd z-~Q3BBKr31cA)uTZ=8%jY)I(UGfE{Saw2teWtpjpaV&p$zc!v42NcU$vth~UL@rrv zj=2y%E%C+3cV%i04G-D!@u>KkBrX;Q9MG^ZfCe@If9Vf00{c24#V;-3z}T%}(G!+E zmM%GfxlS97P0&lj!+Wxt_VF%O?`sNJYHt)}j%AEzBwVkhfZ*5mApC_j70A79aP8!h z2(+dR2Ls(rrBy|i#S_Da0rEfzovs9Mv-jIx5<$`p!P*&aU38Mn%P!xVm+yNL)bz-@H9+^N*dwoAc$as{OM-;d(u<6gm+OV zTctGa{M`{|%UvItuzFjp^$&jz`DC-zOE%AH9x_-HJaXan+@OQ$*9E4X6R^E%n|@< z*6)(9fvOMa#U89P2Dx2-Sb_TCe&F@m^+7roavp4mw$e1Q!5R~&8loP07{1}8;jaAP zUzaLvcXX2~SJB=%X;qs-AIiswrBhxB`)R*c$@M9&NC2{Q#%u=Ri04acC&jC zV`nMh#P*g)(S4{C>oMmV)DRk7#(PAb4-&tMXVx73G4;m2=ePgNG)5*w60-_#eC5+;;!)VfCqhdXS!ANBawi z_QlMjtBg+D@hSi#`B=#qlub;XYT}-F25|GqCH=t0vdngsoXKU&QQcoG2F98ma{XCw)I0EHxgp?~d^HUo=%g80f%+-PB9*Azn zW*dPrii&gUc=gS`I5N@3tGA@-6^z$3eY8&x{alwv$qu9sZ3Ba|iCOv4^AqgtuLu2@ zq=|&049QGjKCZi8sHmpKbDNipa_v6s)o@|Ppv zx4A9iJ5l{@My87zYfPzVdg`J$CLNvbIK5{jhT$N(kiOUG--_Qvh3lLz7y?BejqIA^ z?&IldhVq8*ni=^8YTQ72&D1UN__t%F&+EJ1x?9^+f2Vz(0fLgqlvQT^M?sDz^8o9W-DR2Yla&tMWe0P2@A7K);VyPo!4~W?Tt*%i zL=nion$HCTV|aL($EV7QGNh1!X3`*}YqPFyl32T$_xIQh7@nrWA<#FTf7i7oYo_}z zedCdAKPe)ZLmOtcl83=AhY}PugFuWeDi@B0OBLkWVOGU$wP>=?IbR>YcQx%pOSJiI zU0&5@X&4yAZ&kzthe5}Bo_V#-w|hYC{S{sB<|wg)V*b4*B>J;SQIBkN`c`C%KvAP` zYh~y;(Y&3S{AnPJzcUfId2}k>N~3MJ4!f>b!tqfqT+dX zg$M~Tm>t1pPNH^3`7g2P@jp;JqG>qktT>?P$)DmSw=kG(slXq|M+ypz{)${Jsz!>o z#(EPV=oD3XjuOqU`v69H&r<6d1_|?1sWE4xRzuh>1)wD{uOSOZeGnn`_e`yoF*f6Fx5ECB-WGminm%O z$7i!fq|E!sUt#HifUmyb)0FQ&IPwNE&I_67VR}jrK5nN`n;%9QD-XNOPG4P{98LRX zza0P)zMF>Ye^TI*5I}8Ff7|@gIyj3@oQ*f{@TN<%(grA&$h^L-gkYx>=;8=&A$+#p zKH?MYZfZ(wbmt^RUL^Soj%}J48wAkNQYRIn2k@1 zUrsQIbw#Ny#q!cvbfB3eE>G^G8xwp=G6}CZe5es(uq}ndy@8qX37qSY8%I7u{%@_XD%#f}NA5=3>G6S|I5s zF)5Xx2xIY6=Psx?%pt#ysF*|`V&tNF^VK9aWP`iQ$8!@Zt-eyR{cvEy+?!S6IB~gb z2z4+(E#q#WJ8PP-a5PUSUekQ1AUom&^hR4EFoJq*Ayk-lEhvGzOm;IZzjV4NA1jEi zG!ky@mCG_O7z~fSEX&{KM17J>qS!=@?O1i%F ze0x+8fvCAF=fI-CFsDi@VE2yDHV38ZT$E`Et`9br0bw@3>H5Q9yee*aDFXs9*6_8P ze5e4-)pC?shy8x_r!=p{2S4ghr16!Q7p}l>98%X$g<~bhuh=H13KC6f60d?UIzw1U zuHZ@0p!t>TCo`DsvTi^=<@!Sa3bxjq=h;?38h@x@L*IJ%=buR-klE_15}eaJ@)9Tl z5>SiFhtPdN73#}0UaQ--&hOn5L3IKU6d)P1jKT|Fot_~a!TG$Dd~Vg+2BupzK))EiS$Y1*quz~;lVt?numFjQxR}H+J9Wt6`ya& zK8|a6d6&`*vPV@=woa(UrQJ#{j(rML)S+DKe#6jmPnE^!)y>7j6;tuo1fp^s-rDO0 zYx7z1*5-spcSl|SeNFlGa)_x&JHM|5x^1=9`t|eLOjAB4wg?R*vwE+o%fk@~bY$HM zw35yp?B?eb92%Y}@HiS;w^b@wb%7!l0&0j`(1A_?co$+Bzm80Sl&klaOw; zCL{np_#h!sU1PexJN(18t0;Zsao!w(b}2`Tx!$}Ll$vGC%O3S+FC87z))N zCVw+r@SHks|HtHdK4F3YMDYOVG}_CVoa+J;*#E81;A?*7lv$3}&R99Or3EO)2ym~s ze6@A?Sq`0yw9|6{dWtl;Q9CQ~zRuZ3 zG*;=pG?`pSsRLk=BH4PN2LSa|2Uw$(VABTadH4rEhW3GJE#RfO-&Iawx;HnD;^aiN ziAVKPY{y&tErhPHAGozHs#V8AEJ_1=hY5E$sL6*sfbHp!5e}t9NHCxjLqf|aX*3ig znCSjx`LmSsmGgX*dHNKyao7IvzxrkO?(W+yT?Hs<1d((k6dEk;NW^^kDEW!uJSrkK z)l1D9tbrt4+81?NIPVAwuLiCfQ$FArK!Z2ky*-w8$XidK&IUqS=ejaWlNn~oPZ9Xj zl+16MFYeqHKH^ClHXUMl4G0b>fO$Hp!qj{e}`Xt zgPXNk=LIA$C6_n2pic68I0~G$0w{rl1e0{hl5{p2xl=rs=NM6Hh2L;t#e|T}RRGq7 z2Sd}B%Q^@5V&gSm^ML6`hWnlgeE~&}DKmvob&=#JuU5eis#YU>lPgHyqq{&6rNfHr zVl#;R1KFNRehLO&5KrKSaU&BF@CS&2LPC(ht>!irp|kn)TFYtmoG=p<@Y2CHebrvV zHYIr6DQjGEmSY!iaed7e-P=SDo7uQ>O!rg-B8l@JJ##O>JJmvTd4`cbia*3P*7pM075Q(ERcg?#qZiHS`qM+k}MFS14tB< zS1r96KwM`AHJBlvK}}L8_KlIKQ)nUxlGchga|inKty@>w$A}_R;0Q6G!rC5C8+#!) z4^)I1xC*q5=l(u$;XpB*feU*W0PcSPauS>yS1|wvjrzP83wWwYu6|Q80kDMx=z==b z1>U^Zb%0^3b#=uo%0H8WBg4yukj9M&Fk#_akz5aZ`nyyP${vm`fYkk=24O|A$ z#B{KPhWD=&uyiszi%L{l7|ePz_tkj@p8pxVI6xdFb4+Wm*{ zEM#M_=os-qQN!Pgdc&5mUj#`iP#HXGBq*6iU1B|j0IfF)Wi-Ri?tI78sVpG5lvg5r ztM?!FCat6jB$A=r&;BUoRwY^(-+|5i$k2S|HQbvXSOTcNggQo%W{vP~;j4 z>V=GB&j46eUMaCZ-f#N*x&SKf`?mmi8q+0j*A``Eco1I~^)aCyD(GVL?L?{-p);#v zYabPXa@IJ#)3v@bBOc7 zBBV&c!)-(iqzr(jD3IAW)1ytE_T;>x!4klJECN@rG zHg;ZC4qgs!23A&HR#x@7Q|N6`|L+Z!*6&S?T>kwHblx(};0Bn4sH{lwYki;p0e63t A!2kdN literal 0 HcmV?d00001