From 85d3152c718416e44454fc9a08b978007be27076 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Thu, 9 Apr 2015 17:10:55 +0200 Subject: [PATCH] [ADD] Possibility to display a value base on a field (sum/avg..); [REF] refactor openerp file description; --- web_dashboard_tile/__openerp__.py | 75 +++++++++------ web_dashboard_tile/static/src/css/tile.css | 43 +++++++-- web_dashboard_tile/static/src/img/avg.png | Bin 0 -> 287 bytes web_dashboard_tile/static/src/img/max.png | Bin 0 -> 264 bytes web_dashboard_tile/static/src/img/min.png | Bin 0 -> 283 bytes .../src/img/screenshot_action_click.png | Bin 0 -> 24751 bytes .../static/src/img/screenshot_dashboard.png | Bin 0 -> 37397 bytes web_dashboard_tile/static/src/img/sum.png | Bin 0 -> 305 bytes web_dashboard_tile/tile.py | 88 ++++++++++++++++-- web_dashboard_tile/tile.xml | 22 ++++- 10 files changed, 179 insertions(+), 49 deletions(-) create mode 100644 web_dashboard_tile/static/src/img/avg.png create mode 100644 web_dashboard_tile/static/src/img/max.png create mode 100644 web_dashboard_tile/static/src/img/min.png create mode 100644 web_dashboard_tile/static/src/img/screenshot_action_click.png create mode 100644 web_dashboard_tile/static/src/img/screenshot_dashboard.png create mode 100644 web_dashboard_tile/static/src/img/sum.png diff --git a/web_dashboard_tile/__openerp__.py b/web_dashboard_tile/__openerp__.py index 935fbb29..3c294ba5 100644 --- a/web_dashboard_tile/__openerp__.py +++ b/web_dashboard_tile/__openerp__.py @@ -22,6 +22,7 @@ ############################################################################## { "name": "Dashboard Tile", + "summary": "Add Tiles to Dashboard", "version": "1.0", "depends": [ 'web', @@ -33,41 +34,59 @@ "category": "", 'license': 'AGPL-3', "description": """ - module to give you a dashboard where you can configure tile from any view - and add them as short cut. - Tile can be: - * affected to a user; - * be global for all users (In that case, some tiles will be hidden if - the current user doesn't have access to the given model); +Add Tiles to Dashboard +====================== +Features: +--------- +module to give you a dashboard where you can configure tile from any view +and add them as short cut. - Kown issues/limits: - * change color picks wrong color - * can not edit tile from dashboard - * context are ignored - * date filter can not be relative - * combine domain of menue and filter so can not restore origin filter +* Tile can be: + * displayed only for a user; + * global for all users (In that case, some tiles will be hidden if + the current user doesn't have access to the given model); +* The tile displays items count of a given model restricted to a given domain; +* Optionnaly, the tile can display the result of a function of a field; + * Function is one of sum/avg/min/max; + * Field must be integer or float; - possible future improvments: - * support context_today - * add icons - * support client side action (like inbox) - * support select int/float column with min/max/avg/sum to display +Screenshot: +----------- +* Dashboad sample, displaying Sale Orders to invoice: +.. image:: web_dashboard_tile/static/src/img/screenshot_dashboard.png +* Tree view displayed when user click on the tile: +.. image:: web_dashboard_tile/static/src/img/screenshot_action_click.png - """, - "summary": "Add tile to dashboard", - 'data': ['tile.xml', - 'security/ir.model.access.csv', - 'security/rules.xml'], - 'css': ['static/src/css/tile.css'], +Kown issues/limits: +------------------- +* can not edit tile from dashboard (color, sequence, function, ...); +* context are ignored; +* date filter can not be relative; +* combine domain of menue and filter so can not restore origin filter; + +possible future improvments: +---------------------------- +* support context_today; +* add icons; +* support client side action (like inbox); + """, + 'data': [ + 'tile.xml', + 'security/ir.model.access.csv', + 'security/rules.xml', + ], + 'css': [ + 'static/src/css/tile.css', + ], 'demo': [ 'demo/res_groups.yml', 'demo/tile_tile.yml', ], - 'test': [ + 'js': [ + 'static/src/js/custom_js.js', + ], + 'qweb': [ + 'static/src/xml/custom_xml.xml', ], - 'installable': True, - 'auto_install': False, - 'js': ['static/src/js/custom_js.js'], - 'qweb': ['static/src/xml/custom_xml.xml'], } diff --git a/web_dashboard_tile/static/src/css/tile.css b/web_dashboard_tile/static/src/css/tile.css index 9158f5bd..c31f87f6 100644 --- a/web_dashboard_tile/static/src/css/tile.css +++ b/web_dashboard_tile/static/src/css/tile.css @@ -4,14 +4,41 @@ border: 1px solid; border-radius: 0; } -.openerp .oe_kanban_view .oe_dashbaord_tile .tile_count{ - font-size: 48px; - font-weight: bold; - position: absolute; - left: 9px; - bottom: 9px; + +.openerp .oe_kanban_view .oe_dashbaord_tile .tile_label, +.openerp .oe_kanban_view .oe_dashbaord_tile .tile_count_without_computed_value, +.openerp .oe_kanban_view .oe_dashbaord_tile .tile_count_with_computed_value, +.openerp .oe_kanban_view .oe_dashbaord_tile .tile_computed_value { + width: 140px; + text-align: center; } + .openerp .oe_kanban_view .oe_dashbaord_tile .tile_label{ - padding: 9px; + padding: 5px; font-size: 15px; -} \ No newline at end of file +} + +.openerp .oe_kanban_view .oe_dashbaord_tile .tile_count_without_computed_value{ + font-size: 52px; + font-weight: bold; + position: absolute; + left: 5px; + bottom: 5px; +} + +.openerp .oe_kanban_view .oe_dashbaord_tile .tile_count_with_computed_value{ + font-size: 38px; + font-weight: bold; + position: absolute; + left: 5px; + bottom: 30px; +} + +.openerp .oe_kanban_view .oe_dashbaord_tile .tile_computed_value{ + font-size: 18px; + font-weight: bold; + position: absolute; + right: 10px; + bottom: 5px; + font-style: italic; +} diff --git a/web_dashboard_tile/static/src/img/avg.png b/web_dashboard_tile/static/src/img/avg.png new file mode 100644 index 0000000000000000000000000000000000000000..61d5dd7c264544941b4de07c7c19da7391b485b9 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m=t3o-U3d9-YYv60aI2MzL+(vgMDv`0AA_6H^vWW90#Yt5>fUlx1gY zGlPJzsqO)`j6BAhjxD-pR%S6WGk-I1XIIwXyY)me;BZYDFEewHKwu6~oZ0#4-}-{G zcBR63>Y5$*bYqVeTs=7H;RL&nw>C7&v9&-crN|A!;5+s)%rtX1_le3eJ-29 zs`9Jhi-OWc_AlMcNvFlS9yQF^lqzwAv6JClyi?%;7Vl*q58|`9;|^zMWvvK%{+NY9 Y4nJ z@ErkR#;MwT(m=sgo-U3d9-YYv60aI2MzL)@Y5d1se09}{11Fqxxg~%=>)rq6&DJ6_ zL2QW`D>4u6Ub}>5aS7mj+4!+_N2QL``(Pu9bejH=Gnb^no z;V5GykZOySIZ!#}7^Co-9d1ma{42wsKW1Slo^Q_AzJ0=HpsN`?UHx3vIVCg!0IU#M AU;qFB literal 0 HcmV?d00001 diff --git a/web_dashboard_tile/static/src/img/min.png b/web_dashboard_tile/static/src/img/min.png new file mode 100644 index 0000000000000000000000000000000000000000..de7c3fd02df5377edc2ab2f1707ae27c4858ccd8 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m=tzo-U3d9-UXG8uBqI3b@|S+0*X6VcTb;dj~g6IpCXP(^kIW8{0Rt zZrQ@fNv<1rJu=XNd^C^60O! zL;j>i8&aRu1Tih)nV5w&0^IwjKl-Pe_ss_f z5$PWY?~5mbQRw@3L|Z8h2Pi1i-hZsniS($1?+5W6#nl~EY)l+o4D5}eOs#Ez#*7Yz z_QuB64rVrv=dd6_C@3;0X))m+t{EqpE}lQc7ksl@Ibva?4~X+aasg6GozXB!xE^l| zp*mft&U*BmC+!h`$!LDzib2!*Ph0v6?2otO`Tn5^&;3XH9@PyUo0<6CKzYX3SXfglv_>REl`P1j%`g&^lCB2Ycup3pqh8wDV$HRgxW=^V@+B(;o3tyM=!*X{K;zs` zJNsjgQFV3f(Zsg=L$tI8Gp{c_jb$3mk&)Jty>i0;9*Xd0qsz{qit8-1&$j^^? zE*z^v9GNT5?><&rhVW9ZN+-8`w^=3=JXITqS*ptUUF~XEF6QfsGlO9kp}a>j1it4x zLVl!CY9yT6sH_4=Qkkz zy(h^CnW*25+B9~rZv1pjFmcMob9nxa>*DG_mx6c^%i%z=A&B{`Ii1-#kO#cOpXF)9 z62$=L&akcie0WZFr5;`|F{>a+RU&ZZ93ntxFf>Gqg^NoZD}tR+efnI4cf06nQobHl zD~{VzUoLam4@$Y4&WwcU)4D0$6&c{|VsmtIU&LABNw~$fq}zbg`l(_z>3f)0OnO2^ zc@jr<{tQ*1VgqAEB*2gxp+a2z+wY4tMg+|3e9;<9CJB#k#J5V2ASpybkY~zDc4jwe z>a&!^N>l~oiIv_RA!b%fGS}Pa_BZX8ELyKo>Im-o;3`=WpJOPH|H% zc6B zC(JnZ65Vtpp6oB&$C*E*_RvT#AhT{pXY@U((-}Pq9kC;D1y>H(gl*wCeBRqLXhj## zN5ngP%H~VAuH)^lEIKnp3FQ&qqjwdiA$a{pG(veVItW3j5sM#YN!^*zbY?M%5Ncdd znFR&?Q24$s?E@7UJxDA;Zj~iMgwEWw*yy=7(Qy|Jk?|~?Jlp|+^_6xrKBflF_`|GO z8l&2Y3a9h!+{eQszwWO8c{dH^b07BaMUxVL;f8aKeX=~yLJ@T1As*j8saujwZw<@c zX&~}hipubr^;<((iD_pFL2FGT2XaRKHs%M};yZ+Eu|AX>A1KMN$YIXhC?{aMYdgy< z4dr|I_g~iH>Oa%=wqe#}J34W7h_NPpkAJY1P4L12s5W^8CMWlghp+9UjgwKfa2ygy zYOC!S$`O)$@!72`yZI(EF~VJ|f>AgSFtFV>b)e29n8#Wb@_5~_S^X%YJ#iJ|cHWrD zt)fzO`WR%V;60wp$iz!J6G5c~+I$9LPYYKGu%0DMn*tH(e^)e`0Rq(8gmC5 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 literal 0 HcmV?d00001 diff --git a/web_dashboard_tile/static/src/img/screenshot_dashboard.png b/web_dashboard_tile/static/src/img/screenshot_dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0335633e92b2283e00daf509cec6f3bb186743 GIT binary patch literal 37397 zcma&NV~{67*SFdDw{6?DZQC}dZClgUv~AnAjcMDqwR1na_p|YS*odu&(y6RGzf)P6 z6?Nju--_}QaM0M$KtMonQj(&|KtLdV|Bj0x!T)UsT5gN~?EucgQmT;u79U8{h=1o$ z4w72VKtS+A|5<_m(7@yTGh(@jX}YM`o4dFhIhg@j*xB2f(K(wqnVH!+TiUzafcEkO z0TBX8i3+KDWL;*vd!VVU_xZCpd)rY%K|ygeDFTYH1T$D+B7nhAJ1J|xHY~ROG#d^M zZzI-M*}AKlDhUB2Q7sf}K!pf`ggkmXd#B%jF>%Bb3Yj4xUEg@#JEU`+@ZE4d%y8Xg zQCnt|Ad!eiV=@^JMIaqCNqiQfMf|V9(J6wRwo?C43jY~ z!^!67B-~~H8W)975~c;V+&y%xr~k8xuY4jo(+uf7zTWn3_o|}(|09WH1WS18F6zIM zI7R+XMNFd%|0^Dr==gQ`zv8oqhH!iT@2LK1X9-C=!1!;Nj$w$-pZ^K>e+)B-ei)+) zHR!J^D%2$5VU|e;qx1YjZyeA*Z8On614*cmSLki7ia-*vxo+;Ow_dWk2?wJIC`Q@| zXo&I-8NEokLwb5&oK6F>>wYf2$=C^4NoZk@FbmA1afQwi--WE?zP2Nk(!KO}aW2+J z9|(P?+EG`-y@u_?7$P;Ge>5RD1TZ=pW3++R`xgJF4gS$ zfrM3)UmDdoz~T*u9)+FI_6@#RrxX2489~t|3II%jdEdQ!1u>7pQrngHAD0hZqzR>) z0Pl5+hX}kI7EL2JW$Y|4B{Ede`Zo5uJ>l^*r$h)*h61^D}`}1 z<#22yiic9%dm+l?W7r|?a z)MS@Ovw@a*|Go;%PH$jg&Zgrh+nFX&$tM2%=Aib&tpJN<(@MEW0K1AOgcqh&B) zgi-;JyC63E1erHUF#!SPMSxkdNk?^225ICF(2$fv6m8|`ujQ!U1XTI=G<;_UeGy@{ z6X=mqsAD#A$9b{~01Br}QPyH6w?Z^92IzGtshd_}Lc};Iw6gwyP!CexG1saA)W<^I z)_{9BuXN1J5+f+}y|uQuTf7fQ8(i^1iK{Z7sjtYEjG2@%CLPG>S__=&k!+L1@=$ZAuoe*q=C6xk`uaGCYX`*sWsUDgeT!FMB54Tjs%^SE3Q7_;z4Iw0oVfROmxmfGHS zsV}*|F{;MsV|cjnwR5D7D(8%!Bl8etMgr^pmH={e~*-3>f58I zPYMphEY(avdoQhli#}7VfWBzdtNwUKV{T`!&n8Ca5}#5Y-7lqsN zVXA;Q`)%#%$h^B$(l0MjD0f%LfUL=p+p#(EG@EIUv#)Tir+H0!d)ht%Yfli!g}t4E zg!krzfL;d_`zyu%)f5YX%zj6l2wT?sdp8akMr=)8;XIzMuc@T)ffI{7Mdw=}t=bcaBH^?fN9m@U$sNs4acf zyg{`RV2q_8K-BuGN_9^iTUw2Q#j-zn!!bh^{Ucf4hocbk=3l?O z@TU?j$A^B%T?efzQc&5MB{jD7?$(UCrI0sCvfM*fPXPkZr+SrQ%T>sm(vmvN!yxL$+kZQlx5JCIL8({u3F3Yv zGUYb$ye3|<`XTM=#LizMEDAReygV1h=8OOA?tstH0I%~M&n)UPHh2DUe6tRAZ3dM+ce8s$Q#eqDL6GiVd`O@JzbT375Bqx08#2U=bMl$dWnY#yB zYWpjBpfB28K@$mCazBijlPPODt&W-tcXvq?;m#{f%7KQ)==s;!=b33Bsx@z&XTSXp z`Vww6M<@W`PqqvM&LbZ@)DMYSw_y6(=+a6%T3(`L6ha7H@^sVp>jvem93aO;Z2BVF zaVE87RPFyQ3t&ve(^**r1`cdnaGF3L4+yNXs3q(PPn}LSYQP%v;f-sQ@y{bQ7Iw*) z+ZT!G2b#FRDNolDcj%2?CB=FmyZYVBfYM)ML`_%H^lnzpMGots# zu))4MujoZP$e8;~f#Sf^7USC*<+%UK>ao>yK%u(7xeR zzIutamUy4d_%bEtD}N^KL(bHk|8f3tH(5Uh- z`KDx$=m8BlQ{Q@m^>oOnXz(vypz zBih3ZHWuT;Pd-jtwJqfM4WPfztToO^<*n5wI*sxUyB}95%H!4UompS2Dc9D_$fn%t z@cCkppiKXWcp?PslTpxe(ztGewdR%mmLs4w$C;JDq_>m6*7 ze8K6>l3gI*>7p#XiZn)IyE8U3<_)&@n}>Zdq%@a1YI!lGv3`>BIF8!rFed6v%4Wjk zK;`W{sk+KN(`x4cHwSkkZTW`&aEonuX%(C4a015D&x0B&NV@18$X-@wyfkxy@(yR* zW+kkCCLmt z>{`0qI6r0_QaECwI@9z1OU_4QccfC1)Qqd`G4h+2mvZm)>WbmitHJ>UPat7eKNJLr zD!cMsjkrAYR3r{OWN3uQ`~5b)C2JE+oE{w_#Zv4O77!1l zld60O$2FwVdH9k(7Gc}tg>?i4fr^7E4iT>TN2{HIxX%qOGWogF z)4~Q!?vLBEhu7@j&#ZIhN#WZVMJ%f|KthLKAP4r3jm)rA)hcIr7=~No1O&WA#@3k= zh12KKXo{79YrJb)%@yZQ$kP6REWpr>jyP37a@5x*s~gR(y6edZ#!B2}>qi3QWkNsh zTGY{Xf7?o^&;)6@_pgD>m4lxby}B02$&Z(K+8~14y5GAZ8;s4Cfy=s5d6vNUA`0=$ z7g!DWKC#g!1jeKKj0U%iXQ}QYi7ojBqiitmb)^`$w}e86wxd zKah^dNN6@>xdV8!yKw>KYVOGU(&gJ-u%7!*Y1$0JV>JvL+I$4D`IVb%Gxg;3pIV4W zbyrk_Foeyd)&3F06L-jc0iuLdf#$ioa_H0_WqmkMdAb~_3u@4kzgf@!NLuJ(#Kp`L&B}Q&kFtu8XW^o17IuOk0*pf2vq?*UU5k39(w4nxE3}Y{YdJ+IUml+nT7v`N;A$)IUiVcR8bEz}kil*X-qkPktL$)NBdLVNTg* zB;cNu7>ht%e{@M+g^{qCxdyp%CnX( zRk1UDl5r__L#5a|{2cg2M&b&r&;31XF|pw=$4v&c5h>6l4x|V(o~YP?RBuOEAgJJk zty?`9MMv?MzIfln(PCv;M15=wzCjC9K^>`BWq?X6Be`y72It?v$%{}OZ}=KtE5r%E zs$yYfTpCQ5*~#TN1=nC!?mS{Mt>XM<8o>gHezQvfn|HIFU{+@YG%v3`HeQ?N`;)jw zuZ4TQ1j}DFoNYD21y>6W1?%R_zDlGvFoRIhX)kPO4|ZI6zwMe~l%$w=Hd*<0 zs%(jEde3UWU98Isa*BloDeNlNhU_oig04;#VO9bYyjK-4S{~(H0oh_$>VIac>FZYq zCXWo+GaOy~z#8AZbYmKV*?Pm(ex{A><;$Rm==UbG!O$DO1v#IAD54k-3-MG#kj_!4 z_ydhwaF~18qoFkG)isOcG&`xnre=+9{_&*Ejt>wkW1Hi&OXE*Gk`ZToVej;#s)oy@ zn>1OQ;Jvm2M>PK0Mtz=!zf)ryg1er4boaWSdiZ*MjrAa$3a=efYLh)$whiFRf9c;v6fn$P|37v@(H1D;`pckh}er(?$oHtD76u6EE&+ ze(mW{=M~1w;}Wl-rOLBzL#{z|KZ#VEfG@}oz9QcbVtx!v@Gj{a4*k3X76QlZ>ghn= zu|@O+%VmMvYoLAl!%ce)Mu)%DVf^!%VI_Dp*slxXbKiv+mMfKL;z5)+<|uwAQo27J zK|%a_s~_ja#7L5~8^O&c?hCcw@qq?YMK=;Z`8qgy9Q9*S`SN&_L`g2PdKg9ma^eT1 zqEkI}cHS+V!sG&e!ey2r3FSl6^6-k1RQf?fwwq$Z)L=#CS)IGJy1ZZNHJVOf@HBO{ zEZ={`t1t^%jPlnq5m>D6_;kBHNU?y}%tEAXFd>fOk*Z&!vo{h~SAvl4=Hg3%Rq(i& zNA^}2O{W3x{OciYA}c6d7riKLK5K)~Sh)ojlvld++FyhkHSM`M)4-c!-n68C?J*VB zj5+>f7~KLHISe~}bDhe-9Bd4KA$Yo!)ChDx33C1&@h>n ztVTo$zbC6lmzFEC$I8Y1QHiA)%UWAgJd{I#%8Ud-Vnqe zLvgu>7b`awccms+hQPKj*7|GYL7E>;w6LB|$iKe7C?^HF#qI68KeUvrie2NLAFXh0 z?KfOaJyJPkgFGZDL`|}d6tD)t4$^p>nPu#MMIOa}lG=GZXr(CR4sBjwpQS3l->pqi zXgwd9Y%ZeqjlV0Ce5BMIS7Jw8IHN4)cBWY1w`a%MTf(-z-tH8m+G$T$f(2B=*!%GR zzWI4#75HqvVp`WhqiUzC?e$|b@is+N2-&X|xZ9(MYWulEIAil+F5KCY53NG3dNj0K z3GyqvG2RPDxLsT7eEUTMgmHl&Y3X`04T=5Xr|BxIS2=8=pu?G-HHR-SPHqg^6$o@4 z0d?-H7AgcI;g3_kNqu2ZsyAaS8f82;!Ne+MeA!MMg)wepfFaSQSG|)n^tPpk*`zGV z9-joj(E~9O1F}9Z+5@k!@`x288QDTo7#$f7fYGYFa+b`qzi}2$xbqYBr`6_Yq;ZvEdDG7+E&gqgi zwcamDbbBbbG%)N8mk=P_KVgJUtzjEK>7em$7gDLbXQp$Hk65s{-|sG0u6B(}Xi-v& zMTwBOXjT~-&oZ29W6S3!jF0Ey0VCQ{VFpOnMLJ+EaohW8F8%;b1x0_A#;Ah0U`L%Z zHu8g%TVc#sg#Qi}cva;1V`!;@!vmp{%Gx54r{sgPkCI;?4lFiUj_-Dl3P-ILVPD7b zL)&0CQ%E};pc0xavZqbh($pxDA|(^Wy}#z`pbg-)CLTF;k5IZbF{q5Y8jrd$SNeHh zX#TpWt6iNE>RWvg=Z%5IjTT%KGLiCk0wa^C=L0KK7JF{O4?ehJYD&@rz_je@c1D0U zTGaV>CXIa@Aaz!YUh)L~jbq63dgiF=aYX*6dkZP7Z7fr&4NMK`V>s;y6(vJhv8qc? z4hS%9GzJU+Gwem^+5<~qrkCkNKp|ZmQ-9H2tz$S>TDR!&|?4Q{Wx36pvSK{lkxP=r}s4wI0a`v0cod#f|ul*guOi*+943swD!Z&LpyId z)g{g5Y)OpH+xv#v)c8yNd!rWb_8oi4Bj(f+1pNKl=Q6Lyi3|G;Wg)HhNqO2ikDuiw zS4oXpvh|gfXn;x}%IRylX2$4ZqBZ-Z+LUI}5ZDRKygifes^cXhgG?~^h;QP+llIac zB1oPZs2O2M`Im=ceZdPRh-HK@m?c>r87`B9;>+1Yo>*)GU4rPO(A@Kd5kky@#F5Id zkp)|XB-zu7V1}aU*O7E*6GD=NC8iP(3?y=anqY{i#tecMu58Kk5 z)_1(N5ra84QI^71qT+8=%YfrkG2X`V6b{5y#h6tFus^4V_9wKMz6c45&agK#Bl z0m^6-Y7v&W=gr7-jL_kr?Sa;4sA^>=yJNU5=y1MQ9)pdXv>vj=YLWOi4hEHiaEOZi zx;R=WWr~8T`Hqi?l$NWeTYu?Nd1b<7G79ov%y0k^nu~_to9m~^)VoW4c~WKn@)H3; z4SOi?RpoiS7sAL4X93l&0>~TBg_CM4NuHhpew#-^8|snRKiD`UJ#rBvq{lG@!?zoZ zKNtG!Hw%+(cF5qYvc1IY&iQ3y(qxP#BE!~)l*FZYn%nJoq5rz5M}>k&7rnLQ?*i!Ng_w9^Pk+dv5+ zYP3BrEPj_ovFD9Kb^rn|rI}NPKQ*9@;2k+VxV(~PkexzsfB*H1 zW_hwwag9lKQ+IJ>GKP>}1$Xe_i$~rFJTck;rhTw!f6fj|L8ZqJD-6BSLzqiUHnt8! z5z(gAcy!xH@L0hiI47Xw+kYR)m*V$u4VR4=j{kf3KOVb7&UBT_Lo-W@56kat< z(@A=)(l2lE&CZN&(z$~I-4VEMpqrDQ{bu3UwMQ@|-j*71m}%IcZOJTLStlp{F>z;;Op+q zivD_Xwk#jL^6{|u59HbhC*ru>>Ik4~TQ05rde!sowF$r{R!x6i8eTtq)Gr<93*3p- z`#uKs(f?fBz0B6`kAhRMV&x(0`!$D+qg1>aR-&kFz*zG;nek`R00FQ$6bdY38ga0`Fb0sq~(;$ks@Jl7;bXiN!(P4^&F zSq;6xg-FM_;^vxCZ+YJs(Kfm-m3B)ZQIqXY48Z~-xHiN$-5Vi+OOWgr92Wo?x`%{w zc~@F>uK$t^iG0vGi+NXIzGKW;dwC)Ppol|nx6s6I#2_FehCl~JF&^32m<^Vjyht*o zu)cqu!j{{fMFq4GF3nD$!59-9F=S__bfgbyhjsnwQp>D)N)BLf0o zb$uy0Rq2dQR{&Om)JUEfJm@xt3PwOOxv<@%zISmRlP)nL4=sx80asF(l4YEd!!kHr zuX9e3txJlsV4ajk3TFIdM_vw^m)I*A*iEQos)2un%m}r zHDJHP8hF%{5)z#;SM*vtJ!^d@OFvkh3rK8h1KE`(%;;q><>{c? z2J>ijxzN!(hgr^7mv3*^=#Lao>z#Z}`q{K~qmh=a4Nm@O&m5-q9tHbwSdT#kLLUb6 z%<)_SuzB{WwBM7qx8b|f<0xPcT7acEe__W*C0xdi&NYvP7iDw1xeI%L#s|Urw~#!D z+nC#lk@Quw<#BUjtxm>D}PUb33?Z4(Td-ZdAg=6wV zkq>EFrx4*HQS?2e*Q5pJl_&P3%8q5N&5tf;{)@?7uGD;y+xPUo>W=k1L9$4w^!WA7 zfL38S+H&xQ^r8EMQp*oR$37#Nt0rx?!IqMh;^-?JF_53&zbpWxOIzIE>E46VZs)th zr{T2fy4t*^eityn{s*71^$OZ&lM!hCuMHA*TbZ$cukQ6%N8!e!7w#8JgflycG?c$9 z$;ESaOp`rW&pO{lEatfqV?Msf%FqjeFqbQO+m}L_r3dNns*|vJ>s5`*nz7RTPoEGE zmLLk$FU`6=k8|ToD8C@R&V}X=H}x8-64P7ReJ@RiY8nzmko*I|hL3>DcfJl`SBq

