From 6c3180e4789c3ed0530716f4baafd768207391cd Mon Sep 17 00:00:00 2001 From: Lukas Date: Sat, 26 Nov 2022 01:48:28 +0100 Subject: [PATCH] Add option for sagetex `sage` aims to be an alternative to commercial programs such as Maple, Matlab, and Mathematica. `sagetex` is a package to include sage commands/expressions in TeX documents and doing calculations/plotting thereby. Using `sagetex` requires run `tex -> sage -> tex`. As this workflow is pretty similar to the one of biber/makeglossaries, we can implement it quite the same way. So this just checks if `sage` should be run (file with ext = `sage` found in `filelist` has changed) and if so, run `sage`. --- README.md | 4 +++- doc/cluttex.pdf | Bin 193671 -> 193698 bytes doc/cluttex.tex | 2 ++ src/cluttex.lua | 21 +++++++++++++++++++++ src/texrunner/handleoption.lua | 10 ++++++++++ src/texrunner/reruncheck.lua | 2 ++ 6 files changed, 38 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 80acb12..d66e99e 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Features * With pTeX-like engines, automatically run dvipdfmx to produce PDF file. * Automatically re-run (La)TeX to resolve cross-references and other things. * Watch input files for change (requires an external program). \[`--watch` option\] -* Support for MakeIndex, BibTeX, Biber, makeglossaries commands. \[`--makeindex`, `--bibtex`, `--biber`, `--makeglossaries` options\] +* Support for MakeIndex, BibTeX, Biber, makeglossaries, sagetex commands. \[`--makeindex`, `--bibtex`, `--biber`, `--makeglossaries`, `--sagetex` options\] Usage ----- @@ -107,6 +107,8 @@ Options to run auxiliary programs: Use Biber program to produce `.bbl` file from `.bcf` file. * `--makeglossaries[=COMMAND]` Use makeglossaries program to produce `.gls` file from `.glo` file. +* `--sagetex[=COMMAND]` + Use sagetex program to produce `.sout` and `.scmd` file from `.sage` file. TeX-compatible options: diff --git a/doc/cluttex.pdf b/doc/cluttex.pdf index 2d49565b10d38886f9417755910897fef2052e1a..e71f28b4d78243b935c5135d5828208b6e678d4a 100644 GIT binary patch delta 14097 zcmaibQ*?w-$a1X3|0dh8TFXG+>+@ zGU^YK((L;0g4|3e%WK`XzcNtQDm*mSH>4^Jf8Z-BZLrqi^0q#GIyt}BpHUf(G07w@ zE2@t@Sur_T|AF%TA}OyQyzf*u-36E%5@BO#Ax)~Q?Hsu=SaXMSD^pJU6BxqJ(IG)|hj4O?DWeNu#mLbw%h z{OokN2mm;@2&IEC0LkDbk)SdF1;7F{39tfYHpxsyiEHx7f(c8W-Ko)rBgeYA>UjBU zYUmh|_xxc~u+EV_@hisVe}~2tBdUKLBEc<3f)HZM;GDG3Jdx2@`N9kpj=#hwNmXTj zZ}=V~GD}SurXSH3-dTMpU_PU@T9`yA$(oQ;q3Z5#-7++kzQc|GP!5LR!&22MoP`Cp zAt=X#^^HW5U!1VE9gb8Jc;(jG4RFvbe@BYZ*Tp zdy$1313M!47%?1KwiaC29X~F5$6k0U`o(}Ft&ShN zV~eHzDkiU%@(t(jmZ{9oKYru>y0YA4AkDj#>jyu|`VK<_ANi{gbo4iI115ZcY~y~_ znBGCUVnEN7)S7vw`*`@O9uk2Ctd3zp3v~dGbH@Jb?`{|9;qee9L#%EB-onw`&E3_) z#Nofl$c>m4PhQq2~CzjlqQ3 zBA+PlTB)trO68N^{fjm}cnh4W z`bF6KMYyM{mTi-4TbU_&wb~AW<0d|H*yar~rY!TJW&^5BAO*I7BTCc9MuS;>1kzdI z$v_>+=4Qimse;(=7)2I!RG)aT6$nQQ1u?~!N1oTfys^WXHuv<=;h*$`0vTcyAh| zN&~-ehVTYA|8_7xdOG6>xU!BFZ@Kvnq@vY-h=QSXTByRv4uLGygW_I#K#50} zQR8Uvx%*jg*#KdSrj(Y|_s%l+3#vICXh=81T>qhjxYF#ZTbXKW?XevRFd}mzl(733 z9m{Xf_iUT9mLa^n$&UZV7pM-GX_cJ&Qr8B&1!aU1EHM|S_8R!%@B6!;fA+Kn`mViY z6W<0`@i()JA3Nj1UMbY@-3@;v3(7z+s(Ps5@Jz@)NBkjW8uDm=kyDCs6 zW|!b4-0jCe7BmtLev~}Pzq;ApUmh90``e>F)Im{yDyVg;{jju{0mkDY>D!jMX)TXJ zEeaqw|7BM%O|PJjb~5AhUM&3AMJpm)mFQawOUa4Kqx9#$gY*hd zf;zMXp^#St4(bR5g0Zl~xt`@N$C1k1piAkR{mMr%*C{#X^Cy^>Ri#)(n>MHPe@WEu z$>hZ@bMy8+ktKD=j{FX`AMm*}ZnwU12@U9PC>{cj4%oqh0qV;S?iJo*LKzX9K9*J1 z!tW^jo7rUlS43hJAEYtQ+=4{wNqq%uK{{o;%>z0Spr?d>{&qmTa{QY&XWNJ)BSX`L zyvfSyy7s0lkIhIr3CZ@EG2V)9f5Xn8n5U!^XP7(>w$;Y}D^wihaXJ2l ziiu8*2#FfLje z6T_y5(_g?9Py?$2^bFqmYA}`kJ6JP3(R=ecz|E8^@cMSG#-jj|BT4zZbEug2|MDGj z7>0yZhJi)*uLi4_oV9tbNZ6?~vA#LNwN&B>?@eU-)GRi|Xg6RrAmQxu(BLn$_S<@O zc6?&)FK0aF~%&=+8w_do>%fTIVn{ZGe2tI^hTTjaqExT(7>W)IOYZ~$4ru>jqU zRbmGd;hp$iV2`9t&%@>> z_8PNT_UkUgTN}R(iZ6$Jwp-Muhl?c&crXn~6Z;pgdsvKMBSlNvTD~lJaC%vZRs9`B z@Sw?Xog=6E$VwyS!NtmN>n46H+yez{nkt(==$=h^K;b=WDWoz{TV9+n0M>_mYV~&w zE2CuHzY(?L6EGiZOjGzzLF@u(eKuEJ8Zn8uaEWk-yQX>!$`No*c5g99FIvwABo&6I ztKNPAP34__miahQU#2!!6C-J%03+x9yE4la9@}tgfR&$eU-deUrJ0C$G?086go+sx z;ML|=4$2hDNBX_628L|YvUH>LtjF0_)#H~zN=VE|a#4f+_9;_UZSaVisKCYy3Va#6xvE}Y&RCXSG2QaNv_6V zUU}8L$Kq-~Ev8%q@`ZZ03rM}Yy>gE;Szdq1Z~V-Wv^PJMwQ;3LRPDWtAqW$ppi=APiywxBS#HI_(CH1R!#QSZ>8(R%<2E zC2YU8Gz`Ccelv1fGP%?NKqGazr~BDOo~29QS&r7&CU26Fbe6T<88 zY>VJ^EasNNk*=5#*ESJdHEsE5fEing=B3)^x`ALkc<%fc%$bScL$yO7|3px&$Miji zBGu&apSEIwl7igofaAkY*;N+^asdwkzdYQwcodV-Ozm0T98foTaTih1L{}xWR&RtA zh^otLB_J3MrI6aGC0w=Ino7nOgnSu2=B@QL;rgktZ-3d{gtt%``y+Vc-Z|f%A;8qZ znh2mm2GNuB`v7^|PekDMr8z0`%O%AnLq0KCn{4VDo(K z1ADi`X(1CSn@>_4Zj4jV(5pA~$Tq`^4{Ao*A}YfhF8MN0%!NnrB#|NLF7Vf-&fOrpQ^lYkPVt6 z`Tai}VS-PkpbXF)g}Qw?lcw_dx|(6LP_{JV&V5+wG@6{tOwmxR`DRnE`*dKp99}Yx zbW|_iz-jbBh{z<^)L&D*7N2xB8Ua@mOR>$zIf5V+5mJySG8V9Y?JO_2K$W$5$hK~WVx^3$*E;s^}IvvJ0y%OoDOFW_c6b} zSmSGJ>h7Jhrs_AGEoa2{wbz@2j&j+B@0u!45eciTj)+=EqHPz>ifuxl+rt znW?yX@TRQFNy@gW$~7Z4xPNc_OG4!=AdZdQC_88g zx+9T-cK^8;%|Lic9pQt(eJ%^)aDl$=d}Ao{^5JN>#TTf(OHjm*L(E!aJ|=te-hL^( z<>GpVQ^|^v<{8X@BHD%TKyE`Z==e9PW9{0X({AxYmH4ISCVuUQ7#m@z?7hbQ(m(UI z(Q##*@G?SS$v`XxymECGo1a)gE(LX$BUcY{R30%J`3Qh)A(X9zvG6cWtHWp7X z6bbi{`(P8zbx8haqyQ{pj66U7`PxxpJf;XZc{|AWie{dU zo}q0-q24DJ(}qXQ@MbV{W2eM)UlOG+A>Ku;=>o+X5f@CPWkaz}ia-^B2JmBD#`#oh z9~Q&+swA5RS2g0|NOFTIJH4z7MftV4;YLLlt4vZ;^V@P(9}^8w-8?}m6!%eu(yI9Y z4A;)41r?&wLh!P1{;!K~(bjX?;QC)pL{zW#Mx(+y6=$|da*&Bxx!^O0lAUa>k^GG) zqX_zZCyHKLc3<$^k|S4J>hKdtzquXWp9ih}$fKg&3!TNjz@tVS24qSCer8ZM4cmGi zy#@SU_*b7CHgS_TEzBI?bI*qeVREJ4W7>7rIx5QArwi0B)SlCuief0z*#Y7;0pSX zWt}FLeCBp)v>w)4$J%RO_no05-ByFQAr1|Jf4OcJ$nRzyp%&x4>G*C&tX4N=%lkrC zx*gV@2U-IGflwJo3w7tbQQcj<&-a!P41)%TytKs2?NiAf4 zQsUqO2-}7h)Tm~m$jyR=x%}xtRH{T6AwmH&%a=@`4*)Q18FHi~C82xi=|h7(gkB@UBdbow-{bMbncph%%4+IHGuoY^td-Lube$nlI6@GM_dc25#s z(#@T^i_+CfV~^Lad&!L#P!W{~s>|!Hkt-yLvf|7n!KeA$5y^M17vP$UP&*y^Yy7qt zC1MJUyt9rzKd0WPTj}~JP{18K7KYQ^6z5mD`ok@Q8dvlk%zRgZEYgolu8jL9re{aw z1jHgLFkcw1g08E4iH7LrdkB4`9No3P_-l_1zBnVvcaZ=Fb6{M4@k18t>%^U53A)l) zbE27Pf?o?jMnE4P_m+Q@oD5T+P z`*s8G zUMzmw?&N%Z4oE;?LL0F3gxoyREpuVDwlcT6l;FU)EO8)O$aQy5+j@2D5vdVK{z3}c z)r$D+rMdu4GF$=3ziYsUyE z8*3IMZD=XPwvvv}QqS`=f7~uZ9q|DD{IMmrC&hKdh=aoUA}BlATP({pYo~OX1G&Mc zDrrlTzK4Sd3vt6_v^+eWf0Is&(y$f@x_y{Ja-F!Uvi$^Hj}>fcc>tiU)Ojzs0$jZC zjA7?hc;(vIdY-i`p!eP{mp>j7tZoeMB7!Uq+LQ^;YG%KDiplK*LB4H^ke`93TZOPurM%ywp?;t*o%)4efK^_a!tb$GUN=mWfF*Oy5bT3~dWqPl|0D^5 zLx1yw!jLaUC?Wpxp$(MMyu`Jg+Q9c=P0)fg09VhyeUaQuEX%giMV`HBtXOeH0y2mWP`$OiP{s2te4cWJ5-1}ep-N&HwJ<{R zlvsHAXs&)O4#;j9;yxI13V7D&T$0r(ly7kmQ3{U_p|o7eN=!NMWJtR=X-nmzC9xg%%ze+Ny$>*&6fmZ!KPZnlf3wm99}7({ZT5d zWH1-YoF)8YJKv}m5RCx0tFg&4- zvWv-4d|*KTr-e0m^bB}`REm<>!HsFfA4MVkFU1k?5oi7P?Lbw`p$5*b%EuPbyZCqQim`$sCDTe` zWBgot4F91G-(9u(HvM~eFPnVPRVtyfT8NYsGrdV4l<52Vnp|EOJI(rI6*Fom1Uw#b z*vD}~-nyO}w(DZnGH3!KUZtGKTiWz3cA@lvVx_6sz%^&@4Uf(KGMZ(MMW&Tmt(lD% zyW%~JIfNCHcRDyts%3x zlcxJq(gO^p-K+WO%*8v4t@PdB^I{{A$yt>(63iI9%K3N6rR2(vy*1YKLe2|YtTLI; z1bXJQ3hV2mJ4NP@)Vqy`859}_BGPAMVG8DcR>2>}6P4W7GuPq#8LOL)C>5p3b#)$b zSR@`=1rwZ}5Io@3t=qP>3t05PHQI8~Xw=SxHpa77Xm_0pbQX~!@C(>Y24g zCkD<~bDGZug*ViG|2PWy<&26PIMopwVBP9HMWCnGEO31Y-QVCD0el`z@?0ck@KKPO zwNCn(`WbyMI(M8!^|yQrD3?HOvitAh079w~{0DY4>r5=ZGQx%|U2ezj;mi-m0>R5) zGhi1_LdgiV8R`|Jf97Qiz}&>!^Ni8Q(h!LJA@k8%*@j%_P%`E+=$a81Meaa*vt%z> zu@wT6^cGUi=>JI2rGajw8d{PHC|(u@*LzFuDK5Y~FrT0_BD? zbGb2G2<1F*>ns-bWc-for!&z&=(9~PEsZuCWG@2cz?jpB^SOCeRS0!gCb^0Owf?f~ zqS6RveR}zz8!!)rPr**y`p)3gE>|V;1SVCKueg2B@8uv|3t+;-sTbv{lQI8yy+dcM zk7NWp?;33`4gQo286PwyVpNWgSz}k<&JbHb@@Y0u=yV}%0r@gq7l)3e*ssYRyLy{k)Zk@sc zBONR2KLwa@>o2pYEh^Guq)I@YHEwkXk&ari=x-Yrm=N9!2i0auZ43VBgIm;39`{)a zVn{7q0<&1m{cH{0uc{7$z~TvrZQf)_En$x3&~L0p1KOj?*VF|qR8R-Q3C(ex5mc!c z(LLhHf%P4lJ*jMV@(ky`C%YV(qS2G2TkdiQHDYT&iSUh`u;^p_(~79kN`-|L$TVBY zkN%3L1zZXJ#qS-YjPH=KOq8?PKQ^vnYBiiPsXGaOZU{5QpdpMfpLwbOGcqrK{($)9 zNJjA72{aCf;_Q!W4G%6N5Ly$(k2y1Dw-C%X=3ILxl(GT4J-%>JK2MVBxAyulB@hFN zq(6K1I?!0}zk%l@%CO74Do?xiHNko_n)RFBNzm$ZffFYWv|$e}ZVPSWwEA*+8G9`M zv=sl@XzTpg3K{&6a9s zTKtpen$4R&7D)f0c1$@}7(Mwx8Ol6z5P>R2aXm%KHU4mG+0zMU`2)W*Xnm<@(o5al zwBAoMSRw?^@fRfcR=NfepnIeXzj>qt=Eb?x8}FR^kibB z`sxXJHuQOY1D)pAt1^F!Xf30dbAL?t0=$K^Cv7VGR~$rn*Z|zl@xWMG1I=Xep`RmD zPPO+so5CaV?2$v{`V`<)W{rfL%-r&XV8s)NT=Ii%Y=R;0Wi)N|@Od$U#g2Lx2BlwQ zc-vDQAf(Wg)nq|EU}j^hu9ikDVX}&g2JL8})O-g5=3l#>ndV}rI_bc{-hOgkVA^}U zpM_Fy1p+u(1j?HSk7XgHzf-sj?F1zGUnvgGRYf z+&3`iMVgtBB~&ZZ82aaVc7F~Pkk5CXt62n?#El;qpE7ej>^l5-cO*_Ef{Do-o*+Y# zRcE{hgR0>N)?W7GN5cIdeieLxA-Q+I*+w_~>2MgN5Uy^e8+;T+SXSpRL=CbWKpdhh zmLb9{)axLfb758~_s_qis+yj5c2mph*|OEd@l3t%+lb>s+&TR)o)@~zz*GsREeodD zr#U2|RUZ3Kxlsku*C*NwPS>79X@R_wB8KktC%0RFgsrCuW>yY+fwE-WlX<^u>bBEg zcA|7Xo65oGaR;YPwcZsq32J{Lx#qE2;Mor5b~Qz$VHg=!p0&KtgN~mE1~f@p&xBoL&X5++Eb`tm-Kl-88}NjUF=W;`bav zNFgbGQ9PbJDVJtZ_o|M32RA+@<6=>qS57w{df~2NbJx{f{^SSnz_fYFPb>(OBk>@? zy|>=S_3QQ3G1y8PG3|(nw?z!RF@Lk%Tc!9VZqN)G)2ue|&ef3_DR*{EP-*q(r&rKy zTf}S%&;A+)-1ZlV$!Fy?fo+uc@A&RkAdxKoy$}n89tJ{j{njr$IRnplL0O#EkX_}a z`%E%o(+!iVaGcEnV3*2Ro_^^8nJE%(FBjZK$j1e)#dAn0XB*XQ7uLt9Lt zo-J;@UwqR-)DO+zC^RqB90GldUPghXa}xA2MIUhnWPV(R8II&V`mEbG%%-_)HSs9g z=uI~<(JY2S?!Lfzm~9t+FN+JpfV+dIVIv&e&hcQB?<3bFAbWqmt?%7v{b zB*C>4CYM2*ufLCuqn7U&4C=#fqr=d3K``GY%ZB~}C&H9HQ^KQ$n@}L{_D4H z-c{i~C*sSf<#Ir>*dlOKhe&&&@eFpd33Lu>qf5yDi?Pq897yW)S|RF2D31g`)OQi* zwh4YsG05(c{EnbEN_w(>9P_fWY+%Ufz)0DjnD5jB4}#VHH+9puHn*_Ug$V607`O+h zj4#G(HkwHzM@cqo2j2N>Q3S7_%Z0GR=gb0}Xu1?cVb>kn)ooO&jAFCpYP0IwXYs!- z5O!2ATDCX{QXTH6UCYpwM@NJLa;YQtI>?DZ83C&EaLhdn=dBtFwdweTq2SWcaaOEv z1Hb<>)MDP67ysRpD0M(;rtmroJMj;bzHdUtW|>Qv5S6qP1)3C^SJd3(vS{2W{n4;G zM~7^!q|FF`*{h4UY{!EKwA%kK)NV3E zWVJWVPHrb*c4&ZCrb(t)kjuwH%syzZ^cuziB%K!Tz@6g!7kDG2%yEh&ZFk!5ca0n; z;0K2vIB5Q71lT%PscRdAhc*tzTAao2g@qU0been4JNg#~Epctdpke3;X$8%%AzwW9 zxksAOZ7dW#Bm=}}b-rQ63~QqHYklWZu;&|fyj+l{@lgA40Slbx>=FJ>-`dg~>v7@Y zIu4W|2&PMVx*Bi^5His>}{W_uE+DOt12K^eWX+5 ze-?olpc^`z|4dr{JzoGZ)1v~*N}zsOdx5wl8))loR0=jA%;p6J#2ryNyfn?7m%k?xJBvtWBK zr1!AueA?me>+Ulhr>E&Kh3BTO%1}vWJ#Y21dA1}%$dc$=JsOYWnhpTgT@*buaZVQH z*4_vh{rw2r@IYj+EKAzc``aA|Li*gqkntX?Ma)Y3|K_e5V}9m#ts)2V%#sF>j=2ThN#dI1_ggI(Ln z2(glelxkX#DJ<4kyj&NMJnGPulj8gA`CE4o%f?)Y2TG1l%~{?;ktghc7BzF{HFf?E zYmEJf{m)yWNi#+ND(=rKhkkoDG65V28f_Y9+|5xnzFW+l3Gs%leDDZ3ner@T0?e|W zMeSw#fxOu|27nN>AAWP=@G|FF|}#pCnJ_V#mF z{NvyUDaT>?pw=~7KW*A%QLqW~ zlCH#8I+MTUWeP`7T5dElk;(@MUfWErBLgyN@%Y{U{w+S8O!o8YqYp?yr2w!PXF9Y; zlN-u+G6UD-(V*^tCprgfOI{WZV!AL=smQU@h0NK%DvD+v4TZB67O@-H5kV=Gwo&93 z{#t^y?8qZASpN+6)`Hexad61AN+hVyN)FD;8Md;O5v3&|r;leMtuEHT`K|u!AzxnRH;RIOf)89w!4!1b~2?VelNmbMaal%(kiJd$$lR z!Pu}!1{vK@(a4t>4FenO`f};T(>bo%a(aR6XZJ(JBt5b=JpvO{-1m`rdV~<^wagxh ztyRO4pldhmLu0b;TcKZ-BWa!lg1c3*Sq}Zx$>N=I-|0F{0{LXj`j7DUzk^FK&ZiFC zGQEJ9L5cWlmX(MW@=1YK@fjzEU?|>A1s%7o5uc#4iqog^U-h?v zQhxM^|FJ57*h!i}r9vT!ehiKa7YeQnQEej&ptUyXteI@6r@HB}>_-H`jyD3eH5Gd; z!4I7!L3L%89h->FG|wN~eIvElNVdST>v3&wM!B3r9bQR)-X|9;F1zyI*JZjB$kEup zObZBvBNPqQkFQWrztNo9|J=Z}kgO?TjzqLjA%!dYZN?DN7hq$6igjHaWIf%OYl-xJ z1b$b}L(wC0ch%uPvn@V%K7!!nSd`~Ca-hX)chOI_)^987ia}O+rdy; z*h`0ArIuf$5_iyLQkzeszl48{%a_Z0Nnw!!0*gctOId*b?Y#M7) zXX3NJ|E|bV{t7})kbPcf-BY(!jEMd&d%zTM{?X@^00SYrop&el-BSQ-3eh}s(3YU= z(_~*Oh$$xd*8I{O_G5N2^W?Yvid&F*56YLv(Jl&*SP%(buWx>}mgW6wF_qxbU|Dmw zjdl1aC4cbcF$6J2S)1?^ZXBo&126dbs;5fkj3U-|6~5xhC-T?6+fTUn3~Dy#;# z5gbL4T4QxNwP6&Gmb+nc+Wv(2qE&7Lk+A**u>Nn#n8?Zx)Km9Z)>6X$OKzdAJX2mi zW}b@0>lfQ-=$NWdGRA;YO|Hr0BPsKil0t=5ji+5D7CQlr#YSBmJx`ylF=d!RO@5Rk zyGme2K_vy+%E~W z5}yJ6BMbMoNg2u*j~+@fx{wwE1%_2gGxo%F&`rgMg4($Jv|3iw2Z0J*-8BkkZjN77 zr`8)==~cuTEFeBGS9IoYdF&{=@d+$~#9DvkULnc>5PXWo*;xW27$#?Ju%822e>WZs zE(6R$+7$wwtM`?clDWH|1At3dP{g_qr^-^>4vpP(33H1kFLjSGWT}ixx@WG9fvHj* z=EDk>67|CnH5d{%v_EPbf+9E!Nm|-je61f!zYxhZj?p=ZvmFhGB6JOoi{W=zZXviY zE4e%g(0CNg5HLc88%Du{5j#aV6&M%@`U5q_L!l{cI;$N;nLvtpo0yX!XFq_Y6D&}n z-w%-I8bsY^PbGLA9eVlsvyx9`*=aFBO`}JJIb7?c?O|SiQSRxYE(9l^@TcD^i1k=I ze3nh#qCMS&X^7?^PTy$KdF%VC7?A?+>(^U3kfn?M(tzPaPwP*2uHh7>idRhvjadf) z(#gS@#D+&@U%JVHEdAz;9^C5H>itmrFwb8~%eaNQ4H~EQy>2XjvLWW0ewU9S>mI=g zkP-X0}%&4hHBi)!M*;q(a9Y(ei9Ip_Haf>sshMOCcp z2L<}uN_b#v(j)AkM|hw8SzX&ZTg`;uqLushxoeNALt6CQ)q9rv{C;Ljb;PHvYQSp) zoOM76uF&D0Papi2LpAepQf!ygQ~Om2@WRHuL#Wa5JwB^Vo5>UQLxth7)+u`zv^80y$d$QSGpgG2-vUQ1<>MCQ*nAiTabLfG~#h&z~XZ2MHTVm0vvHZ20PR zWuP}}wm$I_($J9ep;O0S!UXXw7#Ep4KXDEov=(p9m!z39L!?N;mebrPtRQYPfkA+* zD6y@`Q|YgZo$sVx5wqMhC_^g_Z_vlZMbl3ke+4;}Z2OO9CxBK|yi;j0dz|CKmTCu# z&eNzpp8($UGM&5MgQf<_&z+OXqk2sr4rIBB2ep*Ccp4DhTCOZRz4Kg5np}-x>{Hl< zTqSdde)~$89p~CgdKSW}e*1AFutWxpw_NdBcy{sy7*Asavs`s{Y0ANnaaR3HtEbK| zAKuQ5S{B(PXPxR4g~BGGbwzbW6kocU=~C3Qn#)TvLUNCk=qmTgP*0l?ve+z=z+??# z&{<}vd%$wq6uzwHr!Qku_)4(0V+t~S2zU`foY(Doal@#PNK=BI^FK&8AZ{7nCr7Im zl^ui+(IPhP^)8E_)O^2Xzv{x87yuhvp>3M*>z0S-f|AE{Wz7UUecmRUcW}?-Pf48p zFLoQTy}{a_Q%z7m1q9+zTP|;EEOOzxHgG+T8ChO$S(I7JFR$We%FToz9jvo?7xr9u zb`zTrqcks-8aP)i^%9SVfI}j9KhKWF+ zi2NGHi~~Gu#|5QR1pQ{cHKek=u2C6hI@Y0TYgf{q$zK#GNj)YLtn-nEF*v0XEiv?t zv^Yp4g_f(Kgs<#svlG0(cIC?z-;`$Nr)1;}MYB)v@UYQ3VO;!G42&bhFy&P|^mK7w z?Qk7y%@}n}vKgNL1QTgI9&U0qeyKJlHA^cdE3=XmuPr89g`T)8Xh2IUZ4C8Zno%9l zQ9MMqlkKKrLtb;zCU-azzzJ?BfUK@_tuYKzkWV`Q)v#m+*tb<$lNI z&V!Elh+l?hohpi(He2K$%3As7WYG-7}sV zLm(apx}u0p#sOpiBZ*1&;Jqt_i5#O-NWB6at8fSFPH}7zlaEi8RAW}+CBg)K<4-I} zG@>m;tAnmH;FjMn_GJZ0BBiRyE~k@+J&k4N(tA_86WvaUO-$)(|CxKoKSDk~6!_7* zVn-&Aw;~xMkD!(<_Z7|lyy@U=GR`&LtLmzyb{VKLAED@{))HJXh0S6pNYddo@ECFOrkNX#ZDW=B7w!|n`bNJO(S%|f zS=Facfq!=F))jWl^}eN|@zzE`&x&C*)car^-ilHoBSBGAS`Sq9zKD{SOIZIA zl9%F8N7}jc_uYx58nKTOit3m#NZK~0%>hrveTI@b*~UxKENY!v4<5z->W#m^Hwo~* z59%Z~n4hB3`Z282T>g`dmSZdGvh0Ym9mD#c{eQEx0d?C`0@AMS)6*)+_bV2~|0r}bH{+Zh=b zUQE-pJD@rwf*I)!e~XKq}tB!n)$UjL01LU8#baQOjkxcuNYUve@aIWZ#q&tXA^g8HwzO|PYYK!8z)CnE+%#+jyBLCI2)1*4-1Ppn*=wD7_XE# zI}eu_2fGxTsDuP72P+FZCl9BT5UIfbmtp|VEN|gx#xWg}EaGAq?`QK*s)lcbZRZ}6kqbw~fxI3_rH)Y8)(|xmo3=YB)?wT9WGX4io#qT7(u5rA0G!nJb_d z>Z8{AR2i2B9BqGOnF9-mpOqPs@C(qMRrSPegMVBWuZT~G5=)iWP-7L~A*<*~+6HOz zNI6j1P)`M`*fK~v%ps3fcz`U22s03f9Mcxlrb6DP%t%?New4O?VGoj@h7Q+5a#-NG z54g_7ECuN^LP?rQ3hTHBBEZMRX2-XV{gjd;lZ6%uFqvSY9ou#?v2EM7?c8(EdAd*cf9k6Kp1M}` z>R#P{{wZSkDPkN26dNyq6f}!Q3si_{SL_!?lkfu$Cbkcva5SJ!C&N%dV<792QRe=^ zimMcelioNu$6v>4eD=5sIKOJj?-4{ehPp(gq)*l+)8MKSUGLBE11K&Z{am9Mh~$-k zL-(VvXw^ZIP(b=V&>|s^;J=(QjLh&HrozE6VKYS=8f%l>rkjttUJUrsml(Rf*QJ~o zIl9?sNWosA=NZo6UqkRfG0pu#)8VhDZnK_Q{YxW{0+*Z0Wt<6s-T?whZj05G1wvA*2;FF zit zIy9|Rkdc{q{NsJ9p6mW1`AGe3khCEoYKawf+!_l#7yE1CrZ3^3MHX(i7>tR~->(W9 z!vm-!%^lHx2&=`D=P1_p2xu6?^}|s^>h$Ee!bVeip)&sEI{DoP2flw%+;e9?atYbL6X)=1 z$C|`lxUj>-hSrE{Wq7~msT~ZB7qpCh%J63=n!t+t+x}*A)W`P@mXW3A5QGCo2hRRq z6(?!RIc;#GbzRq>`OZP$jF(6g`IhcOInO}Yv^yXV@X|8)GKn)dJV;*vxA9T_Z7Ccy z3B?nlgp(ZKBD3&RkZfD0Nl)GBr<=Q_z?G%#vyUbjr{j(m%Wjp_T#fgiyn7T^$_&2s zA2AWlPw+9^;3=^iu+m@=y}VMKL^ftf0{QOC(}s|<5bVl80)<#@*75yoL`?sBW| zh@ws}@V;ckHPq-K`rvRhxdRBSxR=VUUJeE3XFg_O24kg{`&~D?V5u>Z3 z?UH2HZ(Y?nqvj;wpTWv|AjoV9ET!#r!{XDWw{Zkg{|iYY&7wSVFC!JjnlBMZ0)1db z+e~*%bA> zhH&XCd@OVwM}9_1!`2F4Ss@huH_a=N!wZcB$EPn?N4|xxjeghmxlGF*17}kXrA~OGixfz^kX}IcqmAf=9`Wbn?wkPVPB+* z=)f?MoUw&)!z(g*A||=esfgPU=@(4>CO-`_x(w z+Jd-#eQwGVmT7ZZ8(MKlxs)le@{3QDZ@cUz;s{x0g6~g(Sr%Isxa5w16^+!7JDQpG zP9R?~%=kS(#-xH3o0Mx?dx?mOq$P+Er$iO*ANh-EAQ(l@iAj)fMljjtB zmm6k`k?6T_tv)KfO-14n_pD5yaPDq@uKOB=0rO+N#s9tpY$qdEWxFEdaA6D)O_D4} zf~0Qk;c(@t+N`07jOE{~^nS(}dqXjAuq;M{t7GU=d*}aIIlQO^f+-5`x1_i%LtujN z;Bmp({_my*(uPNcIJX7az_S85_TtgtMOt{W{8Cvd#rEJM(Gks@`0gD)?J~quDYDZHRd-hv!<*gX4B0E@ow@a>u-*?!Rq(@1yO4aQc_MoE{ zZTgvX8KXhUIoW-VJ2U$i$fE@~3R}a8D(|4B0mWp|vZ3%WuZ)ruG7f+~bCw!5&-*J; zyYl3|b?}l2#_iX(C=kCFfaz$bT3G=ywiYC9)C?pSX6>wY1F%y!p`XS7t~HsW%?3oM z<3es7s)UKgI;##@lDCaky#fk-^NjXyUnld=?$QDbDc_=s{xST}Gez+4jTp{J*V!+{ zPlt-G7x}EWHA?*pjt&KsNT(U1J^H+Id{w652oNHYFRBA4oU<+4&ber|b=2~E6^#~k zY4mSwmOXf;sjBy!6(e19B|C=Oz+L<6U?>noODM3-WHrR|#tSE`5dLlkV-@*mxo|!q ztSIlBH3)+r?MN1)0`UTKnxM+^&r?Fo0Q8vrFG`P@oN%|62YemK1%BU@+^sDcX0Z+4 zP!eG-1QzOYI<1j$_83+KLGGriy1v-!=<8yr6-MO;`j@g9-~@XLk0qs^o*OGhX?CGP z>0HC=nHoh_>t8FeP!L*=Hc0vcM|DEQDziIp{Un9|FYE5g`cg&8!~ zzR92h1#o*PMF0ZalkZyda>IFXVf)C5@%)=Q>0qXUmZn*k(m9t?6%b$?hU-lc*Bo>H1^hy8@%f=qa!`7%Ll-{x5>rFFsg2!pPg;3j)XL$ za4LMMAKY+PgwYYgsUWV|#m9FgHCTpxhS?s3Ru#x_Y zy5{H6c}747p*`j2q7_igiz46LdZl~GeK|8mKcK!BJSVq}B76am_y^8K*&e}#JREM4 zV7!qX@LMf6api!KZiRth7*sYCDqLQ1*D?vA5I64X2MoT|RCe$y&OZjG$V4X2vBQ4(a;t!mBqTFI5M~!?aeL9tdUP!dUhsF|9 zjOWi9DR8~#u-RKJg;X9RlYWZen&O6Cy}-0gTtanq;rJz_Gce4dbM*7_vrcw=+cfRa zsZPH6!{;OV-&yjo4$V$x>kkBJSv+`xOV6R<9Tl(j=vR`7og0VXPv!~_)GI)k7z0AU zcqvdEdhxoHLt~k_{mD7YC*U!K!QgyWX~ZRImTTVmpTYM}GE1NB_7s^s-+$lg_l4u@ zDb>0nypb!$-_1N$%QagD0QXt)tB1>WA~^CN*zOW7uQykV;;O*2i#c*@A$L8l^5fnP z&B?y3NFRaRQvt2E?_!9y^((gVhQg)$SZ$zQZr%1(p125j*j(9#=w^~JMrp&Bk80lt z7kLAVrRmVuM3==UosCA|<=8@W<58v{NF|7j@c>19IUCgytgW%?tYrTvpTs+)OtfoW z5LzT&07j?6mcyBc*;^*URN$t|^N=rCly4}R`KpJHVS-it1R6}^8=|{&(N?bPSP}S% zit`(fI$F$Z1_%+W`Rc_ne7@XRolaf4NSOY{uJPA_ogDmTtuBK|A8d@(2cPmDIRUx4 zto<{bje2cxk=|y$zvZoRH{Je7;3T_YP8^q_&lJ%$yfdIS=Wp^G+2Z~-IUR}nj0EMw zHr1zgb#t=pBx6?E4-;rhE{zl!M=fBA2Q*}$${?a3|Z&<_22HpqlHGLL-N{d@YMoPm$r=&g@57NEodzL+n*OJ6|Uv9H=coA{HF78 zGHh^32NefpucMB!yLrr%26{v)rI6$=*&=$v27i_ki{7fwLN3LC*Psa2IlM(+fg}(<7-T9#|DI1MU9329k&kR8~l~CT= zIr@+n%Bvco6Wz&gaEZ%I&i|QaD;hQ=fS3C}wn-0McU|X33z*hAiBE@D*%OVMkSBI^ zVRy9S-!FCGbF_p|i5p0V;G#TS`FvxByP+RxlbkP2Ig+MWLn{0VY4`=C__C&Rig=+%tT>Xig^gM5o&!Sc z+;9QrzcE7h9e@28-fP6)P!x{I4d|oYLz?zS3NhXkZO3e$GaBtwuNaGPh}K?d4RrfD zPwVHu&>h(KoFlnU^|jC(Z&jjuWFEN89LNTKF!V5{1Zqsn90*R-rSM>;!fqXRW#?(C z7Nu2Ac%|v$9x5*AQcZ0}?-JgsM4D>r%{4f7NzMw%7DMwX>Nf$nf9Kiey`?AORP5aAjr+JbyY)V3xPPU~5UZTv?rqem zmuY06yYKG52Dn7?IdiVbJ4yZdpqnMIkJ((UHU%*4-1bWM$%l~a)fMzHN)i2uG40F# zlT-1n`b^!7R6h)TG8pNLVnprq?_(uaxp=N}P+VvZ9EQo58!Q#7rTsaeIn>YZ@)VeYBPb zv-^J`BaN+!hu}40UWqsq1xRh3C<5*Ym~W3)>a@Z}R;Kha~0xg4q)h_iK-V6QaT-@%q^} zoW;nHMIN)+nDOzB>e|3a|2kp|{0K-ZTjOc}2BcXB_2p8`^S>xwt2)H?EgcOeOZhtY z6i}PcGThz?Rc!h<3l+0PKH&V>(F*_UqCG#p4)lp~%I-6|!y+prS&-5S4xh)IRScX? zoC-w)KQgocd8KpV%f|*e;6({I8%vVLuWKPo>7kinfvn{(v%7SaV@}V34WxI5L}M6J z=-#Dn0C7}FyWft7W6_T=-ex_~k*WmmIfNtVkt(U~IDz0Rl1BK{ZpxVqS1nX)StO7K#95=U`RY-itRMLq`zc4!@NnsKnai+BK3&( zwjNEA|Ah`9ER92@!#g==g;F-4rH7o@D#13je%dep?bX~_4pVhL!l9-$w{?N2cfXrH{Ttk|rDyW07N$QDdC zC6SgH$1|Mt??+svm4*2nTNCgO{DVhlg-(lj@GBQi!`QAp)P}1)u>D5t#QwEYhaAAJ zs?E*9BtS))-C@6TL_Vge2?e)+VqpmV)G;@&sH>R+LAV-JK-rTVr>+hC4^+Sv=eCI2 z8-Ov}>bXgrwjql%DQ0B7zXrRxJ!xlKijyRLyR(!-4Wzv0>7__ktK$t}JP(URZ(R`G z>z=nY~<=HoW{^1Pi(YfrrrX&<=Jq}M?R$mw(5>4ZIp zA*(*zU!W2J0$M3&a?%Bm*ZU~03~;IjsrO05uwiLW-B9W)L^FVd;BL_XvVQXl5BEpFxl%^GtW-`AID&RbMa`iu;v@&= zR?gd#yryE!6MxEb)kxm6a!CLTJm>sv^LyjA0&R80o@!xQW)NLcd_PmR>iKZ}TcL$(^WF1;+*3erEf5Sp{JMviu%%C|%Fs ziOLL^)lAP6CGgY2juK93(k5@FLxr2}@1_SCxRL?w}d7z`&$F-+wL zx*&q!J35kY=49E6gOo$3kubLNi;jrh$7)Y}A}>=X_u$sHF7G_vPG`^UAW?a)FJDW7$@}az_o>9|^GKx|?v^7? z@iHJZNJH<-&fETc!Jlkgh#I}QelXD3ZfP?eSC>iZ5Zr9fVz6;Z^B-+l)2R9u!q#Wc zzL!AI(Ju%M4LchlASLEy^u>8ZE82a<*1VEQW$G?p`Sxa(?TR%*X` zWM@*3Z=CFETi5(7Zww8l>J!$wM6HdLNvE)lh_rC~JN0x^obAI7t+ZAdRAY=3ZkY|` zcQwv@BuSy;=zg7#DyO`cvK<&0wO&b1tdUMvWkrn5MopGS0Uu&c1^{>ME z&9lry^-6IE>^r6j80b%!eJo!VnA3m6mygIJk3~AX9OL$2*tu*CfYjG*S zhuwptQCtuA-PCw?^1j$Xn`I2aoUS}A7`BvY9Rg|om{IEg(t@KPtjS=mXVDfJ>pi8* zbYJ!hY$}=1nSy=XAteN}X_fDCdh(uN(Bf|txH^FCsk;h#>WlYWCuM+Ekes$Q0cE{M z-l@#!PS%?O7p{J42!mLiznnk(dq%3Eq6ST)ISODF`kGW_otOcwJW(XpO5xcYJ-(f> z1HlZ`8q9DmjTp2&_OU3vlyOYBe6LVK6!zFKXz-@dKRCjYO$cZM*+2XyI*X0Rj--nw z;1q+uB_M1R3(wjrPj`#UD=0G4W7w~zIY?QYml0oqM4D@f1~L^Jt&Tr#!+wXt;G2Ps zHG`#FO+*(;URehCqUDMRgA}mvis6`cD z7Fn5lvt^wM%SZ#6u(apatWc+4JsDJ^E-<&S!=PVZj&6@8?@;>dK^?Ofio`nOK|uq^ zJd5=PF9+7WQujt%6Og&57%=(=BuvQZ6pMBNL?q zq<=%qhiZJkuzf)Q0gkA3gqe#XDnRQVWr(K4eu6xWs7zQHfL-3go33!Grfkc*II9~k z)YaN$=zFSy*5cUDTrS4_CY*@E*O=VUaRe0`P)O!tnqk1qg$+ z_1Ctn{87dp_%KdTDC#2PHKxIU9W*449F6F0J^D=?a+e2M_SM^Nwfkm6D`Z855c?0l zwInGql6Q~wr1nj@fiZ_tHK4oY0#=s1Gzz>wz5n0cs!OEq!I4{%8p?E#(Y8_t#&Mij_Eq zD&+hs1G!k)xcD7ES&)#w#!4KDCwHtN4}<7TJ%kpfUr8I%S>NUGwi!winj*1_SS|35 ztu#c_uf}VziG=z{!mP^kM*M&s^a)TTHdyjcbFSzc7{grFWdru3^tu9imc&V7Jth$2 zd=g){0Sv#Cwyq)Cll!Nt44VCNpP$fFSqGHjE@a}4G1~H42Xh@({e;c#Ro)lE17z^m z&9oL^saXCSA=o4?_yyR;*P(3?h7+=hq8h0Qw#CRUZf^N z&taHq#y#*P_$L#Xoyv=x#2dc-`$(FAK(M-Ng}_31j9O6TLKEkmI2?k7SW#F!ae}Km z!?I*Fd2VrHu{ZcoT+QJ`moY+;0=x81w>QPeuQA@(w4ZGTWNB!=ONT#Ajf~NwioQDZ z#voql6R}BXB>^2C#|DvFRF7&+Ip#( z2x0jwSO~FD9|-HD-w$e({CE0n&`9tB0K)Y2RJ^31Ykv(c=_+cCMMNJ}ZNVdW^^=8c z(qq9HIYcCMb?VgK_&4gAdU;$H#vYenU*t}lK|d2_8vNKQQi*}gB);+zXwZXEyJmCY zM+~|z;NsXMV8pbD;}jXtG_n*ua!{z=_8D5}oh@-auwrtLiK2V*dBt0T1LbH_L6R^< zW4RJL5dOPZEy|N~871~;WuA`LwiAo$8M2kcQ_Nj&TS%i6oS8kaj@NoDNmSP#7R=F) zGk=Mez3o56h9`lfFORf8IPW^+Mj)~a^BFpm1VPe5_5g`dEb_BS^goqMB>d-`^Z%VGXgkU+G#o2r9WFgj&sQlXxD#N!4piD zMLmeceM_(j`>$^d);v9WFCNZ9jVs2BQXC{gkVDjP7YhPWQV$lbCBa5EqWdM5#TRY- zsuGNku2z5BglS#R{87)&ij*PI5vH*>oB%9r{Mu`F6l*jqrDbcP33fj|i?sZGU?WNZ zQ|656a^+0BI*f5xwDAzyeH=y=MYZ&GRB+~mU(O}k?)LQ*5zU}20(#Iw5>S7pdJ0A7 zfK@eU6?+E~;EOzp!<{She!qyrxNd9HeEgI;%aFN-%dygL@%FK0LC%^U5!|jGpT2^~ zaYD_Za~Wu*sSiFJ#9!K83J_yLpI(SxzN%4^5bK4tG`2G}!SZ}3-7g()S}AaM;fF(! zV9LSY6Y?Nxvi0sI>iiLQF{&X%Os>&mLehR~x^4-y3Q$_-f{j+@K;|sxDzl-uP}< z;^^C+sO>)g9XbVC88hFi`NjSAI?C&1yXwH0MGp%~OnPyM{<|VCG277Bx|LR#bzhuV z-;J|#H?Mr%b949c(BhvF2^pF2Ovv;Ta{DigGxtG#H<@Qf)`rgLFAEqsgd1wZ%tI5a zO_FC|l4Jq*{}Lfl3LFS7-v7R%1XDqq+* zV3=t~h+F`ZrmVZx1Ie}8q08IJVDoTsZb=jZ>GgG~f;A#&aQfpb3YkfvbKH1l84`~; z_Y9CO@_uMfcSp+m`v-8_i;KLps*4j)(DO=o<5|Cs6`H>P_Lb-`ikI>p?ku)O+P_ zch?QmKf`r}29;InZALG8a1Z;7{bieAyljR&wun<2?5vx)_IyXZ#RK26UJ=?L^BHd( z5Q#m3?63m35_dY0qWapBFu!Yxq4$>7AIhKS#^8{jrG)C{I9Na&+2pmiEqJxZFL8a3 zVrCKJipV{>%tSq!&9oWZiLQO6Gb$Wdx?*fiD4a)^1Js#3umro)$T4R%5^v-QrIw~> zc=t=Y)~1Kg7XiXd5N8JGni)uodH@H{@GNkKJHq^Q#ZwGE<@5OpQX*t4sPQ+-#PQY4 zNPkK$IIX;-y*&`Is=Np%6+IpajibEPO)EYR5Vcj7?UosU4j$pKiOsLSWlYqI`_4OH zy&bi{9xhMI`iHm7t+*@TDHx5rsN{2UYyKTIK6)*LLM}#v*?=qvq*#MC9cC%1DZsUR@*1jcdb>UN4Fg z8-U+8g*xt8DsNb%A+$JoKtYHf%u{cMV|qHCb^oe&8|0ClTl}) z|EU_49v75=M+Z`(M+2r1BROZjUzK8K^Y%*~(1o+E%Mulo|gH&_|dKNi?<5X#$~xEzaZI@y@xGr1khVKCu z5z-=T(F|V0ML>gDdAZK?`0v8c?qp{Pj8xP@W1>kcLf0&|(Om$F_%3%Kwg96Q@Yc{CJNV6gd4+5VYk+C-LvSScJiay)BZd(pl( zd%EUN@8F#GijVJQOsGTzAs|gjMU;b0_Ph`R-w zmnVhYs>e-mAZgJ7@=pl&cQwbBy`Z zgq-NHvFr~tWg4%{fVx1J^YKN#C1FC*Xld{G^iKm|*Fz=+mzt@%@Ttn|US^a>X&BsF z*6klAQy`Am2k#Oq=c9qnkDR4nY>F^LM>8o3o$4x9z9l)6#WqoKNEDn_DjnkS^<5Rj z%VkjeVQe1;yQ#wVp;3rA46elm=5sC{6BQjiU3fEWY64mO6xmtJS2>yJ;Vggx%h|$Y zh`7?-nR~qIE*O=R^LmPh6T)^9y_w4$ zVN^Zx;AmA&&$&qr`)SPG9}16{*@Ua`nZ^GE&f>7FC+Ot9FxvWf z;jb%KoCD*c%o}Fk@}XqU4F4W2B2K+noqwV3DIY8i#X8(#hAk)92MSnn)C+0D$3XV$ z0VGjdg++%6?vkrsow-W7^XncaU7Yf~)^bqF zFj8Z(c(Owkbw0QU82d&A^8}arsisiaRht@gR!r8_v0It&ZbPI(tyh0CGSFyofV(Qs z9-NiwF!MlOMtpX8)zno;gaFsd{J3!p$1!MpH5Fa76azNWCJD;R-pi8fL-ND2@lJ*& z^FUfjKJSnNz=0oSw|=6RFi)6aE+!5#A$b(I&-5V(rGo?F>I~HiqnuuQYjuMVFE!~M z!eP6XZ{;Q|91b}tj_fAzF!a7Ze6ZKD!KDRckg60`>-h2KjmU#zhk;9hmqCTm$Px9O z7$t@gE#uWCDh);7Q%j9a^>x$|Yi<+5^oFN)ExG@sht++TkHQUFPq!}II(5>DZc}G@ z6c%6ZP~E-tqn2ZCOH|$X)bD;~;r2rg-}yazv*sRL;-k86BOQ@BFNR`?@)voz1QF_+fB~P_QjzFl(%&q4#Th$h55F zbwcoAkp zt~ynAkmZ_cE3Y1N>ki+6gB1{4l&KX69I6Cf$)X{+qL?6@Mi8j=M&Bqg$s(}i?8pt(6k}Qo!zKG8Y zibAL)Vnf#EWZSXIL+D{wN65qyQ-L8yG0m>TyLavDDD6PUWL0<9EXwT&!+@u69e}hx zAu3~3nixbPfkWw;Mz7@<;r)@sCJ5;nQ!5;b9F0f(#!3wAL4t&p;w1I%iC{vK-|vCG zf{P0RSN=^&6jysYI8ElW3tbG~vjc|x7hNeX*kzEbHr3*1P^>X~LJl6cSzR?ir}7U? zr8(Oa21V+aX#kltIc$iEyeJ$FcbrJ@k7yX?o&T6^WgWC|Jq!^%dnj5v2BN9%wF#rZ zpfziNFd8)Q2BRG_x(^)*UeXf9Q&_l1<^#peP0^UV&Z;MZmCZ*SRm9aa4Q2T#pS^Js zny|+_0xL9QOr7s0)`|zfr@9zX9+(lBS$_7{m#u@ZJ1f>Q-LTvUNYwFi0NCr#iDny~ z^G~*=FYvr#fsh?lm96IJ+AmhA&YI9-nAA zy0L;402}l%m^OipAK`v@(>1Q|TH69)>l(Os3KdU-nvEt&-`7mvHB3X#0ToGg*9K{F zmIgqiZd;~zAJn3K`qJhq#RleYr^}HR5*E;sj$mjM3o046-;Hg`PJR-PeZfv~5&gz- zhWd^M_Ln`yDSGHR5^#0S$m!8SH|e!_`lMs=(3fhRkt%Qfk@qxzki$*~^*ycdS|_#=tDEN)u)fh$nDRp- zUn*f$WBbI&OZgzbTl{O?HML593(Kmc6fgQMx4e1(H7$srk3gLSxDliNIQ*J2o9io> zH6aChC8CEVBUC4m^qPNPbqhenJfpp6DpV8t5j2g2qzshD zI+GNax-{>Mk5c%VF3D4NRr(;J z`N@`nq9p0&fk3p~p|LnT``l{FTd6_(*q3nkfpu81KWdKPS)v+^K)8^9s8WGz_PO&G zeOhUTvsfY z^sQw^B#7aac*39cORp9DZb<7guGp5X0C;ynei z>d&z{)#@~)_Su}P7><|b{Uc3AEDGt%4La##qw>B~S=lGdT^(iu1P1d)&jX`<35F}` zZ6SS#=5g?@c3Ax-=Xy+fRObMq;5gh0&69**HvqsnCBSqEU;>dcYm>p-w`(#`_?OU^ z!$x%PE^|OY&v~GKA5LZbbxU_C&AIKbiq#fG2r4Qhe#qGB)=9L$k=P92(xEpVCAJ?t zJTr_+*F|V>RzJf*B>g`S(1x(ApDc`*@T5~LF4bYl+P1ELk5!v8p+7o#9j_Pq-X3yJ zu9y}n^_dx|L&HV|&$|SJD`1R%br8_x+tQ6uqMn)%*jozS!Pd0+}dF7EFO9n z!9}%&fe%~B!x-P>S_9j=q73n*)w(jVV*Dq&W4ZgieF8T-hJ;#>6v1c1?0+;$v6+Aey<-21lb{{|e zh2FmEn}54*eVQ+nY1=Rn6rfHjvx10u$M8EFlO2VO7Bt0d*`hEhyiIqwp*OX z9P<&M`4pW?GSpx#In<;2JeCpXx9pMKP2Zy}o*X1eeKx{AY9mNzOXn}y`e2)IBw!@@ z&iHgwMG)ULLh(Z-`l|-*vBsK5Qv4H7==~zeF-*M%NrDtr47n5RX%gu58{dmm%x7mO zow>U*wkAt}JZhVT3%8AJ9q*n(B!(KF`t(jso{GhC0}8)Gvl!`@vi<}}ddPW7nTCJ} zf}Lngt+a=^BHENXM!Jaqxgt&L_HSY_U1QT#jgD{fl{KHBW~Njb=sYf6G@O|X6}?OO z(6zdiwTX7v$W z*Om`rv*3MiH}$yhmLW5|ZYFG6$<=fYY_OOgMm+Amjv z5N7k&s!#bo7~z>zwKS)&5t>tp3YHBE_v0u?QV=w3m~gWvS?Z2#qm}vR?sCGq*T3g+ zgrZ%6oazea1Kaj;_U62GVX6O|0xiU2?DBgXW(J~5RYa;u)cYj$)L8Q)aXQYrP%%WP zL@5+a=ju_Aw=V+Loz^hSn#6Mk^h>k~dGHWQgsFZ9h|HbxQ_RUOB&+D%tn_U!yBJVR zpmLCuo-bif>bnlAW=cf0QH6-l6a5j2a+xUs4)s)gUP+J8<`HmszAH905Gx2);18Dx zaZ$jpCpcNRJ#hV%;>&w;RQwuPkSzlqj<7dB$T9p+Hb=L=eSL3R~%%wmdRdJ;JtkzD)$!^;=XS$3`UdVwZC+R}z0H;~P_1X5xw)+v>S`%X$!tU!DKTaT`Yg!E zFd{;=Bg8+zGq0zQKt|baTlYfOyvJM|?-{97N1BWTHfogiWW1EMS!-Z6=!M3AbbppX z(3_;LS*l{I_XpZC0@DlgU{I795^VEOP*m5Y%fn$(bC;yXgmGe2*M-MKCYQJ?xuR`!=%74C=9N;Uyd!zOc8 z6>0@ic#Dqm{qW7%Mg)M-pr$LNL}M7sUB=9i`-yoS!=NbT-*QN)G~3s8hC6F8)ebxL zzZ2J$8(`=+fYtu0ia@kn&lqdf>r9rf!$hVTb~9p zWxb!%EviGH4dkLqnh-ZxUZrX;S}tGL^LW)QP&JDEdn1l zd>H>(2$zk^Tp12LzA{l$@E)q`>IgY#M(io-r=X8oNVNG;NnmPeZN<;Cvu k5R%)2b$kD(XNz}O(<$4|6rTqOQg|L#1S%>CB}s(;13aPwH2?qr diff --git a/doc/cluttex.tex b/doc/cluttex.tex index ae3bc01..c39b5f5 100644 --- a/doc/cluttex.tex +++ b/doc/cluttex.tex @@ -112,6 +112,8 @@ \section{Command-line usage} Run Biber. Default value for \metavar{COMMAND}: \texttt{biber} \item[\texttt{--makeglossaries[=\metavar{COMMAND}]}] Run makeglossaries. Experimental. +\item[\texttt{--sagetex[=\metavar{COMMAND}]}] + Run sagetex. Experimental. \end{description} \TeX-compatible options: diff --git a/src/cluttex.lua b/src/cluttex.lua index 309eb1c..2d02fa0 100644 --- a/src/cluttex.lua +++ b/src/cluttex.lua @@ -427,6 +427,27 @@ local function single_run(auxstatus, iteration) end end + if options.sagetex then + for _,file in ipairs(filelist) do + if pathutil.ext(file.path) == "sage" then + local sagefileinfo = {path = file.path, abspath = file.abspath, kind = "auxiliary"} + if reruncheck.comparefileinfo({sagefileinfo}, auxstatus) then + local sage_command = { + options.sagetex, -- Do not escape options.sagetex to allow additional options + -- TODO handle output directory? + pathutil.basename(file.abspath) + } + coroutine.yield(table.concat(sage_command, " ")) + end + end + end + else + -- Check log file + if string.find(execlog, "Run Sage on") then + message.diag("You may want to use --sagetex option.") + end + end + if string.find(execlog, "No pages of output.") then return "No pages of output." end diff --git a/src/texrunner/handleoption.lua b/src/texrunner/handleoption.lua index 290f27f..b390a26 100644 --- a/src/texrunner/handleoption.lua +++ b/src/texrunner/handleoption.lua @@ -58,6 +58,7 @@ Options: --bibtex=COMMAND+OPTIONs Command for BibTeX, such as `bibtex' or `pbibtex'. --biber[=COMMAND+OPTIONs] Command for Biber. + --sagetex[=COMMAND+OPTIONS] Command for sagetex --makeglossaries[=COMMAND+OPTIONs] Command for makeglossaries. -h, --help Print this message and exit. -v, --version Print version information and exit. @@ -242,6 +243,11 @@ local option_spec = { param = true, default = "biber", }, + { + long = "sagetex", + param = true, + default = "sage", + }, { long = "makeglossaries", param = true, @@ -434,6 +440,10 @@ local function handle_cluttex_options(arg) assert(options.makeglossaries == nil, "multiple --makeglossaries options") options.makeglossaries = param + elseif name == "sagetex" then + assert(options.sagetex == nil, "multiple --sagetex options") + options.sagetex = param + end end diff --git a/src/texrunner/reruncheck.lua b/src/texrunner/reruncheck.lua index d1602bc..658803f 100644 --- a/src/texrunner/reruncheck.lua +++ b/src/texrunner/reruncheck.lua @@ -85,6 +85,8 @@ local function parse_recorder_file(file, options, filelist, filemap) kind = "auxiliary" elseif ext == "glo" then -- makeglossaries kind = "auxiliary" + elseif ext == "sage" then -- sagetex + kind = "auxiliary" end fileinfo = {path = path, abspath = abspath, kind = kind} table.insert(filelist, fileinfo)