From 83860d3c21980a040a94d7afaccbb996b01b7789 Mon Sep 17 00:00:00 2001 From: Phuoc CAO Date: Mon, 31 May 2021 19:12:26 +0200 Subject: [PATCH] added tarifs_import with xlrd --- .temp_TARIF AXA 2021-converti.xlsx | Bin 0 -> 59918 bytes mondumas.egg-info/PKG-INFO | 40 +++-- mondumas.egg-info/SOURCES.txt | 7 +- mondumas.egg-info/requires.txt | 3 +- mondumas/models/parametres.py | 21 +++ mondumas/routes.py | 3 + mondumas/templates/parametres/parametres.pt | 12 +- mondumas/templates/parametres/tarif_edit.pt | 166 ++++++++++++++++++ mondumas/templates/parametres/tarifs.pt | 72 ++++++++ .../templates/parametres/tarifs_import.pt | 45 +++++ mondumas/views/dossier.py | 4 +- mondumas/views/parametres.py | 166 +++++++++++++++++- setup.py | 3 +- 13 files changed, 522 insertions(+), 20 deletions(-) create mode 100644 .temp_TARIF AXA 2021-converti.xlsx create mode 100644 mondumas/templates/parametres/tarif_edit.pt create mode 100644 mondumas/templates/parametres/tarifs.pt create mode 100644 mondumas/templates/parametres/tarifs_import.pt diff --git a/.temp_TARIF AXA 2021-converti.xlsx b/.temp_TARIF AXA 2021-converti.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..12de3baff2ed341b15baab1829f9e2b3ba3a774b GIT binary patch literal 59918 zcmeFYW0z*Z_a*qGZQEIC+jgaG+qP}nww;x>?aWHscIMQtyJx0n{kuOwPrSG{?ppCC z&f5E&y-&oImj(ev1%Lw}0RR9IzzXVqz8?qx0EGttPymp?TEcd=&L+0bddeR5CQdqZ z?l#thg`mI``2gU5>;M1pe{ck*(k5ju7!X5WB>o5=UMU=8a*O}gu-5=az6FryvZEw z&Y5ppD@S|*~&Yw^J0K}@1^RZ>VvdNmv9m&WE;=_jh zYJ80CoA=j*W5n0#7wKI})|q{~OFUfXO3D2r{W!eAUYUQ9BR%&vOY8Gn4~xvLxiTly~Zj1^cU#7aaO5p;rYdy z!x_JDE!5a@xN+7UWyLj_-I%?ZCiIk?NhPyybRt~CeQ!@vbR}&tN@VH%+DbYgM2a00 z;fO`vq84l=-w-28{}ALq6b zkOd`OG7?=x%J_Yx*90vwMWg~R&%q#pQbwEe&nL6|T7R#PEtCmx4e4bEJ1GPkm<_#F zE!}JKR1xwGiOnofN3mmZ4b-;(TI;zNCubS1ev~&xMPYX)f07uo;K`xF++8}BBrqsU z7?{r|VU?R~B_HvI_TtOa@+|jTLPB^!RPw#^yfwD5{I+waKlU+9lZ_V0Md6-wJrXvB zshHg?&lH-J3_^RzUPK!IAT|QYCEw7Nd;DqTa3GeBn3LFj;Ms|E61cbspvyC_c5R*?+=7d@pEJgvcE^8U`4SJ-gG zZZOVkhMO<#^lFfFRAp zHgcAje1|{2ii;^^whl5I>#tK2ol0T+rfG6s+Dcy-e49H4MuPqBE)Eb=p@B#R%i-g2 zz3&w>e*aMRU$MI0DM0ZbnZ^MI03iGW;XkbY&nS&f*0I|pL=C<9b;VD3tp;&YB#BzK z(5!MX&0=BU_511o6Do`5#>TaMwY1c(u53O88|b)%&U!Vnw&2D@^aDyE# zU86;;K5ev%-`5s&q{;n41j5=KJE$q2TPi8S!7%YaTKODzAu^;ekx%rmO9Y!Hbo2DG z$Tvh`9y$AFlH9n1MNo0>eS_%1(={=g5xH+|nNzdy14QCj*P)YxVH#xIt8j>t(D@sb zf0La!@fZ4i9*Jg>9^6qisDDe;4mbw25C^?};R~24Q@WO1rZlrRn^d&_?Ko^FqL+Sp znmHPR3%Ro-_bJBCqq~v^Pp!Pnk&X?RiStKzs=QG)V?*S+RnsXGYRY#;ml|kOa@5$5 zdda(0zhBP=YiWFtv-|jmh5rhcUO>_q?HUM&B~ZPgk! zPFZ4z-+wc{Awq8wIN}k_Y0Q8jS(&e7%FZUuXo#{RNR|6s7xZ?zH@nrWM;#Lp1pj)u z+TC<)n{;$}{v5gA;-A;rZ7fchCH1|WFSc&8mTji|tmYkc4ZXY2>yE*ow7T;H5~-u4Yt=)JiO+Uv@eeLdImseTpnuKvPYZ`*Fb-krU6-N@_e+<+=M zFu(>EcUnv8MaegYm?)&+!<$PJ#aQMJ>8m;{B_VaDC zi8EtxSj5fTt716!8ojzdxT?6S%mS(YfXPzPve5cuWb(6a)!A(OFaSO-Jw0`wK4ZxV zEV-!C0ioV)_R{Irdm~tLL<#+Ve3wFebW`Gg91*@k~30x2j9yZ9`( z#Niv0T#EVCy4yC9xf8WA=k(EMYuns0Z^CR2)p+lks`^4Ati9j|KJIa4==>%iylo90 zhXmOyXLQ0zLIEF$5C^d9M2lJ>Q_4gHy3>)vE14a`!T;j%z^^T$P)(8z022k{U@J6a zGzfS@pwSV7WrrRTAUzYMU-~o*!7?E9WFc>0LauzhudiRBk`L)oU_vd5mZFS5m)6$#h<-{j z=lm_i56e&p{01>d;lv~x1sc6Vp+eZJKrk_jHS(BQ%prdn^6Br5|E>mcdZOo4q*KFIEvX>$gM^&aWGM&vBFt> zXU?8$Q1*;-#Qoyzd38sp6O*l3RV{-H-W1swtY8xcF&yl*BovNa)2x3o+9J6W)&!>V z)%GhfiO8g2#)Esz9p?Rja&Tm&bjpF@ASJ37MP`DKMkNEyh3r@IG?t}r6m!f%c0n`; zOb&E?LK2c0*RIWsyV1GhbEs>8TUs`tiK3xTGF7H9-@M!#j7>XpPBpWVSUJ8>b1H1zlM7b%^6nU&N$SF1JiP1ib49c%*B8LYBu?YuKx)t5c zp}W`>B06uScmu0T&UZ$S{4~6vS}hUm|u_VhiD*+`)e|G zIn!u%W~17InmU-OYv|m{oH*$bgT}gtgw`t7^?j0vJWipfLF}d4c7m1Kr79$0hpYvr zoi`NA*%Hd;xOMu%b$~HtR6Y#VKUppno`Vg*gS8yZo--6!DxQHFSH8x$ISSCk)&}VB zzgT0KNLW@E5Yh!2wG*Q^z+W+!v=KGTwQ>*79L+^lUX{fW2+q^QQtFv4aUY8Z%A)00 zKJq$th&!6mf-tC_w*XYI$)qMVSJDcS#FltsXt|+hgQNO?O(R}f4*WZ_$u8rBFS2>0 zvTG(^>&unUftbte55Z;V+T4X&eT7sLVVN{h@pPOR+|4-#YL((Ps&8jprl9{Q(N{_E zbiX>j>7IVcZk^K_@Z7_tD|I-6Eq)o@1zUdwSCeW`A&fo^M4+$tmIbzqacl^i-j2Z0 ztH-*yQC}Z>+HL-Q_+aoYuPt^bf$Z-&EP%y1jU|=l00VkchU=r<=;*BRtLof5Uh;xy zr#eitMkK@29g5hokDw^7M_|7Kq*>nAakr<}?1_=33n=WgT@n8HOSW&zJ=yy`&n$Ob z^RfQ)`%oZmyTWN7MP#j}_}O+9RAmAkYq52u?D%X&++0?4{_6QA_+P05ZW|`){(q`K z=%3Ie`7i3=zdNA+rV$wbAO8~^*B?2+fGYX|@-6J{m9!E9E3Cv$+^%v0V)(uRzL^&P zg8Jpvglp1wbYwq!#Fq8JQ-Na&pFp$J2^?~0gkfHP>$O4KE7-tszJ&@!%M)*~NY|4I zA}cEuF&eLq2GbCtK>CF_=sUFD5DQfi&v(2o8R5Y&{uYHZS6yjobFT-{OfTDVLv!e( z7R1G?sPTOn>qEd}Thu!vaX%X@$r-QDS17?bCVF-6Zzy=-_MB_w0}oniGd20}4E4W? zfSVujk-$G89fkbA)kjSKO&_Ui)fKTJ`qnM|_`B;}lOmF7*o-A!3zt-$U!@3VgW~m3 z+S7g9a6ikyrYGl0@FI*tJxrh6on$yny+3%VVAoY!!06h^tUAgBEpzgtKY18^e`~!{ zGR3q`o*Sv&XWC5NRI~Ei`F$FEjbxoX52%{~gtu*{q*ry+TDOleR84Az>#D&gBiL0| z`d5#w+g3wO#LtvdT2DA&x+WqwL_$>_kl=l}&^R|AK1&Q;!bst$o8b5D=!aXn8&uxJ zPb;fEd^>z6JY2vc%L-{aZxWYSD!resv>(X5s0_AmY~zpEZQo3U^w2y8wS3QM@|zgv z&N7X-TLUb*_|WTtiMrEe;&k;Gjm zbSG;4FtvJaID0NaCSIxiJ|fUgq#@{XTR?-9EnGf(%xvJjz=*VRAxTci{;8mtN<>Zw zMY9`6?;=WJn5~Dj)`MkQXh#u@IBk8>Gs^5gP?3;OdMzVgxiH;_$@GkI*KcHP3chciFyX z0X@NZt?M$+!)>975GD3U)d(b%!@i|m`Zpu8=z$`%4*+0kjo&X;^s2Aa#x}DVxCdZ~ zCK*Wu!x1LWEw&g<xNJ!1^$#A#c?V&LtvH}g%~{qOcfd$;03fqhxz%; zv6Yt>2XFO|nDi15q$u86PXP?&FCK~<{JDqvLZ9N@VI{-CL-C8on}1DJCkG4G0ROH) zttoc`knzIr3(ORtGQoli#T5qut|eaF(V_8wclKe0H48^Wh*mm7vFIT02b`jftTK2F z^yM=ov5>-AV!Q_(O;$?I$DW7G36B=wkKrwAxleE{z`t+eUE#}d_ZL~M%26I{6Pc#F z2B>O4%}+^*r)!)+1}$_XputfytR(V^vOu4Wpb$mChCFTwX2uo=*S_>hP`V3DC`5u; zzQ{`rL^m%z^Ak;3vy;m3q=kk4_#f>VJkB5g zGC!;+j-;B4Lke~ugoSxerCI)shyu@St=JbFuqE&G8#Ngk(>ESciinfS^vVzlqU6swGq4VuU-m?+3pSO))TDpW<4CV*qwI2T~l9iz63EOV1gQ%(b&E4Fo6W0zB10tgF2vU#fGUDUD8f9ya71`k*yb3klJg;J$d%t4{N% zcz?C(zo_%fE|@Dd7pdmjS#?#r1^5)BIfrv=^7@Yai#p9$x&Y*5!9_3lax6o#8H$5qbCK)qhe*_;z;&`&?($1!g6qCiNfgBPG(t}Q&Y;CFje>PJE4HOs zC}0mni@MSkb7bIGbq8SsfZ2L=SJoyDD1^hfQ=x7gFDLRbf%d( z$Cf`gA_m3O<^WjI_2a^;#0zPGY=*qc7T++-%Q-kUwzhWnefwn4_g z>7uKX9)9FXjoc9uaaSiND&D8{b?H?FWmJu&^O_vUEKFHgAs5$}{qmpCqQ6&_zdI_~ z5yI}*h$NM+qu{T5yX$0aW?k3*gkH~Js?Uw=(z}(%T z3jC##B3EWd-FNA241)kwJlKZdhiQ8C(H@;XKNmV-}uBpB26R?U-JI@$_3&I)U- zLio}d`&j)AYzdsVWPI&c0u^51nQ=y*fD_70pDgTNKpkG`dMl}uVdPg}AOW|Rggv6y zF&wVhce2?TcvN|f#8**p)A9Y*|JwmP8AnxAZA+W|X%RG)SVq)~>Tuw>ZkO&*8=N7n zTfozIc8Yc?-q?fQ0u`&-u0KDH{o&U09kO&2k(5j#kpl$|*=a|t29Y(4b1~oFU?m*N zY;ATb#wIp;-zi#rR|Y2@g;3cavAXO)DPGhHME79hHQ~bRm_WXOM7JuL6s)9=#MA#l z;-zj$1_>oyYI>beE%>glBvT@Iz*LijDtbx6Y>-2RA4~MWtcX(-1;2$Q5$go_JAq}F zM_viRG_76xAcOsQ%QU4M_`g$0*6fKW*G3HT7YXB zs;1JFyr#4b)2S!r?v4AH|Jd*Rxsk-Kh_)c=|4MkKXlJ&8=+9{tQ8qqw_ZhYx0o5T1 zPsNw1z1oT9V91IY;A|NgHVdU~>HE^IxtYCBL~VYcRSU7kD-OP&0;3RW#ZL{79Ozf& z?K&D!APb<-4B}gjRad~ppRS;-6(q5w{3VB%mL}Ukmkntuhhtfc8?dWw>Yr{;4Xja8 z(O|k1srj-!FCQ{VPDvsVPWPZ;I!1{*Dg5_fTBD*5QoGWwa)WGkAOMxqeDHiqIa4-s z78I&=xen6!$~(}ch&8})YioCiV*$J?5|YrJZ_+Ciu$+Mf*pzB?HsQSZP%DT7Yxol( zNT*wjJeEj}JuWI!-)&wxUn(v`ssm#G7QrP15sf zRS>anXGDusugE|iQw{epS!V98MpXUVU9bzVhKWa#wxe)*7=?=mFk($Ct+6Fnt7Zu8 zDB{1WKWzXv*iezh(;`ZvQUed4Qz9JUlg8a?Pw}KZ!7<#`oBtJWK*cOL-Dtpa#G zZAOx2kQ0^+9h1+_o?0L+d8S?m|+wXEZVu&N+;-MFH%mKA5^3_)|itR(($hnbr23xr2a{Q5$zIB=`BM*U9YH%$F zm73lmi>V~RMTC_PULcmX!i$lL9(WU~K_E^7?`f1r_yT7XWdzJT3Jnf!F`^iA%=CaG`kAJ`9 z-#C*O`^@Y}rFHM>?~s@Lc%$>uKsERCn2Q0<<=?BQDiB{fDw`pT-fQoQ85O?#-Vgr_ z<^Q6x@3Nep$p1T>ko)JU{zt#r*wMhv!q&`*{(nsVo0ptY?vKr4KJoZkBPCSCi;4hg=0CZv@EF%b7UBtdVQPD>c9BtNjap5wrMtW zcEwR5MqO1YdXDz>SpQ2y*#NH$rbyj?s-fQM9&U5{W$^K=^pQ72}IIkyQC{eeCLrdmrT%Aiv5|K z@&J;xAPWKb?Dnq|f@ML~Z&0=PTlaqLc$?i%?tS)2P?$G@@?Jw)OxZzEK#tmfa9WS!Vh)`1YL7)f#D%ZG9CdnC|q^VBX?au9qU3l9gr~&q~UmZJb zY;4~W^2omd$wjr#4P**yYgTnF&zd{$AKy28FL(zl_uiX$e>5s=tZOh=@(*0E`k%5= z5HP|nyr@G7(t~Qx+CeU+Com@U-nzbezpHM1_!(}yKz^ntej~#6Zf-qtv#ahrvTqfz z_Q`qHuCjx8pXu1W3(qojeaD!9`It5Jw6t`svtRW`&O3+)?M_crfu~}@UFM0c1ia74 z+Sr-=cdNk_dTTQ3qCIvRj&E{qf z5A;0f_beNpZ=Kn*%}La|Y0l1Cav1o>)yl`@`_cHkN7d8!$Fx6x9|2vqwl@8rm$j25 zv7I;JCXkH)$eyEZP3n(dt#$!3BXf-q{bNnAeur2-pa1%PO`-UHTX=h2g9R60Bb7#P zJw8^tT2}dgd?kOUckI~wY%mA;%MBN*U6(rr`IYJJg|ME+Uh2o31TV67(qHnq3EJ*K zT!4SOy=JlfaJ|+2VE9h?VRavX64eQKeht9z4PTXT3>O$ZZwa!CjvR4H8XYUpO-i!S zWnDer%?tA3SfFdh^RR^pk6xz(t#?`t8*)Bw$*D5*G)3=D&N0<)Dqox_DwVeJW;@VCt=<=-Vf9(UKz#s@u??G4lJbR!Ce3yx&=V_&H^QXwu!zK5QQmjj3aJbx7hQC6#vIAXD#dAv7$$YR=nQEC`wd5Pl=OiJ?;zx(j%Qto>;^_Kl}45pb|N55H9^nyV^rSYd#LP*wF zlkMmaQaLpm1~y*=^~7M9%&V*6jM&U5w#`Z|W$1e5eAJM_wnF>LN;D2eCD+{;G205= ze!<+rTO4g781|9*lv^o?RRj&gH;D|4_a4?Q*VOg&EBu&0n$^5F)6{HK*c$?EVk`I2 zoNDpK3cfc`h#H>PF4s!=50judfHjxfk;dr}kqJXGVcU^nVYTy@Y3osep!qDe=qv39 zB?ee}A0glzOz^|P7&t5_@G1OiF0uq&)>7f<`F#a;@QNDrmVMZK`oI#@>*n6(;j;RP z&hP0>@(G=;=ryH>wGnSCoq47*{E3_T$4GiwdKo#mw;Q>5kGfLZHp{07B z%?P8v$!Ka^ss;(TO)cViI@zG8g~y%qRYq&moN%-pA=fZp0q`i&s{I6G z?2Ya8j70R7g&CJH0)~4iSRn0Lmn2N~?t&wYjeu1xfxw9%zTPrBju%v`E}{a8TyQ&g zaNu6JG6l2Ol9!qI37Gl4c6V8!Q#i7D3_AD?CUpLY(d#Jt)V$}aqrSi%%Q^Q*-R+AI zn3#75{N6(C=1tbBvg=$=gaAJJHITWmJ5swAjh--MvcDZAyFwUtLr83ddN@qoA{+QY z7kr^l>6J<`NV6A5B^M`AA8{$D<_rPrBH0f(Y~Iu?Z~%t4qYkD0wj>~)S#h~3pdSST zwtCi(dQg>su%!swsY0x`gs|lqz?sc6D~ZJt$)(~18I7JWSHU;oqsg+*xwYCDwH3rl z#kCIHo$(lghE=$4D|HPwmjQRMIQC=l2n?>?-LQNk9=n_AfM7$Nul8_x{|!??aRD5a z25K0zgS80o@kYjjm-%nFnfBKTs#-GJvpjza44)Z0Y^n`%yM(S=QCVXG5Ul%RVAl`()u};l7ych>4&h~$pO5+d09Uk0FYA## zIm>)eBGu3c^UARM>&$!%uydt~XX&Kqsq7NvuprR2wMy?}x|1F7cQC;7WW6mHZh<4u zq}(z}joa(3ftIQHI4v>P=05|BGVpIR(x5Cz0EAplBV?Kqzem0$N$0tAG^mLwRlSr| zG~X1!IWNUD!g6@J#qo6oHx!pA67tahV+ysLac(SWEWeO54ucLD|P!@tNATVY5wY8>94A5Z^a>g^9zn96adK}ZDg zb5HB(NIw@{%swmZMB+9ICO1qLYT!7mM8?+j0l4%x>JwRMNJQadDI8#sRxoq64Uf$E zN}>*RMAG7XKMLN2zt11?oU}sL6_~0f_Y0>_=+$;jFSH&M#Uk{!y-@; z;X40RR4L{nYIkrxMM6Eh)!_jS+QI{oje&S)a_7`BH7`*c6dzXTsTGM)|2o{ZrWsYN zvCk17oIamaAww3dI|JU$pjsa*5`!R7mZdSgrpe3$3Nj9GtNdsc(_Uo_!MrA(b-Xhs zzhX2mnR4M#SaX{~f!8u9(P=j9L;y#`q)laGCFWmNS?IrlW)TLPju!={%RjwIF0zRlR4HjmTHxH*Eut%wW!9g-M+0 z*jyvK)d_Py0^J-}0_Ha|x{@?$cJwUb4*Q8!hdg@p4<0Ma9>D#+e6uMZI8ArZB6dM0 z$a4~AE9!Wk-nntm7GoYOH#H{|b9jO)KYNq{`B()9#A}_WN$x8jc0&9zW<((Z;Anj4m7#`#@37??PaQJk18xZIJw`69K~kto z{1>W57)51AazYrajY03!b3C-v;*}Q=(v~|K1 zxd-?%Exm^RGOeE2HzTVwq^N|7bKyI(j6@uVW0&3h?Jt2%YD}c?~)R_!{!f%uU(L<05ICcl;W{MZIHs;<`J(s_L$eJbZ->4)3okwR`|BmXT8%|!V+hJ1hR19gY)6rUIv8Iw90E-yKz{_Oa*%s!QUXJ5noTf`ntpq z#!EcI!NMKwNvTNomN?-_25Z+JJ3NG`e(yg-9S8VZF{~rC!8W-fu4N0>IJ*%WsX)UJ zl~>anGyVO6yS&Te9dN0a0sP%oZG`L5qQLvfk{a*B1(2( z4K3;9yE?G0Q=))tV9$yX=FU)ILWR`o&0JBl7Nn--%#gH!H-VLCd0}2ciW^4CNOors zDF$_tCJTU;F?8qeT38CfoId=iSzcO>S8h4dhe&MHxMVo`Mz`&dY>E?5sb&fR22uRo zaz^Oz_jz3#IYE}~cc4eO{)xya>1QTDQ({ASZNBnYu{zCE$e^oXKdwTAxGzaSk@Ta` z9@|A`QZiG;OH``5_FvD;aJ*g5#Numq8YE{Oe3N^Z!TFO{z=Nn!Lg7d;;-^JNzxopB z93B-~Oi!7fU*L&mqa|83YvaaGurU0Ep%i?9wt0b6hC#c~h(c-lNCDRfc8$b#=~s7J zyo$7vV}cAasg#6$AXydC%7XVW53~r4;`FyP^WokxA`#OrMw~Kzk4hfe7PdgJZlq^j zuX2#lQSTk$i4^1#Mg0n;%`k|lur6`mE2sjpv-=Q#6}iS0vXPsX838qC{l`ZMdU!V* z;tWOYL-|C4@CHz4?7q}lkAOH1ta8yopncurYCCknnUuti0GXOa*DANDC24^f`9o^Y z*@}a7=i_XxZWaL^bQ5ucUx0aR82=w$vb4g)np9KT@+bh9){v@NiOxFqMo7KKl=;|3 zTAKMd`?n|@OZ0KQvQW~(Wtj4CsMNqp$6bo`AC@`yu@N0Uruc#v8j+2C!XVQCsb@Vx zs!ss@O<>K~?x8^+ZYOFZwbD{*HBdgFJD#yvTXB7^`z(q3RNnHRe(cwcO5Iu)0)b6; zQCBeF9v7Q*lp1@Lf?~D*HkQ;R`=y?F#_geQK046TQN1rrLHaXvTEl#n=lNrSj0J^1 zeL!-EctUXZ`C>%ng!zDE0b0(K7xxQ7Lo|S40GUC@H zUs+|Of134rTU#)c9|IyQEx!EIs)_$oOGf}A1(3WbwoK*dM7F0S)v#9Ry)39Wky{dvyWWz}*`G;ez8`z#B5z0W zolGSdUK4Xfwgoa_dXi?PBb-jA9r$9{b5S_63-0!nVxfnyW_S+Oume)*han?Mnh@j3 zyCuzV$QCnG&cCnXXY-xA$_I_?oZ!1puBA)vE%0=&mPCJUw9+=Gvke?$i=~-OUNl*> zIirP;LBhdqgTG5tZkl0SIfEh7BtRP`qN7s5YWAT`1P%iVMc@xes;@7SZ^*J91XhJ3 zZJReFVgO)3_yJTm0s>|cw43V{EXwwvzbD~>DoLblp-7T(U|fX$YK;7yUO`uJyJGzz z5~lbbZ}bhLb+)+m5kg#M=cpbVnQm8jpB`DHpHum^^Lf8XP;N7&*|fmGbo1`B2(z(T zk6#c42g*;1uI47+=+o!94@WY1J!C50*HCA~C0{G6M~8Ie+kb8K5a2!sV3FX2#4wiE z9|9&imUCx+yJf1XZSoJqYv>UR zgO`vkOQTbVQK~zyCP?^i7%YGB2IuCLSpIlTixR8EoG>43`{s!p>7k2O{?SS1M@Qq0 zwIg#OJA#H^;$Lv&CW+G_aXcJ#S7e8hzR3gENK2$u=)6VvWgV48kLsi)|M4^TuUEN* zu67KQRrFMQBv259f^__j$4A7KvpZ9{0I@gvmGW^D?j7ow*;!CC_mLJ6Nu9^Xg)BhdKUIO` z?E)A4RU}*||A#MRjYzjLgVS=n3;Rfnh0RJUD<;iD`!kqAOTTgvBpzuV?;+6(zEqb& zwp(W7boof~;YMyY^R3eUd-LDP(V-`mHy7!Byp%j1pcbuKQ1EH)Mho;NAm~uI{f%BD zzo!g&ZCD?p$jCJn>xrcE;bmiFsfETdL;k+@8`Sin3$L$&7JDz zWOjUml?FM^3p{l(hux;3B3-IQ=#;Rl#ipngkDkJGy{wXj$)PZC)Ef<-!)rm@!mb{8 z=BK8HHWTOf5ug&J^c!?CB^Qg5MAk=;`{0 ze>CpI)qF>r!ultUzh55gxSstGk?%HM<9t`(2|mmBn4UhBDCK>M08I?J?*8vRaSFPl z(T(yo8t{u~9=0+2Gqg6HvmAw1Qa+OGpIU7f#MNv(ILL0HAsCCaZp6DA| z`s4r<+_tvWixDcs0yrbBW_qLo*@;(=W-i+JCbx4HaD`v&I z8-xs9cT+%$)bg2=xY)H)OhV_Dhk{71{ zi!nTBSk!~8oRjNg89Nl5ZRaug$CXs?5IH_oNqG~amJ(#+7yb4ot5U<>w#;93bx=8* zJ19cDOYZd6H>a3;iN~N7?#<{BuhxHr;^Rl<^KZgz9*5nz4te^jkWXc~FikZLL(B6= zgsfspv}^c<+Vi}nl~sd6ed;>2wjz5}U?_UkAv_G0@pYpKVd*~HfA&F)jP$ZYR5)Jn zu*(J3ZZ}etMS8e?u4i!ii=;9-@Lg<^(aXGNKtMT<^KLZ#RDVY*#K%$yTN%C2*bU&b z+|lp>nq?-k0YjRX%t{OQHls6Y9veR8wVXRNU&6jQ?+8&ergDoL{`*bw2UZKnMOsDOtnfnIOO6~*(#Z0 zKTuk4n}HedTDG(rP!PR*l&pzGqJd5Jah-A{@bWPtntfZqTuqI{iFK-e^{ugnq)sYL zhU)IK?&&vYje(qKVG#c^Cq9MJmW0d9G|m7D>jc37CDZ7m@8AGHkIW}YG5iGY7DI|O zMgN9$3ZGL->ULI^0C%xXr$?NRh(D-ZQ?7EUU*}RbGB&_~8tvl=vx(C{IC{yl%*`7tx6W;gi}CwBKjN}3D+(>M>@Xl= zDys@EbuoTb$!C>F%UL)bP>A03m*Bf)z2Yo1(V5~0%ouQ{)Q{MjkRsACdd5#2MdPF1k3Q?OWdgtn3V5? z4~_sJXK^+N2n0KZm9GuvFm|@kg!;QM&E+aE~?%7V>Yb4KY)GUk} zSdaVz1AqBh{&jHnQNh2}`NzD6m(S9~FC6scvJIYyOyY0hYP|mBV;Kty>R`&pfIkWf z@>3zqA&&+HZ>EwE{#B=^e^Q5vT@PUG3SA!w8EEDd#)Wm&y;5|C!raV35J< zGwuo5U3|3^u-v-h8jlk$iu5D6OVf2P`QUGPe6>Dr$1lTB>Pu@2{_pSHbd7RGw~=1Z zQ}aND&gOAZjwEtS60ohJ0GFn!ZZMX!D2q5XkWi7$0K0V@Ne$X-XJbxZ1?VC>aOb2# zM%&C^ED-2J&!l53_{6FNiAdDlrvq!c{Pklxe|mz=Te8H@QQP+mZQ#E8fZc$UiN~`= zuMMvUb9{4(qluEEe#*+7GF5q%mcXgUi3BO($OKVBKm}AJ``3r=&=S45eGp)N+xh3O z!kyL;d47#=NtKtq?<}3mOH&L8t1_j)pyi*UnPVOuh<(VVxBnW|SiUE;)bm=X+AW&cD*r!{`?GO zO27OIHRod9hIoH)Qm8+a2qbu&fd1fb>)cw@ra9bA<7v!H3!}ECbT6Z(jv7-TmUzZ) zI2RqOkATO=E?lF|0h}Y70ih!nvR?L;yvflbKDW1|H2dk^ zkiIHd{XRIl3~-!yrG4W0iDa@wT-5JCG)$Li(nUAy-yzblHusWxJeYT8cd8< zKlfpNW%$W)p*h>{!e%pZwlmbs-8 z02)$>r}s*$|1MeO*>oZTu_L-7!yyFF2kTUeLj)`?|IGCCamy#o4vX_he}{~gKq4eM z;w0Em^FI2_7?XXO(~HBgXVe!}PG1Ey!zY8w0`|_oxccDx&yk4>K7*7wQURlABOSr+ zOyQWVNL z;kr`2(h=zSj18}!!DG22K^#1q{9Fn81iahyZ3#tA?|WAcD^}AThC3D4h4qu*e4<(^ zV<8Qen6BW?*vUx*7tkdtM}hlGohnoqfNRjP?#tgSJ_Iq<1=)i`0gw?#ZHu#RF4F558rcKXl$0ocYY0L@P)d^ZU_{&MBQJ^_C# z1y=JB;*+4HVQ0vMa2q%;09{#q3rq+Rrp1G}+3)R8TG12YrlixV{7htAO!cMwc;My$ z7Q|AN!tgP)Vdb>DJcEfDXZ^-UDay#h$0K`gMhE=6wZaleGakly@jA{I6RlRNK63KV z4W8lO06S$y_F+xYQ|6)ni@J9TldS8~wbRZ@Ta~tL+qP}nw#`bb(yX*?+qSJg>;1a> z+WYFS_ui-fK|~xx#EKcunscm(ImZ1AQa);og*7j{{Q6ooUN$;7aOS8{)5>_nfHy>o z3C&M3dMr6BTfM9<5C#HpTw;cylRygq84i@FE4H-c6gX1{OfhLXAMa=pEl<7*bn;2f z@H<%@ZJjJ;UY2^f0jI>MmW*cn=d|m9ok)BsV9@Xw;xc`nY31yA?=$H?S6c42ucL3V zx`O9K2acx7m}njyHNmTu_2$sWSY&VYhG=x5B3Ro@fJ(h~utq1&AmVO21U@7rlpfM_ zQGEaiVl7R&fodisq?P{fh}qa!~%3j$@z^%!l3Ye#&&DSPg~vndH}Ad%>RZp{ z7Ds{a`H_tCTL4jr1OrXNScOOdX`JY436H_NCHs^Bb%r5UIr0R$ICX(VhChZt7>Pt& zfhCeod~{j3<67HjJ>Aj*p-Gxx-;kjZL05cAHdw%lISiqn>xEA^@s|El6WDq0uA;}V zy1r}P{fxj<|LEF16P^hsE$?J|Gf66u7f2Md+w`syb`N`bj1yX2?S!);C{T2A4{m58 zQ0Ny`$FZWljS$2W)Ru6~meip?p_$bkR2O~qIh~?vD45;&u!_P7;2LMbO})+gAN$Uk zA6?+}?i-~Sr3gYNNV@kFr8mg)3|O}615#4vykNk-p1p$Z`!e=@`oG*}e-B-uil1hI zWQ=bvjlRt^xOICb3B$<&-IoH68275$55-b%wat5Z%79&_rGZ-#R|Ry}QN{2ZK=^w? z!nj~B(kWjC+;-J#v4@&(<0h`!~Nq( zb8DDQW2|FoA{AnV=2=#!9?_{vy~|az>V))jhzA0n@G2w-3(|nZ znI7U>-|r-Y!94{}l@yg47sVxpNl6b$Unx}oBp|7SuxvoS+EhK!6u_}T#xQ$}N9A5h zQqq{$P*%|92`95tV<^)p_CpZ|0dpQ%2qqGfcvmt{a6qAsOXv$qaHJ%KABl;}{Im+O zM-35>IJA9sA#F#!8u#tO4X1Sf0XW_n!qJ)Q;_g$_0) z9!p5>4s%yRA`8vUG;5WS1(A;4nY&l_MWHSt8~+XhE>|X~3mxgQ3Rw zD_bFD#O7vUH)RHVW#-79k$^%@LkvQ=77)i^$I)|K%^8Q3sby3=suNanvw zfbGqJp#`?mDACGZRM<+OtAjbvcUF~2p3N15i{Tj9i}`qOtLk%_sFj)F+%h_4Bj|}t zvYHxNjTIt!F14~d_B#inxH|(t7las5ItED3#wVBeblg3SpmW7by3GnUamc$XyhZl$ zz9igW&_7msN)p0L%M(7pH0+DsNh*(D1k$yFNGac8okX4=Ss~qW8>H(}(ISBKv`S~K zlWo&G_nF_4yt5aaLF-f=wl=L*MA3Z7>pnx8Aqw_2w+Jxze9trs#S>ugy#h^CabP!U zh8|)y&?DOg0zabk3mYrI@^HPyWt&N-sLJqutPO}U>fZz-R%$LE*>za5*ZApOFSz;) zbU9Jn?>b%HKM4w_|E=1oXn&0<8Zm1eZ{iia_fGQ7J&3Fm_UD)66qhA?0Zn&XelI&D}qfeOOeD_`V_0QBgSeM13Xy zHyG-50lA}-s5UVUQyDvw70BfvqcJ%_6R!SP1!l|H9Eyx*zAW>(r@)Ud+V5)5e^Zu> z)K7)f`~A%S6?FXvJNn1y=NokWYj7iU75pB!>`BBKDi=YlD}ld6@&O>MvzGrTVb)Ci z@^-u&BoNbQxJjq&tB&>%8Ei-ZU1`IIAIv0_LFJXr(^Q?S#s%vm9)wyoJl!@S`4k?R zsM*`Adg@6MsfuBn(9{|caV+4OCD0+E2Rm&8J{VT!6iD%9{8fr{9 z)wwe;)JO@BLd~^L+qn+kH|)ES1n~{~?#x@WUQo)&ScDIysVn~j`{G6G^X{Ijl|(6x z#EqU84kAjqd|m=&2+nb3-mU>|^p;h11Upjre}UzC-^=;4T>N z5%+sF`7i9tta(KGfdDDBlreC3`3;x-ckGORG{t@GdlpRp-*9Kv|H7Rs;wL14>EZpZ z0ZR#|IgfcFKgLE2s_@qo+1zkz;87m(zqC*2Tp>*0O;O-_^$35#x_WvZrW_p<<{k{|STJvHN*lbjxogx%K>IKx`mJHzYB@35zAbyC2l4Yu?yVf5D1_55x72K{3yiinm( zYSbU(jx{1FP-~tBjtsTI$7IUAq}somsnOkS^Znm05lddUx4!>~68~on{!N(pk2Mn7 z1TxkV#8+kg3RvErB7B}aZ6kU2v{1_uj2k-CuD?3>#8pO1g^i@XdT*h5aYr82Z)!!C`-UkUJ;KbPCI|!0A&g- zc4s(f25t>j)b@lvSiR!kz-^)Vx{~RG=gvv|%8K8Qg-nzr>bVUec=)N>NC`L)uxQyd zIrU12m{!Fcd9?A@JnFwM5-AM|kN>xc@DCXOzXytc#mW+J#fSqfiJyOCrSiXGB`f~t z+wp$}iisO~+0&SGK_X~yZGVB=T4*M<=hmD@+wUdfY!eZLifY8x)RuaPL`quJZzxs~ z5xm?>mazG+Krs}gB!+i)Uf9o-w*MZBHQlbFY<+7B-auKx;fi|O!s*vaQ%3c5_16`^ zN60tx9}ygW_IUBfJH$n<9{d$SvuUF7^B-4$Q};KJf2V=b9TUO-n+A0M>tguV_2NG! z!u0>ogXIU{Z79|E6j3<@0D%2hKyY+&w=(`0JfZzBu>Cp$)aDAsg@D=Zc1iFax)k#cFofi}leAMp+8X=7@A>+gb0Qf+><~^3hr53|VI7`|y}dVk2IkEvh)CJ3E(jYJpYu>n0bWZA9pN9#$<5<+K_TpD?#i1~g0ICak(C_6Z)e_L3SQt%;BDA=FSukog@5F1h1Z zugoG}bTV4xr;h~pLiqUGhq%(=ICx4UsOcbh#) zdykjVr~vA}B^E!DBR2>9IkOJ4u@Uk~5V~E`;~?yFID+~4m9WpAl-#!FzD=FD485}x z)*1L&;YNzAQ(B9}s>>gp)JirkMl*L$5s?UtBq4NzqupcPUKR0-g7Hh1cU@N(En~*8 z9Z3v@X5hD#GAL&Di~h5a(cO{(snTp>J9XAGbB4%E>PvqxNo)hcJ^udlbj zP$J?ZBP!kB z_}_O+_J4p*tpBY3*0ie(m+dLlw*zR;&D$=o)P9elE^`VPoL4`_t0=3tz!>l&-9=)C z+~-T%T1~T2IT7*SI-Oqw1kT}70_KhS0Z8qkixVItLbjZy{SLE|rd^1+h)a@gB;&_Y zuQ(@Dv|cNzYZwTe@-CID3Xb2jY+0t;UMw+X1v2{{CG7eA3vIN%<2 z>hMRunV@W!T03R-7=bblB20Rr9JTp|C7eD!4B+%4eZ7laz08rVRa}-0`%DJw!WtWBhb@%%B`YqmI0}o?0XGvNwGt;522h zDL8`uDxLl@9JlskT}vUM)z6^ka2G1-0_zfPg@yP+@3%L=WCFvV7rqGizZexcYURSi z=)O?ie}B-)HCqgI!GGfKw=AdnOQ@s7hM_gTU=z^>a|u|RoL!{V5*9z^8A8he(@r9x zQ{RF3Ur~NRi@bWG(!9h5Bd5Of5f;Tg4o^~vdj^m5PlIQ$XAOslN>DLO?(sbO`quG# zjVI}92uyC27%E5p{80l6>fkaM zXL2AB-O62%%6$z+dV>DtGnYjtGe&)z z>?dw-qG5h!1{?`KBy1z_4%La78en{cQ!}p$6p5dQ-rkQW9+1$wl1b41@P1J6nPW0G z0|(eEu&}=Vn?Pc-mc_7iCi7|t*cn`em7e=+oVT82VSYu3r#Pmf?&|6SNO5lEmCp!9 zP!Y*YkqQqwCVkFsJ<=WoV<-puy=AybtPs$BQCX@VPZSuB_|I0p%a#j@q+a>B%sZ}f z1Wr8$(f6P#R<~NTG2Jdo{WT+V2q?eMkbrkmd3dD^4Bqw$7JU$MFg7h0-WBl<=vAqZ41}nxnIP$N;ve!=j=X7<0JxnoaTz*%(67-ebq|J^)g%;W~oZzXT@A+I53n^R4;}^x5 zqi-o;iIYPNZb_*@TTc zyxD}Yq&jZ|1Hsn7buKl=g{axmXAR^7IanZ^^AOk=% zAkTb0?E9psHRNsF1F-5@baTCiWDN>jlQIAgctwV8;6TwRS3x&v5GopRL#Ze5QO=<- z_#uIvNTM^Kccg#|+AnY}q?*qGnDwZzc7KvPowjUT&8S`Lq1P~e_o!}G9!ljofdJFX zBNw}?u&X8p7z>pQ%cPKX^SDqQhE%>25>yLzD>t$I<4XIHTDs&0)L6b8F+#DQH}tG z@&b4T5o7a0!q=l8TCWenQl}dt`{u&uMgxubg2gx{t=KX6QFma5?ee+hl+JEqfPS`# zl#0Krf%M3@;34?K_t1MKpRb*aaD9104xzBox;v#Dc>Snn>WP74qi`RkIP!JdD&vTY zluH?EYH7BMkSclL7H5vxQ0IN9K?9W$v=gw<}rQ)&SfGJ zd1#xSPA9*|BSy3lSsEEl=U5krVIzXkz zG?{T<0FFPXX&J@D>NvkTA#*!Pct`yRe%hJ+5)0tb259xEKRZ0;-Um6`fyOmgrG)!Tk`~r zq*q{zGge=I(fOx>|AlSg_Z1;w18U-=jbTKuUq@2rp<457_$ zU*ssib^88eg#-yy?4%oQiqB@Ru;c&)Z~u$r`BpFyL6yUCRi22FKgrJ|YWW^6S?~a) zEiTYA!>f|CmsbtDR%2GHq8l^h8n9(BiyjYr-I9z>ZSmSPgeVkMRW!%_Z51@IM&Tg%~eF9Lv84DyMw}D6>f=>sy_SXbx<=aHi&IWC;?shH21T zBP+0lIo1=fwGpM7{1~KMtzE)}_f*G&-t*pSOktKrU#%`Se_Ii`l^<#?F4LgWfK8~F zY|KvOU~ZvRWeHyxbWX;A9JH7US#AY-5}#dfnxm^*BfSB?TIsCdkEQuo&T9d^>NzN^ z7#AKQQDL(OS28JrO=~&yw?*4zM6${`reU~o*I0IJkf4P`D} z6$XpyEeO24Z6?R7w2?YhJnUCGQp~fN$jYMtg;^|6!UBWz6}F}OPMEj zi|4g>pU<7vm1G#r!kQ==ae<`M-~z?J3ibW;@}haJM>LFCG4}1 zQNA!_CPj5rGd6|0Q1Vv*j-CQB&Q5F*zUZMeZu6-)6?FaJU?&v}{m6rJnl0YqIFaC# za1@J`Ym3g<29r)5zp+p-zaHjJh%?N+Z5iT;A3iW~#YJ-q29sYupDPZeQaOy^mx#@}Io;i$C z@x2SGI^eO{Vd#!--XSONpX}`|C?0WV0e>8l@xTjmpAb0r0 zF2vTC!R!rAy~&p~16IwOwRKNO?@x+pxABkQC(OgCHeH$Z+ncU;_iN0am8nN%U$Cvj z_B4atl-Mtbl;7{?30_CBUnyVl2LrN4%&;VvzPww$tv>Hu+`KKATe{g=Ue~-iTE6YR zTrX}nc3;nI9k{<@@jk(`^64gRHYaIFE-9v#SPSG?G+*LVvqgHSr0b00e@!NsB~hXF zjN=)f%|9Kkj6U6wVQ0qxlUm-{cBLP2RmGQ!zINVKq}&|n7&y?{sWn)|?kD~1>rzql1$c3w z`rt*B2<^&Uy2b7E4S7c9y|B%dq+b`NM+Q@-7eBdHd^YNw&k3b|QC z(lS7d$%E~P-wnd((ETY4zb*{7e7fCKVFJ#nW(4K0UWAa%AZtgnmVqIK;59on<~ceB z8pWBbqphx9J+udF0YG*-QZPZS^@kNRy(L`AI^5Quazp!*taQhJD!R=DZV(j*E+G++s zBk&)F3+_JR*9k;S*e+=R7Hhv0bP6%AQQ4yO=khvo(eYX6t!Bb|VEUy(85j=t7F8}+ zo01Z-KSp#N-T57yO1mq12*4&|kqA|6!wAbl>FXPoun7BgfzE(E&l`{eG1Ah17#qQ) zBN!lx6P1V=R%ym10a3frr0At*rL!8Nmkq@byTs8GSf%RU{6Zh+8+Rh>!;d1qhA1Wy zr5{w-zLBGpld46gT32TJG>sW`_$h{nl(7k~t^j+7*TYC}V3iXz5=3!D0>%W-j59in z?LKXh#FCVfwJ%t8$Rp%%kH3XQZygVu9G-Yre4OCH#%U!^Z*YE%$VH4b-970LWUlv)-oT3&(>ObrZUw$0L~c`|F}mDOHk6?* zw4F*TW!nLfkRG0AT#VnL(1iV#JrYZe>_|kYnpRl>_9%p!Oa$gA#F`R+J}vV^PUJBT zOAL3W7wf~&Ck+X+3@Ud!ic#7~A(|sQU|LLzESC#b##Ekki;v9}KFgp1ekyP`+WKBH zvU7H{%!p_JWLK*$n+Vv-8v7!=R%%U%L$x=$f}8HFC4}(T?`dr{uevlcCTvJ;-ZkbC z5z}7N{mvZzGH~>u3U(!*p3?AS`r}NRj<(NRau{mxEswB^;;?ri*teZ|IdwLkz%J}cXBFn&Qc zKQ9$6Mc9DLVLvtd2?(Jw-xIJ@_5mC@a=jz%I2x~_T8QSCBx|a@J85PmJzgqZgb6Tr zgoWH%xK}E7Vvqz~^(d0VlCnjRhiN|&FNIi{m&lDJ@D zDsg|U6HSo18d->Y93b&IV;}?}kXIxi@hA`n`@AK8keL1^@LnA@|6Apcg}$@21W1)m9k6<#nI0ERJXK% zOSxnLf_3OpOzFXvsYXe%K>g1%O?P#-KO=g zMj11qejB`&Og18OM~g#K3$rpRWa6xtJGuxQALvTMHJ-;ipYITnpZJmLLZNvWK4`SdX+(mb$783OQM-`sO5Q$g!g44zB74Ota3V+%ucvW z1hx;w)rZKpkAx3^b;9_nFPLIy z2zq=MK7p`U$Bb6%2BIp&SnDs`<~fo=ZI^n(qwuYzbZ(mtq%Qcx0l8uM6iL7yJ!3(| z;p(Z>-=5@%CvxVYfKV-gM0iK3X!Wpz$`*iPbohk=O+p(=Wkwp;9LCH1+Y-?;mb*+W z6wU}v%v!fH(Rc4M?$&|pNX0kUV2h2+HGK7t@Mdt~+e|m_WsTY#)9viwN6uQ6ZIpqX zhC=4qMH>Lgy_qN98^6vcYELds1rz?PsM-FQnec_ZUaC904Njw&nM}hBwag9_^xBIEkCuFsIHJh7O%mFP?^ zA(n@Ouy?x6ppi@;tNxQ8Dt zmZ#ZOPF&;0$i{bu9lW4sJLPW(SQj53K5OeuYbAz`nA2iQ*r$N2TfCQ39knj&pJ6SA z8{QrqU+w?2w`k@)53OD`qvN!x=Hba&t?K0D>*@+C+{9da9qWI$@48s+?7$PCV;u^S zdDEI4V^{n35xvL*hkC29yhQ5(w{MI$r|W82^!u#0&G9_Cv-<9D!Tcn+fc--v3yhH& z$kqByT%7k3l^;ap?Qq%(B~ty1*YHuWs$x>K{?ha=tP!`^*SWr})wcZcdh5f+4a66~ zb(#6;VNSm$*cg3?Ap*2vasA!(?VEk{b;Hh$fN}hjhoF7YxykZ@3I?TtCb1A@?dfOQ z`?X?Ujs1gdN%#IC9XFlhuvzwF8dut|lxHzX38_knaUx)a62+h#K(!n`bYMANm4ZYG zq3TeacTuQ2m$PILit{Mn^B{a0K^vh;sTQJVn3CC{9B`?b8>&~67ph80UMO!kflRTF z(|Z>iT#j?jntPsgN&Af}a5^~te5x@6q93I}pd}!wX`#T=tB<*xG$|Qw6lPvZPpwA) zj^^WqB>ML3#nf(%x-3Nm^pd?if#6XYr7Y<2o1R3C6oOIJq?i7Ppj0p}^YOy(WpMan z(Crjykw?=X2f;!{rr_hXu+DCKqceYo1ohOk??=LlvB2Y;aW5G!;RGBP5l!lG0DKph9Oe6O}W zaz;h7qOC*XGIXYpCW2&W*hn^}!&*uO46`~I;gipoO7((u_$Yms9SC`S_+o}Ay%n6V z^Ds9d{cm>*T1aDK69FY5AH0-810js32qhYMDgz%!3fK zl$N}56f7n5{9u@1<4gIVlSD;ic#z9E!ZdWdh>w{Qd5mlZ;|{fiQBw_uTa+@bVzvJC z)gKlhlnMxn7{TLTOJqMIMxEd3x3;|v$dHaYMd4Gro=8ihWFRHFf+ZE`1EL&-DN=u; z+6TCt3Ir4~fZzZehq!G4>^HNztzA3Xcs}c)`1pE_l5I;$np%rX#KbB=GC67aCnQX` zpp@;-R#B_<-_U=l$5Tk&kN&)iyU{NANqPT~#{LO*mEyG2v{6v<$W8UD#YkP=1eO0s zDnbyIx??I?Ld_;SK_?Mo$gC*ue&uly8;VNK?(56SZG&(ohz*zw`eloHK-C#Yq(--SvmCa&{fc2?!2Rj|sht3DNWM5vt{Eq9de>r(m=6sEHx~Ub;jG zMqO8zbg&IR280**HqocpV3RtP5QX8yhG~afQ$7R#S~<)QX?6y$pP*R#EmAf3NG3U< zQ8o?RhKeuOZ-#wTYrHLz&)u}3Bj_wmEJ`AW`UU0R<8=blj1RT~R8I`3;b%yd`je-< zOG1Evs&e^bvB$ z3K&X4mT$-=V-VOt55|~1NF1LD;<>&LjTI#M$DA_}I8Hpq#3(1WD3LlKp8eD5P2gK8 z11ZFWlbCD}r~UZBJUzk|dJ+d|ieT-EY%^~K3QrSU7x5qX^w6o06}x*xDID&29%=DC z^dXdno*|?0(YTL)55aJ5qF-YD(a_iu9g0?SkoCT-hg@{1Grj#;H|8W5<;T#5N zneVy{$cqwFPew189Q9FZ)FU5HPo7=sm1kv)8=)O?5IKYoIX0uazARCnX{mvQmbL3r% zkJ+cXE8LqRFK0I=!s!8!*g1z6Air-&GqDqST8AaLTWGhJXAr9#<}(Ts>Z+d0R#V^$ zP(juC=O&Eo(Mk&s>&Dev*Y*Hh+QOO*Ts7UXsuXHZ%SA}lCfs%V?++UUCp_0b2pGCy zEib(Pwz$Xh)%#`Wd-uubd-v&o`fdBKei!O%4r?s%f1TI)3!daa_-=MX6tc1j%UOP`i6p27uaqzFum6aVcA?vJMR-f$lgd z;IK|K@odr-`+nB?q{@(L>*6*abh4{No}`v%c6Pnogq|H0f6Q|$Df0rt4cX9pAHU5l zSS?!PmJ63a+6^t8p%NA~sbUb68_b-@QtPYtC7z*YKAoZ#DgeGcBsWubFbjDm!iD~BTbvztM! z-&cwCmi3+DTuTwYY5QkT>{BpdOKWtSM>&AcPHHK`60shSX&w_C(O0XqX-{HkU5By zMXHM-8AP-DuC9ttq@0qRw0`jDE#ss}p{|Ac?e?(MI)@a#uEu1eED6$2oBzvU#vRp9 zdCCsH7n;CtAyvmG!6uiOtD7HO!KZac+=<&0$lC_KK?t6z4mjg2HyLmunXm9}t(JU= z1eI|CB{R~`sYwJxP-vVypAMqRn`nhD0V9r)4y2E}PmZbdPLn*r2Xzj@!`TE6&YJ=^ z6|ZjUrHGt@w4glUJZzYOfvU(q*T!$v&>hw}t*-kxU+D7|RxgInGAxdpYPAW95rV zZ6%a3lqx`%T2(-@$22;QBu>ewB^TALjme{e97e5K^aBZ`GXhi(5CB$CXW-tTV}U!j zg ztWGvw-Gv9tose!eXQ4uPPy!f#3|Dwu(>ksaX5<=Qb<|XuL4ta5d880B0m|^$WMSB# z=QWEE50l`xqnha*qKmsEqMMM88ShVlq3$b~~sZw#wyK4YB2$rH@RQ3UATB9U!C#ZbxZ#9;1xlX~=rLPDpKE6j(qdJ=Tf zHk_=--*d-@C1}$_Uij1FZ?-UzL5jvu#iiMM(ZO>4+Q>O22i{is=m3NfXBFl3f1(G- zV}noDc-I;EOOAMqxsZPh=l8s6T%@aH=Zz#pbO{XG%rsL$lcIZQtqNh_}B zh#k0ga~ZR_2P%LjnGsmC%d=j>FitwQwpL7T9*kr zDksi_QZ@D)-^B_O#PZLy-Zbuty3UU&UlrYTKQx-29%?hsclP4nFM-HQ7q(31ZJ#R& zE8^lWGjMsT)4FiC6}3TAkMsdrSDB@4KmE$YyYPO0-Y~Hzmy~~~eL?FE^G!-?_ATK& zP}|URGh1(^IDa?WSXdiq_^454)v4bZ+nM8I*iczxNm&+?FKiov3B$(mRj+@@LuB09MM9r*SN6`vej&g`d zNmIAq&otw)svF7~RcNFP*o*nck}m3R|ImHCI^G#uU^*uzy%CubYo}c`uyoP*ei-}c zFF1PVH_-d#RiGV~nNKpVRm~w$C#)KnY6$FimlK$8n>sg~ISMCsh*3DKIcIg#BvddF z_f@op2I71pa7$F){-G$|E$P&Ry~12^2OrhC;eV<^vWkX5Y=O4upm*W6p=ciVwVg^+5eO7ZHYozQanl z4!2w#Yk@z$iqbjVbPYV~Fg#BO_c=!^21aI{FdtR5A)0QVMVYt@e!($|de!Y2?E)^^ zaCq#Z{ES{M*rGH{op&0z^{w-E1Y-0bBXRD}ZOaQ7O zb8_t!)o%I7`(I6NOrInE2cU=Oyw2 zWPaJJQniKQg`*^t!3}wdHSmXd;?xO;kt(}n#~A!X%97J2VXfo1+Oi~=EXXut$a+ZZ zKPEXPAt}_tFSpINSB=`s3n$nRqM(v43~m0t7up7JsYf3Mc0R_xwaclE1d{$4KC4|= zXABf|nn97e6p6}bT4Bsi_p zcTk%?#-$RX>^hmCu=f`VzFR4m5Y{APoop_exe%;{Q|^)(q(euJ=lAOr8ZTdR!SD;2 zr_sMhe=9d_y|5kE6NHzKcr=5Jd>pJ{(17{}sz>(ul(BiY$EKg&_B$U-=Jm!eTq z&5y2?hn{MYR*!NiJ`7k)^WjoUpGHH;7G^ileOdA=#fNh(YO6sJef^BPayZ%-^OY<& zR9O^}funPjTW6wpiJ6nXNU1ZLj#POZprb+AEo2=ui72iun|rs?X+&LF4n^ zX6PqcdLKQ$+gB9)AEM+xW&agwYYE>y0lj6FKmB*T0U==qjXf=+hc?~ClqoXD7z2$n zF>4^`n!UU=6ax9&Y|7fzM7&>1o#(0XQ*?ig^?DdNC*F;XlEj#5o+sQ0`mk4?^ZIOg zr?08Z6{iYnTtjQF&{ouTRr!9Jzx1EI9geG60`?WDuN*a1qE@XLnW_{=_ffh4j>Rt- zul5>xJ7kudobYob2TO9(I*l=PEl23f`vwK##kvnRae0!h6e$xiQ_iC9+D^JJI9VA# zBD6A8Ug4F~V$f3N{uzsG_l_@YQZ|WPn+sk#(FVNpA>q$(Ucc2B&^=V2!1A%e$#qoD zons%eIR~2aa39tO6L9%$GL-xgP4yVGeCa_B`pRf3JF(qGeBZhEu7hp^N4W+Z5rRU6 z#MrE0hO6EiVPNb_S`#+0m7x3%F4261{dx85>JaTyS=rX04@vtu3U`5#0BH8(JdFpr z@-hl%t0YJExPtX_@KLoG&+(`B?H{uq_V(10kK*$lCr7`j_tS}&F$=rK6;Yw%SRh?fJ; zbpFtK`jbTmy;4}r^ka-II9eWf!!be^683y8%nyzGpPQN-e=KT^cCF@Ev}r9rjrgN` z%bAraC~~Ou+-lEzuoux9&lPu)nfxBmsJ1|0<;H)G_~rRq`DiKfYP812hkF6R7Rt3V*zyH!hIHM-YTz!2|?3xCwOBj#br*nt{g;g?WeOLhTH7Y=Cxn z%<$nVGGTIZ0P~h-Y$KHObEcKyD#=(D$j!%sm-=C@l7vP4?D3>QMAy=cK2=uK4$7zS zFUzP4btDcS`J;M>K7o&6#xV<{GB+Q^_gK#HTB;XdWIPwI2S`uS!mmUpHP}5K0wNz5 zm5r>qQN(;t82BlY*UJZm2okeJ8m?81vuaws{4|QIdxHlF2F;FgewR#c7Gy+c@e2)* zcrT4L>{f3IGxr!h*-VKx{c<)&aRhl(HQ~ADE+*V{6c>SfWxi9@C7%duMKqy@hBNuR zo}EN2NRRH256Uo}HH;yG0ey;crc{S+qv)h0fLy86B0(gkR`hbZs@%q6YmaQV5r}0s z?@NqM%|?-qV@`BRbWC9yVnlCVhrz;z2ur9ZgdPARJdF%Ky+@`(elVq>11us6_6CgK z4O3{RP=*sVS@~{fk{H^3i@tPDuSzyIKEy8V0}m4lGY=o8oD>%w;zZ2#3)k6N8@z}qyp{Pz2n+#7xk(R?c{*nt=>05w7><(gD6w)T)VjdZPD1ehHHA`ghJ*PR9uPT{ zc1U#fwSmuW4MEl7C)QloLag*WZNu^CZ-)mCK50u1N{cE)|(*aTR*q2R97oqbKx#r&-&ntP8u+^4Z|eDIZ`T89SGu}8f=(N@Cf zHKlJCe~S%&Gwi;`-TgD*3EUEo;eI2DvvvWo>-6jEV z#rf;wPeRwXDakY6f13-8KoDhOga80||M@?bRI&fXv??^VY`^!keDG?%dagZ<;}fVy z!W5P24p5f;^p|5z2jme8nhw+@WvLz&US3 zclYIKN8zHb_}aVuf(Q2*7Y-EQ^ByNG=IG$e+aZDUL%r{(FCvh-#_|3_sO;S@O%-eK!SLj` zl58=u^+8PAo3p;fJq8H+!toj4nbdo zmNw)b7h7SEm5-u^yNKkz6G9{JJx4bv^8CgLle(60 z!qOoBBJ{;rw!wuO#3~0!nopI{NiI2wUCxe7x)r#|V8)k^Ir@caA1ctF6N`s#(o-l_ zcs(th1`xxf2^JY1!#VQYD-9~xWGb|?_GL&eSS%o`Qvz!u5S9F$L3c9azNz5yM2>PS zVKOJ)(DDH6n{$4mE^KjTwR_(nx`#QdSe9Y!_qGKIaIq`7b=z;tKW&p~0G!kt`h}aD)e1_UG z>4Yg7aFmn=;hz`N-@iLly;~toKH#x!~nB6Ky%CKaE zd6?&kA5;oJ?lN8n*x-K#OE?u8^Mx3is#Cclr^tzk}Gs!$2+@m0B$SgN{qye zOfxtl2Nziy^GQCB+ICYu@3L?ApN<)z{N4O|DPys(gL@J+#!1z;%NE5L<=_pl{ zxs<8l3>TyGIa^vpPnyfw6=c-*^C+!?VOs^aqB$DO6@r7`OHWoY@cqrJnKajWGGoWyRRZn^#Se z`nqRK*n`$4TzR4}0Zm#_D+Vf9SPYjpt0~o5>O=28=jk?`=_IsH2SI~YK4O- zaH={YMu2WGtdFQHn<=1jCe?H%_K!m}ZgM#VfrjYE%U7_F=X}1{56~!41IxEgg|8z* z5al(sKQ=~K+Ur50vX1A&-$!gsHfMMijW~(tzHb$3{hs(tNe8u0fRWi>Pbl6y=KoCr zqrO)gNEnMt7>{-9BVp+92zCGA#f0pB`$pm}ozRdiew0TjJ7_^s*{{tXacao@x%~8&8^6cen|}G={cI_a%aIDG8(N!4BWbVk zO*-duQbZ}^25(A9`Fs=cI~@iUblQ8bu7s1$^kq(~x;rJ$2vQeJ{ZiS!!_aX}rC36X zhr5mN{e*X2hu?+mzGJY|Znehf6T3DVi`UqcylE9I&(eUO8Mvvjc)Bv+zx#W z)eFAR-T-(nAKML|n$Po=oi~0TIMcoea^cTlxY={}V%8(KRQ_@6+$A&JXm<74x0LUQ zr-x(P$VKl>E$gf~%(WrteB*l}(>o!G=ZXryFovBr^nAB@=N~4^&o@ACoKK6Gw zacAj8EPg$OqkM>uXAb4w;8neb9?sP5GQ^+WgR`-Y?&YNkD=9|l5-SqUz=RBt} zno8uIGPtsB_KPbv(2M)mU$5dOKb6`v>UyqzHt`udyp8K)B z+357N>~ffP+_b_}J-1Xk{Qyn-)K)r&(8Uhf%*Wx;hAO9e^q7s=uBw%39nEOPk5aI4 z9!0D7WkoqThZ}Bg&tz5TZOzER)}(>@NwS6720v#?uda<-Bs>gIGM<3A#71@HSoZ7E(^P;xy{j|t!GNqzctgt?IwOc&`{LeH>r2dJleJ-c z6pzr1p4jUg0>5_Vd03n8Ug&vy>#0yUJHu6U-1__Ni_GfFy393cfk3V&3DNx=qQbS| zcfKhX9EP#JRuy3llj<%HZnej;gb*`*^qa-{*kTD<(Bj|XW zfk5<5Ti+RFHDgbpI4@mzaMZO0vu}5+qU+cQIzCcoGb|YI`Fq_ixVn&e3B`WfNrdGc zC6jrF5%yt%$GI0!FWx=DXiw(pqmDh?C~|h^t^`i-S$J=6;&bSNt~nz);Lp3)FjT0Q z{)aZQLbg%-eTnbV?p(F$<+9>uxliW?b(Om{;%gbhPPz6UrcGzMkbr~xFK+7GB~Ws~ z@po|%nVVmbK>Rhd6mGAGjc2o-;2bBR8cES)d=L#2BM`Kt;zvl4ePXJKQ+qb1&Dz%Z z42WkN2zZpgb`g0+--2Rltp=1lQMwh zc3{E2V~fEt$#qC%-c-kanf2Z?;IxPz=>!u#I4;maq4r-Eb|yqc_8~k&i%>;k`N}^T|U7Aq$TP^VF3qW z`|cPv{IGiV3QZ!GvT>#StwNbE#Z|vbxeytiXm4W=2M!C%z&jHil5C^1gb!(oJ^T34zN(UpF<_{9aHxO-l97`fj>wD*-SKl6(zz;BrDc|=rQvPD)B#oT?Dbq=$N40hVg z8nlFbDK|B&;zs$5oPi}h7O9{fJ_xabZV3H3T$MLmbA4n8M5?0qxd~E7*1L=94UXEu z$xfkkE|~Q_W!8Hqa6`bk$O5Vqq$u;5y-6;}gcYzKgC_I7U8&uMvchP)vr+3NdzbSU zT^^j0^wV_Z-jd|4xI#+bh{#!O*EwntF?Uxjsa<#TliK}jb0K}C$b<1;%ZtP zYXnf6S2zg;cIM@lcw1aCELwwM9gLStxQo%sp2OC`5bg)ongPl)=}<<3vK9a5*+9_} z_cA%oIj0|I*&DMrpcPxnogWT?}W90&JSwF)m;c$z&Bka9rX&AA)^3Z7c zy!%C`mbsweha5hGa(M?=_}bIb*mnwFqp7UN=6l%QNLf=WC>YEm5@|RLhyI;g@)iq$ z;;`p04P0o&OVn3s&&cD9H4 z>LmQOJH4a#TMrUU2T){sz%#HL<3BzFe>z83Xy`iau%rFqKmxjZ*GMr`$<2w#v#6xgv4C(8NV;ziNthWS=1$`Q|d7f ziO0matb=zdSNB_rZz^X&+h}ZtwI2Tdghz7YmBZ^Uq8o$BjmCMQwRn$xh1pbn&ywKVv93dzc9X~}ew&CIAAc7A-u^Zi+TCE6`3JUA7Vf?IX~f~Wv9mkIvufIr z%M|T5&H@2657njpCWnBj{@Cm|u3JOI)C0E+5b<1N0#!#IC;r-_bnsY??s+A^n4Qr`>O(w&cqe+RMTxg ze5#u=sLCCuSN}RP&es6_7KadW`A#y+XK^2vjmwpY*RL$&a^^M=geh1VDhZ7_RtE#Z zw}ji7OhJJ#$!5!s690ymX%@%2_s`uEk zXKo2uK?&@tnr(l3!UB`7o;+hyb$=Wxg-*u6XKaDIr)Z|*5(pBpL3#FJCy=5CE^;srFZ_wzR4N9Vl4pjL72vKB0_;kD zP_?KO=`V>y=sHZ^j{}U_sFib=dDnj-*e)lCHAM%e!b+ISxBy-Gks^HOLVt_a*t8oH zig|%6F`ltT$QhpK@l=erV$r6{Chk)gWF9C8bFbQ~$M_HGlX=UAjFK?#N8 zsVo-cJJ_cJQ}r1?k&#WfNFj?RI1+(q*PtO+76R9+Eu>>f&Y0JbVd00=KivjWD{0S+ ztUdtF7I=%x2lHM=9ULGeguLMC+*gU7Xz0_vM^VdGZxuI0`(!YI4F3XT_9bSbQ4Xldo&MH!ZZMbXgZl00C zn7&zE`D0*u4S(B3?T8j1bl}7SRh@XNU_4flnAst+L1=MK4UV>A9A}ZZwY98G%}b06*rX&<O0LC(ezpVMy5a_t`UhNxh9Z|ILt{SA0A^Gfm z+7)HG=yCD9bN2fkJ0hG95bi*lC;GtJS?{s>^f{RIm*lz#u`n-stQJ7Lahql`gyhE~ zh1YONPQ=ufmO*}?PzJ+mGy`>DMM(FRI)BBWckVsfY`HR6wSzUwf`RThJpvsYKAY3SOO{}Cf=@dmo{0@4%^TsFE$X3?U)nygm-;$9TYT7pz3C~(%@ zZ4?LJWKnQt`>23&FyZd)ZF+Kldu64}Gi~xk{nTO~g~2}SQl;VP`*n@u+q2P~#S!;Q ze9o=M*X*(6r_PhF(|?4>`dG9NziOlefg;PjjPW7#KMdVH?P#!joHrg`f~AP8u{{9k zwL^9bxS4ce%E_M269NivR?E?gw;TZ`T72)y^4FUNm6fw0;O3HD_yu2IYPs*IwUoU{ zbrRj;1mKrwk97}cbiYgZXvVfBN4sj5<&<-`UsU;4 zb=!};0KBvODeSovzvxrMFcv&k-mLj^r_Y0y8sadpPDwLR5aEgGn~(M_I4v&ev0}FP z>=GmSvs-%PIHJb1-r$uO0(QIH#R8&Dfn&VwH^I-Kyq`tTJjR)FV6$aB`;QjCUA-D`G=|jw(vwNr&4FKAPnx4IIjD$S`mOsj?o(*XYC>c=D(Xkxt zav{ZukIiL%h@?!%${hf+K^hntSjV+xIZy$C zWqL@3FkQe~#hiPmc>p&#s^rcvV$5C=gws@7ARQMo_EIwC{!Tv%iyO9BC8NnA|MB{ITUse@3@z;#&khe%QRx zH&W7r0f4lKENvdSWw}BdquDhfCEVb3Nz$g7ogdC|coE0e&`z+7q$bCR#LyZQ^0=leg?pW%*_1H?lj=0S$$k!66$T0b z#kN~ztrH(D)U~j>K+vuM*UO>9Ppbbs9lxBR6iEpK@3j+P&PI69s!GYX6io*v))GKx z$S`M;qOowI;<>z-qNY4vh`mZ-#-0|rMEPE!???UiS}X^ylY%&f{tza^T9H5 z4?_1ikjN$QRsA#OHm*@}WMkHex7d~i3J@_^In15ljB7V?p98!^(WV0xd)2q$YZy9YXr*;Zep>koDS^4N_)sM*o3ep zn2JwP^3?&tY0^b!*3855BkBeSajSWn3G<#26-t4WyWgaVt^8If(a?^TpN8CKzEX@G zc5DMVQp8rI)FdiGk@noFdF{!p>~G+9s~10SS=VDcpA%dFD!9XC&!Z(`hrvK7XX)p; zj4b!`%2<7YG24bP@1`j zSGUTpD-f7Rlq8=S(!t*7KM8yqN8j}Gtu9}&nsqgC(&3u8$C0rsvn{XSI5GrhxVWNBgcl*$LpTo^|N*kXKSaWg|C;taU4^ zZN}$qlhbjwfUzRyT1FH1ES%nr|T6HW7^GdWjMdb;NoyHE2*ubiTLUkcDZ0- z<>DLD%59aSCzo?s#2*kbTu1$MK3Bq0e${R#KU_44Pm_Ab16!}NmZC>~aLjC%QMGbM zpL#Vjdz5L!aN9H2|56o<4RuoAv|OFZaAG?yJnYr-$^Vrus@eA1V~L}9Gs>r%z6@rd zhT0GqKjT1?vinpm7LmO@9}rs?#8_wqmq| zeq8iey?z53jsO*_TRZ)s%-0>eU8v{9|Dx66x!mKak}?N@&w2X{1c$Vy{p+3V?0${) zR>gP-u7`4O>JLA)PsGpup11Tlc9xPqc>RtZik)*E@W*fNK*Yv%B+H&3p?-7?VXyN!vm>$@>_h5G}MTSlkW+!K-#Vg#o# z^u;znKyZg2e}NoY?!1HPO{b9!#F;Y4{1~}b)~M9Wjf;F|GkFkAp1PJ^Jw~z&(uXT& zQ`nYe;3YY<{M|M7RMGszt7i%*Sg;FP(7 zc?)|IjL@JL*l0e1fd?{i1%u7U!AqkTq*mOLlbjDpO!X?k1Y90 z2B>Hq&miM+HLh-jz zp)4qP2N|WJK_>TxRnzZ^#0)`#*L1p;+Ny7htJ{>Xy0nCdK-9U?W`=WYlbtAhAVs7o z$?F&qu7*tB4ymTU5{@|-%uON;RjyP(W?%Jp%xfysmC#@tT?k&Nkrdl5hMFef+tfST1U=tM>h8dacJ9BtJ6Ls8Vi_h<&m7-IC;)T)8tFc_pnwyI7YNf&MJ(rxndTgU}? zw!B{+K!s0qS_6i?q8(7|BN80KJ^I7IgPdA|Vl4Ts4Q}ZDV@y5e@+=sLxsKiO+eIj) z)=C}FS_dxz-#3W|o?zj=kk%eWC_R#2tH@62lccUNX|a&O0aA+^7Uok_sBOE1WZsB( z!Va$&UngO{^DAYV3O`aw3&0rtbP-Pbb%~M@weE+AYkp`KG>>k@+KD90`>ijDPzqDq z7F*!bb>&O%o3OyM&!EtcXB?7t$hND?NI;)<{52j29LvD%>7{z1q8n-!L1HzT@oO6k zES8Gu~05p|ofv?wyp7JXuz%*r%i_t9Q4(a~^{pr1SU2kM>)aW2Elv!enWt^M zG?!fyvozD#F}iDDh$TLJvVavhPW-B4nS$T;-o(Hw7IoDmU7ehp_WQK^k6oteuo}DvVjEp~9wv29biXuw8Aq5A;PSE& z{}Q_OGV+iJU&PHgS2bFQxA$k zQ)q50k9=HghFsZuyQJ0;cK^&Smwg&G>~!(l^@fg9(~ zO9(YA2sz3jCPhR^SKZ(`yV>+A;MppOBo!muNl0T<+1{DFOkHacFcSV&WrFn^tS+g%*S}Cnn0=qn$ z;-NfU`Lw-ntc7M-g%-SPFcXlGGXYhgM7ESPL7_c%R$nDMCD>-O6r?K#pFX}4f~nnQ z@$`usRaOkZM;I@CZw<<~SOW9{8}`kL<)q<}{7MqarRY*GZfVYY_sljynydwwpiEGyqB>#@lwt_9mDp# zU;0q^FNBK^$_`%!MB0A<`{SRCf@Tsbp%~7yK{8`v^b=lzf?vCmqE?6RH0rzUZh(Gu zvT#$m%`=7y!viDhD6Wa~uU5p4cXw9DxRM7(;b(Nz;QsOv@?+ha-Ifc1$&Vf$AQ*r@ z#@a2j+eRlG31Jy`+npdcM<4Blp^0#UkiSPh^uQhDEYX(;o=_uT$G&r@dt!Gf`IEZ_ z{(V&=v=b;$`vGL--B12!ZTp|j=qqLq&nS=+O?f+9F|=-y3p{ZzI~$57TnU%5 zjZtd;9ld4>=06U=j(d%1XL8`6LA5Y#2hv=|w z9E^LQ;uN@mNdPASa!dqH8XVQ8+S2!f$+0E4T~So3R&7&Fm7VWVn{%&wo2h%GeiBRN z&2c3S50?+9z9sgTPrrhtQF9EzTZc5)=GBrVUGIR`$ApPW zx#D^A&vhF45XJ<@()Tfz^-0q-t_Xj9lexDaB+TB56uw#m) z%}-~11wLnskY}Ez^l<=nDavlcqKS&&>!uF|4_gApEcg7FK0xM#{gFeGlc>zS{J{>G z5+p*krv4nz^b^ZOdi3xXA0!_G$;(bVGxQ}Rz&q8ayFG56sXT9v6j` zXh!h*c(aRg-_%n;>@7(`JWJ;ojNlH|hTY$ikob{vGtwZuv>qf(uszsWJ_O;%(z|+Q zov@ancA8xGB;e}lGoCsGVJ78<;Hwx$M}M!(dIZeR5G{Eg=(N0jzve1ltG(w@_sKF;d)2ua?&Q@(@T~^=^U4jQ1qD` zd+sADAoX@TD@gamxHE)0Pt!_!6nAE_MW+aYE-5J(z&;S6ohIDzrqN=@BoQ12A|bjX zR5i%=^y#08t0>Ujxe22SHc}-un+}?Qd|>6e1M)s3xB0|Pl3-GyWu?q^L~t<>yWKb7 z?od+oBbdL#s68K{3Z@i)(n;>UYsnyb#C!JNO+M?Aj@Uh$hwa6~;UuO55uKh8jbNxo zJsUXJpCV69r3NMYTDpK7^HyQa0^_pg=&szfw!v;~Xfj&wm9J6V_W~<@jgUR~1XgG0 z5#_0zx2a-&E})mEzJEFRWnYXcl)4fZWz8yMibre3U7peil+A3fh_$mh7~Xt6OsI1z zlUvFcNm|%_Aq@`hoep7*W)PVAxgt7(aHinqhbz{Pf<=X(5h(QA9p<6Z7FN91uVdNl zxR37)X~G69CT^ZdFVyRTqj1HGeTsn-|VX)1C}Bjm+<- zQ`gK`&K&REYqexd)kft8Jg|^7TA>epCvm2DQa{!R%ND}+eCoOnt%w5-#nn^1z zVN<=RVdXwDEVY)=qlk@P0MZ-vJ9EB}=0hZQCf+bDw1bwd zOQdO<^>z{AK67ewpnI-%>4|vjRk@+kYoH2M=*621dS^}#`oN=xS5MfnLBPkUq^98z z7%r7O(n4Q7!CiezNKsgwi#}E`bRDIPx4?Jb-`Edn;S-na6I38s1q1th3x$P7_>;&` zeTtFFKYM*58&wh}&xhF=8;Im14hx2Nfw%tN`Bj7{xUH1j0-LcV@#3(n7@HNwIZ=6n zqc~yTt9mk^yZx$m6z+Yi%Q7o#8X#rS)vbPQ`Ra|SN7Ee!`YdV`dwI4AI3tZUcqQwp zo^r60ZDW%mokhpeNH8b^y%k)Lhe%QnAS%>P|E-|U>^3NDLm})L$dV@T95Wp&7+&;- zY|Wiem+*883WtKnJV+|Bu1Hp!!lu!>zH3X4&U#mPcn zY~|_ld*vWA`65a<*}9-;hv)|twdd49iM!reo*ygvLrJW?U^!)Aq4=Kqmp}=dj;zwn zufN@pCb&N7X$Gtu;Q{6a|0$^P=WaoCLa*gIBVd6jq$6mCFQwBWVQ6`ZNZOn-L}~7T zcHBt2qR@ft)b{q2r|yCs35E-6S|eNjO@L+brJU^qh~M0qjiD}+#U6&|G&KFq)3@Wf zPcwYZWiB@;J%{ke)4`6ii)c42iJ-Blecpjlv@(^b0*MATb7s%1RNTgxWGR7YD({Fb zeVw@V<+Hd(DV`qG=Qk+Orw=sC`K#LY4gv0r%n7fI->E8C%lQNA=gx2EKMV69=P!y6 z&%^CclwDfbe>1TfxwE>^EKBC2IRBwW69@d1iY!Mfyy?}2>J}&|yJ+DUzdFTx&Gx3Y zZa=Hy;Hp->fZr_1PbO^n|4%%AE1_D@VJj0vI^ypLffHpr9G{8;> z3PiQ+PcR5yMel?wC#0Y?W09<~;ab24oQ>DhOnDBpkh20gd^kDyqmtLZyWr6V0y07Y zhAqT^VatEI+W%M%Op|rWkOW+9?Z!8uK|V=PDCp#UmEhnJgYqW!Cx;=Z6&2DvaBGT( zn>CTU9+|kEM$`xW!n03LL&4UfF(a1LKitGm~E)o%_D@+eo4jXBw*5A$rMqb^!T2_lV_S{7S51I+Xm zhbuy=Z(drszKAs)2gZiga-;?C8mVQ!o2V(#ODtGDAMemmf7q?%Y)mbrN6>_QvBMv8 zDyYM|`clYadUH5@)!xCKO*E+MLAh3~t7PUpfk|*KubTB0Z>y_2oN!$A>?|tzRpY>A zQRQhV#M$Vi#AkYz6GxD2vg5$Ls>CNIb8p<>2YA8G`# z4GbQ4IY3RV?((u}rF&!S1ji7HX|H@(# z6-6Fa43Xu+w-VFAEtv7c&zaWb2Kf2}b_0)%YjN%{PF5RF)r=CKgfBAqm_=Mp5Bo@& zRENs(Ad)dP_%if^Ia4lYi;~XXlotvEnDFWu`S$yO0Nk$p-uRuZRSwQvzr0>-@V;b_ z!?W=_2$8O1Vx7$;7103u&w@-I5eHbXximvAOQy{nE;qb^9zfK2TxO1H$gtnU)ZhQm zA%7$=|55d1_#~Gn6f&AgV5}s`8NeKhVy)l7`}NV+oy9j$C_d3Lgc^}r3UyLOF*+YA zvIx@yRk^-Ml(C3SaX=+Qh-^6M#4M1UDXJ!{%8Yy?-w)@5Yw@>Oka0eU7CwU(fhhYu zVZF^El_E`U$BJu0Z$DdCcQN7;9a*%r{8Uj0ItVM-^oZ=y`gnvge5&*T9k~Sg=8w3k zF?OTpdalKL;)R|K0cd5t!jJP}G>MKqz`J$CA7cj*gFWJyB0hl005awAmU#AQSQf=vmW|p>MX(?>YYX~aJw2328d zvH+7^-pIJFAd~?L>J8{PyBvWpsR)8(Qd#@G=c+w{?-oM8cPPugb1h?rSAf@Vxn>NE zpUeVe8@n<@szJs^q!u%h1%%Wynjjh*L6V!Jupkx>U{}jtmqRDFD?87xZ(G?05y5p? zF(z4%ieMq)i0~IAjA0cE^_I}yax-$ zuwe{tJ;H%A!O0-fwpS}Ogj;bX{1>4@EIB@mIx+#~27pLJ-WfYqU#2U3C^J0cb>4j# zH{87jIl9qE8QUL1$scl1f~bPJYe7+2sY0{2;6~%%=-eW04NKbLLubnWP_TkK^I|YV zC7P&w$z9H{F(Zk2QeYsg#IG5&Lg=~y!;M#E`W#jgY=L*~YMuI4dmlaS=~ zU==^W0=#xIv21HhCTV)+S_J0~kd1AuOG6|wM(#*Pz12y~EHSD}vu>#3;+PqhCg;EA5xvs-to( z2jd)}^DBFHZ<&1|muS`Q=9l0GO{MV|0jdn;=P&VX$SwvH?q zcC<^*S+YHlOU9+LoFx}+)iy)&GcOtdq?8SxUY7F!D4e1|7104;AjUk!}d{N$Zx@D!a)h@G*WO1oqXv+x*bGw za|~7qw)s#?rz&*;RXLoow|DT2vuB@p?(v8SBQ(N3MAMo%Qu(>I;(m!pD-nJ#RKa9T zXNJr;s9vi%yUxU{d>vKCHch*0G#>A|b_aq%xc>{{ebhNuJA?1|_ovH+XoNxhgY1ZB z?7AULsIP}j+-_=EjBcv1=Rgb1knUM3J@Q4Um_>I!s*T@a*V87RO3ewT3!Gf(zsv7) zxJQ9%e<`EiMi;&7GC#^JZ>y}Y3%SMEw>?@QaLe}+nCt%9_VQal^Y-3T-4Vc$W)iTV zi39`%Y;0$w;Am&>#9&}=|A*fLVLlizWiAll6aW7{GLvNOb_oH`c$!ncnidXri$`>W zGF5?v{wj8*^$jX~3Ug=;!3tx)m)KMC+O_ch4Tuc`_h(NC*Y34%g}{f&Y+QMX(WLr? zbjh0gdyVd0Eo2dheM!RFpj<0K6nD>098LC35SVE9VA5DQi7rq#yt17-{o?n~V-U$> zZ81I|ecHNbu})t4W(5uXfwDO~Jfd?s zq@Sfs+>%I#Gf2)Z^aM{#eghPJM^{8REL>vwLxy<6 zcsP5MxjOPGcmB@meP^&xM_7!L*jj9ggaw{C<-NfRFecR zR)Ii3J;e(upC{>1!BF`HrhEULshhKPyAYBx;knI52Zx>MMwjoJ+~K4(Fbw^La)o{j zXCHI6ezG$rFmD_E?0!P0_>vek$@1PiY^>+#=EK0sn*xNoWzGY5)opz&L>BA>hoi)t zP7(@-L1qzN!9fhgLp(==T5pVum8fCu0@z}Kt|RN_V<#0RUz^D@qhs&Q4=?X7`_!x1 z`HVk>L`>eBS{pGteu_0&W&m>y+%v_X{F>D{86+`Nlpaq=2n7Wa=>LyzJwn2{Y%swl zs+jQE zCi&!!NpD4>{CVF*p3L`yph4D%d%PT|k4#=^R!^Inu+mtqdNXj>t1WRGyL>yxjj^Nc z#tRo&c{r%i6o&X#z0gp=z<`DH&yi{l@s`3O9!~s6mpu6Jwf)vkUFV19a3fcmBIp6i zzDV@EcHRl#L~Icf_E_n>ZczHH>V7%gQmqvDLa|lFPZihT6L71bwms+J5mZISjh92= z6Jz{VntF16Er1dsh_t*3^#djTi?^atY3p3(^^jGime~L=#j_o|)dcGbwsN(nzg4OT zI8o$?BEGIr#P^TcIq9qvtV~kpJJItxOT-)93%MS**n>RXvf+r|5@U(tXj-D7J(Vq@ z-HA

K49K=3NG@%aEzJ?N38=!A#3^cR!3hrTASO9WN^16`wn|YOLR1UiQU3A75=2 zZ^Sh4Q@Rvv9h#}AcjMvs0?hT_=PLhmLuUHhkpDL1{|$!B{I?p(d6%u^`Ene=mb6aenPatP1$FJ;5!8KEI&zg)MEZt;|LaRU+M&@&A#!0Rc$Q{gD-o^`_E! z{xhbvZ&{oz0tI-{8Iz_BRF7Cx-TDmmVZ&XPrn+wGIOeK2bhC!=ixc0s3iOCQZhPaS zWjgzFZ5>L%N(bA=6*s$q!d&w4!eL87Q zb@w^MLxYo|+pD?~@}Mtjj`GrSkz(eb8rT;`s~a)l_dT6@W!h|9wPAe%dn3d!B$^`a zj?W}OM)WV6ez~Gh{e5`V|9s5A_V=y!?_2Hvd$-#ExgoRvZODHc^8W@y=J?x?|2E|R z4TjA5w;}&+$p0G*ne}f&{@alM-!Nog5IP_AS>w0*0)>L~zXBRn8A)ycAC&>DXu$r9^drC@O3%^6+KGYw zkJn!XXT>C@tpR7w0!RVUS^d*N2*`>I*mL=Z>>ss>4eji#{y6tymBM4gEZqwb z6$UhielVJS|5E~GY{u{M^mdyE8Ee^sG z-9kX)jQ_21aexm04drLO!e1#{tlth50R1Zu(C1%uu^|3QF?KX?`?)Fhf8P9b-TswQ z_u-?f-3wM;7<$qEl_AI#bXVi;mp680fgdz0shQZ^IKp(D-PEG)ez82 z|8x*5{TCq9Pye&u60HOfpZWouKRWSWiR8-vjrgB?QAUf}^Y=Q^sQfqLPmBGnj>cE4 z#J?vpsQx$N&y?uDCB6V(hS37<4QdBKK=A+6i$FjuYCnli&K}k#zqPtwtEK-b9cl8b zGJpP4|7!ieR&@Q7LTmGT%1@*C74vJ&(LXV>w!g>xyl%f@eyzdvCkD#>_n6<_UVbg+ z@h1kt|M!^R-Wh()cK;`aHstr1pBMVqM*W(D`A^K($lqdqW@P@A@@s;{KPlpgzoq<4 zxA-gN*A!KMQr@Tkmh#)H{c94EKPgqYzoqy z^(O=fs0uI~_|<9Z*S7q+K>4S9#lTM`{)*GdUx&I3{}t#@2Y|m0b7kePLnl}N3iRhJS3w#a;2sYIL<9ITgad4Ke*NR8{|}k5fC2yj literal 0 HcmV?d00001 diff --git a/mondumas.egg-info/PKG-INFO b/mondumas.egg-info/PKG-INFO index 442dec3..d373b8e 100644 --- a/mondumas.egg-info/PKG-INFO +++ b/mondumas.egg-info/PKG-INFO @@ -8,19 +8,39 @@ Author-email: License: UNKNOWN Description: # README # + Cette application web permet aux collaborateurs de l'entreprise Dumas : - Application web permettant aux personnels de l'entreprise Dumas d'accéder aux dossiers des clients + - de consulter et de gérer les dossiers des clients depuis leur tablette + - de créer un rapport de fuite et le faire signer par le client + + Elle est développée avec les composants open source suivants : + + ## Backend + + - [Python](https://www.python.org/downloads/) 3.7 + - [Pyramid web framework](https://trypyramid.com/) 1.10 + - [MySQL server](https://mysql.com/) 5.7 sur Windows Server 2008 R2 Standard + - [Apache web server](https://apache.org/) 2.4 sur Debian GNU/Linux 9 (stretch) + + ## Frontend + + - [Bootstrap framework](https://getbootstrap.com/) for CSS 3.3.7 + - [Jquery](https://jquery.com/download/) for JavaScript 3.2.1 + - Chameleon templates + - [FormValidation](https://formvalidation.io/) form validator 0.7.0 + + ## Jquery Plugins + + - [DataTables](https://datatables.net/) 1.10.20 + - [Fullcalendar](https://fullcalendar.io/) 3.9.0 + - [fullcalendar Scheduler](https://fullcalendar.io/) 1.9.4 + - [Jquery-ui et jquery-ui-themes](https://jqueryui.com/) 1.12.1 + - [jSignature](https://willowsystems.github.io/jSignature) + - [less.js](http://lesscss.org/) 3.11.1 + - [moment.js](https://momentjs.com/) with-locales.min.js - - Développé avec : - - Pyramid Framework - - MySQL - - Chameleon - - * [Exemple d'une comptabilité simple] (http://perso.numericable.fr/assoc1901/droit/comptabilite1.htm) - - * [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo) + [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo) diff --git a/mondumas.egg-info/SOURCES.txt b/mondumas.egg-info/SOURCES.txt index c757d95..0434673 100644 --- a/mondumas.egg-info/SOURCES.txt +++ b/mondumas.egg-info/SOURCES.txt @@ -2,6 +2,7 @@ CHANGES.txt MANIFEST.in README.md development.ini +diff.txt production.ini pytest.ini setup.py @@ -21,12 +22,16 @@ mondumas.egg-info/top_level.txt mondumas/models/__init__.py mondumas/models/agenda.py mondumas/models/default.py +mondumas/models/devis.py mondumas/models/dossier.py mondumas/models/parametres.py +mondumas/models/utils.py mondumas/scripts/__init__.py mondumas/views/__init__.py mondumas/views/agenda.py mondumas/views/default.py +mondumas/views/devis.py mondumas/views/dossier.py mondumas/views/notfound.py -mondumas/views/parametres.py \ No newline at end of file +mondumas/views/parametres.py +mondumas/views/utils.py \ No newline at end of file diff --git a/mondumas.egg-info/requires.txt b/mondumas.egg-info/requires.txt index dffee05..43d4a38 100644 --- a/mondumas.egg-info/requires.txt +++ b/mondumas.egg-info/requires.txt @@ -9,10 +9,11 @@ transaction zope.sqlalchemy waitress mysqlclient +docutils pdfkit python-dateutil -docutils user-agents +xlrd [testing] WebTest>=1.3.1 diff --git a/mondumas/models/parametres.py b/mondumas/models/parametres.py index 0cae193..95bfcec 100644 --- a/mondumas/models/parametres.py +++ b/mondumas/models/parametres.py @@ -224,3 +224,24 @@ def update_societe(request, code, new_values): new_values['societe'] = code query = "UPDATE p_societe SET %s WHERE societe = :societe;" % s execute_query(request, query, new_values) + +def update_tarif(request, ref, new_values): + # formater les champs + s = '' + for param in new_values.keys(): + if s: + s += ",%s=:%s" % (param, param) + else: + s = "%s=:%s" % (param, param) + + if ref == '0': + query = "INSERT INTO tarifs SET %s" % s + else: + new_values['ref'] = ref + query = "UPDATE tarifs SET %s WHERE ref = :ref;" % s + execute_query(request, query, new_values) + +def delete_tarifs(request, ref): + query = "DELETE FROM tarifs WHERE ref = :ref ;" + execute_query(request, query, {'ref': ref}) + diff --git a/mondumas/routes.py b/mondumas/routes.py index f2bd940..0902a5c 100644 --- a/mondumas/routes.py +++ b/mondumas/routes.py @@ -68,6 +68,9 @@ def includeme(config): config.add_route('text_edit', '/text_edit/{text_id}') config.add_route('text_list', '/text_list') config.add_route('text_view', '/text_view/{text_id}') + config.add_route('tarif_edit', '/tarif_edit/{ref}') + config.add_route('tarifs', '/tarifs') + config.add_route('tarifs_import', '/tarifs_import') config.add_route('user_edit', '/user_edit/{cd_uti}') config.add_route('users', '/users') config.add_route('users_ua', '/users_ua') diff --git a/mondumas/templates/parametres/parametres.pt b/mondumas/templates/parametres/parametres.pt index 0634f08..c26895d 100644 --- a/mondumas/templates/parametres/parametres.pt +++ b/mondumas/templates/parametres/parametres.pt @@ -12,12 +12,12 @@

ARTICLES

- -

CABINETS EXP.

+ +

TARIFS

- -

TEXTES EMAIL

+ +

CABINETS EXP.


@@ -30,6 +30,10 @@

RDF : CAUSES

+
+ +

TEXTES EMAIL

+

diff --git a/mondumas/templates/parametres/tarif_edit.pt b/mondumas/templates/parametres/tarif_edit.pt new file mode 100644 index 0000000..2fac368 --- /dev/null +++ b/mondumas/templates/parametres/tarif_edit.pt @@ -0,0 +1,166 @@ + +
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+

${item.modif_le.strftime('%d/%m/%Y - %H:%M')}

+
+
+
+ +
+
+
+ + Annuler + + +
+
+
+ + +
+
+ + + +
+ diff --git a/mondumas/templates/parametres/tarifs.pt b/mondumas/templates/parametres/tarifs.pt new file mode 100644 index 0000000..038b77c --- /dev/null +++ b/mondumas/templates/parametres/tarifs.pt @@ -0,0 +1,72 @@ + +
+ +
+
+ +
+ +
+
+
+

+ + Retour + + Nouvel tarif + + Import tarifs +

+ + + + + + + + + + + + + +
RéférenceLibelléLibellé 2Prix HT 1Prix HT 2Réf. client 1Réf. client 2
+ +
+
+ + + +
+
+ + diff --git a/mondumas/templates/parametres/tarifs_import.pt b/mondumas/templates/parametres/tarifs_import.pt new file mode 100644 index 0000000..54e056e --- /dev/null +++ b/mondumas/templates/parametres/tarifs_import.pt @@ -0,0 +1,45 @@ + +
+ +
+
+
+ +
+ + +
+ +
+ + +
+
+
+ + Retour + +
+
+ +
+
+
+ + +
+ diff --git a/mondumas/views/dossier.py b/mondumas/views/dossier.py index 7f03956..f9a5239 100644 --- a/mondumas/views/dossier.py +++ b/mondumas/views/dossier.py @@ -848,7 +848,7 @@ def mailbox_connect(request, societe): mbx_pwd = 'sasdumas' else: request.session.flash("Cette société est inconnue ou non traitée : %s" % societe, 'danger') - return HTTPFound(location=request.route_url('home')) + return None conn = imaplib.IMAP4_SSL('imap.entreprise-dumas.com') try: @@ -856,7 +856,7 @@ def mailbox_connect(request, societe): conn.login(mbx_name, mbx_pwd) except imaplib.IMAP4.error: request.session.flash("ERREUR connexion au compte %s" % mbx_name, 'danger') - return HTTPFound(location=request.route_url('home')) + return None return conn diff --git a/mondumas/views/parametres.py b/mondumas/views/parametres.py index d9e1b5f..d83c8a9 100644 --- a/mondumas/views/parametres.py +++ b/mondumas/views/parametres.py @@ -15,7 +15,6 @@ from pyramid_mailer.message import Message, Attachment from datetime import * from dateutil.relativedelta import * from docutils.core import publish_parts -import hashlib from sqlalchemy.exc import DBAPIError from ..security import groupfinder @@ -26,6 +25,7 @@ from ..models.parametres import * from ..models.default import * from ..models.utils import * from ..views.default import * +from ..views.dossier import * @view_config(route_name='parametres', renderer='../templates/parametres/parametres.pt', permission='manage') def parametres(request): @@ -801,3 +801,167 @@ def societe_edit(request): 'code_postal': code_postal, 'message': message, } + +@view_config(route_name='tarifs', renderer='../templates/parametres/tarifs.pt', permission='manage') +def tarifs(request): + + familles = ["Article", "Texte"] + famille = 'ARticle' + + # si table a changé + if 'famille' in request.params: + famille = request.params["famille"] + + # lire les articles + items = get_articles_byFam(request, famille[0]) + + # construire la liste + liste=[] + for item in items: + d = (item.REF, item.LIBART, item.LIBCOMPL1, to_euro(item.PRIXHT1), to_euro(item.PRIXHT2), item.ref_cli1, item.ref_cli2) + liste.append(d) + + return { + 'page_title': 'Liste des articles', + 'dt_data': json.dumps(liste), + 'familles': familles, + 'famille': famille, + } + +@view_config(route_name='tarif_edit', renderer='../templates/parametres/tarif_edit.pt', permission='manage') +def tarif_edit(request): + ref = request.matchdict['ref'] + url = request.route_url('article_edit', ref=ref) + logged_in = request.authenticated_userid + message = '' + + familles = ["Article", "Texte"] + + if ref == '0': + # nouveau + item = {} + item['REF'] = '0' + item['FAM'] = 'A' + item['LIBART'] = '' + item['PRIXHT1'] = 0 + item['PRIXHT2'] = 0 + item['ref_cli1'] = '' + item['ref_cli2'] = '' + item['LIBCOMPL1'] = '' + item['LIBCOMPL2'] = '' + item['LIBCOMPL3'] = '' + item['LIBCOMPL4'] = '' + page_title= 'Nouvel article' + else: + # lire l'article + item = get_article(request, 'REF', ref) + if not item: + request.session.flash("article non trouvé : %s" % ref, 'warning') + return HTTPFound(location=request.route_url('articles')) + page_title= "article : %s - %s" %(item.REF, item.LIBART) + + if 'form.submitted' in request.params: + new_ref = request.params["REF"] + if new_ref == '0': + message = "Veuillez saisir un code article valide." + else: + new_values = {} + for param, db_value in item.items(): + if param in request.params and request.params[param] != db_value: + new_values[param] = request.params[param] + + if new_values: + update_article(request, ref, new_values) + request.session.flash("Le article a été mis à jour avec succès.", 'success') + return HTTPFound(location=request.route_url('articles')) + + if 'form.deleted' in request.params: + delete_article(request, ref) + request.session.flash("Le article a été supprimé avec succès.", 'success') + return HTTPFound(location=request.route_url('articles')) + + return { + 'page_title': page_title, + 'url': url, + 'message': message, + 'item': item, + 'familles': familles, + } + +@view_config(route_name='tarifs_import', renderer='../templates/parametres/tarifs_import.pt', permission='view') +def tarifs_import(request): + """ + UPLOAD d'un tarif en fichier EXCEL + + """ + import xlrd + + logged_in = request.authenticated_userid.upper() + + url = request.route_url("tarifs_import") + message = '' + + groupes = ['AXA','MAIF'] + groupe = 'AXA' + + + if 'form.submitted' in request.params: + groupe = request.params["groupe"] + + # récupère le fichier download dans le dossier /tmp + input_file = request.POST['filename'].file + input_name = request.POST['filename'].filename + ext_allowed = ['xls', 'xlsx'] + temp_file = downloadFile2Temp(input_file, input_name, ext_allowed) + if temp_file[:8] == 'ERREUR: ': + request.session.flash(temp_file, 'danger') + return HTTPFound(location=url) + + # readxl returns a pylightxl database that holds all worksheets and its data + book = xlrd.open_workbook(temp_file) + + # lire la 1ère feuille et contôler que c'est fichier AXA + sh = book.sheet_by_index(0) + ctl_cellA1 = sh.cell_value(rowx=0, colx=0) + if ctl_cellA1 != 'PEN_2_MISEEN': + request.session.flash(temp_file + " -> Ce fichier ne semble pas être un tarif AXA", 'danger') + return HTTPFound(location=url) + + # import pdb;pdb.set_trace() + for nsheet in range(book.nsheets): + # pour chaque feuille dans le tableau XLS + sh = book.sheet_by_index(nsheet) + for rx in range(sh.nrows): + ref = sh.cell_value(rx, 0).strip() + # ligne ayant un ref de tarifs ? + if len(ref) >= 12 and len(ref) < 15 and ref[3]=='_': + new_values = {} + new_values['groupe'] = groupe + new_values['ref'] = ref + new_values['famille'] = ref[0:3] + libelle = sh.cell_value(rx, 1) + new_values['libelle'] = libelle.replace(' F+P M²', '').replace(' F+P U', '') + new_values['prixht'] = sh.cell_value(rx, 5) + # col Unité renseigné ? + if len(sh.cell_value(rx, 3)) > 0: + unite = sh.cell_value(rx, 3) + else: + if sh.cell_value(rx, 1).find(' M2'): + unite = 'M²' + else: + unite = 'U' + new_values['unite'] = unite + + update_tarif(request, '0', new_values) + + request.session.flash("Le fichier PDF a été importé avec succès.", 'success') + return HTTPFound(location=url) + + return { + 'page_title': 'Importer un fichier Tarifs en Excel', + 'url': url, + 'message': message, + 'groupes': groupes, + 'groupe': groupe, + } + diff --git a/setup.py b/setup.py index 604eee6..1d164fb 100644 --- a/setup.py +++ b/setup.py @@ -20,10 +20,11 @@ requires = [ 'zope.sqlalchemy', 'waitress', 'mysqlclient', + 'docutils', 'pdfkit', 'python-dateutil', - 'docutils', 'user-agents', + 'xlrd', ] tests_require = [