From 5d9da0d22b91e89e94945a96d69b621110d22aa9 Mon Sep 17 00:00:00 2001 From: nanobot Date: Tue, 3 Nov 2026 15:02:50 -0600 Subject: [PATCH 1/2] fix(notify): group counters instead of padding columns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pushover renders the notification body in a proportional font, so the space-padded label/value columns never lined up on a phone — the body collapsed into a ragged flat list with no visual grouping. The html variant was worse: the padding sat inside the HTML, so it collapsed to a single space. Counters are now grouped two per line and joined with a middle dot, which survives any font. The body drops from 8 lines to 5 and no longer restates the outcome the title already carries. - replace _notify_row/LABEL_WIDTH/VALUE_WIDTH with _stat_row - add docs/notify-preview.py, which renders the real build_summary() output as a phone-width PNG so layout changes can be reviewed visually - tests: assert no space padding, two counters per row, and that the body does not repeat the title --- README.md | 41 +++++--- config.toml.example | 4 +- docs/notify-preview.png | Bin 0 -> 57488 bytes docs/notify-preview.py | 214 ++++++++++++++++++++++++++++++++++++++++ qlogging.py | 59 +++++++---- test_qbitmaid.py | 46 ++++++--- 6 files changed, 315 insertions(+), 49 deletions(-) create mode 100644 docs/notify-preview.png create mode 100644 docs/notify-preview.py diff --git a/README.md b/README.md index 5ff74af..220c2f5 100755 --- a/README.md +++ b/README.md @@ -137,35 +137,46 @@ Pushover and Apprise share one summary builder, so both report the same numbers. The title states the outcome, the body gives the scanned total, the actionable counters, then the tracker split. -`format = "plain"` (default) produces aligned text: +`format = "plain"` (default) produces a compact, grouped summary: ``` qbit-maid: 7 torrents removed Scanned 42 torrents in 12s -Removed 7 -Orphaned 4 -Ignored 5 -Premature 3 +Removed 7 · Orphaned 4 +Ignored 5 · Premature 3 -Protected 10 -Non-protected 20 +Protected 10 · Non-protected 20 ``` -`format = "html"` bolds the labels and counts using Pushover's HTML subset -(`html=1` is set automatically). Apprise has no HTML support, so it always -receives the plain body. +Counters are grouped two per line and joined with a middle dot rather than +padded into columns. Pushover renders the body in a proportional font, so +space-padded columns collapse into a ragged list on a phone — the separator +survives any font. -Setting `use_emoji = true` switches both styles to `emoji label: value` rows: +`format = "html"` bolds the labels using Pushover's HTML subset (`html=1` is +set automatically). Apprise has no HTML support, so it always receives the +plain body. + +Setting `use_emoji = true` prefixes each counter with an emoji marker: ``` -🗑️ Removed: 7 -👻 Orphaned: 4 -⏭️ Ignored: 5 -🐣 Premature: 3 +🗑️ Removed 7 · 👻 Orphaned 4 +⏭️ Ignored 5 · 🐣 Premature 3 + +🛡️ Protected 10 · 🌐 Non-protected 20 ``` +To preview the result without sending a push, render the real +`build_summary()` output as a phone-width mockup: + +``` +python3 docs/notify-preview.py /tmp/notify.png +``` + +Pass `--mock` to render the design sketches instead of the live output. + Other options: - `include_hostname` — add a `Host:` line, useful when several instances notify diff --git a/config.toml.example b/config.toml.example index 2c75394..a1a7df9 100755 --- a/config.toml.example +++ b/config.toml.example @@ -26,7 +26,9 @@ use_pushover = false po_key = "" po_token = "" # Notification formatting -# format: "plain" (aligned text) or "html" (bold labels, Pushover HTML) +# format: "plain" (grouped text) or "html" (bold labels, Pushover HTML) +# Counters are grouped two per line and joined with a middle dot, because +# Pushover uses a proportional font and padded columns do not align. format = "plain" use_emoji = false include_hostname = false diff --git a/docs/notify-preview.png b/docs/notify-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f2d48a6d90d7af8f6f601ef0eabe8ddd2c6115 GIT binary patch literal 57488 zcmd42Ra9MDxUGph!Gi_~?(Vv9cL^Tc-90!#0>RzggS!QH5AN>nQZsv>bI+-&ds|hz z^-?sRR$FUK8TR+D_wij(UIG~b4*?7e3|UH2R2d8m(jE*9;sFi<_@tg7z#j|@6--JL zr0Sl2k^wD*aY{5`haY(slL&()iv$JT$6)=dwe`84xB6FW-$x~IG$=79YB5#R!?UIS zx6V`J@n7AjVmt58ZC=s)nO>Ed9_!D2PMq+%KBN#JRH(oIzF0K=#Bc$B|JlKirT_U1 zHD5d%^!?vYXW`hW(Ej-}2G1Xc{GTtvDU(iSi~jq2ODMefe}66+B@~GMZ>uF}=8B*H zqfz02hl=V&Yv6kMwjw!-VS?~9Bmu-OS?gs%odemTx1y*!L;;kVof-;C@Mutvp%3lS zUq}Pd=P*DqeyQuZMa4mI0WUKzAIV?D0+p@7O*G2zfTqM1OWVH%&DI@-Q~%T4&m}eC zSbb(H+BroIZcql$C}UTpHF)sGP>Fprlmmvo)Zf-i@@8|jFu$lVg^QEJOY;9-cGkfX1pio)38K~!@hdgaupd_91{zUY2p~tW zE7akm)>$-kiU`QnEQrlT{|u*m|2QK}CB%*-ZGbndKR~N7dYc{l8Sbhv`vTFt+1>Yk zq`6ku`$jq*GXWKNxR~|wAS|>$*_gRGf~CH2RG4IBhtAY3P*L)EN+qgz!Qtofz`fb^ zFhG8xQ^$?d9Hyc-V8Y3cvG!#)ae_`%uK(wvSJ7Aa35ryhx;}X{_-eU1ZJj12L3NRl z<>`D;cWL^GKZxP3@C|+?2Sa=GiS_B=N6X$`TnPrW3|0O6i1@ym@M22!f8WTEptUP* z8UsB&Z4niTKSVh3U?+Io5Y^}eEj@LiA~hdLh3LO;(N9$ap4PvxIA2&55ggeBBRl5` zfrbq)N(dF|QQ{k0U4A@f7`5>?D(`U*F>)-1ynnjzc~%wvvA8F@d?Wt)igz7*`p_Ag zT#cq4ZvvbIc-7ECLWhE%4Bl(h~^|LFmYUX7k%o8hAqi- zYAIOIb_Yw1w|V|S|39}RQ(6G@+j{oPX1voiUr>1)1n^B|#+U>Z;)VFEH7N!inSaJw zV^~FyFzTOd1u^uIBj>~R_i<}REfUi zB-voM2-G^G{rinm___?#-x+a>l_Ncv7rXD+8=!T^a2NTN&DL+&(sv}~l&1JSfo0yme?8@XR z>xV#5QuKBZ;%%@*-tww$$EM&Z-XID00gX8?Wb}AUg;B z&Tz{~zsVS{Mmy#dBnVJUC-@&U?2CRe?)~DR&cV*&py_FrRnMCir(>S@>saV?rcq}N_vu5<4D8W$TUEh8N!I8<@`2M!AKCXhd=B+4j8{t^gG$xQ+^wK?>y zPBg#Bt*y_~sZgaSeo!Ths+B8EbMVjLq<-nneAVh>Dzke+RV)j4Gld32{|~k^SCSCPti|N zh>4&U%YggJ9L{GA1+v7-`M^zMu&N?l?d;-wBZ?dU)r!MvN?J>+rMjAF@*O^|kIW4X z8z0d@zZ$carMAww?%L52GE;y=<5#tHzMZ+G0fv27j@>#cPLAkXmO+G-@>{S3CKe_p zu?pmsl1J@CmH?=MwKvQQYZc}i)xmaFTJhcZ-?ldasIegC&qWIQ%IgX;tT&@M+0?#Ix3 z{tfZ1+4|6s5L3$|1s=o}MiT1Bi#PrSm-7xtV26x(f~6r*qLntcTEG1DClGi^a4V^r zU)rK0i5rnVl8EX(qY$9qZoa1dA@O;-gWV?V_<(DXA}&{Mw{8!6+@Svs(l;`6bgY4g z0+r_8Aq~T5X>C);`wN3WZz}JU31%K(lEW)at_A*y4XG_WP1W%09l=nrKO?$Kc8Iud zj4}`cQ{C0sxl%vHs}cXnTc0FmU`Xsl?xec5OVQ9*)xo^s%dS(EOoV+opN+@NVM$6! zk+PrG*4)U@(9zP;vi#Fc!pf>EuO}}ZuJ;S1_d%i_w*U!V%9{~BV3tS`*cfxrg}>EW z-Des%f3J6Oo(=5+^Lv9qXMgLqyt^T2) z){vh}<%tVLQd$)bBxbg9VN>w3R!$*LY17=Jw!CJYa~K@- zrrSFy_{(o3?Sa(T*jQ3ZYG{NObw%O>Fs!!>jfTWxGMVgV!{|nahOn`*)SB59m*;Jk zes=1T(9;{)te&XcphQ1j?^9v0I(a}pB6S!mCSZR2=~oSO<;>t$)#4eW2MSQtqj#VF?2Xdt(n%P?&zz)@YWt zv@A_crFaykLLP%TETM)9cp)O~ICxd&xxKfbNgKQK+M4P9g%L(=eP=R=7(?$kRThIS zuiMILwN^tcm^EY=(&nzWJHI9&PDMq18wx=fPsElrBA+O#L8EI{89oePT zZ)%#qg1VB0>$%~ekqugCbqfqZf+Uy5@S@@&7E3yt&r7O{9E~vZhltp4HZU{P|+KrO|d$Q!nYFs-MP!x?p(C3_@Mj?04_i3DxP zIR4Ksx)W%Dx~XmSexu#6i@{)GEoZ|Ifrcyq6Gr_0 zxkTy`lO`By=O-)lVP4Ge@E(P&5_}n`T}c>MQT0c<>z@DXfl_L`^f|%)^m=II%*O5Y zFzL&YmMq}JaS4mM@Q1P5;B|>XJ_Cv-I*ZF^Ylr#`57)vX+N-g$dEK7ZJN`lDWhxUW zlkWqhA3}jPW7frVIjO4F+xlpMKW$BRc*F?eH>8*6C-x4Xi0H7$oiR%*i;~h(Qxg*e zw&TeuJ#q1n2d|gI|7?WvpGG84apT8Q*)w>}3V;1nGBus=i%61)#?2|o;dY#DVq|7E zh7=R?XbgNF83rL~$HHW?nK*|4e7Y$SQp=Bul#x8ZaQiU@Az z4pe%&(>(w+lEPoYzdSp3`iiKDxtuPkMd52o%gC(Xdw0E$Bv@Kn-k+^}6Ta8;adL8e zjNUx>wS7S{(&E`tq(Bhi{l2+Z!TVyP&Y-_kq`*iOiOcWUG&1?)hi*2X$rTwate5Vm zjICTluB(xxD$hs0kS9`G*i?@CwGN~EUU(y1q`hw-5!!hw8miF@)-th(z0y(|U}=zu z&baW|8qjvTPCRY*y!)m%#yHsN^L#d>V&-*wL^2siQl%G#BT#3R!~g^HL`_}7sNdeP z=gZG=SJuUev+<7eWH9GvEDl$2CQ zhwp$wy0WTro7XXqb=>_#UYW}N?eU-d{K7jTCehhP^{WID$yM-#7^no)1k@6<*)^PD zF~oiL8bEWrZ0w&4nooj}i;))_C;W0p4ne|;kBI?mfzjKZ><(ONY~0o7r?|5c+F+$3 zqb$Uh-J`)PrTC0Ag z-3fm*lh==gj;<{(?{^`x6)oZEY)PEfaven9db3xwe}`|x-dLDrjrZYa507S}0ficp zoE`~#d$|0#Y*aiv-`gb@s&79ci8!^iwRwp*7L$?}`lIma^*ee;M=?J#C#T2Z@w#HB zzpZ)^Vp$2%HP|g94L^|344+;wE5^83X*60c2K;fn%D*(&M2k@kNSn|9j!|Bbrg}1T zI8!*9EI?1s?=!%l(ZqdwybOEBk2L|OnkHQ^p2~gt>paeEBJ=pj{Cu?*5If zDlH}L%wZKAVQ~5OK#A0c@L60;tb5GjI>cqQ)s5f%04{JSNZ|bZ1POWLs~d7j_D3aKgVwr_@g9c=~vrN#pZ4qR`qvK{%D4;gZIAk-rlQF{L*19)!EVB>UIqA zhsN&kdGLP2cX7EsG{Wz^BQV!BJ~8ow0IiO-t7`)u9^RTjbhk>hg5*NIk=0D0TsBBr z>u7qntfsbBs4sg_MUcpT64X>%TkCD=b}=i6f=@u>LN*Z|^Q zy|a%(LK<}X5Hg#08{6B666VX5>?epFg|4SdJ*x-f?OvaF77+RMo1XufO`m|-1Qd!i zB+3)T zVPTS^-xA4*@$ueIF9lHxf5;?%2RRtQjT7IfsBv(xu>~PPW9lU#t`8h2#K3-jb&N%= zj2lL&5|_|MEZq1kG91!~dBxs#wLhUhC@ii8BWq%uPfGyd@O<}4BJ@MHejqF|Tyz*5 zyvObYmU9jtBEo0H{D-@PH7o%^`GI1RDkLqGnf#q|wD|jT!7et|IMyHG4CK%%tWK9JMyB&JB>~5yxQ71``W*&kU*BOs=`Xy z=m2|p=czYVR4z_mX{m{IbeS(P+zD+iDXBp)3*4Z(rdbqhH2C!e!V1`!j5ff`Br#qZ zO?9aQn?1I9E_%dH{1yMGhRP%rQ*7u51OUbS&lW}Qauy0rVu@+gbZ_Yrp|spwLnU?- zlXO;?Zk_|zpvJoD>~9)-1u0NhaxZP(x1MV+Vx$ruG*nfqnHs-^1&mCR1cpXYZ7j?8 zMb(ZBe?8j2zj+G`Z7UcW8p3juQ`Vw!*E69T|CqeHt^~jSJ@7+-HVVXQa~xzz!$wJj zQ%C0=u*RN#lcqvY6;>4nlxAYTV!!?CHViV`+}vEwWWLmPILbY{El^P=J7zpIHF4#n zR%$kX?DJ3Atx;FGvN3F-a4qQg^q3% zn=X0#vFq4p$1C?KzsM{(C3VTIdW3c`i^IgxQmeEuq%hBD;5kz;UFKphFi@X|%lQkF zUuBdWtt6=;+^E{9%l`o z*O{>Bju$dJJ2LWZdiqLnG!gCk?JF!w$Ol|wvp>FDL6_?tK55K8G{!$Eo30Jw-pZQS~91m;FKo%Ajr%MgNdI)fEWUVc+*A+XoA~8G=G@A;P z0n&rez}8Fzyh3zmgZ)bW4Mz(L_HSjoOZCSE1>|i7vFHS?ccY6D8>uJ<=c8Yls#^5@ zw)PpTe`aTI3`BEJ`R;f4%+1Y)>2GcIjiCMfDOXVegM8q(chceiIo0o(=S*-f*9WY1%5CDHhWuaul$44lH2bYW4?s=OpHR;-V z*6x0YFx!fRkAU~|21%AP537MgPZk~=kr)tXX=m5yaxK2_yhp!G^ej-~jpd*Da^6|b z#OoL|(m;<7?4XxVx66x8`}_MEn+75RCPUK+KY#wjpp4XQbY;(XPh`-?&5Dr>8zW^r zuUK~Vj)*4WGY2zHbgXfT{vGCFB%#W38<0K-Z0N*i;M?)yMJ-|&N}peNr9L8^{cbBJe0q9@g4aeR0kRPKWO>? zmS*^WLh%2qM!5-iUF)3o$3=Z4K%nl`*V6Cb;s3Hs@W05<7Z*OaVRCxSuRpQH z(=+%HnkX+%zr*`+=R1+ozJtAeGQZc}e8uwSHv@GA1-qMKrH@f`IOGNA!XgtHf?07H zzt{DowOXvOi@fgn!nC>v2PH*B__?_9hZDubg3~x`CQ)kq85j47-O|{?f|{F_n!4GrkEI3E=QPy?_5&dc2Qy4C)|bAe;ZhY! ziQESJgN0ufwWeEj#w?n4Yi-cX=W$FoHwAlkh@vd>7aug}!R{wCyfT^Wd;;ww;8 zR*n4r=s7r6K`cmQdcJ;7AmEMT_uOE!OsCfdhY+Kz+2Z`TKamBCba1}2lV4gIn;v_0 z@beGk1Z=f)<1vGu;5+ajJ)oAeMYp}1Az=COhxLAaLVmb8TCCN+w@ppOE1?Du`%Cuv z*92-6ilO15sbW<~NJxNMN$9Peot;d8hp^5 zEwninXn)4R#Vsr-2o4U`Z*%{ZpC2!Tx?`pY4`B9uJ!LPn;okh-@eJOQvXV>7vz6ww zUO67w3>GnQanrSxN3Z*{Mw>sj5BAu_&JGS1*(J?iyL;des>WNnrk zwcE^x$~B#?uC51u;HpTqw}ili;YnUEFmF#}wNBP}L>T-I5o)h>(oa*ba6NU_ZGRG^ zEu%m{xDt-W{n*W+kij=pCN(j*@XH9cByyjHMoxB43>hAe zGtMO*YFo=O-Cz?y&z%!7xt+bxYd0d}vJB47?(7Vy*a3UT#RZyqaZb)=HYjjB zouAkDr5Ct7G6C1*sBF^!U1=-S#YL08x;lj-JOqM1fo4c+QcaDcy6MOGB84BoD$-q!u$^%UiY5{8L7Y?FYfM`S=o1OhL3-`IY`0lZ2sIt^L+A5nB{eG zjf{wZAJ85$ZoIyr(kAMXoF3#AJJSTi7$kQc5VE-`ZR z@@Tm^lvb$(;)-NLL=ZlF@PA1vFPC*ymj{6iJUyRs`(%h)g#KM8ft9i(X;yETmy*-$ z_K00BjUz!L=6q$y;cSH)qd$7R+Cjy@ASa)UUqB$!8fIGj|Derd6*cd4y5(P$YWvr*or%y66GK0+*OF|6rg&T4dltnS@8|r%rRf7{TBqGw%;X`CH zVoS^QM1rm-o4+L>At2zUip$DEgW7h+3JVJ@%*|tVZ*JJ$5=%--j6pKm%frJ6(;|XD znpbWoCPwzv0_^Cs->UT6eeW5pj}zsxb1pC8QTX^bDMZ7>RXM{0)6-ANHCcCecR9<~ zp-Pe2QKPHk>Rjm1R~T4WV64_|eU>huJvunJIhu1i zUAh%cx;tC7TBy!xb!`U5Pv!I&s)B0d7_T(7}c(@`4Xveh4d`ACgcMOm4{dZ8CTALTx6AlionYpzKuF9Voi z%Z=xYwfn%(?)i_QElyw1wz;I&U|mvPPFF?2$jEr6-Im^_V<}COkALIrGV}xhg8S2D z2{k!6dHE0MY&(JOz!2zV{F#_oTJ>(E>%z|N!Ob18eQ0WRZ0=JvJE^Fsiu&c3T-rPf z3(InY4R{uz01eIXNFsfTpdX=`((=4W=!eBN519l!1OTcCS%2dMD%_udC-X=XLuFC? zzWr0-09P^()sUE;ykIUH+*t2yt-aCrHDojrX+Zu%FVWY-#T9KJFz|0KAeMZ+qt9-+ zA+RVXrXtXHd~D3;<>Au*6}H{SyT#>L8mKZ@|B?T2%I|=>WFaTVs=R3dcXTW? zEsPm7x0wm&%@2Wob9)DWO-P7OW3%A%xFUn}2~0mB;7GGs97LaYadu{6<@}jHL((jy zia~TfaCBtJz#vkhN@MM}cvaB;d=v2Wr)qs+c@ZBUpL23Hoy&m0@8fro!q;JTD}Ok&cwau@VZk=5(oz z!)8vL!Qipc1$vVvCH?)0w}I1c+`}w1y{%0hax8LG7BKj-{$m7ZD$7vYeT-wY*J4swrw5io8L~^~^3HyW5>r*`&-tARE z*@lX838n)FoN{q#A%X-Vk=|~vRNP~hy*KXF@KDKhFycP2z};MIlDfFKT$~r==WlIo z0b6)xx@zCDGbCgdz+iD$5F_sDXA~kx}kLA z)@7o8{CIZ$9{->=Iyx%UJ>-}t9z|>upPI^J)L(vgYJ-e~#Gu>KWd;A3AriW>G0)<5 zrUMP_VV)Qh<9=Go>rXs5@sGNe^a;)_vm|My1G zfh7q}`B-vjc%-aUdW2Sb`Vf-_+AH$_B8a|H8ZoqzL56sh<>dV@pbBu9K- zCvK1C;yNjqnH|Q{Jq#-=OG|ldSH7sIU|?Y-^yK!;#?Ky~aq4w=ioFD~P0l*6);>>( zRLz);qrwHKVtkBCNz1gIDqP)W9Z0=%1OfvcjXpCEB9v#R3-M_8E(?je_inaIGj@Zv zbCpaIVH^Rq`v(VIX=6iUk2jas^~Yyfxq@gegw)hez}$tV0jSmipig&OF#4kq5TlVi z9$TX1WOPqqy5CUBwHAklsi~-`O^PTj4)F>L3tSu=+qQgJnVBtiYs8Ai^}YpkiI0wr ziAUn(l;!1R7stfKVPM~%jxN?-u5W$!LxqJ6U92?&%JkRWktC>qS#V4CU7y`yb})q4 z*jSsTIzl%0$?_CdPMam!Sr7S4K4_w~lcoB1F)<%ZCtVlhD4S&t>>ccbr*F(5s zH&;s((M=~ScP!u{Zy@ig?kKG~sgk1&hm5S<=?kf8J6k-}BifeQPF9Fck>unyS<1L>~mpSV#ua0iDtLaKqwUoU_qnuzH2wP!cc6Y#S)K9qz z3g=?_4C~EpS0{x!+imdQi~J#AOpfO(u<5l>aUb8#+P$c$saslFPHk)&ZC7htPh0$Y z2=*o9#_)@))dm0v|%i-(=v<$UcmB_*Z09vt$Cmzx_{ zg~^KY`8;=SyRN%|g;!2a4sf5P&c^%uVWyifC}aU}nZjnF3~->`ot>?1j7q)MyQeuT zb1<(gRx=J!R1(*Rjm_V~C>^@X4S=hK&uRO)*JvSzBvQFQe3$kL5n(X(IWv>hRF+7< zJGrru)49*~kM5iA+iHtTaIu+?P|}ie|OCCN5$C#wT7^ zz^uKwzZY~lVpEltkwV5lo6hxcLPm~CPEH2YRfpd@;gQ?<+T)3)BJe^1&wBWa$v&eF zS^JlqSESq5XWsj>IT>j!1fC#itVceuAaQ5sy5GNh04465@G=@1kY4V#CNQKgP2%~i5^P-5qpJPHtv5-M0KKC1Z(^K#y(Q~I*d&X2QFi<4BP-7yKI2q89 z*`|Pu{HvPnp-H$N$l(Ig+q@l=F8u>xb#+2GCat>+6Fv$0e&$Pe60>4AXTt669<7TX zdcb@IEFz;maxqHz^o3?4O2&*Dmytbyq=CH4D=L6VQ)%}#CMyY>5N*@-04}002qQ(n z$a0y(CLAH+EMk*h0Y~ud>Grs}xj6_2FcI19Oix>!Y8x6p=GE1mS5uFZ7K-q%AToG$ z!jeGaqnUa+yG+l_K##Db@QzFX`}$gkN2AHHx*kC02!VozklC9H=ituOl~nvgC@&n2 zrTzKAd_Aph_&5VCD+hCkHdff0e_-ff{YGZJ$p{52D=X6%yOpNP9eBz%gn3JBO3D%O zkK}#i69Ji7{7#kS<&kZ{&CQ=+{Da%PwX~jol1hN~b9|6_?N=5Yhy=w&x)Ow9cz&-F zhzxyY+KeU5)7>x-VQ`=Bm1@=1H8C;nTH9j#>Ue{>^G{6@|L@t!i_)JfV+{)#6^CkLhl~(Y?fZ@08O4E>WIPaGZv9djY zaqwBi?)2Z{S09^>rGiq1jC(W*cy=0`1{fB~YiepbGT#89Z90((*?hIhz_3HJx3~A` z@u)(f(CU1NzOybjCYw_u^M@fju+^>g2LU&NExpV~#@Lt*BuXGJ1{ho|EoZ@PZ4=uA zfGtcJiVJ^gwt#6)wc`G@$O0D^D2z}&Kikvdv3lNokE7iD_Ro;bT_NB$xivf6pF@r$ zu6o^?$ExMH^W9f)CtNyYv)FUGzb0{8kwLiXThXEp#3+QI4lb#vI8{u_0jk0@K9kg} zPC=bN^KupNmBe*+cCEg@#T64?US8PCG*&xY%)ppflhERRctsso zBr|Ca%wNcL_RpVt07t6^oT~JDiB#8&&|u47Ak((~%cws~&@IR0`s42qhY&0t-urrs zImGwzM9*fo$j8KlN>?HO z;{!m4L&Z=Zc^x0%7QSpy1gI>ud9X4`#i7S_QM5W-tCNQ!tK(S@EH8(mqEzF7f(75{ zY{1+n7P%KUq~dDr7wor;`w?a@rgul6IDa69L+XMW0KbOYXAi0Tc5no77#SHU8{OGv zwdK~q!9fuashI(}0hyVEi*Ivf8pb!506I~u$}OcS&9Ygpf4LJ-DS)k)P;wZUrVeX_-6j(@h#(%h@e#mfgCCd3iaV37CJG zDD2-feR1G`o*!LsFba=|SnrGu`Y)i2Bk$snn^MNlX%;L_bfm{0|rd zMTtH8e}Xao@oJ7cze8JffE}WiSMy-HqLo*7W7@^A)OSti@Iwst&pD2_rE?lpdcoRip5pyLb^2fwsu$g65cm~Y zB1GbwE+RYop->YzKwidHUwKZ#gkoAmD+=4X;YnYa0=5;Bf&pX5;~FOZ_VyMqC8~6q z2iLy<6q-EP2xT`uTGot7bAvg~BnFFR2ZnnkCWc5PRz+oo_z^L99|Wqf)&kVNmZm0< zJr(eK)6o@C(bDp~JxUNf7ZcHyOAyW>>!*xmcW}^$pK?B2nwwB~=%Qe{K zvaS5 z{U-}>Jp(2E^t#??FknrC5icB?QaXYOSuBxqEIoQ$OvzQZTbf;3eWkJE;Nf|SSvF9{ zudk~IUBVz8OlYU-zReoxy}9W^q}5dGNRsTz6*vaffgmeRPOKfBkzd z+2Xu2h{hNYNc+R8&10FAg2Q&^X-;Hd?B?>)l4emTl^#@JA95f$sn)`a!bnZ+aWT0c z{yY}Wn4hoArA%k}z-dv$f>VH6y`e_oWGA$)KuIf8q7$w%(=p;g{pTz`-zgu5PI&P2 z+Z4PTZZfcf(A%x9T={-wN->5hq4>mQJQx!jYv@P@88Az2IhP&8^;r}FUjA-A*KU1n ze>@A;E_q|G!^zQ!LLSw7J1`!zeb{E29C|s1f$_u~fVVM&-@Nb3{@BS#OQ-0xT5k6A z>36;vvv5q#?!4rvzJ50F@$o@)ss;EGf-VryTlr-a3JlW={CHGKu;1geqoNxrwpeOd zVLHAM@8aV%U%Yt+iaam_dKiq7G!UnHN>nIj4sW9HISY!4;_D{CSL8}{9BPl6uS$4KiBH(ATu+r9U*45W{kHA{RI`McHQD7>)B7K6sgx6z* z3=Dyw#lzzW`V^JL^g+k+q0Z`0gTnfn#E&K*R{Dbeh-=}qUv7~42X)a9ZL4CSsi! zNC`B1hR11p^He{0Ux-X3Fg!9MbMQG+0dbFXYCu{%9EM2!UVKACWG4YA;T%1Uj5_=K zdwFC6@lITn*K~fHP}f-bhm%}Y`oFszeDxg zR=2fM_n9b&saxiQ5B5@LCu_39Mkf#VckiF&9sYX4!k?Ao#&w&L6Ef;uMhf-#y#mfe zD$M}%&d2km@=|1j0cFP(aRrHh;8V|UQkq3~dD}|d`$Ga&m0I}>-tHD+=3Kmp zBeRQys7T~b1O(ZHv2rymED*H5Z!fskCTp<5h^P=LJZdZFa3EB01V=}KV7_xM%Qm@n z&_q>6tsAc0Qt8+Lwu1I8e*6W=meqqcbK_siT{m0T?9{=#ucx=xaJpP?JLVDDKRatY zk|<{=07rm^20&#FV=6OA^o4AnryF=Uq_6fwtbT8Nk}_rB0~elzq8xXZzDOOF5hIF{ z5h8^q|2On1vShXuBbkx#Ndbmba^dj;SPkv#KeTzI#>K-4)>A_xqv)jV{6M932Od_i$A`e%>4AH zJ$*9U{XaYacSMwy({2qxYEHx!b~7L{{0XiZlDY93Ae}Lk7Yq6SfKK9Vp~5MDGyjR_ zyVL6%3oyoCj!!p>@Y@5gjh+dmsg|Qj3xTk!(%}&~ZwFIGwfmzyt|#UOpza}+qA}p0 zhk+3hfT^}I(8DYtTEF}+)7Jh*E>AUN;AC8{NOVy39~z@OfQta>Wn&Tt+;7K9RcLoUj?r7lwV1DHD2THyOEi zQGSaP0u9ES8gYN@XlKEHqr<5pJNui`ThDmpXgOr)51**#{?bdkY=FfBLo(sLAOXl% zh=`HzgnfO?qrgO)NPnsS8`vIvXZ>ZTU(+;!NkdKBjuLImjEhM_f1>-v!N4KsK%xz; zdguNV9~~v7m8Bus#Y2Ru=OvCvSHrk^K%w6L2Wjx-;vh@DrROJ!)e;uIwZ|r(Qgd6yBy#&TBgi5`zgBD8!wE{+h z6K?S|u+KndtNuMmM=0?uNbMjHl|eO5f)FQGZ~PJUIrBIpa-QVv-F%9vN+Uwn zr#_aEdKyJUZLNZ=FcPfSL9Y8=HvBKIZRHKKx1YVK_A>VdWo#QDwcUJ3=I6 zB_^V)d2Us}ntGeeZuQ~P?91GHnas0ujkVoR&O)Q5SI%J>20RSRmqi??lGfQwP_yT4 zX?b}$kNN0Wmf*yACBGd9Ev?tp4)s=fab=ilI)+~+5RxRP zpy==GL+gwNOp4Q!lZuKoOl+)B2~nLkduD#pK*0UK7moWpO&T_>llz2(%hKDO^E-=m z&llI`)9LH;-PNCT9*?E%H=o?p1#RQjg~AN4Qh{oh#Pl0CuNIAn6Ak7PjQ~72-2x!{ z0toc&vBIJv3Gt3j_e*rlFu`c2PTzZeevi)iYwd&e^=7rQ#QuH?067C1AJ8Gs?aLA| zg5ZU1@Z8*sX^pn}Tz>u!UFX4`b)G`Za zq4M8~ja4F*5CJJGPq&oZR_BPAPGmNlj`3`vh!o98L=v3sp1$HE3wZIi0*pzg!@FOo0_BR^;X^>kK9=qe? zRf4@c5Z6Be=x|}7xTW+FhF~WE0k4TVfyfS!7zY+!(_deJD1<=t?bGe44B(zDQ;(Z` z_?`>Hm?KV@U#%IG&*$V$FlGgIITo0wcqKmi#z;-1fEHb--hr#45+{X0d31Oz79^q9 z>ELs{CpS|#LB~MH=d%}|wrmgsfftpSnCQDRsH8|@4iNO(pQPePM~B8{W}zL3{H`xh zIwvYcvWc;YFk==ggN`@J4nS;CDvqMwyjv;f;UTE(Po=+OPYa-vGnfq8LPErWN*Lh2 zeStrdl4z-3kbl&r5)82L@*UEmX^MNBV%Sibm|)VIz?c<(!}(?a3rj~$^2`15GcK+s zO_b-q=^(i*fm5EFsat$u6Z`wKjP7nm;C+x&GNL@D02M_`6Ov8#;Df`tQR*0^LDT{h<2v)H+^x$&Ng2&A$v~ka;J3N5H--Fu&fGvIA#$!6Y&^;Gk!gmY#0QG=M7X+v2b7e!wVU(C#pt+A09flw9wRLEjVh z_+IZ%090>g6t}iZ;&iQDyD!k+bc2jhs|l>Uj8tNULY_cDHER#~dbDo1LYWmI2R?*m zs@}r3h{8jxfbFu8l$>1bV=|JwBt$Nj)86=f(>{qbObVU)^IgL+r*%5NmAtR-Tk2ey z?fTXrOMV)qERKXNLV4Ft{0@-zs`&B?eZ|FW-xu{9O#jozC|p+gF2Q|??9kw~(g*Os zDL26@k$lVy-|P8LRH4DaAPwLkkMLtm+VYwY zEMOsR%(k`rjLORO36gnmH~)* zUBpO3BjEbN1(?cNB17@q6t%KdD*{$u2ME$sfb-(xrNk=Y{UKim$jB*zLqY;PdOK&2 ze{$;FnwXdX`7YERGA>BuPjPW73u5G5}+PddMs z04*ymH}&D*CMmIKj4pVYjJWt75M(1>dV6~VG3u%E5h~(q;x1}b=>zku*>!AnYRX|U z+h5e>z%aqX)e|#HJyRk!AJxVpXyralwKfDgj+ZjL_7gO8aEH&6@52RnessCV}4rxYWpgGX;d>C8~U2=Bek+By>TA$j} z-6^DUo6E7Opr2sVD;k{g{v#r_of;NaldVS{lAv#7NI8Qh12sK8H3P-S#+=k7S12re zKuk+*+MsyOFX~*J0Y4G+$(# z4FTc-M(j*5`#myc=Dz8S94Pag6wOV32qJGV9NR0W->S~38sHHTDU5f#U- zljftRFJ!i~hWifgGvr zeux1`7z}UsTHvUSz5M|kwdor`9eDy_QFvUAob~iFyN)>bLeng;R2&zBV#6ewaZk8c zF<|SY&s%3w`#xHe(v$ZwRs*T>`;*lPzZ&BlbllMq#&c$vyy}-bC~7;JTQ6hGT(FpJ z%jtY(XSC4{pXWqWe7(QBg&G0!JKq7ccQbH`54avo)+P{?1FT@1w*b(PX|1LS-5T8& zrG&;JnQ3Utu0~Qsx{qmeOgOS|mh$OL&09y9xp;P|V5_6!iXm5hv@%Iv&9utC@bH1T<-y}4dxN=qJe~s*QWG~LbjjaHx`bn zQDdeJ#q-tMVsET!VC&w5BgfeSI)cw-i_Mwt?=RP&d6;=NK!QER%Ro(tuze=YxNOz|+C@so7lx9J*;t z)r6`KC9q}Gs4eByY?Aa1)4gp6Sz9VnAdsNzkw)3%bi2sH!rV~!d93y#F)-y|=pmwe z!78G;iEtI{P0gK$;v~Sddb48mwU?x&3WT6I7Jp{nq~au>>lp~a7Tw-K`=a~U0i)tN zd#poNdAj!YFC|4KlJ5SLndxaSKYziLtu6g04NrxGl>`bvaa$Xo)q5?Ovc|@j z)$?yv3X6*d2M2}9Q@^eJ*n`JS9?`WqM2JC;*($A$sUDZ{4qcY-Ahp6i*#qX%J2|Sw zrG+LW$E4Se{GlyElgx?H(eJ>v?g1|B&Emb~beO8Sgy<+k$=mKWcm-53n&i+L2jH8P z=3wU-5aUHEcCmzHXiZ@BL?VNArQu+d$wa2G>jFu1)-BvPa2Ktrs>&=0kqn8NqGFSR zK}M#t>;Usjy#0Nks!|!%)z(fbLN}mH@;M!khx{CEw#dKpa^CED)m)0uWr(UA@#}VE zJW;rEUU@Wg(yDJPD_urhHiMsyUna=b=TzFIJ6vx|dFNd=xBVf~Hm8Mp zgZXOf$;Ds&jYLk~a<&u~F4gf`LZ$m#qi-AF>!& zjiObv`arIBDFh%#5b;d{o2Z7E>%^u%*e(eP3H4a@_TN@DHzxzZDhh_>DuGdFu|rOStkIOha zJ1^B+!7jM@+*lZ5gLHv=$#_Ty5{v9?4(c(q{&8=HbZDX z#4bB?Qts#WT*JiqaLc}oQbGF7Q^`!f1~c!VyB{sQD5zAU(?Pd7xPJ7gtg6}|qY(j7 zXlDGmvcdDq|?cm8FU8n zm}+Wjx{4x0L=bJjn&(x^kxEs-pTg!O0mSTFZdzIeA)(byFFgxjbd4csrt>P)z!G?+ z^9cy&VDm+O0AU#|E1RZcOI#}!#XGtdET7Kn?9x++27JrF-+Kn!fpg_rbS5ZS9>DQp zu~ZMZ1iihzLVct>v_+q4z`Rnp^mo*fP~&<|HoveX1YOp%iGHwe{Fcsl3YMuA+8z1I zPIlvcGAaFGMDRnxITPIERu>249$f2}R*SXv-@YgStsJOOS1w!t;j)2p#uxw(gZ@q(D2pgCGNi{E(@Hd)(7 zDXKzMMFsd){-KCvEgHHk?MPy-R<) zUYn7So-28-%Fc|#mo?vzo_UQu1QxHDQ0q1RQNdfe#fm) zy{MTLF9wfZ+E{|N%;S`N%2FCK@ATNjZk}aTKwYtwe*_X-hqg<)T%?+w+tH`SiOGdkQp2!u(*c>oZ^?pGW= zsXy7BWN{nZwm0N0h-eMi+DJ&aEjNJF6L5)Rdm@hB->h7o>9f3iYabPpaJbmJ2UMr* zzWIf^41V|IhQzTwHY2Ba;H!Jh&CPC{iAzlE3Fbjjs5Z<}KTvsio^*zEyT_wF4Y-adyaB|d(NkT1*+{FnNM`uy&A)~7qjRI#GdnHgxgP zH22Q$!y@#I^PuUNkKjv7{;0o8z^GL6zHCS31uko@L~I|pF_J$Jb=+~(nawf1di9El zDWVXUq$wgI0?-D2|6V&>ZNfo)2^SB%uD~w_mMTSIrQZtVGUNyZ&@!SxCMQwdoo06^ z-V7}K{l~hm5p~*K_}p)l$1z{cCFW8;^!xfoQk?e@10U|kr1gex61QlVAcQHlid5|4Aa-d;*pwp{T3K#lEVv(xWM zkWuqh<5@P~Cgn6q>#L4CKV?X%F;Ogf;mbePgvWNz&=Z+;?0l$_5GL$WuwmY;skr8k zB#NA+F+Mf5owR4~r}KXLVf23eb5QaG@U?dN!t%LX8H0%9@sS0Xje=mKyuj!AajN&> zjxEijDJ_|ejmEPFYEV9Lr;dH{`MLScEiDZuOU=L`xUsSEZ(;YY7+4pcJetl!`gUwn zid5f~&USOeBDQh1v>L66-UIL984yxCrz`90@m_u6?y34$n(_JXya{973mykssD3_n z_Oq?QDIolZ;xPMQt*lf49ry0%-25L2b3#*AmWiK#W53P}gqH&H_V@SgcD`|Pa7f5V zfY@8sxSp(}EWh*q8JI_b;O5!E!@+{xq`fbRcUxPVQsO8uo>BCC2k}E|YA2u}KHR%{ zi-H{+P+U2zCN#k{<~9P});~~eV0bW%-)?B+7t2+Ib+w7fo>&BdzbwWF$DJ_T&$PT0 z!(lRE8=R;_*dFWaq=h&?c6UZnz*JCCRgU`g>(^&mfFDCmL17GWzg%K8X1UU0VrnWl z_U8AgFW!e@;7WJBV7Nl4wyOrYE%0FHb~!85Zgc4-b8Wf!-Y4Vr3+~r0NV~~?VIk7g z9`FGH#`g!PfT1Sv=mjD(Lb%y;@88R;`=;wH7BR7~g&356yaG

