diff --git a/source/modules/lilv/lilv-0.21.3/PACKAGING b/source/modules/lilv/lilv-0.21.3/PACKAGING deleted file mode 100644 index 3eced1698..000000000 --- a/source/modules/lilv/lilv-0.21.3/PACKAGING +++ /dev/null @@ -1,29 +0,0 @@ -This library is designed to allow parallel installation of different major -versions. To facilitate this, the shared library name, include directory, and -pkg-config file are suffixed with the major version number of the library. - -For example, if this library was named "foo" and at version 1.x.y: - -/usr/include/foo-1/foo/foo.h -/usr/lib/foo-1.so.1.x.y -/usr/lib/pkgconfig/foo-1.pc - -Dependencies check for pkg-config name "foo-1" and will build -against a compatible version 1, regardless any other installed versions. - -*** IMPORTANT GUIDELINES FOR PACKAGERS *** - -Packages should follow the same conventions as above, i.e. include the major -version (and only the major version) in the name of the package. Continuing the -example above, the package(s) would be named foo-1 and foo-1-dev. This way, -if/when version 2 comes out, it may be installed at the same time as version 1 -without breaking anything. - -Please do not create packages of this library that do not follow these -guidelines, you will break things and cause unnecessary headaches. Please do -not use any number as a suffix other than the actual major version number of the -upstream source package. - -Because program and documentation names are not versioned, these should be -included in separate packages which may replace previous versions, since -there is little use in having parallel installations of them. \ No newline at end of file diff --git a/source/modules/lilv/lilv-0.21.3/waf b/source/modules/lilv/lilv-0.21.3/waf deleted file mode 100755 index 2fe374274..000000000 --- a/source/modules/lilv/lilv-0.21.3/waf +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python -# encoding: ISO8859-1 -# Thomas Nagy, 2005-2014 - -""" -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -""" - -import os, sys, inspect - -VERSION="1.8.5" -REVISION="19a841cd1d216acf003e0ae1045c9763" -INSTALL='' -C1='#.' -C2='#+' -C3='#&' -cwd = os.getcwd() -join = os.path.join - - -WAF='waf' -def b(x): - return x -if sys.hexversion>0x300000f: - WAF='waf3' - def b(x): - return x.encode() - -def err(m): - print(('\033[91mError: %s\033[0m' % m)) - sys.exit(1) - -def unpack_wafdir(dir, src): - f = open(src,'rb') - c = 'corrupt archive (%d)' - while 1: - line = f.readline() - if not line: err('run waf-light from a folder containing waflib') - if line == b('#==>\n'): - txt = f.readline() - if not txt: err(c % 1) - if f.readline() != b('#<==\n'): err(c % 2) - break - if not txt: err(c % 3) - txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) - - import shutil, tarfile - try: shutil.rmtree(dir) - except OSError: pass - try: - for x in ('Tools', 'extras'): - os.makedirs(join(dir, 'waflib', x)) - except OSError: - err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) - - os.chdir(dir) - tmp = 't.bz2' - t = open(tmp,'wb') - try: t.write(txt) - finally: t.close() - - try: - t = tarfile.open(tmp) - except: - try: - os.system('bunzip2 t.bz2') - t = tarfile.open('t') - tmp = 't' - except: - os.chdir(cwd) - try: shutil.rmtree(dir) - except OSError: pass - err("Waf cannot be unpacked, check that bzip2 support is present") - - try: - for x in t: t.extract(x) - finally: - t.close() - - for x in ('Tools', 'extras'): - os.chmod(join('waflib',x), 493) - - if sys.hexversion<0x300000f: - sys.path = [join(dir, 'waflib')] + sys.path - import fixpy2 - fixpy2.fixdir(dir) - - os.remove(tmp) - os.chdir(cwd) - - try: dir = unicode(dir, 'mbcs') - except: pass - try: - from ctypes import windll - windll.kernel32.SetFileAttributesW(dir, 2) - except: - pass - -def test(dir): - try: - os.stat(join(dir, 'waflib')) - return os.path.abspath(dir) - except OSError: - pass - -def find_lib(): - src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) - base, name = os.path.split(src) - - #devs use $WAFDIR - w=test(os.environ.get('WAFDIR', '')) - if w: return w - - #waf-light - if name.endswith('waf-light'): - w = test(base) - if w: return w - err('waf-light requires waflib -> export WAFDIR=/folder') - - dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) - for i in (INSTALL,'/usr','/usr/local','/opt'): - w = test(i + '/lib/' + dirname) - if w: return w - - #waf-local - dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) - w = test(dir) - if w: return w - - #unpack - unpack_wafdir(dir, src) - return dir - -wafdir = find_lib() -sys.path.insert(0, wafdir) - -if __name__ == '__main__': - - from waflib import Scripting - Scripting.waf_entry_point(cwd, VERSION, wafdir) - -#==> -#BZh91AY&SYF%WM`"P!2Xb|g#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&ǟlNjvZ]&iLۻP춽5^RϷvǫnfڬ윽n6˅"l{ڐw.͝ݦ'Gmuƽ]rg}hn@}MݾkWh{c\@#&#&#.#&#&|l#&{J#&P#&<0::]=u^5#&T>#&*(WB%UJ#..#&P#.RL+Q]:|U}a={`,-B#FlL^ox{ UwޯMn޻&r3ﷷǮron{-O}zr@-e:hӻs#&S=="KC\ 5#."@ݭkN޹l){=z>}}}{8{k㏳=<鶥ݸ{{|z۫sۗOsk_}|&۷XpIw^_{=(ő4=P5ϋ{qeE9#&Z˧W޻U₊#.#.AAJ0Moa9zo\o{ƪ& 핧[ /o#&o}=@#&*Ͻ^=]{wj|i}31]½Bz9sgspýWo|M#&h}a%}z˱_wZ9#ԯ^IŻ}q4zw۴Wۗǡ'>g[vxWMO] /-}}k7{#&7US}{zqv۷s{\i}>{}ocl4 ԣ[zApi!q9w#+nqt.:';|'=#&4ncNΤn>wu7+6z$nnDXfkݵszr19ut}X6󏞛F=ms^{ޝN{rw֝k;Nռ쎯pJi#&#&&&A&B#.(ɠ2iG @&M#.x)hI=M6#&#&#&#&#&H$D ##&IQS6SSOJ~#&#&#&#&#&E $ڏ=4452@h#+#& #&4#&h#&#&#&#&B#& ) Bb12OTS#&#&d#&& L'#eMTmOMFhD#+G~#&@#&#&MjӉg*X6wLY&w@,J*jUjֿߑUbijn\x^c-\9qN@f4(;6Q Xu֜v ]a!&js*>#*QU8'a\:|Zx&8/5Bݾd)XdF(A"6ѫV"kֶ*mj #&ЂEDddUyDH``B"6"BD qEHFID#"H!j)A@SH$bX,#+EYLIRRD()m(b&̙(`M&ԨE&F#.6TR D4ƦQ ƒ2lEE&R2 eLDm&X1f,ME#DM2Ѩ-ZZ)&,L$QlE5J3L3fie6ؕ--$I"Jѩ4IIE(IjR,Q3LLM601JTd  SL@BI(0[$ dI HR)2AED&Pm5#+HbŠ)HdM#(bbd6LHa#3A#I&)[HEF%J$ġ$#.lF*X$ IEEDAQ&B$$R3"3@I35L#BE! Rl!"LIh1&J,0lFEEJHFh$R)IJ,$٦c@jX#cbVI$Q"6%ʐэJ%)JVAaIC %%i#.%*6(AE&&$ )A2CL"Aa#+C5Rd4M(Hi&I% fCH`bdCdf2JT21 #+MYY"J$*H(ALRHal2d*B6ebaLdL!!2H5%*4Tm "RZ1li$5BcFCʍ!Idj-)Dȴ2&Y(C#&Z4 i"R[)JAi4)1S%2LcY-h2%)EbQfLP!U#HYZ!,f&4j#+RшE%iI5SMFa4I6* j,əhB2f#+KMc$MFjlSF#.5"±MId%FSbM-h%dfZR5&(i5MJ6beffm6F#+QHT-cj5 Ԇ!5 A6m&%R5$5L՚ZYY,ę"fMjiRRՕ2SM-B5$+,PZ#+Im*#(٥#Li`I$ BAIj-HJ,S)M&*2ddҘQHTEAiR Lɍf͘cD%#+d1MfY*E3AQ0JRD &McQc)IFfQT1LDV1L&YFM lPF$QH¥6afm,TlQFM -,0I1Y flMJ"L5(FLlCb4#i24VƉ ɢRd)&-HFbVf(щI-)ELMF)4e`6(#+2@i6JPMI DmTh4bJJM"LlRD IR#+E23#+֍QcQZ*M KI5Q!@!Rk)I*#+FS3B IDYVCF$Ce6#+#e)$d%)JQb#."Q06MhTXS1Le6kPL"bB"b2PMjR$j&LJ6[2l2Lhf6&H($Zh)-)6ŬVKYh#+IEb 1B&BQSFkVL͢#.&BfdVm$ԣ*lV%h)*IbM&ME**"hVMQ`Ie3YEhhɣFƍmjhBɢ&m2"fhHCR٫&21bEVlZ-dֱYTM4k$#+4 1L#+$ clRc#.(?m jO"tMBiC?36힔td7Ņ`\ĥ:1vD~]Ye$ɠFƂt;Yb";Ȃhr+ #+.Iú銂Www5]ӭX_VQ*J@XTqO' $a%ZW"`@ǘט]DE53`aU׶֦0&SߋNDiMG?#.LhV!*Q+xp@_8z uWSZDnkNZ%l@-skBAH,CN<C(+]ah[8  ;#.PX%F*&)PliA*-YuYÜ;kXai^l1=lvyѓOc-l2 #iqY#;I.2I&FBM?Ϥ(3|u65,1r~G6#:%AE)*#,F1"ʐpBK,:r&/(O#.ZJBL%Df>N\qoMrWɅ6_^yqcX" rI)CTX]Q4{|4C@qXKtÝQ_G= Q]k{7O&EHk_sn˲sgs<42#. 0v=([P~\fNZKXQ}|M¨D#+<`#+RRNڲ LH]ͼHx%D-Gm,P⏙v4j-k](TF]Lfb4ו<*UF;_Q)Dxx<{r?}cac6?>xPgGB/# {RsP𢈤4JyO$"TQzE̞S1>Y8üj=b ȧwP@kN^PyҒb,$Ƥ^t$Uuz1ǯwS'njtO'"$fOR%$Z9+R݈[LLT}_nW#.h.sZ"M:'y[c.E8W͸l#.l3p\P®>ʠ3]uhiۆ ƛߔǨAv{ } Q]qÍV#.^U*y{,3KӝMXE69WW*;m3S)Z!o2#7 c*wŖfe5[PqYYQt;&1^F(#+ɜy#+~Q3}k=׍r?_V{:@bvE´Fb9[)?sf MYMݻPSỻe>)#+5r."* [6EpLKdFYI!|12X"ADIcK,AW)J{+$рv%|e[gv?n&=eaVc=EIuإ4'#.GҚV y@Y {g碨>(<ݍX]U+*'7C?/qG>;O2>ΐ Cd<}1W:pZM?ڡX!Dv}Jc<@$ERbS{]#.25Jzjhsߣ4Gr(퉯ƶ-+>75;a#+ƏQKu2%UEk9 msMǚK(&@M?#. #.7ջ;۾2#+\/EWxu@v uǽۙ8ϸr ö9{T/o? #·;ΫUmjtfIrN^K&K --+0[(lzEⰏTx=]PmH$!#.rdNg͞mZcsFVɖ%[t+t=m7&r,zH}E,!AMYTSt~#iD+0^,|'7e.Kg,"835gϚFFƵ b[k{;7ߞ䈞aQI:7R4s6* ev뀱-)}<&GeN (!6*!ᖐRKSLL$M~qc/k;=6DUF[we1Dmtb}Y/idWX6cl&%083ҟ?FLH7B#+)޼Wnw5YNMBN~鼻'(xϒ(E Ls벪ۗ^2K#+)v[AT];#.=O1U8;#+P0P||xVte(fU6t`!{h7m%KD<(&eI;<\fG Ó fV) K(?txgDZlmض9_O#.=`84Ph+;'mgxAXT[.%.XhVJҩQ4̐i{riɾ;n'^۪JǏ'kC ~:$ҥ~_6ŹYt$NKuS#+#.:%P$8~̅ݻ~ :rn"]3r&h21u7GV8/Ꟊ)2s d:3Ln-TnHcIYRڷlstRH3D JZuȲ8:FHyv#&rr5Q+A}P^ϲ%8v6ٯ.QhPr(Q_#ؿ]$W*4碫ފ__ =ًz`='jo=ߦzg\upլة:c.ŭ[1Ӂ]\Ni։m-#.#+ MoU'sgr~ׂ|ɚFI>- |㷖z=/Vd=јһCRN04ItzJ"9m//ԛ1]b$;%/ct`e:Re)me3 ɊzQh͸eM{}7ߡ:bɞ#+ #TFыuJN ~L3gk[w|q!{!w%$P~8t[B?<*#.S+-4ؗڜ݆^[nu$1:=fMtiѮV9%gaknuz #+zԱcF X4+w2(ß:vkS#+x;cP_X^b7;WYڋJo);!r#+^ӎv;3n>4r,WE}­+|]4??=iQ! hmC#rTu}9ͷ\142o'DQ/럧 xr>Xn ,LHa3.b76EM|iڠA~mB"[woG- pkAAS^{ 矎)hvN9.%u^oK4X ݶ }0Lv/g~:,Y@d#.A@;/<,t=\0oQX]-vC7gġ?Ƶc?Ai>ZܓUE4e+=$S/a~-R\{kj,X%#.>hwa7}ݳ/mME^N]Yȡ#+pCY^)rz&]M \ |#c3iUlw1o.3ۃFt3fj"JS:dUpɇSr*n<0k!K q0c?mss24!к)`oUu?A䰾b\艄դ#.S25Hin($!E<{y3DmM!Lx&t a }Ǐ_OQTrKp;ׅ=q8/I3?"OcO - 5υ-KY1db{{9ɜ xvS)7VӤ'w:Yw,(ai4cxr³uqAQSQ`[SklŖQ?S8Ȗ5] euO2q79q[k#.ЧXj@usy]q#+N)#.w9ZsRޔTjXgv] N:L#+;gD'#+H0阧>|^/:`xεЯ%Ƃ. ]|\CDo&#+B=o]5ee30 K{D]`[eoleͱ'FhG}SP-<MI`Y(!9 2)1HDMTZgZ&O4kzL٬B!]'ǹ_llÎ^QE:.bL`{gl/lOgyjwlS%fó#+iy bgB8P#KYM/{#+d.D3ɧVZ؅`Xekι[@kR2i3qțcR8(fώN{G-Go8O=Zl0!{y#+8qF|:FXvL=[#Os7Nth&b?4!B<)1߮ܫiɚ7Kv.xo^Et:ѽ>`!Ɗy}邘WYor8{a4Ǭ05W jEi% ) v={{}:i_>Hha:E#j)צkhe@R=U+s.Jb=\xncI.Ё txWbp{-LJ+'>N^\i]Ä7hz XXf0frou5 ~Li3<6!fd!"Y}K Gч#&y=&f!QE<52ޝyl2[qF0瘱4{Gif%tɝuN=!>NQ-"FvyӬQ@vgmQ=}3[_݃{6xZ/߫Ƃ k8:ĉvHs,;`0צfl(`gg4%*2tȚ%l-CP*i A!l.Z-IRKE UW2A~o#+oz}^p= K*P.ocYIHL&/a!uPjv^6JZll;=僌$yxwܮ:#.ӺoUkbgҋ7)УWU^;ψQV@`$i^ٕTmçcmhUt<#+)Ciǿn\$Vݵʹ0)ƯQv.ǬjYu}G\V0X1I)IJ]W <w_ݞɷ"dΑ"0X k#]Ng=2Y)iK8ܕbʂ|lW~9$ۧ'eQn\V#YB6HloT5cBW'fv㿅?d?x粏,e^1xkl¦r Y40@amDZvVAIZ;xއ2ן]#qs}Ee pW_K}+ѱ6mܵmLu=-׾#^hmCcICnÈ+ɡ|%s?:3C(=Aqt/&~CnCjOC"Dݹ-޻!wET=eC33ꬦvm(|Iٟ]hR! /nǟsR9[xҫ#.a/Rb˧iRuDWH_}rcSv=ɉKy$إ\\}%xzC(Nph׆=#hV#@~ o$c\V2\LOG7f4-7rlKۧĉ3ũ#()˶JNIsguV Dtٷr_J!݁æ*wAh_$#.7o)aҿw翻ɴfh{t{#.#.ЃB$(lu0`#+H"o·3'fvAj)կbUciR<;AV3T+$\/ Fo~o4W>߿X8;wpKL.__3y7Ύ۪z܊)PXE|N?[)r*Xʓ8M%#+6A&ne4B[ZalX)mKEp)$WhaF?o;ꮤ2l'1QH -gbM:5?2;vţ wy5Xbi&16{syU=8&SUxd$^Ab|n|!xzk4 {d}{g}G2P_k˷L*~zk_|@[}N#YlMCNЂ,7#.AVsq6ߋmQI.U(ɮ:rK88j-IB6}\V=WIxwl-٩t'ZZ<|TWz h׾}#6([&6쪴<ݯj0oI~?B]=x|jbOXQbU1#+__#C6XD?MqO:8#+VMV@R}YMb8oX6ӰN36t3=Wݨ=n=]qkNS ꘏#Kv۳#.n+:r$LytϢJ/Q^TdV@ m-@pC^@#.cg++Mj;z"rlu@_]F*x@PEJ`37{XF#Mtp`%5v4maL¼,y:VKFWt@"]vX@b%/זoֿ K]&7wj^frj+d$G,E34u*#-_]~fXg#Ҥ\jrSRS^M›mĖ0 I~ Ʉ`TVK7&c IMOJ-9<7bg%}9._S~=}gN]O+?5 ?S~{tY\iѯ*oʋSɆs1Tϙ;=~VxjrMp2ϾϷg:l~q~_}xlh9x{=zOFz5xPo|;?R[*i_}zmw=R`iv՗GB]7UD7#iُy=3<զ4;~MaUQ:)qxw~.oɱtc5CuRG>͋_'.6ž>yjlzh~]{ۏUWFj8Pq'{Fz,]A|'2#+#+o0r͕]G?p..4m70qJ2yCANVRu%ӥ+u̥l_欪a̞^!w'>Tq×}SVD:tѱz졲?qHNdB=t5y?H#+_7*_fX /d'>=;-Q?\jMhthWөyFɎ4,k鮦z=_"3gE]^/qʝc|}Q~vU4f:k:r>ߎN%7?+Ux=*eQǟU5_}!vz0=+Ai^ܨGz~oufXuqӇ!:BwؒU#+n^,cx}w ܒp+7W5GWq?q>`M,ăw7 Lzӳ@]a;$ CET)}{saC1kxpCa'#.zz[V?맚-qתz-w>yn ˷Ku}f7x]PHvGk_qwּSuA|#.uvBFC!YK1fi#+O)>?Fô\ϟ]\~bde\l*_]]],(?݅5(uU#+9/#.|zͯeux3V7]ی}k׃awb#+T7N{rU&U*F6E+jA#.QY,h ԋj[S=Nw,X60_CpwGލ>x@n3Yc?Lh_O&C1LxY4eR`ؿpV\Zg}/E9Z3n{pײ?ēdLt8h02V-Q*$eBo>oߺ ?#+ʪ|:C]'jʭh x?(UOw(TB3Ox6sV^E^:-E}dz#.Ά\iRӦ%?5פ#=ޯB_oLOݍ|v(cf-phe:Z^;o}̟}T*MĻ&$+9Q5y:=HkY] _\}Ʌ's-#{7)rh(T#+41rlq° h!KKIcu _ƅpmJf^W]ݽ1z #+#+1%"F ddEBr`0bh]Cvͪ3UP&j4(6#.Qn!`ȥMć T`nYkJxojM]1<u~-R50Q~[p=\M|3gV[nTc]J'A ]s \(#.<-7.V2jKA$bl9uͱ.rhl #I2ZX^?Tzh&8.\B/(|Þʈߖ\!Z\%8]o,6ed9r7xZ'jJej=ُ'd^K8Z$8us/p F=&7rù]34P#&[(U(6\M,$4:ueOzY;VsuO}$Cqtze^1OJ.wYd٪x1m#+5c2I-o#+{[<5skPǡljMV#.j'flLJ%xMFzcf>  2:TFʶ)t1YrPQMC5bj%lVħf60!,'L=ߞ7W'=+GNޟ^m.$V#.#"xbx+~IdWqaA#a4VdirMÜ43F`A <$18#.0p##3 9%w-#.j,zMӾlEhi|خGƃUqZuGY0 F)CgFQ+HuLH^-dX2:^OZƨ!fV t!qFTVe:X @°STNѣWVj-6Q+16C5LH2tp%B'IYf{*,a%+(XX‚: VzP6`ˠߋ#mH[S0-C,C۩е|x]N$a7$ I1 q< Y &5}OD^#_M m_证wM*O/9[nO~~+_'[ ƌk zu"XIq᠒:25c Hȑ#jCT ST:R.#.fq_T}["Í1 tRi9.,H6ZoKE(Qcb"6 ^6Ƽ}1QTR7`p#kDy3oPg64?)잛NV (zZM#.Fm0 riί:]%ăe£KrkI! +`:er9qNH,oJȍ!Ƴ9Y hX0`fLS*H4#Zl1#&d/ S8Q.EIW2";A]Mntԣ!c't&@ c!'")bѭQb^Lj4|J.(v-,H'_ҡ{vs*tH#+s0al$YJcjjVc1PnZmT銈Ci&ib$I8wtx5BƱog(qbDy1bt;/MzmiБ&0n妐aHIZvoDks}F2yj4Mi#nF*R3+djҪU`B'"LePmF$ъrzNK{`#rtiM#`7id"3\,Q2FB0Pi1$0#;Ň;d5 #+Jp0CmٹD2a ps.ͦ|_K/.̙r9JX5a 3aE&̈Q:B4#+2M͍ΦL̈́ގ(|wج5ے׀|`ayoԺ!-|"KwI$+nԆ) P\apoܒ5͟77ѱA%17f{W1J 5D(]BcTvS-یa<2EhJ49{ldnmk6Y v$<3rg3YpjaGE#+ы#RfAEnbMwSurL82J|P5hLb0 (qxޫBeq}{յh<Кh#+iv$sykK+\"gBR˲\jy^3+w\R^IWpG@VSo16,YfY#.xeE]Nf;4J::e&1]cK @LJ%e2%"#.'?Ռxu]ynQ& HwrS..x4W7wȓ<S={f^ -RF6!66YҔNb#::E2F773Ɲ>-gHtbqyĩ*UOG˱#zJUnCxRl˷pR0+禑A=x _~GD\2rkఊk`vF񶴄:fQZRI{wt:cwy,g#^!OWEyjn.u6k yCnl,C%\O6/$QmeH+ic1;^X`tR@F#&ŠAhNiMh*_I_Y \#.nvɜY ŘM@<-W:S]e>whlPPuA}{!)g#.E:XdJ2UZ _q\!>-Č`. Fn6I鹼1#+}!hє|ϯ:ʏ!N=>kd9k;؁#+9Qi b? ,vik8ㆶ"n&i5-s(\J:pZ%YbsttCr;Q?9ΤbֆVD_)&]n1C&mFER$,` v˨(#G$HspIQ4!ZUw~9gjӑaݧL9\ר >va2f)R#+œpl a0=cv^T2XD-;d7DT#.S˞J AOJ&]&/OCeFU9E_maT6Na=y9%1x7s{K7o4lQEx+uyD|K#Λ7݋6=A;3ص/S'_:FMXDNS%mkZv\HNErĤhpHt"/M׍4mFw]t4lctk7/h?HK̓cey4ȓ%MmF 8`>(ƥ~E_. m_>N]uyq=шHF00)%gx^3wFqϰBxP ǻ}nY4F vbb ItkXsd#+MNim|5s68z$(ijؿѕUiWѥÂ*GEd ÑOC1dlUu#.>uhQ#+Jr%solYrAjO')✼O\mo KVtgz5(D;%f0lA풍v}U 3L.aV##&$#.ܽ5ꁪ}DȤon\9o^;a_ܵwN_͜mh^qgH#+J7#f}޼/Lpr{ԱόƒFvJ&=60VU򤳺4E8};cAmc6 G3;q1M,82Qu֎CpwB=;DR| 0۾:R:r^Rgfޚ#NTPѸx6`5$'J:qpS圵[ [{T?YQx#.S2ZɆK?qh=:$qpD3Z4><j[fGuopF0GX"ii#+=;Lv#Kgc'k(Mf#Wv#&=ſ˜Zբ>B4)9޶GDS?uj #+$ryM^/nZU9qTP-gׇ)E|`nba(j0/~8l][/MGex707xhcUùA(_t?s\GF $^6G?dOܿ*\u?#鿂r.TӪtV>a/jżNqx}ssrll壍6Q ?6P0bӅP(4Ph-0qOߙdd{No1W.UremZ˝3.\㔟3zKTr{ivs&[.h#+].t[nqeGuBGyE2yWY§cS:d>_~k8ovY*/qp;=18oǏ>F~͟bFܔVcd+߄F!>KPg^\\$Ξg0#.3MwJt޻̵WM7w8=ق2x*S ^O%滟yQ>y[=Wuf{+)ϻ 6^ "|Q܏o(3S/y'U χߋx˚?)&X~{mkj.{9zbahinkT#n|_Mqǟ3Zr]$}V|9o,~9%N1s\V8*T}cV%ܨa!<;Q\c~ݏos_>Gn{7qL#l'ܟ}I$x`ս!a#&z+QxTAxFL#+K٤ϞD*Y)E}dg/iJ)[^#+}_MMuȶ#.USUW#um'&tC{_ >b(>WǧjוCڛ7Pמ3#^p})SB4_3b# n&!_Q_u&6ऽs+mhUD!E=CT5^90oD6KQ6]%?'GNKi e>Kwck;vmU8Ck5av~aabYH!?~N \iߣ}t~?+5_e:#+7|Ċ9uNu3G{D ݍ1V"^-4s*M<2Ewi>c'ؽy#[Tx@3#?q⊤*8r>t :]9 )f(4T]4Rmیmˁ'%~ wG%;7}qIָF?&_]o/.ό]3f*#+?t7[TFx*xx"bz(cl;,"%l`,vqm84g--Bo7==ձӘ:\Q&o2m}8ce+=+w^xėH.wf1s}Ž{L66ݓsWʒ`Xj{$r@5(b ";B:rcv#.墬%Z;X2dMſI_ 1MCV ;46$hpx3Wgk#.n"O,TC]~HJu#+'8ic KcO!vi}Y:|x~90+h;%4oeRQ~pyTjLámȎ!ڴ6<%̪Um#.'߃!&"*ԤrhI"/LFn.ۭl1ɦ3Pq<|O7,Xl4reA.eҦPNPOwA۔E =tTqm&^>!_ϻBbǴlsI&a#.\'BGV+i1{m2Syh۽6[?ckZ=υvP߹*YEp2T~Xy++_aTEc׆u8`b;;6dcOv/?$!4<]̛ 73m#.w/ZoXͽ|H\<IsfM̈́0uܨ]l:"hlHY0W.4U=)6x8Z)7U\rT  faoZQ6E./[ޓkM2!yjUiK[9ZbQKv0yX[eEbwM&g@Ĉ+gPFǸzȾ3unzpƣ_Kcd'"}|Mܥ3;$|oL+Ţ,K9aƺT< ;a)#+^NX0LB;EG%kflCncpNRZM -%ėIJW[FUϥʫ4sD c>Ť:;#++(c͋ͧjxWtyh9^omPp'[q8vLal%^Ũ5ǹmT#IbK~a8kZBwO" h1wY#&p%mY_Rfˆ`J5G=E,Br9%e {U,vR:CMĠFfߺ~ORrƨ<1b(JvO6฻֤/(*'g3feР,hnR6WGY+iSܼwOd _twyU)9!x1lB]eȘrR}3K#.t#4eS?7y3S](%$f/dN~g8]INHk6C-u#Tw"ػ!n̔Ytz^JA8H"9;:mG#t L>5wxW-r׳Zf|o:0O~}bHJ4\/,`CCr{DtS핪uiz]8^y zIat2_?=N(.EkwTDIV "#.(73en"y;RZisˑc𭵰0"$RA$cD#+PIF_ˋ#HKѺpm܃1(S5Қ=DC{mVR?16n~S,CSeNFE6`#+>9G]hMU*֦e^$k)T5P?݅\蔬Dg%g-XV$-a !~Mq@Y4#[ܯp}C멵]Too>DYI}(ө; >.V0}m5#.#jQm|Rsuq~4c@XDPb*} d%>yx]JF CR&Mڪݓ{l`oMJd:Uqěi[w J_!>;}zOHQI9ò湑4Ϟzw1 9)K슡'Rφ$Q2WpAZc9#x/)󁬝%ά6$4=BjO$ٜ-$=WKPTSkd|Hg^ЉKJcBCd#+;Aa#+,1'md#&z!9hUD/džkWa#&O lv2}TuENԖ贺y,0^:{|5綳#+ܽIqc0Q|! G_$Mm }#.j#+$PZI^/Ř}潸`-('?jms}΋ oW e#&Z[=9я4#.bϽFFOǞUAySOI&šLɈ Ʊ8~iPQ2t+c@ ST68" D;`瘁28I:=<8ߊ3L=gw|tp=p#.5d#+Xa7cQBeK#+ALJ>|JCa*i7ryu1K-&cVD6`\)e/=U+A$idvJ}!BjU FwSu`ǜQ汮%zhPDiM1gdz$[yGy c l4͌z>&!#+!\n, {)QXlwXW!p~%x=T*QNC([RIf2T> խ9i١"BenmH I&p\-TrNG=:XM:Q/H>#+ǐ:!=U03:6ȼFx,پqSE+Q+i99jF؁OO~mЕIQn~:rQz6x$:-$.fͨ*V2BˇӁqz.ݿ7).eSiYзUw}zMیܦXELS8;iԞvkvlltHC1gjFW v4F)uY"jʴhxm.~7]l}%^eE('BjAiDMD#oc7E2i8D>cO"@90u}.bߦ= HbDܑ>z_ |$,x@e4 @PG&gnpDqZ(FgeUgFiӺ\̋8O\t -0gF8%v=#+Jn#&#&A$D9Xlu=bs#)+Kgr}\--3wl0xdk\n,"ХjB,A"ᢖMb#_s,e16PvMDc\/TݫVu궳Upld#+s.2-u5i9,С׌5Vx#^̓Pfo*\#. y$h ݝYׅ:bצ#pxi}]#+c68VJ-9j̀Y3'(lv au=Ԍ˲g!B|pm3n%Dy Q*jKaLݬw!:MԻ@%,GM &oᲃ"kP$2Q1Ɓ\8ܴ<]x5?34V}'J2j1aQd*r wclcsMݼR@,IRO iQ֡q;)PpI>HC0>.g` ?@e9||#Ptu`ulK!vܮ,$UB\BSzop.z:$祈~5 гߊIޔN)B{qEt=w{j'#.Bp}uQ6aQK=qvTELS ?>(;[/C~yA"F Rގa&≒kIY#.[ ł4Vt8yc|)2_h<ߦXR#.$!;TZ C}9(DL,Ü?y2'B@FUa!C("ʷ9{owHQRb7H#.ӺWQ,ࣂ5j#kE &ytMt+c(0.\_I'x͑6;Gݩ#+0$wk寴Ëk{EiaΘ6ŕR-0)7gb^ D:%ZJQD:҈TTF$(NZvf#+ηMټfYM#lŅ #+-g#&*(E)6M5d[o%_J3gwy%:#$<9i0nbP!liEvaHnHg]ճ)btAeX(!A-Nz Λ#+3ԣN}0T| ˇY}+ΧD4,(=byk2= [gMxD`gUG?fG;ۀJx4`;UWA&6rȰ@#+bZHWXZ mb֍ۥW6RvLCm #+0|u˥rnybC-#~9{z #.eX.u@CzCj9 u6 υC1%#+Hh͝#&5&L&㕸 A6{fsq1zhm.K T*%IhV|Fvv9vJ^Dj3Uqvx zMizBEw#&EPfAWV^~k5Ҏ͛Z49Tw&p.^rq#.)^w 2n\5BNeA$a ^ŰIK9=UӞb[-D?X̫|i(>{~|o.|"4JQO}oUЭPSF6EkCI`{#+UPl;U8IqCB&6>nGJ%#s!+sQ|;֫GO^E#.[J#9A CO#&("X.ǭiTHl_]=b(Pk"4̀qcXJ&,,_;߷W@`WqhI#&(Mg/#+"q젫1A:m,:q.tĴ,qsV(VISo$ttxn#&ר(,IDD%G{IﶿdtA9h,¾ p< 0ߝ\6 vlKNR937Z&I"#+G~4^lŝܟbs7R!~1S/<9Թld!kw쁧9S',cgaOR3 >oYr+q鈩/VBTNt_lVz\33$30$Sx|@ 'zKrdtZu5:{#V;%j)P?Wۮ"#ck0aIѯYꆼ@Hxk}~%rB`ٱ\53̔-P'8g3{?1{݈7la{ȑ(C%;DBnRU#wZZe,k /j]gSU1f*oԺp@CV}˫F:5#&Wr$ u}sGզ#&/BZxcrgˋ+n쮵 D$(usZD$J6gg,Q?}QD:OMU f#.RQ41pI ;lwnqYU^s͉?CBr),`2%4ptu2YK_?n#+]Ry?D]9s Uւ&Q"ŁüҺrߝ$ԣVף_!)%^q#+wy<•44 znplf1Xj9~Pvux\\ǜ;c?~ZGF:Q#&m]c0THu#O9~m-zy\c@\g} JtL LJ:g{SEx/_d,OK$ƟVm8%"L- C4[L#&v !uڷ~Q mОG˻릤S>Iq!.jȍ`PU#'‡)4D;}~m;9ɡT=4uzrafbE%%D8C=vv#+sgGr[ ~~W#.}>^mŮyuJc.[9 T06#&}}C i`kl@ߏ98n*:Z٬ytI="1d}^s>ܲ 4"Ac 6Wl#+OVA'`QDgit黝v†IF|NxOjc"Z=}Rn#&}X q'nf/hIi]Jh+4OjGF[lun<1ᎊDGeԦ^ㄛ̚S~xҁB_C#.KU|+tO#UV(?oPNq²8Iq5s51l #+>{)ImͬqW D҈0%]$KF3{yFMͿ<6VO4`^EcI?P]5o>]nmrFS&h`c7DjG#+$8JJJLzHS"~#]+K%XF^_E8x㑦<:=7q!S#GEj.M#ܷXbϩAh}bvd|zCwb-/ؾ4y KFɑPd=^ɖʵMY7z)wCy6ˬNRQȁ'dD-m/{YA9VsӗGVy3;T*]ᆧ_)`c>"fknK~IV*~Vp'Tᚆ7C(KN2i݀VQмF%#+N&&tGc\D[b Uv@R'.B8@_Jc0#.[v!"Kfa脙; |k?HoSoxgsɊhS_z&&s]v-d4k~b#.GێS&B+8q֢|[q8|Pl:e#+cnl#+Wbعzi&f|rt`OQwTs(]zx♙QQFK%}]}6/K-Dp\N"mTq#GldjI4Q++HP͖Jv2IH5P(vvkS[gD]ifn89זfBD$.Nt85_{Cvx84hPȈa(oLX! Fnm&yaPS !~dL#/ʹjZQuXFq=#&넮kmG(xtj,UD6wūڶݽgGźۄR?l$#+qxF芢~_F#иٸ)(fn:1<%0iŐ/rGDl;:#+qjow;θǥi%ϢH뼹[9 dMa 㡟 -ǮU_hH6c,dH'+\=piϸ @skᬺ3UiGm@K#.)՗]Z,+ӈK/SHS ӥjֿ2M7pٌAc˜Yv5*>rO^Ro\oHF{LܮVȄ}ڟ!Г N=擉0gq)p)4ݕr^}~<1vgqΒmN;$؏Cȡ"5 I$vS1## mJcѝߝfsV.Kj/%03ѿR-a#.kv2B2a"N(ʸmY}O<6#+>]{nͅ9sQ|)ض5N'>kRw"6PY{h\^1%A nF3:_GzFpgg}"*)׋|gy$J@pMAxn˯D"'NbO,8>e~1= vT#K%B8ݖ(o9"w1Xnp2=V:ohMg{a6lrx9mNmGRN3P9Nfe~Ce;QnLq:8e8!|zϿ#&C!렱nC-+LmE*ש#.}ّ'F$' $E~4)* dH"CC8U+SiMu&J 7hp9S%+v&+NU}r&M 9{ۦvsO=n9]@')_`vZw|ħǡs-WμtWJYoe" ޾ƅƨ!Y=2mKT3]-m -9;o/ݺ1uK"nVE"gb #.Ew+uPv2C3Sn4#.1r)qevϦ2r0] :S]tXU<ổ=ۘ|(X^Yj.e Y%gSa3GjO0s}iw'/GCbQQم'zoKϤs(.O+7U6ph*Ze1ƥƞ.Ʉb[P"iOG5w86($G˛\7r N-G']Er㻷>*#&&;nT~V75@QMҟ#+;pMj6[# fg\A6D]D/@Q!Sp$8pe_[ʭ#&) 4>LWb|m7Z?W [pٗ;Ʊ:nVu\Ў(y:~@ 6#+-sG"B鱯#&^gdy=ѤLFcIM*}Qe.8#&Lޝk ;e'_'P)߬ L^"H>-ߍ vFތOe%-9TZg2>w,Bc8}eoTfiYHU#.94o>pvę*m.~=Cؐr6zkTJŢG:;ϸv Y#+? #&*PqSQT PEKXϨ:;ΰE7C7"d#W_^nL!3VI)RI)=0tEg7n$w,<ͷ4l*gp|$Lun?Ysي5M8<]c###6thd3"&IN95w"Ș`Mdzُ!#<)ߴ%)H;;JF/}#h lty Mp|HfTPoߍ:݋b5wwLBD3++#+O/7p΁`RBcPSuKN& `! ,$9SAH]h[,̵b#+$a;[Rŀq۸?j{ID3DиĈ6:١T'GZf039w"mEnM鼇APj J|KGE­Kg>q&3$HIS #&24)(ئ $Es{·3t&{zI#&&rN@vlB7!B&),LXmR,:v?eɧwjA(T!*!F617&y,_w7uBݢ%p#.e,RvugEb"eten(=2i!$**͌.Mi ͓YV+4ۡ3aFzPZ2a cGReR4JpQT_253Lƃ~S١u3=UoC<#:Is*E$UUnTWTC<E h~B-RÚ9K(u_^QKgUɴI>w:qcD#.sBI'V\UYCU~ȹne"f(q?\VoBdRG \;zT&ǯUdc"cBpqel#ѨHBCF6!}3ԩ|Mav[J@>!clZyݠ`Vm7%ҿW?tO(dR$!#C| #p}A+ #&:'a4'to胩C Av,#qPF !g>₍;X/H\-Lrv@: !{TEKD<X2*p|[1IMF@t rtOW"$V)@-ρsDcs4m-gB#.?@v"<r'ii08>(13Z6V"`#+,^H Zrc4SyU[Bl#&zx~jr\Z#+E$UM.x[CD}E*}:PNaj9=qI$7?0@tGV'M; ;C=a!0Y_}{C?7ó@~~G꾒C0ø>U+13Sr.BI)&C춨A(<'#.yrXYxtaУ1%m[!ofRD^(R|A0s#+Q"C9'H2 Ъ>'Y% 7;= :I6:s#$ON(q0$ʧΖHS:Ĝ2b*gSZ" S!gDȄU1:Yux*ңA;^>^| @pG O D>aBH{8c#.#."Hs.UiM$5bV] x6#&6]z͘l, k#g@V!BgӐjοBop^Y1#.]+-ߛZbe+3겕Ɔ0ÌP120u_&T=($æx&#+ [W1-k=kNh?2[x>-Wú1W0QDwfxt"r!g7N0 RʈE!\vR/&~hB55,X깪&w"ޛ:i?+b#&p Yyj?2~DT;HH19ȓRBѬp&ǻjbG_r#({Z,*)cwyB(Xq<]Lfת3Zs#uJ|J;;sVd= 7fc{#& #."HS!b"jCԇTB`B;NIGs9H&Pc'?]3LÍzZ-QJDpU(ae:[?4Jwq5S2=53.D#ڭΤnUJK1EPoȢ{+Z>:REdd/ymj;qLK$ڛkj# 2LA} #Jn~OM[䍝^#&L=0&aը{aޣ@P^ ˳!PC(4#&΄xphَt?}Kr zPDI tC`d!FQ }hK@ܑpH56` ӶC6,4PBa<w\Ꟗf&o =pa#&qVQxD+pqۧQHPVptzvdAF#&} dzaiD}pv|uOm_Zť 휍7Lrg>9mg-i$#rتYf!Ac#+ϫ?X@!:MIA)d8ϭT茁r#&6R#! pMp0}Ph{>?gYy0!,p Z]R{#. ,#p$||+#&!^Ƅ<[#. #+ym0bdgF)jYx'vINKzY_#)`]14$jd[^Uv=]5`ϤD3A#&DDDR=J9C`CJ4#d7OQžh1=x-ZlVIUZYC%ܘɩ3IK%N|Ge#.<;M |sUR "@L#+##&Ҝ|vnt(`>pA^z -;}t`a g/d@z=*Hn{p6tHD, OeLM@#b4BAzÑY0D$lppg,E4W8Lٙ_ӸxOIIer7%AU, #GeLO%[ "/koO(zf%;mUB+ķg &YKDCmcb^RnrcOӤQdݵXrmߩs.&)iPjvb7RVX>^K7bw]iđq9pE(8Zx5ר2(;D$Wh:a"=TyTLrڄzP;Ùt헷L`eCT pn43Dĕx ba̋8* b`>&A JAj`#+w%q:Q{#.)W06lx4W3/؞1Љ9!B PՌw} q2I9_hS̲ P< ǮGM ɚ-o#.%?ڰl?S3#+4ۨfLRF聮Z1ӟʧ#+Z4803( 0+&#.C"KwdD)zP}xKMa`l#+"80U笘(mPc .#&!!u!@MzrgRa-Pk,46Oٹ&ׂKwǡyoL?㩂}rwVj/`\sa%60F 9y8U8 CfT'<Lc&)2R45!/ĩf19#&j!GN}8&CATk80`jB(]e|x NͶl:I0!uP)Q7e oza8yb)6`}3F|6{!>#3`fw{aᜀ{\X:kF62־N B#.^[>;8z\K:gtԳ~sBfKupϸPؚ%PaRmJ57T-1Y nx6wr |w^fqb$Ra?J{骪#&.bn}kD@cRT(/#&(cXT7)iQʱ/)}.0*M~vr}&&0U-.uҨC&P}Hё?z0^p' ۗey?U} @ :3~Rkv3onfIjk0vܸp’bM_p&/ybYdbwYo}" lK)^1,E&4$sC~$}BDPS]T( [QQȒ@6#v׃hA "ۅ4M͏ߌgҏLWQ=Gob?(_f*>zGdKųS*cZ"(bux:f['wmZW^5ݛ_#.CTD,h+@Ā+xUhK4#&*(+Łe#.+RHL`.kJd-k-,=Tl QE'5Bo=YAdFam!0c`I[-V a?E.!#&t#+PqeĬ!0@fHj8E#&#+ʏpA-Ҽvg$b {eR|;KVnǻ4EA"۹[󘱿CHDN%RrirM:M weLlC^!-A zfIP#ަ͙B 1{yt*W&^]Vh+5mn|woԣ%Nˍ‰Ĥfn 8]+&ZG0ALkc3jvMUL1\C#8Yw8~|h; }xmh35?7,֓COҹGZjj%y$3AI)|YٮM&C_#.wr4 PqL;Y#+w0΂gyIJ& AjXSjMD?WUm!7{-sۡ[DzA1sv6owUS@"Ԋcd#kr^uϚ(JnIN+ȲWV;*(āN%&V.x2«"Y#1B#.*\h2C.ٍE_[å+)&QbF.lXFJ]O-c])[Uh3LAAtuQcxFxu]d:_1\zx9]P?_2%'<9ů#+oB^`sA tΧAU,tDo>lZi9 K2sWpcYIJS2ٗC~#+&f kT.m>00:81B*2L:SLxJd^˜[-}.q |%4 ҽ'ȇDWT8D#& cԶm @Ej[?$Fa:.扴:E\p8MHV@:2eQ0B S}s#l!A2&LxBx$kB` MAŋߚvBh-z>/q܏oUwx#.=Q`ElrŘ#UEUDuKUqxl9s Joء0&)XpiJ%#u0rN>QDbߓShx@H#bBƀ䕷9CLlʱ Zg i#I1 50^@c#+0j S8#.S];ATns"ůx^|6 SYŔwߤo㷧}nN_⺎#+%9{5ղYӺ=OYٸ|h! ?3x2N hhj³d T7e2:쪺#&nfP~DI*RB^ (#U#E#.R|4!=Cn̟(I#+A8el#ژ PqB$u2gyr,w@lQ 16zxRyCȩȶ}/IbL{;63r$l!7wY ~ҎtCK'O%Ie9hutUkUU(UY鸃#.NRM}TW׻kc&w5EzicSfSe;QRjR;NUYRftr ]v 'h1yJm-0r2:5G#+^#.Co(a6_O#&Z̮{ zK#+)=Eπh(n#.QgZ'zfIc0»!m@ՆtoG wfrvZ(E3H7Rc|ސxPJf$$:Bl#.م:0tf4Px=$R׀\Xq83->.n;FTc#z苐(#.+ܗ7G"&6S;;#&_1~i,5-w.fECc$ᩏ0RTy7q—.V0n/e<0:zc.ZJ:v(~p-ǒd]69[qe.(*83;mDzf{Ӱ"jg#.9/sM%63ssmy$9X"*vCCIag#.>ϒX1LS26ĝ=x@If |6ьCX@@b((Ss`_i r:ILB+#&S{kX>s^6 ptu#+֦YbځJ rI]0 > Kę;Ls,H6, !fBAG7`AE/}#+qn\w.j6z$)4|#+MȦ X1#L"o f`'RRS&:m $kō!dȘVEKdWhq[Jj&sPobejuuC]v2E223.R͍,v5JRl-#.`0@y3%VaGpNa:k"a=wg#a5#+gq:hnfPXyJ~`m ] */jzzI*>}dGsg֚>RUuWTgUUUZ?js$D8)c$!#<$v#+8[Pƻv;^G6jck9i֫P7a1YtIDm H@ib;9  rPfAY;#.SicZ"^T;ƶlǼLfIQ3]A}yU6v6vJ1LXu?xD]ZiDvMjUcQXV"!)+ѻ!ELHVűVb~>lYm9Mk&3@,X%ha!1{fQ11n `1#3!\+({ZOp#.(*gؾe 33j6Dko=_@(HZU\SJQK=NRCoh<2i[vm5*Xٶ(1$QA#.Hu#.9')k}i @IFoQ$#&5>ߓnD^1bI I<* *~%"@"T7P^HIe4|,U.HÈsT@ >~F)ͺܼh dL=$JB?(XC XQ5EaA=8DU YI~Ԗ3G:Vyj̐$քbXٌR-yu.b$|n} [A5B A#îC$#&XXMFOkct㿆װ}1Aua(|`z7Id(E#&H"DH  u#&?QQ(,`(ؙF腐 =/Edv!q4J>fA؝j*iB 4 HK#[lx?UDaz4[޻xsh\鮒yΣ\?ytt(ܲVn)N]moL~mulW&d$"X'B-)냄.&+tV">>O {ghv jl8=}w5 б!/"kUJ&tjt#Qq/q9s1kk|7 D2kbzf+M_}*v3ېOPQ-DSS*>"(3{TL@R!(p2(MSBT#+ 1%,))q#+7PX #&b fQ7>82bQ&L!+'pjmgRne~O8۰;ͣhV ^ .(x_S_v:ކ#n7w,#.*ZFt=60o#.4ΰoMփXеI"_(EJ):y](6'.As2#&BE@MSLjR~ѐ4,3hT`Xd.BL.OiuX?)vX, sӝrNg,)0RHtAHD~\.$ $FEJ$b4ِTɭjTbX*TI$>Sp9Æ_xAIFB2#&N{T,uHJH#+øOebz,/ms/GR[hȅ^#&'jA"Hr3nOtS DX0X<`crQņԒ#&2F#&F ²#&Ϸ{eQ#.6R 7*75$X!lb&Pߟu5b>ߒ)AaNOLUC5vC)cD;[tub@!7DDˎ%#sv܅}'t6!OHd/ /_Nw`UXyp,VlvV7usmwC;>=GGm|S%?AݶϞt*lBzwsn#.Âj9!ZTƘotz#&dS#.DT2 uz@ULٚ&#. T$A3=)jD:}I&D,6:X#>h#&"t ȉt0լ:e7ndNʣ۫eP/T/T&Ǻ. -8^pL<ۏ=sz-wIާ-%U4،#ާo&(2u */z}JA`Ȉ0H0LzNĂ5ΐ=\(xF#.;s#+ Hāi"7դs# #0#+zoF\ -4rrT!4MK71Ё'#sDzK?#;feVfWhm92~Ia1 _"thM<$j!wQw6H#&XłRlj鮠SDիVzyMƈH(,C[ M$^ 7u#loŒȀ6 m1rhDQ N[bCݿ4=Z\#+]y[zZňfd척YU{5UjJR2P_+wŐ w,;6 !Z3ƇTAaLnwV52}M-ÚHC`E CD!nŒƭP˿}$K}8#&8<ݩ%LЫl<Ӗ``g.?r#+\ܷ۫n[D)I B8F T(#&`#& IaWJ(B@9Xn#.9]6[{#&3\A;Όn|`.]yQqЂ"6hE57'}#f q  -I:M7\S5xydK܄ry=0vQt ӫ H0Hv$ᶖHi6T)pP6:7j^ WݩM| okC3HhXq4%_!$M%%j !ƊŎKɎIÚ vcƺ07ƃtC+ $8#.h#. #+#k[EduQJQ׎z4Ù˹sp:v.hb΄ `d%#.9~/ul5%q($CqJ[A&7h \4KlqH%FAlQDR]O:W F'@Cd>вX.\  jv @g 8%%2';ݕYdi٘v+2/X#&#+Ef(:H-RUT` G2%ZIdW0B̋0pN)hAb'C?&Q(gP ü̖,ytd:'NH|=wG xs.OaGMAԪ6D?^idQ@!E>^H*0nNw|f[:7?U4R07O=3r>9AJ1EQ"ְJYLKnG#RJ26*C.L"qc#.Hq#.ؘ#+"dИ^#&U1#&TJ<.)#ÉͮJYpBW$hIӜa@{M! }FBf V|$|_YYZ-"si)TSsplC @M;8mX Eh #rPqvH"=8#+=g@eSD+ daF֫Q(2(7#\/>,`$8qv%dEo&"X3AeP(HP\RBv(#+"{&rkϹhP*%#a:fFBUW.wySbƢ"F#.D 1nuI͐x j4bUɢli`saApdPxglZڑ]l¼Oo^#+ LJM=&~pCs~A:W"/6vw}O9y%f2To7ni+#+w6uh.$ǃ[⬣Z,ixdMGV+PAP7@Nƒ]3|#&C) $ $H2LDLUd@ub-* KE!bCVvdB :vp2o2穙Fp6٬XBb*{IB3ɼKlk6I?cB0M3SrE b !Bgk:Ɨ)d$̫ʃ\AEA/n.&.Ț-E#+K6"f&\9Awm'  kl'oS94K~GI I#&Yђ~5G$Kcwi91y+feghcfլi7cH !;,OUj Ib;I&Q+FcUŷ+mY**ѭUmmT$(]ۙpz/O:{Ȑ>5Zph&Ǜ8'l oer|<'`}%!FS%TdL6*Hd6T!%#$X$k%i4lҔ,&Q3"#&16M#.hM#. IIemE$Ѩ#`Sf(1Vh K2h,Y5!6c#fLN#+vS{4z* x16~dl'e:ϧĹoXoXqi4P=vv><ٮhI*2Rv_];Sẇ0pNaj{v|A]Dp&7Me6N8[P]9Ψq(v N B>s%0lNKjf KQv3{RE܎qۚc0|+33Ezk~k[ )""vo{kǼ}>Pakb,xSwTjG G3~kcYuj H J#.<~|:} C{SdNZ$#.M-8C53ra%&P4r>];vuuᝣ7#.O#&^HȂ: AjI&/)7-I2IpIoWOHdE D<:3iLyKh jO#Yơ7ŋy&M8mieɃs]{xc6ÖU04Gj^eˡF88ZR*e맅LJ*+؜RA-"}3C!ĩu2D7-mF3-0"gm(T{(]lͲK^׽%Y/kk}dĺ˱1TTԩ,^1';U51!` kzL3AYbs-*N?h9|(B {seBbt Ju,ḻm=hbHE;Eo6D䎌B'oH2&*t̅;;a2jmT:nfu2u+9؁i#8u[l972dod-vBW+|\oyg ,96Fu)󒉮(ѶI1f곛:u9Ë\o[T5Hx[TN}[u/y.]iIL:Q3ÜnUfy&8H#.ݟn܇MA.MLosi!';3Q1y8庯N& 흉7-ٱUQjeiN[ǻNҫXnF5E }KlMcDs>n]M[U A!H#+4 Wn39FеmɒiaqL#.Ƒtd:S~jkϒinLPṄVY&Ü1zv1#+L!2/XtjIh32,n1N&Hl q#+Ж1 7p$ɒ̻uM`L6"dEoellq*Ww}(ȉ˘768b#qpi}6t}:#+pu \iܵIZ"9ěv]f#|mʢÜй@șD&֞yVLmTؐNhaVחJ^h燬M4|dRDiB8LpϋEn1ȵd3R.cm9Xi%K)VB) }!uĘX+)<2hza(QAupN瘬n:54)CL cO5yp͗Zf`ߦH|J$c7 !XQgu˾NQ9GW"##.a4EN% {g1^.»eׯ4Xij7T6&ta,n;'.Ɂ%n fL勌MB6û#+3BަޞFW3#.ǬMA Z&#De#+ik]eEccZ:ƒ6Rk. TP8Y 8d\n/i>mI6b}[ьwZZylQ={nvV(YZ5lްAr΃9X'1VtCѣALI53OIRg@0C\*gudD-1 0_8Xk#NIxu{<4"wMhVaW|V!FlWHN7(ѩ\!WDj\SFa hjC]_gg&ĆD`bRK6l8Njm6_ Q\cQB'+ǿf&w('#+XP,7y!݂ȂK#.y]I3Ho׭QU:Lx+HĴ#+&r*z^hިɓsmhVnF21kDp/z6d#+o)#.`lҌL44fi 9f3EٓD#+b\n&d$Pw,ˡr3mGF~eN!]eKғmN|ΡI9-28_=i6 P<" .%!(u+hZ/DيVsa߻#+3ƈUH:!:5dΉU#+8dӫ3:r!bAll5CFx QC MpOftE3U\rP(P.sFȄ#,E~}0-TWHx PB[U`v$m!}'8#.;J*h| 8#Ŧcw4!#+Q^.""Q`i1..w)vwMᡞ[qRl5KIhRBb!F4׋2f[~ac$v#c2pD2J7s3Y9@35TPX)rnH5WdAlhe9Kq7a5w!)) ~ri~EVbpl40aMBp%\#.EH?B0ZA?^җ"#&^ډL@#.W+_=Y (NN&me~uWY$jAG(:RKRzWէSf&TowΠЖ#*H쐕 K/o=K4ɲλj*F“o:a#+H_Y$kT+U}oQ# _Zi&&8v!IrFΝx6[vXbHBmf7<<+^sԖuZjߑUbW* }4#.&y(޷6JIaj#.Mva!7PCm98JU8F/9p2 | RSU-q(CK:bu=.9,SNwݚ1vXp0X͆DV0f;,(5#xYYbNZ9s!ɼ@џ:\7+,rTӑ(HYaتN0uHԬd;Z^M7#96)j9I`0.uݐ.%2=٭D#.iĿͥZ#.I$DXpbv#&(D)PJcd0>?Ԅj>#+*ܘ!dlZCE<[]f BMB(Baik&3wg 9%o|.. \fg:Lvw#.sآ c`6J#.W$m1wteioZjF )"0THhm$335uq_[iR["$ B0#.j5jFV#&V #&Fw}! Kĭn% D&dTR Tt<"=fhmqGeyC3eo,agےu@׸,UY 0pa,m-imb ^gzt$w=CsL%C5 (HEK PFE(R`p|U|:CdMnm{/k6DJiSÎ/¥G8pkR֦S"1emoYd<*QX_%5AfA]PL[!H9h ?_..0rHZٰ0X@#&Q{_'!K``}Z 낲0t,2I?(RS&6~y6ޤԨYfuBC;7!<]:m)tsu,ɼ*p5jtv=~nc yܮr7>2#.6.@YTiL:B^QQY'x1=+O4 tPA=Flj|:lVݞ\1@PDi BN S#u5zlHL1@PwC}#.$;R8`v00oq:ZFmu0i&&I]H93Ri #./VY`h-'_"`'g~dY$gL!Xe0hYaID9#&8si2JNcQ`8 äZ)-kj!ԽiV"&;Bk_㶗 yw#&#&5Fjkg߶M\"$("BJ,7AۋͰ4Sr!Զ#ЅXCcP,HX]y#+sa"j555ۻ"EE=#'J4`M#sL"k ]4J  0;YMhAU5r7N'oo{zR+ɼkxxw×/4ZQ, f\4]"lC$hǧ"AZQJUgFa#+Eiʗ#X3K!͝Yq#+`F*Y !lih´ZDI(b3ɫ&cJߦ#/@>PW(Bט_$^RAiΣR4jIc|DAEtݴCy"Ѧ1v!IlDJDBDXT5f_IvPe#+^H}iT#+,04H:/jG#.^Z<>RsO/E>],5t)kXÎj4<}1.l\Dֻ!#jKAPֺ,,&@B)|WmU1F)8lsNq0Z;Rf?HfgRPr\oY-e~ R5[I; WR9ivgŝar^L1ȣRQУXX"ª"Hx#+16`L)eʇc&zvDa qtNaM#.mpaLF5`09GD(24^'ʄY%F|[MГ ") "jJɮҴ<ܣF*בF(Â,Dju #+N%twG@yPdIHߓFGmMִbZ-&(&a"2IeSgv29+{xS"bTMY\[jw1(JL!ypm֩~EPh:MGJL#lC(?#+_b^#m9J|r55y4TWgN)\Yh.aIg.ET1Z7[&\UjCBenM#&U-FfaJyqrLJj6ت[!"#+AX B?V"+4ԡ"P[=(6ˮg[ C mc:mI>^TA Bdzp'42R`#+"YSy}Z >㑠j@Ko58כ ,ei|:t`E2d&"w^GQ?>|ydUuOGT{{X!Pv"B#&\G4a(R]\nH*2*#.C UN(TC?dȊM8m#&#+#2hSZHeDdK#.R͌@X %aRWD&V(dnS$!iBm.oPHLZ8qYR)TcFBCU7r{#"Z +hRd: -cZ/q#&"5edT2ST%r]%AgW#+*5A*oT;r#.4ĞH"Zdۖk'od3r#+2 LNimeo4 5Āp0MeGXF֟a5XVvklᢹcx5(,10[BEQSjLH#.Xvy?zxucl0h<a ++og#+w+]ncmQ2U;o]竑RcxZ#.aXhJ"#0fǧt|^pf#&8Cj8xP? sȟ_DI_|dUYV_~-iVӮ5mmQ^ur2m±T[b5W-56 2#."-a,@#&\ ($[F!Ӹ}|DH]#=ڔs{j<*QDIBD 1$V؈DA(&P`rm% jnQM+߆9J~8CD $BɴUr//;Xڍ "RKHI:0e#.&lmYiغV66ꪀ<̰\(i &AlkQj,iL(5VI#+q|rt@yŏ0u5Hmh3 b$\.0.AG$  !da&YĜ% ^ڊi2#&.f(#KM7ǎ0rQb]r䈆#qm=-1Shͦ^SHabwttYJsAQvu􏮸BA 1-MhM`@lלS@@`~XfAL Oݷ8! ?.}B4k dp#&$v sr6#Rbͪ*6miJ-%Xپo۪Æv@썦oJ*ۖgW"Z+nbBBs$5@ M^vk[OlXc6P12^3Qy1ƵIsvgA& he$ AbThcR)yUT9!p*j Y=Owp#A$@?Tlp=[8ezGM#.'NQ? (h!͐jD#&i?h٦Éatkq&ƣ_26dJ6  " Ihz5MGmKxּ4YO lLF1&b(iw"2i!'~קcwyCW!2ЅYMz\QxX&`_y;/xދIe8iItRx(CEl@f:n*l@˼8T.{UD4jFDjdc#,e+Eh(&ku&R5Zf2mfeƳ!-m5HʚjɭTmaՆfٳm6H$MOz#+'~',;ɱ# A#!n˛jѭkvkZJ"A7zN#&`"$H2,"XPr3;+A#j.*L#.)\#I&-7m.")U{![ɂ<`2#&T+؆S֜@0E*Q(!Q#&JL$#+hKd9R!{9#.Dz'ЕnّN,HIg#.)tIdhTԃF$D LdNԀנJ&5OaQrE=M`xwY#.ԥ9v9p:#.=]zg`Da(Hl&ʼnljaR_vîr.[k$ b }UY!sP%S5b;OȽ0c6q]s(l7i@ Q1P(#.j]7ڂxÍ;&g6 ˍB S<7㱧J垓qr[s4z?:$&fxv^[ȭxdS؍n9܆+1Ia/E[unsB8#.(y#ُ(x0~cS`(d66;LJLuA(Sp&9# c Z6eE2sY>4Ʀv}&~^Fv`>FA=aEbG١`Hrx.Ͽî`s{(Lx#MZ{N}ѱkյ+n Do #.SNӿP7.u#+NT~4DQS.p#+7urP$G;DC&0E#&P/⻌qǑN#U_v󾩘Z_OD_=jioϤjxW$DJ] X)A!?҅&ZJI:e`Ԣ5qw.﵇ A'#+tsGPNf/$/#o}e(DBQqd><^5uj[,Ż]fҬ&ijٛku[7LAb2(߃q;~(i&8Jf#b,GmEJB`spdc\ u-w>DŽH,~vv̍ +vԆ]ILi&YեCTVH@]h9j04gjΆ$RYJ cO| os qFF+7vq|CzVL~n@S[oB~屓帵MoNW%``mnߴPIF0T.r0~0#+71Ca$-p׏ڦ+m+k?5JF_ J"4.Om-B#ztnj Cؘqp)#?#Vuk0՚5+ɖ6p5#+78\@]O;ژUpr;wͤ8԰=&89{#+%;bd;TM@w/ 'åckfUgyc"Ӟn`?7 P9̺#&1#+r%$yr8 1DagpjvDLGq`‰ Y]H{ B~ y#L(d 6ljd0L38#.믁!5%C,4`7:a7ADFH!rS`3;67Fn6<۶ #.fPZOFtI(uG~3¸]mhe)=#.{KZo};y. GX#.Ԑ0y[:p'"-Ekਸ਼m[h֍ZmF*Y5xZ$D+,a$E4`L%ʪcb7u>l"[,7qVQ!Ќj"7ĕ*ȶsB<Ti|#xж !VƘStq#@mUؠ5*^4€/CڊL^-#K% g( 'vC(31mqdl{Fq͘v > eֹ`ZEa٢QI$nB7azDA!%@mtD~CTk2ڤ#+nA(AR#@Rhm6VbFGt{w%Hl&6c>QDK)=yuKtvwr*hήۮ.쾿6mA(\"0#AʪMI^]\EURck7}ZFY-vU904y%z=g>>{I=GG{\Oprbߑ.3u6`g[oFWl Z/R*lUƘ)#&Պѧ&C-*$qw&Qhd(2$ƒ;H̙Xʋu#&V_`S Z cLlM8Cj4Y(l@ahܙPRhe5#&KC@)d>TR"^H|ꇮ޹חR5IT)"5J^Eͮtκje,km{ m#.L(@JnSe31FjKJJIFm%P̴id2bamԽ=lަX>j{'։0G4ƌε{};ֻ)5}Wm%f7<]RJX JU&okX[۳n8<)sycаbo5ԽU2L<<4úBԳyaϊilƛ\إ(6S8(9=ԿzUxk|hkvB,Y.L#2?g}"B`#+Σ1]ֻ3gLמݻ{6LۍE}ѾFwo;6`3HC&!=py ,ϫI%z< 9pjP1Ü1_D&l 뀑:ݷ\/)]'o(5]_l4)Qj]#+|}a#vV~l+Bqiom^:i6̭ncVK]֊IշJ9׊hƤT,l\᳻mEi5Kfr>&6m͹Y%ZB=#DV;o&uG3vS\ϣu"ZSj˶\ۨB#+1@ ,#.OK .a+"E!,9Y&hm/+Ry5)@Be6u!']jElTiMضŤ-FL0j4TS4[&3Hh3Xf2՚HZW*(9NH]#+! I 0TATF>}cafwfܳ{48#.+[iZrljC[jj7wsvHM]ԛ]EwmEmk3miRZY*"1RcM?!vޏ1ȣOIB 6PAH H)#+ vd^H#&iA(8#+#+gF'9X8;bevFŴ#F.mC4P$J"#&1d`4S+b@ =P@3zC=>~G#+ki:޶qN؃nn (2mw@9B*#&HFMOQ_:ؗ-4ǜEi ja'"IGB;e@C(0>$6+|^b-t9ُ Y{5PԋfzK#&g{V-y)'tֺZ[tBVln?s;09q(૶%T#&d B1ː-Mc6Rjq#m \RF%Q˩֖IEZJs:]ar\ۻHxx(\4Y.6[XViwmZ*LF׍f]w[+ۢgueG5QWir_mWlE_Ry5m2MQǟ#&}(BݬXΏsCOwhL_B#&%PbT}#&'fB7"`U "0XrmS^QyR7vq3tsN6ARDc$P$#Ď1PEDBp)kȤTHIdA0BV-mЛFSA<a5*B]NYeFƌֹ+1+7ΪU5``u#&&ɫ$MPQTHPXZMp4 # ,-#&QW]UK>ySel( &~ޝ!Q(1 `Т+r)#+!kU~6lƖFZH(@#&@N#.[gf#+΢+V[eRk*E5#&H?MPt&A@Cj#.A#@#.RKjZkCZK`1A_;ͷ}uѲ8nC%&Ēm |C~ % Pdm6Woݾ>1"&i-M#&9(ڃ,9k;`C[x[8՚ky^5֓Ť6F~)ð@"v(R4%bJ)$aY&P0N< D YkAv֬ukx(Xb,vdC(ڂƀ+ x, 4lv:#+ xܣolj4cDȊ/ng3'G=z]ܪHa&fa]y"eCZ«Fї*L9AJaVDj& `*#&pV1.` a2:l1@#+JM۷&иA&7qRN[fG-__+JU+Qq5`CA(mA#q f.FѣpJ)IH) Ӷ j("#!#&눀A*(T#& h$!EĖ#.RZ#F$!5Ӿ}_b,:;2>?DIb5ov,QDUT&is'g;ɦHEƣ#&"cDfyNVy[um0/<^;rvz`Gܧ|w1WO̥(z ر4qʋѷ&aQ(ED+G@٫F OO#&8y])m3Kb~ @#+W\~÷X!z>Q7+b KeUU,m[(UQ+I*݇݉[΅Y#+,lȘ1٠ᐦ׼{ QRhcnn6 4&EH &ٴC#.S ia9$!A'rGMq)B [ld|5LcH4ccȸnw8L#UI\iAHh֡߂`ЙA t̬NpQ|%!&l@Lt- ~Y#+Hn`DX ;a2Bn !0#+-lA&+zt!G#+ },2UQk΀#.6M[cmKXwjw^u61-lzP&u$?9 80fj,d6~4"Ƚ9wƫMvi\Y'jV;뒢2 8c&; 4Р&#+E6/`U#3HUox1@1LvYmEwHw[(Fm˫.`g⥺I!buTXYL=jreXSQUwOGJ.]_IJش&z@`ڰԅeh\0Pi#&F(y)i>~h|kb&[;ZHFn?#.}/02ࣳ#GRkS$O#+"#+"NCԍKa* $quGGbff`.RS0,1gW#xQglB@ _WWvp=Nqq|hYcҞ06z($#EDB!H6A!bƹi㻔|B(!BN+GHd(@Y}%c0G0*#&SlG$ǔ DiDCF(5N;\  .%Yd%#&I?|3?U6YߗHRH!S̭3 3 7qF4 7g<{ndZ R[Dd0[h 4kW6/z[-LHnL+"1 !#&977Iu]Y"'#.nJ4#+c"-$E傀ed`B=HdChFh5Xͩx$:sJ*+A} ^7:r#./wNĐF0XiA=4P,^8g0[~i GC3豉#KGpc_KP.ẖae(hbtn&AH‶hdZNC!6\`;JvC"];nH3-`YeѨ =)#+P+4#j1F(qXRcKQ%HT@Pak*pc̉+0nG$BłaR#(Ӑ1d"d7#&ZQQ(4JF RiR$$lUTj.izSIT&&]Rijflzy _#ÆI!--cedq̕#.q $8G#.d j6=b71b~F52^ ވl&̂u*#+kXn0q<ݡac##՘;!kNh :4\F5EV1 .`23>AѬʍ'A'Exh[2'Fit#+#R\M|@{] 15vITRU%&qLD$m08c@Fl)"$0Q7@P(te&!GV$#+,4EÓ9i1ES.JĢKBS".Ynn^FJ#+!Ch#.FlJcXR (!Q#`3 Y04%[:fcIsXsi(kM}P1aB7IR#&l (+Mihuڊmē{=l'M`1TPd#thAlD#Ih7#&5ө+x Lb`"#+enl#+#+ :IH?mR*$6!$MA#. Xejt~(6е6$!AMD#.M'O3^Y'`yO]j#.ohAM.vA+#+A_y#&uѥ̄(@.<"H, `+rнq= <#.G!MtY 4PXd ? etMB5XC1ր%&nuo滝lF۫Bҍ`"!!YMD`Q3s27" v ne%4#+0'U;57eRhcG.tD##+#.o7>Q!w.5\]OĴrA^fD6di~\*8s}Ё'ۇ6zm9jdWN"&YԼáࡆXC0i5x꘍q2WB!k@Zv~'^~5~O+4#.la;?PՈzuh&#p">!e9|'co3M"Aas7D@dX "WW;Jyڃ8B|#&'w[]m:"D{}l=هJ'9 ۉdbN.`st](I,I!U6$hZjF}|x5'(i,Ц$"043{#+t S#.BNc-QU? U3R\/;_>wuںY=nQZa-$2!aHʹ,o^*GJ-i-#&w!T,Bc_qKr,iA!¦HP;dQPzSOPy< ;& D"7#(Z*R#&z?ɄLBP"))Nb4]$CA=JU>2"L?tB}Ju3h(w%2W9R%E R EJ#&J$Wʅm.!OK!#& "!&4VmKj,X(RGAN$ 38D- ?OPm^<~k̂`SQD2vp#&J8$"&fBݦԫ!̞A:)zf͋R  B_қdFQT)EFL64DЩL66VZkU6FTU*YB#`/qY#&QkQ,ArcIs0& cPyVXGicUaErhI#&J#.kE V"&"#+Xq5m0dSTh ={y1-\pbGp#LbQ1vNҊ27rer2%r.;ĂkipYPwXi(b\{}8!lLjgoD4׆cZD#.dVo馛yztA$ &3$9Rrnr():)*7,"Ȁ ҇Nڣ{5]0 Yн+;9iNjB  Ev[Ϟu#+qD@:P{K`gcMk"@f9PՆ=_q"#$P[@h3Vơ&=y|ػW)Ʈe]WXۛskMkx^Zުأm~+fEjZ6#.6ǩ" b+H0*"((T +~=6mf#&wn!4@BXNl-DZ, <ℊ J& ) 揫T1)Uʷg uHiJA4;&u*1`nB}08[$VtL4*$#+Dw֚*Dd\$  M%@'٬8hsnJgt SNp(5Qh#_}[^s&yT|1 =#&l~A"pm!ϋ/0~=#&lno`n齴#ʬg?-B8dDX2FDUoq+aQp%-TgfzXg=ܧ..Q9s}0BևGs#&ˉ}4EE)1,THwW:NI=$=W 'Hfx-j-+FtUTT^5y#&$#&yfΔGdD2*6RmEl)6JRaVY&EV)-*H&LYf)T*iYL(͌Dli ҙ%5,AR,b~uŘhI H?aWaPz0{a׼rܨ>=ϺoWM5ÂynøEx9LRaO$ $: Ί|eH16j&4N3G#+$AI+'q`n+׭NYD\/XMD{G=<Ч##.%e-:hM/tvefs/XXڒMh+Z~vWF#m.@hXEHR]RXX*L !^#>%JLWmM)s:Qji2X5:2:2td-v!TQ .ʖ hQc#&6<H[p#.3UP@0|,5#`9Sd.{ndQ-ǢZeMgKM Ƃq$A22+F6%;f{q ɇd8oTʐ'zgqTWLĨF#+|G Wwe_LaJR7̀ta E.<\BQ$,eͬ9,.c!I$~;$i`#JQHL32Ayh "ovzޕͻNmIGpؘHQY <#.Xc_OА1t'~b#+FـY&H{(XJV,gH@=y(Y47o@18coPдRW1YЙѾ6@qKo`/@RC疎S'r)L>'7rJ[=LSC;k$X Q@+^*ihEeX<h>_C/d0N~$;\zT"2˾zVciD{LoZܛ.o=#+)#&dOܭrʀtZe>6j$ivCݷNYS7<,Ya3Nb޺9!e;6$\ҙs\F,E*vzg'JTڪ8͎NI$fmqN͛zU!f.NQ0jQ8sm-#rT OCXy]l<,/AT蟚b4T _,Q1A0U43Z!%聤C;KO ,04-0Bdbv˱\mi[:S9p0Q#41JY$m8/ QlJf8tn?Wf9L9Mb.%/u<@a&'Vjw3"q3зlAXՋ|fB&ph]iKw#.(L%I v4e'Mp=R|M#+BUK9IaƷ)F3QxK ~_)),w|p=',I3ï$[yI2#viWm@v7:!f s-t0@ح\bU#+%7ьXbPj%nr -cm0T8!P8EHY E)Pdǔ a`."G&7!mq3!IJc0 5o4BEBM9c)"#+X]Q* H9]cr :D!#.EMrC 鐴n$w $D !abrđC"#+T=!Dz\v\EcVXIN{{n> *l I!'xr1uw8HE\e-Rm#."!ٿCy#+.k:/K<1J d6r۔>j[L SvEJ+p񄄹3#+4"C!CD^Հ颙S bcy;yr\gI3Ȳ`MqAUw\_MZ_7;<E6,vz%Sʖ,E8X3բ0I^v)tN6DT1#+ Oo %CE}G CnetN>Q,Jy:< !420FGBR42A :Pc f4b)dX*X25yI5u;^ner:'uz$n@Z@64af*4@3P$D-ʨL9Bl2#.,530!C}aڞ ߮1G < =y|eb4΃>v1"`HZ*.Ar^pfHѯ&bPq(>D:9H# '`6OB/3GӬf}!H* C@|)d#<_FdsYxA=FUrYT11-tb&X{#dHjQXntt&}9I*z#9@yf.r|0r5 $T`E;WH}rA[F"mm1[JWR+R[IZcjI&cB"^Q#&ų,+QR.(D_IbhC_-'jU4mR @;g:R#&Z(9\bR YY@f>[s0g#&2Ux{7&:[!$) 4a#.% ENU˓,*4v,]oh.Xk25v[NC:*`\ol}}i-9@T~il{k#62j3[6-SYiB$,xE"~{o`{?.$|cG.В7?۰B2 >R H(Vv4cE*'!.+b(UA*|D>½t`ϖfc?.G]#+I#+25;gU{`ݦRa4chB~!HS BEt"-s[ ^k++;Yrf DV v9[68=&f"R\NYkG/u#+"Ij2f#.H&B{!\O&pVs1FS4X\ {)H$y2P?Lc*rU4Qb%#& hKZX34/x\;NR,hT#*]bA4_MZέ,1vdCNH[ѨTFojNm:L#OhNԹզ8 jwDyZaA!Y2˥:BX+Ճ@#.4#&9CyxC̿rcm~HK@g#+nުhc{C*gwUI90fƶٮ35Yw7%a2uV)@KhJQV"&iq8Tpq/M#+.6Le`P)4t!GS38>\췳˲S;e8kL{෌;[p#%?`1h8rْc,@шlyf-y fC)9,G Kb,ѿt]Û;-7!Mw׎SQ"2)MӺIgݰd ٹ. gڱDu -f䊡 5D=dQS\O!wbXG 됿`d3#&RM! fhZ֥$RU&FehR#&(؂O:BX#$EUa(PA0!<R**R=(NEuC B,κzq e󯪤{0i%!~<91R#oVم]&~U2 J3T},\ZGK}A^~`N"t?9G!*@4S#+!M>rll#.Opell2YkXZ~^ZMn! $#+Q0;Je6׫o-)᪼Z(hIC}P7eETq7}y)QCā$P.#. n4eX=Eǩ"{RIHL%Vt-f50&ݧ"ݽ9LaZ~h{nxC3)<~߹4@I;$#.SFəb$@ΓSRwG$'oH. + +Several major versions can be installed in parallel. The shared library name, +include directory, and pkg-config file are suffixed with the major version +number. For example, a library named "foo" at version 1.x.y might install: -The --prefix option (or the PREFIX environment variable) can be used to change -the prefix which all files are installed under. There are also several options -allowing for more fine-tuned control, see the --help output for details. + /usr/include/foo-1/foo/foo.h + /usr/lib/foo-1.so.1.x.y + /usr/lib/pkgconfig/foo-1.pc + +Dependencies can check for the package "foo-1" with pkg-config. Packaging --------- @@ -57,3 +61,6 @@ which adds a prefix to all install paths. For example: ./waf configure --prefix=/usr ./waf ./waf install --destdir=/tmp/package + +Packages should allow parallel installation of several major versions. For +example, the above would be packaged as "foo-1". \ No newline at end of file diff --git a/source/modules/lilv/lilv-0.21.3/NEWS b/source/modules/lilv/lilv-0.22.1/NEWS similarity index 94% rename from source/modules/lilv/lilv-0.21.3/NEWS rename to source/modules/lilv/lilv-0.22.1/NEWS index 69628d350..df34da86f 100644 --- a/source/modules/lilv/lilv-0.21.3/NEWS +++ b/source/modules/lilv/lilv-0.22.1/NEWS @@ -1,4 +1,10 @@ -lilv (0.21.3) unstable; +lilv (0.22.1) unstable; + + * Fix Python bindings + + -- David Robillard Fri, 09 Oct 2015 13:01:14 -0400 + +lilv (0.22.0) stable; * Fix loading files with spaces in their path * Add lilv_file_uri_parse() for correct URI to path conversion @@ -6,6 +12,7 @@ lilv (0.21.3) unstable; * Add lilv_state_emit_port_values() for special port value handling * Add lilv_state_get_uri() * Add lilv_state_delete() for deleting user saved presets + * Add lilv_free() for systems picky about such things * Fix lilv_world_ask() to work with wildcards * Fix creation of duplicate manifest entries when saving state * Fix bindings for Python 3 @@ -16,10 +23,13 @@ lilv (0.21.3) unstable; * Preserve absolute paths in state if no link directory is given * Fix a few minor/unlikely memory errors * Configure based on compiler target OS for cross-compilation + * Fix lilv_realpath() on pre-POSIX-2008 systems + * Fix directory walking on some systems (thanks Matt Fischer) * Windows fixes (thanks John Emmas) * Minor documentation improvements + * Upgrade to waf 1.8.14 - -- David Robillard Mon, 16 Mar 2015 03:24:05 -0400 + -- David Robillard Thu, 08 Oct 2015 15:39:29 -0400 lilv (0.20.0) stable; diff --git a/source/modules/lilv/lilv-0.21.3/README b/source/modules/lilv/lilv-0.22.1/README similarity index 100% rename from source/modules/lilv/lilv-0.21.3/README rename to source/modules/lilv/lilv-0.22.1/README diff --git a/source/modules/lilv/lilv-0.21.3/bindings/lilv.i b/source/modules/lilv/lilv-0.22.1/bindings/lilv.i similarity index 93% rename from source/modules/lilv/lilv-0.21.3/bindings/lilv.i rename to source/modules/lilv/lilv-0.22.1/bindings/lilv.i index 8bbdd3fe0..f6254a736 100644 --- a/source/modules/lilv/lilv-0.21.3/bindings/lilv.i +++ b/source/modules/lilv/lilv-0.22.1/bindings/lilv.i @@ -40,6 +40,10 @@ namespace Lilv { self.iter = self.plugins.next(self.iter) return plugin + def next(self): + "Python 2 iterator protocol" + return Iterator.__next__(self) + return Iterator(self) def get_by_uri(self, *args): diff --git a/source/modules/lilv/lilv-0.21.3/bindings/numpy.i b/source/modules/lilv/lilv-0.22.1/bindings/numpy.i similarity index 100% rename from source/modules/lilv/lilv-0.21.3/bindings/numpy.i rename to source/modules/lilv/lilv-0.22.1/bindings/numpy.i diff --git a/source/modules/lilv/lilv-0.21.3/bindings/python/lv2_apply.py b/source/modules/lilv/lilv-0.22.1/bindings/python/lv2_apply.py similarity index 100% rename from source/modules/lilv/lilv-0.21.3/bindings/python/lv2_apply.py rename to source/modules/lilv/lilv-0.22.1/bindings/python/lv2_apply.py diff --git a/source/modules/lilv/lilv-0.21.3/bindings/python/lv2_list.py b/source/modules/lilv/lilv-0.22.1/bindings/python/lv2_list.py similarity index 100% rename from source/modules/lilv/lilv-0.21.3/bindings/python/lv2_list.py rename to source/modules/lilv/lilv-0.22.1/bindings/python/lv2_list.py diff --git a/source/modules/lilv/lilv-0.21.3/bindings/test/bindings_test_plugin.c b/source/modules/lilv/lilv-0.22.1/bindings/test/bindings_test_plugin.c similarity index 100% rename from source/modules/lilv/lilv-0.21.3/bindings/test/bindings_test_plugin.c rename to source/modules/lilv/lilv-0.22.1/bindings/test/bindings_test_plugin.c diff --git a/source/modules/lilv/lilv-0.21.3/bindings/test/bindings_test_plugin.ttl.in b/source/modules/lilv/lilv-0.22.1/bindings/test/bindings_test_plugin.ttl.in similarity index 100% rename from source/modules/lilv/lilv-0.21.3/bindings/test/bindings_test_plugin.ttl.in rename to source/modules/lilv/lilv-0.22.1/bindings/test/bindings_test_plugin.ttl.in diff --git a/source/modules/lilv/lilv-0.21.3/bindings/test/manifest.ttl.in b/source/modules/lilv/lilv-0.22.1/bindings/test/manifest.ttl.in similarity index 100% rename from source/modules/lilv/lilv-0.21.3/bindings/test/manifest.ttl.in rename to source/modules/lilv/lilv-0.22.1/bindings/test/manifest.ttl.in diff --git a/source/modules/lilv/lilv-0.21.3/bindings/test/python/test_api.py b/source/modules/lilv/lilv-0.22.1/bindings/test/python/test_api.py similarity index 100% rename from source/modules/lilv/lilv-0.21.3/bindings/test/python/test_api.py rename to source/modules/lilv/lilv-0.22.1/bindings/test/python/test_api.py diff --git a/source/modules/lilv/lilv-0.21.3/bindings/test/python/test_api_mm.py b/source/modules/lilv/lilv-0.22.1/bindings/test/python/test_api_mm.py similarity index 100% rename from source/modules/lilv/lilv-0.21.3/bindings/test/python/test_api_mm.py rename to source/modules/lilv/lilv-0.22.1/bindings/test/python/test_api_mm.py diff --git a/source/modules/lilv/lilv-0.21.3/doc/layout.xml b/source/modules/lilv/lilv-0.22.1/doc/layout.xml similarity index 100% rename from source/modules/lilv/lilv-0.21.3/doc/layout.xml rename to source/modules/lilv/lilv-0.22.1/doc/layout.xml diff --git a/source/modules/lilv/lilv-0.21.3/doc/lv2info.1 b/source/modules/lilv/lilv-0.22.1/doc/lv2info.1 similarity index 100% rename from source/modules/lilv/lilv-0.21.3/doc/lv2info.1 rename to source/modules/lilv/lilv-0.22.1/doc/lv2info.1 diff --git a/source/modules/lilv/lilv-0.21.3/doc/lv2ls.1 b/source/modules/lilv/lilv-0.22.1/doc/lv2ls.1 similarity index 100% rename from source/modules/lilv/lilv-0.21.3/doc/lv2ls.1 rename to source/modules/lilv/lilv-0.22.1/doc/lv2ls.1 diff --git a/source/modules/lilv/lilv-0.21.3/doc/reference.doxygen.in b/source/modules/lilv/lilv-0.22.1/doc/reference.doxygen.in similarity index 99% rename from source/modules/lilv/lilv-0.21.3/doc/reference.doxygen.in rename to source/modules/lilv/lilv-0.22.1/doc/reference.doxygen.in index 87cd78119..3366dfb9a 100644 --- a/source/modules/lilv/lilv-0.21.3/doc/reference.doxygen.in +++ b/source/modules/lilv/lilv-0.22.1/doc/reference.doxygen.in @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = @LILV_DOC_DIR@ +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 diff --git a/source/modules/lilv/lilv-0.21.3/doc/style.css b/source/modules/lilv/lilv-0.22.1/doc/style.css similarity index 100% rename from source/modules/lilv/lilv-0.21.3/doc/style.css rename to source/modules/lilv/lilv-0.22.1/doc/style.css diff --git a/source/modules/lilv/lilv-0.21.3/lilv.pc.in b/source/modules/lilv/lilv-0.22.1/lilv.pc.in similarity index 76% rename from source/modules/lilv/lilv-0.21.3/lilv.pc.in rename to source/modules/lilv/lilv-0.22.1/lilv.pc.in index 47f70385b..1f3b57d1b 100644 --- a/source/modules/lilv/lilv-0.21.3/lilv.pc.in +++ b/source/modules/lilv/lilv-0.22.1/lilv.pc.in @@ -7,5 +7,5 @@ Name: Lilv Version: @LILV_VERSION@ Description: Simple C library for hosting LV2 plugins Requires: lv2 @PKG_serd_0@ @PKG_sord_0@ @PKG_sratom_0@ -Libs: -L${libdir} -l@LIB_LILV@ @LILV_PKG_LIBS@ -lsratom-0 -lsord-0 -lserd-0 -lm -ldl +Libs: -L${libdir} -l@LIB_LILV@ @LILV_PKG_LIBS@ Cflags: -I${includedir}/lilv-@LILV_MAJOR_VERSION@ diff --git a/source/modules/lilv/lilv-0.21.3/lilv/lilv.h b/source/modules/lilv/lilv-0.22.1/lilv/lilv.h similarity index 97% rename from source/modules/lilv/lilv-0.21.3/lilv/lilv.h rename to source/modules/lilv/lilv-0.22.1/lilv/lilv.h index 84223c59b..27ed6d09d 100644 --- a/source/modules/lilv/lilv-0.21.3/lilv/lilv.h +++ b/source/modules/lilv/lilv-0.22.1/lilv/lilv.h @@ -26,9 +26,8 @@ #include #include -#include "lv2/lv2.h" -#include "lv2/state.h" -#include "lv2/urid.h" +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" +#include "lv2/lv2plug.in/ns/ext/urid/urid.h" #ifdef LILV_SHARED # ifdef _WIN32 @@ -101,6 +100,16 @@ typedef void LilvNodes; /**< set. */ @{ */ +/** + Free memory allocated by Lilv. + + This function exists because some systems require memory allocated by a + library to be freed by code in the same library. It is otherwise equivalent + to the standard C free() function. +*/ +LILV_API void +lilv_free(void* ptr); + /** @name Node @{ @@ -120,7 +129,7 @@ lilv_uri_to_path(const char* uri); /** Convert a file URI string to a local path string. For example, "file://foo/bar%20one/baz.ttl" returns "/foo/bar one/baz.ttl". - Return value must be freed by caller. + Return value must be freed by caller with lilv_free(). @param uri The file URI to parse. @param hostname If non-NULL, set to the hostname in the URI, if any. @return `uri` converted to a path, or NULL on failure (URI is not local). @@ -197,7 +206,7 @@ lilv_node_equals(const LilvNode* value, const LilvNode* other); /** Return this value as a Turtle/SPARQL token. - Returned value must be freed by caller with free(). + Returned value must be freed by caller with lilv_free(). @@ -262,7 +271,7 @@ lilv_node_as_string(const LilvNode* value); /** Return the path of a file URI node. Returns NULL if `value` is not a file URI. - Returned value must be freed by caller. + Returned value must be freed by caller with lilv_free(). */ LILV_API char* lilv_node_get_path(const LilvNode* value, char** hostname); @@ -553,7 +562,7 @@ lilv_world_free(LilvWorld* world); with special plugin bundles which are installed to a known location). */ LILV_API void -lilv_world_load_all(LilvWorld* world, const char* lv2_path); +lilv_world_load_all(LilvWorld* world); /** Load a specific bundle. @@ -1200,9 +1209,9 @@ lilv_port_get_scale_points(const LilvPlugin* plugin, @return A new LilvState which must be freed with lilv_state_free(), or NULL. */ LILV_API LilvState* -lilv_state_new_from_world(LilvWorld* world, - const LV2_URID_Map* map, - const LilvNode* subject); +lilv_state_new_from_world(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* subject); /** Load a state snapshot from a file. @@ -1220,18 +1229,18 @@ lilv_state_new_from_world(LilvWorld* world, new memory consumed once this function returns. */ LILV_API LilvState* -lilv_state_new_from_file(LilvWorld* world, - const LV2_URID_Map* map, - const LilvNode* subject, - const char* path); +lilv_state_new_from_file(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* subject, + const char* path); /** Load a state snapshot from a string made by lilv_state_to_string(). */ LILV_API LilvState* -lilv_state_new_from_string(LilvWorld* world, - const LV2_URID_Map* map, - const char* str); +lilv_state_new_from_string(LilvWorld* world, + LV2_URID_Map* map, + const char* str); /** Function to get a port value. @@ -1426,8 +1435,7 @@ lilv_state_emit_port_values(const LilvState* state, */ LILV_API void lilv_state_restore(const LilvState* state, - const LV2_State_Interface* iface, - LV2_Handle handle, + LilvInstance* instance, LilvSetPortValueFunc set_value, void* user_data, uint32_t flags, @@ -1787,42 +1795,6 @@ lilv_ui_get_bundle_uri(const LilvUI* ui); LILV_API const LilvNode* lilv_ui_get_binary_uri(const LilvUI* ui); -/** - Custom calls -*/ -LILV_API LilvNode* -lilv_plugin_get_modgui_resources_directory(const LilvPlugin* plugin); - -LILV_API LilvNode* -lilv_plugin_get_modgui_stylesheet(const LilvPlugin* plugin); - -LILV_API LilvNode* -lilv_plugin_get_modgui_icon_template(const LilvPlugin* plugin); - -LILV_API LilvNode* -lilv_plugin_get_modgui_settings_template(const LilvPlugin* plugin); - -LILV_API LilvNode* -lilv_plugin_get_modgui_template_data(const LilvPlugin* plugin); - -LILV_API LilvNode* -lilv_plugin_get_modgui_screenshot(const LilvPlugin* plugin); - -LILV_API LilvNode* -lilv_plugin_get_modgui_thumbnail(const LilvPlugin* plugin); - -LILV_API const LilvNodes* -lilv_ui_get_supported_features(const LilvUI* ui); - -LILV_API const LilvNodes* -lilv_ui_get_required_features(const LilvUI* ui); - -LILV_API const LilvNodes* -lilv_ui_get_optional_features(const LilvUI* ui); - -LILV_API const LilvNodes* -lilv_ui_get_extension_data(const LilvUI* ui); - /** @} @} diff --git a/source/modules/lilv/lilv-0.21.3/lilv/lilvmm.hpp b/source/modules/lilv/lilv-0.22.1/lilv/lilvmm.hpp similarity index 77% rename from source/modules/lilv/lilv-0.21.3/lilv/lilvmm.hpp rename to source/modules/lilv/lilv-0.22.1/lilv/lilvmm.hpp index 1f67e8176..b9b3a696b 100644 --- a/source/modules/lilv/lilv-0.21.3/lilv/lilvmm.hpp +++ b/source/modules/lilv/lilv-0.22.1/lilv/lilvmm.hpp @@ -17,8 +17,6 @@ #ifndef LILV_LILVMM_HPP #define LILV_LILVMM_HPP -#include "CarlaDefines.h" - #include "lilv/lilv.h" #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) @@ -29,12 +27,14 @@ namespace Lilv { +static inline const char* +uri_to_path(const char* uri) { + return lilv_uri_to_path(uri); +} + #define LILV_WRAP0(RT, prefix, name) \ inline RT name() { return lilv_ ## prefix ## _ ## name (me); } -#define LILV_WRAP0_CONST(RT, prefix, name) \ - inline RT name() const { return lilv_ ## prefix ## _ ## name (me); } - #define LILV_WRAP0_VOID(prefix, name) \ inline void name() { lilv_ ## prefix ## _ ## name(me); } @@ -65,7 +65,6 @@ namespace Lilv { #endif struct Node { - inline Node(LilvNode* node) : me(node) {} inline Node(const LilvNode* node) : me(lilv_node_duplicate(node)) {} inline Node(const Node& copy) : me(lilv_node_duplicate(copy.me)) {} @@ -79,26 +78,20 @@ struct Node { LILV_WRAP_CONVERSION(LilvNode); - LILV_WRAP0_CONST(char*, node, get_turtle_token); - LILV_WRAP0_CONST(bool, node, is_uri); - LILV_WRAP0_CONST(const char*, node, as_uri); - LILV_WRAP0_CONST(bool, node, is_blank); - LILV_WRAP0_CONST(const char*, node, as_blank); - LILV_WRAP0_CONST(bool, node, is_literal); - LILV_WRAP0_CONST(bool, node, is_string); - LILV_WRAP0_CONST(const char*, node, as_string); - LILV_WRAP0_CONST(bool, node, is_float); - LILV_WRAP0_CONST(float, node, as_float); - LILV_WRAP0_CONST(bool, node, is_int); - LILV_WRAP0_CONST(int, node, as_int); - LILV_WRAP0_CONST(bool, node, is_bool); - LILV_WRAP0_CONST(bool, node, as_bool); - - Node& operator=(const Node& copy) { - lilv_node_free(me); - me = lilv_node_duplicate(copy.me); - return *this; - } + LILV_WRAP0(char*, node, get_turtle_token); + LILV_WRAP0(bool, node, is_uri); + LILV_WRAP0(const char*, node, as_uri); + LILV_WRAP0(bool, node, is_blank); + LILV_WRAP0(const char*, node, as_blank); + LILV_WRAP0(bool, node, is_literal); + LILV_WRAP0(bool, node, is_string); + LILV_WRAP0(const char*, node, as_string); + LILV_WRAP0(bool, node, is_float); + LILV_WRAP0(float, node, as_float); + LILV_WRAP0(bool, node, is_int); + LILV_WRAP0(int, node, as_int); + LILV_WRAP0(bool, node, is_bool); + LILV_WRAP0(bool, node, as_bool); LilvNode* me; }; @@ -133,7 +126,7 @@ struct PluginClass { LILV_WRAP0(LilvIter*, prefix, begin); \ LILV_WRAP1(LilvIter*, prefix, next, LilvIter*, i); \ LILV_WRAP1(bool, prefix, is_end, LilvIter*, i); \ - const Lilv ## CT* me + const Lilv ## CT* me; \ struct PluginClasses { LILV_WRAP_COLL(PluginClasses, PluginClass, plugin_classes); @@ -148,24 +141,22 @@ struct ScalePoints { struct Nodes { LILV_WRAP_COLL(Nodes, Node, nodes); LILV_WRAP1(bool, nodes, contains, const Node, node); - - inline Node get_first() const { - return Node((const LilvNode*)lilv_nodes_get_first(me)); - } + LILV_WRAP0(Node, nodes, get_first); }; struct UI { inline UI(const LilvUI* c_obj) : me(c_obj) {} LILV_WRAP_CONVERSION(const LilvUI); - LILV_WRAP0(Node, ui, get_uri); - LILV_WRAP1(bool, ui, is_a, LilvNode*, ui_class); - LILV_WRAP0(Node, ui, get_bundle_uri); - LILV_WRAP0(Node, ui, get_binary_uri); - LILV_WRAP0(Nodes, ui, get_supported_features); - LILV_WRAP0(Nodes, ui, get_required_features); - LILV_WRAP0(Nodes, ui, get_optional_features); - LILV_WRAP0(Nodes, ui, get_extension_data); + LILV_WRAP0(const LilvNode*, ui, get_uri); + LILV_WRAP0(const LilvNode*, ui, get_bundle_uri); + LILV_WRAP0(const LilvNode*, ui, get_binary_uri); + LILV_WRAP0(const LilvNodes*, ui, get_classes); + /*LILV_WRAP3(bool, ui, is_supported, + LilvUISupportedFunc, supported_func, + const LilvNode*, container_type, + const LilvNode**, ui_type);*/ + LILV_WRAP1(bool, ui, is_a, const LilvNode*, class_uri); const LilvUI* me; }; @@ -229,13 +220,6 @@ struct Plugin { LILV_WRAP0(Nodes, plugin, get_extension_data); LILV_WRAP0(UIs, plugin, get_uis); LILV_WRAP1(Nodes, plugin, get_related, Node, type); - LILV_WRAP0(Node, plugin, get_modgui_resources_directory); - LILV_WRAP0(Node, plugin, get_modgui_stylesheet); - LILV_WRAP0(Node, plugin, get_modgui_icon_template); - LILV_WRAP0(Node, plugin, get_modgui_settings_template); - LILV_WRAP0(Node, plugin, get_modgui_template_data); - LILV_WRAP0(Node, plugin, get_modgui_screenshot); - LILV_WRAP0(Node, plugin, get_modgui_thumbnail); inline Port get_port_by_index(unsigned index) { return Port(me, lilv_plugin_get_port_by_index(me, index)); @@ -275,13 +259,15 @@ struct Instance { inline Instance(LilvInstance* instance) : me(instance) {} LILV_DEPRECATED - inline Instance(Plugin plugin, double sample_rate) - : me(lilv_plugin_instantiate(plugin, sample_rate, NULL)) {} + inline Instance(Plugin plugin, double sample_rate) { + me = lilv_plugin_instantiate(plugin, sample_rate, NULL); + } LILV_DEPRECATED inline Instance(Plugin plugin, double sample_rate, - LV2_Feature* const* features) - : me(lilv_plugin_instantiate(plugin, sample_rate, features)) {} + LV2_Feature* const* features) { + me = lilv_plugin_instantiate(plugin, sample_rate, features); + } static inline Instance* create(Plugin plugin, double sample_rate, @@ -318,25 +304,22 @@ struct Instance { }; struct World { - inline World() : me(lilv_world_new()) {} - inline virtual ~World() { lilv_world_free(me); } + inline World() : me(lilv_world_new()) {} + inline ~World() { lilv_world_free(me); } - inline LilvNode* new_uri(const char* uri) const { + inline LilvNode* new_uri(const char* uri) { return lilv_new_uri(me, uri); } - inline LilvNode* new_file_uri(const char* host, const char* path) const { - return lilv_new_file_uri(me, host, path); - } - inline LilvNode* new_string(const char* str) const { + inline LilvNode* new_string(const char* str) { return lilv_new_string(me, str); } - inline LilvNode* new_int(int val) const { + inline LilvNode* new_int(int val) { return lilv_new_int(me, val); } - inline LilvNode* new_float(float val) const { + inline LilvNode* new_float(float val) { return lilv_new_float(me, val); } - inline LilvNode* new_bool(bool val) const { + inline LilvNode* new_bool(bool val) { return lilv_new_bool(me, val); } inline Nodes find_nodes(const LilvNode* subject, @@ -346,7 +329,7 @@ struct World { } LILV_WRAP2_VOID(world, set_option, const char*, uri, LilvNode*, value); - LILV_WRAP1_VOID(world, load_all, const char*, lv2_path); + LILV_WRAP0_VOID(world, load_all); LILV_WRAP1_VOID(world, load_bundle, LilvNode*, bundle_uri); LILV_WRAP0(const LilvPluginClass*, world, get_plugin_class); LILV_WRAP0(const LilvPluginClasses*, world, get_plugin_classes); @@ -354,8 +337,6 @@ struct World { LILV_WRAP1(int, world, load_resource, const LilvNode*, resource); LilvWorld* me; - - CARLA_DECLARE_NON_COPY_STRUCT(World) }; } /* namespace Lilv */ diff --git a/source/modules/lilv/lilv-0.21.3/src/collections.c b/source/modules/lilv/lilv-0.22.1/src/collections.c similarity index 100% rename from source/modules/lilv/lilv-0.21.3/src/collections.c rename to source/modules/lilv/lilv-0.22.1/src/collections.c diff --git a/source/modules/lilv/lilv-0.21.3/src/instance.c b/source/modules/lilv/lilv-0.22.1/src/instance.c similarity index 96% rename from source/modules/lilv/lilv-0.21.3/src/instance.c rename to source/modules/lilv/lilv-0.22.1/src/instance.c index 80bbb9992..5092dcd0f 100644 --- a/source/modules/lilv/lilv-0.21.3/src/instance.c +++ b/source/modules/lilv/lilv-0.22.1/src/instance.c @@ -1,5 +1,5 @@ /* - Copyright 2007-2014 David Robillard + Copyright 2007-2015 David Robillard Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include #include #include #include @@ -38,7 +37,7 @@ lilv_plugin_instantiate(const LilvPlugin* plugin, LilvLib* lib = lilv_lib_open(plugin->world, lib_uri, bundle_path, features); if (!lib) { - free(bundle_path); + lilv_free(bundle_path); return NULL; } @@ -47,7 +46,7 @@ lilv_plugin_instantiate(const LilvPlugin* plugin, SerdURI base_uri; if (serd_uri_parse((const uint8_t*)bundle_uri_str, &base_uri)) { lilv_lib_close(lib); - free(bundle_path); + lilv_free(bundle_path); return NULL; } @@ -95,7 +94,7 @@ lilv_plugin_instantiate(const LilvPlugin* plugin, } free(local_features); - free(bundle_path); + lilv_free(bundle_path); if (result) { // Failed to instantiate diff --git a/source/modules/lilv/lilv-0.21.3/src/lib.c b/source/modules/lilv/lilv-0.22.1/src/lib.c similarity index 97% rename from source/modules/lilv/lilv-0.21.3/src/lib.c rename to source/modules/lilv/lilv-0.22.1/src/lib.c index ddf3d8e57..77d3d2271 100644 --- a/source/modules/lilv/lilv-0.21.3/src/lib.c +++ b/source/modules/lilv/lilv-0.22.1/src/lib.c @@ -42,7 +42,7 @@ lilv_lib_open(LilvWorld* world, void* lib = dlopen(lib_path, RTLD_NOW); if (!lib) { LILV_ERRORF("Failed to open library %s (%s)\n", lib_path, dlerror()); - free(lib_path); + lilv_free(lib_path); return NULL; } @@ -57,17 +57,17 @@ lilv_lib_open(LilvWorld* world, desc = ldf(bundle_path, features); if (!desc) { LILV_ERRORF("Call to `lv2_lib_descriptor' in %s failed\n", lib_path); - free(lib_path); + lilv_free(lib_path); return NULL; } } else if (!df) { LILV_ERRORF("No `lv2_descriptor' or `lv2_lib_descriptor' in %s\n", lib_path); dlclose(lib); - free(lib_path); + lilv_free(lib_path); return NULL; } - free(lib_path); + lilv_free(lib_path); LilvLib* llib = (LilvLib*)malloc(sizeof(LilvLib)); llib->world = world; diff --git a/source/modules/lilv/lilv-0.21.3/src/lilv_internal.h b/source/modules/lilv/lilv-0.22.1/src/lilv_internal.h similarity index 98% rename from source/modules/lilv/lilv-0.21.3/src/lilv_internal.h rename to source/modules/lilv/lilv-0.22.1/src/lilv_internal.h index 4d0a8e5d8..15b00dca5 100644 --- a/source/modules/lilv/lilv-0.21.3/src/lilv_internal.h +++ b/source/modules/lilv/lilv-0.22.1/src/lilv_internal.h @@ -28,16 +28,21 @@ extern "C" { #ifdef _WIN32 # include +# include # define dlopen(path, flags) LoadLibrary(path) # define dlclose(lib) FreeLibrary((HMODULE)lib) # define unlink(path) _unlink(path) # define rmdir(path) _rmdir(path) # ifdef _MSC_VER # define __func__ __FUNCTION__ -# define INFINITY DBL_MAX + DBL_MAX -# define NAN INFINITY - INFINITY # define snprintf _snprintf # endif +#ifndef INFINITY +# define INFINITY DBL_MAX + DBL_MAX +#endif +#ifndef NAN +# define NAN INFINITY - INFINITY +#endif static inline char* dlerror(void) { return "Unknown error"; } #else # include @@ -53,7 +58,7 @@ static inline char* dlerror(void) { return "Unknown error"; } #include "lilv/lilv.h" #ifdef LILV_DYN_MANIFEST -# include "lv2/dynmanifest.h" +# include "lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h" #endif /* diff --git a/source/modules/lilv/lilv-0.21.3/src/node.c b/source/modules/lilv/lilv-0.22.1/src/node.c similarity index 97% rename from source/modules/lilv/lilv-0.21.3/src/node.c rename to source/modules/lilv/lilv-0.22.1/src/node.c index d745adb25..575d3f0e1 100644 --- a/source/modules/lilv/lilv-0.21.3/src/node.c +++ b/source/modules/lilv/lilv-0.22.1/src/node.c @@ -1,5 +1,5 @@ /* - Copyright 2007-2014 David Robillard + Copyright 2007-2015 David Robillard Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include +#include #include #include @@ -140,8 +140,6 @@ lilv_node_new_from_node(LilvWorld* world, const SordNode* node) world, type, (const char*)sord_node_get_string_counted(node, &len)); lilv_node_set_numerics_from_string(result, len); break; - default: - assert(false); } return result; @@ -327,6 +325,7 @@ lilv_node_is_literal(const LilvNode* value) case LILV_VALUE_STRING: case LILV_VALUE_INT: case LILV_VALUE_FLOAT: + case LILV_VALUE_BLOB: return true; default: return false; @@ -366,12 +365,12 @@ lilv_node_is_float(const LilvNode* value) LILV_API float lilv_node_as_float(const LilvNode* value) { - assert(lilv_node_is_float(value) || lilv_node_is_int(value)); if (lilv_node_is_float(value)) { return value->val.float_val; - } else { // lilv_node_is_int(value) + } else if (lilv_node_is_int(value)) { return (float)value->val.int_val; } + return NAN; } LILV_API bool diff --git a/source/modules/lilv/lilv-0.21.3/src/plugin.c b/source/modules/lilv/lilv-0.22.1/src/plugin.c similarity index 87% rename from source/modules/lilv/lilv-0.21.3/src/plugin.c rename to source/modules/lilv/lilv-0.22.1/src/plugin.c index d825192ce..bf0843b05 100644 --- a/source/modules/lilv/lilv-0.21.3/src/plugin.c +++ b/source/modules/lilv/lilv-0.22.1/src/plugin.c @@ -27,11 +27,10 @@ #include "lilv_config.h" #include "lilv_internal.h" -#include "lv2/ui.h" +#include "lv2/lv2plug.in/ns/extensions/ui/ui.h" #define NS_DOAP (const uint8_t*)"http://usefulinc.com/ns/doap#" #define NS_FOAF (const uint8_t*)"http://xmlns.com/foaf/0.1/" -#define NS_MOD (const uint8_t*)"http://moddevices.com/ns/modgui#" /** Ownership of `uri` is taken */ LilvPlugin* @@ -909,131 +908,6 @@ lilv_plugin_get_author_homepage(const LilvPlugin* plugin) return NULL; } -static const SordNode* -lilv_plugin_get_modgui(const LilvPlugin* p) -{ - lilv_plugin_load_if_necessary(p); - - SordNode* mod_gui = sord_new_uri( - p->world->world, NS_MOD "gui"); - - SordIter* gui = lilv_world_query_internal( - p->world, - p->plugin_uri->node, - mod_gui, - NULL); - - sord_node_free(p->world->world, mod_gui); - - if (sord_iter_end(gui)) { - sord_iter_free(gui); - return NULL; - } - - const SordNode* Gui = sord_iter_get_node(gui, SORD_OBJECT); - - sord_iter_free(gui); - return Gui; -} - -LILV_API LilvNode* -lilv_plugin_get_modgui_resources_directory(const LilvPlugin* plugin) -{ - const SordNode* modgui = lilv_plugin_get_modgui(plugin); - if (modgui) { - SordWorld* sworld = plugin->world->world; - SordNode* modgui_res = sord_new_uri(sworld, NS_MOD "resourcesDirectory"); - LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_res); - sord_node_free(sworld, modgui_res); - return ret; - } - return NULL; -} - -LILV_API LilvNode* -lilv_plugin_get_modgui_stylesheet(const LilvPlugin* plugin) -{ - const SordNode* modgui = lilv_plugin_get_modgui(plugin); - if (modgui) { - SordWorld* sworld = plugin->world->world; - SordNode* modgui_style = sord_new_uri(sworld, NS_MOD "stylesheet"); - LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_style); - sord_node_free(sworld, modgui_style); - return ret; - } - return NULL; -} - -LILV_API LilvNode* -lilv_plugin_get_modgui_icon_template(const LilvPlugin* plugin) -{ - const SordNode* modgui = lilv_plugin_get_modgui(plugin); - if (modgui) { - SordWorld* sworld = plugin->world->world; - SordNode* modgui_tmpl = sord_new_uri(sworld, NS_MOD "iconTemplate"); - LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_tmpl); - sord_node_free(sworld, modgui_tmpl); - return ret; - } - return NULL; -} - -LILV_API LilvNode* -lilv_plugin_get_modgui_settings_template(const LilvPlugin* plugin) -{ - const SordNode* modgui = lilv_plugin_get_modgui(plugin); - if (modgui) { - SordWorld* sworld = plugin->world->world; - SordNode* modgui_tmpl = sord_new_uri(sworld, NS_MOD "settingsTemplate"); - LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_tmpl); - sord_node_free(sworld, modgui_tmpl); - return ret; - } - return NULL; -} - -LILV_API LilvNode* -lilv_plugin_get_modgui_template_data(const LilvPlugin* plugin) -{ - const SordNode* modgui = lilv_plugin_get_modgui(plugin); - if (modgui) { - SordWorld* sworld = plugin->world->world; - SordNode* modgui_tmpl = sord_new_uri(sworld, NS_MOD "templateData"); - LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_tmpl); - sord_node_free(sworld, modgui_tmpl); - return ret; - } - return NULL; -} - -LILV_API LilvNode* -lilv_plugin_get_modgui_screenshot(const LilvPlugin* plugin) -{ - const SordNode* modgui = lilv_plugin_get_modgui(plugin); - if (modgui) { - SordWorld* sworld = plugin->world->world; - SordNode* modgui_scr = sord_new_uri(sworld, NS_MOD "screenshot"); - LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_scr); - sord_node_free(sworld, modgui_scr); - return ret; - } - return NULL; -} - -LILV_API LilvNode* -lilv_plugin_get_modgui_thumbnail(const LilvPlugin* plugin) -{ - const SordNode* modgui = lilv_plugin_get_modgui(plugin); - if (modgui) { - SordWorld* sworld = plugin->world->world; - SordNode* modgui_thumb = sord_new_uri(sworld, NS_MOD "thumbnail"); - LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_thumb); - sord_node_free(sworld, modgui_thumb); - return ret; - } - return NULL; -} - LILV_API bool lilv_plugin_is_replaced(const LilvPlugin* plugin) { diff --git a/source/modules/lilv/lilv-0.21.3/src/pluginclass.c b/source/modules/lilv/lilv-0.22.1/src/pluginclass.c similarity index 91% rename from source/modules/lilv/lilv-0.21.3/src/pluginclass.c rename to source/modules/lilv/lilv-0.22.1/src/pluginclass.c index f6f6cc68f..0afb39ace 100644 --- a/source/modules/lilv/lilv-0.21.3/src/pluginclass.c +++ b/source/modules/lilv/lilv-0.22.1/src/pluginclass.c @@ -1,5 +1,5 @@ /* - Copyright 2007-2014 David Robillard + Copyright 2007-2015 David Robillard Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include #include #include @@ -26,9 +25,6 @@ lilv_plugin_class_new(LilvWorld* world, const SordNode* uri, const char* label) { - if (parent_node && sord_node_get_type(parent_node) != SORD_URI) { - return NULL; // Not an LV2 plugin superclass (FIXME: discover properly) - } LilvPluginClass* pc = (LilvPluginClass*)malloc(sizeof(LilvPluginClass)); pc->world = world; pc->uri = lilv_node_new_from_node(world, uri); @@ -42,7 +38,10 @@ lilv_plugin_class_new(LilvWorld* world, void lilv_plugin_class_free(LilvPluginClass* plugin_class) { - assert(plugin_class->uri); + if (!plugin_class) { + return; + } + lilv_node_free(plugin_class->uri); lilv_node_free(plugin_class->parent_uri); lilv_node_free(plugin_class->label); diff --git a/source/modules/lilv/lilv-0.21.3/src/port.c b/source/modules/lilv/lilv-0.22.1/src/port.c similarity index 98% rename from source/modules/lilv/lilv-0.21.3/src/port.c rename to source/modules/lilv/lilv-0.22.1/src/port.c index 0a5089186..6bf8fc798 100644 --- a/source/modules/lilv/lilv-0.21.3/src/port.c +++ b/source/modules/lilv/lilv-0.22.1/src/port.c @@ -20,8 +20,8 @@ #include #include -#include "lv2/atom.h" -#include "lv2/event.h" +#include "lv2/lv2plug.in/ns/ext/atom/atom.h" +#include "lv2/lv2plug.in/ns/ext/event/event.h" #include "lilv_internal.h" diff --git a/source/modules/lilv/lilv-0.21.3/src/query.c b/source/modules/lilv/lilv-0.22.1/src/query.c similarity index 98% rename from source/modules/lilv/lilv-0.21.3/src/query.c rename to source/modules/lilv/lilv-0.22.1/src/query.c index 0d065332b..fe2988f4b 100644 --- a/source/modules/lilv/lilv-0.21.3/src/query.c +++ b/source/modules/lilv/lilv-0.22.1/src/query.c @@ -1,5 +1,5 @@ /* - Copyright 2007-2014 David Robillard + Copyright 2007-2015 David Robillard Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include #include #include #include diff --git a/source/modules/lilv/lilv-0.21.3/src/scalepoint.c b/source/modules/lilv/lilv-0.22.1/src/scalepoint.c similarity index 100% rename from source/modules/lilv/lilv-0.21.3/src/scalepoint.c rename to source/modules/lilv/lilv-0.22.1/src/scalepoint.c diff --git a/source/modules/lilv/lilv-0.21.3/src/state.c b/source/modules/lilv/lilv-0.22.1/src/state.c similarity index 95% rename from source/modules/lilv/lilv-0.21.3/src/state.c rename to source/modules/lilv/lilv-0.22.1/src/state.c index 119dcee46..ccc1b22e5 100644 --- a/source/modules/lilv/lilv-0.21.3/src/state.c +++ b/source/modules/lilv/lilv-0.22.1/src/state.c @@ -1,5 +1,5 @@ /* - Copyright 2007-2014 David Robillard + Copyright 2007-2015 David Robillard Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -18,10 +18,10 @@ #include #include -#include "lv2/atom.h" -#include "lv2/atom-forge.h" -#include "lv2/presets.h" -#include "lv2/state.h" +#include "lv2/lv2plug.in/ns/ext/atom/atom.h" +#include "lv2/lv2plug.in/ns/ext/atom/forge.h" +#include "lv2/lv2plug.in/ns/ext/presets/presets.h" +#include "lv2/lv2plug.in/ns/ext/state/state.h" #include "lilv_config.h" #include "lilv_internal.h" @@ -231,7 +231,11 @@ abstract_path(LV2_State_Map_Path_Handle handle, if (!copy || !lilv_file_equals(real_path, copy)) { // No recent enough copy, make a new one copy = lilv_find_free_path(cpath, lilv_path_exists, NULL); - lilv_copy_file(real_path, copy); + const int st = lilv_copy_file(real_path, copy); + if (st) { + LILV_ERRORF("Error copying state file %s (%s)\n", + copy, strerror(st)); + } } free(real_path); free(cpath); @@ -411,18 +415,35 @@ lilv_state_emit_port_values(const LilvState* state, LILV_API void lilv_state_restore(const LilvState* state, - const LV2_State_Interface* iface, - LV2_Handle handle, + LilvInstance* instance, LilvSetPortValueFunc set_value, void* user_data, uint32_t flags, const LV2_Feature *const * features) { + if (!state) { + LILV_ERROR("lilv_state_restore() called on NULL state\n"); + return; + } + + LV2_State_Map_Path map_path = { + (LilvState*)state, abstract_path, absolute_path }; + LV2_Feature map_feature = { LV2_STATE__mapPath, &map_path }; + + const LV2_Feature** sfeatures = add_features(features, &map_feature, NULL); + + const LV2_Descriptor* desc = instance ? instance->lv2_descriptor : NULL; + const LV2_State_Interface* iface = (desc && desc->extension_data) + ? (const LV2_State_Interface*)desc->extension_data(LV2_STATE__interface) + : NULL; + if (iface) { - iface->restore(handle, retrieve_callback, - (LV2_State_Handle)state, flags, features); + iface->restore(instance->lv2_handle, retrieve_callback, + (LV2_State_Handle)state, flags, sfeatures); } + free(sfeatures); + if (set_value) { lilv_state_emit_port_values(state, set_value, user_data); } @@ -569,9 +590,9 @@ new_state_from_model(LilvWorld* world, } LILV_API LilvState* -lilv_state_new_from_world(LilvWorld* world, - const LV2_URID_Map* map, - const LilvNode* node) +lilv_state_new_from_world(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* node) { if (!lilv_node_is_uri(node) && !lilv_node_is_blank(node)) { LILV_ERRORF("Subject `%s' is not a URI or blank node.\n", @@ -583,10 +604,10 @@ lilv_state_new_from_world(LilvWorld* world, } LILV_API LilvState* -lilv_state_new_from_file(LilvWorld* world, - const LV2_URID_Map* map, - const LilvNode* subject, - const char* path) +lilv_state_new_from_file(LilvWorld* world, + LV2_URID_Map* map, + const LilvNode* subject, + const char* path) { if (subject && !lilv_node_is_uri(subject) && !lilv_node_is_blank(subject)) { @@ -636,9 +657,9 @@ set_prefixes(SerdEnv* env) } LILV_API LilvState* -lilv_state_new_from_string(LilvWorld* world, - const LV2_URID_Map* map, - const char* str) +lilv_state_new_from_string(LilvWorld* world, + LV2_URID_Map* map, + const char* str) { if (!str) { return NULL; @@ -1100,7 +1121,7 @@ lilv_state_delete(LilvWorld* world, if (unlink(file_path)) { LILV_ERRORF("Failed to remove %s (%s)\n", file_path, strerror(errno)); } - free(file_path); + lilv_free(file_path); } // Remove any existing manifest entries for this state @@ -1123,14 +1144,14 @@ lilv_state_delete(LilvWorld* world, LILV_ERRORF("Failed to remove %s (%s)\n", dir_path, strerror(errno)); } - free(dir_path); + lilv_free(dir_path); } else { // Still something in the manifest, reload bundle lilv_world_load_bundle(world, bundle); } sord_free(model); - free(manifest_path); + lilv_free(manifest_path); lilv_node_free(manifest); lilv_node_free(bundle); diff --git a/source/modules/lilv/lilv-0.21.3/src/ui.c b/source/modules/lilv/lilv-0.22.1/src/ui.c similarity index 65% rename from source/modules/lilv/lilv-0.21.3/src/ui.c rename to source/modules/lilv/lilv-0.22.1/src/ui.c index a3e17dac0..0f4f2f680 100644 --- a/source/modules/lilv/lilv-0.21.3/src/ui.c +++ b/source/modules/lilv/lilv-0.22.1/src/ui.c @@ -109,54 +109,3 @@ lilv_ui_get_binary_uri(const LilvUI* ui) { return ui->binary_uri; } - -static LilvNodes* -lilv_ui_get_value_internal(const LilvUI* ui, const SordNode* predicate) -{ - assert(ui); - return lilv_world_find_nodes_internal(ui->world, ui->uri->node, predicate, NULL); -} - -LILV_API const LilvNodes* -lilv_ui_get_supported_features(const LilvUI* ui) -{ - assert(ui); - LilvNodes* optional = lilv_ui_get_optional_features(ui); - LilvNodes* required = lilv_ui_get_required_features(ui); - LilvNodes* result = lilv_nodes_new(); - - LILV_FOREACH(nodes, i, optional) - zix_tree_insert((ZixTree*)result, lilv_node_duplicate(lilv_nodes_get(optional, i)), NULL); - - LILV_FOREACH(nodes, i, required) - zix_tree_insert((ZixTree*)result, lilv_node_duplicate(lilv_nodes_get(required, i)), NULL); - - lilv_nodes_free(optional); - lilv_nodes_free(required); - - return result; -} - -LILV_API const LilvNodes* -lilv_ui_get_required_features(const LilvUI* ui) -{ - assert(ui); - assert(ui->world); - return lilv_ui_get_value_internal(ui, ui->world->uris.lv2_requiredFeature); -} - -LILV_API const LilvNodes* -lilv_ui_get_optional_features(const LilvUI* ui) -{ - assert(ui); - assert(ui->world); - return lilv_ui_get_value_internal(ui, ui->world->uris.lv2_optionalFeature); -} - -LILV_API const LilvNodes* -lilv_ui_get_extension_data(const LilvUI* ui) -{ - assert(ui); - assert(ui->world); - return lilv_ui_get_value_internal(ui, ui->world->uris.lv2_extensionData); -} diff --git a/source/modules/lilv/lilv-0.21.3/src/util.c b/source/modules/lilv/lilv-0.22.1/src/util.c similarity index 92% rename from source/modules/lilv/lilv-0.21.3/src/util.c rename to source/modules/lilv/lilv-0.22.1/src/util.c index 5bcdb7e17..d999942b6 100644 --- a/source/modules/lilv/lilv-0.21.3/src/util.c +++ b/source/modules/lilv/lilv-0.22.1/src/util.c @@ -1,5 +1,5 @@ /* - Copyright 2007-2014 David Robillard + Copyright 2007-2015 David Robillard Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -14,14 +14,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define _POSIX_C_SOURCE 1 /* for fileno */ -#define _BSD_SOURCE 1 /* for realpath, symlink */ +#define _POSIX_C_SOURCE 200809L /* for fileno */ +#define _BSD_SOURCE 1 /* for realpath, symlink */ #ifdef __APPLE__ # define _DARWIN_C_SOURCE 1 /* for flock */ #endif -#include #include #include #include @@ -30,6 +29,7 @@ #include #ifdef _WIN32 +# define _WIN32_WINNT 0x0600 /* for CreateSymbolicLink */ # include # include # include @@ -48,6 +48,7 @@ CreateSymbolicLink(LPCTSTR linkpath, LPCTSTR targetpath, DWORD flags) # endif /* _MSC_VER < 1500 */ #else # include +# include # include #endif @@ -64,6 +65,12 @@ CreateSymbolicLink(LPCTSTR linkpath, LPCTSTR targetpath, DWORD flags) # define PAGE_SIZE 4096 #endif +void +lilv_free(void* ptr) +{ + free(ptr); +} + char* lilv_strjoin(const char* first, ...) { @@ -83,7 +90,6 @@ lilv_strjoin(const char* first, ...) char* new_result = (char*)realloc(result, len + this_len + 1); if (!new_result) { free(result); - LILV_ERROR("realloc() failed\n"); return NULL; } @@ -286,36 +292,33 @@ lilv_copy_file(const char* src, const char* dst) { FILE* in = fopen(src, "r"); if (!in) { - LILV_ERRORF("error opening %s (%s)\n", src, strerror(errno)); - return 1; + return errno; } FILE* out = fopen(dst, "w"); if (!out) { - LILV_ERRORF("error opening %s (%s)\n", dst, strerror(errno)); - fclose(in); - return 2; + return errno; } char* page = (char*)malloc(PAGE_SIZE); size_t n_read = 0; + int st = 0; while ((n_read = fread(page, 1, PAGE_SIZE, in)) > 0) { if (fwrite(page, 1, n_read, out) != n_read) { - LILV_ERRORF("write to %s failed (%s)\n", dst, strerror(errno)); + st = errno; break; } } - const int ret = ferror(in) || ferror(out); - if (ferror(in)) { - LILV_ERRORF("read from %s failed (%s)\n", src, strerror(errno)); + if (!st && (ferror(in) || ferror(out))) { + st = EBADF; } free(page); fclose(in); fclose(out); - return ret; + return st; } bool @@ -374,6 +377,7 @@ lilv_size_mtime(const char* path, off_t* size, time_t* time) struct stat buf; if (stat(path, &buf)) { LILV_ERRORF("stat(%s) (%s)\n", path, strerror(errno)); + return; } if (size) { @@ -429,13 +433,23 @@ lilv_get_latest_copy(const char* path, const char* copy_path) char* lilv_realpath(const char* path) { -#ifdef _WIN32 +#if defined(_WIN32) char* out = (char*)malloc(MAX_PATH); GetFullPathName(path, MAX_PATH, out, NULL); return out; -#else +#elif _POSIX_VERSION >= 200809L char* real_path = realpath(path, NULL); return real_path ? real_path : lilv_strdup(path); +#else + // OSX <= 10.5, if anyone cares. I sure don't. + char* out = (char*)malloc(PATH_MAX); + char* real_path = realpath(path, out); + if (!real_path) { + free(out); + return lilv_strdup(path); + } else { + return real_path; + } #endif } @@ -445,7 +459,10 @@ lilv_symlink(const char* oldpath, const char* newpath) int ret = 0; if (strcmp(oldpath, newpath)) { #ifdef _WIN32 - ret = 1; + ret = !CreateSymbolicLink(newpath, oldpath, 0); + if (ret) { + ret = !CreateHardLink(newpath, oldpath, 0); + } #else ret = symlink(oldpath, newpath); #endif @@ -536,11 +553,18 @@ lilv_dir_for_each(const char* path, #else DIR* dir = opendir(path); if (dir) { - struct dirent entry; + long name_max = pathconf(path, _PC_NAME_MAX); + if (name_max == -1) { + name_max = 255; // Limit not defined, or error + } + + const size_t len = offsetof(struct dirent, d_name) + name_max + 1; + struct dirent* entry = (struct dirent*)malloc(len); struct dirent* result; - while (!readdir_r(dir, &entry, &result) && result) { - f(path, entry.d_name, data); + while (!readdir_r(dir, entry, &result) && result) { + f(path, entry->d_name, data); } + free(entry); closedir(dir); } #endif @@ -555,10 +579,8 @@ lilv_mkdir_p(const char* dir_path) if (path[i] == LILV_DIR_SEP[0] || path[i] == '\0') { path[i] = '\0'; if (mkdir(path, 0755) && errno != EEXIST) { - LILV_ERRORF("Failed to create %s (%s)\n", - path, strerror(errno)); free(path); - return 1; + return errno; } path[i] = LILV_DIR_SEP[0]; } diff --git a/source/modules/lilv/lilv-0.21.3/src/world.c b/source/modules/lilv/lilv-0.22.1/src/world.c similarity index 99% rename from source/modules/lilv/lilv-0.21.3/src/world.c rename to source/modules/lilv/lilv-0.22.1/src/world.c index 8b2db954d..02dbeec49 100644 --- a/source/modules/lilv/lilv-0.21.3/src/world.c +++ b/source/modules/lilv/lilv-0.22.1/src/world.c @@ -19,7 +19,7 @@ #include #include -#include "lv2/presets.h" +#include "lv2/lv2plug.in/ns/ext/presets/presets.h" #include "lilv_internal.h" @@ -797,8 +797,12 @@ lilv_world_load_plugin_classes(LilvWorld* world) } LILV_API void -lilv_world_load_all(LilvWorld* world, const char* lv2_path) +lilv_world_load_all(LilvWorld* world) { + const char* lv2_path = getenv("LV2_PATH"); + if (!lv2_path) + lv2_path = LILV_DEFAULT_LV2_PATH; + // Discover bundles and read all manifest files into model lilv_world_load_path(world, lv2_path); diff --git a/source/modules/lilv/lilv-0.21.3/src/zix/common.h b/source/modules/lilv/lilv-0.22.1/src/zix/common.h similarity index 100% rename from source/modules/lilv/lilv-0.21.3/src/zix/common.h rename to source/modules/lilv/lilv-0.22.1/src/zix/common.h diff --git a/source/modules/lilv/lilv-0.21.3/src/zix/tree.c b/source/modules/lilv/lilv-0.22.1/src/zix/tree.c similarity index 100% rename from source/modules/lilv/lilv-0.21.3/src/zix/tree.c rename to source/modules/lilv/lilv-0.22.1/src/zix/tree.c diff --git a/source/modules/lilv/lilv-0.21.3/src/zix/tree.h b/source/modules/lilv/lilv-0.22.1/src/zix/tree.h similarity index 100% rename from source/modules/lilv/lilv-0.21.3/src/zix/tree.h rename to source/modules/lilv/lilv-0.22.1/src/zix/tree.h diff --git a/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/failed_lib_descriptor.c b/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/failed_lib_descriptor.c new file mode 100644 index 000000000..6a1fd9059 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/failed_lib_descriptor.c @@ -0,0 +1,30 @@ +/* + Lilv Test Plugin - Failed lib descriptor + Copyright 2011-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define PLUGIN_URI "http://example.org/failed-lib-descriptor" + +LV2_SYMBOL_EXPORT +const LV2_Lib_Descriptor* +lv2_lib_descriptor(const char* bundle_path, + const LV2_Feature*const* features) +{ + return NULL; +} diff --git a/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/failed_lib_descriptor.ttl.in b/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/failed_lib_descriptor.ttl.in new file mode 100644 index 000000000..f41545fb4 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/failed_lib_descriptor.ttl.in @@ -0,0 +1,38 @@ +# Lilv Test Plugin - Failed lib descriptor +# Copyright 2011-2015 David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix ui: . + + + a lv2:Plugin ; + doap:name "Missing descriptor test" ; + doap:license ; + lv2:optionalFeature lv2:hardRTCapable ; + lv2:port [ + a lv2:InputPort , + lv2:ControlPort ; + lv2:index 0 ; + lv2:symbol "input" ; + lv2:name "Input" + ] , [ + a lv2:OutputPort , + lv2:ControlPort ; + lv2:index 1 ; + lv2:symbol "output" ; + lv2:name "Output" + ] . diff --git a/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/manifest.ttl.in b/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/manifest.ttl.in new file mode 100644 index 000000000..4724f0faf --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/manifest.ttl.in @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . diff --git a/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/test_failed_lib_descriptor.c b/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/test_failed_lib_descriptor.c new file mode 100644 index 000000000..2bdc999c4 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/failed_lib_descriptor.lv2/test_failed_lib_descriptor.c @@ -0,0 +1,44 @@ +#include "lilv/lilv.h" +#include "../src/lilv_internal.h" + +#define PLUGIN_URI "http://example.org/failed-lib-descriptor" + +#define TEST_ASSERT(check) do {\ + if (!(check)) {\ + fprintf(stderr, "%s:%d: failed test: %s\n", __FILE__, __LINE__, #check);\ + return 1;\ + }\ +} while (0) + +int +main(int argc, char** argv) +{ + if (argc != 2) { + fprintf(stderr, "USAGE: %s BUNDLE\n", argv[0]); + return 1; + } + + const char* bundle_path = argv[1]; + LilvWorld* world = lilv_world_new(); + + // Load test plugin bundle + uint8_t* abs_bundle = (uint8_t*)lilv_path_absolute(bundle_path); + SerdNode bundle = serd_node_new_file_uri(abs_bundle, 0, 0, true); + LilvNode* bundle_uri = lilv_new_uri(world, (const char*)bundle.buf); + lilv_world_load_bundle(world, bundle_uri); + free(abs_bundle); + serd_node_free(&bundle); + + LilvNode* plugin_uri = lilv_new_uri(world, PLUGIN_URI); + const LilvPlugins* plugins = lilv_world_get_all_plugins(world); + const LilvPlugin* plugin = lilv_plugins_get_by_uri(plugins, plugin_uri); + TEST_ASSERT(plugin); + + LilvInstance* instance = lilv_plugin_instantiate(plugin, 48000.0, NULL); + TEST_ASSERT(!instance); + + lilv_world_free(world); + + return 0; +} + diff --git a/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/lib_descriptor.c b/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/lib_descriptor.c new file mode 100644 index 000000000..48dc77517 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/lib_descriptor.c @@ -0,0 +1,112 @@ +/* + Lilv Test Plugin - Missing descriptor + Copyright 2011-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define PLUGIN_URI "http://example.org/lib-descriptor" + +enum { + TEST_INPUT = 0, + TEST_OUTPUT = 1 +}; + +typedef struct { + float* input; + float* output; +} Test; + +static void +cleanup(LV2_Handle instance) +{ + free((Test*)instance); +} + +static void +connect_port(LV2_Handle instance, uint32_t port, void* data) +{ + Test* test = (Test*)instance; + switch (port) { + case TEST_INPUT: + test->input = (float*)data; + break; + case TEST_OUTPUT: + test->output = (float*)data; + break; + default: + break; + } +} + +static LV2_Handle +instantiate(const LV2_Descriptor* descriptor, + double rate, + const char* path, + const LV2_Feature* const* features) +{ + Test* test = (Test*)calloc(1, sizeof(Test)); + if (!test) { + return NULL; + } + + return (LV2_Handle)test; +} + +static void +run(LV2_Handle instance, uint32_t sample_count) +{ + Test* test = (Test*)instance; + + *test->output = *test->input; +} + +static const LV2_Descriptor descriptor = { + PLUGIN_URI, + instantiate, + connect_port, + NULL, // activate, + run, + NULL, // deactivate, + cleanup, + NULL // extension_data +}; + +static const LV2_Descriptor* +get_plugin(LV2_Lib_Handle handle, uint32_t index) +{ + switch (index) { + case 0: + return &descriptor; + default: + return NULL; + } +} + +static const LV2_Lib_Descriptor lib = { + NULL, + sizeof(LV2_Lib_Descriptor), + NULL, + get_plugin }; + +LV2_SYMBOL_EXPORT +const LV2_Lib_Descriptor* +lv2_lib_descriptor(const char* bundle_path, + const LV2_Feature*const* features) +{ + return &lib; +} diff --git a/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/lib_descriptor.ttl.in b/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/lib_descriptor.ttl.in new file mode 100644 index 000000000..19c8c4ad7 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/lib_descriptor.ttl.in @@ -0,0 +1,41 @@ +# Lilv Test Plugin - Missing descriptor +# Copyright 2011-2015 David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix ui: . +@prefix xsd: . + + + a lv2:Plugin ; + doap:name "Missing descriptor test" ; + doap:license ; + lv2:optionalFeature lv2:hardRTCapable ; + "aGVsbG8sIHdvcmxk"^^xsd:base64Binary ; + "opaque"^^ ; + lv2:port [ + a lv2:InputPort , + lv2:ControlPort ; + lv2:index 0 ; + lv2:symbol "input" ; + lv2:name "Input" + ] , [ + a lv2:OutputPort , + lv2:ControlPort ; + lv2:index 1 ; + lv2:symbol "output" ; + lv2:name "Output" + ] . diff --git a/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/manifest.ttl.in b/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/manifest.ttl.in new file mode 100644 index 000000000..5f4eced58 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/manifest.ttl.in @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . diff --git a/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/test_lib_descriptor.c b/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/test_lib_descriptor.c new file mode 100644 index 000000000..3409ef28c --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/lib_descriptor.lv2/test_lib_descriptor.c @@ -0,0 +1,52 @@ +#include "lilv/lilv.h" +#include "../src/lilv_internal.h" + +#define PLUGIN_URI "http://example.org/lib-descriptor" + +#define TEST_ASSERT(check) do {\ + if (!(check)) {\ + fprintf(stderr, "%s:%d: failed test: %s\n", __FILE__, __LINE__, #check);\ + return 1;\ + }\ +} while (0) + +int +main(int argc, char** argv) +{ + if (argc != 2) { + fprintf(stderr, "USAGE: %s BUNDLE\n", argv[0]); + return 1; + } + + const char* bundle_path = argv[1]; + LilvWorld* world = lilv_world_new(); + + // Load test plugin bundle + uint8_t* abs_bundle = (uint8_t*)lilv_path_absolute(bundle_path); + SerdNode bundle = serd_node_new_file_uri(abs_bundle, 0, 0, true); + LilvNode* bundle_uri = lilv_new_uri(world, (const char*)bundle.buf); + lilv_world_load_bundle(world, bundle_uri); + free(abs_bundle); + serd_node_free(&bundle); + + LilvNode* plugin_uri = lilv_new_uri(world, PLUGIN_URI); + const LilvPlugins* plugins = lilv_world_get_all_plugins(world); + const LilvPlugin* plugin = lilv_plugins_get_by_uri(plugins, plugin_uri); + TEST_ASSERT(plugin); + + LilvInstance* instance = lilv_plugin_instantiate(plugin, 48000.0, NULL); + TEST_ASSERT(instance); + + LilvNode* eg_blob = lilv_new_uri(world, "http://example.org/blob"); + LilvNode* blob = lilv_world_get(world, plugin_uri, eg_blob, NULL); + TEST_ASSERT(lilv_node_is_literal(blob)); + + LilvNode* eg_junk = lilv_new_uri(world, "http://example.org/junk"); + LilvNode* junk = lilv_world_get(world, plugin_uri, eg_junk, NULL); + TEST_ASSERT(lilv_node_is_literal(junk)); + + lilv_world_free(world); + + return 0; +} + diff --git a/source/modules/lilv/lilv-0.21.3/test/lilv_test.c b/source/modules/lilv/lilv-0.22.1/test/lilv_test.c similarity index 96% rename from source/modules/lilv/lilv-0.21.3/test/lilv_test.c rename to source/modules/lilv/lilv-0.22.1/test/lilv_test.c index c40dc76d6..f179d3368 100644 --- a/source/modules/lilv/lilv-0.21.3/test/lilv_test.c +++ b/source/modules/lilv/lilv-0.22.1/test/lilv_test.c @@ -1,5 +1,5 @@ /* - Copyright 2007-2014 David Robillard + Copyright 2007-2015 David Robillard Copyright 2008 Krzysztof Foltman Permission to use, copy, modify, and/or distribute this software for any @@ -241,6 +241,7 @@ test_value(void) TEST_ASSERT(lilv_node_is_int(ival)); TEST_ASSERT(lilv_node_is_float(fval)); + TEST_ASSERT(!lilv_node_is_literal(NULL)); TEST_ASSERT(!lilv_node_is_literal(uval)); TEST_ASSERT(lilv_node_is_literal(sval)); TEST_ASSERT(lilv_node_is_literal(ival)); @@ -269,16 +270,16 @@ test_value(void) char* tok = lilv_node_get_turtle_token(uval); TEST_ASSERT(!strcmp(tok, "")); - free(tok); + lilv_free(tok); tok = lilv_node_get_turtle_token(sval); TEST_ASSERT(!strcmp(tok, "Foo")); - free(tok); + lilv_free(tok); tok = lilv_node_get_turtle_token(ival); TEST_ASSERT(!strcmp(tok, "42")); - free(tok); + lilv_free(tok); tok = lilv_node_get_turtle_token(fval); TEST_ASSERT(!strncmp(tok, "1.6180", 6)); - free(tok); + lilv_free(tok); LilvNode* uval_e = lilv_new_uri(world, "http://example.org"); LilvNode* sval_e = lilv_new_string(world, "Foo"); @@ -339,6 +340,16 @@ test_value(void) /*****************************************************************************/ +static int +test_util(void) +{ + TEST_ASSERT(!lilv_realpath(NULL)); + + return 1; +} + +/*****************************************************************************/ + static int discovery_plugin_found = 0; static void @@ -605,6 +616,10 @@ test_plugin(void) TEST_ASSERT(lilv_nodes_contains(data_uris, data_uri_val)); lilv_node_free(data_uri_val); + LilvNode* unknown_uri_val = lilv_new_uri(world, "http://example.org/unknown"); + TEST_ASSERT(!lilv_nodes_contains(data_uris, unknown_uri_val)); + lilv_node_free(unknown_uri_val); + free(manifest_uri); free(data_uri); @@ -645,6 +660,7 @@ test_plugin(void) TEST_ASSERT(latency_port); TEST_ASSERT(lilv_port_get_index(plug, latency_port) == 2); + TEST_ASSERT(lilv_node_is_blank(lilv_port_get_node(plug, latency_port))); LilvNode* rt_feature = lilv_new_uri(world, "http://lv2plug.in/ns/lv2core#hardRTCapable"); @@ -701,7 +717,7 @@ test_plugin(void) char* blank_tok = lilv_node_get_turtle_token(blank); TEST_ASSERT(!strncmp(blank_tok, "_:", 2)); TEST_ASSERT(!strcmp(blank_tok + 2, blank_str)); - free(blank_tok); + lilv_free(blank_tok); lilv_node_free(blank_p); lilv_nodes_free(blanks); @@ -1060,6 +1076,12 @@ test_port(void) TEST_ASSERT(p3 == NULL); lilv_node_free(nopsym); + // Try getting an invalid property + LilvNode* num = lilv_new_int(world, 1); + LilvNodes* nothing = lilv_port_get_value(plug, p, num); + TEST_ASSERT(!nothing); + lilv_node_free(num); + LilvNode* audio_class = lilv_new_uri(world, "http://lv2plug.in/ns/lv2core#AudioPort"); LilvNode* control_class = lilv_new_uri(world, @@ -1116,6 +1138,12 @@ test_port(void) TEST_ASSERT(!strcmp(lilv_node_as_string(name), "store")); lilv_node_free(name); + // Invalid language + setenv("LANG", "1!", 1); + name = lilv_port_get_name(plug, p); + TEST_ASSERT(!strcmp(lilv_node_as_string(name), "store")); + lilv_node_free(name); + setenv("LANG", "en_CA.utf-8", 1); // Language tagged value with no untranslated values @@ -1347,11 +1375,15 @@ test_ui(void) LilvNode* ui_class_uri = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#GtkUI"); + LilvNode* unknown_ui_class_uri = lilv_new_uri(world, + "http://example.org/mysteryUI"); + TEST_ASSERT(lilv_node_equals(lilv_nodes_get_first(classes), ui_class_uri)); TEST_ASSERT(lilv_ui_is_a(ui0, ui_class_uri)); const LilvNode* ui_type = NULL; TEST_ASSERT(lilv_ui_is_supported(ui0, ui_supported, ui_class_uri, &ui_type)); + TEST_ASSERT(!lilv_ui_is_supported(ui0, ui_supported, unknown_ui_class_uri, &ui_type)); TEST_ASSERT(lilv_node_equals(ui_type, ui_class_uri)); const LilvNode* plug_bundle_uri = lilv_plugin_get_bundle_uri(plug); @@ -1368,6 +1400,7 @@ test_ui(void) TEST_ASSERT(lilv_node_equals(expected_uri, ui_binary_uri)); free(ui_binary_uri_str); + lilv_node_free(unknown_ui_class_uri); lilv_node_free(ui_class_uri); lilv_node_free(ui_uri); lilv_node_free(ui2_uri); @@ -1647,6 +1680,15 @@ test_state(void) lilv_instance_connect_port(instance, 1, &out); lilv_instance_run(instance, 1); + // Test instantiating twice + LilvInstance* instance2 = lilv_plugin_instantiate(plugin, 48000.0, ffeatures); + if (!instance2) { + fatal_error("Failed to create multiple instances of <%s>\n", + lilv_node_as_uri(state_plugin_uri)); + return 0; + } + lilv_instance_free(instance2); + // Get instance state state LilvState* fstate = lilv_state_new_from_instance( plugin, instance, &map, @@ -1869,8 +1911,38 @@ test_string(void) /*****************************************************************************/ +static int +test_world(void) +{ + if (!init_world()) { + return 0; + } + + LilvNode* num = lilv_new_int(world, 4); + LilvNode* uri = lilv_new_uri(world, "http://example.org/object"); + + LilvNodes* matches = lilv_world_find_nodes(world, num, NULL, NULL); + TEST_ASSERT(!matches); + + matches = lilv_world_find_nodes(world, NULL, num, NULL); + TEST_ASSERT(!matches); + + matches = lilv_world_find_nodes(world, NULL, uri, NULL); + TEST_ASSERT(!matches); + + lilv_node_free(uri); + lilv_node_free(num); + + lilv_world_unload_bundle(world, NULL); + + return 1; +} + +/*****************************************************************************/ + /* add tests here */ static struct TestCase tests[] = { + TEST_CASE(util), TEST_CASE(value), TEST_CASE(verify), TEST_CASE(no_verify), @@ -1889,6 +1961,7 @@ static struct TestCase tests[] = { TEST_CASE(bad_port_index), TEST_CASE(bad_port_index), TEST_CASE(string), + TEST_CASE(world), TEST_CASE(state), { NULL, NULL } }; diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/manifest.ttl.in b/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/manifest.ttl.in new file mode 100644 index 000000000..789d1ec20 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/manifest.ttl.in @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/missing_descriptor.c b/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/missing_descriptor.c new file mode 100644 index 000000000..0aa205075 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/missing_descriptor.c @@ -0,0 +1,20 @@ +/* + Lilv Test Plugin - Missing descriptor + Copyright 2011-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +LV2_SYMBOL_EXPORT const char* msg = "this is not the thing you're looking for"; diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/missing_descriptor.ttl.in b/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/missing_descriptor.ttl.in new file mode 100644 index 000000000..9e2aad82c --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/missing_descriptor.ttl.in @@ -0,0 +1,38 @@ +# Lilv Test Plugin - Missing descriptor +# Copyright 2011-2015 David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix ui: . + + + a lv2:Plugin ; + doap:name "Missing descriptor test" ; + doap:license ; + lv2:optionalFeature lv2:hardRTCapable ; + lv2:port [ + a lv2:InputPort , + lv2:ControlPort ; + lv2:index 0 ; + lv2:symbol "input" ; + lv2:name "Input" + ] , [ + a lv2:OutputPort , + lv2:ControlPort ; + lv2:index 1 ; + lv2:symbol "output" ; + lv2:name "Output" + ] . diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/test_missing_descriptor.c b/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/test_missing_descriptor.c new file mode 100644 index 000000000..e0af49e7e --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_descriptor.lv2/test_missing_descriptor.c @@ -0,0 +1,44 @@ +#include "lilv/lilv.h" +#include "../src/lilv_internal.h" + +#define PLUGIN_URI "http://example.org/missing-descriptor" + +#define TEST_ASSERT(check) do {\ + if (!(check)) {\ + fprintf(stderr, "%s:%d: failed test: %s\n", __FILE__, __LINE__, #check);\ + return 1;\ + }\ +} while (0) + +int +main(int argc, char** argv) +{ + if (argc != 2) { + fprintf(stderr, "USAGE: %s BUNDLE\n", argv[0]); + return 1; + } + + const char* bundle_path = argv[1]; + LilvWorld* world = lilv_world_new(); + + // Load test plugin bundle + uint8_t* abs_bundle = (uint8_t*)lilv_path_absolute(bundle_path); + SerdNode bundle = serd_node_new_file_uri(abs_bundle, 0, 0, true); + LilvNode* bundle_uri = lilv_new_uri(world, (const char*)bundle.buf); + lilv_world_load_bundle(world, bundle_uri); + free(abs_bundle); + serd_node_free(&bundle); + + LilvNode* plugin_uri = lilv_new_uri(world, PLUGIN_URI); + const LilvPlugins* plugins = lilv_world_get_all_plugins(world); + const LilvPlugin* plugin = lilv_plugins_get_by_uri(plugins, plugin_uri); + TEST_ASSERT(plugin); + + LilvInstance* instance = lilv_plugin_instantiate(plugin, 48000.0, NULL); + TEST_ASSERT(!instance); + + lilv_world_free(world); + + return 0; +} + diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/manifest.ttl.in b/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/manifest.ttl.in new file mode 100644 index 000000000..62f4813c3 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/manifest.ttl.in @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/missing_name.c b/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/missing_name.c new file mode 100644 index 000000000..8a198b9d1 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/missing_name.c @@ -0,0 +1,93 @@ +/* + Lilv Test Plugin - Missing descriptor + Copyright 2011-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define PLUGIN_URI "http://example.org/missing-name" + +enum { + TEST_INPUT = 0, + TEST_OUTPUT = 1 +}; + +typedef struct { + float* input; + float* output; +} Test; + +static void +cleanup(LV2_Handle instance) +{ + free((Test*)instance); +} + +static void +connect_port(LV2_Handle instance, uint32_t port, void* data) +{ + Test* test = (Test*)instance; + switch (port) { + case TEST_INPUT: + test->input = (float*)data; + break; + case TEST_OUTPUT: + test->output = (float*)data; + break; + default: + break; + } +} + +static LV2_Handle +instantiate(const LV2_Descriptor* descriptor, + double rate, + const char* path, + const LV2_Feature* const* features) +{ + Test* test = (Test*)calloc(1, sizeof(Test)); + if (!test) { + return NULL; + } + + return (LV2_Handle)test; +} + +static void +run(LV2_Handle instance, uint32_t sample_count) +{ + Test* test = (Test*)instance; + + *test->output = *test->input; +} + +static const LV2_Descriptor descriptor = { + PLUGIN_URI, + instantiate, + connect_port, + NULL, // activate, + run, + NULL, // deactivate, + cleanup, + NULL // extension_data +}; + +LV2_SYMBOL_EXPORT +const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + return (index == 0) ? &descriptor : NULL; +} diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/missing_name.ttl.in b/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/missing_name.ttl.in new file mode 100644 index 000000000..68ce23e4b --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/missing_name.ttl.in @@ -0,0 +1,37 @@ +# Lilv Test Plugin - Missing plugin name +# Copyright 2011-2015 David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix ui: . + + + a lv2:Plugin ; + doap:license ; + lv2:optionalFeature lv2:hardRTCapable ; + lv2:port [ + a lv2:InputPort , + lv2:ControlPort ; + lv2:index 0 ; + lv2:symbol "input" ; + lv2:name "Input" + ] , [ + a lv2:OutputPort , + lv2:ControlPort ; + lv2:index 1 ; + lv2:symbol "output" ; + lv2:name "Output" + ] . diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/test_missing_name.c b/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/test_missing_name.c new file mode 100644 index 000000000..9237ae2c4 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_name.lv2/test_missing_name.c @@ -0,0 +1,44 @@ +#include "lilv/lilv.h" +#include "../src/lilv_internal.h" + +#define PLUGIN_URI "http://example.org/missing-name" + +#define TEST_ASSERT(check) do {\ + if (!(check)) {\ + fprintf(stderr, "%s:%d: failed test: %s\n", __FILE__, __LINE__, #check);\ + return 1;\ + }\ +} while (0) + +int +main(int argc, char** argv) +{ + if (argc != 2) { + fprintf(stderr, "USAGE: %s BUNDLE\n", argv[0]); + return 1; + } + + const char* bundle_path = argv[1]; + LilvWorld* world = lilv_world_new(); + + // Load test plugin bundle + uint8_t* abs_bundle = (uint8_t*)lilv_path_absolute(bundle_path); + SerdNode bundle = serd_node_new_file_uri(abs_bundle, 0, 0, true); + LilvNode* bundle_uri = lilv_new_uri(world, (const char*)bundle.buf); + lilv_world_load_bundle(world, bundle_uri); + free(abs_bundle); + serd_node_free(&bundle); + + LilvNode* plugin_uri = lilv_new_uri(world, PLUGIN_URI); + const LilvPlugins* plugins = lilv_world_get_all_plugins(world); + const LilvPlugin* plugin = lilv_plugins_get_by_uri(plugins, plugin_uri); + TEST_ASSERT(plugin); + + LilvInstance* instance = lilv_plugin_instantiate(plugin, 48000.0, NULL); + TEST_ASSERT(instance); + + lilv_world_free(world); + + return 0; +} + diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/manifest.ttl.in b/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/manifest.ttl.in new file mode 100644 index 000000000..d969cecf0 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/manifest.ttl.in @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/missing_plugin.c b/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/missing_plugin.c new file mode 100644 index 000000000..577d42a01 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/missing_plugin.c @@ -0,0 +1,28 @@ +/* + Lilv Test Plugin - Missing plugin + Copyright 2011-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define PLUGIN_URI "http://example.org/missing-plugin" + +LV2_SYMBOL_EXPORT +const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + return NULL; +} diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/missing_plugin.ttl.in b/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/missing_plugin.ttl.in new file mode 100644 index 000000000..ed8a7f32d --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/missing_plugin.ttl.in @@ -0,0 +1,38 @@ +# Lilv Test Plugin - Missing plugin +# Copyright 2011-2015 David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix ui: . + + + a lv2:Plugin ; + doap:name "Missing descriptor test" ; + doap:license ; + lv2:optionalFeature lv2:hardRTCapable ; + lv2:port [ + a lv2:InputPort , + lv2:ControlPort ; + lv2:index 0 ; + lv2:symbol "input" ; + lv2:name "Input" + ] , [ + a lv2:OutputPort , + lv2:ControlPort ; + lv2:index 1 ; + lv2:symbol "output" ; + lv2:name "Output" + ] . diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/test_missing_plugin.c b/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/test_missing_plugin.c new file mode 100644 index 000000000..01f00cd1a --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_plugin.lv2/test_missing_plugin.c @@ -0,0 +1,44 @@ +#include "lilv/lilv.h" +#include "../src/lilv_internal.h" + +#define PLUGIN_URI "http://example.org/missing-plugin" + +#define TEST_ASSERT(check) do {\ + if (!(check)) {\ + fprintf(stderr, "%s:%d: failed test: %s\n", __FILE__, __LINE__, #check);\ + return 1;\ + }\ +} while (0) + +int +main(int argc, char** argv) +{ + if (argc != 2) { + fprintf(stderr, "USAGE: %s BUNDLE\n", argv[0]); + return 1; + } + + const char* bundle_path = argv[1]; + LilvWorld* world = lilv_world_new(); + + // Load test plugin bundle + uint8_t* abs_bundle = (uint8_t*)lilv_path_absolute(bundle_path); + SerdNode bundle = serd_node_new_file_uri(abs_bundle, 0, 0, true); + LilvNode* bundle_uri = lilv_new_uri(world, (const char*)bundle.buf); + lilv_world_load_bundle(world, bundle_uri); + free(abs_bundle); + serd_node_free(&bundle); + + LilvNode* plugin_uri = lilv_new_uri(world, PLUGIN_URI); + const LilvPlugins* plugins = lilv_world_get_all_plugins(world); + const LilvPlugin* plugin = lilv_plugins_get_by_uri(plugins, plugin_uri); + TEST_ASSERT(plugin); + + LilvInstance* instance = lilv_plugin_instantiate(plugin, 48000.0, NULL); + TEST_ASSERT(!instance); + + lilv_world_free(world); + + return 0; +} + diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/manifest.ttl.in b/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/manifest.ttl.in new file mode 100644 index 000000000..d6a4e3943 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/manifest.ttl.in @@ -0,0 +1,7 @@ +@prefix lv2: . +@prefix rdfs: . + + + a lv2:Plugin ; + lv2:binary ; + rdfs:seeAlso . diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/missing_port_name.c b/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/missing_port_name.c new file mode 100644 index 000000000..4ed44ed08 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/missing_port_name.c @@ -0,0 +1,93 @@ +/* + Lilv Test Plugin - Missing port name + Copyright 2011-2015 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define PLUGIN_URI "http://example.org/missing-port-name" + +enum { + TEST_INPUT = 0, + TEST_OUTPUT = 1 +}; + +typedef struct { + float* input; + float* output; +} Test; + +static void +cleanup(LV2_Handle instance) +{ + free((Test*)instance); +} + +static void +connect_port(LV2_Handle instance, uint32_t port, void* data) +{ + Test* test = (Test*)instance; + switch (port) { + case TEST_INPUT: + test->input = (float*)data; + break; + case TEST_OUTPUT: + test->output = (float*)data; + break; + default: + break; + } +} + +static LV2_Handle +instantiate(const LV2_Descriptor* descriptor, + double rate, + const char* path, + const LV2_Feature* const* features) +{ + Test* test = (Test*)calloc(1, sizeof(Test)); + if (!test) { + return NULL; + } + + return (LV2_Handle)test; +} + +static void +run(LV2_Handle instance, uint32_t sample_count) +{ + Test* test = (Test*)instance; + + *test->output = *test->input; +} + +static const LV2_Descriptor descriptor = { + PLUGIN_URI, + instantiate, + connect_port, + NULL, // activate, + run, + NULL, // deactivate, + cleanup, + NULL // extension_data +}; + +LV2_SYMBOL_EXPORT +const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + return (index == 0) ? &descriptor : NULL; +} diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/missing_port_name.ttl.in b/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/missing_port_name.ttl.in new file mode 100644 index 000000000..5a58a8067 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/missing_port_name.ttl.in @@ -0,0 +1,30 @@ +# Lilv Test Plugin - Missing port name +# Copyright 2011-2015 David Robillard +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +@prefix doap: . +@prefix foaf: . +@prefix lv2: . +@prefix ui: . + + + a lv2:Plugin ; + doap:license ; + lv2:optionalFeature lv2:hardRTCapable ; + lv2:port [ + a lv2:InputPort , + lv2:ControlPort ; + lv2:index 0 ; + lv2:symbol "input" ; + ] . \ No newline at end of file diff --git a/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/test_missing_port_name.c b/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/test_missing_port_name.c new file mode 100644 index 000000000..0f96918f3 --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/test/missing_port_name.lv2/test_missing_port_name.c @@ -0,0 +1,46 @@ +#include "lilv/lilv.h" +#include "../src/lilv_internal.h" + +#define PLUGIN_URI "http://example.org/missing-port-name" + +#define TEST_ASSERT(check) do {\ + if (!(check)) {\ + fprintf(stderr, "%s:%d: failed test: %s\n", __FILE__, __LINE__, #check);\ + return 1;\ + }\ +} while (0) + +int +main(int argc, char** argv) +{ + if (argc != 2) { + fprintf(stderr, "USAGE: %s BUNDLE\n", argv[0]); + return 1; + } + + const char* bundle_path = argv[1]; + LilvWorld* world = lilv_world_new(); + + // Load test plugin bundle + uint8_t* abs_bundle = (uint8_t*)lilv_path_absolute(bundle_path); + SerdNode bundle = serd_node_new_file_uri(abs_bundle, 0, 0, true); + LilvNode* bundle_uri = lilv_new_uri(world, (const char*)bundle.buf); + lilv_world_load_bundle(world, bundle_uri); + free(abs_bundle); + serd_node_free(&bundle); + + LilvNode* plugin_uri = lilv_new_uri(world, PLUGIN_URI); + const LilvPlugins* plugins = lilv_world_get_all_plugins(world); + const LilvPlugin* plugin = lilv_plugins_get_by_uri(plugins, plugin_uri); + TEST_ASSERT(plugin); + + const LilvPort* port = lilv_plugin_get_port_by_index(plugin, 0); + TEST_ASSERT(port); + LilvNode* name = lilv_port_get_name(plugin, port); + TEST_ASSERT(!name); + + lilv_world_free(world); + + return 0; +} + diff --git a/source/modules/lilv/lilv-0.21.3/test/manifest.ttl.in b/source/modules/lilv/lilv-0.22.1/test/test.lv2/manifest.ttl.in similarity index 68% rename from source/modules/lilv/lilv-0.21.3/test/manifest.ttl.in rename to source/modules/lilv/lilv-0.22.1/test/test.lv2/manifest.ttl.in index 48b009bca..bc3952cc0 100644 --- a/source/modules/lilv/lilv-0.21.3/test/manifest.ttl.in +++ b/source/modules/lilv/lilv-0.22.1/test/test.lv2/manifest.ttl.in @@ -3,5 +3,5 @@ a lv2:Plugin ; - lv2:binary ; - rdfs:seeAlso . + lv2:binary ; + rdfs:seeAlso . diff --git a/source/modules/lilv/lilv-0.21.3/test/test_plugin.c b/source/modules/lilv/lilv-0.22.1/test/test.lv2/test.c similarity index 99% rename from source/modules/lilv/lilv-0.21.3/test/test_plugin.c rename to source/modules/lilv/lilv-0.22.1/test/test.lv2/test.c index edcc5ab57..cd9a18c29 100644 --- a/source/modules/lilv/lilv-0.21.3/test/test_plugin.c +++ b/source/modules/lilv/lilv-0.22.1/test/test.lv2/test.c @@ -1,6 +1,6 @@ /* Lilv Test Plugin - Copyright 2011-2012 David Robillard + Copyright 2011-2015 David Robillard Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/source/modules/lilv/lilv-0.21.3/test/test_plugin.ttl.in b/source/modules/lilv/lilv-0.22.1/test/test.lv2/test.ttl.in similarity index 96% rename from source/modules/lilv/lilv-0.21.3/test/test_plugin.ttl.in rename to source/modules/lilv/lilv-0.22.1/test/test.lv2/test.ttl.in index 704f815b6..6fb6aed75 100644 --- a/source/modules/lilv/lilv-0.21.3/test/test_plugin.ttl.in +++ b/source/modules/lilv/lilv-0.22.1/test/test.lv2/test.ttl.in @@ -1,5 +1,5 @@ # Lilv Test Plugin -# Copyright 2011 David Robillard +# Copyright 2011-2015 David Robillard # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above diff --git a/source/modules/lilv/lilv-0.21.3/utils/bench.h b/source/modules/lilv/lilv-0.22.1/utils/bench.h similarity index 100% rename from source/modules/lilv/lilv-0.21.3/utils/bench.h rename to source/modules/lilv/lilv-0.22.1/utils/bench.h diff --git a/source/modules/lilv/lilv-0.21.3/utils/lilv-bench.c b/source/modules/lilv/lilv-0.22.1/utils/lilv-bench.c similarity index 100% rename from source/modules/lilv/lilv-0.21.3/utils/lilv-bench.c rename to source/modules/lilv/lilv-0.22.1/utils/lilv-bench.c diff --git a/source/modules/lilv/lilv-0.21.3/utils/lilv.bash_completion b/source/modules/lilv/lilv-0.22.1/utils/lilv.bash_completion similarity index 100% rename from source/modules/lilv/lilv-0.21.3/utils/lilv.bash_completion rename to source/modules/lilv/lilv-0.22.1/utils/lilv.bash_completion diff --git a/source/modules/lilv/lilv-0.21.3/utils/lv2bench.c b/source/modules/lilv/lilv-0.22.1/utils/lv2bench.c similarity index 100% rename from source/modules/lilv/lilv-0.21.3/utils/lv2bench.c rename to source/modules/lilv/lilv-0.22.1/utils/lv2bench.c diff --git a/source/modules/lilv/lilv-0.21.3/utils/lv2info.c b/source/modules/lilv/lilv-0.22.1/utils/lv2info.c similarity index 100% rename from source/modules/lilv/lilv-0.21.3/utils/lv2info.c rename to source/modules/lilv/lilv-0.22.1/utils/lv2info.c diff --git a/source/modules/lilv/lilv-0.21.3/utils/lv2ls.c b/source/modules/lilv/lilv-0.22.1/utils/lv2ls.c similarity index 100% rename from source/modules/lilv/lilv-0.21.3/utils/lv2ls.c rename to source/modules/lilv/lilv-0.22.1/utils/lv2ls.c diff --git a/source/modules/lilv/lilv-0.21.3/utils/uri_table.h b/source/modules/lilv/lilv-0.22.1/utils/uri_table.h similarity index 100% rename from source/modules/lilv/lilv-0.21.3/utils/uri_table.h rename to source/modules/lilv/lilv-0.22.1/utils/uri_table.h diff --git a/source/modules/lilv/lilv-0.22.1/waf b/source/modules/lilv/lilv-0.22.1/waf new file mode 100755 index 000000000..cfddd871b --- /dev/null +++ b/source/modules/lilv/lilv-0.22.1/waf @@ -0,0 +1,169 @@ +#!/usr/bin/env python +# encoding: ISO8859-1 +# Thomas Nagy, 2005-2015 + +""" +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +""" + +import os, sys, inspect + +VERSION="1.8.14" +REVISION="1d629e2af929e93b3210957e709a6c76" +GIT="x" +INSTALL='' +C1='#&' +C2='#%' +C3='#$' +cwd = os.getcwd() +join = os.path.join + + +WAF='waf' +def b(x): + return x +if sys.hexversion>0x300000f: + WAF='waf3' + def b(x): + return x.encode() + +def err(m): + print(('\033[91mError: %s\033[0m' % m)) + sys.exit(1) + +def unpack_wafdir(dir, src): + f = open(src,'rb') + c = 'corrupt archive (%d)' + while 1: + line = f.readline() + if not line: err('run waf-light from a folder containing waflib') + if line == b('#==>\n'): + txt = f.readline() + if not txt: err(c % 1) + if f.readline() != b('#<==\n'): err(c % 2) + break + if not txt: err(c % 3) + txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) + + import shutil, tarfile + try: shutil.rmtree(dir) + except OSError: pass + try: + for x in ('Tools', 'extras'): + os.makedirs(join(dir, 'waflib', x)) + except OSError: + err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) + + os.chdir(dir) + tmp = 't.bz2' + t = open(tmp,'wb') + try: t.write(txt) + finally: t.close() + + try: + t = tarfile.open(tmp) + except: + try: + os.system('bunzip2 t.bz2') + t = tarfile.open('t') + tmp = 't' + except: + os.chdir(cwd) + try: shutil.rmtree(dir) + except OSError: pass + err("Waf cannot be unpacked, check that bzip2 support is present") + + try: + for x in t: t.extract(x) + finally: + t.close() + + for x in ('Tools', 'extras'): + os.chmod(join('waflib',x), 493) + + if sys.hexversion<0x300000f: + sys.path = [join(dir, 'waflib')] + sys.path + import fixpy2 + fixpy2.fixdir(dir) + + os.remove(tmp) + os.chdir(cwd) + + try: dir = unicode(dir, 'mbcs') + except: pass + try: + from ctypes import windll + windll.kernel32.SetFileAttributesW(dir, 2) + except: + pass + +def test(dir): + try: + os.stat(join(dir, 'waflib')) + return os.path.abspath(dir) + except OSError: + pass + +def find_lib(): + src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) + base, name = os.path.split(src) + + #devs use $WAFDIR + w=test(os.environ.get('WAFDIR', '')) + if w: return w + + #waf-light + if name.endswith('waf-light'): + w = test(base) + if w: return w + err('waf-light requires waflib -> export WAFDIR=/folder') + + dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) + for i in (INSTALL,'/usr','/usr/local','/opt'): + w = test(i + '/lib/' + dirname) + if w: return w + + #waf-local + dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) + w = test(dir) + if w: return w + + #unpack + unpack_wafdir(dir, src) + return dir + +wafdir = find_lib() +sys.path.insert(0, wafdir) + +if __name__ == '__main__': + + from waflib import Scripting + Scripting.waf_entry_point(cwd, VERSION, wafdir) + +#==> +#BZh91AY&SYҗ \`#$"@#$#&# (b|)9#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$dZ=l4^{;>s/l1=c+lշevFnz39|}ԛc[wGp#$Sol=tPt74>^{]w&q4Zyi7֯=p6}#$#$h#$^#%#$J<>m#$uٽ=5T ]n#%vom#$ٕ;JFh[ QEI#&#& {(#$#$QP Z%Srmׯ{ۼLԶ6#&ѥm֍hJ{޾=RӺcN^iwvwݽ׶mr}}eӮ:#$>[@P ѥ#&a ldhTz7%n$#$)T*PkU.޷u;nlrݰ{uim۝rn;ӣ'go{W_v;ᄑ>{ǻZ4{]>С;{Yq]/{|^g;۾y^{:2mNvdvZ;_kC.n9>ї#&ЮNv}:bieޞ[ܘ}l'I}7>^{7Ŭ#$nkӣ>uګkE#$P#&ۻ{c]t{knesu_{{w+N#$#$o2#$Wyo}}z]{{Xڧ{^NUu^>'ۊ^2zjv};n#$#&]p>Xt}}mw=ڽ̏{Ob9ٽ3ϛ}__>XO9mϣݒNwoJ9eVEZ}/<ގ_VԊ|`yu}ޫ۸m罟p.Ϛ/U>ӗ;4=#$\zSZ5moy|{vuCL7v>CeWy-ەl#$U;S)#$5n^OiٺwFQ$u޳sw9u{}ɟN_w#%v=^׋2N7vEӓ޼"|mK|g{'+wexvo:եչm9L#%06.f E*`|O?땈IR*ouxT=bnL<2MÎ{!A @ĨT.3guQ#&)bu5)UE'rsU0\[jCϝ2B0",)(HkcmFڭ֢U\ڷ-Xmu]ַ(bb#$Qm-U!(5ZoԣGU#qCMo/r䛺N銂 WwW"lU64|r]|]603EkָO&X?*RlU8$#&#&[xPF~ ~")` ˜uN}j]~:Ej+=ڹg10SQ;٫8Qơƣ\uqC-/;I0#&E9B 5bTJaQznE93V-wWTF,Xb0EWT4$SC"ưH=K<@᜻E1Dw9cgYUsb8dL>JTZ%/v֕rX]yaڻ;!vfqf iG^=\ɬZNjz!Cn(bcUA_]Lf( ^8bPȸs&0iGTҷo⨧GLL,e9/8^ÿEbw.k+y@Yۄxǂ$L5!Liy%6TݱvAAzu#&bwp3lnrm!;Mxf*Мc6I!{">f}]e},AW)+T\E&WO/NχچCuBCEZ׍-[K=빩@HwзoP/C;8\]J.NeP1y=?*g~LLEG>Х/?m!I1C͇7iwkr5xW 4 Y) G69fOy,#&bD_OL]V0m#%bzh4GvהDc[S߲:'zͽ?8":q#%HPnlZa$Mc|+}4Tu^3d{r#&bjo:H rrb()\Lj2))WJ\)t!hte)1LU-9]2NIL: SJ9S,&\[aܰy[ɂDuyrAqyʊϪ>kQL{[e(C4\cbu.+]=(D: |=O&9mMc ]/#%I dtҡ~*<^e|]ͭiz/w;t sb-;]Oƺ%%q+ 'HF;|qȷbSYfKtFi3!̑%0`}QQV#$- 0QVjٮJb˜CA`-]#%(A022HF);ͦ4AȾw^<.4M]m63O9q#&}>a[>o]U6ڦ~(߾(x9t==#6W9eky2Ĺax#&%qVBoƏ4'sF E7CˏSN̞}\1Ƒ#$>diD+gVy<޹)J%G)g|P<9LSR嚡#:~S$>k$?[V>#8m3G1 \/#$;H\h,P40 N,b4LclV1fPuO6m?K#f͆w[*/FUdi&;yI#҄Jk|#&xW$XގN_ә#&%q8YC8A#&e!Ӽa-5, %`n!A J)o/xsƔôԨ~GLK!ʬ@CMGqmgV 1R65yeON&&Gt ~"_\+BJRUQ#$,JE?;j2^Oȯk3m"lu=FS"Θ-PoQ<~fYT"98XiCzv=:4s+9.~$ޞGtnTw\fF,ՠ Q#%fiKҺ$]UqEh՘eT>?5!yBͪkF #%VBse10lیK>rЄ {rviU++b\Ʉ+%\^޵,gӹ#m_Vf8h|,%gdGM7(7VԠEU˲G׊(DJԭ*ZM0^!ѨȜ,PG&onۢDI)YRyۓȥTE$6?ew#&_&N}#$hw.UiUæ;KpH2h"ŝoF+D7.oi3eLw_T\6.ݎy(O(*~Z#C[4#%̘f/Mܘaa4[ۘ#+01ά&N]ǫ#Ғ24țr.dsڟʉˀd*]+!|o{}^w.&ߊI"\%魽{amGWvOz#%9ꨵ${K#ᘷ&0Z[M-~M58"ۯˆfMQp-nوn~S.ӭe\+ל4&4S#% ͻLЀ :D sM }.e'ʅ{b̽2(cʃFcJtI:4& #%(XƂ2T#RltuDS)|x8{QxKL mϵ&+S,&LW|t5geY3vEifo}XTx2AoU 8tqAF2|/"'?ᙗ~N^ZHݝ.3co #νFaXv8|Ks Z9zr&LɳXjl & ȫ av∭(fΉɲH#nESyƕQp-o4G.J iĪRH73xRMC#%Q9-sߒT Qco,sTS5ގgՃiIM=@2 ;n6WxmVШVV""S,¦ 7#&ދpV(PiUk;aK!F[c!LJvz~6+DO#$xuН2Pq#%3G嶾}F[G䞝ӅQ(ug]mD*˅[cFS?ުOdhòXĩ-ݏ#&nfZ#%4Q<opCJD̙KCm"=Px2m桉y`:Xyy/]X\y01o a}a"rc?Fuȩ7=m>T4BOϸDSG5j]%:=Oiar{~%[ePsvI~+z<(lB@3#$}? y%@Y~g.^f9&Z-WFYf/8W2rc2D?S@~*TMUwjBk{M+y 8$"\fcR^yzi[t`T #&m~|Rf#&?-;q.~}C0A+p EǗMen u@]8d\1E.!Nbj敞 _oyt#&ӊhB͞T販gɚ #&Й >pŽјm(vk3KT?nԭ7c"98,nSj?9c !;~/,wم/~wT:ڋ0*ў4SnCo4>;NNx[a/]6yqoE k_MpF ;kz!0#$l3{OmfZ`6]ogUDPQw){Luve2ՕD9](?LW!&Mːk,$NF846xז#& ~opmܢ=ՌQs&VH )N+dj4o >-䉈`'Mtvw-|9#$D]Fֺ3ϷCTlCl[qӜ@ BFR/ )?oʧ=JtI"x`=u҇a|]Bs/{1ߟhHyqˍșUE!0 fn%١g l/J3{ f8c9l#%b3ׯxۣt}Nt3?BO&cOcC@lMmbo.ȝgős탋q!!*N= .Ր3])M{?)3N]<1 =m#T #%͟2luQ)o^k\.zk_7{wpcq$~H+w4L} UcANܔ4kN"UfǬv6;\k #&)Me#%S"gBq_uzD?{*MTjXgv^i'MZ;%-#&m,G F|^{!vZ[uF:3ojB˃(ݸ\wtv>nmGpx)+++wp+pl<{]`72ۖhs׾a|,x]G% P+0x}o5o] W'{i5)ξ10DMtZZ!8SM3f3CA#%7<*jzZioINԘ(L^{x(]N앜C#&p]M/a`&tGjik;PS';kRGX]-;p8.ڌC,AFV-!;H8"٤;6ƤpQyf[z4Mt8Mֺ.CzX$#%1x ^-׸v9:#%z၊Kh`b)"F!&4V1,&IumX𓭑˹(]+|l\yu WB#% ˝c #%X9y#%Z71Tm.d4WL-FNϏYlY}'-28j|W{#&t/Eק[T)#Jab#Jbe;h]/){xW̖(c{'Spγ1-8yC0T$7ٛ^r)YccNLo9I88b wW7%8bu>Q§Uv}z3<7!#.ͺ{q{k15D7HPUf#mâTTߦ:}4/`ò`f#%~zHɴ_]@,YY(#39v:ˋ5}8w󢵊>r{K~XaDΪZWq/$Zwza]ڼFbH݇-EY"[BD#&7ݧYY2 V=*cW7ߥo#5Ǐ`5.'ssDGW(1Y0i{4:,YaBciC=&s(XBݚ3x ̇Su)]wx6J{HH[ I`K UWBA~-=s͏אp)ՒPTFP,6#$5E2ƳSU*+"qLC1.j[xO~m)k0VF#%9a+b˱J*k]6Uo$S;GZ"/(w>!EXQڂ/ŀ;#%N<fUQmTI4#%# #&+ne]A"ߊO>{W36(E7dܧ >c#$%`‰023rM^uM{7<ɺVTJ]zJ`}T:m'=rY)iK8Jurد椐vOs*Ur;'&>s=JXws~do}r1Vt镦_b\<Ng7]KC﫣+d5,1"I6smXH?ܜ:A0NwI~ j4"},lv=͕d$pƏn@:(o^lyRhݮqcy!wMrp!3m˓*Db2Fbi2O5 >ZUTq'^HMsgڏW=鯑168tSMc>#$Ŋ'E"֜a.5!ֽC%|unnmІ9+tv #%t#%j0mͶF5֍nmn4z-ׯUDz|ʉ]-K^*N#%tUdÈ+TxBgF]@uH*8 zA_y0SikW|x~HC7{'I[S_31s9λ*jͤQm7Rrh#&V8 vn`OK𔘇yh+AuDWYUʺx׽;%4᛾>+*e/󼤥r/+~#)#Nrhۖ=#hV#@xc\V2\LOG?#%}/fiEN-7|9lK۫ĉ3+mHӈbԑU%V|)tys>z Dug۷r_ZlC-UU;a`>Pn߿G<>nK SN,ûwz %A|s󷟇_lw'CT3r(TAuigpe,fbC6T'qKJmƊt SB>k![?UL6mUS -X33ϫnjDbwPd_S3?rg #ㅪ?Zo,(DdDS}i<3h]Y!>KM-{_]1H-m 8#I|+_7-z("TA0A&HJJQqVS&xk4 J`R[ivQ X*%C0_-bY}Oj֗av^80Y@lN܃ƣ>0ⱪ~/~J( iYvqj}o>p)5#& x#E$]laQ8׊z#I@Ô"Y:*+Q#&E(pbawJQzuiJtwQAqoҷ/\5'_A"y?Ȕ(~bH:I'{`:PZ,==31~?n.xBRub?ɫM??꿫s/ֿ՗~ƟާxOv͏謎VUg?y6wYM]JjcY#xn'۬9P]"QOwd4ueUTq}%8ړ{ʴ[3NJ[SI~jZ<{͔j,JbSn7t!Eit=WK5ƕ>*4aA#%B^07`djrUFB#][*,w[ᖯ<'6#%M^ZOҖ.ux+`n%-"eMӟz3goG+Һz],YKvj:j6IrF#Gb2ӣWpߩZ1ja%8R(U%5X#&mD H-&1q#%$m*4+qAi3G!v ?gaQ?*zWѫg痓˞у}Aʾ+Kku7[C]mTQ<13_զF#M׶6BE?#%9gT#&9KIRO>nч:X̂[2Kq^\F_Iģ_w>CZwߧĎ^oQGu=~FcZnգN嫾]|VXQjky#&_[ӺAeݩ^^qe#%v;%`q5wnN|jFuW&pӻuv#%eIڥjԳ6JC$rV]%{ۏSN*6Ge#Gr_w:-eAyNeNEuz˨MMf&xtMQkO_ziϷӥ+5҉|{5C0ד9s94Wrˣ*k8Yaᄅl+LGZh؏MqbvPްnNTۡd#o6=U{ZMѽ{c2dgz:$QDyCF­x[M:K96%|wqqc_]uTvxƭ(xR3'ۿ pѕ;_o?iۧ=)>ߗۧF~afJEWqV tчλ*LՏ eGsU_LOݞ?鎿(|ۡX3ǯV‹uc쾒7h;r\x=8R4_&~9M4ȰkP[ S#Qc~>y3~#&{5Xr?gSAyCqHeujՏa9U}/k^[>̵!soo)]-Ǘy:K!γ6co]")uB|쏼~|bm s^UDG /q0Oc۵z6׈軽f?Nx[ߏyĹ-G3PWֺuWPO!:ÿGUʒe?nTԣ~N/#&=v:Tc-T-WNtjvCq˯V Pͩ4+9d-R/SUJ؞IԺuWF7%kΨZt껯+ycG rjtfqJrT7YsB#&u.1ݟ.(zÄ֚),Ji?tJZ8Ea NYsN:)1f"rTMfVf\#s84BcMf'jQ#%{),cF8L%B 'IԷ%JNCb(L>ޜ;{nˋYl綌0D&fH|'^f<ӯeEvWg-{,.lIB#&p idRZ",z}2* I*m#~'|#%:z갩|R3tӢ9i{#$~qFU @Da4lx6s^fEǶ7`u[vxDWvW_/MG2ڕpbW@{x3J>ӧɻst^f#5 zV}U~o2Do+Tlr9QSqUԓ4<^oѿl5Kg>ɶВLI}ԕ'ё]5#%Dn^AJc$]?ihkQgԇgE$#5#08f`^rz0#$E aݒBYPln\ ^I2(1hRDM;S (;Zatq#%#%^^4߳SKb}$˻#&Ά\iRӦ%?פ#=A^1^-t/\kh#rO%9]^>fOC>H&w[yMBHVsأ0kO{O۫_3\BO#%Xw+杼xttGY4j- \@/埚i\|fǻ>Gz:d>}wttUwمߺѫQ0N}qpf<35;AB7*f+?g60 C#&#,1..1%11(.+I'$QH@f!2`F(F`4ėW)R۾-]1+bԙFc*#$|.L%0S%,BXdRcbC*VM07q`𬵥<ЌQ#&8X#$An!"lNivyڜjfJc` D, M]H1(&AěI6‘+QlMd@IٍcW#&Ф]TI"&Â@|\e K@aDQP$7ZܺD :*r63H"GՏJ&dҨfj죨9a`-vVJ @:2OP:>UaexJ̄;39}ؿVfT~Fcs]VHw퉳w,mʝcY ZU @q[C5goógw≷V,ݒCu#%Sw[sM ږΝA!L{<9D#]7j]b>.sqVЦ*鳳Q^޺őiM'ܼwo^CW'2")V,:02.4O0lOM-#&Bp_(Hؖ?.ɐ.DEA_^ѿ3C<ͭ$\?>s$E #I|l:Աe}>˞=T6O#&!5>'tYQ˄+T+ħ1呿#%.ݵsTp7 A2`хُ)'i*]pvg%u[1GYRs0'S1t[@\bυ r!GԐXv?2 Hyv;R3߲S{=V 3m/VbBB~j8U(㪜"g^fۗ&%D -(͎Lu~&zz|UE/NW&<50!kC#pdd(#KrkI! +HXPmʋXiRrAcxVDi58``Ë 0,ʐ#%֤q o43Z4̕aǭ*|iW2ı rҩ!7#&e,~3pH8#&!(cvM9 8QNfjƫ}v,AqiE"(v-,BA=Jٽg^]jJ](Ɯ\Cbral$Y"SƮ,llf*Sth3*# aI4#[`%"I[f.1T*̟ſTwɜgv^e!Pz1X:Xm W=C u43Xцw-4!HILl%<(,XL!H-tαf)AFQPm륏p17755r6iRL5YiU*!c6ɳؖŦ3NBuYůxű~6c@){SH` M *H&SmdA^0kRI$_,nmQS4f(FiÒI 5#%0%hlY~4 Q)\w@뚆~,Ӌ^-6}]#& ͜Bfl ;/+||׀|`ayԺxyVe/U\ɳ휸ؙ̤) ݂l7,.N< #ZιG6Cq8MݵDA(3!B'UQz;Vŝ]S$V&%#c̝+mՍͬVBhͶ؀+%ˏOY8M5KԣĢ`CHjNq:ƈ,#%%pV0)o9g$Ë$OXeJMΊN&##$Sx販exbT蹭k ?koWߙ]0/[)O{oY>7,N8c#F#*ZY}#& |.GA7b5#/̕8#oIO13 N0J6#&[pbmX̳ʋ~ڝg!$V{,{doqy~fSnĢQӆ/w2R $B?YΝ'I_dGXc3RDrgGm^phzgF?x݆saOYå(gT=sx^nu2Kdeh>Y<ӻ\y[)^Wq3jT%v<(:\cvƒb1&Lsv.lcZN}o)g ũU$4Ȅ||Wކ=pP~Vx~VKCbiodD{'a˂ \CWgkcpyql?[80xsHNj#%\ʲ-OcAw8<[9c0wlPP!: vBR@DWHyBO^w̉RKhZ8 Q1qJ˽1U8T`R9)P=04Mhxgn&)7ˎq(VU qF!=Cm$ʹ"Dd>NsXWNݺ%*34F5ʡ/s:VoԐ](OϞrl2~Co3MQP 5daD+#uL)kaZ??㣩G>'$Krj*XeV,ھ:mNP> >:ō<#wNGnBR%31|M(#&,27)^Y>'|GN4agkݯ|#%i4Rs·MM͘Vvkg.#&U92E;*Yب#_G$R#&VW;*K;"yB{v)FCwYk+Q/?W=ϕO54"j.J9_\ :t(/U1ԪT|PbCY#TihRjEQ H6-մ;%[]ʹ%Eh(5'u[β-\PޭfӔ]kpYV~U^cuEoAv6WjUJzK~v}?wYlwѮ02EbveqzEU^\m±gۤUe =T0XP>n޸s8lƢea`qಫ/DZЯ+S#ԙqn/hѳ=auQ.q0)ɡF.!7y~{suG.kǙ CtP׎hX(sy i'NTƌy5#&TswUNv죁̝1%ͪT0jAC8.8{gs: ͞7#%v>Q{|ܨ1^I)#b7sDKT=:ooE\+Tܬ<|bDtoQ'5fwoN5mml%W ]pprStɺkpˈ- qOY}g#&E\:ypeo׶qh]wfO\kSNIw' i sF#%$}V9cn^A184~1o?񋚗<U4kvi]^C "`I7p;=a0LqYϭ?1n.[ܲG z9TGlG\cvGf~Pν>qV\$ΞwHiFrkR8}8eowWN5QOO~"0d/MLo^a4+^CkQ>{wk>>%s^zN{cI܌Q !~m=#%fӌ^wGD43g?VMsrœ0|цY>f}wG+~D}?DgTs}6B&W.k?o9Gf#]c=6ҬKu `U$zW{>V?n|3w{ ъVEJH_#%[_E1m*Z޹h#%>bH+6s|,X!`U67V4*#%FT@bA$ NhhK49g}.~Q.ύ|7NZƼ=cHqWZjy+U<,mǟ>)֦/^X#}_s>ՄqʣRTavx)#%?,Yg3ӋhM#&vt6v;Hzc]zﰝCz 3]ÙB:#&ŅdW.[\оq~~!2B?ku>xYJ4N Z\DžsOMWQr|f~T#%YǍvq]O"1G\AgʔȺ>zF}s9G{K hN$_8}yRf0p<1|K|9Y[wU\tߺ,Ҏ87)V5 }bzn#&yOtF5"׫_USUW#uu%+؈#e#&|$=v"u|m:0.Z6YPi^7w٫F0vslr>Wu֓¹)'|!UzMbNS5f ]q3ƾSLJTc?_oz/jj7/}xCMKorBll#&5:qĿ_5f&,66+[_bK'ߵpasĮQ}7Ln>-0pSb+ IG3n=7ln=[4-MP&I*Hd)h٫GCv_E[4xA3W haMPi"劈vFN>#pƞ4B.O;%GPnW嘹ƁH!ӲSMU)nUN-MmNknDq6WL#̦T<c Z|1X =@MZ/-fAU=c6nq^6*9}1";CĹmB.nѳt|N&糍GD^H>nY1T.qwckq^|iC@jb i*.O.=D#n Q]ٶC6J|CJ pZRKj4/k'i.J;#Go-YM(!(98}&K9bI;"c߱@yڀ!>^ʮUtsQ{ת ]=ˊF10ӯ bW3-3 H#$3¸>wq@;u8x}X6ʬ3LM#$t`_@ky_9IJmմmzX;it`W&P9эGߺ~obk1ne|+. t?̉m[΍JgN{*M]?Em4#$w/ӹ88LwJӑ'!T-Wx+H{+7O~R馂L:dr:HqOZ%ʽ0DLCzQ?!ʑ!(kx.%WU!!Ԃ9=":j}N#%/[#12= 0#vF$@.:+^0 ,#s]?{u_{6TE Tn"zD;Y-E!{_L@ Te3CW7?.ƫAR `i@lٿXնEs1evTSSGȤL7&څnqU.M> a]t@`"0a(- #&PkS2kRj?NYDe$dgg5XV$-\+`r3mCG+^we%iA# -vPnTq>D[RgkB|㷉Sm x+hyt}lFv-5iF#&-wSQ$S\1AL>Z@4#&q#&="M4V#%>d%?p=lЉ߽]"I6ZuTٞjR*NBf/!)8m+sp@Xkp(χvߋ;nkMm藳}S[Þ)تyVBYj:,ϔ^+ۅ9X;YNDM2m@_sw0l)͑ #;b5II6gI7ٵS&s|*"7AW]MQE"LPZ{Y(Èf4"4MpPA~#&@ӎy6J>ƊUD%Or϶fd&c}՘3o켠xU9QyRZBN[@H1xW\ ۯ,{ńh#%n^qc0Q}pz{vіA6w`G?(WaF [sWhqWƱ#&s4q+OF;mL3qάM/-vlMcՕyjF؁OO~mЕIQn~:rQU-pHvMyY'CeMP@N&݄_]1#&yo\{ y1D)1_"#%y5]dOM8/jQ'} rB0lJ[j!(6Y=:ݥ@mz%: iP;s+Em9.M&3€#WG':n-7hN*nf;ύf8;R2]wEN5;VUNc2/7eFb\^`+Q_LBNRtDM#%d4ȢdcO"@~#%ld#&n|V3.1d tݙHeB9Մ<;C!EZ>9B7 ;(F}{uE=rw]00L jK/1{hn-!{*)2NO!ڦ?',5 m[:Q#&ICo#%ªH{QfHrc#%( 6hgL4=6n<('~0FK].%[wP5(2LR k^ #Eç4,Kǜs?J1-WC('w/^#>q9",3eEx;5sZ:Uu%obl2.hXe˂l)1*m=<<+%꛰Ӈ(:u[Y4qN\ jMwNifk&HǻѴ)˿|K)×J|h6C>fv +=gVuFs{܊SY*r\_WKXͧ%Nd0 ڳ 0NY<|z9bM#{;V<˶g"NTv7W#%7ܩH7F1SV(#&[#&e?#%gWѝ1ݹCCƼ#%KRu`J߷n^];]MhBPxS`'hD|#?mBM?ti~]d&b+Co^1sK[p2SsLNWWI Ѭ5;F}?"<lj8ȋ?0D2CXX"щB3ǓI7}p}3L6_R``d4DgD#%`t_*@Pe4$=w"пÂd$=WeEM2jp1=*8$+Ƌ ADFy<_T䶸dz.XuK }"aeZI++u= !8?X]ycz#%xTRk# >99"olk(V-=Ui[x#9Yʽ~a`tLo]Txm-Ntỏ!$nN+\)n`l?O1é$xYIGaUT֩ _g[;2۵w7fQ40aK0 >DH}h#%+ڶ.q9 EoBb #%&}73G XM^ds n_I']F,Dž\y0igj.52kt*8}gMTkh3Bv}#%wW_[tc,Y$$AF#$L`D@Zi*S)E>zk2 sMW(a9hp*E'( s H8 .X!QB,Mšh)JHY \IXڽF|9{fd##%KJ4uB*v:*75C~VzT7@ &3wd[zH)($'_?SJ( X( q:vf2qx1H|j1@;h\u:!bGX0g+?1NTDŽlD`gU_k_LV#&"w`%zm[f#&C TŰ1iD`t M3B#$jrF.,o6tp;cN#%ސbF-0\h0܃#$7+QV-\|vco_dЀH ^W7c~G7n5Mx$90ZVxd&)nG[^]_DYB"pBp'FAIN]xXb)s[ 3> 56wX" &09vqig܄ >p:cR+!T*=q9 H!DDvi6;B\WofPOSW<DX1`)Vj05\ҽ*]28߽"ie]ZW*˄KsmK%l%ph@ I#|*n6,K"8߭wNp@N`ɖ3#Ɯj#t +1IeԘFZ!UDMAשZ7lэ4/c0R8T5$$;as8hk q,ݞn'w(+ywc'uHn(7UHa覞Va>jOˆC_HWZuȜ^xAC6;0 PG`tI8X#&!;_}ysR<4ikGn)CW`o%}tHWMӁ٧p={873#%B Oˍt.UpNcwN"$_Vp GHP+.\ M#%qJez߿}4m.\=L&(A0xOuQoߚឦ>v۩#S#&@^@Ũ oM__vD]y*)2!:.e]mq}/{?{n\hcܙDFf_$N#$'S0K#&Q(%wWBۋrBA1ݘJE'L,9+vHns$%gZ}>tZΠJP m"#%94FbArz֕A4ɵEQ(#&kbƒR11ȀưLY!XwW@[ 7l=;h {!_"Ug7#Q$#&枂U4V&2ޖ#&*+M$jPSׯ6+9_]&$H#%;qeodž8;.MLL#%p2ltBOВ~Te°b?.@yNL#%`l C7c n<#$Wۼo?!Xa$aXBXGZDT~΂#$ aD[a@65(V 9uvۿ /TL,30߇W﫳n`ǐ<9&hT)~!H>#&007 CRMߋ9^SvNtNq2=~!<"Gӝۛ(QtbW3N#R4nnM,GFȿ@٠#%v?hirVn%#%pB%B HUL+)MP2kT f&v~q!N^/<e1WiXd#%)$%(EJ=5Phm_l`08RsRNaf(y7Vh&01r`MHf ݢGMt#&٨@JL4k[P_J_F|#&3i 3i"bs(y߫Qt/䍏"t*S9BLwzti3%{c(\.R/â 5f}/eET,lj;LtQ_d,޶I>Tvm8%"\pm~Ck`|z{QЇ=#7CnCo_#s}1KւN;5-y(\BݳsO)F!R-Ǖ~'K cqBDX&b yg?-#&Fo>njPŔà]†3%W*c"4FU"zU9\)2!n{ލ;='/6#&89ק/΁(h6o%TF+NoT1؊C|m:>53?|y|){xIȵNCBLUG7?l]V14:_?sŠj.@BCv{ܠ@VP3(ǚM(ژϖ4BVscaY>㟅R?}tH|)u7(0֭(d\>w6Y5$GPWջ؋ , A3<7Ls)z;ԑ3[{9嶈 !VW|nN~#% z[z=g3U-?HG`g/cmMul`#$1dZNcLT|님b|͓GH 7ވGIo7v4~$4ytK#S."ffG;01wfY2vwG#6OnfhwUێJ6[ˇ5 5iгVҼE6:iUxcs羝#&{]_\۩S'(&дƨ9Q!)-ٵ0[s|EW$5{#̜|sx;hm^-43Yzon'Uodn"Q挦.R>3c88mW0mQKz󐔴fPTS2:ߜ{ȋh]t/ay|yd0C2s]Hx\wt7AǦV~$1q/9*!TiZbJF6WryQO./k%EU~9^D3rCy '}6>z6/ÒuxCְCA;6_q,seQ,Lˇq=࣬ arbB/)jsMK8{|9 98eyBDB%Qt|[g'nK.#qͭ,4c3% mhr/B?VOR#%ٝq#$d훩mq%Ŀ/6sϥq鳟 m5SpVgpZPvkAɥ8y{=ӯo3֮򆯏 ,󫧏;EN2E/wClt+^ȱD^ayBdBi]b__a#&AL<hFu4ax/y0ႯT |#UȘKާI}q`aBs=ӟ/ _Ӝw`?4e3mQ^Y 6/.IO@ S#5\*OzK}aij}̌]PFMeE[K{褸g)kr8UJ[4"~:(AJD9;?X$F\9 3,B+DŽ6=fOCQGBefZ*hcigqt]\UiyxFZOz1OQ۵<:UuFE/l;sx'I0oO${{aMlĒ@J 4}ߔj+/w\ᯥ1`cg"DܙkQ:?Et`Ql*tX{T7-OAآ#&GߎS|xEvkZY8|Hƶ PӲ6[/Z#%=R#tNY*.p/S=\S3#J J?,dy. s폾9x\-j#%̹);S]08;k)ѣt+3»M4Teu贅 |g?%SWё$(wd'vB,F#&@)\7Ty2b>#%2q$Hݺ_%ZU{D`B׼B5C0LLbM#%6ڱC7"ݚ9hxжv{"0JOiV0HA y<W;+F͏O@Z=iwR:4#[P+QQ#%3׽n:gv!n\k#&#|z{( m'wDp3_Ol~}:.6Z:Mx1v5;#%8زL䎉F>zACMh@cXmY/f'YZEi:sI!kJ6D&3Кޢ{%U^*Аl&kM3$X5gm:7cf_>zǺg*4: )OS.ʴXW!.i$thB}8g|2:U*S4i<)mRCw$(fZõif 'B&+a+8ԉ"OkdC/ \xU_Ȕ^yɄ 7\LﭱeN7ߖRyЄhC>|j\Af[Cz#jDXIDȨL;,Uj,ĢfTLJU.Wp9]Kp7'Ǝpζ}/'-m* OnU^kǢӽzIپyG5{Z+367B vSYc>.7=cl-ۚL\/@?v$G~{l2;uDZQJC'C,s6o\P4?7kTh%<Bd*M7O[(x9|Gn11[]bb9FNOS:{;=/O7 ~*k"Oc*7o Pm:۳ctZFp=ݝ "=cFciVk:)]:!ӓ6q};oM [nxuBQKQC9`j[]pVOcLU upŋ`NhW% kl(x*vya:(LuLr|U^ߤc߬(;!HLec \λgtrr0NGaMVWO3%#%8f-,g^YkMeQhޤC ?W~y=_z:Xn)?|$|eh Ar3xlZypȂe1ƥƞ. };Dž1NUS]+. /syn)R-YQ쨮Y<#%KܿGW=^hoj=jk3W߳Ӊ0`VVẠ,`+XyzcRgU PFr}ƺO<%+ՠc#%f 3@Ipe2vfc4Lszq G4rC#S2@F#& +PfOdN5vȉ4hj1"_bdPAGКξ;9vMȐ'%Ds9Jۃz}g5 4IGU1>ھGct5=7R;×N7T [GF81Wy;>Po#!;&MDXUwoTR83KI}n:{Hd#&0i)J11qF%Ѣ=50YeIʘt⎱Q|Od_B#&Gfͧ:vfܰ7M#&bys?#$i"DΥ-DǸ).1 &`Ꭿ5ٶ!8]zW*M#$O0JCS[?\گ$s3Qu{}M6C#&[ȯO݊)ƥUmS|}̓<|C97h#%?/*wNB]3HtoL-! PlH!I:ɧFàiJ i{H; 6]? CpL&9|O{fy2:~ZMS/ ؂]_Yh6?/:y$}m /xByB<-ti$Ҧӳp0_QN0]UK{1$|+JV/_w"!Sb/^v3q@y12,LtތOe%-9TZg2>w1!"8Xp46-z ]ᗽR~2dDozxއPJ.LJy&ɳpy]nD#%?Q~sށhmpfAOYDBPA0`۴3Ct!in_#%δZ9;߇%Q fj0I$Las5hJd>L)ݽ$9!e%fYۺI$,;e6jaj+I2:1 QWij+aЩ-AرbLJ~@硪v(i#%Rvaܖ] l2~O>1<{o%ϴ[ .2#&KКZ"l|w}8ؑ,4C=1j~J"ȱ]h[,u2l:_OIm4 TR @bxQNv"0;}YgGXp~یPFS7>CS {$8h 竡@6i}  6w+>otpZdZ{6 h, BG;oS!;W[:랿d5&OO`10[!zgy~(= y[pW.]2 Hi" 5"=5Q6D >,3xB]Ib5cC|nǒG5_uwzR*]785$UYW211.-*̨i"LJBLSJS#j#$?r#q9@34Oh7e=y0::[#}=u\os͍j%ޝ~I"J-J==}~0$:dIp:˄:eT!/ȣץvLD~-$\QMٌ&?LLacD#&s=5U.yo|@6m#&;`8YIMgnfgD+ 'YqUe YV*%-hd;f:DPeS1Pӟ;1`;3^wy#%Ҡ;.C:DȂbFGo:44l!3S PE?;w7GXr7Wu"z}e>ҵ (ODAr9}MmP_`++AGO~yBA lcly6SD #$X#&s(SC9kִCJhp9}Cgc -FI/jDOR?f0#&<8 B@zAhܣ" .q"<:=?~v #&Cٴ "'pr64yoH~Si~#%|޺Z #&8{#&,4*>~??V(0<'J,Dݸx=D"OjH|gN/ADcu~>| b#&,b{<|#&#؞h4GЈ3Up#${:;;2r Zrc4UfC0P#$3޷^;A'_| p-=!APPXH(c $ |7j[ܧyХS<ӭmOGPXG IM>ޟ Yu@ǗƛmX1~t^)"ۍ~#%sxFRPkKܥj&=q@2$1a '\(Mp'O^ ÀP9#%^ q&!QVw S}͑E}6tÔogZ5gv*bzB{#ɑ#%k*Zd:3`<6#$0#%`6f7\7FEϏ|Я)/ہLBJ&ؤߥv&)Yahl#% 8JL##&[%j3kZXRlCOORUN?qIhB KUc(8|Hs/\z#(Cc=$7p7>ӈpTHH2B!@JE 1S;&6!2I"jطΪ}؀g8^d?OXUTX0t#c98Ñ 1#$.%$-˭!6>?͋|w3P"1'ªfKlֱ`PБEŐ#g#&kUMAqG"G!PC?l>Vb r"Gg&yZJL(k" yiLQ P:QcڇBnj^1 9i>f*b 4bhLCRRVnV!ZUc#%~+2Di#&<;͋4#UR "XG4g0{!dSa?x`7Ͼzx9 OL<=D!}]Ivhq|tHQd#$?  ^8:2#&IptEa1.XpOg+(z}_<1^b#&c/ I336-$XD/Xh68'L@ߕQ#&#%+#Yd\q߇TAM vM #%Cc*" 1Hûj96؇:jxKZ{3rݭY4ܞp9ĵ=rv=$EtWRr(8JZBPQ4#%g#$׋D$W;!"c~xTŮ r#%pNasoP#J^fKdV}S6ג]m9tGBb`>&A Iu¬q|yo;=#$P)d;pf|SƵS=>}hCO)RXFТOI,=Q4$k)#&)rI=xps$'IzŤ>;Z*^ pȲ?cO-[qI7:H;yn '9r$"K4'Q|o{+6?;95#r#$\L5 0}zgqK360BɅw-#&1~㠧WϳSuAD>̥AX6#%⢔ty #&C#& !"i#$"~G`=+^)HlDn(Ph,3lVL#%@b,ZdG@wLcB%c/ςg0ŋA4 MCƈ9i#$~mݬ#$@ #W3w޺ךR8}|9#&X**U?3}ŵU}}UjH =q~E![6ٰ$ V#&([ڊe$P,n努}C7Nà5&G!< A.tA<E,A`j"oC~IҌ#$p>3z^_<+DxÝέ; 8#%[ldYC4 >N(K(cL 16/̛8Ƣ3lh47?f)^D?q[j xʤrF-HcQ444`_HA'ig^!{;=5UU^ $>_͚~b}utmZ@QZT(o#$(cXT79iQα/c@?&?[9>^&HW=P.±hwz;8::$hП(6q' ݗ}y?e}`@0 jT5?OSn>> ܨx ӿ:.\F8BaIM1>KY@rlA%xE3@Aw퉎pDK"vu;:R|M"$#&]/ t a) B[dӘww]Y zRq+90t/DcTaWb֨ڦbN{t^yV5@BbcYDf@vlHcɘ#%/gtXD>OA#&.(npT 3?F0H-2S*&xJ#2wI2nϴٽFel-/-[ԆP Lԍ|e([?aUW?-r?(iڔtS{f`O?3'vaǞY2/,+N-qzwpH9#%Uݪ;,CaOsyA`Xa2w"G΂X4/y5]W!r,6*u԰U(qGV%VVzT?cZ5;>=~#%#%:`Fx@-˿%z|cA<w.p49 jU#$-Lz\:x`jdfwea{(4ajE>?.F_p]c~/]֏9m+9]sdsJIfxK{VtPfb̓{ ɳ#$o˶qg3;Cߞ!i!p !X:L :81B*2L:SLxJvQ 2Z7B\˹;ӻ7۶n*m<h[vM"}DDQ#$h F0k/0ͳ!QAn!лt*A@6"@Iѐ˧řoX9GO#& FJ_484@2pA@>d}(?&o?4os1O[#%̯uUU )!сg@tx(vL) 4 Yh5EBWrko3Lz#EZ 1"2dv{X#S8 $"j@H08p40oVׂ0Gz5A۵YMqlS>DkB`#&L`:#&!b1Bhj70a A61>#%A!G"H`!lYsƯ{)ƃ]p#UGBwO~chYmP0EKwӒq#2tزO PL 6+MOs;ܒk5W:=8GѦ@ 5;A rz`UP8MV`]d,e-,!7eU>`̴BPjB#& ?oiX6#&c` 5R4P~TKR'4NIBIWw.̝GXhCw~CNy3EpT4rsDWXL;T%If%jp7#%«Bt9׻JW=műՠ@w!`i,xP(I#&; &~q&* Rq9aà U#J8aXzuqYlշe59w_<@h\:ػ0uZգvl.ʋC(g5k{ֵ+fm H0xL0\&BҢ9n#&6^83ɱvBVѿu.ݙhbmFX̌1b_.N{^6ENExavdv1@M!^j7=BUn&@H@ 8pbׇLwl!/'@t<#%#>wrQBTcۊBs}r"l`: /sH_Q ~Ėw.fEV#& Yy(z*ro6}yR;Am1~Ǧ|١ܜć*2F =I$QcaDLJ#&zd9!ok\I2q0N&yGJpyJoPւA;)t=ȡ;C%YCYˀ@?zk[mu)=A&мMy/<͢#&#%1S4εi:me`Q.ܾ'Xt5F%U#&GX y2(,LbB,q 87ؾJj7-"ebL'/qEws}U޽s0PGf `DL,s2̙s33,mrYs12/׎*H)Q՚NQ1#$S< 1*f ExS} tJbXV$*ӬQ1DF 5MA.sfEMddYL>[H!#P1#%J[7u$Z˞H#%IUS,e™L54ۋ{XM)hHz**,gRp#$8R$PJyRuNʘ:$qD"LB ^i2Oo?|iN*r}O6#8>#$ LML@_J<P$$ӍDP)SFlt.a&yJ@m9jA#$"`ucej?GCZy8>ÁhMN*5#&E[MK$9G܋@9Ï"hk<> HB#&2PB  x%4D;4ۄ47OGM Z `ϡ,!fBAG7pAi;q/ŔQp9+0n$lX̳SU#&2Ŕ$&siUAFu5OH R)#&v#%ng3CbPg`0 #؆Ź]c@5Ɛ2dLQ+"Iup-5X9qyPz]%6QLLlquԢcscn9ل;w9, XY&z Cuu m+9 &4,;1ۨ]1eY#$ksK#%JK6^ BO, `a#&a2|7/I(mudf1.WUm#&.UUVuAqf>e2EB!Abg%p5߹=f>0‰Sv`JćʈcǑ> #&>=QCDp*B%@0=g$鰅adyl־eSGƠ #ܯUg""BRe!ORBϏ7DY#$vCr@ B&ʹũAؒIANe ŷM" U{y'jH)UEP+ՃnN@I:<$%$ lvO M "Zt#$6>'Dv@;mC#%;+u#wJ!ԏϧT"4@N"\IMTDS!,ZC#$,Q7#$!Чv'P'H@>`%ΕZVۯ.3bvQ *KB($/.I|Q҃)CGoJ4ӧ`LYzBZɒ!kD)ȃDi;e- Dz"6;BX5>Ӻ~x;ifoMd%[w_` }{b#ꑊr(QUGѻ4SmXU-%-*ߞh#$x"&`DQcFh`JE$ =~' 'YYNEd!q4J>fAĪ'Z5F4#%]JMB?#L*7#$$=7I4k]zkrKԹrfk7;΅Jb>iהN^Z3 <-ԗԵv̑B,O{E[W#$0C_jB+|DUxA><"|s  g`6'L#&$IJ7]''piJSVW#%,udX@hjǨP]Ufq1NtK]p>I\vuʵ*#L'i8좍?beg*dpk1:֩=b!=T(E'w_$4.D D"AC#$T")0EVi6~EZ*nmv͊EP%~UhmowpaCLb$MC#&{p}ģim)N_R۸=lCgE>FJq ǵ5NJ;#%֑ޏª#$2YMĀ`3i8(ShIl&P7hBCَj#&n]SQdz<޻5wM7@U$GI#&8zwL(~U˛@]'(Нӷ~Dy@TNĔ\4Uiߑ#&{C@߈I9j?mC -#&S̀%q@|2wH8w:|Ͼ#$ӜNM#$'a:l6><(50f+pI!5-]m݀v ښZ&Mj@mRl#%#q:֢*z2q:Gd,_`!!F1ft >ñ4LІۤqs*6*f뷑%Vdpw#%#qkn/- f×˻7##%hՂVlf]#$T,DpYa\}j;BoKCr]iUYo'wJ{$O%> bmɛ3V#$JQyc$܌ddl\X-9 ,},0#$*- ER S7rfsAx0WSt4xte#%QsX6 ڐEӔv֋/`Z Xnj2 lkAU*DKRS5 Qj/ &#hH; IRU4F2]WxTrrg|@!!.~n=gm2" 0ǬXY»W#$`I!##%i$ʆ[7XGͳ4! {/#%Zn\S(˞Ɗ&ÕjYS#RP5ӌ %R#:Yݚ,S5Z#$t^RD/ݼ_QZ{uFΑVA-3:`f0R#%/6Ͳ^URRljnMv9#$}LN5 ">Z$RJb],CCW#ESIˇq+ڼ6"a2\#%NI`"$ _#%88qԚbov?.>OϦMD%d}척YU]F7V%,R_!^|W67 #$?d#%taI1CmxVtQ8rcxc&o *5)XʔAd(D)I +T#$ #%RX$Ql84҅#&0#&c&o"L}#%)HWty9zV\I"S BjS#%;ND#&&˟~L!: l8!(]mcG/e5䪨|6l [iv#%hR(3ICau#&"pS#&}ҺR0;X+˃}BP5C;3脄PBrgQ(gPg2Xd GfCvl@ן?r,=E|6* r'mz:ТTB g $""CPaѶP /0Sx(M℣{MʏLܩOmT(o#&jht2燏8ENc`#&A6*'t\E`fA~#l(&$3AH#$l L*&rM}S]R$~F@!+ݷ9>gD`0op uܤ:qHu0Q-La ޘy7*tRtOAFEv\MD$67`i)TYf [ J{Sv#&?ogON{Ď2]"W:+ #$Jd4m'`<#%=#$ Z2Q z0wG}P[.n#&)IijWȋ#&?-f&"Xȵ$5V~<᳾ /kly)Y׳jYFz#a:̍QV kԳQcQQSb3SIٛMyU @y+iīE]y4@ԃkIم4-#&#&s74҇Asp#$`ĩPF=&)9:~-WO*TJbڇ޸s{deloĔqsSC2ޘ#%F颈.m\1bсJ(+"0W&CI S~N #&#%t 2tj,b KCl IT#%#leDLUd@uA(M(40Z, ˳#$Ln:пWNfiv}!/'HF`S:ZܘT}y`k6I?1XSC?EO!_.>X1} v(#%2Ș:tДaһM(7iJT$X,J `M]7E7׾(q:)1&wuẓsZ(;u͍c̊gQحA䩦.&q#&F%34[R2XKk'6oVjh IH1R>`NC 8#$Mpo,wP'X7NF؝4֊lʸx>g`>8b,0bXNN@0EVǽAq4@Ĵ%ɉβIąeH(E,i@|o[2Bm$FH#%cdH!8(C7Ȋ ˯2:?F4G#%Ҩ:thjg;ɏh fBΌ`M;GT|2MLYz*#\#%S3/NoqجC綆|FnJ+hӯ䂰,=g`0&ޒx#$9N NE0#%%}Q/A&eC 8SK߇a4#%],`D̟Ę} ,⮪*˓E#,&e޿$F߶Y#&)Y&Me5i`ӯjuUXf#%@Ze3Ƽ5BgEVkPb:#%0 _SO*ogH{L7ᱽV)""]Q"D3w4($|UW|8z3yMj973="#pxF,7sw5 ;ٳi5 լ-{O#V"4~.rmغy'QIjʘ_;.z1^Jb* .,ܴÍ\pq b餅4P==7|trbC&P(-~o]Ďkzav4gZ!#t}8H@3~ tC&׬trARWQ\/4LlX .[7BI|1LI>G܁9j(~|Ū|rO>{@wyxz*j:߆ծh#%GGt 8A{ p>/c k.IĀĨ=}L[ S:P" RYUxX+4?;k#$3tlΚޑ KH7+nsЍ3|gMm!Bmszpl"ye4m9 +֍yru(/Q +bIq)Z'\=w!$_UݧH4ȇ#0f,,lmŗk~&dĺ˱1TTԩ,c6NwQ Ɉ#%0a0:Op81̷X9PRny1֊ _K#ESu:Kmt- YЄX]tF9#HN&߃ekMP I|<#&vwd56Nn0FfN]^oБ=\;-sqec%[-#&.80셮Uno,p<\rQDV%Ѧ8Rg%\ѣx#%$œ^j띎qk7N$<$8KK|GL l$֘u#[BEW.sVg7YbE `ĸN9bťPWtɝ9eM5;/.Ɂ%F7hR&r`"po0"rVf0_d7uW31ܶi=6Wa-hBWQ6bޮ{hTV65ô L8R)C_2gaNwpoa-e()K"={aF|bCUPg1ll8Q#w(V U]uCbͦMQqČV5,`QQ:Պ@IRO#&ɸ%1Zb2aqXk#NIxu{(35gb\CۜcmtS6I7ѲLN nNB#& #&;qMx͠BHEN7%=;ؐmJ#%5*Tx Ka4qAb6ΐ6_,N #%Ìߊ#%cK/H: Dԣ[}fr=HxI20TBi[~%٬XF n#&2JMJ7#%#&%0d2o&bqIz53nm4J(2# U@!h+=oD0Pڨ slћ%0f3EٓD#%sxVE0`G Veu7&c7 = zRr<#$6&h61#zz#m ,N$%e2L^<0%!(u+p>^KT1\Tumlwyd,! P@7HdIaP6m4z騹8"#$LL,$q4`U&MZsnVepr d}fdadQ#%1u:*Klnø#L#$sJ~ PqQl8I O핾jUn:Q2ED#$F"Q,@)^\C}^hx txkw=DuT[Tc4<װHѦhۄ|~`hy*RKlU#&+=i qlT"F2i+nQy#%=0Sh‡P'r*O#%PyÕEzP1Ӥ(/LsE{ ("?6kBQg̛?MA" /u%ʫ;tҵ2 k, $IbS#$N1!Fpc A Ezlm.؈,z#!U53Gg ujA;A(D!:#%b"T7:~UDKS7GiRm)QmjEE-351Z75T*@ Wח]" )>\洚a"<3ZxpQ TCuAt,#&K8Ԧ96 v,0 omnZ<ݥ"uLU P!0 Z CRNB()&8RPh=`dF,"F(l$? gk(]a\o|ռ&=[ݝ8:;r3ǃwIQpt9|anEdam}VGPx6aR:( X#&),ㅍ,"k(/#3},OG/DA}];-MC>'D:w#&@w*_HaLe8!XZ !4bй! 0}36I$夢#%tLa!gP; R`!q#&"[n QJQT!))ΎW\xТ"k%ٹ]YLJJQeT(qQR\(ԵȾhvZͫ{t{g{z*Q8:6*ˇm&;_{Q{`TЂPMNBϨ19f2%D6Xri>_j~!eAV#$-x/NecZH(ZꠒQW+i#%Xb5[bim%^9)RhiMc0b1$ڮVTŕSME-jX(JsF.-5{uv(Le%LKec[TbW-nvHfT5%*FjvFjIjǞuᦓ,͛Xk-έlDZ'n}i#%osJK$JLBwN!q#&J}0[Et 0̤QD@4BHMkӦVm*%im3EH #$#% !I%6"+fke-oemmWfsove-]-%(ԛ"%D"#$Ma9H#&oR P E @Ƙ&IjiQ6ʙm&iM-PbUMMJRFS2)ld[flYeE6$*lQFLSM2I*ILcI4T6U(6RJI2I3&Y*ȔjjSVmK2bƔRRʶ*{Z@a*qFȄE#&,"*#&bXUyV[)7Ur#&EQ!({CFٹ=SKvR/|Þo ϊ4Zʱ7Q-:]Aũ9og#$tj<a!I.1Y@>ќ=͝KA~#%͝v6PLǜ;MrteK> ߠj0`gXs)$%R*Ub!#&:Ӌ&b1UA40S#$##_]^n1#$n:#&» zLQDA4PKzq^ahSAkMn,)t bPTaJLG@I)ES#š&H*B(^TKn}Gm1׺ >OQBXHlp+eT<Ӕ㜵U()15XZt8[5̝s>sQ$Sty_CΎ`}m]&PpBd#XNZ ܮ$BO'E`.w|$QnO^],Eo^#+x]˗W]^r!#&#%52CIҲlU7qRډQJUg!Per#%n#OT5 $B3;2A#&Y !lTf]ZeH-C(- +xx4PD`PSw8cҠU#%E,{?O&PΨ7heo&D͵e`,9Db~q] /%.d5 8-v1[ɊQie2sn:ڳZ.IeN>5;ؚaBhCܦhs!-,h;8J9q)4oqx-V4JH B3o~x o B>?䪜w=L-`16V *Mjb, j?,{s~ɕ!3UQ'f,$2ҷʥݟ?ŋ;Bd| r(ԔvȠR?S,jޥc4"#j &ު**0f/bd[}=2rh ƇT5#%X (%>(9>H[&{"CôbK+1|",#&irhHa[ch Fj:kQhph:(#$ЂyTC7#;t: Dtq1q-c9\adki(tMvM/<|Ub)W4K7{n$=':(`V3D{Yiʖ#&:پ; ~ٮzNA@:8!q(l,S#&DNDȣ Hc7>_ˏ#A*XeWY#&AD@+ݎ_NU"#$~6ˣ;.4J"Zk-auHfR` U~m XZM#&:DYrh0&/%FfܪFͲ–yt\nS<Җ5_b(V74 9 *@F"#$x~zXCD/{J#%gY O]F7: gM,'ޅDb] pg9@ҡI7):](l(9C We4qB?*#2c ;J5*p=f#%ޯu!|jV&LFhNN_"{G@K1u}33ivIЃ+:; +cy0"  mBtqNTQܪH?xRE.>:6c*P^D'_8 #%(lq-LVtV}_ncB9;a둄MH ?XD~5o$V@P&>y5ݱb׷V 83y!z.ܓ62QY_r#%Oy`ÍdAƂ {lC;~oZ;gb#&#%#&{++FOC3? LŚqbg(nҲYb7@uk jpA,}+O#$"0Ȩy RskV5(`lU1#$j#$# EdQ#$%w ܂`l`\*e" %#&QSg5 F4086c-d` fL\3v3i Ly1F0o  #$PHb;a T-"!_ցT#ydAdZƛ->zi"!d0947VM/ WC#la6u`u12ܓj$ , })~nlCm5?ЁgOfRrEP!w dIlR]V20Ȅ}i4AH5ݠ2"2L%JILn!Ɉ;6SR$G\KV(dnS#$)!iBm.BZ,"nQ09`QÊ&:J2b̮nלGEgurm&02hqI/&gz`LR )ed *(d n;2Xj-%Y#$'$;3MMF#%*Zƹb%M޲'rEM{w"#y9#%\I-)׮d.lk p#7 s +Kn3,@ȻaXH$k*;B#%>jVwklP1۷LmD 8PŊ#+EM$)bejz;2*puYOU6^i>ڢUD]*pL8$ȊЈQV"Rc?zRj=gp@)u&& g'Gퟖ#%aw`ȃ0$R##$a_#$RQR#20͢ͷW\&-#%6T[b5W-565]6-#$\TM@Tb GX N!"bs?*:k #%||)'OnO~nVP!TWR $-RTZ g bA5exL'qT3+3zbkNJA@\+V+Ff,ːj[ a X&Z F-3[JFWuF01L* (Cq!%`1)$ZK>+:mN$"D#%. `eJdXC"͵[hKf (F RH&T>32\ &XIB,'Il XP%WU#$XMO4"&" (p2L<`%ygeФ>K#$Cx=\m5Y1 (F((6[#%PϺxcac N$ cZ-;-Nzzm#$s97@VF@۷Иwq%.QbHl@)pjP C2wȒN&tYk].3{f᯿R8EdJ$D9OF"IqԷkETLāT2l"ęP&EJeBO~ӧg*w{w.F&#$=hu[ѿrv_z-%0t4&=Ip߮ȣ[5?odOz |nzy'ӰwҠW[ $6ƍHȔ-La#IZ-IkFQA3_ț5NڹLͲ*dS4C-̄՛m5HʚjɭTj6Նm"lb%A>kk59yQd#&6HDȎD=A^WF-[vrhVյn݅F#%_Rp]@1#%A$YF_4,l!0]_0S9uZ41PJB {`yOhI'ϡ(M\qa_b#$YPybDFAj#PCmܐ'J!uiuWj+#&Zp@JBzc?ӱ+BXJ:&_Hw H%GY&#%Mts&OA#L~r"x Gٯ1-(uUM7`:UW#$u=b#$LrBA*سPPi Pdf4*l!!%]:jrj(2,l?>C~ $kۻGLʉ꺿gtSy̶b{p;KmdI1:I0$&RA}޿uƉuh#% Cb#%#FfpPi :p[K!R4.^O#&w) S1Cqb]:kHHmynB5K7B(Ic=lTkQ!.tܼ`!Lav: fY{*ǟx}:c @zv"HYB+L!A„!,0#$)l-B/}6x*y#%R>KQC5#%||CmR@_h5"%ub~Pӷ \4_k'X}8Eրݐpy4&a&X#&c#$DJD` e56}#<,W}oTPnnnؖE^te6#,JnhDR] #$G%u.ᒀy3FLEn2l#zZm5Ε7Pkcci8EŠ$v] !D+ӌQa2N`?>`8?QÁx0wJ3#$z vgfJRdンS LقOA -Ow jx%?-k$ ~|hI" HHXpMdaT: <${*ǩ<ьQߞK׍7RHJ˿[zgg2Ƈxh5ˆ3GF8/TBLRħJ1 K˂emJbʻDy#&D&[%&.w ; q#&"6`R$(#&[ki C@SEoKAz<gf`[ŕ_訠D!5ki`)=#&AND;PCR)<8'!e -/0F͂WK;Z3m@-ɭlB#%OPH"x-j#%"j̽:m.)K$R! #k@lP Yr˂Qa@6w#&p Ǖo`؏MU*!J`Y#$t,Hp3 JZȳ5(`0X\*Ѭ+3"ˑ$6O#&:Jo%k˝K|QF1=1Z#%+bO2 #&AZ#&@މdbGt[*x Zg9M6ҝ=!ՐݍbDFl`E BՠF#%2l#,9!rRbF&TDtH!t B Lh#&}issz^S؉>]da_seZӗB#%'jm[*eSaڀ>{"bBU%W[WVfkJZ43VRʯQb%~sc\Ʈ6t#$~K~cll`Gku2z(*,=WmZ7U3+ :t:#$rL<ߨ>@t!`hsv5/eox_~ ,sGXΔD@`UVbht≂`d>oB(7p#$&xHP8F4;jpS4zέNCsAۣ.nQj2B:9vN=ۗV_ƱҀhYҙ<ԕqc]p|OAW^z9]ގ<i y4 32;dOBP8>J>$#& <}{#%= #$ rUMFՀIHc4 5dQZPVoӯLR{R!܌n4XL 'J2=a.79ǂ2A#&+=?#%#%D/͠#kn}gP727Q!]bc!HVw$#$RsYHë́\Q%Aa1 zZHm9ug- ;5;~QFRYF1 S.rD(@hV;@iƀ#$> @Ȁ% 3P!Dj11Ff#%K]"[1}#&+?#&SoWw^tq]>Lly%i*mZ%I#9HRe:dáFP6 )J/QGra|`@oNDWP^sg""GPNe#$DBjLݥ(TEAk֚UmS6Mճ64nK4Q5 d@G僸dgW!~-#%?upf#b,GUE5Q`@}HFH~Lԇ% 3LBkt&#͹IWKQWEim4dI,{jΌHƟ!Ekna#$(G&[J ;9Օ`=t|B?t(|{+ft칳I]}2dAc;C|>f&L$.k>T²]#$&6PLIf#>o"STǣ3#%u 1i?L1:G(>7~LؖM0kἸh[H2*bM#|d|xwm8Q`Hԩ:4cST: [W(7g0i|B S@!0>"(F2?Pك.3 1sF3,%3Uf#$r#&y@2T0߱g7#8~'NXߩ#&r)@F&#&Ocp}'CF)CjJZn(iG#$7iY)(]8?cxTȂcn*YhHvRIJR!3G'&!M% %"_{6LmrZUI#Vh6zh㯳Z;K%{*a!3+q39e =+ݠIٝ܆QZl˝(k_חcaU@rh9bߑ.찮@ں5T7]3WtJ|ҘhNu)`#&Ke#cL@٬ UQZ#%-<4=(LdhJ8ME#$0b+fL)2EWo[\L. bMj00E#hԳ,YjRA0i6ecZDZ(@R|訤DhٟܼL@)s_ٝW%PH$7K^$lfms^uݳS)dݗGoz 1H,me&j XQ/Ҕszymm6S3e-QI2Y,VL6MM:^ys*M7].WvwW%D)0/491$AHA[2)+Cc0mmc8uP+a VpIƒLCqI+ 4M&ܢf*he(L`AsWyl!^K&p#AHq|h#S}#l68͵&Ԇ#%R^\إ0DCCT-8͘΂MԻ]J8d2i Jhcnk8(3H%;8` +% ]JZ" 4ػe (^hX`1p+M"]X14-t m!WS4L13}pb\dm2llBJ n;OMi{{qZj0Gde"^L,e#iQ6lLZ9|z:{w/Q,*[1f?U<}MC~$1Z3AwMLh̚kZ*R'm%j<]Ry6 OBu34R%߬bVfS+JZ;4-K7v=N}Gcmt8կ[-uu#& )Ӓ@uqr{~#3q4tbZEk%ɁfGM! $q*c#$-p #&TZN.o)Y^{>o3y8>D$㧀4PK3 ,#&?G?a5<2K5vì~0>e\08|q,Lr,ygA#%@0LU,(miNv{pNXbz_:i8`}ڰۍja54p/=}̏N|(A`'}h"ZaDlZL#ch#$GpX$sLpq,9]N-2WMemV卬֊IշJ9׊]\4cR53 *k6wm&lڮZۦxv/<ZB>C#DV;FT3>^ھ-Tꬸ%PT(A"'BGHA荬7%hHE{my3DjA, !F, |{2aH5-j-kHmn *S,Ѷ-1Y EcTkT͢#%Ffj)DTh֙3mf#$w)VA:Y }C>V׫4%63>3y7{lW`;coᦺO~3D #D$ FZso6h_k~V%[%y۲DYt+mTVC%eݥ$@ b)@E]7n_~]~mTҔ u`DB#$P6dN<4B*R#& Cװ^.ҝ8 1CS|;G[ FCz _,u5m͓ϊIИ!X~P< 5*U03*dn21W`=0#% ի1Rl&0c'{q\[wOV2ͻGۂ2[r{qr1l7 X%݈o'#&Մ9򮤸MGlmMϵlQSuhwX/N9Z;١*m}?G}AG'_:2wÁXR#&`(%Sr`^5r61i0S/r#&{kQNC#%#$,"ȁ" =T,EMR#%XBX2@oukUrT0cc (5>H9[.bAH} #&@(5!d\@#$yumB*ȅ͓2mH+#& b;a j^kw_:SJLbmmcj *"%!vQL.1A `].{Ui$4iG3VF"#V f#%1Ȓ0#&"EAWE&đȅa"@D#%P/l?#$:QX1A=c@)M|Ko#$LHN:|c)ѳY=L۸bxYj%p!2e*- 躖3YIH@и"  WF~'`U{Lrz|<4yl]Fe!<ܟ #%jTTEթImu1H҉GϓxKVVry+~4}5.(P mدWg/$!1{C~&ffݪa/OYjzM# dBhT<ơB}b)[Q'yBH#$%*7#&"l?MǺT7#$y"8*5[SUMA'0/\P&eR[*QMITk[yBq CT00)T)m_㐄$#$\sW~)eupǒ )6,q  Y2c[1cj5upqނ?F1T@13Opi :T B!#%m#&GfiBCq8uy3 |})ZUC%˦#:,8QI##&5+F#"l.ՕA!Td&0xB0QZSf̐j #$ 1`6JzU;X9#&kfIeBMm.܌x]2!(ѧ,2Y @PG()L*ș0E"(@!)AmɦBⓏ)0cFɱ-ԼzZFWE} B,V!1J PPj#$LAPc`jg]Sgr쪟$ u'\H "1*mZimF^R>myN$Vfui?-v/9MS6 @&8E&㝁(tHǝ58W#&_'^rEWE3Fa#$#&b#&J Puv֠zBL{blM1^㇑;)Sx,AHYHJ/j7mo/> ޘOGIāWAF668~šj@,$ o~} 6hCZRe]:#$R[#&Ah"# ?J::?SEB*Qfb3/|!{a x`(C#%C2B,L >B֚6"\QD(@̥=PgO;<=)oluE4 b8+|*LZABuNVXCJ=HŒwǥưa*`.РF"5+K&,ߠF[( udaL8.U#$R0 jb.*][k E#D &5F5tLm-0fHa$c܆Kï9y1pY2f#X (zjzDbu9|J\3}as27;)jdj]~IϜ ^xY,zRݲ`rcɁ!^~ Ի0޽C7BS"H)&F'ŶȄʑL{#%=6'0D;(>(S:km߯NxuABfk"A `Da#$$!)d,J)1TCv="iߍ!OmiHZŕi#R>yὛF>n{crD+OAw+&sşVOu:6b%{ap.n#%#%iDC`b0X| ~lw8l,m]#&K#&#&A3#%hP:10ld1kKS8&b#A J@/?)Gm8u%u!}B#$ MTءd@$P '?#%kGD;vD[fBBD_i>R̈j*YTK!}\ 8(ߔ2T6t#i(ߓDdjh{ULDR,n1'"L$ wiQA!0'VQ64!e>9@Iˢsf ZH":umʈVJ~HV-mԬjjedD#;yp9=c&gM~}dvJ)UQ"s\o##ňB2Aa )`2h,ْHS3RPRN CP쐓aLy9\"ml#%NkEAo*E& 7a.r}7De].;OT9ʓy`Ғ> ?LS$wF,oAPspFPs6@QFG(8 s1,k,mGFLсs>"XvaMu>>0k-6ӴOfOf%T?&SC(?2vC?&I١ Eʢ#!QY[i5ުWވi#%"IH34PWDZn-977Ivݒw(H°80Pץ^-QQk6  @ʢ (u_-jfʼZ1(8r#& @9fraӔ(e<+%G$.JWkM [5Ì-po$#W_}k%294yԗ/R 4dVX↊F(&J)FͦhBm A! w<]v(ԆE.wnH!LJVe)v]4!ByjYԁPpȑ5CxǁfixI5:w&izJk YB&ªӥ2&L #$7  HOvX7XL&,q,޲ҍj8cqD)1H:zyU6Kbz]ÏuJJL#$LK>c@ڏs BZZʕdq̕#&q̉`Lcw2:mzoښ0bV". 8h1Fn5 &VuT$hwT7acu$r2 4;Z dd`vQkmc`9GF`yXAp1ʌq4#$bt[Gl2$L6CM&ֆ&G#%`|0:C +Aq0|M:@#Ԇ*\L`7.echscoMW+3lSwuWw+,]=Ƴ}|2~z`ot7֢g/ lĦV@)bP,#&W}Hmj'`UdGh͑c55.0Tw1 e#&LFXktF`mN-0ekM}1aB7DH͎aF6METCNG.W؃ᾉ*q0=7bK4(,HyCLL1H2Q[#$PUL`JV4lLPaTF 62J&$u'{M!X#lALa2D[(e HcBؖ2[_+#&Mj§5^U =3sd@y4Oc(j#&cFo> AXE@Y1rr" ,!PJ+jRt,C#%" +JOOwN}e#%oɬQPv SлCE?%8滝lF۫k{n:*, 樸DrHޗJM4n\s~s$#$Mn 6nCL8 fܐ Y" L[~x^Y;:H8c| ͖56dh?Z$H{[Qv1I>8u߂$Wn!^SࡆXC0i5GЛIZr9,A@#&{:է[fM 7.ѵ{ 1>#%ղa9̬&Z2!wYbNUU]λlv2fB?I 0rA`]zx)jl=-)Ӣ[0/90}({ !PDrB3NYCC@aagyLB@IFJh6M_m_7 Z"40M"0#$R#Jl{7}NbɨEJgJ X)uHVŢP)ɖK`sC(m#%sk^9W5Er׊Qt!-[ƶ(mO% #%Ҡ̦B#&0Psp-wA@k؛{j8v2 1@ ".HqR#$PlЄ 5)ǾSл:^R;ORe7/~؅%Y)@Bt}/䵻4[uvh%`+ T47QѭIM6hZU%$@N܉m#&\3#$"@X@dPFNڂ 'A8/oem~rda.!ZK>(#% H 5֢qJ܆W:ߴA;){#$Հ{}(}B#&ʒ̦FQT)FM&14*e2$͍Z-ص[SiT[-Ej `,z\ZTArcIs0& cPyVXFE*#RXR;H X4AGXꌈȊhl2рD ncV*S5Yh(#%@"#%o#$#*ħVrS날D#&#$h[xфϫG^"wv7-*4B nȏ-3ڣA7gLP:'4uM2T +9HLZ0 Hus!1ʓ!5Sa,\')sbqN==Ebvqw]tWBc5pU#%AdAdV@$UREQR-rY:?lMl~౧4ZŐfH5ClqBL6P+xeF]F/WLs{d\T8 p9a9˧QӃ<,7MI'8׊:%'ۃuj!""!׏YڗD:$"?OW胞tͻpQ1ΦIW:P$DLC ŞIHF/S~Amaw]>^(.+Ԍ#%{\h7$rYtͲ`~ ܃#&2^]!>#&g3`g ]4*R/(4γt8+ŢGJ*Wq%[5W^"0ZWG.e`qb=vg&|tj7ço+2QS8{xDlu* aS; 2#~']D;ٺ#&:DTVJ튅9۶esNJbzDZ]h.9l7~5 vz\#:fpL$#$ѱ#%RPrVN~^=q]uqy%` S?]n;gY& GtuIs86pW`JZO:퐎y{9Ѻo\/+cAǿz"UB]P2-ɿLQ帡:x8֯d[єu;Cj3rvZ~ 1 ٥~)oA[} {]}{zytW;4Miy%IIȣ%1dsi҉Ḣ#$^Dq毈 _օEYdmGGe[\[/9ĮOܮ8ʃ -DC g6LV[͋˧b2!G_'m[N)-FSp(0Ę=8(3]r x8뎇1 c5sϟ\vrmT1E>vE$-c6!F#$I:wRW{W9ZSPE@0i("0:f5H4}:ZSm{FeW;Mvؒ#%k#%HO~;-C%-{\IE 1r#$ͮ &1W-FK[@Ʊ;ⓉcG!\ #p^#%:̢64 ,v(4h6͙:Zě77686mjZTLܵwZؑBcQ|14&4E&=l[n#%s,q CR0D,j aƪU +22YD7 u*MKD #%mZ"Nڕo#%3}@iN ~MF{;Гu#Z5d#$E&bZQQPFAV1.KG .F20xÁg3#&j`n[ݷtV%i3/#%<Ky>gp|.uXTE:0emrF1Q˗3i{oc :kNcoy``$P&$n8Y̵FZ1Z7cmO-elպWdtnTa#jP˲ԣUTڠPfA? em-JC5#&Hbr+\cz[J"`drӑ~5:G3b0[_8K~Vww :2:#%KLhɐDY,7N2zx֑|#&vի}@Ӭlw30}If^Ԧ6#&5,11-;EPq>PI dF ){.Ę6@{-z2DAlp0F'HTRC_w^{jP硪ܔ#&@&90͙Cv[oC( YQhM&JL*Y%V)--$Y&,TiJFfKS"* 1*&2RdWc#4В6@qWePz|^: }4>ξG朕CM|?s; te9q=)3Ahyb$j'Ȃ^S26A#16܇(jHkL̉vGL6# Vİq+ܧN1 l$z̶KB;k=W| NnchSB#%JS&oW,—DA;Gk}R[I}[7wkqIb5F-dE`J`)jYq`22 DaH>~rj5J\иj@[RmƇ?4V2:2tZ&"Fͷ11i(5Fc#$6<HmUⷽXoټ{T#&βQ 0VȘ\ 7աL[Dc*˞4%(D(HddVY'y?a?'(NL?FCP/jH$Ʃ@JXBgk11o|2Fۃ+֒!GL!BQ$, t%GeTơd>@};&B4"=̓?;$,#%irCNn/4Qp4&l^ mנÆuɳU-im$e({Sxgs%+<$=hO}xmY-(ܓwQk&߇7;B#%!Fǎ[nW43"c<}ks$ aSKx(aIqNm8q#0}0>LÙg1UėV|sM\3B毐bZ8uTژ4MLr6:!% 42 ć vHah8#% B#%[1N鱌3mr!O'^ߕ#&nѦ3ͲR)ɜMu Ɗ iv$b)(B#$XjM+3 q7c4.H$$:2#m`t3G, LnȋL#O`AY|L#A"Yʨ&;[+$#%K@ym?/v.ĺ2kF˳m@F+:Ţ'#Ofچ֬S-68mlRY -K= pE 1u$ 8wj>|7I6Iָn' fl9a#&DK8};[5QvAf-yEK&<{> ƑejkkF^$`5#&0cChF=0!2)Pٸnifc^\rxvɰK/jDnW}L.Y(ñdó7%Qlɬ{C4.ì$<<jGA6;dK S&2XVi~דn` 馊5i#&D1uM4,iW5J|ٳYaע RM8f{40i .H#%۷ev `Ġ#\#$tbTcC L]@ln#$5)Iz+L􍺋^mnL`c ax/"4qC' N$ԆR(apCؤPc$# E0 8tD4P147-TJaX4FdB`CQAg*84m#%ˑNr9$*.ɒabw#%8 @)rq}ז >aQ7*-!"Pj#&/a#$8OA'o"W*^O>t 걀clI(#m ӓɆU'{%?HMHKcslhL IM:zɊn=bQCYoL8ws1*D@:!CD]d}Prx@mizh6G(gI37HMU},5>Tv*#˞ܚQhSiŞ:{~i2wyR%?"LwbTN.}։ړfȊ41F#$)Zv9xV\xdBژ1܆a-I"l^F:ϯm P4iˮ;JMpd Hv#$/ mc1",`,2ブHxKFZW*-sy]wwy%zAiBF[Ap[X[#$-+(?=&})uP[r(/P[5 2#%L/Q*B)#8>>>9iQJATBk߭4񓡿w2bX*R)nf1ȑtB Ceyvb}6,kJv'a" t'N=Lwh:,:COib?lTƇ<6B)Q;ّt4g'cUِ˖rD67rsȞQup#$!3uf<8DH ;Κ }Rf3gJpS|e"FOa !d΅>*7Ưnj'mKk!#%Dn_x#g)d#$8H,ɜGRJsuON7H\ geT,V^9kmp{y|%K^SJzru^5b8Xղfފ*6~<ɻ*'AAd#m% #%9DzrYS㜳=&Q=81SJTͣL%dٌ2٬ƿRktJJ:W@!dBzçuѽ^jЗ"ӘrŬ``i%f`{2ւ Xl#ZOV"> v5ggIˣJ}ߡi}?aƊ2 DS|pF3b!H闑O4: ,Վ#&Ex-,KMT2φi,G%l&Š}C;PL-a5:9ZKdidgil{q $pIdX!n-h/lTxeT$TY*i٤S_AHcBJYQ"@C??>BCpk"TD񄥯/aā bاLd#%Msf&MD+f6̍zIHWЍb͎;w\!R%#%Y`A݁GSm{RzWndQ;4qa^0gՙq#&Plr~9q;}FeɶkA"t#\|L#&j"w'#&` #$#&PFd8M%\7VѲ)#.0R@P 0qߨP" Bv* <* h5@轢*x=P@D>]T+a\A1"#${iؘ%7. \x#%#%0au_0u>%C*dM$XV)Pj*M>ojmبj~̮Bh~*뻵k -Gn#&&hMnN!b A9^<%ǖaXIPI#$ZP(KiFPV#$HOkۙJR@ӏT>Q\#B03 R5oTv]"|O+JV2#$iBxzdd#&0ObhbA@@ЗpD*E F1 >z4+ v"-#`.Q!=F~2Mé'5F/4m͉ AZX|I SQEB1 % |SbUuMxw.My֙bݖݙ]ζhʥ#o]5FRQvךWz֫]v\2i̵nթ)AB'hgZO$'ݓwpVE3S4XpxbRsI@0aۖ@"nNƼ&SeL|ZY.ݷg#&4?ZCWxj۱o/_VVף.C=2~3hK;X5A67Ҍ=hssbmru~ d"{o{#}?I]&nM6.nv2Ng>I9XH.:8.ȃDrLAsP*X S{_tTP>PD_>ET@(v P˄ ^QpaT"D5-<;=W>#%a!fc@i#$w?/ew>?qG٫//_?_???G3]_/~#%: ?6=]H@ޜ#&pMá(-YwQjRG@^RHB@N% CZ~ņR$ 2k~KگQst {ZD5ǡ cMjf zmpCSn)` }ƺ|JagM7vWCLpd#&)!W=R*9&: hd+C(vA>Wt?2H'VjOֻz#% ?S{a2wxGGON$PG3S(B}ͦ~54EcńgչO f%P0{rA|<)w4I'V]c#%4TH~O4͐>,7>n:bR44#%MEݗ"6 &YvTCVID%2anjm,ť5{5WIQlk`YXhmF ZN5VC9}6&"R#C @D(z <^AdEoqH cU!^!q>G^UbRT'Dzbt,!9'H{xl+_PaAQ!?CpHD$8<N'܉ (BR@RE@["#bf @dPAO/U e29ԧ<4.6-`4Q1`AYI3?n+f#&oۇ:?$'oXdP-}M|67zE _4Vhl!őgl.ve5nH;W'PiGQ^+LL眴50pCN@&2S?(M(6N*%1@Mfh˞뙁̢țF43B.\Hօ>C#&4#%3wBu{&'#%L fW*>sC?>D"(HiK +#<== diff --git a/source/modules/lilv/lilv-0.21.3/wscript b/source/modules/lilv/lilv-0.22.1/wscript similarity index 86% rename from source/modules/lilv/lilv-0.21.3/wscript rename to source/modules/lilv/lilv-0.22.1/wscript index e49b22048..0594e2e1a 100644 --- a/source/modules/lilv/lilv-0.21.3/wscript +++ b/source/modules/lilv/lilv-0.22.1/wscript @@ -12,7 +12,7 @@ import waflib.Logs as Logs # major increment <=> incompatible changes # minor increment <=> compatible changes (additions) # micro increment <=> no interface changes -LILV_VERSION = '0.21.3' +LILV_VERSION = '0.22.1' LILV_MAJOR_VERSION = '0' # Mandatory waf variables @@ -21,6 +21,13 @@ VERSION = LILV_VERSION # Package version for waf dist top = '.' # Source directory out = 'build' # Build directory +test_plugins = ['missing_descriptor', + 'missing_plugin', + 'missing_name', + 'missing_port_name', + 'lib_descriptor', + 'failed_lib_descriptor'] + def options(opt): opt.load('compiler_c') opt.load('compiler_cxx') @@ -34,6 +41,8 @@ def options(opt): help='Build support for dynamic manifests') opt.add_option('--test', action='store_true', dest='build_tests', help='Build unit tests') + opt.add_option('--no-coverage', action='store_true', dest='no_coverage', + help='Do not use gcov for code coverage') opt.add_option('--no-bash-completion', action='store_true', dest='no_bash_completion', help='Do not install bash completion script in CONFIGDIR') @@ -88,11 +97,8 @@ def configure(conf): if conf.env.DEST_OS == 'darwin': defines += ['_DARWIN_C_SOURCE'] - # Check for gcov library (for test coverage) - if conf.env.BUILD_TESTS: - conf.check_cc(lib='gcov', - define_name='HAVE_GCOV', - mandatory=False) + if conf.env.BUILD_TESTS and not Options.options.no_coverage: + conf.check_cc(lib='gcov', define_name='HAVE_GCOV', mandatory=False) conf.check_cc(function_name='flock', header_name='sys/file.h', @@ -182,7 +188,6 @@ def build_util(bld, name, defines): obj.lib = ['m'] obj.env.SHLIB_MARKER = obj.env.STLIB_MARKER obj.linkflags = ['-static', '-Wl,--start-group'] - obj.lib = ['dl', 'm'] return obj def build(bld): @@ -268,23 +273,39 @@ def build(bld): penv.cshlib_PATTERN = shlib_pattern shlib_ext = shlib_pattern[shlib_pattern.rfind('.'):] - obj = bld(features = 'c cshlib', - env = penv, - source = 'test/test_plugin.c', - name = 'test_plugin', - target = 'test/test_plugin.lv2/test_plugin', - install_path = None, - defines = defines, - cflags = test_cflags, - lib = test_libs, - uselib = 'LV2') + for p in ['test'] + test_plugins: + obj = bld(features = 'c cshlib', + env = penv, + source = 'test/%s.lv2/%s.c' % (p, p), + name = p, + target = 'test/%s.lv2/%s' % (p, p), + install_path = None, + defines = defines, + cflags = test_cflags, + lib = test_libs, + uselib = 'LV2') + + for p in test_plugins: + obj = bld(features = 'c cprogram', + source = 'test/%s.lv2/test_%s.c' % (p, p), + target = 'test/test_%s' % p, + includes = ['.', './src'], + use = 'liblilv_profiled', + install_path = None, + defines = defines, + cflags = test_cflags, + lib = test_libs, + uselib = 'LV2') + autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2') # Test plugin data files - for i in [ 'manifest.ttl.in', 'test_plugin.ttl.in' ]: - bld(features = 'subst', - source = 'test/' + i, - target = 'test/test_plugin.lv2/' + i.replace('.in', ''), - install_path = None, + for p in ['test'] + test_plugins: + for i in [ 'manifest.ttl.in', p + '.ttl.in' ]: + bundle = 'test/%s.lv2/' % p + bld(features = 'subst', + source = bundle + i, + target = bundle + i.replace('.in', ''), + install_path = None, SHLIB_EXT = shlib_ext) # Static profiled library (for unit test code coverage) @@ -301,7 +322,7 @@ def build(bld): # Unit test program blddir = autowaf.build_dir(APPNAME, 'test') - bpath = os.path.abspath(os.path.join(blddir, 'test_plugin.lv2')) + bpath = os.path.abspath(os.path.join(blddir, 'test.lv2')) bpath = bpath.replace('\\', '/') obj = bld(features = 'c cprogram', source = 'test/lilv_test.c', @@ -358,7 +379,7 @@ def build(bld): if bld.is_defined('HAVE_CLOCK_GETTIME') and not bld.env.STATIC_PROGS: obj = build_util(bld, 'utils/lv2bench', defines) if not bld.env.MSVC_COMPILER: - obj.lib = ['dl', 'rt'] + obj.lib = ['rt'] # Documentation autowaf.build_dox(bld, 'LILV', LILV_VERSION, top, out) @@ -384,6 +405,7 @@ def build(bld): bld.install_files('${PYTHONDIR}', 'bindings/lilv.py') + bld.add_post_fun(autowaf.run_ldconfig) if bld.env.DOCS: bld.add_post_fun(fix_docs) @@ -410,7 +432,13 @@ def test(ctx): os.environ['LD_LIBRARY_PATH'] = os.getcwd() autowaf.run_tests(ctx, 'Python ' + APPNAME, ['python -m unittest discover bindings/']) os.environ['PATH'] = 'test' + os.pathsep + os.getenv('PATH') - autowaf.run_tests(ctx, APPNAME, ['lilv_test'], dirs=['./src','./test']) + autowaf.run_test(ctx, APPNAME, 'lilv_test', dirs=['./src','./test'], name='lilv_test', header=True) + + for p in test_plugins: + autowaf.run_test(ctx, APPNAME, + 'test_' + p + ' ' + ('test/%s.lv2/' % p), + 0, dirs=['./src','./test','./test/%s.lv2' % p], name=p, header=True) + autowaf.post_test(ctx, APPNAME) try: shutil.rmtree('state')
Example Turtle Tokens
URI<http://example.org/foo >