From 17f0fa7bcb938bab9ac3fc524a78f2f74de37d3a Mon Sep 17 00:00:00 2001 From: Reginaldo Date: Tue, 4 Apr 2023 22:45:08 -0300 Subject: [PATCH] criado o modelo city_load_model.dart a tela login_load_screen.dart e sync_unit_screen.dart --- android/app/src/main/AndroidManifest.xml | 2 +- assets/images/load-done.png | Bin 0 -> 80579 bytes lib/models/args_load_init_model.dart | 6 +- lib/models/city_load_model.dart | 15 + lib/screens/load_init_screen.dart | 61 ++-- ...gin_screen.dart => login_load_screen.dart} | 106 ++++--- lib/screens/login_saved_screen.dart | 235 ++++++++++++++++ .../register_citizen_screen.dart | 10 +- lib/screens/splash_screen.dart | 34 ++- lib/screens/sync_unit_screen.dart | 263 ++++++++++++++++++ lib/service/api/api_data.dart | 82 ++---- lib/service/db/db_sqlite.dart | 107 ++++--- lib/utils/const_variable.dart | 77 +++-- lib/utils/routes.dart | 4 +- lib/widgets/dropdown_button_city.dart | 7 +- lib/widgets/dropdown_button_default.dart | 19 +- 16 files changed, 763 insertions(+), 265 deletions(-) create mode 100644 assets/images/load-done.png create mode 100644 lib/models/city_load_model.dart rename lib/screens/{login_screen.dart => login_load_screen.dart} (72%) create mode 100644 lib/screens/login_saved_screen.dart create mode 100644 lib/screens/sync_unit_screen.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5c7b80e..5e1c587 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ NF=JlZr`-a@sWr5H&4{T#K6hi)`m#c+}Z?;iH(t&i;$r#Y;$1jaQH9)==#puT)*{lVcQ)S+L4)=8AoV9B>|#1 z3w`Utc3Em!UN#M_3ial1yz8oJxZvSMfwLYEbZXen(F*y^yrQO01GU2HVa?dO#@MmT zd9-{5%Wvl$X_Gu>sI#ti+^jZxI|c*-@if)gzblPLs4-aZhUjvrCL^hq8MstGBd)sn zx`}z7V~W;Ry!9OtT_T7dyR;Wq>pHx_i?6P(?wXJ7lSERvRA={`VPpeOsid+Fr%&eI zO0d{;La!}v);i(t;h|)QzxbyG6OSAx1q~~&ThsFYR%uN5iNJcZN4LUtNzZEcrm|=~ zPjVO6UxP_Mdw1M>;#p+TS zUh`?oWZr^RCRWN0H`aF(Htv=#vlM=6_KB#gx7}DH>w-!R5qQi?>XbFXOMhgqEz0rX zgqPHmSn`LD6+s*U`7{OpTm(XyKYE%1|Kxy-AGr*CX5WkVjYi*O#&h38dkUVUUUJ8M zn-jmAZGlZJw*JA27MgrGfAAGY2KQ8M!>L>A7@4%Bzo~jle&CkBDPnS zAxd*P5|myX)JYkQeWkRbS+ZExy{9zLEk#%6RPO6GUh7z8o&k8+1<4^oLWEq57P=r9 zP93D#v3P_+b$l5mwLP##?)qx;wfGTg1n7}ODBIEvT0VN)bW?rB7ZAb2`z2W-c(qBm z1xfe_zx&UX`M8cS0w34()%fX$18DZTZtvYc7r*>Us`4?Ay)9i=B@#F|(1+u_B3V66U8j6za@HTtN{#Kvdt*Do z5)7qxP?G2mBauI&)p0Z@&(rVD^eSwCF4exf1`0KRL!gi=F-xFxerEF=C zQp2OZSR=VH+C|~vIgX;Tw&p< z*{kOAgvH^|Be(Y33Re9=TADVPSBO>bXMS9jb)Qh5J4sdi+UyOK6KEyC1X9fM{4hcL zs6aab?fuHq7^GD)!5tE!mHfr@!1yf^J8;9zl8uuLrYrKm=gbF_Q8rgV-@ zYLTIS$!}({Fs(r=gK~|-VBR%91&0u4m~GU3502IpeT}2W%%=H`Zj+4WpuK=#;YhEZ zux6cyKfK55GK|tfk(znI75Ysdr>}}1TV3D?`GaFkN>DR4YGcz8h!cs8S%a)X;=a1~ z=ccRjBXb16o^ct+Zo7vz79xZwaD^C6S9b??>GWNhc$lWsh>yd}n%PrLN-08&^_VEm zzH34Lw!(nC;f85|hkF2jmv7VqW6*n%^Q`ec@UtOHx+b;CwJ80ikK3_`t7fpmsn4hG zqQzgj%EKd?@CX)<@Yct_=mc+M{)?i2mZhY)Zv0|;k~$EGi0#mTf%C;RtREr2wJdg?Qnuq4+pu;+ei0oF7RRmYO@;ZcKWE+O-+|RF0 zpCl>gga!A1rq5_r@$yPD5Q8};hi8k&gPK)fN@u$}LAM8D(J@Z+U*rwNc@v#~hkQ#Ck zC5e_qFs4re1ewDzqj^TynEk*sjFO=rR})N7>k8f@zi*;BXP-%t)BAkqW z@2kOalS9qa%VKCEhNuPR&+F@?qY~N3ij>ptVzaK$`|s{9X zb!z(RPP313d8}qm(9yuW85}kbVY3|C?_pCzN$R<5i>I!FFA0(oNTMSKpSd{;&UCJI zYf{{5PI>x!lmbvQ^&PNfkpf2nOiu_Ddgd<=GwVgiDa;PhBI&@M*Ol4(rv+JFTEmEB z=C23z%4TV!P&LwE`WZ+P z^Al>(lqWg(kji@21P09Lu$Pty9s4q|So{GL6WR=XUwBo1w8Dk-M)rpp+E0l#a#IN| zZ+rZBIO>tyX_B7$tzXh#)%g4f(DHP&@d`Ji$>}An8c!?|hO%WQMR5PQW6B|t) zjGk)v$l^~d5yiCJPs%%gsHX9by-f>g1w}OYO$|6FyTz&~hh(8Iebq!Ai(2RJ86FDz zb6nq z2st@CGT^hKPe7HpGkYW9))A~wmlFduzk)9JbJpQYaxM65#EBXrJ{`#oBaN{T;%e;! zgbxTz%dD&r(CU<6)Rb1WV53QFYM6G>M+5?YN7v!hP}v8@ttOZoKJP=qlOs&*h{_V@ zmF1Fv=ws;3+;>o8lLv_~`tRhk-0T7%@6U^nVFo8}m6uHu?naNN07B0Q-&}hY4@&?n zt8`FiXgvV@9!}$#iN`sz<2<%}B{~n%{qsQ|=Q=PXdFGV4p``=j#AAuy3DRV{+&52R zc!M+pLq|-^R;N~M@kxzbLxU92vg*a9bYP7lL4#TGFuE0O2IQz z!-ra8goGHeBH)=LyrH3RBzcsvSuD-jVpK?&8DucYRfni*s@89;ZmqX)nTc#Kkx6y6 z88!2Ie+Gm_G|5tmL` z%qBdI^kQQD3p0R0e7He4%kwt~p6S_G@t~qqW&WO;xqvB`5!I76J{amfUzy+DH}~SA z;f*Y0jnGB1a? z=2Qq-6vz2xvaQ77MFPH~D*8n(+n1LFIA9{y0e zf}=ex12khMT~JWG25$3VT9z^BGGr7kn15HVxpqZIOz6DJ1xg6TMWYqlRyU zdY7n+Z;9f24(VZ~oR}aP!xF1%nJ}91X;6NxAay#2C?__}!Mfv{>{HgTHvVN6GX68f zx%w6=v**mFJ7N!^)AHbhz9%5;LjSlyz4GX`o63F!CG_z{{c=f*uVnL;M`BPWO!P7{ zFH*U{vrl}nxCQppw7($L0Ot-7gN5q#H})$HSuZvEF1Q^};26qn#OayB zJJBk{v4LT4k~l9FuvMc$3zfkxkokA8Y32x#C_pce($Kqwh-3Qnnx+{>(0vrVb!KfPe zu>?lTtY|&=o~9?M$u*y;#%D@W~bzHxJu6;tucN5a6-rIrlg43*}L#` z)h}<7fNE>^2y8ogY3f_+bz|ohUD(4^G$3ryU>9AHZ&r&*L1tGjR6ko#|8XGw(}Z@T zx>up6gtpl|$NuiL>{s&CGerrKtmK~de2ao|E#bEC=hzb37~Dj)-)Tj$E6fr@6G+?Y zCuXAfR*wxroU<^Q^7p}rzr^dm5bEAsXmE10+H9e+UB(R_uIN|b&ReV?ik_gUt&vlx zaK>Fa>=s7%WZ@w0-%Ru!lch08-}+?OO(`$$DNA*bpvTZ37hhUMOOVP;>a5SttSMEv z7xqRG7ia8-Pcq3&E=RLMXH&d(>oe+{9@K;jFl8FsC#iDK4&$Pz1<|G9X#?ckCJGl# z^rZMoR9jQ#1MUITS=KvxDSdKT;q1&TU#e$*%Bc_Py!?xzP9OrHLC=u1Z zWA{F^thiV^;ft!cVcg>TDrXd2@+Cl5nS%)7B>slLsd~5rF>w+!elp~ z(=EQ9-!Rucy(VW^1{RD3_S2N|=tZ+lJq48!@Qk`D{ns?o6R(?(22j;h<{?`x1*5_# z+14(b-QYHD_;9TYfl|2TDVo+09qShmZg*_;ZDane-f;pcY`-;qQSzY~`?>$aXnm`~<4dIH`l8~g zrHzvR*EFt&)lbGgZQ;4-vEV94(m2(w_iBsPVqsV7RgRG^tkZjS(o zK+b(QkT-U!RvExooJyC|Ka%@hudDwRDw_X&fg*R7f8Yir#mc6`a|)&X1}Uy&YS%4; zE4aKGr7(hr`oL1uu(VQ?^y!diYRaSXjWX}c4nNkPmn_UK5D*8)L_mkj7ZSLL?wf)s zt2TV7WEj-w2OG&V8M9fu`u1=>%t@??jdbHX-Wm#pP6@=G# zt8V6-dzm>yCv|zL77!lZDr0wV z1YGuR-l{e|%*eKM@c}!d+f{A2AxzJfOnQBhnFO-)E}p%DEiIQXKf&uCMyF*n9{ZFr zvWqSv=&;^CvpN-;9x;aHqoW>Y*V)aaCX65@*bUxwyxr#Jhz}Inf znw&xQD?HCA>;{X$RC5X_{F~lpdIZxmtu{IBiyfkN`^a-seQ=i1pgyoXlws$R?cTDH z#eXr#xqbGr;co{C33wONUG>oZ#(z3yxAY6x@q+d@R{T9!=;*Zb!FuYzN7R{|W)~Ht z3#n$k==$_GTEtXyKj%9*WxGF++kHfJR;S5nMXz^PISwIq7A0 z_s#44*hV(I_YymPS8{J!y-i~Qvu{@&hvg0PXhS{#8n*9QO?0Uo8mXP=PQZB^U<2K~ z8NBAsT6i-o;)?XKqK36+Z9%XRre4PVQvw0TOqcI$MoW=rz1(}8(*^fpXOSF{ zR^g_@d4Go?Hs?teyY6PvAH~%ISEESWVw}@zYb6=OSSu~ng#sR!W)}msr#a&|F8?4G`Ig0tDA;cX zu{q;z4i+m>kVOy0ixRNbFOTV3HY=aXVIX>Cw9UQ^rsE6DhO!M6l1~Q-;+?3c+Aeb? zk}exNXGxt8mo<`Cc`D>btJE?vz&2EUx|coelB(9y%dE45^EmWlAntD*ffm=v3WynX zDaSiSIH9pP{_-xG*+G81bv{BIt;c-^f>_EKRHFyDoY!0*)tb6QKv9vlp`YAEVQBhw z#_z!J2?SRh8IK=n$54re8e>XT3Mdg>#l#6fy$TE(6|K4I#oZ-{Rg7q~6vFTCX~?VV z2BZe)seov2of}^mk1eQlI_`NaN7xonZX|FWs@?vO)W65j4PIy5eE~iSIUBwF=#xAz zweE9I4LbBbHbB*(F7?LS@`ks(_L^)&JV(Tf2_2A_&}9Zwkz`g&gBp&w$a5|Y(h{;Z z!93)hCV6)rkk#Yy-teq;j|9AjOK?#>RNpjE;=W)S-T#_m)%1c^PcwD^EW9NE%KzLa zc`z8QlDK-Ll9+lA=OdjWlzw zb1Ii`rjqHktDEo?(bG>!UuiAl;xNC&dyG7JQt9~n z%UwitFWnniKTW%Y>{gua3S)Jry{2Hyc;y~*Suxs(B?!b}R=;L&tu~HX3ZS;N%~our zAl8>0SxOya@`FInOM>-;V@EucY?+_qnenISxt~{4qa&ST0Vb%2;cF zh7YlBupY>-V#7JeinFufzb^otgh&`P2oYO-0wu=craV>$wuza;gk`rCyRc1d3u5<` z5q*1s9rVzniQjlOQi4|vO*JjeLB2oVDz{&v1**@frgu&o6fL5cEIG_?2b;9e6NsgM z2@?zk?O`Rv8YEEqV;<>@FyW0m4criRsA=5$mh&~x+}I9SuaT@xeObOgHLy>&w6ZT( zl-+$#J4DM?I=C%$TetSOXd@y-$vKkKS0lNh|55#1U^~;HzGw0&GVh(O(-o1Oko8^m zd1~8TlislVAmAWUyZ5C}5O16$!3|vfRm{?SDZYw}@qs}yw;N>_sC5-%xO3RZ@Kmtn zky~$NTEm=4pD4Y8H9BO2aqqEl_r0*VfoX?7ppgl=d13FK@R9W(Mp5)UAeg7(~ZJyETo@P>4WrjQ+IAPxPKmC>EL#$jY^ zvyJ|JG@*Dx&}!X)hf}-b!7x?R%LDloZSQG#{}ci7ILhP{VFr$_{aIM|?MDq;r8+K) zd2z%2=|$?=qGta|h3gux{(cRs+F6;#j}F2=e$}zNFBSlsHCR1pHF)25 zv5G$bt&*tIWNMF^^h+4c^=WJ*PVJk5vi&i%384m?V<@P8^M}0o=K92Ex`H1%6pTgg zz06Gzt1ps?v5u0mod`20_0k@AT#zG`K*5wOP1m6+ce4_cTfo>E@5~Zi5R5hVw${;M zo^@){Y|D*oBMfyW#kV3U93{E2s6JmjHZ>mOuj|29n9Q;=d$0zAh1v#nddKZ*s( zGT#D>pLLBc?!{{MBAzv_HzL)f>fD5y&%0&exENVU^~lI-5CB`IP9bpt3LJpM=Rn|Q zs=fn!6O<&A0x^AX&8YlmG$oj2+V-lu8u$N( zCewdD;<^9F#^&tVLi>|ekYOZ=cGv~J2?5R>66K=D9HFax?b08W?GGu+ytMRkuoin$ ziv1ZSakj)j8&elHG@M;w>9Q-i^~|IR`V@P6a`HTha?FGpsVxnP=3DN`#Eyk&j)e!)72JOra+OXUHo<$2%0Raj32+Y zuRqkLV<(7r|v>w>T!s_{sFv#Tw{SH2n#6@!=-LG4Hx z+=TEn@R1hfT@!sho(eE}44C4Vi-(1}ce;_2hHy1~tHKULF z%7{|XWyPtX*GyT-*siROWPLj{WbM^_b(IFc%7iDo6aq9}H~S&GfJljZyIKHk#f3R% zw)@5tsv7k&xA1O|IjxUaHF`f}yo!TZch}Es`L>O%CCK9^EpKUpqYGXd71p>d4QR~->)tHC7U2pHYi&lk3PMa1DgDh>B9~qQo4!fdT zyqp%XE#aNRWVi3z;C%PpN&`1hrpR7n?p)In(|FGH;QU+>7a^y8@jCK(xrH{q+E)|X zOOV-OCPgvLoFzL)e#V`r!oy4j>V=T1b2GFwJdntdy)MWxZ=Z{13t`?yN!bbhC>7@~ z8bGPrGp+m-)QRW7w9sxtFVE!ZQ+ua%cLgK`cZu8P@q||`(hIl-DW%DrgGL};k$Yjs zM?z|N*|3+>5@7+EDG}DDD*S%JVaH9ZtWI^-p{7L5ne+gXX00lUO_#f&31q_(X{&ER z2&&7Fe+H_-8pGef;8Z;;!1uM(9G0963(QJkX4j76QCvJ~&_Z22+RdnLb$6?f_;(US zV|j$w&YZWKNfkW>J@{7uQL}%U*T2q47P4?Z#3f0${mB%0Z+Y(A3~Lm_W6=z6&q{ca z&|T8)2`JB5GDeJqoJ}SwA4bf}HV7RM_1l-ies&nAI0j+ldloFmS>x#INn`%Z!bCI= zKM@S?$=O9=)%svwQ#??z;}PuubyzPV@?W* z{hyny1{D`93ijxyIOcdK+C7wGghHa4!U9dYMS7BfPx2!rVd&KJ^k7Y8TK1AvE5edr zPKJ=4snsW=7A)?pngUPGkCr*{NfAtRsAkNiX(({My1U@yWb_SpxO#OMgw}O0Y7o6q zGV5BwiVG!vB_y*x8Jb!C7ufm<{uGfVc{NqkEk1(|oH$I=P-(wh(&$v_LzEi^2<<4U z5R4Mb&<(vR3y~BGU zc*t`tm_ri2`O;E@Hoxaw`X)N4xc_@NX)tdmOGGX7Hcg>nD-B-pMH1B=Rqb%SH35nI z!PjlJ5`>&h0y_DHG5eJ;d!FJuELW`m8?1dQx)RMY*rMtUlVjpWpa|{VV@>mdPONEs zdr2bn6n3BJVTUu}fxNMdJS+l9Yw$zK*0GcXZcjwWavVuhb~~l2;32JLIpe4@u)Z&A zi@NBO5w`1eN!z?v;osL5GD86^Aa{_ zE*QOP5t=7uw#b&!awO~&VLD#8r88fgB9$^LS0)?HPVTv}ADaL*u5dpDpli%dyTPop zLBre22HYXSoT8K>>~P+|J-kNMRBD^*Jbh0@pU%{PP9*=8(uaYT&!Kz-H9Sj&0_^ED zHn6XiO??vBJ8m2`AlbN#Px71d8g_WJDhwcW2N6{tH>On~ zB0Yibzaq5t4+35V80k=Fgv{mi3G@iQYG9ir_pzkR5*Zrtw*1n`O>gutJ3|lwC(UHx9H~zP5_H2;G%Yx;}KGW8Svi;kw z#Mo-&+le7KewHC!d34>RD8=vS67uA4LyiYG;T#d)!=h&l43`#`%}A)t?V}>)aMP=$ z6*R!ifp``8RJv=Pf2%Zxi)dfRR7r-SaD>l6_OkRCCH@sIKQ#H;7Ivh*RzXL8iPs`I7~yr~6rV_!nYpq;Iox1-IRNX# zV^-(S{@JV$jvD;r6~3euPDgi%oO}}g^5W&2dmfu#G}AT;b4u}B5uBR(h`|wY-1)vG z2=IQCK#&i=kC;+N{>xN8DKS5RvI<|P9s*qhhvgVSwmM>u8Bht;o0{lb;QyR}U}umb zxI?6=StH`1)iA=7LBbH7%wazZ7Vwiw1a+{_w4@>o>Y|>x4M9HBF{=mp3nR>g`2WIY z0k&%SEe#{(4=h&EKOK=It~7d<)a!8f6Cr|$TPIFeF-mU!6dZRTw5499z4)tnCuN%| zPN8gQ-%;iAF;8vLR+;B}iIdb_f2&j#Fqnzj84VDJEHQ&IwLN@O)c>E!ESIruavsj2 z)9g1uEq^`)O&DB^gu!^$(= zeU`##vb(}2vVa~gGpkxEN-C#(`xvPA2L;TOqr-|20dJ(Rhf8pz-iHM_R{&$oWR)$9FcZQ73u-k_5XB2gO!?ifalN#s2!n%ZBAiFf|==1y2mz5um!LqNw%@r!5=&F074L zrxL~=O5c$3_Vk3hoSREnPSHk2KxlGSL(zzXzEX*~g6MU( z?e&Mw1&+grm&N^z>hK3Uc!;c@!A}DPBkR5ktlR%*$od*3UitqSS)Gox)Von5r$&?+;1h`E#@4jvb~4|CVCXNjiFC+s-MjA1zLB6Q{t}nw8mJ z#*LOp$!Kq@DEw8Zb|VppBPz{4jGk$blF@(%K;V&k^zGGcTbR^C_txha-JvSCQj1|H zs{E|M#MuhWxJ;9*8ShGPlP$NSuYfwAQs!D6=%x$K?O3;KN%M9xJ_xE-*eMI6g6eg4~dJlWYyULwzczB^r9f+>j2;nwzQ z&JD;i+u$XTWB>3q@izJbaNCxlSH>AORpec81Kee;oWoH#c8)k?8UoCxUNHG$7{zwy zj+PD}UA_7iFiw* zm-SBIrp&`%F0wq8+I|P$aBg|=UjfYXZwK1v0M|7r6z_Yq9eG?NKJqYjQ0ILRnQjc(;h|uUt3Cwb8CDyBA}- z$%cs>n%t+&yy9+=mzSW;sG&&Km|fzmCvZD}t;Ngd$6Peu?B1>-T>{}Z$mW>j&3&l= z`xdk;nJ+p4*_>RwAX$$a*0tT#{}9jb{}RtggsOCQ$;A)syoKB{Yd<(*^eYsPG7=kS zwt#Q@$1fpxdD(e=!O!Rn@kxacFG8P{{|!b2ML8`(-XXA`J%Q5%+FBisQS+q;Jkj3v z^?yOs5~%A7%4{EdJ6_@>C+_Lok%K4Qi4FVn-&Vc=gn?fHoRqEp%bM5n-N z?w8oU<$n@B;(tnb=R#Ny)TG)EBHL-9VhPFVKE2cVxj?h*;jVX+KlLAiO0Nep_PHb< z-*Z1XqYLN6@Sp{1q-bPTj&Gpw0Bqb%sWe>ce6{@i94Xr=|(K;h5}4k7yphEx9tb!|HcU;&oZEyUlBSr~==- zv1<3b1^oA7`tME`P*>wHC!XaM<{w5I0R7HuCJ&?eb(WR6%N?dlkQ6Aqdg}V323^C7EA2+zr-N!*zbE; z-$HN?hwKt-!Y+0Rm<%2HOp=x>wHAgbd8V|YW~A3aMA%Ohq@^P ztWTOf>^#Ig-bwcjz~o9O8FkIh<)2wfZLXj4&Y9U^ZS5l~Y+_`&Nad4pZYlL!i@Ggd z%FZD_!RnT|XPso}obLc+fbM~D~Sg*u8={No$)84TWm`F&e`Wzbd9CJqK6IGiP2C zoFp~&QAAP_bB4m2F6AmAC*G_Lu+AM?vDq-2;8o{y zjh{K?y+$98O;*^BLRRIxk0JM(V?L4NiZ$Q&j;<7UD$ct1PSkFyf+KCV*s*2hdPrCzrJ=HF6|q25c@z9yg1zr%C_GLt!f)Jey2Lveg9xj z^;WW)s~}U}mL1ErV*2+fHZ_V>Vu=Y>+(hq;_|7OtKo^XYFWJ!Od*WuFB5-BV$Z}JY zmzyzFvuiH*_YHjPQy1Ag^GrxlW5eOb_)x;vxG)(bZ^-J+JbUUrf<`%SuA;|!VRu-h zeM+@%T5FvKye6wE0?7%@_ymb6U5Q#y=qLn=?@G z?4m%CsbQB$mu3O1LQ^igHY&*8x+!l^eaHZ0J;1D%IAoyB&Y8av_0}nTBZ+=8N<2xG z{v}y_9K_H_^uemK2Y*@hxLY+xL-jh=U1A2uMBX=IQK00ZI&uyY*K#JaXYKoeR;~7( z_-287O<{eMKI&ZV$JYEiOGOUdZ>X4in6L16ukN%PO1DQ@YQ1`2v@cW^3hNe^3NPRHOf5+P+!{>|?LXA@f?AR;LI?QAbb=P`LBp+|Y^eS{NPfk^Q;LGus{iB7o9J&X; znzaaN1871^|3zn{1*3sAxztsKGeYKbd?au`Jq35(6IFs~PANgFg~lQ5)p^FMwP*4J zYVRdMO`w*Nt8fPPm+N2HB+qP<;!uk$+91;VnVj$(}#>3?^d|Ub~N|q&2{yRyEYF{&G-^(rOby0vY!5N9OvwWb*(YL zL?2HX^cHnpH}j5xGi+Gg8^<>SzazHx98KmVV)ZMz?V;eiGF=6qXYdOPbsiQEDXn19 zlY12B#1R59RIU|};tn?Zuq%B{#JU$X3aO;{l6@IgxUVMe5Y5ICQ3$7Kp9;#8SIVQR z)Xn!8yb1hmYX0C&UE@%9FPbdGX{eqvL4U1&&Ek2mDg91M>ZB#%vw88N|Ket8XU#)G zQM_i$gRocj71C#RtjHGeKWL_<4?X=3Hv2r6wRF1~!IqfS8g89GTA#Jt*V;|D&Hl%B znpWIhj8o-$;|dtyaBS6QCHz0N(@UZW`}Z&Bo;B6gn+W+a6_V{8_@09OcTP)7fu-0N zckdXvEg=eyhU&c3-T8(*Vpv5}4zYZ2$Shrv0#zlCm*^fQAHzhNtR za_I+$BCp%H9;>%Y2E(ML3r`Z{)COYB7v_fe^8RvxpyI#3iNg@(^DXTT9aJD#xXNEM z6&!Z^mD_;?&Wnv!0JGHk)zL1-d1pr6iiDH}5FtMy6#$FZ2)Y>^jb&>BM~0pDo8 z{4VM2^gx$K$e zyjX~u_4U_RDg6;2peuWRg2dtLn5!g8Vf{*mbSc=2KhYuhawVlPZ>tOmD(=W7qFtIM zr3D|hYN8i?qK|>L6(0DjsoOO!mmHF$6xKHSh+8zd?DrXDac6#Z%K+TEP4dpO^Z2=T z$UT4S4($gFf(?Qm#DCM$#>D%J^NWF(Smc++s1%Gwzl9j}d1c9l%*w)L^o1Gi^4wq! zdF-gwOQC7YVQsXKW&H#uCyFqMe!~DWu9>_|Om_YLx;zQIi$(4t!?n`pd*sz1XiKxn zAWqXhpjlWIVT{Hp^6=9047jR;Ci?iTF#hoN9kS_oa8*mK348XDU8AJa(s^M4;s=!; zh2!?0yKTC3)DT{rMtTo>?-bd$Pr~i)@$}5{2`A$bLg4&T^6ZeCJT}x@K$OC0)4Ny<^(m><3vxjgXztlH+++Hqs&rArtPZVZQc< z=|&?dDoNIq9U<`1L9g<2-525@dfes-x)%-g^Z#VK<*D4FLE2EhE2W(s5{Z^^C2>}f zTpIH&4i96MR^2Rss-d*^bB^RS=TdSje)u|otuuQhn=fcjJD`>GT#KIl}B(eP6nIi9VQrzBWU~Z{&u3I--yyM zdoftE>d%SbsZyK^H5Gk9n~W@2^qjuZV-1Kc2)6Ir+8uyC8bcV$s(NyZ$E8K!P&;}u z8ti*3$R;Q|lDEaGircWPv_C?{BJh~=F9acDTIEjflocy|)cSUPl>dH|>gvdkBLy&_ zoK0?CqJsr)p^o*3RN@}hO}@9&6Tuv^B&KIij?l3GnDY|L)!f46KQV0! zmo-B9b4-;aAqZCn#EXu}JT*g}oo&8_2tYy*nZ=Q|)N4oIYs+SuK5My|pIc287NWlesyY%f-+zOBQ3|&j_(mA8 zR4N`iGYxVgJiD(z+Kr=92^ZG9geoo3(;zzk^!Mojh#zO7`V9OiWcHcv{V!E9|J%+V z1dKunfKAiV)Mtxn=KJ%1pRMrkQ);dI1zLHhxL7pe zE!=RGat6_XKp{sSj18NeF4gJZkt)?@c&65-I$g5UzsD3ez%D$@Y1=TwpN@j=J3ifP zQZ78HY0+W&5OCEb<# zYB_Wt#yS>oe+nx1&NlS6VQW^1Q^Fj00I{6#)nBMwfPTK(DzJep5B+AkO2oAW1Pd&C z`jhVj9-_iuSD6lg`BbpT#1SM0~sx1JAuehn2i=$|x zZXn;q&BgeO99|=)Tl_L-9lCUxcaWsFpw-t2(50P^LVgrs=}qW@vtM`A8z@)D7diLO z%fH_^|7yH$yYVHEN&WA=O5YHL{xmCHcI>cz6!nw*$H2I)`R@+Patu7aTN{vI)4v_f(^E9!HZH!+x9B!H5Y2@25%pJZ@z3b zuZiw<W13fIBCL8*q2}IC#U(2-PYO{<^;awtFk-X+CdXWKI|5YuEqb2z4wl4 zvfK7XMO18v9i>G@MY@V~l3+zeK}0}mL`0M-AcO!R@~VJJmm)0@5$TEa8iFDn5&=W# zp@$ww0wMMJc+WZe?0d=`<9_?^`;0Y`v3i}qwdP!9uD_|;!>iVAhrV3KGoVDL3p71_ zsPr^u2n65_g+gShk+6khlla7o%Wjk6V0I5pkrE+zCaKz`k4ShqT-gcS?>`IJa9Bhj z$5#kSEb&St)JT-y-3-HK4r>6D!+`5F^^2Mr!`gR&^Y{%v*{>JP$%#g?(<|-7zB|

