From dfc062e0f26882e3844278977aee36f34c9441fb Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Sun, 23 May 2021 21:17:30 -0500 Subject: [PATCH] svg miterlimit --- src/pixie/fileformats/svg.nim | 51 ++++++++++++++++++++++++++++---- tests/images/svg/miterlimit.png | Bin 0 -> 40859 bytes tests/images/svg/miterlimit.svg | 27 +++++++++++++++++ tests/test_svg.nim | 3 +- 4 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 tests/images/svg/miterlimit.png create mode 100644 tests/images/svg/miterlimit.svg diff --git a/src/pixie/fileformats/svg.nim b/src/pixie/fileformats/svg.nim index 62425ef..0ad3dd1 100644 --- a/src/pixie/fileformats/svg.nim +++ b/src/pixie/fileformats/svg.nim @@ -13,6 +13,7 @@ type Ctx = object strokeWidth: float32 strokeLineCap: LineCap strokeLineJoin: LineJoin + strokeMiterLimit: float32 transform: Mat3 shouldStroke: bool @@ -29,6 +30,7 @@ proc initCtx(): Ctx = result.stroke = parseHtmlColor("black").rgbx result.strokeWidth = 1 result.transform = mat3() + result.strokeMiterLimit = defaultMiterLimit proc decodeCtx(inherited: Ctx, node: XmlNode): Ctx = result = inherited @@ -40,6 +42,7 @@ proc decodeCtx(inherited: Ctx, node: XmlNode): Ctx = strokeWidth = node.attr("stroke-width") strokeLineCap = node.attr("stroke-linecap") strokeLineJoin = node.attr("stroke-linejoin") + strokeMiterLimit = node.attr("stroke-miterlimit") transform = node.attr("transform") style = node.attr("style") @@ -64,6 +67,9 @@ proc decodeCtx(inherited: Ctx, node: XmlNode): Ctx = of "stroke-width": if strokeWidth.len == 0: strokeWidth = parts[1].strip() + of "stroke-miterlimit": + if strokeMiterLimit.len == 0: + strokeMiterLimit = parts[1].strip() if fillRule == "": discard # Inherit @@ -138,6 +144,11 @@ proc decodeCtx(inherited: Ctx, node: XmlNode): Ctx = PixieError, "Invalid stroke-linejoin value " & strokeLineJoin ) + if strokeMiterLimit == "": + discard + else: + result.strokeMiterLimit = parseFloat(strokeMiterLimit) + if transform == "": discard # Inherit else: @@ -234,7 +245,13 @@ proc draw(img: Image, node: XmlNode, ctxStack: var seq[Ctx]) = if ctx.fill != ColorRGBX(): img.fillPath(path, ctx.fill, ctx.transform, ctx.fillRule) if ctx.shouldStroke: - img.strokePath(path, ctx.stroke, ctx.transform, ctx.strokeWidth) + img.strokePath( + path, + ctx.stroke, + ctx.transform, + ctx.strokeWidth, + miterLimit = ctx.strokeMiterLimit + ) of "line": let @@ -252,7 +269,13 @@ proc draw(img: Image, node: XmlNode, ctxStack: var seq[Ctx]) = if ctx.fill != ColorRGBX(): img.fillPath(path, ctx.fill, ctx.transform) if ctx.shouldStroke: - img.strokePath(path, ctx.stroke, ctx.transform, ctx.strokeWidth) + img.strokePath( + path, + ctx.stroke, + ctx.transform, + ctx.strokeWidth, + miterLimit = ctx.strokeMiterLimit + ) of "polyline", "polygon": let @@ -288,7 +311,13 @@ proc draw(img: Image, node: XmlNode, ctxStack: var seq[Ctx]) = if ctx.fill != ColorRGBX(): img.fillPath(path, ctx.fill, ctx.transform) if ctx.shouldStroke: - img.strokePath(path, ctx.stroke, ctx.transform, ctx.strokeWidth) + img.strokePath( + path, + ctx.stroke, + ctx.transform, + ctx.strokeWidth, + miterLimit = ctx.strokeMiterLimit + ) of "rect": let @@ -326,7 +355,13 @@ proc draw(img: Image, node: XmlNode, ctxStack: var seq[Ctx]) = if ctx.fill != ColorRGBX(): img.fillPath(path, ctx.fill, ctx.transform) if ctx.shouldStroke: - img.strokePath(path, ctx.stroke, ctx.transform, ctx.strokeWidth) + img.strokePath( + path, + ctx.stroke, + ctx.transform, + ctx.strokeWidth, + miterLimit = ctx.strokeMiterLimit + ) of "circle", "ellipse": let @@ -348,7 +383,13 @@ proc draw(img: Image, node: XmlNode, ctxStack: var seq[Ctx]) = if ctx.fill != ColorRGBX(): img.fillPath(path, ctx.fill, ctx.transform) if ctx.shouldStroke: - img.strokePath(path, ctx.stroke, ctx.transform, ctx.strokeWidth) + img.strokePath( + path, + ctx.stroke, + ctx.transform, + ctx.strokeWidth, + miterLimit = ctx.strokeMiterLimit + ) else: raise newException(PixieError, "Unsupported SVG tag: " & node.tag & ".") diff --git a/tests/images/svg/miterlimit.png b/tests/images/svg/miterlimit.png new file mode 100644 index 0000000000000000000000000000000000000000..fde660e127d98503170213e30ab3b271f1f6bae9 GIT binary patch literal 40859 zcmb@O1yodP-}VU!Ns*LN0YRjcZVb{Gy1To(859u^5Ks^qLIDBkZWvlxI))e|h8Vh~ zzCGYMdd_p6^*!(VKCE@tI_sQ0d*Ant`ybcuxp2f#lX zxY)pdp%jlML_4y?80%g`t~l!In7AV<#u7by5!)Z+mv1tl{yu)h(3b@Mm?Tx;VXuI{ z7q9SqNPxenD~ez))Dc%1?rcb*4tXevRfjr4_Ejd75_QOB67mDo5ezp!{q-asU|F-w zxN8Zl=l@sl|9ANR{F+K_S4g7JhVUIU&#$1=_Fo+Q`Dmgx9s)BilCMR=OwaGehSLA~ zZv6A~NCVFA<%chEpJBJoXK`8Kzjz6`z(KH=YXJx~coMm*|K>sc^U(gIr_Ho|gFz|A zi?8;^`QYPa{?nJ^KfWe98rl^Sl6Hq(Zl9y`A*JE{x2K_md479>ys|VxP>EHlyz=R|N0iFN+Y{gTNys?c#zq9LE9EK~k%9Vsbe6aSh68&%TU5@K z@CA)dU)4CaFN{v2sMAEVvtV+em!oZi8QZm@OoA+USz^hLlRgQ*G70h0EJ_BB(Bc4_ zLW#l70m*1#0lrz21eZgmpre9E{X`y=qgTwSqjG>XWcjf~F@ml^ z&x%a#xnzf}CRw-5pvQ-W2bSjK(IFDOtWx!q<*L`6ja%=iG0HIpz=xZ9rfz7z}}#DSZ^$K-+Lh z!|J7PD?;SqU`yj+vY`<*gP0gBZEtT}axjAA+Mt0Zj3f$}dt4Y=IX;j+QKTaQZj>B( z_{>vGzqyazLmK#9rqC-6M1!I0uhQy&K#il4Drt!mtOs-mc`;+r+C;k;$J(rcyYfjm zdUr68>p?c>OXr6eY=xfejj0C_vR=ib-A|&_JnMxq5(5sQB=tN`7Cplknu}gCNVzg) zXF=mqG@4sEUdG(kF8eORu#~YZD-_a?E22bK-v`kMU6xf-26L6ZlO;e*!(IB+RVSSb zb5x}_>7sTNCVw8O`sw1xVPFjk$+RVC+bUPZ|M5k_`y+7u$xs0$&?olgR1&vlChG1G z)9{C=lLCkOX{az~Qbmv-DysVLb(YBi=N#PR1`g(Jj2PrUzZd>_m{rm*Z%tJS&BX~OrBQstiku^(bO@!18zYJ@5ga2<*+K?^5S_ga^WOh zx`U}_H#+K`Pqj#R%oO0Sjvm9k@yzQ|1#7@b`F;U@K?b1&CIrFL9Gur_!JY5{); zf00r)5y2o8qu%JaBdq?@Bm-Q=;h&B>fGR}2j6ku_Y1i`4v{h}(<9gv&|Zsu}zoXOg*e|HRWE4)(&5iBjW=(CMgoVcFTK1f1B_kpOrEg(d01& zo^K1@&6rPWtQFWZ+Z)|1vF+nVL~nC_ZLc@J!7`jLZ#kw$L@z`;TEzhK6T5pwkbD%E zwt!Nyxi}We4G&I2yjpZuB|hao9+?=N$8+sPg9-DL&GPl`6PHi=+kEwPSwFyB$k&L#7 zVz02mUO-CqIB+t)?cF-tt4<6%v}^Kfi1GK1UrP0BTFT%x^lTT_??mr;&C9RBXE?2U z`MQ1|B(R}rY^yK0r=CsZG(gH)&C6GYY$(LuWRCXQ$eccrv)4ScgoMbN3kgNo2bx16 zQVr2>)Y!AsV+ge#3nyxxIQG{fy3JN8Ok2(!nb2OltXDG|2j7k=S@K!@wY9reNw?yQ zeU==tYRI?o)yVJJ&iM3*7soqq^i-GNlLr%N`LKMQegk}DQ}gIS4U zPAS`-^rMXjJ{8^q-W~hfT@n<|{?o9xwNdKqdRhVj^DzO#Mc zsTtvzxNAoCL|?yi9fxpcmALHo7iI6^{^R%BvwABF=6z=$Rv@Juw>gd0!A=N-V9(bA zT0eaUYSGybf)00|B|tjTgydTiIltFdeVxgM_JXor&ulD)IaA%W6m410iKJ;L^oV%I zkgGyUW=VeLdAVQN*L?U&YXlz1y~?NJ>qU8U zb8~`XtDjB6hVmRWiM^QTH&#bS_^0UkY$skk@DxjwGvm~gou7Hs)9W~TuhXcPH625u zdQgtQ+&KPB%_BhuSUTQj6NA{2CN=Ciypl?Vva#~Xp1Nx7V#|A`jZ^$cZHw46>T{}_ zL~1{+biWj29hx}od)+1>2Va*F`Qp*TK8QrmQEzRLTg<8_hc+v4Ba^oFA9?SYO0^4@ z`4&CTqjbeJCOR`rk*g`+K0=hH>ShlkPkp#(%56`UjaZ1RA-7*`dnsi?iR(*V%`iPi zjYp`GpK+cH^uB9xDN=c(u{e*$M(DV9e!h!-`)X%O+l)I@K~nj#X{oC<$8qz9ta+Z!1pJ=$(_S;pB&vmrkdl&jJE z9&vn9aZNc9dGaQ~&dm$?@NLsRZy@N*I?uGJj2MD(7O0jx;KoEpelTMk7rQ4ztt3nx zA!Vi1GK{*A0md~}M0aKTVoF zNiax+MZEd*s%c&^?coSz%}E2r=Sb=%(ja_D8+{4p6c)e7d;T2hz-{qnzQeetugOB; zwKyG#OMB`nck|AATZ~s+e!k@;y#Ac7TzYS*t*Zq; zOVsD~luc{IGkF+smJ*jLTl9TbY4lSiJXB?6JwaZ52ihD`=*aRW8 zRPJc7RIbppLLgs&THI*sbt}90BupPTl0454Z3LE-<1YF*j+K^A^FGyMHKb`T7+_P&P%>P{Y(EsZ*0g*P$qp_B2P^LJ`w>a__~LN%HVzyg?vsz>%a!w9zu?O&OMHa$ zUVJx%RB9?+H&f8%O}{NzFLSgd*oW;vtl)bYAN=GogDCQtuhG_hi*w~M2t>54o+oJ69|rSl^VBJt7eky0 zBE|gZN6F1URK3N2>R`Q7Q5I90{}70rJ!M)A$&ZNgZO0cyBU0}P?t(fZS;5sseQFKnt{r`hr7yp5jD}Y!znRuEkNv2 zu0BgxI}QoP7QJ;jw>9@mAD#|Q=v3(q&R7Te6XtBL3{mT4Td#uA?P!2tWj$7~iitQd z>9HGz09n`R7kFgTxFQ1mdRsiR0x;<~UFMg!UK&?cSA*}}mm|!DQH&IhA%CZC`vcpdKnGr0P=hst#WwG2NneST*Ur}#vmu_K~ka)bk z-z<}tYi)G=6N>Ri0@;jw3Xe0P@?3`DGhG|;^5yK+uJf9O`M@fP&FC+z(RW&%o&CuQZ% zGyFVc^?QX=@s6VXo9#3ESQ&}@85?^!=$ zNQh~aFm~O8NNU!!Fkk^i1XHVYkjEz?>5f7Y9`5}_hQIWxw4Q3=5qU0mfoLoiA+V=gf zI+*lwsA=vZe`EOk?CNKJd0yZ&k3G-F?KpJD|2lazZQVMF%cqOqXJt@ol>VFALPN>xN!Du%=%S(6-Ri@Ri<$_V594yMi-#F(6)zJxH- z-XE>4HE;hZBQmYlM8;Vh(~tHV_Rve+vU|g`N-79zjP_|6QxBqPYG$9v6w-Hjj7uiQ zV0k>=OLkbFF;jt3nKV$#p6FZg3c0BGj^A4QO8fLMh4ax1p9OaPj-FcYK&@wk8TZk@ z(Y!~uiL86`(gv1<^BJf!5SZbC;~;N)%A7k! zqvkE*JV0q0j(o!EFsMhCC4Ettj#v#AJis&)+tB8;a^{>2CjQtsxPNAzGN-1&w(`i)gF6bB-=Yh6#%C|)3LKoI+(ZS>GQX|DI8EenAGJqM zXY;ksl;4_c6N2}UouSdLZ*4re*3vQ-7W#KT5q0TTG64Cun|SfGe$^triyQ3y&o^3y zUfgFQjXd~{=SCU&(+}H&j=dw$sjumLH58d%V9sa%wjPR>(T6kz$j!3)nTz2>(w>3w zp)^sxg_ujzU`%v&9#tFdICSNJeQ@l9Q%+=U*}l)#g!yd=jdnPVSIl3R!rsAMC{%XS ztmV~evh1J&{4%_GkyH;dRdFwf6mL}BF@UBm;!{n()h&ISmy1FEwz=q2p*r9AH>&Q6 z^l3%;pQP(T)@M4iLm>#C0@pEdB#t>v+8*+RcE$8wB@3U?W;5%A(B@5k+j8N_7|H-g z)z1@XK9m;f^OaU(STD%;2V}x$LK?ApjEQY3-Ow#oF2_XaO%=D-(@LLqSt7+0=-sFH z|I9y-6$4VEg~oPs2p5C4Z)KbOX_m9h1RX0&HI#)&LEa*HiJv)iAy-?Garn?HxeN>m zD!2K4+`EJaif?jTKmS&aq3S|?G2xKu?xdF1qTD^FH#tG0buR8QT62%NYlcSm+V&c> zc2+~jw2(Qf(^_9K4eOs@3!^Nunati<92`5OO9Wz(sffEE$0>SIY+7f)&8X*F5xncq zqUN%RMJbkUl|+d3jzfk5)$u+TrBu9XP^RC6ZP_BX-N_3k=r1*gX5NCz2k7K?mZ%+3 zhQ)5LnoS#Z)H2@IQAU=m9T}`A?$YyOnxE8Fq0b3E13%11++V?(1PZ%j$0P*yR&T&{ z8LhSKqTY{u(qoR?oYs{R`KD}n$OBA@T+M6l<99f5l5)&y<2%H+-H@-2{7UWoC{FS# zBOG~4sjLqOH4cyu!Ai_ zj&wCr1JfCzL0Ep@$(q{PL)T^BkG3p7iCTnk>5ltHHeQaoCU)Y8r{^&|QbS^oIT=l6 zU5JlkZL&xNxu%)S()nb#u)GE`W=y}Z`z&1#R8n}+rimJ*Y>82k0#f#{0$23gUuMIl z?#om>`{1sr?&RcD(`r{yvFZ+ys%r6MpbVhMm^39`e$U7J)FBK<57s{J_|akYi%W2-$?9z^kskoJ=?B0G=T@?y6xYl2O5?=c`qG@V&qX7#Qx)bGe6{zp}wRM5J!}^6( zUukP!@!I>Qa%1a8#zo2WSy|yb8<81Q5mYViOu8>@(;$*Sz}tDtc@gl~S%H8@&^0sS zbty5^g$5{m#6xFfb%6Iv_wowRcPkRDksg)fTDsaDlAa0bj*hO6>;MY<8>mymWQE6c z;A}4${eWkjMYacw#FP;ROkn4Y-TB#lbd3(ZYhd0fkedRNU4h>j5ayKTXfZmUKC;5ZH@v)1m3kK?jX&&D^pah@ka7OMd;pOc43N_;j}ApY2t&76Tvb8me9xm z=?8Y!N6zEir+E*KEf;-}KYY0Ay5>!rJi)Str;Mu#Lh$98MguMH=dlbrf9qeY)82~oVS_lixVU;PXZq8-FQZao`jVlxVUIevnsOl>m|7i zd~1jClaR|31UavK^ovxLQ@*Vn78`6hl=ai?9SL$ z(zZXX8`$Wcdv%{*df8ninRI%9|lpwwJ4Lla^D;sE5-;8sGvWzlJXi zpE)4CW9IzMplHuHw~ybyJ$PJ><<(#@jU}=H3)#qkBg6PqM_XQ}snHvl2P>cClo>w9 z?(%|{>kKaFR1sfq4z6}Til02Dp`x&47c`Sk6N0q@T|oy>zZ=z_iTt5o(qWs?+PXK* zq=-)Ary({WuPzEiyzbx`!6c71IXm2j5sE58tmY*l%rC#4g&Hd$SfVcA&C}7K!l@OS=G>2Zmr@?-!8$#QVm} zSjcQaXt=SAqMjvRI2Zq;l7<@tIp|Xuh{h7|NO(DEDf!`u{&>rwcx}y>ubw?P+Htk! zM-5{yZH$h@hC7K6NrSIY4cPOh+2pc~ydGMs=ZF3TLZ~}q?OVq&tXIEh2s!%$oI5sR zOLl2-`-WRw!BG;dfa>$tSj%jyug46FsGe5EI#xKF*g%3Tlt)NEn|Gm4G2P=47_8sLvnJb;&(8e4!{vW zfdK*v3@5OCoGLY;40q6X5v6z19dbnB1u?YofWGpsTQTwN+Uz1rx)x1JGWfA`Pz+$O?!h1}0v-ENcAHu1X*3BOh zPCWT|fW+0cKAB~;t3q)|$qnj;vz}#?Vt`!ci6+%A= z3tW5uf}q@FAEaq4N^1nfl?8!QJI^k_>Zx%@>52N7l+-VUac+Z>k-F?`3OxL>~#? zb%)=d^CZbf@)Q%i$EYDLA=nZzO!hoN$|oHW%;T_K^Lb>ywNCXlWOqebt8Bkee|%O-q7zBdO*DYe$yZ1`}b@`up@@KEH;fDqZ zFmH28yhnCb@mMWVJ-wVgXv~#QN#CMUh@jnz6asp9dgSO#OKBWF=Fwyqrl>C8 zk9R~^b-D~<7$}W%@8(YSZ>0wUe*9Aj8r3KpTK_abi-lO;wlg45!02&iC^bxGJ7OPG zbZ2$ob`W=XXiK5>&X>}RUGHm=Ykq&KvN@vK$u2DR?dn7WP+5NgX=x9SJ72rYP09D_=^zJAOgG2}%;h2|SF1 z>TJ-%iHz#ca5BfeMAu)v(d`L?lWQBZvTP2zMe7-S&6R5zr4z{`Mda#k$LL|hIXhL| zahUSMn|^w@uN`3UU&#ZB>#j!{PFgVREoJ#h1dm*M>^|gdwqUwp8=5CLaH)k_Jg1K} zFUr@>bS>1hXMZ~Kw=R@dysc}R9)XT7`N2;G(?L7{OwR5mH~5bo2WpoFqnzw7XprHE zYd5(x((E+v+2Gt~+sh@M!1EQkjoldPY0a8c<{)mKJk}*-iO?Mn3VnpbI!UpJRp>ji znr6&0oE%upm437OMh_-((N2saiO=R+fF|*AY}h#D$^Ojq1BdeU)_s4>CWdf=Hqm@R z?@{lowsPe$HHn;}W6E{O=BI`4kB+9K_le>PEOsA9&= z!<^2WU5bf%aJ^T=e`EvS7wTm3Pj7f%>CLLFbg9jJK7x-ULY&4>G(-t$ov&afqU{32 z0wvE;{f^XMy|B>gW8CVk!q#eNdKI)h&#T2j(yHw{2gQ+s4~rP#g`VY^Az=4(<^{%{ zDlNRVF!gqR$#@fGLW2?c@V6VAKvj={z$kujEO*uf+EJU+2LuI{;k~Ud3<#m?HoAKv zCZdZ4n!8_9sOC~F->|jmHjv0NY<2dp>K3xtuokBqs#%|J7r@jRYXQnBkak5D z$G$%HOEMm4sEADIa*f~G~`arkN`E{Q;_Vh+NRJ5Vr3r~Q%dtY$((oZG>QD} zJ%x(fL|;$7uom)7Mv4c3pvPZN(3fs#1C7O;eYV$%bYTyf8U4?!<_Jr?pKx;o+f#1K zp<)Of5JRNF`BVTspyC3q zE-AvNF?ycq#)_1#-JrS2c!h#~z(SCrlw$Y*geAE7w(3)qQ)5ff21P|Fg)bWhl59@y z=PB8(qlliUw29ZZcLBAp7Li02Drz>#3O^t_a0~Ky=8_SZBJucEG?`)8x(3+ZpDB%V z^fm!CD+{E^_C=yi3p&UD1~B<>vk}_Dr~=fOY+rJEQ*Nc zSg(9$wT9_7Myxuz?xygr?T-xJ;IxB$sE$6B%!6;CGDQ^CQYrYerPBV%Bc^h>FN+5d zRMTxT=&EL|(8!t-8PIpHzGoS3gVVk_W!uBzLRt*}_{>%-!R+>Im;e&68>c$Hg1zure>*r><(4#H#xb@ib;kSzdwk zMuyT)_HRS(#`g_e&wvM+*Y>Cl!R`w{@#N(QMc8_=sxZxeXwGj%yCONb%=g|0d-^J8 z#gY1`#(?Wpd>KLj?5T#m{x8`}(W4+1H71s9g(u8xTAcw2H92X&HA^$#`%unIEua8; zd-d*B3k3f(z#=gEFYxZs-*!(JT+UD&dRjtL(Y9JsSpO-|@x;Gp4v}ly{I2$FZxa85 zZjQWzHKejk+1$MLJb7X1;3PZm`_N2M^idsPIyBoplnA`N@hoVB>){|!2|28X*T##v ziP~zH%=J+s?i%!agidSrHZTUK#$e480^$-8KTr!@Dm93DQ?TC5ZGg8S{_Uy-{b1dg z`*ZB7cw9_6#WySBE8SjPez&&sjp z|5^j-UDQC_Vzy{?E9tUj`1EXR8Gp*O8td&m0oJC8Xx1XWUAc>PlgI2o^quKu%`}c8 z*jARZmICLlmhZQ7-gr6TQate7@{j%=!#F19gc9r0oAnRrm@LLk01A$l;Svs+3C*gk+l8UTxueDBWi6D>0$| zFa8g^iw}&acYn4?L6o2A@Oy0g`Yq>6DEx_YM!waJ)bVhl7hxbx;U7FGA0C!ZukxC> z(Cpz)P1pp>O`j6%U=kfBDF+(mS`DunNy*4a;Fsnd{zc3>5zM){T$Q4|`MscV>v9UY z!vn|?B&nP|WTE-7no1jrud`8(|bbDyo&y-yIv3mV;2 zU5-5=Vt-@J@k5Pi)Uq28#3TUmeqwr`zskMhg;ch>u;vNX^+4xS0@1kT?>7X4-tN8} zJB0PjwzU@lUAeGOjW{U44$Su;PxkN10X9;hgOw4 z#3P)~lpHgoaqMZJCkuI(DhN05v>vqiuXjw z+QaK`ij$vPI3jO%u&quY!nzG83Eh(4q{Z<;wW0D2mG^o`*~oIf z)}Qusf<#y6Ri%2INrt2SZWY|xs^A=b7OrpI-P;d@qm)m=eQHOpg>14I)%lHDo2z;s zsj=SFM;777-Ecl|Q{0t@?=IqDaFbck*lRwc5inHHlSkCO7%y5s`K@3#T(vvSu&(a; z63D)>`of#@o8CRzD22zt2N9DW=d*;Ef^rfjL+iwW!rd`Yy5q7~b>G-p7_QL^x+Bme zt_Qu}t&qCm56M!g3l&+Hij!AUC*vmVnL>6s>fI3{b)ST9Y4dZi!VW{i{Y<5FbPHtT z!=a`E4)p39(;KOFZZWQmkxgo?ozpU&Ju}H~oEtOj?WRlw4AnUnZE0+^Z4+Wz@GS6~ zwbwIqVRn*bZNog~`);ZWy5sXD#%&RNIjcZ!;nv__bb>u^{bU+wc-}noZ_q3!Br~Ms zF5@U8EVBjUl|ai$?LAGU^3h{X-IZzXHA(m2zMp)N228U*SV~2S`$x}dM`-w&$2K2L zun>pu&RE8oPOag|SlBQbY*E+`Xz-g>=SsAvSNmsWsXWw=)YyLXpN2*%AvQ-7WIplrYQxi2y zQ3CvNJ>%+%o76tFK@u599J-sJ~ zEjyonxsUGy6t3NNSGQc=twgyRj(cSCTfMB6bBik!V_{fos*Bm1d^)};l5PrH!$O!r zOGr9NbB+_-m%wGQWR zeVH{`bw?f!N=wOEAKkel9?XUBCs-FGvDKEs-mg4xuwR%{5x%fde`gVFG1of0>1L9+ z)DvpY)|gA>j&~-T?LE{uy(UsRz1j8Ex{zawKcAy1R+R;VYolSzQvQ)yRRQt46Vv>~ zZZnF@SE6>zr&VdbcZK@WSTetoNHU$waEr1}jZfoY8_oF|DdJ=H;#qc-6L+#N^U3Q1 zW3j$0TB72z9IWxWUcQJDQUG-#Jxh6~ua={^sin*KnY<#aXB=lWo8t5iRy`pD+?Cdu z&8jVsRIJcc!ye4R!;ajym#SXP2=_2PLz;W{=sjU;zrC?)U_MF3Kc~ikgqu$a>``v) z$Yk|jVmPHki@i`U?>nD`If`PiyZb%%*GJ>RtOYAujZSoYUE#6v(BhI7C(?mwsI zKYIjsGLR?C&nQ-cpT~rEguduh>hq4HKorF<$u3ImMHdTjRZYTw?h94BE@Ct=E*g!! ze9MxCAN@J_2YsAB*?as6!q@1Jp`IW~VAA!gB4Xqkcn|^zF$C^7LIkwk@gfH@Fsm!h zmq^1d>{Yb9jud=~%{5(v%NwLO1kB2u;ExTSbZy7a-PjP_0L?v|zp`QMz^PFj!pA>B zBE-ClTC?pX`=yKUd_+i+@k`vt2IRqkcQ`a*x}Pbdy3D2>*{CLMwtm}5ajY&N#E2OVb zg+9M&QyTY1Rt;>AloW^hWwz2lG2uGsXLOKZPLg)|;YQmQaNI$UF0}31k6{~Z@i3QZ z?as9!=o-N!b?98+|mN|H}x)z7Qk~JQPf^Sw$_VlB~ z$|(q}hZG28BtIc5u5i^AQ+wPNc6{kYIEwoki@pEG*bMH54O7o2Zw^VO^k_{uP1v%F zDsZ%DfnNRSL4+$kiKZJ~^8 z(Ez#MoN7XO;AT|D=|MtLj~q1wyeA|in>T@@FDwIZ{%#qdTGpu*p2k2~3rH@%{`>#^ zpWA7E847-Sa^lfQHa{now_g|wNdHq~!GG@Q(If&!{?6;;I1OqJQS9e7g8!yThzTF% z8p%@U+RY|Azl6#E-fi?Rw+FB+UDJRwp8HbxGS!>5&;KnN{9iN)y&#Kzw`@AEcVU@& z``>@Y-zgawma_GJ*nK#E$qv&0>ahB!IseaWTC&s+fY-+=OOFF_Zsv;O{hNvF|9lB^ z9Mt>CBr@0;F?s%w+ll^XLqyH|-`mm9(7yWYa{E(Wd<2jG>-Hm(D6;#KN@;qb!xwK7 z>xCERf9;fueoP1s3$SlFEXNW2&=GzWwK$NHA4KDIgK+{fz&D`*f@jzm85lHR%&bvC z)Ms}W_$Jy1uX$X0k9~}5F=uGX-)$O&4|anR8B_-!N*0k@rikCAuE077iS(z$%nmTN zEFcCPeTrPX-V95hF5u3_`YVDr!QsW8HdBAPD=x*}VrX~f-ni;O`K)Bz579G~Ar-fkD-eFtIrr0R_;=S4>+XM~$y02BFtqk{v3QfTf?0xTN@N&z!WE*N1| zeIx2=Du(`XLFUsU0IDmp1+Y3M*OwUbXe?eD>Eu6v%W{4J0I^ZxoDgwV%@)5iW6TNT zmDN)GRzh@6o-UM2hO^-6s!&LeIRdfYcx;x=Lw@jG>W(pRvRG;WYKv}@?(k%H+V-ho z5bOAyHEyK8i}0|i%Lbc4uL8=ED*FfJ_b)OtCcAPoBSenY$YnT-vZp%VEcOD1nF;j- zH+DB4Wsdc;S9RvP0qL%V!FM*&ndQP~MitY{N7yO=I^c1+ZLTHFRg~jrgI(O1ab9EP z%XJ}%A7{EgJ4l{{vuYaz%iiQpYAVo(6HZDMn&e#jTAtt^hEi_kpA})>kaC?E`|8R# z!EEg}e#QVm*|dTl-)xnF;Y5hNmk(3^uonf9TP^P{Byh|Fx>9HkL zJ%4Lz0DhPoXAxkCM!k5tskV^EoC9)i@a1Y4V7(|+23$)?C|OQ9Si<2UAhSaXfaXJv zzkhMY;TJ)c{?N|=l;6uqFDB)jQ=tPWB_r-@jQ|HOxWz>yHTDibO1#j;CYZhd^uCmM zf7cz`7|yQ(y%R@u68I63_0)2aphQ+3YyVb8PU~I>jz`s1!e~67kjGX88NW3UkpIs0 zk_M#vf7)IGfnlF&cB;BE&R2Ax*chWaSb_e=+_awAPmC1+m3v&Lr~nTC*hk74fCSAu zWv&aK{Un~2cIlKeM?*oUc?xr$4@BcA{c?WeC~yFNZ3HOuEyw3n zn7cjipt!VjYu@PTii1%k-`0=FrF7ShzbKO1|`@X$_L_uqtPxKVhU3j>YdExi2Rqbm) zybLUt7;W59H1_!90Nx&b?gp)fViOOT#o&WU>_i|JP}gl(Wm9~KNvC(unIkVo5{_F- zJagh`VZLn*q18_-K}?rU&6|#=Imz?I8wCo-zBa{~|1NYg)7&wKL zy{@;u;!o{$y;^*_GoL=OdEKnn$aqX`dZobgH>u1#9#LkoM5_Y4XtUm)j-w3-fU^B~(Nh0V)_DaWAEB^}SbtO58?0cHQ zT=>2bXkhsG-ins{fDxqED~0tuxOhI5_;9ucQ8(TOeD7U=#m3RJ?RtSlcSnAbyCYy8 z*hpqmK(XT9G%qh0QJW(Z99^zu=E^>XKkhrr>&c&%mA!|t%<-5X z_TR^IWLx+Rt3{wCyIWG;A)-rjNjSp~27vs+eL!r^fKtL~-$t~?%P>7fnf*$lkNW@G z8P-MU{>>v0_?t)InlZ{FFzoirBjB5xUiY){3$m^wKc?4c0$IZ))bY5v`@fQ-ENG~< zZ-@9;L&d3t`PO#vEa+d!oTNhYHEA+aOZ;lf9x*iawp-U81 z*C1_RA&z~rwc0{~f8t%{91K=MicH6gSbBY5ZaseoqVzwd!xSp?^L^Y|CY+D+b*g#= z42EU}_<9pxs_=<&8Mvx}ef(|xrWDMuz z_IRx!0d(Txi_J5hc%21ct34N{Bjg{<8P2%{p#P@@AOl)|0h>7`v`kHVLfh;}vE_hA zJDP4P-F)F0O3A@;6%xcM=0f#Ibr#*vd!#k(BQ>o~HC*KNz=u{pv!nb$kmE=^@iGYW z<@_afJ(l>7!$0AEP-D*ixbvwvb!R0Cq9lKL8&HBItS7>(O_H^LvnruFoQ@fh8ia2p z{XmxiFVvep0HX)^J|%0@$gw%Iez|&5O3C>I6K3A@WC>gerTp;blWAp-Jz5{XW}n!12PuH4!}Xb=Z@QH_UmhG{?|=|{JuIJ zB*}b>uWYtEX}C7er7P2~2u>DiBx^b(gWOEbxz)DDUQS}&voEajffC4dR64)2vtDCm zQ3RsUVDveb7{T?^MX}Ep2-<1YqT%MbILj$;7Eea*qDVriLw5)1&xL)KHaiil&?ETk z1;Zm+Toi>Ly>*T)E{|@+17}ppdBE~f!eTz|lW-l=+xkd6z*;tfE9~aOZ7yJ)RK~aj zm@xDWLuW=0%H1)I8Qi0^fqN`w?*3jL3n5KrZCRq`OOq^q1;8gMvWugf0wgf=pYyoY znxjq~O^;$IBg}sdHi9m>OQ7CSX*?n=<_E_0kaHsv9TlMtF64^2m%dZLKQ1dusD;#8 zliml946PP?4eCa`Ejd=wiwT%_1Gd4^eU#Rnd#=Aks8oPF+~Qn)*z)oDTRWH*tVP|l zUgU^w3jLV3hzsx-e<2NF(nQhxL%m-A>Ju$b9_y|L8$ziJND7E6s3DJ{SpJQ3w426} zdxOV-al>v-NUm1%J`Pv*Dqu=}xnC7T)B5`R*Lvhea>b|eDfrJ=JNl!&O^?C^5kCxd z)?+3@XTzs=7O5}$ll?%x^{D~8Z`Yg#y4i1YI{CRdV&82y{ZQ3Uxri*=`UUSJpKAT; zvI|A(*5I(a#xvjD#n6r(lt!U>mT)r%dYpxl3FV6Y)~POfk)$#Xt*u`cR0KSVOCk;3 zi?N7HZSa&%P$A3|R?`^(ye9WMZ%os`+`WmJFV--Ex{m^f?gVqqKXzF;V9Pc1H;(A^ zi3whlX{kAko`x_DpwN9u2{xfxM`Jt|vV#2YXaW&*Ql6&i$z$Q&S86LFwJ>YQD@Sdw z`1Xe<%I2Oo?t9#K&KvjQqg6KAd(VprqqX*?B6o{ACSs@yJ-(BzK@P4Yl*M_*-{P#k zU+~@UN9H}iC=K;QKB)fM0!M{+Ve0_unKDw(IM-V&EWw9t>M9~jEw=TuqWVQG%Oe#? zj1KB`x0b{&cB6$wwl%5(7iQP?WTDmUcI3ft$iBXqKBfq^W@6mcI~yypx*XydqZ#uu zcIth8r4kt&v+LB&$uFnc@_P5Te(6ytbVeg=M+d$pYpp8>%^fWB(f-VLeRL?lv_mty zuJjE~<5bLV%)VzYphiUlCUywL8QK{78Y&lHiKY|x7LcsTBnEXtb}wnMC7S<1|4~$) zGy6t%NFHC5-rQWEwu55!C*F@(ndI(qQE(t&-E}Q*y=4?CK95>X?l(+fu83J+_x$j6 z#guJ4PYrB`6RIvU132}!-1*aAq;2{LT_vr@RS5pj-4!4$fHiy+J1Y8Qq8pBNe1U#E z3a3Q7mqU3p^d8aQaPB7D`qNEVNYs8-@WBvZ7(lh~Mrs=Nu{XedQkSY9kKtJ;rpnuE3^@6?*mzJjfaGqI% zvP)YWzZCze(weL9JF%}!7O(pY7q-51yY z{#1?azPIMiJx(dtI_5V3cli>rk!#qv7WGF=j(0xJTK-dcyh_sv9kOy@XhV5egvgq* zXn=*i>~Sys1z6p4Z;5;`ma3hv;8-(spPibUpHxsm2!c_7q-b#R zHxxW_?jO2vm&Q2OdJ# z=Yt57s;8(>%U=`@l+&VFK)!`%trE<%2z)ErYrmry%YqmDG>X3HF{T6(Y0iPPhu#JO zuuwo7=b$O`g{~yn6xXl)g8YB{2y5#^UqHWp{mf-!8LR&5w`BrR6sdQK7tcu^mOK!< z=}!1v{?WSe2*UetC^hC_5~*p!4x^s4>QXe|bP%|UeH$H7X=A+peDz4h;3uf3VE^J| z?YH6s;qLv5(+kuJFYNse?Cy|4SAaQc$0fVyazXhQ|69txJp!#4!yJw7B&V}Z|F@*C zpvEK-2#xX3?f_NRJ>9GB=k}nMpBq0MJ5D*TJvr?+hem=sxULU>t)p@G7>oE@Q9?~g zHR}YIBZft-NlW*TJ3c#|zq@4)GF}I70Vb=}{7eI#vt*vb!?C`M?}gLpLkzB~R&cNK zaH^jwIj#Pe?QVOBWPYAHw{v^rvR*`~u#)$!cX-DKe{LxAfFi){+Q>iBEYvRO7UEcV z0aH){@_@ENqXSQe&=W3(pgQvIzeE0Zzd`=!=9DaZ*Gfqz>Kf6{y z;xV$VGiD9!b(5S|r8^NdQ)@T#@?I*?91)rDGHT=H%B@x7jRo9*npS@!{1YirfXmbV zH@=bd&egb9zvv8__X2J=@6LTr&{WWwJ4QBgPO(%zjluJ6u!M$Ne}^`R3L4*e7fh@! zqTBNEF@23KTFio|>gvk9oF~oH6fuvn{C3Z+fZL`|B7Tzo9G3r7`K0|ImglG;8KV@r zf00cDCDsaD_EzVx2?+`5&GPG?mov#?&0a{OcIsg_A)Y}xkurev z|M8RbA4pIn6`A@CJ&YNMU{%v+242ir)|ZT}S~cX;Q7#JCA;bJD4@zPM{&46C=UM`L z27E8af@z4(f01R%%+q{Odgq^EXEmKpckH z`McKrtmC_G4S&?&3HuJ9{iUr`^5nxF1|gwoO5jK%!K-lq+^){fyrsmX_II?u;~eeh z4a*qC3O0577qnmKceFpihgBDa93tAQaLI-atI|-bKYOr!I2I|i@=ZQ!YmHUP5gLot zhc|+0^$Ep<4(3;d8YB+%)|s+$4f|ZPYlqCuHY_22YZ$Oxcri6tD8__7`W-m8i#$Q2_-Y z`vGv`ogF~-8v|s&5kU5%_Vi%VE_)4x27u1r@8>(;9b@(u9}p8B2>DolE$|-t?nDF7 zl9ST??Xej8sWY^=UPk~6{4a&4; z%am9^iNf#ipng}-M_cqWehog^KR3FaGG?J%XdN@Kd*#C@tPyaQ8FFlpH$_#Y0Hb@z zI6oKxxX==x0)P>4_D&kP7{CnBkwWWd@Y6bAcn5W~3lQc!K1MkO&Un9|V~CB*F}^@U zyH*k&v%)GFw?fV7&YS$N5S82msC|>3t^cJ&soUTVtHkse^261*rGPy#XIcsDm(uWa z-?d))*EksYBXWYxNV?J>IuEC zBM~NZc*a5EF0H7OV8O2B`3m#(gii2^ryh6Q3DF;BV?XIt9*g9bi)|NfJ-1(c_Se2k zo%Oktfi4m_b}DCtEH+3Ezy2e!_Sc)n3+yR$m^jIfo`>xQd;Vq==a^3^plq{Per0+Z zNw(h`LDvhE0K$>J!Z-()3veN;xT#Z64K9&bZzV2;$4x9n^&Pjo7TWk<6O zO8$3FnB=Xjm#Ly&AJwB%Q{f}q{- z|80MhvWQoyP#ySB%>OFqo_E>w>aXOX+A_KOw_4>8nFRZkKEP1vyq=VzW}MS9&ut(( zXJYv*3AT#0*`@U$?zuA6k7)m+Nl@yea>IH!YPXthnoaYR>khZK1fS+$ooK=d9JGeT zier!dmYxC|MsaHnWcac)rlGbz5!L>GwVii7mHp%YjgXy?GVc({CfPL13WaR4#W9mZ zwzMRKvPX%Oy~!R~nHk55V++R~(J_AS>!5Vs-QV^2{QkNBxT`a+bI$c%ujlLev-)J^ z>uV72H?i004{a=WM0lImXBDL#UbUEgwM;FdcM-rt2R{uC9&^$Q^%8x)71`PA_F7{8 zp6xFb%eqi8U@c3F;pJ6Cr4gxyLjcN=(@~SlF_7Hg7nYjS-ZT#SC2p&l>i8g!6;Vf! zJ;zUO;>f~j3EfY)0`Y?VkzZ-gV0X~`l0)!HE^*0U@c_SW|M8&n20gT|zZc(gyJoFU zpE6!GfX`>ys^$<*XS8_+ws`H?b&f@DS^!}^45-!RN_YccrIUMubof68X{Tqr7kp*8 z()ds7VutC_T%VrU0?Lnj!?a)N&tbZ(2Lkf0TcAT4!46yB$?ojO5ih~&2@p(n^`iw} zY|@qYWBt=#7C#3vv7lE?CPyEsGs5Rs^GzPsHia?|5`$PjE1i~q;i&kC22;$5^RxH! z5a)l6t=vYKu~oKDOK<#~{U~8yoz9mzPu!;Z0VSt6t<-IQ*``f+t{wlx5Cv5R2VCd7 zM;0>sC;r}{pan*@9PX6R4zOy9np$MSkCG|O7lYSWmuRGe%{#FpWw}pLpjxNwlWQ7( zWeB}ua3BVoYoS6CGWpw-Qu&Q-{X@X%h&A>ebjPRIB(HU@zQi(-NDz=UcDomP zjb~C!$`mh6EzCWhwXqeR1OHH(0~#fo6vU=)K!BO5V6C%2IAGa$X^rYjvg90%&911k zpV~y%vv_G%I`y^yTtU~JXAv5@%vfWKF;BFlvJ~44hL(;{vk~qaAUz5XDMTo#(-iw|PzS)cz5x%2vT12&{2wBa=-?Z&p&lPh6m;5_#}LL2<+R% z9EOdyA=s$ObHJh{P!aB)esjMR?xe7ZRY0e@QGC!h-mQ>^rD8cZ@|S{O`W#;hAdz;*T_BQF3@zfEE%k^egD;G%PS=_#wp0O<8$RKvg zg)qkC;h&opusF49nZ(hpn7DqV6Q~1R4+|G`Ypy9R|IpRsC!rz#nv#!6*~{1fvTQ%J^S!3lZloVSiT)d z3-FO<9Xt8rIZnm@7B+mnih&J-@0rDaF{`8+_IPdf0(l7?*yn8XuPrAgjeCVpfiDZZ zrt5}G+}gapIoJHq@Aj=A*%k6wmKUeFL6~*o4vcgtwz70N34#qD*+lckFPs0|bm{|r zWm5<2YJ0(39&KEN7BAh4-=`k_`%{nNY_PD=_0P*Dru{9z-Q%k5)mZo$MANzgL|J%D5r~`&BCeXfq~%rhy1KM=W~^Q$z87`Dg%cQ zCBxb^_@ohQm3ANBw|u-Q$1 zdpSR(v_8#R1RI=#O(^ACL*28Z9mTBG$GWrI>;ym$6Tr9@h?RZs{i6C~v;-0l6MS(; zn|QRZ=)DFM%N)^C)L(^HLBc&T%f(+-vHCbN8wXi@VYYgIlVAF8oBT=Ll;yo7Cz7(< zd{{*hSav>+m(P)xz;pVYhm7ZZh!QFb5tn)-LTLaBktm}z zD(-xSrSRJ&&B`B9>5rNP173#SOrsv0w|k#T0XM)dNE&8PJD==o^mK+*9GtxckVU?% zQTYM(CY>Zhl#hYb=SjoC$X)6|4rvt02SCNeW)t6|%dgD&ae?ab#H#*EvVryqX~nk- zTINfqGY2U6I7_Xc<|`Y7Lm}mmi4kt%m>CK<8?Kk)7x8y@l-JVkw5+}lOyWe<4Ha1h z1KQxZ(Yx_QH36`psUL*F&eBr9s+n^`7dbD)a*3hj%WSNeI{`QEeg4IX4Lb)A*?w-$ zGLU%pVJzP8*Ky15+N=ZGm0q~Wd%8Cj1LPR>s?80UUHUj+$>+Vnxee)uP z0&cA}IUB;y2q#U;%0nyYVAFK*1+d6?wSUeum32aq%WB(tBqK?e&jR8DdK%q+)@d-Y z=w1U19`y!1AzuRv4YL7YO2`42(raG|A5Djyu*_jb+Nw$<&D4Q+)Sm6ACm`Ruc`Rnd zV%RI`OYJ3lW>*BA`IMb_5L2>l(GG}oUjoGdtsP7a1XE=yVd`Kai1PUSklypET)SV& zZ1BAY=N1F1;Y5O1lBZbltw_aoZjkI}DFf{SgUd9_Y6P7079syysnDW(fO!+F!O)@<~ zYd?t$;-pH-i=4v`zTuDmmP_IKkrxe0r)(+BUVusoAGqy+`}pnKP}(NqU@@qj;kWab2d#X*BH4Ysv|7z zztf{vUvvsC;(Y69E8bO!@FM*qeUCmtd5OTFbw_HA_6o2SuS~Hsz)JPKj`r!goK!rV ze_6>bC*=@InWDnp+-d?yN~cz%?yR=Q`itE7Q`IgeLY=H!he;gI-$OCq{6rPtLfTlj z^Y7Y_-yLBd{ao&-LDJhd;;-<=j-dIX7Jr4|EsFj1qtPQdFgfeZn%H)e9$NVjOVZIY zd9B=Wr(#EHI-7H^ej`rF6g`Ar?4x$^s%tJWKTL0iEN0q5E&SK^k2KQNq**@R!-{)q z`jchLLdVYNI*aRfm}5=E&1~*3OIj3LR;7djFV|A~9H!WK2X3z-=(arDk6kUW2BoJf zlxSsL3QZbNFr^nsP*1ZZy!C!S8(t;gH9^EXuqINpV=(7tC`koTZQ?Np^pB+EEn?RJ zIdS~{3+(>X?Zhl)Zwuz@EALxNIx>M1IcLl8&OionL>8c6E*4broK#LjzIL~n7Kc@F zjPKfwU#@eNL4p5R*+g3p;85T3v11=v{`|}Umu-9D9b&>(e*xPK*99xaw*gr-%}5hm zY(nwsM{4>ZN+l-VKD zqE85jS26$r8x1?H-SManQkJde@XG{EaL?r~>7H4aGG%w) zcH7#S?`eG-tqoKK{cc9_+MEefWgqW%ve;Sk#O7xvjOHthf6@6qciRb7RFYaulal5C z`qC{%O*0yKW#VnR=xg$zqtn7k?;Me^yF-vl@CF2~OzYcC1n_3LxHxou6~DV$6hPm;PgBrBEV=<(cErcgLt!gPq=qbC#zcEj0ehvBi=;e~Wlm$$LA{Le3!f z`+F<@(iT`#mRYx7C9%6b{D-o1-zVDMC(!WM9QqvK81enGR4*71p+ zN%Lq&38L~AHT_n5|H3h_d!3g62W1l(07f!vA|Xa^>wd9CTas$8w|N#!q4M)Wp5q|N z;Bc(0=zGVF2&8ArvvD5-$~}^^VIwgAi1w^DTbA4Lw1&c9d*u&CzH_FAnYv9c9{NtW zq}PfM9TjJivo*|*o4-D0x?&>V@AsAdihlwd0gvFj77Y^{9YRBC~_ZJ1p;9=S7Xy>6CLl9wCX>el+;{1Hj=qz%yJp zVWdy~L|ZpIee(n-@fbwrWmnOj=KdTqoxXltwej5I+?55A$m!*BaKI3vf81{&ajZSU zz+K4Q{M8$o^rn8f?ySopBci1X&E?DdS61+Tc&&%gmPdD2Vpe7!%!+@6D$B z6i?VUuL~ zJ4;-2NyBeQyxgo$iqVbr+Dhdr_?kWeoZ9-6xA!t1DG;6Ry0+|g1N+|INu8lvNDl{d zWMd%dLEwkL$63J9IWU((1pZYpgcRj$Tj53#{PHT?r-E=px)PL8atsPmG^)eXwD7NE zCyV4TD*{wN0{poh`{Y~3LRp!_bK>w`euy7%SAg%iSC~0Kz8v~L{|6tA^HYU)@54Fh z&S7wq`TrnovPVG#i#-DJo!2vX#pfYphT?#Z}C};t` zA9|{PHU0b-dD}`vesK^J*i7 zcL18P(#V_)hrS~+teyXR^lDU}r~R17s7F}WzENmY-);Ebu*pJhV%Q!=M6r;8-->m$ zv@Jwu|Jsz!5}(HlbB#Zf5581Kv9O@a8vUm7RAr|vCE}Hoz2@6x2z@Q;SXRG*NBHcQ!kuua&* zr!`m+i5n*8smyusO0p^L^~+TgPC!MCYS_>_XtW1U$&X%S%sM~$QA{(lweTY5GH;XO z_19TXdJa!VOwGjXUnOU9TqR>R80fK((45-;v3&|BzK(Sl{9h9ArjM_<$L?Qa18pDJ zZVq_o7lp)a7HTDi$E*xe1^3?5r&MAeL2rEni=%$2KC`gi@NQ6lo!JcnsnBcy0vQ!GS^s>K&Dmq(q&2Ob=dd1O+~ldJ^1Sbg|ip&O$DNZl)dIC_N)*#uoL!Gr7Nms||C)_WZ{44`WjeQ>Q5 zB)Y-+uR5;gJG5^8^(a=xeak6h$a*5T-ybNL%Ui)16fb;=%%@nC$O4;yk>_Y4u*O}! z`hX0#Hw$C3N|dXjZVvR@F)aqCZ{e|L@eDv>k}{tFf1}sF)LyT>ls4_0Fi{fYaiWA_s1fg{?}Ufd&)1dS{%F&8ZNucA{a zI7F`oh6Zu)?sX2Xp@5Q|{U{5afK83y(;n!m-QDm6fv24B>8((F81l76f@8I#dc+ch z%1zlv+F;=H8)z|Ppat~G{-sr51N*U0pQAcxU3fw-NcnDne(gsbPvRS(4H2pRkEN07 zM9V2%GZP#4b>~YrV_6qN!E03`lMV(yf*JR{A3?rP(R=b3EPBUCf#2%!uL%5$mmaL(Cm8&74Sbz9i$i_Fy>)>zDL7Mw zd9;t~^%WsC-6|xlOGZ==D?bem%khYAPntH|lH(D=vEw)(OVF+;1G?gz?l*(TFEevv zJCvM1CW1MQ?G1naO7YtoeqCK(6NG;}7U_KIT;|O<#4fGOu{h(8)d3u;vX4 zRx@e^tiWxq>lFlcC_zUH`ZiCW9%;)`OB6sZ8SG!--ZC^e;a*kZ< zXpByaDtFF`prJ`({;f~`QQ)|Si!lM{NVI1inZd7xZybVaj%m|@-zqHEyB~Z7KeW@k zV7Z8OJg^8d>2rkVOYo_l)WWv^3(icT2*YSO#;lVD-OU~Rw=1JWI{i+f(?0oQuz>Zn z5$<5no~wVy%#{ooXlCCJS%lnzNo0uEM~2Yo@fJW-mC zqh4n#&7xIj_iOKY1l|ydRssb)5#Qh~)KUK-wjYXgNItn84L<%f{LizA1EAZ`A#%`#WrFo{f)uTh{B=mLrD1w5WlZH5 zw8PahLckAxbbJ3|pBV(oMl1s%0^k_iBQy;xPEa5*0O60gPJP_h!dXmOV^SX0Re0rc}f3*cw zVu5rJkH;S&F;qQ9d^P)t4;yxRCoMM-j!qaagb`v|>w+nNJgOuVQbL6@$U=wP``)dJ z+1jQECO986Q2SkAfOcTzU5vj!2A| zqs|#nH%QwZZcGz>W4fUYCLO|MKGjNLi$-qc?aG4Cm5BY~>w(1ea%pnZ-Dti5@FT{t z{&a_A>kUsJNUod-lQm$(O1?Jzhn)J|#!Z?RzuMw4*$*e#0(}tM?YD#=)NjuG2cg~Q zV!bMm%*fftN=guPh*QkKRMz*}tPBDyAqsrt*uk)DN){79%)dD)Iv z(4)&vWcwu>7q9jdOtdm`7_w=Nl+axic#wHVxoUXCdh^?rDdd3(W2RPqOk#O(jSkA1-^IsYC zynicrC59ZH8&xY}txg0|T#W1DYv-+$&;Kt)S~Si_V)qk(xt)SEyot+;r-2X*74d2r zx>s3*i}{U!{O$}|zu-P}zxw!4{DQQzJ~ ze_M=z3P5u^z~gf7Oj#a@1!eWw=#{qV?zPW(rxc%@Tr+08W^Q%#E75fVIb3kwek7k$ z^x_}8!Z{!#l$B64y7vO^2yjywzSWq$RF`+OD5g>2oV@+@v^yi9uwQLu*$A=UR$)vb}4#n;t(z$A9? zg7JPTxI`M+w^`}8**-6IJWq2!ZGE2>&L>L_2UlKD*iey%)OcYgGEJhwt+_U z;REq?fgWuXPUSQ7^xL{cnGu|+Y=Svvn#Xh!*XcA^s_rvkkdpDXm^uJCx86f@o`all z*F8N8R(c;XoSlR&2P&fX!jRngeNEo?szBYJ5hN)py9*}uY^mLUevT4Z@%k~?*Y5%W8%EecaVWjgYN}yj z4Z6cW@at)@$oMp!_fh@HGLjePk8hnmeqR(hdkIMl?$9Y_4q@TU>4W9>EO#Y|*sq(f zuGVw7jA-9p`H@{}%CKJ_Zh%yunfP=nm8G39f}GyZEYN*n3bOs2Uz*F;;95=%$d%m-T;HRU;y=&==fqk+iY`C>Mzq* zyzJ#_Ff_6p=g8qgBdh!hv`WoR@!`2J-8p62r2ys{nZ3?U!pON2)*8Dsa)l{u%`LL(qYO|He z4wHj*7t-nBf({5%{*pHiq9TtnF^KM0{{u_I?G?GLQ!WfKkibLZZvv0bNca18A%oa= zD8xR9D}r8BRrUJZhd`Qf`tyixY1@3}FBZsM;Fm?AR|_vgL*DB3%NsuN2Gz7Rkt2ff zw%YL7&)`t)u~OD$Wbt<#=oLj4({j|$XP!FoF)OGbaX_(4Cr9GTQSmpyA(*JMUY|4n z8;sNAN=OahRRaeNVduzhy_}SR)1Q2lA~U(IZNTO{#W_FZx`%j zA4lcWwMt}Dejt4dTvGyJ9%QO}{A(&iT3rqS&X1%iXmzmh60_fwsoQq~tPY@Bhpq_) z(GyQT62&Oo;G#<&k}Jw~FCFZf^aEIr76;}UuxIQ)$oF5s(HcOW7{E7mG#9P;pL1s| zTiDo`Mpww~L|H~>F37cjv5-zmZQpuj@N`So0e$5bFnOim(j85vALf63vvd&l6XUp^ z?vV2bEL0svPGYZXxv!RV@lcy~2#p&|6Q#+sQUd2n^^&(q-P(ZVO>;$Ocm}Ur#;<#? zPo`n6XW&_6Z@dru~n~1XT!%7i@_@76?P+%B!(d`u9kvjw^ ztbzezW=0Hb6eI~=np-cJddWEYY~ zH6x^EgkwCfQi3r1iWsa5@J5xO6z2MaZmP4ZuH~F3C1SXlJQ|p$B&VD>fiaAP3uk^Y zC+>I9=xXLHL^-}+6}y6u@rjiE43W*Hs^LWth`^Y;xkV=PrMq|vLugTS!# zEsvibo1CnfP9bfE5Al$V=_o-?j@twKzUJc ztj-x8Kl*z`LgLGViUi%)H0tZx*}j>vMV>^h-OZDR-Wq_`Jld0iQGDG z%ydGs?TkS)&eVg>TYplIStTy=;My(=X#Opl7b^|HMiK%FkWOTsY_C9EkN7*VicY)U zBNSmW;sTq;ExEv z76A_yMkkU8Rp@3lt7qHjgY%ss0-ekD6~u0tbCU7DDo4hV{4XeHdy@04Q&(KQQG%x2 z#JE))Lun_ow<-NFjL}JtYX85>c7NC==ABBQ*~!nxcOi};?#DNvF=yA|+*>zDy6>$U z3U~&dY!6%ecEy#&o0M^}{iZq9NOoJs;mi2^^2D1>+r%D0o)Yih5ux=S1xDOeWv7qzY{tceqP-G&Em1Xvbq@)L^;WyS^(!L+ zuLTHq^y6KG5}%D?ePdQ6Tc@e(Pf~B}Xq#RJjHlVs2>_IaYL7Qd)d2Ma<-t}0P(Q?? z6#@T?LiEpxr!DwSEbY=Z+7~YIGySAM7D&Vl0R+O{;cM7(uYh4xKLxBXxGukaA1Let z>>C2-4?C-d`X-{~Y6wAGo0Zb6e~){OOv>1s$*=*-mHOk!#q_G`c}M@$cVGFCin9w;Rmbqj2qJ2GBd>tMcmNDf`gy&1XZdzDRP~>H#Keqgi$)x5y-lc8uN7 z(ww!u)h7Bk-$*?u;W+4U334mPUw6w{xToKUA&xE#_bbQ7h7+}+7+{N4tW$K-xZ zltN|pv9q#o{W&-OhZPAmKI!bE0S)E7Rf`LiJ`F3!>D^R*B1h&ZL8JJ9e?^X@&^=Il z8n!qsK#qQ7wS{{OfqkpcLo>--!&||~zLw*|R)&R=3W8|w3b|*WfwacvAIV=VY3vg| zxeR?7!hDFP=)VPjOZJ1mGnnG;hCAY@`+=~q-LjC~Cuk<|reW-! zDfhRw2Ws?MO~n?7yO2KncZr>rZ#$8FId5MIL?3NwAEJ+j_vj-RSWUS+V$rO=_|No_ z_uTbYP_Gnc)7}cC`L-pK<1UXan!(~7sOJ~mtv9L&pYqXnc&Eq)D8jmoUsk*zm-5Yk z&~M#qSAmoHq+QPY?%-l>%bcW2yS*I;-<8wkX@BKj8~tPdNylqqffbG$Sjw}FBsVT; zJV`rQ;2TPfMod{hDrd;TF{&-iuT<6*iO+4bo{V8#IjBA%UVZSToESb_NI3$?<#1Jf zK7^k{Wh)sXcl4jRW3;XNE|^GkXxTTfJev))G08hK_}{w8xH?wMxQqJE>O=QI9Aka_ zXEW{}Xxhh`m|z$7HXK$|Uu(|p$%(6G@gBs&j{6zmz2OxJD97ye5m;PLTDIR>mHh=E zQ#;?MfUlVZJXEAy$3Z3>1r%itFzk*}fhGbQl0B=)i@y)tI!a@pD%^n>#@BEj=3Q9% zkX>3l$Ms{Z{9PTh`&zpJfZrn;0!fc@r@WH2}dp(mKF=au!!Cl~1j6bnB7cp?5 zc(B`YzY**^%OB)j6ibPOFo;m;!UMN;inXf7TAhW2sjxeplW8YPRr$IbOUUAupCZHV zm}IA=R{9B;o`cC2qVc(y?1WqH8~?Gr!&4LC)=m<$hMvK1xDkn2-n51bhp_G8s9RuH z|I1uP;GoC=M(CYQcE$Nb>R^#gDlCQ|Mh@qi39C{BJNu-02gr(_dI82!?@BP9 zxtCK2jfz!u%Qcp$*~2$@U-{QfIt)>1L_ z*nie#ornPPkN=;-tV^}d?;C+{wOOn5h1sk@l6-P2q*MHrV~vY4zb3;neBeV=F}-wJ zjmd@NB(Q<>74EBIKq-$gm`#beq9Q=M%{EyEPS}7i*UwNZa!%6oAEDL-C%8$)7-)kG zUPJFBC4ns&z#GB-g*Q64u3uEs4q7OQj1Cj(sQzTs=ViB3o1Sn#wnh;+6^gUX5DHiaHC{M;1c z$8E+DbLngS8(O3v*SmE3m8||t{TqNRl8t|wd}wDBvVqWwLF<=$A=ajeRcA7OhOU9} zSIpju&W+qg8kYB~WTr<%iMl`n9rx~mJ_@)%tT8SSUEu4yyYn4TdHXI9b4xJC)UJOF z0KI5jax4{GVc!)IzT}CxYOv%rU+-PY1N}e0tCPvBB`Gj#83VAEk%^;O`Ya`QP{33{ zxgJ^Aw)3w$r^vaz8aakF>)jlm?IG0njVl%60}CmPTV@-X)1lJ+AJ1O%&ezlBT%JEN zNg92iFcU8X$7IS5yQtnJus4~x0@U)%l1C9FcYwhx&B!V(JfKDL1BE}k@<^*6dA4Oq zcS~F;*7KF~W_JP4Je#zbPkiFHxdr(4;~4DnY)F?f0Yb(%`R`M1mlO#il{h6@cn11Yv>WYP>!j z%l^G)l)KD?aQmJ8S`;nQ(}oBEOU-x)DLQT+2eydNdVLm+fyLLVEJ+JAJYc8EA9~PG zAr*;Wn|Wuwsa-JVZ=HXA+1Hw4Hq5>e&_9z1wq?TqchS8S5Z(KlahFVUr9s>c zaW>BrK6$5*;ED?Jm=jxpp_Ev z&rcZeAfh#zlFm63Mah{4KCw4f<#wc8R~FBJWurq&sRen!gMJ^yq-b%qIYVIlE}*w?)B@CJsO_Q1vc)0F4$?((!$wZ1ak;lPt@`!)q6U zvO?3r2aRB62zwv+>c+pTvtHPGy(9{@7s1*$vieM3n(GImBFOFjFCHTD7dFm#e7u!r zKlt}_tk?f8cS~CpEXh6vB)TXc*4m#8&HKX)%{qpmnet6<@+^c9aP@4bz_py5zgNH2 zf?H26lfWnZ;gXBug>#b2nY@tE_BxZ$V|F4Mks!&eiE`pr*O2MUh7SjbmU(8cDl3z% zXlB?)cS(?yT1l%ru(iMaJZ1$E3au+=bcY;wg5K`O!}5*l=L?ojwC}NItX`9OE}^xD zaWkf8;@l$0&E&Z!e{~ZZ8V&ehV{<(@1UL2qCe!m!$3pf-%3*%S6c@cUVBvW#i%R5_ z2oo4sV+$8hhu1mD0B(c|;d(I(osYyDBJUq@;z-e>{>jk9ImTWX#XvL>=Eu>2gCi3j zeSb%rgTRRp+os3#MA9PTK}AJri$^!r5aJtOgTeEugSq@88A~CWt&Os1!gt#OFhCFE;q5l869JT(HsL{7&h&*7I2p|47(NOzq{J@{6kxKl%yYh;Ub)uJsOCMoEXpeSD-Y(-KN;W~) zA7fOdi)lT5DX!4uVua&^5sfITNod;}9;R7VDcwGU$#BGitapU>_(vPs+7uw)*%cl!oW0Y5L^?Fy8IBY%6*&|vi?IyOe&OZ_Onto?J zZ50(I8dktqUGK%iFjlU7a|fNYGH$$np$Gd5NM!#{toYG`?Q$+#tHVk#H3*XoBV1w- zKdMvO>Rfl`qK0=Fi5}&G)MHRz2B#I+Ysf38Nwo9A|AC!xT3L}6b}QGGhEq)Jhqk|L z$05n6gUd{$ESIFv&0;q4{-+FF6pOaUKdf~%;pUD%j2%p!n zi-@h5lkkk;0@1&m_X;om2Y#+8xxW5G!+I%K-Mmym+(_k-Tf=m)I9igfLIOE(!EY!e zZ?ujm_!rdTbo!JD@8W*NIiE)g5u;(xDd1^mwt;Vkq1+L!HrAuFl6xMEtMA_{=XHDP zqliK(=ToyZ+)Fgy%VC4qAgcOI1AV!^`ZlGDWbp&nfbVbm_!~dqvA; zd<&!S4m{v7%W+qyz1b$D zFc1}fsm}*m`7dn((G=o=TEp&bdxQ8|lK$@#$Ac{9GShlDf`o79Iz)7K9A@aU12V?K^N;El4Cvfr71TN%vUpTHRXEM- zuF^DqkF<=sJXzS>*7ygn4BkGC0>>w2VHJoDZBowOx?3ymS{r^dsGX@FA#Mn3_xi^v zd2zw_{y@(OZMYJ9k%-S1Z;x=498KW>uF}KY+*{gr|5uZimmLS7=Vl9(b#pSA6htZIlspH3k|NW3Y~I4VfI@R&BD|gYTu|6ONZi`uZ3#oq z>%))d;vk(in$LlceDdl&KxPj(FXW&vB*Cc{0^N-Ue_Z?6WkNiQ9zO{V3+aYIN zeBIsZZ9-x`1kcrk<4MyatC==UZk(9@V7Z0XD)Djimb-XrQDE^XAJqmoAGwR$ZQ0tX z#EPrKyV$edk1C%xluMkrUy9#*Bn{tO&VY`(PbC^LnSI~pR6&~9OVP`k)aCYVoM#%1cFXzR#IvGDqhHZznxWhxOcLQU3Gq9sd(wg5f;6HElhS)lb zyO?(4h7b2u>**?;Dk-LJ{t!Rf`hAmO`0j9YxAijEq3@Ppx&W!RT-Aic3+TR)kNd8~ znK7eDDi}EG0AP!=i)+1BB&g997(i95e2Hn(;Nhd~o%B0}+j>N;(&)ap+@6lB0zf;} z+lO6AcEm5s7l}Je&$mNHuV8wbS#=6kQnE*IuijWieA0Ok*0X9HmF-UpE6b_#1IDcj z;-`9N5&bM9hUu<$*wT2kU0K(dG3AzbiSntr9vJ_)|I~R1Ld8F1iN%b zc6psOmBk|16CclukLss8ee}O-HT7^`tcf7)$JWC;(rD)GWa?ayS@qDMQF ztzkQ-At*V^oDyc8Wk4*>X6Bk&_D~(jw$Sa6Z0kM})IK!w_}ANIWZ`; z*j@YFN!uAW`PfVQ9AXhz7T|YJ^~shrlu>Ab+L`Hu^i9MS3mT!mI@e(hZ1Trh-3FJL zwShyCauW;vh8BYDg<&HFqm{s0%VRIF5qU>&Q9BVmqyy)EYoo1CDD2O%Mg0vc4|^Uj zj|8-&cHMUNPH6%qCY&~*H=6&E3=hj@`T|EM8G@&nk|T|VGg;B zVPZO%n3)Z_SH#{x$Oee0?_n3rr~en8qVZjFmNjep^i}!KP=Z@gR#_(Fvf+dO2X-s! AW&i*H literal 0 HcmV?d00001 diff --git a/tests/images/svg/miterlimit.svg b/tests/images/svg/miterlimit.svg new file mode 100644 index 0000000..82b9a32 --- /dev/null +++ b/tests/images/svg/miterlimit.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/tests/test_svg.nim b/tests/test_svg.nim index 8acb6d8..562c3dc 100644 --- a/tests/test_svg.nim +++ b/tests/test_svg.nim @@ -11,7 +11,8 @@ const files = [ "triangle01", "quad01", "Ghostscript_Tiger", - "scale" + "scale", + "miterlimit" ] for file in files: