minitest-reporters-1.7.1/0000755000004100000410000000000014661605652015442 5ustar www-datawww-dataminitest-reporters-1.7.1/.gitignore0000644000004100000410000000037414661605652017436 0ustar www-datawww-datacoverage rdoc pkg test/tmp test/version_tmp test/reports test/html_reports tmp pkg *.gem *.rbc lib/bundler/man spec/reports .config InstalledFiles .bundle # YARD artifacts .yardoc _yardoc doc/ # Gem-specific Gemfile.lock .idea/ .ruby-version vendor minitest-reporters-1.7.1/assets/0000755000004100000410000000000014661605652016744 5ustar www-datawww-dataminitest-reporters-1.7.1/assets/mean_time_reporter.png0000644000004100000410000017764414661605652023355 0ustar www-datawww-dataPNG  IHDRMagsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxUEܚzS $${YPlZ]ݵWT\˺ ~( % =)7vn{~s1wfޙ;=3bzSNBEEEEEEEEEEEEEEEEV@EEEEEEEEEEEEEEERDu44QQQQQQQQQQQQQQQQiiDS ں\L.L(Vf |<ۜ >2tB gϳb VxѶ*Mڗ?/Q~GxrI,vOEEEG[<]Ϭs_C&0taU>0 /kJ픾Y1b,Lc`gӻ㔺<#^X#N.\30/ 8:Mkql1FL"!NFj89Z}S[Q]sWLAxIɬzWnb'>> 6 ]֣1iA x \/@Fkj?J|zy"wze+m#V@>Z`f-h?tRmt>=v%XNHAv1rsoG,;MV:w%r ;Iٻivc:8)ܺnɥq]Ǔ @60(ho>`+Q{&iG):o}4'W̘1 zEhpqv/~>\DO+/7bN;ŭ$+=r4vi(Ӑ|c "mXKfHyJ(G01l,Xj#H< :JƖd-~^(R ޗhY@44\VIRoCvˆT|wEŗ:оTTTTT:Mzc}\u7÷C\ <`9WX~-Ȯ"(F͹{9_5a:w.2SJm^n IQl>\Ԣzz~QOGD dDCG:'Jm(`kI@**m9!}ݗxVIYms~!vL"{Go :s)d `^u)mm3gc\ekn|BGp53HeFeb DUTTT~\2L0>N#pp.p九%ba!#rx3aVX| p0|ם'> ՗sB˗i0+])UJ_ woM8~(SH>iW%u0PɎ#?j(=lJ^ҹw]2ڨ%.v]nҹ,: NNݬ!fLOr(k JTNģF ASilv}m=] W;R) 6R>](0;`>}g#0xq Ohi&O>+[v^~`F c/D^ȥkvX~ =Ka5@Nn؃e@oFy`q~b+O,:Ջ$9rvHF3ruRqj?Sÿ1^~dlt{0cn#bP)ɸ,[9v+b"bHxN ~@n؏]CȄ͙ *6S% |a1 ˮub2&rf۶9b1oX*Iy7v'7"o{.4 9g ] ^h#:6}iuJu]:1,st8 z86cX:#W7cpdQn'nC|mRm zK'G)5L&ٛ^܃!Wق>zUhWVm7[KXr,s &-u!S3ɯXP_[dfgB?>~UҩW$d^+ִ=|ַڑ \tKftq]: {%yW,^|&^{cʴ=/-! 9}N c+9)/qGdnqOWEEEKSð@\wP } iTaBO8*ۿ^2`l3؜ D$tFlTJ$wT4F'2f _=W30k+V!aG$Jc{EL]qMX<)7fq ) 97-LQ)s/ۊ .jɛK~s7G^E^SnX*.ĥ(WBΑ ud0ձ+xv؁S8ܱP7RKiio&8ij>+'WprHe)?=xoO~ٖpք(Շ`+?Z )=u C,7vK9:Ob0~Q؎NIq2 'cip~k6ʭ=l t)9uC0jh_ /9epPx*>ˠJpa?Jwe9e!Pi"ъ#.,I=CegyQd1}̻KChHE"@\"|#<VrzV??%ghuqrؓپ=ї "t2jE`)sv'p #o˧ĥW (haIN6 ݎX7%ՔΘEck8w$;| WiEȅRY'@HO`zqd$m$o\B_·M (Ad4^yS]NAJuWIޖ~1k{>wOwwQXKA%'<:`NNZHdqdВS>{30=NQ -m)SXI****.p ]6T>)߽=MA~x/*O 笵Y- w6X:i Šu{,grK:pTPeBk+HU*\n‘qGT`@ ~e2V;"a:۱Qq)rLfLk+.kmg.(b9-REXkE(8Gǡ+Tj^n Q=ѱH l1#:E@gy.4n4t%t_z 'Uwuc_>Et\~ :Ʋ+':%CZ!OT6) Fka*–; މygz8$\ڠI>w!h}P^2RUηN f$#_9sIZL*;OçҤ^1,g Nqn4i\d[ +E,e ~=pZj|r&_P9HXvvu/=ºVEIl<b3 r;E_]% IdQ/+z h!7ཫx,qKQ-Y+LgҿE_Xu(%yЋ5=0 !<@yUE)mikl[rJǷ6*$/UQQQpi"a\4zx:w NȑU; `bo(TeXT'8ɯ34ʳɵŬ!|9PHq5A.<ޓmY{=|e|nrCH a\\_G۞~]oO+ߐވWDAԶwe(E!w-Z`?-EDCԕ+_cGq6v0(`0&wޭX4IGO c!GZbKni{3\ʡO`qLe2{:QM{.W[ަ vdQ)% z:::G|dCB!41ج+1(sOz_DWR&󗝥Bq[hApjS~+cos@s<]Q$ ѝ)--E>..[)4vJ(‘֗`Z+ŕZzm k.lC 7Uޞ%k!ArBНj8,!BGS$vM=h4\ɾo=h0{ u~rVS{~嶓~Q-ϧƬ[Pl +*-Th>~FDc****'tyE@_y n}}ݽ0(& 1$vؙ &Aw/4x p_;iygh DDtALj"=.xw??Yӂ ͝ Ҁ' 8=z |wxxzju ?.ǫ+c1XO!b~y@k!c -2"޿+D-z^VGw;pJQhd$P!+˕C);6I3'v߯P}GXG4o6a>/Z{pfY$E֙7ŜM7p?PgE5F>TH$)QV4 1ح/&? ؏skH\Ľ wgGsEP+ m&vUv < ՚&o?i >/HޥWAc|j3\L8(9{/Woo=ΒdJCAe }"j@cMtL Z+JHVjq<Ėta6cF^DPi ?mzl#c;o>qnXkbd^ç.t/N{z_i6/EԜ9HJo8hSLelqx~aof;ƖJH3 硓dBgb=]\y@J"8Y7=\oɚ8Y'g6efc_imL !Xpȕ$OVh37>AR[˹ Ǯows}<;ɟ⃣X'Y!\^fDN$Pa[p !>Z8/⋪WI՛i.%9dž!E(k8+5p[ۿyƇ+%EȤS+v P"t{6~O1 Vã[6 Lu4x&e@0=6G;l5&΃;'>oW[\hC{R?fE\y4L.Cs?cOޥp0Q7<uC稨Vi****************TJ#NFP&*@ZEEEEb"v!dDE2UmO=̕tΧ?m83x+Vb_ 37XGxrI,vOM66+x;G\vTO_|@2xf%z0ELB|qJ= ^A5fւ C'YIo~!ZOCsGx5ף11b,Lc`gӻ㔺чndp4,'n6rI9}Kk^c4*PEB -ү'qr>}:Tq$c9#\R_\s>R s:*k61h0OfeV(>7>Ҿ2=g)Ge 3%iY IDAT׭gOFUqy"?؞9GuY,/9GW^ưpQwuc"g0Ě2ײz1ʜ|#|oí^yQ4f&}^ek&_]KERGϥ~봹lzVKEc8M:EAJ}` Z5+nbV||%馡,k1 _᝽(?(Wǩ~C,Pwgg)y(hTdƍ8/L. _}%H̽yWxwcmwdn/|vRzk}xAsp\2O,(WQ3V]qYR*o.q;>? Wfǃ/;Iٻiڹ vЄ0?(Eͥ[Ǔی\DO+/7bN;ŭ$+ dG $hOci*5X4DڗVB91a ogRXGoKЙ0yۈ.̧OxdJ&{_e.Dksa0?['IEȾQ hB{Uc#S!]tMw_/Sw\"ڿ*uXzc}\u7÷C\ <`9WX~-Ȯ"(F͹{9_5a:w.2SJUk쟓(pH'D)lNc~dm Q &'=|ػ;R GqhwH,YPӣ%lv${_[e$ 1KFnfDku$!bN[ W/% ?9 -\^^qd{syu˼E=.a;>p1VΓ:.@RzD/➳r땥.c.qq*k~vHSꆏa:Ug=#R9Ui CdƻH"(<hÞ v`g؃a  DDUv`Vk(s6!114U$~An=F=m%'0N>=y.C%v\?4@U+ԙ1O=[۰eiDO4jp@Ƒ.)(ƞ"0$Q*}+Y9!)wȊDyUV Ȯ? 9( `P/uIP>Ō@v9ݓɞb`Ҙ'pG^Ww9"HsȈ/CyfMـ+o@Nhz*<%f.Օs2e`>ǷW8SQ=NNG,kXĂy:3; znHA]M݈d!q % (#^j޷Zr\QtӞeAķ>\ 3~8cXβO,@K,ԇ.F4r2⛵{ȴ|<DDe6|% %.mitSȶGS_ d=f-.2v媍/GYxX5*hGƷ.tW^3]Tf$_&6h}rK|Rס-4^ /{m(=c1u& {]e#3څLSod<ڴ~ _?MC;H@SꋟH?}x}x8}S0+Iɼ᫷%Ԏ `ࢻX2#Wק@G3O"iogM+־ }zd?ZB/o~km_s c+9)/qGdnqY#SY"WtGKm#a=J*GwGm_gg0*6>&z[dyz9>̻ -~JnY|b aMXģ ߥ?(ؿ'RUGO)FT_~6O[~ ,d/(uITű-9Ua#DbeOt bC줞.?y:|J(MI3pΰDYmmL&UJak RdRWgQ4 @&߷wo7A&'.a;˺a]+䎢$~VDA1I_"/.\Ȓ$nǠ,"b%{6Y ̾]`qOh_dnYZa:Sž.Oگk(о^yI Kﰯ*ykڼv|INj}*d5G?OD/F*)9=A ɫ^i)֓?'}KЇ` rؚ_nC؛OL53I$*K*[8W7U]zUiIKrۇ"&EWs0 \%&OA>' gk.1Mlr>t1k_#bN'R\5҅g+5`.Чg8g&2xu!7}{덗)yt=|@G2>o7Mwewb4ޠC"Cw. F(W_m ׊&l~5/ʒ|:uUهbM&!4 4{ htxKc\Sjk~{.QcC߳~ZcD.KE\Yly&fG%R7s1ΜG*q8xx!ٚ{&&\hL&SUɳeg).Eܖ/ }iZfjeL"m}.'\5*da S!Ce+|QA]T82mHJq&dFh sÍDUa2'3yI$Zg\cDtқ>#KHI1{S8d@O`?: %Weo[Z>^vGᵟܻ_}$zpAf)l/p1+-Oi,;O㧭x^>~ 'UZ$/ 3:|ms&)̥w_-7#t"z9/:NqO͎ۧ.{A=dZ&YAÈx_ b 0 'C(KGf9^Wk^[r_wk0 I!t , jv&CI ~0chþp_;igh DDtALj"=.w??Yӂ r<|gGʀE锸"~!Zd?Otzi@w F ڞՕ1G Csp'>0lz/2X +`hI`u ُbJ/xm-,sZ˱ߙV&p&qY\-ٝ;P{ {>4c.uQ?D-z^VG^0GgO:;6!m&l胱L"$JO!lM0ah|iE^d 5A#g6u mO^@BGD=N&-h;39UurIɻ=Mo?Ȁ_!1^]pf<|S'chy*9; a|9;ښʁ4.NADۃI)?H/֥L dڬ{d]gz\FGzt~{#ʂAT@Ճ>sM#}Muጟ6t"p6,E΋Q|nNB7j/p傰?. e&ǚ.k>`B'h3~%bMo睒]b|(8ۍH1su~cWQ&P[[?spac&W#9)swkÞˉFO %N5UgI֎C}TRP`'w4-Y2?1t5hz1adP9M<"A&7@h)==ڴa5 YpVX0'wX ggC2#`UT?'3^i6~1,b0,^Úz6^JjfϹ'pPr_0XT1us{Q __: _TH$)Qi2ɥo? ԃS#![^kǙ/{)=%;ɽL,)x8 ɫ51M.}Qx~V? ؏sk8mzN$6lJ(f@ӞČgI2%ޡsò˾Ոgyh5 nv* h|6t 6Zĉ-y5lB0lϡ4~ۆFJ#v|qva϶?1½ O]\KK'fwZYD͙([64QƖf*DWn R y1G-"Y9~'dC=sl9i";!d Z@Q}|^ ]_8b%Jokg2o}]Kux9ى;RB`V?+%²8c; OQ M<6ĥW箆ǗQld+}.'.G*>Iܑ\=WLi*F4%ykU><U=D_#r1zzz/1X6OR򫶃z]2Wnhր $(۳Ʈͮ=6GKwUTiܚ^I ED`EUt-b/+*i¢H !H& PG̙wμs;E'è'a4Դ `lp±}N.GCCCCCCGÔJzӰIwsrrih`GX?A&1W[k\0]s# ce\UE1=(iG_zhhhhhhhhhhhhhhhh\R\<4F#hN F>UR{gA/}(Lv&Ď_vAr"VL^FY^t:#eV @gs)\vP;I~\2ׄQf+{؝ek6z !>5W444.Y|=GƲ9 IDATr8y)6ud/U|s2;7n'!<)"ɍt@"vUL݋0Oٚ֏Ljqyߕ굩g^}}3f~yYI8̱֯Jt = } Gei ?(k;HC' Tm+$^T8ER?uD1oKy]ɱg}ϝƐh ܤ-wҭA?X d0l{mbOsCu~ #F1gdY%[)\ϙv61qtʊg>$cQk]L;TʎBaNI;,9϶:?.61Fi[ XK!g"޼cZ`?8(8ȖkؑYӾc\O%3:"tlc`2wÀDUqV/i 4  ʬˆhF*HXŧkSW'sOQwޝPF4J2PAѝ}\=5zr(:OHQp|ŒJuA 7p=e';'h\IG?3:_~lʙ_>6cD: k?[mXFDh7f_Vi+m_k¼{Fѿ'8^cDj3 k1̽$T-Ikhhh_Y  G"vl, .gXص'!4f^,,X z_0-w*x=lw1VrBFÛMJ`p')V/uKI:ȪǨ7+㉙.*hd;p+1{I;sAb㔛͛8sB.w*ܗ0Ǹ淳`/; 1?"#0swpHjzGQW]}cĤqp!_H:|"Bs,Wv3f Lֽ0 |6(0%Lo!Kkpn>}vJEG؛yl9?~'X8s6#1Cհ&7xteߗ0b#7&LNZ?w:-IMϢNfB)}U<4/xxo<=}vC=IXO۷܎;Y85d@6m?Ol'i"0 c޶5F健Ce1[onG;F2n鯞>>|cȔ.eݤS}P&,GqO`^ۡ9KNMs `*$S(6؞0NT^է^ `l`0c؜23z7WooR~6'q[5ލ+BRIQ̐'$nc<^Oɸ2?>ƹeJwc;E,sͳY0>69c]t4[Qv\כP_ )DgtEM#_ZAYaE*WQVlkۉ"\Α ud`0jcW4ˁѸbn [$#؏]BJdF΁uG ޠ3֩sCM.~pނ( +%mZ(OG؁xSEQ{Y%:+v1l_RZR(58?V5i3V^puor(M9FЁTճm쌏cs*L(%}1ΤFAe }}4Q$dtȇDYnwam?d{&;2n 7G0PC@x~> WS|2?sު9q%/HKs+mxw/yvlْ͈s*OoT|++@!7amC03C9UȀTx=-"ى&ۑ{Sʧg2Aթx~G8| ͍JgڦЖ=։8ZD&CG+l*A?"vH\T<&2h7q CV𞰾=0䏅>xU0NZʳ5]`U58=&+E1QE ɯ.IY6 7P2 EͧW9m8qe'$3e~B8vtKT^~hl5{LLugo+p]T|{ n?W(d**X[ЗgHQŦp-'ZZ?q\3bU\C~#ݏR03[YzC5l?`mʶֿ@F<as"A\NWhXSpQq45e<Yp$}h s돺~^hSzIOP2:5+e##C–G-;щygTAMuk=2lN^ C8= rMN V tIZLHf['By6үƐl0rG*874ir rr(fƂb*L>pz<p2&SI<ȞXZ[v>~V"QĦ/؄9 s2oA ˷PFEBBAedYAAAVDDQPml¦4љafMWsFC$h½W(JEo#ǣп-:m~ ﲫWӿ;e|DUS>c?'1SMs*j=ڧ` '\A R)l-q=8H]+(sB@ϼZD!E@?+ DDJꯑD|T-_rzuReEvhI L䪽}Pg7 x5e {e;I:SG"c#w{ז@+b\l1 > ul{7 8Ō 3'S%ڌlk+Eq9Lii 0qVif-irG~ۖWwQշ υ0b G؋]HR6ߡ Ȧ4sJA dECB~sT3LtAhWEt .iF*gg9".^SH- 2"U$Fs*S~*MC7UqHro9~:IhTUD#M>CRRk1զ6p!SSJܖT&,W=CJFGtY8u"4uge0ዾNG)5YZ ր޷'3ȜyWnLt~(>(AfVa}s(?l)2j~6mEu|AE>jb:smnj/4444 uXwק` ~ɰo7]a~Rxz: n A6=D+'%"bϤA2l7 ew&Pׂ*G8}tϬĎf2Qc ÉM !y 2ضޱNݛ^z@2'c=z| xyb<opE̱i3/" J|zjO}l?O> re [)C3(Y?X+69vj+P;swB5£cYT0H@.K눟PCc41u FƦ2Fi2G[(*#`Fzt^QxGFcå/ (A# (; |<pNݲ{CH 1FE0|Ţ罹SNq#ñxgn^$e&|z Ĥ̱t38M 1t=&MW͉$s_P\:%ښΞS&_6Pλ+'Sy876ɥؖCt% tSٙGe0tW9N %(&ϣ+}gLHcJ73fb0 Z8 ;/D ع! ÈkwFt9a2*,t nH  9}`}ǿg_b,T\;%;6/t0ٻ3b'XWwǧk+{:5m I%( `nxD<"G01Цwk͙B0eÁՙ wåpb=_ ȥ[8cʘ&`ď~|=>TFZJV&ܧno>]\uC*IcVǻ^[ s+GF/W$=Eħ4LO=`/o`}5L,y|̙l_΍p)MZdߒ)uwG{+c\lQmVa]93ןni1ڬmF>ڿrצm^OPGVkb\|Qj[e ꅯi$|>?},U)z[b#π 4{ .0u%RA5444444ةV#`lp±}N.GCCCCCCGÔJPIwsrrȿHq44Z'YD7cMo\m 9T=4F#hN FМ&@z bECCCB"v$xʣDER`BlxY^<0xugÙs ?}ǧ!3o˸{O;=t#<0SSG⎡~h{_G<N^JaMu| C*#-n_L7n'!<)" t = } Gei ?(/zkMdcϘ˸zt CNe3\sZs!Y[(σ|Jfc$M{ `ݠ` '޾HJuQGm@8s1$l%7i tk3w2,ŭ ɔK.pww%zm*W_[  IDATL6BL1@m/Oq-ݼ~o>][e\(M/pI}^&㳭.Ϥ0nl޵QAG{y`Z0_aB$,!RH|YH7/ż2r2evdִW&S) N='+<+]0 Q_KA2! 2VT8Gܓ%^uAjs^2[ ZiwM+/yڇڅ9?4.>m_g_y6 & ^04N^Z5+ofz>>\ ܹEԟ[#IѦkc^OFY/8o_Šx'I-l#ks>%:Lv:_(v#~XnX_:_6nUi-á`#`5 u%r2 ,?bc4Wnɋ_a3F2DLw ERd5)G)/> (TmC| T_@g0bel~RM)0upi2szs8\*M"(,bΐ):Kc zj us"/|XK$8_r@PZ2~:"!$  82HAHMI;ӡi:dܣ;Ϋ{,kJQt֟`Aã.%vyoo"W{Nww4@OЈߓ~ftR%Ydٔ3|lFuLjLuA~5{K%ҿ1v%2n>˯f/GrՃ%L {Cyrm|Uh|8yGOlq|bgmUNcPG3ՙ{I_T? oE7HA h$Sc|M]%}9k^dy\En`¤1m@u1ߧiz|T.Ia<%)_I4NUM`1pt;,k@fȒr]]ȁqjjLifxE2`V0-w*x=lw1VrBFÛMJ`p')Vݫ-:&?'PrH#613-P!sQjE|/9p%|cEimn#AA+`QgcH'$➇5! 8@[t S(U9kݗLJ#UܗL a&{:! }k'|A 독.c`Ls_vv l \Pd`p|ht`+p{u&` @pAzV;fTG yǎ!,.ϰE鶑X> A<0w~'&0FNtHdl9yq/SZbECz'|t;Iɬa C!/)|x/UY0CȰ?V"gT6!'v 4+_guK?v7v} co$W3]U0H֗v4VBcv8笃C)7S7q\¡=6fJU/iaqog^vcx?vm)DBG@a@3Ab1%ЉIY2>+CD]uDXfM浵{a"m-Pa K'/C͗,e|^7sr;3vOplG6baKMlOʼ/aPF^sykrE&';gQPU'JD*Kd|<7>^ڡWY$h~ +uo@AYGwpjIsmND`t<^-mkK]{.wc,L H/̄v,%_*;[醇Mݚz;#ScvS6Ne«99ϿyG.ٽo6*nԿDwUG"O[G|y kn2wJ'jϹh>9wfLtʷ3k0o^ʂQjmng'&@BA M ~t `=!)npx {)$ `l`0c؜23z7WooS#Oڷ)MFP?L=g̣o|[xw˔|zgγY0>wjO~kpπ"#Bn+vUW(.ŦPxLZOI_KpGa,{9=?͎$@*N!"c1`BowOD!sx1=5C.\`K4| rqxW,ݍaR?HW*n[`/ z GO؆ R)Q'R ^1l?RZR\JY)X6SiuR-d۩:Ci1cS3>6ʎTPj(JA߱/3$a?j'8rȭ@snnEBvNG+!eI#$dJؑMЁ}0PC@xx%5''q⻚c7\@k(HKT, leTlɦCTØ*lx^{2q UH 'eQvb8v:t{:%32*6΍KWWWTEiFԘU/0 vl]Y(H&O/,7_DZTdA Ӓ8Y#ޖs/gK~>[?3Z^~!}c+Rs}1y3'ypFCvҏZq̉\͡tqOTگA?"vB$S}*iذVJ*wi\5zR7$ZQrw` G~LѮ$8m$u0aFn}8^N'=a}k{a }  )ë`=g-kM7`e +8jp(zLzy)'8Wb4 wEj;)8^Fa&_u3l0FBKK*_3B7 cF?uoo 5Ciy*V]* TBk+ HֳH˦p-'ZZ?*"~tϿB1g)wkj\fQL\|:U4\6?:%j/?f4Mw ?zi py(€8WE h:`E%o9C_2UK>o}8K][SzIOP2:5+e##C–G-;щygTAMuk^HֳA;{9.  zotT㰟]'愂lm Ng:d%aX~y)'m#i q-Y{lL&@*'aLXRl=~[Yɧ΢itxLw)$FdO,NJ -;v\ V[(NbӗIlB9 [(v"!2( U#&w4)7]Ane ro_KQJEo#п-:m~ ﲫ&T:Fn8] Vٔ˦;i}w[ƗG|[Y$;3I3Քٞ砲٣^Z7_K_>zO:j:N}[ݬ}sfW~z' Ua7aS(h:qf ^{}!p B#@IG9!Np@Og^Wa-i"Wgc"fAI"%HQ>LZɯE9( DMY^|jT6S]B縡5>0|T۰P(QhJ-ZRԟ{7 8Ō 3|@Č3&?112|T0;V6P[˾_]t@  Ap0x.Ҙ&[fW-^oo^2Urj+FLA({KIʦp;T7Q!G6S!c',0Ǐ8z<<m4I01.XpH7T`5g<8ˑ`qihBpBj4neLWEH^&UU\=)у^zF#&шzU_.?4 ~|&̱7 tWؿxhv< S}#g#` C^S;\`Tw0w` wF-~od\IF\rԦޝ+P;sB5 6[W%V/j vEi2GP@&QTG`:輢iK_PFPv"Sy" L!Ȼe?{CH 1FE0|Ţ罹SNq#ñx6q)1^@0н#C[2qS4S\5'aNCqThk:{NBM":ﮌND pj˥ؖCt% tSٙGe0tW9/2?{Yw2!Ko*ΘC h g. NP/`$ #ygH,Ȫ%6= Y (#Ƿf1݋} SqIuN;ؿx1Ƌ”dDYcUoH#Ƈu8G ؙ'_m#WM~$E oG&WKCZ=gTSXhǿG4-Y۲H8t|3vXkm~ >^~zDSGL슒tNo{ݼ?%`ʆg3aFupJS Qۣ{p=K$p+1MƉ?a,z|?}pC6c_TZ~?;bm=-'!BWzDE**ի+*{?^k 5H@Bzo''9m$B=i=>dμ3;μ[ qLޯZ`,ngIImV`O_d&Iۏ~=, Uj#?{|EW$xYJη)ܰRNOO#Y$PX|>xF*jN%'.f['d w "=ZYlփk9fmŽօ=׆GGodO9mV*vP՝ɏ9wSK 3cb&3[6D[f2ؑݎg2|9sgpSVrOQ)r9{>,zJ|* mҒlYLfz\#8~_f SzNkc(N;h@(u'b@W=~-TfM3+S_l~qK++Q6Kbh PX-` ¬9WBU|XRkjmԯ!0d7E GV2SЇp0F GW}*m#WMW߮|kFsyޭ*Ni=ObOIZt%*☪_m_\z8{zxw&0 婛X.Jzz;0Wh t|..Ү?%(SPbS=)\<0%Lѝ:裕Y?x]ڥ]ڥ]|IJ{K)i_R2oK;(Bkϣ]7`h,xK !Lcc2l]خ2o Ě+xߓ~q!%SFRt=>fxf7wp?90 IDAT&y7SB-#v-IN{. GJ^pl8pËih S5^ې5{cïz]߲" _q~#w롡q^5444444444444444 hN FМ&9M4.:u ¹DLGkf'⊮.構dϱl2-{sdoǮkt\~>xo@u)whvr<;vBJ\}jnzW!| m̨+18^rWO4оZ~OcŌ>{Ϯ @5s&?Œ(hjZ W;\Ys/`/pX IKL Lŏ3?^;\YyM=~Ha6ؓAsu\ W89^C7ϑQS+/H.Axɩ|?}g]όxIഐs8u+7q"{ F8< A}@z6:~To j?.x LehzJ^fV~V3>tpF%[Dfw)h3nSGY*(ꋂrmuv1p݆ doXEucvw {[paBһyy>!?8(~䟭٬{ɳUZӑqis[?{8i)bPÂ!#ԪQ^~"d,(~wܢSF^»;P0\(`5 DtyrGqc- {rhd;睟 (v!ywe-p (6wtz[Q? &/tx0~=ӬI?AegWiT#:F,aKI̮F #ՎSJ(e9)D }rrگsdBlBqiPB)6Kf9sǂ` g[F֋8yfb;y룏қfa*xڭ/gi"ҩ>7/7#vީ].: 삔.@:caq^Ɵ3V,=AA1.VG I]_/0J(`Mȭ6@TA(.MX]njoٸg _m S˯LdfHeզHnx)'=| FSlw)ok#'MBӤcK d 1eTĜ &J/;ٓXo1'B:BX+WW2 .Ϲ(XO"{G9s<$(ckǑNo;.`0؈yZ/3p+{|}z xxx(Ֆ1m?375?ۏ Qk2E$`Ll0&1 KıU3[ȣC|򲅚 Ct'hL#(2hÞ`gԃ!  DDU;Qn (dR%<(K^ˡJs7&]3=^8` m7[7.QU;nٞ DfpFv/O.QW-' QL/MFJU$H$hcկ>z+l*X"h<3YB%ytKWн3mSŜ]:"y|&Dt '>qbzDp_SIb*TGgwATם#vJ TJ=ܻPd`8p7|h4` p[;L/aǁ<dzf?؟#};a)cDcXdƇ9. _ &(%-Î!"EH[=?B"vĥ1Mn+l2bErչ$=#{/QVjENN N A޶Ȫ0GԊ CJ&ރcUx92!Y%*ȱC}giV߰ktH]uq边Krϯ`D3 $8:O۴ [KN.6f AU?icsogvcD@vn.…DЀmg;wGuPz}&KgK\"86 ~ v!#kyDLݹXtibVŌo%~̥|-m j1 ꧿cQ$B c+XsȬF܃ C%Wހ!n>^S/6}ݫsv3+77p7.Wfa biX7#5=ªzU eW~ 'p㷋mem9^AN~$c=o ;.`ᥙ:z"'aq ~|N#vZzk[^GGY:nz+:o̺:P[Џz_m™ }9nA:Y6($%Gn4ßLoN?wosr>~׿ `Ex)>2,˟fp~? =H̅4( !.H ]`lHN*jn`/4D춖4&SFv(lwބ΃jpsְg]%)Tpј^DL0$G^z>>κ]&v2~x|~WI!`ҍ\QP,8ItRkk} %*.jp9'#S }a~[һbq(ln&ӁwO%@0n 'ˁKpBHߞOi4:~h~~rӜ؟Rő_w&>K?B\O0zcЅ2w)k_}G~.q,ۏN}_Aq8AgF@C`[8ULE^Ax EQA^x:_LC?PVZlI)X7a:@^xI{6,V'8s)K96S{ pCWmއͩԤQs? ''Xȥ2x )#;8T 8+y`G!ұD0w\-/Hu̺6mdaep7=fJT"k+4vVئp 'G[Zsl?괤d9YH>a[4 d'`" m#:%@Hp ̙5j m?'ir6tُIQ\ru:1ϿB!iÉɨr'ع9).$̰v! ,s/~A&=Ai8$ pPshyL"{raˋ'ofьanYતd\SA;{/8u\SsBANOVDt3OX\y2 |O*~Tmb8Ac9\Yoax*I} LKF_X)jѯޢi$ @&ܳ Aٛ "k  gK鎒d6~FDLAq J\گ(.\((,+nǠ""je{6ŀPc,ӯi;DB&=t/E)7|Ja . oGA^\ЍTz ⁧Ko S]z]2lR >z5a`S>5~utא}rLuYul-A#~-M;dEj|XN2'~N.-cBjccaM|~uOsٿѱgWk˴ZO>ӻ˱"0}o:~84L0:DD_୐' PJ SPz~MjELْK݇KD$Jڨ(!ʧYT˯n #7!p;LB93( ` &ˠ-ixǓ T짾I\ώQMfADqD}.K>v,K4` D܃Kpr(M (GeIQ7ac%" ǎ8:} l=j;]Ӻd6#P" J3̠ɳq^ "nM>ZheLwE8[0dIe+rD,B)_VRǡUP@|lT{~WU1Ul6:;ɠRZG1զ6p#SSJT&,_,RK >%#:g8NDز#rGWOQJM6;Wՠ1{{Zkn;'O>BȤ{^]0ٔ|o6JD̈#˂šR<{/ZIuVQ0}G7A>NCbru9tK}f[ _Tz^NKASUCG4k=O{Z;Ι}_O_1 H^~N#j:=9YU(談t_K>k  {wAH솓/5.ݼ@>S ns;Ddm"!JIc10īzwA=;F, JzU<s%+N7#+~v!$:&ui[PZ >S }Ws<>alfP=>mMg #.JQD X&QS[.L6Ho`EY]<_W(kʱ hz0gyɄ5ot}$c&%.9A#+@3C'@IéSM='`́`FnwRt] 7أ{`dpvoPb+c?|ĺ9XxLrW">vh _-Dm 싿%i$~.?[|tsNƇhn~lZ9}ɋ"9\нsYrHCV%u;P«%?T$!Sʘ&ћ/8X\`?{Ϯ M>Syux{)|{Ҩ@Q[ǧw$ 8&wm-06m+GzZӤGeV*mԿjWuo>^X3ʎO6SO5GW9s씤g_zB βTvMQ熕rw~їB'b/ĚF@H9:P9%Nl)L'l 7(<*>kgmXb,Ϛ }d_\% ?YAaVw&?Nh4+YN/1 F̌Jl8hSLul ~cGv;z2|9sgpSVrOQ)r9{>,zJ|* mҒlYLmܐ IDATfz\#8~_f SzNkc(N;h@(u'b@o8'헩Meִ{x:8+ع=P7쩟߱Z},~e$O&ư!̚s5>:-d]ŗ%F\Aj cx|KvSp9'6@V|~顴NbOIZt%*Jʪy%ȥGH8g;bUpjMWџ-$y<$v(#iǗ29̳Qi9ev)EjP?GU{shWmu2 k~SMXYV%~6=D_aQ J1KKKOyBsrN s0EwꠏVf=rC/ׇviW\<^ea>׮?g>)D}5]7`h,xK !LISb2l]CHb͕dyQCGI̒)Q#)H:~vgkhtvB~T0¸Yp?{ŏy.w͔P ~]%g{ӭD褻p$dlgઆF!#~u,лNEL}E44!S5^ې5{s]v޾? B\J}jhhhhhhhhhhhhhhh DCCCCCCCCCCCCCCC4F#hNN vp뢡q6;:bbZ)@@0 65yY>ɇ }:a_"zs,[ebzdG"2Kkߟ{QaM*􏆆FrF XzW!| m̨+18^rWO4оZ~OcŌ>{Ϯg]@͙X?ͬ7ҭ2>u=3G%Bx֭Q_ ^NԠ.?ʿ6Q+/H.Axɩ|g~L,ּ&ۊkİIU]IPP:. +Josm|)0_,^7r)jLQ|׬y{ /Y $sNGmz?'\}l~rjzzo8MveRL_gm@UTaKeo)…>?Ȣ I>iEbb<Wf{V]"y;2+:˯!㢪4Yҏ2t6!*L\'RY7Ǚp#Wˬng `/U5{KȘcx}G9gO imBGCCN1k  yVb$.'<w,`A+ԃIP-tx=,]OTnJ \v_~z/|M{jwW&r gϏbS_lW^(z7&NIYqc- {rtxr!c>!P0\(`5 Dty=G4`d[sЊhm +_b\h.~:Q>SYf?jꯚ(K;mifDY4,%17 ש'otC}~j#J E,b5OXNN^UvL\עU(2: Oж_(41"چU>c 2'z7XL {+szq'Χffb;y 룏қfa*xڭ/gi"ҩ>7/7#vީ].: 삔.=۵t}khhhb9p2>߿ O2"z9촀`W´@9.oBnb -{2Dqo2Vn::fd=S'nDMZ~g ]&3G*6ErK~DB9pdt14lܓ bwA5Dd&~[zb's8ʙ]ȥ @h䄊2e*bN&Xt@z'{-DYGAk_0pJᓳ…n?\on/g^ tГ>O©@컔ۇwTǩ_jk#';1q^=g%Ֆ14jıU3YO\mh>]|,O Ct'hL#(2hÞ`gԃ!  DDU;Qn (dR%<(Kt0!,d'w+mSNy#2XW)sy֡A%\~-8C{(tƖWP>)I]B}[G@ҔM|/극tSXOlqs?@Xe%ɇo3!GCC崕`1pd(B&v,vs;<W$>^8` m7[7.QU;nٞ DfpFv/O.QW-' QL/M pps#,%bc,{y ə_bPq^w}C(f!iU"h<3YB%ytE{?{g(ۦ9uE&M4N|$&F (n&^%ªdv Sg"Pޮ[;A@O2*/W+lh/Nīý EwLD} Qw$] ;LAQJ-!]HZ^<"Sw.]ëk28XCG1[ _7sn3-{t?Z9Xб7p };2P pnՇ7`σM_ܿ 7RD\E5saݼl eVi?(^!9/<.ujUHz9>RXOl7Ž ;Xxi&āIsm¿FHpl7u}6bpa쾥Q[ǿz?<_:3spH׋YS|j e Y0+??U-]m PP(:^T\vՒyo?}3}.*~흵}SBJd.ӋkS< |A2ُJ~o'q;Gˀt`ƮpibOqBHֿFo PLJ>N]t+ ҇le83# x!0J[8b*R2v^X( 1x{c/`/0̢Fpa؎]~e^%~s(.dtȇ]Xfm{2s2n6O(z7.y\MIF}3=UstF_O,C2Sټ9.@Od<2&[8V8i7SnJw;C4" Y *m217nOg훟PqxL#TH`OͷpUPRmA) j5FDDo`'ډDAE3\0'B0 8Pd+ os-%S_jmѯ=[{,w] _޳Y29F 酋][9RD&ߏT2&98.[8TΟk*Bi.t'??59M>Հ `DXW^p ?H{*OSgnWl5XŠ*A~q嗡gZ~t]8Z̏S*`jX>Kn^G>7R4Dr5x~5t_`2֜ݬu$0-kS2[rIyf{uE6v02 ŞTATNU(RbﲞLŅE}l Gpr:Le7sMTxs#Yu;'x]u%,5(Q x+*-E07DimNw34-},Q}DOԌ(MIdWK7Gc~=<^u `g(wl&d3} "hDQ@!RJ1Ro=j(E1wګ-o[|5r3 f[Hnpl–/_Η艚7S)L~~ߞ쭽#q:P 4{mw4V49 osSlWۉeaR rP-J99%}FYބ؃;R"WpB(53MLtAh""TH/esgg.Dܖ/ |'ptʘ&Tq۷8`9=ɒʶWpXRS&('Ce3S7 2bl|uv4v$VgZG3bMem#4߅mF8ͩLX ;Y+}J31,YpJ6eG0叮lvA߇鋯cnJt0vO|IwqFa)l.} b0#Q08,6i}) zrU[{ܿ 3WÊO%5H l${v?{^E6̭ 7@Bz4A{]]ݵZݕU~( %Mn )wn =ƮS (;rȵߒBaaC15 hDYB.&/ #9jFSz2Cx# )طer5 ;(*.G'zN3^kؽ~iJ A+ c GAl-qb2)zM;Rf@NQ^-sˆf1ab8`aTre;6jo_)A<+60{u<:΄{ͮ`ZZSY2zI_4>/Iib?!:Ǟn%i?z^6k&tΊ,R~ՉESJuoIx1M:`cH|dǞė^eSxn-؊{xU?ܧW.R |+5[,)mj~,pUOWkb\l_l;/Fѱ?3q7~*ɕCI1O~3v%|RJw~8`WBٖwaCb0hA:N׌3.L't_Ӌȶʒ?kV,Q6jfu7|6H# y9\XB'?AHswRKC5cl:{2R[: IDATv)2DW c,#S!rKJHsfpӳIeOg(?0}&y^KZ2-8i7>Loɒ5+8ZO#g;1g"9!; d$sKQԝ|W ׿_l\;Y(UNy$|@̂yv R?be7XtC<;8 4@=W B2k5hA cjUTcJ6Ls9V aq%T?jF4 |4u+WD&VNssWCE'jRoEa?***^j7L:yѯ^^^`墶0y(dTTTTTTTeBX6 {ta{#TNUT:QiTT~4k? p|/upPQQQQQQim(マ 1.B&͟=Bo\UQi%Qq?**^#.v9TTTTTTTTTTTTTTTT:^EEEEEEEEEEEEEEE叀4QQQQQQQQQQQQQQQQiiD¢SˠA \첨\H.?NT_+6Wg<(Wuӝ:N~p>ϭ&a24f/W䓶Go 7_1s'3 ^mkjaʜ.we̙2]RYU$o^4 $PIR ҷtpT&.>u3GYG~&WHGi̓6w*âIrR68eqwo?& י&AF  pD6\}ϧC4k9G^& g<`^J鑟(.t8#2^Mp rֿʲ-81GXG&<^>yPS씦`5lϨUH<>嵏R)Û}NNy|!F1x iU!NwiPW4YSD]]y~***i4c1apY_X@߽5o2.b2Y f́i@)lҷ!W1DM\2Лӫc~=32acRl_ԢvjՂL*>DC~.VIir~#{,6H":@D$-|1^ tJ$75F=y %| 9z \K옾h8VRo gصf%k"v{'R8LQ[cm:| l~\mB.v#S)ɻ(K@99GwP{̣WkqFM{"GFx볝9 f}'ŏ ])=< -et 0qV ߮NU>[bt\ z$ïH*qz$oK֢3aH#j E{;y.X3Պu. fҟ羭Xw@M|/մ;_ ZYCB?& {K,V@nwb cL j?NCEEYyL06&BfnL'\Β s9NCJKm0/Xx3p=0|ץD΄+8^bebڕmE {җx_9}8do>0m*j^@F㧡}_:Z @l[(IF.qtrͨ4|UMbF"=<=Z)Cߓ ?-PvkY[9;Rɼ =BC4zy3J!h}<;Y\MJt^Xvr #^9>U(0+`g&p+0x v OI*OåP k~!B]؝~XLf+?ߐ[R@ڎC8eƞ nXh4Z׀CDƖJ->t6Ix* zsgRql?ޏSE xEymJY6"'v /7Z?pjnlB]OdlN$gWAW-L[I"PvDCȉM:-`.C[(:|bXFO{Q"mPcȂ%Lns`<^ q7r2<;ҫКA?c?Y#Vf{1KR3|s# t5#38m biX6#T&+@Ja~K/$rNn_i g̣y|HXl뷿#̆ `X4%פcGG1lO$0`mk_}\c85?{p7_?>h Ǐ_?.}3&,0V4ZBs,ΫŢ$WXkJy̟Q<Ĉߵ=䍃~xUЁN[YJ/ X‚jN-A^'fJrmxVR`lؐ &bXµSdG8(M]waFέCX y(Y#p)@"3wY^ӦuR`)3;J;cR3v#yr-O[LJaCEE-g&Dן` 98K`KE ylR gkʬ1Mlrm>t1k_#bF'Sp$jsd*WBbfϳ[~7_v_¢>||5)u%Tҿ6ݎ5k;_/1όFqG 'CN &ek;Apd71 Y2+-v_As ݎޚ> XaBLAV܎kJSkiLm?`шO!o_I¸R>:\ ؊p:(y9U=(Iԋq9'#KUZ}n%Ʉ@k":ˑ=( Me8BqYhAYs+c Ros@s"W1gd4tCZeKsnZF&Mu7ʃ;+ g7QD*-q&TFp߅mB0mS(-gZcxtx%$Yht$ҘÖie@O`?z %Wgs\ZLzfXr6ڗ,֓` 4m-VP,gG&裃%O{>K0 {wC(I{;[SZ?2D0welۤqDDtLb"=1ew_95#H'iH M+3zWq90;AOP))osjzQ^Ǡ׀ )/2X +`hIbyqxӗ.>Z@:'c9zfO%ĀajA0x8bQ:%5GR+`Zbs@#IiT<"MR5njk \bjΝ5nԿ㇇g6>lWxDT>ej/D]!Qvki%bk@Т72f]X?L>^.{%@FrȧdFSor5 ;(^}8:X}Ts2$}8&o]NSZd` ZKP.8bkDCOkD A=PSTj)10aD4qLNšd=X$d@&OF~L opgG.Ho4ί}b|p$Ub3ELy1xɄ69.NQ柤q!ώ ).+@NaYJff귀ӒO3 Z{3t^5^OL՞k%ZS}K|)frg+@$hDh ]virjY6O? R6{EKѾhVZDc~K^~o/#{<샿lEi=~<^7boK,|Vrܪ,P$ #*%ߒ(tE{+c\tEzOebN&}Ө=MWyWl`xt ;%''k)؏ƏE "_>bub)|" Ap9Kjd[߿< v՚&~WOODŽ~hIJYQEǯ6#b$f8JR) ˥q4"V-˩5N †`Ђ\Iud*gXS?!]Nm9%cXl,bg>NoKmLl+F~#ssW.A~F, 9n;J)%!ӈ1QP=)-Dkz"1ؑ]%H%$}9y3Y$ Yײ3xTJb>ŏWl+~;'(,Neִyz=88s7@ %~xX,GY>]*y}2C.$PUС̚{ !>Z*ػ/wد7\FjCXE{(hy*$?w>_(MUA>={p9?!yPĻ/h*IDATʼn[{ؿkb***5vD_cߊ ^^^K OQ]}.~Y.j;#^*?*k/VtǞoi^&X]C|d5ګ#?ڇzjZ? 䡐(TTTTTTT1v˄lۉ\-EG ?t :qQCEm4k? p|/TQQQQQQim(マ 1.B&͟=%UT.QШ.1iG]rt(.)****************TJN&P&*@Z bEEEEB"v!$qZ@@0 67xY >G<(tBӆ3yyG~>W=Ɠb1Zm8W>wkfFTQ8OQ Xzz3tG:Ѕs? /g)iV叇)4RzO;}[q+ bجL Byk+ 4Е#sNxQd ־6 m?%k*7:IJyZjsm#O x\Ɯ)5/)|jWep@kĴSNU)K#'0xHls@G6ɕchfϝ̀&{1Ƿ )`R?۰tG {I*G~ ?҉bLy5U]4'CSCY*˶Daq4{(=rCMS~ͫװ=wǺWB{[NW>d(W^uCIe v,}tˆk6"8IߵOv 3fWUes\4f&s _gs*\]Ɋ7Knߋ:^07|ŋ~8ٱ8ёÝ e>0 s.B@72^>Xt޵Ύb[{@fѣ+vȷ2o_ȢY -uׄ0OoA*wPq9m%c1t3 ۋI۱Ľq2O]z4fF-oP;oUZL:dI@E;m:d Ӊ8/J`ݱ _㽝%l|j#r,#ˆ1"𑷣K\FVNe;e_i~!H+ gz*a ws[xy5g~'/x΄AVaKE2t?)}JބtC, ptp w f47LhHj av*dwNߍRf****Xz CC\Vu7wo@b͛ < vV`s`Z,P mȮ`@E.U۱ ߰1);/WJLdfǥzS87ͩߞͶ u+v[!N%9m߰ΆEd X&O cDYT"MM @IMD_%䐄HH(8%~%QYAnDۏk6=23v =F 7ϭN#PH#"M.=#e6cӰ} N l#Qw~ER#y[ڷ9sEVa=(ڛw\?]pf*CHbWC7-Kc׼IJmuxmKWne.X49oF F8P M{Y2!vs9<"iHy7ŗ ocUnFW“t{әP} tT,q^l؏Gk}9p=}G*7?vQhfP/#Y;O@9xQxx* _3 ^ ~Cn!bHi;u{&PkcuЛ8k] q[FW() ҩSHz&'%24͝kTHyDZU\z?MY0GI8"f+gFNڈ-`.C[(:|bXFO{Q"mPcȂ%Lns`<^ q7r2<;ҫКA?c?Y#Vf?x1KR3|s# ȥ N[0wH=I~e k,y \z&W hG/؍oG~ IwhJ:IǎIsc¿H aoGm+־Xd.ۓPmāѷ>[e-FF;@kB@M`_bvKxiQaYAz3j1P+R)m K&*,v-d ,a;@dSr8cԦRnZ)mV 4 eл?CTKNlSQʿ<@?9Md'CBr[Iin,&޺l;+*b,Ɯ30d]"]REH?宊?op\fh7+I"&-͛䲁N ߏ1l[0" 9a0~J$Yp=-l"Ɂ*aِjS{ʦL`Q4@D$, JJrғ_m KD}S>nLa"|9&L0F! $ 8ț R߼J򶴯7KioV+[XP^]b=v%z+Y^I  aY*e$b vO勷7 t3vӏA㈪L{~WRpx#!N,<rLfLK+&NK]gN\(c9--Wv?Et\~<:F>K;TOH@zB\[tk"\NWiX5WKV`?O+u^jžm "lAGV hғtF+aK ˉ5g9I]wD:{E{gz8$ IhnQerdo2ZW?IFsO9s"gÓ6ԙT~1"ovRrʩ qM'X{s.I},#qk PdNOwb _s;^ɛ K˶7zկ^yV7c BSɄ@k":ˑ Ϧˎ2xӋ,_@4 l[~+c Ros@s"W1gd4tCZeKsnZF&Mu7ʃ;+ g7Ԗ2*-q&TFp߅mB0mS(-gZcxt%$Yht$ҘÖie@O`?z %Wgs\ZLzf^YLxx͍.f ګ6kV D$'7oDm@hcjҭ'&zJJqiB<텸|4&4|a@;8j{#ez2WQt>arS||ޘɣYh=YF]E$.P_LHYu27p{zźς+4%t4]h ]iMǥh 5nJo5۷>2t #55%n,1 ]KPn˻SSUj&,e1d݋Tuh$9yT>K ,2ᛳxu7>} |IUFVMT >Q0E1t!tvLYJDQ7V.SO%c _!Pɒo*p*&U~\ ِr{ ‹/ 8jiN>8@avvN'k.ܧߍt_iKh'xޝ6QxJJl '9>uG1/˽yɰv 3 '^LOhx0Q@GO0ɬIowu:Ɖ{lKkCQPƱsc6 @_ |vXKgI@@uM$쏟IR? g?߼-)=cBM*s\noRR{Y?V~ {c@^9ˉ]^/}ghoxpТ&f a>tb;_9uu.[YIst8X q!6~F[7ݟbLdQ[ǂQVd$'N_Zn/&DUUmSgGaϽg4?j&,y}fvoeF/WogAjFTV$r~MZd9+~g VAgm G=Z.n"7k49y~={]nJ| 8WX͊DɡBܼ'ׂFkIvįR$oPQVj9&1ΛGa3D˯qtTSrLړiST o[9Wڢƪ?3:B1UBrWRye3˒R !zQ^o殢˃ ΩSW)@Oxt#:8(_+Wƭq85<]OO `N0%_: 4_dVzGLj?>c߃ǏW0f巧[SilF_Qtp: C8N/ǩAO pz7u(Uֱ?qZ_>32f+8"Vi ~P?5e>v{5`ׁ0քcUZtq-Ї?:J5JJKJUc8QdT-80(F UX]Wu渶V#]Ȩah@o,pZG& Gm.9~í0'1 }R@` 3[`ԃ@8dn2RPyp \ nù|`,"BD(ƒ!h!qD<o$@b$d ǑSH5rA"=352|EP %**Zj:@tB =^C~t`c81LŒ0; hX2`eX-vlqN'9ۆKUpOpqӸx /_t|>;o EЄϦ!pPB#4z"C#Tb 1xxD%% 1H*$S')J* %5zIE:f: tvt~t tYtt7-ҳK;Ӈ/K(6C0C C! ɬdYًK>L>Cn&?#P(}'%rRMi S~01*0Z01b,bIɀi S"Se.)f:fIf#f*s2s A6e;p,gYLY%YMXXXY[YG0616#6_=llw޲إ-C3ϳwOsrqrl(1‰qJrZpqfq^\2:U5ǭϝ]Ͻ#cʓs%/Wׁ7])>v>>_ K|C(,#rA3(cS!yBlB򄚄 s  OĊYuM})F/% '"6-.$n#$^#>$A'%$qTĜ>RRRR5R/)zۤˤd2Z22%2ݲlll*!,W"׳N{]ĺudy8 >)+z*f+WT\UR9UWY_">U.z/jrjj'ԞۨSoQ_ԠijLjkzkkjkkz6ޥݠ=^c}K?ՙ CņQ]Q])ݑ78'G+{/_?n cbp!zFƘqq qaSQ@i3ufxs+lA  _jiKM˝mVd+'Voei7mPK\퀝]K{)mE;9mu:4lE%֥ŕ˵u-m]}#^`zOg&Mz{{ lڼ}-[¶ʴ7ՎZF)5=O/o_?<@7 '`"P707p2H/ h*(xҐP3+anaupm#{ңFߖmfEF7GǰÏXؽ6we{ل ㉦wvhIIڝzSHOr.]iަTqRjN=n{n 5[ΘNKܧt?nўYt`!CV:qp$@^vUKNbhM<Ἄ[?{tк#ǖ/2,+/>Po|VTg]p!.Y]juĕlW3!M_>RQsFMWo): PtvV#}cZJSbLsTԝ;-[[9u޵>hxv4]PXNk]]7{64yb^Eߣ~^#ON< {e(nhy / ^ɼu7G}G?E-M{GyW0.4^=20i:~>,NdXIӕ;ݧ~}YzϷ3վ φ.eQ55ma|1~T,|+++QTu[G4 gx )\k:"  ۃs$n:!z][r( )yVrQNY&^&>7 oBD;J|$ dTe䎮kSVrPNQQWG557keh_[zEWk/H&G͇-+qk3,+O~8q:عrxzӴŭ#k5?!D8  k ?'2(~M89f 1*>w{rBX$ݝS v[Oٻ7=o_3:2:4~c#3ٳ933y 뎙-U\XR{ɾSCe#+3UՆgj坿TS"%NWV}f7ojzN~KFkR[]{?y~Qkǝ u]=F'OUObeC#:#^qF\[iq|lbSS3>~f|u~ݗ\_}1C hl!L]ħ܉$y:)z)Qe=/s2K)k#$3{?a~UMB)§DDH0H IK[x&宻(ߡ0SQ٠QyC7t6*d^06hJ20W0t򵎰nl~C~ .in AΞƛL7{nߚ}{q@ `rTHwͰ𢈬(6/~PbLx& J;xvr$3"My=->@؝yCÇ?e˞;1ǘkEWt-<ԫg=N7V6ixVf/^W Rkz{oceSCs㝳-GZwMuAv8=uu] uxbg034پ^}95|վoHoލN<7Q>}២>GMG}}=~&xli=?.t/_!VS#`Y89\>H$&)ӷ3)*LLXYrwrr:rrp,N7  fIP%M~HwȔF˙G'(T>R歮Ar~Do.Awx5, cCI#fc`dtyU Ѧv={F\ g˰y$wKWU"~-)[I=bP ~d!3SBCAhsp\ȽQQ?<;:.{la܆o'x'r&Iڳ=Y:yvWkJT=i{A}8I=vxh#f99r7N%t @u$oE=gmY-@B} H0B@Lxy;83s:Š 0?F|.2"j`׋.`b Ua8n=.W{g[ )"hIjipWm}N! Yc`BɜdAgIbQshp|LqQsp~ңs܋a׭IN~N{BBGFn35ĨoaG])yi{gXqaWُs_ .>dBɊ3')Վ\( wIeJ?yq7'?~>|W՞[X_[\3jEsm@jHZ^ A``DK$V` CPkG[?f%au92qw^ D#!<$2=_I\;:\)zS8K W`&L#Q)'33y0u227ldib5bmgsb{ 3,NYG\۸98MU d Z 1 ,rX4XP[m#R҆2ruxy"2Iy^eBuP]v_u7(:l ֋ѧkjoH:乞tkr⩾)1]>b~W:ǂC8CUÜ"G6GqEŞΜ`N䝻FwaNkOO8/wpa\|:ttJKeNUU]Sqe ]f*_O񨁩ѸR6y ?x~dosaiKί? ~Xm:XAhH!ҌG9Qc4D0KÚeXI- A a7%q#D"EJQX g0fE&ߡS12053{1ϲag}Na0x%}LJאOQ`Pp8A|^go˲rRKꕟ|SUHl&ҹKߪƜ&f,=m#]U\<];=l e7B/ BZn "cc[cv|JHI=%3S}/G)RX}|K1}əR͓ʛOWWW85qQ+;-)yvjFdKq=[uuve۟5hte bGߤaoSщ=qvM}d9aˡߌ}?;c;|6hvv.nn׏yBBb%e??ϭ +.+gW?:@+ᆐ aqxe$WVVVa_*OTjw@&- pHYs  $iTXtXML:com.adobe.xmp 1 5 72 1 72 662 1 121 2014-01-05T12:01:54 Pixelmator 3.0 "HZ@IDATx]`E~-H (`ߊaޱH;$RHۻ7{\BAAΊ)o7{oxa??h&[O;$Ij=$! hXź{bqlPes,/ f΁p@>%KBC i/ΘЧ {T(1DI[Lpk+--J涐P]Z EkĮ΁ƁzQM|Xl^w, N[AH ~4s䗟;. PbM6y=7_陛9Ub"X67.>g)-lYA>`{0bqfއ@ .Cu#XSEJE@]3ȉ5999@XP~w|YVhE6ϛm]EWƒ0f︸$]*=ƦݵU 6*j\P"441+4D9-#SEgMUEKSwNu/ʯB~@bJz/Y.+JH-嬩uY19*xFr*U U%,"MbPta!!ɪ咤]#qwz\{|HA"A_c6aV:! .᫫?@lYbAc+ QQ `!R q_sssr&PЈ{ivᛇ~Fe MҎ>_Ni`zG|9}3f̜_Mؐ-y`!A!f/͛?9ӧ}>@Xb `)w~K!es-?sG:]Κ8}3fΟ7kSu;?a3fWrք~ [py7_G&΅ׂ47ļx 7~C4`T%`,tPBG"E훧"!Q4y͚J<999p0s@ZmEG `Ÿlh ]?+F~wvxvl+|>v G}o9kz>p_|-{`zo`)pC6ݬT-:W$ e V,ZVd聀3G3dNER PkAģђ֔XҼ90m>: -$Q,m~?`Ȼ}{4} osś\fʮ"_Ж߫e=O1l]RW͔V꬟%Ѯd57NF[i㈃j"Pr>2>|S/{GV}qc3c-3i&a%vW`?u >* EkhoVCh$~=(ʊE~988:+ƶΌ7~U3bmhj=7[tl**5zNhK_ݧ-\]`KYvuGrL׿ZTc/ۺaنl]xʏɵ iڪ\0tæųg!օ~yKqCR㎚پ9v"+lD Y~% $&y?@V4LQrITF%G łk$\SUI63K5zuÛt  AÙ Kb)AdINuHo^o?h lqFY ǜۯ5 =+nCk6eKs9Mg;uTt8r̥%)jm+O}ǗxΦm#ry㕥+cd&Wzw¶-Zl)i\(%;nzfi۱C6 _O=bE~f..o0)`m@i~O(}̕6&7GX F4"uHy7$qtI66quE;hh0Z3UE: m+oaΑX%"FaV5Ksss`U1M޺iqIAWX6V"#chA7\sIoM(>oPvk/EYcb&/t[_zo~̹wg\ZkԫeeJǟ{;>zΗY~Qζh{y_ҦkwѺYjرhq᧮uw?0jf?&D͝F $Hf ̶ R:yE od Y~spp5` [cSf%۰cG*6ZD(N{ʈ!j᫘CwH<'9c|˯{gL(Ǐf[R!8Iz ЧEW.9=wxʭsfYm:z#uھ>|bUO9!pq(\С56@G$v_%QĕݗW#-yP6#!Q/Bk['[+8]QNáYBgMPj7 \ N0[Y!"(avZgs98aW \b$԰V>EYV5K83u'khL;N^T8Bp:*g !:ǚ@ PaX2oEr+nxtٗhZDG 7G?]!0[^,#NO\Eua@w*KGvvA&+35!LH&ӛ$L3FUuMpiS L$nR.Vvb@Z6)o Ub!#/Y0O20}H Z EдcM%D8iO$x ?8999`rKI`veu@ 8t$.'2LNI@Cw3 Z\V O8uyi_(~v1NnHBT$D]P`1%2-!:q/Ėa*mD"N8L[-{  G)v{u߅|Sa-g*`O]ǞΤ[: nSYO6煱>ÄsZNB}H@ٻ|⋢=6ICo5l4 !q)a$ #,ꕺQA4PWIG sQu 5)`pE{?CVO{ĮWa*$P4$i:OaCy1\0i^6f@5/CM+/)@R8sq~2:BqEԐpFëoh*b".~VsdasRb/BqyXYYI, xR6}f:l疃{/99@2 eKʇL?`Y>a~lR^;g~}ф붕@αX,PC|PHDP5*!|7*,ڡjB!3w;U EԚ$,ʊł8A1?Hv>\έ7>fG|9MAK|>x4aF)!T]->f垠bC"|~͉S+`]L5 }c7PQ<3 *D̺ME#M7*r_]U nF[-c2tlځ|`>w{`zqO[8- ZҎ5c#: t޷c ݻtX:ƨH;&o|uʄ#1wjoÏɲ7{Րa#,'>5;&>{oe}X6b_FjvI+Z0Bۮny>ɑc_. =9dq0̙8r{#1mFg̘ zgάEev9>U]cƬ9Nbj:CFn(*z"B±jdGV{MAN*tAd'h@tĘ'5֙d (vo& @A8&sU˘4]rwSbդ?kٚ{_DGC8IΚ+/%tNy1:}'5gw/ض#)m՚#O8Ǩ {.Y _zЦۡ~WvZ~9m/(uuSo]XC6qcOdI3{jM;*s ;qNg4"('_w w2c3oxmRl\3^W oV.m~+N[ӒRbܤ'kmmG^ke;g3WT;?cp;Ǟx|mȓiBft$3{ L27>G<GQ&u i?h 9fө'­y-^xjo5COz^|~XPeŤ!rh~!l_>cԑϼᑌvoO'sQN~Ѫ!|朓%Yn``=w>_|x#nm=]sw?"co A( 2⺘v06O-l@uHkeuڀ*aM^"=RuL ERu6&̇YV,)SqpSӗ%#@wfp_*'.hȾd;䤳={D]R89mfy㒋Ϝ.X57a6Mzqҽ}kǛkI@ F;8{aEFNhzw0MH,$ɗ08hEJn$pM=\9C>ߍͰڌ*څ5Ӵ}6 W8]17l_y˽{_ Ad4U+Y5#?fG2IWzX2/roD!Ł3 E3:KQ do~3@4-X+a 'Jf]XPA5( v/2yQ+2 X8&DPXZ z&ٓA7\!V4̀ACI\"v݊2p S;?۝Ͽ^܉w)LO][K%A}>lԠn20 s?A015Ez]!MCzvM춸^=zfg%3fOP20A:~yz/EZ'|N-> A\2sMyAa0b7~><M1*p\?aeQnP8L.Y@0l S $ Hu+2*AO*>,3SpxU΁6$)c H޾dҵkֹF<."o|82ߝ?Ւ NC JX#>/^ŵ<~?꫟?xuImckx=n=$nX/w˕=: >c#TC5}מ#W;̔JIֻ/:HO{ˢ<(d疻Z~U-'<Ֆl8q9}}^WYll^'ә᭭=K &~(XVmAqg!ֲ B 1Xp7$@6UVH)JfpUmAeb!D1 =#F@qBA?BU#,9:@\R}kd-B{g_h !4ӜC*(=h I?Įi`Ei6K= 2'!?u]D1!196֕U5tw#ĦĤd묮ucfV5krrRUyi(&e!VPy31))wW׺d͖[]YbJL䐯6!9Ůpg .GclRyyY'&R#5̌}mSOu9zlT6L)%-B^箨+z\V!Ĉ+m/duh/kȷt;+e $N;qI+򲐠k߳WOUpjy b|B͢VVȢ_t4}քYVʐO늁r0_-QҬ'9y0t7GDNhPD;f¼Ê=C5UU8k>B(֦>.b9888PQ+^~XN.L%9?U$vX|J < %+ agj>K/:` ,5n6u {b ˜s pOaM20o% 0S|F &^~/c!Ř"B})pIC}%" ,5M_΁Zlp= !g\킚l'yJR#uG-^""]o@ @M2"5 @e&lkT ́4hُ@a-`"E 3ہ] Gwk:@`UuqUK/f2rw Ȏplm§bq΁rF[XkR% LcW$`-w}cS>ʠ8/f@GMs4"6K% L|5A]Õ۴ n,#K:'F&bh@(c>04 **Ö#,rqP`rO#֟»l@P #҈U0Of%@hbk !5bQ_e0q7}It0cg:v6 ̫ `χF ( 8Q4e烜؁Ʊ #vd~$D mbDp1:B](LO21=DQePu0m/įrpp#9!VLFDU ((a%" `cEL+y(IXoP~Lg آ$-4V͒'ME2dNz\d ۉ -f@4teJ@,HmM="Ũ4.;%e#B_4zL*FDi&#f mc5heS/f>.rR8X8ҝ"RKZAF:x`"L@F"#FX?%#TmA/b""WΞHˑ) P}7~{_oSqipphl{$LFуl2dft ttId#R&0/FNwMDjfw][Zc]PF=EX5W"ӎ;IXêsss?dL| r 9\nxsssus[c^zp׆?y]Z11a}!v<љyna{[Qc oGC>;YtzD Fԡw}av?h@]D, EMm4@+ §E,%gh7"uO > љZ|| _&{oIBf qmQqTC&³6*R+6fIFIiX飥+0T'pZ[h>TE w}aϝ=AX}C@nd, *Ua"0طCPd1A|{CA+䲍~37-0%TwéX58QlDZexI8MRh*2u62RS 0mAds%: ʚT0-@:%[H&KhEN=ƨ8Ӝ-0Lu(tc/ ]988NǏpA!2!w"Jdqe *ɐNpM`_ 섄$Z$D6EKEQ3TeC<8aB+@}IF,hǙ-ȴ@VI G\N=b[cfT Y'ml#nP- Bm9j hӁlE쌵N2ۨ7f?89]# GRdY_Ҕ "c_Rf҄"V 4fD!1r"X6!42#*C_aj. Z*ȂuџU"j~^4`c3{0 :pxuÔGFf@xUhryQρ!8x)hun fO(ƶ>l꽙[nysa{w(Բr˟shވ! ,4u h/ϫrpppppp/l36~L{W{-%;~Q>b:PWLv{0m~sssUs!àشn4S3 OqC@6b 96܇N3fƟHHH&e?юY覐fUsUAІ ?~=rN25^7awOF Ɓfo`U|>?岿cI<}ΜlAQ~9999cpU527qéՏXgg"DhZfIm( mlk`_p#[Ȱ&-p Y]m_&EB__$*RI %?6X2p3B B!/φ Ô0脺dUmS#;#b6ןxRHGYŎl<^6A!hA|%V58oǽnp:999G  BxnPkUyrUf9Ob:pܚԅg( (E_  !ۀ\@(@ V674s>NJ lxWpmFhXhP) S7w @PЬuҁ+hW"Q[" J"1d3HHbQ$i4(RJ^`Zc8h:!`j: "Gn>RHkJ)R'@kƠC(,ъ@Ў3V͊Pb4UEk0Zh*$zT L:?QXØ4Zx\sś.999998!|qːw#9^r"}/{{d_Eo{m yy3'(U888pEp8p:3CQuy\1}tTA89;Qo Oo>^$Ir?p)Hޓd 5?| gG> 8]G8;aCh tS.")Fo@?9ʔs5D U|$ZC_?0!{#ªN88+"}78m$a3y#s6WZՖPTQf)QAΟukxDw9[Gt|]1cb0U2x4xss W7g9,΁[9999GhLf]O}`=qD*d7I3m:pW)΁}-ka`!ɜ:GL90!& 2(lm:+&(lVai'i6,f^1;w*f#$ ]riWҸ}eT HRu&Λ蔍9rq@Zk͊P 透Bڽ!}!86W #U|Pe˺#QTdH!''E`AaI@<IUBp7 :-eIۧ3V0@1'6n?0JX GשYQ K*J⢰vt@yuWWZ *;3 >dn2eK x o6K4^?BF0W7^3~\A ECᇁ6 `$"̀pDkLjq?>: ZiWgQ;F}{D|c<3{BDECU2H}]<:0Q7"[Y"˿+q|!h3^s`pa9{b~/9P^G'Y^F)}G$ȁ`MFjm$`($fX 64oqP9PB}w*3hn0-}S7-8OeƝ}h;Ҡ}4os`/9v* x_9 LzdM*^Rq%[C\DǢo y΄fC OS"Dė;x߆w^,E=A!4:/UULaJ{ݛ`nP;m5~0}wqWoZT/' 8h8"FkV̕Yn~qZ4Ubub@ok㬺~EôFrɍNkb {yO E(, &$j^?{`-$IϽ6y^q{C^nۦ qi_V'^B^Tܓu/Mڼd7k'A\mSnpD) !a%Oݺ)SDuEQ1Cfq r6¤`QFܣ_k .N=Xǖei-3O#>V횗iU"-hC7kv%t9ƁGh۟m9`88Iu떧`E\O6qѓiy ?P$]u wn/F]7TM.(%a3EV Ao)fm{<ђc1ϊ'*O]M{ʞ+z>-{(rEZ8"O=Q,X|#:s-^/<ƈX)qڐ1i'yF?tejs_ڳ; ]5y$XȢ=y܆1m)8pR ǥj 3Qey dTGuݮOd72r%f  R]AZj0ű1)Xy[EKjqm:Z}͙CfsB+oh{<Yw,>}aC@IDATk{Ww&%^|gK6h7Mͺ`BU]X wr{ _hm=u޺mN$[J/{C~ x_`l{`ʙ볇MvO>UT9 n*!0 4@69tu pCY8.(%3dž#'O-O͐vLȖXT}A%^.X-ۜ~q7nt'^sOn2oW2 L~xaǂX Tx]^c'Ǣas`9crnu[rGg]wgW[x kދ~]hVK'yܔ/hD[=v਄>W`bU!ۄMСv2 biw5A*;,M4q)bs CM 9C.'t~'-USދڠer9GepMzz^= K;$~50bTKP"`bN܄'w+]ϵ/^yWMmE/2^SN _iܓ魆m yNHIm3kWnZS_Kʉs| {oƲ>^c!;bh׳wͮ%2Bn'6:H i& $,1QU SUb>!.Arl rסq\P']C%ɚZ۶+*/ħ!ҏ,o !IblP1(t"k]A؋229.Q"&3@VvYr=K5UƱڌ29 9N|>;'$̬x読%աSpqNLvyR{Mj iҺ~VL:J6nJ̥/r\UI ;^8sܤztPj+t{8wci眶y+$&os w}  ïuiTNL裥K*n:3CG\6U_?|Ge\LVbKLܶ+Pij#9*hg۽!)9U\Sś7ъJPkKp9Aʀ k"DRѱ>.UIK*^uzӹmAR-b tv1K_<`(r#]ϕ_nzҁ^PVS|ȑw݋aNyn8a]#b52Ox~Tf;/ܘ.qKyy [qUj#غ&*BKMؖ%5TpiqUp0yM9*` A>L ̝U\޼-bsz;uW>xC%8ls,;=l%<Z;wCߗG){].k:vcUt]/ ^a-NfjnP˿m5ƀqW]_\!tž.JNLfM? xaVʩ]eU۠O{ɃY5bRβյ\ic1oJ*~`{/Yl vLyR̜׷nśnQOKc k7Mڄ39: ԃ򄗻b}e++}r粇ڦd2b=Unk0'S{.s޻;򗺯}4+>;|BZ~m^%=Ck7Rl;/2q3)8:ͬ:M3׎LTōҘߴYgdym%+OlQ7ᶫqaJTWjj5~}uۖWܝ3=2đ F\^fV>TĂ%UONNUI-jV;7Vj{iq-7 6PwĶ]ӍETfI0M ʶgݞ&eUZJT,letƙd9 YhU.\qhimş(:{>R-(cO<]tn9Qlva/NT v15[KN6mM:$Fx4ͦE)*,Y:Ըh @{tނީr$[foI۰;K3fJׄG.~krJݞk}ݪ$ac_k&>5jQ™#2ECS_m7.YOw &+X9,yMӞ+c|sM|kͭ\P;{~m9~,:R{ +6 =CZ'=Nu.,[wcKxu۪}m&Bc-1Y/l),"HͶ_,#$E(^55$lušnea\7;c?,}lB-^Ćo5l9!]0 qRcOsou.\ƍ>:c.p]b9'~bԫm;8 [V쾶b3WKYv 3+}8n͚MUqɇbr~V".[;ybzٶ$('h<վ՜<=fW89GǗ%Ypu ` & =_ҵ& %vOo<]qrϿj[8-zrNJ)'2z8 g\cCoޫ-Nlg9ĕoo}Wb*2@=[>YTZiIe݅ۅq.W%5nsm*T蘯wr._=AG3SͨYel1ek߿XtpJJҾkL*nɲ*Eut|J__KTi:}|jZ>:dsR%!˺5`r3vpM e?}L|%6Ү,%5.eWFjKRQxgO¬jc%3k~kX:8K WiWG ׊-[sC= -]%r#[\1_}0 r-Y/u LOOHfuݦL2jGإU_|Ѳarϙ9㳊y^2>boHO*QUl7 j,rag=8yĢIZ!)>wДsj7칿>h&Nr~eztCUMBӬ?zyT8[!m&L C{ƝuKVѬUŶƪ7[9$~`sjd <;+=YgϞmKTecHܜ*GIէUCEEXBߒ+,6 Ꚑk9rl_~]uq {*hK6.y񌚅_T⁌}TOcP l-rj&4kxoYN1UW!Jyca$e;mIQ-1?BC %uQs]4gxXMبڰG])=v]yz8!/*7qپ>6 YXLlyʡq??i˸ R1+xR(i5+foWxQbrL+xXWMMi`{͑ RՄc #Ʀ \.2֣$.Zƃag'ޞ+Xƍ3חPry)|TpS%?qŕBmO'o{ݖ%}qٷev߲ȵv}*Ej|,l;6l [H-YҠhcQxLm bbeo1 ^ϖqqv7gmS,Cge/UwOum붞~N҈3Ͼ=[7z9jIri$`~@3$lh'XQ $ bnu1p1Y߳e1+^Z~`\v {PUy`U)>V7U`)6q)D~&`4Vx dqOk~({)K5S5cڣ7jY}bZb3TڄӠ6͓^+eU./$FoC y*Cu%ŝifJ=Hjo.ݾc . l+ZqX|#~C`~&zd_;ԶsoPVgW>17l5+YqScE]`f3?ZTAL bW#^ $qZ/\jluǬZ+?ܡ#3{ȍ# !GSn.M(X0y%B8`3)FG֡j Zv*"`B_XbdڻT j=du+(-!6's4/J?~d"gFTXAk3^ČNiVaG0 mTAx XK^HcӀdQӃ߫1o+7m~ۉdn=Ў}SFl&BH@ O>[pӨT%KOk?3-]֘9*li ҆+Jp"Ѝ DV$8P}bRJw_HR>'yJBqMۇ2$V֣N/SvU@kj>|tǼ5=uW`[l(*1B@3YU%P[kT{RLZ7HqiMb-W=r +}V#T.T=-v;z՜EFalI>?qW+VI? [?vͪőn<9=8e=?8p,*1 D֌x8;ϒssҞ8RLxx1왶KORWFwu>=ĵ˽.:\B&cӟk|CRvˡ3'/g?i- 4u`-Z洛R^--=rLv1Hn;: $ZWֹq_5&:)cw%/>Vys];fׯw=2>Jt}`_NدEOYN`ȅ +]/keȾ,{ꙿ@~L L6tO{iySR-ʗ+cidv:QzioV]~Sv9,oVv~[=)uC[n~ՏӜgܖ;(ms/ (R6;)W6،~,TgXfT-տZ0?69:rzI$;<;7ᗇ6u:u,[+_r/?k\E|u;m>(=6ɹ+Z; pr\=AY>wpRUm{e.,U DE,} & *h P.A%FAzۗ}gwfv3,삐 Oos)sϿsMn2ʮ6nXLxC얏Z};U3k晣-};G:9[Ųu49WNI;sʄ^6ݣDM(MJcQ۽L  P{I n>zqf/̚/`> [rߞC۽uC#}z)%{|lA΂}@uh[}MmY*-]ޖ`ᦎF96Y/mٷ/PwSQ%ǧnl_#=RK O| u(`_8MK{򊠫I%ƚzBzj@S}фrleKV-]~)ǃ 6مj;nr"{⠷|h(]d">6Mt3Ue{4wv! :)6UWݹv"PRs$갵(mxq2&=E5IlZC=UEAEzlK)FE_)$H =ۿrՕpij}fO G{*y(5]޶f,hL؏nӧoEYob{ؐk+?6?u`݉YFQOm6[ ]ZA]V!BvaVɚo2琨%XƂ'a"Y`胫6(( ?95RF"oi 蘵#>>J:fQyI^Tu پ ; ,[!t~NZ=$#bU𮺑+I1(2nh{ނ2jHbw4!3>lEg.ڛ[c!Ac4O"kFi& Іx (@!b(Fԗ ,dK4xK2аG+AWYS> += Xt*Y>9`KClpװtw6̚ Kӱ t5-ø$#!)j"ON('BFz# H H(p|d')q0FBF~8%ӒemX/݀LcL+fwc;I9AP;ra݅cT J2cRh }Pc#bk^!\>vc,tIX4:4|%uaа z#P9 1HQMx«ƻ瓮)Cm  (hbx@q'h*Bpo8|PHhM?yF|XѻL_-C =WU2XY.Qa\=i6Gs8 3,įrڑ%lDCC wa/`*؅h3 `*"M-<1Iٕ%|z1}b[rlL*JpF"66̙h-1(ڪ &aD;Y.ܕGZ! ͩ3AdY]yOv\9w45 -pDsE jڟ* cǜܑQOHbpcdb#F"@x-OޑeD0`KX/ P; x?Ia(UR@uY͹X#Lj:Q^4KM""#B@ΈgN.N] .Ux;]awÏ´{]n"q<ž%G*y]}ox (ݪQPP8cT-!!z?R-n?K7od#pZ~Ќ]HZ6)Tje****Bt#nNUNE@E@E@E@E@E#sZ@@egE s9j*****g 2TTTTT9* ?琫 T~6PTPPPPP8)رL'i***7,nr #\(TTT8+tg݇ wyq"9:L/c3\zL@)tޜhT]M;k|:8}b/rBv$Tg_<،cq MD3\t:9:H9$;w~:q%Ni8'\8ᩏE?!SE@EHq#LIɜ׉.çQj%fOU xqfק~a2 / S'1hF9'sM$.%]/qX -tNR{0ijQɆ3F6|[ԳҞHu׳ioD '?%lAESn1\#]-YYͬ ;2e&mjgQX}-#!'GX^,w赴mӯ"k5 ` IUK:2G{A 8hzv~IK}8P_9lz[OFOX|?<-EA8|;k5|$Jg`ǧDΞC :ˇ  Mv#<(h?%Eds^?cNULʵddN/|ޤ~ڊL @Ҥ҃[=[edQμ$amOj5ߗǝQsnVrԆlt\Y,Pu#{i;djBžu.?d-& :ߺ}bsΏYa38ߵ.jbP*i®`M87Ƀ,hQzj}P~}exᚦ:15Gfa->9BUQ5z͉c&Jڄ2{???̻fZxsju?h EU_>_HޅyL7BvVWkĘ ^7rz9%{_tL}(OƴAьҴrוqO-_pRI)҇*>ØgoQ'KrH L*ע"e' j~u`KKd7/Qvo5'^Ix֦}ON/Q<$5._vU-l}Gc/%;kAw?2Bi M Ȳ`d'PKkAmCc 2lZKQ=y17n蔌f\f恷4nr.۬6\PZz ;8r4 EtUY[epp7#oafYL1_-1]Y1-A[?/fqTe{&YphOחV#Nir(ij=G1kcfd!#)h{*I??d(diV̩^˰RNYC2OvKn()i~JH{ÂG7ӮZ5W ZOr[Fy-zcO'= :KWisN8ɳ2󈭥7ikw=qke oKnBnOq /w;vFm2@88D /qƫy^5ThԪԼ{#,|!,HE } 1{#w5n,ku!81cΪ'3ޛncPkޭ *FS>\aLL~Qv/̭fC`bY{a!EJVfŊCL8O&7gЮ{t)QC$T:d[|V76Լ3*˪^ə>3i׮L,zZ%2G|H7--(ab6[6g 12sQf&x]N?jIWV4YP{/6jJR+RgͥMrRꥢ@b)YɊ21jXL)i M_߿]Je(4h5H ^|_գ~ G ʣ?1V}ꪃɜy Q04Ġ(qNQ,H0G0wB͂?2 z04gEYh+,8寷o\qp1woHs獊vatZ4'B>)`C]swՈ`o]_FPrNgtfbi[7^Oz,wCߴo/ad}O`9f#,|N9OwBfmV}| ֣~C'ss$ox3u5OW}]ѳ_޿"wo)pɿy ?|cјiR.Q""FXD: 9_ &;ezCiS )=+w{-5 HdiEo]0#,kބ֤*E *i]7ZS^Zo{(Ѫv t]`-c0{9cs~LchtaB{<8h#QJoҏ6cAVSrPܿJh9N)~9o;Mێ:Ê|L3 FQ/`"}zzj: n[~6{tA˰6v.,D֤|:#`GR˒^S`NC M(aiYpnB i~67 TawJ^YGM_0>yl駭jp,οw˜JgC`aNоÕF"A7=TƝ '{e1 '2o`Ë)Ut&-$y |hxo]Tz4*#zb8Ȼe[nHL-}Ly #!㶛nWqI/|t}{n`E aoh]8 (Α^@qPN݁1Ē]jO J""SE '3œHt\ qW1|}. "pYSwfTV{5p'tQc l^iwcW\pԧg "> -gX,odLHd"iz0: )ZZCc5TkO ;d1*{| c.I R㮊ōW{QL W1#,˧0/70it;dc^S>Fz%xzaIKc ,:)Mh!GXձhŲTGF̿b 4k:MmJLi_Ƙ~Ţ|^/$7ako Ofcu kf1Pc92۴CZ)Moq}LvS^ >)0T b/׼Ӵ_nM!1$pgHpPe+h8>+GLM`hZp Bta:hº3fpF'Re ܒ`fMM?gms  WOvQY-1ƬaE@+`@{M9Тc5'dؽubObbaQx橜ɟ4Hp|1auz|!ħ0_}鈧 FT ?Gjh݀d 0HoF \{))Ko߽B3 U7jEBt"2>qAI&_NO8!+T+Wݝ`!n╆m8H`8u;7_t=rPJ7 4 1IXq䍉u`75[ Kl3^Dқm^Ʌ}U/qSĉ:Wd>n.)4:_/Uw$9i]aY[o7IM쳰Ka ؍[?=d{=ӆ!s71;Zb[IDAToWo]iP6fLKWi K:EukdX]+Խ]34,ϛ|l]cw7naeQ޵!kعq XFvajal@F"E!kfzºRs H! ͵Of$OaUز'?ѠZ a:=tм^h~/Zz^Vww\0\"r[5 `0kIKMٿQ8FK)Q+w}XQF Ocm4mvf4's``!ąhFMX M1({:?ˤ̙đM`0 hy5']j z$d(!2v69LPt6*'D=E&J5¾nxA?3醗./%=jQnyBnTaI&ĢS#D4!~-Aἄ ( *.z{@N? ֽP|KD!aVCL5'»"V"n(BWZ)Ǐ1,+G/qwuWfc  EdV^35D:kwHh)D%#? xHa15rwS8xlZ&1I IP۝AQP#ЃhZiTĹGC1B?d},]g_`" ΩSW)@Oxt#:8(_+Wƭq85<]OO `N0%_: 4_dVzGLj?>c߃ǏW0f巧[SilF_Qtp: C8N/ǩAO pz7u(Uֱ?qZ_>32f+8"Vi ~P?5e>v{5`ׁ0քcUZtq-Ї?:J5JJKJUc8QdT-80(F UX]Wu渶V#]Ȩah@o,pZG& Gm.9~í0'1 }R@` 3[`ԃ@8dn2RPyp \ nù|`,"BD(ƒ!h!qD<o$@b$d ǑSH5rA"=352|EP %**Zj:@tB =^C~t`c81LŒ0; hX2`eX-vlqN'9ۆKUpOpqӸx /_t|>;o EЄϦ!pPB#4z"C#Tb 1xxD%% 1H*$S')J* %5zIE:f: tvt~t tYtt7-ҳK;Ӈ/K(6C0C C! ɬdYًK>L>Cn&?#P(}'%rRMi S~01*0Z01b,bIɀi S"Se.)f:fIf#f*s2s A6e;p,gYLY%YMXXXY[YG0616#6_=llw޲إ-C3ϳwOsrqrl(1‰qJrZpqfq^\2:U5ǭϝ]Ͻ#cʓs%/Wׁ7])>v>>_ K|C(,#rA3(cS!yBlB򄚄 s  OĊYuM})F/% '"6-.$n#$^#>$A'%$qTĜ>RRRR5R/)zۤˤd2Z22%2ݲlll*!,W"׳N{]ĺudy8 >)+z*f+WT\UR9UWY_">U.z/jrjj'ԞۨSoQ_ԠijLjkzkkjkkz6ޥݠ=^c}K?ՙ CņQ]Q])ݑ78'G+{/_?n cbp!zFƘqq qaSQ@i3ufxs+lA  _jiKM˝mVd+'Voei7mPK\퀝]K{)mE;9mu:4lE%֥ŕ˵u-m]}#^`zOg&Mz{{ lڼ}-[¶ʴ7ՎZF)5=O/o_?<@7 '`"P707p2H/ h*(xҐP3+anaupm#{ңFߖmfEF7GǰÏXؽ6we{ل ㉦wvhIIڝzSHOr.]iަTqRjN=n{n 5[ΘNKܧt?nўYt`!CV:qp$@^vUKNbhM<Ἄ[?{tк#ǖ/2,+/>Po|VTg]p!.Y]juĕlW3!M_>RQsFMWo): PtvV#}cZJSbLsTԝ;-[[9u޵>hxv4]PXNk]]7{64yb^Eߣ~^#ON< {e(nhy / ^ɼu7G}G?E-M{GyW0.4^=20i:~>,NdXIӕ;ݧ~}YzϷ3վ φ.eQ55ma|1~T,|+++QTu[G4 gx )\k:"  ۃs$n:!z][r( )yVrQNY&^&>7 oBD;J|$ dTe䎮kSVrPNQQWG557keh_[zEWk/H&G͇-+qk3,+O~8q:عrxzӴŭ#k5?!D8  k ?'2(~M89f 1*>w{rBX$ݝS v[Oٻ7=o_3:2:4~c#3ٳ933y 뎙-U\XR{ɾSCe#+3UՆgj坿TS"%NWV}f7ojzN~KFkR[]{?y~Qkǝ u]=F'OUObeC#:#^qF\[iq|lbSS3>~f|u~ݗ\_}1C hl!L]ħ܉$y:)z)Qe=/s2K)k#$3{?a~UMB)§DDH0H IK[x&宻(ߡ0SQ٠QyC7t6*d^06hJ20W0t򵎰nl~C~ .in AΞƛL7{nߚ}{q@ `rTHwͰ𢈬(6/~PbLx& J;xvr$3"My=->@؝yCÇ?e˞;1ǘkEWt-<ԫg=N7V6ixVf/^W Rkz{oceSCs㝳-GZwMuAv8=uu] uxbg034پ^}95|վoHoލN<7Q>}២>GMG}}=~&xli=?.t/_!VS#`Y89\>H$&)ӷ3)*LLXYrwrr:rrp,N7  fIP%M~HwȔF˙G'(T>R歮Ar~Do.Awx5, cCI#fc`dtyU Ѧv={F\ g˰y$wKWU"~-)[I=bP ~d!3SBCAhsp\ȽQQ?<;:.{la܆o'x'r&Iڳ=Y:yvWkJT=i{A}8I=vxh#f99r7N%t @u$oE=gmY-@B} H0B@Lxy;83s:Š 0?F|.2"j`׋.`b Ua8n=.W{g[ )"hIjipWm}N! Yc`BɜdAgIbQshp|LqQsp~ңs܋a׭IN~N{BBGFn35ĨoaG])yi{gXqaWُs_ .>dBɊ3')Վ\( wIeJ?yq7'?~>|W՞[X_[\3jEsm@jHZ^ A``DK$V` CPkG[?f%au92qw^ D#!<$2=_I\;:\)zS8K W`&L#Q)'33y0u227ldib5bmgsb{ 3,NYG\۸98MU d Z 1 ,rX4XP[m#R҆2ruxy"2Iy^eBuP]v_u7(:l ֋ѧkjoH:乞tkr⩾)1]>b~W:ǂC8CUÜ"G6GqEŞΜ`N䝻FwaNkOO8/wpa\|:ttJKeNUU]Sqe ]f*_O񨁩ѸR6y ?x~dosaiKί? ~Xm:XAhH!ҌG9Qc4D0KÚeXI- A a7%q#D"EJQX g0fE&ߡS12053{1ϲag}Na0x%}LJאOQ`Pp8A|^go˲rRKꕟ|SUHl&ҹKߪƜ&f,=m#]U\<];=l e7B/ BZn "cc[cv|JHI=%3S}/G)RX}|K1}əR͓ʛOWWW85qQ+;-)yvjFdKq=[uuve۟5hte bGߤaoSщ=qvM}d9aˡߌ}?;c;|6hvv.nn׏yBBb%e??ϭ +.+gW?:@+ᆐ aqxe$WVVVa_*OTjw@&- pHYs  #iTXtXML:com.adobe.xmp 1 5 72 1 72 662 1 94 2014-01-05T12:01:66 Pixelmator 3.0 z@IDATx]^m{ {- tBB(H @B Ccq|+Fk fo4z{3V^^.մmn$ 񸷶J&ummm7 e $RɄh] nn;ǓS)ִכL%cx<+Li.-Sax 1]4t=~tOR^͝^mV*4E[*2V`Y[蠊`JKē~]OŢF"` ϽзAcH?F.W*<5&6fk#4PQȓ_%7ڊƿ7Tݎ؎F irרLJBJ38^˰wOkn$SC=SQ1j@M?;8e>vzU8xQye<~pIĕExrww*c,wF 8 Ew[8ev7 p6rPU %Uǩ ˪[r~9;w (z0z]֨/?S{a3g/7c{wnJ#xqG<OW>}Kf*^} 1c~fXyݬ3v݂7gN>}xN97oxv7|-H_ q=\j(\!mЉ߅(|Q3ZA%_5|XYil"='v9^Ƅv~+ݸ;#`οS<''Gw[Sx3o 7<̓.;^&{ =t˯_~v#>î3_ܓW<]^Mw=+TВ M{ͿוsN?>BoC& ENr cVy7-X2\x`.2j!]T/ z1F P֯o%J# 8e *3f€#3 ڨ[K`y#i4{@򼽇VO%GË+ȲS5M` Le~g~`#e-J*P8)-qvk H|\,Z 7'K˴HSܕ%ze|_(fʾïOP UFEySb?;.g(}٭|+Mj%xreB8O~}!M7: ^sߞ\U\TUU洅}Y1 0\sy7omcHxX(yJ@"Vm;<5C ܏\ 鲪_jJi}iIJf2EZ=KÎ8#s_d{P-~+nw2Yug/OyEƆڀ,LK#6*bh^{4_J?CA?z2W_s OOtG\~UsobQq%xbV]^J&{$ҫ;ޑq  'BH9n3sc!4 %DHqV0&fB6y fC.)ԊL%aFAfr*N0)fy3r ?JV!eM EP=HPdiN)` t $XL{^܉p ` $[PlQPPmG3IEh`#n(KPQ +XG12mMÑzvX\e}7mXxnm {() 44GRFޫ l'\pĺ ?#x<ع>i%Ԃf[ٹ˰#BZr_oh1db(4̢K/\RU/\*I+^=&O~):=3sPw;^s8f4`Rbx5k QY68{ Õ`lc i/DY!Aixfy0r Ηx{ALT` p1S0P)KhᇼINTՆyR=dn 2L R㓩Ȍ@$ܒKt0Jȃ J)(4jS" ;IU h@0r!pcdg†!HʂV=1,tXV5yXƆ0]ޣwQЋϑ|X^ٳoP(Ǭsb+ᆑ`xE*o%;ῠXˊR{Li:vJUh-\gMe8|&PQq !=&x^fs[$΄\TPS!-nAnпA&S@0F` lY r4v8iCZ8gȡ"\8ƒ,A]InÙ1By<k.,tk :$@ m}wخ>R IѸE `'RjpC<^/n)m  gx±/OTBHhuFhG&Ta5cO.G5Dw%O uGɠ6\U@bp+0_r `s< /"&6%B3J.v!]+X' ",RtŜncǂLb-e3:ʡ:-4`|shk<nm;?ݗ^K?8⒚E|]~Y*wC9GoDb܈طн}˼u-]C<}lZG1!;'A3^TN1C<I|xHzT[yd }q*sސ<we18kwS{gx4#"t2D9e&usJ=.1O%-!3 q8 =b'J\]8b<зtJCpX"vw4xco; J@J8%<qdJqJ 7x}RP(q-| C{a"\r% g鎐-*@C/!\Rގ EhWd@|T0 j4a)#FX.&c-  H, G6Cqo,@%!!C)2,?RBC{v`G ujK^DRa,vZ| MG8sjW_5^~nqniX3>[o2>n.>7ϻk{8ro_-I N 9 ^Y8bxy09MAsph"D@H"1V0Qȡ93a${8UE47x a¡2;Mw&b .;UxGj &@+EPE@9 ؤBؤOK$bQ9Hx2+?6e_$c Ƭr9-K*)TqD$ػP#`Ԉt?DS8-PD!S-x"i> 5*D@a3q * z]K K5bDBɏJ b2U̗K_/0("̨E~`\9NJR3,`I&W`}4[&@)s9j Htx[_{QξK.>k/}w65D0U޴iah7sƴ+IajHJIW>^oe4}}:wm>sb1l 9SϞ%]rat#|󓏫J#¾I\/i(>n&̕L<5K!*8M8*&HQh|*nD0sc O4_y)m`:Hc$`@8AS8 !ǒΚU.` K3`.wZj\a-A,`C p.riTg00&1+! %PiPT&©nҵHkI sSˀd2%*xNR%+P23mn&&m#g Nvd0i/cw@Gxaij{~6)nsvغi?O*8r?<ԳOo% =~?^]K?EcǏ3㑦95u`('NcH&cbHiט<];gi(KE#patTaG0mIn%Xcϴ-+Tnj,+a @{9eÀPoghdlOos{rf"a]m]ضp~V^)w40}y'yl/[tqUcS?Dl[={crI}!?|nC.JָE5PV^ZQ"+7, t~w>%{뵁}cT"98 8p4h7A± 9]* {hn~!7Ru3gL{s^| ݎk!]KC4[\\w0X6ו}_7nx__y/>iX;q O?=d0G=of!Pt_{\yBt,SJLz⧵W&_W[4fĂhxh:aA\H#qHk@v;$]_da]cKYYs]ϼ xԜ,\lɢyϛ?ݻ'{ifT4֥fWh\CoX>_b٢ pn۽˺OO~hɗ>XӤ?y}c3 Tx{odAcظ r˓'DdmugJ_/K%{f]<ỹ"lk`.)X{\swb'0^scm{T#shk-*3$TQ()%ƒ^D}n.-{3 oʭyUԢsŅXY0YhRcaj\eR)EME"WauRI { 'SBa`˂n<|8Y` dHOc<)F_OŠT4c؍x0p ƶc4?Ϗ iz2ŃPNq8w0$;y^$VnU?Ļ9p-P5WK@8"*5V U"VaB8e3(iC/zl 1%{n^k"ش-p%tx]IG %^l֣ L ~^NnQAB . oi1@R >.Db؍-/|i=$ 'nS,q/6I@7O'ԅ7u7@yQY H tXR9)t6r3ڸ@NOqpQ'rXw.i e}SrjPfJ+!'0Ӥ\#0EJ̴F4צ)(3-z-n^0 ȄXN?-5O vm$v% %EF]e_J#H]pީ[ԃ & '"\WX+uSbsvP۝\ P&k$[sƉ3._P+#fԎkPCG5YDŽσo<$BEVi 8 ti 0=ٲLhX DECi?E˪İdC@ړ y:'' `ϔtȇ^Jvu)0k^ PbwJzpf5 hc3mopAG)9ŠpG żd/胧f߂D,(x{z57= > рJ '*7 !ڹ\:Ԅ,!I2jP -9ӂ`_@(rjGpߛlblfaE䐐Xn# 3 fT+Y"&7V9H@aB $~!d9@7V,AM"0/" 9|KEd-a1Dg=G>%@Y'l h%pH"GvF }&*-5K* Tn@<ܲ`_#d$ Ӧ21Et @6|\vlfwnN#O#"@Lds}г S  qE~11@K‡x1Kb ϥ| s2.SCAp)%<|w"Kx > ʤHΔ#c|˅_#j  1EQXnc5L >8g a*= ]APD2)$I~@B<.a"2$]R/t˝ ꉊ*!7 !Q r e|HjB? ĩ^?B\)Ii1pa!`FAZ.o6 9gR*MMC"%rRG#m(,1dFTfCj\Y+z # & ;B#-EXC}FR]041Ŗ#}&AL)+Őap8L`B{,zվ)lYF!q <%6@ K!XRUH줅= W&99݃~L+Ԯ%; ~7&D=fM]QAxJE+H*``czS Ұ-QXV~ E2 Dt%Ӳ5ƐVƦE`!^$.lc0CH&MP™HEQOzrزy33ʂA:J`2li&)JK~*DmḰBH#`NpBx^lEj@l7(ejw1m;a$LJ/a ^\]TtoѸO:-жPs>%,[7H4~0񞬁]J?XlktXKϒl]wǪh`<рG 8؅4]|R6#}EDH;׈j[%]^l,&U oFp瑣AN. -$62zYHmHMYwl,ߌ;[H"܅%X,l c6s=Cs;*{ˆ#8Nb)k\dMN< sVXLkmH EHKH츰ƳIgTd[@cX 8 *T#Gxk 6lHf6u(,J8w4,Hd*m˂ ZT{\BT-O 'pIXVb}b\NZJ;?vw;J68lԖPã-P0G/,qdL.gm8͇mX[8>\OyOe.6HY;"s,. MSpx8%vJ7oHI& kt@x萔װLQn&9t! o>ťxxn&ϰ?B~3x kz/WG fXd2/d;@v(M2S bxp FP Wȇ_ !ex`i#2q: 8r->ؾGX3=x<<\ gq$t ʣ99#A`}m S @H r` "x fNzɨH/!3a[ V?V3peR`6xNʴ"<-{62U '| Ɋd| >0%etCF["3PFq~ /7H7?92)AA͔@/",+B><K:;0 ,N #(Vĭg9{däYqbA%d)A@Gr"'TX s9pBWfmc ; Ttpm&%]ȁAG@B̿3"YhxE2+ pO xl :) .trp˳RxJ~܃=z, Gt~BN`Dynd <t@(t}8 N$A3'8  6PTJœn0kGn8]ayΓby3Qt{/>6,F2.)%X9mKN3"//;:'@QOh5Ao9 Bѹ"xc^Z:7ɱFI)"̱㢦:(PL*G˱"e bۊ} 2 ]iA\A <%A eP7bymÐ"=[5'4RG(lqƛ$3HYpƖQPaeBoq(qYv̈́p,/.}exDLhu &bQ~mki' \nߞc~3ZIō]{ĵ!bG7T >YjqBĠ^wkyTV3w{仰{kaJJ$ ɚD,'cMpƆpu`ѤZM4(*bKV`nK!N;%D]%bF%ع{mٶE]7:utm\G4=.Ejc ؍G.xSj57[6lbGW k eNCg{Ůg.^:aAtB^So9\ Q u@ ?!8=+_|Hw32+рGy49]uoq e Ѫ~ι6%yWEZ -}~KU?6k*q~pX'@i9ax1]O;~2wνWWUuG/_].^s=CNNO_mh;`lȓJYSzw۾_ =ڞ.4ѧz͒Yv upQΞB{vыwzq~Ci5W?>{|TAm kg>c[jX"2{Y4BZC yaHX,oEdž̉4=ᜍ~#SDSq]^эZ3_ `&J)+I zSg 1ȳ?Jm`Iչs,)ʀἒ\7) eph}s'J[c]_ 2`BlGXCm*X m`Q1[/Py X27EΕY`zIB5 < F/ľ&c-)OB8L./McZܐ!df*Ջ$zS@hpBhcG[RK)\r KSdoѸ4K*+UMi/x'ɱ!gl?pNY-&bQJƝ|~)ْc{]l]? ؅*e]Z *骲^ݱɷx9B#KCĿ^?̾.1# ~yFGnm"8MzoU\xte{-Ic1Fu6OuP0`\4f|p^i:]>rx;m 7}DžG%bc`Q%[|Gz{Fŝj}]Cx%}s)_{TZox؉z?^\2x$Q}&yf2C8ޜׯƣӊ*7|,K5 i<'ݿPz׽+8[CqyxS*0wiI͈_ȇFYkG=`S"2 z\+Dbn 6&?:耠ՠωhӌ@y'sR†8H{p@ SMK5ǧ-4&O#Gq"R7ԻK+b37/fFz uHZ&6kvD_|򹍙3U#`Ǜs׻'OigӣCGeG{& ݀E]T0; PxȺo(nӏ>oQRvN[vI4`E&o`L01eH(8bcIX,qgECdveG]M鋌;EK^6c_,s|Yv9$ԭܴ ZJ;d?ƌ#*K2 o3yMR.ѻ}.iqMcaiFcC޴]kHs^9]#gevjv*j/K|<֌[]f}?Գs3"rRj6],٥ictIgcM+#b}v&[ڋG[4\k8(O2ьD]V-{ "x,l^$UfHr𫈯spPLC[e^~2`6]/Sb|>#{hkh %Yv lw("ZmZ+/{ 2`{FM5 ng<Z6#GTX!eSl䮧X4H.v]7 \=t5jM7!LJai=`ޠiCl{2;z[gwe4rji}z?ܽXqOQ+E=}sBQIħ4 H=Dwɸv=ḫD%$UzC! B KVC`{qB~B{%GhTGo^Lv)!gKnp*.hK–" g*ԏ!hF@[مZ[ P8b8(|>pFt$ʵK>?.M 0o'dg Jġg}sr',)~DǯY}گ5ה1qz/QuB8mwqۊks=V}ZN}Gx_[xߔfc`Ī1=;O v MVGv90yc=>}vb츠5C?cÊH? _171~\6 ,Ă}2Wtrg.H3>`a`[(bf."}߽ўG[2?_ptk˥ƾ}F~bHY`NQ:_rMA)#̝/h^ч&E'7h*~c|ǥ8Xw͚KY6(jEl^!hn]tC7f'fg«WGjuH?];C!HώˊE,`@|v v 钱K51k85(Tv)^etRUDk\*3 `}Qg1O8k6'QJmviα˘elP켡!.m26LGiVEeܸm_i˘S3&sz fGexfG #ZE`m'X;>ڥ%1kx? ˜Hy`f: m/ndٳ*lQձu#%=fմ13vX reld]jEbCE>+>zlȟmz?^R hK?/&Dfgcdq`0=M\ʱ˲O2 !]ϋuK˂9>Ak: !'Fo/<9;Km|*+W{Ə(<^ݚlۜfV'Ή_hcq#VsOf/u5&'_yկ/HU ݈驿ܦ?tӡwEX0xb,]@0EC=dS.Y\/g9hWZeh OإDqۨ%oW?+'դ[\"1G]>U!#LLG7[?_q9': 4DS[C?NrAͅh=Tt ȱN]- h6-_h~J&lօ _| ásvX3"u G<4zԊ%1WC5HzU8 tdcƢLw0{* 6vwPbehQ\떆}5C,_&iCyE۹,n-X65-[^55jQk*̂ c5 o} V,l[WTJF׹KERX(ܸ+sVG[7EӅ |~8^bJ]ɦ 7+F@z`.iXR&vS+\8$-eVl+0D.mmY=0.CL@تB[Smxe}$d֣]4omfvYnBX̲KM] }H]6DBXd+`>?kn h/bg]V$W,m,X%H|ʔ1. j/9vY{цLC7Von/kMkʋ`򶵋ba]FU˦HMؓZçV,&AsQ4ٸ!ܐ&إ~]Z9I?ƆV:[zvkep(-njhr4g;Þ@],bocVCX4dKK|*(͊vQ4p.vGV Ұ>Vlk/f1I;["EOΓxZ `}?POvL$Z҆s^VaZ'vY{pm59%?XsCP~N3 ѮF]KqpQEUϙ߸&%I/ךQ?~jPLjUcקGG(VT^P٫u%'VVW6_ ??1]qCP_2t̝mh0b뚧Jr_)`%Mlg6= GوN?{nV6۞?ュ ;-O"-A9Nا/WR;_ ^!SV,K*UUS 1엮 >P!`(Yؤ`6b"I`@꽼aY`c7^!lI~ڶD) ,KE,GEn!pd[lֱviIÕ|y Z gg^ ؎n9*P <#={ +ǾmvAܥج^#9'{Nq{cyc⏫~qϦ7|ܔҭk7Wojj۪qO3# ިx,l\Y^#<>a潽W*3]JCuKST{ǽ/*FEl3EO1+FUKOΪ8~E"FQͅ#J=>״fR{VrQ)pu|߫$dilŴ-]LÃ}jOiۭh݊wYGvϜXB>?;x g7 |?xDq+!Z5b~^>߫Q+1'W \m]#"a\;4x:t^Tnq8 p{ XdeLNr'#lMu uzd~tzZkUj#ݯ #c?"6neɯ猪 .|t;;q|9H~NF2klO;,i1nCAr#VDQ\o!-n[7i^=`&>=%>^nϞeA!\e ~6PaMBv"G 2 )c;?(dM@`ƀL > h$N4`7UdI efRit$|ƂX 8mH4XYD=g-ر0h4 9Rh 3{B YVT܌Y|,gk,v۲堵Z=`| 5P1~7[BeteX%R@X@nNfF4כ9;ؓGCKx<)=rk OPdJc1E߇Y{F(8Ӏ Q|>o"N nW Q DiA_ όlR@`0 6 HŬRn^hH0+G O(rOZQ XHtǖsڃ5ΰxz{D|d{8e QBm!D!".#⺡H,^ ܈p̹r<1n24V>.n4s,w=X=EI_[O(-ς=?8JIi A8``*3qЂ a|);"H@2+ e&h|¡k>H4|yD "@ hPU}(H\`)04Q^(HAqn#R0嬸tTtr-|ls/&FQRMb`CW,h%0TYWQ EŻZ.l `PЯF&P$&x˱ ґ_ +݈A>Ow}L@/a7$Cdv 7%UGǬ%G[c 0 c 3OUUZDc~P s {Ԏ K: g 8+dM*X$}^QB 8]D9H{18Z 3x1QD&9 Tf="b<<* :G%THKQCqHg.|:FOOK L M̦rH '!#60bb#N9ĽǏ?~>&Qb{`-oj_"ќuuoÕ X_ݘ́ve]wց~yu)S:𷮙tm[C=K.=Ӓ%Kq}ϸG+YhYߣJ~59ckW6Nw*mC71MC=qAW·Kzw/<^EūVa\up2:Zi9qn7Fr 9SLk>~sBG>=8BI9‹(lM[Ė<篣G ͳQ;0G6?mZY]|p7}xH 5Zȡ /_ g|Dm k\M Do.5=zOAp2_?-o lIWyЉA|Hf~hB{EWs`b,)hJt0Up9?|[.yš{ZS0ǒg\rף\q}.?hWr>O<Zug\Sk*{\Љ,)RrrĭnCǟreHk^=any9Oa±|ı!_sN%7s*|^=X>X3œ/{/:y0/2↛.Yg||.?KWrGw=g~|?|.}>3˺K zCFO.Eg$6;h쏯='ߺ<'e c'r~#κ~Xœuvssl@(k[Lr8p4h.Lb ׼Go ްzuWgx74zޫV]}v|mW^лgD<𸫞z'EC)o︻qGym<5P67e^dzKF^=V}F^!r.?辽;պYG:vl%x+;O;kqu37+Cc!}_X Ȇ;w#z3?_“<`XGU-K;խ'[ns࣫.3.k_L=|_|S#V3h䃏}C;O65}rbI8p4hрh %G9'O6޷݁*sa_W~aS.v|D`:)-[Tp"5~/;I0͑$^wx}Dn]xy]ڒ߽`)go3O|_ǒcӮ\YO/e31 s>:O3TM1`ȚJE4|o^ې,U/sV/W_لHWFk_x;E@eW7X=̋uxgޝ!!ޣ65[աVyhyQjU(UZVZjEDDHD<7}}s9;7 ̞0s%f3nj{yzⱎ*wdZ6n3mИG ʳq 8(?G*''͝rjNV-Y&#T+K{frFznN~)bR 60G^-}v(lǚ FĴcsSKKJ2o ^W[RwڪߨN쵔´gnͽu)Mҗ"3 ng sĴP G`/+Hpfmd L:3[l/(`̨qo{_YVUA6EgP^zW U$Gȡ}Oy-w :gq<*^<á?S/ic4)Pxޝ?nѣPj㛃 8(ࠀ@@TvZJll܉*Lk. O8+*m3VD68! `ZOܸ2wAÆ,[6+)Ek;o-yqqܑ+>;ը`.|u*E[7'Qk:w>RQ)7] }qR}W=f[>=Isn7ϧ(˚Ԯ1\ faVzav>6E Xv6u?YEm* skoI yw)2KC\X'38mY ݍ㻃 8(ࠀ5QJ /ud)Eh70IH}vrrkҸ B>f5h\W]]ݛ4nd}`l*~C {^C2>FB;䫩qsdE܈!MgIr v\%F߸]O7F]zF|đK4%zbO ׋g 7J?ͩW4:*c=9b7?AfNjm.y7"%%i߻S}=6.]PTxq堀 8(QJ VX"vz煫PC^C2,fbyV;-^m' 5@ֿ7`C3ӳ\=:V۪ J0 D-Y3ߛqբ ezmi#-Y]~YK6|Bd͵ F4uKL_XR\l(db'iF4Sג [̦bf-}i4̚Js޴7f|M2c,2x%HGqEZCeї/CJ\Zbޘx`3Xy}vrvY}>_:!N{ؖg;{pPAC?C .Ny9U2^>jׂ-aJ JKy{yyK J>0Wݸiӆ 뗤&:{>dQi|ŵ=5X*5>%WYHA[!n5j(tƭ;"%d&gj*7jv+jjBe(v)w"=~_P K{ k4wȾ$WUQn 6s2'MÖ͐㾪D}JoZG_D 餶FJ,ey̝bEv~6k7w0 I}+{VZQo~ XW<41d?Kg(TVZY0𬆛 s26*_k*xcm:yc{Xο5P igi}]TPmѱN3=Dfv-ۯw!<,x:pPOrn2CqٌkUHR4Vk4|oWޠ #EwrssskH$9mL@+\0,Q$Wyr͢ |'y̘/Yz;Zǁ7h%زL<ՄF@OrÝ;IsoOƎu1KO]kye3u,T`F_0yT uHcaW?ݝiɽ1v+’/|oIaC{RrvKNrӪҜ%X.l2IW3#N5%w)siFW?kfZeE qo:ء $fqf"O ˄uߎ"rļ//R_MW"VڸҿO-O2)0@_YlnV02V(5~j c^TÖRU8J*20Es8ͭvo--a5TJif xBT9`Z  hB%J-]@+Zٽ)"/ 冟Y:ԓ e4;^dȓ5-E)~J;o gAkIfsg'2k~CDW0H6~&Q w[%eDOL}:3XeWrILcW6I|M4,;n \^`='uLL0,b{+H_s“9YVn VRj m5_]~ ?$,r'RvdɔT S:\UR?5ϨA$eɚ.gxQчTeү| }Pg1[|~~~lx2QQLe!0a H `ǧ/ pg^m3-Y|x6ϏI: Vi.I1sV^0=׳I/ڵLtǻh ;1]6~D)[~haAUy_:.%uPv;zsmK&|ұ{gx5AK>Ի8j܋o5>.\\{0Rݪ]S?oOڴKv|֬Wߙl`VY`#nC>|wN=v^l)vߛ+~k.8r5LXvcY|J(?*`dpB|A\0rX$))Q.]hbʌ%rKhuYęܩ3C%NQ[syF^G/(0Qύ ?:Kb*5h&{Q\;INz&[neU[71i\pR0Q\z;,>:rҥEr{ZtUO =Ծ-?ڿmSCo=jT {а=² s;PwQd|0Yz9pmwKغ~.gϾ8y3p'[of%}'- otҋjj*Z"R%*RVmU@6;Ȫ_J% \Snڧf a16Ya3(Ut5–PMT|wTCT*%P%R Z5E%2yϦK~WFkHq8hH @ Z8<"Ցkm.SLB9*t 8?_)L ^*kh9t Lqj"!\H˜(6Mgʅh~*8A/z):*,r1?~D`!=F[RTSʐ`}dYѵ߷O)CG B/x8ӬƽԿ16 @i9ku XCT%CQyOAЃ$ge_7ƿ:xGu  h'hk1B)8H'hO' D@dl87q^h($ j@V#:tŅdP(Ck/!$ jQъ" S(P510 1?ai[5ӹ j-2&AWyڷ&M|{ڻ|lwhŻv9[t>-`/3N^6 ט4kWt0a =֩U}!*}4u# hYdRwp5^n{<=9XpqcOu~ڭme_.߻G2)ϑC{ wߚobաs`(Ry-D-,2< 0XUttPE IDAT߂3l [b PO$?XhTD;zuG<ީS-G.5] V;=DRҹlvpo3}_=Rh!V9y%&.v툅q]t d Fv_n' K"T f.k m#ԐrA(@WE0·Guj/b ̦OO.wf[GͮTJ\J#̣>bX]k@sټ5J٬9Nt" OC$՗ل7#pQ'" TT@n>ҍ2.d$̂ɵCP!ڏJ0vѡĚG1`CVr;~TY˰i2O@%B*] Q&q9(@!.'V hv#ODimS.0o^9.1yNv>o&鮃MYBߺ9ܮ5?%f"SY^g_aۗ3oVy٦]fߎ(tMZXV+nd~;'_=w&N#ߵ ܼ;tk5myZ ?1إ=IuFBjX>ԑsWc"ܛnӷHݻw%>y^ !Kop#Q'2ΞC4_\=.X|u7xij:2ڠ3rp1:N6]R.E%nZb#v ޵tP䜧E@9 Ja)bB穒Md)S,5ah= JgJy93kBuջKKjX+@TI B4:g{1cLah,S0;q+|` @kW)pZ<ߡW),=U)5`0.BJ, u)fE1ݛ ~zA @i$IQK!KlRg ;X`ob T25J\,ˀP>L9.6+`Uף"sʨ'8igϝj I`}t-%aJՠQ+kj٢/~8RE˖.|=? ?[bHv̕ȨXb0ƅ5]OS嫜331𑣉iWNq:4ʉmg~(oبȨPL%ϟOLX?].xmF2lD'v~eWLjaE@ňcYc3ٻΝ:u.R{+ BΥJOi"[tN2cmAy빘LE&G68It<ΦgP,k\$W(R+l &M eAA6%2Z`2f#[؄pV6=$4=(+J6QIUŒ +, lsA;ͦi~1lFQ,LmEyeN& GgE2E.5,1i㘌hDg60< }*N/)D ZJXŪi)7J?EhA/&R½igfey9ZKwǮg`w]bRM QLr·̩vn&&sZGqmmKS o$ H8rָ\o?a:)ޅ[M`&$}@{6U/PmמnB~pVSyOz#B](;X]q|}$  @aIENDB`minitest-reporters-1.7.1/assets/spec-reporter.png0000644000004100000410000011710214661605652022246 0ustar www-datawww-dataPNG  IHDRkBUMiCCPICC ProfileX YgTsQrs .IQAE( fQ0!$(*b$`xsϽ33TW ΩSW)@Oxt#:8(_+Wƭq85<]OO `N0%_: 4_dVzGLj?>c߃ǏW0f巧[SilF_Qtp: C8N/ǩAO pz7u(Uֱ?qZ_>32f+8"Vi ~P?5e>v{5`ׁ0քcUZtq-Ї?:J5JJKJUc8QdT-80(F UX]Wu渶V#]Ȩah@o,pZG& Gm.9~í0'1 }R@` 3[`ԃ@8dn2RPyp \ nù|`,"BD(ƒ!h!qD<o$@b$d ǑSH5rA"=352|EP %**Zj:@tB =^C~t`c81LŒ0; hX2`eX-vlqN'9ۆKUpOpqӸx /_t|>;o EЄϦ!pPB#4z"C#Tb 1xxD%% 1H*$S')J* %5zIE:f: tvt~t tYtt7-ҳK;Ӈ/K(6C0C C! ɬdYًK>L>Cn&?#P(}'%rRMi S~01*0Z01b,bIɀi S"Se.)f:fIf#f*s2s A6e;p,gYLY%YMXXXY[YG0616#6_=llw޲إ-C3ϳwOsrqrl(1‰qJrZpqfq^\2:U5ǭϝ]Ͻ#cʓs%/Wׁ7])>v>>_ K|C(,#rA3(cS!yBlB򄚄 s  OĊYuM})F/% '"6-.$n#$^#>$A'%$qTĜ>RRRR5R/)zۤˤd2Z22%2ݲlll*!,W"׳N{]ĺudy8 >)+z*f+WT\UR9UWY_">U.z/jrjj'ԞۨSoQ_ԠijLjkzkkjkkz6ޥݠ=^c}K?ՙ CņQ]Q])ݑ78'G+{/_?n cbp!zFƘqq qaSQ@i3ufxs+lA  _jiKM˝mVd+'Voei7mPK\퀝]K{)mE;9mu:4lE%֥ŕ˵u-m]}#^`zOg&Mz{{ lڼ}-[¶ʴ7ՎZF)5=O/o_?<@7 '`"P707p2H/ h*(xҐP3+anaupm#{ңFߖmfEF7GǰÏXؽ6we{ل ㉦wvhIIڝzSHOr.]iަTqRjN=n{n 5[ΘNKܧt?nўYt`!CV:qp$@^vUKNbhM<Ἄ[?{tк#ǖ/2,+/>Po|VTg]p!.Y]juĕlW3!M_>RQsFMWo): PtvV#}cZJSbLsTԝ;-[[9u޵>hxv4]PXNk]]7{64yb^Eߣ~^#ON< {e(nhy / ^ɼu7G}G?E-M{GyW0.4^=20i:~>,NdXIӕ;ݧ~}YzϷ3վ φ.eQ55ma|1~T,|+++QTu[G4 gx )\k:"  ۃs$n:!z][r( )yVrQNY&^&>7 oBD;J|$ dTe䎮kSVrPNQQWG557keh_[zEWk/H&G͇-+qk3,+O~8q:عrxzӴŭ#k5?!D8  k ?'2(~M89f 1*>w{rBX$ݝS v[Oٻ7=o_3:2:4~c#3ٳ933y 뎙-U\XR{ɾSCe#+3UՆgj坿TS"%NWV}f7ojzN~KFkR[]{?y~Qkǝ u]=F'OUObeC#:#^qF\[iq|lbSS3>~f|u~ݗ\_}1C hl!L]ħ܉$y:)z)Qe=/s2K)k#$3{?a~UMB)§DDH0H IK[x&宻(ߡ0SQ٠QyC7t6*d^06hJ20W0t򵎰nl~C~ .in AΞƛL7{nߚ}{q@ `rTHwͰ𢈬(6/~PbLx& J;xvr$3"My=->@؝yCÇ?e˞;1ǘkEWt-<ԫg=N7V6ixVf/^W Rkz{oceSCs㝳-GZwMuAv8=uu] uxbg034پ^}95|վoHoލN<7Q>}២>GMG}}=~&xli=?.t/_!VS#`Y89\>H$&)ӷ3)*LLXYrwrr:rrp,N7  fIP%M~HwȔF˙G'(T>R歮Ar~Do.Awx5, cCI#fc`dtyU Ѧv={F\ g˰y$wKWU"~-)[I=bP ~d!3SBCAhsp\ȽQQ?<;:.{la܆o'x'r&Iڳ=Y:yvWkJT=i{A}8I=vxh#f99r7N%t @u$oE=gmY-@B} H0B@Lxy;83s:Š 0?F|.2"j`׋.`b Ua8n=.W{g[ )"hIjipWm}N! Yc`BɜdAgIbQshp|LqQsp~ңs܋a׭IN~N{BBGFn35ĨoaG])yi{gXqaWُs_ .>dBɊ3')Վ\( wIeJ?yq7'?~>|W՞[X_[\3jEsm@jHZ^ A``DK$V` CPkG[?f%au92qw^ D#!<$2=_I\;:\)zS8K W`&L#Q)'33y0u227ldib5bmgsb{ 3,NYG\۸98MU d Z 1 ,rX4XP[m#R҆2ruxy"2Iy^eBuP]v_u7(:l ֋ѧkjoH:乞tkr⩾)1]>b~W:ǂC8CUÜ"G6GqEŞΜ`N䝻FwaNkOO8/wpa\|:ttJKeNUU]Sqe ]f*_O񨁩ѸR6y ?x~dosaiKί? ~Xm:XAhH!ҌG9Qc4D0KÚeXI- A a7%q#D"EJQX g0fE&ߡS12053{1ϲag}Na0x%}LJאOQ`Pp8A|^go˲rRKꕟ|SUHl&ҹKߪƜ&f,=m#]U\<];=l e7B/ BZn "cc[cv|JHI=%3S}/G)RX}|K1}əR͓ʛOWWW85qQ+;-)yvjFdKq=[uuve۟5hte bGߤaoSщ=qvM}d9aˡߌ}?;c;|6hvv.nn׏yBBb%e??ϭ +.+gW?:@+ᆐ aqxe$WVVVa_*OTjw@&- pHYs  $iTXtXML:com.adobe.xmp 1 5 72 1 72 662 1 107 2014-01-05T12:01:75 Pixelmator 3.0 &@IDATx]`E~7B TC% I&"JUP+J {^HﯗB Rݹ};3b HVfIgmMfL.l2Rkg"$H)*yS|5t OU i:!^'0bی"&Uٟle>~OqWxO1|^ss`p {7fd {S0=}rޏ2#fԩWS CC*RB"4|euX0LmF ց<%P ʬ8Dqu^/;ob+ DbآwGn4Md2) ΅Y+ߜ2aX6@LZ_FSm\`0 4[lRL|0AJ,TJ h2T/V,->RB['_I 7ږZ? ]B.ܨމ*%0SZe1J3i #q\>>8h2!l2`8ɚ!AlMX`1˘CM3 UAM)4b1kVB*͍I0Ióe*Eb9xf*\ :b6R(uDV02B*jlJjlB!7)/W(| >΁rAMdHL)ټz{qv-v]i$jߐ~.YN}RD*ݿ~fޒz>FdԻywHK{#$F.]w.hb9  ^uADʎWjzЦ5ۏ ].>%vтWFl7$޾e%jl׶i ?WcOޘhD0pf2 `` 2 lʥX_`Fx87m*%lId a?<!?Q|w"2X<^rHtfZVZВe^+T¦},w?m^=Ң]F5jճʛsyaDIF׬^Y(Fj. 7NT;`ʹ|A.^SiⵄI/4lT"[lb`MJRvrDT@D? +X ^2:yο07z˱`katmz6y@A+F!c#f#qU.T ,]ߧ}7ESI_@NؠIB1fH4ܪ+:m_Jtً<ВRnˆ+ھ|eRy7ϛ˂au/H8mWVw{6ڶ?yn+*QΏ 'ɘLƒV0H} 3fPF+-2=vƀ=ɝ X]D  '/W7LX@u A[) %V*C F=b9$+%R'9S`x99_}U̮J8Qvzi%i5G$:q%Ƶ&0r W/ěW^D ]'ޗ}Kw;@F6nGJ4*-}T}C*H|S%$A\̧fڰ匼ySr÷_Q{5q4Xm`(Vh~͐"0$oXX0ʹ訌)9Ŷ/hdHs?(M؛+UوRt`r7c~]d`v rIbr!\S;!f!\A U} 4o΁WpBtnOBKIzF=41'sਏ]1]/j5u=kujg,oUb,5KO0qwk'uk`d6-sǖ0щTox)ԶW٪cwy`ð}wJ9;gc(wd4{ h-H {`m-iFg%aT*L><hR`COXAPdxxIud s⫇^ ARaא6ߨvm#hd մylU4ġnCh5+ʿ?5A3ep?:]ؽ#QaMնy5[w:ẅ́]Mm&01ރ'#:_IV`vi^j6a UJ,r&l&<5iktb^-&#b3hbef^50 ^( San]M?w])Vn\&,RUٲ8_ۻщ7٫OZݼyʵB)2^zSk5/?2x׷[UNwuݦ\He6w Znٸ͘uݳo4 p\ʳT ܥkz^!YRԪߤqD"lכ鿈|xLe&f-cTD^7͐I̶6E눺YP ; DCƀva-/!o,P/ L ܨ.erUcl'Ջxj/fA999  ޶Љ4١$/vB=4dB̃P}3 Ȑ DrրE}b܋JC&  (\ԬKuTĒx-` pm&c{l6ܔILT2ijΰ|*@8 \犡"t :`5lH9@I LSLP\"&jo) B6a(W8T&E:y~΁'q aRqD-Uȑs7nD$n^".M '_7 \ꪒ$'g ^I>e h bE s~vcҡ ¤sLTIJt,*1AƄ}qAʤg#F<\&#+Gxz(*Yw MF$*\P"r~5Qŀ& 4yL%Bjà3 f_=zml޾OF}Ѹu7Z8=]kVx0o}[P2JZOa3D7lt2M[۾7Y(%F@Z~yZ" R,A3Ōɒ~KPuEߔdY;En1>e3/b,F3@Z A6L uHu ÖN@b"wJ{#sss qp|ͥ#Fnlk;`lIUNxC]*TZLIJM>NX\7j_<^t<--RfN|*()Hљ._8]z57<&ӗ`wli4~fqJOK'>p[BwHdfFNJl!@:زĩjë#N H*6x"V%8e/1ȟPEeN5c.(%gyzSn#~8qtf#zG_=ԽWKc1*Us*~38_.| 1aHnfis淬]:61C1iݏ_ hԸ)l_[8\| ?.m{T>@u A\ysnz888^4>=J{{c[6_9|%ְg`<6 mӱmjgE_xaU%m{S#"jo1µ FqT4>'|?]g'5 &̢mX · z|bNҦ&z5$s+g^N! E0R0m'b'{택86>Pm&?<N9 q'vEd2p_lIc=#V3O,Urq J¦29<xi l6,Q8G5 9M< `@Aj0y&ч_9`Ęm,\kRj"֦u%j/[&0檼}~='z3$8`xϠ*W)\L#O9yL lNN3 utN^i֗D Ʀ- &2.Aր`+a,wEt͙`Є}'jTL22$3W}5&Q?jH݁.w# h*TxCVa q@AH:D6 śC_x CmZ1ftp7UhVI~f2 Oxe΁u%ZEqb\LqWH/VV0-Mo]qg+7cpiS'4S I afQ{6ϴ!t]OkT~骑>EYߢ_f/ݏjꙖJJ$u!=!WCC q .@& B&O>x>AV!"[ Y=%AoU0i=X$_Ulj>|m$ A|r~E*! 4 .~㱳K e9ǜ9{M.Tv"jgᆅE%+@G (ga"C *KlB5A[Z$ 3g'N|^DiM~ǜPMB,*;3DN'sBnP##Q J잢!>Y>tznQ[* 0eI>B"=-U7!h,O31C p-{ȥ6Å)2ٰ7Dr qUA!`(@;rABڰ/@^^f3yssp fX!͖prQ :I,VsL,3N<@vnRo:MXC 1-DC?k߬\|MPƈҮ~\{|I5QZ {kP ;&UU)11 'zDLЈ0W#,F#(!rpaEo|!gGt;fH/Rn%9lԈ2n6pHPÇZLԑ̈Q92$ eȌ:zj̚fT[;CdF]rJBBҫD f=TvjIe[u9ՙ'h_-~@;v98 *2ұ6Y o|<M|>ru`%B~|oٰvs5>tfSV.r%K[|+/~qf'wos)ҥKEAeg-W϶tt?fM+b+i{lٹ_Y8EP2~H\=⛟+w7?hRͷxo\zٲM>~i);5':yĩh.q gtf+d!̙&$ۍ_$ﭞW wa @ bGfI3L R;Y.PIUR8sbH0lI\f?mWފM?.I0xjlf#థQwSM`}rso޿qm# XydrͱYZCbZ!h;8CnB,2xX̘a)L f8|`P Ji&-PB(`͂qTBf fPd4$2^!'2r`e==*lG~Wx(D0xF&x,PNAeQqAސC/X4(_2r;a0AWiTi䳎u4gf48{)2q  BHer, 0;/9iجA5X)ߜɂqJ5 ׮DݴURTk]?l2\㦐K5~- q4Q1}ltA!T*19Bbà/,\JU9U;q)B*(,"OO7Ң$6uDserOϘQ錑̖%}I+<42BdZհeSTk)MnRK$ $b PpƼu ]( pI]_p&%0(dL2n6"B xxTȢ U9|"jH^f"xKbة_xA4z& B /G0l {@U pZ28Y3$~ZFq$0Q( 9vR"31X[P;=;^y( Ȅp( p1\ơ{5i/ Ԛ^56noh4jaWXPU+h^pc3~qѓIr%HF`HpѨRIqAo= THHLՉ4=)^JyIײs3JQ >[OŎaּv)^a͒c;ΦX+)4jX!Jc][vȑ.nJ_m?}|ܘ$sSqpjr\@35*Yl \*;v!R/×ٍCmP*2m3bʄN(C~%@dpߤu&:cFl(^Fu 0)@) ,B< ,i.I8lozǮhlFhα4A5o!ȗ 6zıCGa($ 5V.vGYgtw>8@W#)܈^xND#1'΁a1k$S͸+O^ԥipSʃ\}&Z:gVG4kVbluvڝJIHhn]Oz{j3gΧRϫӜjs)4R1h5ϝ۳{,?ع>.ܴy4s˄xlY?zxshhwݪ[=_lfM"|ްbeDN;}F{Rxʌ;w,R͛U._<֙myPr )so/J7`9dS%;z$.Y>urLJ~4x^Ƞ!R~3*GPOv[@*R4@C7P 8 ̲uKA@9d:z=42R!]= *SU N/]7 Ǜ6H,R٘FAĆHpxj_Ł$3&\dINIaD%%%)E+%S ؉~.^ONz~H7"x'(ߨsƟKgss;q4yl:#E"PYIjlԗjv=T-Lrb=mv$AJ Wԅ + %Ah5}OA 3G/ϼ΁8_9fV]E3UϗZ8:BPAjDw8yiՄ/|H́<Tl1OH,:>%BP;d~eQI)iFW=sOhjp 2"(p8{y}yEV/wmj6ᛀ:l撽x6l/vh63mȐx]ywbyt|P6>&"ZҠ8ECKMf2y)UJ b!5Ŋy{L^QY~M*)Zgsy[#ew#(ÛwmQ/ٴo>KVh6طvKv 6-ҧ[mg#]vwvjMM:ղ\"6dB.޹viNm+C${y<_'Uj)+ªTS-ܜ%f@bFuh^1Ӿ\p`ʵ{8`CTX"e֭[x:{x2aU7k;j䇡!,YZ UNJ˺BӜc(ةſ}f=Y˗joĴo>vA |aMëO Z#ӊ%Vѧwg.V:jXyVxl@ +Vanm$%+@HޱՐ3U*^o @0LtKQsx8`YSu{TMM:qX 1PZwيj|LQ$ƙÁj5t/(s152BLTԨWŜpDm|F)}#W}:R%x˳3J5JF>z IW8(v]4a~kEJUצ)ZG^ŋxmRR;ڊuj/wp 9HOٷS~kCvžuq?/=y[^~+4S?P\uۉc]uqwE3'ZŞ5 O|.j%B`X^GM˕SV9m޺׷;A(G?(7kݦQy?[@6& VƍRnKv]\VϚb]7 u +aO\hmRS?Y  swbLI7L㳷\]ayxIQ}p EGxwđS݄49_W3xloQ)|;RKU(/0"殯Q%J*.LظA^ծU+=EeM-AL5ICx U"\ƻ*&ľyP_+w(*ՈD9ۺ^F_^D%2Sq͜owJr9HQ,kMI>tyٔ =qlŀT$r (뎽?={Vn޾'sU۰%٭ ܧeC '_FkmyNN8 H;,\Z,`PFs}Z߹qSfLJUP$bCyPt(Q!mܼ=FQzњvmЦ _@IDATN^E0- d lzˁ][uiTKqg^&AvN$"B/ chޙ~`8s}s(Ub7O)?~sznj{i/SQ)Vk[^=V}pPх5[9:S+ώxr4vxM(ʴᰚ|KܻwNP۔o?*i!5sg8=nڪ7}/GQ_ʁg 8 6j2\ԱExDM4mS~kPN!]э{rWv3F XLL~jywc'MnXF}:O';^ͺWfb>H$ׇ iQe+[J{8X69*)֌_G9Kcre;7K+Uz̕nRՊ^k᪒wao)fy(k;GO}کbLRPea%$W|j󕔠|hy+6&&im=~`Mb/jR?Іs6,Y.$-61~4}̧A<䦇Q֤ǻ5 oݾ׊; MuרUwf q w{}إS[T:h@6nfŀ!mލWn>g>׋ZvӣGJ<'TnѮ 2y۶qSuŔӼwj@NKqn I|?jhMZ|l\y!]sʂjQ(mֺ}/YаMܾtF$BGǦYգGUKFڢƭ+n܏esTa)׎>HB2\Q;9`TF(Ij<֪> jd Ú^ظQZ׽J{qK Zq/ROAeJ6ZgN Oܖ&lQو{7lMtږ]hY-tF|)6iѾCJLXX5"Fk6(}ЮC'Μ8wGd)Wﳑhur&oO=Hj>y沁"F2՛nv82Gs"/w=4u]=s`ν{ݥ5-Z~ ۥk!1l پVlLB\|*6\:`1I: $ᝋ[u~]x9ٷo~YzjKz>v߷nHKr-֬YDܹs%kFh?]Q-qiY#"< 뷝zGzuڵ^)/j_􎼊#06_^_%FgRΜI@>[6ω|ـ(Fb UE]:^wΝޯwOښ|09[u&.*t-{Q,Mxx;*Fޡg8vĸF3a5vWܶ+r"W>=Z^ĖEc&/U|Td&#lGlGCtҢQ[Ӽt~iFO/Ը7Gůx0eH2f%J&FB\Ʃx[ ._'A% ::&b5ޝQS!cX qthl20Xk4zՒ0&w<\oͻO{/TXsN%]S1qbb|ؠ.0o Nh!a0B *xΝ8(Hb1'CFc)'O2r D fA//L~{j%>< `S"V tqq^H0L7f:6qa||㻏s5C!ZHPowͫ-p`].?5[l˖wS]-L3<JKxpxBglڔnqY]T䵿}dӉl<>D^Z9,.LSx)^:ْ4J? *E![; _R{-o+:l(:s,`:[i&^4y4\F]=-Dha#t)=<9i"fıX8efqjbDpGH/kiEܬw x2ʝ?Q!<opI4Z=za'75%3dy N|`Na;C * 'ft 6K w32<;CF N+٬-R3o 0:,z)9@8\դT7SJ?E LO8@["% t?r?h9 dGr  ^7-dޱBM8EsGlƺ X*dRD͡ZFX;p8*ЗHohAG2b z)O9vbwϑ@z+e8kui9o=QWlѧ88R"x 4C-dV'C'٬Ti}ù/%ٌ(u,d= vtЂԱqąXhL b@s+ D kXZH֑&_p P-WR cv]"bbFkI€=AC 8N ;C ăN E-O$ <^Z+9$\Rw4:g KC IpLAG6'@spzB4D`gr\@#(Jp e"4c B ђ˱X/@="MH}/t!'<: ̣X~Y{F݉ b fa(FSQ1T-X1XfR9YK8ƏjݳD8E)t:lo9]@ yaȱ)dR9΁|ɁW&KnAA攐f[& lAn@.mcL֗z< PbG&0RB)7pQʖlPCi 8H"M@K)$"+ ;zP`/\?":$^:QL$aD0^}B1{Q[NH=o∽2e:~"ftք% 6 &fb-fmǯ8888G"CtXDKIDQ ѐæ1$BO'NHbX!v c p& l`IFUJmQcK+Fv}ީ#gP ?+ n@ZPyӅ`'v6ta;RAGdUH:tıE r{JӇ_N["4 ɧ 06t,%-P@`w+<0 -Zu1a988ŸW$ | <YAg2dL΁] pTF/ܧuRjB9ʐX5y.2;='t楜σ:Ax`vy脜#C}Bp80׾ /TP$xWwkB4`88cpK/Ibew8/u988^%8?&VFF H)k23fmpM l("oEQ>S !#k$Tb/sdX_Ыr@>_Á3#SZ,TC͆Qy #D<5<nj$XxSXVE`50N}"zv6c6r''J4A1rBHNsYJ9r-Yc~jt#!$lgn 8/{5LB+5E<1z4m.&QlPT?!9B'9F!cNA¸pV:c, ǽ,9Ly:ߜRJņcjoo/WW$WWWHqF akk୶F'g < Vm@-%1Zۤ.ڰvXEnEպ x*su6s [%!6Zoف.K9/ .jJOHӛQVE5KŃ kSF Y]lY@K)k7o+eD'xU禊cb2~!"ґ$P24.0a֖s6ЬPz,7+Y@w}Ĕ. D+璬yWl6S>ӗ1A/|y}΁ρ )ܨ5c]۶m۾}={oa2(}'̘?_[ވ R#@P.,&GKth7P5$P k{-7(DBA:I3 ^7o]V+\ (G5֢èM[Ys^ q "歛׮_l7A׮ٴy}F2x-[6۸q/_{Köغ|[6OĤ/l庵Zi'h:d Y,W)u4Bbq Q?QQCOp|aI$)a@<P4CVADLh7F` X ʏ\eyssssq C !՚:|k>ziū*!5}7@S݀#*;Ӱ,JQ'޷$6_5>^ kܶAek\\ HL)ZNELצ~k@V$IZ98$vPK\9xh$\^^.*>] B6!s93Z坡U+\ z)V2m+&{S~ߴl䰏}ʼѯSM+V2c1yɖ{C?|?m=pX!}گ_:``ג|ΑǯBpWiYcO]D'mzOȥ's C  Y {[tٲKVn<5zg]GY%,Vwn۴uǮG=@V1jޭݥBf[`-_o[m4e뎇1]vd?vjĮq Q[i{Z-'N!N(%>6wahU3^80,Zxu˯;#7<\K6(_͌Qg?hk5.桑?C+w)TnEʖ>a;~cξI 6osОݻO;2fpGHWL΁|'dž>zcG 7&IÎ) B1e'^NMPma,, 6ڝ*~on)cG= Ӕ׿& ۙ?&_޹g?-1N t7c_=i:_Ojי9Q/[24TRbhM![q%|<Xxz Q*r?tYMN~x;l;_tUYҖϾf-Aػm~.*Z(ޱY6u8vKO\bX|%"Wo'kǶF|rf4N2~99999XdpQd֭^𗙿N13J* wE/ܻ`KltƦ 6<4!$jߩKl튵z#L&mmٰu[jOﲡ~GmU5jTkW[~ٳ.Mnmnó{O_aS׼[ms1L%p,!#>- &1Hf!6m]G?.Wq`դS">ՈS*oj }وC+ow6dJ7 ҨbM妑ߴB^ ,\eD;mWbЦ7YJ@*)ed6{7^#7X%fsך*?6+VGFGt엵 ޺ibF?Fekՠg7%ƌpt:~'k'S6:!"΁&fd,R T!@2?-BOP`- [6D/6̚8IDѠB8*P?&,K{ '}՛_8~7&PJ*;$ ꎎ3(hDBJKnI*\8yK$۰x7[7HwZ>#?߰q'}:tzD|x{_ǩxqU\?|&:&.=W{Lws |=[+qr2(4¼X͆3ж;tVpQ=uv^ ŤKXPSĘKFH$ zbAQ8"1)¬GssfHJO5<>=1"Iv.I/9x^HhARP`#WVUĄ\x9:.IRRbttlcGzUuilģgI 2wo1lU{OߢёZ^TͻʐUݹ})hvmZvp6_hzu;JNCASi7<5d7K;VT+WgWj*n5 sr),.޻uq> o~Cb  PbeHȥFaj Tdr-l|5 fbIH[2BӍD+4dOK5r8lpbHi0!*R7PヌT՛s VWLZŒT&lh0Xs )°WdY +Ȑ,*51=BiL]=+@ kAo`qTȓJ\tȭZb88a* `-3 Xyw$ëPk8!!kц*^*8q$xPlMӺuC_\ 6tom6 4| 7v9 ks-d<:C p'H=3-d{ VD'6?򩡎ͫۆJ b eNp/[LP2CAQ 6Tv1k5pZ h5T~RnVNVd$.LpT׶?AoblUA%7-b4{X ?U!BE;0z4kYb rk[6bn |W c/;Uc2$/D ' dvat(8k}ӷXka%gz]`ޝc5NmuC{~G%?S#O Sʂ?G [w `{GW),?:y̘6I]U\aRS8+;/Wpgczԛ :=n#g85%Et:C=iVc4rkJ{^*hԙ;ZG<-w>9@o_%L.w:K\z& Qi菍~G]:/3hTD25~NP̢9 *yPfZ#4|DX6Uyѷ/b –/v6kdO}t{͞ZVͦ ^on]hItZhnDn[5kʼ6mAME\rw'W(ShDo0Tbd<'Ze+@RYTTH.Nkƚg "_6lhƆ,p(tˀc;֜y/tNh^^6g ߹}>ŰRVX/u/q}]cĠ4n§+NE<펓.{~j~fT1NWe8EꢭKgX3gu}F~8oD1N8pF"äںa啻v_ʿ}S ٩PM|4 YkS J| 떪+s[y6uݿ|Iv;NKrag;⋹&"Q@a&v/= 0<v][yF|/rY!#?9|5J\a焩ܦ@}:6odZ1)Q2d{ P :S^>Z$uiˤMc>wɊ/Duh\{hLE>R2-.F9k!! =g}@V>myBt>+WO8 >XҼC2\.a ~jEUҘ^,yOTeN]y|.q |{)zSG483IVSw2 [i&amXڣ_?^J5^]ڞ!-{{ # .2P{~_t9\JWcN`\yS9?/Wn NTкwdi'Nڼ[FPܵߠf*3'H;$G\_!xnFMe3LRl+n+8(ev^RyUJ;OF-Z_xm:3KIFGeQD{ӞϲR{.9}{ yLD'^GS%Mݗ/CsKyz?:15i0`@C8lQn]Ck_NO)Rl*Wzj~0o{W:mҩ r3o]..)E=3|H[NCq2kP+rRB_*+^:0,rŽӉYRZP37Vr2YgOXЩ 2oĴ !!gspy|<2Vw$EE]7rKxߌ˷;X60]<wV3$5Z TH}q54JO\տտ7o8D FO*,5%'[K3!ݟ\U dh:$Nlŵݹ.ralvc`&4&(-i`)0S"RN7XkWjrtY^*4R p05G Yq7NtKϑ"d\G /n)șB/]p h'IX3OY=Qˆ2pCΩi:A[`,%wb*&t|{Y_f1E-_&oe鉉{isRT {yҞ~d 1^qmZMba&f^^;X աJˉeճi¡q(S^^L8b;l0sd\2 Ҭ"9 ] esC4.\iM5z8<2ЦLo%5H\ {׮}?EEE~ŬEZ֑N~<$ѡsؾ śI#]yekvݛ<ʠtD "}žm(l+Z0x`¥ ٿA5>B.f|&Αɕ0,uW,΅ǫ- yiq0n3Ғ*PM|A @2!ȵ_n||!BVN v5pd1%~sAKs+($ۺ ?Qؠ@EǢ! y |un[ )349A-$\ u$*AWc"nCte03<^Cm( Tjn+tvב-dPJd 0W7kSA*Su;9pgG^%-0f |!J֯'RX5L(_LHYTP%#T,$!H8ӄ5{|~T1:$aҪ-uLZ9x uo$ zq^f}nec4[ l,Yyn;@6!_,>T0 Zf$[wR' ;m憹![ia$zgd7GTEֹL29\#@Q)(4t7k"zvӻwE0ZC;C*v$9 x-|ŒRNޛvڻeiS1$נc5B Y~uвw |jTjڱ#̞2B'ӵGO 0=cԤ(zÆ _},HPB%HYWA TTE4jkAB jU3(-p)TmX(Si$4ܞi%cSKQC H½'<'}LyXե&bP[]E f9;Ëx2JήF$}u3+,|қa#U D]4jɧi a@S1DOCu> H<Ӏ'>?(H.lc/Ȏ tj]QUG,<Ř||[;^zj[ 6 }1P6"׀Kgx$J;{'-$x8}˶S3~otЌ9}'Nǻ}uyAAirմ˚_v8(6dߏJlUV]ZYќ!q3~"ݛ3e hl5ӧ߾]GC.yTKa2yc4yfc;>KGVLJȕ\; %M}ߍG)+,.+I=zbSi4TN 8;+_nlcc9y][6 h܌زek\xp;oٰ6q,>1e2gts֎ʍ-:QUyJ}91E:.dZ<9 CJ'*22z mk5d'xcA^k3-c@M29dl>j9QLnkI #m`RhRO{JE0 І~ab2G[FE籚{G J5-\Fsy2bdth̘g:"/$nD9WRN Mkۭ_`{p͇1禾]{ɬݰbeptCb-"QeQVXL_׮=֬XRH1}M7<+ξ5eBLӾq59OFJeaZhd Zyz*)-?0aQa!YC=:ꙕ(S]tիGYy ⳽ӷgwS~  E :=P STQ\"CY<+MӹtcJүJL87[Y \UTllށ]yTzl[VsSάa4 t(l'_w>&Dk vqDW?YTBFu*!BYgqw+e$?#N3H|W/T#M1ܑPÖA5b{ |z9jݙչp8 SSZ 9 UT(;tjĹ۽7S s܋4Hܖ-tj"b^tL'p2ӊҋ\ViڸPԊg%4&K3ffr9r;B+nҩ>ub(cj1fa9Qg8w`۴տ1sheQP4LӢU*@U7)JHЬ?((TQsxGjTJ˕Jc؎/{:jFS -*z\ɹRV',9eС, vLxh*Im/di4 6W@BPhҧsx".GB-6&zK)l6HW5&Z`) r|[0FH(}\W<ŨRkQEPP(`% @FJРx$_5m0\/VAv6Rj+EWk+B뛸BRjVTAAPBeB|!MPֲ!N**@Ŝ=[K' (\I#1TBYiHg=Ys]kOM؄WavעE \Y|q 0P >4r^Z\L8J9M9 07kLt6˧F`Q7}Ӿ&gUUV q~0HR~[E?D>wK`A\ w:9 ^jgX37ȝ;v=u?'ˀT(sh ~@Jg|v^ Ɔ^? Y[ԻDn8|kH;{"xw4ZC ,GQu4|ɭ;Xߛc`~dE4C XSIDAT/>.K/z@p'/~޼"|k5K/-J+;#% ED1SKz6^V-{W?Nެ+& u 7s/3u'ivwT veEFmaa/#Ig7#T+!Z=opڿ_wS<-fD ?pȈ(;P/@y=d? Ix²w[wC!ot740߀ˋm{Xo@K IENDB`minitest-reporters-1.7.1/.github/0000755000004100000410000000000014661605652017002 5ustar www-datawww-dataminitest-reporters-1.7.1/.github/workflows/0000755000004100000410000000000014661605652021037 5ustar www-datawww-dataminitest-reporters-1.7.1/.github/workflows/ci.yml0000644000004100000410000000216014661605652022154 0ustar www-datawww-dataname: Tests on: [push, pull_request] jobs: test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: ruby-version: - head - '3.2' - '3.1' - '3.0' - '2.7' - '2.6' - '2.5' - '2.4' - '2.3' - jruby-head - jruby-9.3 - jruby-9.2 steps: - uses: actions/checkout@v3 - name: Set up Ruby ${{ matrix.ruby-version }} uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby-version }} bundler-cache: true # 'bundle install' and cache - name: Run tests run: bundle exec rake legacy-test: runs-on: ubuntu-20.04 strategy: fail-fast: false matrix: ruby-version: - '2.2' - '2.1' - '2.0' steps: - uses: actions/checkout@v3 - name: Set up Ruby ${{ matrix.ruby-version }} uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby-version }} bundler-cache: true # 'bundle install' and cache - name: Run tests run: bundle exec rake minitest-reporters-1.7.1/lib/0000755000004100000410000000000014661605652016210 5ustar www-datawww-dataminitest-reporters-1.7.1/lib/minitest/0000755000004100000410000000000014661605652020044 5ustar www-datawww-dataminitest-reporters-1.7.1/lib/minitest/relative_position.rb0000644000004100000410000000066414661605652024136 0ustar www-datawww-datamodule Minitest module RelativePosition TEST_PADDING = 2 TEST_SIZE = 63 MARK_SIZE = 5 INFO_PADDING = 8 private def print_with_info_padding(line) puts pad(line, INFO_PADDING) end def pad(str, size = INFO_PADDING) ' ' * size + str end def pad_mark(str) "%#{MARK_SIZE}s" % str end def pad_test(str) pad("%-#{TEST_SIZE}s" % str, TEST_PADDING) end end end minitest-reporters-1.7.1/lib/minitest/reporters/0000755000004100000410000000000014661605652022071 5ustar www-datawww-dataminitest-reporters-1.7.1/lib/minitest/reporters/ansi.rb0000644000004100000410000000123214661605652023346 0ustar www-datawww-datamodule Minitest module Reporters module ANSI module Code def self.color? return false if ENV['MINITEST_REPORTERS_MONO'] color_terminal = ENV['TERM'].to_s.downcase.include?("color") $stdout.tty? || color_terminal end if color? require 'ansi/code' include ::ANSI::Code extend ::ANSI::Code else def black(s = nil) block_given? ? yield : s end %w[red green yellow blue magenta cyan white].each do |color| alias_method color, :black end extend self end end end end end minitest-reporters-1.7.1/lib/minitest/reporters/junit_reporter.rb0000644000004100000410000001454614661605652025503 0ustar www-datawww-data# frozen_string_literal: true require 'builder' require 'fileutils' require 'pathname' require 'time' module Minitest module Reporters # A reporter for writing JUnit test reports # Intended for easy integration with CI servers - tested on JetBrains TeamCity # # Inspired by ci_reporter (see https://github.com/nicksieger/ci_reporter) # Also inspired by Marc Seeger's attempt at producing a JUnitReporter (see https://github.com/rb2k/minitest-reporters/commit/e13d95b5f884453a9c77f62bc5cba3fa1df30ef5) # Also inspired by minitest-ci (see https://github.com/bhenderson/minitest-ci) class JUnitReporter < BaseReporter DEFAULT_REPORTS_DIR = "test/reports" attr_reader :reports_path def initialize(reports_dir = DEFAULT_REPORTS_DIR, empty = true, options = {}) super({}) @reports_path = File.absolute_path(ENV.fetch("MINITEST_REPORTERS_REPORTS_DIR", reports_dir)) @single_file = options[:single_file] @base_path = options[:base_path] || Dir.pwd @timestamp_report = options[:include_timestamp] return unless empty puts "Emptying #{@reports_path}" FileUtils.mkdir_p(@reports_path) File.delete(*Dir.glob("#{@reports_path}/TEST-*.xml")) end def report super puts "Writing XML reports to #{@reports_path}" suites = tests.group_by do |test| test_class(test) end if @single_file xml = Builder::XmlMarkup.new(:indent => 2) xml.instruct! xml.testsuites do suites.each do |suite, tests| parse_xml_for(xml, suite, tests) end end File.open(filename_for('minitest'), "w") { |file| file << xml.target! } else suites.each do |suite, tests| xml = Builder::XmlMarkup.new(:indent => 2) xml.instruct! xml.testsuites do parse_xml_for(xml, suite, tests) end File.open(filename_for(suite), "w") { |file| file << xml.target! } end end end def get_relative_path(result) file_path = Pathname.new(get_source_location(result).first) base_path = Pathname.new(@base_path) if file_path.absolute? file_path.relative_path_from(base_path) else file_path end end private def get_source_location(result) if result.respond_to? :source_location result.source_location else result.method(result.name).source_location end end def parse_xml_for(xml, suite, tests) suite_result = analyze_suite(tests) file_path = get_relative_path(tests.first) testsuite_attributes = { :name => suite, :filepath => file_path, :skipped => suite_result[:skip_count], :failures => suite_result[:fail_count], :errors => suite_result[:error_count], :tests => suite_result[:test_count], :assertions => suite_result[:assertion_count], :time => suite_result[:time] } testsuite_attributes[:timestamp] = suite_result[:timestamp] if @timestamp_report xml.testsuite(testsuite_attributes) do tests.each do |test| lineno = get_source_location(test).last xml.testcase( :name => test.name, :lineno => lineno, :classname => suite, :assertions => test.assertions, :time => test.time, :file => file_path ) do xml << xml_message_for(test) unless test.passed? xml << xml_attachment_for(test) if test.respond_to?('metadata') && test.metadata[:failure_screenshot_path] end end end end def xml_message_for(test) # This is a trick lifted from ci_reporter xml = Builder::XmlMarkup.new(:indent => 2, :margin => 2) def xml.trunc!(txt) txt.sub(/\n.*/m, '...') end failure = test.failure if test.skipped? xml.skipped(:type => failure.error.class.name) elsif test.error? xml.error(:type => failure.error.class.name, :message => xml.trunc!(failure.message)) do xml.text!(message_for(test)) end elsif failure xml.failure(:type => failure.error.class.name, :message => xml.trunc!(failure.message)) do xml.text!(message_for(test)) end end end def message_for(test) suite = test.class name = test.name e = test.failure if test.passed? nil elsif test.skipped? "Skipped:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n" elsif test.failure "Failure:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n" elsif test.error? "Error:\n#{name}(#{suite}):\n#{e.message}" end end def xml_attachment_for(test) xml = Builder::XmlMarkup.new(:indent => 2, :margin => 2) xml.tag!('system-out', "[[ATTACHMENT|#{test.metadata[:failure_screenshot_path]}]]") end def location(exception) last_before_assertion = '' exception.backtrace.reverse_each do |s| break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/ last_before_assertion = s end last_before_assertion.sub(/:in .*$/, '') end def analyze_suite(tests) result = Hash.new(0) result[:time] = 0 tests.each do |test| result[:"#{result(test)}_count"] += 1 result[:assertion_count] += test.assertions result[:test_count] += 1 result[:time] += test.time result[:timestamp] = Time.now.iso8601 if @timestamp_report end result end def filename_for(suite) file_counter = 0 # restrict max filename length, to be kind to filesystems suite_name = suite.to_s[0..240].gsub(/[^a-zA-Z0-9]+/, '-') filename = "TEST-#{suite_name}.xml" while File.exist?(File.join(@reports_path, filename)) # restrict number of tries, to avoid infinite loops file_counter += 1 filename = "TEST-#{suite_name}-#{file_counter}.xml" if file_counter >= 99 puts "Too many duplicate files, overwriting earlier report #{filename}" break end end File.join(@reports_path, filename) end end end end minitest-reporters-1.7.1/lib/minitest/reporters/spec_reporter.rb0000644000004100000410000000543414661605652025300 0ustar www-datawww-datamodule Minitest module Reporters # Turn-like reporter that reads like a spec. # # Based upon TwP's turn (MIT License) and paydro's monkey-patch. # # @see https://github.com/TwP/turn turn # @see https://gist.github.com/356945 paydro's monkey-patch class SpecReporter < BaseReporter include ANSI::Code include RelativePosition # The constructor takes an `options` hash # @param options [Hash] # @option options print_failure_summary [Boolean] whether to print the errors at the bottom of the # report. # @option options suppress_inline_failure_output [Boolean] whether to suppress the printing of errors # inline with the test results as they occur. # def initialize(options = {}) super @print_failure_summary = options[:print_failure_summary] @suppress_inline_failure_output = options[:suppress_inline_failure_output] end def start super puts('Started with run options %s' % options[:args]) puts end def report super if @print_failure_summary failed_test_groups = tests.reject { |test| test.failures.empty? } .sort_by { |test| [test_class(test).to_s, test.name] } .group_by { |test| test_class(test).to_s } unless failed_test_groups.empty? print(red('Failures and errors:')) failed_test_groups.each { |name, tests| print_failure(name, tests) } end end puts('Finished in %.5fs' % total_time) print('%d tests, %d assertions, ' % [count, assertions]) color = failures.zero? && errors.zero? ? :green : :red print(send(color) { '%d failures, %d errors, ' } % [failures, errors]) print(yellow { '%d skips' } % skips) puts end def record(test) super record_print_status(test) record_print_failures_if_any(test) unless @suppress_inline_failure_output end protected def before_suite(suite) puts suite end def after_suite(_suite) puts end def print_failure(name, tests) puts puts name tests.each do |test| record_print_status(test) print_info(test.failure, test.error?) puts end end def record_print_failures_if_any(test) if !test.skipped? && test.failure print_info(test.failure, test.error?) puts end end def record_print_status(test) test_name = test.name.gsub(/^test_: /, 'test:') print pad_test(test_name) print_colored_status(test) print(" (%.2fs)" % test.time) unless test.time.nil? puts end end end end minitest-reporters-1.7.1/lib/minitest/reporters/html_reporter.rb0000644000004100000410000002046314661605652025311 0ustar www-datawww-datarequire 'builder' require 'fileutils' require 'erb' module Minitest module Reporters # A reporter for generating HTML test reports # This is recommended to be used with a CI server, where the report is kept as an artifact and is accessible via # a shared link # # The reporter sorts the results alphabetically and then by results # so that failing and skipped tests are at the top. # # When using Minitest Specs, the number prefix is dropped from the name of the test so that it reads well # # On each test run all files in the reports directory are deleted, this prevents a build up of old reports # # The report is generated using ERB. A custom ERB template can be provided but it is not required # The default ERB template uses JQuery and Bootstrap, both of these are included by referencing the CDN sites class HtmlReporter < BaseReporter # The title of the report attr_reader :title # The number of tests that passed def passes count - failures - errors - skips end # The percentage of tests that passed, calculated in a way that avoids rounding errors def percent_passes 100 - percent_skips - percent_errors_failures end # The percentage of tests that were skipped def percent_skips (skips / count.to_f * 100).to_i end # Keeping old method name with typo for backwards compatibility in custom templates (for now) alias_method :percent_skipps, :percent_skips # The percentage of tests that failed def percent_errors_failures ((errors + failures) / count.to_f * 100).to_i end # Trims off the number prefix on test names when using Minitest Specs def friendly_name(test) groups = test.name.scan(/(test_\d+_)(.*)/i) return test.name if groups.empty? "it #{groups[0][1]}" end # The constructor takes a hash, and uses the following keys: # :title - the title that will be used in the report, defaults to 'Test Results' # :reports_dir - the directory the reports should be written to, defaults to 'test/html_reports' # :erb_template - the path to a custom ERB template, defaults to the supplied ERB template # :mode - Useful for debugging, :terse suppresses errors and is the default, :verbose lets errors bubble up # :output_filename - the report's filename, defaults to 'index.html' def initialize(args = {}) super({}) defaults = { :title => 'Test Results', :erb_template => "#{File.dirname(__FILE__)}/../templates/index.html.erb", :reports_dir => ENV['MINITEST_HTML_REPORTS_DIR'] || 'test/html_reports', :mode => :safe, :output_filename => ENV['MINITEST_HTML_REPORTS_FILENAME'] || 'index.html', } settings = defaults.merge(args) @mode = settings[:mode] @title = settings[:title] @erb_template = settings[:erb_template] @output_filename = settings[:output_filename] reports_dir = settings[:reports_dir] @reports_path = File.absolute_path(reports_dir) end def start super puts "Emptying #{@reports_path}" FileUtils.mkdir_p(@reports_path) File.delete(html_file) if File.exist?(html_file) end # Called by the framework to generate the report def report super begin puts "Writing HTML reports to #{@reports_path}" erb_str = File.read(@erb_template) renderer = ERB.new(erb_str) tests_by_suites = tests.group_by { |test| test_class(test) } # taken from the JUnit reporter suites = tests_by_suites.map do |suite, tests| suite_summary = summarize_suite(suite, tests) suite_summary[:tests] = tests.sort { |a, b| compare_tests(a, b) } suite_summary end suites.sort! { |a, b| compare_suites(a, b) } result = renderer.result(binding) File.open(html_file, 'w') do |f| f.write(result) end # rubocop:disable Lint/RescueException rescue Exception => e puts 'There was an error writing the HTML report' puts 'This may have been caused by cancelling the test run' puts 'Use mode => :verbose in the HTML reporters constructor to see more detail' if @mode == :terse puts 'Use mode => :terse in the HTML reporters constructor to see less detail' if @mode != :terse raise e if @mode != :terse end # rubocop:enable Lint/RescueException end private def html_file "#{@reports_path}/#{@output_filename}" end def compare_suites_by_name(suite_a, suite_b) suite_a[:name] <=> suite_b[:name] end def compare_tests_by_name(test_a, test_b) friendly_name(test_a) <=> friendly_name(test_b) end # Test suites are first ordered by evaluating the results of the tests, then by test suite name # Test suites which have failing tests are given highest order # Tests suites which have skipped tests are given second highest priority def compare_suites(suite_a, suite_b) return compare_suites_by_name(suite_a, suite_b) if suite_a[:has_errors_or_failures] && suite_b[:has_errors_or_failures] return -1 if suite_a[:has_errors_or_failures] && !suite_b[:has_errors_or_failures] return 1 if !suite_a[:has_errors_or_failures] && suite_b[:has_errors_or_failures] return compare_suites_by_name(suite_a, suite_b) if suite_a[:has_skipps] && suite_b[:has_skipps] return -1 if suite_a[:has_skipps] && !suite_b[:has_skipps] return 1 if !suite_a[:has_skipps] && suite_b[:has_skipps] compare_suites_by_name(suite_a, suite_b) end # Tests are first ordered by evaluating the results of the tests, then by tests names # Tess which fail are given highest order # Tests which are skipped are given second highest priority def compare_tests(test_a, test_b) return compare_tests_by_name(test_a, test_b) if test_fail_or_error?(test_a) && test_fail_or_error?(test_b) return -1 if test_fail_or_error?(test_a) && !test_fail_or_error?(test_b) return 1 if !test_fail_or_error?(test_a) && test_fail_or_error?(test_b) return compare_tests_by_name(test_a, test_b) if test_a.skipped? && test_b.skipped? return -1 if test_a.skipped? && !test_b.skipped? return 1 if !test_a.skipped? && test_b.skipped? compare_tests_by_name(test_a, test_b) end def test_fail_or_error?(test) test.error? || test.failure end # based on analyze_suite from the JUnit reporter def summarize_suite(suite, tests) summary = Hash.new(0) summary[:name] = suite.to_s tests.each do |test| summary[:"#{result(test)}_count"] += 1 summary[:assertion_count] += test.assertions summary[:test_count] += 1 summary[:time] += test.time end summary[:has_errors_or_failures] = (summary[:fail_count] + summary[:error_count]) > 0 summary[:has_skipps] = summary[:skip_count] > 0 summary end # based on message_for(test) from the JUnit reporter def message_for(test) suite = test.class name = test.name e = test.failure if test.passed? nil elsif test.skipped? "Skipped:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n" elsif test.failure "Failure:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n" elsif test.error? "Error:\n#{name}(#{suite}):\n#{e.message}" end end # taken from the JUnit reporter def location(exception) last_before_assertion = '' exception.backtrace.reverse_each do |s| break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/ last_before_assertion = s end last_before_assertion.sub(/:in .*$/, '') end def total_time_to_hms return ('%.2fs' % total_time) if total_time < 1 hours = (total_time / (60 * 60)).round minutes = ((total_time / 60) % 60).round.to_s.rjust(2, '0') seconds = (total_time % 60).round.to_s.rjust(2, '0') "#{hours}h#{minutes}m#{seconds}s" end end end end minitest-reporters-1.7.1/lib/minitest/reporters/progress_reporter.rb0000644000004100000410000000475614661605652026220 0ustar www-datawww-datarequire 'ruby-progressbar' module Minitest module Reporters # Fuubar-like reporter with a progress bar. # # Based upon Jeff Kreefmeijer's Fuubar (MIT License) and paydro's # monkey-patch. # # @see https://github.com/jeffkreeftmeijer/fuubar Fuubar # @see https://gist.github.com/356945 paydro's monkey-patch class ProgressReporter < BaseReporter include RelativePosition include ANSI::Code PROGRESS_MARK = '='.freeze def initialize(options = {}) super @detailed_skip = options.fetch(:detailed_skip, true) @progress = ProgressBar.create( total: total_count, starting_at: count, progress_mark: green(PROGRESS_MARK), remainder_mark: ' ', format: options.fetch(:format, ' %c/%C: [%B] %p%% %a, %e'), autostart: false ) end def start super puts('Started with run options %s' % options[:args]) puts @progress.start @progress.total = total_count show end def before_test(test) super if options[:verbose] puts puts("\n%s#%s" % [test_class(test), test.name]) end end def record(test) super return show if test.skipped? && !@detailed_skip if test.failure print "\e[0m\e[1000D\e[K" print_colored_status(test) print_test_with_time(test) puts print_info(test.failure, test.error?) puts end if test.skipped? && color != "red" self.color = "yellow" elsif test.failure self.color = "red" end show end def report super @progress.finish puts puts('Finished in %.5fs' % total_time) print('%d tests, %d assertions, ' % [count, assertions]) color = failures.zero? && errors.zero? ? :green : :red print(send(color) { '%d failures, %d errors, ' } % [failures, errors]) print(yellow { '%d skips' } % skips) puts end private def show @progress.increment unless count == 0 end def print_test_with_time(test) print(" %s#%s (%.2fs)" % [test_class(test), test.name, total_time]) end def color @color ||= "green" end def color=(color) @color = color @progress.progress_mark = send(color, PROGRESS_MARK) end end end end minitest-reporters-1.7.1/lib/minitest/reporters/mean_time_reporter.rb0000644000004100000410000003117414661605652026304 0ustar www-datawww-datarequire 'minitest/reporters' require 'tmpdir' require 'yaml' module Minitest module Reporters # This reporter creates a report providing the average (mean), minimum and # maximum times for a test to run. Running this for all your tests will # allow you to: # # 1) Identify the slowest running tests over time as potential candidates # for improvements or refactoring. # 2) Identify (and fix) regressions in test run speed caused by changes to # your tests or algorithms in your code. # 3) Provide an abundance of statistics to enjoy. # # This is achieved by creating a (configurable) 'previous runs' statistics # file which is parsed at the end of each run to provide a new # (configurable) report. These statistics can be reset at any time by using # a simple rake task: # # rake reset_statistics # class MeanTimeReporter < Minitest::Reporters::DefaultReporter class InvalidOrder < StandardError; end class InvalidSortColumn < StandardError; end # Reset the statistics file for this reporter. Called via a rake task: # # rake reset_statistics # # @return [Boolean] def self.reset_statistics! new.reset_statistics! end # @param options [Hash] # @option previous_runs_filename [String] Contains the times for each test # by description. Defaults to '/tmp/minitest_reporters_previous_run'. # @option report_filename [String] Contains the parsed results for the # last test run. Defaults to '/tmp/minitest_reporters_report'. # @option show_count [Fixnum] The number of tests to show in the report # summary at the end of the test run. Default is 15. # @option show_progress [Boolean] If true it prints pass/skip/fail marks. # Default is true. # @option show_all_runs [Boolean] If true it shows all recorded suit results. # Default is true. # @option sort_column [Symbol] One of :avg (default), :min, :max, :last. # Determines the column by which the report summary is sorted. # @option order [Symbol] One of :desc (default), or :asc. By default the # report summary is listed slowest to fastest (:desc). :asc will order # the report summary as fastest to slowest. # @return [Minitest::Reporters::MeanTimeReporter] def initialize(options = {}) super @all_suite_times = [] end # Copies the suite times from the # {Minitest::Reporters::DefaultReporter#after_suite} method, making them # available to this class. # # @return [Hash Float>] def after_suite(suite) super @all_suite_times = @suite_times end # Runs the {Minitest::Reporters::DefaultReporter#report} method and then # enhances it by storing the results to the 'previous_runs_filename' and # outputs the parsed results to both the 'report_filename' and the # terminal. # def report super create_or_update_previous_runs! create_new_report! write_to_screen! end def on_start super if options[:show_progress] end def on_record(test) super if options[:show_progress] end def on_report super if options[:show_progress] end # Resets the 'previous runs' file, essentially removing all previous # statistics gathered. # # @return [void] def reset_statistics! File.delete(previous_runs_filename) if File.exist?(previous_runs_filename) end protected attr_accessor :all_suite_times private # @return [Hash Float>] def current_run Hash[all_suite_times] end # @return [Hash] Sets default values for the filenames used by this class, # and the number of tests to output to output to the screen after each # run. def defaults { order: :desc, show_count: 15, show_progress: true, show_all_runs: true, sort_column: :avg, previous_runs_filename: File.join(Dir.tmpdir, 'minitest_reporters_previous_run'), report_filename: File.join(Dir.tmpdir, 'minitest_reporters_report'), } end # Added to the top of the report file and to the screen output. # # @return [String] def report_title "\n\e[4mMinitest Reporters: Mean Time Report\e[24m " \ "(Samples: #{samples}, Order: #{sort_column.inspect} " \ "#{order.inspect})\n" end # The report itself. Displays statistics about all runs, ideal for use # with the Unix 'head' command. Listed in slowest average descending # order. # # @return [String] def report_body order_sorted_body.each_with_object([]) do |result, obj| rating = rate(result[:last], result[:min], result[:max]) obj << "#{avg_label} #{result[:avg].to_s.ljust(12)} " \ "#{min_label} #{result[:min].to_s.ljust(12)} " \ "#{max_label} #{result[:max].to_s.ljust(12)} " \ "#{run_label(rating)} #{result[:last].to_s.ljust(12)} " \ "#{des_label} #{result[:desc]}\n" end.join end # @return [String] All of the column-sorted results sorted by the :order # option. (Defaults to :desc). def order_sorted_body if desc? column_sorted_body.reverse elsif asc? column_sorted_body end end # @return [Array String>>] All of the results sorted by # the :sort_column option. (Defaults to :avg). def column_sorted_body runs = options[:show_all_runs] ? previous_run : current_run runs.keys.each_with_object([]) do |description, obj| timings = previous_run[description] size = Array(timings).size sum = Array(timings).inject { |total, x| total + x } obj << { avg: (sum / size).round(9), min: Array(timings).min.round(9), max: Array(timings).max.round(9), last: Array(timings).last.round(9), desc: description, } end.sort_by { |k| k[sort_column] } end # @return [Hash] def options defaults.merge!(@options) end # @return [Fixnum] The number of tests to output to output to the screen # after each run. def show_count options[:show_count] end # @return [Hash Array] def previous_run @previous_run ||= YAML.load_file(previous_runs_filename) end # @return [String] The path to the file which contains all the durations # for each test run. The previous runs file is in YAML format, using the # test name for the key and an array containing the time taken to run # this test for values. def previous_runs_filename options[:previous_runs_filename] end # Returns a boolean indicating whether a previous runs file exists. # # @return [Boolean] def previously_ran? File.exist?(previous_runs_filename) end # @return [String] The path to the file which contains the parsed test # results. The results file contains a line for each test with the # average time of the test, the minimum time the test took to run, # the maximum time the test took to run and a description of the test # (which is the test name as emitted by Minitest). def report_filename options[:report_filename] end # A barbaric way to find out how many runs are in the previous runs file; # this method takes the first test listed, and counts its samples # trusting (naively) all runs to be the same number of samples. This will # produce incorrect averages when new tests are added, so it is advised # to restart the statistics by removing the 'previous runs' file. A rake # task is provided to make this more convenient. # # rake reset_statistics # # @return [Fixnum] def samples return 1 unless previous_run.first[1].is_a?(Array) previous_run.first[1].size end # Creates a new 'previous runs' file, or updates the existing one with # the latest timings. # # @return [void] def create_or_update_previous_runs! if previously_ran? current_run.each do |description, elapsed| new_times = if previous_run[description.to_s] Array(previous_run[description.to_s]) << elapsed else Array(elapsed) end previous_run.store(description.to_s, new_times) end File.write(previous_runs_filename, previous_run.to_yaml) else File.write(previous_runs_filename, current_run.to_yaml) end end # Creates a new report file in the 'report_filename'. This file contains # a line for each test of the following example format: (this is a single # line despite explicit wrapping) # # Avg: 0.0555555 Min: 0.0498765 Max: 0.0612345 Last: 0.0499421 # Description: The test name # # Note however the timings are to 9 decimal places, and padded to 12 # characters and each label is coloured, Avg (yellow), Min (green), # Max (red), Last (multi), and Description (blue). It looks pretty! # # The 'Last' label is special in that it will be colour coded depending # on whether the last run was faster (bright green) or slower (bright red) # or inconclusive (purple). This helps to identify changes on a per run # basis. # # @return [void] def create_new_report! File.write(report_filename, report_title + report_body) end # Writes a number of tests (configured via the 'show_count' option) to the # screen after creating the report. See '#create_new_report!' for example # output information. # # @return [void] def write_to_screen! puts report_title puts report_body.lines.take(show_count) end # @return [String] A yellow 'Avg:' label. def avg_label ANSI::Code.yellow('Avg:') end # @return [String] A blue 'Description:' label. def des_label ANSI::Code.blue('Description:') end # @return [String] A red 'Max:' label. def max_label ANSI::Code.red('Max:') end # @return [String] A green 'Min:' label. def min_label ANSI::Code.green('Min:') end # @param rating [Symbol] One of :faster, :slower or :inconclusive. # @return [String] A purple 'Last:' label. def run_label(rating) case rating when :faster then ANSI::Code.green('Last:') when :slower then ANSI::Code.red('Last:') else ANSI::Code.magenta('Last:') end end # @param run [Float] The last run time. # @param min [Float] The minimum run time. # @param max [Float] The maximum run time. # @return [Symbol] One of :faster, :slower or :inconclusive. def rate(run, min, max) if run == min :faster elsif run == max :slower else :inconclusive end end # @return [Boolean] Whether the given :order option is :asc. def asc? order == :asc end # @return [Boolean] Whether the given :order option is :desc (default). def desc? order == :desc end # @raise [Minitest::Reporters::MeanTimeReporter::InvalidOrder] # When the given :order option is invalid. # @return [Symbol] The :order option, or by default; :desc. def order orders = [:desc, :asc] if orders.include?(options[:order]) options[:order] else fail Minitest::Reporters::MeanTimeReporter::InvalidOrder, "`:order` option must be one of #{orders.inspect}." end end # @raise [Minitest::Reporters::MeanTimeReporter::InvalidSortColumn] # When the given :sort_column option is invalid. # @return [Symbol] The :sort_column option, or by default; :avg. def sort_column sort_columns = [:avg, :min, :max, :last] if sort_columns.include?(options[:sort_column]) options[:sort_column] else fail Minitest::Reporters::MeanTimeReporter::InvalidSortColumn, "`:sort_column` option must be one of #{sort_columns.inspect}." end end end end end minitest-reporters-1.7.1/lib/minitest/reporters/ruby_mate_reporter.rb0000644000004100000410000000226114661605652026330 0ustar www-datawww-datamodule Minitest module Reporters # Simple reporter designed for RubyMate. class RubyMateReporter < BaseReporter include RelativePosition INFO_PADDING = 2 def start super puts('Started with run options %s' % options[:args]) puts end def record(test) super if test.skipped? print 'SKIP' print_test_with_time(test) puts puts elsif test.error? print 'ERROR' print_test_with_time(test) puts print_info(test.failure) puts elsif test.failure print 'FAIL' print_test_with_time(test) puts print_info(test.failure, false) puts end end def report super puts puts('Finished in %.5fs' % total_time) print('%d tests, %d assertions, ' % [count, assertions]) print('%d failures, %d errors, ' % [failures, errors]) print('%d skips' % skips) puts end private def print_test_with_time(test) print(" #{test.class}##{test.name} (%.2fs)" % test.time) end end end end minitest-reporters-1.7.1/lib/minitest/reporters/base_reporter.rb0000644000004100000410000000571614661605652025263 0ustar www-datawww-datamodule Minitest module Reporters class Suite attr_reader :name def initialize(name) @name = name end def ==(other) name == other.name end def eql?(other) self == other end def hash name.hash end def to_s name.to_s end end class BaseReporter < Minitest::StatisticsReporter attr_accessor :tests def initialize(options = {}) super($stdout, options) self.tests = [] end def add_defaults(defaults) self.options = defaults.merge(options) end # called by our own before hooks def before_test(test) last_test = test_class(tests.last) suite_changed = last_test.nil? || last_test.name != test.class.name return unless suite_changed after_suite(last_test) if last_test before_suite(test_class(test)) end def record(test) super tests << test end # called by our own after hooks def after_test(_test); end def report super if last_suite = test_class(tests.last) after_suite(last_suite) end end protected def after_suite(test); end def before_suite(test); end def result(test) if test.error? :error elsif test.skipped? :skip elsif test.failure :fail else :pass end end def test_class(result) # Minitest broke API between 5.10 and 5.11 this gets around Result object if result.nil? nil elsif result.respond_to? :klass Suite.new(result.klass) else Suite.new(result.class.name) end end def print_colored_status(test) if test.passed? print(green { pad_mark(result(test).to_s.upcase) }) elsif test.skipped? print(yellow { pad_mark(result(test).to_s.upcase) }) else print(red { pad_mark(result(test).to_s.upcase) }) end end def total_time super || Minitest::Reporters.clock_time - start_time end def total_count options[:total_count] end def filter_backtrace(backtrace) Minitest.filter_backtrace(backtrace) end def puts(*args) io.puts(*args) end def print(*args) io.print(*args) end def print_info(e, name = true) print "#{e.exception.class}: " if name e.message.each_line { |line| print_with_info_padding(line) } # When e is a Minitest::UnexpectedError, the filtered backtrace is already part of the message printed out # by the previous line. In that case, and that case only, skip the backtrace output. return if e.is_a?(Minitest::UnexpectedError) trace = filter_backtrace(e.backtrace) trace.each { |line| print_with_info_padding(line) } end end end end minitest-reporters-1.7.1/lib/minitest/reporters/default_reporter.rb0000644000004100000410000001360314661605652025767 0ustar www-datawww-datamodule Minitest module Reporters # A reporter identical to the standard Minitest reporter except with more # colors. # # Based upon Ryan Davis of Seattle.rb's Minitest (MIT License). # # @see https://github.com/seattlerb/minitest Minitest class DefaultReporter < BaseReporter include ANSI::Code include RelativePosition def initialize(options = {}) super @detailed_skip = options.fetch(:detailed_skip, true) @slow_count = options.fetch(:slow_count, 0) @slow_suite_count = options.fetch(:slow_suite_count, 0) @suite_times = [] @suite_start_times = {} @fast_fail = options.fetch(:fast_fail, false) @show_test_location = options.fetch(:location, false) @options = options end def start super on_start end def on_start puts puts("# Running tests with run options %s:" % options[:args]) puts end def before_test(test) super print "\n#{test.class}##{test.name} " if options[:verbose] end def before_suite(suite) @suite_start_times[suite] = Minitest::Reporters.clock_time super end def after_suite(suite) super duration = suite_duration(suite) @suite_times << [suite.name, duration] end def record(test) super on_record(test) end def on_record(test) print "#{"%.2f" % test.time} = " if options[:verbose] # Print the pass/skip/fail mark print(if test.passed? record_pass(test) elsif test.skipped? record_skip(test) elsif test.failure record_failure(test) end) # Print fast_fail information if @fast_fail && (test.skipped? || test.failure) print_failure(test) end end def record_pass(record) green(record.result_code) end def record_skip(record) yellow(record.result_code) end def record_failure(record) red(record.result_code) end def report super on_report end def on_report status_line = "Finished tests in %.6fs, %.4f tests/s, %.4f assertions/s." % [total_time, count / total_time, assertions / total_time] puts puts puts colored_for(suite_result, status_line) puts unless @fast_fail tests.reject(&:passed?).each do |test| print_failure(test) end end if @slow_count > 0 slow_tests = tests.sort_by(&:time).reverse.take(@slow_count) puts puts "Slowest tests:" puts slow_tests.each do |test| puts "%.6fs %s#%s" % [test.time, test.name, test_class(test)] end end if @slow_suite_count > 0 slow_suites = @suite_times.sort_by { |x| x[1] }.reverse.take(@slow_suite_count) puts puts "Slowest test classes:" puts slow_suites.each do |slow_suite| puts "%.6fs %s" % [slow_suite[1], slow_suite[0]] end end puts print colored_for(suite_result, result_line) puts end alias to_s report def print_failure(test) message = message_for(test) unless message.nil? || message.strip == '' puts puts colored_for(result(test), message) if @show_test_location location = get_source_location(test) puts "\n\n#{relative_path(location[0])}:#{location[1]}" end end end private def relative_path(path) Pathname.new(path).relative_path_from(Pathname.new(Dir.getwd)) end def get_source_location(result) if result.respond_to? :klass result.source_location else result.method(result.name).source_location end end def color? return @color if defined?(@color) @color = @options.fetch(:color) do io.tty? && ( ENV["TERM"] =~ /^screen|color/ || ENV["EMACS"] == "t" ) end end def green(string) color? ? ANSI::Code.green(string) : string end def yellow(string) color? ? ANSI::Code.yellow(string) : string end def red(string) color? ? ANSI::Code.red(string) : string end def colored_for(result, string) case result when :fail, :error; red(string) when :skip; yellow(string) else green(string) end end def suite_result case when failures > 0; :fail when errors > 0; :error when skips > 0; :skip else :pass end end def location(exception) last_before_assertion = '' exception.backtrace.reverse_each do |s| break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/ last_before_assertion = s end last_before_assertion.sub(/:in .*$/, '') end def message_for(test) e = test.failure if test.skipped? if @detailed_skip "Skipped:\n#{test_class(test)}##{test.name} [#{location(e)}]:\n#{e.message}" end elsif test.error? "Error:\n#{test_class(test)}##{test.name}:\n#{e.message}" else "Failure:\n#{test_class(test)}##{test.name} [#{test.failure.location}]\n#{e.class}: #{e.message}" end end def result_line '%d tests, %d assertions, %d failures, %d errors, %d skips' % [count, assertions, failures, errors, skips] end def suite_duration(suite) start_time = @suite_start_times.delete(suite) if start_time.nil? 0 else Minitest::Reporters.clock_time - start_time end end end end end minitest-reporters-1.7.1/lib/minitest/reporters/rubymine_reporter.rb0000644000004100000410000000740614661605652026201 0ustar www-datawww-data# Test results reporter for RubyMine IDE (http://www.jetbrains.com/ruby/) and # TeamCity(http://www.jetbrains.com/teamcity/) Continuous Integration Server begin require 'teamcity/runner_common' require 'teamcity/utils/service_message_factory' require 'teamcity/utils/runner_utils' require 'teamcity/utils/url_formatter' rescue LoadError require "minitest/reporters/default_reporter" # delegate to default reporter module Minitest module Reporters class RubyMineReporter < DefaultReporter def initialize(options = {}) super puts("====================================================================================================\n") puts("RubyMine reporter works only if it test was launched using RubyMine IDE or TeamCity CI server !!!\n") puts("====================================================================================================\n") puts("Using default results reporter...\n") end end end end else module Minitest module Reporters class RubyMineReporter < BaseReporter include ANSI::Code include ::Rake::TeamCity::RunnerCommon include ::Rake::TeamCity::RunnerUtils include ::Rake::TeamCity::Utils::UrlFormatter def start super puts('Started with run options %s' % options[:args]) puts # Setup test runner's MessageFactory set_message_factory(Rake::TeamCity::MessageFactory) log_test_reporter_attached # Report tests count: if ::Rake::TeamCity.is_in_idea_mode log(@message_factory.create_tests_count(total_count)) elsif ::Rake::TeamCity.is_in_buildserver_mode log(@message_factory.create_progress_message("Starting.. (#{total_count} tests)")) end end def report super puts('Finished in %.5fs' % total_time) print('%d tests, %d assertions, ' % [count, assertions]) print(red '%d failures, %d errors, ' % [failures, errors]) print(yellow '%d skips' % skips) puts end def record(test) super unless test.passed? with_result(test) do |exception_msg, backtrace| if test.skipped? log(@message_factory.create_test_ignored(test.name, exception_msg, backtrace)) elsif test.error? log(@message_factory.create_test_error(test.name, exception_msg, backtrace)) else log(@message_factory.create_test_failed(test.name, exception_msg, backtrace)) end end end log(@message_factory.create_test_finished(test.name, get_time_in_ms(test.time))) end alias_method :output, :io def before_suite(suite) fqn = suite.name log(@message_factory.create_suite_started(suite.name, location_from_ruby_qualified_name(fqn))) end def after_suite(suite) log(@message_factory.create_suite_finished(suite.name)) end def before_test(test) super location = test.class.instance_method(test.name).source_location log(@message_factory.create_test_started(test.name, "file://#{location[0]}:#{location[1]}")) end ######### def log(msg) output.flush output.puts("\n#{msg}") output.flush # returns: msg end def with_result(test) exception = test.failure msg = exception.nil? ? "" : "#{exception.class.name}: #{exception.message}" backtrace = exception.nil? ? "" : filter_backtrace(exception.backtrace).join("\n") yield(msg, backtrace) end end end end end minitest-reporters-1.7.1/lib/minitest/reporters/version.rb0000644000004100000410000000011214661605652024075 0ustar www-datawww-datamodule Minitest module Reporters VERSION = '1.7.1'.freeze end end minitest-reporters-1.7.1/lib/minitest/reporters.rb0000644000004100000410000000544414661605652022425 0ustar www-datawww-datarequire 'minitest' module Minitest require "minitest/relative_position" require "minitest/extensible_backtrace_filter" module Reporters require "minitest/reporters/version" autoload :ANSI, "minitest/reporters/ansi" autoload :BaseReporter, "minitest/reporters/base_reporter" autoload :DefaultReporter, "minitest/reporters/default_reporter" autoload :SpecReporter, "minitest/reporters/spec_reporter" autoload :ProgressReporter, "minitest/reporters/progress_reporter" autoload :RubyMateReporter, "minitest/reporters/ruby_mate_reporter" autoload :RubyMineReporter, "minitest/reporters/rubymine_reporter" autoload :JUnitReporter, "minitest/reporters/junit_reporter" autoload :HtmlReporter, "minitest/reporters/html_reporter" autoload :MeanTimeReporter, "minitest/reporters/mean_time_reporter" class << self attr_accessor :reporters end def self.use!(console_reporters = ProgressReporter.new, env = ENV, backtrace_filter = nil) use_runner!(console_reporters, env) if backtrace_filter.nil? && !defined?(::Rails) backtrace_filter = ExtensibleBacktraceFilter.default_filter end Minitest.backtrace_filter = backtrace_filter unless backtrace_filter.nil? unless defined?(@@loaded) use_around_test_hooks! use_old_activesupport_fix! @@loaded = true end end def self.use_runner!(console_reporters, env) self.reporters = choose_reporters(console_reporters, env) end def self.use_around_test_hooks! Minitest::Test.class_eval do def run_with_hooks(*args) if defined?(Minitest::Reporters) && (reporters = Minitest::Reporters.reporters) reporters.each { |r| r.before_test(self) } result = run_without_hooks(*args) reporters.each { |r| r.after_test(self) } result else run_without_hooks(*args) end end alias_method :run_without_hooks, :run alias_method :run, :run_with_hooks end end def self.choose_reporters(console_reporters, env) if env["MINITEST_REPORTER"] [Minitest::Reporters.const_get(env["MINITEST_REPORTER"]).new] elsif env["TM_PID"] [RubyMateReporter.new] elsif env["RM_INFO"] || env["TEAMCITY_VERSION"] [RubyMineReporter.new] elsif !env["VIM"] Array(console_reporters) end end def self.clock_time if minitest_version >= 561 Minitest.clock_time else Time.now end end def self.minitest_version Minitest::VERSION.delete('.').to_i end def self.use_old_activesupport_fix! if defined?(ActiveSupport::VERSION) && ActiveSupport::VERSION::MAJOR < 4 require "minitest/old_activesupport_fix" end end end end minitest-reporters-1.7.1/lib/minitest/minitest_reporter_plugin.rb0000644000004100000410000000424214661605652025527 0ustar www-datawww-datamodule Minitest module Reporters class DelegateReporter < Minitest::AbstractReporter def initialize(reporters, options = {}) @reporters = reporters @options = options @all_reporters = nil end def io all_reporters.first.io unless all_reporters.empty? @options[:io] end def start all_reporters.each(&:start) end def prerecord(klass, name) all_reporters.each do |reporter| reporter.prerecord klass, name end end def record(result) all_reporters.each do |reporter| reporter.record result end end def report all_reporters.each(&:report) end def passed? all_reporters.all?(&:passed?) end private # stolen from minitest self.run def total_count(options) filter = options[:filter] || '/./' filter = Regexp.new $1 if filter.is_a?(String) && filter =~ %r%/(.*)/% Minitest::Runnable.runnables.map { |runnable| runnable.runnable_methods.find_all { |m| filter === m || filter === "#{runnable}##{m}" }.size }.inject(:+) end def all_reporters @all_reporters ||= init_all_reporters end def init_all_reporters return @reporters unless defined?(Minitest::Reporters.reporters) && Minitest::Reporters.reporters (Minitest::Reporters.reporters + guard_reporter(@reporters)).each do |reporter| reporter.io = @options[:io] if reporter.respond_to?(:add_defaults) reporter.add_defaults(@options.merge(:total_count => total_count(@options))) end end end def guard_reporter(reporters) guards = Array(reporters.detect { |r| r.class.name == "Guard::Minitest::Reporter" }) return guards unless ENV['RM_INFO'] warn 'RM_INFO is set thus guard reporter has been dropped' unless guards.empty? [] end end end class << self def plugin_minitest_reporter_init(options) reporter.reporters = [Minitest::Reporters::DelegateReporter.new(reporter.reporters, options)] end end end minitest-reporters-1.7.1/lib/minitest/templates/0000755000004100000410000000000014661605652022042 5ustar www-datawww-dataminitest-reporters-1.7.1/lib/minitest/templates/index.html.erb0000644000004100000410000001062714661605652024614 0ustar www-datawww-data <%= title %>

