2007-08-08 21:17:48 +01:00
|
|
|
#! /usr/bin/env python
|
|
|
|
|
# encoding: utf-8
|
2007-09-27 12:40:01 +01:00
|
|
|
# Thomas Nagy, 2005, 2006, 2007 (ita)
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
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.
|
|
|
|
|
"""
|
2007-08-08 21:17:48 +01:00
|
|
|
|
|
|
|
|
import os, sys
|
|
|
|
|
if 'PSYCOWAF' in os.environ:
|
|
|
|
|
try:
|
|
|
|
|
import psyco
|
|
|
|
|
psyco.full()
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
|
2007-09-27 12:40:01 +01:00
|
|
|
VERSION="1.2.0"
|
|
|
|
|
REVISION="1894439586"
|
2007-08-08 21:17:48 +01:00
|
|
|
INSTALL=sys.platform=='win32' and 'c:/temp' or '/usr/local'
|
|
|
|
|
cwd = os.getcwd()
|
|
|
|
|
|
|
|
|
|
def decodeAscii85(s):
|
|
|
|
|
out=[]
|
|
|
|
|
app=out.append
|
|
|
|
|
s=''.join(s.split()).replace('z','!!!!!')
|
|
|
|
|
p1,p2=divmod(len(s), 5)
|
|
|
|
|
stop=5*p1
|
|
|
|
|
p3,p4=s[0:stop],s[stop:]
|
|
|
|
|
for i in range(p1):
|
|
|
|
|
off=i*5
|
|
|
|
|
a=ord(p3[off])-33
|
|
|
|
|
b=ord(p3[off+1])-33
|
|
|
|
|
c=ord(p3[off+2])-33
|
|
|
|
|
d=ord(p3[off+3])-33
|
|
|
|
|
e=ord(p3[off+4])-33
|
|
|
|
|
num=(52200625L*a)+(614125*b)+(7225*c)+(85*d)+e
|
|
|
|
|
x,p=divmod(num,256)
|
|
|
|
|
x,o=divmod(x,256)
|
|
|
|
|
m,n=divmod(x,256)
|
|
|
|
|
app(chr(m)+chr(n)+chr(o)+chr(p))
|
|
|
|
|
if p2:
|
|
|
|
|
while len(p4)<5: p4=p4+'!'
|
|
|
|
|
a=ord(p4[0])-33
|
|
|
|
|
b=ord(p4[1])-33
|
|
|
|
|
c=ord(p4[2])-33
|
|
|
|
|
d=ord(p4[3])-33
|
|
|
|
|
e=ord(p4[4])-33
|
|
|
|
|
num=(52200625L*a)+(614125*b)+(7225*c)+(85*d)+e
|
|
|
|
|
x,p=divmod(num,256)
|
|
|
|
|
x,o=divmod(x,256)
|
|
|
|
|
m,n=divmod(x, 256)
|
|
|
|
|
if p2==2: app(chr(m))
|
|
|
|
|
elif p2==3: app(chr(m)+chr(n))
|
|
|
|
|
elif p2==4: app(chr(m)+chr(n)+chr(o))
|
|
|
|
|
return ''.join(out)
|
|
|
|
|
|
|
|
|
|
# wafdir is needed to parse the command-line arguments or print the version number
|
|
|
|
|
wafdir=None # SPECIAL LINE
|
|
|
|
|
|
|
|
|
|
def uncompress_wafdir(newdir):
|
|
|
|
|
file = open(sys.argv[0], 'rb')
|
|
|
|
|
while 1:
|
|
|
|
|
line = file.readline()
|
|
|
|
|
if not line:
|
|
|
|
|
print "This is a stripped-down waf, there is no wafadmin directory available"
|
|
|
|
|
print "Please set WAFDIR to a directory containing a directory named wafadmin"
|
|
|
|
|
print "Or use the full waf version available freely at http://freehackers.org/~tnagy/bksys.html"
|
|
|
|
|
print "\033[91mNo wafadmin: cannot execute anything (error)\033[0m"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
line=line.rstrip()
|
|
|
|
|
if line=='# ===>BEGIN WOOF<===':
|
|
|
|
|
cnt = file.readline()
|
|
|
|
|
if not cnt:
|
|
|
|
|
print "Corrupted waf (1)"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
line = file.readline().rstrip()
|
|
|
|
|
if line!='# ===>END WOOF<===':
|
|
|
|
|
print "Corrupted waf (2)"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
break
|
|
|
|
|
if not cnt:
|
|
|
|
|
print "Corrupted waf (3)"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
cnt = decodeAscii85(cnt[1:])
|
|
|
|
|
|
|
|
|
|
# create wafadmin
|
|
|
|
|
import shutil
|
|
|
|
|
try: shutil.rmtree(newdir)
|
|
|
|
|
except OSError: pass
|
|
|
|
|
try: os.makedirs(newdir)
|
|
|
|
|
except OSError:
|
|
|
|
|
print "Could uncompress waf-local into %s"%newdir
|
|
|
|
|
print "Please install waf system-wide or move waf in a writeable directory"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
os.chdir(newdir)
|
|
|
|
|
file = open('wafadmin.tar.bz2', 'wb')
|
|
|
|
|
file.write(cnt)
|
|
|
|
|
file.close()
|
|
|
|
|
|
|
|
|
|
# now we have the tar file to open
|
|
|
|
|
import tarfile
|
|
|
|
|
tar = tarfile.open('wafadmin.tar.bz2')
|
|
|
|
|
for tarinfo in tar:
|
|
|
|
|
tar.extract(tarinfo)
|
|
|
|
|
tar.close()
|
|
|
|
|
|
|
|
|
|
# cleanup the tarfile and chdir to the previous directory
|
|
|
|
|
os.chmod('wafadmin', 0755)
|
|
|
|
|
os.chmod('wafadmin'+os.sep+'Tools', 0755)
|
|
|
|
|
os.unlink('wafadmin.tar.bz2')
|
|
|
|
|
os.chdir(cwd)
|
|
|
|
|
|
|
|
|
|
global wafdir
|
|
|
|
|
wafdir = newdir
|
|
|
|
|
|
|
|
|
|
def try_wafdir(dir):
|
|
|
|
|
global wafdir
|
|
|
|
|
if wafdir: return
|
|
|
|
|
try:
|
|
|
|
|
os.stat(os.path.join(dir, 'wafadmin'))
|
|
|
|
|
wafdir = os.path.abspath(dir)
|
|
|
|
|
except OSError:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def find_wafadmin():
|
|
|
|
|
global wafdir
|
|
|
|
|
name = sys.argv[0]
|
|
|
|
|
|
|
|
|
|
# wafadmin may be in $WAFDIR (developers)
|
|
|
|
|
if 'WAFDIR' in os.environ:
|
|
|
|
|
try_wafdir(os.environ['WAFDIR'])
|
|
|
|
|
if wafdir: return
|
|
|
|
|
|
|
|
|
|
# waf-light is a special beast
|
|
|
|
|
if name[-5:] == 'light':
|
|
|
|
|
try_wafdir(os.path.dirname(os.path.abspath(name)))
|
|
|
|
|
if wafdir: return
|
|
|
|
|
print "\033[91mwaf-light in use, wafadmin not found -> export WAFDIR=/folder\033[0m"
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
if not wafdir:
|
|
|
|
|
dir = "/lib/waf-%s-%s/" % (VERSION, REVISION)
|
|
|
|
|
for i in [INSTALL, '/usr', '/usr/local', '/opt']:
|
|
|
|
|
try_wafdir(i+dir)
|
|
|
|
|
if wafdir: return
|
|
|
|
|
|
|
|
|
|
# remove $HOME/.waf-version if asked to
|
|
|
|
|
if wafdir:
|
|
|
|
|
if "--nocache" in sys.argv:
|
|
|
|
|
import shutil
|
|
|
|
|
print "removing the local wafdir", wafdir
|
|
|
|
|
try: shutil.rmtree(wafdir)
|
|
|
|
|
except OSError: pass
|
|
|
|
|
try: os.stat(wafdir)
|
|
|
|
|
except OSError: wafdir=None
|
|
|
|
|
|
|
|
|
|
if wafdir: return
|
|
|
|
|
|
|
|
|
|
# look in the directory containing waf
|
|
|
|
|
if sys.platform == 'win32': s='waf-%s-%s'
|
|
|
|
|
else: s='.waf-%s-%s'
|
|
|
|
|
dir = os.path.join(os.path.dirname(os.path.abspath(name)), s % (VERSION, REVISION))
|
|
|
|
|
try_wafdir(dir)
|
|
|
|
|
if wafdir: return
|
|
|
|
|
|
|
|
|
|
# not found, uncompress
|
|
|
|
|
wafdir = dir
|
|
|
|
|
uncompress_wafdir(dir)
|
|
|
|
|
|
|
|
|
|
# run the test
|
|
|
|
|
find_wafadmin()
|
|
|
|
|
if "-vv" in sys.argv: print "wafdir is ", wafdir
|
|
|
|
|
|
|
|
|
|
# Update sys.path and import our modules
|
|
|
|
|
wafadmindir = os.path.join(wafdir, 'wafadmin')
|
|
|
|
|
tooldir = os.path.join(wafadmindir, 'Tools')
|
|
|
|
|
sys.path = [wafadmindir, tooldir] + sys.path
|
|
|
|
|
|
|
|
|
|
import Options, Params, Utils
|
|
|
|
|
from Params import fatal, warning
|
|
|
|
|
|
|
|
|
|
# Set the directory containing the tools
|
|
|
|
|
Params.g_tooldir = [tooldir]
|
|
|
|
|
Params.g_cwd_launch = cwd
|
|
|
|
|
|
|
|
|
|
if Params.g_version != VERSION:
|
|
|
|
|
fatal('version mismatch waf %s <-> wafadmin %s (wafdir %s)' % (VERSION, Params.g_version, wafdir))
|
|
|
|
|
|
|
|
|
|
# some command-line options can be processed immediately
|
|
|
|
|
if '--version' in sys.argv:
|
|
|
|
|
opt_obj = Options.Handler()
|
|
|
|
|
opt_obj.parse_args()
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
|
# now find the wscript file
|
|
|
|
|
msg1 = 'Waf: *** Nothing to do! Please run waf from a directory containing a file named "wscript"'
|
|
|
|
|
|
|
|
|
|
# Some people want to configure their projects gcc-style:
|
|
|
|
|
# mkdir build && cd build && ../waf configure && ../waf
|
|
|
|
|
# check that this is really what is wanted
|
|
|
|
|
build_dir_override = None
|
|
|
|
|
candidate = None
|
|
|
|
|
|
|
|
|
|
lst = os.listdir(cwd)
|
|
|
|
|
xml = 0
|
|
|
|
|
#check if a wscript or a wscript_xml file is in current directory
|
|
|
|
|
if (not 'wscript' in lst) and (not 'wscript_xml' in lst):
|
|
|
|
|
if 'configure' in sys.argv:
|
|
|
|
|
#set the build directory with the current directory
|
|
|
|
|
build_dir_override = cwd
|
|
|
|
|
if 'wscript_build' in lst:
|
|
|
|
|
#try to find the wscript root
|
|
|
|
|
candidate = cwd
|
|
|
|
|
else:
|
|
|
|
|
#wscript or wscript_xml is in current directory, use this directory as candidate
|
|
|
|
|
candidate = cwd
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
#check the following dirs for wscript or wscript_xml
|
|
|
|
|
search_for_candidate = True
|
|
|
|
|
if not candidate:
|
|
|
|
|
#check first the calldir if there is wscript or wscript_xml
|
|
|
|
|
#for example: /usr/src/configure the calldir would be /usr/src
|
|
|
|
|
calldir = os.path.abspath(os.path.dirname(sys.argv[0]))
|
|
|
|
|
lst_calldir = os.listdir(calldir)
|
|
|
|
|
if 'wscript' in lst_calldir:
|
|
|
|
|
candidate = calldir
|
|
|
|
|
search_for_candidate = False
|
|
|
|
|
if 'wscript_xml' in lst_calldir:
|
|
|
|
|
candidate = calldir
|
|
|
|
|
xml = 1
|
|
|
|
|
search_for_candidate = False
|
|
|
|
|
if "--make-waf" in sys.argv and candidate:
|
|
|
|
|
search_for_candidate = False
|
|
|
|
|
|
|
|
|
|
#check all directories above current dir for wscript or wscript_xml if still not found
|
|
|
|
|
while search_for_candidate:
|
|
|
|
|
if len(cwd) <= 3:
|
|
|
|
|
break # stop at / or c:
|
|
|
|
|
dirlst = os.listdir(cwd)
|
|
|
|
|
if 'wscript' in dirlst:
|
|
|
|
|
candidate = cwd
|
|
|
|
|
xml = 0
|
|
|
|
|
if 'wscript_xml' in dirlst:
|
|
|
|
|
candidate = cwd
|
|
|
|
|
xml = 1
|
|
|
|
|
break
|
|
|
|
|
if 'configure' in sys.argv and candidate:
|
|
|
|
|
break
|
|
|
|
|
if Params.g_lockfile in dirlst:
|
|
|
|
|
break
|
|
|
|
|
cwd = cwd[:cwd.rfind(os.sep)] # climb up
|
|
|
|
|
except:
|
|
|
|
|
fatal(msg1)
|
|
|
|
|
|
|
|
|
|
if not candidate:
|
|
|
|
|
# check if the user only wanted to display the help
|
|
|
|
|
if '-h' in sys.argv or '--help' in sys.argv:
|
|
|
|
|
warning('No wscript file found: the help message may be incomplete')
|
|
|
|
|
opt_obj = Options.Handler()
|
|
|
|
|
opt_obj.parse_args()
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
else:
|
|
|
|
|
fatal(msg1)
|
|
|
|
|
|
|
|
|
|
# We have found wscript, but there is no guarantee that it is valid
|
|
|
|
|
os.chdir(candidate)
|
|
|
|
|
|
|
|
|
|
# xml -> jump to the parser
|
|
|
|
|
if xml:
|
|
|
|
|
from XMLScripting import compile
|
|
|
|
|
compile(candidate+os.sep+'wscript_xml')
|
|
|
|
|
else:
|
|
|
|
|
# define the main module containing the functions init, shutdown, ..
|
|
|
|
|
Utils.set_main_module(os.path.join(candidate, 'wscript'))
|
|
|
|
|
|
|
|
|
|
if build_dir_override:
|
2007-09-27 12:40:01 +01:00
|
|
|
d = getattr(Utils.g_module, 'blddir', None)
|
|
|
|
|
if d:
|
2007-08-08 21:17:48 +01:00
|
|
|
# test if user has set the blddir in wscript.
|
2007-09-27 12:40:01 +01:00
|
|
|
msg = 'Overriding build directory %s with %s' % (d, build_dir_override)
|
2007-08-08 21:17:48 +01:00
|
|
|
Params.niceprint(msg, 'WARNING', 'waf')
|
|
|
|
|
Utils.g_module.blddir = build_dir_override
|
|
|
|
|
|
|
|
|
|
# fetch the custom command-line options recursively and in a procedural way
|
|
|
|
|
opt_obj = Options.Handler()
|
|
|
|
|
opt_obj.sub_options('') # will look in wscript
|
|
|
|
|
opt_obj.parse_args()
|
|
|
|
|
|
|
|
|
|
# use the parser results
|
|
|
|
|
if Params.g_commands['dist']:
|
|
|
|
|
# try to use the user-defined dist function first, fallback to the waf scheme
|
2007-09-27 12:40:01 +01:00
|
|
|
fun = getattr(Utils.g_module, 'dist', None)
|
|
|
|
|
if fun: fun(); sys.exit(0)
|
2007-08-08 21:17:48 +01:00
|
|
|
|
2007-09-27 12:40:01 +01:00
|
|
|
appname = getattr(Utils.g_module, 'APPNAME', 'noname')
|
|
|
|
|
|
|
|
|
|
get_version = getattr(Utils.g_module, 'get_version', None)
|
|
|
|
|
if get_version: version = get_version()
|
|
|
|
|
else: version = getattr(Utils.g_module, 'VERSION', None)
|
|
|
|
|
if not version: version = '1.0'
|
2007-08-08 21:17:48 +01:00
|
|
|
|
|
|
|
|
from Scripting import Dist
|
|
|
|
|
Dist(appname, version)
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
elif Params.g_commands['distclean']:
|
|
|
|
|
# try to use the user-defined distclean first, fallback to the waf scheme
|
2007-09-27 12:40:01 +01:00
|
|
|
fun = getattr(Utils.g_module, 'distclean', None)
|
|
|
|
|
if fun: fun(); sys.exit(0)
|
2007-08-08 21:17:48 +01:00
|
|
|
from Scripting import DistClean
|
|
|
|
|
DistClean()
|
|
|
|
|
sys.exit(0)
|
2007-09-27 12:40:01 +01:00
|
|
|
elif Params.g_commands['distcheck']:
|
|
|
|
|
# try to use the user-defined dist function first, fallback to the waf scheme
|
|
|
|
|
fun = getattr(Utils.g_module, 'dist', None)
|
|
|
|
|
if fun: fun(); sys.exit(0)
|
|
|
|
|
|
|
|
|
|
appname = getattr(Utils.g_module, 'APPNAME', 'noname')
|
2007-08-08 21:17:48 +01:00
|
|
|
|
2007-09-27 12:40:01 +01:00
|
|
|
get_version = getattr(Utils.g_module, 'get_version', None)
|
|
|
|
|
if get_version: version = get_version()
|
|
|
|
|
else: version = getattr(Utils.g_module, 'VERSION', None)
|
|
|
|
|
if not version: version = '1.0'
|
|
|
|
|
|
|
|
|
|
from Scripting import DistCheck
|
|
|
|
|
DistCheck(appname, version)
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
|
fun=getattr(Utils.g_module, 'init', None)
|
|
|
|
|
if fun: fun()
|
2007-08-08 21:17:48 +01:00
|
|
|
|
|
|
|
|
import Scripting
|
|
|
|
|
try: Scripting.Main()
|
|
|
|
|
except KeyboardInterrupt: Params.fatal('build interrupted')
|
|
|
|
|
#import hotshot
|
|
|
|
|
#prof=hotshot.Profile("/tmp/proftest.txt")
|
|
|
|
|
#prof.runcall(Scripting.Main)
|
|
|
|
|
#prof.close()
|
2007-09-27 12:40:01 +01:00
|
|
|
|
2007-08-08 21:17:48 +01:00
|
|
|
# ===>BEGIN WOOF<===
|
2007-09-27 12:40:01 +01:00
|
|
|
#6<\%_0gSqh;d&8a."hY1OoPI]s33l[s8W-!s8W-!s8W*!!Wdft#_7^K&3(:4<!k$^E1ZIME;K>0z!!7\Dz"YX3.>Ua!cn$B0FZeC1s-G%_tZWApt.W&DGM$bVO@&o0CEd+s=G/Nd^pX5e>N=FBRpTWt1^%$LHDcbW`[>)02T7(ps_s`T.kL"l/\9A)`TmI!0l\=fqPOH0]hO`!Ne(ZW@C:2FCX1=2ShWEY_!'RTEm^mX6mY`Nae(33tHcJXL'?JqagU_U8cM&4Zd+*Mffsc=>iBVhEgYWCS!!!&(4mrEhV0Y/o545T;+*i:#aG2sFqdQ2uU:AbZT\Ym1K1[`)@=V/\&O\*6O@0G=Prh&$T"$l4CWt=8g/gPg]/"MoXDH&V^:O2&lRe[>ms=V,[U"71kIoc"IC1-mbJhr^4dEJ!Z`WWX4n#l:Y<HpL`f@9FaAdur/Tn*WY;Z-%g`6L2q`M!=P=Il%O.FpLF:P3cGC.4#VRcfrpQrU6oXXTXT0PBM6e8F7#J-<(efD@^m.US*lXO]LmbZ^3o=k*:p(+,][r6H-\ro!ihX.RYq.^G3qjs]lE6)C5mk9U^2g9TB]_?]mHeZ-`>Hl(\[`?A!)Z"YgluhXC>oc?tm-9bgFa(jkGE7&`Y1i_jYIj70]"NN?n%'+7GM[1tT\hKUVVHj*i*4In_;ARF2nM4sY;/`BC!b3DRM71hBk;oJpClkj03:lk>&SU`[[W0m\GJJd)XR%[K(/4*X,%KR\Pb&2OOp`Z>t4YQ5+2,%kQ#M'D+V0[Af&k[#49GU]\5+Y?GTgYNS3@L55BV1pp;G;3qP;WDm+=4YA1e,;d%^TIC%`kmChrN*P1^C?;'aFS[$LA(^d%d"t=qMRhSq1qaG;3HU)s+he.A'\U7BI9hP-hp%R8(H1?MZ*=Y@3C#i^igU\rVX_5t(NT],skl]A5UV?Hef>?tq#M7IgqV?n%HY[tNfqTP]h`?0q\&(Sc[cp-R4]gAJMHdOMWjc$cf^'CBB%^,NG/tIXVUZG,;bh#l]68)*\]h:YY3Biu\`EJ=S*d;bl]nmn!hq<_<Hb0$mH,?`Q[MY7oYY03hfmq*fc73*40rXpje4u"/.<]4ma:KGnF4W4f@K]JH>cdumGC\7#u(sr"9C=\!1=`P-3@Xi"N"[rVhqAoSqT#XW:ZZ[+mM3X9`_VmVY*5(THXq5"NVfSH3HF2H>FkJ_DNBjoc$V$:`=#c_D3o=OMM#)1hZqV+s;IAVG/h5d1b$-VkP(=:XTg'%7Ur)&0?W^)5mN8!!!$IW_uAYdmfSn;*@Y<6RSktPR",h-6Vs]z!&OZU!!3jrJcRS-BE9r]R[C)A1s0MgC/7dY4f51N+0%P)fVbZYAu:N<O9)!S!!Gk!&-Mtu!WZ.64H,#o]erU5MOmbh126#j6dcKA*hXRI!!!"I5Oa1%s&K)0!I"?)gs*A/8+HVt+RM#*pZXt[gG6CZKg1/)S3f+BI'AQ?D:YIuYB_3K]mm>qAdB/[%*UXGpjQS:jj;)=hK*$T^0/THkrEP%=]e+Wd;DA#G?I;s2uV-QdMr,f7bNOiJ<N;3g]YCG!A=?$F!Q1H@qG.rCmndkK5@WpQ8NNW:UHS9)rHdY#Hif'H^hZ>?:EsZ_NX(e27u8ggHZ2's0dYiFEaqs%V(2*$S!t=!CA1K+sDVtJq-sr&5]&c&+>&LnV'J!_Mea;.6n4:-#f29$Qm9G[S_T[?sH]HC@hr9!"0R<7`m3R+&klF!(D]3&qg;]Tj/^*;:->Tpmuc"Q<@b<VQXZ;X$RsI@ni(:<*-P6%5Kda,h41HL8%YDA?uGj1sff,,dS1a_T@n^VAfUgbXTu+L^Qg(>9u(&N0p?7@qM+8"cT8+>)G(PVM#/Jfcj?e?kU:h@+-j*7;1=2Q%n%*f#3621*^>*1F.sC;Gng:>%8sR8OUg5-7"j7b`\\IAMm(R@hR4T0P!kO@;.5<'JfrW+W?3%Cm8Zh;J\sme=%U".P,1F`+cJ"1pMWN`\!=/db9Z%Ah#Br2)\/E0r._oMNFQCBUVR,@MViqbqu8[Lqs.#Bi.Qt.8:Zo9,UEjOeHGk9/SV+#b"kkQAM)I(1n4ZP=24DVHHJ7-Bgf.6T#c>8Q8)K7?#JH.[\H0@[WHXBd"D>9J\*)%:Um2PS(0Y,U?tkVM6rOZs+J-;c8iJ2'n_LP"DNEQ9pQ8;A2q08s<h^R),4i,tUrZdA/[T,8O!UfdgNdUeIMW`6>2p[VSg:2A%d5,702`e>\2U9Rmbt[$`\2V?ETf,*Ak1KIdR1/K6udb92WmMC#NlZl)c$'Gb;tBdkos5c/A?YYhcA9beMpP/PaB93I_c-j<$TN+CTifZ)$j`C5Y%(tgg4Q:WKU8?uqXg+=^ND&+[%R+!WDZkOFR(.MtpP)WA&;J@PdC;Ca^=Y+7*W2gY"ChjAe`(6/VN?jgSg.6j3&n=LtVI;A/0t(!tRA`I)/XFL(a:t"mP+mr!0c%i\^f`-rJh3Y'"'0086qnCNUp61#Xg'=?M4l.P##dik9sU)-ALI]E[I%d.!NE(%JDbB+^sF=+=Cg/EV4uBT.P.&E`+G-JC0F4Y;`1H*[a`[X9X78?PAM5U2G,-W1GG;06s=E.bn`rENMakBAQ'<O88:WI)Q'Kt1pYjkOIAX4c*<7B2.kQ/.8U[5W)<dL66f#7BduH/X(9dc7^acs.7l<2/=)GC[';O/fVk0/[4JCqbuW(l0Vfp1[OiiSR&*?^U8=)k)U-jA-F0INZPFH9Q:AkG6B*,AZRII_MTqD!8O+Pi8u?>]MTJo=P-dZ_[P;9,%B-?3Rj=2,12L?\2@5Vi,;>l>MaajC2706>$<`*>(,/BNN00)<=^+4k`[.G08r[=a1f,rc;Im`q-Ifkc7A@bp[M7.m8[:c6B[Hjf@kuan;R7l(<0:RgBPj&LVFtA39WBea5tS)rW\q12[+(Ir)b,cs%@Ko@7&iM2[$3nS;Jh;s%&5DRA@4j<R&_R49boUkW`7E2KLX-C0Uegl;/%OiW2roOVUSg>NJc)MgE\RR',<uNYt:dL'r$m`[A>3e&oF:8Ro-:%[%T8&2V=g?=Y.]fbr1iS[OiqA`+rnlAW"o:.mjYAWM\;s2Fs#\8Q&N@bu0D,@4%rfNGU!dRl*KGVFX[peL\/Wb1bSb<Iuu'&f9X^RR4*F"Y<'pPqn80<Kgn/BUY*kQAlb-b`^4c/OW^@dahtf<(REq,uJ4,AkY(J<?`WQejMqYBj4<4-I"+hM\;K3;.R&!,tc?GAD+3*BLsET8k^MR'.F@30T!&u@oX6hUqVmnk)(Z'Q&V`"VD#g#a5bd_jO8H##`5JCQQSJaUHWOT)W*H95N*mf;?$C)(^EVpfRIq'GPY:>YLh%7n:m.c4C_nuD.nbIJNa[=hSG+gUif!!M#VoF1WnT$0e)l7YqXNJO4`QfX\hAn@M:(EU[6C3L8aG_l;.+5LrL>OkY"[]`E4hKd^.M"#2`Hk.t`8$ObOD@9gt\j5O;NfCIKN77pPIt/if)X"="S.8PV+fAiJfXb@=akO5uZnlf2['NX_kP-h(e+*@JX^*Vl8ZJM`WY7%LP#MWYl1^E[0e0S#k+bPjXCUPNUOPIGHl60sOVJqDte#i*%7S[j_$Od4bXk+Wd^K*Y2RUI<(#*C&?Qs1P\MF)YW"E8ZfuC*E)h0W_@ia?=56#t(cuks8Qp_XPg,/[dH0A@Vr_fsu4>?On6+EQu\Ngb_tAr@tbUCfF(hIqMc#o$"X$<fU^&M;`_TN:*Fee\p$IJ_*X#1"%)K:Ti@a9N<FmPuJt(*HTq[S&?"uAMJ+/@%1:*78WB+%!BM6r5bVuJ^[cJRo*:$GO4BZ+6VH?Hi=E,k;H4'l5gG%)nbu,ha1N1AQD'&b83VQ>8a@Dg#Bk8A;,jkTjjnY+Z*2j,(_qr-]/3>iNW8#1HHJ<s5(OP2AJnP6_X;QrSaQPI?OBp<?(`GajB%AS"!ntD7]8"Q+%ZO[[;N3'4BPTa<-<N@H\]$(qm8f0?L%C*ODd:+MoP;I'Z5\Yr^!5"gC`,&q`PiEXXMoGtq_Hh+U85K+eIRi>WG<A2n+f,cj[u+!E\i4"6sXCAPWHmGb_JZaN/QT#!,E*Am,(fWoDNegUnLNpIKRV=8!np
|
2007-08-08 21:17:48 +01:00
|
|
|
# ===>END WOOF<===
|