Source Files/0000755000175000000000000000000011447425262012031 5ustar asimrootSource Files/.svn/0000755000175000000000000000000011447212124012704 5ustar asimrootSource Files/.svn/tmp/0000755000175000000000000000000011447211360013505 5ustar asimrootSource Files/.svn/props/0000755000175000000000000000000011447211360014050 5ustar asimrootSource Files/.svn/text-base/0000755000175000000000000000000011447211360014601 5ustar asimrootSource Files/.svn/prop-base/0000755000175000000000000000000011447211360014575 5ustar asimrootSource Files/.svn/tmp/props/0000755000175000000000000000000011433147600014650 5ustar asimrootSource Files/.svn/tmp/prop-base/0000755000175000000000000000000011433147600015375 5ustar asimrootSource Files/.svn/tmp/text-base/0000755000175000000000000000000011447211360015401 5ustar asimrootSource Files/wiigrab.py~0000755000175000000000000002266711442210014014223 0ustar asimroot#----------------------------------------------------------------------------- # module name : wiigrab.py # author : Asim Mittal (c) 2010 # description : This module defines the WiimoteEventGrabber Class and various # other routines that are needed to work with the wiimote data # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import cwiid,time,wiipoint from threading import Thread class WiimoteEventGrabber (cwiid.Wiimote,Thread): """ Wrapper for cwiid.Wiimote class. The object of this class upon creation searches for the nearest available wii remote and tries to connect to it If none is discovered, then an exception is raised by the class constructor """ def __init__(self,handler,interval=0.001,objTemp=None): """ handler = callback routine which will be invoked and to which every report from the wiimote will be directed. callback routine must be of the type: callbackName(dictionaryRemoteState,referenceToRemoteObj) dictionaryRemoteState looks like this: {'acc': (125, 125, 150), 'led': 1, 'ir_src': [None, None, None, None], 'rpt_mode': 14, 'ext_type': 0, 'buttons': 0, 'ru mble': 0, 'error': 0, 'battery': 85} interval= sampling interval between reports in seconds. default value is set to 100 milliseconds (which allows for 10 reports in a second) obj = some temporary object that you would like to send to the callback routine In the case of a GUI, you can send the form object as a reference to the callback routine using this argument and control various parts of your UI using this reference """ self.eventRaised = handler self.sleeptime = interval self.stopThread = False self.isDead = False self.objtemp = objTemp cwiid.Wiimote.__init__(self) Thread.__init__(self) #------------------------------------------------------------------------------ def stop(self): """ this routine will stop the background thread and no more reports will be generated """ self.stopThread = True #------------------------------------------------------------------------------ def run(self): """ this routine will start the background thread and read data from the wii remote. Subsequently that data will be forwarded to the callback specified through the handler argument of the constructor """ self.stopThread = False while not self.stopThread: self.eventRaised(self.state,self,self.objtemp) time.sleep(self.sleeptime) self.isDead = True #------------------------------------------------------------------------------ def join(self): """ closes the wii remote's data report and disconnects it """ self.stop() try: while not self.isDead:pass except: pass self.led = 0 self.rumble = 0 self.close() #------------------------------------------------------------------------------ def isAlive(self): """ returns true if the background thread is still running, false if it has been stopped """ return (not self.isDead) #------------------------------------------------------------------------------ def setReportType(self,rptButton=True,rptAccel=True,rptIR=True): """ set the report properties from the wiimote. rptButton = if true, the button info will be reported rptAccel = if true, the accelerometer info will be reported rptIR = if true, the IR tracking info will be reported """ report = 0 if rptButton : report = report | cwiid.RPT_BTN if rptAccel : report = report | cwiid.RPT_ACC if rptIR : report = report | cwiid.RPT_IR #assign the final report value to the report mode of the wiimote self.rpt_mode = report #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ def getVisibleIRPoints(report): """ This routine accepts the report (dictionary) and returns a tuple (list,int) the list in the tuple is of size four and contains the coordinates of the visible IR points. The int value in the tuple contains the number of points that are visible. for instance, if two points are visible, then the value returned is: ([pointCoords1, pointCoords2, None, None],2) """ reportIR = report['ir_src'] toReturn = [None,None,None,None] count = 0 for i in range(0,len(reportIR)): eachEntry = reportIR[i] if eachEntry <> None: point = wiipoint.IRPoint() point.getPointFromReportEntry(eachEntry) toReturn[i] = (point) count += 1 else: break return toReturn,count #------------------------------------------------------------------------------ def getNameOfButton(buttonValue): """ returns the name of the button whose integer code is passed as argumnet """ dctBtnNames = { cwiid.BTN_1:"1", cwiid.BTN_2:"2", cwiid.BTN_A:"A", cwiid.BTN_B:"B", cwiid.BTN_DOWN:"Down", cwiid.BTN_HOME:"Home", cwiid.BTN_LEFT:"Left", cwiid.BTN_MINUS:"Minus", cwiid.BTN_PLUS:"Plus", cwiid.BTN_RIGHT:"Right", cwiid.BTN_UP:"Up", 0: "None" } if dctBtnNames.has_key(buttonValue): return dctBtnNames[buttonValue] else: return "unrecognized" #------------------------------------------------------------------------------ def resolveButtons(buttonValue): """ this routine resolves a button value into all the buttons that might have been pressed to generate this combination. For instance, BTN_A = 8, and BTN_B = 4. Now when A and B are pressed together, the buttonValue reported by the wiimote is the sum of all buttons pressed i.e. 12 When you pass "12" to this routine it returns [8,4]. This is true for any number of simultaneous keypresses. if a single button is pressed , for instance only BTN_A is pressed, then simply [8] is returned This routine helps resolve simultaneous button presses on the remote into its individual values """ lstButtons = [cwiid.BTN_1,cwiid.BTN_2,cwiid.BTN_A,cwiid.BTN_B,cwiid.BTN_DOWN,cwiid.BTN_HOME,cwiid.BTN_LEFT,cwiid.BTN_MINUS,cwiid.BTN_PLUS,cwiid.BTN_RIGHT,cwiid.BTN_UP] lstButtons.sort() #obtain a list of all the buttons in ascending order #the following loop finds the first value in the sorted list that is greater than the argument #button value. So [1,2,4,8,16,128....4096] is the sorted list. If buttonValue = 12, then the loop #breaks at 16 (first value in the list that is greater than 12). so basically we will now #work only on the part of the list before 16 ie. [1,2,4,8] as no value greater that 12 would have been #pressed, or else the button value given by the wiimote would have been larger for i in range(0,len(lstButtons)): if lstButtons[i] > buttonValue:break elif lstButtons[i] == buttonValue: return [lstButtons[i]] #this list will contain the individually resolved key codes resolved = [] #the following loop works only on the segment of the list grabbed by the previous loop. starting from #the greatest value to the lowest. So we work on [8,4,2,1] for i in range(i,-1,-1): #now if the sum of items (button codes) already present in the "resolved" list and the current #button code is lesser or equal to the button value, this key would have been definitely pressed #in order to generate the button code that was reported. #for instance 12 was generated, and we're now working on [8,4,2,1], so for the first pass of this #loop, check sum(all items in resolved list) + 8 < 12 or not. if so, then add 8 #here is each pass for the example: # sum[0] + 8 <= 12 --> true, so, resolved = [8] # sum[8] + 4 <= 12 --> true, so, resolved = [8,4] # sum[8,4] + 2 <= 12 --> false cuz 8+4+2 = 14, skip this value # sum[8,4] + 1 <= 12 --> false cuz 8+4+1 = 13, skip this value if (sum(resolved)+lstButtons[i]) <= buttonValue: resolved.append(lstButtons[i]) #return all the values stored in the resolved list. These codes represent the buttons that were #used to generate the given value of the argument return resolved #------------------------------------------------------------------------------ Source Files/test1.py~0000755000175000000000000000263311442210454013636 0ustar asimrootimport threading,sys, wiigrab, wiipoint from pylab import * array = [] lock = threading.Lock() def handler(report,wiiref,tmp): global array irPts = report['ir_src'] lock.acquire() if irPts[0] <> None: array.append(irPts[0]) else: if array <> []: xVals = [] ; yVals = [] for each in array: pos = each['pos'] xVals.append(pos[0]) yVals.append(pos[1]) array = [] plot(xVals,yVals,'.') savefig('output.png') print 'Done' lock.release() #------------------------------------ MAIN ------------------------------------------ if __name__ == "__main__": #------------------ Create Object, Connect and Configure ------------------- try: print "Press the buttons 1 & 2 together..." wiiObj = wiigrab.WiimoteEventGrabber(handler) wiiObj.setReportType() wiiObj.led = 15 wiiObj.start() except: print "Wii remote not found. Please check that the device is discoverable" sys.exit(0) #---- Start the Wiimote as a thread with reports fed to assigned callback---- #----------------- Run the Main loop so that the app doesn't die ------------ while True: try: time.sleep(1) except KeyboardInterrupt: wiimote.join() print 'Closed...' print 'End of app' Source Files/runVirtualObject.py~0000755000175000000000000000550311436023104016074 0ustar asimrootfrom PyQt4.QtGui import * from PyQt4.QtCore import * import sys,wiigrab,wiipoint,math class VirtualObject(QWidget): def initWiimote(self): print 'Trying to connect to the wiimote, press 1 & 2 together...' try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.wiimote = wiigrab.WiimoteEventGrabber(self.handleWiimoteReport) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: QMessageBox.critical(self,'Connectivity Error','The application could not find any wiimotes, please ensure that the remote is discoverable and restart the application') self.close() sys.exit(0) def initWindow(self,xOrigin,yOrigin,width,height): self.setWindowTitle('Virtual Objects') self.setGeometry(xOrigin,yOrigin,width,height) self.setAttribute(Qt.WA_PaintOutsidePaintEvent) self.paint = QPainter() def initObject(self): self.sizeRed = [10,10] self.posRed = [30,30] self.boxColor = Qt.red self.angle = 0 def __init__(self,parent=None): QWidget.__init__(self,parent) self.initWiimote() self.initWindow(100,100,500,500) self.initObject() self.timer = QTimer() self.connect(self,SIGNAL("resize"),self.stretchDot) self.connect(self,SIGNAL("move"),self.moveDot) self.connect(self.timer,SIGNAL("timeout()"),self.timeout) self.timer.start(20) def timeout(self): self.erase();self.draw() def paintEvent(self,event): self.draw() def closeEvent(self,event): print 'Waiting for wiimote to disconnect...' try: self.wiimote.join() print 'Wiimote has disconnected successfully!' except: print 'Wiimote object could not be properly terminated!' print 'Closing app...' def moveDot(self,delX,delY): #self.erase() self.posRed[0] -= delX self.posRed[1] -= delY #self.draw() def stretchDot(self,delW,delH): #self.erase() self.sizeRed[0] -= delW self.sizeRed[1] -= delH #self.draw() def erase(self): self.paint.begin(self) self.paint.eraseRect(0,0,self.width(),self.height()) self.paint.end() def draw(self): self.paint.begin(self) self.paint.setBrush(self.boxColor) self.paint.rotate(self.angle) self.paint.drawRect(self.posRed[0],self.posRed[1],self.sizeRed[0],self.sizeRed[1]) self.paint.end() def handleWiimoteReport(self,report,wiiref,tmp): rptIR,countVisible = wiigrab.getVisibleIRPoints(report) curIR1 = rptIR[0] curIR2 = rptIR[1] delX = 0 delY = 0 if countVisible <> 0 : if self.oldCoords[0].size <> 0 : delX = curIR1.x - self.oldCoords[0].x delY = curIR1.y - self.oldCoords[0].y self.oldCoords[0] = curIR1 if curIR2 <> None: self.emit(SIGNAL("resize"),delX,delY) else: self.emit(SIGNAL("move"),delX,delY) else: self.oldCoords[0].size = 0 if __name__ == '__main__': app = QApplication(sys.argv) frm = VirtualObject() frm.show() app.exec_() Source Files/runPuzzle.py~0000755000175000000000000002065711440021510014611 0ustar asimrootfrom PyQt4.QtCore import * from PyQt4.QtGui import * from puzzleui import * import sys,wiigrab,wiipoint class PuzzleEkt(Ui_Form,QWidget): def initObjects(self): """ initialize the objects viz. the images, the cursors etc""" self.images = [self.img1, self.img2, self.img3, self.img4] self.initialPositions = [self.img1.pos(),self.img2.pos(),self.img3.pos(),self.img4.pos()] self.cursors = [self.cursor1,self.cursor2,None,None] self.selection = [None,None,None,None] self.timer = QTimer() self.paint = QPainter() #------------------------------------------------------------------------ def initWiimote(self,handler): """ setup the wiimote and assign the handler to process events """ try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] print 'Press 1 & 2 together...' self.wiimote = wiigrab.WiimoteEventGrabber(handler) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: QMessageBox.critical(self,'Connectivity Error','The application could not find any Wiimotes. Please ensure your device is discoverable and restart the application') self.close() sys.exit(0) #------------------------------------------------------------------------ def initWindow(self): """ configure the window """ self.move(100,100) #------------------------------------------------------------------------ def __init__(self): """ class constructor """ QWidget.__init__(self,None) self.setupUi(self) self.initWindow() self.initObjects() self.initWiimote(self.wiimoteReportHandler) self.setAttribute(Qt.WA_PaintOutsidePaintEvent,True) #event bindings go in here self.connect(self.timer,SIGNAL("timeout()"),self.timeout) self.connect(self,SIGNAL("moveDot"),self.moveDot) self.connect(self,SIGNAL("deselect"),self.dropSelected) #------------------------------------------------------------------------ def timeout(self): """ this is the tick handler for the application timer. Whenever the timer is running it checks if either of the cursors are positioned on top of any of the images. If they are, then it causes that particular image to be "selected" """ for c in range(0,len(self.cursors)): #loops through all the cursors in the workspace cursor = self.cursors[c] for image in self.images: #loops through all the images in the workspace if self.isCursorOnImage(cursor,image) == True: #if a cursor is found on an image if self.selection[c] == None: #and if that cursor hasn't selected anything yet self.selection[c] = image #mark that image to have been selected by that cursor self.timer.stop() #stop the timer #------------------------------------------------------------------------ def isCursorOnImage(self,cursor,image): """ this performs a check on the cursor and image object passed to it. If the cursor geometry is coincident with that of the specified image, then it returns true, else false """ if cursor == None: return False xOriginImage = image.x() yOriginImage = image.y() widthImage = image.width() heightImage = image.height() xRange = range(xOriginImage,xOriginImage+widthImage) yRange = range(yOriginImage,yOriginImage+heightImage) xCursor = cursor.x() yCursor = cursor.y() if (xCursor in xRange) and (yCursor in yRange): return True else: return False #------------------------------------------------------------------------ def moveDot(self,dot,delX,delY): """ displaces the cursor specified (by dot) by the specified distance along X and Y """ #displace the cursor specified by 'dot' by delX and delY xNew = self.cursors[dot].x() - delX yNew = self.cursors[dot].y() - delY self.cursors[dot].move(xNew,yNew) #start the timer if it is not running already, and let it tick out at the end of 2 seconds #this is done to create the "Dwell click" effect. After two seconds are over, the timeout #routine will check if any of the cursors lie on any of the images, if yes, they will cause #the image to get selected under that cursor using the "selection" list if self.timer.isActive() == False: self.timer.start(2000) #get the current selection for the cursor and check if the selection bears an image selected = self.selection[dot] if selected <> None: #yes, this cursor does have an image selected by it, so displace the image by delX and delY too xNew = selected.x() - delX; yNew = selected.y() - delY selected.move(xNew,yNew) #------------------------------------------------------------------------ def dropSelected(self,dot): """ this routine clears the image currently selected by the cursor specified by dot this is quite important as this routine will cause the cursor to deselect the image and continue moving freely. After a dwell click occurs, the image and cursor move together to mimic a drag event. This routine allows the image to be "dropped" completing the drag and drop sequence """ self.selection[dot] = None #------------------------------------------------------------------------ def closeEvent(self,event): """ things to do before the app shuts down """ print 'Closing' try: self.wiimote.join() print 'Wiimote disconnected successfully!' except: print 'Wiimote pipe was not closed properly' #------------------------------------------------------------------------ def wiimoteReportHandler(self,report,wiiref,frmRef): """ handle the incoming reports from the wiimote. this routine is a lot similar to the report handler for the dual point demo, except that in order to intiate a dwell click and then later deselect the image, it sends out the "move" signal when the IR point is visible (so as long as the IR point for a particular cursor is visible, the move signal is generated) and sends out a "deselect" signal when the particular IR point for a cursor is not present (by sending the deselect signal for a particular cursor, the app understands when to drop the selected image and let the cursor move freely about the workspace) """ rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() multiplier = 2 #this if clause is executed when there are no points visible if countVisible == 0: for i in range(0,len(self.oldCoords)): self.oldCoords[i].nullify() self.emit(SIGNAL("deselect"),i) #if even one point is visible, the stmts in this clause are executed else: #loop this for all the visible IR points for i in range(0,countVisible): #if the ith point is visible (<>none) and there are upto two points visible (since we have only two dots) if (rptIR[i] <> None): point.calculateDisplacement(self.oldCoords[i],rptIR[i]) point.scaleBy(multiplier) if self.oldCoords[i].size <> 0: self.emit(SIGNAL("moveDot"),i,point.x,point.y) self.oldCoords[i] = rptIR[i] #this is a peculiar case and occurs when the first IR point may disappear and the #second IR point is still on in view else: self.emit(SIGNAL("deselect"),i);print 'deselecting' #----------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = PuzzleEkt() frm.show() app.exec_()Source Files/puzzleui.py~0000755000175000000000000002523211437475672014510 0ustar asimroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'puzzleui.ui' # # Created: Wed Sep 1 15:14:00 2010 # by: PyQt4 UI code generator 4.7.2 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(640, 480) Form.setMinimumSize(QtCore.QSize(640, 480)) #Form.setMaximumSize(QtCore.QSize(640, 480)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush) Form.setPalette(palette) self.img1 = QtGui.QLabel(Form) self.img1.setGeometry(QtCore.QRect(160, 90, 151, 121)) self.img1.setText("") self.img1.setPixmap(QtGui.QPixmap("1.jpg")) self.img1.setScaledContents(True) self.img1.setObjectName("img1") self.img2 = QtGui.QLabel(Form) self.img2.setGeometry(QtCore.QRect(330, 220, 151, 121)) self.img2.setText("") self.img2.setPixmap(QtGui.QPixmap("2.jpg")) self.img2.setScaledContents(True) self.img2.setObjectName("img2") self.img3 = QtGui.QLabel(Form) self.img3.setGeometry(QtCore.QRect(330, 90, 151, 121)) self.img3.setText("") self.img3.setPixmap(QtGui.QPixmap("3.jpg")) self.img3.setScaledContents(True) self.img3.setObjectName("img3") self.img4 = QtGui.QLabel(Form) self.img4.setGeometry(QtCore.QRect(160, 220, 151, 121)) self.img4.setText("") self.img4.setPixmap(QtGui.QPixmap("4.jpg")) self.img4.setScaledContents(True) self.img4.setObjectName("img4") self.label = QtGui.QLabel(Form) self.label.setGeometry(QtCore.QRect(260, 380, 141, 51)) font = QtGui.QFont() font.setFamily("Gothic Uralic") font.setPointSize(24) self.label.setFont(font) self.label.setObjectName("label") self.cursor1 = QtGui.QLabel(Form) self.cursor1.setGeometry(QtCore.QRect(20, 20, 5, 5)) self.cursor1.setText("") self.cursor1.setPixmap(QtGui.QPixmap("cursor1.gif")) self.cursor1.setObjectName("cursor1") self.cursor2 = QtGui.QLabel(Form) self.cursor2.setGeometry(QtCore.QRect(610, 20, 5, 5)) self.cursor2.setText("") self.cursor2.setPixmap(QtGui.QPixmap("cursor2.gif")) self.cursor2.setObjectName("cursor2") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): Form.setWindowTitle(QtGui.QApplication.translate("Form", "EkTitli Puzzle", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("Form", "ektitli.org", None, QtGui.QApplication.UnicodeUTF8)) Source Files/puzzleui.py0000755000175000000000000002523111437476112014277 0ustar asimroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'puzzleui.ui' # # Created: Wed Sep 1 15:14:00 2010 # by: PyQt4 UI code generator 4.7.2 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(640, 480) Form.setMinimumSize(QtCore.QSize(640, 480)) Form.setMaximumSize(QtCore.QSize(640, 480)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush) Form.setPalette(palette) self.img1 = QtGui.QLabel(Form) self.img1.setGeometry(QtCore.QRect(160, 90, 151, 121)) self.img1.setText("") self.img1.setPixmap(QtGui.QPixmap("1.jpg")) self.img1.setScaledContents(True) self.img1.setObjectName("img1") self.img2 = QtGui.QLabel(Form) self.img2.setGeometry(QtCore.QRect(330, 220, 151, 121)) self.img2.setText("") self.img2.setPixmap(QtGui.QPixmap("2.jpg")) self.img2.setScaledContents(True) self.img2.setObjectName("img2") self.img3 = QtGui.QLabel(Form) self.img3.setGeometry(QtCore.QRect(330, 90, 151, 121)) self.img3.setText("") self.img3.setPixmap(QtGui.QPixmap("3.jpg")) self.img3.setScaledContents(True) self.img3.setObjectName("img3") self.img4 = QtGui.QLabel(Form) self.img4.setGeometry(QtCore.QRect(160, 220, 151, 121)) self.img4.setText("") self.img4.setPixmap(QtGui.QPixmap("4.jpg")) self.img4.setScaledContents(True) self.img4.setObjectName("img4") self.label = QtGui.QLabel(Form) self.label.setGeometry(QtCore.QRect(260, 380, 141, 51)) font = QtGui.QFont() font.setFamily("Gothic Uralic") font.setPointSize(24) self.label.setFont(font) self.label.setObjectName("label") self.cursor1 = QtGui.QLabel(Form) self.cursor1.setGeometry(QtCore.QRect(20, 20, 5, 5)) self.cursor1.setText("") self.cursor1.setPixmap(QtGui.QPixmap("cursor1.gif")) self.cursor1.setObjectName("cursor1") self.cursor2 = QtGui.QLabel(Form) self.cursor2.setGeometry(QtCore.QRect(610, 20, 5, 5)) self.cursor2.setText("") self.cursor2.setPixmap(QtGui.QPixmap("cursor2.gif")) self.cursor2.setObjectName("cursor2") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): Form.setWindowTitle(QtGui.QApplication.translate("Form", "EkTitli Puzzle", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("Form", "ektitli.org", None, QtGui.QApplication.UnicodeUTF8)) Source Files/wiigrab.py0000755000175000000000000002260711443511424014031 0ustar asimroot#----------------------------------------------------------------------------- # module name : wiigrab.py # author : Asim Mittal (c) 2010 # description : This module defines the WiimoteEventGrabber Class and various # other routines that are needed to work with the wiimote data # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import cwiid,time,wiipoint from threading import Thread class WiimoteEventGrabber (cwiid.Wiimote,Thread): """ Wrapper for cwiid.Wiimote class. The object of this class upon creation searches for the nearest available wii remote and tries to connect to it If none is discovered, then an exception is raised by the class constructor """ def __init__(self,handler,interval=0.001,objTemp=None): """ handler = callback routine which will be invoked and to which every report from the wiimote will be directed. callback routine must be of the type: callbackName(dictionaryRemoteState,referenceToRemoteObj) dictionaryRemoteState looks like this: {'acc': (125, 125, 150), 'led': 1, 'ir_src': [None, None, None, None], 'rpt_mode': 14, 'ext_type': 0, 'buttons': 0, 'ru mble': 0, 'error': 0, 'battery': 85} interval= sampling interval between reports in seconds. default value is set to 100 milliseconds (which allows for 10 reports in a second) obj = some temporary object that you would like to send to the callback routine In the case of a GUI, you can send the form object as a reference to the callback routine using this argument and control various parts of your UI using this reference """ self.eventRaised = handler self.sleeptime = interval self.stopThread = False self.isDead = False self.objtemp = objTemp cwiid.Wiimote.__init__(self) Thread.__init__(self) #------------------------------------------------------------------------------ def stop(self): """ this routine will stop the background thread and no more reports will be generated """ self.stopThread = True #------------------------------------------------------------------------------ def run(self): """ this routine will start the background thread and read data from the wii remote. Subsequently that data will be forwarded to the callback specified through the handler argument of the constructor """ self.stopThread = False while not self.stopThread: self.eventRaised(self.state,self,self.objtemp) time.sleep(self.sleeptime) self.isDead = True #------------------------------------------------------------------------------ def join(self): """ closes the wii remote's data report and disconnects it """ self.stop() self.led = 0 self.rumble = 0 while not self.isDead:pass self.close() #------------------------------------------------------------------------------ def isAlive(self): """ returns true if the background thread is still running, false if it has been stopped """ return (not self.isDead) #------------------------------------------------------------------------------ def setReportType(self,rptButton=True,rptAccel=True,rptIR=True): """ set the report properties from the wiimote. rptButton = if true, the button info will be reported rptAccel = if true, the accelerometer info will be reported rptIR = if true, the IR tracking info will be reported """ report = 0 if rptButton : report = report | cwiid.RPT_BTN if rptAccel : report = report | cwiid.RPT_ACC if rptIR : report = report | cwiid.RPT_IR #assign the final report value to the report mode of the wiimote self.rpt_mode = report #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ def getVisibleIRPoints(report): """ This routine accepts the report (dictionary) and returns a tuple (list,int) the list in the tuple is of size four and contains the coordinates of the visible IR points. The int value in the tuple contains the number of points that are visible. for instance, if two points are visible, then the value returned is: ([pointCoords1, pointCoords2, None, None],2) """ reportIR = report['ir_src'] toReturn = [None,None,None,None] count = 0 for i in range(0,len(reportIR)): eachEntry = reportIR[i] if eachEntry <> None: point = wiipoint.IRPoint() point.getPointFromReportEntry(eachEntry) toReturn[i] = (point) count += 1 else: break return toReturn,count #------------------------------------------------------------------------------ def getNameOfButton(buttonValue): """ returns the name of the button whose integer code is passed as argumnet """ dctBtnNames = { cwiid.BTN_1:"1", cwiid.BTN_2:"2", cwiid.BTN_A:"A", cwiid.BTN_B:"B", cwiid.BTN_DOWN:"Down", cwiid.BTN_HOME:"Home", cwiid.BTN_LEFT:"Left", cwiid.BTN_MINUS:"Minus", cwiid.BTN_PLUS:"Plus", cwiid.BTN_RIGHT:"Right", cwiid.BTN_UP:"Up", 0: "None" } if dctBtnNames.has_key(buttonValue): return dctBtnNames[buttonValue] else: return "unrecognized" #------------------------------------------------------------------------------ def resolveButtons(buttonValue): """ this routine resolves a button value into all the buttons that might have been pressed to generate this combination. For instance, BTN_A = 8, and BTN_B = 4. Now when A and B are pressed together, the buttonValue reported by the wiimote is the sum of all buttons pressed i.e. 12 When you pass "12" to this routine it returns [8,4]. This is true for any number of simultaneous keypresses. if a single button is pressed , for instance only BTN_A is pressed, then simply [8] is returned This routine helps resolve simultaneous button presses on the remote into its individual values """ lstButtons = [cwiid.BTN_1,cwiid.BTN_2,cwiid.BTN_A,cwiid.BTN_B,cwiid.BTN_DOWN,cwiid.BTN_HOME,cwiid.BTN_LEFT,cwiid.BTN_MINUS,cwiid.BTN_PLUS,cwiid.BTN_RIGHT,cwiid.BTN_UP] lstButtons.sort() #obtain a list of all the buttons in ascending order #the following loop finds the first value in the sorted list that is greater than the argument #button value. So [1,2,4,8,16,128....4096] is the sorted list. If buttonValue = 12, then the loop #breaks at 16 (first value in the list that is greater than 12). so basically we will now #work only on the part of the list before 16 ie. [1,2,4,8] as no value greater that 12 would have been #pressed, or else the button value given by the wiimote would have been larger for i in range(0,len(lstButtons)): if lstButtons[i] > buttonValue:break elif lstButtons[i] == buttonValue: return [lstButtons[i]] #this list will contain the individually resolved key codes resolved = [] #the following loop works only on the segment of the list grabbed by the previous loop. starting from #the greatest value to the lowest. So we work on [8,4,2,1] for i in range(i,-1,-1): #now if the sum of items (button codes) already present in the "resolved" list and the current #button code is lesser or equal to the button value, this key would have been definitely pressed #in order to generate the button code that was reported. #for instance 12 was generated, and we're now working on [8,4,2,1], so for the first pass of this #loop, check sum(all items in resolved list) + 8 < 12 or not. if so, then add 8 #here is each pass for the example: # sum[0] + 8 <= 12 --> true, so, resolved = [8] # sum[8] + 4 <= 12 --> true, so, resolved = [8,4] # sum[8,4] + 2 <= 12 --> false cuz 8+4+2 = 14, skip this value # sum[8,4] + 1 <= 12 --> false cuz 8+4+1 = 13, skip this value if (sum(resolved)+lstButtons[i]) <= buttonValue: resolved.append(lstButtons[i]) #return all the values stored in the resolved list. These codes represent the buttons that were #used to generate the given value of the argument return resolved #------------------------------------------------------------------------------ Source Files/trayicon.png0000755000175000000000000000446111420772410014366 0ustar asimrootPNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXí[]e9vt:-L[=$%A9ExjHܛx!^!Z©D9R,tJgtڙ{Zр?b~g%"|G)GXXR.I :@@&"&PcZ#lXZ~MV9ƜN?RroJMncm}غ pbiYlZl g93s,0D!`J k ޱt}uAbE0n.,hr94+̱yI%wr;]Kߡ{wpCI0nf-I.a j%+qvx0]`<9{-J}-pÖ<|]W?f[iHDetepnnfk BZw& ;iLEh&r^|ç"ZŬ|@~`v7><xᅗ8|9NOt, LNu19){w{k4VP w+@ ^QeDu "T9z"yMU1Oj ֏ qhɍ|N #?El9̧_:m;jwgT*Fv%El*dLQ[$7_:[JΪ); x9O?uWFWO4ϸfp[KWMXrӝ5Q~-8q<@s®A` P[%[sm-Y\gC)!Kv_~Q`%l6F"$f^B 禅(_&w2Qe)<``p@zxmy$gϞCynn#MDiaDƤIFd$&h&w(8i f@kC\G[J}lĉ ̼GMi:Q#q̣ E *I^VA g!`x ֎ri*e7u?40F2KˋX#" ڵt%BۄrNqx>B*uC XA @Rs8g&QS1 NLhHUTk NY&`-Tj"ÄRV{vg֝|ejr884 8'Usa3pV0F5 iyZą5VI&19 +Q"] =\[<)B0H#y8!K!9TjPCJ9&,fC5ѺCqʠ*rRH"t^iy? kaEDR̻Fh.-OWHw<`M-6H#NWWX>4:TXsAW`t~3I@J NϞ'v7Uk=T^! ʠp%K_+r<.<-&/1FR @WD*.癳`o¦.b@ EOaqNX7S{Y}-zG%q@7|WZg,9u8'X[xc0} NE&@i8_a4_[x9>rN4+,XR6-E3E5ӹ`]Y,YUm*6l==y)\}`$wξ_~Fc礈\0ZH"TLP{ab ֌~ww#~GpNHbL?51~A> None: #yes, this cursor does have an image selected by it, so displace the image by delX and delY too xNew = selected.x() - delX; yNew = selected.y() - delY selected.move(xNew,yNew) #------------------------------------------------------------------------ def dropSelected(self,dot): """ this routine clears the image currently selected by the cursor specified by dot this is quite important as this routine will cause the cursor to deselect the image and continue moving freely. After a dwell click occurs, the image and cursor move together to mimic a drag event. This routine allows the image to be "dropped" completing the drag and drop sequence """ self.selection[dot] = None #------------------------------------------------------------------------ def closeEvent(self,event): """ things to do before the app shuts down """ print 'Closing' try: self.wiimote.join() print 'Wiimote disconnected successfully!' except: print 'Wiimote pipe was not closed properly' #------------------------------------------------------------------------ def wiimoteReportHandler(self,report,wiiref,frmRef): """ handle the incoming reports from the wiimote. this routine is a lot similar to the report handler for the dual point demo, except that in order to intiate a dwell click and then later deselect the image, it sends out the "move" signal when the IR point is visible (so as long as the IR point for a particular cursor is visible, the move signal is generated) and sends out a "deselect" signal when the particular IR point for a cursor is not present (by sending the deselect signal for a particular cursor, the app understands when to drop the selected image and let the cursor move freely about the workspace) """ rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() multiplier = 2 #this if clause is executed when there are no points visible if countVisible == 0: for i in range(0,len(self.oldCoords)): self.oldCoords[i].nullify() self.emit(SIGNAL("deselect"),i) #if even one point is visible, the stmts in this clause are executed else: #loop this for all the visible IR points for i in range(0,countVisible): #if the ith point is visible (<>none) and there are upto two points visible (since we have only two dots) if (rptIR[i] <> None): point.calculateDisplacement(self.oldCoords[i],rptIR[i]) point.scaleBy(multiplier) if self.oldCoords[i].size <> 0: self.emit(SIGNAL("moveDot"),i,point.x,point.y) self.oldCoords[i] = rptIR[i] #this is a peculiar case and occurs when the first IR point may disappear and the #second IR point is still on in view else: self.emit(SIGNAL("deselect"),i);print 'deselecting' #----------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = PuzzleEkt() frm.show() sys.exit(app.exec_())Source Files/runWiiControl.py0000755000175000000000000001326011432531250015213 0ustar asimroot#----------------------------------------------------------------------------- # module name : runWiiControl.py # author : Asim Mittal (c) 2010 # description : Demonstrates the integration of Xautomation with the Wiimote # buttons # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import wiigrab,sys,time,os #----------------------- Commands for various purposes ---------------------- cmdEnter = "xte \'key Return\'" cmdLeft = "xte \'key Left\'" cmdRight = "xte \'key Right\'" cmdUp = "xte \'key Up\'" cmdDown = "xte \'key Down\'" cmdAltUp = "xte \'keyup Alt_R\'" cmdZoomIn = "xte \'keydown Control_R\' \'keydown Alt_R\' \'str =\' \'keyup Alt_R\' \'keyup Control_R\'" cmdZoomOut= "xte \'keydown Control_R\' \'keydown Alt_R\' \'str -\' \'keyup Alt_R\' \'keyup Control_R\'" cmdMenu = "xte \'keydown Alt_R\' \'key F1\' \'keyup Alt_R\'" cmdClose = "xte \'keydown Alt_R' \'key F4\' \'keyup Alt_R\'" cmdMinim = "xte \'keydown Alt_R' \'key F9\' \'keyup Alt_R\'" cmdBack = "xte \'keydown Alt_R' \'key Left\' \'keyup Alt_R\'" cmdForward= "xte \'keydown Alt_R' \'key Right\' \'keyup Alt_R\'" cmdTab = "xte \'key Tab\'" cmdSwitch = "xte \'keydown Alt_R\' \'key Tab\'" cmdVLCSkip = "xte \'keydown Control_R\' \'key Right\' \'keyup Control_R\'" cmdVLCReplay = "xte \'keydown Control_R\' \'key Left\' \'keyup Control_R\'" cmdVLCVolMore= "xte \'keydown Control_R\' \'key Up\' \'keyup Control_R\'" cmdVLCVolLess= "xte \'keydown Control_R\' \'key Down\' \'keyup Control_R\'" cmdVLCFullScr= "xte \'key F\'" cmdVLCPlayPause = "xte \'key Space\'" cmdVLCPlaylist = "xte \'keydown Control_R\' \'key L\' \'keyup Control_R\'" cmdPptShow = "xte \'key F5\'" #-------------------- create a key map for each command ---------------------- keyMap = { (8,) : cmdEnter, #A (2048,): cmdUp, #Up (1024,): cmdDown, #Down (512,): cmdRight, #Right (256,): cmdLeft, #Left (4096,): cmdZoomIn, #Plus (16,): cmdZoomOut, #Minus (2,): cmdMinim, #1 (1,): cmdClose, #2 (128,): cmdMenu , #Home #now for the combos (4,2) : cmdPptShow, (128,4): cmdSwitch, #B + Home (512,4): cmdForward, #B + Right (256,4): cmdBack, #B + left (2048,4): cmdVLCVolMore, #B + Up (1024,4): cmdVLCVolLess, #B + Down (8,4): cmdVLCPlayPause, #A + B (4096,4): cmdVLCFullScr, #B + plus (16,4): cmdVLCPlaylist #B + Minus } #--------------------------------------------------------------------------- flagAltDown = False def buttonsHandler(report,wiiref,tempref): global keyMap,flagAltDown #capture the buttons that are being pressed, and resolve them buttonVal = report['buttons'] lstResolved = tuple(wiigrab.resolveButtons(buttonVal)) #if there is no button being pressed, and the alt key was down before this #then it means that the button has now been released. Hence alt key goes up if len(lstResolved) == 0 and flagAltDown == True: os.system(cmdAltUp) flagAltDown = False #pick out the key mapped to the following button value, if one exists if keyMap.has_key(lstResolved): cmd = keyMap[lstResolved] #fire that command if cmd == cmdSwitch : flagAltDown = True os.system(cmd) #------------------------------------ MAIN ------------------------------------------ if __name__ == "__main__": #------------------ Create Object, Connect and Configure ------------------- try: print "Press the buttons 1 & 2 together..." wiiObj = wiigrab.WiimoteEventGrabber(buttonsHandler) wiiObj.setReportType() wiiObj.led = 15 except: #print traceback.print_exc() print "Wii remote not found. Please check that the device is discoverable" sys.exit(0) #---- Start the Wiimote as a thread with reports fed to assigned callback---- wiiObj.start() #----------------- Run the Main loop so that the app doesn't die ------------ try: print 'Start of App' print 'Controls' print '------------' print 'Button A: Enter' print 'Arrows: Arrow keys' print 'Home: Application Menu' print 'Plus: Zoom In' print 'Minus: Zoom Out' print 'Button 1: Minimize' print 'Button 2: Close currently selected App' print '' print 'Button B + Button 1: View Slideshow' print 'Button B + Home: Application Switcher' print 'Button B + Right: Forward' print 'Button B + Left: Backward' print 'Button B + Up: VLC Volume Up' print 'Button B + Dn: VLC Volume Down' print 'Button B + A: VLC Play or Pause' print 'Button B + Plus: VLC Full Screen toggle' while True: time.sleep(1) except: #very important call to join here, waits till the wiimote connection is closed and the #wiimote is restored to its initial state wiiObj.join() print 'End of App' Source Files/simpleConnect.py0000755000175000000000000000435511443463360015215 0ustar asimroot#----------------------------------------------------------------------------- # module name : simpleConnect.py # author : Asim Mittal (c) 2010 # description : Demonstrates the following features: # a. establishing connectivity and creating a wiimote object # b. handling wiimote sensor data # c. interpreting the sensor data and doing something useful # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import wiigrab,sys,time def someEventHandler(reportFromWii,wiiObjRef,someTempRef): """ This is the callback routine for the wii remote. it simply gets the value of the LED currently present on the remote and toggles it """ print reportFromWii curLedVal = reportFromWii['led'] wiiObjRef.led = not curLedVal #------------------------------------ MAIN ------------------------------------------ if __name__ == "__main__": #------------------ Create Object, Connect and Configure ------------------- try: print "Press the buttons 1 & 2 together..." wiiObj = wiigrab.WiimoteEventGrabber(someEventHandler,1) wiiObj.setReportType() wiiObj.led = 15 except: print "Wii remote not found. Please check that the device is discoverable" sys.exit(0) #---- Start the Wiimote as a thread with reports fed to assigned callback---- wiiObj.start() #----------------- Run the Main loop so that the app doesn't die ------------ try: print 'Start of App' while True: time.sleep(1) except: #very important call to join here, waits till the wiimote connection is closed and the #wiimote is restored to its initial state wiiObj.join() print 'End of App' Source Files/4.jpg0000755000175000000000000001266711437321174012711 0ustar asimrootJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?EWQ@ KZWMU1jjfQW3ʟJ졀[ZSԩnX,ܸ|oC=: PF?tt6QN5RRk EUK^b݂(((((((((((((((<-F2k|<ǜ-^ӊOƼxd#6%gX|1poc@9K𮏦m6qߙi`RbtB8lAKEjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE%'ěYEm"|k YE4G+*e;¬j|,EWAQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE8Ss|XVSoKyT"=Yڎj+(fe^\'z2`H?JV~ ͻ1JUZ8q>ϵ|xT#џ1 Cw)u)cEx' נ= ޽e;_"y`0#ֺ(fTqkK Q^QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEnjJRzeʷk7Fx\"G5Ock_Mm4q9؃G^FBPuHZ(,(((((((((((((((((((( \WϿ?h{m'ROZ% > _m Z64I'>T~T)tvuQEYEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP |Až.X܂ɹHk+|GyڄmVUgȍhSKn%U `zj|$Q]S]:1s.er*G+Rx KFîvъxhdWRjŽ_+Sc4o+ܧAZU60$_"Eg5h{IH\4= g֔QEwpQEQEQEQEQEQEQEQEQEQEQEQEQM AE6gBCK)~󶫪W\]\J n8Aj?z֭c<|W,z^^3"q.[Q^Aw S4/ ⹘s,ɖB9OǕc;1W.'ׅ}7Ya[9ya!_GWmmax!j2s#v^ aspb kZZElբ+S#m>#0Pkd㏉wcNC/yH޸~h u˟Ip?_Ey} q[+)끚TkV9c=+]uFG(?ƻsi2 ݭ5̃:zuQU#6⤅+RŠ((((((((( ?Ѵ۶F ʀ~U*B2 +i`zS471 V=%d^gA-N$#5Gҹ(ѓ0;-v0e>e4vGH1]MrvGUǁ会(bhJ%M~}A[-vϴRFN# \Ujs4V N=3z :6zmw7@v>τ /ja]ُտ}Ѡ[d|==MY5:-͚(oJ+MK[?wIS,NwNu`?4C }EWqCq H2H,grOzI\%,Mʥh r~󷩭j(TUQEXŠ(((((((((p9!OX|PMs"OnlX%1m!Pqںه:{xwQ&xD\" Ob3Ҽk?g㏋O\1ʚT>^q[[K/-'cyA*A Uz=jqwG˺ x\ֵA[9$8Gm~}?Od?W&+EEuNki 3y12 ؆=??3O}WA$bS((((((((((FJZJa6A<$r+x{?[?}8_|IhH?CWݥŏ /{+u(?R+ZL3(8ߌPx1273+]{ 2n-%}J_=k;pF}*-ZJLiײWD>rQEd~wŻD6f??J]ҲiSmoQsn-.\?g4 +^?#(7Yӵ9!ӯqww/+?*y#=U~FH~zNm#ƚ~TMˉ[XW;_ٟK\'f֯?g[/hNXGգ8|$b~0+s(((((((((|bKi֍.?^ĞuhTL $mÆ2=Ǿ~V|>4;/*?$54 0AXҌ7( |X c[-j4ƣnSӯ&mN&%2_r|bRW:|{EDOfd##o,/gH.cH0Gb+ ѴtP4yO/ZgFpu kԬu8kC V@EpZJ#{1KFH6 _H.&zEZޝG.=ZJ =D7y錻Vo>YYWNQ^ 2q'"5/I@Ӹ2 iM!.Q2+mnfp[O#ub$*|)~#<"[ cy*Vʎӧ~fk3ⷈ%蚇K˫O?kXFy־^Yrӑk81ֽJ)EZQo>YT/=ۓ<u {m-0(Wn ]O˨.@>i0dI@UŮ^ܓʊ'>qXUMN$fw?ysd$o?V} 9x2> mL4wڜ#J r_>u4F-nonkN.08ۖ"_.WUԑqogy8ƾ^s @-,w`9_q]XDΌ$|Ysh柪['_r8/xgY-oִd kWCNAUZouD$AB:)7v6\L"%}rSV)6Z&k {^ >r'7SOZcu:/ݍQ 9Fv<$EU(((((((((+Ï xE\FչrukI4| KN t}f2H'Wm(op)bFr }PEPLIU=p:(('? )qHxn!cWRx'׆|Ҷ1=v4T+|ָQEP(((((((((((((((((((((((((((((Source Files/3.jpg0000755000175000000000000001263211437321174012700 0ustar asimrootJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((( Z:HWEu9-fɏrc__}qX(`緛 ()17Ҽ0_sbh{Uu5?R5[Ac{'tK?}~yFcs_Kix&C}ǵEkq-wRhaa12տޏ2WBvg҂xnȎ.bOY/"jM}gt{X3In嶺BFpj Muȅ՞#H=v6t8da+)agFx:OȊ(#((A>((((((((((((((g|Ag%C1IxŅFcM}%\ߋ/m _Oc+r\3w$& !E ꮌ%ٴ]MM‘tmQN?¾=G?!PqQE{xQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEOY~UEW*?x ʼ>WW]]FQ{{ȖX[3_ 7hdH*pAPo%%蓞} ž\iV|{zJ}K=?&yU0> r)^%?]`sb8O̟^jze>vcV>ǧFj747 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (渿xWg"JϸJ+!Z<ȩN5|h4^ncqʷ:vu Gu=}_D^ZyCsKuW? t,Su%9Ob2= ik-5tW?_J`9Y!ud2_S= Mkڎ.YMgC6Eb1JD}EWQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^Z+H۪u6EӤkIh+aVVFą+s@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((5/%5[==;>(RkޗfRv=QYԗ"t+NgzG}j[G#kf MGA[S-.` ή:QEQEQEQEQEQEQEQEQEQEQEQEQE|EO{k_O3`qt ״պJ0;]%ZT2hJ\mQEjQEQEQEoJ?Q 3 W=࿌&ⷊ%h >#:0:٭r,17ěݔ4H@.k|I2.HH #J!fQ]8QEQEQEQEQEQEQEQEQEU m>缕b:Y>K Ğ{ׇ7~!. %S^~7*9Iymم ( C7+oD_2Gvg1?ߍyφ3]8ikou`Ę2|t95ζ=9:R#9+k9#*Ik~xXoSI}I$C^WGK*>iѱC+}Z"8xTUho[_ _?Ҿg1/;~GܬgU,@OV>w5&[2]Hc$!^~_3LJœExA>jFg*Ky]j+qg)3^MUHo !t8🇦.Ne{=: :+[D¨L*IըԛrзEWw(-lxsºmݴgC˰U$M|pEys[?<^iֶƱă 0Yzγa[Hw1Dž'n}4! tG&<#F,6\!_W;>r++RMEQ+eסÁ{j1PRj7Sc&B]0ԇ)aA4Ir`'Sb\?┹+_:>$mkQkkf@8\woG5klW2zQܚ^L-2mE30}vkF2b=OWSt}N|9cՏrkSRIYQV0Ú3G{νWpk^7~%/<b[D ev:tx7-[ZGZy,Ps@+9_^4&:zh\ƮJQJfnMGWF%}i_%~ȿ??1kZևcŢ+c((((((((+M9哫qk~CF&XG~"ҔՏ4>w)^"K@ 쬌R@C)>>{ןtry{Q>(ԭSsťNS,N9.kjuu5x l̟ք u鬞掯T{|Mk*dM&8v(# j:*  abBx C嫵d۩qY8&fD`8'g]~2|<6jk) 9Ta? Y ka{~!m{8FC_ƾdl>+6]%q\؝Ӆ~ȿ?j?1kZ+EUqы_ZH|bEQEQEQEQEQEQEQEQEPh<⏇J$oeYO*{0m[kC"e=x/qHil\\t>s;~_b)J3l/ok9X)Z+ |+`Tlf[o:) oG:_VfEH;_x7Z8w =I4i,-杮$Տw᱋~T캝4*-:o6xOE[?eS/[j>v nUrGC*hzP@^^Mjy$ׇЗֽŽ?N^NkGҳ-"RML?^Gִ@ JGz3@79sM51ci >W}8aA1KBꐴQEnhQEJV񮝫"&f";\ZZj[7,.+\VucR,|m_[jMh`z۩_p@?{hYAöZ&A|?fM׊Hp~+^"1[,F( +3U8Sl( ( ( ( ( ( ( ( ( ( axE&eajj -Ns%Z17yk2F|3^G< 7wdh:oX?y,SZݨ]P劲6IEY5T1NQEQEQEQEQExtQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Source Files/runDualPointDemo.py0000755000175000000000000001725011443424610015634 0ustar asimroot#----------------------------------------------------------------------------- # module name : runDualPointDemo.py # author : Asim Mittal (c) 2010 # description : The IR Sandbox is used to demonstrate how two points can be individually # tracked in space. The demo uses the concept of "iterative displacement", similar # to the mouse touch pad that is used so commonly. The mouse always moves from its # current position and you can span the entire screen using repetitive or iterative # strokes # # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- from PyQt4.QtCore import * from PyQt4.QtGui import * import sys,wiipoint,wiigrab class IRTracking(QWidget): #--------------------------------------------------------------------------------------------------------- def initWiimote(self,handler): """ Initialize the wiimote and set up the event grabber """ print 'Trying to connect to Wiimote...' try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.wiimote = wiigrab.WiimoteEventGrabber(handler,objTemp=self) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: print "Error connecting to the wiimote. Ensure that it is discoverable and restart the app" self.close() sys.exit(0) #--------------------------------------------------------------------------------------------------------- def initWindow(self): """ setup the main window and its attributes """ self.setGeometry(100,100,500,500) self.setWindowTitle('IR Tracking') self.paint = QPainter() self.setAttribute(Qt.WA_PaintOutsidePaintEvent) #--------------------------------------------------------------------------------------------------------- def initObjects(self): """ setup the characteristics of two dots on the main window """ self.sizeDot = 10 self.posRed = [10,10] self.posBlue = [10,self.width()-10] #--------------------------------------------------------------------------------------------------------- def __init__(self,handler): """ class constructor """ QWidget.__init__(self,None) #base class constructor called self.initWiimote(handler) #setup the wiimote - assign a handler for processing reports self.initWindow() #init the window self.initObjects() #setup the two dots self.connect(self,SIGNAL("moveDot"),self.move) #assign an event binding for the moving either dot #--------------------------------------------------------------------------------------------------------- def paintEvent(self,event): self.draw() #--------------------------------------------------------------------------------------------------------- def erase(self): """ erases the two dots from their current positions """ self.paint.begin(self) self.paint.eraseRect(self.posRed[0],self.posRed[1],self.sizeDot+1,self.sizeDot+1) self.paint.eraseRect(self.posBlue[0],self.posBlue[1],self.sizeDot+1,self.sizeDot+1) self.paint.end() #--------------------------------------------------------------------------------------------------------- def draw(self): """ draw the two dots at their current positions in red and blue colors """ self.paint.begin(self) self.paint.setBrush(Qt.red) self.paint.drawRect(self.posRed[0],self.posRed[1],self.sizeDot,self.sizeDot) self.paint.setBrush(Qt.blue) self.paint.drawRect(self.posBlue[0],self.posBlue[1],self.sizeDot,self.sizeDot) self.paint.end() #--------------------------------------------------------------------------------------------------------- def move(self,dot,x,y): """ displace the specified dot by x and y """ self.erase() #erase the two dots if dot == 0: newPosX = self.posRed[0] - x newPosY = self.posRed[1] - y if (newPosX in range(0,self.width())): self.posRed[0] -= x; if (newPosY in range(0,self.height())): self.posRed[1] -= y elif dot == 1: newPosX = self.posBlue[0] - x newPosY = self.posBlue[1] - y if (newPosX in range(0,self.width())): self.posBlue[0] -= x; if (newPosY in range(0,self.height())): self.posBlue[1] -= y self.draw() #now repaint the dots at their new positions #---------------------------------------------------------------------------- def handleReportDualPointTracking(report,deviceRef,frmRef): """ this is the callback routine that is used for the dual point tracking demo the principle of iterative displacement is used to move the dots about their resting positions. The routine simply computes the displacement of the IR Points between successive calls. This displacement is refactored and the respective dot is displaced by a similar amount """ #this gets the data for the points that are visible rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() multiplier = 1 #this if clause is executed when there are no points visible if countVisible == 0: frmRef.oldCoords[0].nullify() frmRef.oldCoords[1].nullify() #if even one point is visible, the stmts in this clause are executed else: #loop this for all the visible IR points for i in range(0,countVisible): #if the ith point is visible (<>none) and there are upto two points visible (since we have only two dots) if (rptIR[i] <> None) and (countVisible <= 2): #calculate the displacement of the ith point from an earlier reference point. This relative displacement #is stored as a wiipoint object in a variable called point point.calculateDisplacement(frmRef.oldCoords[i],rptIR[i]) #scale that displacement by the multiplier - this can be configured to span larger displays point.scaleBy(multiplier) #the following if clause is very important. If the size value is zero, it indicates that the ith dot #is at rest. Now in that case, you want the dot to move smoothly from rest, instead of jumping across #the screen to some arbitrary location. So in the case that dot was at rest, we skip moving the dot #in this iteration of this function. if frmRef.oldCoords[i].size <> 0: #non zero size value indicates that the dot was already moving frmRef.emit(SIGNAL("moveDot"),i,point.x,point.y) #inform the GUI that the dot needs to be moved #this line is also quite important and it saves the current IR coords as the reference point for the next call of this routine frmRef.oldCoords[i] = rptIR[i] #---------------------------------------------------------------------------- # MAIN ROUTINE #---------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = IRTracking(handleReportDualPointTracking) frm.show() app.exec_() Source Files/2.jpg0000755000175000000000000001077211437321172012700 0ustar asimrootJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((([^tq˜5^|M#8hA-\]ZNIJ!;^la-i$V4Ca~}*avE9lκby6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>fvwr1f)w F%R;uȫ㱸Wӡ){)XɹM-{^t\l{?<+ھ*{Z壌Y^22ZZ3Vd%t{-s[vW!\>!Kto+C1ZTUװW5⏈AZ6䉷LánW9nMXDxժ:a^np.(I_$Z>IW +|QTQE}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@2р{QE~}sێ[7Kq3KCXc_O]W_qw_@FaTa@zf8ԩ;puSYlp2|1Gv$ GQ َdg^jakp*>ކ\NUFpW MuY9Izҹ0$ob5'KH "+pGQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|EWM;Ė2DcC(=|]߅<}.Z$ JC^Wө;xOܑA{uHRO`+zŸI;DG?\cq$6#I 9P]WN GvsW%29oo Or?6ףNoE.\{ՑtQE}fEPEPEPEPEPEPEPEPEPEPEPEPEPEP̴QE~||{O"MӅȼƫA4qg&}2k}. >+kT cG/m$uaջ>_Xim :5^loʻz~ I;F"3VӮKyMRsEsѭ*槹:;뿉-,V<:#Q\؉o6[U{iYTҜ.L~O:+?Vg=mz<`GtauK'~#~]khfX{JGVONSXGw> D>!9+#ڽg K䖒=*WG:z(S((((((((((((Ϗ+V l-a /~:j+ ԫʓOG4,4%d.}k(&\&YUwQEQEV߇<1kMpO=WmlGeWXYcia"mUznb[upWA/E÷3c(iBr9I{YF{Rj>imxCV սSG`|W|ScNǘGG^K_7,k_3˫BgKxC)_V%Y'H+?i.˚)QZQEQEQEQEQEQEQEQEQEQE|EWQ@Q@Q@Q@.i7n^־zΨtmnѰwSpXɪEêgp=Q^d!$gp_=N]Nאrx&[9eV:JSIt={<hO4?]men?B?z([J4y(/GIZ EWAQEQEQEQEQEQEQEQEQEQE-Q_8QEQEQE%5wpB3,Gqׅ4[T pG3 >ނX۶úCO} t~u|d{Xj r)H}j2ٖ-ߍu=?·`N_3Jjaѭ$2 3Cs]Yİbdm[yI7~ҊfqN+^CC̸!UK]IbAթvuÀ( ( ( ( ( ( ( ( ( ( ( (>e+((t1I<H 2I+jpyVC-\iNK"!ĺtҕ%n # 0Jagv֨jVW` OoTah6 ( ( ( ( ( ( ( ( ( ( (>e+((B=o8xg9T!W|z=X aEu]R 0; G=+4hs~'C t_[+}j+`);c5J'Ex|r8$p-᛿\b8ӥNU%v8AxoBׯce#^i6/$'Ӵm*G[k( {'0+8޲=>RW{+:B((((((((((((h(((V^>E !~z g"r *G5ۅĿwnE,+l`H-cXAUA⾣ s֥F4ElQEQEQEQEQEQEQEQEQEQEQEQEQESource Files/1.jpg0000755000175000000000000000743011437321166012677 0ustar asimrootJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Փ-nBkDyϠ4UoQӭU^Wo7wh柾OkZw^6#Szɯ泪)hʭr#(((((((((((((((((*9Hbi%`Ǡ7`(kKyxEV= oP{D_AZ3 ԋ)"D)s\|eu~'{Gʶ/_y6$+̳}Av $^-=D摺Vs*2'gl# G]EWQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE⯈A55_ SMv24?Ǡi.n$w-,Y&L죻V\Q_2yF![鑰ʛ$}kAҾtnatr9s_;ꗯj7rg/A^.s䤠XڜU+$((j(O ( ( ( ( ( ( ( ( ( ([~t_]q*&x/$gD?12q&3:mIbI$rIIE6|$F^sf??k}^O7,?ў ޘQEzXQE|P>!S.\D>O?Zj/^ݽ?-[iW_!hxT~BE朡EPEPTQE~}QEQEQEQEQEQEQEQEQEQE?3:wASJ?[Xy2*+ţ(l|caㆽWxO/czGWd yp~EH t,ʉ2,nɓ*o7n ) Yt9?ykMnO4QE@((0((((((((((#Y`tn:zgFb e(((((((((((6~G."^?¸"m6&{+(QEQE}5EW'хQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ \ŭ+:d7^ٰ8뿪ZMm0Q5ωRp}LEA \լd59.W>ET\%fx-r3? jUЬe1sZ_<֛#raӫ0uhA0^c!M-@drS)G9DczL(0Š(((0((((((((((((̾-h-^q^c_H}g5)Tc_?kdFqe7&30~;?򱴭.u_M?u<Wv%)4L92gN9ֿٛ4yɱ~KVaET((j(O ( ( ( ( ( ( ( ( ( ( ( (>Eݲfvԇkэh:rD骑g{Dԥ5H/`7?t9~/S P8>qa<-^W<9Tgn;MPٷE*SV>xcL|[Nߺc?ν|s_[,M5%S٣UU2-XSԸ+̫ J-Bk[U|shw?+vek0~l3J]JQExQEQESource Files/runPaddleWar.py0000755000175000000000000004053511434713736015007 0ustar asimroot#----------------------------------------------------------------------------- # module name : runPaintFire.py # author : Asim Mittal (c) 2010 # description : Imitation of the Paddle war / Air hockey game. Allows smooth # and simultaneous control by two players # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys,wiigrab,wiipoint,math class PaddleWar(QWidget): #--------------------------------------------------------------------------- def initWiimote(self): """ initialize the wii remote here """ try: print 'Press buttons 1 & 2 together...' self.oldCoordsIR = [wiipoint.IRPoint(),wiipoint.IRPoint()] #this member tracks the reference coords of the IR points self.wiimote = wiigrab.WiimoteEventGrabber(self.handleWiimoteReport,0.05,self) #create the wiimote object and set the callback self.wiimote.setReportType() #set the report type to default (send all reports) self.wiimote.led = 15 #let all the wiimote LEDs be on self.wiimote.start() #start the wiimote object thread except: #the wiimote could not be found, or that port is blocked/closed QMessageBox.critical(self,'Connectivity Error','The application could not find any Wiimotes. Please ensure your device is discoverable and restart the application') #self.close() #sys.exit(0) #--------------------------------------------------------------------------- def closeEvent(self,event): """ event is called when the application closes down """ print 'Waiting for Wiimote to disconnect...' try: #this routine ensures that the pipe between the app and the wiimote is #properly disconnected self.wiimote.join() print 'Wiimote disconnected!' except: print 'Wiimote object could not be located!' pass print 'Closing App...' #--------------------------------------------------------------------------- def initWindow(self,xOrigin,yOrigin,width,height): """ initialize the main window and create the painter object """ self.setGeometry(xOrigin,yOrigin,xOrigin+width,yOrigin+height) #set the window geometry self.setWindowTitle('Paddle War') #set the window title self.setAttribute(Qt.WA_PaintOutsidePaintEvent,True) #this attribute is very impt. allows us to paint without using paintEvent self.paint = QPainter() #create the painter object #--------------------------------------------------------------------------- def initGameObjects(self): """ initialize the various parameters needed for the gameplay """ self.sizeDot = (10,100) #the size of the red/blue dots self.sizeBox = 20 #size of the object box self.posRed = [50,(self.height()/2 - self.sizeDot[1]/2)] #this is the starting position of the red dot self.posBlue= [self.width()-50, (self.height()/2 - self.sizeDot[1]/2)] #this is the starting position of the blue dot self.posBox = [self.width()/2, self.height()/2] #this is the starting position of the object box speed = 10 #the speed at which the object box moves (in pixels) self.boxSpeedX = speed #set uniform speed along both x and y directions self.boxSpeedY = speed self.boxColor = Qt.darkMagenta #set the color of the object box self.scoreRed = 0 self.scoreBlue = 0 #--------------------------------------------------------------------------- def __init__(self,xOrigin,yOrigin,width,height,parent=None): """ Class constructor - this is where the app begins """ QWidget.__init__(self,parent) self.initWiimote() self.initWindow(xOrigin,yOrigin,width,height) self.initGameObjects() #this is the application timer, that is called every 40 milliseconds. The game engine runs through this timer self.timer = QTimer() self.prepTimer = QTimer() #the prep timer gives the players time to make adjustments self.startFlag = False #a few event bindings self.connect(self.timer,SIGNAL("timeout()"),self.timeOut) self.connect(self,SIGNAL("draw"),self.draw) #this redraws the red/blue squares and the line between them self.connect(self,SIGNAL("moveRed"),self.moveRed) #this repositions the coords of the red dot self.connect(self,SIGNAL("moveBlue"),self.moveBlue) #this repositions the coords of the blue dot #start the game by starting the prep package self.timer.start(40) self.prepTimer.singleShot(6000,self.startGame) #--------------------------------------------------------------------------- def startGame(self): """ this routine sets the start game flag indicating that the game is about to begin """ self.startFlag = True #--------------------------------------------------------------------------- def timeOut(self): """ this is called by the application timer. It is the game's core logic. There are three major tasks to take care of when designing this routine. Animation of the objects (erasing the screen and repainting it), collision detection of the ball with boundaries of the window, and finally collision detection of the ball with paddles. """ if self.startFlag == True: self.eraseBox(self.posBox[0],self.posBox[1]) #start by erasing the object box off the screen offset = 5 #this offset is used to create an invisible boundary near the edges of the window #the scoring is done by touching the opponents boundary, so every collision against the #right or left edge of the window leads to a score by either player. if (self.posBox[0] >= (self.width() - offset)): self.boxSpeedX *=-1;self.scoreRed += 1 #red scores - ball reached right edge if (self.posBox[0] <= (offset)): self.boxSpeedX *= -1; self.scoreBlue +=1 #blue scores - ball reached left edge #the top and bottom edges of the window only cause the object to bounce about - so that is how it is done if (self.posBox[1] >= (self.height()- offset)) or (self.posBox[1] <= (offset)): self.boxSpeedY *= -1 #now collision detection against the paddles is very important. The red paddle is on the left and the blue #paddle is on the right side of the window. Therefore, the right edge of the red and the left edge of the #blue will be the two paddle faces, or contact areas. so getting the edges of each paddle face is the first step height = self.sizeDot[1] #height and width of each paddle width = self.sizeDot[0] #now we get the x coords of the Red paddle's face. Since the paddles are vertically aligned the #x coords remain same along the paddle face. the paddle moves only along the Y coords - and that means #there is a range of values it can take along the Y axis. this range is nothing but the points along #its height xEdgeRed = self.posRed[0] + width validYRangeRed = range(self.posRed[1],self.posRed[1]+height) #similarly we get the x coords for the blue paddle's face and its corresponding range of values #along the Y axis xEdgeBlue = self.posBlue[0] validYRangeBlue= range(self.posBlue[1],self.posBlue[1]+height) #now to detect a collision, all we do is simply check if any of the points lying on the object (ball) #coincide with the paddle faces (red/blue) collision = False for x in range(self.posBox[0],self.posBox[0]+self.sizeBox): #scan through all the x coords for the object box for y in range(self.posBox[1],self.posBox[1]+self.sizeBox): #scan through all the y coords for the object box if (x == xEdgeRed) and (y in validYRangeRed): self.boxSpeedX *=-1;collision = True;break #collision with red paddle face if (x == xEdgeBlue) and (y in validYRangeBlue): self.boxSpeedX *=-1;collisoin = True;break #collision with blue paddle face #this if clause prevents further computations to be made in case the collision was detected if collision == True: break #now all the math is done, its time to move the object box (ball) to its new location self.posBox[0] += self.boxSpeedX self.posBox[1] += self.boxSpeedY #all this while the screen was cleared, now repaint the screen with the same objects #only with different positions - thereby creating the "animation" self.draw() #--------------------------------------------------------------------------- def moveRed(self,delY): """ alter the position of the red square """ newYPos = self.posRed[1] - delY if newYPos < self.height() and newYPos > 0: #check if the movement puts the paddle outside window boundary self.posRed[1] -= delY #if not, then move the paddle, else do nothing (keeps the paddle locked) #--------------------------------------------------------------------------- def moveBlue(self,delY): """ alter the position of the blue square """ newYPos = self.posBlue[1] - delY if newYPos < self.height() and newYPos > 0: #check if the movement puts the paddle outside window boundary self.posBlue[1] -= delY #if not,only then move the paddle, else do nothing #--------------------------------------------------------------------------- def eraseDrawing(self): """ Erase the drawing. The form is repainted and the graphics are wiped clean. This is important as it creates the illusion of "animation" or "movement" """ self.paint.begin(self) self.paint.eraseRect(0,0,self.width(),self.height()) self.paint.end() #--------------------------------------------------------------------------- def drawBox(self,x,y): """ this routine draws the object box (ball/puck) on the screen based on x,y coords """ self.paint.begin(self) self.paint.setBrush(self.boxColor) self.paint.drawRect(x,y,self.sizeBox,self.sizeBox) self.paint.end() #--------------------------------------------------------------------------- def eraseBox(self,x,y): """ erases the object box (ball/puck) from the last known location """ offset = 1 self.paint.begin(self) self.paint.eraseRect(x,y,self.sizeBox+offset,self.sizeBox+offset) self.paint.end() #--------------------------------------------------------------------------- def drawRedDot(self,x,y): """ draws the red paddle at the specified x,y coords """ self.paint.begin(self) self.paint.setBrush(Qt.red) self.paint.drawRect(x,y,self.sizeDot[0],self.sizeDot[1]) self.paint.end() #--------------------------------------------------------------------------- def drawBlueDot(self,x,y): """ draws the blue paddle at the specified x,y coords """ self.paint.begin(self) self.paint.setBrush(Qt.blue) self.paint.drawRect(x,y,self.sizeDot[0],self.sizeDot[1]) self.paint.end() #--------------------------------------------------------------------------- def draw(self): """ draws all the game objects on the screen - paddles and object box and score """ self.eraseDrawing() self.drawRedDot(self.posRed[0],self.posRed[1]) self.drawBlueDot(self.posBlue[0],self.posBlue[1]) self.drawBox(self.posBox[0],self.posBox[1]) self.setWindowTitle("RED:%s\tBLUE:%s"%(self.scoreRed,self.scoreBlue)) #--------------------------------------------------------------------------- def keyPressEvent(self,event): """ allows the keyboard events to control paddles. Blue (up/down) Red (W/S) keys""" increment = 10 delYRed = 0; delYBlue = 0 #check for movement on the keys for blue paddle if event.key() == Qt.Key_Up: delYBlue -= increment elif event.key() == Qt.Key_Down: delYBlue += increment #check for movement on the keys for red paddle if event.key() == Qt.Key_W: delYRed -= increment elif event.key() == Qt.Key_S: delYRed += increment self.emit(SIGNAL("moveRed"),-delYRed) self.emit(SIGNAL("moveBlue"),-delYBlue) #--------------------------------------------------------------------------- def paintEvent(self,event): """ called initially to paint the screen """ self.draw() #--------------------------------------------------------------------------- def handleWiimoteReport(self,report,wiiref,tmp): """ handles the events from the wii remote """ rptIR,countVisible = wiigrab.getVisibleIRPoints(report) signals = [SIGNAL("moveBlue"),SIGNAL("moveRed")] scale = 2 #if the maximum number of dots visible are 2, do the following if (countVisible > 0) and (countVisible < 3): #for each visible dot, perform the following operations for i in range(0,countVisible): #if the dot has some coordinate info if rptIR[i] <> None: oldCoord = self.oldCoordsIR[i] #save the old coordinate reference for this point curCoord = rptIR[i] #save the current coordinate for this point if oldCoord.size <> 0: #if this dot is not moving from rest position delX = curCoord.x - oldCoord.x #then compute displacement along the x and y directions delY = curCoord.y - oldCoord.y #displacement = current coords - old coords self.emit(signals[i],delY*scale) #tell the associated dot to move/displace by the same amount #scaling is used so that a small movement of the IR point can effectively lead to a larger movement on screen self.oldCoordsIR[i] = curCoord #save the current coords as the reference for the next comparison elif countVisible == 0: #cannot see anymore IR points, rest the dots self.oldCoordsIR[0].size = 0 self.oldCoordsIR[1].size = 0 #--------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = PaddleWar(100,100,800,300) frm.show() app.exec_()Source Files/runMouseMover.py0000755000175000000000000000520111447211052015220 0ustar asimrootfrom PyQt4.QtCore import * from PyQt4.QtGui import * import sys,wiipoint,wiigrab,os,math import xauto class MouseMover(QWidget): #------------------------------------------------------------------- def initWiimote(self,handler): """ Initialize the wiimote and set up the event grabber """ print 'Trying to connect to Wiimote. Press 1 & 2 together...' self.oldIRCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.gestureOn = False self.capture = [] try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.wiimote = wiigrab.WiimoteEventGrabber(handler) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: print "Error connecting to the wiimote. Ensure that it is discoverable and restart the app" self.close() sys.exit(0) #-------------------------------------------------------------------- def __init__(self): QWidget.__init__(self,None) self.initWiimote(self.handler) self.trayIcon = QSystemTrayIcon(QIcon(os.getcwd()+os.sep+"trayicon.png"),self) self.trayIcon.show() self.hide() self.connect(self.trayIcon,SIGNAL("activated(QSystemTrayIcon::ActivationReason)"),self.closeForm) self.connect(self,SIGNAL("moveCursor"),self.moveCursor) print QCursor.pos() #-------------------------------------------------------------------- def moveCursor(self,x,y): curPos = QCursor.pos().x(),QCursor.pos().y() newPos = curPos[0]-x,curPos[1]-y QCursor.setPos(newPos[0],newPos[1]) #-------------------------------------------------------------------- def closeForm(self,reason): if reason == QSystemTrayIcon.Trigger: sys.exit(0) #-------------------------------------------------------------------- def closeEvent(self,event): try: self.wiimote.join() print 'Wiimote disconnected' except: print 'Wiimote object couldnt be found!' #------------------------------------------------------------------------------------------------- def handler(self,report,wiiref,tmp): rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() multiplier = 2 if countVisible == 0: self.oldIRCoords[0].nullify() else: point.calculateDisplacement(self.oldIRCoords[0],rptIR[0]) point.scaleBy(multiplier) if self.oldIRCoords[0].size <> 0:self.emit(SIGNAL("moveCursor"),point.x,point.y) self.oldIRCoords[0] = rptIR[0] if countVisible == 2: xauto.mouseDown(1) elif countVisible == 1: xauto.mouseUp(1) #------------------------------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = MouseMover() app.exec_() Source Files/puzzleui.ui0000755000175000000000000003205411437445666014277 0ustar asimroot Form 0 0 640 480 640 480 640 480 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 EkTitli Puzzle 160 90 151 121 false 1.jpg true 330 220 151 121 2.jpg true 330 90 151 121 3.jpg true 160 220 151 121 4.jpg true 260 380 141 51 Gothic Uralic 24 ektitli.org 20 20 5 5 cursor1.gif 610 20 5 5 cursor2.gif Source Files/cursor2.gif0000755000175000000000000000023711437432344014122 0ustar asimrootGIF89a U$$U$$IIUIImmUmmUUU۪!Created with GIMP, &dihl0;Source Files/cursor1.gif0000755000175000000000000000147111437432146014122 0ustar asimrootGIF87a U$$U$$IIUIImmUmmUUU۪U$$U$$$$$$U$$$$$I$IU$I$I$m$mU$m$m$$U$$$$U$$$$U$۪$$$U$$IIUIII$I$UI$I$IIIIUIIIIImImUImImIIUIIIIUIIIIUI۪IIIUIImmUmmm$m$Um$m$mImIUmImImmmmUmmmmmmUmmmmUmmmmUm۪mmmUmmU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmےےUےے۶۶U۶۶U۪UU$$U$$IIUIImmUmmUUU۪U!, @9H*\ȰÇ;Source Files/simpleButtons.py0000755000175000000000000000455111440452034015251 0ustar asimroot#----------------------------------------------------------------------------- # module name : simpleButtons.py # author : Asim Mittal (c) 2010 # description : Demonstrates the use of buttons for the wii # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import wiigrab, sys, time, traceback def eventHandlerButtons(report,wiiObj,tempRef): #get the button value (sum of key presses) from the report buttonValue = report['buttons'] #resolve this combined value using the wiigrab's resolver routine lstResolvedValues = wiigrab.resolveButtons(buttonValue) if len(lstResolvedValues) > 2: wiiObj.rumble = 1 else: wiiObj.rumble = 0 #get the nomenclature for every button lstNames = [] for eachButtonVal in lstResolvedValues: lstNames.append(wiigrab.getNameOfButton(eachButtonVal)) #print the names if lstNames <> []: print lstNames,lstResolvedValues #------------------------------------ MAIN ------------------------------------------ if __name__ == "__main__": #------------------ Create Object, Connect and Configure ------------------- try: print "Press the buttons 1 & 2 together..." wiiObj = wiigrab.WiimoteEventGrabber(eventHandlerButtons) wiiObj.setReportType() wiiObj.led = 15 except: #print traceback.print_exc() print "Wii remote not found. Please check that the device is discoverable" sys.exit(0) #---- Start the Wiimote as a thread with reports fed to assigned callback---- wiiObj.start() #----------------- Run the Main loop so that the app doesn't die ------------ try: print 'Start of App' while True: time.sleep(1) except: #very important call to join here, waits till the wiimote connection is closed and the #wiimote is restored to its initial state wiiObj.join() print 'End of App' Source Files/runPaintfire.py0000755000175000000000000000570711432522314015053 0ustar asimroot#----------------------------------------------------------------------------- # module name : runPaintFire.py # author : Asim Mittal (c) 2010 # description : Demonstrates the integration of xAutomation and IR Tracking # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- from PyQt4.QtCore import * from PyQt4.QtGui import * import sys,wiipoint,os, math,wiigrab,time,pygame #------------------------------------------------------------------------ buttonLeft = 1 buttonRight = 2 isMouseDown = False cmdStartFire = "xte \'keydown Control_L\' \'keydown Alt_L\' \'key f\' \'keyup Control_L\' \'keyup Alt_L\'" cmdClearFire = "xte \'keydown Control_L\' \'keydown Alt_L\' \'key c\' \'keyup Alt_L\' \'keyup Control_L\'" cmdStopFire = "xte \'keyup Control_L\' \'keyup Alt_L\'" cmdMouseMove = "xte \'mousemove %s %s\'" isOnFire = False #------------------------------------------------------------------------ def moveCursor(x,y): toSend = (cmdMouseMove%(int(x),int(y))) os.system(toSend) #------------------------------------------------------------------------ def handleFirePainter(report,deviceRef,frmRef): global buttonLeft,buttonRight #find out the coords of the IR points which are visible rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() currentCursorCoords = wiipoint.IRPoint(0,0,5) multiplier = 1 currentIRCoordsPt1 = rptIR[0] currentIRCoordsPt2 = rptIR[1] #if the first IR point is visible if currentIRCoordsPt1 <> None: #start the fire os.system(cmdStartFire) moveCursor(1024-currentIRCoordsPt1.x,768-currentIRCoordsPt1.y) else: os.system(cmdStopFire) os.system(cmdClearFire) #---------------------------------------------------------------------------- if __name__ == '__main__': try: wiiobject = wiigrab.WiimoteEventGrabber(handleFirePainter) wiiobject.setReportType() wiiobject.led = 15 except: print 'Could not find any wii remotes. Please ensure that the wiimote is discoverable and try again' sys.exit(0) wiiobject.start() try: print 'Application started' while True: time.sleep(1) except: wiiobject.join() print 'End of application' Source Files/wiipoint.py0000755000175000000000000000516211432272102014237 0ustar asimroot#----------------------------------------------------------------------------- # module name : wiipoint.py # author : Asim Mittal (c) 2010 # description : This module defines IRPoint class, that contains routines pertinent # to IR points and their abstraction # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import math class IllegalPointAssignment:pass countMaxIRPoints = 4 class IRPoint: def __init__(self,x=0,y=0,size=0): """ class constructor --> creates an object with three basic params: x,y,size """ self.x = x self.y = y self.size = size def __str__(self): return "X:%s, Y:%s, Size:%s"%(self.x,self.y,self.size) def magnitude(self): """ using pythagoras theorem to get the distance of the point form an arbitary origin """ return math.sqrt(math.pow(self.x,2)+math.pow(self.y,2)) def calculateDisplacement(self,pointA,pointB): """ calculates the displacement from ptB to ptA and stores it in self """ self.x = pointB.x - pointA.x self.y = pointB.y - pointA.y self.size = pointB.size - pointA.size def getPointFromReportEntry(self, dctEntry): """ dctEntry is a dictionary entry of the type : {'pos': (x,y),'size': sizeValue} this routine simply extracts the position values for the IR point represented by the dictionary dctEntry """ try: self.x = dctEntry['pos'][0] self.y = dctEntry['pos'][1] self.size = dctEntry['size'] except: raise IllegalPointAssignment def nullify(self): """ make all members (x,y,size) zero """ self.x = 0 self.y = 0 self.size = 0 def scaleBy(self,scalingFactor): """ multiply all members of the IR point by scalingFactor """ self.x *= scalingFactor self.y *= scalingFactor self.size *= scalingFactorSource Files/runVirtualObject.py0000755000175000000000000000551211443437060015706 0ustar asimrootfrom PyQt4.QtGui import * from PyQt4.QtCore import * import sys,wiigrab,wiipoint,math class VirtualObject(QWidget): def initWiimote(self): print 'Trying to connect to the wiimote, press 1 & 2 together...' try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.wiimote = wiigrab.WiimoteEventGrabber(self.handleWiimoteReport) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: QMessageBox.critical(self,'Connectivity Error','The application could not find any wiimotes, please ensure that the remote is discoverable and restart the application') self.close() sys.exit(0) def initWindow(self,xOrigin,yOrigin,width,height): self.setWindowTitle('Virtual Objects') self.setGeometry(xOrigin,yOrigin,width,height) self.setAttribute(Qt.WA_PaintOutsidePaintEvent) self.paint = QPainter() def initObject(self): self.sizeRed = [10,10] self.posRed = [30,30] self.boxColor = Qt.red self.angle = 0 def __init__(self,parent=None): QWidget.__init__(self,parent) self.initWiimote() self.initWindow(100,100,500,500) self.initObject() self.timer = QTimer() self.connect(self,SIGNAL("resize"),self.stretchDot) self.connect(self,SIGNAL("move"),self.moveDot) self.connect(self.timer,SIGNAL("timeout()"),self.timeout) self.timer.start(20) def timeout(self): self.erase();self.draw() def paintEvent(self,event): self.draw() def closeEvent(self,event): print 'Waiting for wiimote to disconnect...' try: self.wiimote.join() print 'Wiimote has disconnected successfully!' except: print 'Wiimote object could not be properly terminated!' print 'Closing app...' def moveDot(self,delX,delY): #self.erase() self.posRed[0] -= delX self.posRed[1] -= delY #self.draw() def stretchDot(self,delW,delH): #self.erase() self.sizeRed[0] -= delW self.sizeRed[1] -= delH #self.draw() def erase(self): self.paint.begin(self) self.paint.eraseRect(0,0,self.width(),self.height()) self.paint.end() def draw(self): self.paint.begin(self) self.paint.setBrush(self.boxColor) self.paint.rotate(self.angle) self.paint.drawRect(self.posRed[0],self.posRed[1],self.sizeRed[0],self.sizeRed[1]) self.paint.end() def handleWiimoteReport(self,report,wiiref,tmp): rptIR,countVisible = wiigrab.getVisibleIRPoints(report) curIR1 = rptIR[0] curIR2 = rptIR[1] delX = 0 delY = 0 if countVisible <> 0 : if self.oldCoords[0].size <> 0 : delX = curIR1.x - self.oldCoords[0].x delY = curIR1.y - self.oldCoords[0].y self.oldCoords[0] = curIR1 if curIR2 <> None: self.emit(SIGNAL("resize"),delX,delY) else: self.emit(SIGNAL("move"),delX,delY) else: self.oldCoords[0].size = 0 if __name__ == '__main__': app = QApplication(sys.argv) frm = VirtualObject() frm.show() app.exec_() Source Files/runBounce.py0000755000175000000000000004524511434721332014351 0ustar asimrootimport sys,math,wiigrab,wiipoint,random from PyQt4.QtGui import * from PyQt4.QtCore import * class Bounce(QWidget): def initWiimote(self): """ initialize the wii remote here """ try: print 'Press buttons 1 & 2 together...' self.oldCoordsIR = [wiipoint.IRPoint(),wiipoint.IRPoint()] #this member tracks the reference coords of the IR points self.wiimote = wiigrab.WiimoteEventGrabber(self.handleWiimoteReport,0.05,self) #create the wiimote object and set the callback self.wiimote.setReportType() #set the report type to default (send all reports) self.wiimote.led = 15 #let all the wiimote LEDs be on self.wiimote.start() #start the wiimote object thread except: #the wiimote could not be found, or that port is blocked/closed QMessageBox.critical(self,'Connectivity Error','The application could not find any Wiimotes. Please ensure your device is discoverable and restart the application') #self.close() #sys.exit(0) #--------------------------------------------------------------------------- def closeEvent(self,event): print 'Waiting for Wiimote to disconnect' try: self.wiimote.join() 'Wiimote disconnected successfully!!' except: print 'Wiimote object could not be located' print 'Closing App...' #--------------------------------------------------------------------------- def initWindow(self,xOrigin,yOrigin,width,height): """ initialize the main window and create the painter object """ self.setGeometry(xOrigin,yOrigin,xOrigin+width,yOrigin+height) #set the window geometry self.setWindowTitle('Bounce') #set the window title self.setAttribute(Qt.WA_PaintOutsidePaintEvent,True) #this attribute is very impt. allows us to paint without using paintEvent self.paint = QPainter() #create the painter object #--------------------------------------------------------------------------- def initGameObjects(self): """ initialize the various parameters needed for the gameplay """ self.sizeDot = 10 #the size of the red/blue dots self.sizeBox = 30 #size of the object box self.posRed = [10,self.height()- 40] #this is the starting position of the red dot self.posBlue= [self.width()-20, self.height()-40] #this is the starting position of the blue dot self.posBox = [50,30] #this is the starting position of the object box speed = 5 #the speed at which the object box moves (in pixels) self.boxSpeedX = speed #set uniform speed along both x and y directions self.boxSpeedY = speed self.boxColor = Qt.darkMagenta #set the color of the object box #--------------------------------------------------------------------------- def __init__(self,xOrigin,yOrigin,width,height,parent=None): QWidget.__init__(self,parent) self.initWiimote() self.initWindow(xOrigin,yOrigin,width,height) self.initGameObjects() #this is the application timer, that is called every 40 milliseconds. The game engine runs through this timer self.timer = QTimer() #a few event bindings self.connect(self.timer,SIGNAL("timeout()"),self.timeOut) self.connect(self,SIGNAL("draw"),self.draw) #this redraws the red/blue squares and the line between them self.connect(self,SIGNAL("moveRed"),self.moveRed) #this repositions the coords of the red dot self.connect(self,SIGNAL("moveBlue"),self.moveBlue) #this repositions the coords of the blue dot #start the game self.timer.start(40) #--------------------------------------------------------------------------- def timeOut(self): """ time out routine for the application's timer. Also the core logic of the gameplay this is where the animation and collision detection occurs """ self.eraseBox(self.posBox[0],self.posBox[1]) #start by erasing the object box off the screen offset = 20 #this offset is used to create an invisible boundary near the edges of the window #get the slope and intercept for the line joining the two dots (red and blue). This info is used to create the equation #of this line and determine whether the box has collided with it slope,intercept = self.getSlopeAndIntercept(self.posBlue[0],self.posBlue[1],self.posRed[0],self.posRed[1]) #the following construct is used to determine which dot is at a greater distance from the origin (top left) xMax = max(self.posBlue[0],self.posRed[0]) #xMax will store the xCoords of the dot which is further away xMin = min(self.posBlue[0],self.posRed[0]) #xMin will store the xCoords of the dot which is closer to the origin yMax = max(self.posBlue[1],self.posRed[1]) #yMax will store the yCoords of the dot which is further away yMin = min(self.posBlue[1],self.posRed[1]) #yMin will store the yCoords of the dot which is closer to the origin #the slope and intercept can help us find out what is the equation of the line, but the actual line (visible) on the screen #is only those set of values that lie between the red and blue dots. so the quickest way to get all the points that lie on #the line (and in between the red/blue dots) is simply look in between the max and min values we've just gotten #xMax,yMax --> represent the dot that is closer to the origin, and xMin,yMin represent the dot that is nearer xValidRange = range(xMin,xMax) # this is all the x values that lie on the line (in between the dots) yValidRange = range(yMin,yMax) # this is all the y values that lie on the line (in between the dots) #Now the box is intended to bounce of the edges of the window, the following clauses check for exactly that. The offset #value allows us to pad the window boundaries with a little space creating an invisible barrier off of which the box shall #bounce. So now the box will not touch the window edge exactly, but will bounce off slightly before it if (self.posBox[0] >= (self.width() - offset)) or (self.posBox[0] <= (offset)): self.boxSpeedX *= -1 # right edge and left edge respectively if (self.posBox[1] >= (self.height()- offset)) or (self.posBox[1] <= (offset)): self.boxSpeedY *= -1 # bottom and top edges respectively #following loop checks for collisions of the box with the line drawn between the red/blue dots collision = False #collision detected flag #we basically scan all the points in the object box and check if any of the points lie on the line #if they do, we have a collision. The box lies between (posBox[0],posBox[1]) and (posBox[0]+size,posBox[1]+size) for x in range(self.posBox[0],self.posBox[0]+self.sizeBox): #scan through all the x coords for the box for y in range(self.posBox[1],self.posBox[1]+self.sizeBox): #scan through all the y coords for the box #using the equation "y = mx + c" where m --> slope and c --> intercept, we can verify whether the point #represented by (x,y) actually lies on the line or not. so we basically use 'x' to calculate y and check #if that calculated value is the same as the y value given by (x,y) calcY = int((slope*x) + intercept) if (y == calcY): #on the line... but is it really in the part of the line between the red and blue squares #this is where our valid range of X coords come in handy. if the current point (x,y) lies on #the part of the line between red and blue dots the x coord must be in the range of values #calculated earlier on if x in xValidRange: #x,y is in fact the point of contact between the line and the box xPtContact = x; yPtContact = y xCenterBox,yCenterBox = self.getCenterOfBox() collision = True #now that we've detected a collision, its time to create the bouncing effect, by changing #the direction of motion. For this game, i'm only interested in changing the motion when #the line is horizontal and is either above/below the box. So if the box was coming towards #the line from the top (line is at bottom) and was moving towards the right, then I'd want #it to continue moving rightward only in the opposite direction vertically ie. it was coming #from the top, touched the line, and starts going back towards the top --> so the speed in the #Y direction is simply inverted if (yCenterBox < yPtContact) or (yCenterBox > yPtContact): self.boxSpeedY *= -1 self.toggleBoxColor() #also, make the box change color for every collision #we're done here, break out of innermost loop break #did a collision occur?? if so, then break out of this loop if collision == True: break #after all that math, we now know exactly which direction the box would be moving in, this info #is given by the sign (+ or -) of the speed in x or y directions. Simply recompute the new position #of the box based on this speed (speed is nothing but how much the box is moved in X or Y in pixels) self.posBox[0] += self.boxSpeedX self.posBox[1] += self.boxSpeedY #the new position is stored in the variables, now repaint the window self.draw() #--------------------------------------------------------------------------- def toggleBoxColor(self): """ this randomly changes the color of the box... like a power up or something !""" colorRange = [Qt.black,Qt.green,Qt.darkBlue,Qt.darkMagenta,Qt.cyan,Qt.magenta] #all the colors that we like colorRange.remove(self.boxColor) #remove the current color of the box from the selection process colorIndex = random.randint(0,len(colorRange)-1) #randomly choose some other color self.boxColor = colorRange[colorIndex] #set the color to the box #--------------------------------------------------------------------------- def paintEvent(self,event): """ the paintEvent is called at the beginning and paints only the two dots on the form """ self.draw() #--------------------------------------------------------------------------- def moveRed(self,delX,delY): """ alter the position of the red square """ self.posRed[0] -= delX self.posRed[1] -= delY #--------------------------------------------------------------------------- def moveBlue(self,delX,delY): """ alter the position of the blue square """ self.posBlue[0] -= delX self.posBlue[1] -= delY #--------------------------------------------------------------------------- def eraseDrawing(self): """ Erase the drawing. The form is repainted and the graphics are wiped clean. This is important as it creates the illusion of "animation" or "movement" """ self.paint.begin(self) self.paint.eraseRect(0,0,self.width(),self.height()) self.paint.end() #--------------------------------------------------------------------------- def drawBox(self,x,y): self.paint.begin(self) self.paint.setBrush(self.boxColor) self.paint.drawRect(x,y,self.sizeBox,self.sizeBox) self.paint.end() #--------------------------------------------------------------------------- def eraseBox(self,x,y): offset = 1 self.paint.begin(self) self.paint.eraseRect(x,y,self.sizeBox+offset,self.sizeBox+offset) self.paint.end() #--------------------------------------------------------------------------- def drawRedDot(self,x,y): """ draws the red dot at the specified x,y coords """ self.paint.begin(self) self.paint.setBrush(Qt.red) self.paint.drawRect(x,y,self.sizeDot,self.sizeDot) self.paint.end() #--------------------------------------------------------------------------- def drawBlueDot(self,x,y): """ draws the blue dot at the specified x,y coords """ self.paint.begin(self) self.paint.setBrush(Qt.blue) self.paint.drawRect(x,y,self.sizeDot,self.sizeDot) self.paint.end() #--------------------------------------------------------------------------- def drawLine(self,x1,y1,x2,y2): """ draws the dotted line connecting the two colored dots """ self.paint.begin(self) pen = QPen(Qt.black,2, Qt.DotLine) self.paint.setPen(pen) self.paint.drawLine(x1,y1,x2,y2) self.paint.end() #--------------------------------------------------------------------------- def getLength(self,x1,y1,x2,y2): """ returns the magnitude of the line joining the dots """ return math.sqrt(math.pow(x2-x1,2)+math.pow(y2-y1,2)) #--------------------------------------------------------------------------- def getSlopeAndIntercept(self,x1,y1,x2,y2): try: slope = float(y2-y1)/float(x2-x1) except: #divide by zero, denominator tends to infinity so, slope tends to 0 slope = 0 intercept = y1 - (slope*x1) return slope,intercept #--------------------------------------------------------------------------- def getCenterOfBox(self): x = self.posBox[0] + self.sizeBox/2 y = self.posBox[1] + self.sizeBox/2 return x,y #--------------------------------------------------------------------------- def draw(self): """ draws the entire graphic --> the dots and the connecting line and the object box""" halfSize = self.sizeDot/2 self.eraseDrawing() self.drawRedDot(self.posRed[0],self.posRed[1]) self.drawBlueDot(self.posBlue[0],self.posBlue[1]) self.drawLine(self.posRed[0]+halfSize,self.posRed[1]+halfSize,self.posBlue[0]+halfSize,self.posBlue[1]+halfSize) self.drawBox(self.posBox[0],self.posBox[1]) #--------------------------------------------------------------------------- def mouseMoveEvent(self,event): """ this has been implemented to test the form using mouse click and drag event """ cursorPos = event.pos() self.posBlue[0] = cursorPos.x() self.posBlue[1] = cursorPos.y() self.emit(SIGNAL("draw")) #--------------------------------------------------------------------------- def keyPressEvent(self,event): """ this causes the positions of the dots to be shifted in the direction of the pressed arrow key """ delX = 0; delY = 0 increment = 10 if event.key() == Qt.Key_Right: delX+=increment elif event.key() == Qt.Key_Left: delX-=increment elif event.key() == Qt.Key_Up: delY-=increment elif event.key() == Qt.Key_Down: delY +=increment #the moveRed and moveBlue signals, cause displacement w.r.t wiimote coords #which are opposite to the Qt coord system, therefore the negative sign self.emit(SIGNAL("moveRed"),-delX,-delY) self.emit(SIGNAL("moveBlue"),-delX,-delY) #--------------------------------------------------------------------------- def handleWiimoteReport(self,report,wiiref,tmp): """ handles the events from the wii remote """ rptIR,countVisible = wiigrab.getVisibleIRPoints(report) signals = [SIGNAL("moveBlue"),SIGNAL("moveRed")] scale = 2 #if the maximum number of dots visible are 2, do the following if (countVisible > 0) and (countVisible < 3): #for each visible dot, perform the following operations for i in range(0,countVisible): #if the dot has some coordinate info if rptIR[i] <> None: oldCoord = self.oldCoordsIR[i] #save the old coordinate reference for this point curCoord = rptIR[i] #save the current coordinate for this point if oldCoord.size <> 0: #if this dot is not moving from rest position delX = curCoord.x - oldCoord.x #then compute displacement along the x and y directions delY = curCoord.y - oldCoord.y #displacement = current coords - old coords self.emit(signals[i],delX*scale,delY*scale) #tell the associated dot to move/displace by the same amount #scaling is used so that a small movement of the IR point can effectively lead to a larger movement on screen self.oldCoordsIR[i] = curCoord #save the current coords as the reference for the next comparison elif countVisible == 0: #cannot see anymore IR points, rest the dots self.oldCoordsIR[0].size = 0 self.oldCoordsIR[1].size = 0 #--------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = Bounce(100,100,500,500) frm.show() app.exec_() Source Files/xauto.py0000755000175000000000000000266611447210764013557 0ustar asimrootimport os #------------------------- Xautomation Commands ---------------------------- buttonLeft = 1 buttonRight = 2 isMouseDown = False zoomCount = 0 oldSize = 0 oldDist = 0 isSwitcherOn = False cmdMouseMove = "xte \'mousemove %s %s\'" cmdMouseDown = "xte \'mousedown %s\'" cmdMouseUp = "xte \'mouseup %s\'" cmdZoomIn = "xte \'keydown Control_L\' \'keydown Alt_L\' \'str ====\' \'keyup Control_L\' \'keyup Alt_L\'" cmdZoomOut = "xte \'keydown Control_L\' \'keydown Alt_L\' \'str ----\' \'keyup Control_L\' \'keyup Alt_L\'" cmdControlOn = "xte \'keydown Control_L\' \'keydown Alt_L\'" cmdControlOff = "xte \'keyup Control_L\' \'keyup Alt_L\'" #------------------------------------------------------------------------ def moveCursor(x,y): toSend = (cmdMouseMove%(int(x),int(y))) os.system(toSend) def mouseDown(button): global isMouseDown if isMouseDown == False: toSend = (cmdMouseDown%(int(button))) os.system(toSend) isMouseDown = True def mouseUp(button): global isMouseDown if isMouseDown == True: toSend = (cmdMouseUp%(int(button))) os.system(toSend) isMouseDown = False #----------------------------------------------------------------------- def zoomIn(): global zoomCount os.system(cmdZoomIn) zoomCount +=1 def zoomOut(): global zoomCount while zoomCount <> 0: os.system(cmdZoomOut) zoomCount -= 1 Source Files/.svn/all-wcprops0000555000175000000000000001112411447211360015073 0ustar asimrootK 25 svn:wc:ra_dav:version-url V 72 /svn/baniyakiduniya_asimrepos/!svn/ver/27/PyCon%20Related/Source%20Files END runBounce.py K 25 svn:wc:ra_dav:version-url V 85 /svn/baniyakiduniya_asimrepos/!svn/ver/27/PyCon%20Related/Source%20Files/runBounce.py END xauto.py K 25 svn:wc:ra_dav:version-url V 81 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/xauto.py END runVirtualObject.py K 25 svn:wc:ra_dav:version-url V 92 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/runVirtualObject.py END wiipoint.py K 25 svn:wc:ra_dav:version-url V 84 /svn/baniyakiduniya_asimrepos/!svn/ver/21/PyCon%20Related/Source%20Files/wiipoint.py END boing.wav K 25 svn:wc:ra_dav:version-url V 82 /svn/baniyakiduniya_asimrepos/!svn/ver/27/PyCon%20Related/Source%20Files/boing.wav END errlog K 25 svn:wc:ra_dav:version-url V 79 /svn/baniyakiduniya_asimrepos/!svn/ver/20/PyCon%20Related/Source%20Files/errlog END runPaintfire.py K 25 svn:wc:ra_dav:version-url V 88 /svn/baniyakiduniya_asimrepos/!svn/ver/22/PyCon%20Related/Source%20Files/runPaintfire.py END simpleButtons.py K 25 svn:wc:ra_dav:version-url V 89 /svn/baniyakiduniya_asimrepos/!svn/ver/21/PyCon%20Related/Source%20Files/simpleButtons.py END cursor1.gif K 25 svn:wc:ra_dav:version-url V 84 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/cursor1.gif END runMoveAndStretch.py K 25 svn:wc:ra_dav:version-url V 93 /svn/baniyakiduniya_asimrepos/!svn/ver/22/PyCon%20Related/Source%20Files/runMoveAndStretch.py END puzzleui.ui K 25 svn:wc:ra_dav:version-url V 84 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/puzzleui.ui END cursor2.gif K 25 svn:wc:ra_dav:version-url V 84 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/cursor2.gif END frontend.py K 25 svn:wc:ra_dav:version-url V 84 /svn/baniyakiduniya_asimrepos/!svn/ver/21/PyCon%20Related/Source%20Files/frontend.py END redsquare.jpg K 25 svn:wc:ra_dav:version-url V 86 /svn/baniyakiduniya_asimrepos/!svn/ver/20/PyCon%20Related/Source%20Files/redsquare.jpg END runMouseMover.py K 25 svn:wc:ra_dav:version-url V 89 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/runMouseMover.py END runPaddleWar.py K 25 svn:wc:ra_dav:version-url V 88 /svn/baniyakiduniya_asimrepos/!svn/ver/27/PyCon%20Related/Source%20Files/runPaddleWar.py END 1.jpg K 25 svn:wc:ra_dav:version-url V 78 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/1.jpg END testLifeOfLed.py K 25 svn:wc:ra_dav:version-url V 89 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/testLifeOfLed.py END runDualPointDemo.py K 25 svn:wc:ra_dav:version-url V 92 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/runDualPointDemo.py END 2.jpg K 25 svn:wc:ra_dav:version-url V 78 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/2.jpg END 3.jpg K 25 svn:wc:ra_dav:version-url V 78 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/3.jpg END 4.jpg K 25 svn:wc:ra_dav:version-url V 78 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/4.jpg END irtrack.py K 25 svn:wc:ra_dav:version-url V 83 /svn/baniyakiduniya_asimrepos/!svn/ver/21/PyCon%20Related/Source%20Files/irtrack.py END timer.dat K 25 svn:wc:ra_dav:version-url V 82 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/timer.dat END blue square.jpg K 25 svn:wc:ra_dav:version-url V 90 /svn/baniyakiduniya_asimrepos/!svn/ver/20/PyCon%20Related/Source%20Files/blue%20square.jpg END simpleConnect.py K 25 svn:wc:ra_dav:version-url V 89 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/simpleConnect.py END frontend.ui K 25 svn:wc:ra_dav:version-url V 84 /svn/baniyakiduniya_asimrepos/!svn/ver/20/PyCon%20Related/Source%20Files/frontend.ui END runPuzzle.py K 25 svn:wc:ra_dav:version-url V 85 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/runPuzzle.py END runWiiControl.py K 25 svn:wc:ra_dav:version-url V 89 /svn/baniyakiduniya_asimrepos/!svn/ver/22/PyCon%20Related/Source%20Files/runWiiControl.py END wiigrab.py K 25 svn:wc:ra_dav:version-url V 83 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/wiigrab.py END trayicon.png K 25 svn:wc:ra_dav:version-url V 85 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/trayicon.png END output.txt K 25 svn:wc:ra_dav:version-url V 83 /svn/baniyakiduniya_asimrepos/!svn/ver/33/PyCon%20Related/Source%20Files/output.txt END puzzleui.py K 25 svn:wc:ra_dav:version-url V 84 /svn/baniyakiduniya_asimrepos/!svn/ver/31/PyCon%20Related/Source%20Files/puzzleui.py END Source Files/.svn/entries0000555000175000000000000001303511447211360014304 0ustar asimroot10 dir 27 http://baniyakiduniya.unfuddle.com/svn/baniyakiduniya_asimrepos/PyCon%20Related/Source%20Files http://baniyakiduniya.unfuddle.com/svn/baniyakiduniya_asimrepos 2010-08-24T11:52:12.450786Z 27 asimmittal 65a41371-a0ef-479a-93cf-f98071d0b24a xauto.py file 33 2010-09-24T21:02:45.000000Z 161c0cd524c343dc26e6977e9dee2d0d 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 1462 runBounce.py file 2010-08-24T10:45:46.000000Z d5a31961108e0b1441fab5b4ac11658a 2010-08-24T11:52:12.450786Z 27 asimmittal has-props 19109 runVirtualObject.py file 33 2010-09-13T15:07:28.000000Z f00a88218aa44b417f20b4e99bf558b9 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 2890 wiipoint.py file 2010-08-16T17:24:18.000000Z af0e79536ef4d54bc741e2b91e7a9764 2010-08-16T18:56:01.264587Z 21 asimmittal has-props 2674 errlog file 2010-07-25T19:38:24.000000Z 7113c99574c8d08d9b29d39bb62bc57e 2010-08-09T04:58:06.155047Z 20 asimmittal has-props 13180 boing.wav file 2010-08-23T09:00:52.000000Z ba865dd36dbc63672f607ce0b60556d2 2010-08-24T11:52:12.450786Z 27 asimmittal has-props 2410 runPaintfire.py file 2010-08-17T15:03:40.000000Z 2b8dee757a9bd611224e985a3c520022 2010-08-19T06:33:02.209490Z 22 asimmittal has-props 3015 simpleButtons.py file 2010-08-16T17:59:44.000000Z 1c512af6fd2fd5f0b8cddd542c7295be 2010-08-16T18:56:01.264587Z 21 asimmittal has-props 2409 runMoveAndStretch.py file 2010-08-17T15:55:26.000000Z 6cd9353df559d8707eb097be8fa1ebde 2010-08-19T06:33:02.209490Z 22 asimmittal has-props 5835 cursor1.gif file 31 2010-09-01T11:09:26.000000Z 5c225718b0ccccd43386ebe6a68ce550 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 825 cursor2.gif file 31 2010-09-01T11:11:32.000000Z 1d174c75edcba166d86b9b99ec628b16 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 159 puzzleui.ui file 31 2010-09-01T12:48:54.000000Z 06a12202603093b07a2ca1df73b52083 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 13356 frontend.py file 2010-08-13T14:13:42.000000Z 5c7f9c41f1c9ec808e65c566ee990125 2010-08-16T18:56:01.264587Z 21 asimmittal has-props 10539 redsquare.jpg file 2010-07-25T15:39:00.000000Z 1143023208ebab745481e4510b6f597e 2010-08-09T04:58:06.155047Z 20 asimmittal has-props 116502 runMouseMover.py file 33 2010-09-24T21:03:38.000000Z 6760c8494f9fcb1219fd8597412adc3f 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 2689 plot dir 1.jpg file 31 2010-09-01T00:46:46.000000Z 8de766c170e92f618cc89ca8aeb41762 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 3864 runPaddleWar.py file 2010-08-24T09:58:54.000000Z d2eeeaa04045d154fec9f892b5322b02 2010-08-24T11:52:12.450786Z 27 asimmittal has-props 16733 testLifeOfLed.py file 33 2010-09-11T18:27:26.000000Z 62f2401fea897d0c68f0ac9fc7990a65 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 1252 runDualPointDemo.py file 33 2010-09-13T13:39:20.000000Z f2bde985b4445521eaa6e84a4eb60de3 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 7848 2.jpg file 31 2010-09-01T00:46:50.000000Z 01a65b017c6774070d64e7718ace4060 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 4602 3.jpg file 31 2010-09-01T00:46:52.000000Z a39eafd614894b46d899d7410fbb6664 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 5530 4.jpg file 31 2010-09-01T00:46:52.000000Z e2518bf4f6fd136efe90beadd6300f21 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 5559 irtrack.py file 2010-08-13T18:07:54.000000Z 0857be65fd1246ae76a6b1da10dec837 2010-08-16T18:56:01.264587Z 21 asimmittal has-props 8018 timer.dat file 33 2010-09-13T17:46:32.000000Z d41d8cd98f00b204e9800998ecf8427e 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 0 blue square.jpg file 2010-07-12T20:53:18.000000Z 4cd0162d0502a3d0bd563fe3de20f091 2010-08-09T04:58:06.155047Z 20 asimmittal has-props 818 simpleConnect.py file 31 2010-09-04T14:14:08.000000Z d2014b04b0704c2aafaff34845865e34 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 2285 frontend.ui file 2010-07-25T19:01:58.000000Z df6780492062be5a34628ac92ffc6f77 2010-08-09T04:58:06.155047Z 20 asimmittal has-props 11496 runPuzzle.py file 33 2010-09-09T15:04:46.000000Z 7fabc29e8d97c81c62787374f6b92df9 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 8622 runWiiControl.py file 2010-08-17T16:02:48.000000Z 4ef6b960beb1762f813da6773db75fbc 2010-08-19T06:33:02.209490Z 22 asimmittal has-props 5808 trayicon.png file 33 2010-07-19T06:47:36.000000Z 3acb35f74676ed995305a78fe89d12a8 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 2353 wiigrab.py file 33 2010-09-13T21:09:40.000000Z ddb30b797450955b4c88605d55d31242 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 9607 puzzleui.py file 31 2010-09-01T16:16:10.000000Z c1536348e9856a2949c9ff4a0dcef5a2 2010-09-05T09:44:35.913641Z 31 asimmittal has-props 10905 output.txt file 33 2010-09-09T16:05:04.000000Z bf0f8086cfea43ab001ecf44465332d4 2010-09-24T21:06:54.863893Z 33 asimmittal has-props 2262 Source Files/.svn/text-base/trayicon.png.svn-base0000555000175000000000000000446111447211350020661 0ustar asimrootPNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXí[]e9vt:-L[=$%A9ExjHܛx!^!Z©D9R,tJgtڙ{Zр?b~g%"|G)GXXR.I :@@&"&PcZ#lXZ~MV9ƜN?RroJMncm}غ pbiYlZl g93s,0D!`J k ޱt}uAbE0n.,hr94+̱yI%wr;]Kߡ{wpCI0nf-I.a j%+qvx0]`<9{-J}-pÖ<|]W?f[iHDetepnnfk BZw& ;iLEh&r^|ç"ZŬ|@~`v7><xᅗ8|9NOt, LNu19){w{k4VP w+@ ^QeDu "T9z"yMU1Oj ֏ qhɍ|N #?El9̧_:m;jwgT*Fv%El*dLQ[$7_:[JΪ); x9O?uWFWO4ϸfp[KWMXrӝ5Q~-8q<@s®A` P[%[sm-Y\gC)!Kv_~Q`%l6F"$f^B 禅(_&w2Qe)<``p@zxmy$gϞCynn#MDiaDƤIFd$&h&w(8i f@kC\G[J}lĉ ̼GMi:Q#q̣ E *I^VA g!`x ֎ri*e7u?40F2KˋX#" ڵt%BۄrNqx>B*uC XA @Rs8g&QS1 NLhHUTk NY&`-Tj"ÄRV{vg֝|ejr884 8'Usa3pV0F5 iyZą5VI&19 +Q"] =\[<)B0H#y8!K!9TjPCJ9&,fC5ѺCqʠ*rRH"t^iy? kaEDR̻Fh.-OWHw<`M-6H#NWWX>4:TXsAW`t~3I@J NϞ'v7Uk=T^! ʠp%K_+r<.<-&/1FR @WD*.癳`o¦.b@ EOaqNX7S{Y}-zG%q@7|WZg,9u8'X[xc0} NE&@i8_a4_[x9>rN4+,XR6-E3E5ӹ`]Y,YUm*6l==y)\}`$wξ_~Fc礈\0ZH"TLP{ab ֌~ww#~GpNHbL?51~A> None) and (flag == False): print 'started:',time.asctime() flag = True elif (irPt1 == None) and (flag == True): print 'stopped:',time.asctime();sys.exit(0) lock.release() fobj.close() if __name__ == "__main__": #------------------ Create Object, Connect and Configure ------------------- try: print "Press the buttons 1 & 2 together..." wiiObj = wiigrab.WiimoteEventGrabber(someEventHandler,1) wiiObj.setReportType() wiiObj.led = 15 except: print "Wii remote not found. Please check that the device is discoverable" sys.exit(0) #---- Start the Wiimote as a thread with reports fed to assigned callback---- wiiObj.start() #----------------- Run the Main loop so that the app doesn't die ------------ try: print 'Start of App' while True: time.sleep(1) except: #very important call to join here, waits till the wiimote connection is closed and the #wiimote is restored to its initial state wiiObj.join() print 'End of App' Source Files/.svn/text-base/output.txt.svn-base0000555000175000000000000000432611447211352020426 0ustar asimroot{'pos': (561, 465), 'size': 2} {'pos': (560, 464), 'size': 2} {'pos': (554, 463), 'size': 3} {'pos': (542, 466), 'size': 3} {'pos': (530, 467), 'size': 3} {'pos': (504, 469), 'size': 3} {'pos': (479, 471), 'size': 3} {'pos': (453, 473), 'size': 3} {'pos': (425, 475), 'size': 3} {'pos': (398, 476), 'size': 3} {'pos': (359, 480), 'size': 3} {'pos': (312, 486), 'size': 2} {'pos': (289, 488), 'size': 2} {'pos': (257, 494), 'size': 2} {'pos': (243, 495), 'size': 2} {'pos': (240, 494), 'size': 2} {'pos': (240, 488), 'size': 2} {'pos': (240, 480), 'size': 2} {'pos': (236, 463), 'size': 2} {'pos': (232, 441), 'size': 2} {'pos': (230, 418), 'size': 3} {'pos': (225, 390), 'size': 2} {'pos': (222, 353), 'size': 2} {'pos': (216, 330), 'size': 2} {'pos': (210, 315), 'size': 3} {'pos': (203, 310), 'size': 3} {'pos': (199, 310), 'size': 2} {'pos': (199, 312), 'size': 2} {'pos': (201, 314), 'size': 3} {'pos': (207, 314), 'size': 2} {'pos': (214, 315), 'size': 3} {'pos': (221, 314), 'size': 2} {'pos': (224, 313), 'size': 3} {'pos': (227, 313), 'size': 3} {'pos': (231, 314), 'size': 3} {'pos': (235, 316), 'size': 2} {'pos': (245, 317), 'size': 3} {'pos': (259, 317), 'size': 3} {'pos': (286, 316), 'size': 3} {'pos': (312, 315), 'size': 3} {'pos': (341, 314), 'size': 3} {'pos': (373, 312), 'size': 3} {'pos': (421, 309), 'size': 3} {'pos': (465, 305), 'size': 3} {'pos': (517, 299), 'size': 3} {'pos': (547, 295), 'size': 3} {'pos': (591, 286), 'size': 3} {'pos': (611, 283), 'size': 3} {'pos': (624, 281), 'size': 3} {'pos': (630, 282), 'size': 3} {'pos': (632, 284), 'size': 3} {'pos': (631, 286), 'size': 3} {'pos': (631, 287), 'size': 3} {'pos': (629, 289), 'size': 3} {'pos': (627, 292), 'size': 3} {'pos': (626, 297), 'size': 3} {'pos': (626, 305), 'size': 3} {'pos': (626, 317), 'size': 3} {'pos': (627, 334), 'size': 3} {'pos': (629, 356), 'size': 3} {'pos': (631, 380), 'size': 3} {'pos': (634, 406), 'size': 3} {'pos': (635, 438), 'size': 3} {'pos': (633, 459), 'size': 3} {'pos': (632, 477), 'size': 2} {'pos': (631, 489), 'size': 2} {'pos': (630, 497), 'size': 2} {'pos': (626, 501), 'size': 2} {'pos': (625, 498), 'size': 2} {'pos': (624, 495), 'size': 2} {'pos': (624, 488), 'size': 2} ------------------------------------------------------------ Source Files/.svn/text-base/runPuzzle.py.svn-base0000555000175000000000000002065611447211340020716 0ustar asimrootfrom PyQt4.QtCore import * from PyQt4.QtGui import * from puzzleui import * import sys,wiigrab,wiipoint class PuzzleEkt(Ui_Form,QWidget): def initObjects(self): """ initialize the objects viz. the images, the cursors etc""" self.images = [self.img1, self.img2, self.img3, self.img4] self.initialPositions = [self.img1.pos(),self.img2.pos(),self.img3.pos(),self.img4.pos()] self.cursors = [self.cursor1,self.cursor2,None,None] self.selection = [None,None,None,None] self.timer = QTimer() self.paint = QPainter() #------------------------------------------------------------------------ def initWiimote(self,handler): """ setup the wiimote and assign the handler to process events """ try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] print 'Press 1 & 2 together...' self.wiimote = wiigrab.WiimoteEventGrabber(handler) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: QMessageBox.critical(self,'Connectivity Error','The application could not find any Wiimotes. Please ensure your device is discoverable and restart the application') self.close() #------------------------------------------------------------------------ def initWindow(self): """ configure the window """ self.move(100,100) #------------------------------------------------------------------------ def __init__(self): """ class constructor """ QWidget.__init__(self,None) self.setupUi(self) self.initWindow() self.initObjects() self.initWiimote(self.wiimoteReportHandler) self.setAttribute(Qt.WA_PaintOutsidePaintEvent,True) #event bindings go in here self.connect(self.timer,SIGNAL("timeout()"),self.timeout) self.connect(self,SIGNAL("moveDot"),self.moveDot) self.connect(self,SIGNAL("deselect"),self.dropSelected) #------------------------------------------------------------------------ def timeout(self): """ this is the tick handler for the application timer. Whenever the timer is running it checks if either of the cursors are positioned on top of any of the images. If they are, then it causes that particular image to be "selected" """ for c in range(0,len(self.cursors)): #loops through all the cursors in the workspace cursor = self.cursors[c] for image in self.images: #loops through all the images in the workspace if self.isCursorOnImage(cursor,image) == True: #if a cursor is found on an image if self.selection[c] == None: #and if that cursor hasn't selected anything yet self.selection[c] = image #mark that image to have been selected by that cursor self.timer.stop() #stop the timer #------------------------------------------------------------------------ def isCursorOnImage(self,cursor,image): """ this performs a check on the cursor and image object passed to it. If the cursor geometry is coincident with that of the specified image, then it returns true, else false """ if cursor == None: return False xOriginImage = image.x() yOriginImage = image.y() widthImage = image.width() heightImage = image.height() xRange = range(xOriginImage,xOriginImage+widthImage) yRange = range(yOriginImage,yOriginImage+heightImage) xCursor = cursor.x() yCursor = cursor.y() if (xCursor in xRange) and (yCursor in yRange): return True else: return False #------------------------------------------------------------------------ def moveDot(self,dot,delX,delY): """ displaces the cursor specified (by dot) by the specified distance along X and Y """ #displace the cursor specified by 'dot' by delX and delY xNew = self.cursors[dot].x() - delX yNew = self.cursors[dot].y() - delY self.cursors[dot].move(xNew,yNew) #start the timer if it is not running already, and let it tick out at the end of 2 seconds #this is done to create the "Dwell click" effect. After two seconds are over, the timeout #routine will check if any of the cursors lie on any of the images, if yes, they will cause #the image to get selected under that cursor using the "selection" list if self.timer.isActive() == False: self.timer.start(2000) #get the current selection for the cursor and check if the selection bears an image selected = self.selection[dot] if selected <> None: #yes, this cursor does have an image selected by it, so displace the image by delX and delY too xNew = selected.x() - delX; yNew = selected.y() - delY selected.move(xNew,yNew) #------------------------------------------------------------------------ def dropSelected(self,dot): """ this routine clears the image currently selected by the cursor specified by dot this is quite important as this routine will cause the cursor to deselect the image and continue moving freely. After a dwell click occurs, the image and cursor move together to mimic a drag event. This routine allows the image to be "dropped" completing the drag and drop sequence """ self.selection[dot] = None #------------------------------------------------------------------------ def closeEvent(self,event): """ things to do before the app shuts down """ print 'Closing' try: self.wiimote.join() print 'Wiimote disconnected successfully!' except: print 'Wiimote pipe was not closed properly' #------------------------------------------------------------------------ def wiimoteReportHandler(self,report,wiiref,frmRef): """ handle the incoming reports from the wiimote. this routine is a lot similar to the report handler for the dual point demo, except that in order to intiate a dwell click and then later deselect the image, it sends out the "move" signal when the IR point is visible (so as long as the IR point for a particular cursor is visible, the move signal is generated) and sends out a "deselect" signal when the particular IR point for a cursor is not present (by sending the deselect signal for a particular cursor, the app understands when to drop the selected image and let the cursor move freely about the workspace) """ rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() multiplier = 2 #this if clause is executed when there are no points visible if countVisible == 0: for i in range(0,len(self.oldCoords)): self.oldCoords[i].nullify() self.emit(SIGNAL("deselect"),i) #if even one point is visible, the stmts in this clause are executed else: #loop this for all the visible IR points for i in range(0,countVisible): #if the ith point is visible (<>none) and there are upto two points visible (since we have only two dots) if (rptIR[i] <> None): point.calculateDisplacement(self.oldCoords[i],rptIR[i]) point.scaleBy(multiplier) if self.oldCoords[i].size <> 0: self.emit(SIGNAL("moveDot"),i,point.x,point.y) self.oldCoords[i] = rptIR[i] #this is a peculiar case and occurs when the first IR point may disappear and the #second IR point is still on in view else: self.emit(SIGNAL("deselect"),i);print 'deselecting' #----------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = PuzzleEkt() frm.show() sys.exit(app.exec_())Source Files/.svn/text-base/puzzleui.ui.svn-base0000555000175000000000000003205411440663202020550 0ustar asimroot Form 0 0 640 480 640 480 640 480 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 220 0 0 0 EkTitli Puzzle 160 90 151 121 false 1.jpg true 330 220 151 121 2.jpg true 330 90 151 121 3.jpg true 160 220 151 121 4.jpg true 260 380 141 51 Gothic Uralic 24 ektitli.org 20 20 5 5 cursor1.gif 610 20 5 5 cursor2.gif Source Files/.svn/text-base/puzzleui.py.svn-base0000555000175000000000000002523111440663156020572 0ustar asimroot# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'puzzleui.ui' # # Created: Wed Sep 1 15:14:00 2010 # by: PyQt4 UI code generator 4.7.2 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(640, 480) Form.setMinimumSize(QtCore.QSize(640, 480)) Form.setMaximumSize(QtCore.QSize(640, 480)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush) Form.setPalette(palette) self.img1 = QtGui.QLabel(Form) self.img1.setGeometry(QtCore.QRect(160, 90, 151, 121)) self.img1.setText("") self.img1.setPixmap(QtGui.QPixmap("1.jpg")) self.img1.setScaledContents(True) self.img1.setObjectName("img1") self.img2 = QtGui.QLabel(Form) self.img2.setGeometry(QtCore.QRect(330, 220, 151, 121)) self.img2.setText("") self.img2.setPixmap(QtGui.QPixmap("2.jpg")) self.img2.setScaledContents(True) self.img2.setObjectName("img2") self.img3 = QtGui.QLabel(Form) self.img3.setGeometry(QtCore.QRect(330, 90, 151, 121)) self.img3.setText("") self.img3.setPixmap(QtGui.QPixmap("3.jpg")) self.img3.setScaledContents(True) self.img3.setObjectName("img3") self.img4 = QtGui.QLabel(Form) self.img4.setGeometry(QtCore.QRect(160, 220, 151, 121)) self.img4.setText("") self.img4.setPixmap(QtGui.QPixmap("4.jpg")) self.img4.setScaledContents(True) self.img4.setObjectName("img4") self.label = QtGui.QLabel(Form) self.label.setGeometry(QtCore.QRect(260, 380, 141, 51)) font = QtGui.QFont() font.setFamily("Gothic Uralic") font.setPointSize(24) self.label.setFont(font) self.label.setObjectName("label") self.cursor1 = QtGui.QLabel(Form) self.cursor1.setGeometry(QtCore.QRect(20, 20, 5, 5)) self.cursor1.setText("") self.cursor1.setPixmap(QtGui.QPixmap("cursor1.gif")) self.cursor1.setObjectName("cursor1") self.cursor2 = QtGui.QLabel(Form) self.cursor2.setGeometry(QtCore.QRect(610, 20, 5, 5)) self.cursor2.setText("") self.cursor2.setPixmap(QtGui.QPixmap("cursor2.gif")) self.cursor2.setObjectName("cursor2") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): Form.setWindowTitle(QtGui.QApplication.translate("Form", "EkTitli Puzzle", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("Form", "ektitli.org", None, QtGui.QApplication.UnicodeUTF8)) Source Files/.svn/text-base/cursor2.gif.svn-base0000555000175000000000000000023711440663174020416 0ustar asimrootGIF89a U$$U$$IIUIImmUmmUUU۪!Created with GIMP, &dihl0;Source Files/.svn/text-base/cursor1.gif.svn-base0000555000175000000000000000147111440663162020413 0ustar asimrootGIF87a U$$U$$IIUIImmUmmUUU۪U$$U$$$$$$U$$$$$I$IU$I$I$m$mU$m$m$$U$$$$U$$$$U$۪$$$U$$IIUIII$I$UI$I$IIIIUIIIIImImUImImIIUIIIIUIIIIUI۪IIIUIImmUmmm$m$Um$m$mImIUmImImmmmUmmmmmmUmmmmUmmmmUm۪mmmUmmU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmےےUےے۶۶U۶۶U۪UU$$U$$IIUIImmUmmUUU۪U!, @9H*\ȰÇ;Source Files/.svn/text-base/4.jpg.svn-base0000555000175000000000000001266711440663162017204 0ustar asimrootJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?EWQ@ KZWMU1jjfQW3ʟJ졀[ZSԩnX,ܸ|oC=: PF?tt6QN5RRk EUK^b݂(((((((((((((((<-F2k|<ǜ-^ӊOƼxd#6%gX|1poc@9K𮏦m6qߙi`RbtB8lAKEjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE%'ěYEm"|k YE4G+*e;¬j|,EWAQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE8Ss|XVSoKyT"=Yڎj+(fe^\'z2`H?JV~ ͻ1JUZ8q>ϵ|xT#џ1 Cw)u)cEx' נ= ޽e;_"y`0#ֺ(fTqkK Q^QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEnjJRzeʷk7Fx\"G5Ock_Mm4q9؃G^FBPuHZ(,(((((((((((((((((((( \WϿ?h{m'ROZ% > _m Z64I'>T~T)tvuQEYEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP |Až.X܂ɹHk+|GyڄmVUgȍhSKn%U `zj|$Q]S]:1s.er*G+Rx KFîvъxhdWRjŽ_+Sc4o+ܧAZU60$_"Eg5h{IH\4= g֔QEwpQEQEQEQEQEQEQEQEQEQEQEQEQM AE6gBCK)~󶫪W\]\J n8Aj?z֭c<|W,z^^3"q.[Q^Aw S4/ ⹘s,ɖB9OǕc;1W.'ׅ}7Ya[9ya!_GWmmax!j2s#v^ aspb kZZElբ+S#m>#0Pkd㏉wcNC/yH޸~h u˟Ip?_Ey} q[+)끚TkV9c=+]uFG(?ƻsi2 ݭ5̃:zuQU#6⤅+RŠ((((((((( ?Ѵ۶F ʀ~U*B2 +i`zS471 V=%d^gA-N$#5Gҹ(ѓ0;-v0e>e4vGH1]MrvGUǁ会(bhJ%M~}A[-vϴRFN# \Ujs4V N=3z :6zmw7@v>τ /ja]ُտ}Ѡ[d|==MY5:-͚(oJ+MK[?wIS,NwNu`?4C }EWqCq H2H,grOzI\%,Mʥh r~󷩭j(TUQEXŠ(((((((((p9!OX|PMs"OnlX%1m!Pqںه:{xwQ&xD\" Ob3Ҽk?g㏋O\1ʚT>^q[[K/-'cyA*A Uz=jqwG˺ x\ֵA[9$8Gm~}?Od?W&+EEuNki 3y12 ؆=??3O}WA$bS((((((((((FJZJa6A<$r+x{?[?}8_|IhH?CWݥŏ /{+u(?R+ZL3(8ߌPx1273+]{ 2n-%}J_=k;pF}*-ZJLiײWD>rQEd~wŻD6f??J]ҲiSmoQsn-.\?g4 +^?#(7Yӵ9!ӯqww/+?*y#=U~FH~zNm#ƚ~TMˉ[XW;_ٟK\'f֯?g[/hNXGգ8|$b~0+s(((((((((|bKi֍.?^ĞuhTL $mÆ2=Ǿ~V|>4;/*?$54 0AXҌ7( |X c[-j4ƣnSӯ&mN&%2_r|bRW:|{EDOfd##o,/gH.cH0Gb+ ѴtP4yO/ZgFpu kԬu8kC V@EpZJ#{1KFH6 _H.&zEZޝG.=ZJ =D7y錻Vo>YYWNQ^ 2q'"5/I@Ӹ2 iM!.Q2+mnfp[O#ub$*|)~#<"[ cy*Vʎӧ~fk3ⷈ%蚇K˫O?kXFy־^Yrӑk81ֽJ)EZQo>YT/=ۓ<u {m-0(Wn ]O˨.@>i0dI@UŮ^ܓʊ'>qXUMN$fw?ysd$o?V} 9x2> mL4wڜ#J r_>u4F-nonkN.08ۖ"_.WUԑqogy8ƾ^s @-,w`9_q]XDΌ$|Ysh柪['_r8/xgY-oִd kWCNAUZouD$AB:)7v6\L"%}rSV)6Z&k {^ >r'7SOZcu:/ݍQ 9Fv<$EU(((((((((+Ï xE\FչrukI4| KN t}f2H'Wm(op)bFr }PEPLIU=p:(('? )qHxn!cWRx'׆|Ҷ1=v4T+|ָQEP(((((((((((((((((((((((((((((Source Files/.svn/text-base/3.jpg.svn-base0000555000175000000000000001263211440663160017171 0ustar asimrootJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((( Z:HWEu9-fɏrc__}qX(`緛 ()17Ҽ0_sbh{Uu5?R5[Ac{'tK?}~yFcs_Kix&C}ǵEkq-wRhaa12տޏ2WBvg҂xnȎ.bOY/"jM}gt{X3In嶺BFpj Muȅ՞#H=v6t8da+)agFx:OȊ(#((A>((((((((((((((g|Ag%C1IxŅFcM}%\ߋ/m _Oc+r\3w$& !E ꮌ%ٴ]MM‘tmQN?¾=G?!PqQE{xQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEOY~UEW*?x ʼ>WW]]FQ{{ȖX[3_ 7hdH*pAPo%%蓞} ž\iV|{zJ}K=?&yU0> r)^%?]`sb8O̟^jze>vcV>ǧFj747 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (渿xWg"JϸJ+!Z<ȩN5|h4^ncqʷ:vu Gu=}_D^ZyCsKuW? t,Su%9Ob2= ik-5tW?_J`9Y!ud2_S= Mkڎ.YMgC6Eb1JD}EWQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^Z+H۪u6EӤkIh+aVVFą+s@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((5/%5[==;>(RkޗfRv=QYԗ"t+NgzG}j[G#kf MGA[S-.` ή:QEQEQEQEQEQEQEQEQEQEQEQEQE|EO{k_O3`qt ״պJ0;]%ZT2hJ\mQEjQEQEQEoJ?Q 3 W=࿌&ⷊ%h >#:0:٭r,17ěݔ4H@.k|I2.HH #J!fQ]8QEQEQEQEQEQEQEQEQEU m>缕b:Y>K Ğ{ׇ7~!. %S^~7*9Iymم ( C7+oD_2Gvg1?ߍyφ3]8ikou`Ę2|t95ζ=9:R#9+k9#*Ik~xXoSI}I$C^WGK*>iѱC+}Z"8xTUho[_ _?Ҿg1/;~GܬgU,@OV>w5&[2]Hc$!^~_3LJœExA>jFg*Ky]j+qg)3^MUHo !t8🇦.Ne{=: :+[D¨L*IըԛrзEWw(-lxsºmݴgC˰U$M|pEys[?<^iֶƱă 0Yzγa[Hw1Dž'n}4! tG&<#F,6\!_W;>r++RMEQ+eסÁ{j1PRj7Sc&B]0ԇ)aA4Ir`'Sb\?┹+_:>$mkQkkf@8\woG5klW2zQܚ^L-2mE30}vkF2b=OWSt}N|9cՏrkSRIYQV0Ú3G{νWpk^7~%/<b[D ev:tx7-[ZGZy,Ps@+9_^4&:zh\ƮJQJfnMGWF%}i_%~ȿ??1kZևcŢ+c((((((((+M9哫qk~CF&XG~"ҔՏ4>w)^"K@ 쬌R@C)>>{ןtry{Q>(ԭSsťNS,N9.kjuu5x l̟ք u鬞掯T{|Mk*dM&8v(# j:*  abBx C嫵d۩qY8&fD`8'g]~2|<6jk) 9Ta? Y ka{~!m{8FC_ƾdl>+6]%q\؝Ӆ~ȿ?j?1kZ+EUqы_ZH|bEQEQEQEQEQEQEQEQEPh<⏇J$oeYO*{0m[kC"e=x/qHil\\t>s;~_b)J3l/ok9X)Z+ |+`Tlf[o:) oG:_VfEH;_x7Z8w =I4i,-杮$Տw᱋~T캝4*-:o6xOE[?eS/[j>v nUrGC*hzP@^^Mjy$ׇЗֽŽ?N^NkGҳ-"RML?^Gִ@ JGz3@79sM51ci >W}8aA1KBꐴQEnhQEJV񮝫"&f";\ZZj[7,.+\VucR,|m_[jMh`z۩_p@?{hYAöZ&A|?fM׊Hp~+^"1[,F( +3U8Sl( ( ( ( ( ( ( ( ( ( axE&eajj -Ns%Z17yk2F|3^G< 7wdh:oX?y,SZݨ]P劲6IEY5T1NQEQEQEQEQExtQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Source Files/.svn/text-base/2.jpg.svn-base0000555000175000000000000001077211440663160017173 0ustar asimrootJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((([^tq˜5^|M#8hA-\]ZNIJ!;^la-i$V4Ca~}*avE9lκby6 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>fvwr1f)w F%R;uȫ㱸Wӡ){)XɹM-{^t\l{?<+ھ*{Z壌Y^22ZZ3Vd%t{-s[vW!\>!Kto+C1ZTUװW5⏈AZ6䉷LánW9nMXDxժ:a^np.(I_$Z>IW +|QTQE}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@2р{QE~}sێ[7Kq3KCXc_O]W_qw_@FaTa@zf8ԩ;puSYlp2|1Gv$ GQ َdg^jakp*>ކ\NUFpW MuY9Izҹ0$ob5'KH "+pGQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|EWM;Ė2DcC(=|]߅<}.Z$ JC^Wө;xOܑA{uHRO`+zŸI;DG?\cq$6#I 9P]WN GvsW%29oo Or?6ףNoE.\{ՑtQE}fEPEPEPEPEPEPEPEPEPEPEPEPEPEP̴QE~||{O"MӅȼƫA4qg&}2k}. >+kT cG/m$uaջ>_Xim :5^loʻz~ I;F"3VӮKyMRsEsѭ*槹:;뿉-,V<:#Q\؉o6[U{iYTҜ.L~O:+?Vg=mz<`GtauK'~#~]khfX{JGVONSXGw> D>!9+#ڽg K䖒=*WG:z(S((((((((((((Ϗ+V l-a /~:j+ ԫʓOG4,4%d.}k(&\&YUwQEQEV߇<1kMpO=WmlGeWXYcia"mUznb[upWA/E÷3c(iBr9I{YF{Rj>imxCV սSG`|W|ScNǘGG^K_7,k_3˫BgKxC)_V%Y'H+?i.˚)QZQEQEQEQEQEQEQEQEQEQE|EWQ@Q@Q@Q@.i7n^־zΨtmnѰwSpXɪEêgp=Q^d!$gp_=N]Nאrx&[9eV:JSIt={<hO4?]men?B?z([J4y(/GIZ EWAQEQEQEQEQEQEQEQEQEQE-Q_8QEQEQE%5wpB3,Gqׅ4[T pG3 >ނX۶úCO} t~u|d{Xj r)H}j2ٖ-ߍu=?·`N_3Jjaѭ$2 3Cs]Yİbdm[yI7~ҊfqN+^CC̸!UK]IbAթvuÀ( ( ( ( ( ( ( ( ( ( ( (>e+((t1I<H 2I+jpyVC-\iNK"!ĺtҕ%n # 0Jagv֨jVW` OoTah6 ( ( ( ( ( ( ( ( ( ( (>e+((B=o8xg9T!W|z=X aEu]R 0; G=+4hs~'C t_[+}j+`);c5J'Ex|r8$p-᛿\b8ӥNU%v8AxoBׯce#^i6/$'Ӵm*G[k( {'0+8޲=>RW{+:B((((((((((((h(((V^>E !~z g"r *G5ۅĿwnE,+l`H-cXAUA⾣ s֥F4ElQEQEQEQEQEQEQEQEQEQEQEQEQESource Files/.svn/text-base/1.jpg.svn-base0000555000175000000000000000743011440663160017167 0ustar asimrootJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((@" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Փ-nBkDyϠ4UoQӭU^Wo7wh柾OkZw^6#Szɯ泪)hʭr#(((((((((((((((((*9Hbi%`Ǡ7`(kKyxEV= oP{D_AZ3 ԋ)"D)s\|eu~'{Gʶ/_y6$+̳}Av $^-=D摺Vs*2'gl# G]EWQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE⯈A55_ SMv24?Ǡi.n$w-,Y&L죻V\Q_2yF![鑰ʛ$}kAҾtnatr9s_;ꗯj7rg/A^.s䤠XڜU+$((j(O ( ( ( ( ( ( ( ( ( ([~t_]q*&x/$gD?12q&3:mIbI$rIIE6|$F^sf??k}^O7,?ў ޘQEzXQE|P>!S.\D>O?Zj/^ݽ?-[iW_!hxT~BE朡EPEPTQE~}QEQEQEQEQEQEQEQEQEQE?3:wASJ?[Xy2*+ţ(l|caㆽWxO/czGWd yp~EH t,ʉ2,nɓ*o7n ) Yt9?ykMnO4QE@((0((((((((((#Y`tn:zgFb e(((((((((((6~G."^?¸"m6&{+(QEQE}5EW'хQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ \ŭ+:d7^ٰ8뿪ZMm0Q5ωRp}LEA \լd59.W>ET\%fx-r3? jUЬe1sZ_<֛#raӫ0uhA0^c!M-@drS)G9DczL(0Š(((0((((((((((((̾-h-^q^c_H}g5)Tc_?kdFqe7&30~;?򱴭.u_M?u<Wv%)4L92gN9ֿٛ4yɱ~KVaET((j(O ( ( ( ( ( ( ( ( ( ( ( (>Eݲfvԇkэh:rD骑g{Dԥ5H/`7?t9~/S P8>qa<-^W<9Tgn;MPٷE*SV>xcL|[Nߺc?ν|s_[,M5%S٣UU2-XSԸ+̫ J-Bk[U|shw?+vek0~l3J]JQExQEQESource Files/.svn/text-base/runVirtualObject.py.svn-base0000555000175000000000000000551211447211342022176 0ustar asimrootfrom PyQt4.QtGui import * from PyQt4.QtCore import * import sys,wiigrab,wiipoint,math class VirtualObject(QWidget): def initWiimote(self): print 'Trying to connect to the wiimote, press 1 & 2 together...' try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.wiimote = wiigrab.WiimoteEventGrabber(self.handleWiimoteReport) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: QMessageBox.critical(self,'Connectivity Error','The application could not find any wiimotes, please ensure that the remote is discoverable and restart the application') self.close() sys.exit(0) def initWindow(self,xOrigin,yOrigin,width,height): self.setWindowTitle('Virtual Objects') self.setGeometry(xOrigin,yOrigin,width,height) self.setAttribute(Qt.WA_PaintOutsidePaintEvent) self.paint = QPainter() def initObject(self): self.sizeRed = [10,10] self.posRed = [30,30] self.boxColor = Qt.red self.angle = 0 def __init__(self,parent=None): QWidget.__init__(self,parent) self.initWiimote() self.initWindow(100,100,500,500) self.initObject() self.timer = QTimer() self.connect(self,SIGNAL("resize"),self.stretchDot) self.connect(self,SIGNAL("move"),self.moveDot) self.connect(self.timer,SIGNAL("timeout()"),self.timeout) self.timer.start(20) def timeout(self): self.erase();self.draw() def paintEvent(self,event): self.draw() def closeEvent(self,event): print 'Waiting for wiimote to disconnect...' try: self.wiimote.join() print 'Wiimote has disconnected successfully!' except: print 'Wiimote object could not be properly terminated!' print 'Closing app...' def moveDot(self,delX,delY): #self.erase() self.posRed[0] -= delX self.posRed[1] -= delY #self.draw() def stretchDot(self,delW,delH): #self.erase() self.sizeRed[0] -= delW self.sizeRed[1] -= delH #self.draw() def erase(self): self.paint.begin(self) self.paint.eraseRect(0,0,self.width(),self.height()) self.paint.end() def draw(self): self.paint.begin(self) self.paint.setBrush(self.boxColor) self.paint.rotate(self.angle) self.paint.drawRect(self.posRed[0],self.posRed[1],self.sizeRed[0],self.sizeRed[1]) self.paint.end() def handleWiimoteReport(self,report,wiiref,tmp): rptIR,countVisible = wiigrab.getVisibleIRPoints(report) curIR1 = rptIR[0] curIR2 = rptIR[1] delX = 0 delY = 0 if countVisible <> 0 : if self.oldCoords[0].size <> 0 : delX = curIR1.x - self.oldCoords[0].x delY = curIR1.y - self.oldCoords[0].y self.oldCoords[0] = curIR1 if curIR2 <> None: self.emit(SIGNAL("resize"),delX,delY) else: self.emit(SIGNAL("move"),delX,delY) else: self.oldCoords[0].size = 0 if __name__ == '__main__': app = QApplication(sys.argv) frm = VirtualObject() frm.show() app.exec_() Source Files/.svn/text-base/runPaddleWar.py.svn-base0000555000175000000000000004053511434731104021267 0ustar asimroot#----------------------------------------------------------------------------- # module name : runPaintFire.py # author : Asim Mittal (c) 2010 # description : Imitation of the Paddle war / Air hockey game. Allows smooth # and simultaneous control by two players # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys,wiigrab,wiipoint,math class PaddleWar(QWidget): #--------------------------------------------------------------------------- def initWiimote(self): """ initialize the wii remote here """ try: print 'Press buttons 1 & 2 together...' self.oldCoordsIR = [wiipoint.IRPoint(),wiipoint.IRPoint()] #this member tracks the reference coords of the IR points self.wiimote = wiigrab.WiimoteEventGrabber(self.handleWiimoteReport,0.05,self) #create the wiimote object and set the callback self.wiimote.setReportType() #set the report type to default (send all reports) self.wiimote.led = 15 #let all the wiimote LEDs be on self.wiimote.start() #start the wiimote object thread except: #the wiimote could not be found, or that port is blocked/closed QMessageBox.critical(self,'Connectivity Error','The application could not find any Wiimotes. Please ensure your device is discoverable and restart the application') #self.close() #sys.exit(0) #--------------------------------------------------------------------------- def closeEvent(self,event): """ event is called when the application closes down """ print 'Waiting for Wiimote to disconnect...' try: #this routine ensures that the pipe between the app and the wiimote is #properly disconnected self.wiimote.join() print 'Wiimote disconnected!' except: print 'Wiimote object could not be located!' pass print 'Closing App...' #--------------------------------------------------------------------------- def initWindow(self,xOrigin,yOrigin,width,height): """ initialize the main window and create the painter object """ self.setGeometry(xOrigin,yOrigin,xOrigin+width,yOrigin+height) #set the window geometry self.setWindowTitle('Paddle War') #set the window title self.setAttribute(Qt.WA_PaintOutsidePaintEvent,True) #this attribute is very impt. allows us to paint without using paintEvent self.paint = QPainter() #create the painter object #--------------------------------------------------------------------------- def initGameObjects(self): """ initialize the various parameters needed for the gameplay """ self.sizeDot = (10,100) #the size of the red/blue dots self.sizeBox = 20 #size of the object box self.posRed = [50,(self.height()/2 - self.sizeDot[1]/2)] #this is the starting position of the red dot self.posBlue= [self.width()-50, (self.height()/2 - self.sizeDot[1]/2)] #this is the starting position of the blue dot self.posBox = [self.width()/2, self.height()/2] #this is the starting position of the object box speed = 10 #the speed at which the object box moves (in pixels) self.boxSpeedX = speed #set uniform speed along both x and y directions self.boxSpeedY = speed self.boxColor = Qt.darkMagenta #set the color of the object box self.scoreRed = 0 self.scoreBlue = 0 #--------------------------------------------------------------------------- def __init__(self,xOrigin,yOrigin,width,height,parent=None): """ Class constructor - this is where the app begins """ QWidget.__init__(self,parent) self.initWiimote() self.initWindow(xOrigin,yOrigin,width,height) self.initGameObjects() #this is the application timer, that is called every 40 milliseconds. The game engine runs through this timer self.timer = QTimer() self.prepTimer = QTimer() #the prep timer gives the players time to make adjustments self.startFlag = False #a few event bindings self.connect(self.timer,SIGNAL("timeout()"),self.timeOut) self.connect(self,SIGNAL("draw"),self.draw) #this redraws the red/blue squares and the line between them self.connect(self,SIGNAL("moveRed"),self.moveRed) #this repositions the coords of the red dot self.connect(self,SIGNAL("moveBlue"),self.moveBlue) #this repositions the coords of the blue dot #start the game by starting the prep package self.timer.start(40) self.prepTimer.singleShot(6000,self.startGame) #--------------------------------------------------------------------------- def startGame(self): """ this routine sets the start game flag indicating that the game is about to begin """ self.startFlag = True #--------------------------------------------------------------------------- def timeOut(self): """ this is called by the application timer. It is the game's core logic. There are three major tasks to take care of when designing this routine. Animation of the objects (erasing the screen and repainting it), collision detection of the ball with boundaries of the window, and finally collision detection of the ball with paddles. """ if self.startFlag == True: self.eraseBox(self.posBox[0],self.posBox[1]) #start by erasing the object box off the screen offset = 5 #this offset is used to create an invisible boundary near the edges of the window #the scoring is done by touching the opponents boundary, so every collision against the #right or left edge of the window leads to a score by either player. if (self.posBox[0] >= (self.width() - offset)): self.boxSpeedX *=-1;self.scoreRed += 1 #red scores - ball reached right edge if (self.posBox[0] <= (offset)): self.boxSpeedX *= -1; self.scoreBlue +=1 #blue scores - ball reached left edge #the top and bottom edges of the window only cause the object to bounce about - so that is how it is done if (self.posBox[1] >= (self.height()- offset)) or (self.posBox[1] <= (offset)): self.boxSpeedY *= -1 #now collision detection against the paddles is very important. The red paddle is on the left and the blue #paddle is on the right side of the window. Therefore, the right edge of the red and the left edge of the #blue will be the two paddle faces, or contact areas. so getting the edges of each paddle face is the first step height = self.sizeDot[1] #height and width of each paddle width = self.sizeDot[0] #now we get the x coords of the Red paddle's face. Since the paddles are vertically aligned the #x coords remain same along the paddle face. the paddle moves only along the Y coords - and that means #there is a range of values it can take along the Y axis. this range is nothing but the points along #its height xEdgeRed = self.posRed[0] + width validYRangeRed = range(self.posRed[1],self.posRed[1]+height) #similarly we get the x coords for the blue paddle's face and its corresponding range of values #along the Y axis xEdgeBlue = self.posBlue[0] validYRangeBlue= range(self.posBlue[1],self.posBlue[1]+height) #now to detect a collision, all we do is simply check if any of the points lying on the object (ball) #coincide with the paddle faces (red/blue) collision = False for x in range(self.posBox[0],self.posBox[0]+self.sizeBox): #scan through all the x coords for the object box for y in range(self.posBox[1],self.posBox[1]+self.sizeBox): #scan through all the y coords for the object box if (x == xEdgeRed) and (y in validYRangeRed): self.boxSpeedX *=-1;collision = True;break #collision with red paddle face if (x == xEdgeBlue) and (y in validYRangeBlue): self.boxSpeedX *=-1;collisoin = True;break #collision with blue paddle face #this if clause prevents further computations to be made in case the collision was detected if collision == True: break #now all the math is done, its time to move the object box (ball) to its new location self.posBox[0] += self.boxSpeedX self.posBox[1] += self.boxSpeedY #all this while the screen was cleared, now repaint the screen with the same objects #only with different positions - thereby creating the "animation" self.draw() #--------------------------------------------------------------------------- def moveRed(self,delY): """ alter the position of the red square """ newYPos = self.posRed[1] - delY if newYPos < self.height() and newYPos > 0: #check if the movement puts the paddle outside window boundary self.posRed[1] -= delY #if not, then move the paddle, else do nothing (keeps the paddle locked) #--------------------------------------------------------------------------- def moveBlue(self,delY): """ alter the position of the blue square """ newYPos = self.posBlue[1] - delY if newYPos < self.height() and newYPos > 0: #check if the movement puts the paddle outside window boundary self.posBlue[1] -= delY #if not,only then move the paddle, else do nothing #--------------------------------------------------------------------------- def eraseDrawing(self): """ Erase the drawing. The form is repainted and the graphics are wiped clean. This is important as it creates the illusion of "animation" or "movement" """ self.paint.begin(self) self.paint.eraseRect(0,0,self.width(),self.height()) self.paint.end() #--------------------------------------------------------------------------- def drawBox(self,x,y): """ this routine draws the object box (ball/puck) on the screen based on x,y coords """ self.paint.begin(self) self.paint.setBrush(self.boxColor) self.paint.drawRect(x,y,self.sizeBox,self.sizeBox) self.paint.end() #--------------------------------------------------------------------------- def eraseBox(self,x,y): """ erases the object box (ball/puck) from the last known location """ offset = 1 self.paint.begin(self) self.paint.eraseRect(x,y,self.sizeBox+offset,self.sizeBox+offset) self.paint.end() #--------------------------------------------------------------------------- def drawRedDot(self,x,y): """ draws the red paddle at the specified x,y coords """ self.paint.begin(self) self.paint.setBrush(Qt.red) self.paint.drawRect(x,y,self.sizeDot[0],self.sizeDot[1]) self.paint.end() #--------------------------------------------------------------------------- def drawBlueDot(self,x,y): """ draws the blue paddle at the specified x,y coords """ self.paint.begin(self) self.paint.setBrush(Qt.blue) self.paint.drawRect(x,y,self.sizeDot[0],self.sizeDot[1]) self.paint.end() #--------------------------------------------------------------------------- def draw(self): """ draws all the game objects on the screen - paddles and object box and score """ self.eraseDrawing() self.drawRedDot(self.posRed[0],self.posRed[1]) self.drawBlueDot(self.posBlue[0],self.posBlue[1]) self.drawBox(self.posBox[0],self.posBox[1]) self.setWindowTitle("RED:%s\tBLUE:%s"%(self.scoreRed,self.scoreBlue)) #--------------------------------------------------------------------------- def keyPressEvent(self,event): """ allows the keyboard events to control paddles. Blue (up/down) Red (W/S) keys""" increment = 10 delYRed = 0; delYBlue = 0 #check for movement on the keys for blue paddle if event.key() == Qt.Key_Up: delYBlue -= increment elif event.key() == Qt.Key_Down: delYBlue += increment #check for movement on the keys for red paddle if event.key() == Qt.Key_W: delYRed -= increment elif event.key() == Qt.Key_S: delYRed += increment self.emit(SIGNAL("moveRed"),-delYRed) self.emit(SIGNAL("moveBlue"),-delYBlue) #--------------------------------------------------------------------------- def paintEvent(self,event): """ called initially to paint the screen """ self.draw() #--------------------------------------------------------------------------- def handleWiimoteReport(self,report,wiiref,tmp): """ handles the events from the wii remote """ rptIR,countVisible = wiigrab.getVisibleIRPoints(report) signals = [SIGNAL("moveBlue"),SIGNAL("moveRed")] scale = 2 #if the maximum number of dots visible are 2, do the following if (countVisible > 0) and (countVisible < 3): #for each visible dot, perform the following operations for i in range(0,countVisible): #if the dot has some coordinate info if rptIR[i] <> None: oldCoord = self.oldCoordsIR[i] #save the old coordinate reference for this point curCoord = rptIR[i] #save the current coordinate for this point if oldCoord.size <> 0: #if this dot is not moving from rest position delX = curCoord.x - oldCoord.x #then compute displacement along the x and y directions delY = curCoord.y - oldCoord.y #displacement = current coords - old coords self.emit(signals[i],delY*scale) #tell the associated dot to move/displace by the same amount #scaling is used so that a small movement of the IR point can effectively lead to a larger movement on screen self.oldCoordsIR[i] = curCoord #save the current coords as the reference for the next comparison elif countVisible == 0: #cannot see anymore IR points, rest the dots self.oldCoordsIR[0].size = 0 self.oldCoordsIR[1].size = 0 #--------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = PaddleWar(100,100,800,300) frm.show() app.exec_()Source Files/.svn/text-base/runBounce.py.svn-base0000555000175000000000000004524511434731102020640 0ustar asimrootimport sys,math,wiigrab,wiipoint,random from PyQt4.QtGui import * from PyQt4.QtCore import * class Bounce(QWidget): def initWiimote(self): """ initialize the wii remote here """ try: print 'Press buttons 1 & 2 together...' self.oldCoordsIR = [wiipoint.IRPoint(),wiipoint.IRPoint()] #this member tracks the reference coords of the IR points self.wiimote = wiigrab.WiimoteEventGrabber(self.handleWiimoteReport,0.05,self) #create the wiimote object and set the callback self.wiimote.setReportType() #set the report type to default (send all reports) self.wiimote.led = 15 #let all the wiimote LEDs be on self.wiimote.start() #start the wiimote object thread except: #the wiimote could not be found, or that port is blocked/closed QMessageBox.critical(self,'Connectivity Error','The application could not find any Wiimotes. Please ensure your device is discoverable and restart the application') #self.close() #sys.exit(0) #--------------------------------------------------------------------------- def closeEvent(self,event): print 'Waiting for Wiimote to disconnect' try: self.wiimote.join() 'Wiimote disconnected successfully!!' except: print 'Wiimote object could not be located' print 'Closing App...' #--------------------------------------------------------------------------- def initWindow(self,xOrigin,yOrigin,width,height): """ initialize the main window and create the painter object """ self.setGeometry(xOrigin,yOrigin,xOrigin+width,yOrigin+height) #set the window geometry self.setWindowTitle('Bounce') #set the window title self.setAttribute(Qt.WA_PaintOutsidePaintEvent,True) #this attribute is very impt. allows us to paint without using paintEvent self.paint = QPainter() #create the painter object #--------------------------------------------------------------------------- def initGameObjects(self): """ initialize the various parameters needed for the gameplay """ self.sizeDot = 10 #the size of the red/blue dots self.sizeBox = 30 #size of the object box self.posRed = [10,self.height()- 40] #this is the starting position of the red dot self.posBlue= [self.width()-20, self.height()-40] #this is the starting position of the blue dot self.posBox = [50,30] #this is the starting position of the object box speed = 5 #the speed at which the object box moves (in pixels) self.boxSpeedX = speed #set uniform speed along both x and y directions self.boxSpeedY = speed self.boxColor = Qt.darkMagenta #set the color of the object box #--------------------------------------------------------------------------- def __init__(self,xOrigin,yOrigin,width,height,parent=None): QWidget.__init__(self,parent) self.initWiimote() self.initWindow(xOrigin,yOrigin,width,height) self.initGameObjects() #this is the application timer, that is called every 40 milliseconds. The game engine runs through this timer self.timer = QTimer() #a few event bindings self.connect(self.timer,SIGNAL("timeout()"),self.timeOut) self.connect(self,SIGNAL("draw"),self.draw) #this redraws the red/blue squares and the line between them self.connect(self,SIGNAL("moveRed"),self.moveRed) #this repositions the coords of the red dot self.connect(self,SIGNAL("moveBlue"),self.moveBlue) #this repositions the coords of the blue dot #start the game self.timer.start(40) #--------------------------------------------------------------------------- def timeOut(self): """ time out routine for the application's timer. Also the core logic of the gameplay this is where the animation and collision detection occurs """ self.eraseBox(self.posBox[0],self.posBox[1]) #start by erasing the object box off the screen offset = 20 #this offset is used to create an invisible boundary near the edges of the window #get the slope and intercept for the line joining the two dots (red and blue). This info is used to create the equation #of this line and determine whether the box has collided with it slope,intercept = self.getSlopeAndIntercept(self.posBlue[0],self.posBlue[1],self.posRed[0],self.posRed[1]) #the following construct is used to determine which dot is at a greater distance from the origin (top left) xMax = max(self.posBlue[0],self.posRed[0]) #xMax will store the xCoords of the dot which is further away xMin = min(self.posBlue[0],self.posRed[0]) #xMin will store the xCoords of the dot which is closer to the origin yMax = max(self.posBlue[1],self.posRed[1]) #yMax will store the yCoords of the dot which is further away yMin = min(self.posBlue[1],self.posRed[1]) #yMin will store the yCoords of the dot which is closer to the origin #the slope and intercept can help us find out what is the equation of the line, but the actual line (visible) on the screen #is only those set of values that lie between the red and blue dots. so the quickest way to get all the points that lie on #the line (and in between the red/blue dots) is simply look in between the max and min values we've just gotten #xMax,yMax --> represent the dot that is closer to the origin, and xMin,yMin represent the dot that is nearer xValidRange = range(xMin,xMax) # this is all the x values that lie on the line (in between the dots) yValidRange = range(yMin,yMax) # this is all the y values that lie on the line (in between the dots) #Now the box is intended to bounce of the edges of the window, the following clauses check for exactly that. The offset #value allows us to pad the window boundaries with a little space creating an invisible barrier off of which the box shall #bounce. So now the box will not touch the window edge exactly, but will bounce off slightly before it if (self.posBox[0] >= (self.width() - offset)) or (self.posBox[0] <= (offset)): self.boxSpeedX *= -1 # right edge and left edge respectively if (self.posBox[1] >= (self.height()- offset)) or (self.posBox[1] <= (offset)): self.boxSpeedY *= -1 # bottom and top edges respectively #following loop checks for collisions of the box with the line drawn between the red/blue dots collision = False #collision detected flag #we basically scan all the points in the object box and check if any of the points lie on the line #if they do, we have a collision. The box lies between (posBox[0],posBox[1]) and (posBox[0]+size,posBox[1]+size) for x in range(self.posBox[0],self.posBox[0]+self.sizeBox): #scan through all the x coords for the box for y in range(self.posBox[1],self.posBox[1]+self.sizeBox): #scan through all the y coords for the box #using the equation "y = mx + c" where m --> slope and c --> intercept, we can verify whether the point #represented by (x,y) actually lies on the line or not. so we basically use 'x' to calculate y and check #if that calculated value is the same as the y value given by (x,y) calcY = int((slope*x) + intercept) if (y == calcY): #on the line... but is it really in the part of the line between the red and blue squares #this is where our valid range of X coords come in handy. if the current point (x,y) lies on #the part of the line between red and blue dots the x coord must be in the range of values #calculated earlier on if x in xValidRange: #x,y is in fact the point of contact between the line and the box xPtContact = x; yPtContact = y xCenterBox,yCenterBox = self.getCenterOfBox() collision = True #now that we've detected a collision, its time to create the bouncing effect, by changing #the direction of motion. For this game, i'm only interested in changing the motion when #the line is horizontal and is either above/below the box. So if the box was coming towards #the line from the top (line is at bottom) and was moving towards the right, then I'd want #it to continue moving rightward only in the opposite direction vertically ie. it was coming #from the top, touched the line, and starts going back towards the top --> so the speed in the #Y direction is simply inverted if (yCenterBox < yPtContact) or (yCenterBox > yPtContact): self.boxSpeedY *= -1 self.toggleBoxColor() #also, make the box change color for every collision #we're done here, break out of innermost loop break #did a collision occur?? if so, then break out of this loop if collision == True: break #after all that math, we now know exactly which direction the box would be moving in, this info #is given by the sign (+ or -) of the speed in x or y directions. Simply recompute the new position #of the box based on this speed (speed is nothing but how much the box is moved in X or Y in pixels) self.posBox[0] += self.boxSpeedX self.posBox[1] += self.boxSpeedY #the new position is stored in the variables, now repaint the window self.draw() #--------------------------------------------------------------------------- def toggleBoxColor(self): """ this randomly changes the color of the box... like a power up or something !""" colorRange = [Qt.black,Qt.green,Qt.darkBlue,Qt.darkMagenta,Qt.cyan,Qt.magenta] #all the colors that we like colorRange.remove(self.boxColor) #remove the current color of the box from the selection process colorIndex = random.randint(0,len(colorRange)-1) #randomly choose some other color self.boxColor = colorRange[colorIndex] #set the color to the box #--------------------------------------------------------------------------- def paintEvent(self,event): """ the paintEvent is called at the beginning and paints only the two dots on the form """ self.draw() #--------------------------------------------------------------------------- def moveRed(self,delX,delY): """ alter the position of the red square """ self.posRed[0] -= delX self.posRed[1] -= delY #--------------------------------------------------------------------------- def moveBlue(self,delX,delY): """ alter the position of the blue square """ self.posBlue[0] -= delX self.posBlue[1] -= delY #--------------------------------------------------------------------------- def eraseDrawing(self): """ Erase the drawing. The form is repainted and the graphics are wiped clean. This is important as it creates the illusion of "animation" or "movement" """ self.paint.begin(self) self.paint.eraseRect(0,0,self.width(),self.height()) self.paint.end() #--------------------------------------------------------------------------- def drawBox(self,x,y): self.paint.begin(self) self.paint.setBrush(self.boxColor) self.paint.drawRect(x,y,self.sizeBox,self.sizeBox) self.paint.end() #--------------------------------------------------------------------------- def eraseBox(self,x,y): offset = 1 self.paint.begin(self) self.paint.eraseRect(x,y,self.sizeBox+offset,self.sizeBox+offset) self.paint.end() #--------------------------------------------------------------------------- def drawRedDot(self,x,y): """ draws the red dot at the specified x,y coords """ self.paint.begin(self) self.paint.setBrush(Qt.red) self.paint.drawRect(x,y,self.sizeDot,self.sizeDot) self.paint.end() #--------------------------------------------------------------------------- def drawBlueDot(self,x,y): """ draws the blue dot at the specified x,y coords """ self.paint.begin(self) self.paint.setBrush(Qt.blue) self.paint.drawRect(x,y,self.sizeDot,self.sizeDot) self.paint.end() #--------------------------------------------------------------------------- def drawLine(self,x1,y1,x2,y2): """ draws the dotted line connecting the two colored dots """ self.paint.begin(self) pen = QPen(Qt.black,2, Qt.DotLine) self.paint.setPen(pen) self.paint.drawLine(x1,y1,x2,y2) self.paint.end() #--------------------------------------------------------------------------- def getLength(self,x1,y1,x2,y2): """ returns the magnitude of the line joining the dots """ return math.sqrt(math.pow(x2-x1,2)+math.pow(y2-y1,2)) #--------------------------------------------------------------------------- def getSlopeAndIntercept(self,x1,y1,x2,y2): try: slope = float(y2-y1)/float(x2-x1) except: #divide by zero, denominator tends to infinity so, slope tends to 0 slope = 0 intercept = y1 - (slope*x1) return slope,intercept #--------------------------------------------------------------------------- def getCenterOfBox(self): x = self.posBox[0] + self.sizeBox/2 y = self.posBox[1] + self.sizeBox/2 return x,y #--------------------------------------------------------------------------- def draw(self): """ draws the entire graphic --> the dots and the connecting line and the object box""" halfSize = self.sizeDot/2 self.eraseDrawing() self.drawRedDot(self.posRed[0],self.posRed[1]) self.drawBlueDot(self.posBlue[0],self.posBlue[1]) self.drawLine(self.posRed[0]+halfSize,self.posRed[1]+halfSize,self.posBlue[0]+halfSize,self.posBlue[1]+halfSize) self.drawBox(self.posBox[0],self.posBox[1]) #--------------------------------------------------------------------------- def mouseMoveEvent(self,event): """ this has been implemented to test the form using mouse click and drag event """ cursorPos = event.pos() self.posBlue[0] = cursorPos.x() self.posBlue[1] = cursorPos.y() self.emit(SIGNAL("draw")) #--------------------------------------------------------------------------- def keyPressEvent(self,event): """ this causes the positions of the dots to be shifted in the direction of the pressed arrow key """ delX = 0; delY = 0 increment = 10 if event.key() == Qt.Key_Right: delX+=increment elif event.key() == Qt.Key_Left: delX-=increment elif event.key() == Qt.Key_Up: delY-=increment elif event.key() == Qt.Key_Down: delY +=increment #the moveRed and moveBlue signals, cause displacement w.r.t wiimote coords #which are opposite to the Qt coord system, therefore the negative sign self.emit(SIGNAL("moveRed"),-delX,-delY) self.emit(SIGNAL("moveBlue"),-delX,-delY) #--------------------------------------------------------------------------- def handleWiimoteReport(self,report,wiiref,tmp): """ handles the events from the wii remote """ rptIR,countVisible = wiigrab.getVisibleIRPoints(report) signals = [SIGNAL("moveBlue"),SIGNAL("moveRed")] scale = 2 #if the maximum number of dots visible are 2, do the following if (countVisible > 0) and (countVisible < 3): #for each visible dot, perform the following operations for i in range(0,countVisible): #if the dot has some coordinate info if rptIR[i] <> None: oldCoord = self.oldCoordsIR[i] #save the old coordinate reference for this point curCoord = rptIR[i] #save the current coordinate for this point if oldCoord.size <> 0: #if this dot is not moving from rest position delX = curCoord.x - oldCoord.x #then compute displacement along the x and y directions delY = curCoord.y - oldCoord.y #displacement = current coords - old coords self.emit(signals[i],delX*scale,delY*scale) #tell the associated dot to move/displace by the same amount #scaling is used so that a small movement of the IR point can effectively lead to a larger movement on screen self.oldCoordsIR[i] = curCoord #save the current coords as the reference for the next comparison elif countVisible == 0: #cannot see anymore IR points, rest the dots self.oldCoordsIR[0].size = 0 self.oldCoordsIR[1].size = 0 #--------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = Bounce(100,100,500,500) frm.show() app.exec_() Source Files/.svn/text-base/boing.wav.svn-base0000555000175000000000000000455211434731104020141 0ustar asimrootRIFFb WAVEfmt U+  qfactdata$ 0AQL`ʩ[A1X Ɏ=tdC|ttsb;D H'H"7ɕ%8VA=`|G<,C'H!c$p A>;qAW3`|0? *Ch|cܘP$Q@i_e7$ Es_3ьύ ɟBev7M[ Cj_Z{Vԣ 9rne} QSV5heZ0hx!,f7QFLJ$p_&F3)5d ! L8H"lSsfκTdY5uj!Uݝ{w_8明 A:`V&^0 b Eŀ NM̅Ք4,F@yo2MV]mr;k=z}z}]Z%}OO]ض/.!e4([wgEe0fV@չOC,;HW?j7bn?/*ُA1Q4/e^^Zl۔KSڷyG竀>%1 @cP&&5}5ޔG/Z_NIA̮QI0Xyjwk'[ =6N+ QOdاrehNձi.#22}8JS¨f5%ϔwlH1=lHY;ܵmffKygv&FR04+Hmp܅6pSQ+9~-djaPUv<-ڥ^AZ} &.ω)[Ԋ6p/g9i~cyrݜzcUlDXb5IL5=m"+E [+J?m:XYdaR=aovkna>;qv dBS'3BiqDeHzjLjbilʞ-0l]b 4bb!_pY'A$,U 0a"9Wzޯ# UFx;Liثc@)a L6xd*FQmVZX1Ed$ѻ2*,t]8Sp uGK&ɚ9@qz )7["m>D&V*"* Ć@G>;fO ѻ#q9xV7f'e3nޜ좒7R3Bc3Ld?O>@0xA*E b7h;RaA M':U4umc}8.9Ttf/c΅C8'>T ,:PӁ2F΍Mu:| $H/!43Rcj̥z SZOY (4u5sgeN_Gu ĢB$iw>N2D haYJڇn~dbAF Bh YM $U-  ,%[*$&Ba4*+bBD(JK&JZ0ĎB&+%#,W}@P+V0*rC@ДގbB":;XJULX O%* İd0R80Ĩ[ [ Source Files/.svn/text-base/wiipoint.py.svn-base0000555000175000000000000000516211432304646020543 0ustar asimroot#----------------------------------------------------------------------------- # module name : wiipoint.py # author : Asim Mittal (c) 2010 # description : This module defines IRPoint class, that contains routines pertinent # to IR points and their abstraction # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import math class IllegalPointAssignment:pass countMaxIRPoints = 4 class IRPoint: def __init__(self,x=0,y=0,size=0): """ class constructor --> creates an object with three basic params: x,y,size """ self.x = x self.y = y self.size = size def __str__(self): return "X:%s, Y:%s, Size:%s"%(self.x,self.y,self.size) def magnitude(self): """ using pythagoras theorem to get the distance of the point form an arbitary origin """ return math.sqrt(math.pow(self.x,2)+math.pow(self.y,2)) def calculateDisplacement(self,pointA,pointB): """ calculates the displacement from ptB to ptA and stores it in self """ self.x = pointB.x - pointA.x self.y = pointB.y - pointA.y self.size = pointB.size - pointA.size def getPointFromReportEntry(self, dctEntry): """ dctEntry is a dictionary entry of the type : {'pos': (x,y),'size': sizeValue} this routine simply extracts the position values for the IR point represented by the dictionary dctEntry """ try: self.x = dctEntry['pos'][0] self.y = dctEntry['pos'][1] self.size = dctEntry['size'] except: raise IllegalPointAssignment def nullify(self): """ make all members (x,y,size) zero """ self.x = 0 self.y = 0 self.size = 0 def scaleBy(self,scalingFactor): """ multiply all members of the IR point by scalingFactor """ self.x *= scalingFactor self.y *= scalingFactor self.size *= scalingFactorSource Files/.svn/text-base/wiigrab.py.svn-base0000555000175000000000000002260711447211350020323 0ustar asimroot#----------------------------------------------------------------------------- # module name : wiigrab.py # author : Asim Mittal (c) 2010 # description : This module defines the WiimoteEventGrabber Class and various # other routines that are needed to work with the wiimote data # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import cwiid,time,wiipoint from threading import Thread class WiimoteEventGrabber (cwiid.Wiimote,Thread): """ Wrapper for cwiid.Wiimote class. The object of this class upon creation searches for the nearest available wii remote and tries to connect to it If none is discovered, then an exception is raised by the class constructor """ def __init__(self,handler,interval=0.001,objTemp=None): """ handler = callback routine which will be invoked and to which every report from the wiimote will be directed. callback routine must be of the type: callbackName(dictionaryRemoteState,referenceToRemoteObj) dictionaryRemoteState looks like this: {'acc': (125, 125, 150), 'led': 1, 'ir_src': [None, None, None, None], 'rpt_mode': 14, 'ext_type': 0, 'buttons': 0, 'ru mble': 0, 'error': 0, 'battery': 85} interval= sampling interval between reports in seconds. default value is set to 100 milliseconds (which allows for 10 reports in a second) obj = some temporary object that you would like to send to the callback routine In the case of a GUI, you can send the form object as a reference to the callback routine using this argument and control various parts of your UI using this reference """ self.eventRaised = handler self.sleeptime = interval self.stopThread = False self.isDead = False self.objtemp = objTemp cwiid.Wiimote.__init__(self) Thread.__init__(self) #------------------------------------------------------------------------------ def stop(self): """ this routine will stop the background thread and no more reports will be generated """ self.stopThread = True #------------------------------------------------------------------------------ def run(self): """ this routine will start the background thread and read data from the wii remote. Subsequently that data will be forwarded to the callback specified through the handler argument of the constructor """ self.stopThread = False while not self.stopThread: self.eventRaised(self.state,self,self.objtemp) time.sleep(self.sleeptime) self.isDead = True #------------------------------------------------------------------------------ def join(self): """ closes the wii remote's data report and disconnects it """ self.stop() self.led = 0 self.rumble = 0 while not self.isDead:pass self.close() #------------------------------------------------------------------------------ def isAlive(self): """ returns true if the background thread is still running, false if it has been stopped """ return (not self.isDead) #------------------------------------------------------------------------------ def setReportType(self,rptButton=True,rptAccel=True,rptIR=True): """ set the report properties from the wiimote. rptButton = if true, the button info will be reported rptAccel = if true, the accelerometer info will be reported rptIR = if true, the IR tracking info will be reported """ report = 0 if rptButton : report = report | cwiid.RPT_BTN if rptAccel : report = report | cwiid.RPT_ACC if rptIR : report = report | cwiid.RPT_IR #assign the final report value to the report mode of the wiimote self.rpt_mode = report #------------------------------------------------------------------------------ #------------------------------------------------------------------------------ def getVisibleIRPoints(report): """ This routine accepts the report (dictionary) and returns a tuple (list,int) the list in the tuple is of size four and contains the coordinates of the visible IR points. The int value in the tuple contains the number of points that are visible. for instance, if two points are visible, then the value returned is: ([pointCoords1, pointCoords2, None, None],2) """ reportIR = report['ir_src'] toReturn = [None,None,None,None] count = 0 for i in range(0,len(reportIR)): eachEntry = reportIR[i] if eachEntry <> None: point = wiipoint.IRPoint() point.getPointFromReportEntry(eachEntry) toReturn[i] = (point) count += 1 else: break return toReturn,count #------------------------------------------------------------------------------ def getNameOfButton(buttonValue): """ returns the name of the button whose integer code is passed as argumnet """ dctBtnNames = { cwiid.BTN_1:"1", cwiid.BTN_2:"2", cwiid.BTN_A:"A", cwiid.BTN_B:"B", cwiid.BTN_DOWN:"Down", cwiid.BTN_HOME:"Home", cwiid.BTN_LEFT:"Left", cwiid.BTN_MINUS:"Minus", cwiid.BTN_PLUS:"Plus", cwiid.BTN_RIGHT:"Right", cwiid.BTN_UP:"Up", 0: "None" } if dctBtnNames.has_key(buttonValue): return dctBtnNames[buttonValue] else: return "unrecognized" #------------------------------------------------------------------------------ def resolveButtons(buttonValue): """ this routine resolves a button value into all the buttons that might have been pressed to generate this combination. For instance, BTN_A = 8, and BTN_B = 4. Now when A and B are pressed together, the buttonValue reported by the wiimote is the sum of all buttons pressed i.e. 12 When you pass "12" to this routine it returns [8,4]. This is true for any number of simultaneous keypresses. if a single button is pressed , for instance only BTN_A is pressed, then simply [8] is returned This routine helps resolve simultaneous button presses on the remote into its individual values """ lstButtons = [cwiid.BTN_1,cwiid.BTN_2,cwiid.BTN_A,cwiid.BTN_B,cwiid.BTN_DOWN,cwiid.BTN_HOME,cwiid.BTN_LEFT,cwiid.BTN_MINUS,cwiid.BTN_PLUS,cwiid.BTN_RIGHT,cwiid.BTN_UP] lstButtons.sort() #obtain a list of all the buttons in ascending order #the following loop finds the first value in the sorted list that is greater than the argument #button value. So [1,2,4,8,16,128....4096] is the sorted list. If buttonValue = 12, then the loop #breaks at 16 (first value in the list that is greater than 12). so basically we will now #work only on the part of the list before 16 ie. [1,2,4,8] as no value greater that 12 would have been #pressed, or else the button value given by the wiimote would have been larger for i in range(0,len(lstButtons)): if lstButtons[i] > buttonValue:break elif lstButtons[i] == buttonValue: return [lstButtons[i]] #this list will contain the individually resolved key codes resolved = [] #the following loop works only on the segment of the list grabbed by the previous loop. starting from #the greatest value to the lowest. So we work on [8,4,2,1] for i in range(i,-1,-1): #now if the sum of items (button codes) already present in the "resolved" list and the current #button code is lesser or equal to the button value, this key would have been definitely pressed #in order to generate the button code that was reported. #for instance 12 was generated, and we're now working on [8,4,2,1], so for the first pass of this #loop, check sum(all items in resolved list) + 8 < 12 or not. if so, then add 8 #here is each pass for the example: # sum[0] + 8 <= 12 --> true, so, resolved = [8] # sum[8] + 4 <= 12 --> true, so, resolved = [8,4] # sum[8,4] + 2 <= 12 --> false cuz 8+4+2 = 14, skip this value # sum[8,4] + 1 <= 12 --> false cuz 8+4+1 = 13, skip this value if (sum(resolved)+lstButtons[i]) <= buttonValue: resolved.append(lstButtons[i]) #return all the values stored in the resolved list. These codes represent the buttons that were #used to generate the given value of the argument return resolved #------------------------------------------------------------------------------ Source Files/.svn/text-base/runWiiControl.py.svn-base0000555000175000000000000001326011433150006021503 0ustar asimroot#----------------------------------------------------------------------------- # module name : runWiiControl.py # author : Asim Mittal (c) 2010 # description : Demonstrates the integration of Xautomation with the Wiimote # buttons # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import wiigrab,sys,time,os #----------------------- Commands for various purposes ---------------------- cmdEnter = "xte \'key Return\'" cmdLeft = "xte \'key Left\'" cmdRight = "xte \'key Right\'" cmdUp = "xte \'key Up\'" cmdDown = "xte \'key Down\'" cmdAltUp = "xte \'keyup Alt_R\'" cmdZoomIn = "xte \'keydown Control_R\' \'keydown Alt_R\' \'str =\' \'keyup Alt_R\' \'keyup Control_R\'" cmdZoomOut= "xte \'keydown Control_R\' \'keydown Alt_R\' \'str -\' \'keyup Alt_R\' \'keyup Control_R\'" cmdMenu = "xte \'keydown Alt_R\' \'key F1\' \'keyup Alt_R\'" cmdClose = "xte \'keydown Alt_R' \'key F4\' \'keyup Alt_R\'" cmdMinim = "xte \'keydown Alt_R' \'key F9\' \'keyup Alt_R\'" cmdBack = "xte \'keydown Alt_R' \'key Left\' \'keyup Alt_R\'" cmdForward= "xte \'keydown Alt_R' \'key Right\' \'keyup Alt_R\'" cmdTab = "xte \'key Tab\'" cmdSwitch = "xte \'keydown Alt_R\' \'key Tab\'" cmdVLCSkip = "xte \'keydown Control_R\' \'key Right\' \'keyup Control_R\'" cmdVLCReplay = "xte \'keydown Control_R\' \'key Left\' \'keyup Control_R\'" cmdVLCVolMore= "xte \'keydown Control_R\' \'key Up\' \'keyup Control_R\'" cmdVLCVolLess= "xte \'keydown Control_R\' \'key Down\' \'keyup Control_R\'" cmdVLCFullScr= "xte \'key F\'" cmdVLCPlayPause = "xte \'key Space\'" cmdVLCPlaylist = "xte \'keydown Control_R\' \'key L\' \'keyup Control_R\'" cmdPptShow = "xte \'key F5\'" #-------------------- create a key map for each command ---------------------- keyMap = { (8,) : cmdEnter, #A (2048,): cmdUp, #Up (1024,): cmdDown, #Down (512,): cmdRight, #Right (256,): cmdLeft, #Left (4096,): cmdZoomIn, #Plus (16,): cmdZoomOut, #Minus (2,): cmdMinim, #1 (1,): cmdClose, #2 (128,): cmdMenu , #Home #now for the combos (4,2) : cmdPptShow, (128,4): cmdSwitch, #B + Home (512,4): cmdForward, #B + Right (256,4): cmdBack, #B + left (2048,4): cmdVLCVolMore, #B + Up (1024,4): cmdVLCVolLess, #B + Down (8,4): cmdVLCPlayPause, #A + B (4096,4): cmdVLCFullScr, #B + plus (16,4): cmdVLCPlaylist #B + Minus } #--------------------------------------------------------------------------- flagAltDown = False def buttonsHandler(report,wiiref,tempref): global keyMap,flagAltDown #capture the buttons that are being pressed, and resolve them buttonVal = report['buttons'] lstResolved = tuple(wiigrab.resolveButtons(buttonVal)) #if there is no button being pressed, and the alt key was down before this #then it means that the button has now been released. Hence alt key goes up if len(lstResolved) == 0 and flagAltDown == True: os.system(cmdAltUp) flagAltDown = False #pick out the key mapped to the following button value, if one exists if keyMap.has_key(lstResolved): cmd = keyMap[lstResolved] #fire that command if cmd == cmdSwitch : flagAltDown = True os.system(cmd) #------------------------------------ MAIN ------------------------------------------ if __name__ == "__main__": #------------------ Create Object, Connect and Configure ------------------- try: print "Press the buttons 1 & 2 together..." wiiObj = wiigrab.WiimoteEventGrabber(buttonsHandler) wiiObj.setReportType() wiiObj.led = 15 except: #print traceback.print_exc() print "Wii remote not found. Please check that the device is discoverable" sys.exit(0) #---- Start the Wiimote as a thread with reports fed to assigned callback---- wiiObj.start() #----------------- Run the Main loop so that the app doesn't die ------------ try: print 'Start of App' print 'Controls' print '------------' print 'Button A: Enter' print 'Arrows: Arrow keys' print 'Home: Application Menu' print 'Plus: Zoom In' print 'Minus: Zoom Out' print 'Button 1: Minimize' print 'Button 2: Close currently selected App' print '' print 'Button B + Button 1: View Slideshow' print 'Button B + Home: Application Switcher' print 'Button B + Right: Forward' print 'Button B + Left: Backward' print 'Button B + Up: VLC Volume Up' print 'Button B + Dn: VLC Volume Down' print 'Button B + A: VLC Play or Pause' print 'Button B + Plus: VLC Full Screen toggle' while True: time.sleep(1) except: #very important call to join here, waits till the wiimote connection is closed and the #wiimote is restored to its initial state wiiObj.join() print 'End of App' Source Files/.svn/text-base/runPaintfire.py.svn-base0000555000175000000000000000570711433150024021342 0ustar asimroot#----------------------------------------------------------------------------- # module name : runPaintFire.py # author : Asim Mittal (c) 2010 # description : Demonstrates the integration of xAutomation and IR Tracking # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- from PyQt4.QtCore import * from PyQt4.QtGui import * import sys,wiipoint,os, math,wiigrab,time,pygame #------------------------------------------------------------------------ buttonLeft = 1 buttonRight = 2 isMouseDown = False cmdStartFire = "xte \'keydown Control_L\' \'keydown Alt_L\' \'key f\' \'keyup Control_L\' \'keyup Alt_L\'" cmdClearFire = "xte \'keydown Control_L\' \'keydown Alt_L\' \'key c\' \'keyup Alt_L\' \'keyup Control_L\'" cmdStopFire = "xte \'keyup Control_L\' \'keyup Alt_L\'" cmdMouseMove = "xte \'mousemove %s %s\'" isOnFire = False #------------------------------------------------------------------------ def moveCursor(x,y): toSend = (cmdMouseMove%(int(x),int(y))) os.system(toSend) #------------------------------------------------------------------------ def handleFirePainter(report,deviceRef,frmRef): global buttonLeft,buttonRight #find out the coords of the IR points which are visible rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() currentCursorCoords = wiipoint.IRPoint(0,0,5) multiplier = 1 currentIRCoordsPt1 = rptIR[0] currentIRCoordsPt2 = rptIR[1] #if the first IR point is visible if currentIRCoordsPt1 <> None: #start the fire os.system(cmdStartFire) moveCursor(1024-currentIRCoordsPt1.x,768-currentIRCoordsPt1.y) else: os.system(cmdStopFire) os.system(cmdClearFire) #---------------------------------------------------------------------------- if __name__ == '__main__': try: wiiobject = wiigrab.WiimoteEventGrabber(handleFirePainter) wiiobject.setReportType() wiiobject.led = 15 except: print 'Could not find any wii remotes. Please ensure that the wiimote is discoverable and try again' sys.exit(0) wiiobject.start() try: print 'Application started' while True: time.sleep(1) except: wiiobject.join() print 'End of application' Source Files/.svn/text-base/runMoveAndStretch.py.svn-base0000555000175000000000000001331311433150004022275 0ustar asimroot#----------------------------------------------------------------------------- # module name : runMoveAndStretch.py # author : Asim Mittal (c) 2010 # description : This is a sandbox app that creates a virtual object that can # be manipulated through gestures. The size of the object can # be changed based on the movement of the IR points # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- from PyQt4.QtCore import * from PyQt4.QtGui import * import sys,irtrack,wiipoint def handleMoveAndStretch(report,deviceRef,frmRef): """ There are two types of manipulations possible on the virtual object (which in this case, happens to be a red square), you can move the object using a single Point or stretch the object out using two points The report from the wiimote is parsed for IR points and then based on the no. of visible points, a decision on the behavior is made """ #get the number of visible ir points from the wiimote report rptIR,countVisible = frmRef.getVisibleIRPoints(report) point = wiipoint.IRPoint() multiplier = 1.5 curPosOne = rptIR[0] #if there are no IR points in view, nullify any old position references if countVisible == 0: frmRef.oldCoords[0].nullify() frmRef.oldCoords[1].nullify() #one point is visible, this will tie up to the movement of the object elif countVisible == 1: #calculate the effective displacement of the current point from its earlier position point.calculateDisplacement(frmRef.oldCoords[0],curPosOne) #scale that displacement by a certain value point.scaleBy(multiplier) #this if clause is very important. It allows us to prevent the object from jumping #from its resting position to some arbitary position that is defined by the visibility #of an IR point in space. When you consider the process of iterative displacement, the idea #is to move the object really gently from its resting point, just like the touchpad works #but the initial value of the old reference is zero, therefore, for the very first call that #is made to this handler (when a point is visible), the displacement calculated is not really #true displacement, hence moving the object in this case is not correct as the object will appear #to jump across the screen. We use the size value of the point, to determine whether the old ref #is nullified, if it is, then we simply skip it and perform the displacement of the object only #when the value of displacement calculated, is a true representation of the movement of the IR point #from its previous position. #if all that was too much to absorb, try this, if you start calculating displacement when the object is #at rest, the displacement value is huge, and that is not true because the IR point has just appeared. #so we skip moving the object in this case and wait for the displacement value to become more accurate if frmRef.oldCoords[0].size <> 0: #if you're in here, then the OLD reference value is accurate, and hence the displacement #which was calculated would also have been accurate redX,redY,redW,redH = frmRef.getGeometryRed() #get the current position of the object redX -= point.x; redY -= point.y #alter this position by the values of displacement calc earlier frmRef.emit(SIGNAL("moveDot"),0,redX,redY) #send a signal to move the object to the newly calculate values frmRef.oldCoords[0] = curPosOne #and this is the statement that makes the displacement more accurate. #we now use the current IR point as the reference for the next displacement calculation. elif countVisible == 2: #if two points are visible, we interpret the motion of the first point as a gesture to affect #the change in the object's shape #we calculate the displacement of the current position from the older reference point.calculateDisplacement(frmRef.oldCoords[0],curPosOne) #same logic as explained above about iterative displacement and how to realize accurate displacement if frmRef.oldCoords[0].size <> 0: redX,redY,redW,redH = frmRef.getGeometryRed() #get the geometry of the object redW-= point.x; redH-= point.y #recalculate width and height #use the displacement to affect the shape of the dot this time if redW > 0 and redH > 0: frmRef.emit(SIGNAL("resizeDot"),0,redW,redH) frmRef.oldCoords[0] = curPosOne #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = irtrack.IRTracking(handleMoveAndStretch,1) frm.show() app.exec_() Source Files/.svn/text-base/runMouseMover.py.svn-base0000555000175000000000000000520111447211350021514 0ustar asimrootfrom PyQt4.QtCore import * from PyQt4.QtGui import * import sys,wiipoint,wiigrab,os,math import xauto class MouseMover(QWidget): #------------------------------------------------------------------- def initWiimote(self,handler): """ Initialize the wiimote and set up the event grabber """ print 'Trying to connect to Wiimote. Press 1 & 2 together...' self.oldIRCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.gestureOn = False self.capture = [] try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.wiimote = wiigrab.WiimoteEventGrabber(handler) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: print "Error connecting to the wiimote. Ensure that it is discoverable and restart the app" self.close() sys.exit(0) #-------------------------------------------------------------------- def __init__(self): QWidget.__init__(self,None) self.initWiimote(self.handler) self.trayIcon = QSystemTrayIcon(QIcon(os.getcwd()+os.sep+"trayicon.png"),self) self.trayIcon.show() self.hide() self.connect(self.trayIcon,SIGNAL("activated(QSystemTrayIcon::ActivationReason)"),self.closeForm) self.connect(self,SIGNAL("moveCursor"),self.moveCursor) print QCursor.pos() #-------------------------------------------------------------------- def moveCursor(self,x,y): curPos = QCursor.pos().x(),QCursor.pos().y() newPos = curPos[0]-x,curPos[1]-y QCursor.setPos(newPos[0],newPos[1]) #-------------------------------------------------------------------- def closeForm(self,reason): if reason == QSystemTrayIcon.Trigger: sys.exit(0) #-------------------------------------------------------------------- def closeEvent(self,event): try: self.wiimote.join() print 'Wiimote disconnected' except: print 'Wiimote object couldnt be found!' #------------------------------------------------------------------------------------------------- def handler(self,report,wiiref,tmp): rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() multiplier = 2 if countVisible == 0: self.oldIRCoords[0].nullify() else: point.calculateDisplacement(self.oldIRCoords[0],rptIR[0]) point.scaleBy(multiplier) if self.oldIRCoords[0].size <> 0:self.emit(SIGNAL("moveCursor"),point.x,point.y) self.oldIRCoords[0] = rptIR[0] if countVisible == 2: xauto.mouseDown(1) elif countVisible == 1: xauto.mouseUp(1) #------------------------------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = MouseMover() app.exec_() Source Files/.svn/text-base/runDualPointDemo.py.svn-base0000555000175000000000000001725011447211352022130 0ustar asimroot#----------------------------------------------------------------------------- # module name : runDualPointDemo.py # author : Asim Mittal (c) 2010 # description : The IR Sandbox is used to demonstrate how two points can be individually # tracked in space. The demo uses the concept of "iterative displacement", similar # to the mouse touch pad that is used so commonly. The mouse always moves from its # current position and you can span the entire screen using repetitive or iterative # strokes # # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- from PyQt4.QtCore import * from PyQt4.QtGui import * import sys,wiipoint,wiigrab class IRTracking(QWidget): #--------------------------------------------------------------------------------------------------------- def initWiimote(self,handler): """ Initialize the wiimote and set up the event grabber """ print 'Trying to connect to Wiimote...' try: self.oldCoords = [wiipoint.IRPoint(),wiipoint.IRPoint()] self.wiimote = wiigrab.WiimoteEventGrabber(handler,objTemp=self) self.wiimote.setReportType() self.wiimote.led = 15 self.wiimote.start() except: print "Error connecting to the wiimote. Ensure that it is discoverable and restart the app" self.close() sys.exit(0) #--------------------------------------------------------------------------------------------------------- def initWindow(self): """ setup the main window and its attributes """ self.setGeometry(100,100,500,500) self.setWindowTitle('IR Tracking') self.paint = QPainter() self.setAttribute(Qt.WA_PaintOutsidePaintEvent) #--------------------------------------------------------------------------------------------------------- def initObjects(self): """ setup the characteristics of two dots on the main window """ self.sizeDot = 10 self.posRed = [10,10] self.posBlue = [10,self.width()-10] #--------------------------------------------------------------------------------------------------------- def __init__(self,handler): """ class constructor """ QWidget.__init__(self,None) #base class constructor called self.initWiimote(handler) #setup the wiimote - assign a handler for processing reports self.initWindow() #init the window self.initObjects() #setup the two dots self.connect(self,SIGNAL("moveDot"),self.move) #assign an event binding for the moving either dot #--------------------------------------------------------------------------------------------------------- def paintEvent(self,event): self.draw() #--------------------------------------------------------------------------------------------------------- def erase(self): """ erases the two dots from their current positions """ self.paint.begin(self) self.paint.eraseRect(self.posRed[0],self.posRed[1],self.sizeDot+1,self.sizeDot+1) self.paint.eraseRect(self.posBlue[0],self.posBlue[1],self.sizeDot+1,self.sizeDot+1) self.paint.end() #--------------------------------------------------------------------------------------------------------- def draw(self): """ draw the two dots at their current positions in red and blue colors """ self.paint.begin(self) self.paint.setBrush(Qt.red) self.paint.drawRect(self.posRed[0],self.posRed[1],self.sizeDot,self.sizeDot) self.paint.setBrush(Qt.blue) self.paint.drawRect(self.posBlue[0],self.posBlue[1],self.sizeDot,self.sizeDot) self.paint.end() #--------------------------------------------------------------------------------------------------------- def move(self,dot,x,y): """ displace the specified dot by x and y """ self.erase() #erase the two dots if dot == 0: newPosX = self.posRed[0] - x newPosY = self.posRed[1] - y if (newPosX in range(0,self.width())): self.posRed[0] -= x; if (newPosY in range(0,self.height())): self.posRed[1] -= y elif dot == 1: newPosX = self.posBlue[0] - x newPosY = self.posBlue[1] - y if (newPosX in range(0,self.width())): self.posBlue[0] -= x; if (newPosY in range(0,self.height())): self.posBlue[1] -= y self.draw() #now repaint the dots at their new positions #---------------------------------------------------------------------------- def handleReportDualPointTracking(report,deviceRef,frmRef): """ this is the callback routine that is used for the dual point tracking demo the principle of iterative displacement is used to move the dots about their resting positions. The routine simply computes the displacement of the IR Points between successive calls. This displacement is refactored and the respective dot is displaced by a similar amount """ #this gets the data for the points that are visible rptIR,countVisible = wiigrab.getVisibleIRPoints(report) point = wiipoint.IRPoint() multiplier = 1 #this if clause is executed when there are no points visible if countVisible == 0: frmRef.oldCoords[0].nullify() frmRef.oldCoords[1].nullify() #if even one point is visible, the stmts in this clause are executed else: #loop this for all the visible IR points for i in range(0,countVisible): #if the ith point is visible (<>none) and there are upto two points visible (since we have only two dots) if (rptIR[i] <> None) and (countVisible <= 2): #calculate the displacement of the ith point from an earlier reference point. This relative displacement #is stored as a wiipoint object in a variable called point point.calculateDisplacement(frmRef.oldCoords[i],rptIR[i]) #scale that displacement by the multiplier - this can be configured to span larger displays point.scaleBy(multiplier) #the following if clause is very important. If the size value is zero, it indicates that the ith dot #is at rest. Now in that case, you want the dot to move smoothly from rest, instead of jumping across #the screen to some arbitrary location. So in the case that dot was at rest, we skip moving the dot #in this iteration of this function. if frmRef.oldCoords[i].size <> 0: #non zero size value indicates that the dot was already moving frmRef.emit(SIGNAL("moveDot"),i,point.x,point.y) #inform the GUI that the dot needs to be moved #this line is also quite important and it saves the current IR coords as the reference point for the next call of this routine frmRef.oldCoords[i] = rptIR[i] #---------------------------------------------------------------------------- # MAIN ROUTINE #---------------------------------------------------------------------------- if __name__ == '__main__': app = QApplication(sys.argv) frm = IRTracking(handleReportDualPointTracking) frm.show() app.exec_() Source Files/.svn/text-base/redsquare.jpg.svn-base0000555000175000000000000034342611427705326021040 0ustar asimrootJFIFHHCreated with GIMPC  !"$"$C"> !"1A2Q#BaRq$3brC%4Sc3!1AQaq"2BbrRҲ ?2c'djxт]TU<&失},2FyU%E0$4=yKǎfexQZ+m{u ثt94jDGFP_H%%EWWm.iGOLAό1A*ҫVBv40L&I!0(h _NX`풪҃g`JsjA0?j=C3ŗ+,&ѻ4iy/kf a ^|Xq!].Mow3A88OLWi ,T7F,Gt}8 }\LbD/#Od kmPkqUZ$r/%rEɪ;sdD&inЍ̂eepZ1îi~,r"H2)kpvk}DgN#o$SD$Vηela xOG "K(< ͢C qZXRYJ֢zPEO&=.JQvE%bⲺ5%*^A.ƯH6:ߨ#d ^.XG?>zc #1r#[rVoUwrMx7b7rRjnIڨDB# QK3UD#VFEqyԺIb I`:TǝIu ,~@ S];eց-pSƍ4 ?pdJeH&u" <Ȋ)+ 9PZ 1XՐ7abIp$ #ײv6*2 QCle-d{ߐ?(Q.;@nqk^4P7cgjܵ @J}@D;Lu;~ !G39Zxkl,ed@v x@<as>rr.L1P6*MI >^%#=t YbgƍѼayf^!CraLҕSJ>d$량SĒ6̨ﺺ\дW~ uCEH!22,J.#'WBL,h~8NAd y-ٮIH 4:@DD>!µ?, n9ƕlQ4XV^ ʎC!Bޫ\l ^<1$1;Koh7~_`rSf,Y7$XOjE6+M %o$! 1}$>I<4Il鞈bh#m:;eTy$Tl |2òaK,-(=`&8y& P<%xV&@bʉ[v-n*">$< #=KF+̗\B1b^x⯒HUI $啷gy@o(:݁`T]zfy74H*`(xGY #LF1habj` ul<`hRbCbw-WF̯RG*cc!()$ 慩hH.HD%PB HHȕOey`5GumJfR#Lƒ00D`l0`=*== r\D՘5lĂSu*,c ` ay$9wHML0@G)&DZd A/L_5 lLZ0@`MŚ!82>N+#uI/ O'aWYcőr];8" S ܩVV1$.H"l1f$H#AE]v"R${_ȩ<zkuIa4E!S"D6S/ek?G:LQ6Z75L<U}dN/m`AV E+BF<4]yr& 3J@,?TEVǠ0 a9"(a1E%`ѾܑFu|<# sb9pNJPW:8 L\#}?0@Cjf!gDe6Ġ?T`kҎ4m#rDcFN@'"dUD9DJ]+I1&)ymx` ~}1;#+nt;(ց<}SH7M﬛KfHqZQ3-CD:)8?p+IuWSs)FrOmh= “I XD&fg-h!.zH +o\,&NBM`+48#yjH"͑h -$g(/xk:lPG1P"J` Ceܐq^Eŋ$"DBfQNuNhGʽqaǐ(*l?ŋ@Ⱥc)u-ڱWP6:v y+T Xg]645r ?PșBs [%@V)eVV2e(F$bẘPdG>:E;gw[ٷ & yneLah4at?nGqa"Hp<s1\0delVQ [&B D|GŞ)Drx(4ETf$Kl2wEQ RH6}$+T!P^јsS[w"5U6ID|QgpE"UBװR=ˑ&jTQv۶Ŋ* m1OJ$01E+3lD4eBK>F$ 7XO͝l @6@bӾBlꣴܐE xɘW@rkBP#c, e˚Ք@~W@XU 75E 2 &P$ l!9*ѡgUI5 !v;ErMj t(]A8߼V@c*d/䆘Ő  '2 Ȳ2b4}xj@% V]8c{APhX 4=Ԩ9 4E s5!ݣG*5/9#-32MutEB͓l 8g;DhdH8V@%6ElTN bעӳf,r j,Ow:ϧ1"g{DfQo!kq2tV5(HVR͐z٧R) (UF[X"68$gEVDl+~*Y"$*H9 +$NJ2%⬓ɺ>GR.dX}V Xzx49%ccvq$%#,VFz&p..*e]RI 4>eVőV ܞBjG,(v4)>W|(3rTB4{Md-ݓq{\G,lc7@0uxN.lf-j.G,(>:C܀b]] 0bٻ6T$0  v6E hL( IcHް NuQN͟#d HpPd-^%H,ۦ"9dH泲Ȫvcخ,tZ,#sYV%Ek$VH'_|]l) Y iÂ56+u=@&f" uyhmQV3YHx?t6#%6FIVIꭰnkbM{ ;,l D4$UWY1]%Ad`FeE,3^DLՒ~d_3( F\$dX@Dkc~n% 3ұ@V&Q!nƮT8\U4J\Yִgߕc RD6Cj:<3#D?6by($m&'E֜ M3=*-$ RlXȠOd /ȟX'eEV58],BM<2ql^3ONhf&x”odǎ~G VHd^3HaǗU% 'R@Xn~G+aI׸(;˸Ak`j]+-" "-㗌 րoL>D aM3 ŏՃMQ:߈;cy6h~Q~]wBhș9ҫ);KBq]Vn%QHX9:DLVJ>B # x5vx^f 6 y>Koo9FF4,,voȨI+f+گSbC;jƇ @l++ oMs f/(>ߴSP@ŒPY-c"Rݠv`XhkU$.~G=4µMFՌ&܍Fu5 _U- ޹I &47nዂ E ,$'(cK ;IѠEȿ鯏$O/ܘ32)Z|y(pH6lXd3%8b;RٚӪVhdU,pt!4 H#C z\Iv^aLpDKA}^ c6/tcb|yrFy)TdWX s;Y`H!cj8Ia$`V K; V‡r Wȑ;R 3T-PI4H4J&\LxNHª.]6ڛcH@g_ecς!YSfY[HQNycth%HX/K+ !$9 m"@ G$Yoԙ(nш_P k|IS`QfVDyi{YN⠣a` A'lmXiD!XPQ??}[ WH1̛#&C)4aҧ ' PUU5FtP] k`HCsUѸ8ڀ} ry& 4 /mQ0* F樢tzrB2d lc9)ն 1,o&r%QD*NP?\b2D1ف׭\ 9si≌n;B):6>?g[S̲F#&<źD1-n_e^8&ƅFLш({s/ c}ie42RÆBcH#'2BG###yPĸeb;~*|#,Aߙe#F6Ԁv W5$H,R1 Z *S<:ZǑLrGcbXk< 5Xlh˘Fk$] _x0# )J!J)+ͭ Xr L K3y[X6+x_yc;fG e  K(Acb27%*5IA@ZcI y纟"ؖRPJ,d,ϡ" I%ʆ8ey3gl@ G4?c4X܊AjqoLI3&T2BY:Aم{Ⱥr`"i$xI"j Dj#^-$C@e6Gh:Z%J Xj W/(L{oS`Ty BYFC%/<4U̬,C=Xj4ph`H6\ b|vCh"V,IРaVHN)j:=J ]hBL9Ϭ.yCv`~4 `{A,myXHՁ`z2Zmس.1r^ӑM쾪h PI|B$ʼ}Ap ɪ%vn P#Ke1<J!! p)E_HyBȳAB G*Z MIQG /jI*|4J]5] Ac%V6!bF"G#ѫ$S(XJ*X5pq KZ tW^zTDXIKE)[ p H$]L9(XRU1)=:|w1*CrM*i,T=pAƛ0%HXX*V; x|zaclMzqȗ;B؟r & ˑ,DVi [$nbZ ɘ^\- ύ ȍAW{OV@ƨW*u#'1-RTxO$˴fG*`9'9+wE$&6ADMƞh2MnlB `'EkA&><Ӥ+Tk RCGPVK&MF{nSbI)+vuk],hox ȓDW,8`^P*ɋ, ݛ4Ya*]jJ׿]>=ӳ eٙH/ځ"'̱ yϤycI&TtdHU@ SK4Qʔ%t,}$|FǓP6ih|bhaݕULb8ҁkUQqUD4PUǎl,BqnoH UQ!6 Hp!>ٶ@E^3/ L^ 5d-a} кG0ʐ$1c`OC^du|X3 0YIv@54rc1eI:3{\zeh#GmK l@}Kp#6h[퍷jF 'Ē$H5Y{ah3^p>kXS2(֬hBNxACN,M\~_7+{RM)C5 ߦLI7ڂtD4^\D5ϾESƕy"TMA,B? , %q?8ݮ LMsVSd(!RͰ(xbM8t̍s13"#%KQ-)٬O|שUvW,HlX+<Ik7p/ḭ4Jfhl  GT51yyc[}*V< XC/#JUFPQU iA]}*~hJ\R2Dn32c, NB(b+7"ȸD7BQJ;=تeH +o3$Rk:]Lu3=*ŋPZ%*'!!hH=(9NX/rǗY&w2m 0Hmj18V`Cɷ"N*8x凴f. "a;VWJM63EqkLDBu,4z<ǶtHC*/eMk>\@YUX΢7\ lCw4/iF9M({'dcI($,h87&5_]Y8+XaH O3Y&R$Q 8_]1D][([2ƘxوVRl]YP'$]&,*{ j$]'̓1t $ E! {8 5 @<l+\RYQI#mIKH+XM#Di_*? #<Y4Ѱ%15 `rPTx}B<W+gN%* }qEV593B2d|XfO[W Uoӓ'.x> 4lFnQ#ޢ`,3ıi!ϷnK e\lQ"9TQ$6OvM-Vc<ȫ#1WI$a-n3~MuY .(g( ^.ګ޼R Qs";SJ|ٯ+:Zc2PtJ ]x+/-ORqک6=b4{ 3ƭZȪ6+E13'LR7lhvV|&Fk"07$D hXh$X"dY7YT݈UP(ȷA((8VeY% 6pEQ$G+G⺲+&)C )[g[*=qwD{QR`GIxr6rFV0CKW%9"\ ةP,(A<(U]FQcUD@ Oe{!IYq1IgUAlj(.1ׯx#ʒ7"4]Zۖbu-2Qa!6A2%P9S!T*Tq D}>g"K:&]ZDcO=#><ĐC,3hDarǐnOG IL1r;BII]v$PWP7fU6]bcR.oLE€>)3E) diNHx?ř/6+E"32iRĐC`m Z# vSa"UlP@5-0I])c2vFHftJ-v7kI6:2OTx㍴`6#>WQ,c^U戝*pXQ,>l2/]55CR i~;b?ɎU$5W^H)͘Ld!!J].Iy4Er1nN4BC L/.-H5c:VDkApG|xS}n& ^v#{*c̍sYjP[,B Do.ҨYl%Y B<ݕG"h#k#m,lznMuJhG^L JrݖQ*CUTI (|Br%X%j/fH&5}W#!~'캂Y&kny7u&q;N|& rN93X]Inп>\y'aM/mDahd6C"0}_w6| pN )~7X k`$u U$HSG,$%KR>] =s8df0H'b5IZ2Pu>,NLVgbP}`M,LM4)*&%Iq,x3(4dͰ$d$m`(lΈf-۵f_yP[Q@< >ҾTbe;RC&Şx]˝YbpG㐗ubD>ڣd JռQSpf9Igg` KxAbRhw`U5(sL%"W 3#8c|dvJ$rem M@3A9h=0d<\Iē6HƔHA'H'A@ΰ(}~߳4ی~W,8c뻎pX=|vIr)k*/}U$ /f]Xx%1@UXvI,Y–vV@fygX*2 $!uW$@|t";MO^2f"!Gzȑ|x5CUq+B!b$)͸^m O8<~9JTku` '*GWzRGӅQ,Ui Ye!u(_f)l`rba,b5⣆SQ}HE>4F3ڋd6&]]OC,8lы21 ^s I"Mdi&_a47bw!j(+2 #x;-tQbAM^6\wN9YT<<V^D9 c1dWx? uk"ۼ2mXPCtnkb3:pAا!}Խ~S]$zV~,:ug!ݚP0`X(_-bbFrdy(?vw;m=z&s}vTEIij9 ~O v"uqT#wT3< {'69Z1`JHݳbӝ4}TK9܉42W`hpVZ4΀v*Uj]@jZQY< jDD3|&c9 H6#pXuI'b;aA(3GmXIT |B WFPITz4H21CD BL.eg$ۛ51V*])o(P 3"<-|!U"R@Iz"9dFa2(kAx7-F0W;T`H1Ber:O%|UĵXE.F5UrPáTG`I AMW<($옋ɣE);6(]@74YR)AtbРݐ)o4~r}UYq;OQbbYaO$Q'C9 5AECF6(e$h6&Mxx29 CWmBtSþZډwK$aH'AD髳gfL "cPc& 4f%#q뮒F1xhcI U7me hD1ǑYLqI]CIi  ,r1 1g[Foc/$|/-kD {\LlY$"PE4px(Hx#yJYb~T)mƅpA={Qsy$k>cn2G 2ꩱ%p|"4C.5hFӻ3+*!F zF5ҖA d2ehX mM1<,l2!T^(AV Qc-=3cD䤬G#^kWu@ƔGgw*RB5 [dA4ALCc}>H#k/$pig"92 X 噸TnőS ,Fy:I9-^6RQU,$ _4M([hU3 %@V̀[>1[їj@E" шPcy4QY *(!-}'T&Z`N [ހKB,O *9ʋ'Q`I@+Bcb6 _?&S 娕fe4PR@*腭$@R`il[d!w)&?5nʲ6"]27 T#ݕ&}' 1ӸPv.]u ʩvuHڵ S se #nҶD`cHC āe,RiqyIyZNz&1`Gep^yQ`,RW֩|̱ia&VڐZkq9^Tim ,^rǕz,vL#|˜ɹM^Zm H}3$h@Y9J;5 t9dÒF *[7>bn-,YP.5,p*c+ p>6621$ 'Tz>aV eC - U-D`ՃD+ 0#R@ 2%UA#,] kV <\fM훷l.lHGlL; UI>N@YYS&dij.nR8"xrZ@l)kG@6&8g# all(ѵkןu1^C'7 QQPs–??iY̑Ǔ<c,eX74iB([<`CG^4F6 ,,It'rCaʒ@zcybl$k:I,'ܶy>& W1ȱذiUoVV$Vi{O4ʎMC'RxI/"πc%? {T/!@<⠨h+FșR`hїTQaʒj4}Yr x Ұ$ Ո< E59>";I l;LtJ >?]S5Aid i]8[-Dȹ4FmvwE ]F٭2@K< vrx<44I8XoA%0 U!24]Jf@]b5r$X#%RRɛPMwl>\G)- .~VPyhϰ 4jv*eIo4FiV 4ʷu[4df`II"$E"Q6Fl.odl,Ok$g9d&2@ &I{"4K皰6 Zh,# I[eFj"K0}?9rw#|p*][wC`2 2J C0O`rG Lb0B09և%<=p`躓C\@D>㣐VHC k8XK$h#F kV%hv{(-V/}X|i2[2(Q,›sqW]kEI|ow4iY^J쮪]gw=G,]( Q7AE6}t (Ȏ7T =hI8W6YBMH bAq-F!}tD2gcM1oDI l( >c&$>?6*"w;wG4R6@kuR0;r c~$jG|gǞƘdPYH@ʁY+>2L<#Y;gVR V$*uIhur$WBeT =}sm7f|IKc"ˇ C3ƆFHmPG*TY6XMXO̚Q&Sm^εLY\-xxty~l[BS]YKz7|;F@ IF=X Q:FɐGiblVC8jVpؐu<^랍L5S8`瘝pQ>@:<"mIsNLea#UV\8,h8v8c$ Od0`9,2)nˎ@Yf S & lM .2zJ;ؐh'KF;?7K|y"Hc\`[GuRM],ʠ.9sl-ۋ%uRj9q}yjR$5l?O$d9̭Fyyq7SD\lԳ4 RŃ~9g)]VFX%w+o*= ש#ð}U4E 2]AA׬ r2s5J} (bk>6h{6lGyZN(1)U']To/ҐfKM 23aR YF6Ck!zT`Sy{aV"dȨcccj N~ťO#cB0 ݭkA:J, TPM`lY阯:BZ[5$IvɅ$Ud+6P s\7BF=5{PQ]{-f~#7#L <.cgx"I,((v qdtd$YF쌪7}X4 U`z03?ڷq&륹ƽAW] ύ\(Rb#u$E2M5dhy69)Z`E4.뚈š[V 0HE!du\1rx:iD0IH1X.S><cHѹ1X}YO#F,LB0@Sl\?-KRLxOd(,;]W<64+k22E5v7LSdU eO=RqV9s|F{v5D5,Dts CETdzxysdh7ܖMPN|H0Wud6FPH G,8h_+Q /JI٥j],%cɖ 9p$$,;Lg%3#3Ɍ)/JF>!GE8: Ƣ-D ,9Ah..`).@ABqd7C+.h=)PA,Ц3@ pyʕ ec+G#ZيvO<7`b̘+*%HǺXQ,}K FYη7Gƽrr@m$;H$hߥ5q,rHHF+T@@qpw&B y͑bu*$V=-zcwaBL-"iT$>ZpEɊ\ŏ3C$D ڶ֠ $wYSv]#ۊ'4MY& vE)2e%FnEó0SVI= _4ʂi4Ѳ XQ*I<rDC<<~dpH7Ih#.Wʒ/эּ1 O9LruI$f;SJpB]tfe#|TtIr(l E"6hӾC Gc|uU&l.1]9UEbFɊ CfgVxOBt#7i=n|F­< &!9ʌ;;JQ, 9~+48K ),X`h^@>= &Bx`s,Evڭtal[M3'y`!-ܿ"B/gnŃӱ2HrZˊ(ɭ7.Ҝg"7T:$H}= IDd6YX/ׂT T8d'#s!*uZ k#Dga$ msaS|]8WUcO$'G,hBZ*J[ՏTPoв:ܻ?Mrƴi68R)V/q`}6jC'vxcyJ:-ꪒjm+(yLNdec9,yűbaV!׽4ohoňW;G Xג6vxC3j* 5t̘#ǒF*5 m|/4uj9WvZV42;IynYOK˅r2 1$ʆC tHQ>PƸ@}ju#ɘK;Hڋ-%֫k 'ݔ2EB k!- 5TW Nm60$ocoSũ%xFǹxQێG ŒIbΒ2pB5t6Al0,1dK,,kܜ˱U~@@?,s;.uiLj Z[ a"AeRDRmM˖ y:{ `K{MT oZ[Ǔ* 82:ɽϪ V i̬) ~HKL%uܛ(vg>BωA۞Wr򕣏%{1ʮ,ҁ`h{Z=d*Ŵ U@7;(l r5TS@#zL]ыP, Tx{]ݙsdPd$H#mUjU+&$99v-.Řq)NܻbE>Hb#@JƗeص_fddǏL )ԳrJsM &-8!Ȇ}7 OvDg* oMȳ뎲HD˂ 2RW߾X2 iYrIG8S(Kp P,G,@W(U5ǰO R {T-Ny;DYj2ZTxرDxMJh X-?⺨ ƅc0'A¥d4ߕtEGUtq-UU-ZW2<1Ţ:!AS jQO*%hc7I&3%_&͒6lLƈbiBR]M-ɿz(@:[)ɟl|d( `a#TnH@4J&7+&H^4T"ABH'SVM 9`y ;8j՛|Amdf9#Rfb 0Z/\] =5\JAY#wPP/fVKR@ZvXc4y5ZB[QϯĐq l A4}1EymFbIj Ikۢv'J>4ʞ2ƪ+)v;*T 5 Bf`I @֤sJ)UHs+BuOE+{|)&)L0YdQQ<8+u.\s2#nA!*_jMŅg}Q[`8 y|TsfĹDvN΀kcܤQ :3&K4̙2Ջ$_^5\r%S{> Gʮm AkoJGG4}ԑ F{F0]I5q"ToWFSH``ʞI#}%.yr$11!AkHk}Pa[m.2+z$\2ŢHr&p{.{$XQ<譓P%M#dب5b!8ǵN8^$v;9guFoNE@`_Qh#ʹj5Haf$gmI6o?wK,XeYW 9@/zEUH)Eu3\TfDzqDŨ,H:jԊßiUc lHl/kn:D#Fʓ\6,, ?.!M,utM+ ٙ2@yV"\(GۆIcB IThq #e<2("lBb(J.ɮGT"(X߂HY fEgb6ԒHGTfz=At@WE~.VƟJKK&GjA<1\QA#$q2 &׉B1ՅZ ?!4ƌh H >럔Mv#*T KK實怿.MSbAs@j= b4/*v۠hlEU!dƽ9wcI/*]3|lk~ 2c7y1 tI6ߏ5b~jGe1UdG[XP*=9]]H$Y1ɴR6[PԠ2CtR^=ئ`v$ z* "4\ЀzJ')FS}fd&$GHpU1su O#*Me @AcD2xY4B"aGjg G#4̕1^HD@)G=(;MA (z/aqi"@X /G y|q0m1A]y*~M*HV2l$W'dWTM^<9Ο7TC9w+pF+H (X//F)B2d`UAҬ%MZ),c p5"R Že;<֫VrO Jk>Ie1def @4y363{;_RQ$9̛4 H̖b̹eȗ<&I7A$fRJu0xԚujh$3Tx }>J[ xEcE=|;! mMyG\5!j5x@^`Uv)!|B`W=&9g8a1JFwFUŰ^otN&Fev9#-CYhstIm%S.*Tq!bkvvldžYeY;4U[]G@='`B2 A&ñ)%xYԎ\JDO*ITm~ȭEš<1TO@BVA-~ 1*g\petpi8.I$űxIrK=5n=s̐1WYe8De&) S .N`p5Hܲ-D6 j"@?: drYhQYomk}//6&ŝcYX6/L_Rf1.Yٮu 1&$9i\M5BF(( jkWMqS! l,L|Ǎ{_OF {,HAԯ4qkz<VF\̎hhq`nGnM i˅h fYfb=!TมŏK3I$kf8Ic6H+mi{jPUͪ5daw&h& YBX)v&U%"b.4e`CnGߢC-THb7pX`!RUƝ)vMg1LXHS< ἶ?=&) rd.R?AB*a~ë<$@5;714N@$pUE6R E7ハs1/$Q Uc ?@A窢:%IRd`H t,_KIc$xG#{ e6ѦͱۇӺcF,@ /&™ӾꘘİG S6$#03 ʏ8F,C]vaXN@ڕo]MRx`7ꮷy0!TXVO:f6*ŅRڂx"VG A\-rGP5Q@畵@{.؁AF7l*1e@aIR3Ccy?GP#CK"("$`yxjbݐlRIe)'V#Y 3OR^ԧ$$Xr $Gi\)BLKbT˕,Zz/q&=`I6o4VΤpO X&K+VQ} #plCJQ9 vv TY&tȹPc3 %Ǘ*Çbc$'4*][g,e`MWEĆ1C;AhdI,3PW.dL G*dd)Pa-4IV,nT,39;v;E$W3lFy>X=J$sՆ+RvlrA|G!\x r# bVV-4l>];N2tVf@ŐTؠoPޝTYbF%46 тwm|Xɚ,6f&b )]Un~?)2H~"Gj'2 FB@TGf2c`:b‰DVBF2G$w1rYby\}' 쬨# VBlW76VA [>RH14t@Xة`EP%"%x9g {N(-"UXv2G ِA$`RI*xV;Yf.9geD} 7ACzCQgMG'$Ñ$l HsDǡ]Gxw*aP66kl잛ıDwK.v hUb[ ?T!v;vIXw0zJ7z ȧ&IYt'a Bք(5NxI nt -J{o@E""A)+ho -J*gĮ"UV e*koh gtu *; .bS0+ p\ a^$F'b4fcEf=$5 >7dԠP@hCEc!]OjkeWL#ۍIQ#R܋ _'JdzJ.T-䦔滶xBg^~AJ#F)M&3}FCB||nl“DU'h q,Աԯ$v)ǍR(Vӈ \M$ʩFE2pY4Ed_ ˎBє o.Q}[Xd,J#bY6p}r,>yon**c \PD"@E؊ɃV,,k j1Y+nТp6$ GaCL&-T k@Tg^TcJ$j+0#)J N0D1$)K%/>JJO |\QM,<%; y7:"M!cz9/>*AfGsj+I<^v`'%x`R k^6:ssq1;|h8^vri\"by[}sJh`-ӎ*'CX2̲mړqH A3p Z)|Z8]xlhMK-R>I!ڃ-|H܈U9 d#%%A>MaE=kа"JHgO5p$v r@+)i)*!@6Ů~k&cjsrV4IeWBi "cc-+??DA1;c U>ڏA(nLxd2UVЏ 9c3,EF6l@I7|ٲ-Zd0vy*+[$U`M뺯pr2ad[fHOh|_a"B;D岌L HYPg@<XI,Ao6 ,PJݙvr qK-hsʚ,}2=rEaśI`n^#Ҕ jE I#s^ɃtX2c: Q@GW/#R#O4INŌKO'xV=tPʋO$4VP;5!spHae}dH][`6 ?FED/&'݌*H+E<f"߰:c`;F0wH)hXo**Ş:"igmvCenCc ̅6Hv1NyRmu(s^Ou6NB%U٣tx’[Pnd<):gǥ$=;8 Gb'rs*6FQn&غAt>3I t'( PWLm6y@"\C)*ī Au<7T:8q8m{eHCQfvW eae1(@"m-uwc}Ʋ b !#".ĎM NcUnDkUG T]5։ ݥVhPԠlԂy?/Z #Gt&7 PK =͒F?QLxa̙sM \O%4F'Pk8;rrdÄQK>J6U$[*ԓ#0H ALc$j #jRÑ0ʦBƐk@9)C͞oPJ9Ƥ9P8v<ǶoJCY晕R4SO #քAe鯂cVVS#"h>%)M MY27d91G)l=s#F̐IJEqD̚wP{ODBL S?$q ˆEWZ -#˦ÇIӷ'J&)ʁ\aѴ&@$"#BB$Z~lH*RF`PE8a~VHI8GIv59#Ȑln]p2q>hMs sj*es[Kj:GozXGBl (=j#lۦ䡛.,C9FT+2I`r(PM=`SPoyd r$D;dP)FJÜF\qK6܁Z  ?\YZ#]4(E yگڔ̥xpŊUUK8 ~۞oLM(ABA@>&e2"ܲjخ@PB'\!,RU) 5EF cIgrҧi\Lv fpnG&ypI7vhT0쀧B8ޠ86KO$ʈBdr_נ6oF&&\@ F,RR$${  aR̋&(.xmH٫n u3JݴﵕUrIև_RH#Dgk毂|E}L~)+i3wTՔ Z5]LDkd冷ID~$SDK+(VOɢh~$ĈvNڏ>6cw=#ҳQuv;r=PŁg<>Ac6Mz hm3Li'@TPeMZPl=Hcّ!.ڂiS)d*qP Ǹ'4<I䍗ͣE?c [a)D 텈B+904Xlc؂R-6廴H7p@-) k.pFض LRG!`,Q(T %$ZD_Q8q8Dn!V鉻 GB23,Q!$fF54 h]8mk܂ZkUՠyGV!ViXTȒBX5'b}ÊP&Yp4 tB'}r (lwql l]pц c@a"{ uT ^reLL\d31eiV3T((ebV|?OQ X٥p$\gQJ<} #ps|Ij-yPA,H2(VJRHɳrl3Lw `lqHٛ$%J!ʼn!IGI jUXjΒ>A?&/WgKd3^Gى^=2sNT#jvE8xzi"2 C1r7MA,Yqe *,X Jx6vHh&ئgF8Qvv}_sIykz dU jV@A=B։f21lqjF@-WV[u k Vy^ r"c.T_=m+b@䩐K!+&^"#RYԆ/<8qA,K̤ xldU{ݘ$f|dy{Y鑾CEA(`RlljY+`*$q8H_eq n/9Ti1dÉcUVYv[bhZ_"8EIFڔ2D(ɨ>LK1L>"cwX (k\qmĒD~y.6L41ncx y!%-H',(r=FڋH+Û +ԋQh#p}3p'"!+ ڍ rn㫚htƩq٠(@4Xfvfz D7C:]C$㬲,-qSe@KgEh@Ա:<8:GIqgXU?uܐXehBɧZo@H_A##Gۍ WTODۘ hy!K E>6Wߵd)K&5$IjJqǮA"EuM%3Cndq)!ıǻ7`?8 ,|Kͼ1w£A u X8O"}Oh]B $Pd]uǓ&HdcY(QZTm6Á(C9FЙm&Ȏ*M/mU.icS>4$2Due|mW@_LG4L$Q$acV:h7\|ĭ: &|6m:́z93tDb*L3HQ$?xG*7#E{yX*CnYuEuΣc,L쩊cI(0P oev5|͓-Gݒ6j'AdM/dz5S&ts$*<{Xl߉ &kI32(3+ok`Ƨᵰ8Oĝy%wxcZdP,qB(\GH呢Y aK2Qu?'NQHBJةS썖h):2' ѴQ,U^[/.I=Cjt4YwN9  %) >DӲa 0acG`spƍx^UR@$0$-W$Գ4mpy[Rƫ뱡.EN YZ" TEAh'?}NynTRD: D(+A.Fh19bUXTvslIIԁ8s雨 _u$B\( 1wǥ> OPhO!e/69d*ʃ&$!Kwb{dG$F@Q$cP(c3 H&dEY~Y{YSȒyc#>B@Αbōنځra ?3&"G:v%A%ެy Ø\${E&;1]E jqvMߺ69W ׷Z ](~6=RBeI]%Сy(Cv e֤ޥweçvfCˏ*4)!R}1  )ac/+,XRc(bO'ĕP,t,Y% >DQeJE|'!q"%ؒ6亝bhUD}ڻTMŸ;2֠o2ϘH㎕  zV!3"KPw^I'h( |Wk߮&Oѳ+" RaRUnr<Lk^@t&GJݢU pAhrHښQVrcٓLb戢x\I WA3=Ƈ=ϋ$I6=&_!=WŇ<y&5H!5*Mq@r={(tP,o)a:Pjjヷ4:^byLg;5lݛG-r9Yډd UWc|{1 j[-(UsW{4 #BRdE(br߉fby>,ь||b(yQ+ÀjSkvi*9fdE.@K'OŊy3t m,x7~]>wKWٲgeI&iL۱V+L,+Ʌ@6hȢs.YUTv%P*کҨ&] kuK-:HR_fX*3TZ}q}-Upn,I(L,y*4 m?oDԋ[EY$YoMˏ/V 5>"5|o}#!_wE pZO$z7]Gr1D; EWRX2Q7gn=V@L8y0Lz_]F$EiFI©cjK`7' NOCGl|j8<,yh [4}!2uUY\!!v lO~ɵ#9ɇ"*Ȋ*D7/au\l0$_VA1F8Z xm\E;G+H 4TE}jCdA75uKf_^IPBA&>TQ4N^?)0鉋 y;h/S Bco;M6A׏*y ~Keр$3# `_kA8-#b-3*7+*~X&Wɟfƪ$%-[avI.sKXh1d|-qv}{)t7G6=$͌*% 1H}{ %|gn c'I1^7U2PAukP*pMVy2d_>j}~d`sĘMbiK,m,NCEl<`LrTlO&fEGG@W$}}u iA̸3P>0%W^@Uݨ$@/1vJ5_|'ɝOR ՜zf[ ?>>܂Aˍ(Ts2yE.e d@9];.4RG+FY_$-fT@&=ȇ'U ,adxXDN(3!ҙցUp ܒn}nd$yur4VԲ2Pjd@q$XH+m5D1b.;B)dHG3 TdM$o>;]%`93"CQ×)E-? k䷳Hd^1) (3BV6fBkVV87ݕAs3}S9Ǎ%qdө_?ȭ22|ㆣ}-ɅqxJC7@^I:.kw̘G2jhS`3+)y$")p]ue$V8K8;$C v:܍qLj_isvg`8<-$D!- YUݢ.?Ԍ~}9]l]xБ谢h):Spt2"Z[8[P]eY2!LXxЕTf :,:Ē/mFauLހ$*A.M2tXnv8e \k ( kgD#FIe"`w M`x 6^\s㕎mӀqJlA7[5VQE*0$Iy5Y@vv"ʤfhH[Y-C+F>h] 9@r|G4N ,]Ѣmh8q8 ؅]TgzI<8YC"H U5@jKOi;՞81"{x –*.RO'cѝKrG_FKrat^YYI x_MĖ9`S" ?IZ.6 lO /3N;c"8f1a#RfDɞӶ;/SaY"VTk}`Ƭ$_BȬ퐋$Aw0K#"۪Hp̝1xyrb)؀IM@ P=~L3@R"2n(PM}F:MUU,䛧谄aƌ&Y I,|K(׾ +nf@]ld-1*PMp<7G[^jvX2AJ%'8 1+"-4ڹ/K #+qVa!Rrs䱪 ϪKn:E8L0NRλKz7]=oN*E%ݽTdZzHR#FECJB %|AG&r̡-Jo<>8Ch<cc$3Geɸoi&#$tUBEh(M]. WEhbv@CY,7nh)aR=Wq,59FD\oRA!+*r^8p/\"e)j@+%M.\ʑxdH^9ֽ0$q _i bXNZ+~:-8krcLNuFQ}dcKQ9lrBl&`,:@M'<^Upm@Wȣ,`NxVNj4zCA&:t5N`dE)AA yu(329iSQHS`h'.I]$Z&^32anj 2=P Ut [P Sc$z<.k20RcF? _I\HV*0 T@]Ax[&ɐ̡ZhHO $=#8rdž\#HD _b/pƇZW2+#+9.dX$UeeNp):6B$ PF&A$W V\}C>$2dzdՂ,Q:Pv6.-ZY jB9P4ݛ9 &\;eUnKfPT{5?樺XyNG2:vڂŁb#x^\G@J+b|%|'V9N<(L$˪ځdɳ8$)=dLEJV#:OI& x'2FX`,oJ.MrGgFpJ~1 FW$mZߙēf1ED $Ed*/r#oBL\4ܑ{Isyj%Bĝr;DѸ5r12I C8Tt$"")曤oXq-;")y):IЙ*ղk` S&E8Ԇ h< &C͔$1IjmZR ݖ"=uzPcY' E0@OW"KA)i<>DbCqk*W4zϦɅ,6H$ƥ/GKGsZ#Qjװ(7g8'ŌB'Ɗjh]JrMW,yj 14gcqf.:w~& 71#FPLPevSKz{(uU-#:{RXUmMn-X)Ild͙2,2+mG#*7]::hex9\O#Ud\H"-'%$l[T{܍[D P\uAkjT@0}%`IfPLd*Q7fC/jl?,C31GȄN.rEkM'kGI####!qTF(+=VnX)`I,bX` H؀[Œ zj Dp1MbX T]9&/vZIjYXUhCQD]h3%.HYYFذF$&8bȏ42։:8j"(@֙ϗeFn@ǗN"YJb(,Msȸ=.@6`_tR_I~`8'bL? X-C*'[M#5Fb;2BWI! oÎx<׈)Ɩ+*hR»RBۯ*/5g #da+0XG@Jت/4.܅9FƎ)V9k@L^[e<.0:H4Y%7?6O*|r{`DR9`] S(8G"F#m T@y`AVjU%^R)4}}qYxD@u,V(ڪvN:{&f*1FE5ɮ98E )`㠍|*,FϾhٳ9T"a؀`~T}1pHq46B@s`݊"|*F|\I1Jd/%"zaf6wqVN,0uwa#F5!B7Rؚ =Xy CsTrGKQNج364h@_#/dË4'>b XZlGNgYbxLjhX5].D<*^G.r<WR03U &G3b"hQK+ @4MA㎑ 2Ly%# L7 \}'1Js@yTw`W`ȿXKÜ_)'uduX)T"~I8!Θ C͑ U\i''ɌŎ䔻6!gbH$qv4+$N"$AE3QG̓Ըq2 n̄!`eCl 1c&Je! G>l8"|?3 )CN`x) W]$u|ZW?qwU6L/oXbFiCBQ~Mj,F^NuQbtcIV6dz26mP@lOZ/`.Sיi[t6u$o$Xډ$WDTxJI/tQ֛5̀,M* 15,-8K"<Ů,@ vȬ,";=Wt-zzgI }7 kU;4O=9|19S|UM:V r?ˉ MሒZ+_d,+QaGxϏnU0.[PEiPx|M1ԏ)'#r©[o}J%˖uu;u,Kp)#sH(K$5I< l>cDfGA!+4fK?crU)["IL$yC2VJA j14=v-*5! 29PlA}Ǒ& i2g`ZЃD4\gV6 OzkP r,p,(Il `.xZ iGLV+fnV҈4~8u>Z49d5dm@e#" L `6&6IuM7dÌ_42و kQe6Y2%IVR0M&Gl9 ^TI''2 QJYz`U+SuZM*tQ37irRff8`΍, 5W6:uh[k ŋ8mK|o@`t8WD"ᮩP vo// OD*#Lǜ¯j,(*UA4=^KG?0FC@?,42ad: Ŵ u77umW2m}vccƺJJ G:U>k)!aR^BEO"u_s\wqW3Fѐ8͋ dOm|{ԣp ^m8%4+>$M=0o\Sc㙾ehGlp9 ja8q+:g >\)Wܤ#X-mD 6<-4(q 3u#z.ȱcVZ˛,]!XU/$ S؊$W $\wʥ7=Bu|,`LvDCz>-MP6)e[gVSea딘Ị!T I7vހ&ܐ>\#UIonI4WSBLy#X2f$vd(m/+Қ/1d|ә%;r,BֶHJnW)hXՙty6M#,>u<1w%)?s)&` J搓l\I4 TMG9"XX Pı$*HW|9e3<6=1#*{D<% aX, $?uC#t8LzǸNv`\#E7=j6IsC#i <(,=H 4+,!dTS3OBRr}q]wԡ&RG!U:cDÒl ,?zE,V5FE9v*;- ET (]4MG=dr`DŽ2cEPnM(_Cdw2'-}8>d;I# A3,#ć#aleKnb\I;RX5! 1%& G#-0fFDB.9QOߑ5AI>Chhe|YaP7.!mEҐʼ5xI_.Ǜ FР14*8v$-"ÛFѴ}6&BH5DI _$Qt:.IuԪXk A|Cc"gg`(}6'BɓB uEm$qBAekAG6:H弧K8OGm|A^[d\9.#̝G8,M_I8\8U#ތpZ<>A=tl7|/C}q03dvMΌh=":ϩgM4xICmwZ m*^'vmytF x$2†I#yuMF;dϿ@~&47-qXCNbwaҍk{K_lAbEs KϮ|Lybf"Wߦ;6@"tBqM\d7ʆ+Ekx%y…݀x@slI# rށ皰)r1dcH;)"qD6릳@"dcf#c@&@7m$pc'ۅ5즭67T B"rqI)D1C=r"LFD2YRA!@ɲ*|8dcT)5kCEt8$e\' ]{T7uDwb"P, uD]Y}Nm1yjfoVfnLj&$/ hLnX%E6@M}W qRT ^@p QGZs~-+Aef>#>?n"E) /M\ M尚%xPZ" y*6$h>Gug DM[dA,d|lƦV<s܅s"Cj(?՜G<%ۿ:E”#8i241:4'bگsߍ8 vhAU8FtɖzeOգ F~<4X$U##*'RB Y/9C^h@aGmkತ`+$"sTx>3N>2>cGᐱ1hɠI{ Nj![.XI xmE/jVcf82K rx!F"gK̖QIu{GX,Hg MDG:\yOB>NG6- jBb=Cx=><|\\ &0S,7)@n%EK 4dH)-*)6Ha_ )A! v3%P#. G-&jkO<+"8@a}FMy;^:c3م@SI<ҟ\ߙR-.,խVLΝtRq:$zEkF/B=;d`cc<~,$lRO GM&\*Ld WMאu灷 76u81{"20Me ʔ  heiĖLvVA`ꩃ .㦫&TI?ulJ#;%'F2#WI{qP<|rjv˶.j|]UDSxB Úh&k_z>*ٻsJΪn<lmC8$y+R4,0̯LfUT`B ͪlP(H]eL!v"͍Y$bg39RHɆieugTe'e6@ڈH1g]>آ2G{$V Ig 48@oRu"Ͽ=P-.bJ1"hUyHPPb+- X&@$X( A'`?ugˑ{U ,lvpل*1k3qpqr!9`P<1x >j?sń?ĴEW_d[Tz(!^۲)ȑ vyn!k ĝ&Wwbe !흜2ֿ, /a@9a],8X啂Ohŀ93.D94,*YY|YXNBG 7~X ,x#;$ALlM%o}eZ_b $m 1 E=Gta@_남==hz螪<=.I'# IZȡgrI$M2J Ȫ^D@Y +dh >äH3%/YY;$AT0o݁,6RkĒXp!|p̽4%6қk tINJ7"x%i{1P=jW6M>xęu)@$. Z>'#oD!gvgH՝v${@ln,-=.|`peBY <9%ϡՒG"MeIuAUV`I}n#1+eO :$k{,6Z,=&4s2C/OF28=Tvi^̭݊gkV47`y$URxH2tTA_.03TP՛pdH6YKb(z뺝 .alL d1QWGC(1>m܎8 -"m(I"PdPt3 Ņ8 䛽QA8|Y1cBa(xPnhL|lA;=d0X&; 0`&n TFEPN͎,W @'bǏ'&dg*je<.תqFkƗ]A%UJ9mJG re} ݚRAQq=pJT*Eς)fH XHd4׭3)[PIVFLC8$VfRV6x)}fX* :̅  vbEn0pq%aX/UX1&ےMS_#Ph Oҧr%Ɠ:+<"VbE|ꉲ9&,.Pm3cthՃ`T\%Gc$f@L{|O!CQ+V ڋŐZ ץW=U dI! 0kdh,j&SBP2D@1c0? ʁvH'cO$&10,j#_05^4SUʃ>%,IP  PY.$_Q j%`E߾y5yDpA#IPŏuE6;>S>9ǚXl0J `"ef)'E8IF*Q &,E4$xI:D#V7DoR~UUFJ@dV()6X9BS#1do ǚm@* INDb7YVY܋--[@]y]" eU$[ٵ  y joJDdGV6r҃j 5& Ǯ1Cܚyff^R\+M6M)e&OuRfgu IZ-˞lqd~匓#Q Г Q,BGN“&40cFİh[6oHH$P3"]iڟDM) ƛ $.r ud<(H2lHB2VUg O=j͔q WXx#\" u܅cɀO! i H8QIga`cvAE XC( DBh26LQ#4DXp+*8I#3; ,E97}.,`Lce"UeLn臱dy7Ȓ8BIǪ2 xLTW͛F]p!Cq,2 e$ fE< F.T3$$*L /)*ENײ6%':G)%Blʼnⶾ5`I|k!dVdܕp @Ӌ$7x͚V>=tyP3˖$TyGlqdt-#vȏ rɈJC E5ZePP}9L 96`5_$a` VI'+齼fAXV(Z.dw!YUYFbğ4m<Ο) j7CEjH<ŌW;B+y㞩\|JbnU[$oRZWKIBGE`Ү؆&,9D+eQR Zb<%v'Z9) 2@!h[O:e5$G$Ge Xf~^!NƅƤz9k/%xTT<*ƝUVu>,:Q|xSI>@,Z+6"}`8Zch3̵dcc&xDQY_!@kkDZp=$1ZTSk"1i<+оP1;(̚!2aF((k=t2Jr2W~xT exW=֛'&2JLfAl"xP4 0llh%)՛Oi5'ns$bB pPZ n #b+Jr01u Wz NcX}WXݤYI҈(y$e2hU`XT$Q5. r>43@eebF^GG$ЂI%G+25hbra'|tp⃀Y^1v?WaObٓ3^@+BsHʞ$*>x~֩ yX: C z5dmTuU)g XBAjdB>_9;O B&mI@u!>څn^*cf'TQ]A ]WD;Fav]VfYM`vIˤ rH34r0fRh~A n}tc !Wf"{ba,a H3Jßň">id) JmHO<{_&.2R~$C*UUU h*|u$Zi$|- )$+xP=wAa6]hq#N@;0=tƂbř"Ve?@P{欁@O@@idZ Ņ/YنZ(uO;=ž:qwY\dˑ$sA+k:Oѵ$WLE32R[u 8-g3L,2C1 \YnH r%f&z<v])lL'-G搎(97bX2K<ɂ6Zه#Ph񌣡ŝY}sVryTs2GL곕oMRnnIp]: 'k#n+mW@}|K@6CF$7pa`Aи8.1"ԮkRlq`z&C}jYP?9؟&6Dɽ /C+M,s'y;TQ #ÊB)KPGAImq'G+SH/OϢ2E G:LxS5{Rm RLyj>5@Є%,xp"h :ofYoH kaye`RtƪvCqʁR @\)Ζ6bRMB2Bb[`E R~A; #d++Ygnb67q7;j?bX#FZBjI!l׫樚j9\yrYMy ]r 3+6 鉨gκ,Iŗ;(fU<y#6NFtDmRW6Q j@_G?R }i;Ep/P]n*U(jZגZ OٸݞH2qb,J9ɧ4٥dq+ڜQآ6X'`gtwlv;G֧P;zΑ,9 l[WC[r5/oYq Jf6s"xVePM~Nd̍/ ۹#3U=x$TZ!@;ʪ.U\sMe}G&I;,9)[#`lG=ݩ4Il~ħf3Il, /|d0ʆDأz7\`жȒiĪJK!"аjč7A:vST r  jF}ɨM#~dA>/YG [-N̉%yXdgifPQC&9;‰e/ePx5$iGhw9Y*VfV `g/U0¸(ᚉrYJϳdV볒AO#D4/hSk@? D2kLW Eblp(Xf87A80H)#` E/f \db2I$"m>86Y l]ə~ ^ $ ,Iyd)q7f̅*ܖ"Y 9vՏ+U SJ+* k D5\TTL{DDX$ wR,~c6jV$GYbuRhvn8ry2II=B!~$a@Xf2Eځɠ2D=5Sg3G$y"|뎤1#5|xʒY:Cdݒc~&ۛ]ELXd^"f0dQ$YKē%:.X[? Li? 3$i2ŋI*+3 6ltWA$J$CP x7#|@.Ě)r#t*R"jMqȺ4Kb%lyT2) $0ynɡftLĩ@u1%݄I*PeLLS4v֣вؚP'#D$fYhs` }s[߰.|04˽eX5[+rW|J[ L}NIƀf*ގ=dPyǠAO?4a+1YJ|zS|1WBۑa_cn?&HP]~ c&U0HG~K$4 #n*؊WWg4}R+e X!ÓlMSr.@c!i$jJAe"+{T ȏHȉGB#ܨGkԑpA*eh=։Gs'b ̂Ֆ݆X `$wKŊᔱ )/Bث 9}ʒEС\4?.'ҔI$ҴY . i ȰlEsHfA/G4SB9lP kGHh=Pb$BFm<4M20A5ZKHИIf!w #fWqZ2#vQn,C"BdԲFxwP&t,O047>6d ʯd֬EX h++/IRԲt;$}Z\.22:nSd'ڀHB#vT1U?6=BuDN >9=հZP>@>EeU!0l1ݞc2hF@Fqsc ]ݦƹ-Dp UhXgAqU` 28;5ru [z鲧vp㬰FY*'- '1MI6\>Roz{+;tЕ֒sTƂX-9`傈Djo/g*؊)22nRl[ןȽP;0,2إ_|tcģ'icFY]vSJ5VB6 j:uXm'Dȥ #r(V *+5xl)f" \p1QLaMWgb0JY%'<$| lh/ {G6($f@=,Z$Zș(N1RvW抐pU^ı%G=f9YpV`QHGG\9 xj` )o@Of5@J"TT Tltɇ &RՎx#|&gi p,y2d2ضS I1V.hH@?=wKgTeiq`z6=k#z$RdiȬcϒVQ'umݗS <@AG`!dHG]jARPy#٠U̘rB)ҖFx>9^^N8gM)dFfw}C(v(WGTdH,C"w`%CAbHVn*!?F@vE &PeOʬgu)$4N`Sd"5V,)@ E#pBUsU )I21+?< /x u%U "J+ߋ@ts$#Ȋ%'PHj@t~1eORvˡ.# ,xٺǖQH4ST >0'yFV.\4X.@QEx1-) Lu.O $DJݮ$Ś$TuюVY I(vSg(ľY[RW 3&2"h+Τ(f[JWk}#V&L|T6m`^ZuT]'em܍1㝻HLQ,֧(jp" TV0ݨ UH ):̀vdeIVHO6AR Nvk׻mc8H叺Ĭu*X$z)T)z9-GfiMʌ<q; Hԓ} A$zJ22pbi3>;Q ֈ$ɲH%*0aƃ*ɬJeiIuGɣ}rbTqWv$F%R@^@(zf!8Â3 >hcxWDQ4c,xAtݝIQ3RuP*h%Q_ظ.;3Dt>FJ$sgش'7<`G;%,\q*gse޹ɀA2ZT.魂Uyۢo g4Sjɯg6HנȎlOcDS ],:,6oC։9r;X8K2Y *y?&P,QHYZ!I>Ƨ=(x"f( GAu 3K4F$Y B 3F@byOD@"oAEfuІ:/? WcK4k?`#҉6oEPif5P8ꄇBmlqIfFI+P4Hb +>D#F/Y\AycTNJV w5* MɘO;HJlI2l ϲz,xNAa`) RAI*Ċ+?q6u4qߪUclgWe,@r3dI,RE@ΐIrl&fpW:jVt錱*L $2ȄX JG-|<ںdQ}G #xcLɕp 1V6WϾE䜱X8v7&ɮjOo9gV#nIV"-v|a 4?mBL˰kgSB3d*FK6<:;c$,imV6,)͟@x&|gu Lljjnx:*AksQɋ(&]BV`4Hpe L OY Ÿ''OAJEm  % PE3 ʟ*eR8#7/t[5W8"dUXi)Xv* P8:j LA'<YLf:E$<ɗ%df!)D?UŐ rwrH$Fhk*WTRDA0E C^M܆&ʘgbUGd `\zzWixxtvMI cS /.hB ^?{}3!  #LAҹ?Zb| "AUDvM58:#ǁP$Ȟ.ΣEp ɒxQr %u .9hlrdOE$qCUk!H.y]ٙE4?" ,:"2ǶQa/_' NJ8kɑ,[RBa0Ga6u$i 6D ZC!f,46b lXB3@NܦJHSA<@3[Cʞ@*AT*MHaXdS*:Ӽ[ܑ.AJKjAl1Om$9 '<.s%11<] &KMa@Wj^8L'}A(y76<^P H&)2"d"iw,P &,x ĞPwBT_hprF@ ^X؍~+*ᙾZȝ(5pUIXV˂Lc%T""jH GHrF;E.Ia04gkBDOF84$P]U4f1cS20fVչRDqt9bm8YA'pU&RubÐ$ȮUXcq*"KۀDD ,H`ʏn (-iUPPSǏiC$@ ,CIXзȃ}"2K2(ZuC*%1h=ב[PZef"td[;wCݑ@_0 RyC}G0d&(]{~L@Y4ͳ~Pa3T3rJ{eXCn= AvpBBG-H/=Y$|yI܉-#VpH1}f ]1d \d6@ٻwȶ*IÆtUO4S#,IPܟcYOo/r<}qYRHߊ@;?v\ ;%3[)W`A;ሦVWۉeDp#VRv]M_ _IXf2MKa= $S].LĔ:BD+Q }Q?Il3 *(*rd2QdTxX^|c0\aD5gE`E'#\IJ܈:,g~:(رGP~vrXq13PgUjdE6:̌xW4b~ 8IK;4v.MMphO6E??LƎSİHd'Eq#p݉ OY"iB+B ǃ^n$sTHGĸլtW"}c=5?V>'('uPɗi YPkȲȽ!JȰ  W6kfO}.u,SI!Ƌ ed 6:,\,yig@U e?82 L 8,LO ]QFڧ vh`ǖ[$GfDƠ 7\Ӳby `:Ypv>C_2ؘha .f3A/ 1󯶩$始.)@ $ӲKĽIXU2Wkbcf(sd,w3|kaf@56ƒh UvC(^vP%<\--^h Y( ]c#, 2|mEbQP jɲA扚C24MN8vS (a^ʱ%@AZ"tY e;[|&>N>R$(5, 2~++DY+q<+eqh"ś͑"8g%YQŗ]dÑ UFaڬ=-*#]xr,J,RwK]W>C y $jYa2FMhBE,(#HC@2;Î9WHŐ𑨢ગPMOEnhtkcc\+22aIT,OKWY'Hx9yT%{j4FfH$I,,,ʤ2Gv{~@z6,rdLڪ5WG~gngʂ2{-* XÖ-uv[Wg%KP%@S7X41|Xb)CƠ) Ȣlt9l-1JLGDU0ppGz|U9% ,y`h Yu.o`w+ vEB6U YAi4 ʊU+`9e81^ӳ, #nhO#S" &rdpJ0l]YFHE;jͶz ^yhȊ"ANĈ8cD )~W \$^&dQ"wB  HYW4S>/,Ry;L`j[s_4Oc4QG$e!њXuFRA"=7x$̋)]|Ŷ>Z`xf{GgɪNjzz -T Y,ʐ [a@6[ؿ^I% 3A5IwZ#Jx>;J뼊D{sʩ߱d[9fw\%,Z L?"ŘlTH,0T(zlŀh7R-!9ڎoI!v YL'UTeBx (57f1j+eF4JM}tkɀpF 22vUm$(jƞ]얟7'4vhfem_j|&ƙD#IVi"ds:D R9 #_ܬE1"2BXbwWV83* !eg{օfpEAoJZPh@y5ݏg] ]C y  H8K0AjMEzv^Asn.B1":xRlpBn#"?ŷ"ȅ0k7wf[4?ɧ+"w"hʷi´rĐ}/n/a1x3 _z k"ǑVb?izˢc陬%#`@w zBx}c*'^T 2=y#QVdIU<.AP>R H(%ѯԖ։'] P [xjLUch NoSቱI䨃b#t̲=n-TXBW4-$br8ؗPhUjhs;I6cȍtA*5_ăJyjƹcǒcM.S+ _Ǩ4N%hb?yI 4Z"C9/69>X)$ei۸Ā Ynj|T i}Җ9i0&L2a3**VƖ9M߿=:/I@s9xB[RMj6DB\b* oI G?m HIaۈLJ+5j#BfyFL}Ԇ6 ,eB)uCOtICnP_/$lzVVT91_\ MA>6 Zn>.90f,R52*WVzRXXko,^HZASսt #'X.PbOAR@U-!J2?"5^GjvɑGHA!{jU2I˕hdMh^Tفy-͇#w{c:HBD']I oE@663\\wiBĻHԆ $"ى!Y()%[QJ%=.T[bfm-xmkLF+cFRBXQ }8-ucI& 88nhă',C|lY*3?(W1 `LI  ȢStn̙\^SC dBY[zb'1hGǞQG $ 5#"qV@0$ c%F}*1Azqt6X{M(0qRku%l4M'8f!eFʉ%IF-ZlA$V,M\$"1IGAV˚o\VHf"K*F{_nE$οNdɊ9̈D1 `L `Ee9q,R,eo%%+hc XGǰXѥKrOlz5HAG(h.ȋD+co Π<ğUG] S$0N9! k`olI^/x"fBIޱi;-#tB9TgH,]YXOܑ~6|O ,bʑvA6HO=kbvk{Y G`ʻDH w5|Pc/cd&i(f2$dOG*fI!Sϑ$6168 RcYBHaA -: E.N r^Fk[GI=l|\h]13vl̤~A>#KDLPCF"'q!x>!b n;6:&玘,흝y9y)fC"Ê"{$Ƣ{,sdX&jG5Uo#lX&/M1h;MlH>%$ЇY/XkQ4Z'0+xag-%" `jV>=̹UMR)c18hJu?x(Fb, }rVu+=,S.np252 ? _<fsȄ$GFf`Q<mEKIֆ 5C٬6]q"iL'RcnO>G0JɳE R,z=H.s=Pd 9S1c@u` DsMduZ-.\ة KT6#@)3 5KG11F ȬʡQq(Q5hL2}ұ<ڢتI&!|LeK1GZ%W>Xɪ#3ę*Ph9"e\8%L8ڀkc^u6bkxI  eFbkDAybtjo:†HMZMnE~K"™:0m}W_",|P"NZ)bUx4vFxYpg2I 1|S3Ȏv[w fi#^Ar6|I;m5a䤟"QJ\{?'-}8(Ngt-!,dƦ5U<^H::V 28Ĝ$lTIT(t}1ƉuURTWf\Ċ! *CZұ'P/)(cOH;Ap6~ʬvXYbkP^b1Ydȍ^0]Pr l xI`+&i( (+s$lL(d$DQc߳QŌnh ,m\Qsf‚\CY\vƈM,AY#xcI>AHWQĚ i H(eH؂lYHn 2h/z?%!PA ǒEswhZQZ.*!W/$ߪ6H0.䠥FKS `IQ-S.|T&B%Txj=/͙,plqbv Y *$yM UHeI9``ng4K0@W$/pxHW)tw) 't  ܒܖ[ InڡvuDkбtzɑ0r[9ՔaBx|,Qs8!Y7"Hi<",޸&jJs?PRR1by ~ܑf.FV&v@"<~2%PH'lZ6I=̧Gx+DaT3I:A>Tw @(ȬiEA WpCfU1\,{H4وʃ PHp|۲dH.HH,O7p2qxd0IwZ$/ Jȷ?4Kzg\j0 ([kǯCƈcc'nюfEQB?uIޭ+&)O8H *Q4A\YR ʬŤ khS PtPD4 G Qw8 6x̉e.9@)c<#M3 $ nh\>*bq8M!ZpvEj& %ʅt@;ſ!g%ڑIb/;`O:sweep< QdBxq5l!.DuWVuC@Ē zNAf; D# 0i# J> g`E:\IG:%×!DS#FJH~7l@ , |jBR4X1> d װ ! cg|"CZUqk{x'yaV L!R IZj u 8#ct2d.A 6̓ո+dBUHr*t-f z;1RBu(N$QPr4ڬagF^PvS]<&D1amD2j*=9bxƴSw+$ƮqP XN@LIFGq8U |u7s"*ĭ' r A4hMO%+ƹ6 IYfyA=z^Ce;$([ Xj*G} pJDRjg˖Z,9#Ӌ:a0Oth_ƀk u'c 6$46|* XgTFȂFw]WcroҶ6="C&$O!ѣDTݐ?$>&ꝜI(!PZP@q!,oE)Zׂ@c.:OO|".X ߈R/ȆHYQfo]u?tK ^ ARv4(*HnTaXK. / Yy>7,玗,ě ˍ$y 깪5Yiّ3fV2ـO De! $77bhdFi_2#bjx,ht挢NDic*Lo ~C&$hRUKpI6leV\]X,GGtđASeAj06@N7oV E-X,=@塂1q'jGf6O<@VP'<ީ_f\,F[0 @ hf}O# dS$@+$;UBǮm2ylY3F=XK_Po#E"0cFa& 9_Q5R3tI.VSEH)r 4X:3 tȈE!04@*-Co]JB"4jנ]KG5Dś*22k`u|rXk`zł'oq坕NCC,u ֢MkDrH1B yc AĐYÅY"1 $GUQMtm)T#0SEiIyȰ7x+9(1 .T4RاmRts^B$؞Ɖ LmRP]d #\;0Nl?@THJcT8YxƬAr*j#8v q[MЍLZ8YaC' Ʊ_Wi$K!dDP{(Vl}Y ,1M-Jc#crj -*'xUtevN̞JOCH#_By.^xUR#d`ċ*6'E@XUey+u a_6yZv@'PǍ3OB- Iؽ5v91˙0K(<cB*΢>ݥOȇ""-}K]p8/2vgPF R '" dm6#z4JXpݶsL3-,`zv[5b߅ڎdZ:]3pG=?3Ϋ0f2FRb.xWf)ʕ1M c4_ 5}^&T+(FU[rXZeCh,ɂZZDr/2Ifb g b i 7E'{sӅS\i{ڕKfgb8F\A Q‚Ȯ=rM$DN4'txvA@5!6Lew?*p%z>yqWǙ\||GØeQE\< d͉`i_rDEIfg m7`>'mY&DNfe4,h#eVK,zŃHY#y|GH>iC4hHGfxဴ>faF֙X{Q&@-hdy]APk٨}BY 4wɞuyT`'B8دzۤq DOQa<1P#Z tb6$P[35e2¡YdBQ_7E9 :<5Hӳ2%xkSMmfUWXRJݵlvfOj}.eLx&iUE`n97?PɍŊhݝ@u`l(@~f|x Pa )g]@$9Y,>זv1 I`VO>]+r!X-.5)\P[蜄6D. SiaPZh҂aڊ4}&<|$,kЃ޼Wzʚb,>yTF[7Π+.UX:;hti1@#TK;]ĒJl aȠ@$},,#c6љcSdX3#C~.ϧnpn/d5 E kMTJH%VV*O˓cdY ɖhR\HAAUj&'2# tSDUNA |9 Eg;nEqdDNpm("yy͎wcˡՉU6=oaj9N,I+)h׉a[T9&;Q:=1:.[@\>PK3C*+UMroſ xaLәԿl= Z`O:TY! xD!^#4 ^`E?bxfhQb5#ZGD%TXd%,HPU:s 1J'wySk PQ`\28H!#$d%C[&H-Ɠi#H"u:P*6յ^O F+AوH"EP{)ȡc$#hFP,EH*`[t8‘[-. $hRŕ-_ӱǝe\ݝ F:4y7w+D9ԜdÊ)3JwژlukȒ' 4X8< x{ #y1-T.A [$b?F'qz66Xڨ+LFZŃljt?YQyLңQ }m{aƤ %z,q;Hh[kRu,r;GP4zP$t< ʅODH] ʓ{Ri4LHRɯr>AO&u6y&Ow_)e2s$oE504Ag}ByN*$Eb;CQ=>,p#g6 I֗ձke KF5 "fʕc(V} 5m:2A'JMcd"7D)>A5I;bL@?uB3*I.0* Zz+vFM2yO# jqlAr=tIdG6n-LY%xѶ\E͋0M@Y.6_ʔeNj9L"06хVí$s֨Mr5̇ud_dpG0&d2͑*1#^ō<١\|ĒY XQ^`U0 <*RxчׁbsW0I󞷭m$3r3)G1f$~)ɒ$v)BQdVHo`~mecv)S27KFI!9RAaXO ǥ}6Xrc"94K-w( vWV`@\\ݶGN7V$/bث51]i[~Z ,Hؾ(nk EDE9NJUfc &/ Mۚ6}íBYTd;K;ʥ͎lb кk^ʮ*:e($:Dw [c#6 ٖ7U3bB,)V(_1MbYFgiȄH |+4 @ p! @6 bY>$4ߏ֧~6lɍNH@c2+l#Q"A#]'d6H?,qBӁ"I]U`DNC6 z7?s&ƚCSHXA}עm$x2H7*tǞHq]BBT(j*+ʺf6pQ3_/\3V!rAr9lcǏ(,R1YZP]cvn|jZº~ C)MqWk5Ԑh&Y Di-lXϊM䋰j8DVRA6BBӮ ڂ*O69+w]NY XV9:D $0?ۂAŒ9pr'i*ق]!Mj/w̎n܏4D,&V6$pH<ЦjѲE.RxPH l8r|<7Oʍ2A8lD%1,e^G,J-͎@SqJX48u DTx&0ݠ 8OMꌤ|&)yVrA~NCcqrFW P.+FfȘƫ2 oukhO4:oʋ"D ׹&ޠqjMY߭(:o*~vYɝЫDXj0S`XFD: K 6y|VeXcɊ28$"9, "EC%AwPO٨{ Z:ؤljR@Qv>K7FM eڇ~=z*I$= j>Lf\B)lPhƑq_|PT.+4n^~nGhIޞL&TAezolPl&*}c`pMuQ⑍,b@5ǐXR^u/n$3ILȲm?%o.i7GRwd麱E!+2Du(U-7D@M]!bq2G wc ѻQ\M^9 Qx#M6S&\xr61*EHbO!m;fּA}p.,.J*6_<$QGc$ά$L e@v6&3G62 4RڨFƍx-͏ݝc*e2BRM4 镆nX:*cFDKn341fĴȔhimHR} qAUllPc% zy dedAl l-lEdvI34!\x%iSEBEA438)O$HF*,v HMvYeˍtF}Tٻ/' :c)gFMpKʻzWOB0)e6A?T%xTa#. Գr8^ xY`S4ҙelWf$PGe5f2uRhWLlwES: *$a.3f@)dعо*2L{,C*ρ'Ğ:!#T#f}֠5 orHZڀ+LpѳIK RA U_=OV.K>h$@D,0 X*I!>E?q4ZTnNIJIj8yҤ60?G!p剢ے ]ѻ7΋!ș_k `Wꂡ8QcbYFn@ Vj'V ֘(nDkq](#l"DF sKpA (IۦaC4S%9డ"$@< <k QLY~׷)@$Ć$S #+"IXMXBCV3Dxhˤl1Ry|XMgFVhOW&[SP$x~7vrx\^T昢bȎ&+ PА9Mtla 2$8vcw.,tcxr@̉CeT = $F]XX0HlA^]ݿYuǝ˯jKd<_ilVkt>xF݅}eFm |, A؂٨V (q@:|L+wbxG,ibQ_.īL/ ߭ M Gp1Ibe:=#5d5~m^ NӞOQ6zxOKNPB 5?4z<0؜q w){rT.$ry L Ϋ6+AN}5C|Syov$ gRlCeF' TBGω"e`k6B_=g3$D00TSr N@ON%< S_4x1Ģh]yy*ISl%HtǕ :Do.>lp}.C dK?4-ت r ˒I-. `W'΋/%^F!,z6v߰UL}ز`qLT$MߣWisNiYɑNC4Wj<Тfoe?bX@V)%SjT$.>/($Fl @7U\dC$ -N!Q#pdEM9fCع.fTJ *Ä($ y=3&BU)Eq1ǖ< vؼՕC<#R\tlM]Kk\H+QJ iN Er{1Ã.B F^TкLC 2<7aXPK@r@٨$KQKݢ]^R~$-Ye`*LhP+Kmͭq4}Qm㰌'mp|R<h@ Dlh_%Y\$%)G,|uLx,B D1 h-c? )364\lt"h :ȩk\1acnIscLxH hz/>7E*4sRcP` /ȑjG!̤Y:@T|m[=Sʘ1c;ĕ\W(۞V3/_OhDrC1ּG PW,sDx.>Yş"1>;&Xc+6, 4(uFe/IN0.C 79;j:($]C%@צWbɌ9:e(y;)1C@!3xmq&db 5,5.M%l.ߖT ګQ76$ƱC_% YƎ B\E?r72R|XHE>$IQK&3X%XѢ y)^:I؍ Ubj8X/J?ih';uHW%ZX"Eɢ:f<9.1Os` nnIp&>REѷBX=qӎ4KY`h[- vk~5-#-j$:RA|IR:c0C" AQ)݊eQNrr4`iE,v1kd%H| y1xq/Y.>n7v&hvdE;Dȁrc'j[|˒ VхDd5Qo5$$o[ة7^1cA)*iʥ14mZuo56OI9nԌ %x4\%i#uEg:+G_}ؑ6f<sȑ0F,Si @7F뎇KDxiHe7d(x%!&/T,rrr"Vo&fɰlٺ~FD\QXH<:7bܙRCYXT$ ,Mv\ݩ$v$:=l@_Il:N "s4c@fa9@I%]θeP{rl. k];wZ-3?OEIs0{b@䎐(pȮuZ:cdēG+)2]d1#y:Q>+ KL+]p6C41q5|{1E睪ιǧ5K+I4@cohqP8Y6U%avv#V Dq> brm8!F%‹Bv<`O?e pd32ԭlW.&[i tgQ߃ YU{LE"0kD䟅jDX@Y#$ v̎RJ֦ۛʑ,ɰ@߃l8MU4\i"(@N@+[Pe+Y|ޙdĐbK.&ɱcZL֢NM,@q`mjڽ8>L":"i9e[#&h%^QU />ThҊݱW-Ys&EvWr+5V<y pOQCT,tȅhNıE־ZF<>@vaSQ @ԒX>$0 m0uCfGWTذ`_7UP&RIixUYopYxؒ$ Ư\ट< z#2(V 4J U$d]/$_LJQKA@ jA %%2"0Z XrGG&DЅe n$X+ G?bG4H)t}C2+~%XT@ &l?{o.b±O fGziP92$WCth&J% ~Oc3@UIUb$ "怢Gu< A=x>C$6P? P5Wtpk$nJFX UqFҹ@DHJx Hbb,!+vmIsM6.yViS:F G"B X7D8<LTbl)c`]XNdTX¦,UWp_f ^>eEmR"Ab# j Ns̅ID_#urnxr㮹G#xuU Tp|dbC7pUEqµEVrD1ᕆVu z i8vmæoQ TŌYO>AM|paA.Cʯ*)dTO=旛 } @'A$^6#?In݊?@'d/ A XЅ<ɢ:"3G*:Q;4׭xռwh>ו T9;X;AgRFɍ|tyO4R\`IH<_'ƕ`]GTPܭ$7 &@ m0A9^hyYKK(1 ,\ B16YۺX6MX&'VUsH:p\gj9<)BxI7]Q<1lH1@1@[*бvLM aG6ɦu̱b[WNwTi"\Bea  Qt@|϶@gcjAZ٪jYQ>7,2+Y&jfvb ^łiv$X{ 2 fX6 T Nǭ@ N/rJ5uDJNhviUC纟$I#.^+;K#iP7uW=fd?b`!dpTPҀ8"≓#+'DLr\*<j/x:~d,;a01XAj익c5|uCE&4ȧcڐU t$uѯk89ˑDK L_> W]Y{I8G%ılkJҾ#%$uqlP +I-]UU$T+ޣzPE&WN]ܡih8+dcwbщPX kR:Ɨ̪ @al [l 指I2{F~ [Vm,~nHX˘dl4lP*8xD1e._z,PLj)FA!7 =|1K&  !`Բ*0>$ ~^4jΙPJ F{n=Έ )>&C`1 úYgW^@jLX8iXڣ [ bZI69c9!I;}{PTYZ-dlJꅠ*4EJC;piӟg#yge]&uBc`Ye5tlGH3eʎ2gG@h}$WVwX5N0UPՋ< ÿ馻^>2'<1*7mK(%-@4yIEHl`;h XXmyYIk̿p,%eEIz `Ù=*(0"G _VI+^I3*-4M3dDVlUoР>T8%bCQKRJ*4r/]%x"@()fnmv,Op,> *cX$u&Kg )AEW4\dI:ω,RxPmT@+CR` $ɳ+4B5X$y xdGonʏvܐArGML$ˑE9U=P \G" K 5ɕ63c<'ga@$R{?RB$lKDof,A0ɳbY8ݿ*Wb 0 lZrTV* [R=:˧(a.q!8/wT |dcE*6H> oV#ˊzC>3:bA`B6z4i0s$,MOKfclE knoe#Ov)VʓMC.6*GrdG$/&pOWEȎ<ܳHr+e_|DS&(bi),[<1]StW @EP?2{'e @G OXIFBFhV޸F/!8ɇW[cXs]Y,m$g\F AԆSzhFk|Fa%.ücƢFH?㪱F >J[eT Қrl~P`Yq&IYcb$%ni,⽋Y\mԴT$UB2E)ݢ7^@BO21EI!%Ԡ6ǒ|:\ϐʁ@_e}WW8'|hg˃"į-.͊;=T$P-85B\2sP#%viG=c/"[( pI3$h K( #a|#_e1 l6 O6x6yj4_T)#Xpfge1ȱ)"4<4699b}Ɉh A g$sL 4M`G$6ܞXXVI'm+DE7 |8^Pqv~>܉fc#dA םX+)(˕#Ǒܜ@4=,L-B-1S,.ُ$ؿQ|THGޢPx&fAcXދF@^Bǭ)cR/बJGi&O)k.Ėl#`9lrK+r!-&$U%F9#xAY_! H-eFlb9NJaPlȫkP'qK\Kl=gő6uv1B )xEt2L9 ݚlv+| yhX[.< ӄ3)c Yڅƣa$ZPG&.LL)g .R@ثx !pھ5gg0#NmyЮ[)NJF*J@!Xٮ3/fXc wQ-'i%Hڴ[u,WM* D[4"9,e2hlJ@1?@׺\̤ C 9nFF $hjӁo ɿb }DMdElCP[ʩ"H!26uFGo]ɓB;(B\kg ")_d324y0˰Uf٬ !|c44@0 DaO읬Us\i8܂uJ.U]&c\^h 0cJ–E$UVx҉2&1c)(n( #oڐ!h ^ڙU8c2 4AJcA4fH1 5 RP\vm -'%fRּ,[sF6%TǵLvmC B fE(lTU#v! c@4I0F|]ޒF۸H?f 9 ʼyd/#BMmw(8q̝B [q?kn?#b?B7Fȓ&LxUS]H?M = 0ō6TlT!F꡵ؚ4>E~>$cʔh(Y̤rX6%LiCF+j5FG\P$I޶'1$OlQR>a JQI#W+6yo1YeQ/{0F6BQ5dtsb!8iCQſH5}"3EZ#D.UZ€xQZdc);J5Hh Ǐed"1(7Xxؒ:92c2Dܑ!69 74RmrP,VE85?!ǵx7T8oKFJIE4ZSb~ ٪;t*<?(Sa ՞n'Xx˒XЕAP[V.fr(bde^Y#KŋbfbNIj [.r@DYK.ʧ}:MFC<jU1  6EX9evF &"}R6G͟|՞-^*lrK!0t'lXk)Dr[vc$Lb- PP~| O.X}U‰tR@z`~<z#Kf9{{T4x$}E-&OLU3>$r$TX8$ykBu`+HdNxQjhJnQ3@H*~hvxMA,S1APPHT34Zs/sv>v~L`E薽IyP }<],XLyT&6|'x$G׀jl)$qEAD pHȏ%06#FתZ"|rH)]$UmbU9/l"eeT٤O1F;#~ș4j&ُ47Դ <9>3LBU΁ jKrWQ>YqEHdT@K*{V } 5]6R`ώʩ5UI_!]U`17e23gbD--##XR!c0uQJ1i |x}zS^tD%)Vd>!@7y8'V5w<6V!BذvϏ2 J I7jHb<*Y{|,c˸هe<ʏ@攞8@,SBʆ$&0"WUOD-g!# }lWQ[^7,(?eEh*(rSxBj'j>7ޝ~2}a3Ax%hUcR s#~2{Iǒc"ZȔ!|`;=m|9I` RU&q7C4Nl[Lؓ'h@!EE%x'Ŋ~XiH$t9ٱf( DRI Ef)3w:6.ŀjDG@9&#I$d\c )sdRZ!:I<% qh aHcTGZ_MibFUP):(0Y 2<qʲ[h-޾jJ\'OMp-igX!fqV W_$#.͐oXR7ETJ햒6LsGLeNu G$$$OY0;,w7U@XT4Et;Q:H eF- ;l|VEd`qdO"duHiREpwQvA ۵'i0`@ db(CyM-AygorZJ^UuBDA9SQ bYQmŘsmd6(x#C ,6  ^DM'ӣ)NJ<|YȲ5gaXHl*ctU5@;2̶XjZ_Ϯ|_Q&ya}Ba|>lԂ)#|cIl^X%6 ( 9A*ʣ/&e"9cI+BH͝TK˻b VXDXT( I  YM3jT7,TW#~}XM>,Y@`9e#o"Đ S@Z2$Lb2&VXWP9'*j߮ 5%$;fun(x1xPo2.L>2 H+%;.K| P.ꟶ|h:6w`&v@"穾7̛!)GUjkŽEc+M, 3bW'd4( d-\lD<]${= WFG5ϯ $dH:OQ;rĨ}q <$<#,I#r9pdy!Ƿ$]IUX xRV^ԓ@8_0kNv5ԝGeUuk >Ty3", 10U0$b?5晘tUME,f(:VE# ꚮ&]aU_>ὤ E i'O4c]di #ʨH*W@ygdʅ #D؊`E٠'cЬ0wT1G1nCYxYRIzLRZv=|T x5 #d}R מzc 16T"WeEʇ׺$ȍfGc[׺#IH<g졑n._y5l:jן>|y]?y:>UϢ>N_#3E0E)+K_<\<@C"\lmGs@WG3٢l>T-<ynXtD@(qF@;X Fe;>ؑaP@*J> <^A 2d%mdi5:u,x7\ᑑ9ȀqLr:̍1kRCX$xk_I|-IhF-VCY)6CFayLxP<Dr&H7Ʉa [f 0-R,bEx,Eo6x Ě%o5F?eC,e޻2gc۸Kڄ.]b Mp= FhTfC(UH?ok"*a6<}Mt:) l}_&5/]wqA{^4R!YNo- 7v@-aDȆW%̂AxrɆaд8ޖ0 ncY;2wfu,%x(^x+`at>y+\MJFI&FS(#5jAj4O&.a1 AD,IYȫ:Ilv$nJZG @<0QhnL͏c܉ J7D{-tg yb|hrzR.A@KO2B=^/ [r>H"X$dc36 T$0?a@dA*bVT%~E]szX؊&ha(UFIҽ_?ɠ c1ldb&N c*I1+RS Po|66KʡRV~  HPAo+||݆@d;(#o˕}zp24!SDX*)5cAa,`U{vlOd| -R0i?-:[,|CvAV,i$|FXi50$sGl, ؁ѓYr?9V- # |ĆhP:QJ W&A<2!j hlH bX ]Pnj9]rPfz\Ha2"RK.C|6 U˒LVJHmCqX5X6&T,#AIԂNNQG2iʦ+RSdZqv?BuStMG9lK5bBʮU_@ZBf^ɧ?Q#L0٫I*+:/6 3BQPzh\{DcG,Z**#XҒ@܋[VH2.TxGH +I'sN@-®"h3{v'~Sf)R H7 Hg8)2J B1>5$yIT gy J9l0$ػD$z?ۭ-;5_ŔYq摻TKDVc+c <<{J_SAZ7] M8fTx"EiQnY& $ˋ]׻Rx[Վ p]ɤV2$e4mX—Xn=Ph-q/NvcEHyYW]X*G[ ҥI1pS!s46/;@-EA5 dwM !$rk$(ZA| ,}±RHeKE7+CG6 $pC_X2NBQ[&]EdŎ2.Ѷ#]I KGF`G7r\vƏ "Dž7NiI loŇb)H\(ʳջ D~O*Mt2L9/ @j VHSx5@Lo .̺ Y ޕaG *%*VIrc g*9(UWI*g?eL#Ud@7@מ'HVRL i IX6mϠ( S1˃ȧfIu6HВG 9-zHx I到t%!a0ZB)u뚧* Vf#aͩ#^CVNd6.&0)EX`H7rc,;-G|H&ɦAll)GxVژcLO4=@|EOGRDT5ڴq7,NPܧPt&5Rcdb9v,d(>A-# m-{z G>4* 5NX31D #U,^ul|iRE$O6]$. uskSfȫcH$|x @qQ7tݵM;(^HD.n;`d+ʖH 9$X%|y nG$#JǪ0J\HbbEj5W<Wu\?^ѡ\.MwF *tR(/blP 'l?.^3}C/]M^qV+_&=\=1ryylI5G ɾA<ǒѸg%5BKي=Y.MxO uLY̪lXV•|SpgX,Dh獉ڕh'P뺑vhɗcbY$7eH=zY8NG*T ֢oŢAǸFoe4*5Վ{C,MLfg)p^&,l  Wul/3ƪi3d&Wpv=X}/+bڜ &ŏG*`z_C3~(2&YWCH%Tvch%URcɲ $o}P;6 >N_gA6L,Q"UO"t&i@G/}O2,ИޙBȮ7"ϲIJ\'tvXEP]w+]"+||WCOƓ>$#~T)׊5`|߮xwZ+ Y190;6#Lhb{@z}_'8#`͏ĄE֟?" /V ٰ<ccUy|>l˚#5W }w]Q\^sUJɕ v؁۷#kAг@q@3'9o41_^뺉ZkAEB"zhdsHH7#?}''&2FF" HO틍Hd?)Q`vS}Q%S$+vouy\-->Gy}1dޱOk\8bǎPTWܛzȝ!ωea6KB?ģ]tD4WpEd}#9d@*3 YP*Affɓ¬mvE Y @[wPGYd`>hC4&w/dt~+FrqH}1&Dbē 5^Gݽ=1? C C':.MQ@/_?ug@ۆPC܎ <#H,1H1EI/+!Gauhnvޫ>>"'٘I_s}Q RV1$}-Pyl{7|)Yd̄͆onT}6LKtce None: point = wiipoint.IRPoint() point.getPointFromReportEntry(eachEntry) toReturn[i] = (point) count += 1 else: break return toReturn,count #------------------------------------------------------------------------- def moveCursorPointer(self,x,y): QCursor.setPos(x,y) #------------------------------------------------------------------------- def getCursorPos(self): return (QCursor.pos().x(),QCursor.pos().y()) #------------------------------------------------------------------------- def getGeometryRed(self): """ returns the position, width and height of the red dot """ xRed = self.dotRed.x() yRed = self.dotRed.y() htRed = self.dotRed.height() wdRed = self.dotRed.width() return (xRed,yRed,wdRed,htRed) #------------------------------------------------------------------------- def getGeometryBlue(self): """ returns the position, width and height of the blue dot """ xBlue = self.dotBlue.x() yBlue = self.dotBlue.y() htBlue = self.dotBlue.height() wdBlue = self.dotBlue.width() return (xBlue,yBlue,wdBlue,htBlue) #------------------------------------------------------------------------- def moveSpecifiedDot(self,dotColor,x,y): """ moves the specified dot to the x and y coords provided """ if dotColor == 0: self.moveRedDot(x,y) elif dotColor == 1: self.moveBlueDot(x,y) #------------------------------------------------------------------------- def moveRedDot(self,x,y): self.dotRed.move(x,y) #------------------------------------------------------------------------- def moveBlueDot(self,x,y): self.dotBlue.move(x,y) #------------------------------------------------------------------------- def resizeSpecifiedDot(self,dotColor,w,h): """ resizes the specified dot to the width and height provided """ if dotColor == 0: self.resizeRedDot(w,h) elif dotColor == 1: self.resizeBlueDot(w,h) #------------------------------------------------------------------------- def resizeRedDot(self,w,h): self.dotRed.setFixedSize(w,h) #------------------------------------------------------------------------- def resizeBlueDot(self,w,h): self.dotBlue.setFixedSize(w,h) #------------------------------------------------------------------------- Source Files/.svn/text-base/frontend.ui.svn-base0000555000175000000000000002635011427705312020506 0ustar asimroot frmMain 0 0 707 590 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 127 127 127 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 127 127 127 255 255 255 127 127 127 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 IR Tracking sandbox 10 10 16 16 false ../../../Downloads/redsquare.jpg 670 560 16 16 false ../../../Downloads/blue square.jpg Source Files/.svn/text-base/frontend.py.svn-base0000555000175000000000000002445311432304644020522 0ustar asimroot#----------------------------------------------------------------------------- # module name : frontend.py # author : Asim Mittal (c) 2010 # description : This is auto generated source code for the UI of the IR # tracking sandbox app. created using pyuic4 # # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- from PyQt4 import QtCore, QtGui class Ui_frmMain(object): def setupUi(self, frmMain): frmMain.setObjectName("frmMain") frmMain.resize(707, 590) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(170, 170, 170)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(170, 170, 170)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush) brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Light, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush) brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush) brush = QtGui.QBrush(QtGui.QColor(170, 170, 170)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush) brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, brush) brush = QtGui.QBrush(QtGui.QColor(127, 127, 127)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 220)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush) frmMain.setPalette(palette) self.centralwidget = QtGui.QWidget(frmMain) self.centralwidget.setObjectName("centralwidget") self.dotRed = QtGui.QLabel(self.centralwidget) self.dotRed.setGeometry(QtCore.QRect(10, 10, 16, 16)) self.dotRed.setAutoFillBackground(False) self.dotRed.setText("") self.dotRed.setPixmap(QtGui.QPixmap("redsquare.jpg")) self.dotRed.setObjectName("dotRed") self.dotBlue = QtGui.QLabel(self.centralwidget) self.dotBlue.setGeometry(QtCore.QRect(670, 560, 16, 16)) self.dotBlue.setAutoFillBackground(False) self.dotBlue.setText("") self.dotBlue.setPixmap(QtGui.QPixmap("blue square.jpg")) self.dotBlue.setObjectName("dotBlue") frmMain.setCentralWidget(self.centralwidget) self.retranslateUi(frmMain) QtCore.QMetaObject.connectSlotsByName(frmMain) def retranslateUi(self, frmMain): frmMain.setWindowTitle(QtGui.QApplication.translate("frmMain", "IR Tracking sandbox", None, QtGui.QApplication.UnicodeUTF8)) Source Files/.svn/text-base/errlog.svn-base0000555000175000000000000003157411427705310017547 0ustar asimrootasim@asim-laptop:/media/DATA/Code/PyCon Related/IR Tracking$ python irtrack.py *** glibc detected *** python: malloc(): memory corruption (fast): 0x09af1fbf *** ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x1a1591] /lib/tls/i686/cmov/libc.so.6(+0x6e710)[0x1a4710] /lib/tls/i686/cmov/libc.so.6(__libc_malloc+0x5c)[0x1a5f9c] python(PyList_Append+0x8d)[0x808484d] /usr/lib/pymodules/python2.6/sip.so(+0x9122)[0x6f1122] /usr/lib/pymodules/python2.6/sip.so(+0xc4d3)[0x6f44d3] /usr/lib/pymodules/python2.6/sip.so(+0xd30a)[0x6f530a] /usr/lib/pymodules/python2.6/sip.so(+0xd4e6)[0x6f54e6] /usr/lib/pymodules/python2.6/PyQt4/QtGui.so(+0x398d96)[0xeb9d96] python(PyEval_EvalFrameEx+0x4221)[0x80e0a21] python(PyEval_EvalFrameEx+0x53b0)[0x80e1bb0] python(PyEval_EvalFrameEx+0x53b0)[0x80e1bb0] python(PyEval_EvalFrameEx+0x53b0)[0x80e1bb0] python(PyEval_EvalFrameEx+0x53b0)[0x80e1bb0] python(PyEval_EvalCodeEx+0x857)[0x80e2807] python[0x816b2ac] python(PyObject_Call+0x4a)[0x806245a] python[0x806a45c] python(PyObject_Call+0x4a)[0x806245a] python(PyEval_CallObjectWithKeywords+0x42)[0x80db892] python[0x810e398] /lib/tls/i686/cmov/libpthread.so.0(+0x596e)[0xb0d96e] /lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0x203a4e] ======= Memory map: ======== 00110000-00134000 r-xp 00000000 08:06 1512 /lib/tls/i686/cmov/libm-2.11.1.so 00134000-00135000 r--p 00023000 08:06 1512 /lib/tls/i686/cmov/libm-2.11.1.so 00135000-00136000 rw-p 00024000 08:06 1512 /lib/tls/i686/cmov/libm-2.11.1.so 00136000-00289000 r-xp 00000000 08:06 1478 /lib/tls/i686/cmov/libc-2.11.1.so 00289000-0028a000 ---p 00153000 08:06 1478 /lib/tls/i686/cmov/libc-2.11.1.so 0028a000-0028c000 r--p 00153000 08:06 1478 /lib/tls/i686/cmov/libc-2.11.1.so 0028c000-0028d000 rw-p 00155000 08:06 1478 /lib/tls/i686/cmov/libc-2.11.1.so 0028d000-00290000 rw-p 00000000 00:00 0 00290000-002be000 r-xp 00000000 08:06 4966 /usr/lib/libfontconfig.so.1.4.4 002be000-002bf000 r--p 0002d000 08:06 4966 /usr/lib/libfontconfig.so.1.4.4 002bf000-002c0000 rw-p 0002e000 08:06 4966 /usr/lib/libfontconfig.so.1.4.4 002c0000-002d5000 r-xp 00000000 08:06 4926 /usr/lib/libaudio.so.2.4 002d5000-002d6000 r--p 00015000 08:06 4926 /usr/lib/libaudio.so.2.4 002d6000-002d7000 rw-p 00016000 08:06 4926 /usr/lib/libaudio.so.2.4 002d7000-002de000 r-xp 00000000 08:06 6304 /usr/lib/libSM.so.6.0.1 002de000-002df000 r--p 00006000 08:06 6304 /usr/lib/libSM.so.6.0.1 002df000-002e0000 rw-p 00007000 08:06 6304 /usr/lib/libSM.so.6.0.1 002e0000-002e4000 r-xp 00000000 08:06 65032 /usr/lib/libgthread-2.0.so.0.2400.1 002e4000-002e5000 r--p 00003000 08:06 65032 /usr/lib/libgthread-2.0.so.0.2400.1 002e5000-002e6000 rw-p 00004000 08:06 65032 /usr/lib/libgthread-2.0.so.0.2400.1 002e9000-002eb000 r-xp 00000000 08:06 11132 /lib/tls/i686/cmov/libutil-2.11.1.so 002eb000-002ec000 r--p 00001000 08:06 11132 /lib/tls/i686/cmov/libutil-2.11.1.so 002ec000-002ed000 rw-p 00002000 08:06 11132 /lib/tls/i686/cmov/libutil-2.11.1.so 002ed000-003d6000 r-xp 00000000 08:06 1456 /usr/lib/libstdc++.so.6.0.13 003d6000-003d7000 ---p 000e9000 08:06 1456 /usr/lib/libstdc++.so.6.0.13 003d7000-003db000 r--p 000e9000 08:06 1456 /usr/lib/libstdc++.so.6.0.13 003db000-003dc000 rw-p 000ed000 08:06 1456 /usr/lib/libstdc++.so.6.0.13 003dc000-003e3000 rw-p 00000000 00:00 0 003e3000-00406000 r-xp 00000000 08:06 38577 /lib/libpng12.so.0.42.0 00406000-00407000 r--p 00022000 08:06 38577 /lib/libpng12.so.0.42.0 00407000-00408000 rw-p 00023000 08:06 38577 /lib/libpng12.so.0.42.0 00408000-00445000 r-xp 00000000 08:06 65030 /usr/lib/libgobject-2.0.so.0.2400.1 00445000-00446000 r--p 0003c000 08:06 65030 /usr/lib/libgobject-2.0.so.0.2400.1 00446000-00447000 rw-p 0003d000 08:06 65030 /usr/lib/libgobject-2.0.so.0.2400.1 00447000-0044f000 r-xp 00000000 08:06 41551 /usr/lib/libXrender.so.1.3.0 0044f000-00450000 r--p 00007000 08:06 41551 /usr/lib/libXrender.so.1.3.0 00450000-00451000 rw-p 00008000 08:06 41551 /usr/lib/libXrender.so.1.3.0 00451000-00453000 r-xp 00000000 08:06 26380 /usr/lib/libXau.so.6.0.0 00453000-00454000 r--p 00001000 08:06 26380 /usr/lib/libXau.so.6.0.0 00454000-00455000 rw-p 00002000 08:06 26380 /usr/lib/libXau.so.6.0.0 00456000-00498000 r-xp 00000000 08:06 10044 /lib/i686/cmov/libssl.so.0.9.8 00498000-00499000 r--p 00042000 08:06 10044 /lib/i686/cmov/libssl.so.0.9.8 00499000-0049c000 rw-p 00043000 08:06 10044 /lib/i686/cmov/libssl.so.0.9.8 0049c000-0050d000 r-xp 00000000 08:06 89848 /usr/lib/libfreetype.so.6.3.22 0050d000-00511000 r--p 00070000 08:06 89848 /usr/lib/libfreetype.so.6.3.22 00511000-00512000 rw-p 00074000 08:06 89848 /usr/lib/libfreetype.so.6.3.22 00512000-00519000 r-xp 00000000 08:06 5910 /lib/tls/i686/cmov/librt-2.11.1.so 00519000-0051a000 r--p 00006000 08:06 5910 /lib/tls/i686/cmov/librt-2.11.1.so 0051a000-0051b000 rw-p 00007000 08:06 5910 /lib/tls/i686/cmov/librt-2.11.1.so 0051b000-0051e000 r-xp 00000000 08:06 5392 /lib/libuuid.so.1.3.0 0051e000-0051f000 r--p 00002000 08:06 5392 /lib/libuuid.so.1.3.0 0051f000-00520000 rw-p 00003000 08:06 5392 /lib/libuuid.so.1.3.0 00521000-00659000 r-xp 00000000 08:06 10043 /lib/i686/cmov/libcrypto.so.0.9.8 00659000-00661000 r--p 00137000 08:06 10043 /lib/i686/cmov/libcrypto.so.0.9.8 00661000-0066f000 rw-p 0013f000 08:06 10043 /lib/i686/cmov/libcrypto.so.0.9.8 0066f000-00673000 rw-p 00000000 00:00 0 00673000-00688000 r-xp 00000000 08:06 6039 /usr/lib/libICE.so.6.3.0 00688000-00689000 r--p 00014000 08:06 6039 /usr/lib/libICE.so.6.3.0 00689000-0068a000 rw-p 00015000 08:06 6039 /usr/lib/libICE.so.6.3.0 0068a000-0068c000 rw-p 00000000 00:00 0 0068c000-0069a000 r-xp 00000000 08:06 26200 /usr/lib/libXext.so.6.4.0 0069a000-0069b000 r--p 0000d000 08:06 26200 /usr/lib/libXext.so.6.4.0 0069b000-0069c000 rw-p 0000e000 08:06 26200 /usr/lib/libXext.so.6.4.0 0069c000-006c0000 r-xp 00000000 08:06 23946 /lib/libexpat.so.1.5.2 006c0000-006c2000 r--p 00024000 08:06 23946 /lib/libexpat.so.1.5.2 006c2000-006c3000 rw-p 00026000 08:06 23946 /lib/libexpat.so.1.5.2 006c3000-006db000 r-xp 00000000 08:06 26399 /usr/lib/libxcb.so.1.1.0 006db000-006dc000 r--p 00017000 08:06 26399 /usr/lib/libxcb.so.1.1.0 006dc000-006dd000 rw-p 00018000 08:06 26399 /usr/lib/libxcb.so.1.1.0 006dd000-006df000 r-xp 00000000 08:06 65655 /usr/lib/gconv/UTF-16.so 006df000-006e0000 r--p 00001000 08:06 65655 /usr/lib/gconv/UTF-16.so 006e0000-006e1000 rw-p 00002000 08:06 65655 /usr/lib/gconv/UTF-16.so 006e1000-006e2000 r-xp 00000000 00:00 0 [vdso] 006e2000-006e6000 r-xp 00000000 08:06 26391 /usr/lib/libXdmcp.so.6.0.0 006e6000-006e7000 r--p 00003000 08:06 26391 /usr/lib/libXdmcp.so.6.0.0 006e7000-006e8000 rw-p 00004000 08:06 26391 /usr/lib/libXdmcp.so.6.0.0 006e8000-006fb000 r-xp 00000000 08:06 39381 /usr/lib/pyshared/python2.6/sip.so 006fb000-006fc000 r--p 00012000 08:06 39381 /usr/lib/pyshared/python2.6/sip.so 006fc000-006fd000 rw-p 00013000 08:06 39381 /usr/lib/pyshared/python2.6/sip.so 006fd000-006ff000 r-xp 00000000 08:06 41832 /usr/lib/libXinerama.so.1.0.0 006ff000-00700000 r--p 00001000 08:06 41832 /usr/lib/libXinerama.so.1.0.0 00700000-00701000 rw-p 00002000 08:06 41832 /usr/lib/libXinerama.so.1.0.0 00701000-0071e000 r-xp 00000000 08:06 11082 /lib/libgcc_s.so.1 0071e000-0071f000 r--p 0001c000 08:06 11082 /lib/libgcc_s.so.1 0071f000-00720000 rw-p 0001d000 08:06 11082 /lib/libgcc_s.so.1 00720000-0074f000 r-xp 00000000 08:06 25652 /lib/libpcre.so.3.12.1 0074f000-00750000 r--p 0002e000 08:06 25652 /lib/libpcre.so.3.12.1 00750000-00751000 rw-p 0002f000 08:06 25652 /lib/libpcre.so.3.12.1 00751000-00756000 r-xp 00000000 08:06 38272 /usr/lib/pyshared/python2.6/cwiid.so 00756000-00757000 r--p 00004000 08:06 38272 /usr/lib/pyshared/python2.6/cwiid.so 00757000-00758000 rw-p 00005000 08:06 38272 /usr/lib/pyshared/python2.6/cwiid.so 00758000-0075b000 r-xp 00000000 08:06 65031 /usr/lib/libgmodule-2.0.so.0.2400.1 0075b000-0075c000 r--p 00002000 08:06 65031 /usr/lib/libgmodule-2.0.so.0.2400.1 0075c000-0075d000 rw-p 00003000 08:06 65031 /usr/lib/libgmodule-2.0.so.0.2400.1 0075d000-00778000 r-xp 00000000 08:06 1459 /lib/ld-2.11.1.so 00778000-00779000 r--p 0001a000 08:06 1459 /lib/ld-2.11.1.so 00779000-0077a000 rw-p 0001b000 08:06 1459 /lib/ld-2.11.1.so 0077a000-009f0000 r-xp 00000000 08:06 1682 /usr/lib/libQtCore.so.4.6.2 009f0000-009f7000 r--p 00275000 08:06 1682 /usr/lib/libQtCore.so.4.6.2 009f7000-009f8000 rw-p 0027c000 08:06 1682 /usr/lib/libQtCore.so.4.6.2 009f8000-009ff000 r-xp 00000000 08:06 38111 /usr/lib/libcwiid.so.1.0 009ff000-00a00000 r--p 00006000 08:06 38111 /usr/lib/libcwiid.so.1.0 00a00000-00a01000 rw-p 00007000 08:06 38111 /usr/lib/libcwiid.so.1.0 00a01000-00a14000 r-xp 00000000 08:06 10029 /usr/lib/libbluetooth.so.3.5.0 00a14000-00a15000 r--p 00012000 08:06 10029 /usr/lib/libbluetooth.so.3.5.0 00a15000-00a16000 rw-p 00013000 08:06 10029 /usr/lib/libbluetooth.so.3.5.0 00a16000-00a18000 r-xp 00000000 08:06 39210 /usr/lib/libXcomposite.so.1.0.0 00a18000-00a19000 r--p 00001000 08:06 39210 /usr/lib/libXcomposite.so.1.0.0 00a19000-00a1a000 rw-p 00002000 08:06 39210 /usr/lib/libXcomposite.so.1.0.0 00a1b000-00a1d000 r-xp 00000000 08:06 1504 /lib/tls/i686/cmov/libdl-2.11.1.so 00a1d000-00a1e000 r--p 00001000 08:06 1504 /lib/tls/i686/cmov/libdl-2.11.1.so 00a1e000-00a1f000 rw-p 00002000 08:06 1504 /lib/tls/i686/cmov/libdl-2.11.1.so 00a1f000-00a25000 r-xp 00000000 08:06 44450 /usr/lib/libXrandr.so.2.2.0 00a25000-00a26000 r--p 00005000 08:06 44450 /usr/lib/libXrandr.so.2.2.0 00a26000-00a27000 rw-p 00006000 08:06 44450 /usr/lib/libXrandr.so.2.2.0 00a27000-00a29000 r-xp 00000000 08:06 40633 /usr/lib/libXdamage.so.1.1.0 00a29000-00a2a000 r--p 00001000 08:06 40633 /usr/lib/libXdamage.so.1.1.0 00a2a000-00a2b000 rw-p 00002000 08:06 40633 /usr/lib/libXdamage.so.1.1.0 00a2c000-00a3f000 r-xp 00000000 08:06 1505 /lib/libz.so.1.2.3.3 00a3f000-00a40000 r--p 00012000 08:06 1505 /lib/libz.so.1.2.3.3 00a40000-00a41000 rw-p 00013000 08:06 1505 /lib/libz.so.1.2.3.3 00a41000-00a90000 r-xp 00000000 08:06 48551 /usr/lib/libXt.so.6.0.0 00a90000-00a91000 r--p 0004e000 08:06 48551 /usr/lib/libXt.so.6.0.0 00a91000-00a94000 rw-p 0004f000 08:06 48551 /usr/lib/libXt.so.6.0.0 00a94000-00a98000 r-xp 00000000 08:06 16945 /usr/lib/libXfixes.so.3.1.0 00a98000-00a99000 r--p 00003000 08:06 16945 /usr/lib/libXfixes.so.3.1.0 00a99000-00a9a000 rw-p 00004000 08:06 16945 /usr/lib/libXfixes.so.3.1.0 00a9a000-00aa2000 r-xp 00000000 08:06 40307 /usr/lib/libXcursor.so.1.0.2 00aa2000-00aa3000 r--p 00007000 08:06 40307 /usr/lib/libXcursor.so.1.0.2 00aa3000-00aa4000 rw-p 00008000 08:06 40307 /usr/lib/libXcursor.so.1.0.2 00aa4000-00ab0000 r-xp 00000000 08:06 26211 /usr/lib/libXi.so.6.1.0 00ab0000-00ab1000 r--p 0000c000 08:06 26211 /usr/lib/libXi.so.6.1.0 00ab1000-00ab2000 rw-p 0000d000 08:06 26211 /usr/lib/libXi.so.6.1.0 00ab2000-00ae1000 r-xp 00000000 08:06 5497 /usr/lib/libgconf-2.so.4.1.5 00ae1000-00ae2000 r--p 0002e000 08:06 5497 /usr/lib/libgconf-2.so.4.1.5 00ae2000-00ae4000 rw-p 0002f000 08:06 5497 /usr/lib/libgconf-2.so.4.1.5 00ae4000-00b00000 r-xp 00000000 08:06 8089 /usr/lib/libdbus-glib-1.so.2.1.0 00b00000-00b01000 r--p 0001b000 08:06 8089 /usr/lib/libdbus-glib-1.so.2.1.0 00b01000-00b02000 rw-p 0001c000 08:06 8089 /usr/lib/libdbus-glib-1.so.2.1.0 00b02000-00b05000 r-xp 00000000 08:06 39214 /usr/lib/libxcb-render-util.so.0.0.0 00b05000-00b06000 r--p 00002000 08:06 39214 /usr/lib/libxcb-render-util.so.0.0.0 00b06000-00b07000 rw-p 00003000 08:06 39214 /usr/lib/libxcb-render-util.so.0.0.0 00b08000-00b1d000 r-xp 00000000 08:06 5661 /lib/tls/i686/cmov/libpthread-2.11.1.so 00b1d000-00b1e000 r--p 00014000 08:06 5661 /lib/tls/i686/cmov/libpthread-2.11.1.so 00b1e000-00b1f000 rw-p 00015000 08:06 5661 /lib/tls/i686/cmov/libpthread-2.11.1.so 00b1f000-00b21000 rw-p 00000000 00:00 0 00b21000-01019000 r-xp 00000000 08:06 267989 /usr/lib/pyshared/python2.6/PyQt4/QtGui.so 01019000-0101a000 ---p 004f8000 08:06 267989 /usr/lib/pyshared/python2.6/PyQt4/QtGui.so 0101a000-01025000 r--p 004f8000 08:06 267989 /usr/lib/pyshared/python2.6/PyQt4/QtGui.so 01025000-010c5000 rw-p 00503000 08:06 267989 /usr/lib/pyshared/python2.6/PyQt4/QtGui.so 010c5000-01158000 r-xp 00000000 08:06 67719 /usr/lib/libgdk-x11-2.0.so.0.2000.1 01158000-0115a000 r--p 00093000 08:06 67719 /usr/lib/libgdk-x11-2.0.so.0.2000.1 0115a000-0115b000 rw-p 00095000 08:06 67719 /usr/lib/libgdk-x11-2.0.so.0.2000.1 0115b000-01173000 r-xp 00000000 08:06 67720 /usr/lib/libgdk_pixbuf-2.0.so.0.2000.1Aborted Source Files/.svn/text-base/blue square.jpg.svn-base0000555000175000000000000000146211427705314021241 0ustar asimrootJFIF      "2#/ #'),,,!150*5&+,) 5$$5*65565545)2462)54)5)25,5)5,5-.))5-*,)4*)..))5))),}}"( CQd!Rar#B)2Q4R!"Aa ?ɢ##"a42,X#2, ddm,# 0GCiddY:K#" Y+Pb?쒭AٝzF?i?ӄO4\3$@-V쒭Aٝzp拆de@ }U8{3N}*}ק >hfIZ(:dipI$Vu=.GU,IGKQzY9WтI"èp8zoK'?j0I$Vu=.GMd_F $è,$Zpu=7}$Aظu=TQ'57Y]i\!*ISource Files/.svn/text-base/simpleConnect.py.svn-base0000555000175000000000000000435511440663156021512 0ustar asimroot#----------------------------------------------------------------------------- # module name : simpleConnect.py # author : Asim Mittal (c) 2010 # description : Demonstrates the following features: # a. establishing connectivity and creating a wiimote object # b. handling wiimote sensor data # c. interpreting the sensor data and doing something useful # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import wiigrab,sys,time def someEventHandler(reportFromWii,wiiObjRef,someTempRef): """ This is the callback routine for the wii remote. it simply gets the value of the LED currently present on the remote and toggles it """ print reportFromWii curLedVal = reportFromWii['led'] wiiObjRef.led = not curLedVal #------------------------------------ MAIN ------------------------------------------ if __name__ == "__main__": #------------------ Create Object, Connect and Configure ------------------- try: print "Press the buttons 1 & 2 together..." wiiObj = wiigrab.WiimoteEventGrabber(someEventHandler,1) wiiObj.setReportType() wiiObj.led = 15 except: print "Wii remote not found. Please check that the device is discoverable" sys.exit(0) #---- Start the Wiimote as a thread with reports fed to assigned callback---- wiiObj.start() #----------------- Run the Main loop so that the app doesn't die ------------ try: print 'Start of App' while True: time.sleep(1) except: #very important call to join here, waits till the wiimote connection is closed and the #wiimote is restored to its initial state wiiObj.join() print 'End of App' Source Files/.svn/text-base/simpleButtons.py.svn-base0000555000175000000000000000455111432304650021545 0ustar asimroot#----------------------------------------------------------------------------- # module name : simpleButtons.py # author : Asim Mittal (c) 2010 # description : Demonstrates the use of buttons for the wii # platform : Ubuntu 9.10 or higher (extra packages needed: pyqt4, pybluez) # # Disclamer # This file has been coded as part of a talk titled "Wii + Python = Intuitive Control" # delivered at the Python Conference (a.k.a PyCon), India 2010. The work here # purely for demonstartive and didactical purposes only and is meant to serve # as a guide to developing applications using the Nintendo Wii on Ubuntu using Python # The source code and associated documentation can be downloaded from my blog's # project page. The url for my blog is: http://baniyakiduniya.blogspot.com #----------------------------------------------------------------------------- import wiigrab, sys, time, traceback def eventHandlerButtons(report,wiiObj,tempRef): #get the button value (sum of key presses) from the report buttonValue = report['buttons'] #resolve this combined value using the wiigrab's resolver routine lstResolvedValues = wiigrab.resolveButtons(buttonValue) if len(lstResolvedValues) > 2: wiiObj.rumble = 1 else: wiiObj.rumble = 0 #get the nomenclature for every button lstNames = [] for eachButtonVal in lstResolvedValues: lstNames.append(wiigrab.getNameOfButton(eachButtonVal)) #print the names if lstNames <> []: print lstNames,lstResolvedValues #------------------------------------ MAIN ------------------------------------------ if __name__ == "__main__": #------------------ Create Object, Connect and Configure ------------------- try: print "Press the buttons 1 & 2 together..." wiiObj = wiigrab.WiimoteEventGrabber(eventHandlerButtons) wiiObj.setReportType() wiiObj.led = 15 except: #print traceback.print_exc() print "Wii remote not found. Please check that the device is discoverable" sys.exit(0) #---- Start the Wiimote as a thread with reports fed to assigned callback---- wiiObj.start() #----------------- Run the Main loop so that the app doesn't die ------------ try: print 'Start of App' while True: time.sleep(1) except: #very important call to join here, waits till the wiimote connection is closed and the #wiimote is restored to its initial state wiiObj.join() print 'End of App' Source Files/.svn/text-base/xauto.py.svn-base0000555000175000000000000000266611447211342020043 0ustar asimrootimport os #------------------------- Xautomation Commands ---------------------------- buttonLeft = 1 buttonRight = 2 isMouseDown = False zoomCount = 0 oldSize = 0 oldDist = 0 isSwitcherOn = False cmdMouseMove = "xte \'mousemove %s %s\'" cmdMouseDown = "xte \'mousedown %s\'" cmdMouseUp = "xte \'mouseup %s\'" cmdZoomIn = "xte \'keydown Control_L\' \'keydown Alt_L\' \'str ====\' \'keyup Control_L\' \'keyup Alt_L\'" cmdZoomOut = "xte \'keydown Control_L\' \'keydown Alt_L\' \'str ----\' \'keyup Control_L\' \'keyup Alt_L\'" cmdControlOn = "xte \'keydown Control_L\' \'keydown Alt_L\'" cmdControlOff = "xte \'keyup Control_L\' \'keyup Alt_L\'" #------------------------------------------------------------------------ def moveCursor(x,y): toSend = (cmdMouseMove%(int(x),int(y))) os.system(toSend) def mouseDown(button): global isMouseDown if isMouseDown == False: toSend = (cmdMouseDown%(int(button))) os.system(toSend) isMouseDown = True def mouseUp(button): global isMouseDown if isMouseDown == True: toSend = (cmdMouseUp%(int(button))) os.system(toSend) isMouseDown = False #----------------------------------------------------------------------- def zoomIn(): global zoomCount os.system(cmdZoomIn) zoomCount +=1 def zoomOut(): global zoomCount while zoomCount <> 0: os.system(cmdZoomOut) zoomCount -= 1 Source Files/.svn/prop-base/trayicon.png.svn-base0000555000175000000000000000011711447211320020644 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/timer.dat.svn-base0000555000175000000000000000003611447211320020120 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/testLifeOfLed.py.svn-base0000555000175000000000000000003611447211320021351 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/output.txt.svn-base0000555000175000000000000000003611447211320020407 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/runPuzzle.py.svn-base0000555000175000000000000000003611440663126020706 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/puzzleui.ui.svn-base0000555000175000000000000000003611440663126020544 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/puzzleui.py.svn-base0000555000175000000000000000003611440663126020557 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/cursor2.gif.svn-base0000555000175000000000000000011711440663126020404 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/cursor1.gif.svn-base0000555000175000000000000000011711440663126020403 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/4.jpg.svn-base0000555000175000000000000000011711440663126017163 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/3.jpg.svn-base0000555000175000000000000000011711440663126017162 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/2.jpg.svn-base0000555000175000000000000000011711440663126017161 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/1.jpg.svn-base0000555000175000000000000000011711440663126017160 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/runVirtualObject.py.svn-base0000555000175000000000000000003611435755670022204 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/runPaddleWar.py.svn-base0000555000175000000000000000003611434731074021261 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/runBounce.py.svn-base0000555000175000000000000000003611434731074020631 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/boing.wav.svn-base0000555000175000000000000000011711434731074020134 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/wiipoint.py.svn-base0000555000175000000000000000003611427704360020533 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/wiigrab.py.svn-base0000555000175000000000000000003611427704360020315 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/runWiiControl.py.svn-base0000555000175000000000000000003611427704360021507 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/runPaintfire.py.svn-base0000555000175000000000000000003611427704360021337 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/runMoveAndStretch.py.svn-base0000555000175000000000000000003611427704360022304 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/runMouseMover.py.svn-base0000555000175000000000000000003611427704360021517 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/runDualPointDemo.py.svn-base0000555000175000000000000000003611427704360022122 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/redsquare.jpg.svn-base0000555000175000000000000000011711427704360021014 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/irtrack.py.svn-base0000555000175000000000000000003611427704360020330 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/frontend.ui.svn-base0000555000175000000000000000003611427704360020475 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/frontend.py.svn-base0000555000175000000000000000003611427704360020510 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/errlog.svn-base0000555000175000000000000000003611427704360017534 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/blue square.jpg.svn-base0000555000175000000000000000011711427704360021231 0ustar asimrootK 14 svn:executable V 1 * K 13 svn:mime-type V 24 application/octet-stream END Source Files/.svn/prop-base/simpleConnect.py.svn-base0000555000175000000000000000003611427704360021474 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/simpleButtons.py.svn-base0000555000175000000000000000003611427704360021541 0ustar asimrootK 14 svn:executable V 1 * END Source Files/.svn/prop-base/xauto.py.svn-base0000555000175000000000000000003611447211320020020 0ustar asimrootK 14 svn:executable V 1 * END documentation.pdf0000755000175000000000000054475211450332406013125 0ustar asimroot%PDF-1.4 %äüöß 2 0 obj <> stream x\I$_Q*T.Pjm>f1so))BKgwUh }ŢN88/p9ĿOq]Na1_ß=>f;v>_vŞ{9G ΗqVn}x |Rk4 kh c:bOQ~8CO+=ࣽ8~x!^p\p3\J}@ӓ"'n` &ӗ7srI([X帲_p|/ahEj %JEv s<KvGJ k],.`ء +[ _(q "/ga+C%yNs6W&a{ՆeA{VQsӊ. ȑl[&qV8w-0R#eZTY$+x4LPޗhq&ԅf])2Di]I+3b+M*U3NAOV"*H`h\Ki$=lz;(і& !;q0B@-Rko0O;|(RP[0whDK%Sl">ہEF 2{[Lmھ*8ZS}#4Kn5J->?g'$LҶ0N4i/JfJj×JFg"uyΕ"d.L6oP6e_M/ϖ` mwЈ ;=U}y98hY#gUO>+3mk c)Rj.(׍ūwK66S&ѿ/P>:Uh5C96Bݙv wبK=(r:%1nя5Ot R; G])mb(PF1 piM-Ӻh"Lk* l`2 {$QD_mO=5}|oLlEHJRo #ޑ}f`+'IR䭱Cܩ \١Z4,T-6Q9aUU7UE#sCE|rĎUҀW-P1e7";*44%s3,A$3XN4CWL_yVKB[l ^ o+(:E{qgƏnsO# af؜6Lֻ*Pe Hk4ٔcG%ξv >@k:f{\tr;A ɛ>@=s.t&ߥ] VWȎ-hh/4kC{t;n+*۪WVlgculSFmLr*319m8)K#i"i ( E)~l1V-tF\T;2CUBxr4dU9qȲlgp#X^⏖)ݯG ZUN8rE%.{r?R?]YF/rH@o8)i'E`~q+pg_Ykg8XHeOeRŦEU4a0Y5>b{@ۖ0j 4F]q۝횠Na/di 82[FAdޭ f+e}DAEU&糋Vm*x,KAl|Ӽ;5dT4AskO-N6Q=~G#lޥxdERT{OfpGt+RUVp4J9RWф&Z=ݱ -tΊ{酷ܕ/ תOpC KV~ YIz|JIRnN?963vd4ZuDSgŊD$e f=Jld~G7 q8Bhoj 9J0V|jfd륍^ȣF[;6I妜ϫC_ elpMꪲ:7ڸ7cPc#| 8h9Lo1q5^lμK#m^x78Vzj} >*SB 9Wp|t1MP=`@1`c ^k@n*T 'YnأϿqpý4 viML„p>^Ix/[%V endstream endobj 3 0 obj 3537 endobj 5 0 obj <> stream x\ˊ,Wz))h in ^ ^<}Pf2ĉ.N<_'ן~w?>tOe\tf.;?Ůn.Yno;ԧo?9^u a׳eXv]qsx\o߇}0紸9I aNu G7oIϨgPWz-7M׼kr 'SwGěڅ-har1 l]c]J3iq3)MqT$./|Vɤpipy2'Wך:zJ3xϾM{jE4n (z(roQ(J]OۛNjƥbƋ&Hkڱ`ʺ?xO7Uf%ۭSU[oUzѢ>B.vUD1[p}*4t:l*L>y-4QpfN9ΙK%snƞ)Iutm< (:8uKN-.:LS"323/_ޜӢA`!q~:/䉨UQtT?Gyh:GKbC ζŮ7#(̞\|-їw+jnFE~u:(dӁ%Y!MW!epiR]Can>Fa S"(x(pR8pT]f:P]}#. ?`ḓ´n':9=!] F W[rhd 49Dz- refj c,K\uN6,EnIQAd gÄ&uw6;{ʦ stF=9tx ѕ*c2(4Ȩ(lz- oU'ET)gEgbZvE x d7ɠ5HIܼբFర ~ I†+ب7 `&Rԍs'i8 k ،_Y9祣6\B$&^<~׸ w2[0g 'p-EYw'@^ˁhmv7Ur{=!HA<9{3ƕC𖥦6gZQͬ2v>% $E:1LPp}VA$H~к4z UAV\;hec2,ADa̴zĬ0ŏ=qWi6xDݨţW3{|OnɱQ 3/NX9%Hy\e ٍb{Z#U W> T4FVG4s?XýD9~'"w].K{r2J!9t&X0%<\4hr9F4k5RfeIJOs1\LpyX#lK0R]*A, .96++q& $ҽ; 7$7`?QiZxQ6 Y_!zUȜ8]Hs5*Cfۆ֨Zj˞s9ކ>jiٍ հzDDd(HRaP~@bUr۬+s/s&<\р<^HxeHZ @, {i`"ZƢ]{;FR A$%O*@!9$p&>NTS+fI%Z[/=5o% .%Ֆ4f$YIctR͞L ]=wv@|*NI]s6mi" xX^Q&2YA6pʣc *l/oPw&As/5\NpcIN@2aIBo ("HaDCdjrLPV1,jJb\njbB:FS(͞UwVl5nB= xj@˦':V? <rQu]eg Rn;P?)Z麞EbA-!f]G+ }~h$MUxK^4:㊳iyj`/ZoDv zR %ie[ADPQ|0A"G|aާ(tkʞj)s˜T;<2 [^JJ |I\w ڰ_};&vy'enP=/OwLOZoH{4iEH!žEڳU!5އJ% ˀX 35Cn}aޖX$.t'hhXj "grMvL'PYeX)N D쥮'-r'11x(WX x6VNR=02j%ZSke{ #4 a|S*f^ I]'Ji✍Ķ0KH ءcM-8dǹc*^6졊w5GхeT/ܷ}Dǰ|%wd9&@T̕SA+SHP%\K;X)Kk3;(z sy{( ,{MYfxjɕ[CclIC@XTt;9 B@3 [m \3W>4E6`QB4 Emonu1>تM#I3OQVܓ oV=-d&JHA#WY-e6:{:-LRETw=u4Gj>@Ff2hOײOǕQ-]rS)gژϕkQJ]by>tL/cuc55e㔙줸j02_~Χt`L8h$ա%QHF=_։> stream x\ˎ WzXeF]Mr,L  ߏDR)Q&uD>Ü~}i:Obl|]_o7|'xc9-kzCjßo-Ncz36iO~d.siݧ6Lg৯ImO˟GG\{'3AN6>/1WӒ2 |o*104+4F_!zs ^o{ ˰ql/4O`7Mo&Y#;Jm 1Ls#F3:s8!ݖHH:=ۙD|l3x|27f(MƯ4ou\4*^W.*yP u*`'b$"L)*h;_Zr}k\!2^{Xw|rki(0y6O-ѝQDЪ(HQqlo]=R曵LE@Q_w%l #82\4;sFq.:ƘMɰ^= Sd*o$iet-g?@qWv?3^^wXc*}s,Xb[Q5ejqg ovZTsw.Pc=G~b [6Q+3(H BϥG!XD5No錧5*Jj#5\kXkgewlgl;Djhg`MI bM~=kjbb8Xeԟ&/_RlQW D-{8w-=P48b_x"aNVI^9 l3z@q]/c\ !5U&GP?: i(F=y٣,c5 9ȣ#Hp,]Tq+iTed #)B*z2}/B']z t6N=H t6C7!G&$2fr'Ѝh0y{Usk3L.x_Ph. A衋>*mw`?p]Pll2PDLQB.W*258a3$I}]= 0J`)HCPʊWb`Ȫ/e)ezų>Ȇe\afbjJM9U3ۻb2kza$@;|MYqSM}T ' 2w뫌'hBh+oK/o D ,itgr4u:~?ZK5P&EFo ˓Ic%nq_#ͼP]IT$.&!4ul񔳂*L !.\UᬌcE}>@W.{kPjnl=nWT czyiP Eiecg+|Ղ%!&"W̛ Y: iB[sW6y*b0'-*QkH+q=I)r ,˓3y!%zyִ3=Z2P2+OK5J/mdTиE̴mHkt{홹x[ky!uk1nق͋N2Ű$KdBR6[e 6#v.9nʜ0{/XL6:)1p^Գ;rRJ>BuǐTHױ.*׈G9,Ug00&X[UeZ}tB[Ǭ4K Qem p)۟^t$VȤ3MӦ=[tJC Vf횪Y#<#ȫpT [qv\ׂ_3Y;{݆NNUtjM ]VI{U[5j C,X8PXB(Fxb/Bܢgs}'?B ?̅ Sw܄6Z(֭X8YGfu˺nJMeAAaT[{0>DC%f}yE քO gǣ-|g`$zjm#ߣGюFweklmuhՍVw-=9$:*)~ɈNRC;B^8 6'i 6;.8ZlE+,mNxJѲ&˜Am?,Ѳ VworBϰ>QrR W5Et>+QilLiyLzCd{9&k7FG9DT *zsqQFFW1?,Ă;@Jk z17S'=y8G7gߘ)]>qs9C@2(C [AzN],Uk8P_jg5";͞ f`$OF4ݓdȑsSuDW"6}9 [ Ѐ+6a_mNض֍=}+AR8wʑaBI)|hmNyI!.'f/:0a8_I"hѥ@ӯb2qϺbS 2AD.Bɥݒ&JQ,tSD25l6ssX gսTv5MpӊI5WRT6_+VImCiY%y?63 ]~ytH n;ۧ&xa'=OS<|@&w .ZjNԪP9YW~2E>(=|}aj%-v o==0a'i@l| O{p< h!B!|‡lD=w<@,62a|} 3GNڕ~`xLQVWXhI$Yn#I3b"M6]qZ6g&<+s<13|y NȬ endstream endobj 9 0 obj 4128 endobj 11 0 obj <> stream x\K,ޟ_1kÙV?`g ;'0Y%q āxIUңMȽ03g]ٜ~i8}dlxOsLJ)rN_eg858v9v ~w0=}`2gxu>a?맏2?ܮ&݇׿|Ƿ?9aiOfk^?[± X/quPX܅]v|&{76nx0egu 5Ju O* tq޴`Ȍ& Z{*t\مZuzOpg6 żp/DG2>kf5M<)w\.4 ax7"8@ 4".3KKM3`S&Y ,Q/xʼnvM|ӼQLf~Д$;2O[I דB0v`o IdئDfõVEHq'%(iZW ;EYag;ppg{ "w>|[^߀J&lՓGɒ#EGQ W/@)-s2tմYAGAj…dPL*Hr5&eX{S"1>YZ*ՂmCʹ s[H/kFy;DhͻkmqbG˥"UZsz4y'#)z2-b`I*(Gu:g~6A\)h*:L<~OUks6{8Me2aoi$Fo ' АQjL }Cju!M":X^o,O877.@Z2![OP~Ecl$>ެ2h ] 絁=MCU$"cX Ah|)!pxe ŏbNJ6rt"ÑQV*8@z(_WzW<:)/tx/[1|s?:[lazq^y2ǎ]Wg7%G/4KU߳fD1IpӍz;Xo1r*@i#<Z,}/.)eKc\G;'/2ENdYՋ}d<{ំ* ̤bf 586r%zIEɦ?*c~vZ'*xt==Ujr12KGvb*PH LKhzD>\+`'mvEH[x]-;0n"Ӫ%' {`3W6 + 7#* }I&%XuSF\$:kF , *Q9ĭ@}!.ǚii%|?7 `d !!p69:|&ѭ'MKthz1p ÛDDUJSKat̠זPl(^$hܜ <ɯo Y`Ww{ĚS~ C}NEPFnMbMlNSzE6iXDD ^yFap߬Fm,Y q ę_ ۳z2&x3# Uj`ʾAGx%X syy':+И<[aGj)fLg`Przaç,I3_R:YbN5"O8!7ll Z%pʸrp߻1-%8>_72RZZ+;Cz)"2Or^@7:V6 7;[f^0=g1I70@b91vrD3dgQFT,:Ql}0?Ra-"s]q1LvxC#f~AYjfw 2ZK2#MD iמb0$80؛bU!#>m UfFai.md9/e}MTv.-k5ye+ړq~46'f'url!YԸd[}j>$ g!pyANJW)ۙ0fICVgvr;g+>WWdݝvK/~J5m4m՟Zml粕øɫ\h~ZIR &U*䡻|0&m($]Bj>Us-p[>P$@7{;رsguu0#(W ݈pv1: (\8 U!4Gr):zn@MPţ 9XO9.EjLesV^"R%~i廕~.E3I!x^0d+_Foٱw&dUJLzVra]îo Ƈ ĞۺQk]dC{a^JnrQwc6,agN1]Anu\نf3t&WgFE! m@`ɫʥJN>e!EU3QRmaqsCKjS0UŐoTJWQtsc` 0p#L?΅*>STd' 3DiqC=+¦ %zj,Apuw5rF-& ۾Bz:u'dmQ%Z E[kQ*L8v.eo%J%eUH诀e 5\ܓ 1Z{0LO+nVz`Id8KKj!X6 >?l.;≣ r-V5%dF>*]2R1 hh;T?p:M7pn2r hqNIL!oX-)9 5A]4^Ǫ|ZK(ƻ9l.[\!}7T }ʭd"VW?,택d,S;=!J$\kEߢ U-H駒 /ou74omEAsn3>L71; fJg̑gǽQAI['/u-$fgx~a+*x:Q Yj9`CosaI϶ ?Ӝ釠ߖOiX?>G+*!=1 o3W#h<=#{x팿o)UhuG>$1`EfxAMq]rZ%u2m endstream endobj 12 0 obj 4249 endobj 14 0 obj <> stream x\K U$Q@:@n "$ ^G"E(=;3 Ö%ast:o~כ. ^uLiᰟ#\5_ic?NCӗzվz.&8_>˰?ܮ&wsx\Oo/o?:.xE{2]хgn|߄5}]}ul<o:3I+.3n ^ ư%͂'=tu-ʅoUPk 3pA3ZA+ b4 6 NI,Eͻ3+ @%xKE#ސ=xD~wjNWL2YyVC\ ZՠO D*JD:+}^y#̛U!%D33AwH3;0ʶ阙ɖatoڠr>dز9Y v%]c~ _6gnL[BF4198%.ZzPeb5`<\B^ِ@CIݷc*6lH`a6mdҶym\ ɼgXդ+چ {u,RYv'<3UU,A14i8OV$n9*7^M3yhь|z@VwpekX;LVt RJlrab 4sڬvW2 h+rŻg8,Ee_`˰J_貈]9j ]jjn k4gH “;܀>p>2f2֨dF%]Px&#L&R1FNɻl*\ѳD~o iɃęI7ĥ`mKL /Ƿ0|y=hmp>9)Nͥ2n*Ƹ!þbD=`xd 7ઘ(fD" YZdɰH1+~eĹO*rN=I E0j7\͸1͊6>ϯaZFMI'*V]o>a |.6*ۘ -_ƭ]~:^qRЬY2l~)Xb'kec<.2:JK*h #&ˬY2MC!tɳ3L^c#s2)x#&()OP5UӀ ^j]p-B*p:3nh$;`)QeR H,ᐒ4uen(RV YaIJMZ=tSVk<#%So%VޭLĈ7 XU"DY^aa;e!n{تfQp-j/N V+1v`:q^NAY%߫.YٸNh4{Sbh7E M';,. o`"1+x9Q f:X6+=ɦŲ" K|(^V0Ʋes3%m $~HkbJԚ*'^MNO.tǘ=3F"c_7=v۞I%YcyM ~6s(E MrnE*TkrKT\M3ԁi귓kh_;.Lw[Gy]|񐛱NQ([ikDKE0ykrn_%y "9ҥi&3 7m7evN/ AiS&5Cmtq:3nP"@^ű#Xo{!{,MN+Ji%NfqE Spe037;S$,I-R޳ Iw44M s k5/o7EbUoac3j{ GZ=1(]*ܛ Qݓ44GA20J%5I7pIHߔ赑ODnVl´A[݇N;N|ʸA]Ǧ\& 6Bv2iJuי YAJ5ME@=;9Ju(:N`q2@\e7T=TG(FJʚB`C7-(Pض;3Εk6ZD-lz*fhxE cujT]ZlyqkZd-R@它l g1F`TyhRK0Ĭ2B-fk[lK)R 9ص4vq[=O&~:_E-:l[&Uci'pHtJM$ v9'4Ի/]T!<0ĺ#~ħ4ؿ`gnvzf?DP>%&m 4OUS%qxפzmoR!ea!gJRZթ;+YښÑEUSv "R<:6;?2${Ԃ7 \i!ҝiu/^I${0_VI@Ws҃)i>< v)Ցr?.P<Ls;ȬY(^&SS&fSX|R: W AN77AܜF*͙fCcUn5?wjeBwoK݊**Ϫ 5J {շDsPLs,V*o.n킭_#6J=.M O@pmLofp0xPƔOBneOёVe|3;>Wuޕ_ؕh7T-v^v "s@LH2jۭn< !;j1^׼`|0Z1!MsNVcēPduO`Inx$VV+NkL8E endstream endobj 15 0 obj 4274 endobj 17 0 obj <> stream xWK6W  ۶r(zjE7撿y,yw P29~ Gc;0?vƚi'C߿b%G & M.wƃ,pltxh,8XVb'rl _^:s֍{=~iG5ہD{'`'0}}wolC΀e>ikѣ|B?S`,~%FL$;NA<ΪሢJVDtʁ(jTX9Wx#OT^!08x\!=zV O͖b9ʤzNɳ>ƄQf` :ω.C|ܠ}F3i).N$rTjh jaѩ]!Ø4jAzXE+UL^B4fȖ+m_ICY3R9'sKm5Qt,"BiRv#9g"5|O,޲ öN .mН*s .5re>cq{}']-.wu/^]mȷTF'a)cX@V u]C)|z$Jۛf݅,DqeF29\{].*P:TOkTCGE @ VMP:n MoA-zMypaGP>xI"FI$S~VJ_aQaVKs`fa[b⼆b Ba5<'԰O4CP(lfG ChB%]+ `t1X*ѐ\/Mccm9مu;l4?Sc?_m"\P/ٖ7רmׂ:M"t˞#-8f'rtxi8Zn[8ˍ؆X,9,KR9L0CA٤ƹh V'&˙Tp&& ^ LcY%JhIȳpTg_[oO0ydm/4֏'}GX endstream endobj 18 0 obj 1169 endobj 19 0 obj <> stream xy|Sը{0Ɩ,˲3tJ4 ؚu4f&i34}4&ML0Y$ی !CI !c<[9Ihެ#[OY{B\")x)L{~ N k7Pt#:V|!L P0 i7ǼR`RHb R.h`æPF8LWʹLsԖ1|VMILeC""JD|κtS g#lN+Vgb:y1g!HYj<gg"0jያ ^D&™D|2D>`,[u?A︘Gb$,Jr8k8'x$$Rd2y_) |q)$ q>>%.O&Dө$JˑH(b/@HL|"%RlRD1A⏙m'8N8314EINd6M('GrEY7Zx8㩉8P4p&Lb EGQdC'БQtxGpI#:h|9Cm`DN" 'RD%#(F#h`F?CݱL|}m~UXpGo|C;cGɈy&%o2T?E0q44G=ϼlݪ:ӿ2Ѳ4<Dz-Ҧ+W+FWUkƟ7pz|Y|YHEefKm{n:G|$>%M$YelΜGHq4p ?NeeUcQ6pnѫrF|-&VcZedHU;j;f|WO{ne +5"EĿS?ibLm=[\TzLWiߠY[(9,E$X?(/Ex:z%Rh^}WYߡiغ@>k5T@ ,bGHk jeU8 b_cXvU4C5{gu@Y#[5K\l5oΐ\Eƿr". bszRi,E&zQ.V].j/'L`P0pyR|=9;As4v-0v*ەVqpѣ+I(V,!u8)2怊bNTQJonߠKz~Sa%3Nf>*Sla -,+]H1.Zefi}mJϠ0::aw 'СcPyU-7-o_UH"L&/XRF&)5j3nV[QRז* ]dͤYWwdpE B"ΜL:^8%d$ęq4Џ}Q =fDV(w5^rѧp6hYV߬T:+[Mknyi8<'HD(sm12;ߎJsh E@cxWuT;;TqER/F&eSV;|+ۿӲCo rk>s`r!I7A.PlG,Hr[+u{TN?IJ{-;gc.=5lujiӞv7>U"I^ iI+N989>zݟ|]z*fUwJȳJ*]r ̩iR毴y<7˞QCC6_-1N%J&b9P &0kn}C_KqzNcHG6xq~E"Sְlvq~5(>PV=Je73MJxTډNN>;!.Γd3z}X-p%b ?+NkauF?Lh9UI5dġr{FG&Щdj 4"e4H9ٜFaA=<}u^V꺮RkO#^j*qH:gSJTqVg8C>~ t&M{-"eĿ%,, ^>׿zhJ ~Q4xX=zW ];k(o)9qͤB,S)KGUPҼB߰yƽ5F}Dtr;3y%C@BTRhAaggMsݞb3b1ij9fo iBM M 8XmLqnuk}@q4E)Yc-.s$_ٿP9 N$P,Ehc'Pxt~~ݲ7zY|Av~I,MezRd_3R@筟]aRFZdKӏH< 5"((:ֻlk9RkLY-c,|Fْ/ ;z6Zo{=yҒ1sv9΄SR!) H*<@!lSH:wݺcF*kRoY_]mkm@O+vOsCG@,Ӂ33 #`_ \L%#hK>\j+7 Lts*wηJ*;ffF-5٨'Z{uum g{ -8d#5El tHV?OvΙ~oTFK+"|aDسWm\lY710myt%j|M[B}E+U cR&;dؿC__E|wxt(NLXA+56mCP!-GS5GjWp[a Y2FG"uf׭/EOgM 呜wҼI)ܤS(db1Fh)ѳ;܍4+By.nг5ѕ&V_)RY66^7<ǂ__Fv|vD"'+GC=ERydiHHf PLF/+븒eA035׶)v/(ȗxS.jfBV0YjkS93R1ٺ,QnEEO}ngVJNeN'*wat(R"bxQ=J~3Eg7Ź ~iqdo] ]]\֙2ȉ$Nag:Lٯvט.n9at(L"?2eT*%I)o__im廻 Md.Ip_s0H{-zܥs,5ў8fǓYSs?fS"}Z'9L_*w)_-/2ɰBi^_TC<*XIg٢Z\bӒw&6GPy%wg1SmSV-WaiVb356[o[{|3}aE-T1y*mpԚ<~{(t,i ;ź>Oo>gWIɃ G.w8niL9 %',OH*j<'ggQGK5Хlvr[AIm8]VEo5(mf_%aκ[[#]2<N~VhjJ"EY<7wK$Hu"Ё"mrgNQ)9ZQZe]:疚»cnCIi/pd%aɇh&/&xwVڪ~<*)5RcI5-tgu{J [5N-₿ FP?QY=Opg!E/T Yb!wGs4ƔRm:MWm U]yki9$bkggYmM!){i#ol`qUF)"C ~!t4FFf[] ׿H//uCG:?#wd[/΂ئV>Ɂxo T" TrIj,&ő:ޙ/_Թ gSZ2#SKWn[ۏ 1r_6I+0e8_,mS~<s |i lpr%hXOX]Zl V]Mt) E6OW/9]._~ `vxl%6asȳ< :>z*M:C 2~F4'(g>ρ/wNP[rKl`F&٣u.n3LL9W;+翽No1/]a Ŀ\ V}gzVF | IL_R,3_2'w 5Y<Gee*J/Կ>p[aR7_ًCh&/C%%I.X^״:*ҬVRkIݛz/&H$N@FHD"!fF#hoplҬZc0U_[Pwg&[@ mʦ^~3h/H3M1t+ZwzIUʝXIg#~6ZE1΀^qw%8e /K ("aݓgb>-gF_5`yOa..UCۢ? :ö3~Er2E'ЁOh[V))/ɅZ7A8:5+o!?R1WhsJXTNhb 9m37=`^X-'eK\K-O@GQ X)$$/_kKȣ(:>OW-vmHUK:RvJʯLy]m ;LGxf~13bR #q_6_oZB*jgQ=7݈>-GP}1Xb\sz?O-_Qjw_lL1oC >QKN!;*RnSJ_HegEc(#9{ bzȂb)4A^XwWMNrУUձ+T6oht-TJߦb{K=-?|w(CRxKL]JRi&x GWw563DKkYi5/Næ{~F#<ߥa_'Ȃp?z{lS!-.cJ\Q;"}aMj [m W5ͪ:?C=HcD[_)yK];jmE\_mc`_mƿJٿN_9aٸB;]mkyg84Oц+KfW8: 躾̺+0X*ʧl`U_Zg<ޫ6W;&okȭFQ4kdbJ =gѿA#~8"aR|']N晃L<3/B߫LL;[e\F;A 7dLA~B6PqdA{u<^3o) U{YΙnNyA2^{L^N/<֥GŷGC<&ȓʮ#8pʋ'|0F'Fо7tK%FCD8ɂL?E_lFιY@^oj? n5 mt-~7"7evrԈVbKU WRETW1fAI3LN)fֿ̾Z_2ZDڿo@+Wsga_MǺ6 :>iK52qrE0_yԛ}EI wLO#.Kǜ<{w:8jb'K5USK^Ef^# '|C$$سvAŴB 4yrףmf._UJNWqaϒ_B3b;OF!xD"e< Ĕ/x4IM% )O .-R?!Tٕ,]O>3V6,l3{5&V=_5bUY@-NQt֟qrV$u5Ǝ{O[,]$D=ʋZ.djy WGW:-x{Op*G#اcR:'d%∦Hyrr;&9$ULohoߟM tSdK˒mk*4s Gw1ow=yt |#_M)Mʅx Cд"K((^!{=ՁMzrG'c(#dy_`ɿѬ3Ђhf\l'OO^w˭sRC|6jj$5ϿpoΚoF'I "\eO&drj*v}ܶwWo\⭴Jo2,ٽ"+KkbMt% F?oU6CCaO J!ȓf*:X+]ꜽ'/fg O^cm=Wlݮg2tUz aҕ`Mn\)\ːaϞ@GHB<,[Ϝsꬒf2s)-JȈ:) mmr5s~eg%Xx//YEO)Z67aW|tO0W7\IDi35"S ,Œ|#alpL {?0nmU8tyK1iĨHdk8m4[6ZϠ i.E( ^AOH1$rI)YGc9#SHJGd퇺n[3Z&_339Ŀdi{ A18]mzyw~.NZ dqQ>=$dFJ.JF/͘:=菡c16y}Y|,t/yr7Cz/)T,woZܶNqi !?|o:B*<Ч7noh,)X.eE36(ٱe! T0)ْ!)0OPa7-LG᫴8ZӶlñ"Ksp\8yi|F3+̩䐐GxC(h\^|'},g]vAClSEVz͢yD:yf?PSjw=kNL~lbJy{q1@ca:-vV)h냚ZTbL~ WV*]%2I #[hPXyrkGm~GwGЧ(q O:+q>Cq42ɯja+kXkb ũlaV$\+OݺIv'Mƣrw)~Ot<:Gw1ՍRӘuV/uH'd#sl˸S@iUں\8@[-ƔˀFʾiN%yXѣ{3h(:4"h  R# X{y$Nœc‰ 59dt3s\5o6[@ ~V[dgvYi @RJz!X46_}ѣ>@eN?'aq+&%G!Oݎf7Kl>CJ=Sj[r+eb I/̿DsR V|+7L a4Ȳ\+52Fv]Nu7RkmuO{cFP^v|dAPy鮮-jm6T|.SB1v4 %Oufy3W@"_qY 0 ?nJ+.7hJ uIaEGXpwWV6ff>oUVg@-s56 _I!E?ϰ2~0[K2k6Oz٫R誶owOo[[mSB磨oa4<I}kv6=xyۼWM[k;W/%MEm~+|I_Y|huNlWQK9ߛٹSN^LtHk??X&oYCfNaZ:C6dgG@EY8t)PUBj4t9.wxw&ᩴ:R/-Z{vӽ~׾1yG1 i&ɅP\LMv&hHX5pG6Vb|yVz#\tgZF)/E3@(HąX=4'u38x߸0@QťV [L9c_R y\0Ό#ٟו,.5fQ" h,l.*{4 ]5w{=:4Jf41i"xEc MH'9)r2EaO;%y[|lV/WBDd2fih}~0;<|?MяaIsh4x$Ιs;]LOK$YnfQRz[=v*22A[j^q~5L+1TnFtogh(:9NQ*{ME2D7',D-i14w*gH aڃzZ^6*;]{wM ~/Łט{TwY˷V5pjmWj6chaL(BᔴX9=dDD# 1|r\-˰SKq*c@_wW=m5 WMdat4 w+׿ZV8f[;jk-з<|  ԙyob9.;*HJZSM3ox;qyefF_y~7XRG@Skё8,#r h,CSFid-<KH,JQ3{%6Fkgaؿ@Pcq.8 p~۹tRKs:g@Vzj6}{[wUZS8K 'Ȩ—ÿa)2n?b w o;%fΖu nR4nnEkͣ[kJZYn,(G)4H|HɿtR 0*󋠁uG~au@[e:#3KUΖ9vSdg_\ܴyɽQ^M]4koe ֫=W- ^_w`VySGDr"˧;u\A(* 4r}_Ѳw2Fq{ z9Xtg wPuݥwx \ˣmXkzi:NFqOVrs<# X/IwI&C3fTi 4ɻ "g?@<_Ȑ)?#[W7(9AwW۽ j3F ) Ҝ]`|͚Cg'GFɉb^/d_:Dκ6(9z_y}P]X-~i27E.@[~wG:nCoDH)_KS":C9KR^rL.bOxe_fM]@W;T =zұԶ`ec6v'=c_,R$xYcat+\kRiQy@k,ROEƽèo\yLoyQŽ<":1&OQĿ-Ő W\_ſ~Sn hUm~mCr\7JXhp$/u0#"&H8)1I3ރw6k5Dġ:,[om[Rt[~íuGRoJk9%tIT,߇v*{{9_勵k)_c@mg]]U~l@X\ eo鼁Nu*ٿZ'X_w. =Udgick#}ѡ8)*_YGh4J琔fm$%A'&IwmUcpq<`eb'T5-ztLGC_IۻEc$ןE2Wjď3Mth(YSڿ|¿z]2wkŽ7xy I NJR|ɜCق dod2Jcxt r\C';>yεaSiUNm`fҹQ! zCeWDzu5iQ'Pf9€*'!R MLȝS/؎>z^L2__ag %Td @UcwDh fҿTmv$U8)cFRuqv$^/"Brw_WݿB'Z/GUڿĠx$Th%._UXՐ1Y߯wIr eu\ɝ•k]z[ t8FӅp|3Məd\v&9Q$APyʿcSmP&&] _ز#14r|M;#AJKä$I~}ݧ5TX_ZiVo*jk}o33#.%(~ Q/$K~AG{AuAev89|NM^Kֹ8 бةpسC9t27k,B_IYiޯszk+ݲi߯>E[Fсq2t'cdBEv"0Yw>:>o78[1lY|dݞcJb\yoqm.$cO礩'D1G( G=J h/ȿ.X.:8_!{rLHMK+|ɴJkq+݁]@qZZ7'%<{[7V6,㛫ޚh9"ƒP25DC<QqN ,UU AdP=_#[d*jaz !VdL\FMH }Obs)Wv<%צrr&\RRdiÁ;-2sO'|3WNOQra|*օѷ&6A;"@Cth }6>G{7MY+m:ΩXYV eݨYZ:gǷG 'LAjyħ8A f)WZ]j*%>SSHEcִdgLʺeLӯi*}@QW/5NtT8L Ǐ[[9mCw´bE w?'CϽ>awp3/~oWzoo;Jlf߲Ug(ǃ(&? gڿ_R{{gBןu!VtN(:;cZ }q"G?wvqĿ>mO̿N &fF+c郪; iR[W}rp,or-i7ٚ ]d 4lQ9E8׿zZ X7z}H+J_mVg~me ˲dYqR(-$G&{QhKS e8ƽ$qHYaAq[:s}KCy]C>u o88^S1#JZOieZozN1SS[ovq͵vbu-LAOr[,Ͽ2Bh 7+3k%ZJ QisV;܋UJSwYitWIRjrztUEVuXtn9ΕKSf$.i,5@ߙX6>gS0s4;$9KZiNmIYW,/Lv/gQdTG{Yd1\>*֣G 4.5P[<+4(f^~޻שk\71E+ݗ{EFFBe"f-6]̤pF7մQA^M L DYv*{\j]R]f5JHahz=^ 1qe(M *\5z " KfO7طo+DģtB`2&s ?`-qk"X [!8L< V0HQC: liX w'sTykN5,C[UM_&J -U#$eò)$g}f8&Ad xw}ݣj/:ZO,Cf!eͤCBUQOWXݧt˭rדeu/722WjKb5-6) X(_&:T_,3B3-69/KD:B #/j! /FI_QrB@GyWebDg -Sd&S d]`d_v[ élZZ `d!8 qpp/~г?vT?1{nk.^iKEfR2h}Y3ڶ v.uӰۈϟxkx4@;G;9J!go9*/^~: _$#^sGCk9HCRrߎߜGo109>};.[Y 1a }Ejj\GV R+jꅒ =ɯ\zXlN#sPJW;i Jb@]e {cD b`WG.0:?ut,i/p jz#ۮkoǖeM-7WZTXZmvYS-hv ۳zڵ=Js̲QT4yʛ<Ov9QO/xF,;%nG>]Ry}Ϙ}#Rk[`*st.Z+״l;P CGb8 tD8 141S|/^x͕Zof5J >\ڸf[vϾP4Bs\֯/;_84zvZ\bs!J1RA"Ί睡ߐ(Pf+$jR66l.slR6mYzΫt^Zk,m:$vJbezjY.`~8xP_c%6DgKm:jAM]g)!JH XQl B=@TXXC{'71F~y^|?M2mW}غ]lD)3T8Km/=_cS{qs_ޞ` f@(Tg6=,Euso/^xa7uQ&!6n⯍*fWE2|%P{M/r5U!0˚<H!Z>_!;z2Eg72RI(Q-#Qj|k(Us{EӦ;^8y=u//?߹^ݚZ*-.5zi혿rh9*/5MewҰIv;qecwKU\A M2v9N*1%F?|ļ]b'dkj\?J>m6Sڍ=›=JۆJU=7U>UUfi JNjK>Ig̹1/^st4N%#iHP/6mI oq諏f>A^5Z [c<`3W:vS[E],0BzbsoR_=Wg^x͕0DѴ>ywyJ ̴xGD#j^?N%lrKM1TDoDc 9EX=2B F4 "dpLUw~3ZeKl!WL%fSi~ 88%c`h C䉖{-W\UeF!h%FWR zR}Te;D]MP16M88CM"gy_q94eiFBs@&˨˙)5 -?yz׆8t㓍شa^xef75U<B%Hx $p{+NlkDl^wrw-5Jqb̒+7Kp¨%'lnv)^*61/4$_w~3zŦP-ˌ2˶Im[2㸽D07>10?Ig/Eh+v/62 Q/SYyˁxw TǙ個YBJTcR6=,ۤk4R"}/ ]uk}/!CpF㿲q~~/^N\ &M$n[G* WгѾ$jk#&p0N@,>#`bǀg9*G'P1_:o}rSEFPrǶ+=} I`8h(:'QaNQ>y?_ZjuU_z/Ag(-㯌pQ\QW\] 2LY!Ι<_Q3~2j)-u W*^7[h Pp뛅.|/^s3o&ƞƒp }}BIV吿yl}1^1u.?~#΍LR(iy[=Q k R42,u|)ӹ!ut'y喎{< 1Ԙ"΁ EH㞦z!JЇ 沰+DluQf 9  #ABkgMm3~w;KWykBٻVǢw8S`< ? /^s\~g`:!%q#X~9~L]CO,[l$ZoJRn]mIߙ[&f/FOPC@|^!:J̆~7@aAm=YhbDhDҧ0 '' # Bi0| k,faqg6E<3\ǐKB4 eH HGj.'=ϼo5l*+ϾრgN$ר?kNt6io?8[=F]7e7qe˗ҙܿ'Rhb$Ƃ`xc Ʈj UFAq%i9A=lOEvqfς7C)]+5(5v.?#@τc g?u߉1zt:GUfMDo! #)0WDJƍ$, 5i4GuMVe`c.:- ^Z%_b7oWI-KaIѓ/^?LerĝLcw7}7^o至|c%d 90PC`(FL~xW] Lk= Gi$TfZ9@efNYi-px+8 6_XG@| D@*C <O+ί?##; GRI6/ 4ƞUedc8ʾ"|-ald q6 f9q7eYCgYm/t lwI=_Z+-l7,vPyk4uƱ$7&&7!pxӿj3L%F@Sj;Ty"F2{−fyә\T^U<Ok!pͯ{@C*4n9-Lt{_]?bңl]㇆8G4P A  c} ]˭n%4 I."9g_N2#;S!2A}8R -7l4b-=_\_b]` t|Ͷ6 ?9ŋٺE"쿣tO{nwTY|")ԸVFaB5"qE XG-DEsgv6$WP98i6a(39hGZ?S+nU3.gV\&1PzP.:W)dZr<; F(ӝ8l/ƏCݶ_4v]Kj Wlv,_~5k~#}-4fNVHpXW{ y"-#bb3S`-BIWFzލy~ջ5R+ /eۮJm^Q]lmo3.[d*f92!v@f3\' [x񚵠~A_R]] 5:j-T,7z_6x;pM{Et+%O2c (.|`4e")``?uѬW_?i3VWusM O` ?;85>oM7v/:4H+D7 _he/C6_ {A3 ;dN3!db]P!6KZz٩ջphWl=Sj-1Q0OUjKDQm I]ڒoǓJa y/^:>bAdol_F":^4zʠq_{QckO6 T}BMm?4Z|WhbPSfv]Kگ~%jz<e 9X<C!p你aBcY(emWc_AYlv_#^w >WwWm+t-vt^ع|M;Y~kֵt}Oږۜ-j[vK!j5n,hw/Q չMyw[<ރI0.WM2yܬ//^J4:ˁHuWB5` Uj&fl*Lr,"_U@ګ숂q9onv;|!<~z;n6Ubon+0xU&z]b;RC|GG($@*d_//^f'3 Sڥ-nyRU]B1z1*q]^+ FĖ$|24B s 6rAp*14To,7yTfZ֥ c|"?}v;njǿ6/3oޥUfħ x~"Āb_΋f<Ymk_jxŃ. 7N#`deob;DbIBSH cpK&-] {_P-Aj=UsnBsڏ"uDX=ƣS3b|/^fTj Ykw՘˛U6mWS=+B"#2x*tq1Bٚ_R}NͤP]xzb rYz9r-ىoSe,w-o5oZv{ {5|^?3o[,*jfu{h0ZB; r iQѳxmOܰ{9;*p5쨚*,gm[%G'"+x_oy%" ut[e*<:Rez)Q[{t/Nf'ٛp<yuʝM$B3G7Y:]C7hQqN-ˢu0Նֲ ]W61S55#qqv7J'Gc=fxE@V|F͊6Za'H@3%@Y%nQe#k<ٻX;C[Lߦ2T[\Ct1ԘF6zx$λPӝm֝[6&ƹ=X<5e;ZIH LF@`|ܲ:fP52:j+_|5]:,GSxDcU7p2_^x͉`<{h[$M !Թb+gW` 5nY}u+ڗt8\ @v97ͤQ[G&mZ4alg'׉QQ6Kr#f-BK?KxuNkpWA y^+4b\rC8 >`(qˋՌIXJOGAl cϟm\niSS:̖}7E]WYILC&tt.{kߚ`Lp_xAxnWs]nwݗZ ޅh%: ՌWGY*=0ѥVJn|;P/HEYf2NMLᝧu`򔙘",~6Uv݄L̺SuFؕ~|=%5lWRWVvIf3lU;.* N;5+a𾛌% 9N[-wP]GJգhr-^za 0D4ЅfzZ`*4;1Ɵl<Ã/^߂(Ɨ<5UYZ?~srq=^qj\GEQ4w.k 00Ak]ϱ_P:2ipwZ=h̍O~Ƽ}eg\=J2.oV-d *[+v<ȶȠ,,s6wt%h ۮT:F/\+{KtOa)0ܫ@L0/^J)mgw݅gw' _)J.쨰ihcY4v-} ~A\9.ܪ|wٝe:(QljD޾EMNo;c\aS(/c~ 6jЁc?yY ~-"mHܒf,0GNqtw]Xx//^s(^2\ӺA?2,ZEAGe脑ˆ+g{cq|Xny3 ?==w)Փ -S2xh-! xs'_k2H!8ʠ %6|ۏ3+,E BVSqLsgN0/^H,`rpۭ]W6xzǶ]D|(DO_ZJ9htؽA$:(erQ6}$ elK.[dvIzjVp7/%ωITfFQӻl =UW$ gQ[*ox}TӸ ./^s(KRRKxg!$,W_hS9"Wֶ_~ d2KSssX&? u:kȔ#'cD)6MꇙUS уk 3qd31?^[@6Wp ִ/򏠁|{vRknB!$_^x͡2xNxo47tTo,`e'l,̆p6_40_e!n@pĘQpb]WYE&RMLOK L#0E َٟ{NC,3gDpQ+FOq"6 aC|=BQͷ[iE0_^x͡2"೎lh] ʵ"OQ(1!FW]`JlnΫ>sY\t3{ֶ]nuSy 7yRh#N]}uH/acǑsizl&Зw N5⯌-j,}} D/1ӳxknAB,{ؼ5u4;g'%i_iw.vmHMah wo N)SL}ڻzbcOWQnx@ I JK]u n ΓT&,Fp&Ӏ[yd@"=.5L͠[9erѥ41BxR;nK:2 @tW[ooJˋQa0S;%_O5WP]hw TtkߊY\8d )wRԴS*{ʙ_q#Uj?.^M[6k[DPG@ rf}CI0y*;Yۮֻdo?ޥhf[ j -k,}?E( 6t/s?U^x n5!107nol5R ! =_=_6?+5B"l΂nhDmsZ@t3lZA0G:]<ϷI$b7J<KovUXw*u| sR{kڭԾq'E 8>9c` ƶHX/Ny4lsT"HG 0Tjߒ;_/<J r7y5gB r2a|Rخ"@M Sy)4QB< X.:FgV,slSPճ.%=Hgµ/CgubYfܧ|3l"UQ"ܕĦelS#)GlɽYb&+̂v-o'0GX!D4K?֢܄71 pэVUi'nUfVR3#1__C`0;qid~ܿ#Ix+p+tap7F .<&XHԌ\CЊJBi+KB:Ŗm/|pcKgd@:Wpɞ%0{\ݶFii1g٦pxhhas@c_!7{:+N-5b#YlFHEĺMvWN!dݖl_Da$FvS HǓGd{O:"KG%0BT=GBGA7Jk +v3QXŋ^qKAsljn%0bT듣/۔=MF+M۪_w`uKx~ D33EEj&/nLAjZ(](֒:0{M}V~cĊ}O~4k I`d<pNo" !0#A0?gǩ;Zˬ=bGw uEz'W;/Ew_Xo?/^x}xƇLfA}_;fRbn jLCȴ/ <2B);SniZQF'i6=ˆFE+0h64WHɕX{,bO4t+{UM"{+wi=s{ ^(8: 0*V xWohzmQS(L#V{dF dx%z%vx=Լ atvŋtu5̋t,mPn 0׶/u+uN#k#g_絔B=UdCq0s2j{10nR*C8e #VB陧u{ d TSt.^I,2^/6[+3m?<޺>x[PvϯW[;kmͽWZ [wj=e:JeʵBH}ɿp[ܲl޿ ә0O_^x/œxRoIg߽߭v]fpʴn1"Y +EBu"Gd._s#nQ'¬RFy^Pw*Gw{Y*l*gQCOu~tW*]=:O Oh| |}wK{6RˬKL5mզ[Kl]]UrMWY]OI[!:SZG S*4^w\SGFibj^^x?%U.7iu-6z U:@w&J+ָ 5k^ԎjD 3!| ܹL6gΫ;~mYy]74^gS,,ZKu}h+ZBsegljdխ[ri/3J!u~!t >\Uj5uY&LkM-対8>Ѐŋ\pLOu[8wrťa1yJ{ ~|rC׸hķynxO0J.+ Ks;YߵL=/{^+3z 'lB Ql.w6vtmomh?qx8{ژs?DY]ۤ2w6QkP[x qewJH_%7̙ NtY[=hP3zQ#2 )AS{_O'dL>\P #MVZ۪,R3j`Jtw@ K-%ZC-u= qVd6W?-ˆ#):"S誵m^??>>O0:N/O#&wn;nXӾ"$F!ZoWщ_v53 eSjt Q1>nyjYViA^dxm֏ 9x5c %1nʬ^,xP *X{L\*c}p,9@߲ѵ$RlbB= ٙ ^޸u86&hЄ\d58y$k/?ٯVj{dޚr-]3ʦ&BLa!B0225TUZGkOIC[#Dݧꏚ|;+^x/M7/`OA0HmbSnŐ.)cM_vqROj::lh/M!;>mYb"痿:zϏ,v%s.yF7LA8bqQ?h`,cQp2>C׵/kv.5vU:TMl`I/\`@PԷMLȬʻ=jQt~S &xVSMC`3./=&Bhn)G3+<zqs}-hof i[%ϠջVD vZ`ګܼ;=߁@z"`(tn=AP_S.׮tK M>nť!(N}r'__{ ~LNA&2<^xMMHȠ3\8?X]i)DV@݊ OLb55fb_7搿~bcCK] [G=FU ܤ502SlmO_C8et^v_*=iS!0p(/~k Tx\ ?f:@BX}%.dK!Q|L.?/^FYI $Zc܌H ^ Vfs\ T,_%4hPG qgQC巶;gsEa=վ=FuD8FOY#2(տu*xE4FAagb(Gon` q}̆[zTR-0(R}% GSYXVh)4T=m{3oė^xg$/^·&&PdvL t__[%fU֑%hQ DG[$D<ZSφ`=TyS\ɭS9\ ,aL8봿ZkȍUt?pMzXM7iiܲFưYkO#`8 |R,$HR4Dp2/  0 |]ԯmc}]PKΖzL^=_64iѧuE`"8ҙF/^΃ᎀzq4#fpw[,V҈:љ):f-y&-_i`08Dko[r${ѵiZM thVs}0˘9UiJGi!kLU WcBMe =G ܧP9ca00 >iv/7+fBO`IqC6Fſ/{yC_B`0M6^x:?Rؒ8> >}Y]j03#5bXFhEk-4(*4Ig\E_nyomL?}c Nqosr=\H+!A/QUT;R{QCײ'vF{Qp,]tzEon7 i.5+kA(1m[V]nP3lU-&ʎr.;|A]h KaX 0ɩ\L?/^~o!sB$i'f83h e(Fg͚>[w.p$5Nce“`<Ҟ˫W;kjBȅB#0_܈b[O[z%FJHuzٿ = oH2xH4_F//^η(6a !.Oզޫ;~8<0>>l$ s =OŢSɹRW'z3uUTXi) 0Rnlޫ4{ LU3 ޚ`""16%.XFB |%]#XiBqH/)/FMVOM2lpY;,W,BZ$87&ܪ+{q<8316눔_^|/r6R,>G~JݫJ>}4D7Zb[.o2]nhuL]syw[@#L_d|կuT۟}Sצ)01f\ 8=NorѳuЕ6Zc BS 3L~1*7{4ڟZs`#syQ L 4}iN;\}loIĿ0/*&B㏘k\ _mPefZi%}BȌ}+mi`7}~>& Ew-ɱ.',:o;lUPB8P uxu+)VvhLM6sH9<+ !YpqCHgT!kkX:?>/ F<ڝ?7]^{_W+  TKBi%m6JyTݽ;>CknhFr9g.f7Es,I .2+s $s9 U-t_s[p9<]C慹KK9I7+̡Ϫ7{*8 $/0~:>+pi QM#y_c﫶vVwwn.<7l꽢{U{wMG)R$|0 Hf[fY&wf #z}{umtRi((F]fHHJW3U#<'9I݈WiGڧ`JӐӄ .oj8/[.ƯPCKrwUV_iHm R=Ǒ$i)ÿ=5j6u!߶;,fNzb {SG z^կk\%z=<СԓӿV}̍[v_z}PA~c@S> d~ <̕J}<~ )0ÂHD`> f`b}m}o^9B[i54č`gÃ":#RZR0o3b# ^ %34zJa GxeVj~n'\_b,{Ox/Wy{.pg1P-PblȿV*G-hzng 3,96''*.NaԆFpѽ!ywEKׇ|`/z0C'CnfВ[z4BL"*.8q){|W[uuU~+QK.8hpd |QYu W<O-TSn3_gY~YAL^_\@8[7י}e=r}HiҮ)p!%R ]ȂWأJ큊Ϛ|1DPVhX> tsW̘`> N{wNOբq-/83]hÿJM0'pYk*>b8*DGAdzsg}EFo=X9+eepĹhW@Rڦ­{W ֚~`yh~`G8gR .Rd; } ~Wgv &_ѤF 1$72E Cr_` ]K5EX'x^:hx5b`rPGPD<׏8KOGs?sЅMnG{w#y@\F u|E埿\ohU5@ޓoc2JlE>o37KxH\m/w,M;{8R,(Q[$%E77=_e6^'4Pzf;;+X7s T44 R˿>K:/SbKF+:mLpq^vB1iԇ c;jT7 G300W4,k)h Mj{io}hs iXQqK|%̿xX|riI(F\O{z[W*B>Vw ͯAfL ({.i ; }8*FH*yq10 `c{`WB}R4(/+js83ޜBCO5]j˳9rhvp; .x=ͱ_!U xEr'>޴yHiѭSۘU`FJp^|=1*OU i;zO<4N@z.&ᰔ",]=}D8H.O[oh3J,!zל ̊ELb9uuH;N >&j%fLM׶y6U-0PE@8}(yz<0U o>LbTK{]3Jc 0&ʧ"/DQ!f;`rtT]a͌H! \+LE&}֓H!a9Ů^VX]̈l:*&دn2Եk,~-(ĺg^7]bK\ h]tSfTw3ony_`U Oy8'{qZCVF /2QbJ1ݥxFw DF:,wr/+p }jkgX ̤@\2p@򍠉0@R` &iRqxpj{Gu:o^eiMdC=B,l Tb)9r`YS:OO!ldm,}DbG/ǼÞz}U{_kF2-F۾(ԖP گMH5&l+Z:GfvN3`zMɏ/r`Sih*13%Rb"8q7ͯJ lRѽ+j6Kw=OZ84gI~9h/E dӐ5a$(~ZCwCV#XliD<0)6{Վ5M'0rK"N>g/|A1vd 콼]e: KTu[g ;Fus}v>]>9ٳSp鍛pCfCB\R"3eHO'|MLkT?{3o0"㖭du%qh8H" .Y Iy ig ֎DVqQ66QS)Ǎޫrk ;VSgǓ`AVx!'@4:5 XFKLhUFqgq92FV5<2U` ]TӭpWX]k緬]W[ L$_祕05K. bDŽV*B<+hMk\W~>^IsdqH-&ǭ .P/E ǍEqHOcj[alNz5_-R/^fYBxW隆NQ4Yu~EvH‍ 6l'ǽ'UA+$DmdzF-H¿(da6V+lL.J[fjݻ3y* TQ"5L~1[ 2*0*po !pYXþē(}-dq,j;Igvxpr)EQj ΁b$ )5y/s}&YkȗF_ OzFQO)rƼsM?Iğ˿IAoX,Y{Է_T"h[+2C/b!Tlޣ4Frw2C:RjU40LqÈvʘYLR$ ZEI+Ŀ`Y-1Pu'` KI>"t<$H+z `*"fV0 OSDد\}-LI Up[0B'0Z2eaDge*}u?Oד‚\l H2ISM\nEνH*xc’Y;4O^7)Xl EKͨYYiS0Z!XRO+ )*5dfȱ 7(m hQ*H&^S[:zOh` *k|vg@k \/<6r55w^Ϧ^C x57a3©g?v7^/3CbL|p~G':(,FVIeو\H/ve8є_!*Pdm޲ʖ5SIM"=pW;']eT|n \2 >ϥ9`Ty> s`)j誰% KC2$pz PC%L!+=1:ՙ'Qf z GlƷ|?; C%Ƒ~ĿE)G(X0|dԫ$H+rMbzA"FjiƀErPw3[յW;z˚vT}H@ ̰0g|P*9B\LY??~ԼceHi @m 5J0lx;>*6 jGߪ֝yk)ìqdr17 ѝo[giƀ&ƓGHE)B)X)ڶvvycP:]/T5u^Nc(fA4%$짍` fQ 90 &{csr:̳2# >HH oddƑR[rwi{ݞGǞ8oezs@|x>4w^b65_uM.6L[M!y+,D/8l +]L[̵~$'籙`B6{Y ˿"\ <Nsyw9L| (F xͣѧtuWϕ8N $D JJa{i8j ǧYp62!3+2<\.~.t%υֈE6L | >ůj(wul7y /@<2+]gaQsDO 3 D.LĐ 88w\Or P4_CzQpj5- Ld<,WKXbv̱/z(v*  1~Alpi" kA;+_mDhi &_}cͣ|ޟQ^ 0<ˣ 998|7;șnmB04exE |}RQPg߷GylȰȿ<^< Qf0 ̢V1̻gأ/ݱscI壶_G,Ӈ ~ռ~C^7 AF [AwTM^U@=̃ `^%v=|y|Adz &zq6"2Lgb`.&F>'AH[c9ՆeZ!aN/.(H9-nU4dc-uV#3냅 (ܻptNOU`m{o=ZnL.Yi7W-68>IsFE )3%ш+ɇ^mm kQeMLͯ ;)g뇋bbGO?5>1$e@ǿ-`_2Ogz#k YZяޛg "ׯJJb6 lxUWGo2g-G[#˼s&0rj"fϜ\&rRD?1t {ɣ1-{"Z)pHVVQ; fl$Rג=u ss'zW*-PV}/2(ͳYkV[e/2YhbBʎκC^xhR:YHA^JGv L lpK@HA }7'׹liن iCЅVOI{MK7>xlS12;YA-/#9x ^͞6GUƞ6/%O>BWc*V9:]5y4͞ꖝU?}`ELē4K*gIqJOc ,AN ![9Yr"3cZRH6 G`JseȺ_Ն窶f KHq!; |r?Lgl9pz䳞mit32 l"G&/$SfuVjյm\۶_8)d3%@2 e DKٍlg6@,:o%7o.m&/wTXP)!X`MWvOgu;¢(D BY4qѓֿF?(7 ޕ.oI ]F_ZG6ZQl|JնGyd GN qaNYb dE HXjΛ/3U^R =OduJDրL ƾH6?j0)n)ip}k6׶l$C3#bLA}JB r O3i|ÿRQJaN3<=]ز ן a_dPjn0X)yUٺv>$afU@1)b0ˡYOkvFDZNFUZ%BV\EM}ĥlI!eg4Ŏ:2d. {&>8paѶ驕XhMtrЕ(#;˜8C՚΅|Bd 5N+bu.T9CBQhY#[q䕵><^Ns'd6f[!\L@ */6 3&)8d]:lUᲖ23UŘWX{tm}ڏO# 8nzq3`> bDzUCR<2PeF__ K|A_" Wj-UĿR֏հ!"MN 6˿0CefOI} {sD|@k-iÈGnrW9*;p/D@"|VyIB3b|aY'4:sתvMkHch\nK#A1d J;}׻a|sq6e3HcҢr4;}zT}@D6=26[-gW 7d z_dqQ]Q~ŦtȜBB+55p\eFf-  k7ѫ='k77y5<'80ɗs)s8i]SҐa?N#/lkw_aw,Cr;v̐Le-GBV^a*UB D ܶȹ,n 6RFZ.o U::{wɲm~m/$$?s,@॑$' |Y~>G6 f?3t޺Ki(pK ]Mۑo,<({/k}gS<3C,=JEbi:/yL W{AVۃJk72FS!yҗI@c86Ψ)Y,h:kwM7uC'R9!$0̕t#俄 .X4{b@H<-A_GSOSiim C)ڸcG`NC}-= SUo80fkEb$!%$Y$M9Zdp[ \m8} GPn FT4a,k) ,J[34l0+P;m k"WP4 qtu~s|qŗQ}!$w9.q. ¿_ !a~ ,Мt ̝}6w]uv_#Ѕhdcաa]\n)~}3σ8Lw+q, jW;O'/\p48RM0LR 7vuK .]HZf/K#*K`_eu6Fat;%[sp"1 l:o*,f 2>k-jpƠFOţvTꫢWiJŐ^Z L+-Z[zzYH]m_` (B5.f]mإs<]qGuk0d3ctYf&X<؟¿_&pKs;{/}C?lѧz@iK~^ejX:+SnX|Uh+Uh$ Sw~JW_/=_ X,J+UiU:o/8#*gHRl_}/7EzOQֵV{Wmnip8ŃOGf+݌JBgl FW\Fd2Y7"{~ն]Q:զQi*12r#Uj)`voT6yW5_n|۽;O6N,!%V 9-s퓿̼gY% Oqt=ktɡ%\"0d/ۋ#uN_aPgY rDi$a.1TbfWft 0K"Ƭ`,S?k6>l(>QZںk*{0 "=%7ټUN+;߰=s9Ҳwz)8xV YixXП]fAYT֬s%_/ BfhQaYM8>yy|jsiuzrUCWjKH*1W|^'Sك3/=00c >vSoM[(k)w=DPF3Z'Sk\Zgjg͝7g_`E Nui+ D#% Dm̭İmyA6 d1(Ċs<>GT?MoBkh6,r##7QJ;#xG~* 鄘q΢"rkQ/: `z??eM~eKP46hb7T+[UMkOygUӮuw{6;{|d )Llx"Q+$)Ϫ?Y_s?+_egt60yqh$c- Y6i'oGo_j_3^j7ѧ1րJ)5l]ܶg_BXCd;f8gة0]MMZ`)1PBſY VU= O{1<L(';-%aI?&ZReW}e |8!NIQϋaC[e)k 54,H(A%b{DBEfԴ[ݱ㪞C΃w૤Y-6&2|M#|̄Oѹ6XfQ %Z%mfˢðts<ϔ\QqlirvQ8j\u׶z7ޟ'SH)d١TPDe׃RlQZW%E=;rƮHK@@@cq&'sδ s @g'=jS:[A$ YWm5-Am % S+{fZmTsU>NL,k$tD",b4pC6PTeU>u}@@Pnt1(b_fL~4eVUF_ |0td| *:tǯFKMg+%7M^_dgydad9XB2{P[4֞+Z{nyu3ncǛ? }l|GSI0BSQĹVdd{qsV%Ls[B%z(K\TI+U GJ'P4T4UA ='Ӈh}&ӐLt,E呂"ػLv,_cy;Ɲu&O)Pm :F#&F-\?6J!p0J[@i6u`qV[6H)tG)-AxkTLV60W!Btvnm7>g;xfC9aALЇ8CJVHkԾG_u:@.3a9Xd盽 uo|}]V֮v f Lౢ+WXNf2d$d(σSc3޺yzGo~aܭt6Tm=P8a2{ʳ2EP1sL3e,/"h}Oc+ <7+0 mTQ63&Z (M3"fwڲ\M[׵w x?e?: 0˂!_'^ s`]'Ķ*`ͯ32p3#bTN,k ʭݫi*uM}$IjV]H^XRGrBK'@< Ei Ow,weG NKl h\;r'̅Cr#*Ԉj>]]j |XnlL3X<5eM2Ǡʴ[aYjܥwc-兾SY~ 0 sqnH^ `<2&<7Y0Zd#/ܽ[fqؘJ\OiEOi Oi*u>[[Nf(D O|vGRqgp22q*IIآFSԞI; 9DLV~yʻyshl*h3M-TӚ7V: }˝UN:4& L"Kxd3N'է<$Ȁ g(088xf盿Kf;6>[{[Ѷۖ~[s[>xO_ 7۶~oч>}IRcע/a0y+MF>OC$ YpzY@T9:$`($6Yp+3NUsn BvuTXH0N}u5YigJ@yOM&>-o߽~qprhLpvrYYnvjyl%Yf*#DccQ.7D Dc(F$DgsrsW_\A@@@@@7 42ii~wڻVzd*]"_ѣU P.x-7WJ˹8,~ko-%j4JMTi V=Y!O<ߞ`) 'zINdcs8SZH#o!룔+|Er'-mE/.q7ųKVȶrk[sI!L@@@@@ ,iZ//--p|#?i}f[Q^=P3*0(34T7uNe[wݽݍ/~c 0E.g98Mj0Θч% 7dy~`a<JLtqqs=+$ X*ԟo&,V Gwnu]s6vj_fp#e[HcJ X+u0J{ŧ?S>g(p2gL| x ? If,}Bo*VUr'8sBr.& BgZME)j<S`n js-xH!P[(dd(NZgإs CGb2ϸ2Xq&"Q&][,s-Ҟ/" ǀ&΢y!]i* R#'g୔)cp#l]Wo.n8|J_4Re=Ge}W'eA$C5dNʸ4|3Dt=+r*өL8H`q(c<?!^CkϿ%${.zWX(ʹXGTaYChK{V*CWE{wwgOa;t5s֎(8Xd^M/ud+K7rEQ}8^9Aͭ;44K}JcPgSnV=Zs2>[2S ̅z5G"/'vuٿ||YcnIOf7=rk5rwda-Pj*W|:S:qZz+6wy\0N"?N,1l*eF0/p7cI4|̍}=r{eMҎi(ypX ràatVwaMSS7wGMX,,!b"5xp^-MRf29b#Ȗhf =8W{,ŎUb 2FSU|Zk7<\䏟#a0ó,^;Fih߈,K6K*H2@ҀhDě=wۦ[/1|3Sj VXZF,_ߗg2Ko/s PR Y6/4&K@@@@pCx b3C~Isc~ղ ­#eMٷ7SFJ].Ac ŔUԎ^6|$ҟ;ٽ"f\EcE4@XO{<}hGum2Gft[h}Ta )c@g*, Oi>UPF>> Y'"TE/\FSZܳj3UJm<+:g*#UXZ)ӫicϾ~Q!%da.a^,K,_`AL *`:SN#:Ls `z|zRxwǫ3hr=czsHao/3VzZGa,lkE7Fs3"rE TK) K )IL }l+քQ:I0F$`#<<>~{ǎ.2;5%Х`Q,Zm~mGӨ= Iq+D@@@@4 h {#91.<;nѵ6r+322#Z}Qp@gL5PmCwf(H|r*s_5HGlGe8 \:?on*lT71`!*D0mKz_ڼU>q`4ԡY)&K@@@@pC1B hKhަ4gٔIfZ"+? Q07>Ov?g6Nw[5T4P>e۞vk ϼr{@8&` `%/wû.܊4L'b3as';;U{ϷW9}*+̂+! Rk6zV62J8X ٶ<67+$ 0XBJ3(M\zI4p#{69^h GKL^HWm  [(ȝC*.]Gu|W plUbFL⫣ԏf>},HAjѾP83 %`ŎqV:)c:rmMrGH+2R ʍ~d%lUXW6驕F9VYw^ͷ~ױ{`&)N!S *c 0  9prQ0_48,H&P<>&sv5ѫBJh9`V))u@m+}\UtXK4X1 f"0/JXq.7I22 S0'?zAjk_W W|*_c T8GVej']i06h,;?o=<=$sXaPp:+L.̟{?L@@@@@ΌXeB 1gf)p^I{oSP[Uajak Viml`Lm W@کeg `|sIHXKH#`ɵBfO*Ŋ[L+|efSR1dbσHD8x>^3oº]U:T⭲Uwc̹GϿٻL?\d#3 [uKg~4ۣ}Qp0+ڂJw ͌)p.r/W,._Vk/H0Ǐ~[;kʚ*JC+{ mJBE=x4S吣e7u]&< c 0qTh/-Hz*\|n L ^l(_d8.؟M8:q =/,08NtC?mm~ٽBYMA1i6 uAkwYˎ^l,|N@84,davo.sa_8l, Kבr 1-QE: Q03N浄vDUVɣe-E;Jw%}e18S*0 %qh,uSj|1 5`j #5ToYyA} {|{W*o̒mlLXޙ^әR^U%=H&) +:ZJwWlJ[ y(5 'GyB1(9hsSZT&Su*Eib>lbfi9 !p;͇]{쑦_Woͬ؞%35dNۿsYtYGqLTZ!kܙR%mUGo\$Q/'5L]_,,,,RW/6S0 [ÊZ4)4bг0]b7s*,o\!(q)v*vywwF5GV-q\\}^M}֓Ks;?@&A8_9,,,,,vBǫW1磳HK4d:ͯ*p+[__rKz/YLP"+() _#-.(m+mW=bsv X]wC3%P聚2H%,Rk?.0 3SS{|7" "4I C}ysʚdQ-x! *A ; ڃJ::5F5$UgjGnߐ@a.P4j`q8|0fdBbV⒥ QWx#g3S(t͸+ AL:꣭_/{WhKlqsDyOXi_AgAwq[PYWHEohY_pi_`qA_<#%8!1-㑾;W$1 (,(# &vZGS$CќrSPȝ>~2٭lhgbaaaaTVŶP f5zl.lglysT<+ݷ3U \SWTR^]֞(kI.K(|}̳ ~_>jg)Հ!MQ 2+0bI)(Ie鬾ꠍo2:r7N> º8Fsz=VScjTg"8? N]_|nsO.ߚS9_\Z*/hZ"kZP/kK(kj |[㍷wyv7^'K 0j-r|PVCArʘۧ,lpV'v`1GQ`Iְry kbQ.||5 @ U8?N}5x74eʶm /m/*i, ,uuVqJBɶ}!߼ʮFR!%P* rRa"˷eDUh/sfCı`I$j' oYָ,fiPrc$PB ΁M۾˟T?xWM]VE]l鵦X瘆w*×?6^̪ܳ;Z}u,@U e%~-+En_-yն/z`'c;t|<JpQ `X TjՠAR?5F/[<15ILG21N@dcA+Y%Vq^|ش3/-y6UlWQ\X!ʺڼ5K=]ÊB {B!q͉MIee[6'ToK[]{^[N<3[e?8<3#<cD{50c oǴ@E_p|d8jni pa Fhb`VʃcM);ќd0sZ(=~|X{7o=&WnjW^ZPT巤&{=/+WܓP_WQTvJCeMa e;JBਬZѐz]7yG^T۞liגk7?#o}?}ty, 80iܿ ߉&0_b+ ÔCl0| V CIL p487?XT=O߱!hS~˶5FdqU}QpEzCy7-i,mu; |K{{B{"AT_[_ klh l E>LU;TO_9b˼mQcW_y! IGuu:Ҭa 5+HN̍5hD%Es|%ԔwJ t*Q(dxwO_zyxgvE;jpf,,,,,,s2! gDڼº'ګXXXXXX7BXXXXXXYS3XXXXXX?8ڕxZTc.caaaaa]fiƄeBaaaaaaa]X΢q!ˊu8Zi1:P$eQEj,,,,,, =@H-cɑ }fd=)+f[XXXXXX7B,CXQg=`T, ܚ;uj<h~l[_7SBl{b7o@'8caaaaafY$:^SO"kV4_Dm@1Ȏ i~š8e(F:ѮߦGC\sb]f$xn⯞ HXXXX㺹9pR(i*|q}c^/`XԳъ_$MKdy͈s ~㜬$S ,Z.=u]lAIjugx5eI3Ri ~ 2+)TԳ ßh¢,$d,Ne]t',g"*Sb%וt#r܈  aP 4N;~i"IJ;duzMcJѨBDjﬖ) )'YF2 ckڿ2E?pS6]aDD!ZCoeEU)F˨ԊAK3w$B.L3Ȩ(Ce U`uzhZ\&Ie}܏/}Vvn=(U{/ 7ӅƯ,w[ۓ˧;E{3 _F4C֪J2] VõC~w3!_cGE>h_W[#%D3B}ax4yQ,,,,5:#\5W(( @YL\C2)/$@3^icH{uNx aᗀ￿7+_IlJdxڧr_/ MH*2Y|yb|S_@Չ-*FDϞ ܄~Ɩ2NGNI7]){B_ҍ >+z>ZKpJG|JD,VΜR"ͅq{5b_,,,_,Ð*eW65-h]l+}6m/ϟ ߮Y?C]'o+(psfZE9M)gw}S}bZx /fZ7^MwMw\Аz٦8n6a;+,0jGuSb=`j C+7;B:'hMD _y s|x`M__iƷcyϴޒ(%ncdLޜ_~'ᒔrm| >jR|^nM>5*>-`v3LCJb\l]UXŽ K$g\AK0I:3mJխӈImO|tB_>V.m>i|IcȻ %)hHpUrfiL`Ŕ.O~ tWl).6i)"Y,uz&Pj<> SdUU;'HMMur>5N2ӎ&⯥dRc[`5'E:5cj.:kf۴PG7cZN11 e$%T,cEJY>ӓW"ӅH1Ȏ'0D#9TxgFmt WNQĽQ|>_^{Ш^ٟkfپcNd{ϓLO"Ja$Z̊Έq8z̧_M/k/c`srzcw= Ӓ! o5jhJ,W"7r %KӿJ qBJnD,5=mjrcW&-럏hiSЪ='1sfxNMze:"n6VI3,%sN/2FbZ»I.vnSRݧ%d{ا fKc]e|n_F'9Qv s; \R=gĸNCn*)R>3{v6/˅XNx%1Nq3oπӪKp(0 k_{2΁Ht7Cj!AMt+9L{ gK5_&-RJ#$܅b q;qMl"nԪ(S%1EֽrtohTクL;Ú ,=M Ȳfxf^Ks>#.Yb;݈$w/Յ|U" XLZ%~V8Yº!błh^ /S4(bUdaO͎`b{"6&{V<  BWbDD;Z{mX:⯡38p0Y&ӭ怊*5è&Jb! /2=U-إJL#ՙZB~`[P=-pa``hr_Wl"sv۔7kxVyeBKlw"މH}I61bd+?. k/͒W76igCܚ^$Agºie_K]h@H/fЀFƳKABlL"6qKݍ(X&*UCk_6[jb@}L,^Bwu$=v},jU>ҙ ^vi[3<ܧgEx]8z3/F5_U~]6 %_Co|`᫂` U3dikny?@7ӅȐ'M8Z#qaVLyՁ{*P4Wl)黓â4*5̖@Uq rm$ER5!:a$S$6Mw !9xƓ$gP-4 3Y g]ІWXDZ%j3# hɆ_)ɯ?~\(']U;oMnjOf4J)]y;ctgc,,bR_ 1 C9G9a _8I maUw. M1_va63$h#s]Bg|3CP%qO)n_AxR㱆i6>'}kl |)= ;"9ۦyL䃁\(+Vou}f_F tZC'3&w Da1iF uI>Sn-!R3'fxf:I/ W2JXE<7%H<@)J/[ڴ O%%\&lLOvBh+n"|W!B /dzEإ{NEIdB >xnU)P^1N<v2I0_ v ˔iLKAhк/r%h]$Q+xU @E bEG R. S٤8$Wk@SehZ*0C0u`Dg#-#Z\y1|0n8t83f1YfImv-yu G'`tE\Hd RݧB耉@$ z|> '3bbGP}⃂N^pu 9C !S\XWkP;.BɈ ŹZb7+Cj =Moߤ?~Xe|g Ca82RjР%/so_Gn̼j(ʕ xs2B&׺]ӓ;h&H2݉_HLwdluv2BbRִz΢סegW.o{3u>WvW(;-BгW)_,,%ܥ-I0`d4y:jvǟ\zSܧ'٦K^V(*Mb6%p6ѹM@D4EKXH^tUq hk_ 2%p?iG.j[ʦڝU'>컂L6JG:r"hX5O\nv6Yb+{Gr\zVk EUO#cvnSo)di)h~ٿnmL\٘`kڊU}%pR @r(C3餧8Vit " ׃Q%(:ꦿ]ZE7C&Il  {m \b3t@S҉Qd,#& ei#^ P͵IdJ~ $5I\ Z}F'L-_3O2UoHwEiB:ÄQ+̻^|sIᦨꮈA%[B+ɕрAh5\ИXXX7R_jNhҶ|K ?UA"{Ew4u󷄻uʷڿ3 BQDTYj$zn1:5lER $YƗF5Umqea+/}Igu_B^]LՎ^~Z4{=/-;ZkN6E ZHwL|(TSM`O?w_'.8tJw6dV+,kq+i^NS˶z((dYޑ` 7 g#8Wt`~gջ<|+;pCD(1fs?=*eF׬$b2\P1TWLSC<@4m!b}`Y֫ ok58է7O[RӗtcDզoxfBIqZQkm~5 :~FO59TUѮ{Msu⯲]oKs tXWq.ŧHYY' .z^ׁ!=3 S!_ڼ@  NCo>vY!tgpiSDA]u)Zws @goh_Z ɬT[ ܭrרu 1-_"H 1W<|J@%RmnK'F?}1/;$wY_ɞ];Ӟk+ jҵM'@6-#ZjW,3 A1zbSHgz'PoCfko 3@ }:> 5uV}`[NMKt<@˻ϧǿ;;rW)vkZWGAejucҷ3_\^aX%wD5_88 P10 /*pWԒ>:ڿYn DtJhI_/̈́}Q%F9:tҌB*A$Rev%~|}uql]TEͮyؒtz.-h Xݚl]58G>7t֔k7ɉKv͉̀HȒ:Vy)K]o~v@ -4{XX[f߼ΈiY/ z`7/;u̓eklf3ƙ jK>`?~vᦤJyb~vKބśbWmL` ',MHp5G3ԑ?̿3r.Lq93*W(@Ou?=rġGpOǎO>dٯ;?mo~YJaӠZ/(=Բ+-(#(_T\W|ohiOͶyϷ/QU< '?}r4iQ8gAwا82 |ᐢ"1N9<9H-V6GjzۿnVnI+i,t++Q(YZU][r1pe 5ұnVqzglJ; &JqOB4X!+2d sBZx]D#\C!$IQhҞT}.3~iCl^Gt>ߥE]-ͱMi~Ց8~@MU ID8GHrZT:Jc1f!?D"ܣ>ߙE$*/ݞqK}y!"'C/)Cᜎ.7r[ѻMvץ o>j0 3)`,[fPNl0iCA#@JT:oh||I 2f9P$$1h/qvx]׽ϹCZUXQTOOǀ5!;T-8B78o[zcfۉ/)gjpFHTH'_|0|YF<)M'")^a+ʖ"mL"YmSbo!xϼ31v0X9+U231PZs/5@/8= G^z|҂-#jbWƯ]՚X)=SA &8oNodo e1"Nܗ:UQ[j!vfd@L$ã DtϩsN.ӊ2|ҏ /#.~Bt,O$/M*AY >ۊ7_ɕݱ-1M5yu^:4A56LiD f˯Et̖z2$(C#_}>X=g}1^ j@z\V z0c,K ~&Bq3wi6C ݉Kr-#-ol l /hl\ue@kmd-G\ v:pɵ *~skנ^V;hV:k-_Hoߟy$F:3{f״YoEmpmyJY963fDyK.:.ʈDMM`0|븼 YeJގ*_MdQ N H(CQ \}0 0*>A @J '![OZm$m\"Q:3Lu_9r`Ajhk;^7¯] BN 0pٻgiXT=.xSrՍ5GJЯCjK"| nB>[ȚQNȳLk5 /o[O$Tm T!jCs]eodCPIp^is)ݹXk 4v5KBd=Iy];z++KZ"Kwfm90K0t1\͜u(8džw?7&j*z"[Ce 1xTnkT7Oa[3$?>2yjEs RQ"NB7C±W[s]`9(%o Ν}huyic\xug%`h*ŋm;xM_ZoyDIyE3ܵoLX@^yB/< W,4Br#ݭㆎ: hA{?gvnK-VӈʗRܤ\.Un\)967-䥞E4<{/~ȶޞ5^0:N+g]dcaa݌a*=2@L7W~Tep;;|wB*WuE, l ljL+ٔ]WOvlͧ 0ȩ9+ZUť[ZMȭ}zvF]yzTohuDH}ͩƇ1ess-Pc̀SoO0M|[ji]tQcT9ᄆ 98>r'WzN#`@ H@fP e6;|#B_,[<G*K^UBJ0x|\ÿ=]#1-'BX⹬ճXޫ=Z*O{'~Ŏ;6_skѺ(ohLlj/#.kr;οR#^_y{^fimgpM{Hy[XiGT~] NaxQB`b`*,?*e { towuQ-a%Kmq2[ug̪ۿDXiW dWWyM@M4r>hxE)\)N( ȓH"2<,)+!nuΙc6 >3`IdJUMޢ{[-"4Qbd^(;~PpEA#0Z0dV,kkKXe_n4ҪP60gC .+c0pAd |[]mM6mClYO,;A I+hNr]g 6^ρE|9arP .PI oQ$QMs=gP”UZXXqhOGL|B#(a^ǔ`"zϕmꩺvYwQWAOi_PQ_Rgn%KKڃ:Swzˍu< `lV/*Y+^ .|0z{zY[\ioNEMZyxi[pQGҺyOt_+A:hP)i̓Bi-R%8/}V4E( OwO=^K.Kd-+?>U#o&{=$h(/!˪_] AE2Xc_}r].֋lnu`{d!S {"kZ%ʮgs qXwG܀X- CsjoX5VQ֬_#|UN`ʡjZh~ڽsI\R%x+Wgy|) 9NV6Y3sr)F pnp:ᨅd! Wkyj bbiE\x :>XUbF2h S>xWƸ -jwz ˺} z|J| := [*CKK[հM}wPFkdp?%m޶6n?YQWYK@UWhQk`^[H<|`?6 c*^Tؘ^=:@ņM˻%Zg .y{evǿ>^uRDu93QR4GBVs J]Wz$'/}VtZ2*Dl"ݛHs3v"6YsmqJv>#g@M6!ldQ1 H94sdLA B26 #^)L2H*ϙ#͕XkYH,ڦ%gHcgƻ~ǀbNhRSI/x~,e:3np3oVsEg61UXX0`KNbP(g>}zܪFeM=ޠ-^7yC":CB 5t[]1iօOloϝQ-3&ڦh)}%;";K{Z|dmA:BdIJm_3]4d$*"WO1FF?땞<ЛxKI%kqaOlw|akpu{BqΉh rhR(y/u'k^85Vo *h)N$I9:ӅXjmZ,"uFl()ZUNd:#h?0_ƝpP9oVҋ/ġ:=ˊyr[_Y0?&0Z:3:FH^V~ ͐#4z,A,yGAdH6<;xhօzU)~2 Ɨω!b^< 0}n^ ŖѴaX@qgG_}lsdIC÷ӯ3+&-xiWIߊyy>*篟UpxukN+ꓫ7=q89jlʯ "8*Kw!닚Z!uc? Ks|7Ial0(~AJj6nnmݾ˚CW_XٞU)-wTo `uw2-F>]ƷӣnOt:.yJt f)%dW"&:flk,ѳm+[ad8mqS}@^sZͧr`ZeD' 0T >}tsmg ӳdxMKX+t8QU\"SSݦ%TC:qxr< oO_c~k5{u6.k,º_PX=t`P NuٿV4<;kis{eIqE{bk#e[7>V7?|bϕ;Ṿ{jin\ޚT9_c j O%{}ՍE]~%A(9##pigPLq!<,wT)dz\$-o9cau:b=Ѥ :|1M, 9465GZ#QcD ZU~K\('$><'8V󽧌#oJp֑ "=qwRd$!NSi C*F&_B\}'Bf9$/8og)/j!J,aba2|Pq#TZQF|G#MjZ"eAm]]y*:V'UnY7Cu\Rp28rܱPmZڶ O4,lM.D3/4.y%>%֠ҎΠe/EABuc#2Je~&ΘԼwsIw: -s[F-!XWl9~\ˠ{sl3x3";nnGMǴYB9}wG߂KE!=e"_)qJ= ?i~μYm p&lJ0n^U|cl,][3}_Q_qaRdF6^>4|I^ \`ZE*:h`ڹ n^cAUofʞ֤A-_CP[4ɇ"`荽Oϓ-A[=;d<0_RTw)ByD=S΁/OR))3ջիb;2-LYRS5ro MCP4r@N 5ٿB2 v4LKzMKإJm2R[=lr%((Vb q}&*efeCر (T}}J U6Zx;mL٦L6(籬5Pbƿ?uK]Mu#ה>ЖwD;8Rpf25f>ݪdQ~ڂh1`XGh'@|S]n49SJ\sn,͘L;BEabaCZrp4ط㵛ShK)\ӻ+boDɮм@8vWǿh߅ ;r 4 Uj0<l?re_ofx7'Km֣e,p%So{nECLygq+3#'hi?܇Ҧ _&@hP왮3m!n]>%}~.mJ.)mW-sݑ?|*B bX t ǝNc8"Tz73rM+ 4G"ӉX A6vBPb} X\bYnt_:!290xYﰒ,im c fB0mXsԚ;~Q-ЏS8M\=Qk F3qU&x'I9N!aFŒo":.hjLOc<:ҿ}ݍE 0%%*ɝe&l:!l0%$$!I%fM|3s%Y6s9t4y 5efmfy:z=ۭ;3qUIY-{f9i,4)xՒzp~j5[-®غ^N^2b$\]HUVĬޞ (5V:f|G#zgZy+ܪ{zojpҀ&ɳ m k;"y")ս!Pƾz#ńIu @^h{JYSVB$ y,WۨTCʮzi^Cnk?>iGP&NGi`x xx+P6Y:3 Bf *b\P$h_<{ýj$12۲>m00RԘӅH(6_U@&gm?1G\:=?uor ? .Ntybk <|f#0%w-Z uD4|T΋4ۊ4^ק!⚽3K%.W?1㕷אcvX&+4FAԤ;e9eMsgu8q/u2V3˻Bn BR*k:ZxWpJ.P@oM!y: >F}|wOr1GJNu$6e?rԣ6\cAn{g۲$4$Q$+d=v$-W7J ^pUƯ(8S>\Q1jmorCo:Ղ*ibݮ0(n/m|{{8=P7c%QqoVt0)1:Va3Yl8efg}rSsvxӈ"g>+fClUN#>pm^ i !nR:מy]> `FD=,W^ L9[v#3p@"v*cg-g< zYH tpB _uN- bNg/BKϴ҄c_~p_pk^^C:F珟w^x}w_:(5. /bksӜo4q'Mx!FFT~D~:yV8RS|wY U&Tնf=(aQ 跀aEmYXG@c'wwFիZq|C{?ρi/8skYBqb {yoĒԥ'% -НG=zx+;UjYYxjqRNvQӉ˜ gRQsK^_;I~|l_$NPߖx׆.dyut4 W( VF/M]"uwH|ȿo*knO]ߗӯB*ؑZ-ͯI" P늝ZQzTtWmBE0/E?QE<`'|‹JxݒGr,ob~цkqzh/1Y̙rsKRc|Q/ϓF$B !IűtF>T-ZE'K!4-}3|S%ѳR| 8gL-/=$/ M/7#~Ý_7ùqP:MM=XK$2,}zghB 7Ѿ~:4 qC<VTg 4B"_>~ږ֚=ً;btHɢ:~d1:~⫄pqi&6t$Yf d;Dk~pU|QWB,M$KF@֨*z, :_h2`g?<ލw_-I-Ϊ[[[ݝaw*yfͶum!|P_TeX&uW5cٳg{ꑼ(t" ¦YWhӇqL`;\.x(Z](|hvv~: r#\D,aUds2}HOlŋwjn_߉.v]IHX@iDE8ԥԚU1e]`L"y@[& ].V4mTFTo ~'5~c ֖I:֬i!.Y;!L&CQ}G-a8bV5׏(eCY*W1wҏhm`šʚ27(A͏ #gqKԒiIS]׌$kԟh4VY (yShMBj~W/ip9iѐl[aЍ/ExE1-&J'P4 $r.,7xs >;iCH7!'{=u_9iu׿8 ?<=QW*eO]-IZXn]-U??3kf s7ke?=3=rl!jqB*N['_k+3NB I덮Vy,O]>$[V'jU+VHU ^,Q`ݑqs(ʈEE4.L:-fɨ%㕅,7sړ$ʹW^b> w!;ۏC̴@"c&Qq,IJ7Uaq@`WC= }ۣrg Qy#IWA/!՘d_{PZ\cIy,w~ ?jfQ0|aS3| bAD.Bs]>ٜ޳ '95N:i=4*:5(Q#PCm?ZSG@C QU*,j"O.ݏ j0bS,W}=𴀜g ,j$vH-XݕB d׬P]asH$P%+bj L͸Wm|u:qH#G@\H(W2˻UI ݡ288vmhgƿQs`9t= $۲Bf2݋nP~] vF+|<%ȵ|Aag:KvU6tE_'*X@"ןW"$_l瘅 NbM9_ ɨh.5?9@-fP! AJ3co&QϗR?z0<W k̤Nso,V)$Ňh`"|ڌ/3F_*AɸPBV2F߰DD h{0nn+Xqä|'ߜYƝɇ:Zt'7>}4<jYB$fSa i EMEc`x:5Gom7jy<$HQjsɞTpG)Hx##}wυ]Z.Q-CZ3+i8zgH,+~4C$Y+G*^0zԝ_hP B2>Yү?y5/ley qora{G|/J F $C{홇 J0|Dj:#AMluя,b2-֚uN:iQ_k-oF} WzSʊmyL*JRC!n8?`vh`I3W4Au$qϭbj50<;~0f' 9b:vltϽ!(""A :Wj}lNH%ɢN7.fy W+0"PL637:{Jtڀh 2BaYFo RetZP ?KbNx߰_NŢh%lmzI-d,\\~_Ȟ_ޮNs~+_k ҳV,˨%!S@Ji΀#ׂ$ԁ~#[ǰ P5`p9mkuke+h_XV+IL*!BijI}`9FKK/hTۄJRH×vD $T)" 2pҿZڨJ#0yH)vuOo8~FA[жN7 ue<ȡ%/$O5+d䬝7<^k.\~t[e<JE 7~j;EyL,wntб>:yM] Of3Kݧ_S:֣O|}Jokº aK-3V\|$~,AԛRƮo?4LSG )?"_^=\[ :j+WEeW(y$ɋ{*vWA"7 6*=u R# r2f+1>HF֘L&EoVRܺN]hۅ҄_`b;J;r&՟@4fxq^|r'7EelRpbx$=ƅ׵Ri-5J6lkZ>_r. ͎?lف\LTAZr⋏^]?hʀ*c/I9,"G-ח( Bm32\te1U#;NsV%0.K,*qZ[Eբc1☦n^FvcGZIZQkJ}Wvcw~CGhSjƭMY m)m -iJ4Q TKbjd5ބ;eaUɫ:v6:q]EA{f<U 7u%AV)V.- G+$)U*e$2oߪoMkjs :nkƅe2Pc/MR:z|X{ϺV1C4GӢ$t+oPμYE _!Ҿh^4#^B"& G4gJ;=k·Hk@ӦW_HfLEG s5B=oJGI[:EhqxQɬ'qdԃ:N2{>n01; B0_*_`]4]M_\w='ֈCQڬ% 糌W'K^#OYHm'Vle6ȳD3!;sxHs$uҌjqR,FXLV$em f--m kGjsm 8c@%"KS*#?78E(He)hW [b5= U<'iYh\lHPt,aЂA-0v&#%7{uޫ, p/ $Immٸ`^ n=D1\տ6_}2jRI]Y1f m0t0Fި=}g7G>9iԈ9vCq@cXZlfpqV*>D=!! i#fNkb;BQ/ڛ5pϚ%7fvAIܨleq@*{ͳCsӜ; k8 ֶQp1BJb =h%D<8=XAO7vgb]_R*RTPTQɫb#yuW(V( $JO>‡ +104Ai.$wuęXg $Y@!TpWMoWq6elu6֌(2BC/z@QQzB!}??|*H0F3`#̡Of3,k1f{2`G)õտDxa==J0MˏUe* -X ތ$aEY\+ouc:4J6;?6xP|kcg2.#p/ʕQR8"V˺˺WؕJNB(3V#r9|[!RFT*"+Jy4ԐȵʄzYl]g:YRѿc|y({t1|ePye͒J)W$ *EL8+B>.!|%jਪnڞMD?ڱOBg?N N=8EAc(K~p8Hoב7_yO핍]sZ[Z?'}5j>D_| f~R+_r Pfb87sNju2毅77~؛o_腵K7evДB6qCLZj_b0\84-+ u|Kv~f篵-rH렦k;w=y/icq{+q;WIKV?oہ@v!\8q%/-+&Qd`\o6[^{&ŏ ?^{%B~N` ڟ˜_xʿ/T]V;1_>bb!I#CD(FpqE@:4~ '.lA%Ѓ34G֬k-'PJI qx$RPĸJqP$@ cezyH NY :YRW)F(#+[l[6 8џ*ߡUܚH@r\۳͂L" _TH́# (Xޥɡ~$uׂBGLf~l[ n 4:MjPȜp}9/e-_yc#7 9 7/׹lBusݟ_9<$08gG8?".Y8@Ed5_:־@ޣ4-mBer2L G6+ 1c1UIcG]kaU}Ꞡإ彑!(Jא?<%2i^yO,껤_XLLnj+x~5 .ui_۬xK_}pUf BßGeyS˹A(87a~g5aV32h^05B!gg1o6@ 3?pZ'$(%n\- ^(~Pӣ5&_~2֗(Vl7xg-b]C|V_9wb=bj/ Up=c#eփQpZyJ2J]@jz"+ Oc`E FN#Z0:0Pw\' \P)mXe7,a SP}6&]ӵF\Q# ".+UžZYsW@_7T ͨ|?ۨ iV. A9RʨɬI)[EIB0||<xu4~#PIrRNGWnvumdFAj"gĥzN/`x ;(ct```Δtω/zMfIM8غ"+^!KV3;ˀv_9`( b׮Jѯ)w?|J9_ NS% (ظJŭV"oe[Dc{#ێբrUf4x%msĭ]ȣg4s t0Ba\}rh5[v{$75?5)y5(Aol9D,-T~pM_>P6LjڣW{ẢR+vWLeN/]G"\X!N(Dyj4N߰ޓ5@Blua0[FȺ5^2/#=,'.$f4S^7QkGx 5KeaQE^"?atɢP7R̠?/ۋ*\aA#^aΉEEu,  W=:Ns_` zuΟ>hj-J*UJ9FΩWF56t?~w&}fƵpF:(ׁFT 5$uG>C 8 M@{xwYeW\jW EWkx˥Ļ:} Fz;ٹ,VA-VԍҠjR^4BwZj<24Dq@ؠȨVƕĊf=UsQp u}"GJ`XK`y/ySOT3̅-ZȺԠ)%,T|$!8g!~=H%LFk0IF&#BC,7` {tC㯀Y_oq\argy_zWՎä+;ht.@mJBKI[_՝(hTD+|. CiJp .Eu$ 5ZDmQ?^1_ Qz4xb&dQz-qKvQ r) F19\U'uGwƇ8vKp2B[3Yr_5q1F(,|*7tJ!׽㣛Cp){ezT=-S|\2B]_Cf&pK }pqh4?؂F5 n^L Gp2,3řgJn}_9`k#Z)~ՠE58ZP-JUȕHV3c%_\2A=nDWXS@K䦶-ic>}EF 9&MS} PBI^%e qTS_,;3me@ &GepLM cړS"9:R8%QƎU-ɫ=$r#` 0jLWu)w7B8$c!C]r4@ۿ ];'=lB t=k/)q͆B4*0 !|?%J-xBՖⳘR\ؕf_Y1Jwؗ0"[!Αz0<=@kZXq<Pנ.}K獤n-;E^Au͞E ɛҴVX].4a8v:ZU;{UlZ~H_].\,_~Ă)3Qy~oW_@Wi"m߆4u4@},WB |i|jqAGahiwlfo~ 8HG:Ԫ:2Q>*ΈbP8Iܞ`yNft4rIz)q(5Wo|={EwHR?zƷ?dƖƤ-lPo}~_/~5"ԣ:!#jT]ٕ)}1gi3\P7{<3-+(as p#PlGkvT^Y;^C~`8»X=u~Ikei1Q~߉plCj,LypMmlWa_&JzrE9.QB'"x1ݡ@Sn|ZNZzFul&zachHsmb,g6(·'! ٮ%cvA봦CZ]uf50_x 5wF/Nթe/c0 |@`އqꍤdq}f%>=<˟[6,++asxS /ŎZաR 헠 ?|3/=6%н W5 B汐Z…d?̑SEY| CrM^8 b'u~#fF-΍o@ûy"Yb eT}O-ac[g֍O(Ը *СX#bo>jR+`7EPnR*'􅠒Բ4agr< _iB4߰B2lL q#e !jj'7!00~*:tLo]k* wE$a"a2끆J 4)Y*4ZIa"~7ܚ9xqYA}7*b"IRQ(H^>3+ȥ,ܫeD!!JXn%)5w Y(ʈqc"Zs`_IGQ6Zr|hF.{ ݳ!|L~N{/ %ӌj@?뾮/5;4>5șcd'S|%m^P[PֳwP>>;1AC-c~tϺS\ 83)y!Sçje!xn R[|QWG W_~]qū8d:oQmوUf|LQ0~{SVl &l1#iN}5qc]ů3x+I"en,W9uݖ▯<ѣPҺk~sG>jqbo'֜ĹXB~BMj0|`do[j%YPў*yHVӕ(KvGYF&ԸS@Gc1TzkSx`h`L4X./R;^152!+65@baG.NrvfzpgdE|J@IЉ#m[EQS<ŞV饧v+Jekbd!;F(9! ADiӜĐBu&]q`oJIêhc:rDuw)黏r93PIKry nI x6 sj+͆suJ:4a&KrgNٵq k~(4'{æf"ʸnR6L,bwZ;<^z.ꕷELsG2=| (`bYIƹoz-}4嚭=3ӥ0'/șIQɜp]%5p>> t"Š5q>!i ᳘GwQpߜY0aF,j(%?f[r]Wpx/Z3V,lQ=B<,FKn &t:z.Yttk hƾ'oh[Vו;\+WLꎯ'V U]1V0 CAQr)<#Vk6!u0E cѦԅp^d_/GlټDt"*Þe;S{=D錚lLcHQPօ2\ pY bA;:  9BBFEZL&ɖM~s g%r-)zB0рR4ǟeeU~` /Hå߉7PSxIq3Ԯ:?r-p}7ڟ!%e$E)|!;3>w.y |!SJæ1-z3dM/ a v>n);W$4E\w_q|J¦AAooY&ç,)h1]r^7:,Zen4tbӜ߄q1 -o⽀5;*cI[ʊ V[/t h$.GM٨Jk[rz!,f%~͂j8󄬹a;+RWVHP*iH]O|䗿$Ѡ7pe)kɂL& ZnѮH[LQͿ> e%JZU9೽!gyy}[8Kҷ[cFn ׹a%Ogppg_ hy'K;9Y_ϧpMB).`(_&}nvO?DPJBn ԁO քg w͌!Ify!Sb܋!o&b0;%vp[]~b￟~Xpki so WVpYEeQ Cܒ[҆C'Km:S:;1$1 m"?.Fb?5ڃ(KsçZ*`yj5ȈɶN"7a|nNj;9ļ)Pt1Y$_~=<0Scj@;'fc9"!FiNsoܯǔ+kaՊĥ] Ԧݙ5e%GlYWpZ .?S0D%xʌw$qc"x@!1W>Z,aꞤ*ex]=oQبÙ1.`H247&-HaG;_B];n6rzC!bHyACY oM \i`1D'q/ V :s܂?z,#j "l?9`W>ǣEtu&H,?Ҋ;nBOƱ1m;" =6fpgr}rQ5$l\β9qKJHJ'.i\p% /BǒS<`Ԡ)3=_ficd{^@b!^2i [H@qZ(fg]<)f0Sk(m?Df薗IeN Fk,b䂆[ҁ#?r. r_h/A"[FYF.`7ތC'~&_ZiNsM3Uf5 ?X)nCoր TIh IJ\"e +^y{K?ЇPoK3"eI{ ]]mAnBU'iFASztT&ٳ6H-WDW[V*;Vh&ѕBؾ/|tP S (؃n-nSqihR6i <D@,B) cH2Nݾ|6SԭyL,'Bw Mcܭ+ L+ +oMbxAYHA(!B(r#xwkW.Wt]ŒuUo,UM2F7(-j2;z49,35u|%c˸n,w> j|;3%e#a)Tf39A. ?4< 5'3,X{ PuAkaɂtƔ' rҐf*ٳTQA#|GqT~̣$(lal|Og۝_k&(/$ _73 Jy!3+.Y3ugzf,N}nɆ[﮹Uk+xW5Cg|A{̶/0Y;4bHU F/c?FqX) []Xl'ޖ%mo<*74HL&iFz J|誻~.~J -4QbAP! L;ν;SLD̓a料?{l>-ϩ gP+(EgTj '%9R85 :'?W^N;gG'6lIm^FMa :-]ёp{ kf{ڲ췷f0!0IjIۿ 6Ax0Q!rãkSBSC܋c| CgȜaD\J eDu-U!i(9bj¹HM*# \zo tgt:dV;w'x 7-zʝ2'"w*(dQAT~gN;Z;%R Ԥ.^~^[^؀ =V4 K0쇂$?.Y`O"F@5ālC7- K8|dC Ϛq?XXlڰ>%-+عXRꄤȟQŰpBoXϼ(D=ˊQp)2V?^Cex{#q/ /t wE\hVhMxQ2)ngN}\N%0-acTGBG+%.iVT*!`ƼwuD4D[#uUso|^艣[{nЭIr|1nx݆kwּ>WvezJB46<غv +vַD 7c**["GVYN͛&ɻG.g b8RGYB>/NMEe'{%+!9(;ArEFyx$ A`!4#3 /[c'd9S3r?y8gu"WT?p+ pr*&my1&šMv_0gYu`,.?S^Ί_./xѵ-QOnL)tnʌ_nۻp| זbƋW4?سnuC|Ԁq9Daenuщ#CPC#]K"iz[YbD̄qeOU9B8vD o-E$'L1I7Noz"5mTw(eA|Ѿuc:j[[2)Xl˷^wܶf+7ʌe[o\uF+_u_sꯚ2׼Ǎi\jdntI#K_%-e)s["6J\=y+ś}Ckce$!j欗ªˆKk5b)՟:z8#q7<)\HD3s?%:jʘ~ڒ(hW*S.1ݛqg4괴YLNiF[!,g&p0bKQ((~>\"7"p(Wj|>ޗT9^-XpG͞TuF7vEvn ]wGg> t*.t3ש Nv_ig XX Y|YVO矊rfN A0XQLr.Fx!~fbPvG8<5gyY{l:ێV?k:ҺGɟTM`$hM5; ,Z["ϗ9BY@>2)Ly\%K -V2y5A룀}sTM+vd6/؝R:#ywm{h϶;QYKaV, dÕlכ2]BxbHGx1;b_`¯ Im)9#(jD#q,*6>=r¼CoΟ幧ݐqPZR<32&@ GJ}<%rz_ܽ w/(8]NEC*W$Xe^.ԝY!ư3@fź]]JQCKc|8;燀 X`vB`̥ ܣ8vL pˉVٓ֠ j˲CWza1̗7&;ݧPa%͊X<$%wo*>v<;6 5?r oW>"ҧX. F/u/Qx(fc "r!d@qO/0FB9ho)̨om|ŻRڒ4u%W',S]_5=%z)K%7tLihKDϬߛTגTa5m1xgTxe,`x3#C .r#D\t]Ԛ1{bz?֙Eg_O:DZYSX2~*Tt KA˨΃ `ɝ5fQe sӂR)Υds ^xO ^|Xoh4B/P (,M,}=xA/ ~ "1ONGy'{QܩEY67m-@\JJ\.:vzO|Xw*֍UxFxEzVQ^d*aSjוl| ro9յ9k ;7аѨ* f OGyP 84+<\2\|bs'Sڱ zlzZҪSU`iќ.Н;jSṰ< CmB9Tr޹~T;7n]Ol>6֖&M*NѰVPڑC=m/ߕQrۦVͬiZ=k o\M^ۮi ޫX-cjv4lK\qO-|MC/yҡ5M0. XҰrs7N]8E>=eel_CJ_[g#' #O/Z Wgh WZ<;Dp*'P ^T_}}m1Nkp͞ O4'CsOM.&uԗ8`҄t<ֻ `i?é0X*[3/?-8أH&LO77LF2i`ݬ S 2:kde#[@>IY|Њ[˷o?=bpft~|X1H0 iiK iX;-y7/{;]xe@B'\PAd>Q5^A!KF9Z qx.jU3'H 9(em%[ HОf@zh bPr=9 uXQ3kB$RSvFh%/-].sH\ﯚջ/!˘4Zqwx)Io#0ʬVձ97$N.#Us*_YqtQeA@|hzm +0 f?0^Z5""-~nY΃KnS FmAVW- +1!?US7ŋʖ{Uv 6PiD6.Շ* 7xѫoW x3<<"p얥iapPg;u=[_8fkzu-)^uguł;#iVܓ䵴Me5436z ofYYXK_8z \2d}?pd8X'5eowoУ~]*J:XD9FXu,L[̴PjK)+ܨDOS~%*|nHxKw{<-3Lu=Ks9zq{90!1?{ibjha`֓jC·9*cA1 ‚= W~Ti\pv;j!%zskdH1'5_;U~ώK/ٕ5#cre[TUgdugm5-͑KvNy>鑦9>} }J8 Giad=p_h=tjFkU귔|DIb`8pP^,L C%ɽV/p6AOcx`; te(qj [XUtܲjɑ)AInTv^bZ0qC @aZݤ{X,.meBJO8#|yV[ӣ7?{o`C焣*ZV *mHCy ^]yc\>lV6 ^ k *V;`}Q@At[q;hLt`R q<@daiT ZO-i^hv7iyH4ZyR,NwDBz*pMhX#=-AJz U vK5Əq5SbD^4y^X1%~HT7q%ip,s2Zɨ& 2Xs μ"Vo.6I49bau;? M:[@?kZ1\@)~8_[cxI5 ۠ի֚ʤ34z#>Mke )bܩt9< -5+i@f#ms2cIjCsЁg]s>x!JO_S?Mru]y$LFs^}&Ak4]FÐlU^eX e9f? kl ֮B \p[m#U9pYJ-_c.= 688C:=vCA?2b9Qނ0ư>'yHߓ\\r@ m8_~_#d{$SȵŚt+/ ;´9DcB|bG~tȌ=f-_֖}GI-r7/sILsiEQ̲@ \1Ca_^"\HȔ2%;YM]EU/_!L \\rMY/ہFf1K @ @ @ @ @ @ @ @ @ @ @ @ @ pmy endstream endobj 33 0 obj 108749 endobj 35 0 obj <> stream x{{|SUZwvK4.eԐq: 2X%FpH2:TP**]}ltBRL K *z ԤVijn9m9ً#WT*&#\e>D=ڐ[^=t=":w$Uɺ/IˮSKa+>x &|HĻgOK}rfrK\{NT{FA¨:9s>[,$4nPi5`7,9um42u: L6"Zk{<"5ggk+HlC.{"L^W5ZЧud(\BDgӵGK=mҳ"PwH xk )=9vb !TC[-Ѐ cC TA"yx;C4T% _\ǓU=Uz%ZPA[OuY@r5|3(m/Pj"*AҫG![/̴~`\}mD@BYBwNUZUZ'$VAcҪӌkT."Kn(k (&KKDU+VlCO,*(Kԩ28GNels>9T jpNKe4#YZ΋>WkPZ oD<drsbBNaFjܶJwV{d{Hx(_AD%:4|vt$-='2ɴZܻǵ\z,6m/=-9`*N' mi}TeD*Ե*"J)RJ IF$2Ȥmj@H*͖as e1TF>0JA1jm{BmDǑ $8] A:'0ũ" W_ED ~Rs̀;'=B+Kʏ P%gFIOΜ 9yfh^{>Kpp_{e2Z7+ht6KSh ړ3_ZC*$FfO"H%xU<3iԴ47x:Y4xT395B j&;=)m69O\ $$D.h %|Zə_2_4G~w)uvtt%>tب}_yؗL >338xuz#ݚ1*!A}DJT*/OGxʠӰ`Vydt3=g ZG?).{F]=kW·|7PZ $ 2E/j)-2" ^v9]:]P&SFJIǽSSXcʰ9 :U^Nr'C1OZ X5_ ,tN#9 G"ŞXYtNSŸDԮxgtv{A|'dE5lLT lXkÜo&jCy\@֐aue/.crt.>B b|w\x)Q>xg}s;(V?{TX"j/zR i@Ͼ7=`AզIE*ݔԥ4oh k&M0wZP.Ps7t}N#IR_L44IFD/.Vo5vXͮ<:ژhDSApiK3[[+;TϷw+},odAΙOdGM',a#SYw,uPf[)=A"YDREMJ_ BFH.@}HΥ ubs̼uKqd8SYqg_ѽ(=Z̊; mFk5ZeK4'ߩNPFP&^34v:\T]}{w.YE' ZV$ DZU4;"+1O /nuqP0O1B ,)y@7~ "\p)zXj;+Dz'W00 ,e(PZ>m/̂BOK[}4 K/X %ZHWjjqߪ5vjڡƔLhg_ј& `3M+s^'*8s.BFX:3; /P^bv0 8 z!HFkW$ I$Z[jYZ}śb& 235;A|:4Id5uaiHq kޚ^cҷ?Dv "8E@_'V \BJ{ f!L…/M$,My #r,QAw͓9\ 7Gw>LN2ы;7,w:R0:=jWx/ *W;IdЄ9,J+3 H9@b""3- w)/9QZRnR4L=}ah-мkGR&\ܻ81{H,|#ά'ӯ} +tf yQK@'Z׊mAē3պ` WU+}VS}2A s-zHW`ɏwúrg@XXkh 5Mh 'V}I{qs*uSvE= ߶X~,gLXhK6}m)DMe+v%* 0&Q aQq-og1E~',L9Ӥgo6㥾;6G&O'$W_dCQaɒ'cˉr\^ ry);ȁ9,FuW9+no,8gfOO>wO e<%-_4:Jq'/.-{BţœtؓJP ;kǢ=v{gBBԑdT`zLe EʚٍZ3rzi /Ύsq/ͥd:H`DҰ>@9a% .YTĕdk0OcxCId&JGHJta6%lN]t[?0bg^Q]o};m-H,zRܾ(jg;0۳hs W7YiU̴؜z4yMkWWS&,+\6Oo_[Krmr;UB:4>޼uVжGf~`- I^#3bŁD*ԋ&``y>#332ų7.G )DOINYV")PfB%4`W"Pj|~#alk!ș%Ӕ9~c납{xqc=بۯ\~7?u>(}Plg'*Kf&&<ū嵊pG䄁n2B<)n?E|>TGF1Åyɇ]8hn42U<M_/sg1|#zU䁎UyLQ(!):HC.IKPd3j pϐ[, Z= :W)m> NqL8ar6YXi+$ARbld "N:HpN_s<1ʳJ둖ӨV E?>CakM~l҃OE@ s Ҧv2gh`=qUwZ?hʚV { xqsdߥ}U(QRx@YI)&T"J.ܦ\JeVc%Ǖh2Yk(Ky:Q:ZvHc컽C%3do# KҶ[J%.^?AbջZ^tSc8K׃J~dW矜90+Z}K^5i&F|% c965 zpyNefU) >2%!kE8e:[|>׵4%3Um=<<øM8~^H V.pZuKؤ3 nb Q&3⎱D\bK|Dxy;t!\Q7Wߵ 6~n]YYǃS!3h*X$xm6c\N@^Z+t> MEla|_z⎓~4aɫO^d4/v7NgNG R$=9Qn*DUhZՒb^p|%tN;Z W͉E.[+a*%8p#5hJm"o-K]70H%,뼀Ůvv9;)MAvЬI(Hڍ0 \:ZI!Ekb"sI'߼h'߽0zH7~f}ڞх`_hC@)?HcZ&WiDKW]J1 1Oa'fRϫ_r'^uDMi՘ K>r_ʔJ*SY %oژq; MpTFiIxQA*ӑ#CViǢO]zB BO//P>LJ?~ m y`fY}"+ Ԛ5dM.`J$ZP*g[jâ #S*]]ޛhXXu*`dGM7wgJL7(iG_6NX+V8a_|Ob)WYt+vyjOk}$`f戆*JrCyJ] g^ s|Ti5un3>7v֒wV(3(\?.G^.$٩،$'m?E-`^ylݶOٍq &:d,ʢ .-cboy#=w_<䕿{?4nh׻3 6?Xx?hn/@nTHvUYj GժlwB]:&Oj/YɮnN3u霴x]SX[[;ro;֟ݓxaqb"LI ױ Puf deJLh? uH2>kĊV MעT6u9ĬuRu;u/vVm2_keK<}Z٢6'HGJ#mG)0Ҿ>|ƇG|TjC7ʸXmyhl|njazý}O|,Rӻ;*p)oiRDR j dW jDR", t7[vY(Kr2Yea0|R\Wtx2X|0N)وtuVhFOSoޒS +1G 4աdwD ξR?XmЀ3G G.] \URVE`c%T[ ,)) %TʕTe%7X/)\u.-%<}YLVbۥOo{c/=g3`q<4B4G7VdքJWVnyǛ4 _O{X5YLXOcms-\[O}+  ],^`IQko %9Wњ3m~kњ`)nYW,೘ *Z֑Z_Z IBdެ#YLBǭB̿<\G޿\`z_FSqfYTS,9^C"۱-e ~gI04XKahȦզJnMд2?ՖM6!o t{{7曂ž+ rU$~s8,~,p mb s6ڇ*m̺v4Pxp b!.]" "E#, +߆~U=yr<|nQʪPoh۱"+0?\IoY{bWʋ$xwhQS?͵|=]a{ctye3!t vIS;[XLng9G#[=QSB>{ VZbA!>%D,|lʒ뛋dzȮ4:g1>W OՈ[wTd WWoi/X5NeqKXѺy謿} ;ꁁ}bx>]\Vv+%idV`Z @*Pƀ)XcpaFC#hc˿8ى7iM)% A:҈ MP ,H _ї/"gtd4e"gS0& 0482}Ӕy*1:2^q2*j~V_PXE[;L1 _0UAُye36.[F'h ]aᒁ7iT!܄CxGY19Ň3孪 !#iOZI1} Pl?dXwk&ɹ9i^8'CF́,M&؎$#p VvED %H)itT+<cKcDa_:1:t~ _~ Avx14,zʅ7% Ma15Vӥ kh.hXw0ގ $d>;lLs$;ס|F5S9vTem%w h4ɰ34&д^ M+J!q%s*]Zk9?f8FA. .*CCk0*}\S__ӟSGʴ( X)Z7Z)AJ¼ Vx x\?|4Vj?䧒$_Jfd,v׮Q"+)D '"HoxP2Bdn9E)σKqz܋b~t洬WLe~w] 5O{LEςKAgj,c^ݥ\&Sp4h>8o2)O^NM?F 唰jHAjNcw-%cyd 'T'@9e~6-<?=5?K'd0-dA&˶ &Q0L2fLrqAaw%uHs-N ƛC3(rx{7&}=9mk{-}enY_jl/^4C,pdhlJEBsExKCY)"D;8 oZ48Cna| (t((x,z~3QTH.5_cψJE 6l4^'ή_s$s(2p̓oLֹZݻY!TuhCG}&i= gEOEH;m]3~tk5ra9uanb؏֍qmfU5yP^%_YQ,asYm$6|xU}LBWEN(`G&h^#}iX?y/YZ<JK9&x×('9i3`3PxBŇ ʚؠ4kZ<^ 4.x>/C|{$F5FcfTx%OwwWg+j**H׼}ɥiZ2/ziaRGAʾye}*[<9l})Js 0 sdg^)4J.EOsWOF=%0?C(Gqr u<,BkKcGfdHwrPb%VJ(ǣhA$g .Zv=jFs0/q\  L&3d1rn$ vER %؇{'N n7ƟEWS[wRרSRi)"ҹ蒅m4! t"7Y7THG+.'|F(ј`\ŝ,N,Auu, =ԉx[=w6%S}Wz@sLUF}ҙ'aIs!yX걞[X2/zM|r#mQSSЖٍ ?ވk]g>|Ew=V5*\@ΝwNXS֤wlw#%Lh񭭥*}#su*3,+M,(ʲu$a@81Opҁ~LzPc'<;0%mmT`+/L_dg]}Lc0K{@%#GLj*F*AE*5w!X7S$e ZRsV6HtZyDLVu:ԗ?;K0@Sr9bdM1\f;`mZALȥPQb_vqM&sQQ1ƛQkQ8>Ou=׍btu`cҖC;^rHr18?//9^ AFOBNf cD;A2H/³A(m1x9f"PG ϿZ˘ dvidgP52nh?-<9M6ӹAӟ tm>p|'4dAGM0df/Bp'm0')kf6HeGe5yhFG1!I>!3g}=ZG/пe<' rzn~u#VcG OWPAUکzGmTUQ3995jǵ'DaXgօu>7P3kxx5Sn^kf>lZ -mV>KO7!_ C/PFjm~\ `UZOȈiiYK4G|xGhK<-Tq>V~40]MP }An\"oC_Xxd4< 1i4 A&>qhw5y=͛7vKO<bO{WV7.΁'o`& 5m4VݐAa-hLzjJE\^(ҵLj7"CVhB?c_5#h-7&xjAI3}Q\VRzg<ޟOBBCGTx8yQ~BP3,Q¨{>=ǻӁPB8uqLa!БC(̿ʚh8:pu,</} Dki?}9>4Ƥ R߭#yw'ЍW' xc q !+|c7rOqƤ+8iQj?HW endstream endobj 36 0 obj 13578 endobj 37 0 obj <> endobj 38 0 obj <> stream x]͎0=Or}m3#E2Dʢ?j@I@,R`_>_;\|o}jb~όۮӑ7z̊eqП*+/nȟ6pƩ/ӏq9>W~lx^|/5:.L71!x&Nu٪,j_goRreYK+h%c~CJWu^_w7ͲCjvZg:9 9MLeL`3L KZ ^_?hM-kX?61&?zbX` 2K;OElfߩ~ _p/_`Bs0 ߣo- BCoeZ?,~5w`-.5v_Poasounz4'?K~_t֤_O/:?[Hܧi>t};Fǿ{8߇|& endstream endobj 39 0 obj <> endobj 40 0 obj <> stream x|{\\9g/{v].uY$, !$(`6.!jڠնVkTFQ$nikmokj6^JZ*̜hն?3<3mREahIEBXۻ'?~*;/#$?:0lG( !Ɋ9%߂03]P6@A كѽzQBж QA;m~?Xy ?P$JG?ġ!BӀpRfXN"ɓJ\:d;ݍ%^ r_P 9ͮ[8!t=VЕyнi 0Co8C>4؏VJh] @EcYԋDRt+./[@iQݔ?Hyѷh-zd%C*|)r {c4I:nCQ'B(aN ڀ߰0SӉRP!j;qYP>ZTnA"-N ɏNdvxvd mIC7OOw2vod /Cעߠ`eC0iBܗCi=،7?sQg_̿'R@h w zsXSwl2M!׀xT@[{5p?xyռn>gc]=݉%'NHew_<\9"CnIe5̠ __Kp]!Ɉo;p?u%߆cq|?zh4d5L;e(s!XY9UfK4k{{7k7+ld%>Nɝp}_H"}C&6Ⱦ#% RB.y %72,>1\xz9:Jv/΄8jaXa2sF :PW߇s5| O+|D(}% @ p+> 14f}jC_a ~ľ, ʸV;U=_Dg `i2|nH9F073ބ[2|dBlO3bcߍA,V#܁߸ojf [ʕ,v u?a9z̼m&|V**3 a=ƫ4ϼw0g˙J#)kl? J}=8]\|Lnc)}U&шD⫝̸r-nl!.0UvXҕe_ 44Bx(dޭM/h/#V 0V{S=LAlc GO_ =}foB no Dpڀt >~劺ښrorf;6j1gef.=MIIV$L*Xf|̵=ƹkibvJ/e9>ҷH5|+,|M>lKMn>6K6 jm677Vl(ƀQ(T38F`JL\sAr5p45L&"Au6b6v57el݅1CU7%At1&At-uq ڱݭsvX7# 6 6뚥d1ȓ5|쮍]K{m0q>(X RE}'Krr NȘM ߉(rbnS֑t4ibM{ hRmINz)X%'PEub" IRE@2tc3cI'55O$N|o.Eԩy8ǢAsc/d`Hq%m3vjx@}hC )lĪ}h4b6v mȜFbwwNzN/6 =÷;}]LZIӚkbX ѺqK<]mk粖_'B.6!&[IK#)ck[a}AdŌոkdA`ŴvnT,[ igrr_=}O5pċM6o_hĖjKuB#gON#Nێ++XsF&+lʁv6GqzǭSx&qHKlefs}}gޓ>f?d7f%%R3 2\TujiN6=v^Uf-d.,fst,Nm6Ci-cNGZZ,l=ؑæK洮g5^]]rϔ鵋8{]y  1(Wاb8*8ή?aGIv {12ݚwzIS=o \uYI.r/<`DY9X\lɒ5u2NVnwOOAnJuLf,TVUiI7dqyJZCrJCCYTh/,6z!G{fɮni7YNgVZ5J#_8l-? M/ۃ+RR#U:RŸt :)D%2Iv|^ݓFҜd&ѓاUo?\semɟ9.y릌IӓF/[nm{262KKO&׼3v83g ehǍz0pv'=1{e2PܛSĔ{+$8^3nOc#yCZ/B|K|/}IlgVZ[bXL%_1~5q:zyӧR->5^M#jBvfkY{d(pYͻ񻚧{(c*^Ox<`O&౔j/twc`'%:A*i`5brt~Mm^^mMi]uik]Q^jqV8W>T{2և6=0mVVZ 4 P[-L3Pkh1u*<繗̙wޙvg{v]3rQ_51J &/dYL, ?H:eSFUuȮ pP8BC ԏWg?$ IOi<.\SONV r8JB4)9ٽկefshrY拝iIz ;c$P)ٌ  k2W.27+r43ͬˌ ԕ J K̥lgf2iKH5kl3̈-fK3fKBaLȄyYYY%jhҲ\Nٜ%/E, Ɯ k'73b(ޣ 84 j4{iRC)S|2،ǘkQ$6T#>էIZ}**2 IKN=!Qԅk樳̞Yt{OTC1B#^$R% N1rscKz )YF"n܃ӰM)]څGEevɃz3vr*iu(Vtm2&P.ZZWkŠrA[;pnBG&L^VwNkj?8µxbә#s:={ٿٍ2'],XzI/vCr-dvs$ztq2›yf?XPr $22gY2qFb8,G ] )Lf՛zޚkk2 C<:,KL> NIV﫨\\SXaU}z}-U4]83Jl,b19XU]} 1k2n0#l;؋1#4JSöuSUuA#_]1vT#}tu]bs,7*I~vF*ǿx>&|K=Xvܭ,L3~R"QMd{7UPoh7l3+JMT~B[.3zҩb˩JuefW urv$Egչu:Wq< 8"ץӨ'UF1,ҁ#tDKv8Hѕ/GǘP{"3pk+k>Q~-3cT I`tІz2hcj9:Eă NIJ8Mwnr̝=Q^|r N!8 9O@a5Qy wn x >b%[T?60ClK~zV!Wu9 毮tF׵|HT0|`j{pn$*Ic88+:T:N Uy~}e:~Ȍ|$!EVlewά0p ^Y)7(9Y%7FYVRZKN9K88OK8N-ڟk-]K֠,Z!^K`d-eҚqlCX`}Ч¨d`1c֧_zf `;o{L XF[8(d)`}񈣚c^803LiplP[*q͕k(\Լ WQH )E͉W$?B)Ȋ| +{Kr}uFdL4I!K.iYۿUt5*_cyIj}쬮)X]mԴ#c$kk߱Ֆ4.}IEiizEEVz՞a./9ޮ2wDf\@kũm!<+zR)vLI.--!C΃Á0Þ Olrelm6 “7*F^Dj9J _oMݽ S nZq>;H 4u@&} `%l$6cYS&fIg[FY v8/d4mȑ\cNU3r6(q  r+5ۯ&HIIyMt2X/)3I2§\ArƚSlOY8#1{|= ~,Ixd#؅C ËyKx~d/nV%M: úljQ20P4:[i\U%(o>WmK{WnWX-9MܞxuJE/XågqOΚL59>x ڝB%PKѵͅ}rȋW◙ik.J2&ݪ0+fDyQ'f-1hTaGBߏqb(a\ #~B 2<a9r1gD8 ]*DX!+QXP?) G+h&0F)m" iVfQUc",AԘK1Q_i}""`7ULOC"L2sDɦrHa aOa)ѿ!NPXF0r003(D웱Y" EyYfDU*`,}" 5oaU:jExHi" D'nN¼J0U0J܏P8r"̡\[N Q|tDSpuG"LCa=" T z>Τ"L@a3aB8'&S8)r0)OD)\H2Am"-rEOaD}U8M_l0Kq]AN@(BͣDnC!4wTQ# 3jxȩxQ2u@[jaRT W *!6!7!JGm~h}0G SC=NiB!52_6]Hg,HY%;w CO~/qg8tZx:?e·5hyBA5JACDEA^&yAsS{ ɸpPEnE#[!4 *@}ЍS SH}4Jē0]Z )}yhrn %eA~r;D0OBzqB{ZK-.qOdx)0]Iq*k/obWI"oQD˯ 4V0DuZT_T!Mx ؉\{f"pCkhxg%~e[Ј`'?۷:Y0]8WUDR,N1PFi& rVmcxq,Z;8BN<;zNp7™%ѳfoLTvf(g0 %`TbflY[E+ &.IVgɩ`i]G%{FY#"w?"@TÈw#4{ŝKif6.$Kr,/DR-.LO$acch{gzGg1ʃ|~D楏hG {Gl!iPȄ~*(lP" y|`ɼ$wQM I+:-t^("KV#4Ԫ# |r& ѳ\s> 1QЖ\/X%ij3bkDq'޳XH`<2 ~a|0;?"@_ &p?Px/@Xoo aA`i'>a0?6(RC8W'` D#t@ ؅F"=XdXp *C,?a]Ds >b0*t"A (8huFh,BFnG1? Ch 9HtL;a,p{#1>>( d!!`t&`t3AH}Q/~# #D@!CBc (d}B@ A֢htx||hXTdN`txx8Jx8-JL&YD:?D:d}{gƆΖ|j~]KcfaͦjZAcg1``aa~R 8[" XQ?hL!p@z`~PY@@@pRbq`h8.AL1:8(Dɢ*hJG"EfHULN# GW΃б c0 :LuKs9B S:Qdh؎`duK` ^pSQC'h?8"t@xD\AXGCc l(>|B @HbQ6& R<[*^o; `lhM%[WVxKJ6녲(.V+I}b0V(CEEX_/E[gzNm@/[BŞbdgOwJ_*tJ_*tJ_*tJ_*tC/`WYN1gO}觎[d5/>}v}o&hd}jWDZQs\#*i#ѶK.7uK}bק[FfǑϠ#4)icS'q??Soko= R|N$Nf=8"ZOy @C{ an=3OL3U"PQ%3l7騙" J@``pr쏳WLXS Ұӈ{ܣp A/ 9eMAw;.|+0(>u?_g̶SL il6{ȟ2A8B24sxV3Zr,Tvף/3>֖uƵ({%P[,qX> 󌳨,WJ&iLp xGE=vRi$P\ksEY~Gty=Rg~ '}2UMq'O99z=USM^MU kt\g{\)G>5J2JkI/3VBV Y+˘mR '=X Sg]zKWǭ?wSgGJ).A XFd6% 9K^ Ks>GzA%mu7tTR5 ƚ, VcU%6Ūܭ wn;݋Zw:qظ%&q1m+j\e8F]q #IS*Y/e _F=zMSl%^1c7vt0w<H[ck:]'˘57`.%Uw yM݋dP8~d!d)%FTR2+>Dݑ)ksphLqҼFAQ$:dgIi6!9b#vڽlCL辌v.n'(p놮#rqP5+[q $b±*tBFHU1)dpZ̓rbWaCaw&]]km0!KTrWs,;Tndl6XE366D:Zc+6n:r5Lۛ`S/+z2H&k`P$1<p#x?jPpqcPi<%eFDm#2B܍#Q2x "`: endstream endobj 41 0 obj 12417 endobj 42 0 obj <> endobj 43 0 obj <> stream x]Mk  bۅHrMBb!:n[AyƙwaMvJ:j5I*aa՛@G"iF͗:X:5$VgwzᎰ+J5Gߌ **`}<,PuOK}7@38 V3pIRz(/Q2Ns4IR ΑOE6=r>E-%rF#rn"c6rߦ >Cf7}m 7n endstream endobj 44 0 obj <> endobj 45 0 obj <> stream x|yx[յ y'ٖlٖ!Vb[q+:Ρ?B_Pwz/+Smt=sYYa^gq;;w0];Ml8F $:;0ZvX.ފP;IaS_$ = :3 ~x''> 3͝$>Cч F֕-+7ԇꂵ5˖TVK}%w~^nVf3]HsZ ZZˤ cQnG2"l Ѽ0 DPM> 6_2-Gj \l5 Tk7j,Y5B=nlQB'쵖{k#-cjjrYP=,E'drH!6YK Ye'JPa#v0iYU[cs8r#*FBb:"ө/;0Ak\\a}L}{"ZW$[dV>jj#.֋,4$pN`>ʒx dȻo_P ]ؽVk}'}j¨ ]xn-< b#" B 6{MT@A6B&{eW,oGkmO!cٽXsvsy[׾ @kѭ46Ob[;̪>0<@Zb @7bK1{$EF#R9N j"wLՋJHe:11~ھ/AX޶v.;D0,(D,AAEyw"MK5 GA 9B&f7CمR^bXFUn/vzZ[;\/3#p'7@b{G:P|_-<. T-!)zn;qϩTYi&a +H$]`1Xڇ%&MU"̮wawX^WfL'ahpgcZF5אеSEuME<XneQ*ҀKƜVfhAe{dҨ jJTVU k>+,[K'l2]x SѠ"LH-,). V5,pS_Tƒߪ[GJo;5}n}%˛$&rᶴ<[# g5+=`c~ AE{0Ǡ ngaNƿО#{v^buz Adlpm况ZmRh'^w'Q\!J_,S`Hb^e-"-2//cq\~A2A?@f>1H@Le V"FlXt0:Ӯmi̱=-8׻tLfIF & Ϩb5^[|[:]޵lo2^gɰl;>{KYNƇG9~,OtR*U0(斏Kdc2)D&K[, txVx^gyXa_HlhiHv$nYΔ{a" i^^Gbq%> ,BYRK2jDň+ZBrcY`f?> jM|/vƗ*N3oiO>"kpf³$ɽ4+Xo+F5'e"dGL" f[m6iכ JӯTT&UNW&=^/Hl׭Vmr9HPyCk09]_S|W&z.AGSrZǡ K}a3rؙSa. XʥNi64L2ko/#Fd.ξqv[7׷~N>FIÏ<~oil<[Bv+ku-QGJ$NbݦᚌZAy. iȕ]=UR6DOek-k<7۷{u;Zw@g!l95V$hnx摅*wo+* OH$D_5ǏD-ޒJwbmXe"O `OlƝ]MRdGԠPJ=V w?']>W7<PIJT ΀vuNԝsłz}RZ0C $qH̑ Aʏ=~?E eAYjg1s5gidPVF,kC9`&,% KTC8>F"H3WkbNa-|}Y9kV9˜Ze~i_ӸvOXY7՚nʕh, 4Jms;ͱeyssf~os3 ̤8O`9@g7 c0bG!:rsȪ.F3a@#U4\S [!Ƹ ."RURj|'?H>#;=j*kʏ3vuKO.uuD 5m\/\_|&z֚p`Le |ȉD)ِe {\$Ġ3ǟXH r?gT٥zMj47t@[ PlEAE;2{{WO7a'$W6SUwlZ3=Y~5x7ݑohǷur1 VKu$eװS^qsy,g憟`#a'} e0cQC`?h5b|II+5J}=bΦڱƿ8L !WR0ˁIIhm 5-^o,cqyei1]֡7;0&|iD"SJ"%\mƀ)zo~o&ҟ^]@/6?kϽ[#U UHgcҭgH*4CӺ9ݗ:FGJZFKXI@FawZM#t~p\ ^M4ǚH}A— I!-X),]|AOg/R^Hjo3ق6fC:PB^ e)^O@KA}L`%ބ>`/b)qW;YF+5Xx>AQ=}TUd]{ͦLWP$|+ED9nUQԵa&d7QP靋L~2Kx Jr?Y#~]jFwa/\8| ѣ&GfPٕYxqd)[ѹ\e2 M]kۖ7f#r[u@n(:.\ Y@w]1 f+R>#!͠>EhO@ 5hJ[g.Q̉9)ȋG9n1aԧun86f(,QD={vmI0QS Te!)5EV>T=yjKi*v N޸bglqWbz^0~ lg'tbމӷt,MǼ!PbTT!3L62N-6i1N3~\1#Ca4n^y t"0yΛ H;}o:tN$cb\JJ6.aK4%%Rl2{8\iQؤX&R=dH|NȐVU13zI"Df"M/-P{RzcFqO豧YJ"U( }c!FR #Wruy+UJ9#Vșp!Xӕ6ԔjMec{KTZS0 o(|uM5&SmK{cI;9 #` 'EJ^փ i<Ǎ<.籕 |'"D(Ud4w81~IaciTK hhtODܤDGҤ,Q((O*@RzZ˿&J48ڎE9%*c1K af Bޤ>Rjp:iJ,jv fN}¶] c?W=2;ZXwg6luV#x^O5*_c+Y_}s O}3Htv=J U_ܨ K>qa,,B>ӚpMCjh!\}9Z֏}=o=4 rZ]%=hXyH'=\Xߒpy&O3\<:紹F-~9C: @d^+r?mbѾD3d(Y`5$Plp+L7WF`ތL.0@g>  9یUd<h`\ ئWs\>гp6GyBfVZ|miw.tUE  ,=ΨΩXJE?/'F9.+K9#Gwdp%\c87_ůW)#K ҘxH*Nl3%`oJv\+> |b y_Q#4A*."F)|Q.~\{=}~|Nw=OH@4K1)D@B=Hj hhMR<&$둇GoAxFNH~,VVh\\+1~s1?*QŋxAKR!1a͠Mۮ_v "zg+T䍆ǺϟN~w:˓*zlIf گV)AK/IߒI)HRE=`|7eTC4آ7ocu٧1F1N瘝!7h83@[Mykю`Kz9 [#|Zp[Ղhti8rb R -qh&10"DsXxJbJց_]v_%5{SGNVyMw2s%Z}R"oŶ71ƜW7$5eW{)-FkĨ ^ vB,J5e {݋XTbt~3[c] XrU@X䈨<`guYhm@pfp 9:Kht^Fq8Ԗ .GM͙Ym3,&H2YVmKzEҰP Fdң7t=6 u ky7{(_chzV Ep(;`uU! e%0 1 ywPdUBF0QGVc03*O?!gxe'xQ|" e7z'x.z E5왧3hP+@Ց0aRBC*AB N[bS;?t'lZ1{[rk[*6GHotp˦ϲ etBEgu{sVO EŝH?ѝD &8N{~ #0W#8zgϊ. f\xv&P=,րhu:s&pѩ5 :V<X|% c^LIň8GKG8Ngsam1ߢ޺)*KzDm؅7a $VdXֈ<Ԅ EPAXAYlOKTJdaLD 1-[r^J]XAyeШ:ѭ/Ky=d ϰ@CMlkSCgKij(><ʽ!&h4[<0d j:3"Fb(ətd;?W#?{Vw\y}תmYG ?GƟ_jǦUSgv~lS2TBHmOd$ lj<`YbQU޸z5qǓBY wyKcEt>7Z_QGf=# ɺ3r]SE: Y1W9fO 4!,ܥ=%Z.m sAObެSW sRuiD_)WPRyM[w n:}@уo`~1e dfwhы~rAI{r#%RgdqC$'#̓H,x *4qRcT>3DEX"W8VBp81E8RHB ,A̠{]7i\A륅b ;&,  kqWt~% [= و"Qb?/7Lʂ%*d9}譔|/4Q^ Q"+*92ާh :Ef! F|$0?b#W*Xa#P P~9j 4,ˢP+>hAдpt}HIΌӪ,\ x 㑇X*%c,H-]T*%LmV|ӷ }Fk#.Na79^Z}mdb W %Vrq^KT^HzU^-ߟ MUL/ 9+ A~Cb\eXiLeN% :)BBn95@8.=I& M ;!Y-+d%گjIQmMmZ`-߂b䊽ZߏGp‰^pwQ|O%X8>&)7Mz϶X]~{j [Zn׍֯IJmR[c%W/6АZ߽asz!cZST&oe)5d 9nNQ$K(0,/ L\=;%YDF2P*T|0! LC@{PsÀB уVrRz E,V^*B9x!҉ps&¬!=nq3 P2-Faz?)OO%: P}R/c4 >ROɗ?/b<ɤCO&]õ%\M ko^ſao6Hց_4|heꆯӷ 2煽x#׈&F;Q'ӂhc6CkHmfNYVZƶ7{Yxv됁َIAN4KJNVv*Wr2ȇQ6'Ynx en&t{ƨAme(`9_359 NL/^:=4</UiUix^U&Ri}fj04<536OOLJ/N9_6q''4-l4<284lON#SP cnZᡙɉ! ƍ!L8 = On'036l_ip~5E*{ff6[n[ON7ZNkjUD5hq 05AH I mGSb1(G*DP.$nS N LAj\ j&4$<FK!=OO@zQ\_3NvT33h3n+oe=-#P̈ksS vh5/Wd[mǦSp{g9}B7-lĶa]4_zJ]ZQ,Vbf` ?CJ"gLW1"ms눭s(3,RjH88mx|DypQj-VG]'ZJtitOtc;%\ 8،}x }Ao$z&$UTJ dL^c;4^uס'ԧģƓhz}X »Mó6kduyDڲ:o8='A=N`|kMe#m]0$4&{>.6h~Zb46XH?.$6t~P endstream endobj 46 0 obj 12585 endobj 47 0 obj <> endobj 48 0 obj <> stream x]ˎ@E|E/'HK^x16^ӷn'u*N;ÒSw:cmΫ cnI+1-zz?iO'%˿އa_c\~\T59ګ%x)WF֚*v>ghzo2?]VL96PC& `G~d Ȓ[3ׁW߃_oVr x:R;\FoP_'xj58pǽ4-kWOZ_>8пwC 'ߠ&п} K}p0_NjJn?< KI衡ó3CYxgyߠ)uo g[,lz7K#/q^i_K<ߊg-|-r]?]?˝ TfȪBW@ȜbBӌ, g endstream endobj 49 0 obj <> endobj 50 0 obj <> stream xX{l[yι($>DQD[(Q,K6,E˶-KEIW"#dHJgY`AQk;M.XK ݀btȶf͖ : [6RKw.$*Ucsys~;L'eȃu@ %O]ɅQǾ:l[g].0(,^ /8~<XDlϥ[>h|2t*lv\īHZŇ Ɏͷ_h~'6x")' ''I)k.'Wg0̖7_ңg6V G)i:qu(B2w gaE*wC CHt:)jy Aᨆ@+BԴ7ٗԴlj};uC/K}WNX_'R 7~ܝ\9}t#>0 Ƥ R\,v^4dz @Ij6^13 #q79\}LY4\Zyғk#7Ot/pdeuxlZ^G$JIyT)xyH!4P*ڬzp Pz*t[.zKJ\9|08 ZPc]2:w(V h݀ ʫ%ԍq_nB$@,.vrM@@",4 ݩp@{o{l<[P(>`0ڋ6f6n6xyBPg8_( OL,j[J9rjjIg D Bew9H% <:eK܇d; >28 *x,u K'DUzxBj9D8"3ǎ@^yloF ~t.K-=#I}\r < bhq%? twKA k~js<@;-W f|Vs^Bjw\хōť0&bxk3mhV,#N "N`uz=&Pӆw/:(H%'"0NϮ ^yȳegGWGg{Y]xw?6:dDB蔜锊gI.pf!'Wb&]eǩ^X\8ׄ{|H~}[wWZWF,0$>Úct$jJln aD:B _MFPP@&hPJ cv`53b_Ո:pӉ<-v=)wyޡl@߅˂mtb"%CƦb`\5P(pB^aFԓvGO{ys/i ٵZR/]opn21o}lc+#ck+Z0J܍,}gg!}AYy۟'(+db: 2Y9I#N!nB6r~`Wju!i׎mǒkS\["14wctyedsChEo1rl V+ɨX3tL9UdͶeGgO[PgeCtf/ssh;,rLXi1ߞؒЀ(;f2 th_0Vã Ȯ?KX?9P֛߹ר{S|Zz3%*sRwQ}.G@ gz=#WPT)2VL{eR̨qgHN bF~|8P0=}1Iֿ!\sm܃,ةnj,l䮃O>-JIg,?Ă=_4熂^]^29w{Sı建zulZO%Pkm}.3 ͚*b;EǞu ׾. Q#7H_fe~YT)^7^.:-{Y ZD;s+_ɯj}ͶpY}];,nELHԋZmvyRi[9m摾UZ@~@ >e>幘J(*MQ9JH_5h-XLFfiIX.WWgTd&&# G99npn4gpJ MMS쥡PT;"H"_|cSHfV{*$l<5ix:+&Cp<3 %k T$kL{ Id|&NʲOor'C11)OERddb>-Mēø:cSrRLe1-'Rb|Zit^;嘌{L=I9zR lz۽_]㪡4n' <" O r dy)1SV HCn YOQ3] ־ 83(j>Nd.e*DvXz>օ[tt 3Ŏ}b76'^oYVbӡH4:K!-ȨI9B$è)(=5i1O{D:kc^$(Y썆&QmmSi6|(jkk}q m,B"0aH&aGD>jb=RưU,UVC*4HnLb R8+k)dwv¾("ݡ \y{W-S:byyxgՎ{UYg<؟FL9"g`[!y>2+$~}gZp~%d4 yyX౞( #O~{ c+6 > endobj 53 0 obj <> stream x]n0 !o3rF rN yx )#C#q\QϠ?QLrMy$pz@&p w?;" so~9.p ;Ū}) endstream endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <>/Contents 8 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 13 0 obj <>/Contents 14 0 R>> endobj 16 0 obj <>/Contents 17 0 R>> endobj 34 0 obj <> endobj 20 0 obj <> >> endobj 21 0 obj <> >> endobj 22 0 obj <> >> endobj 23 0 obj <> >> endobj 24 0 obj <> >> endobj 25 0 obj <> >> endobj 26 0 obj <> >> endobj 27 0 obj <> >> endobj 28 0 obj <> >> endobj 29 0 obj <> >> endobj 30 0 obj <> >> endobj 31 0 obj <> >> endobj 32 0 obj <> >> endobj 58 0 obj <> /Lang(en-US) >> endobj 59 0 obj < /Creator /Producer /CreationDate(D:20100928132734+04'00')>> endobj xref 0 60 0000000000 65535 f 0000177837 00000 n 0000000019 00000 n 0000003627 00000 n 0000178006 00000 n 0000003648 00000 n 0000007647 00000 n 0000178175 00000 n 0000007668 00000 n 0000011867 00000 n 0000178344 00000 n 0000011888 00000 n 0000016210 00000 n 0000178515 00000 n 0000016232 00000 n 0000020579 00000 n 0000178686 00000 n 0000020601 00000 n 0000021843 00000 n 0000021865 00000 n 0000178997 00000 n 0000179151 00000 n 0000179305 00000 n 0000179459 00000 n 0000179613 00000 n 0000179767 00000 n 0000179921 00000 n 0000180065 00000 n 0000180209 00000 n 0000180353 00000 n 0000180497 00000 n 0000180641 00000 n 0000180785 00000 n 0000130780 00000 n 0000178864 00000 n 0000130804 00000 n 0000144469 00000 n 0000144492 00000 n 0000144684 00000 n 0000145323 00000 n 0000145800 00000 n 0000158304 00000 n 0000158327 00000 n 0000158537 00000 n 0000158889 00000 n 0000159113 00000 n 0000171785 00000 n 0000171808 00000 n 0000172005 00000 n 0000172591 00000 n 0000173025 00000 n 0000176733 00000 n 0000176755 00000 n 0000176947 00000 n 0000177348 00000 n 0000177600 00000 n 0000177663 00000 n 0000177736 00000 n 0000180925 00000 n 0000181136 00000 n trailer < <99501984342DB09A822496333C79E881> ] /DocChecksum /CDF6B78AAF77615DEAE634C701CD5D1A >> startxref 181357 %%EOF presentation.pdf0000755000175000000000000151304611441070064012757 0ustar asimroot%PDF-1.4 %äüöß 2 0 obj <> stream xSMK1 ϯY蘤_S y0A*{ݝuY24y{IУ  3)~0!|vhd^:~7}7\gXNˌS{3G2u]>䆍#PlX?B(4B,vhޤ޺Ȳ)jQ\5ztKLsl(&i+M#ba ݉[`U-RQDΤv%{(XޗŒtGU,Q\AwYr+qSuVB,[ZUcWZ?b/㑇U,n @ [\HO7G!y ZqGy)#;Uve(i8'աUK蝶5Gx3)C[Rԁǁ_}Q9Z[[u-WYh7DR:*ɢRhE endstream endobj 3 0 obj 447 endobj 5 0 obj <> stream xUnAW9Lwi4ۈ8 N@@Q ">N/z ^_\wX#_7GN~/:wD(ٞupFˏ-,Dltpp?u}p!> ձV22ѧh,aqԗv"UZMpÖ}f55H,Aډ#q-M}<^j꽨@hzBQk˲UE WSzI C WW^!2l+b)YԘUg\(28^nT? hw?DH\ m0%( 3Šs]4ĕőd,l*'OaV͵?:>y_"j]cP'ES$^[XL{*ahCyCvv`>siZTH’^@^z/@RjK+5|Ы30Wh0PNmfRj9Wbu4BhS&ќyPg옚x>ӗ-Z/9g \/)Dȃ, WulΦM'H6@5B՗kLo7+NsG{n'6%nא?OiG_/>WJدgs " Wu'ng'O'UoOzLvڹ*E&7Dh%X9|6($:] ̥0O ^^ endstream endobj 6 0 obj 773 endobj 8 0 obj <> stream xQn@D{D)T0P͹: xpMTo^vտ2p,XkPR3o? 0 }9ܹܰyݤ,_J~U`IU'5_I _ )_ 1Т~/V Ѫ7CU Tz L,BV! @ de2XL,V! @ db0YYL,&!+ @ aeHXYL,V + @ aeHX$,BV  @ aeHXY$,& + @ aeHXY0>+ @ aeHXYl$#HXY$,V + 0&+ ?h,V^T6qXYlz]Y F`e)uV PO P P3\lw'7??5,6R-vT8ρf~@֨~F`m+U?&UX/ Vկ LDO N߫`@wơgW.CG<:g e`7ի { endstream endobj 9 0 obj 4334 endobj 10 0 obj <> stream xaU$$$DDHI"I$I$$$$DHII"I$$l$$9rPqd; C!@49 A!@\9d2Dr!@EI$]t)@eI$]t%@UIW$]t-@uI$t#@MI7 VnH NH ^Hz AHz QHz IHz @ҳI$=@ҋI/$ @ҫI$7Hz wHz >H O>H /H*_s" C|9d2XdC!@ wC s!Lb`!@ (3;ΎC8dE н pb`>#t8d"е EkOЭ]"1 l֒C.?@ COK"У\/Л="Л"Йc E+R~^2n4^8><ȥK E}Av.7ƥYk E]k EUkEMkКM"М"ИM"Д?CGC GG`㉿`c xm=2㴽?VxoI`4iM2l8C(p qMx% endstream endobj 11 0 obj 2045 endobj 7 0 obj <> stream xQn0D/!U4m#ƎsV@ݶɽh7> stream xaU$$$DDHI"I$I$$$$DHII"I$$l$$9rPqd; C!@49 A!@\9d2Dr!@EI$]t)@eI$]t%@UIW$]t-@uI$t#@MI7 VnH NH ^Hz AHz QHz IHz @ҳI$=@ҋI/$ @ҫI$7Hz wHz >H O>H /H*_s" C|9d2XdC!@ wC s!Lb`!@ (3;ΎC8dE н pb`>#t8d"е EkOЭ]"1 l֒C.?@ COK"У\/Л="Л"Йc E+R~^2n4^8><ȥK E}Av.7ƥYk E]k EUkEMkКM"М"ИM"Д?CGC GG`㉿`c xm=2㴽?VxoI`4iM2l8C(p qMx% endstream endobj 14 0 obj 2045 endobj 16 0 obj <> stream xUˎ0 +t^^zX  ho (K$ymAE 9VCcY'EWj[az4eαLAˇ3&;M_S;3=yl 6tpT(T>JDX\n>!Z( IE ְ>lLS'fsNNDm? fRnatGf:6IQ[W% ]:{]RsUK=;عXT+BBz/p-{vY(΄l]aKk\*Ѣ2GWZiu[t(FTBV8mY4)͢/,s ?U8V8r=ǥ<`Io#}(|Y%\o4,cm,2T6*,JS]V52ȖL7pɥ{<} ũbƬTfꈋK9zopwzDv.9D@%}oI;ף 6$AE! Ы9ȕ&XL'-WK t-Fc܂- rw`dʶ endstream endobj 17 0 obj 688 endobj 18 0 obj <> stream x}|E'}nd7R HHNHTPJBU{G׻g@$DO<}?|g嗟9{ɆW_o!yI(b ^moo"=pOuVNlkk `G1 ?xj!]%pP{ƦzmOpV<ƛ3M[{a yEσ^ߟ"`E |pݻwD w~tQ@wnx;+b Җ8T@T4@')o@޹-H,G _uu~;8 ?VlN{w>̙3^Y p?Qwp:NkMDM0 2D`J#-6>7fAci\<`@Iاjk= QwmC@ʊH>y ~ƍz>11"M(BJ111ǎO.%kG ȶ: ^~u*iT3%]ΜtR&?Zx&߃yǧw{_[?ex_ l O&!}lCǒbtg>⇞V.H]7׬^QGӃasN9et8i-95dWcDo'"{G#Hp8fb%%%!3_O u?t;xJyf8bvUc&(θ;=sZ2F;ܪx>uqEv!0++;ۅ }7.@'޾6$^mCnyIsn".| rƣP(}cNu/JOAH+y#tu{^w0_2PwlG7M @I+ƟU mU<|:gɁDn,x0xwFvp݈$(載v *]H uw6`&"~{__D\lix#vɆta|08pEBTځn>t r"e=BNsy/"org Bw7H" &0S6[P4""_s1``Dd^}{,zG·nC7"EH 9wCY9CDyήO?f!6Vz0)+!t5elc5 2eCtuu Vum51q!n!i;=6D gh]==|ԓRNb |)C@[t'DBLcbpE!!\.JΘ1"Pe71zKwNWW/)v}#Fz>o[z*GIނ]wǖ蒮/>u@LWKUz%à3ڒ'tκb_lh8PoA|uvG.);P"$ve:%$.F#:+Eho#ntBځ?|F阐s"6WC"HăY3G:<9ݸ®^hIoEY5n@R݈yd.;ǡn0#g?h'] v9랷4=i+Q-Ʋ3!OM&W]$6ET :qحo캅v Sz{^v +K|h䶘Cjb' ݄|VhE t\,%t>-$O!#0r\6$BDb陳-#b|7ȁ$ODt޹(]=d@R:RNd j2|[Wgpj_HˈB7KQa>Oj+[l3WLϛFʞЍ>gu.'V{ojuJ:nۻH ,XnvuݖAUxm=*DVj4HAe.LWf5%>.ҝPVWʯmxQ3jGF]Oo. JTh7jPG"M#Z ۓD}(Lf%$cuILq`w‘K7.xpkN]zW?O>_P7(C,JOŖ0C  jL(e` .rzq %QSn߾ 9B/RIwΠ@B]b<[(oȠ& QhO_rdʝ7U-x!0a]Z/h)/ u>s %X+vld,d#{5Wď\U.+x~ۯ>>?/>˯>?~}[oKϞii>plmk7oΘ4`W*=5 H*c;TcX1c꫟;B^uUǓ!<0gm|o{^lxVqeV+S*ܨ ; RrzB $٣t~,IH]İ?ô˯~4E)gLW3')Gѹ\F`&$>Hbb: #!|#8@YBJ4@II`%i# lZ¢0Yef8f(!N_7cjE# ]7Y& 4txQ[d-IW>}Q=EStF?rʘK9-Y9sqЦ&؃/DV=[ . & \1 |*c.З*2t]eDh`fW7UJl1vRj!IS01 K*. a] Qoԧ fAm O$M<+sT3ED#9:D#< 4! $D !F*L1KHS>ԪԺ3M'f6lKjH$vycwA>+KV!'\1C8+K K\.l*v,1m˂w< ztҵG(OלPVn|ze;Qo#V69'V*53<裑HwQwX:;=n?"8*9ߕ+gdҎ;jbvQ=r`? 1勗(讳;zh9֟E$Mf dֻvxXS~|BZϖ;b q 9#pDJuCLh759&JҦTmAUT78a5;e *QDS‚qR_"!l!rX.O1M%RCZ" ^So637hbF+k骊LP€\o߾2wK.L @p{dθ"Ӥ-uwJy٢Փk^ p%1P.CK1c#hBCؑV<Piru-7yM.1E 9Y6f4 znar@  pBL(+1&`'4=vcE|UM"դ~ySU7 :EL]Z.n#َI$}>.H~Vԑ oX.pT`ak#o' lU=cG]ͿV GFCP=6,q+{&ڍ@8ZhXQfso07['F=Z/v;*S4@Á+K %1>/& U8Pݟ\72fH%9YB,gRpDK,ՋWEj"wny U |hA^f9)#`5o \#-\.bKI)\l%DP@1q`(%v,7yP'XaTʏd'DU^ʅפ:^hSh=mVh23gDj? Kj_#ښF8wk{;-/J]UϿjrySY+9]:c f!;LN= ։ $#qۮa24,ӊ;vmQ[:+>+ ϼ; d%*E"B9'8 [|v8 Vf =hPPA @%?t( mĂ1`@4(ԘfƐ1"qT %8!ebPBBs =% (xqr.!Oc¨y#QeTXdb b]uد@%Lx#}ZNk@MOSxbD Og~AG{Wߢb`rakw^yE5qVC%KimO|LxG[w;-=Uں ulɊU)$~=Dhέ+-fĹ\0FT3*\TGSq1C$ bKx$u>E%_v8T~ىCU)JOG;b,qyj JvD\3a2 T\X*z:{{H6|*|(uк'[%}u `suQYzl/tۀVիW"ж^((K"Qv9#O<}{MQ-tA?伡䢡qy3B6HLeӺ7PdXwdl?7Fǃuu %a?ބfҢ,^WyeG=̭Z0GO&LSH'i8VЖQٸY LDE<0#XgUTd(yUF(,:ԂREGYW5nYC>eЎn2k'R{dT%f`B.L(YHHĄ*-bB y1!P| p4"\y/ XK00f,>ɵ% ' E,$[noJޤ7yk׮9}8I؞NrĪ;c?%ݟfauѾE/q0쒡輶~۲ւJhFǁS&_Bubo rpQnQkPoPffNhG@ ha3d}醪BsUgwQN$IE<1-Drˡ [іZ) 04 L6UZ#Vg7juJ+24P_dُeaHIי9z ~/{u#/iK_,n͞чkǂߌx:P1s(FϽcD]ns it08 &cJmQVAY"3$9[,aKЂ6%eR4 Doᾝ20eTh*\Xɫ-YZA) .@єЮKzLaJ6OEk˓PPA+'p+Ѹ G̓x"*_@aNrİW;噎rG7D0:|o>xĊT)T塀*CT%U> klgE]OXDuw߼1 1h:ؼ AxQ|U+ ZQ-ƙg=5e[DVi'O6`I9'2ߞ&@!¨`Mi{%S+GH78B0q\.eL\C7p 4kQak@UkMI;P519DrTˑB(IK$NHH*.!`SbbRDJ`\ O09N|\y"$}bd jAi,>vW lq͔Td pfI\JT3eM9ʊL}6 <o.UQw{:Nz5W' `SdW%;w+<+Bs)_ǁB661aΝmn+-"u Orau~nutCRQA/-dzG `4U(1RHmIB"fIqjqӷ2_4 u`x|"֏W%

ˌmKr5"` &؝j>/|VA]Q ]q\GQIדx`so+`Ë%פSR@n`qHiY³iV#!fϞ_Z\gdnO&7F $͒k:TdyP7JXb9^k@4EN8EОC/sl"Hq4a4|rl^Wnl2#gC-=au&)s#<Pf ]&&1)WUTvg8zh$xabN n$thʔ3XR6.|j1 DdrLf8bmPc8>"ydCM̯/EԢH/ʡnEZagUMr] Y.h4F A0hԦ(fZz|0۶/W c$cY#*(%+2kw;Kܑkr('䳡A(px!]"ػ J gM Zil~yx1Hd]V{8}0@w=G76nؾ@l]7`sO&^4k j3NhQ&Ȏ 'j:o"Xp{wmxP;pNx(P~ b?K.y,9->I,4p'HӔ`(PbɉV&׆SUTP"NWsx|j"Ab1,#h!m*v~ԋjD^& ~3 fzʂ·+jmU_i\{د+/\\ۓmQXʳNqrN85;Fh@E[J ~|у RE]7OIҨ8~o۪e}5|sOi_4:oDƟm5>-L?Yr&2׀|﬛lKT3@FHcSx㹦5)`0PlX*K$y!]…:bNfݞgޘz4ۿ:G9]O6ce,9e6A4.ɐ֤K{չP^ Yw$T!΁[yuf^ kKNvb69 .mbT)îv`6M'n#!GDDܐ~!ӳ3#a l*Hx2B-x|Wp-+V<}8qyCi~YY÷ƪX_pJg.^#ڸ;[ZQָkLPTId09Ū=8_'$'DMCdwhgEYXn>1Kt';6+PZWfXn#K5"?Vo6ذ*C$S5zy^,&:ʮ1sĩ43h֔,@uEPpnn<eɠx#K<r8 *[@8 .|pyJ)MSf.W~hPXG*@"9ef 8`Qq׍(% bWv6Ծ-9~U_ͽQWv^;E;ix&F~Ύɤ=E;{'_}UA@/ ,|Iخ=%`LIvVa[{ݵŞ|2 ltbK_U^Y,SE-`X9W'@8$ KJY ؋ <>[GW} oN`v(Ht+S%.Y[YQ68Z3 1IoJP+ )8R]eʗP0!dB]؇4Hgp3LaLNpD)MQfv*Ta1XJeaCQQ I8|mP?QwWϊPOTH?ERoܸ'&G+IjW/*<[fEr -))hhPS[G]oPUK9PԡhQР6_7zek%O]V ,.k?z)o2I P7PM##P3ٓ)׹(FvR_DY@@lIeeR TPPCLK].@HTgߓư\x ql)I5Ƨ DW8qЇrK5Cw]i_Vġ8@&sh*M 0fAa:bJդ!\SZ<Έ<6P,J_=ؽO(IT]B|$vrjoXkkV樋^W!D#zSv ?\UWA6Vk$- Mj퍗S=xAUEG*g3F_R m5 9cw9{f}QYp Ⱥ&}{[Aa6lb8O?c4 6wkؚ?u6lʘsgtZS|l.D);9kWÝurPtLDPEhPDyrߐ" '5R0DeץZIK% ?28; + 0\:>Hs`sjKz <|eC<2icVIIfE-*^h+yHWx~13'0xО8}o"OR6dncϴID,f8wM{"'UUVQ,gDUV4CX:g IWݗmr,࠸(\ҜŪq26TݱtZ+}6 T[+Y5~'Zwkj2$ >gys c־ Zzeӄe!2ŐjߺݷSw v X846YC {hCy_`Iɸx9S-4i|Q6 dR2H9"YX$9glo⣥~ai hQJ mxfbAB&9њOOsOeic㤀1DlZ%ߕ*q 8)ku:gߛW.q8fEV :h&'E6\gA235OhĜFDv .QS@erk s8Iı9\4k(~K;\ckiչ: f 2<CKd(E 4GgixxT Y$JɇBzE De*\: 35ۅ.CEqg@=]"ȽBr;( B*"?xCe=hu3'`:5nFg5c">6=-~/@B 5|q#M(ys2Xxޓww7y񒫊Sk'WOՒZ-QIiu|}Tٳ J$`ųchEUlOcq `8U v|-85T:5phc^YmS,Q?t~äF {$7I*)t>DZTDej iUO  v[kӖCinDqz$253$]yW5*Gsܫ,Orv(1x940n`z"M^"PDۤh)j3%u>^-ray"U_iV]YR 'lܽ-%_ uقmHFwBW/סO/=u\k x ݉׉}Y4]qEÌVy6:2DB!q`L묂-ۊ! HO8$ʪBuC٫:D &!%Nts 9t5wբKak7=hSK_sɝ3ThbY3g,͝*c1OF.ϻZRrY={*cf7٦(!+"ȑ̉.`UU..=aM&h[sʃUW_qIfO(NfQQ)|SO^cך (wmkoI[[ЭЪX=!뵴&A2YG^vzYEW5˞U~KƅO?Zv*]7I7s=3׬~ޣ o6ujxJ"-n ijH@> >PM#ƝVzn@VoޑqZ.}f؊'ߠ!qYø;o}"wekycfs˯/xK9ŋXh<-BȬuw?#8&4A"H̀wJUi1h%ɃӮ 1lPuN֬'c[ϧϽ<3gǭ{y}i(&t#5jF̺|5ee˴k-aڒsڂW~/7Ԃ3ΒV[Is٭Ϗ\weԼx؂Lt<:`:8Ђ-VYzʪ70tS&fVP،\T;ovrlF+PV0;Lq:;0&t5^ Z38hZ}[4D>EJUҼw5O.!Fd3MxK-WZN^P$2IۊX/֘Murޯӹ)JKvb`[3[=BСoݐ@;S`m vyG 5mYWWgAqz ;TAIk CA{ iΞ9{ #V>3zsS6`snGUā5[ f^vNj|2aˆKڢMA>Ŕuڒqʚj\eWR?XTG6}NjH+;[1$%K,"Lvjx VQc Ve5XoDK ŵ.ERda] & lG`3EGz!YgT4bpDI]7&5[F9[t'}ǧIb?8@reh>\=wmY*&&-4㓏46d0X;W:YDCH3P-.9X9oݺ#vaXGvEԼN}h Hܦh1H "hW; t(XҷN:r,/NP:鱛籗_|sJؖZҤ-P;f?mz0a%Ka/_4B/9w= ;˞)W])YylI߸[kuOY6E~>h>Rm7$A+VC F(85~)PnBIpjVY[V9 vIcZvQ!VoY]38[=rFY+ ZD[%I `c5ŢΊFðȇ4'`fz>(k(Iym|Z'6(uƈ6[9H:XLVūI5LF>P^plx3hCVWRO Sd~Œf:,oyW]2c5̧3<)KƑơ-aC.:8Ki}!}3V0b v87?wv7Dç0rȢĿ ԅe1sØ@$F(so{ɀ (!r:Ȝr$wJ}ڜ/:>-HrАg#2 Uo^[<ю]$0bNZU󠉁؉N+fAS7YћfHPAVɂXl.ii+ύYp6c5˶9݋/gw%ޖYj3ǔg ?xr߸2'͞Ԓ7\'s=3t\ى^YpO7{*~{_[U\4drUT)0v*O,7Ty-?v,au_tE%ׁĘhyT<ӄ`S3=Aȉ `$7g岉3&59 9_HkN5rZ2g?n/`&xIj,3ʚHTUχ'K( TuڣYQ`u >GxFڑRhSmjDs8 l@\,I$aM* *Hȵ$/>`Nkΐ5-ӆ'́VzʦoiOs:i^T=20 ndw!Aԍ; Jgb&IQTwe1I:+Ń(0$b\e );77V]|^\n9q˹St Zsq䔣Zi VB"-D'D%$R9IlN+ܞDP ٱi5c7e?\?ueϯnx}K;۫Zw7fK;[K;jG e))ե4n⍨7CSWfz n9M)/ rG@_umz1Kx:`T Sp/0MЂ{$SBUp$Ci[ܳʩGFu;GaU"\.K Y 7\hǜQPlqԍJ,T ~lNQ[8 7U*L_9'&W,X=~Td :6Fl ́BګVf%Mv=pM¡)B{ nJ\$M$ 9a`-6ZF`>~@9w!-cE+J)*8 Qg"eF(Xry0BW* IX$@yGxumKos+,,+.\_]VY]\^+5^5z֞'9a]ϟ>rBlkW/߸qkw]u=691"&Ϳ0j d1{3` JAy}mxb͝%+L7(>A!hDhHOHΌHm7|'LQHg}Z6!.h;cqA?B]j]hLy'|uuGq0B๷]f~{6B oIZ4ʧeɋ/zȝ}O0&wΤ{q7#G`r~ '(yd2e>7Y Lp .$ o~&HĮisf.f抏w&(g=PDebf& S| C N>2~..)TZ^\QsyQIҒ¢8T`bz뙙L7)2RRVRWxp[)O=x:YvzFp:+IΞXonrCKTl,W O%}q1O6mNyX47 }=~S)}Wpi.NXԄ9΍3j9O~5Džq|0]8Jsro޽a3(rɪxիlu]u7Fbk9Wz"OC0uف TۍO [16k|]maoߕ/,)\[[Qy gmU 2oeYٷG->U2PgX]9J\'M$DICAA8C}u6s8. J{L[)JOz3`iхwn|;N@]ukJS S-,m-X$ |"}(yN<ʙ4d0Cߠ眠KysYv30{ZyN |4TGEx&捸%&vNKcEnQәH%ol8mJ]Ld) r|\xcyڪ8vSo=^6Q$"bڿuw|ζ/' 3D]e*KjJ>֖#py 8kUQi姒⒦*ʪƦ榆W⇎7%hk]]zc+艊&2qm L"*o,JT$(0 ubi NJ3`ZC5A<tõ׿MQ=K5ݯuXeAKɣVcd(;iu}MO_V?!H~= -*&"w)ks>k㙖^mS?pW ޓ͸:u$= #!X㔙AFgh7(q51NDi@!P$q}IwrݿA-U3ƽw#-޺qrrR2|44m͐$5{; nf(몪*kjmlyk&xL"aּg `=Db^qp |L"$: &* ubQ _ALjgxm0O\%qRݸ;xH5*^7j~WC -B!#\¹\yUi_. sJ .!-w&?[|W~xu D|M M5s+cyE1Kggc0 HVo4.9РNtZOmvv"dI]KKmKgKgJ|,-r`-0tНz`oy̺>꘺ tB,+XD :!D-S p&S7V)Rcd,(aUxF/>F w6&-ejW?,Ҏ 5V0ׂfJb/eۜyF8Ht/ϒWRo00v+«oDѯ٪Gą9xxVy-=zyɣٳii ] ڰnEDcX>ΕpA (dj퍋SU.Aި]o((BKl@`%#e/{{zo´A(i p u GxG0h>!};ӪTG1woGޑMM>cR&cɎ@Ps2,3suf'lD/cuvrNXbƯ}!B4aMpni֭322?z/C~ǫwWw+K=U򥥣k9 En檊g sSxKou3`nX zZb2uM[&ɠ:GRc1΅A;#h0 _b 02u%Ѓ\ĄĦ%^M-SW?P?;:5 x9{/_Kз2|6i}Q,`#`hϦfZ^|?\lo@G S.X3]7sֳv7n*l1z$"dOcCïY32G挽#zM<+ 끬?s; Ya:\&*9_uZCa7L5B&2U9X::۷٦~=/[Uʕ+utt4]0tho?RTRg۲2^>ԩAm̤dK.I j3P`yhiH҉V>zu~# O8{:%eG ́w;{nmѠsvDTIB,U2bf=H|DM2Ib,$mLUnqP  <1eT?~~_FNӽD:"~P91{9o+f~=LF`Evr?"bUH6| ïh;s=Jm"-ă=>x?Xir==K! yMc~>p%egiwP 73\C-!%Zb gPBlz'pI2l+-ܓ xL Ct&LC_-//e+$:]]ݑ#GBixz~~~@@AP֓Zd{*.6'/H32ԅ [w4!Yšsգ1 0t:ˆvp.θ8MF!^g,"#FmW3t>.LtC)`>璜"< iÃFZN-|M;PR+}7F`nT폜 NDFG18I'B^gc/b LޙF) kC?Ei'n?qeb$X lB۠<ܑ Tʇwc Έw@[QLh+yW(Oҋcn/Xk/ey@l+ [nܡ8rC boĈNcv}4B_!r L֜2̻۷@ --#;܄oz,VSNLqNXTjvj~LB2b\(aQ12lRh/N4c0]h1uuذ +1vܩ: Dw| m_ 51 w|GoBj=Oߥa18]yanjm^G#AMUKhupsJ^%&]YDӈWuxRD*u.g&``{U.аEuk `2?`Ż ݭX9pp$DYj3꺿%'&'V0dN>D/fSN<#}J=*wJsx9rdÅ^LApSK4G"7dsXyqq.`G FU@V擂^N=yB]JJw5rx_ԂL,h@U.]yaLhA^xUHr9D4H*KV.mN6}S὘?F# GW[@DB{GkcSS]=\- m-_jWUWx0Yb@O__[GhC>#c5x(Bz;udRIυa0w.IlȱK`Ųq &d25Q4u\V&?ҟ)sq,3Lg|(1K^DoٻUcO?G5u>|Ûk=#0a58-4Nf["kb< tZy:y3~rN[V:H$@0+vQll '+g<q;tR=N¥X ء>2 ;Ɨ_FZq`+$M,tFmsyITVVYY e6D-mr-͵~u Jkk yh"McllqhP'>HB5Iz܄݀Ìxb]-D>Qš(y5+Aȩd$8Dm|J$OuWv:kh cGS#\˩-_// .d϶~i}3rs|(򵕪6"6%KiGr?褣< 83fD7Tt? g"4p!G {;:2{={We3U5`Oѳg!n3-x߬8 'FJ1+ y]0x/Lvg=L{mmmmQ3HX/~ Q%l{K+D|M-oii .hd+Wߩm' yy#kb)?‡r&-6 o|J۔NߙNߟF>+REn&$&'˧ZQcXUTs5; -BG. Աqr҅Όqވ~)XxneguCў~13zd, K`Ctvi|E_|izڣGwd~\1k c1Esw_z=Egbs1YĘl Vd֠5YQk.ҷg6%QAuk(8{TBS@Fl;w~~Tkf\u}Ӏ!à1ԅ%2xo$$qL8.KRt O[EQ3M;RD;Ro|4-;XS=ο!wwywߍb ,0A/u~-_6g]Q vXiPwƓt7rx`Zst 6Wu`;feeiPCǝ;wB4&&`(U!ꠄe ?._7RNz_:ޯ=ͭP3Jep^(wZ %*MtBűMA'(8y(w<:-/JI!uf[i`D!ݱO{##˗Cs uwuwf߾yiZZFFi6l~=@^qvR hCmL([732w]v:V't}D.R,h-g_w [GFhP>$.o^YP^^ Qfd5BUUWWTT"c/ 3i>A3LDs4/$D]sSCUot Q'+Φ<HO1 iN2v) o3{Ib-ou8ceT5*tLu,+PWOmi!1M A5$f8:FEỤr F`¹: kic{;aMSζ/P, WmeU}m<)̏5SF[.#ճ5Gf[./r7I偋vaŘ$1P̓6,,I8v@J}TqM9]ΎJWX  $${Y`V4ղ5ݿ~ݖ,3 S}H}PBWW](0ve(\4(m{ |&{3rs*я<xF |N%K_uJ~tw7XcUɱh` 2]fךgFϺ}*wxt}P6X!.-.ijhCe(^IAɓ'lưR\EidZ(jቨCx_ɮ."֫n}!ץvmP3jnyބlPh>Wwn1U W'—athhK#|PfEŸwO!cF023r8{l ~?ٳ<[uwM] P#Aj ?{Bh-`gbF+Np0/[A@fΆEm!RpL+ #R+Ԝ-vRmCqrj[5bh `*LA׮CTUCvj"##СCP\QW"> r}W4i-M҃ǎ.(^;Z@,YnznhR6g˜lX#Ն,{xPwZu8&Qbw&Ah( wilkɆ[YXB`C̊rv: Cyq1=&N(xHI{zLo]6SJx*y..=!K yM8Lזg3=٤Yï/3>`:~=0r7q>_ڱ,؟t2-EIΊJ-e8B1pg=Jwh_07OC@n৹蛺DQ,CKv̙sLxCY!u+j!uDp{WuAM{SSkC7Ni%gF;nԛC R~sD^z$2RMbc٤81)l790Z;%d?Jj2V\#Q$Š忤gyZ:h(h\fq*]tŷy9ld%\hemL.+ܾ-җ3,U"VgAI* 8뒎)TDHV7F\Eܐ[*9QL;1B̉szA.H]] r+JW5UB㴡/;$<^SVS$}OUj!P[ZZZ!#wOw_{;ۿ4w46774/).\wU [TDSc8qvjx;a)J!ЛatFm< ZT`-([9{Eh8wwF+Mg)0[ljmiӏF~}iڤkjQ$=0'ŻN=*g &6۽t9$0M@u`Y;&3@h'7 "z {K/",6%bD{"8>$ N Z;\oD݆@o ՠNu醇K $>;֛1Nf{M EGd򌣲"Br'32G^>amNo~^>#^|l hk5&//seeaѧ ޖUUV"5JᎆΦ/-Mm uH!,+/)FCQBW*& %)HI8ON_80# `9f$D;x,gDzdd Ru5[׆:uhm˿!a\jU$<$wodhX8gĻ z%sKV\L≧ϥgKqۗ* c/$'VZ5k+`J*Woĵtfmq)`@ ڇE6[9C #V}qꚊrhf6UCƆXۘ(hJ4VWCMo?CȢuUM5u5m5M- PW\eiT25ȇݜ]h;s c; ֈq/ZrCUD WJ;+0k`Na#"QFh1~v1.& pКXlQ]]M?oD]z5o uȓUTyQt ,9(8yѧiG2ȧ?{F9DmZN;xX9W=&_ L(NQ z œi =2Y` $0oHN4rvZXR^Ӈ>.𱲤CaeǺ/`K.e+Əo>樻t]qGHzˊ A+cŠ>}X_V7q8d694N #Dx} -ʙI=嬻\( `0ʎCo e&CYt94z m!.LJˠvA>cuөѾx kkQo&S]뇏EJ-h`盧)á9wcN{ҝ?LXqҁ^'0WBཀOſ2?t]>>J̙3%] 9D$`, 5q`*_ Z|`8zp/cCbf%)jj?~cEo ?X^RZUQYV@3s#}Agk+ʪ :uwo ! ߖ||SdqT}9?4}Iדò mK[]S.Adcb9x>V@qüGuQo/]jwL- GLA`BJB;'̴R(^.f 7}Ju{NU2v=?@5r߽/j҃ Ϟ[}& w'`9?@$CuĄ &Ӝ{v+J^Y EFV$o`3d HcіЂ Gyim&8*wZX;Lw"4+ӃD`!P1^:z&ΆxySPX./|kǏOSzji'ۜ.}Oo!޾)ΆzMw>{ ,/8'cvE9eo3ލ==;|@%rRyYG8ᒅQ|R+>Qu"^Hc11r@q`VWʼnx@~f,:H"%՛MT2[` M]QUnA a{5Ph}SEiJ-e>O4)lDXi+E+/M&A7նct7ZKnS9,)fNx`+ !R#,'?J?ҋ ﬧz6S['><ƈ>V㧢7y r2s ? &wN]Р/+{i&+MnNO33eyS) VvVhd,'Q)KXP *YxūXjFSz۟rv*pwp6xW5ݚu>/&ʼnXanz3K.$.^vԘe{[=W=BpF 5鬨S,JvvH:舡޴S<=h-)U%)7}=pT4oh h)-Z,3: r()IJrǺOP ("0ϵAZ(ȫ ŢGiM%Uo+s Jsg~%7/SӇ ieq!,$cQ{=Hzļ̬WE2^ /TܹvrcQ5mPf#ƒ\6>Ihsvw LFr#4.pHΤ8)#SkC压r]+ITV}_s~O3Q~U_n޻jjz'Z:(`klx`Ž7Sn;1 7'v?.X?Q!6$":Fz eF( ı>!]v&%߃!ڼy4Cycނ#>Hf J06|K>UT+.~:3eVɛ ޼̎s@+^j/Kk?UA==bO9o޿|9~D]Sz&{Ƀl0Sw C $ bY+'GSθro`=NXsi;sbJt0ے-U#evX^K?Fz9guiT־ occsVVVb|V,Y,v_{[z4:] #@ӱ]KwU+l?.݊E9aP.`$[v@1)d6fK*L^Z1!ƨ|Tw e5U}BViiqmiaYIAQSmu3iBa'GZRP]TYSRQ󩸺s]Cm}]ul`2ߕ򳎓 ɨ+ &^Y*!VdX)\* EI%aB7ob709 0Tx\68:&)m<o5^u===]? @,}Jݽh׮?}ķ>KIQ MPK]*1w ϭGa>fV˨B!F,J8+EsXm"C h϶]D)0X_#.Yr/k*+Jjk*˫::뛛.[LĞI%TWkK{gk[kKSMS]zֳ1SFjCxqN6*Q/!ȀxAn(oP[v/)AB6Rko:`'PoJޞm5V:5)?hڡVBko{7jψ4 NG@~Qw1hܙ@Am`mҳꎲX-3λ"xghġ>>F½B+=AJ}rDe4Ae#C (ỏV]z795M5 K޾}>},䯚&ϝL{]e15ԔW%&Ưܼ֌j*n\q*g5 & !a Z0qRRJTxD/rJ)˩c=ҴU99sL C$)D 9U<9U$=Q8=sǞar}vO3=zG*]gK?@3sEBIOAKcBq4l5"uD''?:r_bGn7x7ۜ^ -PX#{1G>˫3#0$?>kLTQ_=K׳퍩G( DjUF=xGXY5J[ *кjWlixc:B$$Ćm]VUNw(T6E0w-Xc+[rƆZ P @)C~u輇W\mK&O"I'B|hSFCcf~T#L89L06z#;' ufMvXA*s؛M)m>HW:$z҄,rJܕAB@5|#cCW1pPx}o1\k۹ֶ#HUN`:OPD܌wzk4)۔1ֽ3ʍ܊UcI3^zNyO?ln!I}M&5,} sܼ,z;Up{CхX"EUX5~‰]Ë(YJO9+-ڈ1bs:u#PggԜUsٽ:zJqrNnKgSgw:'_v>qEr%:;lEJGoqp7>|kCyur:W"egSwխ3Me=ڬ0h2ւ!W1?@I ;b>wEIlX 8j$s~%HxQ;=RVrU5¦XUJ NաtUAFY M*Cx6zTլ:UveQ,bō̜Fhi%zrA Svv)~f5sڪڬ3% ŘdeʎZDaY#@&nRmXOIc>Pw;G߅y<ι}nT$F߫0oMk\&Tj@2N*;Z=8nJۨQ/ѠhEN{f c86HN[ļ )x;fvRljy fܴP ;>QԪrOu'ƣAAp@*3y" NpHm8Gꮀ=h82'B/KxEic%M˜f7)EkH1zf~%ʸXQ [O0g촜53:քPSmK~Qݭjj]Rޅo.TN#2T}|'8:^{F|*cl Zl5AXEEzLܠY;ƈOhRM#~3Qgu8d) 2cI5Z^V)=%a -°&lEI<ux.l7q'8JX =;cEܘdSwc^(EG^TA‰5zH@;B5DB:daX^ *qƍ$Y1NP1iV>q`!Cvc;7a¨SՀ0+`5ʲ.EeM6p^4ALI"l૒#C@{@3GFou=okCsxhص*T԰PT<UL-Za BnN;Di>>aeď v5ҳz n8g&LܘVܼ @j1?DZ=^^#?kG$^PaD͜c[-̉\Ԕ 6I~¯Z'AHoTwYSw朌c q$[$ dchX0fFm og;NnLO,|Jf">,#}P?o_bD:`#oNMQDkchlڧ]kU8\T6uwxUt$p3Bq;-A0#MvE)7;祥(3ܬ%* 㧉N!"0#= ǣ&q0,mŶG`R6A˙p6jFA祧kvi/{M(#9+-(ffy1X) $NJcPMGҮl Y(Ǜ_H?OԑG CkGGF>Mp'Vu݋͐3* eM9;0.nԁX83 1?- sJpcJIZ5ZQLc0Ј3)(_`\]6R/ f֌!=(g*Vi}l%k` g]9An8Ĩ.,% B4Vk@ 8h*2hԼ`~V&"CH߁`vSG~\8S%ƆA=?^ޮ/W"s} lD4Ӻg *$kjD͐Z.-Mkf!99I8{\OEuFu4pH9-3I >nNz'lv6n& 8è;dcZWd%}^㬃0*vc<3Q~i@Gᷩ|x$ƀ2cgl`@B-LZcbn 4]b8L R(p=__#m-uPHC7 Gu |W d~2o"(RФٶfM^u#͵A׼ҩψ]-WBVM0~fl|lfV$N]A֣+h~eyN}j =BVIެmQ?i>194B11UA) E)lTRU,,4={ wXx\z%`?5QF`E%[܈ b vFɘ0GΓuT\Q!L"g*}UE~4K BhPR"F]!f:¡gT^9{% ]-Bu8CXli`zKVANХHeG'_tprR%YŢ +e4%[J{C ˣA~_kuթ{švrmzѦx\+^,B8񈓋2xZF}OHh@Cܠd<ƶQ qNqʂ)#?g'j5SK l<|!2d%W܋HV"% 1ʝqo:^>"8[:`ߏ^vPEA=mbGhGAm)ǮS++|k!N8(j)Ǭ8UQ?FQ^ aaNjٹ n0mi+e,ܤ[e,Pr7˘a."DQe! \@.bE߹pul8/'n䇣wB AV.;ȧ@>Q-p̏Ѝ|܈WLq3\5SQ:;Y}jkaCJ9 -d /N%!~yMϼ[B2Bcb!zD>qd(TW.oc1T5f%>w߻~ ,ibNO&/C1rfV̸Y9/7٨'>du(*zq!5*.֬ qUr+UсZ7?~~WGVP?)ewב6p$?~Wq2;DZkcYZ,hyqj"j-TPmM4E3ȉ ݭs9" i[&gւVR.M"۫>r_0ӔqЃe0Ì,`#Q i-3>'۵m鎷.o~k7:kKP# Xz3nzŒM1513zFVӳz̬V/7 rPuTB\ȋ,AkYTd?U^2zsv0>H pBw F uazmlh`Ɏv-- ބ<6?3"ΉˆUc[9U/Hxq@c9X)ݵpca!J}nRG)) ,5E9I8Vu4C~i|^^6Kh^k:~ cP lGKFfK~? | KUNsrVP'jb`@㌉kdጃiH܄3q2"ugw>ZM])ܽ>QY!R2DWM> ?uݾ#Pw<ɤ!,Gv$.*ZcvT0TQBUZ XT. "^,윓vn1vX0& 5fPzLDIeħ;<=t7_iD-Al!*;@lpug`&0wBϯQIK}NnJc8q36|IuNlII0׉ ?sSv}IfF$>+!WIx )3X8R)7ǀu VbFբJtMuɢŭm8-22fq !z 2z~R $"i5(480ǚ˔7C/O1>ȣ{?H|c!NF!dOָyºA9JR1mAurb:Aaz$뫒SQt0,K9'l"r#Gt`-~!;$vl$p"Z!ԁa)$Q0pz Oomu#5{^qowfMȐq>ڙ) #QGўn8!&5^ucSn`onRkfv~^'vl3RA~Qu=qVDTQ 6ʁ}?7O#ykWn] ]88pl'P7$H޾5J: E=>eNqЍ-B eI$*ok;H1jDe=S B2H>bBC4T^pwY +,ź=ZĆn'koHbjSR&Z(D\aH58emY_2" /WY:v6Z<胞߉xY{ՠR|[-R-V{zxy*/{DSpa8"7<@A<.o!of7yVWuD#ș(jPɺn~)ı *Q..}NmΠ.@>|+#Q'3?uK`g& @>I6S2fJNUM-j)/hnp ͛7 B#ʍiy p6-: Y8禜/$^qOjcyS i z^G' KD kyO#+"W(_i@fw~Gs"ȏ ~zxB@HC÷/ _suB= RY2`i_qգi,鶻:AۜZu;|F6hd0(w QG@Ž^MԜ "ao$]DMx[_7꣟ˌw ve7`\8BtFJ:9q _g>sU( HhPMV6E'\xE'葤P ӑ8{kl^NP.4V4 .i& _ą mj𹥈+ʖ/_N'??cl^ݫhxwvuP[6 r#,`l̄Ebvk}nVyՋqQ*oTDm N^<=7[ǀIvl@sP'١5gNg}n`Sʍ?_>~PYe=Q&):=3wuD#j&: cNQyل&բi5Wڈͭ1k#Q"ajVwޗ zuQĘjo6mm~(XUjA˛q"xS IQ*{.rAA'exZѰ_szfdDKFClʻ֭3:j/,0ecfMdO &P343y'S98k0~8_jH(꥝uPsNRze$XkDTMG^;6Ԥh;e@WV0=sVuI PE5f_X~ҌoNk;7unw>,Q8.BE%5Էl7g%Cp}n{I6Q'v)PDw( Hh&N(JڄK&LLPݴbG1M@+GC҈ss^\QSdM$0j0` ;5ad~u&0+cp+kĿYZSN]? 1vX-40Ő2`Jh=_w `6Y}fL;Y5#!~]A{CYSf8#9Wqt<ߵ◻wV(% V AӶxל}`;вY=y>f3{_ĥ7?Kľ~Nj# /KJ*6 bvzMA-䧽8!,~J],k W^f'_ f>7w򉸎LHN/8'18)#h7WJaMSKj ' Dj{:D|HB6hk`u=c'u @ևj7t xC3DD[A3w4uHD?8,`w>>p^ZʫV>6}77w/:2a^z#+-+>83~/%cWuKV2}3Q7zu._zT(Ph|5 8%킄ndpC GE{,}Nm- s LU1+3:cRN!R-;F(n$,?aӟj\9߽m씶@$<'$3|mdjGXݴދ3VsMLˌDUGp/YHdJ5) SpQ^ln3՝*V/#c~ӳ6:_0i/`x؟|z5 1=*RO-9eWu=}e}m^4*j3~صH} g 'Z'H⠷LTz D@'lR$/fQv~ƍ!s1:: @ 25/xs-bPUG|´ `&I!#̛2qHT- ,|~t5!PYq܇f0Pu~K2;L>/5 [HD~k(co0?>v_XPJR"D(61i[ +-zn;V= eTsy1 S* wHja6ܕwS > 'I1 Zd=.A8ϸ1};L(TYv߸ ]c-ͤi'8Q7;$NdcqgOH@PJ5 |V wJfgA 䴙0a81S xl3A#N^{b=R\PP9QxBgL@Ba-ZX@;ǿ`jxY*D_|s|9vOghlkW.^? L,ލ]Τ,شkz+FҨH7Q2[^Y [HMcq$l[ԱI5{Qjfp5N\zVm-dJ \qe7 e7ލL ` $(@񍘕=pN0{ʣAzmuyB~C 8pq.Y$dLtYk I%rrh>E*NB.!s.EN˫_ۯtn 9q?:*7!ZQS]V\NT|hEׄUo/uXӴzg=1sƐU(lZq࡫z{\zX{o~;:^v[ ڎH% s %&ݺxPzFy{UHY &Hj uk^"\-.'Ltg,5 , ;e!l,nh*YCl芕OY8kbQW  8(ΐD}ΐgR2 !b=k_pb&PvO@.~Y)O#lH #&u*$gY?~ Gq굡qbcCp?p{wUbPWC;[.޵q%âŗYiO?tl߹ud! ?rTK#6Dp>?}[27YӾUD=܈Q phAKVukCOt@(fQ+ւ*)c:hRC,hV)P){e);zLˆEr㤃! -f'Iky ?%t܄ڒ61]UNxWRy4>Qw% 1R&") /"2FQ& ۣ kЗa@00غX%>t7n|S f+gFl@&n9'RļψOo76@N3!@\7BPWmz&>c_Ͽè[vvp͛S.8ml ɽ3YcRx,BTwM[3Nۧz8== iǼ`CO]FnOY1)6%Skgr k6llU8jrc!EˉEY(edlLNF ePHEi$keGbzEyA5Wf$aY3@a)#5i,85FC:7i=i sŨXn{Y;V_ OeYΩ)I-6w-BM+[4| i?񿍐bA 0;~_Ν1쨵]l'od}ne͢wtsҶy3͏ APIIѬY~{ΫjvLc`SIP_RYH#8YTTI!cG0n{AM)A‰tʃRar'4=v-6PI)8 p:;!H8%mԆS4 Cp2wq#˺je/fNjLUZv(x JHsSAyЧg.Æ_\u[ƄDOO(t7ncDvgř&2CsJK6T;'j }AƳ}%% 1uIgC{.a%*.(@ԺL̵7߱/`]tپ]BY.=mn~6N]x~ׯ]éa::xD ԁ2 DVd%q6akOzNU>~ RBlh(/0?4xj"mv*V pM˶ 8^Ҹkn̠@9eH$1wl !w+s~ZF=AA@Ҫ'ZL%Tm[FuOP `j ' &i*|:߲IN+Ym¦*jZ5Qt|Չ%'#M8TBJ.'ZЂ"+v)*Vo왈h 2 r.|;(z%0 m۱g`8\'R6 xɳM_w^}ų{ێo}ʂaj)% '~ʇ׮0,$?J|v%~#Tu'vXDnmeɀQˆBܗtXcVQ@0i6 Tocg&ض7M*Y͡x\8[%kY"i&5Q Α(Xs90 Xɨr (idS eOEg?7A΀i%&˓/NQ-wP ޔJq,i'n-̌}*nB;VF+Xlܴ,Og5 Q1 )ZцXWm%KE뗟'M+ T c+kiׯOa688xձ"ԑ#$u?{i_a+O١BO=^ `.EW;.v ;MjJ#X"ê:v=Iԡ ׁV+uښ4c!e_  8@2ri6ٹ+P#/3h#_ U ;2g̒ ט! YH,_#^"loU~T1FK.I:Ĉ@ g75% 散 ^. c&qјl|FX3ğL_kL֠omE@ie#Ӕuі_oX! ү7/uך\hU{*=  _jdOrɟ@(3G?g? vC'=fU=GNҧgSkvEi( # MË{1<gnqv/d剀djVD="2PD#=-MBj(b;)ERb" 7nŜHd,tsF Ċ=XM Oa3^Y9D8tɒEe50g37&&o2+EWL]t-Yo㙖;<7!MV^^ùJ/G O?O|pG`l"YEx>>]lbG=Oݓ&s8rB3&>s~[%lm;\{ay.DAn!q"Z=?? l;C/BN@ؗg#7 I=[zʁe5zi#LV`2NFHڈ5NL" $\55bsln' I:/:[ՊGa:QkoT$V.Z*hP&GPf6 AӤЪhl#`RvX m4eˌY8by2RrУAKDi۬88y_=*]vY_bG ȐiVl Oaq^)t>^U9W^,;\Fݓg',;Q/h1{B}칏?(#Wᑁ5տA(Y1!LJI.$_l>بQD6N1.f'8ǻlf=Z1y.8(j8:(IcM\_6fP C^-eV}ڥbZ6oўnB[No]v7Z8qLW\SmG/pvF#;֫S Zqx _gGW~k>(^* 2!( ;IĹikj\~;_s{}ӭY&">%*/jcboFȞq"yQwۉ-#((#DWZ5<ʸF/*@jaumUky^$<%<90 :#|=/SJ}.Q8xs$a36ڨdcVi.L?h*j!ċ4g]} θUA[le6BW_Tѳr6zd4Xjnai %Mp3N@,j5ceNr^us02c&^LLNlO4:חdm A 36زRKo׿]v-U .B,zMk\?@N6p~`?ߟ|[ݾPGFo5DLZ* a)12Z'jOhpQFRs{Jj9:POaLp !H%` p$9pTi3a2n]_X4 ;!;GѢB q.A2΋*U[r zݵ1茗c`{ 4);5l^찡fiCP p1gPus{U6m ԍs\$$Ȱ[F!F4Dݺ>U[yN'gN3'Qmi3\uRORv;P##[+q_m0>ύ Ns.IA=5~ts80CC@7)--a|8/gbj9-7mJ@,I@eup8I`]xޘK5;|&q(*7

t$%r_ wyԑ2kgα<.x ݍh숓U&m"eSyEBcR[A1E9|S*9g4~$+N>hdCbn1sLy_NtU-,@[pT\ZA94ڴ ho;r~̋cTMZѭf']1Y[{Z,=SXUjZnÒl+/9W_r|mym^{-5H(89ٵicn_; u%ΞJIuJӱz&=qYÉPa 3/ԑB*ad-x=;ZEAZPЬj"q1=iC:]~z38G=*6KzܒsZ8p1x=Uf#emu 4 S~E+=av ' לU:IAmRw7;9ݨYNk^q_N6 q'XA#vyiÌ#bd5̌[2?k@ KJ+ڇ4$hw|'.䝏{e}mKv,;Xsۦ5].:=ownX|qBwãĄ#FG~?ny?Syԍ 祩G!ĉ3o~W,èy bJ[!BK$G,_k'XMjp ύYQ=NHܑT,1A+cŋ4Aj4Pze_P\ Tͣ^pO68N6)uö dX\D4ZA5mrwyL'՝S~i5^g ^ҡ m6j:ŠdPs0T^3f[#͹`.x^0Uu;"PA׷\]+߮[~޳g rK/:\t._v<|9.M?\`ښ޾TP^S}l7^;I<>#D!_Esm^HhJuPwOY;= Thz-m5KNA]OC/RڋNËE C)]#;K9 yʚGebJG[y]YGt,33 l2dKB'i,r$Ng&LiL'I!m٢w%'ofSd9{I-k$5O85ysx'kfQyq:"Mm6EocZөȴj8Fv}kـfn]='Utߘm)A[kZ=_>`Xk^~U;cm>mφ_LϏcO5C~85pG| &.rt`N(Y:YNH3cUVjF'6$Tyt᷈\}hS.nV1&$N( &%~j3"o%VkיNKAq*ƾEQ^7L{yY\%KPc7[z\wSD缩2o\:5_!bJ `oοZ߭WYG^n>׺{U5o4K"16?=J$s#a<7j&󮛅v|@vSB|]9"9눝KBrӱLiJٝU=ʂ~m}mkԅ}>9EnӪaW7,ܝvTF簨ßr?FcJ'cC?͓-@G0Rی&[L>^&!vG,#QzY:ŗCB_l5ibI iI,JVxwQ9`(قsى[u ̽Dڱ8`I n[Y$M~RڬWI0̋cN6ZQ8 aK4RrNa =i( gvN3g^G#ǚZUاbv]»=ƂCAq][^\R"Nӕ bxm* eX|c9gQ#o4Z `a, &ï@1aMc7mFF;̘/YՌDŝn,TgC^/@|ؠz&q)XAG|#0! +#Q/U-LQ9DfNrhW[LIY0`EC0G^Μčc@.ξikE*^ICm] ݪ5wwz =M}]#ݧ`ː FGF598Obi&i)dq/dHڤ5FPeՃ4ϛ34ٚ&7&Ʊ.l$ dZnz+w'Y@rRy-8a:Ng:KQSװ=󞇊ExJ}OxCcEwUgYٟnzrrinr^`m*zf*X/?\pyy[)v6Sl3n77n7;8m%Q.M"!uho"m*)0=W֠Vfrz^&( ]9q&`GqFr|s1o߻m67s|Ӻn^܌x}n[ R01a%i +fV`ϭI7ͻdnZsYv{U(ၺT|+}mNJ[K8wQA ȜO>FCCOKy_)MՍo=CsCIw O$jve 01Aq%)+p/D9>˯@%_eԅs:mՐڍ"Ir_ B,Ůȃ.vW-MK,xLeC?mR6` $  L)ۄ*0#DkQ zÅ03,KD#$J ҄GFQ9 2@0$Ѫ;L c8Gmdơ&8|'J{{m땄\ rӂ)Q8,EtC|!%|EҢ*OW(|w\%.+߶N]ykf~< a=o{<4W uB'H-I^Dů4"&Y: .ew:>HY+oӆڜ:p2 iQd)jO_3)aiǮ4J2M#E)$\ rUBhVx:I!$< \:Si5E)[۶ ŧ5H.ʪDP2D$;(K.,dO‡pP/^=2y@Ձw+9R"EcOuuCcC3f"9utQ}蔁֪6%`VR\DǣB/k5ׁƱ"p>9&re8-Foq`MU\JZab79՚)s(aQKɬZC8ɠyJ)FAۊYfN.iu;V<|*pRtB-z^ {q}D+<k(7vvrQ irLOfrXpM/ 20+^Q9oS0c9`^-zk3c>/G 6T L. ߙYņ1,]{m sXmB_B̰#x# 嘜jՔR`~)5j6U;`.Ƶ#7.%];kɘ*h0[ f LMXF4~ XCCTpbaQg23z3v-מh11Rn6Fۙ+3.j!2CwK fїG(Suf#;µ+\*N|:푨[OWxOStGϾSޙ; Y̖ GHJY;3kݽUw=sъIֈa {E?͔oMZ3yuW,R,0t7= M0~P7w~dN4\h%nIm#ma`n7@0f ;:^_zB6]D'ѤKM4>PI 3ۍVI˼bÖzAFDA$*:$ۯBL6:= qI (泙,ecf"z=IچeSpACqdYӒ#0J &-Aj7oM)]hN?QJZN}=Hť»~Kmφ#=0,r}:CÏ|jB!z /'!ؤSr>,  ڄ2uBuОI Y.y ٘R&R!iAJ GqDO=c]1ECK?$EZX K!NVV-lR,dKSٕ鏽/9HWWP.y(XuG77sMXAn%.=oծNܗWxRxOWm,^cUo{75-& PVY׽]p (xs)҃D]C?rVM`tdpttN ~?@U6]ks%,|;Lf#r˫ԓ~Z!f*$* *#<2R;TʊjJ0I+ݬ]T=K^H7NRVg %\ظ 0c(E nU֒%rՎ 2 իDmXhVxzq0GM3 ]x'+*v0`6/neL9B&>u[Myo{J{ }u%=O~{[f#DƲ3]Ӧ#n$mƛBe[+9g)MM ð>NNS͓`֬aq "׮uˢ#L Ua,l1`yD} y7Ck; f'TǒuyəەO/=8 Hqqrgi[=qZzd"q=EUqymqIkf0*m] BRƮl/[ІP:V^aNȸd&,eA&u]ri~MˮFOa<l&N.NT[myM6}yIPE)Q[Tr$t8 i1bvZM06' c ]M7y|2a=OV)j`j7e$N  (q ;#]u`hMQÔ앐ە$T}z%IQO; U`yͥnG}#;CrqGu-o۶;u;һ浽B4I,땗w uK/;h "xvy-C Zbw%8$zP&_I\v*I$jfZЄkJJ4QM;tu򄇴UQ%8'L0N9Mp"zQSS[.ͥRv4i[^ u;3G%-'.'Y6nG:k #Z; r3R[tl:vQNsp*n+)PFN/?d{ze[[{kEt!(SoW|(Pvu9Y JDX0/|(4>zb{o[:xC!qЎ Җk   +f5Y7a+0ʼ^K.yhW ^hp&`^3:li&sƥZl7Q<.Nf1Mu !ܔ:>']TZV9KZ=B[->hV0VMU$^XL"׫>^n6 xawhT.G_Oiײ;fkg+[(Ŭ%)HI{2 aH% +H- $D׀Sڊnҽu ݊u%>uSivkOg9mNG-&QDIUG* f%|sGCtu0t} u_:4X&gyn:9-Lp4*Evd$ԓzu< * LFfVb7!%3l*\,Mu1WtDX09VqdFjݫA ;L7ƃU:y&Ian p>8L6sJ5p HR‹ Ȭ!T/Cߦw #&{MR`]l~^6~=%Q 6}GwiLvHw۵Vyf30K|`$ [aYәq3 ϼ/9Prh@px_p|߀{(|,ќz#ù8x4HJ5cGhgC/bs)u ˑAPC̰MIbURbY'$E@Ɔk$hs# JHXP (`,&6hUM9fŀQ`QydhsbF&Fˢn$92?[:l}><|_? 3]s6T!̧ĭO.-xF lK6xuhR5DŸԚ-vUVǃv $MSS*qHBҵؕ>g*(gvh~lP ZD>!5jHQZh:mg\[@BV!Kc^3#Bc)TfN،K8#2MvvCs,Sq>S`]Q2 S\FveF'OSAXC;{l\" 1,\߯~O> ~6gOp+W'aԍG塁wVȌS_τcHd. #x)Hp*r+k=l^2hMy6V3Vzaj榈栞C2IAu:K$ai-NQ5X3[k 5XQ($"o&Lj蘌'tdt|6,p`i*ߛkD1 mQ[/f+=d漦@~=v !]fncqsq-N8b^Bbpn5LQ@ h K BY=?`<#ÃiwVi*jn !~okK .i5KT@A@] r) ӭ"(7_R&5=Lya`I|%CV:ϋ's͋_M]vkQDRQ1QOmql0; ̊qiaXi4>={$|YI1t\z]0inmB;,l6!y=9G܁ X"w)D֡8kNtfv5L;,rIGu`Ajf<3cO;,FGlu_l_+:Ly>zG mZTIZJ]cnF^GQV]-309FO#Ҷꤕ=:sJqe>$Z "zY_sDBlPH-Փ˩ȗf)pOK +ؒ:%qބgUlvCAv\ &G¨ z\ŸS$ǙgͲ`N/aD;?M+ "~-&:Ñt0O0q4BjzV)}B~.oH[<3nGp%2_.KཙGVP0#Fw9ISy J hn }i%9eŽ_Ǿ ;'ǡC_oطudfT 7)YAũN2EڳuLa=SVF/4Zuغ;ʯ X9kFYNj50%v,opD'V zXy Sr͍H'Ah5+0#GKÝ2nXy5.Cs38lNnj('b9S6iA15cz G!R]N`%K=՛DMS5 0*ΘAQ2;ܧgERN흇w=AC$ϑi ڤs  3<|=7?uxd쇿{ h%gz3"^iڒ5'9}.ҵzrIf "fůaӷi`UW(*Bn>=yA2JӰ>T-ju0pΗSfE, ̀U5Iv#, $ Om =&bF*{,&٨XŕȄ4IsM'hq;D 9-X0 5袋 {~I~iqEb%/(uA-fU S47~;˧atX6i$\q$DI-o߰hSseL^DY(/v`nQ%)Ox̯MFc.PL^DQY8,iIT r26lBI T99uQ7:E C2$}JI6UGzӈ{]֦! #O}^B+qFM ŀ )Re5dɽ٪,hmZ-5&<ÁH-JZrDE6" .A- 9-u]1S8VDEn&iH{4n4Nxq|VDb<#6kU Z3/f{Ou˖oRi^5MMY[[oVfr)Iʚdmd}]ZzBWN^[C+%|0ڣ  2w:x=bL]ŵC0Ws$鴀߮NkPGh7Z% NEM Ko,/v^{&\J#kr= cc `Ljm.߂k 1! g1r/#EsTסJc(^;5h-CI1rz+5oBK V!d-VMУ:UvUMSmUMNsM$LYE~֬:^R^Tʯg234@L9D>o<< >ާlI#mMa6]ՐIPtMv "7&t.qG:kcd~! WzIiI ?v CK(M*AKؑAjVS4/Ď? P+Kv$-帘[ko*w@ھi7}y:֡A'ނeXoil6geCWc\skhw8Rw)[fbԂ0+ 䆁06Ȇ˪ <}7UMI6 $^ڮW}?>doGdV㧟uYϳ.l\S N,uB,.{?O>7R ݦ8hʺ"D'ټvɊ;n/\3̬i6[200aF$ȈI*ewP);cҰMNik,A-vNjwА>-KoC&v}H_Uǫb5ԡ 'eo0`׸W?ϟ?MMjuٲf,_>'[yiq t'5 n|Lz|2y ݫcT(gLj#~+ѧ'wYfH- nbf;:u0m`reÏ6w3aFݒ튿8 <kOƞ<| ~1jQ4HőqGFtA kB4>{7 ΥԽݞ]د}`4Ok6Bh'Yg{OA-!;0r裡'Џ=|WGߺhlڕ;n+X_5k̥qy.a )%fF|Ÿzʛ#mk/j@K)AKr5,`z~?޸|M#/&j;)^ c]G! G õF(GTgB2(&J&QK߇_(?2Dsymf}h' B/Uœ¹Npͬc5M"秣!:B^ =QT> @X?󡧟=o~}[=^K*_7[?SLJ((!e6W(Uˮ g4`b2[3..*s ?=̊n;{1u#؋Ǔ##m$0j⇈i#2v ghSoK2ĬĶ|hL|Qq&OFEcIwGv-h(^*?w@.Rv8?}SO?}2ъ1vE? =wµK2rtݚoy}2 _96vC?uU׭gZ" mlJJʪT4O'39_ INoa D֐ãC/B;J=9c YGٟy} ;{|t$ˆaO WhAKs6P}Gvs."E>uᱏ~rOC|7;gyx:MdxsT bpE/Ȼ>\lfB*D=$@| wߣg9,Ma bxH߃Ww)X@6s# Q{.HIį N[95\þ?J/O8į&a_`|CC#/4g#/C<%^fϑ/(Dܰ{D^޽;|)Vnio:N<쓟a`%+,c}XQ.{/EĆ]"b `%n41H[w:(a9fhLLg0sΜ;wvqUTutJ9S)ʣ // !obݩΎ >ߍo`x1a`U ;SZCl3T~Q]FUcDBm4t(Z>꫷}wݚH?0`{?c'EDKJZ:lfT"Ю>rTx6ΝOWbDTtm%I{Voljh{8w\`r>g3Kf H#v ;HQ}3?%uQx߁>~_m 5Mg45`7kCG\˻zN5nz_h!{b4tL.P܊kjEBL6Pǣ G( N흴h >K{#PZB;?l{H ,^fO͔^OFd@Tsn"t;C-P3w7\ },5a.б3Vţw= uss\3v.R67<_!GP]Tp6o zr7ΘSs>4:d21L҂n*nlo^| yg[/u=/җ=f #f\4,R6wMw0rǒk-hnյL`&j8`F]=} xݻl¼F7&U6Q-=?\eu~2~yq{7^0f0?,}ݻw͛.]1u_^-u5[Ҁ-)ko)n?C S4 +]ܭwKID<3p{t䥹 ~yh y=SU!L {`hHԓFc[åC9rF2+P. }1[}t+_XIk/( >p-'L)QO  ݔK2=yk}5US`D#rC}k4@sS{,-gg. lٲS])؇խٞV`Q3YIW{0[POhmƺVd Z| Ac ǥZ;7{{[^ҧ|>ޭT;^G ,W(((,ŞN. 9ljj`j"iRo-Wilp` FUNT3w}C[XKo;6(,[Z͆[jȊ >ejR dcܯ~?Ğstܷox_r s>5b.ް=_msJpV0}%9mlN<݌Ѱ>uyvG6[*Иd|dE^ҮoWz)89QXnvhxx^Svv= c3:܉*7o8}L۷|[wjpkɧ eK#~# 2߿=:ӅѬg mb x]\ G@gzGߦ $}fI*L-~o97T8i(i$ׯwH3%BƺGGNsUSCK9pd7|h3쒝xge :9Szfjrec*s<[xV%DgG{̉~4dA~W ]dSwO{)=k}=.R|Ewڰ xdɸwa.qE;U#2u-%]GIW)QWžˀ+viGUs{[˯~NH]DGǴchNM8?ii%.q_\2zd ΪƟгTUm a 3;?V; e*h;nx٠cNOfF[7G }|?X 9l e=tD5%MJSQw K\OK.1E֔kj˯73b,bS\fnd9zh_}GšN(~`1'ue]e9 l=eGG3W~[7mU WAڮo7 sϭ[@+Rd] [wƏy *⵴53IKQ5F%wknd5lP@ξaX8dN %$@@0_ Ƭ~=gsΪrMՑӴZ\~WIMY qNg<`QɄ1'+\Kjw#%j4 -SCѸ{*o ?~ZSy՜dpc69N㔗W&^-u=WJe$: _]^R-\q[%xZeQV9v?(ܕ/{[OQaX{D)8]}Jtl5lm<qz?PN?PFyCOQwsR  }afjZRx 35'+{+IJѺGBL2V&ź{r#R˺ε+ŅEDuN+Js=Z۱_%= CE`eW,]ZĚ^B!Q2"%2RjQKZ/j :xs+e[T(7)q*: -V^!u]-+ )o])k^(+qjTiZj'Bhd˩*CU%ǣܗ:J#̩{Fza /@˻[\,-)];&F0̂sJ+e2){a!=-͗2*seE"%vZ(glV!64c3:j3˩[ Cc*+M;∹E]2ʘ] Z\U42dTT׃" IE qw^qsμ6fnO9m6sUb%)?J\ߠ`mQ`/] eu'jpty}핱ԙC u<$z{3v8{}bZx/ds5+ 9_̴#LbK Ñf P6ƥ 3=xʛ3*?b3k-/Fು3bgXpyGӋ'p"ثM ʺxˣ'Z@kKxF hI^ Ct[u&ki߷>/ugҬ,!k2KMvrhyf C|: CIG&kw7BR,;ZŠQ dh 9ފN*\3hr܆[;3aOK]+aхqۭtGM-ˆ|]/9rh̦u!cD".G q X;;2 6|m5d1cXZ`bք9uH*(0] $BV:5O>191R<Q Fdٶٜ؆lgF^] zY;i䘢x//W߇EAFSHpꆳ֜.bMg RU+ lXye\>!)b)sQƍSj:r˫tEs=R t=^|`ܹc=ukHԵw^n]2Bꛌu-'dX{GӮ 膲: D_m`h .4-S<)]/[:fs~x_v] ؃0av%>R|BA;__/\*ت%j2 d\mRidCn06O|=#_*ΖHimrV5 u+#8:(|!qj^^ Jzo;W>wx{n;l26#GZyЀu  Yuj }I)+T(\O?[۪+o@@a~WH`7C WS֨[ sA;TȺxa!u[~`꘻?\{{Y?Ôij~F)*.,M.`ՐC65ַ7elu<69D\+Y1G‡2+QئYzBnk^*±*"F]/MAāv쇿͘饮Rۈ!m޴Ev/1$Pm[. {n Y -J}P]@nGf1H4^^*gmPԌQ%nA\߻y+R=EöCNAx= jnl8os^گ %ڍh:Yk:QQM\,0 x9yc# ۟ӄxGF}"?$̵`bY c'j:,=J]XjJ׬Jj/5 LrrӞŚ?)=̶Nq(୩Gei`JD`-'GIEFNCSgNe[[~~%$%%#=%•J:5yibx=TIĨ[ϬlR7f#aq$wy^ {fRx"؜>&mPP+6C:@8OA}Ӳ4=JJ1N– CW-7_77۳xGV| Mu뒚?>zhx7pNd넸^^0ZD^fn/ by{%J<Լ4-9]L b׏ԸB꒴u ±}#Rt`C)UGLTp)pku%?E%*O̙̊沾@a9yY*'PWM]|2ފ+Vn"rS/=k^zXsQ֎>zV[{} 0y@D{ f]pB>]E-;#@j_c&k *R'd(|vJ|RB2Cܐ38!>_|2/>-C66U2bS>-]P3M@#*N=)Q/4’ *+|VR^֖:d8 qh`f:!c5.o&r]>| 烷]v!WCPs2˽589ʷTq@;aYdc`cvA|ZdJt{ZU횬ŧi2ng:hSБ!ukE*aG -륮%` }og^/u=,Oݝz|U-YpQ7HG+p'k)+t_ˀ-HP.L/K%Ls#^daB< Ar*\0MAa`)(Ij>TIV9IIsu4,Ixpww%oQҗKxo )!ӿngMݳd,:uDCf@{ OV /'QNSFU'i:jeh<Ҹzo>&mx(0+[띪b'+)FMNJհ4Lh˜a =Rp8XMSN20^Îs"\##~{{$릦&cVlN[,^%u?o V~?PE~eO+4r l=e;LKI7PS4CCSUTg\pQD4Ĵ"']ԳR4H``hdtD %C{r#7Q74 =Vʼnf`,]ÇmIf殜 W0g<QDa q^^Jc ؏;j;pǃ cwP9l9dj]24T53EEOVӓU4-;YCNP9o9$5dg~TE`>MdRLɐ{=d0bџ*"OCI# ecU~9XNݭceYRY< ֖ [E揉a1MK<^l:Rڌ[|<<-{6Xq<8W3S!KZVKd+8X;N*HT xfK9AKJV SBPx jwzth%dta5\H//C4fjd dh(G Z}#dq!oi1:P^2`H: X#ꉻ-Jj^\#eWʹ0VHk~%Rzu%JFmkIJd)&hrVl HOTӶȉj5mZ6)b(j=5N4#VM_Rʜ_9 > y#ggn+1ev#{371Ay mrFNYVʎ.DKYFQ_T]"ZX\,g.2=6Ȃ BF,C6%^&QQeX-wḮi:f -^ #$[Hܦ#cv–[弽2 6EN퇝Җ4uLuʷ?SeVL(:Alr+ZPLJg{CKi!RbRʘ]ʟ]"QfpKGF^GÁ/H( U W7@(gV)8PZYU j g 38rG#re#=ĒqI }%e,( mBՎx[艍ƺ:4=#FTCCCslk-Y# `|su.)q-^".fN-SY2"^t{F$0;\IVE[.-.CD[$X["Xʆe\4rVkMrN9bYK6(x˥°IBt鲱';v,;;{޽wޱcGnn]N:u9uΝRJVٳ'==… UYK/?)Xxyϡ\hAƇ3|K$EނRb(ab٥B(BK3J!bj=G‡wpSABa`}TӖE1735)-,RhoTLJN.X/UW)xQ '{M>f;SCv@l| :tհa(ԩS ǍW__O?8f?||u/HxkUeGF'^*Nڢ ZWJ쿴Hu+2?8`X1[,wyaxwij+JQbB1#Q*,`(d*.EY?X0HV(qNAE YĊ*b/aAe{|z8 gt*^U*ŋLֿ!C;6444***$$O>0jQFׯo߾T*޽{o]Ib/Hxͨ?lhc~$@wC.3k/21u\_2a}~˯*$Z_ WX+4% b"[ )M/f>0ƙ$^e>K`%L3G2TH)'JV)2Vx)}`-34ɨ0IKh aŞ3G~~Fwz>30?8o 3!h&@{w:0%66 :{{{HÃ`;H"32O|XglЈ }Z+*%ϝڞzͺȅCf;i1|/G/qY<ס>$0bݜg[l)(' WU( AQ1"F5rkk{ ~zzxXRU;Z}/MD=8x8TCV: 4`!u:õk@HuFWE? A׮7u8`ojjl3_꛷U2jOoUVPy)F =XH#`n ^h?,=|ϒ#W9f /=7z1o:mk3W}4a΅GE;}|8" ,^9 V 5޽{ꄢLPA bĉPAm+Ν [hMܿ߄Ie=3v!}d6♮ tȉ'-z$wx@ϝhnjj@< -i2|{݃7xUÐhAD&,8=d=d[Al$6~ u `@ؠH9Y ѦV=7ruuu999PAT*_` d!PA""".]w59o7i fuyO{uu1zB dj 0+, _V΃ۺ h׷  , >-qd1,l:Sq^/O[N^hB󡨨ʴ;w@ N >~7|m۶Yf{W\ ]zGLe_tӞSQOBW_tp zwܙ4@x⸸8f_~%NrΥ#Xa\VylXz+ yB]7~7}5mG™=4!1_.b&eyENM|G%WlQ 64CsHLBɼ.&;sb:K[Sy~nfXk@ b~oOf3`/Y7I3ٲ:ڧ6PRMb7%ԙ7D0cڞZ“9> .b9X]0`9#*Lb=^O즄giOӋa& yrԦ~ IX󺰢L['0tKև9uM ue"׆y.9d6_:b|._ͥiwvIzNTHHQ=mxZZm?-sFyن/z/+> stream xXˎ\7߯Uуz=2@jM~CQrDRdwv9sSK,w_nNM&Ǯ2 )o`\/[l?9y}x7|n;ʺ 肟e)?pO.]N%<|9UZU|hY.Ѥ}P>?y99߲A %0G>ţwSybRp+&d*=ĺZˉ_NAؑ WQ|I\-Xj+Q`ْ s\xi1>#o !q$| -)Q}'P(Jɓ/K}q)ILe?_C?4*D,DPk}&LE_Έ;{, 3u1ISl+A&Vt [S;B4xRm=d O&ZW}:`r:;NvXU}5 :'~L Z0׍ lї>db,yX*"=S}g|/ͯ*٢;1d ڧ^7޻*bOGhм``LTy0Qҋ+& P R*&f'l2j8ȎnZ쮅hKV-ܵMbNЊVȴ6m/x`jb#xZ=-ZV$[JiʎYLk,?ٖB endstream endobj 22 0 obj 2105 endobj 24 0 obj <> stream xM@D{CBIv] VXZMsX!\ǤIKcI FFIK4it@3LiD@3L4it@-L4it@-L4it@-Li@3PKԒjͤ@-PKԒj{1&jI5ZR T%jI5N[z?I5ZR xxT%:-QlZ{ij Nj)vZHٙjj `V:iR `7:Mv5tZ|I5.4pk;M\eF5E`8cM5VvZi} 6=%@tݥ(NĤCU+L Ohc*g endstream endobj 25 0 obj 853 endobj 26 0 obj <> stream x!NQaAPa0Ea (APEAe" ("n˷X3˾ Ft8sc-QX6@o 7ѽ1`7Ȱ d|sh d2oN|@7[@@o 8$7H0dƁS(@q 8aƁw(,@!;(<@! ("@! PBr (&@! P`r=B<(1@!O y P>@!<(9@!/ y P+B^:GƁ@B ƁqdH0$s`o=08`ctp Ɖ@o901N|&qLkcr7ց h94ueo"k}X~s৑o+c۬|eK\mfo]D endstream endobj 27 0 obj 582 endobj 23 0 obj <> stream xͪ,u){ЯS!@S!D 4=7H {.n(Gy*h۸ .\[RQG*<;{Ⱥ'22223ro]34?oTMN\H/۴A/_~gFo߿ } ^/\|nF 04 oޏ .XMLx~~~}mJp,F0ݬ_MP~-6sIb9E7m3v$80Rvy#w++tQ2R8:82Mz?uɔT?w,8(_J?=KKqdD#Gh9zqjTv2*8F#ՍBv>0!v7{X p8UY['c MB])6 RRbrMvhRpߙ[.ԵyCBv:--r kKH_wT.U:phRhC!#s=T _ԴџNdO yDNv"CI&EF @`DYnj-&dSBv>>W'_ k G ~8؎˴S̶s>4Y)ɝLكKvi>؀&';Z th7E<73E;R&Oc)4K˪ogaG6⾿c.9P#/݊b_J0>]ڵSR< -# wRQҩ?CI`nP/UHåۼB=MF2פ6z̟}sYʥ+ҋL|hy/b VYSvf[r7^,ӛQ 0 {h8/4Wp!ie~Q `u,kgVyW!.&W Kh4fľQR/H`, 8 C&20IB#͜LS _\fK:B[Md.) @D"X)ؿd &r lT-ʤBwk,l8 +MқVXnnt4=H^3?ϟۻ/BLy&]'XRM+ᆓCKek"OChiw<7Ӡ*LF;UYӲx~~$!Jh;)QYQi63K%WA)ުT)xf}q")/7M#/IƯvv1}̑E]K~cmk6SdGM+$TQI)%H)xKtp&!AEt;g)ʶ,:y ZFG&(l; g\ l  "o}C1Wˢᐋ)xirkcngK~uH峜)0S*VIhd̓49^ SS P:\%;C+ƹpe^6-n#)To`Dđ]A#taeƬmT+a󏷈_wY(Z{Fg(\LsZ+*67xAiڌ6X0ۣ@@%=:in7b-R ZeIWVVf7=!Y-3?(?{@F{#ϙH|xJ^Kڠ\dt 5WqV594ڡdMipґQ08,3U4'0(|j=KJ!,TEX%.lrX ̲t>Buvo oBoԽ("Di-+T84ɘY/SZ1,E# b I6/AۼC^ܖuiu[RF4L5" n:("DsWiJ[@?0 hk`q'T7/>%6lE(Qe#BDvi@FPRxuđEտ7ͻ`! 8I;o\> Fʴ C_|XM*V>P@—DB@X /IX)D (.r#?_?p#M$ &WiHڟ# hsrH`/=ڍ EbDz'X:%$Z KdeXbs㗖htANȄ_4ށEtWox5RU7k ۻ/mH("FJ ` VZvWohKi ߤ)YVJ"u=~Ǚ [ȯ\r $\dk Vvr///A)P!ruIC %O*k>&@_ q (YR?Ynsqd~20ߡyc tC;.g ]&q54KxA%DiPg|{' qO W{]W"wߥRHKɆTƽ?"JAYܤMO `Dq$Ft;MKdPrI2{pʃK!RD(>h=?r[.ҺD2 zK)s: ReN#}tm[h;o8y`+_*eL!LS3JwQ`VCp]LL"ɑHQWΒ=:2N XFFv5$}>{ /ezߘZu{Ja2Rt(׆S¢JJM4:kH% ,M•AJYJsq{ i#E4U<#'9\(Ʀ?*m3U8傅hE,xdT*eQ8߿yGU~?5;C= IyG j`!8wǩ7۰P ;"]+.j<+}}YSi͂]-"(6 !Ri҄YԦ%oJa/Ձ1`D=̿o߾5>==G0O{ٔAu@-d9Tz.F`!*Uj22]@)숶3\zH<z<<[ #+E )G^^^2G=*Ѯ܆/.A&aQ:OՁ1 '`el|W}<~QQ֦/P??Ev̟zZ:O秼6"Z'"вߨs4(hg~p:퍅3|n^SpTZw - j[uvKaҢ#̟ 'D_6*ܰˀZs':0=68I[qi\- Vڴ& XZ=gHݩŹ2ḾTY\I~WϾTۅvSx`AN#j2o?X\ɖQ);*R,uRR`W>UL:(:L@ő2G0k)ȝpy *ԤoHZ"/#5AF;b)LUZnIE\$e#NEui?DT,aN., Hta9䎗R`p ڄ@}S;f0knTK,prS9dz$Oo121-=D:i H;wWn6miާk?z}2NmE,I* iTȧ˗`TPo9hX4.Jiҷ d ǚmb)BYl9}_J9Z[:DJ p"`v#_ :EnS$@ZBo qrߧ[cl6 me3P+;g JQ R0PO Q<6F oVċ&Χ5k|UjK~>Qg/"-:0K ֋ ۬R h%ϓ;FS܁{clP{5Uiy9!uEmqHH;5=Efo~?^,p+ij8dpXMw$_yzky&)#2I:qңNҡy4m]9"Bo %E%+8`h8쒑)?B%TF+I9 ڜrU:@I>2O(M4[,˹ A8c 4$1B~朳_1B{G_d)n$=Ts&!s1,! #y% 9,R2j=j ./DŠ':oD6Vhn;ĝ CaY I6ssFWq=?G&pL*C?')~L5{#[΂ (vξ#[]hz'e{f,)ޑfBSh3Ջ;C F5"TtPg250XTryeIHa5~Yԣ^`V2_|QX r5nFQ#cV]g_OV#=P-%F Kw:*Pa=ݙSw8L@hJ1j E$8i`_rG)<> -\`4فt^h_΄0l%\[0zC@/ר%9Iڪu \6PTR+v(AڙlKؘ廓 ER#9"gWEGʝn4E#tl+w]"`˂;f:W= g穲L}5٢f:yV ]lV \dmRy4u9z5l|v1]z TEX v`T)(=P$EKu+)`&K4p7GD%n TYulseˑ!` .Ioa|H)ʙIW+X|$2P iGO M=ensXݢw~V} 9l(LM>;?Xfyy4#cddKv}˓YR蓎 5p;)*\DSzz[ j~Z$q",Q͆P[`LӢy3JU@SnUER81 TW.:[# VL>Ќ*HH6q’,R=*`TB岼Vw@bBSWimMjQR RX YQ VP'l ţz I!URupGIBTڍi1p8Km膤c8%xaf)y)VK̙PDji{!7BICaR}sRt@oTjN3 ?m)E0n=O+sRov~_4REiKpЅS[EogQ.uW+:Ȋ;`p1.rTή?iz+H%KG$-CҰ[a37O䆺D,_TqȣKsPmUB A)\KVA&U*B:{ku4OOO#5@o||һ/n<> [ƱI@)5..y3Q?4.[Z94T ]-7Kzan,nhz>NRD KƂ0 c4_3":?ήYt@etG~$-4“4ȓ-qR჊R@T#>Lze[*u#9>iRd֋j b&hqc&|d9E#n ]3dѿFu@DE <&wj$4!zT/?T0Ja'ۄFn$-lq1 "SuX=Fy^8DbAʐ|'=ܫRU9܉b1*@cGW>)jDG`rZW +6W@3'[n.5ٚfL.*ݥ41zЉDGVcCo͔ dvw $PB|Q3)l_H.J.N0 @n:#)'Rɧs}t|4g/d'/@-L~FI %\28 TQ `o "'uF%@zGa)yy,dƤW U3wolU1PDT฀I'U1ߜLi9HRO,Sm?:ϓg<+,2r1ɑ $$zf7:J~M&쨠: fc1w4K}Vrؚ ~C9v8xF2@qD`dc3r7H l2P~O^6A ʌsMprQi`(Q\ 6lϚ n&=B5j -Xozֹ:EmC?*`魄mLM#*PYG?Wf~tcr>@bˡi=Un~iâ3EutRRMJBMRuiaQ\~#ګ>Ȑ5.~Ќ2=D (f(i ڙ_B jMޑK+jZ"J.GKp2xE*Ulak"hyܤ"mRyJQpyI@W κB4yEש .*^@ ZJX%IrL+YcޘK%䐠. C?͋rNf%lc7*$E^_ t?6&(3 Wkt@9OPA 5͋STHQ?9{:Xު 8ek}C 3이?6?$[G[6@C9Mdi*etSPڙVIaI#!D4y\Yi#$'?5P.U II,yl8*OmE%*r1Mm:g(I`Yd E*V_̍26G0!@5cˋ6I+U'9|ڛe@@_n"Z\ai*Lfe)aj4g>PD ,Ŭwa4i"}Vbו΅Ȣ:|A?Amoҧy,}'-8?SRāݧ5kJ% A)X!TFǷD 2c#@#h8Ь!X7R2PԠ`P߾2Flך2h~ w#1BZ)ܱPOQV32z> vXHMN*  KOvӶBzP5n7qEYd}B&D]5|>m9u漵ӜEOZ,HfVT -&īL2>b\s8P":caQ.8d L 6:7L 4jٛnV1Id;ȶ%iTkZt`~7,p6I(E4$3$k"iDI8ᷣZ>Y@49mRg8J7T[.syV?~F? A 7eU Ĩ4V{uuh4yNPT>r,.0? m(pmM(v 9l yer6h麒gHE2 {h\{i7h>JS:֩4_b$H9L{;Aܧ|h2#;wnMaT3KFT,Ӭ^:%ˆ0_B@F#G|OG$hKTmCpz3F9Lpl_lyD:+Tud0\ I?Pr-H4adZ:Nr*Qf+,ZT,MVקYND3f&kxύ\?`Xu'roͅɴ@8F+yfcȇl^N&[M.*=X3L-ynA@)FCt$4 E#)yg\y(PCׅz@F)Aޞk$]F GF.34۷oӢV8єr8KI'|!,z<ݧb\ӓ;GFyf .v:[`3F,:ء^ FJ$!cU NėD['L'i#5Z:(v§Z[w$* dZLw>oZg-2a"&q2@! }YC 5sf#;fp&TNE)3Q)wew}Q%Z,WS2LEv*+pVYFhs GWHk*,1x,YvP2lUT\ o!T&kY^#s\j7reX?%[tSɜm1BN+˲i6Apz2g>!}AT^'D 2<.a5KEg.RH1HsVO$ l@FgtJH0P .R^ї}/k9'۶[1HF,w:*j@7Ml-T[B)XpPoyh>["|3F(_7UYz.AM8d 5=/RҼ}. E%9sPrRv-*ˇ ӧbS>Vhv I,OvMBEɬVhUɳW5HrCEGuN6Lb\vDlۢf+M^4|@#0Bgݗh+#;C ^ \2^^#&֊R$tDɫsMAy 4xDVpѴ~[˰0/ Q[&rűjgˣ0Df<۳H&_ E%A6{Ou2-MHJas/37KlN [N\ ]/ɥlH{aї&CmՒ(JkE(5 %Aeŕ3z*4\"siud[;>`k@^d[stng%/ѫXPzi`ْdc\ &>`F.KNvZ[<+@N13ڢbZ|7@} EOgS2(s<<5_*:8猂EWRG϶wY4ͬTwh@_v\tY! l g!"L.ZZUE_]8x…l)r f `$>5b0̍֩D;%vyJ) ःChR J#PӼwdh&J>"AT\ⶑ:h6 0#%/:%r6d]F\fÅiKe>)#o)h҃S.XmA=xD<; +[d&3$3~_0GQ޻y> sl0q(v{Y5sMId{HdiM?-350ZC$JE" *\7=՟={H˿s 8뷹>Zn>TIQDp\_$JA~Sl4ޚW L`*@~ȷ5NNJai'ͪANħA/qP:ԃխS<(J5j媕eO_0(}cְX;@)ԢJomQcl#'&tJ)Z#0RWVhB~8Es%24D&R^ii, &6R#̫nZH2 EYQȾA:e+7O@^Jh`3+0vfQ;5 f`[|3FJMf 4 ԥD~ d#Vr%х!8ER\&n>wOR.#`'#cI ֠ R2@P7 ˹JEjw! 㢺V(~8"EQ`hS_tJ\Fj;#DM,}ؔ΍\= A9CRu raZ۟D9oKxZ[?긊(SikAinʦuFpJ{9`H4oD||THF J矰,ih5QhfgV~`b hF7 v̝ۖ(Lu"5djE`zx70CnȖQ:.PUhYl'3uk9T{ 2lw'bUQ7:̳-^4FI{f/` [FQ挖iAڄ?EaiB% oRvZ6F ّG)<7ef#grӿ/9*jhiბ tZuǑr7,jo·ߜ呥j2aځfv1jZwk+$]Z%FF9eu-U#CF~m-*:]ƜC@؇Hz [(ONrS;/8݂}>U_/ ~8!ܰ3 X# AèAI;n̞׏&g2{;_" J>8:SվuS ,V.c!l63j.x^26DPS@3/znSIf_/R+vhrq U SZB`epZ\$^6!oU*kٚGwQ+DHo<nM`[t|GN_V>rFOgj1. |;FdoD u"A7DmBXAN J:v'-2f{ =o~kr{Hs$:ԕziF"Bj(,D MKWF)Ѽ^Uę+Rbw&Ս(gh`J=vXT~n|Sv <5: Ue MABm+up=M95WJȎQprr+5}^Z'#.a P\Pͬne'IceLۉt=}}0١4Z{.[hK6&s@Vm>/E3Tr5W )M4PҘQ\ ]Pv/TƇmn{`wpIL" 3Rr_WF9׏sz4u=FU1ბ"52-6R_"}a Ad/[nj;½A7ED2TغHs71+dE뫃s>"rmD$poP8|!\aA4an.OB_J!`Js@`3! gIHY,\SeJ:EBW_Hz; (@`Kd@x,%x=ٕ!S)޹^(9E[ >JFN)fHwC] (_W{&CTܢRj hYj@PSDwJDqburiV$|p/s3Ɏ>ϐq: 4!a& ^]R)h$L|MqV;1eҟgj&#H_r8ǿudU$|& gH08gn"GvD#Euݓ.!#jZ]\j4@,{P_!?~s6S3AVv|0X-ْ/s36[=sM] `I̕ 1$6WT.VNRO7"=HU:Ti&$Sȶ6لE RSEJFuAF FrhR6(H_" ҉sKˍ }ksD4y5u O`HU(k_Mw;T腠ѴiCZ =EJ0%lt"A!Am\S>NWBB]#P\8/j&s8%I=EuRkSLR܁A$Ȩ&RC`' "^3lGԌN/勯)FL,NkV$F+4NوH}Ή7ݴWwh^%:T(Cv4ڄEۛ";.yKR5+5nuU @| : ъ7iiN!kd6QYC>3]dRQ?Ƞk9Uu0? ʭ}uR_5O7Ҹs%Q >XLJ\׿HO@^}GZX{UbJ/P2gxnb/ CߒRȆ:8u&y\實;,yeuySE'.о#M'4X+MLUp%E wx)7I&!b>W%BtzY:8ZJakhJIɩ:O u 9ԊzDͱ̶KGY/\%"gQlMKV&/@̪~GoPNo`/ˆzQ T zAFHu@(;'Oo/!,bIZ\Dhv&~3/jh+ PG(^V V:P uv=uH&5uIԃnJS+H!d)}}| hosM8RBd!dIzLazQ=^n9`tgI;([uA)i7,gE TVn*loB)~l#KzAMa%Lq!gޕy/dwtcAЕbWJ_4gWxZ^&#{[ۢ^^$+ 8%idn sil%-bI%کM>)|0hA#K_Dc_.-OH^}F()a %W'y=Zi>MAI^6fuߢ ZqvӐ.! U,F=7U)H07h+RMʭM>_,N<g?~t2 sn^LY`m €^ 1,TS<^P˶ ]{*|0O~Q-W"x`nQul2TH ]eRs `S ҠpKJ,YF|fQ:8ZFhVQG@ѯc|3[zFbXs&,n*aoyYQQSIѮ^_>R _*}2O;gZ0g F*Q^o&X jIThm*?m4_D@V"7?Il> * ҾߧQ͎lsЁIrcAw k}RvF$_(?.ٲL4%iU`WhWXG.BdF!8`̄Bv+t؜6'Q#R`\SܾE1^DsK:%&`tLh0%NW# Išs3K [PVR1Zi&HQZQT*Z'#S&?;h~n2bU؋PU+ܮ(')AX%wMVMeӵ"=M\ t$?bh[ +01P7iE5?Mb U{ &hr6P;rAєC"h˚ M׬)6ˆa!j)^ؐRSndU`zv`]|][6a՛ .v3dT PvA 녫KJH]9%iCRMV'(iJ=lXhcV/RQOG` R/X\ 4nc_&w >8Ja(ͥHyk,} J&û~G5D фNXu'^!r".m&wblV؊̟\KYSB.a5c&ln4'8uFM{'-ml/+i5?L7tQUkR _tloB ~6;{)(0Y$cKy,k>7V\WflW`fd2w`qE|  ss녫KO^/d>-2g k)QyJ`]WE6`4Qzj۾-dADD nx>(`Ozo8]/48:4бD0[-F@zaw@#T B/HmRǑ3(VF?m?Ĉ`_d'{ˋ$ PiFS}+!( rci[I;&k2P[ cPH#޸fmšƩ 6>x䍿S7"y$Gz^JYM)6}_/ CYksqmR+EUBdPۅ) 5 N*&B bF QۓARJ[Um ;s_Ç%r ?4Bф^j54D'?ylԄ#L# $u@anu{aTUV~rK-7 ]R6J==+4bz_iu"apd|+|yya-`'>,wq q[*:[XXB//u+-)v4_ip^*ylYJ9:'2-ޟ0h2N$Za) }ߴl,;~7V 7d۷oYD6BƜ@ KդiNSEO#A! A@w0'p" o`4ao;o)+NF_pd9JCdҍ6I&ph:@X°RSiG^9_X#KA$1F. {v>*G3e嶰=;iQ8 KKRkSb-"WyiTJo:PCLv ->M^fL`Fl7-']ʭMwXv_ZT_\vU 3|_MA/}\ #87^˛#3mP }nD+ _KTl{[Pq 4a14LU 3vh'FAd+ڲAg?Ve3X////{m7J] 7;RFĐYv6:. ?>m!>U44_D赆$" Ffke;yt/}FhSo5Ww7˓E)[C:~QL\1W)UNS@S'^nD b_n{렒kJef7^d jZ$ k5Pim$>0)hx   FxKHwƅ عd4+t:NwU j-68 _T\~Bzg*_n.H7^=n ##z^6R :|?2O NFX욭6^9 z C|EJ`n҂uo^]}}T 4_)L6ڞj, :%oT FVףM~LDݿY`P*l,xUB-^fO#1:1{kvD!1rYѩbc[:#h@jkRdJl#ȮS t:0s|^K6B8?D跕^F`ؿ՞kjm˻wqo|P "mMwV۸z0D]0%zz{xfP6vS@yJ )Nf =]װ!C$Խ姪,xsᨴA:A)̋/N)lZ1>LWP/Le<P,rn O{!5T,s?AjJ]PHn EK!EHF9όFVB?a#_S/`5(_>2 D|2SaA|Qc;-TIFi VH,Y-bJ6=Z|+< Œ2;8@Q8{@D$> :p kʦ:b3緌ěE-=%KgW)FE/X<5}d19QZ ]7(wBgO^*LNS]UhgL@ZB)ePƤ>{o_=*._}8f#pE%dzڗMn8ںX%_m;*Te[,Pt Gg"eƋ߽tG"V_ir$9G"[Щ؜R)Nm4\)&<\ilq}*_&P͍_:Gp"=Jr%/ƈ_>N\FEoф_}}DAEo2v!d oY \E"Y4SX|ց-Lfڰ?-N$"}"Yk%M|ډF/48U.DQmsI0($6Ȍh(.9){` ;WfEI'ҍ5,Q頺¤b3_Tlp;Q !oD}##dZf1kaU2+`8n5Fh_Q6F)pi .]){ssjф0g$2 5D.yzM)V=MP®d)߽9w/ލBBE)pzR9NJ/:R&Nw VaMu4)C wڒFy`YVuo *Tm[fQv49B}޳R_gvS>N4DGX0XolKx"qܿbhPr^t &q{"ݮJMK> (m}n=&&] {i6@3Ԣ#/Q7VT01mR c$I|ꮗ L)tZpV.#(w7acI/D1 ~c4f47cS[o Dvn0b0Ƹ$Y)d͍M¤1=oF68<0۟5A5b?uh^3h>D=xkl2aAWr!ш (8G~KA@[e2TQ  >%V !^d#eQvMVDSwAeXQ4SQF/$@jB)0. xLϤH)$XΖ[J{[QEVp71qR,ٗza|$92aur~0ipZ6JAxJ}j/}| 1hvf ljßg7(u®m7\87/|\a+K !BY (5} i tƧ.OՋw3zA$+'JJ/k,JմlXV𗒿2 +hl=;%."d,*7@)RS'[KIzb(W)68Ms9 !6@⽢D!hDAK-kϞ#{ʴŕ F~w{*)TK/1t牦S}d%_>#ms V֋siQ ߻zqdy4BFH2 NVJ~ҷ??8_鼲Rxή0!]e(Bj &T~׃9$ mR*%oiuu \_?#~ a^^^dyjaiFFx)OonFęQչ l!=7ڟK0C&+il%a7+_=!,5wJzzhgs?7 +p#ީx"7鄪?ۆbR)O+%&R%1?yV FA Do۷fT T q&%Jky4WBY *>rHYD){_R˯L<4CLAm?ϳf\5O#ETc6n[G WqΕ18![[.}YTzR=.&a׷fQ 4_ NT_fd䙏ǐ]5M)N ~KbU==u ̆N @*yK7ƪWn _Ç[Dwz^X٘bA_efwtKu>B D}`4|R փtfTW-<#?OQ`e4e.8S$Q0Rّ:οՁf0 R),*Xy2Cչ?•tYG ęa h\kNxVtPJD=D)(IJw"dDSAb؟I[:gĻtw%]bQ#Xؒڇt7+Fdg-sS-]o< G&E 禦"e1>|f1,d,Ɓ8lk$3"bi@!1ĺnoz΢_v6Kg:Yzz ֢#`/س+AD߿v么;a+GlJ tF Ӿ4F&&T{w1"nN5\w\K anwZui SvA`BQ) kDblM||ΪQOvXOͽzX7Ioߑ !Ks[`5Ab6G+^;Jl*ݠX8Pާ~3 ҡCA_1QJ8٩Ŷx5?_jZN_%I%`}BG3DNamT)>0U$j/ 첼37X!U -<]cj:"ͲM"j@)XyBd@!ta}zjlyr :{oA_l~c( gD2?M"c#vYpKֵSX!S)j;]818JG%i>ܼ+Y[0u)xۘ!X`ER h:'ul%P < nڦYVMKjB'u] ("Ѩpn 7Tҝ`nBӺQ |w@)2x 5ЄqlྀRplc>w (@ cVH> IU7}t?@)r4lw  GC3oj (@h,ྀRHs@ v|,ܿ@#E6 ܱ$@)P ,z,e,8qr=fP vml ;}[/D4P DӶ2FNBow9 .j΂8=P < "z.=Gn'V-P 2D#sKkYtn]{@)FCsu\jT&xdX\rN$U{4}aPk"IJRJ!Da"r|)w]}^X#rdHFfJzD2S)uw/i/Q5,B )$6Dr3D 8Z.w3iˈ1x pԉtgSRbԁ,}u)zB өΟT# Ζ/__sc@ J)C>=|B'$Dۮ/uxT>3*Ƿp&jGV>D)֓# U<` )iPv_R8c4B>d 6R2mW<03"5ʿ{oǼA ) [7r 5ה^ˠ7 >T4R^S꒑:.oKQCjuMP֠iJ~ϣVP4c'Q[ Aٛ}OA/qgXQ,@܁9+i~}l.#5€{Y!ǿ|Gߟ3 G;pd.uֵW/=}Et)#¿GGL߶zDp'cύKR~$; Yhd8*z!2pd,3NMU8cDfY,J;ޱ2va(kJnτDly/#n +l7B^byeP8ۻ+^'|\†Xq"(Ozfi[~U3Vb G%[6=Nb :č3jqJpM*׬IhS3'mC*zaX#G鹱5AR Go9 损?#A֕lzR)}l>짺i;9(k?%JLbZFYNT.p(9ϒf[;R) JA$|*T#Q bYqq)I|'u@!;Od)xr9_C,MNۡ|dv߽r'2JdXn:J:Deﺏ/H4)6͠RҸFM3Ч{f:_>6 C~9ţɻN' J!xɧ$@oKlYti%bfWxp ?@zGZ bdԲ]IzumxJ!T1OGm0JvFBJR1H$68"|;FKJͮJR77I:B٘j;z-*7 _̖* )ùT!6f9=RU ,/Q 'jVەYVb*..qhb>P¾j؛yMUV,; ڡ ,*Y1CPt:8 }@Ҙ}&RTm?skK) :#ђrLC&>7&(s&^hӗ{ #==b@Ge,Bf([$yd#Y4F1yf)0Vʏ:~!B?K|kue;BT o͇.}4;B/<\hcCV桕=H惢ڄٲfMxX wWZ\tËm_/֤=v&cߥft"weA|P&z] 䘝P=HxY23&,0EPIE2Y [r$=OgV˖+Fo@ /NNas@dxצw Ymy~~Ú$ C%*ID(UĹCRЌ5-2} \ǛxԎ1ҦK8~/,)}w1Ǘ3{P0pZP~o.F_}w~8K H=цEVuݍ u]rB}1BZ׽Ϣ-2h4Ix۝<\ G"fp G>Fy Qxn|(r%}ƈysbF-#c;$lb=5agyG:,# lw8I`nx]5Rva 7}!np[zR(Ǡ!9^S//jC+?J9 C endstream endobj 28 0 obj 32419 endobj 30 0 obj <> stream xVKk1sai%"[CMKi ͥ>{c,fF|Pwo m=1Sڐ_?{rnD)Wk{EN4Թ|Pf}/jyW?y|hsV> stream xWKo#7 ϯy{%R` 'Nѽ5CГb^/i&~mr+ i>~$_}yktzt&~Ϸe`"ѩL@,qXI?\GavD?`^WGVY @ b7ȏ8Ƨ 6>OFsѺФ?;}uf%HlX1iU6!L$´J<,pfAVE!34,aou+{W[VN+`vXCQȸ<$#wkl' YYl AgЗsDWyx/Q,H|6#(| #}gøtHWSLbH2|{= ~]NI}'?_#;ȕP B6\;4"mt$ M>:Gne2y;4V9vŎ/ ̼51b)mxbgŸ-F)9_T!Ekd'5T$QE*6( }a$de%E:sPd:,HŘKGʑZLҲ%c1S: ;ˊYRXk:kM_*ܶX f$aO$tjZ*NNaTo%eJ 7V8-]B!DwtiŽ>ENŊ=ljUu A1".A;,ɘ4 UXed,U92"Lc16na8"c 4vKXvABvsYm$gM`L-Kv ə×RO]d`x]Zm4,3^[Мerg l?U|;^'\:}[7ckul]o^mlՏyPG4b;&=&O{> stream x:E4_t'M +,c(I$I$א$Ilf I$)Q _fI~?Z$I:_:$IڳgC$iN@$I?x IW?TH`#7*IߋoK&"=oE&o?݊o9o3Uo-6o'6ًo!6ox,ŷ Hou( L.8\Ken*~g` ][H};@eЇSГ;П)0 = fa5elU|`=;_dXŗֶj,V|=`7k_Fv6of,hD %^\|qz_VWHK|CEj@Q(3JeF (%2Pfʌ@Q(3JeF 4&Pfj@i1Je (&Pfj@i1J5 4Ԙ&Pcj@i1M5 4%2PcjL@i@i1M5 4<_0g+bjL@i0M5 4Ԙ&_ПiyU6/WtE,~@7Nj_*Gů tP(~@ d_9e N~ |wUtmqG?  p1&p,p2p^@M|Iu>ҭG,,{/JK|7Qf,hŗv6{=Q|`7_OֶvUP|`=_jXƞŗfyY^,Mt>i[\@.)~`$][h@ .T[eP|Gԭ_s?,ŷ > stream xܿǶhh/       !;D4D4D}ݷ}^sqqϏ/~=sYoSoo_`Tm%Пj~phUz I zOK$8Bzg}K=RzOcJUEz7sIm4 }AGz[a 3VaTb+b cf{離oe_;HkfVӣQä ;[=$+}-}=VX9DTpM@RM{afaxZa"cg0s>goC[ 4*=^ȌVJOe"O WJOfO 7JOg`'4'4'5'ձOQ[HSҋB#ABzw L+f? 7ؠ'6ؔǀ؈gҫKhUzA駇~tAz0VzI?4&^ү Kw/O cH/y[ׄ缕;pңG}U`x_/b0ү1 鵯~)Kz_ ^/sJ/!^e`nԥ_HW~A}hD_8. WΥ Цl> 4J]jt9: z @.5TЅOF ]jvgP! @0ۅ8F{9`DTP @ma<06a*2|0TP. _" @0T\×9 P! @00|0%e*(a 2%a*(=W(PBҫ0| %eJT(PzPB2e)eJT(PzVo< @I0˷)PR @% R @i9eJ4e ]ǔ()PZ8WpJ2%eJ}" 9eJ4^aK4e 4Nð" E" 0,?( @e(T°,?V-4a 0ׇaY~R&u9 Sz* z: S`.k 0ua0HLd}g 2$ 6 4ò-ama]=aX_#/ C7 ? ٤ VavaƖaö]x+wۇAwtAkuA_{_ٹ : 9& =9 ~.H0h/mƅoF庠 ЪlZ WNFkX5/+P~[{ $үsJ/iWN`.ů _'Z0o~2^zJ ,=AzH?! '=ꭤҏ cH/yn KwWDž>{Coқ=ʟs=XFږ^hPUmƽ I-I)mH/AOi 6/0<] ^\Gҟ Z cKOcO;IOkOKOj O IOi@'43'+'3S[дBP:И 8xKwI? ҇Dε'H6wKI_4JH1IJ.'>V>9ږOG{7I;ҷHwHŬҧGWʑFw'˾E7@WĨҗͭҗgz[a>yЀ%}%݌)UaK=-iY6$)Um.Нh~Wڗ~"sq endstream endobj 40 0 obj 1936 endobj 36 0 obj <> stream xQ1DCpNd8mQ.jFROu_:u.Zi`ſ vQojXj4f: Nh&4r: Hh&4f: N%4f: N%4f: N%I5Z: Th&j4ZR T%jI5ZR T_]R T%jI5ZR Tt,~ 7@-PpYR Ttwjj ֟_`C/~*Vxbv,ŏX?`IoYyX? `-4yYc&2~'.|Z @ſG?20.*g endstream endobj 41 0 obj 831 endobj 42 0 obj <> stream x!NQaAPa0Ea (APEAe" ("n˷X3˾ Ft8sc-QX6@o 7ѽ1`7Ȱ d|sh d2oN|@7[@@o 8$7H0dƁS(@q 8aƁw(,@!;(<@! ("@! PBr (&@! P`r=B<(1@!O y P>@!<(9@!/ y P+B^:GƁ@B ƁqdH0$s`o=08`ctp Ɖ@o901N|&qLkcr7ց h94ueo"k}X~s৑o+c۬|eK\mfo]D endstream endobj 43 0 obj 582 endobj 35 0 obj <> stream xM@DCBIv] VXZMsX!\ǤIKcI FFIK4it@3LiD@3L4it@-L4it@-L4it@-Li@3PKԒjͤ@-PKԒj{1&jI5ZR T%jI5N[z?I5ZR xxT%:-QlZ{ij Nj)vZHٙjj `V:iR `7:Mv5tZ|I5.4pk;M\eF5E`8cM5VvZi} 6=%@tݥ(NĤCU+L OXQ endstream endobj 44 0 obj 853 endobj 45 0 obj <> stream x!NQaAPa0Ea (APEAe" ("n˷X3˾ Ft8sc-QX6@o 7ѽ1`7Ȱ d|sh d2oN|@7[@@o 8$7H0dƁS(@q 8aƁw(,@!;(<@! ("@! PBr (&@! P`r=B<(1@!O y P>@!<(9@!/ y P+B^:GƁ@B ƁqdH0$s`o=08`ctp Ɖ@o901N|&qLkcr7ց h94ueo"k}X~s৑o+c۬|eK\mfo]D endstream endobj 46 0 obj 582 endobj 48 0 obj <> stream xXɎ6W@HRi01h0;6RRh(/ѽu;)0 po?t=~r8yBL;n?N߾8|bv?=`k#cz:XxA]K?w7ݥϿ?1`$Bf׫7z73܆(4跇;⷇+p!䘵 jʈyE&;phܝ]py-[! tٺ}{.F$^@.e|] E~꽧tܮd!cV ?@ÀSi?Ą Х౎Q`iId&:{M ù\9%٠c*74"Ox׊1Zg.m$Q >ZXiJmLx&@Ɯh-莳AYd+b[Wa5zŅ7hB]' R߯g ҩd/};54}R*1ٗ'N J(H=;h|+N'Ek  nyp<戀0&Mo5%I{u"M 6P(\P_kl9jQ[H fz\vc;}L[5J-v3=YzV-F챝>cZR;-=vNF).jT)|D+հ sZ}v- endstream endobj 49 0 obj 1909 endobj 51 0 obj <> stream xVKo0 W\)E@z`blP$KcYAF"#?ɂ5?3Y6~o7Oc ~5f۰S{cԦX?0:y U {v[0ڛK_6ߺ8+v' {=z^I4Tе 4.E4\J]cw8uN*b>#j'o¡2yJ 5)%-T6*T43BۜsT+4B{bnx݂4=Gs"n-_(^km݄!mIKC;㎱i~6q#6=^Q?JZf2ʞu:9rٔ9!1sRk}{LfNGW9 endstream endobj 52 0 obj 901 endobj 53 0 obj <> stream x PDK'{Bb$"f }a'~gI?i)z)z)z)zz)oxz)z?`qKR2@/%R2@XnIK<[0y30> stream xҡ2`FQI4I4I4M$M$M$M4I4I4w̘ak찫fjNgP}av ^'Ȍ`Df' v|}Ffvn'K0>p;A&/C0;AjRn*:&  wwww ww wwm\]]]05n'GA Nr;1&CĨ;)^o_ Qn'EIzUٝvR']?UO0i۝M hvg0_^ u3ic$P] endstream endobj 56 0 obj 380 endobj 58 0 obj <> stream xVMo0 W] w-gX FX,`+%g+BI8m:T–Sl@5k ا)k8G;Сp<_A"RiД3Bm:NC]A5p]dt3*C]> J9q\M:qP4qRX.\K,f{ H=MWלz2 4p{RR/*ʲcrʥDMMD@wm i82>SJev;jψڦaXҷ KpAq&DG 'Zw>m;z#w諦,C"y7i3T5c<˱ʻ&PSb'#& O*ClUv^)hKEC$a4CyV%4jÀVfW3]aX2"2E_tzJ0I{Z@NQdỢ!dz4SN XeJD=x*Ck _D)2G1 fw wi) xm7m endstream endobj 59 0 obj 852 endobj 61 0 obj <> stream xVMk0W;3,dzi)mw>$l(!^4#捼bSC@ػ6ա<~ZWX˷ dUIPƜKց~tsv%}}xÏP=ģھ$pc# ЍMʳQgdFMˣp?>>i`eH\͉cđ46nN|T endstream endobj 62 0 obj 849 endobj 64 0 obj <> stream xVˎ[7 ߯:0.`ϣhv"mZ&_>kLb$:O9V~M.WZkd۟N~l$JYgg2"OIݿ/oԹn?Qe j?Gvü:=짧 }|UxaI07>ͫVXdʠZۙwt>ߝYG55H\(ÉU,⼊}$YV8`*E@Ŭz[Ży`;x+숆.Q$2l+ZKeVPd:p7hQ4PO\ m00Iʨ;Kz w4GEFڊ#ȼ58}F\ޔK/9[^9 A|ub r2F Z(kI7HyhD~T\$W$;t1V 7Ez.q [at夁d ttg$zo kwCh?pp[f*wʞ'EmDZ0$$v*qUbe^^ *Œ\Z~0[c4$^GZimF| +:^|`Br1f;5s+ݸԻ7p3t͘Ѩ.KȐwhCcs) S<v$M3w ]&=#J >$^je+fID]m;(t.m K-姯 kfl[W_E0Jm!hYҍ I9%c!$ǔilK3Su؀3adug^#UOxܠL9&-C<LƮ2dˤ~y#4=av]0E>ɣW$VC3Eo4KJH'4zXڳ4VS۽) !X; # pEɾzh3"NG~Ԑ ۍT>=c3 gV&w0{nig ٞB endstream endobj 65 0 obj 1035 endobj 66 0 obj <> stream x 0DK'z HH@@ nYM>eގ&ҳWPBPEPB@@PB@@@@@'JhHhHhH4ĉRD)q8Q @(709Q @( NwY u]%JĉRn /~SyaL0_,~$[ ů`<-~6ز `O`s؝_,(vw? ~^ذi{ endstream endobj 67 0 obj 593 endobj 68 0 obj <> stream x!3DaI4I4I4M$M$M$M4I4I4/8v̘av`go+PC*BXMIA7V#uaD'4"gB8]X,  6ev endstream endobj 69 0 obj 396 endobj 71 0 obj <> stream x]MqWY:jeX7 D[6҆uwWWd ɕط:#*{rzot]~Wm\u'^ѵ:p{Ͽ럇__a?n_˻?Snoz'$Nx>#}Q>/1}C~oX>ꇏY=na2odJg6_W>(}@ U=YV7l_?v.vf\F?||Y˼>뱊wl_;Y+Vn1X='cyDzO}V2t׵3l_mٖ{U>|g*]?wLeo#U괔׏?*Nrr)srڇoj~OfM8}9ُu:gZ*.Y奵VelR ="}\SzZl_]''-gg'{+ @k+嚸"?A?4BX{?~mx|^/*ϯbeO_ѳ)&OϋE5='__-T~unw1`vl(_/5盂;io{@_~HNA'B~> }ze K),縰>^_i#-3#xP "52://qA9_`U6<q_!r_򗀾 9_qXHC>a/}'r ıxB`tr(8.,ѧ|V>Foj>wr.jwS!߸bXt|yx0|9"@8o#`!#yoޕe1B뽕"@"#y"c,cA&?C.w2* 穌"}""Uٌ~6 ))Y( \&C5 <1 Sޠ\A5 )`,t[%3AP'tT`hKܗ{)XkA*ѐB0du!2 i,cAf!7DTf!` e:KhHCHDz:bY~E/hА4 iLGC mr{nPl.mfQwjD:OHRFC:xFT"K)hOK heĎ/;$gI&M!xĎS$ 'ϻoV̟ wMQ_4ORт&heĐ-|Qb[r/,BC4T`)#2׌ =7Ǜ.oh筭ERfϥ6Գ`%"Jn6/;$*mvǛ4*6+_wH ܜn97iD-|A+w2A+r_wH\ٟ#D$`rě4nB>ULh.{ڦ%E# $.?2 A2 (Lbe<6e#AI\bY%y#Qb%:TҐ&LB8|$J [G".FF>p5{ *LȖv'X&C+)gGD]jhc(#Q.54It_v o4n1"UTB9|$J@g(^aM ǘ:N޽aE?+D~CPI rHؽKh6EgrH(hx!>>"^`2f-C^]ٔGXn"UTB9|$Jd4[E7$2M9|%VgB;vv B;vv -[hgvv>M -[;by>M ={hgn^ٝC;vvl@(W={hgZ[ꡝC;Ghg=B;{v]@融=B;{v@0hHC{`㵝=B;{ޡu!y/ 9B;{g!ghgΞ鈵{ 3ghgΞ=_3ghgΞ=C;{v|ig~B0v+}XOޜQ T:~_D_B0t/7amaxhx jeYH4/;$tq[1F|q{)#M㖷]~ԥ2xu_.LTnh5?<$| j9쫓 KI0RELyEBр1}uRڟT I6e$Od  2Z*o;0dE,y*hXW'PUEq5$Oe  22醪*dC,y*h$E_2Heƥy"chX)KAUirո4Oe nd&TU&O_KTfNx H mCƂLF{f?KƉ1fnhԬKt!&nhLCƂDc)H Dc02%1KFc RƔ<14`,T4fihLAp5$Oe*n4KhKA:іe{zAlY02Ơ'W;sF}ኘJxH4Jk2D&$NqM~U_TBbɓG:ˍ8aɌTT&/7&ӡ4:\2H4isF*#H`,*3a LsjHEY,y!/o&H)i`,zd $2{L"Mo8Xey!TF$ AzbH~jd`MȀdM32 )Hl/ӖTF$ R[XTfbd <GB&А4jHT&i29#XoA*2X[B"P9#9@ (bRPGާ! ?5d2H¥y*a 407+RTGӐ,Dh$YLƢ2e,T&-5Ode ,Ԡ4-5Oe*n4,44y-5OenTDp9.)AUI <G[:e wYbL+#`;WlMd`H?bvD[fB[ AJ:іt*Ŗ9-sA[ R<G[抶m)H;RT&NhrȎ%q*0p 56!KB R<9Az$4nLZ RGC}m[F,i >ۢwH3Mncn1d2ErgqgqZIdqCJ|?YJ44"~gɐ +"(LQn_%[ЊMz(Kp|!!A@7^)#vTI]v ZQzBt;x>0Cp TiD[D̖f3y 3̖f17?t$'0[dfI#Jf6/c7loM3䷢jfI#' ~N#y-f҈Y 4yI#Y*qD`$Oy,0I|!KDqt%P:Dh(aj4FHdsoH2NH3Sc&Qa^mr||!ם3RA;Dˤ}Jt7vY! 3ie?5T$6X$&ly(~ُ4U^eG;N,skPGE*мHen}!#%PAEJ>bp>{`超] % Pۗ\c>h^lTz%+"_:x y{;WO4~95zA"hN_nEbm$4۾(DF?+qEט%$*m4E;D}1C .1lTbz%+"1^6A`&4 Pcf6Pю/"_6-h6A*1bhQDbMPAE.KVEb~V% !d߯pf3VX$i4H 5T*Y!qm= fW Pt#YL.QigGEf;i}vn6#!?M0z+H] nsh@`L$ߖ7&oTLFRSe!C "|"L:}M4mt%¤'ga,cAF$,3he`,L[)#A5 ` dd ЌxM- EHo`! 2ÖԳ̄Z+R[XPoJTc! 2gE8.qȏMDc:3wwLQee|[]6T,-6@;K%nD܂T%4f:h|!!Ql1.ft,q3iDlD(ZQ7+|a|D70*oV$4"Wus!_9P$T4"ts!q@n67eDiܾ>kGf#nl4[Mn64f&(HL7ś4fe=LtWt<˩uBC" ,f҈ Dh;u#EyI ,c 4G]ff2p( ʤ[J4ArCHd$Od`,LH  LC= %<=e! 2Ӗ{=fwC= ` er2䉌j˽dTR[XƂ l<#.7$4!$'ga,cA&! XiA*ѐB0 !2 i,hHh /ɚ=QА5!  !<9c! 2 /#.ӰւT!`, 4dhHCHeXP-c! 2}*ZR7  !"es tBC"@J:ѐB02=!{AC"@"#y"c,cA!{ !27HL-`{M͞< 4H{CH%OXƂLAC4DT!`,t4hHCHe:XPfhIhHCHd$Od`,@fAC"@*XŚ/ij!  %x!6 3x5 {c! ˜u2*e4e`,0.  lߣ6`H.1֊!` eC0CHd$Od`,d0d7x,ST&!`,40d:R40^SGHE.J_q2 ,cAÅx 0!2.B02gLsp&C2"56o %pg,cA!3wDT!`,L4dL4dƎrS YLIhȂ 3@;"@*rƲ\ѐ;"@Jѐȩ2?RDBX@ endstream endobj 72 0 obj 6832 endobj 74 0 obj <> stream xVKF W@ΐ `k@M ۢC:k,VfșGaIݏ]vexN^430 e.8asX$j8:uO@bX|ЧXU16G*H>ByW_t՞Uwge栩.N28keVނ:)̄'Oϋ>۽@1zS/]00mмHz±61rBtD}k7C $xe%~Q?W˜ " Mr1 p"W.8F!eK8iNpYf2Ԛ0LQ9A)PS9zq2V#}d*(ul.ZZ6tVTgȠ >vY endstream endobj 75 0 obj 1078 endobj 76 0 obj <> stream xŕCHHhA!6ό9g,-HYb0vϛϹUݪΪʮOuUVVdč'~SJN);wN=?^5=^_/sG??~~wS55j(u /BBO%>}%u~O?0o?#Vč5﫯*zqd y^|E]pIya:v@t]~=x`e٨Q1_4#I)?͠6–gիSN8qB/Ο? [|]:7|mԨRxŋ/;ҋ P]t {~QFl> . 5A?#6gp^~e#}F5 H2lAzq.0T/5jt0 'կ|U(/xo qACQFfU-I;4D7>~W+eF֔>sF;K)IT jԨрTCG^~]sE;hpؑ5jh(Xm}D69r7lnԨQA.~ "b^ ;v5jԨ t}^HBɒ ;&FF5bYG}䉭@5j4㏨]"C4Id/b.:5jh]tas:5jh vmIa5Z}?ӗ_~yeJ&4jhYڵkGԨQ'O±ThԨQ1jQc#jԨ٦_|w}gE5jh9d?@RF6()ٳ!;~xjԻRıF5?!|WA ;u4S5j4 vJu RJСC ڨQIbeݎ0v0l`5Z(^}.ǀ/_WTlѨQF7|/ɓ';&"3hԨQ] 6REY>KEfiԨѰd:ZM&.>w GبQM#r D"5j4B;y>m 5jhq?8qja5Z2Um?3wiԨQőT-L@/BL@QF6}ȑN ߨQF ~ K.} ߨQ? |Z9F-p>ǎ;5jh 1rnԨQ%X|JvFF- |=jO7jh d1QQFMZR((El#jԨganԨQEcǎ QFK#iaO&믿nU5jϡC>׮][p5j)׿5wEYϝ; /B@5Z}駼xBv<5E(F5Zapv-VQFˡm\p@7jh PCpvH5ꫯr^ 7jԨрD3mѣz?t}_FڨQu#JKoBdpoiA5ZܹsŸC=(^?bt5Zg"B@O>|?&$ j5ZKT/=x wqAztßF-BюNw$D5jh@<}D J B7PF'Gz. ?}7$G< [U8ҨIt0ᇾ/"ȫJ%xW/skV,'z_g}Q5I$P*>7jtiN>G&/;e {5-͒tnoozz#]C@l[z)_`&m/W;55F0RWhct[Ai lՌ#1N)}6vf;XBMBBaW{{#ܻw/[&|osӄi0e1,ETŵ$se$g)BH/2k(^J-oB$ֵ|MFlo@&\Өd6?LJtLo3eJR4OA--55t$V!Ϊy|%֝7(AUԶg@W^y%lN>a'uݩvsTp+WrYVW>r^ 䐩ݨ: ]փ!4~3FXRN- /uka Q7o!+9SC`im6ّVbZA$ ۈ wX&w<8$EcNikL7|,8 +Z~X}?܄o٫kC\o k¢^zi?Qȇ0r>}= 5EԊA Z&D2gƃx嗣vc!Ƴ$_b%ؕ~1roϧ'we#ޱn(&`7 nF6+h\q++EAws^ygROe<i@nnT Z`72i*ѡ !bOC }DuC3H MBNśi?Z2|ڄF3UW?q4ԿIqE Um;]E#!2&ٍh J̙3F565 `F",O+,M, B{䎚#4k$ENcH'iT9Ux9UśӮ( E6swmR/D_ ,NXςBܸDN?Ol*U˗/Pib4Kn⅌ԯmmmXq %k7dX0Nqhf,7#^{-́EÎ~ H`k'kM^DzLJKYbr~7I94ƅNբ[Ҷ*s," k?C\|LvYw=Fd=6"62ȫCؕzM \6/Ϊbѕ1bk"] Hi#8cH˧@pŀldt2c/3LhV=G"P_= Gw`HmNA(N 8iHAPLCҟ^Hfr"\TBdY+ǧs?ϯ%:r/Ř '])5 1OL1nW y#XeJH,zd UH+#?0N#'s9ȧ.Cmqr\.\7N;JaojZH.[xaHt4 @Ml 8Ӏ3yš{Yzy[c_ K/#Mf?&16RNeq9{$SNayk[=~*b;i$Qb &_]  ;w2DCv5֒X>1͹Z}¡fIC6&Nvmk@.x L@T^3j$ˑZ,Zd6y E#u`S}n nd0̙3M{ )~J@oՌQITHmI-HY| IyDf',b\{s+5.Qzp -+:-^8b#;fMGss۰wxOp-FHtىkIj8fmf[J~.Ĥmpr<HohH%MSk(YI] c|5z.">!dҀ1_8";Qc/"b69H960cnaM H|$8qBO꽳4d1vK>1#c8|+&xSS"*=ȝVo7FH,73}L_W&4O{Tr =.NbS5Tzs+=̀":.:U be\ $^r3L&? uMX5Є¢\N-J@^u}+Y|rXүO)fC7J@#nkk+"-|5Z5c~.VUX5b^Q׸ECnxV Y?j37#;8Zyw8r%r E[ f;PaQ1uT칤>K.#$lO8g,?5<~?u\|`@j379yC+wH  |J* Ćѩ i I]%=5R\Ur-+'mqYS<OtMqg>"W^u֟[k~X]<iSiR&LFoA? >|h+h0s]e- ʣ1.]-쇼1Wި^6#P+ >uI(yhyO)s.̖%JAN 2n.6 ֕Ml .!>T_}Θh!{(vP'we[Z =nܸ-=\A66V4t t%7\80`9<;q?6, Gt~>5ߠ 'jN~:;F g5B6Z d64vݭ U!Nqd N*^>ڇ~wp.1{^'mb1C2Y;X.f{ՃZ 5'pyNU1 зỊe}_9< =n߾\I\{L+$viSRe.m4GM&R<'un8dɼ U |_5Z5^q?QLb(dgg_Y}rH "ہ Vıb5Bk|b kЙ3g$PFssiRWw`WɤTuw}m=@2Г.HY!|:x> / c% ZRß}CNiԾct9wj/[pFk|>Vb.,!P?~ya!ap L([ "߅%z$X!߮=2N׌Ga(Cuw UEPޙYy9C+Qc}jG9T+D.r1zJX h# }4A0Xư`Mp9n#ңIj*Ѫǵ(j37Oa x4`_}RtGl <8p{|ךДWЃEKB9cRߏ&qW;+=; +,i6Dd$U H=S:Ϳ>q "JX7`IǾ`u#-O 3'^&4G:HG䖪(z* TJEȀEQhD"xg>jqh_/*f1ߡߏceYhqfdAw(ohA1bcv/ }E UWzT4zsCr苞ړoN-ܹ3)n{rjL;3(/%sǀ֨|>Fs۩xun}?[[[,gcx 1^Ymϱ]-A+415*GrRe"H+I.qHKPG8a*;E[5=) &-6hn5]tdVT$#˖J(v.]h)*=PT}=Guװ㚍,Z0>|8=SQli_ NU\Ik(2;G$8X   d>Z5Ƨޘ$RS|Wu W90߄@'2#nw4}Jwv0zuO\G*6y%zv% t,j[x..x4RC/SI˭k^/rXRN?>YcNk3D HȅCGms46'1Xt@/b؞t=ح[ Ƶ:#sq9MJXrVo|R[{(t`~YubUB.md;\?g9G+T9rH}TwbKzCS@A~G*e.\o- 軤Eh ewUD~ҲKaxqĞyף{ÝbP \BtH`p]WxV'MZq.j^ ÎUf&s wY 2mmm{}g$ԓ7ڗ- V𦗬,_J 8"\h]s:kFxq ";dI!`Fk̢KAmU~:4żİMIx gnqpRCܦW]E S (nW^5EOG]qG0Ki;@=Htd]JDdg?ZR2yW S!; OVE8EZakI=e<цv|( H9b~[K ="^HDGsHM;c>bejKK~ Y,-X\+I*@('hc ˁcЛ6@\g!ApMh&H;Yk͉f>vWeW(w +W:˩~[ *thqhcz љ7d}%VϪEcx.$W\"^Lb|Za87V*ީheS;|vf5u\4jQ6īѵńѤF ܟv'mC k(ŰMa] ;>Ϊوꆃډa;3(D@Fq2A?]vMTg oE!$a]'rkR8|`V+fmm_',Vah%&,֖ Zw֢ @ ́9HfX| lы fߤ_Ĭ̈́cs[U^DTJ,zv ;Eڪ9dCk1" 46p^?ώDb4'| fcWm 6uR|( CZ=x tdKTf*/wX^'Tɥ7LLfuGnP1O4IXo 9ڌN@lDkʓ,z8laYD-?*?, N^RwIt&!*\=/z D,+@C=rԿLURUoJt ntq.vsPF;%Kxhz=]> r/{4~z"P+u_4k"+btLԳC(0y']9jCXp&Ν;>(kbH3ω="s#9yVC֢BKt>ՃDbz'u&):& 2,->A}G Z%͕R:C0Bg[YLn^ܑ%])C]'y/8ΜJ;au#0.hj|H6+Ehě^P7j8$rO9:h1TɋP/Fe̠1Xm ; BAp͌AmsͅR49UAȥZp.'SĿPQ<1U: ʗ7`|]9`1lYuw-[~GQ@ht%A,fX}֭|6&,\/i' aѼcmeqAu`r2 (b|?vȩVli7_^h}*I@>zV.$Dk:2xNvG+(ndԣiS[rKP|W"MOѤN "_YćçKڙeS _ʨYhcN.8? ׋XZD&eWsW5@nҷl}'rUI%?9˧B 6VHUQh=ɱ $DSOqȣqB|;5>?)I aigq*W_tYy5u߼y+~2I+pŨ9J j49y\y^Om֫&@`,f8+m_s PTQb4F;PN1fŇ?1-a퉾ZNWqxBCrXtBEE~z:P(+'Jd_ҏW>ebfI9l]8I=8`ͅ.,aI8N%+[WV+Ը,Tb4 1JV )I%UwUv;#п66Hs:[W_f@E'H=au Q~KexZU:N5J%Ʒ59.pOd\ aDj]̂T[]lXD)s-᧟Ɔ?M l:(Q[}e?t0fؠ5Wkt="c} \{ _gXUr`K ~)4+EGq8"?=rZpZ DŽa!9Y]k-V~KgeòКj+CҬx\鋺炂F.\cHլX{S,̹Lʹ,??h/M$&-b\yiU6e)51PG 1Ĺ5-??Dv~hlcnu{gx\D *qk43lUpa9]C 2#Cx߇wikޤ{ DZP^\HטS^{MD)ZM˂a4Q`'G8J|8ǣ]HcßAm 0׀0hgF@x7|~ܱ r,FT!tۭqAUJUܖRؙ95$=j&5ZM4U14Z͊˒ԭbM+OU_{*wm8-VԢ\OƆ?>}*:̪$hhђ=6 dxDtXW~q&>LWɳPe(⩀FDP&i-8~4+1feiRS KsALk*·2x7,租3֐.V$fBsVaѵoR&j=IDX }ٳƧl R ;,jYH'5JED#fR67NF 9DTb$&[[Lby|w++!=M\9&[F!@Jͭ VFkr3yZ6~ŷH!h9\/xH]R}6q2 LL{GHt W5"̺tV!źh=Uێ$ds YS.XoAEB3djUG8&'Рy=s!DC1 cUdEY,nU;0iΨ'DN2&3.cǙO*K/enMUԄ_fXn'D;KE#1BAڏ+)9V]1}9DIcs\b;>AF(a*9\RPcqUjy*wS0CͅXйO.JƎuȱd+wq~|U҄Z5[mANO=+18 ^;!"Ah^`=|T r*:P^JӨ(p9.sB9VS7^@Bdf-0Hc]f+cgۋ[gSEKbMFֿhBaaP ȅ$Ě_8|kݓ)b?2#% u4~ߎ bfϝv?y-\fh^wkk2-IG:R]UB!q(bw}]<=:x4؍XIxsEKo"`̈=pi2Ȅ9V}-Y*ۢ+B/m` "w܁p@` vn(0ro0y"b$]9$v4f4}Q.8utN=lAhR69sFPC;N'NYN<1̠݄Ac"0j{ YH>5SErܖ| .؏b#vJ{B ̤8D`ɓ':8ȓ㨾B"=qFvDJf@ynʟ 0[r,#]#2.# @`;]t,Ί%Q&eZc 쌇Iqu"5+ : Гh"!"$< mU"|`6&;Z|ҌP\np K#<Uxcvj7cyKkWwCTBpL qkS`,H]h~F*Yj/vٗ3<ŵ?\,f67-C$k 4T5\kKNuéw|DD#G0#x)|B`u:9pEgE>yQG#8j2xGi<_KS"WJvA OLЩd=D'=\Ŏ]=qB ʀpaؽp&q΃\$qM8W0tGBSRiAe6ѣ#/?,["Eg0Niq|4z3&#,H1ŸXz.'im*cݸg[7bK)d$KMء^n\P? N.l>h3}|^\vn%)֏b+P˼\.ry#QY"+zMDYc#[kוߨA)ok'FM\п~'(wKrUW\a/߸qCPxl-6-/ vi*lIa3dU/޽{*ߚj ϦgVHr U[kx-1;f8_CrCh7xZX*Oopr~je^ay 3SF&5k\90g !񰚓DaIW,f -!=@j;4OT[ѤS-{îϿ3rD]]( $u_$1,A0P+s{9[C[]Do'9 _Z`"yMd*{lZwD1T >{4D/LjMH~0׍n؟tIz~wDQ>)n>`]؄?iLTǸ$ Gf"jEDSr5:$^X` Jl-h}AhqWUB}T 9`h9=:Ul_*qĬ$kw h"3 th_Ť0OרbmAߚJE^4v 椎G֐F/oPkѿ낐Xp{L2lU3<=7%[UPƷ!ɨ۬[o5qDưGy̧C*,OTZs&H¼ɍ 7BPm23,(rJ8 (?BbǥB)c8v~m[Қc~N줣ŞzK jsk7t1cZ+dH.2x'jpuCdCT=]HD\n ۣ Pd esc$" Nj# U }\kztt:~%Vs?:@2xĪ218/?d-K/b?lrͩRW[1\rd0̒t# ùWU޼Рm/JV ?4$bbua[rV `8x!b&e<ɓ,Z?D^8iAPsk栾9R8 MvrHcxR RMkAVG}u/4c#߯r3N~q+Gڡ4LgVVTqgpNXknn@{N/m,s?~82~xl@7GWw WP|;5|Ud4tߘM2ѕ ,K(MH=ϗ$#@@>>{hL慶fv~=b©_fFMKnO@ @޽rCrUb<-9}yH?<%fmi)-xO19hĦBGES[N܂*1OEo;:Y* m7l܀.]TI̓v;[9p!ܣkM"g׸)^% pflo Q@j e:#L?uma0۲S&4UO3\!y-L_!}dF*MU[診x%dp000"^#~~n_[9rOW36pc938}>Q`Hڪk)"[bzFұE At}S4р'pW0rR!ܮ Ip\4Yk_Ll9PADsϽ}Ce®i1N yx")#P da2+"jI%! "3 |TsکwI.wTqeG2,q$4l ވz~y.0sZf?_DIҙ"9j <Y=צH%@ VG>4p.4(J6TU~9Z9Gp{OmHb)Ia˫B"K~ GTmŞxL鬱dq8L:] ݬcN 0\^0W^8-{!uhCe(W Fe^L] :~-KRIhBFB+Bu>bڱEe'b6|AJۗ33Hs3Zαj.!IfRZf zpꪳGNb@)Ԡ$Z`~ʔ͎M.*|&eo,E6@&?*ANz> u"[cF<3_%:j{V9"l/SbcMb.^0\-?[?!P$Xs玣0$l5_Ta|Ėkghʰ.(h@6HsDXdYg4#w}ҥK$$O>"B6X#Z <`K!f᭭-ЀC+G܋ڣ]H?Mt#vj&r'89A@ӮU,W._̕sxpֳgrl #Iw% 5~A 1Μ9cE`#8 W JL{9/z i:Wz%| ;turHrG0$#Y?Df0 iv~)sUdC"\mu{j\l#$V ]uͺ,\\Gc Q49#,Bds[{F$# 0:Z 5RhTf.sOU2 KhKS+9u@(A $%CY&:=1akN~k{{߫A h([/N07X9(w**hOr~շdB|wاlަz2C=8rk-}j f _ k$u+rпXWyO {%񧣒P'^тK+ 3E-GpNs' \H2%$Lظ+ խ~=R"sh?# fe|}j cph|R%#Ӵ =&1Z/HJ vzd\JT99Ys 4sghhp ƑjeYL{D04 .i׼iqMƺ(EWJ/hU,hpw/ ALT=' +u԰|&|N($`!# \"J/^dlh$[28pu[6õ!`P|^#jW*Qh.!`Yu+o G9{L]Z]\'p [}:DG@+oWh 96Gfn鬚Q_&2pU_06FFH=•hp,S@}Yr.̱4"wvDE ݼyܒJ],9-2Sn8 #FSgz+VG4K~`]KĘ#3TBdsVTs iAˉo@,P ,~e%h̉ϝ'i] _R4 NKJ;ȝ:CF^ju@Jߏ)15vh$'ё-u=\9>)BIhnQO_b! 'b &"TR P̶?KVрJQ&'GI>w{W.˽B+44ax.7pY/#1F⸡k'Ra8g Ծ`mP68|vYq5|w.49LqUWdF4Pb$d4unY&9]`E1ckVħ\F!8k b@b @!︨#c ,޻w… L{n]dnɮI\$AK C1W77Ph?diNR(6{lgoJf٢pWgy]2$ mOO:%XT61Μ9N$0u3Yɱ^L>b^K]\ (:Ldf͛oCsuYۧ1J.H}0ё(H5ΝyQH#6 \ -7X.X.xB"THu4~.a EZ iOF|S)F{@fQ]o ZŲ;vBm4 A4w1L&-%<JGH_+T?sEQ 5Bcd%Z+1t}{G) VTp*O-hEheImz&`yNLq}r=.q%jSNߘNĉG#LjH @!κ/u7oہYIKHU$$ͺ=x,,FD])" ]9׬QČ77]5X;j8Jr=:f'cY>g|:6iI+X=w_3V3vra<Oaƃ{{{[cf0e:Ф0ޗ_])u:,*n/--bA8`06ɢK5;qℙ… [Hb8 'cWBNw7FЩXҵy-L bͬDYX^'1W8F&J u\\<`PrgbK[Ep5(bCq2zޱ6_+F}upsR)sUr"!5ace&o;:F;\RdF PoB56'@k]U%V#"![5|M{e:V_zr ֌ ߿b.}Ϡ4GVK.]b/Cœ:qZ9.#ZVsPB+>z:* ˰k;ksvw#hhd2_IK'(BƬk$\mہ(=wY,6/ۼgu?$K~~Z6Œ)pwfI%Oǐ⎜X{b_cͶ 伇<f]OͧBBq<vMiCWI2rNRM\t:V 퇜CJZ5±TR&?i4<9kFM $>Fty`'h-p1_i4^-y~۟pUU}_.B1Z[`Ъ$R1!-ձeٺ{ qLť?ʚP]4:FU Qs/wJ\l_ q6rF6@E^jOD[gO#o>yV\(;ˍ-K#-Fٿ4ZiV=E3e]x&7 $"mUֵW6ӓ\dҵ^`]hZj9Cxœ[oH<~Xm,1'4U(jٳg]D\pUyt{4.Z5U`_:zA-b*T>Oi&M&B eVDnqĥv_]̩K VxR_Uj `J%sD|O?[}M&30:tȽ9+"_ŋ{+|ҬpC`i/'U 8/n޼DSԂJҫ+Ne7k $ȩOCy$7 M&dc:Ľ,'[7Z1ԑc0E5?_ dN̥§{-: KO]Ժϋy9z,?|ɣ6^rE/Hh/p}q[$؝!Wڗ"ϛ?0My--9b1#/˽>Itqc6+mφpwE/^aYg}jT!=\O*&+;qrH[nJޑJyY׶4A~Ե0,k}Z(dTQ?:(bwxrmP.ɥ:ǦO.O+vyW}RrkPSWY C,Gh>%觍Iq!@:2+]V2fܸA؝d/=I]/JJ+Qm)D2gH,3ܿ_;KgQd"_K$' 怠2 "WU:>y$hv! r[mGw:!diIG5L#G]BaK$"F ͛7u>3ū+?FwiBhIA{^#QDGe0τ_o:nDOFaٵɗ )Hl򗿌Pc(c/Tڽo%Nh3BHˤ G\S1>B~ž'.S yZu"5DܙD$$hch#~8\N-HC, ڠp]pq^K6w&bdڧ,I-~۸/6l4xT-XKJFMD twȒj *zk @$KʻήghElV?FIDJ9ݣ1VT(oiŬVHvlS: 2VV;nMhUC3(.95jdb b1P<́OmjEٞUZ0wv$Gp|A[[[^DqrOhDeK HS-z\p.0'i*v.4 0w$f9FKڹsN.eW%|:aT40p=Yyr?_RfI?N (t-oܘ9>5=Dt'?lpQնr"sif{qTʝ&YfFkC0sQ$9A=F)_:r9<&ɩć{8v(O?V7Sm47e Edy&M8KѣGZ\ԴgE4tEC].2OƩS7E2$ߜ&Tq92A/-l+'1@K9\7j4i/>| lף]ѬBԿr1ݻwO\ #ٳXx5ܮ\,zYf FJ~Q3HJpl: R\T0It!Kx:R A.*uAhFj#q裏r8o;Bܞ'bIyJ{퉴;ʧp)0ʾ*MU\RQreڹNPTk>º@8jYyyUg!);;l-cG *Q.Uhic`(sA͒c(}DVE BA4iU弪#G BnIyS n"ʄB6!8H6QW,AѫHzNg֘AQ*`7P8_! |Jn#D0B60wM(|5lYO6:Hwԏ;# ;z.At5^PmM1.Yi]2T<2䎋 V"n82_ta]+z+Q&= h#HX"~]\#r,JRG+kWttosy >&oT>=ʧ~6F0ȍoG,.\p\n.,V:hkk W+8b])V<ڭBZ Z 9|gBh&4?W4BNjMHam_up5gծ3ghuЇ?%SgG$=u)O6"gM)-ί^rbVsp'|\ZCQm>9O,&D}+=@E_NZfR¬{_Nd-RD\CJ. egW_M!9qRe]B.2%y2# ו+1ݻӮ_JM8A z4$:U4TN.I9:@C,$' $\ IʄAcRoF`Msrb U눜'WOǏbM!˄z-|r9h7jQHnmVW xЁ=!:չt1sI.oxԃČ<~.22qyl|Kn}Y:KW}OO:k.+1뻎lzpNԎ4b`ɐ̤7+VM8S),pHo&Ν; ^$xq%($NA-mܭ69xG?S-V0n߽?f# A)LGE'Z0f,M2f^T8w Hw1hb$oI[&륗^ʝ!P~YyjW,IJj<J[ZxkTVDZro(JU7ƠP/0ԯ`r93Vܿ_wK%dePr+ĮX,շe[9y.9Hu@ TBd?HK"34Mܜ ;I[Sj=wm¾C\ Y[Tf1qdyL"G0 @ 8 ޔ>Gr^ra{Ip,͛|O*}B4!h X/oIFh3\x1b/dݦՎ3+wi;;d p ELzn ҔuLݍȆӇ7{-_6I3ʉKű=^C0?D6iDjGo;~Au]Ow 8\⸢rS1r(X['YDJ1{EZ 4V . D4bo,sIo9NA]a]Zb?OHS}_2* !F[gB,Ia1J sl;}rw6 bydcV]Dןe&|#gi'ffY9CoP&FWaþ[R>]+m,YVPRI1odybR%^L @4h%[ 9ĠDN-? "5GK4B5QB+;$e 6@ꕆ8~2DbOI૏?u Mꒆvӱ=6g{қk*Y5`/\*p#O)8@N9ču-3sQ|2|GcxQe!\@ fP*jŰhFf`v.fa,=N`q50nH7_gT骢:A0urh ހS`ChiU/ѳ# *$' T\خ;,H` {`u[]|憸\߿JN XSj2/=z!Б'+ c&ԧΣow%N:'ʐ;ێcȺK*mI+uú~"qf$7n(jڲ+Y@Z5nK-qq7z;b{[10;XqvyZ+%s%4Nw‘׏?4TƶHꛞDă-kg#HMGԿ>XqlU6G:n&n5l}TX7UqSŘM]WʩY@QvYwK!M;}v?*G*ʪ;sPP,Pkxb#10>`A8 D혱œΝ;{m#ʡ`TVe;hΣnΛbJ8ll'o.ֶ\V E.k5T?s͍"w.`wŵ`x0$OmimKB,TILNv6"GuI|~… VIeܥ1Ou.Ho$Kf4\5܎`-.e Qc4*IF30AʶzS8i=%>(w[?wv}SMD41:м HA#/FKxxIta-Κ Ţ@V 7AḶDYw

-Ž Ap}כr`%m[Wߊ^~ytk9BrQܻwH~ w2yحsMWjJ"iŜ뇍?,eğ`oE>(=w$fH}6kĘk߬.QM0;+wβwBk7ra288q[X7ߵ!cffV(-(HQVɥ,N+K.&V>i{&x; BS#4IxX _Nx%ʳ#ֹ*sc4uڋ41Fַ4G/9]✥,hM[haD^nא\&>7a6>2h"` P,d_['Lc!ʎ,UF2Ǥ0C=H#!UR' xèBi>uψETLE#jiyk=>>[4ŽcX#eDN!d< k%`AZf_u YerN#ˈʘ紁 3Q:់w2}8h?},tL4[(-M7߇b(ĝg;qޡ!a2R"< )M]rz1,L+#JQĕQQ $FNaҿBFSQwd-p޺u+ڬ|GzMRXPMC"z' o˓.~n2_MX=]ƾгSP2SEW1<&҃b5h4֎xڸ%_صlR)FT9!pq8 fIǺR:mBJ%nDu=Cu$O;3Tbl#|R0h3]fN;=qn%L:C\ |ŋm#I4`]@)FI2=<5bn']ϋךAZnIP1?!٧<w>,E <6cbͳ$ Tlu&rPg-&/CouuѳwӜt\xX%J*鼦i+Ii$-FכILsdfDEK](N_F.(x_#VdYU.)wfွ9Xl|9hj+9̒HW/Or=hUN!Y .WH!+#=@ 'aԀd#3Si宂 \__'t5<`ֻ`PY}dU;1@cQmR"v;d -Tb4w5TO;]pSQCA7a"a1/AhC?S"DvpNnpd=fd]m}40RD'1sW]h"Q;:\`Kmd*M_鴶uh5Hr0i1?+NN>H5*:*~er tW*GP^.:nll9mTH0&e"VV$^¼-R4R~7 K%5w6n/Bʪ;z2;\O5Mu ŲwA1*5lyZ!c#nczSaGwp(iF}tp|"޳{"F}YqfmVA~F~.q,BoC)T,ԜBw]6~7OE ֪%Kvԧ XżpXc<|KDrMG}Cnf4@8DS7w=*I.wݏguK#F'cT8 -$bFRDb5nV3Bwfɥ$b"2@. Spɋb }]iV+N ^sz"^pⳉgcêjCMQ;FbfO\**U`;9i_{dq].lȖL $,a)I)~PX t/}AWuUu7CŮ%/3gΜ1YDFH@ ZK&';--(C{Vna ;k'c&7*V*G=^r2cekU'XN|(-3giT Q /DqXUm4L- o(}ͨ ^.u vK <ػ fdݩG9<ʼ/;cE7nS8( !`f_Ep3񅇳֦l sntZ8؈L`tflٮ/!jk6Ii`i@׀PE ةAq0mv"d~2M}00 hQ8> |^LNa !oG-`yaeyr֣vWFnso 1_\ϊq.-ϫj ;i`hk<}Ϻ0sBLmfC% uڠL%ivlJ}!^7F cXC2>3~%0:/<<O!ڪ(y6i!0`-#ad&l¯6[0`a9,(٣QZŒb3J)=ԚV!= B8ij H<6M)u/Sp&_H]P\39>j=Of11EDr05̴ q2㼌άIN[) gz$}p Y1' '[qwu)-8*C=F ~"N~Oa &#hVnF2jkfRalȈ;6MQt6iԯ!蔑!ͷx=RtHR4 ݰq9e*.Irũ d=kʇΐ}Б{liRHuY2 َCLP6&d\a|>+7M`LMO#Ux UKHctQ2$9zs oHnolY2q\EyG͹1G5X$?8fٌ>5&2zy 'Y@}r]++˰0:;/ZsbeMDeċ1ilkV臨l||47hҒr}`ШƧ^:(oWiҹykvCUEkҞŽЈ2a|GQ%c{tƄGF6QwyX#- '_|O I'{x aK༗:!ph)WLsLοX#_8H D2k/&٦]ml[k ݉-ꄗD#_"_}^xjL^Q+:}!VkCEJS5E LD \$z-P^ mʘ#(uz`sơ|cΎ).0ڶ *LUGdzFғUx=Hp 56yzp , D>J*c82xBvt?>۟ţK&=216E! )a~ m3 OIk[H*% %6:VrhfBƣ"FT,Y~|#U6l/Y9祠v݁%Κnjm=G.IVR%z,e HmL x]CQ#`N&j څ rqlK RgtzΡ!D{_J >7Ւ%IH:h\CV򥁩ڗDyP:Knwl˯f-8sW\hҌSGv<(v,hX+/qf삎Oy#zR1z2si9et  lF^=P"ڰA# Z\hmKVrgdzObu Vn-\'ڣ"x`$2"N,%JacW^ybcJ0TgQ~=~Ҽ d4¬9#ihL7x[B,SI{CNSMmG"LÇigѓ~jYJ2vgt31J>Hȝ&BРvB}/ WS޶BC!8E6`PcՔ<'dN$dS-(#DTXI-Qq` q}Wwܕ.SK֖DcHB]N$<,H8t;8|`MT99n C U%AYN y+8p­^MG@J/@63Y5NښvK%xuU yėYa;&LPQxhëzJ>&qR>o?.<lg1 zq^NdD# Lw omRӮq?f|r$4 WXɘ֞1uô$fΤG0NU8,4hF6x ߕ^ HKπi9@aO*2 *Ύ 0١Y_Y9o~<@tkEvZ )3χv[oQj'1"(^}FAH*ۣrOi~R-ij׺̝ا>NVejQnjj9JWȇ4^.h((g\`HGܞxqPS#τrZ:\o{;W2>a| FUo ;7xV0t"&1i8%'2)@"\,vAh}Tq@^j2 ~F]$ٵ&Ը^aINy..gsf|,=DGQ,Qg>(}*-~Q9\# \]Y5 e`#AЧF1SAdVZAs$.Byk(c!c}O RG\d~J!b.AISY7$i";SqFtkOdabca H0$s nKdsGY`WSMf"yЧfU>&z3\kH:/l9ix8"zS(FD0 ۑ[\jqy8xuI'Z22xQKqRڰ;o.20FAg7j17گ%tf.}1&x0R-mXr\ YojLޕފV7]U(mTQ2W_ɂ^w+6a.ϧdbI k`9i|%r-ؗ^{5@6g^S~krvtp2倸x:^8[ 5hR񮙕`s^5=O`ܧ94xZ{>k罢u "q׵ mVomVFej"tEl,w&qR719@S,ZheRx%J!VMp9?Nl]d_5)6)u+ pv0ɘG!_r_tzzODژ20=bc D+e1^qLe)GoWϒȇ%s#V(-w ޷1rAS#ߺV;E=⑩4I#4Rg0eEiD03>"^ jBbG"[bfsxS,u; I"[{dHYzlTa |+&RvbAI\8o'|],#y#ˍܦ€_mHעwy@' wneԎ"Ӵm:2v?.@Ƨ8(r5}zm-fWS×qavvkR@,6?OGpK9]%ۀcd' Y vh ~tO(7%HG[BS= 4ʚUK\옱K6O::SAU]P< "oZ !7=sWu&h)_h=FeLbcKk0xTm PmDF&]pmkFi XDvBU?ډ=_䷩Նs[$aB[O.|BCW;F;JO~2JKh(;qSN ȜiI>T)o1iFP):aI!x}|s2c_fI'[ʶ!g=zwow@Y^ńE+%4pbkx:N.|w3A/Qzs'y$ Y+pr35”fQ_/b81]-|(]7"V3m7т`M WC GI?ewxB.Fb$BE;o8#ΰ!eߨ Ӕ0p8Yӽ>frkQg9`0jeFf ,eixof/7ig$K n+_#)4Nx4?n!:cR8Q~tvt@eK"aʷXF[-D3D(Jzr.6 vEN۴x߮ۘjMaIMc}=>Kga.2lL(7Ri*v{}]6q[z3w:GKKQD"p!MHE70LV(R('Y#)ʬVmAc'`7!$8dYOjb±H.pc>MBrvy*\ޒkOTI.AUSEQ Y49Pè:ȕu+Wab~n"(?"-׷l1-%d[H?̇t3Z;n>;"*ľ S`yIYMϣ@[VcᢒШK l>nGX"+_ƜFE"?;Ƚ//=z^ኾg$_)bĀh2/9bvlh8fUG7;A/xE'iT86)CnJ!ڦf-tIʽLߛo9 q#]>Yu$hs#՟\mWfX 1x)ȓ2*iOگC"|nXcgx7Yp1vƈ !K&(=z%2:r~"a_gOQy{7--HU9iR'zgd.n qt̽’??ۭ俛%[ @FL#vfcsn<ˎAȿmS|zRm|,K'v-$+j3 R 'ؽcg)0A8!c.@Ę=$dh7çCƸs/,ИmZq]v}m|/ ΗLSVK~;'7t9S znEUO f jsx/7cOTooE,z[o!.4wRk>T)oaE%%I/>]:RCYkBe _e4le97v-C!tfȧ\{g#P(!f*mfF؀l.-Y5lc1ͳX~e 4x1 ɀ ,R g^'!bWN<1ZQ&L% os#,̡e5:"aE9å`D&pTq!y&He.ca9muF}SHp)DaQk_!9l>*V:uVy7ο7" V P4 LcO:3+F̈́m1y[[e}߶Teqg 2Ⱥ"Nk[h:kL4 &-2'1WG!Gg*s7 FT4 S +ɕl΋ ٶ)cM2~F:idLġBP@.&۳Vm 5{w(amfD.$lm&mY=ȃwn.&7YNSYYAVw7jڣ41hU^fMmG wqW#y99&\2ć8>Xo^ђ 睬qM-;G;ei#H5 \^چɹWVkMْ҆XѰFPdTfC^j(r hg6&袦A6*<]C˕iH_mVTԠˈf$ 1zzb{/L:,QRT[ǖHyHc9s$sz`W4 /i8KrϘUQYi>bSBBjJFA:u S4K!d7%6ϷJc;$m85AM QI(.sp7wha{i k>%F;S)ee[r9=7n׮s~Be%>c9cO?)CZX::mg%-zRN}t#P]ɌV`EqSV;6q (-1|Z EoZfPI!lqrnT=04scy1Y빫hy="ɽsFxRN+v 2 dCiLWBV(=겘 v:S%X4͙_ _ h.ŋ!_B#hit''wi- UcZ NYJwqGJE(KSߨZ['7gvN2 CcN`cڶM]ckÞǴ\P]ga>i%ɉf*Q}ʂ)Qu%x,bXϊ'\̋Df&Mo\*]'L6`{ܧ/~M5fqx2 .}ʒ ȤIۮ\i'}K_ b'eBrEDK#o$mbQKQj|c\鱯%5NO;1KvXmԆ¶̼XɒHh]>b 2F^ ߸nϽxA:tQK75gN-s>5_4+Qv2 gsY%h;cg>oej[zmіo^K*}Nlcvnzڦ&$Qk>w)U0%/1H = HMlƧP-C¢LVi# p.`?.2Al y\l'>f@~ [-jATu܎k6tlGAy0xl 9zꔄ[?,e,[D0H@ılx,-@`oK0ظu  8:2EӘwvp/Ǿ FIqj`s/SF2> ܺ[|}H­<5E 5\c-Ka_"l?&y9O+b&%}o'G){=Pm,j$ 5(%1n3=Zjza &;zu#N< v}ԅ8{%ָg_`gRzGi,fa֝ȁǒ $ɕF[?3 ~=(0/+4_,ȐO;v*6*2yls#xzyd1v{`ac|FN/r|뭷Ҟa{=fFsM)0&' ΥO{*HhkҦ|1}; e~Wߍ FKKK%y; i{ѭq"8gyv۽HtG?"8j#ġm076NˢyFc"5џ=?'.*#aF:n3a 3-os ~G`e"spRE u!92+;qlOG[f\/œS̯sJaB=1nF^ډ᪀+a5BʛjS4,38`@i6}#B;fA[]̝ A\ŝHjDY#ɔcw*=znJہo }r2ԈN;WnӨNF t.̀n91=c<'{ƹ=i.Ma!*27[} AEwŽ{uX`w\-w0XYX~2+x^6rc)T۴>@X^1ό^])oinʭԟ:oUams?\ G;Nc ;Q/7:j3Ossi3iItBn"zQe?2t=i^kicH 4iut ^$sҹry4.X, 5f[#6+zϒgMK(2_k9XMy֗{-tS\)$r,-g^HVnvb:m<|F.IVacە/P{:6MSElur9*>W*L#:ʝŠ =@~.5JQH$;!/Ӛ |;ir4Q~կ~E'24D눕k-]_prу38aOTEQMcJ{ 9)&l DQBBϋ.*ɭ(2d Sy3@ϝ/8q4:BezH.{y`r!%K[ X[EU-+ieŴc;v.E J2I_cyqD[211@95tGq1,gHUhQa"Y0~!N%DF56N3%ܥ d Hȡ\ F Yo 1d^ 5{OFBc!A("l:̯j6>$x^U}1̫3PD'#1cƄ4X vG, z R>l̷!Nbį0 08>fkG=q~ ^UJV(x>[?&Wz[бk̥^V5m31}œwwa E QWvNQGA>? Aniܞ˄cF1>frih[Ў}qg)X/,o-tq%(+,#s̼X?1$B5)\Iֻ;'37斎[q;ﴌbf\ssЏ2ۡB0&ّHޯnΨcw2tc擺Ʈ,X 5x;zK~C&Kh추N˴Ueaeqt0\'w:0:'ݖȽ.tX{W;Fߗ:5IYheX-p8BF2!y@A`, o$Rno_$B|2l6)-ۘvbIJDv?0q;<$#-*eL};wxT8߼܄fuRA&C-2ˢ[B 1Ys9])GDό*Zf`Urͧzޚ;quZn,iz l^t㳰ۮ)!!#Rjw\HFY3)6@HW>"[n/%&@CF3ӧ)uneGQbh.Z26}.M}.8"e.fJaxUn-\rհcWGv:YҬ*Ch>(r#W{?1~L1eحn Ɲx>ao뾣A[L e1@Y`0c$Xg/v.1y,&78q=\:rr.$[P YLgAr'btBLG!d=~-D-jFH5Ԭ"JGW(M,Z&OIGc~ce3MIBx0vMf3 }RA>bh 0p;9lf(q*DA3Lt"(2f zc~N-?:\$m*!W Ovz wq=s)4}P#3 ;z|]6wRiXfȡX^p#dz0giNP15`t縥L3wGNx uCY50K4v~7mLq_Dg 0^^Mng[~'/=kH>'4),U7GMbP P:oa%.jb[h>`Di<= #cn WLdqv?Ҷ0 ~cglm?dbGܻ]ђWUD深$NKʧi@eӄKxF,3. JE !ԕ1N0@ J1@{g#K'ǁiP7>LJcNl>' N1_PO_p,{}sAFAq }|;ő]QzfJԘNwט0]ǎq[Up*ވrz+  $ ,/3[cp0m,gt<k43ȘYLǠaxT)Šnc Q=[ʹK tjT"s`>gw_!۴`\F˔N_c5ZR荋{QD]Pbr=S^/llMiJ&^ t|tu38پ9ƛuJ|g qb>K^+AX_c$yd^*7 |zy: csҧ w׽@ u6$$] Rnx~'/H3'z.|ˎ$i'#xyJB7,A۲o'n7%`T$*"L":N˨q3U%)ND/0ij{>Z]Y=Y`SPBFrl']to]n4UV+Y^qhb :LJrv_coGvl̶T;E{xo,ꫯF,PdDOvUz~ZEI5}̔5kP.;saL8<#-aҒ=EZpZ(c,noOY.#[{ m%jށk JS W>RmwǫmZ (XQ NMY;hxl:ް{ 310a/^m M&Kt(7_fo&e o1*]}dĻ"*9R<wE^k HN Q ^Fc' J 4fVSI.M/=!0ԶG]qbq%v|[r~﫜D bAInL8܂M+n9>1i!cq?%"C8t87"F |&xnZLlqKk'yCY&d~G>o_%2~g=$5)vpk'qZ0rь(1yp" @7t4o*M]s |jLP)$b L߱!wOCԺ;0]<2|X鉞M7QPiEyja5I}'Kkv=a˭ P]+-5J|}b.;[d .7%8QL#.ؤ>`WuYlZIb2CnTLm}(hAƭvvC}Aj8'Qlw{~[urۄ=7-njw0|˿OV+ai0\XV8ϳ8KDS|$*.yfΣUw]']Nm a^🞓?mc>i> z30w RJ_ײ%mxl4}}3.:\2tI!촔ޑ5̃,CFmX"`0], 쨌7]eym1ǖ 2]٠;,뫓S'/eppp rGR&ĸk^4n?0' ~dJmCۦ"TmU8q$1}P4e;Ta2ǿa1%!Aݿ'cnlXngAHFx]lFl ʸ*zZ=g?s$3_|88 s;{C<.C;@$o]m98v)]@ﴧuDM3 %} єڐnS<$n3S&isץ@dTik'?ɹt&kSCPElRO N}(Ev8\A(BZdhq@C; |qjYs 9p+0b7u',V5>+ez)?iIFzVPu7 i.2D` 8f2do7<9e*$ļgU~R5VK$D@EE~8^c*Y,O8:OXDeB2p!2{H#̩0:bTTO/Hc;_3K 9K"34A]xr&mȃ g1 He`vҴgx%J÷sQDԠ跌0 ƾ2/VEk2Ɠ=USq;/"?@mqON>rٟ傼(jyޮȲr``;)iW"^{`yqʊ=J9V#e~9P\?'nܼ*ʐI]ES=@hlZUFEڼ64,WJ )!͘=h߄=<u+7hƘeHňOu>{)4rlh{jJ3! {! 3Dy\{X4x^M^ iY liY-,C6E3z5q;oMs丅6 rCtO5r^8նᰏ *")a 3uۃyDnIi@ #SIZr5q w1)O3*bfĵO~ί㌙miӲbnΠ-"_#aq" {Z.4-]',|(mjV䐂\:@:.D1)v7zYAF2gsY sn9|{4 ΀dtGoO[Ei󙍞 #WˌU.P0#_1)GXHm047wdP"oDB~79Y32;PƇUUs^:ili:K)yH$UemKǰ?p.b cΰ7#L(Y0 C}|35=_T]p`y{N=͚r,$l.:D%L\f`܄Wf*:k'-|^ ht({Y VaF ~#wwٝMO/Yw>U 'zQN܈_*b@"S/\`ɤu8qozN-fx[^x;eHF}ƒWy ]t }_{=gORhqZ'XOfuS$L|2biC-q2qۜ.(Li6Ngj;f|2t͇jTl奲 [.k=mlҊ%)E oIaT_iFt0g:3̒ ڿi'e(iq-覤LH;idڣmP']ؽx:1QK)r kQ }Æ-p-`" þ y L#䑍}Wt<Ե6#e#L/^$e s;敁j`3~edOqv#l,#@820OO oQm;C%\eF`EǴ-Xe;߄mCDjL]`,uV@TyاCmgėuy~s0 Qks6|O&ףGC0qoٰͳuVD[$k?k 1uQ*MYL Ȥ0}μ:D ۶+B-l/aDE O+wa&.㥳*?ZoBS c|6nmƳ ląGƑ?Cݬ0sp-+JV\oqqT;K#J0h|ePlJ0ǯJL2D*2x!•0UK j݋jǶt;[޹j?T~>q('y ucFJjjB#m#xMG3x'5.=t3վ碠Y)d8A .Hs>SC 0!o9#TUJqSiO 4tkt*p'q䜢y@[htpL0p 5-RW|{ebs 8,ʢm93\w/aHƮҪ,[ϰA W g1mdv#(۟³eIIQض]e4Z̀)U%Pu: LId]{÷y(a=t_yl#d)Xh> 9wmYu?iDѶW3s?o*s0E;X:xM}ٓft~qVD&*/x* !Ik)fٽj;ӗ.#.4;lsSsR-jk1": zYR*G Î.lMćHqS5_v-IvCSzZMgaH,zhRu%1q@Rȇ> 2O[~F,@iۣA'% { #rcѝDadAu\BeHS ApC<bov|k t$d?\M K츠!9j>9!+s{qQr[4Nj 8kʏp.k`%E: CFm8yb3:ha9dzfـ9o8O'ұxayKv%]Ԋ+CYwxGcn1}˖-ЄOi91TdFq'QKw<Ͽ 0g? U Z #|b#M5KթvgϧMdZ+FQ?BIee cÇĭ=&c1x!1z!o-p< dώ]ʾz(LjrF&Ma5v9 R+IF^4f;q'-ZFj6i8Tx[o]Cՙ2U܉6DpN!=d@h1e yfv^[u8s%tYF^q2.]x4ޭ EKA=r, 6EYa tÍ,_w}ɍ' ~bI[=M|3aۭC]'t2B^OBk&+4ЮHxR#d[ 1= b` %W8ԟB •TۄB"ηrlCV\4R;<Ņkеra q\ ـ!+$T>_%8YX;f.T~h3eZzr?id^SF#sJjD$v}1u OfEHM1|:%ܹazʌ"3UωU=%d+UtCT|v?txy0DVV8@ri}$hR1&gLe/B Aʹ  >baX3e[8pǻ@K8jia?27Q{m3 QM^I;ΑKǭ+U ,mï+&Ro tT| ը ` acIs/1l~( ^dm>8[y('; q^TDJ?zjInsBn|$;#ґ­?bq`=88j٪ti*r&0NÐB±*o-X…\`J+h8zqr,(]9ZұO+`sB] 4>D7E2qr2?"fF{tAVʋ ޒ|x1[AִLouWm2"J5w:ƌ'#!,it '"+(Y0Ӏ7Fwm(wɯr} 'qggͲqgSr22^h_ye>9xˀUҞ*?H\YlPw=/,ɬT8>Gf|cB+Rn$U )6F6ֱLȂcfGK~S'+tRḚ >V:b6FF>ÞQ(R;K gm]TMH'%5{1 4 pэYn$]"6x0u++xZ(Dt-r÷|!eo<=U~bGÐ3ZKoů8M|.Cᑤdls8kxc a<$xhy4հ/dTjOt級dx\߰ ӵ~W-c,%7/Wܺ3g543]/ >νY({al:,NhGH*c){ucG!Id+(F+܍?P+?_W2B˼($*:~kz|< $[cE^4qyYr7܋GqHc :y3竨D_``.d%ZK^G;Ҏ/%.Xmq?>&JNk&"SC'/| Br Y}:~̸A ,hńK;7%=LRDhVFt ~v ;on9ɀSU 7\Nl |:Go-:=pQ'7|6NwC-4j:9iC4N_qc" !c ٪Fy)7"WSo"ۡ H&3| b\\7zO=['t2 C.X?vj̀qI~_}9{F k1P,1f!\`Aj}i/* Áh66M{$qr^￯wY56yϗXTe ÝZ_g^Sh=  5Z[լ UidxKWBHvaw@=Gh 2A3΢ 4X|a83¢C\ lZMf(]!Y7brKېzHQ\63"LC `ǭ<@SG1ũy=z}sى_2h,}>n18a\ fq|Vd\PIǾ W2ueyҀYEH+kSN!];YRVcTی$f|!Y9|o#~ҝ|@ïϘנs,BY.x;~ B\Pwx"q}Fk$0}Q/Lgs Z>|5D0ؓ5s6GYPCpK\@!\=w$twɣw4rynJ'nbИ 9`8}} +AA[ሙzu2DZ$V\͘U6YR]Fj>GۄEzmv{V>sC\Sv}|$#!!/׷ kI}f*kvޔkZ[@}djHkPaܢF )w*Iv_zK; Xrl#< ^M۲5]ǗÑBt+iDo3 / -r옹cWzvƦj-⤃*}/JzO]~۫)\[pzgvA<pg2ֽc>gŒF%>a|msK[Dakqt٤{n·fT=ʞە*!ـxI9D i5Ŕ(dgXal|(P6CO(,~65%b/c $pd㳕R'[8LXw{8_Cl^$UɅ)5^ = [yϤ/B]~F f#IO$Oҏ~#1ZO_ c@`0 J+ƄSfo7:\sOK,jPɼ6a]/Nk|_Yzndx&A Aˊu7JwNK"L=.T`,-+͇,3D)+zՅ%`m:?߇9tr!/ftK/|&xn"xۤř\SɘXT | VPg#kGEFLet"}amc3Aux`s5_B0桯p70O?E 0hov-wڢbOguU.!$P @MH< s;Dgӵ%E;!wHB9h}H88se+˽ $[?_D"/F}2b.]eR<;}q>BqAhBo&zpG}bn{a3_^ #}:wW@nwTڻk 烗{-T?/}Kduq{"KsS:4 E x>D(岭rUOꙛviL7amAclg\$`1`e|mɹܚN!-0/j"ͬ@NI RŒGG^6{y%\8@8%e%y;"k]j 5 73"n>q>7qA|/}5 unYI+N0VQfl&?4Jl ; @54>%XTHBX;_}8[й l^PWC\Qa]tTi2w4ahӘ.c^@O xsWJWO:WxԜէR_cF,(_i[>[,~XECC PTkٕt=bTj΢le_WYΨ7]?t P.(X]Ш>,`S\ A؅rov+YQj߬{$tai> iZXUhR#96t'ST#Eƛ]JJ}XJN^9m l#d!] <]讨 ϒ (nPMaơkٕt甥2Fcm5USy9:/~ر]\y!4CZNI\Kʐ| fSx+]q뤐Q7`mf ,-!l>,XkquiQm'Wۂ p0?x+]i iˆeg'(]㉐8( oYwBSF{7,{a<,* ؜_i%SL*ɐ5[^'vԛ>YjAenֆܕ뱖;y}~x>DD֥a8\|t0 A(ezWqd#䉉_>k0,@5JWzuV.2J,s뚉SWҕ>iSbywEc2h95}1ϕtQ)]戽{B~_ZKNzxūJWQӘAኊ=Ć>N8 ҕ94&38y>|| 1yWҕvR>%p͝@ ^H3? \Bg\JWҕt+]JWҕt+]3F?ɑ~ endstream endobj 77 0 obj 63369 endobj 79 0 obj <> stream xWK6 WzǦhnCS۴v[4%YqXmE~Y0~8esލ0?/ׁeK6̙l Y٬D֠kWx7I"YO%:5ڠy{u C#WD$OQ@=y{9|2@BD:xe@oGf#Ի@Y;ւ x 3 ""Dl(ǣ/uLz5^ Rte{rl1,hhL+3'moʼn$~YHLm0/(dCK5 Nbo9sb1'd&#I0(x-U[fci*#iÃ1"b<`TFWD b+%1uH)]Y:vPmZͨhĕFـ%HIZ-ޥ«XLuV*7zP dqt ./(Z!pߥM8Ɇޒ MLVTl**RշBЫz\rGOY*t>€^qj2DÉ|MQ%+k*|kdŮsXE7exGPO|LfӐ:sL,!POI$}Ru> stream xOcR_T/Uf0ӉJ$ `v`cv11`}0}Q(= J;>@ߵpǕW3Y#YXV]k澍-Vll{|W?0u04s4:wzDXVN3kU./(Gf'{{ݎg{Ap@'O'{'''KRiT.զSӥ?Yߟ!-`y1#s`B HUM!;?)c\:s+uRf]HoufH.םr _{'iogpQ|[3\*Oz䞂1O;wq3evIouBm2*9 CV95: vA!V͑ws?{ EXl Y3-'=E1ڳ\.әL )&Etr &(.'J6Jd;Cjgv:}ΜAh)OɌt]?ogÞMa_w(<;83[f;Ud# m MId4Xo!6XIB+EdmV{Ԟigv;aWkWᄫh]<)pv[ -]0l2sMm8 N)FjptpQNL3- JmZlt-ÞeuCμQWU8*v<  ]ECV-QYB`0AOm+kLi4(0fB[VԖicvX}Gް3 +!+Jfݥ n΢!;8>>ܹmI'B48 $݊2j 5ƴ:#A`$6"ElI,VF5esFycqghYƀ`,Qh$jNZ.+ sGyrg$BѴ fx4C3@4jpRkn9B\K>՜zAh d*1ѤNsF%ג5`e ٲGlcqG!!CZ=$&WC48 :1\\Tjux9^pNhГDz@m5ҤFz)˜ca!k-g!w gsǗ)gɕgWZp@Fli5$4@O\Ijx><_AxЬimzi63{>sր5hsjSr&\s `?j9突2u444FiBA#5SZ)=00dFF1۔c5_Sy׏hp4!ԩ"EA"⮣LPJg5밥k⹪*\TNVjOS5x <#"[(-:&EӐ.b]Z5)p8 u"UrL3JNs @\q=rERHUԩh8MkE4DԬ%-7>#5֤*dNb2/;rN&(_6g4F| }[z9ry' JER"FWT8*U7\`# o]Cb"[vǕŖ 0AkJ o]>)9bGʓĪZE2_AYeԭ!tjtgƌ3*IeDH-$.L0A_U]Sދ-ًqxaBaBQBK766.jߌhǘ7&";p;p'h'S[ًǕcyFZ0A1i?l$"w !Md(إh;x;`ĖG7LP7RjXmFoFoE\Q f 8 9O{eVòWruL޺RcG?<9ŜOyE_f!?-> stream x=K@B7跲T):tХ.⠋.Hbb DZ[C˽^kH$pM&п-t nٔzZL5 ( K /> stream xWScGFC1(rP6t#XڮaV?~DEEEEEEEE5џA4-{)Ujʿ200}rrĶW ¶X̂Rf۷&D2lˁ(ϳ@nnn^^^Y!i?J!MhV|MKKK49޿K}kkGյ4Ba=(XEnooI*#OX&3/_&RiŚ$zЉRJO_ 22Z`)]D###;=I ~qGůk+`xxQWt}}Mc 8MNNZOS~Q;%'A'r"n~Bl SSSk'iG݉rN^(.;;MZ(asssi#X;EO?B&:xqDHN"FҾKw SbSBH~)hʼndA s5S<ޕ'NXc˖aMaSO?D;a(䜣JbYJ gAdsCx$ .-;5&ȭ[>`%[悚Uo)Z5QQQQQQQQcdyE endstream endobj 120 0 obj 1401 endobj 121 0 obj <> stream xJ0 La8N6Ȑ@qMmfiJ״MӤk3;DinO9_> stream xo?E6( E"hNlMA:[8ro%YDmE$nDq)}6KQedr^ 19ܙ;OWU^pJIZbiF1,̱<8ΫTE#+%uzwOWO\%A]UZ9ªs r)of{y)iIc۰ S->-ai@m8 mHKT?K2B_JZT_Ufymyk f%Qs4WI󔴕VּeW-XB+藫eIIsӗE zkfkL/$fiVЁ5L!~ZU-$Gi)"EcyqPp%'uQXuUMjS͏|x%/Gho-m{Q RL:͢Psa.FZQi0n`św o^WshV@E U/>:VT?Űas-oa>&VS Z:0! Ӫ*̢hمEetR*cȇD (ŷ7[ygPlXǔ2ЊV&cm=V|HDZFQY*4cy/^|EqdIPDmNyTGcJqZI"e rD׻T_ykٛ߁b+YńBs#-ޑG) `BCy GPDS):C2Fn;ͬj;q̣{~SbK[r Fp4|KfC4`^zK hA2IӴ焎箤A`+.^q29PXpdH4Zkߦkw2{ ʂ7tOM&ۘp{5kmܵ6 `>w9nr$?dI)wxL=wgY6}H$bҒ|ò@ sGIOđ|z͍dfڟ6e_6J-N6_*╯D?Y}!P7>8Ji0!־۹-++_ǃϗא9j#qXP^,ot%Z2Z+9[k@/;p2;Ű,)^;!2AvrnCp!,$+˗| p8Ji@O? 8k_kPH@/ p:$? !ن3A4n^·xיO#>=It񿻞82l&v" AB5*w&Ŀv'+V1%G}'^柘ֶhv|G8 ?AwQye<Þ5m,@ptw?q>]G^n >w8kyg)CܹR6.蟻Kc/w1C?T 0j?`v=滶~?Z3: zɤl6 ;|>8i5_-a6Nt.EQ௘co[b"Õ֔ܩoV^OJ#Nb=-I}.g_5b͉vTtk]_wÑPHu _bs{1CUQwO"[-b?92ZrYNlj+̾O'#}C+,Agv|䵩͟LD^`N%w=O_> phƵ}meeOTlqȅtpx-n_Ah7/^cͽWn|}W7u {ի,Gkzի^ 꿇?V endstream endobj 123 0 obj 2281 endobj 124 0 obj <> stream x=K@B7跲T):tХ.⠋.Hbb DZ[C˽^kH$pM&п-t nٔzZL5 ( K /> stream xkL[ԭ}I(@ȗledҖuj4mՔ&Xt]v M& 47B\ 6w̝Q%\^1v2:<9Xjjj7(`:v8: xPєe —8jh;EGp3 O IM܊S=2 1P+1P1\ZMiC5']e` Ji\1#&gagQE1ze,,YX驃E{nSR)a.t0;sOw=&u,,YY8YTm&,t4bgI6nAGhV>xxxjjjzzzj^=544t*[q55,<ܻgbYBm 65W@B5ЩQA uioScZooocqTîUr5jWD"OI(`Q!B *STߐGҵFFFwPUs` *U(QE[T$G(aV"DJ*QN9R俬S2J+aRL %J)Q@rJbQL dRV G| (R82B_s/aTTt3ٟKM b10 }d 'y1Yߟӟԭ@ ?4decIy_BV>ս4fg瘁4X۳%`yDCHFz425dɋ-w¾#-L/쟙hd$ƼP}41 pQ6딴]6ّcOGJPF1PʢBّW(dD!= 7hP}1 H"qu"}ّM8%O0tUvnndD"=iX$&!oEV\Y'['{]# ԡNl PmRfoޕmOU~"m5N&x+1 ?n UJ_WWvOk9^]]MG7㊶7`3Rd_z 6PmB&\ o"&܈܍ ,I=]p:+83Dqn#W A$k/9e\tK?.8\g+X;#FQ\;wn7 ;;2L$*^#8.d^J._Aaa< O] u& (ݧ(?k:Br{*#qє0uf/nI^*"1 o.y)wR}Y3ƣe4IYRٟ)YmNWa3ػć?N^FgvEZ=12d|W\}=b8] 'q8|z!%m?[ں?FL1ȿWH"%AuK/vDO_^xetEZUյZZUn endstream endobj 126 0 obj 2368 endobj 127 0 obj <> stream x=K@B7跲T):tХ.⠋.Hbb D/Z[C˽^kHow{xS|Mr;Rʚ %e33R~-᥸(EaRO.nM||uNh[ijhñs`(B K 1ΗyM endstream endobj 128 0 obj 300 endobj 82 0 obj <> stream x  Om7E endstream endobj 129 0 obj 612 endobj 130 0 obj <> stream xB@AA$AI$AIA$AI$A`2$AIAɻH iYH iEHZ iUHZ iMH i]H CH: SI$]t @I$t @I$=@Ic&$= @ I$@I$} @I endstream endobj 131 0 obj 362 endobj 81 0 obj <> stream JFIF``kExifII*  (1 2iNIKON CORPORATIONNIKON D3000``GIMP 2.6.82010:09:05 11:46:03("'0221    ,5050500100Qp>F    !N @# 2009:05:23 03:42:122009:05:23 03:42:12$ ASCII 6bf217d8b41187946e4a9b9e18b0cac7R980100(wHHJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?[浟vOiY?`[yK'c+(*+2 SSZǔ 2W=G@hM|ُ]qz(?֑J(?QytxNttR 8;OʿVj'?x&B~=ڀ<ʹO\^-}8Xmcb3V-/uS;L0 ڽ:8(#EDQ0p)]nΏsk)CoBdC}56Sl.0ֻY/Oke _\)ay唷oFcќ{20h ="XǫEA+Z̎vz"b#܎Or!_ƕ${n ݥs|>Oj_+x# 5X嫝Ǔ־uM{Lɉ0zA FB L'򮦹_4/x| / W׍kF8Tϻ+(i*u EW 5&XO>GyO~*QEQEUԕgݺ~'ړ2\7?,vx}E$f#u 8Ey~'ڸ/r7j!VPᄕ2zϥzJ"ƁBF~+_=#,Hʃ΀2k=Nۙ$yKqoSgޢ r6HF-. gH!@Deٱ{gwx+(g# oäG!YG%:m,'[qxHNIUs[۴R Wh/5`moB(.S!Mr|OB"ױWxzB*<ֽ0pقqΟkں#ZI9vvZJAbT3Iz[ڐ@Oow٣9u8?unGo-,/y zy::٤bE89߁fjQ!?QҹIg~q9dIIm683~b6R3#˶!1 TPȰang\ [p>6C,r'ޥ[y n38t-@bss,=9l3aG_jX17ImaT8R(U՚ܰ݅?,2vEN $zx_ʖ9c74Z;k *>؜s:e|SE O]5}/|K]y{X"Y{oխd4asY"`(Q+x8e?2Ox܆X@gր6Ժ }OT05]k A~dt*-hEmp JZM׮4߲N'kдFTG+0.d(ႀ3ӥz_]6Ox ́JH[4lo!eEAx$WܐKW?#y;Wg8M0rGӰ+|g w~=Hdw]RJ lTcr9P+j hby#hB[KK"|xnxͣE%B3 ǡy377of@eeN M,G'H!|Nrjb K1p}Cv*ޤؿgq <STd;T]$34Nqg8 J>uqܞؼ{ld+林Q@H& SW>4hX|sdudxKYFH}iS"KQK וx–C~5f+搴W64U YG=~u6Vr0cGkr!u`ɲ'c _#@=8hlcj1;sYuWrcyF GSu &̊ar ulDzZmf[ vȮ*GP !bcZV֡}EɠkaA9so}m @̪kڸrci0G/8?5 (tOi&1P7 sҴQjnߔЉF3=:ڼ;+WۜnGJ]$km;=s^_*cSZ껕*`W6^#[6mǡ@cC)j<.Z{a]]>ֳƻ dg̝G&q2 p#$ϥmu3NAƧDrZFp叺ǿִ"}kk{t*`ßt *9k†;VX`pX^*a_˘wq}-¢<)ߐzp2QfICs590¹31*F{ڔP 䚢*>IONga4@szz}+<[+ONc}+ky[9f;kX|YZ~XDG3]smile€3ɯ fM<N44,K,rQSRB@,/̌;Qu~f72nOHIM[ҧh X~]CoHbJ̎`$k#Ύ`\wN5;%sӷ]:#m z|+ՒT`"MZΏx°C+@#g>ijMkͳ#$ ޹׵aj-L]'Y)PlFu'b.MRkfcIQ@@z'xbG^)<1@⥰k+nnaZhӮyq'eA٫n$3;{E*(yG?1UӥPr =hK0aF) )@nhR3M&64^S\,z i:T+'_j;/V/RdcQպӞwb9=z7ÝFN`Itn~~m(Rw rԿ"d!4 U 7'OJg"Z^K搼3ԓP1ɠPEk:NJ 4$m/{aU`vӏ=w:߇d KIP1/-x;T i=)4)FGq||9r~[~ S ܷN(#B.83lb|h6cq#+~UZ,$am~$h΄r{ ?owxJN"ab>}Eqqz1Wơ=-F yd#vNF71F}Ea)\%|,~5})%xJYt,o6-*cYѺs*H$1H =AHHKPN>\noƩaI9'ia5_۳Ͻh(Ug` 18 hqHY_O[I` ;K(x" r?JOxV@!@ZqN£ss^K q6ӣo ݰY!a4NO#=qJ񶽵8筹N4RxoQ2[iP";On޾fs[ a~FxPa?Y^:JZOV)hT\i ޛPv>M/LOQѷ_}X?Αy9ok;J5{l1.MSI&8kLtfTzO|>hCjh+zkNK. \`KdWϞ#WH&>Wޏ=~ Iޢ=O^һAceϛ! y Xa8ʒ?1ֶ+m3t Ǧ1Mc4,?zif-+1<}{y<$VlC _1L1+zbE6N(CJ(qdq@49sJq;6yB?6\~[F|Ϸ[ۻkH$Rma#X}1G5uCيK.DxQ=Ő-7cw5 m'ȓX@}u@?2>3\ҠK2wEsB3{-oRLԮlnc1H@SK x٣#9x-,Dz( Z[9/5i׏h1 Y{g" -epG!#\ 9ډba :#2)6<$QsS EW2Iǖ_vt/[f%|HpR&r.oocɘ${xba\4~ H*Xˊ\XXAn1i|:ǒ)/BXX\Е?MPxЭJ!#+R.X}<4W"Ym@R=Tk>:t&մ 6QNmBgU=*5o| 9{҃qbݬ%P/t Ȱ)>)$ֹ̡%EE_I$f1mIxiYiIo @*Cz)E}+a EUzJAϹP ¿Ly#WKmLF6q~MÜZEWPG o6 co%T^zm5KѮuGGPh+3>0kKW 砚:}<>YwsmWxMRw)yeOiΚ.Qi_S3i"yޡURP|v,4<} ϡfz˱Yreyc=' GEjI2Ή y??bGN;R #ALy'E 0Gq!2^6m9JS FWa'*eOr QZ^^u]ZeC)7宍{<[:× şKOzD {vlFVO!oWa~`{1tRCP3I=1qrx7퉒tS F@F =IG12cxFi#>sthWMQ&-E/dˬ Xkq=.n z}c a.~CtNZ3f+9뾝DďGAQ x̜p?"p?Osc>aB"S)e. ؃ Î.16.uFZMcM,`:7fO&i*[`XtU|ĝ{q0%wx }c`otF`Z};ߙ(78PP5#0G*S|־1(&ErF̓2)F>*86*FK$VYE,E톊vɺ[5NuTzczW39f95z&x6nGlcy[YOSXs*L.y+$+(@$ V%?IKHak\1Z8 ==UeUCeZz8b.yՏ6:#smi<,ܺ *3l-\hPdicwuPݙ¨yƼәmFΩͲ NJO6At}= =%rQ #i'ZDk%$RmWu0#Ss1kC=hMi 6cHR }=wYQagh&OX^A|۩]I4WP‘͠6uWSF':z7eĪD(*-bЯe=vk:#&EԔ/s7Q:P_RVT* 4 j>^ tͺVyj:R]鈵Ĝo{Iɛe{ e0.M\4vm;q,гSbZ ` .7Yt?M}?L] ;4yRԼ%5dP4J*em98^|1rj^TI  O]<υC"?V.7IsK2u2L^ +fy^+scqAΤ#nAZ}7SW*߿&d2ȺšQdzZѕ K5 |QLdvSYN|5U>U;`}p Ĕ# fU՚Wy4;3Hq&''J3S1Vd4>Eި=0x2Ve%L'z;.@ LRÿ(_ǃ< yKyfwzAh~;]u/U)P2[Z Ȩ۩ LϔS|o~'}*|?Y>eʣVyv-q[iꞏOxb7-6Z_Ӻ8rm{/ ddy&IeCq^(Z_Ի斧^Mň܁l `Mg_92PwT1̺SU*86 eǿ|U'DLq*UEUudpJ:"$ .OT(5nEtTʑG%n$~ 窉 YjҚF6t # H\A^!s}5K'K5]@v44 1gNHrL>Kߋ"ɏ5LMC edS;P j%f *XԤ,IDIErpAo1}=)?1Қ\yz |=,EvɩɈK"Ssc"Ǝ,OL{4bYк$T۵!S}h{ǣB{h*/z_*Ŏ'94x`1Q4877Jk\i0xh9CK x`1^zd_ #Ji{\dt2L sӝ) M[L(ïX[6w"E=1lvqc (Zpv2QU##qB?jH'ʇ?`2keypkQD-Dn\ҠL*?4 )iGjh BGhb`bn TvP=$A3͗['Ǟd83#c 13p`=<0c }F3&Rs, $#NAwZ O}gViWӿ]<$*sPG&cK%rh#ۂgx{$zrVjOS4ՙhد48eަ|A]՝-SӬFoum_IآK5tVK$+ -DepaS燨+o-Oԥve2UlytM;p+A辜d[@lGiG2Óܲ,y4F {mcd~|BfV|B֙w'sJޫ7rYGR m\aAPECBtBNi.? *Ss+,T(y !Y HĒI$X0Tsn+f1йаܲ Xu7BPhY-/dSRF[>cYimI خ7SHhZMU䍡mX۷s胮EGoDb/Cm ~)l)H櫫q! #߹?L2lĎm,zc6 ,1*p ܉, <&>u,qI9y$Î>#eˠbqO&x-ՁUXw`R}7Z7r,RctfYmbE)S668g ŬkKG+ҙq.SdݢNEuX*-D5̠=/}}>fnevSEI&sEEם: OjTh(y]5:$NnZk[/g}iu>ğ0)%I<*!G! ɴOdYM(OeQQqksǓN/َ#^$ugM&3)*^4M2Š+˯Li=3j]=NdJE>YGAHU@yiܱ:KuQe,ЙpRﴁknm ꮥ6Kj,Pgu CWC;#N$aF*,-V\~ y]gLfԅ3KW 7\cǪgGtI zk)W3љUI2D^B. s_y0` 0`4WR|?WQFX5U̧dF+UXKL7RH8HZQU>edV'cƽytI}<ɷy2^-ϔX2ĹbhXXCHXx A|^Phh\啵|بɳ-Ĉ^E3,r\ŘQwl% k*G:wlOMWO5k#ˬE9rA)QL[pW[KܳFuIiɪjڒjjoE汬al67@mm7 1M5mQ 5AV_-Qj(6,%eNG"fNG 2      ꯆms亱KҲ T  ,6m) m&F~)|:K=f=ng4|\K3FiDa0`JYlrʨMQLM~M# 6' )4 ctrHUa4T:ί*Mt UU:yX#A/?L JGKğ?3"uONk3K֚cCXj1lUFGGz9b鼐h&ӟ9ktYEQKPlR?v*M'4jcA|F*g\j=%B,PHb#ooeyIrlNnGQ)r̪: /Ā('`0`0`0`0`j}u^k`͵Nҙsڞ<#\kv 1H-MZ@:}eEW͍Lv7PS١`-MJuOY"\ "}8̲EuM-h4LᖢH%UE[:gB:mW ~CaR㗯t]4:I+ fT:ZYD*2TPX8ş>rMESVeٝ*VRJWFn^ #tOYgCCPjz0fz@A?5fBL{]}5`[:\O 4)$McC]@'s>~PEG2u rC,~:Jkl;br0SUAWA",V1Qy,mH/C_ޛR,/Ԝ3'a[ʬ؎ccDÛظ1u"y㑃 0 0 0 0 0 0˩V(V\j hlh3 Ark+4v6+0g迈QtSZQ4_k:u (?TfS7%y$=Jfi>eLAR+ԔP &{8 ͱ̩i&e?&bZybKe:0›řjP7o\. .Xz=;fzSe )^ ͍Ic}Ԣk.FZK]IǢפPL(`H/O1đ3 ؃{nsI~S_IQL⪡Z\qRp 0` 0` 0` 0{c@}5*uFԙ^i80'q rq1  U9$Ь&c*('cNHq \iH#SWkIYLrܰWSR2ii"H@CX"ƞ XQ=:szr?kj]M9X JyK۹BHgηFzh3/jCjH~o-}D \""XeH~"Hrh8֝!|(sZE%s *hʦEݳi|ZeTzJce<39rzjJ"LrA-Ppw`z[#82QA6L\y t^Z;Mdy3̣7NK.Crddumm VYgҹM$ƨ5U Ub53G9[GAL~|az"41C4IAV;n.tRx2}{;|0I$qGHPV q8 :ڸDR ۹7~ЧX$~:yI<=M\RL,rd9 cs Pݶh{$C{bT>*w?ϥ4tf0p~      z>i&uս8".uvF fT`U*M!]Px0_Fk)_9/L,n*;#         3tfי<V9zڑjFHqsi#*،#}VԚnkZs]1VA òγ ּ9  d/3-z 8v}S-CIg$20$mU8Z>[Oiփ8*̂/Z}.;6#s=Ꜯ$Թ6U2j)WgY|Y_R)Sk# ike:t7h|@ bӎ ax(Ӿ)zehv#hLՍr!`7l,=G]剜hE,E 9]bT.;ـ8  a>!!֝v%j2I2խ\19px.Tʹ+g=1stWHɩ*`2 j cZ !F)do8)]:u3箔 ;a(]CC &,GH-(GjL@eOs|*98SfyKS5Ҙ=4R:gP\ϴ+Ⱥy- NϨ⥔JI)XUl"/8y6EKY32q8Hc(#p&9p7FQI3S 3VZ OʩQP)7yޔeRCveXzaهNMi+dOF0Wr*ޚn6b05TS<Y42ʓpzvl6ف r6؛`y*cw9,,:Ve4)}m,DEnan{p Lζ,Ih+cStvWFUaߦrܾM5;ٚRsP$t1.@>ʵ}vqɓg5&Đj `B8L kmoHrٜVTCOVYg(jmP"M7FG٭v^:D~kE<ΨjaGFhYe+pԮ[12x|J'='m]5J)L"/UK R?-Go'3ԔRy,R0/ij٘zKty ws9j즈 N"r>p%NKA4r2,Ȓ$n}A~>22yv\fZy}31ʥ閡`OK1@R,T<T~1G_)QY"y-OW$A߶;=`.odv6<)8ŜKtoGP\]<< :h :9G#؜3N* ^$kNEo*- @#~ylENBJJgA9ϦֆU3DDr|:'fXڹdň͹pC/Q:39CY9*U͈/ttڧUvI$T4},Q[cX\uJV4Zn`لnw*P1xaZysYJ+A`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`xQf9n_Pey iWBirƕ+hjI"pU0#[x&h3jk]gLA;=<$[*ro#Ghl*!uQIrhjCQ(8[.CH&yK䙨3m/nvnr߶^[A7 oޠtk65H4U*t S7`!%geJuLR;ͬ*CZjzeSLX@E; PSbTRTTU,vSYXI5ԣ3Tr=;Kꮣ0k[嚢, jZ-7@Ef2 \B$1P|Lu?M\sXƭ.N<*Ġefi Ob֭^$:].\&ktR>yAS֩YhK5t* Zf%l?SlRZcI jWtL\*K ѰcM7ZJaKTh/}*tU6`M]t;f5[<1γ(D/=GtI5=>e=Ek =%fb4#`B̔sR6L'K[LOd ,<#w1e_&X5('Qf/rY\4:љ._ԕx5HUeV7T[Irިu.F"USӭLdԵՋ M۶}jTghcPWgYKA%5LyJiYYcbBh9.[pvgͳs-IQUgU9ÕQbSdZV%E&QSOg~i喅m;HYO ܆`7ٛNVg^|#kRNi7F3YM02D0PA=0̌gEk2Q@ŗЪQvd; nm3S=$ʠr͚>KJ3C{#7g zZP`t52%J\""gǨ'm|h,4GOLn2JQ+.M̀8ӲfjHqn8䂃{ "6smٽ$[{Y3YAxܪs88A`^ocQ'˧P=6;qŭu6uL]*ݼ'}ۏr 7$M; ۿ|g9Ne,oKtby';}CWGMmUBOsa.T8jXP)QOX^BRHas ifhˢ@ZG2*#e=[}Lxl5fub9dٺLxs|@`=VR ` 5QtdkHXRxeN e5CO"g|UofcE16KcwЎh1]SyTi*nIjwe%KdK䃏u&U9]=&_gQi U'&O[$J^6a: |[VQ>.LcRjT*6hIjemRAa!VVPՁ0=8`E0\R9LP~S ZIꑳ/d؛)%\mw 2:'+ȲH-UG `BblW -u,~ә]]0IHTr}K^bO|K' h3|AggTYM5l AK]0ZXOHw* cp`a O%qoA -+uV2$ږ|ـXx/])w/.h a&WكzyF!Xʉ\X~$Ϸ:=^}UPzw?NRu7i%P(R!RGz~tW'9&r(ʔRU$Mw=6oLSU.OSs5WYeY@=(eg*9LAzMy{Mzמ z|fzyK,Ibk>ptRQKKM%QeTE(o=zuqng~4jLlr}AoJ JZX jZXVD5UT??C<9c,rj9eDCL"}FRA6$w%s:ދk\)Dyv}{ 6 >q?3Wij!lb*BƳd+PC)RTz SƙwfTҎ&-h! l<ۆ>&[:jҙ&u]UQIS_JHd2%O,+wSŅ%Tי~HoO3o# W$BZQgrt<1n1Q*ys5w")p=bRԚ2^4W8x{8uQ@ED6k e1A-M ,66㸽|e,n\ v%8^" %I]wxnjQnL0E0lFJXpb݆t&oe|Ez`m}m`m͍7ZtY)MJz#{6HEt;?x5JhgC9o>aR:=[猳KT)HۺnYC}@4DGGgTV[>kIKB'hC[#Z)K%zGlixzY>dyVpǗQi잞MSk"A^H;K:':B꜏1{|'ݚA!Ma(#J}@cp.:G&;-o-y~a}c`-V9ɽRH7?qωIuP)7p3ʤOo141ǔjo~Vj1GW!.e$^ iAJ%rPy3I/Nj6fl 8eCΩs.x1d*.2Rz,={E NKUIϥM_h 1qԏGM-fFf(6flr)'i$obA94UbE3?iT~$ {m}1' lsZGbuϱ6oڏ,J f,Zߝ.HkrںzвGQDؖ`ơmbҬo.XMƛ]䳁;8!Λ&rlr7dy|FT\E4=Yy&zK$_!-{?[zl*JI$ -':P{1d2 z Y3PeSeelSBA=(@_^əV%&d᫩Q5 P\._'Jo,)IE8o=]M ,W8i Q,x H x?k?'½}jʺ6˖D8z5so۶i(U\tVM%Dye.M>aŀÚ0sdy6 eQgg17 i -MOr)㡋k$vp;cSu龚ͨj,ʞxavYX k{B]=T!dE ɕo` C?My~]AK$#B*܏I:9u BJ@$E?|]*dx`0t_r(ddlzr→lrC,C{xMOtl#U+ sk[ӿOK[n vbG8҉Ajc( oN4?QQ=IQQ2,P݇Il, aYKS5JLT^)< p=NӁ4b9.& /fIjj.5{]O4b7di^q}'~,3\O5c'x7]cn Ӗ_EM\N:J)f6X 0tާVRVeys  }8?\4'M"1%s|Xa]Y)ua{zR= M6PPi 3F{98IYNq^)%ԏԭRha5Q< abt_km/IQe9lyoUe;jfh/2AG"2,aq4)rJh ֺ]z5LWvGcyR4(kf95MJ0\aXͼOr0C]1FL-6*-?jiڙcޒț#B#D1nk pI8n/:ör,'3?\/̴~w*PY@MPړSC":U$ &+ߟjKX2%/ܓ+:Pj}KRfBndŻ~&;|' %YJ]ldcg~j %f2V* Hȋ^,5EO,GQG [7ް60yy~h H&j Su(@F3h /sߞ8OsJչ˼2#b8ھl'#$gfXٟrǢhGtbInF:m]&eM0ܯ*uL^ծ&R66b9#k( Qpm~ol\*$V 6 /l6в-=Y118jjXX!v]sư,ڭ*Aw0ҵ:9@0}OCH%\֔VU bnLy|bБ"K`@P5t Tac&I5/HG{*h <.(9C!tl9ҐVuìS 8fY"^8S*3 #5Vk(rt4er0վ$,}&9L:ڿfY~Mh4 I9VW_`{~8 vnU3IdcLAֺt+,Vlj0=k?K/˺ar6efj3cz 󸭉[ع>6Nx~Lkލi r캞"wG be c"G8v^t3 Zkz?'ӔTNj)_5`wieO`tn}vc7t|8 $}0?=.~sb0L4K#\ebJ.lFtEߜdWD{o{%OčSb>h2H&q]-̏.vECC ^TEw;_N+.;{)㥂wUw#Iq HRA&x@hd}q)&YHҹ3 ?{zP@*I{"ؼ6ryRk^6 QRXHn97-޲oZ}rLJ]?A03Oh$ܞ,yoN,cNSf`T\HKHTXn8R=oЎ.i:ju R.cg62,2mF~OdZYk֞}KĐNjx`PO3Ĭβ(,Tp lQUtT-+TE I ,޲=;\A5 [Vf\ Wjʜœ49wK+%QOJn܏3QEU'yvn81I[OQ$?`#L5̪i4b(_R=%ѕZJ)H8.A&gݭn8G}i'Z_&չ-j9#DR(UR7̂ÆeϕO%nuQO,M88[5ncq?Ǜ]uç?5ɴT6T߸1 zk7Ne5D$sq[~[spɥ-Ge>lKOKUT!rm@+^Ѫ wL( 5)JR;K)t I#a8_] QOJ$um *D&VQm{0iIr>h%C,Y DJk{w8 Nje:#!ZVsDΕF4 >aaOo8uKB3|-sadQI yރ<ͼ/:2[nF¿ZJ03 %5C"pw skGTPĎgJJ" #ILfVRLD1>kE0Fy"6lqoֱjH|7Wb@Go}Uzϡ1XtIavM[t:Hc -'?o˜-OoyT O%(un{{va eyr8Y27U_pc+z 6*|z\5HhZtLx?RzxJy+TYի p8a#Ϭsqo"0 _1dչa,K&d${\~] }Q ,sOM0eu5^m~2}sPswp@(Ӟ;Q̶yjkZ*hcifEWwJ>iYֽq謤2I3ͭ&(m`{!2|)'1!ܱﻭ_ljΰI`uMjy/O46̝qR!2](^3Cx}/sGUt[2AUUCXfpAJ@\r$;Xbѯ ],s6uWV|bY|$M1٩DŽ%|׺5XDR-ǽBB'u|j-YWqY9iLmǸf,؎i0R$%1xbu:wwpn6b湅NU O(*񽸸8ȨDsO)uJpTT[;NST|``]7;XzJn29sH݀[p6|Rf\yȕ2RmG43|2*>-F}GSL1R\nȳzd%`Lã55P]P`[+ E=So%?ʂ$,Hor@NG[i7p51jZM\y=.n~;55GIkdj3LҝVRW/.% 6Mm GˣzyFi+ ,HnyWk+ctV7HkEͯv=5[jFA,xqj\]Ԋ+ yYiBcyuLbd:I=1Sy}wPu'z6s^dLI%1{aq٥t YʊV8Mٹ~}f/$qyi"01y5'K z{6lENSEE;(gvbG<}1g{ nC6b5F9b F alWl*#jqpI~n,t>ezu F[lAdnXPL 4VaCUT ڡ|/rJ7 _-~عk=oJJYҢBXHD0gym20wbØB!#nM37JmoF-yd5Q\2X 6n|քS#"+nH>{MO1Z^ܒܞqLT}:.b,=̀6Au4Jm?y?rJJ^*E] صͩkVMrX;Uu9mT( zr- )7TI儔$cVU)c9AeP"#z'en܋o2V&zwsr?㖑nlR14Ll #<"k(ܑPڏ,$@H"l1$t,@bmǟ3ELLT\a`z=aF)s+FieGѳʖ<_tJo?Қz>C5}ZeYQTP3HHRq=6Ie8MԼ52{QV3 uUY0AQ2I,4 ͶA`+zREe3&iQTKVF{bfHߓB;%oX]ơp{}88o^Hiehm+Ef̙s.pzVP!/p$IMV!"!> ƨ႓hmmsjWeI÷8N:;͐/rjrc$T{8Y͖ '~pO<|dVO$(jokp8uSȱMPHyzڒearb~,gO<0P tB8n/aGY>K T-9hJP=Yeyt)Mmڊ9߷0fbSѯ QCk$}z*"6a&,]<{}1gFCE/Q2s{7vL m2f$A] OTEyfIwm5^ĩ 9a2L8)CU)I[CR{n$b#J/H2|]ۘRVQ0_+ɌJOϰneJM81x祦,ȫmEd:oXWPA "6RѫEy&0vK5E- IKEMpF>vMЭ3]VKI!hcqېOa8(21$&7؃ۿ¾]sg/gYk(q [ m<߇>ސʕ$$EHo6B̔pT %]HH w?¶CS'O:kO<"jWzQ& >¯OP;ȳ4mWg9KUuuVWȲ]m$ LOoWhAe>`I)ewB{d_F( l§DSuvE&`^W ;4mF}W#k֥^#/P_u&،cO>$өz)O:h<ׁ5U:3kϥpgyqܘɵ>ؙKS4A5-4֎w[nUN&e#:_v#l\/b&jZ3@Fck}p6m˖Ws02l,-߷lRfQh-U뮦g>Yj|1֐[AoWoF6կ:&u>&G3GM@jȨiv.#l%R ;>.Y\-uQ#j@!EsUxM^h$mսfֹ{Rd ԑIfܲCO8tUCVfoc5{ˑe9VD**=Er~=KG"r)K pጆHe9mO+tCW@20RѢSSQl,1;J^c[oe02̛MA+W? cێ>&ѹbI鈒:?MoiZgN{p?4UvF~lʺ#.Mc+<*bdgβب&[-%{}GQGhܱ7f)Pǧ*Iĕ-ۏݐgfJy,i5X7ij~e QrPZߧ=NԹsoO-9MÁn |9f?IJ>jG 4w?s ].Aq|:ULDNa 䱚ODbsM&53Qa ~K}`4tW,w38W 7+>I;9̪O"a|m< FHe Qp-)2ͫmAB.1 $,x^U J4'%Zd;ai=_6St4{Sa䢦qK Rǣ`J2)Rof$a,Q 0<(H(iڷxU<ƌ!"uo&Kf9mXWtCb~t0 "!iJZwa~knkQN*2] %0t,xoERӬ%`8 ڙXR0 RTOrvԳ˹q]ќ4hOo,j>P)?\3μ>G('r툃ԓQrO6wL4!~ڎ, iVU DM(C' I[Qpo{W*;alty_O'ϸt>#<\Zl)W˅e"{l-?_ӥ[e.v."bHn SppEUL<Z7 c_G*-SPT3:BRJ Y8Sͯ Nxlh66FSlGx[71:9zzUU}1ҩ`]k*\ k]qᳩٯLX.U;r~^;nEèVGo^)h'ZB^8'čMjẒ+4%|045U}@\_oޛWtS&KK]GP<#d=6?&r kWA RU*+!P5,sh. o{=zC׊jzIc (y/~I:*%Lw`rXǨ۶Fu)Zo=1HRjZH^':DPErtngQIPfmGAKLd1GTP{ /.i\ѻ̯Ӻy,Ȝ9J/k &gUJă$s"mpAq8Lz[_>U]A{$cŏ8eDi!)]&XpsVy&Mb\G *a@6UgOaS,Ӱ|?O勝$M=UMtsI4MGzpF4STPDxJ?3ΧfUkeZr[ʔ֌{|?BU&7\B4~AԴe9*xd{1͞y>zc\,[Nm$9lu[R^f=~W1]Me9Zj9xdc[q#ZhhI-3E)B[ yG3ϯ3մ?ˣB{z {d{\MKRV+sݤK~ϩ9;8Q3;,59.'u2UQ H##F"|%F&dxTۀ[Oیn<;ў*tEt*Hr1{nu77?SxωH?f#놕4Ե4<*r9bno|mEE+vu'SKN`aS &*㧒Xa[T>u[HnTK0GB(W.U(m]#s:PڗQ&CeV%8,Tvq3|٫jrJ1!xVuz)O~QxNyy6[i}_X ~N)س9*HR v0ӹNh:z )ճ?TQG{ߟҺ#<'mt e$ư}BBn,-ϣl#,&:o-Un)5D>[` &-{(5틖kךժj)'ef};叿G%Ϊsjgeh;zh7EU>Any1eCfSEY|^CfڄO+Gdz'hjD:յ# K"ֲƻ~κ5*]s$SUe'x#by?WsJik:(eX/7c|膪3Wg9eUY>bS% ɧPFiMOKK34*i-,Ǭt3Jt^ʲ]!2Qxv(f].*5R_g{X/PtˡRL(<\𹤒8Q8C$;5嘞_l$ͥѽ;Nui `@ȡIaȱo$nYRYh82UTl\ێ E4?P|Ee.gZna _v|Ru洪Z&=;u3ܫ"V_^j|XDنbJ3I"/0EHu0‘dxuR;\X>*u<=173m#AmC =HzzKOJ~KZ>sk51\Jp Hzo-? JHKeQ,f_rŀWS||dJ=ϿH|T[y)P,M UZm_4?bA*q,0}.FcRFeZ(- XBf3KBO!m3O}%ɾM Ֆa1؁K$4tE'f4K_G5v/b!MIeC< y>1dfR;~όr1MleE%S%DMRߌcWh lJM;ꜶI:'&a[ ήϵyVo6g8հ7W< Jx:S#0 (ug<,^Vgz179Z6$S_Y(oV;aqⒺ31(j1TWS]JbD/9XҚ+9Z*9ljrߝ(;z\leFگސ1Ut[Tg ֍)m)TiJ;*fǸh'{bO?=gNzVޙDk8M[BxŻHσ]gUh+x2gzeKSR j?.FW -eCf%݁<_@E}#GP Y]K2[ w۶%^\sC TKg*T];Hq7Mv~j隢GIbw-:j n+=vxП?MA.c]oT>IJY`=|{ Ѝ.UVOkN+' E\m$n96A{$yG/NfG[S5 ,d%_yM pl _/:!]CeI*'))i$ !1'a;[+ /^cASZܱ31NiVC$K$`39<{iz>O,ͨ\:i.m˞=u55D9QLep@Erl6Q2.#b(# Ω Xcy6( BrSdPfT9K<)VS$lQm!wZ?S$DDG6ejxR%rc`}Y#Tz.Q2 SQj|hܐ A# _St#WSjMSMɖK-iD1TU2}a/oQV.zqL Dci$ňO345/ES"XA cm69 ەLVJb ]DlH~JmJmj* fYc>Y *M4( ]g;ҍkusW5֊|2jHq1ZM'toOGR*4zgCrϗA("1*b vqlq?27yɳ30ub.HRwkZOYYZyܞVڄ#t[#9'/lCtwD7ѩ4ƖL$Y%xiǦ?1ea{akϩZ]E^UZcK ,rث H˃gJG 68rnm?KSM2!QblI?+0dU*Եz{gx6Ծza])`+ltiR 3%E?.[5.ͪhr)2—:ڸ$r*AU&c{c>uGOeqb )#0n?M'Ԙ^qثZjcGK/V^9-ZD>b=QS͹qU :wP oV:[L.#1O[rY9n֗==ԙv+nB&xOUUՕee*"Z2mUY uNei33ߨ_7A ̛] <| WHkr0iG-e5+9$/&꾩y,R=,PMe]yc=/PeSP$euu TUH e{l9;`~}k]\k:d6He1Aai1,eybڡe\s]$;~Xk|ɘֿf$-0!vq[W\$x#vU_s8Sd=chosRR٣JBw{RwEs%QtU!ZGF*Q#!+2[8Dsio+оPrڃ/YY[pC|@:]z 9.Ժ,9T(_rroL7- WaLڂ4R-܆Е`G 2xH%8Yk2mWPiおȿx3 ZzQQu ߁=uU$w!;#|!z+w.eU"I/,ʃoA\ȕ,Y\=(ci*j]qUU9XZdIHۃ.?\!)++*)eě_)REIRA*B5̀sx(MS֙[Y&ʨ2UUUʴbBىQ|\zәrg͐K,Z"Ni,N,@H=Ss xU 9/OuuO=>-g uȖHI)Y|hB#⫫}z-& 8驑g u UȦiR= Co~w7R鵆մU sHmE)4zW.`Ht-ȶ9jh99/X+`w]R 3^a%;3.6wmdд6[ d'8&zG5)jQʎBnl$ mI:z am4:@TTrе ڭ*-`+McBI,,Y,n)J*HYbo܄k)ydNOYK<3U+I%V`#@IMw]k^VɧB*5GL+KWʐ@(UٓΦ۹hsX1TSR t+6YK8Xxd,opb5!G*UZC"c`|vfbI blٟ- q.W(\#uѿkN)r ̱% A lKqe;|j9%gCr ds-^L#ois̊k~E*X&vGݘ#JO?szL!Vo\`Y„ڣbM[y5t,R@OJ#$`-nEéḡc-:4-fEw y<^*{ȳ,Lƻ*b0@F1  {Z.h9 i1ʙn`;'>ϒ=Z(ڟt uR˻,78t9MIYi"G+Ni r kbX07f54hSy쐃nv)H}Aꢥ)%8Fd螐B1[iLSk|M3.IQ2K{4v|>f[Ti,^5LE| Y I$T>aUV)b\!FzC-'[u q_L2zZ3g*2P/7"J]!|@<wOW!xjf5ur+,cT7[ KuFo3٬:zzZ0reJX (*;f~)ᚊ9:%d4YNc0W kƽ~_YgZ3\eںU-=%N^-f;I;XYK.ٶcӾOJYv{tCN>ֹC9Ȗb5>0uQE0xhuxHʠ#ۿ NG _M.iGM44Ա]RC+AX,RtsBu:\!oW*Z9z].oIgf-Wz#iΕ΢4e (ilB1n${MAl C(S^@-olvcRz$fK?a7>BJ-TV㇚%e)?x.=)bLS<—"XP{n<I1UtfX?LG0`k>gNzҡ)hJޔM5Ur6E_;WS. Z{\SL NRe^ED~eJd Jn{\.1uj OYIGKUԕv !?CÜk̾e;K{olJ22ZL=gt/u0o }V) ̣bo#-}ނwO:kchT+{ t XZ-cd'r K ^9<ٶX $l ͿKsNӱe*O8R3qv {ƚ2ܗGfyTHJJ Ɔ Ǵ \qXat*ZYpe)f!Dyߊ6poJ]1r/5S9I(f}ZdMKSP dZx7w}{xƐzAi/ҟ! AӊYYƨEXY O lHm⢲0abHC|ޫ:y^# E6N{3άܭٮ`(ю%@omň`^ZdԳNӰS0 ^߰:C4T.:C$.'Au,/52R0fSY+vPuoH7n5v@":(9uR794YRx㵊C!9< I;Y 1]@2$ʁbmo9],1d#L™ i#iWڭT `04Eev\jkRgڿ,SdTۄUH \sWS2fsVgFgYRCġ/dn9SpG~FT^N_P$b!k/qΗ(زgL*<;ŔՔ(H`dxxjm+ #tT9.">/V0沓뒎ݕB,pqԝ(թeeX j6].̮p. ?W<u\/P,dQ' B[h;ۋ/9_Vן-9fT2xK0IQe[uR9DD29vE%|1@؋~Xr-eMc\4FyJyDɿ`h[ XpX}-ZJJda L A¹%Mݭr -3gRSEZdlFY)_.K(=mqriۢvlZ: JVoR y Mu"t3ɠ55Y.%y/#UikSccaSޔei-رz:~qT[rptZLENc ZV]no&|]2jfH<,4Q[O~I{u+RgE` | /`IP 6kc@rdRHrH H$Ӕ&4Q6H}Vyq:lJi/ye:ij B@o)7 5'PACG5-!RUWU fB Qs`piu6kgA3 jj| D3TJt4{Mlp$/kF@6 ;޽u2h)2)e@vbJ٢Pz'˲OfrdJaOUT2SrXeESZc2Z**2v9ulp}fء7F)#r׾ | P˴Յ2ʩbuC1m5F` ֎WWhV6Ag)SU俼γH'.FWH(6oMrQWPKUkivTL"V@v7c!?sIfΖ'IsilY|bU6j.SFjgzlj}?z^wL.r?rms?gzJ,-/5mJnIIm;9ƈ23u-<걨kr\$%VH4?T fþo>m9|9ȣM#3Ir<7 =kWkmsaVj)h%_3ro2߅p04W[$B$&յf:Nh\&ɵV1yK-ه`^劸0`4ֽyI٤)x;w4~YWGOFAyrz hnM:0G?'eӮ1CUOGSS4FJҩ,ͶpfuU9],r+h .uZ ͦ [FsW+U+-9e5tue5,jTIR54jO@rutfIUKWLUTR%TiTFh310E X*rQJaT-Z .Y;; pnH&Lǧ9}kg}>ʵ^WH+]7YQ],/Z3q o!g9AtWT&$Mz?YC ,5&2R7p$(Lv2n8NoQ z+LWP2B^zyk&K++d٬٧S|3b(e ־ 14QHu;h멘]wأ 3}Uu;OY-FSjxҗ1(IwE[ ` *-"JϪ?'yZPh)3Zh)C.` cR)H%S!;2$1aP~^YyX5~@ g3鮣m6:ӵSL9)sO=0yE n:_hҹ8d)3 OFjj+D"x@r {[ :&ĵK8PYbajbF׸7'WUXi$m+v_oI>:|WgFQI$OOXJ>J:TEMuD9=FTʞEŭ~F)W{A#Ekv&4q8J{ )}3A%gd4;1{-p/b"sb2ֹfrѫIf騩Q[qȬK0B3.0MrN[=DtY**o V!Hя)*)p15=iYNHQymOfBY,4MeX##E/)^WySltr7V2/,=0/zkPnaY2n[M傀Y]Ag }l)YSEuіT>3/%ąk# 8"zfiigf6HI$gQJB5$2}7CTМu=^_YMz9G]=\&Sɡ3f5E4t䤞x^4YMw\뉵VbCL(28We_l-Y^jJS[DE&jU:$4Δ3Q3<4thᅤ(fcnq(@q4.꣛->1SB`Qz?"{^c(~fE$0Rn,7G/q sk^OkpBEW8R9PTUX7v팶 ڊ{T"T>\O- "a`[aۂlož//{UB[ʐ^ݮ/bx-#0/`sb[q<}?iW˦I$G|O.Pw+s5ɸkaaq3JMѥueR̕5Pͽie7ɹ)edYbVB%vMͯGsr; sLi$ѲQT!I@px:ߚCK3|J 2~|bt[D̺X˳ۀ[Z^>f&Yiwv bM)d( " En MGul:#OS;-o/s־*dx#$} w>V.յcq,yqp6^494Xw;E>ik:q9<\WGpw3 0ƾ}MQ*c1Xsoy:%ӭ+Y3Uu5^tK:E-q :'$0PI[- EA/yGO=qtP2UԉTY>^\'Xn7a< rl.LyU4J h<"ET]ef7$jZ}MI"3,CB*-e&E$S:%Q!%Aj%T݄zI5?bkCVG[S[r|ϋ)y*ݏn_mT>_|PXR8ŝ󜲕fCD ¢WӼ*X uLܓ~_v8{[QEu{B3UFLD^cL@dUj*bhf*(G7_*5z* W Atvx24bT+0q#3CZ+kRgyg-=4UU*AGK *",fzq-D.$&yN75>ֵUCՐ,02 d2VV%GvԺ LI$3 j~^9i!~ӮGBUe&hlYri˩**ڬS ;J"$ IK4=C͡9@^ށ@7ܠ%[kn5kZY$!Xp)k_5k垊VvIRhbI݂d by6k;g3,Ƶ0Td!8+kƄi.NT1AuHSbPIlXk 33o4D͵I_jXicX$R9cM&շQͮ Ziaf}5LmfgwR7n}+ei*V7y# _r}QHAui2|jjŹ%{E\[S3F%Y.A<K1=ō2USM ME,RG42 8g@vzI\M%(w2f&I*# !QOA \ߋXkҚ␕.6I #?vmyWQ]AY3j1̝ic 7R}}G[|:xBzJyrV%L*^6Vu/K~c%, 2{/]vIH|M]4S!Qt.AYδ+,GrB- SF_$~AO&u>IC\!2ZG,-KR`vr@WPf9 z9zw"-R߁ީYy4g ޕx!vo4/sHŪefYiWt{ Fш>~:hȘ˨id]h2 lTf/[WSgYiV[@pqt_YYOQWgF3]lTz_GfMs'RT3IXl{]M=J֕Y̳ &F #Af!F1Tu3m$Y[Yz9`w!nM<>oY6.U-N9 3$зMU )jbRR m(*L% f628`Wt `mymŀۿZ~d;z,T_H*6nd].xqU֮Y3t pnvFlo+e Bv[b RaE8ejԛ+2p<V@7͕޶d9֭%E!XpārnMMQZar7,'[=¡ 1 =%CR7$\Rmֱ%8YTϤ\1pK^t&wYHt1OBH$ڥ #h;%w#+H}=M4ɦX֓OWO -ϘJ Q a4uu4 wM-=SFe =ld azlY Sb,hd}H :yQ"K%2UH`@_)O"UT%2> \0IΠ;:@j0kfj^)zkEFEl<{{pfffSftF3m32h7)jdE"C{AלZ*4R2*f3ڷ(b(Y5RQ, m{l&jx4,սmesXx ~c3~iܣ-'P]TtF鞗hf-{IRm1A;̞R)[6[cp;N~%|GDaz}0v ,%C%esXWnp^jt}2zOMj|Yj#,s57]BZWͭzL+[z_TUGBo ѬFT2Y_qe`W`q^k(:a3JG>k8͙fu \Wtdn6;;\ _>"נɴIfZ]Q.FHdjo4ܱHW(.K1eMi_Sšަ 6 ˝{Nqb/\Z*x(? i/ ]wN17Sk7Iu~j5gYZ44Kv @}Q[[Y B1`&a@wwBC kos= z䢚婕9heؓ3l]h#,gs>j~KlK#4@Hbͮ nBc3gH,D@2]@}v \E:٥y̒>[`BA!F.I@ #3DXDmɰKFwbΊ.Zk[vĥc nH"3jR9w)v `..Fo퉔Re sW 깸X܎@YimIeeoݳBp6QHvK" SwK^O``26 "#>V%5bBIH;>/-D"o@䠞EW*YQwOqcojhPXmz jF/. E˾2uT{$X68`b#հY@Z~_}cA+SS[HK"7ʖ-'8!WU[>W2O͑c)&܋yl!!VGY,X{ l.cncҊ {RyQ%G˾Pěo :ٝӷ%H)!,ҭ;znob7]bO%N"ۙ6&ןk_ fZbkYlFw{oŞ6;msvAg]1VsRjxR)N *;*JїK,wTyVgfyz%n\+ OSLE o }Au;#4Hʴd= Vy jd3܆`K;f]~d4UϜgHբ<γb]uUGG7 ޝ%^g5>e4v%54JUKPKKSM<K>?;2\SQgٷ-ye:S3ə(LOٞfٽFMC1JYc,Kc1B{vV4r Eenyk$z5w[*74l}18X܀ZQ[JG%xVKNɷ;T<푀%@B+3fkX!ON%Eua ́@'8HcYbm"G /@8g>rYy{[pKXrH=c5:+\PklZ>/z]u'KsΩSiʃMLJv܉ btCfL,/ksZgX`!C.XXa i}Sn*{ob]ϵfWV1' f:WcEOUz:)ڋfy|8+$ğWk -AAI&^#h*~7'Q`}!Ԙjlʙԓqaq[3:mҜ]nml'~L¢Zſr`|G|8f=?SuB Mf42{qeϸu3^#U7LjXw\=팃MW[RMFjl;‹Қ3K3l6K;hjSQkǹO6`0SY$QtƟMs3OV>|Fx ,.tQi&t:Β6Wml$oWc<څ, me9ŏqlVu,r*IC#5ĤtY7$[M o_Fjϛ{SS2<놇?tω,%fZLSXU 1-deN8Ou:6)'QzS=UP^$6`=b+jJl0#>E  ^!OMIOx/;wZnm{_VEVc_ͨ"ʦLylFѡͻݯC#iGDG+HEn1lgs:W̓礀I!yﻱ8ӍIJ 5eux tbAvg4Tf<ƽϓ,V{7ΫV(Vg ZE~1WNtJu._C;,sV#96?i * *삞2zyI jwL;@]k  hMCUL.)ʥksJ=+vcgڧ^¾z\MQ%BSR'XzW-U?BiL>i:gɲljDHgHJ]sAeZBI2 /M,'lmd5?r:9v}=mOQBa+e6rⲲ2d1q8}5K=Kיt˛HMe9|=sӠQusBR 5^2ռ5Cwf Abvw&5bzOrLH+aTڤ<S3F"!A st_\DG 2,1vWPr0X74nU5W)nG?OSfM c~K eQ.h{q؁n}jzES\~VRK&!,{rOoX ɹwXۏ{}6rLw}N("z{ { N@Đ{ۏEk3ݔ;RK1B2ňs~xPI"d[B a- Fc6,+ ~`/ UTY$iKM 9$XolT2#lQٞq#$͔) mo,bhi\D^m7-j$D Jw#Uc{2WI)ExTb\n>Wq#Hԡ< qro$7J<®'qPMS{~~>]FU:_ts*&*{7 C̆ErMw[nإ}㑃 ;"[\_cy$ xxySi լ=o+O$ U[s~`(Jቐ5@;[l {pF*ci#HAh^ &;%[r<m= "m&mwpI66}rwRcGx>ǹ=kIbi`~;9cvF&4FId{;Ak{ouUHK+H<ߙ~ fX6k0\slCJB}..,l"qpAfg 9-Ү Xr,M3ٶYj8iRղfT9|X=@a3 \L[Va2 sX ]{S"5 Cb7;r5tAy7)C/&w+6cBU%3YQe4S¢fUFp؁FH;Դdsb~QUJ FH2y{?~lKR$^X*?\(17I:ªHa'$[|(!h) ;_7[4V'Y)w$oܫa…>cשFajZ8Ј٘?sa~̞(|mV2*b#Tf{E8g6B1ݽzk Ed4z )y)sڝ+CR 3Jb,e m|UVV뎸jtɲډ^ #jkVyAe4?Lڠ%15j*|3UY%m\i®dff6Ei fu* !qǿchb2;n7S)#س!kQw ALiQ< {ؐ #(دy$Q Ï5ۀ9&_'b28IL}D,pnkbIJdH71ܷ6}b`C^f ~ ˩DY8h"nq/pwC#urT-A&'ܰH̒p{}ϵhfGe!JXmn{MM:8G;Z8l̽{kr/bG81zVpMӂ G1W:\)f$SXXܟ܎x$1FɴWeU2, Bw7 $jQG{ p v?RG7njw enPۀ v܂N* gI7l 6n\}-a>Hb]*#Y>Z}p[kE&9ơsM#C^:ڴO•@b?FveHUEV1| (LAs~Xr8$ jJh̒XXm6&vc9c:XTG6+3-TKPH eܶ^]"|5}vy1>juw613ͳ#&*(,Ej:K_neM1E =djc[xƕkI2VñX4$u4aNp<> 6{M.Zc rm*[=WGۗpHW>[OQR~Y%eQyq=f&L"4m,; $LK ؈cpw^Z& _g0 KR~"˫#ʪ5*J$;rA7,<יwWWVG`mA$rBN)ujI9%(Tq 3hi~~tXViJ<MEj²49jlvq?1_1ҙ Df5sj,y/,"0ۋʨK$m{ aM¥@6tP+ 5LyWV0]<dCfDER+/?WMtG,G ʵEVI!%cOfx*xZqs&txyP%E&KQ.Iq2+jsݍ*@%r &/ak)cȱme$yf)#a,>Qrx V#n]H*D,2A66߶(}JzwX7c{hGDžFS n#{IOHƝ4qbEg%"iϿտ\UyQ455JF7WwnvG [&wJ!f Jb Î!yfɚift8d/WDeݶFX V[VUP,v ukX1S"xǙ5f#h,s-vHٞGVmeo~~MSч47Y&Z@T0%;cF*5dls,Z']HF 41uC'^$Ju Sxb3,Q}{QTy ˪$ DCVE@8S~4s1h,$D` p\3/ g9d9jE ck?{r TˮS lf95fۏJ@<gsAPeյԧ=9f}͖jytqQ2jhD&Bn}A)\B4  [kiMc CU>:ʮ5ɰUҕu/[S-Dҵ ڈ ^3#Ve5ULSSU)&$K1$I&Y R]H(nvܑ]JLja$ ?"6Ez! -66JyD.a/r R2T[Ϳ(]J XO}q[KvQkoXm>ǿ qe vM k rpTKrx bT {_LOtRJֿ>ȗ( H=s"ؒ8 9b)w0| &mpE A$oM!T5[e㟭qiXATUR*H@bz)*"9*%`(/k2II0mꠂGArn. dK%GhE[#.69| vܛb)E,Yi$_H XZ؊!?ܗ!F`USŇuȵFXyăs`O?^ߋiI J *9Wf{b1B+"R9/pVW8$V[رn/o[4tp)yL3' 3a{\cC:*"ڠo{{4Q zOZ*rai0vabCgYp~2 ZkToba LgRP nVĸݐҷļv*ÿ;c8e,UkB rx,Jmxϴ4u9WM"TGL;UUA { 4ϩs-(:<$[+Ċp,fKKMGqi Tʱk ؆s䑄3#ԹZj|ť[lS)=,`lD`[EdAФItu8Q6b}vl=#|*uo0Sy/u-ӷȅv$r[ۋ:/|f /lƉ91VaU#k#rĞY+^ },M"zXseýx mS+Ys6ΗKjk]<*NAR($~!VJ{.ڋ/[D^<8Ut9:VPCWhUفkE/`9,qƳ(s {~p 9JHyȾ^BA1/K'͖&.))1vx3j*,3̳*caPFYO.V^{IuQ|aHeTF#B݆x`WH]BURF]ZRӽ禽#IL{4UY[E/,yRG@ٹJGiOljgO*kNFꨚ>Pj 򪺉ZjwQOUjL:Ij13WS36gE.eQP8VF%ܨroZª [S$Ī1)k؃\dMӒ9m%4˼Z7FIB7-lSuKvP5GUթ3PS9,rXx]C,y>K]uGgRfMB*D]u`_ykoU"uufkWWHbe,yXsE5Mpi] +4W5M@ M>o9t˪%**8e A Yz攝&ѕ0"+ETƾne[)!frnMj0sQUfu3jG<ҼzG(*nX.F1Mk3(Zٵ+2^(d0@ I"X{]6y3Le_4+DA`YT˛~lYϗ0&bb㉂ `ʁM7%ukXM%SPIV7Y$qok L۱kY%UD!, ܛ{q_~w5<17 LA>`8\C#E4nҐq2%}ӸFvhϱ$}-qx;zن[X}K Dbs)m Ёv6$jwޏY|*mۋ]WEEfAPH7rK/c -Ak)#oao:idgc =blyӏР!J̎D :YG_Bev#n>1D"XV K$ d c;`.ڢIgH * ;#CRxI*߽d:xBqsURM/#"Jpx^ǞP.1̲7e&BKDY챶k N 6 qr8iUw-PU&߈[<$ʁ1_jkr>, 1'GߊV"'ڠOןbYEEF*UVGfys߾PeRf}5)SEjT`3fqEbJ:*ѬE XueWf}}vgUƯ5zƥr{ W7EhQ~{bg++ooC[~#V)!, o%b6i %7.+!n%7O&7XaX([W瀥II! 04/{9YInc&˹~퀣%Xt$q@qr-3M$UP1VeDKpl:qR7bD֍?3Aے}L\;sŊ"?O_9D(,f0,/I%}juƒMw \\ph m׷ ҄%Xܓܓ&0`OĭXh!XѬI *؎23n*؋@?[؃팻%2Cg3w۞?݀~&BI2=$7'9Ӎ_E%oԵ8T<$o( ܖy~V +nIGgALEO sT쩚Y1G-Cj M.eY2,~66ֱ0T4U-M;H1'n^kkK3W).-ov$;(xמ+z MZ s/Ogf4nфy~eu=tF4L*tA2Y'% ([5'џdNV%z/Ȳ>-9BU2Dn/faUtH,4sdUd`5qHw,jJ rĄZW(3.S5Aha Pp`M. %tҹk 4gd Ufak kgާWK0Qq† uѩPorTv_K]P-Z|!K傖engTuOK]"ʭ,~Z]!7qbۿg̳ fD Yxmk)$v,y @=b~MMI$>N<0`0`0`dj)Ca U sɸ팁QiC 7RD;@~cL ڧui r{v/Q؝2\`$ɒ0b+ߎ~=]6TbUͶ(ݪ#~KDY u@U~m18$q*Yɑu'ltPm&w6&m>$Uc]f,AgRB9?Qir;!0%k?)X.{`I'r.F n,=خԩ5 .<>gfߘ"翵1/PT"KV)Vm<}q4N]^y#AżSI4@[%d!G` #KJ%`Qu,AVn{آ=(ۊuA$w X6?ScҺLn+ō/07KDHn6J:J? nUBxknR-ɿ~طHpA m]8waa,[3+OO%ҝk8z_Vr^e~s%0a䆸"(4њ :z=?EUAUk2#([GXL`L`]nUI ƑGp@Rx"ǰVY*AĆۘ]m{rT]r ~.y<EUZ)p#B~}oR1eU bHLcubc~7_a۞>ǽ 4$S"˩#aP nxN4D,GHH6Xsvm!)H.nm{kEg!%m کh뢽5d/O%LuCG$>`<H=|B"VմTnI^2qo|:.]dmvNd3&5ܫN pQ•R<x馉44ZN[TeURf][jL9E قxxM.ϳ?QVN,> uP02R\\  f"a]+\oR碇'22Ň{jZX.j(KGV-li&ړ7NյtM>UUO)<bݽ zrbAazVxaPCS$RE0DBw>6 ҋ1:si5IeZw\dP98hAsک*y|)v{A۬E؝ʠ\-uV5LSQ+zg;KmO;R1Xڅ7bŅ~s)w$g"Uf1*L.KXnn.C_AyM}K4n$(ڹfY `X" ߵ6qi;bTߵ`#v,JҠn Ola ~I.l 7lJ['[{mĎ   W8@.LH(\x@^L1ᄟ]mk$}quYb4Ksk ,Jecfkم$W!ub7AȪr `!y]b#wߊ7fQfHB#oH$v1T$E굸,d+Q"mlJ~OkwNIPPɴ}qHS* p]=GăgĞ~Wq zA?z+1܌QKnOqq"iN_Iܺ)6,^ǎMŅ/MnK/w{?LB XЪrp*os}y4bX{6cpl[}[@#c*cgO?|MVi3 ȓmbz󈣆R9R0*BCRI&<^!A ^ lkWU;I9'\0+(:Y'>qUrjyX:zZDPA`B*Zl[ŗf!jRr݃v D#}[f@?;ewo۷|D;W̢RW$HFS~E9MJ誁Ao)<@lzYE:1ݵ,R"*/Ċj-#F0,H}KV*sPZ!">v}O7QŰLb~x>/۞qrܖ*o#4=km-: 1.YBRyK'. ؐ94QĉH׽!>Cg?E{!D`Iab[?yo{ y]+=EHL/у`@qͭl|lF`->oF*x 5uL;OUWuZt[ mb BH35+7Ug$zn2\6]=7Mq~+r&z9 'qErk^ğsKԪ_ j0[&npa1UTePߌɵ6M mk~";[/GpFu-APĝ$݈X,A vWi  0] t00`0`0`0`e+3Pvd}\ɱ)i7)az'yJl<(3j`4DIre v-b7"A,(|_Ӽ܀8Ř4rH]ۈnG~pu4?5w5&ZhpKB7АtZ,e&ut\DՐ6{sEK*jH`[[j$vS")P wo>YE4s4G2梌n?8ZKZ5܁~CGNv Wr{KX{+X_?NH2fb"Gj6`~wOwbb#9e}<*Q}{7h~`2u˨y9p.T狀yr(Bh\3J.!!~sN8WPH"|bn@+?d߲`ڮsZ"0$`6[nOfHXęT&Y +|F,LbsNӘK@ ۓ; j\1'i\Js-Md_'3KHwՑ SJB&؇mQQSizSPQyuaV`!/"¡i.yn6ܒOϿĔle-'7P,g\m_K"dTj =K+]H)L /,ل*/k2XhQUQG.c i殚:,Q$+Eo;#J`2󤰭CDG GHGyHb,V'd1%~y8}?}43JdK][ړ会K^,^EYXBml)rX̵.qs6\t1宕!YcU C@3n_;d-k_^ȰiY<2(6҅?§emFs :4je|y*$39_1GX9@X@*`G5%N,3s(*KHelTL:+ |?:TT|VWU1>k3YԯAN˴͚Z@`:}V飪֯O$4>veя9![20e"Ltq唵DX3-GQ=%Y-5@f >CV/"j9<+f5t;OJZvo9㴽'5ZgW,\L<=_yRRQe٬i*!zj*4R.m_44.s=C^U)L6-{q#y)XM T[oε&ދuͲ*a*k+*)@w!|B ^Bp=*}>!~*9M>e.͍4L/ɂJ!K2nuh(ܾW,TRHU!Ppc+Nz9~+\`A82GpYNֺ ZYxrkD1骙2Ks")PO%- -o/V3OZQi>8#f*Z:Er@TLyaOC̙@Y3GM!HYwkA?^6kK{ʳ+ slQK V['s0=6#F<Ś Û0 0 0#Di?KďP>;:PɖϞfR FM0i>錍tS#e-3Nt9M;UYE&{]̫X2ԉßMX w uŮӽѕe:9Kqm_a]+@$d^%<u:36@#Zu%^[8*}Q*D4{ +!$[{:+3:>ΈѺSLS[*(i&vI'ϩGff7bo\/:<ۣ:nNSOG"IT8[d0D~<lAkHu_*Kd}RR~g!c$&p΃F Y"_VF(Z劲dPv;5wHFQc_)3륣 `ʌܬ :MܚSZGOIgT0p2yXIK__3] dV$ J7Xo0!  .ET4T9USJc2TǙEjYnȒ߅nLRgSOFNF$eeO/3(hG-sU$lu;~sQ =eLCYUCGfKjꞪap$Y~䍍e!1C)<ga 'M|eKU,"&I(T-6Q Uo g ̆yɵfX-O Lc1HR,I"ǚԘ5TO3.X*n==<9E4lA.juUuLDu9K Dmb<|ꚞie5*樯HCWd*d2Vx*Y44_ z SuVj_SgΔ&kj1 &~TQ %GZ:&=;CA$͚ZW5jiPTN\RӨZG>jdHrj奝֒XfcOt>[Tso!eya5?/R 4Ic wBccLLYGf416MAdܲOt+3Vl_2m іib'vRŜlE4U,d:rʯUiC`\Pf,~\lJ+-,UfaQל*ߋ^c~1Nr]gMddiD9:Xf;ӺQ\)h?fj.aO=%ns[]UT͙cM"S];RapڵfFb*&C]dIUd.[5n-yr-MUM433]HI$zIP!f|HF9Si E\ ޯ5g6iRV=IM9̦bPd;H˫G eټutUMs$Zr,h)i`+DTI6ӻS33*ɱ#tzbT6<&!+ϗ&9 -oXȬLoRCロ!5ŚU>{ȇ(KҕXڜItdKq,g$<}erR5xhԕZWd)Kz.w`:߯7M2VZi[.i;Uj|)RieA!AΊˊ$9^\40MV:js3pPimCYy7(2Lf5OUuD᠂ < )rKlfx-[mmOխf&FF:z4H|Y$! ^֮GYy̙5| پA氶[ 5FZʊ!b# o!ie'FSKb<^fl(3T/gT}Sm- 4\QqX 6qVɺ,AklocnNX\&J͇ Ĭh77b[bԄe A=Uk2ZFi.̅DZN?v˽#ܻ^[:sG4dJAUm`0S^]Db87lx8c0.XH ro`MZ\Î:+֝35wDvEHs7EgM]Km7Fn:v)ѵUE3H)Q4ob >cOֹ iSh6t30637@þJUD%?fVl1he 'q{;'t55<ҵ1NA+%dTҨP -ŭ%ׄNZT2u?]>]Q^P!G%cm=i|Ɗ3v4LN"U9= 4?WiszZm5խ']Sec%-VrVVu I3-HHe6o趛4^>]35g c0CGRBZ%7P }6.z4Zk˨ӵlM[QJ;9fT3G^I&ZtzFVUZ0XkoUy+j#z=K+XQ ` $̿vWk6鮨 7 PdvXSŇTIKhi(h餧XTO#P*}Sl^*:J157Nk `%=-OKI%$JiII$D{P0Y sicIW5"JZE sC6xgE tyy!JE5E-PrRJhPT,utnXcӇ`-6!RG%VBG=0u,-z6ʊ*KtLfi[*G^ab]jJ(z{3 WUy)+$5T0!vk!n6TPk]΅T\ز)7-~9UTW{>Л mاoa9Jm=묢M@ԙLeV-~eO^ٶjPef1MŚ>a3jo~wS1U-%ewA6MIE2-Fevi } ה,;| r݌}w761MA{YTxWդVJj)2t.͢Jv}9-5AγZJ6p Q z7'Kf@\֮%Χ|צyF\%P;=SD9`"fw$v2\^,o#{6T# 2 J@˼7n7!Tí7kr3)2,5my I6ݜUTIkY:YIdE_RկZeS^ڊ, SҊ BBEM!p#Ӹ!X_SJzEI(4f:jFda@I1. T@*a򢂧0zqJ ĒNK5k\*j4&3EOTdmeIw 'lh][c=DAB$+*Kmy.g< -FKj(aiiIUjaW-H+Y%=nmg}^~(z3L5>̳y󪖦ɨce,ţ E1S r*;2ůfgyXbt w_<%K5-~d)5Gi|1A]kJD0,%QycaUk0𺳤k2zOdڧI!Ͳ\җ}4R9[dK2pofARTlA<Ô|O&<йS/TeOmZ6C"^ ۞} ߾ 0co63Ł'nʬOv$",9Ĕ1e}_qQ=S )AIb\qeZ2I%7ej/\ k <S{ ۸w: ⊧yIh CmWUSePA; $modGlܪd KGb ޠMa^Qd7JaMVhY~]LH$]Àl@=vcI ڵvt9ӹd9}}^MQUUյ+$b`$knN .80`0`0`ѳu +DS:OSmX|y5;AZ_ERI֫X殈)鲹vF}X<~ :ѾZGMRњ#-|4xZjhghή,$7$VDQksU"B6Bo>'tQZJj]ES#QO[AT{A:ǘ?P$W$E[rZÀm{v8~sQTBc FA6?K{an$31gi 5Ƒ;Dnm`{cScS};[?O<F}۪3ZE{֭EؠS5IMeyDOFXT"Xq|<4Dz‡=gНfʴWP>Y`]J lʌ廌4-D{f5Ej*7_JT6 ^qnwZ ]L'J)]N2:X!W-Um2{L”$rHcx&ȹ?OӐo,β.]$RTXd?}ZO1P隰*(($;x<ѪŁ*E>'`G{ uwܻ#҈z|te-!U&5TTSm QX!q$_6:_]G'Z*?C,j"3(%-WT^GT=lǖq~ҥ٥MSVMUIgT_ЍDbge"5j,mm@ +1*ٕ.[|ҢGe1֪GR]rזH"1]T3ZX܂G]<.̟,I&]Ҝ/j("v# (O.W񤘑+/ccb?^ءzۀ@À?|J5 ppX17`+HOo$ GcDݲBJoba|;VI۶!2ɽ~_O`*T.rI;JA^3 ]!ؒ[tNSka1Vk 9 Oo[&x`ʥf)]:E&-*p]Je&0V6ȃ P}$ : zXJ#ZMi|?GQ֝'py|ցk*45tBXBÿάҚWQϖdRѲ',` {Ѯh̦,Efz*W*ٌ9$OFUIYKk2OEQ,D1fr>WH:u uvgNi LT R D-m˛C.k=1I+嚿4WN󼰗4 00`O w|WSOl@#ŧ%>P 8w#ߟ2Y̓ ||ub`ՔAlB}Y [p 8#X)ݺUYMܞLdyjZ80Lhr=Dmxâؖ77}[_9#@6~|JOlBY _Z-kX܃6'{g"[\_plÛEubċ}ıo eo> ^)[k$8 ko6Y;Ms?e#m?_逾 +U}Hܓ~8̴a7C l>}>g{I;}nĎMNPEgmʁ ;b9 +.)Elډ,Փp8+.aS2 :feTI 55)6۸¼bO*Y,Pj@TZYщ^K?> oE`m/U'߳COYO5<=5T- ?9VS {~;6EQIng5QtgL6GVC">d0` 0` 0` 0`2?W-\U;#Hr>SC?)j@+0S$r W*qqks:p~XRf# ]T[{{Xv8 RȅAT88㏶ $$Ω!dpA`d A<{`j,1Rv<^ckp1]Q sɵ1A@fP{^5WOc3_XtG4a Jv\YA\+:݃7 SI.AV*vo5XR0.Wk/Ik G^V?Geڒ@ ^ַ8ڭyHy #`onM7& c31k< \QO-Uġmc$y-ksOŲ?)*m1H dfeb-݊ ^2=͘cnW b;b;={b0olȤH . =ֶI?Ŏ<s=y}Axb^ nT>&m&I65 Ql+U.@ 8]RH woޞh,EԳ$)$vZVN6<eҕy@5REjx"11]u[A Zm/q\a Xi|mej%4Y;JCVJkI qoŝ5'CGLG}*ܓb,HbG7>΄kWOӡAWECVpTdAԎ ؽi/'Ӛs/5#2<٪%oO`'q3f%{<k#VKݬ4f>%̲8s(IT'DV[yʣ-pV4MGe62Q}=5v&o~p:-xfWtk0@ړ)%̋S=Z'~}IxfY;RJ 2WUzϴ>2ŧ߾v>^`پE"4`If`UxcRdXz})ͨV+TڲvaW#'궵S|ʝsOWR0ԟo.s~IUDHHmHgdVYcYCk'?s%%5kd9ri(DҴ "S lOsFf 5NcRUII_p6AkRe&A }6ԚYgUM~e5Ε1fX=hITsfF@aO$sbG6OS_S m'`\ʨgu\3F c-n=ŶgWdyIX3"2z:c,J? .˱Yfu !/X~T7WOJ吵kcH@`Z0exPx?_(^rH=epp.~B{>LX XI˂8KE^0l{q`` 0`=k'~{ OvǛ /< HMQ70YxneNf$nG;,\zf2\\wN:YBR(FXbC_1{&=QXny28%vcKG[<67y'1+ه# H `o?0"abŮ`6l`ET+ mUAf }'XEɰ܍s;ĦH l-Ż~G @;G} )cEyB|;ϷʴؒlʑK\=Rr4ċoo@m(6*H;Y[́ CKM ?{gR$4NdHu28/`2Zd^̮V[HuB.K) #V@k+sq3MO4GTEj"PWţzSeţCJ)6}@ouj x|c@]``=G|SӼf53@3ނoHE8m8DUT[R.seGq * PƾLRRҦ_[VgXwT&?(;[RC VDy-!s<s@}`xJ$SELY$ qbm`.~d1O|[>z*^GF*(e:/?(UHdH!VLAZ4KjzH5&Y6cfrKv ceԝ-z_Nǧu[1x.***A;<86e96a[5yfgT~__NԵSFdXVR*EKx3'3ěsL\U=^s"QD1-jID~|"<6cQsޚcMUdMCr&#ʊ'ee=~x@Ulw/پqnǠA 7Bɵ~,W0`%/**n6 (D`7p` sn?ۀqnm; %" *;ߟTeD|.HZDI"G f#g]ɞf)WTZTyo0,D`-`;#=dG/4z|֭7$~qI#n㢿ǣ* f\*0`ȧhJ䆵ϫ:wzg=J˿j@SMKP  w{o,5-L8F.l96 _HMMsހY~>m-$gP ɺ΅G:W&FLƞn<㧾j Ъ=?̪|sC鬾(+(߿%pM}H$R s4z zE1*@['cb,Uwp lANX IE͈g?cHt]BGLPDC$yd3V|i" ɧ,̖:X`LU)aPjK2z̛NZ[3%)uF[c%B\7؛{`6|j6ZcHYvx;7?SeC#ނ\q5CķCrʜi]uGsTCh*ޥhHR{s`hٳ=9sk]KQIER,0#?r}XF|(Q3*iScOS6dn-_ru VsB(kZvrK9uj7:%yyqHo;&;2|MkJI3G߼a}m'8]E#UkZ̷N/WY (7ėIg6kך&-aee=I'Sue%l{cm*Z|`QRV8|Ir4U]r3n@- pBx&'P5Vef#y@cKhI]yh_Hs*'M$ݙ<H,Fߌsǩ **$&Ӑfq;byb0`w{0_:~%oB;{}&4Q%t_Qsu:n!7[C9'1Q TTԾE ۝'0Z=0e7#<&YxP UdMjTQRtES&7L[mT$x,#etVRU>5t진zz6fa_-ݿLc*3鮦$%f*AuE9Lګ/P 79s  #ѾJEeu:kRoo+?>iE=w-i*+ICK,Z`o&LKtZפo1>ZvpxfniJǎ1 TY攋j=4HSO?SIfdj*,~hڿ-t g3W~M_]OL&̵VMOH$mM^ޡܓeOe !CO!A6~[?_qj>T# %cqk=78q 7ʦ4y?IWKM[l ]G=űzNx].toHS5WQ5:bRG< د,=R5:w,=IA/-o@^ {xx_z 梁8W9uiZ |6[Pbтc!/xtͲ3<[j\kWiT($ʂ1Y"E E7]]/nfbYv^:}5+ɿ6Qy\ u ɫtO=@~>eyZ8HL~2]5ןl-W{$#~%yXmK1v)āHv۹送8I'o79.maX 瀔-qsa~Ml& /#{ߟbknlߑǻyA؋iR-{[s[Xb}CCۏ" l-bA=0\װ"Þ"n9sx_~A1{k8x({7pnIbC?~ Fe'Eʶ_<@IU]{`E@@*5匒 vQŻ` X n??U*!$/ǩ( .Qk϶!,h)ܨ[ٹlGfe`lm?Edw\}$& 7;{*8ܹ {w_B/{>/,r7"8qPȰNn6hSb9 P,Ea}B8nmq8harX ;~$,{n&9cWBvl~a1UxPxmR*5ۋ!ͬ~o1.8>˴ ~?l$Ѭb=]Ĥ1)6ZG7$?,O`I`X<&÷?O!V;as&`k.T~d>>(Xe rBUqK3ĵwp7eԲSRE@]XռBq6d5"Ɠ3jX^;L\L^* *vſ+sS>YG~cm-oW:cGҹgrd#h`JېlpΤ9-/^tJ|َHҵ,қ?ɷ`mUz}3\eK(xxd?6<HrN@9GM-#<"Dx[I*,\龀hW(ܿyR35nn~}ʵu,9>c@ZBqq_-DTU$qKNMW1̠/ͅf5PW GNMȃsm kq1'rNd yʫGc.j_EfFdՔapOlf2GѼSF")IE =DHc8B""DX!|> ֹuuqs?Zj2*Qk*ģnpRhxNfԺ**e9L;E^HIH%a`0|g:ٍV#źOdRPv# 7^wM]e1ftY|eP3TF3"Z/3S$!Q0}]qWAqz-Kf05i3hfTDJH"ö8չ6aWd9+|MQOx ?Y+YV^#$.T3F0:LΩ3*9]'ػK JZA٘3:q8ŰSɸQ Iӂ1~,[Hd sn}`,@Qnwf{$:E 9_72nDw>6vŢEPXX ~C[CmblO7i |+^"bfR =~1 mALu4Y,$(h*Gp?L_;3iϞXX6b o[X8ϪUى&89v,l]Iu ?]9N93*je> DX6>0 kƯCg8SiigS&X~cw(Rl> c+l S`4VpM۟2 |2DՌ,ͼ^uo$Yg\̓S鬲{ᖲt K=^88K@¨ff75\⚲.WYW2R@=O,@U 6S*W"w>ċ熧q?_#*פ\'i4yr`P@HZZvnxyވϭz4};HٟΊ7T |s2cYGuK\f9~HKYtL:e]UjKFy'@@ &l/쿦_+̤(YahڎAq-w l.2ł} 1!mH s>n)%Sf6?N껯Sǧc}x[&&ǹUk1q.e' ԅvRO n-unҪ䱿} +"kz~瓉I<\n߀agDQ6 M񻺤`X\]ݾ`- avuIYZe{XP9R|5!Pɺ6~v#P&Ė;TO{~}⍼2btc^Ͻ<4hM&)n8ۜR,E\y 'vX(L8W%n#{7ȷP7ӍL }3$aǐQ Du}P2Ad9eGL9|0T7o{p/$$Hɴ{) 83/VtY sxاŸgOïT-֍ tV{dkZ:xZ8juh=ǖr>M?&i]مOC:ה!._3lX"ApnwO ] NzYW)IIV+),#0ww+,1dO<)H/)봒"5q$l3܁r5-ֿ:^6sK>NS zL2W`UPmDg b_KuY5^kzJ6%,>U Sn3iCFeXY k.q50 8m=+탸0_N_ |-ŽPSE`1Ƶф_ X~(ІҪEQ DLf?_߆θh-?e>ګLB#Wy(Nm$e@[^ÛqY] вJ>b9i7Q ;p;`5I,ERKI =zl1i֎V$=dQڲϷmuk1ךڸkuc3}81%ҽ3%&إ ݜrC C֞T /-$tPK nKohl ^}]Qb;:3OVQ 3򚞆yI1Wcf·sh:>78jTz}*VjWU|ݿCـ$p95K Q]R7#~}!GR<&I貹#BY .ѹoI OAS5TMG|4pY ϸ! #sZs$])1Gؕ$6g7_lo|xJoYuU9M^`HVe.VbW<1󏊯LV##ƭ,eĻЉkvb,Hݍ=*])IT9\YTRۼ56;vO _//txJʾQҤsK.8,xm|=z0}㥳έf+$);l)W WDU>gGW3=eUG ,qYY ( t|GtISP:1&RTKP2};Jby [ qV$)/*cAn-cp98_ǔAMT+>Xkaae7۟ۘF沒f+M/eRcm䷒R*/Y/ +4%m/|2آzJDf >MeR.vm#6_IOM`XF,>/N_FgO IdܬMxD:Ƕ;b){OQF Ib( scƷUd:TTqҤ8)K'*Ǩ']akwѾۡ^tTZ:fsjo,["c1M6V6㔌lFy,϶} m] /yĹɺ+a/˯'i)s`. \o9}錦oTN[reb52=?L[k'Z p1f;H^EV Io<,Cˉ€ Too=o*ػSг.l?!}@[m<}moPJKE  & vX[|O儐+lx"ß퉏"K[aR;`&D`-,l7n{Xm.3FdW?*ችOĚy nf޶ RZz$g2*ў́#Usrֽs?K=V+4,+BcCŏpN0vQ1D.. ML9^Ȧx%>fi#(y:Ϸ7vԝ"s3)3|G x))H\(m9άI9B:-}BSS϶wl`oE̷CjLIY:RKs YrTIԩ^/:} x-)jjSp2$ߞ9!:SW-.Ͳ=O pzl˜eG̪?=m'hniZGZ\uVHct%yD%R;D6]` 9 ѝ^gK$q",77[})gŔjz咢FI"kYG7`},꼚2˜X*-;FϨpRej1?줐o85Z:xPڠ&_Y& PHMHg9R|)*NMZEF`OME`'mij^K81 Tx.8815-],QKR"ꤌN"j O 0:agZ#C;Υ3Y婴0U!\E|R:ꨴ\zaEѿXTtT5̴ML=~h)楞8&hgM ] $x8V6~f5;ڇ:8o(VMhszzHt,f" ̤J@ߦ Qڟ3iUh\冞$ZuK$*VMKϛ"L:tʳXsL=3*y)jbJѮ 8Vzχ<ƣMd]55L v)OHucm$0`)0` k/y? /!?h?4c}okk1Bn  i_V&0`)'dwČ7>6eθ0`3?x8   o<R?10`)+w?  O`T'_kqX?`{'?dz0`InKG?80`$?/b[#?%WE0`s?C ? $+Wmgx+7t0l00`? endstream endobj 133 0 obj <> stream xWkl3}ξW<^HɃ؉ؤ$Q# yǮ@@㖴BRRUUժj%#T!J*RPj+w={Ν$A"mlbtjdBؙ~#SG'b.ѓgv5$<6>z^Hrao 1.-}7NNm̈́$!!{AI F'~  ~ujrfV&Y$|=0o Ň] a6PXDc$UM7L˦)'mb-i]~CGgWw^]WIURD. LDHݳܺWsw8!hπ]O\!īXh^ KsL[a_xa%d!,~HNGR[ [֭[jUS0t]4Y!N:bJ[.3 C')Hq`[ 7 4hTpR[6r^̅ cÓN_ּNJQhHz?&jEb )y'[ Ū%&^m٧3R1)ޭ׎Қ"fW&kGZuI}uǶ䄦QYV5D:mTjs{w8Mjn #=QYM3*n43ermz0xm$jݕ*UϥPU'O<ј t/JJ|u3d:wM4HaXPHf k͈v:EuaX^"dLKةAqӀqh9-mTDOd2);2#c]2BX$ji ͌H$5a1,>O}y & n:%38i_DYȓ1,|MǭQTh-փ+k$(YC6-,R33+V"Ͱ+VjQPqƠTʤ 5qIe9-+Ji|^ U3%HPS0ґbY6(dRQD"de'aeţuOnErt[[);=gn}ߤqfeW$ pa3[iBf@"(,kZiÕ@Srr4-k.5U*J 4Tl<2bȤsl6SNo9f}[v3m35M4‚TN3̆C b= qUVad~W}=$x#gLFKݒ_K"yKVHݩT$$N{~(e١y6̵asSúμc!^y5yQ~;mxq;n\F2aT0$v% ;9A_aF]KDsqcx2"NȎO}4D ) gA:C%&Q,Ogo_ 'X  {Hy=υ~G8.whVV[YmRs6N!N%D"Ä@1jؑ> 7otOǵ˝iY܋lb/^ZIs Yv{p/&îElT\g3iܮq_)6"JӜ0~Zẇ<g߲Ǡ7-wkk=Sḍw#ܮ$2,Y8Gq=-t*Lq&n?j||i%W{;ݲe> q;ǹM$N,^7Bà9Z3=4{}u*=xE"_!俐# endstream endobj 134 0 obj 3102 endobj 135 0 obj <> endobj 136 0 obj <> stream x]M0 x aWFʡj?"5rȿyV؞?;Ò Sw9cmΛ cfCk;gy=>n^gv[sz>qyX1_cFtlMmC;^|.Ƭ&cZRNgbEQ&(ؑ+pIނ+Z+5y~aL ~e}0Fzc%^;e)mAc/C 5jZ/__9n6k.WZ70kCXC\I8S/8_PSpB7пR5?%S;x;8Ww6`gM Mw!>*mt0nfd endstream endobj 137 0 obj <> endobj 138 0 obj <> stream x|{\Ź̼wwe]%\\!"e6ẻQI5Fڪ^5f!'VMKi5Qcն4ic<3rƞ|~ٗyf晙g3̼,~EC_3k^BUѷ5,IO#$ؽ )dMg(B 2<=Bm6(M|K:۪Buȯjy/tgwxu{xȯz͐FPnU;aloEH=e)y2BRk8`0ƣ> &{YyJD(!h:~DiJ@hT =~'zV!4~, mGExdP]ly.(f}%@߱ë oǻ>?"l!g6{_O-⯗(ED{ z#Z  fvGos eXq*^Z|~?#0   9I"$ ' >]rs¥qn+.j'wye{d=+;'*DW|p<{ 4q#wQ(8P9Hg3n5l8/2f܃7?OJgAf3sI1YHVs%IFțpz.pM s\{{{(|~P({E\-(U1W@JZѤCqP9$5Os;jIt;)WW`P+GMt^IqQa9YYtgZHI'٬s)hq:FR*2#T;7Wsw9.MN/xg4GD(Z|>ODlflNO3ʼnbXSW}[A1z9w3Ztj*4۪n# V7WAwC""zvRk8efT ԁP:buVQ "\F5ju}uURjj^sDsaDf,h&"_Qa E9:x먀ZVg>y7[\u&q: Y V'D%FYJڒ̓a[ĚZF#;#x' )ҙYwVӒbD\l FКas(z٪zgj"୲Vh=fvΐ`;n&៪ccT͚)d1ȹ ""D sG#<4li*  DT2ZNGdS8|~W*g"JR;25#nw$;bd\ųs[!*PR2A- EԒ4~̨[GJJVyi,nPFh+L7Č?/xAMn:0؀ˤ,է"h- GCCR- `"){cD7Z;Ń̓@SȳI%) Fç iV|F%z⑌?!?U)!Ӱg+Oʗ /!jH5d@aKR~鑡/e[ed4iDD:\tCntqǺC܈% t&? qdCr2-2dE: m-Wo1ww>9l *RDxsgTxǛ5r69 *4g$Z~κ`=6^uDPʕ2%'xm) I;;{N-$\LW`)"s)UlW s`disms&RIb'Q_1=c'_/F>UJT:).W`DlJ݊:96PHՁ d-$kR-._i|Kg6cuҸVi_ml{6}|[gD^g27͜ٮ- Iv<*|WX<:*3(:r2\E4$%sg9ȭ)tS7^>~f,eg=t)353]SM`=Ul,iIʌ1+goˏ;}$ݼQv`nYL|.n\ XCd>~s5fJ+S]J_Oۮ]uCC7E)F^+F5⬦ Vofh&Fo4j9g]<;'4J< H6q/9c41FD42wrk!Mtpv k"q5D8 ?я&7!S%괒ҸGO&Ji4}QO7gR(.7[bK3)_j1dgv9LWo_W4Q!+=i>wdؿQN><&.CWɊMIz־*~`:kӎpmr[۱ۡ%\s)Րjb2uM?pf]0 ul_ep€l01"g8Ux Vi0&G9 RvN\qtYgy{w7ߝw`\|wz7/܃Օ$՗Wn 'LO˪e GA4{}"!/\f֤lW6+umNs-II{>*y|Y#LJQv2SVH0 @IL?ƣi hxM Q!AQw8aށ+JQ)K&_|0 spl ?ӐA5`.p3reru ó L홧ď{>!;<+x94qv⻏+'^<sQ :V-\"|Cu&$$/Lw2KYҥKWh-I[ò%ķm1I9-FEw bLX_*>)yBTuf YOj^ИrXBh1 3NwfsP[4p3,l׾;n:5zVXI)Nq8EF\uJ=`/vl08 8֟֌nYu[9l ]W~S axvcp$r&PG^=&Z9Ņ ;FUlgJE,ft}6RgUo&nWۭ=}RuPVkި}pqi]̲|AP3\w9Bz!+v1Ғ]v`8c̞~\"9IE}a X'Ci73Ժ<3yZW>|''ޱzwNώd~Oko>U]xgTZ>eo>E):UI)vy\*r>wg -.cFqӓ7y:3 )Z^W>xہTjZ5O>i_Qr0.gN_&УiM.֐IS'n Cbiy{&ىI +*5){SdEEI)UUI`nIx_Rs@7c0i X,֮'w?!KǼd[P%]PG߬`rJ8hQi#(ԃ [hW{>3qk_y`sk>51"hc&_(csy^KTKxY|^OrɱSRd(KTA^hP]U( c+jx"+T*%dTJeBnR(g&Ltx%܋W* RX?,KSBq̧veVHl_S%%-%NcT=3O AY,X;zԪR29\N_&BȒTv@*OqjIV=:Z a3MJ屄,e|JF3Y>N<cM ̞ 1vb(?f|䝉i:JWM\A7WZݠ/Td{Md)L@|P${ mC 1tkx* B~1!C*c,n<*^oI !mmEGQRW(?Wݤ:$ aQyh!UÊfd1کYcR9t%6K48,2h9- <'J"mBvVrA-E(8Ԩ_7ua9MB+.hx%ZBDˁVVxB&^֠9{TBuz'q(`hՈFYÌVV29F,I4( :JD?hБuD%td H4'Ѡ#|ټ :IAGH4HK4HhQ,F2w2ZCmFkYctO%6fhy mf2JfaF'Qlɔ'h݌Ng%ft5gӕUKi%_XY(oa4KVCpȋ|Qu !,q5Ph{<8D(i@UraOySjQOʖAo*'͖VZ -!]m6 aj D[!n {l1!e38ůu  Q9Pz5oj9ͱp!Jjl-PF{c-B)Q$ 3(6")OXu-A m/"o9+a s/v~蕢Zr/ SL]0.x16Mv6Kj^jژxA)ك&,^&uL1kX$ 3'q ,"py%YRa,Z'kL6ڲHn;X1E&瓴R$}xc[Ҡabݤl40SISlh6(o+6dy OЧ4ַO*eHS.b v֞JJ!oF H3=4 nJq HvI3 0^jYi;61SCSsu>o"I1o'JtV6&VkOWX@aݒtALWV X^ta`ZkgiC/C<(D}wrm1lCS$u*{l%[M!ʦgiċbcR~}vb2*韚؝gz/C"(AP 0k?)d̆:ߜ-ya+4O.asw6ځir!@LSwGcex:CXGPJw_ʫbjK`'g9+C:PǬ)t[c$hkشf&=[Xm?Nm1{ޏfz˘|fHZӛX/)HWk4][%_2 d&}gߔwK+?eA?z(\1^Wkv@j-3Ƥn4)|! eYT#*>o^Π^]B;$oJltN3\1eu3dI_ѹ(b 69.$ ]$8㌜3a{?GJc´9:97vBeۦkuwH5lUuK1yϷ6iXuMNh{>ί {*=JVv6C3OW' J翀t׹)z5}b>'5 GNϗ/bðL@'(vȂ3|*͆b|DE5g>"xbt *@[Ep?;d]WЛ>XwuvH\ zÁNݗ+Vy)v&vҒ)-͟ QAX. lj 5?Z x7{ݖBQ*-[ Ĭ_+Ե1fdžɺZv Dzhkㆸg#q'.ҿJ]|W__|W__|W__|+nӴ_ݯN>ۙ)__qy#PM`kp!.ͅh&]SDz΂BB<+!lp=䌏tAX Y^Xe\KUble19E܅43'3 h4sft_c@{@8T]{p<0`PP&Qrj؁8CK{h?#8U0 3J:*W%dP_U"K_!/@2yq8Ł*5PiJ98 ΃Pa%  'GHp<^V"F!y6;r)y>jx3z:NC\aBBw~AuB3qB Kq?,Oz%͑0zrwر>Ld`4( Xw*UvrJE;?Ov rT&{P VK g@:Xٕ4-Bv8uG6aG[t|n?>J(o@ov2oT %OF1$Ez>oq-M:/ql > endobj 141 0 obj <> stream x]n0 E|E¼%4/$}L?I4R Q,cT[7?+܌Md.Q[Km1@_n($}1IzSz ؛}7w羠D>ϭ{i{H5u,0ͣOpbɣAZ7H,+EQUeV[l}(Ͳ墌+fdΑWK5I<2wyg=yzҜ8E>\qˌo$c~Zoqx5 u>Jŭ wwC=Kt endstream endobj 142 0 obj <> endobj 143 0 obj <> stream xUoU?wfEJUÀ;m+%mAj[`4a;tgv6AhbBP#`TT>hL|ĘhbH. 6pv9w~ٹs pTHyN+Ҟ:^a4/8<.d'>>Mu2hq~3vxrpKhozga&'hGrj_Um؀&xwF7| ;EPdl싗ކvL4 A" :Yx5!>xA+p x,\W[08:9;x(fIIGwWW\1G=ǹj]X:\3En39;pjhڌPJFhneQl 4tlhXYa,~[1]@3LI@HbGJ('CUh+Ak#Xud*8JvJ#!Ak8NNK,/I@;ySb9!Z3TZ$V`bHWb K%jsj cwS|iTf^M{GQ tKnާ}7r9:>]gN!h9J:ֈ{4ɼ*p:Se Jhx`r$["R*p297dnK)~U)0?Sr8_4xɊ?]:JUJ(җXKZp_܊%:|'oI<|;˹&)[Ӄ~DcPby(4ÙQc7U}>fLc2s0 *ܕ+.Zv/Z@Jd)Naj> endobj 146 0 obj <> stream x]n D|CٲCn?E}m@f̢CK! C 8DžBc UwUv7٤:gZb]+*ޜyJ#~DwKJ8!e0i > endobj 148 0 obj <> stream xXkpu>bx|AKB")C)aiHI) $` (+(r8nܴIO;NԓTM=Nڦd~xVnIS{&Ib 6GϽ{sE:,nR(ٕ3)þw[nPE 1a94/y -w=l /^TNڠ#K)OѱO9=#˜^Ts %oo'~߯E5=yԅ7>x@5DCEPq[75XUw#$dmMJaRQUy٢őE&HmktaoB]`CAG3*IuXTrfSw8s,92re2PZzVUVtMuk u "6L>DžN=ݗyN]]~XCSv\W6{b6YNg4 n׳ cgQp+>)sR[ͽ@qK++:yoG w;h^?vU^ARL z稂Ii;[0T>I.HrŁuid b)-=Y E,Xg2Q>HqcJUϼUg9mӮ6/6\S7Z_~l#soz455*ATl zȃzí@D#=R!Nʼ]rXm4x>vJeB~2ޢww`zfbP N kYd9S)pP!|)N:PB5^eAoX&t_:`FNGJ.T|qjɗT*lLY>8qizYXC̠`3Cȴ(255dd_zfk67ondei@Ll$1<%KWPIgr\UURwLth w~ѐAovCm>!W:ѷˈl|*f#-fN-*I:1rgbĐS[G,ͥv+Z@X#ImG l8]tdTsL&hdlC‡4ϥf{v:PHqYZ}V{^G+v cfWXH6jQ#Sk5!RgR͡+56qbʌډUT7Vˇml8 yLO5Z ~)sŵa@LL-}13xGFt0rfL]|gVMI#Qfځ$zAg(U,&>Y3OɌ9 ћ0g0s:s×= sG[_HEz5jL UO&1}Xm+;?t+ =f8L,ъ)qe0y`#6o֌c_L5;k2FU"Cu!j-8+m*6Q6cN32c鏞:+Ym S#fc{\Jcj1}2U]N=_ 끘4Y,_[ʕk7gX?G\;Wn\wp}m[=/u:ѐs)fj̀$-W1}CjҪًLyo^I:+ׯNظ6Ak/wwmk76'mmמnߕ(,>]YdaV!Cy=>$4)ֿg~6:Pc&8uq1+c:> v}U>Ɩa`X!Zk'țz~@oE{k]ݿpcX>VE|(:F^#vx;ۭ,pK)&3&(d+oh2[-Uʁ)J٤&Sh2,:?dJ5ق0>'2B8-4utt3a|R}pFNEbB5 +r4XcNFYa!ISBhnNS^ʋB_$I$+Bsccqj sHvTo*$tb<)ZtgOpya9J;и('SxLh7fcHJH$ В|RT|>JʝB&,̆bBRrZ"i!k'%cFXI!\J y?8.1g DfXJBғ guT)j }q5FԝIaEӢyom6hjCipR'!ʌ [UlNY*PUdN< 8Rtn=8!\đp"y"KB! ޑ8s&}{GG[;3>=" QY4{Ϋ|t(MN )¡y#+($̢:4EU3oN!2/iO㿒@p.6 ˜Fhhi]V}£TZy[7}hz  @"aHMС^a.aW!aZY;δR g'=ڼQ"0= (epT sxxtسrfG'piF&5{/97w\FwxtG;1toӈ)q14#8,c+|/rgHkl{N{٬Vl6Fx@c SOo9b78s% endstream endobj 149 0 obj 3860 endobj 150 0 obj <> endobj 151 0 obj <> stream x]Mn0ta$BJIXG=1CTeȂ3R{g:UW?f07o@\H%| ୗiݘeQ֦/bul O{nɵڰ:XXq30ƀoL\deG`kf˥3RTE8 ,e"7XwY3oS֐~Lk4wȏ\\?F!K9 $kЫs kȜ_ȚNzοó+Οk< ^1 s> ;[}KntȨ" endstream endobj 152 0 obj <> endobj 153 0 obj <> stream x{{|TչZ9d2=LB$A0CC#I` <)QD jE@DkZFSE圶Z9=}X$=sw;={׷[k n@*4h\ocB?E6,nG\vmޙոRܓmޝ7B%EPC5ȧwoJ`)u;;EQ)(zֱuF@/3#ԉ6hu]06x_Q{@{*t'~CT3&CLmG@/a0nԋvR^kc>$݅(bǮB/C$~nw0 Xyv,v.ۍ+W6X^_lŵ5BUe -S\TɞNw9IFը X0ʮtUEhF$dBwAAیHTDňLeZv2o <4/'[tѷ*\\+\Mbs)DJ3RF zIbGhmݣ RQ*Pd %$rƳ`)Aͪ{B256J+ڣu6)'{QT㪐P4d+Ґb+ξ0zxTQ ҕ{:O4Uͺ7Ih2!.>O)qu .q/K%[ "*@hKYij0יڢU5EH7Xlڨ~McrWmPsͩknSU#@pt{&A&:RϋhzT\1$5#5׻G\@QƽU 8-:i!KjjsF:$E=b@SHQAh}n 2tzÐq*]mI0 yoh+ lKШtzED=^W*NOVeϊFK[XE^QoeYTA c_AN5UrૌΨ#bk)6ڜ`D 0LfR +\͍s+pa\0rQ[&6R6  P VAU6~[J  M0YbeGE4(Kة<4=G0Nylr?9T 54]EA@HEIFW-Fudm=ȐpUM4!'TOg2ULFlEUb J EQDX88Ggv?Ϯ6İ/(<`ZP! s܆`PhuqbZ('}UQFV!M:֌3_þp^6j(WZFfa*- r\`-|F+3S)K*M/u,nh^$X6߷[՝,sZBuqNݶYG֜Uy5mU5{ ry `k-@lrA4P*T=BȄcXoĺt~KLF^cδ95HI 0<{٨#p)_Qʧ~%RnURJUg̽/b1.bTmnq%'3ںY5+ (>@3Є%&xЕxIj ʤsH-4oeұ,\%ءdERٲmOdȒN^.OTAE'01I?" Ɋ aF҆J4Xk2Y+"HVɅ2mXk2%i UJd$>5JZ0L>/{=- t%%:y , IQT\T´+V)}q?gB, [r0;U#sj Ջ`ΩϨ*dGu,پ^2IJcتWO .'$뗙-S=ÎC` 7lbvR:Waq49uF3ϙ풫gXlXK{1YNѣJΊKtP;m뀫[`s!jUZY-+*;T.,Ud*\g\Bzś\?fB >#L%eNMgŷ,&eβ@ʼO>;c//X@Yfᶼw~bͷ/ێ,m̬TTW7'5'itݤ+cɖeyF,]; OKF`EBոaL'خdJڧ>*An rd6-_EB.X]jMzӡ59L^.'L 9GqPȩIiOra@ ~} ydLϤ 09d0P'[NrKQkR~:A !3O oLT„__a?F? Ng!^@_#"xP<69+qKm+ [융vm #n*- Y:}﬿gťqɼ\[Q5+=|>vYF$2L4,! DVu O_)H ٬go! #SC%;iH-۸dɦJrӒ%RN~ӧqxgxw/ښCGtG/A 0 k4hyDa+ں&"( SgT( 7,VQڞ1Z|m˯PD1;@Tnj T(SsC>3NUntfAUnǡ51BaI  3a 1"rMjPUh%{@'jg#'ubRuZYJh w)NL4M1H S󅾮wUDK*s僋{kk{Kőv5(UcWT뽑b[ ٛ%_B8 ;cўgi=#ԉfa dRO[\H[l^R f}KxD ng<]B3!mZa\0;AΤAQ1p387y<-~3} o}asF钲8u 3V{g+=6ߺl`ri[+I Łַw \l)Ĵ*J9w~}m)4,/4[[WEMs*!{ ۺcxp+p'YIvչI NlDCB֣,/nC\sv58Zf:>+̙77.*a |/HS7ޫnT){j;AiFݨ/hD2+[22-|܀KKl=oOzC)קSE+`"@y[28ؽ: +ǥ-ĕ-‹8t9p3b:Mt11/2$ip,n1%[{J_ӼbؔVyV}w3ةe[=~~׋O^}\<~s7\3u,^Kf4)KftRh ee)s:2Nm.}o~ptYO$Ws:~=[sV UNs[ŀ&чc̔@~}HhyLԒd={!6+xgFwfymT5~͈悆HaBAޕMyٔ6DR͢B2 ЧRzmp>OɃr̼~{ށp7e=e]`zDq,wه)06%itǯ醇u>Lx|9DJGMP?+5ӠuVM;Ԙ),&i S Bri ۍx?}b8&^g's:YY_ugpЗnѡW*4!/˱VHؽLW ]gZװ@&EXʼnnIX;Lo?wQjex6)5ع}ٽ)bF6uv,nq7R+r꬏p_NӁy(mҌ:`$z,E71S59VICiKE6mN7N.f9_]8s֒Ց=JXݻ^Z}7) v~uـ`+9S hΊ8"8}f!Sn̮ILwV;V ɑ4~gFQ^z[K3l+}cW?sM-[8f?eyRkg76g>.&|܌/?ĉ XFhZ`j&=O|q¡LL\1 o%'&ke֒FeOuOdyS7 b_H4XМ6GEN:Q P+qd@umм oj2~n3h)s߽{g!^_nW&*E N߱Y22*R{cҢ>ŃXo:uhݾz mF9 ^h" ;ͶK8/PLUrV*k,%f&%MX+h8ɉ~ `K& A*~"a Z GhKW^=\9K:O'/',aFQKЧwx؝B`8qJ~kcVVSV @R]UrUKTL iUrUؼF'>yҐZ 75@S?LeT,fݮ,NOJ5ВvVo Ba+'Ɵh_pu۱"_]~[?zw֊]OPk'b~w]jʮP{rp$Ӑ .P6 Gm5ߕ@>%fK{ٞIX#}ZȡZW/U蜖TZNu[VmbI#.ˬ魬\pG/f;*DZ?ĊƭDg`gkr*gٶUΥkRKJuO2+1NK{4`+h`SQ;D<&xlǯӣ8Qջ=8>߆T@}Lolƍ?R_Gy/ x>?pwf0fUxp@!,uf" R^(S ):HC.OPMjęA5I8Iw<)IIrr!y b~^>Ǽ^Gެq3)i3z"D&a4 KG#$f#&0DLUF0I܏QWN2*h9ZiU>^FXɬxhޤ6[+]<癜5mNjik[!B;Gy@6PrJJ5g !Ҟxʥ ,} .Iwc?o+RKQAr%+yIAx;\Xbݓ'j>b`I j(4_nl* IPT,}rC(-h2vsg[% N(CDᗀ^xATGlrX"ܪc[yô>DII7íMqtjӫZǰ}?m h ~nWYݓhAqr2L)EϫsjO'u qUL◈Ի䷂U:oH̪g Zcϸxx7G5v<&V?_Yު:n`O1[~M F[`ݯ'egfqzG72#~cxNnU뒆%hq+ûy| (-7pՒE?Xi$z8Thf3oyyw pH- dYP5>Ƣ˘f]Ej!Sp4lƄ5}tg';Ϟ\ŎM$h4NgS.c)t8nWh(P+Z!+]4ʂqPᑁ$oFxD].\jBU4 ٨NgNqf\nOZn:,_[™70ϳlS]9ۼx-g_6̵ip3a&dh(h\}Gy䱍ZD{y#^Fa8aE!y+=Q-"'1@M;FH8Bl'zݓ)/7) ASʏИա%_(#W]J(p9(jCA5V ~= 2VK d˰ܚHk,4vXq.SI193wmÈıwrPb%V氘(h].#ɱ+pZv]jFs؋,0()ÔswҵcЏ>Mht )9ݏ{ccoxbk{kw)7b=`As_Aw(!:b=`=aeh1@gQEmp!;b>z-UᕯGCxH]`ʇ&1(/*؁*AE*5̓NaB>׌WqJw<ۡV+ 0[zu)#Tv_5s `2r1I.~=އg?B[h88jAS<"5L@It9eZO$xqG19c'QCv3SZɕU?Bўq?qaXsj\ |PO{Ir層aq8o񟆱Og>oOUۇff|d3݌djr̔bu':Lk;NuP9EU[iv֥97{ h .]ތhqm3.mƜ_?Ac-OѴvcwtj*wW*o jy[VZG_ /BxowWxo5.\maVv׮a%F+q\Z-vh/i)vJKq}h:@ >paS{Z^D{ 7G}QyMiٴQ6[؛j$i3*kjI|p`R [Hj0uXP!=HCCVz#C׃T!24tRbŋ endstream endobj 154 0 obj 12460 endobj 155 0 obj <> endobj 156 0 obj <> stream x]ˎ@E|b]d!yC0=Hc@/[HY:@r7= o}n}z~H].Jk3%Y_y\gxv[GƓdpI~mxOÒI]?>_[s]x/W|*zmҎMMfduϪ9ۏf&3u`Q,*`Gނ e%zbց_X=_Zy=ߔ7d%kvǞݳK`> Lك?ӿ C_4KRӿ/17Cn/j$cB7U?|k +F`VB Oп>_)ӿœ%c&BkY;o/ҿee17K,h6_;W=Y_Ps/ѿY߭ӅßcyGZ_"zq}Lㄔ~~Β endstream endobj 157 0 obj <> endobj 158 0 obj <> stream xX{tWz,˲-4b1Ȗd 0 ےml_`#%-I$m!$9=.I,mO l7!mMfzNf)iँXh e{zz_g<3~NB `sHA$BExtpJxȪr/:\ 3h1@m̱2%v9#=gGAP߃zk>I#_ٯzQ+šX"h`^;Cׄ!ķmOzQTPaer @̃1 zePP}F"Kj ރwex'xq+I=#nSb4s8xRG,)cS8 yC\^r^H9Z:H 8IѼ{xJƱOQ >!?l]|DÛsd臰GDZhY$1 D!\3/3_‹9 2 ԱmCkKذQkV]fTUV,)7- %|m&7GTe,Cɻ|Pd|KKy?s >Caܽ D:D-WuUwxnuyP>{9(oeYb4b Yi㜂Hk|S9F1)U9( XGDpb +v+&?(tvyMz[U*h&bJA((Ŕ\BTv oۦXg*oMҽ`!or fN?mw$ܤ rW%¤Tt!\)_?sZ>5VF0tztz5Y#n z"~_=o\7{gc:95ia˓9ءVW`|szS䦞Yϝ>GǓd D8vҡൂȧ V!`H g mҊfqUpyLC8yO{8R JŜ^hB9eb ($`Gpg<),g#6 F|`u6ў9gה@s]S`O_Za9xhpq#Ϋrg >+-yF򞐗N4dhE((0ϳJqt24GISN2eqFz1P΅PwAiKV:U8l4rPG{tjlͦ*ilQUɠ:YԖYk7L#(%ts>{'8:=6JȲDȹ4VhsBY) ͢~Gm:RY|[O&祄[Sر*_/~y1hq=#t٦`ԉyLUm_f S<5 z< 2CF_wj1<8 R#U8LݨdS + & ڲfmLƦ1helFro'7ybd@un0 C B@^+]3ʽ)QRE:x{TEĂ̎9dF aӧيV*]_cߞoګm|c-^oOFozCD);}Ew9KT>NF94 &rD|&b0֒bؾ@^X/Kxh?A?Yat {| /*/gV,/X^Sm`ڣ_ vΩ؉Wfn $I[Z%k0"uh\C JGT%DѬbn$\ިײ"ūF]1B\_4 Ȃ8! h?_{_CLKG~s?ظ&{s}G $⪅L1 YRn)rgVjbN(Eť2l^Ud;*ܖZmGt+ VF5A$KV,d5>6SH6FbB}H@oGŲm[LKטs-޶]Eu#obs]fYCJSOR[RphQ&Oo**2;;:X,[*u2CZۡPКi\°e&v}LHA(Rk4:5<بnTCvU{gr?l¹UPCϯb&\յom[##ڙ ,r?='|~E- DܬiV1=Փ*YX-./"P6)Dh|;F"6)F|̙#G}d;lw9\Aq|X7ȈJEH]e2VI$7'J5IKx)Mq>T[fo9nH* C{$m)/" e |p? :,]F\E(UЫ//;lqhm{}=!_m#['}}|^*3,T 4/9YU^*Yg 3!#cMlUq״_oϫ}ko6a֐6JY0wu%K.!/ݲw ̾;NT.8e&_2kIY`[^|Sl;PFV2X', 2ȃm,5dhpWKrpU0Ir.XH$k`yT (e٨E+L@,dN0Ւrf$`!3,rdKʘlLU9I΁U$a%9d nFѽ '\ 6:FQfcd46biǢA?h '`(Uqwܧn؜lzFYLа?ga8#CD2G.'9&E4(b7afԔţa.9> !.JDGp,΍>/! xl$@†P0ŮrL>$O%7BI&GXw(K,>hD&ΎgF$4A'bxˏ`!.FEQjg-T܌11akQczYc0'RT߃H2a G9GPaUx=w,IHsP(b#Zvx4ꁽD(+I6uq\F X'F}Skb2$e}F߉hbl;|&?d?Daў}6*!f%Q ~}s1!audmLHd* 2Y7d;L"5ۍV}\$&,R.lG E! csF%q2mCsFbJǼpسbӆ/ɡ 'כoZ8v^Uv.,1 @Cb>s4۷ mn?<Ýg~ϖ~뿷f`;M~jqwr$<~2_>?\)LT/O?yJ s3J Id$i3/K~kƕ$#+G]Z6(ei{}p3aС dv)'txc n9a2;c=29[[[.o) 6/\Ͳcnf/0*.zDj7W [ӻҏY.]XB):ْv5J j*"w>skyn4Xޙ<ƖGbm8@2QLd<3c6M+mBvVL=pmLaAP| mB&P.*o3=% b*I@hMGcCLI@ ȄK Q? endstream endobj 159 0 obj 4135 endobj 160 0 obj <> endobj 161 0 obj <> stream x]n E|dXHQ"K^ c_i+u:̝^+O^x<)-fsҨ(T?t[DvWK'ӶݎWiF8"$8g| !6k`1Ea S3_$թ!~ .S\#a\zRpu rMV.T.9qޫUK#\qz\Ϗ+,6炣d%P~lt1{a endstream endobj 162 0 obj <> endobj 163 0 obj <> stream x|{|Tյg#Q%+_^|Ӻ\40?bQCi]`K):MTKMt:NSi},zzjYJOz <S#r!C!IFHw$O+tv^)e%`4͢wϣY9[~A9ѿQ.g"JP=_Sr`r1z5DF}b璿Yt4NiYJ =4~¦ܝ\\UDC@mtk^Y&[>ˎz gNjWK}%]Ih+ Q?}^}AbWyMM ɏ¶ i-t}^Ja9L*Vlb=lD) ox`jMVCLy]tu?>Dߤ aE?7z\W(/A˛ߓdGb%Xl&tXv{߭<ʧl+x-o~%l9fuUk&$lkrZD4~!\aK }Q:BǰS4=G?  ncu/{}}=^boK)U\QK !#W|.}|?'X,Ikm߶;ҾZV[/3_&w&Q94Zދb'q\_a'q=α_߰WE"BY)-6\]JWH +}ЃʰrBƋx ^e!EZ*,5.˭3g-[nuZ=n}֧lݶOڎ~e{n7;{?'ӊ~lRʫatˍ9<vb6GWO =ASj,7(w%ܥ]` k|]kYOY͎! b'7{cFe Wl%CABGP ,_,}nbU"vRQ8,BN UQ}'Eƶ>o=86QM?B*:*O~C߄M,rtۇbR\؆Y ~#3;4[Dϝ2S;\>>C=fma,}}8s^s-ZEf#>3ܸ>Df >oG'+ڈ3i'?AuݶԖ?y=uCȿ}]E[[rا7povy{=op}]c}-?F\3̀= aPv[OӲPpBNA2tnEOGnkSsuU+Z|YʊҒ%-,Z*,P͟3;ors:dfmV Wz\ j|a{ܲе~}h4 Rd.ɜnpv^68c,[RR߭w#lwջZ%IwKTO^wg'=ǐ:WQVJC@3gBCl5L",OBi(gq^|-ֲ8:Z*,T'v9P;GdӮosȖSynz%o u-O烞<*#[[&2JQC`&&lܮb.֖8 bbMtGPwtZWv8f` $qH9uU_jMmó=eC9YfDD듘dX12k!zUhšVB_EU`çaTuՠgqkQK|7[Q$P%c/)/Y"^Bkd{EYi߈wUT05Zku_P {`Mhom1*u']QWETόgglx q|O[8=s:fCn7nw5nբzM66OjL0xRKmp!jY\zl5VVS~LhL,E6{XRn_orH%a%WOjORo –JcI} HV .a}PIpٮ <)$Oȏ7يEt27V\x2Ӧ!=| vTkrʰ 1FlSWŔQ^I5ol~f[5x(V`8T7V;NĪ<>Lk[Vi!=5Nh'\Qi2Vr.<DV ų4u|  d wϣ&T69|R;i6*d7q;=^34Z|Cʫ&ao4L }ħPgG0t}~e0q9&iuN[AҔrr9qOisM^&">evĭ#I&eKjI|Ӆf8|4:L>sGs^7q(G%&o2qhnGsM>GL>*¤G%!ֵ$Kb-K%>E J|ijZI|%[%>]x%>C J|l9%9'Ӑ,5C%%]T1 h15[JqU9$#aLtQ /SJ>X}QK h .@+| hմS[tJU>0z"N̲;i㣌1#`Mg_^>G4ߟ*~ h )u4T/mBswJ 8R#RnSZet2b(yN!-.cWK;LbTeCXJH-eJ:a?a^&ˤ(.)+kx6 ȹKGXZOkEvLIOSޚqÏ>GҒԤܰ\I~MIbJ=<&O;C`vhyeR^Rd Y=rDM^iN >Jhr["׺4979YOb1i5]cai!ᝰ#:$;lj.D 655,YO53N7]+'e}hȠؔU(ٷolO[͹c3s/n[+#LjF\v5d17;&-lHɵs6IYBbtmB^iٺWIlY@ų̏~yfH&q)E42* u{e y8`@@j7`8&s!_tKiA\Fׁ'g0m41tȱ{L] tn<"R& 5{rOWlS5ӃB'8}Bai۔_95*`qˬ11"ͬS!{ eTfhEM6vcgd'R9q|% :| b4!Pw?p{䷨Lʐ0~\z¤rAȴXf~w츯Je9]],O=0M#zMBga"[3~2y;ˤW%81;ӌ+hKXLIS{|f& ˝g&-e%Fť3=rK9˼twgq \ O LIBҲ~3f,xׄyEIKq'<'q'};[* >./u^Fdr8gtLZ\[1acWϦcV4/\,4"Vc4^ދ|^g%xBIw#f_z]NMP}QjW1iU*xFOd]M75_|zޣ;qjXGzX^5 &-.T7[:;Uקꁈ 1IP+&t>{X?Qnj}:`oF-{0벪nFS#QU tQZ,X8ָ1ÊzHH R3wݪ?kէG]\U7DnP"~C :`. C_D BH#X@zúa҄"XZW >cR{5[autD6g( z!W``~Qzoߧc*P8(T>XbA{R[E`렐[B^Ĺ8,S0wS,"F6i2VZo? 3#"`Fp[ k iQ7v h>-$$FjX~WĂıPLh "2KgZ_pd,bIG0'"ѺzĈE#hD/KZ l>$ OGbh4d9B;艊Xi !bGw9_HC6oiаyÖu:v6ggs#Ñ!؆xC0_fUdXK@0&Fz}2!+O=rijuarú58+`axo2"c㪺_FpR'2 vF ώa?B;'vɘ)>-)EDH씁*&3"55ҽ~ȥ+WaE]r>3TҶ2\T7#]}9YD$c[Y{ F<džʼn]d`xpdtcجaϏE|}jE7F > L;//V<6֡a-Z-vlšRjʥ*WVhrQ\R]yՊ+V;2f׽f S=@<$0n=v%՗g|q?ŇW) ~?|ʕ+W^\yBW^\yrʕ+W^\yrʕ+W^\yrʕ+OX8It}"ƝedOh[[Z-,Az "rψc侨WXyBpy|ߛS/9<_x#Ke(^\%;sV}U@%;LwH8%iunNn5Lz3L3,w3,w3Yе7ų){<{V?e@ PvGypV?nbha;QDu vWywn9<{^VzDS:KWN"yF =SPh:z{ *'fI#T>eggTֳS!˨ m5le{z(}:NW+M r| ۸u$y:a^ʽV#әg3qiYyUUܶ&[-dovĖ~nҞܟɳ3LwfSigGjo (! lh7`N( lYQ[_@5K&K4!6֓#/"NUx< \-ZpUބ(U@Kyeodɓsʛnm,Y^5kj܅(rss\mEmmG-AW(X#>B[m+F="R J'eD2c'm݈8 0v\(K .' 5N$]26EkmJgut(8wẎ_\$s&\r%E%T:d=eIT(봄H=Z/5O,+q'h!q aL+z=o.a;ӥ#i8U:ǜC0r {yKu>\Sk"[JjPVݭ87s60tk0;Y ;Wjm>\`DR w. ]R+O*+bR{aijھ^fWsrӲӦMIHKKYҔ4J><.n˖uEg+T*,MމOJ,Hk+KGmU% 1V#[t[ bⶻEZ[Yc;۱V<ٷ&oM59/Se'd'o^-/kW $91NrԟPBjm9nRnltvS}*!Q0 6*dÒmdCz yJ2u` jؔ@ZlCXDaSeIaYSH +RZ$XVah>6*2i"9Ok06Sl L% <%}?̆|^vGuw ;ݢ .>sիC2^ѭin<.u}u\u.#lV'z2ݍ1WQ9W㶵e(ֶ]oJfC{~Aڙ١k渺 '-c+5>ŵ6ڲZх)'CfW69TBy_$ JPFcyŦ-o?®xV&3?u-S5gj`;5kXcVsO)T .<^h׷<9\BC4(>z9g 5D3a$VRR[H^2ܡ4 `XV|0,(ybtxp努U#N޾˨=*ubͲ,܀3:O'ʫx35B ("%QV sG#%%$@8<69EbS!$1,&s> endstream endobj 164 0 obj 8504 endobj 165 0 obj <> endobj 166 0 obj <> stream x]AO 96О&f&=?´؁L)VM<@x7kQ13.qe0HU5fߖsGcl_[2opzqwȁ&8_{'Hj[8=O6=u.;"_mKuw=.:dKƘۭUHw>,K1)t~ڀ[ITߓbک}Ymu endstream endobj 167 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 15 0 obj <>/Contents 16 0 R>> endobj 20 0 obj <>/Contents 21 0 R>> endobj 29 0 obj <>/Contents 30 0 R>> endobj 32 0 obj <>/Contents 33 0 R>> endobj 47 0 obj <>/Contents 48 0 R>> endobj 50 0 obj <>/Contents 51 0 R>> endobj 57 0 obj <>/Contents 58 0 R>> endobj 60 0 obj <>/Contents 61 0 R>> endobj 63 0 obj <>/Contents 64 0 R>> endobj 70 0 obj <>/Contents 71 0 R>> endobj 73 0 obj <>/Contents 74 0 R>> endobj 78 0 obj <>/Contents 79 0 R>> endobj 170 0 obj <> endobj 132 0 obj <> endobj 87 0 obj <> >> endobj 88 0 obj <> >> endobj 89 0 obj <> >> endobj 90 0 obj <> >> endobj 91 0 obj <> >> endobj 92 0 obj <> >> endobj 93 0 obj <> >> endobj 94 0 obj <> >> endobj 95 0 obj <> >> endobj 96 0 obj <> >> endobj 97 0 obj <> >> endobj 98 0 obj <> >> endobj 99 0 obj <> >> endobj 100 0 obj <> >> endobj 101 0 obj <> >> endobj 102 0 obj <> >> endobj 103 0 obj <> >> endobj 104 0 obj <> >> endobj 105 0 obj <> >> endobj 106 0 obj <> >> endobj 107 0 obj <> >> endobj 108 0 obj <> >> endobj 109 0 obj <> >> endobj 110 0 obj <> >> endobj 111 0 obj <> >> endobj 112 0 obj <> >> endobj 113 0 obj <> >> endobj 114 0 obj <> >> endobj 115 0 obj <> >> endobj 116 0 obj <> >> endobj 171 0 obj <> >> endobj 172 0 obj < /Creator /Producer /CreationDate(D:20100906083809+04'00')>> endobj xref 0 173 0000000000 65535 f 0000419874 00000 n 0000000019 00000 n 0000000537 00000 n 0000420038 00000 n 0000000557 00000 n 0000001401 00000 n 0000008206 00000 n 0000001421 00000 n 0000005934 00000 n 0000005955 00000 n 0000008184 00000 n 0000012841 00000 n 0000012863 00000 n 0000015092 00000 n 0000420202 00000 n 0000015114 00000 n 0000015875 00000 n 0000015896 00000 n 0000105198 00000 n 0000420368 00000 n 0000105221 00000 n 0000107399 00000 n 0000109261 00000 n 0000107421 00000 n 0000108454 00000 n 0000108475 00000 n 0000109240 00000 n 0000141846 00000 n 0000420534 00000 n 0000141869 00000 n 0000142737 00000 n 0000420714 00000 n 0000142758 00000 n 0000144155 00000 n 0000150701 00000 n 0000148883 00000 n 0000144177 00000 n 0000146719 00000 n 0000146741 00000 n 0000148861 00000 n 0000149894 00000 n 0000149915 00000 n 0000150680 00000 n 0000151734 00000 n 0000151755 00000 n 0000152520 00000 n 0000420880 00000 n 0000152541 00000 n 0000154523 00000 n 0000421046 00000 n 0000154545 00000 n 0000155519 00000 n 0000155540 00000 n 0000156247 00000 n 0000156268 00000 n 0000156831 00000 n 0000421219 00000 n 0000156852 00000 n 0000157777 00000 n 0000421392 00000 n 0000157798 00000 n 0000158720 00000 n 0000421559 00000 n 0000158741 00000 n 0000159849 00000 n 0000159871 00000 n 0000160644 00000 n 0000160665 00000 n 0000161244 00000 n 0000421734 00000 n 0000161265 00000 n 0000168170 00000 n 0000421933 00000 n 0000168192 00000 n 0000169343 00000 n 0000169365 00000 n 0000232900 00000 n 0000422108 00000 n 0000232923 00000 n 0000234207 00000 n 0000247336 00000 n 0000245951 00000 n 0000242875 00000 n 0000239885 00000 n 0000237801 00000 n 0000234229 00000 n 0000422990 00000 n 0000423142 00000 n 0000423294 00000 n 0000423446 00000 n 0000423598 00000 n 0000423750 00000 n 0000423900 00000 n 0000424044 00000 n 0000424196 00000 n 0000424348 00000 n 0000424500 00000 n 0000424654 00000 n 0000424806 00000 n 0000424960 00000 n 0000425113 00000 n 0000425266 00000 n 0000425424 00000 n 0000425577 00000 n 0000425722 00000 n 0000425876 00000 n 0000426034 00000 n 0000426185 00000 n 0000426338 00000 n 0000426486 00000 n 0000426639 00000 n 0000426796 00000 n 0000426934 00000 n 0000427090 00000 n 0000427241 00000 n 0000427391 00000 n 0000237272 00000 n 0000237295 00000 n 0000237779 00000 n 0000239382 00000 n 0000239405 00000 n 0000239863 00000 n 0000242346 00000 n 0000242369 00000 n 0000242853 00000 n 0000245423 00000 n 0000245446 00000 n 0000245929 00000 n 0000246745 00000 n 0000246767 00000 n 0000247314 00000 n 0000422797 00000 n 0000367247 00000 n 0000370437 00000 n 0000370460 00000 n 0000370662 00000 n 0000371179 00000 n 0000371552 00000 n 0000383663 00000 n 0000383687 00000 n 0000383879 00000 n 0000384257 00000 n 0000384491 00000 n 0000385903 00000 n 0000385926 00000 n 0000386119 00000 n 0000386411 00000 n 0000386575 00000 n 0000390523 00000 n 0000390546 00000 n 0000390740 00000 n 0000391154 00000 n 0000391421 00000 n 0000403970 00000 n 0000403994 00000 n 0000404188 00000 n 0000404792 00000 n 0000405236 00000 n 0000409459 00000 n 0000409482 00000 n 0000409681 00000 n 0000410007 00000 n 0000410199 00000 n 0000418792 00000 n 0000418815 00000 n 0000419017 00000 n 0000419309 00000 n 0000419480 00000 n 0000419581 00000 n 0000422323 00000 n 0000427544 00000 n 0000427759 00000 n trailer < ] /DocChecksum /04909109131451864005A3F6F1FC3F6F >> startxref 427985 %%EOF