Generated on <%= Time.now.strftime("%b %d, %Y at %H:%M %Z") %>

<%= title %>

Finished in <%= total_time_to_hms %>, <%= '%.2f tests/s' % (count / total_time) %>, <%= '%.2f assertions/s' % (assertions / total_time) %>

<%= '%d' % count %> tests, <%= '%d' % assertions %> assertions, <%= '%d' % failures %> failures, <%= '%d' % errors %> errors, <%= '%d' % skips %> skips

<%= '%d' % percent_passes %>% passed
<%= '%d' % percent_errors_failures %>% failed
<%= '%d' % percent_skips %>% skipped
<% suites.each do |suite| %>
<%= suite[:name] %> <%= '%d' % suite[:test_count] %> tests, <%= '%d' % suite[:assertion_count] %> assertions, <%= '%d' % suite[:fail_count] %> failures, <%= '%d' % suite[:error_count] %> errors, <%= '%d' % suite[:skip_count] %> skips, finished in <%= '%.4fs' % suite[:time] %>
<% suite[:tests].each do |test| %>
<% if result(test) == :pass %> <% elsif result(test) == :skip %> <% else %> <% end %> <%= friendly_name(test) %> Assertions <%= test.assertions %>, time <%= ('%.6fs' % test.time) %>
<% if !test.passed? %>
<%= "#{location(test.failure)}\n\n#{test.failure.message}" %>
<% end %>
<% end %>
<% end %>
minitest-reporters-1.7.1/lib/minitest/old_activesupport_fix.rb0000644000004100000410000000070114661605652025003 0ustar www-datawww-datarequire "active_support/testing/setup_and_teardown" module ActiveSupport module Testing module SetupAndTeardown if defined?(ForMinitest) ForMiniTest = ForMinitest end module ForMiniTest remove_method :run def before_setup super run_callbacks :setup end def after_teardown run_callbacks :teardown super end end end end end minitest-reporters-1.7.1/lib/minitest/extensible_backtrace_filter.rb0000644000004100000410000000351514661605652026103 0ustar www-datawww-datamodule Minitest # Filters backtraces of exceptions that may arise when running tests. class ExtensibleBacktraceFilter # Returns the default filter. # # The default filter will filter out all Minitest and minitest-reporters # lines. # # @return [Minitest::ExtensibleBacktraceFilter] def self.default_filter unless defined? @default_filter filter = self.new filter.add_filter(/lib\/minitest/) @default_filter = filter end @default_filter end # Creates a new backtrace filter. def initialize @filters = [] end # Adds a filter. # # @param [Regex] regex the filter def add_filter(regex) @filters << regex end # Determines if the string would be filtered. # # @param [String] str # @return [Boolean] def filters?(str) @filters.any? { |filter| str =~ filter } end # Filters a backtrace. # # This will add new lines to the new backtrace until a filtered line is # encountered. If there were lines added to the new backtrace, it returns # those lines. However, if the first line in the backtrace was filtered, # resulting in an empty backtrace, it returns all lines that would have # been unfiltered. If that in turn does not contain any lines, it returns # the original backtrace. # # @param [Array] backtrace the backtrace to filter # @return [Array] the filtered backtrace # @note This logic is based off of Minitest's #filter_backtrace. def filter(backtrace) result = [] return result unless backtrace backtrace.each do |line| break if filters?(line) result << line end result = backtrace.reject { |line| filters?(line) } if result.empty? result = backtrace.dup if result.empty? result end end end minitest-reporters-1.7.1/test/0000755000004100000410000000000014661605652016421 5ustar www-datawww-dataminitest-reporters-1.7.1/test/integration/0000755000004100000410000000000014661605652020744 5ustar www-datawww-dataminitest-reporters-1.7.1/test/integration/reporters/0000755000004100000410000000000014661605652022771 5ustar www-datawww-dataminitest-reporters-1.7.1/test/integration/reporters/junit_reporter_test.rb0000644000004100000410000000210214661605652027423 0ustar www-datawww-datarequire_relative "../../test_helper" module MinitestReportersTest class JUnitReporterTest < TestCase def test_replaces_special_characters_for_filenames_and_doesnt_crash fixtures_directory = File.expand_path('../../../fixtures', __FILE__) test_filename = File.join(fixtures_directory, 'junit_filename_bug_example_test.rb') output = `ruby #{test_filename} 2>&1` refute_match 'No such file or directory', output end if Gem::Version.new(Minitest::VERSION) >= Gem::Version.new('5.19.0') def test_outputs_screenshot_metadata test = Minitest::Test.new('test_fail') test.define_singleton_method(:test_fail) { assert false } test.metadata = { failure_screenshot_path: 'screenshot.png' } reporter = Minitest::Reporters::JUnitReporter.new('test/tmp') reporter.start reporter.record(test.run) reporter.report test_output = File.read('test/tmp/TEST-Minitest-Test.xml') assert_includes test_output, '[[ATTACHMENT|screenshot.png]]' end end end end minitest-reporters-1.7.1/test/integration/reporters/progress_reporter_test.rb0000644000004100000410000000353714661605652030153 0ustar www-datawww-datarequire_relative "../../test_helper" module MinitestReportersTest class ProgressReporterTest < TestCase def test_all_failures_are_displayed fixtures_directory = File.expand_path('../../../fixtures', __FILE__) test_filename = File.join(fixtures_directory, 'progress_test.rb') output = `#{ruby_executable} #{test_filename} 2>&1` assert_match 'test_error', output, 'Errors should be displayed' assert_match 'test_failure', output, 'Failures should be displayed' assert_match 'test_skip', output, 'Skipped tests should be displayed' end def test_skipped_tests_are_not_displayed fixtures_directory = File.expand_path('../../../fixtures', __FILE__) test_filename = File.join(fixtures_directory, 'progress_detailed_skip_test.rb') output = `#{ruby_executable} #{test_filename} 2>&1` assert_match 'test_error', output, 'Errors should be displayed' assert_match 'test_failure', output, 'Failures should be displayed' refute_match 'test_skip', output, 'Skipped tests should not be displayed' end def test_progress_works_with_filter_and_specs fixtures_directory = File.expand_path('../../../fixtures', __FILE__) test_filename = File.join(fixtures_directory, 'spec_test.rb') output = `#{ruby_executable} #{test_filename} -n /length/ 2>&1` refute_match '0 out of 0', output, 'Progress should not puts a warning' end def test_progress_works_with_strict_filter fixtures_directory = File.expand_path('../../../fixtures', __FILE__) test_filename = File.join(fixtures_directory, 'spec_test.rb') output = `#{ruby_executable} #{test_filename} -n /^test_0001_works$/ 2>&1` refute_match '0 out of 0', output, 'Progress should not puts a warning' end private def ruby_executable defined?(JRUBY_VERSION) ? 'jruby' : 'ruby' end end end minitest-reporters-1.7.1/test/integration/reporters/mean_time_reporter_test.rb0000644000004100000410000000016614661605652030240 0ustar www-datawww-datarequire_relative "../../test_helper" module MinitestReportersTest class MeanTimeReporterTest < TestCase end end minitest-reporters-1.7.1/test/test_helper.rb0000644000004100000410000000127614661605652021272 0ustar www-datawww-datarequire "bundler/setup" require "minitest/autorun" require "minitest/reporters" ENV['MINITEST_REPORTERS_MONO'] = 'yes' module MinitestReportersTest class TestCase < Minitest::Test end end # Testing the built-in reporters using automated unit testing would be extremely # brittle. Consequently, there are no unit tests for them. If you'd like to run # all the reporters sequentially on a fake test suite, run `rake gallery`. if ENV["REPORTER"] == "Pride" require "minitest/pride" elsif ENV["REPORTER"] reporter_klass = Minitest::Reporters.const_get(ENV["REPORTER"]) Minitest::Reporters.use!(reporter_klass.new) else Minitest::Reporters.use!(Minitest::Reporters::DefaultReporter.new) end minitest-reporters-1.7.1/test/gallery/0000755000004100000410000000000014661605652020060 5ustar www-datawww-dataminitest-reporters-1.7.1/test/gallery/good_test.rb0000644000004100000410000000032414661605652022373 0ustar www-datawww-datarequire_relative "../test_helper" module MinitestReportersTest class GoodTest < TestCase def test_a assert_equal 1, 1 assert 1 end def test_b assert_equal 2, 2 end end end minitest-reporters-1.7.1/test/gallery/bad_test.rb0000644000004100000410000000061314661605652022172 0ustar www-datawww-datarequire_relative "../test_helper" module MinitestReportersTest class BadTest < TestCase def test_a assert_equal 1, 2 end def test_b assert false # simple failure end def test_b assert_equal "ab\nc", "ab\nd" # some nice diff end def test_boom raise "A random exception" end def test_long_method_name skip end end end minitest-reporters-1.7.1/test/fixtures/0000755000004100000410000000000014661605652020272 5ustar www-datawww-dataminitest-reporters-1.7.1/test/fixtures/junit_filename_bug_example_test.rb0000644000004100000410000000162114661605652027217 0ustar www-datawww-data# This is a test for a bug that was happening when the JUnit Reporter was # creating filenames from `describe`s that contained slashes, which would crash # since it was trying to create directories then. require 'bundler/setup' require 'minitest/autorun' require 'minitest/reporters' Minitest::Reporters.use! Minitest::Reporters::JUnitReporter.new describe 'something/other' do it 'does something' do 1.must_equal 1 end end describe 'something/other' do it 'does something else' do 1.must_equal 2 end end class Eval class Issue258Tset < Minitest::Test def test_true assert true end [ ["bool1", "true", "true"], ["bool2", "false", "false"] ].each do |a| (type, expectation1, expectation2) = a eval(%{ def test_eval_#{type}_#{expectation1} assert_equal(#{expectation1}, #{expectation2}) end }) end end end minitest-reporters-1.7.1/test/fixtures/progress_test.rb0000644000004100000410000000026514661605652023525 0ustar www-datawww-datarequire 'bundler/setup' require 'minitest/autorun' require 'minitest/reporters' Minitest::Reporters.use! Minitest::Reporters::ProgressReporter.new require_relative 'sample_test' minitest-reporters-1.7.1/test/fixtures/progress_detailed_skip_test.rb0000644000004100000410000000031314661605652026400 0ustar www-datawww-datarequire 'bundler/setup' require 'minitest/autorun' require 'minitest/reporters' Minitest::Reporters.use! Minitest::Reporters::ProgressReporter.new(detailed_skip: false) require_relative 'sample_test' minitest-reporters-1.7.1/test/fixtures/spec_test.rb0000644000004100000410000000054114661605652022610 0ustar www-datawww-datarequire 'bundler/setup' require 'minitest' require 'minitest/reporters' require 'minitest/autorun' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new describe String do describe '#length' do it 'works' do assert_equal 5, 'hello'.length end it 'doesn\'t works' do assert_equal 6, 'hello'.length end end end minitest-reporters-1.7.1/test/fixtures/sample_test.rb0000644000004100000410000000033414661605652023137 0ustar www-datawww-dataClass.new(Minitest::Test) do def test_success assert true end def test_failure assert false end def test_skip skip('Skipping rope') end def test_error raise 'An unexpected error' end end minitest-reporters-1.7.1/test/fixtures/mean_time_test.rb0000644000004100000410000000104214661605652023611 0ustar www-datawww-datarequire 'bundler/setup' require 'minitest/autorun' require 'minitest/reporters' require 'minitest/reporters/mean_time_reporter' Minitest::Reporters.use! Minitest::Reporters::MeanTimeReporter.new class TestClass < Minitest::Test def test_assertion assert true end def test_fail fail end end class AnotherTestClass < Minitest::Test def test_assertion assert true end def test_fail fail end end class LastTestClass < Minitest::Test def test_assertion assert true end def test_fail fail end end minitest-reporters-1.7.1/test/unit/0000755000004100000410000000000014661605652017400 5ustar www-datawww-dataminitest-reporters-1.7.1/test/unit/minitest/0000755000004100000410000000000014661605652021234 5ustar www-datawww-dataminitest-reporters-1.7.1/test/unit/minitest/junit_reporter_test.rb0000644000004100000410000000264514661605652025702 0ustar www-datawww-datarequire_relative "../../test_helper" module MinitestReportersTest class JUnitReporterUnitTest < Minitest::Test def setup @reporter = Minitest::Reporters::JUnitReporter.new( "report", false, :base_apath => Dir.pwd ) @result = Minitest::Result.new("test_name") end def test_relative_path path = Pathname.new(__FILE__).relative_path_from(Pathname.new(Dir.pwd)).to_s @result.source_location = [path, 10] relative_path = @reporter.get_relative_path(@result) assert_equal path, relative_path.to_s end def test_defaults_reports_path reporter = Minitest::Reporters::JUnitReporter.new expected_reports_dir = Minitest::Reporters::JUnitReporter::DEFAULT_REPORTS_DIR expected_reports_path = File.absolute_path(expected_reports_dir) assert_equal expected_reports_path, reporter.reports_path end def test_accepts_custom_report_dir_using_env expected_reports_dir = "test_reports" expected_reports_path = File.absolute_path(expected_reports_dir) with_env("MINITEST_REPORTERS_REPORTS_DIR" => expected_reports_dir) do reporter = Minitest::Reporters::JUnitReporter.new assert_equal expected_reports_path, reporter.reports_path end end private def with_env(hash) original_env = ENV.to_hash ENV.update(hash) yield ENV.replace(original_env) end end end minitest-reporters-1.7.1/test/unit/minitest/mean_time_reporter_unit_test.rb0000644000004100000410000001144014661605652027537 0ustar www-datawww-datarequire_relative '../../test_helper' module MinitestReportersTest class MeanTimeReporterUnitTest < Minitest::Test def setup @test_data = [] @test_data << { name: 'MIDDLE', prev_time: 5.0, cur_time: 5.0 } @test_data << { name: 'MIN_FAST', prev_time: 0.5, cur_time: 3.5 } @test_data << { name: 'MIN_SLOW', prev_time: 10.5, cur_time: 10.5 } @test_data << { name: 'MAX_FAST', prev_time: 1.2, cur_time: 0.9 } @test_data << { name: 'MAX_SLOW', prev_time: 16.3, cur_time: 6.3 } @test_data << { name: 'AVG_FAST', prev_time: 1.3, cur_time: 0.65 } @test_data << { name: 'AVG_SLOW', prev_time: 10.2, cur_time: 14.2 } configure_report_paths end def teardown File.delete(@previous_run_path) if File.exist?(@previous_run_path) File.delete(@report_file_path) if File.exist?(@report_file_path) end def test_defaults subject = Minitest::Reporters::MeanTimeReporter.new.send(:defaults) expected_prefix = "#{Dir.tmpdir}#{File::Separator}" assert_match expected_prefix, subject[:previous_runs_filename] assert_match expected_prefix, subject[:report_filename] end def test_sorts_avg_numerically prev_output = generate_report(:avg, :prev_time) report_output = generate_report(:avg, :cur_time) expected_order = [ 'AVG_SLOW', 'MAX_SLOW', 'MIN_SLOW', 'MIDDLE', 'MIN_FAST', 'MAX_FAST', 'AVG_FAST' ] verify_result_order(report_output, expected_order, prev_output) end def test_sorts_min_numerically prev_output = generate_report(:min, :prev_time) report_output = generate_report(:min, :cur_time) expected_order = [ 'MIN_SLOW', 'AVG_SLOW', 'MAX_SLOW', 'MIDDLE', 'MAX_FAST', 'AVG_FAST', 'MIN_FAST' ] verify_result_order(report_output, expected_order, prev_output) end def test_sorts_max_numerically prev_output = generate_report(:max, :prev_time) report_output = generate_report(:max, :cur_time) expected_order = [ 'MAX_SLOW', 'AVG_SLOW', 'MIN_SLOW', 'MIDDLE', 'MIN_FAST', 'AVG_FAST', 'MAX_FAST' ] verify_result_order(report_output, expected_order, prev_output) end def test_sorts_last_numerically prev_output = generate_report(:last, :prev_time) report_output = generate_report(:last, :cur_time) expected_order = [ 'AVG_SLOW', 'MIN_SLOW', 'MAX_SLOW', 'MIDDLE', 'MIN_FAST', 'MAX_FAST', 'AVG_FAST' ] verify_result_order(report_output, expected_order, prev_output) end private def simulate_suite_runtime(suite_name, run_time) test_suite = Minitest::Test.new(suite_name) base_clock_time = Minitest::Reporters.clock_time Minitest::Reporters.stub(:clock_time, base_clock_time - run_time) do @reporter.before_suite(test_suite) end Minitest::Reporters.stub(:clock_time, base_clock_time) do @reporter.after_suite(test_suite) end end def configure_report_paths @previous_run_path = File.expand_path("../minitest-mean-time-previous-runs", File.realpath(__FILE__)) File.delete(@previous_run_path) if File.exist?(@previous_run_path) @report_file_path = File.expand_path("../minitest-mean-time-report", File.realpath(__FILE__)) File.delete(@report_file_path) if File.exist?(@report_file_path) end def generate_report(sort_column, time_name) # Reset the reporter for the test run @reporter = Minitest::Reporters::MeanTimeReporter.new( previous_runs_filename: @previous_run_path, report_filename: @report_file_path, sort_column: sort_column ) @test_data.each { |hash| simulate_suite_runtime(hash[:name], hash[time_name])} @reporter.tests << Minitest::Test.new('Final') report_output = StringIO.new @reporter.io = report_output @reporter.start @reporter.report report_output end def verify_result_order(report_output, expected_order, prev_output) prev_lines = extract_test_lines(prev_output) test_lines = extract_test_lines(report_output) actual_order = test_lines.map { |line| line.gsub(/.*Description: /, '') } assert_equal(expected_order, actual_order, "\nCurrent report:\n#{test_lines.join("\n")}\n\nPrevious report:\n#{prev_lines.join("\n")}") end def extract_test_lines(report_output) report_output.rewind test_lines = report_output.read.split("\n") test_lines.select! {|line| line.start_with?('Avg:')} # Exclude the final placeholder 0 second test from assertions test_lines.reject! {|line| line.end_with?('Minitest::Test')} test_lines end end end minitest-reporters-1.7.1/test/unit/minitest/spec_reporter_test.rb0000644000004100000410000000304314661605652025474 0ustar www-datawww-datarequire_relative "../../test_helper" module MinitestReportersTest class SpecReporterTest < Minitest::Test def setup @reporter = Minitest::Reporters::SpecReporter.new @test = Minitest::Test.new("") @test.time = 0 end def test_removes_underscore_in_name_if_shoulda @test.name = "test_: Should foo" assert_output(/test:/) do @reporter.io = $stdout @reporter.record(@test) end end def test_wont_modify_name_if_not_shoulda @test.name = "test_foo" assert_output(/test_foo/) do @reporter.io = $stdout @reporter.record(@test) end end def test_responds_to_test_name_after_record test_name = 'test_: Should foo' the_test_class = Class.new(Minitest::Test) do define_method test_name do assert(false) end end the_test = the_test_class.new('') the_test.name = test_name @reporter.io = StringIO.new @reporter.record(the_test) assert_respond_to the_test, the_test.name end def test_report_for_describe_not_using_const klass = describe("whatever") { it("passes") { assert true } } runnable = klass.runnable_methods.first @reporter.io = StringIO.new # Run the test result = klass.new(runnable).run @reporter.start @reporter.record(result) error_msg = nil begin @reporter.report rescue => e error_msg = "error executing @reporter.report, #{e}" end refute error_msg, error_msg end end end minitest-reporters-1.7.1/test/unit/minitest/reporters_test.rb0000644000004100000410000000476614661605652024662 0ustar www-datawww-datarequire_relative "../../test_helper" require "minitest/mock" module MinitestReportersTest class ReportersTest < Minitest::Test def test_chooses_the_rubymine_reporter_when_necessary # Rubymine reporter complains when RubyMine libs are not available, so # stub its #puts method out. $stdout.stub :puts, nil do reporters = Minitest::Reporters.choose_reporters [], { "RM_INFO" => "x" } assert_instance_of Minitest::Reporters::RubyMineReporter, reporters[0] reporters = Minitest::Reporters.choose_reporters [], { "TEAMCITY_VERSION" => "x" } assert_instance_of Minitest::Reporters::RubyMineReporter, reporters[0] end end def test_chooses_the_textmate_reporter_when_necessary reporters = Minitest::Reporters.choose_reporters [], {"TM_PID" => "x"} assert_instance_of Minitest::Reporters::RubyMateReporter, reporters[0] end def test_chooses_the_console_reporters_when_necessary reporters = Minitest::Reporters.choose_reporters [Minitest::Reporters::SpecReporter.new], {} assert_instance_of Minitest::Reporters::SpecReporter, reporters[0] end def test_chooses_no_reporters_when_running_under_vim reporters = Minitest::Reporters.choose_reporters( [Minitest::Reporters::DefaultReporter.new], { "VIM" => "/usr/share/vim" }) assert_nil reporters end def test_chooses_given_reporter_when_MINITEST_REPORTERS_env_set env = { "MINITEST_REPORTER" => "JUnitReporter", "RM_INFO" => "x", "TEAMCITY_VERSION" => "x", "TM_PID" => "x" } # JUnit reporter init has stdout messages... capture them to keep test output clean $stdout.stub :puts, nil do reporters = Minitest::Reporters.choose_reporters [], env assert_instance_of Minitest::Reporters::JUnitReporter, reporters[0] end end def test_uses_minitest_clock_time_when_minitest_version_greater_than_561 Minitest::Reporters.stub :minitest_version, 583 do Minitest.stub :clock_time, 6765.378751009 do clock_time = Minitest::Reporters.clock_time assert_equal 6765.378751009, clock_time end end end def test_uses_minitest_clock_time_when_minitest_version_less_than_561 Minitest::Reporters.stub :minitest_version, 431 do Time.stub :now, Time.new(2015, 11, 20, 17, 35) do clock_time = Minitest::Reporters.clock_time assert_equal Time.new(2015, 11, 20, 17, 35), clock_time end end end end end minitest-reporters-1.7.1/test/unit/minitest/extensible_backtrace_filter_test.rb0000644000004100000410000000231714661605652030331 0ustar www-datawww-datarequire_relative "../../test_helper" module MinitestReportersTest class ExtensibleBacktraceFilterTest < TestCase def setup @default_filter = Minitest::ExtensibleBacktraceFilter.default_filter @filter = Minitest::ExtensibleBacktraceFilter.new @backtrace = ["foo", "bar", "baz"] end def test_adding_filters @filter.add_filter(/foo/) assert @filter.filters?("foo") refute @filter.filters?("baz") end def test_filter_backtrace_when_first_line_is_filtered @filter.add_filter(/foo/) assert_equal ["bar", "baz"], @filter.filter(@backtrace) end def test_filter_backtrace_when_middle_line_is_filtered @filter.add_filter(/bar/) assert_equal ["foo"], @filter.filter(@backtrace) end def test_filter_backtrace_when_all_lines_are_filtered @filter.add_filter(/./) assert_equal ["foo", "bar", "baz"], @filter.filter(@backtrace) end def test_default_filter assert @default_filter.filters?("lib/minitest") assert @default_filter.filters?("lib/minitest/reporters") refute @default_filter.filters?("lib/my_gem") end def test_nil_backtrace assert_equal [], @filter.filter(nil) end end end minitest-reporters-1.7.1/test/unit/minitest/minitest_reporter_plugin_test.rb0000644000004100000410000000066614661605652027764 0ustar www-datawww-datarequire_relative "../../test_helper" module MinitestReportersTest class MinitestReporterPluginTest < Minitest::Test def test_delegates_io reporter = Minitest::Reporters::DefaultReporter.new io_handle = STDOUT dr = Minitest::Reporters::DelegateReporter.new([ reporter ], :io => io_handle) assert_equal io_handle, dr.io dr.send :all_reporters assert_equal io_handle, reporter.io end end end minitest-reporters-1.7.1/.yardopts0000644000004100000410000000022414661605652017306 0ustar www-datawww-data--readme README.md --markup markdown --default-return "" --title "Minitest-reporters Documentation" --hide-void-return minitest-reporters-1.7.1/Rakefile0000644000004100000410000000354114661605652017112 0ustar www-datawww-datarequire "bundler/gem_tasks" require "rake/testtask" require 'rubocop/rake_task' task :default => :test Rake::TestTask.new do |t| t.pattern = "test/{unit,integration}/**/*_test.rb" t.verbose = true end rubymine_home = [ ENV["RUBYMINE_HOME"], "../rubymine-contrib/ruby-testing/src/rb/testing/patch/common", "/Applications/RubyMine.app/Contents/rb/testing/patch/common", ].compact.detect { |d| Dir.exist?(d) } Rake::TestTask.new("test:gallery") do |t| t.pattern = "test/gallery/**/*_test.rb" t.verbose = true t.libs << rubymine_home end # - RubyMineReporter must be tested separately inside of RubyMine # - JUnitReporter normally writes to `test/reports` instead of stdout task :gallery do unless rubymine_home warn "To see RubyMineReporter supply RUBYMINE_HOME= or git clone git://git.jetbrains.org/idea/contrib.git ../rubymine-contrib" exit 1 end [ "Pride", "DefaultReporter", "JUnitReporter", "ProgressReporter", "RubyMateReporter", "SpecReporter", "RubyMineReporter", "HtmlReporter", "MeanTimeReporter", ].each do |reporter| puts puts "-" * 72 puts "Running gallery tests using #{reporter}..." puts "-" * 72 puts sh "rake test:gallery REPORTER=#{reporter}" do # Ignore failures. They're expected when you are running the gallery # test suite. end sh "cat test/reports/*" if reporter == "JUnitReporter" end end task :reset_statistics do require 'minitest/reporters/mean_time_reporter' Minitest::Reporters::MeanTimeReporter.reset_statistics! puts "The mean time reporter statistics have been reset." exit 0 end desc 'Run RuboCop on the lib directory' RuboCop::RakeTask.new(:rubocop) do |task| task.patterns = ['lib/**/*.rb'] # only show the files with failures task.formatters = ['clang'] # don't abort rake on failure task.fail_on_error = false end minitest-reporters-1.7.1/.rubocop_todo.yml0000644000004100000410000004214314661605652020745 0ustar www-datawww-data# This configuration was generated by # `rubocop --auto-gen-config` # on 2022-03-28 02:29:37 UTC using RuboCop version 1.26.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include. # Include: **/*.gemspec Gemspec/OrderedDependencies: Exclude: - 'minitest-reporters.gemspec' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: Include. # Include: **/*.gemspec Gemspec/RequireMFA: Exclude: - 'minitest-reporters.gemspec' # Offense count: 1 # Configuration parameters: Include. # Include: **/*.gemspec Gemspec/RequiredRubyVersion: Exclude: - 'minitest-reporters.gemspec' # Offense count: 7 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, IndentationWidth. # SupportedStyles: with_first_argument, with_fixed_indentation Layout/ArgumentAlignment: Exclude: - 'lib/minitest/reporters/junit_reporter.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyleAlignWith. # SupportedStylesAlignWith: either, start_of_block, start_of_line Layout/BlockAlignment: Exclude: - 'lib/minitest/reporters/junit_reporter.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Layout/ClosingParenthesisIndentation: Exclude: - 'test/unit/minitest/junit_reporter_test.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). Layout/ElseAlignment: Exclude: - 'lib/minitest/reporters/default_reporter.rb' # Offense count: 8 # This cop supports safe auto-correction (--auto-correct). Layout/EmptyLineAfterGuardClause: Exclude: - 'lib/minitest/extensible_backtrace_filter.rb' - 'lib/minitest/minitest_reporter_plugin.rb' - 'lib/minitest/reporters/ansi.rb' - 'lib/minitest/reporters/default_reporter.rb' - 'lib/minitest/reporters/html_reporter.rb' - 'lib/minitest/reporters/progress_reporter.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Layout/EmptyLineAfterMagicComment: Exclude: - 'minitest-reporters.gemspec' # Offense count: 7 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EmptyLineBetweenMethodDefs, EmptyLineBetweenClassDefs, EmptyLineBetweenModuleDefs, AllowAdjacentOneLineDefs, NumberOfEmptyLines. Layout/EmptyLineBetweenDefs: Exclude: - 'lib/minitest/reporters/base_reporter.rb' - 'test/fixtures/sample_test.rb' - 'test/integration/reporters/progress_reporter_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: AllowAliasSyntax, AllowedMethods. # AllowedMethods: alias_method, public, protected, private Layout/EmptyLinesAroundAttributeAccessor: Exclude: - 'lib/minitest/reporters/base_reporter.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle. # SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines, beginning_only, ending_only Layout/EmptyLinesAroundClassBody: Exclude: - 'test/integration/reporters/mean_time_reporter_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyleAlignWith, Severity. # SupportedStylesAlignWith: keyword, variable, start_of_line Layout/EndAlignment: Exclude: - 'lib/minitest/reporters/default_reporter.rb' # Offense count: 4 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment. Layout/ExtraSpacing: Exclude: - 'test/unit/minitest/mean_time_reporter_unit_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, IndentationWidth. # SupportedStyles: consistent, consistent_relative_to_receiver, special_for_inner_method_call, special_for_inner_method_call_in_parentheses Layout/FirstArgumentIndentation: Exclude: - 'test/unit/minitest/junit_reporter_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, IndentationWidth. # SupportedStyles: special_inside_parentheses, consistent, align_brackets Layout/FirstArrayElementIndentation: Exclude: - 'test/fixtures/junit_filename_bug_example_test.rb' # Offense count: 25 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle. # SupportedHashRocketStyles: key, separator, table # SupportedColonStyles: key, separator, table # SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit Layout/HashAlignment: Exclude: - 'lib/minitest/reporters/html_reporter.rb' - 'lib/minitest/reporters/junit_reporter.rb' - 'lib/minitest/reporters/mean_time_reporter.rb' - 'lib/minitest/reporters/progress_reporter.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: IndentationWidth, EnforcedStyle. # SupportedStyles: spaces, tabs Layout/IndentationStyle: Exclude: - 'lib/minitest/reporters/version.rb' # Offense count: 3 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: Width, IgnoredPatterns. Layout/IndentationWidth: Exclude: - 'lib/minitest/reporters/default_reporter.rb' - 'lib/minitest/reporters/junit_reporter.rb' - 'lib/minitest/reporters/version.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, IndentationWidth. # SupportedStyles: aligned, indented Layout/LineEndStringConcatenationIndentation: Exclude: - 'lib/minitest/reporters/mean_time_reporter.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle. # SupportedStyles: symmetrical, new_line, same_line Layout/MultilineHashBraceLayout: Exclude: - 'test/unit/minitest/reporters_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle. # SupportedStyles: symmetrical, new_line, same_line Layout/MultilineMethodCallBraceLayout: Exclude: - 'test/unit/minitest/reporters_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces. # SupportedStyles: space, no_space # SupportedStylesForEmptyBraces: space, no_space Layout/SpaceBeforeBlockBraces: Exclude: - 'minitest-reporters.gemspec' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBrackets. # SupportedStyles: space, no_space, compact # SupportedStylesForEmptyBrackets: space, no_space Layout/SpaceInsideArrayLiteralBrackets: Exclude: - 'test/unit/minitest/minitest_reporter_plugin_test.rb' # Offense count: 5 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters. # SupportedStyles: space, no_space # SupportedStylesForEmptyBraces: space, no_space Layout/SpaceInsideBlockBraces: Exclude: - 'test/unit/minitest/mean_time_reporter_unit_test.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces. # SupportedStyles: space, no_space, compact # SupportedStylesForEmptyBraces: space, no_space Layout/SpaceInsideHashLiteralBraces: Exclude: - 'test/unit/minitest/reporters_test.rb' # Offense count: 4 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle. # SupportedStyles: final_newline, final_blank_line Layout/TrailingEmptyLines: Exclude: - 'test/fixtures/progress_detailed_skip_test.rb' - 'test/fixtures/progress_test.rb' - 'test/fixtures/sample_test.rb' - 'test/unit/minitest/spec_reporter_test.rb' # Offense count: 4 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: AllowInHeredoc. Layout/TrailingWhitespace: Exclude: - 'lib/minitest/reporters/default_reporter.rb' - 'test/unit/minitest/reporters_test.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). Lint/AmbiguousOperatorPrecedence: Exclude: - 'lib/minitest/relative_position.rb' - 'lib/minitest/reporters/base_reporter.rb' # Offense count: 1 # Configuration parameters: AllowSafeAssignment. Lint/AssignmentInCondition: Exclude: - 'lib/minitest/reporters/base_reporter.rb' # Offense count: 1 Lint/DuplicateMethods: Exclude: - 'test/gallery/bad_test.rb' # Offense count: 1 Lint/MissingSuper: Exclude: - 'lib/minitest/minitest_reporter_plugin.rb' # Offense count: 1 # Configuration parameters: IgnoredPatterns. # SupportedStyles: snake_case, camelCase Naming/MethodName: EnforcedStyle: snake_case Exclude: - 'test/unit/minitest/reporters_test.rb' # Offense count: 2 # Configuration parameters: EnforcedStyle, CheckMethodNames, CheckSymbols, AllowedIdentifiers. # SupportedStyles: snake_case, normalcase, non_integer # AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339 Naming/VariableNumber: Exclude: - 'test/unit/minitest/reporters_test.rb' # Offense count: 1 Security/Eval: Exclude: - 'test/fixtures/junit_filename_bug_example_test.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, ProceduralMethods, FunctionalMethods, IgnoredMethods, AllowBracesOnProceduralOneLiners, BracesRequiredMethods. # SupportedStyles: line_count_based, semantic, braces_for_chaining, always_braces # ProceduralMethods: benchmark, bm, bmbm, create, each_with_object, measure, new, realtime, tap, with_object # FunctionalMethods: let, let!, subject, watch # IgnoredMethods: lambda, proc, it Style/BlockDelimiters: Exclude: - 'lib/minitest/minitest_reporter_plugin.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: AllowOnConstant. Style/CaseEquality: Exclude: - 'lib/minitest/minitest_reporter_plugin.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: IgnoredMethods. # IgnoredMethods: ==, equal?, eql? Style/ClassEqualityComparison: Exclude: - 'lib/minitest/minitest_reporter_plugin.rb' # Offense count: 1 Style/DocumentDynamicEvalDefinition: Exclude: - 'test/fixtures/junit_filename_bug_example_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Style/EmptyCaseCondition: Exclude: - 'lib/minitest/reporters/default_reporter.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Style/Encoding: Exclude: - 'minitest-reporters.gemspec' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Style/EvalWithLocation: Exclude: - 'test/fixtures/junit_filename_bug_example_test.rb' # Offense count: 6 # This cop supports safe auto-correction (--auto-correct). Style/ExpandPathArguments: Exclude: - 'minitest-reporters.gemspec' - 'test/integration/reporters/junit_reporter_test.rb' - 'test/integration/reporters/progress_reporter_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Style/FileWrite: Exclude: - 'lib/minitest/reporters/html_reporter.rb' # Offense count: 36 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle. # SupportedStyles: always, always_true, never Style/FrozenStringLiteralComment: Enabled: false # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Style/GlobalStdStream: Exclude: - 'test/unit/minitest/minitest_reporter_plugin_test.rb' # Offense count: 7 # Configuration parameters: MinBodyLength. Style/GuardClause: Exclude: - 'lib/minitest/reporters.rb' - 'lib/minitest/reporters/base_reporter.rb' - 'lib/minitest/reporters/default_reporter.rb' - 'lib/minitest/reporters/progress_reporter.rb' - 'lib/minitest/reporters/spec_reporter.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: AllowSplatArgument. Style/HashConversion: Exclude: - 'lib/minitest/reporters/mean_time_reporter.rb' # Offense count: 1 Style/MultilineBlockChain: Exclude: - 'lib/minitest/reporters/mean_time_reporter.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: AllowedMethods. # AllowedMethods: be, be_a, be_an, be_between, be_falsey, be_kind_of, be_instance_of, be_truthy, be_within, eq, eql, end_with, include, match, raise_error, respond_to, start_with Style/NestedParenthesizedCalls: Exclude: - 'lib/minitest/reporters/rubymine_reporter.rb' # Offense count: 8 # This cop supports unsafe auto-correction (--auto-correct-all). # Configuration parameters: EnforcedStyle, IgnoredMethods. # SupportedStyles: predicate, comparison Style/NumericPredicate: Exclude: - 'spec/**/*' - 'lib/minitest/reporters/default_reporter.rb' - 'lib/minitest/reporters/html_reporter.rb' - 'lib/minitest/reporters/progress_reporter.rb' # Offense count: 2 # Configuration parameters: AllowedMethods. # AllowedMethods: respond_to_missing? Style/OptionalBooleanParameter: Exclude: - 'lib/minitest/reporters/base_reporter.rb' - 'lib/minitest/reporters/junit_reporter.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: PreferredDelimiters. Style/PercentLiteralDelimiters: Exclude: - 'minitest-reporters.gemspec' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Style/PerlBackrefs: Exclude: - 'lib/minitest/minitest_reporter_plugin.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). Style/RedundantPercentQ: Exclude: - 'minitest-reporters.gemspec' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). Style/RedundantSelf: Exclude: - 'lib/minitest/extensible_backtrace_filter.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, AllowInnerSlashes. # SupportedStyles: slashes, percent_r, mixed Style/RegexpLiteral: Exclude: - 'lib/minitest/extensible_backtrace_filter.rb' - 'lib/minitest/minitest_reporter_plugin.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle. # SupportedStyles: implicit, explicit Style/RescueStandardError: Exclude: - 'test/unit/minitest/spec_reporter_test.rb' # Offense count: 5 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle. # SupportedStyles: only_raise, only_fail, semantic Style/SignalException: Exclude: - 'lib/minitest/reporters/mean_time_reporter.rb' - 'test/fixtures/mean_time_test.rb' # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: RequireEnglish. # SupportedStyles: use_perl_names, use_english_names Style/SpecialGlobalVars: EnforcedStyle: use_perl_names # Offense count: 1 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle. # SupportedStyles: single_quotes, double_quotes Style/StringLiteralsInInterpolation: Exclude: - 'lib/minitest/reporters/default_reporter.rb' # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: MinSize. # SupportedStyles: percent, brackets Style/SymbolArray: EnforcedStyle: brackets # Offense count: 2 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyleForMultiline. # SupportedStylesForMultiline: comma, consistent_comma, no_comma Style/TrailingCommaInArrayLiteral: Exclude: - 'Rakefile' # Offense count: 5 # This cop supports safe auto-correction (--auto-correct). Style/WhenThen: Exclude: - 'lib/minitest/reporters/default_reporter.rb' # Offense count: 10 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: EnforcedStyle, MinSize, WordRegex. # SupportedStyles: percent, brackets Style/WordArray: Exclude: - 'Rakefile' - 'test/fixtures/junit_filename_bug_example_test.rb' - 'test/unit/minitest/extensible_backtrace_filter_test.rb' - 'test/unit/minitest/mean_time_reporter_unit_test.rb' # Offense count: 3 # This cop supports safe auto-correction (--auto-correct). # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. # URISchemes: http, https Layout/LineLength: Max: 141 minitest-reporters-1.7.1/Gemfile0000644000004100000410000000004614661605652016735 0ustar www-datawww-datasource "https://rubygems.org" gemspec minitest-reporters-1.7.1/LICENSE0000644000004100000410000000204214661605652016445 0ustar www-datawww-dataCopyright (c) 2018 Alexander Kern Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. minitest-reporters-1.7.1/minitest-reporters.gemspec0000644000004100000410000000210414661605652022663 0ustar www-datawww-data# -*- encoding: utf-8 -*- $:.push File.expand_path('../lib', __FILE__) require 'minitest/reporters/version' Gem::Specification.new do |s| s.name = 'minitest-reporters' s.version = Minitest::Reporters::VERSION s.platform = Gem::Platform::RUBY s.authors = ['Alexander Kern'] s.email = ['alex@kernul.com'] s.homepage = 'https://github.com/minitest-reporters/minitest-reporters' s.summary = %q{Create customizable Minitest output formats} s.description = %q{Death to haphazard monkey-patching! Extend Minitest through simple hooks.} s.license = 'MIT' s.required_ruby_version = '>= 1.9.3' s.add_dependency 'minitest', '>= 5.0' s.add_dependency 'ansi' s.add_dependency 'ruby-progressbar' s.add_dependency 'builder' s.add_development_dependency 'rake' s.add_development_dependency 'rubocop' s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } s.require_paths = ['lib'] end minitest-reporters-1.7.1/README.md0000644000004100000410000001336514661605652016731 0ustar www-datawww-data[gem]: https://rubygems.org/gems/minitest-reporters # minitest-reporters - create customizable Minitest output formats [![Gem Version](https://badge.fury.io/rb/minitest-reporters.svg)][gem] [![Build Status](https://github.com/minitest-reporters/minitest-reporters/actions/workflows/ci.yml/badge.svg?event=push&branch=master)](https://github.com/minitest-reporters/minitest-reporters/actions?query=event%3Apush+branch%3Amaster) Death to haphazard monkey-patching! Extend Minitest through simple hooks. ## Installation ## gem install minitest-reporters ## Usage ## In your `test_helper.rb` file, add the following lines: ```ruby require "minitest/reporters" Minitest::Reporters.use! ``` This will swap out the Minitest runner to the custom one used by minitest-reporters and use the correct reporters for Textmate, Rubymine, and the console. If you would like to write your own reporter, just `include Minitest::Reporter` and override the methods you'd like. Take a look at the provided reporters for examples. Don't like the default progress bar reporter? ```ruby Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new ``` Want to use multiple reporters? ```ruby Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new, Minitest::Reporters::JUnitReporter.new] ``` If TextMate, TeamCity, RubyMine or VIM presence is detected, the reporter will be automatically chosen, regardless of any reporters passed to the `use!` method. To override this behavior, you may set the ENV variable MINITEST_REPORTER: ```sh export MINITEST_REPORTER=JUnitReporter ``` Detection of those systems is based on presence of certain ENV variables and are evaluated in the following order: ``` MINITEST_REPORTER => use reporter indicated in env variable TM_PID => use RubyMateReporter RM_INFO => use RubyMineReporter TEAMCITY_VERSION => use RubyMineReporter VIM => disable all Reporters ``` The following reporters are provided: ```ruby Minitest::Reporters::DefaultReporter # => Redgreen-capable version of standard Minitest reporter Minitest::Reporters::SpecReporter # => Turn-like output that reads like a spec Minitest::Reporters::ProgressReporter # => Fuubar-like output with a progress bar Minitest::Reporters::RubyMateReporter # => Simple reporter designed for RubyMate Minitest::Reporters::RubyMineReporter # => Reporter designed for RubyMine IDE and TeamCity CI server Minitest::Reporters::JUnitReporter # => JUnit test reporter designed for JetBrains TeamCity Minitest::Reporters::MeanTimeReporter # => Produces a report summary showing the slowest running tests Minitest::Reporters::HtmlReporter # => Generates an HTML report of the test results ``` Options can be passed to these reporters at construction-time, e.g. to force color output from `DefaultReporter`: ```ruby Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(:color => true)] ``` ## Screenshots ## **Default Reporter** ![Default Reporter](https://raw.githubusercontent.com/minitest-reporters/minitest-reporters/master/assets/default-reporter.png) **Spec Reporter** ![Spec Reporter](https://raw.githubusercontent.com/minitest-reporters/minitest-reporters/master/assets/spec-reporter.png) **Progress Reporter** ![Progress Reporter](https://raw.githubusercontent.com/minitest-reporters/minitest-reporters/master/assets/progress-reporter.png) ## Caveats ## If you are using minitest-reporters with ActiveSupport 3.x, make sure that you require ActiveSupport before invoking `Minitest::Reporters.use!`. Minitest-reporters fixes incompatibilities caused by monkey patches in ActiveSupport 3.x. ActiveSupport 4.x is unaffected. **Rails Backtrace Filtering and Custom Backtrace Filtering** Minitest lets you configures your own, custom backtrace filter via `Minitest.backtrace_filter=`. If you're using Rails, then by default `Minitest.backtrace_filter` is a filter designed specially for Rails. But minitest-reporters overwrites `Minitest.backtrace_filter` by default. That means it will overwrite your custom filter and Rails' default filter. (You'll know this is happening if you see overly long or otherwise unexpected backtraces.) To avoid that, you must manually tell minitest-reporters which filter to use. In Rails, do this in `test_helper.rb`: ```ruby Minitest::Reporters.use!( Minitest::Reporters::DefaultReporter.new, ENV, Minitest.backtrace_filter ) ``` The third parameter to `.use!`, in this case `Minitest.backtrace_filter`, should be a filter object. In the above example, you're telling minitest-reporters to use the filter that Rails has already set. **Test Anything Protocol (TAP)** The [Test Anything Protocol](https://testanything.org) is a specification for outputting test results in an implementation-agnostic manner so that various tools can read the output. If you need to produce TAP-compliant output for Minitest results, see this [blog post](https://dev.to/davidwessman/rails-minitest-results-output-in-tap-format-for-heroku-ci-46d3) and [gist](https://gist.github.com/davidwessman/09a13840a8a80080e3842ac3051714c7) by [@davidwessman](https://github.com/davidwessman). ## Note on Patches/Pull Requests ## * Fork the project. * Make your feature addition or bug fix. * Add tests for it. This is important so I don't break it in a future version unintentionally. * Commit, but do not mess with the `Rakefile`. If you want to have your own version, that is fine but bump the version in a commit by itself in another branch so I can ignore it when I pull. * Send me a pull request. Bonus points for git flow feature branches. ## Resources ## * [GitHub Repository](https://github.com/minitest-reporters/minitest-reporters/) * [Documentation](https://www.rubydoc.info/github/minitest-reporters/minitest-reporters) ## License ## Minitest-reporters is licensed under the MIT License. See [LICENSE](LICENSE) for details. minitest-reporters-1.7.1/appveyor.yml0000644000004100000410000000046014661605652020032 0ustar www-datawww-data--- version: '#{build}' cache: - vendor/bundle environment: matrix: - RUBY_VERSION: 25-x64 - RUBY_VERSION: 24-x64 install: - set PATH=C:\Ruby%RUBY_VERSION%\bin;%PATH% - bundle install build: off before_test: - ruby -v - gem -v - bundle -v test_script: - bundle exec rake test minitest-reporters-1.7.1/.ruby-gemset0000644000004100000410000000002314661605652017701 0ustar www-datawww-dataminitest-reporters minitest-reporters-1.7.1/.rubocop.yml0000644000004100000410000000160614661605652017717 0ustar www-datawww-data--- AllCops: NewCops: enable inherit_from: .rubocop_todo.yml Layout: Enabled: true Layout/MultilineOperationIndentation: EnforcedStyle: indented Lint: Enabled: true Metrics: Severity: refactor Enabled: false Layout/LineLength: Severity: convention Naming: Enabled: true Naming/MethodParameterName: MinNameLength: 1 Security: Enabled: true #todo: enable Style: Enabled: true Style/FormatStringToken: Enabled: false Style/IfUnlessModifier: Enabled: false #todo: enable Style/StringLiterals: Enabled: false Style/TrailingCommaInHashLiteral: EnforcedStyleForMultiline: comma #todo: enable Style/HashSyntax: Enabled: false #todo: enable Style/FormatString: Enabled: false #todo: enable Style/ClassVars: Enabled: false #todo: enable Style/Alias: Enabled: false Style/Documentation: Enabled: false Bundler: Enabled: true Gemspec: Enabled: true minitest-reporters-1.7.1/CHANGELOG.md0000644000004100000410000003036414661605652017261 0ustar www-datawww-data### [dev](https://github.com/minitest-reporters/minitest-reporters/compare/v1.7.1...master) ### [1.7.1](https://github.com/minitest-reporters/minitest-reporters/compare/v1.7.0...v1.7.1) * Fixed logic of new `suppress_inline_failure_output`. This option was doing the opposite of what it intended to do. [#354](https://github.com/minitest-reporters/minitest-reporters/pull/354) ### [1.7.0](https://github.com/minitest-reporters/minitest-reporters/compare/v1.6.1...v1.7.0) * Minor documentation improvements [#343](https://github.com/minitest-reporters/minitest-reporters/pull/343) * Fixed homepage link in gemspec [#333](https://github.com/minitest-reporters/minitest-reporters/pull/333) contributed by [andyw8](https://github.com/andyw8) * Added Ruby 3.2 to the CI matrix [#335](https://github.com/minitest-reporters/minitest-reporters/pull/335) contributed by [petergoldstein](https://github.com/petergoldstein) * Updated `JUnitReporter` to output a failure screenshot path when included in the minitest result [#346](https://github.com/minitest-reporters/minitest-reporters/pull/346) contributed by [matteeyah](https://github.com/matteeyah) * Fixed backwards fraction in `ProgressReporter` default format [#348](https://github.com/minitest-reporters/minitest-reporters/pull/348) contributed by [notEthan](https://github.com/notEthan) * Added option `suppress_inline_failure_output` to `SpecReporter` to provide an explicit switch, separate from `print_failure_summary`, for suppressing inline failure messages. Until this change, the `print_failure_summary` would do both: print a failure/error summary after all tests run and suppress the inline failure messages. With this change `print_failure_summary` will just add a summary at the end of a test run, and it will no longer suppress the inline failure messages. [#352](https://github.com/minitest-reporters/minitest-reporters/pull/352) contributed by [rthbound](https://github.com/rthbound) ### [1.6.1](https://github.com/kern/minitest-reporters/compare/v1.6.0...v1.6.1) * Replaced use of `MiniTest` constant with `Minitest` [#345](https://github.com/minitest-reporters/minitest-reporters/pull/345) contributed by [istana](https://github.com/istana) ### [1.6.0](https://github.com/kern/minitest-reporters/compare/v1.5.0...v1.6.0) * Switched to Github actions [#324](https://github.com/minitest-reporters/minitest-reporters/pull/324) [petergoldstein](https://github.com/petergoldstein) * Fixed misspelled method name in HTML reporter (`percent_skipps` -> `percent_skips`) [#326](https://github.com/minitest-reporters/minitest-reporters/pull/326) contributed by [andyw8](https://github.com/andyw8) * Removed deprecated call to `Object#=~` [#318](https://github.com/minitest-reporters/minitest-reporters/pull/318) contributed by [etiennebarrie](https://github.com/etiennebarrie) * Added option `print_failure_summary` to `SpecReporter` which causes failures and errors to print at the end of the test suite instead of inline as they happen [#306](https://github.com/minitest-reporters/minitest-reporters/pull/306) contributed by [picandocodigo](https://github.com/picandocodigo) ### [1.5.0](https://github.com/kern/minitest-reporters/compare/v1.4.3...v1.5.0) * Added support for environment variables to define the output location of HTML reports. [#311](https://github.com/minitest-reporters/minitest-reporters/pull/311) contributed by [estebanbouza](https://github.com/estebanbouza) * Fixed ProgressReporter accuracy on skipped tests while `detailed_skip` is disabled [#312](https://github.com/minitest-reporters/minitest-reporters/pull/312) contributed by [seven1m](https://github.com/seven1m) * Added `file` attribute to `` tags in JUnitReporter for CircleCI compatibility [#313](https://github.com/minitest-reporters/minitest-reporters/pull/313) contributed by [nbudin](https://github.com/nbudin) * Added timestamp option to JUnitReporter [#316] (https://github.com/minitest-reporters/minitest-reporters/pull/316) contributed by [sipani909](https://github.com/sipani909) ### [1.4.3](https://github.com/kern/minitest-reporters/compare/v1.4.2...v1.4.3) * fixed rare compatability issue between JUnitReporter and older versions of Minitest [#272](https://github.com/minitest-reporters/minitest-reporters/pull/272) contributed by [chakrit](https://github.com/chakrit) * fixed JUnitReporter to use a relative file path if a file path is absolute [#305](https://github.com/minitest-reporters/minitest-reporters/issues/305) * fixed MeanTimeReporter to reset by deleting previous run file [#296](https://github.com/kern/minitest-reporters/pull/296) contributed by [AnythonyClark](https://github.com/AnthonyClark) * removed debug output from ProgressReporter [#301](https://github.com/kern/minitest-reporters/pull/301) contributed by [wvanbergen](https://github.com/wvanbergen) ### [1.4.2](https://github.com/kern/minitest-reporters/compare/v1.4.1...v1.4.2) (2019-10-26) * fixed DelegateReporter to delegate prerecord() [#294](https://github.com/kern/minitest-reporters/pull/294) contributed by [mame](https://github.com/mame) ### [1.4.1](https://github.com/kern/minitest-reporters/compare/v1.4....v1.4.1) (2019-10-10) * fixed Time.current replaced with Time.now in HTML reporter's remplate [#293](https://github.com/kern/minitest-reporters/issues/293) ### [1.4.0](https://github.com/kern/minitest-reporters/compare/v1.4.0.beta1...v1.4.0) (2019-10-06) * travis updated to include ruby 2.6 ([#292](https://github.com/kern/minitest-reporters/pull/292) contributed by [pvalena](https://github.com/pvalena)) * location option added to DefaultReporter [#288](https://github.com/kern/minitest-reporters/pull/288) contributed by [bmo](https://github.com/bmo) * Date and time added to HTML report [#287](https://github.com/kern/minitest-reporters/pull/287) contributed by [cderche](https://github.com/cderche) ### [1.4.0.beta1](https://github.com/kern/minitest-reporters/compare/v1.3.8...v1.4.0.beta1) (2019-08-28) * JUnitReporter changed to be compatible with the spec [#286](https://github.com/kern/minitest-reporters/pull/286) contributed by [dylanahsmith](https://github.com/dylanahsmith) ### [1.3.8](https://github.com/kern/minitest-reporters/compare/v1.3.7...v1.3.8) (2019-08-14) * Fixed default ProgressReporter regression from [#278](https://github.com/kern/minitest-reporters/pull/278); fix [#284](https://github.com/kern/minitest-reporters/pull/284) contributed by [bobmaerten](https://github.com/bobmaerten) ### [1.3.7](https://github.com/kern/minitest-reporters/compare/v1.3.6...v1.3.7) (2019-08-14) * added ability to specify output dir of JUnitReporter through ENV [#277](https://github.com/kern/minitest-reporters/pull/277) countributed by [KevinSjoberg](https://github.com/KevinSjoberg) * Added verbose functionality to ProgressReporter [#278](https://github.com/kern/minitest-reporters/pull/278) contributed by [senhalil](https://github.com/senhalil) ### [1.3.6](https://github.com/kern/minitest-reporters/compare/v1.3.5...v1.3.6) (2019-01-16) * fixed possible null pointer in #after_suite [#274](https://github.com/kern/minitest-reporters/pull/274) contributed by [casperisfine](https://github.com/casperisfine) ### [1.3.5](https://github.com/kern/minitest-reporters/compare/v1.3.5.beta1...v1.3.5) (2018-09-30) ### [1.3.5.beta1](https://github.com/kern/minitest-reporters/compare/v1.3.4...v1.3.5.beta1) * additional fix for reporting slowest suites by DefaultReporter [#270](https://github.com/kern/minitest-reporters/issues/270) ### [1.3.4](https://github.com/kern/minitest-reporters/compare/v1.3.3...v1.3.4) * fixed the way DefaultReporter reports slowest suites [#270](https://github.com/kern/minitest-reporters/issues/270) ### [1.3.3](https://github.com/kern/minitest-reporters/compare/v1.3.2...v1.3.3) * fixed problem with default report paths for MeanTimeReporter [#269](https://github.com/kern/minitest-reporters/pull/269) contributed by [duonoid](https://github.com/duonoid) ### [1.3.2](https://github.com/kern/minitest-reporters/compare/v1.3.2.beta2...v1.3.2) ### [1.3.2.beta2](https://github.com/kern/minitest-reporters/compare/v1.3.2.beta1...v1.3.2.beta2) * fixed the way JUnitReporter calculates relative path [#258](https://github.com/kern/minitest-reporters/issues/258) ### [1.3.2.beta1](https://github.com/kern/minitest-reporters/compare/v1.3.1...v1.3.2.beta1) * SpecReporter do not print exception name any more (unless it is an test error) [#264](https://github.com/kern/minitest-reporters/issues/264) * Fixed loading error caused by fix for [#265](https://github.com/kern/minitest-reporters/pull/265) see [#267](https://github.com/kern/minitest-reporters/issues/267) and [#268](https://github.com/kern/minitest-reporters/pull/268) for more details. ### [1.3.1](https://github.com/kern/minitest-reporters/compare/v1.3.1.beta1...v1.3.1) ### [1.3.1.beta1](https://github.com/kern/minitest-reporters/compare/v1.3.0...v1.3.1.beta1) * Fixed time reporting [#265](https://github.com/kern/minitest-reporters/pull/265) contributed by [brendandeere](https://github.com/brendandeere) ### [1.3.0](https://github.com/kern/minitest-reporters/compare/v1.3.0.beta3...v1.3.0) ### [1.3.0.beta3](https://github.com/kern/minitest-reporters/compare/v1.3.0.beta2...v1.3.0.beta3) * [#261](https://github.com/kern/minitest-reporters/issues/261) fixed by [#262](https://github.com/kern/minitest-reporters/pull/262) contributed by [trabulmonkee](https://github.com/trabulmonkee) ### [1.3.0.beta2](https://github.com/kern/minitest-reporters/compare/v1.3.0.beta1...v1.3.0.beta2) * JUnit reporter fixed to comply with JUnit spec ([#257](https://github.com/kern/minitest-reporters/issues/257), [#260](https://github.com/kern/minitest-reporters/pull/260) contributed by [brettwgreen](https://github.com/brettwgreen)) ### [1.3.0.beta1](https://github.com/kern/minitest-reporters/compare/v1.2.0...v1.3.0.beta1) * MINITEST_REPORTER env variable can be used to override reporter [#256](https://github.com/kern/minitest-reporters/pull/256) (contributed by [brettwgreen](https://github.com/brettwgreen)) ### [1.2.0](https://github.com/kern/minitest-reporters/compare/v1.2.0.beta3...v1.2.0) ### [1.2.0.beta3](https://github.com/kern/minitest-reporters/compare/v1.2.0.beta2...v1.2.0.beta3) * junit reporter changed to support mintest >= 5.11 [#252](https://github.com/kern/minitest-reporters/pull/252) (contributed by [Kevinrob](https://github.com/Kevinrob)) * all reporters changed to be compatible with minitest >= 5.11 (if not - report a bug ;) ### [1.2.0.beta2](https://github.com/kern/minitest-reporters/compare/v1.2.0.beta1...v1.2.0.beta2) * fixed uninitialized time in junit reporter [#251](https://github.com/kern/minitest-reporters/issues/251) * format option added to progress reporter [#240](https://github.com/kern/minitest-reporters/pull/240) (contributed by [jorgesmu](https://github.com/jorgesmu)) * improved output of junit reporter [#245](https://github.com/kern/minitest-reporters/pull/245) (contributed by [jules2689](https://github.com/jules2689)) ### [1.2.0.beta1](https://github.com/kern/minitest-reporters/compare/v1.1.19...v1.2.0.beta1) * SpecReporter regression for Minitest 5.11.1 fixed [#250](https://github.com/kern/minitest-reporters/pull/250) (contrinuted by [mbround18](https://github.com/mbround18)) ### [1.1.19](https://github.com/kern/minitest-reporters/compare/v1.1.18...v1.1.19) * Reverted [#236](https://github.com/kern/minitest-reporters/pull/236) (it creates too many problems) ### [1.1.18](https://github.com/kern/minitest-reporters/compare/v1.1.17...v1.1.18) * Fixed problem with Rails 5.1.3 [#230](https://github.com/kern/minitest-reporters/issues/230) by [#236](https://github.com/kern/minitest-reporters/pull/236) (contributed by [samcday](https://github.com/samcday)) ### [1.1.17](https://github.com/kern/minitest-reporters/compare/v1.1.16...v1.1.17) * Fixed tests' counting [#232](https://github.com/kern/minitest-reporters/pull/232) (contributed by [adaedra](https://github.com/adaedra)) ### [1.1.16](https://github.com/kern/minitest-reporters/compare/v1.1.15...v1.1.16) * reverted fix for [#231](https://github.com/kern/minitest-reporters/pull/231) to fix[#233](https://github.com/kern/minitest-reporters/pull/233) ## [1.1.15](https://github.com/kern/minitest-reporters/compare/v1.1.14...v1.1.15) * Fixed problem with handling SIGINFO [#231](https://github.com/kern/minitest-reporters/pull/231) (contributed by [joshpencheon](https://github.com/joshpencheon))