launchy-2.5/0000755000175000017500000000000011755752734012067 5ustar monesmoneslaunchy-2.5/readme.txt0000644000175000017500000000331611342621053014045 0ustar monesmonesFor installation instructions, please refer to the INSTALL.txt file. This file is for the author's random notes to himself. 2.2 Issues in OS X: . need to be able to bring launchy up on any virtual desktop, not have to switch to launchy's desktop 2.2 Issues in Linux: Bugs for 2.2: To be done for 2.2 All: . why are there so many checks for updates on some networks? It seems like it should only happen once.. . add a history of recent commands mapped to up arrow . fix text alignment problem for output box in skins (discussed in skins 2.0 forum) To be done for 2.2 Windows: . Rescue mode should kill running Launchy's . .png and .ico files should display correctly. . add a run as admin option To be done for 2.1.3: . Lost .png support in Windows. It just shows the default png app as opposed to the actual picture. This is due to my switch back in windows for 2.1.2 for .ico support. Done for 2.1.2: . Multiple tabs problem fixed. . Added support for plugins to load other plugins (now python plugins can be made) . Added back .ico support 2.0+: . Add memory for runny/launchy (rebuild/exit/etc..) . Add a plugin for open with etc.. . Add BBorn's kanji shortcuts Done for 2.1: . Added default search . Better file browsing (/ and \ now tab complete) . Added rescue mode (new shortcut in start menu) . Fixed the database update timer . Limited the transparency to a minimum of 15% . Fixed the centering problem when multiple monitors in use . Fixed the encoding problem with urls, e.g. googling for "c#" now works . Searches are now even faster, and the catalog uses slightly less memory. To be fixed from 2.0: . encording of url characters in weby . Memory problem launchy-2.5/Readme.doc0000644000175000017500000051500011355675363013752 0ustar monesmonesࡱ; IH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry   FMicrosoft Word-Dokument MSWordDocWord.Document.89qOh+'0 X`t  Launchy 0 Josh KarlinNormalSimon6@,@B@?q@ g ,4 [bbDefault$a$1$*$A$/B*OJQJCJmH sH PJ^JaJ_HtHnHTT Heading 1@& & F & FxOJQJCJ$5aJ$TT Heading 2@& & F & FxOJQJCJ5aJLL Heading 3@& & F & F OJQJ5BA@BAbsatz-Standardschriftart&& WW8Num2z05.. WW8Num2z1 OJQJ^J** WW8Num2z2OJQJ&!& WW8Num3z05&1& WW8Num4z056A6 WW8Num6z0OJQJCJ^JaJ&Q& WW8Num6z15*a* WW8Num7z0OJQJ<q<Default Paragraph Font** WW8Num1z0OJQJ.. WW8Num1z1 OJQJ^J** WW8Num1z2OJQJ&& WW8Num5z05&& WW8Num5z15BBWW-Default Paragraph Font.. WW8Num7z1 OJQJ^J** WW8Num7z2OJQJ** WW8Num8z0OJQJ.. WW8Num8z1 OJQJ^J*!* WW8Num8z2OJQJ.1. WW8Num9z0 OJQJ5&A& WW8Num9z15DQDWW-Default Paragraph Font16URa6 Internet Link B*ph>*6q6BulletsOJQJCJPJ^JaJ22Numbering Symbols@r@ Title CharOJQJCJ$mH sH 5aJ$HrHHeading 3 CharOJQJCJmH sH 5aJFFHeading +x$OJQJCJPJ ^J aJ.B. Text body ,x/List-<<Caption .xx $CJ6aJ]""Index/ $8>8Title0@& F$a$^]`8J8Subtitle1$a$CJ6aJ]4"4Table Contents2 $>!2> Table Heading 3$a$ $5\V4[)9GU_hiklntzԁN4\]^_`abcdefghijklm <T4dTFFFVXXXXX8@0(  N s *^`P^@`@^`0^```^`^`^`^``^0`0@VVP GTimes New Roman5Symbol3&ArialGTimes New Roman;WingdingsA&Trebuchet MS?4Courier New_ StarSymbolArial Unicode MSO&Nimbus Sans LArial_ DejaVu SansTimes New RomanBhbsFfܦDS&&DS&&'00DyK yK 0http://www.launchy.net/DyK yK 0http://www.launchy.net/DyK yK 0http://www.launchy.net/DyK yK Dhttp://www.google.com/search?q=$$DyK yK Fhttp://gakuseisean.deviantart.com/DdG6(,==f  BA?b7C&n C&PNG  IHDR`^sRGBIDATx^ ŵ{A61QHL2( *!D1F#F uAԈD{c K"2ca%SU]ܾ}eNSj;]U]ظyMr};ؒhiiI$|EEE 2N.YZLZK. Lc )aȼr0#$3MZ(!JHW/R47_"OΆǞq)*4$=IpԆ; ]*,eXrt„ xg>=zt֭b~-[~_vԩnĉ%o𙢛8C][GT/-"`N_`hI%Nb`}e#XT*)vrq ?괭dR 4YQ6iwރ>ȝc6ag]/οoOoǶ({doQ$5lQ4)ݯ+THGZmqgW_}}^-+?|>;nʕl||b;:ƚ۶m?͎it6fۢlikۧnFO' 4]me7ŧaSҮ)RIdySӔs*Z}Dbg 0҂ƒiiXv)ڷkV獼#푈MXye6y`9\6ѠЏ}{)u'Re@ pdTϡT+rY"hgwڛ_;k*9n xpj\ Q]s(Gxߑ<IAnb[w #rQ8dջHZCP<ڠK 9$/N&ܽd qJ% wޏr\ndJ+|9Q*T zu()~sURqd7.vdG>b]䢫/Jbfىo]HGB;{Z )DP c 4c3Sϼkߞݔ{vOˮ]{W={woqvngw=:bED"$o)$Kޝ;Rw!hnݺ1cƐc@Aű{gy䑴'Xowrˀ8)ǾR' cWCl9yAu̲RNXm?D-+!fª$wb3UYK::TeD`=wWLWM}["_u @̍&C)g=)efB%P_zMH͑>Ɗ8=Yh ԐVѲܱ%qT|t+w=ԕlۥ;0n]lV͜ZDxoU6 l}jU4_m~gx@UD5`'BbjEdeY#Zo)b7L$c(hRՔYҰ9MHG1q};}j0L|_#lx M+`` җҕ&H iQ.<ܫ+=6ǜ8!u# t=\5.j6B2X3=5ȩ{a~ӿϏX vP;xN(]H14@鋟GȃTvˀ#̼,gϞ4CUݛkM],1-"**KiqD~) K4!)Κ0fZZ!'`_({ዀ=tuΟݟlGvWlGI:Ka8CrLJB|8Eٽs];}9-#嬡-^k?Ę~gLOv!ڶ2{a6sWD B._HiBQ{.0XM:1=9;ȟ=SOdFEowNkLJ_r㎘r;W2Mյ B `<$mv&>*;I'A;Nҽ;-R{$e-FU|jk: y:B] P;^,MZk n Z*n{n} O5lZTc#;9KWR]vTj xǔj z3ʨ9k"kr[ n=GLk|nOl X}!* !D^ݐiwwmQϙXGڡɍv8ƞ@DF 3er-޹gN[,Mo 3v_ݿ%tY^`Eܵٵ;"69гʽ֊{_ r(mGp:v fh/L$!qɾV+4RSntD(iP%^V/γ HcBJ87NRb}+;EB;ڠΡe.9wD[+[Sj=ĘU]iK@(CVvKM;ʉގ}UvxY;ѵ@~Krujy '0=>pQ Trr8K==^Frfngi 0UjVtljľ'3#Z%-*h9!cA]%Dp\wqsWvcb~Wpw^\;rT]aF qsBއjlA%>ܐ~l4kh.`;Bhl㷶&vԑV31C %U|ĺdo| O}O{$rZ~g G}Ow߾CiO϶ S'y}|gz][rͷyjfu/-22)H{ѯۿ|EOJ aSkꝆ7T`-pk(n`Qxcb-'Z\hGZ ]XaYyTSjA 1vlnAt)(BSaM\ȪYEa`fZ}`AtXU#wK]74i*O1+uRu[ y*kfԒ@@`PtW&ѭzjN@UO5.v k]}iKJWvەK+_UrEoK`O; o2}b}$YsC⊿|. L0_n[6\ds.iW\Ce->mڡ"죥 G? %ݎkC}%W~?<#DJFxy+{25:fSn18}Nn}1kHQ>v9KoSKÎynOwwxT xBok<tclbH עD"bm/ş7o˲ҡ}VH_Ky-_MvgY#'-\jÎ1I6helx߾9 {t}B8}UFM3(졄A I$5\<U]C(,(Bٗ,*IZym27L 3ތP5qPGfpaz,;Z G5,>ɠֹLiz&[UUCf68LˆK|/'Ks|U*dh0e)kh 6DtGx&ý{?իg?{8G3b vYq(Gv1TGןrG :sa>=4sYoh>j~}6~ՠ-6g-woܿGhwXގBQl݄-BMuH<6E?"{uaz#%EVduy%P٪{NiY;֘,'wxAW;O]RafN_ԭbiju]LOD/iH&̄ f-Den|?}-]6U(@w̖{ʿ=ZjB Tgy4ޮAaɥrqouTWx42sldod[ ?Kbd6v B ~(]Wz*Jך؛]vN;NtBK#R jLO]'@!5nl%[`im݋`;`76ҭ۷ӣzv_۶kꝦJ{nHͯb~޸4=rܰG8oz=}f%Qu_ȸdr.vzei)S2+#+ړQf|@0gz_SyX* ?ٸc^^L;VFv=^sGK6;8:TtжKGqsN]]*:tiNӹڥ 3֓K;EYRĒѻ8!iC;ұ-رHRiC&A>Þͷtk/lӟ?uutOP2j96b^o|Cl˟랣n=vm-_*nFZzqmmǓoFۭ:*Э7n5_Y)u; \vB͍WueWx[ϺQ=jÏ\zC{ G9nvdcr9{ۥS_lrqnp~:^Բxi?3u)ny?>/3L|@۵T0]DUYțh:cf)9vxt( پȰ6՘)J [w^+:Z:jݺ#V=r¥>lUK nܗ'U" )EI[=ѕUNSLĨ{`>ʠ 27<=_ZWWW>TTC6~ȊR=Y-ϊǵ)Cm8ʻPƉu4 H "Q<9#VtVrkㄿb4Yᤌ2w wlۮC&wh۶}6S\4r*iumץk.s׊NK8];ѧkb}K6|/C#+>!E6K'&QujӥK[D"6Ȧ$,!UP M۾c;|//ޫv/zPZkitS/Y]˝@X5Ҋ4-@hڹeb@AxƷZ2;O}ԒOr9[81Ў9:ކӭkӾ{v=ѧmnhK=*u0mO;9˶uj)#mwޣ{BZn=tCivٳ~]ڶiot}Ӽwst}gO|=G}ώ8஝bS6?he348 FMDT2M:2|wW?['=o/ XP2O*QBL +\('6˨q.Fٱ+-dZU>yO#Ⱥuf?fؚQ0a&OC;8yb*Q1auGv+gV dEQ'fyb/ԃ48aue'3Pb]ձ. r]ځ.w>?GqT_ivrl<9VxUhj6=1(CXJv{B %Ⱥiy l2X \EZGr Ww ʤRf^nBǚ{`nUhMuVv˳MVe[~H9ѳz \AhtJ.j+ꐮԢۆ8[qQܥ A]vرtI:k_N:Ӈ© DЩ Wc=zO\ў>+޶8ۦgOډi'cQttŧ;I=)ν>sm7 T Vl;p:twvI 1dׇdl[F}}t5 퀾#<o5Mi̵5z}E6}L-MꔆQ~[F6\JgQ_rҍ໋/y~Ը6VV__V #Z$ )B^Ic8leE 7<:?=׼J3mYaM1W|Y?K9 J U838)+NZu8錳+LDgl#|Fˉ.”{7+{D387+ǁv+D3Acv8cP!l,Eip"JQz|A tǝs8!笕' ЕnS- f{갂}ԦsT%YbwX K(guwbܦzW!mG @Ep_|<]9 !SBeXj=T3ȳjKX]BBs=o٭2̔ ULkWh<7 HrnκL'zoMcFSltNqZ|GTxG.gK=S\UDۈȅn0L2*Kki:Tun)xѮ4hB`ꯌ+P4wEp#b49j<.ƒQY} z+:o6"%Mx⳿s}׼#y g_X;u)IIvv6 }x0mذ}]x Fgiz}ZlH~1y `hڗLZI:yt_. >ctb@_+b:NMS> Y2{}%A_vJcp$o'@|y0uo#3Nu\|ax 쵙97L6*3;WeFpf] |uS ׈tiVFywòF@xy[YgUEr \LCo!y܄$.AH{0'*y.t]WV~tpnTN0yp9T'lt&So.OP2uaz`"#̒>;FW=B@_X.ќwXIJ[^80-ͻϧ7us~nH+T\;fD-5hUcnXLJnD$BkePaЫT;!u>sGkj\WAh3UsLoδ' G#Q$t-H;5UtsU؈{`c:5DEG\)ʓ^=݆VRg?~u]?^%ȲGKkƗ>^,.!gcWеdu) xD2Fj=.\\޴ l.Y`Sus3 /*avg/V1ңʲU͓ y@@*p(;j1\Zr.uE\`w7>@kԴ[ Faۗ8h<tQfFP:IB[)NVV`K٤z"`6 ۨȭV&\9{E }[D݆eJMAOyɹWϬ )4qsEѝiXk-?)35@ndEPz 懖#_#фjD1ew(.uA!h8e֭Jќ&r}>IwXRB-m\LI`5B}oh:徼sb@,J ~=Q?(eA7Ґ_$\S; 2uv֌Gar{J G`S}E+A r l\>I4ZfbA#R8ģ*F!vKJCiL(N"GFVzBJtMӪٗ˦G5ó\U鴁X &T-%Ud!mUyA7tYbD!I%kMFw2<5=o#PVRIwrAT6UMͭb}vfѻ"v{;{SqR3.}f bQd5DA_1`j_7d'ggY/!fb0"̨;|5Hǖ ٧=&=$3jW?o2dCa880nFurAݯCAK64zH%ejVrL cJxS}({_х5v;Sr o;#j>IY.Q X`"q!(^ѢĔUPBea%PGbo3 s"6z(;_ M]_9Hgdbak-6ZG{;m1.~^WҦ ԁhx")6cw~n7f4aY! u#*K *^ɺZ\+ŤLX lM{]磫Sڜ΁mZxJQ: Vy%ƹI]"lRm`D~$32\ڣ[a 3I?mΫVTv}%&[6SԍIvD$2>xt`Y_bFXOl>lK pSS}Q[v~xLP 4J/TUs.AO$,^B1 l7kjj>؂#4%x҂NZQ\r8cٝonwyA\Z(oZ q17 V)J}*`['-RۋVt3bEB`$*I k"5Y<ٓ/ЂY?3`䥣I^ Y"ʊ^hJ$]^'p*RӉ5H;b,(|m{OaI "جsf6_7=\!!Gĸ Ql1?h9KȎbFEV95@ge5 GӠl в쮊uH8i w̘1!Lho¤fa0ݢʤxR&kMD;i/VwLO;Ouf2 C]9XlE _QK^HR<||U3PJTcv.]'vq9+$ɞSa5%YnĠL`Rag%ENju*Ț#&Ɛq'+iT8\_O Z䨶}>[c,Hq6,57vف}|-IW/)[D J'*o&\<8U>_ar`r>h1Nb4d -_Ј C Ja}ׁ0Xw#>Χg UsI8el:Ag\qb!͊lu|vs,jUl(C4^Po]'|ךdJع,|<ɔSRvqxJfrn0&m>aP@":]s)=vJ~t3MTWgQ/>zV/M M;LƄ7ս(NgzX߁+NvcMMKqݻ2uIf#tE~tqad o+;bFSӽydKR{{ԗFHzhQN9XrB*%XkdjTz9FԳnZMCA0MD^ '_>nʅ ׯ_;G y@drx zㅍO ~W;BTbD3`owxd8&w4#G;E8MٙhHv_l*ؘA5:ZՃϖbl!?}}J&#,@#`V$+! ,lNmó%T)ϪeˆdLE^@1"wkC8_lהŐPXba#:@+!"|1L4iP+a;3a-BZ""@p/m۶x-_ƠA;<|!C\pq\7H@@ E.2tD*T!](*K;<(   *{7ΛSA@@?Wrt œU@@ B d7'@$`j0#6VN|<Ɠ @@@ XtGpGCd0L4ط,w4Q@@@"0@@ g>9I"l]`DCFY.WbƊ,! @ʔ ]G~EQ3`ѐ M.a*_SYti]ehTxtX(Z Xm,R~VhbeP(mˇ%TfK9P= i|܄:]Q7kD7 0$|4@@F6"Hvm>yjk8;ƬZ}_Ff ?j$WѻwwyCt_\`h:z[_A{>љzT24h&LR$.eU!4@82"&nD`g䔼ŵ%8s2+q@J~DކW7q&-2 h-omf{nϟ$#F}hò':8ͷmۢKq̙l2;vAr6oۻ{ 'lM;y b{k?C65Q&yv$J+ ĀʁR솊'@16ݑZҵ_56;2&v+ F/| ?3_ U A SNR4+3$͠+Ν;w<@˜1c:=!8  esͭ"`.!E(2@P@@ h-;3LԮե[(\3   b;+%   ECъE`E-{8 xc>E   )>!I6XpHA6,d/ArŒY(  0@(B) >@.IZRC   9 {A"`!!@@JvGXw}WH8;\g3 B`uLI hS.R5[pneaԨQGyr?< <?A\@+!@=zM[63\En]9r$j \l:y  #Vi.~!4ѰzW^yXE yE X1 @@ GOrҸ(B#4r-Q&E _E t+$m_ ~YAHH726HJ }4tYcRݟ+>g8GZBo|ݛ!4 &B~dR-)YjuCɜ3t5Y E^=9b7mº7S9?{:'r&>Ohe!DxgniUsWoYZW\<| ! [`.1.p&nUS< q˿S3?Н]@Ӂ$qq%8'[KRѬju\of~ cpj_˷H B@~FgqAM-Mf.7J)̮9H5!`߸ySh <8Cwa8%"˜ZBWt;黿@b$ uc-EYՊB#QK/f){#3CH׏u[S 0jKSD@ &"8N1z@ sjj(h[4~I4gQKKDԘ"X>4e.ӷ$_Vg^nou:E6Rh}vvdzMN--→"hvRnvpFVHX|!g $dG2€@FXX0Y5'9+W땍'V͟ 175_ǜ&n]a_AFLЅou:w;笐c/Z%AK8Cnһ*򠕹IbF#Ս$e!=ωTFx(B7:Nu㪦#b D=\Ҝq~+/#z.\wGw:pӳ 4jLٖ Nmb(Ȉ@FX=aEΘ;#32k1ErQG{y]<S3B8JD#;vNK"EZ!i9BU bN'Fx୷2?p/WLglM$(ũU @ hf1C&qdEHRPE>jnltTvK7@AB(TL 4/A&^t+"Q̦S<1! MqQ Y<6@UsEvWleZB=Y)h:DKp9uv2]-M,fKbF~Lgd@$S"LjTGx2'P3GP*D=;-(eD .D ŕmCj ^ijpʆ&.z9v`iIf* R:*[b`ҍJT.JW EBfEdO2Sd _v\؇ۓw@z PiYq톭8 s JCzG?z{O8ᄭɶ~y~A߷3"'uZG}DAL4vx4+[_DsAZ/ܳPzyo5\CA@J@YRLtsg^Bd507{\TxILF] 7=5N,C`.!o$ 9W:C|E(䣓[⾋Y };s_ٜA   P(I"3JZB]`Ef"`O4,WCQ|0 kBO!دB>`^]FB(8;BXp}>;9B(8h(ֵp 8 #*2҄( ^*9@@ʀ@ gd˝*k}oNS8@b\rg'棼C^sr`  im۶cڢQNfzwӿÂ9%Qx2x6r 2@@ʂ$cExrY5?eM   iݵ>x iFDR$`;!yy`B)ZA@@ qj! q   PN|Kw4z<ݭXؓ5<:| &7TML BhM `^耫VM=sN=`^!1 }8XA)ۨcN,Ԯ&IsdIܗf(B4@ZysA5n=~"yuu5F5VG%ѴzPU&"YKb  Ss]P4[>R\Vr= k{kkW 9_=Imb-ȝLP5[M^v-~rnАXDzԛ٨   =@&%{x~UM<akjW'K4a~;~CRt@DKdXJW IcXj7dЮzfEœS&VP5OHK55@ݿv۫9GTv:WpPw4'޽{AԸ)e^אG9>h6ڟ|^Buü:q/@35 Ճ"L2U7LC%$?QڬZ!]ՖҐH @2# g )i/qZs~ЩAf<!F;#7ٳgO x%&JRu8 ^gm!$tʺyV8gV[*'LԇHnvnt R#ib#?wS)x;sHyK&c\ x+V  B\kӈ;<{6 {[^9}~]engu=4LW-l=sn2 +JE1k!VHʳ4#V  xgQ#'t}GQ_a !=y~*؊Q֬YLߴmݺ52%Ő&:c}/9>h[wC$j5bY8t-b@K/Z$NB  VkدU9˵؈0  c98$ז97v&_잪 ,~!:x`g`ΝdgE޽2F3+X`A49>4"¬Z~$ p퍳_QŵWONN1<$Ԩ AJ@t\ OwNv≴kXgΰ/9qힽho-Ԋ-pfp-wq7m۶hƍw7.Z$sȋ.hȐ!%9MfWA- }@@&и9~$.o:u:zmG9kl(A![C@ص;(L<3 9?*rY=.Bx,ff @@ :JGwqfFwuVM Qvl/"?(<  P>9k-M)#G|з|ϻ%>/u=/ @$1%!_v88w|97 :fB  EeiB$yW8fR)@( @+3X[q̽MQX𢴤2.A1-WˠU/nO>HupJNBWEz.KS:|Pw' *"^;4䏥N5@J5SK;,mfg-O\BE3A?ZʐS3j+uK#y"˩+S( Aʅ;S.v=Ğ׹uE"YxtT5G&G`CȚsz5#,ӟ_iݤi   D=1i,ҺDA=:|̟/WZ{Xݺ%P4.^-g'z9uUU   x+|/A}WAA^H m@xpQ (4r>Ap 2h=eKDĂ$ZDu@(BA   8/hf @@ 6 ʃdEAB "|c)   P\L3f@f"dA@@L E(ӌY   Cl(SL3f@f0?2%L3f@f<`Lb"O^"Y Q   P><.P> K@@@ 3Qx Dl(h(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@LE(   ]p@@@L(L     "KO2!2H  %!ݻen:_QQAgqUW]`hfs}hEYAIgO  Mnhs σH" Bw-wq7m۶hƍ~i'?ɐ!C<.{ ~W_ E@ʆ@]!SEZ-@@rH 9L A@@J\(   %!" @@@@ P&@@@ u7ȇJ\" D G7=qΝ;UǎsG(Vʓ]y.Bl ' Y:uxg+g&qƍ=؎;L*g"`bfA@ظaYgu|Z|iE2[X7H@Jݻ'ޱcGZAZna"JZ(BP#!(7|hŬyu.BX $Pm%|3 !C @I%|\<@F  PΡw*z;ik:~m.v_nIKZ'T@@( ms}Ö ʑG;4xr3zO~Mu KεG{Mvd )qpg/,K|Ed$ Jછ9 nE-3_߇83ObOxˮ8!H@[8O=TzΏ~`۳ud(g| {ٞ퓝{$[Ҷo'ݢQgS͒*RQpF*  P|=6+88_x)KSI׮XqIrf,v_ܙB[Y8! \<@F  PEpvuO/rztw/|#fsS }tbߌo-B߉YQ /Hq  DA@4.5zP\qr־gM7f^ If5O4@"!G!@'^S?];gGٞhНtΦv;쉋|`!%i~S{\"979OzY"d^"d@@4 Ts/WuzPҏ&;g:-v 1ͷ}s5= l5y,Obs $  #0f7)8Np^x9|+̝hK7+W Qb  @.Xg&#xsEA$v^ҌzFoٲCڵsVikI+Rѻwe˖tM&O?Z`As}hEYAIgO.ov"!h6uN߆ϺCJ4\g0Κ5:38Gbڶm޽{ɡzlQt'Kn.Ft7믷K.dȐ!pPC .a髖>;hڴwR./7mD=qnN_*.x~%<\ bngC~1@oz'(\=P-yEZnh  0g};IWOP)pp H@@\h  &A@@8 E(|V   P`p H@@\h  &A@@8 (n*V  Pnkh)NU@軳Qx (4   LO|QY0P@@kC<{b}cc}ւg,5`'P*e@\B'Ю][ tеKnuޯKN;oO Xj^4iLꩩ,9'&~01 њ&̟h`ZLM?ii]e0LRM*pH ŧB0m+czW@BP,)9|kw =(YEܡK玴uu)M yjwͫWjaJgqFS_9jyun LLMf(`\gjIJzX8c'T} U,+3j Fc%@4Оȍ&JL^׆]EDOjlpjT#qB5sDONn.BGpb9E π6섋.uWtm/VP8:QZ\+&4hV@0AM|:fx@(},đI`Bͳk(sŵE(6  PB:ua͛lݶmG}'|)o6Mb"V&m\:6q`fuP=$fY (VxO:Drh&0^MxbNQ(6mp4чVPLf4*:n@9Qd[E޽-[v7žo_uU ,VuνM00!\{W  I mpz2=Z1_ZVEg)x-wq7m۶h}Ǎwu%\rb*@   S6Ae". @OJ2`r@QP%@@@(s Ŗ1@@ KEP؜@   PT0PTe@@@XE(   PT<.*o F I@Py@@@. !i'@h)~Ca"xC^IG(Ŕ@Js/-}_<{a1R e.Bd$8OЯС}eѕMQ+fBٞzpRg  ^mTtоS:چ[P]2PIu9J=s%ŗ\SG  PڴiC;ܱ=4СC$ ٵQ@E+R}]nhDU}#'O&'|Yniy !7b j(cD+XE.B1t&Ю][ tеKnuޯKN;oO Xj<],4w&cEHK˜ X\[U?јEGVMhMON``}FN^Mj*GҺ&zS1RyUM,S4E(XN a(uEܡK玴uu)i yjwͫW8sx+4Z}p0lGhb ;zGHOBCP)$K,񇀋:3hѤC^ K|g=h_`' T3,Q.::N@,; AFpڥ"US?+xk{/ ~HXC5a5"IC]6Ϯ(DHq 3׀Q h %@S6lܼym۶ǟ|ɧm(&h_Mb0cW +j,,VTGĺQ/dzA5sѽRY7m>+",+:qE rvCE LE޽/_>k,͎÷+rѩ͹)_f;$Qko}k @@ W%b\Gezb4칿եȐ J[nz۶m:7h{9B  HE \8  e b@&@}OfTE(<    9   J?@ .K    =hKH2"?(l)   )u/KD7=~[s2Uǿ;;wz{>}.0@Q)(feҸ鱘i%G@doE(vY"3"koݚ䙃"dϞ=*ׯaEy?ͮ]α9'^}sx_z4+駟ѢK.?Oo숃IE!>" 9(>Bl^~͛SOUfPJ=&;+h:uS? fה6XX~c~\BU7;7Ls:tPi]|yU9gϝ_T̚BAkIE4,<ԓOP".B3wqFp>8*kg,M=(A(ajS+o ꙿ!ygv~59N!Tpp`,W^P=K6A0y᳛Ös.ע(,k^\+\/ xDTܑ#W_ffݣG߽&S)Ep(u+iaj@&܊=fBnZtg>OU\\՟r9&\G9k+ Gw=ZQҊrMnhojX9"5/[\i,Uޏ1+x$}͜烴EDCv&];gGv*@}sޝ!ɢԘ t<y**y)$Joʺ%̔S4B:WߊZ}Hͳ'76WUT `^덅|O?H׎qiG*< ]v}(|ݱ?|6 㚉(`!mF>}v拒˥/M=Bn']bŵ'3_S!ӌ#k?K G7jj450aD444OZ4io+5T?i_5^e'994R^I-c'T\d-Sً!{,cJ_1Ê`o q3VCL}N>:o.S,M ӌ#}'>%ׅ a1@1.ByyExy_= 4!Yw;p. ߜ'/CYTTRH8"*rrɡfj9{"6Ph O TMe zbYTOJGy+HZsy÷|?ojR3bj!Ɉ5SK;I׬n̸鏃r&#0eȿ<3Ku.@o|؝zpj0Kg\jRD@-'7C+*k,rC#?!W鶫k6ߛm/PxzC`!=`gμǒH{[g(]f?3NlG[O&`;6%Peθ5dg9t[~u{ ~KP?b%I)0۷߲eˡ+&EEdWrlEQ)۬-!@ {U /r+s%aPѻw˗r-||o~W^y A͹)_&乇_)̚538GamݻwO<<,*+PT$#JB溌>$kM1=[_o^~ ƛ4n.Ntܸq3fx')/<ˏ=X13tM6m>t@x{'?/!G!@@@#h3 @@G   Px"+Q",  y"<%d@@@"e@)(r86dh  NjjІsIkiݑHӧO$j޽ô5FD\ Wm۶ 5G䚑3'ӣr"m<"dB s!    $@@@Ig@@I@M4 @@@ w4׀!h  %p뭷;dI$;xwYX;szǎs:!8R}.Oz&YLܴzmc>c_W-]ZWg; K.b@ȋ@Yؿ(c=5#LuYOkGֶ湧2Rywi˖M;Nj8vODZwid\/ =ש|Gp^}-` پrs^U8_5T95j4W5j@46W@/%VT.VX'VO+]zc'T\ڔKy P|r"ٳg';v-.[ۋ|MO߼k\5l{U?G!vٴNg=xorU~vHMӇ 5+DPTj8}w.\+!44V6.sfg ί-C$|(g{$#A~x(4w&ukphA#4ar|x t^46t [}8mU͟0;$мp]ivܕuxei]S@si\9h4vDwNCSr`I3@)ȹ@P笸#v%{M]|kWhZ{X߁ԗ1cƈ/,t7Z 388]Kb"ћ852 @!MĠ|:EzTQ3%/YGqb8iЄB];gGq#JZU*tę;gi\Jғ;O}U>fߩ{#j/IM#䦰@ɄFmZ՜2ꍤAEh1!S[zsSh~O]Pt\l3F!vF-m+EY'/R1s!`{o_^]2" Riqk^nܬ whPᢟ!gũ8'w+@ EIl4jO;WOL6ϞNhjX)s9ȌUA bPUa':L=߈Fy(IEC}%P=]qqE"6wb+Mq5SK;t;CFomqp +!OW'3x$SF!2@nhh߾-[=2=HlHr󋃝);Kun!XH@@ ܵ$#dq-¬Y<3z]D %FoLiOυ@2}ChxN8={190EP @@9;ڵӟtg>-Os `9B=  Pl/f'-T\twRu|??&=(  '@;]vs=7G.E:thh}ҪKr ԡ=rng /|7~EE_: \BPG   P"}AA(4A@@ E(,   Pp Ai@PYA@@r"нdyVy"   {ڏN6[]z;Cg(@$oRʯ@ç+y-[ɩU  AF Oqaͷ5(mۢQ7nƌO< 0~2[+#`x ={A_r%"k ЧO5NMN9   P;8k׮-8;͛7G& (pgA{,Q"5@@@|-BhhA@@lE(!   MpI@@@lE(!   ME4eS*d8"xB}    P\s %P@@I3/!h! @@J^B)&tP/یN;mڴi ,NdνeM 6 : Gٶ@@@L`۶mǍ7cƌ'x2eСCEȲ   P\X@   P"}AA(4A@@ E(,   Pp Ai@PYA@@pc!#M(nOx>`[͸ҳ/2~H<;wZ:v~~5\8@@ؾ~cGo?c??¤%qnVv`N$";]R?][}ӎrE]wɓ{cǎ0SN[n5kԩSZI---I @pێv]ph{<>d YDv%ʻݻwped YDveR\\1z  eKiKOd%"dA@< rIJ92EȊu=d,.a]rך tʼa!s eHe_;Gэ?5w69o߳?=tɖ9D}q ?WK_ de~w24@@ I,O4̖G.C=ڲpIz|}ʼa!s eG@b!K%w™q׏)'Z~C]'Y{ء g+98Bz.њrf~HݗE쯹 {5s:ty}8ƑQK%JZj"$E  ٻw'n蓬}|kcثπeo{=Oΰf1>![Ȣ\ܳg47u֣kxrZsioGz~g}*Uxɗߺ8?Mw'iE\Dt(Cz³z1spٯe+aC px08Bn?⼻v628}aku9tM" KG''r !s eH:oW9|@_40r|߸p1S_Zr~ceP:}WX:ouyVCx2ŝ5}ǐیhi  _=eps:7 לtS_}Ey9)f;]%/|w/Z;eZOd3z[X0[D;o 8' vH @J]hޖ,~S5OE~˽ؗΣ>,&ʢȖ izE3?_=HMj9ιS+vaF㯲5o%-G!^Mq2Ə?mڴ d.@@Jo{eim^{q[qzKO ꫯ9sKÞxZ׏zs2-i8e>4y(!b!u՛HrYd- BtR{DCRD Z,.{LK4VdXpPQQD(==Ny|JG۷߲eˡZIEdW&RE[E\(u_9oms6;-lڣB-{:vxgѣ"G#M۴MvՁ٣ VxձLy|N=A4UDb6eщ޸c^8]_1 /Ri3J0HgGt/r{LUVKq>J@4z@B%8ʦD ]x7uG,P+R-(XJS-M8a'd7h97:6%(m* y-ó/ 1XrX|TGRtiws>MdS[`url"},JԿ/LT}GSU5&>@1SLyΰ@#6u,7 1/徶ǫ.-6#$@Sa0XeU臭Q"k_~B4 nסĠq&Wot޽駟|o'aȑ۷o裏L$j':IɽSj}D!Î{.f nt-UT}(X2lw *nC}=r;G}6 {nIpp:X,utxc+5 CDQ^Y\l#ICEѝ,%_{SL%Jm&>UZ5$Z6 ƨIPU 3wܹw}~sϜ97۹gduuumٲ#>wo $ɲ C!p B "`P@efȆ% Qs?~A4z#Gf\>غuM7TPPPWW7o޼dc' eLd lĊi8|&W ЕR$$P^O}R9U)$\%#Z1^IBtb`HI#mv^ f]q,$֓84Ah\?`Çm?c3bnfGV-]O?=&MBw߽iӦkk5k >6$6lC@FBBSswFsU Žag~86 O8`XjӢjdv.IEQ @cy2TR ܧ2xV>`1RV@Ȧ8 YYN>"JkQLd b%"HlaC)vXU]Fj\SPG]/ڌ hb =4<ƒTkζ Vބլ͋ed=R*v QJ"ޯsABbԨQpю׀a^ @Ag f*mC0Y>FCz/:t_iӦJ>WK/ Zv999<3\\9`$&UirL725SY~"MN./=EW0<!a/ Ϭ9F0-|(ǟ"Ҍ=U YKD%l/llXF6x-RvaJI ynq隃4lDO)PM52,spiJ0,dEٵa5*|`^]cxv% d<|O5Rj9W/*H]%mw.ƮLj] <; !LJۈ;ȡie: Tģd c=3}=vc{ ]/HO  3g{Xr߿w^0`>aݺu&۰a/4_d78Q 8kfj@89`/:;hJ'Z1&y9yܳ`{n1 f 1]s<`?baR`]f"jHLizqL@d*G\ZdS4 %dUH2w>h"h5i5.MwgeuÃLeFE F@Vol}Rr0VJ6SȦ$}Zßlt&Z^՘8q ʵѺ Uw*:6y?ƿ쇱y?{{?\l_of49.-`O91KL AaܿWJ[oUUUaAG|AGEDD)} -PM}UDeLD33 >ٰMi!!W}g>x.' dTKf7Hk*lϲŪb8)&YyC6Hg 7Rk`bꉳ>VeZ5иЀU4ix"9>[PdZ#I\o]G%xC8V5¦hITX.&uHk[̜&=Z~n^-28Y(cpCcƌyW Ϫ+klBeWI>0N4ٞsK&j1*ō,af__= 1'v^| /lA˗gM8b׿hM 5eȲv **jjs$꺳ZHQ*\IJmSspNnxmA 'ÂE XqxO9#@b{g*{p2L-_=\X*cgOvjiPBV jӀjzqV4 h|W>1:VѤ |(̿&JU]}/pѩO{rT9hçk]۔:r!_vj;ղG^VKڒO/eij: D뮻?jߩwM2nܸ+vE?"ޙr˭i>yɼ u~KCI`7~8XgnXb#K466?4@c9c ~Lj~i{Ϧ gh'{J1eP8xZ|4NIOX8g"fi]`BpzBOe N,}9u8\ܚ>:DezH&W$X;4M DB۽BƄZSElY'02ׂr"piԾJgǭ BMGC* j:7W\SkJZ 푌툗 )jT )]cOUiN]T4? Bٳgw!{O\޽O?)O?ޱ_{{v|{{vl볝3~^~U@ޝ˿ Y1_>=ZGc[`~Qwn!3xX Ԟ[Uova|'چXsIWPGzs&sk FN,<`Fb+32 2[Z|tM$s^}vFMZ]O !Һ1˵h%n^^hLF/5x1xr0 I#yK DI}o#FM\ k;jkO*i(1& lΟRCASS|y#7.7^)R2|->2ݽ%Ö|& T+Evl\`biJn,`Y{۵ =˧d :z1,^ }yńIЗ C֖u9BkMթY-toi9jT;+g˩]ZN[J"Dث՟_ʑ;ç4 AZL&a`"?2P/n1uX㫣M pܨJ{nBxE}e"OGwj_21K9 x 'FwX\rh!-.!~.i&LpqRjCQzgeC@4@]{L2XaôAlBS3_U];]%RpC–AfGU*+;2#j7Xr U|Mkzqs(3JUxxR>K4;J%wٲ6"{ Hw%Q |ǶiXK$/HNbUBaR*LVLU/\>^''t0b!P1FExr4p1O"zA :'ꇊ&[c =eɪo<t {L.ٗ?e5-,VkԒB9UU7* [Ί2ul1j +>Hs*$ɇ}F%f~A}jV5}􊃍[( was4ۢh`;[U-%ƌ0KMv\b֊R@IJ](\=! 8z͆<bV4HL X́ђic!)qs|lАu r:?W|Z+vX^:"˘sgoKjs6fګȦKn/og%<,ԞMƠnGR*M?tj*x_/kx72̂^: d%o_'z (\n0FD#~==ח}@?FLX?+gY sTݛ!"H`{%}ؾ}1óoxof,{+5/>G}ʱCy~/X/brO ,s_/8r<Wz' =>̳>``u]>)㩺Y2~q&G _=9X1s&ly OSOuU׭P6.UJ}}F5!ظ69^-_6WZdǞόT0VFS<2kgU;n5.I>Rp&P'}&Ll@܆:[U/H#mB XP:Fbxe%c|i!2@h FR!1oGJspop]a7d[ZzK0_WFh&ؑ U҄-BgRKLu>Hģ 9K/-3^4:zmKe. U;@{c9-Ankv\pl-]ԆEEV#<5—Q mAJ. ZE*"GSO8l0V<3i4mK5lz-Ki&IC9nNCh VfSxwN ;F4N5G@Z'?\jȨX㠪 Z![z7,;7.HV $?1l0`#rFd# WEƈFdBc8\Ex}y_4܄ܟcRT yQVY e,|gȮ5EQV>ޛlх^%??zo;WxT܃RG?^>K Ѱ~zB’cg=Vo̜`Oň mhn~uK̡,cK-Kykj!4mw Ŭ&d)MA61'*$>uZqQMP{{"H@l][Xŗ_ [_jʛȕ"3rDq3z$\#G Y#GͰQE~^ 0fA~ !&{Ԉ,Nl@ѣbrF6jd63lxQ\mY9ZwK%B}'qځ?5Gg|[|(Qӊ"1@lͺtqp0^]3UavV)rImFx:n!j'l93XUNJ86 ^-ef{e3N o[LmXO"i%{3b:\cm(Հ Id)>/}@H%*J n份Ttb( 4JP}KZNGE%G \Q 3ڪj1[]Z BhJMNn8wTPiSL]KGFz leֻ wppyx=J՛+ 罿88vETۑ՞=JQ#R/BW [RjIjZq#F/W^^ˎ(9k_ nQAA!\NJHdW19p7 f\V=*{ {:lQc6z4#;OSAѣ8Cv,\f:| '`ԘQ%j%V^7edHV5 ئ_<@ NnrК߸;Cۦ׫vVSoo|JirqsN};77:.}9ht Ld0z!3Kƚ+Q)m\陧<]ɳKG8@fa]?^ݿEdϳgoDr/w@b-Gu L@<, zPj%KWpUDdbswr݆ig!b537& GZT#kږKȾ zb,1ĈBKվQb5k&v]"k@8`V+k)._m;mi4:Jv)ݹ,{i{ _ZX;ffKk+(P"qϼ䐸*[=cO5dCT:667ZЬDs,0F,~%%%h:u1 mP^~.xF:oĈ#F52<3 #Gk^9Ç{A9|Xѹ#-1>F ? _[ZA`kƎ/}/bCam=5X'3)nS_= ٮ6;<`;(A1ȷ?]Us@zhL}&Sp=(.PY`_9V n H¥@U՚"X&ą4RB[bux$P+VkinG`2"U=z(n~ ƲveǑ3]2c XXh.`w +Z*68󥇟~>4N?t?xLY؍?&MO+Oq>bÀRl~qw9Uױ+kCyx;2+H-3U2@?7p 8DݭS$`ؠxI|Gt.DrE-򋚢‣>V27UqD a/C~e 窚9ꝷ):jCEbLZH`@G_2|D{9 R7Lȟxi?JՔz &dĺ$ة&\PrEkw*ĀwBLBJ Eٸs&l VadK6cY >M٥œi߼,}=`K2*Y%O)rCx9\mz&V' H2e [6mis,XAG@>8rh}2:_ 8 Gs93,A݀G}|*ٿ! 2'i?%n))ޖ篪^=wNg-Wu[qk()zFZƈ^k[e̍Z} D`F3).%#O&0BBƗE컥7X" ѪDѼL Z#+ "BM$bװ*/梺͞Vѽ۪?60+=%:L#3kb MQ:YE$\JBيm#uTԲ́k##G nA!) 7DmcUXuek0 _Y6%ΆuǚO砠2{;2 GfM#:eȻu T^bievV:l@MfR|S7i|'0#-rEPK-iȖ C;8 :8 ˎr-fF80G `a!_zݭV hX_}Dz F,`%񶊹Hb-pPE-WH4L84j3 azTu)n:~?#bsU)UG.ʢR* G(Er U?4l Cڹ8uDr9{R<VzZ%9s 7-^$Vc^*3R%MH_F/:o|euXaQkdH :m= ,s/"`hYfцDD8#h|uфDlKWWѐ`9KU|{ gE#a޷7iW:\-@XȟlK9jL#-W9oY V-W#?^@Z3$얉fjXb7X]PZ($ qxE/pZrpQ=GG`7S lUJ7OS>߰M_}93 t$0"eq~N6_C Xl^5Mb?BsDQ!灋RXib&9ݣ=3Ck4iʲZh:x{NT=TDh2 l*D L\ Fn~)ha DTkj U7kikbIEiND%K܆gx5BE49:h*gE,Y%^\?elO5TT}8p`֮jϠI|趷 iw%R体t1wwQxl xM< a" |Z`,QgMR4A*J#2v>QT]j=N1xdvDf!z/5Q5x)Oˮ(|@mj.DAAT \m+J>UUULLhH#K]jŪX(A9i5  M˄H:GZ1؎]_찅AZ_+ȉTDc: ۉVAkSt[lMŊQ:t"^a?kra"gM bMb(O4(W MD^/n2); -V 򼦘eD+u%wm>lb6F|sP*V<8"j=YByWn2Rl#ޚB#IH*gؕ9GDnkwyeu tqKQ5O1-M@TNQT2ZS$sӪ6GX.H%k]n}2+!M =q$XD_3:|*NNڣf]fU]a$qv#n c4`v^JVjk HdR3Mv‡^ÛZ mi.uīwffÕY6m<j x^e$K? ' +g;u]k$eԫ#FiOH2>|4qr U#{sA8\H#1!YXo$(,Л޽W^]&O=#<2Phؑ)[/>E2ޘ1N[B lL"&uJ!RE-@8%caj9sd9S)L4šH}mIBB BNNA7σ( B B P4ѐv%H!@B@O7^_B B p.6нd%v t!@@M!@it'EB!@qG@k !S!@@#n.EM!K#B b7uĉ_{'x s]c.b; ˋ2"B R܀^B}eeeYј /8uƛG2!@&}QG9 k"bId(Wy@pgu{@8 / ycZonj&#NSEĔ G CL@aG5'k׮P4;D ~2b'!/>zL% B  b"w3g6<*7(rre 4;D INs!ZB|\|h!08Ix}t}xiBSꅦ"v*D.vdFB 6R,:ش5!@d: 샒sD7gUX9Dw~cD8W}xхDcԯvWXy+`(%*CRJ])٠j>FhD(E B p9 :v=HziY][V͵P=is3cb_X]gx?2ڎک,<8]3v(4j+&J( MPkMʡ7Hv G |\Ĉs&V]Ϥΐt!]1wi l;jKz뛻b_CUSckZ!Ƈ0:U{yb) !#$|)O?~kn5!O2j D79_/"p@$襗Dd ITz" N"}Z FG+ 0P>#^j{KǤ}V).R@PsN>n 럨o mՏ g*PUZ QA(UWDn0ZePR9U4-BIYs!Ҩ>V7 As ~ID\Gk'K UX|w\pqD2֯~#նXf jok<6OQ~! b6xluPW3aq=ǖN1Vq ppqϹ,c┾a޽(5LtR3|p=F!eݦ*f͸GW и=4O{ $\RY&acU1Joc&lΰzn'z(V #k$4U?Lo{}_u/vC!0$&0b a&d`vCɁ4E]W '^w׹}Z=Oc>=KwʓA@R G7yJUOi'yw:yU,'@IHΧ2ٷN"FbsP;7 Fx7^n 78zRM^%gҘT?H)>=Ġu/DB @3ux`A9` -}Mb;H_⺆z9\x&,,I>YA[3;~w]?<,WgoxME3z߂[ߠKxkO2 >QvISXtƺY?NVڻr,9xX#D4B`0F iJ"I 9wpBb/r`+,M=,* QvB]{]pbf!rBdsgb--ď()GxCc!ΖFrVv~oX8NoubnukɵGVSkOWxyJt}O\!e*q3yQ"yD?g͉SWNMPkׅ5A()9Ƞo @5W\``8sֵywppUO Vz:uQJCPdUZzg9{(U03G5Ckk1DECE cf:)=uܱ ĸy6lH<Ɵ.W/I|&C@+j@!LLoC}Ed茆eG,pFҥK_xhφ;ѐpxOcds*GKRx !Dx0d=YIOنI@PW!{}6,Y㝯N=D W W &JŎ@`Zs"ӝ Xnbğ 2݋ORPoYxi$v r "@iWmQ£:fʕܵ|eRapKNC B tCm۶ kn_|QuYeeeDxןx |Œ3. 6ҭI^B B l}8,A.WD` TSB B P?hj /2XIB B 8x!@!@g}H q/ʀ BHmTcڀ-!cjIG!@$ CEHZPƄ!@@ Y &@85SZ$ !@!0 ȋ0)#B B h@ iP>$"!@!pБ hHxYP!@@J />z/RHB B x*OjdQvRmGjCR!@B@"{!A"7Ϝ/u~R{ a0鶴nc1Z* v{d Rd"{=#!*8?iԿhH u}M0G=vũRT$!tԖ-D ͼ.=DIyG@n&B n8X/'n~3 sp9Y<$1h3 5ɜuY_$!(%]"Kޜ54"{RoC;j^CO5?h 晅L!&N?S(,<җt\_Ag{A?̜g,j2c^IOwt-mYm| $#E^ТTJ=t2uq* zN$dx0j̦6q_8~1-jfb:.ui֜;% jɬw87^tKq޶m?9sqk׮E,ٳg`"lٲ 3'p@pMAoOx<S񳽆iiS]K%x\N5B@ DrY}I:]{yP{ޫv2jY<$!@a:x>L 7o:)%-AWe T"D Ȑaa U HB]ߛC7^^kZ\rƸGG{TE&+^7`u_@OWZ6m^h.ea|q=P҆*⢴@!\ +|+J@BlbTV( =p8``rfJ0k(d6C$ijؖ+{Bl電GP\jehA>D5u 5l@ YOTP.DS;Yv-!PR&@BsY6KlJ0KeKل*`f#h \xK{&آENZ̍ {'dAZ(E@3rŧ~Z|G?~bh_eDCvƫ,:c Ҥ'!cBӰ+ "`(TUUqi/B'v!OA6Ă  H`&:qȔXPA 1C ғH+D&iU$,!@!Z3IԊبD\B B Vhàq!V9B BH;%`-Wf N% B "FiX^ɔ K B tDs-(Khb:+L!@Dj xφ8!@@:"$Zt,A B1 '}"U1Ď BH\!GS$)!@!g ;4Կq!@@ !~Ԁb{{{}Y)>qISS`!#B NzԔ-=?!N9?\?1 sB+P^!ז{~t_T[ O"JBH)\hur)c"e]Lv=kM }Z(7Ϝ4 r 8 B$M (~XZ/_{lkAUU "å*1@7EEHZɓ&k)?_<=/7[chgYY 0 įǏs5'eR/J d=tVy߰D*RlUlrÏ#@l"b1Gl܂\ѿjQScXwׁCκKCP4.w¸1Ͻ斁&?ߟPQ&n,cp\0`" !//׫0wAuyF5s1vpnz, 朐J0)'ѳZ3C=VmFf _Fࢻ%'/ \B6+**0~LA~޸~hyԎ;ZD7k}Z9fk9k5{y]]%obZ`Q{ D6o$(DGA@e$`xBNN6Ey# F/^TX B0f#wA\hcT_QVb'P^^5Դr ΀vW.H3tԖ*d4kve2Bgpuã̷M*5l90tRoE:+'8VL_S7!$ ՖhR'NرڍM7}s!c?v{9Pi:7weL$╔1 cX#pni(pϞ[3LNX}v !?+ S ^U 5O- XQL+`#oO Ġh9zu#΄@Ls V\EH}^VȅxG%R,m~2(PZ;/+ ,fmѿGFicRq5-Fg&8ٲ0 WQ2!D`BHǠj#a`46vvƧ , t0Ϋ񕻿a# <0?X7(Vd7Ռ O;wg47K 6JO]9a1"w^N`p-24@`#r|i?Fӿe z6^ˆ:N>-֫AQdiݚUh&ѫ VQ;Z6sS8ƒ.u|bI 6mڼeցm۶;wgg6bXC.5Z-L!k^O͞Ыl駲Q" ڳ!H* Ly8 C[i(D0^d gi;aSv| g,79lf'Wv%'W|ZGVv\}zVx_;[u2hZf@՞l[sэ`XKd1EСLȁ/rAW+O>N/ۀ+@#8n6`[wkfh}elPIXU L ؔ*>DlЧ}a!7>8WB ꫯJ+N(--L@A#N&mՃajzˬ IIM@d&BixdM4P@ &BOO4?xDx " # G !" @lML 3g`m,* dIGB BP3@nJ@!@Ci 00d)N!0dꘞ4)C)R BRȅ\m$ܼhHB!@ "HK@_D!@!@ )Dd A!@4%N%%%w⽻" !@/B*BpmpBGɜǓ&M#|lE^Wbf"_LwO:DH*E2 @&B $7.^\9L0aȂ7o|{ rpV±k֭+&DXh5JDCDC7.\ւ1c|CPD\PP000xo11&Ucѣ<91@I0蒋/6!Or!LCU ~bdXęg}6n8P2@ ' //-g:?/o~Dp2)M:&Ƅkʼn3 ?AYj#AGxTxD4K($WA|0y$dN߳{Bi 쀼s4~7R'bci xOrtU>=HqiyZQ^cN(+qwOw.4JǪwZV2y=Y̎RDV;+:*[xn\J61hbB -a#?N8¤x eF%eb;+`!ڪVf7pP"ot0njn UreG,I' }xf=k|7Ip>OrJ%1E/,kyc^oѢ^Zt^56qYk\~`"$J8 ^Wp!dg>/(pG$ |v6~'n;A1}= ʺw|{7 ^=?0{m;v r0Q& f);GC_hg Vsf Z1=.`EVσ6PЭb7Si0Dm0^z6{νX?O{Rp#@ܘ4V![1y㱶3G$9Nc_شqKx_PDVm- 8m:PI {ǏZE 9A:4zAc҃=}me%0ZD(K.XR,sbhKZ0tvXNs9c/;eoeScP7`t3W\]B$!$oP䁆 f]PW. Xkds߻w/|?}>>0polsMgùd3N?n3 $?{E^z\,:h`fSeB R)sz;sU8Y}^ Npir#Zh8$r"9bx)Ǘf͡>Y {wv@>`;9n;87^=K<춭 !,-Ԧ6V`& O~< b~ ^-5ޱc]aJduRZdA嚆gw򜅥]Jyz蘺 21D/\4QU_aԑg 9@l@(u{<--D`E_1" $)LܥQpAGܻ0FBH/zˑfBtE;^CϿȸZA/fx({֚v 9tJɺkm՟[5o)IN2#Y !Ϻ BK5mB$b&knITeg4[ozsܷx0A}߾}*(wޙ0úƲҝJCd<qڀ*>㡦oIElaq,pڪо Ͽk~m/뗟(Uva/?_ծ`G͝kv/Lҫ7&?VܙLndr l-=:ɐ#jk E4]ALhѢ%Kx 3?lܸQGqĴiӄ^f"?Mփ)SI)d"$LqÆ b{>yWk"QNАHJ8DNB߂N!8䊫 `Iy08S!0胏 +xS!V2#/yKF9!@>XMlw&G!&>6tNzD "2Q^!@@nn֭[a2:_S]V7 AL`k`bizqNBtA7\1ajSF!EŋàG<QFm` `]hbX !L7|CLiiZpn裏`JC$_0`g*7/]x?nsy衇T&|"Mr~_'/GL!^HE ^0>K$'B "`3 b"B TF@nh}@=rl!@@\pD8!@ B D@|&L8\hQoDG!-WL"5! ]ֶyf)ϡ i"c0ʄc)JK2q7 .sN&cƌ.L"&#M]PPfWVl>W(1cYu<Ã⺆VNat40sr %A_Sw]=HZڨNv-khsK]L(x%P@3/jPF@=h ΝL2. Li۷Ou2[<4 !`{.(^P @owyi1p/U#i,J *[Z,phZϞ[fcUx rr]O ݙ: Ľ_M+Ms&_R߅y   C-E+c< r2X&~駟7{MXفr~0*tLʂG()3z:ںJ`< k(Y1^!5:B`{\$@ 2J_"!X&HsB %tyHWC .zp `+) 4L.r79/cJŸ*Bka 7+4\mHL9g*Bza$ H|~!صkL֯_! $LM6oٲu`۶cΝvn&똄Is LaK.LFkwuȚSnM sjAePP5K;>|l.qI(0Yۡ@+>μxW!dStH<1^ e_k^kUzj\ŗ~ܵbG3/\t}BR-4v-L<r"$.#> Ǐ9V* ^m+w֝*#O1oŞJޱ^ F-G$Tta1&ZBxfuRwpI/)!3_&v ]&IHd'b Q"S1W[xu$X]5XV.(_& ';/lO$^0q`\y|Ѓ7]WtEc}oe tz$bRjC_:g75cx̤M FA+zߖ.]*}S B@m-a]cY^`a)6UrV lay,k@+lX}, *Wx*,**j{o~Dn|׷m_HT>VELz`,AA݄ǑD7xCSw6~ep}oSv*P 0ÖH1N bv2vA=M|㏝g7-ʎ rja{Mk#Ke]ť]=}4e%Vu˄LPŐ0܏wDaZ1-a\&3 B` LJ x%HdI^x|CkyoǃtV~/pOJV#PѴs%eymϞ[s0,{.(^P @srdȸ00.mmiOF衂g `[qX{;t&O#P+Mrh70!ŊWH45N%lMX.^ #rMa[6}ȓ+;+J>ޱc]n&,@'Zlak8 I`+ Pmt8mkw@woEחK QazlYM)|9QWM SZ>3W! ̤Wbmo껺XԢi_"UsIr&DuR6WQ&TŔHH#Yz ;`۞`!D3TmhǸa!-u"PUe $~]WI%D(;C9x?I}gfB8۪Mbk mQ dyoQf&VW9t66CbķX녽a32"}#U`jF@Z!j.[[dK7ep]ciJt]1mm3+6Vex`^w<-8rc̦"z&XjJǒZlolKHuܬkCfW7v.u℅ڸƖ=/Hd"€mjim G}p##&q%NN2Áh Fe05X8,o)4ع4qa Mv},spOBPD[ &׋$Pq1pؚKC2ЅE]- M6=,x1={|4 #!A@4/JT1TzD"@dr_HlD2=~lF, =x)j(>}=]Xa֘' "@5"L&ͅYQ@`oHؒECA@@Bl#UƮr(sZ^͵|ݻbTk G8p*uӥk*utu8kl1;iW&A[5A W y I"$!@@U Ke m/Je«f7. If-5hq,vŚcy*cf# zh/>|%NQ|5>ZMp*[m/sk-\-uZ%N;TkxC=y,⌆n ʔ3RD 3#_RmնgLb%ɓP򴟛#ŅXlX}֬]vAvWݶA ǿ37_<`/\J K̉r!B cU@, gLce}rO ГO`'Y᪋A7^p/wGHpJ4ѐ:eA@Hu[k$8sF̉̈ڞ4 hJ 7X\-'U\LDH IBHmjئ2l4f/ro|(Ý֫?>u6X]Cڴ B0p h B #1n47h1!@!`GSxrGR3<ʕ+kk. =F*蟩2,ij lp,h1|;?ݺ!C;N,*/ Gd"$ 5^1''>{`9 &*{uL@$@* !&lŦ) Ct~S^}G`R2bu<7/ޚ5]k:_/G.41+zA!@HwPD;dKɓ&uӧ_a<MrJf)?_<=/7'0_BBBtą pH1g#=D`ذ <[vN<wYW- r s&7';R 1֚@ &?lAu\3匟d7@y"oQ0t`1yƎzW vΙGع+=/t TmPG"$:UͥJP,0 r sDB^^ 5)(Sz44&h=[^ JB A &8@T?!\'ptrIDX05z0  vƧN:*x.Z6iB_SE7sE``lԄYZޥ).>[>k#C Dٴ#r|i&>Y f"(3k]M.49, لµXU*DD՝m`!ZХ :Q]˧#BH}cT%i&xc`!2̎h.c}6ޖŃ[snť 2RkRW#VusMW|f6gÞȞe_lm*m|KPG9lf'Wv%'W|cΝ`l@N0p…Ae$ U݋UU* BsӦ[lضm;wםF7*woY+ @yTרJ^#CdתrU5_?N b8wWfXf5:)0t48l`SEa0Z1y,a &#O. B'mU1&y)F.eM'\ ".fڵ'}QQQۣQ0P<`/!bD ׹GG% 5xfҥ72nRO-w(TtO#+f2Tt~Xu< _/A3x U'/d05N9òqλzg 6'N|w/W_N8a TߘK }SBH:Կ`Fبi?`5υC] *pFi$D'ilx\E[KLu@d0j<A~0G `y1r!@$b1lKo[\|0,i{:릚bvu-dTă0Mf0Al4(aH?bx(C߾M sط8+1M\t-:MZ +Nz ?J塱_c, 1:#$GC&B%΄@#k[`:'wj5"S[>l~dRc 3ċIE鳣fD.tE} Ec-X_r23-۷9>a` ۴,?SĮ1HᰵP $h͕fuԊ꬝ւZt$iFBAL)H3c C g_brwj6-mrq-M_x[!uKi BH3l"޽{S/2٧19n&'ʉbclg\lMU~>\kv; enl /?S- z%gZ2gꅑ Eu1R~IH Bp"{V5.(B"tqǎ%Ry*[_ }δtߐ:!uʂ$! 6`(˦b)2Cgy"|&,;vr۠=hg2sQ^JK0Vv—gg?zM+E틀2W\qn{wᨈ)x?iҤǮ x`F<#af}b_ޝgWkpMsyc4,g'ޔbsupšg4|!J@+QLl S6OP-Wp.+Ĺ9y"WvA_ny۾ƬM!٥ȾCDqs9g„ ! ,} 6o|{ 4--XIO$$uGyJnfL$fb0Ϛ[']uUū<Im>N['%7oo{ܸqPZ@APuM$ R@ЎluzU¥ΙS҆`Q@^!83#L]|A̻h3NX\QzWNB/rmF7b&;fvY&Y457IRpy`ldtoriҳ8Q D x!JB`(#0nw?+a|ַJXo`<E9{0^,2yJ3Nܡ46&~#/Q*t5@`'fLMgù;#;qυfs?y"h(}]?g,:?w3i{>OİXk&M$R!@,3"] ]) Sv!]oo/ifSX=[wsZGj`ۻz P}5x5O@hxӋ`Kxb`3ݵ*0g#Ae$!@d<d"xabQR {sgZJR_w&_p൧_L+fȷzkM:9`#͚'w_y[O\qTp4N)Ywo9wS?Y"FO>V0FN !d"}ly\|劰Wy}I,vBy\0H"*??ޚE<]Tr<;7sx`&O2("uy-B!@DPhx#E BFj%àoVwΜ9W\qʕ+sjk.ٷo?^b@@LlWx8$bOYxRm/]wc=K.1c3^~+,!@!@@&L8N4 !@@J!@&BJ C!@  "A!@)yRHB B  !ʄ$"B R: : D B R:)ʄ$"B RDS8HB B UH/gl fG-0  Bwwm\? 6҇,$`h>tVu7Z-}(vPl9!Q(,}t)-/SQ9fT2@$c-BƊU߿j1wuuő`KWδ(/E}L#&Bd\{= V%Mu) А RBi[ Nнz. 3kms6g'6껺K +m(E6*[Z*Oas ޶lMI{ )F'nT :M+DeK_{P9D%lCD2l(KOg=!.c֮]$w:묳-ZyeSa=I[5Kg3-34@,ijeh^ErA-nA`(@r5uoJ`1j=2Č"]UKR'9 D5FxTFM;o<Ƅ7*XDg] A~XZ -9y6}eLHm(],̄b՗ 2Һj6ƋJD&;3]v~{Nn7Gշ񤽆1}Mw& "@)f&π|0SgZ+.XHH[#M`sfq:ڋlJjڝJN4j-bxJòrvҤHLB D a:x>痛w _4+SY]۱jEy&Fe S@79I Z/D|B ~攂H:] o傳6^]МᮣgFwK_$fQ(x5`fŭf!7ײ/ݻ0j(X(*`ciD&.w T`="QMYF&"R0ul9TW.hꮂyBpm/ؔ.ۨ'mf&5!'f ; ӼhhZw" @6`dK :1.;nt;r6P\g]K-zJF耊pȮsjM|z1ti%- o5@|9Jk (dSj.q` }sW-: dc8ݽ9[+tJZ"  bM7aouuuL+UIOB upma7^\O\$@vrE}_D5dPI*F-Ch&CHRH-l dV4@ W^)GB@GdP B  /Q!@!@,q!eu&B B $I!dD@!@ID y"$Qiʚ B B!@=B!@CJDhN*!@#`[H_? B 2!3U$B B \m-&}H$@ !v(%QB E %śشӟ> пh%!"aÆ)Sr|?G@!z "QAD;l߾"B 8Ț8qK/tC⬬,o}몫Zr?/bGYÁ%]ȡ)gG( G!,^xΝÇ_`y/{iNC6DŽ$7|W^ !%Gyj*7/az۶m¤u]>~̘1#i&V5킎ڬnTˈm#&Ž;4EGA&B~,kkk׾KˎѣÂJ:&Z5,7 +[pY[;j;cf6c0)8|"do6!gHL$*^"&,CB 4kмOa"`v0_* 0`/&m}eҷ< F`KD ?!}l1"7,]IYZISR_OcY;`Q[k,a-$so{ /5ʁ!}΍7\s0jԨ ~8 `aISS__hR"Ļ,K_RȌEH=AH^ghk܆DA.s`EQGH궬V v 3R!xGMG@LDpN7B&s5j._;$!fd"3\N7Fȿ {+Jyo5 ܇ -ǫ@laIPYgb\Hػw#@d$YLv=kM }` HE&0[UrsOcҴ4#Oɨg. AI1w4Z1wTA<_PRVچ d~FoeeHwSAQ@'tE$`wx+)@G;> 4! sHu}sWՀlсXU/"!E̼rE([]SlaҰܻ$Mq!ŲS?m;Ncnjɦ@$N aYyypٍ o԰ i((xumcsR䞞4ZaST;b%ȩk&r8tCliD; 2d KL k|F,X>2g|I$X`炉.\2ar[y]='F#$ٙc(+2yWvη +*şGX\p: &ym @GY0lb*.VkD ɾ#+!^$JH !$~!''lE#/*,wBB]\Y]DRK't#|FK]e˸^ʨ%&wK H-; 箰Aq(fN "IA*rAa-yLu\$4GvaZcN$lMu%cڔQ&` c ĉ5s<(op+ݘzE⑉plz?|_ ^GD@y,~I4@z"5'mD(+*̇ sl+-[ܴ\<{sh7`-\i*uڦ; ;'0 e I+Q:Qbt]܄FhfҸ l" Ez g]~z~Ne26rxK g8q? *>z39?k"͏GgN n]:rt՚BﶘQQ{ۣ/&Uw'lσc?9Sr@.X^1kE5ďH83g΄Pt;sҤIb<$*۴i-[m;]l7AhX'"0%$@#&0,CrcX ]>rώ-S-SY)|Vv|[PXrr& w[lFNģ Nu`ru@h``(:dko SPS"kRo~ ؀9 EO>CEE`Kf4B%Fd0bFc/6 ",?T˅ba|ݜe< ?m0 IJ21o<>V6.3 +>p]Ni~lrjmL&Bj$!h"3H D=y6(MmHhHt!&J6qz^]O]v)W!@@"G HDH 1B 289`H,rn/-WL! ZF$7|W^I|Gyӽ6^ƛ.-t3gu]Fɍ~!d"P$4d" 'ؚ^{c=4 v(ƙ;B B FLD&N? >^q~Ď BH0G L wnnev BEPφ 1eknC nw1͊!@B i&8,L yAlI8jVܷo_Լ!@!/pB.&B6V 8Hn4^&B(!@!hEw{P'ɨzqEd;os_y^=U?$yv•K8EC&B8h-!@@*"`*B_ޖ ^M+GG 8hZJgUڑ-s1)$}u}Ow4uzo_k ¢iӦD$@8ƎV; ū#F!)!iX['I^zuRBM:#JaF}$P,wBhI4T#v1Lf(Gyd͚5`"8D8󬳾P^1C`Æy i뤘M"!5&}=Tr /dԹݻw 2r#B B 5LPbl10W`Qh257\ 9pѣ7.B D@+a"5s/BeKbEAi3䛤%\䌯DLߛMH,> AnISS+2攊 R-WLb+ >~m-,T\hѼy/6GFD@k>BL[s~}}4QZBG`ȬEȬ3ѐY6Ctjדkt_KL61 I$-b&^Ĝab(] _3JD 5&2d&2NQRhH#0y$yM:x狧渃IЋQ>fKBpB G %ALp FK^`8U 0lXV~^nAA^A~.d)Q+Zl/t8Bt}joQ^ #"T@ @&Blp\Nq"C b#,̂‚\0!_Yl[AXmjyf*$ҏt1%Y6lۡL1-y:G:cuߠ5&pb,DC<]wMfM%&BR1GLC:sLؠJG;'M{,8?bG$ l F^8 ??7 nUVOlGuTPkZ ðA* &2s85Fz5 >X[4f}sWsܸY[)T` lLn宅3 Ƚlo*08 m*Zλ tHa"$29星'??'N2 @T䡉PWT!<(Ce 6۬]+7} |3x܊V0 zAY7DtF s F*1@O'6`gf a/ߖD= S_'88N m iګ UĩE +!VSXX8j_"XB|"^Vȅx=?pO0f)K+%eFO_G[wY `#0cALRH$TFay}TS(>!@Lt 'AM4UId>lDf0!DPWRdmvYaFcc7{emm4۳zVBZ6e4L0HAo &μmP#@&B! @ ?oӦ[lضmعs]v|ިi27 koS&4]neS{=kl7l8c)Vzz gpd$ .@;:vʏ'tYpBlj9 :)S!!@+R 裏&/B H&L(oBՑ@&B@RRB`H"/$64!Q&}]vmss3Gq͚!@a!@^sΜ979DOÒ!@! -aްa쎰 G!@@H!NH6YA o߾=^L| B 0H +QO% S]M (hi%`}H B x"4ki< ;GzA$B B 10!bN+2:{ YPO g]|2YD64̄NG@&Bb*7B! lwEn\@« N4r]CL4tYk'k}w5I&-ZҗRf"d@Q @Iƽ\:{:{qtiqݲ&qkihm eݛ|At*fb#`<)!>A>eO@>zĵfl;[Z#3ʊ0IJGa%gvK%,_Wa1}&`DN!l&BW$$A$d Ӌ(KB 45aI!$͋`$J&DO"Ps蒋/E'@LDy8V?ө^޿y}%?2^XԈƧ< rxf!'Nq"vX|-!&Oס'O_~}ʍg8M*!"(3g΄m+t;{=c"aYƍy7 6ySi;j'=} -Ι$`8kB wDHh8c~;}؎6N4!EEƏ)7vO_WsQ;vZ^*bl1[_Uk?_=ΎX0-kYv`bg8֖ c "4u2˵g"P@K]n\g].B8A _!%Zʏ'NرڍM7}s!c?v{XVV]I״6 vd F.p_hcj_QVfMíZ箘l6)|wƙ YCiɶO>2(uu-Cz&6A` 59U7 架l#'. !'NX}v !?+ S 2N T4-J؆ifL`avAynlL n@cna(K g>8f|5 + # S<0GG 7* y&QƉC=Cr"2 [/8 +?&0rssdr@PRfuu 63ġ}S!ѱ!Wy#ctm6Π!@&B%΄@&#{O94`og,c#渙j,@شBb\qjEW 00ً1mkӦ+LlLw;C5%uF}?Yi\(Pc{ 8b1+Vl.9:W¤!r l#O8KN(xǎ;weg Yi2림Vet謇2{TYeO J U a 2[l@Gw*98 RI!`;Ń/<i[Z}hBBzhDC7^}Y_NNv۷O}hCMRH !o^m3gB#&K/=装vLJ`RV@#^-YtÍא 0܏D'6T'RhNÕAp=!@ba hV{|c3C~t`!tBӈ'@:hh%DH:$!@D@Ȯ' b@vljbAB B H)/B B mhHIPB B?A9!@@J!@ )U$ !@!*X&RLHB B yJH!B @"D1!@@!@kRDHB B ǰɼa"xlTV-? V}tr!ѥC!@Di%$D(khԏOO6,wڍ#Sr"B @2LU#\zwu՗dez#E_ᒖf8۹9SDv?G( n?jJS %MMA!8tM2׿_+Wgr]2KyeSac )0t|g}vlƍ`q!ȦS kK2Kt0EZSͼC&O$SO|o ^b9`&%Ӏ!)q4"=Gn¤Պ.atԲɇy| Z"H -(+υܜlO5E55ƊUf# :3i̤'F^@ʐ ! =>z,kib/%-}0 ^>*]-n% [ VIw-`$bϞ[Q1wv@7UAB 6lX`炉.\/=0wAuy-`S: /^nGH kޑ\_<1S5=BhߌcV߹&۾F̏qnCs}EߙV{I'JB2L0lKKjz+- X=#c`qCHJh2h2^淚  Qrr&(*QT0rx‚\p'z -+"D~`dG.tWw2THB šj殰J I,"9vAɗCQd3[t)C(Mz<4 !w6]!&{0~ ʫuCД*^`_XlTL |j5XlY>t&g^+[vviK쫭x` [F! <<0jAy:vAɗ-5!58SbSJB &r`ԃ+wC\=eI]V&X IZS3kPFdus DᡝCkʼnmb}bV$X)7B S`@&X`d&B}p62a0 n&nicH>[!f5"}r/r&oe0NA>L\}M#5 +ن %H-p d L*$H 6mڼeցm۶;wgg{6: }ඵL_@,1fzʹ翸n s?I`PVB6][Dpdtd`uhCμp! Blӥ撜~Љof V+f_*MB'vW'ě !o^ o۶?9s\s5?0!6J"ybSTąRאB%2 2 !J!䊻!@"[&!#A_ $!@!@mkG%|xW\_^!S2&7ߊ$/bB 1cF6uatoq)@vG> ~j^ves %MyǏN:Aa!GѮnDL>5zM%g?>zd~#! :L5 B@]@&BX1!@!h0'D9S9I[S2cK#B bf@I3bq$B PFH1cVmWҊ`nyx̆p<4ڨ-,`.ZαCSg+#4et $٧ BΖ6A{e%RC:JC:Za+2w}d=kZ e>^*.8MQ:CA>Rq鉒9lmN9̋hJ讌1" Bp"&Ba^Qa><PPPW2J mw%ۥϼ8wX2#U5[e` sh#tu3A]]/0Ik U]dt|eܜƄCK֨F- ܵp]A0zc+6 Х!a=iNDx`Z!&/L=e+V o!,hjW=}0n`#0cA5X`Q&f;k_8ݔ g't FȄ3PmG8JNs @s jѶL_#:̖M @L/` OmwY!KEURnTy~a%`!ol?mkS;/jM m K%S`Mb;dZiks}eɛLUm;F0ңz I2"x#|EGVi-[l۶wܹs.?;GB6=a˞ eetYfq\XxX Vc en[p650BaNn2UZl عI u,Nmsf}e$׎8fFj8FXˢ.e ZC]ĉ׮]{-Hիʕ+Wr]Cӳὲ 9DIaB pmv_li #SƲaKA"> {Kq޶-G|Μ9W_}G9pc=#0`_C)P#'/BzIOD@^(s!ȋ !@!@M4 % B d" R& B mx{c 5Bصcƌ.>l)DSX$ ! X@&gl|wS~a*3"&R :iǻL&BJ CD@Lh+&!PN.;!06]N"$ B x f U-V ē B $oAw !@!@$R_8;㒧g#۠ ǻ%@ʕ BL,!s hsckEYQ8#qpxNlW}O5DT성 xȠ382JV!@@桜%+3{+pjEk̘ B r-Ҩ!@C$G|zՊJd!@$%MMAH@ HAA`6 [P\P ib X!PsWt)5!@I3: ul"O4`FSžѼDJTb#NzrMךqƹKJM ʖ4:0zJdd~^.&B2mҐ(&O$SO|%O3p4M6|[ѝ=AʮP-~"CFU7R& $͋])KBÆeMnN{&[ZzC|9| _mSI(`v1؈𪺃\Pr!@&+rRÆ ̂‚\0ib"uϬIj;6m2 b :Z+.QT/UplڦEنYV[ v;w&?#r8XBTUx'@Ar#*zf%WU>h$B _/L+?<w"- 9/^D"IEϖY ʠ9Zhj;#c" zN^'˷raʕܵ|elxl!ΝniOÇ{Ô[;ool|n"_00QFyz`e?g>sxe6 *mT ka1Ϥ-]lK_2o$fFmVc vf ـܺhKťY++i͵f@Ƃ@h$W߂"X)GP B7޼mBΙ3ꫯ~衇Tpc=aƍϞp 7FLy['!t\۩eɒ;vW7{M6o?Cx 46"pB ^wдװgo}M L|$&2*Лl*BC6usespŭ " 5wIT=֘&qB +P <̏p%`!3I҂^Kdߑ|qmCz|P `"Z 1'2TC+5yMw26QA E ĄHW""$7!Y!ʓ!B &ҡHFB B p)CB B  !Jd$B  2$B 2ҡHFB B p)CB B  !Jd$B  2$B 2ҡHFB B p)CB B  !Jd$B @MO>HF!!@EZ(S'55ޠ!$olʼnI }Al%&n!+vF7V B 4^ݍ7/]xs۶m2̙3ky%… 9x!@@H78Rz" B EL- BH&d"$}ʛ BHYDH٢!B d"@&B2ѧ B E@YYY)+" F!@Gǜr$B 2ҠHDB B X&5$}ʑ BHYl^RH0B B  d%$(;B B 5g4,YDwg744\_▻J$!@!@9)aT!@!D{c&B#B!@@G4!@CL!W0!@!2D4!@CL!W0!@!2D4!@CL!W0!@!ȷN hB u>IG22KTϘw޽;3T?QG2G4!@ !ZWQ2CO{o?o3U︣sΙ0aBfyx`'袋BjD[ 7`%!@#? oTTx`EQ~5>|Wo/8UkvcƌO3C傂ŋ/Z(FM`V!$B 23<Μ?a#2D'vK6gү~ni׮]0Wg?R)]1$DD@!`C`̌+Hfb }%  E#C.FaFBCL@'zā B @U$d~/]L! I@^!@Cw|fg=f18yFV׏~u\8Wkn"Dq($ҙ B ^7~{z˿0^9n,f5"{c_ _p'#cPM!! ȋ"" B`("땊O~O ϸo7u&:3kd"h(^O1r3_G%lC0[+"O!SfcIH"Q"Dϑ8!@;{g+TuS^|uݮ}{:W>a;?]@#Bٻw?{')'|~[I{ny~[Auձ^zܫ?zG۽3$QQH B@Ѕ۵mn[ <ꈛ~v>P!yYvvA EWʴuk޲'}sN\E3|:kj VSp͉4̈ B L1N;*cIo6?r3殄~K]c)~=pW ^{k5W^x5D[xkM:i? ޝj02K|C}Yt)vg2`/8:!L!DC!@d^&-W̼&B  L#}D!@!!# B bDc /#B ݋@6$7!@!@a"Y#< !@!!^k )[R BD GB0RRB B yJȴ%}B H#E!@-W%B H`8]V=N{纺"9٦dl?3(sHm# ,rn?ty8{[cԣDX!2a\<oC`҈# =n$ ㉶4;N:'%`ӦM1bDR +t}+$v?տ!9Æ9`aW4Њ1NQ7 )22A MMz/- *d$nBQUemԟl&>{ŎE@+g K-<~<۱cǛoקG}y睷gϞ{ٹx'hOSmbա9@z78%n0 c=@7CDq&#AHdI/b Z@fK 2WH8+bp~)}:e+Tx68_eqBłQ -KMhDk)Uh~ھyN_l, De3KSlZZi"#Jk>h"VRtF<.PxJ$⩊8h(Za@m[ lQ?tbAZ (ʌ݁=7X^ږy>XIaGg@}{ͮ.^{ 5אƑחTOݡqġӬjCLD,5`p@ )PY,e[K3;i9saYyLDE)&lʻh̘ӘMXבҷgw鑤:zd윂tMVu^ ̧8qUD׺rI1;׷ j:lU!YO"*)YW|pmkٴ,EHY y*o#ʪmHiwS^$Dr5;'Xs|3%q/W3jZgA<73-"M_Ac*bYLYf?O>yݺu<_L0kG  JPQt`EyjlF"KF(Y pxBY.ƥ* J3V9+6n*=j>p)ݣlo"hlQlPsMb@Xn!殍lN]$n[7э"T2&8ٙG*ָi̔1Pr h~r4nj%ȴB h 1H{ݛZ=V-3ld+Z6s3_ĥ@mpx#5-VĐv+n=PH@c=Kq܀^䋜)كX,-UnEE&iU ;E|EI "LAq ࿬A-]F|Z_gu&v UU6`QEIcR>^8րIX$bv:,j,Pj 4W Σ«2JcFu5INlV1됐\a6әQMdA vbG瀿le6,e+36!◙Vfow&;3f[CQI8 ~_xSLɺ;7o޼q|h {k+SG?wi)mqz !*!T*q%qO벣u١DbyLP}ĻD374^o@L\P{ȋ72LEvF!{Wip.Q8XAk: J8EW(I-p=sEDZ,H6R΁++]R2&3f U#}S;IENDB`M 04Caolan80 2V[\   , 4` l D  ^! b/ ^ E   # Launchy 2.5 PLEASE READ THIS! When Launchy runs it disappears to the background. You have to press  alt+space (control+space in Linux) in order to see Launchy. If Launchy is new for you please read the rest of this short manual. Welcome Launchy was first created for my own use, but as my friends and I began to heavily rely upon it and its lack of cost, I decided to distribute it. The official homepage for Launchy is  HYPERLINK "http://www.launchy.net/"http://www.launchy.net. If you need help using Launchy or would like to leave any comments/suggestions please feel free to post on the forums. -- Josh Karlin What is Launchy? Launchy is the most efficient way to open files, folders, websites, and programs on your computer. Nobody likes to hunt through the start menu to find an application, just to find that the application is hidden under some obscure folder named after a company you have never heard of! Instead, Launchy is a smart search program which tries to guess which program or file you are looking for and will launch it when you hit the enter key. It is only visible when you hit the alt+space key combination; otherwise it hides in the background. Once you have used it for a few days, it becomes an indispensable utility for your computer. And it s free! How to use Launchy Launchy installs itself into your Startup folder (it s buried in your start menu) and will automatically run every time you log into your computer. Yet, where is it? Launchy hides in the background until you need it. To bring it to the foreground type alt+space (hold down the alt key and tap the space bar). At this point simply begin typing the name of the program you are looking for. Do not worry about capitalization, punctuation, or even spelling in general. Chances are, Launchy knows what you are looking for. Launchy will show you what it thinks you are looking for in the right hand box, and if it has found what you want, hit enter to launch that program. If it has not found what you are looking for stop typing for a second and Launchy will show you a list of alternative suggestions to choose from. Then hit enter to launch that program. If you strike the enter key, Launchy will launch the requested program and then disappear again until you need it next. If you have changed your mind and do not wish to launch a program, you can hit alt+space to make it disappear again or you can simply hit the escape key. If you would like to change the skin, add new directories and file types for Launchy to scan, or change the hotkey, right click on Launchy anywhere outside of the text areas and select  Options . Some skins have an options button on them. Command Line Parameters Launchy allows you to add additional command line parameters onto your queries. Simply hit tab once you have found the application you are interested in and then enter them. For instance, type in  fire for Firefox and once Firefox is selected, hit tab and then enter  HYPERLINK "http://www.launchy.net/"www.launchy.net followed by the enter key. Command History When the input text area is empty, press the down arrow and Launchy will display a history of the commands you ve entered. You can scroll up and down the list and press enter to repeat the command. Pressing Shift+Delete will remove the item from the history. Browsing the File System Adding Directories and Types If you would like Launchy to index more than the programs in your start menu, such as folders, mp3s, docs, pdfs, avis, then select the Catalog tab.  Adding Directories Right click on Launchy and select options and then go to the Catalog tab. Add the directories you would like Launchy to scan by hitting the  + button (1 on the picture). You can also drag and drop folders from Windows Explorer onto the folder list. Adding File Types You can specify which file types to search for in each directory, such as *.mp3 in your music directory and *.jpg in your pictures folder. To add a file type to a directory, select the directory, click the  + button (2) and enter the file type (such as *.mp3) in the edit box that appears in the file types list (3). To add all of the files in a directory, add  *.* as a type. To index all programs in a directory, check the  Include executables Launchy can also index the names of sub-directories. Check the  Directories box to add sub-directories as a type to index. You can rescan your index at any time by going to the options menu, going to the  Catalog tab and clicking the  Rescan Catalog button at the bottom. How to Change the Hotkey Right click on Launchy anywhere outside of the text areas and choose Options and then go to the  General tab. From within, choose whichever hotkey suits you. The original is Alt + Space in case you would like to return to it later. Skins It is possible to skin Launchy. To create a skin, look in the  Skins directory under your installation directory and copy the  Default skin into a new directory. Edit the skin.qss and misc.txt files to your liking and replace the images. You can also find new skins from the main website:  HYPERLINK "http://www.launchy.net/"http://www.launchy.net/ Plugins Launchy is very extensible due to its plugin architecture. See the Official Plugins section to see what plugins are provided with Launchy. If you would like to turn plugins on or off, right click on Launchy and go to the Plugins menu. Simply uncheck each plugin that you would like to disable. Some plugins have customizable options, such as Runny. To configure a customizable plugin, select the plugin and click on the  Plugin Options button. If the plugin is not customizable the button will be grayed out. How to close Launchy Right click on Launchy anywhere outside of the text areas and select Exit. Some skins have an exit button on them. Official Plugins Launchy supports plugins. In the  Plugin directory in your Launchy installation folder you will find plugins. They are .dll files that can be added or removed as you like. Plugins can be configured in the options screen. Go to the  plugins tab and select the plugin that you are interested in. To disable a plugin, uncheck it. To configure a plugin, select it and if any configurable options are available a set of options will appear. Runner Plugin Run Custom Commands Create aliases for your favorite commands, even those that require user input. For instance, create the command  mailto: $1 with the alias of  email . Then, when you type  email into Launchy, hit tab, and then type the email address the email address will replace the $1 and your email client will launch. Another example might be  HYPERLINK "http://www.google.com/search?q=$$"http://www.google.com/search?q=$$. Or perhaps  c:\bin\mycommand.bat Build your own commands Right click on Launchy, go to Plugins, select Runny, and hit the plugin options button. Here you can add your own commands. For command name enter the alias that you would like to use for your command. In the execute entry place your command line program. You can place $1,$2,$3 etc.. in your path where you would like to have user input or just $$ for all user input. Calcy Plugin Calculate Type in some simple math. Launchy will calculate the answer. The calculator is limited to +,/,-,* and parenthesis. Controly Plugin Index Control Panel Applications This plugin finds the control panel applications in your system and lists them in Launchy. GCalc Plugin (gcalc.dll) Calculate & Convert GCalc queries Google for answers. So if you type  gcalc <tab> 4+4 and wait a split second, Google will respond with  8 . It's very smart however, and you can ask things like  gcalc <tab> 4 dollars in euros or  gcalc <tab> 3 tsp in tbsp Verby Plugin Open containing folders and more Verby adds additional commands to items in the index. For example, typing  notepad <tab> will allow you to open the containing folder, view the file properties, or copy the path to the program to the clipboard. If you just want to run the program, choose run. Weby Plugin Perform Web Searches Launchy supports the following search keywords: google, bing, yahoo, weather, amazon, wikipedia, dictionary, thesaurus, imdb, netflix, and msdn websearch. Type in any of these keywords, hit tab, type in your search query, and hit enter. Set a default search engine With this option, if Launchy cannot find a solution to your query, it will offer to search for it with your favorite website (defaults to google). To select a different default search site, select your favorite site from the weby plugin configuration dialog and hit the  Set Default button. To disable this feature, simply hit the  Clear Default button. Launch Webpages Type in the url such as  www.launchy.net or  http://www.launchy.net and hit enter Firefox 3 Firefox 3 stores bookmarks in a locked database that Launchy can't access. To enable Launchy to scan your Firefox bookmarks, please type  about:config in your Firefox url bar, find the entry  browser.bookmarks.autoExportHTML and double click on it to set it to  true . Close the tab and rebuild your Launchy catalog, and you should have your      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGJK bookmarks. General Options  User Interface Always display Launchy window Rather than hiding after you run a program, Launchy will always remain visible and pressing the hotkey will not hide Launchy when it has keyboard focus. Hide Launchy when it loses focus Hides Launchy when keyboard focus is lost to another application. Always on top Keeps Launchy visually on top of all other programs. Always center Launchy Each time you press the Launchy hotkey, Launchy will appear in the center of the screen in the selected axes. Only allow dragging whilst Shift is pressed Check this option to prevent accidentally moving Launchy with the mouse. Hotkey Allows you to choose another Launchy hotkey (alt+space is the default). Suggestions List Underline matched text Highlights the characters that Launchy has used to choose the items it has matched. Suggestions display Allows you to choose what information to display about each item in the suggestions list. Auto open delay Determines how long Launchy waits after you stop typing before it shows the suggestion list. Simultaneously visible alternate suggestions In the dropdown box of suggestions, how many would you like to see at once? Maximum number of alternate suggestions This is ignored when browsing the file system. Maximum number of history items Determines how many previously entered commands to remember. Visual Effects Opaqueness Sets the level of Launchy s transparency. Fade in time Sets the duration for Launchy s fade in animation Fade out time Sets the duration for Launchy s fade out animation Internet Proxy If you re stuck behind a corporate proxy server, enter its details here to enable GCalc and any other plugins that need a connection to the internet. System Options Minutes between catalog updates Sets how often Launchy s index is rebuilt. Every 10 minutes is the default, but you can customize this. Set it to 0 if you only want to scan manually. Show hidden files in browse mode When browsing files, (e.g. by typing c:\ in windows), should hidden files be made visible? Show network files in browse mode When browsing files, this setting determines whether Launchy attempts to show files on the network. Allow wildcards in browse mode When browsing files, this setting allows you to enter bash style wildcards( *, ? and [a-z]). If you need to browse files containing square brackets, uncheck this setting. Check for new versions of Launchy on startup Launchy will check to see if a new version of Launchy is available each time Launchy starts running. Portable mode (USB stick) Launchy stores its configuration files in user-specific locations. When in portable mode, Launchy will store its configuration files in the directory that it is run from. To run Launchy in portable mode, follow this procedure: Install Launchy Normally Copy the Launchy directory to your usb stick Run Launchy from the usb stick Check the  Portable Mode box in the General options tab Exit Launchy Note: Launchy periodically rebuilds the index. If you move from computer to computer the index might not be reflective of the machine it is currently residing on. It would be a good idea to right click and  Rebuild Index when you plug into a new computer. Keyboard Shortcuts EscapeHide alternatives list then hide LaunchyEnterLaunch selected itemShift+Ctrl+EnterLaunch selected item elevated (Windows only)TabEnter additional command parametersShift+Tab Shift+BackspaceDelete back to the previous Tab position Ctrl+,Show the options dialogF5Rescan the catalogShift+F5Reload the current skin Command Line Switches Launchy understands the following command line switches exitAttempt to close any running instances of Launchy multipleAllows more than one instance of Launchy to run.optionsShows the options dialogrescanRescan the catalogrescueResets Launchy s position to the center of the screen and selects the default skinshowShows Launchy s window (default is to launch hidden in most cases). Can be used as a way to active Launchy from a shortcut.If /multiple is not used and Launchy is already running, then the command will be sent to the running instance of Launchy. Examples Launchy.exe /show Launchy.exe -rescan Known Linux Issues: Not all skins will work with Linux Launchy. If you're running a compositing manager (compiz/beryl) then the skins should look the same as in Windows. Otherwise, you will have to settle for the skins that look good without alpha transparency (e.g. Default and Black Glass). If the black area of mask.png is perfectly rectangular then for some reason compiz won't mask it correctly and you will have a strange black section around the skin. Version Information 2.5.0 Added Simon Capewell as a developer. This release owes quite a lot to him. Thanks Simon! J Faster performance Better behavior on Linux  Thanks Mike! (d9b5) OS X now supported Icons displayed correctly Environment variables updated correctly when system changes Controly includes more items, thanks Fabian! New shortcut keys New controls: Shift+tab or Shift+bkspc deletes previous tab Shift+Ctrl+Enter launches in elevated mode (Vista and Win7) Down arrow shows history (when there is no current search text) Default skin built into executable in case no other skin is found Launchy now has an icon in the system tray Skins are simplified and easier to create Directory browsing auto-completes correctly 2.1.0 Added Linux support! (KDE and Gnome both work, possibly others) Added Google Calculator plugin (gcalc) Added configurable default search to weby (all searches with no results default to google)  / and  \ now tab complete while file browsing Added rescue mode to recover lost windows or forgotten hotkeys (in Linux run  launchy rescue or use the start menu in windows) Minimum transparency set to 15% Searches are even faster and the catalog uses slightly less memory Bug Fixes: Fixed the database update timer Fixed centering problem when multiple monitors in use Fixed the url encoding problem, e.g. googling for  c# now works 2.0.0 Launchy has been completely rewritten with QT Your old plugins/skins will no longer work Your old configuration will be wiped A new look! New icons and skin thanks to Tyler Sticka Much better skinning support Options merged into a single, tabbed dialog Skin selection now shows previews Plugins much more configurable Launchy can hide when it loses focus Fade in/out effects Customizable transparency Optional shallow scan of directories Unicode support for Firefox bookmarks Vista support It s just better. 1.2.5 New control panel plugin (indexes control panel apps) Runny plugin (customizable commands) Notification of new Launchy Releases (can be turned off) Command line argument support (hit tab and type the arguments) Can use  .* as a filetype for directories Plugins can be enabled/disabled (right click on launchy, go to plugins) Plugins can now have configurable options Always on top is now configurable Bug Fixes: Removed startup crash bug Fixed Weby bug (it was hard to select Google) Fixed mouse disappearance in dropdown menu Launchy no longer jumps when you change skins Launchy no longer flashes on startup Calcy took priority over files with numbers, fixed Launchy can now be placed in the corner of the screen 1.0.0 Launchy now supports plugins! Check out the  Plugins folder inside your Launchy directory, you can add and remove plugins from there when Launchy is not running. Following are the plugins that come with Launchy by default, I expect many others to be developed by myself and the community. Explory Plugin: A file explorer for Launchy! Now you can use launchy to navigate your filesystem. Try typing  c: then hitting tab, keep on typing and hitting tab! Weby Plugin: Supports launching of url s and adds quick launches for  Google  MSN  Amazon and many others, try typing  google then hit tab then type in a search query Foxy Plugin: With foxy your Firefox bookmarks will be added to the Launchy index. Even better, your firefox keywords are added to Launchy and behave like quick launches do for Weby. Not sure what firefox keywords are? Go here: http://www.mozilla.org/products/firefox/smart-keywords.html (Note some firefox quick searches are currently incompatible and will not be indexed) Calcy Plugin: Never have a calculator handy? With Calcy, Launchy knows when you re trying to do math and will display the result in the suggestions box. For instance, try typing in  (4 + 3) * 12 and 84 will result in the suggestions box. Support for + - * / () s currently exists. Now Ctrl+Backspace deletes a word at a time and Alt+Backspace clears the text Too many bug fixes to count or remember, good riddance! Special thanks to Sean Poon  HYPERLINK "http://gakuseisean.deviantart.com/" \n _blankhttp://gakuseisean.deviantart.com for the use of his wonderful icons for the plugins 1.0.0 Beta Launchy displays the full path and icon to files in the dropdown suggestions box. Filetypes can now be specifically set for each directory to index Always on top mode added USB Mode added Configurable index scan interval Configuration files moved to docs and settings\username\Applications\Launchy\ which is friendlier to users with limited access accounts. Bug Fixes: The Launchy startup on auto-login crash should be gone No longer presumes icon index is located in C:\ Hotkey window now initializes with current hotkey Configuration files now less likely to be corrupted due to restart during saving 0.9.6 Launchy can now index directory names as well as files! A utilities folder with useful shortcuts is now included, it adds standard control panel programs, system shutdown / logoff/ reboot, and special folders such as My Documents, and My Music. Unicode now fully supported. All character sets should work. The old style of matching by association is completely removed, it s now entirely based upon frequency of use Now has a  please donate dialog that appears only once, sorry but I ve got to make a living! Bug Fixes: Fixed up/down keys causing a dropdown when there are no matches Saves settings to ini directly after changes are made in case of system crash Spaces are now ignored in user input, making it possible to search for  Johnny_cash.mp3 with  john cash 0.9.3 Once again, Launchy is prettier. The combobox has vanished. New skins! Please see the Author.txt file in each skin s directory to give credit where credit is due. Bug Fixes: Sometimes windows shutdown prevented the database from being saved. Now it saves more frequently just in case. Arbitrarily long file extensions are now allowed, so you can filter on .mpeg for instance and not just .mpg A couple of minor graphical glitches have been fixed Development Environment: The Boost library is no longer needed to compile Launchy, I ve copied the necessary Boost header files for smart pointers into the project. 0.9.2 Frequency sorting took priority over exact matches, fixed. 0.9.1 Search results sorted by frequency of use now. Configuration files moved to the Users subdirectory of your installation. This means that your configuration file will start fresh.. sorry! It also means that Launchy can be run from a memory stick. You can now remove the start menu from the directories you scan if you so desire. Bug fixes, hooray! 0.9 Alpha channel support! Launchy is sexier now. New skinning options. Lots of skins! Minor bug fixes. Ability to rescan index on demand. This is a feature complete version of Launchy 1.0 From now until then I will only post bug fixes. 0.81 New installer, after this release upgrades should be much better. Added icon support. Now icons are shown as well as the file name. The visual cue of the icon makes for faster launching. (It s also prettier) The combobox is now a bit more sane. It won t steal your focus away when it drops down. Launchy will rescan directories on startup as opposed to waiting a couple of minutes. Launchy now scans user specified directories and stores the results in a compressed file to make startup faster. You can now change the hotkey that activates Launchy You can now create/select skins for Launchy Launchy searches *much* faster than before, enabling indexing of thousands of files 0.7 Launchy has memory! It will associate your input with applications. 0.61 Launchy no longer opens all programs maximized. This is the first C++ release. As I became frustrated with C# s large .NET framework requirements and users lack of desire to install it, I decided to switch back to the faster language. This release is functionally and visually equivalent to the 0.5 C# release. The C# CVS version had some new features that I will soon add to the C++ branch. 0.5 This was the first public release. T V Z\##,0.0v0x0z000F1h1h<j<<<< ==p@t@Puu8P(B bd(2Ȱ4jU5OJQJ UjD CJ$5aJ$jU6jBU UjPjU0J&0J&jUU><>  D*, > & F & F00x  $ *","^"`"b""####% &$'&'(( )))) & F & F)**+++---00033444456d7f7~999 & F & F994<6<X==t@v@@@AAAABBBCDDD@EJGLGdGG & F & FGjIIrLL:MNMPP:Pi@ifihi & F & Fhiviiiijj$j~jjjjjkzr$IfG$$IfG$$IfG$$IfG$$IfG$$IfG$$IfG$E$$If0-1" 44l44l4f4$IfG$$IfG$ kZk\kjkkkkkkk llll~$IfG$$IfG$$IfG$$IfG$$IfG$$IfG$E$$If0-1" 44l44l4f4$IfG$ l>lllm m2mmmmmmmn{s$IfG$$IfG$$IfG$$IfG$$IfG$$IfG$E$$If01" 44l44l4f4$IfG$$IfG$ & F nnnnnnoopppp q"qJqt$IfG$$IfG$$IfG$$IfG$E$$If01" 44l44l4f4ttttttttuu:v`vv wfwwwxzxx~yy(zz & Fzzzzz{b{|z||}}B~X~~F8ԁԁ\Nj VȄF,Ćچjf̈8:<>J8(dp̕ΕЕ@^Ș6>ڟ8֣@rz ֨ب@lʪNNp"ҭԭ֭&~&((*40/ =!"#$2P1h0p3P(20՜.+,D՜.+,\Root Entry FCompObjjOle 1TablerData {SummaryInformation(WordDocument2ObjectPoolDocumentSummaryInformation8tlaunchy-2.5/plugins/0000755000175000017500000000000011756210350013530 5ustar monesmoneslaunchy-2.5/plugins/gcalc/0000755000175000017500000000000011355776633014621 5ustar monesmoneslaunchy-2.5/plugins/gcalc/gcalc.ico0000644000175000017500000002154611033730637016361 0ustar monesmones hFh   (  bQʼnr{kԶ޼Ώuڌr|eziԶѲե՚v`׎tրbԶЯͱ֢Ҝ굠柁Զڹ„lzds`ط©鿢ʽԶѲڰ߿p룉ࣇȆqޕxԶ׵Ǫᴚǰ泘ʾԶȹܼkʂkԱkXձ۵ѠԶں֯ƕҶ﬉(jGuս׷ζܹҸDZcxҸᮓ꿡ɶˮxݠ骉ͭNV[elrlھԶࠀ_\|N}UM}Oٷڽѷ̷ʭճ֮׸?( bQkXs`zi{kv`|e}O|N}UzdkpNM\_V[„lʂkրbȆqʼnrΏu׎tڌrޕxelxlrGu(jcxƕ՚Ҝ柁ݠ֢ե֯ճ۵ڰࠀࣇ룉骉﬉ᮓ泘ᴚٷ׸ܹԶսھڽ굠鿢꿡DZ©Ǫʭˮ֮ͭѠЯ̷ͱɶʾʽǰζȹѷѲԱҶ׶طҸڹܼ޽F?r7F:j-B(=wFM_Xa,)J*yFNp tnUKdFOj1r 43|FfmVWZ8!+5@xT\ "HF2 CIi~}{`Y/]sD?( @ qgtÌ{tcg[f\ha{jdpǯؓ|vdi\g]iazidÅsɱ£ÌvĊtؓ|wei\g]ib{idƈvʲäƏyȊx؏xŅoŌv㣉ۖ~yfk]lbɊx°˳ĥКȯ£褉訌qɉv̇qޞ՛ѕ}ťzIJ̵Ŧգ޽ϴ⩎ΙæӔ{ۡrωsˊs}Ύ{ƴͶƧΤԺϥѤܽפқĬۙ~ѐ}ȷηǨƧ豕֠Ŧ賙׳ɯ٧ᬔн޾輤ﳗ}ԒʺϸȨҞmÃoΑyƧŦءએŦŦѤ©͠ĥ֔̽кɩʕݛﵘunÃn᥋ǧ᫑͘åƨؖξѺʪӦ׶Ͳ᫑̗є|汖oʇrȊtȩۘһ˫綜ɸ޺ХٻդΚ㣊ﶚݚӼ̭̬嵛֪崘ˬޯѽӧⰘѿ޾ʲ粘ߜԽͭᄀno䯔̭̭緝٫ǩ̭Цպϥɫ⟋տήđ|㡋ˍvǩҡnpίūǩϱ㡍տϯТӺͮ䰖Ƒ}ϔ}ŭMwLpmг壏аԨҺ縞Ф׻Զ֦erjõœ祒ѱɪΧ¨ϣаԪծÞ騕ҲҲҲɪҲҳ̮ҩծ齡ѵpyĸɤ쫗ӳӳӳӴӴӴԵԵԶԶշ˷»׻ʧԴ껝ҟפգգ֢ئ嵙ƩԷֹ׺ػؽ˩ӴӘ{œ㨉נ֢գ帞ھϮǨrtwz|㩉鼢ұҲ؍h]_aegilpsvy|՝Դ׸כ{RMNPSUVX\^`cԗyظظعۢ֒oՌh։cو`]VOLLMX٤޿ŵܼۻۻۻڻڻԵŧ綘ܨ՟ל}טyۥ¯կƮɭŧŦȧɧʧͨΩֱ޼ȨӰ?( @zidf\g]g[i\k]halbqgtcvdyfnnttp}OLV]RQXUX]Ãn։cو`Ռh؍h֒o…rˇqÊuʊtčzʋy؏xő|Β{Ӕ{ԗyѐ}Ԓє|ٔ|Ә{יzל}`begirlpsuwy|MwLpmpjyer˖͙œ֔ؖ՛՞њҞܚߜ⟋Σ֠ۢۥԢ١إ٧ܨŦʧΤɦΧͨŧͫѥԪ٫ծޯֱ׳޼㢋륊㨉ᩎ訌祒ᬒ꩖尖벖Ⱈ粘嵙綜촙渞껝ɭұԴ޺ظ޿õ»鼡ᄀ輤¨ĸ©¯ƮŭɯȨŧäŪǨŪɪˬ˷ɸŵIJ̲˴̻һӰѲѵӴԵѺֹӼԾٺٽݽ ' x1 #·%%}1 %·'()%w}1 (·Yx{&$[W0}(·bzS,c#&&(·i^obY[.º_ueТ/üZ+czo^JUʼR[%wSKVʼoR0$&K[ʼobSwK[̼psoK\ͼ qo^K]ͼ*w}&b MKwͼbʼ*+BCDTwpďooNHIFTƼk^prQPTƻƼppEGjɽOjɐZbbb_dn2y_bbnڹ:>?@A|~~y!6789;<=>@AX356-`" dɶfX43aٮrmgjjhlltvL?launchy-2.5/plugins/gcalc/precompiled.h0000644000175000017500000000236011257666017017271 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PRECOMPILED_H #define PRECOMPILED_H #ifdef _MSC_VER #pragma warning(push,3) #endif #include #include #include #ifdef _MSC_VER #pragma warning(pop) #endif #include #include using namespace boost; #ifdef Q_WS_WIN #include #include #include #include #include #include #endif #endif // PRECOMPILED_H launchy-2.5/plugins/gcalc/gcalc.pro0000644000175000017500000000221211336333626016377 0ustar monesmonesTEMPLATE = lib QT += network CONFIG += plugin debug_and_release VPATH += ../../src/ INCLUDEPATH += ../../src/ INCLUDEPATH += c:/boost/ PRECOMPILED_HEADER = precompiled.h UI_DIR = ../../plugins/gcalc/ HEADERS = plugin_interface.h gcalc.h precompiled.h SOURCES = plugin_interface.cpp gcalc.cpp TARGET = gcalc win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib LIBS += user32.lib % LIBS += Gdi32.lib % LIBS += comctl32.lib } if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/plugins unix:!macx { PREFIX = /usr target.path = $$PREFIX/lib/launchy/plugins/ # icon.path = $$PREFIX/lib/launchy/plugins/icons/ # icon.files = gcalc.png INSTALLS += target } macx { if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/Launchy.app/Contents/MacOS/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/Launchy.app/Contents/MacOS/plugins INCLUDEPATH += /opt/local/include/ } launchy-2.5/plugins/gcalc/gcalc.h0000644000175000017500000000347411334674233016041 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef gcalc_H #define gcalc_H #include "plugin_interface.h" #include class Process : public QObject { Q_OBJECT public: QString query; QHttp http; QBuffer resBuffer; QString result; QEventLoop loop; Process(QString url, QString matchExpression); void run(); public slots: void httpGetFinished(bool error); private: QString url; QString matchExpression; int id; static int currentId; }; class gcalcPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) // QRegExp* reg; public: uint HASH_gcalc; QString libPath; public: gcalcPlugin() { HASH_gcalc = qHash(QString("gcalc")); // reg = NULL; } ~gcalcPlugin() { /*if (reg) delete reg; */} int msg(int msgId, void* wParam = NULL, void* lParam = NULL); void setPath(QString * path); void getID(uint*); void getName(QString*); void getResults(QList* id, QList* results); void getCatalog(QList* items); void init(); QString getIcon(); public slots: }; #endif launchy-2.5/plugins/gcalc/gcalc.cpp0000644000175000017500000001027711336047270016370 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "gcalc.h" int Process::currentId = 0; Process::Process(QString url, QString matchExpression) : url(url), matchExpression(matchExpression) { } void Process::run() { if (query.length() > 0) { QString webQuery = "/search?source=launchy&q="; query = QUrl::toPercentEncoding(query); webQuery += query; // qDebug() << webQuery; resBuffer.open(QIODevice::ReadWrite); connect(&http, SIGNAL(done(bool)), this, SLOT(httpGetFinished(bool))); http.setHost("www.google.com"); http.get(webQuery, &resBuffer); id = ++currentId; loop.exec(); } } void Process::httpGetFinished(bool error) { if (id != currentId) { result.clear(); } else if (!error) { result = resBuffer.data(); QRegExp regex_res(matchExpression, Qt::CaseInsensitive); regex_res.setMinimal(true); if (regex_res.indexIn(result) != -1) { result = regex_res.cap(regex_res.numCaptures()); result = result.trimmed(); } else { result = tr("Unknown"); } } else { result = tr("Error"); } loop.exit(); } void gcalcPlugin::init() { // Ensure settings are written to ini file QString url = (*settings)->value("gcalc/url", "/search?source=launchy&q=").toString(); (*settings)->setValue("gcalc/url", url); QString matchExpression = (*settings)->value("gcalc/matchExpression", "

(.*)").toString(); (*settings)->setValue("gcalc/matchExpression", matchExpression); } void gcalcPlugin::getCatalog(QList* items) { items->push_back(CatItem("GCalc.gcalc", "GCalc", HASH_gcalc, getIcon())); } void gcalcPlugin::getID(uint* id) { *id = HASH_gcalc; } void gcalcPlugin::getName(QString* str) { *str = "GCalc"; } void gcalcPlugin::getResults(QList* id, QList* results) { if (id->count() != 2) return; const QString & text = id->first().getText(); if (!text.contains("gcalc", Qt::CaseInsensitive)) return; const QString & query = id->last().getText(); QString url = (*settings)->value("gcalc/url", "/search?source=launchy&q=").toString(); QString matchExpression = (*settings)->value("gcalc/matchExpression", "

(.*)").toString(); Process p(url, matchExpression); p.query = query; p.run(); if (p.result.length() > 0) { for (int i = 0; i < results->count(); ++i) { if (results->at(i).id == (int) HASH_gcalc) { results->removeAt(i); break; } } results->push_front(CatItem(p.result + ".gcalc", p.result, HASH_gcalc, getIcon())); } } QString gcalcPlugin::getIcon() { return libPath + "/icons/calcy.png"; } void gcalcPlugin::setPath(QString * path) { libPath = *path; } int gcalcPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; case MSG_PATH: setPath((QString *) wParam); default: break; } return handled; } Q_EXPORT_PLUGIN2(gcalc, gcalcPlugin) launchy-2.5/plugins/loader/0000755000175000017500000000000011355776633015016 5ustar monesmoneslaunchy-2.5/plugins/loader/gui.cpp0000644000175000017500000000164211043143017016263 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "gui.h" #include "loader.h" #include #define ROW_PADDING 6 Gui::Gui(QWidget* parent) : QWidget(parent) { setupUi(this); } launchy-2.5/plugins/loader/gui.h0000644000175000017500000000201311043143017015721 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GUI_H #define GUI_H #include "ui_dlg.h" #include "globals.h" //#include class Gui : public QWidget, private Ui::Dlg { Q_OBJECT private: public: Gui(QWidget* parent); ~Gui() { this->hide(); } public slots: }; #endif launchy-2.5/plugins/loader/loader.ico0000644000175000017500000002154611043143017016742 0ustar monesmones  F  hh( @    '/& \^Iamk~\V?]<:60(J~\Ѥ8OPFaFVJGC9% C(sQݛKQQQR=ɍK5MLI9k-~ړPUUUUVSQՏY O9% i3vͅڐKYYZZZZZY.ՌȀ]$^#gv͂ڏS]^^_____^L Չ}q\UU?Z˰erܠ;bbccddddddd9ՆznaXQpVcpΆffghhiiib@2* Ճwk^RO-L IS_m͊(kkllmmnk  ԁuh[NJuFb|DP]jx `opqrpY2݉ ~ reXLxArFl?uBMZgxפRuwwp5ӆ { obUIp>wNqf3e:o?~KWpʛL͑->4-"؍ʃx l b t.`"k>ZgB*\3i=wHX C'ǃۑڎΈt i 7—RSh4~Q`>EW1c:tH@͡VDžݗQ !"!ޒЉŃ{q kĜXUTTR\;MS.`:u9ʡ]:zY1" #%%# ޒˆ}vm mŞ\YXXV \;EN-sQ[f{($֜1#%''%!ُȄxqi s'ğ_]\\YԪ[<*K+vU%ş`m&d |\!$'('%"ҋuke q(àcaa`ff3M.rS#ɤdŞ[C]n!%(('$!ےʅzpf_ Z [eedhP2lM̧hݵoxڂi%!%''%#ҋsja Z {TTihhswU7egJ˨m߸s}ވ&"$$"ۑȃwlc[ U xR s:lkj®&\E jM˩o߹v̀ߋJF ͆zoe] U ~Q G}C~Mh;i@bCuWݹxʁ܌wANφzpf] V O~SVt;Z=M1_?0UUz]&׵xǂ׌ܜ7xne] U OxItI PUPoT"x]!&z@ωޓ|j b [ T NwIj2n7`\p̟_e':^ƅҍޖٰc}'ܐƖEb z+iQ}LvGwL{I~Y"esɴL2̨pLjЎόϡYجfƁ}s*lL}N x=rG mC q=~O{Ǽiʮ~俄ň͎ΎˍׯrM޳pӫk~S~Vj@uBmzį0TZҮwΩoϩoٳxšij2f<c:uPಛqİs vGjzmdY{IjF lhC1???( @/& J+S.K2T3\3V?[;_?f3b;k>w>\EUU^IcDiAbCkD uEzBvH}KrF uJ }N zUgJjLwNuO~SsQ~VoT"tT$z[#LNOQTY]T U Z [ RVZ[\ ^akkc c i kfkecijfk k kq tjmppuzz|e'`"m&r'h7k3r;u9x>s,z)}'zi@uB}C|K~P%7:ȅֈڔƄ˅Έ˅Ռܒ ͊(͑-֜1ܜ7!֢9""!*-$75&_CLCMLCPQTZXTVSZZ[gbbijspt{ƖEʛLÛX͡V̡[פRLM@AFLWSş`àcɤdši̧h̨nجfӫkٰcݵo̧pʮ~Ԯt޳p߸t׵xٳxݹx`dlkhFJZgi}twį®İɴǼ㿄ԪƂňˀLj͍ωڂӍ݊ܐޔ;<< }}}}mo{}}}|{m=Mow{Ҹ||{wn/FMmoyҋ|wwnm07DMmnҶ|wwnbM78KMbӌwwnbKE7-6EMsӳ~wvnbK:5**5:Kӈ~~|xwvnbK8+.8Gbָ~~~~zwnbME7**7DT֍~~~~~zyynbKD." .Q~~~~~zyytmMJ?_W 4jmuy~~~~~yytrbMIkZhipu~~~zutpTLA ]lS~yuqTRIC %B`jy~ytqSP@Y (X>Sy~ytcRI>Y (y~usTP?43!ԋytcRN>3 틎yusRO?41\!Ј~ysTO?92fgZd״qTPH92,$\  )TO?92,')^UJ?91[[Va?`C-g)毿_͔^\gœ$&eڪ٘žɼ[#g???(    U@wz0Ë֘oH4~A4}VGć)SS<{#l8 \P}X\\\LېrG-=i=]z ZefgZIۊrY\E {GXvinoYׅ mSwEqm>Rz ާMT8 h]}SB% `7[8ь' ωx|+TK8*$]: D'4#&"o?[Y?* `@Q0?&'#֎we =cd^Aկn=%$Łk[ i(jvbC[ͪmԆt3·p] R FqU$kC9y?̆jl\ O[XT[HƢhҎ֧\Ї=@YsG q>z?Ӵtҫq㼀ͦiš^qH h4Űbd0YSuLP[:'?(  #?*8*G-B% H4]: [:`7l=i=`?\EU@]A[HwE{FsG qH }VbC}RqU$?ORR [ S\XX\ ] Y[][\oe holmq{vxkpwi(h3z0q>x>|+z r}z  kCuL'=0?8=ćËۊׅ ې·ωŁь֎#'") $#&4?38<&%=TYFDK@YQTX[dccjvš^ާM֧\ILZSTXYšhͦiͪmկnzҪqiSZ\\jefgnotŰӴ㼀̆ЇԆҎ;WM,Lnwi_3"A[`P2 +BaN@$#4cbXO1! ?ved^YC.) (JUljog\S5> ~FsfqrmZQ/IHthxrkV8-Gzyp]T6 9uR7&}D=0%*{K'<:|E ?launchy-2.5/plugins/loader/loader_full.ico0000644000175000017500000061273611043143017017773 0ustar monesmones000F 0v00hV  (00 ^!*h0(66``^>PPgHHT:@@(Bv00% F hv(0`@ B)@J($IT %D  I* @P@ HA P@@DB P H!P(("@PWP @Z Vv UXD,*  $XI@*P?????( @@ @$U@TD$PHP@H$ ( Ha yJ@jB)???( @@ "D( -  ?(0`ww~~p|p~pnn~nngnlpf쎎~~~nnnfhnxllvl~n`ll掇~llgfnw~nfllf~xnnf`vFflxnllf@Ffx~~nfdgFFllvvfFFFFf~~~|fddFFF||~lfvF$dln~~~glf~xddf~|lnvwp`Fxnnx~vlnf~~~pdglvngwdwxnvfg~~p'lflhhwpFvfg~fvhGxlngg~xv&~Ύ~fffwxG|莎vffFwFx莈~vfdwxd~fdfg~xv~~lffeg|`~vtfwfdphx|ffF~Tdg舏llfddwg`fgfFFf~xph興llfegwhlgfFFGfxlftddfGh|thdgwFFw|xFGxgddhxww?????( @v~g~nxwng~`l掌~nlnΌl`ll~lfhf掎llLlfpfnxΌfld`tll莎nf@FFwlf|hdfn~~lggBG|~g|Fh~|lhw|gff|Fvl~vhxdh~fgwv~|lgpfffGx~|fvǀxffvwdh舏vFghfvFgxvd|~臎GFg舆fGpxFhx???(0 ~n쎌f`lfnplΎ|l`fffgFFdhg|FvvGf~wgflhgh|fh~H~ghvgfxv@ffdwxFV膆tgfvp?( ~vn`lxgf~fpg~pvfw~Όlh莎nf~xtgd|gvp?(0` K+R.L0W4Z>g<^BlBxH|RfFsK{UwY)b,}b3LOUY]\a c `egejnnq przs t xy krxc(d"p)h6k5p>s<v'y7tw{|{ | }nDwDzYW,*.=;8‚̓ωÁ̂ ӄӋٌ҅ چ ׈ ܉ Аڒ֘ߖ ՜ ʄԌܑ՟ۑ   Ɉ#Տ%Ȑ)ږ&Ɠ?ә<!ޢ5!!!! "(+"&$(1;<2>17;<&0IPWJJ@UTUTS[[^bhqudohfstwy{umr|x˘DҜGÛXٮFԣL΢Yէ[DCJIBNNZSQ[[QR[cɥhԭkܳiťsԭrٴvgguU[\bckkktt{͵дƴ㿂ξĄ̊։֑ȳɓvssssr]GEwˀsssssroYEjlvsssoolkWU`jkɛtsokkaV@KUaakookkaVOID6OV`ezokbaVOJ#C#6JVXnmb`VOJ#!F#6JPxkb`VN766:[mfcV:76(6MӘgecRN7#336Տ~~xxfdcRN5{{qqqgfdcR:5,1%~{{qqxgfdcR96 %%Ԟq{qqigddTQ9% 1 %~qiiiid\TM%%. (*~~{iiiiidd\QM'  Æ[h}~~~~}iiid^QM;$)F  2*LQ\di}~~}ih\\TZZ'$(Fê+ -BL[\}}~~}h\^[Z*& Cê H&L[ih^Q;Z&$ Fê Ʀ(&߈~h^[;** (ê )h|~h^Z;*& í.3)B\hx~\MB&((׮.ר(@w^[;B&(׮.- ghZ;')׮.h^[Z;)( +׶>hZB;(( ׽぀^[;)( 㟟hZ;)( =~h^Z;*(( 10<<{~h^Z;;)( . >0M;;(( ;')( =0*&( = ( 112(  1 2, . 1Cڤ.  =?ץ+ /=۪ݨ =פ  ۽??????( @L,S.V5c:k>p>j@lB uDzDvH}KrG uJ }N {R iK{SwW&iFLNOQTT U Z [ SVY\\ X_^d idcjfk k ehloq rt x lqpuzz|`"m&r'g6k3r;u9z;t,z)}'{7uw|{ ~ uB}CtHzM}L%7:˂ǃʃՄՌӃ ی ˒ڑޝƄ˅Έ˅ՌȘܒ   ď%͊(͑-ٜ4!ܠ;""!*-"$.14>923=&BNICLLPUT[TV[[YaldaexxutƖEʛLÛXӨB̡YפRLM@AFLSP[\QZş`ȥjիh۲iĥzԮtܶu`dlkdmFJU\cdjjnli}rptx}wŰҴȴ忄Ń̈؊ݓƨʵ믧ċgazʠ}y_`kyʀ}yk\D;X`r˙}lj\XE9IX`~lj\I3H.3Xޝnj\K3..3eÞni]J0$#$0ފomi[I.! !*L۟om^M3( Q  (;矉qi]L1(8wqifc36&E= UYhsxtf]Y9,A TYtʉxpfN;2,CW:Țxfe;:,'=FUrufe:2&ḚE":rufN9,&>̵̥vhe<6,ᗗuN9,&hc;6&#Bٔte;6+"SS@]<6+"BR;6+" <*+" AAG&F' SEդD BѤDA@???(0@Y= a9i<qB{KvK {M }TaCkKuLuMrU{a7MNR\ RW[\ P_`a dh dbcdgj lgks pu x fjnss{twyyw~|\&h c)k)e&a0n:v#w,z-6y=tx|~z kHtBtS|U/:9>ˀ׋׏׈Ѐ ًׄܓ˅Lj̈€˅˄ΈЉ؏ݐ۔ڑ   ٢ = ܡ3(!"!%.2:=8&(DEOHKGLVTRT\\\bbdeciir~syʙOÚTYœZΠF۰MܪXMNDFBFLTWVQX`˦eϫlڲ`˨rϰ۳sfhhcist}WUX]]^acddejohkl{qpqpԷ²ʷԼ⾆ѿÆňɆʊ؁Ҍۉے˵ԺxxrNsyugZWzҎtgR/(PcҿvgRD.,%F׉jSD$$^ߑ~|ljUD G޸}}leT'=6~~}pmVG#[o~qmbY)"A JLYd`X&>H5{nY2"@J -a\-M No_3+8 эd\-䓍n^0*:^3+ 0"4*9=?;7IǰB ťn |+z rz  jExL~S'=0?8=ۊׅ ې·ωŁь֎ɒ̞*ʢ?#'") $#&4?38<&%=FD@FPYQTX[clhjtš^ާM֧\ILZSTXYͦiͪmկniSZ\jefnotֵպĵ㼀Ͽ̆ЇԆҎænQPe'*1:SJVJA8#ifc-ZJYYT?60kgi/[T_YS;.lp)}a_VB9 o|\7 bpjs1d!{q+?(        !"#$$%%%&&&&&&&%%%$##"!    !#%&()*+,-.//001112222211100/..-,+*('%$"!  !#%'*+-/ <(V1$q5' 8( N; dN cN cN cN cM J8 7( 5& /"r%[ D<<<<;;;::99887654310.,+(&$"  !$'*,.1# K:-zYHs˪Οݪ̝{ |d H7 0#~SCCCBBAA@@?>=<;:986420-+(%"  !%(,/3 A;/ymY%-Ԫ/;JA+ u UA -!{ MHGGFFFEDDCBA@?=<:8631.*'#  "',03:0# qt])ϧ0BLU\WSV\M3"٥ `J )vKJJJIIIHHGFEDCB@?=;852.)%   !'-26#[S? { פ &Y\VPMMNNNNQ]Q7 ўu I8 cKKKKKJJJIIHGFEDC@>;840*$  #*16.!ra œܮGTNNNNNNNNNNNP]L,oV 'uLLLLLKKKKJJIIGFEC@=94.'   "+3/"tj ϙ'[OOOOOOOOOOOOOOWT:&Ǔ}` (wMMMMLLLLLKKJJIGFD@<6/& & '(Ye ̖ݧ*^PPPPPPPPPPPPPPPR]T:# ÑuX fMMMMMMMLLLKKJIHEB<5," C/D0$ 4ZD ݨ,^PPQQQQQQQQQQQQQQQS^R0ޜO; VMMMMMMMMLLLKJHD@80% bDbD2" J6 ut זޙݦ-_QQQQQQQRRRRRRRRRRRRTa+ ݘєl -!MMMMMMMLLLKJHD@80% }V}U[?$`Čٔܗޚ ݧ-_RRRRRRRRRRRRRRRRRRRRXJ ## ݙږדeK  ]MMLLLKKJIHEB<5," dvTas Ѝ֐ٓܕޗ ݦ-`SSSSSSSSTTTTTTTTTTTTT]>3F]UL1ݖڕבԎ͋i %rLKKJJIGFD@<6/& i_}ωҌ֏ّܓޖ ݦ/aTTTTTTTTTTTTTTTTTTTTT[T`\UUYb߮JݕڒאԎъ͈yI6 IIGFEC@=94.' m_ˆϋҍ֏ْܕޗڧ8`UVVVVVVVVVVVVVVVVVVVVVVVVVVVVa/ ݖڔאԎь͈ʅ~]E  NC@>;840*$ k!c €ȃˆωҋ֏ّܓޖ1XXVVVVWWWWWWWWWWWWWWWWWWWWWWWWW\Kݕڒאԍъ͈ʅƁ~xW O852.)%  i$h |ȃ˅ψҋ֎ّܔޖ ާ4Z\WWWXXXXXXYYYYYYYYYYYYYYYYYYYXXX^- ݕڒ׏ԍщ͆ʄƁ}{_ H*'# g&i xz~ȁ˃χҊ֌ِܒޕ)٩GaZXXXXXXYYYYYYYYYZZZZZZZZZYYYYYYYYc<ݓڑ׎ԋш͆ʂƀ|yw` = e$g svz|˃υ҉֋ٍܐޓܡ-[`YZZZZZZZZZZ[[[[[[[[[[[[[[[[[[[[ZZZ`Iݒڏ׌Ԋӵ́ʁ~{xtra 0   c$d osvy|˂υ҈֋َܐޓ1ݰY^ZZZZ[[[[[[[[[[[[\\\\\\\\\\\\\[[[[[[aMݑڏ׌ԉч̓ʁ~zxuqn^ 2"&8#:%,  `a losuy|~˂υ҈֋ٍܑޓן3\`[[[\\\\]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`R# ݒڏ׌ԉц̓ʀ}{wtqmk[ dAU5H-<&^[٭ikorux{ˁτ҇֊ٍܐߖ כ,g_]]]]]]^^^^^^^^^^_________________^^^^^c5 ݑڎ׌Ԉц͂ʀ}ywspmih{XnG{Xfgknqtw{}ˀσ҆֊ٌ܏֦Kb]]^^^^^^^___________``````````_________b_4 ݐڎ׋Ԉх͂~|yusolifd|V W|acfikorvx|~ς҅ևيݏ ݞ.߱^_____````````````aaaaaaaaaaaaaaaaaaa`````ce5 ݏڋ׉Ԇф̀}zwtpmjgea_{UfV 3^^behlnrux{~ρ҅ևٌޗΛBh```aaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbda0 ݎڌ׈Ԇу̀|zvtpmjfd`]] Y!WY [_bdhkoqux{~ρ҄ֈۓӜ>iaaaaaabbbbbbccccccccccccccccccccccccccccccbbfY! ݎڋ׉ԅу}yvsplifc`\ZW֍WW ZZ^adgknqtx{~ρ҅ؐИ8fbbcccccccccddddddddeeeeeeeeeeeeeeeeeeddddddddcb+ ݎڋ׈Ԇт̀|zusomifb`\YY~V~S BWVZ\_beilorvy|πՉΔ6fdcddddddeeeeeeeeeffffffffffffffffffffffffeeehmog& ݌ډ׆ԃр}{wtqnjgca^[XUWS 'S V SVY\_bfilosuy|у ͏-ݮceddddeeeeeffffffffffggggggggggggggghmqqqqqpprWFߣ3* ݌ډ׆ԃр}zwtqnkgd`^ZXTR}U{T{RRUX[^adgjoquw{ӈѠSheffffffffggggghhhhhhhhhhhhhhhhhhhhhpުI85544441* ݊ڈׅԃ|yvspmifc_]YVTPRyRfPTNRTX[^adgknqtx{ҋ"֧\fggggghhhhhhhhiiiiiijjjjjjjjjjjjkprt^2 ݋ڈׅԂ|yvsomifb`\ZUSPMS P~S LMQSWZ^`dfjmptvzӋ$ѠUjgghhhhiiiiiiiijjjjjjjkkkkkkkkkn_NB7, ݊ ڇׄԁ~{xurokheb_\XUROLMzRzzO "OJMOSVY\_bfilorv{ Ҏ-ר`jiiiiijjjjjkkkkkkkklllllllllllltF* ݉ چ ׄԀ~zwtqnjgda][WTQNLHP MxSGILORUX[^behkoru| ʒ@rijjjjjjkkkkklllllllllmmmmmmmmmmsL ݉ چ ׂ |yvspmjfc`]YVSPMKHHxQ }{KMEIKNQTW[]adhknqu{ Ȋ/okkkklllllllmmmmmnnnnnnnnnnnnooqm8 ݈ څ ւ  |yvspljfb_\YVRPLJGD|O {K xP }DEHJNPTWZ]`dhjnqtx ͆ɗKrllllmmmmmmmnnnnnooooooooooooqi<" ݇ ؄ Ԃ  |xvsolieb_[YUROLIG}C~FuOhwIyM yA}EGJMPSVY\_bfjmptv| ΋&ǔErmmmnnnnooooooppppppqqqqqqqqwA# މ ڇ ք с ~ { xurnkhda^[XTQNKHF{CxAyO tK `zDx@|DFILORUX[^aehloruy ˀʏ5snnnnoooopppppppqqqqqqrrsvyiM+ ݈ ؅ ԃ Ѐ } z w tqmjgc`]ZVTPMJG}EzBv?zGsK 9xP t>w@zC~FHLNRTX[^aehkoru x } ˎ1poppppppqqqrrrsssrrrssu]\V>6& ދ ۉ ׆ Ӄ  } z w tpmjfc`\YVSPMJG|DyBu?s=vRqJ tGq=t@wB|EGKNQTWZ]adhjnpt w { ˍ.جfppqqqqrrsssstttttttuzL8+%ߌ ۉ ׆ ӄ ρ ~ { x u r olifb_\YVRPLI}FzCvAr>o<sH rF rNro=p=s?vBzE~GJMPTWZ]`dgjmp s v z ͋'Ѥ\qqrssssstuuuuvvvvvxwM/݌ى ֆ ҃ ΁ } { x u r olhfb^[YUROLI|FyCt@q>n;r@rK RuN j9n<p>tAxC|FILORVX\_bfilp r u x ʆΟVvssttuvvvvwwxxxxy}jA+ݍڊֈ҅ ς  } y w s q n jhda^ZWTQMJ~HzEvBr?o=l;i8uQmDnEi8l<o=sAvCzE~IKORUX[^beilo s w|ȄÍ5۰kwuvvvwxxxxyyzzzV;"ߏی؊Ԉх ͂  | y v s q mjgd`]YWTPMJ|GxDtBq?n<k:h8pH |VmH Vk=g8k;n=q@uCxE|HKNRTW[^adhlt&/3Ɛ9ȚQɕ?ݱixwxy~|zzz}}ey҂N3ݎٌ֊҇΄ʁ ~ { y u s p mifc`\YVSPM~JzGwDsAp?l<j;k> yO\>sQc5f8i:l<o?sBwD{HJNQTWZ]adgo.ƛU٭cۮcת_ѥ\ӕ0Ε:}{{ܬ\ޤGỲсЂb@AHU1ޏۍ׊ԈІ̃ȁ~ { x u r o l hfb_\YVSPM}IyFuCq@n>j;j<~V!]ipJ a4d7g9k<m>rAuDyG}JMPSVY\`dj~,—Rت\٫_ҧ^ٮe˝Oό ӏ Қ<بY߱eؤP)/CR?1  "ސێ،Ԋчͅɂ| y w t q n k gdb^\[ `e!f%` QxGsBo@l=i;h;~X%j}IǷ hAjB`4c6f8i;l>p@tCwF{ILPRVX\`e w"Lת`ժcGő;Č0Ȋ$̆Ј֏ݗ$(! ߑܐَ֋҉Ά˄ǂ| y v t p m j fda^bp+FPU[m2UxI qCk<g:f9xR"[{HƵjF Af<^3a6d8g;j=n@rCvFyH}LORUX\_i8Ӫfˢ]<#}Łʄχԋ؎ݑߑ܏َ֍Ҋψ̆ȄŁ~{x v r o l i fc`a q*ZŜY—QPSXxCwB|Sk>f:c7oH}NOʶ0iE o^4]3`5c8f:i=m?qBtEwH{KNQTX\`qR֬eB~wy }ŀʄχӋَޒߑܐڎ׍Ԍъ·ʄƂ€}zw u r o l i f ba kIƜYØQQQQSYch2nD e9a6jCsFSǻZqPX0\2^4b7d9h<l?oAsDwGzJMQUW[a {.ƞ[Τ`F|vy }āʄψԌڏݒݐڏ׍ՌъΈˆȄā|yv s p n k h d c i{7]řRØRRQQQQUM}X'j@ d;lEpCY`oL W/Z2\4`6b8f;i>m@qCtGxI|MPSX] k=ѩdҧ^ͥc/zy |ÁɄΈӋ׏ݓޑܐڏ׍ԋъΈˇȅă}{xu r p m i g e l}8\ƜUęS—RRRRRRQ[|Jc4i9b8|NbSjF V/Y2\3_6b8e;h>l@pCsFwI|MPT_r)?Ü\ԧZרXܰcH}z ~łʅϊԎّݔ ߒݑڐ؎Ռҋω͈ʆƅÂ}{xu r o l i g k:ğaȝVśTĚS˜SSSSRRRRXTh}N[_yEDZdA U.X1Z2]5`7c:g=j?nBrEvIzLPYs0]Ѩdӧ\էY٪Y۱i?|z ~ĂʆωӍّޕ !!!!!! ޒܐڏ؎ՌҊЉ͈ˆDŽă~|yvt q n k h f u&VȞWƜUśUÙU˜UTTTTSSSSTTVR\zGȲ fD b>S.V0Y2\5_7b9f<i?mBrFuI{LT l)TΤ^ФXԦYשZ۰eŜU)x{ ~ĂʆϋՏړߖ!6>=/ !!!""!!!!!! ޒڏ؍ՌӋЉΈˆȄŃ‚~{xvs p m j g f x.ǢfȞVƜVśVÚUUUUTTTTTTSSSS[{KɳfD "`;R.U/X1[4^6`9d<h>lApEuH|Oc"H̤b΢XѤYժ`ԭjM.vw z~ĂɇϊԎے?p؃چW% !!"""#""###""!! َՋҋЉΈˆȄƃÂ|zwtr o l i f e z0`ǞWŝWěWšVVVVVVUUUUTTTTZ}MξeD .]9Q-T/V1Z4\6_8c;g=kAoDuI[}Aɣe̡XϤYөaY:{$ss w {ĄˉӒٗܖIۍۋގV& !!"""###$$####"!! ޓԍЉ͇ʆȅƄÂ}{yvtq n l i f e x0^ǞXŝWĜWšWWWWVVVVUUUUUUZ}O eC 5\8P,S.V0Y3[5^7c;g=k@qF}Ut8ždʠZ͢ZХZϩig{ׄޥ@ !##$$$$$%%%&%$$#"!! ݑ؎Ԍˆǃā€~}{zxvtro l j g d iAȤdǞZŝZĜY›YYXXXXXXWWWWWVZP˸.dC ^V Y]b g k p u zǏ)oބeޝ)ܔ!!##$%&&''((((((''&&%%$#""!ޔِ֍ъ·ʄł~|zwuqnmlji g e b _ `u1ĤkƢbšbàbŸbaaa```````____iX͹mMF'I)L,O/R0X6yZ*`^ş`ȢaͦeĢhy9]Y]b f k p u zʕ3n߆bݛ'ݓ !"##%%&&'(()(((((''&&%$#"! ۑ׏ԌΈˆǃĀ}{xvtqmkjhg f c a _ ^ o*fƣeġcàcŸcbbbbbaaaaa````_qaA uH)H)K,O.R1W6xY*a_ƠaɣbͦcѪgaj#Z]b f k p u |ϝ>vVܘ"ޔ "#$%&&''(((()((''&&%$$#"!!ݔّ֎ыΈʅŁ|ywtrpmihgf d b ` ^ \ by:kĢdàdddccccbbbbbbbbbTɽ`aB EQ1G)J+N.Q0V5xX*bÞaơbʤcΧdҫfǥit1Z ]b f k p yŽ+۫T؅݉Rۖޔ !"#$%&''((((((((('&&%%#""! ܒ؏Ԍω̇ǃā}{xvsqolige d c a _ ] Z Y n-_ĢeáeeeddddddcccccbgxK1aB Y8G(J+M-P0V5vX)bßbǢcʥdϨfӫgΫoEu/v+u&u {",ŗAܯ]ى\ߛ(ߓ !"#$%&'''(((((('''&%$$##! ߕڐՍъ͇Ʉł~|yvtrnmjhed b a ` ] [ Y V aNĤk¡feeeeeeddddcccclm; cC F(I*L,O0T4tV'_ğcȣd˥fЩgԭiزoͩnɤcԮmΨdʣ\Ӭd޵jvۉ܀ׁD !##%%'''((((((((''&%%$#"!!ܓؐҌϊˇƃ€~|xvsqnljgdb a ` _ ] Z X U Wn0]âhgffffeeeeeeeedfsBlLE(I*K,N/S2pR$[ĠcȣȩfЪhծjٱk޵opqw}}}}ނc2 ""#$&&''((((((('&&%%$##"! ޕڑՎы͈Ʉł|yvtqoljhfd a ` ^ ] [ Y W }TzS`NämhggggggffffffeV~kaB ]K-H)K,N/R2lO"YšeɤfΨgҫi֮kڲm߶oqruwy|~ہ߃_. !"#%%'&'(((((''''&&%$#"!! ܓؐӌϊˆǃ}zwuromkigdb ` ^ ] \ [ X V |TxQ^Q£lhhhhhgggggfffjzOLaB X:G)J,M.Q1jL WŢfɤgΩhҫj֯k۳n߷ortvx{}݃V0! !#$$&&('(((('(''&%%$##"! ߔۑ֎ӹȄł~{yusqnljgec a _ \ [ Z Y W }U zSxQc$X¢kiiiihhhhhhhhgoq?ȹdE F(I,L-P1iLXŢfʥhͩjҭkְmܴopsuwz|قބmQ8 !"#$%&&'('(('''&%%$##"! ܒِӍΉ˅Ƃ}zwtromjhfda _ ^ \ [ Y X V |UyRwQ f'i¢jjjiiiiiiihhhhk|L̸gH|G*I,L-O0eGYǣh˦iΩjӭlװnܵprtvx{~Ԁڃ߅s8"#%%&&'''(''&'&%$$##"! ߔڐՍъ̇Ȅā~{xuromkigdb` _ \ Z X X W ~U {SxQuO_!Xmkkkkjjjjjiiii\ʾouaB &U7H+L-O0]>q@Ƨs˧jϫkҮmײoݶqsuxz|ցۄ^- "#$%%%&&%''&%%$$#"!! ޓُԋωʅƃ|yvsqnljgeba^ ] [ Y X V U }TzSwPtNxUxBmlkkkkkjjjjjjlU"eF G*K,N/X9 e9i˧kΪlӮnײpݵqsvy{}р׃܆b1  "##$$$%%$$$$#$$#"!ޔُՍЉ̆ǂ}yvtqnligeca^ ] [ Y W V T ~T {SxQuOrMsO j/vmlllllllkkkkr\н iJiL.J,P2eItEmʨkΫmӯoسqݶsuwy|ҁ؄݇b2 !"###$$#$##""! ے׎Ӌ͇ʄŁ~{xuspmkhfdb` ] \ Z X V V S }RzRxQtOqMpL|[N\qmmmlllllkkhêiȸ[= \> I+T7 uEtǥlʨlϫnӯoسrݷtvx{}Ӂ؅܈`/" ""#$####""!! ޓِӌΈʅƂ{yvsqnkhfdb` ^ \ Z X W U T ~R{QxPyT _`!yXsSvWl7ommmmmllmlpTgHI,S6 h8¥tǥkʨlϬnӯpشsݷtvx{~πӃ؆܈sP-! """"#""!! ! ߔڏՌщˆǃ|ywtqnligeb` ^ \ Z X W U S S |QzPzS f(PSMn6}^&y]'UpnmmnscWqkȴfG$X9N1lQ%_ǧnʨnϬoӯqشsݷtwz|~΀ԅ؇݊k;$!!!"!!!! ې֍Ҋ̅ȃĀ}ywtqoligeca ^ \ [ Y W U T R ~Q{OzQ a"FZPU]X{^(g2gqnr]g;mT,kS-uJj8­ `jKK.X;l<ħvʨnάpӯrشtܷvxz|΂ԅ؇܊|I*4GK?+!ݑَӊ·ȃĀ}{xuroljgeca` ] Z Y W V T S P}OyN~Ww>^PPPP\z]'hKb/btRoV,W;M1K0O5 y](uKmN-X9O2nR%aʪpϬpӰrشtݸwy{}΂ӄ؈܊ozR#ݑ؎Ӌ·ʄŁ~zxurpmkhfca_ ] [ Y X V T R QP{NyMa#SSQQQULoQ^?bE{^,ew\,V: L/I.F+Y<x]-kLM/[?o=ɫyάpҰs״uܷvy{~Ȁ͂҅؈܊F ݐ؎ԋχ˄Ɓ}{xvspnkhfda_ ] [ Y W V T S QP}NzMxN i.[RRRQ_k5eF \=Z;]@ iLZ>O3K/H,H,kMoP&\=S5w[,kͬqҰsֳuڷvy{~Ȁ΂҆։ۋߎb+-72#ݑ،Ӊφ˃ƀ}{xuspmkhfdb_] [ Y X V T R QO~N|LxKzO m3aSSSSZd0aBZ;X:V8S6P3M1J/G,\> _CoPQ4cFRίzѰtֳv۸w߻y{}Ȁ̓цֈڋގf/,NmNݔ#҈υʂǀ}zwuromkifca_ ] [ Y X U T R QO~M}LyKvJxO tغ~ĂDžˇ͉ыԎؐےߕۣPӚEֈuː:qk i h f e c b ` ^ ] [ Y X V U SRPO~N|L{KyJvHtGsErE~UcXNg[n:k6j______^gL7˺yZ0jJ z\ \߾俀ÂƄȆ̈ΊҌ֏ّۓߕ֎ŋ7p}$أTߓӝLqi g f d b a ` ^ ] \ Z X W U TRQON}L|KzJxHvHtFrEqDsG Z#v@WsSb-vPe/ka`````hPBν{[=oOm1ͮwᾁÃDžɇ̉ϋӍ֏ّܓߕۗΘHodf z%ox,g d c c a ` ` bdb]X V T SRPOM}L{KyJwIvGtFsFqDrFY }JgryDY$nE nD c,lbbbbahUGп}^ [vWy=Ӳ|忂ĄDžɈ̊ύҎ֐ؒ۔ޖьקay*b `akКGytjפU6ib b a ` _ dw,=HJq*ZTRQPO~L|K{JyIwHuGtFrEpCoCsIp:ĥwlp>yRlAkAsKd/mcccbiXIc'8z[}AظŅȇʉ͊όҎՐؓڔݖȅAg\^a 0~zΜUܫbɂѠU}/e^ ] \ \ a|5֪g|vy—UaQPNM}L|KzIxHwGuGsErDqCoBmAqH xDkk6tNh?j@zT{Jj6keedkWHv<*~`&㨅J޽„ņȇʉ̋ύҏԏגٔەߚÃCi_ \d1ϝQvڬacW`E~kigm^e&M}KzJyIxI{N^#n4o6zOpCmAl@j?j?i>i>kB sM_+}MvDmr@n>dhlT8WlKӰyˆćLjɉ̋͌ύяӐՑٖؓݞ͎vwݲpجjtє|ޛܖەڕٖÆ|7Xl'իkplkijɡd}A^~N yHxH|Oi-UǤm lc(pDl@k?j>h=i>qI^*wGgmr~MoBXod{¥εzDss:빓Z㿉Æƈȉʊ̌΍ώяҐԑ֒דؓٔۘۚڗڕٖڗؔ֓֓Ւԑ՘T^q-۴unlkj߲iݳpӮtPd(yL uGa$kͬv̧jɨtf,nDj?h>h>g=mFi6iojk[sB`u\Ƿm jĬ(i1ܭM޻ÇňljȊʋˌ͍ώЏѐҐґԑՑՒ֒ՑՑԑԑԑҐАϏєŝ_]p3ȡesnm߲lݰjۮjحi֮rSTrExLc)Jrm\%k@h=g=f<g>|Y&Zlkkio:PrU@ѿfjHض†ćƈljȊʋˌ͎̍ΏϏϏАѐѐѐѐЏϏΎΎ͍͏⾅w6\@޹~rp޳nݱm۰mخk׬jԬl^UpCoBqF yQ^&Y!oF h=f<f<g>vQuAqllkozcz̻ð8Iɨt†ćƈljȌʍʌʌˍ͔̍̍̎̎̎̍̍̍̏㿇ͧlC_p3ǡgvs޳rܲp۱pدo֮mխmͫtu=vKmAl@k?j?j@i?g=e<e<f>tOr@qmmmrfZA ͮ| ówY̪uˆӭuɤlǎNJNJȋȋȋȋȌʑȒݸΪsUy=h,a#r7[߹~ߵuݴtܳsڱqذpׯpԬnҮwI~UmAk?j>i=g<g<f;e;e;h?wR sBqnmriRêiоš{C趒[޼ÍWLǔÉŋƌǏǑݺЭvdLOaV{Cw:Mʥm޶wݵv۳uٲtرt֯rԮrүxS\%mCi>h=g=f<f<e;d:c:d;tO|LtpugRƷ|оǣҾs~G㿞kh,a%OšhžhifUQ\ßfOʦn㽂ݹѭvص߻޷{ݶy۴xڳwٲvױvկuԯuЯ{N\%oCi>h=g<f;e;d:c:c:b9d<d0ijW~LʼvμɩwǪ PVyYtNzP]#wa/zTpGh>e;d:c:b9a9a8`7a;fBmLxW[e1 tCŭƱ1ɻ}OKX_`ɨuطٷٶض״~׳|ղ{ղ{ԱzӰyѱ~b^]]]~IlC d9b8a8b:f@jG nNlI cnLcʹȬ >}zn9q;דr9}FS[^`hoppohe\ZWyEpLjG lJ nNkH ikH )ԼҸ`*WNµusBq>s?uBuBtAq>q>tCöõqh2H_'kjea__?????????(`      !!""######""!    "$')*, 4 9 : ; 92334343332100.-,*('$"   "&). >' XA2 }XC ~b rФxߴ軋꺋뺋뷈ysӁd ]G@0'h PB?>>==<;:87531.,)&"  $).4( ^[Ks"ʶ*Σ8ݱ<(œnZF%uIFEEEDCBA?><:741-($  !(.5[^I &ҫ;73-(   '/@?/kИMSONMMNNOUP/םsG5 [LKKKJJIHGFDB>:5.&  (:C3yߠ/VNNNNNNNNNOV@! O< YLLLLLKKJIHFD@91&'( &9*szߟ;SPPPPPPPPPPPUV@F4SLLLLLLLKJIFA9.! R:J3 $@}[ ̐:5.& f bvɄ͈ы֏ڒޖ%TWVVVVVVVVWWWWWWWWWVVVV\; ݕْՏы̇ȃyQ: ?73-(  f ov~Ƀ͆ъ֎ڒޕ0UZWWWXXXXYXYYYYYYYYXYYXXXVݕّՎъ̅Ȃ~xaE /$ je krx}ɀͅш֌ڏޓޫF]ZYYYYYYYZZZZZZZZZZZZZZYYY]*ݓُՌш̄Ȁ|xrdG  b ilsw{ɀ̓ш֋ڏޒܩH_ZZZZZZ[[[[[[[[[[[[[[[[[[[[`0ݒَՋч̃{wsn_C $.&] ginsw{̓ч֋ڏޓ ݬO`[[\\\]]]]]]]]]]]]]]]]]]]]]]b;ݒَՊц̂~{vrniwQ \:L/Z Dcinrvz~͂ц֊ڎߖۧG`]]]]^^^^^^^______________^^^_X, ݑٍՊц̂~zvqmhezR X[!^٫chkptx|̀фֈڌޚ"\^^^__```````````aaaaaaa```````b]* ݏًՇф|xsokgc^V 9YZ ^bfkosw{̀фֈܒՠDd``aaaaabbbbbbbbbbbbbbbbbbbbbbbbc[% ݎًՇу{wsnjeb][ΑYW uZ^bfjosw{у׎֝u@zDGKPTX\`eimqv z ˑ8ppppqqrrrstttttv^6.'ߌ و Յ ρ } y u qmhd`[WSOK~GyCu@p<tJ rCoDqFn<r?xC}FJNSW[_dhlpt x lj*oqrssstuuuvvvwwZ.܋ׇ ҃ ̀ | x t plhc_ZVRNJ|FwBr>n;pCsH nE6m?l;p>uBzEIMQVZ^cgkp t x ȇ!שautuvvwwwxyyzsI(ݍ؊ӆ ΂ ~ { v s o kfb^YUQMHzEuAp=l;l<vPUoH uh9j:n>sAxE}IMQUY]bfku%+ǐ8ǖFݰfwwx|zzz}n{o> ߏڍՉІ˂ ~ z v r o jfa]XUPL}HxDrAn=j;k>`'n?nI c6h9l=q@uC{HLPTX\aep<ӧ^ۮcܰf̕=Д2q|gCcymG8F8ێ׋҈̈́Ȁ | y u q m id`\XVS N{HuCp?k<i;d2[๥f=iAb5f8j<o?tCyG~KOSW\`i4ѥ]ԧ\ȚN̜Lˍ'ъח-ٞ=ܝ8'6,ݏ؍Ԋφʃŀ| x t p l gd`^ fs1yoAtEyI~MQV[b 7ԫg:xx } ǂ·Ԍېݐڎ֌Ҋ͇Ʉā}y v r n j fbgEŚV—QQQU]e1i?b7pJZlH X0\3`6d9i=m@rDwH|LQUZjLϦ_I{x }Ƃ͇Ռۑݐڎ֌ҊΈʅƃ|x t p m h e i}8XęR—RQQQRO[*tNzW+ZjjgC W0Z3^5b9g<k?qDuH{LPX j<ˢ]רYժa+y ~ǃΉՎے ݑڏ׍ӋωˇDžÂ~{w s p l h i<ÜZƛTÙSSSSRRUWY}NZO˺b?U/X1\4`8e;j>oCtGyKRj$Wѧ`ԦYةZѦ^&y DŽΉՎܓ" !!! ݑڏ׍ӋЉ̇ȅă}yv r n k g r!ZǝUśUÙTTTSSSSSTTTOͻ^;dB S.W0[4_7c:h>mBsGzL_Lͣ\ѤY֩^Ѩ`;yy DŽΉ֏ݕ*SdJ  !!"""""!! ݑ֌ӋЉ͇ȅŃ{xt q m i e t(ş`ǝVěVšVUUUUTTTSSUQͺ ]: b?R-U0Y3]6a:f=lBrFUDɡ^ΣXЧ_R/uu z džЎٕޗ?܍܉g# !""#####""! ֍Љ̇ɅƄ}zvso l h e t(\ƝWĜWšWVVVVUUUUUVS\9 a>Q,T/X2\5`9f<lByPt9ş`ˡZФZş\y)k o u {„Е-߭S[%"6:. !"###$$$$##"! ڐЉʅǃā}{xuq n k g e v-^ƞYĜYšXXWWWWWVVVWS[9`=O+R.V2Z4_8f=xQyA]ȟZͣ\Ҧ]̥b0l o v ͗7jyn) !##$$%%%&%%##! ߒَӋɄÁ}{ywtpm j e eBȡ_ƞZÜZYYYYXXXWWWXT̾#Z8 _=N+Q.U1Y4^8mH|G_ŝZğa[ҩdحcŝWvp |˙@yֆq< !"#$%%%&&&&%$#"! ܑ׎ъ̇€}{ywurol h e d|9ȣcŞ\Ý[[[ZZZZYYYYYUĭ!Y8 _=L*O-S0X3a<e2`›ZÞ`|?l(GϨcѫg~)r2x߮Sڝ0ܖ !"#$$%&&&'&&%%$"! ېՌωʅĂ{ywusqn j g c d};ơcŞ]Ý\\\[[[[ZZZZZUλX7`? K*N-R0V3gEU[Ü[Wd#U `o!t pq ǒ4˓+ΏӐۓ "#$%%&&'''''&%$#! ޓُԋΈȄÁ|wusqol i e b jXǡ_ş^^^]]]\\\\[\[VU4\<J)M,Q/U3jIZ[Ğ]X_SX_ d j q w ~ȍҖ(֓ܔ !"$$%&&''('''%%$#" ܒ׎Ҋ̆ƃ{vsqomk h d a o$_ơ`ğ`ž____^^^]]]]^Y_? H(K+P/T2hGZ]ş^]g(TX^d j p w ްW~ܝ-ݔ!"#$%&'''(('''&%$#!!ߔِԌψʄā}zvromki f c _ l"^ơaĠaža```_____^^`W©eD G(K*O.S1fEWœ^Ơ_˦gIaX^d j q x č&qz3ޔ!"#$%&'((((('&&%$#"!ݓ׏ҋ͇ȃ|xuqmkig e b ^ h]ƢcĠbŸbbaaaa```__cn®_@ ^G(I*N-R1dDW_ǡḁcЫm|9[ ^d j q xȔ1vwߟ.ߔ !"$%&''(((((''%%$#! ڑՎωʅŁ~zwspligf c ` ] _{<âhġdcccbbbbbaaac]> -O/I*M-Q1dCXßaȣcͦdӭkOaa f l u&ۮW݆qߝ) !#$%&'(((((('&%%#"! ޔ؏ҋ͈Ȅ|xuqokge c b _ \ Y g"_áe edddddcccbb\y^W8W8G)L,P0bBVĠbɣdΨfխjǣfHG?@ȜIhڅ܄= !#$%&'(((((''&%$#"! ےԍωʅā}zvsomjfc a ` ] Z W ZGhffeeeedddde~R3aB F)K,O0_@RŠcʤeϩgծj۳nuxy|сׁ܁l' "#$&&'((((''&&%$"! ޔؐҌ̈Ȅ|xtqnkhe a ` ^ \ Y V{T g(bggffffeeeei}R᳝x ^? {H*J+N/\= NƢe˦fѪiׯkݴnqsvy|؀߃b& "#%&''((('''&%$#"! ےՎϊʅā}yvrolhfc ` ] \ Z X }UyQd%ehhhhggggffgYz^@ :M/I+M.Z; MƢf̧iѫjװlݵorux{~ۂb<$"#$%&'(('''&%$$#! ߔؐҌ̇ƃ{wspmjgda ^ \ Z X V {SxQm0kiiiiihhhhg`fV8 X9H+M.X: ~Mǣh̨iѬkرn޷psvy}Հ܄]% #%%&'''''&&%$#"! ےՍΉɅÀ}yuqnkheb _ ] Z X W }UyRvPg*kkjjjjiiiiiYʼ)aC H+L-T4c4ťo̩kҭmسp߸rux{ׂކQ#!#$$%&%&&%$$#"! ߔُҊ̆Ƃ~yvrokhfb` ] [ Y V U |TxQtN|ZXmkkkkjjjjlrª _@ 7P2K-T6~b5i̩lҭnٳqsvy}р؄߈S% !##$$$$##""! ۑՌΈɃ{wtplifd` ] [ Y V U ~SzRvPrMtQJlmllllkkknɺqV8\> J-kMcǦm̩mҮoٴruwz}ҁم߉M% !"#####"!! ݒ֎ЉɄÁ|yuqnjgda _ [ Y W U S|QxQ{W}\vTwWk4ommllllm^cD bL.gJdǥl̪mүpٴsux|҃نt?#!""""!! ߓ؎Ҋ̆Ł}yvrnkhda ^ \ Z W U S ~QzP~Yx=VNq:z]'Xomnm\Vl`B[=T7 rDǧq̪oүqشt߹vy|ˀ҄هߌS)&//& ۏӊ͆ǂ~zvrokheb` \ Z X U S Q|O{R s8XPQZi5{^)\p]x^2]B]BsX(j-iKuO2kO!i̪oүrشtߺwz}ˀ҄؈ތjh\!ېՌΆȃ{wsolifb` ] Z X V T R~OzN[RRPPWy[%`B tX$_w\-R6J.G,iLiL]> V: zJ˫sѯrشu޹w{~ˁф؉ތSۏՋχɂ~{wspmifc_ ] Z X V T QO|MyMc'YRRSLjL[<Z<bEV: M0I-S7hL&lNgT6wZ*åqѯs״uݹx{~ˁЅ׉܌h&)G\G"ԉφɂ~zwsplifc` ] Z X V S QO~MzLwKj/]SSV{GeF Z;V8S6N2K/I-bD W; nP cE ^AMͮvִvܹy{~ɁυԈی9"Bt2΅ȁ~zwsplifb` ] [ X V T Q O}M{KwJuJ]!SZVV~KfI_B _CT8N2J/Z<\? tU8[<pT!lճv۸y{ɂ΅ԉٌߐpyeBԎ"ǀ}yvrolifc` ] [ X U S Q O~M{LyJvIsGrI `(QYVWi8wEQmT$eJR6fHVoPaCLӳzڷx{ȁ̅ш׌ݏb·|xtrnkheb _ ] Z W U S Q O}MzKxIvHtFqEsJ p9]XWY[[Z[}b5jMlQ |^% iJsU kضz߻|~Ɓʄχԋڏkǁyvspmjgd b _ \ Z W U S Q O}M{KxIvHtFrEpDY_ZYYYYYYX{`/҄i7b(&gH ߇j3ɫtݺ|~ĂȄ͇Ҋ׎ܑb{sqnlif c a _ \ Y W U R QO|MzKxIxJ V{QuJ vLa(d[[[[ZZ[VxF|] ShJn5ˬu€ƃˆϊӍِޔт͑7rnl j g d b _ ] [ X V T QP~N|LyJwHuF~TU{GvAKl6e]]\\\]_²|] mjJ w=ۻĂȅ̈ыՎڑߕk_ߑءLsk i g e c ` ^ \ Z W U SQO~M{LyJvHtFsE]#hNcPk7g_^^^^bxмi-tUstU`ὁƄʇ͉Ҍ׏ڒߕɑ>o†1̀kvg f d b ` ^ \ Z X V TRPN}LzJxIvGsFqEtH e.QjuByS_(ia```d{Ҽo3xXi,˪r係ÃDžʈ΋ҎאےߕؒѡVmbhԞM؏ʀ7f c b ` bn w-s)^U SQPN}LzJxIvGtFqDpE]%hgk7rIlB]&jbbbe}Ҿx<}^"|q6ұxÄdžˉ΋Ҏ֑ڔݖٕҢ[k]_},ؒyդ[x˙No` ^ ] _~6٭hlݲmu0S PN~M|JyIwGuFsEqCoBnCm8ec/mD kB e1g3jddg}ԿíHr7jx=۷ąLJʉΌҎՐؓەؗɚTp#bc~0ѡYԦ];ܱjٖΟXq$\ Z p'ܰklgoAR M|KzJyJ|N|PtFpCnAl@k@pGuMnGtN[(XsEafg~ԿĮW~E\UֲzÅLJʉ͌ЎҏՑؔ֕w˝WIGÓM̝W֫hɇޘݗؖٯli \Ltjh߳nHX|KyIyK _#GT~TnAl@j>i>kAxRm;`b|MuFlgñ~.x@Ⱦ`ÆƇɊ̋΍ЎҐՑדژۚ֕חܚٗؕה֓ՒӕAaϦfnlj߲kШjN[wHXc̨oɧp^$l@i>h=i@\'^kj[zJkgȱ[Ǯɬ}yAR߻†ňljɋˌ͍ώАѐӑԑՑՑԑӑӑяϏϒHb ĝaqm߲lܰk٭i֭nIwJ uI `&T_zRh>f<f<sMTkkk|Kfs'ʸĤpK]״}Æňljɋʌ͎̍̎ΎΏΏΎΎ͎̏ƋϨmg&x9۳vq޳pܱoٯm֭lӭp{CsG mAnBrIsJj@f<e<pIuCmlmngoģȷiܹ‰‡ѫqnjȊɋɋɋɌʐÊٴ|a{>g)r6ɣhwݴt۲rٰp֮oӭp\~Ul@j>i=g<f<e;e<pJtEnmqa)ֽ̱!zRճ}ʧqEῊ‹ὅٵ˧pVNƠf\JYӮu޷yܴvڳuرt֯sӮta]%kAh=g<f<e;d:c:mF~Otmb̷4оպ̴ys9}Tl1~DV[eͩpӰxɥm޹~ܷ}޸}ܶzڴyٳxձxϬuΫvY\$lAg<f<e;d:c:b9a8jD o=Vᵡ}DZ3ͺfX {A?]!u;ģqܻ޻޹޹޸~ݸ}ܷ|۶|ڵ{ٴz׳yֱyf~NtA`,sKh?e;d:c9a9a8a9eAnL`*OXsȵñUydͩUYânͪuѯ{Բִճ~Բ}ӱ|ͬ{hgf`vNc:d;e?hD jG kH SnKĪū ʵWIq\NXܛ{F埀K줅RSQ}IyD碇XޗzH{["sPpnKLhC f@ŧxζh `^[XVTwT?????????????????(P g    !!""""!!   #%)06 =HJK E>;755443310/-+)'$!  !&* 8% WI:u^s̺ Ι۟ޡӛy}_P=+!p QBA@@?=<:8630,($   '- =9.tg!2֫?IQI-˗lH6 \HHGFFDCA?<950+$ )1 ]kP ܬ2SSPNMNSN1 ˕a1%OKKJJIHFEB?;5.$ ,%ccךONNNNNNNOTEx;-PLLLKKJIHEB<3' 0" F]ՙTPPPPPPPPPRVAߟs-!NMMMLLKJHD<0 fG_B XAߛUQQQQQQQQQQQTR̐rScMMMLLKIF>2!~X2lҐۖVRRRRSSSSSSSSV?";8! ܖ֒y7(NLKJHFA8,se V{ы֐ۓWTTTTTTTTTTTTUWXXXZ3۔אы`ENGDA<5,  qg ~̇ы֏۔ :YVVVVVVVVVVVVVVVVVVR۔אы̇Á|W O93-% mh zƀ̅ъ֎ۓA[WWXXXXYYYYYYYYYYYXX\.ۓ׎ъ̅ǁ{_@" hf ty~̃ш֌ې"U\YYYYYZZZZZZZZZZZZZZZ\Aې׌ш̃~zt^,  cb mtx}̂ч֋ې&W\[[[[\\\\\\\\\\\\\\\\\^I ې׌ч̂~ytnZP4@(,\ gmrx|́ц֋ۏݛ[]]]]]^^^^^^^_______^^^^^Y$ ۏ׋ц́}xsnh[ oE[ Jagkpvzф։܏ ۤ?a^^_____`````````````````aZ# ۍ׉х{vqkgbX XY[`ejoty~у׉ژ&\``aaaabbbbbbbbbbbbbbbbbbbbbXۍ׈фzupke`]X UVW Z_dioty~у֒ ެXcbccccccdddddddeeeeedddddddcg0 ی׈у~ytojd`ZXVT ]UY^bhmrw|шڧVedddeeeefffffffgggggggijjjii]R$ ۊ׆с|wrmhc^YTT QRSW]aflqv|Ҙ?geffffggghhhhhhhhhhhhhkK87761 ۉׅр{vqlgb]XSQR FQ MRV\aekpu} ӜGhghhhiiiiijjjjjkkkklbVH ۉׄzupkfa\WRMP̈́N|NLLPUZ_diot~ؤWjiiijjjkkkkklllllllq< ۇ ׃~ytoje_ZUPLI~N Y|M GJOTY^cins~ئZkkkllllmmmmnnnnnnnol0 ۆ ւ }xsnic^YTOKF|L|IxIzI~EINSX]bhmrx ˋ,߯dlmmmnnnnoooppppppn: ߊ م ҁ |wrmhb]XSNJEzDxK FvJ `xA|CHLQV[`fkqv~ӞMonooopppqqqqqrureE ܉ ք  { vqkfa\WRMH|Dw?vJ rDtI s>yCGLQV[`ejptz ͖Arpppqrrssssstf:2%ތ ؇ ҃ ~ z u pkf`[VQLGyCt?sCrFpFoAp=vB|FKOUZ_dins x Ȍ0urssttuvvwwxa.ۊՆ ρ } x s ojd_ZUPK}FvBq=m;sJ boG dj:n<sAyEINSX]chm t {ȉ'ثcuuvwxxy{zwN&܍׉х ˀ | w r mhc^XTOJzEsAn<i9rKX#mF f8k;p?vD}INSW\bgt>˛MСU̖>fyqez}pUiE ߏٌӈ̈́ { v q m gb]XSN}IwDq@k<nA g1쪐ljAd6i:n>tCzHLQV[alA֩]УWҤX̌#ԕ.ީSߨO)?G-"ߑڎՊφɂ~ y u p k fa]`g"i)TuDn?i;rHV@gBd:a5f9k=qBwF}KPUZb}/ϥ_ÔG#ăʄщڐۏ֍щ˅Ɓ}x t o j e`hNWWIi1sHf:j@ ~QuhC M\2_4d8i=oAuE{JOUZeMƛT}x ~Ƀщُ܏׍Ӌ·ȃ€{w r m h deBŚUQQS[c/g<e< wL{iD sX0\4a7f;l@rDxIOT\ t&ɠZΣ]-y ~Ʉъِܐ؍ӋΈɅĂ~zu q l g h9šWÙRRRQQRd4`2Q_Ƿzc?V/Z3_7d:j?pCvI~NY |8™Vԧ[ڬ^’AzɅыّ ߒܐ؎ԋЉˆƄ}xt o k g |2ŞZśTÙTSSSRSVXUQǴeB T.X2]6b9h>nCuHQ r0Ǡ\ѤX֪]Σ[$y ɆҌڒ?J) !!!!"! ߒ؍ԋЉ̆DŽ‚{wr n i hJȞWśVšUUTTTTSSSSɶ dA R.W1[5`9f=lBtIe%Y΢Yϥ^M|$uy ʈԑܕ8ڊڇ= !""####"! ׎Љ̇ȄĂ}yuq l h gHǞYĜWšWVVVUUUTTTɷb?Q,U0Y4_7e<nC] Tʡ[Ф[Wrm s {Ň֟>e623# !"##$%$$##! ېЈɄł}{wso k f hMǟZĜYXXWWWWVVVUɺa>O,S/X3]7f>a)Wǟ\ˢ_ҧ^Φb|*n t اP{t4 !"#$%%%&&%#"! ُҊǃ}zxurn j e j[ƞZĜZZZYYXXXXXVɹ`? M+Q.V2\7uQZÜZ^D[ڱiǟYr{ڮ_цmߤ9!"#$%&&&&&%$#! ݒ׎ЉɅ~{xvspl h d hRƟ]Ý\[[[ZZZZYYV©`@ K*O.U1^;xF\Ğ^CYh5/q~ңNҞ=Ҕ"ג "#$%&&'''&&$#" ېՌ·ǃyvtqnj f b p&_ş^Ý]]]\\\[[[[W\<J*N-S1`> S[Ơ`x;S X_ g m u ~ȍӔ"ْ!"$%&&'''''%%#" ߔُҋˆł~xsqomi e a z5ǣdŠ`ž___^^^]]]]Zѿ ]=H(M,R0^< S]ǡaIWW_f m u bhۖ "#$%&''((''&%#"!ܒ֍ЉɄ€{wrnljg c _ x3ƤfĠaŸaa``_____^[ͼaA cG(K,Q/\: P_ȡaƢdv4Y _f m v ‹%tgܖ "$%&''(((''&%#"!ِӋ̇Ƃ~zvqljh e a ^ o)eġcŸbbbaaa```cu~[<:J+J+P/Z: QÞ`ɣbϨeZ_^ e m x̙:ր]ܔ!#$&&'(((('&%$#! ݓ֎ЊʅÀ|wspkge c ` \ _LĢfŸddccccbbbeyY: R3I*N.Y9PĠbʤdѪfɥg|7z.|),ʜFyiߘ!#$&'((((('&%$#! ڑҌ̇Ƃ}yuqmjec a ^ Z W p0h eeeedddcc]~[\= H*M.W7}Lšd˦fҫiٲmݷswu|ԁ܁A!#%&'((((''&%#"!ޔ׏ϊɅ€|wsokhd a _ \ Y ~U[ThgfffeeeeUw$]> G)L-U5xGƢeͧgԭj۲mptw{߃:!#%&'(((''&%$#! ڑӌ̇ł~ytplieb ^ \ Z W {S|WTihhggggghX׶{]? DJ,K-S4wFǣgͨiԮlܴoruy}ف[.!#$&'''''&%$#"!ޔ׏ϊȄ{vrnjfc` ] Z X ~VyR~Z`jiiiiihhj|V7 V7J,Q2k;ȥlΪkկmݶqtx{ۄ{*"$%&&''&%$$"! ۑӋˆł|xsokhda ^ Z X V |TwQxSPlkkjjjjieƷM^? I+O1vY+jΪlհoݶruy}ԁ܆m- "#$$$$$##"!ޓ֍ψȃ~yuplhea^ [ X V TzRuOrMr:plllkkkkjĭ\> 7N0Y<WǦmΫmձp޷tw{Ճ݈t* !"####"! ِъɄ€{vrmifb_ [ Y V T |RxQ{XxVwVn7ommlllm±X:[= W:ZȦlΫnձrݷtx|΀օ݉L%!!""!! ېԋ̆Ł|wsnjfc_ \ Y V T RzP]MQ}F~`*YnnlV}T_Ⱥ/fGTP3|`1ŦqΫoձsݸvy}́ֆ݊i1jNz_/R6I.O2qV%)kMQT7l<̭uԱt۷wz~͂ԇۋ8%:8 ֊φȁ}xtplhda ] Z W T RO}MxKd([SSRjLZ;V8R5M0H-_A jMdF fIcӱuڷx{~ً̂҆Y"@}<΅ǀ|xtplhda ] Z W T R O}MzKvI] UXTUjM^A [? P4K0U8[> tU&\>h4аxٶx{ʃЇ׋ސJԎ#{wsokhda ] Z W T R O}MzKwItGrHe-XVZp?~LuFpV'V: eHcrSohJc׵y߻{ɂΆՊۏ֒*}zurnjfc ` \ Z W T Q O|MyJwHtGqEuMJ[XX\YY}PnQqW&|^%nOc-˭uݺ{Ƃ̆҉؎ߒ̋)vsplie b _ \ Y V T QO|MyJwIwJ sGqEZ bZZZZZ\{LzKc(kMَo6бx~ĂɅΉԍۑߒ{|pmjg d a ^ [ X V S P~N{LyJvG~SId,n8h1c\\\\\^ƷQe).kKw=ݼƄˇЋ֏ܓW܏܎Ɖ0mj g e b _ ] Z W U RP~M{KxIuGsEd*dV[n:e^^^^`òȷ`"5rS꺚a⾁ÃȆ͉Ҍؐܓ{uxsЛIjf d a ` ^ [ X U SQN}LzJwHtFrEtI m7_U}W![$gaa`cIJϿe(Oe(˪qńɇ͋Ҏבܔ͈7b bō:Ї|٭bqb a _ j:Fn&U RPN|KyJwHtFqDoCa*p{IuMoE \&ibbdƵp48p5Ӱxņʈ͋Ҏ֑ڔݘ٬gl^jدeאs̚P֑ܱju&_ [d˝XqmØVU N~L{JyIwHtEqCnBlA~Wl8qJlD i7tCfeeǶ L0}D״{ņɉ͋ЎԐגוݳpEz-5CēLڰmޙ~z1Y :tiiYV|KyI|M e)w>xMmAk?i>j@rKe2OZqBghɹy¤ vLcćȉˋ΍яԑדוؖЏԔژՓؔדՒٰqaǝ\nkjӪiLVwHs9ţmɦoZk?i>h>{U XjiyIdlʳIϾƧuOkW⽃ÆƉɊˌ͍ϏАҐӑԑԑӐҐЏΏذtb]qmݱlڮj֭m}CsF{Qt>VvMg=f<oGQkk^_ϼűƯ+rֳ}ćƉNJɌˌ̍̍̎̍̎̏Èѫpu7t5۳uߵrݲpڰo֭mϩni1nBl@lAlBg=e<mFuDnmmmŭ_ȱßμ[r̨q˦oӮvʼnNjnjÊ߹̧oÝcLo3~Cѫq޶vܳtٱr֯qѬr~GrG i>h=f<e;d:nFyIonjŴɱdzß {So×q7q6^eadơi]۷}ֲxӯv۶{ܶyڳwزxձyΫu}GtJh=f<e;d:b9b9|X$]c±īƱjL*f+e)߽hڸ޺߹ݸ޸}ܷ|۶{ڵzسzֱyeMomT|ZpėpėpŇcsW]H9* `H>=<;:97520,)%   &, @F9~h 1ժ@B(͘qWBeGFFECB@>;84/)"  )70$oaț$LSRNNSM1 vJ8 [KJJIHGEC?;5-#  3?/zFONNNNNNSFčfL ^LLLKKJIFC=4' 2# 0#ewMPPPPPPPPQUBčW@ULMLLLKIF>1fF$"|ZϑNQQQQQQRRRRSO ڗq-!}MMLLKJG?2 ^ U}בܕNSSSSSSSSSSSX=>N?ݖؒLj^DUKJHE@7* rh ыאܕQUUUUUUUUUUUUYXUWPݕؑҌɆ] YB>92(nj ~˅ъ׏ܔDZWWWWWXXXXXXXXXWW\,ݔؐҋ̆ŀhZ.'jix~˃ш׍ܒ(S[YYYYYYZZZZZZZZZYYYH ݒ؎҉̄yg H ddqw|ˁч׌ܐ*ZZZZ[[[[[[\\\\\\\[[[[P ݑ،҈̂}xrc:'45!$ _^ jpv{ˁц׋ܐݟ+^]\\]]]^^^^^^^^^^^^^^^Z!ݑ،҇́|wqk`jE[ dcintyф׉ݒ ߬O^^_____```````````````aX ݏ؊҅zuoid[VX3\agmrx}у׊ٛ2a``aaabbbbbbbbbbbbbbbbbbbVݎ؉҄~ysnhb]Y UWͣ[`flqw}уՕ+`bccccdddddeeeeeeeeeeeddddf& ݍ؈҃}xrmga\XU ?T zTY_djpu{Ћ addeeeffffffgggggggghccbbaO= ݋؆ҁ|vqke_ZUTӋRP"QSX^ciot{ԚBffgggghhhiiiiiiiijkk^+!!  ݊؅Ҁ{upjd_YSOR qP LQV\bgms{ ӚEihhiijjjjjkkkkkkloI. ݉ ؄ytnhc]WRMMM|L$JKPU[`flr|ڦZjjjkkklllmmmmmmmnq3 ݈ ׃}xrmga\VQKG|MxzL~EIOTZ_ekqx ͑8jllmmmmnnnoooooopM ܇ Ԃ }wrlf`ZUOJEzIyHvGwF{CHMRX]ciou֢RnnoooppppqqqssoV! ߊ ؅ р { vpjd^YSNI|Dw@vJXtI Zs?xBGLRW]bhntz ћGpppqrrsssssuP;, ۉ Ԅ  z uoic]XSMHyCs>sGqFo<uA|FKPV[agmr w ˑ7trsttuvvwwsI݌׈ Ѓ } x s nhb\WQL}FvAp=n@tJlB l@l;r@xDJOUZ`flu~nj.٬cvvxxxy{|l8ߏًӇ̂ | w r mga[UPJzEs@m<j:zU]lE De8i:o>uC|INTY_erÔFѤWԧ\ϕ5h|ZdyeAR/ۍՉυȀ { v q ke`ZVR~KvDp?j;}T!n~TjC~a5f9l=sByGMRX^iCӧ]ȘHʔ<͈Ւ#ۜ5$ -!ݏ׌шʄy u o i d_e{9Ek/zLn@g:|U#_ᮗtf@^4d8i<oAvF}KQW]v%̣^4{˄Ӌܐݐ؍Ҋ̆Ƃ}x s n h ceJØSPTRzQe9nGTa;d?\3a7g;m@tEzJPV_ ?̣],x ~ʅӋܑݐٍӋΈȄ€{v q l g f~9ÚV—RQQRvCsLuQ#UwB_: _:Y2_6d:j?qDxJP^:ɟYةZȚMzʆӍܓ ݑُԌωʆăzu p k g 9ŜXĚS˜SSSRUUSYeb>Y5W0\5b9h>oCvIU @Σ\ԧY֫`4yʇԎݕ'<, !!!!! َՌЉˆƃ}xs n i jUǝVĚUUTTTSSSWb?'W2U0Z4_8f=mCwKr4Ƞ\Х[ǞY3vy ̉֒fۇW !"####"! ؎ЉˇDށ{vq l h jUƝWÛWVVVUUUTXa>/U0S.X3^7e<oEg+[̢ZϦ`2l r zƉܨJc$(2' !"#$%$$##! ېψȄÁ~|ytp k f lXƝYÛYXXWWWVVY`>0S/Q.V2\6f?m6\Ƞ]ʣ`ժaKps#_~^ !#$$%&&&%#" ُҊƃ~|yvrn j d o"ğ`Ş[œZZZYYYXXZ_=*Q/O-T0[6{X$]ĝ\Mw5Ǡ]Ҫez!z޴iyNݚ" !"$%%&&&&%$"!ޒ֍ψȄ|yvtpl h c n#[Ş]œ\\[[[ZZZ[^=Q0M,S0\9|J[Šbg&V epnw‹)ʐ$Џړ "#%%&''''%$#! ۑԌ̇ł}wtqoj f b ~;Ǣbğ^^^]]\\\\]οU5S3L+Q/[9O\Ƣdg&T[c k t ~֡?ߦ?۔!#$%&''(''&%#! ߔ؏ъʅ€{vqnlh d a Eơağ```__^^^^`tU5X8J*P/Y7}L^ȢbM\[c k t vZݔ "$%&'((('&%$#! ܒՍΈǂ~yuolig c _ >ƣdĠbbaa```__aNW8I*N.X6{KÞ`ʣbЫjw2[c k u Ƒ.~Pݔ "$&''(((''%$#! ِҋˆĀ|wrnigd ` ] h _áddccbbbbaY*]= H)M-V6{KĠb˥dӬiPq&s z!4kUߔ!#$&'(((('&%$"!ݔՍΈǃ~ytplgd b ^ Z YKáfeedddcccY긢]> VH*L-T4wFšḑfԭiزo޷qru}ۂ-!#%&'(((''&%#" ڑьʆÀ|wrnjfa _ ] Y }U e$egfffeeeg_pX:O1J,R3rBǢeΨh֮k޵nrvz~ރt*!#%&'((''&%$"! ޔ֎͈ƃ~xtokgc _ \ Z W {S`ghhhggggfmyX:I+Q1q@ǣgΩjְm߷ptx|؁W" #$&''''&%$#" ڑыɅ€{vqlhda ] Z X ~UxQe&ljjiiihh`4\= wI+O0}^/ǥmϫlױorv{ڄT !#$%&&&%$#"!ߓ֍͇Ƃ|wrmiea^ [ X U {SvP{Xakkkjjjjlɹ Z<"P2O1|_1âkϫmײqtx|ҁ܆W!!##$$#""! ِЊɄ~ytojfc^ [ X U ~SyRtOrO ~Hhlllkkm±V8Z<U8 `ȦlϬnسruy~ӂ܇Y-!"""""! ܑӋʅÀzuplgc_ \ Y U S {Q{Ur5l2{\"zGnmmlhfĮ+cDCQ3m>ȧoϬp׳sv{ӄ܉B$+*" ߒՌ͆ŀ{vqlhd` \ Y V S ~P{Q u9TSUz]'[p{PkQ&kR(yNnbD^@ aDgϬp׳tx|ʀӅۊr5ߒ׍·Ɓ|wrmiea] Y W T Q|NXSQQMfHkNwI]BJ/N2w\,/jLDU7xGέsֳtߺx|ʁ҅ڋ&-0׋φǁ|wrniea] Z V S Q~NyL`#YSTs>^?X:U8N2I-]@ hJeFmPkճuݺy}ɁЅ؊8+]E΅ǀ{wrmiea ] Z V S QN{KvI\VWVs?_A]A R6L0S6[> sT]?vCԳxܹy}ȁΆ֊ޏPԎ#zvqmiea ] Z V S Q ~N{LxItGrHi2YVTsBSx^/\AdGisTemO£lڷz}Ɓ̅ӊۏݝ9|xtplhd` \ Y V S P~NzKxIuGrEwNRYXYZYWrV"uZ*}^&pQj3аw}ÁɄЉ׍ޒѓ4uqnjf b _ \ Y V S P}NzKwI|PxMtI Z!b[ZZZ[Y蠉^d*nOΐq8յzDŽ̈Ҍڐ}zznk h d a ^ [ X U RO}LyJvHwJ NyEPr=c]]]]^̾Sg+mMӨPᾀÂɆΊՎڒӞKҝHٌސ)i f d a ^ \ Y V SPN|LyIuGrExNP`|Hc.f___`ɹsƴh+&|\ƥlńʈϋՏے߷mne ϙGܐРPgc a cn n#[URP~M{KxIuGrErFu@en:pG}Whbbd˻zʷr5$i-ϭtƆˉόՐٓܗsm]qͅvڭew|-` ]`Jlmq,PN}LzIwHtFqDoBpF Mc.kC {Up>hdd̼{̹My?׳{„ƆʊύӐגږ޴q:r%}3HIǃȅ;Z w/rhmw7M{JyJYj0vJ nAk?j?mD xRo=RtEeh̼lͺh XdŇɉ͌ЎӐ֓ՓюʉЍԓהؔ֓Ãg Tmklĝ_j+xJ_"eȥnWk?h>kBn;bl~N`oǰBλYW]⽃ćljɋ̌ΎЏѐӑԑӐҐяϏh%YqmܰkحjƠe|QuJ i2PsJg<g=['ike\ʵɰ~ֳ}ćƊÈʌˌˍˍˍˏ‡Ϩm{>t6ڲtߴrܲpدnԭnQsG k?k?j@f<f={V#bmmpŭUֽоAsȥo԰zZʉ俆ٵ}Ȣj[œa}DPְvݵwڳuװsԮs]zQi>g<f;d:c:~Z'hlmȷsūѶĭ8~FXo3WŸhͨpֲyӯvߺ}ܷ}ݷ|۵yٳxΫrġjTzRh=f<d;c:a9a9yV!XbͼĮR UZiǥoΪsٵڶٵ}ش{ֲzԱyhPwDe/g=c9b9e>gBmJx|[$"l̷8UptRa᪋W쮏\^\V祉^|JrOmI }iD IfAf@ȯf a\YXgzJ??????????(@ B     #&-E[,"j1'n1&o fW @77654320-+'$ $+DF8~|c/͞% Œn[E lFDCB@?<961,&  *;?0uլCMSQSK. eLgJJIHGEC?;5," " @bIǐ8PNNNNNRIj)xLLLKJIGD>5' 3$ O:ƎEPPPPPQQQUCܜbfMMLLLJG@2 oMC0>rܘFQRRRRRRRRRK ޚŊS<QLLLJG@2 e yąבݕGSSSTTTTTTTXIUT> ޗْьa `IGD>5' pl DŽыאݕRVVVVVVVVVVVVVVZ(ޗّҌ̆p'o;5," k l}ʃщ׏ݔ%RYXXXXYYYYYYYYYXXJޕِҊ̄~s.!e f hu{ʁч׌ݑ1]ZZZZZ[[[[[[[[[[[ZVޓٍ҈̂|vl4%Q`amtzʀц׌ݒޤ6^\\\]]]]^^^^^^^^^]]]ޒٍ҇́{uofhE3\ ekqx~ф׊ޖ[^^____``````````````Vސً҅yslg^UX J]cipv|у؋ ڢBbaaabbbbcccccccccccbbbTޏي҄~xrke^ZXUW\bhou{ф ֛;dccdddddeeeeefffeeeeeegg ގى҃}vpjc]XU iS TZ`fmszЎ)eeeefffgggggghhhhhcTSRR8  ތهҁ{uohb[URRP/ORY_elryӗ>gghhhiiiijjjjkkkbX5 ތ نҀztmgaZTNP~NKQW]cjpxנOjjjjjkklllllmmmp6 ފ ل~xrle^XRLJ~M$zK(GJOU\biowЗBmkllmmmnnnooooo`" މ ׃ }wqkd]WQKEzLxIzBHNTZ`gntɀ٦Xnnnooppppqqrtg) ۇ ӂ | voib\UOI|DxEvGrEtDwA~GMSY_flsz ԟMoppqrrsssskG6#ދ ׆ ΀ z tnhaZTNHyBr=tI fqG Mn<s@{EKQX^dkq w ͕>ssttuvwwxf0ڊ҄ ~ x r mf_YSL}GuAn<pEmCj:p?wDJPV\cjv Ə6ܮbvwzyzu|U$܍Չ̓ } w r ke^XRKyEr@k;oC f4jAf8m=tC|IOU[bpƘLثaӦ\ё*cc>eU/8 ސ׋Їȁ{ v p jc]Z \R vDn?i;sCvTg@c9c7j<qAxGMSZc C̠W.Ņ͆אߐَҊ˅Āz t n hbeIQNc*qD e9h9{gB B\2a6g;n@uF}LRYkʡ\0x ̆֍ߑڎԌΈǃ~x r m f d ?ęSQQXa-e;~[-ye@fX0^5d9k?rEzKRa<Ԩ]țOż֎ߑڏԋωɆ|v q k g ;ěWØSRRRTzJzLV۽b>U/[4a8h>pDxJZPҦ\ت\ŘJz̈א)( !!! ڏՌЉʆăzu o i nĜZśU™UTTSSTSRİb?S.Y2^7e=mCzO Dͣ[Τ]Exx ͋ٓ/ԃp  !"###"! ؎ЉˆŃ}xr m g oÝ[ŜWVVVUUTTTű `=Q-W1\6d<qH u:Ǡ\Ϥ[Qlq zȌ"XS.* "#$$$%#"!ېψǃ€}zuq k f s'ş]ĝYXXXWWVVUų^<O,T0Z5gA {DÝ]ĝ]ͥ`Ҩbz%r Œ+pz> "#$%&&&%#" ُъĂ}zwso j d w/ǡ_ĝ[[ZZYYYXVǶ^=L+R/Y5a.]\o/v1ÚS4uح_]؛-ݕ !#$%&&'&%$"!ߓ׍Έł{wtql g c {5ơ`Ý]\\\[[ZZWë[;J*P.X5{I[Y[Xb j r ɎԒޕ!#$%&''''%$"!ۑӋˆÀztqnj e bOơ`Þ__^^^]]\Zɳ \;gH)O-V4yHœ]ßae#W_i r mFߕ"$%&'((''&$#!؏Љȃ~ysnkh d ` Ošaßaa``___^]ɷ\=DH(M-U3vEÞ_ˤcZ^_ h r $}@ "$%'(((('%$"!ܓԍ̇ā{vqkhf a ] z8Ģf ccbbaaaazZ;N.L,S2vFŠb̦dΪir,kp#ܰY߈= #$&'(((''%$" ِЊȄ~xsoje b _ Z `_ eeddcccfmV8J+Q1rAơdΨgׯkկl޵novۃp #%&'((('&%#!ޔԍ̇Á|vqlhc ` ] X }U y>¡ifffeeeanSY;I*O0l<ǣfЪiذlpty}ރ`  #%''(('&%$"!ِЊDŽ~xsmie` \ Z W yRu:jhhhgggZ~\=RH*N/j:ȤhЫkٲnrv{ׁA"%&'''&&$#!ޓՍˆÀzuokfb ^ Z X }UwQ{BkjjiiihnȼW8 R4M.rS$ŤlЬlڴpty~ك7 #$%%%%$#!ُЉǂ|vqlgc_ [ W U zStOa$okkkkjmy[=M0uFƥlѭnڵrv{Ѐچ8 !####"!ݒӋɄ~xsmhd` [ X U }RyR zWvTu?nmlllfì!^@ /P3{Lȧmѭpڵtx}тڇc(!"!! ֌̆ytnie` \ Y U R{Pf'SMi3WnjyOyPu~^@ gKmѮqڶuy~уډR|Y ؎·Ł{uojea] Y V S ~O~UPPQp:jLYu[-N2N3f7-jK4V8SЮrٵuzЄىb!'،χƁ{upkfa] Y V R O{M]XRWsVZ;\> Q5I-[> eGtW&ȩqصvz΄׉%=߇M΅zuokfa ] Y V R O|LwJ[WVZpS^@ V9M1Q5[> rT^@ 뤇Sִw{̄ԊݏWԎ#~ytojfa ] Y U R O|LyJuHrGm7YY{IRi:eKdGpuVWsVˬtݺ{ʄшڎQ{wrnie a \ Y U R O|LxIuGrExOYYYYX]z_,z`0rSo8մyǃ͈Սݒ֞Csokg c _ [ X U RO{LwI|Pa(}T_&a[[[[b걝w!f+qRv=߽ÂʆЋؐߕԆ~suk h d a ] Z W TP~MzKvHtFn8W^uAd^^^^Og* sTȼbƄ̈ҍّߕ͚Inݮ_}&f c a a^ X U RO}LyJvGrEuJ yE`a,}Wfaaa`İq5c'̪pƒdž̊ҎؒݖȄt"_y%}pƒDd _ _ 7Ԧ^ÖPXPN|KxIuFrDoB^&azToF e1hcc¨bDzI u;ֲz„LJ̋ю֒ڕxy-k7̞WFߚҎA\ n#oh׬gZ}LzJ}P\ tGnAk?mCrK~Z%q@yJdd¨[ȴ[ažeƈˊ΍ҏ֒֔ɅŃˈЏږؔёr+MmjٮjIR}PYǥm}Tj?h=uNRjW\rʳ5ʵbEa必ćȊˋ͍ϏѐґӑҐѐϏˍs1Up߲mۯk֭ls9rE^%}JqHf<jB ~MkkZ®Ů̲DZѮwˆĈ߹~Ɍʌʌʌʏ侄̥k|?v9ڲt޴sڱp֮nƢhUk?i>h=e;jC tDnmuīH̺ҷҾ'pȧqw=ҭuֲzҭwơjYǢhcbٳxܴwٲuկtȤma)j?g<e;d:c:q@irǶaѿop6m^"̳[Ӱz޻ܷ~޹~ݷ|۶{ٴzײyhUa,kAe;c:b9a9d@yX"e?a,~pnRทb lƣnʨsʨun_[a+gAgBhCiE BoKƪ{ĩ~ s0gIT[R^O]MSq=f0?????(0` %  $ 6&YE5wXAeKcIO;7+sV>97630-(#*TkV5٭CC&ӚpG5 SGFDA>92))<,vxQNNNPIԘ{YeLKJIFA7&E1)Nt!RPPQQQSB֗jL XMLLJE5` _Џ"TRRSSSSS>11ۖy.!|KJG@0otωؑ1VUVVVVVVWWVD۔ӍO7?6+ jrχ؏ 9YXXYYYYYYYYYYےӋʃz_Abiֽu}υ؍ߖ D\[[\\\\\\\\\\^ ېӉʁypiE?(!\`Ųjs{σ؋ޢ5^^^____`````___QێӇwnfTaY`hqyςؑ[aabbccccccccccccJ یӅ}ulc\W-S9V^fowυZddeeeffffffggdccZ? ۊӃ{rjaYTɊRNPʙT\dmuѐ/ggghhiiijjjjbR  ۉӁyqh`WOPb}MTJQZbksԘ?jjjkklllmmmp+ ۇ wof]UMK}KwHzHĂHPX`irʆ!fmmnnoopppqN م ~ umd[SK}DxIZsG.uA~FNV^gpy ڧWopqqrssnQ;ފ Ӄ { skbYQIxBtEoCo=yDLT\env ҜGstuvwxj2׈ ́ y q i`XO}Gs@m=wNj@k<tBJR[dvʗD͛H`ugw[Z%ۍч x p g_WPyFo>rFRdg? d9g:pAzHQYhřPƓ?ȋ&ҍܘ'#ݐԋ˄} v m eb>H`&n@rItfA6\2c8l?vGOXx)ǛRyÀщޒݐ֌Έłzs k e ;ØSQU`,pJib=WW1_7h=rE~Op)ǜUթ]Áыߕ ݑ׍ωȅxq i }2ŜV˜TSRTTS↑a=lT/\5e<oD`ŜXͣZ8xÂӏ%s= !"""" ڏЉɅ|un g CŜWVUUTTT^;uR-Y3c;~WTϤ[Fn zқ9e"(!!#$%%#" ܑ·ā}ysl f KŝYYXXWWU®\;rN,V2mHXVLϧavʚBr=!#%&&&%#!ُΈyupi d NĞ\[[ZZYWǵZ:dL+T1h6[{ eղsyՆۏχwpic] X T OVTQn7bD tY*L0[?dFp>ӱuzǀӇߏ:?܅S΅~wpic] X S O{LWWUb,\>Q4N2Z= &nPgIjݺzŀЇێՏ%|uohb ] X S O{KvHrH{DWQS|b3cGxY ?j3׶y€̆֌ލzrlga \ W S OzKyL vJ {R^ZZZUĊqCz[nw=῀DŽЊڑ{ԣLmh d _ Z V Q~NyJuGt>NwBb]]eŴ&|\`ƒʇҍے҈t˖Csic eiY TP}LxIsFwLSp={Teaiͽ7p4q6x˨nąˉҎٓ̇t&h޺qݸnxϠVbaզ]lg!N{KzL sEnBwNc.sLq@elϾ:^\ġhÆɊύԑόt޴p|ՒؔȜX}7nkE|N f*_wMj>oGzHbR{п)f'n忄ƈʋ͎ϏѐѐЏ̎Ù[Lpܱm֭md(vKk5lC h?yGlcı˻ ͳηgɩvܷҬsŊٳyͨoQKٱt۲t֯rUpE h=e;f>wGj̺4ȵ˱\Xf+Qͩs׳zٴzܷ}۶{سyhOsJe;c:a9gB vE2űyw\fqh湙dg_Zm8jD gAzhC9pMuc ][_??????( @    '0' \_Jbnk~\V@]<:60(J\Ѥ8OPFŒbG VJGC9% =+tRޜKQQQR=ɍL6MLI9n-~ړPUUUUVSQՏY O9% h3vͅڐKYYZZZZZY.ՌȀ] $]#hv͂ڏS]^^_____^L Չ}q\hATZ˰erܠ;bbccddddddd9ՆznaXQpVcpΆffghhiiib@2* Ճwk^RP-zK JS_m͊(kkllmmnk  ԁuh[NJuFb|DP]jx `opqrpY2݉ ~ reXLxBsGm@uBMZgxפRuwwp5ӆ { obUIp>xOqiC f:o?~KWpʛL͑->4-"؍ʃx l b t.`"k>[fA*\3i=wHX C'ǃۑڎΈt i 7—RSh4~Ra=EW1c:tH@͡VDžݗQ !"!ޒЉŃ{q kĜXUTTS^;MS.`:u9ʡ]:zY1" #%%# ޒˆ}vm mŞ\YXXV [:EN-sQ[f{($֜1#%''%!ُȄxqi s'ğ_]\\Z˻\<*K+vU%ş`m&d |\!$'('%"ҋuke q(àcaa`f\= N/rS#ɤdŞ[C]n!%(('$!ےʅzpf_ Z [eediQ3lM̧hݵoxڂi%!%''%#ҋsja Z {TTihhswV8egJ˨m߸s}ވ&"$$"ۑȃwlc[ U xR s:lkj±&]? kN˩o߹v̀ߋJF ͆zoe] U ~Q G}C~Mh;j@bDuWݹxʁ܌wANφzpf] V O~SVt;Z=N2]@0iKz]&׵xǂ׌ܜ7xne] U OxItI PUPoT"y[!&{Aωޓ|j b [ T NwIj2n7`\p̫mc&:_ƅҍޖٰc}'ܐƖEb z+iQ}LvGwL{I~Y"esȶJ2̩qLjЎόϡYجfƁ}s*lL}N x=rG mC q=~O{˹eˮ~忄ň͎ΎˍׯrM޳pӫk~S~Vj@uBnzʹǮ0U[ҮwΩoϩoٳxšij2f<c:uQ೛rȵp vGkzmdZ{JkF lgB1rP?(0 ` =/#R,!S@+(# 9)dt!ڭEBכ`$jGB8#]A)o:QRR8Y XJ:mCāܓNWWXXX.׏mL^9oˀ۔W]]^^^^L ׋|bX8O[k~Mcddeeeca(׈xgXMWg˄hijkkl= ׄtcRMRjD |FSdxfopqhF Ѐ p_NxElCSr@O`|ܪXqpXً| l[Kp@uF c;i<}Ld=̈ݐ̆x i 6EuMm\[6b9zN L/ˇ2# ! Љs v#ÚVTTn~W4`:HÚS~S!$%#Ȅyn z-œZYXuR2nLQ_ wܡ3$''$ ؏€rh :`_^|zS4iJ˦e>ΠFV!&('$Έyla h eddpPY;BaCϪjt؁U %'%!ڑ€qdZ }WiigT9 iLϬoy܈p'# ˅ug\ S k)OblaCic|ڊFDφwi] T ~RTrUX< dI4`Dl4}ӊUth] S |LvK UVh8wXOɆےڲ`wfZ QyJc)o:as± s8˨nʊҎʙOs}w,hbe&pE\&tB|ͽb вἂÆňܴwY۲py=uKuNh­ofQrťr˩tʧp\tMe>}\'^ rJpJ?(  @ UAw{0Ì֙oI5~A4}VGć)SS<{#l8 ^P}X\\\LېsF,=g@^z ZefgZIۊrZ[: {HXvinoYׅ mSxGq5"n?Rz ާMT8 h]}T>)`7[8ь' ωx|+TKvl[<'$]: D'4#&"o?[Yxi7$ `AQ0?&'#֎we =ce_Aկn=%$Łk[ i(jvaD[ͪmԆt3·p] R FqU$kC9:) z@̆jl\ O[XT_GǣhҎ֧\Ї=@YsG q>{yiLҵtҬq㼀ͦiš^qH h5Űbn_Fd0XSuKPY>'?launchy-2.5/plugins/loader/globals.h0000644000175000017500000000150511043143017016565 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GLOBALS_H #define GLOBALS_H #include #endif launchy-2.5/plugins/loader/dlg.ui0000644000175000017500000000652511043247675016124 0ustar monesmones Dlg 0 0 411 271 Form Qt::Horizontal 40 20 Download new plugins! Qt::Horizontal 40 20 0 Installed Plugins Plugins Not Installed All plugins Qt::Horizontal 28 25 + Qt::Horizontal 28 25 Qt::Horizontal 28 25 - Qt::Horizontal 28 25 launchy-2.5/plugins/loader/loader.cpp0000644000175000017500000000611611121324552016750 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2008 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #ifdef Q_WS_WIN #include #include #include #endif #include "loader.h" #include "gui.h" loaderPlugin* gloaderInstance = NULL; void loaderPlugin::init() { if (gloaderInstance == NULL) gloaderInstance = this; // QSettings* set = *settings; } void loaderPlugin::getID(uint* id) { *id = HASH_loader; } void loaderPlugin::getName(QString* str) { *str = "Plugin Loader"; } void loaderPlugin::getLabels(QList* id) { if (id->count() > 1) return; } void loaderPlugin::getResults(QList* id, QList* results) { } QString loaderPlugin::getIcon() { return libPath + "/icons/loader.png"; } void loaderPlugin::getCatalog(QList* items) { } void loaderPlugin::launchItem(QList* id, CatItem* item) { } void loaderPlugin::doDialog(QWidget* parent, QWidget** newDlg) { if (gui != NULL) return; gui = new Gui(parent); *newDlg = gui; } void loaderPlugin::endDialog(bool accept) { if (accept) { } if (gui != NULL) delete gui; gui = NULL; } void loaderPlugin::setPath(QString * path) { libPath = *path; } int loaderPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog((bool) wParam); break; case MSG_PATH: setPath((QString *) wParam); default: break; } return handled; } Q_EXPORT_PLUGIN2(loader, loaderPlugin) launchy-2.5/plugins/loader/loader.h0000644000175000017500000000334211043143017016411 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef loader_H #define loader_H #include "gui.h" #include "globals.h" #include "plugin_interface.h" class loaderPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: uint HASH_loader; private: Gui* gui; public: QString libPath; loaderPlugin() { gui = NULL; HASH_loader = qHash(QString("loader")); } ~loaderPlugin() {} int msg(int msgId, void* wParam = NULL, void* lParam = NULL); void setPath(QString * path); void getLabels(QList*); void getID(uint*); void getName(QString*); void getResults(QList* id, QList* results); void getCatalog(QList* items); void launchItem(QList*, CatItem*); void doDialog(QWidget* parent, QWidget**); void endDialog(bool accept); void init(); QString getIcon(); #ifdef Q_WS_WIN void indexIE(QString path, QList* items); #endif }; extern loaderPlugin* gloaderInstance; #endif launchy-2.5/plugins/loader/loader.pro0000644000175000017500000000126211043143017016761 0ustar monesmones TEMPLATE = lib CONFIG += plugin debug_and_release VPATH += ../../src/ INCLUDEPATH += ../../src/ UI_DIR = ../../plugins/loader/ FORMS = dlg.ui HEADERS = plugin_interface.h loader.h gui.h globals.h SOURCES = plugin_interface.cpp loader.cpp gui.cpp TARGET = loader win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib % LIBS += user32.lib % LIBS += Gdi32.lib % LIBS += comctl32.lib } if(!debug_and_release|build_pass):CONFIG(debug, debug|release) { DESTDIR = ../../debug/plugins } if(!debug_and_release|build_pass):CONFIG(release, debug|release) { DESTDIR = ../../release/plugins } unix { } launchy-2.5/plugins/loader/loader.png0000644000175000017500000000434011043143017016745 0ustar monesmonesPNG  IHDR szzsRGBbKGD pHYs  tIME4px'`IDATXŗk]U{wf޶)-BQQ~H|3FC@5?EECBR u( EiNg3G{ُ{[ZJD'䜜{kRDوzҲhu~fgLUѱg{v> 6lK{q&e^,I^}oWNnc[;Q KZyڛ*YlJ3J3qZ93&O|0>6&>M(jqNHp2'e۸o/:--$1O[DeH[%( ph/Z̤cPZ&(Ŏ08AƎxng1z|9QbD@ Hz:76kRyU'){nNk>{{,zG"1 "04_U1q[O@@B"4\a+u XVA и[ vK0QBK ,ECGB@#P/d%aaBx_YzVzXqcb(X(^S+"Z1TUpup  uDb:;;V}ã~2\88*N {Wѭ`=(AGd4G%9:IT'iD( wi)H ZȵpK^47^IF.7<"ӆ Z3xrYh΂}(DJpk :qyVo4ƃD$ChEu+팁B82T({zUTZ9:UpѼ6:[ r B@At &F88(cxQ8.Oz@߾h<GUY>GNB8ׄPhFC!QJ=\ QLIAt &!`غ1 u fBcTNqD9j0‹Fy>z W褤Lx ɴaV%f3%3а8'bADXQ`2z|ɑ#Omw5b%-9\լX4KudN T"o&jB|X)0(${ys2<<ZF1-*ILFAF[LᄺuΣQj5, )BLb򦲦R}z&L@g骔)8lh+ܖC9 No飵dƗ^g}4s[!k!3t&(CD+fGxJ1ƃkΨڭaφ3?$m$˘6)I TC(jҚJ+Z Y+W\xl].jT6*QcZ&56Vi@!Ղ^7R!Moք| ژ(vU͠`}APfd.>Ǻue[f]룯hODTi@4$Pw茑=On[;2jVNB߆efr]οҐLPhx@D*-jcGģįwFUIz{z̜+eo_ut)1].`H [݃ >M6*0 wӚ ZHEˮ̗,hҮRi# 2vmo8jSMOMs2MS$N5[5]ZHIENDB`launchy-2.5/plugins/calcy/0000755000175000017500000000000011355776633014643 5ustar monesmoneslaunchy-2.5/plugins/calcy/calcy.pro0000644000175000017500000000272211345030176016443 0ustar monesmonesTEMPLATE = lib CONFIG += plugin \ debug_and_release VPATH += ../../src/ INCLUDEPATH += ../../src/ INCLUDEPATH += c:/boost/ PRECOMPILED_HEADER = precompiled.h UI_DIR = ../../plugins/calcy/ HEADERS = plugin_interface.h \ calcy.h \ precompiled.h \ gui.h SOURCES = plugin_interface.cpp \ calcy.cpp \ gui.cpp TARGET = calcy win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib LIBS += user32.lib % LIBS += Gdi32.lib % LIBS += comctl32.lib } if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/plugins unix:!macx { PREFIX = /usr target.path = $$PREFIX/lib/launchy/plugins/ icon.path = $$PREFIX/lib/launchy/plugins/icons/ icon.files = calcy.png INSTALLS += target \ icon } FORMS += dlg.ui macx { if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/Launchy.app/Contents/MacOS/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/Launchy.app/Contents/MacOS/plugins CONFIG(debug, debug|release):icons.path = ../../debug/Launchy.app/Contents/MacOS/plugins/icons/ CONFIG(release, debug|release):icons.path = ../../release/Launchy.app/Contents/MacOS/plugins/icons/ icons.files = calcy.png INSTALLS += icons INCLUDEPATH += /opt/local/include/ } launchy-2.5/plugins/calcy/gui.cpp0000644000175000017500000000305311350203055016106 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "gui.h" #include "calcy.h" Gui::Gui(QWidget* parent) : QWidget(parent) { setupUi(this); QSettings* settings = *gPlugin->settings; if (settings == NULL) return; txtRounding->setValue(settings->value("calcy/outputRounding", 10).toInt()); chkDigitGrouping->setChecked(settings->value("calcy/outputGroupSeparator", true).toBool()); chkCopyToClipboard->setChecked(settings->value("calcy/copyToClipboard", true).toBool()); } Gui::~Gui() { this->hide(); } void Gui::writeOptions() { QSettings* settings = *gPlugin->settings; if (settings == NULL) return; settings->setValue("calcy/outputRounding", txtRounding->value()); settings->setValue("calcy/outputGroupSeparator", chkDigitGrouping->isChecked()); settings->setValue("calcy/copyToClipboard", chkCopyToClipboard->isChecked()); } launchy-2.5/plugins/calcy/gui.h0000644000175000017500000000172211345030176015562 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GUI_H #define GUI_H #include "ui_dlg.h" #include "globals.h" class Gui : public QWidget, private Ui::Dlg { Q_OBJECT public: Gui(QWidget* parent); ~Gui(); void writeOptions(); public slots: }; #endif launchy-2.5/plugins/calcy/calcy.h0000644000175000017500000000306211350203055016062 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef CALCY_H #define CALCY_H #include "plugin_interface.h" #include "gui.h" #include #include using namespace boost; class calcyPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: calcyPlugin(); ~calcyPlugin(); int msg(int msgId, void* wParam = NULL, void* lParam = NULL); void setPath(QString * path); void getLabels(QList*); void getID(uint*); void getName(QString*); void getResults(QList* id, QList* results); void launchItem(QList* inputData, CatItem* item); void doDialog(QWidget* parent, QWidget**); void endDialog(bool accept); void init(); QString getIcon(); private: uint HASH_CALCY; QString libPath; QRegExp reg; shared_ptr gui; }; extern calcyPlugin* gPlugin; #endif launchy-2.5/plugins/calcy/precompiled.h0000644000175000017500000000234611257666017017317 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PRECOMPILED_H #define PRECOMPILED_H #ifdef _MSC_VER #pragma warning(push,3) #endif #include #ifdef _MSC_VER #pragma warning(pop) #endif #include #include using namespace boost; #define BOOST_SPIRIT_USE_OLD_NAMESPACE #include #include #include #endif // PRECOMPILED_H launchy-2.5/plugins/calcy/calcy.cpp0000644000175000017500000001321211355776567016447 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "calcy.h" using namespace boost::spirit; using namespace phoenix; struct calc_closure : boost::spirit::closure { member1 val; }; struct pow_ { template struct result { typedef X type; }; template X operator()(X x, Y y) const { using namespace std; return pow(x, y); } }; // Notice how power(x, y) is lazily implemented using Phoenix function. function power; struct calculator : public grammar { template struct definition { definition(calculator const& self) { top = expression[self.val = arg1]; expression = term[expression.val = arg1] >> *( ('+' >> term[expression.val += arg1]) | ('-' >> term[expression.val -= arg1]) ) ; term = factor[term.val = arg1] >> *( ('*' >> factor[term.val *= arg1]) | ('/' >> factor[term.val /= arg1]) ) ; factor = ureal_p[factor.val = arg1] | '(' >> expression[factor.val = arg1] >> ')' | ('-' >> factor[factor.val = -arg1]) | ('+' >> factor[factor.val = arg1]) ; } // const uint_parser bigint_parser; typedef rule rule_t; rule_t expression, term, factor; rule top; rule const& start() const { return top; } }; }; bool DoCalculation(QString str, double& result) { // Our parser calculator calc; double n = 0; QLocale locale; str = str.replace(locale.groupSeparator(), ""); str = str.replace(locale.decimalPoint(), "."); wchar_t* wstr = new wchar_t[str.length()+1]; str.toWCharArray(wstr); wstr[str.length()] = 0; parse_info info = parse(wstr, calc[var(n) = arg1], space_p); delete wstr; //FOR SOME REASON IN LINUX info.full is false //if (!info.full) // return false; result = n; return true; } calcyPlugin* gPlugin; calcyPlugin::calcyPlugin() : reg(".*[\\-\\+\\*\\/]+[\\d\\s\\-\\+\\*\\/\\(\\)\\.]+") { gPlugin = this; HASH_CALCY = qHash(QString("calcy")); } calcyPlugin::~calcyPlugin() { } void calcyPlugin::init() { } void calcyPlugin::getID(uint* id) { *id = HASH_CALCY; } void calcyPlugin::getName(QString* str) { *str = "Calcy"; } void calcyPlugin::getLabels(QList* id) { if (id->count() > 1) return; const QString& text = id->last().getText(); if (reg.indexIn(text) != -1) { id->last().setLabel(HASH_CALCY); } } void calcyPlugin::getResults(QList* id, QList* results) { if (id->last().hasLabel(HASH_CALCY)) { const QString & text = id->last().getText(); double res = 0.0; if (!DoCalculation(text, res)) return; QLocale locale; locale.setNumberOptions( (*settings)->value("calcy/outputGroupSeparator", true).toBool() ? QLocale::NumberOption() : QLocale::OmitGroupSeparator); QString szRes = locale.toString(res, 'f', (*settings)->value("calcy/outputRounding", 10).toInt()); // Remove any trailing factional zeros if (szRes.contains(locale.decimalPoint())) { while (szRes.endsWith(locale.zeroDigit())) { szRes.truncate(szRes.length()-1); } if (szRes.endsWith(locale.decimalPoint())) { szRes.truncate(szRes.length()-1); } } results->push_front(CatItem(szRes + ".calcy", szRes, HASH_CALCY, getIcon())); } } void calcyPlugin::launchItem(QList* /*inputData*/, CatItem* item) { if ((*settings)->value("calcy/copyToClipboard", true).toBool()) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(item->shortName); } } QString calcyPlugin::getIcon() { return libPath + "/icons/calcy.png"; } void calcyPlugin::setPath(QString * path) { libPath = *path; } void calcyPlugin::doDialog(QWidget* parent, QWidget** newDlg) { if (gui != NULL) return; gui.reset(new Gui(parent)); *newDlg = gui.get(); } void calcyPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } gui.reset(); } int calcyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_LABELS: getLabels((QList*)wParam); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*)wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*)lParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog(wParam != 0); break; case MSG_PATH: setPath((QString*) wParam); default: break; } return handled; } Q_EXPORT_PLUGIN2(calcy, calcyPlugin) launchy-2.5/plugins/calcy/dlg.ui0000644000175000017500000000315011350203055015721 0ustar monesmones Dlg 0 0 464 271 Calcy - Simple Calculator QFormLayout::AllNonFixedFieldsGrow Rounding decimal places Show digit grouping symbol Copy result to clipboard when pressing Enter launchy-2.5/plugins/calcy/calcy.png0000644000175000017500000000354711042736357016445 0ustar monesmonesPNG  IHDR szzsRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.10r%IDATXG͖SԶNwvڮlBb $\rw XD^l?>mgyߟ|!:*Ha0#)y;]Ki]/a@u0% ˄0CDg~F7zVm`4>2& LJ}܁HDX'ck0L^>'Xx$<'u"|ǦHgV>t. ~ҵ٥:m>)w$̑`#r% }hL@M^(1wr:;q,_g.p4k/6iCYpU[2] 4,P} PAb7~#.`?Wp Ep EP *ڶX]!;y_dNé8S ;\\*Z$ߎR1&dY-5ܻr%,Wk?x ҽ`jvCak)Zyژ+*}3XBA'XqJ7[71IuΑY>"Ji {qҘGK$ "CI3%Đ!2s<jhswNm`5& ~ ]F Qh]WMGgbi @_Qzp>b{s:q&1VWȘUf}9 m͂ :4Mcr ]"nR)w4-7&RBXEԫ6MeHǯzCEJk ̱UrRmpwZVJAN2 K~q*[ؚ?3V6II/|s{ 0yˆ hP`\;sFlK h,ƣꂯ)4Kx86mj3Mksl$ 3[Gvdj4)Em1ŘcxiUļhF-Z&ߑ[tUP$:t,r!I.fRnH2{ oZ0[SxT ZBL5kOo q>c%EEEW͸0MyOťgҨmǫBt WZW,ĥ6e{OQG"&s>ylz]L.KZ0浳g_d;vDC5ns#gl=7gR8q&8yNpj~$x"4qL>O/Rrzt#fpuN|_В?xQޱ ZIENDB`launchy-2.5/plugins/calcy/calcy_full.ico0000644000175000017500000005400610673261500017441 0ustar monesmones (n00 >h00%N! FhS( @dDDDDDDDDDDDDD@fffffffffffff@`````f@opopopopowwpf@ooooof@fffffffffffff@``````f@opopopopopopf@oooooof@fffffffffffff@``````f@opopopopopopf@oooooof@fffffffffffff@`wwwwwwwfffff@`fffff@`wwwwwwwfffff@`fffff@@ffffffffffffffa( fDDDDDD@offffff@n`p@offffff@n`@offffff@nwwwff@off@nff@o`ffffffa```f@opopowf@ooof@fffffff@(0`kiimllhX뜅UIݘ㝉i\xsӉs˅oxe|h~saՒ}͎ؕzs~mpܜ|lpp}[Qf[uzŲbYɸxuowcmq`njvyg襎r̗|mc{zwv̻wuomjgfƒk‹uꬓ‘}yʤͪմ~aϏqrљ̔|ӛŒzwǔ|ܤŒ|ǖ͛ɞʳͶǠ˺ݿFHMKKRRւZ׊d}\ߓlԟz겖ߪå¤㯔ӣ۫йҼusrW]chmtzآŦƧƨǩɪȩ빝ӫΨȣœŠǤŦʫˬ¤̭ͮⵚί꼡ϱͯƩԹּɦб̮ѳҳӴѲسɯ̳ѺdzʶԳԵնϲũֹ׺ҵپ翞ֶٹٺڻܼݾծ߶W=ogkkkhhheeeaaa]]]ZZZYYYB--B5JB" : "'B5J:&!\7L "'B5J0,k|cO87L "'B5J0 /k|||ddcO87L "'B5J0 /k||::c||cO87L "'B5K0; /k^||c_?cOM7 '0;?Gl9$cPMQ|<:=||ccOM7KA?GlNIf98c|N6=cc=4A?1lfp^^c fQ|\4+!1lSQfYǻ`NfOM79|?4+!2lSiiSpfgo|d4A!2mSYgH+#3]::9aeSSH+#3}< 9b]SjSF)#3>TPPM<:6`F+#ISIT^>887:9F+(Iii`=`7;F)(IUY@e|cO9F) (URSņ`ɻiF+ ,mSVjE) ,<MM8L:66}ƵD) />1Q}889ŽE)=/RiQ`E)=GpňYͤhpD)=GRSU⹆D =1hY釶D Q1~C 2C2ɷC 3]}`~bbbi͸C 3]\hbbbeA$IȮ[bA$Iȅ{NA$Iɟya0%ZL0%ӖxrssssvvvvL0&^zwurqqqqqsssssvvvv;W*ʂ^;LLZZzxxwtrqqrZW.˱f^NLLLW@Wj썍nVnVVAYYYYXXVѮ䢌XXXXXVX( @gfføtplhgԒʋy֔ؖߜ祒j^lcsjqk~|؏xωsˇrĄowe†s⟋壏㡍m`몖ųȷ|r̼{ήytٔ}ʋuݜϐ{Ŋuqoۙ㢊Ŏzq˖ŵӔ{릋Д}ŒvћΙő}գТФХ訌՛᥋ڡ֤اȯĬѤʲӦηŸɦOXX]׋e֒oך{Ԙz㩋՞נﵘؤҟ᫑氕åҡ賙Ⱈϣӧޯөϧ˪ӴMUT]`dhlrw}rۤܨգئĥŦƧǨ浙緝渞鼢ҺԽ׳ӯտɩ٫껝̬ǩͮίɫ֬ϱгŭۺ߿óɹаɪŧ̮ƩҳӴԶѵͳѾmjhyvtҲԵԵ׺پ׶ظٻūҺѽۻɯͮݽponպճoyMthr{{{xxxmmmjjjhhhbbb^^^TTT+&87*4!XT?=,*![kT@2P?.,*2#[q7 kR26?.,* #[AXk=N3-0TO>?.(* $]E׿hBqPp4-K*5)谔HUBWk6lJ* )wvt׿sI* 84pHuI*C6.-r43|I*FWpC?/>L*xϗGǽV^* yux^*x_*Žz*nmz*ghjȜ* h{* di{*"f}}}~~~ag*"̉edddc`}}}bm*;Ƹiff*ԴMε??????????????????????????( ȹսzdv`ʂkbQȆq{kڽրbڌrkX׎tk룉pziƕԶޕx|e„lΏuʼnr՚֢굠ե֯ʽʾ|N}U柁s`ࣇҜڰھMN}O\_lx﬉ࠀݠǰ[骉ᮓ泘ᴚٷɶVelrҶҸЯ꿡鿢Ѳˮܹζ׸ѷ۵Աͭ׵׷ط©̷ձڹںܼճ޼߿ѠǪʭͱDZ֮cGu(jx)!{'4%!b-H*(1!_R+8,5"! u&6qra/!b:|7$@Shxikyjszg?1%psVol'n4u(0` |i_|]T_Vg]ke^XVteR@4)  hf[xXOmaqdeW}SGzXNaWg\kdb[XteR@4)  }rТpaܚޔ}~jeV|RFzXMaVg\kdb[XteR@4)  wkrǴɲåޓ|ĀlhXUH{XMaVg\kdb[XteR@3(  vh…tȶʲĦߔ}khXUI|XMaVg\kdb[XtaG) uhćuɸʳĦko^p^}h}ŀljZVI}YNaVg]keNJI~U(  uhƈv˹˴ŧ£ј}k眆Ӈp}h͔|ʐxɃnjZUHcXnh|Dviɉw̵̻ŧ¤n͈q꬏xeqasas`稌xhPKI[#sfˋyͽ̶ƨäwѳͭɪє|ۢpyeŒvsawc稍ꦌwof) sf̌yξͶƨĥڢ޽ܼ˲ЗИܪŨٔ{⣉ޤtcב|ٌvxd뫏xok, se΍{ͷǨŦäxѪ鯓ޤسԳѱՙŠu࣏kyom- sfЎ{ηǩŦŦyͨȞ͚ĥ|ۣǐ|˺ίɪŦpyon. nmltfя|ϸȩƧƧƦŦŦŦŦ᪐ǟx্ٷܻŒ}zpp/ }{{tfҐ}ϹɪǨǧsp^q_oäƦƦŦ벖Ē{ǔ{Ŧäyxåå{oq0 xwvsfԑ~кɪȨӞyhߗ陂̓mlƧƧ¤wr谔ƧƦŦzɟw쳖Ŧħynr0 uts se֓кʫȩpɇqǧxfrcxgvb՛ǧƧƧŦƧƧƩzns1 +ufהѻʫɪwϱ̬ˬҙૐs|gǨop_r`nŧǨȫ|qt1 5tfؕѼˬʪ͚ݼݾйϚќڪǫŦ¤壊֜ܨ}k렉ЇpɎwȩʭ{ot1 7teږҼˬ˫ֲ尕ߪֲ׶ָ̳͗ȓ}⪘mȩ˯|pt1 :tfܘҽ̭ˬˬ⯔ʲִÒ|˫ȩ}ɵפќĵշѱҵϚͱ}qt1 ?whޙ¯ӽ̭̬̬̬ĥݪ紗ˬˬˬᮔǠxŧˤʟγ~qu2 JvgñԾ̭ͮͭެzg{gؤ̭̭̭̭븛ƖǗ~̭̮ŕzͯд}qv2 Jug✈ųԿίͮ䳘saqщt{g˔|̭ͮͮϞē|븜ͮͮͯ˭̝}zæΰѶ~qv3 Lug㞉Ƶίήr۝m¥ήmqavewcӞίΰΰ˳¯ͰϱϱӸtw3 Pvg埋ȷϰϯuʬɪɫ讖֠鸜ok¥ϱ^5e o׸ٹٹٹбެћǏulg~a|^}Z҂]܄YQKGFFG~aȮ311@sٺۻںںںںںڻڻڻڼۼҵŨ㵙٧ϚÌrkh‡mĪ654Aɕ߿ݾܾܾܾܽܽܿܿ<:9BǸU}NJI>䷛SPN3ssr |ÙɞШ۱彜ȥծwT!8!+5@xT\ "HF2 CIi~}{`Y/]sD?( @ qgtÌ{tcg[f\ha{jdpǯؓ|vdi\g]iazidÅsɱ£ÌvĊtؓ|wei\g]ib{idƈvʲäƏyȊx؏xŅoŌv㣉ۖ~yfk]lbɊx°˳ĥКȯ£褉訌qɉv̇qޞ՛ѕ}ťzIJ̵Ŧգ޽ϴ⩎ΙæӔ{ۡrωsˊs}Ύ{ƴͶƧΤԺϥѤܽפқĬۙ~ѐ}ȷηǨƧ豕֠Ŧ賙׳ɯ٧ᬔн޾輤ﳗ}ԒʺϸȨҞmÃoΑyƧŦءએŦŦѤ©͠ĥ֔̽кɩʕݛﵘunÃn᥋ǧ᫑͘åƨؖξѺʪӦ׶Ͳ᫑̗є|汖oʇrȊtȩۘһ˫綜ɸ޺ХٻդΚ㣊ﶚݚӼ̭̬嵛֪崘ˬޯѽӧⰘѿ޾ʲ粘ߜԽͭᄀno䯔̭̭緝٫ǩ̭Цպϥɫ⟋տήđ|㡋ˍvǩҡnpίūǩϱ㡍տϯТӺͮ䰖Ƒ}ϔ}ŭMwLpmг壏аԨҺ縞Ф׻Զ֦erjõœ祒ѱɪΧ¨ϣаԪծÞ騕ҲҲҲɪҲҳ̮ҩծ齡ѵpyĸɤ쫗ӳӳӳӴӴӴԵԵԶԶշ˷»׻ʧԴ껝ҟפգգ֢ئ嵙ƩԷֹ׺ػؽ˩ӴӘ{œ㨉נ֢գ帞ھϮǨrtwz|㩉鼢ұҲ؍h]_aegilpsvy|՝Դ׸כ{RMNPSUVX\^`cԗyظظعۢ֒oՌh։cو`]VOLLMX٤޿ŵܼۻۻۻڻڻԵŧ綘ܨ՟ל}טyۥ¯կƮɭŧŦȧɧʧͨΩֱ޼ȨӰ?( @zidf\g]g[i\k]halbqgtcvdyfnnttp}OLV]RQXUX]Ãn։cو`Ռh؍h֒o…rˇqÊuʊtčzʋy؏xő|Β{Ӕ{ԗyѐ}Ԓє|ٔ|Ә{יzל}`begirlpsuwy|MwLpmpjyer˖͙œ֔ؖ՛՞њҞܚߜ⟋Σ֠ۢۥԢ١إ٧ܨŦʧΤɦΧͨŧͫѥԪ٫ծޯֱ׳޼㢋륊㨉ᩎ訌祒ᬒ꩖尖벖Ⱈ粘嵙綜촙渞껝ɭұԴ޺ظ޿õ»鼡ᄀ輤¨ĸ©¯ƮŭɯȨŧäŪǨŪɪˬ˷ɸŵIJ̲˴̻һӰѲѵӴԵѺֹӼԾٺٽݽ ' x1 #·%%}1 %·'()%w}1 (·Yx{&$[W0}(·bzS,c#&&(·i^obY[.º_ueТ/üZ+czo^JUʼR[%wSKVʼoR0$&K[ʼobSwK[̼psoK\ͼ qo^K]ͼ*w}&b MKwͼbʼ*+BCDTwpďooNHIFTƼk^prQPTƻƼppEGjɽOjɐZbbb_dn2y_bbnڹ:>?@A|~~y!6789;<=>@AX356-`" dɶfX43aٮrmgjjhlltvL?launchy-2.5/plugins/controly/0000755000175000017500000000000011355776633015421 5ustar monesmoneslaunchy-2.5/plugins/controly/fhores.h0000644000175000017500000000052011262347554017046 0ustar monesmones// Copyright 2009 Fabian Hofsaess #ifndef FHORES_H #define FHORES_H class FhoRes { public: static QString getResourceString(QString &resourceIdentifier); static QString getResourceString(QString &resourceName, int resourceId); static QString getResourceString(HINSTANCE hLib, int resourceId); }; #endif launchy-2.5/plugins/controly/gui.cpp0000644000175000017500000000214111262221417016665 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "gui.h" #include "controly.h" Gui::Gui(QWidget* parent) : QWidget(parent) { setupUi(this); QSettings* settings = *gControlyInstance->settings; if (settings == NULL) return; } void Gui::writeOptions() { QSettings* settings = *gControlyInstance->settings; if (settings == NULL) return; } launchy-2.5/plugins/controly/gui.h0000644000175000017500000000175311262347554016355 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GUI_H #define GUI_H #include "ui_dlg.h" #include "globals.h" class Gui : public QWidget, private Ui::Dlg { Q_OBJECT public: Gui(QWidget* parent); ~Gui() { this->hide(); } void writeOptions(); }; #endif launchy-2.5/plugins/controly/fhores.cpp0000644000175000017500000000307311262221417017374 0ustar monesmones// Copyright 2009 Fabian Hofsaess #include "precompiled.h" #include "fhores.h" #include "fhoenv.h" const DWORD maxSize = 256; QString FhoRes::getResourceString(HINSTANCE hLib, int resourceId) { QString resourceString; if (hLib != NULL) { TCHAR buffer[maxSize]; int res = LoadString(hLib, abs(resourceId), buffer, maxSize); if (res != 0) { resourceString = QString::fromUtf16(buffer); } } return resourceString; } QString FhoRes::getResourceString(QString &resourceName, int resourceId) { // e.g. '@%SystemRoot%\system32\SHELL32.dll' ,-32517 QString resourceString; QString libraryName = FhoEnv::expand(resourceName); // remove leading @ if (libraryName.startsWith('@')) { libraryName = libraryName.right(libraryName.length()-1); } // can we do this without loading the library (like for icons via ExtractIcon instead of LoadIcon/LoadImage)? HINSTANCE hLib = LoadLibrary((LPCTSTR) libraryName.utf16()); if (hLib != NULL) { resourceString = getResourceString(hLib, resourceId); FreeLibrary(hLib); } return resourceString; } QString FhoRes::getResourceString(QString &resourceIdentifier) { // e.g. '@%SystemRoot%\system32\SHELL32.dll,-32517' QString resourceString; QStringList split = resourceIdentifier.split(",", QString::SkipEmptyParts); if (split.size() == 2) { QString resourceName = split.at(0); QString resourceIdStr = split.at(1); int resourceId = resourceIdStr.toInt(); resourceString = getResourceString(resourceName, resourceId); } return resourceString; } launchy-2.5/plugins/controly/controly.h0000644000175000017500000000362711354223474017440 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef controly_H #define controly_H #include "plugin_interface.h" #include "gui.h" #include "fhoicon.h" class controlyPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) private: uint HASH_controly; FhoIconCreator iconCreator; #ifdef WITH_GUI Gui* gui; #endif public: controlyPlugin(); ~controlyPlugin(); int msg(int msgId, void* wParam = NULL, void* lParam = NULL); private: void getID(uint*); void setPath(QString * path); void getName(QString*); void getCatalog(QList*); void init(); QString getIcon(); QString getIconPath() const; void getApps(QList* items); bool isMatch(QString text1, QString text2); void addCatItem(QString text, QList* results, QString fullName, QString shortName); void updateUsage(CatItem& item); void getResults(QList* inputData, QList* results); int launchItem(QList* inputData, CatItem* item); #ifdef WITH_GUI void doDialog(QWidget* parent, QWidget**); void endDialog(bool accept); #endif QString libPath; }; extern controlyPlugin* gControlyInstance; #endiflaunchy-2.5/plugins/controly/precompiled.h0000644000175000017500000000223611331664534020066 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PRECOMPILED_H #define PRECOMPILED_H #ifdef _MSC_VER #pragma warning(push,3) #endif #include #ifdef _MSC_VER #pragma warning(pop) #endif #include #ifdef Q_WS_WIN #define _WIN32_WINNT 0x0600 #define _WIN32_IE 0x0700 #include #include #include #include #include #endif #endif // PRECOMPILED_H launchy-2.5/plugins/controly/launchy.rebuild.png0000644000175000017500000000244511354223616021207 0ustar monesmonesPNG  IHDRw=tEXtSoftwareAdobe ImageReadyqe<IDATxڴUIl\EY?Og K(r( QB\8@8 !`"( IX!'{n2e8К֯z0ƀkA jQl@FhR(0DcC@ 0 $h.O< @R+OOvdu7<;P[~gp=<@JTcYe@"Q5AS߶"t%3كt ͚75p'H@"H8m`2R7c o0 Ѿ c\[ Z>895P TX${v9"js5-Q~ÅV:ৠ$J{meLP{`2g1JKޥdLAQ! e1.'] K(\cn+?zS/Z.y]d՝Sڮ p DYטﭽ79/Vq`6!F1v}N/1}?B5'9#k'y}i+!6z[TaKFf~. ]<2 A(#}9yP*Zni;0A33Jt(" ̳CR^'ÿH}mAHB JmysjҸ b0QVRb xT9š_k"EG#<\j͉+uS*1dzք额020h9`LlQ7>7]̌.*&^禆(*]vGvAS2?Ggt+<$4x7Eܾt,.tl9TMP_5USD1x𶁺QΛPL~kg?i㲨FlN Oуd\Mq눢Η1Y]z(B+x2З ]<~;[􊞄ϑl'f!a)]̏Mg-Kn{_Q= *- @$ pbn>;|ͻ_l G}woly]kNEcQPpUJXe62fzK7ǹ7ݲSIn!p g۶MB==;Vٸ#(޵/{<@^SGmǀ IENDB`launchy-2.5/plugins/controly/fhoicon.h0000644000175000017500000000527011332616142017202 0ustar monesmones// Copyright 2009 Fabian Hofsaess #ifndef FHOICON_H #define FHOICON_H // implement icon/image cache? // extracts / generates icons (images, as pixmap objects) from file resources, image files, files and handles class FhoIcon { private: static QImage getDefaultIconFromResource(QString fileName); static QImage getDefaultIconFromLibrary(HINSTANCE hLib); static QImage getDefaultIcon(); static QImage getIconForFile(LPCTSTR file, UINT basicFlags); static QImage getIconForFile(LPCTSTR file, UINT basicFlags, DWORD basicAttributes); public: static QImage getIconFromHandle(HICON hIcon); static QImage getIconFromResource(QString resourceDefinition); static QImage getIconFromResource(QString fileName, int iconIdx); static QImage getIconFromLibrary(/*HMODULE*/ HINSTANCE hLib, int iconIdx); static QImage getIconFromImage(QString fileName); static QImage getIconForFile(QString fileName); static QImage getIconForFile(LPITEMIDLIST pidl); static QImage getIconForFile(IShellFolder *psfParentItem, LPITEMIDLIST pidlChildItem); static QImage getIconForExtension(QString fileExtension); static QString getImageIdForExtension(QString fileExtension); static QString getImageIdForFile(QString fileName); static QString getImageIdForFile(LPITEMIDLIST pidl); static QString getImageIdForFile(IShellFolder *psfParentItem, LPITEMIDLIST pidlChildItem); static QString getImageIdForFile(LPCTSTR file, UINT basicFlags); static QString getImageIdForFile(LPCTSTR file, UINT basicFlags, DWORD basicAttributes); }; // returns file names pointing to icons (image files), creating these image files from file resources or handles if necessary class FhoIconCreator { private: QString imagePath; QString baseImageFileName; QString defaultImageFileName; QString imageType; QString imageFileExtension; bool forceDefaultImage; QString generateImageFileName(QString imageId); QString saveImage(QImage &image, QString fileName); public: FhoIconCreator(); FhoIconCreator(QString path); void setImagePath(QString path); void setBaseImageFileName(QString name); void setDefaultImageFileName(QString fileName); void setImageType(QString fileExtension); void setImageType(QString type, QString fileExtension); void setForceDefaultImage(bool useDefaultImage); QString getImageFileName(); QString getImageFileName(HICON hIcon, QString imageId); QString getImageFileName(QString resourceDescription); QString getImageFileName(QString resourceFileName, int resourceIndex); QString getImageFileName(LPITEMIDLIST pidl); QString getImageFileName(IShellFolder *psfParentItem, LPITEMIDLIST pidlChildItem); }; #endif launchy-2.5/plugins/controly/fhoicon.cpp0000644000175000017500000004553111332616142017541 0ustar monesmones// Copyright 2009 Fabian Hofsaess #include "precompiled.h" #include "fhoicon.h" #include "fhoenv.h" QImage FhoIcon::getIconFromHandle(HICON hIcon) { if (hIcon) { return QPixmap::fromWinHICON(hIcon).toImage(); } else { return getDefaultIcon(); } } /* creates an image from a loaded module's resources by id */ QImage FhoIcon::getIconFromLibrary(HINSTANCE hLib, int iconIdx) { // theory: // see getIconFromResource()/ExtractIcon() for a brief description // mydll,-3 extracts icon with resource id (name) "3" // mydll,3 extracts icon with index 3 (4th icon) // in practice: // it seems that passing numbers via MAKEINTRESOURCE() returns the icons with the name represented by the (positive) number // it seems that passing a string itself does never yield a result!? // lib,3 extracts icon with resource id (name) "3" (via MAKEINTRESOURCE) // lib,-3 extracts icon with resource id (name) "3" by passing absolute value only! (via MAKEINTRESOURCE) // => always loads resource with given name, can currently not load nth icon by index! iconIdx = abs(iconIdx); // assure that if name is intended (by passing negative value) the expected result is given; we cannot achieve that if index is intended we will get the correct result! if (!hLib) { return getDefaultIcon(); } HICON hIcon; if (iconIdx > 0) { // represents zero-based index of icon, e.g. 3 for fourth icon hIcon = (HICON) LoadImage(hLib, MAKEINTRESOURCE(abs(iconIdx)), IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE); // passing 0 for sizes with LR_DEFAULTSIZE flag returns default system size (e.g. 32), like LoadIcon does // passing 0 for sizes without LR_DEFAULTSIZE flag would return actual resource size (e.g. 48 / 32 / etc.) } else if (iconIdx == 0) { // this works quite well for positive and negative ids, but it fails to load a resource if id is 0!? // does 0 index (first icon) really not work? hIcon = (HICON) LoadImage(hLib, QString::number(abs(iconIdx)).utf16(), IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE); } else { // represents name of icon, e.g. -3 for icon with id "3" // does -1 have a special meaning also, like it has for ExtractIcon()? hIcon = (HICON) LoadImage(hLib, QString::number(abs(iconIdx)).utf16(), IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE); } if (hIcon) { return getIconFromHandle(hIcon); } else { // find first icon in library!? take care not to run in an endless loop! } return getDefaultIcon(); } QImage FhoIcon::getIconFromResource(QString fileName, int iconIdx) { // see ExtractIcon for a brief description. // In short: // mydll,-3 extracts icon with resource id (name) "3" // mydll,3 extracts icon with index 3 (4th icon) // iconIndex >= 0: // -> zero based index of icon (load by ordinal) // e.g. 0: first icon (index 0) // 3: fourth icon (index 3) // iconIndex < -1: // -> icon with resouce identifier of abs(iconIndex) (load by name) // e.g. -3: icon with resource identifier ('name') "3" // iconIndex == -1: // -> returns total number of icons in file! // => to extract icon with resouce identifier "1" (iconIndex -1), use ExtractIconEx()! if (iconIdx == -1) { // we want icon with name "1", but parameter -1 will return the icon count! // really get icon with name "1" instead of the first icon, e.g. using ExtractIconEx()?! return getDefaultIconFromResource(fileName); } else { // remove leading @ if (fileName.startsWith('@')) { fileName = fileName.right(fileName.length()-1); // fileName.remove("@"); } fileName = FhoEnv::expand(fileName); HICON hIcon = ExtractIcon(0, fileName.utf16(), iconIdx); if ((hIcon) && ((int)hIcon != 1)) { QImage image = getIconFromHandle(hIcon); DestroyIcon(hIcon); return image; } else { if (iconIdx != 0) { // we did not try to get the resource's default icon yet return getDefaultIconFromResource(fileName); } else { // we already tried to get the resource's default icon return getDefaultIcon(); } } } // Alternative method would be to use GetModuleHandle/LoadLibrary and LoadImage // we prefer ExtractIcon because this can potentially also handle resource files that cannot be loaded (e.g. because of missing dependencies, etc.) // also, it seems that LoadImage can only handle icon names (passed via makeintresource, however) and can not load icons by name!? (documentations states it can!) // Does it make sense to try this version first for performance reasons (at least for "name" case that works)? } QImage FhoIcon::getDefaultIconFromResource(QString fileName) { return getIconFromResource(fileName, 0); // index 0, first icon ("default icon") } QImage FhoIcon::getIconFromResource(QString resourceDefinition) { if (resourceDefinition.contains(',')) { QStringList split = resourceDefinition.split(',', QString::SkipEmptyParts); if (split.size() == 2) { // e.g. "my.dll,5" or "my.dll,-5" QString fileName = split.at(0); INT resourceId = split.at(1).toInt(); return getIconFromResource(fileName, resourceId); } else { return getDefaultIcon(); } } else { // e.g. "my.dll" QString fileName = resourceDefinition; return getDefaultIconFromResource(fileName); } } QImage FhoIcon::getIconFromImage(QString fileName) { fileName = FhoEnv::expand(fileName); QList supportedFormats = QImageReader::supportedImageFormats(); QFileInfo fi(fileName); QString type = fi.suffix(); if (type.compare("ico", Qt::CaseInsensitive) == 0) { // Qt used to have no image loader for windows icons // it seems that it has one now (QImageReader::supportedImageFormats() also lists .ico type), // but that one seems to load the first icon via QImage(iconFile) (e.g. a small b/w one for an icon containing multiple images), // whereas this workaround (via ExtractIcon(0, iconFile, 0)) tries to find an icon matching the current windows default icon size! // we could also use LoadImage() with NULL and LR_LOADFROMFILE to load icons, cursors or bitmaps; which method to prefer? QImage image = getDefaultIconFromResource(fileName); if (!image.isNull()) { return image; } // in case this method fails and returns an empty image, we give QImage(iconFile) a try before potentially returning a default icon finally } if (supportedFormats.contains(type.toAscii())) { return QImage(fileName); } else { return getDefaultIcon(); } } QImage FhoIcon::getIconForExtension(QString fileExtension) { if (!fileExtension.startsWith('.')) { fileExtension = "." + fileExtension; } return getIconForFile(fileExtension.utf16(), SHGFI_USEFILEATTRIBUTES, FILE_ATTRIBUTE_NORMAL); } QImage FhoIcon::getIconForFile(QString fileName) { fileName = FhoEnv::expand(fileName); return getIconForFile(fileName.utf16(), 0); } QImage FhoIcon::getIconForFile(LPITEMIDLIST pidl) { return getIconForFile((LPCTSTR)pidl, SHGFI_PIDL); } QImage FhoIcon::getIconForFile(IShellFolder *psfParentItem, LPITEMIDLIST pidlChildItem) { HRESULT hres; IExtractIcon *pExtractIcon = NULL; hres = psfParentItem->GetUIObjectOf(NULL, 1, const_cast(&pidlChildItem), IID_IExtractIcon, NULL, reinterpret_cast(&pExtractIcon)); if (SUCCEEDED(hres)) { TCHAR str[MAX_PATH] = {0}; int index; UINT flags; // Get the file location where the icons are stored. hres = pExtractIcon->GetIconLocation(0, str, MAX_PATH, &index, &flags); //hres = pExtractIcon->GetIconLocation(GIL_FORSHELL, str, MAX_PATH, &index, &flags); if (SUCCEEDED(hres)) { QString iconResourceFile = QString::fromUtf16(str); // do not use 'general' getIconFromResource() -> ExtractIcon()! // use 'specific' pExtractIcon->Extract() instead! // this is because iconResourceFile returned may be "*" and not refer to a real file! pExtractIcon->Extract() will handle this, ExtractIcon() cannot handle this! // "*" is dangerous for caching the imageId! we could check if iconResourceFile refers to an existing file!? HICON hIconLarge = NULL; UINT nIconSize = MAKELONG(0, 0); // this requests the default size!? hres = pExtractIcon->Extract(str, index, &hIconLarge, NULL, nIconSize); if (hres == NOERROR) { if (hIconLarge) { QImage image = getIconFromHandle(hIconLarge); DestroyIcon(hIconLarge); return image; } else { return getIconFromResource(iconResourceFile, index); } } else { return getIconFromResource(iconResourceFile, index); } } else { return getIconForFile(pidlChildItem); } pExtractIcon->Release(); } else { return getIconForFile(pidlChildItem); } } QImage FhoIcon::getIconForFile(LPCTSTR file, UINT basicFlags) { return getIconForFile(file, basicFlags, 0); } QImage FhoIcon::getIconForFile(LPCTSTR file, UINT basicFlags, DWORD basicAttributes) { SHFILEINFO finfo; HRESULT hres; memset(&finfo, 0, sizeof(SHFILEINFO)); hres = SHGetFileInfo(file, basicAttributes, &finfo, sizeof(SHFILEINFO), basicFlags | SHGFI_ICONLOCATION); if (hres) { QString iconResourceFile = QString::fromUtf16(finfo.szDisplayName); if (!iconResourceFile.isEmpty()) { return getIconFromResource(iconResourceFile, finfo.iIcon); } else { hres = FALSE; } } if (!hres) { memset(&finfo, 0, sizeof(SHFILEINFO)); hres = SHGetFileInfo(file, basicAttributes, &finfo, sizeof(SHFILEINFO), basicFlags | SHGFI_SYSICONINDEX); if (finfo.iIcon != 0) { HICON hIcon = ImageList_GetIcon((HIMAGELIST) hres, finfo.iIcon, ILD_TRANSPARENT); if (hIcon != NULL) { QImage image = getIconFromHandle(hIcon); hres = TRUE; DestroyIcon(hIcon); return image; } else { hres = FALSE; } } else { hres = FALSE; } if (!hres) { memset(&finfo, 0, sizeof(SHFILEINFO)); hres = SHGetFileInfo(file, basicAttributes, &finfo, sizeof(SHFILEINFO), basicFlags | SHGFI_ICON); if (hres) { QImage image = getIconFromHandle(finfo.hIcon); DestroyIcon(finfo.hIcon); return image; } else { return QImage(); } } } return QImage(); } QString FhoIcon::getImageIdForExtension(QString fileExtension) { if (!fileExtension.startsWith('.')) { fileExtension = "." + fileExtension; } return getImageIdForFile(fileExtension.utf16(), SHGFI_USEFILEATTRIBUTES, FILE_ATTRIBUTE_NORMAL); } QString FhoIcon::getImageIdForFile(QString fileName) { fileName = FhoEnv::expand(fileName); return getImageIdForFile(fileName.utf16(), 0); } QString FhoIcon::getImageIdForFile(LPITEMIDLIST pidl) { return getImageIdForFile((LPCTSTR)pidl, SHGFI_PIDL); } QString FhoIcon::getImageIdForFile(IShellFolder *psfParentItem, LPITEMIDLIST pidlChildItem) { HRESULT hres; IExtractIcon *pExtractIcon = NULL; hres = psfParentItem->GetUIObjectOf(NULL, 1, const_cast(&pidlChildItem), IID_IExtractIcon, NULL, reinterpret_cast(&pExtractIcon)); if (SUCCEEDED(hres)) { TCHAR str[MAX_PATH] = {0}; int index; UINT flags; // Get the file location where the icons are stored. hres = pExtractIcon->GetIconLocation(0, str, MAX_PATH, &index, &flags); if (SUCCEEDED(hres)) { QString iconResourceFile = QString::fromUtf16(str); // this may return "*" and does not always refer to a real existing file; see above! QString imageId = "@" + iconResourceFile + "," + QString::number(index); // did we already expand the resource file name? return imageId; } else { return getImageIdForFile(pidlChildItem); } pExtractIcon->Release(); } else { return getImageIdForFile(pidlChildItem); } } QString FhoIcon::getImageIdForFile(LPCTSTR file, UINT basicFlags) { return getImageIdForFile(file, basicFlags, 0); } QString FhoIcon::getImageIdForFile(LPCTSTR file, UINT basicFlags, DWORD basicAttributes) { // has to be kept in sync with getIconForFile(LPITEMIDLIST pidl) -> getIconForFile(LPCTSTR file, UINT basicFlags, DWORD basicAttributes)! // harmonize to use the same code! QString imageId; SHFILEINFO finfo; HRESULT hres; memset(&finfo, 0, sizeof(SHFILEINFO)); hres = SHGetFileInfo(file, basicAttributes, &finfo, sizeof(SHFILEINFO), basicFlags | SHGFI_ICONLOCATION); if (hres) { QString iconResourceFile = QString::fromUtf16(finfo.szDisplayName); if (!iconResourceFile.isEmpty()) { imageId = "@" + iconResourceFile + "," + QString::number(finfo.iIcon); return imageId; } else { hres = FALSE; } } if (!hres) { memset(&finfo, 0, sizeof(SHFILEINFO)); hres = SHGetFileInfo(file, basicAttributes, &finfo, sizeof(SHFILEINFO), basicFlags | SHGFI_SYSICONINDEX); if (finfo.iIcon != 0) { imageId = "[SYSIMAGELIST]:" + QString::number(finfo.iIcon); return imageId; } else { hres = FALSE; } if (!hres) { QString fallbackImageId; if (basicFlags & SHGFI_PIDL) { int minAsciiId = 33; // '!' int maxAsciiId = 126; // '~' int numAsciiIds = maxAsciiId - minAsciiId + 1; LPITEMIDLIST pidl = (LPITEMIDLIST)file; USHORT cb; fallbackImageId = "[ITEMIDLIST]:"; do { cb = pidl->mkid.cb; if (cb != NULL) { BYTE *abID = pidl->mkid.abID; for (unsigned int i = 0; i < (cb-sizeof(cb)); i++) { int chid = abID[i]; char ch = (char)(minAsciiId + (chid % numAsciiIds)); fallbackImageId += ch; } fallbackImageId += ' '; pidl = (LPITEMIDLIST)((int)pidl + cb); } } while (cb != NULL); } else { fallbackImageId = QString::fromUtf16(file); } imageId = fallbackImageId; } } return imageId; } QImage FhoIcon::getDefaultIcon() { return QImage(); } FhoIconCreator::FhoIconCreator() { forceDefaultImage = false; setImageType("png"); } FhoIconCreator::FhoIconCreator(QString path) { setImagePath(path); } void FhoIconCreator::setForceDefaultImage(bool useDefaultImage) { forceDefaultImage = useDefaultImage; } void FhoIconCreator::setImagePath(QString path) { imagePath = path; if (!QFile::exists(imagePath)) { QDir().mkpath(imagePath); } } void FhoIconCreator::setBaseImageFileName(QString name) { baseImageFileName = name; } void FhoIconCreator::setDefaultImageFileName(QString fileName) { defaultImageFileName = fileName; } void FhoIconCreator::setImageType(QString fileExtension) { setImageType("", fileExtension); } void FhoIconCreator::setImageType(QString type, QString fileExtension) { QList supportedFormats = QImageWriter::supportedImageFormats(); if (type.isEmpty()) { type = fileExtension; } if (supportedFormats.contains(type.toAscii())) { imageType = type; imageFileExtension = fileExtension; } } QString FhoIconCreator::saveImage(QImage &image, QString fileName) { if (!image.isNull()) { image.save(fileName, imageType.isEmpty() ? 0 : imageType.toAscii()); return fileName; } else { return defaultImageFileName; } } /* generates the file name of the image file */ QString FhoIconCreator::generateImageFileName(QString imageId) { if (forceDefaultImage) { return defaultImageFileName; } QString fileName = imagePath + "/" + baseImageFileName + QString::number(qHash(imageId), 16) + "." + imageFileExtension; return fileName; } /* returns the file name of an image file for a give image id */ QString FhoIconCreator::getImageFileName() { return defaultImageFileName; } /* creates an icon image from a HICON (if not already cached) and returns the file name */ QString FhoIconCreator::getImageFileName(HICON hIcon, QString imageId) { if ((forceDefaultImage) || (hIcon == NULL)) { return defaultImageFileName; } QString fileName = generateImageFileName(imageId); if (!QFile::exists(fileName)) { // create the icon file if it does not exist yet - otherwise, the existing file will be used! QImage image = FhoIcon::getIconFromHandle(hIcon); return saveImage(image, fileName); } return fileName; } /* creates an icon image (embedded in a file) from a resource description (like "my.dll,-1") (if not already cached) and returns the file name */ /* creates an icon image for a file or folder (the Icon Windows Explorer would display) */ QString FhoIconCreator::getImageFileName(QString resourceDescription) { if ((forceDefaultImage) || (resourceDescription.isEmpty())) { return defaultImageFileName; } QString fileName; if ((resourceDescription.startsWith('@')) || (resourceDescription.contains(','))) { // return from resource QString imageId = resourceDescription; // did we already expand the resource description? fileName = generateImageFileName(imageId); if (!QFile::exists(fileName)) { QImage image = FhoIcon::getIconFromResource(resourceDescription); return saveImage(image, fileName); } } else if (resourceDescription.startsWith('.')) { // return for extension QString imageId = FhoIcon::getImageIdForExtension(resourceDescription); fileName = generateImageFileName(imageId); if (!QFile::exists(fileName)) { QImage image = FhoIcon::getIconForExtension(resourceDescription); return saveImage(image, fileName); } } else { // return for file QString imageId = FhoIcon::getImageIdForFile(resourceDescription); fileName = generateImageFileName(imageId); if (!QFile::exists(fileName)) { QImage image = FhoIcon::getIconForFile(resourceDescription); return saveImage(image, fileName); } } return fileName; } /* creates an icon image (embedded in a file) from a file name including the resource (like "my.dll") and an icon index (like -3 or 3) (if not already cached) and returns the file name */ QString FhoIconCreator::getImageFileName(QString resourceFileName, int resourceIndex) { if ((forceDefaultImage) || (resourceFileName.isEmpty())) { return defaultImageFileName; } QString imageId = "@" + resourceFileName + "," + QString::number(resourceIndex); // did we already expand the resource file name? QString fileName = generateImageFileName(imageId); if (!QFile::exists(fileName)) { QImage image = FhoIcon::getIconFromResource(resourceFileName, resourceIndex); return saveImage(image, fileName); } return fileName; } QString FhoIconCreator::getImageFileName(LPITEMIDLIST pidl) { if (forceDefaultImage) { return defaultImageFileName; } QString imageId = FhoIcon::getImageIdForFile(pidl); QString fileName = generateImageFileName(imageId); if (!QFile::exists(fileName)) { QImage image = FhoIcon::getIconForFile(pidl); return saveImage(image, fileName); } return fileName; } QString FhoIconCreator::getImageFileName(IShellFolder *psfParentItem, LPITEMIDLIST pidlChildItem) { if (forceDefaultImage) { return defaultImageFileName; } QString imageId = FhoIcon::getImageIdForFile(psfParentItem, pidlChildItem); QString fileName = generateImageFileName(imageId); if (!QFile::exists(fileName)) { QImage image = FhoIcon::getIconForFile(psfParentItem, pidlChildItem); return saveImage(image, fileName); } return fileName; } launchy-2.5/plugins/controly/launchy.exit.png0000644000175000017500000000422311354223616020526 0ustar monesmonesPNG  IHDR szzsRGBgAMA a cHRMz&u0`:pQ< pHYs 9 9]ݳ'tEXtSoftwarePaint.NET v3.36%IDATXGV{PT?. D,DA VYo" "(j &2vJjLI7F1Ay";/F kj~u#3P=w{|߹-5 \P5rBcaa07Ә!O ;y/F/2#-lQݍDA~.ғW@&FDzC); {p+P{$OGן/Yk{𐘷;ݬ޸Ƶz5EmIN/ ؔ&}0ntZ~ nhF\h*GMU!J8xG%,}e/ Ar}jr߀+P mŏ(9u (&u42Rd[eFz"kqMŨ:= /p|lH#}>kow{SE驫-e>ʒc(:O vmLc9f{ܥ> ȱUtVxyiLve}5V#N>{e!#%{&lWtV gm2NΕc;O{W>[c`blߦ[ qd=a1 yW4.|:woGMؑuEvϮ%N$l՗`E%~~KLDmBjbcQl-\y84ٓQ7s<Th&Fuk5r4_c_mG6nJGJB$%4f<-6>5+V:* UPTvTGqh nhvWpEm/Ki80wn݀T$Z cn<:mjHT2$U; '~M<:e&eWqu \BbTCxvlG"sy<.i AA3 Uᏺj4xy2;ɯkܞdSde@UHKs܀;;g6…78e!Pj#p^;>qGTj]3tD~_H,[0|~}RG /Pd-WZG\v>FPl8@[x9aDoa]bb!"t&'8z & Qc3%Ws] [=—CNixjOrnx!.bV"~+#FxT+qc4P{CxpûQ㱞|﯎F |/D տvϱs&o.@D/ni$`@x_5 7?#y<~#"tF 32Ku4SS 4:ϋcJ{"/_ ۈ_u/ G%C%q޴ǫeT>T-x~qKs9zvIDfDd8i}9\%5d/xHp%xxxԄq1r:x"5?d 00l p! 3x%MNOdz%Xl.lCߙk6%d^/x5SWܱIENDB`launchy-2.5/plugins/controly/ControlPanelItemFinder.cpp0000644000175000017500000007655511313021641022466 0ustar monesmones// Copyright 2009 Fabian Hofsaess #include "precompiled.h" #include "ControlPanelItemFinder.h" #include "fhoenv.h" #include "fhoreg.h" #include "fhores.h" // amongst others, see "Control Panel Items" (ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/shellcc/platform/shell/programmersguide/extensibilty/conpanel.htm) // define common buffer size const DWORD DEFAULT_BUFFER_SIZE = 512; QHash ControlPanelItemFinder::cplItemCache; ControlPanelItemFinder::ControlPanelItemFinder(uint pluginId, FhoIconCreator *pIconGen, QList *pResultList) { controlyPluginId = pluginId; pIconCreator = pIconGen; pItems = pResultList; addControlPanelItself = true; avoidDuplicates = true; // currently, avoidDuplicates operates on the last possiblity it has, just avoiding to add items when they are about to be added // an optimization would be to exclude these items as soon as possible, thus avoiding to extract unnecessary information (like icon, etc.) and executing unnecessary queries!? addControlPanelSubfolderDepth = 0; // currently, do not use; always set to 0! // if set to 1: // good: this will add items in subfolders, like "Services", etc. in "Administrative Tools" // bad: this will also add all Fonts (in "Fonts" folder) - takes quite long and adds hundreds of unnecessary items! } ControlPanelItemFinder::~ControlPanelItemFinder() { } # void ControlPanelItemFinder::findItems() { // CoInitialize has to be called for current thread before calling SHGetFileInfo // getResult() and getCatalog() appear in different threads (main thread vs. catalog update thread!) HRESULT hres = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (FAILED(hres)) qWarning("findItems(), CoInitializeEx failed"); // order in which methods are called affects how details of some items are displayed, e.g. "GUID-path" vs. "normal path" or "GUID-path" vs. exe / shelldll / rundll / CSLID.controly / etc.; // adding items twice is avoided by cplItemNameCache, anyways! addSystem32CplControlPanelItems(); // use these first as they can handle the Mouse / Keyboard (main.cpl / main.cpl,@1) issue addRegistryCplControlPanelItems(); addShellInfoControlPanelItems(); // do not use this first, it does currently not handle the Mouse / Keyboard (main.cpl / main.cpl,@1) issue correctly! addRegistryExpNsControlPanelItems(); addControlPanel(); // clear local cache foreach (CachedCplItem *pItem, cplItemNameCache) { delete pItem; } cplItemNameCache.clear(); } /** finds Control Panel items (applets / applications) that are implemented as a library (in a DLL named *.CPL, supposed to expose the CPlApplet function) and reside in the Windows\System32 directory (those do not necessarily need to be registered in the registry) */ void ControlPanelItemFinder::addSystem32CplControlPanelItems() { // Get a list of all CPL files in the system directory TCHAR sysDirBuffer[DEFAULT_BUFFER_SIZE]; if (GetSystemDirectory(sysDirBuffer, DEFAULT_BUFFER_SIZE)) { // GetSystemDirectory() function is provided primarily for compatibility, it is recommended to use SHGetFolderPath()! QString sysDirPath = QString::fromUtf16(sysDirBuffer); QDir sysDir(sysDirPath); QFileInfoList cplFiles = sysDir.entryInfoList(QStringList("*.cpl"), QDir::Files, QDir::Unsorted); foreach(QFileInfo cplFileInfo, cplFiles) { addCplControlPanelItem(&cplFileInfo); } } } /** finds Control Panel items (applets / applications) that are implemented as a library (in a DLL named *.CPL, supposed to expose the CPlApplet function) and that are registered in the registry (they may reside in any directory) */ void ControlPanelItemFinder::addRegistryCplControlPanelItems() { // addRegistryCplControlPanelItems() and addSystem32CplControlPanelItems() may both find the same items // The local cache (cplItemNameCache) will take care to skip double entries! // 1. items available for all users: // HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Control Panel\Cpls // -> name with REG_EXPAND_SZ value representing the path QStringList *cplPaths = FhoReg::EnumValues(HKEY_LOCAL_MACHINE, QString("Software\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls")); for (int i = 0; i < cplPaths->size(); i++) { QString cplPath = (*cplPaths)[i]; QFileInfo cplFileInfo(cplPath); if ((!cplFileInfo.isFile()) || (!cplFileInfo.exists())) { // some items are given without their full path // (e.g. 'firewall.cpl', 'netsetup.cpl' instead of e.g. 'C:\Programme\Gemeinsame Dateien\Microsoft Shared\Speech\sapi.cpl' // we skip them, assuming they reside in system32 and are already handled with the system32 Cpl items above } else { addCplControlPanelItem(&cplFileInfo); } } delete cplPaths; // on Vista, you can specify // HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Control Panel\ExtendedProperties\System.Software.AppId // -> %ProgramFiles%\MyCorp\MyApp\MyCpl.cpl={A newly generated GUID} // is this additionally (meaning we find this items with the 'xp method' here anyways) or an alternative (meaning we would have to check this additionally)? // 2. items available per user: // same with HKEY_CURRENT_USER instead of HKEY_LOCAL_MACHINE!? // is this necessary? } /** adds Control Panel items (applets / applications) that are implemented as a library (in a DLL named *.CPL, supposed to expose the CPlApplet function) */ void ControlPanelItemFinder::addCplControlPanelItem(QFileInfo *pCplFileInfo) { // on Vista, some CPLs are still DLLs, but do not export CPlApplet any more // (e.g. Software/Add Remove Programs/Programs and Functions (appwiz.cpl), Firewall, etc.)! // these will be handled by other methods and have to be skipped here! QString cplFileName = pCplFileInfo->fileName(); QString cplFullPath = QDir::toNativeSeparators(pCplFileInfo->absoluteFilePath()); if (cplItemCache.contains(cplFileName)) { // file already indexed before, info stored in cache // remember to handle all items stored in the library, not only the first one... int i = 0; bool itemFound; do { QString fileName; QString fullPath; if (i == 0) { // first item (dialog) implemented in library (application) fileName = cplFileName; fullPath = cplFullPath; } else { // other items (dialogs) implemented in library (application) fileName = cplFileName + ",@" + QString::number(i); fullPath = cplFullPath + ",@" + QString::number(i); } if (cplItemCache.contains(fileName)) { // add the item from the cache, continue searching for sub-items addControlPanelItem(fileName); itemFound = true; } else { // stop searching for sub-items itemFound = false; } i++; } while (itemFound); return; } // item already in cache bool itemAdded = false; // has at least one item been successfully added? // Library Handle to *.cpl file HINSTANCE hCplLib = LoadLibrary(cplFullPath.utf16()); if (hCplLib) { // Pointer to CPlApplet() function APPLET_PROC CplCall = (APPLET_PROC) GetProcAddress(hCplLib, "CPlApplet"); if (CplCall) { if (CplCall(NULL, CPL_INIT, 0, 0)) { int cplCount = CplCall(NULL, CPL_GETCOUNT, 0, 0); for (int i = 0; i < cplCount; i++) { int pluginId; QString fileName; QString fullPath; if (i == 0) { // first item (dialog) implemented in library (application) fileName = cplFileName; fullPath = cplFullPath; pluginId = 0; // execution can be directly handled by Launchy main } else { // other items (dialogs) implemented in library (application) fileName = cplFileName + ",@" + QString::number(i); fullPath = cplFullPath + ",@" + QString::number(i); pluginId = controlyPluginId; // execute has to be handled by plugin itself! } QString name; QString iconPath; // prefer INQIURE over NEWINQUIRE, do only use NEWINQUIRE if information (icon / name) is not returned (empty or CPL_DYNAMIC_RES) // this is the preferred way according to Microsoft documentation (for performance), although NEWINQUIRE was initially intended to replace INQUIRE, it has already been deprecated! // but be aware that some apps may return string ids that do not yield a result (although being returned) // For the result of CplApplet() function (CplCall()) with CPL_INQUIRE and CPL_NEWINQUIRE, // the MS documentation states that 0 *should* be returned on success, // but other part of the documentation states that the return value is ignored. // Thus, we ignore the return code (there are items that return 0 on success, others return 1 on success, and so on) // Case #1, try CPL_INQUIRE first CPLINFO cplInfo; CplCall(NULL, CPL_INQUIRE, i, (LPARAM)&cplInfo); if (cplInfo.idName != CPL_DYNAMIC_RES) { name = FhoRes::getResourceString(hCplLib, cplInfo.idName); } if (cplInfo.idIcon != CPL_DYNAMIC_RES) { iconPath = pIconCreator->getImageFileName(cplFullPath, -abs(cplInfo.idIcon)/*, file*/); } if ((name.isEmpty()) || (iconPath.isEmpty())) { union { NEWCPLINFOA NewCplInfoA; NEWCPLINFOW NewCplInfoW; } cplNewInfo; cplNewInfo.NewCplInfoA.dwSize = 0; cplNewInfo.NewCplInfoA.dwFlags = 0; CplCall(NULL, CPL_NEWINQUIRE, i, (LPARAM)&cplNewInfo); if (cplNewInfo.NewCplInfoA.dwSize == sizeof(NEWCPLINFOW)) { // Case #2a, CPL_NEWINQUIRE has returned an Unicode String if (iconPath.isEmpty()) { HICON hIcon = cplNewInfo.NewCplInfoW.hIcon; if (hIcon != NULL) { iconPath = pIconCreator->getImageFileName(hIcon, fileName); } } if (name.isEmpty()) { name = QString::fromUtf16(cplNewInfo.NewCplInfoW.szName); } } else if (cplNewInfo.NewCplInfoA.dwSize == sizeof(NEWCPLINFOA)) { // Case #2b, CPL_NEWINQUIRE has returned an ANSI String if (iconPath.isEmpty()) { HICON hIcon = cplNewInfo.NewCplInfoA.hIcon; if (hIcon != NULL) { iconPath = pIconCreator->getImageFileName(hIcon, fileName); } } if (name.isEmpty()) { name = QString(cplNewInfo.NewCplInfoA.szName); } } // else Case #2c, CPL_NEWINQUIRE did not succeed! } // name or iconPath still empty after CPL_INQUIRE if ((name.isEmpty()) || (iconPath.isEmpty())) { // fallback if name or iconPath are still empty after CPL_INQUIRE and CPL_NEWINQUIRE if (iconPath.isEmpty()) { // use Controly default icon iconPath = pIconCreator->getImageFileName(); } if (name.isEmpty()) { name = fileName; } } addControlPanelItem(fullPath, name, pluginId, iconPath, fileName); itemAdded = true; } // for cplCount CplCall(NULL, CPL_EXIT, 0, 0); } // if CPL_INIT } // if CplCall FreeLibrary(hCplLib); } // if hCplLib if (!itemAdded) { // mark the item as invalid in the cache (getting the info failed, do not retry to get the information - it will probably fail in the future, also) if (!cplItemCache.contains(cplFileName)) { cplItemCache[cplFileName] = NULL; } } } /** finds Control Panel items (applets / applications) (implemented as a executables, for example) that are registered under the 'Explorer Namespace' in the registry (e.g. via their GUID / CLSID) */ void ControlPanelItemFinder::addRegistryExpNsControlPanelItems() { /* HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\{0052D9FC-6764-4D29-A66F-2F3BD9E2BB40} -> (Default) = 'My Settings' (name for control panel item, optional) HKEY_CLASSES_ROOT\CLSID\{0052D9FC-6764-4D29-A66F-2F3BD9E2BB40} *-> (Default) = [REG_SZ] 'My Settings' (display name of control panel item) *-> LocalizedString= [REG_EXPAND_SZ] @%ProgramFiles%\MyApp.exe,-9 (module + string table id of localized name, optional) -> InfoTip= [REG_EXPAND_SZ] @%ProgramFiles%\MyApp.exe,-5 (description / tooltip) -> System.ApplicationName= [REG_SZ] MyCompany.MySettings (canonical name to open app) -> System.ControlPanel.Category= [REG_SZ] 1,8 -> System.Software.TasksFileUrl= [REG_SZ or REG_EXPAND_SZ] "%ProgramFiles%\MyApp\MyTaskLinks.xml HKEY_CLASSES_ROOT\CLSID\{0052D9FC-6764-4D29-A66F-2F3BD9E2BB40}\DefaultIcon -> (Default) = [REG_EXPAND_SZ] %ProgramFiles%\MyApp.exe,-2 (path to file that contains icon, including resource id of icon image in that file) HKEY_CLASSES_ROOT\CLSID\{0052D9FC-6764-4D29-A66F-2F3BD9E2BB40}\Shell\Open\Command *-> (Default) = [REG_EXPAND_SZ] %ProgramFiles%\MyApp.exe /Settings (command to open / launch item) */ // do we have to check the 'don't load' registry key in getRegistryDLLControlPanelItems / getSystem32ControlPanelItems!? // some items do not store a guid/clsid but some human readable identifier - but these won't find something under HKCR\CLDSI later... QStringList *clsidSubKeyNames = FhoReg::EnumSubKeys(HKEY_LOCAL_MACHINE, QString("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace")); for (int i = 0; i < clsidSubKeyNames->size(); i++) { QString guid = (*clsidSubKeyNames)[i]; if (cplItemCache.contains(guid)) { // file already indexed before, info stored in cache addControlPanelItem(guid); continue; } // there are also some name value pairs under this key // for some items, the standard value is the name, // for others there is a 'Name' name where the value is the name of the item, // some items have additional information // we currently ignore all of these values here bool itemAdded = false; // has an item been successfully added? HKEY hkClsidFolder = FhoReg::OpenKey(HKEY_CLASSES_ROOT, QString("CLSID\\" + guid), KEY_QUERY_VALUE); if (hkClsidFolder != 0) { QString displayName = FhoReg::GetKeyDefaultValue(hkClsidFolder); QString localizedNameResource = FhoReg::GetKeyValue(hkClsidFolder, QString("LocalizedString")); // e.g. '@%SystemRoot%\system32\SHELL32.dll,-32517' QString localizedName = FhoRes::getResourceString(localizedNameResource); HKEY hkIconFolder = FhoReg::OpenKey(hkClsidFolder, QString("DefaultIcon"), KEY_QUERY_VALUE); QString iconResourceName; if (hkIconFolder != 0) { iconResourceName = FhoReg::GetKeyDefaultValue(hkIconFolder); } HKEY hkCmdFolder = FhoReg::OpenKey(hkClsidFolder, QString("Shell\\Open\\Command"), KEY_QUERY_VALUE); if (hkCmdFolder == 0) { // Under Windows Vista, some dll cpls (not only exe cpls) are defined this way // however, they do not store an executable under Shell\Open\Command, but a library under InProcServer32 // for example, this applies to appwiz.cpl (which resides in the system32 directory), // but it does not expose the CPlApplet function and therefore fails to load 'the normal way' // (it would normally have been handled by addSystem32CplControlPanelItems() and/or addRegistryCplControlPanelItems)! // Even WinXP finds some items this way, however these are plain .dlls and not .cpls. // (e.g. Fonts, Administrative Tools, -> handled below // Scheduled Tasks, Scanner and Kameras, [Printer and Fax], [Mail] -> handled using other methods) hkCmdFolder = FhoReg::OpenKey(hkClsidFolder, QString("InProcServer32"), KEY_QUERY_VALUE); } if (hkCmdFolder != 0) { QString itemLaunchCommand = FhoReg::GetKeyDefaultValue(hkCmdFolder); QString path = FhoEnv::expand(itemLaunchCommand); // expand, some items are stored with %SystemRoot% placeholders, for example (e.g. on Vista) QString desc = localizedName; // prefer to use the localized display to the 'normal' display name (doesn't really seem to matter on XP for most items, but makes a big difference on Vista) if (desc.isEmpty()) { desc = displayName; } int pluginId; bool addItem = true; QStringList spl = path.split(".exe "); if (spl.size() == 1) { // just the executable itself (or a cpl, or a simple dll that we currently don't handle) pluginId = 0; // can probably be executed directly if (!path.contains(".exe") && !path.contains(".cpl")) { // .exe and .cpl are added, others (like .dll) are not! // if only a dll (no exe or cpl) is given: // as a last resort, try to launch it via the application name (e.g. 'control.exe /name Microsoft.WindowsUpdate') QString applicationName = FhoReg::GetKeyValue(hkClsidFolder, QString("System.ApplicationName")); if (!applicationName.isEmpty()) { pluginId = controlyPluginId; // execute has to be handled by plugin itself! path = "control.exe /name " + applicationName; } else { // check if we have a shell extension object / shell namespace extension (special shell folder extension, "virtual folder") that is listed in the control panel (fonts or admin tools) QString sf = FhoReg::GetKeyValue(hkClsidFolder, QString("Instance\\InitPropertyBag"), QString("TargetSpecialFolder")); if (!sf.isEmpty()) { // shell instance object pluginId = controlyPluginId; // Constant special item ID list (CSIDL) / csidl / specialfolder / shellfolder / specialshellfolder / shellinstance path = "csidl:" + sf + ".controly"; } else { // we are still missing some items referenced in the control panel // e.g. on XP: // ("Scheduled Tasks", "{D6277990-4C6A-11CF-8D87-00AA0060F5BF}", "C:\WINDOWS\System32\mstask.dll") -> found via getShellInfoControlPanelItems // ("Scanner and Cameras", "{E211B736-43FD-11D1-9EFB-0000F8757FCD}", "wiashext.dll") -> found via getShellInfoControlPanelItems // ("Network Connections", "{7007ACC7-3202-11D1-AAD2-00805FC1270E}", "C:\WINDOWS\system32\NETSHELL.dll") -> found via ncpa.cpl // ("Printers and Fax") -> found via getShellInfoControlPanelItems // ("Mail") -> found via getShellInfoControlPanelItems // e.g. on Vista: // ("Indesig options") -> found via getShellInfoControlPanelItems // ("Text-to-Speech") -> found via getShellInfoControlPanelItems // ("Mail") -> found via getShellInfoControlPanelItems // -> These items are found using other methods addItem = false; } } } } else if (spl.size() == 2) { // the executable with command line parameters // be aware that we currently assume that the path to the executable does not contain blanks! pluginId = controlyPluginId; // execute has to be handled by plugin itself! } else { // not expected - currently not handled addItem = false; // ? } if (addItem) { QString iconPath = pIconCreator->getImageFileName(iconResourceName/*, file*/); addControlPanelItem(path, desc, pluginId, iconPath, guid); itemAdded = true; } FhoReg::CloseKey(hkCmdFolder); } // hkCmdFolder FhoReg::CloseKey(hkClsidFolder); } // hkClsidFolder if (!itemAdded) { // mark the item as invalid in the cache (getting the info failed, do not retry to get the information - it will probably fail in the future, also) if (!cplItemCache.contains(guid)) { cplItemCache[guid] = NULL; } } } // for clsidSubKeyNames delete clsidSubKeyNames; } /** finds Control Panel items (applets / applications) by browsing the ControlPanel virtual folder (there seem to be some exceptions / small gaps, but this approach alone should *theoretically* find all items!) */ void ControlPanelItemFinder::addShellInfoControlPanelItems() { LPITEMIDLIST pidlCplAbs; HRESULT hres = SHGetFolderLocation(NULL, CSIDL_CONTROLS, NULL, 0, &pidlCplAbs); if (hres == S_OK) { IShellFolder *psfDeskTop = NULL; hres = SHGetDesktopFolder(&psfDeskTop); if (hres == NOERROR) { if (addControlPanelItself) { // add control panel itself and the subitems contained within // try to get relative pidl from absolute pidl IShellFolder *psfParent = NULL; LPCITEMIDLIST pidlCplRel; hres = SHBindToParent(pidlCplAbs, IID_IShellFolder, (LPVOID *) &psfParent, &pidlCplRel); if (hres == S_OK) { // if possible, use relative pidl (as done in all following requests) addShellInfoItem((LPITEMIDLIST)pidlCplRel, psfParent, true, addControlPanelSubfolderDepth+1, psfDeskTop); psfParent->Release(); } else { // fallback (we probably never run into this): use absolute pidl (all following requests will use relative pidl) addShellInfoItem(pidlCplAbs, psfDeskTop, false, addControlPanelSubfolderDepth+1, psfDeskTop); } } else { // add control panel contents, but not the item itself IShellFolder *psfCpl = NULL; hres = psfDeskTop->BindToObject(pidlCplAbs, NULL, IID_IShellFolder, (LPVOID *) &psfCpl); if (hres == S_OK) { addShellInfoItems(psfCpl, addControlPanelSubfolderDepth, psfDeskTop); // do not do this! psfCpl->Release(); } } psfDeskTop->Release(); } CoTaskMemFree(pidlCplAbs); } } /** Adds a single item (e.g. "file" or "folder", which may be virtual files or folders) If specified, also adds all child items in case of a "folder" (if addSubItemDepths > 0) */ void ControlPanelItemFinder::addShellInfoItem(LPITEMIDLIST pidlItems, IShellFolder *psfParentItem, bool isRelativePidl, int addSubItemDepths, IShellFolder *psfDeskTop) { STRRET strDispName; HRESULT hres = psfParentItem->GetDisplayNameOf(pidlItems, SHGDN_NORMAL, &strDispName); if (hres == S_OK) { TCHAR pszDisplayName[MAX_PATH]; hres = StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH); if (hres == S_OK) { QString cplDesc; // name cplDesc = QString::fromUtf16(pszDisplayName); bool itemAdded = false; hres = psfParentItem->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING | SHGDN_NORMAL, &strDispName); // absolute parse name (relative to desktop) if (hres == S_OK) { hres = StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH); if (hres == S_OK) { QString cplPath; // launch command cplPath = QString::fromUtf16(pszDisplayName); QString cacheId = cplDesc + "-" + cplPath; // use all info, because e.g. Mouse and Keyboard both have the path 'c:\windows\system32\main.cpl'! if (cplItemCache.contains(cacheId)) { // already indexed before, info stored in cache addControlPanelItem(cacheId); itemAdded = true; } else { LPITEMIDLIST pidlItem = NULL; // absolute pidl //ULONG attr = 0; //ULONG attr = SFGAO_COMPRESSED; hres = psfDeskTop->ParseDisplayName(NULL, NULL, pszDisplayName, NULL, &pidlItem, /*&attr*/ NULL); if (hres == S_OK) { QString iconPath; if (!isRelativePidl) { // either use an absolute pidl... // (will return 'normal' folder icons for fonts (schriftarten) and for administrative tools (verwaltung) iconPath = pIconCreator->getImageFileName(pidlItem); // with absolute pidl, could also use SHGetFileInfo() to extract icon!? } else { // ...or a relative (single-level!?) pidl with parent // (will return correct icons also for fonts and for administrative tools, but cannot be used for control panel here if this is passed in as an absolute pidl!) iconPath = pIconCreator->getImageFileName(psfParentItem, pidlItems); } // local cache is checked in this method, but this does not avoid the unnecessary call to the iconCreator!? // can we use the global cache here? addControlPanelItem(cplPath, cplDesc, 0 /*HASH_controly*/, iconPath, cacheId); itemAdded = true; CoTaskMemFree(pidlItem); } else { // currently, the "relative" approach is the fallback; should we prefer it? hres = psfParentItem->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING | SHGDN_INFOLDER, &strDispName); // relative parse name (relative to parent folder) if (hres == S_OK) { hres = StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH); // some items just return their name for the full path, e.g. "Mail" // these are handled by some of the fallbacks below, but what also could be done is // to build their launch path using the base Control Panel (or all Control Panel Elements) "path" plus their name, e.g.: // "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\Mail" on WinXP or // "::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\Maus" on Win7 // we can just use the parse name as the launch command, see above if (hres == S_OK) { cplPath = QString::fromUtf16(pszDisplayName); // launch command (e.g. full path!?) cacheId = cplDesc + "-" + cplPath; if (cplItemCache.contains(cacheId)) { // already indexed before, info stored in cache addControlPanelItem(cacheId); itemAdded = true; } else { hres = psfDeskTop->ParseDisplayName(NULL, NULL, pszDisplayName, NULL, &pidlItem, /*&attr*/ NULL); // although this is a relative parse name, it only succeeds beeing executed from desktop (?); the format always seems to be an absolute path to a .cpl file! if (hres == S_OK) { QString iconPath; if (!isRelativePidl) { // either use an absolute pidl... // (will return 'normal' folder icons for fonts (schriftarten) and for administrative tools (verwaltung) iconPath = pIconCreator->getImageFileName(pidlItem); } else { // ...or a relative pidl with parent // (will return correct icons also for fonts and for administrative tools, but cannot be used for control panel here if this is passed in as an absolute pidl!) iconPath = pIconCreator->getImageFileName(psfParentItem, pidlItems); } addControlPanelItem(cplPath, cplDesc, 0 /*HASH_controly*/, iconPath, cacheId); itemAdded = true; CoTaskMemFree(pidlItem); } else { // ? } } } } } } } } } } if (addSubItemDepths > 0) { ULONG uAttr = SFGAO_FOLDER; psfParentItem->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr); if (uAttr & SFGAO_FOLDER) { IShellFolder *psfSubFolder = NULL; hres = psfParentItem->BindToObject(pidlItems, NULL, IID_IShellFolder, (LPVOID *) &psfSubFolder); if (hres == S_OK) { addShellInfoItems(psfSubFolder, addSubItemDepths-1, psfDeskTop); } } } } /** Adds all child items (e.g. "files" or "folders", which may be virtual files or folders) of a parent "folder" */ void ControlPanelItemFinder::addShellInfoItems(IShellFolder *psfParentItem, int addSubItemDepths, IShellFolder *psfDeskTop) { // use cache!? HRESULT hres; LPENUMIDLIST ppenum = NULL; ULONG celtFetched; LPITEMIDLIST pidlItems = NULL; // relative pidl hres = psfParentItem->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum); while( ((hres = ppenum->Next(1, &pidlItems, &celtFetched)) == S_OK) && (celtFetched == 1)) { addShellInfoItem(pidlItems, psfParentItem, true, addSubItemDepths, psfDeskTop); CoTaskMemFree(pidlItems); // pMalloc->Free(pidlItems); } ppenum->Release(); psfParentItem->Release(); // the normal execute command (or windows explorer) understand the paths we extract above (including those in the '::{GUID}\{GUID}' format) } /** adds control panel itself */ void ControlPanelItemFinder::addControlPanel() { // works as expected on XP with "classic control panel view", may have different behavior with XP/Vista/Win7 "category view" if (addControlPanelItself) { QString cplDesc; // name QString cplPath; // launch command // Constant special item ID list (CSIDL) / csidl / specialfolder / shellfolder / specialshellfolder / shellinstance cplPath = QString("csidl:") + QString("0x%1").arg(CSIDL_CONTROLS, 4, 16, QChar('0')) + ".controly"; // we could also just use this: // cplPath = "control.exe"; if (cplItemCache.contains(cplPath)) { // file already indexed before, info stored in cache addControlPanelItem(cplPath); } else { bool itemAdded = false; // has the item been successfully added? LPITEMIDLIST pidlCpl; HRESULT hres = SHGetFolderLocation(NULL, CSIDL_CONTROLS, NULL, 0, &pidlCpl); if (hres == S_OK) { SHFILEINFO cplFileInfo; memset(&cplFileInfo, 0, sizeof(SHFILEINFO)); if (SHGetFileInfo((LPCTSTR)pidlCpl, 0, &cplFileInfo, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_DISPLAYNAME)) { cplDesc = QString::fromUtf16(cplFileInfo.szDisplayName); } else { // similar to addShellInfoItem, fallback may not be necessary!? IShellFolder *psfDeskTop = NULL; STRRET strDispName; hres = SHGetDesktopFolder(&psfDeskTop); hres = psfDeskTop->GetDisplayNameOf(pidlCpl, SHGDN_NORMAL, &strDispName); psfDeskTop->Release(); TCHAR pszDisplayName[MAX_PATH]; hres = StrRetToBuf(&strDispName, pidlCpl, pszDisplayName, MAX_PATH); if (hres == S_OK) { cplDesc = QString::fromUtf16(pszDisplayName); } } QString iconPath = pIconCreator->getImageFileName(pidlCpl/*, cplPath*/); addControlPanelItem(cplPath, cplDesc, controlyPluginId, iconPath, cplPath); itemAdded = true; CoTaskMemFree(pidlCpl); } if (!itemAdded) { // mark the item as invalid in the cache (getting the info failed, do not retry to get the information - it will probably fail in the future, also) if (!cplItemCache.contains(cplPath)) { cplItemCache[cplPath] = NULL; } } } } } void ControlPanelItemFinder::addControlPanelItem(QString &cacheId) { // add item from cache! if (cplItemCache.contains(cacheId)) { CachedCplItem *pCachedItem = cplItemCache[cacheId]; if (pCachedItem != NULL) { addControlPanelItem(pCachedItem->path, pCachedItem->name, pCachedItem->pluginId, pCachedItem->icon, cacheId); } } } void ControlPanelItemFinder::addControlPanelItem(QString &path, QString &name, int pluginId, QString &iconPath, QString &cacheId) { // path: the 'full path' or the 'launch command' (used to launch the item) // name: the 'short name' or 'description' (displayed to identify the icon) // cacheId: the file name or any other id identifying the item in the cache (cache not used if string is empty) if (!cacheId.isEmpty()) { if (!cplItemCache.contains(cacheId)) { cplItemCache[cacheId] = new CachedCplItem(path, name, iconPath, pluginId); } } bool duplicate = cplItemNameCache.contains(name); if (!duplicate) { // avoid adding same element multiple times for different control panel browse methods // no duplicate: first occurence of item - add in any case pItems->push_back(CatItem(path, name, pluginId, iconPath)); cplItemNameCache[name] = new CachedCplItem(path, name, iconPath, pluginId); // currently, there is no plugin deinit or unload (?), thus objects created with new will not be deleted! } else { // duplicate: repeated occurence of item - skip (if avoidDuplicates is enabled) or add again (if avoidDuplicates is disabled) if (!avoidDuplicates) { pItems->push_back(CatItem(path, name, pluginId, iconPath)); // see above and decide which actions need to be taken (local cache, global cache, etc.) // how to deal with cache in this case? } } } launchy-2.5/plugins/controly/fhoreg.cpp0000644000175000017500000000626511262221417017366 0ustar monesmones// Copyright 2009 Fabian Hofsaess #include "precompiled.h" #include "fhoreg.h" // currently, we assume that all reg values are returned as strings HKEY FhoReg::OpenKey(HKEY baseKey, QString &subKeyName, DWORD options) { HKEY k; LONG l = RegOpenKeyEx(baseKey, subKeyName.utf16(), 0, options, &k); if (l == ERROR_SUCCESS) { return k; } return 0; } void FhoReg::CloseKey(HKEY key) { if (key != 0) { RegCloseKey(key); } } QStringList* FhoReg::EnumValues(HKEY parentKey, QString &parentSubKeyName) { QStringList *resultList = new QStringList(); HKEY k = OpenKey(parentKey, parentSubKeyName, KEY_QUERY_VALUE); if (k != 0) { DWORD idx = 0; TCHAR valueName[maxSize]; BYTE valueData[maxSize]; LONG l; do { DWORD size = maxSize; DWORD size2 = maxSize; DWORD type; l = RegEnumValue(k, idx, valueName, &size, NULL, &type, valueData, &size2); if (l == ERROR_SUCCESS) { QString name = QString::fromUtf16(valueName); QString data = QString::fromUtf16((const ushort*) valueData); resultList->append(data); } idx++; } while (l != ERROR_NO_MORE_ITEMS); CloseKey(k); } return resultList; } QStringList* FhoReg::EnumSubKeys(HKEY key) { QStringList *resultList = new QStringList(); if (key != 0) { DWORD idx = 0; TCHAR keyName[maxSize]; LONG l; do { DWORD size = maxSize; l = RegEnumKeyEx(key, idx, keyName, &size, NULL, NULL, NULL, NULL); if (l == ERROR_SUCCESS) { QString subKeyName = QString::fromUtf16(keyName); resultList->append(subKeyName); } idx++; } while (l != ERROR_NO_MORE_ITEMS); } return resultList; } QStringList* FhoReg::EnumSubKeys(HKEY parentKey, QString &parentSubKeyName) { QStringList *resultList; HKEY k = OpenKey(parentKey, parentSubKeyName, KEY_ENUMERATE_SUB_KEYS); if (k != 0) { resultList = EnumSubKeys(k); CloseKey(k); } else { resultList = new QStringList(); } return resultList; } QString FhoReg::GetKeyValue(HKEY key, QString &valueName) { DWORD type; BYTE keyVal[maxSize]; DWORD sz = maxSize; LONG l = RegQueryValueEx(key, (!valueName.isEmpty()) ? valueName.utf16() : NULL, NULL, &type, keyVal, &sz); if (l == ERROR_SUCCESS) { QString keyValue = QString::fromUtf16((const ushort*) keyVal); return keyValue; } return NULL; } QString FhoReg::GetKeyValue(HKEY parentKey, QString &parentSubKeyName, QString &valueName) { HKEY k = OpenKey(parentKey, parentSubKeyName, KEY_QUERY_VALUE); QString value; if (k != 0) { value = GetKeyValue(k, valueName); CloseKey(k); } return value; } QString FhoReg::GetKeyDefaultValue(HKEY key) { return GetKeyValue(key, QString()); } QString FhoReg::GetKeyDefaultValue(HKEY parentKey, QString &parentSubKeyName) { HKEY k = OpenKey(parentKey, parentSubKeyName, KEY_QUERY_VALUE); QString value; if (k != 0) { value = GetKeyDefaultValue(k); CloseKey(k); } return value; } launchy-2.5/plugins/controly/launchy.options.png0000644000175000017500000000412111354223616021245 0ustar monesmonesPNG  IHDR szzsBIT|dIDATXkPT]eeA.j:BDcjLS`AtR)budHd:m´Z FƚN(-.,{fVg}y{3nCMMrHܗ`PxTH ȑ#&i@[8L'~ĻU([Jw>|O>+l&=Hp`ڬ$IwYuuuSeu_-.(@bJaWx;(eRUU^$d-Ȧ zÂ꣯NZwLƛLf֜EVAAhR%o2STUUk%/Lz\8YV3˲e$I H [ /&`^漂(#{VͲK'4*r,Zrs$8h a0 dY?0EV "k pGYq٢;!L'Tvsg.j% Т(j6 Hhuu X3v~)dKW)"T1ߔa?[[ "q^', .WfzP̒Wǚ##ڽb<6b$;:! $g(׮64>gTTTx'紟ⰥnޮenŞ&- (2&!!!ʍ5_:N䥦lȲn..L&z9<ƛM5#?g.hp8IY K mnn{Z|.n.^*qˍN06 <~YwKrPqSH%?f^Eԕ A~ ~`!> .7~)EQ@$^(XNl91uuuS:%@Zq.>\̤>} NVDK,K  Qbk6[Vx)/֚Y3`S^!)> %vԍPZZިʖˍ^AdYX"Vn<7H.n[m1Z< 14F =.pxr8սm\sX E3?=c-)(s~9+#3fFiqftv . Hm.X)iOF{WeYE  \D^8p`PWbLCFi3M8xz`6@ꬸ7*RTPg$MzQq!~x<DEE$,N-CL:]:vf4MHEk[wn?ݤhgK?рa2"(,*y94QNB׃6vbO/4q( @?W\yy9w{_pI#^oOe"ֶ'+M3.]BWx_ . "a0j%{LaE[Q C Xύ[>[8h¹!LOT(BDcL̊6&,Y{[n>扨V8<c.Sx|b%W/IENDB`launchy-2.5/plugins/controly/globals.h0000644000175000017500000000150111262221417017170 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GLOBALS_CONTROLY_H #define GLOBALS_CONTROLY_H #endif launchy-2.5/plugins/controly/dlg.ui0000644000175000017500000000071611262221417016510 0ustar monesmones Dlg 0 0 411 271 Controly - Index Control Panel applications launchy-2.5/plugins/controly/controly.pro0000644000175000017500000000215011262221417017770 0ustar monesmonesTEMPLATE = lib CONFIG += plugin \ release VPATH += ../../src/ INCLUDEPATH += ../../src/ PRECOMPILED_HEADER = precompiled.h DEFINES += WITH_GUI # UI_DIR = ../../plugins/controly/ FORMS = dlg.ui HEADERS = plugin_interface.h \ controly.h \ gui.h \ ControlPanelItemFinder.h \ fhoicon.h \ fhoenv.h \ fhoreg.h \ fhores.h \ precompiled.h SOURCES = plugin_interface.cpp \ controly.cpp \ gui.cpp \ ControlPanelItemFinder.cpp \ fhoicon.cpp \ fhoenv.cpp \ fhoreg.cpp \ fhores.cpp TARGET = controly win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib LIBS += user32.lib LIBS += Gdi32.lib LIBS += comctl32.lib LIBS += Advapi32.lib LIBS += ole32.lib LIBS += shlwapi.lib } # *:debug { # DESTDIR = ../../debug/plugins/ # } # *:release { # DESTDIR = ../../release/plugins/ # %QMAKE_CXXFLAGS += /Ox /Ob2 /Oi /Oy /GT /GA /WX # } if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/plugins launchy-2.5/plugins/controly/controly.ico0000644000175000017500000002154610673261500017756 0ustar monesmones  F  hh( @ KKC"IIEBMIIBMIIBMIIBMMIBMMIBMMMBMMMBMMMBMMMBQMMBQQMBQQQBQQQBQQQBQQQBQQQBQQQBQQMBQMMBMMMBMMMBMMMBMMIBMMIBMMIBMIIBMIIBMIIBIEEB333~ǽȾIJDzɲ̲ϲҲղز۲޲߲߲ܲٲزղҲβ˲ȲŲ²ȾXTQQ϶б]ZWREw\̘WМMōn]ZWRm`ȕXҟ?w]ZWRu|ʣvڲU]ZWR¥չ׼]ZWR]ZWR]ZWRů[Ss]ZWREݸjحTΙIv]ZWRf}ϧfӤCy]ZWRvĜسݻg]ZWR̶]ZWR]ZWR]ZWRYKÉQɒJ­]ZWRzOÊXҟ?t``]WkΨvܵڵL|ddaY̸ťֶٺ{ddaYνμddaYddaYw_y`|acdfhjlnpƟqˢsϥtҧuѧuͤtɡrĞqomkigfd~b{ax_}ddaYkHqLxQ"W%]'d+k.r1z58;Ǝ>͒@ӖCיD֘DЕBʐ@Ì=:~7w3p0h-a)[&~T$vO!oJrTddaY^3`0f3l6s9z<@DGKšNɦQΩTѬWԮXӭXЫV̨SȥPÞMJFB?w;p8i5d2^0hddaYߩܩڨקԩ˸eb_X[~~}}|||{{{zz{ddd+( @333kHoJqLvO!xQ"~T$IEEKKCIIEMIIMMIMMMQMMQQMQQQXTQ]ZW``]eb_ddadddW%[&]']1a)d+h-k.`0d2f3i5l6p0r1w3z5q8w;z<?~7rSw_x_y`{a|a~bc?t?wIvEwCyL|8:;Ì=Ǝ>@BDFGJddh|fghiklmnoʐ@͒@KÞMѕB֘DšNȥP̨SΩTЫVѬWӭXԮXpŞqʡrΤtѧuYEJUS[fmngkuz{sKÉOÊMōQɒTΙ\̘WМXҟ`ȕvĜ|ʣ}ϧfӤjحvڲvܵ¥ťΨ­ů϶سڵݹбֶٺ̶̸μνչ׼ǽȾ  Ŵ祩8z{wnm}|6qi˞kjtgy7lā9~o󡷷fuxhrv»|5p:s.024GJLMOQabcdeedcbRPNMKJF31/I%';=?TWXXWS><,&$-!#(*@BDUYZ\^`_][ZVECA+)(" H(  {vezzzzzzzzzzzzzzfc`RļyϧѶpeŗqRĠʹؼʹʂâw֬_҈Ĥݽǣo҃dAnExJOTɘYӟ\ў[ǗXSNvIlDc@{reƭζտȞ͢ѦϦˡĜѺʰӶӎ|8BBAA@@???>>}=}=}y=aaa*( aaafc`{rec@dAlDnEvIxJ{v}yNOSTn}{ǗXɘYў[ӟ\R_pqeŗyϧw֬ŭʯζѹտâǣĤѶݽؼʹÜȞʡ̡Φѥ '),.02331/-+)&SPCjhcccccccfk4SR[hcccccccfk4SVNOjg```````ak4S\MXkhcccccccfk4SQ]hcccccccfk4SFEFeg```````ak4SiWbkhcccccccfk4T@dhcccccccfk7UBDA_g```````ak9U^YZkhcccccccfk9  86;=?HJLKIG><:5 "$#%*($!  launchy-2.5/plugins/controly/fhoenv.cpp0000644000175000017500000000102111262221417017362 0ustar monesmones// Copyright 2009 Fabian Hofsaess #include "precompiled.h" #include "fhoenv.h" // Launchy already implements expandEnvironmentVars but it's difficult to reuse in plugins QString FhoEnv::expand(QString txt) { QString result; DWORD size = ExpandEnvironmentStrings((LPCWSTR)txt.utf16(), NULL, 0); if (size > 0) { TCHAR* buffer = new TCHAR[size]; ExpandEnvironmentStrings((LPCWSTR)txt.utf16(), buffer, size); result = QString::fromUtf16((const ushort*)buffer); delete[] buffer; } return result; } launchy-2.5/plugins/controly/controly_full.ico0000644000175000017500000061273610673261500021007 0ustar monesmones000F 0v00hV  (00 ^!*h0(66``^>PPgHHT:@@(Bv00% F hv(0`ZۿVz_ukwWk}ow~x~wokmvwo{~w~xwoo|*$J BI QJ RZo( @~""( @߿!(0`{s7w{x83{x7zwz?7xx{z7?zz88x8xwwwwwxxxwwwfFffvffnnlfffdfFFGeeg|wxhhgGfVdfvhn~~|~~gfVg( @{wx{7xzx{xwxwwwww~wwwvwgpFfff~gddpvV|~~|vv(0 w8{wxx{w8fffvfd`wxp( wgghhggg(0` dCiFnJqKbD oM$tM wP"|S#V$Y%[&X*^(`(c*j-m.q1t1y4w3{5~6?g=g:n;o;p>u>uCiOpTs\xLt@rBwDxUy^Y~E}E~789<Ä9=̊<Ҏ>Ñ?rtxÕA˕AŘBȜCӚEٞG̡FЦHԪKڮNݰQRFFHioptadxwxGIKÈLÊKĊMċPčNȐTɒWʔZ˖UϚYΘ]ϛVЛpțqȜaО[ԣ[ե\Ԥ{Ƞm֩}ׯsحtحyد{ڳs߻y޹ݹ߼uxêɮͰϲѳô˺ƻξпʤ̩ʬʭ޻޻߼ݺ߽ӵӶԵֹعغǵȵѹԿоëȯ˰βѵӸݳ)+SS+K G]ge_G#|YneSO&riW&}Lakf*IIʫ(,SS+H Q^ie_G"|YndXO&mlW&Lak*KK$GSSG)Gble_G!x]eXP'lmlW%Mal*KPstttuvvwwyyzz{{{zwwvvutttss6 1334444311 7 /22::==>>>==::52// 8 /059<<@ABBCDDDDBBAA?<990// ɆǺ( @kHoJqLvO!xQ"~T$W%[&]'^0a)d+h-k.`4`0d2f3i5l6p0r1w3z5q8w;z<?~7w_x_y`{a|a~b~dc?t?wIvEwCyL|8:;Ì=Ǝ>@BDFGJddfghiklmnoxʐ@͒@KÞMѕB֘DšNȥP̨SΩTЫVѬWӭXԮXpŞqʡrΤtѧuYEJUS[fmngkuz{sKÉOÊMōQɒTΙ\̘WМXҟ`ȕvĜ|ʣ}ϧfӤjحvڲvܵ¥ťΨ­ů϶سڵݹбֶٺ̶̸μνչ׼ü)jkg^^ml'aosYxw~[Zd~Wri(\oq*wn_{VghX~bgl&^zs+xb#%89;;?@ARSSUUSSR@?=;;98##u ,.0DHHHHD0- #135EIJLNPPLJJEE33Bò(0@lHjH rL uN!}S#V$\'^(e+h,n/q1x4{5F89É<Ƌ=̐?fliiklopϒ@ԕBâstǨxȪx̱{ӹGejouu{~PƑUǑQȒYɕb’dÔҸֽؿľض߼ĈŽFffRRkkkkmkokmkkkkkkiidFt(..3tttroqootoroooqttFM1D:%attoqoqqoqoqqqqttFa*9@3ntttpppppppppotttFtYAA`tttoqpppppppppqttFtthhttttttttttttttttttFt(003ttttototototottttFA1C:attoqqoqqoqqoqottFa*9@3ntttoppppppppptttFtYMMatttoqpppppppppqttFttaatttttppppppppppqttFt'00*tttoqppppppppqqttFN1C;%attqppppppppppqttFb*9@3nttqqppppppppoqttGtaMNhtttqpppppppppqqttEIIIIOTTTTWWWWUUPPKJKIF4  8"#$<<===<5"! Gd]dddddkjjkkjfffc^]]XG( c@dAlDnEvIxJNOSTǗXɘYў[ӟ\R_peŗyϧw֬ïű˶ηҾԿȿâǣĤѶݽؼʹƦΫϫԯհ׳״60"FFBBBBBBBFF362>FBBBBBBBBF369.0FFAABAABABF36>-;FFBBBBBBBBF361?FBBBBBBBEF36%$%CEAAAAAAAAF36F;BFFBBBBBBBEF37CFBBBBBBBEF38!#@FAAAAAAABF38@;>FFBBBBBBBBF3  &(),))'&( da\KIE1/-20- 420 530 530 530 531 531 541 541 641 641 642 642 642 652 652 652 653 753 753 753 764 764 764 764 765 865 875 875 875 876 876 876 886 987 987 987 987 987 998 998 998 :98 :99 :99 :99 ::9 ::9 ::9 ::: ::: ::: ;:: ;:: ;;: ;;; ;;; ;;; ;;; ;;; ;;; ;;; ;;; ;;; ;;: ;:: ;:: ::: ::: ::: ::9 ::9 ::9 :99 :99 :99 :98 998 998 998 987 987 987 987 987 886 876 876 876 875 875 875 865 765 764 764 764 764 753 753 753 653 652 652 652 642 642 642 641 641 541 541 531 531 530 530 530 21. .,* *)' ('%QNJIGCqmg!')))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))($ WTOZWR,,,;ƭج׬׭׭׭׭׭׭׭׭׭׭׮׮׮׮׮׮׮׮ׯׯׯׯװװװװװװװױױױױױײײײײײײ׳׳׳׳׳׳׳״״״״״״״״״״״״״״״״״״״״״׳׳׳׳׳׳ײײײײײײױױױױױױװװװװװװװׯׯׯׯ׮׮׮׮׮׮׮׭׭׭׭׭׭׭׭׭׭׬׬׬ץVUU! PNJ?=9ɻɾɾɾʿʿ²óôĵŶƷƸǹȻɼʽ˾̿€Àŀƀǀɀʀˀ̀΀πЀҀӀԀր׀؀ـۀ܀݀ހ߀߀ހ܀ۀڀـ׀րՀԀҀрЀ΀̀̀ʀɀȀǀŀĀÀ˿ʾɼɻȺǹƸŷĶĵô³²ʿɿɾɾƿ///jURN@>; ȽȽɾɾʿʿ²óôĵŶƷƸǹȻɼʽ˾̿€Àŀƀǀɀʀˀ̀΀πЀҀӀԀր׀؀ـۀ܀݀ހ߀߀ހ܀ۀڀـ׀րՀԀҀрЀ΀̀̀ʀɀȀǀŀĀÀ˿ʾɼɻȺǹƸŷĶĵô³²ʿɿɾɾȽ777XVQEC? Ƚǥʦʦʦʦʦʦʦʧʧʧʨʨʨʨʨʨʩʩʩʪʪʪʫʫʫʫʫʬʬʬʭʭʭʭʮʮʮʮʮʯʯʯʯʰʰʰʰʱʱʱʱʱʱʱʱʱʲʲʲʱʱʱʱʱʱʱʱʱʰʰʰʯʯʯʯʯʮʮʮʮʭʭʭʭʬʬʬʫʫʫʫʫʫʪʪʩʩʩʨʨʨʨʨʨʧʧʧʧʦʦʦʦʦʦʥʥɩʿ777`\XLJF Ƚĵ777jfaNKG ȽƸ777njdMJF ȽƸ777njeLJF Ƚ}UuEvHÄJƆKɈJLjGzTvzƸ777njeLJF Ƚdw7`uCJĈOɐS͕UϚ^զ_֨`ש^֨\֦YӠTϙNȏG@y5e6nMƸ777okeLJF Ƚ(N:n@zGLnjQ̓Tϙcخbٮ`ث^ש[դVўQ̔JĊC~;r+SƸ777okeLJF ȽR~c4chAwE}D}E}FFGE}AlfzƸ777okeLJF Ƚs1W8h@vC}GIIˆKÇJÈIFD{=o4]m|Ƹ777okeLJF ȽI{_,UtC~H†MȍQ˒S͖VϚXѝYџYҠWўVϚQ̕LƌF?v1\CuXƸ777okeLJF Ƚny)Ou-UdqƸ777okeLJF Ƚ#mB8k?wFKƋP˒Tϗoԧzڳa׫bث^ש]רZԢUМPʒIˆB|9n'tGƸ777okeLJF Ƚr~/[;oAzGMȎQ̔oԧ~޺cڰa٭_ת[եWҟR͖KŋDq8h+RƸ777okeLJF Ƚ*Q>kGvLfÕdԦiحnܴrutz֭]͙YǑSNHw?l+SƸ777okeLJF Ƚ0SEpU~Z^dȖjϟoէtڰxݷ{߻~|z޹~ѨcŔ^ZV~Hq0TƸ777okeLJF Ƚ^xDlfilpǛuΣ{Ԫٰܶ޺߼ݸڴˤlhfJp\vƸ777okeLJF Ƚ±8`py|œǡͧҭײڶܹݻݻܹٵկƥyt>eƸ777okeLJF Ƚ<\dĥȨͬѯԳ׷ٹڻڻٹ׶ԳЮйn>^Ƹ777okeLJF Ƚ6YȮ˰γѵӷչ׻׼׼ֻչӸеͲʰȮ?`Ƹ777okeLJF ȽGgɳϺлҼӽվֿֿֿֿվԽҼкϹ˵RoƸ777okeLJF ȽHfɴ͹ToƸ777okeLJF Ƚ\s|czƸ777okeLJF Ƚ}{;Ƹ777okeLJF ȽǷǷƸ777okeLJF ȽƸ777okeLJF ȽƸ777okeLJF ȽƸ777okeLJF ȽƸ777okeLJF ȽƸ777okeLJF Ƚ}UuEvHÄJƆKɈJLjGzTvzƸ777okeLJF Ƚdw7`uCJĈOɐS͕UϚ^զ_֨`ש^֨\֦YӠTϙNȏG@y5e6nMɻ777rojPOL (N:n@zGLnjQ̓Tϙcخbٮ`ث^ש[դVўQ̔JĊC~;r+S׭ؽ777sqlQPN R~c4cЍ>Ҏ>ӏ?Ԑ?Ր?ӏ?ҏ?ю>Ѝ>Ό=͋=ˊ<Ɉ<ȇ;Ɔ;ą:ƒ:988~7|6{6y5x4v3t3s2q1o0n0l/j.i-g-e,d+b*`)_)](['Z&X&W%U$|T$zR#xQ"vO"tN!rL pK nJlIkHiFhEfDeCcBbBaAiYGҦپ777wvrTSQ `@bAcBdCeDgEhFjGlHmIoKqL sM!uO!wP"yQ#{S#~T$V%W%Y&['\(^(_)a*c+d+f,h-j.k.m/o0p1r2t2u3w4x4z5{6}7~7899Ä:Ņ:LJ;Ɉ<ʉ<̊=͋=ό>Ѝ>Ҏ>ӏ?Ԑ?Ր?ӏ?ҏ?ю>Ѝ>Ό=͋=ˊ<Ɉ<ȇ;Ɔ;ą:ƒ:988~7|6{6y5x4v3t3s2q1o0n0l/j.i-g-e,d+b*`)_)](['Z&X&W%U$|T$zR#xQ"vO"tN!rL pK nJlIkHiFhEfDeCcBbBaAiYGҦپ777wvqTSQ `@bAcBdCeDgEhFjGlHmIoKqL sM!uO!wP"yQ#{S#~T$V%W%Y&['\(^(_)a*c+d+f,h-j.k.m/o0p1r2t2u3w4x4z5{6}7~7899Ä:Ņ:LJ;Ɉ<ʉ<̊=͋=ό>Ѝ>Ҏ>ӏ?Ԑ?Ր?ӏ?ҏ?ю>Ѝ>Ό=͋=ˊ<Ɉ<ȇ;Ɔ;ą:ƒ:988~7|6{6y5x4v3t3s2q1o0n0l/j.i-g-e,d+b*`)_)](['Z&X&W%U$|T$zR#xQ"vO"tN!rL pK nJlIkHiFhEfDeCcBbBaAiYGҦپ777wuqSRQ dCfDgEiFjGlHmIoJpK rL tN!vO!xQ"zR#|T#~U$W%X%Z&[']'_(`)b*c+e,h-i-k.m/n0p0r1t2u3w4y4z5|6}6889::‡;Ĉ<Ɗ<Ȋ=ʌ=ˍ>̎>Ώ?ϐ?ё@Ғ@ԓAՔA֕AוAՔAԔAӓ@Ғ@Б@ϐ?͏?̍>ˌ>ɋ=NJ<ʼn<È;;:998~7}6{5y5x4v3t2s2q1o0n/l/j.h-f,d+c+a)_)^(\'[&Y&W%V$}T${S#yR"wP"uN!sM qL pKnIlHkGiFhEfEeDk[GҦپ777wuqSRQ mIoJpKrLsM uN vO!xQ"zR"|S#~U$V$W%Y&[&\'^(`(b*c*e+g,i-k.l.n/q0r1t2v3x4z4|6~6789:;;<=Ž>ď>Ƒ?Ȓ@ɓA˔B͕BΗCИDљDӚEԛE֛F֜F؝FٞGڟGڟGٞG؞GםF֜F՛EӚEҙDИDϗCΖC̕BʓBȓ@ǒ@Ő?Ï>==<;::88~7}6{5x4w3u3s2q0p0m/k.j-h-f+d+b*a)_(]'\'Z&Y%V%U$}T#{S#zQ"wO"uN tM rLqKpKnJo^HҦپ777wuqTSQ sM uN vO!xP!yQ"|R"}T#U#W$X%Z&[&]'^(`(a*d*e+h,i-k-m.o0q0r1t2w3x4z5}67789;<<=>>Ò@ŔAǖBȗBʙC̚D͛DϜEНFҟGԟHԠH֡IעIأJ٤JۤJۥKݦKݦKܥKۥKڤJ٤JأIעIաHԟHӟGўGНEΜE̛D˚CɘCȗBƕAēA‘?>==<;:987~6|6y4x3v3s1q1p0m/l.j-h,f+d+c*a)_(^'['Z&Y%W%V#~T#|S"zR"yP!wO!vO!tN s`IҦپ777wuqUTR zQ"|S"}T#U#V$W$Y%Z&\']'_(`(b)d*f+g,j-k-n/o/q0s1u2x3y4{5~6789:;<=>?“@ÕAŗBǘBțCʜD̟F͠FϢGУHҤIӥJզJ֧KרLةLکMڪMܫOݬOެO߭PPP߭PޭPݬOܬO۫NڪM٩LרLקKզKԦJҤJѣHϣGΡG̠F˝EɜDǚCƘBĖA“A?>==;:9986}6z4x4v2t2s1p0n/l.j-h,f,e+c)a)_(^'\'[&Y&X$V$U#~T#}T#{R"vbJҦپ777wuqVUS V$W$X%Z%[&\&^'_(`)b)d*e*g,i-k-m.o/q0s1u2w2y4{5~6689:;<=>?Ô@ĖAƙCǛCɝD˟E̡FͣGϥHѧIҩJӫKիL֭L׭MخNگO۰PܱPݱR޲R߳SSSTTTTTSS޳R޲RܱQ۰PگOٯOخM׭MլLԫKӪKѨIЦHΤH̢GˠEʞDțDǚCŗBÕ@“@?=<<;9976}5z5y3v2t1r1p0n.l.j-i,f+d*c)a)`(^(]&[&Z%Y%X%W$ydKҦپ777wuqWVT م^0[%\'^'_(a(b)d*e*f+i,j,l.n/p/r1u1v2y3z4}56889:<=>’?Ĕ@ŖAǙBțCʝDˠF͢FΤGϧIѨIҫJӭKկMֱM׳NٳPڵP۵QܶRݷS޷T߸TUUWWWXXXXXWWVUT޷T޷SݶSܶQڵQٴPسOײNְMԮLҬKѪJШIϥHͣG̡F˞EɜCȚCƘBŕ@Ó?‘?=<;:987~6|5y3w3u2s1q0o/m.k-i,h+f+e*b*a(`(^']'\&[%vcҦپ777wuqXWU ›kQiMiMjNkNlNmOmOnPoPpPqQrQsRtRuSvSwTxTzU{U|V}V~WWXXYZZ[[\]]]^__``aabbbccdddeefffgggggffeeedddccbbba``__^^]]\\[ZZZYXXW~W|V{VzUyUxTwSvStRtRrRrQpPoPoPnPmOlOkNjNjMiMiMyf򽹲Ҧپ777wuqZXW ߪީީݩܩܩ۩ڨڨ٨ببרק֧էԧԧӧӧҦҦپ777wuq[ZX ߪީީݩܩܩ۩ڨڨ٨ببרק֧էԧ֪թթթҦپ777wur\[Y ߪީީݩܩܩ۩ڨڨ٨ببרק֧էԧҦپ777vtqYXV ߪީީݩܩܩ۩ڨڨ٨ببרק֧էԧڰꮭڲҦپ777qolXWVߪީީݩܩܩ۩ڨڨ٨ببרק֧էԧϹɿҦ777pnk߷߷޷޷޷޷ݶܽ###3?>< eed_999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999~+++2CBA}y(` PNKUROVTPVTPVTQVTQVTQWTRWURWURWURWURWVSXVSXVTXVTXWTYWUYWUYWUYXVYXVZYWZYWZYWZYX[YX[ZY[ZY[ZY[[Y[[Z\[Z[[[\[[\\[\\[\\\\\\]\\]\\]]\]]]]]]]]]]]]]]]]]]]\\]\\\\\\\[\\[\[[\\[\[[[[Z[[Z[[Z[ZY[ZY[ZY[YXZYXZYWZYWZYWYXVYXVYXVYWUYWUYWTXWTXVTXVSWVSWURWURWURWURWTRWTQVTQVTQVTPVTPTROLJGDB@fc^42/                                                              JGDNKGGGFi}{||||}}}~~~~~~~~~~}}}||||}{y000cIFCKIG9ĿɾɾɾɿóõĶŷǹȺɼʾ˿ÀƀȀˀ̀ЀҀր׀ـ܀ހ߀܀ۀ׀րҀЀ̀ˀȀƀ€˿ʽɼȺƸŷĶô³ɿɾɾɿ 1@>;NMJGǼúļļŽŽƾƿ·øĺŻżǽǿ—×ėŗǗȗʗ˗̗ΗϗЗїӗԗ՗֗חؗٗڗۗܗݗݗޗޗݗݗݗܗۗڗٗؗח֗՗ԗҗїЗϗΗ̗ʗɗȗǗŗėחǿƽżŻĺø·ƿƾŽżļļúǼ ;EB?USPG nC|E~FFGD{Gpx tEKÈNǍOɐPɑOȏKĊEuFMȍR͕qը]ԥ_֧]֧[ԣVЛNȐE9lB|Z pD}EFGGE}Cqc| r:] u1V sE~FGGHE>qOm» |>~?@AABBCÈDĊDƋENjEȌENjEƋEĊDˆDCBBAA@~?|>{=y=wӏ>ԏ>ӏ>ю>Ѝ=΋=̊<Ɉ;ȇ;Ņ:ƒ988~7|6z5x4v3s2q1o0m/j.i-f,d+b*_)](['Y&W%~U${S#xQ"vO!sM pKnJkHiFgEeCcBbAbF&þ Ҏ>ӏ?Ր?ӏ>Ҏ>Ѝ>΋=̊<Ɉ<ȇ;Ņ:ƒ998~7|6z5x4v3t2q1o0m/j.i-f,d+b*_)](['Y&W%~U${S#xQ"vO!sM pKnJlHiFgEeDcBbAcF&þ ȏ?ˑ@͒AϔAѕBӗCԘC֙DךDٚDךD֙DԘCҖBѕBΔA͒@ˑ@ȏ?Ǝ>Č=<;:987|6z5w4t2s1p0m/k.h-f,d+b)_(]'[&Y%V%~T${R#xQ"vO!sM!qKoJmIkHjL(þ ‘?œ@ǕAʘB˙CΚDМEҝFӞGՠHסHآIڣJۤJܤJۤJڣIآIסH՟HӞGҝFМEΚD˙CɗBǕAœ@‘?=<;:98~6|5y4v3t2q0o/l.i-g,e+b)`(]'[&Y&W%V$}T#zR"xP!vN!tM rQ*þ ?ÔAŗBǚCɝD̟E΢GФGҥIӦJըKשL٪LګMܬNݭOޮP߯PP߮PޮPݭO۬NګMتLשLէKӦJѥHФG͡F̟EɜDǚBŗAÔ@?=<;:97}6z4x3u2r1o/m.j-g,e+c)`(^'\'Z&Y$W$U#~T#zV,þ ’?ĖAƘBȜDʟE̢FΤGЧIҪJԬKկMװNٱOڲPܳQݴRߵSTUUVVUUUTߵSݴRܳQڲPٱOװNծMԬKҩJϧIΤG̡FʞEțCƘBĕA’?><;:86|5z4w2t1r0o/l.j-g+e*c)a)_']'[&Y%^2ûþ <ZWR :=========================================================================< +)'% KIELKH.»»»üýĽľſºûĽž¦æŦƦǦɦʦ˦ͦΦϦЦѦҦӦԦզ֦צצئצצ֦զԦӦҦѦЦϦΦͦ˦ʦɦǦƦŦ榞ĽûºſľĽýü»»ºE874[YV`ƷóôĵŶƸǹȻʼ˾…ÅŅDžɅ˅ͅυхӅՅׅمۅ܅ޅޅ܅ۅمׅՅӅхυͅ˅ɅDžŅŅ˾ʼȻǹƸŷĵôóô=<:ba]aȹƸ=<b`]aȹdWV_}Ƹ=<u?`Ƹ=<vHر}ߺ]֧WѝNɐD9lsƸ=<uHV̖dگ^֨XҟOɑD7iƸ=<uNm۲\եVЛMǎC}8llƸ=<>=yHFCffdcĺ3a?vHtӧrܵ]֧WҞNɑD8lwײ>>>zIGEggfc6f?ukɛcگm߹l׫VϚNōD|:kjײ>>>zJIGhgfcȷ>jO}oƚۻjըqܴwy߽qѣZŽRFrtײ>>>zJIGhgfcAhgmt̠|լ۵߻޻۷{ƞhSxײ>>>zJIGhgfcZwyá˨ӰضۺۺٷԲMnײ>>>zJIGhgfc^{ɯͳѷպ׼׼ջҷε˳yײ>>>zJIGhgfctмײ>>>zJIGhgfcƴײ>>>zJIGhgfcײ>>>zJIGhgfcײ>>>zJIGhgfcײ>>>zJIGhgfcƶֱ>>>zJIGggec~mXbAcBfDhEkHmIpKtN!wP"zR#~T$W%Z&\'_(a*d+g,i-l/o0q1t2w3y5{6~789ą:LJ;Ɉ<̊<ό=ю>ӏ>ԏ>ӏ>ю>ό=̊<ʉ<LJ;ą:98~7{6y5w3t2r1o0l/j-g,d+a*_(\'Z&W%~T$zR#wP"tN!qK mIkHhFfDdBbAvcMկ>>>zJIGggec~mXbAcBfDhEkHmIpKtN!wP"zR#~T$W%Z&\'_(a*d+g,i-l/o0q1t2w3y5{6~789ą:LJ;Ɉ<̊<ό=ю>ӏ>ԏ>ӏ>ю>ό=̊<ʉ<LJ;ą:98~7{6y5w3t2r1o0l/j-g,d+a*_(\'Z&W%~T$zR#wP"tN!qK mIkHhFfDdBbAvcMկ>>>zJIFgfecƁoYgEiFkHnIqK sM wO!zR#}T$W%Y&\'_(a)d+g,j-l/o0r1u3x4{5}689:;Ċ<Nj=ʍ>̏?ϑ@ђAӔAՕBזBՕBӔAҒAϑ@͏?ˍ>Nj=Ċ<ˆ;:98}6{5x4u3r1o0m/j-g,d+a*_(\'Y&W%~T$zR#wP"tN qL nIlHiFgEyeNկ>>>zJIFggecƇs[sM uN xP!{R"~T#V$Y%[&^(a)c*f,i-l.o0s1v2y4|578:;<>đ@ƔAɗB̘CΚDќFӝF՟GנH١HڣJܣJڣJ٢IסH՟GӝFќFϚD̘CɗBǔAđ@><;:87|5y4v2s1o0m.j-g,d*a)^(\'Y%W$~U#{R"xP!uN sM jPկ>>>zJIFhhfcƌw]~T#V$X$Z&\'_(a)d*g,j-m.p0t1w3z4~679;<>@ĖAƙBɜD̟EΣGѥHӦJըKשL٫M۬NݭOޮP߯QQQޮPݭO۬N٫MשLըKӦJѥHΣG̟FɝDǙBĖA@><;98~6z4w3t1p0m.j-g,d*a)_(]'Z&X$V$~T#nQկ>>>zJIFjigcŘo['\'_'a(d*f+i,l.o/s0v2y3}578:<>Ó?ŗAȚCʞE̢FϥHѩIӬKկMײNٳO۵PݶR޷STVVWWWVVT޷SݶR۵PٳOײNկMӬKѩIϦH̢FʞEțCŗAÓ?><:87}5y3v2s1o/l.i,f+d*a)_(\'[&}cկ>>>zJIFkjhcɷݵ޵߶߷޸޹޺޻޼޽ݾݿݿݿ¸¹úĻļŽŽƾƿ®®¯ïððﯯ®ƿƾŽļĻú¹տվվսԼԻԻԺԸԷԶӵӴӳӲӱӰӰȿկ>>>zJIFlkjcީݩܩ۩ڨ٨بק֧էҬԮаկ>>>zJIGkkicީݩܩ۩ڨ٨بק֧էկկ?>>xGFD}|{P߫ޫݫܫ۪ڪ٪ةש֩ӰѼ͹Թ::9cTSP nxwvyxwyxwyxwyxwyxwyxwyxwyxwyxwyxwyyxyyxyyxzyxzyxzyxzyxzyyzzyzzyzzyzzyzzyzzzzzzzzzzzzzzzzzz{zz{{z{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{z{zzzzzzzzzzzzzzzzyzzyzyyzyyzyxyyxyyxyyxyxwyxwyxwyxwxxvxwvxwvxwuxwuxwuwwuwvuwvtwvtwvtwusvusvustrqddcrIHF(H `TJHEECAJGDKHEKIEKIFKIFKIGKIGKJGLJGLKHLKHLKIMKIMLJMLJMLKNMKNMKNMLONLONMONMOONOONOOOPOOPPOPPOPPPQPPQQPQQQQQQQQQQQQQPPPPPPPPPPOPOOPOOOONOONOOMONMONMNMLNMLNMKMMKMLJMLJMKIMKILKILKHLJHKJGKJGKIGKIFKIFKIFKHEJHECB?:97=<:OLH&&%F'''d'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f(''f'''f(('f(''f(((f(((f(((f(((f(((f(((f(((f(((f(((f(((f(('f(('f(''f(''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f'''f$##XJGD[YWP·ƷǸȹɻʼ˾̿ËċNjȋʋ̋΋Ћҋԋ֋؋ڋ܋ދދ݋ۋً׋ՋӋыϋ͋ˋɋNjŋË˾ʽɻȺǸƷŸJJIy/.+jheh²¿¾ÿ±ñıűƱDZȱɱʱ˱˱̱˱˱ʱʱȱDZƱƱıñ±ÿ¾¿Ƽb`^430 omihõb`^<:7 omiiĶǴƫǮȺb`^>;8 omihĶYx@tFGHGEtub`^><8 omiiĶ5_B{KĉPʑT͖TΙR˕KĊ@wEeb`^><8 omiiĶ3ZA{KŊR͕ܸcզ^զ[դVЛKŌ>uLfb`^><8 omihĶez:oFOʑm۳_ثZԢQ̕E4eb`^><8 omiiĶ<`;qGܻy޹hٮYӡP˔E9m~b`^><8 omihĶ;bBsjŗuٱiܳqeҢTǐJ>n{b`^><8 omiiĶIlXbp͠s֫zݷ~޻mǙ^Pwb`^><8 omihĶh{ˤԯڶܻܹ׳zSub`^><8 omiiĶ\yƫ̰ҵֹػ׻շдwb`^><8 omihĶtмɴ{b`^><8 omiiĶνɸb`^><8 omiiĶb`^><8 omihĶb`^><8 omiiĶb`^><8 omihĶ£®b`^><8 omiiĶMpAvFHHHCudb`^><8 omihĶ5aC}KƋQ˓UΘUϚS͖LƌAz>bb`^><8 omiiĶ2[B|LƋTΗk׫_֧\եVќLƍ?wDab`^><8 omihĶ`w;oFOʑqܵ`ثZԣQ̕E5fb`^><8 omiiĶ;_;pHqܵnڱYӠP˓E9m|b`^><8 omiiĶ;cCtlŘqدjܳrjӤUǐK?n|b`^><8 omihĶMnZcl˝u֫|ݷ߼޺sȝ`Qxb`^><8 omiiĶh~˥ԯٶܻ۹׳}Rtb`^><8 omihĶ]zƫ̱Ҷֺ׼׻Ըдѻb`^><8 omiiĶtκůb`^><8 omihĶð˻ǵb`^><8 omiiĶb`^><8 omihĶb`^><8 omiiĶb`^><8 omihĶĵqub`^><8 omiiĶAiAxGIIIAvTtb`^><8 onjiĶ6eDLnjR̔VϙWМTΘMǎC|;ab`^?=: qoliĺ2]B}LnjVΘrد_֨\֦WѝMǎ@y=]ba_@>; tsqoZs;pFQ˓x޹`ثZԣQ̕E6hûfecA@= utro:_;pIl۳t۳YҠPʓE9m{ûfedBA? vutoԐ?ӏ>э>Ό=ˊ<ȇ;Ņ:ƒ98~7{6y4v3s2p0m/j.g,d+a*^(['Y&V$|S#xP"tN!qK mIkGhEeCbBbE#fedCB? utsohN0fDiFkHnJqL uN!xQ"|S#V$Y%\'_(a*d+h-k.n/q1t2w4z5}689:Ĉ;NJ<ʌ=͎>А?ґ@ԓA֔AԓAҒ@А?͎>ˌ>Ȋ<Ĉ<:98}6{5x4t2r1n/k.h-e+b*_)\'Y&V$}T#yQ"uN!qL oJlHiFfDfG$fedBB? utsoqU3sM vN yQ!|S"V$X%[&^(a)d*g,k.n/q0u2x4|579:<=Ð?Ɠ@ɖA̘CϚDќFԝF֟GؠHڢIܣIڢIءH֟GԞGҜFϚD̘CɖBƔ@Ñ?=<;97|6y4u2r1n/k.h,e+a)^(['X%V$}T#yQ!vO!tM qO'fedBB? vuto{[6U#W$Y%\'_(a)e*h,k-o/r1v3z4~689;=?ÕAƙBɜD̠FϣGѦIԧJ֩LثMڬNܮOޯPQQQޯPܮO۬NثM֩LԨKѦIϤG̠FɝDƙBĖA?=;:8~6{4v3s1o/l.h,e+b)_(]'Z%W$U$|V*fedBB? wwuoċqS])_*b+d,g-j.n0q2t3x5|79:<>@”BĘDǜEɠH̤IΨKЫMӯNձP׳QٴS۵TܷU޸WXYYYX޸WݷV۵TٵS׳RղPӯOѬMϨK̥IʡHǜFřD”B@><;9|7x5u4q2n1j/h.e,b+_*])gBǰfedBB? yxvoȿǿƿſĿþ¾ſľľýü»űҦfedBB? zywoߪީݩ۩ڨ٨بק֧ԧ˿ӨfedBA? xwvmߪީܩۨڨ٧بק֦ԧӨfed?><-ǶǶǶǷƷƷƷƷƷƷƷŸŸŸŸŸĹĹĹĹĹúúúúú»»»BBAKfdbsqo{zw(@ BCA>?=;B@=B@>BA>CA>CA?CA?CB?CB@DB@DCADCADCAEDBEDBEDCEDCFEDFEDFEEFFEGFEGFFGGFGGFGGGGGGHHGHHHHHHHHHHHHHGGGGGGGGGGFGFFGFFFFEFFEFEDFEDEECEDCEDCEDBDCBDCADCADB@CB@CB?CA?CA?CA>BA>BA>B@=@>;642:97EC@ONMuVUSVUSVUSVUSVUSVUTWVTWVTWVTWVUWVUWWUXWVXWVXWVXWVXXWXXWYXWYXXYXXYYXYYXYYYYYYZYYZZYZZZZZZZZZZZZZZZZZZZZYZYYYYYYYYYYXYYXYXXYXWXXWXXWXXWXWVXWVXWVWWUWVUWVUWVTWVTWVTVUTVUTVUSVUSVUSVUSTSQ8A?<qolmɾʿôĶƸȺɼ˿Āǀɀ̀΀рԀրـۀހހ܀ـ׀ԀҀπ̀ʀǀŀ€̿ʽȻƸŶô²ʿɾɾ~y+*( zxtp侸{20. |zvpĿĄ{752 |zupT{E}HƒGU~ĿĄ{752 |zupLj>tI†OȏR˔Q˔LŋAyLkĿĄ{752 |zupQj>uJĉR͕۵]Ԥ]եXҟOɐ@yOiĿĄ{752 |zup4dDOʑbٮ]֧TϚG6gŻĿĄ{752 |zup8kDi۳[դS͗G:nĿĄ{752 |zupCqZk׫o޷w[ʕQDqĿĄ{752 |zup̼Tzksʟ}֭ݸ߼ܸjW{̻ĿĄ{752 |zupWv£˪ӲظڻظҲƫ\zĿĄ{752 |zupwϺӼտֿտӽϺ}ĿĄ{752 |zupɷ̺ĿĄ{752 |zupĿĄ{752 |zupĿĄ{752 |zupĿĄ{752 |zup]T^ĿĄ{752 |zupt:kEKĊNǎNƍI=pqĿĄ{752 |zupr:nH…Q˓cҡZҡ[ӢVЛLŌnUsٱkݵ~޼W˕L?oĿĄ{752 |zupŲQxcm˜w׬~ݸֵ߽߽cSzıĿĄ{752 |zupRsʧӰٸۻٷֶĥWwĿĄ{752 |zupïζҹּֽռҹ͵İĿĄ{752 |zupɹ̻ĿĄ{752 |zupĿĄ{752 |zupĿĄ{752 |zupĿĄ{752 |zupɼ¥}ŸæɻĿĄ{752 |zupCkBzHJ‡JFEoĿĄ{752 }{wp5dFOɏTΘXѝXўS͗I‡7hĿĄ{864 ~{uĿ3[B|MȎlԥw۴`ت[եR͖E4^Έ985 z8kEfϞy޹]֦TϚH9m֍:97 z;lR޼gܳsخU˕IҎ>Ԑ?ӏ?Ѝ>͋=ʉ<LJ;Ä:8~7{6x4u3r1o0k.h-d+a*^(['W%~T$yQ"uO!qL mIjGgEdCbAҍ;;8 zcBfDhFkHoJsM wP"{R#U$X&\'_)b*f,i-m/p0t2w3z5}789Æ;Lj<ʋ=΍>я?ӑ@Ւ@ԑ@ѐ?Ύ>ˋ=ȉ<ć;:8~7{5x4u2q1m/j.g,c+`)]'Y&V%|S#xP"tM!oKlHiFfDdCҍ;:8 zqLtM wO!zR"~U$X%[&^(a)e+i,m/p0t2x4|579;<>œ@ɖA̘CϚDҜF՞GןH١HۢIڡIؠH՞GӜFКE͘CʖBƓ@?=;:8}6y4u2q0m/j-f+b*_(\'X%V$|S"xP!tN rLҍ;:8 z~T#V$Y%\'_(b)f+i-m.q0u2y4}68:<>“@ŘBɜDˠEϤHҧIԩKתL٬NܮOޯQQRRޯQܮOڬNثMթKҧIϥH̡FɝDƙBÕ@><:86z4v2r0n/j-g+b)`(\'Y%W$U#ҍ;:8 zNJnLc:e;go@rAuBxD|EGHJLMOQRTUWXYæ[ħ\Ʃ]ǩ^Ȫ_ɫ_Ȫ_Ǫ^Ʃ]Ĩ\ç[ZYWVTSQONLJIG}FyDvCsAp@m>j=huTɒy޹[եNȐ:n0., twBw߼xsحPō@rǵ0., t`pɜzد޻߽{ȠX~0., toʬԵغعԸq0., t0., t0., t0., t0., tUyE~KÈLÊFi0., t?gG]ϛtح\ԤVЛGTs0., t>uWʔ߼[եNȐ;o0., txCwݹuxٯQč@rȵ0., tbpț|ׯ޻޻ʤY~0., tpʭӵغ׺ӷt0., t0., t0., t0., tѸһ0., tLtFKĊMċF^0/, w=gHaОzڱ]եVќHOp10. >uZ˖[եNȐ;pľ210 xDxzܶs߻ڳQčAsȶľ321 drȜ~ׯ޻ݺ̩Zľ331 qˮӶػ׺ӶԿxľ331 оľ331 ľ331 ľ331 젒êƬȭ˯ͰϲгҴѳϲα̰ɮǬī©ý331 |gcBfDkGoKuN!zR#V$Z&^(c*h-l.p1u3y4}68Ą:Ɉ;͋=э>ԏ>Ҏ>ό=ˉ<Ɔ:97{5w3r2n/i-e+`)\'X%}T#wP"rL mIhFdCbD ¼331 iqKuN zQ"U$Y&^(b*g,l.q0v3{58:<Ï>ȓ@̖BИDԛEםFڟG؞G՜FҚDΗCʔAő?=:9~6x4s2n/i-d*`([&W%|S#wO!sL oM$¼321 mW$[&_(c)h,m.r0x3}69;>ÕAțCˠFЦHӪK׬MڮOݰQRSSޱQۯO٭NիLѨIͣGɝDŘB?<:7z4u1o/j-e*a(]'Y%X*ü321 ͸޺߼޾ðƲǴɶʹ̻;äťǦȨɩʪ˫̬̭̬˫ʪɩȧǦŤ£ο̽ʺȷǵŲïӾӻӸӶӴӸƸ321 ߩݩۨ٨ר֧Ԭȸ210 j˿˿̾;ͽννϼλλͺ̺˺ʹɹȸǸƷķö¶ÿ¾ÿ¿DCAxvs( @ JIF"KJGBLKHBLKIBMKIBMLJBNMKBNMLBNNLBONMBOONBPOOBPPOBPPPBQPPBQQQBQQQBPPPBPPPBPPOBPONBOONBONMBNMLBNMKBMLKBMLJBMKIBLKIBLKHBHFDB320~ǽȿIJDzʲͲвӲֲٲ۲޲߲ݲڲزղҲϲ̲ȲƲòȾXVRQ϶б][WREw\̘WМMōn^[WRm`ȕXҟ?w^[WRu|ʣvڲU^[WR¥չ׼^[WR^[WR^[WRů[Ss^[WREݸjحTΙIv^[WRf}ϧfӤCy^[WRvĜسݻg^[WR̶^[WR^[WR^[WRYKÉQɒJ­^[WRzOÊXҟ?tb`]WkΨvܵڵL|dc`Y̸ťֶٺ{dc`Yνμdc`Ydc`Yw_y`|acdfhjlnpƟqˢsϥtҧuѧuͤtɡrĞqomkigfd~b{ax_~dc`YkHqLxQ"W%]'d+k.r1z58;Ǝ>͒@ӖCיD֘DЕBʐ@Ì=:~7w3p0h-a)[&~T$vO!oJrUdc`Y_3`0f3l6s9z<@DGKšNɦQΩTѬWԮXӭXЫV̨SȥPÞMJFB?w;p8i5d2^0hdc`Yߩܩڨקԩ̸db`X[~~}}|||{{{zz{fdb+(0 ` b_Z>khbQlidQnjfQolhQpnjQrpmQsroQtsrQuutQvvvQwwwQwwwQvvuQutsQtsqQsqoQqolQpmjQnlgQmjeQlicQkgaQFDA,tpjeoUǑPƑtpkgb’߼Ftpkgtض~tpkgtpkgtpkgjXɔQȒ{tpkgcÓFtpkgvضtpkgtpkgtpkge[ʖQɓuuqlhdÔG}{wswط}{ws}{wsŽ}{wrlHuN!V$^(h,q1{59Ƌ=ϒ@ՖBԕB̐?É<8x4n/e+\'}S#rL jH |zvq\_bfjĤnʭrдvպzٽ}ܿؼ|Ӹyβuȩp¡l꼘g鵐b髈^颂[]}yo׿ؾڽܼ޻޴۳زձҰίˮȮ}{wdba`ba`ba`cbacbaccbdcbdccddddddddddddddddccccbcbaba`a`_a`^`_]_^\\[Y(  @|vezzzzzzzzzzzzzzgd_RļyϧѶpeŗqRĠʹؼʹʂâw֬_҈Ĥݽǣp҃dAnExJOTɘYӟ\ў[ǗXSNvIlDc@|reǭζտȞΣѧЦ̡Ŝѻʱӷӏ}~8BBAA@@???>>=}=~{=dc`*launchy-2.5/plugins/controly/controly.png0000644000175000017500000001405211262221417017760 0ustar monesmonesPNG  IHDR>asRGBbKGD pHYs  tIME _OEIDATx{]}?}ь43Hg$G@%C\!8?bލ׏x7M\W\ۋٍI:J\+I qL"#Ӛ}{No8{3%U9}uzt,gGjvod۽5%Te|"9gҜK5'I75hVM&"?}Qo໷p Wb ֣m ZfТ&P̋W*cd3Nfj);!!_$xaxƷ< N(ΧOo@%%BITF+Ш3 kj®8.7UkF/ɛRʫYHWطZhp* J)cU&Ǝ ,p`ntQc4:UIx hPmL/e~ 5@ZL=iJoeF)"H/ts]Xn&Er׌*8N$K2;iHdr$Ӧszsi9kC#^٬ H1^"pt뒸$?o#H~:qq}FNi<tS+4Ҭm2dn֡ӫSF"[ s9K&@I?I'Z$ݸJ_4ZuM6k[gϤ=3 %}oo"m w6$ǠFj \x:kSД6p4 7ozct>F0բFwДj3}iԐ\Ki@\kR-4f|]y4k3@"Cl1pOҗ')DҗFa hI@W.as)L":I.9HRi$f-7YnZk~9Z^k;@`4 yZ1tjVXQ6egE*R-T bsFp8ݚNb'y.g1fgUOY?}>fux?7(ژ툕B"[-:])줉#r(D%-Su{y ?t|A{}Y4l:h…|W$]F(e4"&"9)e Z=FLBv?3G,]q?t|dmq9ixpC)WE'8#XZnŠ#vB=#*:ccUvou_zz@`=zFTbpE/=A4n@b'XEj*G_yϺ_BsM5 &֭w|/=M b[ D0`Z?_=opa8f;ffX;U~'yx=߳hڤ;x0yck_ͅ\DOOn7|CKx&&''9tTKbKC%oN# 000ڵk= ^ZWsun8k͟orߓwogKU[<䷆5uڹZV׽]!Tm9_( 8ȹPep;|OL`B't&G?=O/oH8V:Y&FΎ`pG6(pWrcwzZ.?c G[% Sf1uk9hۘujQL-Sשj=SCz*hŋ_r_&;>s-8hlOv9G=JJuKSN%NpHD$o>MCZ"mhogp#av"nrh~O?~Rfv|F׆kڋ`ϿnGt[5]@KJnWLմuJj3U 﨧-jkZT{K;iSZ͚>_iڂRO== q,Zj~p߾SEj@ueW\U>Ӈ>ogPJlt?nX֥ۙ4oSMtn&48T%{溤 aMwG1✳gaM{ߕɓ'O *pItems; // list to add the items to uint controlyPluginId; // "local cache" (for single scan, temporary): avoid adding same control panel item / element (that are found by different search / browse methods) multiple times // maps display name to boolean indicating if such an item has already been found QHash cplItemNameCache; bool avoidDuplicates; // avoid adding same item multiple times if found by different search strategies? // "global cache" (shared between all scans, performance optimization): avoid repeating expensive analysis (loading, icon extraction, etc.) of cpl dlls - do it only for the very first scan after program startup and stick to the information for repeated scans; // maps file name to cached item information belonging to this file name! static QHash cplItemCache; FhoIconCreator *pIconCreator; bool addControlPanelItself; int addControlPanelSubfolderDepth; public: ControlPanelItemFinder(uint pluginId, FhoIconCreator *pIconGen, QList *pResultList); ~ControlPanelItemFinder(); void findItems(); private: void addControlPanelItem(QString &cacheId); void addControlPanelItem(QString &path, QString &name, int pluginId, QString &iconPath, QString &cacheId); void addCplControlPanelItem(QFileInfo *pCplFileInfo); void addSystem32CplControlPanelItems(); void addRegistryCplControlPanelItems(); void addRegistryExpNsControlPanelItems(); void addShellInfoControlPanelItems(); void addShellInfoItem(LPITEMIDLIST pidlItems, IShellFolder *psfParentItem, bool isRelativePidl, int addSubItemDepths, IShellFolder *psfDeskTop); void addShellInfoItems(IShellFolder *psfParentItem, int addSubItemDepths, IShellFolder *psfDeskTop); void addControlPanel(); }; launchy-2.5/plugins/controly/controly.cpp0000644000175000017500000001764711354223474020002 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "controly.h" #include "ControlPanelItemFinder.h" controlyPlugin* gControlyInstance = NULL; controlyPlugin::controlyPlugin() { HASH_controly = qHash(QString("controly")); gui = NULL; } controlyPlugin::~controlyPlugin() { } void controlyPlugin::setPath(QString * path) { libPath = *path; } void controlyPlugin::init() { if (gControlyInstance == NULL) { // init() is currently called multiple times: // on plugin init and every time when opening the options gControlyInstance = this; // get config / settings directory (base for 'temporary' icon cache dir) QString iniFilename = (*settings)->fileName(); QFileInfo info(iniFilename); QString userDataPath = info.absolutePath(); // create (and store) controly icon cache folder iconCreator.setImagePath(userDataPath + "/controly-icon-cache"); iconCreator.setBaseImageFileName("controly-icon-"); iconCreator.setDefaultImageFileName(getIcon()); iconCreator.setForceDefaultImage(false); } } void controlyPlugin::getID(uint* id) { *id = HASH_controly; } void controlyPlugin::getName(QString* str) { *str = "Controly"; } QString controlyPlugin::getIcon() { return getIconPath() + "/plugins/icons/controly.png"; } QString controlyPlugin::getIconPath() const { return libPath + "/icons/"; } #ifdef Q_WS_WIN void controlyPlugin::getApps(QList* items) { ControlPanelItemFinder *pCplFinder = new ControlPanelItemFinder(HASH_controly, &iconCreator, items); pCplFinder->findItems(); if (pCplFinder) { delete pCplFinder; pCplFinder = NULL; } } #endif void controlyPlugin::getCatalog(QList* items) { getApps(items); CatItem tmp = CatItem("Launchy.controly", "Launchy", HASH_controly, getIcon()); tmp.usage = 5000; items->push_back(tmp); } bool controlyPlugin::isMatch(QString text1, QString text2) { int text2Length = text2.count(); int curChar = 0; foreach(QChar c, text1) { if (c.toLower() == text2[curChar].toLower()) { ++curChar; if (curChar >= text2Length) { return true; } } } return false; } void controlyPlugin::addCatItem(QString text, QList* results, QString fullName, QString shortName) { if (text.length() == 0 || isMatch(shortName, text)) { CatItem& item = CatItem(fullName, shortName, HASH_controly, getIconPath() + fullName.toLower() + ".png"); item.usage = (*settings)->value("controly/" + shortName.replace(" ", "") , 0).toInt(); results->push_back(item); } } void controlyPlugin::updateUsage(CatItem& item) { (*settings)->setValue("controly/" + item.shortName.replace(" ", ""), item.usage + 1); } void controlyPlugin::getResults(QList* inputData, QList* results) { // if user enters "*.controly", dynamically return all elements that we added to the primary catalog (for informational / debugging purposes only) if (inputData->size() == 1) { const QString & text = inputData->first().getText(); if (text.compare("*.controly") == 0) { QList controlyCatalog; getCatalog(&controlyCatalog); CatItem temp("ItemCount.controly", QString::number(controlyCatalog.size()), HASH_controly, getIcon()); temp.usage = 32000; results->append(temp); (*results) += controlyCatalog; } } if (inputData->count() != 2) return; if (inputData->first().getTopResult().id == HASH_controly) { QString text = inputData->at(1).getText(); addCatItem(text, results, "Launchy.options", "Options"); addCatItem(text, results, "Launchy.rebuild", "Rebuild Catalog"); addCatItem(text, results, "Launchy.exit", "Exit"); } } int controlyPlugin::launchItem(QList* inputData, CatItem* item) { item = item; // Compiler warning if (inputData->count() == 1) { // no parameters, just the item itsef QString path = item->fullPath; if (path.contains(",@")) { // dll cpl item indexing containing items, e.g. 'main.cpl,@1' runProgram("control.exe", item->fullPath); //runProgram(cmd, args); // use toNativeSeparators()? } else if ((path.startsWith("csidl:", Qt::CaseInsensitive)) && (path.endsWith(".controly", Qt::CaseSensitive))) { // Constant special item ID list (CSIDL) // shell instance object (special shell extension folder), e.g. 'csidl:0x0014.controly' ('shellinstance:0x0014') QString folderId = path.mid(strlen("csidl:"), strlen(path.toAscii())-strlen("csidl:")-strlen(".controly")); // e.g. 0x0014 = CSIDL_FONTS; bool ok; int folderIdx = folderId.toLong(&ok, 16); if (ok) { LPITEMIDLIST pidl; HRESULT hres = SHGetFolderLocation(NULL, folderIdx, NULL, 0, &pidl); if (hres == S_OK) { SHELLEXECUTEINFO sei; memset(&sei, 0, sizeof(sei)); sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.fMask = SEE_MASK_IDLIST; sei.hwnd = NULL; sei.lpVerb = NULL; sei.lpFile = NULL; sei.lpParameters = NULL; sei.lpDirectory = NULL; sei.nShow = SW_SHOW; sei.hInstApp = NULL; sei.lpIDList = pidl; sei.hProcess = NULL; //it seems we don't need CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); ShellExecuteEx(&sei); CoTaskMemFree((void*)pidl); // needs objbase.h/ole32.lib } } } else { // exe cpl item with command line parameters, e.g. 'rundll32.exe shell32.dll,Options_RunDLL 1' // or item defined via application name, e.g. 'control.exe /name Microsoft.WindowsUpdate' QStringList spl = path.split(".exe "); if (spl.size() == 2) { // split size currently is always 2, as assured above QString executable = spl[0] + ".exe"; QString parameters = spl[1]; runProgram(executable, parameters); } else { runProgram(path, ""); } } return 1; } if (inputData->count() != 2) return 1; CatItem last = inputData->last().getTopResult(); if (last.shortName == "Options") { updateUsage(last); return MSG_CONTROL_OPTIONS; } else if (last.shortName == "Rebuild Catalog") { updateUsage(last); return MSG_CONTROL_REBUILD; } else if (last.shortName == "Exit") { updateUsage(last); return MSG_CONTROL_EXIT; } return 1; } #ifdef WITH_GUI void controlyPlugin::doDialog(QWidget* parent, QWidget** newDlg) { if (gui != NULL) { return; } gui = new Gui(parent); *newDlg = gui; } void controlyPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } if (gui != NULL) { delete gui; } gui = NULL; } #endif int controlyPlugin::msg(int msgId, void* wParam, void* lParam) { int handled = 0; switch (msgId) { case MSG_INIT: init(); handled = 1; break; case MSG_GET_ID: getID((uint*) wParam); handled = 1; break; case MSG_GET_NAME: getName((QString*) wParam); handled = 1; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = 1; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = 1; break; case MSG_LAUNCH_ITEM: handled = launchItem((QList*) wParam, (CatItem*) lParam); break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog(wParam != 0); break; case MSG_PATH: setPath((QString *) wParam); break; default: break; } return handled; } Q_EXPORT_PLUGIN2(controly, controlyPlugin)launchy-2.5/plugins/controly/fhoenv.h0000644000175000017500000000023611262347554017051 0ustar monesmones// Copyright 2009 Fabian Hofsaess #ifndef FHOENV_H #define FHOENV_H class FhoEnv { public: static QString expand(QString str); }; #endiflaunchy-2.5/plugins/weby/0000755000175000017500000000000011355776633014516 5ustar monesmoneslaunchy-2.5/plugins/weby/IconCache.cpp0000644000175000017500000000357711275652054017041 0ustar monesmones#include "precompiled.h" #include "IconCache.h" IconCache::IconCache(const QString& path) : cachePath(path) { nam.setParent(this); connect(&nam, SIGNAL(finished(QNetworkReply*)), SLOT(finished(QNetworkReply*))); QFileInfo info(path); if (!info.exists()) { QDir d; d.mkdir(path); } } QString IconCache::getIconPath(const QString& site) { QString cachedName = site; if (site.contains("http")) cachedName = QUrl(site).host(); qDebug() << cachedName; //cachedName = cachedName.replace("http:", "").replace("https:", "").replace("/", ""); QFileInfo info; info.setFile(cachePath, cachedName + ".png"); if (info.exists()) return info.size() > 0 ? info.absoluteFilePath() : QString(); info.setFile(cachePath, cachedName + ".ico"); if (info.exists()) return info.size() > 0 ? info.absoluteFilePath() : QString(); if (!site.startsWith("http")) return ""; // Call the main thread to grab the icon in the background emit findIcon(QUrl("http://" + QUrl(site).host() + "/favicon.ico")); return ""; } void IconCache::query(QUrl url) { qDebug() << "Going for" << url; QNetworkRequest request; request.setUrl(url); request.setAttribute(QNetworkRequest::User, url); nam.get(request); } void IconCache::finished(QNetworkReply* reply) { QUrl url = reply->url(); if (reply && reply->error() == QNetworkReply::NoError) { QFile file(cachePath + url.host() + ".ico"); if (!file.open(QIODevice::WriteOnly)) { qDebug() << "Could not open icon for writing"; return; } QByteArray ba = reply->readAll(); file.write(ba); } reply->deleteLater(); /* QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (redirectionTarget.isValid()) { delete reply; reply = depth < 5 ? query(redirectionTarget.toUrl(), depth + 1) : NULL; } */ } launchy-2.5/plugins/weby/gui.cpp0000644000175000017500000001312611331664610015772 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "gui.h" #include "weby.h" #define ROW_PADDING 6 Gui::Gui(QWidget* parent) : QWidget(parent) { setupUi(this); QSettings* settings = *gWebyInstance->settings; if (settings == NULL) return; booksFirefox->setChecked(settings->value("weby/firefox", true).toBool()); booksIE->setChecked(settings->value("weby/ie", true).toBool()); // Stretch the last column of the table table->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch); // column 1 // Read in the array of websites from options table->setSortingEnabled(false); int count = settings->beginReadArray("weby/sites"); table->setRowCount(count); for(int i = 0; i < count; ++i) { settings->setArrayIndex(i); table->setItem(i, 0, new QTableWidgetItem(settings->value("name").toString())); table->setItem(i, 1, new QTableWidgetItem(settings->value("query").toString())); //table->setItem(i, 2, new QTableWidgetItem(settings->value("suggest").toString())); bool isDef = settings->value("default",false).toBool(); if (isDef) { defaultName = settings->value("name").toString(); label_default->setText(defaultName); } table->verticalHeader()->resizeSection(i, table->verticalHeader()->fontMetrics().height() + ROW_PADDING); } settings->endArray(); table->setSortingEnabled(true); connect(table, SIGNAL(dragEnter(QDragEnterEvent*)), this, SLOT(dragEnter(QDragEnterEvent*))); connect(table, SIGNAL(drop(QDropEvent*)), this, SLOT(drop(QDropEvent*))); connect(tableNew, SIGNAL(clicked(bool)), this, SLOT(newRow(void))); connect(tableRemove, SIGNAL(clicked(bool)), this, SLOT(remRow(void))); connect(pushDefault, SIGNAL(clicked(bool)), this, SLOT(makeDefault(void))); connect(pushClearDefault, SIGNAL(clicked(bool)), this, SLOT(clearDefault(void))); } void Gui::writeOptions() { QSettings* settings = *gWebyInstance->settings; if (settings == NULL) return; settings->setValue("weby/firefox", booksFirefox->isChecked()); settings->setValue("weby/ie", booksIE->isChecked()); settings->beginWriteArray("weby/sites"); for(int i = 0; i < table->rowCount(); ++i) { if (table->item(i,0) == NULL || table->item(i,1) == NULL) continue; if (table->item(i,0)->text() == "" || table->item(i,1)->text() == "") continue; settings->setArrayIndex(i); settings->setValue("name", table->item(i, 0)->text()); settings->setValue("query", table->item(i, 1)->text()); //settings->setValue("suggest", table->item(i, 2)->text()); if (table->item(i,0)->text() == defaultName) settings->setValue("default", true); else settings->setValue("default", false); } settings->endArray(); } void Gui::newRow() { bool sort = table->isSortingEnabled(); if (sort) table->setSortingEnabled(false); int row = table->rowCount(); table->insertRow(row); table->setItem(row, 0, new QTableWidgetItem()); table->setItem(row, 1, new QTableWidgetItem()); table->setItem(row, 2, new QTableWidgetItem()); table->setItem(row, 3, new QTableWidgetItem()); table->verticalHeader()->resizeSection(table->rowCount()-1, table->verticalHeader()->fontMetrics().height() + ROW_PADDING); table->setCurrentCell(table->rowCount()-1, 0); table->editItem(table->currentItem()); table->setSortingEnabled(sort); } void Gui::remRow() { int row = table->currentRow(); if (row != -1) { table->removeRow(row); if (row >= table->rowCount()) row = table->rowCount() - 1; table->setCurrentCell(row, table->currentColumn()); } } void Gui::dragEnter(QDragEnterEvent *event) { const QMimeData* mimeData = event->mimeData(); if (mimeData && (mimeData->hasUrls() || mimeData->hasText())) event->acceptProposedAction(); } void Gui::drop(QDropEvent *event) { const QMimeData* mimeData = event->mimeData(); if (mimeData) { if (mimeData->hasUrls()) { foreach(QUrl url, mimeData->urls()) { table->setSortingEnabled(false); QString qs = QUrl::fromPercentEncoding(url.encodedQuery()); appendRow(url.path() ,qs); // appendRow(url.path(), url.toString(QUrl::RemoveQuery), qs); table->setCurrentCell(table->rowCount()-1, 0); table->setSortingEnabled(true); } } else if (mimeData->hasText()) { table->setSortingEnabled(false); appendRow(mimeData->text(), ""); table->setCurrentCell(table->rowCount()-1, 0); table->setSortingEnabled(true); } } } void Gui::makeDefault() { int row = table->currentRow(); if (row > -1) { defaultName = table->item(row,0)->text(); label_default->setText(defaultName); } } void Gui::clearDefault() { defaultName = ""; label_default->setText(defaultName); } void Gui::appendRow(const QString& name, const QString& path) { int row = table->rowCount(); table->insertRow(row); table->setItem(row, 0, new QTableWidgetItem(name)); table->setItem(row, 1, new QTableWidgetItem(path)); table->setItem(row, 2, new QTableWidgetItem()); table->verticalHeader()->resizeSection(row, table->verticalHeader()->fontMetrics().height() + ROW_PADDING); } launchy-2.5/plugins/weby/gui.h0000644000175000017500000000234511331664610015440 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GUI_H #define GUI_H #include "ui_dlg.h" #include "globals.h" class Gui : public QWidget, private Ui::Dlg { Q_OBJECT private: QList sites; public: Gui(QWidget* parent); ~Gui() { this->hide(); } void writeOptions(); QString defaultName; public slots: void newRow(); void remRow(); void dragEnter(QDragEnterEvent *event); void drop(QDropEvent *event); void makeDefault(); void clearDefault(); private: void appendRow(const QString& name, const QString& path); }; #endif launchy-2.5/plugins/weby/IconCache.h0000644000175000017500000000070211334674233016470 0ustar monesmones#ifndef ICONCACHE_H #define ICONCACHE_H #include #include class IconCache : public QObject { Q_OBJECT public: IconCache(const QString& path); QString getIconPath(const QString& site); public slots: void finished(QNetworkReply*); void query(QUrl url); signals: void findIcon(QUrl url); private: QString cachePath; QNetworkAccessManager nam; // QEventLoop loop; }; #endif // ICONCACHE_H launchy-2.5/plugins/weby/weby.cpp0000644000175000017500000003474311350036220016153 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "weby.h" #include "IconCache.h" #include "gui.h" WebyPlugin* gWebyInstance = NULL; int Suggest::currentId = 0; Suggest::Suggest() { connect(&http, SIGNAL(done(bool)), this, SLOT(httpGetFinished(bool))); } void Suggest::run(QString url, QString query) { this->query = query; url.replace("%s", QUrl::toPercentEncoding(query)); QUrl u = QUrl::fromPercentEncoding(url.toAscii()); http.setHost(u.host(), u.port(80)); http.get(u.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority)); id = ++currentId; loop.exec(); } void Suggest::httpGetFinished(bool error) { if (id == currentId) { if (query.count() > 0) { results << query; } if (!error) { QRegExp regex("\\[.*\\[(.*)\\]\\]"); QRegExp rx("\"((?:[^\\\\\"]|\\\\\")*)\""); QString text = http.readAll(); if (regex.indexIn(text) != -1) { QString csv = regex.cap(1); int pos = 0; while ((pos = rx.indexIn(csv, pos)) != -1) { QString result = rx.cap(1); if (result.count() > 0) results << result; pos += rx.matchedLength(); } } } loop.exit(); } } void WebyPlugin::init() { if (gWebyInstance == NULL) gWebyInstance = this; QSettings* set = *settings; // get config / settings directory (base for 'temporary' icon cache dir) QString iniFilename = set->fileName(); QFileInfo info(iniFilename); iconCachePath = info.absolutePath() + "/weby-icon-cache/"; iconCache = new IconCache(iconCachePath); iconCache->setParent(this); connect(iconCache, SIGNAL(findIcon(QUrl)), iconCache, SLOT(query(QUrl))); double version = set->value("weby/version",0.0).toDouble(); if ( version == 0.0 ) { int i = 0; set->beginWriteArray("weby/sites"); set->setArrayIndex(i++); set->setValue("name", "Google"); set->setValue("query", "http://www.google.com/search?source=launchy&q=%1"); //set->setValue("suggest", "http://suggestqueries.google.com/complete/search?output=firefox&q=%1"); //set->setValue("default", true); set->setArrayIndex(i++); set->setValue("name", "Bing"); set->setValue("query", "http://www.bing.com/search?q=%1"); set->setArrayIndex(i++); set->setValue("name", "Yahoo"); set->setValue("query", "http://search.yahoo.com/search?p=%1"); //set->setValue("suggest", "http://ff.search.yahoo.com/gossip?output=fxjson&command=%1"); set->setArrayIndex(i++); set->setValue("name", "Weather"); set->setValue("query", "http://www.weather.com/weather/local/%1"); set->setArrayIndex(i++); set->setValue("name", "Amazon"); set->setValue("query", "http://www.amazon.com/gp/search?keywords=%1&index=blended"); set->setArrayIndex(i++); set->setValue("name", "YouTube"); set->setValue("query", "http://www.youtube.com/results?search_query=%1"); set->setArrayIndex(i++); set->setValue("name", "Wikipedia"); set->setValue("query", "http://en.wikipedia.org/wiki/Special:Search?search=%1&fulltext=Search"); //set->setValue("suggest", "http://en.wikipedia.org/w/api.php?action=opensearch&search=%1"); set->setArrayIndex(i++); set->setValue("name", "Dictionary"); set->setValue("query", "http://dictionary.reference.com/browse/%1"); set->setArrayIndex(i++); set->setValue("name", "Thesaurus"); set->setValue("query", "http://thesaurus.reference.com/browse/%1"); set->setArrayIndex(i++); set->setValue("name", "Netflix"); set->setValue("query", "http://www.netflix.com/Search?v1=%1"); set->setArrayIndex(i++); set->setValue("name", "MSDN"); set->setValue("query", "http://search.msdn.microsoft.com/search/default.aspx?siteId=0&tab=0&query=%1"); set->setArrayIndex(i++); set->setValue("name", "E-Mail"); set->setValue("query", "mailto:%1"); set->setArrayIndex(i++); set->setValue("name", "IMDB"); set->setValue("query", "http://www.imdb.com/find?s=all&q=%1"); set->setArrayIndex(i++); set->setValue("name", "Maps"); set->setValue("query", "http://maps.google.com/maps?f=q&hl=en&geocode=&q=%1&ie=UTF8&z=12&iwloc=addr&om=1"); set->endArray(); } // Read in the array of websites sites.clear(); int count = set->beginReadArray("weby/sites"); for (int i = 0; i < count; ++i) { set->setArrayIndex(i); WebySite s; s.name = set->value("name").toString(); s.query = set->value("query").toString(); s.suggest = set->value("suggest").toString(); s.def = set->value("default", false).toBool(); // Ditched the 'base' value between 1.0 and 2.0 // Also replaced %s with %1,%2,%3... if (version == 2.0) { s.query.replace("%s","%1"); s.query = set->value("base").toString() + s.query; /* Out of scope for 2.2 if (s.name == "Google") s.suggest = "http://suggestqueries.google.com/complete/search?output=firefox&q=%1"; else if (s.name == "Yahoo") s.suggest = "http://ff.search.yahoo.com/gossip?output=fxjson&command=%1"; else if (s.name == "Wikipedia") s.suggest = "http://en.wikipedia.org/w/api.php?action=opensearch&search=%1"; */ } sites.push_back(s); } set->endArray(); // Save any upgrades we made from 2.0 if (version == 2.0) { set->beginWriteArray("weby/sites"); for(int i = 0; i < sites.count(); i++) { set->setArrayIndex(i); set->setValue("name", sites[i].name); set->setValue("query", sites[i].query); set->setValue("suggest", sites[i].suggest); set->setValue("default", sites[i].def); } set->endArray(); } set->setValue("weby/version", 2.2); } void WebyPlugin::getID(uint* id) { *id = HASH_WEBY; } void WebyPlugin::getName(QString* str) { *str = "Weby"; } void WebyPlugin::getLabels(QList* inputData) { if (inputData->count() > 1) return; // Apply a "website" label if we think it's a website const QString & text = inputData->last().getText(); QString defaultMatchExpression = "^(http|https|ftp)://|^www.|.com|.co.[a-z]{2,}|.net|.org"; QString matchExpression = (*settings)->value("weby/UrlRegExp", defaultMatchExpression).toString(); QRegExp regex(matchExpression); if (!regex.isValid()) { qDebug() << QString("Settings match expression \"%1\" is invalid. Using default.").arg(matchExpression); regex = QRegExp(defaultMatchExpression); } if (regex.indexIn(text) != -1) { inputData->last().setLabel(HASH_WEBSITE); } } void WebyPlugin::getResults(QList* inputData, QList* results) { if (inputData->last().hasLabel(HASH_WEBSITE)) { const QString & text = inputData->last().getText(); // This is a website, create an entry for it if (!text.trimmed().isEmpty()) { results->push_front(CatItem(text + ".weby", text, HASH_WEBY, getIcon())); } } if (inputData->count() > 1 && (unsigned int)inputData->first().getTopResult().id == HASH_WEBY) { const QString & text = inputData->last().getText(); // This is user search text, create an entry for it QString suggestUrl; CatItem* item = &inputData->first().getTopResult(); foreach(WebySite site, sites) { if (item->shortName == site.name) { suggestUrl = site.suggest; break; } } if (!suggestUrl.isEmpty() && !text.trimmed().isEmpty()) { // query the web Suggest suggest; suggest.run(suggestUrl, text); foreach(QString res, suggest.results) { results->push_back(CatItem(res + ".weby", res, HASH_WEBY, item->icon)); } } else { results->push_front(CatItem(text + ".weby", text, HASH_WEBY, item->icon)); } } // If we don't have any results, add default if (results->size() == 0 && inputData->count() <= 1) { const QString & text = inputData->last().getText(); if (!text.trimmed().isEmpty()) { QString name = getDefault().name; if (name != "") { inputData->first().setLabel(HASH_DEFAULTSEARCH); results->push_back(CatItem(text + ".weby", name, HASH_WEBY, getIcon())); } } } } #ifdef Q_WS_WIN QString GetShellDirectory(int type) { wchar_t buffer[_MAX_PATH]; SHGetFolderPath(NULL, type, NULL, 0, buffer); return QString::fromUtf16(buffer); } void WebyPlugin::indexIE(QString path, QList* items) { QDir qd(path); QString dir = qd.absolutePath(); QStringList dirs = qd.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); for (int i = 0; i < dirs.count(); ++i) { QString cur = dirs[i]; if (cur.contains(".lnk")) continue; indexIE(dir + "/" + dirs[i],items); } QStringList files = qd.entryList(QStringList("*.url"), QDir::Files, QDir::Unsorted); for (int i = 0; i < files.count(); ++i) { items->push_back(CatItem(dir + "/" + files[i], files[i].mid(0,files[i].size()-4))); } } #endif QString WebyPlugin::getFirefoxPath() { QString path; QString osPath; #ifdef Q_WS_WIN osPath = GetShellDirectory(CSIDL_APPDATA) + "/Mozilla/Firefox/"; #endif #ifdef Q_WS_X11 osPath = QDir::homePath() + "/.mozilla/firefox/"; #endif #ifdef Q_WS_MAC osPath = QDir::homePath() + "/Library/Application Support/Firefox/"; #endif QString iniPath = osPath + "profiles.ini"; QFile file(iniPath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return ""; bool isRel = false; while (!file.atEnd()) { QString line = file.readLine(); if (line.contains("IsRelative")) { QStringList spl = line.split("="); isRel = spl[1].toInt() != 0; } if (line.contains("Path")) { QStringList spl = line.split("="); if (isRel) path = osPath; path += spl[1].mid(0,spl[1].count()-1) + "/bookmarks.html"; break; } } return path; } QString WebyPlugin::getIcon() { return libPath + "/icons/weby.png"; } void WebyPlugin::indexFirefox(QString path, QList* items) { QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; marks.clear(); QRegExp regex_url("([^<]*)", Qt::CaseInsensitive); QRegExp regex_shortcut("SHORTCUTURL=\"([^\"]*)\""); QRegExp regex_postdata("POST_DATA", Qt::CaseInsensitive); while (!file.atEnd()) { QString line = QString::fromUtf8(file.readLine()); if (regex_url.indexIn(line) != -1) { Bookmark mark; mark.url = regex_url.cap(1); if (regex_urlname.indexIn(line) != -1) { mark.name = regex_urlname.cap(1); if (regex_postdata.indexIn(line) != -1) continue; if (regex_shortcut.indexIn(line) != -1) { mark.shortcut = regex_shortcut.cap(1); marks.push_back(mark); items->push_back(CatItem(mark.url + ".shortcut", mark.shortcut, HASH_WEBY, getIcon())); } else { items->push_back(CatItem(mark.url, mark.name, 0, getIcon())); } } } } } WebySite WebyPlugin::getDefault() { foreach(WebySite site, sites) { if (site.def) { return site; } } return WebySite(); } void WebyPlugin::getCatalog(QList* items) { foreach(WebySite site, sites) { QString iconName = iconCache->getIconPath(site.query); items->push_back(CatItem(site.name + ".weby", site.name, HASH_WEBY, iconName.length() > 0 ? iconName : getIcon())); } #ifdef Q_WS_WIN if ((*settings)->value("weby/ie", true).toBool()) { QString path = GetShellDirectory(CSIDL_FAVORITES); indexIE(path, items); } #endif if ((*settings)->value("weby/firefox", true).toBool()) { QString path = getFirefoxPath(); indexFirefox(path, items); } } void WebyPlugin::launchItem(QList* inputData, CatItem* item) { QString file = ""; QStringList args; int i = inputData->count() == 1 && inputData->first().hasLabel(HASH_DEFAULTSEARCH) ? 0 : 1; for (; i < inputData->count(); i++) { QString txt = inputData->at(i).getText(); txt = QUrl::toPercentEncoding(txt); args.push_back(txt); } // Is it a Firefox shortcut? if (item->fullPath.contains(".shortcut")) { file = item->fullPath.mid(0, item->fullPath.count()-9); file.replace("%s",args[0]); } else { // It's a user-specific site bool found = false; foreach(WebySite site, sites) { if (item->shortName == site.name) { found = true; file = site.query; if (args.count() == 0) { // if no addition parameters have been entered and the weby URL has placeholders to take parameters, // strip the URL down to its root and launch that if (file.contains("%1")) { QRegExp regex("^(([a-z]*://)?([^/]*))"); if (regex.indexIn(file) != -1) { file = regex.cap(0); } } } else { // Fill additional parameter placeholders for (int i = 0; i < args.size(); i++) file = file.arg(args[i]); } break; } } if (!found) { file = item->shortName; // Make sure we have a protocol if (!file.startsWith("http://") && !file.startsWith("https://") && !file.startsWith("ftp://")) { file = "http://" + file; } } } QUrl url(file); runProgram(url.toString(), ""); } void WebyPlugin::doDialog(QWidget* parent, QWidget** newDlg) { if (gui != NULL) return; gui.reset(new Gui(parent)); *newDlg = gui.get(); } void WebyPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } gui.reset(); } void WebyPlugin::setPath(QString * path) { libPath = *path; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog(wParam != 0); break; case MSG_PATH: setPath((QString *) wParam); default: break; } return handled; } Q_EXPORT_PLUGIN2(weby, WebyPlugin) launchy-2.5/plugins/weby/precompiled.h0000644000175000017500000000236011257666017017166 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PRECOMPILED_H #define PRECOMPILED_H #ifdef _MSC_VER #pragma warning(push,3) #endif #include #include #include #ifdef _MSC_VER #pragma warning(pop) #endif #include #include using namespace boost; #ifdef Q_WS_WIN #include #include #include #include #include #include #endif #endif // PRECOMPILED_H launchy-2.5/plugins/weby/weby.png0000644000175000017500000000434011042734573016161 0ustar monesmonesPNG  IHDR szzsRGBbKGD pHYs  tIME4px'`IDATXŗk]U{wf޶)-BQQ~H|3FC@5?EECBR u( EiNg3G{ُ{[ZJD'䜜{kRDوzҲhu~fgLUѱg{v> 6lK{q&e^,I^}oWNnc[;Q KZyڛ*YlJ3J3qZ93&O|0>6&>M(jqNHp2'e۸o/:--$1O[DeH[%( ph/Z̤cPZ&(Ŏ08AƎxng1z|9QbD@ Hz:76kRyU'){nNk>{{,zG"1 "04_U1q[O@@B"4\a+u XVA и[ vK0QBK ,ECGB@#P/d%aaBx_YzVzXqcb(X(^S+"Z1TUpup  uDb:;;V}ã~2\88*N {Wѭ`=(AGd4G%9:IT'iD( wi)H ZȵpK^47^IF.7<"ӆ Z3xrYh΂}(DJpk :qyVo4ƃD$ChEu+팁B82T({zUTZ9:UpѼ6:[ r B@At &F88(cxQ8.Oz@߾h<GUY>GNB8ׄPhFC!QJ=\ QLIAt &!`غ1 u fBcTNqD9j0‹Fy>z W褤Lx ɴaV%f3%3а8'bADXQ`2z|ɑ#Omw5b%-9\լX4KudN T"o&jB|X)0(${ys2<<ZF1-*ILFAF[LᄺuΣQj5, )BLb򦲦R}z&L@g骔)8lh+ܖC9 No飵dƗ^g}4s[!k!3t&(CD+fGxJ1ƃkΨڭaφ3?$m$˘6)I TC(jҚJ+Z Y+W\xl].jT6*QcZ&56Vi@!Ղ^7R!Moք| ژ(vU͠`}APfd.>Ǻue[f]룯hODTi@4$Pw茑=On[;2jVNB߆efr]οҐLPhx@D*-jcGģįwFUIz{z̜+eo_ut)1].`H [݃ >M6*0 wӚ ZHEˮ̗,hҮRi# 2vmo8jSMOMs2MS$N5[5]ZHIENDB`launchy-2.5/plugins/weby/weby_full.ico0000644000175000017500000061273610673261500017201 0ustar monesmones000F 0v00hV  (00 ^!*h0(66``^>PPgHHT:@@(Bv00% F hv(0`@ B)@J($IT %D  I* @P@ HA P@@DB P H!P(("@PWP @Z Vv UXD,*  $XI@*P?????( @@ @$U@TD$PHP@H$ ( Ha yJ@jB)???( @@ "D( -  ?(0`ww~~p|p~pnn~nngnlpf쎎~~~nnnfhnxllvl~n`ll掇~llgfnw~nfllf~xnnf`vFflxnllf@Ffx~~nfdgFFllvvfFFFFf~~~|fddFFF||~lfvF$dln~~~glf~xddf~|lnvwp`Fxnnx~vlnf~~~pdglvngwdwxnvfg~~p'lflhhwpFvfg~fvhGxlngg~xv&~Ύ~fffwxG|莎vffFwFx莈~vfdwxd~fdfg~xv~~lffeg|`~vtfwfdphx|ffF~Tdg舏llfddwg`fgfFFf~xph興llfegwhlgfFFGfxlftddfGh|thdgwFFw|xFGxgddhxww?????( @v~g~nxwng~`l掌~nlnΌl`ll~lfhf掎llLlfpfnxΌfld`tll莎nf@FFwlf|hdfn~~lggBG|~g|Fh~|lhw|gff|Fvl~vhxdh~fgwv~|lgpfffGx~|fvǀxffvwdh舏vFghfvFgxvd|~臎GFg舆fGpxFhx???(0 ~n쎌f`lfnplΎ|l`fffgFFdhg|FvvGf~wgflhgh|fh~H~ghvgfxv@ffdwxFV膆tgfvp?( ~vn`lxgf~fpg~pvfw~Όlh莎nf~xtgd|gvp?(0` K+R.L0W4Z>g<^BlBxH|RfFsK{UwY)b,}b3LOUY]\a c `egejnnq przs t xy krxc(d"p)h6k5p>s<v'y7tw{|{ | }nDwDzYW,*.=;8‚̓ωÁ̂ ӄӋٌ҅ چ ׈ ܉ Аڒ֘ߖ ՜ ʄԌܑ՟ۑ   Ɉ#Տ%Ȑ)ږ&Ɠ?ә<!ޢ5!!!! "(+"&$(1;<2>17;<&0IPWJJ@UTUTS[[^bhqudohfstwy{umr|x˘DҜGÛXٮFԣL΢Yէ[DCJIBNNZSQ[[QR[cɥhԭkܳiťsԭrٴvgguU[\bckkktt{͵дƴ㿂ξĄ̊։֑ȳɓvssssr]GEwˀsssssroYEjlvsssoolkWU`jkɛtsokkaV@KUaakookkaVOID6OV`ezokbaVOJ#C#6JVXnmb`VOJ#!F#6JPxkb`VN766:[mfcV:76(6MӘgecRN7#336Տ~~xxfdcRN5{{qqqgfdcR:5,1%~{{qqxgfdcR96 %%Ԟq{qqigddTQ9% 1 %~qiiiid\TM%%. (*~~{iiiiidd\QM'  Æ[h}~~~~}iiid^QM;$)F  2*LQ\di}~~}ih\\TZZ'$(Fê+ -BL[\}}~~}h\^[Z*& Cê H&L[ih^Q;Z&$ Fê Ʀ(&߈~h^[;** (ê )h|~h^Z;*& í.3)B\hx~\MB&((׮.ר(@w^[;B&(׮.- ghZ;')׮.h^[Z;)( +׶>hZB;(( ׽぀^[;)( 㟟hZ;)( =~h^Z;*(( 10<<{~h^Z;;)( . >0M;;(( ;')( =0*&( = ( 112(  1 2, . 1Cڤ.  =?ץ+ /=۪ݨ =פ  ۽??????( @L,S.V5c:k>p>j@lB uDzDvH}KrG uJ }N {R iK{SwW&iFLNOQTT U Z [ SVY\\ X_^d idcjfk k ehloq rt x lqpuzz|`"m&r'g6k3r;u9z;t,z)}'{7uw|{ ~ uB}CtHzM}L%7:˂ǃʃՄՌӃ ی ˒ڑޝƄ˅Έ˅ՌȘܒ   ď%͊(͑-ٜ4!ܠ;""!*-"$.14>923=&BNICLLPUT[TV[[YaldaexxutƖEʛLÛXӨB̡YפRLM@AFLSP[\QZş`ȥjիh۲iĥzԮtܶu`dlkdmFJU\cdjjnli}rptx}wŰҴȴ忄Ń̈؊ݓƨʵ믧ċgazʠ}y_`kyʀ}yk\D;X`r˙}lj\XE9IX`~lj\I3H.3Xޝnj\K3..3eÞni]J0$#$0ފomi[I.! !*L۟om^M3( Q  (;矉qi]L1(8wqifc36&E= UYhsxtf]Y9,A TYtʉxpfN;2,CW:Țxfe;:,'=FUrufe:2&ḚE":rufN9,&>̵̥vhe<6,ᗗuN9,&hc;6&#Bٔte;6+"SS@]<6+"BR;6+" <*+" AAG&F' SEդD BѤDA@???(0@Y= a9i<qB{KvK {M }TaCkKuLuMrU{a7MNR\ RW[\ P_`a dh dbcdgj lgks pu x fjnss{twyyw~|\&h c)k)e&a0n:v#w,z-6y=tx|~z kHtBtS|U/:9>ˀ׋׏׈Ѐ ًׄܓ˅Lj̈€˅˄ΈЉ؏ݐ۔ڑ   ٢ = ܡ3(!"!%.2:=8&(DEOHKGLVTRT\\\bbdeciir~syʙOÚTYœZΠF۰MܪXMNDFBFLTWVQX`˦eϫlڲ`˨rϰ۳sfhhcist}WUX]]^acddejohkl{qpqpԷ²ʷԼ⾆ѿÆňɆʊ؁Ҍۉے˵ԺxxrNsyugZWzҎtgR/(PcҿvgRD.,%F׉jSD$$^ߑ~|ljUD G޸}}leT'=6~~}pmVG#[o~qmbY)"A JLYd`X&>H5{nY2"@J -a\-M No_3+8 эd\-䓍n^0*:^3+ 0"4*9=?;7IǰB ťn |+z rz  jExL~S'=0?8=ۊׅ ې·ωŁь֎ɒ̞*ʢ?#'") $#&4?38<&%=FD@FPYQTX[clhjtš^ާM֧\ILZSTXYͦiͪmկniSZ\jefnotֵպĵ㼀Ͽ̆ЇԆҎænQPe'*1:SJVJA8#ifc-ZJYYT?60kgi/[T_YS;.lp)}a_VB9 o|\7 bpjs1d!{q+?(        !"#$$%%%&&&&&&&%%%$##"!    !#%&()*+,-.//001112222211100/..-,+*('%$"!  !#%'*+-/ <(V1$q5' 8( N; dN cN cN cN cM J8 7( 5& /"r%[ D<<<<;;;::99887654310.,+(&$"  !$'*,.1# K:-zYHs˪Οݪ̝{ |d H7 0#~SCCCBBAA@@?>=<;:986420-+(%"  !%(,/3 A;/ymY%-Ԫ/;JA+ u UA -!{ MHGGFFFEDDCBA@?=<:8631.*'#  "',03:0# qt])ϧ0BLU\WSV\M3"٥ `J )vKJJJIIIHHGFEDCB@?=;852.)%   !'-26#[S? { פ &Y\VPMMNNNNQ]Q7 ўu I8 cKKKKKJJJIIHGFEDC@>;840*$  #*16.!ra œܮGTNNNNNNNNNNNP]L,oV 'uLLLLLKKKKJJIIGFEC@=94.'   "+3/"tj ϙ'[OOOOOOOOOOOOOOWT:&Ǔ}` (wMMMMLLLLLKKJJIGFD@<6/& & '(Ye ̖ݧ*^PPPPPPPPPPPPPPPR]T:# ÑuX fMMMMMMMLLLKKJIHEB<5," C/D0$ 4ZD ݨ,^PPQQQQQQQQQQQQQQQS^R0ޜO; VMMMMMMMMLLLKJHD@80% bDbD2" J6 ut זޙݦ-_QQQQQQQRRRRRRRRRRRRTa+ ݘєl -!MMMMMMMLLLKJHD@80% }V}U[?$`Čٔܗޚ ݧ-_RRRRRRRRRRRRRRRRRRRRXJ ## ݙږדeK  ]MMLLLKKJIHEB<5," dvTas Ѝ֐ٓܕޗ ݦ-`SSSSSSSSTTTTTTTTTTTTT]>3F]UL1ݖڕבԎ͋i %rLKKJJIGFD@<6/& i_}ωҌ֏ّܓޖ ݦ/aTTTTTTTTTTTTTTTTTTTTT[T`\UUYb߮JݕڒאԎъ͈yI6 IIGFEC@=94.' m_ˆϋҍ֏ْܕޗڧ8`UVVVVVVVVVVVVVVVVVVVVVVVVVVVVa/ ݖڔאԎь͈ʅ~]E  NC@>;840*$ k!c €ȃˆωҋ֏ّܓޖ1XXVVVVWWWWWWWWWWWWWWWWWWWWWWWWW\Kݕڒאԍъ͈ʅƁ~xW O852.)%  i$h |ȃ˅ψҋ֎ّܔޖ ާ4Z\WWWXXXXXXYYYYYYYYYYYYYYYYYYYXXX^- ݕڒ׏ԍщ͆ʄƁ}{_ H*'# g&i xz~ȁ˃χҊ֌ِܒޕ)٩GaZXXXXXXYYYYYYYYYZZZZZZZZZYYYYYYYYc<ݓڑ׎ԋш͆ʂƀ|yw` = e$g svz|˃υ҉֋ٍܐޓܡ-[`YZZZZZZZZZZ[[[[[[[[[[[[[[[[[[[[ZZZ`Iݒڏ׌Ԋӵ́ʁ~{xtra 0   c$d osvy|˂υ҈֋َܐޓ1ݰY^ZZZZ[[[[[[[[[[[[\\\\\\\\\\\\\[[[[[[aMݑڏ׌ԉч̓ʁ~zxuqn^ 2"&8#:%,  `a losuy|~˂υ҈֋ٍܑޓן3\`[[[\\\\]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`R# ݒڏ׌ԉц̓ʀ}{wtqmk[ dAU5H-<&^[٭ikorux{ˁτ҇֊ٍܐߖ כ,g_]]]]]]^^^^^^^^^^_________________^^^^^c5 ݑڎ׌Ԉц͂ʀ}ywspmih{XnG{Xfgknqtw{}ˀσ҆֊ٌ܏֦Kb]]^^^^^^^___________``````````_________b_4 ݐڎ׋Ԉх͂~|yusolifd|V W|acfikorvx|~ς҅ևيݏ ݞ.߱^_____````````````aaaaaaaaaaaaaaaaaaa`````ce5 ݏڋ׉Ԇф̀}zwtpmjgea_{UfV 3^^behlnrux{~ρ҅ևٌޗΛBh```aaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbda0 ݎڌ׈Ԇу̀|zvtpmjfd`]] Y!WY [_bdhkoqux{~ρ҄ֈۓӜ>iaaaaaabbbbbbccccccccccccccccccccccccccccccbbfY! ݎڋ׉ԅу}yvsplifc`\ZW֍WW ZZ^adgknqtx{~ρ҅ؐИ8fbbcccccccccddddddddeeeeeeeeeeeeeeeeeeddddddddcb+ ݎڋ׈Ԇт̀|zusomifb`\YY~V~S BWVZ\_beilorvy|πՉΔ6fdcddddddeeeeeeeeeffffffffffffffffffffffffeeehmog& ݌ډ׆ԃр}{wtqnjgca^[XUWS 'S V SVY\_bfilosuy|у ͏-ݮceddddeeeeeffffffffffggggggggggggggghmqqqqqpprWFߣ3* ݌ډ׆ԃр}zwtqnkgd`^ZXTR}U{T{RRUX[^adgjoquw{ӈѠSheffffffffggggghhhhhhhhhhhhhhhhhhhhhpުI85544441* ݊ڈׅԃ|yvspmifc_]YVTPRyRfPTNRTX[^adgknqtx{ҋ"֧\fggggghhhhhhhhiiiiiijjjjjjjjjjjjkprt^2 ݋ڈׅԂ|yvsomifb`\ZUSPMS P~S LMQSWZ^`dfjmptvzӋ$ѠUjgghhhhiiiiiiiijjjjjjjkkkkkkkkkn_NB7, ݊ ڇׄԁ~{xurokheb_\XUROLMzRzzO "OJMOSVY\_bfilorv{ Ҏ-ר`jiiiiijjjjjkkkkkkkklllllllllllltF* ݉ چ ׄԀ~zwtqnjgda][WTQNLHP MxSGILORUX[^behkoru| ʒ@rijjjjjjkkkkklllllllllmmmmmmmmmmsL ݉ چ ׂ |yvspmjfc`]YVSPMKHHxQ }{KMEIKNQTW[]adhknqu{ Ȋ/okkkklllllllmmmmmnnnnnnnnnnnnooqm8 ݈ څ ւ  |yvspljfb_\YVRPLJGD|O {K xP }DEHJNPTWZ]`dhjnqtx ͆ɗKrllllmmmmmmmnnnnnooooooooooooqi<" ݇ ؄ Ԃ  |xvsolieb_[YUROLIG}C~FuOhwIyM yA}EGJMPSVY\_bfjmptv| ΋&ǔErmmmnnnnooooooppppppqqqqqqqqwA# މ ڇ ք с ~ { xurnkhda^[XTQNKHF{CxAyO tK `zDx@|DFILORUX[^aehloruy ˀʏ5snnnnoooopppppppqqqqqqrrsvyiM+ ݈ ؅ ԃ Ѐ } z w tqmjgc`]ZVTPMJG}EzBv?zGsK 9xP t>w@zC~FHLNRTX[^aehkoru x } ˎ1poppppppqqqrrrsssrrrssu]\V>6& ދ ۉ ׆ Ӄ  } z w tpmjfc`\YVSPMJG|DyBu?s=vRqJ tGq=t@wB|EGKNQTWZ]adhjnpt w { ˍ.جfppqqqqrrsssstttttttuzL8+%ߌ ۉ ׆ ӄ ρ ~ { x u r olifb_\YVRPLI}FzCvAr>o<sH rF rNro=p=s?vBzE~GJMPTWZ]`dgjmp s v z ͋'Ѥ\qqrssssstuuuuvvvvvxwM/݌ى ֆ ҃ ΁ } { x u r olhfb^[YUROLI|FyCt@q>n;r@rK RuN j9n<p>tAxC|FILORVX\_bfilp r u x ʆΟVvssttuvvvvwwxxxxy}jA+ݍڊֈ҅ ς  } y w s q n jhda^ZWTQMJ~HzEvBr?o=l;i8uQmDnEi8l<o=sAvCzE~IKORUX[^beilo s w|ȄÍ5۰kwuvvvwxxxxyyzzzV;"ߏی؊Ԉх ͂  | y v s q mjgd`]YWTPMJ|GxDtBq?n<k:h8pH |VmH Vk=g8k;n=q@uCxE|HKNRTW[^adhlt&/3Ɛ9ȚQɕ?ݱixwxy~|zzz}}ey҂N3ݎٌ֊҇΄ʁ ~ { y u s p mifc`\YVSPM~JzGwDsAp?l<j;k> yO\>sQc5f8i:l<o?sBwD{HJNQTWZ]adgo.ƛU٭cۮcת_ѥ\ӕ0Ε:}{{ܬ\ޤGỲсЂb@AHU1ޏۍ׊ԈІ̃ȁ~ { x u r o l hfb_\YVSPM}IyFuCq@n>j;j<~V!]ipJ a4d7g9k<m>rAuDyG}JMPSVY\`dj~,—Rت\٫_ҧ^ٮe˝Oό ӏ Қ<بY߱eؤP)/CR?1  "ސێ،Ԋчͅɂ| y w t q n k gdb^\[ `e!f%` QxGsBo@l=i;h;~X%j}IǷ hAjB`4c6f8i;l>p@tCwF{ILPRVX\`e w"Lת`ժcGő;Č0Ȋ$̆Ј֏ݗ$(! ߑܐَ֋҉Ά˄ǂ| y v t p m j fda^bp+FPU[m2UxI qCk<g:f9xR"[{HƵjF Af<^3a6d8g;j=n@rCvFyH}LORUX\_i8Ӫfˢ]<#}Łʄχԋ؎ݑߑ܏َ֍Ҋψ̆ȄŁ~{x v r o l i fc`a q*ZŜY—QPSXxCwB|Sk>f:c7oH}NOʶ0iE o^4]3`5c8f:i=m?qBtEwH{KNQTX\`qR֬eB~wy }ŀʄχӋَޒߑܐڎ׍Ԍъ·ʄƂ€}zw u r o l i f ba kIƜYØQQQQSYch2nD e9a6jCsFSǻZqPX0\2^4b7d9h<l?oAsDwGzJMQUW[a {.ƞ[Τ`F|vy }āʄψԌڏݒݐڏ׍ՌъΈˆȄā|yv s p n k h d c i{7]řRØRRQQQQUM}X'j@ d;lEpCY`oL W/Z2\4`6b8f;i>m@qCtGxI|MPSX] k=ѩdҧ^ͥc/zy |ÁɄΈӋ׏ݓޑܐڏ׍ԋъΈˇȅă}{xu r p m i g e l}8\ƜUęS—RRRRRRQ[|Jc4i9b8|NbSjF V/Y2\3_6b8e;h>l@pCsFwI|MPT_r)?Ü\ԧZרXܰcH}z ~łʅϊԎّݔ ߒݑڐ؎Ռҋω͈ʆƅÂ}{xu r o l i g k:ğaȝVśTĚS˜SSSSRRRRXTh}N[_yEDZdA U.X1Z2]5`7c:g=j?nBrEvIzLPYs0]Ѩdӧ\էY٪Y۱i?|z ~ĂʆωӍّޕ !!!!!! ޒܐڏ؎ՌҊЉ͈ˆDŽă~|yvt q n k h f u&VȞWƜUśUÙU˜UTTTTSSSSTTVR\zGȲ fD b>S.V0Y2\5_7b9f<i?mBrFuI{LT l)TΤ^ФXԦYשZ۰eŜU)x{ ~ĂʆϋՏړߖ!6>=/ !!!""!!!!!! ޒڏ؍ՌӋЉΈˆȄŃ‚~{xvs p m j g f x.ǢfȞVƜVśVÚUUUUTTTTTTSSSS[{KɳfD "`;R.U/X1[4^6`9d<h>lApEuH|Oc"H̤b΢XѤYժ`ԭjM.vw z~ĂɇϊԎے?p؃چW% !!"""#""###""!! َՋҋЉΈˆȄƃÂ|zwtr o l i f e z0`ǞWŝWěWšVVVVVVUUUUTTTTZ}MξeD .]9Q-T/V1Z4\6_8c;g=kAoDuI[}Aɣe̡XϤYөaY:{$ss w {ĄˉӒٗܖIۍۋގV& !!"""###$$####"!! ޓԍЉ͇ʆȅƄÂ}{yvtq n l i f e x0^ǞXŝWĜWšWWWWVVVVUUUUUUZ}O eC 5\8P,S.V0Y3[5^7c;g=k@qF}Ut8ždʠZ͢ZХZϩig{ׄޥ@ !##$$$$$%%%&%$$#"!! ݑ؎Ԍˆǃā€~}{zxvtro l j g d iAȤdǞZŝZĜY›YYXXXXXXWWWWWVZP˸.dC ^V Y]b g k p u zǏ)oބeޝ)ܔ!!##$%&&''((((((''&&%%$#""!ޔِ֍ъ·ʄł~|zwuqnmlji g e b _ `u1ĤkƢbšbàbŸbaaa```````____iX͹mMF'I)L,O/R0X6yZ*`^ş`ȢaͦeĢhy9]Y]b f k p u zʕ3n߆bݛ'ݓ !"##%%&&'(()(((((''&&%$#"! ۑ׏ԌΈˆǃĀ}{xvtqmkjhg f c a _ ^ o*fƣeġcàcŸcbbbbbaaaaa````_qaA uH)H)K,O.R1W6xY*a_ƠaɣbͦcѪgaj#Z]b f k p u |ϝ>vVܘ"ޔ "#$%&&''(((()((''&&%$$#"!!ݔّ֎ыΈʅŁ|ywtrpmihgf d b ` ^ \ by:kĢdàdddccccbbbbbbbbbTɽ`aB EQ1G)J+N.Q0V5xX*bÞaơbʤcΧdҫfǥit1Z ]b f k p yŽ+۫T؅݉Rۖޔ !"#$%&''((((((((('&&%%#""! ܒ؏Ԍω̇ǃā}{xvsqolige d c a _ ] Z Y n-_ĢeáeeeddddddcccccbgxK1aB Y8G(J+M-P0V5vX)bßbǢcʥdϨfӫgΫoEu/v+u&u {",ŗAܯ]ى\ߛ(ߓ !"#$%&'''(((((('''&%$$##! ߕڐՍъ͇Ʉł~|yvtrnmjhed b a ` ] [ Y V aNĤk¡feeeeeeddddcccclm; cC F(I*L,O0T4tV'_ğcȣd˥fЩgԭiزoͩnɤcԮmΨdʣ\Ӭd޵jvۉ܀ׁD !##%%'''((((((((''&%%$#"!!ܓؐҌϊˇƃ€~|xvsqnljgdb a ` _ ] Z X U Wn0]âhgffffeeeeeeeedfsBlLE(I*K,N/S2pR$[ĠcȣȩfЪhծjٱk޵opqw}}}}ނc2 ""#$&&''((((((('&&%%$##"! ޕڑՎы͈Ʉł|yvtqoljhfd a ` ^ ] [ Y W }TzS`NämhggggggffffffeV~kaB ]K-H)K,N/R2lO"YšeɤfΨgҫi֮kڲm߶oqruwy|~ہ߃_. !"#%%'&'(((((''''&&%$#"!! ܓؐӌϊˆǃ}zwuromkigdb ` ^ ] \ [ X V |TxQ^Q£lhhhhhgggggfffjzOLaB X:G)J,M.Q1jL WŢfɤgΩhҫj֯k۳n߷ortvx{}݃V0! !#$$&&('(((('(''&%%$##"! ߔۑ֎ӹȄł~{yusqnljgec a _ \ [ Z Y W }U zSxQc$X¢kiiiihhhhhhhhgoq?ȹdE F(I,L-P1iLXŢfʥhͩjҭkְmܴopsuwz|قބmQ8 !"#$%&&'('(('''&%%$##"! ܒِӍΉ˅Ƃ}zwtromjhfda _ ^ \ [ Y X V |UyRwQ f'i¢jjjiiiiiiihhhhk|L̸gH|G*I,L-O0eGYǣh˦iΩjӭlװnܵprtvx{~Ԁڃ߅s8"#%%&&'''(''&'&%$$##"! ߔڐՍъ̇Ȅā~{xuromkigdb` _ \ Z X X W ~U {SxQuO_!Xmkkkkjjjjjiiii\ʾouaB &U7H+L-O0]>q@Ƨs˧jϫkҮmײoݶqsuxz|ցۄ^- "#$%%%&&%''&%%$$#"!! ޓُԋωʅƃ|yvsqnljgeba^ ] [ Y X V U }TzSwPtNxUxBmlkkkkkjjjjjjlU"eF G*K,N/X9 e9i˧kΪlӮnײpݵqsvy{}р׃܆b1  "##$$$%%$$$$#$$#"!ޔُՍЉ̆ǂ}yvtqnligeca^ ] [ Y W V T ~T {SxQuOrMsO j/vmlllllllkkkkr\н iJiL.J,P2eItEmʨkΫmӯoسqݶsuwy|ҁ؄݇b2 !"###$$#$##""! ے׎Ӌ͇ʄŁ~{xuspmkhfdb` ] \ Z X V V S }RzRxQtOqMpL|[N\qmmmlllllkkhêiȸ[= \> I+T7 uEtǥlʨlϫnӯoسrݷtvx{}Ӂ؅܈`/" ""#$####""!! ޓِӌΈʅƂ{yvsqnkhfdb` ^ \ Z X W U T ~R{QxPyT _`!yXsSvWl7ommmmmllmlpTgHI,S6 h8¥tǥkʨlϬnӯpشsݷtvx{~πӃ؆܈sP-! """"#""!! ! ߔڏՌщˆǃ|ywtqnligeb` ^ \ Z X W U S S |QzPzS f(PSMn6}^&y]'UpnmmnscWqkȴfG$X9N1lQ%_ǧnʨnϬoӯqشsݷtwz|~΀ԅ؇݊k;$!!!"!!!! ې֍Ҋ̅ȃĀ}ywtqoligeca ^ \ [ Y W U T R ~Q{OzQ a"FZPU]X{^(g2gqnr]g;mT,kS-uJj8­ `jKK.X;l<ħvʨnάpӯrشtܷvxz|΂ԅ؇܊|I*4GK?+!ݑَӊ·ȃĀ}{xuroljgeca` ] Z Y W V T S P}OyN~Ww>^PPPP\z]'hKb/btRoV,W;M1K0O5 y](uKmN-X9O2nR%aʪpϬpӰrشtݸwy{}΂ӄ؈܊ozR#ݑ؎Ӌ·ʄŁ~zxurpmkhfca_ ] [ Y X V T R QP{NyMa#SSQQQULoQ^?bE{^,ew\,V: L/I.F+Y<x]-kLM/[?o=ɫyάpҰs״uܷvy{~Ȁ͂҅؈܊F ݐ؎ԋχ˄Ɓ}{xvspnkhfda_ ] [ Y W V T S QP}NzMxN i.[RRRQ_k5eF \=Z;]@ iLZ>O3K/H,H,kMoP&\=S5w[,kͬqҰsֳuڷvy{~Ȁ΂҆։ۋߎb+-72#ݑ،Ӊφ˃ƀ}{xuspmkhfdb_] [ Y X V T R QO~N|LxKzO m3aSSSSZd0aBZ;X:V8S6P3M1J/G,\> _CoPQ4cFRίzѰtֳv۸w߻y{}Ȁ̓цֈڋގf/,NmNݔ#҈υʂǀ}zwuromkifca_ ] [ Y X U T R QO~M}LyKvJxO tغ~ĂDžˇ͉ыԎؐےߕۣPӚEֈuː:qk i h f e c b ` ^ ] [ Y X V U SRPO~N|L{KyJvHtGsErE~UcXNg[n:k6j______^gL7˺yZ0jJ z\ \߾俀ÂƄȆ̈ΊҌ֏ّۓߕ֎ŋ7p}$أTߓӝLqi g f d b a ` ^ ] \ Z X W U TRQON}L|KzJxHvHtFrEqDsG Z#v@WsSb-vPe/ka`````hPBν{[=oOm1ͮwᾁÃDžɇ̉ϋӍ֏ّܓߕۗΘHodf z%ox,g d c c a ` ` bdb]X V T SRPOM}L{KyJwIvGtFsFqDrFY }JgryDY$nE nD c,lbbbbahUGп}^ [vWy=Ӳ|忂ĄDžɈ̊ύҎ֐ؒ۔ޖьקay*b `akКGytjפU6ib b a ` _ dw,=HJq*ZTRQPO~L|K{JyIwHuGtFrEpCoCsIp:ĥwlp>yRlAkAsKd/mcccbiXIc'8z[}AظŅȇʉ͊όҎՐؓڔݖȅAg\^a 0~zΜUܫbɂѠU}/e^ ] \ \ a|5֪g|vy—UaQPNM}L|KzIxHwGuGsErDqCoBmAqH xDkk6tNh?j@zT{Jj6keedkWHv<*~`&㨅J޽„ņȇʉ̋ύҏԏגٔەߚÃCi_ \d1ϝQvڬacW`E~kigm^e&M}KzJyIxI{N^#n4o6zOpCmAl@j?j?i>i>kB sM_+}MvDmr@n>dhlT8WlKӰyˆćLjɉ̋͌ύяӐՑٖؓݞ͎vwݲpجjtє|ޛܖەڕٖÆ|7Xl'իkplkijɡd}A^~N yHxH|Oi-UǤm lc(pDl@k?j>h=i>qI^*wGgmr~MoBXod{¥εzDss:빓Z㿉Æƈȉʊ̌΍ώяҐԑ֒דؓٔۘۚڗڕٖڗؔ֓֓Ւԑ՘T^q-۴unlkj߲iݳpӮtPd(yL uGa$kͬv̧jɨtf,nDj?h>h>g=mFi6iojk[sB`u\Ƿm jĬ(i1ܭM޻ÇňljȊʋˌ͍ώЏѐҐґԑՑՒ֒ՑՑԑԑԑҐАϏєŝ_]p3ȡesnm߲lݰjۮjحi֮rSTrExLc)Jrm\%k@h=g=f<g>|Y&Zlkkio:PrU@ѿfjHض†ćƈljȊʋˌ͎̍ΏϏϏАѐѐѐѐЏϏΎΎ͍͏⾅w6\@޹~rp޳nݱm۰mخk׬jԬl^UpCoBqF yQ^&Y!oF h=f<f<g>vQuAqllkozcz̻ð8Iɨt†ćƈljȌʍʌʌˍ͔̍̍̎̎̎̍̍̍̏㿇ͧlC_p3ǡgvs޳rܲp۱pدo֮mխmͫtu=vKmAl@k?j?j@i?g=e<e<f>tOr@qmmmrfZA ͮ| ówY̪uˆӭuɤlǎNJNJȋȋȋȋȌʑȒݸΪsUy=h,a#r7[߹~ߵuݴtܳsڱqذpׯpԬnҮwI~UmAk?j>i=g<g<f;e;e;h?wR sBqnmriRêiоš{C趒[޼ÍWLǔÉŋƌǏǑݺЭvdLOaV{Cw:Mʥm޶wݵv۳uٲtرt֯rԮrүxS\%mCi>h=g=f<f<e;d:c:d;tO|LtpugRƷ|оǣҾs~G㿞kh,a%OšhžhifUQ\ßfOʦn㽂ݹѭvص߻޷{ݶy۴xڳwٲvױvկuԯuЯ{N\%oCi>h=g<f;e;d:c:c:b9d<d0ijW~LʼvμɩwǪ PVyYtNzP]#wa/zTpGh>e;d:c:b9a9a8`7a;fBmLxW[e1 tCŭƱ1ɻ}OKX_`ɨuطٷٶض״~׳|ղ{ղ{ԱzӰyѱ~b^]]]~IlC d9b8a8b:f@jG nNlI cnLcʹȬ >}zn9q;דr9}FS[^`hoppohe\ZWyEpLjG lJ nNkH ikH )ԼҸ`*WNµusBq>s?uBuBtAq>q>tCöõqh2H_'kjea__?????????(`      !!""######""!    "$')*, 4 9 : ; 92334343332100.-,*('$"   "&). >' XA2 }XC ~b rФxߴ軋꺋뺋뷈ysӁd ]G@0'h PB?>>==<;:87531.,)&"  $).4( ^[Ks"ʶ*Σ8ݱ<(œnZF%uIFEEEDCBA?><:741-($  !(.5[^I &ҫ;73-(   '/@?/kИMSONMMNNOUP/םsG5 [LKKKJJIHGFDB>:5.&  (:C3yߠ/VNNNNNNNNNOV@! O< YLLLLLKKJIHFD@91&'( &9*szߟ;SPPPPPPPPPPPUV@F4SLLLLLLLKJIFA9.! R:J3 $@}[ ̐:5.& f bvɄ͈ы֏ڒޖ%TWVVVVVVVVWWWWWWWWWVVVV\; ݕْՏы̇ȃyQ: ?73-(  f ov~Ƀ͆ъ֎ڒޕ0UZWWWXXXXYXYYYYYYYYXYYXXXVݕّՎъ̅Ȃ~xaE /$ je krx}ɀͅш֌ڏޓޫF]ZYYYYYYYZZZZZZZZZZZZZZYYY]*ݓُՌш̄Ȁ|xrdG  b ilsw{ɀ̓ш֋ڏޒܩH_ZZZZZZ[[[[[[[[[[[[[[[[[[[[`0ݒَՋч̃{wsn_C $.&] ginsw{̓ч֋ڏޓ ݬO`[[\\\]]]]]]]]]]]]]]]]]]]]]]b;ݒَՊц̂~{vrniwQ \:L/Z Dcinrvz~͂ц֊ڎߖۧG`]]]]^^^^^^^______________^^^_X, ݑٍՊц̂~zvqmhezR X[!^٫chkptx|̀фֈڌޚ"\^^^__```````````aaaaaaa```````b]* ݏًՇф|xsokgc^V 9YZ ^bfkosw{̀фֈܒՠDd``aaaaabbbbbbbbbbbbbbbbbbbbbbbbc[% ݎًՇу{wsnjeb][ΑYW uZ^bfjosw{у׎֝u@zDGKPTX\`eimqv z ˑ8ppppqqrrrstttttv^6.'ߌ و Յ ρ } y u qmhd`[WSOK~GyCu@p<tJ rCoDqFn<r?xC}FJNSW[_dhlpt x lj*oqrssstuuuvvvwwZ.܋ׇ ҃ ̀ | x t plhc_ZVRNJ|FwBr>n;pCsH nE6m?l;p>uBzEIMQVZ^cgkp t x ȇ!שautuvvwwwxyyzsI(ݍ؊ӆ ΂ ~ { v s o kfb^YUQMHzEuAp=l;l<vPUoH uh9j:n>sAxE}IMQUY]bfku%+ǐ8ǖFݰfwwx|zzz}n{o> ߏڍՉІ˂ ~ z v r o jfa]XUPL}HxDrAn=j;k>`'n?nI c6h9l=q@uC{HLPTX\aep<ӧ^ۮcܰf̕=Д2q|gCcymG8F8ێ׋҈̈́Ȁ | y u q m id`\XVS N{HuCp?k<i;d2[๥f=iAb5f8j<o?tCyG~KOSW\`i4ѥ]ԧ\ȚN̜Lˍ'ъח-ٞ=ܝ8'6,ݏ؍Ԋφʃŀ| x t p l gd`^ fs1yoAtEyI~MQV[b 7ԫg:xx } ǂ·Ԍېݐڎ֌Ҋ͇Ʉā}y v r n j fbgEŚV—QQQU]e1i?b7pJZlH X0\3`6d9i=m@rDwH|LQUZjLϦ_I{x }Ƃ͇Ռۑݐڎ֌ҊΈʅƃ|x t p m h e i}8XęR—RQQQRO[*tNzW+ZjjgC W0Z3^5b9g<k?qDuH{LPX j<ˢ]רYժa+y ~ǃΉՎے ݑڏ׍ӋωˇDžÂ~{w s p l h i<ÜZƛTÙSSSSRRUWY}NZO˺b?U/X1\4`8e;j>oCtGyKRj$Wѧ`ԦYةZѦ^&y DŽΉՎܓ" !!! ݑڏ׍ӋЉ̇ȅă}yv r n k g r!ZǝUśUÙTTTSSSSSTTTOͻ^;dB S.W0[4_7c:h>mBsGzL_Lͣ\ѤY֩^Ѩ`;yy DŽΉ֏ݕ*SdJ  !!"""""!! ݑ֌ӋЉ͇ȅŃ{xt q m i e t(ş`ǝVěVšVUUUUTTTSSUQͺ ]: b?R-U0Y3]6a:f=lBrFUDɡ^ΣXЧ_R/uu z džЎٕޗ?܍܉g# !""#####""! ֍Љ̇ɅƄ}zvso l h e t(\ƝWĜWšWVVVVUUUUUVS\9 a>Q,T/X2\5`9f<lByPt9ş`ˡZФZş\y)k o u {„Е-߭S[%"6:. !"###$$$$##"! ڐЉʅǃā}{xuq n k g e v-^ƞYĜYšXXWWWWWVVVWS[9`=O+R.V2Z4_8f=xQyA]ȟZͣ\Ҧ]̥b0l o v ͗7jyn) !##$$%%%&%%##! ߒَӋɄÁ}{ywtpm j e eBȡ_ƞZÜZYYYYXXXWWWXT̾#Z8 _=N+Q.U1Y4^8mH|G_ŝZğa[ҩdحcŝWvp |˙@yֆq< !"#$%%%&&&&%$#"! ܑ׎ъ̇€}{ywurol h e d|9ȣcŞ\Ý[[[ZZZZYYYYYUĭ!Y8 _=L*O-S0X3a<e2`›ZÞ`|?l(GϨcѫg~)r2x߮Sڝ0ܖ !"#$$%&&&'&&%%$"! ېՌωʅĂ{ywusqn j g c d};ơcŞ]Ý\\\[[[[ZZZZZUλX7`? K*N-R0V3gEU[Ü[Wd#U `o!t pq ǒ4˓+ΏӐۓ "#$%%&&'''''&%$#! ޓُԋΈȄÁ|wusqol i e b jXǡ_ş^^^]]]\\\\[\[VU4\<J)M,Q/U3jIZ[Ğ]X_SX_ d j q w ~ȍҖ(֓ܔ !"$$%&&''('''%%$#" ܒ׎Ҋ̆ƃ{vsqomk h d a o$_ơ`ğ`ž____^^^]]]]^Y_? H(K+P/T2hGZ]ş^]g(TX^d j p w ްW~ܝ-ݔ!"#$%&'''(('''&%$#!!ߔِԌψʄā}zvromki f c _ l"^ơaĠaža```_____^^`W©eD G(K*O.S1fEWœ^Ơ_˦gIaX^d j q x č&qz3ޔ!"#$%&'((((('&&%$#"!ݓ׏ҋ͇ȃ|xuqmkig e b ^ h]ƢcĠbŸbbaaaa```__cn®_@ ^G(I*N-R1dDW_ǡḁcЫm|9[ ^d j q xȔ1vwߟ.ߔ !"$%&''(((((''%%$#! ڑՎωʅŁ~zwspligf c ` ] _{<âhġdcccbbbbbaaac]> -O/I*M-Q1dCXßaȣcͦdӭkOaa f l u&ۮW݆qߝ) !#$%&'(((((('&%%#"! ޔ؏ҋ͈Ȅ|xuqokge c b _ \ Y g"_áe edddddcccbb\y^W8W8G)L,P0bBVĠbɣdΨfխjǣfHG?@ȜIhڅ܄= !#$%&'(((((''&%$#"! ےԍωʅā}zvsomjfc a ` ] Z W ZGhffeeeedddde~R3aB F)K,O0_@RŠcʤeϩgծj۳nuxy|сׁ܁l' "#$&&'((((''&&%$"! ޔؐҌ̈Ȅ|xtqnkhe a ` ^ \ Y V{T g(bggffffeeeei}R᳝x ^? {H*J+N/\= NƢe˦fѪiׯkݴnqsvy|؀߃b& "#%&''((('''&%$#"! ےՎϊʅā}yvrolhfc ` ] \ Z X }UyQd%ehhhhggggffgYz^@ :M/I+M.Z; MƢf̧iѫjװlݵorux{~ۂb<$"#$%&'(('''&%$$#! ߔؐҌ̇ƃ{wspmjgda ^ \ Z X V {SxQm0kiiiiihhhhg`fV8 X9H+M.X: ~Mǣh̨iѬkرn޷psvy}Հ܄]% #%%&'''''&&%$#"! ےՍΉɅÀ}yuqnkheb _ ] Z X W }UyRvPg*kkjjjjiiiiiYʼ)aC H+L-T4c4ťo̩kҭmسp߸rux{ׂކQ#!#$$%&%&&%$$#"! ߔُҊ̆Ƃ~yvrokhfb` ] [ Y V U |TxQtN|ZXmkkkkjjjjlrª _@ 7P2K-T6~b5i̩lҭnٳqsvy}р؄߈S% !##$$$$##""! ۑՌΈɃ{wtplifd` ] [ Y V U ~SzRvPrMtQJlmllllkkknɺqV8\> J-kMcǦm̩mҮoٴruwz}ҁم߉M% !"#####"!! ݒ֎ЉɄÁ|yuqnjgda _ [ Y W U S|QxQ{W}\vTwWk4ommllllm^cD bL.gJdǥl̪mүpٴsux|҃نt?#!""""!! ߓ؎Ҋ̆Ł}yvrnkhda ^ \ Z W U S ~QzP~Yx=VNq:z]'Xomnm\Vl`B[=T7 rDǧq̪oүqشt߹vy|ˀ҄هߌS)&//& ۏӊ͆ǂ~zvrokheb` \ Z X U S Q|O{R s8XPQZi5{^)\p]x^2]B]BsX(j-iKuO2kO!i̪oүrشtߺwz}ˀ҄؈ތjh\!ېՌΆȃ{wsolifb` ] Z X V T R~OzN[RRPPWy[%`B tX$_w\-R6J.G,iLiL]> V: zJ˫sѯrشu޹w{~ˁф؉ތSۏՋχɂ~{wspmifc_ ] Z X V T QO|MyMc'YRRSLjL[<Z<bEV: M0I-S7hL&lNgT6wZ*åqѯs״uݹx{~ˁЅ׉܌h&)G\G"ԉφɂ~zwsplifc` ] Z X V S QO~MzLwKj/]SSV{GeF Z;V8S6N2K/I-bD W; nP cE ^AMͮvִvܹy{~ɁυԈی9"Bt2΅ȁ~zwsplifb` ] [ X V T Q O}M{KwJuJ]!SZVV~KfI_B _CT8N2J/Z<\? tU8[<pT!lճv۸y{ɂ΅ԉٌߐpyeBԎ"ǀ}yvrolifc` ] [ X U S Q O~M{LyJvIsGrI `(QYVWi8wEQmT$eJR6fHVoPaCLӳzڷx{ȁ̅ш׌ݏb·|xtrnkheb _ ] Z W U S Q O}MzKxIvHtFqEsJ p9]XWY[[Z[}b5jMlQ |^% iJsU kضz߻|~Ɓʄχԋڏkǁyvspmjgd b _ \ Z W U S Q O}M{KxIvHtFrEpDY_ZYYYYYYX{`/҄i7b(&gH ߇j3ɫtݺ|~ĂȄ͇Ҋ׎ܑb{sqnlif c a _ \ Y W U R QO|MzKxIxJ V{QuJ vLa(d[[[[ZZ[VxF|] ShJn5ˬu€ƃˆϊӍِޔт͑7rnl j g d b _ ] [ X V T QP~N|LyJwHuF~TU{GvAKl6e]]\\\]_²|] mjJ w=ۻĂȅ̈ыՎڑߕk_ߑءLsk i g e c ` ^ \ Z W U SQO~M{LyJvHtFsE]#hNcPk7g_^^^^bxмi-tUstU`ὁƄʇ͉Ҍ׏ڒߕɑ>o†1̀kvg f d b ` ^ \ Z X V TRPN}LzJxIvGsFqEtH e.QjuByS_(ia```d{Ҽo3xXi,˪r係ÃDžʈ΋ҎאےߕؒѡVmbhԞM؏ʀ7f c b ` bn w-s)^U SQPN}LzJxIvGtFqDpE]%hgk7rIlB]&jbbbe}Ҿx<}^"|q6ұxÄdžˉ΋Ҏ֑ڔݖٕҢ[k]_},ؒyդ[x˙No` ^ ] _~6٭hlݲmu0S PN~M|JyIwGuFsEqCoBnCm8ec/mD kB e1g3jddg}ԿíHr7jx=۷ąLJʉΌҎՐؓەؗɚTp#bc~0ѡYԦ];ܱjٖΟXq$\ Z p'ܰklgoAR M|KzJyJ|N|PtFpCnAl@k@pGuMnGtN[(XsEafg~ԿĮW~E\UֲzÅLJʉ͌ЎҏՑؔ֕w˝WIGÓM̝W֫hɇޘݗؖٯli \Ltjh߳nHX|KyIyK _#GT~TnAl@j>i>kAxRm;`b|MuFlgñ~.x@Ⱦ`ÆƇɊ̋΍ЎҐՑדژۚ֕חܚٗؕה֓ՒӕAaϦfnlj߲kШjN[wHXc̨oɧp^$l@i>h=i@\'^kj[zJkgȱ[Ǯɬ}yAR߻†ňljɋˌ͍ώАѐӑԑՑՑԑӑӑяϏϒHb ĝaqm߲lܰk٭i֭nIwJ uI `&T_zRh>f<f<sMTkkk|Kfs'ʸĤpK]״}Æňljɋʌ͎̍̎ΎΏΏΎΎ͎̏ƋϨmg&x9۳vq޳pܱoٯm֭lӭp{CsG mAnBrIsJj@f<e<pIuCmlmngoģȷiܹ‰‡ѫqnjȊɋɋɋɌʐÊٴ|a{>g)r6ɣhwݴt۲rٰp֮oӭp\~Ul@j>i=g<f<e;e<pJtEnmqa)ֽ̱!zRճ}ʧqEῊ‹ὅٵ˧pVNƠf\JYӮu޷yܴvڳuرt֯sӮta]%kAh=g<f<e;d:c:mF~Otmb̷4оպ̴ys9}Tl1~DV[eͩpӰxɥm޹~ܷ}޸}ܶzڴyٳxձxϬuΫvY\$lAg<f<e;d:c:b9a8jD o=Vᵡ}DZ3ͺfX {A?]!u;ģqܻ޻޹޹޸~ݸ}ܷ|۶|ڵ{ٴz׳yֱyf~NtA`,sKh?e;d:c9a9a8a9eAnL`*OXsȵñUydͩUYânͪuѯ{Բִճ~Բ}ӱ|ͬ{hgf`vNc:d;e?hD jG kH SnKĪū ʵWIq\NXܛ{F埀K줅RSQ}IyD碇XޗzH{["sPpnKLhC f@ŧxζh `^[XVTwT?????????????????(P g    !!""""!!   #%)06 =HJK E>;755443310/-+)'$!  !&* 8% WI:u^s̺ Ι۟ޡӛy}_P=+!p QBA@@?=<:8630,($   '- =9.tg!2֫?IQI-˗lH6 \HHGFFDCA?<950+$ )1 ]kP ܬ2SSPNMNSN1 ˕a1%OKKJJIHFEB?;5.$ ,%ccךONNNNNNNOTEx;-PLLLKKJIHEB<3' 0" F]ՙTPPPPPPPPPRVAߟs-!NMMMLLKJHD<0 fG_B XAߛUQQQQQQQQQQQTR̐rScMMMLLKIF>2!~X2lҐۖVRRRRSSSSSSSSV?";8! ܖ֒y7(NLKJHFA8,se V{ы֐ۓWTTTTTTTTTTTTUWXXXZ3۔אы`ENGDA<5,  qg ~̇ы֏۔ :YVVVVVVVVVVVVVVVVVVR۔אы̇Á|W O93-% mh zƀ̅ъ֎ۓA[WWXXXXYYYYYYYYYYYXX\.ۓ׎ъ̅ǁ{_@" hf ty~̃ш֌ې"U\YYYYYZZZZZZZZZZZZZZZ\Aې׌ш̃~zt^,  cb mtx}̂ч֋ې&W\[[[[\\\\\\\\\\\\\\\\\^I ې׌ч̂~ytnZP4@(,\ gmrx|́ц֋ۏݛ[]]]]]^^^^^^^_______^^^^^Y$ ۏ׋ц́}xsnh[ oE[ Jagkpvzф։܏ ۤ?a^^_____`````````````````aZ# ۍ׉х{vqkgbX XY[`ejoty~у׉ژ&\``aaaabbbbbbbbbbbbbbbbbbbbbXۍ׈фzupke`]X UVW Z_dioty~у֒ ެXcbccccccdddddddeeeeedddddddcg0 ی׈у~ytojd`ZXVT ]UY^bhmrw|шڧVedddeeeefffffffgggggggijjjii]R$ ۊ׆с|wrmhc^YTT QRSW]aflqv|Ҙ?geffffggghhhhhhhhhhhhhkK87761 ۉׅр{vqlgb]XSQR FQ MRV\aekpu} ӜGhghhhiiiiijjjjjkkkklbVH ۉׄzupkfa\WRMP̈́N|NLLPUZ_diot~ؤWjiiijjjkkkkklllllllq< ۇ ׃~ytoje_ZUPLI~N Y|M GJOTY^cins~ئZkkkllllmmmmnnnnnnnol0 ۆ ւ }xsnic^YTOKF|L|IxIzI~EINSX]bhmrx ˋ,߯dlmmmnnnnoooppppppn: ߊ م ҁ |wrmhb]XSNJEzDxK FvJ `xA|CHLQV[`fkqv~ӞMonooopppqqqqqrureE ܉ ք  { vqkfa\WRMH|Dw?vJ rDtI s>yCGLQV[`ejptz ͖Arpppqrrssssstf:2%ތ ؇ ҃ ~ z u pkf`[VQLGyCt?sCrFpFoAp=vB|FKOUZ_dins x Ȍ0urssttuvvwwxa.ۊՆ ρ } x s ojd_ZUPK}FvBq=m;sJ boG dj:n<sAyEINSX]chm t {ȉ'ثcuuvwxxy{zwN&܍׉х ˀ | w r mhc^XTOJzEsAn<i9rKX#mF f8k;p?vD}INSW\bgt>˛MСU̖>fyqez}pUiE ߏٌӈ̈́ { v q m gb]XSN}IwDq@k<nA g1쪐ljAd6i:n>tCzHLQV[alA֩]УWҤX̌#ԕ.ީSߨO)?G-"ߑڎՊφɂ~ y u p k fa]`g"i)TuDn?i;rHV@gBd:a5f9k=qBwF}KPUZb}/ϥ_ÔG#ăʄщڐۏ֍щ˅Ɓ}x t o j e`hNWWIi1sHf:j@ ~QuhC M\2_4d8i=oAuE{JOUZeMƛT}x ~Ƀщُ܏׍Ӌ·ȃ€{w r m h deBŚUQQS[c/g<e< wL{iD sX0\4a7f;l@rDxIOT\ t&ɠZΣ]-y ~Ʉъِܐ؍ӋΈɅĂ~zu q l g h9šWÙRRRQQRd4`2Q_Ƿzc?V/Z3_7d:j?pCvI~NY |8™Vԧ[ڬ^’AzɅыّ ߒܐ؎ԋЉˆƄ}xt o k g |2ŞZśTÙTSSSRSVXUQǴeB T.X2]6b9h>nCuHQ r0Ǡ\ѤX֪]Σ[$y ɆҌڒ?J) !!!!"! ߒ؍ԋЉ̆DŽ‚{wr n i hJȞWśVšUUTTTTSSSSɶ dA R.W1[5`9f=lBtIe%Y΢Yϥ^M|$uy ʈԑܕ8ڊڇ= !""####"! ׎Љ̇ȄĂ}yuq l h gHǞYĜWšWVVVUUUTTTɷb?Q,U0Y4_7e<nC] Tʡ[Ф[Wrm s {Ň֟>e623# !"##$%$$##! ېЈɄł}{wso k f hMǟZĜYXXWWWWVVVUɺa>O,S/X3]7f>a)Wǟ\ˢ_ҧ^Φb|*n t اP{t4 !"#$%%%&&%#"! ُҊǃ}zxurn j e j[ƞZĜZZZYYXXXXXVɹ`? M+Q.V2\7uQZÜZ^D[ڱiǟYr{ڮ_цmߤ9!"#$%&&&&&%$#! ݒ׎ЉɅ~{xvspl h d hRƟ]Ý\[[[ZZZZYYV©`@ K*O.U1^;xF\Ğ^CYh5/q~ңNҞ=Ҕ"ג "#$%&&'''&&$#" ېՌ·ǃyvtqnj f b p&_ş^Ý]]]\\\[[[[W\<J*N-S1`> S[Ơ`x;S X_ g m u ~ȍӔ"ْ!"$%&&'''''%%#" ߔُҋˆł~xsqomi e a z5ǣdŠ`ž___^^^]]]]Zѿ ]=H(M,R0^< S]ǡaIWW_f m u bhۖ "#$%&''((''&%#"!ܒ֍ЉɄ€{wrnljg c _ x3ƤfĠaŸaa``_____^[ͼaA cG(K,Q/\: P_ȡaƢdv4Y _f m v ‹%tgܖ "$%&''(((''&%#"!ِӋ̇Ƃ~zvqljh e a ^ o)eġcŸbbbaaa```cu~[<:J+J+P/Z: QÞ`ɣbϨeZ_^ e m x̙:ր]ܔ!#$&&'(((('&%$#! ݓ֎ЊʅÀ|wspkge c ` \ _LĢfŸddccccbbbeyY: R3I*N.Y9PĠbʤdѪfɥg|7z.|),ʜFyiߘ!#$&'((((('&%$#! ڑҌ̇Ƃ}yuqmjec a ^ Z W p0h eeeedddcc]~[\= H*M.W7}Lšd˦fҫiٲmݷswu|ԁ܁A!#%&'((((''&%#"!ޔ׏ϊɅ€|wsokhd a _ \ Y ~U[ThgfffeeeeUw$]> G)L-U5xGƢeͧgԭj۲mptw{߃:!#%&'(((''&%$#! ڑӌ̇ł~ytplieb ^ \ Z W {S|WTihhggggghX׶{]? DJ,K-S4wFǣgͨiԮlܴoruy}ف[.!#$&'''''&%$#"!ޔ׏ϊȄ{vrnjfc` ] Z X ~VyR~Z`jiiiiihhj|V7 V7J,Q2k;ȥlΪkկmݶqtx{ۄ{*"$%&&''&%$$"! ۑӋˆł|xsokhda ^ Z X V |TwQxSPlkkjjjjieƷM^? I+O1vY+jΪlհoݶruy}ԁ܆m- "#$$$$$##"!ޓ֍ψȃ~yuplhea^ [ X V TzRuOrMr:plllkkkkjĭ\> 7N0Y<WǦmΫmձp޷tw{Ճ݈t* !"####"! ِъɄ€{vrmifb_ [ Y V T |RxQ{XxVwVn7ommlllm±X:[= W:ZȦlΫnձrݷtx|΀օ݉L%!!""!! ېԋ̆Ł|wsnjfc_ \ Y V T RzP]MQ}F~`*YnnlV}T_Ⱥ/fGTP3|`1ŦqΫoձsݸvy}́ֆ݊i1jNz_/R6I.O2qV%)kMQT7l<̭uԱt۷wz~͂ԇۋ8%:8 ֊φȁ}xtplhda ] Z W T RO}MxKd([SSRjLZ;V8R5M0H-_A jMdF fIcӱuڷx{~ً̂҆Y"@}<΅ǀ|xtplhda ] Z W T R O}MzKvI] UXTUjM^A [? P4K0U8[> tU&\>h4аxٶx{ʃЇ׋ސJԎ#{wsokhda ] Z W T R O}MzKwItGrHe-XVZp?~LuFpV'V: eHcrSohJc׵y߻{ɂΆՊۏ֒*}zurnjfc ` \ Z W T Q O|MyJwHtGqEuMJ[XX\YY}PnQqW&|^%nOc-˭uݺ{Ƃ̆҉؎ߒ̋)vsplie b _ \ Y V T QO|MyJwIwJ sGqEZ bZZZZZ\{LzKc(kMَo6бx~ĂɅΉԍۑߒ{|pmjg d a ^ [ X V S P~N{LyJvG~SId,n8h1c\\\\\^ƷQe).kKw=ݼƄˇЋ֏ܓW܏܎Ɖ0mj g e b _ ] Z W U RP~M{KxIuGsEd*dV[n:e^^^^`òȷ`"5rS꺚a⾁ÃȆ͉Ҍؐܓ{uxsЛIjf d a ` ^ [ X U SQN}LzJwHtFrEtI m7_U}W![$gaa`cIJϿe(Oe(˪qńɇ͋Ҏבܔ͈7b bō:Ї|٭bqb a _ j:Fn&U RPN|KyJwHtFqDoCa*p{IuMoE \&ibbdƵp48p5Ӱxņʈ͋Ҏ֑ڔݘ٬gl^jدeאs̚P֑ܱju&_ [d˝XqmØVU N~L{JyIwHtEqCnBlA~Wl8qJlD i7tCfeeǶ L0}D״{ņɉ͋ЎԐגוݳpEz-5CēLڰmޙ~z1Y :tiiYV|KyI|M e)w>xMmAk?i>j@rKe2OZqBghɹy¤ vLcćȉˋ΍яԑדוؖЏԔژՓؔדՒٰqaǝ\nkjӪiLVwHs9ţmɦoZk?i>h>{U XjiyIdlʳIϾƧuOkW⽃ÆƉɊˌ͍ϏАҐӑԑԑӐҐЏΏذtb]qmݱlڮj֭m}CsF{Qt>VvMg=f<oGQkk^_ϼűƯ+rֳ}ćƉNJɌˌ̍̍̎̍̎̏Èѫpu7t5۳uߵrݲpڰo֭mϩni1nBl@lAlBg=e<mFuDnmmmŭ_ȱßμ[r̨q˦oӮvʼnNjnjÊ߹̧oÝcLo3~Cѫq޶vܳtٱr֯qѬr~GrG i>h=f<e;d:nFyIonjŴɱdzß {So×q7q6^eadơi]۷}ֲxӯv۶{ܶyڳwزxձyΫu}GtJh=f<e;d:b9b9|X$]c±īƱjL*f+e)߽hڸ޺߹ݸ޸}ܷ|۶{ڵzسzֱyeMomT|ZpėpėpŇcsW]H9* `H>=<;:97520,)%   &, @F9~h 1ժ@B(͘qWBeGFFECB@>;84/)"  )70$oaț$LSRNNSM1 vJ8 [KJJIHGEC?;5-#  3?/zFONNNNNNSFčfL ^LLLKKJIFC=4' 2# 0#ewMPPPPPPPPQUBčW@ULMLLLKIF>1fF$"|ZϑNQQQQQQRRRRSO ڗq-!}MMLLKJG?2 ^ U}בܕNSSSSSSSSSSSX=>N?ݖؒLj^DUKJHE@7* rh ыאܕQUUUUUUUUUUUUYXUWPݕؑҌɆ] YB>92(nj ~˅ъ׏ܔDZWWWWWXXXXXXXXXWW\,ݔؐҋ̆ŀhZ.'jix~˃ш׍ܒ(S[YYYYYYZZZZZZZZZYYYH ݒ؎҉̄yg H ddqw|ˁч׌ܐ*ZZZZ[[[[[[\\\\\\\[[[[P ݑ،҈̂}xrc:'45!$ _^ jpv{ˁц׋ܐݟ+^]\\]]]^^^^^^^^^^^^^^^Z!ݑ،҇́|wqk`jE[ dcintyф׉ݒ ߬O^^_____```````````````aX ݏ؊҅zuoid[VX3\agmrx}у׊ٛ2a``aaabbbbbbbbbbbbbbbbbbbVݎ؉҄~ysnhb]Y UWͣ[`flqw}уՕ+`bccccdddddeeeeeeeeeeeddddf& ݍ؈҃}xrmga\XU ?T zTY_djpu{Ћ addeeeffffffgggggggghccbbaO= ݋؆ҁ|vqke_ZUTӋRP"QSX^ciot{ԚBffgggghhhiiiiiiiijkk^+!!  ݊؅Ҁ{upjd_YSOR qP LQV\bgms{ ӚEihhiijjjjjkkkkkkloI. ݉ ؄ytnhc]WRMMM|L$JKPU[`flr|ڦZjjjkkklllmmmmmmmnq3 ݈ ׃}xrmga\VQKG|MxzL~EIOTZ_ekqx ͑8jllmmmmnnnoooooopM ܇ Ԃ }wrlf`ZUOJEzIyHvGwF{CHMRX]ciou֢RnnoooppppqqqssoV! ߊ ؅ р { vpjd^YSNI|Dw@vJXtI Zs?xBGLRW]bhntz ћGpppqrrsssssuP;, ۉ Ԅ  z uoic]XSMHyCs>sGqFo<uA|FKPV[agmr w ˑ7trsttuvvwwsI݌׈ Ѓ } x s nhb\WQL}FvAp=n@tJlB l@l;r@xDJOUZ`flu~nj.٬cvvxxxy{|l8ߏًӇ̂ | w r mga[UPJzEs@m<j:zU]lE De8i:o>uC|INTY_erÔFѤWԧ\ϕ5h|ZdyeAR/ۍՉυȀ { v q ke`ZVR~KvDp?j;}T!n~TjC~a5f9l=sByGMRX^iCӧ]ȘHʔ<͈Ւ#ۜ5$ -!ݏ׌шʄy u o i d_e{9Ek/zLn@g:|U#_ᮗtf@^4d8i<oAvF}KQW]v%̣^4{˄Ӌܐݐ؍Ҋ̆Ƃ}x s n h ceJØSPTRzQe9nGTa;d?\3a7g;m@tEzJPV_ ?̣],x ~ʅӋܑݐٍӋΈȄ€{v q l g f~9ÚV—RQQRvCsLuQ#UwB_: _:Y2_6d:j?qDxJP^:ɟYةZȚMzʆӍܓ ݑُԌωʆăzu p k g 9ŜXĚS˜SSSRUUSYeb>Y5W0\5b9h>oCvIU @Σ\ԧY֫`4yʇԎݕ'<, !!!!! َՌЉˆƃ}xs n i jUǝVĚUUTTTSSSWb?'W2U0Z4_8f=mCwKr4Ƞ\Х[ǞY3vy ̉֒fۇW !"####"! ؎ЉˇDށ{vq l h jUƝWÛWVVVUUUTXa>/U0S.X3^7e<oEg+[̢ZϦ`2l r zƉܨJc$(2' !"#$%$$##! ېψȄÁ~|ytp k f lXƝYÛYXXWWWVVY`>0S/Q.V2\6f?m6\Ƞ]ʣ`ժaKps#_~^ !#$$%&&&%#" ُҊƃ~|yvrn j d o"ğ`Ş[œZZZYYYXXZ_=*Q/O-T0[6{X$]ĝ\Mw5Ǡ]Ҫez!z޴iyNݚ" !"$%%&&&&%$"!ޒ֍ψȄ|yvtpl h c n#[Ş]œ\\[[[ZZZ[^=Q0M,S0\9|J[Šbg&V epnw‹)ʐ$Џړ "#%%&''''%$#! ۑԌ̇ł}wtqoj f b ~;Ǣbğ^^^]]\\\\]οU5S3L+Q/[9O\Ƣdg&T[c k t ~֡?ߦ?۔!#$%&''(''&%#! ߔ؏ъʅ€{vqnlh d a Eơağ```__^^^^`tU5X8J*P/Y7}L^ȢbM\[c k t vZݔ "$%&'((('&%$#! ܒՍΈǂ~yuolig c _ >ƣdĠbbaa```__aNW8I*N.X6{KÞ`ʣbЫjw2[c k u Ƒ.~Pݔ "$&''(((''%$#! ِҋˆĀ|wrnigd ` ] h _áddccbbbbaY*]= H)M-V6{KĠb˥dӬiPq&s z!4kUߔ!#$&'(((('&%$"!ݔՍΈǃ~ytplgd b ^ Z YKáfeedddcccY긢]> VH*L-T4wFšḑfԭiزo޷qru}ۂ-!#%&'(((''&%#" ڑьʆÀ|wrnjfa _ ] Y }U e$egfffeeeg_pX:O1J,R3rBǢeΨh֮k޵nrvz~ރt*!#%&'((''&%$"! ޔ֎͈ƃ~xtokgc _ \ Z W {S`ghhhggggfmyX:I+Q1q@ǣgΩjְm߷ptx|؁W" #$&''''&%$#" ڑыɅ€{vqlhda ] Z X ~UxQe&ljjiiihh`4\= wI+O0}^/ǥmϫlױorv{ڄT !#$%&&&%$#"!ߓ֍͇Ƃ|wrmiea^ [ X U {SvP{Xakkkjjjjlɹ Z<"P2O1|_1âkϫmײqtx|ҁ܆W!!##$$#""! ِЊɄ~ytojfc^ [ X U ~SyRtOrO ~Hhlllkkm±V8Z<U8 `ȦlϬnسruy~ӂ܇Y-!"""""! ܑӋʅÀzuplgc_ \ Y U S {Q{Ur5l2{\"zGnmmlhfĮ+cDCQ3m>ȧoϬp׳sv{ӄ܉B$+*" ߒՌ͆ŀ{vqlhd` \ Y V S ~P{Q u9TSUz]'[p{PkQ&kR(yNnbD^@ aDgϬp׳tx|ʀӅۊr5ߒ׍·Ɓ|wrmiea] Y W T Q|NXSQQMfHkNwI]BJ/N2w\,/jLDU7xGέsֳtߺx|ʁ҅ڋ&-0׋φǁ|wrniea] Z V S Q~NyL`#YSTs>^?X:U8N2I-]@ hJeFmPkճuݺy}ɁЅ؊8+]E΅ǀ{wrmiea ] Z V S QN{KvI\VWVs?_A]A R6L0S6[> sT]?vCԳxܹy}ȁΆ֊ޏPԎ#zvqmiea ] Z V S Q ~N{LxItGrHi2YVTsBSx^/\AdGisTemO£lڷz}Ɓ̅ӊۏݝ9|xtplhd` \ Y V S P~NzKxIuGrEwNRYXYZYWrV"uZ*}^&pQj3аw}ÁɄЉ׍ޒѓ4uqnjf b _ \ Y V S P}NzKwI|PxMtI Z!b[ZZZ[Y蠉^d*nOΐq8յzDŽ̈Ҍڐ}zznk h d a ^ [ X U RO}LyJvHwJ NyEPr=c]]]]^̾Sg+mMӨPᾀÂɆΊՎڒӞKҝHٌސ)i f d a ^ \ Y V SPN|LyIuGrExNP`|Hc.f___`ɹsƴh+&|\ƥlńʈϋՏے߷mne ϙGܐРPgc a cn n#[URP~M{KxIuGrErFu@en:pG}Whbbd˻zʷr5$i-ϭtƆˉόՐٓܗsm]qͅvڭew|-` ]`Jlmq,PN}LzIwHtFqDoBpF Mc.kC {Up>hdd̼{̹My?׳{„ƆʊύӐגږ޴q:r%}3HIǃȅ;Z w/rhmw7M{JyJYj0vJ nAk?j?mD xRo=RtEeh̼lͺh XdŇɉ͌ЎӐ֓ՓюʉЍԓהؔ֓Ãg Tmklĝ_j+xJ_"eȥnWk?h>kBn;bl~N`oǰBλYW]⽃ćljɋ̌ΎЏѐӑԑӐҐяϏh%YqmܰkحjƠe|QuJ i2PsJg<g=['ike\ʵɰ~ֳ}ćƊÈʌˌˍˍˍˏ‡Ϩm{>t6ڲtߴrܲpدnԭnQsG k?k?j@f<f={V#bmmpŭUֽоAsȥo԰zZʉ俆ٵ}Ȣj[œa}DPְvݵwڳuװsԮs]zQi>g<f;d:c:~Z'hlmȷsūѶĭ8~FXo3WŸhͨpֲyӯvߺ}ܷ}ݷ|۵yٳxΫrġjTzRh=f<d;c:a9a9yV!XbͼĮR UZiǥoΪsٵڶٵ}ش{ֲzԱyhPwDe/g=c9b9e>gBmJx|[$"l̷8UptRa᪋W쮏\^\V祉^|JrOmI }iD IfAf@ȯf a\YXgzJ??????????(@ B     #&-E[,"j1'n1&o fW @77654320-+'$ $+DF8~|c/͞% Œn[E lFDCB@?<961,&  *;?0uլCMSQSK. eLgJJIHGEC?;5," " @bIǐ8PNNNNNRIj)xLLLKJIGD>5' 3$ O:ƎEPPPPPQQQUCܜbfMMLLLJG@2 oMC0>rܘFQRRRRRRRRRK ޚŊS<QLLLJG@2 e yąבݕGSSSTTTTTTTXIUT> ޗْьa `IGD>5' pl DŽыאݕRVVVVVVVVVVVVVVZ(ޗّҌ̆p'o;5," k l}ʃщ׏ݔ%RYXXXXYYYYYYYYYXXJޕِҊ̄~s.!e f hu{ʁч׌ݑ1]ZZZZZ[[[[[[[[[[[ZVޓٍ҈̂|vl4%Q`amtzʀц׌ݒޤ6^\\\]]]]^^^^^^^^^]]]ޒٍ҇́{uofhE3\ ekqx~ф׊ޖ[^^____``````````````Vސً҅yslg^UX J]cipv|у؋ ڢBbaaabbbbcccccccccccbbbTޏي҄~xrke^ZXUW\bhou{ф ֛;dccdddddeeeeefffeeeeeegg ގى҃}vpjc]XU iS TZ`fmszЎ)eeeefffgggggghhhhhcTSRR8  ތهҁ{uohb[URRP/ORY_elryӗ>gghhhiiiijjjjkkkbX5 ތ نҀztmgaZTNP~NKQW]cjpxנOjjjjjkklllllmmmp6 ފ ل~xrle^XRLJ~M$zK(GJOU\biowЗBmkllmmmnnnooooo`" މ ׃ }wqkd]WQKEzLxIzBHNTZ`gntɀ٦Xnnnooppppqqrtg) ۇ ӂ | voib\UOI|DxEvGrEtDwA~GMSY_flsz ԟMoppqrrsssskG6#ދ ׆ ΀ z tnhaZTNHyBr=tI fqG Mn<s@{EKQX^dkq w ͕>ssttuvwwxf0ڊ҄ ~ x r mf_YSL}GuAn<pEmCj:p?wDJPV\cjv Ə6ܮbvwzyzu|U$܍Չ̓ } w r ke^XRKyEr@k;oC f4jAf8m=tC|IOU[bpƘLثaӦ\ё*cc>eU/8 ސ׋Їȁ{ v p jc]Z \R vDn?i;sCvTg@c9c7j<qAxGMSZc C̠W.Ņ͆אߐَҊ˅Āz t n hbeIQNc*qD e9h9{gB B\2a6g;n@uF}LRYkʡ\0x ̆֍ߑڎԌΈǃ~x r m f d ?ęSQQXa-e;~[-ye@fX0^5d9k?rEzKRa<Ԩ]țOż֎ߑڏԋωɆ|v q k g ;ěWØSRRRTzJzLV۽b>U/[4a8h>pDxJZPҦ\ت\ŘJz̈א)( !!! ڏՌЉʆăzu o i nĜZśU™UTTSSTSRİb?S.Y2^7e=mCzO Dͣ[Τ]Exx ͋ٓ/ԃp  !"###"! ؎ЉˆŃ}xr m g oÝ[ŜWVVVUUTTTű `=Q-W1\6d<qH u:Ǡ\Ϥ[Qlq zȌ"XS.* "#$$$%#"!ېψǃ€}zuq k f s'ş]ĝYXXXWWVVUų^<O,T0Z5gA {DÝ]ĝ]ͥ`Ҩbz%r Œ+pz> "#$%&&&%#" ُъĂ}zwso j d w/ǡ_ĝ[[ZZYYYXVǶ^=L+R/Y5a.]\o/v1ÚS4uح_]؛-ݕ !#$%&&'&%$"!ߓ׍Έł{wtql g c {5ơ`Ý]\\\[[ZZWë[;J*P.X5{I[Y[Xb j r ɎԒޕ!#$%&''''%$"!ۑӋˆÀztqnj e bOơ`Þ__^^^]]\Zɳ \;gH)O-V4yHœ]ßae#W_i r mFߕ"$%&'((''&$#!؏Љȃ~ysnkh d ` Ošaßaa``___^]ɷ\=DH(M-U3vEÞ_ˤcZ^_ h r $}@ "$%'(((('%$"!ܓԍ̇ā{vqkhf a ] z8Ģf ccbbaaaazZ;N.L,S2vFŠb̦dΪir,kp#ܰY߈= #$&'(((''%$" ِЊȄ~xsoje b _ Z `_ eeddcccfmV8J+Q1rAơdΨgׯkկl޵novۃp #%&'((('&%#!ޔԍ̇Á|vqlhc ` ] X }U y>¡ifffeeeanSY;I*O0l<ǣfЪiذlpty}ރ`  #%''(('&%$"!ِЊDŽ~xsmie` \ Z W yRu:jhhhgggZ~\=RH*N/j:ȤhЫkٲnrv{ׁA"%&'''&&$#!ޓՍˆÀzuokfb ^ Z X }UwQ{BkjjiiihnȼW8 R4M.rS$ŤlЬlڴpty~ك7 #$%%%%$#!ُЉǂ|vqlgc_ [ W U zStOa$okkkkjmy[=M0uFƥlѭnڵrv{Ѐچ8 !####"!ݒӋɄ~xsmhd` [ X U }RyR zWvTu?nmlllfì!^@ /P3{Lȧmѭpڵtx}тڇc(!"!! ֌̆ytnie` \ Y U R{Pf'SMi3WnjyOyPu~^@ gKmѮqڶuy~уډR|Y ؎·Ł{uojea] Y V S ~O~UPPQp:jLYu[-N2N3f7-jK4V8SЮrٵuzЄىb!'،χƁ{upkfa] Y V R O{M]XRWsVZ;\> Q5I-[> eGtW&ȩqصvz΄׉%=߇M΅zuokfa ] Y V R O|LwJ[WVZpS^@ V9M1Q5[> rT^@ 뤇Sִw{̄ԊݏWԎ#~ytojfa ] Y U R O|LyJuHrGm7YY{IRi:eKdGpuVWsVˬtݺ{ʄшڎQ{wrnie a \ Y U R O|LxIuGrExOYYYYX]z_,z`0rSo8մyǃ͈Սݒ֞Csokg c _ [ X U RO{LwI|Pa(}T_&a[[[[b걝w!f+qRv=߽ÂʆЋؐߕԆ~suk h d a ] Z W TP~MzKvHtFn8W^uAd^^^^Og* sTȼbƄ̈ҍّߕ͚Inݮ_}&f c a a^ X U RO}LyJvGrEuJ yE`a,}Wfaaa`İq5c'̪pƒdž̊ҎؒݖȄt"_y%}pƒDd _ _ 7Ԧ^ÖPXPN|KxIuFrDoB^&azToF e1hcc¨bDzI u;ֲz„LJ̋ю֒ڕxy-k7̞WFߚҎA\ n#oh׬gZ}LzJ}P\ tGnAk?mCrK~Z%q@yJdd¨[ȴ[ažeƈˊ΍ҏ֒֔ɅŃˈЏږؔёr+MmjٮjIR}PYǥm}Tj?h=uNRjW\rʳ5ʵbEa必ćȊˋ͍ϏѐґӑҐѐϏˍs1Up߲mۯk֭ls9rE^%}JqHf<jB ~MkkZ®Ů̲DZѮwˆĈ߹~Ɍʌʌʌʏ侄̥k|?v9ڲt޴sڱp֮nƢhUk?i>h=e;jC tDnmuīH̺ҷҾ'pȧqw=ҭuֲzҭwơjYǢhcbٳxܴwٲuկtȤma)j?g<e;d:c:q@irǶaѿop6m^"̳[Ӱz޻ܷ~޹~ݷ|۶{ٴzײyhUa,kAe;c:b9a9d@yX"e?a,~pnRทb lƣnʨsʨun_[a+gAgBhCiE BoKƪ{ĩ~ s0gIT[R^O]MSq=f0?????(0` %  $ 6&YE5wXAeKcIO;7+sV>97630-(#*TkV5٭CC&ӚpG5 SGFDA>92))<,vxQNNNPIԘ{YeLKJIFA7&E1)Nt!RPPQQQSB֗jL XMLLJE5` _Џ"TRRSSSSS>11ۖy.!|KJG@0otωؑ1VUVVVVVVWWVD۔ӍO7?6+ jrχ؏ 9YXXYYYYYYYYYYےӋʃz_Abiֽu}υ؍ߖ D\[[\\\\\\\\\\^ ېӉʁypiE?(!\`Ųjs{σ؋ޢ5^^^____`````___QێӇwnfTaY`hqyςؑ[aabbccccccccccccJ یӅ}ulc\W-S9V^fowυZddeeeffffffggdccZ? ۊӃ{rjaYTɊRNPʙT\dmuѐ/ggghhiiijjjjbR  ۉӁyqh`WOPb}MTJQZbksԘ?jjjkklllmmmp+ ۇ wof]UMK}KwHzHĂHPX`irʆ!fmmnnoopppqN م ~ umd[SK}DxIZsG.uA~FNV^gpy ڧWopqqrssnQ;ފ Ӄ { skbYQIxBtEoCo=yDLT\env ҜGstuvwxj2׈ ́ y q i`XO}Gs@m=wNj@k<tBJR[dvʗD͛H`ugw[Z%ۍч x p g_WPyFo>rFRdg? d9g:pAzHQYhřPƓ?ȋ&ҍܘ'#ݐԋ˄} v m eb>H`&n@rItfA6\2c8l?vGOXx)ǛRyÀщޒݐ֌Έłzs k e ;ØSQU`,pJib=WW1_7h=rE~Op)ǜUթ]Áыߕ ݑ׍ωȅxq i }2ŜV˜TSRTTS↑a=lT/\5e<oD`ŜXͣZ8xÂӏ%s= !"""" ڏЉɅ|un g CŜWVUUTTT^;uR-Y3c;~WTϤ[Fn zқ9e"(!!#$%%#" ܑ·ā}ysl f KŝYYXXWWU®\;rN,V2mHXVLϧavʚBr=!#%&&&%#!ُΈyupi d NĞ\[[ZZYWǵZ:dL+T1h6[{ eղsyՆۏχwpic] X T OVTQn7bD tY*L0[?dFp>ӱuzǀӇߏ:?܅S΅~wpic] X S O{LWWUb,\>Q4N2Z= &nPgIjݺzŀЇێՏ%|uohb ] X S O{KvHrH{DWQS|b3cGxY ?j3׶y€̆֌ލzrlga \ W S OzKyL vJ {R^ZZZUĊqCz[nw=῀DŽЊڑ{ԣLmh d _ Z V Q~NyJuGt>NwBb]]eŴ&|\`ƒʇҍے҈t˖Csic eiY TP}LxIsFwLSp={Teaiͽ7p4q6x˨nąˉҎٓ̇t&h޺qݸnxϠVbaզ]lg!N{KzL sEnBwNc.sLq@elϾ:^\ġhÆɊύԑόt޴p|ՒؔȜX}7nkE|N f*_wMj>oGzHbR{п)f'n忄ƈʋ͎ϏѐѐЏ̎Ù[Lpܱm֭md(vKk5lC h?yGlcı˻ ͳηgɩvܷҬsŊٳyͨoQKٱt۲t֯rUpE h=e;f>wGj̺4ȵ˱\Xf+Qͩs׳zٴzܷ}۶{سyhOsJe;c:a9gB vE2űyw\fqh湙dg_Zm8jD gAzhC9pMuc ][_??????( @    '0' \_Jbnk~\V@]<:60(J\Ѥ8OPFŒbG VJGC9% =+tRޜKQQQR=ɍL6MLI9n-~ړPUUUUVSQՏY O9% h3vͅڐKYYZZZZZY.ՌȀ] $]#hv͂ڏS]^^_____^L Չ}q\hATZ˰erܠ;bbccddddddd9ՆznaXQpVcpΆffghhiiib@2* Ճwk^RP-zK JS_m͊(kkllmmnk  ԁuh[NJuFb|DP]jx `opqrpY2݉ ~ reXLxBsGm@uBMZgxפRuwwp5ӆ { obUIp>xOqiC f:o?~KWpʛL͑->4-"؍ʃx l b t.`"k>[fA*\3i=wHX C'ǃۑڎΈt i 7—RSh4~Ra=EW1c:tH@͡VDžݗQ !"!ޒЉŃ{q kĜXUTTS^;MS.`:u9ʡ]:zY1" #%%# ޒˆ}vm mŞ\YXXV [:EN-sQ[f{($֜1#%''%!ُȄxqi s'ğ_]\\Z˻\<*K+vU%ş`m&d |\!$'('%"ҋuke q(àcaa`f\= N/rS#ɤdŞ[C]n!%(('$!ےʅzpf_ Z [eediQ3lM̧hݵoxڂi%!%''%#ҋsja Z {TTihhswV8egJ˨m߸s}ވ&"$$"ۑȃwlc[ U xR s:lkj±&]? kN˩o߹v̀ߋJF ͆zoe] U ~Q G}C~Mh;j@bDuWݹxʁ܌wANφzpf] V O~SVt;Z=N2]@0iKz]&׵xǂ׌ܜ7xne] U OxItI PUPoT"y[!&{Aωޓ|j b [ T NwIj2n7`\p̫mc&:_ƅҍޖٰc}'ܐƖEb z+iQ}LvGwL{I~Y"esȶJ2̩qLjЎόϡYجfƁ}s*lL}N x=rG mC q=~O{˹eˮ~忄ň͎ΎˍׯrM޳pӫk~S~Vj@uBnzʹǮ0U[ҮwΩoϩoٳxšij2f<c:uQ೛rȵp vGkzmdZ{JkF lgB1rP?(0 ` =/#R,!S@+(# 9)dt!ڭEBכ`$jGB8#]A)o:QRR8Y XJ:mCāܓNWWXXX.׏mL^9oˀ۔W]]^^^^L ׋|bX8O[k~Mcddeeeca(׈xgXMWg˄hijkkl= ׄtcRMRjD |FSdxfopqhF Ѐ p_NxElCSr@O`|ܪXqpXً| l[Kp@uF c;i<}Ld=̈ݐ̆x i 6EuMm\[6b9zN L/ˇ2# ! Љs v#ÚVTTn~W4`:HÚS~S!$%#Ȅyn z-œZYXuR2nLQ_ wܡ3$''$ ؏€rh :`_^|zS4iJ˦e>ΠFV!&('$Έyla h eddpPY;BaCϪjt؁U %'%!ڑ€qdZ }WiigT9 iLϬoy܈p'# ˅ug\ S k)OblaCic|ڊFDφwi] T ~RTrUX< dI4`Dl4}ӊUth] S |LvK UVh8wXOɆےڲ`wfZ QyJc)o:as± s8˨nʊҎʙOs}w,hbe&pE\&tB|ͽb вἂÆňܴwY۲py=uKuNh­ofQrťr˩tʧp\tMe>}\'^ rJpJ?(  @ UAw{0Ì֙oI5~A4}VGć)SS<{#l8 ^P}X\\\LېsF,=g@^z ZefgZIۊrZ[: {HXvinoYׅ mSxGq5"n?Rz ާMT8 h]}T>)`7[8ь' ωx|+TKvl[<'$]: D'4#&"o?[Yxi7$ `AQ0?&'#֎we =ce_Aկn=%$Łk[ i(jvaD[ͪmԆt3·p] R FqU$kC9:) z@̆jl\ O[XT_GǣhҎ֧\Ї=@YsG q>{yiLҵtҬq㼀ͦiš^qH h5Űbn_Fd0XSuKPY>'?launchy-2.5/plugins/weby/globals.h0000644000175000017500000000227411336047270016302 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GLOBALS_H #define GLOBALS_H #include struct WebySite { QString base; QString name; QString query; QString suggest; bool def; WebySite() { def = false; } WebySite(QString b, QString n, QString q, bool d = true, QString s = "") : base(b), name(n), query(q), suggest(s), def(d) {} }; struct Bookmark { QString url; QString shortcut; QString name; }; #endif launchy-2.5/plugins/weby/dlg.ui0000644000175000017500000000754011331664610015612 0ustar monesmones Dlg 0 0 464 271 Weby - Launch your favorite websites Firefox Bookmarks (See manual for Firefox 3) Internet Explorer Bookmarks (Windows only) 101 16777215 Default Search: 201 0 Set Default Clear Default 2 Name URL Qt::Horizontal 28 25 + Qt::Horizontal 28 25 - Qt::Horizontal 28 25 DropTableWidget QTableWidget
DropTableWidget.h
launchy-2.5/plugins/weby/weby.pro0000644000175000017500000000316611336333626016202 0ustar monesmonesTEMPLATE = lib QT += network CONFIG += plugin \ debug_and_release VPATH += ../../src/ PRECOMPILED_HEADER = precompiled.h INCLUDEPATH += ../../src/ INCLUDEPATH += c:/boost/ INCLUDEPATH += ../../common UI_DIR = ../../plugins/weby/ FORMS = dlg.ui HEADERS = plugin_interface.h \ weby.h \ gui.h \ globals.h \ ../../common/DropTableWidget.h \ precompiled.h \ IconCache.h SOURCES = plugin_interface.cpp \ weby.cpp \ gui.cpp \ ../../common/DropTableWidget.cpp \ IconCache.cpp TARGET = weby win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib LIBS += user32.lib % LIBS += Gdi32.lib % LIBS += comctl32.lib } if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/plugins unix:!macx { PREFIX = /usr target.path = $$PREFIX/lib/launchy/plugins/ icon.path = $$PREFIX/lib/launchy/plugins/icons/ icon.files = weby.png INSTALLS += target \ icon } macx { if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/Launchy.app/Contents/MacOS/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/Launchy.app/Contents/MacOS/plugins CONFIG(debug, debug|release):icons.path = ../../debug/Launchy.app/Contents/MacOS/plugins/icons/ CONFIG(release, debug|release):icons.path = ../../release/Launchy.app/Contents/MacOS/plugins/icons/ icons.files = weby.png INSTALLS += icons INCLUDEPATH += /opt/local/include/ } launchy-2.5/plugins/weby/weby.h0000644000175000017500000000453511350036220015614 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef WEBY_H #define WEBY_H #include "precompiled.h" #include "plugin_interface.h" #include "globals.h" #include "gui.h" #include "IconCache.h" class Suggest : public QObject { Q_OBJECT public: Suggest(); void run(QString url, QString query); QStringList results; public slots: void httpGetFinished(bool error); private: QString query; QHttp http; QEventLoop loop; int id; static int currentId; }; using namespace boost; class WebyPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: uint HASH_WEBSITE; uint HASH_DEFAULTSEARCH; uint HASH_WEBY; QList sites; QList marks; private: shared_ptr gui; QString iconCachePath; IconCache* iconCache; public: QString libPath; WebyPlugin() { // gui = NULL; HASH_WEBSITE = qHash(QString("website")); HASH_DEFAULTSEARCH = qHash(QString("defaultsearch")); HASH_WEBY = qHash(QString("weby")); } ~WebyPlugin() {} int msg(int msgId, void* wParam = NULL, void* lParam = NULL); void setPath(QString * path); void getLabels(QList*); void getID(uint*); void getName(QString*); void getResults(QList* inputData, QList* results); void getCatalog(QList* items); void launchItem(QList* inputData, CatItem*); void doDialog(QWidget* parent, QWidget**); void endDialog(bool accept); WebySite getDefault(); void init(); QString getFirefoxPath(); void indexFirefox(QString path, QList* items); QString getIcon(); #ifdef Q_WS_WIN void indexIE(QString path, QList* items); #endif }; extern WebyPlugin* gWebyInstance; #endif launchy-2.5/plugins/weby/weby.ico0000644000175000017500000002154610673261500016150 0ustar monesmones  F  hh( @    '/& \^Iamk~\V?]<:60(J~\Ѥ8OPFaFVJGC9% C(sQݛKQQQR=ɍK5MLI9k-~ړPUUUUVSQՏY O9% i3vͅڐKYYZZZZZY.ՌȀ]$^#gv͂ڏS]^^_____^L Չ}q\UU?Z˰erܠ;bbccddddddd9ՆznaXQpVcpΆffghhiiib@2* Ճwk^RO-L IS_m͊(kkllmmnk  ԁuh[NJuFb|DP]jx `opqrpY2݉ ~ reXLxArFl?uBMZgxפRuwwp5ӆ { obUIp>wNqf3e:o?~KWpʛL͑->4-"؍ʃx l b t.`"k>ZgB*\3i=wHX C'ǃۑڎΈt i 7—RSh4~Q`>EW1c:tH@͡VDžݗQ !"!ޒЉŃ{q kĜXUTTR\;MS.`:u9ʡ]:zY1" #%%# ޒˆ}vm mŞ\YXXV \;EN-sQ[f{($֜1#%''%!ُȄxqi s'ğ_]\\YԪ[<*K+vU%ş`m&d |\!$'('%"ҋuke q(àcaa`ff3M.rS#ɤdŞ[C]n!%(('$!ےʅzpf_ Z [eedhP2lM̧hݵoxڂi%!%''%#ҋsja Z {TTihhswU7egJ˨m߸s}ވ&"$$"ۑȃwlc[ U xR s:lkj®&\E jM˩o߹v̀ߋJF ͆zoe] U ~Q G}C~Mh;i@bCuWݹxʁ܌wANφzpf] V O~SVt;Z=M1_?0UUz]&׵xǂ׌ܜ7xne] U OxItI PUPoT"x]!&z@ωޓ|j b [ T NwIj2n7`\p̟_e':^ƅҍޖٰc}'ܐƖEb z+iQ}LvGwL{I~Y"esɴL2̨pLjЎόϡYجfƁ}s*lL}N x=rG mC q=~O{Ǽiʮ~俄ň͎ΎˍׯrM޳pӫk~S~Vj@uBmzį0TZҮwΩoϩoٳxšij2f<c:uPಛqİs vGjzmdY{IjF lhC1???( @/& J+S.K2T3\3V?[;_?f3b;k>w>\EUU^IcDiAbCkD uEzBvH}KrF uJ }N zUgJjLwNuO~SsQ~VoT"tT$z[#LNOQTY]T U Z [ RVZ[\ ^akkc c i kfkecijfk k kq tjmppuzz|e'`"m&r'h7k3r;u9x>s,z)}'zi@uB}C|K~P%7:ȅֈڔƄ˅Έ˅Ռܒ ͊(͑-֜1ܜ7!֢9""!*-$75&_CLCMLCPQTZXTVSZZ[gbbijspt{ƖEʛLÛX͡V̡[פRLM@AFLWSş`àcɤdši̧h̨nجfӫkٰcݵo̧pʮ~Ԯt޳p߸t׵xٳxݹx`dlkhFJZgi}twį®İɴǼ㿄ԪƂňˀLj͍ωڂӍ݊ܐޔ;<< }}}}mo{}}}|{m=Mow{Ҹ||{wn/FMmoyҋ|wwnm07DMmnҶ|wwnbM78KMbӌwwnbKE7-6EMsӳ~wvnbK:5**5:Kӈ~~|xwvnbK8+.8Gbָ~~~~zwnbME7**7DT֍~~~~~zyynbKD." .Q~~~~~zyytmMJ?_W 4jmuy~~~~~yytrbMIkZhipu~~~zutpTLA ]lS~yuqTRIC %B`jy~ytqSP@Y (X>Sy~ytcRI>Y (y~usTP?43!ԋytcRN>3 틎yusRO?41\!Ј~ysTO?92fgZd״qTPH92,$\  )TO?92,')^UJ?91[[Va?`C-g)毿_͔^\gœ$&eڪ٘žɼ[#g???(    U@wz0Ë֘oH4~A4}VGć)SS<{#l8 \P}X\\\LېrG-=i=]z ZefgZIۊrY\E {GXvinoYׅ mSwEqm>Rz ާMT8 h]}SB% `7[8ь' ωx|+TK8*$]: D'4#&"o?[Y?* `@Q0?&'#֎we =cd^Aկn=%$Łk[ i(jvbC[ͪmԆt3·p] R FqU$kC9y?̆jl\ O[XT[HƢhҎ֧\Ї=@YsG q>z?Ӵtҫq㼀ͦiš^qH h4Űbd0YSuLP[:'?(  #?*8*G-B% H4]: [:`7l=i=`?\EU@]A[HwE{FsG qH }VbC}RqU$?ORR [ S\XX\ ] Y[][\oe holmq{vxkpwi(h3z0q>x>|+z r}z  kCuL'=0?8=ćËۊׅ ې·ωŁь֎#'") $#&4?38<&%=TYFDK@YQTX[dccjvš^ާM֧\ILZSTXYšhͦiͪmկnzҪqiSZ\\jefgnotŰӴ㼀̆ЇԆҎ;WM,Lnwi_3"A[`P2 +BaN@$#4cbXO1! ?ved^YC.) (JUljog\S5> ~FsfqrmZQ/IHthxrkV8-Gzyp]T6 9uR7&}D=0%*{K'<:|E ?launchy-2.5/plugins/winshell/0000755000175000017500000000000011355776633015375 5ustar monesmoneslaunchy-2.5/plugins/winshell/gui.cpp0000644000175000017500000000500310674645777016672 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "gui.h" #include "winshell.h" Gui::Gui(QWidget* parent) : QWidget(parent) { setupUi(this); QSettings* settings = *gwinshellInstance->settings; if (settings == NULL) return; // Read in the array of websites from options table->setSortingEnabled(false); int count = settings->beginReadArray("winshell/cmds"); table->setRowCount(count); for(int i = 0; i < count; ++i) { settings->setArrayIndex(i); table->setItem(i, 0, new QTableWidgetItem(settings->value("name").toString())); table->setItem(i, 1, new QTableWidgetItem(settings->value("file").toString())); table->setItem(i, 2, new QTableWidgetItem(settings->value("args").toString())); } settings->endArray(); table->setSortingEnabled(true); connect(tableNew, SIGNAL(clicked(bool)), this, SLOT(newRow(void))); connect(tableRemove, SIGNAL(clicked(bool)), this, SLOT(remRow(void))); } void Gui::writeOptions() { QSettings* settings = *gwinshellInstance->settings; if (settings == NULL) return; settings->beginWriteArray("winshell/cmds"); for(int i = 0; i < table->rowCount(); ++i) { if (table->item(i,0) == NULL || table->item(i,1) == NULL) continue; if (table->item(i,0)->text() == "" || table->item(i,1)->text() == "") continue; settings->setArrayIndex(i); settings->setValue("name", table->item(i, 0)->text()); settings->setValue("file", table->item(i, 1)->text()); if (table->item(i,2) == NULL) settings->setValue("args", ""); else settings->setValue("args", table->item(i, 2)->text()); } settings->endArray(); } void Gui::newRow() { table->insertRow(table->rowCount()); table->setCurrentCell(table->rowCount()-1, 0); } void Gui::remRow() { if (table->currentRow() != -1) table->removeRow(table->currentRow()); }launchy-2.5/plugins/winshell/gui.h0000644000175000017500000000210210674645777016334 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GUI_H #define GUI_H #include "ui_dlg.h" #include "globals.h" //#include class Gui : public QWidget, private Ui::Dlg { Q_OBJECT private: public: Gui(QWidget* parent); ~Gui() { this->hide(); } void writeOptions(); public slots: void newRow(); void remRow(); }; #endif launchy-2.5/plugins/winshell/winshell.ico0000644000175000017500000142516610674645777017744 0ustar monesmones000F 0 00hf 6(!00&$ vARhV` (&k`` v{PP gƤHH Tt@@ (B00 %  F  h!(0`??????(0`??????( @????????????( @????????????( @????( @????(0`ss9p;p;{9p{;p 9y󛛹9; y{;8p ?; ; ;{ ?;{{{{{ {?{ {{{p{{{x{p ??(0`ss9p;p;{9p{;p 9y󛛹9; y{;8p ?; ; ;{ ?;{{{{{ {?{ {{{p{{{x{p ??( @97pp9py?py?8p ?{9;{?{{{x{{ {??( @97pp9py?py?8p ?{9;{?{{{x{{ {??(0 w7pp{;p y;;󻛻p;pp?p (0 w7pp{;p y;;󻛻p;pp?p ( pp{{;p 0( pp{{;p 0(0` /lUuV~ZzXw^|^~ovp w#+,655>?VFLVACJJIYbmerztr{gvjJZjy   "!" #KK ,ZKKKKK;$)[ ͍KKKIIIKLLL(\KKKKKR:LNNN,\KKKKKK9@NNNNN$]KKKLKLJJLLLNJ#+,655>?VFLVACJJIYbmerztr{gvjJZjy   "!" #KK ,ZKKKKK;$)[ ͍KKKIIIKLLL(\KKKKKR:LNNN,\KKKKKK9@NNNNN$]KKKLKLJJLLLNJ ! 3,  %(:2 !,VDFdrJ\]q  . =<"..8=@ENSX]NMIMM]\ghp}qftslwMV\]jlmux|r|* $" ! CC%+ CCGG#- CCG6GNN(CGGCNNNP&XCGGN8:NPPe9)CCCC6@NG@Oeeeee'YCCCCGGG6@NPU ! 3,  %(:2 !,VDFdrJ\]q  . =<"..8=@ENSX]NMIMM]\ghp}qftslwMV\]jlmux|r|* $" ! CC%+ CCGG#- CCG6GNN(CGGCNNNP&XCGGN8:NPPe9)CCCC6@NG@Oeeeee'YCCCCGGG6@NPU ,,)e..= ,..*992,_&..(f99C4Z,,,,.`(885CCEE3,,..8.da9RȠCEEEKB.8.8889 ,,)e..= ,..*992,_&..(f99C4Z,,,,.`(885CCEE3,,..8.da9RȠCEEEKB.8.8889>>-,*HO3haf??@@5DDDP}LrFFGB7IIIKf~QTTTRWWWdyrUXXXX\kkkz~koooo[]vvtrwwwv[`rxxq_( I{S{lpj mnuqpvy} |vKonwxp )66Tj@P]g?66656ZUUTyh~{{tpUUvuttu   ^9c8 ^:#{'6bNiM'))"4;+//0$!')'g{/0>>>-,*HO3haf??@@5DDDP}LrFFGB7IIIKf~QTTTRWWWdyrUXXXX\kkkz~koooo[]vvtrwwwv[`rxxq_(      #'+.14689:::98530-)&!  !'-39>CHMQTWZ[\\[ZXVSOKFA<70+%  $,4<CKSZ`fk+#B)U-f-i-j5/w-i.i*Z&K9 nid]WPH@80)!  #,6?IS]e'|-^5N[ccg knqqqqq p nlkkaZG1p#D |jaXOE;1(   (2>IU` v-]F_dlu(|3=FA:2+)'&#~#$&& {x uspl[;"?xf[OD8-#   +6CP]s5p\cj&y=QG6)}unhggghhijjklllor uxz|z wtrmP%GvdXJ>1&  +8GU f.[Sdm7WQ7vhdefffgghiijjkkllmnnooppqtw x zxvukE/m]O@2%  (7FVo@e h0UU0 kddeeffgghhiijkkllmmnnopppqrrsttuvyyyxx`+Os_O?1#$3CTnGfmGb=rcddeeffgghhijjjkklmmnnoopqqrrsstuuvwwxyzzz{j/Ut^L<,  ,=O eEfpMd2fcddeffggghhijjkkllmmnooopqqrssstuuvwwxxyyz{|||}j *HnYF5&  $4FY4fgnRb.fddeefffghhiijjkkllmnnnoppqqrrsttuuvvwxxyyzz{|}}}~_ (dQ>, *;O(s\h?i2eddeefggghhiijkkkllmnnooppqqrrsttuuvvwxxyzzz{|}}~~} EzxZF3#   /BV;pj&ziG kdeefffgghhijjjkklmmmnooppqqrrsttuuvvwxxyyz{{||}~~m )bM8'  !3G bVlRbudeeffgghhiijjkkllmmnnoopqqrrrsttuuvvwxxyyz{{|}}~~6YlS>+ $6L5yhsjDfefffgghhiijjkklllllmmmnopqrssttuuvwwwxyyz{{||}~~ W |YB.  &9O9jl7m#zeffggghhijjkkkllmmllkkkklnoqstuuuvwwxxyyz{{||}~~t $]E0  ';RGpU_pgghhhiijkkkllmmnnonmljhghiloqtuvwxxxyzz{{||}~~~#2`G2 '<TR rbHhhhhiijjjkkllmmnnooonmjf'|pr%{hlpsvwxyyyz{{||}}~~,@aI2 ';V[tl=hhiiijjkkllmmnnnoppqpnkhtosvyyzz{{|}}}~~{zz{~8ScI2  $:T`vo/iijjkklllmnnoooppqrrrqokf[ntwz{{|}}~~}yFpk}Orrsssttuuvvwwwxxyyzz{{||}}~~}ysoqzz?cbA'  (BXk ztttuuvvwwwxxyyyz{{{|}}}~~{urr{~Q0=S6 61g\/tuuuvvwwwxxyyzz{{||}}}~~|vsr{~< pF+   *Eo)Zvvvwwxxxyyzz{{{||}}~~~xtt}qKbW9  70Pxgwwwxxyyzz{{{||}}~~~xuu}9 {H,   *Ey5Jxxyyzz{{|||}}}~zu |WuW9    64Tzezz{{{||}}~~~{w(6 |G* 'Cx4E{|||}}~~}y' VpT6   2)Akb|}}}~~~z405rB' #=i(N~~~ }@"CSO1  ,ORN5Ga;!   5HqZ} #%F* $?72J:#a{Q2  ,*WY#m f;!  3LvO ?)!%(D( !;1/ &^vM/  ' FK?pE Y6  -:YqU?N t="  3U>K %/4C'  9/(N(cxJ, #=?Qt&P1  ''OKb)`6  *>]pH_  r:  -Mr;%%%="  0]/!N"*>=<;9742343:E8;=>???????????????????????????e-V+ !! //FCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBAA@=:EF5V9=@ACCCCCCCCCCCCCCCCCCCCCCCCCCCCr6?$'vLGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGFFEC@<>BDFGGGGGGGGGGGGGGGGGGGGGGGGGGGPl7T\6 '4 F[bOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJIFBRcCFIJKKKKKKKKKKKKKKKKKKKKKKKKKKKjA&&&b- )  1:POOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONMKHDEHKMNOOOOOOOOOOOOOOOOOOOOOOOOOOO4B%'~USSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRPMI_JNPRSSSSSSSSSSSSSSSSSSSSSSSSSSS`v9]d5 )7 ;LUTWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVUSOJTMQTUVWWWWWWWWWWWWWWWWWWWWWWWWWWW}>!!!Z+ +" ,8[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZXUPkgORUWYZ[[[[[[[[[[[[[[[[[[[[[[[[[[[^ :;"#."Zs}____________________________________^]ZWQPTWY[]^^___________________________|c2;=q/ (4  2Mcccccccccccccccccccccccccccccccccccca`]XuWVY\^`abccccccccccccccccccccccccccccc2 B$!'(3$s"ggggggggggggggggggggggggggggggggggggfec_ZfY\_aceffggggggggggggggggggggggggggggg~|8OU1 %-: 9Ykkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkihe`[|[_beghijkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk,.F%",*5#u&ooooooooooooooooooooooooooooooooooonmkie`[_aehjlmnoooooooooooooooooooooooooooooooo8PV~1 $(0< 5]sssssssssssssssssssssssssssssssssrqpnkgc_\\ojehkmoqrrssssssssssssssssssssssssssssssssw+1 B$ "&$.*5!bz{vwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwutqojf|`__hhdegikmnqstuvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww} 4@Co.  %)0< *P{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zyvrmcfjmoqstuwxyz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{<9  "%$-)35BR v~}{wqjptxz{||}~~[ T( $(.8%$.}xxtz~ I1;NY(#$M' ), (,?I &+,4GS ,H% *- *-?I:B!'8L5=$ *- *.@H9A,;Z 8} 5! :> )->G8? $tz!.2UXl, 9= ),B03=DLS  $brn."")KNd, 368< *-5;DJ;A  /9"(mu4" @D25;@!JQ)- !3-~v%ow6$ 368;@F$OV,/,fuzXE""X^o1$  6:=A.1CI%QX,0%BLOUI 14K*!  8<AD26CI$QW+.  'S^])U|V"} ADU,$ 8;AE37>DLR@E  &07?cpx*E\t~hQ7 _gr!"=)# '*KO=A 036;CIQW*-   &*IRO cnwnz տ  ϼ lvbjt7C>EGO OV T\Ya[c CI+/+/+/*.*.*.)- AFW^T[ OU HO@F??????????????(      #'+.14689:::98530-)&!  !'-39>CHMQTWZ[\\[ZXVSOKFA<70+%  $,4<CKSZ`fk+#B)U-f-i-j5/w-i.i*Z&K9 nid]WPH@80)!  #,6?IS]e'|-^5N[ccg knqqqqq p nlkkaZG1p#D |jaXOE;1(   (2>IU` v-]F_dlu(|3=FA:2+)'&#~#$&& {x uspl[;"?xf[OD8-#   +6CP]s5p\cj&y=QG6)}unhggghhijjklllor uxz|z wtrmP%GvdXJ>1&  +8GU f.[Sdm7WQ7vhdefffgghiijjkkllmnnooppqtw x zxvukE/m]O@2%  (7FVo@e h0UU0 kddeeffgghhiijkkllmmnnopppqrrsttuvyyyxx`+Os_O?1#$3CTnGfmGb=rcddeeffgghhijjjkklmmnnoopqqrrsstuuvwwxyzzz{j/Ut^L<,  ,=O eEfpMd2fcddeffggghhijjkkllmmnooopqqrssstuuvwwxxyyz{|||}j *HnYF5&  $4FY4fgnRb.fddeefffghhiijjkkllmnnnoppqqrrsttuuvvwxxyyzz{|}}}~_ (dQ>, *;O(s\h?i2eddeefggghhiijkkkllmnnooppqqrrsttuuvvwxxyzzz{|}}~~} EzxZF3#   /BV;pj&ziG kdeefffgghhijjjkklmmmnooppqqrrsttuuvvwxxyyz{{||}~~m )bM8'  !3G bVlRbudeeffgghhiijjkkllmmnnoopqqrrrsttuuvvwxxyyz{{|}}~~6YlS>+ $6L5yhsjDfefffgghhiijjkklllllmmmnopqrssttuuvwwwxyyz{{||}~~ W |YB.  &9O9jl7m#zeffggghhijjkkkllmmllkkkklnoqstuuuvwwxxyyz{{||}~~t $]E0  ';RGpU_pgghhhiijkkkllmmnnonmljhghiloqtuvwxxxyzz{{||}~~~#2`G2 '<TR rbHhhhhiijjjkkllmmnnooonmjf'|pr%{hlpsvwxyyyz{{||}}~~,@aI2 ';V[tl=hhiiijjkkllmmnnnoppqpnkhtosvyyzz{{|}}}~~{zz{~8ScI2  $:T`vo/iijjkklllmnnoooppqrrrqokf[ntwz{{|}}~~}yFpk}Orrsssttuuvvwwwxxyyzz{{||}}~~}ysoqzz?cbA'  (BXk ztttuuvvwwwxxyyyz{{{|}}}~~{urr{~Q0=S6 61g\/tuuuvvwwwxxyyzz{{||}}}~~|vsr{~< pF+   *Eo)Zvvvwwxxxyyzz{{{||}}~~~xtt}qKbW9  70Pxgwwwxxyyzz{{{||}}~~~xuu}9 {H,   *Ey5Jxxyyzz{{|||}}}~zu |WuW9    64Tzezz{{{||}}~~~{w(6 |G* 'Cx4E{|||}}~~}y' VpT6   2)Akb|}}}~~~z405rB' #=i(N~~~ }@"CSO1  ,ORN5Ga;!   5HqZ} #%F* $?72J:#a{Q2  ,*WY#m f;!  3LvO ?)!%(D( !;1/ &^vM/  ' FK?pE Y6  -:YqU?N t="  3U>K %/4C'  9/(N(cxJ, #=?Qt&P1  ''OKb)`6  *>]pH_  r:  -Mr;%%%="  0]/!N"*>=<;9742343:E8;=>???????????????????????????e-V+ !! //FCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBAA@=:EF5V9=@ACCCCCCCCCCCCCCCCCCCCCCCCCCCCr6?$'vLGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGFFEC@<>BDFGGGGGGGGGGGGGGGGGGGGGGGGGGGPl7T\6 '4 F[bOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJIFBRcCFIJKKKKKKKKKKKKKKKKKKKKKKKKKKKjA&&&b- )  1:POOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONMKHDEHKMNOOOOOOOOOOOOOOOOOOOOOOOOOOO4B%'~USSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRPMI_JNPRSSSSSSSSSSSSSSSSSSSSSSSSSSS`v9]d5 )7 ;LUTWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVUSOJTMQTUVWWWWWWWWWWWWWWWWWWWWWWWWWWW}>!!!Z+ +" ,8[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZXUPkgORUWYZ[[[[[[[[[[[[[[[[[[[[[[[[[[[^ :;"#."Zs}____________________________________^]ZWQPTWY[]^^___________________________|c2;=q/ (4  2Mcccccccccccccccccccccccccccccccccccca`]XuWVY\^`abccccccccccccccccccccccccccccc2 B$!'(3$s"ggggggggggggggggggggggggggggggggggggfec_ZfY\_aceffggggggggggggggggggggggggggggg~|8OU1 %-: 9Ykkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkihe`[|[_beghijkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk,.F%",*5#u&ooooooooooooooooooooooooooooooooooonmkie`[_aehjlmnoooooooooooooooooooooooooooooooo8PV~1 $(0< 5]sssssssssssssssssssssssssssssssssrqpnkgc_\\ojehkmoqrrssssssssssssssssssssssssssssssssw+1 B$ "&$.*5!bz{vwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwutqojf|`__hhdegikmnqstuvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww} 4@Co.  %)0< *P{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zyvrmcfjmoqstuwxyz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{<9  "%$-)35BR v~}{wqjptxz{||}~~[ T( $(.8%$.}xxtz~ I1;NY(#$M' ), (,?I &+,4GS ,H% *- *-?I:B!'8L5=$ *- *.@H9A,;Z 8} 5! :> )->G8? $tz!.2UXl, 9= ),B03=DLS  $brn."")KNd, 368< *-5;DJ;A  /9"(mu4" @D25;@!JQ)- !3-~v%ow6$ 368;@F$OV,/,fuzXE""X^o1$  6:=A.1CI%QX,0%BLOUI 14K*!  8<AD26CI$QW+.  'S^])U|V"} ADU,$ 8;AE37>DLR@E  &07?cpx*E\t~hQ7 _gr!"=)# '*KO=A 036;CIQW*-   &*IRO cnwnz տ  ϼ lvbjt7C>EGO OV T\Ya[c CI+/+/+/*.*.*.)- AFW^T[ OU HO@F??????????????(`   "#$%$"    '.4:?CGIJJIHDA<60*#  &0:DNV^g*<"M!O&\#V"O F6iaZRH>4*!  &3@N\"v%S;J_ kpsvxwwvt r ph]H8y= xaSF8+   ,;K `=<Wh$y3:6,"zwsqrr rtvxyzy wriU5p$eRA2#  ->Q%s8~Ws=C5v lgefgghijjklmmnoqsv x xwqW.[ vZF4$ +?U COp8J2lddeffghhijkklmnnoppqrsttwxyxqF"^H3!  $8O@RqGCsfdeefgghijjkllmnnopqrrstuvvwxyz{{tI YA, -E kIrLDpddeefgghiijkllmnoopqrrstuuvwxxyz{||}~u>r pO6!!7R6q k@Kmddeffgghijjkllmnoopqqrstuuvwxyyz{|}}~l%@]A* %>gS*~T%zfeffgghijjkklmmnoppqrrstuvvwxyzz{|}~ Dx nI/ )C#BdGCieffgghiijkklllmmnpqrrstuuvwxxyz{|}}~bO4  -J:rwX'}ffgghiijkkllmmlkjklnqsuuvwwxyyz{|}~~~ %:W8 -NE$~Usghhiijkkllmnnomkhqwlkptvwxxyz{{|}~~ 0LZ9  -LN0Tlhhijjkllmmnoppomi?ntwyyz{||}~~{{} :\Y9 , OT8Ikijkkllmnnoppqrrqmglty{{|}~~}?b[8  'IN2Hlkkllmnnoopqqrsstrnfktz|}~x;ZW3  "?F)Pmllmmnooppqrssttuvsogku|~|42.DN- 91YTqmnnoopqqrrsttuvvwxvphqv}| %H( 04k wZ vnooppqrrsstuuvwwxyzwrivw~}W zq>  % MiQ~opqqqrsstuuvvwxxyzz{ytj|y \[3 ;N77qrrsttuuvvwxxyzz{||}~{vm!z~x~8NJ(.!8kOtsstuuvvwwxyyz{{|}}~}wq){ r<    EhRtuuvvwwxyyzz{||}~~~ys2|[T-2;g(:vvwxxyyzz{{|}}~{u;~3%0A   ! KxTzwxyyz{{{|}}~|vEzpY./@m.0yzz{{|}}~~~wQK)5>  AN~{||}~~y_utR+ +7X}(2}}~~{kS "}: 9kJ  x \{J$  "+[? [< e0 -L}6  4@<8zF P_lI#  ,W6-[  `, %@e)<e *24 -`8 M_= 4=wm ~E!  > 0DI;P' *?[$ c+ ";Wy"t0  %S|* U` 9E4(j/ &!P^7 )r1 !]m9 +w2   dw: +y2 >  h{; *{2   !j}: ){0 77C8}'%#!hz8  'y. +x~1+!#et6 %u+  r[^>3%]h3   !e&%  $@ \$ =&LW/  E_{-%%%%%%%%%%%%%%%%%$"[3 K&!!6!#%%%%%%%%%%%%%%%%%%%%%E#+-s+ "8L^4*****************)(&&b("%&$h&()********************L`& = 9..................-,+)/k<=))2<*-....................0ML  ,;3333333333333333333321/.1s-.-g/0233333333333333333333=?&< $4988888888888888888888776423tS01025888888888888888888888M+(r3_%@======================<;:96<233OU8;=====================]$IP*&/>XGBBBBBBBBBBBBBBBBBBBBBBBAA@>;?}8`9=@BBBBBBBBBBBBBBBBBBBBB_Z!  " .DGGGGGGGGGGGGGGGGGGGGGGGGGGFC??DFGGGGGGGGGGGGGGGGGGGGQK$=  !w5MMMLMLMMLMMLMMLMMLMMLMMMLMLJGFyFJLMMLMMLMMLMMLMMLMMLMMl")al. 8I\SRRRRRRRRRRRRRRRRRRRRRRRRRRPNIVMPQRRRRRRRRRRRRRRRRRRRTt'*_# ". .RWWWWWWWWWWWWWWWWWWWWWWWWWWWUQUOQUVWWWWWWWWWWWWWWWWWWWWgL%: d3]]\]\]]\]]\]]\]]\]]\]]]\]]\[XR\SWY[\\]]\]]\]]\]]\]]\]]\]*LR})%07^bbbbbbbbbbbbbbbbbbbbbbbbbba_[clVZ]_abbbbbbbbbbbbbbbbbbbbbkn B !+ {Fgggggggggggggggggggggggggggfc]tZ^bdfggggggggggggggggggggggg-*do*)4$-Djlmlmmlmmlmmlmmlmmlmmmlmmlmlie_dbehjllmlmmlmmlmmlmmlmmlmmlmmv}J  &0 |Mrrrrrrrrrrrrrrrrrrrrrrrrrqomhc]hseimoqqrrrrrrrrrrrrrrrrrrrrrrrs0+cl+!+67rwwwwwwwwwwwwwwwwwwwwwwwwurmpaaifhjlortvwwwwwwwwwwwwwwwwwwwwwwwwww{" @%/ [qwA||}}|}}|}}|}}|}}|}}}|}|{xrolquwxz{|||}}|}}|}}|}}|}}|}}|}}|}}|''DHo% #'0:$hzvry~[,0 !+3&/C|~#H #'-6 Wkr5'$CHk$ &* 1: !R9-ls, !#  9C %]G,0  $'-6 *2 6hO% = ),3< .6 '@zX"D -15? ,3!(= wO!@ ), 7@!'? tB#B ), :C29 6v4( : )- 8A18 $`$(u~, 37 8?29\kpAuKPi&04 3;@G )0@>"A*,03AI%(XfkIݪjGLd& 69 ),9?7<  1dv)"y 4&(47BH.2(.?]l)} ?   25 *-49GM,/ 1r9}Cgo~ 3  8;148>DJ25 'AJW0es>8  &6=Qt '7Pk|cA-lu 25N(+-7:37:?BH/3  "2GP\S\v |SZsEKZ 2% "$59:> 9>AGDJ +/    +. 6:=A:>8> BI DJ;A AG DJ.1 # # " "" 59 @E <@ ;@ DI 9=??????????(`   "#$%$"    '.4:?CGIJJIHDA<60*#  &0:DNV^g*<"M!O&\#V"O F6iaZRH>4*!  &3@N\"v%S;J_ kpsvxwwvt r ph]H8y= xaSF8+   ,;K `=<Wh$y3:6,"zwsqrr rtvxyzy wriU5p$eRA2#  ->Q%s8~Ws=C5v lgefgghijjklmmnoqsv x xwqW.[ vZF4$ +?U COp8J2lddeffghhijkklmnnoppqrsttwxyxqF"^H3!  $8O@RqGCsfdeefgghijjkllmnnopqrrstuvvwxyz{{tI YA, -E kIrLDpddeefgghiijkllmnoopqrrstuuvwxxyz{||}~u>r pO6!!7R6q k@Kmddeffgghijjkllmnoopqqrstuuvwxyyz{|}}~l%@]A* %>gS*~T%zfeffgghijjkklmmnoppqrrstuvvwxyzz{|}~ Dx nI/ )C#BdGCieffgghiijkklllmmnpqrrstuuvwxxyz{|}}~bO4  -J:rwX'}ffgghiijkkllmmlkjklnqsuuvwwxyyz{|}~~~ %:W8 -NE$~Usghhiijkkllmnnomkhqwlkptvwxxyz{{|}~~ 0LZ9  -LN0Tlhhijjkllmmnoppomi?ntwyyz{||}~~{{} :\Y9 , OT8Ikijkkllmnnoppqrrqmglty{{|}~~}?b[8  'IN2Hlkkllmnnoopqqrsstrnfktz|}~x;ZW3  "?F)Pmllmmnooppqrssttuvsogku|~|42.DN- 91YTqmnnoopqqrrsttuvvwxvphqv}| %H( 04k wZ vnooppqrrsstuuvwwxyzwrivw~}W zq>  % MiQ~opqqqrsstuuvvwxxyzz{ytj|y \[3 ;N77qrrsttuuvvwxxyzz{||}~{vm!z~x~8NJ(.!8kOtsstuuvvwwxyyz{{|}}~}wq){ r<    EhRtuuvvwwxyyzz{||}~~~ys2|[T-2;g(:vvwxxyyzz{{|}}~{u;~3%0A   ! KxTzwxyyz{{{|}}~|vEzpY./@m.0yzz{{|}}~~~wQK)5>  AN~{||}~~y_utR+ +7X}(2}}~~{kS "}: 9kJ  x \{J$  "+[? [< e0 -L}6  4@<8zF P_lI#  ,W6-[  `, %@e)<e *24 -`8 M_= 4=wm ~E!  > 0DI;P' *?[$ c+ ";Wy"t0  %S|* U` 9E4(j/ &!P^7 )r1 !]m9 +w2   dw: +y2 >  h{; *{2   !j}: ){0 77C8}'%#!hz8  'y. +x~1+!#et6 %u+  r[^>3%]h3   !e&%  $@ \$ =&LW/  E_{-%%%%%%%%%%%%%%%%%$"[3 K&!!6!#%%%%%%%%%%%%%%%%%%%%%E#+-s+ "8L^4*****************)(&&b("%&$h&()********************L`& = 9..................-,+)/k<=))2<*-....................0ML  ,;3333333333333333333321/.1s-.-g/0233333333333333333333=?&< $4988888888888888888888776423tS01025888888888888888888888M+(r3_%@======================<;:96<233OU8;=====================]$IP*&/>XGBBBBBBBBBBBBBBBBBBBBBBBAA@>;?}8`9=@BBBBBBBBBBBBBBBBBBBBB_Z!  " .DGGGGGGGGGGGGGGGGGGGGGGGGGGFC??DFGGGGGGGGGGGGGGGGGGGGQK$=  !w5MMMLMLMMLMMLMMLMMLMMLMMMLMLJGFyFJLMMLMMLMMLMMLMMLMMLMMl")al. 8I\SRRRRRRRRRRRRRRRRRRRRRRRRRRPNIVMPQRRRRRRRRRRRRRRRRRRRTt'*_# ". .RWWWWWWWWWWWWWWWWWWWWWWWWWWWUQUOQUVWWWWWWWWWWWWWWWWWWWWgL%: d3]]\]\]]\]]\]]\]]\]]\]]]\]]\[XR\SWY[\\]]\]]\]]\]]\]]\]]\]*LR})%07^bbbbbbbbbbbbbbbbbbbbbbbbbba_[clVZ]_abbbbbbbbbbbbbbbbbbbbbkn B !+ {Fgggggggggggggggggggggggggggfc]tZ^bdfggggggggggggggggggggggg-*do*)4$-Djlmlmmlmmlmmlmmlmmlmmmlmmlmlie_dbehjllmlmmlmmlmmlmmlmmlmmlmmv}J  &0 |Mrrrrrrrrrrrrrrrrrrrrrrrrrqomhc]hseimoqqrrrrrrrrrrrrrrrrrrrrrrrs0+cl+!+67rwwwwwwwwwwwwwwwwwwwwwwwwurmpaaifhjlortvwwwwwwwwwwwwwwwwwwwwwwwwww{" @%/ [qwA||}}|}}|}}|}}|}}|}}}|}|{xrolquwxz{|||}}|}}|}}|}}|}}|}}|}}|}}|''DHo% #'0:$hzvry~[,0 !+3&/C|~#H #'-6 Wkr5'$CHk$ &* 1: !R9-ls, !#  9C %]G,0  $'-6 *2 6hO% = ),3< .6 '@zX"D -15? ,3!(= wO!@ ), 7@!'? tB#B ), :C29 6v4( : )- 8A18 $`$(u~, 37 8?29\kpAuKPi&04 3;@G )0@>"A*,03AI%(XfkIݪjGLd& 69 ),9?7<  1dv)"y 4&(47BH.2(.?]l)} ?   25 *-49GM,/ 1r9}Cgo~ 3  8;148>DJ25 'AJW0es>8  &6=Qt '7Pk|cA-lu 25N(+-7:37:?BH/3  "2GP\S\v |SZsEKZ 2% "$59:> 9>AGDJ +/    +. 6:=A:>8> BI DJ;A AG DJ.1 # # " "" 59 @E <@ ;@ DI 9=??????????(P g  ")/49<==<:61+$ ".:EPYd(|:AKGA4 }f\SI>2&  !0@Qh"J;K bpvx zyywus m_J6v5 lWF5& &8Mm0nSq,}40'|up mklmnp r twx wvkO(RqT?,%:S#LMr98!x keffghijkllmnopqruwxwlI0[B+ 4P'TZ0B&zhdeffghijkllmnopqrstuvwxyzwV3Y=%(D8{W5Gtddefgghijkllmnopqrstuvwxxyz||}{R}N1  3WD#zLtdeefghiijklmnoopqrstuvvwyyz{|}~z8e`=" ;0s bF3fefgghijkklmnopqqrstuvwxyy{||}~[wF(#B1cvMqffghhijkllmlllnprstuvwwxz{{|}~t#9N,$FA3@jgghijjklmnnmjgginruvwxyz{|}} 0NR. #EK?2hhijjklmmnopol,yqvyyz{|}~|{~ ;_S. !EPE(ijkklmnnopqrrqk{pw{|}}~| @fS, @JA&kklmmnopqqrsttrlpy}~|Y :YM' 7=t7/lmmnoppqrsstuvwtmq{ +@E   -'Gx&:nnoppqrsstuvvwxywor|}wd  |: !SwJqppqrsstuvvwxyyz{yqs~ t_. :\L xrrsttuvwwxyzz{|}~{su~^NrI! */S~2%stuuvvwxxyz{||}~}uv.&8  G vHuuvwxxyzz{|}}~ww]tU& ,EzCwxyyz{{|}}~yzM2C;  I;yzz{||}~{ [W%  )Ev? ||}~~}d3C7  ?};~~ XzM   -Jr0(i#v. -b= Up=  @+nfO 0Km-OR # q*  %X7)uGY4.z2 t= 6"`zDH 0P [! 2Jn'# m& Ms-pi 7B* \.#IU- !b. = Ra/ !e. M Wf/ !f/E $Xh/ f.o/x(Vd- d-mvOB#'Q\* Z~* P @->,"EN& :g:f;?AAAAAAAAAAAAAAAAAV"48n  9JHHHHHHHHHHHHHHHHHHHHHGDA[CGHHHHHHHHHHHHHHHHHb D!INNNNNNNNNNNNNNNNNNNNNNLHyHKNNNNNNNNNNNNNNNNNSQ"/%Qjx4UUUUUTTTTTTTTTTTTTTTTTTPNkOSTUUUUUUUUUUUUUUUUk,?Es  5Z[[[[[[[[[[[[[[[[[[[[[[XSSUXZ[[[[[[[[[[[[[[[[\s ?)wNaaaaaaaaaaaaaaaaaaaaaa`\Y]X\_aaaaaaaaaaaaaaaaaapJ$fq& ", #-C%ghhhhhhhhhhhhhhhhhhhhhge`mk]befhhhhhhhhhhhhhhhhhhh I#-\nnnnnnnnnnnnnnnnnnnnnnlhauafjlnnnnnnnnnnnnnnnnnnnn}X%nz' &0 &=&tuuttttttttttttttttttsojjtkn|lkorttuuuuuuuuuuuuuuuuuuuv"C ""+j[{{{{{{{{{{{{{{{{{{{zvppinrtvxz{{{{{{{{{{{{{{{{{{{{{{L%X^" &/  %z~xsy~(1 !%/91f~:!?+./29?=B" /^js-f}DU[o103587<:?), 2V`m *Kc~xX?!PWi3  1337>D6; !#  '9@NHPiv q|GNh 6;L( ! +.9< 9?>D 7<$("       $' -1 7<:>6<?E@F4:5:494949 >D6;?????????(P g  ")/49<==<:61+$ ".:EPYd(|:AKGA4 }f\SI>2&  !0@Qh"J;K bpvx zyywus m_J6v5 lWF5& &8Mm0nSq,}40'|up mklmnp r twx wvkO(RqT?,%:S#LMr98!x keffghijkllmnopqruwxwlI0[B+ 4P'TZ0B&zhdeffghijkllmnopqrstuvwxyzwV3Y=%(D8{W5Gtddefgghijkllmnopqrstuvwxxyz||}{R}N1  3WD#zLtdeefghiijklmnoopqrstuvvwyyz{|}~z8e`=" ;0s bF3fefgghijkklmnopqqrstuvwxyy{||}~[wF(#B1cvMqffghhijkllmlllnprstuvwwxz{{|}~t#9N,$FA3@jgghijjklmnnmjgginruvwxyz{|}} 0NR. #EK?2hhijjklmmnopol,yqvyyz{|}~|{~ ;_S. !EPE(ijkklmnnopqrrqk{pw{|}}~| @fS, @JA&kklmmnopqqrsttrlpy}~|Y :YM' 7=t7/lmmnoppqrsstuvwtmq{ +@E   -'Gx&:nnoppqrsstuvvwxywor|}wd  |: !SwJqppqrsstuvvwxyyz{yqs~ t_. :\L xrrsttuvwwxyzz{|}~{su~^NrI! */S~2%stuuvvwxxyz{||}~}uv.&8  G vHuuvwxxyzz{|}}~ww]tU& ,EzCwxyyz{{|}}~yzM2C;  I;yzz{||}~{ [W%  )Ev? ||}~~}d3C7  ?};~~ XzM   -Jr0(i#v. -b= Up=  @+nfO 0Km-OR # q*  %X7)uGY4.z2 t= 6"`zDH 0P [! 2Jn'# m& Ms-pi 7B* \.#IU- !b. = Ra/ !e. M Wf/ !f/E $Xh/ f.o/x(Vd- d-mvOB#'Q\* Z~* P @->,"EN& :g:f;?AAAAAAAAAAAAAAAAAV"48n  9JHHHHHHHHHHHHHHHHHHHHHGDA[CGHHHHHHHHHHHHHHHHHb D!INNNNNNNNNNNNNNNNNNNNNNLHyHKNNNNNNNNNNNNNNNNNSQ"/%Qjx4UUUUUTTTTTTTTTTTTTTTTTTPNkOSTUUUUUUUUUUUUUUUUk,?Es  5Z[[[[[[[[[[[[[[[[[[[[[[XSSUXZ[[[[[[[[[[[[[[[[\s ?)wNaaaaaaaaaaaaaaaaaaaaaa`\Y]X\_aaaaaaaaaaaaaaaaaapJ$fq& ", #-C%ghhhhhhhhhhhhhhhhhhhhhge`mk]befhhhhhhhhhhhhhhhhhhh I#-\nnnnnnnnnnnnnnnnnnnnnnlhauafjlnnnnnnnnnnnnnnnnnnnn}X%nz' &0 &=&tuuttttttttttttttttttsojjtkn|lkorttuuuuuuuuuuuuuuuuuuuv"C ""+j[{{{{{{{{{{{{{{{{{{{zvppinrtvxz{{{{{{{{{{{{{{{{{{{{{{L%X^" &/  %z~xsy~(1 !%/91f~:!?+./29?=B" /^js-f}DU[o103587<:?), 2V`m *Kc~xX?!PWi3  1337>D6; !#  '9@NHPiv q|GNh 6;L( ! +.9< 9?>D 7<$("       $' -1 7<:>6<?E@F4:5:494949 >D6;?????????(H `T   ",5>EKPRRPMG@8/% (7GV'v!M/pALQTRPK?.gAw[K<,  3G f*`Ff%x,~+(}!{xwwwxxxv r`C#I jN9&  6Q#MH!t60w kffghijklmnoqsvwwjF2X>' 2R+`a6:seeefghijklmnopqrstuwxyx\!?Z:!%C"G _=7 kdefgghijklmnopqrstuvxxy{|}|['M-1 [M2> idefghijkklmoopqrstuvwxzz|}~~D|c;  8(hhiijklmnoollC;mpuwxyz{|}~ 5XO(CMEyiijklmnnopqpknvzz|}}~~,3 AiO' >LEwjklmnnopqrssqjmw|}~|h ?cK"  5A}A{llmnopqqrstuvskny~& 2LB ++P4$nnopqrsstuvwwyvm tz} )8 !Y~8opqqrstuvvwxyz{xoz|%R ~ c*  9eGrrsttuvwxxyz{|}~{r[I '5`=}ttuvvwxyz{||}~}t";P%25  J4vvwxyyz{|}~~v+ W" )HDyxyz{{|}~~x5\L:O7  F({{|}~~{B  T  $Ct>}~}OnJ4D27}/\zG &=f2 t l% $V7FJ`3 1%l{B'P%: Y<_{/Dk +4{&  W.#L_-  &u&n4  , S;  3IA 8 D 9  F 9 Mj &E 6 T(!&W/B  0&gx7= ( -!!!!!!!!!!!JD !!!!!!!!!!!!!!!>6!3'(('('('('(('&,{0X##Qm%''('(('('('('(('?/ p4--------------+*1bj)(<+---------------.;fw' Qo~-44444444444444431/83.=/2444444444444444=/@Gz  '4O!<::::::::::::::::985<1269:::::::::::::::N S  )DAAAAAAAAAAAAAAAAA@?=9JO_=@AAAAAAAAAAAAAAAX 7 }DHHHHHHHHHHHHHHHHHHHGDHAEHHHHHHHHHHHHHHHJNr& BWh2OOOOOOOOOOOOOOOOOOOOMHIMOOOOOOOOOOOOOOO_026g -WVVVVVVVVVVVVVVVVVVVURZSSUVVVVVVVVVVVVVVVp8(qO]]]]]]]]]]]]]]]]]]]][UbUY\]]]]]]]]]]]]]]]eR do" (?+ededededeededededeedc`fyZ_bddedededeedededed(E$.`lllllllllllllllllllkicobdhjkllllllllllllllllqh"u$ & #,A2sssssssssssssssssssqmh`cnjnqrssssssssssssssssss+G'1rezzzzzzzzzzzzzzzzzyuqphloruwyzzzzzzzzzzzzzzzzzzzc"bj  ( ~~vvy~*2  ,5 8EVE>,.V "%*3odb"^f (/ ut%& #%-6 )ǁ}# 0  &)3=! .΋" 4*.3< .NJt! 3 $' 8A! (b  .  &) 7? !  utCel" -1 4;/5  14{ ;  36 ')?D'*  'MWcSl=FK` )  47 ,/ +.8>7<EKPRRPMG@8/% (7GV'v!M/pALQTRPK?.gAw[K<,  3G f*`Ff%x,~+(}!{xwwwxxxv r`C#I jN9&  6Q#MH!t60w kffghijklmnoqsvwwjF2X>' 2R+`a6:seeefghijklmnopqrstuwxyx\!?Z:!%C"G _=7 kdefgghijklmnopqrstuvxxy{|}|['M-1 [M2> idefghijkklmoopqrstuvwxzz|}~~D|c;  8(hhiijklmnoollC;mpuwxyz{|}~ 5XO(CMEyiijklmnnopqpknvzz|}}~~,3 AiO' >LEwjklmnnopqrssqjmw|}~|h ?cK"  5A}A{llmnopqqrstuvskny~& 2LB ++P4$nnopqrsstuvwwyvm tz} )8 !Y~8opqqrstuvvwxyz{xoz|%R ~ c*  9eGrrsttuvwxxyz{|}~{r[I '5`=}ttuvvwxyz{||}~}t";P%25  J4vvwxyyz{|}~~v+ W" )HDyxyz{{|}~~x5\L:O7  F({{|}~~{B  T  $Ct>}~}OnJ4D27}/\zG &=f2 t l% $V7FJ`3 1%l{B'P%: Y<_{/Dk +4{&  W.#L_-  &u&n4  , S;  3IA 8 D 9  F 9 Mj &E 6 T(!&W/B  0&gx7= ( -!!!!!!!!!!!JD !!!!!!!!!!!!!!!>6!3'(('('('('(('&,{0X##Qm%''('(('('('('(('?/ p4--------------+*1bj)(<+---------------.;fw' Qo~-44444444444444431/83.=/2444444444444444=/@Gz  '4O!<::::::::::::::::985<1269:::::::::::::::N S  )DAAAAAAAAAAAAAAAAA@?=9JO_=@AAAAAAAAAAAAAAAX 7 }DHHHHHHHHHHHHHHHHHHHGDHAEHHHHHHHHHHHHHHHJNr& BWh2OOOOOOOOOOOOOOOOOOOOMHIMOOOOOOOOOOOOOOO_026g -WVVVVVVVVVVVVVVVVVVVURZSSUVVVVVVVVVVVVVVVp8(qO]]]]]]]]]]]]]]]]]]]][UbUY\]]]]]]]]]]]]]]]eR do" (?+ededededeededededeedc`fyZ_bddedededeedededed(E$.`lllllllllllllllllllkicobdhjkllllllllllllllllqh"u$ & #,A2sssssssssssssssssssqmh`cnjnqrssssssssssssssssss+G'1rezzzzzzzzzzzzzzzzzyuqphloruwyzzzzzzzzzzzzzzzzzzzc"bj  ( ~~vvy~*2  ,5 8EVE>,.V "%*3odb"^f (/ ut%& #%-6 )ǁ}# 0  &)3=! .΋" 4*.3< .NJt! 3 $' 8A! (b  .  &) 7? !  utCel" -1 4;/5  14{ ;  36 ')?D'*  'MWcSl=FK` )  47 ,/ +.8>7<wmnopqrstuvwxujIx}B #35 (^+ ppqrstuvwxyz{xlWz. f' 9m8rrstuvwxyz{|}~zpc|? hH $=pCvtuvwxyz{|}}}tp~L/B1  H%vwxyz{|}}v}= T %L=yz{{|}~xmB[2  B&|}~{ : P @o9~x3C* -}#ny=(R/~% [ Gu0:J' $o%*P k2  .}'K > !D&  P*>c&6dDf{&r2AAAAAAAAAAAAAAA@?=8@AAAAAAAAAAAAAEYe  /=R.IIIIIIIIIIIIIIIIHHD^BGIIIIIIIIIIIIIS0 T !RQQQQQQQQQQQQQQQQPNHLPQQQQQQQQQQQQQi!.   jOYYYYYYYYYYYYYYYYYXTqhRWXYYYYYYYYYYYYYV^h :/aaaaaaaaaaaaaaaaa`^WV[_`aaaaaaaaaaaaav/B  ",diiiiiiiiiiiiiiiiihcg`behhiiiiiiiiiiiiiirz!! "+@=qqqqqqqqqqqqqqqqpokdjqglopqqqqqqqqqqqqqqq:E &0ynyyyyyyyyyyyyyyyxsrnhimpsvxyyyyyyyyyyyyyyyy|xmw$ ),}vwy}02 %. >L[WU25[ "%,5usw!go ! -5$$ )/ $Ɏ"+ "%*1"'(ɒ! . #&-5 (- #z) &),3 ,1|\mu! ),8?BMY]77;V !# &):@  $"dt~( ,/055: &,<5f  < !-0;@04 !5~_Eu~ 6#% 26:@-1 7>L {6]voV) u/2J ')367<+.  +0>@G\cnvlxp|p{lw clv=B[ &)=  %' 15 ,/ 6<4949(,-1     &) (,.2.2 7<??????(@ B!'*,-+(#  +9FR `%w3:81!xbUJ=/!  +@X@6 Qj x"z yyxwvr cN3q/\F1 2M EE#v/-~woighijlmos v wvkB.T9!/P/ih60mdefghiklmnopqrtuwyy`'KX7  "B)Xk=&{defghijklmnopqstuvwxy{|}d7L*-_ U=)}defghijklmnopqstuvwxz{|}~O f76$I#v?iefghijklmmoprstuvwxz{|}~q)A;<{:(~fghijklmnljilptvwxyz{|}/MG   =HFshijklmmopojoqpuxyz||~~| ;aI :MG pjklmnopprrqh0u{|}~}` AhG2EF qlmmnopqrsturh=w}d 8V@ (0[>wmnopqrstuvwxujIx}B #35 (^+ ppqrstuvwxyz{xlWz. f' 9m8rrstuvwxyz{|}~zpc|? hH $=pCvtuvwxyz{|}}}tp~L/B1  H%vwxyz{|}}v}= T %L=yz{{|}~xmB[2  B&|}~{ : P @o9~x3C* -}#ny=(R/~% [ Gu0:J' $o%*P k2  .}'K > !D&  P*>c&6dDf{&r2AAAAAAAAAAAAAAA@?=8@AAAAAAAAAAAAAEYe  /=R.IIIIIIIIIIIIIIIIHHD^BGIIIIIIIIIIIIIS0 T !RQQQQQQQQQQQQQQQQPNHLPQQQQQQQQQQQQQi!.   jOYYYYYYYYYYYYYYYYYXTqhRWXYYYYYYYYYYYYYV^h :/aaaaaaaaaaaaaaaaa`^WV[_`aaaaaaaaaaaaav/B  ",diiiiiiiiiiiiiiiiihcg`behhiiiiiiiiiiiiiirz!! "+@=qqqqqqqqqqqqqqqqpokdjqglopqqqqqqqqqqqqqqq:E &0ynyyyyyyyyyyyyyyyxsrnhimpsvxyyyyyyyyyyyyyyyy|xmw$ ),}vwy}02 %. >L[WU25[ "%,5usw!go ! -5$$ )/ $Ɏ"+ "%*1"'(ɒ! . #&-5 (- #z) &),3 ,1|\mu! ),8?BMY]77;V !# &):@  $"dt~( ,/055: &,<5f  < !-0;@04 !5~_Eu~ 6#% 26:@-1 7>L {6]voV) u/2J ')367<+.  +0>@G\cnvlxp|p{lw clv=B[ &)=  %' 15 ,/ 6<4949(,-1     &) (,.2.2 7<??????(0` %   &6F X"m*u)unYH:) %A2s4xWmuuuttr fO2l%vG* &R4u!i&zv kfgijlmoptvu]0aX-C7x+x'{hefhiklmoprsuwxz|n1_K  %5n"m-gfghjklnoqrtuwxz{}e s.  .5l3qfgijklllnrtuwxz{}~-N8 / G5kijklnon"|Bqwyz|}}=f;, L3jklnoprsppz}~0Cl8 !>v5mmopqrtuvrr~~6S-#Bo5qpqrsuvwyzv yN(t <'zstuvwyz{}~y#H N(uwxyz{}~}o Hh( J.yy{|}~%$ T S!}~2 On$ 4'M/ A  1Ss% (3vcCa""S0 4sA#5TRX 7Sjy+2k;P?z 5 ^_____________YmY^__________n} $(3EKjjjjjjjjjjjjjgebgijjjjjjjjjjlU!Hsttututttutttotnpstututtuttutt" (1K{w|~T 6" Pbnr}GMl%&{ )0*  #-5#)!  18 "  "% .5VblgMSi  $'&* +B--  $&16 ! 06ACz/ '*A')38 # 'Xbo@jf4TZm( *- *. *. #'  +5;LOWdS\oS\oNVd38L,  '* '*&+*/,0"&"%%(*.%(????(0` %   &6F X"m*u)unYH:) %A2s4xWmuuuttr fO2l%vG* &R4u!i&zv kfgijlmoptvu]0aX-C7x+x'{hefhiklmoprsuwxz|n1_K  %5n"m-gfghjklnoqrtuwxz{}e s.  .5l3qfgijklllnrtuwxz{}~-N8 / G5kijklnon"|Bqwyz|}}=f;, L3jklnoprsppz}~0Cl8 !>v5mmopqrtuvrr~~6S-#Bo5qpqrsuvwyzv yN(t <'zstuvwyz{}~y#H N(uwxyz{}~}o Hh( J.yy{|}~%$ T S!}~2 On$ 4'M/ A  1Ss% (3vcCa""S0 4sA#5TRX 7Sjy+2k;P?z 5 ^_____________YmY^__________n} $(3EKjjjjjjjjjjjjjgebgijjjjjjjjjjlU!Hsttututttutttotnpstututtuttutt" (1K{w|~T 6" Pbnr}GMl%&{ )0*  #-5#)!  18 "  "% .5VblgMSi  $'&* +B--  $&16 ! 06ACz/ '*A')38 # 'Xbo@jf4TZm( *- *. *. #'  +5;LOWdS\oS\oNVd38L,  '* '*&+*/,0"&"%%(*.%(????( @  2 H Y Y I4!F 0gThpq q qfN+\ K EIrnfhjlnqsvxtB L*T#t kgikloqsuxz}v$AEyhjlnmJ}vx{}=j%Jxlnoqsmy~Cn 4^~oqsuwyq}q.G@#suwy{}~w I_|y{}|}_!?~! HM~ 3 Lh {%\  " -,@p E';Q  !'U)=Q ](:SN "(U$3?$!!!  h X !!!!!!& C&......2qgr.......1 (  !=======<@FE=======2 iMMMMMMMMLNIMMMMMMUjx (4:N]]]]]]]]Z]\]]]]]]U !> *mmmmmmmmlfvjlmmmmmmr7 *48e}}}}}}|wsx|}}}}}}}}p $<!ew#_f~% (5!'/4 $) &lw~#dj| %)394`R (+5   %)7=7>t՘p5| /37  "" $(>D9CJLAHK;A9!# ??( @  2 H Y Y I4!F 0gThpq q qfN+\ K EIrnfhjlnqsvxtB L*T#t kgikloqsuxz}v$AEyhjlnmJ}vx{}=j%Jxlnoqsmy~Cn 4^~oqsuwyq}q.G@#suwy{}~w I_|y{}|}_!?~! HM~ 3 Lh {%\  " -,@p E';Q  !'U)=Q ](:SN "(U$3?$!!!  h X !!!!!!& C&......2qgr.......1 (  !=======<@FE=======2 iMMMMMMMMLNIMMMMMMUjx (4:N]]]]]]]]Z]\]]]]]]U !> *mmmmmmmmlfvjlmmmmmmr7 *48e}}}}}}|wsx|}}}}}}}}p $<!ew#_f~% (5!'/4 $) &lw~#dj| %)394`R (+5   %)7=7>t՘p5| /37  "" $(>D9CJLAHK;A9!# ??(0 `   5"Kw:{ C B7w Fx 8 GLl lhknquqG K 4fqgikmqtw{~}/VGrknp(u|~ XDt;mvpruw?z9Z )Buxz}@ oI a{}A h .BO) 5 =as";* items); void getResults(QList* id, QList* results); void launchItem(QList*, CatItem*); void doDialog(QWidget* parent, QWidget**); void endDialog(bool accept); void getLabels(QList* id); void init(); QString getIcon(); }; extern winshellPlugin* gwinshellInstance; #endiflaunchy-2.5/plugins/winshell/globals.h0000644000175000017500000000161510674645777017203 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GLOBALS_H #define GLOBALS_H #include struct winshellCmd { QString name; QString file; QString args; }; #endiflaunchy-2.5/plugins/winshell/winshell.pro0000644000175000017500000000114410674645777017753 0ustar monesmones TEMPLATE = lib CONFIG += plugin release VPATH += ../../src/ INCLUDEPATH += ../../src/ UI_DIR = ../../plugins/winshell/ FORMS = dlg.ui HEADERS = plugin_interface.h winshell.h gui.h globals.h SOURCES = plugin_interface.cpp winshell.cpp gui.cpp TARGET = winshell win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib % LIBS += user32.lib % LIBS += Gdi32.lib % LIBS += comctl32.lib } *:debug { DESTDIR = ../../debug/plugins/ } *:release { DESTDIR = ../../release/plugins/ %QMAKE_CXXFLAGS += /Ox /Ob2 /Oi /Oy /GT /GA /WX } launchy-2.5/plugins/winshell/dlg.ui0000644000175000017500000000742110675632350016475 0ustar monesmones Dlg 0 0 354 273 Form Qt::Horizontal 40 20 winshell - Launch custom commands Qt::Horizontal 40 20 3 Name Program Arguments Qt::Horizontal 40 20 + Qt::Horizontal 40 20 - Qt::Horizontal 40 20 Qt::Horizontal 40 20 Hint: Use $$ symbols to mark locations for user input Qt::Horizontal 40 20 launchy-2.5/plugins/winshell/winshell.cpp0000644000175000017500000001234410730553265017720 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #ifdef Q_WS_WIN #include #include #include #endif #include "winshell.h" #include "gui.h" winshellPlugin* gwinshellInstance = NULL; void winshellPlugin::init() { if (gwinshellInstance == NULL) gwinshellInstance = this; } void winshellPlugin::getID(uint* id) { *id = HASH_winshell; } void winshellPlugin::getName(QString* str) { *str = "Winshell"; } QString winshellPlugin::getIcon() { #ifdef Q_WS_WIN return qApp->applicationDirPath() + "/plugins/icons/winshell.ico"; #endif } void winshellPlugin::getLabels(QList* id) { QString & text = id->last().getText(); // Is it a file? if (!text.contains("\\") && !text.contains("/")) return; text = QDir::fromNativeSeparators(text); // Network searches are too slow if (text.startsWith("//")) return; QDir qd; QFile qf; // Has the user typed in a file or directory? if (qd.exists(text)) { id->last().setLabel(HASH_DIR); return; } if (qf.exists(text)) { id->last().setLabel(HASH_FILE); return; } QString path = id->last().getTopResult().fullPath; if (qd.exists(path)) { id->last().setLabel(HASH_DIR); return; } if (qf.exists(path)) { id->last().setLabel(HASH_FILE); return; } } void winshellPlugin::getResults(QList* id, QList* results) { if (id->count() == 2) { if (id->first().hasLabel(HASH_DIR) || id->first().hasLabel(HASH_FILE)) { results->push_back(CatItem("Open With", "Open With", HASH_winshell, getIcon())); results->push_back(CatItem("Copy to", "Copy to", HASH_winshell, getIcon())); results->push_back(CatItem("Move to", "Move to", HASH_winshell, getIcon())); } } if (id->count() == 3) { if (id->first().hasLabel(HASH_DIR) || id->first().hasLabel(HASH_FILE)) { CatItem* it = &((InputData)id->at(1)).getTopResult(); if (it->id == HASH_winshell) { if (id->last().hasLabel(HASH_DIR) || id->last().hasLabel(HASH_FILE)) { id->last().setID(HASH_winshell); } } } } } void CopyDir(QString f1, QString f2) { #ifdef Q_WS_WIN runProgram("utilities/winshell/copydir.bat", f1 + " " + f2); #endif } void CopyFile(QString f1, QString f2) { #ifdef Q_WS_WIN runProgram("utilities/winshell/copyfile.bat", f1 + " " + f2); #endif } void Move(QString f1, QString f2) { #ifdef Q_WS_WIN runProgram("utilities/winshell/move.bat", f1 + " " + f2); #endif } void winshellPlugin::launchItem(QList* id, CatItem* item) { item = item; // Compiler Warning QString file; QString args; if (id->count() != 3) return; CatItem* it = &((InputData)id->at(1)).getTopResult(); QString noun1 = id->first().getTopResult().fullPath; QString verb = it->shortName; QString noun2 = id->last().getTopResult().fullPath; if (verb == "Copy to") { if (!id->last().hasLabel(HASH_DIR)) return; if (id->first().hasLabel(HASH_DIR)) { CopyDir(noun1, noun2); } else { CopyFile(noun1, noun2); } } else if (verb == "Move to") { if (!id->last().hasLabel(HASH_DIR)) return; Move(noun1, noun2); } // runProgram("hi", ""); // runProgram(file, args); } void winshellPlugin::doDialog(QWidget* parent, QWidget** newDlg) { if (gui != NULL) return; gui = new Gui(parent); *newDlg = gui; } void winshellPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } if (gui != NULL) delete gui; gui = NULL; } int winshellPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog((bool) wParam); break; default: break; } return handled; } Q_EXPORT_PLUGIN2(winshell, winshellPlugin) launchy-2.5/plugins/runner/0000755000175000017500000000000011355776633015061 5ustar monesmoneslaunchy-2.5/plugins/runner/gui.cpp0000644000175000017500000001055111257666017016346 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "gui.h" #include "runner.h" #define ROW_PADDING 6 Gui::Gui(QWidget* parent) : QWidget(parent) { setupUi(this); QSettings* settings = *gRunnerInstance->settings; if (settings == NULL) return; // Stretch the centre column of the table table->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch); // column 1 // Read in the array of programs from options table->setSortingEnabled(false); table->setItemDelegateForColumn(1, &delegate); int count = settings->beginReadArray("runner/cmds"); table->setRowCount(count); for(int i = 0; i < count; ++i) { settings->setArrayIndex(i); table->setItem(i, 0, new QTableWidgetItem(settings->value("name").toString())); table->setItem(i, 1, new QTableWidgetItem(settings->value("file").toString())); table->setItem(i, 2, new QTableWidgetItem(settings->value("args").toString())); table->verticalHeader()->resizeSection(i, table->verticalHeader()->fontMetrics().height() + ROW_PADDING); } settings->endArray(); table->setSortingEnabled(true); connect(table, SIGNAL(dragEnter(QDragEnterEvent*)), this, SLOT(dragEnter(QDragEnterEvent*))); connect(table, SIGNAL(drop(QDropEvent*)), this, SLOT(drop(QDropEvent*))); connect(tableNew, SIGNAL(clicked(bool)), this, SLOT(newRow(void))); connect(tableRemove, SIGNAL(clicked(bool)), this, SLOT(remRow(void))); } void Gui::writeOptions() { QSettings* settings = *gRunnerInstance->settings; if (settings == NULL) return; settings->beginWriteArray("runner/cmds"); for(int i = 0; i < table->rowCount(); ++i) { if (table->item(i,0) == NULL || table->item(i,1) == NULL) continue; if (table->item(i,0)->text() == "" || table->item(i,1)->text() == "") continue; settings->setArrayIndex(i); settings->setValue("name", table->item(i, 0)->text()); settings->setValue("file", table->item(i, 1)->text()); if (table->item(i,2) == NULL) settings->setValue("args", ""); else settings->setValue("args", table->item(i, 2)->text()); } settings->endArray(); } void Gui::newRow() { bool sort = table->isSortingEnabled(); if (sort) table->setSortingEnabled(false); appendRow(QString(), QString(), QString()); table->setCurrentCell(table->rowCount()-1, 0); table->editItem(table->currentItem()); table->setSortingEnabled(sort); } void Gui::remRow() { int row = table->currentRow(); if (row != -1) { table->removeRow(row); if (row >= table->rowCount()) row = table->rowCount() - 1; table->setCurrentCell(row, table->currentColumn()); } } void Gui::dragEnter(QDragEnterEvent *event) { const QMimeData* mimeData = event->mimeData(); if (mimeData && mimeData->hasUrls()) event->acceptProposedAction(); } void Gui::drop(QDropEvent *event) { const QMimeData* mimeData = event->mimeData(); if (mimeData && mimeData->hasUrls()) { foreach(QUrl url, mimeData->urls()) { QFileInfo info(url.toLocalFile()); if(info.exists()) { table->setSortingEnabled(false); if (info.isSymLink()) { QFileInfo target(info.symLinkTarget()); appendRow(info.baseName(), QDir::toNativeSeparators(target.filePath()), ""); } else appendRow(info.baseName(), QDir::toNativeSeparators(info.filePath()), ""); table->setCurrentCell(table->rowCount()-1, 0); table->setSortingEnabled(true); } } } } void Gui::appendRow(const QString& name, const QString& file, const QString& args) { int row = table->rowCount(); table->insertRow(row); table->setItem(row, 0, new QTableWidgetItem(name)); table->setItem(row, 1, new QTableWidgetItem(file)); table->setItem(row, 2, new QTableWidgetItem(args)); table->verticalHeader()->resizeSection(row, table->verticalHeader()->fontMetrics().height() + ROW_PADDING); } launchy-2.5/plugins/runner/gui.h0000644000175000017500000000233511257666017016014 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GUI_H #define GUI_H #include "FileBrowserDelegate.h" #include "ui_dlg.h" #include "globals.h" class Gui : public QWidget, private Ui::Dlg { Q_OBJECT public: Gui(QWidget* parent); ~Gui() { this->hide(); } void writeOptions(); private slots: void newRow(); void remRow(); void dragEnter(QDragEnterEvent *event); void drop(QDropEvent *event); private: void appendRow(const QString& name, const QString& file, const QString& args); FileBrowserDelegate delegate; }; #endif launchy-2.5/plugins/runner/runner_full.ico0000644000175000017500000142516610673261500020107 0ustar monesmones000F 0 00hf 6(!00&$ vARhV` (&k`` v{PP gƤHH Tt@@ (B00 %  F  h!(0`??????(0`??????( @????????????( @????????????( @????( @????(0`ss9p;p;{9p{;p 9y󛛹9; y{;8p ?; ; ;{ ?;{{{{{ {?{ {{{p{{{x{p ??(0`ss9p;p;{9p{;p 9y󛛹9; y{;8p ?; ; ;{ ?;{{{{{ {?{ {{{p{{{x{p ??( @97pp9py?py?8p ?{9;{?{{{x{{ {??( @97pp9py?py?8p ?{9;{?{{{x{{ {??(0 w7pp{;p y;;󻛻p;pp?p (0 w7pp{;p y;;󻛻p;pp?p ( pp{{;p 0( pp{{;p 0(0` /lUuV~ZzXw^|^~ovp w#+,655>?VFLVACJJIYbmerztr{gvjJZjy   "!" #KK ,ZKKKKK;$)[ ͍KKKIIIKLLL(\KKKKKR:LNNN,\KKKKKK9@NNNNN$]KKKLKLJJLLLNJ#+,655>?VFLVACJJIYbmerztr{gvjJZjy   "!" #KK ,ZKKKKK;$)[ ͍KKKIIIKLLL(\KKKKKR:LNNN,\KKKKKK9@NNNNN$]KKKLKLJJLLLNJ ! 3,  %(:2 !,VDFdrJ\]q  . =<"..8=@ENSX]NMIMM]\ghp}qftslwMV\]jlmux|r|* $" ! CC%+ CCGG#- CCG6GNN(CGGCNNNP&XCGGN8:NPPe9)CCCC6@NG@Oeeeee'YCCCCGGG6@NPU ! 3,  %(:2 !,VDFdrJ\]q  . =<"..8=@ENSX]NMIMM]\ghp}qftslwMV\]jlmux|r|* $" ! CC%+ CCGG#- CCG6GNN(CGGCNNNP&XCGGN8:NPPe9)CCCC6@NG@Oeeeee'YCCCCGGG6@NPU ,,)e..= ,..*992,_&..(f99C4Z,,,,.`(885CCEE3,,..8.da9RȠCEEEKB.8.8889 ,,)e..= ,..*992,_&..(f99C4Z,,,,.`(885CCEE3,,..8.da9RȠCEEEKB.8.8889>>-,*HO3haf??@@5DDDP}LrFFGB7IIIKf~QTTTRWWWdyrUXXXX\kkkz~koooo[]vvtrwwwv[`rxxq_( I{S{lpj mnuqpvy} |vKonwxp )66Tj@P]g?66656ZUUTyh~{{tpUUvuttu   ^9c8 ^:#{'6bNiM'))"4;+//0$!')'g{/0>>>-,*HO3haf??@@5DDDP}LrFFGB7IIIKf~QTTTRWWWdyrUXXXX\kkkz~koooo[]vvtrwwwv[`rxxq_(      #'+.14689:::98530-)&!  !'-39>CHMQTWZ[\\[ZXVSOKFA<70+%  $,4<CKSZ`fk+#B)U-f-i-j5/w-i.i*Z&K9 nid]WPH@80)!  #,6?IS]e'|-^5N[ccg knqqqqq p nlkkaZG1p#D |jaXOE;1(   (2>IU` v-]F_dlu(|3=FA:2+)'&#~#$&& {x uspl[;"?xf[OD8-#   +6CP]s5p\cj&y=QG6)}unhggghhijjklllor uxz|z wtrmP%GvdXJ>1&  +8GU f.[Sdm7WQ7vhdefffgghiijjkkllmnnooppqtw x zxvukE/m]O@2%  (7FVo@e h0UU0 kddeeffgghhiijkkllmmnnopppqrrsttuvyyyxx`+Os_O?1#$3CTnGfmGb=rcddeeffgghhijjjkklmmnnoopqqrrsstuuvwwxyzzz{j/Ut^L<,  ,=O eEfpMd2fcddeffggghhijjkkllmmnooopqqrssstuuvwwxxyyz{|||}j *HnYF5&  $4FY4fgnRb.fddeefffghhiijjkkllmnnnoppqqrrsttuuvvwxxyyzz{|}}}~_ (dQ>, *;O(s\h?i2eddeefggghhiijkkkllmnnooppqqrrsttuuvvwxxyzzz{|}}~~} EzxZF3#   /BV;pj&ziG kdeefffgghhijjjkklmmmnooppqqrrsttuuvvwxxyyz{{||}~~m )bM8'  !3G bVlRbudeeffgghhiijjkkllmmnnoopqqrrrsttuuvvwxxyyz{{|}}~~6YlS>+ $6L5yhsjDfefffgghhiijjkklllllmmmnopqrssttuuvwwwxyyz{{||}~~ W |YB.  &9O9jl7m#zeffggghhijjkkkllmmllkkkklnoqstuuuvwwxxyyz{{||}~~t $]E0  ';RGpU_pgghhhiijkkkllmmnnonmljhghiloqtuvwxxxyzz{{||}~~~#2`G2 '<TR rbHhhhhiijjjkkllmmnnooonmjf'|pr%{hlpsvwxyyyz{{||}}~~,@aI2 ';V[tl=hhiiijjkkllmmnnnoppqpnkhtosvyyzz{{|}}}~~{zz{~8ScI2  $:T`vo/iijjkklllmnnoooppqrrrqokf[ntwz{{|}}~~}yFpk}Orrsssttuuvvwwwxxyyzz{{||}}~~}ysoqzz?cbA'  (BXk ztttuuvvwwwxxyyyz{{{|}}}~~{urr{~Q0=S6 61g\/tuuuvvwwwxxyyzz{{||}}}~~|vsr{~< pF+   *Eo)Zvvvwwxxxyyzz{{{||}}~~~xtt}qKbW9  70Pxgwwwxxyyzz{{{||}}~~~xuu}9 {H,   *Ey5Jxxyyzz{{|||}}}~zu |WuW9    64Tzezz{{{||}}~~~{w(6 |G* 'Cx4E{|||}}~~}y' VpT6   2)Akb|}}}~~~z405rB' #=i(N~~~ }@"CSO1  ,ORN5Ga;!   5HqZ} #%F* $?72J:#a{Q2  ,*WY#m f;!  3LvO ?)!%(D( !;1/ &^vM/  ' FK?pE Y6  -:YqU?N t="  3U>K %/4C'  9/(N(cxJ, #=?Qt&P1  ''OKb)`6  *>]pH_  r:  -Mr;%%%="  0]/!N"*>=<;9742343:E8;=>???????????????????????????e-V+ !! //FCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBAA@=:EF5V9=@ACCCCCCCCCCCCCCCCCCCCCCCCCCCCr6?$'vLGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGFFEC@<>BDFGGGGGGGGGGGGGGGGGGGGGGGGGGGPl7T\6 '4 F[bOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJIFBRcCFIJKKKKKKKKKKKKKKKKKKKKKKKKKKKjA&&&b- )  1:POOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONMKHDEHKMNOOOOOOOOOOOOOOOOOOOOOOOOOOO4B%'~USSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRPMI_JNPRSSSSSSSSSSSSSSSSSSSSSSSSSSS`v9]d5 )7 ;LUTWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVUSOJTMQTUVWWWWWWWWWWWWWWWWWWWWWWWWWWW}>!!!Z+ +" ,8[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZXUPkgORUWYZ[[[[[[[[[[[[[[[[[[[[[[[[[[[^ :;"#."Zs}____________________________________^]ZWQPTWY[]^^___________________________|c2;=q/ (4  2Mcccccccccccccccccccccccccccccccccccca`]XuWVY\^`abccccccccccccccccccccccccccccc2 B$!'(3$s"ggggggggggggggggggggggggggggggggggggfec_ZfY\_aceffggggggggggggggggggggggggggggg~|8OU1 %-: 9Ykkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkihe`[|[_beghijkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk,.F%",*5#u&ooooooooooooooooooooooooooooooooooonmkie`[_aehjlmnoooooooooooooooooooooooooooooooo8PV~1 $(0< 5]sssssssssssssssssssssssssssssssssrqpnkgc_\\ojehkmoqrrssssssssssssssssssssssssssssssssw+1 B$ "&$.*5!bz{vwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwutqojf|`__hhdegikmnqstuvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww} 4@Co.  %)0< *P{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zyvrmcfjmoqstuwxyz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{<9  "%$-)35BR v~}{wqjptxz{||}~~[ T( $(.8%$.}xxtz~ I1;NY(#$M' ), (,?I &+,4GS ,H% *- *-?I:B!'8L5=$ *- *.@H9A,;Z 8} 5! :> )->G8? $tz!.2UXl, 9= ),B03=DLS  $brn."")KNd, 368< *-5;DJ;A  /9"(mu4" @D25;@!JQ)- !3-~v%ow6$ 368;@F$OV,/,fuzXE""X^o1$  6:=A.1CI%QX,0%BLOUI 14K*!  8<AD26CI$QW+.  'S^])U|V"} ADU,$ 8;AE37>DLR@E  &07?cpx*E\t~hQ7 _gr!"=)# '*KO=A 036;CIQW*-   &*IRO cnwnz տ  ϼ lvbjt7C>EGO OV T\Ya[c CI+/+/+/*.*.*.)- AFW^T[ OU HO@F??????????????(      #'+.14689:::98530-)&!  !'-39>CHMQTWZ[\\[ZXVSOKFA<70+%  $,4<CKSZ`fk+#B)U-f-i-j5/w-i.i*Z&K9 nid]WPH@80)!  #,6?IS]e'|-^5N[ccg knqqqqq p nlkkaZG1p#D |jaXOE;1(   (2>IU` v-]F_dlu(|3=FA:2+)'&#~#$&& {x uspl[;"?xf[OD8-#   +6CP]s5p\cj&y=QG6)}unhggghhijjklllor uxz|z wtrmP%GvdXJ>1&  +8GU f.[Sdm7WQ7vhdefffgghiijjkkllmnnooppqtw x zxvukE/m]O@2%  (7FVo@e h0UU0 kddeeffgghhiijkkllmmnnopppqrrsttuvyyyxx`+Os_O?1#$3CTnGfmGb=rcddeeffgghhijjjkklmmnnoopqqrrsstuuvwwxyzzz{j/Ut^L<,  ,=O eEfpMd2fcddeffggghhijjkkllmmnooopqqrssstuuvwwxxyyz{|||}j *HnYF5&  $4FY4fgnRb.fddeefffghhiijjkkllmnnnoppqqrrsttuuvvwxxyyzz{|}}}~_ (dQ>, *;O(s\h?i2eddeefggghhiijkkkllmnnooppqqrrsttuuvvwxxyzzz{|}}~~} EzxZF3#   /BV;pj&ziG kdeefffgghhijjjkklmmmnooppqqrrsttuuvvwxxyyz{{||}~~m )bM8'  !3G bVlRbudeeffgghhiijjkkllmmnnoopqqrrrsttuuvvwxxyyz{{|}}~~6YlS>+ $6L5yhsjDfefffgghhiijjkklllllmmmnopqrssttuuvwwwxyyz{{||}~~ W |YB.  &9O9jl7m#zeffggghhijjkkkllmmllkkkklnoqstuuuvwwxxyyz{{||}~~t $]E0  ';RGpU_pgghhhiijkkkllmmnnonmljhghiloqtuvwxxxyzz{{||}~~~#2`G2 '<TR rbHhhhhiijjjkkllmmnnooonmjf'|pr%{hlpsvwxyyyz{{||}}~~,@aI2 ';V[tl=hhiiijjkkllmmnnnoppqpnkhtosvyyzz{{|}}}~~{zz{~8ScI2  $:T`vo/iijjkklllmnnoooppqrrrqokf[ntwz{{|}}~~}yFpk}Orrsssttuuvvwwwxxyyzz{{||}}~~}ysoqzz?cbA'  (BXk ztttuuvvwwwxxyyyz{{{|}}}~~{urr{~Q0=S6 61g\/tuuuvvwwwxxyyzz{{||}}}~~|vsr{~< pF+   *Eo)Zvvvwwxxxyyzz{{{||}}~~~xtt}qKbW9  70Pxgwwwxxyyzz{{{||}}~~~xuu}9 {H,   *Ey5Jxxyyzz{{|||}}}~zu |WuW9    64Tzezz{{{||}}~~~{w(6 |G* 'Cx4E{|||}}~~}y' VpT6   2)Akb|}}}~~~z405rB' #=i(N~~~ }@"CSO1  ,ORN5Ga;!   5HqZ} #%F* $?72J:#a{Q2  ,*WY#m f;!  3LvO ?)!%(D( !;1/ &^vM/  ' FK?pE Y6  -:YqU?N t="  3U>K %/4C'  9/(N(cxJ, #=?Qt&P1  ''OKb)`6  *>]pH_  r:  -Mr;%%%="  0]/!N"*>=<;9742343:E8;=>???????????????????????????e-V+ !! //FCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBAA@=:EF5V9=@ACCCCCCCCCCCCCCCCCCCCCCCCCCCCr6?$'vLGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGFFEC@<>BDFGGGGGGGGGGGGGGGGGGGGGGGGGGGPl7T\6 '4 F[bOKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJIFBRcCFIJKKKKKKKKKKKKKKKKKKKKKKKKKKKjA&&&b- )  1:POOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONMKHDEHKMNOOOOOOOOOOOOOOOOOOOOOOOOOOO4B%'~USSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRPMI_JNPRSSSSSSSSSSSSSSSSSSSSSSSSSSS`v9]d5 )7 ;LUTWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVUSOJTMQTUVWWWWWWWWWWWWWWWWWWWWWWWWWWW}>!!!Z+ +" ,8[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZXUPkgORUWYZ[[[[[[[[[[[[[[[[[[[[[[[[[[[^ :;"#."Zs}____________________________________^]ZWQPTWY[]^^___________________________|c2;=q/ (4  2Mcccccccccccccccccccccccccccccccccccca`]XuWVY\^`abccccccccccccccccccccccccccccc2 B$!'(3$s"ggggggggggggggggggggggggggggggggggggfec_ZfY\_aceffggggggggggggggggggggggggggggg~|8OU1 %-: 9Ykkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkihe`[|[_beghijkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk,.F%",*5#u&ooooooooooooooooooooooooooooooooooonmkie`[_aehjlmnoooooooooooooooooooooooooooooooo8PV~1 $(0< 5]sssssssssssssssssssssssssssssssssrqpnkgc_\\ojehkmoqrrssssssssssssssssssssssssssssssssw+1 B$ "&$.*5!bz{vwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwutqojf|`__hhdegikmnqstuvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww} 4@Co.  %)0< *P{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zyvrmcfjmoqstuwxyz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{<9  "%$-)35BR v~}{wqjptxz{||}~~[ T( $(.8%$.}xxtz~ I1;NY(#$M' ), (,?I &+,4GS ,H% *- *-?I:B!'8L5=$ *- *.@H9A,;Z 8} 5! :> )->G8? $tz!.2UXl, 9= ),B03=DLS  $brn."")KNd, 368< *-5;DJ;A  /9"(mu4" @D25;@!JQ)- !3-~v%ow6$ 368;@F$OV,/,fuzXE""X^o1$  6:=A.1CI%QX,0%BLOUI 14K*!  8<AD26CI$QW+.  'S^])U|V"} ADU,$ 8;AE37>DLR@E  &07?cpx*E\t~hQ7 _gr!"=)# '*KO=A 036;CIQW*-   &*IRO cnwnz տ  ϼ lvbjt7C>EGO OV T\Ya[c CI+/+/+/*.*.*.)- AFW^T[ OU HO@F??????????????(`   "#$%$"    '.4:?CGIJJIHDA<60*#  &0:DNV^g*<"M!O&\#V"O F6iaZRH>4*!  &3@N\"v%S;J_ kpsvxwwvt r ph]H8y= xaSF8+   ,;K `=<Wh$y3:6,"zwsqrr rtvxyzy wriU5p$eRA2#  ->Q%s8~Ws=C5v lgefgghijjklmmnoqsv x xwqW.[ vZF4$ +?U COp8J2lddeffghhijkklmnnoppqrsttwxyxqF"^H3!  $8O@RqGCsfdeefgghijjkllmnnopqrrstuvvwxyz{{tI YA, -E kIrLDpddeefgghiijkllmnoopqrrstuuvwxxyz{||}~u>r pO6!!7R6q k@Kmddeffgghijjkllmnoopqqrstuuvwxyyz{|}}~l%@]A* %>gS*~T%zfeffgghijjkklmmnoppqrrstuvvwxyzz{|}~ Dx nI/ )C#BdGCieffgghiijkklllmmnpqrrstuuvwxxyz{|}}~bO4  -J:rwX'}ffgghiijkkllmmlkjklnqsuuvwwxyyz{|}~~~ %:W8 -NE$~Usghhiijkkllmnnomkhqwlkptvwxxyz{{|}~~ 0LZ9  -LN0Tlhhijjkllmmnoppomi?ntwyyz{||}~~{{} :\Y9 , OT8Ikijkkllmnnoppqrrqmglty{{|}~~}?b[8  'IN2Hlkkllmnnoopqqrsstrnfktz|}~x;ZW3  "?F)Pmllmmnooppqrssttuvsogku|~|42.DN- 91YTqmnnoopqqrrsttuvvwxvphqv}| %H( 04k wZ vnooppqrrsstuuvwwxyzwrivw~}W zq>  % MiQ~opqqqrsstuuvvwxxyzz{ytj|y \[3 ;N77qrrsttuuvvwxxyzz{||}~{vm!z~x~8NJ(.!8kOtsstuuvvwwxyyz{{|}}~}wq){ r<    EhRtuuvvwwxyyzz{||}~~~ys2|[T-2;g(:vvwxxyyzz{{|}}~{u;~3%0A   ! KxTzwxyyz{{{|}}~|vEzpY./@m.0yzz{{|}}~~~wQK)5>  AN~{||}~~y_utR+ +7X}(2}}~~{kS "}: 9kJ  x \{J$  "+[? [< e0 -L}6  4@<8zF P_lI#  ,W6-[  `, %@e)<e *24 -`8 M_= 4=wm ~E!  > 0DI;P' *?[$ c+ ";Wy"t0  %S|* U` 9E4(j/ &!P^7 )r1 !]m9 +w2   dw: +y2 >  h{; *{2   !j}: ){0 77C8}'%#!hz8  'y. +x~1+!#et6 %u+  r[^>3%]h3   !e&%  $@ \$ =&LW/  E_{-%%%%%%%%%%%%%%%%%$"[3 K&!!6!#%%%%%%%%%%%%%%%%%%%%%E#+-s+ "8L^4*****************)(&&b("%&$h&()********************L`& = 9..................-,+)/k<=))2<*-....................0ML  ,;3333333333333333333321/.1s-.-g/0233333333333333333333=?&< $4988888888888888888888776423tS01025888888888888888888888M+(r3_%@======================<;:96<233OU8;=====================]$IP*&/>XGBBBBBBBBBBBBBBBBBBBBBBBAA@>;?}8`9=@BBBBBBBBBBBBBBBBBBBBB_Z!  " .DGGGGGGGGGGGGGGGGGGGGGGGGGGFC??DFGGGGGGGGGGGGGGGGGGGGQK$=  !w5MMMLMLMMLMMLMMLMMLMMLMMMLMLJGFyFJLMMLMMLMMLMMLMMLMMLMMl")al. 8I\SRRRRRRRRRRRRRRRRRRRRRRRRRRPNIVMPQRRRRRRRRRRRRRRRRRRRTt'*_# ". .RWWWWWWWWWWWWWWWWWWWWWWWWWWWUQUOQUVWWWWWWWWWWWWWWWWWWWWgL%: d3]]\]\]]\]]\]]\]]\]]\]]]\]]\[XR\SWY[\\]]\]]\]]\]]\]]\]]\]*LR})%07^bbbbbbbbbbbbbbbbbbbbbbbbbba_[clVZ]_abbbbbbbbbbbbbbbbbbbbbkn B !+ {Fgggggggggggggggggggggggggggfc]tZ^bdfggggggggggggggggggggggg-*do*)4$-Djlmlmmlmmlmmlmmlmmlmmmlmmlmlie_dbehjllmlmmlmmlmmlmmlmmlmmlmmv}J  &0 |Mrrrrrrrrrrrrrrrrrrrrrrrrrqomhc]hseimoqqrrrrrrrrrrrrrrrrrrrrrrrs0+cl+!+67rwwwwwwwwwwwwwwwwwwwwwwwwurmpaaifhjlortvwwwwwwwwwwwwwwwwwwwwwwwwww{" @%/ [qwA||}}|}}|}}|}}|}}|}}}|}|{xrolquwxz{|||}}|}}|}}|}}|}}|}}|}}|}}|''DHo% #'0:$hzvry~[,0 !+3&/C|~#H #'-6 Wkr5'$CHk$ &* 1: !R9-ls, !#  9C %]G,0  $'-6 *2 6hO% = ),3< .6 '@zX"D -15? ,3!(= wO!@ ), 7@!'? tB#B ), :C29 6v4( : )- 8A18 $`$(u~, 37 8?29\kpAuKPi&04 3;@G )0@>"A*,03AI%(XfkIݪjGLd& 69 ),9?7<  1dv)"y 4&(47BH.2(.?]l)} ?   25 *-49GM,/ 1r9}Cgo~ 3  8;148>DJ25 'AJW0es>8  &6=Qt '7Pk|cA-lu 25N(+-7:37:?BH/3  "2GP\S\v |SZsEKZ 2% "$59:> 9>AGDJ +/    +. 6:=A:>8> BI DJ;A AG DJ.1 # # " "" 59 @E <@ ;@ DI 9=??????????(`   "#$%$"    '.4:?CGIJJIHDA<60*#  &0:DNV^g*<"M!O&\#V"O F6iaZRH>4*!  &3@N\"v%S;J_ kpsvxwwvt r ph]H8y= xaSF8+   ,;K `=<Wh$y3:6,"zwsqrr rtvxyzy wriU5p$eRA2#  ->Q%s8~Ws=C5v lgefgghijjklmmnoqsv x xwqW.[ vZF4$ +?U COp8J2lddeffghhijkklmnnoppqrsttwxyxqF"^H3!  $8O@RqGCsfdeefgghijjkllmnnopqrrstuvvwxyz{{tI YA, -E kIrLDpddeefgghiijkllmnoopqrrstuuvwxxyz{||}~u>r pO6!!7R6q k@Kmddeffgghijjkllmnoopqqrstuuvwxyyz{|}}~l%@]A* %>gS*~T%zfeffgghijjkklmmnoppqrrstuvvwxyzz{|}~ Dx nI/ )C#BdGCieffgghiijkklllmmnpqrrstuuvwxxyz{|}}~bO4  -J:rwX'}ffgghiijkkllmmlkjklnqsuuvwwxyyz{|}~~~ %:W8 -NE$~Usghhiijkkllmnnomkhqwlkptvwxxyz{{|}~~ 0LZ9  -LN0Tlhhijjkllmmnoppomi?ntwyyz{||}~~{{} :\Y9 , OT8Ikijkkllmnnoppqrrqmglty{{|}~~}?b[8  'IN2Hlkkllmnnoopqqrsstrnfktz|}~x;ZW3  "?F)Pmllmmnooppqrssttuvsogku|~|42.DN- 91YTqmnnoopqqrrsttuvvwxvphqv}| %H( 04k wZ vnooppqrrsstuuvwwxyzwrivw~}W zq>  % MiQ~opqqqrsstuuvvwxxyzz{ytj|y \[3 ;N77qrrsttuuvvwxxyzz{||}~{vm!z~x~8NJ(.!8kOtsstuuvvwwxyyz{{|}}~}wq){ r<    EhRtuuvvwwxyyzz{||}~~~ys2|[T-2;g(:vvwxxyyzz{{|}}~{u;~3%0A   ! KxTzwxyyz{{{|}}~|vEzpY./@m.0yzz{{|}}~~~wQK)5>  AN~{||}~~y_utR+ +7X}(2}}~~{kS "}: 9kJ  x \{J$  "+[? [< e0 -L}6  4@<8zF P_lI#  ,W6-[  `, %@e)<e *24 -`8 M_= 4=wm ~E!  > 0DI;P' *?[$ c+ ";Wy"t0  %S|* U` 9E4(j/ &!P^7 )r1 !]m9 +w2   dw: +y2 >  h{; *{2   !j}: ){0 77C8}'%#!hz8  'y. +x~1+!#et6 %u+  r[^>3%]h3   !e&%  $@ \$ =&LW/  E_{-%%%%%%%%%%%%%%%%%$"[3 K&!!6!#%%%%%%%%%%%%%%%%%%%%%E#+-s+ "8L^4*****************)(&&b("%&$h&()********************L`& = 9..................-,+)/k<=))2<*-....................0ML  ,;3333333333333333333321/.1s-.-g/0233333333333333333333=?&< $4988888888888888888888776423tS01025888888888888888888888M+(r3_%@======================<;:96<233OU8;=====================]$IP*&/>XGBBBBBBBBBBBBBBBBBBBBBBBAA@>;?}8`9=@BBBBBBBBBBBBBBBBBBBBB_Z!  " .DGGGGGGGGGGGGGGGGGGGGGGGGGGFC??DFGGGGGGGGGGGGGGGGGGGGQK$=  !w5MMMLMLMMLMMLMMLMMLMMLMMMLMLJGFyFJLMMLMMLMMLMMLMMLMMLMMl")al. 8I\SRRRRRRRRRRRRRRRRRRRRRRRRRRPNIVMPQRRRRRRRRRRRRRRRRRRRTt'*_# ". .RWWWWWWWWWWWWWWWWWWWWWWWWWWWUQUOQUVWWWWWWWWWWWWWWWWWWWWgL%: d3]]\]\]]\]]\]]\]]\]]\]]]\]]\[XR\SWY[\\]]\]]\]]\]]\]]\]]\]*LR})%07^bbbbbbbbbbbbbbbbbbbbbbbbbba_[clVZ]_abbbbbbbbbbbbbbbbbbbbbkn B !+ {Fgggggggggggggggggggggggggggfc]tZ^bdfggggggggggggggggggggggg-*do*)4$-Djlmlmmlmmlmmlmmlmmlmmmlmmlmlie_dbehjllmlmmlmmlmmlmmlmmlmmlmmv}J  &0 |Mrrrrrrrrrrrrrrrrrrrrrrrrrqomhc]hseimoqqrrrrrrrrrrrrrrrrrrrrrrrs0+cl+!+67rwwwwwwwwwwwwwwwwwwwwwwwwurmpaaifhjlortvwwwwwwwwwwwwwwwwwwwwwwwwww{" @%/ [qwA||}}|}}|}}|}}|}}|}}}|}|{xrolquwxz{|||}}|}}|}}|}}|}}|}}|}}|}}|''DHo% #'0:$hzvry~[,0 !+3&/C|~#H #'-6 Wkr5'$CHk$ &* 1: !R9-ls, !#  9C %]G,0  $'-6 *2 6hO% = ),3< .6 '@zX"D -15? ,3!(= wO!@ ), 7@!'? tB#B ), :C29 6v4( : )- 8A18 $`$(u~, 37 8?29\kpAuKPi&04 3;@G )0@>"A*,03AI%(XfkIݪjGLd& 69 ),9?7<  1dv)"y 4&(47BH.2(.?]l)} ?   25 *-49GM,/ 1r9}Cgo~ 3  8;148>DJ25 'AJW0es>8  &6=Qt '7Pk|cA-lu 25N(+-7:37:?BH/3  "2GP\S\v |SZsEKZ 2% "$59:> 9>AGDJ +/    +. 6:=A:>8> BI DJ;A AG DJ.1 # # " "" 59 @E <@ ;@ DI 9=??????????(P g  ")/49<==<:61+$ ".:EPYd(|:AKGA4 }f\SI>2&  !0@Qh"J;K bpvx zyywus m_J6v5 lWF5& &8Mm0nSq,}40'|up mklmnp r twx wvkO(RqT?,%:S#LMr98!x keffghijkllmnopqruwxwlI0[B+ 4P'TZ0B&zhdeffghijkllmnopqrstuvwxyzwV3Y=%(D8{W5Gtddefgghijkllmnopqrstuvwxxyz||}{R}N1  3WD#zLtdeefghiijklmnoopqrstuvvwyyz{|}~z8e`=" ;0s bF3fefgghijkklmnopqqrstuvwxyy{||}~[wF(#B1cvMqffghhijkllmlllnprstuvwwxz{{|}~t#9N,$FA3@jgghijjklmnnmjgginruvwxyz{|}} 0NR. #EK?2hhijjklmmnopol,yqvyyz{|}~|{~ ;_S. !EPE(ijkklmnnopqrrqk{pw{|}}~| @fS, @JA&kklmmnopqqrsttrlpy}~|Y :YM' 7=t7/lmmnoppqrsstuvwtmq{ +@E   -'Gx&:nnoppqrsstuvvwxywor|}wd  |: !SwJqppqrsstuvvwxyyz{yqs~ t_. :\L xrrsttuvwwxyzz{|}~{su~^NrI! */S~2%stuuvvwxxyz{||}~}uv.&8  G vHuuvwxxyzz{|}}~ww]tU& ,EzCwxyyz{{|}}~yzM2C;  I;yzz{||}~{ [W%  )Ev? ||}~~}d3C7  ?};~~ XzM   -Jr0(i#v. -b= Up=  @+nfO 0Km-OR # q*  %X7)uGY4.z2 t= 6"`zDH 0P [! 2Jn'# m& Ms-pi 7B* \.#IU- !b. = Ra/ !e. M Wf/ !f/E $Xh/ f.o/x(Vd- d-mvOB#'Q\* Z~* P @->,"EN& :g:f;?AAAAAAAAAAAAAAAAAV"48n  9JHHHHHHHHHHHHHHHHHHHHHGDA[CGHHHHHHHHHHHHHHHHHb D!INNNNNNNNNNNNNNNNNNNNNNLHyHKNNNNNNNNNNNNNNNNNSQ"/%Qjx4UUUUUTTTTTTTTTTTTTTTTTTPNkOSTUUUUUUUUUUUUUUUUk,?Es  5Z[[[[[[[[[[[[[[[[[[[[[[XSSUXZ[[[[[[[[[[[[[[[[\s ?)wNaaaaaaaaaaaaaaaaaaaaaa`\Y]X\_aaaaaaaaaaaaaaaaaapJ$fq& ", #-C%ghhhhhhhhhhhhhhhhhhhhhge`mk]befhhhhhhhhhhhhhhhhhhh I#-\nnnnnnnnnnnnnnnnnnnnnnlhauafjlnnnnnnnnnnnnnnnnnnnn}X%nz' &0 &=&tuuttttttttttttttttttsojjtkn|lkorttuuuuuuuuuuuuuuuuuuuv"C ""+j[{{{{{{{{{{{{{{{{{{{zvppinrtvxz{{{{{{{{{{{{{{{{{{{{{{L%X^" &/  %z~xsy~(1 !%/91f~:!?+./29?=B" /^js-f}DU[o103587<:?), 2V`m *Kc~xX?!PWi3  1337>D6; !#  '9@NHPiv q|GNh 6;L( ! +.9< 9?>D 7<$("       $' -1 7<:>6<?E@F4:5:494949 >D6;?????????(P g  ")/49<==<:61+$ ".:EPYd(|:AKGA4 }f\SI>2&  !0@Qh"J;K bpvx zyywus m_J6v5 lWF5& &8Mm0nSq,}40'|up mklmnp r twx wvkO(RqT?,%:S#LMr98!x keffghijkllmnopqruwxwlI0[B+ 4P'TZ0B&zhdeffghijkllmnopqrstuvwxyzwV3Y=%(D8{W5Gtddefgghijkllmnopqrstuvwxxyz||}{R}N1  3WD#zLtdeefghiijklmnoopqrstuvvwyyz{|}~z8e`=" ;0s bF3fefgghijkklmnopqqrstuvwxyy{||}~[wF(#B1cvMqffghhijkllmlllnprstuvwwxz{{|}~t#9N,$FA3@jgghijjklmnnmjgginruvwxyz{|}} 0NR. #EK?2hhijjklmmnopol,yqvyyz{|}~|{~ ;_S. !EPE(ijkklmnnopqrrqk{pw{|}}~| @fS, @JA&kklmmnopqqrsttrlpy}~|Y :YM' 7=t7/lmmnoppqrsstuvwtmq{ +@E   -'Gx&:nnoppqrsstuvvwxywor|}wd  |: !SwJqppqrsstuvvwxyyz{yqs~ t_. :\L xrrsttuvwwxyzz{|}~{su~^NrI! */S~2%stuuvvwxxyz{||}~}uv.&8  G vHuuvwxxyzz{|}}~ww]tU& ,EzCwxyyz{{|}}~yzM2C;  I;yzz{||}~{ [W%  )Ev? ||}~~}d3C7  ?};~~ XzM   -Jr0(i#v. -b= Up=  @+nfO 0Km-OR # q*  %X7)uGY4.z2 t= 6"`zDH 0P [! 2Jn'# m& Ms-pi 7B* \.#IU- !b. = Ra/ !e. M Wf/ !f/E $Xh/ f.o/x(Vd- d-mvOB#'Q\* Z~* P @->,"EN& :g:f;?AAAAAAAAAAAAAAAAAV"48n  9JHHHHHHHHHHHHHHHHHHHHHGDA[CGHHHHHHHHHHHHHHHHHb D!INNNNNNNNNNNNNNNNNNNNNNLHyHKNNNNNNNNNNNNNNNNNSQ"/%Qjx4UUUUUTTTTTTTTTTTTTTTTTTPNkOSTUUUUUUUUUUUUUUUUk,?Es  5Z[[[[[[[[[[[[[[[[[[[[[[XSSUXZ[[[[[[[[[[[[[[[[\s ?)wNaaaaaaaaaaaaaaaaaaaaaa`\Y]X\_aaaaaaaaaaaaaaaaaapJ$fq& ", #-C%ghhhhhhhhhhhhhhhhhhhhhge`mk]befhhhhhhhhhhhhhhhhhhh I#-\nnnnnnnnnnnnnnnnnnnnnnlhauafjlnnnnnnnnnnnnnnnnnnnn}X%nz' &0 &=&tuuttttttttttttttttttsojjtkn|lkorttuuuuuuuuuuuuuuuuuuuv"C ""+j[{{{{{{{{{{{{{{{{{{{zvppinrtvxz{{{{{{{{{{{{{{{{{{{{{{L%X^" &/  %z~xsy~(1 !%/91f~:!?+./29?=B" /^js-f}DU[o103587<:?), 2V`m *Kc~xX?!PWi3  1337>D6; !#  '9@NHPiv q|GNh 6;L( ! +.9< 9?>D 7<$("       $' -1 7<:>6<?E@F4:5:494949 >D6;?????????(H `T   ",5>EKPRRPMG@8/% (7GV'v!M/pALQTRPK?.gAw[K<,  3G f*`Ff%x,~+(}!{xwwwxxxv r`C#I jN9&  6Q#MH!t60w kffghijklmnoqsvwwjF2X>' 2R+`a6:seeefghijklmnopqrstuwxyx\!?Z:!%C"G _=7 kdefgghijklmnopqrstuvxxy{|}|['M-1 [M2> idefghijkklmoopqrstuvwxzz|}~~D|c;  8(hhiijklmnoollC;mpuwxyz{|}~ 5XO(CMEyiijklmnnopqpknvzz|}}~~,3 AiO' >LEwjklmnnopqrssqjmw|}~|h ?cK"  5A}A{llmnopqqrstuvskny~& 2LB ++P4$nnopqrsstuvwwyvm tz} )8 !Y~8opqqrstuvvwxyz{xoz|%R ~ c*  9eGrrsttuvwxxyz{|}~{r[I '5`=}ttuvvwxyz{||}~}t";P%25  J4vvwxyyz{|}~~v+ W" )HDyxyz{{|}~~x5\L:O7  F({{|}~~{B  T  $Ct>}~}OnJ4D27}/\zG &=f2 t l% $V7FJ`3 1%l{B'P%: Y<_{/Dk +4{&  W.#L_-  &u&n4  , S;  3IA 8 D 9  F 9 Mj &E 6 T(!&W/B  0&gx7= ( -!!!!!!!!!!!JD !!!!!!!!!!!!!!!>6!3'(('('('('(('&,{0X##Qm%''('(('('('('(('?/ p4--------------+*1bj)(<+---------------.;fw' Qo~-44444444444444431/83.=/2444444444444444=/@Gz  '4O!<::::::::::::::::985<1269:::::::::::::::N S  )DAAAAAAAAAAAAAAAAA@?=9JO_=@AAAAAAAAAAAAAAAX 7 }DHHHHHHHHHHHHHHHHHHHGDHAEHHHHHHHHHHHHHHHJNr& BWh2OOOOOOOOOOOOOOOOOOOOMHIMOOOOOOOOOOOOOOO_026g -WVVVVVVVVVVVVVVVVVVVURZSSUVVVVVVVVVVVVVVVp8(qO]]]]]]]]]]]]]]]]]]]][UbUY\]]]]]]]]]]]]]]]eR do" (?+ededededeededededeedc`fyZ_bddedededeedededed(E$.`lllllllllllllllllllkicobdhjkllllllllllllllllqh"u$ & #,A2sssssssssssssssssssqmh`cnjnqrssssssssssssssssss+G'1rezzzzzzzzzzzzzzzzzyuqphloruwyzzzzzzzzzzzzzzzzzzzc"bj  ( ~~vvy~*2  ,5 8EVE>,.V "%*3odb"^f (/ ut%& #%-6 )ǁ}# 0  &)3=! .΋" 4*.3< .NJt! 3 $' 8A! (b  .  &) 7? !  utCel" -1 4;/5  14{ ;  36 ')?D'*  'MWcSl=FK` )  47 ,/ +.8>7<EKPRRPMG@8/% (7GV'v!M/pALQTRPK?.gAw[K<,  3G f*`Ff%x,~+(}!{xwwwxxxv r`C#I jN9&  6Q#MH!t60w kffghijklmnoqsvwwjF2X>' 2R+`a6:seeefghijklmnopqrstuwxyx\!?Z:!%C"G _=7 kdefgghijklmnopqrstuvxxy{|}|['M-1 [M2> idefghijkklmoopqrstuvwxzz|}~~D|c;  8(hhiijklmnoollC;mpuwxyz{|}~ 5XO(CMEyiijklmnnopqpknvzz|}}~~,3 AiO' >LEwjklmnnopqrssqjmw|}~|h ?cK"  5A}A{llmnopqqrstuvskny~& 2LB ++P4$nnopqrsstuvwwyvm tz} )8 !Y~8opqqrstuvvwxyz{xoz|%R ~ c*  9eGrrsttuvwxxyz{|}~{r[I '5`=}ttuvvwxyz{||}~}t";P%25  J4vvwxyyz{|}~~v+ W" )HDyxyz{{|}~~x5\L:O7  F({{|}~~{B  T  $Ct>}~}OnJ4D27}/\zG &=f2 t l% $V7FJ`3 1%l{B'P%: Y<_{/Dk +4{&  W.#L_-  &u&n4  , S;  3IA 8 D 9  F 9 Mj &E 6 T(!&W/B  0&gx7= ( -!!!!!!!!!!!JD !!!!!!!!!!!!!!!>6!3'(('('('('(('&,{0X##Qm%''('(('('('('(('?/ p4--------------+*1bj)(<+---------------.;fw' Qo~-44444444444444431/83.=/2444444444444444=/@Gz  '4O!<::::::::::::::::985<1269:::::::::::::::N S  )DAAAAAAAAAAAAAAAAA@?=9JO_=@AAAAAAAAAAAAAAAX 7 }DHHHHHHHHHHHHHHHHHHHGDHAEHHHHHHHHHHHHHHHJNr& BWh2OOOOOOOOOOOOOOOOOOOOMHIMOOOOOOOOOOOOOOO_026g -WVVVVVVVVVVVVVVVVVVVURZSSUVVVVVVVVVVVVVVVp8(qO]]]]]]]]]]]]]]]]]]]][UbUY\]]]]]]]]]]]]]]]eR do" (?+ededededeededededeedc`fyZ_bddedededeedededed(E$.`lllllllllllllllllllkicobdhjkllllllllllllllllqh"u$ & #,A2sssssssssssssssssssqmh`cnjnqrssssssssssssssssss+G'1rezzzzzzzzzzzzzzzzzyuqphloruwyzzzzzzzzzzzzzzzzzzzc"bj  ( ~~vvy~*2  ,5 8EVE>,.V "%*3odb"^f (/ ut%& #%-6 )ǁ}# 0  &)3=! .΋" 4*.3< .NJt! 3 $' 8A! (b  .  &) 7? !  utCel" -1 4;/5  14{ ;  36 ')?D'*  'MWcSl=FK` )  47 ,/ +.8>7<wmnopqrstuvwxujIx}B #35 (^+ ppqrstuvwxyz{xlWz. f' 9m8rrstuvwxyz{|}~zpc|? hH $=pCvtuvwxyz{|}}}tp~L/B1  H%vwxyz{|}}v}= T %L=yz{{|}~xmB[2  B&|}~{ : P @o9~x3C* -}#ny=(R/~% [ Gu0:J' $o%*P k2  .}'K > !D&  P*>c&6dDf{&r2AAAAAAAAAAAAAAA@?=8@AAAAAAAAAAAAAEYe  /=R.IIIIIIIIIIIIIIIIHHD^BGIIIIIIIIIIIIIS0 T !RQQQQQQQQQQQQQQQQPNHLPQQQQQQQQQQQQQi!.   jOYYYYYYYYYYYYYYYYYXTqhRWXYYYYYYYYYYYYYV^h :/aaaaaaaaaaaaaaaaa`^WV[_`aaaaaaaaaaaaav/B  ",diiiiiiiiiiiiiiiiihcg`behhiiiiiiiiiiiiiirz!! "+@=qqqqqqqqqqqqqqqqpokdjqglopqqqqqqqqqqqqqqq:E &0ynyyyyyyyyyyyyyyyxsrnhimpsvxyyyyyyyyyyyyyyyy|xmw$ ),}vwy}02 %. >L[WU25[ "%,5usw!go ! -5$$ )/ $Ɏ"+ "%*1"'(ɒ! . #&-5 (- #z) &),3 ,1|\mu! ),8?BMY]77;V !# &):@  $"dt~( ,/055: &,<5f  < !-0;@04 !5~_Eu~ 6#% 26:@-1 7>L {6]voV) u/2J ')367<+.  +0>@G\cnvlxp|p{lw clv=B[ &)=  %' 15 ,/ 6<4949(,-1     &) (,.2.2 7<??????(@ B!'*,-+(#  +9FR `%w3:81!xbUJ=/!  +@X@6 Qj x"z yyxwvr cN3q/\F1 2M EE#v/-~woighijlmos v wvkB.T9!/P/ih60mdefghiklmnopqrtuwyy`'KX7  "B)Xk=&{defghijklmnopqstuvwxy{|}d7L*-_ U=)}defghijklmnopqstuvwxz{|}~O f76$I#v?iefghijklmmoprstuvwxz{|}~q)A;<{:(~fghijklmnljilptvwxyz{|}/MG   =HFshijklmmopojoqpuxyz||~~| ;aI :MG pjklmnopprrqh0u{|}~}` AhG2EF qlmmnopqrsturh=w}d 8V@ (0[>wmnopqrstuvwxujIx}B #35 (^+ ppqrstuvwxyz{xlWz. f' 9m8rrstuvwxyz{|}~zpc|? hH $=pCvtuvwxyz{|}}}tp~L/B1  H%vwxyz{|}}v}= T %L=yz{{|}~xmB[2  B&|}~{ : P @o9~x3C* -}#ny=(R/~% [ Gu0:J' $o%*P k2  .}'K > !D&  P*>c&6dDf{&r2AAAAAAAAAAAAAAA@?=8@AAAAAAAAAAAAAEYe  /=R.IIIIIIIIIIIIIIIIHHD^BGIIIIIIIIIIIIIS0 T !RQQQQQQQQQQQQQQQQPNHLPQQQQQQQQQQQQQi!.   jOYYYYYYYYYYYYYYYYYXTqhRWXYYYYYYYYYYYYYV^h :/aaaaaaaaaaaaaaaaa`^WV[_`aaaaaaaaaaaaav/B  ",diiiiiiiiiiiiiiiiihcg`behhiiiiiiiiiiiiiirz!! "+@=qqqqqqqqqqqqqqqqpokdjqglopqqqqqqqqqqqqqqq:E &0ynyyyyyyyyyyyyyyyxsrnhimpsvxyyyyyyyyyyyyyyyy|xmw$ ),}vwy}02 %. >L[WU25[ "%,5usw!go ! -5$$ )/ $Ɏ"+ "%*1"'(ɒ! . #&-5 (- #z) &),3 ,1|\mu! ),8?BMY]77;V !# &):@  $"dt~( ,/055: &,<5f  < !-0;@04 !5~_Eu~ 6#% 26:@-1 7>L {6]voV) u/2J ')367<+.  +0>@G\cnvlxp|p{lw clv=B[ &)=  %' 15 ,/ 6<4949(,-1     &) (,.2.2 7<??????(0` %   &6F X"m*u)unYH:) %A2s4xWmuuuttr fO2l%vG* &R4u!i&zv kfgijlmoptvu]0aX-C7x+x'{hefhiklmoprsuwxz|n1_K  %5n"m-gfghjklnoqrtuwxz{}e s.  .5l3qfgijklllnrtuwxz{}~-N8 / G5kijklnon"|Bqwyz|}}=f;, L3jklnoprsppz}~0Cl8 !>v5mmopqrtuvrr~~6S-#Bo5qpqrsuvwyzv yN(t <'zstuvwyz{}~y#H N(uwxyz{}~}o Hh( J.yy{|}~%$ T S!}~2 On$ 4'M/ A  1Ss% (3vcCa""S0 4sA#5TRX 7Sjy+2k;P?z 5 ^_____________YmY^__________n} $(3EKjjjjjjjjjjjjjgebgijjjjjjjjjjlU!Hsttututttutttotnpstututtuttutt" (1K{w|~T 6" Pbnr}GMl%&{ )0*  #-5#)!  18 "  "% .5VblgMSi  $'&* +B--  $&16 ! 06ACz/ '*A')38 # 'Xbo@jf4TZm( *- *. *. #'  +5;LOWdS\oS\oNVd38L,  '* '*&+*/,0"&"%%(*.%(????(0` %   &6F X"m*u)unYH:) %A2s4xWmuuuttr fO2l%vG* &R4u!i&zv kfgijlmoptvu]0aX-C7x+x'{hefhiklmoprsuwxz|n1_K  %5n"m-gfghjklnoqrtuwxz{}e s.  .5l3qfgijklllnrtuwxz{}~-N8 / G5kijklnon"|Bqwyz|}}=f;, L3jklnoprsppz}~0Cl8 !>v5mmopqrtuvrr~~6S-#Bo5qpqrsuvwyzv yN(t <'zstuvwyz{}~y#H N(uwxyz{}~}o Hh( J.yy{|}~%$ T S!}~2 On$ 4'M/ A  1Ss% (3vcCa""S0 4sA#5TRX 7Sjy+2k;P?z 5 ^_____________YmY^__________n} $(3EKjjjjjjjjjjjjjgebgijjjjjjjjjjlU!Hsttututttutttotnpstututtuttutt" (1K{w|~T 6" Pbnr}GMl%&{ )0*  #-5#)!  18 "  "% .5VblgMSi  $'&* +B--  $&16 ! 06ACz/ '*A')38 # 'Xbo@jf4TZm( *- *. *. #'  +5;LOWdS\oS\oNVd38L,  '* '*&+*/,0"&"%%(*.%(????( @  2 H Y Y I4!F 0gThpq q qfN+\ K EIrnfhjlnqsvxtB L*T#t kgikloqsuxz}v$AEyhjlnmJ}vx{}=j%Jxlnoqsmy~Cn 4^~oqsuwyq}q.G@#suwy{}~w I_|y{}|}_!?~! HM~ 3 Lh {%\  " -,@p E';Q  !'U)=Q ](:SN "(U$3?$!!!  h X !!!!!!& C&......2qgr.......1 (  !=======<@FE=======2 iMMMMMMMMLNIMMMMMMUjx (4:N]]]]]]]]Z]\]]]]]]U !> *mmmmmmmmlfvjlmmmmmmr7 *48e}}}}}}|wsx|}}}}}}}}p $<!ew#_f~% (5!'/4 $) &lw~#dj| %)394`R (+5   %)7=7>t՘p5| /37  "" $(>D9CJLAHK;A9!# ??( @  2 H Y Y I4!F 0gThpq q qfN+\ K EIrnfhjlnqsvxtB L*T#t kgikloqsuxz}v$AEyhjlnmJ}vx{}=j%Jxlnoqsmy~Cn 4^~oqsuwyq}q.G@#suwy{}~w I_|y{}|}_!?~! HM~ 3 Lh {%\  " -,@p E';Q  !'U)=Q ](:SN "(U$3?$!!!  h X !!!!!!& C&......2qgr.......1 (  !=======<@FE=======2 iMMMMMMMMLNIMMMMMMUjx (4:N]]]]]]]]Z]\]]]]]]U !> *mmmmmmmmlfvjlmmmmmmr7 *48e}}}}}}|wsx|}}}}}}}}p $<!ew#_f~% (5!'/4 $) &lw~#dj| %)394`R (+5   %)7=7>t՘p5| /37  "" $(>D9CJLAHK;A9!# ??(0 `   5"Kw:{ C B7w Fx 8 GLl lhknquqG K 4fqgikmqtw{~}/VGrknp(u|~ XDt;mvpruw?z9Z )Buxz}@ oI a{}A h .BO) 5 =as"; #ifdef _MSC_VER #pragma warning(pop) #endif #include #include using namespace boost; #ifdef Q_WS_WIN #include #endif #endif // PRECOMPILED_H launchy-2.5/plugins/runner/runner.h0000644000175000017500000000330411334674233016531 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef runner_H #define runner_H #include "gui.h" #include "globals.h" #include "plugin_interface.h" #include class RunnerPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: RunnerPlugin() { gui.reset(); HASH_runner = qHash(QString("runner")); } ~RunnerPlugin() {} int msg(int msgId, void* wParam = NULL, void* lParam = NULL); private: void setPath(QString * path); void getID(uint*); void getName(QString*); void getCatalog(QList* items); void getResults(QList* inputData, QList* results); void launchItem(QList* inputData, CatItem* item); void doDialog(QWidget* parent, QWidget**); void endDialog(bool accept); void init(); QString getIcon(); QString getIcon(QString file); uint HASH_WEBSITE; uint HASH_runner; QList cmds; QString libPath; boost::shared_ptr gui; }; extern RunnerPlugin* gRunnerInstance; #endif launchy-2.5/plugins/runner/runner.png0000644000175000017500000000367411042734573017100 0ustar monesmonesPNG  IHDR szzsRGBbKGD pHYs  tIME3ASJ )UhP^)`)y0w{l?;wGHN;gk;WۉP6K)𑞣 |(nf=3=< wD4%<ѽdSO_8S[UDM( u;{X*J(ۻ/;v#0ϟ;{ۉoZ{v'$i ܵ³~}?O&1pp?l}fSV!9àPpzE&WkV/_U8vjmOݒ)Z[za7}dFXiXJC[b,DWCjnsۖ=#lmwmd0(iԴDA }z9C ?S&{hȉ_?nV̊It &:HuN4!@IZtQX߯dE%kKOvvvXXW"фC6ه1/_7a$/A6"AZ!>ƄznEkW'Oc^{<9p<|s4tl8;o:HELq,s1;H8=a` JMHL1.{H"4+MQ6|!Yhj"޳~f4XeFZi\he#Zdǡ5#'-IOkVY$4ݧqa~V"%d, =La;?Ln"Y"bè*SNe~$ivgThoCu( !$R(NU;#^oY E5Iހ$ZQax|\zmhĹD5] -hFs8g:W;H)"Ic0J"n ]<2ܗOf^ufoQgHnC!اv"}rvmXLC0g18yc}!Ρ.? sv7Z8f2RIe@PN ޻e= -Q&J}k ]7b?4/-w`390Ӡ]L@q+Z7INx[ = )LSa La/+# +2쯰>xU*A>?T_3O+OۼH/B g}YDPmQ#߈_^QwpcȪ0'.9.XWܳ#x. DWRv̊=]EU[m?j6Յ ǚH9hHػNC&{~'O3 hjTDѥMxP/Ǘ {r?x?{M,8 wqU@\eVF@"] $1 _~\^ڿ vIIENDB`launchy-2.5/plugins/runner/globals.h0000644000175000017500000000157511257666017016660 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GLOBALS_H #define GLOBALS_H struct runnerCmd { QString name; QString file; QString args; }; #endif launchy-2.5/plugins/runner/runner.ico0000644000175000017500000002154610673261500017056 0ustar monesmones  F  hh( @  2 H Y Y I4!F /fTgpq q qfM*[ K EIqnfhjlnqsvxtA L*T"t kgikloqsuxz}v#@DyhjlnmJ}vx{})mmmmmmmmlfvjlmmmmmmr6(28d}}}}}}|wsx|}}}}}}}}p ""<?dv"_e~$$ (4$$.4 &kw~"dj| 1:4`Q &+533$$ 7<7=t՗p5{ .27  ((>C9CIL@GK:C9 ' ??( @       '+?$$ !% &+((%4(2 .2%;(;331: 7<#@.F>C:C*T*[ 3^ .fJJeee[gkk)$ODHHHHJAGeegekklkqHHHJJJJAcggg]_llly^:JJJJJeeeBcgkdllyyyy4 hJeeeeegg[dkkoayyyzzzw+feeeggggk\plijyzzzz*yqquP@Bl2B {y}])'G]~hm 6g$  '$Z{ & ,666{y5663*UUUTtUUU4 8D?nuutvtuus37@1:{?@~"DLB=&&!&&! (   "'+2&&37 8D>B;i9t>y"DLBlG Fm:{1]@~g cj lnuqpuwy| {v?)4jm  )6+@P]g2666566ZUUUTyh~{m{tUUvutstuu ") $&'/"!#XU23~T9 (%&1{V5@;>72345}m8lCEF069:BCDKOPYZJIGfnQ|[\]^Sab`pkcde_+ghijqrss, ouuvtxyzw *.- launchy-2.5/plugins/runner/dlg.ui0000644000175000017500000000746711257666017016177 0ustar monesmones Dlg 0 0 411 271 ArrowCursor Runner - Launch custom commands QAbstractItemView::ScrollPerPixel false false 3 5 Name Program Arguments Qt::Horizontal 40 20 + Qt::Horizontal 40 20 - Qt::Horizontal 40 20 Qt::Horizontal 40 20 Hint: Use $$ symbols to mark locations for user input Qt::Horizontal 40 20 DropTableWidget QTableWidget
DropTableWidget.h
launchy-2.5/plugins/runner/runner.cpp0000644000175000017500000001206711336342311017061 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "runner.h" #include "gui.h" RunnerPlugin* gRunnerInstance = NULL; void RunnerPlugin::init() { if (gRunnerInstance == NULL) gRunnerInstance = this; QSettings* set = *settings; cmds.clear(); if ( set->value("runner/version", 0.0).toDouble() == 0.0 ) { set->beginWriteArray("runner/cmds"); set->setArrayIndex(0); #ifdef Q_WS_WIN set->setValue("name", "cmd"); set->setValue("file", "C:\\Windows\\System32\\cmd.exe"); set->setValue("args", "/K $$"); #endif #ifdef Q_WS_X11 set->setValue("name", "cmd"); set->setValue("file", "/usr/bin/xterm"); set->setValue("args", "-hold -e $$"); #endif /* #ifdef Q_WS_MAC set->setValue("name", "cmd"); set->setValue("file", "") #endif */ set->endArray(); } set->setValue("runner/version", 2.0); // Read in the array of websites int count = set->beginReadArray("runner/cmds"); for(int i = 0; i < count; ++i) { set->setArrayIndex(i); runnerCmd cmd; cmd.file = set->value("file").toString(); cmd.name = set->value("name").toString(); cmd.args = set->value("args").toString(); cmds.push_back(cmd); } set->endArray(); } void RunnerPlugin::getID(uint* id) { *id = HASH_runner; } void RunnerPlugin::getName(QString* str) { *str = "Runner"; } QString RunnerPlugin::getIcon() { return libPath + "/icons/runner.png"; } QString RunnerPlugin::getIcon(QString file) { file = file; // Warning removal #ifdef Q_WS_WIN QRegExp rx("\\.(exe|lnk)$", Qt::CaseInsensitive); if (rx.indexIn(file) != -1) return file; #endif return getIcon(); } void RunnerPlugin::getCatalog(QList* items) { foreach(runnerCmd cmd, cmds) { items->push_back(CatItem(cmd.file + "%%%" + cmd.args, cmd.name, HASH_runner, getIcon(cmd.file))); } } void RunnerPlugin::getResults(QList* inputData, QList* results) { if (inputData->count() <= 1) return; CatItem& catItem = inputData->first().getTopResult(); if (catItem.id == (int) HASH_runner && inputData->last().hasText()) { const QString & text = inputData->last().getText(); // This is user search text, create an entry for it results->push_front(CatItem(text, text, HASH_runner, getIcon(catItem.icon))); } } void RunnerPlugin::launchItem(QList* inputData, CatItem* item) { item = item; // Compiler warning QString file = ""; QString args = ""; CatItem* base = &inputData->first().getTopResult(); file = base->fullPath; // Replace the $'s with arguments QStringList spl = file.split("$$"); file = spl[0]; for (int i = 1; i < spl.size(); ++i) { if (inputData->count() >= i+1) { // const InputData* ij = &inputData->at(i); CatItem* it = &((InputData)inputData->at(i)).getTopResult(); file += it->fullPath; } file += spl[i]; } // Split the command from the arguments spl = file.split("%%%"); file = spl[0]; if (spl.count() > 0) args = spl[1]; if (file.contains("http://")) { QUrl url(file); file = url.toEncoded(); } // qDebug() << file << args; runProgram(file, args); } void RunnerPlugin::doDialog(QWidget* parent, QWidget** newDlg) { if (gui != NULL) return; gui.reset(new Gui(parent)); *newDlg = gui.get(); } void RunnerPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } gui.reset(); } void RunnerPlugin::setPath(QString * path) { libPath = *path; } int RunnerPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog(wParam != 0); break; case MSG_PATH: setPath((QString*) wParam); default: break; } return handled; } Q_EXPORT_PLUGIN2(runner, RunnerPlugin) launchy-2.5/plugins/runner/runner.pro0000644000175000017500000000335411336333626017107 0ustar monesmonesTEMPLATE = lib CONFIG += plugin \ debug_and_release VPATH += ../../src INCLUDEPATH += ../../src INCLUDEPATH += ../../common INCLUDEPATH += c:/boost/ PRECOMPILED_HEADER = precompiled.h UI_DIR = ../../plugins/runner/ FORMS = dlg.ui HEADERS = plugin_interface.h \ runner.h \ gui.h \ globals.h \ ../../common/FileBrowserDelegate.h \ ../../common/FileBrowser.h \ ../../common/DropTableWidget.h \ precompiled.h SOURCES = plugin_interface.cpp \ runner.cpp \ gui.cpp \ ../../common/FileBrowser.cpp \ ../../common/FileBrowserDelegate.cpp \ ../../common/DropTableWidget.cpp TARGET \ = \ runner win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib LIBS += user32.lib % LIBS += Gdi32.lib % LIBS += comctl32.lib } if(!debug_and_release|build_pass):CONFIG(debug, debug|release) { DESTDIR = ../../debug/plugins } if(!debug_and_release|build_pass):CONFIG(release, debug|release) { DESTDIR = ../../release/plugins } unix:!macx { PREFIX = /usr target.path = $$PREFIX/lib/launchy/plugins/ icon.path = $$PREFIX/lib/launchy/plugins/icons/ icon.files = runner.png INSTALLS += target icon } macx { if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/Launchy.app/Contents/MacOS/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/Launchy.app/Contents/MacOS/plugins CONFIG(debug, debug|release):icons.path = ../../debug/Launchy.app/Contents/MacOS/plugins/icons/ CONFIG(release, debug|release):icons.path = ../../release/Launchy.app/Contents/MacOS/plugins/icons/ icons.files = runner.png INSTALLS += icons INCLUDEPATH += /opt/local/include/ } launchy-2.5/plugins/verby/0000755000175000017500000000000011355776633014677 5ustar monesmoneslaunchy-2.5/plugins/verby/gui.cpp0000644000175000017500000000162211334674233016156 0ustar monesmones/* Verby: Plugin for Launchy Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "gui.h" #include "Verby.h" Gui::Gui(QWidget* parent) : QWidget(parent) { setupUi(this); } void Gui::writeOptions() { } launchy-2.5/plugins/verby/copy.png0000644000175000017500000000421411257427133016345 0ustar monesmonesPNG  IHDR szzsRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5EIDATXGWyPbEfR;`[tԩSt0LAQpTJP AIҚd .7, .7rr®hNg3c>=}6jkkeeegϞ7hf>ϜR^^ܿMܻw0=3pwdSS&axh#"ppp==A~~py 00O*ʮʎyxxLMN11>f"kSSzp6{'REP  `@ggpe_ BH1HuwwC___?2`#&077Ph'IQKKۋ:0**6 {ԑke0IBLΝ;鐟8"^jPT&Fe|l\y|ΆғqXZVPPЛzC hl<_E%%C***tuu19\{XN`BؘBO3!> [::R1R@- I7o"66ׯ_G||cǎ5q+NY2c{ Ay 4b;H<=Tn Q##*w Ov!\?] }ޤF4]7spxG᫈%M>(iƭF?Dg8g(Ʌg٥"dge p(ssse/wq ߶mۋ&nnnj"07?*D" 0(P4GwAV3r' 76 !0{j<!jzzz^~@}Z"w٫Gm[&Q"(NY ,/C)dZFZZRSRL0p\ܾ}# UIT41Gp5 eZaچ Qr@sWF7>ι WK5M2x eX#X#K!5i gSGx/Q8 \ę89PJ3dU*V`v UJK/!FJLF`OhoW ɬooZ=ZhmFpZ%җ#Xc'=݃O9>Hxބp6<%i(UkPF;fsV((8XUP̢jm5Uo$oRHB` ^ǻ^,FFA1* +G;e0*5L,.Dye d(TI;ߍk܍ j$ӡ.BEs^Y ؈+fKS WP5Cc\OO|/#IJBB MܾxJ;]ϹHٲxo aX΁adJ!܋!.]eNx9IΊ*Hx$V&0<<:C#rnɑWFW&RIqEV,BCC.\H6Z͈;][{ ii"++޼yM6077 aa1~Wh}ZF8 |}}/<(Kc "4Ʊ|aa|}=EYCp-[RxRa#~~~qAp x˖-ظq_ذuW,,,~effY~F3~C]n+ߛ u?j<ɡIENDB`launchy-2.5/plugins/verby/gui.h0000644000175000017500000000173511257454033015626 0ustar monesmones/* Verby: Plugin for Launchy Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GUI_H #define GUI_H #include "ui_dlg.h" class Gui : public QWidget, private Ui::Dlg { Q_OBJECT public: Gui(QWidget* parent); ~Gui() { this->hide(); } void writeOptions(); }; #endif launchy-2.5/plugins/verby/opencontainer.png0000644000175000017500000000276111246571646020253 0ustar monesmonesPNG  IHDR szzIDATxVmPTU~`u%?f5RADF2E1,'ԑ&+e1GNfH5%G %(ˇ~ ˲.zHV`lәysy{p_}\ur\-avB"zwGdȀ!@O''(MZ&8`Gݭ2}y4j7zzDUڑ=扂R@SΔ<лp Z 6aD4|E_i@ w"l)/Ox ֏ Z#%)yN?+@d'i_˕w#b Txp+$Ǿ){6/zRvW@NَAu'/x#92`4i;ݤg3A{4*:LJۃ,⣉s?rZ~`doGҬ^g7iQ,OG >1kd]{'3Жwك4=05qSPZ?f6(f-X@@}e:AonGB* WB( :aM<,Ԣ0AOHGxh)O{Le5%ob+ }y+qNQV >A1hm]?RZqMY^@. X_,]eBLB-D+n"H,Hf=pB=Rqx9}UwL@3yiX!Oln*l {<,#\[9(1W\=TdM%sꯁȐE|<{kF ѐbdNlzKa4*1"Wh PC&" UmS2pf0=V:Ee1O^g֌ ) GZm-|"j/}y+.c{܇XEG #&-oRk<#S ^F(߲Aak蕳ã 'O]QècR~sʁ>h:uHYw5~5zJ: fn9 Qw gieڳh@y [up(qǫ-(#"lw9a5'fJ\-g).쌍yedjQ=x$Dؤ"GYEsS=V@[:+s9J!>FZxD&ł*ygoiͬK^vݪvjXtꢻe,k(6m}"f#9k/-l"l@mtUoTA_x J5J:` `Ύ~]Jyc'-J+ٶ[0Vz$ib6nFڍvQ@6,̻h Q f:7 ddly:BH,,l}\ЅRaꮠy<+oA8^IENDB`launchy-2.5/plugins/verby/Verby.h0000644000175000017500000000366711354223474016140 0ustar monesmones/* Verby: Plugin for Launchy Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef VERBY_H #define VERBY_H #include "gui.h" #include "plugin_interface.h" class VerbyPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: VerbyPlugin() { gui = NULL; HASH_VERBY = qHash(QString("verby")); HASH_DIR = qHash(QString("directory")); HASH_FILE = qHash(QString("file")); HASH_LINK = qHash(QString("link")); } ~VerbyPlugin() { } int msg(int msgId, void* wParam, void* lParam); private: void getID(uint* id); void setPath(QString * path); void getName(QString* name); void getCatalog(QList* items); void getResults(QList* inputData, QList* results); int launchItem(QList* inputData, CatItem* item); void doDialog(QWidget* parent, QWidget**); void endDialog(bool accept); void getLabels(QList* inputData); void init(); bool isMatch(QString text1, QString text2); void addCatItem(QString text, QList* results, QString fullName, QString shortName, QString iconName); void updateUsage(CatItem& item); QString getIcon(); QString getIconPath() const; private: QString libPath; Gui* gui; uint HASH_VERBY; uint HASH_FILE; uint HASH_DIR; uint HASH_LINK; }; #endif launchy-2.5/plugins/verby/precompiled.h0000644000175000017500000000207611257666017017353 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PRECOMPILED_H #define PRECOMPILED_H #ifdef _MSC_VER #pragma warning(push,3) #endif #include #ifdef _MSC_VER #pragma warning(pop) #endif #include #ifdef Q_WS_WIN #include #include #include #endif #endif // PRECOMPILED_H launchy-2.5/plugins/verby/properties.png0000644000175000017500000000360511246571646017601 0ustar monesmonesPNG  IHDR szzLIDATxyPgǿHI !B"utUZlc;=T[nUE,:u{9lV.+!!rC}"3ӑ̛ͼ~}?\.j Y:ݣn0l& [ls~$_Zvݑ 7 zzVf6 !9,Y^_ϒ8<#s20{y0qe{6=/\# ?]Æh <8+ncc΄€uN?c_9==%,,l4 G+n\>!N7t'w. Bnl.va˚MM"dhIh"n/#b4~X F,1O Te*t'woj 7?ԌʕwH`$i1|d 07Vp.Δ0Bwfw'F:yT6_ղd>eVbG8, jBj˯egg8@ij bVu'l-_Ȁ)(Նw@,SBIWTOힱ= LTʡL Π8IeHtcg/%{WzᓀZ-W~WVqdg:ֽ8xH"Ĉd9ǀZ9 3J׾r\. @ӣN.[l-?_?zr҉xҠPv[fJ ]d7mXEy7x4|ORqf*m~@aGr J-4jX`:R&;9KB"ױN&{}FCe)5ssC#0jԀQ)SNJKj&Bi?`TQ^O]L: Fc-': ϕ?NKcV@0-CRm7iqъJUwf-m5+bpRze.>MOh6-d``@fZy%H qR3rFxn;dA= 87_HN [lIENDB`launchy-2.5/plugins/verby/dlg.ui0000644000175000017500000000154111257666017016000 0ustar monesmones Dlg 0 0 354 273 Verby - Adds verbs to commands Qt::Vertical 20 40 launchy-2.5/plugins/verby/run.png0000644000175000017500000000205011246571646016202 0ustar monesmonesPNG  IHDR szzIDATx_L[Uǿۖ: sbXc1KpA㋉s!!>苑Ľl1`FBb/ts&%GAl m{{疐TvBY~=>sF ?ԼSFH}^(:!%\R|P{go]ɘS}0cGF}h$F26ֿuͽXlP}z`;t/6NŸ`09e?MȬ)TB#> 5NmÞδѓw#PߙMg>S?^K*6[灠NN8^w.m_I񜧫~բgG;{<%ΰ=g EF2|󁪽*$$ 96u.̌ty99-8,velJ H`'tٿ|_yյO#?ťSNttt)d2-_i籈<~[O)S2GEWimmhiijh`М?poZ'w?%@pQk4JK{vzT]@ Xס1+zYG<6cOl2m= ww7`6 Po(-@ l0L %sٛOǠZLEV|d6>uL]sg~"}}ldzWTs  ِrw ,aOVe<h?Z)C7F+ IENDB`launchy-2.5/plugins/verby/verby.pro0000644000175000017500000000277711336333626016553 0ustar monesmonesTEMPLATE = lib CONFIG += plugin \ release VPATH += ../../src/ INCLUDEPATH += ../../src/ PRECOMPILED_HEADER = precompiled.h UI_DIR = ../../plugins/Verby/ FORMS = dlg.ui HEADERS = plugin_interface.h \ gui.h \ Verby.h \ precompiled.h SOURCES = plugin_interface.cpp \ gui.cpp \ Verby.cpp TARGET = verby win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib user32.lib } win32:debug:%QMAKE_CXXFLAGS += /ZI *:debug:DESTDIR = ../../debug/plugins/ *:release { DESTDIR = ../../release/plugins/ %QMAKE_CXXFLAGS += /Ox \ /Ob2 \ /Oi \ /Oy \ /GT \ /GA \ /WX } unix:!macx { PREFIX = /usr target.path = $$PREFIX/lib/launchy/plugins/ icon.path = $$PREFIX/lib/launchy/plugins/icons/ icon.files = verby.png copy.png opencontainer.png properties.png run.png INSTALLS += target \ icon } macx { if(!debug_and_release|build_pass):CONFIG(debug, debug|release):DESTDIR = ../../debug/Launchy.app/Contents/MacOS/plugins if(!debug_and_release|build_pass):CONFIG(release, debug|release):DESTDIR = ../../release/Launchy.app/Contents/MacOS/plugins CONFIG(debug, debug|release):icons.path = ../../debug/Launchy.app/Contents/MacOS/plugins/icons/ CONFIG(release, debug|release):icons.path = ../../release/Launchy.app/Contents/MacOS/plugins/icons/ icons.files = verby.png copy.png opencontainer.png properties.png run.png INSTALLS += icons INCLUDEPATH += /opt/local/include/ } launchy-2.5/plugins/verby/Verby.cpp0000644000175000017500000001722011354640027016456 0ustar monesmones/* Verby: Plugin for Launchy Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "Verby.h" #include "gui.h" void VerbyPlugin::init() { } void VerbyPlugin::setPath(QString * path) { libPath = *path; } void VerbyPlugin::getID(uint* id) { *id = HASH_VERBY; } void VerbyPlugin::getName(QString* str) { *str = "Verby"; } QString VerbyPlugin::getIcon() { return getIconPath() + "verby.png"; } void VerbyPlugin::getLabels(QList* inputData) { if (inputData->count() == 1) { QString text = inputData->last().getText(); // Is it a file? if (text.contains("\\") || text.contains("/")) return; QDir qd; QFile qf; QString path = inputData->last().getTopResult().fullPath; QFileInfo info(path); if (info.isSymLink()) { inputData->last().setLabel(HASH_LINK); } else if (info.isDir()) { inputData->last().setLabel(HASH_DIR); } else if (info.isFile()) { inputData->last().setLabel(HASH_FILE); } } } QString VerbyPlugin::getIconPath() const { return libPath + "/icons/"; } bool VerbyPlugin::isMatch(QString text1, QString text2) { int text2Length = text2.count(); int curChar = 0; foreach(QChar c, text1) { if (c.toLower() == text2[curChar].toLower()) { ++curChar; if (curChar >= text2Length) { return true; } } } return false; } void VerbyPlugin::addCatItem(QString text, QList* results, QString fullName, QString shortName, QString iconName) { if (text.length() == 0 || isMatch(shortName, text)) { CatItem item = CatItem(fullName, shortName, HASH_VERBY, getIconPath() + iconName); item.usage = (*settings)->value("verby/" + shortName.replace(" ", "") , 0).toInt(); results->push_back(item); } } void VerbyPlugin::updateUsage(CatItem& item) { (*settings)->setValue("verby/" + item.shortName.replace(" ", ""), item.usage + 1); } void VerbyPlugin::getResults(QList* inputData, QList* results) { if (inputData->count() == 2) { QString text = inputData->at(1).getText(); if (inputData->first().hasLabel(HASH_DIR)) { addCatItem(text, results, "Properties", "Directory properties", "properties.png"); } else if (inputData->first().hasLabel(HASH_FILE)) { addCatItem(text, results, "Open containing folder", "Open containing folder", "opencontainer.png"); addCatItem(text, results, "Properties", "File properties", "properties.png"); } else if (inputData->first().hasLabel(HASH_LINK)) { addCatItem(text, results, "Run as", "Run as a different user", "run.png"); addCatItem(text, results, "Open containing folder", "Open containing folder", "opencontainer.png"); addCatItem(text, results, "Open shortcut folder", "Open shortcut folder", "opencontainer.png"); addCatItem(text, results, "Copy path", "Copy path to clipboard", "copy.png"); addCatItem(text, results, "Properties", "File properties", "properties.png"); } else { return; } // Mark the item as a Verby item so that Verby has a chance to process it before Launchy inputData->first().setID(HASH_VERBY); inputData->first().getTopResult().id = HASH_VERBY; // ensure there's always an item at the top of the list for launching with parameters. results->push_front(CatItem( "Run", inputData->last().getText(), INT_MAX, getIconPath() + "run.png")); } } int VerbyPlugin::launchItem(QList* inputData, CatItem* item) { item = item; // Compiler Warning if (inputData->count() != 2) { // Tell Launchy to handle the command return MSG_CONTROL_LAUNCHITEM; } QString noun = inputData->first().getTopResult().fullPath; CatItem& verbItem = inputData->last().getTopResult(); QString verb = verbItem.shortName; qDebug() << "Verby launchItem" << verb; if (verb == "Run") { runProgram(noun, ""); } else if (verb == "Open containing folder") { QFileInfo info(noun); if (info.isSymLink()) { info.setFile(info.symLinkTarget()); } #ifdef Q_WS_WIN runProgram("explorer.exe", "\"" + QDir::toNativeSeparators(info.absolutePath()) + "\""); #endif } else if (verb == "Open shortcut folder") { QFileInfo info(noun); #ifdef Q_WS_WIN runProgram("explorer.exe", "\"" + QDir::toNativeSeparators(info.absolutePath()) + "\""); #endif } else if (verb == "Run as") { #ifdef Q_WS_WIN SHELLEXECUTEINFO shellExecInfo; shellExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); shellExecInfo.fMask = SEE_MASK_FLAG_NO_UI; shellExecInfo.hwnd = NULL; shellExecInfo.lpVerb = L"runas"; shellExecInfo.lpFile = (LPCTSTR)noun.utf16(); shellExecInfo.lpParameters = NULL; QDir dir(noun); QFileInfo info(noun); if (!info.isDir() && info.isFile()) dir.cdUp(); QString filePath = QDir::toNativeSeparators(dir.absolutePath()); shellExecInfo.lpDirectory = (LPCTSTR)filePath.utf16(); shellExecInfo.nShow = SW_NORMAL; shellExecInfo.hInstApp = NULL; ShellExecuteEx(&shellExecInfo); #endif } else if (verb == "File properties") { #ifdef Q_WS_WIN SHELLEXECUTEINFO shellExecInfo; shellExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); shellExecInfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_INVOKEIDLIST; shellExecInfo.hwnd = NULL; shellExecInfo.lpVerb = L"properties"; QString filePath = QDir::toNativeSeparators(noun); shellExecInfo.lpFile = (LPCTSTR)filePath.utf16(); shellExecInfo.lpIDList = NULL; shellExecInfo.lpParameters = NULL; shellExecInfo.lpDirectory = NULL; shellExecInfo.nShow = SW_NORMAL; shellExecInfo.hInstApp = NULL; ShellExecuteEx(&shellExecInfo); #endif } else if (verb == "Copy path to clipboard") { QFileInfo info(noun); if (info.isSymLink()) { info.setFile(info.symLinkTarget()); } QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(QDir::toNativeSeparators(info.canonicalFilePath())); } else { // Tell Launchy to handle the command return MSG_CONTROL_LAUNCHITEM; } updateUsage(verbItem); return true; } void VerbyPlugin::doDialog(QWidget* parent, QWidget** newDlg) { if (gui == NULL) { gui = new Gui(parent); *newDlg = gui; } } void VerbyPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } if (gui != NULL) delete gui; gui = NULL; } int VerbyPlugin::msg(int msgId, void* wParam, void* lParam) { int handled = 0; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_LAUNCH_ITEM: handled = launchItem((QList*) wParam, (CatItem*) lParam); break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog(wParam != 0); break; case MSG_PATH: setPath((QString *) wParam); break; default: break; } return handled; } Q_EXPORT_PLUGIN2(Verby, VerbyPlugin) launchy-2.5/plugins/verby/verby.png0000644000175000017500000000205011246571646016525 0ustar monesmonesPNG  IHDR szzIDATx_L[Uǿۖ: sbXc1KpA㋉s!!>苑Ľl1`FBb/ts&%GAl m{{疐TvBY~=>sF ?ԼSFH}^(:!%\R|P{go]ɘS}0cGF}h$F26ֿuͽXlP}z`;t/6NŸ`09e?MȬ)TB#> 5NmÞδѓw#PߙMg>S?^K*6[灠NN8^w.m_I񜧫~բgG;{<%ΰ=g EF2|󁪽*$$ 96u.̌ty99-8,velJ H`'tٿ|_yյO#?ťSNttt)d2-_i籈<~[O)S2GEWimmhiijh`М?poZ'w?%@pQk4JK{vzT]@ Xס1+zYG<6cOl2m= ww7`6 Po(-@ l0L %sٛOǠZLEV|d6>uL]sg~"}}ldzWTs  ِrw ,aOVe<h?Z)C7F+ IENDB`launchy-2.5/platforms/0000755000175000017500000000000011355776633014076 5ustar monesmoneslaunchy-2.5/platforms/unix/0000755000175000017500000000000011355776633015061 5ustar monesmoneslaunchy-2.5/platforms/unix/unix.pro0000644000175000017500000000166011056635030016550 0ustar monesmonesTEMPLATE = lib TARGET = platform_unix CONFIG += plugin qt_warn debug_and_release VPATH += ../../src/ INCLUDEPATH += ../../src/ SOURCES = platform_x11_hotkey.cpp platform_base_hotkey.cpp platform_unix.cpp platform_unix_util.cpp HEADERS = platform_base.h platform_unix.h platform_base_hotkey.h platform_base_hottrigger.h platform_unix_util.h \ platform_x11_hotkey.h CONFIG -= embed_manifest_dll LIBS += -lX11 -lXext -lXrender unix { PREFIX = /usr DEFINES += SKINS_PATH=\\\"$$PREFIX/share/launchy/skins/\\\" \ PLUGINS_PATH=\\\"$$PREFIX/lib/launchy/plugins/\\\" \ PLATFORMS_PATH=\\\"$$PREFIX/lib/launchy/\\\" target.path = $$PREFIX/lib/launchy/ INSTALLS += target } if(!debug_and_release|build_pass):CONFIG(debug, debug|release) { DESTDIR = ../../debug/ } if(!debug_and_release|build_pass):CONFIG(release, debug|release) { DESTDIR = ../../release/ } launchy-2.5/platforms/unix/platform_unix.cpp0000644000175000017500000001657511346030002020437 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include #include #include #include "platform_unix.h" #include #include #include PlatformUnix::PlatformUnix(int& argc, char** argv) : PlatformBase(argc, argv) { /* instance = new LimitSingleInstance(TEXT("Local\\{ASDSAD0-DCC6-49b5-9C61-ASDSADIIIJJL}")); // Create local and global application mutexes so that installer knows when // Launchy is running localMutex = CreateMutex(NULL,0,_T("LaunchyMutex")); globalMutex = CreateMutex(NULL,0,_T("Global\\LaunchyMutex")); */ icons = new UnixIconProvider(); // init(argc,argv); // alpha.reset(); // icons->reset(); } /* PlatformUnix::PlatformUnix() : PlatformBase() { alpha.reset(); // alpha = NULL; icons.reset(); } */ /* shared_ptr PlatformUnix::init(int & argc, char** argv) { // QApplication * app = new QApplication(*argc, argv); shared_ptr app(new MyApp(argc, argv)); icons = new UnixIconProvider(); // icons.reset( (QFileIconProvider *) new UnixIconProvider()); return app; } */ PlatformUnix::~PlatformUnix() { GlobalShortcutManager::clear(); // delete icons; } QList PlatformUnix::getDefaultCatalogDirectories() { QList list; const char *dirs[] = { "/usr/share/applications/", "/usr/local/share/applications/", "/usr/share/gdm/applications/", "/usr/share/applications/kde/", "~/.local/share/applications/"}; QStringList l; l << "*.desktop"; for(int i = 0; i < 5; i++) list.append(Directory(dirs[i],l,false,false,100)); list.append(Directory("~",QStringList(),true,false,0)); return list; } QHash > PlatformUnix::getDirectories() { QHash > out; QDir d; d.mkdir(QDir::homePath() + "/.launchy"); out["skins"] += qApp->applicationDirPath() + "/skins"; out["skins"] += QDir::homePath() + "/.launchy/skins"; out["skins"] += SKINS_PATH; out["plugins"] += qApp->applicationDirPath() + "/plugins"; out["plugins"] += QDir::homePath() + "/.launchy/plugins"; out["plugins"] += PLUGINS_PATH; out["config"] += QDir::homePath(); out["portableConfig"] += qApp->applicationDirPath(); if (QFile::exists(out["skins"].last() + "/Default")) out["defSkin"] += out["skins"].last() + "/Default"; else out["defSkin"] += out["skins"].first() + "/Default"; out["platforms"] += qApp->applicationDirPath(); out["platforms"] += PLATFORMS_PATH; return out; } /* bool PlatformUnix::CreateAlphaBorder(QWidget* w, QString ImageName) { // if (alpha) // delete alpha; if (ImageName == "") ImageName = alphaFile; alphaFile = ImageName; alpha.reset( new AlphaBorder(w, ImageName) ); return true; } */ bool PlatformUnix::supportsAlphaBorder() const { return QX11Info::isCompositingManagerRunning(); } //Q_EXPORT_PLUGIN2(platform_unix, PlatformUnix) void PlatformUnix::alterItem(CatItem* item) { if (!item->fullPath.endsWith(".desktop", Qt::CaseInsensitive)) return; QString locale = QLocale::system().name(); QFile file(item->fullPath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QString name = ""; QString icon = ""; QString exe = ""; while(!file.atEnd()) { QString line = file.readLine(); if (line.startsWith("Name[" + locale, Qt::CaseInsensitive)) name = line.split("=")[1].trimmed(); else if (line.startsWith("Name=", Qt::CaseInsensitive)) name = line.split("=")[1].trimmed(); else if (line.startsWith("Icon", Qt::CaseInsensitive)) icon = line.split("=")[1].trimmed(); else if (line.startsWith("Exec", Qt::CaseInsensitive)) exe = line.split("=")[1].trimmed(); } if (name.size() >= item->shortName.size() - 8) { item->shortName = name; item->lowName = item->shortName.toLower(); } // Don't index desktop items wthout icons if (icon.trimmed() == "") return; /* fill in some specifiers while we have the info */ exe.replace("%i", "--icon " + icon); exe.replace("%c", name); exe.replace("%k", item->fullPath); QStringList allExe = exe.trimmed().split(" ",QString::SkipEmptyParts); if (allExe.size() == 0 || allExe[0].size() == 0 ) return; exe = allExe[0]; allExe.removeFirst(); // exe = exe.trimmed().split(" ")[0]; /* if an absolute or relative path is supplied we can just skip this everything else should be checked to avoid picking up [unwanted] stuff from the working directory - if it doesnt exsist, use it anyway */ if(!exe.contains(QRegExp("^.?.?/"))){ foreach(QString line, QProcess::systemEnvironment()) { if (!line.startsWith("Path", Qt::CaseInsensitive)) continue; QStringList spl = line.split("="); QStringList spl2 = spl[1].split(":"); foreach(QString dir, spl2) { QString tmp = dir + "/" + exe; if (QFile::exists(tmp)) { exe = tmp; break; } } break; } } item->fullPath = exe + " " + allExe.join(" "); // Cache the icon for this desktop file //shared_ptr u(dynamic_pointer_cast(icons)); // shared_ptr u((UnixIconProvider*) icons.get()); //icon = u->getDesktopIcon(file.fileName(), icon); icon = ((UnixIconProvider*)icons)->getDesktopIcon(file.fileName(), icon); QFileInfo inf(icon); if (!inf.exists()) { qDebug() << "couldn't find icon for" << icon << item->fullPath; return; } item->icon = icon; file.close(); return; } QString PlatformUnix::expandEnvironmentVars(QString txt) { QStringList list = QProcess::systemEnvironment(); txt.replace('~', "$HOME$"); QString delim("$"); QString out = ""; int curPos = txt.indexOf(delim, 0); if (curPos == -1) return txt; while(curPos != -1) { int nextPos = txt.indexOf("$", curPos+1); if (nextPos == -1) { out += txt.mid(curPos+1); break; } QString var = txt.mid(curPos+1, nextPos-curPos-1); bool found = false; foreach(QString s, list) { if (s.startsWith(var, Qt::CaseInsensitive)) { found = true; out += s.mid(var.length()+1); break; } } if (!found) out += "$" + var; curPos = nextPos; } return out; } // Create the application object QApplication* createApplication(int& argc, char** argv) { return new PlatformUnix(argc, argv); } launchy-2.5/platforms/unix/platform_x11_hotkey.cpp0000644000175000017500000002306311121321532021440 0ustar monesmones/* * globalshortcutmanager_x11.cpp - X11 implementation of global shortcuts * Copyright (C) 2003-2007 Justin Karneges, Michail Pishchagin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "platform_x11_hotkey.h" X11KeyTriggerManager* X11KeyTriggerManager::instance_; class GlobalShortcutManager::KeyTrigger::Impl : public X11KeyTrigger { public: static bool failed; private: KeyTrigger* trigger_; int qkey_; struct GrabbedKey { int code; uint mod; }; QList grabbedKeys_; static int XGrabErrorHandler(Display *, XErrorEvent *) { qWarning("failed to grab key"); failed = true; return 0; } void bind(int keysym, unsigned int mod) { int code = XKeysymToKeycode(QX11Info::display(), keysym); // don't grab keys with empty code (because it means just the modifier key) if (keysym && !code) return; failed = false; XErrorHandler savedErrorHandler = XSetErrorHandler(XGrabErrorHandler); WId w = QX11Info::appRootWindow(); // qDebug() << "X11 hotkey says root is:" << w; foreach(long mask_mod, X11KeyTriggerManager::ignModifiersList()) { XGrabKey(QX11Info::display(), code, mod | mask_mod, w, False, GrabModeAsync, GrabModeAsync); GrabbedKey grabbedKey; grabbedKey.code = code; grabbedKey.mod = mod | mask_mod; grabbedKeys_ << grabbedKey; } XSync(QX11Info::display(), False); XSetErrorHandler(savedErrorHandler); } public: /** * Constructor registers the hotkey. */ Impl(GlobalShortcutManager::KeyTrigger* t, const QKeySequence& ks) : trigger_(t) , qkey_(ks) { X11KeyTriggerManager::instance()->addTrigger(this); X11KeyTriggerManager::Qt_XK_Keygroup kg; unsigned int mod; if (X11KeyTriggerManager::convertKeySequence(ks, &mod, &kg)) for (int n = 0; n < kg.num; ++n) bind(kg.sym[n], mod); } /** * Destructor unregisters the hotkey. */ ~Impl() { X11KeyTriggerManager::instance()->removeTrigger(this); // XUngrabKey(QX11Info::display(),AnyKey,AnyModifier,QX11Info::appRootWindow()); foreach(GrabbedKey key, grabbedKeys_) XUngrabKey(QX11Info::display(), key.code, key.mod, QX11Info::appRootWindow()); } void activate() { emit trigger_->activated(); } bool isAccepted(int qkey) const { return qkey_ == qkey; } }; bool GlobalShortcutManager::KeyTrigger::Impl::failed; long X11KeyTriggerManager::alt_mask = 0; long X11KeyTriggerManager::meta_mask = 0; long X11KeyTriggerManager::super_mask = 0; long X11KeyTriggerManager::hyper_mask = 0; long X11KeyTriggerManager::numlock_mask = 0; bool X11KeyTriggerManager::haveMods = false; X11KeyTriggerManager::Qt_XK_Keymap X11KeyTriggerManager::qt_xk_table[] = { { Qt::Key_Escape, {1, { XK_Escape }}}, { Qt::Key_Tab, {2, { XK_Tab, XK_KP_Tab }}}, { Qt::Key_Backtab, {1, { XK_ISO_Left_Tab }}}, { Qt::Key_Backspace, {1, { XK_BackSpace }}}, { Qt::Key_Return, {1, { XK_Return }}}, { Qt::Key_Enter, {1, { XK_KP_Enter }}}, { Qt::Key_Insert, {2, { XK_Insert, XK_KP_Insert }}}, { Qt::Key_Delete, {3, { XK_Delete, XK_KP_Delete, XK_Clear }}}, { Qt::Key_Pause, {1, { XK_Pause }}}, { Qt::Key_Print, {1, { XK_Print }}}, { Qt::Key_SysReq, {1, { XK_Sys_Req }}}, { Qt::Key_Clear, {1, { XK_KP_Begin }}}, { Qt::Key_Home, {2, { XK_Home, XK_KP_Home }}}, { Qt::Key_End, {2, { XK_End, XK_KP_End }}}, { Qt::Key_Left, {2, { XK_Left, XK_KP_Left }}}, { Qt::Key_Up, {2, { XK_Up, XK_KP_Up }}}, { Qt::Key_Right, {2, { XK_Right, XK_KP_Right }}}, { Qt::Key_Down, {2, { XK_Down, XK_KP_Down }}}, { Qt::Key_PageUp, {2, { XK_Prior, XK_KP_Prior }}}, { Qt::Key_PageDown, {2, { XK_Next, XK_KP_Next }}}, { Qt::Key_Shift, {3, { XK_Shift_L, XK_Shift_R, XK_Shift_Lock }}}, { Qt::Key_Control, {2, { XK_Control_L, XK_Control_R }}}, { Qt::Key_Meta, {2, { XK_Meta_L, XK_Meta_R }}}, { Qt::Key_Alt, {2, { XK_Alt_L, XK_Alt_R }}}, { Qt::Key_CapsLock, {1, { XK_Caps_Lock }}}, { Qt::Key_NumLock, {1, { XK_Num_Lock }}}, { Qt::Key_ScrollLock, {1, { XK_Scroll_Lock }}}, { Qt::Key_Space, {2, { XK_space, XK_KP_Space }}}, { Qt::Key_Equal, {2, { XK_equal, XK_KP_Equal }}}, { Qt::Key_Asterisk, {2, { XK_asterisk, XK_KP_Multiply }}}, { Qt::Key_Plus, {2, { XK_plus, XK_KP_Add }}}, { Qt::Key_Comma, {2, { XK_comma, XK_KP_Separator }}}, { Qt::Key_Minus, {2, { XK_minus, XK_KP_Subtract }}}, { Qt::Key_Period, {2, { XK_period, XK_KP_Decimal }}}, { Qt::Key_Slash, {2, { XK_slash, XK_KP_Divide }}}, { Qt::Key_F1, {1, { XK_F1 }}}, { Qt::Key_F2, {1, { XK_F2 }}}, { Qt::Key_F3, {1, { XK_F3 }}}, { Qt::Key_F4, {1, { XK_F4 }}}, { Qt::Key_F5, {1, { XK_F5 }}}, { Qt::Key_F6, {1, { XK_F6 }}}, { Qt::Key_F7, {1, { XK_F7 }}}, { Qt::Key_F8, {1, { XK_F8 }}}, { Qt::Key_F9, {1, { XK_F9 }}}, { Qt::Key_F10, {1, { XK_F10 }}}, { Qt::Key_F11, {1, { XK_F11 }}}, { Qt::Key_F12, {1, { XK_F12 }}}, { Qt::Key_F13, {1, { XK_F13 }}}, { Qt::Key_F14, {1, { XK_F14 }}}, { Qt::Key_F15, {1, { XK_F15 }}}, { Qt::Key_F16, {1, { XK_F16 }}}, { Qt::Key_F17, {1, { XK_F17 }}}, { Qt::Key_F18, {1, { XK_F18 }}}, { Qt::Key_F19, {1, { XK_F19 }}}, { Qt::Key_F20, {1, { XK_F20 }}}, { Qt::Key_F21, {1, { XK_F21 }}}, { Qt::Key_F22, {1, { XK_F22 }}}, { Qt::Key_F23, {1, { XK_F23 }}}, { Qt::Key_F24, {1, { XK_F24 }}}, { Qt::Key_F25, {1, { XK_F25 }}}, { Qt::Key_F26, {1, { XK_F26 }}}, { Qt::Key_F27, {1, { XK_F27 }}}, { Qt::Key_F28, {1, { XK_F28 }}}, { Qt::Key_F29, {1, { XK_F29 }}}, { Qt::Key_F30, {1, { XK_F30 }}}, { Qt::Key_F31, {1, { XK_F31 }}}, { Qt::Key_F32, {1, { XK_F32 }}}, { Qt::Key_F33, {1, { XK_F33 }}}, { Qt::Key_F34, {1, { XK_F34 }}}, { Qt::Key_F35, {1, { XK_F35 }}}, { Qt::Key_Super_L, {1, { XK_Super_L }}}, { Qt::Key_Super_R, {1, { XK_Super_R }}}, { Qt::Key_Menu, {1, { XK_Menu }}}, { Qt::Key_Hyper_L, {1, { XK_Hyper_L }}}, { Qt::Key_Hyper_R, {1, { XK_Hyper_R }}}, { Qt::Key_Help, {1, { XK_Help }}}, { Qt::Key_Direction_L, {0, { 0 }}}, { Qt::Key_Direction_R, {0, { 0 }}}, { Qt::Key_unknown, {0, { 0 }}}, }; GlobalShortcutManager::KeyTrigger::KeyTrigger(const QKeySequence& key) { d.reset(new Impl(this, key)); } GlobalShortcutManager::KeyTrigger::~KeyTrigger() { d.reset(); /* delete d; d = 0; */ } bool GlobalShortcutManager::KeyTrigger::isConnected() { if (!d) return false; return !GlobalShortcutManager::KeyTrigger::Impl::failed; } //typedef GlobalShortcutManager::KeyTrigger::Impl mytrigger; void X11KeyTriggerManager::xkeyPressed(XEvent* event) { // qDebug() << "Receieved key press!"; Display* dsp = QX11Info::display(); unsigned int mod = event->xkey.state & (meta_mask | ShiftMask | ControlMask | alt_mask); unsigned int keysym = XKeycodeToKeysym(dsp, event->xkey.keycode, 0); bool found = false; uint n = 0; for (n = 0; qt_xk_table[n].key != Qt::Key_unknown; ++n) { if ((unsigned int) qt_xk_table[n].xk.sym[0] == keysym) { found = true; break; } } if (!found) return; unsigned int keyout; keyout = qt_xk_table[n].key; if (mod & meta_mask) keyout |= Qt::META; if (mod & ShiftMask) keyout |= Qt::SHIFT; if (mod & ControlMask) keyout |= Qt::CTRL; if (mod & alt_mask) keyout |= Qt::ALT; // QKeySequence out(keyout); //qDebug() << mod << keysym << out; foreach(X11KeyTrigger* trigger, triggers_) { if (trigger->isAccepted(keyout)) { trigger->activate(); return; } } } launchy-2.5/platforms/unix/platform_unix_util.h0000644000175000017500000000100711335577622021147 0ustar monesmones#pragma once #include #include #include class UnixIconProvider : public QFileIconProvider { private: QHash file2mime; QHash mime2desktop; QHash desktop2icon; QHash icon2path; QStringList xdgDataDirs; public: UnixIconProvider(); ~UnixIconProvider() {} virtual QIcon icon(const QFileInfo& info); QString getDesktopIcon(QString desktopFile, QString IconName = ""); }; launchy-2.5/platforms/unix/platform_x11_hotkey.h0000644000175000017500000002126111121321532021103 0ustar monesmones#pragma once #include "platform_base_hotkey.h" #include "platform_base_hottrigger.h" #include #include #include //#include #include #include #include #include #include #include "platform_x11_hotkey.h" #include using namespace boost; #ifdef KeyPress // defined by X11 headers const int XKeyPress = KeyPress; const int XKeyRelease = KeyRelease; #undef KeyPress #endif class X11KeyTrigger { public: virtual ~X11KeyTrigger() {} virtual void activate() = 0; virtual bool isAccepted(int qkey) const = 0; }; class X11KeyTriggerManager : public QObject { Q_OBJECT public: static X11KeyTriggerManager* instance() { if(!instance_) instance_ = new X11KeyTriggerManager(); return instance_; } void addTrigger(X11KeyTrigger* trigger) { triggers_ << trigger; } void removeTrigger(X11KeyTrigger* trigger) { triggers_.removeAll(trigger); } struct Qt_XK_Keygroup { char num; int sym[3]; }; protected: // reimplemented bool eventFilter(QObject* o, QEvent* e) { if(e->type() == QEvent::KeyPress) { QKeyEvent* k = static_cast(e); int qkey = k->key(); if (k->modifiers() & Qt::ShiftModifier) qkey |= Qt::SHIFT; if (k->modifiers() & Qt::ControlModifier) qkey |= Qt::CTRL; if (k->modifiers() & Qt::AltModifier) qkey |= Qt::ALT; if (k->modifiers() & Qt::MetaModifier) qkey |= Qt::META; foreach(X11KeyTrigger* trigger, triggers_) { if (trigger->isAccepted(qkey)) { trigger->activate(); return true; } } } return QObject::eventFilter(o, e); } public slots: void xkeyPressed(XEvent*); private: X11KeyTriggerManager() : QObject(QCoreApplication::instance()) { // This does't always catch hotkeys if the app hasn't had mouse // attention yet, so I built the xkeypressed system instead which // monitors x11events as opposed to qt events //qApp->installEventFilter(this); connect(qApp, SIGNAL(xkeyPressed(XEvent*)), this, SLOT(xkeyPressed(XEvent*))); } static X11KeyTriggerManager* instance_; QList triggers_; private: struct Qt_XK_Keymap { int key; Qt_XK_Keygroup xk; }; static Qt_XK_Keymap qt_xk_table[]; static long alt_mask; static long meta_mask; static long super_mask; static long hyper_mask; static long numlock_mask; static bool haveMods; // adapted from qapplication_x11.cpp static void ensureModifiers() { if (haveMods) return; Display* appDpy = QX11Info::display(); XModifierKeymap* map = XGetModifierMapping(appDpy); if (map) { // XKeycodeToKeysym helper code adapeted from xmodmap int min_keycode, max_keycode, keysyms_per_keycode = 1; XDisplayKeycodes (appDpy, &min_keycode, &max_keycode); XFree(XGetKeyboardMapping (appDpy, min_keycode, (max_keycode - min_keycode + 1), &keysyms_per_keycode)); int i, maskIndex = 0, mapIndex = 0; for (maskIndex = 0; maskIndex < 8; maskIndex++) { for (i = 0; i < map->max_keypermod; i++) { if (map->modifiermap[mapIndex]) { KeySym sym; int symIndex = 0; do { sym = XKeycodeToKeysym(appDpy, map->modifiermap[mapIndex], symIndex); symIndex++; } while ( !sym && symIndex < keysyms_per_keycode); if (alt_mask == 0 && (sym == XK_Alt_L || sym == XK_Alt_R)) { alt_mask = 1 << maskIndex; } if (meta_mask == 0 && (sym == XK_Meta_L || sym == XK_Meta_R)) { meta_mask = 1 << maskIndex; } if (super_mask == 0 && (sym == XK_Super_L || sym == XK_Super_R)) { super_mask = 1 << maskIndex; } if (hyper_mask == 0 && (sym == XK_Hyper_L || sym == XK_Hyper_R)) { hyper_mask = 1 << maskIndex; } if (numlock_mask == 0 && (sym == XK_Num_Lock)) { numlock_mask = 1 << maskIndex; } } mapIndex++; } } XFreeModifiermap(map); // logic from qt source see gui/kernel/qkeymapper_x11.cpp if (meta_mask == 0 || meta_mask == alt_mask) { // no meta keys... s,meta,super, meta_mask = super_mask; if (meta_mask == 0 || meta_mask == alt_mask) { // no super keys either? guess we'll use hyper then meta_mask = hyper_mask; } } } else { // assume defaults alt_mask = Mod1Mask; meta_mask = Mod4Mask; } haveMods = true; } public: static bool convertKeySequence(const QKeySequence& ks, unsigned int* _mod, Qt_XK_Keygroup* _kg) { int code = ks; ensureModifiers(); unsigned int mod = 0; if (code & Qt::META) mod |= meta_mask; if (code & Qt::SHIFT) mod |= ShiftMask; if (code & Qt::CTRL) mod |= ControlMask; if (code & Qt::ALT) mod |= alt_mask; Qt_XK_Keygroup kg; kg.num = 0; kg.sym[0] = 0; code &= ~Qt::KeyboardModifierMask; bool found = false; for (int n = 0; qt_xk_table[n].key != Qt::Key_unknown; ++n) { if (qt_xk_table[n].key == code) { kg = qt_xk_table[n].xk; found = true; break; } } if (!found) { // try latin1 if (code >= 0x20 && code <= 0x7f) { kg.num = 1; kg.sym[0] = code; } } if (!kg.num) return false; if (_mod) *_mod = mod; if (_kg) *_kg = kg; return true; } static QList ignModifiersList() { QList ret; if (numlock_mask) { ret << 0 << LockMask << numlock_mask << (LockMask | numlock_mask); } else { ret << 0 << LockMask; } return ret; } }; launchy-2.5/platforms/unix/platform_unix_util.cpp0000644000175000017500000001043611335577622021510 0ustar monesmones#include "platform_unix_util.h" #include #include #include #include #include UnixIconProvider::UnixIconProvider() { foreach(QString line, QProcess::systemEnvironment()) { if (!line.startsWith("XDG_DATA_DIRS", Qt::CaseInsensitive)) continue; QStringList spl = line.split("="); xdgDataDirs = spl[1].split(":"); } xdgDataDirs += "/usr/share/icons/"; } QIcon UnixIconProvider::icon(const QFileInfo& info) { QString name = info.fileName(); if (name.endsWith(".png", Qt::CaseInsensitive)) return QIcon(info.absoluteFilePath()); if (name.endsWith(".ico", Qt::CaseInsensitive)) return QIcon(info.absoluteFilePath()); if (!name.contains(".")) return QFileIconProvider::icon(QFileIconProvider::File); QString end = name.mid(name.lastIndexOf(".")+1); if (!file2mime.contains(end.toLower())) { QProcess proc; QStringList args; args += "query"; args += "filetype"; args += info.absoluteFilePath(); proc.setReadChannel(QProcess::StandardOutput); proc.start(QString("xdg-mime"), args); proc.waitForFinished(10000); QString mimeType = proc.readAll().trimmed(); proc.close(); file2mime.insert(end.toLower(), mimeType); } QString mimeType = file2mime[end.toLower()]; if (!mime2desktop.contains(mimeType)) { QProcess proc2; QStringList args; args += "query"; args += "default"; args += mimeType; proc2.start(QString("xdg-mime"),args); proc2.waitForFinished(10000); QString desk = proc2.readAll().trimmed(); proc2.close(); mime2desktop[mimeType] = desk; } QString desktop = mime2desktop[mimeType]; if (desktop == "") return QFileIconProvider::icon(QFileIconProvider::File); return QIcon(getDesktopIcon(desktop)); } QString UnixIconProvider::getDesktopIcon(QString desktopFile, QString IconName) { if (QFile::exists(desktopFile)) desktopFile = desktopFile.mid(desktopFile.lastIndexOf("/")+1); if (desktopFile.contains("dolphin")) { int x = 1; x += 1; } if (desktop2icon.contains(desktopFile) && IconName == "") IconName = desktop2icon[desktopFile]; if (IconName == "") { const char *dirs[] = { "/usr/share/applications/", "/usr/local/share/applications/", "/usr/share/gdm/applications/", "/usr/share/applications/kde/", "~/.local/share/applications/"}; for(int i = 0; i < 5; i++) { QString dir = dirs[i]; QString path = dir + "/" + desktopFile; if (QFile::exists(path)) { QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return ""; while(!file.atEnd()) { QString line = file.readLine(); if (line.startsWith("Icon", Qt::CaseInsensitive)) { desktop2icon[desktopFile] = line.split("=")[1].trimmed(); } } break; } } } if (IconName == "") IconName = desktop2icon[desktopFile]; if (IconName == "") return ""; // Find the icon path QString iconPath; if (icon2path.contains(IconName)) { iconPath = icon2path[IconName]; } else if (QFile::exists(IconName)) { iconPath = IconName; } else { QStringList inames; if (IconName.endsWith(".png") || IconName.endsWith(".xpm") || IconName.endsWith(".svg")) inames += IconName; else { inames += IconName + ".png"; inames += IconName + ".xpm"; inames += IconName + ".svg"; } bool ifound = false; QStringList themes; themes += "/hicolor/32x32"; themes += "/hicolor/48x48"; themes += "/hicolor/64x64"; themes += "/oxygen/32x32"; themes += "/gnome/32x32"; QStringList dirs; dirs += QDir::homePath() + "/.icons" + themes[0]; foreach(QString dir, xdgDataDirs) { foreach(QString thm, themes) { dirs += dir + "/icons" + thm; } } dirs += "/usr/share/pixmaps"; foreach(QString dir, dirs) { QDir d(dir); QStringList sdirs; if (!dir.endsWith("pixmaps")) sdirs = d.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); sdirs += "."; foreach (QString subdir, sdirs) { foreach(QString iname, inames) { if (QFile::exists(dir + "/" + subdir + "/" + iname)) { iconPath = dir + "/" + subdir + "/" + iname; icon2path[IconName] = iconPath; ifound = true; break; } } } if (ifound) break; } } return iconPath; } launchy-2.5/platforms/unix/platform_unix.h0000644000175000017500000000607411336047270020113 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2008 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #pragma once #include "platform_unix_util.h" #include "platform_base.h" #include "platform_base_hotkey.h" #include "platform_base_hottrigger.h" #include #include #include #include using namespace boost; /* This QAPP scans all x events for keypresses and sends them off to the hotkey manager */ /* class MyApp : public QApplication { Q_OBJECT public: MyApp(int argc, char** argv) : QApplication(argc,argv) {} bool x11EventFilter ( XEvent * event ) { if (event->type == KeyPress) { emit xkeyPressed(event); } return false; } signals: void xkeyPressed(XEvent*); }; */ class PlatformUnix : public PlatformBase { Q_OBJECT bool x11EventFilter ( XEvent * event ) { if (event->type == KeyPress) { emit xkeyPressed(event); } return false; } QKeySequence oldKey; public: PlatformUnix(int & argc, char** argv); ~PlatformUnix(); void setPreferredIconSize(int size) { size = size; return; } //virtual shared_ptr init(int & argc, char** argv); // Mandatory functions // Mandatory functions bool setHotkey(const QKeySequence& key, QObject* receiver, const char* slot) { GlobalShortcutManager::disconnect(oldKey, receiver, slot); GlobalShortcutManager::connect(key, receiver, slot); oldKey = key; qDebug() << key << GlobalShortcutManager::isConnected(key); return GlobalShortcutManager::isConnected(key); } QKeySequence getHotkey() const { return oldKey; } QString GetSettingsDirectory() { return ""; } QList getDefaultCatalogDirectories(); void AddToNotificationArea() {}; void RemoveFromNotificationArea() {}; bool isAlreadyRunning() const { return false; } virtual QHash > getDirectories(); virtual QString expandEnvironmentVars(QString txt); bool supportsAlphaBorder() const; /* QIcon icon(const QFileInfo& info) { shared_ptr u(dynamic_pointer_cast(icons)); return u->getIcon(info); // return ((UnixIconProvider*) icons.get())->getIcon(info); } */ virtual void alterItem(CatItem*); signals: void xkeyPressed(XEvent*); }; launchy-2.5/platforms/win/0000755000175000017500000000000011355776633014673 5ustar monesmoneslaunchy-2.5/platforms/win/platform_win_hotkey.cpp0000644000175000017500000002460411350216201021440 0ustar monesmones/* * globalshortcutmanager_win.cpp - Windows implementation of global shortcuts * Copyright (C) 2003-2006 Justin Karneges, Maciej Niedzielski * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ /* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "platform_base_hotkey.h" #include "platform_Base_hottrigger.h" HHOOK keyboardHook; HWND widgetWinId; UINT mod, key; HINSTANCE GetHInstance() { MEMORY_BASIC_INFORMATION mbi; TCHAR szModule[MAX_PATH]; SetLastError(ERROR_SUCCESS); if (VirtualQuery(GetHInstance,&mbi,sizeof(mbi))) { if (GetModuleFileName((HINSTANCE)mbi.AllocationBase, szModule, sizeof(szModule))) { return (HINSTANCE)mbi.AllocationBase; } } return NULL; } LRESULT CALLBACK KeyboardHookProc(INT nCode, WPARAM wParam, LPARAM lParam) { // By returning a non-zero value from the hook procedure, the // message does not get passed to the target window switch (nCode) { case HC_ACTION: { KBDLLHOOKSTRUCT* event = (KBDLLHOOKSTRUCT*)lParam; if (widgetWinId && (event->flags & LLKHF_UP) == 0 && event->vkCode == key) { if ( (((mod & MOD_CONTROL) != 0) == (GetAsyncKeyState(VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1))) && (((mod & MOD_SHIFT) != 0) == (GetAsyncKeyState(VK_SHIFT) >> ((sizeof(SHORT) * 8) - 1))) && (((mod & MOD_ALT) != 0) == (GetAsyncKeyState(VK_MENU) >> ((sizeof(SHORT) * 8) - 1))) && (((mod & MOD_WIN) != 0) == (GetAsyncKeyState(VK_LWIN) >> ((sizeof(SHORT) * 8) - 1))) && (((mod & MOD_WIN) != 0) == (GetAsyncKeyState(VK_RWIN) >> ((sizeof(SHORT) * 8) - 1))) ) { PostMessage(widgetWinId, WM_USER, 0, 0); return 1; } } } } return CallNextHookEx(keyboardHook, nCode, wParam, lParam); } class GlobalShortcutManager::KeyTrigger::Impl : public QWidget { public: bool connected; /** * Constructor registers the hotkey. */ Impl(GlobalShortcutManager::KeyTrigger* t, const QKeySequence& ks) : trigger_(t) , id_(0) , connected(false) { widgetWinId = winId(); if (convertKeySequence(ks, &mod, &key)) { switch (key) { case VK_CAPITAL: case VK_SCROLL: if (!keyboardHook) { // Turn off capslock or scroll lock if they're on and we're not already // hooked. Nobody wants capslock turned on permanently do they? if (GetKeyState(VK_CAPITAL) == 1) { keybd_event(VK_CAPITAL, 0, 0, 0 ); keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0 ); } } case VK_NUMLOCK: if (!keyboardHook) keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, GetHInstance(), 0); if (keyboardHook) connected = true; break; default: if (RegisterHotKey(winId(), nextId, mod, key)) { id_ = nextId++; connected = true; } break; } } } /** * Destructor unregisters the hotkey. */ ~Impl() { widgetWinId = NULL; if (keyboardHook) { UnhookWindowsHookEx(keyboardHook); keyboardHook = NULL; connected = false; } else if (id_) { UnregisterHotKey(winId(), id_); connected = false; } } /** * Triggers activated() signal when the hotkey is activated. */ bool winEvent(MSG* m, long* result) { if ((m->message == WM_HOTKEY && m->wParam == id_) || m->message == WM_USER) { emit trigger_->activated(); return true; } return QWidget::winEvent(m, result); } private: KeyTrigger* trigger_; int id_; static int nextId; private: struct Qt_VK_Keymap { int key; UINT vk; }; static Qt_VK_Keymap qt_vk_table[]; static bool convertKeySequence(const QKeySequence& ks, UINT* mod_, UINT* key_) { int code = ks; // JK: I had to put the code -='s here and comment out code &= 0xffff // to correctly identify the action key UINT mod = 0; if (code & Qt::META) { mod |= MOD_WIN; code -= Qt::META; } if (code & Qt::SHIFT) { mod |= MOD_SHIFT; code -= Qt::SHIFT; } if (code & Qt::CTRL) { mod |= MOD_CONTROL; code -= Qt::CTRL; } if (code & Qt::ALT) { mod |= MOD_ALT; code -= Qt::ALT; } UINT key = 0; // code &= 0xffff; // Some keys map to ASCII keycodes if (code == 0x20 || (code >= 0x30 && code <= 0x39) || (code > 0x40 && code <= 0x5a) || (code > 0x60 && code <= 0x7a)) key = code; else { // Others require lookup from a keymap for (int n = 0; qt_vk_table[n].key != Qt::Key_unknown; ++n) { if (qt_vk_table[n].key == code) { key = qt_vk_table[n].vk; break; } } if (!key) return false; } *mod_ = mod; if (key) *key_ = key; return true; } }; GlobalShortcutManager::KeyTrigger::Impl::Qt_VK_Keymap GlobalShortcutManager::KeyTrigger::Impl::qt_vk_table[] = { { Qt::Key_Escape, VK_ESCAPE }, { Qt::Key_Tab, VK_TAB }, { Qt::Key_Backtab, 0 }, { Qt::Key_Backspace, VK_BACK }, { Qt::Key_Return, VK_RETURN }, { Qt::Key_Enter, VK_RETURN }, { Qt::Key_Insert, VK_INSERT }, { Qt::Key_Delete, VK_DELETE }, { Qt::Key_Pause, VK_PAUSE }, { Qt::Key_Print, VK_SNAPSHOT }, { Qt::Key_SysReq, 0 }, { Qt::Key_Clear, VK_CLEAR }, { Qt::Key_Home, VK_HOME }, { Qt::Key_End, VK_END }, { Qt::Key_Left, VK_LEFT }, { Qt::Key_Up, VK_UP }, { Qt::Key_Right, VK_RIGHT }, { Qt::Key_Down, VK_DOWN }, { Qt::Key_PageUp, VK_PRIOR }, { Qt::Key_PageDown, VK_NEXT }, { Qt::Key_Shift, VK_SHIFT }, { Qt::Key_Control, VK_CONTROL }, { Qt::Key_Meta, VK_LWIN }, { Qt::Key_Alt, VK_MENU }, { Qt::Key_CapsLock, VK_CAPITAL }, { Qt::Key_NumLock, VK_NUMLOCK }, { Qt::Key_ScrollLock, VK_SCROLL }, { Qt::Key_F1, VK_F1 }, { Qt::Key_F2, VK_F2 }, { Qt::Key_F3, VK_F3 }, { Qt::Key_F4, VK_F4 }, { Qt::Key_F5, VK_F5 }, { Qt::Key_F6, VK_F6 }, { Qt::Key_F7, VK_F7 }, { Qt::Key_F8, VK_F8 }, { Qt::Key_F9, VK_F9 }, { Qt::Key_F10, VK_F10 }, { Qt::Key_F11, VK_F11 }, { Qt::Key_F12, VK_F12 }, { Qt::Key_F13, VK_F13 }, { Qt::Key_F14, VK_F14 }, { Qt::Key_F15, VK_F15 }, { Qt::Key_F16, VK_F16 }, { Qt::Key_F17, VK_F17 }, { Qt::Key_F18, VK_F18 }, { Qt::Key_F19, VK_F19 }, { Qt::Key_F20, VK_F20 }, { Qt::Key_F21, VK_F21 }, { Qt::Key_F22, VK_F22 }, { Qt::Key_F23, VK_F23 }, { Qt::Key_F24, VK_F24 }, { Qt::Key_F25, 0 }, { Qt::Key_F26, 0 }, { Qt::Key_F27, 0 }, { Qt::Key_F28, 0 }, { Qt::Key_F29, 0 }, { Qt::Key_F30, 0 }, { Qt::Key_F31, 0 }, { Qt::Key_F32, 0 }, { Qt::Key_F33, 0 }, { Qt::Key_F34, 0 }, { Qt::Key_F35, 0 }, { Qt::Key_Super_L, 0 }, { Qt::Key_Super_R, 0 }, { Qt::Key_Menu, 0 }, { Qt::Key_Hyper_L, 0 }, { Qt::Key_Hyper_R, 0 }, { Qt::Key_Help, 0 }, { Qt::Key_Direction_L, 0 }, { Qt::Key_Direction_R, 0 }, { Qt::Key_QuoteLeft, VK_OEM_8 }, { Qt::Key_Minus, VK_OEM_MINUS }, { Qt::Key_Equal, VK_OEM_PLUS }, { Qt::Key_BracketLeft, VK_OEM_4 }, { Qt::Key_BracketRight,VK_OEM_6 }, { Qt::Key_Semicolon, VK_OEM_1 }, { Qt::Key_Apostrophe, VK_OEM_3 }, { Qt::Key_NumberSign, VK_OEM_7 }, { Qt::Key_Backslash, VK_OEM_5 }, { Qt::Key_Comma, VK_OEM_COMMA }, { Qt::Key_Period, VK_OEM_PERIOD }, { Qt::Key_Slash, VK_OEM_2 }, { Qt::Key_unknown, 0 }, }; int GlobalShortcutManager::KeyTrigger::Impl::nextId = 1; GlobalShortcutManager::KeyTrigger::KeyTrigger(const QKeySequence& key) { d.reset(new Impl(this, key)); } GlobalShortcutManager::KeyTrigger::~KeyTrigger() { /* delete d; d = 0; */ } bool GlobalShortcutManager::KeyTrigger::isConnected() { if (!d) return false; return d->connected; }launchy-2.5/platforms/win/win.sln0000644000175000017500000000154610752201646016177 0ustar monesmones Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win", "win.vcproj", "{E8D4049F-8453-4609-9F5E-66D6E254A618}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E8D4049F-8453-4609-9F5E-66D6E254A618}.Debug|Win32.ActiveCfg = Debug|Win32 {E8D4049F-8453-4609-9F5E-66D6E254A618}.Debug|Win32.Build.0 = Debug|Win32 {E8D4049F-8453-4609-9F5E-66D6E254A618}.Release|Win32.ActiveCfg = Release|Win32 {E8D4049F-8453-4609-9F5E-66D6E254A618}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal launchy-2.5/platforms/win/readme.txt0000644000175000017500000000201410752201646016651 0ustar monesmones======================================================================== MAKEFILE PROJECT : win Project Overview ======================================================================== AppWizard has created this win project for you. This file contains a summary of what you will find in each of the files that make up your win project. win.vcproj This is the main project file for VC++ projects generated using an Application Wizard. It contains information about the version of Visual C++ that generated the file, and information about the platforms, configurations, and project features selected with the Application Wizard. This project allows you to build/clean/rebuild from within Visual Studio by calling the commands you have input in the wizard. The build command can be nmake or any other tool you use. This project does not contain any files, so there are none displayed in Solution Explorer. ///////////////////////////////////////////////////////////////////////////// launchy-2.5/platforms/win/platform_win_util.cpp0000644000175000017500000000630211347000533021112 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "platform_win.h" #include "globals.h" #include "main.h" // Replace this process' environment with the current system environment void UpdateEnvironment() { // Fetch the current environment for the user HANDLE accessToken; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &accessToken)) return; wchar_t* environment; if (!CreateEnvironmentBlock((LPVOID*)&environment, accessToken, FALSE)) return; // Empty the current environment QStringList variables; wchar_t* currentEnvironment = GetEnvironmentStrings(); for (TCHAR* p = currentEnvironment; *p != 0;) { QString variable = QString::fromUtf16(p); QString name = variable.section("=", 0, 0); // Ignore entries for drive current directory entries that have no name if (name.size() > 0) variables.append(name); p += wcslen(p) + 1; } if (currentEnvironment) FreeEnvironmentStrings(currentEnvironment); // Now we've finished enumerating the current environment, we can safely delete variables foreach (QString name, variables) { SetEnvironmentVariable(name.utf16(), NULL); } // Recreate the environment using the fresh system copy for (wchar_t* p = environment; *p != 0;) { wchar_t* name = p; wchar_t* value = wcschr(p, L'='); p += wcslen(p) + 1; if (value) { *value = L'\0'; SetEnvironmentVariable(name, value + 1); } } DestroyEnvironmentBlock(environment); CloseHandle(accessToken); } QString GetShellDirectory(int type) { wchar_t buffer[_MAX_PATH]; SHGetFolderPath(NULL, type, NULL, 0, buffer); return QString::fromUtf16(buffer); } bool EnumerateNetworkServers(QList& items, DWORD serverType, const wchar_t* domain) { SERVER_INFO_100* serverInfo = 0; DWORD read, totalOnNetwork; NET_API_STATUS result = NetServerEnum(NULL, 100, (BYTE**)&serverInfo, MAX_PREFERRED_LENGTH, &read, &totalOnNetwork, serverType, domain, 0); if (result == NERR_Success) { for (DWORD i = 0; i < read; ++i) { QString name = QString::fromUtf16((ushort*)serverInfo[i].sv100_name); items.push_back(name); } } // Possible error codes // ERROR_ACCESS_DENIED: "The user does not have access to the requested information." // NERR_InvalidComputer: "The computer name is invalid." // ERROR_NO_BROWSER_SERVERS_FOUND: "No browser servers found." // ERROR_MORE_DATA: "More entries are available with subsequent calls." if (serverInfo) { NetApiBufferFree((void*)serverInfo); } return result == NERR_Success; } launchy-2.5/platforms/win/win.vcproj0000644000175000017500000000610611252675232016705 0ustar monesmones launchy-2.5/platforms/win/WinIconProvider.cpp0000644000175000017500000001640211347000533020437 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "platform_win_util.h" #include "WinIconProvider.h" // Temporary work around to avoid having to install the latest Windows SDK #ifndef __IShellItemImageFactory_INTERFACE_DEFINED__ #define __IShellItemImageFactory_INTERFACE_DEFINED__ #define SHIL_JUMBO 0x4 /* IShellItemImageFactory::GetImage() flags */ enum _SIIGB { SIIGBF_RESIZETOFIT = 0x00000000, SIIGBF_BIGGERSIZEOK = 0x00000001, SIIGBF_MEMORYONLY = 0x00000002, SIIGBF_ICONONLY = 0x00000004, SIIGBF_THUMBNAILONLY = 0x00000008, SIIGBF_INCACHEONLY = 0x00000010 }; typedef int SIIGBF; const GUID IID_IShellItemImageFactory = {0xbcc18b79,0xba16,0x442f,{0x80,0xc4,0x8a,0x59,0xc3,0x0c,0x46,0x3b}}; class IShellItemImageFactory : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetImage(SIZE size, SIIGBF flags, /*__RPC__deref_out_opt*/ HBITMAP *phbm) = 0; }; #endif HRESULT (WINAPI* fnSHCreateItemFromParsingName)(PCWSTR, IBindCtx *, REFIID, void **) = NULL; WinIconProvider::WinIconProvider() : preferredSize(32) { // Load Vista/7 specific API pointers HMODULE hLib = GetModuleHandleW(L"shell32"); if (hLib) { (FARPROC&)fnSHCreateItemFromParsingName = GetProcAddress(hLib, "SHCreateItemFromParsingName"); } } WinIconProvider::~WinIconProvider() { } void WinIconProvider::setPreferredIconSize(int size) { preferredSize = size; } // This also exists in plugin_interface, need to remove both if I make a 64 build QString wicon_aliasTo64(QString path) { QProcessEnvironment env = QProcessEnvironment::systemEnvironment (); QString pf32 = env.value("PROGRAMFILES"); QString pf64 = env.value("PROGRAMW6432"); // On 64 bit windows, 64 bit shortcuts don't resolve correctly from 32 bit executables, fix it here QFileInfo pInfo(path); if (env.contains("PROGRAMW6432") && pInfo.isSymLink() && pf32 != pf64) { if (QDir::toNativeSeparators(pInfo.symLinkTarget()).contains(pf32)) { QString path64 = QDir::toNativeSeparators(pInfo.symLinkTarget()); path64.replace(pf32, pf64); if (QFileInfo(path64).exists()) { path = path64; } } else if (pInfo.symLinkTarget().contains("system32")) { QString path32 = QDir::toNativeSeparators(pInfo.symLinkTarget()); if (!QFileInfo(path32).exists()) { path = path32.replace("system32", "sysnative"); } } } return path; } QIcon WinIconProvider::icon(const QFileInfo& info) const { QIcon retIcon; QString fileExtension = info.suffix().toLower(); if (fileExtension == "png" || fileExtension == "bmp" || fileExtension == "jpg" || fileExtension == "jpeg") { retIcon = QIcon(info.filePath()); } else if (fileExtension == "cpl") { HICON hIcon; QString filePath = QDir::toNativeSeparators(info.filePath()); ExtractIconEx(filePath.utf16(), 0, &hIcon, NULL, 1); retIcon = QIcon(QPixmap::fromWinHICON(hIcon)); DestroyIcon(hIcon); } else { // This 64 bit mapping needs to go away if we produce a 64 bit build of launchy QString filePath = wicon_aliasTo64(QDir::toNativeSeparators(info.filePath())); // Get the icon index using SHGetFileInfo SHFILEINFO sfi = {0}; // To avoid network hangs, explicitly fetch the My Computer icon for UNCs QRegExp re("\\\\\\\\([a-z]+\\\\?)?$", Qt::CaseInsensitive); SHGetFileInfo(re.exactMatch(filePath) ? L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" : filePath.utf16(), 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX); // An icon index of 3 is the generic file icon if (sfi.iIcon > 0 && sfi.iIcon != 3) { // Retrieve the system image list. // To get the 48x48 icons, use SHIL_EXTRALARGE // To get the 256x256 icons (Vista only), use SHIL_JUMBO int imageListIndex; if (preferredSize <= 16) imageListIndex = SHIL_SMALL; else if (preferredSize <= 32) imageListIndex = SHIL_LARGE; else if (preferredSize <= 48) imageListIndex = SHIL_EXTRALARGE; else imageListIndex = SHIL_JUMBO; // If the OS supports SHCreateItemFromParsingName, get a 256x256 icon if (!addIconFromShellFactory(filePath, retIcon)) { // otherwise get the largest appropriate size if (!addIconFromImageList(imageListIndex, sfi.iIcon, retIcon) && imageListIndex == SHIL_JUMBO) addIconFromImageList(SHIL_EXTRALARGE, sfi.iIcon, retIcon); } // Ensure there's also a 32x32 icon - extralarge and above often only contain // a large frame with the 32x32 icon in the middle or looks blurry if (imageListIndex == SHIL_EXTRALARGE || imageListIndex == SHIL_JUMBO) addIconFromImageList(SHIL_LARGE, sfi.iIcon, retIcon); } else if (info.isSymLink() || fileExtension == "lnk") // isSymLink is case sensitive when it perhaps shouldn't be { QFileInfo targetInfo(info.symLinkTarget()); retIcon = icon(targetInfo); } else { retIcon = QFileIconProvider::icon(info); } } return retIcon; } bool WinIconProvider::addIconFromImageList(int imageListIndex, int iconIndex, QIcon& icon) const { HICON hIcon = 0; IImageList* imageList; HRESULT hResult = SHGetImageList(imageListIndex, IID_IImageList, (void**)&imageList); if (hResult == S_OK) { hResult = ((IImageList*)imageList)->GetIcon(iconIndex, ILD_TRANSPARENT, &hIcon); imageList->Release(); } if (hResult == S_OK && hIcon) { icon.addPixmap(QPixmap::fromWinHICON(hIcon)); DestroyIcon(hIcon); } return SUCCEEDED(hResult); } // On Vista or 7 we could use SHIL_JUMBO to get a 256x256 icon, // but we'll use SHCreateItemFromParsingName as it'll give an identical // icon to the one shown in explorer and it scales automatically. bool WinIconProvider::addIconFromShellFactory(QString filePath, QIcon& icon) const { HRESULT hr = S_FALSE; if (fnSHCreateItemFromParsingName) { IShellItem* psi = NULL; hr = fnSHCreateItemFromParsingName(filePath.utf16(), 0, IID_IShellItem, (void**)&psi); if (hr == S_OK) { IShellItemImageFactory* psiif = NULL; hr = psi->QueryInterface(IID_IShellItemImageFactory, (void**)&psiif); if (hr == S_OK) { HBITMAP iconBitmap = NULL; SIZE iconSize = {preferredSize, preferredSize}; hr = psiif->GetImage(iconSize, SIIGBF_RESIZETOFIT | SIIGBF_ICONONLY, &iconBitmap); if (hr == S_OK) { QPixmap iconPixmap = QPixmap::fromWinHBITMAP(iconBitmap, QPixmap::PremultipliedAlpha); icon.addPixmap(iconPixmap); DeleteObject(iconBitmap); } psiif->Release(); } psi->Release(); } } return hr == S_OK; } launchy-2.5/platforms/win/platform_win.h0000644000175000017500000000316211351723001017520 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PLATFORM_WIN #define PLATFORM_WIN #include "platform_base.h" #include "platform_win_util.h" #include "platform_base_hotkey.h" class PlatformWin : public PlatformBase { Q_OBJECT public: PlatformWin(int& argc, char** argv); ~PlatformWin(); virtual void setPreferredIconSize(int size); virtual QKeySequence getHotkey() const; virtual bool setHotkey(const QKeySequence& newHotkey, QObject* receiver, const char* slot); virtual QHash > getDirectories(); virtual QList getDefaultCatalogDirectories(); virtual QString expandEnvironmentVars(QString); virtual bool supportsAlphaBorder() const; virtual bool isAlreadyRunning() const; virtual void sendInstanceCommand(int command); virtual bool getComputers(QList& computers) const; private: HANDLE localMutex, globalMutex; LimitSingleInstance* instance; }; #endif launchy-2.5/platforms/win/platform_win_util.h0000644000175000017500000000324111260516646020571 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __PLATFORM_WIN_UTIL_H #define __PLATFORM_WIN_UTIL_H void UpdateEnvironment(); QString GetShellDirectory(int type); bool EnumerateNetworkServers(QList& items, DWORD serverType, const wchar_t* domain = NULL); class LimitSingleInstance { public: LimitSingleInstance(TCHAR *strMutexName) { //Make sure that you use a name that is unique for this application otherwise //two apps may think they are the same if they are using same name for //3rd parm to CreateMutex mutex = CreateMutex(NULL, FALSE, strMutexName); //do early lastError = GetLastError(); //save for use later... } ~LimitSingleInstance() { if (mutex) //Do not forget to close handles. { CloseHandle(mutex); //Do as late as possible. mutex = NULL; //Good habit to be in. } } bool IsAnotherInstanceRunning() { return (ERROR_ALREADY_EXISTS == lastError); } private: HANDLE mutex; DWORD lastError; }; #endif launchy-2.5/platforms/win/platform_win.cpp0000644000175000017500000001241111351723001020050 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "main.h" #include "platform_win.h" #include "WinIconProvider.h" // Override the main widget to handle incoming system messages. We could have done this in the QApplication // event handler, but then we'd have to filter out the duplicates for messages like WM_SETTINGCHANGE. class LaunchyWidgetWin : public LaunchyWidget { public: LaunchyWidgetWin(CommandFlags command) : LaunchyWidget(command) { commandMessageId = RegisterWindowMessage(_T("LaunchyCommand")); } virtual bool winEvent(MSG* msg, long* result) { switch (msg->message) { case WM_SETTINGCHANGE: // Refresh Launchy's environment on settings changes if (msg->lParam && _tcscmp((TCHAR*)msg->lParam, _T("Environment")) == 0) { UpdateEnvironment(); } break; // Might need to capture these two messages if Vista gives any problems with alpha borders // when restoring from standby case WM_POWERBROADCAST: break; case WM_WTSSESSION_CHANGE: break; default: if (msg->message == commandMessageId) { // A Launchy startup command executeStartupCommand(msg->wParam); } break; } return LaunchyWidget::winEvent(msg, result); } private: UINT commandMessageId; }; // Create the main widget for the application LaunchyWidget* createLaunchyWidget(CommandFlags command) { return new LaunchyWidgetWin(command); } PlatformWin::PlatformWin(int& argc, char** argv) : PlatformBase(argc, argv) { instance = new LimitSingleInstance(TEXT("Local\\{ASDSAD0-DCC6-49b5-9C61-ASDSADIIIJJL}")); // Create local and global application mutexes so that installer knows when // Launchy is running localMutex = CreateMutex(NULL,0,_T("LaunchyMutex")); globalMutex = CreateMutex(NULL,0,_T("Global\\LaunchyMutex")); icons = (QFileIconProvider*)new WinIconProvider(); } PlatformWin::~PlatformWin() { if (localMutex) CloseHandle(localMutex); if (globalMutex) CloseHandle(globalMutex); delete instance; instance = NULL; } void PlatformWin::setPreferredIconSize(int size) { ((WinIconProvider*)icons)->setPreferredIconSize(size); } QHash > PlatformWin::getDirectories() { QHash > out; QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Launchy", "Launchy"); QString iniFilename = settings.fileName(); QFileInfo info(iniFilename); QString userDataPath = info.absolutePath(); out["config"] << userDataPath; out["portableConfig"] << qApp->applicationDirPath(); out["skins"] << qApp->applicationDirPath() + "/skins" << userDataPath + "/skins"; out["plugins"] << qApp->applicationDirPath() + "/plugins" << userDataPath + "/plugins"; out["defSkin"] << "Default"; return out; } QList PlatformWin::getDefaultCatalogDirectories() { QList list; Directory tmp; tmp.name = GetShellDirectory(CSIDL_COMMON_STARTMENU); tmp.types << "*.lnk"; list.append(tmp); tmp.name = GetShellDirectory(CSIDL_STARTMENU); list.append(tmp); tmp.name = "Utilities\\"; tmp.indexDirs = false; list.append(tmp); Directory tmp2; tmp2.name = "%appdata%\\Microsoft\\Internet Explorer\\Quick Launch"; tmp2.types << "*.*"; list.append(tmp2); return list; } QString PlatformWin::expandEnvironmentVars(QString txt) { QString result; DWORD size = ExpandEnvironmentStrings((LPCWSTR)txt.utf16(), NULL, 0); if (size > 0) { TCHAR* buffer = new TCHAR[size]; ExpandEnvironmentStrings((LPCWSTR)txt.utf16(), buffer, size); result = QString::fromUtf16((const ushort*)buffer); delete[] buffer; } return result; } void PlatformWin::sendInstanceCommand(int command) { UINT commandMessageId = RegisterWindowMessage(_T("LaunchyCommand")); PostMessage(HWND_BROADCAST, commandMessageId, command, 0); } bool PlatformWin::isAlreadyRunning() const { return instance->IsAnotherInstanceRunning(); } // Mandatory functions QKeySequence PlatformWin::getHotkey() const { return hotkey; } bool PlatformWin::setHotkey(const QKeySequence& newHotkey, QObject* receiver, const char* slot) { GlobalShortcutManager::disconnect(hotkey, receiver, slot); GlobalShortcutManager::connect(newHotkey, receiver, slot); hotkey = newHotkey; return GlobalShortcutManager::isConnected(newHotkey); } bool PlatformWin::supportsAlphaBorder() const { return true; } bool PlatformWin::getComputers(QList& computers) const { return EnumerateNetworkServers(computers, SV_TYPE_WORKSTATION | SV_TYPE_SERVER); } // Create the application object QApplication* createApplication(int& argc, char** argv) { return new PlatformWin(argc, argv); } launchy-2.5/platforms/win/win.pro0000644000175000017500000000166111252675232016203 0ustar monesmonesTEMPLATE = lib TARGET = platform_win CONFIG += plugin \ qt_warn \ debug_and_release VPATH += ../../src/ INCLUDEPATH += ../../src/ INCLUDEPATH += ../../common/ INCLUDEPATH += c:/boost/ INCLUDEPATH += ../../win/ VPATH += src/ SOURCES = platform_win.cpp \ platform_base_hotkey.cpp \ platform_win_hotkey.cpp \ platform_win_util.cpp \ WinIconProvider.cpp HEADERS = platform_base.h \ platform_win.h \ platform_base_hotkey.h \ platform_base_hottrigger.h \ platform_win_util.h \ WinIconProvider.h LIBS += shell32.lib \ user32.lib \ gdi32.lib \ comctl32.lib \ advapi32.lib \ userenv.lib CONFIG -= embed_manifest_dll win32:debug:DESTDIR = ../../debug/ win32:release:DESTDIR = ../../release/ DEFINES = VC_EXTRALEAN \ WIN32 \ _UNICODE \ UNICODE \ WINVER=0x0510 \ _WIN32_WINNT=0x0510 \ _WIN32_WINDOWS=0x0510 \ _WIN32_IE=0x0600 launchy-2.5/platforms/win/WinIconProvider.h0000644000175000017500000000226211332616142020106 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __WINICONPROVIDER_H #define __WINICONPROVIDER_H class WinIconProvider : QFileIconProvider { public: WinIconProvider(); ~WinIconProvider(); virtual QIcon icon(const QFileInfo& info) const; void setPreferredIconSize(int size); private: bool addIconFromImageList(int imageListIndex, int iconIndex, QIcon& icon) const; bool addIconFromShellFactory(QString filePath, QIcon& icon) const; int preferredSize; }; #endif launchy-2.5/platforms/gnome/0000755000175000017500000000000011355776633015203 5ustar monesmoneslaunchy-2.5/platforms/gnome/platform_gnome.cpp0000644000175000017500000001010611121321532020665 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include "platform_gnome.h" #include "platform_gnome_util.h" PlatformGnome::PlatformGnome() : PlatformUnix () { // if (icons) // delete icons; icons.reset((QFileIconProvider*) new GnomeIconProvider()); // icons = (QFileIconProvider*) new GnomeIconProvider(); } QApplication* PlatformGnome::init(int* argc, char** argv) { // MUST CALL GTK BEFORE QAPP! Otherwise things get confused g_thread_init(NULL); // necessary since gtk called from catalog thread gdk_threads_init(); gtk_init(argc, &argv); gnome_vfs_init(); QApplication * app = new QApplication(*argc, argv); icons.reset((QFileIconProvider*) new GnomeIconProvider()); return app; } PlatformGnome::~PlatformGnome() { GlobalShortcutManager::clear(); gnome_vfs_shutdown(); // delete icons; } void PlatformGnome::alterItem(CatItem* item) { if (!item->fullPath.endsWith(".desktop", Qt::CaseInsensitive)) return; GError * error = NULL; gdk_threads_enter(); GnomeDesktopItem* ditem = gnome_desktop_item_new_from_file(item->fullPath.toLocal8Bit().data(), (GnomeDesktopItemLoadFlags) 0,//GNOME_DESKTOP_ITEM_LOAD_ONLY_IF_EXISTS, &error); if (error) { g_error_free(error); gdk_threads_leave(); return; } if (!ditem) { gdk_threads_leave(); return; } // The gnome errors are coming from here, because it falls back to // finding the file if it can't find the icon and spits out a // nasty error. Nothing I can do but reimplement get_icon, pretty // annoying behavior on gnome's part GtkIconTheme* thm = gtk_icon_theme_get_for_screen(gdk_screen_get_default()); // item->icon = gnome_desktop_item_get_icon (ditem, gtk_icon_theme_get_default()); item->icon = gnome_desktop_item_get_icon(ditem, thm); //item->fullPath = gnome_desktop_item_get_localestring(ditem, "Exec"); QString name = gnome_desktop_item_get_localestring(ditem, "Name"); if (name.size() >= item->shortName.size() - 8) { item->shortName = name; item->lowName = item->shortName.toLower(); } gnome_desktop_item_unref (ditem); gdk_threads_leave(); return; } bool PlatformGnome::Execute(QString path, QString args) { if (!path.endsWith(".desktop", Qt::CaseInsensitive)) return false; gdk_threads_enter(); GError * error = NULL; GnomeDesktopItem* ditem = gnome_desktop_item_new_from_file(path.toLocal8Bit().data(), (GnomeDesktopItemLoadFlags) 0, &error); if (error) { g_error_free(error); gdk_threads_leave(); return false; } if (!ditem) return false; // Get the args GList * list = NULL; args = args.trimmed(); if (args.size() > 0) { foreach(QString s, args.split(" ")) { list = g_list_append(list, s.toLocal8Bit().data()); } } gnome_desktop_item_launch(ditem, list, (GnomeDesktopItemLaunchFlags) 0, &error); g_list_free(list); if (error) { g_error_free(error); gnome_desktop_item_unref(ditem); gdk_threads_leave(); return false; } gnome_desktop_item_unref(ditem); gdk_threads_leave(); return true; } Q_EXPORT_PLUGIN2(platform_gnome, PlatformGnome) launchy-2.5/platforms/gnome/readme.txt0000644000175000017500000000022410762620564017167 0ustar monesmonesLeft off: Trying to prevent the alpha window from being selected. Once it's selected it covers up the main window and I can't select its text box. launchy-2.5/platforms/gnome/gnome.pro0000644000175000017500000000204611034312250017003 0ustar monesmonesTEMPLATE = lib TARGET = platform_gnome CONFIG += plugin qt_warn debug_and_release VPATH += ../../src/ ../unix INCLUDEPATH += ../../src/ ../unix SOURCES = platform_x11_hotkey.cpp platform_base_hotkey.cpp \ platform_gnome.cpp platform_gnome_util.cpp \ platform_unix.cpp platform_unix_util.cpp HEADERS = platform_base.h platform_gnome.h \ platform_base_hotkey.h platform_base_hottrigger.h \ platform_gnome_util.h platform_unix.h \ platform_unix_util.h CONFIG -= embed_manifest_dll CONFIG += link_pkgconfig PKGCONFIG += gtk+-2.0 libgnomeui-2.0 gnome-desktop-2.0 LIBS += -lX11 -lXext -lXrender DEFINES += SKINS_PATH=$(SKINS_PATH) PLUGINS_PATH=$(PLUGINS_PATH)\ PLATFORMS_PATH=$(PLATFORMS_PATH) if(!debug_and_release|build_pass):CONFIG(debug, debug|release) { DESTDIR = ../../debug/ } if(!debug_and_release|build_pass):CONFIG(release, debug|release) { DESTDIR = ../../release/ } unix { } launchy-2.5/platforms/gnome/platform_gnome.h0000644000175000017500000000251411033475306020351 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #pragma once #include "platform_unix.h" #include "platform_unix_util.h" #include "platform_gnome_util.h" #include "platform_base.h" #include "platform_base_hotkey.h" #include "platform_base_hottrigger.h" class PlatformGnome : public PlatformUnix { private: Q_OBJECT Q_INTERFACES(PlatformBase) public: PlatformGnome(); ~PlatformGnome(); QApplication* init(int* argc, char** argv); void AddToNotificationArea() {}; void RemoveFromNotificationArea() {}; void alterItem(CatItem*); bool Execute(QString path, QString args); }; launchy-2.5/platforms/gnome/platform_gnome_util.h0000644000175000017500000000066411033475306021412 0ustar monesmones#ifndef PLATFORM_GNOME_UTIL_H #define PLATFORM_GNOME_UTIL_H //#include //#include < #include #include #include #include #include #include #include class GnomeIconProvider : QFileIconProvider { public: GnomeIconProvider() {} ~GnomeIconProvider() {} QIcon icon(const QFileInfo& info) const; }; #endif launchy-2.5/platforms/gnome/platform_gnome_util.cpp0000644000175000017500000000324311034246450021736 0ustar monesmones #include #include "platform_gnome_util.h" #include #include #include #include #include #include QIcon GnomeIconProvider::icon(const QFileInfo& info) const { if (info.fileName().endsWith(".png", Qt::CaseInsensitive)) { return QIcon(info.absoluteFilePath()); } if (info.fileName().endsWith(".ico", Qt::CaseInsensitive)) return QIcon(info.absoluteFilePath()); gdk_threads_enter(); GnomeIconLookupResultFlags resultFlags; char* file = gnome_icon_lookup_sync(gtk_icon_theme_get_default(), NULL, info.absoluteFilePath().toLocal8Bit().data(), NULL, GNOME_ICON_LOOKUP_FLAGS_NONE, &resultFlags); GtkIconInfo* icinfo = gtk_icon_theme_lookup_icon(gtk_icon_theme_get_default(), file, 32, GTK_ICON_LOOKUP_NO_SVG); GdkPixbuf* buff = gtk_icon_info_load_icon(icinfo, NULL); gchar* pixmap; gsize buflen; gdk_pixbuf_save_to_buffer (buff, &pixmap, &buflen, "png", NULL, NULL); QPixmap qp; qp.loadFromData((const uchar*) pixmap, buflen, "png"); QIcon qico(qp); free(pixmap); g_object_unref(buff); gdk_threads_leave(); return qp; } launchy-2.5/platforms/kde/0000755000175000017500000000000011355776633014641 5ustar monesmoneslaunchy-2.5/platforms/mac/0000755000175000017500000000000011355776633014636 5ustar monesmoneslaunchy-2.5/platforms/mac/platform_mac_hotkey.cpp0000644000175000017500000001273511336314137021363 0ustar monesmones/* * globalshortcutmanager_mac.cpp - Mac OS X implementation of global shortcuts * Copyright (C) 2003-2007 Eric Smith, Michail Pishchagin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "platform_mac_hotkey.h" MacKeyTriggerManager* MacKeyTriggerManager::instance_ = NULL; EventHandlerUPP MacKeyTriggerManager::hot_key_function_ = NULL; MacKeyTriggerManager::Ascii2KeyCodeTable MacKeyTriggerManager::key_codes_; class GlobalShortcutManager::KeyTrigger::Impl : public MacKeyTrigger { public: static bool failed; private: KeyTrigger* trigger_; EventHotKeyRef hotKey_; int id_; static int nextId; public: /** * Constructor registers the hotkey. */ Impl(GlobalShortcutManager::KeyTrigger* t, const QKeySequence& ks) : trigger_(t) , id_(0) { MacKeyTriggerManager::instance()->addTrigger(this); quint32 key, mod; if (MacKeyTriggerManager::convertKeySequence(ks, &key, &mod)) { EventHotKeyID hotKeyID; hotKeyID.signature = 'QtHK'; hotKeyID.id = nextId; OSStatus ret = RegisterEventHotKey(key, mod, hotKeyID, GetApplicationEventTarget(), 0, &hotKey_); if (ret != 0) { failed = true; qWarning("RegisterEventHotKey(%d, %d): %d", key, mod, (int)ret); return; } failed = false; id_ = nextId++; } } /** * Destructor unregisters the hotkey. */ ~Impl() { MacKeyTriggerManager::instance()->removeTrigger(this); if (id_) UnregisterEventHotKey(hotKey_); } void activate() { emit trigger_->activated(); } bool isAccepted(int id) const { return id_ == id; } }; /* * The following table is from Apple sample-code. * Apple's headers don't appear to define any constants for the virtual key * codes of special keys, but these constants are somewhat documented in the chart at * * * The constants on the chartappear to be the same values as are used in Apple's iGetKeys * sample. * . * * See also . */ bool GlobalShortcutManager::KeyTrigger::Impl::failed; MacKeyTriggerManager::Qt_Mac_Keymap MacKeyTriggerManager::qt_keymap[] = { { Qt::Key_Escape, 0x35 }, { Qt::Key_Tab, 0x30 }, { Qt::Key_Backtab, 0 }, { Qt::Key_Backspace, 0x33 }, { Qt::Key_Return, 0x24 }, { Qt::Key_Enter, 0x4c }, // Return & Enter are different on the Mac { Qt::Key_Insert, 0 }, { Qt::Key_Delete, 0x75 }, { Qt::Key_Pause, 0 }, { Qt::Key_Print, 0 }, { Qt::Key_SysReq, 0 }, { Qt::Key_Clear, 0x47 }, { Qt::Key_Home, 0x73 }, { Qt::Key_End, 0x77 }, { Qt::Key_Left, 0x7b }, { Qt::Key_Up, 0x7e }, { Qt::Key_Right, 0x7c }, { Qt::Key_Down, 0x7d }, { Qt::Key_PageUp, 0x74 }, // Page Up { Qt::Key_PageDown, 0x79 }, // Page Down { Qt::Key_Shift, 0x38 }, { Qt::Key_Control, 0x3b }, { Qt::Key_Meta, 0x37 }, // Command { Qt::Key_Alt, 0x3a }, // Option { Qt::Key_CapsLock, 57 }, { Qt::Key_NumLock, 0 }, { Qt::Key_ScrollLock, 0 }, { Qt::Key_F1, 0x7a }, { Qt::Key_F2, 0x78 }, { Qt::Key_F3, 0x63 }, { Qt::Key_F4, 0x76 }, { Qt::Key_F5, 0x60 }, { Qt::Key_F6, 0x61 }, { Qt::Key_F7, 0x62 }, { Qt::Key_F8, 0x64 }, { Qt::Key_F9, 0x65 }, { Qt::Key_F10, 0x6d }, { Qt::Key_F11, 0x67 }, { Qt::Key_F12, 0x6f }, { Qt::Key_F13, 0x69 }, { Qt::Key_F14, 0x6b }, { Qt::Key_F15, 0x71 }, { Qt::Key_F16, 0 }, { Qt::Key_F17, 0 }, { Qt::Key_F18, 0 }, { Qt::Key_F19, 0 }, { Qt::Key_F20, 0 }, { Qt::Key_F21, 0 }, { Qt::Key_F22, 0 }, { Qt::Key_F23, 0 }, { Qt::Key_F24, 0 }, { Qt::Key_F25, 0 }, { Qt::Key_F26, 0 }, { Qt::Key_F27, 0 }, { Qt::Key_F28, 0 }, { Qt::Key_F29, 0 }, { Qt::Key_F30, 0 }, { Qt::Key_F31, 0 }, { Qt::Key_F32, 0 }, { Qt::Key_F33, 0 }, { Qt::Key_F34, 0 }, { Qt::Key_F35, 0 }, { Qt::Key_Super_L, 0 }, { Qt::Key_Super_R, 0 }, { Qt::Key_Menu, 0 }, { Qt::Key_Hyper_L, 0 }, { Qt::Key_Hyper_R, 0 }, { Qt::Key_Help, 0x72 }, { Qt::Key_Direction_L, 0 }, { Qt::Key_Direction_R, 0 }, { Qt::Key_unknown, 0 } }; int GlobalShortcutManager::KeyTrigger::Impl::nextId = 1; GlobalShortcutManager::KeyTrigger::KeyTrigger(const QKeySequence& key) { d.reset(new Impl(this, key)); } GlobalShortcutManager::KeyTrigger::~KeyTrigger() { d.reset(); } bool GlobalShortcutManager::KeyTrigger::isConnected() { if (!d) return false; return !GlobalShortcutManager::KeyTrigger::Impl::failed; } launchy-2.5/platforms/mac/platform_mac.h0000644000175000017500000000310111336361277017437 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #pragma once #include "platform_base.h" #include "platform_base_hotkey.h" #include "platform_base_hottrigger.h" class PlatformMac : public PlatformBase { Q_OBJECT public: PlatformMac(int& argc, char** argv); ~PlatformMac(); virtual void setPreferredIconSize(int size) { size = size; return; } virtual QKeySequence getHotkey() const { return oldKey; } virtual bool setHotkey(const QKeySequence& newHotkey, QObject* receiver, const char* slot); virtual QHash > getDirectories(); virtual QList getDefaultCatalogDirectories(); virtual QString expandEnvironmentVars(QString); virtual bool supportsAlphaBorder() const { return true; } virtual bool isAlreadyRunning() const; virtual void alterItem(CatItem* item); private: QKeySequence oldKey; }; launchy-2.5/platforms/mac/platform_mac.cpp0000644000175000017500000000631311346030002017756 0ustar monesmones#include "precompiled.h" #include "platform_mac.h" PlatformMac::PlatformMac(int& argc, char** argv) : PlatformBase(argc,argv) { icons = new QFileIconProvider(); } PlatformMac::~PlatformMac() { } bool PlatformMac::setHotkey(const QKeySequence & key, QObject* receiver, const char* slot) { GlobalShortcutManager::disconnect(oldKey, receiver, slot); GlobalShortcutManager::connect(key, receiver, slot); oldKey = key; qDebug() << key << GlobalShortcutManager::isConnected(key); return GlobalShortcutManager::isConnected(key); } void PlatformMac::alterItem(CatItem* item) { if (!item->fullPath.endsWith(".app", Qt::CaseInsensitive)) return; // item->shortName.chop(4); // item->lowName.chop(4); } QHash > PlatformMac::getDirectories() { QHash > out; QDir d; QString home = QDir::homePath() + "/Library/Launchy"; d.mkdir(home); out["skins"] += qApp->applicationDirPath() + "/../Resources/skins"; out["skins"] += home + "/skins"; //out["skins"] += SKINS_PATH; out["plugins"] += qApp->applicationDirPath() + "/plugins"; out["plugins"] += home + "/plugins"; //out["plugins"] += PLUGINS_PATH; out["config"] += home; out["portableConfig"] += qApp->applicationDirPath(); if (QFile::exists(out["skins"].last() + "/Default")) out["defSkin"] += out["skins"].last() + "/Default"; else out["defSkin"] += out["skins"].first() + "/Default"; out["platforms"] += qApp->applicationDirPath(); //out["platforms"] += PLATFORMS_PATH; return out; } QList PlatformMac::getDefaultCatalogDirectories() { QList list; QStringList types; types << "*.app"; list.append(Directory("/Applications", types, false, false, 5)); list.append(Directory("~/Applications", types, false, false, 5)); list.append(Directory("/System/Library/CoreServices", types, false, false, 5)); list.append(Directory("~", QStringList(), true, false, 0)); return list; } QString PlatformMac::expandEnvironmentVars(QString txt) { QStringList list = QProcess::systemEnvironment(); txt.replace('~', "$HOME$"); QString delim("$"); QString out = ""; int curPos = txt.indexOf(delim, 0); if (curPos == -1) return txt; while(curPos != -1) { int nextPos = txt.indexOf("$", curPos+1); if (nextPos == -1) { out += txt.mid(curPos+1); break; } QString var = txt.mid(curPos+1, nextPos-curPos-1); bool found = false; foreach(QString s, list) { if (s.startsWith(var, Qt::CaseInsensitive)) { found = true; out += s.mid(var.length()+1); break; } } if (!found) out += "$" + var; curPos = nextPos; } return out; } bool PlatformMac::isAlreadyRunning() const { return false; } // Create the application object QApplication* createApplication(int& argc, char** argv) { return new PlatformMac(argc, argv); } launchy-2.5/platforms/mac/platform_mac_hotkey.h0000644000175000017500000001301611336314137021021 0ustar monesmones#pragma once #include "platform_base_hotkey.h" #include "platform_base_hottrigger.h" // TODO: // - don't invoke hotkey if there is a modal dialog? // - do multi-mapping, like the x11 version #include #include class MacKeyTrigger { public: virtual ~MacKeyTrigger() {} virtual void activate() = 0; virtual bool isAccepted(int id) const = 0; }; class MacKeyTriggerManager : public QObject { public: static MacKeyTriggerManager* instance() { if(!instance_) instance_ = new MacKeyTriggerManager(); return instance_; } void addTrigger(MacKeyTrigger* trigger) { triggers_ << trigger; } void removeTrigger(MacKeyTrigger* trigger) { triggers_.removeAll(trigger); } private: MacKeyTriggerManager() : QObject(QCoreApplication::instance()) { initAscii2KeyCodeTable(&key_codes_); hot_key_function_ = NewEventHandlerUPP(hotKeyHandler); EventTypeSpec type; type.eventClass = kEventClassKeyboard; type.eventKind = kEventHotKeyPressed; InstallApplicationEventHandler(hot_key_function_, 1, &type, this, NULL); } /** * Callback function invoked when the user hits a hot-key. */ static pascal OSStatus hotKeyHandler(EventHandlerCallRef /*nextHandler*/, EventRef theEvent, void* userData) { EventHotKeyID hkID; GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(EventHotKeyID), NULL, &hkID); static_cast(userData)->activated(hkID.id); return noErr; } void activated(int id) { foreach(MacKeyTrigger* trigger, triggers_) { if (trigger->isAccepted(id)) { trigger->activate(); break; } } } static MacKeyTriggerManager* instance_; QList triggers_; typedef struct { short kchrID; Str255 KCHRname; short transtable[256]; } Ascii2KeyCodeTable; enum { kTableCountOffset = 256 + 2, kFirstTableOffset = 256 + 4, kTableSize = 128 }; static EventHandlerUPP hot_key_function_; static Ascii2KeyCodeTable key_codes_; private: /** * initAscii2KeyCodeTable initializes the ascii to key code * look up table using the currently active KCHR resource. This * routine calls GetResource so it cannot be called at interrupt time. */ static OSStatus initAscii2KeyCodeTable(Ascii2KeyCodeTable* ttable) { unsigned char* theCurrentKCHR, *ithKeyTable; short count, i, j, resID; Handle theKCHRRsrc; ResType rType; // set up our table to all minus ones for (i = 0; i < 256; i++) ttable->transtable[i] = -1; // find the current kchr resource ID ttable->kchrID = (short)GetScriptVariable(smCurrentScript, smScriptKeys); // get the current KCHR resource theKCHRRsrc = GetResource('KCHR', ttable->kchrID); if (theKCHRRsrc == NULL) return resNotFound; GetResInfo(theKCHRRsrc, &resID, &rType, ttable->KCHRname); // dereference the resource theCurrentKCHR = (unsigned char *)(*theKCHRRsrc); // get the count from the resource count = *(short*)(theCurrentKCHR + kTableCountOffset); // build inverse table by merging all key tables for (i = 0; i < count; i++) { ithKeyTable = theCurrentKCHR + kFirstTableOffset + (i * kTableSize); for (j = 0; j < kTableSize; j++) { if (ttable->transtable[ ithKeyTable[j] ] == -1) ttable->transtable[ ithKeyTable[j] ] = j; } } return noErr; } /** * validateAscii2KeyCodeTable verifies that the ascii to key code * lookup table is synchronized with the current KCHR resource. If * it is not synchronized, then the table is re-built. This routine calls * GetResource so it cannot be called at interrupt time. * * Should probably call this at some point, in case the user has switched keyboard * layouts while we were running. */ static OSStatus validateAscii2KeyCodeTable(Ascii2KeyCodeTable* ttable, Boolean* wasChanged) { short theID; theID = (short) GetScriptVariable(smCurrentScript, smScriptKeys); if (theID != ttable->kchrID) { *wasChanged = true; return initAscii2KeyCodeTable(ttable); } else { *wasChanged = false; return noErr; } } /** * asciiToKeyCode looks up the ascii character in the key * code look up table and returns the virtual key code for that * letter. If there is no virtual key code for that letter, then * the value -1 will be returned. */ static short asciiToKeyCode(Ascii2KeyCodeTable* ttable, short asciiCode) { if (asciiCode >= 0 && asciiCode <= 255) return ttable->transtable[asciiCode]; else return false; } /** * Not used. */ static char keyCodeToAscii(short virtualKeyCode) { unsigned long state; long keyTrans; char charCode; Ptr kchr; state = 0; kchr = (Ptr)GetScriptVariable(smCurrentScript, smKCHRCache); keyTrans = KeyTranslate(kchr, virtualKeyCode, &state); charCode = keyTrans; if (!charCode) charCode = (keyTrans >> 16); return charCode; } private: struct Qt_Mac_Keymap { int qt_key; int mac_key; }; static Qt_Mac_Keymap qt_keymap[]; public: static bool convertKeySequence(const QKeySequence& ks, quint32* _key, quint32* _mod) { int code = ks[0]; quint32 mod = 0; if (code & Qt::META) mod |= controlKey; if (code & Qt::SHIFT) mod |= shiftKey; if (code & Qt::CTRL) mod |= cmdKey; if (code & Qt::ALT) mod |= optionKey; code &= ~Qt::KeyboardModifierMask; quint32 key = 0; for (int n = 0; qt_keymap[n].qt_key != Qt::Key_unknown; ++n) { if (qt_keymap[n].qt_key == code) { key = qt_keymap[n].mac_key; break; } } if (key == 0) { key = asciiToKeyCode(&key_codes_, code & 0xffff); } if (_mod) *_mod = mod; if (_key) *_key = key; return true; } }; launchy-2.5/BUILD.txt0000644000175000017500000000413311346031505013446 0ustar monesmonesBuilding on Linux: For debian and ubuntu: sudo apt-get install libqt4-dev libboost-dev g++ dh_make qmake -r Launchy.pro ; make ; sudo make install To build a deb package: cd linux ; ./build_deb.sh such as ./buid_deb.sh 2.2 Building and installing on Mac OS X: 1) Install the QT SDK 2) qmake Launchy.pro -spec macx-g++ -r CONFIG+=release 3) make ; make install -- Launchy is now built and installed in release/Launchy.app 4) cd mac 5) sh mkdmg 6) Now there is a release/Launchy.dmg 5) copy Launchy.app to your Applications folder Building on WINDOWS: Requirements: 1) Visual Studio 2005 w/ SP1 2) QT 4.6 or greater. 3) Boost Installing QT: . Download QT SDK at: https://qt.nokia.com/products . Run the installer . Setting the QT environment variables: . Go to control panel -> System -> Advanced system settings -> Environment Variables . Add these 2 variables to your user variables . Variable = QMAKESPEC Value = win32-msvc2005 . Variable = QTDIR Value = c:\qt\2009.05 . Open a Visual Studio 2005 command prompt . cd c:\qt\2009.05\ . configure -opensource -no-webkit . nmake The configure and nmake commands take a very long time. Download Boost from http://www.boost.org/users/download/ Install Boost libraries to c:\boost Building Launchy: . Download launchy from subversion, the url to use is this: https://launchy.svn.sourceforge.net/svnroot/launchy/trunk/Launchy_QT/ . From the command line, cd to the launchy directory and type '%QTDIR%\qmake\qmake -tp vc -r launchy.pro' to build the Visual Studio .sln files . Double click on the resulting launchy.sln . F7 to compile! Launchy and QT can also be built using Visual Studio 2008, just set use win32-msvc2008 instead of win32-msvc2005. In this scenario, there are binary compatibility issues with plugins built using Visual Studio 2005 which will cause a runtmacdeployqt ../release/Launchy.appime error and refuse to load. When you run Launchy, note that only one skin is installed in the debug\release directories. Launchy looks awfully funny when it can't find its skin! launchy-2.5/common/0000755000175000017500000000000011355776633013357 5ustar monesmoneslaunchy-2.5/common/DropTableWidget.cpp0000644000175000017500000000071211246536650017073 0ustar monesmones#include "DropTableWidget.h" #include DropTableWidget::DropTableWidget(QWidget* pParent) : QTableWidget(pParent) { setAcceptDrops(true); } DropTableWidget::~DropTableWidget() { } void DropTableWidget::dragEnterEvent(QDragEnterEvent *event) { emit dragEnter(event); } void DropTableWidget::dragMoveEvent(QDragMoveEvent *event) { emit dragMove(event); } void DropTableWidget::dropEvent(QDropEvent *event) { emit drop(event); } launchy-2.5/common/DropTableWidget.h0000644000175000017500000000100011246536650016527 0ustar monesmones#ifndef DROPTABLEWIDGET_H #define DROPTABLEWIDGET_H #include class DropTableWidget : public QTableWidget { Q_OBJECT public: DropTableWidget(QWidget* pParent = NULL); ~DropTableWidget(); protected: void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); signals: void dragEnter(QDragEnterEvent *event); void dragMove(QDragMoveEvent *event); void drop(QDropEvent *event); }; #endif launchy-2.5/common/DropListWidget.h0000644000175000017500000000236711255771563016440 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef DROPLISTWIDGET_H #define DROPLISTWIDGET_H #include class DropListWidget : public QListWidget { Q_OBJECT public: DropListWidget(QWidget* pParent = NULL); ~DropListWidget(); protected: void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); signals: void dragEnter(QDragEnterEvent *event); void dragMove(QDragMoveEvent *event); void drop(QDropEvent *event); }; #endif launchy-2.5/common/FileBrowser.cpp0000644000175000017500000001340111254554632016274 0ustar monesmones/* * The information in this file is * Copyright(c) 2007 Ball Aerospace & Technologies Corporation * and is subject to the terms and conditions of the * GNU Lesser General Public License Version 2.1 * The license text is available from * http://www.gnu.org/licenses/lgpl.html */ #include #include #include #include #include #include #include #include "FileBrowser.h" // Browse button static const char* const FileOpenIcon[] = { "16 16 5 1", "# c #000000", "c c #808000", ". c #c0c0c0", "b c #ffff00", "a c #ffffff", "................", "..........###...", ".........#...#.#", "..............##", "..###........###", ".#aba#######....", ".#babababab#....", ".#ababababa#....", ".#baba##########", ".#aba#ccccccccc#", ".#ba#ccccccccc#.", ".#a#ccccccccc#..", ".##ccccccccc#...", ".###########....", "................", "................" }; FileBrowser::FileBrowser(QWidget* pParent) : QWidget(pParent), mExistingFile(true), mBrowseType(FileBrowser::File) { // Filename edit QCompleter* pCompleter = new QCompleter(this); QDirModel* pDirModel = new QDirModel(QStringList(), QDir::NoDotAndDotDot | QDir::AllDirs | QDir::AllEntries, QDir::Name | QDir::DirsFirst, pCompleter); pCompleter->setModel(pDirModel); mpFileEdit = new QLineEdit(this); mpFileEdit->setCompleter(pCompleter); mpFileEdit->installEventFilter(this); QPixmap pixOpen(FileOpenIcon); pixOpen.setMask(pixOpen.createHeuristicMask()); QIcon icnBrowse(pixOpen); mpBrowseButton = new QPushButton(icnBrowse, "", this); mpBrowseButton->setFixedWidth(25); mpBrowseButton->installEventFilter(this); // Layout QHBoxLayout* pLayout = new QHBoxLayout(this); pLayout->setMargin(0); pLayout->setSpacing(0); pLayout->addWidget(mpFileEdit, 100); pLayout->addWidget(mpBrowseButton); // Initialization setFocusPolicy(Qt::StrongFocus); setFocusProxy(mpFileEdit); setAutoFillBackground(true); // Connections connect(mpFileEdit, SIGNAL(textChanged(const QString&)), this, SIGNAL(filenameChanged(const QString&))); connect(mpBrowseButton, SIGNAL(clicked()), this, SLOT(browse())); } FileBrowser::~FileBrowser() { } void FileBrowser::setFilename(const QString& filename) { if (filename != getFilename()) { mpFileEdit->setText(filename); } } QString FileBrowser::getFilename() const { return mpFileEdit->text(); } void FileBrowser::setBrowseCaption(const QString& caption) { mBrowseCaption = caption; } QString FileBrowser::getBrowseCaption() const { return mBrowseCaption; } void FileBrowser::setBrowseDirectory(const QString& directory) { mBrowseDirectory = directory; } QString FileBrowser::getBrowseDirectory() const { return mBrowseDirectory; } void FileBrowser::setBrowseFileFilters(const QString& filters) { if (filters != mBrowseFilters) { mBrowseFilters = filters; // Update the filters in the completer QStringList dirFilters; QStringList filterList = mBrowseFilters.split(";;", QString::SkipEmptyParts); if (filterList.empty() == false) { // Remove the All Files filter for (int i = 0; i < filterList.count(); ++i) { QString filter = filterList[i]; if (filter.startsWith("All Files") == true) { filterList.removeAt(i); break; } } // Convert the filters to the directory name filter format if (filterList.empty() == false) { for (int i = 0; i < filterList.count(); ++i) { QString filter = filterList[i]; int startPos = filter.indexOf("(") + 1; int numChars = filter.lastIndexOf(")") - startPos; filter = filter.mid(startPos, numChars); dirFilters += filter.split(' ', QString::SkipEmptyParts); } } } QCompleter* pCompleter = mpFileEdit->completer(); if (pCompleter != NULL) { QDirModel* pDirModel = dynamic_cast(pCompleter->model()); if (pDirModel != NULL) { pDirModel->setNameFilters(dirFilters); } } } } QString FileBrowser::getBrowseFileFilters() const { return mBrowseFilters; } void FileBrowser::setBrowseExistingFile(bool bExistingFile) { mExistingFile = bExistingFile; } bool FileBrowser::isBrowseExistingFile() const { return mExistingFile; } void FileBrowser::setBrowseType(BrowseType browseType) { mBrowseType = browseType; } FileBrowser::BrowseType FileBrowser::getBrowseType() const { return mBrowseType; } bool FileBrowser::eventFilter(QObject* pObject, QEvent* pEvent) { if (pEvent != NULL) { if (pEvent->type() == QEvent::FocusOut) { QWidget* pFocusWidget = QApplication::focusWidget(); if ((pFocusWidget != mpFileEdit) && (pFocusWidget != mpBrowseButton)) { QFocusEvent* pFocusEvent = static_cast(pEvent); QApplication::sendEvent(this, pFocusEvent); } } } return QWidget::eventFilter(pObject, pEvent); } void FileBrowser::browse() { // Remove the event filter on the browse button to prevent the focus // out event from being sent when the browse dialog is invoked mpBrowseButton->removeEventFilter(this); // Get the initial browse directory QString browseDirectory = getFilename(); if (browseDirectory.isEmpty() == true) { browseDirectory = mBrowseDirectory; } // Get the filename from the user QString filename; if (mBrowseType == FileBrowser::File) { if (mExistingFile == true) { filename = QFileDialog::getOpenFileName(this, mBrowseCaption, browseDirectory, mBrowseFilters); } else { filename = QFileDialog::getSaveFileName(this, mBrowseCaption, browseDirectory, mBrowseFilters); } } else { filename = QFileDialog::getExistingDirectory(this, mBrowseCaption, browseDirectory); } if (filename.isEmpty() == false) { // Set the edit box text setFilename(filename); setFocus(); } // Reinstall the event filter mpBrowseButton->installEventFilter(this); } launchy-2.5/common/FileBrowser.h0000644000175000017500000001443511257454033015746 0ustar monesmones/* * The information in this file is * Copyright(c) 2007 Ball Aerospace & Technologies Corporation * and is subject to the terms and conditions of the * GNU Lesser General Public License Version 2.1 * The license text is available from * http://www.gnu.org/licenses/lgpl.html */ #ifndef FILEBROWSER_H #define FILEBROWSER_H #include #include #include class Filename; /** * A widget to allow the user to browse for files. * * The FileBrowser extends the QWidget class to provide a single QWidget * capable of performing typical file-browsing tasks. This class associates an * editable text-entry field with a button which brings up a file selection * dialog by calling either the QFileDialog::getOpenFileName() method or the * QFileDialog::getSaveFileName() method. Selecting a file through the file * selection dialog will populate the text field. */ class FileBrowser : public QWidget { Q_OBJECT public: enum BrowseType { File, Directory }; /** * Creates a FileBrowser with no file selected. * * @param pParent * The parent widget. */ FileBrowser(QWidget* pParent = NULL); /** * Destroys the widget and all child widget items. */ ~FileBrowser(); /** * Sets the name of the file. * * This method sets the name of the file to be displayed in the FileBrowser. * * @param filename * The name of the file. */ void setFilename(const QString& filename); /** * Sets the name of the file. * * This method sets the name of the file to be displayed in the FileBrowser. * * @param filename * The name of the file. */ void setFilename(const Filename& filename); /** * Gets the name of the file. * * This method gets the name of the file displayed in the FileBrowser. * * @return The name of the file. */ QString getFilename() const; /** * Sets the browse caption. * * This method sets the browse caption of the FileBrowser. For more information on browse captions, * please refer to the QFileDialog::getOpenFileName documentation. * * @param caption * The browse caption. */ void setBrowseCaption(const QString& caption); /** * Gets the browse caption. * * This method gets the browse caption of the FileBrowser. For more information on browse captions, * please refer to the QFileDialog::getOpenFileName documentation. * * @return The browse caption. * */ QString getBrowseCaption() const; /** * Sets the browse directory. * * This method sets the browse directory of the FileBrowser. For more information on browse directories, * please refer to the QFileDialog::getOpenFileName documentation. * * @param directory * The browse directory. */ void setBrowseDirectory(const QString& directory); /** * Gets the browse directory. * * This method gets the browse directory of the FileBrowser. For more information on browse directories, * please refer to the QFileDialog::getOpenFileName documentation. * * @return The browse directory. */ QString getBrowseDirectory() const; /** * Sets the browse file filters. * * This method sets the browse file filters of the FileBrowser. For more information on browse file filters, * please refer to the QFileDialog::getOpenFileName documentation. * * @param filters * The browse file filters. */ void setBrowseFileFilters(const QString& filters); /** * Gets the browse file filters. * * This method gets the browse file filters of the FileBrowser. For more information on browse file filters, * please refer to the QFileDialog::getOpenFileName documentation. * * @return The browse file filters. */ QString getBrowseFileFilters() const; /** * Sets the file selection dialog to only browse for existing files. * * By default if this method is not called, isBrowseExistingFile() returns * \c true. * * @param bExistingFile * Set this value to \c true to browse only for existing files. * Set the value to \c false to allow non-existent files to be * selected. * * @see QFileDialog::getOpenFileName(), QFileDialog::getSaveFileName() */ void setBrowseExistingFile(bool bExistingFile); /** * Queries whether the file selection dialog only browses for existing * files. * * @return Returns \c true if the file selection dialog only browses for * existing files. Returns \c false if non-existent files can be * selected. Returns \c true by default if setBrowseExistingFile() * has not been called on this instance of the file browser. * * @see QFileDialog::getOpenFileName(), QFileDialog::getSaveFileName() */ bool isBrowseExistingFile() const; void setBrowseType(BrowseType browseType); BrowseType getBrowseType() const; signals: /** * This signal is emitted when the filename is changed. */ void filenameChanged(const QString& filename); protected: /** * Sends a focus out event if needed based on the current editing status. * * @param pObject * The object prompting the event. * @param pEvent * The event invoked by the object. * * @return Returns the value returned by the default QWidget * implementation. */ bool eventFilter(QObject* pObject, QEvent* pEvent); protected slots: /** * Calls QFileDialog::getOpenFileName to allow the user to specify a file. * If no browse directory has been set, then the current file's directory will be used as the initial directory. */ void browse(); private: QLineEdit* mpFileEdit; QPushButton* mpBrowseButton; QString mBrowseCaption; QString mBrowseDirectory; QString mBrowseFilters; bool mExistingFile; BrowseType mBrowseType; }; #endif launchy-2.5/common/DropListWidget.cpp0000644000175000017500000000230011255771563016756 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "DropListWidget.h" DropListWidget::DropListWidget(QWidget* pParent) : QListWidget(pParent) { setAcceptDrops(true); } DropListWidget::~DropListWidget() { } void DropListWidget::dragEnterEvent(QDragEnterEvent *event) { emit dragEnter(event); } void DropListWidget::dragMoveEvent(QDragMoveEvent *event) { emit dragMove(event); } void DropListWidget::dropEvent(QDropEvent *event) { emit drop(event); } launchy-2.5/common/FileBrowserDelegate.cpp0000644000175000017500000000353511254554632017736 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "FileBrowserDelegate.h" FileBrowserDelegate::FileBrowserDelegate(QObject *parent, FileBrowser::BrowseType browseType) : QItemDelegate(parent), browseType(browseType) { } QWidget *FileBrowserDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & /*option*/ , const QModelIndex & /*index*/ ) const { FileBrowser *editor = new FileBrowser(parent); editor->setBrowseType(browseType); return editor; } void FileBrowserDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString value = index.model()->data(index, Qt::EditRole).toString(); FileBrowser *edit = static_cast(editor); edit->setFilename(value); } void FileBrowserDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { FileBrowser *edit = static_cast(editor); QString value = edit->getFilename(); model->setData(index, value, Qt::EditRole); } void FileBrowserDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex & /*index*/) const { editor->setGeometry(option.rect); } launchy-2.5/common/FileBrowserDelegate.h0000644000175000017500000000300411255771563017377 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef FILEBROWSERDELEGATE_H #define FILEBROWSERDELEGATE_H #include "FileBrowser.h" #include #include #include #include class FileBrowserDelegate : public QItemDelegate { Q_OBJECT public: FileBrowserDelegate(QObject *parent = 0, FileBrowser::BrowseType browseType = FileBrowser::File); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; private: FileBrowser::BrowseType browseType; }; #endif launchy-2.5/release/0000755000175000017500000000000011355776633013507 5ustar monesmoneslaunchy-2.5/release/skins/0000755000175000017500000000000011355776633014636 5ustar monesmoneslaunchy-2.5/release/skins/Mercury/0000755000175000017500000000000011355776633016264 5ustar monesmoneslaunchy-2.5/release/skins/Mercury/background.png0000644000175000017500000000110711251006722021064 0ustar monesmonesPNG  IHDRdp}sRGBbKGD pHYs  d_tIME: XIDATxA 0Eџ&g;pHФ./Z2"X: :: : : :: ?{Zyv3ȕ^Zw_Sia+3}9zN rBAttAA:X .  zݩ. . /w@BA@-tt ,tt BABAtӹr ]@]6AL_JF($,n @Att@At@AAt@@Att@At@AAP~9TIENDB`launchy-2.5/release/skins/Mercury/author.txt0000644000175000017500000000014410715737001020307 0ustar monesmonesSkin Title: Mercury Author: Josh Karlin and Juan Ignacio Serra Version: 1.0 Date: 6/21/2007launchy-2.5/release/skins/Mercury/mask.png0000644000175000017500000000107411251006722017703 0ustar monesmonesPNG  IHDRdp}sRGBbKGD pHYs  d_tIME:;ŴIDATxI0 AlpKd;K6AʑZv: : : :: : m2FWmxm(0(֪y8W" _20UMA f0: [a%SA: : : ::Jf : :3 X _]g{ywet@AAt@@Att@At@AAt@@At+O,2WIENDB`launchy-2.5/release/skins/Mercury/misc.txt0000644000175000017500000000064611251006722017742 0ustar monesmonesboundary = 0,0,500,100 input = 60,37,160,24 inputAlignment = left output = 290,37,160,24 outputAlignment = center alternatives = 37,61,436,100 icon = 241,32,32,32 ; These describe the font of the full path in the dropdown box ; This should be in style.qss but the style sheet doesn't support it dropPathColor = 221,221,221 dropPathFamily = Lucida Sans dropPathSize = 8 dropPathWeight = 0 dropPathItalics = 0launchy-2.5/release/skins/Mercury/down_arrow.png0000644000175000017500000000025710660643004021136 0ustar monesmonesPNG  IHDR#>SsBITUFtEXtSoftwarewww.inkscape.org<CIDATc[8: bp H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FC^IDATx_eYZk}u1, O#!eK@0dDH͌fFR2H22@Qi“`dbssgﵪ]{}Nwk'Mg9{VU}O*nA9000004@on~7|N'_ ׷>0000,>OH9@7mL6f &2GxMj}`````i#dOSoo $B(ϑSn [u#sސmǣ1H~```` &A;eC|lB[~ i^#]Sv[^9R?QC&5cj}򁁁U?*ϛ:6sdndkߑJˢ2O8'w[ېMmj}􁁁gY3dϴῼ99l;@b@~~"2nw<.3p'1Թߐ7ucb````9#A%s&>m}Cu <0*Qr72( |#~~}{y/EOO^???ԧ>ZG#s=nk00ѧݻ}}nYĔy0,"NۺF ܵkTU/I9{9#dUUT{! >E"sEDBEj UmEbf"`9!(>!pNYRJ!e3#KF\0MTi9fpiry""x{ځsNH)9)9Ǡ伃wj?cƮW "H9C$"JČ e׶#ffPJDUEpH4C 94MLL ~ӊBEE$#nj,R U&&*BT0;MT. R\o\lR f±C0朱!xeb3bDt2s* sB׮,7k=,n.mlJnrv1O~G雾?;@5,R-R,*92׸6FƓDDa8 ʚB)ZSB5d)\PDXYm=MU5rUD [+ r4șz\% i")}˕ YD0JXP"f2bXט]/vL*eT{w$ggB7C{k1عՀiƂ {uckk "sfTrꜣ~vuYd#iP-F>!ܞyp8@UQ}[lrYH}9qc&vrFm{vdͿ1Ɠ6ܾ{"u]?<.lx1⢑]k?g `{*"Ko?|惿 ;zB_+ЭNҴQ={睿=f+fh&av26Au@FY$KF>x1vlfzoZ'9spI9At8̕67޲]폈+ sk}gcj&Wx7(C}Pm |CFSwLYAsBu3T,]Gݎ@rO)S LDJޗr9%AĤ"c;u.fF'd01D2#C)CQ&29ΟL f/.=rʪ@6Y0o?udqa]#^T˲4 .= ΋,!ʔ*a;V]cm*5TW(Lt$mؔδ^77;0MSq+J=גmL)GrΡvY༣҉;_#w:fhHUʒhN@9HQ/\SnTUb 36eeH҃j:œHT YR:^̍BX׵A}5J񪽻*={D13ݴ]V㻨,6:"$qHq UsST&VvΌmmݼ'iSeq㞔'G#@ IAR*Lİ)QQ\4s4sڻ< ":!3#(49umcϓ!65<<׻y \vް1"j)05dOģкD j#ڎdޏTy'x:ڕ@L57/@J)E&la׵LUA ɨiW?| !w\/Hj.JPR-WX P-=2yٺL0qXWbZݚ%@!@*%C1oyp:qb:%~7wyN"v ҼG !G7B9IJYc\Mi|Q.  ;DT}XpikURyH\DXO!@μ+J̍+5Voc:7hAs,%cj`f&2c2=1z#z}%S1hQsM[<ߌ>ݏJBD\= 쎆 iא[ݼ}]>8 ӣD0os5os j4{y !̼{ͯگ} ՆԷ*H_u }Fm~闾~s 9*uФnZEy9\%o?{J'̰X6È'h9= +qES-,$$}A1|ʋ7,m IP9Qݽʴ,+QSݨYz٨ّ/GDD;pmo{=cTP(gP'"TDpQB9%d޳5,@֪ Jj1R,ʿ5jm:)WԒ_R*Om_H;\q]ɐ!bO&;wSE!=k&NU,qJ~hcҪBB7{Tޓ(znT==DVJn.ڒums%UI2w*ղϙ)%a hNQw `]OMkrm M>Րй{yMN'hIX>^b@ms>Iޗܘ5ƈ+u] !Ν;m>17)ޠc}|Մa7#'9o*f$نa0%Y ޞ buɰ'); n°fp~:&s^DdQ5Ƹ|__}^%GP#uyBߺD݆/\+7x&D D&&UeYY@Mxq^,1c6XָJNZeUŜSnc&"޼%!m[]Khe]AI-8#j057U?P}z&qLF֧9'8[Ʒ;6͈y_i>l.wJYTTsɒ 'w.r=Irosb\s2-AjB-^^IU+9 cy1ETf,> eFx9[p.XWY̖]%;O\%?@mty$c^ O9dG%0bJͥP81rYs#34De'N"jIqd~]W9wꨮ.9$5tM\LR%j?ɰjxSW4bϴr'R!d1ZlX^bzHUՔJsU ,pr$=!M>CK넌8HV3tﵱ%`ssR]{7y}v|ϹMk/,Wi S{ ny!%(FQs 37bw/u]%[=l%y9g5Ob%x^Ui^G\^^iqqq8Kt#vkjJמlsr?SJbзWn}dƏu xZZvݗ{LM]??Է9-TkRQy{-iْ'můے qKZ[xkZ^)i-cIG1+atϽ1`o70x;ײW'Iq8ƈyɬ.:Y@.v;9[|[u Y TKt,鋫Av+ީ(dDOAq*a:mqO%4-#}2B"T9DR2f v%o$a!P2Z}LEtc KtR_眃Vmw+ePԍ䣍Y-R+AruuU<0TK0z uNHDB4{ֵӓ1Nei edKqq%7gǸ1aOoYBi:uy FV9fhߖfo>i-`Ik|CҚǣ$;MyDDvڮpαyRJ-ڦ=7jDrWάsrvyٜe̷ۖ*׾\Uu#b%3y KzK̖Ҹbz}lݷ,n6nZܠwXyF${cuQRM58- O6sv'X\-{R߈>ˎ[MЭcڃPLuB6Rc_K$լ.8PN B"jaBDLz\Ū!ŤRGo2V!:QACj?(s Ű(y(h3:Ńg T-95BURsigr[]cuT+%C_2h!qΈ3'6'N)3Iql粹|gF͗$IqCd{.oLsʼn{՞{9ZXa};n*S9ub}kF^)~jq4z˳RŊRNPQoM˲`;7ooMq~3RPE~N[VO_}*R .̣U%uc.)=Ku}OV7O\۾/|?;˒DN8ܹsb@'*~G!rz+=CCs?,%Je2˔3eq1^\|s?@چ4L>xX}D3pNC?G7}3ZL6Xjbu]W^d>0000TϽg=[ң+6޽ѽ~Gbow3Rr`PLYvSl}|_ưxӟm Ӫ޽ےn\ܢq[ 0 ~F?g-"r64Ox#?#@_/zunxz_-B \.w.+m(k _Vxp^yoҗ֚}޷?.=]iTrV\ºVc+fBO)}{RlԹyߌ:Z 8eʙ-jЯe˙V%10000ͻ׻eem9oey\2jC⢖q3"~i~v5xo`?{ri\;w-ug.[o{v`````iMeK{ԍjv fƽ{5| sT)'Y(α0;ueb"c.J < _,v:**w0000L(~VB1$gb7md~فUP%B 􁁁gП{#np߮"H@QLk1 B~fعy^zKx7b2v!P2X. 3000004*ij~T(yR`jlB7NWFلKB1E0s!x"(4 c, 7oeYZs'tSܪ,.؝X5w>0000(^x67%kU| = J~ʍ- }X 0000,(tfn4M-~n&=фe@LGL9g.7`vH) 3C?!oKv\SU| fA{̸1,Q60000t&ޚmb$= ּ89FݻmL 9% !PςBRn3\C+/&1Z=^1FL=s>0000L/xCm7N|\&kp=l'BvιnWըa ٟnc*%Rj_RJeהO6a).4P8l]!20000 mIm""h%locOTE" ]65 U4c_?4oo}{sƲ,-ܜR+_["UڝX+ feme ݟ\+vtɟ<'FnJLM7q>w*A$CERJ* $w}w}CЯ1&6'Ї>~B!LSI:u]K# b笃8$V{g\7kA`K?~~w9ӂ{...B?o!3Ǚmz>&a_vrUo{ᅺz 眐sy%R};w|3'>OCd```` oUUPRJ'%kDiNBDBKJ_dK [&Rw>|3O y?3?3C?CX6NIٚe!syDb/u[8+#TC` `Ѵ.fS2D4d7j7[6m7&!y=qqu^7T.{pqqqI1t,Yl TWJ Tmܜ{Ӯ޿  SV_6V!@%K@TU)D *u]9qsysyq=kcnCv 9Ǵ+rCZUw *_I }"""s$#Lz- &)g!fQ_kRtt;Poտ@N )echݜhYe"*:ǤB(*ׇ'Zmbvݿ@SLv\SLRR !dVAQYV}Z[WUhˋQ2Y|@SJPQ!嬵w;OkUev &XW|9*DEgB~6)*m"gusR6pε-2 =^Ru]!"jR˲xԎjy~iZ_ml{5wAVqdϺ͏!}ҙ'3_[Զy;3um!VN[dYe&˿\뺊UWv;va{;/ݲ,ެ 9r@>k;sJ[y9/," }@}=k=R}_>LMrQ92sYɺ^[ҞsΘ9']? lW8ox=beekd6h;'TMASsI 5LSRB=WWWm}35#mϦFr4s ;w*su; KdH)&()=ƒS%ILP(inim-":ldZSG&kr*@HIs3H֞ęIι,+KǶdN!fcŇƨ댱q28vr\ mQUN:C'#s1-gz?ڽۘuԜs#JH9H 2QZVնN)u@K 9j XƈDBNCjPJ]l9P8۳"G#>[3:u,G1b{fx iu]:3ڞ~/FV==ژ9A?}uS-ܽ{-fKzs}v_߿u]Er'Bdu]egǞ`&\\\p#9MӉ62O)fT+H]W1CHsH9)%hYx ;瞳{>ëoY|UsUBBҎ/~ߗSxr'"DDJnj^v3 9'BMiHqk8;*C;(eHC4n0tw&qýcS|J9 W*qcG)%Ta Sz﹨ WD4+r Az\)/0Ÿ*"SD(5FBp\ 'bv!dAMë1;h SVlPtڮ=9Q?>X9dMn*Qm=$Z<7y2f2S#&j_suT2Ыl eYgTaԵ>?jj<uWES>>PՒL "`4L;T]72[J @}cJjJ,kUE@M)ވWwòV"*DDr3: cs)y&ևX3-jLv!d 6UϷ=9׿x ܖd]^^c>g430E̖j{o[8RS1xOh\U"yn8_GwzUvc(ԉhy:tܠH|{ay$$LĬhIRaQZ&m..Nvt9Km`u 16<e!xn:4!WG1`bEpp6HR5"Yl1o2Mj7,?"7+'1f"fGa a&ˊo"qJQ̔BA|ī˲4MQ|\&QFEm6cSJ<~\"Bf/(Ƙ4)mA 4XhnC`bMgDcʮ~b4ԕw5ʩ!PH݆U⦪^,SU)TKr RJJt\oMl=2'~.9##$_޻TB.ǹzCΙcMy[X֫n)%9z$']=qd'-joHmLf{3윳7/҄q.2ЄDUe]W}7xKzNUS]UGK__+_MUL\b鄉MD !gm^TD~msU'F͕1FYj ȎI z'AD_T|sU"zM/RX>ڔh fwJ)EDTTybQ*@J$ȵ$SJ*݅g@SX$" qHU* D9 iŽ_cur$#`u0r4fA{*#䤘k_9ly "M*6f%@ڹ*5P [JܲX8TsjF~(hVf[wEU+U-1tSܛ]9my^)e&^ϕ^;V_]|w)jjՃ@M)F"Q`"( ZXE6u&rʚ;i@(!^ KYV33yw)xu]9}\.52m}Ft ֹP{/)S$lB'Dcl§y!7޳B1ʺXE-,]T5fPvdlrΑwSJjDyڞwJD') tv_8HUIH1C!J&~"ĥ$RbvucaWlq>~n suVU5yk Q $9 r*e(1FXUȫ1YE7AH.?DD5!l1-1lIU@{| |'(=&Lyڢ-9B%PDES kX_|O+BĬ`n}k+us{93,vx&iGh7ɭw5woЮumy}~TzcFvYQMKnSclC=0BLpn///4M䜓y.f^r4M˽{>[[/N%̷pq twgH}ސ~^_HNK)e]ºΪ6rq35I/KU`m׻{K4K2lz~yJ"U%ޝh֥)߾A_7x?pZ.ߧ-7`vQmi$/9zTIeCdpGY2u5馞3PMγ~qΑydTtc;Yu^}"Z!r-7 Ehߒm5WG4xO6]8W ])E bhY$sS9slD}\'"RZ>$:˴(r/"]ժiHKlK|y]K7%'=-cy'B缮j)j|T:Xc[xE$k"U\ۮTT},ɫ,9%缆f^^xᅯ_OoƗ61sK^ ?LOgH}7|7^-B<1qa& DDβb5k:u6E'6w2ݺLٟsk.\a5V٬)!(5sWj \E)sǣeUwy1^]]54K0< {9ow<ˇARJ7@sv;wy?ޔM~saFs[rlrjlHqIBȪJӘyy!"<g>__Ï}cTp2U?[W[үݻ}}NrrP7RJFeY:-r:&Վk<\j-vQ$v|$ì^VK*r,9ĶuB|8[ qwn*ڹ|놷,aju9~ QV.]Ur޳žYxѫ[VJT/⬺ૢ$7%o]|9eRf ԇ%qB)ksI1T&\J7zP\ܭۏw+uVɥ])Sjwn{BgvhJВs+!V^2ֻ1kG+zh$fe$M}<vl-'bBCEd3IB?w8C7-k~u>|````i$-놘<:3 3ܷ7SC eR7u8ǍN[R36~ȇ:ˢҷ~u[}szOF=o7CT}o#ԸnnUjo!AD7޿%kxut 9k9e>}````i&)u=oK~<o%)6u!xt 󁁁gI6 '$CM*|N淩wY"jMj1 􁁁E[kpt茪 >>;;;999555333000o`YYJ,%JVVVQQQNNNJJJGGGEEE@@@>>>;;;777555222000+++)))%%%o`J%,aaaZZZVVVSSSPPPLLLJJJGGGCCC@@@>>>:::777555222...+++)))%%%###oQ,%Jfff___[[[YYYUUUSSSPPPKKKJJJEEECCC@@@<<<:::777555000...+++'''%%%"""o`J%%ppphhheee```^^^[[[WWWUUURRRPPPKKKIIIEEECCC@@@<<<:::777333000...***'''%%%"""oQ%%wwwmmmjjjgggccc```^^^ZZZWWWUUURRRNNNKKKIIIEEECCC@@@;;;:::555333000,,,***'''%%% oQ%%|||ssspppkkkjjjfffccc```\\\ZZZWWWUUUPPPNNNKKKGGGEEEBBB@@@;;;999555333000,,,***'''### oQ%xxxuuurrrpppkkkiiifffccc```\\\ZZZWWWSSSPPPNNNJJJGGGEEEBBB>>>;;;999555333000+++***%%%### oJzzzwwwuuurrrnnnkkkiiifffgggddd___[[[VVVSSSPPPLLLJJJGGGEEE@@@>>>;;;777555222...+++)))%%%### `,|||zzzwwwuuurrrrrrpppoooqqqqqqlllbbb\\\VVVSSSPPPLLLJJJGGGCCC@@@>>>:::777555222...+++)))%%%### oJ}}}~~~}}}|||~~~uuummmggg```YYYVVVPPPKKKJJJEEECCC@@@<<<:::777555000...+++'''%%%"""`,pppjjjddd___XXXQQQLLLIIIEEECCC@@@<<<:::777333000...***'''%%%"""oJhhhccc]]]SSSLLLIIIEEECCC@@@;;;:::555333000,,,***'''%%% Y%eee[[[SSSLLLGGGEEEBBB>>>;;;999555333000,,,***'''###`,%ccc[[[SSSJJJGGGEEE@@@>>>;;;999555222000+++***%%%oJ%ccc[[[QQQJJJGGGEEE@@@>>>;;;777555222...+++)))%%%YcccZZZQQQJJJGGGCCC@@@>>>:::777555000...+++)))YbbbZZZNNNJJJEEECCC@@@<<<:::777555000...+++Y```TTTLLLIIIEEECCC@@@<<<:::777333000...Yeee[[[QQQKKKIIIEEEBBB@@@;;;:::555333000YaaaTTTNNNKKKGGGEEEBBB>>>;;;999555333YeeeYYYQQQNNNJJJGGGEEE@@@>>>;;;999555Ykkk```VVVPPPLLLJJJGGGCCC@@@>>>;;;888JfffZZZSSSPPPLLLJJJGGGCCC@@@>>><<<,jjj```UUURRRPPPKKKJJJEEECCC@@@YpppgggZZZUUURRRNNNKKKIIIEEEDDDJjjj]]]WWWUUUPPPNNNKKKIIIGGG,hhh]]]ZZZWWWSSSPPPNNNLLLJqqqggg```\\\ZZZVVVSSSPPPQQQ,qqqfffbbb```[[[ZZZVVVTTTJ~~~pppgggeeebbb^^^[[[ZZZZZZ%rrrjjjgggeee```___aaa%{{{rrrllljjjgggdddfff%yyyrrrpppmmmnnnmmm%%xxxuuusssvvvyyy%}}}|||}}}%???launchy-2.5/win/0000755000175000017500000000000011755560262012655 5ustar monesmoneslaunchy-2.5/win/launchy.rc0000644000175000017500000000156310721133010014626 0ustar monesmonesIDI_ICON1 ICON DISCARDABLE "launchy.ico" VS_VERSION_INFO VERSIONINFO FILEVERSION 1,9,9,1 PRODUCTVERSION 1,9,9,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Code Jelly" VALUE "FileDescription", "Launchy" VALUE "FileVersion", "1.0.0" VALUE "InternalName", "Launchy.exe" VALUE "LegalCopyright", "This is GNU Software copyright Josh Karlin" VALUE "OriginalFilename", "Launchy.exe" VALUE "ProductName", "Launchy" VALUE "ProductVersion", "2.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END ENDlaunchy-2.5/win/Utilities/0000755000175000017500000000000011355776633014637 5ustar monesmoneslaunchy-2.5/win/Utilities/Special Folders/0000755000175000017500000000000011355776633017576 5ustar monesmoneslaunchy-2.5/win/Utilities/Special Folders/My Computer.lnk0000644000175000017500000000015010673321045022425 0ustar monesmonesLFPO :i+00launchy-2.5/win/Utilities/Special Folders/Control Panel.lnk0000644000175000017500000000017410673321045022727 0ustar monesmonesLF*PO :i+00. !:i+00launchy-2.5/win/Utilities/Special Folders/C Drive.lnk0000644000175000017500000000045310673321045021503 0ustar monesmonesLF6~`M_CmMKm/PO :i+00/C:\2-1C:\ ..\..\..\..`XgiboF[CXJZT^ѧΎ5%F[CXJZT^ѧΎ5%launchy-2.5/win/Utilities/Special Folders/Recycle Bin.lnk0000644000175000017500000000015010673321045022340 0ustar monesmonesLF`@_dP/Nlaunchy-2.5/win/Utilities/Special Folders/My Network Places.lnk0000644000175000017500000000015010673321045023450 0ustar monesmonesLFX`, :i+00launchy-2.5/win/Utilities/Special Folders/My Music.lnk0000644000175000017500000000103710673321045021714 0ustar monesmonesLF`VM)&m@jMrH E%6\1v4$MYMUSI~1(v4}48My Music karlinjfg-fC:\Documents and Settings\karlinjf\My Documents\My MusicA..\..\..\..\Documents and Settings\karlinjf\My Documents\My Music`XgiboF[CXJZT^$XW%2F[CXJZT^$XW%2launchy-2.5/win/Utilities/Special Folders/My Documents.lnk0000644000175000017500000000065010673321045022575 0ustar monesmonesLFNM0Ԣmn"kH E%6^-]C:\Documents and Settings\karlinjf\My Documents8..\..\..\..\Documents and Settings\karlinjf\My Documents`XgiboF[CXJZT^.!EuF[CXJZT^.!Eulaunchy-2.5/win/Utilities/Special Folders/My Pictures.lnk0000644000175000017500000000105610673321045022433 0ustar monesmonesLF@jM"m0hxH E%6b14MYPICT~1.v4}48My Pictures'karlinjfj-iC:\Documents and Settings\karlinjf\My Documents\My PicturesD..\..\..\..\Documents and Settings\karlinjf\My Documents\My Pictures'v`XgiboF[CXJZT^ҧΎ5%F[CXJZT^ҧΎ5%launchy-2.5/win/Utilities/System Power/0000755000175000017500000000000011355776633017200 5ustar monesmoneslaunchy-2.5/win/Utilities/System Power/System Hibernate.lnk0000644000175000017500000000266211252675232023047 0ustar monesmonesLF g <0F2AVPO :i+00/C:\<1+;GWINDOWS&X:X+;GWINDOWS@1+;Fsystem32(X:X+;Fsystem32L28Q- rundll32.exe0\4+;WFrundll32.exeU3TXSystemC:\WINDOWS\system32\rundll32.exe%windir%powrprof.dll,SetSuspendState!%SystemRoot%\system32\SHELL32.dll%windir%\system32\rundll32.exem|w P @P P .wCwPwR(NwTNwNw 4pNw$?ECJxn/[>$?launchy-2.5/win/Utilities/System Power/System Reboot.lnk0000644000175000017500000000257611252675232022404 0ustar monesmonesLF g <4T/nWLPO :i+00/C:\<1+;GWINDOWS&X:X+;GWINDOWS@1+;Fsystem32(X:X+;Fsystem32L2L8R- shutdown.exe0\4';4shutdown.exeU3TXSystemC:\WINDOWS\system32\shutdown.exe%windir%-r!%SystemRoot%\system32\SHELL32.dll%windir%\system32\shutdown.exem|w P @P P .wCwPwR(NwTNwNw 4pNw$?ECJxn/[>$?launchy-2.5/win/Utilities/System Power/System Logoff.lnk0000644000175000017500000000257611252675232022366 0ustar monesmonesLF g <4T/nWLPO :i+00/C:\<1+;GWINDOWS&X:X+;GWINDOWS@1+;Fsystem32(X:X+;Fsystem32L2L8R- shutdown.exe0\4';4shutdown.exeU3TXSystemC:\WINDOWS\system32\shutdown.exe%windir%-l!%SystemRoot%\system32\SHELL32.dll%windir%\system32\shutdown.exem|w P @P P .wCwPwR(NwTNwNw 4pNw$?ECJxn/[>$?launchy-2.5/win/Launchy.ico0000644000175000017500000007234610673376524014774 0ustar monesmones 00h . ( 00& v$h>+00 %0  NV f h~p(0`xxxxxxxxwxwwwwwwwwwwwwxwxwwxwwwwxwwxwwwxwwwxwwwwxwswwxw7wwxw3wwxws7wwwxw{3wwwwxw3{wwwxffw337xfDDFfffwws7wdffh`wfffxfffwwvfdhwvffffffwfdhwfhxffffwwdfhwffhwffffwfFwfffgff`wxffxfffgffw`wvdgvgwfffffffwfHwfwwvfffffffwDvfvfwwff`wHffgxwwwvfwdfffhwwxwwx`wHfffwwwwwx`wwtowfhwwwwwwx`wwwgxwwwwwwwxxhvgwwwwwvgffwwwffhxww`vfhwwxvfhwwwwxwwvxwwxgwhx????????????????????????( @xxxxxxwwwwwwwwwxwwxwwxwwwxwwxw7wxwwwwxwswwxxw3;wxfff`ww7x6dfwxvDhffffw{xDhxfgfffwwdhxffgvfwvFwffgfhwdhwffffwHvhvwv`wtffwwwwx`whvffwwwwwgoxhwwwwxvgwxhwwpfhwgwwwphwwp?(0wwwwwwwwww{wwwwffdhffdhhffhfffHwvfhf`vghf`hhwwvhwwwpwxvwfwwhwx?( wwwwwxwxwxwwxw{wxwwvfffwxhffwf`gxx`wxwwwowhxpvh(0`gggpppxxxtttrrrz' ppq<orudLm]d9`3g?tS)ƴY#uE q@p=q>uCwH|N}S {PxKse)rAq?sBsMv~~f\.jIyBvG yP2Kɵc1yEʻƩz: ‡ʏ-~ zzy}VºşM {zОXեlΚO{}6rBýţÚB~}ңe֬x}Ɗ|Lgj<}ڴx˜Dlϳxw۸{թkͫ-˓:ốĖ}!csEҰmcnΦQˆˑ4rl8Ȝ=ō"͕BmM‡ΖHÞkŸWʍ&ǬýqqA{B̢fkGקlr3                      !"# $$ #" $%&' #" ()*+$ #" +,-.$ #" /01*. #" .-23. $ $ #" (4153.&4'6&($ #" .*718.393400($ #:;" (4<21)*8,0-6%4$=>>#:?@" .*52>CDEFGHHIJ" &%+B552251ABKLFMNOPPPQRSTUVWN" '8-A55,*AXYZ[\]^^\WH_`aabcc`de" (8B53ffgZhiRN\jG`klmnopqrrqosM" '0-A<TR]MCp" =M\Q_{ooq" QQFfkoS " >EPPEŪƜǰfȮnmºΝ" =CjEЁ}ҫL" ##F٦}aj!##>LϟgLҌ⯅aS!_N櫪>ҌD腅ߴ"btffD腅f+樵Ieч೿yㅴffff+浵 aSb}NJfffffg+eLќ}ҌfffffgIy}DzیlffffIyx+ffesǓnE:ߨ>!_Lx[HI????????????????????????( @kkkssszzzyyyxxx~~~e(O D»xn 1jɸgc3{MtBtD yM{R"j?u`2j6d:}[lh_WxOθd2r:X)jh@Œ9 {hir=m9{İĞJy եhɖ@z{_ qaT4n7vHƴ˞E|Ž)սxđ-ӡKCjS,ٵyԥ_ҢT|ˢʩŕ.|0~ mZvzǑƌ Ɏ-RҩƉ̒7Δ=Ƙ[špþȔ(ǡlvVͫdɌ%͖D༉ܺ¾ΗM˞bИ9ͯխx٩mAMt<{           !"##$############% & '(((()*(((((((((((#+& ',-(./01((((((((((#2& ',-(3(4/1(((((((((#2& ',-((156713***((((#2& ',-((318699:9;*3(-<=>?@ ',-(((A/BCDEDFG<%(HIJKL ',-(((M*4NO6PQDRSTUVWXYY ',-(((*7ZO[\8]^V_W`abcdeef ',-((3)F8Qghijjklmnopqrrrqs ',-((3tFCZuvwkxyz{|}~ ',-((3)br~ ',-((%j^Rq ',-((Tahh',-(-Z+Z.]6q 5TpR&t?zOlB_S83:4r=u;`4hd*Ď*͖B}z~Yk?zLrǧe}wʜDŦyѝ<lk:pHȯװpۭpÌ}yӦ[z7ȼtAgѳtحeGgjxMW'iҭ\ćգUԹIJW n}UŏƤ_ǐ,͑3ɚW¾tPέkʛ;ʝ^cɒ"NJ ݴwơšTʐ,̔B͖KϞ_âݹ̛Zk     !"#$%&'''''''"()"'*+,-'#''''"!)"'./0%1234''"567)"''89:;<=>?@ABCD)"''EFGHIJKLMNOPQR)"'##STUVWXYZ[\]^_`R)"'#'abcdefghijklmnR)"''opqrstuvwxyz{|}~)"'')"'!"n?( }}}\6cɼ}ct[t`U:],n9~>-'kvzl\$J5ѠLȓ6yuVh7ǥeĕċz˜C&zxGȚ8ȍ׾¨zxvRؼ԰k˕C¼|^=М>²d)ԦTثjԣaùSo4e4z    !"#$%&'()*+ ,-./01()23456789:;()2<=>?@ABCDEF()GHIJKLMNOPQR()STUVWXYZ[\]^_`abcdefghFijklmnopqrstuvwxyzx{|}~x(0` ffffffcccjjjpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppooohhhcccQeeeeeeeeeeeeeeeeeeeeecccIdddwwwoooddd4eeeeeeeeeeeeeeeeeekkkwww咒iii|cccddddddddddddddd|||옘ssscccfffffffffffffff|||롡ssscccfffffffffffffffyyy뮮rrrcccfffffffffffffffxxx붶qqqcccfffffffffffffffxxx뷷qqqcccfffffffffffffffxxx붶qqqcccfffffffffffffffxxx뵵qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴~qqqcccfffffffffffgffgxxx봴*qqqcccfffffffghfgggebxxx봴 qqqcccfffeimehlpS/wG xxx봴/qqqcccehml\HpP'wDwH xxx봴qrsbfllZCwDvAvG wGxxx봴;'pswhXCwDwF uDvG wGxxx봴 ?b_^rȽm|Ug=a6e9iDuS)uAgvF ?wF uDvG wGxxx봴I #bUȴ[[)wG q?m9l8o;p<sBvG{N|T#zPxLtD uD=wG xxx봴`o^pc,sAq?q?o<r?zLa7wZw~{t~c\0vF xxx봴JpdK"xAsCuE r@wIfjrBq?uDq?S rĻ˼ĠU ŕ0ڲz߸Ԩg R xxx봴nL9a4s=uF sBzKgŨşK|ŗ3Ҭ^ҲǤțA'&*ԣE.^&xxx봴kkIs?tCrAnDȼѾЮeŒ "ʞC۽̣Q&Ó2Îͬ}¬Zxxx봴fgE|Cr@wI’ֱlݸ~ٳoɛ7"ʟDٻyɟF##̡Lνxxx봴{MwBn=]+̦TزmƕȜ8Ǚ8ЩTڸtƔԯfĖ5&’/˟I۽Ȳ`xxx봴X"r?n<sJɜɛ6ҫYŽ ’,ǢTɬmǪmĚD!/ɜ8q vKxxx봴l@m;o>gԴr|ѥM۾ԭW0hLď yj:ȷyyy촴tn;n<qϩXy Ƒ%ѢKҳ~+s\ ܾ.vvvٵʿvHk8vͣI|čʑ,ќF׭fմȻjVhCfff,rrrfmBi4dЪXœ'ȓ*˔2͔8ΙEӠUبfϴtJcccfffYβk7nAضj˭n̯֭fѝGϛHϙIМUìĽ¼ýX%dddhhhbȸlBvE ɍÐ۶zӞRѝW»þ½pyI}e5dddhhh9tщp?ձ΢Eܻ֨g¼g?tB;wG zL{M{M{Mdddhhhq\0`\-ͿƖ.ŏի]΢˲ýºwGvD wG vF vF vF vF dddhhhpLo9n;бt ̗4ԦW߻ϩԵʥڶ¾Ľ[-s?3wG wG wG wG wG wG dddhhhmHo:q> V%´Ȕ.ɐ'Ϙ>ѠP֩f۲z۴ٮvѭ|ĿþjFsAlwG wG wG wG wG wG wG dddhhhjFl7p?k8hAȮ͔,ћDҢUԥ^էdըj֫r֫r֨qjFsBwF wG wG wG wG wG wG wG \\\```v`3wG {M{MxHkȨjפLβƣşٲ}حw۬rϱ[-r@jvE wG wG wG wG wG wG wG wG ɹǵůȶȶȶͼb|:ڭg޸֪rƗZAhsSuHsA8vG vF wG wG wG wG wG wG wG wG ]xB溛q˺¥xAf+ޚtCm>yI^1ߙpmg@xLr?\tD vE vG vF wG wG wG wG wG wG wG wG ̼_#B­]˹g̺j˼R6m!j V#n: uCdwIyMwKtE sBer?0tB uDtEvE vG vF wG wG wG wG wG wG wG wG ????????????????????????( @ bbbfffuuuzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyynnnccc)cccdddddddddjjjpppfffhhhhhhhhhqqqsssssssssooorrrrrrrrr{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqsv{{{ammmqsvqtyt]B{{{*mosrkbsX7wC{{{M'ndWwF uAvF {{{Dúvjq@wDtD vF {{{e#/eɺga1zKtC tDyM{S${R#xOsEWuD {{{kI=t`2u>i4qA _7{\ge]YV|OU {{{GiŮe3p7o:Y,jpŞR˜K}k{{{Dkhp=n5Z*ışRϢLѥ\ĉ` {{{o_S6k2wIqϽΪZ }Ɨ4ʙΪ% ձi˛j{{{kS,q3b7ȸŗŒ̟@ǘ5Î%(ө<{{{b3k1_ɭͥK޾ϥĐÒ)˨^αwƚAǙ45||||Vf/|ͨəۺŚ=\*| wBʹyyyg3{ʖ ˔1׬dԯȹueϸggg&{MkٲƠOț?̕3Ζ=қKϫymEujhhh ]z`6ԬҬW޼ҚIƣrſþƿzKaxGvF vF hhh9bkZ1ĮΡ<ծ^έuVr>"tBtBtBhhh[.tSέgŋخfӰ˩½ývFtAvD vD vD hhhqSk7k8Bt͘3͕4ҠSתlٮvҩu¾|T#r>vE vE vE vE iiiiAuD uDxMV[ܭ\Ƣĝܳ}ܬqñzPq?wG wF wF wF wF ~xqμƳ«Ƴȴ¯$RʣjŚdPyBߝzpLpAnp<tCwF wF wF wF wF ȶkiͻ¯ѿm}UG`.!q>H~V'g?d;{S#rB`p;sBr@tCwF wF wF wF wF ?(0 bbb3iii}}} {{{hhh[dddeeeeeeyyyyyyzzzzzz{^;Dwl{`@s>`>p? uHtC  8TȺgi>Z0\4^9zR%vMdsD 9~D}lQ*u>vJ f=~QL@BAa'Kt@w:Z1ib›FХUҢS k [m= wGrʮqŔ) ÎУŖ7'߻wbg5kF˶ϤѧΠBő"ȐӪÒ-ɛ;вVŹs>jѴt̞9˗R,_~~~}S)hԲeʒ,ʚıtr,Ĵkkk#qi~Y͜ϯi͛@Е:ΣhoH_ɶggg~~~,Դ¿ƔsPбoͥktA9q=p<gggiJJb͘,۲k¸a6n8q=q=gggqFsEmȢ[ӝ?զa۰v׮yzYn:"r=r>r>ggh~{wSYg×SԷܺ̚[xŻe;n:$r>r>r>r>fhi~®Ƴɸȶ wh̻̫˵UoY"MZ.~`Ǘ}^ąb7q@Nj7 p=r?r>r>r>?(  ooo煅億億億億億億億億充tttiiijjjےՃљ΃ѧ΁Ѻ΁Ѽ΂scѻfwaGtEѻ{6cʼz|boUvMhtE ѻt^Q;[0o;D/*iѻwp_[(T8Ɣ'͝ѥRɖ+ĚQӻmRj<ӺР<ụ̈̀MƛGlмy{Mɚ6զMͻ}pB}}}:VΞ۸v͛QókB;jwww-f×Bɒµvk5k5yyygFf.ٯd߹֬wûsC ;p<r>yxw~Hιcl@̱͎mEm;$o;r>r>launchy-2.5/win/buildTranslations.bat0000644000175000017500000000011311346754567017052 0ustar monesmonescd ..\src %QTDIR%\bin\lupdate src.pro %QTDIR%\bin\lrelease src.pro pauselaunchy-2.5/win/installer/0000755000175000017500000000000011355776633014661 5ustar monesmoneslaunchy-2.5/win/installer/header.bmp0000644000175000017500000001546611354223357016612 0ustar monesmonesBM66(00kkkoooppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppnnnsssxxxxxx۠Ҭ߶߶߶߶5߶!߶3(߶&߶:,ℾj⃾߶6ft?x¶kyQb5_2a4g@uTɷ>!")wG[\)wHwHwHwHwHwHwHwHwHyLxIf5l$o^"x}Z&wHwHwHwHwHyK_/tOp|~c]*xJunP#wHwHwHwHyKb4j~W3%KY$⇿QD>ǵe5wHwHxIwHzLzUøuD#Ȗ;ΛJ  ~ \U@認hwHwHxIxJU dżǶK"Ɨ6۴~ݵթj ZWL3b6wHwHxI}P_ʾν™A  Ɨ5ѫ\а׾šǙ=#&(Ē/ПEđ3XipNwHxIxJi;Ŷͻ̩ađ" "ʟDڼ{̢N')ĕ5ַܾ˺_rMwHwH|NxԼհk߽ڶvʜ8 #ʟEٺy׹ʟG(+ˡLϽ⿷~SwHwH^,ʹ϶˦V۸{Ŕʝ<Ǚ9ЫZٺzǙӯgŘ8(Ó1ɟHع}ʶʂW#wHwHnA(͢E׺ѪVÑ%‘)ǠKɫkɫlśC(#-ŗ84׏j=wHxJ[ͫd Ð ѦOعҭ[Ñ%0iO&|P᪑rxIyJhɡLƒ'ѣMῇҴ,{n7|PxIiʡJčɒ-ѝGخjԵȺm^ծi;yJV̥PÕ/Ǖ,ɕ0˕2͖9ΙEҢX׫nѶa޽xIm?үcѷˮ֮gҠNϛIϛMОYĭ¼ýžýe࿿ߖtKRȚ4ٿ۵{ӢZПZ¼üƿþ½sžyL~ʣē&ѧQٵըk¼üĶg>ʸ\*˻Ŕ.ȕ-լ]͠˱ýľئ}Uk|ʩhč˗4էX߼ϩҰɣ۶þ칶g<}Vöŏ%ʓ.ϙ@ҡS֪g۳{۵ٱ|Ԯ{ýnJǴwOȯ˕3НGӣX֨d֪l׬q׬t֫tթrsPuLʧlӢQؽо̰Š›دy֫uըqʬڭg<İj\ٯn۵׭w΢iWmаwWxN鶛{Q|ƫQq;uFsoGtqpJyQɷo]\sɶlaunchy-2.5/win/installer/SETUP.iss0000644000175000017500000003406111354227675016301 0ustar monesmones; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "Launchy" #define MyAppVerName "Launchy 2.5 Beta 3" #define MyAppPublisher "Code Jelly" #define MyAppURL "http://www.launchy.net" #define MyAppExeName "Launchy.exe" #define MyAppUrlName "Launchy.url" [Setup] AppMutex=LaunchyMutex,Global\LaunchyMutex AppName={#MyAppName} AppVerName={#MyAppVerName} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={code:DefaultInstallDirectory}\{#MyAppName} DefaultGroupName={#MyAppName} LicenseFile=..\..\license.txt OutputDir=Release\ OutputBaseFilename=Launchy_Setup SetupIconFile=..\Launchy.ico Compression=lzma SolidCompression=true ShowLanguageDialog=yes AppID=Launchy_21344213 CreateUninstallRegKey=not IsPortable UninstallDisplayIcon={app}\{#MyAppExeName} PrivilegesRequired=none WizardSmallImageFile=header.bmp AllowNoIcons=yes [Languages] Name: english; MessagesFile: compiler:Default.isl [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; Check: not IsPortable Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0, 6.1; Check: not IsPortable Name: iconscurrentuser; Description: {cm:IconsCurrentUser}; GroupDescription: {cm:CreateIconsFor}; Flags: exclusive; Check: not IsRegularUser And not IsPortable Name: iconscommon; Description: {cm:IconsAllUsers}; GroupDescription: {cm:CreateIconsFor}; Flags: exclusive unchecked; Check: not IsRegularUser And not IsPortable [InstallDelete] Type: filesandordirs; Name: {app}\skins\Black Glass Type: filesandordirs; Name: {app}\skins\Default Type: filesandordirs; Name: {app}\skins\Mercury Type: filesandordirs; Name: {app}\skins\Note Type: filesandordirs; Name: {app}\skins\Quicksilver2 Type: filesandordirs; Name: {app}\skins\Spotlight Wide Type: filesandordirs; Name: {app}\platform_win.dll [Files] Source: ..\..\release\{#MyAppExeName}; DestDir: {app}; Flags: ignoreversion Source: LaunchyPortable.ini; DestDir: {app}; DestName: Launchy.ini; Flags: onlyifdoesntexist; Check: IsPortable ; Translations Source: ..\..\translations\launchy_es.qm; DestDir: {app}\tr\; Flags: ignoreversion Source: ..\..\translations\launchy_de.qm; DestDir: {app}\tr\; Flags: ignoreversion Source: ..\..\translations\launchy_ja.qm; DestDir: {app}\tr\; Flags: ignoreversion Source: ..\..\translations\launchy_zh.qm; DestDir: {app}\tr\; Flags: ignoreversion ; Libs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files Source: ..\..\release\QtCore4.dll; DestDir: {app}; Flags: ignoreversion Source: ..\..\release\QtGui4.dll; DestDir: {app}; Flags: ignoreversion Source: ..\..\release\QtNetwork4.dll; DestDir: {app}; Flags: ignoreversion Source: ..\..\release\imageformats\qmng4.dll; DestDir: {app}\imageformats; Flags: ignoreversion Source: ..\msvcp80.dll; DestDir: {app}\Microsoft.VC80.CRT\; Flags: ignoreversion Source: ..\msvcr80.dll; DestDir: {app}\Microsoft.VC80.CRT\; Flags: ignoreversion Source: ..\Microsoft.VC80.CRT.manifest; DestDir: {app}\Microsoft.VC80.CRT\; Flags: ignoreversion ; Plugins Source: ..\..\release\plugins\controly.dll; DestDir: {app}\plugins\; Flags: ignoreversion Source: ..\..\release\plugins\calcy.dll; DestDir: {app}\plugins\; Flags: ignoreversion Source: ..\..\release\plugins\gcalc.dll; DestDir: {app}\plugins\; Flags: ignoreversion Source: ..\..\release\plugins\runner.dll; DestDir: {app}\plugins\; Flags: ignoreversion Source: ..\..\release\plugins\verby.dll; DestDir: {app}\plugins\; Flags: ignoreversion Source: ..\..\release\plugins\weby.dll; DestDir: {app}\plugins\; Flags: ignoreversion ; Plugin icons Source: ..\..\plugins\calcy\calcy.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\controly\controly.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\controly\launchy.exit.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\controly\launchy.options.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\controly\launchy.rebuild.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\runner\runner.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\verby\copy.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\verby\opencontainer.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\verby\properties.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\verby\run.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\verby\verby.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion Source: ..\..\plugins\weby\weby.png; DestDir: {app}\plugins\icons\; Flags: ignoreversion ; Documentation Source: ..\..\license.txt; DestDir: {app}; Flags: ignoreversion Source: ..\..\readme.pdf; DestDir: {app}; Flags: ignoreversion isreadme ; Skins Source: ..\..\skins\Mercury\frame.png; DestDir: {app}\skins\Mercury\; Flags: ignoreversion Source: ..\..\skins\Mercury\author.txt; DestDir: {app}\skins\Mercury\; Flags: ignoreversion Source: ..\..\skins\Mercury\style.qss; DestDir: {app}\skins\Mercury\; Flags: ignoreversion Source: ..\..\skins\Mercury\scrollBack.png; DestDir: {app}\skins\Mercury\; Flags: ignoreversion Source: ..\..\skins\Mercury\scrollDown.png; DestDir: {app}\skins\Mercury\; Flags: ignoreversion Source: ..\..\skins\Mercury\scrollUp.png; DestDir: {app}\skins\Mercury\; Flags: ignoreversion Source: ..\..\skins\Mercury\spinner.mng; DestDir: {app}\skins\Mercury\; Flags: ignoreversion Source: ..\..\skins\Quicksilver2\frame.png; DestDir: {app}\skins\Quicksilver2\; Flags: ignoreversion Source: ..\..\skins\Quicksilver2\author.txt; DestDir: {app}\skins\Quicksilver2\; Flags: ignoreversion Source: ..\..\skins\Quicksilver2\style.qss; DestDir: {app}\skins\Quicksilver2\; Flags: ignoreversion Source: ..\..\skins\Quicksilver2\background_nc.png; DestDir: {app}\skins\Quicksilver2\; Flags: ignoreversion Source: ..\..\skins\Quicksilver2\mask_nc.png; DestDir: {app}\skins\Quicksilver2\; Flags: ignoreversion Source: ..\..\skins\Note\frame.png; DestDir: {app}\skins\Note\; Flags: ignoreversion Source: ..\..\skins\Note\author.txt; DestDir: {app}\skins\Note\; Flags: ignoreversion Source: ..\..\skins\Note\style.qss; DestDir: {app}\skins\Note\; Flags: ignoreversion Source: ..\..\skins\Note\scrollBack.png; DestDir: {app}\skins\Note\; Flags: ignoreversion Source: ..\..\skins\Note\scrollDown.png; DestDir: {app}\skins\Note\; Flags: ignoreversion Source: ..\..\skins\Note\scrollUp.png; DestDir: {app}\skins\Note\; Flags: ignoreversion Source: ..\..\skins\Black_Glass\author.txt; DestDir: {app}\skins\Black Glass\; Flags: ignoreversion Source: ..\..\skins\Black_Glass\frame.png; DestDir: {app}\skins\Black Glass\; Flags: ignoreversion Source: ..\..\skins\Black_Glass\style.qss; DestDir: {app}\skins\Black Glass\; Flags: ignoreversion Source: ..\..\skins\Black_Glass\scrollBack.png; DestDir: {app}\skins\Black Glass\; Flags: ignoreversion Source: ..\..\skins\Black_Glass\scrollDown.png; DestDir: {app}\skins\Black Glass\; Flags: ignoreversion Source: ..\..\skins\Black_Glass\scrollUp.png; DestDir: {app}\skins\Black Glass\; Flags: ignoreversion Source: ..\..\skins\Black_Glass\spinner.mng; DestDir: {app}\skins\Black Glass\; Flags: ignoreversion Source: ..\..\skins\Default\author.txt; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Default\frame.png; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Default\style.qss; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Default\opsButton.png; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Default\opsButtonPressed.png; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Default\scrollBack.png; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Default\scrollDown.png; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Default\scrollUp.png; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Default\spinner.mng; DestDir: {app}\skins\Default\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\author.txt; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\frame.png; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\style.qss; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\opsButton.png; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\opsButtonPressed.png; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\scrollBack.png; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\scrollDown.png; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\scrollUp.png; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\spinner.mng; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\background_nc.png; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\..\skins\Spotlight_Wide\mask_nc.png; DestDir: {app}\skins\Spotlight Wide\; Flags: ignoreversion Source: ..\Utilities\Special Folders\C Drive.lnk; DestDir: {app}\Utilities\Special Folders\; Flags: ignoreversion Source: ..\Utilities\Special Folders\Control Panel.lnk; DestDir: {app}\Utilities\Special Folders\; Flags: ignoreversion Source: ..\Utilities\Special Folders\My Computer.lnk; DestDir: {app}\Utilities\Special Folders\; Flags: ignoreversion Source: ..\Utilities\Special Folders\My Documents.lnk; DestDir: {app}\Utilities\Special Folders\; Flags: ignoreversion Source: ..\Utilities\Special Folders\My Music.lnk; DestDir: {app}\Utilities\Special Folders\; Flags: ignoreversion Source: ..\Utilities\Special Folders\My Network Places.lnk; DestDir: {app}\Utilities\Special Folders\; Flags: ignoreversion Source: ..\Utilities\Special Folders\My Pictures.lnk; DestDir: {app}\Utilities\Special Folders\; Flags: ignoreversion Source: ..\Utilities\Special Folders\Recycle Bin.lnk; DestDir: {app}\Utilities\Special Folders\; Flags: ignoreversion Source: ..\Utilities\System Power\System Logoff.lnk; DestDir: {app}\Utilities\System Power\; Flags: ignoreversion Source: ..\Utilities\System Power\System Reboot.lnk; DestDir: {app}\Utilities\System Power\; Flags: ignoreversion Source: ..\Utilities\System Power\System Shutdown.lnk; DestDir: {app}\Utilities\System Power\; Flags: ignoreversion Source: ..\Utilities\System Power\System Hibernate.lnk; DestDir: {app}\Utilities\System Power\; Flags: ignoreversion [INI] Filename: {app}\{#MyAppUrlName}; Section: InternetShortcut; Key: URL; String: {#MyAppURL} [Icons] Name: {code:UserOrCommonDirectory|programs}\{groupname}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}; Parameters: /show Name: {code:UserOrCommonDirectory|programs}\{groupname}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {app}\{#MyAppUrlName} Name: {code:UserOrCommonDirectory|programs}\{groupname}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe} Name: {code:UserOrCommonDirectory|startup}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; WorkingDir: {app} Name: {code:UserOrCommonDirectory|programs}\{groupname}\Readme.pdf; Filename: {app}\Readme.pdf; WorkingDir: {app} Name: {code:UserOrCommonDirectory|programs}\{groupname}\Launchy Rescue Mode; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}; Parameters: /rescue Name: {userdesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Parameters: /show; WorkingDir: {app}; Tasks: desktopicon Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Parameters: /show; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}; Tasks: quicklaunchicon [Run] Filename: {app}\{#MyAppExeName}; Parameters: /show; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent runasoriginaluser [UninstallDelete] Type: files; Name: {app}\{#MyAppUrlName} [CustomMessages] CreateIconsFor=Create start menu and desktop icons for: IconsCurrentUser=The current user only IconsAllUsers=All users [Code] var PortablePage: TInputOptionWizardPage; function IsRegularUser(): Boolean; begin Result := not (IsAdminLoggedOn or IsPowerUserLoggedOn); end; function IsPortable(): Boolean; begin if PortablePage = nil then Result := false else Result := PortablePage.Values[1]; end; function DefaultInstallDirectory(Param: String): String; begin if IsPortable then Result := ExpandConstant('{drive:{srcexe}}') else if IsRegularUser then Result := ExpandConstant('{localappdata}') else Result := ExpandConstant('{pf}'); Result := Result + '\{#MyAppName}'; end; function UserOrCommonDirectory(Param: String): String; begin if IsTaskSelected('iconscommon') then Result := ExpandConstant('{common' + Param + '}') else Result := ExpandConstant('{user' + Param + '}') end; procedure InitializeWizard; begin PortablePage := CreateInputOptionPage(wpLicense, 'Installation Type', 'How should Launchy be installed?', 'Launchy can run as an installed application or in portable mode. Please select your preferred mode', True, False); PortablePage.Add('Normal'); PortablePage.Add('Portable'); PortablePage.Values[0] := True; end; function NextButtonClick(CurPageID: Integer): Boolean; begin if (CurPageID = PortablePage.ID) then begin WizardForm.DirEdit.Text := DefaultInstallDirectory(''); WizardForm.NoIconsCheck.Checked := IsPortable; end; Result := true; end; function ShouldSkipPage(PageID: Integer): Boolean; begin if (PageID = wpSelectProgramGroup) and IsPortable then begin WizardForm.NoIconsCheck.Checked := true; Result := true; end; end; launchy-2.5/win/installer/LaunchyPortable.ini0000644000175000017500000000003011354223357020434 0ustar monesmones[General] version=200 launchy-2.5/win/Create Visual Studio projects.cmd0000644000175000017500000000005411260000425021007 0ustar monesmones@echo off cd .. qmake -tp vc -r launchy.pro launchy-2.5/src/0000755000175000017500000000000011355776633012656 5ustar monesmoneslaunchy-2.5/src/InputDataList.h0000644000175000017500000000174111260000425015525 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef INPUTDATALIST_H #define INPUTDATALIST_H #include "catalog.h" class InputDataList : public QList { public: void parse(const QString& text); QString toString(bool omitLast = false) const; }; #endif // INPUTDATALIST_H launchy-2.5/src/platform_base_hotkey.h0000644000175000017500000000304111121321532017175 0ustar monesmones/* * globalshortcutmanager.h - Class managing global shortcuts * Copyright (C) 2006 Maciej Niedzielski * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef GLOBALSHORTCUTMANAGER_H #define GLOBALSHORTCUTMANAGER_H #include #include #include class QObject; class KeyTrigger; class GlobalShortcutManager : public QObject { public: static GlobalShortcutManager* instance(); static void connect(const QKeySequence& key, QObject* receiver, const char* slot); static void disconnect(const QKeySequence& key, QObject* receiver, const char* slot); static bool isConnected(const QKeySequence& key); static void clear(); GlobalShortcutManager(); ~GlobalShortcutManager(); private: static GlobalShortcutManager* instance_; class KeyTrigger; QMap triggers_; }; #endif launchy-2.5/src/LineEditMenu.h0000644000175000017500000000042311247612646015341 0ustar monesmones#ifndef LINEEDITMENU_H #define LINEEDITMENU_H #include class LineEditMenu : public QLabel { Q_OBJECT public: LineEditMenu(QWidget* parent = 0); void contextMenuEvent(QContextMenuEvent *event); signals: void menuEvent(QContextMenuEvent*); }; #endif launchy-2.5/src/catalog_types.cpp0000644000175000017500000001642211347515122016206 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "catalog_types.h" #include "globals.h" bool Catalog::load(const QString& filename) { QFile inFile(filename); if (!inFile.open(QIODevice::ReadOnly)) { qWarning("Could not open catalog database file for reading"); return false; } QByteArray ba = inFile.readAll(); QByteArray unzipped = qUncompress(ba); QDataStream in(&unzipped, QIODevice::ReadOnly); in.setVersion(QDataStream::Qt_4_2); while (!in.atEnd()) { CatItem item; in >> item; addItem(item); } return true; } bool Catalog::save(const QString& filename) { QByteArray ba; QDataStream out(&ba, QIODevice::ReadWrite); out.setVersion(QDataStream::Qt_4_2); for (int i = 0; i < count(); i++) { CatItem item = getItem(i); out << item; } // Zip the archive QFile file(filename); if (!file.open(QIODevice::WriteOnly)) { qWarning("Could not open catalog database file for writing"); return false; } file.write(qCompress(ba)); return true; } void FastCatalog::addItem(const CatItem& item) { catList.push_back(item); int index = catList.count() - 1; CatItem* pCatItem = &catList[index]; foreach(QChar c, item.lowName) { if (catIndex[c].count() == 0 || catIndex[c].last() != pCatItem) catIndex[c].push_back(pCatItem); } } int FastCatalog::getUsage(const QString& path) { for (int i = 0; i < catList.size(); ++i) { if (path == catList[i].fullPath) { return catList[i].usage; } } return 0; } void FastCatalog::incrementUsage(const CatItem& item) { for (int i = 0; i < catList.size(); ++i) { if (item == catList[i]) { // If an item is demoted, return it to a usage count of 1 if (catList[i].usage < 0) catList[i].usage = 1; else ++catList[i].usage; break; } } } void FastCatalog::demoteItem(const CatItem& item) { for (int i = 0; i < catList.size(); ++i) { if (item == catList[i]) { // If an item is not demoted, demote it if (catList[i].usage > 0) catList[i].usage = -1; else // otherwise demote it further --catList[i].usage; break; } } } int SlowCatalog::getUsage(const QString& path) { for (int i = 0; i < catList.size(); ++i) { if (path == catList[i].fullPath) { return catList[i].usage; } } return 0; } void SlowCatalog::incrementUsage(const CatItem& item) { for (int i = 0; i < catList.size(); ++i) { if (item == catList[i]) { // If an item is demoted, return it to a usage count of 1 if (catList[i].usage < 0) catList[i].usage = 1; else ++catList[i].usage; break; } } } void SlowCatalog::demoteItem(const CatItem& item) { for (int i = 0; i < catList.size(); ++i) { if (item == catList[i]) { // If an item is not demoted, demote it if (catList[i].usage > 0) catList[i].usage = -1; else // otherwise demote it further --catList[i].usage; break; } } } void SlowCatalog::addItem(const CatItem& item) { catList.push_back(item); } bool Catalog::matches(CatItem* item, const QString& match) { int matchLength = match.count(); int curChar = 0; foreach(QChar c, item->lowName) { if (c == match[curChar]) { ++curChar; if (curChar >= matchLength) { return true; } } } return false; } QString Catalog::decorateText(const QString& text, const QString& match, bool outputRichText) { if (!gSettings->value("GenOps/decoratetext", false).toBool()) return text; QString decoratedText; int matchLength = match.count(); int curChar = 0; int index = text.toLower().indexOf(match); if (index > 0) decoratedText = text.left(index); else index = 0; bool highlighted = false; for (; index < text.count(); ++index) { QChar c = text[index]; // prefix based rendering is buggy with lots of underlines limit it to 15 // until we get round to replacing the list widget delegate with a rich text delegate if (curChar < matchLength && c.toLower() == match[curChar].toLower() && (outputRichText || curChar < 15)) { if (outputRichText) { if (!highlighted) { decoratedText += ""; highlighted = true; } decoratedText += c; } else decoratedText += QString("&") + c; ++curChar; } else { if (outputRichText && highlighted) { decoratedText += ""; highlighted = false; } decoratedText += c; } } if (outputRichText && highlighted) { decoratedText += ""; highlighted = false; } return decoratedText; } void Catalog::searchCatalogs(const QString& text, QList & out) { gSearchText = text.toLower(); QList catMatches = search(gSearchText); // Now prioritize the catalog items qSort(catMatches.begin(), catMatches.end(), CatLess); // Check for history matches QString location = "History/" + gSearchText; QStringList hist; hist = gSettings->value(location, hist).toStringList(); if (hist.count() == 2) { for (int i = 0; i < catMatches.count(); i++) { if (catMatches[i]->lowName == hist[0] && catMatches[i]->fullPath == hist[1]) { CatItem* tmp = catMatches[i]; catMatches.removeAt(i); catMatches.push_front(tmp); } } } // Load up the results int max = gSettings->value("GenOps/numresults", 10).toInt(); for (int i = 0; i < max && i < catMatches.count(); i++) { out.push_back(*catMatches[i]); } } void Catalog::promoteRecentlyUsedItems(const QString& text, QList & list) { // Check for history matches QString location = "History/" + text; QStringList hist; hist = gSettings->value(location, hist).toStringList(); if (hist.count() == 2) { for (int i = 0; i < list.count(); i++) { if (list[i].lowName == hist[0] && list[i].fullPath == hist[1]) { CatItem tmp = list[i]; list.removeAt(i); list.push_front(tmp); } } } } QList FastCatalog::search(const QString& searchText) { QList result; if (searchText.count() > 0) { // Find the smallest char list QChar leastCommon = -1; foreach(QChar c, searchText) { if (leastCommon == -1 || catIndex[c].count() < leastCommon) leastCommon = c; } if (catIndex[leastCommon].count() > 0) { // Search the list for (int i = 0; i < catIndex[leastCommon].count(); ++i) { if (matches(catIndex[leastCommon][i], searchText)) { result.push_back(catIndex[leastCommon][i]); } } } } return result; } QList SlowCatalog::search(const QString& searchText) { QList result; if (searchText.count() > 0) { QString lowSearch = searchText.toLower(); for (int i = 0; i < catList.count(); ++i) { if (matches(&catList[i], lowSearch)) { result.push_back(&catList[i]); } } } return result; } launchy-2.5/src/CharListWidget.h0000644000175000017500000000231511334674233015673 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef CHARLISTWIDGET_H #define CHARLISTWIDGET_H #include class CharListWidget : public QListWidget { Q_OBJECT public: CharListWidget(QWidget* parent = 0); void keyPressEvent(QKeyEvent* key); void mouseDoubleClickEvent(QMouseEvent* event); void focusInEvent(QFocusEvent* event); void focusOutEvent(QFocusEvent* event); signals: void keyPressed(QKeyEvent*); void focusIn(QFocusEvent* event); void focusOut(QFocusEvent* event); }; #endif launchy-2.5/src/options.ui0000644000175000017500000013467011351771616014713 0ustar monesmones Josh Karlin OptionsDlg Qt::NonModal 0 0 678 494 Launchy options 0 General 0 0 User Interface Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop Always display Launchy window Hide Launchy when it loses focus true Always on top Show tray icon Always center Launchy genHCenter horizontally vertically Qt::Horizontal 0 0 Only allow dragging whilst Shift is pressed &Hotkey: genModifierBox 80 0 80 0 Qt::Horizontal 40 20 Suggestion List Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop Underline matched text QFormLayout::AllNonFixedFieldsGrow ms 99999 50 1000 1 999 4 1 9999 20 0 0 Auto open delay genAutoSuggestDelay Simultaneously visible suggestions genMaxViewable Maximum number of suggestions genNumResults Maximum number of history items genNumHistory 999 20 Name and path Path only Name only Suggestions display genCondensed Qt::Horizontal 40 0 0 0 Visual Effects QFormLayout::AllNonFixedFieldsGrow Opaqueness genOpaqueness 100 Qt::Horizontal Fade in time genFadeIn 1000 10 Qt::Horizontal Fade out time genFadeOut 1000 10 Qt::Horizontal QSlider::NoTicks 0 0 Internet Proxy QFormLayout::AllNonFixedFieldsGrow Hostname genProxyHostname Port genProxyPort 5 0 0 System Options Auto update catalog every true 0 0 80 0 true minutes 1 99999999 10 Show hidden files in browse mode Show network in browse mode Allow wildcards in browse mode Check for new versions of Launchy on startup Portable mode (USB stick) Qt::Horizontal 31 0 Skins 0 0 160 16777215 Select a skin 150 16777215 300 166 Author information 0 0 true Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 150 Skin preview 0 116 Qt::AlignCenter Catalog Directories Qt::Horizontal 40 20 + Qt::Horizontal 40 20 - Qt::Horizontal 40 20 0 0 140 16777215 File Types 0 0 16777215 16777215 16777215 13123213 + 16777215 13123123 - Include executables Include directories Depth: catDepth 100000 100 Rescan Catalog Qt::Horizontal 40 20 Indexing 0 items Qt::Horizontal 40 20 0 100 0 false Qt::Horizontal Plugins 141 16777215 Available plugins false 0 0 Plugin options Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 0 About Launchy 40 40 22 QFrame::Plain :/resources/launchy128.png Qt::AlignCenter 11 Verdana 10 75 true Qt::AlignCenter false 481 0 Verdana <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your </span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> true true 321 0 Verdana <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> Qt::RichText Qt::AlignCenter false true 0 0 211 0 Verdana <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and Developer: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Developer: Simon Capewell</span></p></body></html> Qt::AlignCenter true true Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok DropListWidget QListWidget
DropListWidget.h
tabWidget genAlwaysShow genHideFocus genAlwaysTop genShowTrayIcon genHCenter genVCenter genShiftDrag genModifierBox genKeyBox genDecorateText genCondensed genAutoSuggestDelay genMaxViewable genNumResults genNumHistory genOpaqueness genFadeIn genFadeOut genUpdateCatalog genUpdateMinutes genShowHidden genShowNetwork genUpdateCheck genPortable genProxyHostname genProxyPort skinList catDirectories catDirPlus catDirMinus catTypes catTypesPlus catTypesMinus catCheckBinaries catCheckDirs catDepth catRescan plugList buttonBox buttonBox accepted() OptionsDlg accept() 531 564 157 274 buttonBox rejected() OptionsDlg reject() 531 564 286 274 10 10 true true false
launchy-2.5/src/dsingleapplication.h0000644000175000017500000001337010665407672016701 0ustar monesmones/******************************************************************************* DSingleApplication is basically imitating QtSingleApplication commercial class The implementation is though quite different from what is described in trolltech documetation for QtSingleApplication. DSingleApplication uses tcp sockets to test/open a port in a range and then sed a message to that port and expects a correct answer, if it's correct then the app is running and we can talk to it. Messages sent are in text and start with APP_ID+":", unles message has this three bytes it is descarded. Each text message is prepended with int32 value of it's size. Notes: In order to use this class you might consider changing the range of ports to scan delimited by: [d_unique_port_start,d_unique_port_finish] and timeouts used: d_timeout_try_connect, d_timeout_try_read, d_timeout_try_write. Todo: Implement another, faster and more robust cross-platform method to identify wheter another instance is running, once done then the port scan can be performed. Author: Dima Fedorov Levit Copyright (C) BioImage Informatics Licence: GPL History: 02/08/2007 17:14 - First creation ver: 1 *******************************************************************************/ /* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef D_SINGLE_APPLICATION_H #define D_SINGLE_APPLICATION_H const int d_unique_port_start = 23232; const int d_unique_port_finish = 23242; // timeouts are in ms const int d_timeout_try_connect = 10; const int d_timeout_try_read = 1000; const int d_timeout_try_write = 30000; #include #include #include #include class DTalker; //****************************************************************************** // DSingleApplication //****************************************************************************** class DSingleApplication : public QObject { Q_OBJECT public: DSingleApplication( const QString & id, bool initialize = true ); ~DSingleApplication(); QString id() const; void initialize ( ); bool isRunning () const; public slots: bool sendMessage ( const QString & message ); signals: void messageReceived ( const QString & message ); protected slots: void onClientMessage( const QString & message ); private: // server is used if no other instance was found to start the port and wait for others DTalker *tcpServer; // socket is used if other instance was found to communicate with it QTcpSocket *tcpSocket; int port; QString app_id; bool other_instance_running; void init(); }; //****************************************************************************** // DPortChecker // This class is used to check specific port if it has an instance of this app //****************************************************************************** class DPortChecker : public QThread { Q_OBJECT public: enum PortStatus { free=0, us=1, others=2 }; DPortChecker( const QString &id, int port, QObject *parent = 0 ); ~DPortChecker(); PortStatus status() const; void check( int port ); QTcpSocket* transferSocketOwnership(); protected: void run(); private: PortStatus result; QTcpSocket *tcpSocket; int port; QString app_id; }; //****************************************************************************** // DTalker // This is a server responsible to talking to incoming connections //****************************************************************************** class DTalker : public QTcpServer { Q_OBJECT public: DTalker( const QString &id, QObject *parent = 0 ); signals: void messageReceived ( const QString & message ); protected slots: void onClientMessage( const QString & message ); protected: void incomingConnection(int socketDescriptor); private: QString app_id; }; //****************************************************************************** // DListner // This thread is used to communicate with connected client //****************************************************************************** class DListner : public QThread { Q_OBJECT public: DListner( const QString &id, int socketDescriptor, QObject *parent ); ~DListner(); signals: void messageReceived ( const QString & message ); protected: void run(); private: int socketDescriptor; QString app_id; quint32 blockSize; void read( QTcpSocket *tcpSocket ); }; //****************************************************************************** // DPortList //****************************************************************************** class DPortInfo { public: DPortInfo( int p, bool f ): port(p), free(f) { } int port; bool free; }; class DPortList : public QList { public: int firstFreePort(); bool freePortAvailable(); }; #endif //D_SINGLE_APPLICATION_H launchy-2.5/src/SettingsManager.h0000644000175000017500000000244211347046510016105 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2010 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef SETTINGSMANAGER_H #define SETTINGSMANAGER_H #include #include class SettingsManager : public QObject { public: SettingsManager(); void load(); bool isPortable() const; QList directory(QString name) const; QString catalogFilename() const; QString historyFilename() const; QString skinPath(const QString& skinName) const; void setPortable(bool makePortable); void removeAll(); private: QString configDirectory(bool portable) const; bool portable; QHash > dirs; }; #endif launchy-2.5/src/AnimationLabel.cpp0000644000175000017500000000337011333403643016224 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2010 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "AnimationLabel.h" AnimationLabel::AnimationLabel(QWidget* parent) : QLabel(parent) { animation = new QMovie(this); animation->setCacheMode(QMovie::CacheAll); } AnimationLabel::~AnimationLabel() { animation->deleteLater(); } void AnimationLabel::LoadAnimation(const QString& animationPath) { // Ensure the animation continues to run after loading a new graphic bool running = animation->state() == QMovie::Running; Stop(); animation->setFileName(animationPath); if (animation->isValid()) { setMovie(animation); if (running) Start(); } } void AnimationLabel::Start() { // If the animation isn't already running, start it if (!animation.isNull() && (animation->state() == QMovie::NotRunning || animation->state() == QMovie::Paused)) { animation->start(); setHidden(false); } } void AnimationLabel::Stop() { // If the animation is running, stop it if (!animation.isNull() && animation->state() == QMovie::Running) { setHidden(true); animation->stop(); } } launchy-2.5/src/globals.cpp0000644000175000017500000000172111347046510014767 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "globals.h" #include "platform_base.h" PlatformBase* platform; LaunchyWidget* gMainWidget; QSettings* gSettings; QString gSearchText; shared_ptr gBuilder; launchy-2.5/src/CommandHistory.h0000644000175000017500000000230511260000425015735 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef COMMANDHISTORY_H #define COMMANDHISTORY_H #include "catalog.h" #include "InputDataList.h" class CommandHistory { public: CommandHistory(); bool load(const QString& filename); void save(const QString& filename) const; void addItem(const InputDataList& item); void removeAt(int index); InputDataList& getItem(int index); void search(const QString& searchText, QList& searchResults) const; private: QList history; }; #endif launchy-2.5/src/platform_util.cpp0000644000175000017500000000210311254554632016226 0ustar monesmones/* #include #include #include "plugin_interface.h" #include "platform_util.h" #include "globals.h" #include "main.h" PlatformBase * loadPlatform() { QList files; QString file; #ifdef Q_WS_WIN // Look for the platform file in the same directory as the executable wchar_t module_name[MAX_PATH+1]; GetModuleFileNameW(0, module_name, MAX_PATH); module_name[MAX_PATH] = 0; QFileInfo fileInfo = QString::fromUtf16((ushort*)module_name); QString filePath = fileInfo.path(); SetCurrentDirectory(filePath.utf16()); files += "platform_win.dll"; #endif #ifdef Q_WS_X11 files += "libplatform_unix.so"; files += QString(PLATFORMS_PATH) + "/libplatform_unix.so"; #endif QObject * plugin = NULL; foreach(QString file, files) { qDebug() << file; QPluginLoader loader(file); plugin = loader.instance(); if (plugin) break; qDebug() << loader.errorString(); } if (!plugin) { qDebug() << "Could not load platform file!"; exit(1); } return qobject_cast(plugin); } */launchy-2.5/src/InputDataList.cpp0000644000175000017500000000334211260516646016100 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "InputDataList.h" #include "globals.h" void InputDataList::parse(const QString& text) { if (text.length() == 0) { clear(); } else { QStringList split = text.split(QString(" ") + QChar(0x25ba) + " "); // Truncate inputData to the same length as the new input text if (split.count() < count()) { erase(begin() + split.count(), end()); } // Truncate to the first different entry for (int i = 0; i < count(); i++) { (*this)[i].removeLabel(LABEL_HISTORY); if (at(i).getText() != split[i]) { erase(begin() + i, end()); break; } } // And add anything new for (int i = count(); i < split.count(); i++) { InputData data(split[i]); push_back(data); } } } QString InputDataList::toString(bool omitLast) const { QString result = ""; for (int i = 0; i < count(); ++i) { if (i > 0) result += QString(" ") + QChar(0x25ba) + " "; if (!omitLast || i < count()-1) result += at(i).getText(); } return result; } launchy-2.5/src/CharListWidget.cpp0000644000175000017500000000274511260000425016215 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "CharListWidget.h" CharListWidget::CharListWidget(QWidget* parent) : QListWidget(parent) { #ifdef Q_WS_X11 setWindowFlags( windowFlags() | Qt::Tool | Qt::SplashScreen); #endif setAttribute(Qt::WA_AlwaysShowToolTips); setAlternatingRowColors(true); } void CharListWidget::keyPressEvent(QKeyEvent* key) { emit keyPressed(key); QListWidget::keyPressEvent(key); key->ignore(); } void CharListWidget::mouseDoubleClickEvent(QMouseEvent* /*event*/) { QKeyEvent key(QEvent::KeyPress, Qt::Key_Enter, NULL); emit keyPressed(&key); } void CharListWidget::focusInEvent(QFocusEvent* event) { emit focusIn(event); } void CharListWidget::focusOutEvent(QFocusEvent* event) { emit focusOut(event); } launchy-2.5/src/platform_mac_hotkey.cpp0000644000175000017500000003444410660643004017401 0ustar monesmones/* * globalshortcutmanager_mac.cpp - Mac OS X implementation of global shortcuts * Copyright (C) 2003-2007 Eric Smith, Michail Pishchagin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "platform_base_hotkey.h" #include "platform_Base_hottrigger.h" // TODO: // - don't invoke hotkey if there is a modal dialog? // - do multi-mapping, like the x11 version #include #include class MacKeyTrigger { public: virtual ~MacKeyTrigger() {} virtual void activate() = 0; virtual bool isAccepted(int id) const = 0; }; class MacKeyTriggerManager : public QObject { public: static MacKeyTriggerManager* instance() { if(!instance_) instance_ = new MacKeyTriggerManager(); return instance_; } void addTrigger(MacKeyTrigger* trigger) { triggers_ << trigger; } void removeTrigger(MacKeyTrigger* trigger) { triggers_.removeAll(trigger); } private: MacKeyTriggerManager() : QObject(QCoreApplication::instance()) { initAscii2KeyCodeTable(&key_codes_); hot_key_function_ = NewEventHandlerUPP(hotKeyHandler); EventTypeSpec type; type.eventClass = kEventClassKeyboard; type.eventKind = kEventHotKeyPressed; InstallApplicationEventHandler(hot_key_function_, 1, &type, this, NULL); } /** * Callback function invoked when the user hits a hot-key. */ static pascal OSStatus hotKeyHandler(EventHandlerCallRef /*nextHandler*/, EventRef theEvent, void* userData) { EventHotKeyID hkID; GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(EventHotKeyID), NULL, &hkID); static_cast(userData)->activated(hkID.id); return noErr; } void activated(int id) { foreach(MacKeyTrigger* trigger, triggers_) { if (trigger->isAccepted(id)) { trigger->activate(); break; } } } static MacKeyTriggerManager* instance_; QList triggers_; typedef struct { short kchrID; Str255 KCHRname; short transtable[256]; } Ascii2KeyCodeTable; enum { kTableCountOffset = 256 + 2, kFirstTableOffset = 256 + 4, kTableSize = 128 }; static EventHandlerUPP hot_key_function_; static Ascii2KeyCodeTable key_codes_; private: /** * initAscii2KeyCodeTable initializes the ascii to key code * look up table using the currently active KCHR resource. This * routine calls GetResource so it cannot be called at interrupt time. */ static OSStatus initAscii2KeyCodeTable(Ascii2KeyCodeTable* ttable) { unsigned char* theCurrentKCHR, *ithKeyTable; short count, i, j, resID; Handle theKCHRRsrc; ResType rType; // set up our table to all minus ones for (i = 0; i < 256; i++) ttable->transtable[i] = -1; // find the current kchr resource ID ttable->kchrID = (short)GetScriptVariable(smCurrentScript, smScriptKeys); // get the current KCHR resource theKCHRRsrc = GetResource('KCHR', ttable->kchrID); if (theKCHRRsrc == NULL) return resNotFound; GetResInfo(theKCHRRsrc, &resID, &rType, ttable->KCHRname); // dereference the resource theCurrentKCHR = (unsigned char *)(*theKCHRRsrc); // get the count from the resource count = *(short*)(theCurrentKCHR + kTableCountOffset); // build inverse table by merging all key tables for (i = 0; i < count; i++) { ithKeyTable = theCurrentKCHR + kFirstTableOffset + (i * kTableSize); for (j = 0; j < kTableSize; j++) { if (ttable->transtable[ ithKeyTable[j] ] == -1) ttable->transtable[ ithKeyTable[j] ] = j; } } return noErr; } /** * validateAscii2KeyCodeTable verifies that the ascii to key code * lookup table is synchronized with the current KCHR resource. If * it is not synchronized, then the table is re-built. This routine calls * GetResource so it cannot be called at interrupt time. * * Should probably call this at some point, in case the user has switched keyboard * layouts while we were running. */ static OSStatus validateAscii2KeyCodeTable(Ascii2KeyCodeTable* ttable, Boolean* wasChanged) { short theID; theID = (short) GetScriptVariable(smCurrentScript, smScriptKeys); if (theID != ttable->kchrID) { *wasChanged = true; return initAscii2KeyCodeTable(ttable); } else { *wasChanged = false; return noErr; } } /** * asciiToKeyCode looks up the ascii character in the key * code look up table and returns the virtual key code for that * letter. If there is no virtual key code for that letter, then * the value -1 will be returned. */ static short asciiToKeyCode(Ascii2KeyCodeTable* ttable, short asciiCode) { if (asciiCode >= 0 && asciiCode <= 255) return ttable->transtable[asciiCode]; else return false; } /** * Not used. */ static char keyCodeToAscii(short virtualKeyCode) { unsigned long state; long keyTrans; char charCode; Ptr kchr; state = 0; kchr = (Ptr)GetScriptVariable(smCurrentScript, smKCHRCache); keyTrans = KeyTranslate(kchr, virtualKeyCode, &state); charCode = keyTrans; if (!charCode) charCode = (keyTrans >> 16); return charCode; } private: struct Qt_Mac_Keymap { int qt_key; int mac_key; }; static Qt_Mac_Keymap qt_keymap[]; public: static bool convertKeySequence(const QKeySequence& ks, quint32* _key, quint32* _mod) { int code = ks[0]; quint32 mod = 0; if (code & Qt::META) mod |= cmdKey; if (code & Qt::SHIFT) mod |= shiftKey; if (code & Qt::CTRL) mod |= controlKey; if (code & Qt::ALT) mod |= optionKey; code &= 0xffff; quint32 key = 0; for (int n = 0; qt_keymap[n].qt_key != Qt::Key_unknown; ++n) { if (qt_keymap[n].qt_key == code) { key = qt_keymap[n].mac_key; break; } } if (key == 0) { key = asciiToKeyCode(&key_codes_, code & 0xffff); } if (_mod) *_mod = mod; if (_key) *_key = key; return true; } }; MacKeyTriggerManager* MacKeyTriggerManager::instance_ = NULL; EventHandlerUPP MacKeyTriggerManager::hot_key_function_ = NULL; MacKeyTriggerManager::Ascii2KeyCodeTable MacKeyTriggerManager::key_codes_; class GlobalShortcutManager::KeyTrigger::Impl : public MacKeyTrigger { private: KeyTrigger* trigger_; EventHotKeyRef hotKey_; int id_; static int nextId; public: /** * Constructor registers the hotkey. */ Impl(GlobalShortcutManager::KeyTrigger* t, const QKeySequence& ks) : trigger_(t) , id_(0) { MacKeyTriggerManager::instance()->addTrigger(this); quint32 key, mod; if (MacKeyTriggerManager::convertKeySequence(ks, &key, &mod)) { EventHotKeyID hotKeyID; hotKeyID.signature = 'QtHK'; hotKeyID.id = nextId; OSStatus ret = RegisterEventHotKey(key, mod, hotKeyID, GetApplicationEventTarget(), 0, &hotKey_); if (ret != 0) { qWarning("RegisterEventHotKey(%d, %d): %d", key, mod, (int)ret); return; } id_ = nextId++; } } /** * Destructor unregisters the hotkey. */ ~Impl() { MacKeyTriggerManager::instance()->removeTrigger(this); if (id_) UnregisterEventHotKey(hotKey_); } void activate() { emit trigger_->activated(); } bool isAccepted(int id) const { return id_ == id; } }; /* * The following table is from Apple sample-code. * Apple's headers don't appear to define any constants for the virtual key * codes of special keys, but these constants are somewhat documented in the chart at * * * The constants on the chartappear to be the same values as are used in Apple's iGetKeys * sample. * . * * See also . */ MacKeyTriggerManager::Qt_Mac_Keymap MacKeyTriggerManager::qt_keymap[] = { { Qt::Key_Escape, 0x35 }, { Qt::Key_Tab, 0x30 }, { Qt::Key_Backtab, 0 }, { Qt::Key_Backspace, 0x33 }, { Qt::Key_Return, 0x24 }, { Qt::Key_Enter, 0x4c }, // Return & Enter are different on the Mac { Qt::Key_Insert, 0 }, { Qt::Key_Delete, 0x75 }, { Qt::Key_Pause, 0 }, { Qt::Key_Print, 0 }, { Qt::Key_SysReq, 0 }, { Qt::Key_Clear, 0x47 }, { Qt::Key_Home, 0x73 }, { Qt::Key_End, 0x77 }, { Qt::Key_Left, 0x7b }, { Qt::Key_Up, 0x7e }, { Qt::Key_Right, 0x7c }, { Qt::Key_Down, 0x7d }, { Qt::Key_PageUp, 0x74 }, // Page Up { Qt::Key_PageDown, 0x79 }, // Page Down { Qt::Key_Shift, 0x38 }, { Qt::Key_Control, 0x3b }, { Qt::Key_Meta, 0x37 }, // Command { Qt::Key_Alt, 0x3a }, // Option { Qt::Key_CapsLock, 57 }, { Qt::Key_NumLock, 0 }, { Qt::Key_ScrollLock, 0 }, { Qt::Key_F1, 0x7a }, { Qt::Key_F2, 0x78 }, { Qt::Key_F3, 0x63 }, { Qt::Key_F4, 0x76 }, { Qt::Key_F5, 0x60 }, { Qt::Key_F6, 0x61 }, { Qt::Key_F7, 0x62 }, { Qt::Key_F8, 0x64 }, { Qt::Key_F9, 0x65 }, { Qt::Key_F10, 0x6d }, { Qt::Key_F11, 0x67 }, { Qt::Key_F12, 0x6f }, { Qt::Key_F13, 0x69 }, { Qt::Key_F14, 0x6b }, { Qt::Key_F15, 0x71 }, { Qt::Key_F16, 0 }, { Qt::Key_F17, 0 }, { Qt::Key_F18, 0 }, { Qt::Key_F19, 0 }, { Qt::Key_F20, 0 }, { Qt::Key_F21, 0 }, { Qt::Key_F22, 0 }, { Qt::Key_F23, 0 }, { Qt::Key_F24, 0 }, { Qt::Key_F25, 0 }, { Qt::Key_F26, 0 }, { Qt::Key_F27, 0 }, { Qt::Key_F28, 0 }, { Qt::Key_F29, 0 }, { Qt::Key_F30, 0 }, { Qt::Key_F31, 0 }, { Qt::Key_F32, 0 }, { Qt::Key_F33, 0 }, { Qt::Key_F34, 0 }, { Qt::Key_F35, 0 }, { Qt::Key_Super_L, 0 }, { Qt::Key_Super_R, 0 }, { Qt::Key_Menu, 0 }, { Qt::Key_Hyper_L, 0 }, { Qt::Key_Hyper_R, 0 }, { Qt::Key_Help, 0x72 }, { Qt::Key_Direction_L, 0 }, { Qt::Key_Direction_R, 0 }, { Qt::Key_unknown, 0 } }; int GlobalShortcutManager::KeyTrigger::Impl::nextId = 1; GlobalShortcutManager::KeyTrigger::KeyTrigger(const QKeySequence& key) { d = new Impl(this, key); } GlobalShortcutManager::KeyTrigger::~KeyTrigger() { delete d; d = 0; } launchy-2.5/src/plugin_interface.h0000644000175000017500000003664311350266110016334 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PLUGIN_INTERFACE_H #define PLUGIN_INTERFACE_H #include #include #include "catalog.h" #define DESKTOP_WINDOWS 0 #define DESKTOP_GNOME 1 #define DESKTOP_KDE 2 #define DESKTOP_MAC 3 /** \brief This message asks the Plugin for its ID Number. Launchy needs an unsigned int identification value for each loaded plugin. You supply your own here. Typically, this is the result of hashing a string, as shown in the example below. \param wParam (uint*) That stores the resulting ID number. \warning Because we're hashing strings to integers.. it is theoretically possible that two plugin names will collide to the same plugin id. \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_ID: *wParam = qHash(QString("Weby_Plugin")) handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_ID 0 /** \brief This message asks the plugin if it would like to apply a label to the current search query. It is sometimes useful to label user queries with plugin-defined tags. For instance, the weby plugin will tag input that contains "www" or ".com" or ".net" with the hash value of the string "HASH_WEBSITE". Then, other plugins that see the query can know that the current search is for a website.\n\n The InputData class stores the current user's query. It is in a List structure because each time "tab" is pressed by the user a new InputData is formed and appended to the list. In other words, if the user typed "google this is my query" then wParam would represent a list of 2 InputData classes, with the first representing "google", and the second, "this is my query". Each InputData can be tagged individually. \warning This is called each time the user changes a character in his or her query, so make sure it's fast. \param wParam QList* id \param lParam NULL \verbatim void WebyPlugin::getLabels(QList* id) { if (id->count() > 1) return; // Apply a "website" label if we think it's a website QString & text = id->last().getText(); if (text.contains("http://", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains("https://", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".com", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".net", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".org", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains("www.", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_LABELS 1 /** \brief Asks the plugin for any results to a query If your plugin returns catalog results on the fly to a query (e.g. a website query for weby or a calculator result), then this is the place to do so. The existing results are stored in the list of CatItem's (short for Catalog Items) passed in as lParam and you can append your own results to it. \param wParam (QList*): The user's query \param lParam (QList*): The list of existing results for the query, you can append your own \verbatim void WebyPlugin::getResults(QList* id, QList* results) { // Is this query a website? If so create a new result for the website if (id->last().hasLabel(HASH_WEBSITE)) { QString & text = id->last().getText(); // This is a website, create an entry for it results->push_front(CatItem(text + ".weby", text, HASH_WEBY, getIcon())); } // Is this query of form: website search_term? if (id->count() > 1 && id->first().getTopResult().id == HASH_WEBY) { QString & text = id->last().getText(); // This is user search text, create an entry for it results->push_front(CatItem(text + ".weby", text, HASH_WEBY, getIcon())); } } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_RESULTS 2 /** \brief Asks the plugin for a static catalog to be added to the primary catalog Some plugins will add permanent entries to Launchy's primary catalog (until the catalog is rebuilt). For instance, weby adds firefox bookmarks into the primary catalog. This is the function in which that is done. \param wParam (QList*): The catalog that you append your new entries to (these will be copied over to the primary catalog) \verbatim void WebyPlugin::getCatalog(QList* items) { // Add the default websites to the catalog "google/amazon/etc.." foreach(WebySite site, sites) { items->push_back(CatItem(site.name + ".weby", site.name, HASH_WEBY, getIcon())); } // If we're supposed to index firefox, then do that there if ((*settings)->value("weby/firefox", true).toBool()) { QString path = getFirefoxPath(); indexFirefox(path, items); } } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_CATALOG 3 /** \brief This message instructs the plugin that one of its own catalog items was selected by the user and should now be executed If the plugin adds items to the catalog via MSG_GET_RESULTS or MSG_GET_CATALOG and one of those items is selected by the user then it is up to the plugin to execute it when the user presses "enter". This is where you perform the action. \param wParam (QList*): The user's query \param lParam (CatItem*): The user selected catalog item \verbatim void WebyPlugin::launchItem(QList* id, CatItem* item) { QString file = ""; QString args = ""; if (id->count() == 2) { args = id->last().getText(); args = QUrl::toPercentEncoding(args); item = &id->first().getTopResult(); } // Is it a Firefox shortcut? if (item->fullPath.contains(".shortcut")) { file = item->fullPath.mid(0, item->fullPath.count()-9); file.replace("%s", args); } else { // It's a user-specific site bool found = false; foreach(WebySite site, sites) { if (item->shortName == site.name) { found = true; file = site.base; if (args != "") { QString tmp = site.query; tmp.replace("%s", args); file += tmp; } break; } } if (!found) { file = item->shortName; if (!file.contains("http://")) { file = "http://" + file; } } } QUrl url(file); runProgram(url.toEncoded(), ""); } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_LAUNCH_ITEM 4 /** \brief This message informs the plugin that it's being loaded. This is a good time to do any initialization work. \param wParam NULL \param lParam NULL \verbatim void calcyPlugin::init() { // Do some initialization here if necessary.. } int CalcyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; } return handled; } \endverbatim */ #define MSG_INIT 5 /** \brief This message asks the plugin if it has a dialog to display in the options menu. The result of the request is returned via the result of the msg function (handled). \param wParam NULL \param lParam NULL \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_HAS_DIALOG: handled = true; break; } return handled; } \endverbatim */ #define MSG_HAS_DIALOG 6 /** \brief This message tells the plugin that it's time to show its user interface \param wParam (QWidget*): The parent of the dialog to create \param lParam (QWidget**): Your plugin's new dialog is returned here for Launchy to keep tabs on it \verbatim void WebyPlugin::doDialog(QWidget* parent, QWidget** newDlg) { // gui is a private member variable of class WebyPlugin if (gui != NULL) return; // class Gui is weby's user interface class gui = new Gui(parent); *newDlg = gui; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; } return handled; } \endverbatim */ #define MSG_DO_DIALOG 7 /** \brief This message asks the plugin for its string name \param wParam (QString*) The destination for the name of your plugin \param lParam NULL \verbatim void WebyPlugin::getName(QString* str) { *str = "Weby"; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_NAME 8 /** \brief This message informs the plugin that it should close its dialog \param wParam (bool): Whether the plugin should accept changes made by the user while the dialog was open \param lParam NULL \verbatim void WebyPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } if (gui != NULL) delete gui; gui = NULL; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_END_DIALOG: endDialog((bool) wParam); break; } return handled; } \endverbatim */ #define MSG_END_DIALOG 9 /** \brief This message informs the plugin that Launchy is now visible on the screen. \param wParam NULL \param lParam NULL */ #define MSG_LAUNCHY_SHOW 10 /** \brief This message informs the plugin that Launchy is no longer visible on the screen. \param wParam NULL \param lParam NULL */ #define MSG_LAUNCHY_HIDE 11 /** \brief This message informs Launchy of what directory the plugin was loaded from. This can be helpful in determining where the icon should be loaded from. \param wParam QString path */ #define MSG_PATH 12 /** \brief This message asks the plugin to load any of its own plugins and to return them. This is for language binding plugins such as for python plugins. \param wParam QList*: The plugins controlled by the plugin \param lParam NULL */ #define MSG_LOAD_PLUGINS 100 /** \brief This message asks the plugin to unload a plugin. \param wParam uint: The plugin ID \param lParam NULL */ #define MSG_UNLOAD_PLUGIN 101 #define MSG_CONTROL_OPTIONS 500 #define MSG_CONTROL_EXIT 501 #define MSG_CONTROL_REBUILD 502 #define MSG_CONTROL_RELOADSKIN 503 #define MSG_CONTROL_LAUNCHITEM 504 /** \brief This is the class that a plugin must implement. The PluginInterface is the interface between Launchy and your plugin. Launchy communicates with your plugin through the msg function. To store any settings in Launchy's permanent configuration file, please refer to the settings member variable. */ class PluginInterface { public: virtual ~PluginInterface() {}; /** \brief This is how messages are passed to the plugin Here you handle the subset of messages that your plugin requires. At minimum, your plugin must handle MSG_GET_ID and MSG_GET_NAME. For unhandled messages, return 0. For handled messages, return 1. \param msgId The type of the message, such as show dialog, initialize, or get results \param wParam If this message type requires any parameters, this will be the first and casted to void* \param lParam If this message requires two parameters, this is the second, casted to void* \return 1 means the message was handled, 0 means it was ignored \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog((bool) wParam); break; default: break; } return handled; } \endverbatim */ virtual int msg(int msgId, void* wParam = NULL, void* lParam = NULL) = 0; /** The setting manager in which you store your persistent data. More data can be found in QT's documentation for QSettings Following is an example of using the settings variable: \verbatim QSettings* set = *settings; // Write a value to the config file set->setValue("weby/version", 1.0); // Read a value from the config value double value = set->value("weby/version", 0.0); \endverbatim */ QSettings** settings; }; /** \brief A convienience run function This function will run the program along with arguments and is platform independent. \param file The location of the file to run \param args The arguments to the command */ void runProgram(QString file, QString args); int getDesktop(); Q_DECLARE_INTERFACE(PluginInterface, "net.launchy.PluginInterface/1.0") #endif launchy-2.5/src/Directory.h0000644000175000017500000000236711336314137014765 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef DIRECTORY_H #define DIRECTORY_H #include #include struct Directory { Directory() : indexDirs(false), indexExe(false), depth(100) { } Directory(const QString& n) : indexDirs(false), indexExe(false), name(n), depth(100) { } Directory(const QString& n, const QStringList& t, bool d, bool e, int dep) : indexDirs(d), indexExe(e), name(n), types(t), depth(dep) { } bool indexDirs; bool indexExe; QString name; QStringList types; int depth; }; #endif launchy-2.5/src/main.h0000644000175000017500000001077711346470362013755 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef MAIN_H #define MAIN_H #include "plugin_handler.h" #include "platform_util.h" #include "catalog.h" #include "catalog_builder.h" #include "icon_delegate.h" #include "icon_extractor.h" #include "globals.h" #include "InputDataList.h" #include "CommandHistory.h" #include "CharLineEdit.h" #include "LineEditMenu.h" #include "CharListWidget.h" #include "AnimationLabel.h" #include "Fader.h" using namespace boost; enum CommandFlag { None = 0, ShowLaunchy = 1, ShowOptions = 2, ResetPosition = 4, ResetSkin = 8, Rescan = 16, Exit = 32 }; Q_DECLARE_FLAGS(CommandFlags, CommandFlag) Q_DECLARE_OPERATORS_FOR_FLAGS(CommandFlags) class LaunchyWidget : public QWidget { Q_OBJECT // Enable signals and slots public: LaunchyWidget(CommandFlags command); ~LaunchyWidget(); void executeStartupCommand(int command); shared_ptr catalog; PluginHandler plugins; void showLaunchy(bool noFade); void showTrayIcon(); void setSuggestionListMode(int mode); bool setHotkey(QKeySequence); bool setAlwaysShow(bool); bool setAlwaysTop(bool); void setSkin(const QString& name); void loadOptions(); int getHotkey() const; protected: void paintEvent(QPaintEvent* event); public slots: void focusInEvent(QFocusEvent* event); void focusOutEvent(QFocusEvent* event); void mousePressEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event); void contextMenuEvent(QContextMenuEvent* event); void showOptionsDialog(); void onHotkey(); void updateTimeout(); void dropTimeout(); void setOpaqueness(int level); void httpGetFinished(bool result); void catalogProgressUpdated(float); void catalogBuilt(); void inputMethodEvent(QInputMethodEvent* event); void keyPressEvent(QKeyEvent* event); void inputKeyPressEvent(QKeyEvent* event); void alternativesRowChanged(int index); void alternativesKeyPressEvent(QKeyEvent* event); void setFadeLevel(double level); void showLaunchy(); void buildCatalog(); void iconExtracted(int itemIndex, QIcon icon); void trayIconActivated(QSystemTrayIcon::ActivationReason reason); void reloadSkin(); private: void createActions(); void applySkin(const QString& name); void closeEvent(QCloseEvent* event); void hideLaunchy(bool noFade = false); void updateVersion(int oldVersion); void checkForUpdate(); void shouldDonate(); void showAlternatives(bool show = true, bool resetSelection = true); void parseInput(const QString& text); void updateOutputWidgets(bool resetAlternativesSelection = true); void searchOnInput(); void loadPosition(QPoint pt); void savePosition() { gSettings->setValue("Display/pos", pos()); } void doTab(); void doBackTab(); void doEnter(); void processKey(); void launchItem(CatItem& item); void addToHistory(QList& item); void startDropTimer(); QString currentSkin; Fader* fader; QPixmap* frameGraphic; QSystemTrayIcon* trayIcon; CharLineEdit* input; QLabel* output; QLabel* outputIcon; CharListWidget* alternatives; QRect alternativesRect; QPushButton* optionsButton; QPushButton* closeButton; QScrollBar* altScroll; QLabel* alternativesPath; AnimationLabel* workingAnimation; QAction* actShow; QAction* actRebuild; QAction* actReloadSkin; QAction* actOptions; QAction* actExit; QTimer* updateTimer; QTimer* dropTimer; shared_ptr catalogBuilder; IconExtractor iconExtractor; QIcon* condensedTempIcon; QList searchResults; InputDataList inputData; CommandHistory history; bool alwaysShowLaunchy; bool dragging; QPoint dragStartPoint; bool menuOpen; bool optionsOpen; IconDelegate* listDelegate; QAbstractItemDelegate* defaultListDelegate; QHttp *http; QBuffer *verBuffer; QBuffer *counterBuffer; }; LaunchyWidget* createLaunchyWidget(CommandFlags command); #endif launchy-2.5/src/platform_base_hotkey.cpp0000644000175000017500000000603011254554632017551 0ustar monesmones/* * globalshortcutmanager.cpp - Class managing global shortcuts * Copyright (C) 2006 Maciej Niedzielski * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "precompiled.h" #include "platform_base_hotkey.h" #include "platform_base_hottrigger.h" /** * \brief Constructs new GlobalShortcutManager. */ GlobalShortcutManager::GlobalShortcutManager() : QObject(QCoreApplication::instance()) { } GlobalShortcutManager::~GlobalShortcutManager() { clear(); } GlobalShortcutManager* GlobalShortcutManager::instance_; /** * \brief Returns the instance of GlobalShortcutManager. */ GlobalShortcutManager* GlobalShortcutManager::instance() { if (!instance_) instance_ = new GlobalShortcutManager(); return instance_; } /** * \brief Connects a key sequence with a slot. * \param key, global shortcut to be connected * \param receiver, object which should receive the notification * \param slot, the SLOT() of the \a receiver which should be triggerd if the \a key is activated */ void GlobalShortcutManager::connect(const QKeySequence& key, QObject* receiver, const char* slot) { KeyTrigger* t = instance()->triggers_[key]; if (!t) { t = new KeyTrigger(key); instance()->triggers_.insert(key, t); } QObject::connect(t, SIGNAL(activated()), receiver, slot); } bool GlobalShortcutManager::isConnected(const QKeySequence& key) { KeyTrigger* t = instance()->triggers_[key]; if (!t) return false; return t->isConnected(); } /** * \brief Disonnects a key sequence from a slot. * \param key, global shortcut to be disconnected * \param receiver, object which \a slot is about to be disconnected * \param slot, the SLOT() of the \a receiver which should no longer be triggerd if the \a key is activated */ void GlobalShortcutManager::disconnect(const QKeySequence& key, QObject* receiver, const char* slot) { KeyTrigger* t = instance()->triggers_[key]; if (!t) { return; } QObject::disconnect(t, SIGNAL(activated()), receiver, slot); delete instance()->triggers_.take(key); // if (!t->isUsed()) { // delete instance()->triggers_.take(key); //} } void GlobalShortcutManager::clear() { foreach (KeyTrigger* t, instance()->triggers_) delete t; instance()->triggers_.clear(); } launchy-2.5/src/precompiled.h0000644000175000017500000000254011347046510015314 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PRECOMPILED_H #define PRECOMPILED_H #ifdef _MSC_VER #pragma warning(push,3) #endif #include #include #include #ifdef _MSC_VER #pragma warning(pop) #endif #include #include using namespace boost; #ifdef Q_WS_WIN #define _CRT_SECURE_NO_WARNINGS #define _WIN32_WINNT 0x0600 #define _WIN32_IE 0x0700 #include #include #include #include #include #include #include #include #include #include #endif #endif // PRECOMPILED_H launchy-2.5/src/FileSearch.h0000644000175000017500000000173611260516727015032 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef FILESEARCH_H #define FILESEARCH_H #include "catalog.h" #include "InputDataList.h" class FileSearch { public: static void search(const QString& searchText, QList& searchResults, InputDataList& inputData); }; #endif launchy-2.5/src/icon_delegate.h0000644000175000017500000000371111334674233015601 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #ifndef ICON_DELEGATE #define ICON_DELEGATE #define ROLE_SHORT Qt::DisplayRole #define ROLE_FULL Qt::ToolTipRole #define ROLE_ICON Qt::DecorationRole class IconDelegate : public QStyledItemDelegate { Q_OBJECT public: IconDelegate(QObject *parent = 0); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index ) const; void setColor(QString line, bool hi = false) { if (!line.contains(",")) color = QColor(line); QStringList spl = line.split(","); if (spl.count() != 3) return; if (!hi) color = QColor(spl.at(0).toInt(), spl.at(1).toInt(), spl.at(2).toInt()); else hicolor = QColor(spl.at(0).toInt(), spl.at(1).toInt(), spl.at(2).toInt()); } void setFamily(QString fam) { family = fam; } void setSize(int s) { size = s; } void setWeight(int w) { weight = w; } void setItalics(int i) { italics = i; } void setAlternativesPathWidget(QLabel* label) { alternativesPath = label; } private: QColor color; QColor hicolor; QString family; int size; int weight; int italics; QLabel* alternativesPath; }; #endif launchy-2.5/src/plugin_handler.cpp0000644000175000017500000001107111346030002016322 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "plugin_handler.h" #include "main.h" PluginHandler::PluginHandler() { } PluginHandler::~PluginHandler() { } void PluginHandler::showLaunchy() { foreach(PluginInfo info, plugins) { if (info.loaded) info.obj->msg(MSG_LAUNCHY_SHOW); } } void PluginHandler::hideLaunchy() { foreach(PluginInfo info, plugins) { if (info.loaded) info.obj->msg(MSG_LAUNCHY_HIDE); } } void PluginHandler::getLabels(QList* inputData) { if (inputData->count() > 0) { foreach(PluginInfo info, plugins) { if (info.loaded) info.obj->msg(MSG_GET_LABELS, (void*) inputData); } } } void PluginHandler::getResults(QList* inputData, QList* results) { if (inputData->count() > 0) { foreach(PluginInfo info, plugins) { if (info.loaded) info.obj->msg(MSG_GET_RESULTS, (void*) inputData, (void*) results); } } } void PluginHandler::getCatalogs(QList* items) { foreach(PluginInfo info, plugins) { if (info.loaded) info.obj->msg(MSG_GET_CATALOG, (void*) items); } } int PluginHandler::execute(QList* inputData, CatItem* result) { if (!plugins.contains(result->id) || !plugins[result->id].loaded) return 0; return plugins[result->id].obj->msg(MSG_LAUNCH_ITEM, (void*) inputData, (void*) result); } QWidget* PluginHandler::doDialog(QWidget* parent, uint id) { if (!plugins.contains(id) || !plugins[id].loaded) return NULL; QWidget* newBox = NULL; plugins[id].obj->msg(MSG_DO_DIALOG, (void*) parent, (void*) &newBox); return newBox; } void PluginHandler::endDialog(uint id, bool accept) { if (!plugins.contains(id) || !plugins[id].loaded) return; plugins[id].obj->msg(MSG_END_DIALOG, (void*) accept); } void PluginHandler::loadPlugins() { // Get the list of loadable plugins QHash loadable; int size = gSettings->beginReadArray("plugins"); for(int i = 0; i < size; ++i) { gSettings->setArrayIndex(i); uint id = gSettings->value("id").toUInt(); bool toLoad = gSettings->value("load").toBool(); loadable[id] = toLoad; } gSettings->endArray(); foreach(QString szDir, settings.directory("plugins")) { // Load up the plugins in the plugins/ directory QDir pluginsDir(szDir); foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { if (!QLibrary::isLibrary(fileName)) continue; QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = loader.instance(); if (!plugin) continue; PluginInterface *plug = qobject_cast(plugin); if (!plug) continue; plug->settings = &gSettings; PluginInfo info; uint id; bool handled = plug->msg(MSG_GET_ID, (void*) &id) != 0; info.id = id; QString name; plug->msg(MSG_GET_NAME, (void*) &name); info.name = name; info.obj = plug; info.path = pluginsDir.absoluteFilePath(fileName); if (handled && (!loadable.contains(id) || loadable[id])) { info.loaded = true; plug->msg(MSG_INIT); plug->msg(MSG_PATH, &szDir); // Load any of the plugin's plugins of its own QList additionalPlugins; plug->msg(MSG_LOAD_PLUGINS, &additionalPlugins); foreach(PluginInfo pluginInfo, additionalPlugins) { const bool isValidPlugin = pluginInfo.obj && !pluginInfo.name.isNull() && pluginInfo.id > 0; if (!isValidPlugin) { continue; } const bool isPluginLoadable = !loadable.contains(pluginInfo.id) || loadable[pluginInfo.id]; if (isPluginLoadable) { pluginInfo.obj->msg(MSG_INIT); pluginInfo.loaded = true; } else { pluginInfo.obj->msg(MSG_UNLOAD_PLUGIN, (void*) pluginInfo.id); pluginInfo.loaded = false; } plugins[pluginInfo.id] = pluginInfo; } } else { info.loaded = false; loader.unload(); } plugins[id] = info; } } } launchy-2.5/src/catalog_builder.h0000644000175000017500000000301211262503703016122 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef CATALOG_BUILDER #define CATALOG_BUILDER #include #include #include "catalog_types.h" #include "plugin_handler.h" using namespace boost; class CatalogBuilder : public QThread { Q_OBJECT public: CatalogBuilder(PluginHandler* plugs); CatalogBuilder(PluginHandler* plugs, shared_ptr catalog); static Catalog* createCatalog(); shared_ptr getCatalog() { return catalog; } void run(); signals: void catalogFinished(); void catalogIncrement(float); private: void buildCatalog(); void indexDirectory(const QString& dir, const QStringList& filters, bool fdirs, bool fbin, int depth); PluginHandler* plugins; shared_ptr currentCatalog; shared_ptr catalog; QHash indexed; }; #endif launchy-2.5/src/Fader.h0000644000175000017500000000236011334674233014037 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef FADER_H #define FADER_H #include "precompiled.h" class Fader : public QThread { Q_OBJECT public: Fader(QObject* parent = NULL); ~Fader(); void fadeIn(bool quick); void fadeOut(bool quick); void run(); inline void stop() { keepRunning = false; } inline bool isFading() const { return delta < 0 && isRunning(); } signals: void fadeLevel(double level); private: QMutex mutex; bool keepRunning; double delta; int delay; double level; double targetLevel; }; #endif launchy-2.5/src/AnimationLabel.h0000644000175000017500000000221511342640454015671 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2010 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef QANIMATIONLABEL_H #define QANIMATIONLABEL_H #include #include #include class AnimationLabel : public QLabel { public: AnimationLabel(QWidget* parent); virtual ~AnimationLabel(); void LoadAnimation(const QString& animationPath); public slots: void Start(); void Stop(); private: QPointer animation; }; #endiflaunchy-2.5/src/LineEditMenu.cpp0000644000175000017500000000034011247612646015672 0ustar monesmones#include "LineEditMenu.h" LineEditMenu::LineEditMenu(QWidget* parent) : QLabel(parent) { setAttribute(Qt::WA_InputMethodEnabled); } void LineEditMenu::contextMenuEvent(QContextMenuEvent *evt) { emit menuEvent(evt); } launchy-2.5/src/launchy.qrc0000644000175000017500000000030211260000425014771 0ustar monesmones resources/launchy128.png resources/launchy16.png resources/basicskin.qss launchy-2.5/src/catalog_types.h0000644000175000017500000000534011346217770015657 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #pragma once #include "catalog.h" #include /** This class does not pertain to plugins */ class Catalog { public: Catalog() {} virtual ~Catalog() {} bool load(const QString& filename); bool save(const QString& filename); virtual void addItem(const CatItem& item) = 0; virtual int count() = 0; virtual const CatItem& getItem(int) = 0; static bool matches(CatItem* item, const QString& match); static QString decorateText(const QString& text, const QString& match, bool outputRichText = false); void searchCatalogs(const QString&, QList&); virtual void incrementUsage(const CatItem& item) = 0; virtual void demoteItem(const CatItem& item) = 0; virtual int getUsage(const QString& path) = 0; void promoteRecentlyUsedItems(const QString& text, QList & list); private: virtual QList search(const QString&) = 0; }; /** This class does not pertain to plugins */ // The fast catalog searches quickly but // addition of items is slow and uses a lot of memory class FastCatalog : public Catalog { public: FastCatalog() : Catalog() {} void addItem(const CatItem& item); QList search(const QString&); int count() { return catList.count(); } const CatItem& getItem(int i) { return catList[i]; } void incrementUsage(const CatItem& item); void demoteItem(const CatItem& item); int getUsage(const QString& path); private: QVector catList; QHash > catIndex; }; /** This class does not pertain to plugins */ // The slow catalog searches slowly but // adding items is fast and uses less memory // than FastCatalog class SlowCatalog : public Catalog { public: SlowCatalog() : Catalog() {} void addItem(const CatItem& item); QList search(const QString&); int count() { return catList.count(); } const CatItem& getItem(int i) { return catList[i]; } void incrementUsage(const CatItem& item); void demoteItem(const CatItem& item); int getUsage(const QString& path); private: QVector catList; }; launchy-2.5/src/CharLineEdit.h0000644000175000017500000000264111334674233015313 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef CHARLINEEDIT_H #define CHARLINEEDIT_H #include class CharLineEdit : public QLineEdit { Q_OBJECT public: CharLineEdit(QWidget* parent = 0); void keyPressEvent(QKeyEvent* event); bool focusNextPrevChild(bool next); void focusInEvent(QFocusEvent* event); void focusOutEvent(QFocusEvent* event); void inputMethodEvent(QInputMethodEvent *event); QString separatorText() const; signals: void keyPressed(QKeyEvent*); void focusIn(QFocusEvent* evt); void focusOut(QFocusEvent* evt); void inputMethod(QInputMethodEvent *e); private: bool isAtStartOfSeparator() const; bool isAtEndOfSeparator() const; QChar separatorChar() const; }; #endif launchy-2.5/src/resources/0000755000175000017500000000000011355776633014670 5ustar monesmoneslaunchy-2.5/src/resources/launchy128.png0000644000175000017500000002562611253554345017276 0ustar monesmonesPNG  IHDR>agAMA7tEXtSoftwareAdobe ImageReadyqe<+(IDATx} \UګzOw!! [UEpQDG|7Ȉ ?#̠o $R\>^0ui&zuoa6~kܘSrqk "Qg q顀xU8hjbati?zg/ m{hGWx4}~șH%>m`)H =CfbwBZֹ(ׇzC`mۣ J?ѢF6ׇ=ݻw¯!̄jJ~P# ^{<1GqçOÝoљw#q!%sZ.) A҅h?)NR6|AzAtSNӟO]aDc5p`m ݥTBX( \.lݺq yqen?pDT !_0u{ !dZJeb7+0Iqtf]hMi)XkYg@H჎)"w#z lLz~+>t˒} Ɔjo[5/ GkNjKchoo|D4~V셐7@pz}K9bj /]ynG3b$H[Sƒ.0 -Ϝ;I#!WDs& 傇Fs^vȐ+*Σu{8v`wpqOY5$"|R;fL*v4$DIef9f"|r%@cwQ6h ~*wF `iܷC&,R MG L:=ECC8.'6Ie DI$ EjTή#Eː,$SzKy^49GY6gBw@^`Z S7?_8pͅKEJtYm~ɗWjB FT-BywC{xIT&mPNnٗpfCS·ojDP  y| q,G`(Y~o#l9MRRJBɵ/u|n y~?&Ms GCu(ENfa<7NcRȚh fLeű GZtױn+u]kf-  %G٧7Qe pY>4 q#\lWѲA`9``@`YoK9 (65y.ɾ`N@:|H09L^|BݻX4ҽ.!ʠUiˏ~BN ԓ,C,('v@`:fa2 fyĴ!AҲ\hxa<ڋS꽂儭7 K%F> #ɢ ">;`TF9uf\*`&"bg2u@_0 Z aAYK4 3?}/+5ovזŤ"Dpø ^A#<QE > bA]έy8}A +gG!@0)ە ;Z,d_q0@?7HY cL0or9%CRHZi 'ۅI-,sy!`i+I 8~fK*0:E!,k ̖*|]𡓴9]BKѵ 0% Kmhf&, JMi`CkE|9 uA`&D&Fj n]5ǞFTy$!A G_|`XGWX2UMxf!TQPXDEؘk9𔽓Hp3o- xӚH%  ` ǝRnxD(DWJ dTXMs6l*NZ*ƞ5Y"@1 HH\ K4VF~юTWp -X܀S#챵{S~Nxn9%,[x=)Y?B`q 3ϡar咬iWqˎA۷iH`s5N*1--薌69{( .vUhˉ#t~^JG,H,prB ੄{x}"W`}g BÆ5GB[ f ju $:Z" A+Gdb(E91N?skסyV#̜{dچ^dٴ1k/ 60{pU"5 ݋D YAP#y%Jʨ9 Z[[h4@ 0__a3Fߜ>t[|$< ^^|{]J XI ,^׃m=on{1ϟ܂@=()AueXD\/xu'π! tD1u,If5Ko=ɣ|>ZUU{\4U֛pn$N_:0n~_ M}i\ټ*&x0 _ћy.aR U%ķ PA E.@c'ޏ^N`Ie^L6,kQ.bPfuvw b,G4֮UrOspbф?{ n^\tÔko{L^ )!x.=?H>6TZu&[>'Ҹ^l%sVJ!"h2U؜HS ̀>X+4V$)y XY1C漘-lf?*ϩ ɒMiw vLꫯ%KFፉo sy'Kp~\1g<"w|.wqKXscqč]idF* *fʙ2 .IIh3xz}\,1 7-xE2Wk54T'2Y水Q~<};˿6sc ߽|K|/%@^F{2WM7pӍ$O,5ٹo cjzU㯉̡&/Hba 5$s'3B\`BFEtk(ME+aHHX-4v0 )3I$f7YR϶dBk~~񟞷4ʘp h\*b1&,YId wKVqnvG tr:kcVU͖m߰"Ui~sPU/&xדg{=QT/ĤKgΜYCX߸!:.Ok&h\u3Hؙ:,k.kMU[s rw]T3 wokת5! ~DčqEQ2D.+8풕C\\P&Qz,EUЃcBX57VABRzPLO% WUR9~ uTL!ʋ4A6](81ma /0~gh`hÕ!ҳ6pp׷ETKjx+/|"j AUސI%eDu "4ȫX1h 4jcgؚB)i!T* m(T1PfB'9&# -/|G.sSOǡ8vpؚ$+G$flz 2 \S؇{/ZUԫ) EHCp4E>洲 cX\"ẅ7^iSfGԂx9Ur$T.DPYDE($#}6Tщ)Q:( 2|z!)jZXz8!Oxj)IW`墦1_cG;..wpǖ p)9YTAn&MQ/VpzÒ /.tMkpO=yQ[&2&.E c\aju)pU9h9ܴ%F{b#WD~C)a;o݉n%xK/AK@.ebO#5#3Jm/fM5V{d_O[9S'tƺjQTmxEI\jJ_z]xOgCBdZ ò_xxS,|dp9NwбGf$e9 d?J`EP6s0Wy>K}ύk'Ňi7 @DŚhE@0D8zqynܾ-*ͩrf0Ow@0`g  /(o?_c˖'gGG {lP 6"ḋ k"u K?䷹t͉ڡd;evZOv7m n_s2oįo!rtD}7"#wgpyBirA 8PL٤mC:=6/~gOy)E"9nuqV^pP *pwn'V%@߻z,)ܘ\t=38.cwW_:xnyw7u7>.k<pIW$35 HƠ$MI@ O BH~: $ExvsWKD9Ǘ1+[w.W:=o䚉FiX`>+><$m]m>mX*2v6t5 &.\ vxZ@Zu+.\'5|m{zpO~=Xa^#|(Ν䛜R=](%}J֐DmZN7@IW8\pBQ< m2O9oWڛGWV&pvU py_wNBZWYğU&/еnO vy n>y|Jy 3g{8#lt3ׇO7{(౎<7M!k]&Ea0Sf/YvM 33m36i9P>XՓ5 -/sW- }gq FVS6~bgK޵c=Yu.tf-*dMluSjHoHs M:>IܟrAV.l jWv ЄX4`a#a3y]٢ 2=R\T"_Qd +CY|2a(d$p'BC?mG-8c'= Vt?yp[:RPhcb8~^5VbVuH*"=ҰBv Ry D,{r)djbnSj?dvd] 5Dga7ݤπcFs?Hl³g<{5WqsqP ڇBΈ`aCqegJf[δs8 /ov$>9Ϋ?H\0uOzzovG?zlJ&7$9: ?fVQ!VA=E,(\EH3]IB.58K}č9x'݄-Mh#MK 0I<1['Q3L(gmA ~i{2MMO&!ዟ#7%n*bn:78d{ ,pO6Z':u C  k&b=cX}T~E]G,iB4;n+$R_̽V y6I7zzݞ`X%dNe׳'?N<l? T9DzhHИ wKiL6/ac_ ܇k ^TlS9r9/Kyn:Ly/c'(`30а)`P _sAG{APWWFbV𝝝#oT*%%t@:W^nc7]3˟n7֠lv<'M=GCNXe*u4CeN' JeFc 8ءa}\6ԍ 0ඃ}?L7腕o>X 8 #S_ J]ۡC7F+(oߡo\MtDUQзar1eB޸=:::8̭Gx{{{Y.Lak`0X!n~ׯpZ{F?ӗ5qwˡCǗ_~ohB~̓;~/^cVJ~8L fq&h|e0LYor}_iJ< (6k]۠Pb6nI#-|n#[ȉIENDB`launchy-2.5/src/resources/launchy16.png0000644000175000017500000000153311253554345017201 0ustar monesmonesPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxtKhQϝgĠVkB"Z,UDAAvƅ7B>nW@i-TŢW6R*1[d=ä'38Ѽ`uJ6_(+P^K%ZP|< 7 M!|AA giۆHh[绦n:(VyDXyEˆ; "aR&q3\l DqCdLD\y`ȄQ=3MnjӐE"qyLGp`UM̄C qвhb^< ӠncFTBZ -uUFxz(t N, ҂78X zAh˸E97䠗~aΕOD .jM.+$J}z09V{g #include #include #include #include /*! \file \brief A Documented file. Details. */ #ifdef Q_WS_WIN // This doesn't exist until qt 4.6 (currently 4.5 in ubuntu 10.04) #include #ifndef VC_EXTRALEAN #define VC_EXTRALEAN #endif #ifndef UNICODE #define UNICODE #endif #define _WIN32_WINNT 0x0600 #define _WIN32_IE 0x0700 #include #include // This is also defined in WinIconProvider, remove from both locations if 64 bit build is produced QString aliasTo64(QString path) { QProcessEnvironment env = QProcessEnvironment::systemEnvironment (); QString pf32 = env.value("PROGRAMFILES"); QString pf64 = env.value("PROGRAMW6432"); // On 64 bit windows, 64 bit shortcuts don't resolve correctly from 32 bit executables, fix it here QFileInfo pInfo(path); if (env.contains("PROGRAMW6432") && pInfo.isSymLink() && pf32 != pf64) { if (QDir::toNativeSeparators(pInfo.symLinkTarget()).contains(pf32)) { QString path64 = QDir::toNativeSeparators(pInfo.symLinkTarget()); path64.replace(pf32, pf64); if (QFileInfo(path64).exists()) { path = path64; } } else if (pInfo.symLinkTarget().contains("system32")) { QString path32 = QDir::toNativeSeparators(pInfo.symLinkTarget()); if (!QFileInfo(path32).exists()) { path = path32.replace("system32", "sysnative"); } } } return path; } int getDesktop() { return DESKTOP_WINDOWS; } /* void runProgram(QString path, QString args) { SHELLEXECUTEINFO ShExecInfo; bool elevated = (GetKeyState(VK_SHIFT) & 0x80000000) != 0 && (GetKeyState(VK_CONTROL) & 0x80000000) != 0; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_FLAG_NO_UI; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = elevated ? L"runas" : NULL; ShExecInfo.lpFile = (LPCTSTR)path.utf16(); if (args != "") { ShExecInfo.lpParameters = (LPCTSTR)args.utf16(); } else { ShExecInfo.lpParameters = NULL; } QDir dir(path); QFileInfo info(path); if (!info.isDir() && info.isFile()) dir.cdUp(); QString filePath = QDir::toNativeSeparators(dir.absolutePath()); ShExecInfo.lpDirectory = (LPCTSTR)filePath.utf16(); ShExecInfo.nShow = SW_NORMAL; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); } */ void runProgram(QString path, QString args) { // This 64 bit aliasing needs to be gotten rid of if we have a 64 bit build path = aliasTo64(QDir::toNativeSeparators(path)); SHELLEXECUTEINFO ShExecInfo; bool elevated = (GetKeyState(VK_SHIFT) & 0x80000000) != 0 && (GetKeyState(VK_CONTROL) & 0x80000000) != 0; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_FLAG_NO_UI; ShExecInfo.fMask = NULL; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = elevated ? L"runas" : NULL; QString filePath = QDir::toNativeSeparators(path); ShExecInfo.lpFile = (LPCTSTR)filePath.utf16(); if (args != "") { ShExecInfo.lpParameters = (LPCTSTR)args.utf16(); } else { ShExecInfo.lpParameters = NULL; } QDir dir(path); QFileInfo info(path); if (!info.isDir() && info.isFile()) dir.cdUp(); QString directory = QDir::toNativeSeparators(dir.absolutePath()); ShExecInfo.lpDirectory = (LPCTSTR)directory.utf16(); ShExecInfo.nShow = SW_NORMAL; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); } #endif #ifdef Q_WS_MAC int getDesktop() { return DESKTOP_MAC; } void runProgram(QString path, QString args) { QString cmd; cmd = "open \"" + QDir::toNativeSeparators(path) + "\" --args " + args.trimmed(); QProcess::startDetached(cmd.trimmed()); return; } #endif #ifdef Q_WS_X11 int getDesktop() { QStringList list = QProcess::systemEnvironment(); foreach(QString s, list) { if (s.startsWith("GNOME_DESKTOP_SESSION")) return DESKTOP_GNOME; else if (s.startsWith("KDE_FULL_SESSION")) return DESKTOP_KDE; } return -1; } void runProgram(QString path, QString args) { QString fullname = path.split(" ")[0]; QFileInfo info(fullname); /* I would argue that launchy does not need to fully support the desktop entry specification yet/ever. NOTE: %c, %k, and %i are handled during loading */ if( path.contains("%") ){ path.replace("%U", args); path.replace("%u", args); path.replace("%F", args); path.replace("%f", args); /* remove specifiers either not yet supported or depricated */ path.remove(QRegExp("%.")); args = ""; } QString cmd; if( !info.isExecutable() || info.isDir() ){ /* if more then one file is passed, then xdg-open will fail.. */ cmd = "xdg-open \"" + path.trimmed() + "\""; }else if(getDesktop() == DESKTOP_KDE) { /* special case for KDE since some apps start behind other windows */ cmd = "kstart --activate " + path.trimmed() + " " + args.trimmed(); } else /* gnome, xfce, etc */ { path.replace("\"", "\\\""); args.replace("\"", "\\\""); cmd = "sh -c \"" + path.trimmed() + " " + args.trimmed() + "\""; } QProcess::startDetached(cmd); return; } /* void runProgram(QString path, QString args) { QProcess proc; QStringList largs; QFileInfo info(path); if (path.contains("%")) { path.replace("%u", args); path.replace("%U", args); path.replace("%f", args); path.replace("%F", args); path.replace("%c", path.split(" ")[0]); path.replace("%k", path.split(" ")[0]); args = ""; } QString toRun = path + " " + args; toRun = toRun.simplified(); QString r; // r = "xdg-open \"" + path + "\" " + args + " 2>/dev/null || sh -c \"" + path + "\" " + args; r = "xdg-open \"" + path.trimmed() + "\" " + args.trimmed() + " 2>/dev/null || sh -c \"" + path.trimmed() + " " + args + "\""; // qDebug() << r.simplified(); QStringList ra; ra += "-c"; ra += r.trimmed().simplified(); // qDebug() << ra; // Firefox needs special treatment in KDE // else it falls behind a window if ((path.contains("http://",Qt::CaseInsensitive) || path.contains("firefox",Qt::CaseInsensitive)) && getDesktop() == DESKTOP_KDE) { proc.execute("sh",ra); } else { proc.startDetached("sh",ra); } //proc.execute("sh", ra); return; } */ /* void runProgram(QString path, QString args) { // My own launcher.. QString mimetype; QString locale = QLocale::system().name(); if (path.startsWith("http", Qt::CaseInsensitive)) mimetype = "text/html"; if (mimetype == "") { QProcess proc; QStringList args; args += "query"; args += "filetype"; args += path; proc.setReadChannel(QProcess::StandardOutput); proc.start(QString("xdg-mime"),args); proc.waitForFinished(10000); mimetype = proc.readAll().trimmed(); proc.close(); } // Get the default app for the mime-type QString defapp; if (mimetype.startsWith("application", Qt::CaseInsensitive)) defapp = path; if (mimetype == "") defapp = path; if (defapp == "") { QProcess proc; QStringList args; args += "query"; args += "default"; args += mimetype; proc.start(QString("xdg-mime"),args); proc.waitForFinished(10000); QString desk = proc.readAll().trimmed(); if (desk == "") defapp = path; else { QString icon; QString name; // Read the .desktop file const char *dirs[] = { "/usr/share/applications/", "/usr/local/share/applications/", "/usr/share/gdm/applications/", "/usr/share/applications/kde/", "~/.local/share/applications/"}; for(int i = 0; i < 5; i++) { QString dir = dirs[i]; QString path = dir + "/" + desk; if (QFile::exists(path)) { QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) break; while(!file.atEnd()) { QString line = file.readLine(); if (line.startsWith("Exec", Qt::CaseInsensitive)) { defapp = line.split("=")[1].trimmed(); } else if (line.startsWith("Icon",Qt::CaseInsensitive)) icon = line.split("=")[1].trimmed(); else if (line.startsWith("Name",Qt::CaseInsensitive)) { if (line.startsWith("Name[" + locale, Qt::CaseInsensitive)) name = line.split("=")[1].trimmed(); else if (!line.contains("[")) name = line.split("=")[1].trimmed(); } } defapp.replace("%k", path); break; } } defapp.replace("%u", "\"" + path + "\""); defapp.replace("%U", "\"" + path + "\""); defapp.replace("%f", "\"" + path + "\""); defapp.replace("%F", "\"" + path + "\""); defapp.replace("%i", "--icon " + icon); defapp.replace("%c", name); } } // qDebug() << mimetype << defapp; QString toRun = defapp + " " + args; QStringList largs = toRun.simplified().split(" ", QString::SkipEmptyParts); qDebug() << largs; QProcess proc; QString exec = largs[0]; largs.removeFirst(); qDebug() << exec << largs.join(" "); proc.startDetached(exec, QStringList(largs.join(" "))); //proc.startDetached(exec, largs); return; } */ #endif launchy-2.5/src/globals.h0000644000175000017500000000246411355674521014451 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GLOBALS_H #define GLOBALS_H #include "catalog_builder.h" #include "SettingsManager.h" #define LAUNCHY_VERSION 250 #define LAUNCHY_VERSION_STRING "2.5.0" #define HASH_LAUNCHY 0 #define HASH_HISTORY 1 #define HASH_LAUNCHYFILE 2 #define LABEL_FILE 0 #define LABEL_AUTOSUGGEST 1 #define LABEL_HISTORY 2 class LaunchyWidget; class PlatformBase; extern PlatformBase* platform; extern LaunchyWidget* gMainWidget; extern QSettings* gSettings; extern SettingsManager settings; extern shared_ptr gBuilder; extern QString gSearchText; #endif launchy-2.5/src/src.pro0000644000175000017500000001260411346754567014174 0ustar monesmonesTEMPLATE = app unix:!macx:TARGET = launchy win32:TARGET = Launchy macx:TARGET = Launchy CONFIG += debug_and_release PRECOMPILED_HEADER = precompiled.h # CONFIG += qt release INCLUDEPATH += ../common QT += network SOURCES = main.cpp \ globals.cpp \ options.cpp \ catalog.cpp \ catalog_builder.cpp \ plugin_handler.cpp \ platform_base_hotkey.cpp \ icon_delegate.cpp \ plugin_interface.cpp \ catalog_types.cpp \ icon_extractor.cpp \ ../common/FileBrowserDelegate.cpp \ ../common/FileBrowser.cpp \ ../common/DropListWidget.cpp \ Fader.cpp \ CharListWidget.cpp \ CharLineEdit.cpp \ CommandHistory.cpp \ InputDataList.cpp \ FileSearch.cpp \ AnimationLabel.cpp \ SettingsManager.cpp HEADERS = platform_base.h \ globals.h \ globals.h \ main.h \ catalog.h \ catalog_builder.h \ plugin_interface.h \ plugin_handler.h \ options.h \ catalog_types.h \ icon_delegate.h \ icon_extractor.h \ ../common/FileBrowserDelegate.h \ ../common/FileBrowser.h \ ../common/DropListWidget.h \ CharListWidget.h \ CharLineEdit.h \ Fader.h \ precompiled.h \ CommandHistory.h \ InputDataList.h \ FileSearch.h \ AnimationLabel.h \ SettingsManager.h FORMS = options.ui unix:!macx { ICON = Launchy.ico SOURCES += ../platforms/unix/platform_unix.cpp \ ../platforms/unix/platform_unix_util.cpp \ ../platforms/unix/platform_x11_hotkey.cpp HEADERS += ../platforms/unix/platform_unix.h \ ../platforms/unix/platform_unix_util.h \ ../platforms/unix/platform_x11_hotkey.h \ platform_base_hotkey.h \ platform_base_hottrigger.h PREFIX = /usr DEFINES += SKINS_PATH=\\\"$$PREFIX/share/launchy/skins/\\\" \ PLUGINS_PATH=\\\"$$PREFIX/lib/launchy/plugins/\\\" \ PLATFORMS_PATH=\\\"$$PREFIX/lib/launchy/\\\" if(!debug_and_release|build_pass) { CONFIG(debug, debug|release):DESTDIR = ../debug/ CONFIG(release, debug|release):DESTDIR = ../release/ } SOURCES += target.path = $$PREFIX/bin/ skins.path = $$PREFIX/share/launchy/skins/ skins.files = ../skins/* icon.path = $$PREFIX/share/pixmaps icon.files = ../misc/Launchy_Icon/launchy_icon.png desktop.path = $$PREFIX/share/applications/ desktop.files = ../linux/launchy.desktop INSTALLS += target \ skins \ icon \ desktop } win32 { ICON = Launchy.ico if(!debug_and_release|build_pass):CONFIG(debug, debug|release):CONFIG += console SOURCES += ../platforms/win/platform_win.cpp \ ../platforms/win/platform_win_hotkey.cpp \ ../platforms/win/platform_win_util.cpp \ ../platforms/win/WinIconProvider.cpp HEADERS += ../platforms/win/WinIconProvider.h \ platform_base_hotkey.h \ platform_base_hottrigger.h \ ../platforms/win/platform_win.h \ ../platforms/win/platform_win_util.h CONFIG += embed_manifest_exe INCLUDEPATH += c:/boost/ RC_FILE = ../win/launchy.rc LIBS += shell32.lib \ user32.lib \ gdi32.lib \ ole32.lib \ comctl32.lib \ advapi32.lib \ userenv.lib \ netapi32.lib DEFINES = VC_EXTRALEAN \ WIN32 \ _UNICODE \ UNICODE \ WINVER=0x0600 \ _WIN32_WINNT=0x0600 \ _WIN32_WINDOWS=0x0600 \ _WIN32_IE=0x0700 if(!debug_and_release|build_pass) { CONFIG(debug, debug|release):DESTDIR = ../debug/ CONFIG(release, debug|release):DESTDIR = ../release/ } } macx { ICON = ../misc/Launchy_Icon/launchy_icon_mac.icns SOURCES += ../platforms/mac/platform_mac.cpp \ ../platforms/mac/platform_mac_hotkey.cpp HEADERS += ../platforms/mac/platform_mac.h \ ../platforms/mac/platform_mac_hotkey.h \ platform_base_hotkey.h \ platform_base_hottrigger.h if(!debug_and_release|build_pass) { CONFIG(debug, debug|release):DESTDIR = ../debug/ CONFIG(release, debug|release):DESTDIR = ../release/ } INCLUDEPATH += /opt/local/include/ LIBS += -framework Carbon CONFIG(debug, debug|release):skins.path = ../debug/Launchy.app/Contents/Resources/skins/ CONFIG(release, debug|release):skins.path = ../release/Launchy.app/Contents/Resources/skins/ skins.files = skins.extra = rsync -arvz ../skins/ ../release/Launchy.app/Contents/Resources/skins/ --exclude=\".svn\" CONFIG(debug, debug|release):translations.path = ../debug/Launchy.app/Contents/MacOS/tr/ CONFIG(release, debug|release):translations.path = ../release/Launchy.app/Contents/MacOS/tr/ translations.files = ../translations/*.qm translations.extra = lupdate src.pro ; lrelease src.pro dmg.path = ../release/ dmg.files = dmg.extra = cd ../mac ; bash deploy; cd ../src INSTALLS += skins \ translations \ dmg } TRANSLATIONS = ../translations/launchy_fr.ts \ ../translations/launchy_nl.ts \ ../translations/launchy_zh.ts \ ../translations/launchy_es.ts \ ../translations/launchy_de.ts \ ../translations/launchy_ja.ts \ ../translations/launchy_zh_TW.ts OBJECTS_DIR = build MOC_DIR = build RESOURCES += launchy.qrc launchy-2.5/src/CharLineEdit.cpp0000644000175000017500000000562311260000425015631 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "CharLineEdit.h" CharLineEdit::CharLineEdit(QWidget* parent) : QLineEdit(parent) { setAttribute(Qt::WA_InputMethodEnabled); } void CharLineEdit::keyPressEvent(QKeyEvent* event) { bool handled = false; if (selectionStart() == -1) { switch (event->key()) { case Qt::Key_Backspace: if (isAtEndOfSeparator()) { // Delete separator characters in a single keypress. // Don't use setText This method maintains the undo history backspace(); backspace(); backspace(); handled = true; } break; case Qt::Key_Delete: if (isAtStartOfSeparator()) { del(); del(); del(); handled = true; } break; case Qt::Key_Left: if (isAtEndOfSeparator()) { cursorBackward(false, 3); handled = true; } break; case Qt::Key_Right: if (isAtStartOfSeparator()) { cursorForward(false, 3); handled = true; } break; } } if (handled) { event->ignore(); } else { QLineEdit::keyPressEvent(event); } emit keyPressed(event); } // This is how you pick up the tab key bool CharLineEdit::focusNextPrevChild(bool next) { QKeyEvent event(QEvent::KeyPress, Qt::Key_Tab, next ? Qt::NoModifier : Qt::ShiftModifier); emit keyPressed(&event); return true; } void CharLineEdit::focusInEvent(QFocusEvent* event) { QLineEdit::focusInEvent(event); emit focusIn(event); } void CharLineEdit::focusOutEvent(QFocusEvent* event) { QLineEdit::focusOutEvent(event); emit focusOut(event); } void CharLineEdit::inputMethodEvent(QInputMethodEvent* event) { QLineEdit::inputMethodEvent(event); if (event->commitString() != "") { emit inputMethod(event); } } QChar CharLineEdit::separatorChar() const { QFontMetrics met = fontMetrics(); QChar arrow(0x25ba); if (met.inFont(arrow)) return arrow; else return QChar('|'); } QString CharLineEdit::separatorText() const { return QString(" ") + separatorChar() + " "; } bool CharLineEdit::isAtStartOfSeparator() const { return text().mid(cursorPosition(), 3) == separatorText(); } bool CharLineEdit::isAtEndOfSeparator() const { return text().mid(cursorPosition() - 3, 3) == separatorText(); } launchy-2.5/src/CommandHistory.cpp0000644000175000017500000000543011347515122016305 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "CommandHistory.h" #include "globals.h" CommandHistory::CommandHistory() { } bool CommandHistory::load(const QString& filename) { QFile inFile(filename); if (!inFile.open(QIODevice::ReadOnly)) return false; QByteArray ba = inFile.readAll(); QDataStream in(&ba, QIODevice::ReadOnly); in.setVersion(LAUNCHY_VERSION); while (!in.atEnd()) { InputDataList item; in >> item; history.push_back(item); } return true; } void CommandHistory::save(const QString& filename) const { QByteArray ba; QDataStream out(&ba, QIODevice::ReadWrite); out.setVersion(LAUNCHY_VERSION); foreach(InputDataList item, history) { out << item; } QFile file(filename); if (!file.open(QIODevice::WriteOnly)) { qWarning("Could not open history for writing"); return; } file.write(ba); } // Add an item or promote an existing matching item to the top of the list void CommandHistory::addItem(const InputDataList& item) { if (item.count() == 0) return; // Look for a matching history entry QString itemText = item.toString().toLower(); for (int i = 0; i < history.size(); ++i) { if (history[i].toString().toLower() == itemText) { // Found a match, remove it and add a replacement history.removeAt(i); break; } } InputDataList historyItem = item; historyItem.first().setLabel(LABEL_HISTORY); history.push_front(historyItem); if (history.size() > gSettings->value("GenOps/maxitemsinhistory", 20).toInt()) { history.pop_back(); } } InputDataList& CommandHistory::getItem(int index) { return history[index]; } void CommandHistory::removeAt(int index) { return history.removeAt(index); } // Populate the searchresults with items from the command history void CommandHistory::search(const QString& /*searchText*/, QList& searchResults) const { int index = 0; foreach(InputDataList historyItem, history) { CatItem item = historyItem.first().getTopResult(); item.shortName = historyItem.toString(); item.id = HASH_HISTORY; item.data = (void*)index++; searchResults.push_back(item); } } launchy-2.5/src/plugin_handler.h0000644000175000017500000000321011255771563016012 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PLUGIN_HANDLER #define PLUGIN_HANDLER #include #include #include "plugin_interface.h" #include "catalog.h" struct PluginInfo { uint id; QString name; QString path; PluginInterface* obj; bool loaded; ~PluginInfo() { QPluginLoader loader(path); loader.unload(); } }; class PluginHandler { public: PluginHandler(); ~PluginHandler(); void loadPlugins(); void showLaunchy(); void hideLaunchy(); void getLabels(QList* inputData); void getResults(QList* inputData, QList* results); void getCatalogs(QList* items); int execute(QList*, CatItem*); QWidget* doDialog(QWidget* parent, uint id); void endDialog(uint id, bool accept); QHash & getPlugins() { return plugins; } private: QHash plugins; }; #endif launchy-2.5/src/options.cpp0000644000175000017500000005737311351771616015064 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "options.h" #include "main.h" #include "globals.h" #include "plugin_handler.h" #include "FileBrowserDelegate.h" QByteArray OptionsDialog::windowGeometry; int OptionsDialog::currentTab; int OptionsDialog::currentPlugin; OptionsDialog::OptionsDialog(QWidget * parent) : QDialog(parent), directoryItemDelegate(this, FileBrowser::Directory) { setupUi(this); curPlugin = -1; restoreGeometry(windowGeometry); tabWidget->setCurrentIndex(currentTab); // Load General Options if (QSystemTrayIcon::isSystemTrayAvailable()) genShowTrayIcon->setChecked(gSettings->value("GenOps/showtrayicon", true).toBool()); else genShowTrayIcon->hide(); genAlwaysShow->setChecked(gSettings->value("GenOps/alwaysshow", false).toBool()); genAlwaysTop->setChecked(gSettings->value("GenOps/alwaystop", false).toBool()); genPortable->setChecked(settings.isPortable()); genHideFocus->setChecked(gSettings->value("GenOps/hideiflostfocus", false).toBool()); genDecorateText->setChecked(gSettings->value("GenOps/decoratetext", false).toBool()); int center = gSettings->value("GenOps/alwayscenter", 3).toInt(); genHCenter->setChecked((center & 1) != 0); genVCenter->setChecked((center & 2) != 0); genShiftDrag->setChecked(gSettings->value("GenOps/dragmode", 0) == 1); genUpdateCheck->setChecked(gSettings->value("GenOps/updatecheck", true).toBool()); genShowHidden->setChecked(gSettings->value("GenOps/showHiddenFiles", false).toBool()); genShowNetwork->setChecked(gSettings->value("GenOps/showNetwork", true).toBool()); genUseWildcards->setChecked(gSettings->value("GenOps/wildcardFileSearch", false).toBool()); genCondensed->setCurrentIndex(gSettings->value("GenOps/condensedView", 0).toInt()); genAutoSuggestDelay->setValue(gSettings->value("GenOps/autoSuggestDelay", 1000).toInt()); int updateInterval = gSettings->value("GenOps/updatetimer", 10).toInt(); connect(genUpdateCatalog, SIGNAL(stateChanged(int)), this, SLOT(autoUpdateCheckChanged(int))); genUpdateMinutes->setValue(updateInterval); genUpdateCatalog->setChecked(updateInterval > 0); genMaxViewable->setValue(gSettings->value("GenOps/numviewable", 4).toInt()); genNumResults->setValue(gSettings->value("GenOps/numresults", 10).toInt()); genNumHistory->setValue(gSettings->value("GenOps/maxitemsinhistory", 20).toInt()); genOpaqueness->setValue(gSettings->value("GenOps/opaqueness", 100).toInt()); genFadeIn->setValue(gSettings->value("GenOps/fadein", 0).toInt()); genFadeOut->setValue(gSettings->value("GenOps/fadeout", 20).toInt()); connect(genOpaqueness, SIGNAL(sliderMoved(int)), gMainWidget, SLOT(setOpaqueness(int))); #ifdef Q_WS_MAC metaKeys << tr("") << tr("Alt") << tr("Command") << tr("Shift") << tr("Control") << tr("Command+Alt") << tr("Command+Shift") << tr("Command+Control"); #else metaKeys << tr("") << tr("Alt") << tr("Control") << tr("Shift") << tr("Win") << tr("Ctrl+Alt") << tr("Ctrl+Shift") << tr("Ctrl+Win"); #endif iMetaKeys << Qt::NoModifier << Qt::AltModifier << Qt::ControlModifier << Qt::ShiftModifier << Qt::MetaModifier << (Qt::ControlModifier | Qt::AltModifier) << (Qt::ControlModifier | Qt::ShiftModifier) << (Qt::ControlModifier | Qt::MetaModifier); actionKeys << tr("Space") << tr("Tab") << tr("Caps Lock") << tr("Backspace") << tr("Enter") << tr("Esc") << tr("Insert") << tr("Delete") << tr("Home") << tr("End") << tr("Page Up") << tr("Page Down") << tr("Print") << tr("Scroll Lock") << tr("Pause") << tr("Num Lock") << tr("Up") << tr("Down") << tr("Left") << tr("Right") << tr("F1") << tr("F2") << tr("F3") << tr("F4") << tr("F5") << tr("F6") << tr("F7") << tr("F8") << tr("F9") << tr("F10") << tr("F11") << tr("F12") << tr("F13") << tr("F14") << tr("F15"); iActionKeys << Qt::Key_Space << Qt::Key_Tab << Qt::Key_CapsLock << Qt::Key_Backspace << Qt::Key_Enter << Qt::Key_Escape << Qt::Key_Insert << Qt::Key_Delete << Qt::Key_Home << Qt::Key_End << Qt::Key_PageUp << Qt::Key_PageDown << Qt::Key_Print << Qt::Key_ScrollLock << Qt::Key_Pause << Qt::Key_NumLock << Qt::Key_Up << Qt::Key_Down << Qt::Key_Left << Qt::Key_Right << Qt::Key_F1 << Qt::Key_F2 << Qt::Key_F3 << Qt::Key_F4 << Qt::Key_F5 << Qt::Key_F6 << Qt::Key_F7 << Qt::Key_F8 << Qt::Key_F9 << Qt::Key_F10 << Qt::Key_F11 << Qt::Key_F12 << Qt::Key_F13 << Qt::Key_F14 << Qt::Key_F15; for (int i = '0'; i <= '9'; i++) { actionKeys << QString(QChar(i)); iActionKeys << i; } for (int i = 'A'; i <= 'Z'; i++) { actionKeys << QString(QChar(i)); iActionKeys << i; } actionKeys << "`" << "-" << "=" << "[" << "]" << ";" << "'" << "#" << "\\" << "," << "." << "/"; iActionKeys << '`' << '-' << '=' << '[' << ']' << ';' << '\'' << '#' << '\\' << ',' << '.' << '/'; // Find the current hotkey int hotkey = gMainWidget->getHotkey(); int meta = hotkey & (Qt::AltModifier | Qt::MetaModifier | Qt::ShiftModifier | Qt::ControlModifier); hotkey &= ~(Qt::AltModifier | Qt::MetaModifier | Qt::ShiftModifier | Qt::ControlModifier); for (int i = 0; i < metaKeys.count(); ++i) { genModifierBox->addItem(metaKeys[i]); if (iMetaKeys[i] == meta) genModifierBox->setCurrentIndex(i); } for (int i = 0; i < actionKeys.count(); ++i) { genKeyBox->addItem(actionKeys[i]); if (iActionKeys[i] == hotkey) genKeyBox->setCurrentIndex(i); } // Load up web proxy settings genProxyHostname->setText(gSettings->value("WebProxy/hostAddress").toString()); genProxyPort->setText(gSettings->value("WebProxy/port").toString()); // Load up the skins list QString skinName = gSettings->value("GenOps/skin", "Default").toString(); int skinRow = 0; QHash knownSkins; foreach(QString szDir, settings.directory("skins")) { QDir dir(szDir); QStringList dirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); foreach(QString d, dirs) { if (knownSkins.contains(d)) continue; knownSkins[d] = true; QFile f(dir.absolutePath() + "/" + d + "/style.qss"); // Only look for 2.0+ skins if (!f.exists()) continue; QListWidgetItem* item = new QListWidgetItem(d); skinList->addItem(item); if (skinName.compare(d, Qt::CaseInsensitive) == 0) skinRow = skinList->count() - 1; } } skinList->setCurrentRow(skinRow); connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); // Load the directories and types catDirectories->setItemDelegate(&directoryItemDelegate); connect(catDirectories, SIGNAL(currentRowChanged(int)), this, SLOT(dirRowChanged(int))); connect(catDirectories, SIGNAL(dragEnter(QDragEnterEvent*)), this, SLOT(catDirDragEnter(QDragEnterEvent*))); connect(catDirectories, SIGNAL(drop(QDropEvent*)), this, SLOT(catDirDrop(QDropEvent*))); connect(catDirectories, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(catDirItemChanged(QListWidgetItem*))); connect(catDirPlus, SIGNAL(clicked(bool)), this, SLOT(catDirPlusClicked(bool))); connect(catDirMinus, SIGNAL(clicked(bool)), this, SLOT(catDirMinusClicked(bool))); connect(catTypes, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(catTypesItemChanged(QListWidgetItem*))); connect(catTypesPlus, SIGNAL(clicked(bool)), this, SLOT(catTypesPlusClicked(bool))); connect(catTypesMinus, SIGNAL(clicked(bool)), this, SLOT(catTypesMinusClicked(bool))); connect(catCheckDirs, SIGNAL(stateChanged(int)), this, SLOT(catTypesDirChanged(int))); connect(catCheckBinaries, SIGNAL(stateChanged(int)), this, SLOT(catTypesExeChanged(int))); connect(catDepth, SIGNAL(valueChanged(int)),this, SLOT(catDepthChanged(int))); catRescan->setEnabled(gBuilder == NULL); connect(catRescan, SIGNAL(clicked(bool)), this, SLOT(catRescanClicked(bool))); int size = gSettings->beginReadArray("directories"); for (int i = 0; i < size; ++i) { gSettings->setArrayIndex(i); Directory tmp; tmp.name = gSettings->value("name").toString(); tmp.types = gSettings->value("types").toStringList(); tmp.indexDirs = gSettings->value("indexDirs", false).toBool(); tmp.indexExe = gSettings->value("indexExes", false).toBool(); tmp.depth = gSettings->value("depth", 100).toInt(); memDirs.append(tmp); } gSettings->endArray(); if (memDirs.count() == 0) { memDirs = platform->getDefaultCatalogDirectories(); } for (int i = 0; i < memDirs.count(); ++i) { catDirectories->addItem(memDirs[i].name); QListWidgetItem* it = catDirectories->item(i); it->setFlags(it->flags() | Qt::ItemIsEditable); } if (catDirectories->count() > 0) catDirectories->setCurrentRow(0); genOpaqueness->setRange(15, 100); if (gMainWidget->catalog != NULL) { catSize->setText(tr("Index has %n item(s)", "", gMainWidget->catalog->count())); } if (gBuilder != NULL) { connect(gBuilder.get(), SIGNAL(catalogIncrement(float)), this, SLOT(catProgressUpdated(float))); connect(gBuilder.get(), SIGNAL(catalogFinished()), this, SLOT(catalogBuilt())); } // Load up the plugins connect(plugList, SIGNAL(currentRowChanged(int)), this, SLOT(pluginChanged(int))); connect(plugList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(pluginItemChanged(QListWidgetItem*))); gMainWidget->plugins.loadPlugins(); foreach(PluginInfo info, gMainWidget->plugins.getPlugins()) { plugList->addItem(info.name); QListWidgetItem* item = plugList->item(plugList->count()-1); item->setData(Qt::UserRole, info.id); item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsEnabled); if (info.loaded) item->setCheckState(Qt::Checked); else item->setCheckState(Qt::Unchecked); } plugList->sortItems(); if (plugList->count() > 0) { plugList->setCurrentRow(currentPlugin); } aboutVer->setText(tr("This is Launchy version %1").arg(LAUNCHY_VERSION_STRING)); catDirectories->installEventFilter(this); needRescan = false; } OptionsDialog::~OptionsDialog() { if (gBuilder != NULL) { disconnect(gBuilder.get(), SIGNAL(catalogIncrement(float)), this, SLOT(catProgressUpdated(float))); disconnect(gBuilder.get(), SIGNAL(catalogFinished()), this, SLOT(catalogBuilt())); } currentTab = tabWidget->currentIndex(); windowGeometry = saveGeometry(); } void OptionsDialog::setVisible(bool visible) { QDialog::setVisible(visible); if (visible) { connect(skinList, SIGNAL(currentTextChanged(const QString)), this, SLOT(skinChanged(const QString))); skinChanged(skinList->currentItem()->text()); } } void OptionsDialog::accept() { if (gSettings == NULL) return; // See if the new hotkey works, if not we're not leaving the dialog. QKeySequence hotkey(iMetaKeys[genModifierBox->currentIndex()] + iActionKeys[genKeyBox->currentIndex()]); if (!gMainWidget->setHotkey(hotkey)) { QMessageBox::warning(this, tr("Launchy"), tr("The hotkey %1 is already in use, please select another.").arg(hotkey.toString())); return; } gSettings->setValue("GenOps/hotkey", hotkey.count() > 0 ? hotkey[0] : 0); // Save General Options gSettings->setValue("GenOps/showtrayicon", genShowTrayIcon->isChecked()); gSettings->setValue("GenOps/alwaysshow", genAlwaysShow->isChecked()); gSettings->setValue("GenOps/alwaystop", genAlwaysTop->isChecked()); gSettings->setValue("GenOps/updatecheck", genUpdateCheck->isChecked()); gSettings->setValue("GenOps/decoratetext", genDecorateText->isChecked()); gSettings->setValue("GenOps/hideiflostfocus", genHideFocus->isChecked()); gSettings->setValue("GenOps/alwayscenter", (genHCenter->isChecked() ? 1 : 0) | (genVCenter->isChecked() ? 2 : 0)); gSettings->setValue("GenOps/dragmode", genShiftDrag->isChecked() ? 1 : 0); gSettings->setValue("GenOps/showHiddenFiles", genShowHidden->isChecked()); gSettings->setValue("GenOps/showNetwork", genShowNetwork->isChecked()); gSettings->setValue("GenOps/wildcardFileSearch", genUseWildcards->isChecked()); gSettings->setValue("GenOps/condensedView", genCondensed->currentIndex()); gSettings->setValue("GenOps/autoSuggestDelay", genAutoSuggestDelay->value()); gSettings->setValue("GenOps/updatetimer", genUpdateCatalog->isChecked() ? genUpdateMinutes->value() : 0); gSettings->setValue("GenOps/numviewable", genMaxViewable->value()); gSettings->setValue("GenOps/numresults", genNumResults->value()); gSettings->setValue("GenOps/maxitemsinhistory", genNumHistory->value()); gSettings->setValue("GenOps/opaqueness", genOpaqueness->value()); gSettings->setValue("GenOps/fadein", genFadeIn->value()); gSettings->setValue("GenOps/fadeout", genFadeOut->value()); gSettings->setValue("WebProxy/hostAddress", genProxyHostname->text()); gSettings->setValue("WebProxy/port", genProxyPort->text()); // Apply General Options settings.setPortable(genPortable->isChecked()); gMainWidget->setSuggestionListMode(genCondensed->currentIndex()); gMainWidget->loadOptions(); // Apply Directory Options saveCatalogOptions(); if (curPlugin >= 0) { QListWidgetItem* item = plugList->item(curPlugin); gMainWidget->plugins.endDialog(item->data(Qt::UserRole).toUInt(), true); } gSettings->sync(); QDialog::accept(); // Now save the options that require launchy to be shown or redrawed bool show = gMainWidget->setAlwaysShow(genAlwaysShow->isChecked()); show |= gMainWidget->setAlwaysTop(genAlwaysTop->isChecked()); gMainWidget->setOpaqueness(genOpaqueness->value()); // Apply Skin Options QString prevSkinName = gSettings->value("GenOps/skin", "Default").toString(); QString skinName = skinList->currentItem()->text(); if (skinList->currentRow() >= 0 && skinName != prevSkinName) { gSettings->setValue("GenOps/skin", skinName); gMainWidget->setSkin(skinName); show = false; } if (needRescan) gMainWidget->buildCatalog(); if (show) gMainWidget->showLaunchy(); } void OptionsDialog::reject() { if (curPlugin >= 0) { QListWidgetItem* item = plugList->item(curPlugin); gMainWidget->plugins.endDialog(item->data(Qt::UserRole).toUInt(), false); } QDialog::reject(); } void OptionsDialog::tabChanged(int tab) { tab = tab; // Compiler warning // Redraw the current skin (necessary because of dialog resizing issues) if (tabWidget->currentWidget()->objectName() == "Skins") { skinChanged(skinList->currentItem()->text()); } else if (tabWidget->currentWidget()->objectName() == "Plugins") { // We've currently no way of checking is a plugin requires a catalog rescan // assume that needRescan = true; } } void OptionsDialog::autoUpdateCheckChanged(int state) { genUpdateMinutes->setEnabled(state > 0); if (genUpdateMinutes->value() <= 0) genUpdateMinutes->setValue(10); } void OptionsDialog::skinChanged(const QString& newSkin) { if (newSkin.count() == 0) return; // Find the skin with this name QString directory = settings.skinPath(newSkin); // Load up the author file if (directory.length() == 0) { authorInfo->setText(""); return; } QFile author(directory + "author.txt"); if (!author.open(QIODevice::ReadOnly)) { authorInfo->setText(""); } QTextStream in(&author); QString line, total; line = in.readLine(); while (!line.isNull()) { total += line + "\n"; line = in.readLine(); } authorInfo->setText(total); author.close(); // Set the image preview QPixmap pix; if (pix.load(directory + "background.png")) { if (!platform->supportsAlphaBorder() && QFile::exists(directory + "background_nc.png")) pix.load(directory + "background_nc.png"); if (pix.hasAlpha()) pix.setMask(pix.mask()); if (!platform->supportsAlphaBorder() && QFile::exists(directory + "mask_nc.png")) pix.setMask(QPixmap(directory + "mask_nc.png")); else if (QFile::exists(directory + "mask.png")) pix.setMask(QPixmap(directory + "mask.png")); if (platform->supportsAlphaBorder()) { // Compose the alpha image with the background QImage sourceImage(pix.toImage()); QImage destinationImage(directory + "alpha.png"); QImage resultImage(destinationImage.size(), QImage::Format_ARGB32_Premultiplied); QPainter painter(&resultImage); painter.setCompositionMode(QPainter::CompositionMode_Source); painter.fillRect(resultImage.rect(), Qt::transparent); painter.setCompositionMode(QPainter::CompositionMode_SourceOver); painter.drawImage(0, 0, sourceImage); painter.drawImage(0, 0, destinationImage); painter.end(); pix = QPixmap::fromImage(resultImage); QPixmap scaled = pix.scaled(skinPreview->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); skinPreview->setPixmap(scaled); } } else if (pix.load(directory + "frame.png")) { QPixmap scaled = pix.scaled(skinPreview->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); skinPreview->setPixmap(scaled); } else { skinPreview->clear(); } } void OptionsDialog::pluginChanged(int row) { plugBox->setTitle(tr("Plugin options")); if (plugBox->layout() != NULL) for (int i = 1; i < plugBox->layout()->count(); i++) plugBox->layout()->removeItem(plugBox->layout()->itemAt(i)); // Close any current plugin dialogs if (curPlugin >= 0) { QListWidgetItem* item = plugList->item(curPlugin); gMainWidget->plugins.endDialog(item->data(Qt::UserRole).toUInt(), true); } // Open the new plugin dialog curPlugin = row; currentPlugin = row; if (row < 0) return; QListWidgetItem* item = plugList->item(row); QWidget* win = gMainWidget->plugins.doDialog(plugBox, item->data(Qt::UserRole).toUInt()); if (win != NULL) { if (plugBox->layout() != NULL) plugBox->layout()->addWidget(win); win->show(); if (win->windowTitle() != "Form") plugBox->setTitle(win->windowTitle()); } } void OptionsDialog::pluginItemChanged(QListWidgetItem* iz) { int row = plugList->currentRow(); if (row == -1) return; // Close any current plugin dialogs if (curPlugin >= 0) { QListWidgetItem* item = plugList->item(curPlugin); gMainWidget->plugins.endDialog(item->data(Qt::UserRole).toUInt(), true); } // Write out the new config gSettings->beginWriteArray("plugins"); for (int i = 0; i < plugList->count(); i++) { QListWidgetItem* item = plugList->item(i); gSettings->setArrayIndex(i); gSettings->setValue("id", item->data(Qt::UserRole).toUInt()); if (item->checkState() == Qt::Checked) { gSettings->setValue("load", true); } else { gSettings->setValue("load", false); } } gSettings->endArray(); // Reload the plugins gMainWidget->plugins.loadPlugins(); // If enabled, reload the dialog if (iz->checkState() == Qt::Checked) { gMainWidget->plugins.doDialog(plugBox, iz->data(Qt::UserRole).toUInt()); } } void OptionsDialog::catProgressUpdated(float val) { catProgress->setValue((int) val); } void OptionsDialog::catalogBuilt() { catRescan->setEnabled(true); if (gMainWidget->catalog != NULL) catSize->setText(tr("Index has %n items", "", gMainWidget->catalog->count())); } void OptionsDialog::catRescanClicked(bool val) { val = val; // Compiler warning // Apply Directory Options saveCatalogOptions(); if (gBuilder == NULL) { needRescan = false; catRescan->setEnabled(false); gMainWidget->buildCatalog(); connect(gBuilder.get(), SIGNAL(catalogFinished()), this, SLOT(catalogBuilt())); connect(gBuilder.get(), SIGNAL(catalogIncrement(float)), this, SLOT(catProgressUpdated(float))); } } void OptionsDialog::catTypesDirChanged(int state) { state = state; // Compiler warning int row = catDirectories->currentRow(); if (row == -1) return; memDirs[row].indexDirs = catCheckDirs->isChecked(); needRescan = true; } void OptionsDialog::catTypesExeChanged(int state) { state = state; // Compiler warning int row = catDirectories->currentRow(); if (row == -1) return; memDirs[row].indexExe = catCheckBinaries->isChecked(); needRescan = true; } void OptionsDialog::catDirItemChanged(QListWidgetItem* item) { int row = catDirectories->currentRow(); if (row == -1) return; if (item != catDirectories->item(row)) return; memDirs[row].name = item->text(); needRescan = true; } void OptionsDialog::catDirDragEnter(QDragEnterEvent *event) { const QMimeData* mimeData = event->mimeData(); if (mimeData && mimeData->hasUrls()) event->acceptProposedAction(); } void OptionsDialog::catDirDrop(QDropEvent *event) { const QMimeData* mimeData = event->mimeData(); if (mimeData && mimeData->hasUrls()) { foreach(QUrl url, mimeData->urls()) { QFileInfo info(url.toLocalFile()); if(info.exists() && info.isDir()) { addDirectory(info.filePath()); } } } } void OptionsDialog::dirRowChanged(int row) { if (row == -1) return; catTypes->clear(); foreach(QString str, memDirs[row].types) { QListWidgetItem* item = new QListWidgetItem(str, catTypes); item->setFlags(item->flags() | Qt::ItemIsEditable); } catCheckDirs->setChecked(memDirs[row].indexDirs); catCheckBinaries->setChecked(memDirs[row].indexExe); catDepth->setValue(memDirs[row].depth); needRescan = true; } void OptionsDialog::catDirMinusClicked(bool c) { c = c; // Compiler warning int dirRow = catDirectories->currentRow(); delete catDirectories->takeItem(dirRow); catTypes->clear(); memDirs.removeAt(dirRow); if (dirRow >= catDirectories->count() && catDirectories->count() > 0) { catDirectories->setCurrentRow(catDirectories->count() - 1); dirRowChanged(catDirectories->count() - 1); } } void OptionsDialog::catDirPlusClicked(bool c) { c = c; // Compiler warning QString dir = QFileDialog::getExistingDirectory(this, tr("Select a directory"), lastDir, QFileDialog::ShowDirsOnly); if (dir != "") { lastDir = dir; addDirectory(dir); } } void OptionsDialog::addDirectory(const QString& directory) { QString nativeDir = QDir::toNativeSeparators(directory); Directory dir(nativeDir); memDirs.append(dir); catTypes->clear(); QListWidgetItem* item = new QListWidgetItem(nativeDir, catDirectories); item->setFlags(item->flags() | Qt::ItemIsEditable); catDirectories->setCurrentItem(item); needRescan = true; } void OptionsDialog::catTypesItemChanged(QListWidgetItem* item) { Q_UNUSED(item); int row = catDirectories->currentRow(); if (row == -1) return; int typesRow = catTypes->currentRow(); if (typesRow == -1) return; memDirs[row].types[typesRow] = catTypes->item(typesRow)->text(); needRescan = true; } void OptionsDialog::catTypesPlusClicked(bool c) { c = c; // Compiler warning int row = catDirectories->currentRow(); if (row == -1) return; memDirs[row].types << ""; QListWidgetItem* item = new QListWidgetItem(catTypes); item->setFlags(item->flags() | Qt::ItemIsEditable); catTypes->setCurrentItem(item); catTypes->editItem(item); needRescan = true; } void OptionsDialog::catTypesMinusClicked(bool c) { c = c; // Compiler warning int dirRow = catDirectories->currentRow(); if (dirRow == -1) return; int typesRow = catTypes->currentRow(); if (typesRow == -1) return; memDirs[dirRow].types.removeAt(typesRow); delete catTypes->takeItem(typesRow); if (typesRow >= catTypes->count() && catTypes->count() > 0) catTypes->setCurrentRow(catTypes->count() - 1); needRescan = true; } void OptionsDialog::catDepthChanged(int d) { int row = catDirectories->currentRow(); if (row != -1) memDirs[row].depth = d; needRescan = true; } void OptionsDialog::saveCatalogOptions() { gSettings->beginWriteArray("directories"); for (int i = 0; i < memDirs.count(); ++i) { gSettings->setArrayIndex(i); gSettings->setValue("name", memDirs[i].name); gSettings->setValue("types", memDirs[i].types); gSettings->setValue("indexDirs", memDirs[i].indexDirs); gSettings->setValue("indexExes", memDirs[i].indexExe); gSettings->setValue("depth", memDirs[i].depth); } gSettings->endArray(); } launchy-2.5/src/FileSearch.cpp0000644000175000017500000001036211351723001015342 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "FileSearch.h" #include "main.h" #include "globals.h" void FileSearch::search(const QString& searchText, QList& searchResults, InputDataList& inputData) { QString searchPath = QDir::fromNativeSeparators(searchText); if (searchPath.startsWith("~")) searchPath.replace("~", QDir::homePath()); #ifdef Q_WS_WIN if (searchPath == "/") { // Special case for Windows: list available drives QFileInfoList driveList = QDir::drives(); foreach(QFileInfo info, driveList) { // Retrieve volume name QString volumeName; WCHAR volName[MAX_PATH]; if (GetVolumeInformation((WCHAR*)info.filePath().utf16(), volName, MAX_PATH, NULL, NULL, NULL, NULL, 0)) volumeName = QString::fromUtf16((const ushort*)volName); else volumeName = QDir::toNativeSeparators(info.filePath()); CatItem item(QDir::toNativeSeparators(info.filePath()), volumeName); item.id = HASH_LAUNCHYFILE; searchResults.push_front(item); } return; } if (searchPath.size() == 2 && searchText[0].isLetter() && searchPath[1] == ':') searchPath += "/"; #endif // Network searches are too slow to run in the main thread if (searchPath.startsWith("//")) { if (!gSettings->value("GenOps/showNetwork", true).toBool()) return; QRegExp re("//([a-z0-9\\-]+)?$", Qt::CaseInsensitive); if (re.exactMatch(searchPath)) { inputData.last().setLabel(LABEL_FILE); QList computers; platform->getComputers(computers); // Filter computer names by search text foreach(QString computer, computers) { QString computerPath = "//" + computer; if (computerPath.indexOf(searchPath, 0, Qt::CaseInsensitive) == 0) { CatItem item(QDir::toNativeSeparators(computerPath), computer); item.id = HASH_LAUNCHYFILE; searchResults.push_back(item); } } } return; } // Split the string on the last slash QString directoryPart = searchPath.mid(0,searchPath.lastIndexOf("/")+1); QString filePart = searchPath.mid(searchPath.lastIndexOf("/")+1); QFileInfo info(directoryPart); if (!info.isDir()) return; inputData.last().setLabel(LABEL_FILE); // Okay, we have a directory, find files that match "file" QDir dir(directoryPart); QStringList fileList; QDir::Filters filters = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot; #ifndef Q_WS_WIN filters |= QDir::CaseSensitive; #endif if (gSettings->value("GenOps/showHiddenFiles", false).toBool()) filters |= QDir::Hidden; bool userWildcard = false; QString fileSearch; if (gSettings->value("GenOps/wildcardFileSearch", false).toBool()) { userWildcard = filePart.contains("*") || filePart.contains("?") || filePart.contains("["); fileSearch = filePart; } fileSearch += "*"; fileList = dir.entryList(QStringList(fileSearch), filters, QDir::DirsLast | QDir::IgnoreCase | QDir::LocaleAware); foreach(QString fileName, fileList) { if (userWildcard || fileName.indexOf(filePart, 0, Qt::CaseInsensitive) == 0) { QString filePath = dir.absolutePath() + "/" + fileName; filePath = QDir::cleanPath(filePath); CatItem item(QDir::toNativeSeparators(filePath), fileName); item.id = HASH_LAUNCHYFILE; searchResults.push_back(item); } } // Showing a directory if (filePart.count() == 0) { QString fullPath = QDir::toNativeSeparators(directoryPart); if (!fullPath.endsWith(QDir::separator())) fullPath += QDir::separator(); QString name = info.dir().dirName(); CatItem item(fullPath, name.count() == 0 ? fullPath : name); item.id = HASH_LAUNCHYFILE; searchResults.push_front(item); } } launchy-2.5/src/dsingleapplication.cpp0000644000175000017500000002215510665407672017235 0ustar monesmones/******************************************************************************* DSingleApplication is basically imitating QtSingleApplication commercial class The implementation is though quite different from what is described in trolltech documetation for QtSingleApplication. DSingleApplication uses tcp sockets to test/open a port in a range and then sed a message to that port and expects a correct answer, if it's correct then the app is running and we can talk to it. Messages sent are in text and start with APP_ID+":", unles message has this three bytes it is descarded. Each text message is prepended with int32 value of it's size. Author: Dima Fedorov Levit Copyright (C) BioImage Informatics Licence: GPL History: 02/08/2007 17:14 - First creation ver: 1 *******************************************************************************/ /* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "dsingleapplication.h" #include #include #include DSingleApplication::DSingleApplication( const QString &id, bool initialize ) { other_instance_running = false; app_id = id; port = d_unique_port_start; tcpServer = new DTalker( app_id, this ); tcpSocket = NULL; if (initialize) init(); } DSingleApplication::~DSingleApplication() { if (tcpServer != NULL) delete tcpServer; if (tcpSocket != NULL) delete tcpSocket; } QString DSingleApplication::id () const { return app_id; } void DSingleApplication::initialize () { init(); } bool DSingleApplication::isRunning () const { // may require some checks here return other_instance_running; } void DSingleApplication::init() { // start at d_unique_port_start and go until find a free port or a port // that answers correctly other_instance_running = false; DPortChecker checker( app_id, d_unique_port_start, this ); // first go over the range of ports and check for other instance // if not, then listen on the forst port available DPortList ports; while (port <= d_unique_port_finish) { // here check if the stuff running on port is our instance if not procede checker.check( port ); checker.wait(); DPortChecker::PortStatus port_status = checker.status(); if (port_status == DPortChecker::us) { other_instance_running = true; // here we have to connect to other instance to send messages tcpSocket = checker.transferSocketOwnership(); return; } DPortInfo pi( port, checker.status() == DPortChecker::free ); ports << pi; ++port; } // while port = ports.firstFreePort(); // other instance is not running in the range and there's available port if (port == -1) return; // this port is free and current instance is in listening mode bool listening = tcpServer->listen( QHostAddress::LocalHost, port ); if (listening) connect( tcpServer, SIGNAL(messageReceived(const QString &)), this, SLOT(onClientMessage(const QString &)) ); } bool DSingleApplication::sendMessage ( const QString &message ) { if (!other_instance_running) return false; if (!tcpSocket) return false; if ( tcpSocket->state() != QAbstractSocket::ConnectedState ) return false; QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion( out.version() ); // set to the current Qt version QString msg = app_id + ":" + message; out << (quint32) msg.size(); out << msg; tcpSocket->write(block); tcpSocket->flush(); tcpSocket->waitForBytesWritten( d_timeout_try_write ); return true; } void DSingleApplication::onClientMessage( const QString & message ) { emit messageReceived( message ); } //****************************************************************************** // DPortChecker // This class is used to check specific port if it has an instance of this app //****************************************************************************** DPortChecker::DPortChecker( const QString &id, int port, QObject *parent ) : QThread(parent) { tcpSocket = NULL; this->port = port; app_id = id; result = DPortChecker::free; } DPortChecker::~DPortChecker() { if (tcpSocket != NULL) delete tcpSocket; } DPortChecker::PortStatus DPortChecker::status() const { return result; } void DPortChecker::check( int port ) { this->port = port; start(); } void DPortChecker::run() { result = DPortChecker::free; if (tcpSocket == NULL) tcpSocket = new QTcpSocket(); tcpSocket->connectToHost( QHostAddress(QHostAddress::LocalHost), port ); if (!tcpSocket->waitForConnected(d_timeout_try_connect)) { tcpSocket->abort(); return; } result = DPortChecker::others; if (!tcpSocket->waitForReadyRead(d_timeout_try_read)) { tcpSocket->abort(); return; } // now compare received bytes with app_id QDataStream in(tcpSocket); in.setVersion( in.version() ); // set to the current Qt version if (tcpSocket->bytesAvailable() > 0) { QString msgString; in >> msgString; if (msgString.size() <= 1) { tcpSocket->abort(); return; } int s = qMin( msgString.size(), app_id.size() ); if ( QString::compare( msgString.left(s), app_id.left(s) ) == 0) result = DPortChecker::us; } } QTcpSocket* DPortChecker::transferSocketOwnership() { QTcpSocket *tmp = tcpSocket; tcpSocket = NULL; return tmp; } //****************************************************************************** // DTalker // This is a server responsible to talking to incoming connections //****************************************************************************** DTalker::DTalker(const QString &id, QObject *parent) : app_id(id), QTcpServer(parent) { } void DTalker::incomingConnection( int socketDescriptor ) { DListner *listner = new DListner(app_id, socketDescriptor, this); connect(listner, SIGNAL(messageReceived(const QString &)), this, SLOT(onClientMessage( const QString &)) ); connect(listner, SIGNAL(finished()), listner, SLOT(deleteLater())); listner->start(); } void DTalker::onClientMessage( const QString & message ) { emit messageReceived( message ); } //****************************************************************************** // DListner // This thread is used to communicate with connected client //****************************************************************************** DListner::DListner( const QString &id, int socketDescriptor, QObject *parent ) : socketDescriptor(socketDescriptor), app_id(id), QThread(parent) { blockSize = 0; } DListner::~DListner() { } void DListner::run() { QTcpSocket tcpSocket; if (!tcpSocket.setSocketDescriptor(socketDescriptor)) { return; } // send app_id to client QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion( out.version() ); // set to the current Qt version instead out << app_id; tcpSocket.write(block); //waitForBytesWritten ( int msecs ) while (1) { if (tcpSocket.state() != QAbstractSocket::ConnectedState) return; tcpSocket.waitForReadyRead(-1); read( &tcpSocket ); } } void DListner::read( QTcpSocket *tcpSocket ) { if (tcpSocket == NULL) return; if ( tcpSocket->state() != QAbstractSocket::ConnectedState ) return; QDataStream in(tcpSocket); in.setVersion( in.version() ); // set to the current Qt version instead if (blockSize == 0) { if (tcpSocket->bytesAvailable() < (int)sizeof(quint32)) return; in >> blockSize; } if (tcpSocket->bytesAvailable() < blockSize) return; QString msgString; in >> msgString; // if header matches, trim and emit QString magic = app_id + ":"; if ( QString::compare( msgString.left(magic.size()), magic ) == 0) emit messageReceived( msgString.remove(0, magic.size()) ); blockSize = 0; if (tcpSocket->bytesAvailable() > 0) read(tcpSocket); } //****************************************************************************** // DPortList //****************************************************************************** int DPortList::firstFreePort() { DPortList::iterator it = this->begin(); while ( it < this->end() ) { if ( it->free == true ) return it->port; ++it; } return -1; } bool DPortList::freePortAvailable() { int p = firstFreePort(); return p != -1; } launchy-2.5/src/catalog_builder.cpp0000644000175000017500000001410211340052360016452 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "catalog_types.h" #include "catalog_builder.h" #include "globals.h" #include "main.h" #include "Directory.h" CatalogBuilder::CatalogBuilder(PluginHandler* plugs) : plugins(plugs) { catalog.reset((Catalog*)createCatalog()); } CatalogBuilder::CatalogBuilder(PluginHandler* plugs, shared_ptr currentCatalog) : plugins(plugs), currentCatalog(currentCatalog) { catalog.reset((Catalog*)createCatalog()); } Catalog* CatalogBuilder::createCatalog() { if (gSettings->value("GenOps/fastindexer",false).toBool()) return new FastCatalog(); return new SlowCatalog(); } void CatalogBuilder::run() { buildCatalog(); emit catalogFinished(); } void CatalogBuilder::buildCatalog() { QList memDirs; int size = gSettings->beginReadArray("directories"); for (int i = 0; i < size; ++i) { gSettings->setArrayIndex(i); Directory tmp; tmp.name = gSettings->value("name").toString(); tmp.types = gSettings->value("types").toStringList(); tmp.indexDirs = gSettings->value("indexDirs", false).toBool(); tmp.indexExe = gSettings->value("indexExes", false).toBool(); tmp.depth = gSettings->value("depth", 100).toInt(); memDirs.append(tmp); } gSettings->endArray(); if (memDirs.count() == 0) { memDirs = platform->getDefaultCatalogDirectories(); } QHash pluginsInfo = plugins->getPlugins(); int totalItems = memDirs.count() + pluginsInfo.count(); int currentItem = 0; for (; currentItem < memDirs.count(); ++currentItem) { emit(catalogIncrement(100.0f * (currentItem+1) / totalItems)); QString cur = platform->expandEnvironmentVars(memDirs[currentItem].name); indexDirectory(cur, memDirs[currentItem].types, memDirs[currentItem].indexDirs, memDirs[currentItem].indexExe, memDirs[currentItem].depth); } foreach(PluginInfo info, pluginsInfo) { emit(catalogIncrement(100.0f * (currentItem+1) / totalItems)); if (info.loaded) { QList items; info.obj->msg(MSG_GET_CATALOG, (void*)&items); foreach(CatItem item, items) { if (currentCatalog != NULL) { item.usage = currentCatalog->getUsage(item.fullPath); } catalog->addItem(item); } } ++currentItem; } emit(catalogIncrement(0.0)); } void CatalogBuilder::indexDirectory(const QString& directory, const QStringList& filters, bool fdirs, bool fbin, int depth) { QString dir = QDir::toNativeSeparators(directory); QDir qd(dir); dir = qd.absolutePath(); QStringList dirs = qd.entryList(QDir::AllDirs); if (depth > 0) { for (int i = 0; i < dirs.count(); ++i) { if (!dirs[i].startsWith(".")) { QString cur = dirs[i]; if (!cur.contains(".lnk")) { #ifdef Q_WS_MAC // Special handling of app directories if (cur.endsWith(".app", Qt::CaseInsensitive)) { CatItem item(dir + "/" + cur); if (currentCatalog != NULL) item.usage = currentCatalog->getUsage(item.fullPath); platform->alterItem(&item); catalog->addItem(item); } else #endif indexDirectory(dir + "/" + dirs[i], filters, fdirs, fbin, depth-1); } } } } if (fdirs) { for (int i = 0; i < dirs.count(); ++i) { if (!dirs[i].startsWith(".") && !indexed.contains(dir + "/" + dirs[i])) { bool isShortcut = dirs[i].endsWith(".lnk", Qt::CaseInsensitive); CatItem item(dir + "/" + dirs[i], !isShortcut); if (currentCatalog != NULL) item.usage = currentCatalog->getUsage(item.fullPath); catalog->addItem(item); indexed[dir + "/" + dirs[i]] = true; } } } else { // Grab any shortcut directories // This is to work around a QT weirdness that treats shortcuts to directories as actual directories for (int i = 0; i < dirs.count(); ++i) { if (!dirs[i].startsWith(".") && dirs[i].endsWith(".lnk",Qt::CaseInsensitive)) { if (!indexed.contains(dir + "/" + dirs[i])) { CatItem item(dir + "/" + dirs[i], true); if (currentCatalog != NULL) item.usage = currentCatalog->getUsage(item.fullPath); catalog->addItem(item); indexed[dir + "/" + dirs[i]] = true; } } } } if (fbin) { QStringList bins = qd.entryList(QDir::Files | QDir::Executable); for (int i = 0; i < bins.count(); ++i) { if (!indexed.contains(dir + "/" + bins[i])) { CatItem item(dir + "/" + bins[i]); if (currentCatalog != NULL) item.usage = currentCatalog->getUsage(item.fullPath); catalog->addItem(item); indexed[dir + "/" + bins[i]] = true; } } } // Don't want a null file filter, that matches everything.. if (filters.count() == 0) return; QStringList files = qd.entryList(filters, QDir::Files | QDir::System, QDir::Unsorted ); for (int i = 0; i < files.count(); ++i) { if (!indexed.contains(dir + "/" + files[i])) { CatItem item(dir + "/" + files[i]); if (currentCatalog != NULL) item.usage = currentCatalog->getUsage(item.fullPath); platform->alterItem(&item); #ifdef Q_WS_X11 if(item.fullPath.endsWith(".desktop") && item.icon == "") continue; #endif catalog->addItem(item); indexed[dir + "/" + files[i]] = true; } } } launchy-2.5/src/catalog.h0000644000175000017500000001463611260000425014421 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef CATALOG_H #define CATALOG_H #include #include #include /** \brief CatItem (Catalog Item) stores a single item in the index */ class CatItem { public: /** The full path of the indexed item */ QString fullPath; /** The abbreviated name of the indexed item */ QString shortName; /** The lowercase name of the indexed item */ QString lowName; /** A path to an icon for the item */ QString icon; /** How many times this item has been called by the user */ int usage; /** This is unused, and meant for plugin writers and future extensions */ void* data; /** The plugin id of the creator of this CatItem */ int id; CatItem() {} CatItem(QString full, bool isDir = false) : fullPath(full) { int last = fullPath.lastIndexOf("/"); if (last == -1) { shortName = fullPath; } else { shortName = fullPath.mid(last+1); if (!isDir) shortName = shortName.mid(0,shortName.lastIndexOf(".")); } lowName = shortName.toLower(); data = NULL; usage = 0; id = 0; } CatItem(QString full, QString shortN) : fullPath(full), shortName(shortN) { lowName = shortName.toLower(); data = NULL; usage = 0; id = 0; } CatItem(QString full, QString shortN, uint i_d) : fullPath(full), shortName(shortN), id(i_d) { lowName = shortName.toLower(); data = NULL; usage = 0; } /** This is the constructor most used by plugins \param full The full path of the file to execute \param The abbreviated name for the entry \param i_d Your plugin id (0 for Launchy itself) \param iconPath The path to the icon for this entry \warning It is usually a good idea to append ".your_plugin_name" to the end of the full parameter so that there are not multiple items in the index with the same full path. */ CatItem(QString full, QString shortN, uint i_d, QString iconPath) : fullPath(full), shortName(shortN), icon(iconPath), id(i_d) { lowName = shortName.toLower(); data = NULL; usage = 0; } CatItem(const CatItem &s) { fullPath = s.fullPath; shortName = s.shortName; lowName = s.lowName; icon = s.icon; usage = s.usage; data = s.data; id = s.id; } CatItem& operator=( const CatItem &s ) { fullPath = s.fullPath; shortName = s.shortName; lowName = s.lowName; icon = s.icon; usage = s.usage; data = s.data; id = s.id; return *this; } bool operator==(const CatItem& other) const { if (fullPath == other.fullPath) return true; return false; } }; /** InputData shows one segment (between tabs) of a user's query A user's query is typically represented by List and each element of the list represents a segment of the query. E.g. query = "google this is my search" will have 2 InputData segments in the list. One for "google" and one for "this is my search" */ class InputData { private: /** The user's entry */ QString text; /** Any assigned labels to this query segment */ QSet labels; /** A pointer to the best catalog match for this segment of the query */ CatItem topResult; /** The plugin id of this query's owner */ uint id; public: /** Get the labels applied to this query segment */ QSet getLabels() { return labels; } /** Apply a label to this query segment */ void setLabel(uint l) { labels.insert(l); } /** Remove a label from this query segment */ void removeLabel(uint l) { labels.remove(l); } /** Check if it has the given label applied to it */ bool hasLabel(uint l) { return labels.contains(l); } /** Set the id of this query This can be used to override the owner of the selected catalog item, so that no matter what item is chosen from the catalog, the given plugin will be the one to execute it. \param i The plugin id of the plugin to execute the query's best match from the catalog */ void setID(uint i) { id = i; } /** Returns the current owner id of the query */ uint getID() const { return id; } /** Get the text of the query segment */ QString getText() const { return text; } /** Set the text of the query segment */ void setText(QString t) { text = t; } /** Get the text of the query segment */ bool hasText() const { return text.length() > 0; } /** Get a pointer to the best catalog match for this segment of the query */ CatItem& getTopResult() { return topResult; } /** Change the best catalog match for this segment */ void setTopResult(CatItem sr) { topResult = sr; } InputData() { id = 0; } InputData(QString str) : text(str) { id = 0;} friend QDataStream &operator<<(QDataStream &out, const InputData &inputData); friend QDataStream &operator>>(QDataStream &in, InputData &inputData); }; bool CatLess(CatItem* left, CatItem* right); bool CatLessNoPtr(CatItem& a, CatItem& b); inline QDataStream &operator<<(QDataStream &out, const CatItem &item) { out << item.fullPath; out << item.shortName; out << item.lowName; out << item.icon; out << item.usage; out << item.id; return out; } inline QDataStream &operator>>(QDataStream &in, CatItem &item) { in >> item.fullPath; in >> item.shortName; in >> item.lowName; in >> item.icon; in >> item.usage; in >> item.id; return in; } inline QDataStream &operator<<(QDataStream &out, const InputData &inputData) { out << inputData.text; out << inputData.labels; out << inputData.topResult; out << inputData.id; return out; } inline QDataStream &operator>>(QDataStream &in, InputData &inputData) { in >> inputData.text; in >> inputData.labels; in >> inputData.topResult; in >> inputData.id; return in; } #endif launchy-2.5/src/platform_base.h0000644000175000017500000000420511351723001015617 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PLATFORM_BASE_H #define PLATFORM_BASE_H #include // OSX needs this #include "Directory.h" #include "catalog.h" #include "globals.h" class PlatformBase : public QApplication { public: PlatformBase(int& argc, char** argv) : QApplication(argc, argv) { platform = this; } virtual ~PlatformBase() { if (icons) { delete icons; icons = NULL; } } QIcon icon(const QFileInfo& info) { return icons->icon(info); } QIcon icon(QFileIconProvider::IconType type) { return icons->icon(type); } virtual void setPreferredIconSize(int size) = 0; virtual QList getDefaultCatalogDirectories() = 0; virtual bool isAlreadyRunning() const = 0; virtual void sendInstanceCommand(int command) { Q_UNUSED(command); } // Set hotkey virtual QKeySequence getHotkey() const = 0; virtual bool setHotkey(const QKeySequence& key, QObject* receiver, const char* slot) = 0; // Need to alter an indexed item? e.g. .desktop files virtual void alterItem(CatItem*) { } virtual QHash > getDirectories() = 0; virtual QString expandEnvironmentVars(QString txt) = 0; virtual bool supportsAlphaBorder() const { return false; } virtual bool getComputers(QList& computers) const { Q_UNUSED(computers); return false; } protected: QFileIconProvider* icons; QKeySequence hotkey; }; QApplication* createApplication(int& argc, char** argv); #endif launchy-2.5/src/icon_extractor.cpp0000644000175000017500000000542311336365712016400 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell, Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "icon_extractor.h" #include "globals.h" #include "main.h" IconExtractor::IconExtractor() { } void IconExtractor::processIcon(CatItem item, bool highPriority) { mutex.lock(); item.id = -1; if (highPriority) items.push_front(item); else items.push_back(item); mutex.unlock(); #ifdef Q_WS_MAC run(); #else if (!isRunning()) start(LowestPriority); #endif } void IconExtractor::processIcons(const QList& newItems, bool reset) { mutex.lock(); int itemCount = items.size(); if (reset && itemCount > 0 && isRunning()) { // keep the most recent high priority item in the queue CatItem item = items.dequeue(); items.clear(); if (item.id == -1) items.append(item); itemCount = items.size(); } items += newItems; for (int i = itemCount; i < items.size(); ++i) items[i].id = i - itemCount; mutex.unlock(); #ifdef Q_WS_MAC run(); #else if (!isRunning()) start(IdlePriority); #endif } void IconExtractor::stop() { mutex.lock(); items.clear(); mutex.unlock(); } void IconExtractor::run() { #ifdef Q_WS_WIN CoInitialize(NULL); #endif CatItem item; bool itemsRemaining = true; do { mutex.lock(); itemsRemaining = items.size() > 0; if (itemsRemaining) item = items.dequeue(); mutex.unlock(); if (itemsRemaining) emit iconExtracted(item.id, getIcon(item)); } while (itemsRemaining); #ifdef Q_WS_WIN CoUninitialize(); #endif } QIcon IconExtractor::getIcon(const CatItem& item) { #ifdef Q_WS_MAC if (item.icon.endsWith(".png") || item.icon.endsWith(".ico")) return QIcon(item.icon); #endif if (item.icon.isNull()) { #ifdef Q_WS_X11 QFileInfo info(item.fullPath); if (info.isDir()) return platform->icon(QFileIconProvider::Folder); #endif if (item.fullPath.length() == 0) return QIcon(); return platform->icon(QDir::toNativeSeparators(item.fullPath)); } else { #ifdef Q_WS_X11 if (QFile::exists(item.icon)) { return QIcon(item.icon); } #endif return platform->icon(QDir::toNativeSeparators(item.icon)); } } launchy-2.5/src/SettingsManager.cpp0000644000175000017500000000775511350265624016457 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2010 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "SettingsManager.h" #include "main.h" #include "globals.h" SettingsManager settings; const char* iniName = "/launchy.ini"; const char* dbName = "/launchy.db"; const char* historyName = "/history.db"; SettingsManager::SettingsManager() { portable = false; } void SettingsManager::load() { if (gSettings != NULL) { delete gSettings; gSettings = NULL; } // Load settings dirs = platform->getDirectories(); portable = QFile::exists(dirs["portableConfig"][0] + iniName); gSettings = new QSettings(configDirectory(portable) + iniName, QSettings::IniFormat); qDebug("Loading settings in %s mode from %s", portable ? "portable" : "installed", qPrintable(configDirectory(portable))); } bool SettingsManager::isPortable() const { return portable; } QList SettingsManager::directory(QString name) const { return dirs[name]; } QString SettingsManager::catalogFilename() const { return configDirectory(portable) + dbName; } QString SettingsManager::historyFilename() const { return configDirectory(portable) + historyName; } // Find the skin with the specified name ensuring that it contains at least a stylesheet QString SettingsManager::skinPath(const QString& skinName) const { QString directory; foreach(QString dir, dirs["skins"]) { dir += QString("/") + skinName + "/"; if (QFile::exists(dir + "style.qss")) { directory = dir; break; } } return directory; } // Switch between portable and installed mode void SettingsManager::setPortable(bool makePortable) { if (makePortable != portable) { qDebug("Converting to %s mode", makePortable ? "portable" : "installed"); // Destroy the QSettings object first so it writes any changes to disk if (gSettings != NULL) { delete gSettings; gSettings = NULL; } QString oldDir = configDirectory(portable); QString oldIniName = oldDir + iniName; QString oldDbName = oldDir + dbName; QString oldHistoryName = oldDir + historyName; // Copy the settings to the new location // and delete the original settings if they are copied successfully QString newDir = configDirectory(makePortable); if (QFile::copy(oldIniName, newDir + iniName) && QFile::copy(oldDbName, newDir + dbName) && QFile::copy(oldHistoryName, newDir + historyName)) { QFile::remove(oldIniName); QFile::remove(oldDbName); QFile::remove(oldHistoryName); } else { qWarning("Could not convert to %s mode", makePortable ? "portable" : "installed"); if (makePortable) { QMessageBox::warning(gMainWidget, tr("Launchy"), tr("Could not convert to portable mode. Please check you have write access to the %1 directory.").arg(newDir)); } } load(); } } // Delete all settings files in both installed and portable directories void SettingsManager::removeAll() { QFile::remove(configDirectory(false) + iniName); QFile::remove(configDirectory(false) + dbName); QFile::remove(configDirectory(false) + historyName); QFile::remove(configDirectory(true) + iniName); QFile::remove(configDirectory(true) + dbName); QFile::remove(configDirectory(true) + historyName); } // Get the configuration directory QString SettingsManager::configDirectory(bool portable) const { return dirs[portable ? "portableConfig" : "config"][0]; } launchy-2.5/src/main.cpp0000644000175000017500000012463011350266110014267 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #ifdef Q_WS_MAC #include #endif #include "icon_delegate.h" #include "main.h" #include "globals.h" #include "options.h" #include "plugin_interface.h" #include "FileSearch.h" #ifdef Q_WS_WIN void SetForegroundWindowEx(HWND hWnd) { // Attach foreground window thread to our thread const DWORD foreGroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL); const DWORD currentID = GetCurrentThreadId(); AttachThreadInput(foreGroundID, currentID, TRUE); // Do our stuff here HWND lastActivePopupWnd = GetLastActivePopup(hWnd); SetForegroundWindow(lastActivePopupWnd); // Detach the attached thread AttachThreadInput(foreGroundID, currentID, FALSE); } #endif LaunchyWidget::LaunchyWidget(CommandFlags command) : #ifdef Q_WS_WIN QWidget(NULL, Qt::FramelessWindowHint | Qt::Tool), #endif #ifdef Q_WS_X11 QWidget(NULL, Qt::FramelessWindowHint | Qt::Tool), #endif #ifdef Q_WS_MAC QWidget(NULL, Qt::FramelessWindowHint), #endif frameGraphic(NULL), trayIcon(NULL), alternatives(NULL), updateTimer(NULL), dropTimer(NULL), condensedTempIcon(NULL) { setObjectName("launchy"); setWindowTitle(tr("Launchy")); #ifdef Q_WS_WIN setWindowIcon(QIcon(":/resources/launchy128.png")); #endif #ifdef Q_WS_MAC setWindowIcon(QIcon("../Resources/launchy_icon_mac.icns")); //setAttribute(Qt::WA_MacAlwaysShowToolWindow); #endif setAttribute(Qt::WA_AlwaysShowToolTips); setAttribute(Qt::WA_InputMethodEnabled); if (platform->supportsAlphaBorder()) { setAttribute(Qt::WA_TranslucentBackground); } setFocusPolicy(Qt::ClickFocus); createActions(); gMainWidget = this; menuOpen = false; optionsOpen = false; dragging = false; gSearchText = ""; alwaysShowLaunchy = false; connect(&iconExtractor, SIGNAL(iconExtracted(int, QIcon)), this, SLOT(iconExtracted(int, QIcon))); fader = new Fader(this); connect(fader, SIGNAL(fadeLevel(double)), this, SLOT(setFadeLevel(double))); optionsButton = new QPushButton(this); optionsButton->setObjectName("opsButton"); optionsButton->setToolTip(tr("Launchy Options")); optionsButton->setGeometry(QRect()); connect(optionsButton, SIGNAL(clicked()), this, SLOT(showOptionsDialog())); closeButton = new QPushButton(this); closeButton->setObjectName("closeButton"); closeButton->setToolTip(tr("Close Launchy")); closeButton->setGeometry(QRect()); connect(closeButton, SIGNAL(clicked()), qApp, SLOT(quit())); output = new QLabel(this); output->setObjectName("output"); output->setAlignment(Qt::AlignHCenter); input = new CharLineEdit(this); #ifdef Q_WS_MAC QMacStyle::setFocusRectPolicy(input, QMacStyle::FocusDisabled); #endif input->setObjectName("input"); connect(input, SIGNAL(keyPressed(QKeyEvent*)), this, SLOT(inputKeyPressEvent(QKeyEvent*))); connect(input, SIGNAL(focusIn(QFocusEvent*)), this, SLOT(focusInEvent(QFocusEvent*))); connect(input, SIGNAL(focusOut(QFocusEvent*)), this, SLOT(focusOutEvent(QFocusEvent*))); connect(input, SIGNAL(inputMethod(QInputMethodEvent*)), this, SLOT(inputMethodEvent(QInputMethodEvent*))); outputIcon = new QLabel(this); outputIcon->setObjectName("outputIcon"); workingAnimation = new AnimationLabel(this); workingAnimation->setObjectName("workingAnimation"); workingAnimation->setGeometry(QRect()); // Load settings settings.load(); // If this is the first time running or a new version, call updateVersion if (gSettings->value("version", 0).toInt() != LAUNCHY_VERSION) { updateVersion(gSettings->value("version", 0).toInt()); command |= ShowLaunchy; } alternatives = new CharListWidget(this); alternatives->setObjectName("alternatives"); alternatives->setWindowFlags(Qt::Window | Qt::Tool | Qt::FramelessWindowHint); alternatives->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); alternatives->setTextElideMode(Qt::ElideLeft); alternatives->setUniformItemSizes(true); listDelegate = new IconDelegate(this); defaultListDelegate = alternatives->itemDelegate(); setSuggestionListMode(gSettings->value("GenOps/condensedView", 0).toInt()); altScroll = alternatives->verticalScrollBar(); altScroll->setObjectName("altScroll"); connect(alternatives, SIGNAL(currentRowChanged(int)), this, SLOT(alternativesRowChanged(int))); connect(alternatives, SIGNAL(keyPressed(QKeyEvent*)), this, SLOT(alternativesKeyPressEvent(QKeyEvent*))); connect(alternatives, SIGNAL(focusOut(QFocusEvent*)), this, SLOT(focusOutEvent(QFocusEvent*))); alternativesPath = new QLabel(alternatives); alternativesPath->setObjectName("alternativesPath"); alternativesPath->hide(); listDelegate->setAlternativesPathWidget(alternativesPath); // Load the plugins plugins.loadPlugins(); // Set the general options if (setAlwaysShow(gSettings->value("GenOps/alwaysshow", false).toBool())) command |= ShowLaunchy; setAlwaysTop(gSettings->value("GenOps/alwaystop", false).toBool()); // Check for udpates? if (gSettings->value("GenOps/updatecheck", true).toBool()) { checkForUpdate(); } // Set the hotkey QKeySequence hotkey = getHotkey(); if (!setHotkey(hotkey)) { QMessageBox::warning(this, tr("Launchy"), tr("The hotkey %1 is already in use, please select another.").arg(hotkey.toString())); command = ShowLaunchy | ShowOptions; } // Set the timers updateTimer = new QTimer(this); dropTimer = new QTimer(this); dropTimer->setSingleShot(true); connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateTimeout())); connect(dropTimer, SIGNAL(timeout()), this, SLOT(dropTimeout())); int time = gSettings->value("GenOps/updatetimer", 10).toInt(); if (time > 0) updateTimer->start(time * 60000); // Load the catalog catalog.reset(CatalogBuilder::createCatalog()); catalog->load(settings.catalogFilename()); // Load the history history.load(settings.historyFilename()); // Load the skin applySkin(gSettings->value("GenOps/skin", "Default").toString()); // Move to saved position loadPosition(gSettings->value("Display/pos", QPoint(0,0)).toPoint()); loadOptions(); executeStartupCommand(command); } LaunchyWidget::~LaunchyWidget() { delete updateTimer; delete dropTimer; delete alternatives; } void LaunchyWidget::executeStartupCommand(int command) { if (command & ResetPosition) { QRect r = geometry(); int primary = qApp->desktop()->primaryScreen(); QRect scr = qApp->desktop()->availableGeometry(primary); QPoint pt(scr.width()/2 - r.width()/2, scr.height()/2 - r.height()/2); move(pt); } if (command & ResetSkin) { setOpaqueness(100); showTrayIcon(); applySkin("Default"); } if (command & ShowLaunchy) showLaunchy(); if (command & ShowOptions) showOptionsDialog(); if (command & Rescan) buildCatalog(); if (command & Exit) close(); } void LaunchyWidget::paintEvent(QPaintEvent* event) { // Do the default draw first to render any background specified in the stylesheet QStyleOption styleOption; styleOption.init(this); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); style()->drawPrimitive(QStyle::PE_Widget, &styleOption, &painter, this); // Now draw the standard frame.png graphic if there is one if (frameGraphic) { painter.drawPixmap(0,0, *frameGraphic); } QWidget::paintEvent(event); } void LaunchyWidget::setSuggestionListMode(int mode) { if (mode) { // The condensed mode needs an icon placeholder or it repositions text when the icon becomes available if (!condensedTempIcon) { QPixmap pixmap(16, 16); pixmap.fill(Qt::transparent); condensedTempIcon = new QIcon(pixmap); } alternatives->setItemDelegate(defaultListDelegate); } else { delete condensedTempIcon; condensedTempIcon = NULL; alternatives->setItemDelegate(listDelegate); } } bool LaunchyWidget::setHotkey(QKeySequence hotkey) { return platform->setHotkey(hotkey, this, SLOT(onHotkey())); } void LaunchyWidget::showTrayIcon() { if (!QSystemTrayIcon::isSystemTrayAvailable()) return; if (gSettings->value("GenOps/showtrayicon", true).toBool()) { if (!trayIcon) trayIcon = new QSystemTrayIcon(this); QKeySequence hotkey = platform->getHotkey(); trayIcon->setToolTip(tr("Launchy (press %1 to activate)").arg(hotkey.toString())); trayIcon->setIcon(QIcon(":/resources/launchy16.png")); trayIcon->show(); connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); QMenu* trayMenu = new QMenu(this); trayMenu->addAction(actShow); trayMenu->addAction(actRebuild); trayMenu->addAction(actOptions); trayMenu->addSeparator(); trayMenu->addAction(actExit); trayIcon->setContextMenu(trayMenu); } else if (trayIcon) { delete trayIcon; trayIcon = NULL; } } void LaunchyWidget::showAlternatives(bool show, bool resetSelection) { dropTimer->stop(); // If main launchy window is not visible, do nothing if (!isVisible()) return; if (show) { if (searchResults.size() < 1) return; int mode = gSettings->value("GenOps/condensedView", 0).toInt(); int i = 0; for (; i < searchResults.size(); ++i) { qDebug() << "Alternative" << i << ":" << searchResults[i].fullPath; QString fullPath = QDir::toNativeSeparators(searchResults[i].fullPath); QListWidgetItem* item; if (i < alternatives->count()) { item = alternatives->item(i); } else { item = new QListWidgetItem(fullPath, alternatives); } if (item->data(mode == 1 ? ROLE_SHORT : ROLE_FULL) != fullPath) { // condensedTempIcon is a blank icon or null item->setData(ROLE_ICON, *condensedTempIcon); } item->setData(mode == 1 ? ROLE_FULL : ROLE_SHORT, searchResults[i].shortName); item->setData(mode == 1 ? ROLE_SHORT : ROLE_FULL, fullPath); if (i >= alternatives->count()) alternatives->addItem(item); } while (alternatives->count() > i) { delete alternatives->takeItem(i); } if (resetSelection) { alternatives->setCurrentRow(0); } iconExtractor.processIcons(searchResults); int numViewable = gSettings->value("GenOps/numviewable", "4").toInt(); int min = alternatives->count() < numViewable ? alternatives->count() : numViewable; // The stylesheet doesn't load immediately, so we cache the rect here if (alternativesRect.isNull()) alternativesRect = alternatives->geometry(); QRect rect = alternativesRect; rect.setHeight(min * alternatives->sizeHintForRow(0)); rect.translate(pos()); // Is there room for the dropdown box? if (rect.y() + rect.height() > qApp->desktop()->height()) { // Only move it if there's more space above // In both cases, ensure it doesn't spill off the screen if (pos().y() + input->pos().y() > qApp->desktop()->height() / 2) { rect.moveTop(pos().y() + input->pos().y() - rect.height()); if (rect.top() < 0) rect.setTop(0); } else { rect.setBottom(qApp->desktop()->height()); } } alternatives->setGeometry(rect); alternatives->show(); alternatives->setFocus(); qApp->syncX(); } else { // clear the selection before hiding to prevent flicker alternatives->setCurrentRow(-1); alternatives->repaint(); alternatives->hide(); iconExtractor.stop(); } } void LaunchyWidget::launchItem(CatItem& item) { int ops = MSG_CONTROL_LAUNCHITEM; if (item.id != HASH_LAUNCHY && item.id != HASH_LAUNCHYFILE) { ops = plugins.execute(&inputData, &item); if (ops > 1) { switch (ops) { case MSG_CONTROL_EXIT: close(); break; case MSG_CONTROL_OPTIONS: showOptionsDialog(); break; case MSG_CONTROL_REBUILD: buildCatalog(); break; case MSG_CONTROL_RELOADSKIN: reloadSkin(); break; default: break; } } } if (ops == MSG_CONTROL_LAUNCHITEM) { QString args = ""; if (inputData.count() > 1) for(int i = 1; i < inputData.count(); ++i) args += inputData[i].getText() + " "; /* UPDATE #ifdef Q_WS_X11 if (!platform->Execute(item.fullPath, args)) runProgram(item.fullPath, args); #else */ runProgram(item.fullPath, args); //#endif } catalog->incrementUsage(item); history.addItem(inputData); } void LaunchyWidget::focusInEvent(QFocusEvent* event) { if (event->gotFocus() && fader->isFading()) fader->fadeIn(false); QWidget::focusInEvent(event); } void LaunchyWidget::focusOutEvent(QFocusEvent* event) { if (event->reason() == Qt::ActiveWindowFocusReason) { if (gSettings->value("GenOps/hideiflostfocus", false).toBool() && !isActiveWindow() && !alternatives->isActiveWindow() && !optionsOpen) { hideLaunchy(); } } } void LaunchyWidget::alternativesRowChanged(int index) { // Check that index is a valid history item index // If the current entry is a history item or there is no text entered if (index >= 0 && index < searchResults.count()) { CatItem item = searchResults[index]; if ((inputData.count() > 0 && inputData.first().hasLabel(LABEL_HISTORY)) || input->text().length() == 0) { // Used a void* to hold an int.. ick! // BUT! Doing so avoids breaking existing catalogs long long hi = reinterpret_cast(item.data); int historyIndex = static_cast(hi); if (item.id == HASH_HISTORY && historyIndex < searchResults.count()) { inputData = history.getItem(historyIndex); gSearchText = inputData.last().getText(); input->selectAll(); input->insert(inputData.toString()); input->selectAll(); output->setText(Catalog::decorateText(item.shortName, gSearchText, true)); iconExtractor.processIcon(item); } } else if (inputData.count() > 0 && (inputData.last().hasLabel(LABEL_AUTOSUGGEST) || inputData.last().hasText() == 0)) { qDebug() << "Autosuggest" << item.shortName; gSearchText = item.shortName; inputData.last().setText(item.shortName); inputData.last().setLabel(LABEL_AUTOSUGGEST); QString root = inputData.toString(true); input->selectAll(); input->insert(root + gSearchText); input->setSelection(root.length(), gSearchText.length()); output->setText(Catalog::decorateText(gSearchText, gSearchText, true)); iconExtractor.processIcon(item); } } } void LaunchyWidget::inputKeyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Tab) { keyPressEvent(event); } else { event->ignore(); } if (input->text().length() == 0) showAlternatives(false); } void LaunchyWidget::alternativesKeyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Escape) { showAlternatives(false); event->ignore(); this->input->setFocus(); } else if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter || event->key() == Qt::Key_Tab) { if (searchResults.count() > 0) { int row = alternatives->currentRow(); if (row > -1) { QString location = "History/" + input->text(); QStringList hist; hist << searchResults[row].lowName << searchResults[row].fullPath; gSettings->setValue(location, hist); if (row > 0) searchResults.move(row, 0); if (event->key() == Qt::Key_Tab) { doTab(); processKey(); } else { // Load up the inputData properly before running the command /* commented out until I find a fix for it breaking the history selection inputData.last().setTopResult(searchResults[0]); doTab(); inputData.parse(input->text()); inputData.erase(inputData.end() - 1);*/ updateOutputWidgets(); keyPressEvent(event); } } } } else if (event->key() == Qt::Key_Delete && (event->modifiers() & Qt::ShiftModifier) != 0) { int row = alternatives->currentRow(); if (row > -1) { if (searchResults[row].id == HASH_HISTORY) { // Delete selected history entry from the alternatives list history.removeAt(row); input->clear(); processKey(); alternativesRowChanged(alternatives->currentRow()); } else { // Demote the selected item down the alternatives list catalog->demoteItem(searchResults[row]); searchOnInput(); updateOutputWidgets(false); } showAlternatives(true, false); } } else if (event->key() == Qt::Key_Left || event->key() == Qt::Key_Right || event->text().length() > 0) { // Send text entry to the input control activateWindow(); input->setFocus(); event->ignore(); input->keyPressEvent(event); keyPressEvent(event); } alternatives->setFocus(); } void LaunchyWidget::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Escape) { if (alternatives->isVisible()) showAlternatives(false); else hideLaunchy(); } else if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) { doEnter(); } else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_PageDown || event->key() == Qt::Key_Up || event->key() == Qt::Key_PageUp) { if (alternatives->isVisible()) { if (!alternatives->isActiveWindow()) { // Don't refactor the activateWindow outside the if, it won't work properly any other way! if (alternatives->currentRow() < 0 && alternatives->count() > 0) { alternatives->activateWindow(); alternatives->setCurrentRow(0); } else { alternatives->activateWindow(); qApp->sendEvent(alternatives, event); } } } else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_PageDown) { // do a search and show the results, selecting the first one searchOnInput(); if (searchResults.count() > 0) { showAlternatives(); alternatives->activateWindow(); if (alternatives->count() > 0) alternatives->setCurrentRow(0); } } } else if ((event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backspace) && event->modifiers() == Qt::ShiftModifier) { doBackTab(); processKey(); } else if (event->key() == Qt::Key_Tab) { doTab(); processKey(); } /* else if (event->key() == Qt::Key_Slash || event->key() == Qt::Key_Backslash) { if (inputData.count() > 0 && inputData.last().hasLabel(LABEL_FILE)) doTab(); processKey(); } */ else if (event->text().length() > 0) { // process any other key with character output event->ignore(); processKey(); } } // remove input text back to the previous input section void LaunchyWidget::doBackTab() { QString text = input->text(); int index = text.lastIndexOf(input->separatorText()); if (index >= 0) { text.truncate(index); input->selectAll(); input->insert(text); } else { input->clear(); } } void LaunchyWidget::doTab() { if (inputData.count() > 0 && searchResults.count() > 0) { // If it's an incomplete file or directory, complete it QFileInfo info(searchResults[0].fullPath); if ((inputData.last().hasLabel(LABEL_FILE) || info.isDir()) )// && input->text().compare(QDir::toNativeSeparators(searchResults[0].fullPath), Qt::CaseInsensitive) != 0) { // If multiple paths exist, select the longest intersection (like the bash shell) if (!alternatives->isActiveWindow()) { QStringList paths; int minLength = -1; foreach(const CatItem& item, searchResults) { if (item.id == HASH_LAUNCHYFILE) { QString p = item.fullPath; paths += p; if (minLength == -1 || p.length() < minLength) minLength = p.length(); qDebug() << p; } } qDebug() << ""; if (paths.size() > 1) { // Find the longest prefix common to all of the paths QChar curChar; QString longestPrefix = ""; for(int i = 0; i < minLength; i++) { curChar = paths[0][i]; bool stop = false; foreach(QString path, paths) { #ifdef Q_WS_WIN if (path[i].toLower() != curChar.toLower()) { #else if (path[i] != curChar) { #endif stop = true; break; } } if (stop) break; longestPrefix += curChar; } input->selectAll(); input->insert(inputData.toString(true) + longestPrefix); return; } } QString path; if (info.isSymLink()) path = info.symLinkTarget(); else path = searchResults[0].fullPath; if (info.isDir() && !path.endsWith(QDir::separator())) path += QDir::separator(); input->selectAll(); input->insert(inputData.toString(true) + QDir::toNativeSeparators(path)); } else { inputData.last().setTopResult(searchResults[0]); inputData.last().setText(searchResults[0].shortName); input->selectAll(); input->insert(inputData.toString() + input->separatorText()); QRect rect = input->rect(); repaint(rect); } } } void LaunchyWidget::doEnter() { showAlternatives(false); if ((inputData.count() > 0 && searchResults.count() > 0) || inputData.count() > 1) { CatItem& item = inputData[0].getTopResult(); qDebug() << "Launching" << item.shortName << ":" << item.fullPath; launchItem(item); } else { qDebug("Nothing to launch"); } hideLaunchy(); } void LaunchyWidget::inputMethodEvent(QInputMethodEvent* event) { event = event; // Warning removal processKey(); } void LaunchyWidget::processKey() { inputData.parse(input->text()); searchOnInput(); updateOutputWidgets(); } void LaunchyWidget::searchOnInput() { if (catalog == NULL) return; QString searchText = inputData.count() > 0 ? inputData.last().getText() : ""; gSearchText = searchText; searchResults.clear(); // Add history items on their own and don't sort them so they remain in most recently used order if ((inputData.count() > 0 && inputData.first().hasLabel(LABEL_HISTORY)) || input->text().length() == 0) { qDebug() << "Searching history for" << searchText; history.search(searchText, searchResults); } else { if (inputData.count() == 1) { qDebug() << "Searching catalog for" << searchText; catalog->searchCatalogs(gSearchText, searchResults); } if (searchResults.count() != 0) inputData.last().setTopResult(searchResults[0]); plugins.getLabels(&inputData); plugins.getResults(&inputData, &searchResults); qSort(searchResults.begin(), searchResults.end(), CatLessNoPtr); // Is it a file? if (searchText.contains(QDir::separator()) || searchText.startsWith("~") || (searchText.size() == 2 && searchText[0].isLetter() && searchText[1] == ':')) FileSearch::search(searchText, searchResults, inputData); catalog->promoteRecentlyUsedItems(gSearchText, searchResults); } } // If there are current results, update the output text and icon void LaunchyWidget::updateOutputWidgets(bool resetAlternativesSelection) { if (searchResults.count() > 0 && (inputData.count() > 1 || gSearchText.length() > 0)) { qDebug() << "Setting output text to" << searchResults[0].shortName; output->setText(Catalog::decorateText(searchResults[0].shortName, gSearchText, true)); iconExtractor.processIcon(searchResults[0]); //outputIcon->setPixmap(platform->icon(searchResults[0].fullPath).pixmap((outputIcon->size()))); if (searchResults[0].id != HASH_HISTORY) { // Did the plugin take control of the input? if (inputData.last().getID() != 0) searchResults[0].id = inputData.last().getID(); inputData.last().setTopResult(searchResults[0]); } // If the alternatives are already showing, update them if (alternatives->isVisible()) showAlternatives(true, resetAlternativesSelection); // Don't schedule a drop down if there's no input text else if (input->text().length() > 0) startDropTimer(); } else { output->clear(); outputIcon->clear(); showAlternatives(false); } } void LaunchyWidget::startDropTimer() { int delay = gSettings->value("GenOps/autoSuggestDelay", 1000).toInt(); if (delay > 0) dropTimer->start(delay); else showAlternatives(false); } void LaunchyWidget::iconExtracted(int itemIndex, QIcon icon) { if (itemIndex == -1) { // An index of -1 means update the output icon outputIcon->setPixmap(icon.pixmap(outputIcon->size())); } else if (itemIndex < alternatives->count()) { // >=0 is an item in the list QListWidgetItem* listItem = alternatives->item(itemIndex); listItem->setIcon(icon); listItem->setData(ROLE_ICON, icon); QRect rect = alternatives->visualItemRect(listItem); repaint(rect); } } void LaunchyWidget::catalogProgressUpdated(float /*val*/) { } void LaunchyWidget::catalogBuilt() { catalog = gBuilder->getCatalog(); gBuilder->wait(); gBuilder.reset(); workingAnimation->Stop(); // Do a search here of the current input text processKey(); catalog->save(settings.catalogFilename()); } void LaunchyWidget::checkForUpdate() { http = new QHttp(this); verBuffer = new QBuffer(this); counterBuffer = new QBuffer(this); verBuffer->open(QIODevice::ReadWrite); counterBuffer->open(QIODevice::ReadWrite); connect(http, SIGNAL(done( bool)), this, SLOT(httpGetFinished(bool))); http->setHost("www.launchy.net"); http->get("http://www.launchy.net/version2.html", verBuffer); } void LaunchyWidget::httpGetFinished(bool error) { if (!error) { QString str(verBuffer->data()); int ver = str.toInt(); if (ver > LAUNCHY_VERSION) { QMessageBox box; box.setIcon(QMessageBox::Information); box.setTextFormat(Qt::RichText); box.setWindowTitle(tr("A new version of Launchy is available")); box.setText(tr("A new version of Launchy is available.\n\nYou can download it at \ http://www.launchy.net")); box.exec(); } if (http != NULL) delete http; http = NULL; } verBuffer->close(); counterBuffer->close(); delete verBuffer; delete counterBuffer; } void LaunchyWidget::setSkin(const QString& name) { hideLaunchy(true); applySkin(name); showLaunchy(false); } void LaunchyWidget::updateVersion(int oldVersion) { if (oldVersion < 199) { settings.removeAll(); settings.load(); } if (oldVersion < 249) { gSettings->setValue("GenOps/skin", "Default"); } if (oldVersion < LAUNCHY_VERSION) { gSettings->setValue("donateTime", QDateTime::currentDateTime().addDays(21)); gSettings->setValue("version", LAUNCHY_VERSION); } } void LaunchyWidget::loadPosition(QPoint pt) { // Get the dimensions of the screen containing the new center point QRect rect = geometry(); QPoint newCenter = pt + QPoint(rect.width()/2, rect.height()/2); QRect screen = qApp->desktop()->availableGeometry(newCenter); // See if the new position is within the screen dimensions, if not pull it inside if (newCenter.x() < screen.left()) pt.setX(screen.left()); else if (newCenter.x() > screen.right()) pt.setX(screen.right()-rect.width()); if (newCenter.y() < screen.top()) pt.setY(screen.top()); else if (newCenter.y() > screen.bottom()) pt.setY(screen.bottom()-rect.height()); int centerOption = gSettings->value("GenOps/alwayscenter", 3).toInt(); if (centerOption & 1) pt.setX(screen.center().x() - rect.width()/2); if (centerOption & 2) pt.setY(screen.center().y() - rect.height()/2); move(pt); } void LaunchyWidget::updateTimeout() { // Save the settings periodically savePosition(); gSettings->sync(); buildCatalog(); int time = gSettings->value("GenOps/updatetimer", 10).toInt(); updateTimer->stop(); if (time != 0) updateTimer->start(time * 60000); } void LaunchyWidget::dropTimeout() { if (searchResults.count() > 0) showAlternatives(); } void LaunchyWidget::onHotkey() { if (menuOpen || optionsOpen) { showLaunchy(true); return; } if (!alwaysShowLaunchy && isVisible() && !fader->isFading() && QApplication::activeWindow() !=0) { hideLaunchy(); } else { showLaunchy(); } } void LaunchyWidget::closeEvent(QCloseEvent* event) { fader->stop(); savePosition(); gSettings->sync(); catalog->save(settings.catalogFilename()); history.save(settings.historyFilename()); event->accept(); qApp->quit(); } bool LaunchyWidget::setAlwaysShow(bool alwaysShow) { alwaysShowLaunchy = alwaysShow; return !isVisible() && alwaysShow; } bool LaunchyWidget::setAlwaysTop(bool alwaysTop) { if (alwaysTop && (windowFlags() & Qt::WindowStaysOnTopHint) == 0) { setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); alternatives->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); return true; } else if (!alwaysTop && (windowFlags() & Qt::WindowStaysOnTopHint) != 0) { setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); alternatives->setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); return true; } return false; } void LaunchyWidget::setOpaqueness(int level) { double value = level / 100.0; setWindowOpacity(value); alternatives->setWindowOpacity(value); } void LaunchyWidget::reloadSkin() { setSkin(currentSkin); } void LaunchyWidget::applySkin(const QString& name) { currentSkin = name; if (listDelegate == NULL) return; QString directory = settings.skinPath(name); // Use default skin if this one doesn't exist or isn't valid if (directory.length() == 0) { QString defaultSkin = settings.directory("defSkin")[0]; directory = settings.skinPath(defaultSkin); // If still no good then fail with an ugly default if (directory.length() == 0) return; gSettings->setValue("GenOps/skin", defaultSkin); } // Set a few defaults delete frameGraphic; frameGraphic = NULL; closeButton->setGeometry(QRect()); optionsButton->setGeometry(QRect()); input->setAlignment(Qt::AlignLeft); output->setAlignment(Qt::AlignCenter); alternativesRect = QRect(); if (!QFile::exists(directory + "misc.txt")) { // Loading use file:/// syntax allows relative paths in the stylesheet to be rooted // in the same directory as the stylesheet qApp->setStyleSheet("file:///" + directory + "style.qss"); } else { // Set positions, this will signify an older launchy skin // Read the style sheet QFile file(directory + "style.qss"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QString styleSheet = QLatin1String(file.readAll()); file.close(); // This is causing the ::destroyed connect errors qApp->setStyleSheet(styleSheet); file.setFileName(directory + "misc.txt"); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); if (line.startsWith(";")) continue; QStringList spl = line.split("="); if (spl.size() == 2) { QStringList sizes = spl.at(1).trimmed().split(","); QRect rect; if (sizes.size() == 4) { rect.setRect(sizes[0].toInt(), sizes[1].toInt(), sizes[2].toInt(), sizes[3].toInt()); } if (spl.at(0).trimmed().compare("input", Qt::CaseInsensitive) == 0) input->setGeometry(rect); else if (spl.at(0).trimmed().compare("inputAlignment", Qt::CaseInsensitive) == 0) input->setAlignment( sizes[0].trimmed().compare("left", Qt::CaseInsensitive) == 0 ? Qt::AlignLeft : sizes[0].trimmed().compare("right", Qt::CaseInsensitive) == 0 ? Qt::AlignRight : Qt::AlignHCenter ); else if (spl.at(0).trimmed().compare("output", Qt::CaseInsensitive) == 0) output->setGeometry(rect); else if (spl.at(0).trimmed().compare("outputAlignment", Qt::CaseInsensitive) == 0) output->setAlignment( sizes[0].trimmed().compare("left", Qt::CaseInsensitive) == 0 ? Qt::AlignLeft : sizes[0].trimmed().compare("right", Qt::CaseInsensitive) == 0 ? Qt::AlignRight : Qt::AlignHCenter ); else if (spl.at(0).trimmed().compare("alternatives", Qt::CaseInsensitive) == 0) alternativesRect = rect; else if (spl.at(0).trimmed().compare("boundary", Qt::CaseInsensitive) == 0) resize(rect.size()); else if (spl.at(0).trimmed().compare("icon", Qt::CaseInsensitive) == 0) outputIcon->setGeometry(rect); else if (spl.at(0).trimmed().compare("optionsbutton", Qt::CaseInsensitive) == 0) { optionsButton->setGeometry(rect); optionsButton->show(); } else if (spl.at(0).trimmed().compare("closebutton", Qt::CaseInsensitive) == 0) { closeButton->setGeometry(rect); closeButton->show(); } else if (spl.at(0).trimmed().compare("dropPathColor", Qt::CaseInsensitive) == 0) { listDelegate->setColor(spl.at(1)); } else if (spl.at(0).trimmed().compare("dropPathSelColor", Qt::CaseInsensitive) == 0) listDelegate->setColor(spl.at(1),true); else if (spl.at(0).trimmed().compare("dropPathFamily", Qt::CaseInsensitive) == 0) listDelegate->setFamily(spl.at(1)); else if (spl.at(0).trimmed().compare("dropPathSize", Qt::CaseInsensitive) == 0) listDelegate->setSize(spl.at(1).toInt()); else if (spl.at(0).trimmed().compare("dropPathWeight", Qt::CaseInsensitive) == 0) listDelegate->setWeight(spl.at(1).toInt()); else if (spl.at(0).trimmed().compare("dropPathItalics", Qt::CaseInsensitive) == 0) listDelegate->setItalics(spl.at(1).toInt()); } } file.close(); } } bool validFrame = false; QPixmap frame; if (platform->supportsAlphaBorder()) { if (frame.load(directory + "frame.png")) { validFrame = true; } else if (frame.load(directory + "background.png")) { QPixmap border; if (border.load(directory + "mask.png")) { frame.setMask(border); } if (border.load(directory + "alpha.png")) { QPainter surface(&frame); surface.drawPixmap(0,0, border); } validFrame = true; } } if (!validFrame) { // Set the background image if (frame.load(directory + "background_nc.png")) { validFrame = true; // Set the background mask QPixmap mask; if (mask.load(directory + "mask_nc.png")) { // For some reason, w/ compiz setmask won't work // for rectangular areas. This is due to compiz and // XShapeCombineMask setMask(mask); } } } if (QFile::exists(directory + "spinner.mng")) { workingAnimation->LoadAnimation(directory + "spinner.mng"); } if (validFrame) { frameGraphic = new QPixmap(frame); if (frameGraphic) { resize(frameGraphic->size()); } } int maxIconSize = outputIcon->width(); maxIconSize = qMax(maxIconSize, outputIcon->height()); platform->setPreferredIconSize(maxIconSize); } void LaunchyWidget::mousePressEvent(QMouseEvent *e) { if (e->buttons() == Qt::LeftButton) { if (gSettings->value("GenOps/dragmode", 0).toInt() == 0 || (e->modifiers() & Qt::ShiftModifier)) { dragging = true; dragStartPoint = e->pos(); } } showAlternatives(false); activateWindow(); input->setFocus(); } void LaunchyWidget::mouseMoveEvent(QMouseEvent *e) { if (e->buttons() == Qt::LeftButton && dragging) { QPoint p = e->globalPos() - dragStartPoint; move(p); showAlternatives(false); input->setFocus(); } } void LaunchyWidget::mouseReleaseEvent(QMouseEvent* event) { event = event; // Warning removal dragging = false; showAlternatives(false); input->setFocus(); } void LaunchyWidget::contextMenuEvent(QContextMenuEvent* event) { QMenu menu(this); menu.addAction(actRebuild); menu.addAction(actReloadSkin); menu.addAction(actOptions); menu.addSeparator(); menu.addAction(actExit); menuOpen = true; menu.exec(event->globalPos()); menuOpen = false; } void LaunchyWidget::trayIconActivated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: showLaunchy(); break; case QSystemTrayIcon::Unknown: case QSystemTrayIcon::Context: case QSystemTrayIcon::DoubleClick: case QSystemTrayIcon::MiddleClick: break; } } void LaunchyWidget::buildCatalog() { // Perform the database update if (gBuilder == NULL) { gBuilder.reset(new CatalogBuilder(&plugins, catalog)); connect(gBuilder.get(), SIGNAL(catalogFinished()), this, SLOT(catalogBuilt())); connect(gBuilder.get(), SIGNAL(catalogIncrement(float)), this, SLOT(catalogProgressUpdated(float))); workingAnimation->Start(); gBuilder->start(QThread::IdlePriority); //gBuilder->run(); } } void LaunchyWidget::showOptionsDialog() { if (!optionsOpen) { dropTimer->stop(); showAlternatives(false); optionsOpen = true; OptionsDialog options(this); options.setObjectName("options"); #ifdef Q_WS_WIN // need to use this method in Windows to ensure that keyboard focus is set when // being activated via a message from another instance of Launchy SetForegroundWindowEx(options.winId()); #endif options.exec(); input->activateWindow(); input->setFocus(); optionsOpen = false; } } void LaunchyWidget::shouldDonate() { QDateTime time = QDateTime::currentDateTime(); QDateTime donateTime = gSettings->value("donateTime",time.addDays(21)).toDateTime(); if (donateTime.isNull()) return; gSettings->setValue("donateTime", donateTime); if (donateTime <= time) { #ifdef Q_WS_WIN runProgram("http://www.launchy.net/donate.html", ""); #endif QDateTime def; gSettings->setValue("donateTime", def); } } void LaunchyWidget::setFadeLevel(double level) { level = qMin(level, 1.0); level = qMax(level, 0.0); setWindowOpacity(level); alternatives->setWindowOpacity(level); if (level <= 0.001) { hide(); } else { if (!isVisible()) show(); } // Make sure we grab focus once we've faded in if (level >= 1.0) { activateWindow(); raise(); } } void LaunchyWidget::showLaunchy(bool noFade) { shouldDonate(); showAlternatives(false); #ifdef Q_WS_WIN // There's a problem with alpha layered windows under Vista after resuming // from sleep. The alpha image may need to be reapplied. #endif loadPosition(pos()); fader->fadeIn(noFade || alwaysShowLaunchy); //qApp->syncX(); #ifdef Q_WS_WIN // need to use this method in Windows to ensure that keyboard focus is set when // being activated via a hook or message from another instance of Launchy SetForegroundWindowEx(winId()); #endif input->raise(); input->activateWindow(); input->selectAll(); input->setFocus(); qApp->syncX(); // Let the plugins know plugins.showLaunchy(); } void LaunchyWidget::showLaunchy() { showLaunchy(false); } void LaunchyWidget::hideLaunchy(bool noFade) { if (!isVisible()) return; savePosition(); showAlternatives(false); if (alwaysShowLaunchy) return; if (isVisible()) { fader->fadeOut(noFade); } // let the plugins know plugins.hideLaunchy(); } void LaunchyWidget::loadOptions() { // If a network proxy server is specified, apply an application wide NetworkProxy setting QString proxyHost = gSettings->value("WebProxy/hostAddress", "").toString(); if (proxyHost.length() > 0) { QNetworkProxy proxy; proxy.setType((QNetworkProxy::ProxyType)gSettings->value("WebProxy/type", 0).toInt()); proxy.setHostName(gSettings->value("WebProxy/hostAddress", "").toString()); proxy.setPort((quint16)gSettings->value("WebProxy/port", "").toInt()); QNetworkProxy::setApplicationProxy(proxy); } showTrayIcon(); } int LaunchyWidget::getHotkey() const { int hotkey = gSettings->value("GenOps/hotkey", -1).toInt(); if (hotkey == -1) { #ifdef Q_WS_WIN int meta = Qt::AltModifier; #endif #ifdef Q_WS_X11 int meta = Qt::ControlModifier; #endif #ifdef Q_WS_MAC int meta = Qt::MetaModifier; #endif hotkey = gSettings->value("GenOps/hotkeyModifier", meta).toInt() | gSettings->value("GenOps/hotkeyAction", Qt::Key_Space).toInt(); } return hotkey; } void LaunchyWidget::createActions() { actShow = new QAction(tr("Show Launchy"), this); connect(actShow, SIGNAL(triggered()), this, SLOT(showLaunchy())); actRebuild = new QAction(tr("Rebuild catalog"), this); actRebuild->setShortcut(QKeySequence(Qt::Key_F5)); connect(actRebuild, SIGNAL(triggered()), this, SLOT(buildCatalog())); addAction(actRebuild); actReloadSkin = new QAction(tr("Reload skin"), this); actReloadSkin->setShortcut(QKeySequence(Qt::Key_F5 | Qt::SHIFT)); connect(actReloadSkin, SIGNAL(triggered()), this, SLOT(reloadSkin())); addAction(actReloadSkin); actOptions = new QAction(tr("Options"), this); actOptions->setShortcut(QKeySequence(Qt::Key_Comma | Qt::CTRL)); connect(actOptions, SIGNAL(triggered()), this, SLOT(showOptionsDialog())); addAction(actOptions); actExit = new QAction(tr("Exit"), this); connect(actExit, SIGNAL(triggered()), this, SLOT(close())); } void fileLogMsgHandler(QtMsgType type, const char *msg) { static FILE* file; if (file == 0) { // Create a file for appending in the user's temp directory QString filename = QDir::toNativeSeparators(QDesktopServices::storageLocation(QDesktopServices::TempLocation) + "/launchylog.txt"); file = fopen(filename.toUtf8(), "a"); } if (file) { switch (type) { case QtDebugMsg: fprintf(file, "Debug: %s\n", msg); break; case QtWarningMsg: fprintf(file, "Warning: %s\n", msg); break; case QtCriticalMsg: fprintf(file, "Critical: %s\n", msg); break; case QtFatalMsg: fprintf(file, "Fatal: %s\n", msg); abort(); break; } fflush(file); } } int main(int argc, char *argv[]) { createApplication(argc, argv); qApp->setQuitOnLastWindowClosed(false); QStringList args = qApp->arguments(); CommandFlags command = None; bool allowMultipleInstances = false; for (int i = 0; i < args.size(); ++i) { QString arg = args[i]; if (arg.startsWith("-") || arg.startsWith("/")) { arg = arg.mid(1); if (arg.compare("rescue", Qt::CaseInsensitive) == 0) { command = ResetSkin | ResetPosition | ShowLaunchy; } else if (arg.compare("show", Qt::CaseInsensitive) == 0) { command |= ShowLaunchy; } else if (arg.compare("options", Qt::CaseInsensitive) == 0) { command |= ShowOptions; } else if (arg.compare("multiple", Qt::CaseInsensitive) == 0) { allowMultipleInstances = true; } else if (arg.compare("rescan", Qt::CaseInsensitive) == 0) { command |= Rescan; } else if (arg.compare("exit", Qt::CaseInsensitive) == 0) { command |= Exit; } else if (arg.compare("log", Qt::CaseInsensitive) == 0) { qInstallMsgHandler(fileLogMsgHandler); } } } if (!allowMultipleInstances && platform->isAlreadyRunning()) { platform->sendInstanceCommand(command); exit(1); } QCoreApplication::setApplicationName("Launchy"); QCoreApplication::setOrganizationDomain("Launchy"); QString locale = QLocale::system().name(); QTranslator translator; translator.load(QString("tr/launchy_" + locale)); qApp->installTranslator(&translator); qApp->setStyleSheet("file:///:/resources/basicskin.qss"); #ifdef Q_WS_WIN LaunchyWidget* widget = createLaunchyWidget(command); #else LaunchyWidget* widget = new LaunchyWidget(command); #endif qApp->exec(); if (gBuilder != NULL) { gBuilder->wait(); } delete widget; widget = NULL; delete platform; platform = NULL; } launchy-2.5/src/options.h0000644000175000017500000000441411260000425014473 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef OPTIONS_H #define OPTIONS_H #include "ui_options.h" #include "FileBrowserDelegate.h" #include "Directory.h" class OptionsDialog : public QDialog, private Ui::OptionsDlg { Q_OBJECT public: OptionsDialog(QWidget* parent = 0); ~OptionsDialog(); virtual void setVisible(bool visible); public slots: void accept(); void reject(); void autoUpdateCheckChanged(int state); void tabChanged(int tab); void skinChanged(const QString& newSkin); void dirRowChanged(int row); void catDirItemChanged(QListWidgetItem* item); void catDirDragEnter(QDragEnterEvent *event); void catDirDrop(QDropEvent *event); void catDirPlusClicked(bool c); void catDirMinusClicked(bool c); void catTypesItemChanged(QListWidgetItem* item); void catTypesPlusClicked(bool c); void catTypesMinusClicked(bool c); void catTypesDirChanged(int); void catTypesExeChanged(int); void catDepthChanged(int); void catProgressUpdated(float); void catalogBuilt(); void catRescanClicked(bool); void pluginChanged(int row); void pluginItemChanged(QListWidgetItem* state); private: void addDirectory(const QString& directory); void saveCatalogOptions(); private: FileBrowserDelegate directoryItemDelegate; int curPlugin; bool needRescan; QStringList metaKeys; QStringList actionKeys; QList iMetaKeys; QList iActionKeys; QList memDirs; QList > pluginNames; QVBoxLayout* pluginLayout; QString lastDir; static QByteArray windowGeometry; static int currentTab; static int currentPlugin; }; #endif launchy-2.5/src/platform_util.h0000644000175000017500000000164111254554632015701 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* #ifndef PLATFORM_UTIL_Z #define PLATFORM_UTIL_Z #include #include "platform_base.h" PlatformBase * loadPlatform(); #endif */ launchy-2.5/src/Fader.cpp0000644000175000017500000000463711260000425014363 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "Fader.h" #include "globals.h" Fader::Fader(QObject* parent) : QThread(parent), keepRunning(true) { } Fader::~Fader() { } void Fader::fadeIn(bool quick) { int time = gSettings->value("GenOps/fadein", 0).toInt(); mutex.lock(); targetLevel = gSettings->value("GenOps/opaqueness", 100).toInt() / 100.0; delta = 0.05; delay = quick ? 0 : (int)(time * delta / targetLevel); if (delay > 10) { delta /= 10; delay /= 10; } mutex.unlock(); if (quick) { // stop any current slow fades stop(); wait(); emit fadeLevel(targetLevel); } else if (!isRunning()) { level = 0; start(); } } void Fader::fadeOut(bool quick) { int time = gSettings->value("GenOps/fadeout", 0).toInt(); double opaqueness = gSettings->value("GenOps/opaqueness", 100).toInt() / 100.0; mutex.lock(); targetLevel = 0; delta = -0.05; delay = quick ? 0 : (int)(time * -delta / opaqueness); if (delay > 10) { delta /= 10; delay /= 10; } mutex.unlock(); // qDebug() << level << " to " << targetLevel << " delay " << delay; if (quick) { // stop any current slow fades stop(); wait(); emit fadeLevel(targetLevel); } else if (!isRunning()) { level = opaqueness; start(); } } void Fader::run() { keepRunning = true; while (keepRunning) { mutex.lock(); level += delta; keepRunning &= (delta > 0 && level < targetLevel) || (delta < 0 && level > targetLevel); mutex.unlock(); // qDebug() << delta << level << targetLevel << keepRunning; if (keepRunning) { emit fadeLevel(level); msleep(delay); } } // qDebug() << delta << targetLevel << targetLevel; // qDebug() << ""; emit fadeLevel(targetLevel); } launchy-2.5/src/platform_base_hottrigger.h0000644000175000017500000000325211121321532020054 0ustar monesmones/* * globalshortcuttrigger.h - Helper class activating global shortcut * Copyright (C) 2006 Maciej Niedzielski * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef GLOBALSHORTCUTTRIGGER_H #define GLOBALSHORTCUTTRIGGER_H #include "platform_base_hotkey.h" #include #include using namespace boost; class GlobalShortcutManager::KeyTrigger : public QObject { Q_OBJECT public: /** * Is there any slot connected to this hotkey? */ bool isUsed() const { return QObject::receivers(SIGNAL(activated())) > 0; } signals: void activated(); private: /** * Registers the \a key. */ KeyTrigger(const QKeySequence& key); /** * Unregisters the key. */ ~KeyTrigger(); friend class GlobalShortcutManager; bool isConnected(); /** * Platform-specific helper */ class Impl; shared_ptr d; }; #endif launchy-2.5/src/icon_delegate.cpp0000644000175000017500000000472111260000425016116 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "icon_delegate.h" #include "globals.h" extern QLabel* alternativesPath; IconDelegate::IconDelegate(QObject *parent) : QStyledItemDelegate(parent) { } void IconDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { painter->save(); if (option.state & QStyle::State_Selected) { painter->fillRect(option.rect, option.palette.highlight()); painter->setPen(option.palette.color(QPalette::HighlightedText)); } QRect iconRect = option.rect; iconRect.setWidth(32); iconRect.setHeight(32); int fontHeight = painter->fontMetrics().height(); QRect shortRect = option.rect; shortRect.setLeft(shortRect.left() + 38); shortRect.setBottom(shortRect.top() + fontHeight); QRect longRect = option.rect; longRect.setLeft(longRect.left() + 50); longRect.setTop(longRect.top() + fontHeight); QString text = Catalog::decorateText(index.data(ROLE_SHORT).toString(), gSearchText); painter->drawText(shortRect, Qt::AlignTop | Qt::TextShowMnemonic, text); if (option.state & QStyle::State_Selected) painter->setPen(alternativesPath->palette().color(QPalette::HighlightedText)); else painter->setPen(alternativesPath->palette().color(QPalette::WindowText)); painter->setFont(alternativesPath->font()); QString full = index.data(ROLE_FULL).toString(); full = painter->fontMetrics().elidedText(full, option.textElideMode, longRect.width()); painter->drawText(longRect, Qt::AlignTop, full); QIcon p = index.data(ROLE_ICON).value(); p.paint(painter, iconRect); painter->restore(); } QSize IconDelegate::sizeHint(const QStyleOptionViewItem & /* option */, const QModelIndex & /* index */) const { return QSize(10, 32); } launchy-2.5/src/catalog.cpp0000644000175000017500000000545311346217770014773 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2009 Josh Karlin, Simon Capewell This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "precompiled.h" #include "catalog.h" #include "globals.h" bool CatLessNoPtr(CatItem & a, CatItem & b) { bool less = CatLess(&a, &b); /* if (less) qDebug() << a.lowName << "(" << a.usage << ") < " << b.lowName << " (" << b.usage << ")"; else qDebug() << b.lowName << "(" << b.usage << ") < " << a.lowName << " (" << a.usage << ")"; */ return less; } bool CatLess(CatItem* a, CatItem* b) { // Items with negative usage are lowest priority if (a->usage < 0 && b->usage >= 0) return false; if (b->usage < 0 && a->usage >= 0) return true; bool localEqual = a->lowName == gSearchText; bool otherEqual = b->lowName == gSearchText; // Exact match between search text and item name has higest priority if (localEqual && !otherEqual) return true; if (!localEqual && otherEqual) return false; int localFind = a->lowName.indexOf(gSearchText); int otherFind = b->lowName.indexOf(gSearchText); if (gSearchText.count() == 1) { // Match at the start if (localFind == 0 && otherFind != 0) return true; else if (localFind != 0 && otherFind == 0) return false; // Higher usage if (a->usage > b->usage) return true; if (a->usage < b->usage) return false; } // Contiguous text anywhere in the item name if (localFind != -1 && otherFind == -1) return true; else if (localFind == -1 && otherFind != -1) return false; if (localFind != -1 && otherFind != -1) { // Both have word matches // Higher usage if (a->usage > b->usage) return true; if (a->usage < b->usage) return false; // Contiguous text nearer the start of the item name if (localFind < otherFind) return true; else if (otherFind < localFind) return false; } else { // Higher usage if (a->usage > b->usage) return true; if (a->usage < b->usage) return false; } int localLen = a->lowName.count(); int otherLen = b->lowName.count(); // Favour shorter item names if (localLen < otherLen) return true; if (localLen > otherLen) return false; // Absolute tiebreaker to prevent loops return a->fullPath < b->fullPath; } launchy-2.5/src/icon_extractor.h0000644000175000017500000000235111255771563016047 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2009 Simon Capewell, Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ICON_EXTRACTOR #define ICON_EXTRACTOR #include "precompiled.h" #include "platform_base.h" class IconExtractor : public QThread { Q_OBJECT public: IconExtractor(); void processIcon(CatItem item, bool highPriority = true); void processIcons(const QList& newItems, bool reset = true); void stop(); void run(); signals: void iconExtracted(int itemIndex, QIcon icon); private: QIcon getIcon(const CatItem& item); QMutex mutex; QQueue items; }; #endif launchy-2.5/readme.lyx0000644000175000017500000004427610673321045014060 0ustar monesmones#LyX 1.5.1 created this file. For more info see http://www.lyx.org/ \lyxformat 276 \begin_document \begin_header \textclass article \language english \inputencoding auto \font_roman default \font_sans default \font_typewriter default \font_default_family sfdefault \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \paperfontsize 11 \spacing single \papersize default \use_geometry true \use_amsmath 1 \use_esint 1 \cite_engine basic \use_bibtopic false \paperorientation portrait \topmargin 4cm \bottommargin 3cm \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \author "" \author "" \end_header \begin_body \begin_layout Title Launchy 2.0 Documentation \end_layout \begin_layout Author Josh Karlin \end_layout \begin_layout Subsection* Please Read This First! \end_layout \begin_layout Standard When Launchy runs it disappears to the background. You have to press ‘alt+space’ in order to see Launchy. If Launchy is new for you please read the rest of this short manual. \end_layout \begin_layout Section Welcome \end_layout \begin_layout Standard Launchy was initially created for personal use but thanks to the encouragement of my friends I decided to distribute it. Launchy is completely free and open software so you should never pay for it and you should feel free to pass it on to your friends. The official homepage for Launchy is http://www.launchy.net/. If you need help using Launchy or would like to leave any comments/suggestions please feel free to post on the forums at http://www.sf.net/projects/launchy/. \end_layout \begin_layout Standard -- Josh Karlin \end_layout \begin_layout Section Basic Usage \end_layout \begin_layout Standard Launchy's primary function is to bring hard to reach objects on your computer quickly within your grasp. It does so by scanning your computer for interesting files (e.g. programs on your computer and bookmarks) and then makes them searchable with queries. For instance, if you would like to run \begin_inset Quotes eld \end_inset notepad \begin_inset Quotes erd \end_inset , you might invoke Launchy and type \begin_inset Quotes eld \end_inset note \begin_inset Quotes erd \end_inset and then hit enter to launch it. To invoke Launchy, press and hold down the alt key and then press the space key. \end_layout \begin_layout Standard By default, Launchy is able to perform a number of useful tasks: \end_layout \begin_layout Itemize \emph on Web searches \emph default - Try typing \begin_inset Quotes eld \end_inset google \begin_inset Quotes erd \end_inset , then hitting tab, and then entering your search \end_layout \begin_layout Itemize \emph on Bookmarks \emph default - Try typing the name of one of your bookmarks \end_layout \begin_layout Itemize \emph on Calculator \emph default - Try typing \begin_inset Quotes eld \end_inset 4 + 3 \begin_inset Quotes erd \end_inset \end_layout \begin_layout Itemize \emph on File Browsing \emph default - Try typing \begin_inset Quotes eld \end_inset c: \backslash windo \begin_inset Quotes erd \end_inset hitting tab, and then typing \begin_inset Quotes eld \end_inset system \begin_inset Quotes erd \end_inset and hitting tab. This will autocomplete to c: \backslash windows \backslash system \backslash \end_layout \begin_layout Itemize \emph on Control Panel \emph default - Try typing \begin_inset Quotes eld \end_inset sound \begin_inset Quotes erd \end_inset \end_layout \begin_layout Subsection Exiting Launchy \end_layout \begin_layout Standard Simply right click on Launchy and press the \begin_inset Quotes eld \end_inset exit \begin_inset Quotes erd \end_inset button. \end_layout \begin_layout Section Advanced Usage \end_layout \begin_layout Standard All of Launchy's options can be reached by right clicking the mouse on Launchy and pressing the \begin_inset Quotes eld \end_inset Options \begin_inset Quotes erd \end_inset button. Many of Launchy's options are self-explanatory (changing skins and the hotkey) while some others are not. In this section I discuss the advanced options. \end_layout \begin_layout Subsection Scanning additional directories \end_layout \begin_layout Standard The directories and file types that Launchy scans are configurable. The following discussion refers to the \begin_inset Quotes eld \end_inset Catalog \begin_inset Quotes erd \end_inset tab of the options menu. \end_layout \begin_layout Standard Let's begin by adding your music files. Press the big \begin_inset Quotes eld \end_inset + \begin_inset Quotes erd \end_inset button and direct Launchy to your music folder. After pressing okay, enter \begin_inset Quotes eld \end_inset *.mp3 \begin_inset Quotes erd \end_inset into the file types entry box and press the smaller \begin_inset Quotes eld \end_inset + \begin_inset Quotes erd \end_inset button directly below. You might also want to add \begin_inset Quotes eld \end_inset *.aac \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset *.wma \begin_inset Quotes erd \end_inset , and \begin_inset Quotes eld \end_inset *.ogg \begin_inset Quotes erd \end_inset as well. Now, Launchy will scan all of your music. You can tell Launch to rebuild its index right now by pressing the \begin_inset Quotes eld \end_inset Rescan Catalog \begin_inset Quotes erd \end_inset button. \end_layout \begin_layout Subsection Using Launchy on a USB stick \end_layout \begin_layout Standard Please follow this procedure to run Launchy from a USB stick. It will configure Launchy to store its configuration files in the application directory. \end_layout \begin_layout Enumerate Install Launchy normally \end_layout \begin_layout Enumerate Exit Launchy \end_layout \begin_layout Enumerate Copy the Launchy directory to your usb stick \end_layout \begin_layout Enumerate Run Launchy from the usb stick \end_layout \begin_layout Enumerate Select \begin_inset Quotes eld \end_inset portable mode \begin_inset Quotes erd \end_inset in the general options tab \end_layout \begin_layout Enumerate Exit Launchy \end_layout \begin_layout Section Contributors \end_layout \begin_layout Standard Launchy would not be where it is today without community support. I would like to add special thanks to the following people: \end_layout \begin_layout Subsection* Graphic Designers \end_layout \begin_layout Itemize Tyler Sticka - For Launchy's beautiful new icon and skin \end_layout \begin_layout Itemize Sean (=gakuseisean) - For the use of his icons in the plugins \end_layout \begin_layout Itemize Peter Wooley - For the web page's current design \end_layout \begin_layout Itemize Juan Ignacio Serra - The first artist to offer assistance. He created some of Launchy's first skins, including work on the Mercury skin. \end_layout \begin_layout Subsection* Testers \end_layout \begin_layout Itemize Amadawn - The first to contribute significant testing work. I'm sorry that you ever had to see such unusable versions of Launchy! \end_layout \begin_layout Section Change log \end_layout \begin_layout Subsection* 1.98 (2.0 Alpha) \end_layout \begin_layout Itemize Launchy has been completely rewritten, it is now all in QT (was in MFC) \end_layout \begin_layout Itemize Options glued together into one cohesive dialog \end_layout \begin_layout Itemize Skin selection now shows previews of skins \end_layout \begin_layout Itemize No longer have to restart Launchy to use a new plugin or skin \end_layout \begin_layout Itemize Plugin options are integrated into the options dialog \end_layout \begin_layout Itemize Launchy can automatically hide when it loses focus \end_layout \begin_layout Itemize Launchy can now shallow scan a directory (customizable depth) \end_layout \begin_layout Itemize Much better plugin customization \end_layout \begin_layout Standard Bug fixes \end_layout \begin_layout Itemize Unfortunately there are too many to list! \end_layout \begin_layout Subsection* 1.2.5 \end_layout \begin_layout Itemize New control panel plugin (indexes control panel apps) \end_layout \begin_layout Itemize Runny plugin (customizable commands) \end_layout \begin_layout Itemize Notification of new Launchy Releases (can be turned off) \end_layout \begin_layout Itemize Command line argument support (hit tab and type the arguments) \end_layout \begin_layout Itemize Can use ‘.*’ as a filetype for directories \end_layout \begin_layout Itemize Plugins can be enabled/disabled (right click on launchy, go to plugins) \end_layout \begin_layout Itemize Plugins can now have configurable options \end_layout \begin_layout Itemize Always on top is now configurable \end_layout \begin_layout Standard Bug Fixes: \end_layout \begin_layout Itemize Removed startup crash bug \end_layout \begin_layout Itemize Fixed Weby bug (it was hard to select Google) \end_layout \begin_layout Itemize Fixed mouse disappearance in dropdown menu \end_layout \begin_layout Itemize Launchy no longer jumps when you change skins \end_layout \begin_layout Itemize Launchy no longer flashes on startup \end_layout \begin_layout Itemize Calcy took priority over files with numbers, fixed \end_layout \begin_layout Itemize Launchy can now be placed in the corner of the screen \end_layout \begin_layout Subsection* 1.0.0 \end_layout \begin_layout Itemize Launchy now supports plugins! Check out the “Plugins” folder inside your Launchy directory, you can add and remove plugins from there when Launchy is not running. Following are the plugins that come with Launchy by default, I expect many others to be developed by myself and the community. \end_layout \begin_layout Itemize Explory Plugin: A file explorer for Launchy! Now you can use launchy to navigate your filesystem. Try typing “c:” then hitting tab, keep on typing and hitting tab! \end_layout \begin_layout Itemize Weby Plugin: Supports launching of url’s and adds quick launches for “Google” “MSN” “Amazon” and many others, try typing “google” then hit tab then type in a search query \end_layout \begin_layout Itemize Foxy Plugin: With foxy your Firefox bookmarks will be added to the Launchy index. Even better, your firefox keywords are added to Launchy and behave like quick launches do for Weby. Not sure what firefox keywords are? Go here: http://www.mozilla.org/products/fire fox/smart-keywords.html (Note some firefox quick searches are currently incompati ble and will not be indexed) \end_layout \begin_layout Itemize Calcy Plugin: Never have a calculator handy? With Calcy, Launchy knows when you’re trying to do math and will display the result in the suggestions box. For instance, try typing in “(4 + 3) * 12” and 84 will result in the suggestion s box. Support for + - * / ()’s currently exists. \end_layout \begin_layout Itemize Now Ctrl+Backspace deletes a word at a time and Alt+Backspace clears the text \end_layout \begin_layout Itemize Too many bug fixes to count or remember, good riddance! \end_layout \begin_layout Itemize Special thanks to Sean Poon http://gakuseisean.deviantart.com for the use of his wonderful icons for the plugins \end_layout \begin_layout Subsection* 1.0.0 Beta \end_layout \begin_layout Itemize Launchy displays the full path and icon to files in the dropdown suggestions box. \end_layout \begin_layout Itemize Filetypes can now be specifically set for each directory to index \end_layout \begin_layout Itemize Always on top mode added \end_layout \begin_layout Itemize USB Mode added \end_layout \begin_layout Itemize Configurable index scan interval \end_layout \begin_layout Itemize Configuration files moved to docs and settings \backslash username \backslash Applications \backslash Launchy \backslash which is friendlier to users with limited access accounts. \end_layout \begin_layout Standard Bug Fixes: \end_layout \begin_layout Itemize The Launchy startup on auto-login crash should be gone \end_layout \begin_layout Itemize No longer presumes icon index is located in C: \backslash \end_layout \begin_layout Itemize Hotkey window now initializes with current hotkey \end_layout \begin_layout Itemize Configuration files now less likely to be corrupted due to restart during saving \end_layout \begin_layout Subsection* 0.9.6 \end_layout \begin_layout Itemize Launchy can now index directory names as well as files! \end_layout \begin_layout Itemize A utilities folder with useful shortcuts is now included, it adds standard control panel programs, system shutdown / logoff/ reboot, and special folders such as My Documents, and My Music. \end_layout \begin_layout Itemize Unicode now fully supported. All character sets should work. \end_layout \begin_layout Itemize The old style of matching by association is completely removed, it’s now entirely based upon frequency of use \end_layout \begin_layout Itemize Now has a “please donate” dialog that appears only once, sorry but I’ve got to make a living! \end_layout \begin_layout Standard Bug Fixes: \end_layout \begin_layout Itemize Fixed up/down keys causing a dropdown when there are no matches \end_layout \begin_layout Itemize Saves settings to ini directly after changes are made in case of system crash \end_layout \begin_layout Itemize Spaces are now ignored in user input, making it possible to search for “Johnny_c ash.mp3” with “john cash” \end_layout \begin_layout Subsection* 0.9.3 \end_layout \begin_layout Itemize Once again, Launchy is prettier. The combobox has vanished. \end_layout \begin_layout Itemize New skins! Please see the Author.txt file in each skin’s directory to give credit where credit is due. \end_layout \begin_layout Standard Bug Fixes: \end_layout \begin_layout Itemize Sometimes windows shutdown prevented the database from being saved. Now it saves more frequently just in case. \end_layout \begin_layout Itemize Arbitrarily long file extensions are now allowed, so you can filter on .mpeg for instance and not just .mpg \end_layout \begin_layout Itemize A couple of minor graphical glitches have been fixed \end_layout \begin_layout Itemize Development Environment: \end_layout \begin_layout Itemize The Boost library is no longer needed to compile Launchy, I’ve copied the necessary Boost header files for smart pointers into the project. \end_layout \begin_layout Subsection* 0.9.2 \end_layout \begin_layout Itemize Frequency sorting took priority over exact matches, fixed. \end_layout \begin_layout Subsection* 0.9.1 \end_layout \begin_layout Itemize Search results sorted by frequency of use now. \end_layout \begin_layout Itemize Configuration files moved to the Users subdirectory of your installation. This means that your configuration file will start fresh.. sorry! It also means that Launchy can be run from a memory stick. \end_layout \begin_layout Itemize You can now remove the start menu from the directories you scan if you so desire. \end_layout \begin_layout Itemize Bug fixes, hooray! \end_layout \begin_layout Subsection* 0.9 \end_layout \begin_layout Itemize Alpha channel support! Launchy is sexier now. \end_layout \begin_layout Itemize New skinning options. \end_layout \begin_layout Itemize Lots of skins! \end_layout \begin_layout Itemize Minor bug fixes. \end_layout \begin_layout Itemize Ability to rescan index on demand. \end_layout \begin_layout Itemize This is a feature complete version of Launchy 1.0 From now until then I will only post bug fixes. \end_layout \begin_layout Subsection* 0.81 \end_layout \begin_layout Itemize New installer, after this release upgrades should be much better. \end_layout \begin_layout Itemize Added icon support. Now icons are shown as well as the file name. The visual cue of the icon makes for faster launching. (It’s also prettier) \end_layout \begin_layout Itemize The combobox is now a bit more sane. It won’t steal your focus away when it drops down. \end_layout \begin_layout Itemize Launchy will rescan directories on startup as opposed to waiting a couple of minutes. \end_layout \begin_layout Subsection* 0.8 \end_layout \begin_layout Itemize Launchy now scans user specified directories and stores the results in a compressed file to make startup faster. \end_layout \begin_layout Itemize You can now change the hotkey that activates Launchy \end_layout \begin_layout Itemize You can now create/select skins for Launchy \end_layout \begin_layout Itemize Launchy searches *much* faster than before, enabling indexing of thousands of files \end_layout \begin_layout Subsection* 0.7 \end_layout \begin_layout Itemize Launchy has memory! It will associate your input with applications. \end_layout \begin_layout Subsection* 0.61 \end_layout \begin_layout Itemize Launchy no longer opens all programs maximized. \end_layout \begin_layout Subsection* 0.6 \end_layout \begin_layout Itemize This is the first C++ release. As I became frustrated with C#’s large .NET framework requirements and users lack of desire to install it, I decided to switch back to the faster language. This release is functionally and visually equivalent to the 0.5 C# release. The C# CVS version had some new features that I will soon add to the C++ branch. \end_layout \begin_layout Subsection* 0.5 \end_layout \begin_layout Itemize This was the first public release. \end_layout \end_body \end_document launchy-2.5/linux/0000755000175000017500000000000011355776633013226 5ustar monesmoneslaunchy-2.5/linux/debian/0000755000175000017500000000000011355776633014450 5ustar monesmoneslaunchy-2.5/linux/debian/control0000644000175000017500000000114411035544056016036 0ustar monesmonesSource: launchy Section: unknown Priority: extra Maintainer: Josh Karlin Build-Depends: debhelper (>= 5) Standards-Version: 3.7.2 Package: launchy Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, xdg-utils Description: Open Source Keystroke Launcher Launchy is a free, cross-platform utility, designed to help you forget about your start menu, the icons on your desktop, and even your file manager. Launchy indexes the programs in your start menu and can launch your documents, project files, folders, and bookmarks with just a few keystrokes!launchy-2.5/linux/debian/rules0000755000175000017500000000337011336047270015516 0ustar monesmones#!/usr/bin/make -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 configure: configure-stamp configure-stamp: dh_testdir # Add here commands to configure the package. touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir # Add here commands to compile the package. $(MAKE) #docbook-to-man debian/launchy.sgml > launchy.1 touch $@ clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp # Add here commands to clean up after the build process. $(MAKE) clean dh_clean install: build dh_testdir dh_testroot dh_prep dh_installdirs # Add here commands to install the package into debian/launchy. $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/launchy install # Build architecture-independent files here. binary-indep: install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: install dh_testdir dh_testroot dh_installchangelogs dh_installdocs dh_installexamples # dh_install # dh_installmenu # dh_installdebconf # dh_installlogrotate # dh_installemacsen # dh_installpam # dh_installmime # dh_python # dh_installinit # dh_installcron # dh_installinfo dh_installman dh_link dh_strip dh_compress dh_fixperms # dh_perl # dh_makeshlibs dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure launchy-2.5/linux/debian/copyright0000644000175000017500000000072611335630125016367 0ustar monesmonesThis package was downloaded from Upstream Author(s): Josh Karlin Copyright: Copyright (C) 2010 Josh Karlin License: GPL see: `/usr/share/common-licenses/GPL' The Debian packaging is (C) 2010, Josh Karlin and is licensed under the GPL, see `/usr/share/common-licenses/GPL'. # Please also look if there are files or directories which have a # different copyright/license attached and list them here. launchy-2.5/linux/debian/menu.ex0000644000175000017500000000017611034315201015724 0ustar monesmones?package(launchy):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\ title="launchy" command="/usr/bin/launchy" launchy-2.5/linux/launchy.desktop0000644000175000017500000000026111335654643016255 0ustar monesmones[Desktop Entry] Version=1.0 Name=Launchy Comment=Keystroke Launcher Exec=launchy %u Terminal=false X-MultipleArgs=false Type=Application Icon=launchy_icon Categories=Utility; launchy-2.5/linux/build_deb.sh0000755000175000017500000000132411335654643015470 0ustar monesmones#!/bin/bash dir=`pwd` if [ $# -ne 1 ] then echo "1 arg needed to build deb, ./build.sh " exit fi ver=$1 rm -rf launchy-$ver* rm launchy_$ver* svn export ../ launchy-$ver tar cfz launchy-$ver.tar.gz launchy-$ver/ cd launchy-$ver dh_make -e karlinjf@sourceforge.net -f ../launchy-$ver.tar.gz -c gpl --single cp ../debian/* debian/ qmake -r Launchy.pro INSTALL_ROOT=$DESTDIR dpkg-buildpackage -rfakeroot cd .. #mkdir repository #mkdir repository/binary #mkdir repository/source #cp *.deb repository/binary/ #cp *.orig.* *.diff.gz *.dsc repository/source/ #cd repository #dpkg-scanpackages binary /dev/null | gzip -9c > binary/Packages.gz #dpkg-scansources source /dev/null | gzip -9c > source/Sources.gzlaunchy-2.5/Plugin API/0000755000175000017500000000000011355776633013717 5ustar monesmoneslaunchy-2.5/Plugin API/CreateDocs.bat0000644000175000017500000000016111032265576016410 0ustar monesmones@echo off copy ..\src\plugin_interface.h . copy ..\src\catalog.h . "c:\bin\doxygen" default.doxygen rem pauselaunchy-2.5/Plugin API/myplugin/0000755000175000017500000000000011355776633015563 5ustar monesmoneslaunchy-2.5/Plugin API/myplugin/MyPlugin.sln0000644000175000017500000000156011032265576020036 0ustar monesmones Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MyPlugin", "MyPlugin.vcproj", "{08B29CAE-8850-4669-9B02-E3A14FF5A07B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {08B29CAE-8850-4669-9B02-E3A14FF5A07B}.Debug|Win32.ActiveCfg = Debug|Win32 {08B29CAE-8850-4669-9B02-E3A14FF5A07B}.Debug|Win32.Build.0 = Debug|Win32 {08B29CAE-8850-4669-9B02-E3A14FF5A07B}.Release|Win32.ActiveCfg = Release|Win32 {08B29CAE-8850-4669-9B02-E3A14FF5A07B}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal launchy-2.5/Plugin API/myplugin/gui.cpp0000644000175000017500000000271011344736322017040 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "gui.h" #include "myplugin.h" Gui::Gui(QWidget* parent) : QWidget(parent) { setupUi(this); QSettings* settings = *gmypluginInstance->settings; if (settings == NULL) return; chkOption1->setChecked(settings->value("myplugin/option1", true).toBool()); chkOption2->setChecked(settings->value("myplugin/option2", true).toBool()); } Gui::~Gui() { this->hide(); } void Gui::writeOptions() { QSettings* settings = *gmypluginInstance->settings; if (settings == NULL) return; settings->setValue("myplugin/option1", chkOption1->isChecked()); settings->setValue("myplugin/option2", chkOption2->isChecked()); } launchy-2.5/Plugin API/myplugin/gui.h0000644000175000017500000000172211344736322016507 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GUI_H #define GUI_H #include "ui_dlg.h" #include "globals.h" class Gui : public QWidget, private Ui::Dlg { Q_OBJECT public: Gui(QWidget* parent); ~Gui(); void writeOptions(); public slots: }; #endif launchy-2.5/Plugin API/myplugin/readme.txt0000644000175000017500000000204011032265576017544 0ustar monesmones======================================================================== MAKEFILE PROJECT : MyPlugin Project Overview ======================================================================== AppWizard has created this MyPlugin project for you. This file contains a summary of what you will find in each of the files that make up your MyPlugin project. MyPlugin.vcproj This is the main project file for VC++ projects generated using an Application Wizard. It contains information about the version of Visual C++ that generated the file, and information about the platforms, configurations, and project features selected with the Application Wizard. This project allows you to build/clean/rebuild from within Visual Studio by calling the commands you have input in the wizard. The build command can be nmake or any other tool you use. This project does not contain any files, so there are none displayed in Solution Explorer. ///////////////////////////////////////////////////////////////////////////// launchy-2.5/Plugin API/myplugin/myplugin.h0000644000175000017500000000301511344736322017564 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #pragma once #define PLUGIN_NAME "MyPlugin" #include "plugin_interface.h" class Gui; class mypluginPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: uint HASH_myplugin; public: mypluginPlugin(); ~mypluginPlugin(); int msg(int msgId, void* wParam = NULL, void* lParam = NULL); void getLabels(QList*); void getID(uint*); void getName(QString*); void getResults(QList* id, QList* results); void getCatalog(QList* items); void launchItem(QList*, CatItem*); void doDialog(QWidget* parent, QWidget**); void endDialog(bool accept); void init(); QString getIcon(); private: Gui* gui; }; extern mypluginPlugin* gmypluginInstance; launchy-2.5/Plugin API/myplugin/plugin_interface.h0000644000175000017500000003560311032265576021250 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PLUGIN_INTERFACE_H #define PLUGIN_INTERFACE_H #include #include #include "catalog.h" #ifdef Q_WS_WIN #define VC_EXTRALEAN #ifndef WINVER #define WINVER 0x05100 #define _WIN32_WINNT 0x0510 #define _WIN32_WINDOWS 0x0510 #define _WIN32_IE 0x0600 #endif #include #include #endif #ifndef UNICODE #define UNICODE #endif #define DESKTOP_WINDOWS 0 #define DESKTOP_GNOME 1 #define DESKTOP_KDE 2 /** \brief This message asks the Plugin for its ID Number. Launchy needs an unsigned int identification value for each loaded plugin. You supply your own here. Typically, this is the result of hashing a string, as shown in the example below. \param wParam (uint*) That stores the resulting ID number. \warning Because we're hashing strings to integers.. it is theoretically possible that two plugin names will collide to the same plugin id. \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_ID: *wParam = qHash(QString("Weby_Plugin")) handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_ID 0 /** \brief This message asks the plugin if it would like to apply a label to the current search query. It is sometimes useful to label user queries with plugin-defined tags. For instance, the weby plugin will tag input that contains "www" or ".com" or ".net" with the hash value of the string "HASH_WEBSITE". Then, other plugins that see the query can know that the current search is for a website.\n\n The InputData class stores the current user's query. It is in a List structure because each time "tab" is pressed by the user a new InputData is formed and appended to the list. In other words, if the user typed "google this is my query" then wParam would represent a list of 2 InputData classes, with the first representing "google", and the second, "this is my query". Each InputData can be tagged individually. \warning This is called each time the user changes a character in his or her query, so make sure it's fast. \param wParam QList* id \param lParam NULL \verbatim void WebyPlugin::getLabels(QList* id) { if (id->count() > 1) return; // Apply a "website" label if we think it's a website QString & text = id->last().getText(); if (text.contains("http://", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains("https://", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".com", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".net", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".org", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains("www.", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_LABELS 1 /** \brief Asks the plugin for any results to a query If your plugin returns catalog results on the fly to a query (e.g. a website query for weby or a calculator result), then this is the place to do so. The existing results are stored in the list of CatItem's (short for Catalog Items) passed in as lParam and you can append your own results to it. \param wParam (QList*): The user's query \param lParam (QList*): The list of existing results for the query, you can append your own \verbatim void WebyPlugin::getResults(QList* id, QList* results) { // Is this query a website? If so create a new result for the website if (id->last().hasLabel(HASH_WEBSITE)) { QString & text = id->last().getText(); // This is a website, create an entry for it results->push_front(CatItem(text + ".weby", text, HASH_WEBY, getIcon())); } // Is this query of form: website search_term? if (id->count() > 1 && id->first().getTopResult().id == HASH_WEBY) { QString & text = id->last().getText(); // This is user search text, create an entry for it results->push_front(CatItem(text + ".weby", text, HASH_WEBY, getIcon())); } } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_RESULTS 2 /** \brief Asks the plugin for a static catalog to be added to the primary catalog Some plugins will add permanent entries to Launchy's primary catalog (until the catalog is rebuilt). For instance, weby adds firefox bookmarks into the primary catalog. This is the function in which that is done. \param wParam (QList*): The catalog that you append your new entries to (these will be copied over to the primary catalog) \verbatim void WebyPlugin::getCatalog(QList* items) { // Add the default websites to the catalog "google/amazon/etc.." foreach(WebySite site, sites) { items->push_back(CatItem(site.name + ".weby", site.name, HASH_WEBY, getIcon())); } // If we're supposed to index firefox, then do that there if ((*settings)->value("weby/firefox", true).toBool()) { QString path = getFirefoxPath(); indexFirefox(path, items); } } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_CATALOG 3 /** \brief This message instructs the plugin that one of its own catalog items was selected by the user and should now be executed If the plugin adds items to the catalog via MSG_GET_RESULTS or MSG_GET_CATALOG and one of those items is selected by the user then it is up to the plugin to execute it when the user presses "enter". This is where you perform the action. \param wParam (QList*): The user's query \param lParam (CatItem*): The user selected catalog item \verbatim void WebyPlugin::launchItem(QList* id, CatItem* item) { QString file = ""; QString args = ""; if (id->count() == 2) { args = id->last().getText(); args = QUrl::toPercentEncoding(args); item = &id->first().getTopResult(); } // Is it a Firefox shortcut? if (item->fullPath.contains(".shortcut")) { file = item->fullPath.mid(0, item->fullPath.count()-9); file.replace("%s", args); } else { // It's a user-specific site bool found = false; foreach(WebySite site, sites) { if (item->shortName == site.name) { found = true; file = site.base; if (args != "") { QString tmp = site.query; tmp.replace("%s", args); file += tmp; } break; } } if (!found) { file = item->shortName; if (!file.contains("http://")) { file = "http://" + file; } } } QUrl url(file); runProgram(url.toEncoded(), ""); } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_LAUNCH_ITEM 4 /** \brief This message informs the plugin that it's being loaded. This is a good time to do any initialization work. \param wParam NULL \param lParam NULL \verbatim void calcyPlugin::init() { // Do some initialization here if necessary.. } int CalcyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; } return handled; } \endverbatim */ #define MSG_INIT 5 /** \brief This message asks the plugin if it has a dialog to display in the options menu. The result of the request is returned via the result of the msg function (handled). \param wParam NULL \param lParam NULL \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_HAS_DIALOG: handled = true; break; } return handled; } \endverbatim */ #define MSG_HAS_DIALOG 6 /** \brief This message tells the plugin that it's time to show its user interface \param wParam (QWidget*): The parent of the dialog to create \param lParam (QWidget**): Your plugin's new dialog is returned here for Launchy to keep tabs on it \verbatim void WebyPlugin::doDialog(QWidget* parent, QWidget** newDlg) { // gui is a private member variable of class WebyPlugin if (gui != NULL) return; // class Gui is weby's user interface class gui = new Gui(parent); *newDlg = gui; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; } return handled; } \endverbatim */ #define MSG_DO_DIALOG 7 /** \brief This message asks the plugin for its string name \param wParam (QString*) The destination for the name of your plugin \param lParam NULL \verbatim void WebyPlugin::getName(QString* str) { *str = "Weby"; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_NAME 8 /** \brief This message informs the plugin that it should close its dialog \param wParam (bool): Whether the plugin should accept changes made by the user while the dialog was open \param lParam NULL \verbatim void WebyPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } if (gui != NULL) delete gui; gui = NULL; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_END_DIALOG: endDialog((bool) wParam); break; } return handled; } \endverbatim */ #define MSG_END_DIALOG 9 /** \brief This message informs the plugin that Launchy is now visible on the screen. \param wParam NULL \param lParam NULL */ #define MSG_LAUNCHY_SHOW 10 /** \brief This message informs the plugin that Launchy is no longer visible on the screen. \param wParam NULL \param lParam NULL */ #define MSG_LAUNCHY_HIDE 11 #define MSG_CONTROL_OPTIONS 500 #define MSG_CONTROL_EXIT 501 #define MSG_CONTROL_REBUILD 502 /** \brief This is the class that a plugin must implement. The PluginInterface is the interface between Launchy and your plugin. Launchy communicates with your plugin through the msg function. To store any settings in Launchy's permanent configuration file, please refer to the settings member variable. */ class PluginInterface { public: virtual ~PluginInterface() {}; /** \brief This is how messages are passed to the plugin Here you handle the subset of messages that your plugin requires. At minimum, your plugin must handle MSG_GET_ID and MSG_GET_NAME. For unhandled messages, return 0. For handled messages, return 1. \param msgId The type of the message, such as show dialog, initialize, or get results \param wParam If this message type requires any parameters, this will be the first and casted to void* \param lParam If this message requires two parameters, this is the second, casted to void* \return 1 means the message was handled, 0 means it was ignored \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog((bool) wParam); break; default: break; } return handled; } \endverbatim */ virtual int msg(int msgId, void* wParam = NULL, void* lParam = NULL) = 0; /** The setting manager in which you store your persistent data. More data can be found in QT's documentation for QSettings Following is an example of using the settings variable: \verbatim QSettings* set = *settings; // Write a value to the config file set->setValue("weby/version", 1.0); // Read a value from the config value double value = set->value("weby/version", 0.0); \endverbatim */ QSettings** settings; }; /** \brief A convienience run function This function will run the program along with arguments and is platform independent. \param file The location of the file to run \param args The arguments to the command */ void runProgram(QString file, QString args); int getDesktop(); Q_DECLARE_INTERFACE(PluginInterface, "net.launchy.PluginInterface/1.0") #endif launchy-2.5/Plugin API/myplugin/MyPlugin.vcproj0000644000175000017500000000522411032265576020546 0ustar monesmones launchy-2.5/Plugin API/myplugin/plugin_interface.cpp0000644000175000017500000000313411032265576021575 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "plugin_interface.h" /*! \file \brief A Documented file. Details. */ void runProgram(QString path, QString args) { #ifdef Q_WS_WIN SHELLEXECUTEINFO ShExecInfo; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_FLAG_NO_UI; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = (LPCTSTR) (path).utf16(); if (args != "") { ShExecInfo.lpParameters = (LPCTSTR) args.utf16(); } else { ShExecInfo.lpParameters = NULL; } QDir dir(path); QFileInfo info(path); if (!info.isDir() && info.isFile()) dir.cdUp(); ShExecInfo.lpDirectory = (LPCTSTR)QDir::toNativeSeparators(dir.absolutePath()).utf16(); ShExecInfo.nShow = SW_NORMAL; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); #endif #ifdef Q_WS_MAC #endif #ifdef Q_WS_X11 #endif }launchy-2.5/Plugin API/myplugin/globals.h0000644000175000017500000000173311032265576017352 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GLOBALS_H #define GLOBALS_H #include struct mypluginSite { QString base; QString name; QString query; }; struct Bookmark { QString url; QString shortcut; QString name; }; #endiflaunchy-2.5/Plugin API/myplugin/dlg.ui0000644000175000017500000000215011344736322016653 0ustar monesmones Dlg 0 0 464 271 MyPlugin - Example Launchy Plugin Option 1 Option 2 Qt::Vertical 20 40 launchy-2.5/Plugin API/myplugin/catalog.h0000644000175000017500000001340411032265576017337 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef CATALOG_H #define CATALOG_H #include #include #include #include #include #include #include #include /** \brief CatItem (Catalog Item) stores a single item in the index */ class CatItem { public: /** The full path of the indexed item */ QString fullPath; /** The abbreviated name of the indexed item */ QString shortName; /** The lowercase name of the indexed item */ QString lowName; /** A path to an icon for the item */ QString icon; /** How many times this item has been called by the user */ int usage; /** This is unused, and meant for plugin writers and future extensions */ void* data; /** The plugin id of the creator of this CatItem */ int id; CatItem() {} CatItem(QString full, bool isDir = false) : fullPath(full) { int last = fullPath.lastIndexOf("/"); if (last == -1) { shortName = fullPath; } else { shortName = fullPath.mid(last+1); if (!isDir) shortName = shortName.mid(0,shortName.lastIndexOf(".")); } lowName = shortName.toLower(); data = NULL; usage = 0; id = 0; } CatItem(QString full, QString shortN) : fullPath(full), shortName(shortN) { lowName = shortName.toLower(); data = NULL; usage = 0; id = 0; } CatItem(QString full, QString shortN, uint i_d) : id(i_d), fullPath(full), shortName(shortN) { lowName = shortName.toLower(); data = NULL; usage = 0; } /** This is the constructor most used by plugins \param full The full path of the file to execute \param The abbreviated name for the entry \param i_d Your plugin id (0 for Launchy itself) \param iconPath The path to the icon for this entry \warning It is usually a good idea to append ".your_plugin_name" to the end of the full parameter so that there are not multiple items in the index with the same full path. */ CatItem(QString full, QString shortN, uint i_d, QString iconPath) : id(i_d), fullPath(full), shortName(shortN), icon(iconPath) { lowName = shortName.toLower(); data = NULL; usage = 0; } CatItem(const CatItem &s) { fullPath = s.fullPath; shortName = s.shortName; lowName = s.lowName; icon = s.icon; usage = s.usage; data = s.data; id = s.id; } CatItem& operator=( const CatItem &s ) { fullPath = s.fullPath; shortName = s.shortName; lowName = s.lowName; icon = s.icon; usage = s.usage; data = s.data; id = s.id; return *this; } bool operator==(const CatItem& other) const{ if (fullPath == other.fullPath) return true; return false; } }; /** InputData shows one segment (between tabs) of a user's query A user's query is typically represented by List and each element of the list represents a segment of the query. E.g. query = "google this is my search" will have 2 InputData segments in the list. One for "google" and one for "this is my search" */ class InputData { private: /** The user's entry */ QString text; /** Any assigned labels to this query segment */ QSet labels; /** A pointer to the best catalog match for this segment of the query */ CatItem topResult; /** The plugin id of this query's owner */ uint id; public: /** Get the labels applied to this query segment */ QSet getLabels() { return labels; } /** Apply a label to this query segment */ void setLabel(uint l) { labels.insert(l); } /** Check if it has the given label applied to it */ bool hasLabel(uint l) { return labels.contains(l); } /** Set the id of this query This can be used to override the owner of the selected catalog item, so that no matter what item is chosen from the catalog, the given plugin will be the one to execute it. \param i The plugin id of the plugin to execute the query's best match from the catalog */ void setID(uint i) { id = i; } /** Returns the current owner id of the query */ uint getID() { return id; } /** Get the text of the query segment */ QString getText() { return text; } /** Set the text of the query segment */ void setText(QString t) { text = t; } /** Get a pointer to the best catalog match for this segment of the query */ CatItem& getTopResult() { return topResult; } /** Change the best catalog match for this segment */ void setTopResult(CatItem sr) { topResult = sr; } InputData() { id = 0; } InputData(QString str) : text(str) { id = 0;} }; bool CatLess (CatItem* left, CatItem* right); bool CatLessNoPtr (CatItem & a, CatItem & b); inline QDataStream &operator<<(QDataStream &out, const CatItem &item) { out << item.fullPath; out << item.shortName; out << item.lowName; out << item.icon; out << item.usage; out << item.id; return out; } inline QDataStream &operator>>(QDataStream &in, CatItem &item) { in >> item.fullPath; in >> item.shortName; in >> item.lowName; in >> item.icon; in >> item.usage; in >> item.id; return in; } #endif launchy-2.5/Plugin API/myplugin/myplugin.cpp0000644000175000017500000000647511344736322020134 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007-2010 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #ifdef Q_WS_WIN #include #include #include #endif #include "myplugin.h" #include "gui.h" mypluginPlugin* gmypluginInstance = NULL; mypluginPlugin::mypluginPlugin() { HASH_myplugin = qHash(QString(PLUGIN_NAME)); gmypluginInstance = this; gui = NULL; } mypluginPlugin::~mypluginPlugin() { } void mypluginPlugin::getID(uint* id) { *id = HASH_myplugin; } void mypluginPlugin::getName(QString* str) { *str = PLUGIN_NAME; } void mypluginPlugin::init() { } void mypluginPlugin::getLabels(QList* id) { } void mypluginPlugin::getResults(QList* id, QList* results) { } QString mypluginPlugin::getIcon() { return qApp->applicationDirPath() + "/plugins/icons/myplugin.png"; } void mypluginPlugin::getCatalog(QList* items) { } void mypluginPlugin::launchItem(QList* id, CatItem* item) { } void mypluginPlugin::doDialog(QWidget* parent, QWidget** newDlg) { if (gui != NULL) return; gui = new Gui(parent); *newDlg = gui; } void mypluginPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } delete gui; gui = NULL; } int mypluginPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: // Set to true if you provide a gui handled = false; break; case MSG_DO_DIALOG: // This isn't called unless you return true to MSG_HAS_DIALOG doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: // This isn't called unless you return true to MSG_HAS_DIALOG endDialog((bool) wParam); break; default: break; } return handled; } Q_EXPORT_PLUGIN2(myplugin, mypluginPlugin) launchy-2.5/Plugin API/myplugin/myplugin.pro0000644000175000017500000000044611344736322020142 0ustar monesmonesTEMPLATE = lib CONFIG += plugin \ debug_and_release FORMS = dlg.ui HEADERS = plugin_interface.h \ myplugin.h \ gui.h SOURCES = plugin_interface.cpp \ myplugin.cpp \ gui.cpp TARGET = myplugin win32 { CONFIG -= embed_manifest_dll LIBS += shell32.lib } launchy-2.5/Plugin API/plugin_interface.h0000644000175000017500000003560311032265576017404 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PLUGIN_INTERFACE_H #define PLUGIN_INTERFACE_H #include #include #include "catalog.h" #ifdef Q_WS_WIN #define VC_EXTRALEAN #ifndef WINVER #define WINVER 0x05100 #define _WIN32_WINNT 0x0510 #define _WIN32_WINDOWS 0x0510 #define _WIN32_IE 0x0600 #endif #include #include #endif #ifndef UNICODE #define UNICODE #endif #define DESKTOP_WINDOWS 0 #define DESKTOP_GNOME 1 #define DESKTOP_KDE 2 /** \brief This message asks the Plugin for its ID Number. Launchy needs an unsigned int identification value for each loaded plugin. You supply your own here. Typically, this is the result of hashing a string, as shown in the example below. \param wParam (uint*) That stores the resulting ID number. \warning Because we're hashing strings to integers.. it is theoretically possible that two plugin names will collide to the same plugin id. \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_ID: *wParam = qHash(QString("Weby_Plugin")) handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_ID 0 /** \brief This message asks the plugin if it would like to apply a label to the current search query. It is sometimes useful to label user queries with plugin-defined tags. For instance, the weby plugin will tag input that contains "www" or ".com" or ".net" with the hash value of the string "HASH_WEBSITE". Then, other plugins that see the query can know that the current search is for a website.\n\n The InputData class stores the current user's query. It is in a List structure because each time "tab" is pressed by the user a new InputData is formed and appended to the list. In other words, if the user typed "google this is my query" then wParam would represent a list of 2 InputData classes, with the first representing "google", and the second, "this is my query". Each InputData can be tagged individually. \warning This is called each time the user changes a character in his or her query, so make sure it's fast. \param wParam QList* id \param lParam NULL \verbatim void WebyPlugin::getLabels(QList* id) { if (id->count() > 1) return; // Apply a "website" label if we think it's a website QString & text = id->last().getText(); if (text.contains("http://", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains("https://", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".com", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".net", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains(".org", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); else if (text.contains("www.", Qt::CaseInsensitive)) id->last().setLabel(HASH_WEBSITE); } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_LABELS 1 /** \brief Asks the plugin for any results to a query If your plugin returns catalog results on the fly to a query (e.g. a website query for weby or a calculator result), then this is the place to do so. The existing results are stored in the list of CatItem's (short for Catalog Items) passed in as lParam and you can append your own results to it. \param wParam (QList*): The user's query \param lParam (QList*): The list of existing results for the query, you can append your own \verbatim void WebyPlugin::getResults(QList* id, QList* results) { // Is this query a website? If so create a new result for the website if (id->last().hasLabel(HASH_WEBSITE)) { QString & text = id->last().getText(); // This is a website, create an entry for it results->push_front(CatItem(text + ".weby", text, HASH_WEBY, getIcon())); } // Is this query of form: website search_term? if (id->count() > 1 && id->first().getTopResult().id == HASH_WEBY) { QString & text = id->last().getText(); // This is user search text, create an entry for it results->push_front(CatItem(text + ".weby", text, HASH_WEBY, getIcon())); } } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_RESULTS 2 /** \brief Asks the plugin for a static catalog to be added to the primary catalog Some plugins will add permanent entries to Launchy's primary catalog (until the catalog is rebuilt). For instance, weby adds firefox bookmarks into the primary catalog. This is the function in which that is done. \param wParam (QList*): The catalog that you append your new entries to (these will be copied over to the primary catalog) \verbatim void WebyPlugin::getCatalog(QList* items) { // Add the default websites to the catalog "google/amazon/etc.." foreach(WebySite site, sites) { items->push_back(CatItem(site.name + ".weby", site.name, HASH_WEBY, getIcon())); } // If we're supposed to index firefox, then do that there if ((*settings)->value("weby/firefox", true).toBool()) { QString path = getFirefoxPath(); indexFirefox(path, items); } } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_CATALOG 3 /** \brief This message instructs the plugin that one of its own catalog items was selected by the user and should now be executed If the plugin adds items to the catalog via MSG_GET_RESULTS or MSG_GET_CATALOG and one of those items is selected by the user then it is up to the plugin to execute it when the user presses "enter". This is where you perform the action. \param wParam (QList*): The user's query \param lParam (CatItem*): The user selected catalog item \verbatim void WebyPlugin::launchItem(QList* id, CatItem* item) { QString file = ""; QString args = ""; if (id->count() == 2) { args = id->last().getText(); args = QUrl::toPercentEncoding(args); item = &id->first().getTopResult(); } // Is it a Firefox shortcut? if (item->fullPath.contains(".shortcut")) { file = item->fullPath.mid(0, item->fullPath.count()-9); file.replace("%s", args); } else { // It's a user-specific site bool found = false; foreach(WebySite site, sites) { if (item->shortName == site.name) { found = true; file = site.base; if (args != "") { QString tmp = site.query; tmp.replace("%s", args); file += tmp; } break; } } if (!found) { file = item->shortName; if (!file.contains("http://")) { file = "http://" + file; } } } QUrl url(file); runProgram(url.toEncoded(), ""); } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_LAUNCH_ITEM 4 /** \brief This message informs the plugin that it's being loaded. This is a good time to do any initialization work. \param wParam NULL \param lParam NULL \verbatim void calcyPlugin::init() { // Do some initialization here if necessary.. } int CalcyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; } return handled; } \endverbatim */ #define MSG_INIT 5 /** \brief This message asks the plugin if it has a dialog to display in the options menu. The result of the request is returned via the result of the msg function (handled). \param wParam NULL \param lParam NULL \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_HAS_DIALOG: handled = true; break; } return handled; } \endverbatim */ #define MSG_HAS_DIALOG 6 /** \brief This message tells the plugin that it's time to show its user interface \param wParam (QWidget*): The parent of the dialog to create \param lParam (QWidget**): Your plugin's new dialog is returned here for Launchy to keep tabs on it \verbatim void WebyPlugin::doDialog(QWidget* parent, QWidget** newDlg) { // gui is a private member variable of class WebyPlugin if (gui != NULL) return; // class Gui is weby's user interface class gui = new Gui(parent); *newDlg = gui; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; } return handled; } \endverbatim */ #define MSG_DO_DIALOG 7 /** \brief This message asks the plugin for its string name \param wParam (QString*) The destination for the name of your plugin \param lParam NULL \verbatim void WebyPlugin::getName(QString* str) { *str = "Weby"; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; } return handled; } \endverbatim */ #define MSG_GET_NAME 8 /** \brief This message informs the plugin that it should close its dialog \param wParam (bool): Whether the plugin should accept changes made by the user while the dialog was open \param lParam NULL \verbatim void WebyPlugin::endDialog(bool accept) { if (accept) { gui->writeOptions(); init(); } if (gui != NULL) delete gui; gui = NULL; } int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_END_DIALOG: endDialog((bool) wParam); break; } return handled; } \endverbatim */ #define MSG_END_DIALOG 9 /** \brief This message informs the plugin that Launchy is now visible on the screen. \param wParam NULL \param lParam NULL */ #define MSG_LAUNCHY_SHOW 10 /** \brief This message informs the plugin that Launchy is no longer visible on the screen. \param wParam NULL \param lParam NULL */ #define MSG_LAUNCHY_HIDE 11 #define MSG_CONTROL_OPTIONS 500 #define MSG_CONTROL_EXIT 501 #define MSG_CONTROL_REBUILD 502 /** \brief This is the class that a plugin must implement. The PluginInterface is the interface between Launchy and your plugin. Launchy communicates with your plugin through the msg function. To store any settings in Launchy's permanent configuration file, please refer to the settings member variable. */ class PluginInterface { public: virtual ~PluginInterface() {}; /** \brief This is how messages are passed to the plugin Here you handle the subset of messages that your plugin requires. At minimum, your plugin must handle MSG_GET_ID and MSG_GET_NAME. For unhandled messages, return 0. For handled messages, return 1. \param msgId The type of the message, such as show dialog, initialize, or get results \param wParam If this message type requires any parameters, this will be the first and casted to void* \param lParam If this message requires two parameters, this is the second, casted to void* \return 1 means the message was handled, 0 means it was ignored \verbatim int WebyPlugin::msg(int msgId, void* wParam, void* lParam) { bool handled = false; switch (msgId) { case MSG_INIT: init(); handled = true; break; case MSG_GET_LABELS: getLabels((QList*) wParam); handled = true; break; case MSG_GET_ID: getID((uint*) wParam); handled = true; break; case MSG_GET_NAME: getName((QString*) wParam); handled = true; break; case MSG_GET_RESULTS: getResults((QList*) wParam, (QList*) lParam); handled = true; break; case MSG_GET_CATALOG: getCatalog((QList*) wParam); handled = true; break; case MSG_LAUNCH_ITEM: launchItem((QList*) wParam, (CatItem*) lParam); handled = true; break; case MSG_HAS_DIALOG: handled = true; break; case MSG_DO_DIALOG: doDialog((QWidget*) wParam, (QWidget**) lParam); break; case MSG_END_DIALOG: endDialog((bool) wParam); break; default: break; } return handled; } \endverbatim */ virtual int msg(int msgId, void* wParam = NULL, void* lParam = NULL) = 0; /** The setting manager in which you store your persistent data. More data can be found in QT's documentation for QSettings Following is an example of using the settings variable: \verbatim QSettings* set = *settings; // Write a value to the config file set->setValue("weby/version", 1.0); // Read a value from the config value double value = set->value("weby/version", 0.0); \endverbatim */ QSettings** settings; }; /** \brief A convienience run function This function will run the program along with arguments and is platform independent. \param file The location of the file to run \param args The arguments to the command */ void runProgram(QString file, QString args); int getDesktop(); Q_DECLARE_INTERFACE(PluginInterface, "net.launchy.PluginInterface/1.0") #endif launchy-2.5/Plugin API/plugin_interface.cpp0000644000175000017500000000313411032265576017731 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "plugin_interface.h" /*! \file \brief A Documented file. Details. */ void runProgram(QString path, QString args) { #ifdef Q_WS_WIN SHELLEXECUTEINFO ShExecInfo; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_FLAG_NO_UI; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = (LPCTSTR) (path).utf16(); if (args != "") { ShExecInfo.lpParameters = (LPCTSTR) args.utf16(); } else { ShExecInfo.lpParameters = NULL; } QDir dir(path); QFileInfo info(path); if (!info.isDir() && info.isFile()) dir.cdUp(); ShExecInfo.lpDirectory = (LPCTSTR)QDir::toNativeSeparators(dir.absolutePath()).utf16(); ShExecInfo.nShow = SW_NORMAL; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); #endif #ifdef Q_WS_MAC #endif #ifdef Q_WS_X11 #endif }launchy-2.5/Plugin API/default.doxygen0000644000175000017500000015010211032265576016730 0ustar monesmones# Doxyfile 1.5.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file that # follow. The default is UTF-8 which is also the encoding used for all text before # the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into # libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of # possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = LaunchyPluginAPI # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 200 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, # Italian, Japanese, Japanese-en (Japanese with English messages), Korean, # Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, # Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = YES # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file($line): $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = . # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default # input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. # See http://www.gnu.org/software/libiconv for the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the output. # The symbol name can be a fully qualified name, a word, or if the wildcard * is used, # a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 4 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = doxydoc # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = LaunchyPluginAPI.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = __declspec(x)= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to # produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to # specify the directory where the mscgen tool resides. If left empty the tool is assumed to # be found in the default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen will always # show the root nodes and its direct children regardless of this setting. DOT_GRAPH_MAX_NODES = 50 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO launchy-2.5/Plugin API/api.html0000644000175000017500000001725511043351561015347 0ustar monesmones Launchy 2

Launchy 2.0 Plugin API Documentation

Josh Karlin

 

Setting up the build environment

Building your first plugin

Editing the plugin

Distributing your plugin

 

Skeleton Plugin

Doxygen Documentation

 

Introduction

 

By itself, Launchy can only index regular windows files such as mp3's, documents, links etc. There are infinitely more things that the simple Launchy interface could be used for, e.g. as a calculator, browser launcher, directory walker, etc.

Launchy's interface is broken down into a user input window and a program output window. As the user enters input, the items are matched against Launchy's index of objects and the best matching object's display name is displayed in the output window. If the user presses the enter key then the object is launched by the object's owner. If the user presses the TAB key then the owner is asked to provide a new set of objects.

In this document, I describe how plugins can be developed to add new types of objects to the catalog and take control of the execution of existing ones.

 

 

Setting up the build environment

For this setup, we require Visual Studio (preferably 2005 as that is what I use) and QT 4.3.3. I will assume that you already have Visual Studio installed but not the QT developer environment.

 

Installing QT

 

Download the open source windows version of QT version here: QT download Dont get the mingw build, you just want the source zip file. I recommend finding version 4.3.3 as that is compatible with Launchy 2.0+ All Launchys 2.1+ are compatible with 4.4.0+.

 

Unzip the file and rename the directory to 4.x.x (replace the xs with your downloaded version number). Then place 4.x.x into c:\qt\ so that you have a c:\qt\4.x.x\ directory.

 

Add 2 environment variables (under control panel->system->advanced->environment variables)

  1. QMAKESPEC = win32-msvc2005
  2. QTDIR = c:\qt\4.x.x

 

From Launchy or your start menu, run the Visual Studio 2005 Command Prompt

 

From the command prompt type the following (this takes awhile to finish):

 

cd c:\qt\4.x.x

configure debug-and-release no-stl no-qt3support

nmake

Okay, now QT is built. Note in c:\qt\4.x.x\bin there are a bunch of useful utilities. The dlls that comprise the QT library are in there as well as the excellent QT documentation in a program called assistant.exe.

 

 

 

Building your first plugin

Download the plugin skeleton here. This includes a blank plugin, all of the necessary header files, and a visual studio project designed for compilation with QTs qmake. Note that you need to edit myplugin.pro when adding or removing files from your project.

 

Please download and extract the plugin skeleton. Ensure that your %QTDIR% variable is properly set and then restart visual studio. Now open the plugin project. It should build with some compile warnings (due to empty functions). Your compiled Launchy plugin is in debug\myplugin.dll

 

 

Editing the plugin

Launchy deals solely with the plugins msg function. Msg then dispatches incoming events to appropriate event handlers. The msg function should return true if the event was handled, and false otherwise.

 

The first thing to change about your new plugin is its name. In myplugin.h there is a line: #define PLUGIN_NAME "MyPlugin". You should replace MyPlugin with the name that you desire. Next, you should proceed to fill out any of the necessary event functions that you require. To do this, you need example code and documentation about the specifics events.

 

For example plugins, please refer to the source code of the plugins that are shipped with Launchy. The code can be browsed via the svn repository here. When browsing the code, dont click on the file name, click on the revision number. That will show you all of the files contents for the given revision.

 

For event documentation, please refer to the doxygen documentation.

 

Running your plugin

First, make sure your plugin has an icon! This icon should go into Launchy\plugins\icons\. Next, make sure your code points to this icon in your getIcon function. Finally, copy your plugins compiled .dll file to the Launchy\plugins directory and restart Launchy. Good luck!

launchy-2.5/Plugin API/myplugin.zip0000644000175000017500000003124611032265576016304 0ustar monesmonesPK Ew8 myplugin/PKu[8vwImyplugin/catalog.hXmo7s.|YNP7@qXWvmE;H ΐ+  3ϼpf8~5#,̅ZA irelsޅwv?SJn[㹴4zfh95`=ǰBBZgrҁPŁ& ])*Ѐ#84 z7.*4jBFH,[43αdA?4z%Gc˷VP2:±d J`)sHQz{e *vXn fp9|Ln1] CF(ȴ[?~9 h8̦/?ǫf<< nC$_G@'di-U0sdrEUj5ށEv<PQ^14AA2t4XINxdBX &Z%(T@̯67!1k,s{]M;{{9N<7A~6PC HGaP;%¶f%Y7uxk[(v qv֬|_t~y7 VqW,ß%3:5> n[4a狭̠ Rxy=oWYBrB 9Ԓe[Y zO7é,[Fm(&'{_l:Y%^kjU{Y,ݚYρc=1tIF [QZCbDj<{=c{)aE8>4;str~l!C%J'18<2/ۉ_1j4vqWkw[M-ztvy,$JV3Iر5ФkQ9+2 "W%NBrwYx;w3e 4r8 sCWB8[ tgv섟/m pФpg[-eҠ%xt=;#a2PsYc8MJ AYGCoփ@Q;L> +&G{~2٘@Ẅl]h)N<y/)hڌ4)c)&X :[ٚ6j"t|=/o?pDYޠS`*NU>GG_+Ѝ ?Fc O#!(-.7s Tp={\QwGdu'HaԶwk0m.T* hh,u۵XbNU?y ?0`(%cF%nfZNI1|2$1w:>Zr}ۀPEf5&Ȕ\b'R3ܘX,ڼ!.; _M^(\EBz>&-GYC"8%JԶiϝMquxskZCSf2n_kg6BDi3zRR!om,N''&r5f$:`B4mIm&8sTS~Iggn%r*ѣS j)KT BרPKq8Hn3myplugin/globals.hQ]k@|@a /IP;֥|8ulג ~*gie9ݩ;Q߻[v3;svcuV׵phd`hup8#Fx)e3%2 /.zLчE2"Yg@:U( Pupq<.]EWwl86 x;gΙjT+Kdo.Y.JBV:j|[upvr 7ebieR17jq]3mبB&Acč|Xnɨ(BE|IDF€e` }a2%jQ21F0d~Vh3Wm@nPY(4ԘM5kP4NB7 -_r]ˌ5VKfSsk.LD4 np};<39 kW\aNt4K4vCVnz58_\ RWn0>\ݎ3 sF0~TUŒJ#Dh&0$KDD1J3w`T |R&5$O=;F .ϱ / Ua(Xp~Ɵ426z|jwNZP$;O2bw{_X_mGE^fnrOӝk.#6N0f:EIpYdq|P,gJc ~F\\ѺZ¥mʷj# vIE2` Vs9oGz; ޛL\r[BMoyϮ\&,,|#x&&hY0SbQC%s#oƁFh >d0r=d6'8l圦CE'Ovq;1IPھN_"͐FR-_N[Z* >-Z<%}wo?N-LhL(ynf #qfxb*7 tA%^j.śncx; &[V̲TKg?PKat8:8-myplugin/myplugin.hTaoFKO| It:5BE-2c;HR,yͬyuTqF癌ZɸNO[#Wk|E?ɤrי@nʈ54D(Ҿ C]luX(Jda\ -J5wXD.R lJdGsܓ"#2LPƤ r+H)b[Qӟ#ͲT]L1.]i Qe7[ŒBfE=.Q,A*6C1 _i=^r W#-{_1# a QY_]u|Vԇ\^\\||1}:FZ,qBKXl8G/ࡏӇ$+WR Ly He,Yʄg(6ț]<Ql]Ý|wǗ~oVѬ? z{Gn5 k& w9mFX>Zw|"#kZyi?*r.V;L|lLxr͇.*'U +C*/6[ؓ[5gT($;mО5ca)pVdzJ~0}[oe$nF. )cI%oDSnimbj?C[2jBPKs8fAXmyplugin/myplugin.pro}?0gH8pf@,HbMJ%1ne!rC !Ie64b(PT2ڢCek@=/#)=EYADR8F.ϛf&AA$ΟJW}rkSo XghJ^`S&k`u 1jۥ3[󊗡PKq8d^Xpmyplugin/MyPlugin.slnN@݄w xI,V8xX(F=Ӳ5+nSd|$_%Rmg|nJ^L菴 c!S3)(/22#^$*UL4p+FhUɟF^.t}CZ ., "QYJuq_udN c6wUm/!t|AG6 rhѕ04i_7#VN>n' x\ImX"25cUlKтeDĞU"]:jA+.U `5_RhpvEl2bo1=lI)(9ni<%*"wqxAPKv8Ɩg myplugin/MyPlugin.vcprojVko0  P,}+-(iQtLBn|z8vh5߱밮:4O{}z7psSrLج|" գS" DT  ~zA;^slISU3C-f9k09^;;p ϭ7y;$i^+41ʐ7;XH$^Q\dҜGs51bo=Vi>gS2+RZm'I1CBD@X'7–&HqTͬj?vl<*}ew隧لd|\g^aVYllcR@f}SV|25IR5?vRZ`8$y)3 )2/¡Mr+D6+5֟ |ۺc$WV[2ZWmM%ߎL|F~0L%7WVf#^*ږ4σ4Hb`Ӏ5σ RY ;akC L)1ߪ} njl~XV$0! ]VϮ25fπ벳oqԹ֔ssQ`!VeZӨ=݉b>n=ܦHADIZ"(mkx7`du)T-v?|/L\$P)3WenLav Pqm_`"4a-3l*0A p7 Ti"Fa4نtvMΏ$ QWA+ُcrV +";(94vMA\\4>ⶼ,aPk:T 0Ǐg3<=_5KfGqQ0S)R8cNfԟ%`3gItbhsoorZKaԍGQ2m7DAJwUJԨb{}9iڰU=cBv7H60-Y__wIjcKG>@]w?a$u~"- *'.\9!u3弤@o+1neZQXmO5#,F T-{Cl%TmybI/)hr/uN `x8c\퀓ùb'G?GLAq,G~e9x*ȨpM/KL[ jOo#mNCܒ<kjZp~mjٱIy:&A]v/5X77F"T= VZ) #drk=\qv.Uu,m ߽C}BEs9#@7_{PK{8){N;myplugin/plugin_interface.hYmo7lJ>esZ8jٱ0]Jb"%ײprwHnRmi9y,}g,SFSPf{gfty֢o~4vF?,Uzowow4SfbN8ɤ$k&n)2V&Xhd8w# sɊ:$'%3_.7t!DJW b̏L&4^y7lX7ޫW$3ze/vM&p9#]-]Q*\1u\BJ{3 ;TiJcIm3}xEK4XPH ¡LhBdvubCu}`ozAw87ԡwv\ %CB䞏*MjnD:R4ZJtR=5YJzȭE iڴ̔4'57X|X%#!: V@ s @SF U:ɭoL8`>E$d:4>ҶlNTf]y,-7@`#46`DEj 9\bSOzPIZ_'Q':u(bt)\LƼ_h54@9T`os¿kt /7msҊ$ۦJ^&׮٢S:ⵒL:3`AQVo dI_ȶgp$ FJ(, l̜[ Q Ў4pF|n7;C &lE`"Mzz n7[Pj`tQژ:OG0ӫ07Z?1\V̽oKSm3 t{SFӨ&8w<dAa B֞&*\p+]Co^@g3QOxŶh!-v &#G8I=tj+o)']tS97sh?0*&mW j+ =˩ $%Fh[gG~]$ 5\|qn!MoNmoM%m(j(3 Pa ߢAN_}Uyl>UnAqL~ߟ _w7QEu<͖O=h:c"{gx["SsJ(^}v+DL}S=DaMTSs!"/\BlZ@N#!P ǔ74XT< vfu f[@v.cPAp3;i#?Oh$DxW/bb.mtq5Xʄ_ `|U0WRr [-,Y*ku : WY|glQJ'򱬃0J$zϪåonũJh6A @܉șנanF37Ŏ+<()ϛ,.RW㲳Ψӿ(.“&chytqubECYj:LRX2{zBZ{wGVo3s;'T$̾3/FW{ \ N\!8WEd!#L2e~:* {kYg&S'14wS#K&ANd^gn5YL}5•] CKXy|-<ش+*Cb cY%*cr _TW3]@$ёe&if-eQG0Ik: :3G0r9)Lӽ*sNm5HhԘ`.q굑\Ot:)c肘W ܰ[. @o]8 0g/^D],dHւ> Ԓ*".\` JL&9!Mus"'Fwrs+닧ys0)]-zih?#CU8SA*h.ΏP]KSL#ټL͟~!hFeu|t6wzb~j \?;St+h`.n,L(3d6U\Ÿ-S?+`oE$D|jqMkɜ^UFM:FheC;WIo5ZBuAJ \a5׵GۓɅ?:j{2/Texz>9&eL0`swwadNMfN}'}a@ʦa~}I^pTȖԙ*=wER0^M vSpe_69uWcՃK8 Ӥu Ǫ  늻ȜX Y#*Q=ZwS/ur4e'ՔW:W>J,a[eBZUu\V#X/E FM 4DfK1,^pψ F}}ݫ& w JwszXFZip YTNp=1nO8UgTXǻƾ )jB]\&NFnqLCV6sBwaG%.a .j!CXR)+s׌0Ə? -qv,δ(Qqm0F}] 0umX ШT ] a kf"(zXǗ LdS YP¼y{b,O "iLV1z,$p%gow0&ibIE`x&_8{ ko{iӽ({9ZlwsPKq8 myplugin/readme.txtR;o@ ?pO`2 m ҙ((êˣ*kH {ҩ6=??'x.!O<)js=js? ?7:PD `렕-@AA->!1= Tad7\u@NRޞr1lp4W巇D̑ Ѓq<-i ^ IRVJ7eZ.aoUC78Lop˧%tFrEb#WeetNhJ̮ՎAz#f{Ia힠V\jo&LnIqˢYi(#KДB$g9Ghz/X' 4u/".d'yPK Ew8 myplugin/PKu[8vwI 'myplugin/catalog.hPKq8Hn3 Ymyplugin/globals.hPK;u8C2|  myplugin/myplugin.cppPKat8:8- kmyplugin/myplugin.hPKs8fAX myplugin/myplugin.proPKq8d^Xp myplugin/MyPlugin.slnPKv8Ɩg  \myplugin/MyPlugin.vcprojPKpB8 4a\ myplugin/plugin_interface.cppPK{8){N; Imyplugin/plugin_interface.hPKq8  -myplugin/readme.txtPK /launchy-2.5/Plugin API/catalog.h0000644000175000017500000001340411032265576015473 0ustar monesmones/* Launchy: Application Launcher Copyright (C) 2007 Josh Karlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef CATALOG_H #define CATALOG_H #include #include #include #include #include #include #include #include /** \brief CatItem (Catalog Item) stores a single item in the index */ class CatItem { public: /** The full path of the indexed item */ QString fullPath; /** The abbreviated name of the indexed item */ QString shortName; /** The lowercase name of the indexed item */ QString lowName; /** A path to an icon for the item */ QString icon; /** How many times this item has been called by the user */ int usage; /** This is unused, and meant for plugin writers and future extensions */ void* data; /** The plugin id of the creator of this CatItem */ int id; CatItem() {} CatItem(QString full, bool isDir = false) : fullPath(full) { int last = fullPath.lastIndexOf("/"); if (last == -1) { shortName = fullPath; } else { shortName = fullPath.mid(last+1); if (!isDir) shortName = shortName.mid(0,shortName.lastIndexOf(".")); } lowName = shortName.toLower(); data = NULL; usage = 0; id = 0; } CatItem(QString full, QString shortN) : fullPath(full), shortName(shortN) { lowName = shortName.toLower(); data = NULL; usage = 0; id = 0; } CatItem(QString full, QString shortN, uint i_d) : id(i_d), fullPath(full), shortName(shortN) { lowName = shortName.toLower(); data = NULL; usage = 0; } /** This is the constructor most used by plugins \param full The full path of the file to execute \param The abbreviated name for the entry \param i_d Your plugin id (0 for Launchy itself) \param iconPath The path to the icon for this entry \warning It is usually a good idea to append ".your_plugin_name" to the end of the full parameter so that there are not multiple items in the index with the same full path. */ CatItem(QString full, QString shortN, uint i_d, QString iconPath) : id(i_d), fullPath(full), shortName(shortN), icon(iconPath) { lowName = shortName.toLower(); data = NULL; usage = 0; } CatItem(const CatItem &s) { fullPath = s.fullPath; shortName = s.shortName; lowName = s.lowName; icon = s.icon; usage = s.usage; data = s.data; id = s.id; } CatItem& operator=( const CatItem &s ) { fullPath = s.fullPath; shortName = s.shortName; lowName = s.lowName; icon = s.icon; usage = s.usage; data = s.data; id = s.id; return *this; } bool operator==(const CatItem& other) const{ if (fullPath == other.fullPath) return true; return false; } }; /** InputData shows one segment (between tabs) of a user's query A user's query is typically represented by List and each element of the list represents a segment of the query. E.g. query = "google this is my search" will have 2 InputData segments in the list. One for "google" and one for "this is my search" */ class InputData { private: /** The user's entry */ QString text; /** Any assigned labels to this query segment */ QSet labels; /** A pointer to the best catalog match for this segment of the query */ CatItem topResult; /** The plugin id of this query's owner */ uint id; public: /** Get the labels applied to this query segment */ QSet getLabels() { return labels; } /** Apply a label to this query segment */ void setLabel(uint l) { labels.insert(l); } /** Check if it has the given label applied to it */ bool hasLabel(uint l) { return labels.contains(l); } /** Set the id of this query This can be used to override the owner of the selected catalog item, so that no matter what item is chosen from the catalog, the given plugin will be the one to execute it. \param i The plugin id of the plugin to execute the query's best match from the catalog */ void setID(uint i) { id = i; } /** Returns the current owner id of the query */ uint getID() { return id; } /** Get the text of the query segment */ QString getText() { return text; } /** Set the text of the query segment */ void setText(QString t) { text = t; } /** Get a pointer to the best catalog match for this segment of the query */ CatItem& getTopResult() { return topResult; } /** Change the best catalog match for this segment */ void setTopResult(CatItem sr) { topResult = sr; } InputData() { id = 0; } InputData(QString str) : text(str) { id = 0;} }; bool CatLess (CatItem* left, CatItem* right); bool CatLessNoPtr (CatItem & a, CatItem & b); inline QDataStream &operator<<(QDataStream &out, const CatItem &item) { out << item.fullPath; out << item.shortName; out << item.lowName; out << item.icon; out << item.usage; out << item.id; return out; } inline QDataStream &operator>>(QDataStream &in, CatItem &item) { in >> item.fullPath; in >> item.shortName; in >> item.lowName; in >> item.icon; in >> item.usage; in >> item.id; return in; } #endif launchy-2.5/Plugin API/PluginPage.doc0000644000175000017500000010300011043351561016412 0ustar monesmonesࡱ> >@=#` [bjbjmm .*[    (P$!######$XhHGG\!!=D  vU!r0],GGdH H  Launchy 2.0 Plugin API Documentation Josh Karlin  HYPERLINK \l "_Setting_up_the" Setting up the build environment  HYPERLINK \l "_Building_your_first" Building your first plugin  HYPERLINK \l "_Editing_the_plugin" Editing the plugin  HYPERLINK \l "_Distributing_your_plugin" Distributing your plugin HYPERLINK "http://www.launchy.net/api2.0/plugin.zip"Skeleton Plugin  HYPERLINK "doxydoc/plugin__interface_8h.html" Doxygen Documentation Introduction By itself, Launchy can only index regular windows files such as mp3's, documents, links etc. There are infinitely more things that the simple Launchy interface could be used for, e.g. as a calculator, browser launcher, directory walker, etc. Launchy's interface is broken down into a user input window and a program output window. As the user enters input, the items are matched against Launchy's index of objects and the best matching object's display name is displayed in the output window. If the user presses the enter key then the object is launched by the object's owner. If the user presses the TAB key then the owner is asked to provide a new set of objects. In this document, I describe how plugins can be developed to add new types of objects to the catalog and take control of the execution of existing ones. Setting up the build environment For this setup, we require Visual Studio (preferably 2005 as that is what I use) and QT 4.3.3. I will assume that you already have Visual Studio installed but not the QT developer environment. Installing QT Download the open source windows version of QT version here: HYPERLINK "http://trolltech.com/developer/downloads/qt/windows"QT download Dont get the mingw build, you just want the source zip file. I recommend finding version 4.3.3 as that is compatible with Launchy 2.0+ All Launchys 2.1+ are compatible with 4.4.0+. Unzip the file and rename the directory to 4.x.x (replace the xs with your downloaded version number). Then place 4.x.x into c:\qt\ so that you have a c:\qt\4.x.x\ directory. Add 2 environment variables (under control panel->system->advanced->environment variables) QMAKESPEC = win32-msvc2005 QTDIR = c:\qt\4.x.x From Launchy or your start menu, run the Visual Studio 2005 Command Prompt From the command prompt type the following (this takes awhile to finish): cd c:\qt\4.x.x configure debug-and-release no-stl no-qt3support nmake Okay, now QT is built. Note in c:\qt\4.x.x\bin there are a bunch of useful utilities. The dlls that comprise the QT library are in there as well as the excellent QT documentation in a program called assistant.exe. Building your first plugin Download the plugin skeleton  HYPERLINK "http://www.launchy.net/api2.0/plugin.zip" here. This includes a blank plugin, all of the necessary header files, and a visual studio project designed for compilation with QTs qmake. Note that you need to edit myplugin.pro when adding or removing files from your project. Please download and extract the plugin skeleton. Ensure that your %QTDIR% variable is properly set and then restart visual studio. Now open the plugin project. It should build with some compile warnings (due to empty functions). Your compiled Launchy plugin is in debug\myplugin.dll Editing the plugin Launchy deals solely with the plugins msg function. Msg then dispatches incoming events to appropriate event handlers. The msg function should return true if the event was handled, and false otherwise. The first thing to change about your new plugin is its name. In myplugin.h there is a line: #define PLUGIN_NAME "MyPlugin". You should replace MyPlugin with the name that you desire. Next, you should proceed to fill out any of the necessary event functions that you require. To do this, you need example code and documentation about the specifics events. For example plugins, please refer to the source code of the plugins that are shipped with Launchy. The code can be browsed via the svn repository  HYPERLINK "http://launchy.svn.sourceforge.net/viewvc/launchy/trunk/Launchy_QT/plugins/" here. When browsing the code, dont click on the file name, click on the revision number. That will show you all of the files contents for the given revision. For event documentation, please refer to the doxygen  HYPERLINK "doxydoc/plugin__interface_8h.html" documentation. Running your plugin First, make sure your plugin has an icon! This icon should go into Launchy\plugins\icons\. Next, make sure your code points to this icon in your getIcon function. Finally, copy your plugins compiled .dll file to the Launchy\plugins directory and restart Launchy. Good luck! $%123TUVvwxy% & ' ? @ A B C w x y zjhYiU hD#0Jj*hD#UjhD#UhD#h2h20Jjh2Uh2jh2Uj hYiUjhYiUhYihYi0JjhYiUjhYiUhYihthvJ.%12xA B }    9  QgdgdgdvJgdRMgdvJgdYi$a$gdvJ$a$gdvJ[   7HIPU%&8BklqrQR hv7hv7h0ehv7hv70Jjhv7Ujhv7U hv76hvhh>}hkhv7hWhI hf h0Jjh>}UjhUh h6hhRMhvJ hYihYi2QR`{()8lrOPQRmgd&;gdv7gdv7 & FgdWgd2*+-.5Wj}:Z[鲽 h2h2hUh hm hU7=0JjhhUjhhUhU7=hhSh&;h&;0Jjh&;Ujh&;Uhhh2 h&;h&;h&;hv7) !-.B[gd2gd2gdgd&; ,1h/ =!"#$% DyK _Setting_up_theDyK _Building_your_firstDyK _Editing_the_pluginDyK _Distributing_your_pluginDyK yK jhttp://www.launchy.net/api2.0/plugin.zipyX;H,]ą'cDyK yK \doxydoc/plugin__interface_8h.htmlyX;H,]ą'cDyK yK http://trolltech.com/developer/downloads/qt/windowsyX;H,]ą'cDyK yK jhttp://www.launchy.net/api2.0/plugin.zipyX;H,]ą'c!DyK yK http://launchy.svn.sourceforge.net/viewvc/launchy/trunk/Launchy_QT/plugins/yX;H,]ą'cDyK yK \doxydoc/plugin__interface_8h.htmlyX;H,]ą'c@@@ NormalCJ_HaJmH sH tH Z@Z vJ Heading 1$<@&5CJ KH OJQJ\^JaJ V@V vJ Heading 3$<@&5CJOJQJ\^JaJDA@D Default Paragraph FontRiR  Table Normal4 l4a (k(No ListB^@B vJ Normal (Web)dd[$\$6U@6  Hyperlink >*B*ph[*%12xAB}9  QR`{( ) 8 l r O P Q R m !-.B]0(00%0%0%0%0%0%0%0%0%(0000000(0000000000 0 0000000000000(00 0 0 0 0 (00- 0- 00- 0- 0- 00- (002xB}9   -]0੕0000000000P00000000^S00000 00 0 4Lm0 00 00 @0 @0 @00 [Q[[2Uvx&?BxH *[XXXXXXXXXX_Setting_up_the_Building_your_first_Editing_the_plugin_Distributing_your_pluginR .]R .] *09?pwen&/) + Y \ l q f l z F J K P o { A G     d g )1IQ-4]d{;AX^ /FM]9%}) + 8 A l q ]333333332wxP -Z]]D|7q[^`o(. ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH.D|7         V;I t2!D#6v7U7=vJkvNphSYiRM&;fhv 0eU>}Wm @(E[0@UnknownG:Ax Times New Roman5Symbol3& :Cx Arial"qh &w ! !24RR2QHP)?vJ2 Launchy 2JoeJoe Oh+'0l  ( 4 @LT\d Launchy 2Joe Normal.dotJoe24Microsoft Office Word@ş@rZ˽@g{՜.+,D՜.+,4 hp|  ! R'  Launchy 2 Title, 8@ _PID_HLINKSA<!P"doxydoc/plugin__interface_8h.html YLhttp://launchy.svn.sourceforge.net/viewvc/launchy/trunk/Launchy_QT/plugins/ T)http://www.launchy.net/api2.0/plugin.ziplj4http://trolltech.com/developer/downloads/qt/windows!P"doxydoc/plugin__interface_8h.html T )http://www.launchy.net/api2.0/plugin.zip3 _Distributing_your_pluginB_Editing_the_plugin#_Building_your_first{K_Setting_up_the  !"#$%&'()*+,./012346789:;<?Root Entry F AData 1TableWordDocument.*SummaryInformation(-DocumentSummaryInformation85CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89qlaunchy-2.5/misc/0000755000175000017500000000000011355776633013022 5ustar monesmoneslaunchy-2.5/misc/Launchy_Icon/0000755000175000017500000000000011355776633015375 5ustar monesmoneslaunchy-2.5/misc/Launchy_Icon/launchy_icon.png0000644000175000017500000002562610673376524020566 0ustar monesmonesPNG  IHDR>agAMA7tEXtSoftwareAdobe ImageReadyqe<+(IDATx} \UګzOw!! [UEpQDG|7Ȉ ?#̠o $R\>^0ui&zuoa6~kܘSrqk "Qg q顀xU8hjbati?zg/ m{hGWx4}~șH%>m`)H =CfbwBZֹ(ׇzC`mۣ J?ѢF6ׇ=ݻw¯!̄jJ~P# ^{<1GqçOÝoљw#q!%sZ.) A҅h?)NR6|AzAtSNӟO]aDc5p`m ݥTBX( \.lݺq yqen?pDT !_0u{ !dZJeb7+0Iqtf]hMi)XkYg@H჎)"w#z lLz~+>t˒} Ɔjo[5/ GkNjKchoo|D4~V셐7@pz}K9bj /]ynG3b$H[Sƒ.0 -Ϝ;I#!WDs& 傇Fs^vȐ+*Σu{8v`wpqOY5$"|R;fL*v4$DIef9f"|r%@cwQ6h ~*wF `iܷC&,R MG L:=ECC8.'6Ie DI$ EjTή#Eː,$SzKy^49GY6gBw@^`Z S7?_8pͅKEJtYm~ɗWjB FT-BywC{xIT&mPNnٗpfCS·ojDP  y| q,G`(Y~o#l9MRRJBɵ/u|n y~?&Ms GCu(ENfa<7NcRȚh fLeű GZtױn+u]kf-  %G٧7Qe pY>4 q#\lWѲA`9``@`YoK9 (65y.ɾ`N@:|H09L^|BݻX4ҽ.!ʠUiˏ~BN ԓ,C,('v@`:fa2 fyĴ!AҲ\hxa<ڋS꽂儭7 K%F> #ɢ ">;`TF9uf\*`&"bg2u@_0 Z aAYK4 3?}/+5ovזŤ"Dpø ^A#<QE > bA]έy8}A +gG!@0)ە ;Z,d_q0@?7HY cL0or9%CRHZi 'ۅI-,sy!`i+I 8~fK*0:E!,k ̖*|]𡓴9]BKѵ 0% Kmhf&, JMi`CkE|9 uA`&D&Fj n]5ǞFTy$!A G_|`XGWX2UMxf!TQPXDEؘk9𔽓Hp3o- xӚH%  ` ǝRnxD(DWJ dTXMs6l*NZ*ƞ5Y"@1 HH\ K4VF~юTWp -X܀S#챵{S~Nxn9%,[x=)Y?B`q 3ϡar咬iWqˎA۷iH`s5N*1--薌69{( .vUhˉ#t~^JG,H,prB ੄{x}"W`}g BÆ5GB[ f ju $:Z" A+Gdb(E91N?skסyV#̜{dچ^dٴ1k/ 60{pU"5 ݋D YAP#y%Jʨ9 Z[[h4@ 0__a3Fߜ>t[|$< ^^|{]J XI ,^׃m=on{1ϟ܂@=()AueXD\/xu'π! tD1u,If5Ko=ɣ|>ZUU{\4U֛pn$N_:0n~_ M}i\ټ*&x0 _ћy.aR U%ķ PA E.@c'ޏ^N`Ie^L6,kQ.bPfuvw b,G4֮UrOspbф?{ n^\tÔko{L^ )!x.=?H>6TZu&[>'Ҹ^l%sVJ!"h2U؜HS ̀>X+4V$)y XY1C漘-lf?*ϩ ɒMiw vLꫯ%KFፉo sy'Kp~\1g<"w|.wqKXscqč]idF* *fʙ2 .IIh3xz}\,1 7-xE2Wk54T'2Y水Q~<};˿6sc ߽|K|/%@^F{2WM7pӍ$O,5ٹo cjzU㯉̡&/Hba 5$s'3B\`BFEtk(ME+aHHX-4v0 )3I$f7YR϶dBk~~񟞷4ʘp h\*b1&,YId wKVqnvG tr:kcVU͖m߰"Ui~sPU/&xדg{=QT/ĤKgΜYCX߸!:.Ok&h\u3Hؙ:,k.kMU[s rw]T3 wokת5! ~DčqEQ2D.+8풕C\\P&Qz,EUЃcBX57VABRzPLO% WUR9~ uTL!ʋ4A6](81ma /0~gh`hÕ!ҳ6pp׷ETKjx+/|"j AUސI%eDu "4ȫX1h 4jcgؚB)i!T* m(T1PfB'9&# -/|G.sSOǡ8vpؚ$+G$flz 2 \S؇{/ZUԫ) EHCp4E>洲 cX\"ẅ7^iSfGԂx9Ur$T.DPYDE($#}6Tщ)Q:( 2|z!)jZXz8!Oxj)IW`墦1_cG;..wpǖ p)9YTAn&MQ/VpzÒ /.tMkpO=yQ[&2&.E c\aju)pU9h9ܴ%F{b#WD~C)a;o݉n%xK/AK@.ebO#5#3Jm/fM5V{d_O[9S'tƺjQTmxEI\jJ_z]xOgCBdZ ò_xxS,|dp9NwбGf$e9 d?J`EP6s0Wy>K}ύk'Ňi7 @DŚhE@0D8zqynܾ-*ͩrf0Ow@0`g  /(o?_c˖'gGG {lP 6"ḋ k"u K?䷹t͉ڡd;evZOv7m n_s2oįo!rtD}7"#wgpyBirA 8PL٤mC:=6/~gOy)E"9nuqV^pP *pwn'V%@߻z,)ܘ\t=38.cwW_:xnyw7u7>.k<pIW$35 HƠ$MI@ O BH~: $ExvsWKD9Ǘ1+[w.W:=o䚉FiX`>+><$m]m>mX*2v6t5 &.\ vxZ@Zu+.\'5|m{zpO~=Xa^#|(Ν䛜R=](%}J֐DmZN7@IW8\pBQ< m2O9oWڛGWV&pvU py_wNBZWYğU&/еnO vy n>y|Jy 3g{8#lt3ׇO7{(౎<7M!k]&Ea0Sf/YvM 33m36i9P>XՓ5 -/sW- }gq FVS6~bgK޵c=Yu.tf-*dMluSjHoHs M:>IܟrAV.l jWv ЄX4`a#a3y]٢ 2=R\T"_Qd +CY|2a(d$p'BC?mG-8c'= Vt?yp[:RPhcb8~^5VbVuH*"=ҰBv Ry D,{r)djbnSj?dvd] 5Dga7ݤπcFs?Hl³g<{5WqsqP ڇBΈ`aCqegJf[δs8 /ov$>9Ϋ?H\0uOzzovG?zlJ&7$9: ?fVQ!VA=E,(\EH3]IB.58K}č9x'݄-Mh#MK 0I<1['Q3L(gmA ~i{2MMO&!ዟ#7%n*bn:78d{ ,pO6Z':u C  k&b=cX}T~E]G,iB4;n+$R_̽V y6I7zzݞ`X%dNe׳'?N<l? T9DzhHИ wKiL6/ac_ ܇k ^TlS9r9/Kyn:Ly/c'(`30а)`P _sAG{APWWFbV𝝝#oT*%%t@:W^nc7]3˟n7֠lv<'M=GCNXe*u4CeN' JeFc 8ءa}\6ԍ 0ඃ}?L7腕o>X 8 #S_ J]ۡC7F+(oߡo\MtDUQзar1eB޸=:::8̭Gx{{{Y.Lak`0X!n~ׯpZ{F?ӗ5qwˡCǗ_~ohB~̓;~/^cVJ~8L fq&h|e0LYor}_iJ< (6k]۠Pb6nI#-|n#[ȉIENDB`launchy-2.5/misc/Launchy_Icon/launchy_icon_win.ico0000644000175000017500000007234610673376524021432 0ustar monesmones 00h . ( 00& v$h>+00 %0  NV f h~p(0`xxxxxxxxwxwwwwwwwwwwwwxwxwwxwwwwxwwxwwwxwwwxwwwwxwswwxw7wwxw3wwxws7wwwxw{3wwwwxw3{wwwxffw337xfDDFfffwws7wdffh`wfffxfffwwvfdhwvffffffwfdhwfhxffffwwdfhwffhwffffwfFwfffgff`wxffxfffgffw`wvdgvgwfffffffwfHwfwwvfffffffwDvfvfwwff`wHffgxwwwvfwdfffhwwxwwx`wHfffwwwwwx`wwtowfhwwwwwwx`wwwgxwwwwwwwxxhvgwwwwwvgffwwwffhxww`vfhwwxvfhwwwwxwwvxwwxgwhx????????????????????????( @xxxxxxwwwwwwwwwxwwxwwxwwwxwwxw7wxwwwwxwswwxxw3;wxfff`ww7x6dfwxvDhffffw{xDhxfgfffwwdhxffgvfwvFwffgfhwdhwffffwHvhvwv`wtffwwwwx`whvffwwwwwgoxhwwwwxvgwxhwwpfhwgwwwphwwp?(0wwwwwwwwww{wwwwffdhffdhhffhfffHwvfhf`vghf`hhwwvhwwwpwxvwfwwhwx?( wwwwwxwxwxwwxw{wxwwvfffwxhffwf`gxx`wxwwwowhxpvh(0`gggpppxxxtttrrrz' ppq<orudLm]d9`3g?tS)ƴY#uE q@p=q>uCwH|N}S {PxKse)rAq?sBsMv~~f\.jIyBvG yP2Kɵc1yEʻƩz: ‡ʏ-~ zzy}VºşM {zОXեlΚO{}6rBýţÚB~}ңe֬x}Ɗ|Lgj<}ڴx˜Dlϳxw۸{թkͫ-˓:ốĖ}!csEҰmcnΦQˆˑ4rl8Ȝ=ō"͕BmM‡ΖHÞkŸWʍ&ǬýqqA{B̢fkGקlr3                      !"# $$ #" $%&' #" ()*+$ #" +,-.$ #" /01*. #" .-23. $ $ #" (4153.&4'6&($ #" .*718.393400($ #:;" (4<21)*8,0-6%4$=>>#:?@" .*52>CDEFGHHIJ" &%+B552251ABKLFMNOPPPQRSTUVWN" '8-A55,*AXYZ[\]^^\WH_`aabcc`de" (8B53ffgZhiRN\jG`klmnopqrrqosM" '0-A<TR]MCp" =M\Q_{ooq" QQFfkoS " >EPPEŪƜǰfȮnmºΝ" =CjEЁ}ҫL" ##F٦}aj!##>LϟgLҌ⯅aS!_N櫪>ҌD腅ߴ"btffD腅f+樵Ieч೿yㅴffff+浵 aSb}NJfffffg+eLќ}ҌfffffgIy}DzیlffffIyx+ffesǓnE:ߨ>!_Lx[HI????????????????????????( @kkkssszzzyyyxxx~~~e(O D»xn 1jɸgc3{MtBtD yM{R"j?u`2j6d:}[lh_WxOθd2r:X)jh@Œ9 {hir=m9{İĞJy եhɖ@z{_ qaT4n7vHƴ˞E|Ž)սxđ-ӡKCjS,ٵyԥ_ҢT|ˢʩŕ.|0~ mZvzǑƌ Ɏ-RҩƉ̒7Δ=Ƙ[špþȔ(ǡlvVͫdɌ%͖D༉ܺ¾ΗM˞bИ9ͯխx٩mAMt<{           !"##$############% & '(((()*(((((((((((#+& ',-(./01((((((((((#2& ',-(3(4/1(((((((((#2& ',-((156713***((((#2& ',-((318699:9;*3(-<=>?@ ',-(((A/BCDEDFG<%(HIJKL ',-(((M*4NO6PQDRSTUVWXYY ',-(((*7ZO[\8]^V_W`abcdeef ',-((3)F8Qghijjklmnopqrrrqs ',-((3tFCZuvwkxyz{|}~ ',-((3)br~ ',-((%j^Rq ',-((Tahh',-(-Z+Z.]6q 5TpR&t?zOlB_S83:4r=u;`4hd*Ď*͖B}z~Yk?zLrǧe}wʜDŦyѝ<lk:pHȯװpۭpÌ}yӦ[z7ȼtAgѳtحeGgjxMW'iҭ\ćգUԹIJW n}UŏƤ_ǐ,͑3ɚW¾tPέkʛ;ʝ^cɒ"NJ ݴwơšTʐ,̔B͖KϞ_âݹ̛Zk     !"#$%&'''''''"()"'*+,-'#''''"!)"'./0%1234''"567)"''89:;<=>?@ABCD)"''EFGHIJKLMNOPQR)"'##STUVWXYZ[\]^_`R)"'#'abcdefghijklmnR)"''opqrstuvwxyz{|}~)"'')"'!"n?( }}}\6cɼ}ct[t`U:],n9~>-'kvzl\$J5ѠLȓ6yuVh7ǥeĕċz˜C&zxGȚ8ȍ׾¨zxvRؼ԰k˕C¼|^=М>²d)ԦTثjԣaùSo4e4z    !"#$%&'()*+ ,-./01()23456789:;()2<=>?@ABCDEF()GHIJKLMNOPQR()STUVWXYZ[\]^_`abcdefghFijklmnopqrstuvwxyzx{|}~x(0` ffffffcccjjjpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppooohhhcccQeeeeeeeeeeeeeeeeeeeeecccIdddwwwoooddd4eeeeeeeeeeeeeeeeeekkkwww咒iii|cccddddddddddddddd|||옘ssscccfffffffffffffff|||롡ssscccfffffffffffffffyyy뮮rrrcccfffffffffffffffxxx붶qqqcccfffffffffffffffxxx뷷qqqcccfffffffffffffffxxx붶qqqcccfffffffffffffffxxx뵵qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴qqqcccfffffffffffffffxxx봴~qqqcccfffffffffffgffgxxx봴*qqqcccfffffffghfgggebxxx봴 qqqcccfffeimehlpS/wG xxx봴/qqqcccehml\HpP'wDwH xxx봴qrsbfllZCwDvAvG wGxxx봴;'pswhXCwDwF uDvG wGxxx봴 ?b_^rȽm|Ug=a6e9iDuS)uAgvF ?wF uDvG wGxxx봴I #bUȴ[[)wG q?m9l8o;p<sBvG{N|T#zPxLtD uD=wG xxx봴`o^pc,sAq?q?o<r?zLa7wZw~{t~c\0vF xxx봴JpdK"xAsCuE r@wIfjrBq?uDq?S rĻ˼ĠU ŕ0ڲz߸Ԩg R xxx봴nL9a4s=uF sBzKgŨşK|ŗ3Ҭ^ҲǤțA'&*ԣE.^&xxx봴kkIs?tCrAnDȼѾЮeŒ "ʞC۽̣Q&Ó2Îͬ}¬Zxxx봴fgE|Cr@wI’ֱlݸ~ٳoɛ7"ʟDٻyɟF##̡Lνxxx봴{MwBn=]+̦TزmƕȜ8Ǚ8ЩTڸtƔԯfĖ5&’/˟I۽Ȳ`xxx봴X"r?n<sJɜɛ6ҫYŽ ’,ǢTɬmǪmĚD!/ɜ8q vKxxx봴l@m;o>gԴr|ѥM۾ԭW0hLď yj:ȷyyy촴tn;n<qϩXy Ƒ%ѢKҳ~+s\ ܾ.vvvٵʿvHk8vͣI|čʑ,ќF׭fմȻjVhCfff,rrrfmBi4dЪXœ'ȓ*˔2͔8ΙEӠUبfϴtJcccfffYβk7nAضj˭n̯֭fѝGϛHϙIМUìĽ¼ýX%dddhhhbȸlBvE ɍÐ۶zӞRѝW»þ½pyI}e5dddhhh9tщp?ձ΢Eܻ֨g¼g?tB;wG zL{M{M{Mdddhhhq\0`\-ͿƖ.ŏի]΢˲ýºwGvD wG vF vF vF vF dddhhhpLo9n;бt ̗4ԦW߻ϩԵʥڶ¾Ľ[-s?3wG wG wG wG wG wG dddhhhmHo:q> V%´Ȕ.ɐ'Ϙ>ѠP֩f۲z۴ٮvѭ|ĿþjFsAlwG wG wG wG wG wG wG dddhhhjFl7p?k8hAȮ͔,ћDҢUԥ^էdըj֫r֫r֨qjFsBwF wG wG wG wG wG wG wG \\\```v`3wG {M{MxHkȨjפLβƣşٲ}حw۬rϱ[-r@jvE wG wG wG wG wG wG wG wG ɹǵůȶȶȶͼb|:ڭg޸֪rƗZAhsSuHsA8vG vF wG wG wG wG wG wG wG wG ]xB溛q˺¥xAf+ޚtCm>yI^1ߙpmg@xLr?\tD vE vG vF wG wG wG wG wG wG wG wG ̼_#B­]˹g̺j˼R6m!j V#n: uCdwIyMwKtE sBer?0tB uDtEvE vG vF wG wG wG wG wG wG wG wG ????????????????????????( @ bbbfffuuuzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyynnnccc)cccdddddddddjjjpppfffhhhhhhhhhqqqsssssssssooorrrrrrrrr{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqqq{{{mmmqqqqqqqsv{{{ammmqsvqtyt]B{{{*mosrkbsX7wC{{{M'ndWwF uAvF {{{Dúvjq@wDtD vF {{{e#/eɺga1zKtC tDyM{S${R#xOsEWuD {{{kI=t`2u>i4qA _7{\ge]YV|OU {{{GiŮe3p7o:Y,jpŞR˜K}k{{{Dkhp=n5Z*ışRϢLѥ\ĉ` {{{o_S6k2wIqϽΪZ }Ɨ4ʙΪ% ձi˛j{{{kS,q3b7ȸŗŒ̟@ǘ5Î%(ө<{{{b3k1_ɭͥK޾ϥĐÒ)˨^αwƚAǙ45||||Vf/|ͨəۺŚ=\*| wBʹyyyg3{ʖ ˔1׬dԯȹueϸggg&{MkٲƠOț?̕3Ζ=қKϫymEujhhh ]z`6ԬҬW޼ҚIƣrſþƿzKaxGvF vF hhh9bkZ1ĮΡ<ծ^έuVr>"tBtBtBhhh[.tSέgŋخfӰ˩½ývFtAvD vD vD hhhqSk7k8Bt͘3͕4ҠSתlٮvҩu¾|T#r>vE vE vE vE iiiiAuD uDxMV[ܭ\Ƣĝܳ}ܬqñzPq?wG wF wF wF wF ~xqμƳ«Ƴȴ¯$RʣjŚdPyBߝzpLpAnp<tCwF wF wF wF wF ȶkiͻ¯ѿm}UG`.!q>H~V'g?d;{S#rB`p;sBr@tCwF wF wF wF wF ?(0 bbb3iii}}} {{{hhh[dddeeeeeeyyyyyyzzzzzz{^;Dwl{`@s>`>p? uHtC  8TȺgi>Z0\4^9zR%vMdsD 9~D}lQ*u>vJ f=~QL@BAa'Kt@w:Z1ib›FХUҢS k [m= wGrʮqŔ) ÎУŖ7'߻wbg5kF˶ϤѧΠBő"ȐӪÒ-ɛ;вVŹs>jѴt̞9˗R,_~~~}S)hԲeʒ,ʚıtr,Ĵkkk#qi~Y͜ϯi͛@Е:ΣhoH_ɶggg~~~,Դ¿ƔsPбoͥktA9q=p<gggiJJb͘,۲k¸a6n8q=q=gggqFsEmȢ[ӝ?զa۰v׮yzYn:"r=r>r>ggh~{wSYg×SԷܺ̚[xŻe;n:$r>r>r>r>fhi~®Ƴɸȶ wh̻̫˵UoY"MZ.~`Ǘ}^ąb7q@Nj7 p=r?r>r>r>?(  ooo煅億億億億億億億億充tttiiijjjےՃљ΃ѧ΁Ѻ΁Ѽ΂scѻfwaGtEѻ{6cʼz|boUvMhtE ѻt^Q;[0o;D/*iѻwp_[(T8Ɣ'͝ѥRɖ+ĚQӻmRj<ӺР<ụ̈̀MƛGlмy{Mɚ6զMͻ}pB}}}:VΞ۸v͛QókB;jwww-f×Bɒµvk5k5yyygFf.ٯd߹֬wûsC ;p<r>yxw~Hιcl@̱͎mEm;$o;r>r>launchy-2.5/misc/Launchy_Icon/launchy_icon_mac.icns0000644000175000017500000011571711336342311021537 0ustar monesmonesicnsis32ϯg[s_ВXBb}ƻݧXamQHa%|H'`k%5?[^EnB88:()׼0մ,觹ց ܹ/裋 .ꕍ /㇏&ܿ ϩ֧̇빦ަ~ɩxy㊪]ZЎKjcjdjiKƳǩ*ܿջ0ֵ,觹ܹ.裋.ꕍ /㇏&͡ ӵܸͥ۹Ǵަտа阡ɶaԾoqμ6\ZZdb̯+ևԹ/׶-覹ܹ.裋.ꕍ /㇏&s8mk3aR"PK  44%%)52444R4Q4P4P3P3P-Eil32 '(Ⱦ_'#Gn;PYchK\' 0D]ΠwllM' 2mM3VYlkǷ/'+XpSN=),K~K5b&Pߢ%,krͽR@0\_PAIs^!0Ft4w_t}ł6Fj)QG 3kv.!T2H|͠6D5%d2!b3sDRQK}* A:('3# Q|S+L4  'j1lzbJ94D=ǀ92@LK/#šQIIDzگ 乷  ප 㵵        mzT'(ͅR'$ڛu|q' .rǰڅu' /鋠^')zͽv=).t·{&PڱU֖魣¨y@_|ˣ}4yưk,~xmp1͔X5oº̚X6SĮ𝊣սv::n˖}ٷW;Bsz}x˜gO29]{˚gC38KZeroR@繋˳uqkَ .魧ܲ Ч㸶  ප ߆㵵        mzT'(ܣ}'%ɨ㾢' ,Ͱۙ' -''=)0ۻ&P׼ǻɯ@퇜˼iγcʹlϾûdzroǽż֊op~ɾz@% *kU#S籰F EG" \mp '-&'&&&&&&&&it32IMWfq|}I.,48AO[fmvsk[J8.&" 473"%0>PdxإjP;.#Lu`An# (7Pi٤pYB$#uV :H`r ޝ{naG1` Âu7 X}TbrzwvvuvdQ3ѻ7 `N[i{戂|yutstuuz΀- 4[EP]l̀|ywusqrsu π`->f:EQ\rк|zxwuspprr ʲ-=}1;EMU]pvotwyyxxwvutsqpqp 淲L:(09AIOT\bfilnpqqrrsttsq x ʲu)05(/7=CIOV\_afimoqrtutsrrqЋ ز)c&-4:@EMRW\afmqtvvwwutszಲ)%*28@FLSZahox}~~|zxu ޲QK%*2:BJS\gq||w ݲuƚ%,5?JUbo~}{زVuI )2=LZk|zʲ-&%͹ &0'6Kd tkea^Vل#'".?Ukb_][[ɽӽ߇')'2Ckb\WWVXXͷĉKx=(3ކg_YUQQRTWXî7Kin(yz^YSPMLKLPSVZ~V܋D^C/ȑROMKHGEEFIKPU[^x`uJA#OxYC>?@>><==>AFIMS[agu`fʍx"2"%),01357;=BGOV^fnsvafuʍ4!#"%'(+,15:@HR[cmv}Mfʎ(> !#&*17@ITamwļ,fʏ C?* '+6AM[ivʭ $fʏ<6 "*5BPar㝠] 2fʐ2;5 )5BSg{ԕ tfʑC;@ '4CWm(sK6cL  nfʑ9Z $4EZp ZE2#Ox%"$fʒ9 "1DYraI5%,v}"%&(!'fʓk -BYrdJ6'Gs\ $)++*(9fʔCA1 +>TݨbJ5&!*@`~r@)$"!"&)/22--&ifʔ)?z\'7L|ח^F4%"*18>DGJKJE>7/*&$"$)/5:;731)+fʕ?Pߑ$"1A[zU?/# (09AHPVZ][VNB90+&$&+3:ABBDEG<[fʖ?6޸A'5CͰ_I7*!+5?JU_hnp|r`RE90*&(,3O_pȜ[G7-'&).4=Xՠfʗ㓄@,؀/=|c=5-$'3AUgzzM9.'%'+/9Qfʘ㓅vT07SUF41+&!(4CWjՁϝM9-'%&)-5Jʁfʚ㓄9?,-)&$ (4CVjѲL8-'%&)-1?dپKfʛ㓃@jx, '3ASe}ȰR5-'%&)-.3Fpq5Gfʜ="θZ  %/=M]q͸V2+&$%),--1=jzuR+!fʔ)>D˲R  "+7EQ`ǷI-(##%(*+*'(HNSRE4!:fʗJ<ZƮN '/:CNy/($ !"%''&# /31/' fʙn«J' ")08?kn&!"$%""$fʜ,3k_ ")-1N{C  fʚwiv2  #(6ywtq` fʗ,-Q`! #TkjhgW  fʔEX&!FZVB  fʝJ$dX3   # fʛ,Cx uL%   <fʚ)CvxZ9"V?fʘ)9j{dQQPO `s> fʗ)B_bfʖP+>Zl}tZ8fʛx)1fʛk)fʚCfʚ xP6fʙ xr7L``bPfʙևffʘևffʗևffʗևffʖևffʖևffʕևffʕևffʔևffʔևffʓևffʓևffʒևffʒևffʑևffʑևffʐևffʐևffʏևffևffևffևffևffևffLJffff׌ffffffͿקff¬ff͌ff͌ffόffόffόffьffьffҌffӌffӌffՌffՌffՌff׌ff׌ffٌffٌffٌffیffیffیpffkڌffffٌpfff،ffwՌmffhwόtfffHxHt`_ehozuh`ZWUVeHOcOHdWYbmzὠzj`XRNLJJILHOp}iOH XV\j ʺi\MKIIHUvOH SUj üu_LH} ÂcHRQ| ֺwһcHLO΀\HOLc ܴ π}OH-KKjú ʲ\HKJi 淲pHHIg ʲHI_ĕӋ زOHIIĥಲOHH)II ߲H(HHwɝƍ ޲HHʼčزvHH&Ϟ˲\HHHX˅پOHHH֯îыಲ}HHQב쮬쿲UHHH ̇ꭨέHOHHI沊ҫOHHpHHIp휎 밪ƸvHHلHHIJ ↓¶H߇@[IIJK֍뿭мHĉHIIJlĎ佭ǴcHHRI Lހַ ĶvHH܋+HIIKLѾ¼}HHuHIIJLM󝌐.}HHfʍHHIKLW򕊍~IIfuʍRI JKV⍉5qIJfʎIJKl዇ľjJINfʏoHICKmފ}^KLYfʏRHIJKk䕂ÿ~ZNOcfʐHHIBj销~[SSfʑoHIi(ȴYVUfʑRHHIi~ Э]WYfʒHIh~԰{[V[fʓHRńӲs[UifʔoHRғ ѱ lZUfʔ[H?ާȯf]^fʕRH7y⾍໫skfʖH?fЛѯ،fʗHIS9ߵָǮзfʕݷʨHIր8ΟиȪ߷͋fʖ٤HI=J^۶îܸХfʘyHIIKLҤ ǣࠧfʙƛyHIKLhТܭwfʚԠyHIagAMA7tEXtSoftwareAdobe ImageReadyqe<+(IDATx} \UګzOw!! [UEpQDG|7Ȉ ?#̠o $R\>^0ui&zuoa6~kܘSrqk "Qg q顀xU8hjbati?zg/ m{hGWx4}~șH%>m`)H =CfbwBZֹ(ׇzC`mۣ J?ѢF6ׇ=ݻw¯!̄jJ~P# ^{<1GqçOÝoљw#q!%sZ.) A҅h?)NR6|AzAtSNӟO]aDc5p`m ݥTBX( \.lݺq yqen?pDT !_0u{ !dZJeb7+0Iqtf]hMi)XkYg@H჎)"w#z lLz~+>t˒} Ɔjo[5/ GkNjKchoo|D4~V셐7@pz}K9bj /]ynG3b$H[Sƒ.0 -Ϝ;I#!WDs& 傇Fs^vȐ+*Σu{8v`wpqOY5$"|R;fL*v4$DIef9f"|r%@cwQ6h ~*wF `iܷC&,R MG L:=ECC8.'6Ie DI$ EjTή#Eː,$SzKy^49GY6gBw@^`Z S7?_8pͅKEJtYm~ɗWjB FT-BywC{xIT&mPNnٗpfCS·ojDP  y| q,G`(Y~o#l9MRRJBɵ/u|n y~?&Ms GCu(ENfa<7NcRȚh fLeű GZtױn+u]kf-  %G٧7Qe pY>4 q#\lWѲA`9``@`YoK9 (65y.ɾ`N@:|H09L^|BݻX4ҽ.!ʠUiˏ~BN ԓ,C,('v@`:fa2 fyĴ!AҲ\hxa<ڋS꽂儭7 K%F> #ɢ ">;`TF9uf\*`&"bg2u@_0 Z aAYK4 3?}/+5ovזŤ"Dpø ^A#<QE > bA]έy8}A +gG!@0)ە ;Z,d_q0@?7HY cL0or9%CRHZi 'ۅI-,sy!`i+I 8~fK*0:E!,k ̖*|]𡓴9]BKѵ 0% Kmhf&, JMi`CkE|9 uA`&D&Fj n]5ǞFTy$!A G_|`XGWX2UMxf!TQPXDEؘk9𔽓Hp3o- xӚH%  ` ǝRnxD(DWJ dTXMs6l*NZ*ƞ5Y"@1 HH\ K4VF~юTWp -X܀S#챵{S~Nxn9%,[x=)Y?B`q 3ϡar咬iWqˎA۷iH`s5N*1--薌69{( .vUhˉ#t~^JG,H,prB ੄{x}"W`}g BÆ5GB[ f ju $:Z" A+Gdb(E91N?skסyV#̜{dچ^dٴ1k/ 60{pU"5 ݋D YAP#y%Jʨ9 Z[[h4@ 0__a3Fߜ>t[|$< ^^|{]J XI ,^׃m=on{1ϟ܂@=()AueXD\/xu'π! tD1u,If5Ko=ɣ|>ZUU{\4U֛pn$N_:0n~_ M}i\ټ*&x0 _ћy.aR U%ķ PA E.@c'ޏ^N`Ie^L6,kQ.bPfuvw b,G4֮UrOspbф?{ n^\tÔko{L^ )!x.=?H>6TZu&[>'Ҹ^l%sVJ!"h2U؜HS ̀>X+4V$)y XY1C漘-lf?*ϩ ɒMiw vLꫯ%KFፉo sy'Kp~\1g<"w|.wqKXscqč]idF* *fʙ2 .IIh3xz}\,1 7-xE2Wk54T'2Y水Q~<};˿6sc ߽|K|/%@^F{2WM7pӍ$O,5ٹo cjzU㯉̡&/Hba 5$s'3B\`BFEtk(ME+aHHX-4v0 )3I$f7YR϶dBk~~񟞷4ʘp h\*b1&,YId wKVqnvG tr:kcVU͖m߰"Ui~sPU/&xדg{=QT/ĤKgΜYCX߸!:.Ok&h\u3Hؙ:,k.kMU[s rw]T3 wokת5! ~DčqEQ2D.+8풕C\\P&Qz,EUЃcBX57VABRzPLO% WUR9~ uTL!ʋ4A6](81ma /0~gh`hÕ!ҳ6pp׷ETKjx+/|"j AUސI%eDu "4ȫX1h 4jcgؚB)i!T* m(T1PfB'9&# -/|G.sSOǡ8vpؚ$+G$flz 2 \S؇{/ZUԫ) EHCp4E>洲 cX\"ẅ7^iSfGԂx9Ur$T.DPYDE($#}6Tщ)Q:( 2|z!)jZXz8!Oxj)IW`墦1_cG;..wpǖ p)9YTAn&MQ/VpzÒ /.tMkpO=yQ[&2&.E c\aju)pU9h9ܴ%F{b#WD~C)a;o݉n%xK/AK@.ebO#5#3Jm/fM5V{d_O[9S'tƺjQTmxEI\jJ_z]xOgCBdZ ò_xxS,|dp9NwбGf$e9 d?J`EP6s0Wy>K}ύk'Ňi7 @DŚhE@0D8zqynܾ-*ͩrf0Ow@0`g  /(o?_c˖'gGG {lP 6"ḋ k"u K?䷹t͉ڡd;evZOv7m n_s2oįo!rtD}7"#wgpyBirA 8PL٤mC:=6/~gOy)E"9nuqV^pP *pwn'V%@߻z,)ܘ\t=38.cwW_:xnyw7u7>.k<pIW$35 HƠ$MI@ O BH~: $ExvsWKD9Ǘ1+[w.W:=o䚉FiX`>+><$m]m>mX*2v6t5 &.\ vxZ@Zu+.\'5|m{zpO~=Xa^#|(Ν䛜R=](%}J֐DmZN7@IW8\pBQ< m2O9oWڛGWV&pvU py_wNBZWYğU&/еnO vy n>y|Jy 3g{8#lt3ׇO7{(౎<7M!k]&Ea0Sf/YvM 33m36i9P>XՓ5 -/sW- }gq FVS6~bgK޵c=Yu.tf-*dMluSjHoHs M:>IܟrAV.l jWv ЄX4`a#a3y]٢ 2=R\T"_Qd +CY|2a(d$p'BC?mG-8c'= Vt?yp[:RPhcb8~^5VbVuH*"=ҰBv Ry D,{r)djbnSj?dvd] 5Dga7ݤπcFs?Hl³g<{5WqsqP ڇBΈ`aCqegJf[δs8 /ov$>9Ϋ?H\0uOzzovG?zlJ&7$9: ?fVQ!VA=E,(\EH3]IB.58K}č9x'݄-Mh#MK 0I<1['Q3L(gmA ~i{2MMO&!ዟ#7%n*bn:78d{ ,pO6Z':u C  k&b=cX}T~E]G,iB4;n+$R_̽V y6I7zzݞ`X%dNe׳'?N<l? T9DzhHИ wKiL6/ac_ ܇k ^TlS9r9/Kyn:Ly/c'(`30а)`P _sAG{APWWFbV𝝝#oT*%%t@:W^nc7]3˟n7֠lv<'M=GCNXe*u4CeN' JeFc 8ءa}\6ԍ 0ඃ}?L7腕o>X 8 #S_ J]ۡC7F+(oߡo\MtDUQзar1eB޸=:::8̭Gx{{{Y.Lak`0X!n~ׯpZ{F?ӗ5qwˡCǗ_~ohB~̓;~/^cVJ~8L fq&h|e0LYor}_iJ< (6k]۠Pb6nI#-|n#[ȉIENDB`launchy-2.5/misc/Launchy_Icon/working/24_8-bit.png0000644000175000017500000001017710673376524021016 0ustar monesmonesPNG  IHDRש pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FPLTEǹ뫭歲顧;u媳곹ޑLzOz=r4`HpPt?t:kAtQ{'W+Z.Z3_6]kZ_pPsr鐥M-gB&RpW^wc_h﫮 Wl37B>Up׎ᖲČ ,,[TeSyzwz} q"*<;38D:_kdjȊ~}}yx*G\etg϶TY!+/458AԔŒÑřױͫбгҸԽL{䗖´~~~jjjNtRNSO4IDATxb0jaA.NJTWJ02^dAHi/ObdBdB׹$U)Mq>hēWz8,MSTVH~t%K #KJٸdϫǷ]?exv1kK&͛ ~~䢐umUs/Z6WefgLM+ &o ܳy =}p6rhSm3UEoܿ{#gNN:iaׯ\uIB{>ׯ_~֣w0[8n"$^ʮu ܁K` jȀ"ue R& ~pCQ?_ vu{^ *<zIENDB`launchy-2.5/misc/Launchy_Icon/working/16_32-bit.png0000644000175000017500000000153310673376524021070 0ustar monesmonesPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxtKhQϝgĠVkB"Z,UDAAvƅ7B>nW@i-TŢW6R*1[d=ä'38Ѽ`uJ6_(+P^K%ZP|< 7 M!|AA giۆHh[绦n:(VyDXyEˆ; "aR&q3\l DqCdLD\y`ȄQ=3MnjӐE"qyLGp`UM̄C qвhb^< ӠncFTBZ -uUFxz(t N, ҂78X zAh˸E97䠗~aΕOD .jM.+$J}z09V{g H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FPLTE⩩~~~yyyս՟袨馫ϵ窰7n㴻»Ų:r9m6j=rl{Bt DtHvM{MyS}"R{%V~)X2d3c2`:dBoi[}g{鍚U)g"T|&\M H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FPLTE侼ջ繼ꩮ$\z4o,]4e7hOu^|c[t}zGxaS잲)d9nJjRVuZC>~yk6>LTzz&'-=Ckex85v:U`lzv㱫ѳ6\cœtƐɞ䣟Ⱥ}}}uuu tRNS2aIDATx4NQEp(xpP];@[\Lf]~JsSP^[;mh*"rx<*j, M.)r!>|}pCw`oa3I5cm-͂Ǭm,LU7,]]Z*ƚ8֗!{;֋DZK 8&躮\`<=)xyx@c׮lIENDB`launchy-2.5/misc/Launchy_Icon/working/24_and.png0000644000175000017500000000027310673376524020631 0ustar monesmonesPNG  IHDRשgAMA7tEXtSoftwareAdobe ImageReadyqe<PLTEU~;IDATx1 ?m#`> 0$f(I phg(:B *CX1?5# ^8b|anŇ8 %2$ ^+0 JC3Ѿ 1|>ӫJȖh܉S{u}΅# : $ 0<$:63ݫ#<5747Qf>s6t5”y,7]VYB)jW?ؙ!JQ)tm]b ( 5 Di `to L&gq !>귽D"!kxvt`?qXFp---6Č*Rԭ 2|kF4Ȳ1Zc<9ƞx ^8mvJ3TgGšENNk>\4Zl{2&U%]הWԌ3f428sQ8_BgUU4p~7~n. Un˥Rp]T0K~(=왾T[$]|U7Ϗˁ-[@TTTBPaWʒ#g~ԑ r,j\I ޸W;P4p 3-Q7˃j8^X68VRPvw>ڟ)ow18 ^("`׃:B@6yBIZXr]k8z9%D$!P) b *jZ<n?8.(z)Xyϲqsm'Vlվ/OVI j: 2Xb>9U  ( ,*sx=/bwO62F9ȴU^tTa fv9Qut4)uxY<{:•'>GN9ȻP$vi-%X~A.ҏKf 4J(p$ETJk6JB. $~@8r#KXvRl~d|Iҍl?O XOt0uV sφu.,m,ÂZ6C" A?\44]G&C,@:bx%jsE]T*>C4q=1DJ[Z_X1mWͽB0\<|6HiW%TdH%\΁},.('3`_AE.N{0[hiWu;jY&g-f[RSS#82ǽSqǡ ږlwwjPdU2(ՓC?^zs< X70x< N+A!EI,R#Ur*988eg+ۓ{F֧6aɬzS*j3 S_ Y]hhh1Ů۬9zOGq1OOV]DwQ<$ˡsirME.u5AU'[`RV/"^:{?n} |rY2 VNL(u?HqN >LД,E 3 r,8L9 S1X[S-<ǍNⲲ|2`##)'7.wƿmjn` NrƑ1^U6hGE|PÊ"\)LfU}8˄y>X8R$W֕C2@5c鏲J+uKֽ(QZ|ywPtZaqd tKe6xj B։ *AJ6D#اxu+sn8X e[w"O݆c{"~HR_zl-Nb^p`IpYx/h ʨVvE^` VG'!CNH8zj~>PNNy x7? i#*%̮nن<*q? Ce*8ǥdάvOdb켘Y[2TЗ7qc/w|Q/)p Va|-:|_O,~t>IwB ȕ4SR'#ө)[D;Փ,b"uy㷒؛}.BN~,F֮y(RShmxrF)9?cHAjv*S,k|1Efg? @#aoWr;+'NT 85S(}-"ލCxh,\Yö$vsP( BxfĭH E5e#R9ǂy9m}٫޽a^#B)|&?tzhpfU[_lIsLbMQR=pElYO;!8DN [lHi!)%dD7A/L{b . C'$*lfq6oCو5 $x'PV/h}갱ʼn,c1RE$~)J"S;.pهCJlN49 CUi葓\u 0^1 /qy HIB6AxWF zX籼:Z+ uP 9"-q%f8 ,2gI!1A8D [E ˦AœS~f3x.8p·sYp‰:3H>Ef?V~@@<&cDzߛ ( ÷ܡ'(dP!̩98Mcճ״>|n ފ_=76[H4H$#Y)eU BUeRZQwEVمm@R/jqR3-~(U+L†?K5>2> S;M ':E:8pUpInxȅW3XW+ XU`:OxAtD!)h3%6/ѯy5&A sl}b%ú> c#Ñ@zýY~5h@Y)_:1%3eY7|7C¶9n8^B5IX<X~o$$!"L[vEܑ̛ԘGT 'N(,DXDWW4~d;1y A-Zq90?ݘ= * {:ĂƂ7gϛy Ns>,*7`kr9S<>J>:qF?$a?zR3!|,$D`u~t v ؏3E-ƘT48OS13q}0f\$B^nt?ۧl^HD)FS줗D"xm&DLOFtkIENDB`launchy-2.5/misc/Launchy_Icon/working/48_8-bit.png0000644000175000017500000001152510673376524021022 0ustar monesmonesPNG  IHDR00` pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FPLTE⌌ppp漼㸸߼O EuƔ{d飤4ڕHwm Gvz]Ƹ:-<}ezΩ =pArzƴCu2?g 蜜L"'Xnj⿆B#Y.\V>qDzƤʭI羐^nmv3{DBHeځOS_jz­w|>'ݕ%jr~bRd!pWH6Ar("1FP!Xi%Ew.<^A&BX*℄"\ w7$c!^;n|xfBsh4~Yиs,9]H(BA1 L !cc LXMoVg6>(⥚ @e(2i@o,6Wڞz4Hnd䢴4b.\|lzxq0 9/*UDDrQqcF ]]7TWyGs?/*Jf:$w\@w/g5+K/X#BV'7/ჼ, ]]aa!1K&/O9;X3.H2ājqmk))*.LvmA"G1a'&,:x%_=z"E Ζx0)'{Z-2︌ m%:HXC/v?gv{8Uxi5P0$mu|]VuẢƂf)=ALL:𪈠YBVaNu:oǖuxGkֶoŭ9/&:HC 6?8;ҍ9- C(2c,6/k0fI$oԎl<“?ވ]I b"N$Г*, La6 #& Eȕ(4EV/ !Un555?8nlF}}= I{cI|ҤPaL`lWd M?r`717Xzq jkkz`dYE  O= /GCsE@*FƄb֜ypQ}J> 1&&rMq*.h6KܣՍK:axZ%eذz>\>֋?~N (k k=hwL)/5Y\plYɺ6w鑗R9k9&HP-ᗛW {6Sxh^fb$\u|,Xp\2oEơ'J$cTr)9KeTqʖYر4e䩆N^xѱB ",WyzHg=ΌbE< =܁\k*6,Z|&w&q"FŦs1gqBGh(m2l?\xpTO_PokC3Os8!)ԓrqX |mXW+g߁jv,Z/slN8=ӊF<Z Q-,jIk `"t)􉗑تbs dWCA(H46f@TdZT):@8LpGy 2}/]n`fdqr2B+8ńï1I;*iߕYߖ]!3*KÈd2wiRP@]3 [ձ=À0^'xO`vSӯS7uh( *iBPtcC3 k"Y` +fP/X E #UbJtiݢK XW'g@:;[H*ڝ;뭀m( |TjaT44Pa` !H$ H;ؗ騷4g-cB@"(1 vYQpM|b>q22h0 O3u02ir2eow & ~]pc -DAzxd&*!L^ ۽TYqX+w?]/\tv_6ܓIENDB`launchy-2.5/Readme.pdf0000644000175000017500000050703111355675363013763 0ustar monesmones%PDF-1.4 %äüöß 2 0 obj <> stream xZM#7WyN[0lmBNI6e~]O*{f',x=J^*ya6wex(ix>h0h_74.}2^Ͽp>[dY铬稟g}|'O!u)CL-Wi]~rqwhbԍyv[G:Ø>f¹&. %O~ Eg ÷Lo‚h?N j dAE},n(.SXikvM\4([$qK$S_ծi.xe=xW%ڇFN3^}g/.aR| Tg!>F$2ʘ[e5o%Ҟ^H 1n5@&^~ZdK$џDȩCI3 q}:MÊ&t)3%!\Ijj|AJϳ A\ ۈ˝ @HGe*JvqD}A8WBɃ#-o$Ľ=Uip=B]&Z; ᅨON @THYOG*&T'!Je [p~Sx=;*uGp`>Ot:iCWҬgd`+$Sǚ5YmR&4ʾ!|r?<:B1ڮT`U}>V~otW> 9AͲy2.-S<W=!CE!=+.0y/ҦRX\0</UuVւDCÉ(f3$34D`tzJC`W7!>2ϼlRrؾF/om5~q+nY7B]#O)mŞFrE)jkj(n~Tb·'ٽyamHoqXik ,tY\՚R.jG<,T.6 b#X*"zD hB? j'hdi0HKN}.wEq @M~+ͅ$'6 2&.(qErȶx1i&úb{:6ڣfG P ZLVl֔1,,+`lJִo7:QԆ;)yX#nNcyTJ^R/UbА>Xk* 6eS;rBm Pɝk*է2EiW>^/D:[-QJq}jyelpJTs`AP'a\N)XpSrk6Z!^az$dM`C. =ƺwn8I9M+p{'棂iw[qcl4_{LrVdIМcU@EKsn;npq=uURe9v5(F6K:π3E)Ηg, Z}{Nd{SJrugK$ĭʮwcšs93"Ǭx 8<0ܮC jH+1GW-2tŒX5X.0 IQR#_a(D=|}YVGwqr$bI5ތ9q\UBY8{ˉc^N Jo hIE}oV l@Q.U/{ SP4;Efx^-ӽ 1zK7셳-o34MW+]*~; B0!N=pPOSЍ ~?'cnIkŽ6x5 ߍ%HFTnR䴓hܷ]ܘ0mB&yoE*O$t'nYaWtx!Q0vEnjMܳ\1bBcHmHA FDqEI\T ?qk endstream endobj 3 0 obj 2293 endobj 5 0 obj <> stream xZˮ&߯:Rw HW)IEUe"e6 =Fܶ1uqxçq8EH{]?:ܿqriut0q~AjږQnu7z\ypklin9`ړ pMEwx,%` cK^ݼ$b]=5-+cMa|al꧷o_no/ f1U:77udX74rĘ߹%K|, i AR/8Lt{ VnftlW.`8.HljͯQ~[OUr4^^񃩫G[[Aq.-E>ukCqNʰv{kFwp#:"nN7Ħ1BMY ]M/* %pKaD0fiu=k*߆g b8%Ox$3zh+5n*=\;3H'PMTBD.*PNۜvkAoXJ( B:X jY)戲xUΔ;Uzk:[ ff ]ciF،Ykؕf(9c1 Y:8Z\xO%t"LUx"&ib)fDA;(9h=We Ԫ3 k$D|W]Bw<{(W 9IܢޚXa&4iaz@n1C#wu &O@S+ 6(@'͓Y8 rYV,H$q"2 ` ă1聏Db7v׉PxE1fٔ_qJTyǩ'8Cc~;d@C0Nw#)MQslSr70RsJLƩ(' ISM4ױMK)Ӷ/hwԑC~&Yn#˜X'Fg Jm[_1JJj˒,NHp~`Ĕ#[_MUƎ%-/޼P3a}1 :Shrr?O {d Icq5'Jtdʪ4KgO6YEJ^UfUJoUP`_О#bE"ZLpDvN :+#/jlf\[kKXXI~6x,hDNJ\?.(*)/ت8#EKm̢ u\ phjh8K)zx"ycTQCREh ʀPT䎶U_/5g❴Ѵʣ3xwD PzAd5,}iwv{#85 M+vȁXZqy+da%ˀl-^iAHHY.²t?ֿ?G}2e03OL?r{U^YJv!AM(S9}=rHyLx治8@Ym ddT$@$Ф $h俧h mʅ Ҿϥvό8T! O,E*Rlh|%փI?U)mb άsJ K\>YIShWb$ &ƭ}lp֚\5cFN&(ѣ&Ϝvj㓧&`̎ڮhYLM8P`JC8Dqb{t ΋.nRz># FW},j|> stream xXɊFWy@ܤ5`|{ w,)0M )x/^D.$J~Q~}pZXEk;&KՍ0F][%qO/ߔVڰVhS˴x)>}Z<~j5T?mUZ|j;k=rCǡWէ>#}-h6FcH qZ--`7qi cr`&aBKqpF8rNeP~tQOQ4mxSlX dSf4wS:e&k>le,/~Ҥl_4p#>+rLtXAQ[ d `&Q6ZZwu)uD0M\-9HcdC4eݰ!6^:)b&L,m>%$`H0D9K),hͫkgnnfg@8޼8wBA7 l5V{O1q8Pyghü$;n`3 XBUw f鮶!+Po); e2H, &;tCgQ;C {d<_jpJ{ ؽS" pSB ZljG?CYcmBAƒu(1,wUI]Uf%l+|+ʭ&e¸\ endstream endobj 9 0 obj 1209 endobj 10 0 obj <> stream xyŝ漙s={`_Cm c f<$цڅ$ZwZ[{KHm}kV$2|/#2#]YUYP*+ȬO"2b˖->}1c  _m-\~S8(gyfˏW5[o uo-!yO|T6[}7֖Ю'-8ၤ6\]n /̙3g`ҤIFo| [sJhqyJ)tR)/S\Ι n8bp2'ZlնlrV϶ H`;#r˲TĢy6u8cC5y`?"~1/g‰H$w.hY҂|B)& i@޽ǎ;cƌiӦ>bŊقYlS\pN$+̝;wW^Q/k9lM<;k֌3;qS'O///MHis?sϏ?a`8J֥vg}vώԌ9rĈy1lذC2䩧z'?c?c$ 8PhJ{gd]ҙcH:>x( M8 %:z9V3?xyPeЛ]w䆻Zoή8\@ Mut1ZgN=O.]F'w˓ e8W y<1IStm*K<#1B@(Lh1 ] ѕQ@gU%t?K'{LLeLd^xiEn"ڝ]vɴkgH Nx[75ҡٓqRG4HΙtI/s^:7"g4X¹9iJ)GM4w9SOn\?!]f͑#G!% 4孷$!TUηt樥^} ,Xp2|-AղMbB2g wBLxA8g;ӠsB䩮dXz@)3 %AsIaLa) =) *! /zdՃI@jPJ-0x[*~Y[kS_-Us;'T!h`8XUAky[FKo'2Lȩ!J&Cطoߪp<\|!ۤ+VZrJ;w'58zzzc)XwxOtDCOt?,/~pNr9!8O8ku-ֿ[|sPMz1i!Hy[^S;{!|l#__he@~/zoD$,omht r _kBLH$̙;N7:CziPtCnh BŁ׿R+ ^Ax9,h A]YA5Y5I)Dhѷ/EɀWɰHWO:C&UY"Ulrh2oF{XA|o5d]ĺT\rɚN[q^\7"1~X`E8UcEɍ3} OMeTA^㐁xDlcyB[0Zz4ݻw/guǞxiՏ^lO;v vзkC.o鲩_7uz_:ݿvw@:0KtOvpF.fΛvطkr5:2Çg?ЀwM1nU뗯nXjW4,xzƊG-TTn N .fKճl iEOkWxYD©T()olt$~5k$,Y I¼y`'^3ye2:xww0D*U'nE/ IF %Z* 9Nh謆I\ҡ|bmi&`; H=b3EkX:T4 _oyvuߛ+]wū]..Zϗko| o7\V0 hs*zMS oh=+ry?_NkV_yo g!@NJ~ٗW^f7sw==sѫ?>kχZi(֭[~}Cnr ASJ%Ë㜘Ms6nQ E$\q^YU@CpM$ k׮ -~^?9tIx7ɁjH?3FU7 47ˁxvOaE^dz2Chh\bY *FFp D" «_IB'֞Na;lЛE[ ]DtHI;dٜ8Y2.]THuZE&  Z)F[x, tO^;ƨ ZzS0 o[`yq.r|AŴ^<ܥאaO{iL8~t8[=;fvnwټvo~k.U?du%4V^, 6y675z~tɲk/5i+sh?Ҧ~pkd!4I xg^|׺Cn6 _)[~5}ˢ _hl\4F/!C7obDd82q+C$wH¦M"H^4HX)*,\;[:!, AXE?ׁSСT)<$!{nvЯA=  &bLfUNۼPC2^ >0v4YSGӔ*V`uK}#3AI0 u^TUnn Iq!tٝ4/ ,'! ,:U&!h+ps(?G##--ٚ5jW?F[mV ])нaHT> R:L0%]΢k:u%[#<ܹװi Fmy~̴vhw^>_~{᏾GZ^y_K_wiun^hG=mXK믻tue?tE맭̽9?άk3dkh!0~q6xs!PÒd8Av{i@"zi6 >|$O#FhSnF>=F3ޜ 3~7\9+p\pӕnrMWtꛮ\{ӕ7_x6ͷ\!wܮMm{|ohU+orX›|&g[97~o|fе!>5CJm' a:ercg}&!nD CyY;(C 6‹3960ܲzb̈́[oaIY__ aNikvTٱ)<%ٱ1"-]re}֤Ww].%u=se߲op-޼ޛ6w[ݴ5\|!0"`;'\@vipip0f[!gxsZw2 NgJ/u 3EK 59y;v,#Fp%zMԣ N T p*%¿ }eAP=#Z# w|a5tg0$A}c'K znT V]1{-}#t莃:Mʆc:X[XKu'4ӁYFBF`&lpR!N* ̩vkT:0Znq'l. 3dS6iީb7O_":a~A6S θ tӉ/(cNG,zC DY"둗VDB(fa" * pk no !"{y8=~zAcbÿڻ>2=b,*ԦtVh ]92Q|1KCeX _<Gֻqv6Ӄ"w)b!Y-"Ox;p~D"[9ҼT eiVU ^lj΍Gt6x0iAV!XTybP>vFuTa/ b(阒qH% ;w ۷~sL>oҔe/4Y)n<v/_W^^XߧcC};n~olOivvR폶h-:lvfZ}}=VqSkF` qbK,9qhpd/C0ed>?\󼵟g/ Au{0K޷&N 7 G~:V6e?7qzPڝE'_ LweVTt\ڈx3=8Avah0yPq F9I6Ѓ@+\=6k`=@3{ׂ$y1$&f]Caf$:L]GwOIm=YD0 xCޏNAku̹/P^W01-Cz7ά9fn (?X{dp42"3r;uVU 5nT9jM!o <:p ł*# whȚQчgG)xI^=!Z2[oC~]{ؙ5m I oQy[v2}+ϧ4͟v5']8SNt2tB,.Ӽ`Z~ 4Ι'˨(}!z G Xhaie9Av@lqdžq-w+܎B;be;M~e'̪Fٛ~qPq3RÚ utL&K=[v(t:=|駟QHtk{huNdqLd={& ˎ'cBT\ F; 73Y zh['-IGBuP l&< A3$C?=*:N» xqn~X!daBm B{*) NFQ QPIU0Lyggԃ|2R=Duw(@  fYjwq hyUf3R@]w !*cvWlq8B6I=b\X $y_jxkw”Ip%zz` #t(=B0ǗtЃPC0$!e=^—a1lh!h*%$A03@H!,3T[ô(0NmNPal(j!!N0~LO?Hˆ5";Ei&<%D Es4ȱcǎfY0 c_K|-\Z5%=YGnR7IO7YGk:8|dQ͍Nl۔[5_[7$>#}R dž^CK;NTMW_:򢁢3t&z/8 U@sdx3fV@To-@ Cs/ӮH?1`G d&ȗ~n+u6z` Ǥͭk1 O}8h:yFd FQ0{"}2[ ϒbwiӧ:gL6]&V0#̙JfwA NUR?0BXKE5.6kՋfoTͲ6laec9ϣ6Ǐκ Y!vg2ggŋvKtӃxRܑbxh{jhuЗU+OiӗN?p6A,k+&V^-r߁<$~k{uKI ТͯYrۈa8iHbGCMu[I w2dquzw1b?@κq)lZA) 1PPjH9l'[#1"HK=`GyfSER #u2he! $AP + ^BT[l]r>CFH~Wߠ Ec/(u@t@ӎJT;kh|` iq6t&FsL+[eq1!Z0"$!!^j7 O BBülB:eh9+]-k ^}}D Xo"\D񟳵mUl4]B֘.7^JݼX3_Ilz1ISҎ>V5"xTA6ۉ]f6YZgrq:kkaC>Y~;Z|5?P #hz aId\jO9S"֩0E$iN A O# S $ZS`4C (UP++ylKj(iB;Pf,/5vOR \":deoB8J@JoNZ:uNCc  @]~{R@Sq0'-!4Z|̯!T,v {zOp5IyM:(̒_lڅIBhuԡUgVvɖ)-5桃%h٫} ڈ' f<6~&!PF}ocq -)G+',=3WGzKE63f1%A+L$DΝ;oC{M^ʺ `OkP [n]䈑lrpm۶ocN161TGLfhg|K}]p h[ϝ8OhOTuqn|S_v[xggT'_(O13 pXF / ~>^϶ 5; uUA$L,5rq*B ǼV舑]l\cJqg:m͹n,TZa˖"x-z= 9Dqe>3kż2*y@v:.#G$4) 6{!# aʔ)J.\ A>q k`@Aj C!me!HI0 FLC `@Ab!(I!Tf |S!<C(5ͤ1 !vEMu*v!*~ZRiϟs2ya,v.\F}SRxIC(5?yq(C(!B} !ZyCHRKrm_1 P>eyQ".!4VV6ub,7^:#"ٳ[CM9۵vxys%7CPTЀd c-PFCpbC0ϴS%[gvDrh1Vˋ+yosYoTs- QBcXQ~~N-OG8o*;G[srN-+oHsb=?bRX Kf5r0km9OG Uuڔ !jؗy|݌XvG `;@($znR3C>f+_}+QT[=ټEa? )ˋ kLGn fR˶@,b2mQr;7 U O ;wC=;8naSZ}sm&+mj=u +98u;/ۑIHa<jdgo+{fNs)1Q //wᷓ'f;ɾ@hBEZ*Ua~U`FlCڽ/OKwe_Y2k=XNzC~b(C ^~eZS' gTsUI@|$_GsKw{}UƧaP>eyaK;[S'}k9Xr}*g9Q~}7ʿV߸UU'.?5~)8ooUJ,z(f~CL@ 8^?i)ˋp !P^Mo^J/twls#"Z4ˋbšD Pu(&ީ,ΉZi}d#Cp{L;wn{L裏vʧ,/J$e`>Y(otG&  E4DWw//20b,7^:"&oE?zHHHHHI^cƅ !|s=C(cb2Cʆɓa@!H7LCiGPd1n˵?P$XkvZl# (r5 < H;0,҃iӦZ}z!""qʸU(a^ܲ-03fL:T8CPo*/+Z*cZڢBD`Z !/!ҵv }TUrZ`J!{-þcd]tb U?a"tGL|Ul yFBBB*ԒkxT-y'y ggE|k aRLCxW$1`ߋhCV@XNB33r@ډ(n]ÍP~X?#UuFITCX !l M٢4{H Mc\ǽg/1n vY%!WC)a- )!xS˯8`K ~ʨeeXaSm; .4˥;rqs[ \#ɯ!8p`֬Y.^Bb.Vs `T vm<mjKw}t`pݶP !$R"7C/n@֣D APRU!F AU1pC_HI8|0 Ō!!(x 5 04wC={6l!,X@`Ц!$b=!,\PI 04_C8x҃9sh %!@Fns^ueMMM0h;H aܹsf AC6 !$a͓?-C6 !14CPMCH#y7WyCH#5CbHHHHHK^q /B6RCc8rCXd#G/0 dxŌB^l__!tI)#7e˖)Ihnn.b ad~Ǧ7d2sҔimA27!ࣙQ͍"Wkhp 6 p#!!BI! ig?BB4~5s2TeeMNT[YQU[$ȇ!]Y aJC<qZȍVS!,I|<͸vHm7<ʹꊋGogx&yuܢ/NNQ@B*TUuTB )!(4CPp"E-Z|6jq5f6sŋ !B\"*B\ӯڲ,n&EaHHZVhuUNQT[9rֱE/8E1w"74!SF>V/Oͯ&xr慨鸆\4X;F3Q.ቁR܆ Rb?`szE: ؁A! ȑ#jŋ+Cb % ʼn!dm oCw洉Vx3h0,`rf9kr~؄BDnaHH%2bB!05 v lO$M䆠$81ݛ_YakT{$~( &6a" RQ~T-uQj+0$sz`HHJ)`5 (!H=Xt)7+WJC ;Vx@[tb_שqt, 71^,7\h:(:{BgϩlNȭ5x R`Ah ^BBss$Zr Ri"r3$,A@n Yj*% Ō! !!!!;AE {<˗/熰zj% !}3_۲Pt oF$B)!=zTA]]04RxC4_ek?CrF iǎ3!OZAPTCYr ecZ 0]~h6aY Ц!JUVqCX'pĉ(kFQwC06 f&h]),ӦK !V!jo ^IB ![x 7}#F`UUFH =v!BI V{pCX~'O/h%vcoM t.^ԹK oǬCEoԯrk1 Vcy Evm(|6JBSmyaH dĵkגHC裏6 f֓(X.N!Q{68+mp@)3^,1YZ 79}u3vB`tIMX8!7VlN! ĉ9pChhhPPZ1( 1 ]Y?o } w9|X 4Zp,*pBQ]B͢a-@Etz7FRSNb;KByoY~f303!(_؆ S͞=!f7yd(e*_ lׯKb w}82h)[ke;v;!mMzT=AlCkcmTkm!+D{L\Pu 㺈XN:Eb aӦM$ E3L0m ̜ S%7glm,&y1Jtiƒ%fV#jXiH T2?x=iqUlD6 hH! F77|sӧKH !: CE A7ظqff ʌ3k()!P/6mD&@b -3g@iكL–-[nݺEC2F iTp2O>d۶m[d  B)!l݃Tٳ0>9f'?F3B)!{[!-c B)!Pѿm6. 1P;(I!@CH#62V O?ݹs;~ ѳcC@F lo3!ڵkǹsJ2zۈ):B;04RHCxUL@ny-C05  !Q]n{쑒@/Ο?_џ9,!mg({`i @73ќ[Y`uB)!Pѯ2ǸpBzL;J lۇ{2F l{U&@b aGQ @"H! ~+p@ %e !d@fpE04RxC pC8tA04RHC2?χ|  B)!PC6 ! (Chb| Ȝ}?Q羙\B$=}TI!|k1ÜF?qLmXA!HBWj h8A3_q}U oJ@aPf"bM!C`j$LCC2#CyFCXOA;F AIfeFZ fB &@2e9?4ӎ,h1$pC(!`Ϲl BI!xh_}33`b)X2!`gwBsGpI!d}*FS3}*rb ?۶/jۂ)6J ag&+q 0}qwD{w)CȰx{I!dDp kOGSo F2cG{MK+8eK Cp>t 04C϶y6rhH04Cϖy*lkͼ`pʰZoA|!B&ˏ`[MG}(I!@CH#%eR`PfH #̀!1޽{\!R3 !!HI!@CH#%bzRC2FJN<) AJ  B)Cٳ #̀!1j+04R:0(3`iD G*C2FJwN 0(3`i A5444!1GyDI  B)C8qDn`PH #lذ !!t !!0  B)Cҥ #̀!2FX~=  B)!3% 0(3`iD sJ`PfH04RxCPf0('`iD SNe !!HI!@CH#E1) VC `PfH AI  B!H$ )o_Cn:y7Pt o  BCz` @!0P~:w CrP~$̀!6) 0(32 &PiR]zP(oe8_ @V055ƍ;{_JrXd# C۷s>?+,3 ʻ!OE(?0j-vq rXd%!C/XPޢ !d%9CZX8P<C^@H>,UB !zq";qʙc3gvE⫙N2}N<23yaRmͼ^rw|};~ef^g>3؝Er̩U]a\3lkVw!!oky8|zɽf&NQLxL|QYȞ[Cؒ՝cZ))C"!@Yb= z>}O/- #P駟6ǯm|μ/5Bs%I0 NMeo+tիmc fy̶8|apzOo 7;Y]}y[8噢B~`ְ_r5\'NqZ*^MTަQ'^uUy[A[!3&:$ AIiKnW톰d%CM4׫wݟ/V>zU1m-/r!,XLߴXbRmͼjgN}=ر+c ]1b1"$aPN> b@a]r NT}GJ[!7_PDps~L0}=y )=(W7aIu%0'VA5>kjjƎKEGF9 ; μ 2!JԸ _;.C56.1bխ.=(Wc_ D]rk&~f99p <J}ɍUJ C(?`Z !h=0C(?`Z !h=0`еkW+y71cI7'aJ`Pf$ag(0'!CXt^_z٪ukZkMMJ&0'9C>v9c ol9.qCtj $Hvڿ{MG8yoe!/+aـ!h=Ž]v=@SgΜ={vY Ab uބIbN^e*)FIlH,n$,;**)|Fd<+ 2%+;xcO"1pE}*bׯ~h 3vgxw붏<+1t&%AɶSW%H !@!\؉wO>w܇~'#GŮVuJ!m75'1 #oHEn !h= =_xĀ|'ɓ5M$d !@!=l'$gĩS`H7nz@̙39BX-wcZ;VcHFzyy`َآf檀[Do 0'!Cغm޽?q{; ey1[D>PMsZEzpvѲ ]'˨^m^.j~j]=~{<CzЧbCz0.CQC8y$ X~BCz`G [n0(W`G! AI  BCz` @!6) 0(3` @!0P~@ @M @I.]ח^jݚ5l4Cz3mSi瞃ij>&!P]!˚ esJ @Ivڿ{MG8yoe!/CK*PB>}`Hv:s>sٳwbEmS&TTM2nl ffue,'uH_% #2b`ZOBd}>rS$.\(ػovCPb@Wf))r;1m`NWW5,H$0h;$d+׬o>vӧϝ;H81@ѯa`RaEptmqN!,̡$dk7zE''OB1 !f;ɳ',I7nz@̙39BX- W1|V;3[ qsq[-;VQMrgg !@!!Cغm޽?q{; ey1[D"VYU"maЦ [*fkK{#mHHHHHK^ѧbS`CPCP"`\4C41$ !wC !)`i i`i$m B)!HI!8&L߿u@B{TZT1!C(eFԌ7ٳ)h_hh}h * >04C}=wr؇ k5`i)'!3b/`e)N|Y3)Gf&֖b_ WmSħS犝X4;i w0sOW:Jg*0 3̩a_|SP020ff63_nD틙y \  `Pџ5G3({8&Y *c, /'NB?kpf(!444I'9t+e@3f^?X^Ჟwpj++k݆`pQ W^J`;&&aйo?:wlv5öbKpO*JB*+|r٘jy2i9 O!LM`c[ 'ANS%!Zbp>'I(QC3SW9PgT?4C AJ hd4׫wtyO @W_x}!L{~)ܩR@p$D !,ݒTwWUU•1h-U{fn͒ 8+sJ> PCٳBqhu .M 2:WZpOO5.I"5U w=G`:.@ m~})-GBV`mVCzWZ]-e? w* C^T Pz`e(lC\C0'%l6l! <&,<.|jUW \U-=e?T) 8U"? f)C0!dX$Pdc5cfy_V>zU,Ė㲟;U Nh!ƒz`uCFz(ZR!!ЏKI hh}*FP3S?[^ᲟwpiGVdH`lXzxKEzڱ!HCB=`cWJȸ t]^ಟ8U@|1x3Fcdv$q]>RCLPL?<ҜOʤ#\N6nFQC@H߾}p; WmS2}Q$0fرns,о~Ж8U@|`dv@Rʈ#6\}=*A-OpJ9L3?SXy7H LC `ЦhkP$aJ aÆ 0h;H G!Hr@a20t!HI!I0B:ɻ!t CH#  / N0(qBMks:Lط cCBBBB*Q^)$P`0v CʞCʕ|Buu5 (Z`P`bC 4C2 a„ .whiO(qCYS3nܸgܡ}=M bC8qiD o߾ΝT>Ҟ&(qCuKA{JĢ /cۀ4C8I3_45oLw#uUAsOWf>,0Eg"7W̜r&aJLv={pǽ}g!/fz w.oj++k^WTTUUTx@[ ?;*tɤ6rj*x9˩TҀ6޸H9FD+x1dȤN<S& 5*qb TH<սzuս7_-{}߫7ײb:'n>ԗ(H!t_e2۞̳LQBm2Uዅ m,5]';֕P I 0tn{VsC˭pX?RGc3?T!fk2?/ͧ 3k<#00NB*I {QRG-Sa )zYme"ρvy`u}~H.oQZW[mhBۖ&?&yk rƪ Ӕ=G址O (RH͛7'N!<|acFƆ}syl6إx)aqѬ-HS[btRNg&YB.wp!SݡnoW\z]N!a`nsh @0=z?oGH)jNVYw4DE wy&W,VvVn=/UdX9nB-IwpWo܊,n˘},NFlΆRB+G'A!.fY1dnn6̘l"(BtZ/]:-#s'̿[ߔKbQ&,JĦM' T@.Ʒ}EZ6 @p;3˱[mOgn;vsJНaZ`% ' ^I; cIsv6[!_94 *5U$l,RU&. 5@KXbޅ2-SwaNοDa.\3^+.]K bC @Wq'yUz?N: ^&昸I2Ytq'bBJUU 4sf͚E0'_$L[%`KVܪAdK bzqNd˃"Nvj7| ̫]Z*TٕE0ΊlhAMq!I([8*7嬸`GR+ifR W,@׻F)w.z꩷z>*p&H!LHT!UOφvb!=Kڒ¾5?tJxs\ &S"8.Hf#bLwv-X).jq}ajV撯 ? 5:` bW<'3iA0LzuU=͘-,HZQDL>ǜYW@-xR͗JD⺳")g!4j /E"\yԕD~u B"K?Pc |aN,ub?Yb=o/#)`-hHBȃ{$ E4'xrN>ofgB n# )G9ݨ #EU:O 8A-La]$H y@k˖-{%@ziſf<9~%IR:v+GeQWhcoKI4ac1Vtƌo$(ƌIדxs=vZ555Jw endstream endobj 11 0 obj 33431 endobj 13 0 obj <> stream xZK#7WyJR4=v Mr9%@(9T!t_v; vi^پ~C:,QvZnГ>i˛>-ؽ}w/gu0/bZ,bG7,.^- +7`?C^gw}9'7(nq2_yn\r"H.>반E̗`tlƖ0K\aIৣ=vadD_'a֧)C=Ua1/fA21q9 {2! 7:3iXV\'4##gfmm4=D+4 -T{E pG" g,]?4DnHɾ%a0e9xøn!coX x@ %!NLUYz\,*㐸I-i`"||1ȋ[0++07DkehKӒ!EM(LCX2$[WI\$V&cӗ($t\cnD3'(ΌE*ahm$5F"o[-܅.q]!^SH)D#2}EoGi:/l%r9yPQUCnAe%8Hm~O;kf9N92ql^F Os^%AnK7I%*aHx?Iֹ(P+v>V$D|9:,$R&2cLTy\!r!^کŵDwC!z9t\rgdaix%OB'6#ݕ, ERG.~k\1[|s. #P6 =NK?l(gU&kUG[AYVx&JkVjA7_@UW\ć8VFN;薲>E_ݕ?gpc1~N7"ж: cVk(k >z,>1)l;~{:zZ9L}bj-^E1PTNEz0f^|_U|:;Ro#PF`pNW>ݽ` 'Z)(e-,0[}yM|$5J؝n=)FcaS  WȧV+hm+H)ѳ$B>@%Wv;m5EsK.vDɷ~.ev c@}^jmtƑ:t4' `1@oTU*V~(R-?^U }:3I~S.H.\!F_d8I(6ѢպJVl?`nqj_Jo_LsIW✐Kbiyck/u8-r?+jW;'1yMj K7r^(+:O endstream endobj 14 0 obj 2170 endobj 16 0 obj <> stream xZ˪6Wx^lh d7Ʌ,BVI&2f~?RT*=,asmKu_ȿO7p'ZYIEx i͠SJ 2ɥvwUؠMF?ǕXNK×[oŜ23Vh$YvQUB|J``(9ni%wn@r{޾NngŻq<Nm e(: |s /8sV/b9(Wu:`C<71 -<5Aukw'V =~9Z'0"GH" n L-&@,>`Ad(=ŽsZ1 2xn~4rtU;r'wǥn=C.1ӏ kIrT>k*眙9B^5ڛhé ~qW[cq#+lFHSmi.` @ sεJ`zGA.H҉.w<_$Y2>DFF v%6O‚W2W3J01y@j@b {%hTmG *3t4X*[lw>rɠCw2ر6ꑨ}"c>%mIo!P/1]e0Lƈ "Iۉ [?V.MNMWv'UfsPHJn2ly;p2JCERE%{zVvEJc.h{0h$^7=[{mVxT£Wķ+ tr\C MyǬt>]RD;AQ޻,ERC^u7]jXsq?Ef1Q)\ry^ԭG2G6OBq>[ {8/ F`n{U0(62::-bv G&zjHK"H"WAn걮-xQC*n^Uռq~h`/pϥ6hfc(T@ 5yA:vh]וEb%8Ike)֏ķY $;_*7} HdzGN0+B)FXRO,'0Cu޺ ћ2nIYvPڈ/ۄ|(hF^ \:;Q>qVxZ=h~BH[ Wz'<)sYp4C #|c&>t~2&._MRah?grLS=?Ŏ$rsT0bAF6 g9fD4PovPMK41|@5 0S!?bLD';pQ:?qHrb#C9YKfYG#D@iI:O[ƏEs45uِ]aEqoL*T;cN6^ yR> stream xZɊ$G WP2#Z 4`|s;BRKfv3@Q]ޓuѧ^=Yů6/۟_:O߷^u9.__||#l.8ќ޿v5aW3g}>}*U5~3𫾯gwUF?9!ƥa=YVCu_^ϖv1&={p+C{{K[|K ˗]^ lM^N7_C5\F3AU봪Nd0?qz:O[Rdr4r2,-6Au9kDEܴ<#'Lu!3B u&[ ɪf .|Yf0fb cKtvkgDtA1y> š%ݪMXxL!M@zvU=-!(BJ#d2,>8gP4zx49lQw BZ5!Z^JKDz!ż!U@0am4) %Wt7@tBN1puoYW"j4iȮ1RCVBP+]\ڌFObIa*%XCHۡӧ4..'X=4nYwhB5VuR`SJO~mRⴢs&-E`@$V1NTMyXGne)$= ɧê҅%n6 AN.LRiSY#|&_.H4dUTkS^pV27YA:BMv.o;Wd5 +/ٕ_).F8?8vu!2Dr΁}h+9ELȱs#}4C x8.]N5%qQ_e\s7g3X<8ƀxJPX{LIۗ5W{dp.w[frQ.PH6;8||Ӊ],6{RXn%UPʼҩƎ m7Ɍ}_MQ;>97b B^"UJpw\ 0;ـUmܓZ:Nx?/%0A#z-ќ3ٯs.+u~z+6<DXdQ_MfFg۰YrI/D6ZJh1s.n &7cX=7hϊ5t_*U_Nd@ endstream endobj 20 0 obj 2006 endobj 22 0 obj <> stream xWK89`G/[64~@6аB Y&e@HO˶uëw4o 0Z>xżk;mrUv-Io>4x% q< Λ_/!LS.M;zv)mxRDwv/v}ܲm_EMbd;tz{ Y|jFD˘ m&Rg]g /N{=#Z*0, }>#+i$Nw"˪'$M/ބ7@7Tv]qvJ.%VTr=z*Mh?e힊LoWCŷLqhiQ]%ɕ0t` . Ud.2F%Tf!P95:9)?iQ`0>T6y&_u+;5I@b/M}@)/N롂Q* Ԧ^W*K d^Hu9 "nh"c\5zw& v K g߬R1 cJb\7b*C]KΡrB56.#?8J׹VKG\w|"swJYi0]CWQWRsfRnyFbJo̝Pf؇9D|R#~-bVUUdumz"5)} zGIޯe8Ip:H(&Uz7UzU,4'my~1?\нq endstream endobj 23 0 obj 1103 endobj 24 0 obj <> stream xyU{ݷ^v~}UZju]JSʹکF VdRL-dHyHrdȁ1!J];~{gskĉcǎ}"=ڵkǏ>|?|? {߉Ɏ?H$DJ\ 1Ralk{M>}…l;o&HJ+EXٽ \?APS&7΅Y_1YN諆0Ukq|.'Ud*`}H[iϩPL Tj0 Y({Z4#LAM0a޼ys<ۿI&UUUmܸ[4b.O8E-dZt)ߐԝKBb-' Eϛ?7ޜys͙;{ƬY3f|ƌi>m:SMjiS&O2D[999lxl7n1FO?l}hkԨQ#G][1b۶>lذ! w@Woz]mN}ݻw^uKW\ 4!e8)2 ClkH48E'^٬Xb4/XWQXOB7A#& ?tɂ~Άoq[ C 6vyTPo=CX0*hjVAM'@)TSPUAeW_l:ojUP7B2u* PmB9!@uŒ3!̜e rAț=9s̝|c#-X`\~:J: 񂼪V]w v80f[8iT0mS¹g f¬SNj(ȭ_[0үY4U gW.ӸG\ZZZZSS? ==w.@ BgIvvN!3?jٲeˑVXrDRKq#N6\`E Ο_0o϶Pa.Bnlm*愩`@gf"x&m0`Cxt!|Hxm6xs@p[P@u w @#vr$Nh5boW,cb KBK qIjK)zs[wĊ l[w>fk8[ [ d%1(W6&|0F3Fp1!'80b2FɮJ-@p„<<{.V'zqs?grUO;?>Z<+7NTԆ`\+iUӏπp,F弙[7_!03w^Q'Ûn@d;نj8ULгcWZckX35HGUVN ]x ͇&ܤy* 9n)'߀9߀=u܁]L~!ܨa3OLo؀-fT6xkŀxhA/|:V}OB*lcB0A{dP $;q} 09/-_Mspʘ!LS1uѩc* ;4L8miOO}9oSGɩ6XatѵSGL}|fȴ!L{h긚xJJJ<|%@ #`񢢢E!ꁥ6mڴ&[Ci+uԕeƍ0lذvz׬]j5²+,]c; 6U ̍<qa nfMDM&|>^Mz*֬`, x1Ta}!d'@o |ٹSo AU7+54`H0qPL0qɟ`$`g'p0'D N8, 8$|i'tyvKFlWvz*Ə<:~#Ə?0ﳀ_ϖ4|~gߺޯ?}Ag#g9٨QW6nhii'џϟfG'ٜ+/\?r糤0|̬3[e˖ʐ9 U6W}Wj\8-$RD̍E 7*ab% @` pYgEx:S3ڕQuH/"s0u:peaDH7 LrgE7u#pH Cv#pBWWH +a>Eyxs ROWF(N3Rvgsmr&pH - ZH1Bbb/|[kL_8^8 |+=s@ŋ9!O^ewڒU W]fYYfݺu ཛxf:NMPծ]ȴSN_0i*.60l)ݴhp# ڵVZ| ( -Hq7( R̀=W 0J۠o#<XxVRsTy² jP$BHOK -bǖ8@"`ZB8ߴ*'0*`N A8wNO`'H΄|z0 4W?'```PQQQlֻ}؀m!9ƹ<8_Uv6ogz;{;{w|w8G<T١ zQglVw_p^aC~׿z#cpo#_sdxcTڡ , +zpG>lz5;i!h'5\B7UVUUU >z|xaeX_\dۺ%k&Vy(㡱k2S wrEA,q?.p;ܘHF#9ݬ:aSŽvh/vmeKLH%fZ(˗/^xwqܢp %(Y#?t0jـu63l.<|t3x! x0|P Afho:~M cCAB^e#^ts#p7B A&Uب xs\f! !H`d  H+!A>^ r:C?A;#ՙ Az&h!A Й!A5Ly`oAE7V\MS>=';Gw,~eܱ O6_ݾ۷>xo0ꙧ|N*؆=_6v/~u۶_VJ~u[/o['~oX qgwn9"_B ~6װ)˻Ywi'.\ZոpuVD@ؼysYYٶm>l{ w߾}fs \褳O'qTIf<:!* $@H!vn@-e7o))--**YnիY(O`֕9bF'7xuG@H`̥C`I#lH$xN^[KAY^ۻ=pճ' =$ U,˲z3 3N l _BwؓK ty U(  AbWBv u5!,%!#ߓV{`l!!8!Cր ,A $HPG:h "ntL] H$t&`B>c{i6(l7. {g;ݚyo-|η.xͽlG$G[2=G;2 QO=i3'yYqò~p7-K:N~~ۼη7޿?eև$HPW_==|{m>7OIg!|u6/l߾z[ ^DŽ8'H#M|"3MBXdȒ̍c{,BŎ۶o)+c} 7slNc0}t·51 &oh\bm_DN@j"fثJwb_sR 8 -`B`I$1Sȓ0\ A+CK v5A`F6w# }*m*bbw4qkf%BiD;t |D@N@"D $Bn!x 8`T X rOV2`J+aN@Y6Tz#CgEO?:>/%޾Vw~!o)}n-;eF=$+i{SOf;y7oM\t3o^{ͫeŽ.mp{O?޿?!ƆmSz}ϏzeҚ̩e7}uI;DgEp&?fmmc96g gu\տ@v.O1p~w$Zy!` |||=ꖰm~Ύ_anK61l,#ufN?N8M#`wP\M'Ϛwy˘VHަ{1#Yhhol}U:1 j񠌌&v&ke(vNG-T`nLX{Ev9Ǭ)[9W~t3A$3٬ 51UYczu^ ,di8*7_˸2҇Ol {:MfT0vEZ.X"y{H#ѵ2p'{rQë77D8.jo'@$$ !u騽BB=?D} 8A<C`' rƌ0zx `۲ {pdaCw{fO+x"sᓙ\d'3W>y'̽\Λy:o] = =; ŽvfMt*yg:ڧ~{Wn\X~ _mض17o:6oɊ5&B`lB pW$H@pPbCp㕸` h#L,rvNi]vDxm5q;"kE|,<aq@Z+07I\w\xw8o`hap dHnǦ s&;ct ZNPž* $apj;BbxD>[ɇ\^V@|uWfeel sL(H!Č"v:F&0 xfNP'Y2O{I$9ԹcL8q?^Zer0~Tkbf6x4mn}۷ӾK<˻x c_ztKnCKA`ۻmǝv#[_|d=ZE?G=ؚ[+.ɝ>?1XNk\rc͑ƺ:o|Zv{q.{ {QRa[/~P!@~V` ipF4N`W6oEpyedmCشtF_aA<:ö}nx Mk /Sd@^x2d& @I$BPBQB @sCi8B8AʨrPvSpH<-e; 8wvAaǭ_^Zݫ^Eo\2M_2m_>]C_=={@8vp譗66xo{w/!=vX=fb6]>c1Gi ܍ćvچBC20|k֬aK0юl> O|yGY_dѥV\:ҹU˭pbl+g7ءy6ԯȫ[W"fE^es*9dN +n[8wƨ`JD*08N Jo-`OM̧@xb +'bwZFS|a |6Eg6mRRjMXT\%nz+k le6uPi['Dd] ʌ g7 0;fDNJT9t;y~h}eDNJ >`CK/AGFCj~+fcB0D~Uv *)VJmnnOB8/< [/us8L,Tue⃿v_A?}T$FiF+VX7 -S>ER H1Eiz%:2?A;W3ȴi|< V:p\γ>zAQ;T9w7np?[ٟ.G]w/yz珟?v?q??䇿~oo>}˿>u?Cxo^{Ǚ?+:ue vleu|&[Vb 4ȱ~_G/K"u-l]kME%,IlVYx̝+i޼y  G(ǁq|£aCZo1kHY(OxC^ٰɅ2s%yV eA</+o=YQў86d l]gberb;[^돘j!MTo Bܾ xx p2x TNlReDo%L| ]G!=i\gKP/B 'n4QDZHNè'M8AĨέ$ T3C>|:uy"F `Ɏ`3@V30]/8-ޤ]&lCf,kC=RVg{kIga"gaG Bi06`-,I6lhx [t xvAs̊ܙP_rnev{* Ǣ Apm3(;8߲Y-{wN$ܽ1!_ YNeMwx 1^,v@ OpO\! Nd-={z']7n*K/o; )ez@]p p6a7kpH9΄3,Y\ Np\>b3..mYϘ9 Lf̚537o{pNCF̍`s (ghV`-{\ZuK @ Ҳe16*U8Dx萧`)闸bі(ذnzkm& V^b+V-[bɲe,\`X0{3tP@5 q\̅fVd Xwu1!'db \s@@`/Uxnn`JAur:e @ lŵ_=Em =!`ԗ&oqB-HT<~ $fje0>>Fb."< ̙j* /hVA+G=%,5u.v ֭[kk-@WX XHxI Λ |kg 7b "MNd鏸Y+"J_Dy^z&oV`s 4!J_4]lYVC AljP;h# {[7nx/5Fp@n1r)>NSoQ y8! @ [51d>̍8˔C% K=0! ! 7ܴyud!B+~m 9p*hGDĈ9`g:Ai8?$t&`K=W'$`NPaZ` ;KSJY{<<$33x`vnr?1k3N|SMG3(%̖(ou]f ![GҏN<@@݈֙=I~ʊDxx@1$h6Rt?$:QNYF7B)!2B !@BXMzIRswNPLw&Hs+qHPW}m!A :B1 3y?+¬\!$B0A$ilvx&-v'jOܤ [nۃO1Ȅ{ n*&Y lqǏ7ӱ>=1c?=c>@-pϼ Fi;s% 51**pkucFyS)TSn%zx/+`K}4@\{]c1f4UCnJ{ִ5xEEz?*ЊF?8藝.h$ pNy;q]q@kk.Ŭ R24Kl( v0Ar'@ 2wHH# ͭ)ذ`a'i4{\F2G3V>!仃|t:•Q@EÔOǔ׮!u>{y={Qc [ɝK>4OmʬlMq%~C?b!9cO ~a#\f2(r;!TxCq؟ E$NƋ\J7WQ1V mU7B?)u:ō: 423niN9*EJlPV,"E9ٯKJlPV,"EER()D"a'PS8:$w}lw^P e;`I@C"RBl>]H$V@BŐ,xm9)gd%bQde{wňs .MV2 vH$RJ(!f7܀ 8l{r7X2-;|ةӇ{7>\aw~!vs>7"?7C8pr[{(j,-.=^Hyؓu>wI*qO\o%oUUn q'ف3 /%yltEg( NeGSu8 qk VS^s%.a*H2tJ,=͵ȉi2utkDg," ؀+C r^trʙ`#oa!tUf`#dd3susv'[[/!;P|6.qςs),fJX*gwS,=͵_R>9Pt4.C]}K&DJ IƳ.I}~F{?eizXv<TҕpabI@C"RBhG!$_혍iglJN$ Db2CXhQfLJRA%\lw^P e;`I@C"RB !%Wn SI l;/a(BYMH$ڎF(P@B$H͌.^U:C H$+\BS H$D0 >%B H$*\BeR !MF;H$Y+[/^>!H$q?!!H$ꊦ4ڑD"Hp aD"HTW!!H$1!̝;W%je H$c(9>@"H$RQXPQQa!,YZH$D0$¬ [YD"SL!pŝs23sMM*ת8A FC?T+h*).!EB"|1$Oܪy@" taV\(K@Њ͛oC8~xj_g;ZN._4rOAL/ATERJ"A0<7ć1C|8#d[~uad1&upE@ 0!,uVR?~3AA/VJ< .oAAI|($s̟ !XQ#V/'>!OA0T /S@%e˖qHAzg42 C$eWm}G)% HO= ϫ#?Db pCy'T|.DJKC!!,FO ,~VM>9!RP4P;:oc|=!OA"B>¼yϟ) :0K-yV IN2ԥ‚@RQxԾyAG@O+CXs )[B8z( jii!A>nK+oI1Pt~I+VVH!TNNV>ͭwy a#h$܄!2NA1)BJ%DDJE@bN AK !HP<9 DҥKm1H"B D!H)!,G"B GD$R*p1aŊ܍@@"HU<&+WrH B GD$R*~pB$H9!06`„j*ND$RDJQŖ*++,H9!,^xC B MD$R*N$>"B RT1'%HV"B JD$R*pq! DJ!H)8[ڵk9$!Hi"")EsBXjٲe5H!& aD W=$R2(qlwB6!A]v^)!0!V" ab)Z_xsmA+̜SXgIL'Ir1!HOnyxYMݩWƀW{{vzRH1Ul ajkkI{TppeEeMumݶ/v  %+,*bfҤ !'w-/&lmm^&}փLGO(B3#]t v!~]QUY}]_6decD8(zB̪0agϞJ?C<`ck}lgGLwFL։ZΩkCJSŖ1!lذCB" aMPT70hnnnu⨁܊7g|vszT ȉl YzO=p|EGo:rYLW1^ x.p7~R{+bBY@[.^,VDiUh^!;U=J~0cqDN80B(*-k8u!?]Ԟ@ /8&=U+A0${)Pm R|ᙵsUpSc1' r.,4N7 xo_rHcዞ1}cYEkk5BWX"+>ǪnN iC!lw )؀͝ pD¦'Onjjjii0=W^ ZB#%BfMA߶} !LDa=uT`ȀOFA4Iɤ aC'OtxsЂk׍o4`|@&{j"c!̭6$ I_a͚5曍7rHH$!l߱$[]9sFGՂy#mhujpaޅ'tv@ 5wjZUjf5I)ie0IJ&ELv93J>鞟.>&C0<Zqn1Ѷ]:DTBP[|Cx3W$fkSHx~R+PSS؀{;1!pHH$!ٻȑ3gϞpBs3kj:5DrHthH7α/r]nN.MLD=G3#&aݨt//>+J^pJLGl1!iSHڤ$[1'֭ÄPTTTWWT 3@J&E9իW]iBT)a!Q!pHH!f&!3@J*Ѻ $R*YP\\!!1@"A#-!2 0!pH B GD$R*؀I% D$RDJQŏ "B GD$R*p /'R[H4-!ձlN/_ 8DJ!H)X\\ a-F D$RDJQŜ0aBزe ")}D@"bN%0!qHhll$B DD4yaÆe,(d(j"P__`:%nڴ •+W*E@"H5z̘';w{R E sĖ0_&m۶qHH !ĭ$R2\C 9/,(d(j(p#[!lwpv\!KH P:BXk4[Vvv6޶LAQC1'(ppԩu8;h및ԝzj.OtLN)ewY[Z *u !uk40ـi! !%DP &m0!ܹs-,;x7]=¤ⲃ2!H1DOBNR2A JqCTBZO:w:}AA ڮ] 1 @MGzcF & &n 7j3Q9YRb!dJ ^r&{f,}`##'ˀImRto\a064O` T:{F c-yFt ؋JPwvq%̮$G6=uHי$"rwb :[5'IgϞe LV" 2pڵ6+v9Ӭ!Da$$dxQP[wVQW3dt"h ~G|8`lFλ{$J0!߻w/w9!8pCB!eH rJYI Ifφw.b"(c+zhmG)MD@ .F_'φo\D'\aB8tAWϟ'B DDuʕC:`@@/>"B א!C,(d(D y `B8|0ظp&"B ט1c&Lpԩ+8  9!06`0 w B JD駟‹m6)΂B-bK` kRss3&"B RT1'#Gp0`!Hi%")E0B8fA>"B RT%0  HPYY8DJ!H)cF?&B GD$R*+ Nmmmx=/Ҭ$RDJQŜ#;!|JD$RE@ ۗXG! -!0$` )r]V/Y_t˶^˳H1)Oo,|B` B ҥKI{TppeEeMumݶ/v  [R9y!yrB")WpFjkkۗ:uEUeںƓv}H!8yrD LGHE}O`8$H`B#Ǐ3*=܅Y}揼`*t6l '/Tox_Gg»4Q@5IT LQ!ZD Lw} B{&H,rbaM5U5u ' [l8j d,\%UNe!CaGnL/'=ޗ$R+BB\y8DJDы%g $ևP]]HBQiYm]éӧϟ?>zB!BbRjDJQ% BCGϬ*: ^Vp9]+^G^#$yDJM!tsP&@QC1'Ç'!Tk<]QYsʷS6}q@?rA5:c2c_b7A+(=[yDLˌaD@ .1)JI>Djrbɶ'M5⨶c}eɱVqQ+,,bfI"t! qdFa=E@ ."܇p=a@‰-Si=|S=o,hmm=7./.qCV!sH."!`7\ºB Rf "g!Su!z/ "$!HBЉ|iݧujmM MK%poXA@J9EBQv6yhҏSD Lw} B(a=2vFݧ?ŇdgΜ~򀾕䏋 ?0իW]x~$Sz:" Ma5>ւ0ԞK5<'to2&eՕ)?#/%{C SYI%&H n*e~wlets Bˠ($R +Ra~z,ż\7]o!O>2fUSjR~OQHɆN!x!3JʕCiN$)X䇏x CmC;]#mqtB7&?ΉҴǘ>2"C+ϨsBBbRIEx?>}#b*8޷H9ϕɣTZhX=w~`JGʶ̡fKZNG0nRSȣJjQ'\f|D$FD0l"Ԁ_Y*r`n|fz.4if40^LGSVh2=rr^TԵ2(YF"@b!DjwX5mxBʡV!H=v>ᶈHtSB{[j i/)cdT )i>>1C B SiK AQtMIf1BLE!Hd)hƤC0)CDJ+!!zhG.")}D@ ."蕢H4),"R^VSwիL:Qkj}ͥ[!D}]q NlgG&*Xwho{Ie[[[%hvWVTTmbglAd8HdɉHU's!2MJ?t̪0agϞXD 늪u 'Orw !v!H)MҦ/K7qL0_ ;ڑ#OCϘtժ8^[x^/_ۛ~qʦ/VԘAΌnfVV:D_RBXӵ?tGUWpp̙sۿ_3~?:#c18DJQuhBp% %Dv-.ŧ6P[ WVksot{_ xTB+fU11+|+w\Xnz -hkk8jҹ"xMJGpk_qpQUM]}I[G׎wBr+y*]WD@":2!Wxf@`x)MX|l '/N9pEODVmLu9RJ\ڋJjN>}K.]vr/G%uIDફo,ݼ=? PP>?G&DKDig]kz,T*cv=ZBs)1#U bVrC'OtxsЂkaCccL >KR b׾lSZZZ `իWN:B늓HE3&%Xi;ce^Tfez ׾ 5zT[zdf$@@"]3ov ,q*Zm#x"dzl; ݋<*8c=}Yg}[I&L"!>Hv Lk\A"Рb7bwg3QK1yV| t+'jbî*#eg4u;mBR+WD B H A6\`2"'tZ3!=! _BPM+1B)"Ä`Y qTm0$,BawrO2ӳ*M&ޫGΒ>ڑC H&"Rp ?\ю"3]_E@"AD$!U%:HEhc̛ikkc+':$R)v yF+P`ޢ>^VSwիB=iCO[>"Ϊ)nR ),"*Xwho{Ie[[[Ĭ!4Y\X䀊o:uP'''"Rp}_O6]s!?t̪0agϞӶ2]֥CCO&h&jSOɜDDJQ!Tk<]QYsʷS6}qFGҺnY׭ |BV;)0˪iAXo66n|:5!iTD4tz^.b+&?)N%&퐿WO."B RTv/?P;KU'.@1Bw}+@@"]i$[cj!$!\BzKHQDSFd1ʠadi)L̘)}Éˎ;@"hnFno77>4.]7$O@7BD_7̅)EBfWЌH$R+2BƳfﭼcӐid񽑩i mL~j!AaYJ9R4m ΍+)K0M#ie^t$B:\ Lk\A",YDrk>:9\(a{FN{@5c~y3#͒ay5E0@Ox DRʕ+| ")M1!c![-!rQ %4:N N02UH1B)"`Y m ˛GL2,)p+&9׵2/L 9)M'g%'^;Bɓᒳ;2y_bFő y}.Nִ %&E35heNL.ɀ.Oh. _2x"@b!Bk1'N0Eg (!&#Cp&BH !fL^x>y>$%84l1J; sgO:w䫸%O`)v ycdI>{@[sX)ܹ?L!D@ ."Ed>I-i L!QKCt#$}L%@"B BE`:SȈ|-}EŋϢZC}lN}e#eχ:}GNZusu[, yqԻMt[49S H=tBё AU43ު˚ BRqJw>' [:}X]P /wGdCf#%@"B RTTlүH ZQB .DN ꑰ hY/\@ h\AN8HD$RA!̂nKA>Vu q';JnW0%a%`ݝ%A/a! ꚋV]suro"rWDJQ!ZDTp{(Z^Z4/?=df׮3aooalOW/ NdvR,ՄDJQ!C 𞊼vɹ G+znݦ 3.]"5%?ꓖ(2ꭻY$")EՁ !^ gY0~4\+a?ٰxe32DJQu`B)*eM}: Oa$~~6t}?!D@"90Ru?%$٪vWq|WJs>۲ Ň!:U9i["HC9%ےaQ DK>   $@ćjwWCpg{fz7==%6N@T׮];lFB )۷oY\\@AfΝֲԈ l< PP0 `)@A S0!@`CL !   J ~ d0!@`%gCp%C0! C((d PP7=`% C"dmo:Ɉ*ʩNp LkJBֆP3LLL9\a(LL<5ԃ avv6#Cв!0!IZ}v 4``!IZm۶@0!! !hFNZuBBݺj*=3@IIj2oGƝ' XHdPSJY$츘 Qx6W27 `V f#ͷz W7FFFHlHB J=S_n.o`C!+zZk(%hZ kjyJeR ~n1VW~Ѱ1A[d]ESPR1\IH7RCˌPkCf!OFYMʥ\K9aYcb*B4Z.*Aa JV^b]@ hF`~&u y~KDCf*_x]2!ECEp)˵{*n<2Sxm]fLKR&z_$)wQ]b Ay6* RwP$ 7uCO€'5UvQ]xl1p%b-PB*/I]21OR1#a9Mf| -^sE?O kjC匧 MI*D4g~Y,/a2]cC(/HTf#2n((?4#daGAI#)xV)C0{34zY}ZJCmf -=~ 0Aݪt۠h{@⑛!kT d`f7o$CiC7mڄ!t!@Afb]PPr37b]PP4C0!lذ!hF ln30.C((#<e$`PPr3|0 { JJU`% C"D11<xЀ! a D]VWWc JΆJP,z{{\5bֹsb JFJ@p֭ Duɘu1!4C$!7C=-YH]C8vX̺LNN8"1ǫĆP׃P *H@l!@S*B G$fnΆJ¾}r0fD@o7-T9FKC(0w]9e5_Qb֗Dt>!\1)0;@bjg| a^J2 ,-Ez;-,D7u`71:)jRBLYkdp-zԖIhj@fg/G^|՗?qYػ`̀!dMfk4=6!H!* r"J$B_"Ƞ5A lZ5BVVV1`:ɩïGr_OcLks9l"{0wCwdCxs6:#0T*F/DKa2 z3/Xk \CHf#'O9]=;95=3{ȯ߈4+rlyڇ|Ɂ$ lvQS 婓 ! BE8E ;\C7FN:>jՑ ss.]::2enyHҽ]PM}gh *V·͙~AD>rK"='USQO-/ S4Cx},r P1!4@Tʣ"0;Ců831unzVx!5Z9R=ZW Jzh^(LN""Y15bRhIL}Ŗ`<6*<ϽIsoK: +yky~{]3<0ĉTp Aɩ.,,,,///sss6CPJc2h+ʕc8$Z!Qۏǜ0pYSWJE{̶u$C?J('ԊSC("ûv5zOg>:::VNxqˋ,57P)0%BꠧFna}s1ñբTƏ٢Ԡ3b{p@YPP0: Eh[3bV!BVMBH4p ]!Ŀe 0!D0t*uz^ !,`Й`{ AzGT5, 1Vk_JHk>p]қ+MD`!@g!2BS]#ҫ÷i !o4Ӟ2uoC((b}-O]5ժ2a A}{ARH-}BCp׎7$Ѐw D522b)@)CpO*o}]Sj[Ik \C"t-“w'2K2)! 0LZ3C(Bq@bЁl/G^|՗?r$WR Rc.C(!43Y!  o;=Q:AO22BwjWs*cvEIg!׮];n 1@n#'O9]=;95=3{ȯ߰hbOniӦvBp^kU9Bg I auuj 1& i$ _b{ w1UWѐdc ŬZC(%bJxU \ݏR[ {*6|j}]C8e=!0RbCN\C7]`%gCp%Cׯ_5 PP0I EkpƍUC d vq!@[h^xi=bw-Ni1{ Gn7"1Zl܀59=j8cƍJILБn[n eC9v'/Ѓ{7EL_;: !jh4'xh0A:`ڞ!5CLi৾vٞ`sssC#+V%.McHŤp[ =Ch,&ϯ.51Q`ʠ>I0m`o =s:53}W..-]8?`kC0zY+V7\-5tHzU{zڦU1!] 7xq\ywAVSチCLY㘊+++7nxy|ETȚ am^!6۷o# (ZO 4E KSgNV=HrӰk$hPD0C: C|r3zC @!t>i$`]l$`]o : C|50 OR|S^`!t>–-[oF!! )!8+|x__D&-_m~W^G(7Vz}Xo}@2l_yx3@'PC0_'W !܃6ۍ k,_kІ Ur}=$lJڦ5LL;ۘB-j&Z2+B~km*v}CIFMVo%)& TA(Q%4!mzW_޳opPRCmpS0s( oCSƭ`I. iZP'8n @ӄ0|l,}zDurjцvbʹoyQjޢJo57W؞2xMjjPDn#'O9]=;95=3{ȯ߈4zAT|!tEI'mֽ̍-t dJˆ痖wzfjZS%Q 4eҭ}Z^Y !6~bnht jk0U禧.^\|7?`1ԩc{*U5-m%3ZR^Jrо@|1k ~жpՙdaA3l"CBZ6Th/ Z3v3-tYBA3  Jv C((YB `%uCؼyk  dan ڐՐU1!:)v­uIT֜/Fg\f]o#-'cm" #W#ǽQW^'=5 TwB SSRco#̥`)1`4v((d PP0 `)@AԹ}/11w8cs `md1btBae(@)fgg1 PJr3 /sCr!2BoZC(%]a zWWD$30(@)I} \`̆`Uys"@))!/2C(%9K{ A3|)!@9Hx3@'M`(/Swz*4Ip@֔: AFK{ŗ_}yϾC1IU煖MTb0e!;C>6L>=vz:95tu!-i a`4-VvE}!Gbmw/Ch# aɱ3g'gfvCHq2??vCs;PDa Xa F0(ȉSG=U:rpanҥKGGFBiwΒ:-DaWNiRmMHCPklMu>vr|!_}A #Ců831unzVx!i4Jc3cˏAeF2K-o* xAƔ F\rNsAm"pf:n%0x0(+&_|gbl~- _yo>VIFh+ 2 E$ۢ=F_, aӦMB!/T qgd{=a~~~iiIYYYgf=e0B Aj1hP'К!D׹I s{o}/֣;h=hCR7MB_e&OL9[6Cq@\ UD|4 += Ј2SFL5yq f0Vk6ń̝`{ʠFCB!@lo V'MO]pEo~~!!41HZ9Pk7}CHCTm.&ZoiWŌ 噅a/DY"z䞊aOŰw)LpM>S1 :Vf6A9&#,?sSO=uҥeAEH+7> yrχ߸aocy9n޼y,|%9 ! ~xL"/"G"_QYSFH+ !\~SCu{BC ͅ71$11&D[kCtq .ܸMB /I!:$1˭f")8sE/ϻK=8!:*FM!@'n==y_箥6s%t=?^Oo[$"ro-/cˉ;bXJˏ=- "/"G 7OC$eu4`&& @oO1"!hh}$1~m``o?0Ѕ$4/;v'2QYR,4I`%u-W7jdHѦS)M-ANrRE!Kn۶^Jbw$ k>*{nM88∉5+ x1 =IL΍`N/vEeM3utձNUxhx4{t\8b/;dkT|K;"أ(7O3(Q46bЃz4kݻv%AA!ƖhVIB-FlF6lxg*8r+#b^-a=gǪWY$#rYo#NgI|nAVK9'N=+*!m&eX,jnѥC8ˀt._0tS"@qjOK e|sY"E'H/ffb.X }}/mR;QI3}E:[!!ԧ^~G?V A{/w)(H+~=s/c*^j \*Sw$e+m_>MMLxcUT1# dRqKV0&wv9#8Sջza \ĭsRmZyXik^3$J'A-}R1ƍi]5ci @o jܪ+W RJPc= EWRt|__sTA<"=b_w%RKו6w۲=Hpyr'ۦR^\z ͺ_~TnDLjtMKH?1>O~7~C>|[\uGB$!;9#/KܫԶ?qϽJ7} vry}"؏:`) oQ DdPFI37!6"Oٱ=ƛ›AHgZsAOߨ0cZW-ʚ҅ƼpvXPȹsh'Rg?vZy]myҧ FepcPE__D`E /^\1^2j J0 +ӗTWe$QM*CvנװZ.=fUD5!^H Սf XKZïu3V~GR#p6!JP(y*QܹshhHȀPOb?3?XQÇ>'|rFb!'3me:sS9'>'sM;1[NX Ƿ z.VH;am8/?1e&SaqIpX{t K.Jr؃h/%ڻ-&# l 4@Ȁ[_מ~Bg|АMmᷢosѶ;[$Sk[IX1;do=bFƟ̯/K5y=-kY;2Qo'-[=7 endstream endobj 25 0 obj 42513 endobj 27 0 obj <> stream xYM6 ϯBn-ۉ~-{0E}. }ڒev>fʴPIXu_/iP:\~=8~{54Yg-?/a>}颞( t z_s2 wQCh<^o/_̘> c;h>?pmxh4 UcϔC62mn9y6R 8.3k|M-|h#ޝ/57eu˫WXz6-S|[dXk,ftafO<&=øx\bcex. C6fooyaZf2ƥq<[?3Rd܂鮞pz]`lWF%:QǀvW 7(GqīVlEDG<}O-{Gx0TGA @!'B9ЛL6ND~=AGU3֦M %3,WLNQ#~tZ?Žq=#{Z"a懒qs{OtæSS p@Yt8~-D]NG;Q(aƎ.Iq{[NeX׬6q?WwѺ0S}i`jOJ` 1)20T( ó9ijW1(o.c* Ld5?LOg4~gG'nϸƵ3S5J4wae"MBuO STTSV 0G% ]UuLQNU VF*73=ńdZn9 & ua@圼p.wn"> `&ζM6.3V:M(m0EJMOɵ^#˝Ş[I[mm=/ |^)lLc88 I= *G *C^pQQ0Dˍ)QgK'ԩ›YYxtؖBt_ĔN(}nP[AB B=<$]}W _֢̘d;X"hעI=pg09Ёܻ%*w-'ԶDVIĸuBD!s>|)8QYk\8B!/5F/|ʒ\ϪҧکNK߶]3ʾ&qhNAuK}Bm;L`6SᤏLR|dnTMNڸq5,=踪Iwȗ_idOahTi3rk!c.H[s0 Yv;vf}WBgK8XWd 8 H&*,}윭zܓVhD_.åp2[ ZU=RZb6yn`lX\mǜtܔbq#EBd/k0K'*'%ھdw;m6zf!ET_6$f\SDz<A%[熹#Z1Uhh u$1kޖf5I'6MͬcF1Rct,(JG!UX { z&}[VM#}#s.@QUfoܞ@VC7:Os8ƫ:?l&bGs+mWrY endstream endobj 28 0 obj 1879 endobj 30 0 obj <> stream xZK,ϯU*{ 9 dsc|&?9ҧGU\,LCSyu$uѧ>Nggm¿_oY׳yojg_Y߮g>c/|0qYX5F 3I ^?=ޟ~k^eu.((W6.ѥ)b6Wh]:|2ik~ÿ';l_o$H JP!(n)- +ijdd][Bi@s=c* ^g`nh3E_^ϯWY(xC(mxvmKD0C42:Raٚl;£$}ByU A ~[/15cЖr)A9fMeb7Vm"Pȥi AG4ouH-podT6BX,9MVu*os>d) zmsfêL4;NA@RC@f aL;WkQ G'!S!;2_א1 N [QL ϴ^/]_h]-l+ȕH/Xa\9UhD1@\I \#I1RHʵڄa’Sߑ77-ޛX Brs]6eXX0 kT#Z렾$㘊Wek?ʲ`֓W`eq("uBM0O+nD99[F"*5;cJ.Z!L>CHI$:Ɲ$. &ToUۤ' !Yxs;֫>A'Cᒠ]!tj 騈>\F Luъ.]iw+.mɬK,rr*׽̑l{'C Z{&wLz{t/m¼@%};QF6T7LI -'X "h}AN=* @ۮ3F2a,f;O*&^ξ%QsE{PXz[m 5@ɺTg%QNFk6ӣAWg 6͚RdxkR>7)Wڑ'kYu<Câ. ,KY%k-w9栠Pps樳7ڬV꼖 yuh9݊ S[>jsk7)7ڟ@;mE6fE>f8Jm4jRHHpihS4/̘N808i@SdI+ rLgZ?_t+~=(z4i2KgZcI?ϭ34ʳMHa'KR-#a:mFy6+tyt)1hz]8BW@W`0]_n>` ] ]eJ +#^ch7>nBH< 6iglM0\58^,]Q}(m"&2M1 ]];t(V6auCa <K)>Nv7b ;* _ ,ȞF+a?jxUh `@u(|d r+ GV>Tl*jX=߯2ր>yF:R{tZB`ž֨ce@5*s2Y5te%1A@AB=׈6[T ONuB\gOg~F>%-sS甥~F}65,,ؾϮY[rx^g!ǸaIzm6`]_.B6v[ػq7BZ^|2\*WV ďv.} 6[r]Oco7s6$@Tmɶ[Y ;<}]߲u[RI=,\=w-KSp>%'Vr%hnUs=wWB#.R_+ tд\ei`7m6ҳ@demY}cN|8ڼD™#=vk2>orEzy|DѲE^pٻ3ljQn2^xT*ovaVLQx/w(fWmv&udUsu쫹}q>\705/OCu]x/[^@D찟?G endstream endobj 31 0 obj 2631 endobj 33 0 obj <> stream xZϏ _1V%vfg bڴ 4DJÞy/(0DR$E~^|Qv&\O7g;l/ie0#Vr/a=ӫQez_fvGFGj߶GoS|t_f_GW}M\CEdo金28МIՁߖĊ 5&9ߢpĤ 6 )"Yn{Lc6M+#Ѡm%-x Mc72p3Y&1]"\♈aL{4&*%h1:LPv/SqRz*_l4/S'=ϣ_2¨L__O,ee:*ia OFevBnтb"*|Ө#[Zked;JתOFe&J4ȗ2'^#^Sf4. ,dgCҀ مhYܣ`X)UQ8H|ͣt} WgZMZC{&N- \iCmʴDA8,+~{& 8rK}ĩ}Z{&Nm͂wMևmIJ:H )b,15fJ'g9nIɽ}Z%$qg ofhg.g,$ ҲE ̈́k|$lD*D2ݎH.#-:xM1ـb m >Z(g&`kҊ >Xs鞊ЭޠNt #^1 S*\HIh3 ӓ:L$M7>5]iho=cy~C:6Ǜ7nEd}ŀCSG@,Ь¼=cZYTUFm6lYy;p~r`>Boa-S<dS嬴=Ez?#r#CD98[U׶H%t }{NU1u~E宴dOBZb| /4KmF$`!^ ~Z`Ʈ *C&,$d%. Y$Jp*~oNe/ڤ weZ (aL,~),ek&G5|*?n,cX쬹WrhL9wWLhA)]y &YtGiYs(6FtdQ韐;%9e] Iq *&šwƮVKf nmNR?p 37`QRg$N |]߱ø:8(AسS3DN'+0kx Iit81^E"qZvF%B.t-}: 6Qߜ }Ce̓%ad 9{z/P>ut a)uU؁W QʲUDZL~>-kY,F Z2Cҟ#-@!?.o{`g?bΕVAy-V<A{2T:FhqU[A kVTvz`iU-LUM%4x= =tr4Nh-74UM"0xVr8_-JF7Z8xCmu:*m:]0Uᕇ$;lT9Jcxtk==hA1cu.,ɕ1;t*'< !:Eoi&_{R9׵&ΑtX#{J/y; `V~WhνK}ҿJ *1*4'! KBj7V6 8sd`CαX!4 S^M"z(R}a(I{z]*@|u-1[2I!(WA yac ̴eiclw] endstream endobj 34 0 obj 2550 endobj 36 0 obj <> stream xZˊ+7Wx}^]"d@M~?-:*uznTiE}Ngk>?q7}?|i0'gͩwK׷upÜ9}~ݪ{Wf>w1wև:u9|uD|g(&)6SݬiZ 1Dk֯[=c(mu:wqCZdyLL}-]Fq6h!Ⱒ%ds_Il,cb Mw !tV q xPG\' ߤe?`j vF;ﶬ6;M1 a<~0GK'?w;&MYXɺVP9a%Ԓ3snM;A*h'S44[6αR1=ZP*W S2fI9 Vw̦Lײ%YU/VѬuAB)Zf2jzI۞Ƞ ![ WR_%l$m'R TFД7|3> stream x[I4ϯ賠ە[W 3d`t- E߹ȥzFF|_/UYۋ9E~i:'*}WۿNqr~eNJȼDxtػݿ NR "޶>{yx/ SrJ͸sڜ.fVmm~qoJ*h^'ebfrDq^_2oݳ`3|bgJN@\G|e(wks aԛ;3o%Gl~6p}V{rƨ7;d͋9Xe:XVvt2MB:)ht'f4seW ȷ.aD min"TJn?_[z&j8mT=S(HGƄ'TSqۤN`Oǭ 1[gf]X0lPg;–S݆//}e~C0@fP`y' 3Cj8)JDiak! orڏ!6"ZD\ A)nHM ^)ak;DZouRI6%;g{xlSxoyg4 w-X׵RF.7=uGOJ,#J3sP )Y=sIJ>T1gʄ}©gI r۵rf` 8V,o8E7OI8W<0U)j^^4]u2@r!}@ÝKZn9$^73ښ-_d?on>͈%t{^3=Pwws.d<!ZC C 8sÇibWp ykD)C .g؝-%B9]%+(4]1e{xf01F;:Q3%2],"4`s [(j;RкsJTGVUc;O :DC,Wi#uث pG4 xdq9]9,44|q슦/z|4Rk8㻦Q0/|x(*Йh]eGDs#QŎL<]+Vwx_tGrcd3V&9Z+/h[َ+a9<˔xbr̐l`"VYdhb" 1I{tf$SH(5?n_;o$>ҩԨ|⭥`TmD%X{r9ujא<L!8*G[Sz#8O0GpW]= TAfN\bqY@k!baqRޟ)18-nx)ne5*A*+A{ ?ںt:sпZr?:XⰶQv63F8lHlۏv6SȞa bM:\Tp6a%Փ%0O!wW]xR c+4AQtA Etl5$6N *A-|=YG endstream endobj 40 0 obj 2832 endobj 42 0 obj <> stream xZˊWzʇ4] 0cŀgwDDJa.Bjx8qR\tNbl [_t\ҿM`//?'ӿ+ޑ[|O{1_zn_?&ww~ݼ)^-]-15ituw=3fSz.uUoz,ݍm M##_P& eD 6Sr}'6aҫ>_}y~<ò*`Ӯl/dw:)R `8OiP/JÕZޗW7i|?rd4L,kLqX(]^=pu~][ȹ&$Sp=lkOPgiq;ƩȨKvalߛ4$XBVx.s0i8QVOį5Qrϭmm`%OӦy+0/޼٬&+|N@IuKVb8Ž0A;ާE3gBށg6cҺhG!u&;'O)fgaPC8ּX=ޘ),md!2  bGY14Gڐ0,c` ev,tP|MIkzm W5ٌxl>7dDGVxi=ɸEWD2"/ѥiu7+㹑,ќ5f u89-R-Z5P;xa/2"R0">lnB;fVϊ)Yvyo͋H"|5&2ZsX (JD-dN؞g[?a 7/&|FypFj#аmAG2MxY~lJ) =kQ@&) AzGB7))k8LXcXν"W'&%`rKFHnYꞔ 7¨v v, 50 ,O½lTA&hA]R&ۅXgR&6RHw ki՟}Ն@5L;rH?Z''z!b;:+g-:D" &.b#C`nH@C5"ϡc5F<' :Ra2lұV7 .sPwO*go@T\1ug >R, B;TQ`@pIZlb|chR x7];:[ #"QIYZ t&8C0 M,4Y-1Q˰H jm~-CwaclVx)˪Z`!D41cs5vBZe\[Pi|7ρuPZ/iFF6rQ3P9˭A z׀2}*t ]-Ā! p:UUǁu P RMhѧrc^e]IGG>T2Pr,@ifS Zc'oD$;8t2iͽ* î bj(DŽqoLW JMr -*cT6 \e2*aHia{e#]9t%-%ٮ*Y{(Xr>{wX*S뼚0%HY젳GwØC}6!ġ:|݂'!)껭'&̡HmHoJfcnh1FBNJ8Tx0bM'E'rr: hYLuFrt}\wz Dp'ߞlcH mD_\ec oRƤЋ̌4wg: o٬A2 78-Q$K#@DD''&ZJL:h09 s{dR<^vt"u# ! %[~V]Z츜 T*qRc-"P//¹ 7,Љ^ SFٌ1mL+] PlZjZeOؕEcg2/)#> stream xZM6ϯBw,Ylh yma [K~$>J3z۶,Uz$s9 i>j?q7q-jY-/I\;r҇?=A_YLo!U68l 7 zLvqrחJ3OטGqO_U5b72F2CH*7nGS4-a𔐸Vwə(|q '4n=-ۜZu WsWV{bX%]rc-΃f!f:ev\ HʂK[&AWjy y> +ˊ4xBLb*>䯈8 X<*nI#^D1%gbuki8I^fppKMތvJ +@) ƠN8!|>vo+shgѳD;X_sRהUk]7,@b/(P!Yߏٙ iGUҚ7=OC Jd%E#>zkc~9$Ɂ{RIJ2my9$]Z'g5+I@6j,ҤC993Ʒ*qh* sqZT3]5%7e Y*ϏB/~k+ʦ };J-Su,?}a &>nTfbrҧox{5(5U}^!PC锘^~NeZ+ύE@Զ]hP/(LMH5n!2 lf L>$kNzPXWr}/1`0f^BGt18 u芲Rp}׃PDZ3GcdjC2Jҋ=1FAka3⊡^EyJ}^gdAMWÝ3X+3\bwA=.eiGG0u9Y~1c# '`qA/Hז<4̪Yf+v0U;-#@ QMkՐ#/tV:5.l0 )p3:ߣi 5)I%x{+q`;^@PnDIM~ tٷ`3Zΐ*YQ,aoK̶kY6:q/ ^E3獏zM8>ؽjg&XQ[+Ö; A.MM7l6в,&,zVQuܽ+:)R6ۻChNݝ}|DF`Xov}Sr6(b"ȏiNi!Tg!{jW$ϴ*Cpg{dz׵$RڢdYʪ2ٚ@)0 b>jVcz6Uٹ@wdha.n~;BLGTRaiқt”rg~^ Zrf&ZXLGUS.0UWgFthؚYE`AZ'`SN%d0zU-k}Uq{#&0/^ }{$Gr{aR|$?C6i;.{f@=[0&Y5$eC4d,6 -e$3`) Ά+OG*S|blBw#5*m:3jSʎΑوo=GK٧dx*ދ7uy:4Nikך A3lKd4'NM n}H+z) endstream endobj 46 0 obj 2281 endobj 53 0 obj <> stream x|{|Tյ^<}f2L C@ &dH0$`# H|Ѣ q[?ZA%Z**件*1sϙ,zw_LuYg{}`CK[-D jBܸ!pxJ-YT̓""}Rvqn ĒEȸjW}|+crvloSG5б)^~eUw&@v4UK߆j=? !Ħ]'hjk:;S&>*82uk.jQY $;Sʨ3%%y;j/ `לq5-p9f1W 3l`1A qفH0S tÒk(Xp ~4#7&隳a{;`ή&6mue@t͊L=@`#\S)JIK}d6KݥldG@o٭5cjUu xv!}{g{l`Qqu]H VZ1ҵ``ӵ ldqp46aO\SeȊgH8gluaW~]2x{M0*RcmlwmY]BF͊ 췶n{Ƞ۵U]"µZ#& ~m .ᚪ`S78@A*~y[wvYiՕ)b Ddc:D;0)lD8Qq <9hyo ^{`ˊ`@ n?PZ)R[$厔9wVwi5 0j{paUa :*sTl:möKi][ :fVQxP0弄,H)-xRʡ0![Uw@x}8l-u))$#$)GBE}b|"f ElL/Y(!*P2cF/h'pԞ y8jZ..Wf=l2dW祤-`s:f;v( K,KDRl#W%f)#}#NQPuTPU6BZVhUZ֡mhi1vNsX*G'&< N{֫jgG{7{'jQDae\Y](rv?iTZoRp99/7ɝ~!#H#_d]' ,N7qp@?/k 7\/n+MN^r@:zyɌh5Ue'PJS9(D*Dbmlu<ΗX!.Cǩ<7Nlr),wZt Ý`l٫US{_ƟrqHY<| (%TZ:-g-_XTbI+jf܋3HsOwНcJt }ύ_}3tL''g#$߆w[ۭփVڡvcVlIXp{I(:$ BZl$BP|Ҷ&Nn~AQILIY6`NZq LmNPe^ip9л jreI ?FAaOrC\L{Iꁻ;__z^x/p(HAA#!9R2JL81Վ%!ɒ›VM%Ekxʎc_Vk8I_&NFtBh$K%"XcE:HIhwAE;DexnI*h_v8\bHEisv\*"2-B l%*@lBp:d r_$ltX #ȌQ~LX5Yk]d1ȟFk?`( <3fĆp;K1 "qj@g%jL6UUr Dx &8 a K%\;-7a\pLparaa8 %>8'IvED?N3џoo/ꡳ8^I"69(o%vaFFd Ӎm?_$Q<ҋ(8kqT;إ݉Gi0XV볪K=!,9hYqigzҘ^D{h/k=PR^.<%E!xZG|SkpֲSǾ8M0y3zU}^GMdj-4"țb  bdjکW%E L(=IBuXsVΕ*1OC噊+Dn0ىr-F6*/ n\&m$< Kafge<{GӔ؇RuUڿYg91~VÔ IEb^P%RbJTBIWB4<U~ 3ܳҡ,B@-٥Xb1Tjy|Y.?(?![ҥ|)"-6vidUv,{]AD(QUeIR^{NR=gsl6X,5YP** LXhLDM=Fc&wn]KKZhYl3˔F'<+|Y ߇kwCd3}B,(= LŦG5)  'HvFum@bŖqzf ޿OL-kh H ڀa0~ER:`no 3XƟ8ͨ5(/vt%OQ*p.^*#<õf\|IoǞ%+w{xå_k-oyl+|DLꗎFo@p(H :m`"H|R%H)ZlqR\ Ar;ÐۼܼAb mSL \-WFb.IxM'A:68XI#9CK_ٱIQ^v*}PS'"Lɨb-:h}ɣJ Q8 g HKZ%"arf Ҹ nF[!dcP;"*̮zqfPHA8]٦zIӃT&t*%bɐaBH;-?-~7/qi_e^8W%E~tbK(X^a4ţIQ!]zHP-DCMy,N bbkC}upI {'e D!Cx%o ig@PRx sKPJRO1HM(9I_5,Qd"\-(6m[wԭN8m?j9z6Vm6#4^h(qsEE55p |~CjX6&yŁTR,[9R)_*2N3Yrnss~TV s$!;m"EJvJU+M8A4̎!'K)P5Z`nBQEb-hYkDUc!'kifbƒ\JA Iyk诬S 0ƀ\^; a c|weo$JrHsd \+J:,kUc=%JҠt(۔=cb'X{=r(Wimo?h?j?kHvSd1TjE|[+튨X,/mvx XaAߌ[Y{-fA3@L(%d y$ћFO _aaX9-wWRYR0U埢T=:43\.Dڭtq6q(l,8v2 (r"ۀ%虘Fe,&ܘG?ӷqO`ռ#77;"KJJtطͲ/VAP}Y>.!Njz,˙ZUX!$YaI,6A!4h'[#rḵh*gBʹ@hCoN]I)}`oĘ v\I%yjf^J*RTL)he}-離ğ& )Tju[S$c$ޝ(H%Y˚Y  VTO{27̧n2J,)O _ykW'~t/xd&NmU#7iGrvNc/wcFn5?0#F iOsCiE"wW9/WXfa"r*eUvfj >%Hq=}2L KDT2͵uuKqId$3Cɝɻ'L&{ qzzcTkI'}hOـ*jOnvR 4,A$T T8q8<FYTKi):tƣQCAf7I4in뾪[O?.a7FV7L+o㎇J7a{v,YTG_Lɲtjm#[N93MaDKyfB(8AHde2lkUhmS/L`{AODcRiZ蕃յ}'8TPNɝտ{n~}KSr~REAE7 !ߏ9O9ϡC,s ϗluZ[7xG1.W"ïa`؆6 ͺB`gKLNziD#E*óS9ʜ{cwp*DOemV/c2 w>/Y3_$Y2'濧@;W-5Q92:ȅ d!'|g3cLo*,C$W=U!gS?zgyyiqʖ2{*_(ZB®ʊn{̢K4eCgf"3cTv5>H%WY1'3Vq$F~os8HQ5vKB$TmXsD,,ѥ ~,FZ,.\_}*T Ĺ$i2%zsQ-Qn=/LhDW(3vPLajPYiU'>=Cv'}*,xu}[2#d)$› cǢMO.<+ $#[Ng0|:I/wL,gZ-UT@ׂR*R RKRRR10fZ $s!tEԊ͚߫a(S#&d#GDH !(Y/ df $ڻk|hO)P>2n7 oϼkޗ:˽Wz/[~Tyݖ%y/*OK6i/LB' SY$/_UObfgS%^31I6(EVCl<ѝ0XEA*bzpc+̊`L5ЁfpNmS,[\ AVR!^Bt7+&+ l)ʠ1.jrYM7/cK]w%6-}j3?,~Q@ =̯}DXW;zMɀ\& 8*NQdP"|jeo]Yd"ZA"f xpEaɭ0I?ׇ^g oČAxH>V4E'-Ɔ6oҬG_'yx'4o1G)tt(]` #U"ji$p*@VeX"-@yz!L@"uk <ȑ/خԽpIteO^.1/ !D'Ny*wjD!.ILLjr 95֑?٭ IH3ȑ#=࿨OymzA؛'Ϙ_h8/,L$+$)Q#\NW6ltوltCJO)7X1*cx7'R -==>"c|Ewё}$m,>Ӄ0 y/i2A DMf v06B*&,2c{޽C;{#hlq^HSzY?ǸC&wŤ(iIIr=Yx&( ,@ݦeYC卄n.`s}9v\.k,Mmg,2ԜjQC&v=*J=#wXĂ@4"$[jbVv0gJ ׂ#js`"^ͼ\ct|!$^Vm;_c3_zPOOb|h}:)@volZHQٚ ?0G1)9~/Uo{nPݠ f] 4q-MLu$JJH/$jQL~cqMωӠvxs/  ۾セvcN_Xwn|Ə/~vcϝhj_Ų@r*L5T\킈"ځ5]Z1]OGg|5w٬ Fp2wAnG OC~1oC{v=-taYNiR8'م, %,)p689%CUKY̕d)pFD|NJnV{p***i[H&IjfcQY6xGhA,UZ;ApR8+B(3~'vP萀D0o@")l3|yax,cSجa1R,E%KDSLT#ijϣG̬+|#To d;d4HKb -GYDckq6>2:=ijvb[ kk"{ɴla℄K^pr_ex2z_y ^EE?fD f ur|S~Tw 2DgQHR>rx ΥCp ̗ ɣ<3g3@.#( 0>@r=[ao, S;ӈ3`ջ0oUz, 4K xI P{P),]=> +AyVJ>wj6ϟx!UbܫadNx,$Uf]b9ɪNf)Ke9HR4|9ފ' rדI__nyJxY'Foh]tr})4@p{{PI]OC*)ddXJ+tgz@+£C:.:tmO~ϩ? E!)'Ǯ h O04jsj݄e|V6::b~?氄V de&,b㰂*0atobI,0)rl2a ~`8u@&D1iĄ%&,ՄUrg_0ax6a5a;)QX&tP8l~f"V;9lgT5a<3a2 E&,尗r |,wp8&,N0aķu #uSkLk58o&L/07dc㯵ׄ֋vMl&,ayyq߶ȄYJ &ߚ0MZ6VL2erqe7foiZRq 3׮ p@K]k]ƺUm[ѶnClkW :t_;׵⨁ss/-Ǯ"֡nRK FV ed!/@An C8շ` ߂gbۄx/ÚM֓& qq + N5b_ b[ͱ؝-x/;u7"tWf \2f+?:W5g8 GZWz3}[͹';}u&Qqx Wno-_FU>7pjc}:ęlè[xrc%gxe_ɟXǟ¯¶[mb~0=Xß[ZI {2:~W_DZ~ jrs_w4g+[sBiʤ:YW>sqZ3V0Zw=L.XG|md3~rSk%6ۤT)IqJ6Hu\^> endobj 56 0 obj <> stream x]M0>nw%"qH%B8w^z=vfƏGr{~)c{:C7xۨN6%俽6SQa8UQ~OnPOnSTF֚*ԴqnK,VUV~]ġr:?9ZUnNl[P5ق= ~6URR+\K>N=cpȨӿAMM:qGO4L?YRA bo$7mpŽ,kowxvwp |~x?#> endobj 58 0 obj <> stream xռy`TE7\z;Nt @ 1t di0 &!I ΃< "JpAȨqtǙQp80@߼vCp?Nnݺ:u׶5"3ڈ( 7os&BgŹ!Ҳi6!oV]<|"뗝W< uodzxF}< B+Wi <{Ww4JB Սj.\6[֬[34j`[6,}BuP ac&T%Y1MfզN;MNIMKggesF5zLqM8SSM/)-+̘9늊sΫ`UE(KC.OC fNBPA}!C?sQ _Ah2t#Jl27CX<{*#^< ~ ߌ`'.xj:E!]O]'5pu j_ýތ6p)q@{q>6|/9#R^VZ2}ɗO8(40oQ9Y^]YLF"K@ FJeun!;fׁzȨQ탬Ktx1ߥ%PrJ %+FţGJ/=%j_OW/,pRosJˮm\ZW57GB{&H ՝hًs&c 9XX4~YyҒT鼮niz`}Fwzmݽ*ZZk^XV$Mʹtn{n@I xaȍݣ%ݹlVp|As,Ēli}~֗zh)\toկ}hij Vw:vBvgc΅~6UukF,n]%%:D%ZwlA`d tcsb~?55ğ+-an+; ̋@̗| U~t'MI.];.ur_4Ulj9?o?c^Da6r9KEI*f2 L+*Ld3:ũ(Q Z`K 5=nQHگ.$fu+CR!BvmҬC#|%C:xIb~"0<$n,XGfFs}@c:<ecc;k~`ּEQ>5Y ̚,<;a9.s@l\m\;qi65ksKik6 $|պf<ls`~83 L_w(ΠHi{k0(z@@Ե C0^7zp=C(sɅ\vcWhC~+@3uC/FLD/ʪG^[fipZm6i8-H) B6x AE$VZ)lPis F SV V /dJ=`/_k.+.:yc?Oޟ47bS҄(eQ2,? _ߒ?%R%fCRv*1G)R"JTի)'3{A**1|&o[mvzwxwy{x O,`xl CځUU1)0g|n)MMݒ}~Ț9{Ok b+|L$i4E O8!|&DKP.#Aa *@f`\[3vs<;Ɵp5erV8 nɱEl em"c*`vΈ7Xٌ&nivȹOybDit< (jFH@ěViTk˱AQNn[v͌l #tX%[+$`R٠Z /t*@%1W:M$Έqz3 B& Ψ Q(1,`ˆ+L9.;3 vi'kz~z//X.w{_|5oSPȨ)GOkɫຯqםloy3n. BVG)K:ih )qAdtP}9j0ZM䐆) sjMƬCv J|v'ٌ\PMq|aDr>5@ dBsWo+ŗx;Ox&ߠ'HW^~}#<Ѭ-`^loq඘JjJ&ZlV xܮ2zy1$7GPp acLB@VŞc'bKe@unSjT0;--%LrKnZA˼ {d9ϳ<=?N>hn`e&h3yxN}]{̍&hqBz1}hEazOX[U2TH/1  AcXn26%$IYeBe0_>L 48xv侴)W:'?Ex c%9H+@D3.LǴώtA3aeo>m9dL8GAaҘҖBB]4:>谅4Ai2ca,᪴L666u f :ufzdBAPZxsǓj|GlZ<ڃm=[זԴuݸ|+'ϩ.݋ 'Ok}C1czϰM[v.p:ב]?S j6Հ⒆- #9; t<QYJKǍ-- mCc帒t~ 7͞Ent]x:IQw(X1`$*tr RYOQ6W9\Ir;BDRR);L2)p@nZ4T @Iv7pgk.n1;{n~޿/:fʽeUTaI6W['K8?3YO-.9];%\$E$$ %J¤$:>>Ni6STI핆 E  ĊUB) U=@4˳w'W<WpT<;^8l*n >6Nm0 ֘ pat:N]nHʍ;;xqv,T 2 $wDBwP c!=|E-R%7aU3Ғ\)c+,&9u.9$sLe%ąB0Ԟ4\z??JLr᥻䬟O/KGM}87¨M"ElBR$ ,}>p*>ٝhڅ#4ζi9iFI+)n4`dNLJ V:ӹȹIg%5x95J@)pjd'o] 'B՟)MŦOi?D}8'>HRqZL-|a#U:*&&Rn :Ga!T8*/s=ԍGNLJݕJ2d3q0lhYrzCnU`^ c3+nqvv++kۮ߫*6"c8S^ֲmew3>ž rZE)b2&Ʉec!J/N!$qnRA#"H,2e6XyCLDL =L "uHWI8L4C;KQ( w#F\Po[rūwɽr/c_ S!IqLm6$QU!(t̛ 7%-"9D¹JjRD"$J:(݈ȍl" 0X0[!Ih`Ѷb H!^1ƤTu1kT?b%P$bF¶jD&E59@~n0t,2bVhp^ɈUņ]Z>5gơݨȒG JT"2 >N؊džd0 U&⮝pqlQ ~a ϭa{zqLqI$&[ܠ ivitD$t6vzΊ27f/m W36@ f,`, F{I=.\}b}9tvr:g7K[Q&nY)NU1bK|Ծ-j|][@VGXtfXAEl:ՙ mHl pXuqg÷<|?h/k.UXY߂MjBpbFbL2U$Dbbhh&MMvhHsD2'B1f  cgpSv#|౯7xC@v/n}%2[?_+nkLM|+S?kƭ0 Nj%:q;PM ?v"`[bZ;' 戦9##bSMHI`["F6 |ãr"* 5bň{eȸ`$*G!Jn*V,Q(.a֚Vop ;!lI9 |v$_Oqz>.A,a*yyJ`_d#ao?"3Y;8 "$cYX8 Vv=h?mAIܬևI (b._yl$ZjL0*F1UN>8q`jAN_prWx̀nz\x=qXҎK'ܒz)n;zи0j3m![&6EQ7An M.@|b@D'pcC+Aֈ<+rDe5`AsaMqwl@CX1|DGY2,C;,+_v%Q>j@GsN[Q%;@0aƥz-T.C s"(|>rlRz Wȅp A`59o8u?κ}VWjGoƒzEW _WD qDE(*3)e6-R -'I(7K$0! 4dĸɈQy Aŭ`'P5raK|Lbd4YQh "c\xPkE_A&k։n?a,F X#@^p>*S  R e e$Je%J  T0L UJXm&N1IULiHti $9Gpw`"/IKZV a&TnKBj=xGm-@@aFtp.AwS ~sm ~SZRBv-^{p=8YN ra?Yk $sYl2[]R% HTd!y7%ujЏ~i/:UE7?zÓA?[!I|dnMhİ=0Ti$aQUXqi9,")`q"4 =#`$6e.vaeU@Vc]+2Wݛj TkmֵR :tY^FMC.[SpřcЁ`DmMP2A洸MڔBp!]{䂰-J.۳*zZtM( ;vLZ0mV1i(넷밁{ R~!-+&7ΐ'[%=.fZobap͠hBsF&6-Vhk 55`֨78V߇rpǡ?[ĆR%=$G~sڒ ڵڣ wڳ0-OL'"c56;" Mv`5w-L "*TBRb$K. ʘ-(c EAb.qxZd6sy9'"H! Յ/s&p% ~j"'JAu.M[O0ClyB @VjPQ-5J{ >êBg<.AJ.7(PcY(Wk&dNT e6eRZdŝVv 5kF 3J332yyyyY,͊aBVu5:\~q[b1`=˰Ϡjǀ[X-,{PRܷ fg'⻵IN\0h״-sv{g/I9O-o9k}> 3o*{sM~qђE)p=Q=\^["fLWI?~:݌~zM*+t9v:v;z#**evn16`\d\r0.Fdڑʸkn,y˯طHADڑn)잱u-ۋZu pp0lG).62)3P"a77%q=3ϽBNڬvn!hfELfl4G01# @AKb+B߈G18Ej~&a=).]+8e,OoW4QK{gxOy08I!н)!VL9&-{) nB#4#7Cfvf؀$j D ~&:y^#%^<ƷSM;UL-`lv _lBm܏x$=s)Nڛe^[C.$BA~،V] Lz3I" c3iG;1bw`ffH,U*}8N.~qpma#$ʶ$!GtSR;@6 >:-v,.dmM?|3Ɲlq—b1|7?PȎ UqHnvAۭ57XVaoěw 6 mo[ &Tf%IlJMijP"3ĄU,2:Lx0)uwE+7$S5Y2X9c1y)b X-j/Wθ,-~ :È1W7vQ៞-RH1vx-|25vp_qM %U@¦6X?W*L%vN)Yg'( 3.C;:XV,4 }Nh̽-KY^I(˺WV-|m qK?V"1dӏ|YjO.q='ZyQzпW:FcB3 (酀V݂AH#h Y-`/:-]G'34z<{]"X?W ^O= q{>4 X A `&ˇICq9bVywI3}e9 !'XXC!YyW.ݔpHݍS9Ah+&7=xt~o{Vm+޿:1FI~ 2ō*䋇;.u*.hlw␳lw y Jr-r>co@5X߼Ou.o-[2k^8uy\} >/<5d-VYZ!,L¢J%J9TY%[r| Ro6ԛTDP?ULRkSP1qb/-Y N6pNCrgR>!XM FvwHB GoGj~=o埊j^־Ѵp՞ح%x!^Nqנ.Dc{)))])wkQG%Z)ƪ`V9{;`r؆aQyИՖEhY$5ڜڑ*r*M^01-[냭A!љE 6)%wd.ڲyXW3 y{77~5f  &f ')~7e?޶eDM`l>Wĭ٭Kݕ,LN͞arݤIG7ƍ?՟~i .]YNb'a[!ԁۈ|,́;K1)1> οD {A[~qx*S*rNثh6%. )W(wwѝt7}&DEtnC]L4ŶA|t ΫWPw}̽ p&?}UrjD!ՍK,s p.z?7V\7X)@JsߵM(l# @f;ч:!"`oxކ\?S'Aw=NO Sm_bT$.NŻU{zWYz&ALa20dE Lj,3\n276(1 VtB#]!GM1?cSl0 ^LKdjY,BH:`S;Pr9 a1Sw07~`:Ӟ*x֊ϯ|<'}5؏Fmac}"8O;Ex:&U`g&$$7V=k8h giz^ sb: $|f*w'cÆڒ~DigƎ ҜёAH9/8m8NXG$ؽ39IH؞X[$1q 8 @@e x4v^/e1x \{W޻i>VV7v:]Z~>quG{wVֿpy۫2o+[ma2Fa&&sS \"utSE`=M_S}Z^\HpP1DNM]`kYQJULeDkrh;Dg,klW3GpD.];IH؂ ᲐZv ׏O;8u_c죏u./5􃽈L_ ^kJHY#֨u*KqCSj3).%xN!Wo0Cq`4w S]&BbY9b&l DZ+ƒF (mلv5#:0H\ vMl246 '  F3 @rS+w⡾ﰑ¶C;.apD8.OS3YKY6c f[j@VV(C41\0xGB.9H__d.y>=S30|.߿:^=v܌dڑ<3HM0Q^ڏ+(V˵[naS-xV JU=S?9wg!i%$ߌț C~%K?6JFu 5h* (] ͅh*24^KG9BSϱA@sW^dEfH$K|G N&4U٤'ݯ3SG@}DTAz@?AށvAxR(vG!f@]_$`L,e!B5.GydA.óoA:y[!]La=1-gh8Y0x;sH逿t=}W EOBR<[~GO+h>O }.6 _xڄb./kvz$NSYEtVFtOxz8+hV.gi9+3Xڬ/i~֮hj^i7ax_Ŋk֭Y7}ږ5kׯXsU|:ukm\6fƥm ͍}+VկCK]ٸvT7&?B~|4AkjTVAj)[YAp|k!o}W!/ѧt(ۂ{+Pj>X h e֠uRy+-rV@4LvWA|uFePr[ VXjV@+!x}u%oq]wlLcP>kyVkpuk2>jFk}l^QA=#Mlot|z޳YhuJ>5/>)hrxY^eֺ>xmC[=hCo/_y;*N8'%( 55r~II;̞̈́Z}|W ?;'1cku_B{=*H0b6m|]4_~uNUV %J5uWңI3lGS gƺטోkh%ǫ.\q#uo_-M{f|ݐzg[_Wz΃K(jeg%^6jfk=Lϲ1Pyq vY- yhz/)=T+\ez-  rrpI }-L+R?fF.h?aW'{'?^dd92 VAJ+ 4ChB#e ,PB- @Xa1E!D!TAB ̇P a@ fA areJ!@š5 D{aQaj]ֳE=W(g%`؞f4hLridѨe,i`Ȟ,SϢ:{jYszjX4g =YٳEjz,bѰ+Y޳Ei= X3E)=,J"o\yz(g6=,r\"g,9zf3EjOErY{Xd)e9oQ{lzu..]157Wӗq2yo(T§z]uޱ|P-ޖu~o|o_ endstream endobj 59 0 obj 17041 endobj 60 0 obj <> endobj 61 0 obj <> stream x]ͮ0<cÍ!Fʢ?jn"5Y˙R͙7ckq96 ))܇Ԅ]]3Ǖ7zL%v/zdߗoyz/v8OIujOqn< %zRBQv%9p&Lu :ϫt}8TIr/zZf/E[P{hGUPv%=Mu+ +-QgOz޹܇69`_#?rȿD~bq!Y@}05[͹GcoOR5z- e_F=4-εݒ_6䷨ݒj,C~fK~-_',Ew?#/!#w/w'y 5JI ~菐㮅yqB~ќwx{ zo/`p`swbuӱy/'ճQ#ӳ"?jt#WO?=5zþ'>O~_cX{Г߫f9X 31MA Y:#> endstream endobj 62 0 obj <> endobj 63 0 obj <> stream xZ{\Tǽ9sOξA@ ,]MXDVXX!M,^b4/4{o[6K\1i4Ҥ16ikJo~Ҵ,7Tao~fEoxB?B[vv+7ܻPtn{؃"64nrKBZ"'bHsffAƀ ~ ePݗo&YwG-ױ^4Wll~?"h7 3aUZa>sa~~h#F%No0Rdh~ 8Jbm< $ O_z}T&DFPFѷJ~N~t]x-s?:>~)*8}E-"tף t?֢6>=ד{k^6op=0:"m]US]2PYbҫ\Wh^a'gەj3)FN+'FF%iwuOr8,AK*t+#x0;*J|5 V1B%;z(XǍJ rgl X wET7 ya3sH2a$'i]Tgg3`BE\d6:gt2\mi,04#qN$007ݕݿNBwe ^ap\#L=va&%R=D!UqL> fegӹ>G[߷.+hK7>5Җ&[Җ}-SUFog,5o2rڕ84nig$:஬LmC8hfX;6$ꃶaEUQc+^R RYudJJBTOwTS;)sĥid L)9Wi!TNPvyrCl"9@@ #Q/*qV z7ĐmFm[]ncy[]~ReIRjSfYg``[Y98طŭځ@#6 &xʃq1St \ņ:25*xX6V u~|`q60WѸ~x+ҚBkZMNbMc<#zF&M0j437} plICxD#T|(.lsN9{A8@#9q^{9PWxc5Q<^eg¢%cK@H5Dz\qm@ʵ)=)$Fk!Z-!h2yLkh c/@ jh(ۋpwqVlqMlNyw $fW,9ΗO\;~c3x)ޕp?q&#Cp^p%tlSU ހ30h!ՠG!n׊ky.dכx`lcK%'67gc l)_05`EJD71guJ,^'u'?|,ygÃ{8afaF◷^4}ac"M=0@~3qqejmXi5ڛIHl0&攰)f3~ӠittҤ1 fccr|@>$ N2Fnje+Y0:Y`^:3>*ܰcQy_TW~ʧ߰a ngRJf]_0r?Uռ̷flȝxg7N\ G dG? ǝoPJR4(ᐁ3 !="<]`K5m̜\e7y#/W:܊SqU^$ NCg Cc "20iC&6QS4L0  p1~a fhA` iDf䈻z[[:q?Nş^:qXP&z[U;SN"ɩ2V+~=7er P=\pDj5CXENFIFi_%T F vLbI+̳BzFgVXV(ʣ3AcgΌ1ᶃ4DۜnO0iE5Mg*-x^?01%/'\=WVW=}{GШ{ rYV1҉bP 6A bpD.H:C (;֚s ciz»`~,Z賖#o;MRfƵ'{ˤj),NcIx^|_ԉN#†J+q'y}N8tj4!\c';rH O]0O&qleJ @Kol~%Oߦl͟'~Hsܖߍ>  eG3asgb>!#]$Ꜻ*]$-vb7hAަ鍒dX9AS7윝,,\o Y4␌M(Eo;]hTz;[I!kT(@C͐ɰwlh^鉛^>⩌ąu7 i{`~,Dğx7gcZt}:JJJJ2\Sz4(jF1:zxT5n^H}knv%m ƍn_U뮞al`ƶ'=&K?9a_x1q-rЊ |tOekk~4> ~k{ϺACi}*{]Sc,i6#ME Q,|TOigjp|-wi$x6|9u^9%K,kB6~NNԂ tw8M7QB AbR5@v "qSs,E½ё2\`ݥݿ.c׾&9wIqUx@ ;btĿk;k#\Jt9] d2%O'S1J ĠէT*)!\bzLguq|m:Bfwr/`;X,O ^N"q)b)ӑ<8hr^X}u˗XWݲvco.o ]QUk_޾SteiXa}L4a|H4\'p1sƠRCn!KpSlUB 6azW!pR8+/ !-%NO&O ɅUa"3-Ax|rײH3p5p /';V Yמ Ļ,G G_<UOby S6_T1?B!RŔ:q Ɗ]mn%)_YP^^ikljoV*;;;#mۋ[*KvE;wF6tF4Ţʚ5ݑmM:_jKLUIE;@j^~^Uu6EQhMp^n5h=gj'w4'UzL"Gq-r _ Ԏ:.mCGG><rJY6uoE{vB_z vT-Vi2X- (qV(m nj?G俗_<:^ۙuK*dj vFX(Oena(P@.F:YK3-ЏڤnQ6n ml=tdjmWix9Z;$@ ZzƧ6022>FΈN:F3Ӭ]BͭG䬻 UKuz$gZdEq]ŒP@-ЫQ^'=̤M=f+n+jGmfݗBRQ5&-$EYLE7i_ȣFŰ<ߦ"W<֒mSܦeVoNII7{X^ĦOf󕢈A2WU̮)y\M˛(ˀ܅$hX/k 8crrQe*S*m*"vTŲUmLykuN,]h ^I*6&Py] fW7Pҫd~4jִÈ,RbP/'m;ӳSܗd}(YױrI>396t4| d b'IQk~N3Y|evm Oyr[ϟMW1k-jmX 0?Mć+|x}~ kYP&5^(Tf]_ k#PBPAЂYa(uPr 5PVB @L|s#{yvg#=G{qCyy0/YRnSed@&@YRlE%dt$ /qjGĉPm\0_[jQ(gάϬ@*^Ϭ/+pMɧCX:ڔ俌5WGQ*# >t?bՎ endstream endobj 64 0 obj 6565 endobj 65 0 obj <> endobj 66 0 obj <> stream x]Mo ݡ i(RRвi!C06ic96քՏ{ciyWc̹6*ܣts,v Dzd[M|qX5xc|Q1no}6pkc=wdɵltL0/O>;y%F ^BT<+VY.|(bťo+=x![H ]M}b| }H|BI=s">"I5w)bLqru>5-2'i,ڍ]|'v endstream endobj 67 0 obj <> endobj 68 0 obj <> stream xoTϵKڬ)Tn8iE*Zj, \sx?+hx@Be<񀄢j{7$h(xъQ Dz4ok @ {VH<"#GwhT~-X >M*~K0i* OMP$d:5 q"ؐF/xd.: I[ASAsk\OfcwKsd,;[qJ$L6!'FI=JlnANś&)`N닃Zoq\m5[6ַʣM~ 9adB.#Y,~湙>a? kw;p\ptD\gB&*rgI,a> endobj 71 0 obj <> stream x]n <ChYRE!?vo_N+0,|4d--ͬ:,r갪Qy!#.SUћ/9VdKl6v#RB5=jD]cmò_k˟*ȊUQPϵ@2zTeJcήJcۀc<{OT^߉m endstream endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <>/Contents 8 0 R>> endobj 12 0 obj <>/Contents 13 0 R>> endobj 15 0 obj <>/Contents 16 0 R>> endobj 18 0 obj <>/Contents 19 0 R>> endobj 21 0 obj <>/Contents 22 0 R>> endobj 26 0 obj <>/Contents 27 0 R>> endobj 29 0 obj <>/Contents 30 0 R>> endobj 32 0 obj <>/Contents 33 0 R>> endobj 35 0 obj <>/Contents 36 0 R>> endobj 38 0 obj <>/Contents 39 0 R>> endobj 41 0 obj <>/Contents 42 0 R>> endobj 44 0 obj <>/Contents 45 0 R>> endobj 75 0 obj <> endobj 76 0 obj < /Dest[1 0 R/XYZ 254.3 696 0]/Parent 75 0 R/Next 77 0 R>> endobj 77 0 obj < /Dest[1 0 R/XYZ 225.6 651.1 0]/Parent 75 0 R/Prev 76 0 R/Next 78 0 R>> endobj 78 0 obj < /Dest[1 0 R/XYZ 90 530.4 0]/Parent 75 0 R/Prev 77 0 R/Next 79 0 R>> endobj 79 0 obj < /Dest[1 0 R/XYZ 90 367.9 0]/Parent 75 0 R/Prev 78 0 R/Next 80 0 R>> endobj 80 0 obj < /Dest[1 0 R/XYZ 90 191.5 0]/Parent 75 0 R/Prev 79 0 R/Next 91 0 R>> endobj 81 0 obj < /Dest[4 0 R/XYZ 90 470.9 0]/Parent 80 0 R/Next 82 0 R>> endobj 82 0 obj < /Dest[4 0 R/XYZ 90 339 0]/Parent 80 0 R/Prev 81 0 R/Next 83 0 R>> endobj 83 0 obj < /Dest[4 0 R/XYZ 90 235 0]/Parent 80 0 R/Prev 82 0 R/Next 84 0 R>> endobj 84 0 obj < /Dest[4 0 R/XYZ 90 172.8 0]/Parent 80 0 R/Prev 83 0 R/Next 87 0 R>> endobj 85 0 obj < /Dest[7 0 R/XYZ 90 377.3 0]/Parent 84 0 R/Next 86 0 R>> endobj 86 0 obj < /Dest[7 0 R/XYZ 90 295.5 0]/Parent 84 0 R/Prev 85 0 R>> endobj 87 0 obj < /Dest[12 0 R/XYZ 90 666.2 0]/Parent 80 0 R/Prev 84 0 R/Next 88 0 R>> endobj 88 0 obj < /Dest[12 0 R/XYZ 90 576.1 0]/Parent 80 0 R/Prev 87 0 R/Next 89 0 R>> endobj 89 0 obj < /Dest[12 0 R/XYZ 90 458.2 0]/Parent 80 0 R/Prev 88 0 R/Next 90 0 R>> endobj 90 0 obj < /Dest[12 0 R/XYZ 90 284.4 0]/Parent 80 0 R/Prev 89 0 R>> endobj 91 0 obj < /Dest[12 0 R/XYZ 90 210.2 0]/Parent 75 0 R/Prev 80 0 R/Next 108 0 R>> endobj 92 0 obj < /Dest[15 0 R/XYZ 90 666.2 0]/Parent 91 0 R/Next 95 0 R>> endobj 93 0 obj < /Dest[15 0 R/XYZ 90 637.9 0]/Parent 92 0 R/Next 94 0 R>> endobj 94 0 obj < /Dest[15 0 R/XYZ 90 514.3 0]/Parent 92 0 R/Prev 93 0 R>> endobj 95 0 obj < /Dest[15 0 R/XYZ 90 404.7 0]/Parent 91 0 R/Prev 92 0 R/Next 97 0 R>> endobj 96 0 obj < /Dest[15 0 R/XYZ 90 376.4 0]/Parent 95 0 R>> endobj 97 0 obj < /Dest[15 0 R/XYZ 90 308.6 0]/Parent 91 0 R/Prev 95 0 R/Next 99 0 R>> endobj 98 0 obj < /Dest[15 0 R/XYZ 90 280.4 0]/Parent 97 0 R>> endobj 99 0 obj < /Dest[15 0 R/XYZ 90 212.6 0]/Parent 91 0 R/Prev 97 0 R/Next 101 0 R>> endobj 100 0 obj < /Dest[15 0 R/XYZ 90 184.3 0]/Parent 99 0 R>> endobj 101 0 obj < /Dest[15 0 R/XYZ 90 88.6 0]/Parent 91 0 R/Prev 99 0 R/Next 103 0 R>> endobj 102 0 obj < /Dest[18 0 R/XYZ 90 720 0]/Parent 101 0 R>> endobj 103 0 obj < /Dest[18 0 R/XYZ 90 624.3 0]/Parent 91 0 R/Prev 101 0 R>> endobj 104 0 obj < /Dest[18 0 R/XYZ 90 596.1 0]/Parent 103 0 R/Next 105 0 R>> endobj 105 0 obj < /Dest[18 0 R/XYZ 90 514.3 0]/Parent 103 0 R/Prev 104 0 R/Next 106 0 R>> endobj 106 0 obj < /Dest[18 0 R/XYZ 90 418.6 0]/Parent 103 0 R/Prev 105 0 R/Next 107 0 R>> endobj 107 0 obj < /Dest[18 0 R/XYZ 90 364.8 0]/Parent 103 0 R/Prev 106 0 R>> endobj 108 0 obj < /Dest[18 0 R/XYZ 90 243.1 0]/Parent 75 0 R/Prev 91 0 R/Next 138 0 R>> endobj 109 0 obj < /Dest[21 0 R/XYZ 90 363.3 0]/Parent 108 0 R/Next 110 0 R>> endobj 110 0 obj < /Dest[21 0 R/XYZ 90 337.4 0]/Parent 108 0 R/Prev 109 0 R/Next 111 0 R>> endobj 111 0 obj < /Dest[21 0 R/XYZ 90 283.5 0]/Parent 108 0 R/Prev 110 0 R/Next 112 0 R>> endobj 112 0 obj < /Dest[21 0 R/XYZ 90 243.6 0]/Parent 108 0 R/Prev 111 0 R/Next 113 0 R>> endobj 113 0 obj < /Dest[21 0 R/XYZ 90 203.7 0]/Parent 108 0 R/Prev 112 0 R/Next 114 0 R>> endobj 114 0 obj < /Dest[21 0 R/XYZ 90 149.9 0]/Parent 108 0 R/Prev 113 0 R/Next 115 0 R>> endobj 115 0 obj < /Dest[21 0 R/XYZ 90 110 0]/Parent 108 0 R/Prev 114 0 R/Next 116 0 R>> endobj 116 0 obj < /Dest[26 0 R/XYZ 90 720 0]/Parent 108 0 R/Prev 115 0 R/Next 117 0 R>> endobj 117 0 obj < /Dest[26 0 R/XYZ 90 694.1 0]/Parent 108 0 R/Prev 116 0 R/Next 118 0 R>> endobj 118 0 obj < /Dest[26 0 R/XYZ 90 640.2 0]/Parent 108 0 R/Prev 117 0 R/Next 119 0 R>> endobj 119 0 obj < /Dest[26 0 R/XYZ 90 586.4 0]/Parent 108 0 R/Prev 118 0 R/Next 120 0 R>> endobj 120 0 obj < /Dest[26 0 R/XYZ 90 532.5 0]/Parent 108 0 R/Prev 119 0 R/Next 121 0 R>> endobj 121 0 obj < /Dest[26 0 R/XYZ 90 492.6 0]/Parent 108 0 R/Prev 120 0 R/Next 122 0 R>> endobj 122 0 obj < /Dest[26 0 R/XYZ 90 452.7 0]/Parent 108 0 R/Prev 121 0 R/Next 123 0 R>> endobj 123 0 obj < /Dest[26 0 R/XYZ 90 398.9 0]/Parent 108 0 R/Prev 122 0 R/Next 124 0 R>> endobj 124 0 obj < /Dest[26 0 R/XYZ 90 372.9 0]/Parent 108 0 R/Prev 123 0 R/Next 125 0 R>> endobj 125 0 obj < /Dest[26 0 R/XYZ 90 333 0]/Parent 108 0 R/Prev 124 0 R/Next 126 0 R>> endobj 126 0 obj < /Dest[26 0 R/XYZ 90 293.1 0]/Parent 108 0 R/Prev 125 0 R/Next 127 0 R>> endobj 127 0 obj < /Dest[26 0 R/XYZ 90 253.2 0]/Parent 108 0 R/Prev 126 0 R/Next 128 0 R>> endobj 128 0 obj < /Dest[26 0 R/XYZ 90 199.4 0]/Parent 108 0 R/Prev 127 0 R/Next 129 0 R>> endobj 129 0 obj < /Dest[26 0 R/XYZ 90 173.4 0]/Parent 108 0 R/Prev 128 0 R/Next 130 0 R>> endobj 130 0 obj < /Dest[26 0 R/XYZ 90 119.6 0]/Parent 108 0 R/Prev 129 0 R/Next 131 0 R>> endobj 131 0 obj < /Dest[29 0 R/XYZ 90 720 0]/Parent 108 0 R/Prev 130 0 R/Next 132 0 R>> endobj 132 0 obj < /Dest[29 0 R/XYZ 90 666.2 0]/Parent 108 0 R/Prev 131 0 R/Next 133 0 R>> endobj 133 0 obj < /Dest[29 0 R/XYZ 90 598.4 0]/Parent 108 0 R/Prev 132 0 R/Next 134 0 R>> endobj 134 0 obj < /Dest[29 0 R/XYZ 90 544.5 0]/Parent 108 0 R/Prev 133 0 R/Next 135 0 R>> endobj 135 0 obj < /Dest[29 0 R/XYZ 90 476.7 0]/Parent 108 0 R/Prev 134 0 R/Next 136 0 R>> endobj 136 0 obj < /Dest[29 0 R/XYZ 90 269.4 0]/Parent 108 0 R/Prev 135 0 R/Next 137 0 R>> endobj 137 0 obj < /Dest[32 0 R/XYZ 90 720 0]/Parent 108 0 R/Prev 136 0 R>> endobj 138 0 obj < /Dest[32 0 R/XYZ 90 307.5 0]/Parent 75 0 R/Prev 108 0 R>> endobj 52 0 obj <> endobj 47 0 obj <> >> endobj 48 0 obj <> >> endobj 49 0 obj <> >> endobj 50 0 obj <> >> endobj 51 0 obj <> >> endobj 139 0 obj <> /Outlines 75 0 R /Lang(en-US) >> endobj 140 0 obj < /Author /Creator /Producer /CreationDate(D:20100403132855-04'00')>> endobj xref 0 141 0000000000 65535 f 0000148778 00000 n 0000000019 00000 n 0000002383 00000 n 0000148940 00000 n 0000002404 00000 n 0000004648 00000 n 0000149102 00000 n 0000004669 00000 n 0000005949 00000 n 0000005970 00000 n 0000039567 00000 n 0000149246 00000 n 0000039590 00000 n 0000041833 00000 n 0000149410 00000 n 0000041855 00000 n 0000044100 00000 n 0000149574 00000 n 0000044122 00000 n 0000046201 00000 n 0000149720 00000 n 0000046223 00000 n 0000047399 00000 n 0000047421 00000 n 0000090100 00000 n 0000149866 00000 n 0000090123 00000 n 0000092075 00000 n 0000150012 00000 n 0000092097 00000 n 0000094801 00000 n 0000150158 00000 n 0000094823 00000 n 0000097446 00000 n 0000150304 00000 n 0000097468 00000 n 0000099602 00000 n 0000150450 00000 n 0000099624 00000 n 0000102529 00000 n 0000150614 00000 n 0000102551 00000 n 0000105133 00000 n 0000150760 00000 n 0000105155 00000 n 0000107509 00000 n 0000163230 00000 n 0000163381 00000 n 0000163535 00000 n 0000163678 00000 n 0000163820 00000 n 0000163040 00000 n 0000107531 00000 n 0000119615 00000 n 0000119638 00000 n 0000119835 00000 n 0000120390 00000 n 0000120794 00000 n 0000137922 00000 n 0000137945 00000 n 0000138136 00000 n 0000138812 00000 n 0000139331 00000 n 0000145983 00000 n 0000146005 00000 n 0000146207 00000 n 0000146583 00000 n 0000146821 00000 n 0000147937 00000 n 0000147959 00000 n 0000148150 00000 n 0000148441 00000 n 0000148602 00000 n 0000148665 00000 n 0000150906 00000 n 0000150964 00000 n 0000151105 00000 n 0000151284 00000 n 0000151420 00000 n 0000151592 00000 n 0000151799 00000 n 0000151987 00000 n 0000152153 00000 n 0000152355 00000 n 0000152601 00000 n 0000152769 00000 n 0000152933 00000 n 0000153138 00000 n 0000153267 00000 n 0000153404 00000 n 0000153581 00000 n 0000153783 00000 n 0000153958 00000 n 0000154131 00000 n 0000154320 00000 n 0000154503 00000 n 0000154624 00000 n 0000154819 00000 n 0000155032 00000 n 0000155266 00000 n 0000155428 00000 n 0000155614 00000 n 0000155827 00000 n 0000155998 00000 n 0000156178 00000 n 0000156399 00000 n 0000156572 00000 n 0000156708 00000 n 0000156908 00000 n 0000157064 00000 n 0000157293 00000 n 0000157534 00000 n 0000157699 00000 n 0000157896 00000 n 0000158181 00000 n 0000158316 00000 n 0000158491 00000 n 0000158692 00000 n 0000158881 00000 n 0000159054 00000 n 0000159343 00000 n 0000159612 00000 n 0000159849 00000 n 0000160018 00000 n 0000160171 00000 n 0000160330 00000 n 0000160495 00000 n 0000160664 00000 n 0000160833 00000 n 0000161070 00000 n 0000161311 00000 n 0000161554 00000 n 0000161787 00000 n 0000162076 00000 n 0000162289 00000 n 0000162498 00000 n 0000162683 00000 n 0000162865 00000 n 0000163964 00000 n 0000164125 00000 n trailer < <6BFEC1221126463BF0EE376475668BD1> ] /DocChecksum /7CDF83EE4F58E4BFB9C54541C650F74C >> startxref 164420 %%EOF launchy-2.5/buildWinSln.bat0000644000175000017500000000005311333351574014774 0ustar monesmones%QTDIR%\qmake\qmake -tp vc -r launchy.pro launchy-2.5/skins/0000755000175000017500000000000011355776633013216 5ustar monesmoneslaunchy-2.5/skins/Note/0000755000175000017500000000000011355776633014123 5ustar monesmoneslaunchy-2.5/skins/Note/scrollUp.png0000644000175000017500000000551611036456133016425 0ustar monesmonesPNG  IHDRh6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FiIDATxb5@" Y Z8`lx?r\6j ~0/$.$Ȏ&cJ1a5%8i0f `8xD_ G(тn:IENDB`launchy-2.5/skins/Note/author.txt0000644000175000017500000000033111036456133016145 0ustar monesmonesNote (v. 1.0) for Launchy (v. 2.0) by Philipp Franck (34dF0x) - 05.20.2008 Let me know of any problems in the skin by contacting me at: bad.fox@web.de Enjoy the Skin! More Art at www.34dF0x.deviantart.com launchy-2.5/skins/Note/scrollBack.png0000644000175000017500000000543611036456133016702 0ustar monesmonesPNG  IHDRH.u pHYs  ~ OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_F9IDATx1 00 "HZcbI @ @p!@2uIENDB`launchy-2.5/skins/Note/frame.png0000644000175000017500000013467611252675232015731 0ustar monesmonesPNG  IHDR8q|gAMA|Q cHRMR@}y<s,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV@}3P g˜KOdBodN_}8[2Z t@B}W%=~Bo?[u'T t3A1}dmKَdۓmC/،l]{,ߵ3P T>76hln |ٳo3_m&Ol~;f JjW g۶zf=4뮻nٳYc5 ՟!Pg>|$v"\`S[o2rOoÿ_#׫W/*brH< [g>|dKw\gu^ӧYi̊+WZv*duVɌd'rp-ր/@}p(_as!Wլ/[mAZtF W\ @} H?)Wz^_ 8p f=}AُȰ]g{NYpV[3V/)x||("Q_d(@YjھS~FۡlOgu:lSvUþ#e)8<23߿w޵P8u@@GO?$[ ߐLׯC!Ջ\ӗNo5{:y`rR4oư3fNeM>R&E O> y`?s;q x>}i]oK/=,city#v*=Ұ>4I͢NH;։KŎboGӲ*ڇ,累Ǖwzk/Ě ;0CzHvYO{u'ۛl/nd{FnWH'-aC t 텛ލׁʜ}^{- 6@·Y!4,H(G1A.: < v(=?8rඋetF\zWQn_}XdG$ C ѝ<@ Ho_%ǹ>Ĵ!TrAB_S<ĂVqb1W57 8$ +8:66'8lH7iĈ'c0a9CFnh!-w4|[׉ɾʀ@]玷pj z)/ P2^P κA!UcO0˱>BҲp ߴKM< * 2Ȩ (ʙS8vOiY pPo uI q ⊦ Y8L3F?: ~LZFh9,]B >T'7w޻4bpˠfWfg'MdZ֗QPەJ2 K& Qxzf[Ȉ |8rO%: ޖ;I88/2J95տ@绮e2~=WsR \χ MZ/b^1t9Mn$Mfc䶲u 7y rsjuyklu83g )ԡ箦Fd|>ߚ'M $RkU)]ygQCILvV]`C(Ze.-B**/oۈ˛}u9 }upNZi~u\KG>biU bYTyϗRqȤp]1 $\TV7rM.&o@cN6yy3=z惷u}]uphMCZ&f^[Z.$xI;JBzRvQ-;X5J9Z՞2 R62W"6;!k 9.V"Y !UJwHHB._!@P/P*WþqlUN.A0MȚpm1%"]EW !KoN=͌x~e0l9FwZ7sкi…}.u͓%ׇZEm€, = <plJ[ȋjr,主84)!U7Un;Y'ZXpQ8fr7:=&$.E6~J v*N2}9|`-z^q]].Ī ߡiwͪ\XBW+" <c0$sĔ묷ccƽqcGFKx G *TMɞ"** zhb׽9հRsvAE ]W=QDiWw=5`hsdL5O|͐%\T(cBq-!"@.}1._Wy|x8I(Rގ='LN HKSqZX lΖl'aF &ݤ^] bpQQL+6cPFfm)F;C,B iM\ۛ3Ws5] nߍ7l|ؖ󡔉*<~> CeL]X B"WXN*L$'*@3U1hvpyt>F+%!&\UKAQ5O]tNS7&6j2`))GwI:9.wm^T=BVPAn_SY%L+sC8'ԍ̂%+$ >*gL8z*G)?X)qsU[ʮ*y*H8hPq\k <~V!аp 5 9RDͅقL 'sLp[Cy ܠ8ǀ;< 8j޽b M+ L@1՟T[y+~R;*nrrc]߼~}X8u{s ?4MVc?es??EY9 4@o.I  =rUh6Nڰ.8>6JNԜI|7M^ NkJ+ Wޕ~eZxLlo\=s {r[;sDRE|m @uxY>O ԟdˇoAʪ)LFW)kP>!۪<"'*q4ד GUi`t8r5NT.0'G9%pQ9ecp\ Mp޶j%g]|6רRdwmZT^#mݷ8x9){Wy| b[Zvg@G%EPpO>l-CmA-^ԊVnx 瀗VqBɢeC;zB/2JsiyJ}eŃt4Rl^89RWr3#s+jU G˸ # 8rS97 G@c7U\Uʨtbt\m 'Gɰp]'>h 뚞[mln:e確 e5+2n;bS n~T' ]IUVpD).*mM!Kv@xpyd8Zw x| . }|5\#buJ6MS@ȑcUd8I6ЗTϺEyDituW$bo}kgR@-΢j8N2p'C8t+Z8x~Ϡ\2wa?૾(18`]}_pLJ1Usy,sL%-Ch)PZZi7irO+ жH6P s̯c#N.ă䔫ʀdF|Rq\Kn) =5 N%RRp rp:*YTXp1!_p.\56Կ|6%Nj.".6.dQJI òpȝP(˂=]s ,ZJ)KBpQëȴkRүt6yIeg~}gF '%$.ل!n*TTT4[SpV!*YU$Հ9/[&]Ԥ7E\pDGud.<]_Rr hB`C!8-87rɛ2<:Hc\VvE9cK%^8 6 |^2TۯKZ%1Fr{lrNB{sxuS0 8 4bs܏*n*5ݳYU 'qPp<@M--8̍Q:!ƣ}4B6.H)6r{#Yp* 乨E7P% WI[xp榑 !Wf79nQP+_RV7 EQc͟6k9CNQE|NTN6 *5qrT2MTUĺcpqnՊ(8.Iz9]$.<:jȥmGdrZt ftaSJPz㔝ka8ag"#nrcM'ǙcAlK;Pt("UBBUTy87z7gRwXsxХ]Yd}1=} nhY<~L;%oUpB3M* nl܍Epl5qMT pNšTa] p &*.;gd~bٞTd܄kp.FɆpI*w}q=|n[׊Sdy1) ?Թ3kj Yj&!&{N|M >)r 4:Bs[Ky-Vx+*r~}+8:lLƋS[? 8g;1ĺ&8 .jp\Kn)\͙rSFIn8 ɀxpYKYweSc|}E17 .3Hxp.<R8G?Fk[7i(R˜P|]DUV{+Q2F=Ep:ԱiC-I EX-EjônSqCF&2AܭR'O>xL_$JEdTp4\8pX }%*M(.uB@'{ԝ54/PKHdmg@1df\u ֱm''2ҺbS"88ҧ*;(8pn+8^iIF}M#)`)qm6H͍UlaR_ 穊/G5}x@:.@*  䒊$Eb}=\:+k㟤z}M| *f\_xiƇp")Ln* 7h@"N ⨕ ?Ca]E 0*Lɀpk(Yad_(Epk\Gٓ .)9¼2MWWޫ"*ie9dS&3$6so\]M2ssX7 ym\˺v*U٧vY88 8irp:phl*E%#iWL$0d9MWU.*Fm<ɠR;ՀO_,Zag# +\P;6jż-h.DԛNEMC#uIXNp878GY˹לCΟSUVp/nS|qFR*T8]*UeRe8\Tp܇򐐊k@\AjY0%Oh2#E n7Կhey7r&Pc)dGB9 f<%u8; jNJJF>V4fqc}Fσ-K/pN~ |wt㽝F^IT@\le\ш ɗQW7VN.F'ucхj$a,CIqQE UcbOBM8O$KA 89*}½y&2e !5AayD>n;[4ד- {M <=xbg)W."T|(ad|89Dš⸛!Z95LIBn`Zݶ* s꺦̼^\L56/ƥ.Esp]ӹV:%##yBKKR8gy(?rCVgl r('?:5!Kjpv7t,ngQl*~Q۰p7 8?YpQ?p3#* A&~ΖZb]Bx"͂*d hKlOl?%"6VްtWaPm.XjLphgGVp86egKRT8:nGq8Pq]pft2 !v}NVV[; LNr'7T+kJD'pX;+;Q \XT{Z1>`CJ1=4},iHksu%w ׃IP{V]XҰQbp!I1ՓNZpÑ 6O&|cb]DuYcލGNEG9sJ7.KMwz.=̓b33e"P))u%?H`;kHn(Pj^YJ+]REYpQqL8~jNJE.FO.l.`!_fHu+ec-cpt2^_J2ȥ^j[o=sѻ'hw M-Ʃ;BMMjlxEM/6sy#vPPpO=t^6 Yo:@ T#YF]=/+Vq \nlq;/dfuWD*-K] Rb ?j[܇W5y'ɤhxT@=bn cVQ#}rRFLn泿%b?f7se 6>rk^9kWs7|fW7ndv oZ*@9W)˷Fo8K̚kiN8y jp n٬e wIz9d\7kG3ȿ13' 0*L e=E10g_afF~ .洓4mZ&r\E7{Lڤ"i5@ Ju% 'Ժd:OܢEh-6 (ÆAܖ\Q5U{Lr]mQymp KKC썕8aXéRq8z$? eU\Qp^}EpEfژͻ#N0q!SO5m9桻`7u3̈>ۛw&pޡ>@\2#NޑvOsqnf12ڗY83qWO+ EPt[ Mc4|ॕ}S( e/e!J[X5F&gՏwU(8~ yc De*R.obn=?; ԮQ&n\(kSk( A"M <ΤUMmX  n)?rSv'wu].;ogrG7o>xs3͒98CUՊIe晽76o^=y~1W w7AEbcNʾIy) "+XMG1m9u@P.f4YG,:\zXI{*:K*dah;cZneΒP>3mM@l*g3px ŽMWNUKEEMnI:~6_7I'dЃw1wüf'g"ٗy2Z%]痊X-lO^3sGlei- ~a^~t 'ұmu> =% OI JY"ha[1IP fW5".knTMqqIHd.)gqEqRhI+Q1A-ۀIٟ#AԛRr2ȥ]~'v&(G&7z ]ypi]k )y͓4ԓv3'xիq)˹jozx\?D#.uJ%TmKZd̾^Cpl3c1I襔=묳/~3zn\2gpUS 7S,J2L(\RۤNL`!_!J&(#uXrҰjOE1ӛsG˪_QFU& l}?%X\ NR˖L#xƁ#qPCybM଻GMpK.@338p=#ȝhgm] TBAɍ~t3mfƨ-?XRPjb\`kF1q( c`s޹g뮻άf7gm;ؠ$j#~d͐M{*NKg2dQLν eR6 Ie{%`]mNyT*=\xf}ksw8c>g;}'so~n~ܟỦc3ch7O5?ucvmf3s4춁ȱf\2 ҥD)ʤfLpL We?N5vx]T?`՜3InPT8[*@"\kE\*8 8ɤJy <,+'znfv1￿9^{i;d7sݟ4˼'k6^`jo`>wSOsU{Sƴd|wկ~n蹣huu۬i>|XdmԒK&cALOΒ(4-%qFG.l &rU_Qp rnѾSqݻSw@@loӾ!:nPc*c7U<'ۣ2C&o0tƅn*\TdRp18dzkY׍\D1dhօ<>XRf=v՞&ts18:p?n+;n\}֦{P7CG8 ZÜkmfNs{Sb-4_}07[n_4v䞢V6&KmBp Gkڲq3 lJm [8fݒj~zhK)Jl5 x敍u{T&Ȫ 2bq8@aL-\8ڀ^3.0ƟG[}g2zmdxcv۲ٳׯ9>j:rs̞kcŽ99o.!ijQvb xz[e?/c>oÅC4im*z/c]p% 3cpYȽqj2\ȅChkڢs^S袪-UQoci3yx<96 P[J4H6ݻNphقCgqyI='jR?Qp5#fȪKj}t;fC*zM=o.Br-l7x#keC~G] kpFx*fm4{+Gf~5nff}7{g0.yi8 pab).kxx|V~ToBؑprAڣ'VrKzWIgrpC]!Pp1 d@fDC``NFxĺ&b [TD9DDRdWQ:> ~>Awg|OsY̩4eݹ,691}h3n9%$}G8=26WT\Hy=s3ܨhON -$_|Ws/>Q)e9sX (ysXn5pu!';e w8l.S[TRǘd'4ONq2ms3ﺞsݕ9Am[\L@s=NXr5>\Z鶭-  GrkGH'7y`$uQV R.Z /C>)faaٰ7sq7NٍF%U~%ŏ5ܠ0I!D$TN6Ǯ KEd6k4ۧcsYc :joqC4` )_k&|֟T?yyLђ5an9S/2?? ^EtvO(pz77k8]4]۪'7w!'AsOidC bw}L8ĔF' 8R۲5A "]h>yk@33%fE?* pʛX;kޜ2dƇk \b(@zU>@U^dHQŅbhk?|& $Ahx/pghF88Msiȍ&fE,eKg@- h l*"JWĺ+[ }L vmSv mX,cđr(U"Sh .<>\d vZw$ L 87w&ΙUqK:nT\𣶳Y-q8Qq8Le YCѽI-$6l/dVNڵ2@Sp;"ٽ6a^=؁0 's+d7뛭z0{JˎKGij$/ K#w8*H xO ^ӌQPE ҂Ն1ނ#vk_;1)t~BtC&] UvQFp`x/8Vqtgْ}bTc7UNpy.*\e@wi Al `~n\W _[dPY:J p[e}&4's4Ƈ^T] 02٠:5DYx]ojcdq%TGUs"j̦4M i6mrYȋ_ݒV5zԀ %h b@.xUR )7,9a„u]TT XiU.j&n+%K*zPJ7_㖙OԂ.5c$Lg4р} 䜫]pEuvT+\(*N? 0&1Wp4PqHQ}[ S[T~MK+7oLd(9p[67p%3XPq(Qѱa"7rg['#n~m%s 1lx-%aW5v 7)X*Ȥp,*\%0[&жgSW{j 3onR VD;Ae Sh>؊@w MIՉ8JFcI zlhRR`R.}Հs)j({s!QqEPt2*z8(.?Jn ~x$ESjQIp ^7&5Į1n=?cYȏ]}ŦwY-~sS?!}H6*S*kNbjdJE 8\EՐ/ud:S^KnԽ!Tǧ.s $![ɐ <7S\/T.n7\EUrU} \N@u\DcϪUlUMU\Yg .ݪp.H,.lp#NTdTЈXPpeWwSS!^[YP*RpRaHV)ZIPH/,T̽ )@zB˯2УWKle[Bkćrƹsu'p^qU߬ﻫ%35rUpHO7N\Ԕ_s_!yxY+ҐClHFDŅUɄ3p k!]pZ/A@kr=Ŋj}R Xx_؊"}) \gF]j$٠'*|a_@X\n5t鈞鞟"~n]sf jH\UɱfoXN"W&FDCf!u:ry`k6`VޢP_vpqf} q@n%V?=X*l]LdP"74@N=[[U.r균ľp%{}|͜Z2yWO5:H,f;S KOܘӅ: %9ơu+pQL40.%1.B 5.X**.:o!Pe\()]cw"u>˾mGѨ[uસyj/A幣wN<\+\FWq:URjRVp"9# iVrB KqH1y7pQҠ+*:.Y۶|X>.vL%~gt05_k^V5]QpgBpSr[:px^PruQYu0U)h:)zN 2˥v^pօL%nƼQ4J*>g[2܇Wdav|KϺV7]˃[{laԭH*kx5R*=W *}Q.u=R}H- Gq8;pwJ8W\ : r`hʸEPחy ys1Zl_=n0R]1,Frm TvOōei6<|xA!(*N\U{p8\TFK 건B">T ѰKJB J`QBUV%1:s3%?ǻ0Θmch %NăPͨC=}27{.jI"$XTCN2 *pž▆R. Tu+\mSl}-AF.7S=-িzXgG7[Lː{Zpx G䴫*e#Pq.tu-'Bb_dB"8\nlH~QS.jNι"SbE+Jܙq灦-k˱D^14F#;~yFayƶe!öX.m۱}~dR^# r鄃UqCՎ!\ua$ [~_ jJem Og)S#\{ Vh!Qp1pY++S͵8iⴊڰ.85T*T/55.8ݺ7`pnjG..5+Plګڡ|8e(:n\!XTXb_jP`.)Hk qn8\8wyK8\lL893c; p2}@ӟ;n*>KU%ڢ"nf%iYeGǖrSq'zʀkS.nBilR\D5+}%㢷C}2pu'" kʠC^}\W?湕Sp:*A,NƋs87Nzxj,MNgLc󲪺4BgO;pr{AE(D+s#7rcʩk/J΋iUnvHfH!YtgنA&pdCL 2 K*8 8S l-\^[\$87NZ} e=~_czM @\*Pm[G¬RJ^iM3Zw :w;ehb-֢if97[[qR6Bw1ڎUUmMs&c5FCƀ?R30§7nϴ#yh 6O h=p C[ p~ ].$TDjT͍ WZ:! ՋZr_"K<~Zlle"ȵe/5cUWҕuJ>^^ZReknm W9{VhC>a̷tMK<|H 7d h{RS18A 2xU.ul/p!TɅ!WEeb~ ]e:/޶(S JdR}Wy &ȉWMj@HpMbwϗ)eNpARʔD aN}i\ XƩ;%]AsΡ9"v`7P4TVkPfPeR X[Ѽxx9hs~ ?Zʀ( >꜠>uOC ˶No^r]SluV=-~ Y0vMMM WRWžQg(rS&'BH<.7S2eWf;+:/)VVӼSyw/S$=@t>~?<nG̍+cB9{͝?5 tyj9&v|+êcVz+Rp춱wߪIͿMJJ3(9g[%绩%4(pI.[sKP[';ĉj , ; gID_6`UqOE0Ep)Z_fEGG`mԋXi>3d<[ v׾]/g?5wкf ^{e=݄3_j{=GLn~\Ne'=:݀8NUfs?ƘӧON%F[,a9 \48ɤ2ɢYy.N8BTm)LB^e \6,"I70[K lؾ҄߿27nwkG-+<*j@˴"nhy+I/oP\#y78tpq CfdPzK+7pmY'4/f͌ɏr?k";{ѢE$qsblGF)Vd9?s3gO ~luϰdʶp~/+.=RMRp:Z&*AJkDE#]n*P+j2sT 6ӛlq3>pVuDtO.TUoy)0<W^[3~Cz"Z9T7Ξd%f?i4S'fuM`E \Pq _Bj B\yn03&i4x,+n8$"TbBCр8h}Pa$8J_#C?v<UnаI8*կe.aS1T=]h oRYԲ.*.t :Z& J@=I "JMpKPJj c+-(X= )8L )WWmO_OF1Ic〢,h̞z<3sS\ЅFXxrPh:3dȚ e=ʅQF9?\'o~A +櫷2It$P$[*&&JWIKL KU*+R7UX7>f(nZ%mIf%;?0#-6-3nf!ePx>Amk pÕz\e]-ܐK٦dȮ"Vq;u>lC༁.9>bq8W>glBkw4Mr2GiPo 2*&JOIȕʼjA=+ P͠ܢYW1tnc[M/4S(s4lˊ dAxϢ:ԇG6-)m}9>*x̞>,+0#136 8<{*TɆI*PRt8H4^i0>5!r5T)e$Pp)pPh2m,b9 - 4JBNRfWpdd3 yܪ7]Pzfc'Ҝ ۛ풞f'ӡlBU %4WhyN*z捾Z\|ivg̼f 78)-Arq8$9fnI&2ؗB u4\L?pO-Spcq9**2 A{LbE>4Sl挷5G4?py?Ҁ2_Y< j],*i&ۤzli>go3)ϙE_-p#cYm\Pw^_lLF+TպzC1v-v. Ԋj%W[PT][xm;U[ޕd Ǫ8uT|yg>uV'TGbf7L\Mn3>L۟v7߼jֆ-pA6 7Qop)4E_Zn|w{ Pp }P&3+\ޠo^-\Fp~LNAYȶ溜}Z|B)$ R% "(1ȕsWB+`]!T2\`8Qai/Om} tl﹥yn-;18wYl~=~ Ĺf;WI7#||Tbb?Roz7ur CwKȾ^Y 6}F񀖹J `Vt1de C۫sc.Uc*2?IH!arCCE;S>sÿVli&n Z3o@#lGŒ8fxԵ=sg g6Mӟ3㟿׌f3obl!a8[ ")E}NL2Tjl&ͣ*U/X Ϊ.ju4B*%|&*+4mYӀ_DAdےaLkOm5JE[*2 .EHW ˂%܊2-<W U:ꦓS 9v{s SnrA1B/ɞex_OGBIEԝj3A|֘( (p޾BYņ_t7@}#Z^z 154T=Ŕ[P(zM$H5h$&S)t.<27>ﳹ}nڇ:"hi7M?rң(CV)ȍ҇g_< ̛y1Aۓլ*mÿ\eaRLnMtk=}Y8T4~]׏nf%y(:ަ:|-[HXX-$W  6ɚY|vg^[K@>M'"R1grnL[U!RC@Xh" \IVTj婰z`K˳ Emm$p-ߟL9uiHAiތ{.T'ljcT2o_&Y҅M/T6j(ڑ.hѾICR"\mB 6_i%V\ve*C?Ej_#W:W7RlvPcg J@LG}+ͨGo5k ؠfu fcr3|ʹNgd ҥ!o%Թ%3! On%Wk)v7[Pl`FS @d2DQ5"u|x-)s}eoME@%U\[⋹!P\Ef]w@G)9m\pp9mM U j5뭺uMfDjrAӴafḟ\Q(753BHyXt  KLC{N~݋.1t N4o k wmsv9ɖ̽CʈR[;Xaʢ%B8"4bP^Hѕ <',2^GpL:LJS`1/_|,Ip;` R5`t'OEs^dCLn[IL^5 (F״eӔHPYO_a6fF3}̛@qZE 7OD7`D3Pk0 6v&d@XS( u_uEe-*MWh!0I'=MD l74zѓ %J> 1_uq#Pȝe_wQ(5ɣRlN 2vO%Pn -\ESʬYZ֝ _"eT2zgL vPlmI n,:Wi^1gMs.򉊰AJHYH)QjEK`( of|L~M|>r# Χ > Ql D\n[*!%>˟8sd,$y`r[ٔ 1AὩY<0cƌ (vP4駀Fż p6xƵkM-(8a$W7Se4 XD8}V8 7 A2pHX gAd gpC(WVpILmd;g%?%vQMJe!OQq7sạrL Pܚ?b՝@Mg{H]44MjPjr ?vİѣG_A6_$gQu#3YLY \0XwrQsWi1X N+ϽI)kVa_!ȕ\dOG'7 L,@[{i帼ktEڣTYa鷇~믿~嫯z!!oKS -p,*I24ot"'s1Hȶ p(7( |iXS^pBO+ұ:qo0Ӡˌ&JPA xr~[B񳏆27Cb>qy+H]g޹b*B<()ߘҽM D@ ➊jãSJO5o_|}vq; k0EmQg&G4?6.0/FL]BeKmZGNV7u Tv<5Gل@.ӓkIC+*E%(>:tcc܂ù K/%vE)^ yi Z#73$!W$&.h j l<ڟ}o˃]$NT&C*(!*%6(*=0I,1JA#:黸(m*Tv'3_̨mtXэp_)+J5o_BhV,7Qg ذ܃'ZK=JMdHldCiTJzL2u-_h#p\Gv0ٺdKԳU޶p:(ܞ8! ܰA߂ŪEK'2pcm о|Ulv]p،1&6nxbxvj77(V|(QUpo atL:75vO?F,+7e}b挦d&16@LMkW|55mcPms$vM# /h:՘y}Na^{q߅Ȏ'ۄdV,-'*N 9Kot %滩vz{Cl|# 5o22MoSoڝ~Ssױ_S9P!/0C &|ܗr;u)v.wf|d=!hZK i44U49ӬY;#bdmE^Z@8MCWB|\4$~8p`\^ r՞l#Pӏ1Xi(j u,C/Ii-nnw%9ά&aӪMbky`Ƞ$GElgh!4&R4OzdؠؠD`;0/> Ad(9ddV,-\ M4hWSsA4➪k!S8?U k{ PpyKuQ}(%yаVmzv-Pg7$(QFMbnYgs2d+r 8] 0N*ˏj\+ݟnLeNp~l lUv}JOT^ )њ2B :V¶E0P\N[Bqe>3e"9)z֭љbnV=g>L:(s$=LYл͌WgE.( ScWmm7xB&~*h(9lu2̙<*n\3 |%!ueX m& jN*0\~J͕!uVZYis,DU;YRp:]MỎPBAZ PJbۧj-i}ڴ~LQ̙zY<&pG(7̺ 66OíuUi],mdMMe7FcoՆՕ 9nXԠ coxH0?R@ҐʃPm# XOg| !_k%lԊ z}Hr (8 8f \;+^幥)x y̚-f˨̆ZcԪ5Z3)f@MFp[@mP =Rn\8֝lOg\\=dǐ[dtoᆥ C(*[껩؛^p~nJ) ,b-9Tx!(qC -Tns4Dq |eBY?qw5BI"7Zh pr1u2AJn8ސ8H_2[ɝܧMŴ̼,{ 57Uk>cK5)'`䎲KJ O.)ÍTÍ״en\/]K;͛Ob2*y7-81/]TGJ}`㡒tNS=K.9n8P(rWPA(Z!@s=Cy(V廠!eD;m+Cǫ_̍-ra\a5|5pd-Z[PDhr̦ eFp/qIJ[D96u=]TcF*`^VsON`ӵp|-Q7Q j..LwKu. \ pr4\P-xbp ߖ9}ήO5ZwaN<6Ryyo9@wu݇Y^l۠TR!n l [_&wy`*ȥag]Db\RLw՛Ul8VmlPlnH ^ Ivk0}VF@ & e-LΫ31eL[S?sj|KRAs1E)as N'W&_ok` QGr^q}C?W$!w&?rykh 8l#nvM%MOQ#4,j4lk7Po<$ MԚ$nHT&ͺ-=[ Ն[7뚒k%upu{} .Rs] r3prK!JApu(7vSS3hb\\[ t~RCR?1#£% 69n`'}W}wR]``wkc~p#q7@x,vY3Ksl棞]dkV159$/MX ׷Y ppӏo\(XZ]n4L5I.2WM\&zCesXY2X[^!,2`m ѭёoQP d-> zyˢS<\U[iED) 5ʖ|Pt#b@3RjPN3wT7*:BܰRVo nhE'E(]@˝*muXp o H* ,o%ה-ooq"G2̦\j\\<:XTF-+Y00ԍnX,9c:.%xYxM n*g:NU*NC?9C<ʍ`,+˼P&o R ?^joԏ:؞Ɗ׏Vz=L 5\3̘J3Mo&wrA[1Wp;Ϫ7dJPrpn`0Jp.ԛ-ܸPQ~p% XF۰ FzC/GZwV-lm׾/'ۙ &-()neP`Å(/P`n L+.f 9t AH͵V pjJ ˞`LN9w1jnFą~ݼ-0R'-~L#e [y3FvY3S |{ lr7q἗Lӌ jSn5^[d٬(TSnnpWp7qM5l<pc&MÍH$p%ƪ2Ҡ<=,ܶvGU V$[fGQ d|E_,pcE 7ζ-7q6[ξB!W,BՙK\gE74j@ ՠ?8 Wb:v~pu:5?'J1-YiifM~Lx/v5 }DJ15sILnȔnrpjCRgcm nPvpK7$%:pXw@ۮ bUoxƩ.zͤImN+/ RwsM2EAT.hqU .:꠺@WD(R$Ͱ?rQZ +%NF)Z,開 xN7f&n!Xc }ĞB1AQrmEaҵm*F$oyOISڭf9Y@%R6tBpS]VlH$p[J[:6qT& k*)x: oZMw&[la. b s!7r1jE\,zWrU(~Vu~|NO%-R؟|7PlWgztw PgJ+9t72hPO-vJ.[%Oot&85} OfGămM:>1QmܔK: ȞJ r*6dCr TbnH`fDZ6 7t)nl"ٌ* PwJŽaQS6'>29~-̈́PHn2`~-i/9n`u,|<[F8 QCK:\;4|  6+ `@&? bg"$(>PpC72Уce*skחu_r :ȋ+ ش::zԠ6$PQmPkPmT :L mWln6m>iIAk%׺RqPrۛ/FmȤ'g3,s pR 7ƙ/2xN X'3"sq.,`]P u XgIB菆(YX8Z^A4JT̏c+6b1>'CG𢡊^ĵo kWtz!:aP3M*f'U8JEg&mÍSnp= `i ( 4p ` 9^\pSrVɩbE-;7G?IXxJTtA85 rk}28&[iYdt,3O2@4-R.u$iY,\yfe}q@g0tlOFC@c馟#fK Cp@)i甘&W8ηcq:`#hfؠЬ.) tQ 5%fqPnbTn>o86|[q}Ⱥ[%GjNiݑv2}O^m*V'[& UQ< fq+(W_tqDIH&.L v<\젺266#8"nʬB0!W2c.s LbʔqԶ,?j;ƉKbmvozx7:~^.)D^㔘@M PՆp8Vm+5X@H}RSo6br6,8FbȠp{' NTCN+9=w5m8kwܼDF627{Rj UfT{bwP2o)v JyNDaQUhdw1Lq71/J;r~3WL7T*t`r,XnL F116\+` yt2~NqINu*IVHdr rm^ t I20-2@͏ѹR싾cVkZ pxBc:^ iBJJ =CM4{hMlr?9(\hHnCqGZsMb둧C,*MLץX15̸VͺWk/ #&۠|" KYxI鈚>g:c?;ݖ泑{. ]{52>FvDv6ىVEېm@*JCP+pep6(&D _6\D< 2"떘tfi&x=җ*p"%N\[ףSjX E#aȐ@i2ae>|77> VDZ\!p]J n2=C(x XU4Np5ı.>0`6'"mUt5" pXi=MT\RDzV\5M@k:hoŀ[Hj'5dċ;,tJ @o '{2 {]N64c0٦dkap˟}d^fr[/<_n pN)1b` pnXҗ0_> Zd0~58ؠBŬ].iΩPQA;n!eA&0S̘x7{L2+d"cS kR3 q 3ufWZyjwGLI;\hԴL=,Q?8]pKEړb̴/,y yh\QKWo1ݗd"?lCdPd7]E1Tqd$C [KC!\M& 5>psQ?5 `fMP\I7_\i&7 gG\8.]ܒ#̒CYxA5Z` M1Δ͚ؽy{?jy»m7慧;6[6vO<정: Cz [B" 1QEv~d;#2Cٯ?C(<4㈣A\N4/ >Cd(> Da'q"OB{ +c=+ ;v P`P6?~|w}aÆpgo3 `Z5t5Lj) ]DbgNvϺFa MPE /2$L80ϛDʼn1il dnvA ;E}'v-!H53a9b^Cփ #7rkی .%dq2kElg?Qۂ }+x˭m]z饇?>sW{W3 & ZZZ[pa,̙ӟvNd^+^KPQ0+0Ĺ`dP]xX#{`i%&n%U@*2uz' 'J*u$K\ꫯ뮻O>#F裏>hҤIM:"R%Κ5|@n]]{ޟO?`;l5]Z}3>#?h7.yJ;2,ENH[prҗGy|s<@vV>Ԏ'ۜ 7h_J}R^5z} Md7jԨ3gά9Ĺs7n\o[72+ g`i9tS_Uؽ"V-E' F.\>XZd;E ZZkjjjmK2>Xݘ߆ ɓ'KDZ.h@N8 C6@}3@7#ۗlK2d";%K8ȡ~KK%/?S@ɐɫ3Pe +!@w&TճKfݱW3gJB>Xd(qYlܲlTʔ)Rv}5P[Ug>z"wȑ#6Lvd=Щuk2rނlP)kd%ۙxdVQ7[E?_}3<S[?Fv'p-n)$ӦM&#^`<~g@}dA(,`M}鳡|@W:;{ejn \ w@Z} LgH/G\ gI\ڴ/G3P aſK*M4v(d@}3>Vŝץ1d6dP@}3P 4C98LBàK;zf1eW g |}{1mD! g>;#QeC&wtV`B>@ǝ˺~}Nҋ{u2_g>3@i(=^;ƢI_}3P?PhFQh*],Mvb4cb>{>$@mO2- F7ү#<_}3P  3cJ}l}2 vbɾ|]3P   ;caXo_abL5h1@&̬'譯 g`<Vwm`rh8Mɾt~3P 3`Sk&wZ~&nd?O\}3Pe 76B0yL}g> idd߮OQ}3P ظZ\|@}3P g>@}3P g>@}3P g>@}3P g>@}< C IENDB`launchy-2.5/skins/Note/style.qss0000644000175000017500000000310111335654643016000 0ustar monesmones#launchy { } #input { font: 14px "NoteScrawl"; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: rgb(157,12,21); qproperty-alignment: AlignLeft; qproperty-geometry: rect(25 130 130 25); } #output { font: 14px "NoteScrawl"; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: rgb(157,12,21); qproperty-alignment: AlignCenter; qproperty-geometry: rect(25 170 170 20); } #outputIcon { qproperty-geometry: rect(180 65 32 32); } #alternatives { font: 12px Sans, Verdana; background-color: rgb(255,243,149); alternate-background-color: rgb(255,245,120); color: rgb(157,12,21); border-style: solid; border-width: 2px; border-color: rgb(255,243,149); qproperty-geometry: rect(8 215 256 40); } QScrollBar#altScroll:vertical { image: url(scrollBack.png); width: 16px; margin: 16px 0px 16px 0px; } QScrollBar#altScroll::handle:vertical { background: qlineargradient(x1:0, y1:0.5, x2:1, y2:0.5, stop:0 rgb(255,245,120), stop:0.5 white, stop:1 rgb(255,245,120)); } QScrollBar#altScroll::sub-line:vertical { width: 16px; height: 16px; subcontrol-position: top; subcontrol-origin: margin; image: url(scrollUp.png); } QScrollBar#altScroll::add-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::sub-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::add-line:vertical { width: 16px; height: 16px; subcontrol-position: bottom; subcontrol-origin: margin; image: url(scrollDown.png); } launchy-2.5/skins/Note/scrollDown.png0000644000175000017500000000552311036456133016746 0ustar monesmonesPNG  IHDRh6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FnIDATxb5@" Y %$~4 |'~"BSh Kcx%hXn*X4i'`f600S8zIENDB`launchy-2.5/skins/Spotlight_Wide/0000755000175000017500000000000011355776633016143 5ustar monesmoneslaunchy-2.5/skins/Spotlight_Wide/scrollUp.png0000644000175000017500000000035210732046166020441 0ustar monesmonesPNG  IHDRh6gAMA7tEXtSoftwareAdobe ImageReadyqe<|IDATxb癘.11\|Q6,]THH%%aڵ|||4~@[l[nao߀q$k0N$.QIENDB`launchy-2.5/skins/Spotlight_Wide/author.txt0000644000175000017500000000040510732046166020172 0ustar monesmonesSpotlight Wide, Version 1.0 By Remko Jansen (remko@ietsmet.nl) This is a wider version of the default skin that comes with Launchy. All credits go to Tyler Sticka www.tylersticka.com. The author of the original skin. Latest Revision: Dec 7th, 2007 launchy-2.5/skins/Spotlight_Wide/opsButtonPressed.png0000644000175000017500000000074010732046166022162 0ustar monesmonesPNG  IHDR[vi#gAMA7tEXtSoftwareAdobe ImageReadyqe<rIDATxd@m `!6 bBIe!>@ `c!) AbJ~qS眹sg&pitb&BTbHvm6dX/@( (Vh4ݮ R,׫D)9z^**˱L&vBHt:eE^ǀ,j4ZB٬$}G0n$wK"aĘ H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FNIDATx̱ 1 BQ5TwET>otl+ȶlS}~IENDB`launchy-2.5/skins/Spotlight_Wide/frame.png0000644000175000017500000005446311252675232017744 0ustar monesmonesPNG  IHDRCgAMA|Q cHRMR@}y<s,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVۯ^Z_B4k,@9kڰڀ84(Gq{X m@[J[[[[[#kX_D_rh/-----P-)?pq.\\~燽.6DM͗}^xysՅmUeۗ^n_5GQ%ܻB/nlE/# ֮]+N:dsetT7]J彪gK,g -K|jnڻB`C '׮0]lCze%\N_".Ju1;^tKj4+iٕr??ѳ=0r&^dKʢ ^6T~]\/OօЖ .TJ2~frqקd ~~ .3-YQi:>KԱ>Cm|V-Ceӹt,{]@eTQ$CkQϖ-[BhK-8Nr? 0gfcBz .4q *9\wCU+*;u>CMmo~SB[9ps=H\Il_}|JNY2㦁5s΢r%j?t76~Iۓu.NgбУ>ZB[|Ȯoe=<)1F~*~ zƙg *W:ڐMT&FDZYTNt::_~m0 yGBhK\[uUQ~;~âv\V>8>8s%gtzN2)>:jT.Fg:fSX_ + -lC7!K7,*W68H3)SNrC:tmiTvxDwyt:wyBhp{]u&·|`~_͗ ;20ʖi&F3g8u"}nLmdNm:VKw^s6'z}ՅЖO@L>g1ǨPǙ|d~͗/?Slp z ' tZTN,SYmd_ OdSx8:V{BhKզYXY{xibO}|gΗ륳'-Ξ=[|Sǧqo6жXLu:]'>)u,헩NeXInx瞺8gߑe H;FsigNa,?sqQCMu }Qt^ s]wՅЖ#8:bn>cJW׊/ Dg͚%,u4Q-.gXxnYXO9ft}()ϗ>Owo^`Ez6E3!j\AjprD:>>:Z-@]>IFq:ާs7ׅЖvOuF/ Ǯ֘Rw8h]|l3oYp8>1c8蠃u/u(}^о=n:;@*_aGW^N/]1P<7tS]m)b;GY훕k/]}SX~Q-#~6L>]:ʖOѱKӾڏʑyKuo.TnVߓJ}TjI^@*?Fke}:f%s |b]WիwFYV:n^b_Nky7:஽h{He-7#X>@jO*^Ts 7ԅЖZkl=j걎^uz̺~#"[/}fw{p<Gp7N6ML0x M'M&OSNӦg3gfs4w1oB1"pbphRx2drt |2+VZ-VMZXb׊)vcOf:b{hkn^{dKeʭ;ʓ:h=h?:Nu߬suՅЖZ]=Hun]?RT>t|^G?9c] c5ē݈-1ĒeKġ$ /p <7pD)d!$l:uj,@@ٽ1H5~p049;E Mhi&1S 4ul1ml@3f3f3g/,,$. 5o;`I L,X\,X\,\B,Z2ԲPKKVDj,A'wmsmOzub5fP{j>[i_VڍkBhKخbՊa:fdXȍMb/HɟϬ _-'߳l5Co৖/[*,^h> y 9#gM>5wI4ՙ_?Kϝ6c.9LhY&MI~{遆&N C('0)xNF~i ??!?`5DYj)5ʤS/gIT6^=EP1DZ&G7~'Lk`4It1a@fLu,lҜ@ 4yZ)5u| Mj͘Ps5w %4洌^C͙<`׼-\Iw% ,ZEP Dœe-^;9b-Ytv-hʵx"vm$ۏWvEs"'W#_$q_ME֬˨-~4%HqF^}8yy=/<~±4֬@BM839c508-2y\>2 %/r|nW',)0(=B>DL!k!@ɍldpƷ?,tCfP}Wui2me*gIǭ.tҹ(zv /iIO1MDٟ bl|%A n 'Sx<@d%g>:^i^z!*D 7H`rP讠軺z'VE=C3wu>ITIA$/.MfՒ u)Kjr}}JF?^1+;r|3f֯ AD "xoMOi~ONt,&g2z{ RY7]U eX݃"htjjCx⊺ڢky[h=: }SGcn㹒>D]+Ozv&dUZ4iR_Ok@K' n2'wr@ ;5JG[6);e=<ۻh;iyK/_~0Fm}fnMJUw; :Ke`$n3zOqʂl8r}$\ }KR/W0^):X7:ˬ:~h[l5HK6گW+٫X- ¥g}ؼyڀpJvb\;R&9O ZfԀ7T0ʅg{IMF?'=@'S'hwT95V>ӱKQퟭ&jO@t E*f.?~/BI֢klYAK_9\( ~r#؝]2~flgEE2&p,;j)4-8eg P[% (ْ%K/.a)m@[]6 5XXaZ-Ipt;V0UDi`O`ІgÄ O./V0v@]>fugy=VyDETZb6w PDcnܷԔ;!;7_>p6p{}YJ>쯕&Ϣd5!X2}/Е[I~pF_os\qG,fZF3hWw:iP=[I#e~:Ni[ðgV+}*hZ-T61kn'kD5@AmtLi{b(A)fqFq9 {GDNB;f(:w#c}?O?q=*m,dc|1hc3#B%1XL&\F@!.KAӟBѤ9C65-(k +GP-'\[9h"q 6M6դP7uEQwmA6D Tk gRNJk 9Sf>4> }~,8(34g+F]DnUiv** 'lH9u69:Mu2*-tj ѸlGۛB`ONv*Sh!XfI2vjrj}[fS[9ޜ>{51EN-;kZjAEJ3A% Qz ]3@@Iݝab)NꈺΨ{G(Ds:ΉN'sqҔa vq:>&L]LX66%k"K)sO~6E3r0(ʸr3z1@`i@R}DUhnjwف2]%z,DMp'"PBP<݆ϮSg.{pa!uFmj5c}iQ3PͶ9Dnc QU ž2 jͧ3X]#R9#KHφ^(ur :APd&)9Ҕ#Q{34g3h)S!ڬSr")6(*m9yg(4H:"GSg.k0Ltճi"hpgPͺeEɑmRj? ֑i-,)ؠ X$shI29 ~6ć xOjhnd P&2hS<0eƂ3kgxN}lsܫGOEFxGϝA7>R;ڀMh[p;6s8ȡ5Sɞ=lӥ{y,4eUÔWtY~&[NegBՀPb ݔ&J(3TV==zͩ^KUk{pQ W/S5QJ;dYiǵzzRDe16c$0 ' Hz(]̠߭\r"X~ +@4(ht-Lo~bc?;>7>S4IM~"[S72?P[[\.(}efs,xeAq I% O3D_P*@]'dIBRNlsgjv,p,dցe8@QDgŅ!?%pjkkǽG_ҏcՉ6- Q1DK~?@uT 졪(%/Uɶ9”=T%;P aZDQ (v>[ۻ)Ty>5ADNh}4(ɑ 4ղqmM'Dw `%I bYhՑzuz]k!ZdD&7j1edmC2qiRY*L JDvT.# `jRz{Xb*]pfGdf\4#e#BRC3 UWhcNGPyK#QT?7A Q 4 sΕ+FHq$uމbԹ&O'MjƂ@Sg. 4V\=Qg?ڂ6q$%9 Z;?d<-YdER&)}@$8'_F~O/̗*t&B )`\^,V(c4h DQd,Lqe44@ T(94fj꤃hxqR1;n04SL8+Ԥف' 44enM J};no/PNsW+P !e3/dQ痐 Q0-,!m@-t V+e(#}Kk9|3(r=Oy?Z[[եd-'4F { 躧e6!MNy3r5<3%;ZwuQc=^RaA)0JтQϠ&L$'ւ:q=Qg?ҽ&wAXNh+ (w.15LVS̢]YX/oDW56*. _UZtQ,BuKrV̠fbE4QjXTq[s'9,M@fmLc'95+h:3V\g*]v]ƶkH0 77S;{E!+vL 3~jM뇺rmBF#uKmEmޅ![$۰<>'W5Øwm6>Ŗɥ݃ܒ&UDP/.c]Bu0ODAb"񳡹Y b_  \8:nI8Iccg#lJ<)}ڡ%e Q/  ]\Li+#uv(!@Iүp=Qgm`m:LAL}\3I8,w0] DM mMtk5!T'P[B4[5P#x}3DMk'7Ք9sS PLecN x3i @sls:|T`+?@)"TTP lhllC4@ CRaQGټEJ6-[ȓX4Z4h?W<"g@k:y>C"vPh'`D Chh4M5Op[XCL򳏃oH;l#ĩ$ʟQ1:WuHvuWay?pC1g#|X!sy]twvwLxwk..y<>-&T Pjl7nw2<4o+gAS(ޗNkfl,@YX \~!@q(E: & YAv#R AQip Һt0fZlϩ^H.cEe z!~vXGM.1IN),eXkFk%˘6xLעFR)*0l:v5 hE20vUG(cBpU0)Uc>wN} 0B(}nN x-5:7|ҸIEGbph8~p2=}ymCXjoA7Hq[g%DmA9[y l jMŅ<Ur!jbeVL0*ѧ#ڛJ6?,dufrR٠JJym#fFGqij_rakYqͷ/~{?UG-/SL6[ MNO0!v`Ji(x@tQh3EPbeбtLwL)ҍS8K4GQj-CYE8QeRԉ8}]Y;;jkhhS3W$GYcF.}WpB_ 0&&m|;#RbnKĭ=-'qՏ#kq!~ok7/6DRw'! F!zhPPP !>i{p'TP_hTϝ @8.)4 NDX6@^8qWZN =H2Xi”S[+CK3/XW)!qmџ=,~'k_ǜE10cD)^o ".1le]J8UMS[yqi9j1k6<Q^q:G6+LqMt)”W ;7jEjhȂl2LM}-\+d4fSzPQ ݖ/7/vD%=,6~wRL/(?<_3bQgIC CZ$Khtq ~6չ[] Dxju'Gqg;l!4S?<)w)҃ӪCXdH@:rT]rڙQw.z:m>k!_=X.b+/\8\mҡB |p3K}>2Ew[=^{-wo~'Sx^pmb`޴F:S NS4K?Hkφ#GA-E6GD p*Np,MQGp" ͯ3WG\8Z|f (_0ू˔ qu+ƮiPUPQu2]Ff=qeP(Jzĭ[GL*ɍ7?!}!o7~"-O48q7yߵ?ӯhbpb]\u?I\w-߻o|fM|{NL̘5OL:֝LWNClq*jxm+IWʟieݶr}` &pZl?.yg38 TR5Lzw `CzC1BMc$h>/ mh$W)[ G7PZM'ުcLFO.LU }Єq׈ Z;ćϻG~1p >'~StW}C\o/kz?s蜿 J<4@?8plaR([>W'Vbh_J2G#O ӹhMkiw1|9i{̤vD[a[µ,0U![k1=Pp W $9n؂gғh=wHO"&9L|ri?ϟۜwq; B?!VqK\oTso~O픛{RO_<(x.?>O/G 7:A' `iY 1OAP(r⭧@|[EǧoS.O%[OY74=x.~ O?~{?p1u;x?hz7Aȵ?޽Y?4c?cA,9Υ<[\HaHHh۸.⤺Ͻj?_T> vN_u}S3@TQL}HtՏQJE`$ٰE(t믿Q3?U/lx x x x x Ԅ^uz.<ʠ^?Suyyv?W:q'_Cߗ>ȚNq bI&z4_H+5a_ ooooo8 A{OSqwGoD)H߽>xa~~=O8s׈s?57/~ן"Zz'D; ?<\!}6Jky x x x x ԺGyD}駟>x|˯ųW]c_j ]G} /n8R*G>Tl;˴=DۄYү?>CT(ҹ[[[[[V-g>[n x+@ܼx+xxuuIS΢[dyz~~OgG?hzjxW]w%SOE3]9Nφ}CDt +---[sC <cq% ~◿zmۤ0[@e9"[Pvn7[[[[V-pF Q).4½_#H37xYx!Z[[[[ :3W]uUQDDqAц ĕW^)׿(N~6h!t[[[[[V-??݅EU|⬳=?ilNt T^lxޗ(E#y x x x x Բ^~e(xA)nڴIs1[odH3y=4\#"xg+rq "N8A|s[lF5B c/0#Q2b^zI\N_W?T5Hlx{ޓP#W:_[[[[`XZ?֌{Ds=+ Q92}_ KcJ{ x x x x Xnz=H=RT%⦅u.٥@XuZ3]nBZc~6]m"Cw~bjX ϓb~mhH/=tj%¥4-----P g@m!w~pW>%: tοB^b^hyk(죨vSc3qTި&m%CPǵEV]cĨ˘Q+*-U?)hӣilXe Xq\%FE$=1MZ-[zj]gπfbN:ִlx&mkAc?ʭwHf QC<5H6 -+8Q`rg8BV)ף$XmPlT+EZ@2EvgHmPl& l%E,0xkj`2)ಣƶR$[[Jӎ>ATWPM~Ñ(."X7xfF4jjlC@F,+R+m+V14|kfuG}~x]@Tygx&ŅumJ (5Ph 7W:iʧҿaGKPljp,Tq]#\AW& ڎ0oH29R`W$; 2L$}2j9N,V\60^h$_^3;?H)"Ѷb ж< U TNp&~𶷽Ʀ Z"hAT)gc^riOVͮ`l݅%Lyx *Hq)ݙGYA4㤙 D)žU4ٌ]z3?%ya͒ @֗R5J+ QpDnDW~4Q8zѨHu3ږpO ЄA.6zNzGNwMz$Tz?>Dچr'mKڎIҎQ1FR3A&HHIHSI3HIM, -&-% "&!%'Mڗt !IG"C:)҉HN%m$F:t&i,٤sHJ:Ciz>F~^65*MKpixg_A#'+/37;?CGKOSW[G'7?GOWgowG\ ' 0sf']&m E:00҈>3ra'@ډ3Tnm?ҁIxG{tHǓN 1XO V+:91h \ /IT^œщq}OLmcpd@`X20_;?CGKOG OACEGIKMOQ6?_g :>0@Ux2@ DF/ @FX '?f). =;H,i i ' E$L$Jsz$?+f W,:?aѬ ^ x`t gõ/Ϙl㝣H ##'&`q $G_r ?AOGIKMOQSUW(.o\~^]Bu К(]U#QDj:7mZ.@h\N*w9*ɟ E'L ̼p%R@ Q*fx:.f}: YX 9h`J|^6ڔU9N=AĵQu"G #8dq}&~}irĩ~~~ɩ[MOdO-~XNO#P{@i\5[T.=3Eq2P9FZM)GM I݅ Gr'I9*V*3*&0B9N{*X#؝YCuߋi+&:5 [Y$ :+ԳW龳x?0 9?a߂ & L%'_cg Υ8=?ACEG ~ -ɑ'%GXdxv{5VOKs.G: QyTN&ĘR?uѸ Fխ@*v9 G#=f;H!qTBˑ):f@Ŭ i 9BE(Ӿ-%!x a1CFGW \ /hW 0QJg]V}}'N&/`0Gp5L-37;aASWh~M8S]T#O',Gj 5P] P'sA(T>QjuJWR 8̖avq2u/4Bzw 3H~b3;NTNvS^zLM% UTbFN*U-Ö@xd &eϒ?}ԱPd0pd@oGߒkb!d'/ECny~}Ï3@ǏmLt)\T xcJ|2{yQ3D9ĖG"R;Hލ)rdi^5:E 1t.*GźR VN 1hY.w)W_y@o- '%Z_\v&=o H JN'&kjΟEB$Tp7r !bFt~b'>our*ƥrmF_]? .[U#Ryӻ0"¨0LR9͋nN#NAQ:I4c/}UTʀUWtd Bg" dxxmM}'nٜ}+x>E$dG L^428'/SN>E)Ӕ}?Gr6D6[mT(6*)"b1Cӻ RN񦁩f*zj*C H+xr+C#X@V:8(0[co}֪o`UqZ#L-N20D N9e x"xӶ.T?mRjK<ն"rJWJuR0I娔JG>H"S^3ݖ>B6_YNH*R Ut3.t"NѪ*CV-:2YhE病pg?wq6V>/ CxπaH2(}V'/bBӵu2̏+q]U^]* H)yj$S̐TQi`,VeQ,:/:,⎯{ )mMֿԾbkϸq/Q~}d(S4hS')#$x¿W?a $JA6")352MT̖䔯 V@UI!jU#WœFG+Grt]~G'(l7T.LxqJbX?z`*e?>HMLd?Bw %w]u3-,Ӱ(##$rU(IgQN0wD:ʝcuul/o *U@%bu/LV^ԁoQI8m"O0A [ r%mes+VoaÛ*j@gS<YL} kwT0~JTFr)Ò}iД8Ո3bauJ mU ƴIBUz|jgԁWrG 7f{[x[l} gQ uWԵLyL2B&U'fZUopݚi.훔SB%5jVN ˝KL;h)r k0J&~I_j4i J)B|APRD]`dJ&]0*ė@4 I`Uo]dJn:;`{]' |>GUqd@W~TM͚0ȔLÍJ&#qRq_ӺTc:n\'upy M/o$ fISZ6i]3Mv<]IF6kV2V-}ooqM̔U;{WluK1Tvr.ӗ>@~-?ҟou0̲Y,@ڙſMmm4闳?yR>vNl5}S9}ѭxn?lmlMBIENDB`launchy-2.5/skins/Spotlight_Wide/closeButtonPressed.png0000644000175000017500000000112610732046166022465 0ustar monesmonesPNG  IHDR[vi#gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx|Pn@%ZfRY(VZ)nu,J5~BVUCTEKyX)n{ 6`"ԣΙs9''oC}vԿ`AZz=AUUP< zqxd"흟8@7Zedj6$x<Fc8{|&NC0Vk)-xEUST!8uZ&Ijf0,I?S;;H$xz Hòn6 :qzq2qd b``@b$I-ah4uݶ&R^|>}(H$ s`0 .P(dYV@!fx<l6[\~T {Tp8$h4t:~c'Ӊxh4{+ǵZh EET$Ir'1T>_y2u]MӦg,r$UmZe=,CQUW t &P=$ dpMd0xCD! Fv( `"tf6e_S/@ FqۏOi:8KV좵Zp% ۆrY/Qz|rz&"0ssSzEI{}D?xo6yGq|%󟀀ËE J !,ˡ ^Y)40<()0IENDB`launchy-2.5/skins/Spotlight_Wide/style.qss0000644000175000017500000000404111335654643020024 0ustar monesmones#launchy { } #opsButton { border: none; background: url(opsButton.png); qproperty-geometry: rect(444 23 14 15); } #opsButton:pressed { border: none; background-image: url(opsButtonPressed.png); } #workingAnimation { qproperty-geometry: rect(443 45 16 16); } #input { font: 12px Sans, Verdana, Arial; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: #666666; qproperty-alignment: AlignLeft; qproperty-geometry: rect(15 84 410 18); } #output { font: 12px Sans, Verdana, Arial; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: white; qproperty-alignment: AlignCenter; qproperty-geometry: rect(0 54 465 18); } #outputIcon { qproperty-geometry: rect(217 9 32 32); } #alternatives { color:#3c3c3c; font: 12px Sans, Verdana, Arial; alternate-background-color: rgb(217,217,217); background: white; selection-background-color: rgb(68,124,184); selection-color: white; border: none; qproperty-geometry: rect(10 103 445 80); } #alternatives::item { padding: 2px 0px 2px 0px; } #alternativesPath { font: 11px Sans, Verdana, Arial; color: rgb(102,102,102); /* selected-color: rgb(196,220,243); */ } QScrollBar#altScroll:vertical { image: url(scrollBack.png); width: 16px; margin: 16px 0px 16px 0px; } QScrollBar#altScroll::handle:vertical { background: qlineargradient(x1:0, y1:0.5, x2:1, y2:0.5, stop:0 white, stop:0.1 rgb(85,85,85), stop:0.7 rgb(40,40,40), stop:0.9 rgb(60,60,60), stop:1 white); } QScrollBar#altScroll::sub-line:vertical { width: 16px; height: 16px; subcontrol-position: top; subcontrol-origin: margin; image: url(scrollUp.png); } QScrollBar#altScroll::add-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::sub-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::add-line:vertical { width: 16px; height: 16px; subcontrol-position: bottom; subcontrol-origin: margin; image: url(scrollDown.png); } launchy-2.5/skins/Spotlight_Wide/mask_nc.png0000644000175000017500000000625011036445353020253 0ustar monesmonesPNG  IHDR OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- pHYs  ~tIME "IDATxA 0@Ir#Ӆ&}o##UUcwL*/u[c{Šp.Z h. h. BACKQ2L"bKGDC FRAM >m IHDR7 vpAg\ƭIDAT(υ1k1qQnp8Dĩ8u(D:uԩ 9:N$:$"8|:m,7ʔ#1gP@PVGJԛUUUt^w(V\2RWo)Q$pCw@ TAAV 89H݃))w*iΏGó5Tiٛ #ب8x񎺺gMތ-5Iz>Xհ$Pf_ \GgIENDB` IHDR7 vpAg\ƭIDAT(ύЯJq2^ IDADDL"15x &/lI!bƥ! ""?x d8p|ȾjYThS~g۩lǾI7ٲYO>q1 +AΒi.Q8l9UIc+%=`Jr?*D2 _iK(<"&C'S˃tVGU]$^uVC%fTN_I .]IENDB` IHDR7 vpAg\ƭIDAT(ύ1JA dIBd" YJ<H*XXl%)XIO0 $ y 7 fkH!=,yʹX6˱fIye; j㙮uRWzTG x4Mpo:qA*C kGo3c>dp)&* *{h\;5F=PF' j_S o!LJRIENDB` IHDR7 vpAg\ƭIDAT(υJAE,2 [ B`!AD,BT~ai!VBD`!K !,xyywȬ22:$LQ066g€G;q r1 nx0C xeL+(SJ&65rDR1!!@B$8jR956s,T8XiԝzU[-Lֻ.GbrJPi']*x5R${] =T[33IENDB` IHDR7 vpAg\ƭIDAT(ύ1KBa{!I"A%"k"DB$$"D"ArmieAMuuU3/o@=6lHURjqKTbӎ6.*fad<qH$&+Mhh!{ 7Hf _,ʄ\.vKj_e%P}O<-o`,v]cρ#S]/zu?v H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- pHYs  ~tIME Dr IDATx}k\u^3 c"Ƃ\hKO,>$1JJII)P%R.&T~ȉSeQ9QER9)E),|K @,vžfgwɏ;3}o̝}O}s `}@fr?ciRrag}g9}9-tko[1/!c gώg_:ĉ'NxG;f.8 +_ʗeXk^xRs ;p{g ! RgϞ?hJ%~n, ~i鹄{キ8J[%q.aG('zz@Kihp9/S-wĹ.@K %s \8@K Ĺq.8@ %ssgc&@@xrOa}[G?7gG?d??8p1&}`bWHa\bPFW,ͽ6O| _Wb=G:vV0-,rO+s#p rf̡Qu/vKF陇f g?74 -L{6._%ڵ\Z]kۓI|fԓ }&"gB<>oJz Yp |ۨ(_蟛nd3fBuR [!" ?!!B?O !:vDOOwܿ@!Z%B:ۦ]n{XI-3G:Xީ x G܂b[T%( r)̤mv-׭!&%R#h-kйe:BwYoy}uOtz@5>n_nY5/bZ mZ)tJn) O{Gi f}kckV`-4~}sk;= 􌐖z}cJ-4m[,zOMη}溺%}U}Yh}K~ԎI|!ƅm0 i@P!`0j ˹W\ˠ @ cY)(1$MngC} hiyt~lMXд Y@*Ӳ>9›%G#Rv 3(^&"DA}"9c[(޹D{Ȗge6 VHH4uK;li꿘Ft=jZc1 PM r=f RT(m4j 47Vvg]PfОPD" h)+PPw˶H[T Ċ*Me7NdA5Lo4@8wuuI}mc|(oG1!Hv7j}ej#gdu/+`4t4laJS]CE$nЙ6j={s6ju܅7(JLj_ĄRn_ xSI#Ce6lQ hk-81V7^z!0 Bi^zuiU20hlSYG%٘C4YȬn:5U4~RP hIQvW!C"Kk.\8ydA8… LԇIUPbOU֭ ⏶FG#iLJEMm ݶ%9/qk;4ch!iuN[ʣczzzrdZvkVja@'͆g?!8(\l$n˭ Mwnں*P0N5&9dvRo(Z,ȕ1W7󫫫T*WommΝ;7nXZX]48GD)$qY{@JEO0Jh(Z[w(RqWo)ż*CFc+m8t++ 1 K c 1x,p;L@j!iL/Z;!2Έq,?UbIj0?3 {ژ%wIOcI2W_|'mIB7Z%¾ёu!LƐ1(ܨȀx b7> $ggȶ'6nڵcLgPawPqvPGBOhz%{O0fyX&KcoGW*KKQƳvct PyCR_TZw룇*Ő;6smF,u k9Mmb5&YrrFv.s}Z@vb`Vm;8m$*Ƨwg2 ZM^6L]t[bR S(HNPQjF1[L1t8Gjˬ [S R@Z ⥈+p 4_(?)K6g{ y1hߪz>eGT–%ڎn61FArn*։x6SS D/w_ޱ>ȶIy7; GHhEXGK6faN+Q+ye3!˟Řѓe ^4 7mzS{Qv.R"숖U:+>*N}2 wll; \JQ T#̂Z3͟ .dg ب7IX:z a%ɶik&()!S*DLI5?prO>޶;J  2P: ZB"K9jV:w:#* Fd UWtXt9xW{ Q^Aॆ_A%|Qt@N3SA]lr.'iGUcƐTpk׹A|k/`1&C90 !z.k@Z^k皦@! !+Ƣ@t&jh8yN|Z٦"tjc,\ 7 X-:cJAGTPfS@:QM!{S"GD'"CDp,C ק`B a̅~p*&a?G$*dIbg> ӞNF-[#NPںt] $;KD!(vַix\ȆЍk-- SV"Cilx \ʼfb@Oi z0`-g|ZT|!FFo OՃ#3x%< H0l&֬XU װ!! pѱje0rMh#CMd6b|E:mJ(c k5/t1a} ;Z_w'ȕ[b2vHĚ#"ꅸ.q"eW*Uqðqn/#dB xd]f[DQ&|zVc7z^?3pV0DdSY;6>9h(.ddM&XVE@"H$i߸p-fasn{Ȅ\\04(<Ih[jL5rd![tݻȅos#Qw3qyIà1AFrZlגGR!tX n~js + 7׍&eQ+M\ 4& 3 \?oʨ*v!I*lT P P~=n"ߞ{iѭ\[ڂ 9v'؁᯿|o\i,x~cC |{.ս>y4Mn&` dfCWT]tct GZ,?SYVҌԎj!&A:qAhE_u#4*ޮym[|s{?41[)<;;9?wttdhtxA_9[}t &4Y1RCCW[x֭ZG4mm[AA06^NmiwWl)2]"Ҵ'.nx9{~W_7^77Wc|@u ÿtZ\Y5lDFc.f#0ljuq |AZ)I# !N{R41 ~Mi&%8a $N :ԩ%tҊ=y\E0z{}0c^nE eNPDl7rWBsI;~FC:aE %!R<)T *U%|0r;(Jx>sy$x6Ph>rO:vLKW9ߍ-ж3Xo}rCW?*X77_Ys RT*!b0 d0i7&188݋*;HJkC\;\&c+rUJVfÌaJkW=[ie lI &USg +tOVt:<0 dx*ܜ7[^ZmuUmX>]_B *B$JrfR> !x_ x."- % Etnz $#NW*y{p_>MkAMf3"ƽ09;KYAFd'NL88ա%2ʽ3Z\9]{bG;_,yE!ʟ>l&zth?1C9ɵv·2jhK f(?6=pn9/pQzӬ|ȱgW?RpF;3_bOW+߽€Fo^lַ@U6DxO{:yr||mvB7B&n7`녯 W_k S6b]0>qj;s˛[G~t_K_6%_QnEh^;Oo}űqշ}W6򑮮ZCÕ\|gWVk?7*Joߞ'0xN~@ v!x›l/~篾{mLJ?sbHq*ZՅz1ve,D﵋XX/h??E®iBWcq??/~?|CO>>e>W[[+75KQݬ@]䜆yx֡[cgjq;!X^^xbVW?7677xڹ^4?޳.{b j4fⵥ7_b),ޑqp=kօsawZ^tiyyyrrT*UW~ U(W8{q2qg<չ-ln_ ڼ,0͆is2I@ Fcffw=p#G7,YZr>G7if4Mђe@ W^y4ͩr裂տc~k|Ҳyx[-s*@ +#r'i0®ĥKZ1C6t 'gc=ztS_}uް, 0baYK3c]k׮5A-x?bǬ7.\PVϜ9uVFalp3l#]r% ccc333Jerrm߰>W\amnn...ݻu;: 2K sckkko}o}tʕzk8$@~ǒ!=@ :ܺuK7o\^^|J=Ӣ6c倝cI(K ^j6eMߴBK&8 T6B,Vu|H%=b5 >]l d[b= j}SOMMM}ߟ;vKRoos=wގ,_1$155u~G _fIDATlll,--=#wHqB[rY7[ 5=@؝뮗^z_]ZZԧ>uqy2r[kua7crr򩧞:uTZzgO8B5mpt˵?P\@BZXev[<@7w޹5"@ H /hWA  SR42:kg&@ _OB8yT*~<^ 0=+688_Qn~׾o~"s|硻{o\i`mndd%"b[ dLC \5Qݐ`ܯ&̗͡x,W\ UT:ȶq:@Ut"̿o_1>"5h_%J @,qbU!_GTT7\ K n/FKa'*%cR%T[B0 OBF(Uzܭ%~bgQL̹1[; 1!d}рĹrIrnyoB Q qeZe]A~c@Բ1";E ih 3ue2i#*L&@x+@!yQ*v9Q8-lmՎ"@&By UK`WlO`.DDOfL]-A.U2&d[i=!`Q|ɲ^T+R R#I5ĥHX| V  H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxԑ1 0 E+wpxI|#&wggUS) R7 }⃈H=8]"C~РNZ|Z{iZZ0#3~iY})%̵֫Hu]1"RRJtq۶;MONo>1?}IENDB`launchy-2.5/skins/Simple/0000755000175000017500000000000011355776633014447 5ustar monesmoneslaunchy-2.5/skins/Simple/style.qss0000644000175000017500000000145411335654643016335 0ustar monesmones#launchy { border: 2px solid #8f8f91; border-radius: 6px; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #f6f7fa, stop: 1 #dadbde); qproperty-geometry: rect(0 0 700 110); } #input { font: 16px Sans, Tahoma, Arial; border-width: 0px; background-color: rgba(0,244,120,0%); border: 2px solid #8f8f91; border-radius: 3px; color: black; qproperty-alignment: AlignLeft; qproperty-geometry: rect(46 30 580 24) } #output { font: 12px Sans, Tahoma, Arial; color: black; qproperty-alignment: AlignLeft; qproperty-geometry: rect(48 60 580 24); } #outputIcon { qproperty-geometry: rect(640 40 32 32); } #alternatives { font: 12px Sans, Tahoma, Arial; qproperty-geometry: rect(5 104 690 200); } #alternatives::item { padding: 2px 0px; } launchy-2.5/skins/Black_Glass_Wide/0000755000175000017500000000000011355776633016333 5ustar monesmoneslaunchy-2.5/skins/Black_Glass_Wide/scrollUp.png0000644000175000017500000000043711313016354020625 0ustar monesmonesPNG  IHDRagAMA7tEXtSoftwarePaint.NET v3.10r%IDAT8O!@ Eg$$A@ HH&cD"8Iv*v T4}(Jǡ}wm;?kD#!1eIQyNeiJ$qLEaH<bO&{q yǑA.Q뺲, 41 mbuNJugdIENDB`launchy-2.5/skins/Black_Glass_Wide/author.txt0000644000175000017500000000016311313016354020353 0ustar monesmonesBlack Glass Wide Skin 1.1 for Launchy 2 by Simon Capewell 18/12/2009 Adapted from Black Glass by Peter Wooley launchy-2.5/skins/Black_Glass_Wide/opsButtonPressed.png0000644000175000017500000000076111313016354022345 0ustar monesmonesPNG  IHDRtgAMA7tEXtSoftwarePaint.NET v3.22}IDAT8O}?AaƯ;|>BDbQJ:RR 20()d2-ënt:9\jaʿg^ X,fy/{JVr]tZ4G絣CͦS,e<K<R$DBgth4|.M6 KYVLq3]zDqۭ{^pFG]Z-P.G  O8h70=twZGyRH6509LS9h$dtP.td}rd"\y@P{t]fefvѡ;!rH>whXjQBq52L C/Ji isIENDB`launchy-2.5/skins/Black_Glass_Wide/scrollBack.png0000644000175000017500000000557511313016354021111 0ustar monesmonesPNG  IHDRH.ugAMA|Q cHRMR@}y<s,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV5WӋr/Ytg_\x@L}Q掝(/ȉs̟x<f/F9v^;yb 0 ltI+CD:(ݮQ_ȸ$258ɯK'(`|Y9Gn906Z7xÚ;Lmh9Xp-B7Y,<^Nqw Ìxo9>ݯf_t}s>{r?>ڷP:t`SM7iu/q2~Q6s/ ʢZҾ_ؖ̏ÀXOt!O&_}~O?t2X!j |'iyxd-_^Cçjρ#Ode]8] [80 ?taǼL{U?mk^[5yj^ΰ VȿȉF̀rFًWk 6ݝE}o{h=rxBˁ#PMBl#g]w~I h?6vu ll/=|3```o`BŇ1``+r3```o`B1``+ 0 0}o ``߿F̀`` o>F̀`` v#f 0 0@`5b 0 0 V޽ 0 0}y3```o`Bk ``F̀`` gӈ0 0 070X!w7b 0 0 Vos 0 0}]n ``ug#f 0 0@`|;1``ֲ?X~r9O}퍘 0 0}<zOekeշp[ȗ  0 0J՛ڃ9=B>u÷2 0 00_o;sL zݕʥ{od```j!ԫOYWr{ 0 08<:rgc`,䮲b2 0 |B>sop]!f 0 0@WY1x 0 0*+SԹmF̀````& L򙞲-K 0 0J}0``Zg@[W.U3|  0 0S {mgNwNNN^m'unݶ3```o`-ٻʊ``Xi`- y*+[#b 0 0 t vc```b6@``ab6@``򡮲 0 0 LX7uN\em 0 0 Y]eUe\Y``&3```k`lٺ3```o 0WY1x 0 0+ T!*+od```j!JJ.[~8һʊ``b6@``nZӡgv[ȗ  0 0B9ee|}[n0 0 050UV  0 0b6@``򡮲b6@``,佫l޲3```oNY!:sq\|m| 0 0 4suʊ 0 0]C상r 0``XB>N+!a``& έv4# 0 0F60ƃ57{a`hW!:ԃW.@7o 0 0@-vttttUwV\|wӦMͿ4b 0 0 lUu䟥+Wη9:]  WVVUn3``#]999:] z]WRA*R_V1`` d m7NGNWNgNwNNN^*_.V]Q/*]?OỲ```HNN'N7NGNWNgNwNNN^mSJ}XRy})IM'~b 0 0@:ppxq:rr:ss:tt:oCwWAs3fU͟}_.s1``uh 8]88e<9]999:] y{*9'ʹ19$dެɻmr du/f 0 0^  #+3;CKR!=@ND^aODIV/+f 0 0  x:rx y<4Ƹ^xby}1 @A _1V4(^>zɐs:~$Ik}5Fab2`efv!mreY`zgdFUۑ߄4M];s6,IENDB`launchy-2.5/skins/Black_Glass_Wide/style.qss0000644000175000017500000000400411335654643020213 0ustar monesmones#launchy { } #opsButton { border: none; background: url(opsButton.png); qproperty-geometry: rect(708 13 14 15); } #opsButton:pressed { border: none; background-image: url(opsButtonPressed.png); } #workingAnimation { qproperty-geometry: rect(707 40 16 16); } #input { font: 12px Sans, Verdana; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: white; qproperty-alignment: AlignLeft; qproperty-geometry: rect(54 66 660 24); } #output { font: 12px Sans, Verdana; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: white; qproperty-alignment: AlignLeft; qproperty-geometry: rect(54 22 660 22); } #outputIcon { qproperty-geometry: rect(18 18 32 32); } #alternatives { font: 12px Sans, Verdana; background-color: black; alternate-background-color: rgb(32,32,32); color: white; border-style: solid; border-width: 0px; qproperty-geometry: rect(13 100 714 120); padding: 0px 0px 0px 5px; } #alternativesPath { font: 11px "Lucida Sans"; color: rgb(221,221,221); } QScrollBar::handle:vertical { width: 3px; height: 3px; background: pink; image: url(down_arrow.png); } QScrollBar#altScroll:vertical { image: url(scrollBack.png); width: 16px; margin: 16px 0px 16px 0px; } QScrollBar#altScroll::handle:vertical { background: qlineargradient(x1:0, y1:0.5, x2:1, y2:0.5, stop:0 black, stop:0.1 rgb(85,85,85), stop:0.7 rgb(40,40,40), stop:0.9 rgb(60,60,60), stop:1 white); } QScrollBar#altScroll::sub-line:vertical { width: 16px; height: 16px; subcontrol-position: top; subcontrol-origin: margin; image: url(scrollUp.png); } QScrollBar#altScroll::add-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::sub-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::add-line:vertical { width: 16px; height: 16px; subcontrol-position: bottom; subcontrol-origin: margin; image: url(scrollDown.png); } launchy-2.5/skins/Black_Glass_Wide/spinner.mng0000644000175000017500000000525511333333100020471 0ustar monesmonesMNG  MHDRd ,\ TERM G pHYsHHFk>BACKQ2L"bKGDC FRAM >m IHDR7 vpAg\ƭIDAT(υ1k1qQnp8Dĩ8u(D:uԩ 9:N$:$"8|:m,7ʔ#1gP@PVGJԛUUUt^w(V\2RWo)Q$pCw@ TAAV 89H݃))w*iΏGó5Tiٛ #ب8x񎺺gMތ-5Iz>Xհ$Pf_ \GgIENDB` IHDR7 vpAg\ƭIDAT(ύЯJq2^ IDADDL"15x &/lI!bƥ! ""?x d8p|ȾjYThS~g۩lǾI7ٲYO>q1 +AΒi.Q8l9UIc+%=`Jr?*D2 _iK(<"&C'S˃tVGU]$^uVC%fTN_I .]IENDB` IHDR7 vpAg\ƭIDAT(ύ1JA dIBd" YJ<H*XXl%)XIO0 $ y 7 fkH!=,yʹX6˱fIye; j㙮uRWzTG x4Mpo:qA*C kGo3c>dp)&* *{h\;5F=PF' j_S o!LJRIENDB` IHDR7 vpAg\ƭIDAT(υJAE,2 [ B`!AD,BT~ai!VBD`!K !,xyywȬ22:$LQ066g€G;q r1 nx0C xeL+(SJ&65rDR1!!@B$8jR956s,T8XiԝzU[-Lֻ.GbrJPi']*x5R${] =T[33IENDB` IHDR7 vpAg\ƭIDAT(ύ1KBa{!I"A%"k"DB$$"D"ArmieAMuuU3/o@=6lHURjqKTbӎ6.*fad<qH$&+Mhh!{ 7Hf _,ʄ\.vKj_e%P}O<-o`,v]cρ#S]/zu?v,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV5RpRJdw&֊))j1^ PʟIENDB`launchy-2.5/skins/Mercury_Wide/0000755000175000017500000000000011355776633015614 5ustar monesmoneslaunchy-2.5/skins/Mercury_Wide/scrollUp.png0000644000175000017500000000043711313016354020106 0ustar monesmonesPNG  IHDRagAMA7tEXtSoftwarePaint.NET v3.10r%IDAT8O!@ Eg$$A@ HH&cD"8Iv*v T4}(Jǡ}wm;?kD#!1eIQyNeiJ$qLEaH<bO&{q yǑA.Q뺲, 41 mbuNJugdIENDB`launchy-2.5/skins/Mercury_Wide/author.txt0000644000175000017500000000020111313016354017625 0ustar monesmonesMercury Wide Skin 1.1 for Launchy 2 by Simon Capewell 18/12/2009 Adapted from Mercury by Josh Karlin and Juan Ignacio Serra launchy-2.5/skins/Mercury_Wide/opsButtonPressed.png0000644000175000017500000000076111313016354021626 0ustar monesmonesPNG  IHDRtgAMA7tEXtSoftwarePaint.NET v3.22}IDAT8O}?AaƯ;|>BDbQJ:RR 20()d2-ënt:9\jaʿg^ X,fy/{JVr]tZ4G絣CͦS,e<K<R$DBgth4|.M6 KYVLq3]zDqۭ{^pFG]Z-P.G  O8h70=twZGyRH6509LS9h$dtP.td}rd"\y@P{t]fefvѡ;!rH>whXjQBq52L C/Ji isIENDB`launchy-2.5/skins/Mercury_Wide/scrollBack.png0000644000175000017500000000557511313016354020372 0ustar monesmonesPNG  IHDRH.ugAMA|Q cHRMR@}y<s,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEVS&S{`\n|yS C}OП'3 )MŨbU1]L+M\+Nbkc_3zgqF4S;_7 _A5@% z PA@@@@@@@?ŢbRU*f Ųsm b_1XXL!,3Asc\T|buA]Xz݈\Qkժ5sPLo#y|}?>b f QŪbVV,+qźb^x&(ZK]);oE bW܌\i H=S l@*8ˊiŶb\W+ b"wKήWKUuH/{筹۞>^׿s'5=J^~ы/ͤ\=vŘ鞫_k{F/r1nn&ݻ1㸾 Tw/q/^I/ў}u}s;̵ܹ~e~3qn}gn:~s|D]mu&E9n&Vۮ|_j9k$KߢžЋ;:=d==S\L]OٱW/絜Iڦym&6j mҝq_YktWR~^^xv\:ŗ}g<ωWUr9~$z,o8Y8*Juo V봾1tﵜ֫=n~j_zV=㬧 .}j>r3;V,+V+}ba1X,V3S/k [q WLqW6+f\{?m:z' /be mTʛ+CG+betddim2>>e"m222snF*Q9~z˖Km_Uuʱ[ymslLxm1(w(.5K'r̡Cal^:B[#1}*GJu  Nvj2t3όT 1C`lK!Jy9 ^ \xH_E"~4.\b.M^@9s __y=.srxhi%a\.sBi. ҥ@%\8?-m[%}k\⚗xy&Fҷg,/^ uBzK'Y?e%cJ[+)GZ M W~gFGOg1qVy{=M佚yn@VT\G8 ]SwbɉCOWA,8t`t53aRWA*^p!=>>KkJc~4Z;ط~ُƶsM~:2<\ׄQ3M3lRQ.>6TɴQ}#m9v#,m.ĵsO'&&Lsu[Gu\ci```-jY%m]&M_׷T*5sThGսV$'U\ZӳdUg[yWqU\Ii$RiR[*1 =\:iuƻ9u_O3]#aD^6)ڱJjVr&ϔn3+㕌IuyMYbTk13J:^AsmM[ԵO>yV0O3sy4%XVl *ܡ\+ OV,l+*i{W̌V)?f͚wf|滟w|[_=u瞺zm׮h_5}/ޞ& jޞfgv6eA=ͽR@,ΑG2|h~IoG \`c\~n~Isp}ݯ̲D߮ܓ/-K oLB|7mR]Y9=>6m:\Ccʳ){o-X ̭z&b8v]_OuW[8H%bCG{ۆkگ]pʍmD}7w]Ƥc ks:گi{+I]M;;;vplVv}'}vJw.}@I: F*A`Fdžቱ#ɉ@wcㅎS?$ǞO 'S@)4pj{?s)Tie_+ZiCg~]sRy04XP؇+F38{_D M#}|2{i\b9lR {ŽUIt O@\`)p9;K_7ꈱ?1VJL:f*8ukSm:iUNQN]`#Nv6:N`:~,QڎmÙ&T&-;bϦ zp|`h\ܯ2>}^&{q4eowKLԥ]R_ξޝ|f줍IzJ;ط1,ir_R[y3a"QoC} }p,*#ŜV0IѳWȵqzm鿑}A2 xT |S u8-H@T3 87eM]#QV׊~OD4@WIk{_γ-g P?r&$B2oZrI{{Ҷ%W^] /,yK=cE.%]r1[v"|s?u㚏qq/qOxBڦk8v~_`l1V3sLI~*sV]x{6E#bbFQZH}qc8cٱ:TGU)ﻐ u^ETr}iL|UqPc^ɘ7ngy>I?̸b7rX,,&S/ǒ.@TYEf(7D rW\_ 3&#J=(0Ul & 30@6W E}\rZtfAAz5H @@J& `3v}bt` 5$|2P򺆮e@%>)8M;c\;XWԨkiR]Dh/Du^Lz@ xp%<> ޟM&ic6Ӿo@ip>-@VdJm1o>E]. Թm`h`>@;es@?j> lGx]x1roFh$OO0z~ Puc[ t(ҁ=/nʝl`3[ym6V>[VZΕ}(7|D&o⸍&@{1Qg=}]>th \0^xM2 [զ9^ups=`=fQy2mJ.\bB'B@h@ sR_8,ĹviD*9bj17N% R`up?5YJ^uT :w ) 䥎I |])k_ J|4v)Tz~-.r4 w>Ɂ pWIqO\Lxey Q9k<ż9=tEl^4Vl+#Q1.Os*;c+ V*M̧iWPy 3_p +ZA\-aUxlU&nJ|=TO#$ƮZtnYyʻ'鼼Whd#pX?L›{}x۷20O'w ;;x`^ io+a`OxJ<ǁ<ׂx dg#wܔyxrMy3TxƑ<䥒dqqLAy8-(lcB/]@0üebAH*좑LR6CJK_5"?GOqsAb]1oξb`Xl,F+i؊U#w q+HGc5#@`~衇1s8ć||/eތqެ8sVI)ަ,4a*YD{ :`[XԆd~q֒ %qy1~yHn|Ryo<ܳ&B =|}k`^_ݟmgϐLRwY`\a+@G|м2P>A06>*yȀ\ =Z2f-@s }2mM p!>X]LHCuUX{)wz%RϾRo\) zsC@+X`}6GMGw =\S|90n@n0^8A?I| 2+.@\# +~9OǕOg^\D+μF/`[%:p'<lP:epě2qYE_.c‹|&RycrlY @՚@ .wstM,6+D! 59R]x SܗcWbZ@m+,ncVоorB` 8@8De/v2΋L/嘥JHK/ΥP]}#m?'bɼ\%ϻX0b cc +؋&ׂLiys3ꛆR-~<^!O'}׆j_:Ÿ1=.8 -b,SS:k=9J½ Im=akW:ɿ 2^Oco9cCl%ܹbߜKbe1Y -[ltzv\￁~i5~JT^JY/Ay@pɛXn`˛n"4Da#UhLio7\$.e . w(g[q)}iBVA 0e09ρ}\ c-~b+;^(!\@w1ֻx=$-{Nwv`tH}F?[lIȍBѭ4KnB!78NaME7pr&UL8s,Fn^r/?^(VFFVHySLyǟb2$ /-ztqO,4,dmOybrr'$[ub26BV,UbȁvrBl+61Lú$yN 7kܽ2vM֋, L9^S] !%_ucACтcv^Ia;5>ܫ<ԍ ÈҘvrWqwNj_SmYxЛ/Rܳ>g>o}7nܰ bߜ̙Xl,F+bh϶qǁI@q(*eOVW8>Qy-k%oM8ry%;\f œHҽĂH)C]-ץmxv+mņ_ve9Ƌg𔄗y/@Ε OAʹ_;TY Tca8r:6>X0q561RMÂݯV(Y최!6%&\p*kAgX!τy= t ˇY*ŏg\oYqc@.8i+ViP [݆r;vc;hNBV$u2  - qOmRuP ;!@,dd?>t6BVUH+Y`0?4K]zL'L'xOf 9{NwiAiI}Zy{\` MsR_a5Ŷy3/\ٌ'a,ey=BS἞t{ˤz"ő˓UK fR yx b_>.`bYSU]C08'@xل[>$Ȳ8K[$7y}j1j.'*SŞ')TDD{VfJQGi;*O\tXgfZ$?Nia' :% QaJŢlq@|7y /KyƇ%`b>|s6"듲?(I p]dYFG7+S}Tn8Fa+|p&mDX}=a qyǭ:λsJk}AyJ%'k j&VO&-3 !yBTD!) MQ P eຖC8&''WaB?8Fz\ݔo/4.:ZZs,UW\ݼg9G]/EYMVlyOTLC*|>޿f2ǧ.=!:yys4|Ã^i"If|?\?k ^zGKeVʖFYǐ{ ##knY؊ea+@!KD2>~-~ʄ[:ȶYJ0{#9cǀfD[=<'i'JL+!wYǨURȊǐSa*Jha+H!+-ܼCc=n_`/09yQ|gmWMwu] C ,u]x}cu#- {\zg[2Ly 9`lj+ !+xYl `w Ŝ&{؝m{,դ !Ő+\!,L$qfŝcŢlq-RГSRrznYV8}4:N@'JC^r!W9eM4G4YI P3miCYkDYB ɭ4D75e) +sH=lg )=45ywr =@n 񒏛\`./9^-lBMaFj] ϔŐaJő[,ő# ԷMĵukhkf_e]m>8-D@}Cǒ?Eiv;ν[nYV )F Sqݕ\%͛kE9D)Z.U) ܛŕRsI^0ʔ9 j.ԢN_YS @M9 @{=Yj9rA8օcwi7/˿˗ Kmz 7/q//O½|UMTŔ3lzo=CO:'7.&MnڷZ8*vҵo.o;ܛNjEzLr^ž9=lE,Vl+ivRLVǀqeWze@(dzX>,iMu)ZŀR߮ M?|g-5a' N*Ť,>jdR:c/OP4f=ͦR@3cQJ Fu:&{&v4>vgI d9roDq3HlfHy+R*TBV-\^qe=BY 9,&)L+&)BVKNveU\s+`PL,dEvH Y@>`@.~ ])BV?Na1%SJm[IȌ ŏI*qT= @ :8r%y8 {> \ ;ͲL+cA!P+ELEBY,l%+UjKe.='t"yTLty}q'T@\p vsK50.87ʲ"}gXEO|:|F,:5#RU8LHŕ{ymi#L˽)g^ZO$ 7tjK0;[mMkC[HKyhF ֖cpovyrNZvi/^A9]<Ǥ!2+S$zZCeHͼYR>y37YE>Hz!@7k>ux_ lij+}ɷ-S74zzT=h-ZSGkvzW!OvA{8R|)\!go^uʆo09ސUq OOb ]m C6qGuxe|^C. bdtagZ\BI]NhJ|bA(@l#xWY<[0S?Sw4֝0<{饗桹bT ba_b4ӊRH@Z5V>H]p Ā'~r1 x\Jy}:c666666660[l@i,䄩S?>XC|y-b4ӊ\ _3Cd ~2H YQ <"Dr" G nQ9XFǗ;Jy?SfD4Rh,+a r@.F@ 7C(H{ Sf!rǐ;^<9gu!!+!ū::@#\4E\c˲@~}blXɉ7O4ܸ>x}r|*ԬL+˿<1m6'|jԢN<'g<ܳ_x5WPA@@@@@@@l)~(1<;w_koZvvv}ewWg }siyy5kWY(/uv.W%o/5oT( l l l l l l l l`!+` !'|He>qRg:FWۿSfW 0@s eïu~ ?>:R//uNN;io~׻51m6 +Nr7 Hw8 +si{s=?16R9/; (owwB1aaaaaaaa@XqFMNNΝC7y @`\z=1m6022Ho@ȯO!r8KSfK YG#bɰ2L+C<`-9 ;Yع2T^ŏ5K01m6ZIr_r矟s}g?@=]7P[08P⇁J@;\5_j懂Lb f ? T=sC~7vw- xC_OwcwioORg}T( l l l l l l l l`YUX9::ZW>!:d@gxyNb f ( ]e_f?+`<пa?r<"T( l l l l l l l l`E7 O٢NTĐ7^Đ x*c666666660lmOy=E o_d|uC " '|eUn~71m6@jC˲"RZȸ2l+oE]Cbm l7siOwתN Y?PA@@@@@@@lE"24T79;!wuuuv,hBO,J_PA@@@@@@@lǁHg? ď)f?{ 9mQ'a*U#o*6ٟT( l l l l l l l l` mQ'j^B;~q۷^y} ccK''WfT( l l l l l l l l`ـyz yx ̡@~cr|> ^ QqёfϧB1aaaaaaaa_( R֣:z/u2T*~ Y0182*7҈,d2T9sLb f C\x( [3>9=ɉ1 Y KPـҏ)>PA@@@@@@@leY34a*udV,+,|sĐ+d\u F_ŏ5ǁ|PA@@@@@@@lr/ՓS==C.ŐS/bG>PA@@@@@@@l<JRa яNb f O*K>ŞeڵkCNx^@K&A__Mb f 򐳈,+,|s,LcYX]_E>PA@@@@@@@l<RZCuqK{Ȳ"  -@ 8:qe2?Ob f MBV<~Si^jiyĐu}oGۖKZ+M=T( l l l l l l l l`ـ2-oGudWG\va!'|`܀PX 9`n@4o޼PA@@@@@@@lr/"= ȁys)P~ *Xr<0y WYYȊ~sSfNTPz~+7SÒ90nyɬȏ-%|en򓟜  6P 7P֣:;Y~'~џ9hK/=)vzYY2 GK ]Y7ԧB1aaaaaaaaۢN@7 ;>(K}^MȊ7;[/E?~[NꬃtN餯Ĉ[rŐ각_w<5?#Sfq8ף:rCsϡ}Vy]!CVbƋrWB1aaaaaaaaeEbag ;mQ'y,k\,E(D$os* 191c #ÕFt2J :?Lb f Nv6tvv֓y63 '描ԍTE2X|  6HgrK~˲Ex#ZJ}?d!+B1aaaaaaaaCXzux籠s.s\N7,dE{Uyȧ~b|4K{ǐ⍄XCy%  6E׮]k^OJ9=矟b^_CoƯ;GNyYV~tяGts,?:1@{Q*BTP=a*K7n̹~z-bc1XY,vv S+_D~6?Пr_19śnݼ| #o$! ȩ7_җB1aaaaaaaao W#ހG/>Bq oݬsś7[/\ufW 3X_ݷB_išq.̀J-jέť"e}jhtv"m6b߯m)+k^yaM[UoUFSv]3Eo bMR֮IL킔U1e}T]uGBT e{f%Ťt\.=Gxk"+ke-}Zq|!mKo=ϰ:41.ze@o#ByٳM&}ϱЩ-lo!tj Z$5twnamÖΎ^^ϭv[:;m]ؿcwvpî"/˾dK}i?sR_ρRKzz{vhHԏP-wc_:N8}OJ'OpuԫDۙ\ʳÕ#Y$F+4rǀ24pqkzkG{>|~yΩd9<{Nb!rw9w}r\:i"/}{,}ZqlиFStS$o?;AywI<{1~l[fKåRR_ߡރ7SO{TIuuuuD]{yo^{${Mcup݉v 0;;+iёۇ+핡AC k+}ҷeltel, g lhx&>7Y4>>qbb|D |-ٿ&\wuxPV޼ys݋/5x󦉶f5ӿ5q.ivq﫹_)}ʓ?mﯾK:oz-o9/E^W(Uj=cנQR=gv^+L$mmm&2,"^P쵉Fqw]K^{g}{W~un]#ϊb!}e ) ]=ʼnK^>ݷΕ?w]16r1XXL,6#bg1\L-cb 9}S niP"ҼX;w-Jʈ!͹Ȳ07%oAv\ y]}\ {puT3l-j[}s0@t=]ć{z{MP|K~O>Cd-JcMO*|lұIϞN#Z_˱kyuuXA8m/xww#Ǧ&I9fg˴J-V-@p Ƿ[@6jئ:O{v'}KK8f<,9ր>8Gr#èR>(>.8 /SNĶ)V5v( i>t,\8tɇ]/pOڧE8^~kԨr0u(r826a@=t{< .ݥ.Rq\%]60H/& ǡa+ädcS 7їe.:Y3ʤmkrkCǟ|&Ήu4my_<)IA+>Au:Fy }8EG\9 b˦CQDIk`*`VwTV8%g99f9ǘ@QJj7.q h69S_8.QM0Cy* HMa9ܗZLX Z vlT]Ơqo50. LsI"mCDE!^߃_0BEI'7>)yz~իW 󉁕j}^wHWI~?¾Os)eR5o)V3b oIgz+zMfZ񅝟;W^xA~O-\)4h=r/;̦0bRvߞ<@{~2Mݫr.X e0 o:pq3HQ'<<($tbǘ>a~ RA+&Cq Ҁ\ ^+:~Zyr<\x9݁:&v*u?¾#]G:ڎt_;vUQuuJǸ1?'$? :)ykO3grέ6@80:GD{%wk./y"4m5ed!w.Ow;'=+ng^v<#*(f"}ogʀ\Q}u@B utyC#pqZg׳ث 5t>Ҁ3?{i9 NQ7y KrmCN_r8h/mڏJKZa!C! QA\lZ%4T.io{=l-UnۻѮ\;菉ɹ ю^68ƽ'2i[a mng2-7! Ƈg`pF}c87u@L!>k&uW 6mbj ZMժIOOSzIIcյkWW+@hmrgJJ˹)k?}=s??.1111\L"1XGꖦm6%ubi3q텸VU{y8<6gyiS86=ͩaa{Q*r!rml)*Ԃ7Q_}V3Ͱ"f;bj_ρ\yur{_YG |vݹsq(K^(X Q^]aV`6\"*P_Lm_30rmX 5Z+CrOtmI y{k-}ɆO:ҕfoqyy6]z uN'+wK̻xL_N <)SQy-tkmZ%uۙ7vKRkȻb[y6!+턯mvBZvҲq! | Mt}޹^| Ȼ%BV%#TE"\q?_fa+P?>yƏ<18r*K~cJ_⺧>NtNgu3ktke,}IA+䣕g?+Q?sD0:D/Vc/L8P5/qϙT|R@\ʏa< _b| ᅾKxk%>›/<xNݼ=[,\k턱[ɵ-E^re@8@)d iySBS)%'e@.XDG%Ujܽ/g;{! p~8r? 9ϵσ}* =}xOoOgnr7:JUęrDcovp]]o.]D3+w 6g3Ǡk&7qMVg& tl`6&<rys3nr5pM\c܁Xͳ>X=%^M>m}w}6~whKtbkEj W؊jtagGa+JC=xz3|/aD68Mih{qjJU 7\ [ 1DuWYx!Ӱ95/<_5_54!q*kkPӴښxlyL0qɃeo2<~3TqVq>}L`4e=Ei“{ɉ!pk~εki[< [Q,^\l`<6&JycGGFz#đwl7œ:Mrwhrv~;臧s'yPwu_Cm臗X`9: (πtPP;nP.ۀ̀EȊbظt}y*'< t*ǐ+\*tJC U,|0kW]tS_S] QI&'9 gܨ_"d s3^ q~zUWe+y؊BWʃ8%`T3N}?>x^ګPα즟 ȕvIvW <& ۉwNv>Iu٭|o}-f{3ϛ|@[)5 lf`|3Ĺy8p ruϵ[s-tp/g{p5sK.9"L)J'VQOKw%mU+sp{'h3S\ [QX2ж82g)w<} PrpI`.@ԭx{s? @L%vuod׆`Ԇ8.r%\VR ~-e3^upa!8|Ql?Hg=/b=\`a7鄇/}!vIB& o&yiǩ:Uům-</, L}}Mc\CuyžH n18]? s+ӰG/AЧ%g|^rޜ0Wo %"IQj@Ul k\y> W\-̼x;۝ynb1@{H}lqtu,+[^vr]KPTF*ڢvq R|f :S8N'5dAt,kx4A!o*m; uHǐ-a%ő[  tg\P{$V;}Y`γ &3Vߞ{ŷ';/\ow ̵<7˃n~`Obg/"o{_+`}>s )BNxZ74oRss|]+Bvw5ArlЕ47 w=y츅(~p)+~ŏ3,qŐ'"LeVr 9B=x(rw riWIлv\ہ{qm6>Q&@l E L=[-xP&oj69IM9܃yn7\\O^% 9%[=ܼ䉇sKaJk]C.  {T+BfG`*JK|JɄR^cKMȀb4"`i&tC"Q?\h jו?!| =.% j"JŜʶ-qJ!W6%2e̥s.PizQgbȁpIPnF (Ď.S7~Rیe@ yekPF p-20[pŦRĺg^k(|%ӝ0{ss 鑀f|:Īy[ )3NBW ~+n :3")tERs ҙ8u+-ES*U;ʱ"ՄXV,9YŐqg^rS: cQ-^\YUa a$J/q&dW鷸q'๣Poٞk}s *g6I@ j\AorZho?QYʮط,+ZЙǑBNŒg*p˲ȭr3ŏs&븦cǹ_sqƁ>C{?F*&d=ONZȩr-tNs%pea+Xrœ'1O<ǔ[8}]B+p8f)Kx:W[s(R`DvjeXa|3HO.)!5*5iL>A(b} W̾8z-/ѽsϲIʏ3fL>|b[1X7g^X,,&{vOw(N<])ߎK8˼)㊂ -$޽s;o-$?듛`›2iHKTϵRȬ6ojw|:GcA ycH-SGa4zNσXJ=݃]SUHŊ{=$,5d%ΎcǦck ڵfӱ|Q2yqsژo XyI5d6gK\} Kæ\n{BnUioeLVoS2eBlyM#xNW,eR^2-d5ED>> R / .G|PʾBˤa.5 \)pmq&E:2_p-Ϸ[:aQQD7/>wy:lg%ZDo"1KHYq\ĵ%^c򖏏:Vr~}J.Wr,="a @Wv"C BP4-Y[ zO- 0T/GBTǎ؏]@߲.G|DǢ siϹs\kuť S p_VDC<0)+S> {y7ۻh~e۴^ε3b1\m_&ޏ%-)D& XōW%y9,/41IA:9LJ2dAm͒%d(D$`8y92ƶT%ijXFMt.+: 4NSITdg!BXKqOrUϓ\U.vν♒n~گmq2%VWgA,hȮgUϺ1XTImR%oGscV>>>iATYz3Y5,^+%mkbL5N_ώϵ>C#o߮{饗`كbZmb^c;.V3{Ct5^qJVܽ䊏yR>Pl~Sz饻i\{rn_`0^A/R?cnݺ7[/Rۮ_?;gsfϛig^iLgv~M]7CqM{~ԎS^/\yEE[[3KKtU޺T}Uu24kuR;_=:c.+oLk˷R5+(? g˷?U>q_W5Y^ncf8y_A/ݿg+f_;R>k>}]Z}k\5Uc\kĮi{{˜/CMY̠v=j3j{xe/gCy<Ǚ85ˏƸ^xby}1 @A _1V4(^>zɐs:~$Ik}5Fab2`efv!mreY`zgdFUۑ߄4M];s6,IENDB`launchy-2.5/skins/Mercury_Wide/style.qss0000644000175000017500000000366311335654643017506 0ustar monesmones#launchy { } #opsButton { border: none; background: url(opsButton.png); qproperty-geometry: rect(696 26 14 15); } #opsButton:pressed { border: none; background-image: url(opsButtonPressed.png); } #workingAnimation { qproperty-geometry: rect(695 50 16 16); } #input { font: 13px Sans, Verdana, Arial; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: white; qproperty-alignment: AlignLeft; qproperty-geometry: rect(64 30 580 24) } #output { font: 13px Sans, Verdana, Arial; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: white; qproperty-alignment: AlignLeft; qproperty-geometry: rect(66 60 580 24); } #outputIcon { qproperty-geometry: rect(660 40 32 32); } #alternatives { font: 13px Sans, Verdana, Arial; background-color: black; alternate-background-color: rgb(32,32,32); color: white; border-style: solid; border-width: 0px; qproperty-geometry: rect(23 104 703 100); padding: 0px 0px 0px 5px; } #alternativesPath { font: 11px "Lucida Sans", Arial, Sans; color: rgb(102,102,102); } QScrollBar#altScroll:vertical { image: url(scrollBack.png); width: 16px; margin: 16px 0px 16px 0px; } QScrollBar#altScroll::handle:vertical { background: qlineargradient(x1:0, y1:0.5, x2:1, y2:0.5, stop:0 black, stop:0.1 rgb(85,85,85), stop:0.7 rgb(40,40,40), stop:0.9 rgb(60,60,60), stop:1 black); } QScrollBar#altScroll::sub-line:vertical { width: 16px; height: 16px; subcontrol-position: top; subcontrol-origin: margin; image: url(scrollUp.png); } QScrollBar#altScroll::add-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::sub-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::add-line:vertical { width: 16px; height: 16px; subcontrol-position: bottom; subcontrol-origin: margin; image: url(scrollDown.png); } launchy-2.5/skins/Mercury_Wide/spinner.mng0000644000175000017500000000525511333333100017752 0ustar monesmonesMNG  MHDRd ,\ TERM G pHYsHHFk>BACKQ2L"bKGDC FRAM >m IHDR7 vpAg\ƭIDAT(υ1k1qQnp8Dĩ8u(D:uԩ 9:N$:$"8|:m,7ʔ#1gP@PVGJԛUUUt^w(V\2RWo)Q$pCw@ TAAV 89H݃))w*iΏGó5Tiٛ #ب8x񎺺gMތ-5Iz>Xհ$Pf_ \GgIENDB` IHDR7 vpAg\ƭIDAT(ύЯJq2^ IDADDL"15x &/lI!bƥ! ""?x d8p|ȾjYThS~g۩lǾI7ٲYO>q1 +AΒi.Q8l9UIc+%=`Jr?*D2 _iK(<"&C'S˃tVGU]$^uVC%fTN_I .]IENDB` IHDR7 vpAg\ƭIDAT(ύ1JA dIBd" YJ<H*XXl%)XIO0 $ y 7 fkH!=,yʹX6˱fIye; j㙮uRWzTG x4Mpo:qA*C kGo3c>dp)&* *{h\;5F=PF' j_S o!LJRIENDB` IHDR7 vpAg\ƭIDAT(υJAE,2 [ B`!AD,BT~ai!VBD`!K !,xyywȬ22:$LQ066g€G;q r1 nx0C xeL+(SJ&65rDR1!!@B$8jR956s,T8XiԝzU[-Lֻ.GbrJPi']*x5R${] =T[33IENDB` IHDR7 vpAg\ƭIDAT(ύ1KBa{!I"A%"k"DB$$"D"ArmieAMuuU3/o@=6lHURjqKTbӎ6.*fad<qH$&+Mhh!{ 7Hf _,ʄ\.vKj_e%P}O<-o`,v]cρ#S]/zu?v,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV5RpRJdw&֊))j1^ PʟIENDB`launchy-2.5/skins/Mercury/0000755000175000017500000000000011355776633014644 5ustar monesmoneslaunchy-2.5/skins/Mercury/scrollUp.png0000644000175000017500000000043711252565676017160 0ustar monesmonesPNG  IHDRagAMA7tEXtSoftwarePaint.NET v3.10r%IDAT8O!@ Eg$$A@ HH&cD"8Iv*v T4}(Jǡ}wm;?kD#!1eIQyNeiJ$qLEaH<bO&{q yǑA.Q뺲, 41 mbuNJugdIENDB`launchy-2.5/skins/Mercury/author.txt0000644000175000017500000000014511313016354016664 0ustar monesmonesSkin Title: Mercury Author: Josh Karlin and Juan Ignacio Serra Version: 1.1 Date: 12/18/2009launchy-2.5/skins/Mercury/scrollBack.png0000644000175000017500000000557511252565676017444 0ustar monesmonesPNG  IHDRH.ugAMA|Q cHRMR@}y<s,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV+߃l d6PdZpN>/ |o*_ A {E{Ho@?~Ӳ~gYd6m 8XpM:'d^ 5o0dP r[!G?G?Z֏1~iV d60l 8&ӂoN>A/ w^{074_̗EܓL/ċ"I/OUO3ϰ,+߃l dxPl~ 4&d̓}2PeFcZPgկ<<" =*xQ^ѿA?-~iV d60l 8&du2O@Y(eES~J ȓ szEBB^?/FބcA|V d6@]L6'd DX씡Eo]^SPs- dg*5?75iV d60^l %dlqN>/ l,]vPY*S#?.Gs٣Μ <C {ҶN^V(z; z| d6mA"d,iM:'d`]6HY)3e |@]FN==sw00{܀- B.-/zޅ&㨦JO9+߃l dxlW2L4&d2PD.# L)C{@낺+W{7̭9T>1nȋ~Al ='d쓁P& v)+e씡jz"mwnI| l]xB02ELoW_nܹ-K͛[nC2<10#<2Wҗ?~7+߃l dn2O@Y(lRfN*KelVޢt#on5I}slm7a֭O6480uxp#CO|^0@sL0M\wKFGBl>:48п"sY,Xvu+\~vjoVQkkK i]{kJӤ\?}OwגΎ_|iS2y:l|ܙ'O9Μ9}\74ν{wGq{SS5/G+6k-WWt][~mZZndxpp Fn\߄6sj`֤m@_vKlٶuggGkձ]@WGA3M:T>tw$ݝm8NSG[Qoni漚xowRowl}sZ箎frrs[4^6^|Zj$ib&=Iyxhpitd(+:X~{z3y~#%rzX|hwޞnu_܇ %aNbC{rwYv d,q#ж7olU|lV\{Moh,k#Ӎ}} ==I==z{{YBCCCk^|^~ժardxx iZ_Wݵ$ O_ =smm-ho_Z[[޳]]]I(_9-d Y}˗/Smmm~~KKwgϞtR1ֱMձձ+Wf~ֹsf(UL{&{=!捌W{鯹ڽ:^̝wnXz#O/~^Ņ,=uo:^z>>?/,Z _d.^HtZ* NoR i%TCmK0uT E Xn&- lLye#]c\|4^Jts~bPq/ceZ[]xa)׽{=cz3IO?sgN/?ugN\y̩/[zW.>{j~U|=w:]w Ο] 3 lxoXVPnSÃہuN;ouh_Y=]z;ЁぶkW_k9YrGM4fq踺y}>_spy.B~v=6ol4Xjlq-5aKXFZգ ;>oyi:=r094<ݫl 4z` uO^lrϭ7=FCܾou.W}d!vA4 ,d`n꬈7Ύ6Zk놖kJj[ѱy5׮5<`WX~Vז$_ Wtuv&+s>J-S= 7y<[\^C9{1n(*{m3\ CO%syl?)eIk\O%'N;_|͠a0… LKpic(JxY a)e5`0 Aw~;<T(6k /c7%# P2TT*c^zҫXnWl`\ߖ-&d߼{}я<fT@zX>e6c.Nz*3씡zsv/V->n͟,wZ&mI2|+,SFO}||ǀl4^ Z|ʩPZWi`Ɇ A1_l@??=C=#Da؋Pw/FA|K/5,TD%.{s<@:״ j_8tQZױz6@x#!ލ.lۈ mVg ڪն`~0M@g=4|,B])n6Ale<d`^ wvhzX=^o}3U9V=P皟8IsiP2P=!V7"}/$M] qU`)޹ޮ#ط e=.f7zeOC. vLb;c[ q!wߥFTgG-ۑyݪXGmڛYT7FF<?6a7y؀YoHygzn=c,[S UߕC"+Ow h$bxDc$P໏~{~{9;fQY)3씡TV+ke-ek@yc;Earw͠屃c<<>Ca&?#r9`|,H9rg-Huy#.L]OZhP!u@rCIw#sAk4*"8E™ӧ/ys/G_LG| N7gsIr"l)&w[n c_֩# \;<ՍZ7Ʋ6qL7nF[ܷ\kmx;n׵Bn<=C:7/X9^݇zQrGY<0M@RT4n"9p(v)ݐ;*yx{O`݊sW\Nk6VuQ3|ӧ/]Ko{n9@yKoT4 6݆JOڵ<,𿶆jp;U*aP<\|m%ӰXr#rW܁#`uë ,f~0E/bٳ?3 q׾i@0sg+1pr҉/ass簬uxIg+w3 J>L@=xB|יuT4Zf,3ԞrÎqÃzknUz@3} ~\;|ϰrĉ2CK\WblqQ51j{wd B`,Ek1mO(( O:`";C۷n.!ܘvmA0"bT{QPWND0q,3Ŝ|4(ZWVzҙړz`ەXĥ8pj[GNfz`6khjd6Bͬw^̣o;Y.0{r~ȋhkCaEq@@\05ܮB7yc(ۅz9WL!S+q]x%+W s>P9n>)^xwqQ:_eww5z/}'y7ӨJ=dg*[eWG{_2$͟ t=v,@V9 `x ן8Sx<77 Q䴀f1.EF:̝Lƀ"RCJq=bϥ<={T&W^*LaP65L^44"G^,skmH(*Hȧ9})ie2 ΁r9z`ᕄzVr_j~5!aWgiPk#Ryz[I۔Eqh(Zzytл;^Ca^W-Sz\tb:HPG)Δ^*T2>4@w$ W^^=]f=TW*ʗ n oT^̡Tn؝8oLZ#Bb8E8]9aIx>Uvg؝}%1s=ePg] / ;0QNvnwxܕ;/͟+d10O@ls"ss!v~x7f< $oJw4ZGpreGEj~}dЌv!|X/ˋ(Ns>n?Ӹ}MU]:$aMqGJB}{08ܧs}} {8"; 2Ub]b5=F8c𭸳gCEݡ g*?ckhO|b-l`t1\ 'GY'7Z /Ap7L^#bEyqVRQwoM._lDA췘FJb_k;b%BxVQ}AIT/${eYt[U@"zE9t̡ qQ#߫rWx[Y (om骆޾;9mmỔC7w8U̝ ' TBZ %ȡ}d4\u7]8w'9ugإ +jrYqRP U P CPΗ7xI00{\J4J^yL׈k n8EQJQ*h8lIatlt~vY"ޟCea9ftRPW ,39lT UG~:8>=#~>pkx?)ǘhD7#44,3TF]ڨv/es1pds};^!w5I T!0(ˏαΣ=šWJ06] KWN{Tε[G"mTbY9|sV§Tv`yئ JEq\mmʡnҝ bw[WRw*$L"-T{Zga\I={ҕ@JZSл9ts淓־pz-#?MrC˚Eqx[f4o&FS)N7n'6w^r%ZᾊJn~络WVe!Y*EqlC3UTn*V½T>tCg( oA"霂R?tŹ&sg_r NRg(KG([ZtY+ߋߢzeQPTG`uȳs?kn `63e2e,UZyd^gQ^,j 18dj3onL0YF<*݋y@7rwnq/-\'yj ǺѵN<9юض?CAeJqG!CNX T *0_f;+ݭp'4iĩ6UXAe`IUI=1ݭE/:e R?tݢ8 ϟ9](a4 ʁfZw ,cuoʝt++Uzw`I2jS\ȗV'WrwS׵R(> $SnSGJ7nr>Tᎇ}ߥR߃!c/: reUB,s(K:":6V G5e75s[͊t+7¶}9X.yA[1mF:k mkS5qh,+߃l dxli^\lٟQJ/ѷCTC`l3FBCTV+k߈qQuݪ38< ®tɑ0Ji:h^_Gy+gx۶fmmXV d65k4G79}\˒im8BބΝO>XV d60^l`֬Y zT tSDj`"M P tY*Sek]?TY'H-eR:USkN'o[){?x,+߃l do6dɒ/~'^>$'Ro{5eL26eL..W+w>o9}2")ؙL!Q STKU TWnX??}. @lơ ܥ+ުbrTNz6LkDt,tY+scX}co/@v2ն5T#OUK.?| d6m`E~Xu_))PCIH_ L=li8=z<o=1 FC7c'6caZBSkOBj@t{w> ,38< ,Cm~1z#xwL2Al c/Oay qCg]GCRǐi`<O2L"4m5,+߃l d68prgd4RIxv_Q,z:#cMfЯ\5ݗ/,"5Fosl}cYd6m x7R7FIJW{[+@ɼTT޶67 uT Oe{m @lbp.Agn ^2ZQ܃t5S5'O^Uxml 6 ( a1}M?cYd6m x_ժg^xj-!)k'Q$zB/g,5ҧRHqkF^w,+߃l d62B|R];]~TO'_^R{Qr{3Al w ޅoZ:q tc_/k3'z=.jtON{U u*ԗɓ'e{m @lýa_c~@2}=x@?Kל9}ϝ0~ټimysu~Dz=6m @nu=u ̓k>&'~O}2k{ۚn T*we{m @l %).އY|#5~ÓT޸>2m TGswcYd6m xS՞T ,CI|"L }dh+Я]2N'N8Al wv[ 1r\-/נIh;w&ܾ}yt<n/G @lƻ ((ϵ@>)ȣ?@d*kxԁZ*S5t[3o}XV d60mWhqjZM-li84^pĉ-W/OrZTkhf:LM֬n}v„ cYd6m xY}ZSȟ$r'v%B?t߇n]7e{m @l [g\ ;|zʡK=oߪ ,C:L j{uDz=6m @n>U<$oݺ5HqЁt{3_ٱDrWگXV d60mjz2r5M .L`\L=Я^Tm-u >\;Dz=6m @nXAeEq՜:u*>s |[kuj˕t`yxw_7i,+߃l d6@=ϝ* j)2.;|޺6j5n0jB++zDz=6m @nT2B\mkOc; ý[7W~-Bx//e{m @lO={4O2b=^2My /f-=yV/XV d60mnkJo=FcZg>e:s~O]5}=S-mzWg{E_X]U?s?7Al w(TϠ}LhqNd x>ɝOMk5+OSC cWtXV d60myxzxLT*'vU'z耺AeWf_HGkmmYB{??=Al w8kЯ|&P>>9x9KtcKS?OXV d60m@]ЯTnk@X>qT㙧=sjsgk/]On"N?9wzz܂rѱ| d6m`ۀoX#d5 j֧W;r7O%O^x Ͼx܂3gN/|B _8nٳg< @lƻ DAEo3x ^ZR4Y>>^Jɼ*Ɛ{_ow-tTGu4vXV d60mmke ^z *Eq~;0+TkTܫ_bxAKDz=6m @nn)e~ n,o_@&w'T566TSvm{[=o[ק vCe{m @ldέrw``>i ]&1D'[- CwD߆߷Wre7rcw^S9tC1!wks`=r;~2ne{m @l⵩\z-*O~zXfttT'YgYY ˷oM~έ4+Js\ xwo,+߃l d60bw5E䩓?e=޶Ʋ tee7|ЯCF~˧3M/g9t~w!;Al W pܹcTK} kO"> 5oނ#Cwz}*c/n/NW|XV d60^m G]6{|ת=tY*Se2WgZ坸CoD?FގS`ᡁ =rZT raё4rz≚om6Al <6pG=n<gEZ4ুev͛7'ܸqTV+ke dC_?~(ߠ~ =&u}۷nܹusCvZ_f׵z뽫-+u~뷎e{m @l |wI [ gț;~xxSְ$CTV+ke?BS2'ѿF~ /|{*}tTwnX蟾D\uw˹,^E]9u?ûw2׵`?޽ߛs;GY_fY)8Kцxlёtnϥ⾭cW.ZE/ǵ$q܋)Oi)VLb|\NJk-+8v%紒sXA6kԵ֫IkkyX}\vPؠLhcowgcOWg#پkC[{vwobc[WGێζ[]mv3ݓվcǹgDCp_:(ӣDJ?Ff@_`f5}E,;篏ߣ #CI.>^p3ۧ4]3Lf])MێqMܻ ԤXvT:uŞ޺y=|0 ؅:DStJ~c>la{q~=. w,Ѿڵڵm6l{[[۵oe+[\;|M kFIb_SԾkcOOw@ #YòCkFF_bU?[ҐzF _8|u8xoOg~>י5ƒ4WQ)=sΡzzݠT5 xXop~&3Yg&gl&DzNThϰ?#)پ^:Y(gc\c;A7w./*`T@Nc i9s\ygV{žyn*uӮTOcqgN>p4R|5PY*Se2W`.e9tI+|~/Ϡv]Kwԑx}jNhp'x ȳ Pשt +Fк ސZ k-eu.{IMPJGwza:K9OLq IEzPXdە 枩5mI,[ HcA9m: ,6޶ pmV|+˷1(;zw2N jz{Ѿ@|ә@>F |ztwcM4:ۯ03loVTvgIkx/; ǙܾyUE ҈64u$q&~Q(#^Ef$)=Ľ;~m;h?k| $^'=7o\vjwac;{mme> ma͜fo480F5iT O@ulC:7}f߫Z>V2BWQ=[ӳ햱e~ <_XlT:P^ E"YY@'\}|=,+k6>{`(Jbl:.bYh&Mbrw:BבϜ Ys!2/CVp|NBOX|z>hHxhXp(. "^o@>@^<:yd:8o=ktZcWq}7Od:u-; TF\+eÿ7k= ~m|pΟ}/n @{ݧ|\N^V.+E(N3 t*.cj8Qs|KH +]y=h؀𞔠YV) ^x޷;2m׽ o>-Q.z}$af5|^׶^O~ZU/A /^hPx W/7}#f)Ϲ]?̹#0=Zc,oMNjf`{h/8^8%pWy"2!JhNni MlDctX~L ut#܏#HEI!l! =(Աu롇X_O}/q`{XW8]=eb;XOm[e[Ύ&`F5ꝗYЁᡡx:BnLӵf IAZU0_ V(j0^x/ j).azNbHq-|{V _6Ϝ?n0NVOJxPWNO|>syF #5Gqs= iL,jdLp3cZӀ 9VaZ~w<DUT~X޻m5_5Kj$po}z;?{l5 UoWl8]SWsws {|Dv"q ݮkQqyw>Om{x\ LA3Opó šBYO%;o:$]ZOa*]Vt; JP b<!ΧPsyuU-: rgUϲr[CzXCw%+*PyQt-XGl-@]K#`9 ZzǮ\:o8khvZ8CuXv&%OYnh&ᾛa'y~'ޓB@/QvG;7;pe}a΅h"M7WCe% s&I[vhoA}| nc𮷱|+4Z oRx4[/]÷@9t3gNo`~=K.n`-WY{ԩgN^״ϫՅW?wn۬TgϜY PW| ,{+qpSC3IRsz9yv iJo6$\\r8i&Ka}0[)ՑnEʡ'Bc'o1w䓷oT'?wX:{4ѥ}rx/6y^oЛյZD#a&,˟e^=SB 9Lf9wnC/SKò$s'yMٜl.jgv2=Wur:ҋ\G[Yঢ4>|G G'#]" ؞Sxz̞GxΑ;cy<#V{6ݯTW.|\(F!\7>Gąx-Cy] VUh^:Zcݐ;P^gc=Fm$w`=@CfsW.]un N+ގvv 2zNE'uE80^P zI un1po8⹦Q)P4<q ;g>y%0?ߩ}y>y^'ԝFp;<}Ww*S7bpsϝ9xKO:gX;P/`ám+z9 Bz/Q y ݬH.%QЙR؉:m?lVI EQ4 X5޾}Kmv#7ܺu +!zn!vhrhۭn+rg^w_~β#O9tA^sl+anEY3*hP7%i:w.4Ga>}օض\lf2g$!;3B(sj\8D`Fک+S.z@cFz z#_,nwxQ޵p5mA?O 3̓'g[?\]u곟G/n"wl$le?M^:8Lw3ݥXHg }O^?Gr}ŋbrޯ8ȡl)]cz 0y ݮTWn_i*[j[:~\z`oV x6y-me=m#U t;^wrc7v"].S\NEq>r߄'̿ :Dz0!w$Qg(&v w݂sK5~ܰ;rR7[7{4RSQp@2M @ZSȝ늰;~SwEqzܗb0;OqD6^yҝ^+S@'8im;Vsu@&]q'㝷5FWnQRQ\{rsN@xxq;:e=r}]Xs%Q%޺9z^19~u*yI; *=O~Y vQΣOyxuq~ [on]q9,QvTݮ̡[g1pXdA\]'M!w3ɼ9SaSsrH${Ύ(煥߳=6m @6 d̓}2PD(#e̔2TΖ26n7By sM@5/j;T u[ oylx! Yd6m jEf0Y&du2O@A.e2Svg.Sek#}yQ g=qV>/'m+W9>d8[*^Eo)ˋ @lƋ dLm2Ne,QFJ);#0nj2:bu{lЋrPI|+lid % 16['^֊7d{m @l %dlqN>( eb\VL9sWy}]@g_JP=r1!so,_ϔ/ʋ | d6m`@pLɶ2P^̔:f"޹0{S'`|cEBxDYd6m bcUpL6'd쓁P&jPdZ Ca.Ūjۢd6v?T/D݋xA^tV d60l2&d BPRfN`uySz={xw^c$ oKŰ=6m @f1d @]y\W^̙``5{w[!^D C>+߃l d6Pd+\FX]6V{o N_ ؋^{xx[%^"C?+߃l do6PdYMօ/_ [7<x[E=o_yQՊVKZoYd6m`|"j7<^W/zŊ|5LB^hV d60^mȴn_ B?Yd6m |-.V\k]\:|?6m UdxIENDB`launchy-2.5/skins/Mercury/style.qss0000644000175000017500000000324311344521152016514 0ustar monesmones#launchy { } #workingAnimation { qproperty-geometry: rect(449 40 16 16); } #input { font: 13px Sans, Verdana; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: white; qproperty-alignment: AlignLeft; qproperty-geometry: rect(60 37 160 24); } #output { font: 13px Sans, Verdana; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: white; qproperty-alignment: AlignCenter; qproperty-geometry: rect(290 37 160 24); } #outputIcon { qproperty-geometry: rect(241 32 32 32); } #alternatives { font: 13px Sans, Verdana; background-color: black; alternate-background-color: black; color: white; border-style: solid; border-width: 0px; qproperty-geometry: rect(37 67 436 100); } #alternativesPath { font: 11px Sans, Verdana; color: rgb(102,102,102); } QScrollBar#altScroll:vertical { image: url(scrollBack.png); width: 16px; margin: 16px 0px 16px 0px; } QScrollBar#altScroll::handle:vertical { background: qlineargradient(x1:0, y1:0.5, x2:1, y2:0.5, stop:0 black, stop:0.1 rgb(85,85,85), stop:0.7 rgb(40,40,40), stop:0.9 rgb(60,60,60), stop:1 black); } QScrollBar#altScroll::sub-line:vertical { width: 16px; height: 16px; subcontrol-position: top; subcontrol-origin: margin; image: url(scrollUp.png); } QScrollBar#altScroll::add-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::sub-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::add-line:vertical { width: 16px; height: 16px; subcontrol-position: bottom; subcontrol-origin: margin; image: url(scrollDown.png); } launchy-2.5/skins/Mercury/spinner.mng0000644000175000017500000000525511344521152017012 0ustar monesmonesMNG  MHDRd ,\ TERM G pHYsHHFk>BACKQ2L"bKGDC FRAM >m IHDR7 vpAg\ƭIDAT(υ1k1qQnp8Dĩ8u(D:uԩ 9:N$:$"8|:m,7ʔ#1gP@PVGJԛUUUt^w(V\2RWo)Q$pCw@ TAAV 89H݃))w*iΏGó5Tiٛ #ب8x񎺺gMތ-5Iz>Xհ$Pf_ \GgIENDB` IHDR7 vpAg\ƭIDAT(ύЯJq2^ IDADDL"15x &/lI!bƥ! ""?x d8p|ȾjYThS~g۩lǾI7ٲYO>q1 +AΒi.Q8l9UIc+%=`Jr?*D2 _iK(<"&C'S˃tVGU]$^uVC%fTN_I .]IENDB` IHDR7 vpAg\ƭIDAT(ύ1JA dIBd" YJ<H*XXl%)XIO0 $ y 7 fkH!=,yʹX6˱fIye; j㙮uRWzTG x4Mpo:qA*C kGo3c>dp)&* *{h\;5F=PF' j_S o!LJRIENDB` IHDR7 vpAg\ƭIDAT(υJAE,2 [ B`!AD,BT~ai!VBD`!K !,xyywȬ22:$LQ066g€G;q r1 nx0C xeL+(SJ&65rDR1!!@B$8jR956s,T8XiԝzU[-Lֻ.GbrJPi']*x5R${] =T[33IENDB` IHDR7 vpAg\ƭIDAT(ύ1KBa{!I"A%"k"DB$$"D"ArmieAMuuU3/o@=6lHURjqKTbӎ6.*fad<qH$&+Mhh!{ 7Hf _,ʄ\.vKj_e%P}O<-o`,v]cρ#S]/zu?v,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV5RpRJdw&֊))j1^ PʟIENDB`launchy-2.5/skins/Black_Glass/0000755000175000017500000000000011355776633015363 5ustar monesmoneslaunchy-2.5/skins/Black_Glass/scrollUp.png0000644000175000017500000000035211313021641017644 0ustar monesmonesPNG  IHDRh6gAMA7tEXtSoftwareAdobe ImageReadyqe<|IDATxb癘.11\|Q6,]THH%%aڵ|||4~@[l[nao߀q$k0N$.QIENDB`launchy-2.5/skins/Black_Glass/author.txt0000644000175000017500000000027211033170272017403 0ustar monesmonesBlack Glass Skin (v. 1.0) for Launchy (v. 0.9.2) by Peter Wooley - 04.26.2006 Let me know of any problems in the skin by contacting me at: peterwooley@gmail.com Enjoy the Skin! launchy-2.5/skins/Black_Glass/scrollBack.png0000644000175000017500000000544311313021641020126 0ustar monesmonesPNG  IHDRH.u pHYs  ~ OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FNIDATx̱ 1 BQ5TwET>otl+ȶlS}~IENDB`launchy-2.5/skins/Black_Glass/frame.png0000644000175000017500000001310311256517574017156 0ustar monesmonesPNG  IHDRH0#gAMA|Q cHRMR@}y<s,٩<9SbL!GĈ 3,F0+7T3IlpX"61"H _qW,d ėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j- -b8o׿M]9La.+-%Mȧg3YះuAxEK i<:ŹPcu*@~(  ]o0 ~y*s7g%9%(3H*@C`-pn VH@ A1 jPA3hA'8΃Kn`Lg` a!2D!H҇ dAP B Byf*z: @]h ~L CUp΅ p%;56< ?" GxG iE>&2 oQEGlQP UFFuzQ7QcYG4G۠t]nB/o'Я1 xb"1I>Lf3bX} *QYvGĩp( &q x)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd 3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))T UEMSPgeedɆfȞ!4--VJ;N g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv >mяN9-{ LOgsΝK?7s>xOL n\x }N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV'|r3Oo>33y1o6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`6`i`Ql%Z:{c9rA,7v 2 2PkpJ+MYAlOFDEGdGn@d@da T݁Kp n1J/5Dv0e[NN^||tu֏F1[p ){p.I žlnbŷ~q؁ Ȁ @9BpRkU8RGn\qWoMd@d@86y.IfWC.n,l>}ݿ_~d@d@d ӗ[xpNM)̺D1Y&rQpwd׿Ȁ Ȁ bE8 7(e5XN.\L\^2v 2 2T'&jq!o鏜?{؁ Ȁ @npP"pƹO.mE#|؁ Ȁ @npPKjqg΁xͩK X$܄_§Ի#"oO^Ȁ Ȁ f tpNM8.#|5 oD9uvF2v 2 2T'&jUE퉩؁ Ȁ @nC ᤦk؁ Ȁ @nBnw%rEwę+؁ Ȁ @=}%N:v44v)ᦆOt&c2 2 204~) ;?#^NSsid&u:d08zB:22" MΥG&C`gSӑSodݑ鰰x~)J:⚌יXy*u25:55DqD?w E '&UFF"Ñ"wc-Z8;h:S8$܄]Kl`UH|O# }$Ȁ Ȁ 41){p.I G᪚o+""OG7y=~_ESϑ;\Sp 58 \pU5=E8%;2(v/#&"d@d@@ Kp n1HpnQw'KÍ*v]߉0Oi@d@d` 6\Sp 5H \p[t, 1&6EX.#Α|3|y0;p.){p.I G%з<2`]ΓɃkŒȀ Ȁ .){p.Inɕ+Oaa,@ΏΗHG_b@d@de.){p.*OY6DtUaO+#NS ؁ Ȁ ܂cp =8\5Lr*;·bRv:ay|zc2 2 u0Kp n1\%Wʮ*BACKQ2L"bKGDC FRAM >m IHDR7 vpAg\ƭIDAT(υ1k1qQnp8Dĩ8u(D:uԩ 9:N$:$"8|:m,7ʔ#1gP@PVGJԛUUUt^w(V\2RWo)Q$pCw@ TAAV 89H݃))w*iΏGó5Tiٛ #ب8x񎺺gMތ-5Iz>Xհ$Pf_ \GgIENDB` IHDR7 vpAg\ƭIDAT(ύЯJq2^ IDADDL"15x &/lI!bƥ! ""?x d8p|ȾjYThS~g۩lǾI7ٲYO>q1 +AΒi.Q8l9UIc+%=`Jr?*D2 _iK(<"&C'S˃tVGU]$^uVC%fTN_I .]IENDB` IHDR7 vpAg\ƭIDAT(ύ1JA dIBd" YJ<H*XXl%)XIO0 $ y 7 fkH!=,yʹX6˱fIye; j㙮uRWzTG x4Mpo:qA*C kGo3c>dp)&* *{h\;5F=PF' j_S o!LJRIENDB` IHDR7 vpAg\ƭIDAT(υJAE,2 [ B`!AD,BT~ai!VBD`!K !,xyywȬ22:$LQ066g€G;q r1 nx0C xeL+(SJ&65rDR1!!@B$8jR956s,T8XiԝzU[-Lֻ.GbrJPi']*x5R${] =T[33IENDB` IHDR7 vpAg\ƭIDAT(ύ1KBa{!I"A%"k"DB$$"D"ArmieAMuuU3/o@=6lHURjqKTbӎ6.*fad<qH$&+Mhh!{ 7Hf _,ʄ\.vKj_e%P}O<-o`,v]cρ#S]/zu?v H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxԑ1 0 E+wpxI|#&wggUS) R7 }⃈H=8]"C~РNZ|Z{iZZ0#3~iY})%̵֫Hu]1"RRJtq۶;MONo>1?}IENDB`launchy-2.5/skins/Default/0000755000175000017500000000000011355776633014602 5ustar monesmoneslaunchy-2.5/skins/Default/scrollUp.png0000644000175000017500000000035210715737001017074 0ustar monesmonesPNG  IHDRh6gAMA7tEXtSoftwareAdobe ImageReadyqe<|IDATxb癘.11\|Q6,]THH%%aڵ|||4~@[l[nao߀q$k0N$.QIENDB`launchy-2.5/skins/Default/author.txt0000644000175000017500000000024211313016354016620 0ustar monesmonesSpotlight (Version 1.1) By Tyler Sticka www.tylersticka.com Latest Revision: 18/12/2007 Thanks to Josh Karlin and Peter Wooley for assistance and inspiration!launchy-2.5/skins/Default/opsButtonPressed.png0000644000175000017500000000074010715737001020615 0ustar monesmonesPNG  IHDR[vi#gAMA7tEXtSoftwareAdobe ImageReadyqe<rIDATxd@m `!6 bBIe!>@ `c!) AbJ~qS眹sg&pitb&BTbHvm6dX/@( (Vh4ݮ R,׫D)9z^**˱L&vBHt:eE^ǀ,j4ZB٬$}G0n$wK"aĘ H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FNIDATx̱ 1 BQ5TwET>otl+ȶlS}~IENDB`launchy-2.5/skins/Default/frame.png0000644000175000017500000004323711257477063016407 0ustar monesmonesPNG  IHDR,y^jsRGBgAMA a cHRMz&u0`:pQ<tEXtSoftwarePaint.NET v3.5EEIDATx^ U- t }@XqAPeDY$(" *  s֭{kyKWU=_{^u[s[nyRj.ѳ[m &~mnc),PX,.|jɒ%ꫯV=z7cy<~2Oo (@_f / ,B% c(v,@a[`wXR#9眫.ru m ORmT 熄m漴ߛ~8&{ L""//_\rj.6b?JxRl?t 9M gyfHmIk~)78)d+TfϞ:kP\rhCT9>m.q{q0ǒOb pR.O -\tEi_^1Z&g(QB|<Ǻu\8(wTsv}Y,ߌ w1O<ĐRMk cf==Jٰa:O:m1G|ήm\`f_AΗ: -#mvcČ,£_:\|,m*9~%:ߏ|,L:>o~3$Ķk͏+bL&dw2,t9t6˩ؾv:Nzt:Ll;ŎGؖqiqR8 oUg./i-b[j+מr_ϳH]g%X 7e#֥ lCkmt&Z,t:: ˲4l?ZS{1z!!?liGc;nᆷGdN?=]a :FkuN|\g`YdZmO HmO۹Wz'z|xI䭫N,W~x8xkΜ9SNIXA'aT3A'a54,Tct"xZZ>{wHm9$ͥY߮R1Nj7_޺uxXDVy:餓+Z: u Z>T3E'b}&l[ 1!!63Oeo&~/\q-c8/7pԧN,['໡`|f ض :$,OXI'c:)N61!!%kەc}{?IV#Jyȋ!<`w QcOa?:u"'cOTZW ;sHm9 5m;Y>ܦ:o<`͚5K}̱裳(lW;};tWAGbv:۸u <c ߴiӐby`MaqFxpŢHcYU7sLQxL6Bu81lXVS'caUСG>lE nmHmf6ylߪ/é$8>l1- |hlMb;Odob[=m`ן_k?U4sgUr%Ef̘9М: ۗPc>]art gXӑ>vT7tӐR-b~_eߕRI>뭳{9%.mx. CVM>]x9t-_໕P#]c28LW>j*A~7 -հux8XW>q9}q36hy|HgYkvWᄃZt/^ԲeՊ+ʕիSw@1-_u}>̡U9rAʦGU/W1o!!6J}9۶b_\~-BZ+ռXz9dDIdkڴij VrjBD5q5iT5et5m 5},5s5k\5g.j.]w]/X.Z-^,CK՞KVKGlZ|ZjZ~VZrtbMu u k#u]7$ĶN}T~_@`~ߞ7-Wbv>+f,tb{/Rے=Ż]y`@6dAv!d BLCl"N+10I&৩Sg)fg33wV3gS՜-TZ-Mp Zxp=%4j=hj^+Ԟ{T{-[g{~pf>~^{+Zom}eN< >^++<^-}-E ® wGl,AvFEFF D,1[ f#f!g   6M؝z!uYbڏs!ҡEVy7n|DkBECaޡ^,ԍiT9Y]X$,g잨:4upɞMQ=z7-t5~ 5aL7y8e64GM:WM6WMwQSgSfSgil8p_aٻ,t1 δwC2׼{zuR8_E{]}-XwI w[]-džW_}ۢQ-vm#lG. ۊo @.F.i~}>CߡMߚ ?M$G_rޥ.ϗGR՛ZYⳈ:@ņU:{Щҡ>O\c]ɘˣؾb_uUCBlK;lz F理ߪ'EOI~C,/A+ EVMTznׄd`=S% M}|Tv|/Ն$sa}_b[&kǰF_*] D' ׇ1„9CVyZua?cޢn, ԉi\-Bil¶+&y1AՇuji"+b[lmt/}K۔NT|Jn/8i?'^.[eoj2 ֤Iށ+U h̐"̂*VNPH큒ᤃ@eT)xb=4K_>6-hŶdb,!IP߾lxI|׮fcs{\MXF9xƍEi3l"rǾHCw^lʒqƱvi yCVa|ח!m4XG/JT1Gmc4ԊԂmi۩ T^s'L >1 P+~L|s%؞S!J) _,[ E[q;(cg}_B4#jv汍m[S>*m? Ǎ!i$on-i'zԳZ4FfNH8$Cƍ-n6i0g&e[WNfר3IJʲ$ٳ)fXedT?GFŀ3&B yW:{&竃>XYo^? c1XyY\g[ȏʖ]ٔdUV9B˦$le>0l(aUHnR"VJ xU߸G'sVJ JmbX$S=h ueXOL%J2܏ab\ɥ 3ѱ+HUu_Z;@B_Vuby6L`,4ө& jr]cZ:ᰁ1u}S}S'!̮X21jt6 .j j `1-s%7d;VW|ʇn 92#~˸CGQ^_~߈UFHb,\Ʀ-%I,fxSaY$ ȪtPYa*+V@ethg)U( X:x[g@y<6-=Pyt)x`¾Im`[Xlaen؉!KNv,&z- xf;qA-Xcǎ-eS&R+1!jn@6Er`U%gV EhȪ̌jL2&*[dΕ-2,V+~gluLvjO6-N5O9-ihGpTP>*ei}7KFXl %xU ZL4tp322-a-S Ձe +̭F)mTcF8$ 9hLîtj4sk,"'̌y"ŧΜk^{\s9(`OSyiOfmcɶs5O_e: e߿>*#w<0N\'~3⟣mkr"K|a QAdU][[2,fYZ1VN[y3ժ}M[Lah|c{|edl1I2|@Q6bMh͌ wyj:C?Ϝ_X5I`TY'y,_&md[fZ~л]mϊs'!77MqQ& cSD#[3ih ˄Q$:rkmmdWȶ|@5Qʾ, #L~eW;Մu"I@Fu>8i 3re[rfGՒaq!X|\3_D/ 4:sWOS'Yma$Za@] */sf -~E8bċKlIrHv'-C#!Ć<):pC "=PE})jzQL C8¡ 9<fKL'̶ "s_6`u, F嬷+Z9D:Yt?woÓ=j Xa_쒫Me!jIɿ@nUG=ӒYU7f̘Xvܖ VZ*q@+ޑ>Dٔ(b`An0URrA~L<(`<=}o 5 'gg7U9`Ŷ ix۶VEq]ɻS1{W## Ղ?YԠ̋ҋdU]CCC X>r*0jhlʮmȗ7`FC"irvPCҥה8PeTa@"H}vS#`7j$llk 1xRop=-5!䷚U@/Hpr2(Y>~~~|p#~ppx^`1@{蟼\{krOmhZ8ڻ»S+vUuO C1"oH(悕6+- EPEaUmHY,ppʗU LЂ-XryZs>S;fe{m!be_ -9Q-hf)RE`E~EXPT;ԁw"vݽ|}.{(^n K2-nAVVڕ ՘6_)f*EeϪ<[J_Gpکb!Fcնܮ[!n!6`{*IyOQGؤ>oT7T/ԂC֪ 6$@k<\"/W aUu#FM_%h EyJTmգ^RNP\U@jB+8D*  P?`|6⾢<_+Z=,ZAw\Nܫ.y@ͼ!ʇՊRp̓=~'o_}MϫꝱHM0 , 9,Ȫvکvɬ AEXi2TjQ AU6TN0T- ca7O׺lJ'E^فhZQ` ||r:TKv3?Sc/_M!SKu3u]_ UڛPڍo[mBOcx0gJ#Owo٤^MLB5a曫.aJrҐ|U[1]_6 4,Rqi'þ4bt1mNؚ?{2Erm?Qj}h9endi/|gcYTIٕ9U,?36aɸNE`ni㣂 o4>4uP7yu?Uӯjj+T]]u߯I]w-߻Y7}ܦԾ_fYM:W 'ȪV}W;ٵ{}V~Q=U`e;$opÊNQ)ʞl!uJ}0yj!q$Beci2$+ [-~ϫ pPDqhesר~Vo?kը S>psꧏ<ꊯ}C}߯W_w5M7@9}U77xy3EVmve*P+8>6:;N)1Ų8TPI"*U^%m_ 8egZ;0n֡dhɶ,++c!B+ \iJ˲dOumP[QէzOQ}gm> bVPνKS^O/ί̍ _u }禛%nV=J3}wCiWO;CއEV}tq Y7w˝ѩJ,e5LwaWQ{kNr_Nxeh{@".iëvh04'݁sEL6_X a7r呿tEykX h8CM?:8/:?Po/oԖnWo;gߪ>}r1>vz7!7_ؐUun : WGDY|(,PX-puǫmAkI_T>;uS|7j5}G X[Uvwg<`̏~մp\%cq[yDVm6ȰZbDz1Q]pE(,PXi_~VZzAkŧE}__M`+Wj-eXK~T0YU[2,[v|jo]UX@aD [_nP@hQH}[_-]oW̰_:_νCoQ#SdU'>T`1z_TX@ax N_W~uO~j^US6^k~jga)W36ܠv˰,ҏ!/RtUabx?yOSuwGnD)Лx$ˉWŬՊӿ5_r _:ajT^4䔀asȪVO 0-C=ꮻRO?zgZ={Hۨ?^9Z=X/y/PϼƟC1\$$vjYZҞ>+  'xBr-*s}ŃՓW|eWȿWNqY-?z͢|%=XYUя~4]ҳX(, xW՝wީ6mڤz}+s/V{G?'?To/yhϸIs6ŗc IV}# UY  Pv[TA]+"nu:؍;zjS gȪOsz) [^q+&K_ahru駫k&7$>PU! HyꪫeZ 5k֨+R-X{ߟ0%KkD@aqoxw{8H֩>l^{ihY"y:z"݊ xo=䓽Ia_^wq[oUR 罔5Ed,wʯiaWX@ay o[`uI'}sS|Ck|)Ԅ'1 *XO$(1"tY31B/;vtV٘deIӤLl$(%KF7#3XJ;ղm~F!ِGeoagQ|g)UR# bXmb\xNQ;ex3oK|xcEN9| \龎= hpk\%r3PӚEcflIuaeeSp"G wd~7mn B}s[/)MA!.5bqmLvDEh"DW*YÆ}HY_(+O*X4R&`,:A-ob@ rhUk'~UXfVsUr5rd=Xr-⽄-f\,jvv|X )颟&䥙 Xn\Fofc\ʥ%N_4A;z4olGJUݖZe9y~b2-.0ߘ 2&ȤqV![ b 1m漍DEd47+b3!n\Al9Y6[`M[bq0#;1}n={AACVG [?m m}FAjڠ CITh4"A EhOh) ZVCCA@AGBGA@AC@'C@ACk3 vYzss4mc߱ٗS-}>g }>CߡїS-}>Gߣ铋 (}>KߥOm8}>Og 0 c13b 1S-c1c 2M(Ře2ˌioƺĽ.s.,'вFp`ďavv@ۍ Z3y3+Z ILpe@CBt# ױsYONbb^ & ï $P $9AdJ6U $ IL'}̾fcߠW3}}G/'Q*}V}M+ c1XX1,5 b, LP X,Jb vQj-3Ӓ,Ƣh8Zg@k, :;i 4 bςx֭@|3Y1 dϾ2b P<[KCNI밾~2m%;%}\(IWlDI*"}Iga>N_OʬLX1S6X r=eV& p!a12 i0ZLUi$hz}x،ϭAGC!d[30N³pvx)d]&x3ٔ ka&@ЁZ24 E%[QI61'vIDKH$}u `b߲e'3)R)}F dGr@Շ+:}^2&8 IcK2+0ܡ9$ seYIu,^2rk LKjYz Zñߝ V=(u-ɶ\j[:xbͳo: u-¼i; {C 43+n%+f%u+v8`ٲ,9H32.X4^3-Mhx"^bgXpGvDk:bS!tɺXCxIҳ/"*ˡ侁t"AI4 _LlGcnSH $}>2ľd f =,C)}5F%}S2*֪T7*UI0P2+n*3n`ZV%<ZJ* eegeHhI1~8yfa*< l .׸^<13/:d_2tYrĴSA)M<ҁzVfM 1(Le.l6"9I?OٷcɜR4O7d'Y}HϤcz6e֨̌J@EN7*ƆJjVaVhJ@%1,u+=2,9-RXG\LYࣤ!0gJjZ̶>u-QCad\PuA2\xɐq2MޥgGb<{IuI=gYj6aJ5p4{lhY$A$0}J- Z2't8Gt@1/ѧ[2B:3"}ɓԥNeVEg gUƌJi1Ƥn%X  +=ۮ!W҃/)׹%^Jʴh8bLi .}.oI%CE3sŔ♏% L=0 3:1E@nMIS Ss0)oLv٘ˤa$@2$C;ԡNЇKR@ ҄ҳ))s@_:O!$b0f(ԫc2d l^Jf]m3Xzi5-"҈RӢQia 3 \f}K*0)E:ŬBGi4La  0 MdRYYϼ:fn6qH>ˮROH9I@a = E@?ѷc5@Hoٔ>#XթtPUI@MX,?#8,6lTZū," dX>\KrJv:ώtBJ tIfF颃S.@xNo%#͞~}/C;ɜ#28?pO E_ )ٔ>#<)C<2UYfVeaEmh5B3ےZr%j=ے0lזqIkkgQ<#ÇCd^L`tg7: ,2@ӡFGf&8::.]br v'$0b Jz$юlp¹ ( $Pѧۄ}c^bL06#^ %+Yy3,RmKjZ .ꡭabZŎd xF/:0t0R3VQuIgZnumaD1 Teg?@I0 P?H֤ďl}O E!%~*ƆԪJjU걚vE0#jK+=$eY6`ي&(Mp.Lxٗ &CI10N53StzY$Vfm}b҄ L̠,ʄ}וMUKU@[q9hF$eʹ%FY̸Ҳ.xf҇:0b0r81332B2pӳ5=kGק:c^Vle?zV!$ Z@ ?&'&(9ܳeRi2~Y YAi,k[01-2.ʼxWʨL1t&dRJ:HfM5qjtt,bpo,շHdFz}oWL0NףL@_ (~R+J h+#A ,33 UEʢYo}I^/ 1d6 tƳ)qpsA1 m m}%Y !F)/lP2InC~+5).ٔ@cE/KB`+Vԫ6{Թ\C~--,b-B5B^6bi KR[)Rz&lNnQL>zJ~ !@!\`$L@wErY@OO1vRU-df. \E4 mi˄~y`)CIL陙3sS݁m:c+l}+nHϔd8g^(׳'ףl2,v,k|ov9 .[楟!\k^6r38Olh9CS:vcW?˥ zdԝt(陓&W3פL*^ό<fL7facV3@W!ͬpANl6/7@iwY{KzT. %$t*=,Вm\6tL>/)B٘ fRw.m^-ea=\[T'.>%eXAٮeR%TY3I6'. de_/2$ݿlh?\5$@%`d]91:`S+8Y\CI0c؜(\´(?k~H]Irb+xfbYjcMYrY.|^-m_y'.kuB$-P+1,MVGI.cF6Q *w;CT#T .@I^(gZ`hT-;.iofOTj1n& }>쵙qp5L:IENDB`launchy-2.5/skins/Default/closeButtonPressed.png0000644000175000017500000000112610715737001021120 0ustar monesmonesPNG  IHDR[vi#gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx|Pn@%ZfRY(VZ)nu,J5~BVUCTEKyX)n{ 6`"ԣΙs9''oC}vԿ`AZz=AUUP< zqxd"흟8@7Zedj6$x<Fc8{|&NC0Vk)-xEUST!8uZ&Ijf0,I?S;;H$xz Hòn6 :qzq2qd b``@b$I-ah4uݶ&R^|>}(H$ s`0 .P(dYV@!fx<l6[\~T {Tp8$h4t:~c'Ӊxh4{+ǵZh EET$Ir'1T>_y2u]MӦg,r$UmZe=,CQUW t &P=$ dpMd0xCD! Fv( `"tf6e_S/@ FqۏOi:8KV좵Zp% ۆrY/Qz|rz&"0ssSzEI{}D?xo6yGq|%󟀀ËE J !,ˡ ^Y)40<()0IENDB`launchy-2.5/skins/Default/style.qss0000644000175000017500000000404411344521152016452 0ustar monesmones#launchy { } #opsButton { border: none; background: url(opsButton.png); qproperty-geometry: rect(279 23 14 15); } #workingAnimation { qproperty-geometry: rect(279 45 16 16); } #opsButton:pressed { border: none; background-image: url(opsButtonPressed.png); } #input { font: 12px Sans, Verdana, Arial; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: #666666; qproperty-alignment: AlignLeft; qproperty-geometry: rect(15 84 245 18); } #output { font: 12px Sans, Verdana, Arial; border-width: 0px; background-color: rgba(0,244,120,0%); border-style: solid; color: white; qproperty-alignment: AlignCenter; qproperty-geometry: rect(0 54 300 18); } #outputIcon { qproperty-geometry: rect(135 9 32 32); } #alternatives { color:#3c3c3c; font: 12px Sans, Verdana, Arial; alternate-background-color: rgb(217,217,217); background: white; selection-background-color: rgb(68,124,184); selection-color: white; border: none; qproperty-geometry: rect(10 103 280 80); } #alternatives::item { padding: 2px 0px 2px 0px; } #alternativesPath { font: 11px Sans, Verdana, Arial; color: rgb(102,102,102); /* selected-color: rgb(196,220,243); */ } QScrollBar#altScroll:vertical { image: url(scrollBack.png); width: 16px; margin: 16px 0px 16px 0px; } QScrollBar#altScroll::handle:vertical { background: qlineargradient(x1:0, y1:0.5, x2:1, y2:0.5, stop:0 white, stop:0.1 rgb(85,85,85), stop:0.7 rgb(40,40,40), stop:0.9 rgb(60,60,60), stop:1 white); } QScrollBar#altScroll::sub-line:vertical { width: 16px; height: 16px; subcontrol-position: top; subcontrol-origin: margin; image: url(scrollUp.png); } QScrollBar#altScroll::add-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::sub-page:vertical { background: url(scrollBack.png); } QScrollBar#altScroll::add-line:vertical { width: 16px; height: 16px; subcontrol-position: bottom; subcontrol-origin: margin; image: url(scrollDown.png); } launchy-2.5/skins/Default/mask_nc.png0000644000175000017500000000635511035546176016724 0ustar monesmonesPNG  IHDR,<= OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- pHYs  tIMEoq1IDATx݊06U[8bE$b,3 ΦLϹhIZP[Y?5yMtv<'BJ)ƘRz<EQeJm\x Ep`.BEQjRs?Xtj{pu}2jϼ]"WzN|[%d4g%np\V }mk^3Z CJh%ŦY ""$baD8#rjn͋g$4S( ?Qdw?|qw{,5B- ]=4eYUU5M3w]c۶j<^,F ^b F C{ܔBޝ`C~o߯#r<EQt]lb1`J7D"D"D"D"D"D"D"D"D"D"D"D"D"^ = IENDB`launchy-2.5/skins/Default/spinner.mng0000644000175000017500000000525511344521152016750 0ustar monesmonesMNG  MHDRd ,\ TERM G pHYsHHFk>BACKQ2L"bKGDC FRAM >m IHDR7 vpAg\ƭIDAT(υ1k1qQnp8Dĩ8u(D:uԩ 9:N$:$"8|:m,7ʔ#1gP@PVGJԛUUUt^w(V\2RWo)Q$pCw@ TAAV 89H݃))w*iΏGó5Tiٛ #ب8x񎺺gMތ-5Iz>Xհ$Pf_ \GgIENDB` IHDR7 vpAg\ƭIDAT(ύЯJq2^ IDADDL"15x &/lI!bƥ! ""?x d8p|ȾjYThS~g۩lǾI7ٲYO>q1 +AΒi.Q8l9UIc+%=`Jr?*D2 _iK(<"&C'S˃tVGU]$^uVC%fTN_I .]IENDB` IHDR7 vpAg\ƭIDAT(ύ1JA dIBd" YJ<H*XXl%)XIO0 $ y 7 fkH!=,yʹX6˱fIye; j㙮uRWzTG x4Mpo:qA*C kGo3c>dp)&* *{h\;5F=PF' j_S o!LJRIENDB` IHDR7 vpAg\ƭIDAT(υJAE,2 [ B`!AD,BT~ai!VBD`!K !,xyywȬ22:$LQ066g€G;q r1 nx0C xeL+(SJ&65rDR1!!@B$8jR956s,T8XiԝzU[-Lֻ.GbrJPi']*x5R${] =T[33IENDB` IHDR7 vpAg\ƭIDAT(ύ1KBa{!I"A%"k"DB$$"D"ArmieAMuuU3/o@=6lHURjqKTbӎ6.*fad<qH$&+Mhh!{ 7Hf _,ʄ\.vKj_e%P}O<-o`,v]cρ#S]/zu?v H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- pHYs  tIME8 IDATx]{lyov#oԃGD[ؑN8q, d;J ui6AmQ i4h A ц۠N]q$+-ےL[dJHJJ֡WPF MDaBK9^@F*GuWHț掬1@zKE= F""c$Fea|k@cnbtRLBBi` -jjB?5DډeqiZxi#D]**(֕{yXo {GADW/P]gf[P?R3N>g].Ѽ$a-:zeJQbTbr0 4xW 6 : ҝUR4MDf1b33VPJ)&Q (PFFIy -9U6ȵNX(ǥC5aV"c cHM_?cu`Wdzxb6@ VC쭜8-*>$w. 1Դ$,|wXH G~OΉ \+g;X99 bu-E8椖.u[ a ~MHtDOn(Z lhZ=;U#$~h` @8^,y1^P)w1/*(F^MKs(6i;C=%vӒ0bFyp]G8Re~X\eʴ&k;փ~UY L1N"8c6"=XQ<QM֋:Z5A?(2Q~IF5s0u jFDPB XY΃؞oTD>L\/uQn12m~r V=M=;;;e1'-4;Ĵ5hH$$1-b-KG w W[FiBI)tHFLh_D`Tmooo*ή ցt=~Y;HDB+t\UL6#I*wwEoEf2tG\\?w܎;4MkyܹȨGE?#g#Ľ6 كֲRjGDxIKBY?~¶rd)VͥCx!=+7D +'Oܷo_ɓ +X QacH<^/&(D@TwVnQWb}5 N@ fL8 AҐ[S<OB Kk.={dM_T:sԅR^(&HlweRYbJ>r=F!ـiv?ְV+I4{P ۀkB4y TZG-//o߾;7~+++W\.,-kE;6d2'B^1$4VB‚Ĭ\#%QӒAD E9!JvH%|91ntX.mK+Mq0pl PB, V><8үIf *楐Ho+@Вt5jA`Vta qcŠe Ȫ(-PЂ[OP{JGW_=6P9"VVW50۷Oޤ] hzI(AB(Otl׶x E1y'!$OiU2d/zvP_AC!;"LAl'qPQ ۷e2 }nl60=J$I֭D_~A:ҊK#DF ~5/"ҹxe"1d7uBNKiQ%0*h%f ctg ~)bO AM[f ߷ʘI¬MzN\!aŽ2WS1~kA< LW Jd ĻW0t^?گ"K]&=+j0a^;{ ґbir;#_(>?b( 7 ^&϶gQCd*)rUR{0pdbJGL<3QJ@Bs\4 Pe˖pVkwZDҜCH^ dzR- P> ǎC(6wQPC;h Un8 eGjf⊮H:$ֺw}jBVdIK [V 6xqMރ4 3IKErQLREhio MђMak$HQCrl{L)jlXzt{VuJ@R [ "!QH3Fnaoc?kh<" JddoáOKSAݩs4H]uǪT4,fTUvQs :s>CZ3IH`lc,N"eHtf֐P?#f=;~q&W\sFB*RMvu(P!<. Ie: qe2!7A?VK!6lJX?&{ݗ"EzG {bO +B[+ f_1paxK#Y u(VUO R"a"QRFE2b;c=+(>!ӽ2lS0ոi2} Zn!=9\Bb|r["RmxHbB;`09mgյ#PjtUN̰R# 0L@b2BNg$(<wEjJ]w`Q#YN хCѳ<Ȓg II.YX p*";?ǟzߞm=:z/5gʅ;wk{7k9ݺ:Ka&5M20M`y*&arB?NXT fOG>-|~mWgr41U 1Ѥ&, ӣ`_I9A@w#rք/2M@â?7N4DTӶuG^ѻ]iabJi+Rd?{Q6~q}BI7wZlk˞4Rj}}}TΞ}'C {N֨I%9E} Om*fG/D9IgzPgsfYLneȵyIck=K& nhLAe[ 6;_ȵݶg+sIұ ݝii8X\|Tx/P暡XE0$TY>W1@pGLwV0èDBR7W]h7m[OO^g`l jI/ eڴg_;b.[v\Dy&aN tCbC[0x5@I$#&L9@BiQJ]1b9R X/]\ގZ_~g[)(g/̙,O_$MVΛ&CBy%=1ׂpquc*wt\1: +h Fog2!Qsu_]'^eeRbQ O._;鉷azUޙ_ s]ueC4]#-TӨi7[jiIdY,/]l9 4Rʞ!EAȂXNR6pHY+bDi>vhÉY j"yΛ5X\,eKq˵O_ 3eLh2X_(m #)!GvH1;X. )dz ٸ{܋XO6V#eTȈuSQPu=g+Nlr`7:p?< 1^5sh;Z֖LU\bǛ,6Ζ\" c \X Ċ$F:AQdC3Q┑jB?k^LLr.v(lbiZcCCFiVhnY=385] sW%xe)1r+S8c7mz8{O~~q}DAA?Ɨ='}5}bfd疬6'akc'7vww|C_ ?qPhb~?۹|]u cyj֡{[ǎNiϭ}nߞ.. ݰ%_)M-6Zym (3KE-+;T+(@[6_'~O8kޚޞ* $b8R6!gKNe6aimU D-ki2V/#٥g?}~o۳=s{mˋtꥥbeOuޢV7֭[{&C#z\AclqqԩSRiK߃l֮_[[4?܉oݻk`G-aL,Tgi+ s0887yEN<:]AEXX\\uYL Е_ ̹;wf l!Ҝ3M4YlHzUP0199[om۶m׮]֗LjY\7BΞwf2Ý羲aii̻ޗ40_AcLjB2_-hΜ9SX4[o7LLdZ;V\/rp}abbbcc@B`ۤ{?&;Bv޽2/#Eˆ|tOTV6D{⟂SSSa,..vuu9 R^ƛt?ydX>s}'vU)pmȑ####?fgg]-P(r?o߾\.K>vq):`cdddO=Ԯ]]P(|c;P'y~FAo|g^z\.W(z衽{RJc]e- }6Bcxxȑ#/###>M7@J^"B[[ۮ#ag;j?Bz;~(ʺM{i$H~`Ix!B#AZivDzc򆲤NY4](bL}jZ6tm&~zAet@<'Jui(^ &8iM !$xxIX4{ׇ?<66f׵}㩧Vt*p%ƮX#:LIZ xDITXs0v4#'Hl-8?a HV~_[])\Yh9|xllˏ.<1e/+( 'ס+y]̈́*HHHHHHHHHHHHHHHHHHHHHHHHHHHpKT,IENDB`launchy-2.5/skins/Default/scrollDown.png0000644000175000017500000000555610715737001017432 0ustar monesmonesPNG  IHDRh6 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxԑ1 0 E+wpxI|#&wggUS) R7 }⃈H=8]"C~РNZ|Z{iZZ0#3~iY})%̵֫Hu]1"RRJtq۶;MONo>1?}IENDB`launchy-2.5/skins/QuickSilver2/0000755000175000017500000000000011355776633015541 5ustar monesmoneslaunchy-2.5/skins/QuickSilver2/author.txt0000644000175000017500000000010711033170306017554 0ustar monesmonesSkin Title: Quicksilver 2 Author: Juan Ignacio Serra Version: 1.0launchy-2.5/skins/QuickSilver2/frame.png0000644000175000017500000001402411252675232017327 0ustar monesmonesPNG  IHDRd`NgAMA|Q cHRMR@}y<s== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz pHYs  ~tEXtSoftwarePaint.NET v3.36% !IDATx^OU8:juuqZKb'o~\ܯrw;ng7<$OI>kϯR1mw|?aU@?Umsos@~G{^ѯ#.@=ҳ,G6A<|LML_Et~Ty r KX3\5 8'⤼!aQ ^%@H< >>)?< H[M$@GO8W_ p Ph0׳LLMK<+<p p 1k^()Ôi2]6]1]5dtMR 䁴z.Nn=e 0\c %cmmͭK<VWWYw@(3\7x`lAzZ0䄒j 灕G )3\7{@`![EkΔIȆ,pTy `ݻw2<5|9}l vxKȸs玻y~y ;;ݾ}@H 2L,F.y_ML0m m$@H>^~}wI;08h-$ >~ߙ_j pp^~SX`IMHJD0^/J<+<\N0_8go8tvl#)OD GIZ3?HM6@LVH<~#\'+/3~pGTP3%-h4dGÿ=ې0Ф&G59bTmG>p=mǔ z`uu&\$@_nȣt{InhiiIR 䁀<0>>xJ܎䇛R>`qqI<\mmg= R 0‚y۷f_0gW};I57oܳgvj[aӗ*1`g@$v% x`hhUTT!`II5+//? I5+++7`]xߕtuђj ま RR p7|w'I5@kkkV=I<ZZZ\AAAcF zTy 477x1#WV=I<\^^^l%> X$@8hllt'v%~e5초UOj H kأiZD zTy 444{x=M>"p'MGMH+@2HI5@}}^Sn!@@`+~u L۹1@{z~x޽K d&xkksxC#Ӧ Nx-w I5@vv}6=e '҃ۏߘ$NFd.jV7I}g iw*cpNDp $AI5v<)­xfIa5| (|Xj I^=pC  |D_K<<x9K飯IENDB`launchy-2.5/skins/QuickSilver2/style.qss0000644000175000017500000000133111335654643017421 0ustar monesmones#launchy { } #input { font: 14px Sans, Verdana, Arial; border-width: 0px; background-color: rgb(255,255,255); border-style: solid; color: black; qproperty-alignment: AlignLeft; qproperty-geometry: rect(19 61 221 25); } #output { font: 12px Sans, Verdana, Arial; border-width: 0px; background-color: rgba(255,255,255,0%); border-style: solid; color: black; qproperty-alignment: AlignCenter; qproperty-geometry: rect(56 19 184 20); } #outputIcon { qproperty-geometry: rect(19 11 32 32); } #alternatives { font: 12px Sans, Verdana, Arial; border-width: 0px; background-color: rgb(255,255,255); border-style: solid; color: black; qproperty-geometry: rect(19 85 350 100); } launchy-2.5/skins/QuickSilver2/mask_nc.png0000644000175000017500000000064511036445705017654 0ustar monesmonesPNG  IHDRdٳsRGB pHYs  d_tIME &>0ل7IDATxݱ @QS,v*tz`5CWb{O@J/b1@ x] vZsgc|R b1o\kc1b1@ b1@ b1@ =bfzZk{F11 bb1 rp$2\h'b11}rOb1@ b1@ b1@ Xp?q 3?뫵ϱ7b@ @ "o.Mr2IENDB`launchy-2.5/skins/QuickSilver2/background_nc.png0000644000175000017500000000124611036445705021036 0ustar monesmonesPNG  IHDRdٳsRGB pHYs  d_tIME %/.s8IDATxݽn@ad~Į)I]XlE2Fqt8"~9 b1Z ?뺮( Lj=IENDB`launchy-2.5/translations/0000755000175000017500000000000011355776633014610 5ustar monesmoneslaunchy-2.5/translations/launchy_de.ts0000644000175000017500000011566411355674521017301 0ustar monesmones A new version of Launchy is available Es ist eine neue Version von Launchy verfügbar Rebuild Catalog Katalog neu erstellen Options Einstellungen Exit Beenden LaunchyWidget Launchy Options Launchy Einstellungen Close Launchy Launchy schliessen The hotkey %1 is already in use, please select another. Launchy (press %1 to activate) A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Show Launchy Rebuild catalog Reload skin Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. Die Tastenkombination wird bereits verwendet. Bitte wählen Sie ein Launchy's Einstellungen eine andere aus. A new version of Launchy is available Es ist eine neue Version von Launchy verfügbar A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Es ist eine neue Version von Launchy verfügbar. Sie können die neue Version von <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> herunterladen Rebuild Catalog Katalog neu erstellen Options Einstellungen Exit Beenden MyWidget Launchy Options Launchy Einstellungen Close Launchy Launchy schliessen Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. Die Tastenkombination wird bereits verwendet. Bitte wählen Sie ein Launchy's Einstellungen eine andere aus. A new version of Launchy is available Es ist eine neue Version von Launchy verfügbar A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Es ist eine neue Version von Launchy verfügbar. Sie können die neue Version von <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> herunterladen Rebuild Catalog Katalog neu erstellen Options Einstellungen Exit Beenden OptionsDialog Alt Alt Win Win Shift Umschaltung Control Steuerung Command Command+Alt Command+Shift Command+Control Ctrl+Alt Ctrl+Shift Ctrl+Win Space Leertaste Tab Tab Backspace Zurück Enter Enter Esc Esc Home Pos 1 End Ende Insert Delete Page Up Page Down Pause Pause Print Druck Scroll Lock Num Lock Up Auf Down Ab Left Links Right Rechts F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F11 F11 F12 F12 F13 F13 F14 F14 F15 F15 Caps Lock Index has %n item(s) This is Launchy version %1 The hotkey %1 is already in use, please select another. Plugin options Plugin Einstellungen Index has %n items Index has Der Index enthält items Elemente This is Launchy version Dies ist Launchy Version Launchy Launchy The hotkey you have chosen is already in use, please select another. Die Tastenkombination wird bereits verwendet. Bitte wählen Sie eine andere Einstellung. Select a directory Ordner auswählen OptionsDlg Alt Alt Win Win Shift Umschaltung Control Steuerung Space Leertaste Tab Tab Backspace Zurück Enter Enter Esc Esc Home Pos 1 End Ende Pause Pause Print Druck Up Auf Down Ab Left Links Right Rechts F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F11 F11 F12 F12 F13 F13 Index has Der Index enthält items Elemente This is Launchy version Dies ist Launchy Version Launchy Launchy The hotkey you have chosen is already in use, please select another. Die Tastenkombination wird bereits verwendet. Bitte wählen Sie eine andere Einstellung. Select a directory Ordner auswählen Launchy options Launchy Einstellungen General Allgemein User Interface Benutzerschnittstelle Always display Launchy window Launchy Fenster immer anzeigen Hide Launchy when it loses focus Launchy bei Fokusverlust ausblenden Always on top Immer im Vordergrund Show tray icon Suggestion List Condense suggestion list Vorschlagsliste kurz darstellen Always center Launchy Launchy immer zentrieren Hotkey: Tastenkombination: GUI GUI Opaqueness Undurchsichtigkeit Fade in time Einblenden Fade out time Ausblenden Simultaneously visible alternate suggestions Gleichtzeitig sichtbare Alternativvorschläge Max. number of alternate suggestions Max. Anzahl der Alternativvorschläge Simultaneously visible suggestions Maximum number of suggestions Visual Effects System Options System Einstellungen Check for updates on startup Beim Start nach Aktualisierungen suchen Show hidden files in browse mode Versteckte Dateien im Browser Modus anzeigen Portable mode (USB stick) Portabler Modus (USB Stick) Use testing indexer? Test Indexierung verwenden? Minutes between catalog updates Minuten zwischen Katalog Aktualisierung (0 for manual updates only) (0 für manuelle Aktualisierung) Internet Proxy Hostname Port Skins Skins Select a skin Skin auswählen Author information Autor Information Skin preview Skin Vorschau Catalog Katalog File Types Dateitypen <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your </span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and Developer: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Developer: Simon Capewell</span></p></body></html> + + - - Include executables Anwendungsdateien einschliessen Include directories Ordner einschliessen Depth: Tiefe: Directories Ordner Underline matched text horizontally vertically Only allow dragging whilst Shift is pressed &Hotkey: ms Auto open delay Maximum number of history items Name and path Path only Name only Suggestions display Auto update catalog every minutes Show network in browse mode Allow wildcards in browse mode Check for new versions of Launchy on startup Rescan Catalog Katalog aktualisieren Indexing 0 items 0 Elemente indexieren Plugins Plugins Available plugins Verfügbare Plugins Plugin options Plugin Einstellungen About Launchy Über Launchy <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Please help this poor grad student to put ramen on the table. I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Bitte helfen Sein einem armen Studenten etwas vernünftiges auf den Tisch zu bekommen. Ich habe viel Spaß bei der Entwicklung von Launchy, und ich hoffe dass es Ihnen ebenfalls viel Freude macht damit zu arbeiten. Sie können Launchy kostenlos nutzen. Wenn Sie der Meinung sind, Launchy ist eine wertvolle Anwendung, würde ich mich über Ihre <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">Spende</span></a> freuen.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's offizielle Homepage ist <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> SettingsManager Launchy Launchy Could not convert to portable mode. Please check you have write access to the %1 directory. launchy-2.5/translations/launchy_fr.ts0000644000175000017500000006445211355674521017316 0ustar monesmones LaunchyWidget Launchy Options Close Launchy The hotkey %1 is already in use, please select another. Launchy (press %1 to activate) Show Launchy Rebuild catalog Launchy A new version of Launchy is available A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Reload skin Options Exit OptionsDialog Alt Win Shift Control Command Command+Alt Command+Shift Command+Control Ctrl+Alt Ctrl+Shift Ctrl+Win Space Tab Backspace Enter Esc Home End Insert Delete Page Up Page Down Pause Print Scroll Lock Num Lock Up Down Left Right F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 Caps Lock Index has %n item(s) This is Launchy version %1 The hotkey %1 is already in use, please select another. Plugin options Index has %n items Launchy Select a directory OptionsDlg Launchy options General User Interface Always display Launchy window Hide Launchy when it loses focus Always on top Suggestion List Opaqueness Fade in time Fade out time Show tray icon Simultaneously visible suggestions Maximum number of suggestions Visual Effects System Options Show hidden files in browse mode Portable mode (USB stick) Internet Proxy Hostname Port Skins Select a skin Author information Skin preview Catalog File Types <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your </span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and Developer: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Developer: Simon Capewell</span></p></body></html> + - Include executables Include directories Depth: Directories Underline matched text Always center Launchy horizontally vertically Only allow dragging whilst Shift is pressed &Hotkey: ms Auto open delay Maximum number of history items Name and path Path only Name only Suggestions display Auto update catalog every minutes Show network in browse mode Allow wildcards in browse mode Check for new versions of Launchy on startup Rescan Catalog Indexing 0 items Plugins Available plugins Plugin options About Launchy <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> SettingsManager Launchy Could not convert to portable mode. Please check you have write access to the %1 directory. launchy-2.5/translations/launchy_ja.ts0000644000175000017500000011630111355674521017270 0ustar monesmones A new version of Launchy is available 新しいバージョンのLaunchyが使用可能です。 Rebuild Catalog カタログを再構築 Options オプション Exit 終了 LaunchyWidget Launchy Options Launchy オプション Close Launchy Launchy を閉じる The hotkey %1 is already in use, please select another. Launchy (press %1 to activate) A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Show Launchy Rebuild catalog Reload skin Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. 選択されたホットキーは既に使われています。Launchy のオプションで他のキーを指定して下さい。 A new version of Launchy is available 新しいバージョンのLaunchyが使用可能です。 A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> 新しいバージョンのLaunchyが使用可能です。 <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> からダウンロードできます。 Rebuild Catalog カタログを再構築 Options オプション Exit 終了 MyWidget Launchy Options Launchy オプション Close Launchy Launchy を閉じる Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. 選択されたホットキーは既に使われています。Launchy のオプションで他のキーを指定して下さい。 A new version of Launchy is available 新しいバージョンのLaunchyが使用可能です。 A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> 新しいバージョンのLaunchyが使用可能です。 <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> からダウンロードできます。 Rebuild Catalog カタログを再構築 Options オプション Exit 終了 OptionsDialog Alt Alt Win Win Shift Shift Control Control Command Command+Alt Command+Shift Command+Control Ctrl+Alt Ctrl+Shift Ctrl+Win Space Space Tab Tab Backspace Backspace Enter Enter Esc Esc Home Home End End Insert Delete Page Up Page Down Pause Pause Print Print Scroll Lock Num Lock Up Up Down Down Left Left Right Right F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F11 F11 F12 F12 F13 F13 F14 F14 F15 F15 Caps Lock Index has %n item(s) This is Launchy version %1 The hotkey %1 is already in use, please select another. Plugin options プラグイン・オプション Index has %n items Index has items 項目をインデックス済みです This is Launchy version Launchy のバージョン: Launchy Launchy The hotkey you have chosen is already in use, please select another. 選択されたホットキーは既に使われています。他のキーを選択して下さい。 Select a directory ディレクトリを選択してください OptionsDlg Alt Alt Win Win Shift Shift Control Control Space Space Tab Tab Backspace Backspace Enter Enter Esc Esc Home Home End End Pause Pause Print Print Up Up Down Down Left Left Right Right F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F11 F11 F12 F12 F13 F13 Index has items 項目をインデックス済みです This is Launchy version Launchy のバージョン: Launchy Launchy The hotkey you have chosen is already in use, please select another. 選択されたホットキーは既に使われています。他のキーを選択して下さい。 Select a directory ディレクトリを選択してください Launchy options Launchy オプション General 全般 User Interface ユーザ・インタフェース Always display Launchy window Launchy ウィンドウを常に表示する Hide Launchy when it loses focus フォーカスを失った時にLaunchyを隠す Always on top 常に最前面に表示 Show tray icon Suggestion List Condense suggestion list 代替候補リストをコンパクトに表示する Always center Launchy 常に真ん中に表示する Hotkey: ホット・キー GUI GUI Opaqueness 透明度 Fade in time フェードイン時間 Fade out time フェードアウト時間 Simultaneously visible alternate suggestions 一度に表示する代替候補の数 Max. number of alternate suggestions 代替候補の数 Simultaneously visible suggestions Maximum number of suggestions Visual Effects System Options システム・オプション Check for updates on startup 起動時に新バージョンをチェックする Show hidden files in browse mode ブラウズ・モードで隠しファイルも表示する Portable mode (USB stick) ポータブル・モード(USBメモリ) Use testing indexer? テスト中のインデクサを使用する Minutes between catalog updates カタログの更新間隔(分) (0 for manual updates only) (0を指定で手動更新のみ) Internet Proxy Hostname Port Skins スキン Select a skin スキンを選んで下さい Author information 作者の情報 Skin preview プレビュー Catalog カタログ File Types ファイルの種類 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your </span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and Developer: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Developer: Simon Capewell</span></p></body></html> + + - - Include executables 実行可能ファイルも含む Include directories ディレクトリも含む Depth: 階層指定: Directories ディレクトリ Underline matched text horizontally vertically Only allow dragging whilst Shift is pressed &Hotkey: ms Auto open delay Maximum number of history items Name and path Path only Name only Suggestions display Auto update catalog every minutes Show network in browse mode Allow wildcards in browse mode Check for new versions of Launchy on startup Rescan Catalog カタログを再スキャン Indexing 0 items 0 項目をインデックス化しています Plugins プラグイン Available plugins 利用可能なプラグイン Plugin options プラグイン・オプション About Launchy Launchy について <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Please help this poor grad student to put ramen on the table. I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Please help this poor grad student to put ramen on the table. I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy の公式ホームページ <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> SettingsManager Launchy Launchy Could not convert to portable mode. Please check you have write access to the %1 directory. launchy-2.5/translations/launchy_es.ts0000644000175000017500000011554111355674521017312 0ustar monesmones A new version of Launchy is available Hay una nueva versión de Launchy disponible Rebuild Catalog Reconstruir catálogo Options Opciones Exit Salir LaunchyWidget Launchy Options Opciones de Launchy Close Launchy Cerrar Launchy The hotkey %1 is already in use, please select another. Launchy (press %1 to activate) A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Show Launchy Rebuild catalog Reload skin Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. Esa combinación de teclas ya se está utilizando. Por favor, escoje otra en las preferencias de Launchy. A new version of Launchy is available Hay una nueva versión de Launchy disponible A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Hay una nueva versión de Launchy disponible. Puedes obtenerla en <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Rebuild Catalog Reconstruir catálogo Options Opciones Exit Salir MyWidget Launchy Options Opciones de Launchy Close Launchy Cerrar Launchy Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. Esa combinación de teclas ya se está utilizando. Por favor, escoje otra en las preferencias de Launchy. A new version of Launchy is available Hay una nueva versión de Launchy disponible A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Hay una nueva versión de Launchy disponible. Puedes obtenerla en <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Rebuild Catalog Reconstruir catálogo Options Opciones Exit Salir OptionsDialog Alt Alt Win Win Shift Mayús Control Control Command Command+Alt Command+Shift Command+Control Ctrl+Alt Ctrl+Shift Ctrl+Win Space Espacio Tab Tab Backspace Retroceso Enter Intro Esc Esc Home Inicio End Fin Insert Delete Page Up Page Down Pause Pausa Print Imprimir Scroll Lock Num Lock Up Arriba Down Abajo Left Izquierda Right Derecha F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F11 F11 F12 F12 F13 F13 F14 F14 F15 F15 Caps Lock Index has %n item(s) This is Launchy version %1 The hotkey %1 is already in use, please select another. Plugin options Opciones del complemento Index has %n items Index has El índice contiene items elementos This is Launchy version Esta versión de la Launchy es la Launchy Launchy The hotkey you have chosen is already in use, please select another. Esa combinación de teclas ya se está utilizando. Por favor, escoje otra. Select a directory Escoje un direcotorio OptionsDlg Alt Alt Win Win Shift Mayús Control Control Space Espacio Tab Tab Backspace Retroceso Enter Intro Esc Esc Home Inicio End Fin Pause Pausa Print Imprimir Up Arriba Down Abajo Left Izquierda Right Derecha F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F11 F11 F12 F12 F13 F13 Index has El índice contiene items elementos This is Launchy version Esta versión de la Launchy es la Launchy Launchy The hotkey you have chosen is already in use, please select another. Esa combinación de teclas ya se está utilizando. Por favor, escoje otra. Select a directory Escoje un direcotorio Launchy options Opciones de Launchy General General User Interface Interfaz de usuario Always display Launchy window Mostrar siempre la ventana de Launchy Hide Launchy when it loses focus Ocultar Launchy cuando pierda el foco Always on top Siempre visible Show tray icon Suggestion List Condense suggestion list Compactar la lista de sugerencias Always center Launchy Centrar Launchy siempre Hotkey: Combinación de teclas: GUI Aspecto Opaqueness Opacidad Fade in time Duración del fundido de entrada Fade out time Duración del fundido de salida Simultaneously visible alternate suggestions Sugerencias alternativas visibles simultáneamente Max. number of alternate suggestions Número máximo de sugerencias alternativas Simultaneously visible suggestions Maximum number of suggestions Visual Effects System Options Opciones del sistema Check for updates on startup Buscar actualizaciones al comenzar Show hidden files in browse mode Mostrar archivos ocultos en el modo de exploración Portable mode (USB stick) Modo portátil (lápiz USB) Use testing indexer? ¿Utilizar la versión de prueba del indexador? Minutes between catalog updates Minutos entre actualizaciones del catálogo (0 for manual updates only) (0 para actualizaciones manuales) Internet Proxy Hostname Port Skins Temas Select a skin Escoja un tema Author information Datos del autor Skin preview Vista previa del tema Catalog Catálogo File Types Tipos de archivo <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your </span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and Developer: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Developer: Simon Capewell</span></p></body></html> + + - - Include executables Incluir ejecutables Include directories Incluir directorios Depth: Profundidad: Directories Directorios Underline matched text horizontally vertically Only allow dragging whilst Shift is pressed &Hotkey: ms Auto open delay Maximum number of history items Name and path Path only Name only Suggestions display Auto update catalog every minutes Show network in browse mode Allow wildcards in browse mode Check for new versions of Launchy on startup Rescan Catalog Reconstruir catálogo Indexing 0 items Indexando 0 elementos Plugins Complementos Available plugins Complementos disponibles Plugin options Opciones del complemento About Launchy Acerca de Launchy <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Please help this poor grad student to put ramen on the table. I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Por favor, ayuda a poner un plato de ramen en la mesa de este pobre estudiante de doctorado. Disfruto muchísimo desarrollando Launchy y espero que tú disfrutes utilizándolo. Aunque es gratis, si te resulta útil agredecería tu <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">donación.</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">La página oficial de Launchy se encuentra en <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> SettingsManager Launchy Launchy Could not convert to portable mode. Please check you have write access to the %1 directory. launchy-2.5/translations/launchy_nl.ts0000644000175000017500000006445211355674521017320 0ustar monesmones LaunchyWidget Launchy Options Close Launchy The hotkey %1 is already in use, please select another. Launchy (press %1 to activate) Show Launchy Rebuild catalog Launchy A new version of Launchy is available A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Reload skin Options Exit OptionsDialog Alt Win Shift Control Command Command+Alt Command+Shift Command+Control Ctrl+Alt Ctrl+Shift Ctrl+Win Space Tab Backspace Enter Esc Home End Insert Delete Page Up Page Down Pause Print Scroll Lock Num Lock Up Down Left Right F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 Caps Lock Index has %n item(s) This is Launchy version %1 The hotkey %1 is already in use, please select another. Plugin options Index has %n items Launchy Select a directory OptionsDlg Launchy options General User Interface Always display Launchy window Hide Launchy when it loses focus Always on top Suggestion List Opaqueness Fade in time Fade out time Show tray icon Simultaneously visible suggestions Maximum number of suggestions Visual Effects System Options Show hidden files in browse mode Portable mode (USB stick) Internet Proxy Hostname Port Skins Select a skin Author information Skin preview Catalog File Types <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your </span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and Developer: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Developer: Simon Capewell</span></p></body></html> + - Include executables Include directories Depth: Directories Underline matched text Always center Launchy horizontally vertically Only allow dragging whilst Shift is pressed &Hotkey: ms Auto open delay Maximum number of history items Name and path Path only Name only Suggestions display Auto update catalog every minutes Show network in browse mode Allow wildcards in browse mode Check for new versions of Launchy on startup Rescan Catalog Indexing 0 items Plugins Available plugins Plugin options About Launchy <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> SettingsManager Launchy Could not convert to portable mode. Please check you have write access to the %1 directory. launchy-2.5/translations/launchy_zh.ts0000644000175000017500000010474211355674521017325 0ustar monesmones A new version of Launchy is available Launchy 有新版本了! Rebuild Catalog 重新建立索引 Options 选项 Exit 退出 LaunchyWidget Launchy Options Launchy 选项 Close Launchy 关闭 Launchy The hotkey %1 is already in use, please select another. Launchy (press %1 to activate) A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Show Launchy Rebuild catalog Reload skin Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. 你选择的快捷键已经被占用, 请选择其他的快捷键. A new version of Launchy is available Launchy 有新版本了! A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Launchy 有新版本了! 请到这里下载: <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Rebuild Catalog 重新建立索引 Options 选项 Exit 退出 MyWidget Launchy Options Launchy 选项 Close Launchy 关闭 Launchy Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. 你选择的快捷键已经被占用, 请选择其他的快捷键. A new version of Launchy is available Launchy 有新版本了! A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Launchy 有新版本了! 请到这里下载: <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Rebuild Catalog 重新建立索引 Options 选项 Exit 退出 OptionsDialog Alt Win Shift Control Command Command+Alt Command+Shift Command+Control Ctrl+Alt Ctrl+Shift Ctrl+Win Space Tab Backspace Enter Esc Home End Insert Delete Page Up Page Down Pause Print Scroll Lock Num Lock Up Down Left Right F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 Caps Lock Index has %n item(s) This is Launchy version %1 The hotkey %1 is already in use, please select another. Plugin options 插件选项 Index has %n items Index has 索引有 Launchy Launchy The hotkey you have chosen is already in use, please select another. 你选择的快捷键已经被占用, 请选择其他的快捷键. Select a directory 选择一个目录 OptionsDlg Index has 索引有 The hotkey you have chosen is already in use, please select another. 你选择的快捷键已经被占用, 请选择其他的快捷键. Select a directory 选择一个目录 Launchy options Launchy 选项 General 常规 User Interface 显示 Always display Launchy window 总是显示Launchy的窗口 Hide Launchy when it loses focus 当失去焦点时,隐藏Launchy Always on top 总在最前面 Show tray icon Suggestion List Always center Launchy 总是居中显示 Hotkey: 热键: GUI 界面 Opaqueness 透明度 Fade in time 淡入时间 Fade out time 淡出时间 Simultaneously visible alternate suggestions 一次显示建议列表的数目 Max. number of alternate suggestions 最多显示建议列表的数目 Simultaneously visible suggestions Maximum number of suggestions Visual Effects System Options 系统选项 Check for updates on startup 启动的时候检测是否有新版本 Show hidden files in browse mode 显示隐藏的文件 Portable mode (USB stick) 移动模式(貌似可放到U盘中方便使用) Use testing indexer? 使用测试版的索引? Minutes between catalog updates 建立索引间隔的时间(分钟) (0 for manual updates only) (0为手工建立索引) Internet Proxy Hostname Port Skins 皮肤 Select a skin 选择皮肤 Author information 作者信息 Skin preview 预览皮肤 Catalog 目录 File Types 文件类型 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your </span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and Developer: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Developer: Simon Capewell</span></p></body></html> + - Include executables 包含可执行文件 Include directories 包含目录 Depth: 深度: Directories 目录 Underline matched text horizontally vertically Only allow dragging whilst Shift is pressed &Hotkey: ms Auto open delay Maximum number of history items Name and path Path only Name only Suggestions display Auto update catalog every minutes Show network in browse mode Allow wildcards in browse mode Check for new versions of Launchy on startup Rescan Catalog 扫描目录 Indexing 0 items 已找到 0 项 Plugins 插件 Available plugins 有效的插件 Plugin options 插件选项 About Launchy 关于 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Please help this poor grad student to put ramen on the table. I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Verdana'; font-size:11pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">原作者语:我很高兴开发Launchy,希望你能喜欢它。你可以免费使用,如果你觉得Launchy不错,我期待你的 <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">赞助.</span></a></p>拼音处理方案采用李先静的 <a href="http://sourceforge.net/projects/pinyin-kit/"><span style=" text-decoration: underline; color:#0000ff;">pinyin-kit</span></a> 谢谢</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p><br/><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;">Launchy中文修改版 欢迎来我的blog讨论 <a href="http://bborn.cn/blog"><span style=" text-decoration: underline; color:#0000ff;">http://bborn.cn/blog/</span></a></p></body></html> SettingsManager Launchy Launchy Could not convert to portable mode. Please check you have write access to the %1 directory. launchy-2.5/translations/launchy_zh_TW.ts0000644000175000017500000010760511355674521017740 0ustar monesmones A new version of Launchy is available Launchy 有新版本 Rebuild Catalog 重新建立索引 Options 選項 Exit 離開 LaunchyWidget Launchy Options Launchy 選項 Close Launchy 關閉 Launchy The hotkey %1 is already in use, please select another. 快速鍵 %1 已經被使用,請選擇另一個。 Launchy (press %1 to activate) Launchy (按 %1 啟動) A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Launchy 有新版本。 你可以到這裡下載 <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Show Launchy 顯示 Launchy Rebuild catalog 重新建立索引 Reload skin 重新載入面板 Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. 你選擇的快捷鍵已經被占用, 請選擇其他的快捷鍵. A new version of Launchy is available Launchy 有新版本 A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Launchy 有新版本了! 請到這裏下載: <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Rebuild Catalog 重新建立索引 Options 選項 Exit 離開 MyWidget Launchy Options Launchy 選項 Close Launchy 關閉 Launchy Launchy Launchy The hotkey you have chosen is already in use. Please select another from Launchy's preferences. 你選擇的快捷鍵已經被占用, 請選擇其他的快捷鍵. A new version of Launchy is available Launchy 有新版本了! A new version of Launchy is available. You can download it at <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Launchy 有新版本了! 請到這裏下載: <qt><a href="http://www.launchy.net/">http://www.launchy.net</a></qt> Rebuild Catalog 重新建立索引 Options 選項 Exit 退出 OptionsDialog Alt Alt Win Win Shift Shift Control Control Command Command Command+Alt Command+Alt Command+Shift Command+Shift Command+Control Command+Control Ctrl+Alt Ctrl+Alt Ctrl+Shift Ctrl+Shift Ctrl+Win Ctrl+Win Space 空白鍵 Tab Tab Backspace Backspace Enter Enter Esc Esc Home Home End End Insert Delete Page Up Page Down Pause Pause Print Print Scroll Lock Num Lock Up Down Left Right F1 F1 F2 F2 F3 F3 F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 F9 F9 F10 F10 F11 F11 F12 F12 F13 F13 F14 F14 F15 F15 Caps Lock Caps Lock Index has %n item(s) 索引了 %n 個項目 This is Launchy version %1 Launchy version %1 The hotkey %1 is already in use, please select another. 快速鍵 %1 已經被使用,請選擇另一個。 Plugin options 外掛程式選項 Index has %n items 索引了 %n 個項目 Index has 索引有 Launchy Launchy The hotkey you have chosen is already in use, please select another. 你選擇的快捷鍵已經被占用, 請選擇其他的快捷鍵. Select a directory 選擇一個目錄 OptionsDlg Index has 索引有 The hotkey you have chosen is already in use, please select another. 你選擇的快捷鍵已經被占用, 請選擇其他的快捷鍵. Select a directory 選擇一個目錄 Launchy options Launchy 選項 General 一般 User Interface 使用者介面 Always display Launchy window 總是顯示 Launchy 視窗 Hide Launchy when it loses focus 當失去焦點時隱藏 Launchy Always on top 最上層顯示 Show tray icon 顯示系統列圖示 Suggestion List 建議清單 Always center Launchy 總是置中顯示 Hotkey: 熱鍵: GUI 界面 Opaqueness 透明度 Fade in time 淡入時間 Fade out time 淡出時間 Simultaneously visible alternate suggestions 一次顯示建議列表的數目 Max. number of alternate suggestions 最多顯示建議列表的數目 Simultaneously visible suggestions 建議清單顯示個數 Maximum number of suggestions 建議清單最大個數 Visual Effects 視覺效果 System Options 系統選項 Check for updates on startup 啟動的時候檢測是否有新版本 Show hidden files in browse mode 在瀏覽模式下顯示隱藏的文件 Portable mode (USB stick) 可攜模式 (可以放到 USB 隨身碟) Use testing indexer? 使用測試版的索引? Minutes between catalog updates 建立索引間隔的時間(分鍾) (0 for manual updates only) (0為手工建立索引) Internet Proxy 網路代理伺服器 Hostname Hostname Port Port Skins 面板 Select a skin 選擇面板 Author information 作者資訊 Skin preview 預覽面板 Catalog 目錄 File Types 檔案類型 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your </span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">我很喜歡開發 Launchy,希望你也會喜歡它。它是免費的,但如果你認為 Launchy 值得,我會感謝你的</span><a href="http://www.launchy.net/#donate"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">捐款</span></a>。</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Creator and Developer: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Developer: Simon Capewell</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Credits</span></p> <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">原作者及開發者: Josh Karlin</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">開發者: Simon Capewell</span></p></body></html> + + - - Include executables 包含可執行檔 Include directories 包含目錄 Depth: 深度: Directories 目錄 Underline matched text 在符合的文字加底線 horizontally 水平 vertically 垂直 Only allow dragging whilst Shift is pressed 只有按住 Shift 時可以拖動 &Hotkey: 快速鍵 (&H): ms ms Auto open delay 自動開啟延遲 Maximum number of history items 歷史項目最大個數 Name and path 名稱及路徑 Path only 只有路徑 Name only 只有名稱 Suggestions display 建議清單顯示 Auto update catalog every 自動更新索引每 minutes 分鐘 Show network in browse mode 在瀏覽模式顯示網路 Allow wildcards in browse mode Check for new versions of Launchy on startup 啟動時檢查新版本 Rescan Catalog 重新建立索引 Indexing 0 items 找到 0 個項目 Plugins 外掛程式 Available plugins 可用的外掛程式 Plugin options 外掛程式選項 About Launchy 關於 Launchy <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Please help this poor grad student to put ramen on the table. I greatly enjoy developing Launchy, and I hope that you enjoy using it. It's free to use, but if you think Launchy is a worthwhile application, I would appreciate your <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">donation.</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Verdana'; font-size:11pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">原作者語:我很高興開發Launchy,希望你能喜歡它。你可以免費使用,如果你覺得Launchy不錯,我期待你的 <a href="http://www.launchy.net/#donate"><span style=" text-decoration: underline; color:#0000ff;">贊助.</span></a></p>拼音處理方案采用李先靜的 <a href="http://sourceforge.net/projects/pinyin-kit/"><span style=" text-decoration: underline; color:#0000ff;">pinyin-kit</span></a> 謝謝</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy's official homepage is <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;">Launchy 的官方網站 <a href="http://www.launchy.net/"><span style=" text-decoration: underline; color:#0000ff;">http://www.launchy.net/</span></a></p><p>翻譯: rexx@ptt</p></body></html> SettingsManager Launchy Launchy Could not convert to portable mode. Please check you have write access to the %1 directory. launchy-2.5/LICENSE.txt0000644000175000017500000004327010665710602013703 0ustar monesmonesCopyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. One line to give the program's name and a brief idea of what it does. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.launchy-2.5/mac/0000755000175000017500000000000011355776633012627 5ustar monesmoneslaunchy-2.5/mac/support/0000755000175000017500000000000011355776633014343 5ustar monesmoneslaunchy-2.5/mac/support/template.applescript0000644000175000017500000000617311345042370020414 0ustar monesmoneson run -- for testing in script editor process_disk_image("Adium X 1.0b20", "/Users/evands/adium-1.0/Release/Artwork") end run on process_disk_image(volumeName) tell application "Finder" tell disk (volumeName as string) open set theXOrigin to WINX set theYOrigin to WINY set theWidth to WINW set theHeight to WINH set theBottomRightX to (theXOrigin + theWidth) set theBottomRightY to (theYOrigin + theHeight) set dsStore to "\"" & "/Volumes/" & volumeName & "/" & ".DS_STORE\"" -- do shell script "rm " & dsStore tell container window set current view to icon view set toolbar visible to false set statusbar visible to false set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} set statusbar visible to false end tell set opts to the icon view options of container window tell opts set icon size to ICON_SIZE set arrangement to not arranged end tell -- set background picture of opts to file ".background:background.png" BACKGROUND_CLAUSE -- Positioning POSITION_CLAUSE -- set position of item "Adium.app" to {196, 273} -- Custom icons -- my copyIconOfTo(artPath & "/ApplicationsIcon", "/Volumes/" & volumeName & "/Applications") -- Label colors -- set label index of item "Adium.app" to 6 -- set label index of item "License.txt" to 7 -- set label index of item "Changes.txt" to 7 -- set label index of item "Applications" to 4 update without registering applications -- Force saving of the size delay 1 tell container window set statusbar visible to false set the bounds to {theXOrigin, theYOrigin, theBottomRightX - 10, theBottomRightY - 10} end tell update without registering applications end tell delay 1 tell disk (volumeName as string) tell container window set statusbar visible to false set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} end tell update without registering applications end tell --give the finder some time to write the .DS_Store file delay 3 set waitTime to 0 set ejectMe to false repeat while ejectMe is false delay 1 set waitTime to waitTime + 1 if (do shell script "[ -f " & dsStore & " ]; echo $?") = "0" then set ejectMe to true end repeat log "waited " & waitTime & " seconds for .DS_STORE to be created." end tell end process_disk_image on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) tell application "Finder" to set f to POSIX file aFileOrFolderWithIcon as alias -- grab the file's icon my CopyOrPaste(f, "c") -- now the icon is in the clipboard tell application "Finder" to set c to POSIX file aFileOrFolder as alias my CopyOrPaste(result, "v") end copyIconOfTo on CopyOrPaste(i, cv) tell application "Finder" activate open information window of i end tell tell application "System Events" to tell process "Finder" to tell window 1 keystroke tab -- select icon button keystroke (cv & "w") using command down (* (copy or paste) + close window *) end tell -- window 1 then process Finder then System Events end CopyOrPastelaunchy-2.5/mac/support/AdiumApplescriptRunner0000755000175000017500000004426411345042370020722 0ustar monesmones 8__PAGEZERO__TEXT __text__TEXT l l__picsymbol_stub__TEXT+XX$__symbol_stub__TEXT+XX__picsymbolstub1__TEXT+X`X __cstring__TEXT,(__symbol_stub1__TEXT/  __DATA0 __data__DATA0 __la_symbol_ptr__DATA0 4  __nl_symbol_ptr__DATA0T T__dyld__DATA0d d__bss__DATA0 __common__DATA08__OBJC@0__cat_cls_meth__OBJC@0__cat_inst_meth__OBJC@0__string_object__OBJC@0__cstring_object__OBJC@0__message_refs__OBJC@`0__sel_fixup__OBJC@`0`__cls_refs__OBJC@`0`__class__OBJC@t0t__meta_class__OBJC@t0t__cls_meth__OBJC@t0t__inst_meth__OBJC@t0t__protocol__OBJC@t0t__category__OBJC@t0t__class_vars__OBJC@t0t__instance_vars__OBJC@t0t__module_info__OBJC@t0t__symbols__OBJC@08__LINKEDITP@ /usr/lib/dyld `B89,/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation XB8$-/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 4B8EG/usr/lib/libSystem.B.dylib@:C P #CCB( l|: x8!T!48!z8;cW{:|H |!B||x|#x|+xH<_L<_P<_T<_B/A }N!<_B/A }N!H <_` /A }N!H<_\ /A }N!<8c 8@Hea@/AH 8<_B=}"Kx/Ad9@9` |t/A0|X|t//@}K9k}"Kx| X|t/@/A 8 H<_Xx/A/@xxx8HH 1|!B<8c 8@Hy@}N!h8!`|N =`k0d,AN 8N8`-8`8D8`;8D= 0d| =aN =`k0h}iN |!|> x~x|8`8(H |`x@^@x^@|^@8(@8`-H E}8`-@H !|N |B}=|9}N |B}=|9}N |B}=|9}N |!|> x~x|8H8`-H~@8@D^D/@Hx^DBBx@L^DBB|@4^DH>D^H ^H/(AHՀ^DB8DK|8`-@HՀH/A4^H /A^H ~H| x}N!~HHY!|N |B}=|98}N |B}=|9X}N |B}=|9}N |B}=|98}N |!|> xBH<_B @@/A^@T>+@H<_b H%<_b H!|N |B}=|9}N |B}=|9}N |B}=|9}N |!`|> x~= 9)@`<@8B@iH |`x<@8B@|xH m|`x@8T8X8`= 9)@d<@8B@iH 1|`xD<@8B@ ~DH |`x\<@8B@~\H|`xh<@8B@~\8H|`x= 9)@h<@8B@i|xH~dh+@l<@8B@~\8H~Th+@D8p^h8B|x8|ExH<@8B@~\ptHE|`x`= 9)@l<@8B@iH!|`x<@8B@ |xd8H~HH/AT/AP<@8B@$~DH|`xx= 9)@p<@8B@(8xi x|bx\`\ `$ |Cx!N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|l}N |B}h=k|P}N |B}h=k|4}N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|}N |B}h=k|}N __dyld_mod_term_funcs__dyld_make_delayed_module_initializer_callsThe kernel support for the dynamic linker is not present to run this program. %s/Users/evands/adium-0.8/Source/ApplescriptRunner.mNSAutoreleasePoolNSProcessInfoNSURLNSAppleScriptNSAppleEventDescriptorallocinitprocessInfoargumentscountobjectAtIndex:fileURLWithPath:subarrayWithRange:initWithContentsOfURL:error:processIdentifierdescriptorWithDescriptorType:bytes:length:appleEventWithEventClass:eventID:targetDescriptor:returnID:transactionID:descriptorWithString:setParamDescriptor:forKeyword:initListDescriptorobjectEnumeratornextObjectnumberOfItemsinsertDescriptor:atIndex:releaseexecuteAppleEvent:error:stringValueexecuteAndReturnError:UTF8String=`0L}N =`0P}N ,%X#"""""""""""""""----... .4.H.h.|../ /,/@/T/`/p/////------X000!",7 0d\-j 0h""t ""#+0 0%X:0 F 0Sg 0~ 0 0 0 0 0  0& 0@ 0a 0 0 00&8 0 l!!5!X!w!"0V~u_` 8'ni00P52(,+-61/.39852(,+-61/.3984*7)_NXArgc_NXArgv___darwin_gcc3_preregister_frame_info___progname__cplus_init__mh_execute_header_catch_exception_raise_catch_exception_raise_state_catch_exception_raise_state_identity_clock_alarm_reply_do_mach_notify_dead_name_do_mach_notify_no_senders_do_mach_notify_port_deleted_do_mach_notify_send_once_do_seqnos_mach_notify_dead_name_do_seqnos_mach_notify_no_senders_do_seqnos_mach_notify_port_deleted_do_seqnos_mach_notify_send_once_environ_main_receive_samplesstart.objc_class_name_NSAppleEventDescriptor.objc_class_name_NSAppleScript.objc_class_name_NSAutoreleasePool.objc_class_name_NSProcessInfo.objc_class_name_NSURL___keymgr_dwarf2_register_sections___keymgr_global__cthread_init_routine__dyld_register_func_for_add_image__dyld_register_func_for_remove_image__init_keymgr__keymgr_get_and_lock_processwide_ptr__keymgr_set_and_unlock_processwide_ptr__objcInit_abort_atexit_calloc_errno_exit_free_mach_init_routine_objc_msgSend_printf_pointer_to_objcInit_pointer_to__darwin_gcc3_preregister_frame_info__call_mod_init_funcsdyld_lazy_symbol_binding_entry_pointerror_messagedyld_func_lookup_pointer__dyld_func_lookup__dyld_init_check__startdyld_stub_binding_helper_darwin_unwind_dyld_add_image_hook_darwin_unwind_dyld_remove_image_hook_NSMakeRangelaunchy-2.5/mac/mkdmg0000755000175000017500000000033611345046271013641 0ustar monesmones#!/bin/bash rm -rf files rm *.dmg mkdir files cp -r ../release/Launchy.app files/ cp ../Readme.pdf files/ ln -s /Applications files/Applications ./create-dmg --window-size 500 300 --volname "Launchy" Launchy$1.dmg files/ launchy-2.5/mac/create-dmg0000755000175000017500000001201311345042370014541 0ustar monesmones#! /bin/bash # Create a read-only disk image of the contents of a folder # # Usage: make-diskimage # # # # # set -e; function pure_version() { echo '1.0.0.2' } function version() { echo "create-dmg $(pure_version)" } function usage() { version echo "Creates a fancy DMG file." echo "Usage: $(basename $0) options... image.dmg source_folder" echo "All contents of source_folder will be copied into the disk image." echo "Options:" echo " --volname name" echo " set volume name (displayed in the Finder sidebar and window title)" echo " --background pic.png" echo " set folder background image (provide png, gif, jpg)" echo " --window-pos x y" echo " set position the folder window" echo " --window-size width height" echo " set size of the folder window" echo " --icon-size icon_size" echo " set window icons size (up to 128)" echo " --icon file_name x y" echo " set position of the file's icon" echo " --custom-icon file_name custom_icon_or_sample_file x y" echo " set position and custom icon" echo " --version show tool version number" echo " -h, --help display this help" exit 0 } WINX=10 WINY=60 WINW=600 WINH=400 ICON_SIZE=128 while test "${1:0:1}" = "-"; do case $1 in --volname) VOLUME_NAME="$2" shift; shift;; --background) BACKGROUND_FILE="$2" BACKGROUND_FILE_NAME="$(basename $BACKGROUND_FILE)" BACKGROUND_CLAUSE="set background picture of opts to file \".background:$BACKGROUND_FILE_NAME\"" shift; shift;; --icon-size) ICON_SIZE="$2" shift; shift;; --window-pos) WINX=$2; WINY=$3 shift; shift; shift;; --window-size) WINW=$2; WINH=$3 shift; shift; shift;; --icon) POSITION_CLAUSE="${POSITION_CLAUSE}set position of item \"$2\" to {$3, $4} " shift; shift; shift; shift;; --custom-icon) shift; shift; shift; shift; shift;; -h | --help) usage;; --version) version; exit 0;; --pure-version) pure_version; exit 0;; -*) echo "Unknown option $1. Run with --help for help." exit 1;; esac done test -z "$2" && { echo "Not enough arguments. Invoke with --help for help." exit 1 } DMG_PATH="$1" DMG_DIRNAME="$(dirname "$DMG_PATH")" DMG_DIR="$(cd $DMG_DIRNAME > /dev/null; pwd)" DMG_NAME="$(basename "$DMG_PATH")" DMG_TEMP_NAME="$DMG_DIR/rw.${DMG_NAME}" SRC_FOLDER="$(cd "$2" > /dev/null; pwd)" test -z "$VOLUME_NAME" && VOLUME_NAME="$(basename "$DMG_PATH" .dmg)" AUX_PATH="$(cd "$(dirname $0)"; pwd)/support" test -d "$AUX_PATH" || { echo "Cannot find support directory: $AUX_PATH" exit 1 } # Create the image echo "Creating disk image..." test -f "${DMG_TEMP_NAME}" && rm -f "${DMG_TEMP_NAME}" hdiutil create -srcfolder "$SRC_FOLDER" -volname "${VOLUME_NAME}" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size 300m "${DMG_TEMP_NAME}" # mount it echo "Mounting disk image..." MOUNT_DIR="/Volumes/${VOLUME_NAME}" echo "Mount directory: $MOUNT_DIR" DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_TEMP_NAME}" | egrep '^/dev/' | sed 1q | awk '{print $1}') echo "Device name: $DEV_NAME" #cp RightDS_Store "/Volumes/${VOLUME_NAME}/.DS_Store" if ! test -z "$BACKGROUND_FILE"; then echo "Copying background file..." test -d "$MOUNT_DIR/.background" || mkdir "$MOUNT_DIR/.background" cp "$BACKGROUND_FILE" "$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME" fi # run applescript APPLESCRIPT=$(mktemp -t createdmg) cat "$AUX_PATH/template.applescript" | sed -e "s/WINX/$WINX/g" -e "s/WINY/$WINY/g" -e "s/WINW/$WINW/g" -e "s/WINH/$WINH/g" -e "s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g" -e "s/ICON_SIZE/$ICON_SIZE/g" | perl -pe "s/POSITION_CLAUSE/$POSITION_CLAUSE/g" >"$APPLESCRIPT" echo "Running Applescript: ./AdiumApplescriptRunner \"${APPLESCRIPT}\" process_disk_image \"${VOLUME_NAME}\"" "$AUX_PATH/AdiumApplescriptRunner" "${APPLESCRIPT}" process_disk_image "${VOLUME_NAME}" || true echo "Done running the applescript..." sleep 4 # make sure it's not world writeable echo "Fixing permissions..." chmod -Rf go-w "${MOUNT_DIR}" || true echo "Done fixing permissions." # make the top window open itself on mount: if [ -x /usr/local/bin/openUp ]; then echo "Applying openUp..." /usr/local/bin/openUp "${MOUNT_DIR}" fi # unmount echo "Unmounting disk image..." hdiutil detach "${DEV_NAME}" # compress image echo "Compressing disk image..." hdiutil convert "${DMG_TEMP_NAME}" -format UDZO -imagekey zlib-level=9 -o "${DMG_DIR}/${DMG_NAME}" rm -f "${DMG_TEMP_NAME}" # adding EULA resources if [ ! -z "${EULA_RSRC}" -a "${EULA_RSRC}" != "-null-" ]; then echo "adding EULA resources" hdiutil unflatten "${DMG_DIR}/${DMG_NAME}" /Developer/Tools/ResMerger -a "${EULA_RSRC}" -o "${DMG_DIR}/${DMG_NAME}" hdiutil flatten "${DMG_DIR}/${DMG_NAME}" fi echo "Disk image done" exit 0 launchy-2.5/mac/deploy0000644000175000017500000000057011345046271014033 0ustar monesmones#!/bin/bash cp Info.plist ../release/Launchy.app/Contents macdeployqt ../release/Launchy.app cd ../release/Launchy.app/Contents/MacOS/plugins for bin in *.dylib do for lib in QtGui QtCore QtNetwork do install_name_tool -change $lib.framework/Versions/4/$lib @executable_path/../Frameworks/$lib.framework/Versions/4/$lib $bin done; done; cd ../../../../../mac launchy-2.5/mac/Info.plist0000644000175000017500000000113511336350663014565 0ustar monesmones CFBundleIconFile launchy_icon_mac.icns CFBundlePackageType APPL CFBundleGetInfoString Created by Qt/QMake CFBundleSignature ???? CFBundleExecutable Launchy CFBundleIdentifier Code Jelly's Launchy NOTE launchy-2.5/debug/0000755000175000017500000000000011355776633013155 5ustar monesmoneslaunchy-2.5/debug/skins/0000755000175000017500000000000011355776633014304 5ustar monesmoneslaunchy-2.5/debug/skins/Mercury/0000755000175000017500000000000011355776633015732 5ustar monesmoneslaunchy-2.5/debug/skins/Mercury/background.png0000644000175000017500000000110711033270225020531 0ustar monesmonesPNG  IHDRdp}sRGBbKGD pHYs  d_tIME: XIDATxA 0Eџ&g;pHФ./Z2"X: :: : : :: ?{Zyv3ȕ^Zw_Sia+3}9zN rBAttAA:X .  zݩ. . /w@BA@-tt ,tt BABAtӹr ]@]6AL_JF($,n @Att@At@AAt@@Att@At@AAP~9TIENDB`launchy-2.5/debug/skins/Mercury/author.txt0000644000175000017500000000014410715736504017764 0ustar monesmonesSkin Title: Mercury Author: Josh Karlin and Juan Ignacio Serra Version: 1.0 Date: 6/21/2007launchy-2.5/debug/skins/Mercury/mask.png0000644000175000017500000000107411033270225017350 0ustar monesmonesPNG  IHDRdp}sRGBbKGD pHYs  d_tIME:;ŴIDATxI0 AlpKd;K6AʑZv: : : :: : m2FWmxm(0(֪y8W" _20UMA f0: [a%SA: : : ::Jf : :3 X _]g{ywet@AAt@@Att@At@AAt@@At+O,2WIENDB`launchy-2.5/debug/skins/Mercury/misc.txt0000644000175000017500000000056510715736504017424 0ustar monesmonesboundary = 0,0,500,100 output = 290,37,160,24 input = 60,37,160,24 alternatives = 37,61,436,100 icon = 241,32,32,32 ; These describe the font of the full path in the dropdown box ; This should be in style.qss but the style sheet doesn't support it dropPathColor = 221,221,221 dropPathFamily = Lucida Sans dropPathSize = 8 dropPathWeight = 0 dropPathItalics = 0launchy-2.5/debug/skins/Mercury/down_arrow.png0000644000175000017500000000025710660643004020604 0ustar monesmonesPNG  IHDR#>SsBITUFtEXtSoftwarewww.inkscape.org<CIDATc[8: bp H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FC^IDATx_eYZk}u1, O#!eK@0dDH͌fFR2H22@Qi“`dbssgﵪ]{}Nwk'Mg9{VU}O*nA9000004@on~7|N'_ ׷>0000,>OH9@7mL6f &2GxMj}`````i#dOSoo $B(ϑSn [u#sސmǣ1H~```` &A;eC|lB[~ i^#]Sv[^9R?QC&5cj}򁁁U?*ϛ:6sdndkߑJˢ2O8'w[ېMmj}􁁁gY3dϴῼ99l;@b@~~"2nw<.3p'1Թߐ7ucb````9#A%s&>m}Cu <0*Qr72( |#~~}{y/EOO^???ԧ>ZG#s=nk00ѧݻ}}nYĔy0,"NۺF ܵkTU/I9{9#dUUT{! >E"sEDBEj UmEbf"`9!(>!pNYRJ!e3#KF\0MTi9fpiry""x{ځsNH)9)9Ǡ伃wj?cƮW "H9C$"JČ e׶#ffPJDUEpH4C 94MLL ~ӊBEE$#nj,R U&&*BT0;MT. R\o\lR f±C0朱!xeb3bDt2s* sB׮,7k=,n.mlJnrv1O~G雾?;@5,R-R,*92׸6FƓDDa8 ʚB)ZSB5d)\PDXYm=MU5rUD [+ r4șz\% i")}˕ YD0JXP"f2bXט]/vL*eT{w$ggB7C{k1عՀiƂ {uckk "sfTrꜣ~vuYd#iP-F>!ܞyp8@UQ}[lrYH}9qc&vrFm{vdͿ1Ɠ6ܾ{"u]?<.lx1⢑]k?g `{*"Ko?|惿 ;zB_+ЭNҴQ={睿=f+fh&av26Au@FY$KF>x1vlfzoZ'9spI9At8̕67޲]폈+ sk}gcj&Wx7(C}Pm |CFSwLYAsBu3T,]Gݎ@rO)S LDJޗr9%AĤ"c;u.fF'd01D2#C)CQ&29ΟL f/.=rʪ@6Y0o?udqa]#^T˲4 .= ΋,!ʔ*a;V]cm*5TW(Lt$mؔδ^77;0MSq+J=גmL)GrΡvY༣҉;_#w:fhHUʒhN@9HQ/\SnTUb 36eeH҃j:œHT YR:^̍BX׵A}5J񪽻*={D13ݴ]V㻨,6:"$qHq UsST&VvΌmmݼ'iSeq㞔'G#@ IAR*Lİ)QQ\4s4sڻ< ":!3#(49umcϓ!65<<׻y \vް1"j)05dOģкD j#ڎdޏTy'x:ڕ@L57/@J)E&la׵LUA ɨiW?| !w\/Hj.JPR-WX P-=2yٺL0qXWbZݚ%@!@*%C1oyp:qb:%~7wyN"v ҼG !G7B9IJYc\Mi|Q.  ;DT}XpikURyH\DXO!@μ+J̍+5Voc:7hAs,%cj`f&2c2=1z#z}%S1hQsM[<ߌ>ݏJBD\= 쎆 iא[ݼ}]>8 ӣD0os5os j4{y !̼{ͯگ} ՆԷ*H_u }Fm~闾~s 9*uФnZEy9\%o?{J'̰X6È'h9= +qES-,$$}A1|ʋ7,m IP9Qݽʴ,+QSݨYz٨ّ/GDD;pmo{=cTP(gP'"TDpQB9%d޳5,@֪ Jj1R,ʿ5jm:)WԒ_R*Om_H;\q]ɐ!bO&;wSE!=k&NU,qJ~hcҪBB7{Tޓ(znT==DVJn.ڒums%UI2w*ղϙ)%a hNQw `]OMkrm M>Րй{yMN'hIX>^b@ms>Iޗܘ5ƈ+u] !Ν;m>17)ޠc}|Մa7#'9o*f$نa0%Y ޞ buɰ'); n°fp~:&s^DdQ5Ƹ|__}^%GP#uyBߺD݆/\+7x&D D&&UeYY@Mxq^,1c6XָJNZeUŜSnc&"޼%!m[]Khe]AI-8#j057U?P}z&qLF֧9'8[Ʒ;6͈y_i>l.wJYTTsɒ 'w.r=Irosb\s2-AjB-^^IU+9 cy1ETf,> eFx9[p.XWY̖]%;O\%?@mty$c^ O9dG%0bJͥP81rYs#34De'N"jIqd~]W9wꨮ.9$5tM\LR%j?ɰjxSW4bϴr'R!d1ZlX^bzHUՔJsU ,pr$=!M>CK넌8HV3tﵱ%`ssR]{7y}v|ϹMk/,Wi S{ ny!%(FQs 37bw/u]%[=l%y9g5Ob%x^Ui^G\^^iqqq8Kt#vkjJמlsr?SJbзWn}dƏu xZZvݗ{LM]??Է9-TkRQy{-iْ'můے qKZ[xkZ^)i-cIG1+atϽ1`o70x;ײW'Iq8ƈyɬ.:Y@.v;9[|[u Y TKt,鋫Av+ީ(dDOAq*a:mqO%4-#}2B"T9DR2f v%o$a!P2Z}LEtc KtR_眃Vmw+ePԍ䣍Y-R+AruuU<0TK0z uNHDB4{ֵӓ1Nei edKqq%7gǸ1aOoYBi:uy FV9fhߖfo>i-`Ik|CҚǣ$;MyDDvڮpαyRJ-ڦ=7jDrWάsrvyٜe̷ۖ*׾\Uu#b%3y KzK̖Ҹbz}lݷ,n6nZܠwXyF${cuQRM58- O6sv'X\-{R߈>ˎ[MЭcڃPLuB6Rc_K$լ.8PN B"jaBDLz\Ū!ŤRGo2V!:QACj?(s Ű(y(h3:Ńg T-95BURsigr[]cuT+%C_2h!qΈ3'6'N)3Iql粹|gF͗$IqCd{.oLsʼn{՞{9ZXa};n*S9ub}kF^)~jq4z˳RŊRNPQoM˲`;7ooMq~3RPE~N[VO_}*R .̣U%uc.)=Ku}OV7O\۾/|?;˒DN8ܹsb@'*~G!rz+=CCs?,%Je2˔3eq1^\|s?@چ4L>xX}D3pNC?G7}3ZL6Xjbu]W^d>0000TϽg=[ң+6޽ѽ~Gbow3Rr`PLYvSl}|_ưxӟm Ӫ޽ےn\ܢq[ 0 ~F?g-"r64Ox#?#@_/zunxz_-B \.w.+m(k _Vxp^yoҗ֚}޷?.=]iTrV\ºVc+fBO)}{RlԹyߌ:Z 8eʙ-jЯe˙V%10000ͻ׻eem9oey\2jC⢖q3"~i~v5xo`?{ri\;w-ug.[o{v`````iMeK{ԍjv fƽ{5| sT)'Y(α0;ueb"c.J < _,v:**w0000L(~VB1$gb7md~فUP%B 􁁁gП{#np߮"H@QLk1 B~fعy^zKx7b2v!P2X. 3000004*ij~T(yR`jlB7NWFلKB1E0s!x"(4 c, 7oeYZs'tSܪ,.؝X5w>0000(^x67%kU| = J~ʍ- }X 0000,(tfn4M-~n&=фe@LGL9g.7`vH) 3C?!oKv\SU| fA{̸1,Q60000t&ޚmb$= ּ89FݻmL 9% !PςBRn3\C+/&1Z=^1FL=s>0000L/xCm7N|\&kp=l'BvιnWըa ٟnc*%Rj_RJeהO6a).4P8l]!20000 mIm""h%locOTE" ]65 U4c_?4oo}{sƲ,-ܜR+_["UڝX+ feme ݟ\+vtɟ<'FnJLM7q>w*A$CERJ* $w}w}CЯ1&6'Ї>~B!LSI:u]K# b笃8$V{g\7kA`K?~~w9ӂ{...B?o!3Ǚmz>&a_vrUo{ᅺz 眐sy%R};w|3'>OCd```` oUUPRJ'%kDiNBDBKJ_dK [&Rw>|3O y?3?3C?CX6NIٚe!syDb/u[8+#TC` `Ѵ.fS2D4d7j7[6m7&!y=qqu^7T.{pqqqI1t,Yl TWJ Tmܜ{Ӯ޿  SV_6V!@%K@TU)D *u]9qsysyq=kcnCv 9Ǵ+rCZUw *_I }"""s$#Lz- &)g!fQ_kRtt;Poտ@N )echݜhYe"*:ǤB(*ׇ'Zmbvݿ@SLv\SLRR !dVAQYV}Z[WUhˋQ2Y|@SJPQ!嬵w;OkUev &XW|9*DEgB~6)*m"gusR6pε-2 =^Ru]!"jR˲xԎjy~iZ_ml{5wAVqdϺ͏!}ҙ'3_[Զy;3um!VN[dYe&˿\뺊UWv;va{;/ݲ,ެ 9r@>k;sJ[y9/," }@}=k=R}_>LMrQ92sYɺ^[ҞsΘ9']? lW8ox=beekd6h;'TMASsI 5LSRB=WWWm}35#mϦFr4s ;w*su; KdH)&()=ƒS%ILP(inim-":ldZSG&kr*@HIs3H֞ęIι,+KǶdN!fcŇƨ댱q28vr\ mQUN:C'#s1-gz?ڽۘuԜs#JH9H 2QZVնN)u@K 9j XƈDBNCjPJ]l9P8۳"G#>[3:u,G1b{fx iu]:3ڞ~/FV==ژ9A?}uS-ܽ{-fKzs}v_߿u]Er'Bdu]egǞ`&\\\p#9MӉ62O)fT+H]W1CHsH9)%hYx ;瞳{>ëoY|UsUBBҎ/~ߗSxr'"DDJnj^v3 9'BMiHqk8;*C;(eHC4n0tw&qýcS|J9 W*qcG)%Ta Sz﹨ WD4+r Az\)/0Ÿ*"SD(5FBp\ 'bv!dAMë1;h SVlPtڮ=9Q?>X9dMn*Qm=$Z<7y2f2S#&j_suT2Ыl eYgTaԵ>?jj<uWES>>PՒL "`4L;T]72[J @}cJjJ,kUE@M)ވWwòV"*DDr3: cs)y&ևX3-jLv!d 6UϷ=9׿x ܖd]^^c>g430E̖j{o[8RS1xOh\U"yn8_GwzUvc(ԉhy:tܠH|{ay$$LĬhIRaQZ&m..Nvt9Km`u 16<e!xn:4!WG1`bEpp6HR5"Yl1o2Mj7,?"7+'1f"fGa a&ˊo"qJQ̔BA|ī˲4MQ|\&QFEm6cSJ<~\"Bf/(Ƙ4)mA 4XhnC`bMgDcʮ~b4ԕw5ʩ!PH݆U⦪^,SU)TKr RJJt\oMl=2'~.9##$_޻TB.ǹzCΙcMy[X֫n)%9z$']=qd'-joHmLf{3윳7/҄q.2ЄDUe]W}7xKzNUS]UGK__+_MUL\b鄉MD !gm^TD~msU'F͕1FYj ȎI z'AD_T|sU"zM/RX>ڔh fwJ)EDTTybQ*@J$ȵ$SJ*݅g@SX$" qHU* D9 iŽ_cur$#`u0r4fA{*#䤘k_9ly "M*6f%@ڹ*5P [JܲX8TsjF~(hVf[wEU+U-1tSܛ]9my^)e&^ϕ^;V_]|w)jjՃ@M)F"Q`"( ZXE6u&rʚ;i@(!^ KYV33yw)xu]9}\.52m}Ft ֹP{/)S$lB'Dcl§y!7޳B1ʺXE-,]T5fPvdlrΑwSJjDyڞwJD') tv_8HUIH1C!J&~"ĥ$RbvucaWlq>~n suVU5yk Q $9 r*e(1FXUȫ1YE7AH.?DD5!l1-1lIU@{| |'(=&Lyڢ-9B%PDES kX_|O+BĬ`n}k+us{93,vx&iGh7ɭw5woЮumy}~TzcFvYQMKnSclC=0BLpn///4M䜓y.f^r4M˽{>[[/N%̷pq twgH}ސ~^_HNK)e]ºΪ6rq35I/KU`m׻{K4K2lz~yJ"U%ޝh֥)߾A_7x?pZ.ߧ-7`vQmi$/9zTIeCdpGY2u5馞3PMγ~qΑydTtc;Yu^}"Z!r-7 Ehߒm5WG4xO6]8W ])E bhY$sS9slD}\'"RZ>$:˴(r/"]ժiHKlK|y]K7%'=-cy'B缮j)j|T:Xc[xE$k"U\ۮTT},ɫ,9%缆f^^xᅯ_OoƗ61sK^ ?LOgH}7|7^-B<1qa& DDβb5k:u6E'6w2ݺLٟsk.\a5V٬)!(5sWj \E)sǣeUwy1^]]54K0< {9ow<ˇARJ7@sv;wy?ޔM~saFs[rlrjlHqIBȪJӘyy!"<g>__Ï}cTp2U?[W[үݻ}}NrrP7RJFeY:-r:&Վk<\j-vQ$v|$ì^VK*r,9ĶuB|8[ qwn*ڹ|놷,aju9~ QV.]Ur޳žYxѫ[VJT/⬺ૢ$7%o]|9eRf ԇ%qB)ksI1T&\J7zP\ܭۏw+uVɥ])Sjwn{BgvhJВs+!V^2ֻ1kG+zh$fe$M}<vl-'bBCEd3IB?w8C7-k~u>|````i$-놘<:3 3ܷ7SC eR7u8ǍN[R36~ȇ:ˢҷ~u[}szOF=o7CT}o#ԸnnUjo!AD7޿%kxut 9k9e>}````i&)u=oK~<o%)6u!xt 󁁁gI6 '$CM*|N淩wY"jMj1 􁁁E[kpt茪