+q-kYH?PHtqbh2zC#z3(6s#`E&8`)h#-?y|sDDJ86MCeh}OmaxN*KEsitb`Cfl z1NKm#zyCx5!O!^I&#&3`7HhxPdQ^-U%$Iw?j3%5uxiy`1<*wg%CQ%-AGWmwJCzw~& zl7;#hcXMkuw^J!!vOOQJ+jfc4B~-FXN-^8p=J1Ds&M1g6nmxCJzcrKC}Yi-nmV#>&0quHY`xuy;&#n|%guKq+tuqcZ? z*E7{8WCeDP%)g{UUa#rWU#$%A&+vs9Av|^)b9fz$pshky)y#{3Y_m^ScG-QPHO=fi zdpYd47PIK#VfyzOH{7h!GD{dAV;|CZD#5z7+a^yx+f%KoS>pLsqIpvskh4kD=Oi1#aOsFM`>vXL>FO6?_R%wfXuP z+~wkonV{p%F0|F2t@TTH$o+bH zXyrRjf?E<&85yC=jRzs?gb)s+v%==F_Zj(}P4OfUI*ioL^O}DfJ5?rCmZv`$&4vcr z&~70*pJQ`svo(Bv5}DNdRFWLdF`gETa`Rw>e^)x^vUFoBb~rTI%5{qZOGJ7j%=OBW z*G&Bp1acjz=9j)cext=DufF4{^B8vU96%DJAC--g!?HNg5`JSId}f)N}cE++Nse+ zZZ4282_m!W+EUFol-T3}p(Q=yeu1YgY79YiN+uvV@HnP~MpQ$g^MW_3@a+7+G^aM6 zqXVwdV%F}}Papqc+xGRlzHCdBQ!hjoDp9N(70sozPBbu>+M`gXt0;0eo=|K~V`t*@ z;q{qDvH1LML+oSFKQUi6P@Fi+Y;N!-xxZFO1}agMPrn|-4VW9#)z@vJLuI`rHcMHo zHo&P=1C173@GNa6yw7aRhO&lijDXH6;F^l{Iu z5{O@JrBsw_;2t1}LL?KU3M@O%&RQkZ3=VjuO2X7@7dAd!yHuwRn;w`sg62)it%lF}Vw9xlew(k@v9a02SS zl`!=9kddIU&~Rufau(-Zq9`sGs}LwOWj->;`098*6gcU#qIdw~T2W#^OfV;xAetL( z6FCY}g0S@boTbzV5f|DL5J-$v^u)@l7?ggHX`(QS@-1>+JToAV3~R{9NZ`-EN~5!3 z6Msk9LE#gMa!CME{M9SY86MaEfLRyZxPJ6RyD%@f*~ zoSZcIhq}cYv{?cQ@uHy&>%=+G{t7~!JHHX*D~bdF#BtJ)pB8CF@8*Od2G|Hco?cT} z_3ZL+O>_N-L&@ZFe=w>R!tJKV-~ZAYafIj+ruVO7B0j1OSsF_5(NgR$(}0`!_`XR? zu8by^{lJUGeKZsWS_ai!)WMGc`0(ajBRn1-*~Dghsh~(<-fx?rgM<(;s+LZ^mt8xC zPNi^4hE9Lu%tLD@6&~$@57*kunaG2S=(@xjlWO+_z?p+bP09x^l!-h60D0YGzOO2zfGa{bFmN?*_o~7J+IQ7&qM@k0zwotDBA;R5fk%v z;mW`nlW@25@#2J@$LkNEH&6+@@6m}5C9ILx@A;fVE<46OeE(nD?IP%5($0;?V;-1i6%8y3 zK9TY5XBXr4(O&rQVa@8RgNd}Iq!IuE79EMtf$3`ABKlaW?7b_d$JN}ZQ=!JEYinPO z>nfjJL0|YBkdWPA_pj}Ja!W?pBoszDne8D|^%SD=UXZCz@0Pi_SICOa;<|$PUK$Dj>4TJ6wn5b;A&UZh07{B$GF;%K zL86c(D#5uv@IbpFxeBTpvFOV!H9iQyrl``6`vc+8kpkKp*ZHte2|z|cA$KSvzY$o# z0e}I~TNH9x0379DXgH90w526w+5D$fxJ!*p8swk0JLI8>Juy0F>VEDcBy!;hNOW0C z%Q4D#YirSgu`x=Ig5XU3ppf4V0q5YZwjM}Rxrl59JZMgW?jWJ3FcnlCh53JHYLi?o z#GqCXO2rEvZVTiM^JG&i0Z+fA72OvALhduHaKdVcDFt_?ic8#g1y?qDT%t6kh2wE; zPk#n7DlWh~8p$J+zRdXWxbk=`LBeax8|ZneYO(n*`^x7-sn?CNFaBuRYK0V-A?Y=g zQiYrSiqv#m6joB8|Uv_Q;OgcQk9HkaAcuwWfZQf*SS-Z-eDa1jxVZjMJ(~p z80&@dhRTc1YjFdi*G~CaE+U+x>F3-(ett= z_9t8zm+}i^g2}m;c0N@eWq5Wx_@EfxpRj>t?!c#-ai!8?_rs|c>ZGR^%{CACHjS-Z>m9(9$h?f{;-@aC=sav(RpkN|AruNTGM24#s}pT7Qqv zeB`1O+GDg>xtnyiV1(ts7k%?FeI2n+?bwKM&&VDBAIR-EdYO@qFTu#B8zzPZ-b$41 z-SlYUh2R8Uv}f;U)Vqvmoxcx~^7UJqd+z4vcLHV?zlS4UPyR!h4S(=`8c;NS*$0ZRSJ@#o>dG$D^OKBafg=UiEW(SB*%}DPtQW>Je61V#mzeV zqpgvREgA4ueM99;OW1XAnDR0%3fK1fo)oIk7wIc1VpEqpt5ufg%WVdZ!sw#typX1&DCL!}Ek&h9LDWfGqa$tn`bN)f?MH=a7$4F*F0CQPq0OjQ;bK~a$WfFRGi4r+uXFAsQt?OyQzwI;z zG?_p_BFZ%Koiou7I>G@NFGrEBwzns{Vyb6zg#}H??csUoZ1ZDh%cc_2ct)}`eOSTB z4_Jl5e{Ak0+ryv18x6JzlRLtwMOr^ydyN0e^zZ8r4#f+cdJJvW=}~Sc@Gq0=Z$nld zcLTZk*m<9CMe^T$-&o7Mj4QGCnVHkt7D~eIMe-?3(#ie=$6ufhGqzk!ES0$J3@sT1 z#_n?b7fl{uUa$6E7 zTTq?e-kV{2UU+2#xG(IAz|4BrK&C?+^Xy$gMwvHFE!;^JhCZfTXkY=&U|am(JSI^& zN5?@DSa+@LX@O&p1h+nPgr6gcj7EKcfB@h{sj6QSJwj47_{qBZ3=! zw(xwx$?NCyvzHFf4-UR2QQ>Dvq%^0`0$7mW{qQ(72k^v7)&3WApmWWc1P{uqyZvD` z9yR91{iTJ|wAuF7roBHhvH=4H9AuHEG}7r~b+`htxS-}Ii_CRPwV2CdWZ7m{s!o^xB>7At0eZgY3OVisrjg6Z347ZtsY*4G7iEGx|F z_N28zgc+aT2u|2W-HmuN)>exa7_E^D^*6lbYTC!bi=4C!J1lcf!8{Y<4d*vf4@VHt zim^PBxBG+Rqsc<-ESkMw{`Nfv&|;hrKAnf1<#W`dF^u}{2uAbaNd|)(y}y8yq6z1` z*<2qQik0@ay^L$ZpSeRh!WfKlm(VENvA`DE4Ry6Zqd8ckH_6lz#zG4d&>y%oa{~i! z^eb0bgaf0*V$|f%2QY37@!7Cx6mI!J1>aW*0&XrK7$?Z5ia*L6r}C!i0q7Vgn2b>s z5?zv#|B%h4yQs2>bRn&kP~6wn56BH9M!YJ)c2A^bi|M?nJG5mIc0~OeVnTMxjeroV zEBqjm6Qz0GI1SgmxR4%r5=(*F>uINmxy%nGIJ)t!K14oZ`P>V`YDeXIMp)AMvzx6t zpozpQ#X~&)g=oqdpRgmj{sfLB1di{a z*NvUx7gh>jA>q4}hvx^DF+8?V^%dWlt%nMKH*BSU>?VUkhR`gNio;>I+$;nJi>nMk z3o({Rr?1@v=jG?hWZj@*^uq0>RaXC+!h;n;`src#kx#UUeRFOxx+qL3Scn%$oCc~5 z(dUCmQR?F1!QV}8VxRJkD`@ISLn*i*&wPo3ef56+SP`SBfTQif_brolLt z>u1`h*?x25A{mh%WV#2Xe;-9xPffX7U(B7e8bZy`d!lOfQ;X37ONP7(%Mo$rok~-Z zZoWM^ed75Yn;Rlv@K<4^*_^4xA1qNFa-DxJQjoIbr8!0lgz~n2*|wI&2WKya$2v`~ z40#S)WN4)6qMP?gE`)hm`oT1f&5GdRA`81v9cq(jb5dp}R7u;6(MFK>8jhb_@8syr z)vXEKl*Wwwx?_9vu^IX~_Uut$G|XNifaCg^+0hkOyPFtAky_0B1k@JKMWIGWpr_}# znsKhnz@*AUvtc=;B4hQ{1QU7T?2p=x;34RL5YC5Taxj%iRWJ8?q*a{5;P9@lHa`5( zqcz@n835gs%YfV%hEu|Rrvjz2spq2r5>4^YZO z-HW_QD~K5MWkSB7Oc)Krk^&pOZoqJ90`2+9_kaQ=0>8LNEe?`oJWSn=A6EaHj$$+U zYSP4A*DEF&KOY@%o%-yk&yy#zo=Nw8}7q%Z9SPBsypsn97t0OnXh3Q@x-bE+DDmb?dgb*2u}BuI~vK7rsM!Bod5+} z>vx2=JEo8vDL-ylCAuP0C$yFvDG`_Gu!;=jy|C?BI?d$mKZf$Cbs5uXJ&~^tscI+Y zVFE1VuOul4ASrg182}u*8r$DUimB>`kZDXLhCdz9aCNXZ zQYHq=jz=U`Kft^zc6sK72qu;0rY>?Jd}M7mAA!5-B<5Vv4i7J?KKeqOHlz3_gJ1qK z4(dRd^~mAP4F&y8!M{X>LmW9KNonAc|8yex950&GPY!|jRr@%+^Nr*wK3#~#C zQG|d#;?FDD|B7;JShimXw+AlUjj=#y_V$kmFoakhZITc;DJPhqR7tYTK{foV(GcH3jsg&Vry4oJ&c(XcE1hwet6&~Tnx>kTU+??8puQl~(i+^dmKL2w` z>f;UVaX`S5)}|&{`9cdw&Iq2`25mYQerY2tWB#jdu{aC;%HcGc_WQB@2L|8MpKDPg zb-u*{rv@ua?pGzWvTbcHmS_||uCwLXI#5{KpjqDa$vDS-Ib$Z#zRAZu0p?dK7H=;a zGP2;4I@8IPXIG1cK<(;M8`w#)py8r|4a^r8zpp~Y0Y=%vqcz#Qctbw5S4~xrUyB{w z2&o*0xLp2}#oq1hKSn0;;nn~7nwLNF-f#ES!aUCAIx2*OXp@7IFq{xF5`%JEqVlPw zS-KkIZ=>3;<#qLoW$R_HzuE{(krA&dh)9ZEoPhS(ka(WXwM(|qhYypKcvDbPNu=?Y zt6v6*>1!4_YrbwdH@vefvs3!Kf52MJkiVL8B-BBy#CZ9CWclBBQTf|@RSN%tXWOz2 zezsyOQ^XuJmr6L_ZpG`SFtz#x<=7AERQ^1%2;4KF~(EBDoYGsd3i^ZZ_Wc{zUl zjaS!NY{Gsv;)=A5X@WOrWJ%p#A*l)5A2Z7|{K>%47t|+H3!5Q6giYJ%p?YjQ*9KbZ5^Fa92yqoh1X+rP=6MW;F zP*{5jZ!_rOgpWm9!go3{IJVXUL;_73SNd~w2x@DUSp6Y z5u6-mqEI*)oXcc&tSj&N!ha70Vz5gUWkgl>;6hQ_3I0Sg=RO2Ku6!aqsDl=jnoT>9 zLnuVNx|+t5OO~0vugh9S3D_b%i1qg)&rxC6En=`U*|hJB{~lMK=mA>*cfK6Z;j+D+ z&Uz8N37eIJSlHGVQe*Ro{eYt2cV{pB@nTATeABlw-n3@;frt!(%;i z{Ak%;W9ZJ`}ypo6&CjDvSNae8#iPzYBg&YCz_FW9Qm!=NsaS zvREbekfb*iyq`H5`Gttd4@r&$7m~--)(d{E0{@bda{0DPU%}d|t0qPf-7&bQQ8%qE zt~YDVp1&{1z>TcKhA6HILOJaI_2T7jzW2M2g5%}aLPPIW((vaBLb-(A$S?nQte0&^ zGzPsagr)m|NuIKKKDr{k2>qUzVkJUP!rqQEr<{)uys4fy%2^$ktJY_mu2nSE0-@?a zqBMpjgg+K{fb9nNcso9C08&}uU)jK-kyZt5%x_3wpsvH>j{Z%p!6T=)CKvD%d$6FY zS6X36$;`QMDLjqbk+(miQKeP6c)f zH1!8-N2peX?EWjR^61>T1S*Z^qfI3=kBm*SLtul+xLr=VgIqe)3I@T-By1>~ABe!%32 zcc~+ztY*7Xj%@F*;EE2zsuNC|0JY>th7=Rv9LH4U)Qgg(fB_SR{DT{e`YjL+Bjw)B z-J*}X+H{V5D}B{FXkGERkfty8!$;mf1N1DbO$qqu;coP zfX&CAA`9WrodFXXRybpid7dJWW<=IIOZ_QdOcM{r#reBK^3h3oHl;-yOc)45Bb4V4 zN56(~(&COe>=^^F$Bq(=K>6h*6k;nSGVww$p9M6?d9=!hnT^ zGcK|iHinP#OqAkG@BfRvYibfDXtHD8v2EM7ZR?J0+qSJcwr$(CZF^?t+lc)KyKmc1 z8POdT72TOxS?8R}2G^qU|EGWW6m7txyl{MQi$v)DNFKr`KlIGjZLr<;LsHwAApYrf zTJK%xts;v&8^aFOrA1;{T5@o>=k&8>@w?naSlj02Q!U43X>Wy z@{gl%LH~>emB~07q^Q;pj7v&yMErHdnv}>+xjT@&HtlRF&Y98k4&?&>NeG2rpHJ9`w+~im6c4M+dM&-`|9*5_5~P+sScrZ`bQ3!9UMrn9aE_JY;o6+w zI+%wnu5Y?0HCngcMCJ|J!(OKYYG+eCsIB#3u(?R5W0!%c7Qtz>=xt_RMlL-vaT^BL z;=sX;>cbsSBw}Y4kL19I&caoIUMkaD){_-!xPmFN-5bUlNbX03*vkH;5JsK~Jd6mY zPk{+}kp4;l)#YWRXs}FMJZev|RqwSo_u6Cu^ZSv>s0CS?0gDBedm;4) z{W1xApD9Yy?4byzq`<7Y+^utv#l-Q4YiV)K;lVkHGkKtF^t)Y4m7caJTE{lUUZS8! zOsI)oQy7Qe#r8d6AzZpH$f`n?xzN#t?v`crfaj}T>$$6&uLJa~2-?g!jY=%%b#`Ay z02Fk-0;gRD%J--N{O@alcAkc{u_OB4O+hLpzEWY#oLSE3Uo)JTH+(xrW0)t;sfX&H zLQWdW7EP~Zz&zvA`m40sug|qN{1K@Zav)escDzf;&@cJ3`=NwIVtiorDaLy@Zr2lr z7;K^gOLijYhGUgW(`8j3e?tlfsxJWH(yQ?YKl92&Q(3{#0qF<+4!JBfWk63j@Sb!c z(H;69EZmZFZI>4pcq)-w%I_?D+cfQ>@@M?GFfI5z=)0^VbeLgB~ zx8Zjw=xm(Ya2Su&*r2FTrQY2fDKyG{wH>}rBcm8AEgrZP=di?-&~{~dvWlwLO%pCV zue_|kBA2;1`j=}7gn{) zSI@`2J~LyzSYn7ZsP#M6hkDcLR`4~^_H}B*B=KumHQg_jRs-C3k84&MH2*X4%+-Js zp3rNB?v8rx8iY!egMv<1Xsm<9FBX=M4{KnFIB8fOUMWu*QGy8U0BllDk62Y72yA%s zE>{T2?6@$@l zuilXTf(I~^Vc&^cCNeV&4cX3^l)GQbw4o%2>n^LV=|ZQq$Bf|v^--s0cTBXt@)B@* zD--Nc?TqKhK$y~lVVO|Q?W*Z7Ks#rOTD7$9rN@; zG^0e-I2jKCREp_dh4XKfmql0hVkuiBl!illbga2 z;+!Wy!`$5AIZ6wVOP7;Pk%t2AZU9eDh(JTEe+?&f`c!|aXXvfrKDOKIV$y5?SnI~o zVIZP?B)MWLlc~~*R?&kt+?{DYH5sLCBA#!`(09U-wfjXsI?bx@R3+Bf7{jCSF z7_^;mGSBE7oSDeeuZh}h0IXG)mi~y1A z8R&6>sZn@hh7*9?Qd)T{OlQ{vt%n^oZaxLMp>!dkbF&ICD3X0^2X1zfG_)$QOT@HW zZ~0h8cuVmU9?JJEGDX@v1mR*GT9tYm>;R0X_AUq`pN1$8yc&atxh9TAnn7~Buu4*l zsXt`kdWn=)rt7qf^~eu9W%>KrbZ@s!PGHBq>qFCPg&#qJ_dHsd-ao8kJWQuTEE6dq zW%WA9q*+`BMtCU_aOG>r03OaJ@+N6lGR+c%75I?!rQU|TWVR9{#!@sB69;V#fI=s2 zXFe&Kao)#}ot*k8N;O-PWUkAM2cyW-R1kuL`wh|jny>{OX}1M8^{YM9y){SjZX1b@ zTAqNGtTY5JPiD-Wl`NwmgOQC2pPJBocekG!S;{h zA&=T4Y*;-7ZdQl()K-m-F@>i$4Xd0#d|n>1w(|>?kdsw|_?gp8qInt0 zg4237zY|SI?&%7-Z&_(L;L{l!WeBHskR>)p`iQ$^%~F-fQk7n+2%}zBc#{EDe>0u{f6O34efHE8VKc7>O4JlL+c!dKJk@t8k4MyFjT;~xFai4a8hNZ!mY|L$3A5X zSiIIh4@>Z#HjDWF*3FC=hzz|9P|nLay`ZCamEygo(Yj;Hf|H4gCqkcfW|?TQ&U-zD zO7L8>(!<$&`VhLhW4dHEWTzE8jpr<9B^Rf{uL2P4Xlr~^P+%p`mRQjpCBe$sf1}BC ze~l?|Lr3!v>YzoIZi@mR>99+$6D4USK#*r$8z8mQn4|n|cE(WCs}B}~re3zK-cVVg zJhk5!j(K~roYcCfPOQNiji*@hsy6~}I&^r`iycm#tt?TiFmXDbeE5@lZdd}U=5`hfu3E0^SIS% z$FKE?T#E1E!sFV*<3CdJv^(l!UU&h;#S+|2)PDECmpl3Ka^d8ZDmZXf)`tE{DDCUa zydXD95KDeBo{)Y!F@WCFaHAt)@9OXn>ni4OG?%_gW#MMpE$}{?v-y;3zsaDOe{~F= z!_W-PgnKh_D8Or>_Wt%aCwIQlN;Zu(UacBDH-cq-eK7gtXz{yu-GR5}IYIuS96e{6 zH)O>0c?vg0#?&?G_=-;CfTXKp#Ho7AzQ3S@PBi9r3s8@2^B(p`62|Y?}0;m%sn%P-m3b1YXQe~ zc)=MjJIuw#RMHGhF>e*qR&`t2-a-RCW-=#qq?r$y#~*;@N>bIM{=k@%ucm1c`I7;O z3%wym*1Duj(Q)zmF0! z#_viXuWE?=r6*!Jj%dgcu2g+zCN`z3iGMp9`3{z(t0dS-!d?2Y*Q;XjPgL`s<~ag(4z1eRA!)IeCBp$kbP^!}t1IN1|ZEgWbrtO7Nqn!|1 zb2m$2d@z1JUe@I&L-o3O17u}qdKbyJ)ti_a``0X$nXm|@auboX%#n>$&kM96mouHA z8{X}q^(dz-Yn28gnw-Ui7j4r6x1h%rI6I`y5D8CB;Qp2fJ!x@1t|lwK|n z(#!Db$1at3meX$;V-#!(!_&VUTm>>Ipximd{4MWk01|V>kJ2^ez%j=yA7!7Ls;?i? z!HXYa5lr4^_J03EVgPbfFwX_Rm>tlVT(hS25mI5qyyt5oM_8`)9oF>6oWPo zQ+bdB7oZ6x%wP2oJCqVoQo~*kRO!3SanJIg^(JiTt}Yf_j)wc`vU@U%!|~;!ME0n{ z)TPJA_s%@7M93f7f#nxp0zpaIsO8}`nNgjc0|nl{+TTf^cH`yB5jDk$(2gtO+DXgD z*9i0gy^ubk-Sa|2K8?fe8HA!BZ^~N?QHFVEk;1|k3a#dJa^d)xvuiJ-vRbteNbaI4 zT=9!(pYntA87^s|?sXh7RX0VR6>z<;@=Fdux^;2psPTibq&eyO+LYyO)|BmCp17jc zv*f(F+93BeMm-!}cru%2RdETDg_ARSkYZ@>Z1tPnRW82@EL-G=X*D?4ozOj--1d|q zgM@1x8QGy<{=@Hu;ts66T;4J9EW8J2#Qn`wcZjP7|L=&Y&-5OMf zFDvfn?^`KdWlANC4><+T7vGqtcjl6v7`w87G~b5JhJQi&N*#wU^#i$Z5)PiES~oRf z9p-Nf1KFUpc}=y9xy;wVgem(X{K!zaF?J(b95+G|eJZEZNrzVQHP+cTJec}2uek^L z2P8I1L)B^0@4Lc&p5~ebc9V3X<=v@3UTpEP6|ghZ^YUk6?y^V|V(!yDYN2 z@IZ>cUG{$ag2B<_lkJ1(jo*NHkHg%_!Yi+8#DbdL0oWBiu&RtypA$osBSQd4+#OA) zft36OJJ=BR&v<18sC(U=Ol#mJum%M=@K@*PFkxxfcZZ&Pq}3=vVfty6)mD`6Q<4i- z_clQcO!(|Ae`Of-ezcDu4B9d}YwMJ194E@?w?8n=$;O zVt6}f$*@TjV!yQ4ba%kLTD}t~B+Ma@vf~28;@TNZU7XcR{SQ+TpM}*6E4CgedU#9( zC24h6P1eq2WanV`&E$OlOqlwlIIPeO08K^qFS-)^9O8m1yV9hUa_s<^Z9y*`vM&pj zKS;9d-+mdVn|i+1Q&I*6V?~w4L;N%7#$r+>x2g3~5b(+jx zA?q>>00M%rcvI1Tu{cGsG~%ojGH5I`PM1z&h6n-VM9g!E{$IcU69~^>kS5H4G_Oh? zAiOFGit>858w2jcieL~F&SE~dj#0auYe)PA%~pFJ-gKC=kQz}4AV8?TdIy=Eowc#L z2yetPbb1;Tw!gViNj@SMM$U;z@K1Q(6(Tfz2zYuKFEm^PM&KVhjDJ&ja0rucUU;yo z+HkYEl)7=7IG^pGw}C#dFX(2B-5mOmMQ#z4IiAZ6{I24Rd$sdfu^h?mT5@CI7th(3 zzr^t5T+#JcKB@BE%cgCKxhy>v`ky-iUbLLk8`6a~Qd<=BTBSKc;b1=bbwd z!?6t8K_!)n#rCp)U0Ep&=!*ge*H=MnA( z&3G?y53S{~kR}JXeSs@*%!nHx=lg&w*W_9FWks-T!ASI1S3=tupG`)t=34ADfmPA# zL~)3F86QyT_VyHTQ*`@hNR+cGA`R4`FQ06Kz+0?l?5u2=CWC1jsnd_1_owH&8xb?b z-b{9yr$CBhH;?zmjEwp*~W3s+L=nrUN$zpX7_3RoUgd27q0XrHkB2|R-i(2c8W?h{TB>x3gvZqONp|Ny1Lps zq<`n9kk}np#N(w!QL6%9Je0@;e*%a;7+;?h{)|LN{HTegDN^oNg?9V^p0$+M;*)Wh-x7d=e7Xc9(e!}-4gn%Q{d{Km%@^AaT3ue@{J*)Fly zwkK?N5;zUnHkfM`bS}yjcx6}%@nxb*a$k(NGD~dc&8kG@+85{1f5BTD_l6htCf`^I zdy{aGJRgb<*8m-6=A1{JLuXVWqU>J;XTt5^Nn#^p%WTmWB6OtW`7dvPc;kY~2hWxbiInK#isGEsMeO(1)wQX`Mz zsYn~Wyb4PFRm>HvLNyxUU2nI&4!e+^k!{&MEelBIuF74S#SKBPFj(G^qE=VvdpZx6 z*(N5ODKCaAggTp^+kdea&(b_yz2N)rT$5)z->hzae&Fl9BB^ESNABCwMD#@89y4KX z$&DS>b)X0_MFZ!m*^Aqkc_f^CLVn22Ai@w=tHon3x<1tPWWv#X;l6~s4$z<(6n4OR znG6w#sIgwRs3|;bEP-gT-;~*b7>Ym+MlF@IS!9F<*$~&PpscQUQE(E=zhey8)(=8@fBFbbDyA$?|2yua;DAMXYEKx0iSpr4s7- z3kPX^STHzk%PmiZ0Sg} zc`FLQ;;JYh-LG_1eA>D4?U(Mpy)Ap}le`j&_rjU42KrGQYzgf0Ln6<02k7+qOcdoY z88hAcnJ=!yNpzOeC&H?^A+B-3G=??8mKuOL-X1E@PgRk)hOv8pOs(7j=G<2 zo(A3>X0&p)T}fIUYoqE5%Za@;klCkTLs2wSsUKmMq?u>DD0sn%Go z3?7#IvPwJ@puG$_*9c276P8+LC@6fpXD;4+)56U>9IzacTEjSad+SW)IGe7?SZZOJ z)Wkj>zSixO9M`dwP_sp{vFM3Z*z~&FC3?MDWbCv6UET5T!d#SuB6B^AxDGE%qIN|h zIRiLU!=~KKkU3u;3g5y3wk7-ss;;Ep(*jn-tet$6=QQU8ZYL==^y!e1%rQek;ZxlE%?5ho~JejNj&}YZ!gjYPBx&6QMH4R2d3)b#%g559XeL zGl8!RdtkiiTgF(Yx$E!$gBfI;rI#tbyAl*x%U8ENd5SzB!ZXWG-slHWoX(yxo|qjZ zml~_un1coFif`}MkdrGQ-z0yZL});)TWFTPCO(H`y$7WIJy?HuUWq^$v1KNl8!Q77 zSQ_uPz0ja!C$)!ERV2Wkw#t(ke=%%4!p~A3nG8c2vewTrlb9YcLvmD2V-%%_6hXlD z$6zj5M?Tw6DDr=_0GeK!s3^m!UBE3C`klIiMtALl{B=JJ6ovQ?n&Hb0clkdSs3STy z36&fZ=gHH}QPWnIWuSEJ=^4@CWK)fhUqy%EtO~8S-^X6l?UaecSve8(U`1^R6o*UL8}TffhJXesDuX^ z5XOIY0(EXHHjQg-)6xE}%U{T;tWv~Z$oDZ9f@Mxm5v*Yb@+nuOX*#i7K1iYd5;*z> zQ$T!Zc{8sOFjL@%rhf`HC~Q7yHqoesBdwroW@J{Bfq(bX<@LQ$0b7>=LV+}R(?Q$G}T&syI8C5N`N!*nKp#Zl*?TXr@H0}J(&N5Pjpy8MSLY$o%&-|oQXF5$8My2 ztCOZ7>`X4kXuXu?v>fvggnWIp_-Ov5DdJ9tIpm#X+KCp@niAsx{qfXrRfuU#Ut$c& z+LTS(g!zc20KH_g(CNr#J8dnOD2F$6k-^!DD2xIaMmV#y*znDz{=$7PMpU>tC8d63iGzrfv3SL0vmC@s-zxzAgIp(&+xq1qF+`4d znI_VjHK;IC?NW?_IKCtFsXN|#_I*)Fk_92XMfsAB_NH341@#b{HI5;>pw-Z)*4Rxz zOJaA$!ZRng{JnsV-E!06I>&a5rDnB;oBtelS&Z)+_(C>I@^N7tIGJQl*3G`IL~469 zl`Tn?is80G_m$K1>k#t#o00hGiZ`yerpf8lQIMb{XEV`I%sEd< zYT!&Y5kD z45ny@B6Pvh3GnRqu7d?#y4WK$j<;M>6MR*X`zezTa)~TwfMF=gTv?F|njzQB<`b%~ z2268O2WvcoPgT(nx~B|*VG}GrBPCSs_XAb+`$Tgw68b6uZVzuZ(#{J5Gsz>cu`0GC zp(g8IE}ys>jv}*oG>X#C{?w%BVPbKtRYMPv%g6w6*Ed&xHy&lnzC7X_%c3(9IzQ)_ zn?!U_na?}T_Q%3`v0Qo`Rau(}PWH)jDDv4o%1&x#-AV4Gx*X;yZj!=CNzGSgMUM7b zW%pL!f$w()QZD+Ce2vpva|$zTqb9^6t2~tejmSf_;pdXKo1us7e(^?yyNf&L^dY#Q z7aswr7PY!fzZ#fV5gKCaXRdU+3;+IbQO&+4M$&KH7D>+_S-Q^^q0xt$^6`njk~MDL zbC%F*KSoKo<2GBQiLjGu&0mQs$d%U(G8IMtO@?+moE#j!k>WehaN#^#xKz`0h_-Hl z3J;$oCyig4Hy(o1j0956;Qcz&9&Q5(Tnm(@ zhk6k2n70Z?ZFL?lFBJ#%nIu01MhW?IN$x?C^+Fhgmfm_)FXW{+4n_rL0uhym1R`p2 z=6ZjZm1Z{${qS^8&LH!jh0R3ozM!w0+d@Sk$%rQge zK~d?luQw7ceMasw+Xmd;y9JS^-7>7RKXA#E+{I%7DFbqGwU);ifJ3C#*mO%WhI(LVm|#=~#E4$5sJTCdIBhJ;)!gn?Vcd zkU>fQHNo#H3(O~Hc#6-$RBna{{c6)iook7I6MkH9*GecWO&X*$SA!rAZ1y@!%xyO3 zt|&2K;781TQ_CYknbe4ZZ5EhUE3p7 zrR+6D55`RO$*@B7I%lk-@dll2^)X`=#NdI!Z~R3Zw{i=;B;(+Wb11ri5eByuF}mzk}oPiSUXCChkFV z;s|5d*BkUW;-A_GQdms%fTIQJDsC0MkTAd<|c&&0l#Hpjm9u zYI9wmkj~W^Z!u;F$cML7tv=c2`W`B}0Y_RG!|d1Cvd{UV(i9nfWkDb))1zG&In(|z zZ>Rt#8mw>)adWOQKaFawrXyNd_HTR*SB(H@^7fg|W0-k(+c(kAtiwErMPvQMFmz2t zrmZj0iH!#e$pRLk5@CS&gFc9G&||V4U~)oTkkE^Rhq!7<$?47}%P$2jzDuS#!YXmj zns7#h=JP8{BsWbgNz3G>mG&J!|?zGa+?%@yG5uO57sT!>iV7ZJD)Ed&;7>pcjMTL<0|lpVlfvIFZ7%y zYXoP160(c_;6=%NOY})sRM`o`_uclQM>*sKKJc6cR3-U!mM-__tGl$#9#{bn1@|@K zcBdh{Nb^qmtwv)8h!3Pe-njUM?ZaV~q5CVE2=cYD?r7t;ciY{K>HQuN?|X?AfJ$Iv zTUc|%FWJJ(`q&=!{gXX4mx?3wt~;L7vZEZr%^geN`-xGc8*LFhX+*L<*;|Osw*ls2 zIJjBCahD1_wyCv-Wd}m^W6yN(vz%GJ=wMMMm-a3a##1j71}Z^?-kV7G6%y*}vbue- zv0c!1x9$0Q`#f-3qr#QQJrRv#O=$RuNbbU$BO?drxJ=W<@i44k`9s{Z7UM{qe8OMII>i`J4RlG zMRYQdiz>D7pTAKwcJwkuG!AQJQ=TY?&ahx(vLFk04oyP5?8%1QK~&~6{`--ti zZGDc}Vl*39^5J#%8GSK?ZN3bs537QJp9jVU*|W^&omD$oas%xThN*6~dXEE9q-t_~ z7pFM>F)0mGc1&<^6!vmrA5O3FqCg||WZ33n9o%o}7!TB+=i&#I*S2uR#F@=2Rt%uQ z-jbeqhi}VO$|*09Mey!$MDV;dy=&WX<@9BEWay zFsH`yenFoy)pDKE@;hoiS|MFhLWpFKw5@?LN_}<5_u9t(>AeAQapQLfNJV;~K+&_^ zb-IuQME;1)&r=luxHa1a)xI;Yx^#1`M)>JT;;!RMR|kPWAeJVv;cm4X5(A|`CY?^A zL1mTv#aZ-{KvO_f7a?C8-DX$Zy6OwHT={;}tBMsqrY`|Y75iT+{PKMgx$$gvKPzO0 zKknDn?7c|~?PLYXKcXy|xd;OB{T~_oVh@$uA0JgR>Mj=<-F*DAL8}esGn<*U zm$qt~-@u2$*b&pMEkgbEEjBfufDVMPDlfS{mi_fwJKaCvqv5Z5uX7+i04-MaSl?eG zxbx~1u(~Z zZ*hH-Gk;XAl#E>D_LKBT9WT;J&)%!O)0Q}Eex`Pd+DLb-8}KKlY7dlJ&D)35w2|aL zQcgrK^QJ3HWOCe?#>W*!6uVQyPf8qC=&0M>rdVys)@2tOy*+ZtYLRDlexjP}FjUL% zk~M-XKZi>7bRyRJ0)d#V5|*d=eeXpklPzn@`{Q)OK29U$d%ihDt2^8&`l|$q`51y{ z8?a_=HKM#-_H-o?+|E~a-R}r0HFE!6L;O2}8FYTGQb&^+d~EdQx*KpPn6=3ixs!@V zUGco(&EA~oTwSH9c2!$4;C;vWhNB9%iWXGm>_+;C_mPs*#zBT!I`=+R-=U-H!#_r< zxb0Dpbn5V5W(Ylm4vqIw0Z&@7cyJ+{d#SdqQ-7{mVLw{30F&zoa3v!9M&gygV>u3Zj8*^Z2ZpNT&;DcYUvYJUNST8hI_0 z<9akyx!C#j^(L_h$aT+coWw_m7Qsbo$EVB@;7{UHZ^QcTqXuW|A$;%u#PHue{ zHi)G*Lo77 z^K6V81iUq>mAM&l)rR=fn4ZGQ;iih%;SyaqwUSfD8rqa;f}&c-inkl&ZdJwhNv9j- zczD(aB+3O=a$CK{`OiIq$s@Ca@4>*Z&63NqE}idsn|GCMU{mMM@W>{60p{pm;U6z; zO&;=K4W+($9x!iyP1lg4q5#!Y_!oq-!y!-_aPzq7FoCz$CXd>H&W{$hwsYX0>Lt}Q z8L6KA_6?NmABLPd-iD{MCivI%Z|hC(3+bGlW~#)!atD*1M^ejZskE;Kr-bCK^DEe- zK-Sxi7dkYSH?0%c6TD{|iwe|Vw3T^S=0?48!wO-eZ8dvf^&c^!RFdqjRHoET6uis= zeklN*P>AVner50@%Oqm9x!OwIyx-*Az}rO?&lyhj{!z#ALo5m_H13?bw{P{3pVaaFJM8Lhz}QNU_)%#g{7+Yr&CN#9yK4{KTwW1_xAhUzO1#I%mhuWPP6^|_ z|C!U3qR1H!+TB_JzSTQhj`K>KHZ$Dy2LQBqh8>onO`4?Yty1^blT2j|(6Ube9XAXW zjr6=yPp_LV$?`H3=5)igPaz6vUB?2p-wGwk!;6|ylZ3!JNC=M?8V_fs(NJ=afewcH zk9)$Q)KAEs`Id{o&daykdQ-~qV^cD8cGA$r>LK_`yb{OWxU8(Dn0A-c2;ZoPG4x4l zp&8Edk?iaVhBx-ewlgt~H%k)l9n{Z@CQIdZfQ|!tj&8o{RRNfF?!!JqL2C(}LqOZ3 zPt@DU+2a(|Q6#jU(GqMJZwr|9Iytw*x2m<+d5#a{m6(*_yI=ECOU6`$nu+7W2udYY z*^Y{98x*?ME~pAzMo7w1<__O%XxQ~Y+oThSns4vakG4!0a!kj&QAi2;rKHgbFSCUz zt)VQ=Ye?>t-V9xD3FgV%RIe^=?|w(iw&6OskNDY4jV(ts6BtRuT~$fjryhxXS4{fQ z2xD{XR{NvoJNhNWkN2ZDS(+5ip!LgFkdkA|-R_gzod>9u+X+@T?+JU%{bI8X*UdF; z&~wkP%LNu6s9*bX;=VQ=K@Exol5~uJ3uvO&1)vW^5f84f+MW)3m{K<%}Qxqf$5dY;LRCVcgz8F0pLL1{sMTZe^yySmhH<4 z<=v-k^{-VX^U@hl;Yea2(UBSWx;vrVDm#udWK%G!x8}kuL5W|3q;UEzt-fl?W!V~= zQe|LsYNZ?)g9l_Q`IzdfphxIY&|FD`DWExXC!{W&>v@RQ8m7e z+xfl5X*azJ(v&PY6IsM&ot1L$Qx~h9hx;i^)@c?1IuW=Wso__0U_>Dits7*FjWG1* zb>BT*OmMN~oLH|n+Zu^u{lvsZ1OjWR5cQB@_`9mf>XuhxL-%cwnh{!B6@KJTbN^JU zM9QQhorTJu8o<;xq0H<7g@sdUgNWhlrI$5svOQ;BM!NieM*$*GcJ$@uo|)WqopvYt z&o5owXFRvHx*|pBk_!%w13=XrKivE)sU9<(S#D&Z5Ek)y79c?kEa1A1I;jv=+j2g- z6HHXPyqW53=ze(c^_fx~er!RY9z&yXyR119h)88M2~wdd#&?v!`bd>8orWM0LEr z(-BY_V5Urr=5gUa_+9J1g_tx^(d0TW1)m2KDOYN>UK)-Mva=HPAcLXcwpC;R$QG_~ zrj>08b|W-SQ1Mb=W>%Cyh|9L{&8@LT1sOfAMT$! zegs@4i4LOl=XRhbH0Q3?55Jt{7ZtGDHneep!Dm>Bu3Evvc*x}=1Qdx7R5?@SuGtn^ zBK1og%l1Vf;95PEd(I?@Y7$ViW4V~_%-SNbJB%i^urlK+sd2_Lp<6B}3GH2dVfjfr7#K80{_`z_rDh^EOUuS`b5y z#x*t;D~bg6H(bLd1PC7x&qdaUJ8Fe@vz!cWW6E($jp700D4B=}FwTr_%ve~7e_P&8 zY@6Ac(Kba4a<%vVF6cxGz!h>Bi~Bc=F0p_TCOq{wSGci0PRqt8l7-;Zb4@#^n>>bn z$dp}&X4c}l-l_ohnb<>J}r3^6AP*t^P$ufL=9#oZh$wA8K|i^nqyzW z2`MwH!cwR1Cih?^KPwPEj4%(VhB1RGLn-OK2XIF8S24hq znyu+7&{$aEC-*&BL;oBrYA>G9c=8$faU-+3AtX<+6!Ou zQi~t7sU4R0VrU0Noz{ULxxoMR=8%IpiPLJx-Zgjv*y*}4Ju_pWU@l(#O*~hy#R&G5 z0pSDaI(unhvyVC#XfqiMele4;7OL5IR!(!l`sytYmY#7{tOCrC|co*NxiU17;jOF68?qf`wp<0Fq}bRtzIqfCY+nks(43 zg5XXIt>>Lf!}4aN6j#s&9f3a zWW!ABM<;=?Q}?3&Q=e}`LNdx%+x=gzB4ZxUfCAIOxe-M2I^#I0y*M<& z2_Y}|3w62s0Z`RhYH|?x9Pxl-2vCtI_@m=$E)G+L@W9#v{J;o+*kZG7B#h_0(ayX| zCu6XPScwXOn3jKb0L6Ui&XP$OMxXFE+;?Z8rv71M$1kiTmHJ6;iBl~3)rKLq>`5$c z;1cEqWVtd0-egHK%;M+i^4IIiN$%q#->`vL07$NVtvV#+w8huLIN=la5}dU**Dz%d zXm0{1mU8v8+Ip>No|i|T+#!V`_L@x~tjp@e-?cBgBIE98jvK@w!NRM4dxgH9NyOrO z?{^l|0H3K2faujQ;O4sED&eN_H@Af7IHul@X@W|+=G)+eJ4UTb4$6^z)+|-N>*U*u zlW~CB#=^6B3h~o)=xqnFl0dJiVkzN;69N5ZmMCFua}ML<)ns;(;4tObm|on<5{nj! zl^!-ol#VsjU;kWew{E06&gzbtY!M7JgD<3i;&MrMRKq;@7$2>&VGv$x{lxjM72=;a zr*5-kCNobK#i|0;bmFu1Hj|zlD>;5RwVgKda$u?1{GgBQR?hQ+u1U%28;z3OW;tQR zCUe}{Vrp|JohFOrneJo(gg~qJ0{?Wg`g4UMXY}ZovcyWfIF7iyggNsbEkmXdi~dlw zZzvPK=A4@-UbBV~sEt>D#aXIj8vVl(gEyEq;-Fj-b$R(d86`MaLeEPTROd{!P^)Wq z)KA|`QJ~JM7RQhA6zq(CAcS2IO0~M-&>Gag$`!&eqc*z#f)xf7lZ9A`EZb$wIWr?MY^g-ybq-wo)hD(^7R=qukV!VoCP!(lbFy5!w}aDH zOT^~xj&Mo%XEf-A+=|grG&BnbyyL!jD@YH~wOk9r=Lsr^ zOM>q^zL1Y61&M4pSl1Yv!A10oe+zn1s=W8ZTBRj3Jr}qZI|_=VtO*PyOiG6h%(R|e~z2;O+G+F!ijiIH*;aNVr-%PC|;ne#wBXr|GSmg6q5Kd z1}2NQcppum`+8=I%oE=ybuuO%x|9S(NVe=apf}8*B~?s&NxX)%SK)5^VColy?Zd!1 z2;TC#3K_>00B%aTCnU)tw!o!8$ONmlMqq?jp$t zqX5Vc^;TlJSRFNpU-H+Isoe~4BxPX*labQ?=Z%TlEs38djxoINg-?3?Oas|mzNjMX zW|>qTTn7LE!9YS-KzXln2|oM_^5n@R7EFL6u~I>!)`RTt$WanRzkrmp`H^rBOKKLG zoSrzmdtMMY4#(bv-K_P~t zN1Q1yDnYANlk10L*nhc7!Df+dN+9lEYfs3)&kB5od+a!w=iv51H-+|88f9$Q3_5@k zr0Pd(JrZ<63pyYzZ>7L?a7VskmZN)=@IXb)>)OBh>R$`A#7oPLZU&O(GJhPg*U(e3 z^sjK+`QR%-_-wfAm^(w}Tb!&3Z>5Qjtv_6*QEjK#@$H+#2S?Xm9D=WshB3!D>MqWr zf^nb;FH~BFi^MXR@tB7>1Z0W_w4$M zdeh=L{=B%P3q+U#f(&cBbY#@)ma#~0q2?b=_6FywK9PJCo)`9wA^=VRYziHlQ@kkb zUymF7Zi_1Kwo8v*htGDXj@yH`4-}A8FaH?n`61uGuQw+0Xk-m6P|iTubBu_nQ_Qm8 zCO=Rge7;iAIEAM^gJQ?uD(B{{9=P>HkanOg3x9Jioqts_%3xhppe&fr8N-ADw9F+z zV1uD8@ZTr02S*5M@VO*J25}9>>oioHs4?{+no5@leEC@2c@8~6PRHtwbO4JDowul_6d4hZq^QAssUp%Z<5k2xA%ak=m<<(yQL3z8$&Nbg?60^Qi})30D*io%mn_)h`)22hykscym;ApVF?JCnror zn>#4oh|Y-cwLpYwSX*j5&NwBTRO#@;5%pWXS5=!jN#@k0@AZqj%aK8rG}a z@w84Di4ixsxj9c}-7`KGeGAwX3adO!ii@!F89(p&ft~|dbhV0G)<|irW43W4cPvfg z7egg>f7rm{R}G`^{v?n5%nA<0Y1-1+c;2vH}aN4ZXcQnzK7I<_C`Ri(`s(@V^iAx)bD=SD~*+$BC0wi$K-J=kWDr{eFp?+x{ z0z39!jln(4jXln6Xv5nSEt!BjFO2g3RyM6Lq9CqI&L%S>LilSR;p(;z&(S}>@~PzkW=gj(Au~w$PbaD>u@ zBPdBk%1hX;0oWLHY9emEWi(6S{a3aa6#)jG$L#(JM8nN;${V(Q#T~Cz5yruY8PmAA zFO=*k=eru9bT#*-jAm-jApa>?!!yMIiCpr_arBqNRHu260X?*l`Af5yH$i8|N1yS~ zW({z0*7avH%u&oMv9u>O(6IH3Cb~@J=D|+9neiB-@m`+%+eUg#mMDDx6P_*yNaOlB zBgn>&o)L$!lXoP!>LUbojt?g^;&)WFsXDwOk@0N~o8_02nbbcFqR|Tv;!WR=ml}*| zQbOGopvd&G2A*xBZ?95h>e#k2Lcxc|9W(~q;sv|L-+uUy|GkKjl;+u5};+*}tCB71rk z=RCTDRRJh{V=vdd(b$8N$qOcN>+mup>SB`0D9xO(GJ+r&znQe6LTmDg0gY}%F4!#jzrS$cn0@S z50yG3#2|M-x2z~uj=5%O8#v<9=rc2olE*6{Qcm@vriJKTWZrcxInyFk5W(~2Zi-h0 zfh5vzPXwpL$v5?5`<=T`@l*TIs%CB5$6UZ^_hq7aY8gB;oxP7&wAn}QvmRf4^~U$Q$zC{%o~Qb$A&e&mxqXDYU4Gx4MTb7`11Fib z)#(vG314BUId}D9Qm)h@zfU4sUBt3Y#way>`cSe(0Q4q-1{rp(-9o|Ve!$CsD?AYA z;j;V;UU>chDEoNf>3xUhTU?C4X)gDV){)gPsbi;bdDjHIXE*T2 zNisHi#@Jq@xi0^k0O({-Ig@jitzcCUNeE?yFN9YCT|KO(}Ns3BoP5o38DnVUJ(1J-&#Qt011pAQiCiGfEH!*2GcOz zJsF=952*CHd;rVuI+;^?8UC}wo6N+YkK^SJPiOA%5+qRtqK@1defZa-!#Hb@2ag1} z#oXy$AkL1*3BOqX%J;{gR*n#5zvM>2CvB8f8KbkldjVD5SG zLY7@shetX9q9HapYlE&;Iyf%_ z{U&$!d^%#NN(|+*am|OP|x5>yd!8L@0Y!`}v>ePIO zJhzy^qjGS{fHQ@paWfh5*AK~_Ig|tDsp44VBHe3V?R+{R;ul6B-TE`~=Z_{c+ihgd zxe`g8I*AFd{g%8N9aKm)poOr1W#%%uv+?G}5hO}r=J{Oo_!RmMPR1z#?nJz!^B8u| z4V=4T4E{tPRfG_?UV6kn%B31=i9m;S>5Vrh4uvSSy|Nkm>ctEnn`+uz0zFQj!1(32 zG2~hYRZ=Z}LNUoH-Ef=N_u>k^ojQSk4{tJ#wHNX0s13@3T^r0J)yXF@(%a%-hXi|9 zf6X@loWzVV4(xi1gM>n1^LIuz9|NAb%=_wv?_S)^)pps6vmR}XrinJ(k9;y`HF zlKb=6n)I3ADM09rUUIlb$5*SbZH-{dDpQzG>S0w8uY z39Aa4d)hWqr{}Uazn^(|r%_tP7RRiDGdX?f*GymCn>g%!$z${>0zfs010Z}fzca`Ybhg=;Rd5Eg$O7ukYew0c zq+u==|6>x1r6jYD1`x$&9}O6_lVX&!IPSNt+=>hSn^*L5E!$lxmOur=BwUB#A-_mvXzY=$GZEea70Ds>s> zz?tO!eI|n?Uj z?L$JM)NYSSm&|v5!$`dN39*wh8i-PjALl8(8Swfq8AUuG@DrwjT1u$JPZ%8$vs|~N zy{+71jsQBDe9zsKIFpT>y-;QIG9{9Yem}pFk}FaH9l}+hv~YanBxXH*Kc}yFoayUE zlIPYS8Uab-j7u)!j2SbHyM72^)caE#AkqL@#F!_eA>7^!ZeMgWx7*_Y$-Dzc14MkF znFmiKx&8L!L}oqp0JEG)#p?eliAC-N*kYGC zen*|t*OCsef+Ikw>0GJpI5rxHDh!9sbcj$vK>g+&%zHY*`H#6tl|x1joTxP%Luo$< zJ7yI&5RIi*OkG8tsmB2jPV;pYMA+=BWn$+MbQU3?$Y=}2j1+1>&^R(OFtThv-YhDjyA?uRT%aCLIT19b_qBjVMJfd>p}B+%XMQI zDAtS`fvOp)J7@(0c5AS|$u-S>RHB4Y38Ng$ zlZ&N~Smi?IDdci$QPJ=dLPIBn!hU?z;>U?mvPeNCh=RhQx_`0C{g7!hr>~_W*Vz$2 zJqk*#aho%t9q!l&9aKMPW|U8h9A4^0DAaHHgn2K8IDbK3Qia)8G-S442a?Tj)I`*9 zF!d$}NOaXWsjG!Ra+o)u(m+#<;7nsKVJz+GDnzP5HB+$~olBt_pEDW+*?#D=>#7;S zYpP2Oa$QW9M*NQTev`matUy%5L8CSXSq<=;&Qv2ds#XS>dauHT^M|uwQZ2FwV0>Y% z$+y*Rz>M-8tImx@saqm2oX+-c^c<^P_a!1=VbLMi|7fp|j>xG*sp0T3RUk}<^T^w@vC93>X*H+sct`vi9W=9W&f(W}!+Fx$ zuqO$s))X-HNrekd2}R+k2b!6NPBBZ9QUbudyig;TKE?uDxyASmnBw@84E$ zC#-@yhD`F*Y}QXt!zrmig%Rbm_(9XG#?_4D6Y;aKI3is%*4dCrn05{mH>IFS8s*dy z>E=$;4*}ncD=7QxWB7dQ4!wB1BYww>O!8@$u>R~6oJ2u6F*$HQbiRL%Uni}CV@Jo~ z37FNp6^s>xwUN~==yF@Lu;_Yp1i=Ii^r$eN#@Pr++DI=!P~&GC~POB^)e&g}z_sm<7tu#E56$-i_U1qB6dU(e5H{j+Uf z?<$T*j^7j49{s&mEsmYh*XFltdu0XvyF{1va{O8w>)Nxy|C?8JOgc$O-LAYzSCN^& zvrXH}&(Eje_Y*t4&o*=Xj)6Phc%akUv^aj`FZi@gyX&%u-@IQxe{2o>x~rVL*02V| z?!=!zx4v(S<43zr+Pqs@dGXjByY{f0z8@BrlV))wzJGQ6EG#T6EG#T6ERG7x@w2e7 zu&}VOu;?bVy49P1>51G{wdl@_zBd0vt6pM`~m zg@uKMMK{56{46XiEG#T6EV>Dn<7Z)EVPRomVbM*n96t*S3kwSi3yW^T{{v8(+7}Q5 R2b2H+002ovPDHLkV1k{(AEE#N literal 0 HcmV?d00001 diff --git a/web_dashboard_tile/static/src/img/sum.png b/web_dashboard_tile/static/src/img/sum.png new file mode 100644 index 0000000000000000000000000000000000000000..90908e8bb3abda50e07a972588ae5730535c8922 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m=t>o-U3d9-UXGZsa{=AmBP*`5S{+gOzL!t0aR23)c;%v<4|7h8_Wp z2|_hDZk*fsaMg*Re?Rvx*ZA;0xrlXbo6Xb6&}6oqVhlR#e1Gqe6lV~z6t^j3*V{bl z@|NziyB^HV2!7vt;;2l+F}pC!0>kONAssPiQknNM7e2nnmo#&=%n^fd%Z|i#i3n$<-Cv4-^i-E0O&miPgg&ebxsLQ06?H_C;$Ke literal 0 HcmV?d00001 diff --git a/web_dashboard_tile/tile.py b/web_dashboard_tile/tile.py index 22825c6a..28778097 100644 --- a/web_dashboard_tile/tile.py +++ b/web_dashboard_tile/tile.py @@ -24,7 +24,7 @@ ############################################################################## from openerp.osv import orm, fields -import random +from openerp.tools.translate import _ class tile(orm.Model): @@ -36,16 +36,46 @@ class tile(orm.Model): res = {} records = self.browse(cr, uid, ids, context=context) for r in records: + res[r.id] = { + 'active': False, + 'count': 0, + 'computed_value': 0, + 'helper': '', + } if ima_obj.check( cr, uid, r.model_id.model, 'read', False, context): + # Compute count item model = self.pool.get(r.model_id.model) - res[r.id] = { + count = model.search_count( + cr, uid, eval(r.domain), context=context) + res[r.id].update({ 'active': True, - 'count': model.search_count( - cr, uid, eval(r.domain), context), - } - else: - res[r.id] = {'active': False, 'count': 0} + 'count': count, + }) + + # Compute datas for field_id depending of field_function + if r.field_function and r.field_id and count != 0: + ids = model.search( + cr, uid, eval(r.domain), context=context) + vals = [x[r.field_id.name] for x in model.read( + cr, uid, ids, [r.field_id.name], context=context)] + desc = r.field_id.field_description + if r.field_function == 'min': + value = min(vals) + helper = _("'Minimum value of %s'" % desc) + elif r.field_function == 'max': + value = max(vals) + helper = _("'Maximum value of %s'" % desc) + elif r.field_function == 'sum': + value = sum(vals) + helper = _("'Total value of %s'" % desc) + elif r.field_function == 'avg': + value = sum(vals) / len(vals) + helper = _("'Average value of %s'" % desc) + res[r.id].update({ + 'computed_value': value, + 'helper': helper, + }) return res def _search_active(self, cr, uid, obj, name, arg, context=None): @@ -64,13 +94,28 @@ class tile(orm.Model): _columns = { 'name': fields.char('Tile Name'), - 'model_id': fields.many2one('ir.model', 'Model'), + 'model_id': fields.many2one('ir.model', 'Model', required=True), 'user_id': fields.many2one('res.users', 'User'), 'domain': fields.text('Domain'), 'action_id': fields.many2one('ir.actions.act_window', 'Action'), 'count': fields.function( _get_tile_info, type='int', string='Count', multi='tile_info', readonly=True), + 'computed_value': fields.function( + _get_tile_info, type='float', string='Computed Value', + multi='tile_info', readonly=True), + 'helper': fields.function( + _get_tile_info, type='char', string='Helper', + multi='tile_info', readonly=True), + 'field_function': fields.selection([ + ('min', 'Minimum'), + ('max', 'Maximum'), + ('sum', 'Sum'), + ('avg', 'Average')], 'Function'), + 'field_id': fields.many2one( + 'ir.model.fields', 'Field', + domain="[('model_id', '=', model_id)," + " ('ttype', 'in', ['float', 'int'])]"), 'active': fields.function( _get_tile_info, type='boolean', string='Active', multi='tile_info', readonly=True, fnct_search=_search_active), @@ -80,6 +125,31 @@ class tile(orm.Model): 'Sequence', required=True), } + # Constraint Section + def _check_model_id_field_id(self, cr, uid, ids, context=None): + for t in self.browse(cr, uid, ids, context=context): + if t.field_id and t.field_id.model_id.id != t.model_id.id: + return False + return True + + def _check_field_id_field_function(self, cr, uid, ids, context=None): + for t in self.browse(cr, uid, ids, context=context): + if t.field_id and not t.field_function or\ + t.field_function and not t.field_id: + return False + return True + + _constraints = [ + ( + _check_model_id_field_id, + "Error ! Please select a field of the select model.", + ['model_id', 'field_id']), + ( + _check_field_id_field_function, + "Error ! Please set both fields: 'Field' and 'Function'.", + ['field_id', 'field_function']), + ] + _defaults = { 'domain': '[]', 'color': '#0E6C7E', @@ -123,6 +193,4 @@ class tile(orm.Model): [('model', '=', vals['model_id'])]) vals['model_id'] = model_ids[0] - if 'color' not in vals: - vals['color'] = random.randint(1, 10) return self.create(cr, uid, vals, context) diff --git a/web_dashboard_tile/tile.xml b/web_dashboard_tile/tile.xml index 8872391c..f0e1597a 100644 --- a/web_dashboard_tile/tile.xml +++ b/web_dashboard_tile/tile.xml @@ -27,6 +27,8 @@ + + @@ -47,6 +49,9 @@ + + +