f9#{qp6wgL))z>SOrvdo39UF<`xmYJ7;(td@?5MLYJ=A9h%7NP?O)a23mdocRS zbD@=^?X=wb>Q+vzo->Y5uCYOcMVqA(E>SAQM_g6kne+CD!Dk7WMCQJcp?zEXZ+3GFa z)tj7J_+9yFm`}(Vj`C1VjS0uYUG~{mewQgDd5DI6eZQl*FZ4zS3_&S(5!%vC`!-Xx zPJZcO-nUCGZj#jrWoOt%@yT!qcpiGjl%kcx;N4U0)j&BTvn+)3T5fI%wu|LzMN&2` z^C^Tu(&mXshsi(m=G#NgxukD-VSS;2GhXMI$PaweT`e7gzS6azcMq=Wt`lK-Y}+ZX zTqKFnnkVWzL_WpqFAk((G{pY2L$m4DU{BvL*i~y=EK@VTTdh2)gY1F zK^1wS?gG{)bL`vk=e0luY(_W3id1`D7)Cy!Sue`+z2%Xt2WlFn6}Z`S*!U;#&Fg<) zGYF2z&n(EjR6@TIUG`m4_6iQQ&e#mE+vk`XVhb0XsjdJ;p( zLDUZOzPQTz*Y-ZCywDoRBVI*KJ51rWM{+!&T(RP)x85^mzmG6?jiBC}xoBH$rrR~y zg-n}((iy0+|Alr|3O;??b>Lt5Gy&1(`MwjkIInkZqJ`Lhq6NxS<$uZN|JvzqwD{pY zdE(d&-%Yf*ynXQ`1^-X9Q2QG#62=Y=hxP%5pUCHL2JhVVggM$-Yu)DsiQUqsuKvGf z$f=VJ5ukb8GQYcke2z=)s3ku*kTnSLkJMKyk6!5I^?En)Sk>lZJY({jQn2aG>==hP z^y&xm3(0eKZcAX3NfK1ezw?|h>|-n^o{}-oRe4|V~ehM3UQAyk;tbHb&VGIf(s9ofvkYY`S6hvbAHN?}#AK6T$|yhkaxM7#xQ_&=`o6io_1iFq`IaK4m!^=+ z_YJW%5w;h5I^+cVKL_Rd2}71ZQ|c7j;N_GKwI$KDB$PYRTp#FXeoUYy#S=<4?{}E5 z?^@27Avgp0Yr=UA%u(hhKv<=jbAq3#_3EL@*LyexErm-NzjDjfi=+lyTr&vWr%>fl z=2Yp9qK|ff4Qz$39k+VN4}Zh-KvI0^w1atJK8q(&&Y0Sl!mx{!OR6!d%!VSr zr8q%P^=4pam84FXwVR#?#FM=jwa>XcJx5E)jFQB;XELP78PciVIn$YFzKqCbm@dID z2*62TTDI*P#^vj1konNVGiN^B=SVA3UP*D37w*>{9oecxtMN}o-406ZB>br*d?Q%) z-%l=~m%fBr;->Rj{~}&NpkSTp@aaJ3Pt8M|{SI^n^u_-|B^#@elM(;g=M8L0 zkgq;8cFeqK6B0)L2?=I*|CfyZubuvegl_No^ZTze$G4sf-8w2ppvN3M7y7rkf93Yg zT?vMpMl9r6b7}zV32*tf&k0@l4FB{a`^S)M@rOF95rURA1cw6EM9(td?+#cQ$w{wAg6%viN{Wj-0~Gl}Jt%g2eNeb^qDqv=2jF?V>MFrf zJY$AoDa7m^d_t~|XUEx|0ebChCs0Lrrj4+`Y0YL9KkabFyX2R0Jl4Vih!N+J+fn7< zY+7|vHENC}qi5mrkX_;g1q;3OVBi7=!doC;!M8kJseDEnH#ZOW;hiY}CTp4}34Y5h zNCz8ei#MiEOO{y?k6@D3JY}ePemz3%^i9;GFp$Hf#d0;Q^X_Q_8t%^w2v3Rf+>+c(UMV zpy-0Xv4H&tHSRm=a&VHD=l7?SjJoWKGInin83EpstkEcw5mH)~it98%PuthUJ^wb} zs&B$D)z$(am$p?`;t*MP*-ryIyh~E@cMrQJU&#(;6HLt{1*Y{w~?;vfRD=*S*I3({E6^Z=* zOG6u@A{4Wxjy#jSN&Hx= z?_1;IAdMMJ!VI0(lloK~a07(ua8J8ZkT36f0dP5qf5|VYbYXs~x-7}I5zyIDSp9o* ztX-&hnKZFVWh}1`TaRL|fCwExZah`3ivwzT1uu#$XWr+5g$0`P@jx~*c*o`=9mT?L z<611_b4;zao&NHkKX_)3pD+D!UiEYA^38JD$C^)>cz{EhoJJ!8}0%;h~d+pKZ2 zLjf9S@_hK$od>^ciRE&9kA*q@rwO=Kj{<~4^p+S9AX}?o5gn8~KEPQSZ}cMIU<6@4 zd$8U`V5OVCw~-fGN19k)NfK7qRz#D%6i`?rEAb#m2*1CNd|S8-xTCnNISSQ_S})); zraMsFFYA)!IEJEhaDsp4|;Jv`e)caw}Fw19Z9!|8A5eE4ob-9P_))e z0oCe+y|KC%A46#mgsq2DC_;BhmK*U5wDQp4)@kYW#VOcD#s+S7igaP>3aWf>oNxIN zw)Iqt<`|@2FATD!-3feQai9$-6q<72^u4o)DF;-6>IuqVg^Hl_VH-7Y%PcPu?brC* z_bx}C5^rI@0J#Zce`-K%SjV^c*PI-Bw-z}K^Z50AFL2*)Lg-rtvhRAB?g7eyx$qRN ztw$9lxE?e16og80NukH!iNLT6ZS$%B(Ut+%kF`)g8hxka08B4+x;0~jD`z+FR-?6s z4S3TryW}cHnsK?Av68f2Uz@~cX7EYkL?QY`m0lxWWpy-V}@8fh0JXsuTnQeUDDW+yW$K@(;}hV9f4Es!r% z5&4d&Qhh?&y?&9F&f3%O^6-TGqW^Z98Ldp>K0=XHh+zxwA*O*y{lrjEU1hb#7Woaoq=2(~u;MJ36<6 z^=@caO;gP=e_?Y1fwVAXn%GlOfOHrbATl=frZ;haWbCxf&;>$e;8R+~;W{?s_+24o@7q55Iwg=SRd!3|h9|=qc*EzpEk$4J?k@}{9z9-J8ow^WRyd#zJ zEAVCPfhq@o>eNL=6ja~JquFOoGlMVdHRZGpD#ZwI1ujCl^`BzmOqbb#0qn@2>a+bV zCwXt3s{_@9dHh;I2ESMGPt&PxT=&vf6id8%2*60A5&Yudjpp1~2d*M$EhDsIG4Ph`izy>QB7YBV(s*%8VP85is4Hlojq2P= z-@{8aN<_t7xH#7`RD>gW<8o4-`*}Q-O#TQVs1eA*5o95@Yk`rD4M96D{-ejfr`r0J z5z>@bv^UKCy$c)Zi!*&i>j>go+HP4qbo8${R1ET1Mdoz6)I$ypzSL9^H|XC9rA~jR z=B===tpK4h9Gjt!E2`e=Nln{L@XEOcy?La>dP$Uc+KdED54A{s#G6Qa#Z`ZKk&~5 z5v7Z%xHR*grJNCNts(Ab`80J6V?0II1rQeHa| z?7x+kWCrYW;Lf{;GwMDkO8jm)cZl+oQw->ZfH2=WdIz!`MBG0=muT{&X-ethO7kSq zRxPBEN<00-Lr{OAXLRyX?K&-9%em7ho7ycPFfAUNhxl`Hgjo*NY>U07+NS5`g7uX- z=A=0z7XMN(wEyW6s0{ecu26!u_(UhOtwKl_NnTAR!lVJr<|fW&opk|9$dhQt0@^1U zW4SMUxQ*&@_~r+#^+k_{hkz|Ga$ERT5F0}DRhv9GD2hn$24X#4UmB<|9bTdz3BDo+ z6g}ai8SD*p+Qxv`C*hCBn!=$rLMuWzvO%}_Pm=!+O#F9bJYT2w>)z4i5Q%Ldp;905 zf}xS!1cop*Y}~#wx}WM}{1Et5?t2k6QGAY?&7jpp-(Fa(JX)iZ5FM!inTUUAIFVGh zk7!oNGZRQX&Keu^W<_T(-~sRUEIwu{ek3d`SHaqigA-%o{E3n$Mu#uZqRDsbwD!C0 zbjCQVUTjIDb2T{_-DIXL)Yu{Vdd=66ce)Hxu^GJ>YmKGcsMbkZKpl`Ufli0$>w#|@ zB-4ke!c5i0ms?hAe#Ik9E{{sL%(>JGuL`4g*^To|1QQS2jpvhn6&2GL9r~O0o!4p8a6~K=qdehd92`wBaYIA#(n!Vrvv#dWDXb!ep^|h+!#0d)LXz`QnyBJ|gk~mW<&||!HBznVKB4Z!|76lPSM5ozm7F!+0f2p>F-e_6lQ*%ZY9l!FLI51n&{<@h7td-NZfe?aZx9dsJHU-x}|*z;YE zN)!VcyKK8D>r&L0b(!W9Nhe4Uz9!i!_3BXG;;~+kGSYmWQJ8&3Y7PjxA6700cFqxQ zzD-xJM%I6LjPAf*w#tM!tC6BIjN}D`r$Ue(7u2!H3I6I*=XZEsKZ3-1M!E@jwdu99 zUni9$Z{XHz*+^UKA=~kk>SE@zGNAkQU_W+=AoZF;^uf6zFgj<;kA0@p$t% z8V+bry~XZ?7vtwf2}8kvcHi}5{xRtwPg3=n<3IfjcIfJ9%-wd)>1QZ5Le z#%$fsk$#IGeN0#p#&YAR`9wdf^B+1aVG$cIR9+3e%LLNF{l+7iCvHSWFm)e0;Q%*phQ2pJ<#B{UMB+($gRZCUk z8N_EZAtkuIh4K+F?^|_b;suT{_7v-foe5poF91AMM7kDa+#CoJF`QHC9D#?c`A1y)1O z8RM#me3x~UXQVk4FDxid_mhm=9YS8t*Zk>lkmA$<-;wvnz@iA2bb|-2lKR3C1s)S1f*GY5kjpuHBo`xH=tK7WVn=zzk z{y#)<|KQCxU+=G!{+F<4%O8&DqVu$UO2y?*TegT~{}bE%=l`_?|7)yGZ2K*;Ys=;R zzrHiQ0%11-zP&v*TU(oKzc2?32671%Xd$jB2XOoUt^Xgloo|IqidF{HSEEbC`J0nb z(?2^5Vf$a3{$I0gc39evxQR`%G23v<8^bL@pB6@UhVI`qXW#5{yz*)PPRA=Jwq1N= zR%9_bpSVO-J?=Cw$cLx=h$q85%inO;_WW0A@xKjG99A&H#`I>ex6aY$fFXTjs)B3I za;(3n{5}j@nqNhwt|zXhiwcc`O`W*?d`tngHo!qYjLR=fx3Y5F z7trjCD_SF57Zn*s5CK1Jv% z*A!L`>O<22YT~Fu`LL}?*R2@9zvw*|mF{h4%!37?7ZB?tX>j;H^6^o>BD%{jVCk$S zDSt_Q4tS`VbGwMcb*l-y`<(E=oN|rNhVT#=mj#*u-NU2wD-h>jl;G01+*A?$@J2H^ z2WGq(Vyd7OL5der`jB3a-ERxdd8?8`;{r>7D46?iu?1Cv`}<;>)! z>R>q>EBrb80# zQQb1r-95r&V*dm32ClGaSK7Y|hKqy1?*FkJS9e_;RN7j!5J2m`Tv{GLi%lOx|9$oLmhX!F=S?nMxY~Tv zUY>c(U{wWdDhGV5qkBF?8MwW=GG)-%XvYR0&g!GLJPC6>hyz9q9-0?GJ_3RYTec(9 zXTk2{%*U=wGk{Eg(ZcuQ@N{i^JLgbXk}V*_z4RRRk#XWZ#{sv{{7WyBKDxd;iXis+ z_;N7`G}~0sxYT=V1hPz;p7Fa4IszWFs6sFLaSXIXD9UsVsl7CVT2`*HoEb!P@^S&! zD7|Ua(y`x z-|WII&Kv9>fY}`9y-*_<5DKPyb4>ru`(iMMF-;|@)gyW9`t;u5&j-{%!(E!x|$GW?$sh?lnUX z?M!Q-{!aP!jvi@i=L^0rmBG|0Ltck`HIi)2n|rXl@p;c+NxLlN0Vv-^6|;(@2)Ug{ z3i&9@r+vU2Dx)s6Q#kLHYi$c$C|5={l_rT(_tr%pt=}d zKfqOQlyy{@myk_E=$}s0zp@{ao_L1_J>EQ|GjIgc=lv<>XC4tdTQ%W9KUvURQQ)FP z%x8cs>;fzKwwyAf%hP?}Lk>C0K7OnGpz?(~meXXua2L%Y8>$FcLW+7mGQ)_9T)FME zfY`Ue>7v$ig*~CoM`~T2^(s=fe(8GZx%lhSzwn68J#Yo`%w&%#+M^;jg6! zM-xkXt+PeTp*~L;E<&JPF7*)4Dm~e^uN`kGGvLYjv!;Zx8~`mp;@~O39cs0LKNJKb6GthJW;85>U#RzB$FxN}~R8$+E@H8zR$3OUv~20>pU>{cSDm2}Sh? zQ*+`TM9G2$_v7ECzc@;C7HwCwbk<3l`UpbA`r|ZTdCFPOU{%;VXpbMlgZ84fPk;&u@V>Jn+_emhdM;OV zTkmH?wX*2JMphw-$;%Y@@q&v5oA;-l1{z#$iHW1WcUfG7&7o-S2RPiE4oSpsK{TmH zh;EuFWq@%RrEe@!$ZN6)4KVtIG>~Y^(t<7Vss{lLdkX=qV|kG-!^#KTM(qLI49Xs$ zl>B?zqprZKXjMqqIOb*W+=g=Ub4_8vuqW^eJzhY>xYXEmSqB@eT`)m36$W3|7P@i& zy(aAM&^2ry5UB2!HcWv`8KjZ`a1=2PX@cpRu00k?e9J+L9Opx(H}z;Bik=j<7h-We zPXcBBK|D&c!*)m=*_CFmhtJK|EX?o{t$@L^Bq`bFiE zs#nVcWC5VCU{!vkSPPH#_Uy+5p~ZY={b;A)RR%o|+*m}l6gigNXP>W$^`6txrkmQy z$PkOgm`{g7oWkWFK(khru?uL#Iz6b)jPp|^M#Uk+`-ZIg!zP};PK{b$p39+eiUxA2 zwQ6Fk={*i=F=lUw=b6c87Gk4Dm-gk*HqOC#Z+$(3t&k5~&IUL*EwDbS+*lI4t!UvK z`QF%FRJD&$z$#ase80!wM>`;|j8vbrfa_c#-hT!owbQ4%gKIT3PD*$r`PgY&=tg?X zQ_lr8b!WWDNU8UC9-iI`|2=2RE97pfP}ygcOE2%_5~8X00JRwEqQ9m>^Q89RMF+j$ zIyLs#(jH2p5J#duMzMj`F#nf`H4$P^t8Gtc~&44T~OP=8G%!iK8`d1T8U{=jQ zMrrhs{568lsP&y!3xi(z(fc{yF~kd{E+x7zEFBV!%0nP2wy@3cRVJpD=4{#Hm?Ikh zm<#Jr4Yb)ox>;3xWxegB9KD{>->}Qy8D(mB*v&y_OJ71vuBg9($b!w|z#3f1keHoF z^!Q;Z)5RCr(YWo8kJfvh4mrAlEUe$x;x!wXsBvty`;)kb@#LP_f=PdiW}?vEq4s&1 zNsYwlbd{Ct<@H+mGIl`pLPEjZ*0>p0YWvGyYl|{_y!S+v>WO6$NY}x?#RJduy`_3{ z6t6n1lC4F`uQzROV|b^OVcQY+jRdNh%6@y#Nf_Hn@SYXk>ph^5J*?!=pIJh1z%Ald zy$8V_2f>J7V3bPMxM>NkpXPQvu=^7&P?oz|{BZ|ZiJsC{5d4W?v~pY4wCZa6w5XLm zC+SE)^aZuj6ngn*30>HA%I&Bd8798!ZCZ&u$$b#(yd6p*m`B>oICaf2kFGVzvv=fmmOkg-NBi^**hg82zba379gR6{vV1|BRu%!)qh{Y*wwyd7g7(8?8I-l0 zFgRPlC(LUY7a$H@&8s@5F3Gu+lqKWSqWBzKE>uzvCPq8N+IN^$oBYnW;2mvLy)!Bs z4r#0onobR8)?gjKm_2;w%7kgBArB!TInDBnQShVz| z_e00BPsSr>)Z)DJ(_-LA%&gY#^J2N~f$yXbyKhgxU&@Uou#HNq(+^Uzuy~?3_UuDQ0SV7y>mVM>b%kY6VF%*`M=~#e3dyV}` z(|VUHgiPdhy~mXJ zjD~k7GErg@jZ*N>_gjIVwk(b>^pyJ8?LW>qSK?Dr^Ao7TYDUv9=HVmE^{uKtv;%ID zFp_aMDS=s}b46WjQb=`fU$=Q6lezHb(g+VkcSJq;QsjJ5Y&2e= z?73>aPMSe&Tvfj0@1d?VE|iV zjqUqAaQPlh@wn0K^z6Wod}NRf4grPh_|ldh>hlASyzZ9toZ{y3O3*Pq)j6y|kLQh$A@tte0OOn1fWRkX*f1iWu;q zHF6kNZhv^6^hing9o{w$xWL0|cAn9C(GT`@J*p7U>Bl8a&tY7>(9qgJ=@K{8Xva0~ z29;WzxsLLv3lj+7Vt*j4#(j(O*w4tkp^l@JwaV*yg^Q*`nWp*%Kq26p!AB&gEoc5g zril!u)w{hzhHxX7i^;*|cjLq83OdKHK9Ce*GYh?xb8W5A+`l^4Bk>zy7AaGCbh=r} zn!rb4osD0%qoIlvXz?%8A6QqB;H>wZfoj*7+2Gt^tKi+6q68TCWA1fDQ?-B!bzBk!wPywht@qpRtZ(~1TmiwCE9I7- zs`?TOHZ)9%-B#yX;NXQL`O%VGFI#sU-1%l(#H$A?x7YWV6mKi~OV#z}&8H=F&N43p z0C`GX)Bv6cZ~gqpgw~VZq@Z-E>=4=zF{L{yVmNT;Ytd+RkVt??%$Dv3n-hn0#O&_F zG|22MGPCZ_!Uh*DRqzJ#Xta5&MyOS2Oz2fZtrrJ36drAze|2_^{Iwo+A54!894VMb zHs`O8F;>~(joSmIcY8(}Mz-5uxVQU~=+w4UGVgE!+x{EGCAYvm6DkupzsG=oaN|&{ z!~^}dO7MdM62}mUO&j(94caHmdRdeYXumS}+|^VEzmdir*8bydSCA~r3U9n6d-oL< zX658(>f@ryjpd;>DosO4Vzb@=)Q6XMeWS z%)_}`Vu-I===U7@LHoo5SKbo$ZE9#_ZRr>Zux|8)-W$4mAl0XYnY`()vWkCOUoyi9r$31Sb)!&D(HE8 z2I}o_Sn4TvkYd;ZtXXr+)