V`=ml4xy9MVwg*3=!KDsF1~}Q=+T5+Pq#ElE-)Fy) zrl>CuS75K1xRtKJ1Y>P*P(nooT9&xI9X1^Ws+~#!*v=T|gCZh0#c%F!(@}`tEVt{W zR7Fn!cRC?2ulbYOdWq;5wc6$)AtBY}P^e70Cso+&a*lURsoiLeHj2Y}@>}mS4s`({ zSm+Ak>WD7p?YBxbc!&t)H*s2B#>E zYjN4~yZjMu;6ef61Xex2JnOk3*%wy5{xAX0L*d~a#sFk|2r00Pgq(N)YjU!74VfqeAa4yta zH8@S6qpr2y-2qiwSraF&O$I;3F)IsPg&GYWzV3l9#@it7ON)xY@^7;8xN=Y_zf8L> zUvwCo#1!J*+|2Ctw84)mz5dK_V5MEoD@{?iYc?Cg#Klc=w%a{gX<4h+YT5Xz1p*7_ z7ho@iLhOAZ1PQF@RpHmCJQMv%Y=+*(4o9nHo6%pBh#X#jOPQJ3e%ZotWCT^Dw54yb zZ&H}Q9pZKsz(hL8G^&?a1@|gb${oephksyb(8Smj>`f0fG*jh~(HfN#88s9?D8o5W z_oV6@=o^0f@*;j+-Pg$DdT3^k&Cu=o!~p#FxjBv-;ox8yC+51vp}Ac9p4iD3gnhBV zL~_ZIWB?)_8ymZ*s3^A#(hCJC;mN5=3IpB8xZU2$lq2y9OIgB9Q5+}FlYX*J{<0-% zsy1{SW|f~mDM>9y3?A1~`M1Yg>pILkQ?RccpZ7<^_FY3H<@3f$LX!1r0#Cl-1f~== zqr*8X8>L3YF@5U;S(b^NZ)rz1W0365KgPRIKYCjMW2_QLnAX(RqKYYWx#`q82~7tU zN?;T$xBYxh&L zSwmI>zG7|N#%p9(9Ld=N@ROI<<&6f{y~fQfq!e8-WI!*&-x@pN-~+~4E0=;LY(0bH<*VF<{;x$fep8{J~%JVtv^CR!FcIk*K3)-m zb29Ueog19kI9NEf{@B?UNx%;w#D83~QSJAEP;*QoSOS%{)#enNl#_LGQq+xz(WznG z9ew6`x9gLl#EdWv%+OlxZj@v`7=10yrwL)D=BGO&gQCC?nw8Vp9F7z@J~fBYybu;9 zt+PfgPa=ol5?{J|4(7ZOgM+kS1msHs%f0OFJ+@eHLSGsEHzMq#=f!D_q@X~ou{1AO zz+qu%|8uA8%FnNIoFz#5?YlcnGt8N>V?G~T1Yvj^8Bfp0OdRGQ$>*U;Vj8zhj>l#r zx41(4FF?i-^=qii28U1q5}aUdmTDB2i;YP$%#0T#B*f8~MH2_aP%(Ux7>*_`I=lL0p`r`$&E4kCT#zVkBm&6-^?f)Lgq}2deIn?pcAmzwWs^GQE_J zPo86_sYxW22I|6o(X*Zf?t4LXn8Wv#_m!2_QN|DRjHK!c_+0gIiLnCiJM1)cP*h-7 z3Bmd5F(kWPCkVnTW8LP_!_x8)@DDoUsOg{~YOSUGkIPzH3BK)|O4%qxw?at1I!Oa& zKVKXv-fF11uTQb{7RRFjHEa6;VP6<^)VLwK4i@y-m`)n=@yzFs4u7?9($J9-Z~Bmy zazpuXM>fi6#7Fgi>(Lc{XC=+abpFB;VUMdXPu}{?Th|61*?{*)S2OqKjM{~MJkOVZ z9WVS`h{tv3Zfg(&G9BiQTbYAHT&2IKC#D9K``h5)j=iwu;boxHOKB=&WXzq>w5cp# zKFs!>9`+OGIn^M<;Pzb+yj`Wd+si*RU?q ziZMh$P@nA_5z%D?ra`0Vl-RGsG?YEm>?X@!P@m_}> z%I_s(#`6r!>q|?gZ!bUoG4Cep+_$feQxng)QWA;A+-^4}lwr z8IBC^{S*zU#m>R*Z1I+srKhS>hSE&%>*-K@vE;gK{;`0N92(KyGc_kPf;-xqDY>7D zlqbo^wB~PWrJET%HtUEHhlbim-8y$HgC&eGFdd?MpVfa>OY&ncI}4O}yN@6~1eV)f zc-VcIy0u#;*b|KF{n#6mdrQY zGw(D5o-?>>#NOxy8Gs_3RhhZ2q+H9N5!^R6Y$fp-x~`NWy1^NaxrMwS{#|vbwiqogBQC2+GS7!>x+v%^4KbwYkuh+;wF}pNQcvLy4xc^y|4l>vuQVF zhunBH!782OXD-ZDn956&IJtLJ^O_9*w)~~5%g@@WuETKJ$i<<^R z$C!*Wgik^-zy+#FiUpkLs9?#uus@(xJwtn=I3&R_O({x&# zmY?U@PpD z1nb%|3v~{YNxxM82p_}`9dFW*jk0ocQ)zBsAV&{zm|8P)ij(oIXg@=bv3`HfnpJjA zuK8Ts-c&tV5dSIyZ=Y*xL>R}rBPAKA7b@D0Lhtje*7ya=D6=z2t+NYr;h31!OvcB( zQ2T%=jE~2zS@j9)@m1*57~BcU@3X4N*4&;Y<~2H|p-<>dw82eenCJsz%NmV%qhkypW?q2zgA!Z0vey`YWFA!QmT za`WNJQ(}^{N4V6Lm6UwB65`&*Wdr|ixQ+rLA>m@Z#n+DP!Xqv=w%Es84i;l^IK90X zO4Q4RdJ9++nHaH{#6&A~k5FasqoRU{h=nUD_OMoH*Rf6bPp>OA+lw73Advvd56OIb zuRFI0kiN?i{zVudy?usPYkobs>h6M;`lTbIEv+r7C<#Q?D55v^H>q4~Nj{<2FasG~ z907@dTV5`byn3bCL969LfY!tWI~4bZsn*le2<)K%Y6T8E#Itr)n;)nNoSdBUL|`-e z#q!}nE_fdjCN{9&9k>Iw7zh-t#l^u$Slk!r&Rx1oZS=$lj4yZ>d7mHz!ocSY5CFm= zYw+w|-=}A0ET$5sV3hNH+wS#7$UMc!ru>Fu#P(YgpE5yl#_uI2<0;nUumYb%4ncA6%W$)kT$Ij|FbNOGZ+HG7bY1sBhbP_`?nv?ecmwh!C6N6ge1qS`e&M#c zD@{rb~7&#k=RH>%sQWd zNetfAk6@rMn%vFZy;oC}iphtO6i2`b+Fvb|#mU*{^wSl^WfE-Y0IORF{!62VgQR7% z{F4$o4~dNp@(MpczfsvWViX*E0kWQaDOGB5*sc}WW;EGY0=Yps5LitsW4w;p0hvJW zsvp0;I`i4ZhX4;M=9e%K2KVRGl>z%+?RNnf+an{xus;df^8qd@YmNDB;(r=832TG% zY+R66>!j1$7vfwl{f)N@N#?Vq3_jQQz-1(XHa@yN;HEKSP)fxQeDgps{BR zvSH-gx6V|uVcoN{y(N4fA5=%T>wPThXFTqBP9Xrh0((Jxx83ld4eWQTqY;PTW1vaCs$;+xE z@Q<>o-2A|prEuSBG`9Ntdw-YX^QIJ#ToOjtTrWI0_$7#eLNMQ7A|WlE%4W1`bpTF7 zM6dBQZd?83vn17fZ6y1vhc}wqHWHi~WNe%6>dRJF_P7do-JV63tF89?)3kxhFMK92 zu+AsKZzKG-a&!4wE~PVgEN;$Bte+pwSA|N`s1$WN9xl&JOsI8uFowTtbK9eP`-;9j z#&D(>tJTPtNv9oZ3b3$*mTlJB?*TK4-)@JUz(RNZv}OCdXR)7fW!;7QAM%H8UGIvY#v z0p)m=A3Drp-7#0D!F+b>|6~mBG=)Wc_~*#%Dj9%oIapX4Kkq?Q?EKbS18fcOryzOn z625NelHq*w=5Am@59n$l6EipuH}S+MeE+7+K@^op|1~hXSpd;|Gd39$g=;Ru!v!t( z$h8)gJqomapmJ_ax4F6&Fdea0-_}~;qMlI|`IRwI+YQ@m*t9oB){sCsrhZDepAMUS zp;+{aK}|I0dyU%Xq)7ThPW2^!+5$|z#~9)18pXC3H`G*8JF{n(dOfg;+6A&{AN~Ns zuGlsQ1m1~KmTCyJ1%bK9@iPgJ&236X@~N&t+AD((oIRT~VIoym<9%9w%iI?6SrZ?&PX>r=f2%?x@2 z9zE$+=FwVn{4t~DfOTRdGr7-EVk=mrP97=g@a5_HS9mfTRIN{Sc#jZPY`J%$^fZ6?eRx%I@-JsX z{j5X>7-aCPt7P@)2xJjLw3R%g-}$7e9%SLc?;}v<#L+wWgivSm{CSBeQ@Rb5o=AB` zxO6?)tT^oNuiHRQR235kC-&$o4UTLUM933W#r@qIN=%;*FxzrRBkQAaaoCBhl21fJ zm*>6;Lx6KAnQi~4T;?X68_+|4lf?;$3P_BlDnXFf73OKQKzZs&jmtu}b5RjCJI#5dQmQcUc7;eS4K4zDB)ferBx zDVGc_apdT|ffzzbSW-%w1UR?uQYse?mJh;Mu}hX|3y$AdXL)e{IUWZoHNdc=*MJ@y+nhR=sd6blIR5g(b2%b7zTzZ*lvrvsgB7OtQQ zzqfgiG{L}yEktuCd^44>U|`@6eVti={+T!aCbR<|MNX(TQ1hLKuV|F?$ zH+y9jFoB~oU=ZJ{dv!+<8*2os+HpBy^*ySm4|UyN*o6MxQeF}@9)kYS zT&cT{`*c}gOL+8R!R=Pxnp8aaUYq&~^x?E%jBZE;SxSOsqN0{B;xWN+7+&=4N+c|fzf^%d^0sHypHuk} z$@3jNy-+D!o-rk*;|br2h#St-k>nuN0A|!UhA=p*WjtsoNoi6xP5)dykK7$X@S>!a zLmG`S=mNQMSETuOOuTA>as;4?1$w)m_~DcPb5WlX_$m3P6ZS#IqW~Qt4^NNApJwk; z6Gcsorv9`wKZ8V!RGZD&3)J6UrKd$RE$q&){d~xK`63(yh4s#wE zGJ7t+_7>oSz92?$E5I`JyWZRmEgt{#2K)S;>hREo7fP$$@n`+zgNZfKo>wpY$&Q~Y zhw9O+2mBk*?0*mbz%fZVwbzH(9wI##jh)y9u>a<~)fOyzp7OIdLRMKwm`KlgwL z#ZbwC@2W_WK32y(JoJ((qUjjTyWr&KbBgJGd{2^n1L&i0Cr2kOaZym7$VmTe(du}a zg=yX6OjTwKt7Q%OG~+)KTSkk5;J9OcKqLNh{ZiBw`%!d!l7F8aA9vDFra~F}W$(`i zz32Y!=+T<2iS*Qqbd7V}2I_zoVe*WT4MGV5N6SC>1Alq}>UlNNs{H3G@_hr`Pjr8) zv{KdOg*}RmhEL~g=3za9Q|PB>ziq#gR92RuJ~E+&sjz}qu3o1WF`M# zJ=Ek(B>Z0c$@5W!GcZJpYCa@)M1fPD_vfQ%^t=})4KkCj_Uz&3A(Ko@$XEFN@f~>D z!-IM-CPvZYmYr@-?P#t)S4BH%K01P^w6EegZGn^|@TQZT!@*1NI!aUUP)~FGeeRM6 zpd*Oof_oNYdyivIyspx3Ei;f-Vx}-g-&!a2Il^i5yy59RqJ((5#odI+Q*J2?+VO0P z($I&EH0O;j2f@hN-G_$;74f{ zG-|88VGdY1OTX{lax-(m?&E8yNl8g`cwh;aPZsDr0-+6zHezeamTISFC%nVuY2#3c zS3PfDLdUz@+$4mTwi3Iqh2~PYuaAFJW!BcM8P+vBrX3ij#@XK4f#N?WzZ9NTD#FB* z*<49c)#>O%|1?$KcI*Gq@t<0NyQ!`1w?w(Sc-s?%N!Cfw528|TxwOhpx}mW=R{?G} zb#VW#!csY{p#S(NByzaY-mA}=n`h8`{=Z>k1>#A2QV;z2-OZi?N;~pPw~C zLQ`UGr}N!vH}xn~NiO2!;nUO5taiA@hUR_x-V0hB< zGdv(qPHkgjW6(FhTm0hnaRI6S@o$~uEc{Fn4VTOl6K@oD0#%vm>E~K>9&@*HCjnau z=Esj8>r$zR1wK#OcNK1fJojgBJ+(w z@ZEyBgWK|4z`J+3H|*@}F2rcEK{CLxef4ulQW6YRMm-XR7ZodNr&fw;V-ER#2yBotVK38{_1Z65)z z<#SdJAalfX-QMkC@r0lw{oNl|nH62-=LcnuEj#7hi8`5C>ZT); zQs;Hxa@J2%S));Jdb(A`Pqaz{fC0?OsaGh?v(pua7@hR8%wwB#>Nlo2s$xg zBEz=~$_$VZG<~xmzO*cnH4NSnVMu1sW=F?PzOzuk+g$=H%eu;7c)?u4czO z=e*Nbla+06EG!%<^IojCoQk;ngfyg3IOY45R<4UsGQ@W4Q^nkrq_7)4ybzXbQ$&7*u<&b1&Dm^JHM9; z`c^s~!64(pXnUyJ2V|>Ka8Nd-X$8h?#*Af@5WSBCuE|Vw1##tWolQsDtiof8<8!mp zgb3LR{!tK~v|4MW=vn`jqUvx#h#W3MLdqmdO)l=f^MBJd1(qEi(aD%{S&HJ^Ip?|v zlVYUt@#Iy7evhh11aA&57#*==ML_@=<3G1diPS!AK*@s2(%dCXXw_rk$f*9Ne}hOs zdmh-{^}uAH{aq3Y{Xf>N{%@EC_x*&Nbvu5Z3U+k)!n`+AupsJN5;67Jw9&U~eZ1x|r1L_DYt z;Ku&+e*Fc7!`+Mp9HVh~Cfhi4##|>&tZYCN0 zZJ8{FX9F8dBCmNJyiei=V+jZj?Cn2?gobPk08bAff4JIIF6QLGbWb+Kp`b1F`q;CWiYYT%7{k&<^BSs3r7dZ^YaxDYr0;KdOreH9?LX39L_O13Q8U|Kq#IS z7(k>D?Re83uI;`hSiJtEr{~Wq|Fx|9!^e1{-T-CVkY~#2mbrQL3Jih*JGL5 zm_BQkL4&1M05V~AK?%7;0dVGC-`o%i*hnf!{5~xESt+wB5LqspHdmn&8#K zt1+k=Kw=L{UeKRGdyi#CrKZ{fcSmlVzW1-h1XkU}x=;*p;89yO%+Ci=({wJ! zi>A{=Km=dkPv&(-XRkDwvArC%U~xUX^RKKt25hku&eAfcS|CB1T1+8edhQi54=ki<_}VWhG+U;%Qfz>zJv}de> zkU#YqKrA>9QxB2%Nrd4C1*2WvqEaCtp>24#>D)V1<5b5Br{N%R@bS8u^8V)HaJ39k zv!pfehn-<>JDkuweHq{$V1ife6#cz(8f4 z9SL2Y=c7j^;kp+LbQ|gis27f4jw1xX*{;CdhsS0JB|TTVatvrAn4KmtNiR9|Sr+gG zHJ2NB>~M~){8Xm^(;v=>f&zp{uZb_urZ_D$!C9K2TCofAXC^28GQ~r8W)J5oB5^qs!BpG_)wN0E z*>kNbH+TmBCEv(MW`Zn>mf1>XAUxNZAv)#&cBlOhUFI{ljl;iJ5a_cc`e*+ak|Y}j z#uq9IDz5-xQdU;ZIEGVGJlTSYnRY`(dqC2+-aja;sOTSt7MGZ~ZYV7%c%nr57ore<1eKpB zd#8zoY(Q{G97$&ENiK!_;lY*<3LQI<}i6_3z@@rzF= z5-t9!;=tVTP=|asLwrnjnU# z&7~Yy)vG&h!kmCsR%1Tt*q9D6`PGicXH(y#N4e>m<1nR1zKuAY3%-Ri8dm{BVq05V zk~2h{Z@~4Wtnl7sdLBLIH5$k}ZEgY%xqrG9atA9^5urT1C@39~47&R{9U~->WorwT z`a?5n1tHPIJNfxTbg9TbIp0e3AD07qKf#xBn9YWHL#C3-9IqwY=OOLvg#YYB#HoT6 z)>0y5(#lTu@`Ohq!oz#FFT7nj^hMvBKtja&gf| z0u?p2>N1CfNzuAv<$T`#6X}1quU3Bt8G~T%!VcweFDp=J(A_Kg$rwd!`D$TW*nVXnyw_ zmG8(Jv$Lt6$J$yh0cd_oaY`H+>t#IwamKTckTf4ScGv?%IM_JQTv1Xdq*%^RJ=LAr z=q_i`9~rY68=(+JQaC7of&}zOyh|AdMv_1e(9k3lGqCnZyZ0U28l_#*i4WfUIZSMm z?naD6Yyk@1K5$#IFJ~|?exuh(dn1e&j&SQQr}zo|cTKhmJjFWP=yh^*&8!S}8}c5t zVmtUmx{IUr7OqS6Bwa-5DBwPY=K=0huQSmRUZeeamhj6>#m8Dvy3EMkhI689xW;= z%6NLf$93pqc0^WYlpPu1O-YE4M}U&fwbSQ*2=B{3?4Qo73TbDlRuEY~1B_ns9un@Y zZQ#b04h!ch*EtfrGgC zDwof@Zbz4I-VElAr9*>7Or6;hwhJu@Nz}nUXzPjr>4yWX} ze_G3h*Kl6m%(LHCK0ZFg0y}SS z({3+RRF%j*f`I`Wto=Ca>hah!ACqc!FMhp-6XW=}%*}Yn{gNm!lE~Nam@gbp%NluadIf0co@qCSloLr)C*72NNI=AJw!VO>qf`<=Iz}_)?&o~TP zJ+1}<1ySDuHUAM6e32)PMSQ-Klii!Zqm@hk0BjU)?QRc>is}e8AZGw9+|~8_lCYNjR3T;n$8BH0D zs4B}JpI52hF|xzcSRHGpzh-9$p&*NS$))sB+hf zG#+=`qg8j1v1#$RhjH^GIt7>?pzs?j7khhqht+-~XSMRD{4c}QnRg7N5CnH zO`2Ld{WlZ4+hDh|-a8blxqOZRn$N?_YEz(qFD^bF`GvFd(Zg3U?ZPrRGH}lW`tY=r zsTGpJC&f>@qiH0sJ4>4Eb}iAl_E_xyS66%HWN&Ytcm9qKG$OV1mqHR|F8f8yLVXsV z^zy%al_U-`S#6I85KyHnQk@(B(CUQt|FU{&l3?8{y~D|0)$V%VzGTNjNFo(S^);huQvYqSzM<0Qs`Z%{Nq?8n|u6~&|J1&}Hm{ra8%s_wbB zH-CHkhz5J03x3LbuvoWRYm3sfjUr6wt!-AHThwD?LC@EXCxUXNy*S!W8K!j;(YEt+8^ef19-atQVbY2i< zYvO6jOu4&NR8h)P49?xc3^MIZ=#R`mB_x!2Dqo7xx9P1yZ+5i9V=WY5Z*fRtvjuf| zIhB=gJ(p(-h-|wI1e~8VB~1aG>pvVI#Z`c!0Spe4#o8hu%k9cW0JD1%i^p9+cnaXr zP*U#w{{35@EsC>R*U}KIRfy2}=!)rBG_Po`A6j9+VD4!KZ<}1?UFH{;*h?_0Z+sf{c&%<~PcG%@Hao z9>|zK(N7k@`XdUzIyL^H9iiYRIusk z))-`O$&2xOKLVzd5>+^}0Sh*>hUf*w=jnkB5#}@j+*=MNimjPFI~=;E7VsEjEcAOa zB20^!j%8B7BP09o)pQymARqvs#*dkr{_~V&>hB&zM+}sr8C+IO?7qul3JRoG)l>Ph zfU6VRh4kXZYP-8puV|d4YAUw}`xY&@qu1z9yaD&yLKEZ64(kVV>nU)~M-VNRjDES@v7iB3ICu<# zc@mH~KqXOQJ&35#(bEr?3=R*6-eNOTGbaM`=^hN9mR5DU&G$ZV=_#myt1#AAAJ&*g zd4F#YqvI_=VzfU*+Rw~PZ*6a7Mx~{dmF1kbDT;^y0<5m6_3}pqbr!>E>)rOY%+iVq zF4GO}@I*@bURxserHl z#Vh!$&X41JpR18BBY|wwrI-w5@iX6kYwxkaly-Wp(P3k~U2F8-#nFCWf2tU|79KH@ z1QlunGCm4)kwv*kf+jLGhMi)Sl3NsOQ2WPz^@AOck&bR3_#BzFp}tQ3H(owOL`18V zW~pXFM+)=JSfQ8u|vq3xWw=4 zhkrTluDX=zL{pJtI~FWS04gC80|`@-n%9?uCm99!onXS)BU1Sswb@uP(tE=FNb#Fi5V{R=JkH=PnJb) z-FabUMP*`7OIK#a*iBkx1b8lQiRTOS#B*?X;zEDSR!R!+JY*mEyEWD+AKx7RYf+5% ze|~}c4|3=K?5g?yz>89VfdXpoY;;U~qN+-Kf@)mu6gZO8EVyAnb+{`ny*rRb@D2*i z^H&3c0Sh<*J%}(5w!dr0%Zr2ULCYVkfnrJF9&YXaicU_J!a>X2$$m1W|24qPzt?g_ zHQ)5@sQCVYx{~p$8;;|%%N{4u`U-shDxeTCyl-AGN7g28|v$$gD;cp z%L(=%WMs;Qm5#9q2gyE>DpPuZ9_YW2o<;ytuHTBqVr9S+^nQSjuBmh(4)vV>H5()6 zfsE!AzCR3dyMJJQZ!e2vs6gPGvBAN+yF;1b!#0hJ1F^eX^QBgzX}xhT0b3>|>d5a6 zR7IM=warlVk_$q!CeB_k|PaM)~yl11?cT@YuoquenE(`xh5nT;<3@~>^*dUi*j>)tjkCN)goj%hNlVx@uv9Vlx0sCah%`S#+_=JxPjfjq$D0sZt1&0Ae^hhIxFDXbHM zI&y&CX~Kj8`%f(ZEZ?Xuex|zzc6XBpd8UG(DzNDe_8M@<23J|+))&phIReK$=(45( zgLg=G_rM5;krcJdJpl@O`jjg%K#2t2`K;CjkTF-&&O>8_5OA_LAWEJ}Z951cX1T2oH9`&m{Pa?+cc`*DSjD2EOE3n*b( z-P5&)O1qdl`bLxmZ=w0H>Z0W`Ixw-Y6yQQYe-9j-8{jB|b^^3VI7-UAJK@Dbg(t2j zuzkNvwFiGZ{H`llz*pr20E$0|D_N+s8;T@ibPEFdHq#Sb)K78t>vQA2I>I z`SDM#BPgUHQeW7+23y+P;VhJno}QPS?8ZxdI|oJNHM@*2;M`>IY6Q9Jt*oTL6fyg~ z(rR8_*hUUjr_qn&D#F*7;^NZEii))sbJ*BIhS!~|X;H7?5S);3I8E$}iVFpu9{cJL z*$U(?F5RskBW}GO+zAPJq24&3?fXBL|4JDg@nI6=#AcnY@Xc^>UUgWhQ+cP3w_l;n z3t6(XP*0xXEr3vCrpg>>n=;F}J4S%wvGeoic9mp3rOT4F#Xi$)= zqh$czTaKwV-n8O(HO+2omjeVZu61P+I6VHv>UD-BW@d*oaa8f7#>vqo>8R2azmz^J+ zQrJ^*E()r%v*|g4X-TLEDUJYZN>yE5)6h`S=1p+>`x-x*1qZM2#t^KN)ya!?0n2>r z{Xp2oN$){g&2JdGPSS7~w_6u^tM?>H_T`qI zXN!SGQq6qWd^{Ok@}s#rbQ=_BGqFI1qaKK{as@~zr zP|oyVOAMpqixoaxsiBuI*jh)T<+P$&OXRV;b#joDys?nf=H&Bnwl!qGITDJCzI5Bw z=%zi`pA2MbO1*_@n_PZ|^cc>h>NRjXZJJvc!u#t9ymf#7>36*M7L&oalQI*iMe7f3 zFKk%NmvmN^6^r=Lvd94Y3%b<}6Xfr{{{zai&dW!?fi#|;aOQTxvg0MsS5U$*uJN%9 zq971sOx>zr#q$>Snsw0OWdEJ0_2n%^_(yt?_WMn9t1)l3(NI4>ziCAYf+%EW4Tv4| zft;eE;gUa%JUkTT!`0s3IU5l;aWW~Kn=iK{hZQ;k?z>;uQ;=hT*y6)6+OsPK^z^aG zQRQYE3gtWP2s#Z;6blqqi)DZ&L2&s#Dbm+B08&BjyZWMDT&D5(eun;2(k zy#@2{zK0u`b~-J!_#`hv16|$Cts?}ng_^rk&eieG%ZjpA@+FI(=FHCP%DuuT%eJ8V zueT-Z>Ho8`ysWAEy?

HQxurA5Lv(Dcd4%acU=V&kv~Yj#Vl^QnFHOMuBSTh^Mk_Kr9QGp;JZFaitURp>69)h1_don4 z>A!-Q6X%o&9f4(xua?&#VoGJ5O95m{na85*j@#jcKC6cJt7AmudX2DmRFgmZlO*Hb z1%yx!^!IwJ0MQrG1gks&q?>{@r=Lm|tD^ZA2;6H#Jc#ZjL5wA4;1YPnKY~{M4b% z-tDjTi;Ib&xO{lC#_kMa3b{v;A+Y$ZJ*l9G$7OdbHjR@UwK;H5S|NJ|n>pM~o<)(i zfG@r`+h;vJIOjVHD%}pIlHP9As>6>@XtX|qX-_5Z5n(*t6M;a8dxtgWJ z1wp$*tGEwj-SfY` zf47bbPJNTTJ#aBb`iA_aFzU{y^MnlZS!!{U)pp<7N6SxZuxsBZ6PE8k;<52;^!y18 zd;awJC0j2b3^ZlB((!Rw*>mYD9SSW*fBLBku2ZWHr^9MWTu>%!%xsKy{4Jt((6wtn2z5rDQ> zZbaCulOaNo9$Rc`x~?_XF6eoJ$+W|M=PR0{+2FFVxo0blvL-8sx*<9Y*4g5~fI-1@ za3wPbBpqmFr>CE?5Rck-j;DrfhsMv7RDXnu?VwF?y*J!eTcV8tC;q2T7K@c~+8U!= z@!vh~JG9{1$Lj09>FE&xF9X9tNogsI&bjz5JGnsR?^Qwa)W&13A69t8mWXUO$hh-S zxh(Oi1Y-mP+7{l-EAzQqa~E-(_)aj*PMGL;uUT=8LEOuY;ZU)jZfm4gmmj#18&`fI z@r#B=A4d@R!!=U{&Lseu05t9oC#@$V60)Z`a=k0*ib$gM^lgM2LmgYyhD+Ozk8f~s zX}k|^`Q_8dGt&z6vic-#iI0nf`)6>0 z<+PJN=z>B*Nl8hC1%&{K0fSt0vq3ic9q4J|7=uZG0(#uGFg-Qq#Xs3&9N#ew@{<7F zS};Xy#zF(c_f0S|P||vvx}L7`0i~3bk?t`MMeh5alnFKL!`(dZ?ZFy5BeqXc#w0f}*OT@cnxxd!Vs)P-y|wRUfmr&N!N`^?u=gmzRk2dq~f1bty{ogA_BK1a-qn#`<3vk^VR%N2z)0rxw>hQ?svcT zM-kxP2?k-1o_Sq279mjB6&dX}VIZQ6AmuSzUs7K_kz->otsUN{Nm!q3j40W01&OHX=y7=dII%8-37h=2z~E@ znZP56>b5nYRCZxVG(hB>E!HDo{4<7W;D@rCrG@Kb*GNYPqVGtqf>^xYA&upSY!A&A z4>@ZZB>S4KF5*l|91gZ*E?ddnFTHsn^6I}LWl5A9SFb>NwZMEaG0?jRzA4(^l;xKH zxTSJdLF05{aOFP@Ts=2H0LAuQ7mxNvEH0q=!e$pjxkL(!{@f?!=D{nrU8qeac(FH8xy|r)edh;qCDHT+V6n%CJu6o7(_SUJ)P^-SlDFXNcg&oR+g zP!*Y(ng8&?dlJjj2$971vi+ymkJ;S_T0!U054t9Q+@Dt8o-xJ`ZA`R_{;J2_6t%Oj zMngl>LFYGxzEA!-oK}CvDRpdh1zwc^00qq$fs-Q9xc!&p@8+>6A+xOdoBlU%-d%yA z8Ek25KFvK+G!Vvu;DZPW%Y145dbd{F1?1%9p!T`&t-jYGVlw@5GyJ_;_*tJRebqxl z-v#$kW;_S@DT!}0{rSDr5yhpFIp6N&bRC8FzfQw;k>brUnt&8OkK{8uTu8<}k+xDUf8Dz)U+1uY>TUL=Ti~6{|X;AP~gf z?C~TzISyjwP8RC4CS@6npbE%LdPo^$nb;^q;24phkeE-C+tU%)@0GRxR(E8E~K! zW6HHhtJFHZ7GKN!l7>}~oSFH>5`P7d0dcshZ>|;`B}z&N{;uxe$M;Db02A5UwKn8y z2Y`53aBOXbz3481_`qD@uQ4!rVKab7cOINUZ_{9)paPUtnEgZEZf@~$0GEmL9Q)=T~Bsx zy4d#Yt}{KtlOCz@i`7zpwp=Ss6PP*to{8(>%0!nvQ=_5|E^b9Ycd$@rR==~x<~~ns zPE(RW)D7M21m}#SftxabA?Y))+z=Ih77?zw=6Tiw;uZRS_T7CtZ`#N| zGbpaynHipggv3SWdODp|D}W_2{4b*Le{J%-xE_|0**P4J#xbj*aJJRzPQ1jL-1a)2 zVE)*FPN1V+`z*-nSZ_?hX6M-bcMcLZ!+Y@}26WTaUmouXA+{$Fv-^84KOvxg2njX? z=p*EP_qBj|#~JYB^`VC1cmIn-Yi4E{S73xu0-kird4{6o)$kd^TvBOrlZ><`BiNky zcG)N++le8NrCYY*53hk>Rul7LK3iovupc9qCys~WUzu7;n;k>o1%0hW0x@0aHtd{N z07X5q=W5Fa{(JI5l3gp1otBJs2~w8)s2$(QfYNBhNAtI;(4>Y)^6+A%JyjVZg=IO# z8CP_#)>;|Y7BGkC7%SHU>-r)a<0^bwl{Q@d+GO9xS`e_F+O0*#tXuxPnh({E;s1uj z(6ntxig$xgt5p+Q_lcUmoD{Cb?dAbRhDxzSOiW6v&TuO`aHCWmQsFxC+8dh{3^(DR z)kp9&+})lC{NZCFKk}Pd*xMu72)fz7w&w9T7uV5=P>A}jEx}*vyyDd<7WbmmN2yKX zGaib={R!s`IP&gzkczX<3K(~?GBaJTcc(L*CxE`kTc@lVA2reutP2`1?J#btYW*!RBG;BUwp&8kCdDzjFr4m@vKkbG!vcGnn~u`)Q68Rh*bga10@8%YHlX7M?2B#>47$zlCrZFrGCWFOF9VfrS}Ifm+o; z2`_qD^~&{&ozL_*0T4v5Ut8xfrYq4&2CH?b$#rX^PIneEjYx*?iGgQx52V)U!hkeS zxMSFaAXj3~0BSm|#hp1Qt5$1-%wPHmIkY2_aynxL?`z+2e52wJo&*Fmy}%Y6Mvwgf z6nti8CIYutUOwpx(wRM_k+T6V}t$g8t~jPId-{f5)O$Qw$& zIiE^uad(NtB+mHVNENt}0DC_3Z=VfL<8;r-`pX=8|g3Jtl6Y{{ac5-p1@G9u~3j#$9f@|9&EIBk+rc8`ZsTckjtyiLdw@W);mP;&%QeWXiL@< zZ&guLRvY7YFi{l47y@_bpgn%r{`YXz|G3k`TY252dHD?eBLjtE3)w?yp(2>SYfAF* ztGjfm`OoT+M=(5>W>>Il#+M}Urj=-1k6XAaVXVnDQ0K*FS3BP|0 z7E%6VW%&^b^63A2k@EkbX{DWi2TL0u&=VuRFz|{%tG`y z+J7SE%`K0Fv*kh)_v2A8-`o3tJ8d@kgqDpVR@GEZ+|< z3ka$wG^R-GL(}hOJv|qefn)6iR*3NV6Um2R78B5?0T5=8G^pwCxvr@xX)Tt9z4AK; z|8JDm?qb6N*SnlPf`E4DV~uyL z;#<0r1q5{9l5>1u%}h_H*XDfzxtSm%{%=o@s|)w(l{<*qO?fT1%tJ^<=6W%Ggs?;R zzEx0D)8kMn%*@2pL`8*pxx&7){KE#f`!oNe^Wcy;p(^j=>%*hN?_oIBcjstIGtEPZ z%qicj`AsM`K-~epy4H6|e+hOeqiuX5krKXON@SAXJv>YlMEcqgWq$J^7bkd@*xcOA z%;W~~SwZ=)?NsNwBnujZs*PmeZ5#96H<R#!*gUR)k7D@>ZEnfCr(qXlV=T<+WAPELZrRA)Gx{5tOr1dak4 zHnb<%))GYNhJ&@N$z{#+=zQ)2tpK4(rTqkZK6opWL<=M1yBuGR#qm9di|lRAMyNv- z=VVztxHWTX!tg-hyB{C!>2o#o$B%VNrG0Y)C9wAa0p2X+qTr-6{a25X6fT$;5UUNR zvJLHwX&Ad%tyqYNti@J`6sv<3nzN#&ms6eFe7IBV!|{QO3}B1+BuJ~EAg`SV7Op-6 zp%F(G2#urT2D|BMGjx0?yvo+y)qR`$b!A%qv7>A#oE9BtbU-s5#-bF^;%Rkzjs`(G zbH$b?sd044{?84L5A$7Tdg;(MH|6f+yff`V(oT=NcxIv^A`!Q2G*e|#bmV0!HD(vx z%;k>x5#iy=HM)IS4|Uqt_fr=d>>TjP@;cUI1yOlGO^rxMfJ3%cR#pb0AxI(D%Ka9{ zMjSMykDSE6F(}&47|>I3dNdR88FKSVQu?4)wnSa4iogEgFZxfR z{np32yWn?WB+zcZ6Z`hTAtCW|XRbw~7O@g0yA#16KXxX&BQ2g*t2>8X?+|du{y57K zi?g-02}MK#{3}Ml+K`ozu|D#oTK#$E{7B5nX|o@FCf!H5frv&)L*ccz8MvYOuC>YW zg|E~9o+^$mcVbT(?&ByRc_=zu6P5LVP~}l*Gv;MVJwP8IrY3f4_qXL(oo{b>I)dQM zl&+ZlGzXz9{Klh`^FPnKD!`f}A8KBxOSDKU*7Y{ZfspWs_2ZLfhk}Mu~I3UQ0brLOWH8^BNW>HdX*(n7eJ19zE ztpE|QpP)>8$s^>s`epTl1XAb}Ra~SY`5)jqS-H6+9sn&+Y;34zi;EC=SEK&VAS|FJ zjTaY8J>1~qJ={yAvB15tF`y0$kBoB$D^A*%I2<0TGBP^z(Qu%(O1D`~P8fD~9U~#( z!gqp%6so(=FM-0{h^FvB>Q9CmoWT5~gkMnhe*?Be2gGuLr+U*86V5PuUuKmT8lZO!wA25&TBM6Qg{3%MpWpDmktj)O8z0fq-5%6>vxD#jwh#$^ zHrKugc$i?`al>HXh>rj*Ro+J1z`*R-q#vy4ePN|T34=d84;dVsyFjm+GyARi%N5C8 zVT|%

AZhLT?qez25CS`x@H+3&>*m2gi!K*T1}(gLW9KV4LirT`z_w{S8WGU?!R{ z0?H1#(+fAex`fRK=L8INbQ<-_H}Hmrqy!=9DCu}a>d-!+%(|Dpo6+*X@>>Q|_i(+} z;6AgwzOL&nl`BZmnc|v?dw8UsSG7&+ow5x)R1W=rfHBM4`wJ|EvKWYp2g4juU0vCl z$SNx6u2AE&;W{DsvBd7A1#SiwQi*%_O!b%rFYJIC1-g6u4f#(MjM>Axf-0myjwemVuP=R3E6ub@sz|D@`X z@=xjmkt!dT(>wp82(I131bj5)5p*X$SZP7(~N=w`e(fNJ6;yAy2*}3 zaj8ES`=LOL)0dE!uO1b1pRdMjveDNE<{+}Q@vDo6K9BwXK(qL?SF3`G1kxisTY(q~ zHVX*{g#P|*;=4>t#G-F@*+VQd5U@xK@9MJpt^=~b+N0&8CYgriLS^kJB-65UAc(lL z26wtPM6ZuxQMd+-~SR96@~5$BUcjgXnRYB03wdxu_Bq9=pf7ec?Hs z#WszX{gr$$-SB-nWe>5Q7STjH zsKBG4!5Q>ygd7~$xtok!;imo+8bL&V+1S`Ndcqc)bV8dR9U-x_6c&ro!ZD7eLC{-M zMaP=U+!9HuBgt&2gO{`CNm#@+GPnP&1$aN&1BR9evT|%@aMN`!uZGZP#9Ur4V6gl8 zLhXA=tJOT56dK~TQs;=`ois|=m7AUYDO*rM!3vFoV_|TRIs=;IBm>9Wv?`U|wFQ(- z;&T`;ZoX~(QwQhg2)#BQ&R(lOw*E|jk<=Sg8m-#*A8Dl?-?CWD=}Z*REc^ut z;T91?6F8!zwE)fftJw7l&P* ziChXXR5php0j@9yI#C`jQ2$9x)~~EOs+-XS3l51ZCrFd|M`A?UytLPE2NqFJ?eudd z$%b{jz5p9o$^IlXobw=Y@rd6A9&hRhVGrOB*Ma#9OvQR6laUcX>akfl7~BdffYtjq z%nHj5;E(VhI8Z9PvcGb<-1WG%GN7OUK{@}v?d}Dq*Bzu1SPBjOai7DA%w=2P^>MWC zC6uevE{O<@g9~J@w^=b1b^hZ1TjqX2F(ld)-SI!bc zc3c+J-^{)d!jP5F#IqopKHQo?$_Oh<{!d*Wg0|O-Q{ubEn2>b-;nnW4 zLHjz|+FHbVF+#fxQK$dY{pA~qfC=LIJsYZ`Zhgff+q|&%s7n>5Cvmf7ixry#rJ4|K zhru5*YHw{PcFv-Xmy&BO=d4CLZSSi^=2cY%gddqkxwpm4(w3VE^{)1(OhJeyS>CYy z9h4L7If`^Q@j55TV~>nzRsDsT=%k41=o|Q8JX>!MyE;P7^5=H?k zo%u>>$tW%bC1pJ#er!q<()mK26h5k6Rij|Ern2H)GCVTBkUKTR`S|d3qtb({)Cj*RYDewx(J@qgqp<145T}7qOeg}Qm3&>kM=jR`6m*k9wedw)m@g$2)K$SFO^1 z*};A8cXzRle1Jj04ZZ)o1S;B0DBE^3D3j87b3&CmodF=1vd=DfR}9nY(WzF-5?mha z>^Sa?Z>`bNl1bsEahV!gS)KaX?f}ij15K1KIlIobfmuZQv-3x2FS|E!BvPzjX2%yhepa81YRM; zd3F|A70H9=H2xY$X%$)~x z`p3%)&sRo4Ufx$V6S!PhEEoRjPVKGa2!?yc1&Q{4Xg_DY4tBAB0p&Tc9BQyT%BrY1 z#~pBEg+hB^ZzA{BdH;jHTh8jL@f}hwFH4v$RhRm>yTS(g2@5tNVvAdKBQF!}Ls?s& ziN(Iu9k*@)tNdm#q4O>0wJnFsn-YKb$bNK$ld!1@seHJan`U?TI&-rjyt1M`kYb6+Yj6t)$)J?<`7D-!-^Bh|&n&a%+RhlP92I2r|z# zn&3JObkTj)KYcaJk@Dn9$AxQw09Ok#9_Me~ zXUqJl02?qX1h(PTsOV%}GqZ1=$Ahn*9u!RxxFC)>kNfXG+cL_zb6L|g^+&|SER|dP z1Vw&K8rm+yXE!rOE$W77XzUDWNUN(enO;+8CJv^l9Vz?_Wgov|G!!>qtUv3E%8R8@ zYuAkd2877(8zGDFT&BR_LZ{gX7U>XdFV<)~fiM=;rVyp_jh9AZzUwGgq6xvMdeX}U7)LMe5{4*EGeGJ z+PliO6|}6+{o6x{ka|SOv4{Kq!b4Btv5Gk{$JW_4Z zxO1@lzsgAo5Ki^^rH?bJ+3Sl?C`{Ul011?nH+KBfH{#AmlJ2yI|j_Oixw8uy!1 z?`)UTwOQC35R*2T#6kAu%bOMm02Lr&G5zA%1~2%3E)N<5M11Dg-0sN%X3LGJKcTNr zVB~%)dXG%zR1rBXAnc6zCn8@T(WP>{K4Uxm1gydn5GBX_#cCa-hROdD7(Xn=&v`X- zq}_8P!aKQLPkzuN60i~0zE^LtV&A+&O%ryUDN!i^88XJat=KcPZJ80B0sOAyKYsiu z{x8?=d)j7?E6&3d^*T_^{(kM-;^A>}&1`-I%`YX$r}=!G0s(1RsPyEJZ){8T&IjPg z3mFUn@G4A9%*2Gm54xan`#C$>W|03rPSQBwm6gM&y_GC5u)1Szo>(t5N9pwh6_sf; z<0MKX(q9ku5seQ1m)EsV2#v#YF+O5c3HYJGEQHg2-3mCj_?36+Ow4Vc2d%&1Y0>>z z;$RW*jKof6b7!z4xZGa?*C>Sp!;HqEHHpFMy3KUkzv_g1yg)-i;r7eYLi4!~HBYk% zR#IG?(|SD{V31N%OEYu?5D+fFt_^8kwp-A%-P3)jWC|`}kT}Q$Ci-8r%*QA`E^a_;F3ac!AZ}pZK?9T^pyV)v zu3O}=>xbe1caYAq3kLd_+y*tP!xtXezO+Gy>$O;p19dg32)N)z{kq-1(P-Sdud_e1 zqb{xn1^f1A6$Zgy5>NiY=jeY}Tf*@A!$;;UN;v%LzqNqK-VuqL;L%E@kz<0U|K9cd+RBl^Ks)T1m!1C^^}>FqbO|7lPnMe@o+}f*y|DWnj>m`}!6vZK z?J;l8+qbD8f+m#rndjEjak0#LMY}LF6LCToT38u_F7e@h2y%nZ4NN8G>UHz;h5v^E zmP=n(_tPyk`L!ud^(COj%*;rMiuNDj+VG_GbOJBY9}Se`y#dV#Bu2nVF)=mZkqG%GpLNst#csA!F zui0q;k8!(&>xakl-wpTo6^EMd^-xIAr}ySq076Seoc{Gpq00J8Qs ztla~i>nkZy@miB9-Gy!Yaz3wNm;$K3U^UTm^hg;jU6gm^iDOAwNp$bYk$E+N=~<>s z0kE|Oq`=#?Iy$~EGc&WXB^0BeAjCyQ zO^l5ZzRy06h>9u5%Seo+vO&bx;E&Wu?xEHDpm4@>ef*X;==>P}mRcbw^OvzVR0T=* z?+UQOUyq*AmL1<#1Oa;R~Q!9Hzsa+~$dI$Z6LL!Jj zhJjJ4cTHPji*1H9>-~X2JH6=Jwr~LdEW7W{+*6GV9nS;s6%-Wwjx&#!8WrUYi`r9N zJzO8k%x_i&{`l@$#pAp5dI7JG`{fzg&!49E$5l%CC|kk(!rZ4;PIlXaDvrxsOqa;$ zH2ykX!5*%f#t_F4p^k2*`e4-L+;pqifx2;!OCTV?*na+3 z6!xHHA!jZ&adz|5{jvLmmVa~%%^~Du`RNZ^sWhjx$b+yea7=8MQ^&heA?qWM2kjCW(khx?%D&Q=o4r}hV z;j|FbMiiDaj_fBRo;n0wnuS!Q@$jy0Yi3qHlS*=2Wm_yYF0-zmv_7N_L@tt_2J&#N z?GimaomEmH&swI92C(i&^a%5u$s3QGH&4atr8*yAInFve2X;|40SsZr;^i;JE^vYuq`@X9ic0eVF(L6mlVj@9xvew zC-4^nNv=gSuB=r<>~_0O9dJE7Pm>cD7=tJR@?th~>>37eVR`xgphV4D>m?xi#O1=lUKQbE| z8(-jf5dQc>Z|?TsecN2cf4mDSI>BS7#wlbp9DcmmQesv>#DC~PeK>r20*)`eu!p`5 zzu>SGt1c82HhQ~|r>*IQKPR4c#+Uw`t(BDwm(_k4&8r<^{B}-9SJpR6t~(!|JZ{ga z^d62OO7Wg^X)s(|+jBdqu4`w)-$_XjkRJZ}`BgVHsnuEJa8~4+L-r*#7?{PVAeQrn zYlr<;tdcu3wH6@2^yX2wBsN;9q*dkt6JOrJ+zC(8JaWlDYT2D9y7`*TrTQ z;fvp`W|iy%E$3F=i@n>p@k1-4i7drKX#vCXxH|^)@9UMalhyV)Pd;{s-EXeb#g78P z=ro731#%r2okm#XGb(xRyE!8(Nai(amJmiy*6d8XFLt#4X{aj&rdv%>NwbxXon~iS zbVk8K-{KKwFkMbq7ThN2&&Gu3@J6i$A2++Au$m)?vrEG@I@;Q?%Ve0($x`NZUO;VN~fqDby@xRc^ai~GO;M)PS0&%sa$#GBIgA>{_g`SuS#&kEPg za-64?ANFRm!OOKTwCU{xzXJRIZ;vOB%TBxP7oLMfyLF#F{9M#1GSAQB%iBrjv04Hi z8+lor8!Jv!&Dij!`SA;8&09R*c~ovaSeNsKZ=JU>^ZeC340l}??V=<)x*i&C7%d)? zbmVDGvI}tQ`bg)H|Dtd|TFs^1SulDrM3+xUV$)kZ-f~#9a`naRiLas6WBM!=w`>ol zPFbg1+wvr6UXG259?n)gEm*dW4Psd|-`#gW>XzE&zy=ccO@&I2=KAR*N*NN* z*$VaNNMc89_JIM$^ zY-I7ajU#FqiKi1A*2^&}H7D$|evzRL;gJ4MY=v=LhgqEg8rPSnldDQe^IVB>i=_gx zWu+x<$m6>C!98pd`;7R*+0q@nOqJx&B>sx#M6SaVMgWttx$1X*3Ou`^tCjn03!~Jp ztKJBnX`a;u=kd_}088u3gh|TZBN+K~L+hF&zk7@%LfdD*m*S$jq!1WI+8n3fIh{$r z-YQf!bfI@Zv*aj(y3pG7?;UJ8*0Qj%;QDyk!_#usos{PJd`C?47wUmF$|T0nt_7BR zf)|s$lV3`QolCE~IHU78>6^9liqqZtd52$7;l3nb49zdrkML+cuDAxgfDX39x6U*A zfLP6O39T-uqxTA*wwcqD6{mS+p3Ak;_Orc&DlKA@e_DoECAHEA@30hh5T=vYuDkMl zUB@3)r<1NuT1{cuxK&I42CdPgsIX{SBvz|wZV=jp({M6N_~xkfddjX*15%5GCov=K zVtviDKte!|_WPWorTuh>{lgHQDO%@Brp0*7^`r^1=g$?y&F;{D>2TnX#PPIY zIQ@P;d~epk`EI@EG?z}T7TJE~QpFiwQ8@ji6VL?cw{*b}(URf1v9xBlW>nxEz-f>7@4j zurkU@8(sDqQ#e{rN8&ncC-7R%g|_5!4Hx3Th+Gt7*#c5V3|_^fm6d*K<|;Q7EQIp* zNApLaXGjoC+Lqg!8FgE8#sfHkg_D*WkIxvIMsvbm#a2E{=-=DwR;+I>V;!bR8#LSO zGL=dZbj~;bVDWr4*9rJ~c4^UwIU$iE%Ia~yFGd-g4GzS2O4J3gZ<*xs3|KuHmuiVcG8k89&;TQtJTlue-<@r_L*=FI*z)u9t-Iu z(BTb;v^CrH1RWXoAI()HDzUh6zVsGBQ!A_J$^K|(=^h~-?s&$#W}INGCfO>+pcdA}j; z@m&luerpob5h!mAghT&uf8jCm+p4H2_ZeqzTJZ|lGRno6@QrvXckKA?;W&raM`gW2 zB4PIO5ma#oO4%LPD0|-Z;G-c33D3{%~p@C)o_btyT{{Hnj2a!$R+<$2>SHCAqfZ2w_uQuM^gc zzER@2y4gA1qag1t6v*{h&AR=o#yB6`jH`!IQ;w(?UCU1VI}KOSlz8qYBARKQ-rnA@&vE#Qi0JKto2`*^u|;g?p* zbUMONPE z;<(;LTf%7hVq`e(I?-{rkvFnfdb53_#YO&%{igHlb61oUe)&raD++ie&h#9eUL6TQ z?h}l(;u#$+=1I`8EO*jer$^U3sZ>SbYhX@Nvpl8V?+vC))Vd0&RDO z4yH>E@I77@q-no{#^ndz&eKgYBn!wpX@7@3T4Kd1+e9NnMy?gb=|>Fjf$ak)rvTprpP zD#YPUps;hvr8E=d+H?-7#?al?uQZ4pI2^cf79=S6$!veP;jvn*5Z>BhlEYIY{?xdv zb_t(ELi~3|6Q74wNfjZcK)cf035rgpAYd{^}Jtd41jG=;1zWx$Nm_^IN(H z&sKjojpO7oxKk!>)8(Y&hv2tHhdG11_Y#sE7s;N@_xE%!D^dcIF7AuBT4}Z(%B0kH z3&AgBIE1e5FAze0F3$amm95fpxE`a=hDcwxR^L_$6zOae{dv+GIdL-`MT?u7o=mkL zzRS469N*mXDNW(=ev$KAy&U*tVZ^#GjwgvcK$*J?qc9 z-)K2c+3O^LD)ge3N$b`1pr@3iqMtMzzLS;wXB)VH3l=p?HqiBrKvvi3 zJ+G75{`J#1ff@Gm2F+JN=$(fXbdCC#QBnbK*`ia}Y`2p=*G{zX<8W=@dYoWo-9h^h zteF%5Ytt!FSKR6m#}}v7IKg`F+Yy;+>E5Gp)AZOsYt`mo`xGU`gW5gXIaqteBVu$= zQYVSBM(^Q%N(kc@*zQwhpnur<9CP%G^Ddj-sBXytay)-95u7D9cGs*lKa!v|rMH93 zXh^fyEcH-G=ciVbb2P7H5iLo#tp7lJB1QKw4^oNPiK{Xv9!gu+=yVn-JnIt9XTLZu z-p%0Sy7XE=j&T|T%0Amkj2Vb7I!c(o$X@?@EraG7FgHq<8dDwSe|5+%8a&a0{;hSt z(9~hce#Yu18f1@}&7O)xElb?$_FgVl-}Zc^=7D2ptvM8ylraB8XC7I;4SO^*I*ey` zb>*kT_Zn$1o|}21@L7q@e_UxsO*skon}&T1eX()c)6I%rntRVss^cjh2iMEE=>*kJ zh~qxJ&1hOIHMN+s%2bMr+hy>=yp*$byMya>)FyJmWAKIwKktF;AUXF&7^7b7qOwWa+vyO^ea>&td%4_;pGyj{Vsqw|f!m zY~jPK5{r|eboW$GxoF8GTl5&&&8y-tRr$qCDjg7&PDCUunRI?a^oPrEe6~*0!%9%d zIk-p4r1wTowe#!BY8LN5=ym3iFH1W59g+15G4NE4Pe(^k_F&i z@kYlWMhmrme5F04ASd@S@I%x%qR6*R)sTczr*M-u!Q|AXpS)bLK;`+!K|)D7=Dl)J zj67Vhi42MXY3p^OVXM+7?NB)$ToySI1%B-k1sf8x{Ak`eZTqOFzCb%|KV|*b+U-7$m;)cP5o<(6@e5j;>OvFLLkvc>vyM>`fu~PgUcT zIv+@&`d!kJA|P@y4cV22UtTLyfn<9{B_+eW#L_HE!g2?yoR2Iy)p-3b&1ohBoK^XQ zH$JaT1N{sTVkM@p_((<01Pj1t6-83&peBMplN*jJ>c#UqYNAv5PcBZKyM(0dIa_qX<4B|R)hT5OgMsbN{UoAxD0V4*MRqGF-2KDrJ%5SAz#IWxJQjtSV&13M_tfg`xilVHQ{lN z{|erusz@Hri&@-_#Ee_IRwNNERh>u9KgQr>$0G;Da7Ih*G*N*~L{;}-oB0vxbgz)- zdkTKDf?Dco@fh&uRUos7l9w7gkkBrNgNBo;=X!8CbiV)WtkGCk|a>v z5(%W+G_6(@PJ7g<0th^_>fjOjoF++P_FaT4T0&|3QfS}bHL_7xRf)nh$__Sv7ysR< zimE0>l)pjMB-X$Cw_ZUSE=hJj-0@5_k(w^2?_5`PR#1wpy31=s3|vP?-}nD#>LR8! zQ5(UEmxV@hc4r;5oZ_mLc{jq}syvc+?b#<@+5dc}TCuQvc$rZXS9Q4Q)(1{t_Y;@{ zjn|&?x)E_&@04bk=V$$h>u&4g9VYME{`!^MgUypPjjq1%+qmt=ruMJ^XP_s)e$Na) z#1>UE73h*(f0kb6Pxr1D-80pv`98z^t!%uX9-W>N22#hnl}kHu;k5dkfa0kpp08pj z&ojBncio2Fj(4V*eL()gX;(m2`_{HiHONn8N)0Ob^pi_G=VDI7`J<;qK~l5V#HjkL zO<9oh;gIT;;D)PyK3{Y82mvL8*G}@15Y_m6B{+e1lh>+r#$y>}u| Ogu&C*&t;ucLK6T80F}4^ literal 0 HcmV?d00001 diff --git a/docs/notify-preview.py b/docs/notify-preview.py new file mode 100644 index 0000000..5fca4b0 --- /dev/null +++ b/docs/notify-preview.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python3 +"""Render notification layouts as a phone-width PNG mockup. + +Pushover renders the body in a proportional font, so space-padded columns do +not line up on a phone. These mockups use a proportional font on purpose so +the preview matches what the user actually sees. + +By default the cards are rendered from the real ``build_summary()`` output, so +the preview is ground truth rather than a hand-written approximation. Pass +``--mock`` to render the built-in candidate sketches instead. + +Usage: python3 docs/notify-preview.py [--mock] [out.png] +""" +import datetime +import html +import os +import subprocess +import sys +import tempfile +from collections import Counter + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +STATS = { + "total": 42, + "removed": 7, + "orphaned": 4, + "ignored": 5, + "premature": 3, + "protected": 10, + "non_protected": 20, + "runtime": "12s", +} + +EMOJI = { + "removed": "\U0001F5D1\uFE0F", + "orphaned": "\U0001F47B", + "ignored": "\u23ED\uFE0F", + "premature": "\U0001F423", + "protected": "\U0001F6E1\uFE0F", + "non_protected": "\U0001F310", +} + + +def b(text): + return f"{text}" + + +# --- candidate layouts ----------------------------------------------------- +# Each returns (title, body_html). Body uses Pushover's HTML subset. + +def current_table(s): + """Today's layout: space-padded columns.""" + rows = [ + ("Removed", s["removed"]), + ("Orphaned", s["orphaned"]), + ("Ignored", s["ignored"]), + ("Premature", s["premature"]), + ] + tail = [("Protected", s["protected"]), ("Non-protected", s["non_protected"])] + out = [f"Scanned {s['total']} torrents in {s['runtime']}", ""] + out += [f"{b(lbl)}{' ' * max(14 - len(lbl), 1)}{val:>4}" for lbl, val in rows] + out.append("") + out += [f"{b(lbl)}{' ' * max(14 - len(lbl), 1)}{val:>4}" for lbl, val in tail] + return "qbit-maid: 7 torrents removed", "\n".join(out) + + +def compact_inline(s): + """One line per group, middle-dot separated.""" + out = [ + f"Scanned {s['total']} torrents in {s['runtime']}", + "", + f"{b('Removed')} {s['removed']} \u00b7 {b('Orphaned')} {s['orphaned']}", + f"{b('Ignored')} {s['ignored']} \u00b7 {b('Premature')} {s['premature']}", + "", + f"{b('Protected')} {s['protected']} \u00b7 {b('Non-protected')} {s['non_protected']}", + ] + return "qbit-maid: 7 torrents removed", "\n".join(out) + + +def emoji_rows(s): + """Emoji-led rows, no padding.""" + out = [f"Scanned {s['total']} torrents in {s['runtime']}", ""] + for key, label in (("removed", "Removed"), ("orphaned", "Orphaned"), + ("ignored", "Ignored"), ("premature", "Premature")): + out.append(f"{EMOJI[key]} {b(label)} {s[key]}") + out.append("") + for key, label in (("protected", "Protected"), ("non_protected", "Non-protected")): + out.append(f"{EMOJI[key]} {b(label)} {s[key]}") + return "qbit-maid: 7 torrents removed", "\n".join(out) + + +def hero_line(s): + """Actionable numbers up front, everything else compact below.""" + out = [ + f"{b(str(s['removed']))} removed \u00b7 {b(str(s['orphaned']))} orphaned", + f"{s['total']} torrents scanned in {s['runtime']}", + "", + f"Ignored {s['ignored']} \u00b7 Premature {s['premature']}", + f"Protected {s['protected']} \u00b7 Non-protected {s['non_protected']}", + ] + return "qbit-maid: 7 torrents removed", "\n".join(out) + + +def emoji_inline(s): + """Compact inline, emoji instead of bold labels.""" + out = [ + f"Scanned {s['total']} torrents in {s['runtime']}", + "", + f"{EMOJI['removed']} {s['removed']} removed \u00b7 {EMOJI['orphaned']} {s['orphaned']} orphaned", + f"{EMOJI['ignored']} {s['ignored']} ignored \u00b7 {EMOJI['premature']} {s['premature']} premature", + "", + f"{EMOJI['protected']} {s['protected']} protected \u00b7 {EMOJI['non_protected']} {s['non_protected']} public", + ] + return "qbit-maid: 7 torrents removed", "\n".join(out) + + +MOCK_CANDIDATES = [ + ("A \u2014 current (padded table)", current_table), + ("B \u2014 compact inline", compact_inline), + ("C \u2014 emoji rows", emoji_rows), + ("D \u2014 hero line", hero_line), + ("E \u2014 emoji inline", emoji_inline), +] + + +class Sample: + """Minimal stand-in for the Qbt object, holding only what notifiers read.""" + + def __init__(self, **overrides): + self.config = {"pushover": {}} + self.total_torrents = STATS["total"] + self.torrent_hash_delete_list = ["a"] * STATS["removed"] + self.up_tor_counter = STATS["orphaned"] + self.ignored_counter = STATS["ignored"] + self.preme_tor_counter = STATS["premature"] + self.tracker_protected_tag = "ipt" + self.tracker_non_protected_tag = "public" + self.c = Counter({"ipt": STATS["protected"], + "public": STATS["non_protected"]}) + self.delete_torrents = True + self.st = datetime.datetime(2026, 10, 27, 9, 54, 0) + self.et = datetime.datetime(2026, 10, 27, 9, 54, 12) + for key, value in overrides.items(): + setattr(self, key, value) + + +def real_candidates(): + """Render the actual build_summary() output for each supported style.""" + from qlogging import build_summary + + out = [] + for style in ("plain", "html"): + for emoji in (False, True): + title, body = build_summary( + Sample(), style=style, use_emoji=emoji, include_hostname=False + ) + label = f"{style}" + (" + emoji" if emoji else "") + out.append((label, title, body)) + return out + + +def card(name, title, body): + body_html = "
".join(body.split("\n")) + return f""" +

+
PUSHOVER \u00b7 {html.escape(name)}
+
{html.escape(title)}
+
{body_html}
+
+ """ + + +def build_html(mock=False): + if mock: + cards = "\n".join(card(n, *fn(STATS)) for n, fn in MOCK_CANDIDATES) + else: + cards = "\n".join(card(n, t, b) for n, t, b in real_candidates()) + return f""" +
{cards}
+""" + + +def main(): + args = [a for a in sys.argv[1:] if not a.startswith("--")] + mock = "--mock" in sys.argv[1:] + out = args[0] if args else "/tmp/notify-preview.png" + workdir = tempfile.mkdtemp(prefix="notify-preview-") + page = os.path.join(workdir, "preview.html") + with open(page, "w", encoding="utf-8") as fh: + fh.write(build_html(mock=mock)) + subprocess.run([ + "docker", "run", "--rm", "-v", f"{workdir}:/w", "-w", "/w", + "--entrypoint", "google-chrome", "dgtlmoon/sockpuppetbrowser:latest", + "--headless", "--no-sandbox", "--disable-gpu", "--disable-dev-shm-usage", + "--hide-scrollbars", "--window-size=880,760", + "--screenshot=/w/preview.png", "file:///w/preview.html", + ], check=True, capture_output=True) + subprocess.run(["cp", os.path.join(workdir, "preview.png"), out], check=True) + print(out) + + +if __name__ == "__main__": + main() diff --git a/qlogging.py b/qlogging.py index 50b7c22..ae3a020 100755 --- a/qlogging.py +++ b/qlogging.py @@ -108,8 +108,10 @@ def get_script_runtime(self): # --------------------------------------------------------------------------- NOTIFY_STYLES = ("plain", "html") DEFAULT_NOTIFY_STYLE = "plain" -LABEL_WIDTH = 14 -VALUE_WIDTH = 4 +# Pushover renders the body in a proportional font, so space-padded columns +# collapse into a ragged list. Rows are therefore joined with a visible +# separator instead of being aligned with spaces. +ROW_SEPARATOR = " \u00b7 " NOTIFY_EMOJI = { "removed": "\U0001F5D1\uFE0F", @@ -211,18 +213,26 @@ def debug_torrent_list(self): self.tl.debug(self.torrent_list) -def _notify_row(label, value, style, use_emoji, key): - """Render one label/value line for the chosen style.""" - emoji = NOTIFY_EMOJI.get(key, "") if use_emoji else "" - if use_emoji: +def _stat_row(pairs, style, use_emoji): + """Render one line of ``Label value`` pairs joined by a middle dot. + + Args: + pairs: Sequence of ``(emoji_key, label, value)`` tuples. + style: ``"plain"`` or ``"html"``. + use_emoji: Prefix each pair with its emoji marker. + + Returns: + A single line of text, e.g. ``Removed 7 \u00b7 Orphaned 4``. + """ + parts = [] + for key, label, value in pairs: + emoji = NOTIFY_EMOJI.get(key, "") if use_emoji else "" prefix = f"{emoji} " if emoji else "" if style == "html": - return f"{prefix}{label}: {value}" - return f"{prefix}{label}: {value}" - if style == "html": - pad = " " * max(LABEL_WIDTH - len(label), 1) - return f"{label}{pad}{value:>{VALUE_WIDTH}}" - return f"{label:<{LABEL_WIDTH}}{value:>{VALUE_WIDTH}}" + parts.append(f"{prefix}{label} {value}") + else: + parts.append(f"{prefix}{label} {value}") + return ROW_SEPARATOR.join(parts) def build_summary(self, style=DEFAULT_NOTIFY_STYLE, use_emoji=False, @@ -230,10 +240,12 @@ def build_summary(self, style=DEFAULT_NOTIFY_STYLE, use_emoji=False, """Build the ``(title, body)`` pair used by every notifier. Result-first layout: the title states what happened, the body gives the - scanned total, the actionable counters, then the tracker split. + scanned total, the actionable counters, then the tracker split. Counters + are grouped two-per-line and separated by a middle dot, because Pushover + renders a proportional font and space-padded columns do not line up. Args: - style: ``"plain"`` for aligned text, ``"html"`` for Pushover HTML. + style: ``"plain"`` for grouped text, ``"html"`` for Pushover HTML. use_emoji: Prefix each row with an emoji marker. include_hostname: Add a ``Host:`` line above the summary. @@ -275,14 +287,19 @@ def build_summary(self, style=DEFAULT_NOTIFY_STYLE, use_emoji=False, lines.append("") removed_label = "Removed" if delete_enabled else "Would remove" - lines.append(_notify_row(removed_label, removed, style, use_emoji, "removed")) - lines.append(_notify_row("Orphaned", stats["orphaned"], style, use_emoji, "orphaned")) - lines.append(_notify_row("Ignored", stats["ignored"], style, use_emoji, "ignored")) - lines.append(_notify_row("Premature", stats["premature"], style, use_emoji, "premature")) + lines.append(_stat_row([ + ("removed", removed_label, removed), + ("orphaned", "Orphaned", stats["orphaned"]), + ], style, use_emoji)) + lines.append(_stat_row([ + ("ignored", "Ignored", stats["ignored"]), + ("premature", "Premature", stats["premature"]), + ], style, use_emoji)) lines.append("") - lines.append(_notify_row("Protected", stats["protected"], style, use_emoji, "protected")) - lines.append(_notify_row("Non-protected", stats["non_protected"], style, - use_emoji, "non_protected")) + lines.append(_stat_row([ + ("protected", "Protected", stats["protected"]), + ("non_protected", "Non-protected", stats["non_protected"]), + ], style, use_emoji)) return title, "\n".join(lines) diff --git a/test_qbitmaid.py b/test_qbitmaid.py index 97e7e46..7d04198 100755 --- a/test_qbitmaid.py +++ b/test_qbitmaid.py @@ -196,13 +196,10 @@ class TestQbitmaid(unittest.TestCase): body, "Scanned 42 torrents in 12s\n" "\n" - "Removed 7\n" - "Orphaned 4\n" - "Ignored 5\n" - "Premature 3\n" + "Removed 7 \u00b7 Orphaned 4\n" + "Ignored 5 \u00b7 Premature 3\n" "\n" - "Protected 10\n" - "Non-protected 20", + "Protected 10 \u00b7 Non-protected 20", ) def test_build_summary_plain_has_no_leading_indent(self): @@ -210,27 +207,52 @@ class TestQbitmaid(unittest.TestCase): for line in body.splitlines(): self.assertFalse(line.startswith(" "), f"unexpected indent: {line!r}") + def test_build_summary_has_no_space_padding(self): + """Pushover uses a proportional font, so padded columns never align.""" + for style in ("plain", "html"): + for emoji in (False, True): + _, body = build_summary(FakeQbt(), style=style, use_emoji=emoji) + for line in body.splitlines(): + stripped = line.replace(" \u00b7 ", "") + self.assertNotIn(" ", stripped, + f"padded column in {style}/{emoji}: {line!r}") + + def test_build_summary_groups_two_counters_per_line(self): + _, body = build_summary(FakeQbt(), style="plain") + rows = [ln for ln in body.splitlines() if "\u00b7" in ln] + self.assertEqual(len(rows), 3) + for row in rows: + self.assertEqual(row.count("\u00b7"), 1, row) + def test_build_summary_html(self): title, body = build_summary(FakeQbt(), style="html") self.assertEqual(title, "qbit-maid: 7 torrents removed") self.assertIn("Scanned 42 torrents in 12s", body) - self.assertIn("Removed", body) - self.assertIn("Non-protected", body) + self.assertIn("Removed 7", body) + self.assertIn("Non-protected 20", body) self.assertNotIn("---", title) def test_build_summary_emoji(self): _, plain = build_summary(FakeQbt(), style="plain", use_emoji=True) - self.assertIn("\U0001F5D1\uFE0F Removed: 7", plain) - self.assertIn("\U0001F47B Orphaned: 4", plain) + self.assertIn("\U0001F5D1\uFE0F Removed 7", plain) + self.assertIn("\U0001F47B Orphaned 4", plain) _, html = build_summary(FakeQbt(), style="html", use_emoji=True) - self.assertIn("\U0001F5D1\uFE0F Removed: 7", html) + self.assertIn("\U0001F5D1\uFE0F Removed 7", html) def test_build_summary_delete_disabled(self): title, body = build_summary(FakeQbt(delete_torrents=False)) self.assertEqual(title, "qbit-maid: 7 torrents would be removed") - self.assertIn("Would remove", body) + self.assertIn("Would remove 7", body) self.assertNotIn("Removed", body) + def test_build_summary_does_not_repeat_title_in_body(self): + """The title already states the outcome; the body must not restate it.""" + title, body = build_summary(FakeQbt(), style="plain") + self.assertNotIn("7 removed", body) + self.assertNotIn("torrents removed", body) + self.assertIn("Removed 7", body) + self.assertTrue(title.endswith("7 torrents removed")) + def test_build_summary_nothing_to_do(self): title, _ = build_summary(FakeQbt(torrent_hash_delete_list=[], up_tor_counter=0)) self.assertEqual(title, "qbit-maid: nothing removed") -- 2.54.0 From dfce115fd81115aee65c12bc6014febff52af27b Mon Sep 17 00:00:00 2001 From: nanobot Date: Tue, 3 Nov 2026 15:10:03 -0600 Subject: [PATCH 2/2] feat(notify): value-first emoji rows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch the summary to the layout jblu picked: each counter renders as "emoji value label", grouped two per line and joined by a middle dot. Scanned 42 torrents in 12s 🗑️ 7 removed · 👻 4 orphaned ⏭️ 5 ignored · 🐣 3 premature 🛡️ 10 protected · 🌐 20 public - the value leads, so the numbers are the first thing the eye lands on - html style now bolds the values instead of the labels - "Non-protected" reads as "public", matching the non_protected_tag - use_emoji now defaults to true; false gives the plain variant - dry runs read "7 would be removed" --- README.md | 29 +++++++++-------- config.toml.example | 9 +++--- docs/notify-preview.png | Bin 57488 -> 54281 bytes qlogging.py | 35 ++++++++++++--------- test_qbitmaid.py | 68 +++++++++++++++++++++++++++++----------- 5 files changed, 90 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 220c2f5..66d8182 100755 --- a/README.md +++ b/README.md @@ -137,35 +137,38 @@ Pushover and Apprise share one summary builder, so both report the same numbers. The title states the outcome, the body gives the scanned total, the actionable counters, then the tracker split. -`format = "plain"` (default) produces a compact, grouped summary: +The default summary looks like this: ``` qbit-maid: 7 torrents removed Scanned 42 torrents in 12s -Removed 7 · Orphaned 4 -Ignored 5 · Premature 3 +🗑️ 7 removed · 👻 4 orphaned +⏭️ 5 ignored · 🐣 3 premature -Protected 10 · Non-protected 20 +🛡️ 10 protected · 🌐 20 public ``` -Counters are grouped two per line and joined with a middle dot rather than -padded into columns. Pushover renders the body in a proportional font, so -space-padded columns collapse into a ragged list on a phone — the separator -survives any font. +Each counter is `emoji value label`, grouped two per line and joined with a +middle dot. The value leads so the numbers are the first thing the eye lands +on, and the separator survives any font — Pushover renders the body in a +proportional font, so space-padded columns collapse into a ragged list on a +phone. -`format = "html"` bolds the labels using Pushover's HTML subset (`html=1` is +`format = "html"` bolds the values using Pushover's HTML subset (`html=1` is set automatically). Apprise has no HTML support, so it always receives the plain body. -Setting `use_emoji = true` prefixes each counter with an emoji marker: +`use_emoji` defaults to `true`. Set it to `false` for a plain-text variant: ``` -🗑️ Removed 7 · 👻 Orphaned 4 -⏭️ Ignored 5 · 🐣 Premature 3 +Scanned 42 torrents in 12s -🛡️ Protected 10 · 🌐 Non-protected 20 +7 removed · 4 orphaned +5 ignored · 3 premature + +10 protected · 20 public ``` To preview the result without sending a push, render the real diff --git a/config.toml.example b/config.toml.example index a1a7df9..0a4c750 100755 --- a/config.toml.example +++ b/config.toml.example @@ -26,11 +26,12 @@ use_pushover = false po_key = "" po_token = "" # Notification formatting -# format: "plain" (grouped text) or "html" (bold labels, Pushover HTML) -# Counters are grouped two per line and joined with a middle dot, because -# Pushover uses a proportional font and padded columns do not align. +# format: "plain" (grouped text) or "html" (bold values, Pushover HTML) +# Counters render as "emoji value label", grouped two per line and joined +# with a middle dot, because Pushover uses a proportional font and padded +# columns do not align. format = "plain" -use_emoji = false +use_emoji = true include_hostname = false notify_on_empty = true # Optional: -2..2. Priority 2 also needs retry/expire (defaults shown). diff --git a/docs/notify-preview.png b/docs/notify-preview.png index b5f2d48a6d90d7af8f6f601ef0eabe8ddd2c6115..1b22aeb20c2a39c02688d6a25cd740289dd705ba 100644 GIT binary patch literal 54281 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 CO>cex literal 57488 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 Ogu&C*&t;ucLK6T80F}4^ diff --git a/qlogging.py b/qlogging.py index ae3a020..e461876 100755 --- a/qlogging.py +++ b/qlogging.py @@ -155,7 +155,7 @@ def get_notify_options(self): priority = po.get("priority") return { "style": style, - "use_emoji": bool(po.get("use_emoji", False)), + "use_emoji": bool(po.get("use_emoji", True)), "include_hostname": bool(po.get("include_hostname", False)), "notify_on_empty": bool(po.get("notify_on_empty", True)), "priority": None if priority is None else int(priority), @@ -214,7 +214,10 @@ def debug_torrent_list(self): def _stat_row(pairs, style, use_emoji): - """Render one line of ``Label value`` pairs joined by a middle dot. + """Render one line of ``emoji value label`` pairs joined by a middle dot. + + The value leads and the label trails, so the numbers are the first thing + the eye lands on even though the font is proportional. Args: pairs: Sequence of ``(emoji_key, label, value)`` tuples. @@ -222,31 +225,33 @@ def _stat_row(pairs, style, use_emoji): use_emoji: Prefix each pair with its emoji marker. Returns: - A single line of text, e.g. ``Removed 7 \u00b7 Orphaned 4``. + A single line of text, e.g. + ``\U0001F5D1\uFE0F 7 removed \u00b7 \U0001F47B 4 orphaned``. """ parts = [] for key, label, value in pairs: emoji = NOTIFY_EMOJI.get(key, "") if use_emoji else "" prefix = f"{emoji} " if emoji else "" if style == "html": - parts.append(f"{prefix}{label} {value}") + parts.append(f"{prefix}{value} {label}") else: - parts.append(f"{prefix}{label} {value}") + parts.append(f"{prefix}{value} {label}") return ROW_SEPARATOR.join(parts) -def build_summary(self, style=DEFAULT_NOTIFY_STYLE, use_emoji=False, +def build_summary(self, style=DEFAULT_NOTIFY_STYLE, use_emoji=True, include_hostname=False): """Build the ``(title, body)`` pair used by every notifier. Result-first layout: the title states what happened, the body gives the scanned total, the actionable counters, then the tracker split. Counters - are grouped two-per-line and separated by a middle dot, because Pushover - renders a proportional font and space-padded columns do not line up. + are grouped two-per-line as ``emoji value label`` and separated by a middle + dot, because Pushover renders a proportional font and space-padded columns + do not line up. Args: style: ``"plain"`` for grouped text, ``"html"`` for Pushover HTML. - use_emoji: Prefix each row with an emoji marker. + use_emoji: Prefix each counter with an emoji marker. include_hostname: Add a ``Host:`` line above the summary. Returns: @@ -286,19 +291,19 @@ def build_summary(self, style=DEFAULT_NOTIFY_STYLE, use_emoji=False, lines.append(f"Scanned {total} {scanned_noun} in {stats['runtime']}") lines.append("") - removed_label = "Removed" if delete_enabled else "Would remove" + removed_label = "removed" if delete_enabled else "would be removed" lines.append(_stat_row([ ("removed", removed_label, removed), - ("orphaned", "Orphaned", stats["orphaned"]), + ("orphaned", "orphaned", stats["orphaned"]), ], style, use_emoji)) lines.append(_stat_row([ - ("ignored", "Ignored", stats["ignored"]), - ("premature", "Premature", stats["premature"]), + ("ignored", "ignored", stats["ignored"]), + ("premature", "premature", stats["premature"]), ], style, use_emoji)) lines.append("") lines.append(_stat_row([ - ("protected", "Protected", stats["protected"]), - ("non_protected", "Non-protected", stats["non_protected"]), + ("protected", "protected", stats["protected"]), + ("non_protected", "public", stats["non_protected"]), ], style, use_emoji)) return title, "\n".join(lines) diff --git a/test_qbitmaid.py b/test_qbitmaid.py index 7d04198..92a2c6f 100755 --- a/test_qbitmaid.py +++ b/test_qbitmaid.py @@ -190,16 +190,28 @@ class TestQbitmaid(unittest.TestCase): self.assertEqual(stats["runtime"], "unknown") def test_build_summary_plain(self): - title, body = build_summary(FakeQbt(), style="plain") + title, body = build_summary(FakeQbt(), style="plain", use_emoji=False) self.assertEqual(title, "qbit-maid: 7 torrents removed") self.assertEqual( body, "Scanned 42 torrents in 12s\n" "\n" - "Removed 7 \u00b7 Orphaned 4\n" - "Ignored 5 \u00b7 Premature 3\n" + "7 removed \u00b7 4 orphaned\n" + "5 ignored \u00b7 3 premature\n" "\n" - "Protected 10 \u00b7 Non-protected 20", + "10 protected \u00b7 20 public", + ) + + def test_build_summary_plain_emoji(self): + _, body = build_summary(FakeQbt(), style="plain", use_emoji=True) + self.assertEqual( + body, + "Scanned 42 torrents in 12s\n" + "\n" + "\U0001F5D1\uFE0F 7 removed \u00b7 \U0001F47B 4 orphaned\n" + "\u23ED\uFE0F 5 ignored \u00b7 \U0001F423 3 premature\n" + "\n" + "\U0001F6E1\uFE0F 10 protected \u00b7 \U0001F310 20 public", ) def test_build_summary_plain_has_no_leading_indent(self): @@ -224,33 +236,47 @@ class TestQbitmaid(unittest.TestCase): for row in rows: self.assertEqual(row.count("\u00b7"), 1, row) + def test_build_summary_value_leads_label(self): + """The number comes first so it is the first thing the eye lands on.""" + _, body = build_summary(FakeQbt(), style="plain", use_emoji=False) + self.assertIn("7 removed", body) + self.assertIn("20 public", body) + self.assertNotIn("Removed 7", body) + self.assertNotIn("Non-protected", body) + def test_build_summary_html(self): title, body = build_summary(FakeQbt(), style="html") self.assertEqual(title, "qbit-maid: 7 torrents removed") self.assertIn("Scanned 42 torrents in 12s", body) - self.assertIn("Removed 7", body) - self.assertIn("Non-protected 20", body) + self.assertIn("7 removed", body) + self.assertIn("20 public", body) self.assertNotIn("---", title) def test_build_summary_emoji(self): _, plain = build_summary(FakeQbt(), style="plain", use_emoji=True) - self.assertIn("\U0001F5D1\uFE0F Removed 7", plain) - self.assertIn("\U0001F47B Orphaned 4", plain) + self.assertIn("\U0001F5D1\uFE0F 7 removed", plain) + self.assertIn("\U0001F47B 4 orphaned", plain) _, html = build_summary(FakeQbt(), style="html", use_emoji=True) - self.assertIn("\U0001F5D1\uFE0F Removed 7", html) + self.assertIn("\U0001F5D1\uFE0F 7 removed", html) + + def test_build_summary_emoji_off_has_no_emoji(self): + _, body = build_summary(FakeQbt(), style="plain", use_emoji=False) + for marker in ("\U0001F5D1", "\U0001F47B", "\u23ED", "\U0001F423", + "\U0001F6E1", "\U0001F310"): + self.assertNotIn(marker, body) def test_build_summary_delete_disabled(self): title, body = build_summary(FakeQbt(delete_torrents=False)) self.assertEqual(title, "qbit-maid: 7 torrents would be removed") - self.assertIn("Would remove 7", body) - self.assertNotIn("Removed", body) - - def test_build_summary_does_not_repeat_title_in_body(self): - """The title already states the outcome; the body must not restate it.""" - title, body = build_summary(FakeQbt(), style="plain") + self.assertIn("7 would be removed", body) self.assertNotIn("7 removed", body) + + def test_build_summary_body_does_not_repeat_title_phrase(self): + """The title carries the outcome; the body must not restate it verbatim.""" + title, body = build_summary(FakeQbt(), style="plain", use_emoji=False) self.assertNotIn("torrents removed", body) - self.assertIn("Removed 7", body) + self.assertNotIn("torrents would be removed", body) + self.assertIn("7 removed", body) self.assertTrue(title.endswith("7 torrents removed")) def test_build_summary_nothing_to_do(self): @@ -276,16 +302,20 @@ class TestQbitmaid(unittest.TestCase): def test_get_notify_options_defaults(self): opts = get_notify_options(FakeQbt()) self.assertEqual(opts["style"], "plain") - self.assertFalse(opts["use_emoji"]) + self.assertTrue(opts["use_emoji"]) self.assertFalse(opts["include_hostname"]) self.assertTrue(opts["notify_on_empty"]) self.assertIsNone(opts["priority"]) self.assertIsNone(opts["sound"]) + def test_get_notify_options_emoji_can_be_disabled(self): + opts = get_notify_options(FakeQbt(config={"pushover": {"use_emoji": False}})) + self.assertFalse(opts["use_emoji"]) + def test_get_notify_options_overrides(self): fake = FakeQbt(config={"pushover": { "format": "HTML", - "use_emoji": True, + "use_emoji": False, "include_hostname": True, "notify_on_empty": False, "priority": 2, @@ -295,7 +325,7 @@ class TestQbitmaid(unittest.TestCase): }}) opts = get_notify_options(fake) self.assertEqual(opts["style"], "html") - self.assertTrue(opts["use_emoji"]) + self.assertFalse(opts["use_emoji"]) self.assertTrue(opts["include_hostname"]) self.assertFalse(opts["notify_on_empty"]) self.assertEqual(opts["priority"], 2) -- 2.54.0