z`J`yMpEoo&&DF><<%SK zqZ-|Quj+iZWjj^p_*aNX%E;GVpa%T~oD^x-yXEG^%-_C9f87Ag7Vf-21E~i}*FV}m z5~mrnm05E{!p4FV{<2IYBPK4N-uF5P&jD_|Dxp_Us>`>dULi1%h!7;#PAYKmcpxq9 zFgJ7X8XYraN^$PYOe_8Q1C_oaA&d~;H;kDE-tFN)^X1t!42hJiSM8%S6uCDfsGO;` zOIUZTlW8|2e(gzq(HU3yi)2do9++2V+R8v~=e^W)NeTUTl3H1-!o++zHTv=H)quM$ z%WWpA``?hFU0-FB(uRkI2Q%0!bDeXlN(5z+=SknYvSwHHQ|^>clz*!T71HQ!KOvsP zomq+zyB3xCWjv9-*WpAyb#Ci&8*!MD>hzEcev9uaR$WGnYOrPKVmaXJ>gj?#_W9Ty zv}=hou3VSvy7m{X4v;5{QqKm?Eow=J1j7?}p4G-x*)m!OwjAfGWUA|VI_7afV=cPD&zZ8<$;=o-N z()mopTM{lm^J1y>i_znfcfX4qa^Lc_$AN0%g-W}UE8 zP?KTi_)V;?oX?Ys!+O1PiRzmdK{!oh!64R2oon9uKHzip7lAPukeR#3Pb`xd8t zqUCJRE}XQ5kyH49G?jVZ>!f{uMv_UiL80d#cRPZ(&id)1S0r4Kr4RVf1oyf!6FmuB z{}tx*>rF+Hmg{rZEUL5D=kZ#X*cKO4^G7F}{jO+imiCJOP*)9}wYx~63 z$-6UBKadDXjvSBsA@Qt|cFKW8N2N7!mdOt_sp>T|sXDn~deoO&$G=~G0SfrH8meRO z3(HwjH~cr!Jn;3k!%PEqoAqt^URn=scZlgb$&1gXt z#15*<9m~VwcZ0$n8*AOyr3EfB?{?zX0$}aKRwX2_9RC%-@`p){>i8`m>dJY}H)59J z!1tmr0Y+5{79i?;1EEhY9bJvV*T-ZNzfWzM78%JEh>~Tx)Zuw!o$4;SvcgQmDf?{l z*}&zgpiBE9{EEmI2S~3O*gsHT(78UJiRX5G22$z5!`IQ=LlePKWA##Nc-7@E9dj# z!`(^_1G3A<`I~QmV1IIO*`wcoNg1c>9Ep`SpL|#sBkx3fEQN-IhwKLG>EU)i5LZ32 zT1j15zSEDtOUtFm-57g0t)8)t@R-HI90SrKryhd;2XRB%UXImlHDmjYIl$R?Z|LiDvEI z<+H2{l%4StR>#)v0U@XBViZW}w6>)V>%T~^sWdbF+svfYqcv}I+t#!jpI9>1z3xgX z&a=XQ?(l58&s}lX7^aR(kyJg7UPp6Y)oUvw@u~BAX~VuzR-wW7SpN5D-e^=~g;AT+ zY`YMB_c9Z_5;(PwPBlBodLOhldOdl>l38G=!FXOW_d^u20ntF6;r zjw1297ls>eQ~`~{lm;4b5~VLb#M&=z4+n9UjL?|Z0kE>3Zaezz^ay8U0!PMrRs{sM z2hubRI!ZjB%pFQ+LdrfvPPpaW#jn=v;_)v;^u|cy5h=VusU{kn{DC&y^~ADoGT%*l z7V&FqOxeIx$l|Ry4K-+OXeW82?%gj$_Ds8)n}M+@J3eo>us+Jh#%7M)qTTylm9U-N z+lm4VrUF}6KV&dCfcnC_{y?BGn;IyaN>>5d@K9ex0UItPiQ^>#@Vp#&SxP6=U7sw3 zU?#QLepLh}3}t$_TnjYa`XjM=RMRUvcSyPGwh230w{qkrkl3q1 z0{0DIx-g~^AK$n(26Gb+7`-Kw9dUYm`Ku#s_%R{tLoB5a|(7!m$NOS3wQQfl+_^Y6L1qyq~V~OSOcxohmWt+GIG%DCU zYmDibe0^**#g5)SED`YhsrpMj;?MVMrxxlarkO{*c~ z%Es>EX!tZ@`fN7AcNYRe;&8v6wGoH_h1 zN}61@qe|991SLr`c-g9s$i32RhG^g_JzqdbvKdXmPm6j*ed2y`Y#F{mmEUtjxMy+W zK_Bu!u-D*4#_e4>xfwbR3XNJNh4rU@S=-03PR`eH(>4leF_c^w#a4S9Bd-JPs? zsmFGE?QGzmfY+2&DbLdr$il&)?hBNKZ71RWdlwuBe~Fjk!sx(5*Bh!xPyzUCt8U;= zG1DW*;BVvU-Lxa%XDLpc_ntfO=g}o;$HQB$r zhMsnd<*;{~=qA@b$Sb74BRMkCI;KxBBt&CsZ{ADMD$sW!gmLB0_*xK}U9;|Avvo*+ z>g})!bYa|;BLv*$>-otWbV%W<+Xv^b&mLtb3NK7KS5vi5cOHLJQ=u*tlHBHHmWSEi+}V{NN%P2CnJHl& zzO6y1uNSr7FS11SvJ6)TK58WGfsR$IJ4lsI9=8b!B+Sw-X_vjPBCVo>!rTUEUdYJd zK0)fC)gtnw=x9+Ho;+i_(EmVr(<^@;aTMV<$i<1 z;44#aK9)|j9`fUjiT6Hx@YAVmyz{cF*8_$Dc6GFqdQ00g<0Lnt899FV)A7lg(P#?- zsKZC=>L~T{@~BXNbI{dm<7+tiJdAU6iRd?-#8f<-V(;_)S)Vqk{aA!2f)z*ZKLpWD zz8+Q7RVD`kW|m?;ws6G~NB7aY)gmo|qY7yF6<+ZbwIm6jk~$#F`=;<6HY3n=`ol_- z>dzewQK)D=b=h~K`Qj0HO0GD4@X(bkt*+0CL0O6hOCF4H)${Bf2k431g_5YXH`H(g zmCfr+T8ldoBAWv@9<{xa6RfA+{mS6QBW`wieVl)NV>-1P29MX2+<>buq zOWW$l`nonZ{OS>h-$<#CJ*i~R>Fv0%{P6ldewWYXdfC{I(}@ItgR25v;G{cRojX1* zRtL5Jyhu^IAJnKD%@G;>Ap5EQaPf)AW{(h?Lg{U*;DAxKVU){p^%%_bBShr8lPXk! zLr~-NCjG4PsLlM@w<|H?&Gsjs^k)wmiumTO?~ol+$vuJo>vIsGF8R@Gek-Hn;d=w9 z!yK))q|#|qC3Q?%3(4o$!K+exYp))ay8jcqt1~i*50A=hmfvILyRU&Cw7l~youIa# zgO8v@Pq`v)+n<=PnVg3l!m~XePC`tr3npmH4eNcajXuS}6;pH%*TAXoXQ1bapAPze z3gWFKKk45ktz!TiFRi+oflX{V)Gilqs2n7|hGu>VnMTB{avg^aLRxSjj9typzAE)A z1)cc2cVlF1{6sb`qw-cnm+DMfR~tSZz5)?DAmNjw$lGyj5an{&X!HmS6br&dicXGu zuWlrGzxU=n&tS)+3aSnT2212>FJJbE;KuT<@$tq~g6d(y+6l&1N3r?A%jiA2B=f%I z4aBh91pNX-C&1tfs$98DWHJ~uIqj{l#}-)xU52rXS-?bE%Awvn{? zJuWab?z;DR`PLXO!r`>L3i92<9LAuuqU(c3V)bL0`KoX5WOy6lY2@o@n8@yHQB_9o z#F}MYhu?Yx$VQ%`%6CtRVfoch_xla_yfwmtc3Yi0H~*@G-lR-rjxoJuVI=lAZ*}u5 zO1q|PL-{T=>~pkBdg-vSuw1l8sJl|*Z5p7a^Bixd{1_6reArJCapvtF!Wi-9J5F}`TV8MbrgS#gLhY;M|-643e;4TRc!CivG009Pf7<}*n zhGCZPt5?5YZEe-Qt+!QMJAd5URkynPp3~E(Z+D;m98UUPE;4gGE}i6MC2}-Xaq%panyI$W8(+N)S`l*57lLv`c$AM(OfNzUI0hv!HiQ8KT zUb`Fhn<1^47f^~W9`Co3ggdvsg;egX6qTP$A2y#Pg7b^qy5+m`A%jrL^AFRE2+qNG zE(d07WZY6yQ-l5cIeo}afhhO#f&0PNu>UD;xL=q%*8gWe%6ovkh}#|gNAKAeM^*Iy zUi8lL|KC{S{=Z~-S@h1GP2YJzo`C6I=}Es{!Z3wS5wV*o*Q2TY{Ga!FG*OrR>eG6v zEkqdIun$BSI)%Bd5+ZrCi~8T?eH9Z}uiFIYfZ{81fVB*N%seOVv`04{Wn4CMiMQ?D)X-zwX2;7@9&`v|@RZIHiZhCiM zrL=c*w*j&Q?lphDKz-;HbRS3faIp#S)2>=eP-Y(kTL)Y>)A#>&`2IWZ2akHnwT~cM zPO~ED_CbrQ29WFFk@S4BH^8iu*`3ZtF;5zm=YM;&i?*ZL-)v2Pmv&goJ^wp^G-=g_ zKKHw&@r(vPJ}n5WOXv+pJz3}Uy4(M$G63a{if3?&fSO%TjOd(ebm(S7cZ3-ZK z@G93pK~8n^Rr3dXh^MFBJDp)%(+nQu-3-d4YagT-GvDeJSiT`s1Y2m`w-wn9rILB5Pa`zsa7$(W|DfM zpbX6ZbOsm7$msRsiXLIPexNYjrhcaL?UH^TUt_P`{iXHX?s*`r^*i_;XD$w$dz@4; zY1*E-3u~0SYj=O`8n{pkL$nesZp<#F9S30^7vH7)>Q4G~r3-s@G5P{_Yc5}OT?^C^ zX=NS3t$J}w-MGe6Gw$WM26zJ?rfil&Kuf!IyLFxX%;snzQuBO!r!M;}gy!z0^m1G$ z8c45FdxP$S#79&zS#2Xr3i>_Z&9+>9MjsbbmlXQsr zV3kVul{KI0XZ82F3P277cYa{C_enus@OiM@yl25Yxx`-Az(cv;l-e!AnzMCfQ}n@q zaHY!6>bcf*T>MjD>}CojXnynckbB~a=TwFRx(UW+q*tugMwLo;s*byH{<-HWi5ryV zp#U4?y=e=Szr1faA3y0WYxu)o$XSr1pmk5&Y`EyUBm0m_R2a|2qgILPAFb z5;^e+eASh^<;5cS{CVM2z!d6TUyOP7gFv?rn~jCJtu{l{ya8$s=u8BlYn60eV^BkW)|8w+&6T;s_%*v>dBNvgeM-g7&pj{I;kD#EAkNOt zE)rt`eafLDstkcrIq$mWc5?3&p7Os?PY8BprkFqjB~oqY@;e$iz*P4y^LpC@#Hnat zzN+$l{i)s=)5zy>O(-w?^9DoR&1NOFHKO)HnU;3(!2$0bjpZJk86y6D@g5L4_0#zX z{NNOF)?jvba+-6~9Uw@aK=L4w4F`-Q-{@p8PKZ`Ph?0tHo|3pO9q*d+)q}YXca;*G zm!VeIT8rUNe*UAEV*e~Aj|7e^vYZ}759?OO5oL{9J*XLuFn@n2|Ji$Z9}LZQw%q67 z4Z>P%`27|Alt~Yx`0-QS|7fZFPnj#=DG!Jx*TZ7k$-B&Yvp~wJ9{We=ylL~DZ!@4; zcs_f~VahLI4iV_c(0i@0`J`e`SDkZnZO<|xe5~-a%iYSa22n6mwH z(EAb|C#?AB>W~%pYV(MBInaDbc^-Q|8TFidz(2j(P zEOx81IqHtwyiL|MDWRzt@?(T5Wp??SThGbn@jp7{%hwdktq5YN+*x=ELcvl(A@CXS7x6au?m5|O zC%5};;yo{7OpiFouKO`J(;wyD?{meCRI7#w@M^q%R)QGX1b7LykTf1p+j0@SslZyG zSuV!Ky~rKJlQEkQiYn0N8Xy2h~Y{==1TCNL_=37c568u z;yV^NR3=9QcB1w|@%q1#CTV9~slYuD4Y2S;vp2N2Lj&q;405L$anCLv0iKe>*`f2@ zo}?3vVkRRWae{lIJs^$d>48mVUNuuN@#f$K!QSVDbJLa+|1ZKP1^a$^fw1A_-VT$0 z@Co-Gh$#XD_6=GAfKCyCmaBf}AjoP9{BaTr?uGZ(J<@=nRZz*=1#eic+(H30$o{|H z?h%UqU-JF068DmT*ALZg+AANdkdQu*{kMAOFJ7`D|F5$Dub#iCH;}FElx6Ymhax*s z>=1p5;(OA!FL#C%z4t_KV-w=z;}h7kg0*0|=lS_Z5A%rm7z6hs2_1hBRy`-Alk@Wd zI8Y!TX{9NJV;Cg=HM(RF#l`sVD|@8P$e_XNZ`50%uL+P_UQ^EGzwh^6PhD<^=)ar_ zaDTd#aYjndS(jp4aOG|3anK-nv*nW~xy^F)@xrXVjtv0CA}U<_%wB4mfLbRQ+U9PQ zx4HrRX(H{w&H5xmc%43nkIy!5zshnh@2gHPbemzJDKlv*OgcIzp@II9$)Sp`ElJ6d z?fLw~DcSpcRe>zY?Qi{kLe>_tnAY!bS1kP5H&|?SnT?T(sew3;MYa8wMXl7qu1W2+ zK|x`LtehqM=Hamd?2C_WfBX8w9P#q0(L6N@?;(}KE=KqN;9^{q_*{Ulr`9(0ArYed zRJDPeS1znAB=1P>hH^Qm7HD`}`k3*fJyl%4qV)WkGHu;jIq0KZ;A+c)2|V#piv=M? zV*jBL6#R5d89K79zP=!>1=?ObyFRI?O!HLRg8C;V!uUrSIi<_h$G&5e+l!E6+2^SD zbvcF#FX2CdQ9e|7hU)wc;HivSW)z);5QgSdQMVb(Z<~RBumZ7vYs)bz>Y9I4vql}3 z=)7m;^02i@wfcFxfHm8u7bP)1PE|=XAvf{&YL}HHV_poO{Yc=>o$v2UJQ`O!F}}JB~Jrc z90?xm^M-;b9viU&$D%bBQ}!4rYW-rJll?V7iCt{3Ej@5c{u)oq&UnU|(NNQD7LFVv z04LWY((j!T+a~)BAgI)Lwm}M!&nJ8OC?L2UT0<+KEPt7)V0aPv%G--I8z=~1r`nVB zPJEq!?xeOgQoc^?IQeSaUIK7?IHtN{2f=S55f53%Ut#nPH;A$IlmG049!hW%@t!cW z&R+9QC`Ya}+41Tg%T7uo>vA6SxDis7PbCrb{3B|AZEGnir33v)TKKVf2P+DDu@pr} zr>07U3QuOx>yO>H6MR+d!+o$!7YZcAx9(LDHkc+swA7Kz4qKCR{?)t8`(22v{Uyo3 zvG;S44nl5VAcXg3t+GEYCH;qx&xuZ7r1JPvyE{=*2~ljmQA86a-r-n5BAY0BAO@Oy z4Y@qQF0~d5jfzsuIka4FJttzg@^w2m_Qc~en@ZAS<)MXMJgu>)@=!@4#2hom=Y3v< z>@28t1D_zjm{{+tEr{mbY30c*fuzG^63or1-tm2C<**4zcsc^&C#?X?FVqqz8FsQF z*t3t2J-(~96n!mL3BM;b`}ZWl-n>(spJO)+v5)>JU0~?Ka=Y`sml~-fdZaLA^={Gy z&WGbP@pi)XYntA0>I2rJ7qI#6kbIfb=T^}v9+u$jR-oJy0_3m0?B7BtZc%yuioHBO ziOx*Iw%V#7#W@3k%udPEqhbvW$li)bh>fU8Dwhafqrg$Bci#VVH6}qWLJAaDj3mXe zN1J)(9Udp|*sXgwYV7dn)k+l)4nt20*2+Y z*6Ed*INGWSO9{U#9|&szWUVYX2~6JWoPsh8LDK%1Va9d;UW0Zrb>?+Z8gT@(=D36H z?1REA)65k*d)-JUMjmKqc4e11DT%~yCRF~cou6R-m0Z_dA8Ak{LWOAY=`hIBc9f~cV`={$qs8mt&1KG)_2<`GIM^21(r_#b$>AH8VmjA}Fs6Mw%XPJ#7+YTlnnaNPM~ z;;)lM<$dX4>&14uzogr(=1&QNVfz8^czaNHPZ9P@ATWD9GArK{qD8q8X!fYouPNyP z;Q>!Ig8J1BK27mm^x)eD?mzJP+hRu4I*iX5IUYY z0;8$W!7t@G|LWWJKgy}32!04?g_9fC`R6?e^2-|?&9`(u`e`kZ6#CI^hmBxhd6FoG zNSq_C%RODP8&~dbKQEVbI`e9>#@zog+%j1Z*j-$?-u?QHBin+BX#0bB3*%7VxRw47 zv0jrO;Y+PwO$G8QH%9|(s9(ZtzT#afk_d_5dG}VcgW%B>0TRR@0VXzK!x!+L*wx*8 z>^kMM#HE|RKYhinJPU0~m#MhAL$giP`N4{;eUzLesrq*leXcel4iQU@(mGP%_)Uz5 zSY9zz+qJ%tYOr0tn`VFa9;!#xVVkg**m$eqSgjxhUngk2nF|zY`9RS#LF|b$Wc6xE zgj#aEN?S3D6ZL8t^1WVQ;IgY>P$1DRc^|pL{6Im&MS}yE;IT%4T9IrH{KGeVhz;KMQN_akdPR;r4e)F@u11qTlRvWMsAIuuOt{m;i~r zD7~$Y7ZFD(duo6g*DiNCK3t1D=jwWKx+LgA8473%AC2EosYXwR{$<1)t#}_QioeqZ zpn+>uyOAddG`VP^3V!V}%Zh3{G7*o!h=7l2gIi3=qHeRASRG3uMkM-Vc^PO1N^rVN znQ_5N&jZwBHJ*O;wO~rSc?Iq!ZUd0D0RXAKQ=_7izx#vb3(LT`S#E{Pb`4nBE&7$eL5%2k!12+eEC_&eebXiw@5Lsn>X7B<@n-5(djap zTmb|Qdp|LfZ>4H)@nQ-{^92{a|T7>>Tscp)#3)i1wtn;RAHfNh2@>=dLuQ zc57*NQcAos|HUP)K|gB(C%_Nw=0e0OmXcwhI@sB!ok!0u^nRpEDS&%%$(EN`iY4Ho z!i&I)`!6bS*&?pGN=Qt$YTr~9#R_M^$-fi8oZGVTpsVz!LK6mO(yM1qhY&_IKa`!F z&^X+>A*lY`Zjf!vURt%c-Zg|9-8ADh0CLfN5cihk0_)a(zC~ zl9ClpEvcNdUO3e~yVzpXH-OX{g%qrq&6kz#@+WK5*tu2WPt0Eay7#0P-d&Vl@^cBF ztX}kTD64T0#||e*q9GY;(?2~N@hu=(>*4o6g-4dp5n_WJ<-$Y#^4Xq#Q$y4!8+zg- zDph;!N5tdY+;I33P#;c@E1uqPS;O(O<@(%+p8J9{qsYshq&E!pM4(9SMCRA zJ{DkyCgwY>-^E^^F%dqlc>a~-cb7SQBeT%pn0rYpq(~mVYiV@}X&?5$`7te~sce9_ zNvxL)Pl6;rjIJRLsf#*E`SMf(YLghg;*kZCnHAU*YOC)c3Yjy5lyv9@?5}i@Lqb*K za|}SYvOm$(Rnq&*UO^{|bav5kN^*fiQ24s&pKR+%B8X~`8H@3L-3Fbso!24Dtku=X zEp16}`;AfSwel5hDa|$)ubL>hn!Dt+fxK@$TvvEVH zqk!j`*InZJh$wI3L9_Vi)44bGQH6KB6U`y44srjOl!;ba%Il)?Jgrt-+ENx?S>=Dt ziR6J@OJ9U~?c|Y70U+KwNwBcJtp7GCBhYj$UOz5})%3QIriNw#FOof^jB>VCWAt@n z?(N5Rn`f`+iI*A14^bNN4#=(A7sfK;J7~`M?-;kI3Z%Zh0lqv%a$IU5x4q?gbd}SD zkTIW*GbySYk#Qc}6++8C&R^BYp!I@}>SES;Cwt-dS48? zj)CVzCU&(>XLH^EKEXfY$oL`0jhw0KMe)LOM|HyQBGg1pUhO=akOb+O*LNp|Ae$jm z9D1QDD8BNf-v;Ayf4{a@2dTh6hXL4Qmcee};^%9LQF?&_GSURP0;`=!$?}_Il}6{h z8IJyZbjHGn?ams|nlhi$(VHb=e&v7e5#C{ICOE%k3!pZY_+be*@qTwDsa3Mtc z7M12nnsKII9@)ip2X_mlPuWfo8PZd;vJiuL4`V2>hq$)YT;AW}I+JpJ6P3E7+nE{~ zBkBG3W2~0DX5DT(QMM_`Wa#ue04A@mG|y17e?Sl76@ODjTXf)rgpa=~i&<~u>TH-< z5#Uuw;>@#FD&tkfq(gu89p6n@DKN~(QCA5R6{2ufS1xl%F?VyyO>|8319O$g9;CGh zkLR^jwxL{OA3=mX?mos+sB~m&$3XuMT@;fH4UFE6Y9N1o90f;?H+DuPiP2pr7!u^S zse3Qqw3rR8-M17Qge3O)#2RUPcx5BcnHVUat(zIKAdl0G8f0n8Wh9*-&fjr=&)z6` zRb-R61gp{mGH|mQwrG=`AKbcQ(#-J_vuYrlL&a6O~0EL-n3^{)&ZmUI! zq*`u7NN?<3$!%fiHD4uh#s}Yg_%~W$aNI=KKMF2}SX`g__1QJiVIJ)leg2L^zTJ7d zxUC@wJS(<=q%Qo_NxU|}tguJB!R^d0+pS>P>nUU}iz(nCkA4EN0%b6uA}q_vqM1}$ zyb|5deA}##j4==M-vrLdq=k^-Mul%^n~+?ZZ?nfvt1QKiJI+2GwG$+VEuF5g{j+nw z7;=e^Xv5rO6k~ep;m-?*FTt!1P)BEV5hVPUHIEW}zIz0iH!HQ>lO=A}b-)b%L5f_| zeG#LVS%A`Kup%Mqd7sBxYVVB7%AmVFI`t{rsn%S(+vg_D->}bJ&x^aXT9`kU(6pMO z`lHGb`E5V>cfyv1EWs6te5B7VMf}lmZOea39VmFqK0VPd8Gt%laQwr{h51D1K|IjUg(JKaqJmm{4Sa?Q8E#_9w~yyXCt&4-uAPo)5G(WjJHqp z@%40yMk%)xms?yfT2I!i*ObGAKL2w?P_D40L;&2F#TcSXlQvu`{YL z+@cSc9@j%AH?;i4?QI0J`pDGw>-xO)v>sfZjJzOIsnZ%uY8|TX(LMN*nVx2 zj8J>efsWVnQD|!=)R%bk1VC(>ulx6?n>AeOo6Owp(XGYY zrWitofj44sK3?CXH39nHB!zR@@Z;H=&2X8}FfFwGUM7h)!=x^T*V0IeQzPA*{$53v zTdzR&8iSzEV-Bt?Nji$C7gNnPN%%OO>uEv+9qf`G_04yqg9~A*tNt#Sf8M4)(Z+Hu zeV9Wf1Q2`;c_=R3z%n9P9Bev_48?+0=^+Y`~lWksU`1TzddNvN7-7iG@K zq;d-g_ZVVrM-Gl05Kncnz=9&B#p)T-E6kni4O-b=*KT9B4RT94tn{l4(<%;*!mRLe z?3H@+UsO3whu{#C``$9u8={}C4ctM5Cj>Idn=+}0wEKLSRNa}2Ih?oVVeDCPM2_$Ac2B1>(;?47V1IU(75B;xahjyI?V99=fo_BL0v zuW11?sqb5{U?v%t9z#jcUSSKC6d_X0^+@BDmh2Lcw;@q6vbO{I5m2-_-XeY8DH9ZR z<2+@ zpx#+OB$q?WSd4hQYHEdUn{Ge99d;oPq;Zub2;{XY(!OV;?);hHOfvLRSYpWxx?7#> z?bYQoKHG$Pz^VR}{!><>0Njo;(+!n-mYc+$@BY!2S#Rv^lU2Bp$eLyCMi=zmT2Q;D zaQ6Nj_t|DbQq$`@+9)Q$L?NvrGZ)L-kxNL_;av>>J7H({a+L-&+nz4 zq{0Vl7}6F#f{M{!vU(Pmn95D@E9>&;WUfjakjbr8@!lam^2Ig;xB7m9qP+0bpIw)m zHtc6EPLY=%C%@IYiy&KdFmug3h4tZ4?{+mw(mfk9wui6zF@VH}luO-5zVc=U>%Oz} z6HCxkQn>3Zqn@SzA9&aL8ym}{cK@d5y5k5F*(&6b| z4a|0xZWsE{pKxdsqTmxxTd)88BAp{YO1N6kng1tR>po$p!xU}33~HG`!-uLkvH}|n zjcE^=oJ?*8UEV{C57{sg(QYPF@@R!OtE*vum~s^ZV%KN3`VaZTR8wLRVtixakSn8a zugYOBnu;RKlm!@Dsri2q_z?DKPb@lTdDSv2;Ujw?UDXn<)Sro^o-XiRC0;x+Akn8gRC(VgL1=`FETmb4M@qE7%RrJ-xGXND|JFJ@xYc)c%w~u}(m&-;uN# z{KG(+dd6lbAj7AzRqBC27$>LB-k1p5(>eB`k? zYGY78<#5XCgPAU5&NP~d`L(kBN2jvb;yT$jpTi_rFm{>|mtyMLsKW0L~2d(H(SHhf#_Qam{vG_9-29+Ic&MPjN)XtZXZ)?^g zTAIm{oIyp^z-GvP=b7)`f zzErG!Edum zF|%+Iw72n7plW{Y!%5&?K}uF9q`45xUk7M+^Y0wwQ1KL~DSf9Lx}!yiCQ}ef2^(iW zoM{`RPsOB+663Rt1d=Q+4&n0UTduTQz@o88tysgIW^OV2%JX&gL5U4S<|oF0ld$QT zbcj3hXU|~=%l_LR-?F6wrP@vo&Pem8{ycN`{hgn?%(_q0tZ0VPI6j4D_#AfVO6aBzyYT7 zA{g7-mI=k)Bu(ZEi-)AklP=FcXd~XWzs;OasA8sqwo@b8RBXH@A)3s$N1s>ovGt+9 zj|3F@n|?v5Q>qiRA{Q-q1dS$_sw{FprBIHE8+FQ~R9JoJ`goK=jk;Qbw1%gliJJU4 z!q4IsVX&D+?4y-JU_dH?Sr(*FC}l~b&T+f@fUwiQSrg2h>v0l&bOQWqr`K$)^O*}I zjc!e+ASIyYdN~+&M~<|iE3*Eb=}#u8Cu&*5haTs+rffExKs0Jd8~o-hF|C~pC$!dl zFDG&~>$c%?jRgJ#CzEqv%$O~9jKI6Fg@^$Yy#;!8Jt$t$m_emyU{sn zrYG@Jqhy*8nOIkFYC{Hko^jsF>cvuokMZj{y`jqPFS@BCDlapr(xJK6%oK6zSo znpK`)b8{v@#dMZJGjEoe{hhl3i}PpPfRy9GR3i??m0Hz9B6s%)%Qz??kB zr|a#2Xr}aBZ>eqVm_I%8gF`(hEj@%fmNj8j7>w{d3*dwU3T2b+eQ4auv+HxFnmZF% zAWJXDo0NlTnub*WtS6F}rK~1PK{%z_-y9S=xmZ2&G9DbPil7G=_szOIL&~PUUU;YrNvZ1_ z3ggT*_r#a)J9fhX#t%$XMd%HZ;ncESR@Z}b?NZUpSyt|8INcNMmEju_z0bV*K&tt4 zGE7mh2!oBBYBea&5LsKpB5s_}MByk~Dq-T6)n<@B9eiSDPj3I1{1VfNtQGI(>0@2c z-z}~xDZKTo(AOC%`;O2s6U4f%ez9v5eKRr-znrN92RG1B+f^@Sms2^xqSMUirLzUbwQ>SqU~^2?+q= ziuWkira)iTKG|Akmj!jaonRpR_k4Q74d~Mta%)ued~U!YE+LOr|C2D^FP6)0fQG`G zbS+-KNL;HEbMvMaO=lO>&msC|;TgItB@(nF2+10cT|K^-uNSHc<;(dl>6me25xZuP z-R!^h4m3ukhQeXyFdl*H9UZ)295n$e_KxpYT@y&mIb@}Tk?8p{GmDpe_qJlPP$#rT zND;%m&r{}16Rx5kKez|q@b~LR(_g^;)Uue4w_IKg1#K zKlhc}ohcMSz5f&xLy%0B*E!@s(Yc@^J5V@(1#-`1+T9`#OxHJY7_> zq}8V}lM>>?d$2cli0r?&&1x7i+obn;R;EH?i~%%A#6qU0S+Ooen%CS>k-O&+y3c(M zj+@~>Q@>jQ`10Xhog&>=lcD&jrX}-fUhiN@)G)OzQTu!mm#M|zMq0cbssz);hi!Me zr9@Y6C4p3kVv*1e!BLb*fPEy0XDj%v_Q!q&uF`PbB{ck`NyqWP0qjiEN~wLC^4z98|2pv z5G49Itg9!#R?_24i5gGY-C7sN>xUN?`aR?$W^g@eEkVDzP^EUsu|h+!HEqtvtvg~I zl=9D+IwutOR}tNvXmNSoHS}D3O&g0zFH_Z?bD18kuZFMuHJVbWtG-TiDY5 zSN&_iT^kG2*y@CIp}gs#VznD1U(Ui#eSMDD>119XWPNMoEIh_^uv!G|_un()Ma=aZ zy#p0Y1J8C(tUcKYrn_3(vb{ODNN+ZISIZtcF3;5K&vx`!a?EkV6aVcv->MPHUZl8> zzb!UvWq4xv=x>hOKiYS}*z75*DJn0EcPBc{K34h>j2Zq9@>;<3I!#nUsTONdl~#?*`x`?vgme3o<4DP zStC#flfK>yr`2$pU>Fx94Hje#%bZQJNo1Y!Lc-b7U%~l@PmD{^UGt(NhFr?+m|wfq z2{(7i%Z^sF28rP89ujvHWC|-duAQd(@cbxy-~hOzXSkUu(EEDnG=;jDiE88Hqf~)k z_Wg#!bIIOKN);F}kv+DjzD58N7=|!Tov>EVKCW0=CUpNvwFq+l;kw^aQ%8qHH`1tS zqR1-I~hW z3}|2P8B1XEbz6VCdp$$~zr1zF;?dQ1CsDCRJrmf#JOJY|y9>F}Quw30@=gVnD>V7=4Wzwucvo*iQVx&LA0 z1khCGe`KN^Tq(O=CjJLayUf$XZ?M+9?ngz_Bt{vNEM6B{EVHd3-~A_&3FU68&9tO5 zCdIM?onMp+Tb)#fgs`w}b2rSvsq)b8Vvj%KifBN+K{U^?e1R*GQd8^{CYXL=ZPXq11T!*S=X0dv3PjCQpF@YQw5ulZ%H@INP$fS>}Ab z!?`QhGwUBLBGRQ9=mIwomJ%cGW{x&R?TBLqUUL&L%|WJ+r|@-Gb2{ZtTg+w{Q0K@u zI$B!P3Y%U(*;af}wgOvxe1|HmpD*R?J5y2Oj}1^jj|@C@j<<6Nnr&^o6!i3*qib!4 zZu3b=PX{kGg`QiAU!Eq|jSn3}JpY+E@wB@z3XGh5gB1)Aj(pAM|+((gJL^#`}MA~~{SC^!0B zTL+GL1+g9*ARIkBM!hd*f)GUe;b9OwiSqjYi?17w`GNv$AFks_Ru zj;@Tg{fE(M4KH6e|FqG`JOLP-8A&2_hi1|zU5g!)llXEB3RL0N%)WY6vik_n=uf&G zds!pjWm)5Y@^FJ@o8QKMX^t_o)~(*sOl)d&P3Q(!0Y`rTu~DZ;-P33R!2>PnlKa;5 ztiR8GgMYajEq=b*x$)mXKCZIjwT8wzqs%@7sZ9vHMNCe*=#kRb{oBcZTQD?{kkbL9 zJhlRVu{#a>>dLElVI~bk=%o?yWrPQa!4jm|&MC<$o_{m5Y<~| z6L{8`<~dNl`_{h5PVOgh04&xO_$zV#4O*DW7j_`_7VyJMM}79O-(CyUO7`j3X+I)H z&*f5EecC`B8rTjM&%-WVsCR+)j30=Dzb9kTOq=*TN|R0`LCH2&RD7x`{z+aKCSOe} zW%bPKOB<7Z{$0M4pNx@}1V%j0s<^%y<3!o+4$)j(^`=C04gQl-FuKXs9RS9KF6{_E z?BW4=KG8H~?n@aRrs^BzZu*LkR9-09L3<{TMs6312h`3bDR$yL=EGVdyijF>d!EAa z{HEC&mnWt1hB}N|3#y;G1{bO$q01)%6RY-F0;DG9(y>7Y>@DrJZwn`Wnj)C2 zvi272TrRnEm**44z0HswG~RV(*DK->@s6#+o_mm$zWyA&@?3f#>AY>@KAtKagSBFg z0-=cDeKymFaowJ)^tyom|0hX85E$#(Z?n8v%b`d}Z(9G`MRZf?f93x9|K$0Li)bE} z&*%O25vfHqf^<1TtQQ_XSep^wCQ3GbO&FY_##}CsvbCaa0d^P{dZsB^b z5^P*!VqI^9-Gc0KFMQ8Cid1Gi-zl!VaN?j{x2jN!s@A5^j1YZC&399O?mbs%0;Tq( zf{uEAZcIsWJkEN&G^XG#U0=0`RYKf|7Z- zHs-j;^AC5a_L3K9r!KST9!DQ(!jfxq!@;nKdDDwUd|QYHQ3pn<`--xgXlu5ZXe*vi zkFyfo_Jc$6@8)vqMG5gY5i|E`e?59<z|XGfYM z;Lg$yaiZ6uZ&#dDJ2Kln{EF|xGX7)qYs6Pchx)B2F$C?cJe(UWsaf6Jb4C~N-2Raw zeNQEPdb)(aU3B!biTb>x#qa9ETV3yeiU9)jW6?|%(PnuOvHbt~ugR*s4jqBBO9GfPhGFn_Uf?8-zlo)ZkGmMOym&oB=QCc`L}_#ufL(dUbiN~kXyn7 zx&9TvX!Q;3*D~(9Ao~7^P*mcB*+;hEvX?oGjrwN?&az+<63wC)Py&&2`oheK?%f;` zl_154hLR~;&uYJ3pBMS+#0{9{5VywD$q=SVkx8T|Lu6V+(r);R3YOc<#mZVC_KBNB z3MSSRt9qXYl9ZFE*By&3EA|r&F6?~R$G?o%{fl{x);(~2UA_RkBbE<`>e&GB zZjEiuIX{>cn5tQD{vyb}?%@i<-vSxlcUP8v4lpq>NYEotODf|mas8zt>v%Z(%wMJB ze*x^BWB816%LRVph#Yue&Opcc=`qIuou` zlq1Rqz*VpwOL&}|x}>M=5qTVQi^AHi~PX-IBe!J;UnbR0!RF6(0S1XR(PFfeM zbVPm9dr6TUwo9vg6}|~A*U|OT43dle4+4s(C{POfKL{wpzf2!Kz966)K7Xh>ginTh zZ03V)xA1I&-zPJ@Z9p&T9{C@V+!tpa0`0pSn^vwRyp@dQpp2ZQrWVhM#ZKh5>$-#% znL-8f^v(s@J?CCxHolt}ac%wJw>eab;lw88$!mF^``T$>0mSy3eqBKGv$$ojpftiZw*kTtYMF_17vj9OOVid$WVFeKDb}0op`Z9YCk)xnYlMUrTmt2{vZ`$04*w#qbyD9H1wZ?=7>T!N$RyCksOS+=g29;d5sZpW3` zR_62VyXg1Ai(A7*lCGa%PzjAY(E>WS86Z0?!qqCu%WIRZG`e1ViPON|9QVpt!qmV~ z5zEQDxBf2oe{}KE7{0*62#6z*X(>la`?Vtw_>iv98 zt5v*s0C@GnYUlSjr$L)sir;Tz^XTTi93$eLGA?m)$M zUz=u^+4$#$H`*OIU3HpJHxrY}^^aLtAp%mKjb3Eh^XtstjozBe`3>}HKR%YQ zj@%evSbYzS7jTFLGFjI$gSftE_Qu%qSpnnTxbDB83M@ntokq#>S z2;+nQv>f@)#lfe7!xH%D*{QN6pm_mfiwgOc-@Y*Embvr7S~D0}Je9dqDRqW$h4ggu z&-_l3#x7^!GHYuffF{*w9<{}ERXw>IvsyxTNTJ%RrM6ax1)6yAP; zZf5Uv`#50>zuKI55Mqv!KhILT6U`3=f&*!*@4WmZVSJXx=FbbY1zeW?FBLfde(7;> zN5tOKz1sooA#0zOhRx1aRjNaqztalsD9CKRFerX%1dk^ct-ScqS6rL)=s0v#1#kWb ztdzg}yYhEAlm~y#W!?w1^;&!lX$VHp-1;w}eSjoxkv+Py?R zoBCtShjST3@JDcntDMznGtOUFydIKMWBsBqpcgr>*{)Fye*=?OQWr1puxkOCFtw>F z`j8a<=^5Vs!W!>576bmS-CSJm#ip(5p4f`_EzV_u{2nAA_ywXQ3hPjIR+#N+AazAW zICc@J$an)3!drpwtWW)m0=@L0w_XO9a52-Ds%UrHKojRFtpy+hV*6bPc|)Nd?OB|d zOXT6NKi+`KcG|7n$$xFHg^L7lm!HrQRz#x(j78}A_Kj-m_1aB0#SYvZw!~5bCBV2j zTz~(;XL>dhZTBL64nQHko8I=$6^uUJ<~=_JfdyxU&7=k&`&}Vb^2U48ZW29;^HNWf zrHs$1Czq_F7#_0{^Uf1MEwZPm7E@umZ&ETkB{8p*lPW*k1gqS55ilQ99uDTp@QGZ# zI_`C(Xs5x|wCg%8?=itY+IR!?&2Pgy$cuT zx<^vE;;6;d%JeVh-1581ckC^^9L2&nfotEKo!A{mo(n$ctDV9+MA&hjmh=6?yjq4GnZ~cj;-a z-1l|e?=$b3XP7nfjZW60Iqce1^{ao?Ij2sYT`!#FL=MqZMvf{|gkd3)Ty^I)FZca{1RM!h~ixI0;>3`<~C60m$)J?ZJ`7kabk+f8orhNEIyt~7;V|5B^*P1PmlcP8D?MF zV18f6?7P9(I#xAUb!L={-bvY!8l{$2<`)o1dZt>3^*CFZn#w};d<}10t8~>%58U#} zDS&L6OYIovhU8cX@7@G zy6q+be`>-Ca?tEgWRB%&SZv&~^1SE!7dfXb;;=5J;VpC><*pIFV&m-%DC2mkll78Xa~c;uErFk2a(4csj8n+ZQF`Dd@E0z6MiYL-pHTCBRuK60+Nx4E{Wpwx|5fL6d!kkj6)O~uV$hrzpH5OzCAecx)#QQ zQR+GRHQQSo6D&G;hJSXt%qH&vX9F5HmH}p%yLrEK6D}8)S{WUve!tKHk+~VTA_Kd1 z)q7p1p#sAoc{O%`7r!etV-84u9*|78#btmI`&rCt>YH@i2V(|1`81W#xlZ`X2re{tYb?l1|k*Nh;O<5g@r8ojx3p z9g4m`i2X&rQ**OWwt{li(}l%-=qDM2dTHt4ED-1!*Qn!VAFy%WR{b-&k*Rf2gj(?_ zYHt^K<$wVeNy$C&s&!BpUC1Ae@gz)@^sDHqC=RqmVXBRd06H1mkI^modhdDe+2{3* zffk`wva|H_e+NNw`&obvzD9!uL9(%Hg0f9_q$pIRwh{`!_aRQ}5QWa8yR{5%n5}3V z2Twj*cbOqku@82`LfmcnXzzKbDKt=6@ASfj(K~TsxMHZ zBskcBif?@9jItmHe)Uir`{`@Q5j0!kc>X-gUZe0_y9hpg?eT`S{= zJr&e=((jy(!xWoUJRf58#7s-y_S^UFoOLF(K|1=tKG%MtSlO{arbE@T4Y(<~djEVu zGSs4$lYmkvW^<|7b}EX}ro+^S>DU-l=>-|(QU6XhesV0D)HW8%RIb7Pok4=>u44Rz z^e?S_*+)*k!hqN|AY}O{;)t>F=wu9Zb#W;iBl^Z?`249YwDKpoqFj4hC7$~H#TMm& z!U2YA|MP<^JW;R@ymI9&m4%5ItHFhbf3_cb3|?RH5)owiEa~XTjlb>csk3h>gjJOo zNrW!Qj6yjYlkdyh8d06mmPheij`J~x4Wv#>9mN+1uy5!g0Wbv|sWqTus6Gz$b9D3w+&e@k;w@$i^wtW?=fk zzoj4l#yg(j@`Ot5cuOY#_f(|fXgSfx2ZK8fi8TM48>+UQz#DHaL}gS>#1wxW2efJaPdRCYcI^U}<`#-pE_Q#rAOm6~PdoSy zq49Chz4zBVr)OJY=AyR&>Ao_z4o3&7dG?U)wDj^LvbBxfMat9)Ho@U+{W)^|J%e3Q z(q4aVgX}zaLhnOOt^u(vD!r~TCqhF~8@DuIxrMD+`StAi%&Q&dum%gXfS|l* zpzzw}EZ5^UPjP&!PRmF3Y=jSJFkg6W`24VK1aiU}_~I>qwBCQ4vE9!#1tR9>gau2@E8OXr7kB!^IntJoEZu(!k}e4RMugA551o9 zu0wl&0@ygi9dOyG2A5vc`2wfY2Vp6!ueU3nF!^PS`6Q(O7(1A}p6YK^7sAl}Ay%H6 z4giX3Z#ekDT+Nks*0TMbhkjUk!KQZh z=y{LEA@EE)tv7NV?LQ8mYO-8TbmOLliN*$vf~!TEr)}N>tvpM zZZTc!x|-{W%ls=_h1*TyyepchtroG^i(;4RW3s6?O{Hr~V>XrR<)@mjZmM330o^Fp z%d<2$o-W?~sr*!DOt|!-*r#Ev=^f3g+s=?^3GIQu?M0@|vdCI*RsiDvPhArZ zF2G@sTPghiPgAKxGE!%%|EmTByvJ>FjOdHqkI`;!Vsp(ID%uJwU?E*9O`u zvC?o7XCPK$WNIu?&#V z%cEe&#hMCXLoNrwQ{UKmf+U}<*X!dK1?$U2hYICFb&D1(4I@dh{YPnF9jz?ESX!vl zp+|YqV7jrjA!FWM)I9LIL$zvFV7`UGtEa1C{L6*W)QMZ{PBqUppHe^9=qU~Oc$bU`e1zHxEtCo>Op%!Rq(MjkA~ zpZ~-3vETQx+PY4Th8A5jKY6d%7iK>$il?4_ zOPy~X8hP&G5-|TvtqAL|{8O74s`_kA<{Z;h@;AU?wkV*@KiR1(B`*rE=(-=^f59|m z32_^!EV}sQ>_5CGo(SE$POjP(7$9-7elE9RGtR6)0bROaTKe(b?u|CRXB<>)J*zFD zK&0>6Gjd&2D(J?MN37#L|8o{#=CCuQ0$dwmtF*AundSvf-xg^Vqa^JH(#wF9x$ z@}c2tn`X@cvDy(~p3S4()?n@xfiJh7L)XbZM{{P;+a_nL#+To~>ktP@W0&`os%P?S zBQ=FUMaw;tlIw}qrRS*=4SGdi+@Ad^dvm7YGyi(7>Y(Aro>$ZRtflk|G2W%6HjRP( zrNMCSO^qzeN?F;>Wg)RO3B$ivuoWaQdY#JYYn%u}nMB zuMYxBFC-#g^W!?sEJ=VI-nQ17PSTmOnpJr|`d`%Zv z6+qfdg|;F5(^LNaEr9&HUF84Cun?YZnB1f?kc*Dn1P8}SX{D~^s->hTXyRbUYGmqQ zY{u$o=lEA9!eX9|MkY39t`x>*7FPBmRC`TrR1{XGB2=0@O6*FGQf8J`a^B8nYTnA~ zCf+tC0;W`AqUge&f-nbmX0ApQo_4nOE`pvSRDbyugnhp|%tl4=mx-&52$jTLh7?*# zuPLM)oXseBSlL-j*m>D0csW=(xVZWF_?Rg;**VzR*g4raI9WLO1i3f`+1V-n^`R0) zhkX-vHZ>P~BQ5){>|no%P+7XVItsF}d3boRdT_BiI9srB2nYz=x#8qwfmyJ)c-gxe zd9v8MQ2%lAZ$HvzE+)=aj;>Y?_7r!1jf@@KTt%p;?lSuO^RIf@IsToIz01GY!6>qM z8ac9Yu(GrL?HQI(7{)|U%Gu1w)xlZa!NFGaPt9emoXtEOoNZhvq||sQIAEz@|G4?N zDKxF@O&vU3gxUUUx_=7tk4rOYBUdv~7${yAc5W69esvB`K@JWl8Nzgo)Fgw4#> z%+Ac-)dhx;VM z1ny=0psoj8_abmF;|Fy;;JO!qdl^5d>jBrj2;9r~L0u2H?nU5U#t-Uxz;!PI_cDG^ z*8{G55xAG}gSsAY-HX7zj33nXfa_ia?q&R-t_NKAB5*I`2X#H*x)*_a89%7&0oT0< z+{^euT@SeKMc`h>59)frbuR+#Rx*l-di@?2%|Cj1Q|L46AGke&} z9v-l_I$lcGg5cmN;N+zx)bBzf`nb}*^n-{^ESzoL_(z%df=7wP=sriI(9HzPx%*Lq z-pQ>zMO;Rju0aVaQAxlIc9(jFp!FmU8x=)LtFz0T`^S4Y<$Zqf?YKmWY++Z)*TPg) zEOVqeM%QTv&Bu+6vHs(?qbyf3>jn#rXQzJhCju{13f}6!)z^P}vttO|)RcS`(QD!9 z&5X_sClr_p-xQ#UAok=joLxJoBgr}ZKAI!?ITlEpf~OiP*LcV?WywtvEt@l1NLAYi zN0vnfiw+og)6VXQ+`7MmpcC-qGeI~4AqdXu9kLeEO1q3N<@IBBL`6gluB%w))aqTy zaA))K(Z76DGt49)czSx5;7nuAqc!6!t<0giBF5uZ)dpg;Yx_p-2e(VL|M+BPqD;UB67=pvay=`)cR*PwdQ?ou4j=tYin4BS6_<#kBlr17Gqd6E%Ka zNjNN(*r(?~XR;uRK)(Rh4o1)RM<9p&(oQIMH8fn)I{!a>=M&xe_6d+`A8u#*ruRJH zWuOC`Vb%=5v^6Q}JKW@-+B0M*F$ExcgpmfG!J!uGekz&A@_po4p;d>*62S8p9!qo! zHFVJOMkO6c19Wqa^V~XFtzEyp1%`nJT|^t>-5o%yF6ycUu84`V zD1dDEUM4jHC9UyNI1~e{YdY*wcbNfcME_@CKJ_N5zi8OXzzQMZ3!f1wL$N-j%%Ywz zn_f|<01qoeE#f(Od-6n?!p9lpX8L-AKUGUM%b1@uWbxlhYt%*J6BaQ?r~`YvDsHSP zLVI#s{)s@f z8Xm#77&_BURq<95PgJ)z9yr&UZ;m71hXPs>+r>iP6iK3!lRQO!0>?+-IP%!BE{m9# zucM#?&vu&>)vkyePfLm#V>KHhwlkz`x61g&WjqI? zdn?eUSpN~hkob9iUUXQP#38xlR%0N|aCe^t-Tru{lm^f2JS%5GT_h-Hh%z1ryfL z&@FY*zRk^wlo{?4=U13pp0KO}?&S85ndvXXc<08)qv2585yT#)O_a&8(zLEk#qE>- z;K~*L1f4j;XwKR5ZgsyUZvbDECsaLm*IG!E1j!M7*(EeuF@!3EHaPV=osOkwU4u|h zFM(1RBirK<*5fbL$f|r_O`X*XtGi_lEOS2F>O$&b8>=`Tu+o`wUCmrG%gFY*ZKp)`EbKo>&`uPrZP-wJnxW&F(`xdMlWx>V; zn)ybo=%~cGr6Mh7<&=)i*=R!I)fLB9dH(toEqJfidd_EQ%x-R;75v-c`_-|}Zq+7# zqP5HW+Dy_o>g8=a*XrlJ0FmiySlC#u!jbl^>A}fz&AnNEwokr~iocok5dwd`)!!&J z-ss~y|1ncAi#9f4>n$SKstQ*$J~^u(h*KzV6hvRJU;AE`@L=y~0aokWR~^Y@s9u}6 zvH-Gz$9{R!z68KeT6<%!x9gc#W)S_MpZdxHsz*oWo^gUu&TPwvA#x!6U3iIwuVgp>_=?({DLR-GX~twf}Bw+ zBnQB_4SJRw{s^2@zQZW{W+jHm9nqCs;X%mIgm zyY=_SCnRi~+0M}gKZ|;W3FfyRjT6GVfq>L}+EUb5IdrVX>h90l$0xbItc*v(?IM+ZbEmDMJYZ=<=r}q> zCY)f(1QWWhUoQ_ql^Whu0`a7vdl|Mqr&+bP7Pf@w?&Kal15TaWPK z{ZL0sgtX3^4CNKTd*Rky&&Pn3aE4XY?GK}`O1SlX!WqK$&^y@|qGyAhsg2RCtQ&SZ z^UVnbLci~S)2plrUne{-}qgs3S#P8OLnyjA#!$sW(w@stL;ZZZ z*q1|`Z%Z+^p2B1$$b{d0`^3gF#FwhR8`Vr=Ty-w=JrB3@yPJYZ#&OD$P|YuOHyXe3 z?$oF=J0^ zkX+~1`o8kk@UuR*3rCHl&a9TiQCX-k7l)&8Dn^8v&JfCC87NcP>Bi&8@XHpmxCp445}K7TA8`eyz)&WfSnw@5*LUC zjy|E;XJ^leJG}&P{qp``mDuxnJ}ek&2=vW5GLcF8C@<2wyDmlid_G3WXjTsr>9nDZgE5O+A1Tt&!uQg z^S%;uSMHo;PnX&Pg$Zdz-M9_IJ5K$_UXV||#c!)0btxKCjvIA;%=`d5178K0pl`5! zqzS5Xo@09w27; z>A;1a?NOeymOQUpcHzD-&$qPQWaJU@=jbWI1h0m3$S#k}A<7o+ulTFg5InObFPABX zv{@NBZXpC?R8jEAV{I*A`!&~ZI>cpEV6UpWGH5vjViHELS5!L_T6=c zWC_Oxr^mVms#L^^q4Up zV`rEZC~g4eC%u|*hn?huJCsF?*s}_R_mLg*#U=}l7bC?-WY`0-jBArOQ&n^9G#Q>? z#}JghRv(=IEvoV+|9M`mTsE<~B2lk!9u+&emPa;LPVEyAT;3I8s^AmrMllB-7^S9Q zq8wkUQ#kF*Gs34(vm7$!cAvmnV--R)MMc|jC1_~ypOZjKQWcM4iCI-ZG z@&XPyLb($u*VI^02!1K0ypj9are2bhIu8NSYV;6LX-L;hsvYweCf+s^sCqGcAn+7U z{DFJ8G(H{-cPsxYywuwGok=yQbc}pM8jXLC6)`BhB8jFVusv=+!;ef?@LFey^kRW& zQMqoSSJFE)L=kzEj8z6M24ak!xHzed>z<$@dP(HFirN>K)i+p+iEHO@i0mwJnfm0~ zz38R-l2%uL0W;`l(CF85q1Lj0PED62+=(m!~}%$Y{OhdM|unF?dPX; zN0FK3%imkt86d(qQ5m<5pqCEp*wP_CU>73D9?7G-Q-@yy>&7g;SI22lGT2dd4v@5T zoC-fiS}5I-168Zs5@dT`+vJWtnX;Xe0*jLx6o0+wcy<_oN}BosTa8&*b^xZ#QH_*e#Wa->rj^$S z^muC5OHMCPM>ekM5w8S`pJZ4YX47H7E;m|-EV>9u{`3$hbS<*=t7~+P7JQ%phThco zM4-XNVDlFn;yI^j!kyJv_m;4(8wV=obVw$$xN(UMx)d=n+K52pv}beEl|}v52VH~% zQhKs_k&?QrR}ArQjM0M^C!c6!(7ZHn>)82~Z9&`8d0Gaa?%@jN`Q%xKq~f=xi(>zi zHScRL2a>^R*m z_yuD`p4zSfv9?g!vOQk`dA^>WWAw-(f=24n`PLnl=He}H*o6=4v=gUHMTCTOS~Ez` zRF%$47h-b`s;wJ+ZiVUVZ^!I=(6s2zl-G@oA~L)q$8a$;kLY_`35~Q9()-0Frv{+s zv4v<{UTlqb+s>BAozD!M0Ni^mBk;4+dz&iKV^d%Dh z{t-()rV;CkA2O$Qta`v6ZstbaS;x@61(zjIVys`NI%mi3NGA7*hj?{hl1zgL5)oq@ zu2lYf$_i&8BW$EQ>ezcjh*DTV3Qc_7y3h5RRMhFuQRh1SytEvCV-PJT&5Mae zzQZfc=EUci`pk_^D+Zi(=RLH>>8^F(t5#^v&$p+}_uCevsBj?P7MUztzmm@29)vm^ zq!@~Q5207$TMMBKfDruZk$iz6d25=JW>}O#b6u(m+XQK@Ox?NEpp1d3;wzSyz%-+u zu>psENt7E}pbTsnlvX&guU#9Bc z2wv;n!H-mah8^A>#Jq2EIXh-XNl*Z^g&@u?b$-dpUjAC$nG-=?wM|!Fx)*)D7~?TU zwDXRVfS%!32QP6d_!W^_x+{0h3dngX=j`CB+OWe-uWaU&^XpBfrxF6t2|fBW?nEa( z3o^6&O8)7^5L3QdWrDpNJO}R?a;qF;;{Glt+XtQQSa8$ru*QZGA9MCMLA$1eN1{FE zk>w;B{6)TnI^2x6plRd3D){3_9XXBdI0U;-V))cT$;h_yz>wG45N>X_IV5DLQZ+=J zf?e*_rzFTeY*(FYSK#0mcwFVqvme9G2GVJ{xqC$O=DdfuJE&f2SH*I2pX%IW_Lno; ze$c)cphU}PaoN282|UE8M%myn_+lR@eC+upBJeaiM8R=YC#`3z#{ zv_?j=(10heBZHV0~U&khMEa`0DjhP?vKtIEgIki{4KEfKlSQfBY zh2KzZ$h_@sy6Q7?j@26UB&BHRo9YqaJGLERN;{9I@*40A@t$%dLuk+A3H`CNA;HjF zvt7TH@{WMA6kbIm(2s5Zx)gSKFJ7XtLA|N^V8f+Ty0XaKca#l^V@h}&RSwR}o~)8+ z-a0~Y?^k29nzLg?E(=O#<;$K=OLd70*(btVVLeSbCqT#z{N7^5wlkERMfv%*V$KdW zP$s=rZeUh0tAT^;hp7>^Q(pX6=eVe>LxkukriXl#zV`s7lYcD+cx$2C|x zrs(^eaV18mBnfKbhmCKe*^xjo*6vnMDyFnMN?{0=#;glN-a>2~hNW={?xh4T- zTHBRATKq04u|wC70G!Y|&-~BDc?2Q#w$+h5ibg9dm7rdEA1hXGrv(1A&XAIosUwy) zyXR;Mj=)5$gM*oJY?acg0w2`TR^AL*MBt-t2Q6ZR5NW}Ys?_f)p-DEBlUcg3Iju(o zs;NDxg?fRtk(tN4NTQkaN~n&WHyxP1he;!BK{_@~uha-4O&zn}%7l&8qs5m_(lc_X z6tzzGRy|Y0d6M|y0`fK2={5L9fc%Itf^$nRKy1r&dEya4a!=IOmHFG=HXiOOAZ!l6 z7Be~uRV?RZn@{hE72BDCgWf0IFs?Q%+=7bp64n;lr+~PF+`sMZs5hqPug;}>_q$WI6#E)# zE%=5JZ|R7p%g7HXk-GM1-5m8yXZ<8t^CT?7P${H%(%NmECKQd>BZ{|};SG@*)n;97<5+eq|?#N9$K4vm9CP-t} z>C=9sfch~K^$`q`p{&EYc2~QpIr9XFtSmb6;LTi<>{a(?*r~NF&b}&btGruy4K{5G zyT{;KB_g_;OdR2{v3CT%C8SBdq~ep<0DmUDbm8z@L$W@*wKtfZmdkrwxYA1=n5Vzi zNXIo2kz6clb5Y(_&=J|=?|bOQ;-S_OS|IV#3J0M zzdB0*P(AO?)-#qFFTy@m?bdDP5^|GV4y>CaA$jU%UO+ebJiFb2FBx^IAP7~S1FIc2 zD}*npYNsh5boE`%=u<>U&q85j%oEUy03PlHCZ(vcIU$Xei;EZeD%&XPzH@t@J*(UK z*D?#*+m>Du9E#wCZz;p#GrpJzBJJfb487G;G!%$Q?^q^;waxI?Z?np<9@c5hE!F+a z*Gb@M38gl53X_qXDJfK-$D!Q^)=YTXS&2MK!%gD3S=z7U=R|3LDWk)w>9yX>l8}Mq z=gouPFY>y3IP}%3J@dL2ZS~%4(#n^2Fd@xK;^(|tcTRojz3(JUq(1U8T@;Ecs<0M!BO{bQe@Fm4Yt8<3 znO$)R>(q$-J&eK!(3?M^J-_Nrn*-pXaw3`N1_`&)Ol6qlRX``R`|$|g<_ z1&X{d*aMn2N4$$i1o(`uPGd4ac*hpkxl0PLHi&nYRtRyuBfo7y99bs5x5Sf>%C+&f9?I)S*k)anksR)L}vZ z(wjMRh~EuAPUum@NzC70+#C(j3HWNvGo!y96b;%jq7W-U z7}OIOFlcWB8YLON(cKb-Pcq6HxPA#LFSlk75c| zt{VCFtq)K?9tu}Wq=u2TbMsTb=0Fe2=wrhI#iXMj&NlZWlG+*tdT^-Gk{|V^SoRkdP6v9`dnRd>4DvFosCB=T4 zapT3aKBiIkWYa1gWYkG0v6=S_L%^TITdgWdR#`eKT2xoBpI%eZD-3^rf9dii3RgMP z0*zi$r9lhHSew`Q14EWrHrSH`ET(C&RaDoiPL6Os?jRP|e%i`_w-M>gvoj@_O+eh< z;}K>VF~Wn#MJSeyS1J`v&Kf06k#Ti|R zoAtn+YU~avW3EItO45HyJWq_W{#~AEEBx+lx79j5X>!C)&tXu+>%1~je?n*25dOio z8fLU;lL>qJh^#zhRHsil#I!EBP1rDR{belQtDF|wAS_Vi+)wYV zFU!gj_(Y@N^=3_sbrk(u$r{{bm#l&Msd5&Iy~J~j6BL3ThrGTHTJ<8a;)D|tuE$S8 z=ZS*8m%~mQPnd=(VUG}u%K#{C_Irq@u*tz3+Qy+I@JGkA=&RmJ=GFn8*f;^+utJ_w z|E{D~oSNGLfuHu;nbG~cg7 zLnFUi3$T?14FWgng|mTIaB%1{OYO8$I$BhOyLV#e@9woel>) zG-gI9&F%(mUv(z%L;m|S;DT#8CdI&u=IVGHC`anMbfop-if^^%k7i2}2bboF_UWk? z4BV7KBwTW*l^l*Dk zZTIGsODW2`XLHk6(W5t<8@`ja4!&-tK0;L16m}m)SRHwp5slK*26>r)hM*rV^fNP+ z(OA&)CQqQ71MIqxxj`e3oyAC>+TA!x3GP}F*efM{-9p=il;If0W(<4a= zDuj=x71@TJ`mb&yM=ftI!F(#d&^(%Cf`2~*{}g!X6bQF&pOu!9f1Z*mCo~d@G?u(s zh7Gzx6k;{_B)>IcP_{w7y1j`k%I<=Nr*ey#!v5RdfqFUrVs+c_a1MGZ!%9ckPzH$0 z-^r|3qT}4T^lvkp%<9CI(_GP$1JRDva`)76_LTqiaGoSOpMUce93nC1Ie5__34yXA!?_f6h;Jyz6_Skti>EFg@k9f3X*TXxr+2*yOu%P#&+CS6}84 zx4!tqv^vmr{!qrJzZ+XliUMpkpN#+JgFsHl<=i3Bzt$;KUld(LvrqnVvV)!xW_d0H z^LB2vF1J4rMC%Y^;^ewc=u=MmddyLCKh506PT*32TU5X})p zb`!NpjH5z^&^Oj-WV_GPCkREZe`6X7x7_0IApX7j!VQ7|zkhd_kY~Snq#S^$rF6lTOYryR?_Lti9vjYfcf%^;R1C4pbVGoqv7uIv zzLJqvZ!-=@Ym(Bn^`Dg>mLGChk=fyzNNx?ZR#+b=?7j&)Zs5w7Xp0YK<+zLJQZUwl~yoUJVJ7eeF0T>Sg%w4(N6hj%%kn6i67AkH-1D`+}w5 zQ($+wMR2IA@R)_BBWqa@oDs=ccx`?Ty}?c22_)z4X*bNdTGx0UmLr`HIln6{*%`>w zA?}T_I}gr=m4q~lm~}9oUiOC=o{&9FCJ|GC7P86od0e!?knh1hqRN-Xooq{-w}iol zSxpj0{W`Z%1lKlXx1A;Fxc{@1W*{G@9nL3~ zoJ8`_iN>Mx1c@$fI9f|YDcrLAOgPTKjJLX98ryc#hytnqd$fyaU{m^WXoFP%Xb#Oj zTgcH>LqPYRwKV2xk6`sXBPT)fM_je5=ayG7=GIBu!6deehBf3E<_fY8ZrmmgHM#^G z@hztmB{qsD1Cax5L{n0yf*_hyfIMzDBv1wTTv*WXHO@ap9LmRo6>(2&JOtE6?bUYN zTiKB{9UHYh+2VE7z#IA!BNn@FPRx*IW_l7B?yi)DSt~IU)Lxf@z1#%k2W3UyH z2jxX#L-0#Hy4e3n#@nl%*+8im@nb5JNM1mqsW3ID{4(2bSS`BZ{GS<#9tSQbEKWu%S^H%a+Kh zN$zFP&IPHB99H1|4S=Pq2ZSShK+%sHSOmkR(8~Hx>slzFffP>{0l#_L*$~7+K_oQK z$9$|LGPI7&*!PKwo_4hP6~Hze<%VQ~v$vqSt@Y)V`#=I_Dlhc&mo#U?3% DrB+jm literal 0 HcmV?d00001 diff --git a/lib/models/args_load_init_model.dart b/lib/models/args_load_init_model.dart index be7dfa1..6c49c14 100644 --- a/lib/models/args_load_init_model.dart +++ b/lib/models/args_load_init_model.dart @@ -1,13 +1,15 @@ +import 'city_load_model.dart'; + class ArgsLoadInitModel{ String mode; - String city; + CityLoadModel model; String user; String password; String urlAPI; ArgsLoadInitModel({ required this.mode, - required this.city, + required this.model, required this.user, required this.password, required this.urlAPI, diff --git a/lib/models/city_load_model.dart b/lib/models/city_load_model.dart new file mode 100644 index 0000000..a1007cd --- /dev/null +++ b/lib/models/city_load_model.dart @@ -0,0 +1,15 @@ +class CityLoadModel{ + int codCity; + String nameCityApi; + String nameCityFront; + String codState; + int codCityIbge; + + CityLoadModel({ + required this.codCity, + required this.nameCityApi, + required this.nameCityFront, + required this.codState, + required this.codCityIbge, +}); +} \ No newline at end of file diff --git a/lib/screens/load_init_screen.dart b/lib/screens/load_init_screen.dart index 1ccc461..2bbfc38 100644 --- a/lib/screens/load_init_screen.dart +++ b/lib/screens/load_init_screen.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:rkm/screens/sync_unit_screen.dart'; import 'package:rkm/utils/color_palette.dart'; import 'package:rkm/widgets/alert_dialog_default.dart'; +import 'package:rkm/widgets/button_default.dart'; import 'package:rkm/widgets/text_default.dart'; import '../models/args_load_init_model.dart'; import '../service/api/api_data.dart'; import '../service/db/db_sqlite.dart'; -import '../utils/const_variable.dart'; class LoadInitScreen extends StatefulWidget { ArgsLoadInitModel args; @@ -21,20 +22,12 @@ class LoadInitScreen extends StatefulWidget { class _LoadInitScreenState extends State { String messageSteps = 'Aguarde ...'; + bool finish = false; @override void initState() { super.initState(); - // initLoading(); - finishLoad(); - } - - finishLoad()async{ - await ApiData().loadCompetencia(widget.args).then((value)async{ - await DbSqlite().saveCompetence(value,widget.args).then((value)async{ - Navigator.pushReplacementNamed(context, '/home'); - }); - }); + initLoading(); } initLoading()async{ @@ -105,7 +98,10 @@ class _LoadInitScreenState extends State { print('loadEquipeComponentes'); await DbSqlite().saveTeamComponents(value).then((value)async{ print('finalizou saveTeamComponents'); - finishLoad(); + setState(() { + finish = true; + }); + // Navigator.pushReplacementNamed(context, '/home'); }); }); }); @@ -147,12 +143,34 @@ class _LoadInitScreenState extends State { width: width, height: height*0.05, color: ColorPalette.appBar, - padding: EdgeInsets.all(10), - child: TextDefault( - text: messageSteps, - color: ColorPalette.white, - maxLines: 2, - ), + child: finish + ?Row( + children: [ + Spacer(), + ButtonDefault( + onPressed: (){ + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => SyncUnitScreen(args: widget.args)), + ); + }, + title: 'Continuar', + width: width*0.3, + height: height*0.1, + textColor: ColorPalette.white, + background: ColorPalette.appBar, + borderColor: ColorPalette.appBar, + ), + ], + ) + :Padding( + padding: const EdgeInsets.all(10.0), + child: TextDefault( + text: messageSteps, + color: ColorPalette.white, + maxLines: 2, + ), + ), ), body: Container( padding: EdgeInsets.all(50), @@ -166,7 +184,12 @@ class _LoadInitScreenState extends State { ), ) ), - child: ListView( + child: finish?ListView( + children: [ + Image.asset('assets/images/logo.PNG',width: width*0.3,height: height*0.2,), + Image.asset('assets/images/load-done.png',width: width*0.9,height: height*0.2,), + ], + ):ListView( children: [ Image.asset('assets/images/logo.PNG',width: width*0.2,height: height*0.1,), SizedBox(height: height*0.1), diff --git a/lib/screens/login_screen.dart b/lib/screens/login_load_screen.dart similarity index 72% rename from lib/screens/login_screen.dart rename to lib/screens/login_load_screen.dart index 751f79e..0a7bf48 100644 --- a/lib/screens/login_screen.dart +++ b/lib/screens/login_load_screen.dart @@ -1,6 +1,4 @@ -import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; import 'package:rkm/models/args_load_init_model.dart'; import 'package:rkm/service/api/url_api_const.dart'; import 'package:rkm/utils/color_palette.dart'; @@ -9,17 +7,18 @@ import 'package:rkm/widgets/button_default.dart'; import 'package:rkm/widgets/dropdown_button_city.dart'; import 'package:rkm/widgets/input_text.dart'; import 'package:rkm/widgets/text_default.dart'; +import '../models/city_load_model.dart'; import '../service/api/api_data.dart'; import '../service/api/encrypt_password.dart'; import 'load_init_screen.dart'; -class LoginScreen extends StatefulWidget { - const LoginScreen({Key? key}) : super(key: key); +class LoginLoadScreen extends StatefulWidget { + const LoginLoadScreen({Key? key}) : super(key: key); @override - State createState() => _LoginScreenState(); + State createState() => _LoginLoadScreenState(); } -class _LoginScreenState extends State { +class _LoginLoadScreenState extends State { var inputUser = TextEditingController(); var inputPassword = TextEditingController(); @@ -33,45 +32,56 @@ class _LoginScreenState extends State { bool loading = false; checkLogin()async{ + CityLoadModel? model; + ArgsLoadInitModel? args; if(inputUser.text.isNotEmpty && inputPassword.text.isNotEmpty && inputUser.text.length>3 && inputPassword.text.length>3){ if(selectCity!=null){ setState(() { error = ''; loading = true; - }); - ArgsLoadInitModel args = ArgsLoadInitModel( - mode: mode, - city: selectCity!, - user: inputUser.text, - password: inputPassword.text, - urlAPI: urlAPI - ); - await ApiData().apiConect(args).then((response) async { - if(inputUser.text == inputPassword.text || response['bloqueio']==1){ - setState(() { - error = 'Usuário bloqueado/senha incorreta'; - }); - }else if(response['status']==0) { - setState(() { - error = 'Usuário não encontrado'; - }); - }else if(response['status']==1) { - setState((){ - error = ''; - }); - //verificar se a criptografia identificou se a senha está correta - if(EncryptPassword().encrypt(inputPassword.text,response['userPass']) == response['userPass']){ - // print(EncryptPassword().encrypt(inputPassword.text,response['userPass'])); - setState(() { - loading = false; - }); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => LoadInitScreen(args: args)), - ); + for(int i=0;ConstVariable().itensCity.length > i;i++){ + if(ConstVariable().itensCity[i].nameCityFront == selectCity!){ + model = ConstVariable().itensCity[i]; } } + }); + if(model!=null){ + args = ArgsLoadInitModel( + mode: mode, + model:model!, + user: inputUser.text, + password: inputPassword.text, + urlAPI: urlAPI + ); + } + if(args!=null){ + await ApiData().apiConect(args!).then((response) async { + if(inputUser.text == inputPassword.text || response['bloqueio']==1){ + setState(() { + error = 'Usuário bloqueado/senha incorreta'; + }); + }else if(response['status']==0) { + setState(() { + error = 'Usuário não encontrado'; + }); + }else if(response['status']==1) { + setState((){ + error = ''; + }); + //verificar se a criptografia identificou se a senha está correta + if(EncryptPassword().encrypt(inputPassword.text,response['userPass']) == response['userPass']){ + // print(EncryptPassword().encrypt(inputPassword.text,response['userPass'])); + setState(() { + loading = false; + }); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => LoadInitScreen(args: args!)), + ); + } + } }); + } }else{ setState(() { error = 'Selecione sua cidade'; @@ -84,14 +94,6 @@ class _LoginScreenState extends State { } } - @override - void initState() { - super.initState(); - setState(() { - now = DateFormat('dd/MM/yyyy kk:mm:ss').format(DateTime.now()); - }); - } - @override Widget build(BuildContext context) { @@ -103,15 +105,6 @@ class _LoginScreenState extends State { centerTitle: true, title: TextDefault(text: 'RKM AB - Carga Inicial',fontSize: ConstVariable().fontSizeTitleAppBar,color: ColorPalette.white), ), - // bottomSheet: Container( - // color: ColorPalette.secundary, - // padding: EdgeInsets.all(8.0), - // child: TextDefault( - // text: 'Última sincronização $now', - // fontSize: 15, - // color: ColorPalette.gray, - // ), - // ), body: SingleChildScrollView( child: Container( padding: EdgeInsets.only(top: height*0.2), @@ -148,8 +141,9 @@ class _LoginScreenState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - CircularProgressIndicator(), - TextDefault(text: 'Carregando dados...',color: ColorPalette.black54,) + Image.asset('assets/images/loading.gif'), + SizedBox(height: 10), + TextDefault(text: 'Carregando dados...',color: ColorPalette.black54,fontSize: 20,fontWeigth: FontWeight.bold,) ], ), ):Form( diff --git a/lib/screens/login_saved_screen.dart b/lib/screens/login_saved_screen.dart new file mode 100644 index 0000000..a6b9d26 --- /dev/null +++ b/lib/screens/login_saved_screen.dart @@ -0,0 +1,235 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:rkm/models/args_load_init_model.dart'; +import 'package:rkm/service/api/url_api_const.dart'; +import 'package:rkm/service/db/db_sqlite.dart'; +import 'package:rkm/utils/color_palette.dart'; +import 'package:rkm/utils/const_variable.dart'; +import 'package:rkm/widgets/button_default.dart'; +import 'package:rkm/widgets/dropdown_button_city.dart'; +import 'package:rkm/widgets/input_text.dart'; +import 'package:rkm/widgets/text_default.dart'; +import 'package:sqflite/sqflite.dart'; +import '../models/city_load_model.dart'; +import '../service/api/api_data.dart'; +import '../service/api/encrypt_password.dart'; +import 'load_init_screen.dart'; +class LoginSavedScreen extends StatefulWidget { + List listControl; + + LoginSavedScreen({ + required this.listControl +}); + + @override + State createState() => _LoginSavedScreenState(); +} + +class _LoginSavedScreenState extends State { + + var inputUser = TextEditingController(); + var inputPassword = TextEditingController(); + String error = ''; + String? now; + String? selectCity; + bool validatorDropDown= false; + int contLogo = 0; + String mode = 'homologacao'; + String urlAPI = UrlApiConst.ModeHomologacao; + bool loading = false; + + checkLogin()async{ + CityLoadModel? model; + ArgsLoadInitModel? args; + if(inputUser.text.isNotEmpty && inputPassword.text.isNotEmpty && inputUser.text.length>3 && inputPassword.text.length>3){ + if(selectCity!=null){ + setState(() { + error = ''; + loading = true; + for(int i=0;ConstVariable().itensCity.length > i;i++){ + if(ConstVariable().itensCity[i].nameCityFront == selectCity!){ + model = ConstVariable().itensCity[i]; + } + } + }); + if(model!=null){ + args = ArgsLoadInitModel( + mode: mode, + model:model!, + user: inputUser.text, + password: inputPassword.text, + urlAPI: urlAPI + ); + } + if(args!=null){ + await ApiData().apiConect(args!).then((response) async { + if(inputUser.text == inputPassword.text || response['bloqueio']==1){ + setState(() { + error = 'Usuário bloqueado/senha incorreta'; + }); + }else if(response['status']==0) { + setState(() { + error = 'Usuário não encontrado'; + }); + }else if(response['status']==1) { + setState((){ + error = ''; + }); + //verificar se a criptografia identificou se a senha está correta + if(EncryptPassword().encrypt(inputPassword.text,response['userPass']) == response['userPass']){ + // print(EncryptPassword().encrypt(inputPassword.text,response['userPass'])); + setState(() { + loading = false; + }); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => LoadInitScreen(args: args!)), + ); + } + } + }); + } + }else{ + setState(() { + error = 'Selecione sua cidade'; + }); + } + }else{ + setState(() { + error = 'Usuário/senha inválido(s)'; + }); + } + } + + @override + void initState() { + super.initState(); + setState(() { + if(widget.listControl.length!=0){ + mode = widget.listControl[0]['AMBIENTE']; + } + }); + } + + @override + Widget build(BuildContext context) { + + double width = MediaQuery.of(context).size.width; + double height = MediaQuery.of(context).size.height; + + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: TextDefault(text: 'RKM AB - Carga Inicial',fontSize: ConstVariable().fontSizeTitleAppBar,color: ColorPalette.white), + ), + body: SingleChildScrollView( + child: Container( + padding: EdgeInsets.only(top: height*0.1), + width: width, + height: height, + decoration: ConstVariable().backgroundGradient, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset('assets/images/logo.PNG',width: width*0.4), + mode == 'homologacao'?Image.asset('assets/images/homologacao.png',width: width*0.4):Container(), + mode == 'desenvolvimento'?Image.asset('assets/images/desenvolvimento.png',width: width*0.4):Container(), + SizedBox(height: 10), + loading?Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image.asset('assets/images/loading.gif'), + SizedBox(height: 10), + TextDefault(text: 'Carregando dados...',color: ColorPalette.black54,fontSize: 20,fontWeigth: FontWeight.bold,) + ], + ), + ):Form( + autovalidateMode: AutovalidateMode.onUserInteraction, + child: Container( + width: width*0.6, + height: height*0.2, + child: ListView( + children: [ + InputText( + hint: 'Usuário', + label: inputUser.text.isNotEmpty?'':'Usuário', + error: 'Campo obrigatório', + controller: inputUser, + width: width*0.6, + colorBorder: Colors.white, + onChanged: (v)=>setState((){}), + ), + InputText( + hint: 'Senha', + label: inputPassword.text.isNotEmpty?'':'Senha', + error: 'Campo obrigatório', + obscure: true, + controller: inputPassword, + width: width*0.6, + colorBorder: Colors.white, + onChanged: (v)=>setState((){}), + ), + ], + ), + ), + ), + loading?Container():ButtonDefault( + onPressed: ()=>checkLogin(), + title: 'Entrar', + width: width*0.6, + ), + SizedBox(height: 10), + TextDefault(text: error,color: ColorPalette.red), + widget.listControl.length==0?Container():Container( + width: width*0.6, + child: TextDefault( + text: 'Última sincronização: '+DateFormat('dd/MM/yyyy kk:mm:ss').format(DateTime.parse(widget.listControl[0]['ULTIMA_SINCRONIZACAO'])), + fontWeigth: FontWeight.bold, + color: Colors.black, + textAlign: TextAlign.center, + maxLines: 2, + ), + ), + widget.listControl.length==0?Container():Container( + padding: EdgeInsets.symmetric(vertical: 5), + width: width*0.6, + child: TextDefault( + text: 'Unidade: '+widget.listControl[0]['UNIDADE'].toString(), + fontWeigth: FontWeight.bold, + color: Colors.black, + textAlign: TextAlign.center, + maxLines: 2, + ), + ), + widget.listControl.length==0?Container():Container( + padding: EdgeInsets.symmetric(vertical: 5), + width: width*0.6, + child: TextDefault( + text: 'Competência: '+widget.listControl[0]['COMPETENCIA'].toString(), + fontWeigth: FontWeight.bold, + color: Colors.black, + textAlign: TextAlign.center, + maxLines: 2, + ), + ), + widget.listControl.length==0?Container():Container( + padding: EdgeInsets.symmetric(vertical: 5), + width: width*0.6, + child: TextDefault( + text: 'Área: '+widget.listControl[0]['AREA'].toString(), + fontWeigth: FontWeight.bold, + color: Colors.black, + textAlign: TextAlign.center, + maxLines: 2, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/screens/registers_citizen/register_citizen_screen.dart b/lib/screens/registers_citizen/register_citizen_screen.dart index ea30513..6900717 100644 --- a/lib/screens/registers_citizen/register_citizen_screen.dart +++ b/lib/screens/registers_citizen/register_citizen_screen.dart @@ -297,13 +297,13 @@ class _RegisterCitizenScreenState extends State { child: ListTile( onTap: (){ setState(() { - cityBirthController.text = ConstVariable().itensCity[index]; + cityBirthController.text = ConstVariable().itensCity[index].nameCityFront; Navigator.pop(context); }); }, title: TextDefault( color: ColorPalette.black54, - text: ConstVariable().itensCity[index], + text: ConstVariable().itensCity[index].nameCityFront, fontSize: 16, maxLines: 2, ), @@ -572,14 +572,14 @@ class _RegisterCitizenScreenState extends State { child: ListTile( onTap: (){ setState(() { - cityController.text = ConstVariable().itensCity[index]; - codIBGEController.text = '353870'; + cityController.text = ConstVariable().itensCity[index].nameCityFront; + codIBGEController.text = ConstVariable().itensCity[index].codCityIbge.toString(); Navigator.pop(context); }); }, title: TextDefault( color: ColorPalette.black54, - text: ConstVariable().itensCity[index], + text: ConstVariable().itensCity[index].nameCityFront, fontSize: 16, maxLines: 2, ), diff --git a/lib/screens/splash_screen.dart b/lib/screens/splash_screen.dart index 17881b7..ac615ac 100644 --- a/lib/screens/splash_screen.dart +++ b/lib/screens/splash_screen.dart @@ -1,8 +1,11 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:rkm/models/args_load_init_model.dart'; +import 'package:rkm/models/city_load_model.dart'; +import 'package:rkm/screens/sync_unit_screen.dart'; import 'package:rkm/utils/const_variable.dart'; - import '../service/db/db_sqlite.dart'; +import 'login_saved_screen.dart'; class SplashScreen extends StatefulWidget { const SplashScreen({Key? key}) : super(key: key); @@ -16,16 +19,33 @@ class _SplashScreenState extends State { @override void initState() { super.initState(); - DbSqlite().intialDB().then((value){ - - }); + DbSqlite().intialDB(); timer(); } timer()async{ - Future.delayed(Duration(seconds: 3),(){ - Navigator.pushReplacementNamed(context, '/login'); - }); + await DbSqlite().intialDB().then((db)async{ + List data = await db.query('MUNICIPIOS'); + if(data.length != 0){ + var query = "SELECT * FROM CONTROLE_INTERNO"; + data = await db.rawQuery(query); + if(data.length != 0){ + Navigator.push( + context, + MaterialPageRoute(builder: (context) => LoginSavedScreen(listControl: data)), + ); + }else{ + CityLoadModel model = CityLoadModel(codCity: 0, nameCityApi: '', nameCityFront: '', codState: '', codCityIbge: 0); + ArgsLoadInitModel args = ArgsLoadInitModel(mode: '', model: model, user: '', password: '', urlAPI: ''); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => SyncUnitScreen(args: args)), + ); + } + }else{ + Navigator.pushReplacementNamed(context, '/login_load'); + } + }); } @override diff --git a/lib/screens/sync_unit_screen.dart b/lib/screens/sync_unit_screen.dart new file mode 100644 index 0000000..c83a7e6 --- /dev/null +++ b/lib/screens/sync_unit_screen.dart @@ -0,0 +1,263 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:rkm/models/args_load_init_model.dart'; +import 'package:rkm/service/api/url_api_const.dart'; +import 'package:rkm/utils/color_palette.dart'; +import 'package:rkm/utils/const_variable.dart'; +import 'package:rkm/widgets/button_default.dart'; +import 'package:rkm/widgets/dropdown_button_city.dart'; +import 'package:rkm/widgets/dropdown_button_default.dart'; +import 'package:rkm/widgets/input_text.dart'; +import 'package:rkm/widgets/text_default.dart'; +import 'package:sqflite/sqflite.dart'; +import '../models/city_load_model.dart'; +import '../service/api/api_data.dart'; +import '../service/api/encrypt_password.dart'; +import '../service/db/db_sqlite.dart'; +import 'load_init_screen.dart'; +class SyncUnitScreen extends StatefulWidget { + ArgsLoadInitModel args; + + SyncUnitScreen({ + required this.args +}); + + @override + State createState() => _SyncUnitScreenState(); +} + +class _SyncUnitScreenState extends State { + + var inputUser = TextEditingController(); + var inputPassword = TextEditingController(); + String error = ''; + String? now; + String? selectUnit; + String? selectTeam; + bool validatorDropDown= false; + int contLogo = 0; + String mode = 'desenvolvimento'; + String urlAPI = UrlApiConst.ApiUrlDesenvolvimento; + bool loading = false; + List listUnit=[]; + List searchUnitCodList=[]; + List listTeam = []; + String idUnidade =''; + checkLogin()async{ + CityLoadModel? model; + ArgsLoadInitModel? args; + if(inputUser.text.isNotEmpty && inputPassword.text.isNotEmpty && inputUser.text.length>3 && inputPassword.text.length>3){ + if(selectUnit!=null){ + setState(() { + error = ''; + loading = true; + }); + await DbSqlite().saveCityInit(widget.args).then((value)async{ + + }); + if(model!=null){ + args = ArgsLoadInitModel( + mode: mode, + model:model!, + user: inputUser.text, + password: inputPassword.text, + urlAPI: urlAPI + ); + } + if(args!=null){ + await ApiData().apiConect(args!).then((response) async { + if(inputUser.text == inputPassword.text || response['bloqueio']==1){ + setState(() { + error = 'Usuário bloqueado/senha incorreta'; + }); + }else if(response['status']==0) { + setState(() { + error = 'Usuário não encontrado'; + }); + }else if(response['status']==1) { + setState((){ + error = ''; + }); + //verificar se a criptografia identificou se a senha está correta + if(EncryptPassword().encrypt(inputPassword.text,response['userPass']) == response['userPass']){ + // print(EncryptPassword().encrypt(inputPassword.text,response['userPass'])); + setState(() { + loading = false; + }); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => LoadInitScreen(args: args!)), + ); + } + } + }); + } + }else{ + setState(() { + error = 'Selecione sua cidade'; + }); + } + }else{ + setState(() { + error = 'Usuário/senha inválido(s)'; + }); + } + } + + @override + void initState() { + super.initState(); + setState(() { + mode = widget.args.mode; + inputUser.text = widget.args.user; + inputPassword.text = widget.args.password; + }); + getUnit(); + } + + getUnit()async{ + Database db = await DbSqlite().intialDB(); + var query = "SELECT * FROM UNIDADES"; + List list = await db.rawQuery(query); + // print("SELECT * FROM UNIDADES"); + // print(await db.rawQuery("SELECT * FROM UNIDADES")); + for(int i=0; list.length > i;i++){ + listUnit.add(list[i]['NOME_UNIDADE']); + searchUnitCodList.add(list[i]['ID_UNIDADE']); + } + print('searchListUnit'); + print(searchUnitCodList); + setState(() {}); + } + + getTeam()async{ + for(int i=0; listUnit.length > i;i++){ + if(listUnit[i] == selectUnit){ + idUnidade = searchUnitCodList[i].toString(); + print(searchUnitCodList[i]); + } + } + if(idUnidade!=''){ + Database db = await DbSqlite().intialDB(); + var query = "SELECT * FROM EQUIPES WHERE ID_UNIDADE = $idUnidade"; + List list = await db!.rawQuery(query); + print('getEquipes'); + print(list); + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { + + double width = MediaQuery.of(context).size.width; + double height = MediaQuery.of(context).size.height; + + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: TextDefault(text: 'RKM AB - Sincronização de Unidade',fontSize: ConstVariable().fontSizeTitleAppBar,color: ColorPalette.white), + ), + body: SingleChildScrollView( + child: Container( + padding: EdgeInsets.only(top: height*0.2), + width: width, + height: height, + decoration: ConstVariable().backgroundGradient, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + GestureDetector( + onTap: loading?null:()=>setState((){ + contLogo++; + if(contLogo>=5 && contLogo<=10){ + mode = UrlApiConst.ModeHomologacao; + urlAPI = UrlApiConst.ApiUrlHomologacao; + } + if(contLogo>10){ + mode = UrlApiConst.ModeDesenvolvimento; + urlAPI = UrlApiConst.ApiUrlDesenvolvimento; + if(contLogo==15){ + contLogo=0; + mode = UrlApiConst.ModeOnline; + urlAPI = UrlApiConst.ApiUrlOnline; + } + } + }), + child: Image.asset('assets/images/logo.PNG',width: width*0.4) + ), + mode == 'homologacao'?Image.asset('assets/images/homologacao.png',width: width*0.4):Container(), + mode == 'desenvolvimento'?Image.asset('assets/images/desenvolvimento.png',width: width*0.4):Container(), + SizedBox(height: 10), + loading?Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image.asset('assets/images/loading.gif'), + SizedBox(height: 10), + TextDefault(text: 'Carregando dados...',color: ColorPalette.black54,fontSize: 20,fontWeigth: FontWeight.bold,) + ], + ), + ):Form( + autovalidateMode: AutovalidateMode.onUserInteraction, + child: Container( + width: width*0.6, + height: height*0.3, + child: ListView( + children: [ + InputText( + hint: 'Usuário', + label: inputUser.text.isNotEmpty?'':'Usuário', + error: 'Campo obrigatório', + controller: inputUser, + width: width*0.6, + colorBorder: Colors.white, + onChanged: (v)=>setState((){}), + ), + InputText( + hint: 'Senha', + label: inputPassword.text.isNotEmpty?'':'Senha', + error: 'Campo obrigatório', + obscure: true, + controller: inputPassword, + width: width*0.6, + colorBorder: Colors.white, + onChanged: (v)=>setState((){}), + ), + DropDownButtonDefault( + width: width*0.6, + title: 'Unidade', + list: listUnit, + select: selectUnit, + onChanged: (value){ + // for(int i=0;listUnit.length > i;i++){ + // if(listUnit[i] == selectUnit){ + // + // } + // } + setState(() { + selectUnit = value!; + validatorDropDown = true; + }); + getTeam(); + }, + ), + ], + ), + ), + ), + loading?Container():ButtonDefault( + onPressed: ()=>checkLogin(), + title: 'Sincronizar', + width: width*0.6, + ), + SizedBox(height: 10), + TextDefault(text: error,color: ColorPalette.red), + ], + ), + ), + ), + ); + } +} diff --git a/lib/service/api/api_data.dart b/lib/service/api/api_data.dart index 28a479e..ca1703e 100644 --- a/lib/service/api/api_data.dart +++ b/lib/service/api/api_data.dart @@ -1,20 +1,18 @@ import 'dart:convert'; import 'package:http/http.dart' as http; -import 'package:rkm/utils/const_variable.dart'; import '../../models/args_load_init_model.dart'; class ApiData{ Future apiConect(ArgsLoadInitModel args)async{ - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/pass/${args.user}'; + //http://192.168.0.42:8010/api/atb/desenvolvimento/cabreuva/load/pass/admin + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/pass/${args.user}'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); return map; } Future loadPerm(ArgsLoadInitModel args)async{ //http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/load/perm/admin - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/load/perm/${args.user}'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/load/perm/${args.user}'; // final url = 'http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/load/perm/admin'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); @@ -22,9 +20,9 @@ class ApiData{ return map; } Future loadUnidades(ArgsLoadInitModel args)async{ + print('entrou aqui ${args.model.nameCityApi}'); // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/unidades - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/unidades'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/unidades'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -32,8 +30,7 @@ class ApiData{ } Future loadProcedimentos(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/procedimentos - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/procedimentos'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/procedimentos'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -41,8 +38,7 @@ class ApiData{ } Future loadProcedimentosRegistros(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/procedimentosRegistros - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/procedimentosRegistros'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/procedimentosRegistros'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -50,8 +46,7 @@ class ApiData{ } Future loadCID(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/cid - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/cid'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/cid'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -59,8 +54,7 @@ class ApiData{ } Future loadProcedimentosCID(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/procedimentosCID - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/procedimentosCID'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/procedimentosCID'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -68,8 +62,7 @@ class ApiData{ } Future loadCBO(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/cbo - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/cbo'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/cbo'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -77,8 +70,7 @@ class ApiData{ } Future loadProcedimentosCBO(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/procedimentosCBO - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/procedimentosCBO'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/procedimentosCBO'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -86,8 +78,7 @@ class ApiData{ } Future loadCIAP(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/ciap - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/ciap'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/ciap'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -95,8 +86,7 @@ class ApiData{ } Future loadMunicipios(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/municipios - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/municipios'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/municipios'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -104,8 +94,8 @@ class ApiData{ } Future loadEquipes(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/equipes - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/equipes'; + // https://app0.rkmsistemas.com.br/api/atb/homologacao/cabreuva/admin/load/equipes + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/equipes'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); // print(map); @@ -113,8 +103,7 @@ class ApiData{ } Future loadEquipeComponentes(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/equipeComponentes - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/equipeComponentes'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/equipeComponentes'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); print(map); @@ -122,47 +111,12 @@ class ApiData{ } Future loadCompetencia(ArgsLoadInitModel args)async{ // http://192.168.0.42:8010/api/atb/desenvolvimento/corumbatai/admin/load/competencia - 'criar uma lista dentro do DB não usar essa api para competencia'; 'competencia sera dinamica com 4 meses para tras exemplo 042023/032023/022023/01/2023'; - - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - // - String cityReplace = ConstVariable().replaceText(args.city); - final url = '${args.urlAPI}${args.mode}/$cityReplace/${args.user}/load/competencia'; + final url = '${args.urlAPI}${args.mode}/${args.model.nameCityApi}/${args.user}/load/competencia'; final response = await http.get(Uri.parse(url)); final map = json.decode(response.body); - print(map); + // print(map); return map; } } \ No newline at end of file diff --git a/lib/service/db/db_sqlite.dart b/lib/service/db/db_sqlite.dart index 2cffe60..c32274f 100644 --- a/lib/service/db/db_sqlite.dart +++ b/lib/service/db/db_sqlite.dart @@ -2,8 +2,6 @@ import 'package:rkm/models/args_load_init_model.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; -import '../../utils/const_variable.dart'; - class DbSqlite{ Future intialDB()async{ @@ -38,7 +36,7 @@ class DbSqlite{ db.execute('CREATE TABLE IF NOT EXISTS CIDADAOS (ID_CIDADAO INTEGER PRIMARY KEY AUTOINCREMENT, CD_USUARIO_SUS TEXT, NOME_CIDADAO TEXT, NOME_SOCIAL TEXT, SEXO TEXT, DT_NASCIMENTO TEXT, ID_ESTADO_CIVIL INTEGER, NOME_CONJUGE TEXT, NACIONALIDADE INTEGER, ID_MUNICIPIO_NASC INTEGER, NO_MUNICIPIO_NASC TEXT, ESTADO_UF_NASC TEXT, ID_ETNIA INTEGER, ID_ESCOLARIDADE INTEGER, ID_DEFICIENCIA INTEGER, NOME_MAE TEXT, DESCONHECE_MAE INTEGER, NOME_PAI TEXT, DESCONHECE_PAI INTEGER, ID_UNIDADE INTEGER, NUM_PRONTUARIO TEXT, NUM_PRONTUARIO_PROV TEXT, CLASSIFICACAO INTEGER, CLASSIFICACAO_SUB INTEGER, NUM_FAMILIA INTEGER, ID_PAIS_RESID INTEGER, ID_MUNICIPIO_RESID INTEGER, NO_MUNICIPIO_RESID TEXT, ESTADO_UF_RESID TEXT, CODIGO_IBGE_RESID INTEGER, NO_BAIRRO_LOGR TEXT, ID_LOGR_TIPO INTEGER, NOME_LOGR TEXT, CEP_LOGR INTEGER, NUMERO_LOGR INTEGER, LOTEAMENTO_LOGR INTEGER, COMPL_LOGR TEXT, PONTO_REFERENCIA TEXT, ZONA_LOGR INTEGER, DDD_TELEFONE INTEGER, NUM_TELEFONE INTEGER, DDD_CELULAR INTEGER, NUM_CELULAR INTEGER, DDD_RECADO INTEGER, NUM_RECADO INTEGER, EMAIL TEXT, OBSERVACOES TEXT, CPF INTEGER, CNS TEXT, TITULO_ELEITOR INTEGER, RG_NUMERO INTEGER, RG_COMPLEMENTO TEXT, RG_UF TEXT, RG_ORGAO TEXT, RG_DATA_EMISSAO TEXT, TIPO_CERTIDAO INTEGER, NUM_CERTIDAO TEXT, CARTORIO_CERTIDAO TEXT, LIVRO_CERTIDAO TEXT, FOLHA_CERTIDAO TEXT, TERMO_CERTIDAO TEXT, DT_EMISSAO_CERTIDAO TEXT, NUM_CTPS TEXT, NUM_SERIE_CTPS TEXT, ESTADO_UF_CTPS TEXT, NUM_PIS_PASEP TEXT, FL_RETIROU_CARTAO INTEGER, NUM_NIS TEXT, NUM_PROT_CROSS TEXT, RENDA_MENSAL REAL, PROFISSAO TEXT, DT_OBITO TEXT, DECLARACAO_OBITO TEXT, BLOQUEIO INTEGER, ORIGEM INTEGER, DT_HORA_CADASTRO TEXT, ID_USUARIO_CADASTRO INTEGER, ID_DOMICILIO INTEGER, ATENDIMENTOS INTEGER, SINCRONIZADO TEXT);'); db.execute('CREATE TABLE IF NOT EXISTS CIDADAO_DOMICILIO (ID_DOMICILIO INTEGER PRIMARY KEY AUTOINCREMENT, TIPO_IMOVEL INTEGER, ID_AREA_DOMICILIO INTEGER, ID_MICROAREA_DOMICILIO INTEGER, FORA_AREA INTEGER, SITUACAO_MORADIA INTEGER, TIPO_LOCALIDADE INTEGER, TIPO_DOMICILIO INTEGER, NUM_MORADORES INTEGER, NUM_COMODOS INTEGER, SITUACAO_RURAL INTEGER, TIPO_ACESSO INTEGER, MAT_PREDOMINANTE INTEGER, DISPONIBILIDADE_ENERGIA INTEGER, TIPO_ABASTECIMENTO INTEGER, TRATAMENTO_AGUA INTEGER, DESTINO_LIXO INTEGER, ESCOAMENTO INTEGER, FL_ANIMAIS INTEGER, ANIMAIS_GATO INTEGER, ANIMAIS_CACHORRO INTEGER, ANIMAIS_PASSARO INTEGER, ANIMAIS_OUTROS INTEGER, QTDE_ANIMAIS INTEGER, CBO_RESP_CADASTRO TEXT, ID_RESP_CADASTRO INTEGER, CNES_RESP_CADASTRO TEXT, INE_RESP_CADASTRO TEXT, DT_CADASTRO TEXT, ID_EQUIPE INTEGER, ORIGEM TEXT, SINCRONIZADO TEXT, NOME_INSTITUICAO_PERMANENCIA TEXT, PROFISSIONAIS_VINCULADOS_INST INTEGER, RESPONSAVEL_TECNICO_INST TEXT, CNS_RESP_TECNICO_INST TEXT, CARGO_RESP_TECNICO_INST TEXT, TEL_RESP_TECNICO_INST TEXT);'); db.execute('CREATE TABLE IF NOT EXISTS CIDS (CODIGO_CID TEXT, DESCRICAO_CID TEXT, RESTRICAO_SEXO INTEGER);'); - db.execute('CREATE TABLE IF NOT EXISTS CONTROLE_INTERNO (CARGA_INICIAL INTEGER, SYNC_UNIDADE INTEGER, CIDADE_LOAD TEXT, NOME_CIDADE TEXT, ID_MUNICIPIO INTEGER, UF_ESTADO TEXT, UNIDADE_SYNC TEXT, CODIGO_IBGE INTEGER, NOME_UNIDADE TEXT, AMBIENTE TEXT, ULTIMA_SINCRONIZACAO TEXT, COMPETENCIA TEXT, ID_AREA INTEGER, AREA INTEGER, ID_MICROAREA INTEGER, MICROAREA INTEGER);'); + db.execute( 'CREATE TABLE IF NOT EXISTS CONTROLE_INTERNO (CARGA_INICIAL INTEGER, SYNC_UNIDADE INTEGER, CIDADE_LOAD TEXT, NOME_CIDADE TEXT, ID_MUNICIPIO INTEGER, UF_ESTADO TEXT, UNIDADE_SYNC TEXT, CODIGO_IBGE INTEGER, NOME_UNIDADE TEXT, AMBIENTE TEXT, ULTIMA_SINCRONIZACAO TEXT, COMPETENCIA TEXT, AREA INTEGER, MICROAREA INTEGER);'); db.execute('CREATE TABLE IF NOT EXISTS DOMICILIOS_CIDADAOS (ID_DOMICILIO INTEGER, CD_USUARIO_SUS TEXT);'); db.execute('CREATE TABLE IF NOT EXISTS EQUIPES (ID_EQUIPE INTEGER PRIMARY KEY AUTOINCREMENT, ID_UNIDADE INTEGER, INE TEXT, ID_ATB_AREA INTEGER, AREA INTEGER, ID_ATB_MICROAREA INTEGER, MICROAREA INTEGER);'); db.execute('CREATE TABLE IF NOT EXISTS FICHAS_COMPLEMENTARES (ID_FICHA_COMPLEMENTAR INTEGER PRIMARY KEY AUTOINCREMENT, ID_CIDADAO INTEGER, CD_USUARIO_SUS TEXT, ID_PROFISSIONAL INTEGER, CBO_PROFISSIONAL TEXT, INE_PROFISSIONAL TEXT, CNES_UNIDADE TEXT, ID_UNIDADE INTEGER, ID_EQUIPE INTEGER, DATA_ATENDIMENTO TEXT, TURNO INTEGER, DATA_OLHINHO TEXT, RESULTADO_OLHINHO INTEGER, DATA_FUNDO_OLHO TEXT, RESULTADO_FUNDO_OLHO INTEGER, DATA_ORELHINHA TEXT, RESULTADO_ORELHINHA INTEGER, DATA_TRANSFONTANELA TEXT, RESULTADO_TRANSFONTANELA INTEGER, DATA_TOMOGRAFIA TEXT, RESULTADO_TOMOGRAFIA INTEGER, DATA_RESSONANCIA TEXT, RESULTADO_RESSONANCIA INTEGER, SINCRONIZADO TEXT);'); @@ -69,46 +67,45 @@ class DbSqlite{ return db; } Future deleteDB()async{ - //testar com ; no final var querys = [ 'UPDATE CONTROLE_INTERNO SET SYNC_UNIDADE = NULL, UNIDADE_SYNC = NULL, NOME_UNIDADE = NULL WHERE rowid = 1;', - 'DELETE FROM ATENDS_DOM_COMPL', - 'DELETE FROM ATENDS_DOM_PROC', - 'DELETE FROM ATENDS_DOM_SIGTAP', - 'DELETE FROM ATENDIMENTOS_DOMICILIARES', - 'DELETE FROM ATENDS_INDIV_PROC', - 'DELETE FROM ATENDS_INDIV_PROF', - 'DELETE FROM ATENDS_INDIVIDUAIS', - 'DELETE FROM BAIRROS', - 'DELETE FROM CADASTROS_INDIVIDUAIS', - 'DELETE FROM CBOS', - 'DELETE FROM CIAPS', - 'DELETE FROM CIDADAOS', - 'DELETE FROM CIDADAO_DOMICILIO', - 'DELETE FROM CIDS', - 'DELETE FROM CONTROLE_INTERNO', - 'DELETE FROM DOMICILIOS_CIDADAOS', - 'DELETE FROM EQUIPES', - 'DELETE FROM FICHAS_COMPLEMENTARES', - 'DELETE FROM LOGRADOUROS_ENDERECOS', - 'DELETE FROM LOGRADOUROS_LOTEAMENTOS', - 'DELETE FROM LOGRADOUROS_TIPOS', - 'DELETE FROM MUNICIPIOS', - 'DELETE FROM PROCEDIMENTOS_FICHAS', - 'DELETE FROM PROCEDIMENTOS_INDIV', - 'DELETE FROM PROCEDIMENTOS_INDIV_FICHA', - 'DELETE FROM PROCEDIMENTOS_INDIV_SIGTAP', - 'DELETE FROM PROCEDIMENTOS_SIGTAP', - 'DELETE FROM PROCEDIMENTOS_SIGTAP_CBO', - 'DELETE FROM PROCEDIMENTOS_SIGTAP_CID', - 'DELETE FROM PROCEDIMENTOS_SIGTAP_REGISTRO', - 'DELETE FROM PROFISSIONAIS', - 'DELETE FROM PROFISSIONAIS_CBOS', - 'DELETE FROM PROFISSIONAIS_EQUIPE', - 'DELETE FROM UNIDADES', - 'DELETE FROM VISITAS_DOMICILIARES', - 'DELETE FROM VISITAS_DOMICILIARES_COMPL', - 'DELETE FROM VISITAS_DOMICILIARES_PROC', + 'DELETE FROM ATENDS_DOM_COMPL;', + 'DELETE FROM ATENDS_DOM_PROC;', + 'DELETE FROM ATENDS_DOM_SIGTAP;', + 'DELETE FROM ATENDIMENTOS_DOMICILIARES;', + 'DELETE FROM ATENDS_INDIV_PROC;', + 'DELETE FROM ATENDS_INDIV_PROF;', + 'DELETE FROM ATENDS_INDIVIDUAIS;', + 'DELETE FROM BAIRROS;', + 'DELETE FROM CADASTROS_INDIVIDUAIS;', + 'DELETE FROM CBOS;', + 'DELETE FROM CIAPS;', + 'DELETE FROM CIDADAOS;', + 'DELETE FROM CIDADAO_DOMICILIO;', + 'DELETE FROM CIDS;', + 'DELETE FROM CONTROLE_INTERNO;', + 'DELETE FROM DOMICILIOS_CIDADAOS;', + 'DELETE FROM EQUIPES;', + 'DELETE FROM FICHAS_COMPLEMENTARES;', + 'DELETE FROM LOGRADOUROS_ENDERECOS;', + 'DELETE FROM LOGRADOUROS_LOTEAMENTOS;', + 'DELETE FROM LOGRADOUROS_TIPOS;', + 'DELETE FROM MUNICIPIOS;', + 'DELETE FROM PROCEDIMENTOS_FICHAS;', + 'DELETE FROM PROCEDIMENTOS_INDIV;', + 'DELETE FROM PROCEDIMENTOS_INDIV_FICHA;', + 'DELETE FROM PROCEDIMENTOS_INDIV_SIGTAP;', + 'DELETE FROM PROCEDIMENTOS_SIGTAP;', + 'DELETE FROM PROCEDIMENTOS_SIGTAP_CBO;', + 'DELETE FROM PROCEDIMENTOS_SIGTAP_CID;', + 'DELETE FROM PROCEDIMENTOS_SIGTAP_REGISTRO;', + 'DELETE FROM PROFISSIONAIS;', + 'DELETE FROM PROFISSIONAIS_CBOS;', + 'DELETE FROM PROFISSIONAIS_EQUIPE;', + 'DELETE FROM UNIDADES;', + 'DELETE FROM VISITAS_DOMICILIARES;', + 'DELETE FROM VISITAS_DOMICILIARES_COMPL;', + 'DELETE FROM VISITAS_DOMICILIARES_PROC;', ]; Database db = await intialDB(); for(int i=0;querys.length>i;i++){ @@ -295,26 +292,24 @@ class DbSqlite{ print(await db.query('PROFISSIONAIS_EQUIPE')); return db; } - Future saveCompetence(var competence,ArgsLoadInitModel args)async{ + Future saveCityInit(ArgsLoadInitModel args)async{ Database db = await intialDB(); - String cityReplace = ConstVariable().replaceText(args.city); - print(competence); //refatorar cidade_load e nome_cidade 'parameters = [{"carga_inicial": 1, "cidade_load": cidade, "nome_cidade": vm.nomeCidade[cidade], "cidade_id": cidadeID, "estado": estado, "ibge": ibge, "ambiente": ambiente, "competencia": competencia.replace(/\D/g, '')}]'; "INSERT OR REPLACE INTO CONTROLE_INTERNO (rowid, CARGA_INICIAL, CIDADE_LOAD, NOME_CIDADE, ID_MUNICIPIO, UF_ESTADO, CODIGO_IBGE, AMBIENTE, COMPETENCIA) VALUES (1,?,?,?,?,?,?,?,?)"; - Map row = { - 'CARGA_INICIAL' : 1, - 'CIDADE_LOAD' : cityReplace, - 'NOME_CIDADE' : args.city, - 'ID_MUNICIPIO' : '', - 'UF_ESTADO' : '', - 'CODIGO_IBGE' : '', - 'AMBIENTE' : args.mode, - 'COMPETENCIA' : competence, - }; - int id = await db.insert('CONTROLE_INTERNO', row); - print('id increment $id CONTROLE_INTERNO'); + Map row = { + 'CARGA_INICIAL' : 1, + 'CIDADE_LOAD' : args.model.nameCityApi, + 'NOME_CIDADE' : args.model.nameCityFront, + 'ID_MUNICIPIO' : args.model.codCity, + 'UF_ESTADO' : args.model.codState, + 'CODIGO_IBGE' : args.model.codCityIbge, + 'AMBIENTE' : args.mode, + 'ULTIMA_SINCRONIZACAO' : DateTime.now().toString(), + 'COMPETENCIA' : '${DateTime.now().year}${DateTime.now().month<10?'0':''}${DateTime.now().month-1}', + }; + int id = await db.insert('CONTROLE_INTERNO', row); print(await db.query('CONTROLE_INTERNO')); return db; } diff --git a/lib/utils/const_variable.dart b/lib/utils/const_variable.dart index ac289a7..11ccc6e 100644 --- a/lib/utils/const_variable.dart +++ b/lib/utils/const_variable.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:rkm/models/city_load_model.dart'; import 'color_palette.dart'; class ConstVariable{ @@ -217,39 +218,38 @@ class ConstVariable{ '225124 - Médico pediatra', '225125 - Médico clínico', ]; - List itensCity = [ - 'Anhembi', - 'Aparecida', - 'Batatais', - 'Biritiba Mirim', - 'Cabreúva', - 'Cachoeira Paulista', - 'Caconde', - 'Casa Branca', - 'Corumbataí', - 'Descalvado', - 'Extrema', - 'Franco da Rocha', - 'Igaraçu do Tiete', - 'Iracemápolis', - 'Itapeva', - 'Itápolis', - 'Itirapina', - 'Ituverava', - 'Jardinópolis', - 'Laranjal Paulista', - 'Macatuba', - 'Mairiporã', - 'Mococa', - 'Morro Agudo', - 'Pardinho', - 'Pederneiras', - 'Piracicaba', - 'Porto Ferreira', - 'Santa Rita', - 'Santo Antônio da Alegria', - 'São Sabastião da Grama', - 'Tapiratiba' + List itensCity = [ + CityLoadModel(codCity: 3311, nameCityApi: 'anhembi', nameCityFront: 'Anhembi', codState: 'SP', codCityIbge: 350230), + CityLoadModel(codCity: 3313, nameCityApi: 'aparecida', nameCityFront: 'Aparecida', codState: 'SP', codCityIbge: 350250), + CityLoadModel(codCity: 3352, nameCityApi: 'batatais', nameCityFront: 'Batatais', codState: 'SP', codCityIbge: 350590), + CityLoadModel(codCity: 3360, nameCityApi: 'biritiba', nameCityFront: 'Biritiba Mirim', codState: 'SP', codCityIbge: 350660), + CityLoadModel(codCity: 3381, nameCityApi: 'cabreuva', nameCityFront: 'Cabreúva', codState: 'SP', codCityIbge: 350840), + CityLoadModel(codCity: 1903, nameCityApi: 'cachoeira', nameCityFront: 'Cachoeira Paulista', codState: 'SP', codCityIbge: 290490), + CityLoadModel(codCity: 3384, nameCityApi: 'caconde', nameCityFront: 'Caconde', codState: 'SP', codCityIbge: 350870), + CityLoadModel(codCity: 3409, nameCityApi: 'casabranca', nameCityFront: 'Casa Branca', codState: 'SP', codCityIbge: 351080), + CityLoadModel(codCity: 3427, nameCityApi: 'corumbatai', nameCityFront: 'Corumbataí', codState: 'SP', codCityIbge: 351270), + CityLoadModel(codCity: 3437, nameCityApi: 'descalvado', nameCityFront: 'Descalvado', codState: 'SP', codCityIbge: 351370), + CityLoadModel(codCity: 2539, nameCityApi: 'extrema', nameCityFront: 'Extrema', codState: 'MG', codCityIbge: 312510), + CityLoadModel(codCity: 3473, nameCityApi: 'francodarocha', nameCityFront: 'Franco da Rocha', codState: 'SP', codCityIbge: 351640), + CityLoadModel(codCity: 3514, nameCityApi: 'igaracudotiete', nameCityFront: 'Igaraçu do Tietê', codState: 'SP', codCityIbge: 352000), + CityLoadModel(codCity: 3531, nameCityApi: 'iracemapolis', nameCityFront: 'Iracemápolis', codState: 'SP', codCityIbge: 352140), + CityLoadModel(codCity: 3546, nameCityApi: 'itapolis', nameCityFront: 'Itápolis', codState: 'SP', codCityIbge: 352270), + CityLoadModel(codCity: 3555, nameCityApi: 'itirapina', nameCityFront: 'Itirapina', codState: 'SP', codCityIbge: 352360), + CityLoadModel(codCity: 3560, nameCityApi: 'ituverava', nameCityFront: 'Ituverava', codState: 'SP', codCityIbge: 352410), + CityLoadModel(codCity: 3570, nameCityApi: 'jardinopolis', nameCityFront: 'Jardinópolis', codState: 'SP', codCityIbge: 352510), + CityLoadModel(codCity: 3584, nameCityApi: 'laranjal', nameCityFront: 'Laranjal Paulista', codState: 'SP', codCityIbge: 352640), + CityLoadModel(codCity: 3601, nameCityApi: 'macatuba', nameCityFront: 'Macatuba', codState: 'SP', codCityIbge: 352800), + CityLoadModel(codCity: 3606, nameCityApi: 'mairipora', nameCityFront: 'Mairiporã', codState: 'SP', codCityIbge: 352850), + CityLoadModel(codCity: 3628, nameCityApi: 'mococa', nameCityFront: 'Mococa', codState: 'SP', codCityIbge: 353050), + CityLoadModel(codCity: 3642, nameCityApi: 'morroagudo', nameCityFront: 'Morro Agudo', codState: 'SP', codCityIbge: 353190), + CityLoadModel(codCity: 3691, nameCityApi: 'pardinho', nameCityFront: 'Pardinho', codState: 'SP', codCityIbge: 353610), + CityLoadModel(codCity: 3699, nameCityApi: 'pederneiras', nameCityFront: 'Pederneiras', codState: 'SP', codCityIbge: 353670), + CityLoadModel(codCity: 3719, nameCityApi: 'piracicaba', nameCityFront: 'Piracicaba', codState: 'SP', codCityIbge: 353870), + CityLoadModel(codCity: 3740, nameCityApi: 'portoferreira', nameCityFront: 'Porto Ferreira', codState: 'SP', codCityIbge: 354070), + CityLoadModel(codCity: 3816, nameCityApi: 'santarita', nameCityFront: 'Santa Rita', codState: 'SP', codCityIbge: 354750), + CityLoadModel(codCity: 3821, nameCityApi: 'stoantoniodaalegria',nameCityFront: 'Santo Antônio da Alegria', codState: 'SP', codCityIbge: 354790), + CityLoadModel(codCity: 3853, nameCityApi: 'ssgrama', nameCityFront: 'São Sebastião da Grama', codState: 'SP', codCityIbge: 355080), + CityLoadModel(codCity: 3882, nameCityApi: 'tapiratiba', nameCityFront: 'Tapiratiba', codState: 'SP', codCityIbge: 355360), ]; var backgroundGradient = BoxDecoration( gradient: LinearGradient( @@ -261,15 +261,4 @@ class ConstVariable{ ], ) ); - - replaceText(String text){ - String replace= text.toLowerCase() - .replaceAll('ú', 'u') - .replaceAll('ç', 'c') - .replaceAll('ó', 'o') - .replaceAll('ô', 'o') - .replaceAll('í', 'i') - .replaceAll('ã','a'); - return replace; - } } \ No newline at end of file diff --git a/lib/utils/routes.dart b/lib/utils/routes.dart index 51a6a95..07070f8 100644 --- a/lib/utils/routes.dart +++ b/lib/utils/routes.dart @@ -2,7 +2,7 @@ import 'package:rkm/screens/about_screen.dart'; import 'package:rkm/screens/attendance_list_screen.dart'; import 'package:rkm/screens/home_screen.dart'; import 'package:rkm/screens/load_init_screen.dart'; -import 'package:rkm/screens/login_screen.dart'; +import 'package:rkm/screens/login_load_screen.dart'; import 'package:rkm/screens/select_service/eligibility_assessment_screen.dart'; import 'package:rkm/screens/splash_screen.dart'; import '../screens/clear_data_screen.dart'; @@ -21,7 +21,7 @@ import '../screens/sinc_data_screen.dart'; var routes = { '/home': (context) => HomeScreen(), - '/login': (context) => LoginScreen(), + '/login_load': (context) => LoginLoadScreen(), '/register_citizen': (context) => RegisterCitizenScreen(), '/attendance_list': (context) => AttendanceListScreen(), '/about': (context) => AboutScreen(), diff --git a/lib/widgets/dropdown_button_city.dart b/lib/widgets/dropdown_button_city.dart index 2049b52..abe46d8 100644 --- a/lib/widgets/dropdown_button_city.dart +++ b/lib/widgets/dropdown_button_city.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rkm/widgets/text_default.dart'; +import '../models/city_load_model.dart'; import '../utils/color_palette.dart'; import '../utils/const_variable.dart'; @@ -36,13 +37,13 @@ class DropDownButtonCity extends StatelessWidget { color: ColorPalette.white ), child: DropdownButtonHideUnderline( - child: DropdownButton( + child: DropdownButton( hint: TextDefault(text: 'Cidade',fontSize: ConstVariable().fontSizeInput), value: select, items: ConstVariable().itensCity.map((value) => DropdownMenuItem( - value: value, + value: value.nameCityFront, child: TextDefault( - text: value, + text: value.nameCityFront, ), ) ).toList(), diff --git a/lib/widgets/dropdown_button_default.dart b/lib/widgets/dropdown_button_default.dart index af4d30c..c24b46a 100644 --- a/lib/widgets/dropdown_button_default.dart +++ b/lib/widgets/dropdown_button_default.dart @@ -9,7 +9,7 @@ class DropDownButtonDefault extends StatelessWidget { String? select; String title; double fontSize; - List list; + List list; double width; double widthContainer; @@ -33,16 +33,23 @@ class DropDownButtonDefault extends StatelessWidget { margin: ConstVariable().marginHightInput, color: ColorPalette.white, child: DropdownButtonHideUnderline( - child: DropdownButton( - hint: TextDefault(text: title,fontSize: ConstVariable().fontSizeInput,textAlign: TextAlign.end), + child: DropdownButton( + hint: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: TextDefault(text: title,fontSize: ConstVariable().fontSizeInput,textAlign: TextAlign.end), + ), value: select, items: list.map((value) => DropdownMenuItem( value: value, child: Container( width: widthContainer, - child: TextDefault( - text: value, - fontSize: fontSize, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: TextDefault( + text: value, + fontSize: fontSize, + color: Colors.black, + ), ), ), )