pax_global_header00006660000000000000000000000064145626152410014520gustar00rootroot0000000000000052 comment=c683d704e54870dfd593489b9b865a69a47e49a1 KuttyPy-GUI-2.3/000077500000000000000000000000001456261524100134375ustar00rootroot00000000000000KuttyPy-GUI-2.3/.gitignore000066400000000000000000000003421456261524100154260ustar00rootroot00000000000000# Ignore all in examples. not ASM directory examples/* !examples/ASM examples/ASM/* # Unignore all c extensions !examples/*.c !examples/*.C !examples/ASM/*.S pypi __pycache__ .cache .idea docs/workshopnano.md docs/boards.md KuttyPy-GUI-2.3/.readthedocs.yaml000066400000000000000000000010251456261524100166640ustar00rootroot00000000000000# .readthedocs.yaml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" # We recommend specifying your dependencies to enable reproducible builds: # https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - requirements: requirements.txt mkdocs: configuration: mkdocs.yml fail_on_warning: false KuttyPy-GUI-2.3/.travis.yml000066400000000000000000000004571456261524100155560ustar00rootroot00000000000000sudo: required dist: bionic language: python cache: bundler: true pip: true python: - "3.4" before_install: - sudo apt-get -qq update - sudo apt-get install -y python3-pyqtgraph python3-pyqt5 python3-serial pyqt5-dev-tools install: - make clean - make script: - nosetests KuttyPy-GUI-2.3/BMP180.py000066400000000000000000000063471456261524100146720ustar00rootroot00000000000000from __future__ import print_function from numpy import int16 import time def connect(route,**args): return BMP180(route,**args) class BMP180: ADDRESS = 0x77 REG_CONTROL = 0xF4 REG_RESULT = 0xF6 CMD_TEMP = 0x2E CMD_P0 = 0x34 CMD_P1 = 0x74 CMD_P2 = 0xB4 CMD_P3 = 0xF4 oversampling=0 NUMPLOTS=3 PLOTNAMES = ['Temperature','Pressure','Altitude'] name = 'Altimeter BMP180' def __init__(self,I2CRead, I2CWrite, **args): self.ADDRESS = args.get('address',self.ADDRESS) self.I2CReadBulk = I2CRead self.I2CWriteBulk = I2CWrite self.MB = self.__readInt__(0xBA) self.c3 = 160.0 * pow(2,-15) * self.__readInt__(0xAE) self.c4 = pow(10,-3) * pow(2,-15) * self.__readUInt__(0xB0) self.b1 = pow(160,2) * pow(2,-30) * self.__readInt__(0xB6) self.c5 = (pow(2,-15) / 160) * self.__readUInt__(0xB2) self.c6 = self.__readUInt__(0xB4) self.mc = (pow(2,11) / pow(160,2)) * self.__readInt__(0xBC) self.md = self.__readInt__(0xBE) / 160.0 self.x0 = self.__readInt__(0xAA) self.x1 = 160.0 * pow(2,-13) * self.__readInt__(0xAC) self.x2 = pow(160,2) * pow(2,-25) * self.__readInt__(0xB8) self.y0 = self.c4 * pow(2,15) self.y1 = self.c4 * self.c3 self.y2 = self.c4 * self.b1 self.p0 = (3791.0 - 8.0) / 1600.0 self.p1 = 1.0 - 7357.0 * pow(2,-20) self.p2 = 3038.0 * 100.0 * pow(2,-36) self.T=25 print ('calib:',self.c3,self.c4,self.b1,self.c5,self.c6,self.mc,self.md,self.x0,self.x1,self.x2,self.y0,self.y1,self.p0,self.p1,self.p2) self.params={'setOversampling':[0,1,2,3]} self.name='BMP180 Altimeter' self.initTemperature() self.readTemperature() self.initPressure() self.baseline=self.readPressure() def __readInt__(self,addr): return int16(self.__readUInt__(addr)) def __readUInt__(self,addr): vals = self.I2CReadBulk(self.ADDRESS,addr,2) v=1.*((vals[0]<<8)|vals[1]) return v def initTemperature(self): self.I2CWriteBulk(self.ADDRESS,[self.REG_CONTROL,self.CMD_TEMP]) time.sleep(0.005) def readTemperature(self): vals = self.I2CReadBulk(self.ADDRESS,self.REG_RESULT,2) if vals: if len(vals)==2: T = (vals[0] <<8 ) + vals[1] a = self.c5 * (T - self.c6) self.T = a + (self.mc / (a + self.md)) return self.T return False def setOversampling(self,num): self.oversampling=num def initPressure(self): os = [0x34,0x74,0xb4,0xf4] delays=[0.005,0.008,0.014,0.026] self.I2CWriteBulk(self.ADDRESS,[self.REG_CONTROL,os[self.oversampling] ]) time.sleep(delays[self.oversampling]) def readPressure(self): vals = self.I2CReadBulk(self.ADDRESS,self.REG_RESULT,3) if len(vals)==3: P = 1.*(vals[0] <<8) + vals[1] + (vals[2]/256.0) s = self.T - 25.0 x = (self.x2 * pow(s,2)) + (self.x1 * s) + self.x0 y = (self.y2 * pow(s,2)) + (self.y1 * s) + self.y0 z = (P - x) / y self.P = (self.p2 * pow(z,2)) + (self.p1 * z) + self.p0 return self.P else: return False def altitude(self): #baseline pressure needs to be provided return (44330.0*(1-pow(self.P/self.baseline,1/5.255))) def sealevel(self,P,A): ''' given a calculated pressure and altitude, return the sealevel ''' return(P/pow(1-(A/44330.0),5.255)) def getRaw(self): self.initTemperature() self.readTemperature() self.initPressure() self.readPressure() return [self.T,self.P,self.altitude()] KuttyPy-GUI-2.3/KuttyPyGUI.py000077500000000000000000000767471456261524100160370ustar00rootroot00000000000000''' ''' #!/usr/bin/python3 import os,sys,time,re,traceback,platform from PyQt5 import QtGui, QtCore, QtWidgets import KuttyPyLib from utilities.templates import ui_layout as layout from utilities import dio,REGISTERS,uploader,syntax import constants import inspect from functools import partial from collections import OrderedDict # translation stuff def translate(lang = None): global app,t,t1 if lang is None: lang=QtCore.QLocale.system().name() t=QtCore.QTranslator() t.load("lang/"+lang, os.path.dirname(__file__)) app.installTranslator(t) t1=QtCore.QTranslator() t1.load("qt_"+lang, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) app.installTranslator(t1) class myTimer(): def __init__(self,interval): self.interval = interval self.reset() def reset(self): self.timeout = time.time()+self.interval def ready(self): T = time.time() dt = T - self.timeout if dt>0: #timeout is ahead of current time #if self.interval>5:print('reset',self.timeout,dt) self.timeout = T - dt%self.interval + self.interval #if self.interval>5:print(self.timeout) return True return False def progress(self): return 100*(self.interval - self.timeout + time.time())/(self.interval) class AppWindow(QtWidgets.QMainWindow, layout.Ui_MainWindow): p=None ports = ['A','B','C','D'] logThis = QtCore.pyqtSignal(str) logThisPlain = QtCore.pyqtSignal(bytes) serialGaugeSignal = QtCore.pyqtSignal(bytes) serialGaugeConvert = 'bytes' serialStream = b'' def __init__(self, parent=None,**kwargs): super(AppWindow, self).__init__(parent) self.setupUi(self) self.VERSION = REGISTERS.VERSION_ATMEGA32 #This needs to be dynamically changed when hardware is connected self.SPECIALS = REGISTERS.VERSIONS[self.VERSION]['SPECIALS'] self.REGISTERS = REGISTERS.VERSIONS[self.VERSION]['REGISTERS'] self.EXAMPLES_DIR = REGISTERS.VERSIONS[self.VERSION]['examples directory'] self.docks = [self.padock,self.pbdock,self.pcdock,self.pddock] self.sensorList = [] self.controllerList = [] self.monitoring = True self.logRegisters = True self.userHexRunning = False self.uploadingHex = False self.autoUpdateUserRegisters = False self.CFile = None #'~/kuttyPy.c' self.ipy = None self.defaultDirectory = path["examples"] self.setTheme("material") examples = [a for a in os.listdir(os.path.join(path["examples"],self.EXAMPLES_DIR)) if ('.py' in a) and a is not 'kuttyPy.py'] #.py files except the library self.exampleList.addItems(examples) blinkindex = self.exampleList.findText('blink.py') if blinkindex!=-1: #default example. blink.py present in examples directory self.exampleList.setCurrentIndex(blinkindex) self.serialGuageButton.hide() #Hide the serial guage button #Define some keyboard shortcuts for ease of use self.shortcutActions={} self.shortcuts={"f":partial(self.setLanguage,'fr_FR'),"e":partial(self.setLanguage,'en_IN'),"m":partial(self.setLanguage,'ml_IN')} for a in self.shortcuts: shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(a), self) shortcut.activated.connect(self.shortcuts[a]) self.shortcutActions[a] = shortcut ######## PYTHON CODE self.codeThread = QtCore.QThread() self.codeEval = self.codeObject(self.REGISTERS) self.codeEval.moveToThread(self.codeThread) self.codeEval.finished.connect(self.codeThread.quit) self.codeEval.logThis.connect(self.appendLog) #Connect to the log window self.logThis.connect(self.appendLog) #Connect to the log window self.logThisPlain.connect(self.appendLogPlain) #Connect to the log window self.serialGaugeSignal.connect(self.setSerialgauge) self.codeThread.started.connect(self.codeEval.execute) self.codeThread.finished.connect(self.codeFinished) ######### C CODE UPLOADER self.uploadThread = QtCore.QThread() self.UploadObject = self.uploadObject() self.UploadObject.moveToThread(self.uploadThread) self.UploadObject.finished.connect(self.uploadThread.quit) self.UploadObject.logThis.connect(self.appendLog) #Connect to the log window self.UploadObject.logThisPlain.connect(self.appendLogPlain) #Connect to the log window. add plain text self.logThis.connect(self.appendLog) #Connect to the log window self.uploadThread.started.connect(self.UploadObject.execute) self.uploadThread.finished.connect(self.codeFinished) ########## C CODE EDITOR SYNTAX HIGHLIGHTER self.highlight = syntax.PythonHighlighter(self.editor.document()) self.commandQ = [] self.btns={} self.registers = [] self.addPins() self.statusBar = self.statusBar() self.makeBottomMenu() global app self.initializeCommunications() self.pending = { 'status':myTimer(constants.STATUS_UPDATE_INTERVAL), 'update':myTimer(constants.AUTOUPDATE_INTERVAL), } serialgaugeoptions = {'name':'Serial Monitor', 'init':print, 'read':None, 'fields':['Value'], 'min':[0], 'max':[1000], 'config':[{ 'name':'Data Type', 'options':['byte','ASCII'], 'function':self.configSerialGauge } ]} self.serialGauge = dio.DIOSENSOR(self,serialgaugeoptions) self.startTime = time.time() self.timer = QtCore.QTimer() self.timer.timeout.connect(self.updateEverything) self.timer.start(20) #Auto-Detector self.shortlist=KuttyPyLib.getFreePorts() def newRegister(self): reg = dio.REGEDIT(self.commandQ) #self.registerLayout.addWidget(reg) #self.registers.append(reg) #TODO: Convert layout to listwidget to enable re-ordering regItem = QtWidgets.QListWidgetItem() regItem.setSizeHint(QtCore.QSize(200,40)) self.registerList.addItem(regItem) self.registerList.setItemWidget(regItem,reg) self.registers.append(regItem) def addPins(self): for port,dock in zip(self.ports,[self.palayout,self.pblayout,self.pclayout,self.pdlayout]): checkbox = dio.REGVALS(port) dock.addWidget(checkbox) self.btns[port] = checkbox seq = range(7,-1,-1) if port == 'C':seq = reversed(seq) #PORTC pins are ordered top to bottom for a in seq: name = 'P'+port+str(a) checkbox = dio.widget(name,self.commandQ,extra = self.SPECIALS.get(name,'')) dock.addWidget(checkbox) self.btns[name] = checkbox def tabChanged(self,index): if self.userHexRunning: #Firmware was running. Stop it. self.launchFirmwareButton.setChecked(False) self.jumpToApplication(False) if index != 0 : #examples/editor tab. disable monitoring self.monitoring = False for a in self.docks: a.hide() else: #Playground . enable monitoring and control. self.monitoring = True self.autoRefreshUserRegisters.setChecked(False) self.userRegistersAutoRefresh(False) self.setLogType('playground') for a in self.docks: a.show() def setLogType(self,tp): self.log.clear() if tp == 'playground': self.logLabel.setText("Monitor registers being read and set during each operation") elif tp == 'avr': self.logLabel.setText("Avr-Gcc compile/upload messages") elif tp == 'monitor': self.logLabel.setText("Monitor data input from the serial port") elif tp == 'python': self.logLabel.setText("Python Code operations monitor") ################USER CODE SECTION#################### class codeObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) code = '' def __init__(self,REGISTERS): super(AppWindow.codeObject, self).__init__() self.PORTMAP = {v: k for k, v in REGISTERS.items()} #Lookup port name based on number self.compiled = '' self.SR = None self.GR = None self.evalGlobals = {} self.evalGlobals['getReg'] = self.getReg self.evalGlobals['setReg'] = self.setReg self.evalGlobals['print'] = self.printer def setCode(self,code,**kwargs): try: self.compiled = compile(code.encode(), '', mode='exec') except SyntaxError as err: error_class = err.__class__.__name__ detail = err.args[0] line_number = err.lineno return '''%s at line %d : %s''' % (error_class, line_number, detail) except Exception as err: error_class = err.__class__.__name__ detail = err.args[0] cl, exc, tb = sys.exc_info() line_number = traceback.extract_tb(tb)[-1][1] return '''%s at line %d: %s''' % (error_class, line_number, detail) self.SR = kwargs.get('setReg') self.GR = kwargs.get('getReg') self.evalGlobals = kwargs self.evalGlobals['getReg'] = self.getReg #Overwrite these three. They will be wrapped. self.evalGlobals['setReg'] = self.setReg self.evalGlobals['print'] = self.printer return '' def printer(self,*args): self.logThis.emit('''%s'''%(' '.join([str(a) for a in args]))) def setReg(self,reg,value): html=u'''
W\u2193{0:s}\t{1:d}\t0x{1:02x} / 0b{1:08b}
'''.format(self.PORTMAP.get(reg,''),value) self.logThis.emit(html) self.SR(reg,value) def getReg(self,reg): value = self.GR(reg) html=u'''
R\u2191{0:s}\t{1:d}\t0x{1:02x} / 0b{1:08b}
'''.format(self.PORTMAP.get(reg,''),value) self.logThis.emit(html) return value def execute(self): #old = sys.stdout #olde = sys.stderr #sys.stdout = self.toLog(self.logThis) #sys.stderr = self.toLog(self.logThis) try: exec(self.compiled,{},self.evalGlobals) except SyntaxError as err: error_class = err.__class__.__name__ detail = err.args[0] line_number = err.lineno self.logThis.emit('''%s at line %d : %s''' % (error_class, line_number, detail)) except Exception as err: error_class = err.__class__.__name__ detail = err.args[0] cl, exc, tb = sys.exc_info() line_number = traceback.extract_tb(tb)[-1][1] self.logThis.emit('''%s at line %d: %s''' % (error_class, line_number, detail)) #sys.stdout = old #sys.stderr = olde self.logThis.emit("Finished executing user code") self.finished.emit() def runCode(self): if self.codeThread.isRunning(): print('one code is already running') return self.setLogType('python') self.log.clear() #clear the log window self.log.setText('''----------User Code Started-----------''') kwargs = {} for a in dir(self.p): attr = getattr(self.p, a) if inspect.ismethod(attr) and a[:2]!='__': kwargs[a] = attr compilemsg = self.codeEval.setCode('{0:s}'.format(self.userCode.toPlainText()),**kwargs) if len(compilemsg): self.log.append(compilemsg) return self.codeThread.start() self.userCode.setStyleSheet("border: 3px dashed #53ffff;") self.tabs.setTabEnabled(0,False) def codeFinished(self): print('finished') self.tabs.setTabEnabled(0,True) self.userCode.setStyleSheet("") self.uploadingHex = False def abort(self): if self.codeThread.isRunning(): self.log.append('''----------Kill Signal(Doesn't work yet. Restart the application)-----------''') self.codeThread.quit() self.codeThread.terminate() del self.codeThread self.codeThread = QtCore.QThread() self.codeEval = self.codeObject(self.REGISTERS) self.codeEval.moveToThread(self.codeThread) self.codeEval.finished.connect(self.codeThread.quit) self.codeEval.logThis.connect(self.appendLog) #Connect to the log window self.codeThread.started.connect(self.codeEval.execute) self.codeThread.finished.connect(self.codeFinished) def getReg(self,reg,record = True): val = self.p.getReg(reg) if record: self.updatedRegs[reg] = [0,val] return val def setReg(self,reg,val,record = True): self.p.setReg(reg,val) if record: self.updatedRegs[reg] = [1,val] return val def appendLog(self,txt): self.log.append(txt) def appendLogPlain(self,txt): self.log.moveCursor(QtGui.QTextCursor.End) self.log.insertPlainText(txt.decode('ascii')) def configSerialGauge(self,val): if val == 0: #'byte' print('Byte Mode(0-255)') for a in self.serialGauge.gauges: a.set_MaxValue(255) self.serialGaugeConvert = 'bytes' if val == 1: #'ascii' print('ASCII(0-10000)') for a in self.serialGauge.gauges: a.set_MaxValue(10000) self.serialGaugeConvert = 'ascii' def setSerialgauge(self,vals): if self.serialGaugeConvert == 'bytes': self.serialGauge.setValue([vals[0]]) elif self.serialGaugeConvert == 'ascii': self.serialStream += vals while b'\n' in self.serialStream: val,_,self.serialStream = self.serialStream.partition(b'\n') self.serialGauge.setValue([float(val)]) def genLog(self): html=''''''%(time.ctime()) #html+=''' #''' for a in self.updatedRegs: row = self.updatedRegs[a] html+=u''' '''.format(u'W \u2193' if row[0] else u'R \u2191',a,row[1]) html+="
%s
R/WREGISTERValueHex/Binary
{0:s} {1:s} {2:d} 0b{2:08b} | 0x{2:02x}
" self.log.setHtml(html) def userRegistersAutoRefresh(self,state): self.autoUpdateUserRegisters = state def updateEverything(self): self.locateDevices() if not self.checkConnectionStatus():return #KuttyPy monitor has handed over control to native code. act as serial monitor/ debug window if self.uploadingHex: return if self.userHexRunning: t = self.p.fd.read(self.p.fd.in_waiting) if len(t): self.serialGaugeSignal.emit(t) self.logThisPlain.emit(t) return #self.setTheme('material') if self.codeThread.isRunning(): return if self.autoUpdateUserRegisters: for a in range(self.registerList.count()): self.registerList.itemWidget(self.registerList.item(a)).execute() while len(self.commandQ): if not self.centralWidget().isEnabled(): return a = self.commandQ.pop(0) if a[0] == 'DSTATE': #Digital Out ['DSTATE','Pxx',state] pname = 'PORT'+a[1][1].upper() bit = int(a[1][2]) reg = self.getReg(pname) reg &=~ (1<>a)&1) if portchar == 'A': #ADC if btn.currentPage == 2: #ADC Page displayed self.commandQ.append(['ADC',btn.ADMUX,btn,btn.logstate]) elif type(btn)==dio.DIOCNTR and btn.currentPage==2: # CNTR self.commandQ.append(['CNTR1',btn.slider]) def newStepperController(self): if self.p.connected: dialog = dio.DIOSTEPPER(self,total=200,device=self.p) dialog.launch() self.sensorList.append([dialog,None]) ############ I2C SENSORS ################# def I2CScan(self): if self.p.connected: x = self.p.I2CScan() print('Responses from: ',x) for a in self.sensorList: a[0].setParent(None) a[1].setParent(None) self.sensorList = [] for a in self.controllerList: a[0].setParent(None) a[1].setParent(None) self.controllerList = [] for a in x: s = self.p.sensors.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOSENSOR(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.sensorList.append([dialog,btn]) continue s = self.p.controllers.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOCONTROL(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.controllerList.append([dialog,btn]) continue s = self.p.special.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOROBOT(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.controllerList.append([dialog,btn]) continue def loadExample(self,filename): self.userCode.setPlainText(open(os.path.join(path["examples"],self.EXAMPLES_DIR,filename), "r").read()) ########################### UPLOAD HEX FILE ####################### class uploadObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) logThisPlain = QtCore.pyqtSignal(bytes) fname = '' p = None def __init__(self): super(AppWindow.uploadObject, self).__init__() def config(self,mode,p,fname): self.p = p self.fname = fname self.mode = mode def execute(self): if 'compile' in self.mode: try: import subprocess if self.fname[-2:] in ['.s','.S']: action = 'Assembl' else:#elif self.fname[-2:] in ['.c','.C']: action = 'Compil' fname = '.'.join(self.fname.split('.')[:-1]) if self.p.version == REGISTERS.VERSION_ATMEGA32 or self.p.connected==False: #by default, compile for ATMEGA32. cmd = 'avr-gcc -Wall -O2 -mmcu=%s -o "%s" "%s"' %('atmega32',fname,self.fname) self.logThis.emit('''%sing for Atmega32'''%(action)) elif self.p.version == REGISTERS.VERSION_ATMEGA328P: cmd = 'avr-gcc -Wall -O2 -mmcu=%s -o "%s" "%s"' %('atmega328p',fname,self.fname) self.logThis.emit('''%sing for Atmega328p (Nano)'''%(action)) else: self.logThis.emit('''%ser UNAVAILABLE'''%(action)) return print(cmd) res = subprocess.getstatusoutput(cmd) if res[0] != 0: self.logThis.emit('''%se Error: %s'''%(action,res[1].replace('\n','
')) ) self.finished.emit() return else: self.logThis.emit('''%s
'''%res[1]) cmd = 'avr-objcopy -j .text -j .data -O ihex "%s" "%s.hex"' %(fname,fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit(res[1])#'''%s
'''%res[1]) cmd = 'avr-objdump -S "%s" > "%s.lst"'%(fname,fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit(res[1])#'''%s
'''%res[1]) self.logThis.emit('Finished %sing: Generated Hex File'%action) #'''Finished %sing: Generated Hex File'''%(action)) except Exception as err: self.logThis.emit('''Failed to %se:%s'''%str(action,err)) if self.p.connected: if 'upload' in self.mode: try: if self.fname[-2:] in ['.c','.C','.s','.S']: self.fname = self.fname[:-2]+'.hex' #Replace .c with .hex self.logThis.emit('''Upload Code... Trigger Reset...''') self.p.fd.setRTS(0);time.sleep(0.01);self.p.fd.setRTS(1);time.sleep(0.1) self.p.get_version() dude = uploader.Uploader(self.p.fd, hexfile=self.fname,logger = self.logThis) dude.program() dude.verify() self.p.fd.setRTS(0);time.sleep(0.01);self.p.fd.setRTS(1);time.sleep(0.2) self.p.get_version() self.logThis.emit('''Finished upload''') except Exception as err: print('upload error',err) self.p.fd.setRTS(0);time.sleep(0.01);self.p.fd.setRTS(1);time.sleep(0.2) self.p.get_version() self.logThis.emit('''Failed to upload''') #self.jumpToApplication(False) #Force a reset self.finished.emit() def uploadHex(self): filename = QtWidgets.QFileDialog.getOpenFileName(self," Open a hex file to upload to your KuttyPy", "", "Hex Files (*.hex)") if len(filename[0]): #self.userCode.setStyleSheet("border: 3px dashed #53ffff;") #self.tabs.setTabEnabled(0,False) self.uploadingHex = True self.log.clear() self.log.setText('''-- Uploading Code --
''') self.UploadObject.config('upload',self.p,filename[0]) self.uploadThread.start() def openFile(self): filename = QtWidgets.QFileDialog.getOpenFileName(self," Open a C/Asm file to edit", self.defaultDirectory, "C/ASM Files (*.c *.C *.s *.S);; Asm Files (*.s *.S);; C Files (*.c *.C)") if len(filename[0]): self.defaultDirectory = '' self.filenameLabel.setText(filename[0]) self.CFile = filename[0] self.log.clear() infile = open(filename[0], 'r') self.editor.setPlainText(infile.read()) self.log.setText('''-- Opened File: %s --
'''%filename[0]) def compileAndUpload(self): self.setLogType('avr') self.saveFile() if self.CFile: self.uploadingHex = True self.log.setText('''-- Compiling and Uploading Code --
''') self.UploadObject.config('compileupload',self.p,self.CFile) self.uploadThread.start() def compile(self): self.setLogType('avr') self.saveFile() if self.CFile: self.log.setText('''-- Compiling Code --
''') self.UploadObject.config('compile',self.p,self.CFile) self.uploadThread.start() def upload(self): self.setLogType('avr') if self.CFile: self.uploadingHex = True self.log.setText('''-- Uploading Code --
''') self.UploadObject.config('upload',self.p,self.CFile) self.uploadThread.start() def saveFile(self): if not self.CFile: name = QtGui.QFileDialog.getSaveFileName(self, 'Save File') print('created new file:',name) self.CFile = name[0] self.log.setText('''-- Created new file: %s --
'''%self.CFile) fn = open(self.CFile,'w') fn.write(self.editor.toPlainText()) fn.close() self.log.setText('''-- Saved to: %s --
'''%self.CFile) ############################## def setTheme(self,theme): self.setStyleSheet("") self.setStyleSheet(open(os.path.join(path["themes"],theme+".qss"), "r").read()) def initializeCommunications(self,port=False): if self.p: try:self.p.fd.close() except:pass if port: self.p = KuttyPyLib.connect(port = port) else: self.p = KuttyPyLib.connect(autoscan=True) if self.p.connected: self.launchFirmwareButton.setChecked(False) self.setWindowTitle('KuttyPy Interactive Console [{0:s}]'.format(self.p.portname)) self.updatedRegs=OrderedDict() self.currentRegister = 0 self.VERSION = self.p.version self.SPECIALS = REGISTERS.VERSIONS[self.VERSION]['SPECIALS'] self.REGISTERS = REGISTERS.VERSIONS[self.VERSION]['REGISTERS'] self.EXAMPLES_DIR = REGISTERS.VERSIONS[self.VERSION]['examples directory'] if self.p.version == REGISTERS.VERSION_ATMEGA328P: self.getRegs=[ ('PINB',self.updateInputs), ('PINC',self.updateInputs), ('PIND',self.updateInputs), ] elif self.p.version == REGISTERS.VERSION_ATMEGA32: self.getRegs=[ ('PINA',self.updateInputs), ('PINB',self.updateInputs), ('PINC',self.updateInputs), ('PIND',self.updateInputs), ] else: self.setWindowTitle('KuttyPy Interactive Console [ Hardware not detected ]') def setLanguage(self,lang = 'fr_FR'): translate(lang) self.retranslateUi(self) def showSerialGauge(self): self.serialGauge.show() def jumpToApplication(self,state): if self.p: if state: self.serialGuageButton.show() self.userHexRunning=True self.p.fd.write(b'j') #Skip to application (Bootloader resets) for a in self.docks: a.setEnabled(False) #self.tabs.setEnabled(False) self.setLogType('monitor') self.log.setText('''-- Serial Port Monitor --
''') #self.serialGauge.show() else: self.serialGuageButton.hide() self.p.fd.setRTS(0) #Trigger a reset time.sleep(0.01) self.p.fd.setRTS(1) time.sleep(0.1) while self.p.fd.in_waiting: self.p.fd.read() self.p.get_version() for a in self.docks: a.setEnabled(True) self.userHexRunning=False #self.tabs.setEnabled(True) self.serialGauge.hide() else: if self.isChecked(): self.setChecked(False) def makeBottomMenu(self): try:self.pushbutton.setParent(None) except:pass self.pushbutton = QtWidgets.QPushButton('Menu') self.pushbutton.setStyleSheet("height: 13px;padding:3px;color: #7c7;") menu = QtWidgets.QMenu() menu.addAction('Save Window as Svg', self.exportSvg) menu.addAction('Open Stepper Controller', self.newStepperController) #Theme ''' self.themeAction = QtWidgets.QWidgetAction(menu) themes = [a.split('.qss')[0] for a in os.listdir(path["themes"]) if '.qss' in a] self.themeBox = QtWidgets.QComboBox(); self.themeBox.addItems(themes) self.themeBox.currentIndexChanged['QString'].connect(self.setTheme) self.themeAction.setDefaultWidget(self.themeBox) menu.addAction(self.themeAction) ''' themes = [a.split('.qss')[0] for a in os.listdir(path["themes"]) if '.qss' in a] self.themeBox = QtWidgets.QComboBox(); self.themeBox.addItems(themes) self.themeBox.currentIndexChanged['QString'].connect(self.setTheme) self.statusBar.addPermanentWidget(self.themeBox) self.pushbutton.setMenu(menu) #self.userApplication = QtWidgets.QCheckBox("User App"); #self.userApplication.toggled['bool'].connect(self.jumpToApplication) #self.statusBar.addPermanentWidget(self.userApplication) #self.hexUploadButton = QtWidgets.QPushButton("Upload Hex"); #self.hexUploadButton.clicked.connect(self.uploadHex) #self.statusBar.addPermanentWidget(self.hexUploadButton) self.speedbutton = QtWidgets.QComboBox(); self.speedbutton.addItems(['Slow','Fast','Ultra']); self.speedbutton.setCurrentIndex(1); self.speedbutton.currentIndexChanged['int'].connect(self.setSpeed) self.statusBar.addPermanentWidget(self.speedbutton) self.statusBar.addPermanentWidget(self.pushbutton) def setSpeed(self,index): self.timer.setInterval([100,20,5][index]) def locateDevices(self): try:L = KuttyPyLib.getFreePorts(self.p.portname) except Exception as e:print(e) total = len(L) menuChanged = False if L != self.shortlist: menuChanged = True if self.p.connected: if self.p.portname not in L: self.setWindowTitle('Error : Device Disconnected') QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device Disconnected. Please check the connections') try: self.p.close() except:pass self.p.connected = False self.setWindowTitle('KuttyPy Interactive Console [ Hardware not detected ]') elif True in L.values(): reply = QtWidgets.QMessageBox.question(self, 'Connection', 'Device Available. Connect?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: self.initializeCommunications() #update the shortlist self.shortlist=L def checkConnectionStatus(self,dialog=False): if self.p.connected:return True else: if dialog: QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device not connected. Please connect a KuttyPy to the USB port') return False def updateStatus(self): if not self.checkConnectionStatus(): self.countLabel.setText('Not Connected') return try: state,cnt = self.p.getStatus() self.currentState = state self.countLabel.setText('%s: %d'%("Running" if state else "Paused",cnt)) except: self.countLabel.setText('Disconnect!') self.p.fd.close() ######## WINDOW EXPORT SVG def exportSvg(self): from PyQt5 import QtSvg path, _filter = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File', '~/') if path: generator = QtSvg.QSvgGenerator() generator.setFileName(path) target_rect = QtCore.QRectF(0, 0, 800, 600) generator.setSize(target_rect.size().toSize())#self.size()) generator.setViewBox(self.rect()) generator.setTitle("Your title") generator.setDescription("some description") p = QtGui.QPainter() p.begin(generator) self.render(p) p.end() def ipython(self): #Experimental feature. Import ipython and launch console if not self.p.connected: return from utilities import ipy if not self.ipy: self.ipy = ipy.AppWindow(self,kp = self.p) self.ipy.show() self.ipy.updateDevice(self.p) def translators(langDir, lang=None): """ create a list of translators @param langDir a path containing .qm translation @param lang the preferred locale, like en_IN.UTF-8, fr_FR.UTF-8, etc. @result a list of QtCore.QTranslator instances """ if lang==None: lang=QtCore.QLocale.system().name() result=[] qtTranslator=QtCore.QTranslator() qtTranslator.load("qt_" + lang, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) result.append(qtTranslator) # path to the translation files (.qm files) sparkTranslator=QtCore.QTranslator() sparkTranslator.load(lang, langDir); result.append(sparkTranslator) return result def firstExistingPath(l): """ Returns the first existing path taken from a list of possible paths. @param l a list of paths @return the first path which exists in the filesystem, or None """ for p in l: if os.path.exists(p): return p return None def common_paths(): """ Finds common paths @result a dictionary of common paths """ path={} curPath = os.path.dirname(os.path.realpath(__file__)) path["current"] = curPath sharedPath = "/usr/share/kuttypy" path["translation"] = firstExistingPath( [os.path.join(p, "lang") for p in (curPath, sharedPath,)]) path["utilities"] = firstExistingPath( [os.path.join(p,'utilities') for p in (curPath, sharedPath,)]) path["templates"] = firstExistingPath( [os.path.join(p,'utilities','templates') for p in (curPath, sharedPath,)]) path["themes"] = firstExistingPath( [os.path.join(p,'utilities','themes') for p in (curPath, sharedPath,)]) path["examples"] = firstExistingPath( [os.path.join(p,'examples') for p in (curPath, sharedPath,)]) path["editor"] = firstExistingPath( [os.path.join(p,'editor') for p in (curPath, sharedPath,)]) lang=str(QtCore.QLocale.system().name()) shortLang=lang[:2] return path def run(): global path, app, myapp path = common_paths() print('QT Version',QtWidgets.__file__) app = QtWidgets.QApplication(sys.argv) myapp = AppWindow(app=app, path=path) myapp.show() r = app.exec_() ''' if myapp.p.connected: myapp.p.fd.write(b'j') #myapp.p.fd.setRTS(0) #time.sleep(0.01) #myapp.p.fd.setRTS(1) ''' app.deleteLater() sys.exit(r) if __name__ == "__main__": run() KuttyPy-GUI-2.3/KuttyPyIDE.py000066400000000000000000001167271456261524100160020ustar00rootroot00000000000000''' ''' # !/usr/bin/python3 import os, sys, time, re, traceback, platform from PyQt5 import QtGui, QtCore, QtWidgets import KuttyPyLib import socket from utilities.templates import ui_layout_ide as layout from utilities import uploader, syntax, REGISTERS, dio from utilities import texteditor import constants import inspect from functools import partial from collections import OrderedDict # translation stuff def translate(lang=None): global app, t, t1 if lang is None: lang = QtCore.QLocale.system().name() t = QtCore.QTranslator() t.load("lang/" + lang, os.path.dirname(__file__)) app.installTranslator(t) t1 = QtCore.QTranslator() t1.load("qt_" + lang, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) app.installTranslator(t1) class myTimer(): def __init__(self, interval): self.interval = interval self.reset() def reset(self): self.timeout = time.time() + self.interval def ready(self): T = time.time() dt = T - self.timeout if dt > 0: # timeout is ahead of current time # if self.interval>5:print('reset',self.timeout,dt) self.timeout = T - dt % self.interval + self.interval # if self.interval>5:print(self.timeout) return True return False def progress(self): return 100 * (self.interval - self.timeout + time.time()) / (self.interval) LKP = True class AppWindow(QtWidgets.QMainWindow, layout.Ui_MainWindow): p = None logThis = QtCore.pyqtSignal(str) showStatusSignal = QtCore.pyqtSignal(str, bool) serverSignal = QtCore.pyqtSignal(str) logThisPlain = QtCore.pyqtSignal(bytes) codeOutput = QtCore.pyqtSignal(str, str) serialGaugeSignal = QtCore.pyqtSignal(bytes) serialGaugeConvert = 'bytes' serialStream = b'' def __init__(self, parent=None, **kwargs): super(AppWindow, self).__init__(parent) self.local_ip = '' self.setupUi(self) self.fs_watcher = None self.reloadFrame.setVisible(False) self.compile_thread = None self.monitoring = True self.userHexRunning = False self.uploadingHex = False self.autoUpdateUserRegisters = False self.CFile = None # '~/kuttyPy.c' self.defaultDirectory = path["examples"] self.serverActive = False self.VERSION = REGISTERS.VERSION_ATMEGA32 # This needs to be dynamically changed when hardware is connected self.serialFrame.hide() # Hide the serial guage button # Define some keyboard shortcuts for ease of use self.shortcutActions = {} self.shortcuts = {"f": partial(self.setLanguage, 'fr_FR'), "e": partial(self.setLanguage, 'en_IN'), "m": partial(self.setLanguage, 'ml_IN')} for a in self.shortcuts: shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(a), self) shortcut.activated.connect(self.shortcuts[a]) self.shortcutActions[a] = shortcut ########## C CODE EDITOR SYNTAX HIGHLIGHTER self.code_highlighters = [] ####### C CODE EDITOR ######### self.codingTabs.tabCloseRequested.connect(self.closeCTab) self.codingTabs.tabBarClicked.connect(self.CTabChanged) self.listTab = None self.mapTab = None self.hexTab = None self.serialGaugeSignal.connect(self.setSerialgauge) self.logThisPlain.connect(self.appendLogPlain) # Connect to the log window self.activeEditor = None self.activeSourceTab = None self.sourceTabs = {} self.addSourceTab() ######### C CODE UPLOADER self.uploadThread = QtCore.QThread() self.UploadObject = self.uploadObject() self.UploadObject.moveToThread(self.uploadThread) self.UploadObject.finished.connect(self.uploadThread.quit) self.UploadObject.logThis.connect(self.appendLog) # Connect to the log window self.UploadObject.resultSignal.connect(self.codeOutput) # Load .lst, .hex , .map files self.UploadObject.logThisPlain.connect(self.appendLogPlain) # Connect to the log window. add plain text self.logThis.connect(self.appendLog) # Connect to the log window self.uploadThread.started.connect(self.UploadObject.execute) self.uploadThread.finished.connect(self.codeFinished) self.statusBar = self.statusBar() self.makeBottomMenu() self.addFileMenu() self.addEditMenu() self.addBuildOptionsMenu() self.editorFont = QtGui.QFont() self.editorFont.setPointSize(12) self.editorFont.setFamily('Ubuntu mono') global app self.initializeCommunications() self.pending = { 'status': myTimer(constants.STATUS_UPDATE_INTERVAL), 'update': myTimer(constants.AUTOUPDATE_INTERVAL), } serialgaugeoptions = {'name': 'Serial Monitor', 'init': print, 'read': None, 'fields': ['Value'], 'min': [0], 'max': [1000], 'config': [{ 'name': 'Data Type', 'options': ['byte', 'ASCII'], 'function': self.configSerialGauge } ]} self.serialGauge = dio.DIOSENSOR(self, serialgaugeoptions) self.startTime = time.time() self.timer = QtCore.QTimer() self.timer.timeout.connect(self.updateEverything) self.timer.start(20) # Auto-Detector self.shortlist = KuttyPyLib.getFreePorts() def closeEvent(self, event): self.external.terminate() self.external.waitForFinished(1000) def embedTerminal(self): import subprocess system = platform.system() self.external = QtCore.QProcess(self) if system == 'Linux': self.external.start('gnome-terminal', ["--working-directory", self.defaultDirectory]) if system == 'Windows': self.external.start('cmd') ''' time.sleep(1) self.external.write(b"hello") p = subprocess.run(['xprop', '-root'], stdout=subprocess.PIPE) for line in p.stdout.decode().splitlines(): m = re.fullmatch(r'^_NET_ACTIVE_WINDOW.*[)].*window id # (0x[0-9a-f]+)', line) if m: window = QtGui.QWindow.fromWinId(int(m.group(1), 16)) window.setFlag(QtCore.Qt.FramelessWindowHint, True) widget = QtWidgets.QWidget.createWindowContainer( window, self.termFrame, QtCore.Qt.FramelessWindowHint) widget.setFixedSize(600, 400) self.termLayout.addWidget(widget) # this is where the magic happens... self.external.finished.connect(self.close_maybe) break else: QtWidgets.QMessageBox.warning(self, 'Error', 'Could not find WID for curreent Window') ''' def close_maybe(self): print('terminal closed') pass def activateCompileServer(self): if self.serverActive: # Stop it ''' if self.compile_thread is not None: self.compile_thread.terminate() self.compile_thread.wait() print('quit compile_thread') self.compile_thread_button.setParent(None) self.showStatus("Compiler Stopped ", False) return self.serverActive = False self.compile_thread_button.setText("Online Compiler") ''' return else: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(0.1) # Set a timeout to avoid blocking indefinitely s.connect(("8.8.8.8", 80)) # Connect to a public IP address self.local_ip = s.getsockname()[0] from utilities.compile_server import create_server self.compile_thread = create_server(self.showStatusSignal, self.serverSignal, path["kpy"], self.local_ip) self.showStatusSignal.connect(self.showStatus) self.serverSignal.connect(self.showServerStatus) s.close() self.showStatus("Compiler Active at " + self.local_ip, False) self.compile_thread_button.setText(self.local_ip) self.serverActive = True def addFileMenu(self): codeMenu = QtWidgets.QMenu() newFileAction = QtWidgets.QAction('New File', self) newFileAction.setShortcut(QtGui.QKeySequence("Ctrl+N")) ico = QtGui.QIcon() ico.addPixmap(QtGui.QPixmap(":/control/plus.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) newFileAction.setIcon(ico) newFileAction.triggered.connect(self.addSourceTab) codeMenu.addAction(newFileAction) openFileAction = QtWidgets.QAction('Open File', self) openFileAction.setShortcut(QtGui.QKeySequence("Ctrl+O")) openFileAction.triggered.connect(self.openFile) openIcon = QtGui.QIcon() openIcon.addPixmap(QtGui.QPixmap(":/control/document-open.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) openFileAction.setIcon(openIcon) codeMenu.addAction(openFileAction) saveFileAction = QtWidgets.QAction('Save File', self) saveFileAction.setShortcut(QtGui.QKeySequence("Ctrl+S")) saveFileAction.triggered.connect(self.saveFile) saveIcon = QtGui.QIcon() saveIcon.addPixmap(QtGui.QPixmap(":/control/saveall.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) saveFileAction.setIcon(saveIcon) codeMenu.addAction(saveFileAction) saveAsFileAction = QtWidgets.QAction('Save As', self) saveAsFileAction.setShortcut(QtGui.QKeySequence("Ctrl+Shift+S")) saveAsFileAction.triggered.connect(self.saveAs) saveAsFileAction.setIcon(saveIcon) codeMenu.addAction(saveAsFileAction) a = QtWidgets.QAction('Terminal', self) a.setShortcut(QtGui.QKeySequence("Ctrl+Shift+T")) a.triggered.connect(self.embedTerminal) termIcon = QtGui.QIcon() termIcon.addPixmap(QtGui.QPixmap(":/control/utilities-terminal.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) a.setIcon(termIcon) codeMenu.addAction(a) exitAction = QtWidgets.QAction('Exit', self) exitAction.triggered.connect(QtWidgets.qApp.quit) codeMenu.addAction(exitAction) self.fileMenuButton.setMenu(codeMenu) def addBuildOptionsMenu(self): codeMenu = QtWidgets.QMenu() toggleLKPAction = QtWidgets.QAction('Include KP Library', self) toggleLKPAction.setCheckable(True) toggleLKPAction.setChecked(True) toggleLKPAction.triggered[bool].connect(self.setLKP) codeMenu.addAction(toggleLKPAction) self.buildOptionsButton.setMenu(codeMenu) def setLKP(self, state): global LKP print('LKP linking', state) LKP = state def closeEvent(self, evnt): evnt.ignore() self.askBeforeQuit() def askBeforeQuit(self): ask = False for editors in self.sourceTabs: if self.sourceTabs[editors][0].changed: ask = True if ask: reply = QtWidgets.QMessageBox.question(self, 'Warning', 'Files may have unsaved changes.\nReally quit?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.No: return self.userHexRunning = False global app app.quit() def addEditMenu(self): codeMenu = QtWidgets.QMenu() undoAction = QtWidgets.QAction('Undo', self) undoAction.setShortcut(QtGui.QKeySequence("Ctrl+Z")) undoAction.triggered.connect(self.activeEditor.undo) ico = QtGui.QIcon() ico.addPixmap(QtGui.QPixmap(":/control/reset.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) undoAction.setIcon(ico) codeMenu.addAction(undoAction) redoAction = QtWidgets.QAction('Redo', self) redoAction.setShortcut(QtGui.QKeySequence("Ctrl+Shift+Z")) redoAction.triggered.connect(self.activeEditor.redo) codeMenu.addAction(redoAction) a = QtWidgets.QAction('Cut', self) a.setShortcut(QtGui.QKeySequence("Ctrl+X")) a.triggered.connect(self.activeEditor.cut) codeMenu.addAction(a) a = QtWidgets.QAction('Copy', self) a.setShortcut(QtGui.QKeySequence("Ctrl+C")) a.triggered.connect(self.activeEditor.copy) codeMenu.addAction(a) a = QtWidgets.QAction('Paste', self) a.setShortcut(QtGui.QKeySequence("Ctrl+V")) a.triggered.connect(self.activeEditor.paste) codeMenu.addAction(a) a = QtWidgets.QAction('Select All', self) a.setShortcut(QtGui.QKeySequence("Ctrl+A")) a.triggered.connect(self.activeEditor.selectAll) codeMenu.addAction(a) self.editMenuButton.setMenu(codeMenu) def makeBottomMenu(self): try: self.pushbutton.setParent(None) except: pass self.pushbutton = QtWidgets.QPushButton('Menu') self.pushbutton.setStyleSheet("color: #262;") menu = QtWidgets.QMenu() menu.addAction('Save Window as Svg', self.exportSvg) menu.addAction('Upload Hex File', self.uploadHex) # Theme self.themeAction = QtWidgets.QWidgetAction(menu) themes = [a.split('.qss')[0] for a in os.listdir(path["themes"]) if '.qss' in a] self.themeBox = QtWidgets.QComboBox(); self.themeBox.addItems(themes) self.themeBox.currentIndexChanged['QString'].connect(self.setTheme) self.themeAction.setDefaultWidget(self.themeBox) menu.addAction(self.themeAction) defaultTheme = "newtheme" self.themeBox.setCurrentIndex(themes.index(defaultTheme)) self.setTheme(defaultTheme) self.pushbutton.setMenu(menu) # Compile thread self.compile_thread_button = QtWidgets.QPushButton('Online Compiler') self.compile_thread_button.setStyleSheet("color: #262;") self.compile_thread_button.clicked.connect(self.activateCompileServer) self.statusBar.addPermanentWidget(self.compile_thread_button) self.bottomLabel = QtWidgets.QLabel("Messages") # Menu button self.statusBar.addPermanentWidget(self.pushbutton) def closeCTab(self, index): print('Close Tab', index) widget = self.codingTabs.widget(index) sourceTabClosed = False if widget == self.mapTab: print('closing map tab') self.mapTab = None elif widget == self.hexTab: print('closing hex tab') self.hexTab = None elif widget == self.listTab: print('closing list tab') self.listTab = None elif widget in self.sourceTabs: if len(self.sourceTabs) == 1: print("last tab. won't close.") return else: print('closing source tab', widget.objectName()) self.closeCompileTabs(self.codingTabs.tabText(self.codingTabs.indexOf(widget))) self.sourceTabs.pop(widget) sourceTabClosed = True self.codingTabs.removeTab(index) if sourceTabClosed: # Source Tab closed. Re-assign active source tab self.activeSourceTab = list(self.sourceTabs.keys())[0] self.activeEditor = self.sourceTabs[self.activeSourceTab][0] self.CFile = self.sourceTabs[self.activeSourceTab][1] self.codingTabs.setCurrentIndex(self.codingTabs.indexOf(self.activeSourceTab)) print('New Source Tab:', self.getActiveFilename(), self.CFile) def closeCompileTabs(self, fullname): name = os.path.split(fullname)[1].split('.')[0] for tab, ext in zip([self.mapTab, self.hexTab, self.listTab], ['.map', '.hex', '.lst']): if tab is not None: print(self.codingTabs.tabText(self.codingTabs.indexOf(tab)), name + ext) if self.codingTabs.tabText(self.codingTabs.indexOf(tab)) == name + ext: self.codingTabs.removeTab(self.codingTabs.indexOf(tab)) # print(f"closing {ext} tab") pass def getActiveFilename(self): self.codingTabs.tabText(self.codingTabs.indexOf(self.activeSourceTab)) def addSourceTab(self): sourceTab = QtWidgets.QWidget() sourceTab.setObjectName("sourceTab") horizontalLayout_3 = QtWidgets.QHBoxLayout(sourceTab) horizontalLayout_3.setContentsMargins(0, 0, 0, 0) horizontalLayout_3.setSpacing(0) horizontalLayout_3.setObjectName("horizontalLayout_3") editor = texteditor.myTextEditor(sourceTab, self.codingTabs) font = QtGui.QFont() font.setFamily("Ubuntu Mono") font.setPointSize(12) editor.setFont(font) editor.setObjectName("editor") editor.setTabChangesFocus(False) horizontalLayout_3.addWidget(editor) self.codingTabs.addTab(sourceTab, "") self.sourceTabs[sourceTab] = [editor, None] self.codingTabs.setCurrentIndex(self.codingTabs.indexOf(sourceTab)) self.codingTabs.setTabText(self.codingTabs.indexOf(sourceTab), 'Untitled') self.CFile = None self.activeSourceTab = sourceTab self.activeEditor = editor self.code_highlighters.append(syntax.CHighlighter(editor.document())) def CTabChanged(self, index): widget = self.codingTabs.widget(index) if widget in self.sourceTabs: self.activeSourceTab = widget self.activeEditor = self.sourceTabs[widget][0] self.CFile = self.sourceTabs[widget][1] self.filenameLabel.setText(self.CFile) print('Change Tab', index, self.codingTabs.tabText(index), self.CFile) def newRegister(self): reg = dio.REGEDIT(self.commandQ) # self.registerLayout.addWidget(reg) # self.registers.append(reg) # TODO: Convert layout to listwidget to enable re-ordering regItem = QtWidgets.QListWidgetItem() regItem.setSizeHint(QtCore.QSize(200, 40)) self.registerList.addItem(regItem) self.registerList.setItemWidget(regItem, reg) self.registers.append(regItem) def addPins(self): for port, dock in zip(self.ports, [self.palayout, self.pblayout, self.pclayout, self.pdlayout]): checkbox = dio.REGVALS(port) dock.addWidget(checkbox) self.btns[port] = checkbox seq = range(7, -1, -1) if port == 'C': seq = reversed(seq) # PORTC pins are ordered top to bottom for a in seq: name = 'P' + port + str(a) checkbox = dio.widget(name, self.commandQ, extra=self.SPECIALS.get(name, '')) dock.addWidget(checkbox) self.btns[name] = checkbox def tabChanged(self, index): if self.userHexRunning: # Firmware was running. Stop it. self.launchFirmwareButton.setChecked(False) self.jumpToApplication(False) if index != 0: # examples/editor tab. disable monitoring self.monitoring = False else: # Playground . enable monitoring and control. self.monitoring = True self.autoRefreshUserRegisters.setChecked(False) self.userRegistersAutoRefresh(False) self.setLogType('playground') def setLogType(self, tp): self.log.clear() if tp == 'playground': self.logLabel.setText("Monitor registers being read and set during each operation") elif tp == 'avr': self.logLabel.setText("Avr-Gcc compile/upload messages") elif tp == 'monitor': self.logLabel.setText("Monitor data input from the serial port") elif tp == 'python': self.logLabel.setText("Python Code operations monitor") ################USER CODE SECTION#################### def codeOutput(self, filetype, filename): self.openCodeBreakupTab(filetype, filename) try: infile = open(filename, 'r') if filetype == 'list': self.listEditor.setPlainText(infile.read()) if filetype == 'map': self.mapEditor.setPlainText(infile.read()) if filetype == 'hex': self.hexEditor.setPlainText(infile.read()) infile.close() except Exception as e: print(e) def openCodeBreakupTab(self, filetype, filename): tab = None if filetype == 'list': if self.listTab is None: self.openListTab() elif self.listTab.isHidden(): self.codingTabs.addTab(self.listTab, "") tab = self.listTab elif filetype == 'map': if self.mapTab is None: self.openMapTab() elif self.mapTab.isHidden(): self.codingTabs.addTab(self.mapTab, "") tab = self.mapTab elif filetype == 'hex': if self.hexTab is None: self.openHexTab() elif self.hexTab.isHidden(): self.codingTabs.addTab(self.hexTab, "") tab = self.hexTab if tab != None: fname = filename.split self.codingTabs.setTabText(self.codingTabs.indexOf(tab), os.path.basename(filename)) # filetype + ":" + def openListTab(self): self.listTab = QtWidgets.QWidget() self.listTab.setObjectName("listTab") self.verticalLayout = QtWidgets.QVBoxLayout(self.listTab) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.listEditor = QtWidgets.QTextBrowser(self.listTab) self.listEditor.setObjectName("listEditor") self.verticalLayout.addWidget(self.listEditor) self.codingTabs.addTab(self.listTab, "") def openMapTab(self): self.mapTab = QtWidgets.QWidget() self.mapTab.setObjectName("mapTab") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.mapTab) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setObjectName("verticalLayout_3") self.mapEditor = QtWidgets.QTextBrowser(self.mapTab) self.mapEditor.setObjectName("mapEditor") self.verticalLayout_3.addWidget(self.mapEditor) self.codingTabs.addTab(self.mapTab, "") def openHexTab(self): self.hexTab = QtWidgets.QWidget() self.hexTab.setObjectName("hexTab") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.hexTab) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.hexEditor = QtWidgets.QTextBrowser(self.hexTab) self.hexEditor.setObjectName("hexEditor") self.verticalLayout_2.addWidget(self.hexEditor) self.codingTabs.addTab(self.hexTab, "") ico = QtGui.QIcon() ico.addPixmap(QtGui.QPixmap(":/control/hex.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.codingTabs.setTabIcon(self.codingTabs.indexOf(self.hexTab), ico) def appendLog(self, txt): self.log.append(txt) def appendLogPlain(self, txt): self.log.moveCursor(QtGui.QTextCursor.End) self.log.insertPlainText(txt.decode('ascii')) def configSerialGauge(self, val): if val == 0: # 'byte' print('Byte Mode(0-255)') for a in self.serialGauge.gauges: a.set_MaxValue(255) self.serialGaugeConvert = 'bytes' if val == 1: # 'ascii' print('ASCII(0-10000)') for a in self.serialGauge.gauges: a.set_MaxValue(10000) self.serialGaugeConvert = 'ascii' def setSerialgauge(self, vals): if self.serialGaugeConvert == 'bytes': self.serialGauge.setValue([vals[0]]) elif self.serialGaugeConvert == 'ascii': self.serialStream += vals while b'\n' in self.serialStream: val, _, self.serialStream = self.serialStream.partition(b'\n') self.serialGauge.setValue([float(val)]) def genLog(self): html = '''''' % (time.ctime()) # html+=''' # ''' for a in self.updatedRegs: row = self.updatedRegs[a] html += u''' '''.format(u'W \u2193' if row[0] else u'R \u2191', a, row[1]) html += "
%s
R/WREGISTERValueHex/Binary
{0:s} {1:s} {2:d} 0b{2:08b} | 0x{2:02x}
" self.log.setHtml(html) def updateEverything(self): self.locateDevices() if not self.checkConnectionStatus(): return # KuttyPy monitor has handed over control to native code. act as serial monitor/ debug window if self.uploadingHex: return if self.userHexRunning: t = self.p.fd.read(self.p.fd.in_waiting) if len(t): self.serialGaugeSignal.emit(t) self.logThisPlain.emit(t) return ########################### UPLOAD HEX FILE ####################### class uploadObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) resultSignal = QtCore.pyqtSignal(str, str) logThisPlain = QtCore.pyqtSignal(bytes) fname = '' p = None def __init__(self): super(AppWindow.uploadObject, self).__init__() def config(self, mode, p, fname): self.p = p self.fname = fname self.mode = mode def execute(self): global LKP if 'compile' in self.mode: try: import subprocess if self.fname[-2:] in ['.s', '.S']: action = 'Assembl' else: # elif self.fname[-2:] in ['.c','.C']: action = 'Compil' fname = '.'.join(self.fname.split('.')[:-1]) if self.p.version == REGISTERS.VERSION_ATMEGA32 or self.p.connected == False: # by default, compile for ATMEGA32. # cmd = 'avr-gcc -Wall -O2 -mmcu=%s -o "%s" -Map "%s" "%s"' %('atmega32',fname,fname+'.map',self.fname) cmd = 'avr-gcc -Wall -O2 -mmcu=%s -Wl,-Map="%s" -o "%s" "%s" %s' % ( 'atmega32', fname + '.map', fname, self.fname, "-lkp" if LKP else "") # includes MAP self.logThis.emit('''%sing for Atmega32''' % (action)) elif self.p.version == REGISTERS.VERSION_ATMEGA328P: cmd = 'avr-gcc -Wall -O2 -mmcu=%s -o "%s" "%s" %s' % ( 'atmega328p', fname, self.fname, "-lkp" if LKP else "") self.logThis.emit( '''%sing for Atmega328p (Nano)''' % (action)) else: self.logThis.emit('''%ser UNAVAILABLE''' % (action)) return print(cmd) res = subprocess.getstatusoutput(cmd) if res[0] != 0: self.logThis.emit('''%se Error: %s''' % ( action, res[1].replace('\n', '
'))) self.finished.emit() return else: self.logThis.emit('''%s
''' % res[1]) cmd = 'avr-objcopy -j .text -j .data -O ihex "%s" "%s.hex"' % (fname, fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit(res[1]) # '''%s
'''%res[1]) cmd = 'avr-objdump -S "%s" > "%s.lst"' % (fname, fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit(res[1]) # '''%s
'''%res[1]) self.logThis.emit( 'Finished %sing: Generated Hex File' % action) # '''Finished %sing: Generated Hex File'''%(action)) self.resultSignal.emit('list', fname + '.lst') self.resultSignal.emit('hex', fname + '.hex') self.resultSignal.emit('map', fname + '.map') except Exception as err: self.logThis.emit('''Failed to %se:%s''' % str(action, err)) if self.p.connected: if 'upload' in self.mode: try: if self.fname[-2:] in ['.c', '.C', '.s', '.S']: self.fname = self.fname[:-2] + '.hex' # Replace .c with .hex self.logThis.emit('''Upload Code... Trigger Reset...''') dude = uploader.Uploader(self.p.fd, hexfile=self.fname, logger=self.logThis) self.p.fd.setRTS(0); self.p.fd.setDTR(0); time.sleep(0.01); self.p.fd.setRTS(1); self.p.fd.setDTR(1); time.sleep(0.05) dude.program() dude.verify() self.p.fd.setRTS(0); self.p.fd.setDTR(0); time.sleep(0.01); self.p.fd.setRTS(1); self.p.fd.setDTR(1); time.sleep(0.25) self.p.get_version() self.logThis.emit('''Finished upload''') except Exception as err: print('upload error', err) self.p.fd.setRTS(0); self.p.fd.setDTR(0); time.sleep(0.01); self.p.fd.setRTS(1); self.p.fd.setDTR(1); time.sleep(0.25) self.p.get_version() self.logThis.emit('''Failed to upload''') # self.jumpToApplication(False) #Force a reset self.finished.emit() def uploadHex(self): filename = QtWidgets.QFileDialog.getOpenFileName(self, " Open a hex file to upload to your KuttyPy", "", "Hex Files (*.hex)") if len(filename[0]): # self.userCode.setStyleSheet("border: 3px dashed #53ffff;") # self.tabs.setTabEnabled(0,False) self.uploadingHex = True self.log.clear() self.log.setText('''-- Uploading Code --
''') self.UploadObject.config('upload', self.p, filename[0]) self.uploadThread.start() def openFile(self): filename = QtWidgets.QFileDialog.getOpenFileName(self, " Open a C/Asm file to edit", self.defaultDirectory, "C/ASM Files (*.c *.C *.s *.S);; Asm Files (*.s *.S);; C Files (*.c *.C)") if len(filename[0]): self.openFile_(filename[0]) def openFile_(self, fname): for sourceTab in self.sourceTabs: print(self.sourceTabs[sourceTab][1], fname) if fname == self.sourceTabs[sourceTab][1]: # File is already open self.activeSourceTab = sourceTab self.activeEditor = self.sourceTabs[sourceTab][0] self.CFile = self.sourceTabs[sourceTab][1] self.filenameLabel.setText(self.CFile) self.codingTabs.setCurrentIndex(self.codingTabs.indexOf(sourceTab)) return if self.CFile is not None: # A file is altready open self.addSourceTab() # self.defaultDirectory = '' self.filenameLabel.setText(fname) self.CFile = fname self.defaultDirectory = os.path.split(self.CFile)[0] self.sourceTabs[self.activeSourceTab][1] = self.CFile self.log.clear() infile = open(fname, 'r') self.activeEditor.setPlainText( infile.read()) # self.activeEditor = self.sourceTabs[self.activeSourceTab][0] infile.close() self.codingTabs.setTabText(self.codingTabs.indexOf(self.activeSourceTab), os.path.split(self.CFile)[1]) self.log.setText('''-- Opened File: %s --
''' % fname) filetype = 'c' if self.CFile.endswith('.S') or self.CFile.endswith('.s'): filetype = 'asm' ico = QtGui.QIcon() ico.addPixmap(QtGui.QPixmap(f":/control/{filetype}.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.codingTabs.setTabIcon(self.codingTabs.indexOf(self.activeSourceTab), ico) self.updateWatcher() def updateWatcher(self): paths = [] for sourceTab in self.sourceTabs: paths.append(self.sourceTabs[sourceTab][1]) self.fs_watcher = QtCore.QFileSystemWatcher(paths) self.fs_watcher.fileChanged.connect(self.file_changed) print('updated watcher', paths) def file_changed(self, path): print('File Changed: %s' % path) self.reloadLabel.setText(path) self.reloadFrame.setVisible(True) def reloadFile(self): self.reloadFrame.setVisible(False) fname = self.reloadLabel.text() for sourceTab in self.sourceTabs: print(self.sourceTabs[sourceTab][1], fname) if fname == self.sourceTabs[sourceTab][1]: # File is already open self.activeSourceTab = sourceTab self.activeEditor = self.sourceTabs[sourceTab][0] self.CFile = self.sourceTabs[sourceTab][1] self.filenameLabel.setText(self.CFile) self.codingTabs.setCurrentIndex(self.codingTabs.indexOf(sourceTab)) self.defaultDirectory = os.path.split(self.CFile)[0] self.log.clear() infile = open(fname, 'r') self.activeEditor.setPlainText( infile.read()) # self.activeEditor = self.sourceTabs[self.activeSourceTab][0] infile.close() self.log.setText('''-- Reloaded File: %s --
''' % fname) filetype = 'c' if self.CFile.endswith('.S') or self.CFile.endswith('.s'): filetype = 'asm' ico = QtGui.QIcon() ico.addPixmap(QtGui.QPixmap(f":/control/{filetype}.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.codingTabs.setTabIcon(self.codingTabs.indexOf(self.activeSourceTab), ico) self.updateWatcher() return print(' Modified file is not open anymore', fname) def cancelReload(self): self.reloadFrame.setVisible(False) self.updateWatcher() def fontPlus(self): size = self.editorFont.pointSize() if size > 40: return self.editorFont.setPointSize(size + 1) self.updateFont() def fontMinus(self): size = self.editorFont.pointSize() if size < 5: return self.editorFont.setPointSize(size - 1) self.updateFont() def setFont(self, font): self.editorFont.setFamily(font) self.updateFont() def updateFont(self): for editors in self.sourceTabs: self.sourceTabs[editors][0].setFont(self.editorFont) if hasattr(self, 'hexEditor') and self.hexEditor is not None: self.hexEditor.setFont(self.editorFont) if hasattr(self, 'listEditor') and self.listEditor is not None: self.listEditor.setFont(self.editorFont) if hasattr(self, 'mapEditor') and self.mapEditor is not None: self.mapEditor.setFont(self.editorFont) def compileAndUpload(self): self.setLogType('avr') self.saveFile() if self.CFile: if self.userHexRunning: self.launchFirmwareButton.setChecked(False) self.jumpToApplication(False) self.uploadingHex = True self.log.setText('''-- Compiling and Uploading Code --
''') self.UploadObject.config('compileupload', self.p, self.CFile) self.uploadThread.start() def compile(self): self.setLogType('avr') self.saveFile() if self.CFile: self.log.setText('''-- Compiling Code --
''') self.log.setText('''-- %s --
''' % self.CFile) self.UploadObject.config('compile', self.p, self.CFile) self.uploadThread.start() def upload(self): self.setLogType('avr') if self.CFile: if self.userHexRunning: self.launchFirmwareButton.setChecked(False) self.jumpToApplication(False) self.uploadingHex = True self.log.setText('''-- Uploading Code --
''') self.UploadObject.config('upload', self.p, self.CFile) self.uploadThread.start() def saveFile(self): if not self.CFile: self.CFile = self.saveAs() if self.CFile is not None and len(self.CFile) > 1: self.sourceTabs[self.activeSourceTab][1] = self.CFile self.activeEditor.markAsSaved(True) self.fs_watcher.removePath(self.CFile) fn = open(self.CFile, 'w') fn.write(self.activeEditor.toPlainText()) fn.close() self.fs_watcher.addPath(self.CFile) self.codingTabs.setTabText(self.codingTabs.indexOf(self.activeSourceTab), os.path.split(self.CFile)[1]) self.log.setText('''-- Saved to: %s --
''' % self.CFile) else: self.log.setText('''-- No File Selected --
''') def saveAs(self): name = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File') print('created new file:', name) if len(name) > 0 and len(name[0]) > 1: self.CFile = name[0] self.filenameLabel.setText(self.CFile) self.log.setText('''-- Created new file: %s --
''' % self.CFile) self.codingTabs.setTabText(self.codingTabs.indexOf(self.activeSourceTab), os.path.split(self.CFile)[1]) self.saveFile() return self.CFile ############################## def setTheme(self, theme): self.setStyleSheet("") self.setStyleSheet(open(os.path.join(path["themes"], theme + ".qss"), "r").read()) def initializeCommunications(self, port=False): if self.p: try: self.p.fd.close() except: pass if port: self.p = KuttyPyLib.connect(port=port) else: self.p = KuttyPyLib.connect(autoscan=True) if self.p.connected: self.VERSION = self.p.version self.launchFirmwareButton.setChecked(False) self.setWindowTitle('KuttyPy Integrated Development Environment [{0:s}]'.format(self.p.portname)) else: self.setWindowTitle('KuttyPy Integrated Development Environment [ Hardware not detected ]') def setLanguage(self, lang='fr_FR'): translate(lang) self.retranslateUi(self) def showSerialGauge(self): self.serialGauge.show() def codeFinished(self): print('finished') self.uploadingHex = False def jumpToApplication(self, state): print('run firmware', state) if self.p: if state: self.serialFrame.show() self.userHexRunning = True self.p.fd.write(b'j') # Skip to application (Bootloader resets) self.launchFirmwareButton.setText('Stop') self.setLogType('monitor') self.log.setText('''-- Serial Port Monitor --
''') # self.serialGauge.show() else: self.serialFrame.hide() self.p.fd.setRTS(0); self.p.fd.setDTR(0); time.sleep(0.01); self.p.fd.setRTS(1); self.p.fd.setDTR(1); time.sleep(0.2) while self.p.fd.in_waiting: self.p.fd.read() self.p.get_version() self.userHexRunning = False self.launchFirmwareButton.setText('Run') # self.tabs.setEnabled(True) self.serialGauge.hide() else: if self.isChecked(): self.setChecked(False) def sendASCII(self): s = self.serialData.text() self.p.fd.write(s.encode('utf-8')) def sendBinary(self): s = self.serialData.text() try: self.p.fd.write(chr(int(s) & 0xFF).encode('utf-8')) except Exception as e: print(e) def showServerStatus(self, msg): self.showStatus("Compiler: Error Launching Server (Restart app) ", True) QtWidgets.QMessageBox.warning(self, 'Server Error', msg) self.compile_thread_button.setText("Online Compiler") # self.statusBar.addPermanentWidget(self.compile_thread_button) def showStatus(self, msg, error=None): if error: self.statusBar.setStyleSheet("color:#633") else: self.statusBar.setStyleSheet("color:#333") self.statusBar.showMessage(msg) def locateDevices(self): try: L = KuttyPyLib.getFreePorts(self.p.portname) except Exception as e: print(e) total = len(L) menuChanged = False if L != self.shortlist: menuChanged = True if self.p.connected: if self.p.portname not in L: self.setWindowTitle('Error : Device Disconnected') QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device Disconnected. Please check the connections') try: self.p.close() except: pass self.p.connected = False self.setWindowTitle('KuttyPy Integrated Development Environment [ Hardware not detected ]') elif True in L.values(): reply = QtWidgets.QMessageBox.question(self, 'Connection', 'Device Available. Connect?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: self.initializeCommunications() # update the shortlist self.shortlist = L def checkConnectionStatus(self, dialog=False): if self.p.connected: return True else: if dialog: QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device not connected. Please connect a KuttyPy to the USB port') return False ######## WINDOW EXPORT SVG def exportSvg(self): from PyQt5 import QtSvg path, _filter = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File', '~/') if path: generator = QtSvg.QSvgGenerator() generator.setFileName(path) target_rect = QtCore.QRectF(0, 0, 800, 600) generator.setSize(target_rect.size().toSize()) # self.size()) generator.setViewBox(self.rect()) generator.setTitle("Your title") generator.setDescription("some description") p = QtGui.QPainter() p.begin(generator) self.render(p) p.end() def translators(langDir, lang=None): """ create a list of translators @param langDir a path containing .qm translation @param lang the preferred locale, like en_IN.UTF-8, fr_FR.UTF-8, etc. @result a list of QtCore.QTranslator instances """ if lang == None: lang = QtCore.QLocale.system().name() result = [] qtTranslator = QtCore.QTranslator() qtTranslator.load("qt_" + lang, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) result.append(qtTranslator) # path to the translation files (.qm files) sparkTranslator = QtCore.QTranslator() sparkTranslator.load(lang, langDir); result.append(sparkTranslator) return result def firstExistingPath(l): """ Returns the first existing path taken from a list of possible paths. @param l a list of paths @return the first path which exists in the filesystem, or None """ for p in l: if os.path.exists(p): return p return None def common_paths(): """ Finds common paths @result a dictionary of common paths """ path = {} curPath = os.path.dirname(os.path.realpath(__file__)) path["current"] = curPath sharedPath = "/usr/share/kuttypy" path["translation"] = firstExistingPath( [os.path.join(p, "lang") for p in (curPath, sharedPath,)]) path["utilities"] = firstExistingPath( [os.path.join(p, 'utilities') for p in (curPath, sharedPath,)]) path["templates"] = firstExistingPath( [os.path.join(p, 'utilities', 'templates') for p in (curPath, sharedPath,)]) path["themes"] = firstExistingPath( [os.path.join(p, 'utilities', 'themes') for p in (curPath, sharedPath,)]) path["examples"] = firstExistingPath( [os.path.join(p, 'examples') for p in (curPath, sharedPath,)]) path["kpy"] = firstExistingPath( [os.path.join(p, 'kpy') for p in (curPath, sharedPath,)]) path["editor"] = firstExistingPath( [os.path.join(p, 'editor') for p in (curPath, sharedPath,)]) lang = str(QtCore.QLocale.system().name()) shortLang = lang[:2] return path def run(): global path, app, myapp path = common_paths() print('QT Version', QtWidgets.__file__) app = QtWidgets.QApplication(sys.argv) myapp = AppWindow(app=app, path=path) myapp.show() r = app.exec_() if myapp.compile_thread is not None: myapp.compile_thread.terminate() print('waiting to quit compile_thread') myapp.compile_thread.wait() app.deleteLater() sys.exit(r) if __name__ == "__main__": run() KuttyPy-GUI-2.3/KuttyPyLib.py000066400000000000000000001276651456261524100161120ustar00rootroot00000000000000''' Code snippet for reading data from the kuttypy ''' import serial, struct, time, platform, os, sys, functools from utilities import REGISTERS from collections import OrderedDict import numpy as np if 'inux' in platform.system(): # Linux based system import fcntl Byte = struct.Struct("B") # size 1 ShortInt = struct.Struct("H") # size 2 Integer = struct.Struct("I") # size 4 def _bv(x): return 1 << x def connect(**kwargs): return KUTTYPY(**kwargs) def listPorts(): ''' Make a list of available serial ports. For auto scanning and connecting ''' import glob system_name = platform.system() if system_name == "Windows": # Scan for available ports. available = [] for i in range(256): try: s = serial.Serial('COM%d' % i) available.append('COM%d' % i) s.close() except serial.SerialException: pass return available elif system_name == "Darwin": # Mac return glob.glob('/dev/tty.usb*') + glob.glob('/dev/cu*') else: # Assume Linux or something else return glob.glob('/dev/ttyACM*') + glob.glob('/dev/ttyUSB*') def isPortFree(portname): try: fd = serial.Serial(portname, KUTTYPY.BAUD, stopbits=1, timeout=1.0) if fd.isOpen(): if 'inux' in platform.system(): # Linux based system try: fcntl.flock(fd.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) fd.close() return True # Port is available except IOError: fd.close() return False # Port is not available else: fd.close() return True # Port is available else: fd.close() return False # Port is not available except serial.SerialException as ex: return False # Port is not available def getFreePorts(openPort=None): ''' Find out which ports are currently free ''' portlist = {} for a in listPorts(): if a != openPort: portlist[a] = isPortFree(a) else: portlist[a] = False return portlist class KUTTYPY: VERSIONNUM_168P = Byte.pack(98) VERSIONNUM = Byte.pack(99) VERSIONNUM_328P = Byte.pack(100) VERSIONNUM_UNO = Byte.pack(101) GET_VERSION = Byte.pack(1) READB = Byte.pack(2) WRITEB = Byte.pack(3) I2C_READ = Byte.pack(4) I2C_WRITE = Byte.pack(5) I2C_SCAN = Byte.pack(6) BAUD = 38400 version = 0 portname = None REGS = REGISTERS.VERSIONS[99]['REGISTERS'] # A map of alphanumeric port names to the 8-bit register locations REGSTATES = {} # Store the last written state of the registers SPECIALS = REGISTERS.VERSIONS[99]['SPECIALS'] nano = False # check if atmega328p is found instead of 32 blockingSocket = None def __init__(self, **kwargs): self.sensors = { 0x39: { 'name': 'TSL2561', 'init': self.TSL2561_init, 'read': self.TSL2561_all, 'fields': ['total', 'IR'], 'min': [0, 0], 'max': [2 ** 15, 2 ** 15], 'config': [{ 'name': 'gain', 'options': ['1x', '16x'], 'function': self.TSL2561_gain }, { 'name': 'Integration Time', 'options': ['3 mS', '101 mS', '402 mS'], 'function': self.TSL2561_timing } ]}, 0x1E: { 'name': 'HMC5883L', 'init': self.HMC5883L_init, 'read': self.HMC5883L_all, 'fields': ['Mx', 'My', 'Mz'], 'min': [-5000, -5000, -5000], 'max': [5000, 5000, 5000], 'config': [{ 'name': 'gain', 'options': ['1x', '16x'], 'function': self.TSL2561_gain }, { 'name': 'Integration Time', 'options': ['3 mS', '101 mS', '402 mS'], 'function': self.TSL2561_timing } ]}, 0x48: { 'name': 'ADS1115', 'init': self.ADS1115_init, 'read': self.ADS1115_read, 'fields': ['Voltage'], 'min': [-5], 'max': [5], 'config': [{ 'name': 'channel', 'options': ['UNI_0', 'UNI_1', 'UNI_2', 'UNI_3', 'DIFF_01', 'DIFF_23'], 'function': self.ADS1115_channel }, { 'name': 'Data Rate', 'options': ['8', '16', '32', '64', '128', '250', '475', '860'], 'function': self.ADS1115_rate }, { 'name': 'Gain', 'options': ['GAIN_TWOTHIRDS', 'GAIN_ONE', 'GAIN_TWO', 'GAIN_FOUR', 'GAIN_EIGHT', 'GAIN_SIXTEEN'], 'function': self.ADS1115_gain } ]}, 0x68: { 'name': 'MPU6050', 'init': self.MPU6050_init, 'read': self.MPU6050_all, 'fields': ['Ax', 'Ay', 'Az', 'Temp', 'Gx', 'Gy', 'Gz'], 'min': [-1 * 2 ** 15, -1 * 2 ** 15, -1 * 2 ** 15, 0, -1 * 2 ** 15, -1 * 2 ** 15, -1 * 2 ** 15], 'max': [2 ** 15, 2 ** 15, 2 ** 15, 2 ** 16, 2 ** 15, 2 ** 15, 2 ** 15], 'config': [{ 'name': 'Gyroscope Range', 'options': ['250', '500', '1000', '2000'], 'function': self.MPU6050_gyro_range }, { 'name': 'Accelerometer Range', 'options': ['2x', '4x', '8x', '16x'], 'function': self.MPU6050_accel_range }, { 'name': 'Kalman', 'options': ['OFF', '0.001', '0.01', '0.1', '1', '10'], 'function': self.MPU6050_kalman_set } ]}, 41: { 'name': 'TCS34725: RGB Sensor', 'init': self.TCS34725_init, 'RGB': True, 'read': self.TCS34725_all, 'fields': ['RED', 'GREEN', 'BLUE'], 'min': [0, 0, 0, 0], 'max': [2 ** 16, 2 ** 16, 2 ** 16], 'config': [{ 'name': 'Gain', 'options': ['1', '4', '16', '60'], 'function': self.TCS34725_gain } ]}, 118: { 'name': 'BMP280', 'init': self.BMP280_init, 'read': self.BMP280_all, 'fields': ['Pressure', 'Temp', 'Alt'], 'min': [0, 0, 0], 'max': [1600, 100, 100], }, 12: { # 0xc 'name': 'AK8963 Mag', 'init': self.AK8963_init, 'read': self.AK8963_all, 'fields': ['X', 'Y', 'Z'], 'min': [-32767, -32767, -32767], 'max': [32767, 32767, 32767], }, 119: { 'name': 'MS5611', 'init': self.MS5611_init, 'read': self.MS5611_all, 'fields': ['Pressure', 'Temp', 'Alt'], 'min': [0, 0, 0], 'max': [1600, 100, 10], }, 119: { 'name': 'BMP180', 'init': self.BMP180_init, 'read': self.BMP180_all, 'fields': ['Pressure', 'Temp'], 'min': [0, 0], 'max': [1600, 100], }, 0x41: { # A0 pin connected to Vs . Otherwise address 0x40 conflicts with PCA board. 'name': 'INA3221', 'init': self.INA3221_init, 'read': self.INA3221_all, 'fields': ['CH1', 'CH2', 'CH3'], 'min': [0, 0, 0], 'max': [1000, 1000, 1000], }, 0x5A: { 'name': 'MLX90614', 'init': self.MLX90614_init, 'read': self.MLX90614_all, 'fields': ['TEMP'], 'min': [0], 'max': [350]} } self.controllers = { self.MCP5725_ADDRESS: { 'name': 'MCP4725', 'init': self.MCP4725_init, 'write': [['CH0', 0, 4095, 0, self.MCP4725_set]], }, } self.special = { 0x40: { 'name': 'PCA9685 PWM', 'init': self.PCA9685_init, 'write': [['Channel 1', 0, 180, 90, functools.partial(self.PCA9685_set, 1)], # name, start, stop, default, function ['Channel 2', 0, 180, 90, functools.partial(self.PCA9685_set, 2)], ['Channel 3', 0, 180, 90, functools.partial(self.PCA9685_set, 3)], ['Channel 4', 0, 180, 90, functools.partial(self.PCA9685_set, 4)], ], } } self.connected = False if 'port' in kwargs: self.portname = kwargs.get('port', None) try: self.fd, self.version, self.connected = self.connectToPort(self.portname) if self.connected: # self.fd.setRTS(0) if self.nano: self.REGS = REGISTERS.VERSIONS[self.version][ 'REGISTERS'] # A map of alphanumeric port names to the 8-bit register locations self.REGSTATES = {} # Store the last written state of the registers self.SPECIALS = REGISTERS.VERSIONS[self.version]['SPECIALS'] for a in ['B', 'C', 'D']: # Initialize all inputs self.setReg('DDR' + a, 0) # All inputs self.setReg('PORT' + a, 0) # No Pullup self.setReg('PORTC', (1 << 4) | (1 << 5)) # I2C Pull-Up else: for a in ['A', 'B', 'C', 'D']: # Initialize all inputs self.setReg('DDR' + a, 0) return except Exception as ex: print('Failed to connect to ', self.portname, ex.message) elif kwargs.get('autoscan', False): # Scan and pick a port portList = getFreePorts() for a in portList: if portList[a]: try: self.portname = a self.fd, self.version, self.connected = self.connectToPort(self.portname) if self.connected: # self.fd.setRTS(0) if self.nano: self.REGS = REGISTERS.VERSIONS[self.version][ 'REGISTERS'] # A map of alphanumeric port names to the 8-bit register locations self.REGSTATES = {} # Store the last written state of the registers self.SPECIALS = REGISTERS.VERSIONS[self.version]['SPECIALS'] for a in ['B', 'C', 'D']: # Initialize all inputs self.setReg('DDR' + a, 0) # All inputs self.setReg('PORT' + a, 0) # No Pullup self.setReg('PORTC', (1 << 4) | (1 << 5)) # I2C Pull-Up else: for a in ['A', 'B', 'C', 'D']: # Initialize all inputs self.setReg('DDR' + a, 0) # All inputs self.setReg('PORT' + a, 0) # No Pullup self.setReg('PORTC', 3) # I2C Pull-Up return except Exception as e: print(e) else: print(a, ' is busy') def __get_version__(self, fd): fd.flush() fd.setRTS(0) fd.setDTR(0) time.sleep(0.01) fd.setRTS(1) fd.setDTR(1) st = time.time() while fd.in_waiting: fd.read(fd.in_waiting) time.sleep(max(0, 0.25 - (time.time()-st))) fd.write(self.GET_VERSION) x= fd.read() return x def get_version(self): return self.__get_version__(self.fd) def connectToPort(self, portname): ''' connect to a port, and check for the right version ''' try: if 'inux' in platform.system(): # Linux based system try: # try to lock down the serial port import socket self.blockingSocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.blockingSocket.bind('\0eyesj2%s' % portname) self.blockingSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) fd = serial.Serial(portname, self.BAUD, timeout=0.2) if not fd.isOpen(): return None, '', False except socket.error as e: # print ('Port {0} is busy'.format(portname)) return None, '', False # raise RuntimeError("Another program is using %s (%d)" % (portname) ) ''' import fcntl try: fcntl.flock(fd.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) #print ('locked access to ',portname,fd.fileno()) except IOError: #print ('Port {0} is busy'.format(portname)) return None,'',False ''' else: fd = serial.Serial(portname, self.BAUD, timeout=0.5) # print ('not on linux',platform.system()) if (fd.in_waiting): fd.flush() fd.readall() except serial.SerialException as ex: print('Port {0} is unavailable: {1}'.format(portname, ex)) return None, '', False version = self.__get_version__(fd) self.nano = False if len(version) == 1: if ord(version) == ord(self.VERSIONNUM): return fd, ord(version), True elif ord(version) in [ord(self.VERSIONNUM_168P), ord(self.VERSIONNUM_328P), ord(self.VERSIONNUM_UNO)]: # assume it is mega32. will work with glitches self.nano = True return fd, ord(self.VERSIONNUM), True print('version check failed', len(version), ord(version)) return None, '', False def close(self): self.fd.close() self.portname = None self.connected = False if self.blockingSocket: self.blockingSocket.shutdown(1) self.blockingSocket.close() self.blockingSocket = None def __sendByte__(self, val): """ transmits a BYTE val - byte to send """ # print (val) try: if (type(val) == int): self.fd.write(Byte.pack(val)) else: self.fd.write(val) except: self.connected = False def __getByte__(self): """ reads a byte from the serial port and returns it """ try: ss = self.fd.read(1) except: self.connected = False print('No byte received. Disconnected?', time.ctime()) return 0 if len(ss): return Byte.unpack(ss)[0] else: print('byte communication error.', time.ctime()) return None def setReg(self, reg, data): # print(reg,data) if reg not in self.REGS and type(reg) == str: return False self.REGSTATES[reg] = data self.__sendByte__(self.WRITEB) if reg in self.REGS: self.__sendByte__(self.REGS[reg]) else: # print('missing register',reg) self.__sendByte__(reg) self.__sendByte__(data) def getReg(self, reg): if (reg not in self.REGS) and type(reg) == str: print('unknown register', reg) return 0 self.__sendByte__(self.READB) if reg in self.REGS: self.__sendByte__(self.REGS[reg]) else: # print('missing register',reg) self.__sendByte__(reg) val = self.__getByte__() self.REGSTATES[reg] = val return val def readADC(self, ch): # Read the ADC channel self.setReg(self.REGS['ADMUX'], 64 | ch) self.setReg(self.REGS['ADCSRA'], 197) # Enable the ADC low = self.getReg(self.REGS['ADCL']) hi = self.getReg(self.REGS['ADCH']) return (hi << 8) | low ''' def writeEEPROM(self,data): addr=0 for a in data: timeout=20 #20mS while ((self.getReg('EECR') & 2)): timeout-=1 if timeout==0: print ('wait timeout!') break time.sleep(0.001) self.setReg('EEARL',addr) self.setReg('EEARH',0) self.setReg('EEDR',a) self.setReg('EECR',4) ##EEMPE master write enable self.setReg('EECR',6) # EEPE write addr+=1 def readEEPROM(self,total): addr=0; b = [] for a in range(total): timeout=20 #20mS while ((self.getReg('EECR') & 2)): timeout-=1 if timeout==0: print ('wait timeout!') break time.sleep(0.001) self.setReg('EEARL',addr) self.setReg('EEARH',0) self.setReg('EECR',1) ##EERE. Read b.append(self.getReg('EEDR')) addr+=1 return b ''' # I2C Calls. Will be replaced with firmware level implementation ''' def initI2C(self): # Initialize I2C self.setReg('TWSR',0x00) self.setReg('TWBR',0x46) self.setReg('TWCR',0x04) def startI2C(self): self.setReg('TWCR',(1<<7)|(1<<5) | (1<<2)) timeout=10 #20mS time.sleep(0.001) while (not(self.getReg('TWCR') & (1<<7))): timeout-=1 print('waiy') if timeout==0: print('start timeout') break time.sleep(0.001) def stopI2C(self): self.setReg('TWCR',(1<<7) | (1<<4) | (1<<2)) timeout=10 #20mS time.sleep(0.001) def writeI2C(self,val): self.setReg('TWDR',val) self.setReg('TWCR',(1<<7) | (1<<2)) timeout=20 #20mS while (not(self.getReg('TWCR') & (1<<7))): timeout-=1 if timeout==0: print ('write timeout') break time.sleep(0.001) def readI2C(self,ack): self.setReg('TWCR',(1<<7) | (1<<2) | (ack<<6)) timeout=20 #20mS while (not(self.getReg('TWCR') & (1<<7))): timeout-=1 if timeout==0: print ('read timeout') break time.sleep(0.001) if timeout: return self.getReg('TWDR') else: return None def I2CWriteBulk(self,address,bytestream): # Individual register write based writing. takes a few hundred milliseconds self.startI2C() self.writeI2C(address<<1) for a in bytestream: self.writeI2C(a) self.stopI2C() def I2CReadBulk(self,address,register,total): # Individual register write based reading. takes a few hundred milliseconds self.startI2C() self.writeI2C(address<<1) self.writeI2C(register) self.startI2C() self.writeI2C((address<<1)|1) #Read b=[] for a in range(total-1): b.append(self.readI2C(1) ) b.append(self.readI2C(0)) self.stopI2C() return b # Individual register write based scan. takes a few seconds def I2CScan(self): found = [] for a in range(127): self.startI2C() time.sleep(0.005) self.writeI2C(a<<1) time.sleep(0.005) if self.getReg('TWSR') == 0x18: found.append(a) self.stopI2C() return found ''' def I2CScan(self): self.__sendByte__(self.I2C_SCAN) addrs = [] val = self.__getByte__() if val is None: return [] while val < 254: addrs.append(val) val = self.__getByte__() if (val == 254): print('timed out') # self.setReg('TWBR',0xFF) #I2C speed minimal. testing purposes return addrs def I2CWriteBulk(self, address, bytestream): self.__sendByte__(self.I2C_WRITE) self.__sendByte__(address) # address self.__sendByte__(len(bytestream)) # Total bytes to write. <=255 for a in bytestream: self.__sendByte__(Byte.pack(a)) tmt = self.__getByte__() if tmt: return True # Hasn't Timed out. else: return False # Timeout occured def I2CReadBulk(self, address, register, total): self.__sendByte__(self.I2C_READ) self.__sendByte__(address) # address self.__sendByte__(register) # device register address self.__sendByte__(total) # Total bytes to read. <=255 data = [] for a in range(total): val = self.__getByte__() data.append(val) tmt = self.__getByte__() return data, True if not tmt else False class KalmanFilter(object): ''' Credits:http://scottlobdell.me/2014/08/kalman-filtering-python-reading-sensor-input/ ''' def __init__(self, var, est, initial_values): # var = process variance. est = estimated measurement var self.var = np.array(var) self.est = np.array(est) self.posteri_estimate = np.array(initial_values) self.posteri_error_estimate = np.ones(len(var), dtype=np.float16) def input(self, vals): vals = np.array(vals) priori_estimate = self.posteri_estimate priori_error_estimate = self.posteri_error_estimate + self.var blending_factor = priori_error_estimate / (priori_error_estimate + self.est) self.posteri_estimate = priori_estimate + blending_factor * (vals - priori_estimate) self.posteri_error_estimate = (1 - blending_factor) * priori_error_estimate def output(self): return self.posteri_estimate MPU6050_kalman = 0 def MPU6050_init(self): self.I2CWriteBulk(0x68, [0x1B, 0 << 3]) # Gyro Range . 250 self.I2CWriteBulk(0x68, [0x1C, 0 << 3]) # Accelerometer Range. 2 self.I2CWriteBulk(0x68, [0x6B, 0x00]) # poweron v, tmt = self.I2CReadBulk(0x68, 0x75, 1) self.mag = False if v[0] in [0x71, 0x73]: # MPU9255, MPU9250. Has magnetometer. Enable it. self.mag = True self.I2CWriteBulk(0x68, [0x37, 0x22]) # INT_PIN_CFG . I2C passthrough enabled. Rescan to detect magnetometer. def MPU6050_gyro_range(self, val): self.I2CWriteBulk(0x68, [0x1B, val << 3]) # Gyro Range . 250,500,1000,2000 -> 0,1,2,3 -> shift left by 3 positions def MPU6050_accel_range(self, val): print(val) self.I2CWriteBulk(0x68, [0x1C, val << 3]) # Accelerometer Range. 2,4,8,16 -> 0,1,2,3 -> shift left by 3 positions def MPU6050_kalman_set(self, val): if not val: self.MPU6050_kalman = 0 return noise = [] for a in range(50): noise.append(np.array(self.MPU6050_all(disableKalman=True))) noise = np.array(noise) self.MPU6050_kalman = self.KalmanFilter(1e6 * np.ones(noise.shape[1]) / (10 ** val), np.std(noise, 0) ** 2, noise[-1]) def MPU6050_accel(self): b, tmt = self.I2CReadBulk(0x68, 0x3B, 6) if tmt: return None if None not in b: return [(b[x * 2 + 1] << 8) | b[x * 2] for x in range(3)] # X,Y,Z def MPU6050_gyro(self): b, tmt = self.I2CReadBulk(0x68, 0x3B + 6, 6) if tmt: return None if None not in b: return [(b[x * 2 + 1] << 8) | b[x * 2] for x in range(3)] # X,Y,Z def MPU6050_all(self, disableKalman=False): ''' returns a 7 element list. Ax,Ay,Az,T,Gx,Gy,Gz returns None if communication timed out with I2C sensor disableKalman can be set to True if Kalman was previously enabled. ''' b, tmt = self.I2CReadBulk(0x68, 0x3B, 14) if tmt: return None if None not in b: if (not self.MPU6050_kalman) or disableKalman: return [np.int16((b[x * 2] << 8) | b[x * 2 + 1]) for x in range(7)] # Ax,Ay,Az, Temp, Gx, Gy,Gz else: self.MPU6050_kalman.input([np.int16((b[x * 2] << 8) | b[x * 2 + 1]) for x in range(7)]) return self.MPU6050_kalman.output() ######## AK8963 magnetometer attacched to MPU925x ####### AK8963_ADDRESS = 0x0C _AK8963_CNTL = 0x0A def AK8963_init(self): self.I2CWriteBulk(self.AK8963_ADDRESS, [self._AK8963_CNTL, 0]) # power down mag self.I2CWriteBulk(self.AK8963_ADDRESS, [self._AK8963_CNTL, (1 << 4) | 6]) # mode (0=14bits,1=16bits) <<4 | (2=8Hz , 6=100Hz) def AK8963_all(self, disableKalman=False): vals, tmt = self.I2CReadBulk(self.AK8963_ADDRESS, 0x03, 7) # 6+1 . 1(ST2) should not have bit 4 (0x8) true. It's ideally 16 . overflow bit if tmt: return None ax, ay, az = struct.unpack('hhh', bytes(vals[:6])) if not vals[6] & 0x08: return [ax, ay, az] else: return None ####### BMP280 ################### # https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme280-ds002.pdf ## Partly from https://github.com/farmerkeith/BMP280-library/blob/master/farmerkeith_BMP280.cpp BMP280_ADDRESS = 118 BMP280_REG_CONTROL = 0xF4 BMP280_REG_RESULT = 0xF6 BMP280_HUMIDITY_ENABLED = False _BMP280_humidity_calib = [0] * 6 BMP280_oversampling = 0 _BMP280_PRESSURE_MIN_HPA = 0 _BMP280_PRESSURE_MAX_HPA = 1600 _BMP280_sea_level_pressure = 1013.25 # for calibration.. from circuitpython library def BMP280_init(self): b = self.I2CWriteBulk(self.BMP280_ADDRESS, [0xE0, 0xB6]) # reset time.sleep(0.1) self.BMP280_HUMIDITY_ENABLED = False b, tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0xD0, 1) print(b) if b is None: return None b = b[0] if b in [0x58, 0x56, 0x57]: print('BMP280. ID:', b) elif b == 0x60: self.BMP280_HUMIDITY_ENABLED = True print('BME280 . includes humidity') else: print('ID unknown', b) # get calibration data b, tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0x88, 24) # 24 bytes containing calibration data coeff = list(struct.unpack('> 4)) self._BMP280_humidity_calib[5] = float(coeff[5]) print('calibration data: ', self._BMP280_temp_calib, self._BMP280_humidity_calib) self.I2CWriteBulk(self.BMP280_ADDRESS, [0xF4, 0xFF]) # ctrl_meas (oversampling of pressure, temperature) def _BMP280_calcTemperature(self, adc_t): v1 = (adc_t / 16384.0 - self._BMP280_temp_calib[0] / 1024.0) * self._BMP280_temp_calib[1] v2 = ((adc_t / 131072.0 - self._BMP280_temp_calib[0] / 8192.0) * ( adc_t / 131072.0 - self._BMP280_temp_calib[0] / 8192.0)) * self._BMP280_temp_calib[2] self._BMP280_t_fine = int(v1 + v2) return (v1 + v2) / 5120.0 # actual temperature. def _BMP280_calcPressure(self, adc_p, adc_t): self._BMP280_calcTemperature(adc_t) # t_fine has been set now. # Algorithm from the BMP280 driver. adapted from adafruit adaptation # https://github.com/BoschSensortec/BMP280_driver/blob/master/bmp280.c var1 = self._BMP280_t_fine / 2.0 - 64000.0 var2 = var1 * var1 * self._BMP280_pressure_calib[5] / 32768.0 var2 = var2 + var1 * self._BMP280_pressure_calib[4] * 2.0 var2 = var2 / 4.0 + self._BMP280_pressure_calib[3] * 65536.0 var3 = self._BMP280_pressure_calib[2] * var1 * var1 / 524288.0 var1 = (var3 + self._BMP280_pressure_calib[1] * var1) / 524288.0 var1 = (1.0 + var1 / 32768.0) * self._BMP280_pressure_calib[0] if not var1: return _BMP280_PRESSURE_MIN_HPA pressure = 1048576.0 - adc_p pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1 var1 = self._BMP280_pressure_calib[8] * pressure * pressure / 2147483648.0 var2 = pressure * self._BMP280_pressure_calib[7] / 32768.0 pressure = pressure + (var1 + var2 + self._BMP280_pressure_calib[6]) / 16.0 pressure /= 100 if pressure < self._BMP280_PRESSURE_MIN_HPA: return self._BMP280_PRESSURE_MIN_HPA if pressure > self._BMP280_PRESSURE_MAX_HPA: return self._BMP280_PRESSURE_MAX_HPA return pressure def _BMP280_calcHumidity(self, adc_h, adc_t): self._BMP280_calcTemperature(adc_t) # t fine set. var1 = float(self._BMP280_t_fine) - 76800.0 var2 = (self._BMP280_humidity_calib[3] * 64.0 + (self._BMP280_humidity_calib[4] / 16384.0) * var1) var3 = adc_h - var2 var4 = self._BMP280_humidity_calib[1] / 65536.0 var5 = (1.0 + (self._BMP280_humidity_calib[2] / 67108864.0) * var1) var6 = 1.0 + (self._BMP280_humidity_calib[5] / 67108864.0) * var1 * var5 var6 = var3 * var4 * (var5 * var6) humidity = var6 * (1.0 - self._BMP280_humidity_calib[0] * var6 / 524288.0) if humidity > 100: return 100 if humidity < 0: return 0 return humidity def BMP280_all(self): if self.BMP280_HUMIDITY_ENABLED: data, tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0xF7, 8) else: data, tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0xF7, 6) # os = [0x34,0x74,0xb4,0xf4] # delays=[0.005,0.008,0.014,0.026] # self.I2CWriteBulk(self.BMP280_ADDRESS,[self.BMP280_REG_CONTROL,os[self.BMP280_oversampling] ]) # time.sleep(delays[self.BMP280_oversampling]) if tmt: return None if data is None: return None if None not in data: # Convert pressure and temperature data to 19-bits adc_p = (((data[0] & 0xFF) * 65536.) + ((data[1] & 0xFF) * 256.) + (data[2] & 0xF0)) / 16. adc_t = (((data[3] & 0xFF) * 65536.) + ((data[4] & 0xFF) * 256.) + (data[5] & 0xF0)) / 16. if self.BMP280_HUMIDITY_ENABLED: adc_h = (data[6] * 256.) + data[7] return [self._BMP280_calcPressure(adc_p, adc_t), self._BMP280_calcTemperature(adc_t), self._BMP280_calcHumidity(adc_h, adc_t)] else: return [self._BMP280_calcPressure(adc_p, adc_t), self._BMP280_calcTemperature(adc_t), 0] return None ########## TCS34725 RGB sensor ########### _TCS34725_COMMAND_BIT = 0x80 _TCS34725_REGISTER_STATUS = 0x13 _TCS34725_REGISTER_CDATA = 0x14 _TCS34725_REGISTER_RDATA = 0x16 _TCS34725_REGISTER_GDATA = 0x18 _TCS34725_REGISTER_BDATA = 0x1a _TCS34725_REGISTER_ENABLE = 0x00 _TCS34725_REGISTER_ATIME = 0x01 _TCS34725_REGISTER_AILT = 0x04 _TCS34725_REGISTER_AIHT = 0x06 _TCS34725_REGISTER_ID = 0x12 _TCS34725_REGISTER_APERS = 0x0c _TCS34725_REGISTER_CONTROL = 0x0f _TCS34725_REGISTER_SENSORID = 0x12 _TCS34725_REGISTER_STATUS = 0x13 _TCS34725_ENABLE_AIEN = 0x10 _TCS34725_ENABLE_WEN = 0x08 _TCS34725_ENABLE_AEN = 0x02 _TCS34725_ENABLE_PON = 0x01 _GAINS = (1, 4, 16, 60) _CYCLES = (0, 1, 2, 3, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60) _INTEGRATION_TIME_THRESHOLD_LOW = 2.4 _INTEGRATION_TIME_THRESHOLD_HIGH = 614.4 TCS34725_ADDRESS = 41 def TCS34725_init(self): enable, tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT | self._TCS34725_REGISTER_ENABLE, 1) enable = enable[0] self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_REGISTER_ENABLE, enable | self._TCS34725_ENABLE_PON]) # time.sleep(0.003) self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT | self._TCS34725_REGISTER_ENABLE, enable | self._TCS34725_ENABLE_PON | self._TCS34725_ENABLE_AEN | self._TCS34725_ENABLE_AIEN]) # self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT | self._TCS34725_REGISTER_APERS, 10]) self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT | self._TCS34725_REGISTER_ATIME, 256 - 40]) def TCS34725_gain(self, g): self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT | self._TCS34725_REGISTER_CONTROL, g]) # Gain def TCS34725_all(self): R, tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT | self._TCS34725_REGISTER_RDATA, 2) G, tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT | self._TCS34725_REGISTER_GDATA, 2) B, tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT | self._TCS34725_REGISTER_BDATA, 2) if tmt: return None return [R[0] | (R[1] << 8), G[0] | (G[1] << 8), B[0] | (B[1] << 8)] def TCS34725_range(self): pass ####### MS5611 Altimeter ################### MS5611_ADDRESS = 119 def MS5611_init(self): self.I2CWriteBulk(self.MS5611_ADDRESS, [0x1E]) # reset time.sleep(0.5) self._MS5611_calib = np.zeros(6) # calibration data. # pressure gain, offset . T coeff of P gain, offset. Ref temp. T coeff of T. all unsigned shorts. b, tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA2, 2) if tmt: return self._MS5611_calib[0] = struct.unpack('!H', bytes(b))[0] b, tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA4, 2) self._MS5611_calib[1] = struct.unpack('!H', bytes(b))[0] b, tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA6, 2) self._MS5611_calib[2] = struct.unpack('!H', bytes(b))[0] b, tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA8, 2) self._MS5611_calib[3] = struct.unpack('!H', bytes(b))[0] b, tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xAA, 2) self._MS5611_calib[4] = struct.unpack('!H', bytes(b))[0] b, tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xAC, 2) self._MS5611_calib[5] = struct.unpack('!H', bytes(b))[0] print('Calibration for MS5611:', self._MS5611_calib) #BMP180 pressure sensor BMP180 = None def BMP180_init(self): import BMP180 self.BMP180 = BMP180(self.I2CReadBulk, self.I2CWriteBulk) def BMP180_all(self): if self.BMP180 is not None: return self.BMP180.getRaw() def MS5611_all(self): self.I2CWriteBulk(self.MS5611_ADDRESS, [0x48]) # 0x48 Pressure conversion(OSR = 4096) command time.sleep(0.01) # 10mS b, tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0x00, 3) # data. D1 = b[0] * 65536 + b[1] * 256 + b[2] # msb2, msb1, lsb self.I2CWriteBulk(self.MS5611_ADDRESS, [0x58]) # 0x58 Temperature conversion(OSR = 4096) command time.sleep(0.01) b, tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0x00, 3) # data. D2 = b[0] * 65536 + b[1] * 256 + b[2] # msb2, msb1, lsb dT = D2 - self._MS5611_calib[4] * 256 TEMP = 2000 + dT * self._MS5611_calib[5] / 8388608 OFF = self._MS5611_calib[1] * 65536 + (self._MS5611_calib[3] * dT) / 128 SENS = self._MS5611_calib[0] * 32768 + (self._MS5611_calib[2] * dT) / 256 T2 = 0; OFF2 = 0; SENS2 = 0 if TEMP >= 2000: T2 = 0 OFF2 = 0 SENS2 = 0 elif TEMP < 2000: T2 = (dT * dT) / 2147483648 OFF2 = 5 * ((TEMP - 2000) * (TEMP - 2000)) / 2 SENS2 = 5 * ((TEMP - 2000) * (TEMP - 2000)) / 4 if TEMP < -1500: OFF2 = OFF2 + 7 * ((TEMP + 1500) * (TEMP + 1500)) SENS2 = SENS2 + 11 * ((TEMP + 1500) * (TEMP + 1500)) / 2 TEMP = TEMP - T2 OFF = OFF - OFF2 SENS = SENS - SENS2 pressure = ((((D1 * SENS) / 2097152) - OFF) / 32768.0) / 100.0 cTemp = TEMP / 100.0 return [pressure, cTemp, 0] ### INA3221 3 channel , high side current sensor ############# INA3221_ADDRESS = 0x41 _INA3221_REG_CONFIG = 0x0 _INA3221_SHUNT_RESISTOR_VALUE = 0.1 _INA3221_REG_SHUNTVOLTAGE = 0x01 _INA3221_REG_BUSVOLTAGE = 0x02 def INA3221_init(self): self.I2CWriteBulk(self.INA3221_ADDRESS, [self._INA3221_REG_CONFIG, 0b01110101, 0b00100111]) # cont shunt. def INA3221_all(self): I = [0., 0., 0.] b, tmt = self.I2CReadBulk(self.INA3221_ADDRESS, self._INA3221_REG_SHUNTVOLTAGE, 2) if tmt: return None b[1] &= 0xF8; I[0] = struct.unpack('!h', bytes(b))[0] b, tmt = self.I2CReadBulk(self.INA3221_ADDRESS, self._INA3221_REG_SHUNTVOLTAGE + 2, 2) if tmt: return None b[1] &= 0xF8; I[1] = struct.unpack('!h', bytes(b))[0] b, tmt = self.I2CReadBulk(self.INA3221_ADDRESS, self._INA3221_REG_SHUNTVOLTAGE + 4, 2) if tmt: return None b[1] &= 0xF8; I[2] = struct.unpack('!h', bytes(b))[0] return [0.005 * I[0] / self._INA3221_SHUNT_RESISTOR_VALUE, 0.005 * I[1] / self._INA3221_SHUNT_RESISTOR_VALUE, 0.005 * I[2] / self._INA3221_SHUNT_RESISTOR_VALUE] ### SHT21 HUMIDITY TEMPERATURE SENSOR ############# SHT21_ADDRESS = 0x41 _SHT21_TEMP = 0xf3 _SHT21_HUM = 0xf5 _SHT21_RESET = 0xFE _INA3221_REG_SHUNTVOLTAGE = 0x01 _INA3221_REG_BUSVOLTAGE = 0x02 def SHT21_init(self): self.I2CWriteBulk(self.SHT21_ADDRESS, [self._SHT21_RESET]) # reset time.sleep(0.1) def SHT21_all(self): self.I2CWriteBulk(self.SHT21_ADDRESS, [self._SHT21_TEMP]) time.sleep(.1) self.startI2C() self.writeI2C((self.SHT21_ADDRESS << 1) | 1) # Read b = [] for a in range(2): b.append(self.readI2C(1)) b.append(self.readI2C(0)) self.stopI2C() temperature, checksum = struct.unpack('>HB', bytes(b)) return [temperature * 175.72 / 65536.0 - 46.85, 0] ####### TSL2561 LIGHT SENSOR ########### TSL_GAIN = 0x00 # 0x00=1x , 0x01 = 16x TSL_TIMING = 0x00 # 0x00=3 mS , 0x01 = 101 mS, 0x02 = 402mS def TSL2561_init(self): self.I2CWriteBulk(0x39, [0x80, 0x03]) # poweron self.I2CWriteBulk(0x39, [0x80 | 0x01, self.TSL_GAIN | self.TSL_TIMING]) return self.TSL2561_all() def TSL2561_gain(self, gain): self.TSL_GAIN = gain << 4 self.TSL2561_config(self.TSL_GAIN, self.TSL_TIMING) def TSL2561_timing(self, timing): self.TSL_TIMING = timing self.TSL2561_config(self.TSL_GAIN, self.TSL_TIMING) def TSL2561_rate(self, timing): self.TSL_TIMING = timing self.TSL2561_config(self.TSL_GAIN, self.TSL_TIMING) def TSL2561_config(self, gain, timing): self.I2CWriteBulk(0x39, [0x80 | 0x01, gain | timing]) # Timing register 0x01. gain[1x,16x] | timing[13mS,100mS,400mS] def TSL2561_all(self): ''' returns a 2 element list. total,IR returns None if communication timed out with I2C sensor ''' b, tmt = self.I2CReadBulk(0x39, 0x80 | 0x20 | 0x0C, 4) if tmt: return None if None not in b: return [(b[x * 2 + 1] << 8) | b[x * 2] for x in range(2)] # total, IR def MLX90614_init(self): pass def MLX90614_all(self): ''' return a single element list. None if failed ''' vals, tmt = self.I2CReadBulk(0x5A, 0x07, 3) if tmt: return None if vals: if len(vals) == 3: return [((((vals[1] & 0x007f) << 8) + vals[0]) * 0.02) - 0.01 - 273.15] else: return None else: return None MCP5725_ADDRESS = 0x60 def MCP4725_init(self): pass def MCP4725_set(self, val): ''' Set the DAC value. 0 - 4095 ''' self.I2CWriteBulk(self.MCP5725_ADDRESS, [0x40, (val >> 4) & 0xFF, (val & 0xF) << 4]) ####################### HMC5883L MAGNETOMETER ############### HMC5883L_ADDRESS = 0x1E HMC_CONFA = 0x00 HMC_CONFB = 0x01 HMC_MODE = 0x02 HMC_STATUS = 0x09 # --------CONFA register bits. 0x00----------- HMCSamplesToAverage = 0 HMCSamplesToAverage_choices = [1, 2, 4, 8] HMCDataOutputRate = 6 HMCDataOutputRate_choices = [0.75, 1.5, 3, 7.5, 15, 30, 75] HMCMeasurementConf = 0 # --------CONFB register bits. 0x01----------- HMCGainValue = 7 # least sensitive HMCGain_choices = [8, 7, 6, 5, 4, 3, 2, 1] HMCGainScaling = [1370., 1090., 820., 660., 440., 390., 330., 230.] def HMC5883L_init(self): self.__writeHMCCONFA__() self.__writeHMCCONFB__() self.I2CWriteBulk(self.HMC5883L_ADDRESS, [self.HMC_MODE, 0]) # enable continuous measurement mode def __writeHMCCONFB__(self): self.I2CWriteBulk(self.HMC5883L_ADDRESS, [self.HMC_CONFB, self.HMCGainValue << 5]) # set gain def __writeHMCCONFA__(self): self.I2CWriteBulk(self.HMC5883L_ADDRESS, [self.HMC_CONFA, (self.HMCDataOutputRate << 2) | (self.HMCSamplesToAverage << 5) | ( self.HMCMeasurementConf)]) def HMC5883L_getVals(self, addr, bytes): vals = self.I2CReadBulk(self.ADDRESS, addr, bytes) return vals def HMC5883L_all(self): vals = self.HMC5883L_getVals(0x03, 6) if vals: if len(vals) == 6: return [np.int16(vals[a * 2] << 8 | vals[a * 2 + 1]) / self.HMCGainScaling[self.HMCGainValue] for a in range(3)] else: return False else: return False PCA9685_address = 64 def PCA9685_init(self): prescale_val = int((25000000.0 / 4096 / 60.) - 1) # default clock at 25MHz # self.I2CWriteBulk(self.PCA9685_address, [0x00,0x10]) #MODE 1 , Sleep print('clock set to,', prescale_val) self.I2CWriteBulk(self.PCA9685_address, [0xFE, prescale_val]) # PRESCALE , prescale value self.I2CWriteBulk(self.PCA9685_address, [0x00, 0x80]) # MODE 1 , restart self.I2CWriteBulk(self.PCA9685_address, [0x01, 0x04]) # MODE 2 , Totem Pole pass CH0 = 0x6 # LED0 start register CH0_ON_L = 0x6 # channel0 output and brightness control byte 0 CH0_ON_H = 0x7 # channel0 output and brightness control byte 1 CH0_OFF_L = 0x8 # channel0 output and brightness control byte 2 CH0_OFF_H = 0x9 # channel0 output and brightness control byte 3 CHAN_WIDTH = 4 def PCA9685_set(self, chan, angle): ''' chan: 1-16 Set the servo angle for SG90: angle(0 - 180) ''' Min = 180 Max = 650 val = int(((Max - Min) * (angle / 180.)) + Min) print(chan, angle, val) self.I2CWriteBulk(self.PCA9685_address, [self.CH0_ON_L + self.CHAN_WIDTH * (chan - 1), 0]) # self.I2CWriteBulk(self.PCA9685_address, [self.CH0_ON_H + self.CHAN_WIDTH * (chan - 1), 0]) # Turn on immediately. At 0. self.I2CWriteBulk(self.PCA9685_address, [self.CH0_OFF_L + self.CHAN_WIDTH * (chan - 1), val & 0xFF]) # Turn off after val width 0-4095 self.I2CWriteBulk(self.PCA9685_address, [self.CH0_OFF_H + self.CHAN_WIDTH * (chan - 1), (val >> 8) & 0xFF]) ## ADS1115 REG_POINTER_MASK = 0x3 REG_POINTER_CONVERT = 0 REG_POINTER_CONFIG = 1 REG_POINTER_LOWTHRESH = 2 REG_POINTER_HITHRESH = 3 REG_CONFIG_OS_MASK = 0x8000 REG_CONFIG_OS_SINGLE = 0x8000 REG_CONFIG_OS_BUSY = 0x0000 REG_CONFIG_OS_NOTBUSY = 0x8000 REG_CONFIG_MUX_MASK = 0x7000 REG_CONFIG_MUX_DIFF_0_1 = 0x0000 # Differential P = AIN0, N = AIN1 =default) REG_CONFIG_MUX_DIFF_0_3 = 0x1000 # Differential P = AIN0, N = AIN3 REG_CONFIG_MUX_DIFF_1_3 = 0x2000 # Differential P = AIN1, N = AIN3 REG_CONFIG_MUX_DIFF_2_3 = 0x3000 # Differential P = AIN2, N = AIN3 REG_CONFIG_MUX_SINGLE_0 = 0x4000 # Single-ended AIN0 REG_CONFIG_MUX_SINGLE_1 = 0x5000 # Single-ended AIN1 REG_CONFIG_MUX_SINGLE_2 = 0x6000 # Single-ended AIN2 REG_CONFIG_MUX_SINGLE_3 = 0x7000 # Single-ended AIN3 REG_CONFIG_PGA_MASK = 0x0E00 # bits 11:9 REG_CONFIG_PGA_6_144V = (0 << 9) # +/-6.144V range = Gain 2/3 REG_CONFIG_PGA_4_096V = (1 << 9) # +/-4.096V range = Gain 1 REG_CONFIG_PGA_2_048V = (2 << 9) # +/-2.048V range = Gain 2 =default) REG_CONFIG_PGA_1_024V = (3 << 9) # +/-1.024V range = Gain 4 REG_CONFIG_PGA_0_512V = (4 << 9) # +/-0.512V range = Gain 8 REG_CONFIG_PGA_0_256V = (5 << 9) # +/-0.256V range = Gain 16 REG_CONFIG_MODE_MASK = 0x0100 # bit 8 REG_CONFIG_MODE_CONTIN = (0 << 8) # Continuous conversion mode REG_CONFIG_MODE_SINGLE = (1 << 8) # Power-down single-shot mode =default) REG_CONFIG_DR_MASK = 0x00E0 REG_CONFIG_DR_8SPS = (0 << 5) # 8 SPS REG_CONFIG_DR_16SPS = (1 << 5) # 16 SPS REG_CONFIG_DR_32SPS = (2 << 5) # 32 SPS REG_CONFIG_DR_64SPS = (3 << 5) # 64 SPS REG_CONFIG_DR_128SPS = (4 << 5) # 128 SPS REG_CONFIG_DR_250SPS = (5 << 5) # 260 SPS REG_CONFIG_DR_475SPS = (6 << 5) # 475 SPS REG_CONFIG_DR_860SPS = (7 << 5) # 860 SPS REG_CONFIG_CMODE_MASK = 0x0010 REG_CONFIG_CMODE_TRAD = 0x0000 REG_CONFIG_CMODE_WINDOW = 0x0010 REG_CONFIG_CPOL_MASK = 0x0008 REG_CONFIG_CPOL_ACTVLOW = 0x0000 REG_CONFIG_CPOL_ACTVHI = 0x0008 REG_CONFIG_CLAT_MASK = 0x0004 REG_CONFIG_CLAT_NONLAT = 0x0000 REG_CONFIG_CLAT_LATCH = 0x0004 REG_CONFIG_CQUE_MASK = 0x0003 REG_CONFIG_CQUE_1CONV = 0x0000 REG_CONFIG_CQUE_2CONV = 0x0001 REG_CONFIG_CQUE_4CONV = 0x0002 REG_CONFIG_CQUE_NONE = 0x0003 ADS1115_gains = OrderedDict([('GAIN_TWOTHIRDS', REG_CONFIG_PGA_6_144V), ('GAIN_ONE', REG_CONFIG_PGA_4_096V), ('GAIN_TWO', REG_CONFIG_PGA_2_048V), ('GAIN_FOUR', REG_CONFIG_PGA_1_024V), ('GAIN_EIGHT', REG_CONFIG_PGA_0_512V), ('GAIN_SIXTEEN', REG_CONFIG_PGA_0_256V)]) ADS1115_gain_scaling = OrderedDict( [('GAIN_TWOTHIRDS', 0.1875), ('GAIN_ONE', 0.125), ('GAIN_TWO', 0.0625), ('GAIN_FOUR', 0.03125), ('GAIN_EIGHT', 0.015625), ('GAIN_SIXTEEN', 0.0078125)]) ADS1115_scaling = 0.125 ADS1115_channels = OrderedDict( [('UNI_0', 0), ('UNI_1', 1), ('UNI_2', 2), ('UNI_3', 3), ('DIFF_01', '01'), ('DIFF_23', '23')]) ADS1115_rates = OrderedDict( [(8, REG_CONFIG_DR_8SPS), (16, REG_CONFIG_DR_16SPS), (32, REG_CONFIG_DR_32SPS), (64, REG_CONFIG_DR_64SPS), (128, REG_CONFIG_DR_128SPS), (250, REG_CONFIG_DR_250SPS), (475, REG_CONFIG_DR_475SPS), (860, REG_CONFIG_DR_860SPS)]) # sampling data rate ADS1115_DATARATE = 250 # 250SPS [ 8, 16, 32, 64, 128, 250, 475, 860 ] ADS1115_GAIN = REG_CONFIG_PGA_4_096V # +/-4.096V range = Gain 1 . [+-6, +-4, +-2, +-1, +-0.5, +- 0.25] ADS1115_CHANNEL = 0 # ref: type_selection ADS1115_ADDRESS = 0x48 def ADS1115_init(self): self.I2CWriteBulk(self.ADS1115_ADDRESS, [0x80, 0x03]) # poweron def ADS1115_gain(self, gain): ''' options : 'GAIN_TWOTHIRDS','GAIN_ONE','GAIN_TWO','GAIN_FOUR','GAIN_EIGHT','GAIN_SIXTEEN' ''' print('setting gain:', str(gain)) if (type(gain) == int): # From the UI selectors which return index self.ADS1115_GAIN = list(self.ADS1115_gains.items())[gain][1] print('set gain with index selection:', self.ADS1115_GAIN) self.ADS1115_scaling = list(self.ADS1115_gain_scaling.items())[gain][1] print('Scaling factor:', self.ADS1115_scaling) else: self.ADS1115_GAIN = self.ADS1115_gains.get(gain, self.REG_CONFIG_PGA_4_096V) self.ADS1115_scaling = self.ADS1115_gain_scaling.get(gain) print('set gain type B:', str(gain), self.ADS1115_GAIN, self.ADS1115_scaling) def ADS1115_channel(self, channel): ''' options 'UNI_0','UNI_1','UNI_2','UNI_3','DIFF_01','DIFF_23' ''' self.ADS1115_CHANNEL = int(channel) print('channel', channel, self.ADS1115_CHANNEL) def ADS1115_rate(self, rate): ''' data rate options 8,16,32,64,128,250,475,860 SPS . string. ''' opts = [8, 16, 32, 64, 128, 250, 475, 860] rate = int(rate) if rate < len(opts): self.ADS1115_DATARATE = opts[rate] print('rate:', rate, self.ADS1115_DATARATE) def ADS1115_read(self): ''' returns a voltage from ADS1115 channel selected using ADS1115_channel. default UNI_0 (Unipolar from channel 0) ''' if self.ADS1115_CHANNEL in [0, 1, 2, 3]: config = (self.REG_CONFIG_CQUE_NONE # Disable the comparator (default val) | self.REG_CONFIG_CLAT_NONLAT # Non-latching (default val) | self.REG_CONFIG_CPOL_ACTVLOW # Alert/Rdy active low (default val) | self.REG_CONFIG_CMODE_TRAD # Traditional comparator (default val) | (self.ADS1115_rates.get(self.ADS1115_DATARATE, self.REG_CONFIG_DR_250SPS)) # 250 samples per second (default) | (self.REG_CONFIG_MODE_SINGLE) # Single-shot mode (default) | self.ADS1115_GAIN) if self.ADS1115_CHANNEL == 0: config |= self.REG_CONFIG_MUX_SINGLE_0 elif self.ADS1115_CHANNEL == 1: config |= self.REG_CONFIG_MUX_SINGLE_1 elif self.ADS1115_CHANNEL == 2: config |= self.REG_CONFIG_MUX_SINGLE_2 elif self.ADS1115_CHANNEL == 3: config |= self.REG_CONFIG_MUX_SINGLE_3 # Set 'start single-conversion' bit config |= self.REG_CONFIG_OS_SINGLE self.I2CWriteBulk(self.ADS1115_ADDRESS, [self.REG_POINTER_CONFIG, (config >> 8) & 0xFF, config & 0xFF]) time.sleep(1. / self.ADS1115_DATARATE + .002) # convert to mS to S b, tmt = self.I2CReadBulk(self.ADS1115_ADDRESS, self.REG_POINTER_CONVERT, 2) if tmt: return None if b is not None: x = ((b[0] << 8) | b[1]) * self.ADS1115_scaling * 1e-3 return [((b[0] << 8) | b[1]) * self.ADS1115_scaling * 1e-3] # scale and convert to volts elif self.ADS1115_CHANNEL in ['01', '23']: return [0] if __name__ == '__main__': a = connect(autoscan=True) print('version', a.version) print('------------') if not a.connected: sys.exit(1) time.sleep(0.01) a.setReg('DDRC', 3) a.setReg('PORTC', 2) time.sleep(1) a.setReg('PORTC', 3) a.setReg('DDRC', 0) print(a.I2CScan()) ''' a.PCA9685_init() a.PCA9685_set(1,650) for x in range(180): a.PCA9685_set(1,x) time.sleep(0.01) a.TSL2561_init() s=time.time() for x in range(1000): print(a.TSL2561_all()) print(time.time()-s) a.MPU6050_init() s=time.time() for x in range(1000): print(a.MPU6050_all()[0]) print(time.time()-s) ''' KuttyPy-GUI-2.3/KuttyPyLibNano.py000066400000000000000000001130201456261524100167020ustar00rootroot00000000000000''' Code snippet for reading data from the kuttypy ''' import serial, struct, time,platform,os,sys,functools from utilities import REGISTERS_NANO as REGISTERS from collections import OrderedDict import numpy as np if 'inux' in platform.system(): #Linux based system import fcntl Byte = struct.Struct("B") # size 1 ShortInt = struct.Struct("H") # size 2 Integer= struct.Struct("I") # size 4 def _bv(x): return 1< 0,1,2,3 -> shift left by 3 positions def MPU6050_accel_range(self,val): print(val) self.I2CWriteBulk(0x68,[0x1C,val<<3]) #Accelerometer Range. 2,4,8,16 -> 0,1,2,3 -> shift left by 3 positions def MPU6050_kalman_set(self,val): if not val: self.MPU6050_kalman = 0 return noise=[] for a in range(50): noise.append(np.array(self.MPU6050_all(disableKalman=True))) noise = np.array(noise) self.MPU6050_kalman = self.KalmanFilter(1e6*np.ones(noise.shape[1])/(10**val), np.std(noise,0)**2, noise[-1]) def MPU6050_accel(self): b,tmt = self.I2CReadBulk(0x68, 0x3B ,6) if tmt:return None if None not in b: return [(b[x*2+1]<<8)|b[x*2] for x in range(3)] #X,Y,Z def MPU6050_gyro(self): b,tmt = self.I2CReadBulk(0x68, 0x3B+6 ,6) if tmt:return None if None not in b: return [(b[x*2+1]<<8)|b[x*2] for x in range(3)] #X,Y,Z def MPU6050_all(self,disableKalman=False): ''' returns a 7 element list. Ax,Ay,Az,T,Gx,Gy,Gz returns None if communication timed out with I2C sensor disableKalman can be set to True if Kalman was previously enabled. ''' b,tmt = self.I2CReadBulk(0x68, 0x3B ,14) if tmt:return None if None not in b: if (not self.MPU6050_kalman) or disableKalman: return [ np.int16((b[x*2]<<8)|b[x*2+1]) for x in range(7) ] #Ax,Ay,Az, Temp, Gx, Gy,Gz else: self.MPU6050_kalman.input([ np.int16((b[x*2]<<8)|b[x*2+1]) for x in range(7) ]) return self.MPU6050_kalman.output() ######## AK8963 magnetometer attacched to MPU925x ####### AK8963_ADDRESS =0x0C _AK8963_CNTL = 0x0A def AK8963_init(self): self.I2CWriteBulk(self.AK8963_ADDRESS,[self._AK8963_CNTL,0]) #power down mag self.I2CWriteBulk(self.AK8963_ADDRESS,[self._AK8963_CNTL,(1<<4)|6]) #mode (0=14bits,1=16bits) <<4 | (2=8Hz , 6=100Hz) def AK8963_all(self,disableKalman=False): vals,tmt=self.I2CReadBulk(self.AK8963_ADDRESS,0x03,7) #6+1 . 1(ST2) should not have bit 4 (0x8) true. It's ideally 16 . overflow bit if tmt:return None ax,ay,az = struct.unpack('hhh',bytes(vals[:6])) if not vals[6]&0x08:return [ax,ay,az] else: return None ####### BMP280 ################### ## Ported from https://github.com/farmerkeith/BMP280-library/blob/master/farmerkeith_BMP280.cpp BMP280_ADDRESS = 118 BMP280_REG_CONTROL = 0xF4 BMP280_REG_RESULT = 0xF6 BMP280_oversampling = 0 _BMP280_PRESSURE_MIN_HPA = 0 _BMP280_PRESSURE_MAX_HPA = 1600 _BMP280_sea_level_pressure = 1013.25 #for calibration.. from circuitpython library def BMP280_init(self): b,tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0xD0 ,1) if tmt:return b = b[0] if b in [0x58,0x56,0x57]: print('BMP280. ID:',b) elif b==0x60: print('BME280 . includes humidity') else: print('ID unknown',b) # get calibration data b,tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0x88 ,24) #24 bytes containing calibration data coeff = list(struct.unpack(' self._BMP280_PRESSURE_MAX_HPA: return self._BMP280_PRESSURE_MAX_HPA return pressure def BMP280_all(self): #os = [0x34,0x74,0xb4,0xf4] #delays=[0.005,0.008,0.014,0.026] #self.I2CWriteBulk(self.BMP280_ADDRESS,[self.BMP280_REG_CONTROL,os[self.BMP280_oversampling] ]) #time.sleep(delays[self.BMP280_oversampling]) data,tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0xF7,6) if tmt:return None if None not in data: # Convert pressure and temperature data to 19-bits adc_p = (((data[0] & 0xFF) * 65536.) + ((data[1] & 0xFF) * 256.) + (data[2] & 0xF0)) / 16. adc_t = (((data[3] & 0xFF) * 65536.) + ((data[4] & 0xFF) * 256.) + (data[5] & 0xF0)) / 16. return [self._BMP280_calcPressure(adc_p,adc_t), self._BMP280_calcTemperature(adc_t), 0] ########## TCS34725 RGB sensor ########### _TCS34725_COMMAND_BIT = 0x80 _TCS34725_REGISTER_STATUS = 0x13 _TCS34725_REGISTER_CDATA = 0x14 _TCS34725_REGISTER_RDATA = 0x16 _TCS34725_REGISTER_GDATA = 0x18 _TCS34725_REGISTER_BDATA = 0x1a _TCS34725_REGISTER_ENABLE = 0x00 _TCS34725_REGISTER_ATIME = 0x01 _TCS34725_REGISTER_AILT = 0x04 _TCS34725_REGISTER_AIHT = 0x06 _TCS34725_REGISTER_ID = 0x12 _TCS34725_REGISTER_APERS = 0x0c _TCS34725_REGISTER_CONTROL = 0x0f _TCS34725_REGISTER_SENSORID = 0x12 _TCS34725_REGISTER_STATUS = 0x13 _TCS34725_ENABLE_AIEN = 0x10 _TCS34725_ENABLE_WEN = 0x08 _TCS34725_ENABLE_AEN = 0x02 _TCS34725_ENABLE_PON = 0x01 _GAINS = (1, 4, 16, 60) _CYCLES = (0, 1, 2, 3, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60) _INTEGRATION_TIME_THRESHOLD_LOW = 2.4 _INTEGRATION_TIME_THRESHOLD_HIGH = 614.4 TCS34725_ADDRESS = 41 def TCS34725_init(self): enable,tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_ENABLE,1) enable = enable[0] self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_REGISTER_ENABLE,enable|self._TCS34725_ENABLE_PON]) # time.sleep(0.003) self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_ENABLE,enable|self._TCS34725_ENABLE_PON | self._TCS34725_ENABLE_AEN| self._TCS34725_ENABLE_AIEN]) # self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_APERS,10]) self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_ATIME,256-40]) def TCS34725_gain(self,g): self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_CONTROL,g]) #Gain def TCS34725_all(self): R,tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_RDATA,2) G,tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_GDATA,2) B,tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_BDATA,2) if tmt:return None return [R[0]|(R[1]<<8),G[0]|(G[1]<<8),B[0]|(B[1]<<8)] def TCS34725_range(self): pass ####### MS5611 Altimeter ################### MS5611_ADDRESS = 119 def MS5611_init(self): self.I2CWriteBulk(self.MS5611_ADDRESS, [0x1E]) # reset time.sleep(0.5) self._MS5611_calib = np.zeros(6) #calibration data. #pressure gain, offset . T coeff of P gain, offset. Ref temp. T coeff of T. all unsigned shorts. b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA2 ,2) if tmt:return self._MS5611_calib[0] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA4 ,2) self._MS5611_calib[1] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA6 ,2) self._MS5611_calib[2] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA8 ,2) self._MS5611_calib[3] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xAA ,2) self._MS5611_calib[4] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xAC ,2) self._MS5611_calib[5] = struct.unpack('!H', bytes(b))[0] print('Calibration for MS5611:',self._MS5611_calib) def MS5611_all(self): self.I2CWriteBulk(self.MS5611_ADDRESS, [0x48]) # 0x48 Pressure conversion(OSR = 4096) command time.sleep(0.01) #10mS b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0x00 ,3) #data. D1 = b[0]*65536 + b[1]*256 + b[2] #msb2, msb1, lsb self.I2CWriteBulk(self.MS5611_ADDRESS, [0x58]) # 0x58 Temperature conversion(OSR = 4096) command time.sleep(0.01) b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0x00 ,3) #data. D2 = b[0]*65536 + b[1]*256 + b[2] #msb2, msb1, lsb dT = D2 - self._MS5611_calib[4] * 256 TEMP = 2000 + dT * self._MS5611_calib[5] / 8388608 OFF = self._MS5611_calib[1] * 65536 + (self._MS5611_calib[3] * dT) / 128 SENS = self._MS5611_calib[0] * 32768 + (self._MS5611_calib[2] * dT ) / 256 T2 = 0; OFF2 = 0; SENS2 = 0 if TEMP >= 2000 : T2 = 0 OFF2 = 0 SENS2 = 0 elif TEMP < 2000 : T2 = (dT * dT) / 2147483648 OFF2 = 5 * ((TEMP - 2000) * (TEMP - 2000)) / 2 SENS2 = 5 * ((TEMP - 2000) * (TEMP - 2000)) / 4 if TEMP < -1500 : OFF2 = OFF2 + 7 * ((TEMP + 1500) * (TEMP + 1500)) SENS2 = SENS2 + 11 * ((TEMP + 1500) * (TEMP + 1500)) / 2 TEMP = TEMP - T2 OFF = OFF - OFF2 SENS = SENS - SENS2 pressure = ((((D1 * SENS) / 2097152) - OFF) / 32768.0) / 100.0 cTemp = TEMP / 100.0 return [pressure,cTemp,0] ### INA3221 3 channel , high side current sensor ############# INA3221_ADDRESS = 0x41 _INA3221_REG_CONFIG = 0x0 _INA3221_SHUNT_RESISTOR_VALUE = 0.1 _INA3221_REG_SHUNTVOLTAGE = 0x01 _INA3221_REG_BUSVOLTAGE = 0x02 def INA3221_init(self): self.I2CWriteBulk(self.INA3221_ADDRESS,[self._INA3221_REG_CONFIG, 0b01110101, 0b00100111 ]) #cont shunt. def INA3221_all(self): I = [0.,0.,0.] b,tmt = self.I2CReadBulk(self.INA3221_ADDRESS,self._INA3221_REG_SHUNTVOLTAGE , 2) if tmt:return None b[1]&=0xF8; I[0] = struct.unpack('!h',bytes(b))[0] b,tmt = self.I2CReadBulk(self.INA3221_ADDRESS,self._INA3221_REG_SHUNTVOLTAGE +2 , 2) if tmt:return None b[1]&=0xF8; I[1] = struct.unpack('!h',bytes(b))[0] b,tmt = self.I2CReadBulk(self.INA3221_ADDRESS,self._INA3221_REG_SHUNTVOLTAGE +4 , 2) if tmt:return None b[1]&=0xF8; I[2] = struct.unpack('!h',bytes(b))[0] return [0.005*I[0]/self._INA3221_SHUNT_RESISTOR_VALUE,0.005*I[1]/self._INA3221_SHUNT_RESISTOR_VALUE,0.005*I[2]/self._INA3221_SHUNT_RESISTOR_VALUE] ### SHT21 HUMIDITY TEMPERATURE SENSOR ############# SHT21_ADDRESS = 0x41 _SHT21_TEMP = 0xf3 _SHT21_HUM = 0xf5 _SHT21_RESET = 0xFE _INA3221_REG_SHUNTVOLTAGE = 0x01 _INA3221_REG_BUSVOLTAGE = 0x02 def SHT21_init(self): self.I2CWriteBulk(self.SHT21_ADDRESS,[self._SHT21_RESET ]) #reset time.sleep(0.1) def SHT21_all(self): self.I2CWriteBulk(self.SHT21_ADDRESS,[self._SHT21_TEMP ]) time.sleep(.1) self.startI2C() self.writeI2C((self.SHT21_ADDRESS<<1)|1) #Read b=[] for a in range(2):b.append(self.readI2C(1) ) b.append(self.readI2C(0)) self.stopI2C() temperature,checksum = struct.unpack('>HB',bytes(b)) return [temperature* 175.72 / 65536.0 - 46.85,0] ####### TSL2561 LIGHT SENSOR ########### TSL_GAIN = 0x00 # 0x00=1x , 0x01 = 16x TSL_TIMING = 0x00 # 0x00=3 mS , 0x01 = 101 mS, 0x02 = 402mS def TSL2561_init(self): self.I2CWriteBulk(0x39,[0x80 , 0x03 ]) #poweron self.I2CWriteBulk(0x39,[0x80 | 0x01, self.TSL_GAIN|self.TSL_TIMING ]) return self.TSL2561_all() def TSL2561_gain(self,gain): self.TSL_GAIN = gain<<4 self.TSL2561_config(self.TSL_GAIN,self.TSL_TIMING) def TSL2561_timing(self,timing): self.TSL_TIMING = timing self.TSL2561_config(self.TSL_GAIN,self.TSL_TIMING) def TSL2561_rate(self,timing): self.TSL_TIMING = timing self.TSL2561_config(self.TSL_GAIN,self.TSL_TIMING) def TSL2561_config(self,gain,timing): self.I2CWriteBulk(0x39,[0x80 | 0x01, gain|timing]) #Timing register 0x01. gain[1x,16x] | timing[13mS,100mS,400mS] def TSL2561_all(self): ''' returns a 2 element list. total,IR returns None if communication timed out with I2C sensor ''' b,tmt = self.I2CReadBulk(0x39,0x80 | 0x20 | 0x0C ,4) if tmt:return None if None not in b: return [ (b[x*2+1]<<8)|b[x*2] for x in range(2) ] #total, IR def MLX90614_init(self): pass def MLX90614_all(self): ''' return a single element list. None if failed ''' vals,tmt = self.I2CReadBulk(0x5A, 0x07 ,3) if tmt:return None if vals: if len(vals)==3: return [((((vals[1]&0x007f)<<8)+vals[0])*0.02)-0.01 - 273.15] else: return None else: return None MCP5725_ADDRESS = 0x60 def MCP4725_init(self): pass def MCP4725_set(self,val): ''' Set the DAC value. 0 - 4095 ''' self.I2CWriteBulk(self.MCP5725_ADDRESS, [0x40,(val>>4)&0xFF,(val&0xF)<<4]) ####################### HMC5883L MAGNETOMETER ############### HMC5883L_ADDRESS = 0x1E HMC_CONFA=0x00 HMC_CONFB=0x01 HMC_MODE=0x02 HMC_STATUS=0x09 #--------CONFA register bits. 0x00----------- HMCSamplesToAverage=0 HMCSamplesToAverage_choices=[1,2,4,8] HMCDataOutputRate=6 HMCDataOutputRate_choices=[0.75,1.5,3,7.5,15,30,75] HMCMeasurementConf=0 #--------CONFB register bits. 0x01----------- HMCGainValue = 7 #least sensitive HMCGain_choices = [8,7,6,5,4,3,2,1] HMCGainScaling=[1370.,1090.,820.,660.,440.,390.,330.,230.] def HMC5883L_init(self): self.__writeHMCCONFA__() self.__writeHMCCONFB__() self.I2CWriteBulk(self.HMC5883L_ADDRESS,[self.HMC_MODE,0]) #enable continuous measurement mode def __writeHMCCONFB__(self): self.I2CWriteBulk(self.HMC5883L_ADDRESS,[self.HMC_CONFB,self.HMCGainValue<<5]) #set gain def __writeHMCCONFA__(self): self.I2CWriteBulk(self.HMC5883L_ADDRESS,[self.HMC_CONFA,(self.HMCDataOutputRate<<2)|(self.HMCSamplesToAverage<<5)|(self.HMCMeasurementConf)]) def HMC5883L_getVals(self,addr,bytes): vals = self.I2C.readBulk(self.ADDRESS,addr,bytes) return vals def HMC5883L_all(self): vals=self.HMC5883L_getVals(0x03,6) if vals: if len(vals)==6: return [np.int16(vals[a*2]<<8|vals[a*2+1])/self.HMCGainScaling[self.HMCGainValue] for a in range(3)] else: return False else: return False PCA9685_address = 64 def PCA9685_init(self): prescale_val = int((25000000.0 / 4096 / 60.) - 1) # default clock at 25MHz #self.I2CWriteBulk(self.PCA9685_address, [0x00,0x10]) #MODE 1 , Sleep print('clock set to,',prescale_val) self.I2CWriteBulk(self.PCA9685_address, [0xFE,prescale_val]) #PRESCALE , prescale value self.I2CWriteBulk(self.PCA9685_address, [0x00,0x80]) #MODE 1 , restart self.I2CWriteBulk(self.PCA9685_address, [0x01,0x04]) #MODE 2 , Totem Pole pass CH0 = 0x6 #LED0 start register CH0_ON_L = 0x6 #channel0 output and brightness control byte 0 CH0_ON_H = 0x7 #channel0 output and brightness control byte 1 CH0_OFF_L = 0x8 #channel0 output and brightness control byte 2 CH0_OFF_H = 0x9 #channel0 output and brightness control byte 3 CHAN_WIDTH = 4 def PCA9685_set(self,chan,angle): ''' chan: 1-16 Set the servo angle for SG90: angle(0 - 180) ''' Min = 180 Max = 650 val = int((( Max-Min ) * ( angle/180. ))+Min) print(chan,angle,val) self.I2CWriteBulk(self.PCA9685_address, [self.CH0_ON_L + self.CHAN_WIDTH * (chan - 1),0]) # self.I2CWriteBulk(self.PCA9685_address, [self.CH0_ON_H + self.CHAN_WIDTH * (chan - 1),0]) # Turn on immediately. At 0. self.I2CWriteBulk(self.PCA9685_address, [self.CH0_OFF_L + self.CHAN_WIDTH * (chan - 1),val&0xFF]) #Turn off after val width 0-4095 self.I2CWriteBulk(self.PCA9685_address, [self.CH0_OFF_H + self.CHAN_WIDTH * (chan - 1),(val>>8)&0xFF]) ## ADS1115 REG_POINTER_MASK = 0x3 REG_POINTER_CONVERT = 0 REG_POINTER_CONFIG = 1 REG_POINTER_LOWTHRESH=2 REG_POINTER_HITHRESH =3 REG_CONFIG_OS_MASK =0x8000 REG_CONFIG_OS_SINGLE =0x8000 REG_CONFIG_OS_BUSY =0x0000 REG_CONFIG_OS_NOTBUSY =0x8000 REG_CONFIG_MUX_MASK =0x7000 REG_CONFIG_MUX_DIFF_0_1 =0x0000 # Differential P = AIN0, N = AIN1 =default) REG_CONFIG_MUX_DIFF_0_3 =0x1000 # Differential P = AIN0, N = AIN3 REG_CONFIG_MUX_DIFF_1_3 =0x2000 # Differential P = AIN1, N = AIN3 REG_CONFIG_MUX_DIFF_2_3 =0x3000 # Differential P = AIN2, N = AIN3 REG_CONFIG_MUX_SINGLE_0 =0x4000 # Single-ended AIN0 REG_CONFIG_MUX_SINGLE_1 =0x5000 # Single-ended AIN1 REG_CONFIG_MUX_SINGLE_2 =0x6000 # Single-ended AIN2 REG_CONFIG_MUX_SINGLE_3 =0x7000 # Single-ended AIN3 REG_CONFIG_PGA_MASK =0x0E00 #bits 11:9 REG_CONFIG_PGA_6_144V =(0<<9) # +/-6.144V range = Gain 2/3 REG_CONFIG_PGA_4_096V =(1<<9) # +/-4.096V range = Gain 1 REG_CONFIG_PGA_2_048V =(2<<9) # +/-2.048V range = Gain 2 =default) REG_CONFIG_PGA_1_024V =(3<<9) # +/-1.024V range = Gain 4 REG_CONFIG_PGA_0_512V =(4<<9) # +/-0.512V range = Gain 8 REG_CONFIG_PGA_0_256V =(5<<9) # +/-0.256V range = Gain 16 REG_CONFIG_MODE_MASK =0x0100 #bit 8 REG_CONFIG_MODE_CONTIN =(0<<8) # Continuous conversion mode REG_CONFIG_MODE_SINGLE =(1<<8) # Power-down single-shot mode =default) REG_CONFIG_DR_MASK =0x00E0 REG_CONFIG_DR_8SPS =(0<<5) #8 SPS REG_CONFIG_DR_16SPS =(1<<5) #16 SPS REG_CONFIG_DR_32SPS =(2<<5) #32 SPS REG_CONFIG_DR_64SPS =(3<<5) #64 SPS REG_CONFIG_DR_128SPS =(4<<5) #128 SPS REG_CONFIG_DR_250SPS =(5<<5) #260 SPS REG_CONFIG_DR_475SPS =(6<<5) #475 SPS REG_CONFIG_DR_860SPS =(7<<5) #860 SPS REG_CONFIG_CMODE_MASK =0x0010 REG_CONFIG_CMODE_TRAD =0x0000 REG_CONFIG_CMODE_WINDOW =0x0010 REG_CONFIG_CPOL_MASK =0x0008 REG_CONFIG_CPOL_ACTVLOW =0x0000 REG_CONFIG_CPOL_ACTVHI =0x0008 REG_CONFIG_CLAT_MASK =0x0004 REG_CONFIG_CLAT_NONLAT =0x0000 REG_CONFIG_CLAT_LATCH =0x0004 REG_CONFIG_CQUE_MASK =0x0003 REG_CONFIG_CQUE_1CONV =0x0000 REG_CONFIG_CQUE_2CONV =0x0001 REG_CONFIG_CQUE_4CONV =0x0002 REG_CONFIG_CQUE_NONE =0x0003 gains = OrderedDict([('GAIN_TWOTHIRDS',REG_CONFIG_PGA_6_144V),('GAIN_ONE',REG_CONFIG_PGA_4_096V),('GAIN_TWO',REG_CONFIG_PGA_2_048V),('GAIN_FOUR',REG_CONFIG_PGA_1_024V),('GAIN_EIGHT',REG_CONFIG_PGA_0_512V),('GAIN_SIXTEEN',REG_CONFIG_PGA_0_256V)]) gain_scaling = OrderedDict([('GAIN_TWOTHIRDS',0.1875),('GAIN_ONE',0.125),('GAIN_TWO',0.0625),('GAIN_FOUR',0.03125),('GAIN_EIGHT',0.015625),('GAIN_SIXTEEN',0.0078125)]) type_selection = OrderedDict([('UNI_0',0),('UNI_1',1),('UNI_2',2),('UNI_3',3),('DIFF_01','01'),('DIFF_23','23')]) sdr_selection = OrderedDict([(8,REG_CONFIG_DR_8SPS),(16,REG_CONFIG_DR_16SPS),(32,REG_CONFIG_DR_32SPS),(64,REG_CONFIG_DR_64SPS),(128,REG_CONFIG_DR_128SPS),(250,REG_CONFIG_DR_250SPS),(475,REG_CONFIG_DR_475SPS),(860,REG_CONFIG_DR_860SPS)]) #sampling data rate conversion_time = [8,16,32,64,128,250,460,860] ADS1115_DATARATE = 5 #250SPS [ 8, 16, 32, 64, 128, 250, 475, 860 ] ADS1115_GAIN = REG_CONFIG_PGA_4_096V # +/-4.096V range = Gain 1 . [+-6, +-4, +-2, +-1, +-0.5, +- 0.25] ADS1115_CHANNEL = REG_CONFIG_MUX_SINGLE_0 # ref: type_selection TSL_TIMING = 0x00 # 0x00=3 mS , 0x01 = 101 mS, 0x02 = 402mS ADS1115_ADDRESS = 0x48 def ADS1115_init(self): self.I2CWriteBulk(0x39,[0x80 , 0x03 ]) #poweron def ADS1115_channel(self): pass def ADS1115_read(self): ''' returns a voltage from ADS1115 channel selected using ADS1115_channel. default UNI_0 (Unipolar from channel 0) ''' if chan<=3: config = (self.REG_CONFIG_CQUE_NONE # Disable the comparator (default val) |self.REG_CONFIG_CLAT_NONLAT # Non-latching (default val) |self.REG_CONFIG_CPOL_ACTVLOW #Alert/Rdy active low (default val) |self.REG_CONFIG_CMODE_TRAD # Traditional comparator (default val) |(self.ADS1115_DATARATE<<5) # 1600 samples per second (default) |(self.REG_CONFIG_MODE_SINGLE) # Single-shot mode (default) |self.ADS1115_GAIN) if self.ADS1115_CHANNEL == 0 : config |= self.REG_CONFIG_MUX_SINGLE_0 elif self.ADS1115_CHANNEL == 1 : config |= self.REG_CONFIG_MUX_SINGLE_1 elif self.ADS1115_CHANNEL == 2 : config |= self.REG_CONFIG_MUX_SINGLE_2 elif self.ADS1115_CHANNEL == 3 : config |= self.REG_CONFIG_MUX_SINGLE_3 #Set 'start single-conversion' bit config |= self.REG_CONFIG_OS_SINGLE self.I2CWriteBulk(self.ADS1115_ADDRESS,[self.REG_POINTER_CONFIG,(config>>8)&0xFF,config&0xFF]) time.sleep(1./self.rate+.002) #convert to mS to S return self.readRegister(self.REG_POINTER_CONVERT)*self.gain_scaling[self.gain] b,tmt = self.I2CReadBulk(0x68, 0x3B ,14) if tmt:return None if None not in b: return [ np.int16((b[x*2]<<8)|b[x*2+1]) for x in range(7) ] #Ax,Ay,Az, Temp, Gx, Gy,Gz if __name__ == '__main__': a=connect(autoscan=True) print ('version' , a.version) print ('------------') if not a.connected: sys.exit(1) time.sleep(0.01) a.setReg('DDRC',3) a.setReg('PORTC',2) time.sleep(1) a.setReg('PORTC',3) a.setReg('DDRC',0) print(a.I2CScan()) ''' a.PCA9685_init() a.PCA9685_set(1,650) for x in range(180): a.PCA9685_set(1,x) time.sleep(0.01) a.TSL2561_init() s=time.time() for x in range(1000): print(a.TSL2561_all()) print(time.time()-s) a.MPU6050_init() s=time.time() for x in range(1000): print(a.MPU6050_all()[0]) print(time.time()-s) ''' KuttyPy-GUI-2.3/KuttyPyLibUno.py000066400000000000000000001130171456261524100165560ustar00rootroot00000000000000''' Code snippet for reading data from the kuttypy ''' import serial, struct, time,platform,os,sys,functools from utilities import REGISTERS_UNO as REGISTERS from collections import OrderedDict import numpy as np if 'inux' in platform.system(): #Linux based system import fcntl Byte = struct.Struct("B") # size 1 ShortInt = struct.Struct("H") # size 2 Integer= struct.Struct("I") # size 4 def _bv(x): return 1< 0,1,2,3 -> shift left by 3 positions def MPU6050_accel_range(self,val): print(val) self.I2CWriteBulk(0x68,[0x1C,val<<3]) #Accelerometer Range. 2,4,8,16 -> 0,1,2,3 -> shift left by 3 positions def MPU6050_kalman_set(self,val): if not val: self.MPU6050_kalman = 0 return noise=[] for a in range(50): noise.append(np.array(self.MPU6050_all(disableKalman=True))) noise = np.array(noise) self.MPU6050_kalman = self.KalmanFilter(1e6*np.ones(noise.shape[1])/(10**val), np.std(noise,0)**2, noise[-1]) def MPU6050_accel(self): b,tmt = self.I2CReadBulk(0x68, 0x3B ,6) if tmt:return None if None not in b: return [(b[x*2+1]<<8)|b[x*2] for x in range(3)] #X,Y,Z def MPU6050_gyro(self): b,tmt = self.I2CReadBulk(0x68, 0x3B+6 ,6) if tmt:return None if None not in b: return [(b[x*2+1]<<8)|b[x*2] for x in range(3)] #X,Y,Z def MPU6050_all(self,disableKalman=False): ''' returns a 7 element list. Ax,Ay,Az,T,Gx,Gy,Gz returns None if communication timed out with I2C sensor disableKalman can be set to True if Kalman was previously enabled. ''' b,tmt = self.I2CReadBulk(0x68, 0x3B ,14) if tmt:return None if None not in b: if (not self.MPU6050_kalman) or disableKalman: return [ np.int16((b[x*2]<<8)|b[x*2+1]) for x in range(7) ] #Ax,Ay,Az, Temp, Gx, Gy,Gz else: self.MPU6050_kalman.input([ np.int16((b[x*2]<<8)|b[x*2+1]) for x in range(7) ]) return self.MPU6050_kalman.output() ######## AK8963 magnetometer attacched to MPU925x ####### AK8963_ADDRESS =0x0C _AK8963_CNTL = 0x0A def AK8963_init(self): self.I2CWriteBulk(self.AK8963_ADDRESS,[self._AK8963_CNTL,0]) #power down mag self.I2CWriteBulk(self.AK8963_ADDRESS,[self._AK8963_CNTL,(1<<4)|6]) #mode (0=14bits,1=16bits) <<4 | (2=8Hz , 6=100Hz) def AK8963_all(self,disableKalman=False): vals,tmt=self.I2CReadBulk(self.AK8963_ADDRESS,0x03,7) #6+1 . 1(ST2) should not have bit 4 (0x8) true. It's ideally 16 . overflow bit if tmt:return None ax,ay,az = struct.unpack('hhh',bytes(vals[:6])) if not vals[6]&0x08:return [ax,ay,az] else: return None ####### BMP280 ################### ## Ported from https://github.com/farmerkeith/BMP280-library/blob/master/farmerkeith_BMP280.cpp BMP280_ADDRESS = 118 BMP280_REG_CONTROL = 0xF4 BMP280_REG_RESULT = 0xF6 BMP280_oversampling = 0 _BMP280_PRESSURE_MIN_HPA = 0 _BMP280_PRESSURE_MAX_HPA = 1600 _BMP280_sea_level_pressure = 1013.25 #for calibration.. from circuitpython library def BMP280_init(self): b,tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0xD0 ,1) if tmt:return b = b[0] if b in [0x58,0x56,0x57]: print('BMP280. ID:',b) elif b==0x60: print('BME280 . includes humidity') else: print('ID unknown',b) # get calibration data b,tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0x88 ,24) #24 bytes containing calibration data coeff = list(struct.unpack(' self._BMP280_PRESSURE_MAX_HPA: return self._BMP280_PRESSURE_MAX_HPA return pressure def BMP280_all(self): #os = [0x34,0x74,0xb4,0xf4] #delays=[0.005,0.008,0.014,0.026] #self.I2CWriteBulk(self.BMP280_ADDRESS,[self.BMP280_REG_CONTROL,os[self.BMP280_oversampling] ]) #time.sleep(delays[self.BMP280_oversampling]) data,tmt = self.I2CReadBulk(self.BMP280_ADDRESS, 0xF7,6) if tmt:return None if None not in data: # Convert pressure and temperature data to 19-bits adc_p = (((data[0] & 0xFF) * 65536.) + ((data[1] & 0xFF) * 256.) + (data[2] & 0xF0)) / 16. adc_t = (((data[3] & 0xFF) * 65536.) + ((data[4] & 0xFF) * 256.) + (data[5] & 0xF0)) / 16. return [self._BMP280_calcPressure(adc_p,adc_t), self._BMP280_calcTemperature(adc_t), 0] ########## TCS34725 RGB sensor ########### _TCS34725_COMMAND_BIT = 0x80 _TCS34725_REGISTER_STATUS = 0x13 _TCS34725_REGISTER_CDATA = 0x14 _TCS34725_REGISTER_RDATA = 0x16 _TCS34725_REGISTER_GDATA = 0x18 _TCS34725_REGISTER_BDATA = 0x1a _TCS34725_REGISTER_ENABLE = 0x00 _TCS34725_REGISTER_ATIME = 0x01 _TCS34725_REGISTER_AILT = 0x04 _TCS34725_REGISTER_AIHT = 0x06 _TCS34725_REGISTER_ID = 0x12 _TCS34725_REGISTER_APERS = 0x0c _TCS34725_REGISTER_CONTROL = 0x0f _TCS34725_REGISTER_SENSORID = 0x12 _TCS34725_REGISTER_STATUS = 0x13 _TCS34725_ENABLE_AIEN = 0x10 _TCS34725_ENABLE_WEN = 0x08 _TCS34725_ENABLE_AEN = 0x02 _TCS34725_ENABLE_PON = 0x01 _GAINS = (1, 4, 16, 60) _CYCLES = (0, 1, 2, 3, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60) _INTEGRATION_TIME_THRESHOLD_LOW = 2.4 _INTEGRATION_TIME_THRESHOLD_HIGH = 614.4 TCS34725_ADDRESS = 41 def TCS34725_init(self): enable,tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_ENABLE,1) enable = enable[0] self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_REGISTER_ENABLE,enable|self._TCS34725_ENABLE_PON]) # time.sleep(0.003) self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_ENABLE,enable|self._TCS34725_ENABLE_PON | self._TCS34725_ENABLE_AEN| self._TCS34725_ENABLE_AIEN]) # self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_APERS,10]) self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_ATIME,256-40]) def TCS34725_gain(self,g): self.I2CWriteBulk(self.TCS34725_ADDRESS, [self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_CONTROL,g]) #Gain def TCS34725_all(self): R,tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_RDATA,2) G,tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_GDATA,2) B,tmt = self.I2CReadBulk(self.TCS34725_ADDRESS, self._TCS34725_COMMAND_BIT|self._TCS34725_REGISTER_BDATA,2) if tmt:return None return [R[0]|(R[1]<<8),G[0]|(G[1]<<8),B[0]|(B[1]<<8)] def TCS34725_range(self): pass ####### MS5611 Altimeter ################### MS5611_ADDRESS = 119 def MS5611_init(self): self.I2CWriteBulk(self.MS5611_ADDRESS, [0x1E]) # reset time.sleep(0.5) self._MS5611_calib = np.zeros(6) #calibration data. #pressure gain, offset . T coeff of P gain, offset. Ref temp. T coeff of T. all unsigned shorts. b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA2 ,2) if tmt:return self._MS5611_calib[0] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA4 ,2) self._MS5611_calib[1] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA6 ,2) self._MS5611_calib[2] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xA8 ,2) self._MS5611_calib[3] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xAA ,2) self._MS5611_calib[4] = struct.unpack('!H', bytes(b))[0] b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0xAC ,2) self._MS5611_calib[5] = struct.unpack('!H', bytes(b))[0] print('Calibration for MS5611:',self._MS5611_calib) def MS5611_all(self): self.I2CWriteBulk(self.MS5611_ADDRESS, [0x48]) # 0x48 Pressure conversion(OSR = 4096) command time.sleep(0.01) #10mS b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0x00 ,3) #data. D1 = b[0]*65536 + b[1]*256 + b[2] #msb2, msb1, lsb self.I2CWriteBulk(self.MS5611_ADDRESS, [0x58]) # 0x58 Temperature conversion(OSR = 4096) command time.sleep(0.01) b,tmt = self.I2CReadBulk(self.MS5611_ADDRESS, 0x00 ,3) #data. D2 = b[0]*65536 + b[1]*256 + b[2] #msb2, msb1, lsb dT = D2 - self._MS5611_calib[4] * 256 TEMP = 2000 + dT * self._MS5611_calib[5] / 8388608 OFF = self._MS5611_calib[1] * 65536 + (self._MS5611_calib[3] * dT) / 128 SENS = self._MS5611_calib[0] * 32768 + (self._MS5611_calib[2] * dT ) / 256 T2 = 0; OFF2 = 0; SENS2 = 0 if TEMP >= 2000 : T2 = 0 OFF2 = 0 SENS2 = 0 elif TEMP < 2000 : T2 = (dT * dT) / 2147483648 OFF2 = 5 * ((TEMP - 2000) * (TEMP - 2000)) / 2 SENS2 = 5 * ((TEMP - 2000) * (TEMP - 2000)) / 4 if TEMP < -1500 : OFF2 = OFF2 + 7 * ((TEMP + 1500) * (TEMP + 1500)) SENS2 = SENS2 + 11 * ((TEMP + 1500) * (TEMP + 1500)) / 2 TEMP = TEMP - T2 OFF = OFF - OFF2 SENS = SENS - SENS2 pressure = ((((D1 * SENS) / 2097152) - OFF) / 32768.0) / 100.0 cTemp = TEMP / 100.0 return [pressure,cTemp,0] ### INA3221 3 channel , high side current sensor ############# INA3221_ADDRESS = 0x41 _INA3221_REG_CONFIG = 0x0 _INA3221_SHUNT_RESISTOR_VALUE = 0.1 _INA3221_REG_SHUNTVOLTAGE = 0x01 _INA3221_REG_BUSVOLTAGE = 0x02 def INA3221_init(self): self.I2CWriteBulk(self.INA3221_ADDRESS,[self._INA3221_REG_CONFIG, 0b01110101, 0b00100111 ]) #cont shunt. def INA3221_all(self): I = [0.,0.,0.] b,tmt = self.I2CReadBulk(self.INA3221_ADDRESS,self._INA3221_REG_SHUNTVOLTAGE , 2) if tmt:return None b[1]&=0xF8; I[0] = struct.unpack('!h',bytes(b))[0] b,tmt = self.I2CReadBulk(self.INA3221_ADDRESS,self._INA3221_REG_SHUNTVOLTAGE +2 , 2) if tmt:return None b[1]&=0xF8; I[1] = struct.unpack('!h',bytes(b))[0] b,tmt = self.I2CReadBulk(self.INA3221_ADDRESS,self._INA3221_REG_SHUNTVOLTAGE +4 , 2) if tmt:return None b[1]&=0xF8; I[2] = struct.unpack('!h',bytes(b))[0] return [0.005*I[0]/self._INA3221_SHUNT_RESISTOR_VALUE,0.005*I[1]/self._INA3221_SHUNT_RESISTOR_VALUE,0.005*I[2]/self._INA3221_SHUNT_RESISTOR_VALUE] ### SHT21 HUMIDITY TEMPERATURE SENSOR ############# SHT21_ADDRESS = 0x41 _SHT21_TEMP = 0xf3 _SHT21_HUM = 0xf5 _SHT21_RESET = 0xFE _INA3221_REG_SHUNTVOLTAGE = 0x01 _INA3221_REG_BUSVOLTAGE = 0x02 def SHT21_init(self): self.I2CWriteBulk(self.SHT21_ADDRESS,[self._SHT21_RESET ]) #reset time.sleep(0.1) def SHT21_all(self): self.I2CWriteBulk(self.SHT21_ADDRESS,[self._SHT21_TEMP ]) time.sleep(.1) self.startI2C() self.writeI2C((self.SHT21_ADDRESS<<1)|1) #Read b=[] for a in range(2):b.append(self.readI2C(1) ) b.append(self.readI2C(0)) self.stopI2C() temperature,checksum = struct.unpack('>HB',bytes(b)) return [temperature* 175.72 / 65536.0 - 46.85,0] ####### TSL2561 LIGHT SENSOR ########### TSL_GAIN = 0x00 # 0x00=1x , 0x01 = 16x TSL_TIMING = 0x00 # 0x00=3 mS , 0x01 = 101 mS, 0x02 = 402mS def TSL2561_init(self): self.I2CWriteBulk(0x39,[0x80 , 0x03 ]) #poweron self.I2CWriteBulk(0x39,[0x80 | 0x01, self.TSL_GAIN|self.TSL_TIMING ]) return self.TSL2561_all() def TSL2561_gain(self,gain): self.TSL_GAIN = gain<<4 self.TSL2561_config(self.TSL_GAIN,self.TSL_TIMING) def TSL2561_timing(self,timing): self.TSL_TIMING = timing self.TSL2561_config(self.TSL_GAIN,self.TSL_TIMING) def TSL2561_rate(self,timing): self.TSL_TIMING = timing self.TSL2561_config(self.TSL_GAIN,self.TSL_TIMING) def TSL2561_config(self,gain,timing): self.I2CWriteBulk(0x39,[0x80 | 0x01, gain|timing]) #Timing register 0x01. gain[1x,16x] | timing[13mS,100mS,400mS] def TSL2561_all(self): ''' returns a 2 element list. total,IR returns None if communication timed out with I2C sensor ''' b,tmt = self.I2CReadBulk(0x39,0x80 | 0x20 | 0x0C ,4) if tmt:return None if None not in b: return [ (b[x*2+1]<<8)|b[x*2] for x in range(2) ] #total, IR def MLX90614_init(self): pass def MLX90614_all(self): ''' return a single element list. None if failed ''' vals,tmt = self.I2CReadBulk(0x5A, 0x07 ,3) if tmt:return None if vals: if len(vals)==3: return [((((vals[1]&0x007f)<<8)+vals[0])*0.02)-0.01 - 273.15] else: return None else: return None MCP5725_ADDRESS = 0x60 def MCP4725_init(self): pass def MCP4725_set(self,val): ''' Set the DAC value. 0 - 4095 ''' self.I2CWriteBulk(self.MCP5725_ADDRESS, [0x40,(val>>4)&0xFF,(val&0xF)<<4]) ####################### HMC5883L MAGNETOMETER ############### HMC5883L_ADDRESS = 0x1E HMC_CONFA=0x00 HMC_CONFB=0x01 HMC_MODE=0x02 HMC_STATUS=0x09 #--------CONFA register bits. 0x00----------- HMCSamplesToAverage=0 HMCSamplesToAverage_choices=[1,2,4,8] HMCDataOutputRate=6 HMCDataOutputRate_choices=[0.75,1.5,3,7.5,15,30,75] HMCMeasurementConf=0 #--------CONFB register bits. 0x01----------- HMCGainValue = 7 #least sensitive HMCGain_choices = [8,7,6,5,4,3,2,1] HMCGainScaling=[1370.,1090.,820.,660.,440.,390.,330.,230.] def HMC5883L_init(self): self.__writeHMCCONFA__() self.__writeHMCCONFB__() self.I2CWriteBulk(self.HMC5883L_ADDRESS,[self.HMC_MODE,0]) #enable continuous measurement mode def __writeHMCCONFB__(self): self.I2CWriteBulk(self.HMC5883L_ADDRESS,[self.HMC_CONFB,self.HMCGainValue<<5]) #set gain def __writeHMCCONFA__(self): self.I2CWriteBulk(self.HMC5883L_ADDRESS,[self.HMC_CONFA,(self.HMCDataOutputRate<<2)|(self.HMCSamplesToAverage<<5)|(self.HMCMeasurementConf)]) def HMC5883L_getVals(self,addr,bytes): vals = self.I2C.readBulk(self.ADDRESS,addr,bytes) return vals def HMC5883L_all(self): vals=self.HMC5883L_getVals(0x03,6) if vals: if len(vals)==6: return [np.int16(vals[a*2]<<8|vals[a*2+1])/self.HMCGainScaling[self.HMCGainValue] for a in range(3)] else: return False else: return False PCA9685_address = 64 def PCA9685_init(self): prescale_val = int((25000000.0 / 4096 / 60.) - 1) # default clock at 25MHz #self.I2CWriteBulk(self.PCA9685_address, [0x00,0x10]) #MODE 1 , Sleep print('clock set to,',prescale_val) self.I2CWriteBulk(self.PCA9685_address, [0xFE,prescale_val]) #PRESCALE , prescale value self.I2CWriteBulk(self.PCA9685_address, [0x00,0x80]) #MODE 1 , restart self.I2CWriteBulk(self.PCA9685_address, [0x01,0x04]) #MODE 2 , Totem Pole pass CH0 = 0x6 #LED0 start register CH0_ON_L = 0x6 #channel0 output and brightness control byte 0 CH0_ON_H = 0x7 #channel0 output and brightness control byte 1 CH0_OFF_L = 0x8 #channel0 output and brightness control byte 2 CH0_OFF_H = 0x9 #channel0 output and brightness control byte 3 CHAN_WIDTH = 4 def PCA9685_set(self,chan,angle): ''' chan: 1-16 Set the servo angle for SG90: angle(0 - 180) ''' Min = 180 Max = 650 val = int((( Max-Min ) * ( angle/180. ))+Min) print(chan,angle,val) self.I2CWriteBulk(self.PCA9685_address, [self.CH0_ON_L + self.CHAN_WIDTH * (chan - 1),0]) # self.I2CWriteBulk(self.PCA9685_address, [self.CH0_ON_H + self.CHAN_WIDTH * (chan - 1),0]) # Turn on immediately. At 0. self.I2CWriteBulk(self.PCA9685_address, [self.CH0_OFF_L + self.CHAN_WIDTH * (chan - 1),val&0xFF]) #Turn off after val width 0-4095 self.I2CWriteBulk(self.PCA9685_address, [self.CH0_OFF_H + self.CHAN_WIDTH * (chan - 1),(val>>8)&0xFF]) ## ADS1115 REG_POINTER_MASK = 0x3 REG_POINTER_CONVERT = 0 REG_POINTER_CONFIG = 1 REG_POINTER_LOWTHRESH=2 REG_POINTER_HITHRESH =3 REG_CONFIG_OS_MASK =0x8000 REG_CONFIG_OS_SINGLE =0x8000 REG_CONFIG_OS_BUSY =0x0000 REG_CONFIG_OS_NOTBUSY =0x8000 REG_CONFIG_MUX_MASK =0x7000 REG_CONFIG_MUX_DIFF_0_1 =0x0000 # Differential P = AIN0, N = AIN1 =default) REG_CONFIG_MUX_DIFF_0_3 =0x1000 # Differential P = AIN0, N = AIN3 REG_CONFIG_MUX_DIFF_1_3 =0x2000 # Differential P = AIN1, N = AIN3 REG_CONFIG_MUX_DIFF_2_3 =0x3000 # Differential P = AIN2, N = AIN3 REG_CONFIG_MUX_SINGLE_0 =0x4000 # Single-ended AIN0 REG_CONFIG_MUX_SINGLE_1 =0x5000 # Single-ended AIN1 REG_CONFIG_MUX_SINGLE_2 =0x6000 # Single-ended AIN2 REG_CONFIG_MUX_SINGLE_3 =0x7000 # Single-ended AIN3 REG_CONFIG_PGA_MASK =0x0E00 #bits 11:9 REG_CONFIG_PGA_6_144V =(0<<9) # +/-6.144V range = Gain 2/3 REG_CONFIG_PGA_4_096V =(1<<9) # +/-4.096V range = Gain 1 REG_CONFIG_PGA_2_048V =(2<<9) # +/-2.048V range = Gain 2 =default) REG_CONFIG_PGA_1_024V =(3<<9) # +/-1.024V range = Gain 4 REG_CONFIG_PGA_0_512V =(4<<9) # +/-0.512V range = Gain 8 REG_CONFIG_PGA_0_256V =(5<<9) # +/-0.256V range = Gain 16 REG_CONFIG_MODE_MASK =0x0100 #bit 8 REG_CONFIG_MODE_CONTIN =(0<<8) # Continuous conversion mode REG_CONFIG_MODE_SINGLE =(1<<8) # Power-down single-shot mode =default) REG_CONFIG_DR_MASK =0x00E0 REG_CONFIG_DR_8SPS =(0<<5) #8 SPS REG_CONFIG_DR_16SPS =(1<<5) #16 SPS REG_CONFIG_DR_32SPS =(2<<5) #32 SPS REG_CONFIG_DR_64SPS =(3<<5) #64 SPS REG_CONFIG_DR_128SPS =(4<<5) #128 SPS REG_CONFIG_DR_250SPS =(5<<5) #260 SPS REG_CONFIG_DR_475SPS =(6<<5) #475 SPS REG_CONFIG_DR_860SPS =(7<<5) #860 SPS REG_CONFIG_CMODE_MASK =0x0010 REG_CONFIG_CMODE_TRAD =0x0000 REG_CONFIG_CMODE_WINDOW =0x0010 REG_CONFIG_CPOL_MASK =0x0008 REG_CONFIG_CPOL_ACTVLOW =0x0000 REG_CONFIG_CPOL_ACTVHI =0x0008 REG_CONFIG_CLAT_MASK =0x0004 REG_CONFIG_CLAT_NONLAT =0x0000 REG_CONFIG_CLAT_LATCH =0x0004 REG_CONFIG_CQUE_MASK =0x0003 REG_CONFIG_CQUE_1CONV =0x0000 REG_CONFIG_CQUE_2CONV =0x0001 REG_CONFIG_CQUE_4CONV =0x0002 REG_CONFIG_CQUE_NONE =0x0003 gains = OrderedDict([('GAIN_TWOTHIRDS',REG_CONFIG_PGA_6_144V),('GAIN_ONE',REG_CONFIG_PGA_4_096V),('GAIN_TWO',REG_CONFIG_PGA_2_048V),('GAIN_FOUR',REG_CONFIG_PGA_1_024V),('GAIN_EIGHT',REG_CONFIG_PGA_0_512V),('GAIN_SIXTEEN',REG_CONFIG_PGA_0_256V)]) gain_scaling = OrderedDict([('GAIN_TWOTHIRDS',0.1875),('GAIN_ONE',0.125),('GAIN_TWO',0.0625),('GAIN_FOUR',0.03125),('GAIN_EIGHT',0.015625),('GAIN_SIXTEEN',0.0078125)]) type_selection = OrderedDict([('UNI_0',0),('UNI_1',1),('UNI_2',2),('UNI_3',3),('DIFF_01','01'),('DIFF_23','23')]) sdr_selection = OrderedDict([(8,REG_CONFIG_DR_8SPS),(16,REG_CONFIG_DR_16SPS),(32,REG_CONFIG_DR_32SPS),(64,REG_CONFIG_DR_64SPS),(128,REG_CONFIG_DR_128SPS),(250,REG_CONFIG_DR_250SPS),(475,REG_CONFIG_DR_475SPS),(860,REG_CONFIG_DR_860SPS)]) #sampling data rate conversion_time = [8,16,32,64,128,250,460,860] ADS1115_DATARATE = 5 #250SPS [ 8, 16, 32, 64, 128, 250, 475, 860 ] ADS1115_GAIN = REG_CONFIG_PGA_4_096V # +/-4.096V range = Gain 1 . [+-6, +-4, +-2, +-1, +-0.5, +- 0.25] ADS1115_CHANNEL = REG_CONFIG_MUX_SINGLE_0 # ref: type_selection TSL_TIMING = 0x00 # 0x00=3 mS , 0x01 = 101 mS, 0x02 = 402mS ADS1115_ADDRESS = 0x48 def ADS1115_init(self): self.I2CWriteBulk(0x39,[0x80 , 0x03 ]) #poweron def ADS1115_channel(self): pass def ADS1115_read(self): ''' returns a voltage from ADS1115 channel selected using ADS1115_channel. default UNI_0 (Unipolar from channel 0) ''' if chan<=3: config = (self.REG_CONFIG_CQUE_NONE # Disable the comparator (default val) |self.REG_CONFIG_CLAT_NONLAT # Non-latching (default val) |self.REG_CONFIG_CPOL_ACTVLOW #Alert/Rdy active low (default val) |self.REG_CONFIG_CMODE_TRAD # Traditional comparator (default val) |(self.ADS1115_DATARATE<<5) # 1600 samples per second (default) |(self.REG_CONFIG_MODE_SINGLE) # Single-shot mode (default) |self.ADS1115_GAIN) if self.ADS1115_CHANNEL == 0 : config |= self.REG_CONFIG_MUX_SINGLE_0 elif self.ADS1115_CHANNEL == 1 : config |= self.REG_CONFIG_MUX_SINGLE_1 elif self.ADS1115_CHANNEL == 2 : config |= self.REG_CONFIG_MUX_SINGLE_2 elif self.ADS1115_CHANNEL == 3 : config |= self.REG_CONFIG_MUX_SINGLE_3 #Set 'start single-conversion' bit config |= self.REG_CONFIG_OS_SINGLE self.I2CWriteBulk(self.ADS1115_ADDRESS,[self.REG_POINTER_CONFIG,(config>>8)&0xFF,config&0xFF]) time.sleep(1./self.rate+.002) #convert to mS to S return self.readRegister(self.REG_POINTER_CONVERT)*self.gain_scaling[self.gain] b,tmt = self.I2CReadBulk(0x68, 0x3B ,14) if tmt:return None if None not in b: return [ np.int16((b[x*2]<<8)|b[x*2+1]) for x in range(7) ] #Ax,Ay,Az, Temp, Gx, Gy,Gz if __name__ == '__main__': a=connect(autoscan=True) print ('version' , a.version) print ('------------') if not a.connected: sys.exit(1) time.sleep(0.01) a.setReg('DDRC',3) a.setReg('PORTC',2) time.sleep(1) a.setReg('PORTC',3) a.setReg('DDRC',0) print(a.I2CScan()) ''' a.PCA9685_init() a.PCA9685_set(1,650) for x in range(180): a.PCA9685_set(1,x) time.sleep(0.01) a.TSL2561_init() s=time.time() for x in range(1000): print(a.TSL2561_all()) print(time.time()-s) a.MPU6050_init() s=time.time() for x in range(1000): print(a.MPU6050_all()[0]) print(time.time()-s) ''' KuttyPy-GUI-2.3/KuttyPyNano.py000066400000000000000000000651101456261524100162610ustar00rootroot00000000000000''' ''' #!/usr/bin/python3 import os,sys,time,re,traceback,platform,inspect from utilities.Qt import QtGui, QtCore, QtWidgets import KuttyPyLibNano from utilities.templates import ui_layoutnano as layout from utilities import dio,uploader from utilities import REGISTERS_NANO as REGISTERS import constants from functools import partial from collections import OrderedDict class myTimer(): def __init__(self,interval): self.interval = interval self.reset() def reset(self): self.timeout = time.time()+self.interval def ready(self): T = time.time() dt = T - self.timeout if dt>0: #timeout is ahead of current time #if self.interval>5:print('reset',self.timeout,dt) self.timeout = T - dt%self.interval + self.interval #if self.interval>5:print(self.timeout) return True return False def progress(self): return 100*(self.interval - self.timeout + time.time())/(self.interval) class AppWindow(QtWidgets.QMainWindow, layout.Ui_MainWindow): p=None logThis = QtCore.pyqtSignal(str) logThisPlain = QtCore.pyqtSignal(bytes) serialGaugeSignal = QtCore.pyqtSignal(int) def __init__(self, parent=None,**kwargs): super(AppWindow, self).__init__(parent) self.setupUi(self) self.VERSION = REGISTERS.VERSIONNUM self.SPECIALS = REGISTERS.SPECIALS self.REGISTERS = REGISTERS.REGISTERS self.EXAMPLES_DIR = REGISTERS.EXAMPLES self.ADC_PINS = REGISTERS.ADC self.docks = [self.leftdock,self.rightdock] self.sensorList = [] self.controllerList = [] self.monitoring = True self.logRegisters = True self.userHexRunning = False self.uploadingHex = False self.autoUpdateUserRegisters = False self.CFile = None #'~/kuttyPy.c' self.ipy = None self.setTheme("material") examples = [a for a in os.listdir(os.path.join(path["examples"],self.EXAMPLES_DIR)) if ('.py' in a) and a is not 'kuttyPy.py'] #.py files except the library self.exampleList.addItems(examples) blinkindex = self.exampleList.findText('blink.py') if blinkindex!=-1: #default example. blink.py present in examples directory self.exampleList.setCurrentIndex(blinkindex) ######## PYTHON CODE self.codeThread = QtCore.QThread() self.codeEval = self.codeObject(self.REGISTERS) self.codeEval.moveToThread(self.codeThread) self.codeEval.finished.connect(self.codeThread.quit) self.codeEval.logThis.connect(self.appendLog) #Connect to the log window self.logThis.connect(self.appendLog) #Connect to the log window self.logThisPlain.connect(self.appendLogPlain) #Connect to the log window self.serialGaugeSignal.connect(self.setSerialgauge) self.codeThread.started.connect(self.codeEval.execute) self.codeThread.finished.connect(self.codeFinished) ######### C CODE UPLOADER self.uploadThread = QtCore.QThread() self.UploadObject = self.uploadObject() self.UploadObject.moveToThread(self.uploadThread) self.UploadObject.finished.connect(self.uploadThread.quit) self.UploadObject.logThis.connect(self.appendLog) #Connect to the log window self.UploadObject.logThisPlain.connect(self.appendLogPlain) #Connect to the log window. add plain text self.logThis.connect(self.appendLog) #Connect to the log window self.uploadThread.started.connect(self.UploadObject.execute) self.uploadThread.finished.connect(self.codeFinished) self.commandQ = [] self.btns={} self.registers = [] self.addPins() self.statusBar = self.statusBar() self.makeBottomMenu() global app self.initializeCommunications() self.pending = { 'status':myTimer(constants.STATUS_UPDATE_INTERVAL), 'update':myTimer(constants.AUTOUPDATE_INTERVAL), } serialgaugeoptions = {'name':'Serial Monitor', 'init':print, 'read':None, 'fields':['Value'], 'min':[0], 'max':[255]} self.serialGauge = dio.DIOSENSOR(self,serialgaugeoptions) self.startTime = time.time() self.timer = QtCore.QTimer() self.timer.timeout.connect(self.updateEverything) self.timer.start(20) #Auto-Detector self.shortlist=KuttyPyLibNano.getFreePorts() def newRegister(self): reg = dio.REGEDIT(self.commandQ) #self.registerLayout.addWidget(reg) #self.registers.append(reg) #TODO: Convert layout to listwidget to enable re-ordering regItem = QtWidgets.QListWidgetItem() regItem.setSizeHint(QtCore.QSize(200,40)) self.registerList.addItem(regItem) self.registerList.setItemWidget(regItem,reg) self.registers.append(regItem) def addPins(self): for a in ['D','B']: self.btns[a] = dio.REGVALS(a) self.leftlayout.addWidget(self.btns[a]) self.btns['C'] = dio.REGVALS('C') self.rightlayout.addWidget(self.btns['C']) for name in ['PD1','PD0','PC6','GND','PD2','PD3','PD4','PD5','PD6','PD7','PB0','PB1','PB2','PB3','PB4']: #left dock checkbox = dio.widget(name,self.commandQ,extra = self.SPECIALS.get(name,'')) self.leftlayout.addWidget(checkbox) self.btns[name] = checkbox for name in ['VIN','GND','PC6','5V','ADC7','ADC6','SCL','SDA','PC3','PC2','PC1','PC0','AREF','3V3','PB5']: #left dock checkbox = dio.widget(name,self.commandQ,extra = self.SPECIALS.get(name,'')) self.rightlayout.addWidget(checkbox) self.btns[name] = checkbox def tabChanged(self,index): if index != 0 : #examples/editor tab. disable monitoring self.monitoring = False for a in self.docks: a.hide() else: #Playground . enable monitoring and control. self.monitoring = True self.autoRefreshUserRegisters.setChecked(False) self.userRegistersAutoRefresh(False) for a in self.docks: a.show() ################USER CODE SECTION#################### class codeObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) code = '' def __init__(self,REGISTERS): super(AppWindow.codeObject, self).__init__() self.PORTMAP = {v: k for k, v in REGISTERS.items()} #Lookup port name based on number self.compiled = '' self.SR = None self.GR = None self.evalGlobals = {} self.evalGlobals['getReg'] = self.getReg self.evalGlobals['setReg'] = self.setReg self.evalGlobals['print'] = self.printer def setCode(self,code,**kwargs): try: self.compiled = compile(code.encode(), '', mode='exec') except SyntaxError as err: error_class = err.__class__.__name__ detail = err.args[0] line_number = err.lineno return '''%s at line %d : %s''' % (error_class, line_number, detail) except Exception as err: error_class = err.__class__.__name__ detail = err.args[0] cl, exc, tb = sys.exc_info() line_number = traceback.extract_tb(tb)[-1][1] return '''%s at line %d: %s''' % (error_class, line_number, detail) self.SR = kwargs.get('setReg') self.GR = kwargs.get('getReg') self.evalGlobals = kwargs self.evalGlobals['getReg'] = self.getReg #Overwrite these three. They will be wrapped. self.evalGlobals['setReg'] = self.setReg self.evalGlobals['print'] = self.printer return '' def printer(self,*args): self.logThis.emit('''%s'''%(' '.join([str(a) for a in args]))) def setReg(self,reg,value): html=u'''
W\u2193{0:s}\t{1:d}\t0x{1:02x} / 0b{1:08b}
'''.format(self.PORTMAP.get(reg,''),value) self.logThis.emit(html) self.SR(reg,value) def getReg(self,reg): value = self.GR(reg) html=u'''
R\u2191{0:s}\t{1:d}\t0x{1:02x} / 0b{1:08b}
'''.format(self.PORTMAP.get(reg,''),value) self.logThis.emit(html) return value def execute(self): #old = sys.stdout #olde = sys.stderr #sys.stdout = self.toLog(self.logThis) #sys.stderr = self.toLog(self.logThis) try: exec(self.compiled,{},self.evalGlobals) except SyntaxError as err: error_class = err.__class__.__name__ detail = err.args[0] line_number = err.lineno self.logThis.emit('''%s at line %d : %s''' % (error_class, line_number, detail)) except Exception as err: error_class = err.__class__.__name__ detail = err.args[0] cl, exc, tb = sys.exc_info() line_number = traceback.extract_tb(tb)[-1][1] self.logThis.emit('''%s at line %d: %s''' % (error_class, line_number, detail)) #sys.stdout = old #sys.stderr = olde self.logThis.emit("Finished executing user code") self.finished.emit() def runCode(self): #if self.p: # try: # self.p.fd.read() #Clear junk # self.p.fd.close() # except:pass if self.codeThread.isRunning(): print('one code is already running') return self.log.clear() #clear the log window self.log.setText('''----------User Code Started-----------''') kwargs = {} for a in dir(self.p): attr = getattr(self.p, a) if inspect.ismethod(attr) and a[:2]!='__': kwargs[a] = attr compilemsg = self.codeEval.setCode('{0:s}'.format(self.userCode.toPlainText()),**kwargs) if len(compilemsg): self.log.append(compilemsg) return self.codeThread.start() self.userCode.setStyleSheet("border: 3px dashed #53ffff;") self.tabs.setTabEnabled(0,False) def codeFinished(self): print('finished') self.tabs.setTabEnabled(0,True) self.userCode.setStyleSheet("") self.uploadingHex = False def abort(self): if self.codeThread.isRunning(): self.log.append('''----------Kill Signal(Doesn't work yet. Restart the application)-----------''') self.codeThread.quit() self.codeThread.terminate() del self.codeThread self.codeThread = QtCore.QThread() self.codeEval = self.codeObject(self.REGISTERS) self.codeEval.moveToThread(self.codeThread) self.codeEval.finished.connect(self.codeThread.quit) self.codeEval.logThis.connect(self.appendLog) #Connect to the log window self.codeThread.started.connect(self.codeEval.execute) self.codeThread.finished.connect(self.codeFinished) def getReg(self,reg,record = True): val = self.p.getReg(reg) if record: self.updatedRegs[reg] = [0,val] return val def setReg(self,reg,val,record = True): self.p.setReg(reg,val) if record: self.updatedRegs[reg] = [1,val] return val def appendLog(self,txt): self.log.append(txt) def appendLogPlain(self,txt): self.log.moveCursor(QtGui.QTextCursor.End) self.log.insertPlainText(txt.decode('ascii')) def setSerialgauge(self,val): self.serialGauge.setValue([val]) def genLog(self): html=''''''%(time.ctime()) #html+=''' #''' for a in self.updatedRegs: row = self.updatedRegs[a] html+=u''' '''.format(u'W \u2193' if row[0] else u'R \u2191',a,row[1]) html+="
%s
R/WREGISTERValueHex/Binary
{0:s} {1:s} {2:d} 0b{2:08b} | 0x{2:02x}
" self.log.setHtml(html) def userRegistersAutoRefresh(self,state): self.autoUpdateUserRegisters = state def updateEverything(self): self.locateDevices() if not self.checkConnectionStatus():return #KuttyPy monitor has handed over control to native code. act as serial monitor/ debug window if self.uploadingHex: return if self.userHexRunning: t = self.p.fd.read(self.p.fd.in_waiting) if len(t): self.serialGaugeSignal.emit(t[0]) self.logThisPlain.emit(t) return #self.setTheme('material') if self.codeThread.isRunning(): return if self.autoUpdateUserRegisters: for a in range(self.registerList.count()): self.registerList.itemWidget(self.registerList.item(a)).execute() while len(self.commandQ): if not self.centralWidget().isEnabled(): return a = self.commandQ.pop(0) if a[0] == 'DSTATE': #Digital Out ['DSTATE','Pxx',state] pname = 'PORT'+a[1][1].upper() bit = int(a[1][2]) reg = self.getReg(pname) reg &=~ (1<>a)&1) if name in self.ADC_PINS: #ADC if btn.currentPage == 2: #ADC Page displayed self.commandQ.append(['ADC',btn.ADMUX,btn,btn.logstate]) elif type(btn)==dio.DIOCNTR and btn.currentPage==2: # CNTR self.commandQ.append(['CNTR1',btn.slider]) def newStepperController(self): if self.p.connected: dialog = dio.DIOSTEPPER(self,total=200,device=self.p) dialog.launch() self.sensorList.append([dialog,None]) ############ I2C SENSORS ################# def I2CScan(self): if self.p.connected: x = self.p.I2CScan() print('Responses from: ',x) for a in self.sensorList: a[0].setParent(None) a[1].setParent(None) self.sensorList = [] for a in self.controllerList: a[0].setParent(None) a[1].setParent(None) self.controllerList = [] for a in x: s = self.p.sensors.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOSENSOR(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.sensorList.append([dialog,btn]) continue s = self.p.controllers.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOCONTROL(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.controllerList.append([dialog,btn]) continue s = self.p.special.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOROBOT(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.controllerList.append([dialog,btn]) continue def loadExample(self,filename): self.userCode.setPlainText(open(os.path.join(path["examples"],self.EXAMPLES_DIR,filename), "r").read()) ########################### UPLOAD HEX FILE ####################### class uploadObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) logThisPlain = QtCore.pyqtSignal(bytes) fname = '' p = None def __init__(self): super(AppWindow.uploadObject, self).__init__() def config(self,mode,p,fname): self.p = p self.fname = fname self.mode = mode def execute(self): if self.mode == 'compileupload': try: import subprocess fname = '.'.join(self.fname.split('.')[:-1]) cmd = 'avr-gcc -Wall -O2 -mmcu=%s -o "%s" "%s"' %('atmega328p',fname,self.fname) self.logThis.emit('''Compiling for Atmega328p (Nano)''') print(cmd) res = subprocess.getstatusoutput(cmd) if res[0] != 0: self.logThis.emit('''Compile Error: %s'''%res[1]) self.finished.emit() return else: self.logThis.emit('''%s
'''%res[1]) cmd = 'avr-objcopy -j .text -j .data -O ihex "%s" "%s.hex"' %(fname,fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit('''%s
'''%res[1]) cmd = 'avr-objdump -S "%s" > "%s.lst"'%(fname,fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit('''%s
'''%res[1]) if self.fname[-2:] in ['.c','.C']: self.fname = self.fname[:-2]+'.hex' #Replace .c with .hex self.mode = 'upload' self.logThis.emit('''Generated Hex File''') self.logThis.emit('''Finished Compiling: Generated Hex File''') except Exception as err: self.logThis.emit('''Failed to Compile:%s'''%str(err)) if self.p.connected: if self.mode == 'upload': try: self.p.fd.setRTS(0);time.sleep(0.01);self.p.fd.setRTS(1);time.sleep(0.4) dude = uploader.Uploader(self.p.fd, hexfile=self.fname,logger = self.logThis) dude.program() dude.verify() self.p.fd.setRTS(0);time.sleep(0.01);self.p.fd.setRTS(1);time.sleep(0.2) self.p.get_version() self.logThis.emit('''Finished upload''') except Exception as err: self.logThis.emit('''Failed to upload''') self.finished.emit() def uploadHex(self): filename = QtWidgets.QFileDialog.getOpenFileName(self," Open a hex file to upload to your KuttyPy", "", "Hex Files (*.hex)") if len(filename[0]): #self.userCode.setStyleSheet("border: 3px dashed #53ffff;") #self.tabs.setTabEnabled(0,False) self.uploadingHex = True self.log.clear() self.log.setText('''-- Uploading Code --
''') self.UploadObject.config('upload',self.p,filename[0]) self.uploadThread.start() def openFile(self): filename = QtWidgets.QFileDialog.getOpenFileName(self," Open a C file to edit", path["examples"], "C Files (*.c *.C)") if len(filename[0]): self.filenameLabel.setText(filename[0]) self.CFile = filename[0] self.log.clear() self.log.setText('''-- Opened File: %s --
'''%filename[0]) if 'inux' in platform.system(): #Linux based system os.system('%s "%s"' % ('xdg-open', filename[0])) else: os.system('%s "%s"' % ('open', filename[0])) def compileAndUpload(self): if self.CFile: self.uploadingHex = True self.log.clear() self.log.setText('''-- Compiling and Uploading Code --
''') self.UploadObject.config('compileupload',self.p,self.CFile) self.uploadThread.start() ############################## def setTheme(self,theme): self.setStyleSheet("") self.setStyleSheet(open(os.path.join(path["themes"],theme+".qss"), "r").read()) def initializeCommunications(self,port=False): if self.p: try:self.p.fd.close() except:pass if port: self.p = KuttyPyLibNano.connect(port = port) else: self.p = KuttyPyLibNano.connect(autoscan=True) if self.p.connected: self.userApplication.setChecked(False) self.setWindowTitle('KuttyPy Interactive Console [{0:s}]'.format(self.p.portname)) self.updatedRegs=OrderedDict() self.currentRegister = 0 self.getRegs=[ ('PINB',self.updateInputs), ('PINC',self.updateInputs), ('PIND',self.updateInputs), ] else: self.setWindowTitle('KuttyPy Interactive Console [ Hardware not detected ]') def jumpToApplication(self,state): if self.p: if state: self.userHexRunning=True self.p.fd.write(b'j') #Skip to application (Bootloader resets) for a in self.docks: a.setEnabled(False) self.tabs.setEnabled(False) self.log.clear() self.log.setText('''-- Serial Port Monitor --
''') self.serialGauge.show() else: self.p.fd.setRTS(0) #Trigger a reset time.sleep(0.01) self.p.fd.setRTS(1) time.sleep(0.1) while self.p.fd.in_waiting: self.p.fd.read() self.p.get_version() for a in self.docks: a.setEnabled(True) self.userHexRunning=False self.tabs.setEnabled(True) self.serialGauge.hide() else: if self.isChecked(): self.setChecked(False) def makeBottomMenu(self): try:self.pushbutton.setParent(None) except:pass self.pushbutton = QtWidgets.QPushButton('Menu') self.pushbutton.setStyleSheet("height: 13px;padding:3px;color: #FFFFFF;") menu = QtWidgets.QMenu() menu.addAction('Save Window as Svg', self.exportSvg) menu.addAction('Open Stepper Controller', self.newStepperController) #Theme self.themeAction = QtWidgets.QWidgetAction(menu) themes = [a.split('.qss')[0] for a in os.listdir(path["themes"]) if '.qss' in a] self.themeBox = QtWidgets.QComboBox(); self.themeBox.addItems(themes) self.themeBox.currentIndexChanged['QString'].connect(self.setTheme) self.themeAction.setDefaultWidget(self.themeBox) menu.addAction(self.themeAction) self.pushbutton.setMenu(menu) self.userApplication = QtWidgets.QCheckBox("User App"); self.userApplication.toggled['bool'].connect(self.jumpToApplication) self.statusBar.addPermanentWidget(self.userApplication) self.hexUploadButton = QtWidgets.QPushButton("Upload Hex"); self.hexUploadButton.clicked.connect(self.uploadHex) self.statusBar.addPermanentWidget(self.hexUploadButton) self.speedbutton = QtWidgets.QComboBox(); self.speedbutton.addItems(['Slow','Fast','Ultra']); self.speedbutton.setCurrentIndex(1); self.speedbutton.currentIndexChanged['int'].connect(self.setSpeed) self.statusBar.addPermanentWidget(self.speedbutton) self.statusBar.addPermanentWidget(self.pushbutton) def setSpeed(self,index): self.timer.setInterval([100,20,5][index]) def locateDevices(self): try:L = KuttyPyLibNano.getFreePorts(self.p.portname) except Exception as e:print(e) total = len(L) menuChanged = False if L != self.shortlist: menuChanged = True if self.p.connected: if self.p.portname not in L: self.setWindowTitle('Error : Device Disconnected') QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device Disconnected. Please check the connections') try: self.p.fd.close() self.p.portname = None except:pass self.p.connected = False self.setWindowTitle('KuttyPy Interactive Console [ Hardware not detected ]') elif True in L.values(): reply = QtWidgets.QMessageBox.question(self, 'Connection', 'Device Available. Connect?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: self.initializeCommunications() #update the shortlist self.shortlist=L def checkConnectionStatus(self,dialog=False): if self.p.connected:return True else: if dialog: QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device not connected. Please connect a KuttyPy to the USB port') return False def updateStatus(self): if not self.checkConnectionStatus(): self.countLabel.setText('Not Connected') return try: state,cnt = self.p.getStatus() self.currentState = state self.countLabel.setText('%s: %d'%("Running" if state else "Paused",cnt)) except: self.countLabel.setText('Disconnect!') self.p.fd.close() ######## WINDOW EXPORT SVG def exportSvg(self): from utilities.Qt import QtSvg path, _filter = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File', '~/') if path: generator = QtSvg.QSvgGenerator() generator.setFileName(path) target_rect = QtCore.QRectF(0, 0, 800, 600) generator.setSize(target_rect.size().toSize())#self.size()) generator.setViewBox(self.rect()) generator.setTitle("Your title") generator.setDescription("some description") p = QtGui.QPainter() p.begin(generator) self.render(p) p.end() def ipython(self): #Experimental feature. Import ipython and launch console if not self.p.connected: return from utilities import ipy if not self.ipy: self.ipy = ipy.AppWindow(self,kp = self.p) self.ipy.show() self.ipy.updateDevice(self.p) def translators(langDir, lang=None): """ create a list of translators @param langDir a path containing .qm translation @param lang the preferred locale, like en_IN.UTF-8, fr_FR.UTF-8, etc. @result a list of QtCore.QTranslator instances """ if lang==None: lang=QtCore.QLocale.system().name() result=[] qtTranslator=QtCore.QTranslator() qtTranslator.load("qt_" + lang, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) result.append(qtTranslator) # path to the translation files (.qm files) sparkTranslator=QtCore.QTranslator() sparkTranslator.load(lang, langDir); result.append(sparkTranslator) return result def firstExistingPath(l): """ Returns the first existing path taken from a list of possible paths. @param l a list of paths @return the first path which exists in the filesystem, or None """ for p in l: if os.path.exists(p): return p return None def common_paths(): """ Finds common paths @result a dictionary of common paths """ path={} curPath = os.path.dirname(os.path.realpath(__file__)) path["current"] = curPath sharedPath = "/usr/share/kuttypy" path["translation"] = firstExistingPath( [os.path.join(p, "lang") for p in (curPath, sharedPath,)]) path["utilities"] = firstExistingPath( [os.path.join(p,'utilities') for p in (curPath, sharedPath,)]) path["templates"] = firstExistingPath( [os.path.join(p,'utilities','templates') for p in (curPath, sharedPath,)]) path["themes"] = firstExistingPath( [os.path.join(p,'utilities','themes') for p in (curPath, sharedPath,)]) path["examples"] = firstExistingPath( [os.path.join(p,'examples') for p in (curPath, sharedPath,)]) path["editor"] = firstExistingPath( [os.path.join(p,'editor') for p in (curPath, sharedPath,)]) lang=str(QtCore.QLocale.system().name()) shortLang=lang[:2] return path def run(): global path, app, myapp path = common_paths() app = QtWidgets.QApplication(sys.argv) myapp = AppWindow(app=app, path=path) myapp.show() r = app.exec_() ''' if myapp.p.connected: myapp.p.fd.write(b'j') #myapp.p.fd.setRTS(0) #time.sleep(0.01) #myapp.p.fd.setRTS(1) ''' app.deleteLater() sys.exit(r) if __name__ == "__main__": run() KuttyPy-GUI-2.3/KuttyPyPlus.py000066400000000000000000001260741456261524100163200ustar00rootroot00000000000000''' ''' # !/usr/bin/python3 import os, sys, time, re, traceback, platform from PyQt5 import QtGui, QtCore, QtWidgets import KuttyPyLib import socket from utilities.templates import ui_layoutplus as layout from utilities import dio, REGISTERS, uploader, syntax from utilities import texteditor import constants import inspect from functools import partial from collections import OrderedDict # translation stuff def translate(lang=None): global app, t, t1 if lang is None: lang = QtCore.QLocale.system().name() t = QtCore.QTranslator() t.load("lang/" + lang, os.path.dirname(__file__)) app.installTranslator(t) t1 = QtCore.QTranslator() t1.load("qt_" + lang, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) app.installTranslator(t1) class myTimer(): def __init__(self, interval): self.interval = interval self.reset() def reset(self): self.timeout = time.time() + self.interval def ready(self): T = time.time() dt = T - self.timeout if dt > 0: # timeout is ahead of current time # if self.interval>5:print('reset',self.timeout,dt) self.timeout = T - dt % self.interval + self.interval # if self.interval>5:print(self.timeout) return True return False def progress(self): return 100 * (self.interval - self.timeout + time.time()) / (self.interval) class AppWindow(QtWidgets.QMainWindow, layout.Ui_MainWindow): p = None ports = ['A', 'B', 'C', 'D'] logThis = QtCore.pyqtSignal(str) showStatusSignal = QtCore.pyqtSignal(str, bool) serverSignal = QtCore.pyqtSignal(str) logThisPlain = QtCore.pyqtSignal(bytes) codeOutput = QtCore.pyqtSignal(str, str) serialGaugeSignal = QtCore.pyqtSignal(bytes) serialGaugeConvert = 'bytes' serialStream = b'' def __init__(self, parent=None, **kwargs): super(AppWindow, self).__init__(parent) self.local_ip = '' self.setupUi(self) self.compile_thread = None self.VERSION = REGISTERS.VERSION_ATMEGA32 # This needs to be dynamically changed when hardware is connected self.SPECIALS = REGISTERS.VERSIONS[self.VERSION]['SPECIALS'] self.REGISTERS = REGISTERS.VERSIONS[self.VERSION]['REGISTERS'] self.EXAMPLES_DIR = REGISTERS.VERSIONS[self.VERSION]['examples directory'] self.docks = [self.padock, self.pbdock, self.pcdock, self.pddock] self.sensorList = [] self.controllerList = [] self.monitoring = True self.logRegisters = True self.userHexRunning = False self.uploadingHex = False self.autoUpdateUserRegisters = False self.CFile = None # '~/kuttyPy.c' self.ipy = None self.defaultDirectory = path["examples"] self.serverActive = False examples = [a for a in os.listdir(os.path.join(path["examples"], self.EXAMPLES_DIR)) if ('.py' in a) and a != 'kuttyPy.py'] # .py files except the library self.exampleList.addItems(examples) blinkindex = self.exampleList.findText('blink.py') if blinkindex != -1: # default example. blink.py present in examples directory self.exampleList.setCurrentIndex(blinkindex) self.serialGuageButton.hide() # Hide the serial guage button # Define some keyboard shortcuts for ease of use self.shortcutActions = {} self.shortcuts = {"f": partial(self.setLanguage, 'fr_FR'), "e": partial(self.setLanguage, 'en_IN'), "m": partial(self.setLanguage, 'ml_IN'), "Ctrl+S": self.saveFile, "Ctrl+O": self.openFile, "Ctrl+Shift+S": self.saveAs, "Ctrl+N": self.addSourceTab} for a in self.shortcuts: shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(a), self) shortcut.activated.connect(self.shortcuts[a]) self.shortcutActions[a] = shortcut ######## PYTHON CODE self.codeThread = QtCore.QThread() self.codeEval = self.codeObject(self.REGISTERS) self.codeEval.moveToThread(self.codeThread) self.codeEval.finished.connect(self.codeThread.quit) self.codeEval.logThis.connect(self.appendLog) # Connect to the log window self.logThis.connect(self.appendLog) # Connect to the log window self.logThisPlain.connect(self.appendLogPlain) # Connect to the log window self.serialGaugeSignal.connect(self.setSerialgauge) self.codeThread.started.connect(self.codeEval.execute) self.codeThread.finished.connect(self.codeFinished) ########## C CODE EDITOR SYNTAX HIGHLIGHTER self.code_highlighters = [] ####### C CODE EDITOR ######### self.codingTabs.tabCloseRequested.connect(self.closeCTab) self.codingTabs.tabBarClicked.connect(self.CTabChanged) self.addFileMenu() self.listTab = None self.mapTab = None self.hexTab = None self.activeEditor = None self.activeSourceTab = None self.sourceTabs = {} self.addSourceTab() ######### C CODE UPLOADER self.uploadThread = QtCore.QThread() self.UploadObject = self.uploadObject() self.UploadObject.moveToThread(self.uploadThread) self.UploadObject.finished.connect(self.uploadThread.quit) self.UploadObject.logThis.connect(self.appendLog) # Connect to the log window self.UploadObject.resultSignal.connect(self.codeOutput) # Load .lst, .hex , .map files self.UploadObject.logThisPlain.connect(self.appendLogPlain) # Connect to the log window. add plain text self.logThis.connect(self.appendLog) # Connect to the log window self.uploadThread.started.connect(self.UploadObject.execute) self.uploadThread.finished.connect(self.codeFinished) self.commandQ = [] self.btns = {} self.registers = [] self.addPins() self.statusBar = self.statusBar() self.makeBottomMenu() global app self.initializeCommunications() self.pending = { 'status': myTimer(constants.STATUS_UPDATE_INTERVAL), 'update': myTimer(constants.AUTOUPDATE_INTERVAL), } serialgaugeoptions = {'name': 'Serial Monitor', 'init': print, 'read': None, 'fields': ['Value'], 'min': [0], 'max': [1000], 'config': [{ 'name': 'Data Type', 'options': ['byte', 'ASCII'], 'function': self.configSerialGauge } ]} self.serialGauge = dio.DIOSENSOR(self, serialgaugeoptions) self.startTime = time.time() self.timer = QtCore.QTimer() self.timer.timeout.connect(self.updateEverything) self.timer.start(20) # Auto-Detector self.shortlist = KuttyPyLib.getFreePorts() def activateCompileServer(self): if self.serverActive: #Stop it if self.compile_thread is not None: self.compile_thread.terminate() self.compile_thread.wait() print('quit compile_thread') self.compile_thread_button.setParent(None) self.showStatus("Compiler Stopped ", False) return self.serverActive = False self.compile_thread_button.setText("Start Online Compiler") else: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(0.1) # Set a timeout to avoid blocking indefinitely s.connect(("8.8.8.8", 80)) # Connect to a public IP address self.local_ip = s.getsockname()[0] from utilities.compile_server import create_server self.compile_thread = create_server(self.showStatusSignal, self.serverSignal, path["kpy"], self.local_ip) self.showStatusSignal.connect(self.showStatus) self.serverSignal.connect(self.showServerStatus) s.close() self.showStatus("Compiler Active at " + self.local_ip, False) self.compile_thread_button.setText("Stop Server") self.serverActive = True def addFileMenu(self): self.myFileMenuBar = QtWidgets.QMenuBar(self.fileMenuButton) codeMenu = self.myFileMenuBar.addMenu('File:') newFileAction = QtWidgets.QAction('New File', self) newFileAction.triggered.connect(self.addSourceTab) codeMenu.addAction(newFileAction) openFileAction = QtWidgets.QAction('Open File', self) openFileAction.triggered.connect(self.openFile) openIcon = QtGui.QIcon() openIcon.addPixmap(QtGui.QPixmap(":/control/document-open.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) openFileAction.setIcon(openIcon) codeMenu.addAction(openFileAction) saveFileAction = QtWidgets.QAction('Save File', self) saveFileAction.triggered.connect(self.saveFile) saveIcon = QtGui.QIcon() saveIcon.addPixmap(QtGui.QPixmap(":/control/saveall.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) saveFileAction.setIcon(saveIcon) codeMenu.addAction(saveFileAction) saveAsFileAction = QtWidgets.QAction('Save As', self) saveAsFileAction.triggered.connect(self.saveAs) saveAsFileAction.setIcon(saveIcon) codeMenu.addAction(saveAsFileAction) exitAction = QtWidgets.QAction('Exit', self) exitAction.triggered.connect(QtWidgets.qApp.quit) codeMenu.addAction(exitAction) def closeCTab(self, index): print('Close Tab', index) widget = self.codingTabs.widget(index) sourceTabClosed = False if widget == self.mapTab: print('closing map tab') self.mapTab = None elif widget == self.hexTab: print('closing hex tab') self.hexTab = None elif widget == self.listTab: print('closing list tab') self.listTab = None elif widget in self.sourceTabs: if len(self.sourceTabs) == 1: print("last tab. won't close.") return else: print('closing source tab', widget.objectName()) self.sourceTabs.pop(widget) sourceTabClosed = True self.codingTabs.removeTab(index) if sourceTabClosed: # Source Tab closed. Re-assign active source tab self.activeSourceTab = list(self.sourceTabs.keys())[0] self.activeEditor = self.sourceTabs[self.activeSourceTab][0] self.CFile = self.sourceTabs[self.activeSourceTab][1] self.codingTabs.setCurrentIndex(self.codingTabs.indexOf(self.activeSourceTab)) print('New Source Tab:', self.getActiveFilename, self.CFile) def getActiveFilename(self): self.codingTabs.tabText(self.codingTabs.indexOf(self.activeSourceTab)) def addSourceTab(self): sourceTab = QtWidgets.QWidget() sourceTab.setObjectName("sourceTab") horizontalLayout_3 = QtWidgets.QHBoxLayout(sourceTab) horizontalLayout_3.setContentsMargins(0, 0, 0, 0) horizontalLayout_3.setSpacing(0) horizontalLayout_3.setObjectName("horizontalLayout_3") editor = texteditor.myTextEditor(sourceTab, self.codingTabs) font = QtGui.QFont() font.setFamily("Ubuntu Mono") font.setPointSize(12) editor.setFont(font) editor.setObjectName("editor") editor.setTabChangesFocus(False) horizontalLayout_3.addWidget(editor) self.codingTabs.addTab(sourceTab, "") self.sourceTabs[sourceTab] = [editor, None] self.codingTabs.setCurrentIndex(self.codingTabs.indexOf(sourceTab)) self.codingTabs.setTabText(self.codingTabs.indexOf(sourceTab), 'new.c') self.activeSourceTab = sourceTab self.activeEditor = editor self.code_highlighters.append(syntax.PythonHighlighter(editor.document())) def CTabChanged(self, index): widget = self.codingTabs.widget(index) if widget in self.sourceTabs: self.activeSourceTab = widget self.activeEditor = self.sourceTabs[widget][0] self.CFile = self.sourceTabs[widget][1] print('Change Tab', index, self.codingTabs.tabText(index), self.CFile) def newRegister(self): reg = dio.REGEDIT(self.commandQ) # self.registerLayout.addWidget(reg) # self.registers.append(reg) # TODO: Convert layout to listwidget to enable re-ordering regItem = QtWidgets.QListWidgetItem() regItem.setSizeHint(QtCore.QSize(200, 40)) self.registerList.addItem(regItem) self.registerList.setItemWidget(regItem, reg) self.registers.append(regItem) def addPins(self): for port, dock in zip(self.ports, [self.palayout, self.pblayout, self.pclayout, self.pdlayout]): checkbox = dio.REGVALS(port) dock.addWidget(checkbox) self.btns[port] = checkbox seq = range(7, -1, -1) if port == 'C': seq = reversed(seq) # PORTC pins are ordered top to bottom for a in seq: name = 'P' + port + str(a) checkbox = dio.widget(name, self.commandQ, extra=self.SPECIALS.get(name, '')) dock.addWidget(checkbox) self.btns[name] = checkbox def tabChanged(self, index): if self.userHexRunning: # Firmware was running. Stop it. self.launchFirmwareButton.setChecked(False) self.jumpToApplication(False) if index != 0: # examples/editor tab. disable monitoring self.monitoring = False for a in self.docks: a.hide() else: # Playground . enable monitoring and control. self.monitoring = True self.autoRefreshUserRegisters.setChecked(False) self.userRegistersAutoRefresh(False) self.setLogType('playground') for a in self.docks: a.show() def setLogType(self, tp): self.log.clear() if tp == 'playground': self.logLabel.setText("Monitor registers being read and set during each operation") elif tp == 'avr': self.logLabel.setText("Avr-Gcc compile/upload messages") elif tp == 'monitor': self.logLabel.setText("Monitor data input from the serial port") elif tp == 'python': self.logLabel.setText("Python Code operations monitor") ################USER CODE SECTION#################### def codeOutput(self, filetype, filename): self.openCodeBreakupTab(filetype, filename) try: infile = open(filename, 'r') if filetype == 'list': self.listEditor.setPlainText(infile.read()) if filetype == 'map': self.mapEditor.setPlainText(infile.read()) if filetype == 'hex': self.hexEditor.setPlainText(infile.read()) infile.close() except Exception as e: print(e) def openCodeBreakupTab(self, filetype, filename): tab = None if filetype == 'list': if self.listTab is None: self.openListTab() tab = self.listTab elif filetype == 'map': if self.mapTab is None: self.openMapTab() tab = self.mapTab elif filetype == 'hex': if self.hexTab is None: self.openHexTab() tab = self.hexTab if tab != None: fname = filename.split self.codingTabs.setTabText(self.codingTabs.indexOf(tab), filetype + ":" + os.path.basename(filename)) def openListTab(self): self.listTab = QtWidgets.QWidget() self.listTab.setObjectName("listTab") self.verticalLayout = QtWidgets.QVBoxLayout(self.listTab) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.listEditor = QtWidgets.QTextBrowser(self.listTab) self.listEditor.setObjectName("listEditor") self.verticalLayout.addWidget(self.listEditor) self.codingTabs.addTab(self.listTab, "") def openMapTab(self): self.mapTab = QtWidgets.QWidget() self.mapTab.setObjectName("mapTab") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.mapTab) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setObjectName("verticalLayout_3") self.mapEditor = QtWidgets.QTextBrowser(self.mapTab) self.mapEditor.setObjectName("mapEditor") self.verticalLayout_3.addWidget(self.mapEditor) self.codingTabs.addTab(self.mapTab, "") def openHexTab(self): self.hexTab = QtWidgets.QWidget() self.hexTab.setObjectName("hexTab") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.hexTab) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.hexEditor = QtWidgets.QTextBrowser(self.hexTab) self.hexEditor.setObjectName("hexEditor") self.verticalLayout_2.addWidget(self.hexEditor) self.codingTabs.addTab(self.hexTab, "") class codeObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) code = '' def __init__(self, REGISTERS): super(AppWindow.codeObject, self).__init__() self.PORTMAP = {v: k for k, v in REGISTERS.items()} # Lookup port name based on number self.compiled = '' self.SR = None self.GR = None self.evalGlobals = {} self.evalGlobals['getReg'] = self.getReg self.evalGlobals['setReg'] = self.setReg self.evalGlobals['print'] = self.printer def setCode(self, code, **kwargs): try: self.compiled = compile(code.encode(), '', mode='exec') except SyntaxError as err: error_class = err.__class__.__name__ detail = err.args[0] line_number = err.lineno return '''%s at line %d : %s''' % (error_class, line_number, detail) except Exception as err: error_class = err.__class__.__name__ detail = err.args[0] cl, exc, tb = sys.exc_info() line_number = traceback.extract_tb(tb)[-1][1] return '''%s at line %d: %s''' % (error_class, line_number, detail) self.SR = kwargs.get('setReg') self.GR = kwargs.get('getReg') self.evalGlobals = kwargs self.evalGlobals['getReg'] = self.getReg # Overwrite these three. They will be wrapped. self.evalGlobals['setReg'] = self.setReg self.evalGlobals['print'] = self.printer return '' def printer(self, *args): self.logThis.emit('''%s''' % (' '.join([str(a) for a in args]))) def setReg(self, reg, value): html = u'''
W\u2193{0:s}\t{1:d}\t0x{1:02x} / 0b{1:08b}
'''.format( self.PORTMAP.get(reg, ''), value) self.logThis.emit(html) self.SR(reg, value) def getReg(self, reg): value = self.GR(reg) html = u'''
R\u2191{0:s}\t{1:d}\t0x{1:02x} / 0b{1:08b}
'''.format( self.PORTMAP.get(reg, ''), value) self.logThis.emit(html) return value def execute(self): # old = sys.stdout # olde = sys.stderr # sys.stdout = self.toLog(self.logThis) # sys.stderr = self.toLog(self.logThis) try: exec(self.compiled, {}, self.evalGlobals) except SyntaxError as err: error_class = err.__class__.__name__ detail = err.args[0] line_number = err.lineno self.logThis.emit( '''%s at line %d : %s''' % (error_class, line_number, detail)) except Exception as err: error_class = err.__class__.__name__ detail = err.args[0] cl, exc, tb = sys.exc_info() line_number = traceback.extract_tb(tb)[-1][1] self.logThis.emit( '''%s at line %d: %s''' % (error_class, line_number, detail)) # sys.stdout = old # sys.stderr = olde self.logThis.emit("Finished executing user code") self.finished.emit() def runCode(self): if self.codeThread.isRunning(): print('one code is already running') return self.setLogType('python') self.log.clear() # clear the log window self.log.setText('''----------User Code Started-----------''') kwargs = {} for a in dir(self.p): attr = getattr(self.p, a) if inspect.ismethod(attr) and a[:2] != '__': kwargs[a] = attr compilemsg = self.codeEval.setCode('{0:s}'.format(self.userCode.toPlainText()), **kwargs) if len(compilemsg): self.log.append(compilemsg) return self.codeThread.start() self.userCode.setStyleSheet("border: 3px dashed #53ffff;") self.tabs.setTabEnabled(0, False) def codeFinished(self): print('finished') self.tabs.setTabEnabled(0, True) self.userCode.setStyleSheet("") self.uploadingHex = False def abort(self): if self.codeThread.isRunning(): self.log.append( '''----------Kill Signal(Doesn't work yet. Restart the application)-----------''') self.codeThread.quit() self.codeThread.terminate() del self.codeThread self.codeThread = QtCore.QThread() self.codeEval = self.codeObject(self.REGISTERS) self.codeEval.moveToThread(self.codeThread) self.codeEval.finished.connect(self.codeThread.quit) self.codeEval.logThis.connect(self.appendLog) # Connect to the log window self.codeThread.started.connect(self.codeEval.execute) self.codeThread.finished.connect(self.codeFinished) def getReg(self, reg, record=True): val = self.p.getReg(reg) if record: self.updatedRegs[reg] = [0, val] return val def setReg(self, reg, val, record=True): self.p.setReg(reg, val) if record: self.updatedRegs[reg] = [1, val] return val def appendLog(self, txt): self.log.append(txt) def appendLogPlain(self, txt): self.log.moveCursor(QtGui.QTextCursor.End) self.log.insertPlainText(txt.decode('ascii')) def configSerialGauge(self, val): if val == 0: # 'byte' print('Byte Mode(0-255)') for a in self.serialGauge.gauges: a.set_MaxValue(255) self.serialGaugeConvert = 'bytes' if val == 1: # 'ascii' print('ASCII(0-10000)') for a in self.serialGauge.gauges: a.set_MaxValue(10000) self.serialGaugeConvert = 'ascii' def setSerialgauge(self, vals): if self.serialGaugeConvert == 'bytes': self.serialGauge.setValue([vals[0]]) elif self.serialGaugeConvert == 'ascii': self.serialStream += vals while b'\n' in self.serialStream: val, _, self.serialStream = self.serialStream.partition(b'\n') self.serialGauge.setValue([float(val)]) def genLog(self): html = '''''' % (time.ctime()) # html+=''' # ''' for a in self.updatedRegs: row = self.updatedRegs[a] html += u''' '''.format(u'W \u2193' if row[0] else u'R \u2191', a, row[1]) html += "
%s
R/WREGISTERValueHex/Binary
{0:s} {1:s} {2:d} 0b{2:08b} | 0x{2:02x}
" self.log.setHtml(html) def userRegistersAutoRefresh(self, state): self.autoUpdateUserRegisters = state def updateEverything(self): self.locateDevices() if not self.checkConnectionStatus(): return # KuttyPy monitor has handed over control to native code. act as serial monitor/ debug window if self.uploadingHex: return if self.userHexRunning: t = self.p.fd.read(self.p.fd.in_waiting) if len(t): self.serialGaugeSignal.emit(t) self.logThisPlain.emit(t) return # self.setTheme('material') if self.codeThread.isRunning(): return if self.autoUpdateUserRegisters: for a in range(self.registerList.count()): self.registerList.itemWidget(self.registerList.item(a)).execute() while len(self.commandQ): if not self.centralWidget().isEnabled(): return a = self.commandQ.pop(0) if a[0] == 'DSTATE': # Digital Out ['DSTATE','Pxx',state] pname = 'PORT' + a[1][1].upper() bit = int(a[1][2]) reg = self.getReg(pname) reg &= ~ (1 << bit) if (a[2]): reg |= (1 << bit) self.setReg(pname, reg) elif a[0] == 'DTYPE': # Digital pin I/O ['DTYPE','Pxx',state] pname = 'DDR' + a[1][1].upper() bit = int(a[1][2]) reg = self.getReg(pname) reg &= ~ (1 << bit) if (a[2]): reg |= (1 << bit) self.setReg(pname, reg); elif a[0] == 'WRITE': # ['WRITE','REGNAME',val] self.setReg(a[1], a[2]); elif a[0] == 'READ': # ['READ','REGNAME',function] val = self.getReg(a[1]) a[2](val) elif a[0] == 'CNTR1': # ['CNTR1',output with setValue function] cl = self.getReg('TCNT1L', False) ch = self.getReg('TCNT1H', False) a[1].setValue(cl | (ch << 8)) elif a[0] == 'ADC': # ['ADC',ADMUX,output with setValue function, to log, or not to log] self.setReg('ADMUX', a[1], a[3]) self.setReg('ADCSRA', 196 | 1, a[3]) adcl = self.getReg('ADCL', a[3]) adch = self.getReg('ADCH', a[3]) a[2].setValue(adcl | (adch << 8)) for a in self.sensorList: if a[0].isVisible(): a[0].setValue(a[0].read()) ''' if self.enableLog.isChecked(): if self.clearLog.isChecked() and len(self.updatedRegs): self.log.clear() if len(self.updatedRegs): self.genLog() self.updatedRegs = OrderedDict() ''' if len(self.updatedRegs): self.genLog() self.updatedRegs = OrderedDict() if self.pending['status'].ready() and self.monitoring: val = self.p.getReg(self.getRegs[self.currentRegister][0]) self.getRegs[self.currentRegister][1](self.getRegs[self.currentRegister][0], val) self.currentRegister += 1 if self.currentRegister == len(self.getRegs): self.currentRegister = 0 for a in self.ports: self.btns[a].setRegs(self.p.REGSTATES) if self.pending['update'].ready(): pass # print('update') def updateInputs(self, port, value): portchar = port[3] for a in range(8): btn = self.btns['P' + portchar + str(a)] btn.nameIn.setChecked((value >> a) & 1) if portchar == 'A': # ADC if btn.currentPage == 2: # ADC Page displayed self.commandQ.append(['ADC', btn.ADMUX, btn, btn.logstate]) elif type(btn) == dio.DIOCNTR and btn.currentPage == 2: # CNTR self.commandQ.append(['CNTR1', btn.slider]) def newStepperController(self): if self.p.connected: dialog = dio.DIOSTEPPER(self, total=200, device=self.p) dialog.launch() self.sensorList.append([dialog, None]) ############ I2C SENSORS ################# def I2CScan(self): if self.p.connected: x = self.p.I2CScan() print('Responses from: ', x) for a in self.sensorList: a[0].setParent(None) a[1].setParent(None) self.sensorList = [] for a in self.controllerList: a[0].setParent(None) a[1].setParent(None) self.controllerList = [] for a in x: s = self.p.sensors.get(a, None) if s != None: btn = QtWidgets.QPushButton(s['name'] + ':' + hex(a)) dialog = dio.DIOSENSOR(self, s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.sensorList.append([dialog, btn]) continue s = self.p.controllers.get(a, None) if s != None: btn = QtWidgets.QPushButton(s['name'] + ':' + hex(a)) dialog = dio.DIOCONTROL(self, s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.controllerList.append([dialog, btn]) continue s = self.p.special.get(a, None) if s != None: btn = QtWidgets.QPushButton(s['name'] + ':' + hex(a)) dialog = dio.DIOROBOT(self, s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.controllerList.append([dialog, btn]) continue def loadExample(self, filename): self.userCode.setPlainText(open(os.path.join(path["examples"], self.EXAMPLES_DIR, filename), "r").read()) ########################### UPLOAD HEX FILE ####################### class uploadObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) resultSignal = QtCore.pyqtSignal(str, str) logThisPlain = QtCore.pyqtSignal(bytes) fname = '' p = None def __init__(self): super(AppWindow.uploadObject, self).__init__() def config(self, mode, p, fname): self.p = p self.fname = fname self.mode = mode def execute(self): if 'compile' in self.mode: try: import subprocess if self.fname[-2:] in ['.s', '.S']: action = 'Assembl' else: # elif self.fname[-2:] in ['.c','.C']: action = 'Compil' fname = '.'.join(self.fname.split('.')[:-1]) if self.p.version == REGISTERS.VERSION_ATMEGA32 or self.p.connected == False: # by default, compile for ATMEGA32. # cmd = 'avr-gcc -Wall -O2 -mmcu=%s -o "%s" -Map "%s" "%s"' %('atmega32',fname,fname+'.map',self.fname) cmd = 'avr-gcc -Wall -O2 -mmcu=%s -Wl,-Map="%s" -o "%s" "%s" -lkp' % ( 'atmega32', fname + '.map', fname, self.fname) # includes MAP self.logThis.emit('''%sing for Atmega32''' % (action)) elif self.p.version == REGISTERS.VERSION_ATMEGA328P: cmd = 'avr-gcc -Wall -O2 -mmcu=%s -o "%s" "%s" -lkp' % ('atmega328p', fname, self.fname) self.logThis.emit( '''%sing for Atmega328p (Nano)''' % (action)) else: self.logThis.emit('''%ser UNAVAILABLE''' % (action)) return print(cmd) res = subprocess.getstatusoutput(cmd) if res[0] != 0: self.logThis.emit('''%se Error: %s''' % ( action, res[1].replace('\n', '
'))) self.finished.emit() return else: self.logThis.emit('''%s
''' % res[1]) self.resultSignal.emit('map', fname + '.map') cmd = 'avr-objcopy -j .text -j .data -O ihex "%s" "%s.hex"' % (fname, fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit(res[1]) # '''%s
'''%res[1]) self.resultSignal.emit('hex', fname + '.hex') cmd = 'avr-objdump -S "%s" > "%s.lst"' % (fname, fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit(res[1]) # '''%s
'''%res[1]) self.logThis.emit( 'Finished %sing: Generated Hex File' % action) # '''Finished %sing: Generated Hex File'''%(action)) self.resultSignal.emit('list', fname + '.lst') except Exception as err: self.logThis.emit('''Failed to %se:%s''' % str(action, err)) if self.p.connected: if 'upload' in self.mode: try: if self.fname[-2:] in ['.c', '.C', '.s', '.S']: self.fname = self.fname[:-2] + '.hex' # Replace .c with .hex self.logThis.emit('''Upload Code... Trigger Reset...''') dude = uploader.Uploader(self.p.fd, hexfile=self.fname, logger=self.logThis) self.p.fd.setRTS(0); self.p.fd.setDTR(0); time.sleep(0.01); self.p.fd.setRTS(1); self.p.fd.setDTR(1); time.sleep(0.05) dude.program() dude.verify() self.p.fd.setRTS(0); self.p.fd.setDTR(0); time.sleep(0.01); self.p.fd.setRTS(1); self.p.fd.setDTR(1); time.sleep(0.25) self.p.get_version() self.logThis.emit('''Finished upload''') except Exception as err: print('upload error', err) self.p.fd.setRTS(0); self.p.fd.setDTR(0); time.sleep(0.01); self.p.fd.setRTS(1); self.p.fd.setDTR(1); time.sleep(0.25) self.p.get_version() self.logThis.emit('''Failed to upload''') # self.jumpToApplication(False) #Force a reset self.finished.emit() def uploadHex(self): filename = QtWidgets.QFileDialog.getOpenFileName(self, " Open a hex file to upload to your KuttyPy", "", "Hex Files (*.hex)") if len(filename[0]): # self.userCode.setStyleSheet("border: 3px dashed #53ffff;") # self.tabs.setTabEnabled(0,False) self.uploadingHex = True self.log.clear() self.log.setText('''-- Uploading Code --
''') self.UploadObject.config('upload', self.p, filename[0]) self.uploadThread.start() def openFile(self): filename = QtWidgets.QFileDialog.getOpenFileName(self, " Open a C/Asm file to edit", self.defaultDirectory, "C/ASM Files (*.c *.C *.s *.S);; Asm Files (*.s *.S);; C Files (*.c *.C)") if len(filename[0]): if self.CFile is not None: # A file is altready open self.addSourceTab() self.defaultDirectory = '' self.filenameLabel.setText(filename[0]) self.CFile = filename[0] self.sourceTabs[self.activeSourceTab][1] = self.CFile self.log.clear() infile = open(filename[0], 'r') self.activeEditor.setPlainText( infile.read()) # self.activeEditor = self.sourceTabs[self.activeSourceTab][0] infile.close() self.codingTabs.setTabText(self.codingTabs.indexOf(self.activeSourceTab), os.path.split(self.CFile)[1]) self.log.setText('''-- Opened File: %s --
''' % filename[0]) def fontPlus(self): size = self.editorFont.pointSize() if size > 40: return self.editorFont.setPointSize(size + 1) self.editor.setFont(self.editorFont) def fontMinus(self): size = self.editorFont.pointSize() if size < 5: return self.editorFont.setPointSize(size - 1) self.editor.setFont(self.editorFont) def setFont(self, font): self.editorFont.setFamily(font) self.editor.setFont(self.editorFont) def compileAndUpload(self): self.setLogType('avr') self.saveFile() if self.CFile: if self.userHexRunning: self.launchFirmwareButton.setChecked(False) self.jumpToApplication(False) self.uploadingHex = True self.log.setText('''-- Compiling and Uploading Code --
''') self.UploadObject.config('compileupload', self.p, self.CFile) self.uploadThread.start() def compile(self): self.setLogType('avr') self.saveFile() if self.CFile: self.log.setText('''-- Compiling Code --
''') self.log.setText('''-- %s --
''' % self.CFile) self.UploadObject.config('compile', self.p, self.CFile) self.uploadThread.start() def upload(self): self.setLogType('avr') if self.CFile: if self.userHexRunning: self.launchFirmwareButton.setChecked(False) self.jumpToApplication(False) self.uploadingHex = True self.log.setText('''-- Uploading Code --
''') self.UploadObject.config('upload', self.p, self.CFile) self.uploadThread.start() def saveFile(self): if not self.CFile: self.CFile = self.saveAs() if self.CFile is not None and len(self.CFile) > 1: self.sourceTabs[self.activeSourceTab][1] = self.CFile fn = open(self.CFile, 'w') fn.write(self.activeEditor.toPlainText()) fn.close() self.codingTabs.setTabText(self.codingTabs.indexOf(self.activeSourceTab), os.path.split(self.CFile)[1]) self.log.setText('''-- Saved to: %s --
''' % self.CFile) else: self.log.setText('''-- No File Selected --
''') def saveAs(self): name = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File') print('created new file:', name) if len(name) > 0 and len(name[0]) > 1: self.CFile = name[0] self.log.setText('''-- Created new file: %s --
''' % self.CFile) self.codingTabs.setTabText(self.codingTabs.indexOf(self.activeSourceTab), os.path.split(self.CFile)[1]) return self.CFile ############################## def setTheme(self, theme): self.setStyleSheet("") self.setStyleSheet(open(os.path.join(path["themes"], theme + ".qss"), "r").read()) def initializeCommunications(self, port=False): if self.p: try: self.p.fd.close() except: pass if port: self.p = KuttyPyLib.connect(port=port) else: self.p = KuttyPyLib.connect(autoscan=True) if self.p.connected: self.launchFirmwareButton.setChecked(False) self.setWindowTitle('KuttyPy Interactive Console [{0:s}]'.format(self.p.portname)) self.updatedRegs = OrderedDict() self.currentRegister = 0 self.VERSION = self.p.version self.SPECIALS = REGISTERS.VERSIONS[self.VERSION]['SPECIALS'] self.REGISTERS = REGISTERS.VERSIONS[self.VERSION]['REGISTERS'] self.EXAMPLES_DIR = REGISTERS.VERSIONS[self.VERSION]['examples directory'] if self.p.version == REGISTERS.VERSION_ATMEGA328P: self.getRegs = [ ('PINB', self.updateInputs), ('PINC', self.updateInputs), ('PIND', self.updateInputs), ] elif self.p.version == REGISTERS.VERSION_ATMEGA32: self.getRegs = [ ('PINA', self.updateInputs), ('PINB', self.updateInputs), ('PINC', self.updateInputs), ('PIND', self.updateInputs), ] else: self.setWindowTitle('KuttyPy Interactive Console [ Hardware not detected ]') def setLanguage(self, lang='fr_FR'): translate(lang) self.retranslateUi(self) def showSerialGauge(self): self.serialGauge.show() def jumpToApplication(self, state): if self.p: if state: self.serialGuageButton.show() self.userHexRunning = True self.p.fd.write(b'j') # Skip to application (Bootloader resets) self.launchFirmwareButton.setText('Stop') for a in self.docks: a.setEnabled(False) # self.tabs.setEnabled(False) self.setLogType('monitor') self.log.setText('''-- Serial Port Monitor --
''') # self.serialGauge.show() else: self.serialGuageButton.hide() self.p.fd.setRTS(0); self.p.fd.setDTR(0); time.sleep(0.01); self.p.fd.setRTS(1); self.p.fd.setDTR(1); time.sleep(0.2) while self.p.fd.in_waiting: self.p.fd.read() self.p.get_version() for a in self.docks: a.setEnabled(True) self.userHexRunning = False self.launchFirmwareButton.setText('Run') # self.tabs.setEnabled(True) self.serialGauge.hide() else: if self.isChecked(): self.setChecked(False) def makeBottomMenu(self): try: self.pushbutton.setParent(None) except: pass self.pushbutton = QtWidgets.QPushButton('Menu') self.pushbutton.setStyleSheet("height: 13px;padding:3px;color: #7c7;") menu = QtWidgets.QMenu() menu.addAction('Save Window as Svg', self.exportSvg) menu.addAction('Open Stepper Controller', self.newStepperController) menu.addAction('Upload Hex File', self.uploadHex) # Theme ''' self.themeAction = QtWidgets.QWidgetAction(menu) themes = [a.split('.qss')[0] for a in os.listdir(path["themes"]) if '.qss' in a] self.themeBox = QtWidgets.QComboBox(); self.themeBox.addItems(themes) self.themeBox.currentIndexChanged['QString'].connect(self.setTheme) self.themeAction.setDefaultWidget(self.themeBox) menu.addAction(self.themeAction) ''' themes = [a.split('.qss')[0] for a in os.listdir(path["themes"]) if '.qss' in a] self.themeBox = QtWidgets.QComboBox(); self.themeBox.addItems(themes) self.themeBox.currentIndexChanged['QString'].connect(self.setTheme) self.statusBar.addPermanentWidget(self.themeBox) defaultTheme = "material" self.themeBox.setCurrentIndex(themes.index(defaultTheme)) self.setTheme(defaultTheme) self.pushbutton.setMenu(menu) # self.userApplication = QtWidgets.QCheckBox("User App"); # self.userApplication.toggled['bool'].connect(self.jumpToApplication) # self.statusBar.addPermanentWidget(self.userApplication) self.speedbutton = QtWidgets.QComboBox(); self.speedbutton.addItems(['Slow', 'Fast', 'Ultra']); self.speedbutton.setCurrentIndex(1); self.speedbutton.currentIndexChanged['int'].connect(self.setSpeed) self.statusBar.addPermanentWidget(self.speedbutton) # Compile thread self.compile_thread_button = QtWidgets.QPushButton('Online Compiler') self.compile_thread_button.setStyleSheet("height: 13px;padding:3px;color: #7c7;") self.compile_thread_button.clicked.connect(self.activateCompileServer) self.statusBar.addPermanentWidget(self.compile_thread_button) self.bottomLabel = QtWidgets.QLabel("Messages") # Menu button self.statusBar.addPermanentWidget(self.pushbutton) def showServerStatus(self, msg): self.showStatus("Compiler: Error Launching Server (Restart app) ", True) QtWidgets.QMessageBox.warning(self, 'Server Error', msg) #self.statusBar.addPermanentWidget(self.compile_thread_button) def showStatus(self, msg, error=None): if error: self.statusBar.setStyleSheet("color:#F77") else: self.statusBar.setStyleSheet("color:#FFF") self.statusBar.showMessage(msg) def setSpeed(self, index): self.timer.setInterval([100, 20, 5][index]) def locateDevices(self): try: L = KuttyPyLib.getFreePorts(self.p.portname) except Exception as e: print(e) total = len(L) menuChanged = False if L != self.shortlist: menuChanged = True if self.p.connected: if self.p.portname not in L: self.setWindowTitle('Error : Device Disconnected') QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device Disconnected. Please check the connections') try: self.p.close() except: pass self.p.connected = False self.setWindowTitle('KuttyPy Interactive Console [ Hardware not detected ]') elif True in L.values(): reply = QtWidgets.QMessageBox.question(self, 'Connection', 'Device Available. Connect?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: self.initializeCommunications() # update the shortlist self.shortlist = L def checkConnectionStatus(self, dialog=False): if self.p.connected: return True else: if dialog: QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device not connected. Please connect a KuttyPy to the USB port') return False ######## WINDOW EXPORT SVG def exportSvg(self): from PyQt5 import QtSvg path, _filter = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File', '~/') if path: generator = QtSvg.QSvgGenerator() generator.setFileName(path) target_rect = QtCore.QRectF(0, 0, 800, 600) generator.setSize(target_rect.size().toSize()) # self.size()) generator.setViewBox(self.rect()) generator.setTitle("Your title") generator.setDescription("some description") p = QtGui.QPainter() p.begin(generator) self.render(p) p.end() def ipython(self): # Experimental feature. Import ipython and launch console if not self.p.connected: return from utilities import ipy if not self.ipy: self.ipy = ipy.AppWindow(self, kp=self.p) self.ipy.show() self.ipy.updateDevice(self.p) def translators(langDir, lang=None): """ create a list of translators @param langDir a path containing .qm translation @param lang the preferred locale, like en_IN.UTF-8, fr_FR.UTF-8, etc. @result a list of QtCore.QTranslator instances """ if lang == None: lang = QtCore.QLocale.system().name() result = [] qtTranslator = QtCore.QTranslator() qtTranslator.load("qt_" + lang, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) result.append(qtTranslator) # path to the translation files (.qm files) sparkTranslator = QtCore.QTranslator() sparkTranslator.load(lang, langDir); result.append(sparkTranslator) return result def firstExistingPath(l): """ Returns the first existing path taken from a list of possible paths. @param l a list of paths @return the first path which exists in the filesystem, or None """ for p in l: if os.path.exists(p): return p return None def common_paths(): """ Finds common paths @result a dictionary of common paths """ path = {} curPath = os.path.dirname(os.path.realpath(__file__)) path["current"] = curPath sharedPath = "/usr/share/kuttypy" path["translation"] = firstExistingPath( [os.path.join(p, "lang") for p in (curPath, sharedPath,)]) path["utilities"] = firstExistingPath( [os.path.join(p, 'utilities') for p in (curPath, sharedPath,)]) path["templates"] = firstExistingPath( [os.path.join(p, 'utilities', 'templates') for p in (curPath, sharedPath,)]) path["themes"] = firstExistingPath( [os.path.join(p, 'utilities', 'themes') for p in (curPath, sharedPath,)]) path["examples"] = firstExistingPath( [os.path.join(p, 'examples') for p in (curPath, sharedPath,)]) path["kpy"] = firstExistingPath( [os.path.join(p, 'kpy') for p in (curPath, sharedPath,)]) path["editor"] = firstExistingPath( [os.path.join(p, 'editor') for p in (curPath, sharedPath,)]) lang = str(QtCore.QLocale.system().name()) shortLang = lang[:2] return path def run(): global path, app, myapp path = common_paths() print('QT Version', QtWidgets.__file__) app = QtWidgets.QApplication(sys.argv) myapp = AppWindow(app=app, path=path) myapp.show() r = app.exec_() if myapp.compile_thread is not None: myapp.compile_thread.terminate() print('waiting to quit compile_thread') myapp.compile_thread.wait() print('delete app..') app.deleteLater() sys.exit(r) if __name__ == "__main__": run() KuttyPy-GUI-2.3/KuttyPyUno.py000066400000000000000000000661421456261524100161350ustar00rootroot00000000000000''' ''' #!/usr/bin/python3 import os,sys,time,re,traceback,platform,inspect from utilities.Qt import QtGui, QtCore, QtWidgets import KuttyPyLibUno from utilities.templates import ui_layoutuno as layout from utilities import dio,uploader from utilities import REGISTERS_UNO as REGISTERS import constants from functools import partial from collections import OrderedDict class myTimer(): def __init__(self,interval): self.interval = interval self.reset() def reset(self): self.timeout = time.time()+self.interval def ready(self): T = time.time() dt = T - self.timeout if dt>0: #timeout is ahead of current time #if self.interval>5:print('reset',self.timeout,dt) self.timeout = T - dt%self.interval + self.interval #if self.interval>5:print(self.timeout) return True return False def progress(self): return 100*(self.interval - self.timeout + time.time())/(self.interval) class AppWindow(QtWidgets.QMainWindow, layout.Ui_MainWindow): p=None logThis = QtCore.pyqtSignal(str) logThisPlain = QtCore.pyqtSignal(bytes) serialGaugeSignal = QtCore.pyqtSignal(int) def __init__(self, parent=None,**kwargs): super(AppWindow, self).__init__(parent) self.setupUi(self) self.VERSION = REGISTERS.VERSIONNUM self.SPECIALS = REGISTERS.SPECIALS self.REGISTERS = REGISTERS.REGISTERS self.EXAMPLES_DIR = REGISTERS.EXAMPLES self.ADC_PINS = REGISTERS.ADC self.docks = [self.leftdock,self.rightdock] self.sensorList = [] self.controllerList = [] self.monitoring = True self.logRegisters = True self.userHexRunning = False self.uploadingHex = False self.autoUpdateUserRegisters = False self.CFile = None #'~/kuttyPy.c' self.ipy = None self.setTheme("material") examples = [a for a in os.listdir(os.path.join(path["examples"],self.EXAMPLES_DIR)) if ('.py' in a) and a is not 'kuttyPy.py'] #.py files except the library self.exampleList.addItems(examples) blinkindex = self.exampleList.findText('blink.py') if blinkindex!=-1: #default example. blink.py present in examples directory self.exampleList.setCurrentIndex(blinkindex) ######## PYTHON CODE self.codeThread = QtCore.QThread() self.codeEval = self.codeObject(self.REGISTERS) self.codeEval.moveToThread(self.codeThread) self.codeEval.finished.connect(self.codeThread.quit) self.codeEval.logThis.connect(self.appendLog) #Connect to the log window self.logThis.connect(self.appendLog) #Connect to the log window self.logThisPlain.connect(self.appendLogPlain) #Connect to the log window self.serialGaugeSignal.connect(self.setSerialgauge) self.codeThread.started.connect(self.codeEval.execute) self.codeThread.finished.connect(self.codeFinished) ######### C CODE UPLOADER self.uploadThread = QtCore.QThread() self.UploadObject = self.uploadObject() self.UploadObject.moveToThread(self.uploadThread) self.UploadObject.finished.connect(self.uploadThread.quit) self.UploadObject.logThis.connect(self.appendLog) #Connect to the log window self.UploadObject.logThisPlain.connect(self.appendLogPlain) #Connect to the log window. add plain text self.logThis.connect(self.appendLog) #Connect to the log window self.uploadThread.started.connect(self.UploadObject.execute) self.uploadThread.finished.connect(self.codeFinished) self.commandQ = [] self.btns={} self.registers = [] self.addPins() self.statusBar = self.statusBar() self.makeBottomMenu() global app self.initializeCommunications() self.pending = { 'status':myTimer(constants.STATUS_UPDATE_INTERVAL), 'update':myTimer(constants.AUTOUPDATE_INTERVAL), } serialgaugeoptions = {'name':'Serial Monitor', 'init':print, 'read':None, 'fields':['Value'], 'min':[0], 'max':[255]} self.serialGauge = dio.DIOSENSOR(self,serialgaugeoptions) self.startTime = time.time() self.timer = QtCore.QTimer() self.timer.timeout.connect(self.updateEverything) self.timer.start(20) #Auto-Detector self.shortlist=KuttyPyLibUno.getFreePorts() def newRegister(self): reg = dio.REGEDIT(self.commandQ) #self.registerLayout.addWidget(reg) #self.registers.append(reg) #TODO: Convert layout to listwidget to enable re-ordering regItem = QtWidgets.QListWidgetItem() regItem.setSizeHint(QtCore.QSize(200,40)) self.registerList.addItem(regItem) self.registerList.setItemWidget(regItem,reg) self.registers.append(regItem) def addPins(self): ''' This function adds pins in the right order. this should be moved to a configuration file! ''' self.btns['C'] = dio.REGVALS('C') self.leftlayout.addWidget(self.btns['C']) s = QtWidgets.QSpacerItem(20,250,QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.leftlayout.addItem(s) for name in ['PC0','PC1','PC2','PC3','PC4','PC5']: #left dock checkbox = dio.widget(name,self.commandQ,extra = self.SPECIALS.get(name,'')) self.leftlayout.addWidget(checkbox) self.btns[name] = checkbox self.btns['B'] = dio.REGVALS('B') self.rightlayout.addWidget(self.btns['B']) for name in ['PB5','PB4','PB3','PB2','PB1','PB0']: #right dock checkbox = dio.widget(name,self.commandQ,extra = self.SPECIALS.get(name,'')) self.rightlayout.addWidget(checkbox) self.btns[name] = checkbox s = QtWidgets.QSpacerItem(20,20,QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.rightlayout.addItem(s) self.btns['D'] = dio.REGVALS('D') self.rightlayout.addWidget(self.btns['D']) for name in ['PD7','PD6','PD5','PD4','PD3','PD2','PD1','PD0']: #right dock checkbox = dio.widget(name,self.commandQ,extra = self.SPECIALS.get(name,'')) self.rightlayout.addWidget(checkbox) self.btns[name] = checkbox def tabChanged(self,index): if index != 0 : #examples/editor tab. disable monitoring self.monitoring = False for a in self.docks: a.hide() else: #Playground . enable monitoring and control. self.monitoring = True self.autoRefreshUserRegisters.setChecked(False) self.userRegistersAutoRefresh(False) for a in self.docks: a.show() ################USER CODE SECTION#################### class codeObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) code = '' def __init__(self,REGISTERS): super(AppWindow.codeObject, self).__init__() self.PORTMAP = {v: k for k, v in REGISTERS.items()} #Lookup port name based on number self.compiled = '' self.SR = None self.GR = None self.evalGlobals = {} self.evalGlobals['getReg'] = self.getReg self.evalGlobals['setReg'] = self.setReg self.evalGlobals['print'] = self.printer def setCode(self,code,**kwargs): try: self.compiled = compile(code.encode(), '', mode='exec') except SyntaxError as err: error_class = err.__class__.__name__ detail = err.args[0] line_number = err.lineno return '''%s at line %d : %s''' % (error_class, line_number, detail) except Exception as err: error_class = err.__class__.__name__ detail = err.args[0] cl, exc, tb = sys.exc_info() line_number = traceback.extract_tb(tb)[-1][1] return '''%s at line %d: %s''' % (error_class, line_number, detail) self.SR = kwargs.get('setReg') self.GR = kwargs.get('getReg') self.evalGlobals = kwargs self.evalGlobals['getReg'] = self.getReg #Overwrite these three. They will be wrapped. self.evalGlobals['setReg'] = self.setReg self.evalGlobals['print'] = self.printer return '' def printer(self,*args): self.logThis.emit('''%s'''%(' '.join([str(a) for a in args]))) def setReg(self,reg,value): html=u'''
W\u2193{0:s}\t{1:d}\t0x{1:02x} / 0b{1:08b}
'''.format(self.PORTMAP.get(reg,''),value) self.logThis.emit(html) self.SR(reg,value) def getReg(self,reg): value = self.GR(reg) html=u'''
R\u2191{0:s}\t{1:d}\t0x{1:02x} / 0b{1:08b}
'''.format(self.PORTMAP.get(reg,''),value) self.logThis.emit(html) return value def execute(self): #old = sys.stdout #olde = sys.stderr #sys.stdout = self.toLog(self.logThis) #sys.stderr = self.toLog(self.logThis) try: exec(self.compiled,{},self.evalGlobals) except SyntaxError as err: error_class = err.__class__.__name__ detail = err.args[0] line_number = err.lineno self.logThis.emit('''%s at line %d : %s''' % (error_class, line_number, detail)) except Exception as err: error_class = err.__class__.__name__ detail = err.args[0] cl, exc, tb = sys.exc_info() line_number = traceback.extract_tb(tb)[-1][1] self.logThis.emit('''%s at line %d: %s''' % (error_class, line_number, detail)) #sys.stdout = old #sys.stderr = olde self.logThis.emit("Finished executing user code") self.finished.emit() def runCode(self): #if self.p: # try: # self.p.fd.read() #Clear junk # self.p.fd.close() # except:pass if self.codeThread.isRunning(): print('one code is already running') return self.log.clear() #clear the log window self.log.setText('''----------User Code Started-----------''') kwargs = {} for a in dir(self.p): attr = getattr(self.p, a) if inspect.ismethod(attr) and a[:2]!='__': kwargs[a] = attr compilemsg = self.codeEval.setCode('{0:s}'.format(self.userCode.toPlainText()),**kwargs) if len(compilemsg): self.log.append(compilemsg) return self.codeThread.start() self.userCode.setStyleSheet("border: 3px dashed #53ffff;") self.tabs.setTabEnabled(0,False) def codeFinished(self): print('finished') self.tabs.setTabEnabled(0,True) self.userCode.setStyleSheet("") self.uploadingHex = False def abort(self): if self.codeThread.isRunning(): self.log.append('''----------Kill Signal(Doesn't work yet. Restart the application)-----------''') self.codeThread.quit() self.codeThread.terminate() del self.codeThread self.codeThread = QtCore.QThread() self.codeEval = self.codeObject(self.REGISTERS) self.codeEval.moveToThread(self.codeThread) self.codeEval.finished.connect(self.codeThread.quit) self.codeEval.logThis.connect(self.appendLog) #Connect to the log window self.codeThread.started.connect(self.codeEval.execute) self.codeThread.finished.connect(self.codeFinished) def getReg(self,reg,record = True): val = self.p.getReg(reg) if record: self.updatedRegs[reg] = [0,val] return val def setReg(self,reg,val,record = True): self.p.setReg(reg,val) if record: self.updatedRegs[reg] = [1,val] return val def appendLog(self,txt): self.log.append(txt) def appendLogPlain(self,txt): self.log.moveCursor(QtGui.QTextCursor.End) self.log.insertPlainText(txt.decode('ascii')) def setSerialgauge(self,val): self.serialGauge.setValue([val]) def genLog(self): html=''''''%(time.ctime()) #html+=''' #''' for a in self.updatedRegs: row = self.updatedRegs[a] html+=u''' '''.format(u'W \u2193' if row[0] else u'R \u2191',a,row[1]) html+="
%s
R/WREGISTERValueHex/Binary
{0:s} {1:s} {2:d} 0b{2:08b} | 0x{2:02x}
" self.log.setHtml(html) def userRegistersAutoRefresh(self,state): self.autoUpdateUserRegisters = state def updateEverything(self): self.locateDevices() if not self.checkConnectionStatus():return #KuttyPy monitor has handed over control to native code. act as serial monitor/ debug window if self.uploadingHex: return if self.userHexRunning: t = self.p.fd.read(self.p.fd.in_waiting) if len(t): self.serialGaugeSignal.emit(t[0]) self.logThisPlain.emit(t) return #self.setTheme('material') if self.codeThread.isRunning(): return if self.autoUpdateUserRegisters: for a in range(self.registerList.count()): self.registerList.itemWidget(self.registerList.item(a)).execute() while len(self.commandQ): if not self.centralWidget().isEnabled(): return a = self.commandQ.pop(0) if a[0] == 'DSTATE': #Digital Out ['DSTATE','Pxx',state] pname = 'PORT'+a[1][1].upper() bit = int(a[1][2]) reg = self.getReg(pname) reg &=~ (1<>a)&1) if name in self.ADC_PINS: #ADC if btn.currentPage == 2: #ADC Page displayed self.commandQ.append(['ADC',btn.ADMUX,btn,btn.logstate]) elif type(btn)==dio.DIOCNTR and btn.currentPage==2: # CNTR self.commandQ.append(['CNTR1',btn.slider]) def newStepperController(self): if self.p.connected: dialog = dio.DIOSTEPPER(self,total=200,device=self.p) dialog.launch() self.sensorList.append([dialog,None]) ############ I2C SENSORS ################# def I2CScan(self): if self.p.connected: x = self.p.I2CScan() print('Responses from: ',x) for a in self.sensorList: a[0].setParent(None) a[1].setParent(None) self.sensorList = [] for a in self.controllerList: a[0].setParent(None) a[1].setParent(None) self.controllerList = [] for a in x: s = self.p.sensors.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOSENSOR(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.sensorList.append([dialog,btn]) continue s = self.p.controllers.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOCONTROL(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.controllerList.append([dialog,btn]) continue s = self.p.special.get(a,None) if s is not None: btn = QtWidgets.QPushButton(s['name']+':'+hex(a)) dialog = dio.DIOROBOT(self,s) btn.clicked.connect(dialog.launch) self.sensorLayout.addWidget(btn) self.controllerList.append([dialog,btn]) continue def loadExample(self,filename): self.userCode.setPlainText(open(os.path.join(path["examples"],self.EXAMPLES_DIR,filename), "r").read()) ########################### UPLOAD HEX FILE ####################### class uploadObject(QtCore.QObject): finished = QtCore.pyqtSignal() logThis = QtCore.pyqtSignal(str) logThisPlain = QtCore.pyqtSignal(bytes) fname = '' p = None def __init__(self): super(AppWindow.uploadObject, self).__init__() def config(self,mode,p,fname): self.p = p self.fname = fname self.mode = mode def execute(self): if self.mode == 'compileupload': try: import subprocess fname = '.'.join(self.fname.split('.')[:-1]) cmd = 'avr-gcc -Wall -O2 -mmcu=%s -o "%s" "%s"' %('atmega328p',fname,self.fname) self.logThis.emit('''Compiling for Atmega328p (Uno)''') print(cmd) res = subprocess.getstatusoutput(cmd) if res[0] != 0: self.logThis.emit('''Compile Error: %s'''%res[1]) self.finished.emit() return else: self.logThis.emit('''%s
'''%res[1]) cmd = 'avr-objcopy -j .text -j .data -O ihex "%s" "%s.hex"' %(fname,fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit('''%s
'''%res[1]) cmd = 'avr-objdump -S "%s" > "%s.lst"'%(fname,fname) res = subprocess.getstatusoutput(cmd) self.logThis.emit('''%s
'''%res[1]) if self.fname[-2:] in ['.c','.C']: self.fname = self.fname[:-2]+'.hex' #Replace .c with .hex self.mode = 'upload' self.logThis.emit('''Generated Hex File''') self.logThis.emit('''Finished Compiling: Generated Hex File''') except Exception as err: self.logThis.emit('''Failed to Compile:%s'''%str(err)) if self.p.connected: if self.mode == 'upload': try: self.p.fd.setRTS(0);time.sleep(0.01);self.p.fd.setRTS(1);time.sleep(0.4) dude = uploader.Uploader(self.p.fd, hexfile=self.fname,logger = self.logThis) dude.program() dude.verify() self.p.fd.setRTS(0);time.sleep(0.01);self.p.fd.setRTS(1);time.sleep(0.2) self.p.get_version() self.logThis.emit('''Finished upload''') except Exception as err: self.logThis.emit('''Failed to upload''') self.finished.emit() def uploadHex(self): filename = QtWidgets.QFileDialog.getOpenFileName(self," Open a hex file to upload to your KuttyPy", "", "Hex Files (*.hex)") if len(filename[0]): #self.userCode.setStyleSheet("border: 3px dashed #53ffff;") #self.tabs.setTabEnabled(0,False) self.uploadingHex = True self.log.clear() self.log.setText('''-- Uploading Code --
''') self.UploadObject.config('upload',self.p,filename[0]) self.uploadThread.start() def openFile(self): filename = QtWidgets.QFileDialog.getOpenFileName(self," Open a C file to edit", path["examples"], "C Files (*.c *.C)") if len(filename[0]): self.filenameLabel.setText(filename[0]) self.CFile = filename[0] self.log.clear() self.log.setText('''-- Opened File: %s --
'''%filename[0]) if 'inux' in platform.system(): #Linux based system os.system('%s "%s"' % ('xdg-open', filename[0])) else: os.system('%s "%s"' % ('open', filename[0])) def compileAndUpload(self): if self.CFile: self.uploadingHex = True self.log.clear() self.log.setText('''-- Compiling and Uploading Code --
''') self.UploadObject.config('compileupload',self.p,self.CFile) self.uploadThread.start() ############################## def setTheme(self,theme): self.setStyleSheet("") self.setStyleSheet(open(os.path.join(path["themes"],theme+".qss"), "r").read()) def initializeCommunications(self,port=False): if self.p: try:self.p.fd.close() except:pass if port: self.p = KuttyPyLibUno.connect(port = port) else: self.p = KuttyPyLibUno.connect(autoscan=True) if self.p.connected: self.userApplication.setChecked(False) self.setWindowTitle('KuttyPy Interactive Console [{0:s}]'.format(self.p.portname)) self.updatedRegs=OrderedDict() self.currentRegister = 0 self.getRegs=[ ('PINB',self.updateInputs), ('PINC',self.updateInputs), ('PIND',self.updateInputs), ] else: self.setWindowTitle('KuttyPy Interactive Console [ Hardware not detected ]') def jumpToApplication(self,state): if self.p: if state: self.userHexRunning=True self.p.fd.write(b'j') #Skip to application (Bootloader resets) for a in self.docks: a.setEnabled(False) self.tabs.setEnabled(False) self.log.clear() self.log.setText('''-- Serial Port Monitor --
''') self.serialGauge.show() else: self.p.fd.setRTS(0) #Trigger a reset time.sleep(0.01) self.p.fd.setRTS(1) time.sleep(0.1) while self.p.fd.in_waiting: self.p.fd.read() self.p.get_version() for a in self.docks: a.setEnabled(True) self.userHexRunning=False self.tabs.setEnabled(True) self.serialGauge.hide() else: if self.isChecked(): self.setChecked(False) def makeBottomMenu(self): try:self.pushbutton.setParent(None) except:pass self.pushbutton = QtWidgets.QPushButton('Menu') self.pushbutton.setStyleSheet("height: 13px;padding:3px;color: #FFFFFF;") menu = QtWidgets.QMenu() menu.addAction('Save Window as Svg', self.exportSvg) menu.addAction('Open Stepper Controller', self.newStepperController) #Theme self.themeAction = QtWidgets.QWidgetAction(menu) themes = [a.split('.qss')[0] for a in os.listdir(path["themes"]) if '.qss' in a] self.themeBox = QtWidgets.QComboBox(); self.themeBox.addItems(themes) self.themeBox.currentIndexChanged['QString'].connect(self.setTheme) self.themeAction.setDefaultWidget(self.themeBox) menu.addAction(self.themeAction) self.pushbutton.setMenu(menu) self.userApplication = QtWidgets.QCheckBox("User App"); self.userApplication.toggled['bool'].connect(self.jumpToApplication) self.statusBar.addPermanentWidget(self.userApplication) self.hexUploadButton = QtWidgets.QPushButton("Upload Hex"); self.hexUploadButton.clicked.connect(self.uploadHex) self.statusBar.addPermanentWidget(self.hexUploadButton) self.speedbutton = QtWidgets.QComboBox(); self.speedbutton.addItems(['Slow','Fast','Ultra']); self.speedbutton.setCurrentIndex(1); self.speedbutton.currentIndexChanged['int'].connect(self.setSpeed) self.statusBar.addPermanentWidget(self.speedbutton) self.statusBar.addPermanentWidget(self.pushbutton) def setSpeed(self,index): self.timer.setInterval([100,20,5][index]) def locateDevices(self): try:L = KuttyPyLibUno.getFreePorts(self.p.portname) except Exception as e:print(e) total = len(L) menuChanged = False if L != self.shortlist: menuChanged = True if self.p.connected: if self.p.portname not in L: self.setWindowTitle('Error : Device Disconnected') QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device Disconnected. Please check the connections') try: self.p.fd.close() self.p.portname = None except:pass self.p.connected = False self.setWindowTitle('KuttyPy Interactive Console [ Hardware not detected ]') elif True in L.values(): reply = QtWidgets.QMessageBox.question(self, 'Connection', 'Device Available. Connect?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: self.initializeCommunications() #update the shortlist self.shortlist=L def checkConnectionStatus(self,dialog=False): if self.p.connected:return True else: if dialog: QtWidgets.QMessageBox.warning(self, 'Connection Error', 'Device not connected. Please connect a KuttyPy to the USB port') return False def updateStatus(self): if not self.checkConnectionStatus(): self.countLabel.setText('Not Connected') return try: state,cnt = self.p.getStatus() self.currentState = state self.countLabel.setText('%s: %d'%("Running" if state else "Paused",cnt)) except: self.countLabel.setText('Disconnect!') self.p.fd.close() ######## WINDOW EXPORT SVG def exportSvg(self): from utilities.Qt import QtSvg path, _filter = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File', '~/') if path: generator = QtSvg.QSvgGenerator() generator.setFileName(path) target_rect = QtCore.QRectF(0, 0, 800, 600) generator.setSize(target_rect.size().toSize())#self.size()) generator.setViewBox(self.rect()) generator.setTitle("Your title") generator.setDescription("some description") p = QtGui.QPainter() p.begin(generator) self.render(p) p.end() def ipython(self): #Experimental feature. Import ipython and launch console if not self.p.connected: return from utilities import ipy if not self.ipy: self.ipy = ipy.AppWindow(self,kp = self.p) self.ipy.show() self.ipy.updateDevice(self.p) def translators(langDir, lang=None): """ create a list of translators @param langDir a path containing .qm translation @param lang the preferred locale, like en_IN.UTF-8, fr_FR.UTF-8, etc. @result a list of QtCore.QTranslator instances """ if lang==None: lang=QtCore.QLocale.system().name() result=[] qtTranslator=QtCore.QTranslator() qtTranslator.load("qt_" + lang, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) result.append(qtTranslator) # path to the translation files (.qm files) sparkTranslator=QtCore.QTranslator() sparkTranslator.load(lang, langDir); result.append(sparkTranslator) return result def firstExistingPath(l): """ Returns the first existing path taken from a list of possible paths. @param l a list of paths @return the first path which exists in the filesystem, or None """ for p in l: if os.path.exists(p): return p return None def common_paths(): """ Finds common paths @result a dictionary of common paths """ path={} curPath = os.path.dirname(os.path.realpath(__file__)) path["current"] = curPath sharedPath = "/usr/share/kuttypy" path["translation"] = firstExistingPath( [os.path.join(p, "lang") for p in (curPath, sharedPath,)]) path["utilities"] = firstExistingPath( [os.path.join(p,'utilities') for p in (curPath, sharedPath,)]) path["templates"] = firstExistingPath( [os.path.join(p,'utilities','templates') for p in (curPath, sharedPath,)]) path["themes"] = firstExistingPath( [os.path.join(p,'utilities','themes') for p in (curPath, sharedPath,)]) path["examples"] = firstExistingPath( [os.path.join(p,'examples') for p in (curPath, sharedPath,)]) path["editor"] = firstExistingPath( [os.path.join(p,'editor') for p in (curPath, sharedPath,)]) lang=str(QtCore.QLocale.system().name()) shortLang=lang[:2] return path def run(): global path, app, myapp path = common_paths() app = QtWidgets.QApplication(sys.argv) myapp = AppWindow(app=app, path=path) myapp.show() r = app.exec_() ''' if myapp.p.connected: myapp.p.fd.write(b'j') #myapp.p.fd.setRTS(0) #time.sleep(0.01) #myapp.p.fd.setRTS(1) ''' app.deleteLater() sys.exit(r) if __name__ == "__main__": run() KuttyPy-GUI-2.3/LICENSE000066400000000000000000000020601456261524100144420ustar00rootroot00000000000000MIT License Copyright (c) 2018 CSpark Research Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. KuttyPy-GUI-2.3/Makefile000066400000000000000000000016521456261524100151030ustar00rootroot00000000000000QT_VERSION?=PyQt5 PY_VERSION?=3 export QT_VERSION ifeq ($(QT_VERSION),PyQt5) PYUIC = pyuic5 PYRCC = pyrcc5 PYLUPDATE = pylupdate5 else ifeq ($(QT_VERSION),PyQt4) PYUIC = pyuic4 PYRCC = pyrcc4 PYLUPDATE = pylupdate4 else ifeq ($(QT_VERSION),PySide) PYUIC = pyside-uic PYRCC = pyside-rcc PYLUPDATE = pylupdate4 else PYUIC = pyuic4 PYRCC = pyrcc4 PYLUPDATE = pylupdate4 endif SUBDIRS = utilities all: recursive_all recursive_all: @echo '?. Using QT Version:' $(QT_VERSION) $(PYUIC) $(PYRCC) $(PYLUPDATE) $(PY_VERSION) @echo "QT_VERSION = '$(QT_VERSION)'\nPY_VERSION = $(PY_VERSION)\n" > utilities/build_details.py for d in $(SUBDIRS); do make PYUIC=$(PYUIC) PYRCC=$(PYRCC) PYLUPDATE=$(PYLUPDATE) PY_VERSION=$(PY_VERSION) -C $$d all; done clean: recursive_clean rm -rf *.pyc *~ __pycache__ recursive_clean: for d in $(SUBDIRS); do make -C $$d clean; done .PHONY: all recursive_all clean recursive_clean KuttyPy-GUI-2.3/README.md000066400000000000000000000132311456261524100147160ustar00rootroot00000000000000## KuttyPy Interactive Playground [ Microcontroller Training Utility ] [![PyPI version](https://badge.fury.io/py/kuttyPy.svg)](https://badge.fury.io/py/kuttyPy) [![Documentation Status](https://readthedocs.org/projects/kuttypy/badge/?version=latest)](https://kuttypy.readthedocs.io/en/latest/?badge=latest) ![Screenshot](/docs/images/main.gif?raw=true "Recording of the User Interface") --- The kuttyPy (/kʊtipʌɪ/) Microcontroller training utility allows live manipulation of the registers in microcontrollers via a connected computer containing its python library. setReg and getReg function calls act as debugging and monitoring tools, and combined with Python's visualization and analytical utilities, this approach has immense pedagogical potential for beginners to the microcontroller world. The kuttyPy hardware is an ATMEGA32 microcontroller development board developed by the [ExpEYES](http://expeyes.in) project, and is currently supported by this software. It contains the kuttyPy firmware, but can also be used to run other programs via its bootloader. --- ## What can I use it for? + It's an atmega32 development board with a bootloader supporting the 'arduino' protocol + The bootloader also allows real-time manipulation of registers through commmands sent via the serial port. + This is done by the associated Python library and companion GUI + You can monitor every input + Toggle every output + Deal with Peripherals such as PWMs and Counters + View ADC readings via an analog gauge + Scan for sensors connected to the I2C Bus + Monitor readings from sensors [TSL2561 luminosity, and MPU6050 IMU supported] + Compile code to hex with the avr-gcc compiler + Upload hex via the built-in uploader + Rapidly prototype and debug educational projects. For example, you can verify ADC input values before handing over control to the uploaded hex file which will likely have very limited debugging capabilities. + Learn how registers are the key to microcontroller operation, as opposed to the Arduino ecosystem which prefers obfuscation of these details underneath abstraction layers. ## Python library and Graphical utility ### 7 channel voltmeter [ 0-5000mV without analog frontend ] ![Screenshot](/docs/images/voltmeter.gif?raw=true "Voltmeter") ### Monitor I2C Sensors Supports I2C sensors: Luminosity Example. | Video recording ---|--- ![sensor](https://user-images.githubusercontent.com/19327143/52988950-5c64f580-3427-11e9-8516-d6708ef2532b.gif) | ![ezgif com-optimize](https://user-images.githubusercontent.com/19327143/52989158-2bd18b80-3428-11e9-9b26-21f21f8fe99a.gif) + Scan for Sensors + Click to monitor via analog gauge + List of I2C sensors supported thus far (Minimal data logging. Configuration options via the graphical utility might be incomplete) + MPU6050 3 Axis Accelerometer, 3 axis Angular velocity (Gyro) + TSL2561 Luminosity measurements + BMP280 Pressure and Temperature sensor + MCP4725 Single channel DAC + PCA9685 PWM controller + MLX90614 Passive IR Programming library and examples : [READ THE DOCS](https://kuttypy.readthedocs.io/en/latest/) ![Screenshot](/docs/images/mpu6050.gif?raw=true "6 DOF inertial measurement unit MPU6050") ### Plotting ADC values using matplotlib ![Screenshot](/docs/images/code.gif?raw=true "Recording of the ADC logging example") ![Screencast](/docs/images/monitor.gif?raw=true "Monitor your code!") Hall Sensor|Servo Motor ---|--- ![Screencast](/docs/images/hall_sensor.webp?raw=true "Hall sensor!") | ![Screencast](/docs/images/servo_motor.webp?raw=true "Hall sensor!") Plug and play various accessories such as this Hall Sensor, & servo motor. ### Simple blink.py example ![Screenshot](/docs/images/blink.gif?raw=true "Write Python code to blink all of PORT D") ![Screencast](/docs/images/monitor.gif?raw=true "Monitor your code!") Monitor your code's activity while it executes ![Screencast](/docs/images/custom_registers.gif?raw=true "Add Register widgets, twiddle bits, and see what happens!") Add custom register blocks, twiddle bits, and observe! In this demo, the ADC is read by first setting the bits in the ADCSRA(control and status register), then reading back ADCL(8LSB)+ADCH(2MSB), and also checking the new status of ADCSRA after the operation. ## C Code compilation and uploading ### Seamless switching between the KuttyPy monitor, and user uploaded hex file. --- The KuttyPy monitor code is part of the bootloader. This allows users to upload their own Hex files without losing the training utility features. ![App Switching](/docs/images/switch.gif?raw=true "App Switching") This example shows how to skip back and forth to an LED scanning code (which also prints letters to the serial port) written in C and uploaded. In the animation, after fiddling a little with the PWM controls on the monitor, the 'user app' button is clicked. This triggers the following: + Within a few ten milliseconds the user uploaded hex file starts executing + The console turns into a serial monitor, and shows any text sent by the user uploaded hex. The user can switch back to the monitoring utility in a snap! ![Screencast](/docs/images/pov_display.webp?raw=true "POV display!") A persistence of vision display made with C code! Write text in thin air using 8 LEDs on PORTB. ### Installing on Ubuntu + sudo apt-get install python3 python3-pyqt5 python3-serial --- + python3 KuttyPyGUI.py ### Installing on windows. + This code can be run from source, provided python3 and pyqt5 are installed. + [Download Bundled Installer](https://drive.google.com/uc?export=download&id=1giJuDNIql8X5oaIcOLFACXD05-hmkBAy) License: MIT --- Developed by Jithin B.P @CSpark Research, 2018. Special thanks to Georges Khazanadar for Debianizing efforts. KuttyPy-GUI-2.3/constants.py000066400000000000000000000000661456261524100160270ustar00rootroot00000000000000AUTOUPDATE_INTERVAL = 2 STATUS_UPDATE_INTERVAL = 0.02 KuttyPy-GUI-2.3/docs/000077500000000000000000000000001456261524100143675ustar00rootroot00000000000000KuttyPy-GUI-2.3/docs/.icons/000077500000000000000000000000001456261524100155605ustar00rootroot00000000000000KuttyPy-GUI-2.3/docs/.icons/kuttypy.png000066400000000000000000000530261456261524100200250ustar00rootroot00000000000000PNG  IHDRkQbKGD pHYs  tIME E$aiTXtCommentCreated with GIMPd.e IDATxy\Wy=zSK-"[Y͒qag!&f $dHLB2xg54l6e[eI-{y?9*e l#}Onݾg=VZY+keVZY+keVZY+keVZY+keVQ-r <)gZN5Oez4- 7ӵQ]7;:H+zž;̈́V. @}Ռ_G (#M}ZsĚQ.i1>`|&Z+6@n4A"F-=`s f{0̡yfg ==ӛ%;7_9+ɬ+bJg?][3ŧGYXUi ")%Z X-y|ni4yڹA|~bUr [óϜ~#ToXó6%raVX'*HR8@ND!D @\uT[iD)6q(Jzݜϗy+Ctv3l z\cjs/"QQ(AϢpF9T_8MMf wRZ kdJapϽs 9]+7s үbXYk~.a9/N0y<2E0T\(Nyw7P ߫`ějZ35_7 iݰ}|ʝ}n699'kNᘸhE&Z ?(()5J@N)8Dix{~+-9QS@eA{v]Ǹhz NP>+3> j}6y~LkjqV= @-gqyW`&"N`%. %RZ$EKvQ XC![D VZ v ৒񇓓8շS荈0r\ PV0@1dqAܡP~q֏s^|vh t MކQ-^CdJʛp.0&Ɣ#PR|!Z,Wԟ$+8nKWONN~!=+uqn>".94:8w{]:qS7 {74ȅ1"wHnFXRPGt#@2(0@`j ' go|vcV=s۾ v jrrp,46{/XPZtmnw\1ftG7onCgcF)B+,H&D0‰ M- (0`Ah-۳⿫!3ϔ 43g닓{POgm,yo?ɰj o ы.Ě v~#t܎IhNh 6x,FwoE7d@]Z_^Qsz'|^x:gxo yQov:Ip.l?Aر_~ؾv}?N}B0豽(W)` 9lnAG-a$ ]6oޭG$ 07'ˬ#~}( X+Si"MiaZp FBp {ĐaLX\TUeIB+1(;qq.vYu  jUyGxGõ7ﮊjGʟф_|$ B<Z!5ւ ~RGaz>ص [TKCBONNsvK,WQq|77/+>)g*R)lvO?Gx@3g^ y7#pJ157NQt0TGpm_[7PAjehK%zn.*Vc=ͳs{}iOڣn&sPӸ±|QDAÉ'[V yXOBZUtF*sɅ)qbFᕼj ﴊ|A"Ő}|!s+8ZOO|^:뻍DB3]jWdP %Q&+ۊTU\+N꫕a(+~]RKcE IZGz6:'6Ut6nK_K$X)u'>$ǰօn_W%ߛDޣ@$T Qu vW?p gO~BTElVwp͌m`BYqUT)2[Y%%UWbQ2z'/3IM/.v$lT0RgXY7o>I)u###KDX_099A9[?Тh֔Q4|I@ }V1M.ɍ ZkȾWHX9" {J(/[=HƝ,ƨ[+*ӊ87IxRkdEz~OQLMMl6ǘ?Q0+/k ˯{^ ![ Zy9Q\îWd* Nv5ջCdf1]=Yd3R5s~nl6G =ӛu y&r&021V^s'SþqtVeE%QV$0Ri!uAPykE^_^HZ V `i({>VD\*фSZa{ mq/Z+;t(T`Z-\YK:޻mޡ 7o^x166v\i)ܽzB_pJ[u&5 մTJL1^ )l &A>/ 2eX|ﹼkMO gx/:. Jb,љo'oc֠( R1 Rq+t3=gk7&͛&L,h4 G^{GahMmMWգMNZ=xԆVT]RCp (D|T=rysW-yk-m[Be0$,cޤ$Hr&*aFH+}%9#/bh|2*Tr2UhN⺸zmè/?u׻)eټyK8 yQ߿V8caSkqbƝT{74? shbykv~__8!B.9ra'yC@:qNP9XEHO= ]恮YSփ(E^F{.,pl@1:A3%oO҃kS k\}) ?GЀ81y_,N}+[[Mˮye/ AeG_{n&&&~"]G6pAoF\ͼSXtWY]UU^& D `(EHExxLN K!Q(XΆdJԔ2"$I[UqELtGvl<Ʉq̱dW6e}G'Nu1J`7Z]_a}=W>՞0zm,ˎ)beazzi&&&h6 Pvz /[pF\?f=S]Wi4RAxfx7mnKQ8q^ƙT@Xp޿wt.fmňw-BFa{l1VMP!K# >G(RJ~3L"n+((i,J Ep1ֈEFNy)s}7ל|97k-E^Wϓ_VȲkגeC#xp88 u )8p S9? tS4R(0#}r!Nmd^ȥ| xGxBSD% MU>J>HZP:)9$]Zc9 ӈ;֭L٤/> ɫ`A%9xEn3{.} _?!m۶~׽%/Å=/wQ_J)ٳVբ nP.UQs.:]MG z9@*  Qt(!MXp`Q&8еф`>D/]kE->I4GL[x*/\TP@+^ S."`Er(T#ǁ$!Pbe K |d1VT@sX'@s=q]7p%;i?utƵt]nڵk4) h&~F"LZ4B4]suU Ңx3J2JAڡ@QvEi&RKJኂzqj]G m'꒰f!c((΅` .q]"TISBI^,|4kZRT7$e"֒0 *J%ջsAs c9s3.tA&3H7@%BY(j64]vPk0!#; ɍc@08UT >I$[6V8S#ntk5&M\HLV`83cy)$˶/~Mg̡in&6shhKLMMleoTI3pmaC&zXVv4bHT%:B A\·*)Ui) QSl |YU5>(֣)0N+)cEtBk(NK0NDaT=肋#n1 jHk ]gWHnPz_[gqaM۷h4ߧlD#333e'<|VfᑫEI;k 1^[+ECCCSzMQR;)ǐ`izCaC)VTm[!{\R\$SkV*a.3xh2.EbQ(<ǝ/z)w`ˍv-t3a4k"8i5sGj 7)aAGN?vk^8ThWicl 9x\UiX i%T E3 hhMCҚ ]20b^hDۄ ^<*y~ޓZ$Dib2NX36lf#eR VM߸iO Z_;:k YˬSg}Yte|cI~y]JeI[9EQ&=ILT=b=)ZGü\xZޓF,!2@3XiꆱLsjͰyLMsjPӬ놡a1^3ՍYnFjCuC+4--iBԘս>|zeft G!-3Iҝ/(¥UUX]u8eqmb]sUK} p5W_[G| CSY9=}ܺF}'Z c1Ei 1 k!0e1$̿pgcND L@P41+l_@ rr(D RduU}eH IDAT]5EC(ŐRԵm(/<rpH銾*l/z_h(33(aOᢪvɂc.^ii>s;:qX64!X =Ъjz>p%/納W~=>`xdk`_Mb2VI+J8 I܋T4Mekxk*wZHփh%~&o)BTyCaoP8vB+! 2T coEp]8Ba-9r][7kϟ|)7i$ ~IY*{{L.3^___{ 8xTE<o:S^wpyt;=N|hC&8f~O݌5Mi3QrUak(f֜coP745X)heL3 ÙU gL1ahFȠue&1&*r ZG9:Eu,YKas̹sϴBPQE߲Jԡv<;ɏ1wΦ$B*hIZK.fDPI CP`X+N10xé*l/jq+كv#y7IYV mV2} gZa&P;atO?^[n'w}2޺B%="&%Z|0*9i /3~u{'0|h59{h4uɿ{+=rz.3<|6? 9I=RRKJFyM2BT4Tag4q8|Wx$aBJ). Z )*|tJ By?,9r9o.EQV9{C&o7ܼ?8 :Uo3ӾD>pORy7{/y}5W_׾tIơ={6nѝ۷[nos@An>.J,>ض,އ,ٔN3cǂo`J dE-4Edu'H9(qh4: II|B.ꏐxҲxIljQJL)V-N1xO:oVZ>5h%}A*HUU5 yM[5 gsx0>>02:޹ٙ7=((.%nFGWEńV"A uB.,C\/=L'R:?{n%b4N~/lUEkPk(<噁䇛S2Ez̷! B9}?ą '>\#6 E_RYOEEiÇT6+Ԁ'[<B12n'?g2~Ak_DfFinx#_EWi,Fa'&qKNev_y_f~6HGrkjw7d۶msj]YUdlO2-c~y1ǂ=UfNJuw2p2 #C@p9ww;} ?,Zl9 )7CsG/dh3RFTa,S<%?DZP.*6ųj P/%5VlB.[Hj ' ZԥSw@?>{ĿuB䚫x0y뮈5W_ ..d鋤c@w'fa:]T$3t.g콙sN)zpū 1HpV1r #/>|!J7?cδ`.gC$CcCV OaT"lSiŊ/g-z'sE'$,``z?qSiLbg@8~QV;V|#/V&qGgQj z5\?IX$)]ZDY76o@ZVmu['BZt}f(A]TT3((\pkb!OI#zA(YoFΤs@s#lA,26 Q,q}  iEQP̂"(HTZo R$Y`],qw{ qk+mC ֲߡ܈ekѡ/UDB'ua1㒁AȽS5ǙQ%DWtJQbACTBw] &f2N@j0eޛ$=;6o) `lڵn<* O*EиjVɷO*5-[mJ3~/llФ?`}We 4*pyBL#x8 uj2$P gl)NL$%3p\o}<5G/w$ͱ+xhDvǍ^y^]kaȫvGB1G@Qq* A-DB߄l6h& >QthݹZ xc-YK#PwGZtIBL~7 a5W_ۯ}?ϭVzN?'(HnBsW'.E*D\2k^{|p9d,%38DbB2]fadYY誗3rhBUqU>tԕ<8TRp4f˘]|'rX -MG%@H;;c€hQ$Q_*o?O߁Ǎ~4ꚍ5Z i:[ 6fC?Ig+ **US.)<ˠ\p%2]) S'ƷPkG۸M2m(Nq'(VlўF䴊ȑU20I-UEtS~7/ufCiiC()k3jF253JfF& 3/tES$IQIUsbġ,v]N" ^TRu_^F6<K|Sè\D=+<\n|8ZgA{I )?H"ZKyY}ΫI>!77!{F.HxJbH4f dnvўX@1 0dya|[Ϗq.ۅ s? =ϡ9NC z~f@q( TO +*cV*&Ԇ( J^ɠ3fk@s:?I׷[$`nnGyP}|ן jrjz&TĊ6&3@Ǎ-rŇ/̳NUVcpȒ81rqH ))EQHϯJ74&edU͆VruLz5%UC- F2y*`TG&jT w5Jزnc `rΗq{gv*' j,}=V;g*SLw5IKi5h3+',`8Y> պ1f(Ww}]w_|VoaT*6 H)'NoL+RiQ̱p0T)*uQ1M|,T~⊲U9 @*N+eqU񔪎 y^g^{Q ɗ e! =_Zi3rv}x>rdlg~}c}jMvTS3bVdxqN sb9T9XQg I'E]qeѡ1:WJc-".TwQN2!( B媡::h8S7zkTU2Ti mCTB6M2'-{Ǜ>'fYIDգ[ Q8 ٿlVwez&Ϟ_qғewN~/kR#j8(Vea㉠5`uA ?cc33{Qdjj] r ųC4WfRKT *(sO(4=MHxg3ĨU{Ys0>[$E kUFr(>4>wәG+ OG'''i +G+VnJR4@ %B&:RX%8QSJQW}* ůJbk6@׃JJW;~L $; O]VF'%(IєM養@&> ռYg 8*ljԃ} ;֎U^n ~rrz/yc|]'f|JC+GR.I8qXɥ$mm0R4R( Bt>%OU,LRzVqCс5De鮇P&; EQA"I$+4 7MѢ/{)ovCIyTd]yZ(;}ry;E+imaskYJ):G"C(|3J8iSH=8J3) |bp"0< l/M)A #]IGR"%Q: 'K&]e>YE(V [ |?.8yP%|% Z*P?VݾQcb}U૿oƆ)bvH05>r uL'tzf̘*r > T+ j q )[սлzȉd#n9̒uGĿH(Ӵhc8@jo|%?,6]|\Expȏi>$<4v?Y:H|NQHP(;~M c@!B/ I&Px.ɀrRt½-a4e䘤\#ċBJG;zU_bC%@@C˅2yJ%C;J=ݟ+Of,VeҦ2HPAPx K.[eW~}%W{^?uA z҆YӬt$փOE& v,NDImإ4l2R =r#UcD*WV|,2dv2O?h\ReLx$fe/T!wE_UvR/"ͱbIDAT.qyݾxє<2G x>'ZC`XgPQFEt"g]6}*1FS A! ILrɅb:ېLzL_-$%EOIBm/Pۣ[A.7}*# Ϛ\z$77o{Yv:ƍ-&U8ř=q=oɕͭM2 B@ELٍO0UWMUeEf"h*ǁCKHZ*U ֆ@J%s*&RahO_CyK=zv(giy n>뮓G6@:[+1qmX/(YR{EGFcoK% C 7׌t7|J×"F=j@` S G?_k?>)Oyu]! ($cP!D+UH?L%cD-zH+jka.~g>;/NΝ;abbk}qh;wT6o-[| ^TdTI 6R :HǒtB *yo],b]dtg@96΁}܉yt(Me.LLj6qv@7(91eP͛7_eYHX\}%Pv5+n )Lp~dWgyT9?=v%)>_WVPNDш6W|v'[}ILqgEY&p)-"277W'e˖?X elކar%5DYUJ=0(߂gF0٢/$_1F#SnuT~*󈻷fffFk8y-[̭8n)PNZ*d;Nr擁 Zbw^/2 _B;Cp>YbQI0ֻg}}#j6H{J4ιF O~/o]@J/!:lZy'[\5?[lb& ` ܶKUXΓanМLg5 ynݻw3<</[!GkEV +9*1^8bT(MV.(J26f]Y9B> z ~2Zn֟f֓r88U[ {MEr˄R,..2??ϺuhZe+òֲw^G81hkݻz ?%4 B7$1hM8vL$&@t0 @H4._Sz࿦q2lz=lg?䨰OMMed#Bdqq¶8zZzݮ3oUe ǸfN-FFTXЛ4pTVD&Ӂ2AŨjG$&!\⦀\ lx-G9 o=9&\GޑnjXfCg>xd5@nX=P:`]@2nFW\5ϸ>t<7`0Mg8f̚+&^yivnoC ,yawvvBu9Xk)e nICw,Nz.\9[-"׉y|Յ^CTO@bJ&Z-Oa7O @*@2j> 岿!@(n2[m9Nqˏ݊Zpn[3ԍSBm3 t`JQ}ֶKpnI 7;vn<^X* 0:˫9/%\p)-V ?h@{g?u 1o;0%l[O:0 M8mB#FdcUL2'G}JxFT$c[} Xtu5]-cy磭e+ik=;af24 BӴge FJi㱾Β ճ_wkEN6 \@M{LJ병fã%BAa{S+CR+܀b,whJXm:w]k#@"?F>(am̘yhZK'^C+RJ/D".h8WxZH,W)D燕~,/Bf`^3r^r"F^<FjstW,+Oi=i14EPNC5jq=N;CgA<Ȑ0mRJtXNpIrxzŏg|N̸D]L0{S|v8nz$Ha8VS~I/1Y,%PM *2qm3}y{`*T2[\3 2aYjGM?UG ~Eҙ"8r)#_h~ So3'}җt6K X=g,dwl%KH~y8+UaWzdNim+=/rpė9' vfeňnmuu ̝ ˴kvlkmAool:ax]+2L8߾`/FvߢyQ"qlu_GN^t8Sy e8,Owñ[`//Y1ua0MVw {ⓥ)Lc!ƫ~>޸=,GQU1(EOJpS2@Za.z< ܩ=IO8]+14T5T9@H N H11x V_z RiJ:( TMeײAh۶RR2@5R7_n=o1Hgb[~ŴeÁDkHK=Z)_4ir D"0J5@:wPJoLq+n}@77,Ը\ϯqO}Òmfj=]b Hdٕה"X'(/ M,)"sp*t VG)2K2?.F{0c͒;g/փe~;g3H^>-͞S߰ A$!8dH'2@$HC|G$84Hp|'"!!D`2@$$y*eHHOP@dH ij2 KH'⺒"Q!wT- coqy{IENDB`KuttyPy-GUI-2.3/docs/.icons/kuttypy.svg000066400000000000000000000746621456261524100200510ustar00rootroot00000000000000 KuttyPy-GUI-2.3/docs/adc.md000066400000000000000000000025421456261524100154430ustar00rootroot00000000000000# 8 Channel 10 bit ADC ![Screenshot](images/voltmeter.gif?raw=true "Voltmeter") PA0 - PA7 are ADC enabled pins on the ATMEGA32, and the graphical utility is capable of monitoring these. This makes it easy to record expected input values from analog sensors before hard-coding them into C programs. This 2 axis joystick's output is being monitored on PA6 and PA7. Notice how the values change when the joystick is tilted along either axis ## Access via Python === "readADC" ```python hl_lines="1" def readADC(channel) reads a voltage value from the specified channel, and returns it channel : 0 to 7 return: 10 bit number( an integer between 0 and 1023 ) ``` === "data logger example with matplotlib" ```python hl_lines="1" # Read values from Analog to Digital converter(ADC) channel 5 (PA5), and plot them import time from kuttyPy import * from matplotlib import pyplot as plt setReg('ADMUX', (1<<6) | 5) #REF_AVCC | Channel 5 for a in range(50): setReg('ADCSRA', 196) cl = getReg('ADCL') ch = getReg('ADCH') plt.scatter(a, (ch<<8)|cl ,s=5) plt.pause(0.01) #Wait 10 mS ``` ![Screenshot](images/code.gif?raw=true "Recording of the ADC logging example") KuttyPy-GUI-2.3/docs/assets/000077500000000000000000000000001456261524100156715ustar00rootroot00000000000000KuttyPy-GUI-2.3/docs/assets/CH341SER.EXE000066400000000000000000007331711456261524100173440ustar00rootroot00000000000000MZP@ !L!This program must be run under Win32 $7PELxRF @VP@ +.text@6 `.datapP <@.idataF@@.rsrc@<V@@/+P?1USVW}] uuhPAjjƋRGtKtWujfV3Gfftft#0hhiAjeV2jV2jV233_^[]USVW}] uuhPAjjƋFtKt E0jAPjeV3fftIftffduo0jANPj{ЋˋGt50jAjeV27h50jAjeV2jV1jV133_^[]UPPHuESVW}u ]uhQAjjËEt NaAaA=4nAt54nAjhS1=8nAt58nAjhrjiS1jgS01EPVT1jURSjv1jV1j5AjgSMU+AQME+AQRPhDPhPAhQAj0u jgVk1IhjjjjVWa1V}0jjj1S/1t jPj0V 1h@jh5V1Ph.jeSe0E=XAtXARu0EEPATPAHPA4jA%=TPA~HPA^=PAu[ƅ%QAwЍG~Ӄ=XAuRA3҉aA=aA~a=aAuXaA}PjS+A u tj0~PPS*jS*D=aAt aA=aAt =aAuaAjS)33_^[]USVW}u ]uh'QAjjË=t N=8nAt58nAjhrjfS *=4nAt54nAjhS)jeS\)hjh5V)jY)PjhCV)HPAzPPAtP΋A@rA+PPAjS(<5fftftjS(jS(33_^[]SVWUP PHu$dPAL$$+ $(3ۋ $( MC|34D$,P{'uC |  $=@m@@E@f@G @ @ @ !@"@"@"@%@|$n $(Ph&$($($($($($(>$($(>$DL$pL$Lej$4RK&$@:$$(6K$$(؃|${;r$(3F$0UƄ1$3DŽ$fDŽ$$0$$R%$0Q$ty$0P;$uh3S$4PhQA$R '$Q|$tC͍$P$4R$t9tjj$ Q$$0$(3f=~$(<J|$?=LPAÃuQALPAu|$t $( . t3 LPAD$ СLPAT$ LPAt LPAաLPA|$|$$(Rt$%|$u=XAh$(3Ƅ$"uCJ==3Ҋ.u3ɊK\uS$3Ɋ \t;t3C:u$rL$QjjhQAh!u3D$D$P$RL$QjhRAt$$!t$!$t+$3Ҋ\tPA$$]Ts$$"St xu$u 3E{tQ3ҊU}td=wTՋ|K~ 3D t<$u PA3jT$Rh3ɋruƁ]_^[SڋЋ33Ҋ:t \t/u%@<u[S؀=XAte=8PA=8PA3Ɋ \u3ɊJ\u \@"3Ɋ \u3ɊJnu @ B@:uÐUEPu R3]ÐSVWċjg5aA=PAu:=aA[ÐUQSVWE5$jA}=(jAڃ=aAt,=aAtShL3@5aAhPA5A$2@D3@2@2@2@2@"3@43@UNsaAMYjSuYSh6@5aAhPA5A%tER1W΋ӋE$"aAUCaAMN_^[Y]UpSVW}u ]uhPAjjË$t NUE33PjeS(hh`RjQjhpjfSPPR] URdQ0 @PUR& j2 Qj@Pjh j2Rj@Qjh2  PRjPhPAPRPQjjS>V PuFpPRhPAPQ7PPjhSjhpjgSf (jAU(jARQP @RMQ j2 Pj@Rjh j2Qj@Pjh&  RQ^PhPAPRPQjkS2Pt =$jAtEp$jAPpRhPAPQ)PPjiS 3fǃnt1t3jtHt5otHt(Ht(! t)jjhqjfS[ tP VS 33_^[]USVWu} ]VhPAjjM׋ tOt#j=,jAWjeS WjfS KfUfftft#05,jAjPj jfS jS jS 33_^[]USVWً=`At`AMq5aAu5aA u3=iAuWh@VhPA5Ax tiA aA;t`A;_^[]UjEPEZPhjh5aA ]UPS=aAu@E 8t8y ؍EPu R QhPA=tS []ÐÐÐPjUuuu uP] U3ҊU3]USVQ؋E ȋË`^[] Ph@5aAhPA5A$ ÐSVWPPHu$pż3\;3ɋ=$q$q3i7t+$qCPGYtˋ$q$qY$XH$J7$>3r_^[Ð33ɉ3҉HPÐSV؅tttSqY^[ÐSPPHu$`\读PPA$*PA$B&3ɋSƄ$ $&$&$&$Bԍ$B{$B*ĺ^PĨ`[ÐSV,Tt ,u y $PPT$RD fY^[UȸASH؅t}ShQAhh4jAj[h4jAh QAjKأAjdS4nAje5A8nAE4jAAEF E> jh@UjjPy=TPAu$=PAujjh5aA)=aAu=XAt[ÐS33ɍCHUATUAHUATA UACHUATATATAC HUA|TA\SACCSAC$TAC `TACSK3[ÐSV؅t<\SACSAC$TAC `TACt PR3ɉKtS߾Y^[ÐUSVW}] uu @]XAE裼u7]XAE胼uVh]XAEcuFH]dXAECuV (]4XAE#u7 3@VR3_^[] UE@@]UEHt@ 3]U@]U@]U@]U3]U3]U@]US]ssu SM 3[]U@]U3]U3]U3]USVW}U u]G3MURw33 CUSMK SuW3F3ɋW3VN FU QP3_^[]U@] U@]U3]U@]U@]U3]U@]U@]U@]U@] U@] U@]U@]U3]U@]U3] UE]U@]U@]U]$S؍D$PR?SRh4XAjjL$Q.CtMThXAP|>SL$QP $R QD$PhXASR |D$PR L$QP[ÐS؃CtrThXAP|!jL$QPjT$R Q $PRL$QhXACP|L$QPT$R QD$PRKQP3҉SYZ[ÐPUQS؉SK E C$US(Ct)URhXAP|CPPUR QEPR[Y]SVQCtaThXAP|Rt/sVsjSjjD$PR,VsjSjjL$QP,jsjSjjT$R Q,$PRZ^[ÐSQCt4t0ThXAP|!KQsjSjjD$PR, $QPZ[ÐS؋Cu3[PRC[Ð33ɉH33ɉP3҉H P@@ÐSV؅t{ttS9Y^[ÐUSVW{uj'CCjV׋"MEKPVjURVPjCtP[S3jVPU+URM+MQuE@Ph@jhTRAj{tjWs{uwCt P3҉SjVE褶@腵U ׋u ׋׋؋etSVxS_^[]S؋Ct Pr3҉S[ÐSVWЋ303G(G$G@G Ww3ɉOhjG3G G$3G(TRAW,W30_^[USVW}u ]HtHt*t4|uNNjPjS?jS$E.jSjSϋfWuVS|_^[]SVWUg{~ kj,޶Yt {tnՋfRACC,CCt&C PhXAV|jK QVRS]_^[S؋C t PR3ɉK CtSR Q3C[ÐVpt RQ33C^ÐSVW܋3$3҉T$.H%+='wKjjjjD$Pt$jjjT$R`L$Q D$PTVRH|<$t3ۃ<$tBD$PhXAT$R |+D$PR |WL$QPÃD$PRÃ$_^[ÐSVWUP$ 3D$jjjjhRAW R Q,$=D$4$lmUj@-D$ t$ wD$D$P|$,uT$(s3L$RA7|$t%RA蝲ƉD$RA߳$C3 tRA藳ƒT$|$tS$D$ 蛳|$u RA舳|$u ֋l|$tl؅t]USjVjjXVD$jjURjSjhuD$а|$t FFT$_L$Qjt$|G T$YGL$QPİ]_^[ÐSVW؋g@Q$<$u3Y׋X؋4$:t$3 t u;4$t 3ҊV t FGW3҄t*3&u!33Ɋ ;uP@}<uu#?t3Ɋȃ u;4$t 3ҊV tFGt 3Ɋȃ<nRAűD$|$uSA衱u F F|$t F FSAru%SAGZu!?uGt 3ҊЃ>u3Ɋ>uG?>$YZ_^[Ð,3u@|B:u3ÐSVWU諯@茮SAqOSA<u,SA>կ3ɊK u 3C tC/;s%3Ҋ u3ɊK uTSA>蔯 7FC;u7N׋臮]_^[ÐD$D$D$D$D$rD$XD$rD$HD$2D$D$D$D$D$D$D$D$D$D$ND$D$D$D$:D$$D$D$D$D$D$FD$0D$D$D$D$D$FD$,D$F33ɉH@ÐSV؅tStSY^[ÐS؋ [ÐSVWUPPHu$0؋ڋ$,\u1hL$QjD$ \t@@ D$ 3$ CjjT$$3u$ h#$3ɉL$$ ٝD$Ս$  覛3|3D*u,3ҊT*u!xUAEù ݬu \$$P3DRu93ҊTau.UAEù覬u$ 詖dCO;yD$ǃRP$3ZD$|$@} <$<$u$ R F$RP$3F)u$ F$ NgF33NjGt|\uY;nt0"t:t4rtt"(\""   3ɄtGB t u B;~wV$ @,0]_^[ÐSj$jhUAPtC.jhUAL$UA"UA說K[ÐUSVWM>U rt JtUA UAUAЃ~;}tE莩ȋUb;؋yȋ׋N;UShUARҪ Uy؅uUm؅tHs 8t+Cˋ֋E蜩E"E t;}t ׋E`_^[]3ÐSVO:u.VC膩u3ҊS=u3C "u^[Ct 3ҊЃ uC3Ɋ t;u3^[ÐUĬSVWMEEPUEM؍EPVURVM+MA+MĉME+E@+EȄۉEt=}u7EĹdmȋEmdMEhPQjjjV}u8hPVajuERVj)EjV}3hPW t&juE]RWZQW+E̋Uy+¹dmȋ+E+EmQdYE+@mQdYE܋+@mQdYhPuuQjWjW#;}tFt _^[]USVWUujuٍUA_*GtG d;du >du3_^[]SڀxtjSw @PjS[Ðl=UAu $TD$T$UADrA=UAuDrA3ĔSVQ؈ $3$PVSPZ^[ÐU0t t&ASEAQM]SVWT t3Z\$3҉T$L$$L$ t$D$A3D$3҉T$L$Q؅u3WSSD$PR(_^[ÐUĬSVWUE} t&׋o@؋׋\@ظ[ЋƤ?@غUA谤)@L؍E3蔣ELEEAUMuEEE܋;uRhyME }t EP~ EPk؅u-Z=0u!}t EPM EP:؅_^[]SV3ChUAhUAtC$D$hUASthUAVtTVhHrAYZ^[SV؅t4tPlCtP_HrAR QtSSY^[ÐUu]fǀǀ ǀ ÐSV؅t  tPtSY^[ÐSV؋֋譢fumǃ ^[SVWƆ;u3 t VӃ u!3nVӋ u3Q } 3҉ HUA"tUAu 3ɋ֋S_^[ÐUSVWًƃ׋t3/Sϋփ+u3P  _^[]UlSVWM] }tEf8tUu?PR uMRt tu3(RVul]Zǹ,3ҋ3RP3$T$   ޥ  @ l  fǃt?tgE u:lPR:uHtu3(lRVuT՞Þ荤3ҋ3RP3$T$  l hp tx|Nj1 p@ xl  t fǃ_^[]SVWU3/%tk=AtA蜦F؊u˅t=?t63Gt(߀=AtA]CW;uG]_^[ÐSVK|^5t C^[K}f>tF'tF^[ÐSVW؋;u"=AtAϥF_^[ÐSVW$33t%3ҊS.u3ɊK.u3Ct{C;u>t3Ft<3Ҋ\u33ɊN\u)F\賛؅tC\蠛؅ts%ts 3.uCu;t ?t3.u3ҊW.u u<$tD$T$$蓛ǁ_^[ÐSVW$-tf{.uf{.uCot{f;uzf>tF`tf>\u0f~\u)F\3؅tC\ ؅tstsf;.u ffu;tf?u<$tD$藢T$$sǁ_^[ÐSV؀=AtA.蹣 .^[SV؅tC t3^[ÐSVڋtf;tUAx^[Åu3UA^[Ð\t /t3Ã:ÐSVW؋+ÍV;~N +΋Ӌ螙7_^[ÐSV؍F;r3Ft;rK^[SVWUǘNN3Nu;rK38tQ;rK3%t=F=AtA. .ht;vK;s 3.u]_^[ÐSVQ$؅uVAg5{t"VAC t VAC u VACS<$uL20K;w 3Iu覗;t PH;uC1_ 3:tP3Ct3Cu VACؗ%3ҊS.uA0K 3:tZ^[ÐSVW?ttG:t3T,% }3B=AtArF؊u΀?tVAt3_^[ÐSVWUQ$UA^<$tE$E+3Ҋ蒖u<$t 3Ɋ }_+H~ 3Ҋ:u_=AtA֟F؀;uZ]_^[SVWUًt;t;wVՋ胖9%/uu\+\=AtAaG؊uu]_^[ÐSVW3 ؋A|Z3F8u3_^[ÐSVWt3ҊRhVAWÖ V3Ɋ \uM3C\uCC\6t0F\#t+F ΋Ӌ脕7_^[SVWUQ $3݀=AtA;薞 ;ܔ؅tC蒖<$tt+;K؅tu C葝<$tfZ]_^[3҉ÐSTRD$PT$RL$ D$CT$SL$K D$CT$SL$KCHC  VAS @;Cr{vtC fD$T$RL$Q[$+D$Cà [SVffD$fSfT$ fKfL$fC fD$fSfT$fKfL$fD$TD$ PC$;$vD$VT$R^[Ã8u33YZËzD$3ҋ3RPD$3$T$YZÐ; u0H;Ju(H;Ju H ;J uH;JuH;Ju@;Bt3ÐSV؋wRPn;T$u;$^[SV؋֋u֋pu3^[ËPH ыH ыH ыH- ЋËʃɉH?H H HH¼3҉PÐSudut3[ÐSVWڋttf;t jSjVtϋӋ3Ptu_^[SVWU3L$$D$<$t$f:t ou3D$ D$ 3t+=}?uD$ t$fte3RP3| W>e3RP3u|TVA9 tϋ֋u3PD$辍XjF~ISPP@t9kNjP3ҋ[͋蘑ӋkpЋ#~PD$RX]_^[Ð;P~ +P?ÉPÐSQ$غy C$TZ[Ð;P~ +P[ÉPÐSVWSSC;}>ȅyȃ ;}s֋蕉;u AYs_^[SVWSSC;}<ȅyȃ ;}s֋C;u AEYs_^[ÐSVWUL$֋3@u3^<$ÙÍSD$ˋT$OL$fYSˋD$軏.Du؋ƋtT$ӋRD$|=t93ҋIkNj)͋zӋMRЋÃ]_^[ÐSV؋ه;ut AXss^[ÐSV؅tt跇tSQY^[ÐSV؋#VFt ɋ ^[ÐS؋t f3҉33KC[ÐÐSVW؋rXVA !hX>>0 D p  t iK0 D Mp B 7 ,ulj3Ɋ!3S3ƃeƃeƃeƃeƃeƃeƃeeX>ƃeƃeƃe>3ǃeǃeǃeǃeǃP>ǃT>ǃL>>=ǃ>sfǃ> fǃeǃeǃeǃeǃe3eƃ`ƃƃefǃiƃeƃeƃ>_^[SQ$؊$u&x%PSOAMWZ[ÐSVW؋ϋ֋8ru313ҋgu"xѴPSR1s3_^[Ð3ɀ:Ru-zau'zru!z!uzuzuzu ƀeÐSVWUЋ؋ù$<>ƃett33҉e֋tejj3ҋu D$kpvL$T$@t3;D$3Ҋ0RЋt}et?~;}6~1+D$3ҊRuR3ɊHSuH3ҊPFu>@Xu5 >3҉eR3Pueu<>s F;Yeu3PD$XrD$fef;>t)|߲PSR a<$u3>ƒe>e>e>ƒe>e>@e>ƒe>$vAoT3yet >t3e>t eD$ eL$eL$eD$ eD$ƃe>zuGTVAL+ƒtƃeKuetD>u;ƃe2tuC>uet1>r(>uƃefT$D$ eT$eL$ eL$eet euSe*i0]_^[ÐSV؋o;ut APss^[ÐSV؅ttKtSY^[Ðee3qSVWU؅tTK0 >0 y3ҋktSmY]_^[ÐSVWU3!Euf;>u$Wtt{t̓>{u3]_^[ÐSVWU/>zuLtt >{u3]_^[ÐSVWUPŁXvqeeD$4yete3;eu ;ev~3`ֹnt3PD$8蔼Xh u4hρUulAPjj>$ Q΋ǁljD$LD$4:x|$D(r$T$ee;T$u;$wee;T$u;$v*~&g襭PUϹAO3PD$8脻XX>D$4KxT$D$4"x3ҊT$>>D$4#x>D$4xf>sIh\VAhPUR=ƅe AuuD$4v5>su>tD$4v>D$4v>eeee>stIItht>>>>>>>D$4v>D$4"w>M>D$4v9>K>K>KKtKD$4vKKD$4uv>tu>K>>F>FV D$4gvVD$4[vVD$4uVD$4CvVD$47vV D$4uV!D$4uV"D$4uV$D$4vF tV(D$4uV,D$4u3҉V,V(~u 3FF,F(3ҋ3RPF 3$T$ F,3ҋ3RPF3$T$ f~"s~"T$PD$4uD~tF $PGD$PRzV";u10D$P ׍0\׋+*N"@0+QRhL$\ȍ$\T$\Gf0uff fdž0qF t< D$4'tD Vq33p 3҉ F 'T$D$4jsJ$K$d$hPK|K$l$p3D$T$dL$+L$|$|$tT$D$4"sT$D$L$VW$| _^t$3$|$ 3;|$ }-T$$D$4yrO3+L$ D$$ $G;|$ |ӋT$V$x ^D$|$ eeFL$%D$4T$%rfffef;>ts~zu cVAF0TyƅeABIF0PhPUR (>tT$(D$4qD$(3eeD$43Arff%fe>>D$8+D$Deef>f;e3ۃ>{ugKt^$IyhD$,T$0D$,T$0RP3ҋg3it3F|퍄$yuI]pSϥPS 2dƅeAG3PD$8裳Xzee;eu ;ewJFh\VAhePUR菱ƅe AG3PD$8=XD$DPD$8'XĨ]_^[Ð>%=ƒÐ>w >u3Ê>r^tt+>u ǀ>ǀ> >u ǀ>ǀ> ÐSVW>s>t f>>r)>%=u LJ> LJ> >/3/t\u\=AtAn~F؀;u̍Bff/tf\uf\f8u_^[ÐSVWP PHu$Ĕ؋$fef;Kt-ooPS虯AE3-L<0r <5w L$vp+PSU3KuKuhn֍D$*D$3_u K$ $ƋKrfKt_t9tX3QjL$ƒR3ҋƊLq3PD$X-K3҉D$T$L$hƋL$Ӊƃ`qK.ƍKP83ɉHet"}tS0EEFMUBsu3_^[]BIrUSVWhϋ֋BLsu3_^[]S3ɋ3Ҩt B|LvAA|[ÐSVWLvAUu32N3@څvu33Ɋ˃33ɋڊ33ɋڊ33ɋڊ33ɋ3X33ɋڊ33ɋڊ33ɋڊ3Ӄs32  3ˋB;w]_^[RFÐUSVWMUEE8} 33iƪlzAUm}u kUU}zuK>M}tt}zu E@u3UtH}tBEx r9Uzt0EP;tMr0Q{PSR襤 ZEUVfDžSi>t eu3fJqN;v3gjt3FYjuڍ;vNh++E䍅p+E~$Ѝѹ+ȋInfDžEE}uRShEjj3ɋMSthfDžIM unuE(fDžjjR_}tDw谖PRעSjjRuu3ҋ9X3)T3ҊUTtSF}t U!>tu*Yee+KKRP3ҋWtt}{u Ƈ4MAU M؋ M܋E؉G E܉G$YLJLJLJ_^[]wu3ðÐS؀=|Au [ÐUSVWUUE3؃|܍S_@r3 L@|U܋>u_^[]USVډEt3UEعOeyuu~dMӋE"E1EU1UM1ME1EËU؋HM܋PU@ EEUMHUPMH ENU؋EdE^[]SVWUԹ $3D$D$ D$d3339$3,$\ |=<\@|BA;T$}|уuF3;T$} ~ D$3ҊT |A0D$ T$3D |A0T$ D$3ҊT |A0D$T$3D|A0T$D$~A0T$ D$|$t1;T$3\| 0@|B;T$|3\| 0@|BD$y;|ڋD$y3ҊT|A0T 3ҊT |A0T 3ҊT |A0T3ҊT |A0TB;T$}3\| 0@|B;T$|3:%3<$|\ @|BA;T$}|ЃuF3;T$} ~ v,]_^[ÐSVW$33ɋ֋$3ۃz<AA2zR<AA22TA|@|ƍT$$bF |_^[ÐSVWLT$$D$$D$$D$ D$\$ 3D$\$ @3CBD$\$ @3CBD$\$ @ 3C B 3L$AD$3B AD$3B AD$3BAD$ D$\$3\$3\$ 3\$AD$$3BAD$(3BAD$,3BAD$03B AD$4D$(\$,3\$03\$43\$$AD$83BAD$<3BAD$@3BAD$D3BAD$HD$<\$@3\$D3\$H3\$8A D$L3B AD$P3B AD$T3BAD$X3BAD$\D$P\$T3\$X3\$\3\$L H4$;3>:{3~z{3~z[ 3^ Z z 2A|$`z A|$dzA|$hA|$`637|$d37|$h373YzrA|$lzA|$pz A|$tA|$l637|$p37|$t373YzrA|$xzA|$|zA$A|$x637|$|37$373Y z r A$zA$zA$A$637$37$373N$$$$$$3$$@3CB$$@3CB$$@ 3C B 3}A3B }AA3B }AA3B}AA3B}AA3B}AA3B}AA3B }AA3B}AA3B}AA 3B}AA 3B}AA 3B }AA 3B }AA 3B}AAR}AA$$$$$$$3$$P$3QP$$J$3HJ$$A $3B A Ĵ_^[ÐSVW3֋Έ4@ɺƀu33u3Ҹ~Aɻu3ˋB|3t3Ҋ3Ɋ+43΋3ы3ы332рc|AAAAAAAAAt3Ɋ L3Ɉ A A A AtL3Ɉ A A A A΋3ы3ы΋2рtB΋3ы3ы2ѹ+ʊ3҈}At3ۊ\h3ۈA3ɊʈAAAAAAAt3ۊ3ۈA3ɊʈAAAAAAAt3ۊ3ۈA3ɊʈAAAAAAAt3ۊ3ۈA3ɊʈAAAAAAA@=8_^[Ã=qVAqVATj PSD$D$D$PhrVAj$t*jjjT$Rjt$tupVAL$QhVAjtjjjD$Pjt$Ŝ4$ÐSV $D$讕T$3ɋuD$蟕x=pVAtT$<$t RPt$耜RPVpu1VMPSw A)As)D$%^[ÐSVWUPPHu$0ً$ 7tf;t D$ `T$ ^f|$ t+f|$u#VA$ _T$ $_T$ $ _$ _$$ XL$$Xy$ g_=|Ac(n͋֋D$]fnf>:tA6(AF˻$$_$PS$|Gj$ӋMD$$tȃӋ$ $ \$$@$ $ $$Ct!$$3ҋ$t $$C$0@|$ts@TT >rD$$PÍT$D$$RT$C%=u؊$RT$3>rƹ3ND$3 Nsƹ@3M3ҋMC3MD$ 3M<$t ֱ"_^[ÐS؋*B3ҋÉS [ÐSV؅t!s OY3ҋBtSOY^[ÐS؃{ uhOYC [Ð ÐSVWUS,FHM{ }{ tF ϋSM +;C$vC$ +DžtV ׁʋS LF,3ɉN0{ t{ ;K׋uN %<r3ȉKHSLCV 0s N 0t o@Ca͋V CBL]_^[ÐSVWUĬL$$@x}$C8u~ P Hx C8uP HN H ( $@N@|@@N@@߲@@U@@@@J@@մ@ @?@t@@޵@@,@E@@@ö@9@@ @F@{@@ʸ@@@@L@@ܹ@c@>@4@{t{t {t3Ɋ {t3Ҋ{t3Ɋ+u;% ȉN0 {t3ҊT${t3ɊL${t.%;D$ƒu t3 щV0";D$ƒuȁ щV0{t{t3ҊT$ {t3ɊD$ +u;D$  щV0{tF0;D$rM3x$yF0U;D$rOM3C$D{t3@{t%{tuЁV0{t3H{tuЁV0;D$rM3${t3Ҋ{t3Ɋ3ы…uЁV0{tE>{t3Ɋ{t3Ҋ#ʋuȁN0{t{t3Ҋ{t3Ɋ ы…uЁV0{t{t3Ɋ{t3Ҋ#ʉL$|$u D$%F0iF3_;T$rYM3M$NF3*;D$r$M3$F0;D$rM3$F0;D$rM3$F0;D$rM3y$zF0V;D$rPM3D$En,F,%V  F,%V F,n,+$(@V,N ;D$rM3${t{tЈ{t3Ҋ҉{{t3ɊL${t3ҊT$L$D$L$IT$t3҅uȁ щV0{t {t3ҊT${t3ɊL$ L$ D$L$ IT$uȁ щV0{t{t3ҊT$${t3ɊL$(L$(D$$L$(IT$$uȁ щV0{t<5{t3؅u ЁV0{tD$,3V,ʁ~ L@|n, D$03V,ʁ~ 4+_|@rn,F,%V N0 tF,%V N0F,ZPF{t3ɊL$4{t{t{t3Ɋ{t T$4T$4{t3Ɋ{t3ҊʉL$8{t D$8L$8{t3ҊT$<|$<{t33t$U}t}vt}yuƆ}zuP>Ӛ>*(fDžEMPǍ>;ƒU}t }uƆ->t /u3M}t3E}tKBC-t Џtg'誊tG >tU&td}u^&uE3蠑&J;u肑E_u &~E>ƒƆee+KKRP3ҋEEE}ueM' E3PUI!au3< >tX0uOh0u0jEZYRs{TP-ZƆ3 %UE u3ɊMXu:ыu3U}tƆ3ɊMEt uE詇Ѝ,&U&3#E}t93Ҋ_u,38t3ҊUA|3ɊMZƆ:}f t ,*E}t fdž3ҊUEt uEYЍ,Ux,}t.f_u$ptfdž: fdž}u}u >t3U u tw3ɊMEt 3EXuc Lxj UtJ 葐tE tE>t0uAEE>$tC>t:>0t1lQQPSR]E A. >_x}t3ҊUPt3ɊMEt uP& X}tP X !tP Xp>UEUcE߀}tIU謓臓u2u M3QKK>EU>U荏u ƆZ}t>URƆ7PoPPSR>\ AA :tE&u3PKQ&u3$K&u3JܐPm XV!t }tE3ҊUEt3ɊMX+}!!u EݍPKK>BE}SAA "蓈VNPSRZRш3jE PKK>}tESA}uet EEE}+}uV}uJ3ɊMPt@bt1RMPSRY SAI $3dždždždžeuI dž>tJ3Pj>$ƒR0>t 3Ҋ>3ҋKӉMԋKM؍EԉF E؉F$>EF)EF*}u{eurKK ;Ku ;KvO~KKuKr|;Ku ;Kv~KK=3Ҋ!وMӊEӈ!u}t3Uҍ QEҋP%#t U҈x>uo>0uKK]QKUȋKŰMȉ`WM̉dWƀtW>3Ҋ>RA{t5E}et ;>t}eu>; tcCE>tpRKPuAW qRJPu"W EA$gW}3ɊMXt3EE>蒍 t>߀}t !}t &u3PKR&u3$K&u3J9>&u3PK&u3JƆ}t(u{u3$}ueu W }u3_^[]USVW}jOJ؅tCt>3;U u;Es|E؋ˋ} u}r|3)EU 뫋ǺW_^[]SV؋;ut Ass^[ÐUSVUE}utEE}uE֋^g}u}tU3U O}E} uu }PEMT3ҡ@WAU+@WA@u}tU3 uUǂ u }tMEǀ 3uN B{;u1{ t ֋k^[]SVW؋=v3`|}u {WVS+PhKWAT$R3ҋu ԋ@B|3F뿰_^[ÐSVWPPHu$ 0ڋ$$ 艂$@ }$l qjL$Ӌzuu3M<$t $ u36ay$ 豉tJy$ 蚉t33ۋǹ'ShVWAyP 3t {'|ċ3̇t3$҉xP$xZpW$Q.[u3l$j33ҋgu$3ɋ+؍$PWZt$$P$[X$_^[dWA3@@fǀ@@P 3@@ 3@@ @@SV؅t7dWA{t{u{t btSY^[USVWU3ҋE  {t}t@EtM3{uEnt!tf>tjujjuWVXjujjuWuXu Yu ǃ 3҃CS CM}tK{tH fǃ}t CUTSSE_^[]Sjjt[øA3[ÐSVWmt$t f>tjjjjjhVWCjjjjjhW}WCC3C Ctp fǃt CS&S{_^[ÐAt3҃<uB|Sڋ&t[øA A?3[ÐSVWUA~ t3F _~tW~u3W~VÃu =`WAu3;tu3҉T@=|Fu~t VAO ]_^[ÐS؃{ u{u3[Ã{tXC~[SVWU$ G tHtHtjVG jVG tL3;~bjD$P+Ձ@}+@QD$ PwVÃt(@;jD$PVt$ wVÃurtl ufWAt?L$;e|$Z`RPD$ 3)$T$XZRP3ҋ2OA3TGYZ]_^[ÐSVWU؋A${tD$T$ϋ$ǃ {{t]33;~wƙD$T$RP3ҋ+΁}+ȋ$Ju;"{ uSvZSHŃ ]_^[ÐSVWQ{ u N~ NjTCjD$PVWsTu<t N~ N׋{ u(Tmu3$Z_^[USVu u֋ u{t SA1^[]UQSV{ue} u}s)}%t!Nu N EU EU 3E EVUREPsTu kSt3^[Y]SVQ3$jT$RjsSu'3St{tSAj $3RP3$T$Z^[ÐUSu u3ҋt,jj3ҋ[]Q$Թ7$ZÐSs+S[ÐUSVWE}t :u3t >u3Mt ?u3MtEȋ‹y}t U}y}t UmytM3Q}tE3P}tU3REprR_^[]Uu!]U썐M~]S؋ċjjaRPD$XZ[ÐPu3R5Qt t3ÐSVWA`WA3t&@xt0t3҉3G| `WA_^[Sh YC[ÐSV؅ts YtSo Y^[ÐPPÐSPHL ыHL ѹ+H[øAnA]øA]ÐSVWQ $$D$|$t3Ҋ 3ɊQ=QЈT$$D$F|$t3 3ҊRQȀr)t,t|$|$3u3ҊЃ.3ɊN*u ~u. ~ut xt3tRoWA u@G.N u/WF $]NG $t7?u3.:D$t"3ҊЃ.u|$u $׋ 3GZ_^[Ätr }U}t |]SVWUÃ&s $t2SL$Ջu $D3ҊЃ\t /tuT$o$o$ˋ7utu$D$t3tuvD$3otˋՋht 3ҋnt+|$t>SD$ȍ$D$t3R$D$t38kkjhWApu3 ˋ֋]_^[ÐS؍ "d!s!sy[Ð33ɉ3҉HPÐSV؅t-*3ҋ8 tSF Y^[ÐSV؅tttS Y^[ÐSع*3ҋC @33҉ 3ǃ  ƃW!ǃ&3 ǃ!ǃ!ǃ!ǃ![Ð菘ASV؋Cs 3҉S3ɉK3C^[SVWUQ{tZ{+CPZ+…~CEË$|׋͋C $͋C-<$u3C$st֋{S΋C CZ]_^[ÐSH;H}  @[[ÐSVHC;X}0 Lff@^[f^[ÐSVHك;X}30t ދ0tދ0Lى@^[3^[ÐSVCI;K} ȋΒs^[Ë΋3^[ÐSQ${~ <$tKK Z[ÐSVs@語蝞^[Ð33A A A$A(A)A*ƁƁƁA,3Q03҉A3Q43҉ǁǁ33҉ ǁ33Q8A<Ɓ33҉ÐSVWU3$D$$3T$k,3;S$u;C v ~C ljD$ ;tKS$@s3CPC,xuL$ T${8tC8>@tL$ T$8t$t$ƙ+)C S${$u9{ u3t*Qu ƃ|K,t-eeRPt4t$t'uƃÀȋ$ӒLGƃ]_^[ÐSVW{s{ t;sw&΋׋Cs)s{)u ΋׋C0l3{*u΋׋  Z_^[ÐUx(t>x,t8P,MMM MKKuuuu^=YY]ÐtP,tH0ǀÐUSVWU }t"9u3Rj@URы&.9t3ۉRƒRURы_^[] @ PHÐSSjFP'F[ÐS؅tSjEPF[ÐSV؅u ^[VSjEPE^[Ð$jD$PT$RG4$FD$jL$QD$ PFD$YZÐV3;v0F;w^ÐSV3;v 20F;w^[ÐVW:v_^:s_^@F׃w3_^V;v H  H}^3B@uÐ ;t @u3ÐSV؋H|3Ҋ;u^[H}3^[ÐVW33 :7u>_^A uF<7u3_^ÐB@ uS @:t Bكw[ÐV:v^:s^Ät@F3^ÐVW:v_^:s_^Ät @F׃w3_^SVjVjShhC^[ÐSVWUًVUVWhhB]_^[ÐSV؋Ë^[ÐPBÐUS]EPu SEm[]Ð0|9~3UEM]ÐUE=]ÐUE]ÐUE ]ÐSV33ƒC3u^[ÐBÐSV3MCS ÉS ^[ÐSV؅t) ;S u ss3\tS2Y^[ÐS؋C&C .[Ð33ɉ3҉HPÐ33ɉ3҉HPÐ33ɉ3҉HPÐSV؅t5C -Cu3ۋ^[ÐSV3;~r\rf8tF;^[ÐSVW3;~4X|Xff4ZftC;_^[SVWIQ@u(0$? @uI0x ? p? ރs0xxus? p? p? ރIxJv3Ix?w7f ff2fff8f_^[ðÐ3BffuÐf ff fuÐSfffftI[SV؋^[Ð ;t ffu3ÐSV؋wH|C;uC^[H}3^[SVЋt^[Ãffu3^[Ð3ɍ уЃff0rf9vߋS؋[ÐSVTjE;<$3S;C|^[Ð3Ɋ <tBBÐS<t 3ۊ;u[Bu3[ÐSV3<t 3ۊ;uBuދ^[ÐSVWV3FF3^;~.-K3V ‰FG|_^[ÐS؋[Ð3҉Ð8t3҉ÐSVW;3uQƹ 3< :uAf3׃X3_^[ÐSVWU3P3ƅy3ҹ kT3+3ҋȽ Q3ҹ Ylmꋓ֋ʼn<ЉT\3T@B|B} T@|B } T@ |B&} T@&|3ɉȋш} 3ɊLr;D*B|]_^[ÐSVW򀻪u1ƃtƋ @&uH3ҊT3@\+PR;})\)TT3tЋ9 $ $Dt+ƋR3ҊT)t;t8JT$|$>|$t։t$t$4v+‹D) $ _^[ÐSVW;t3ɍT$T$ T$7ы3Ӎ\$Z[ZST$f3ۊ\fZuA&|T$CqYsq^fIfJZ If9uqށ|‹RL$;uJZYZKZ~(ʋL1Lʁ3ɊL)t;t4ItV_++[N4$ߋ4$34$T$L$;Z_^[ÐS؍Jn3҉D3ɉL3H[ÐSVWU3ҍleJ` }` ڍJJh;t &t֋ 3ҋЋꉗLD3EJ`\fDfBfPt$$ $OT$3ɊL3@;wD$3ҋÊT3ʋ I)DAPhd3ɉΈm }%DvFR B3DBLB|333]WAVf@,f+Ћ@fhp |C|F|33ۋƋ ƒ L$PfT$ffC@|F|ă ]_^[ÐSVWƃl `ƃlƃmn  w 3l@|=}JluGF@=|荃l @3 ƃB_^[ÐSVWUČ؉$D$HD$$P2Ѝp L$fJfL$ fNfJT$fT$fV;CuɋSBfCSp+֋ $\L$ L$ HfKp+֋L$ HfKH:Hv>L$fHfL$NfNfN;st N:L$rL$fL$fNL$uxD$xtfD$T$f)ffulKD$ fAfD$$3ɊL$!(L$!L$$AJSL)2$PD$ fD$$fC+fST$BT$(@D$,T$(;T$,4$D$({D$0T$,ƌJT$43L$0D)D$8T$4l);l$8u`tjl$@T$@L$DT$DD$@ ׉D$DD$~ N3tJ ‰tJxJpJpJxJ3ЁrxJspJفxJu\DJDD;Kv;Kv.;Tt‹ӋupJPP H+H HHPFP\0u(PP;KvPALDkl u[ƃl l3@J?~O3tJ ‰tJxJpJpJxJ3ЁrxJspJفxJu]_^[ÐSVWUGpJJ3҃EMwEPZE+E3;Jr3p3ҊV;}T‰J;J3ɊȈm dPVfG|~ Ӌ<3ɰ|JPu3ƃm HoHulP3l n |J3Ҋl lTH3ɉP3Ҋl Hlu鋃JJn;}J3F+Љ|JދÉPPPfGK:KvCs$fCfD$fVfS $fL$fNP{|v ՋYZ]_^[ÐSVWځ+TD$ËL$L$ f>NT$ >k +>;L$ k N;ыT;L$ 3Ɋn :J|$fL$f) |$L$JǀJ@T$T$F3ɉ $3Ɋ l:l t3ɊH $L$u׋$pJJ3ҋGOGPZG+3;Jr3 T$; $3<$x<$<$;}$J3ɊH+щ|JT$zs1L$IQu#L$fL$fT$JBL$QЉPJJfFx|v Ӌ(l hdX$|JJJ+TD$ 3l lL$uT$fJfT_^[SVWUĠP3$fPfT$|$DXf;tus:$tZ: $uF:FrHt$VT$L$D$fAfD$ L$T$fAfBT$L$ fL$ fJ~ssFfCs~ F\u2β#PBLDD KK $ KD$;K|$tMK;T$r3ҋ"D$\u9T$T$L;D)KPL$JDD$DP3L$ D$+H+ЉT$L++KՋCD$$T$(JL$(3D)3ɉD$,T$(L*L$0D$,;D$0u T$$L$(AL$8D$83ҊT)T$UC?Uڃu_^[ÐSVW3ۋ0H1HL1 ًHL1 ٹ+H;Z$sa;Zs1;Z s;Zs ;Zsx;Zs;Zsg`;Z sTM;Z4s+;Z,s;Z(s 7 0;Z0s $ ;Z|U܃,NjN.|E܃03lEEЃ=ƒt3PEкٽXE/v3PEк豽X|F,W@;s W@+ЍF(?N(@3DEЃ=ƒt3PEкfX1E藽EкpC;wPEк3X_^[]33ɉ3҉HPÐSVWSSC;}?ȅyȃ ;}s֋;u Aޗs_^[ÐSVU+}3^[=@~!~SȋΒM3UUS+΋C D~UU@U^[ÐSVWU苓UU+%?3U@L4C~ t F 4 $NL$ $+ʁ?;;$t $$U+%?;D$$T$?T$ $;L$r|$ut$XWL$L3轊7@+,$UXWL$L3蛊t$LXW脊F4L,E@~!ЍF8FD$D$ D$D$VY@L3#@Lt ;$;n ~ ULL$3aF4L,E@~!ЍF;MU@F@Z֋iF@~,;E~UʋЋ:NV@E@EySVHGT$ @LnL4t>FD$D$ iD$XD$VY@L3W;DL͋T$ C ƃjW3lWpWT$U+%?,@L t y tA @;DL|U&G;DLUUU]_^[ÐSV؅ttktSY^[ÐSVW؃~~GlWLFDlWVȋǃ$SvpWЋNjV(9vNj4v_^[SV;tƃjW;v4ʋXWف?‹Ћ4΋XW%ƃiW^[Ë΋XW+‹Ћ^[ÐSVWpWlW;dWu ;`WrS}Q΋`WdW+lWpW$T$;T$u;$v ~$ȋ׋C ƙlWpWYZ_^[ÐSVWUXU|$;}Lu3+V$ĀtdžTWKF J33҉TW3ɉxW|W@uU3豶3ۋ輶 ŋƁ荶uG蕶 ŋƁfu C̓~|KňC|jTT$3ۋU;}%u3`TA}U$C}Zu 蹵%ĵ  蜵L CŃ~_|Uu臵 _"j  BC̓~|Ɔ\L;U~3gh+`L׋j4L@LSoftware\Microsoft\Windows\CurrentVersionProgramFilesDir%s%s%d.lnk.infInstall.exe..Software\WinRAR SFXRarHtmlClassNameShell.Explorerabout:blank


 ?@@@@@@@@@@@@@@@A@A@|"?*%c:\CMT{@???RR- ???SeSecurityPrivilegeSeRestorePrivilege.\ACLSTMFFF))EE FFFF))))))FFFE @ff5hW9~<x?i7}],煼(`ŹFrarAVDWAYNANRC%.*s(%d)%srtmp%d@__rar_*?On  3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3DA3D3=wD3=wD3=wD3=wD3w5wD3w5wD3w$gwD3w"Wwu wD3w gwgw` wD3w WwS7'u wD3wgwS37%w` wD3wWwS33r%wPwD3wgwS33r"WvwD3wWwS33 r"%wPwD3wgwS3 3r"uwD3wWwS3 3r"uwD3wgwS3 3r"uwD3wWwS33r"uwD3w gwS33r"uwD3w WwS33r"uwD3wgwS33r"uwD3wgu3r"uwD3wg3r"uwD3wg3r"uwD3wg3r"uwD3wg3r"uwD3wg3r"uwD3wg3r"uwD3wg3r"uwD3wg3r"uwD3wg3r"uwD3wg3r"uwD3wg3 WwR"'PwD3wg3Wwgu"'PwD3wg3WwQwR'PwD3wg3WwQWu'PwD3wg3WwQguuwD3wg3WwQWwPwD3wg3WwQ guw4D3wg 3WwQ Wuw3D3wg 3WwQ WwPw3 D3wg3WwQ WwPw3 D3wg3WwQ WwP w3 D3Gwp g33WwQWwP w3 D3Gwp g3WwQ WwP w3 D 3DwgWwQWwPw3D 3DwgwQ WwPw 3D 3DwgqWwPw 3D3 Dwg WwPw 3D3 Dw gQ WwPw 3D3 Dw gWwPw 3D4Dw gQwuw3DDw gwuw3DDw gwu w3Dwg$w3Dw5w3Dw5w3D3=w3 D3=w3 D3=w3 D3=w3DW3DX3D[3C\3]3]3]3]3]3]3]3]3]3]3]3]3]3PA( @ p w xpx Dpwwwwwww DHwwwwwwwp DDwwwwwwwwD@wwD@ww@ww@wxwxwwppxpLp pppppppppppppwwwwwxppppsww{;wȐ;KNext volume is requiredMS Sans SerifPkP You need to have the following volume to continue extraction:P 5 eP$2f&Browse...P RInsert a disk with this volume and press "OK" to try again or press "Cancel" to break extractionP*w2OKPfw2CancelPAȐ&.CEnter passwordMS Sans SerifP&Enter password for the encrypted file:P eP$02OKP`02CancelPfPAʐ/[LicenseMS Sans SerifP =fDPK eP]P<AcceptP<DeclineȐ`R]RenameMS Sans SerifP1 fPJ2OKPSJ2CancelP Rename fileP eP&toPCPAȐ4*Confirm file replaceMS Sans SerifP The following file already exists P eP !Would you like to replace the existing fileP .fP%/yhP%9yjP Gwith this one ?P TgP%UyiP%_ykPoP s2 l&YesP;s2 oYes to &AllPms2 n&RenameP 2 m&NoP;2 pNo to A&llPm2 q&Cancelʐ /[WinRAR self-extracting archiveMS Sans SerifP =iPKT&Destination folderB!PKeP<fBro&wse...DPK gPKTInstallation progressPK hmsctls_progress32P]P<InstallP<CancelPASelect destination folder Extracting %s Skipping %sUnexpected end of archiveThe file "%s" header is corrupt%The archive comment header is corruptThe archive comment is corruptNot enough memoryUnknown method in %sCannot open %sCannot create %sCannot create folder %s6CRC failed in the encrypted file %s (wrong password ?)CRC failed in %sPacked data CRC failed in %sWrong password for %s5Write error in the file %s. Probably the disk is fullRead error in the file %sFile close errorThe required volume is absent2The archive is either in unknown format or damagedExtracting from %s Next volumeThe archive header is corruptCloseErroraErrors encountered while performing the operation Look at the information window for more detailsPAbytes modified onfolder is not accessiblelSome files could not be created. Please close all applications, reboot Windows and restart this installation\Some installation files are corrupt. Please download a fresh copy and retry the installation All filesPAE<ul><li>Press <b>Install</b> button to start extraction.</li><br><br>6<li>Use <b>Browse</b> button to select the destination4folder from the folders tree. It can be also enteredmanually.</lI><br><br>8<lI>If the destination folder does not exist, it will be2created automatically before extraction.</lI></ul>PAߘ{<:y&q? *%  WinRAR SFX module PPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDRar!ϐs z#~W3CMT UX3кh$V"8KW 3f#t= htX]\ TW$5DŘSkvY6ܓDn4pz ex|uxT St 0!+LEl-63 CH341S98.SYS !Q *\Ivjطkȹ d! pTID 9%Yш 2S9<89{q39R+ @Qs".-"[_LַUwp<|{޷z޺w޺|juRK?'$ti %ٷOme]sE18wٙe>:tClc0nv g>6riVi]&UXj}sMR=;dSYOQ`u0w=T4z;- (^4z}-P806~]r7鴍w 8Y̍/obr=MQqƘ*NA 45)]S- г2ژ6Zkǰ".( !tbY5"H\K"o3Cϼ rS28y. 'D\%(<*5=>6C!Cʂp;rHQC^C@!bBi 4Hj$6ZpfB}DFZai qøaoU&wҽ>{+_31m(]11Ra {kS n^Zhl2gJ~WVם:kt|eX+;Q}2;B{84TXmB]n|;:+z/5* ُZ'L3Vf+dF ! (˲&gyJV۲DDI/2[dE5QʗUmvbVYkQ=ːy-pA9_Upz*C/5J?$>\{1,% }0$%^3-PQ W_qwbsKudy M"&؅xmR֧IlOb10 >VU ɺE2̎YfS if!Uv:ζJ@{1*Ρ{d?iyowέ4Y$3SJ!*wdQyxHym|,{i3b4I L3hShX_څmK}H*/kί̯5}bf#mIh<ݱ-kV͕Vt;uqaOVYd?q!J"Z-#\ P JeQYg:tl{WI͋f*Z%Cڥ͖,P֔b{ȆS?0 TV,*{EهU "D FSgvn=c$r1af!!l#/.RT,s!lL|SU)X9%Yh@} |NpuH. Mg?d@CF[v4spTlmM:>l2vG4Ug+Xn8՟HFc|I1bYm\&0Vz lǿ/cqd_ RU$MȜזDP""{Emx |ym@gSkt'*IZ(^0og%EaAPb wlgT)BMj_6Qڰ 񁝎ǒk!Crm)oU? c,LnA[D/hVEZ,^B. /% >}t5eqo^aP#tO5~ƽv@%&`-"?_lmPKmZ 2 [~j'(-uu f_kxU uPtWL5)ٹvO|M_M7]Ә_sSm ws&g=)Њs50Z5^vjy!eoܻN/D%"B\f+ֶ|@ؿ5bOy[f)E6MEF~u8Z,w ̗]QiWz):tٖJyS e3 ED!߱JHd+ݚ L )D_YN27 ʘ~$dwGX)Y9n#zɣ3Ȓ[4阥(ґw߳#bDZ#]MbЉ}8P\Y/is:[1g^ϽSѻ03d(C(Uuז mPČAX;- ҏV J;Tl'h3i?;#EV+g2#,dW*]FV-1,-=`ҜAaիQd8'F34 b0AFO8lX&lyZP-`?ܬaWqIk '{`>mysu* iQ L$eK:m@ݶ\'( ?b^ޖBu$'(mhTߚLALy-j-Xޮ?5^ c|..'1ϙ*]'4}5}p0ή?qtb86s^-W^8}+Fļ;2ȥ*|;o}|q3`_]&{"e#1Ć5?9h,{SDPR©J0Aο[RMȩ:qqٵ?[m'sq`Xr=YULKo,*SiĻ&wMa}6B9S]֎IpmΤ e15ez0Q͉wTaLþBޤ? y:  SgwI`h@Cu+:*çC :44%EnWB5p;ac`WS;(ҐtRLQ#tP9sNkc̅Y=.Նdq k;8fw9TCכDh&jF0uK q3CjF:l$gR,>fNP yϰ=*2$6 4dhOV0 )2pU388Vx%Uw39I-x!N6xfc^Welx/藾9K]HDeor7>p]jX8}ׅ@> a:%U+B? ;d%P ?ËvpÿbA BQ 8ХO"쁒^Wz#uʙuW6e(y“ᗨbk.5X6uGr$~ La)1dAYJՊ`[$@_$~ bdҫgFaJ6@l ﬓyy{RJ!=hf+C \[sAĄs3ZA'ҭ+ƼJAacWHP+rJl}颃 ZS6gz&l{淑J!SW",7ý>y=BU'f #P߭=ڧ* ȟԵ',M$Rs`qiTd ="v"ߖB5N?FfGK[';lE,Nw5'i;l8_na^P*%ߢbOLۢY͜67ֶѶoOE}QE5q*oP1Py5e;/!)WmM>C@֡6 y߸BpxHn2ʬe*:5"Q9EBE(qJ|mՎZHȕ}]~+kV~VSMA@Ճ8v0xD`l3Cx!{$<4 9O#GQ QQmSI"EwͰH4e͐S+r>,Pzgk-8.{*4L77USKʯ, 8nHb;bErpq jz !Kq*OB dsiTdu oy7c=tf ^y<'xSTt͍S0Hx\IfTpI~XEo3!G'hk]B3 h`+㓢fx˝R! 1Xg0R,&}_leypXex$Epu-XnH:3 Ko"BwC9! s{ gۺuFA$c4$E"H_p>,!oNIK3 nljXRGzC:J"@b7͂zZȼ$&[O:45>p/D Ŕa<֪(0DS8\J勢MBe7_Wܜ/u)J"!4Jqkk4 z (-ə2f'}MW аZM|Y=2gb'>5r2TBC%Ϯv9x 0EARs]nfV-!k5" 8\h},繏vͱ.ycLZbOe?ݱKs^ίƯFH2w{~l1Vt9 >KPX5oӍwCWh&njf/W&x;' \bbpS;2sj(ǿHġ_-$LҪw5Vk:_7$[PͶ˶ezV@õ:mf!= @m[LZpjUki|28Ev<.+] C& jӵJ*'KUp@G)d|hTS!ߴ&&Jb^XâxDmL%7>Y,Q2NCOaɰ4c1`|t`gQlC'ƹɎ=`F7`51+DICX2.о"'Gͦ1ܵ;{*ތOgEKB>s]@ݞ ffpC?nj3}$wc{plmuফq{e;KnfڻEr"=2OIWo V(m#mbtrMLqVL~E  K fnڵlA'Uųq _:vW7l-XnuCRU`*DCבxC4dG4^d7Dm k/͛d$Ʀ?yF(Id5ІChg\-0|.x7 &4H*kLO+_Vh AA:Y3O<$w]LI>/)D`i>:0;m:t(MD+p,]gd*r VXG#HNj-φ{&F>6~/ Gm|(=Z`Ina!%wޟJh %Ue.kMkO]8Aɶ~X*ӿ 0sD2Ty DHߙSg75/Eّ:3K]xxTkR]g/lҲ?Xp7i!E(]r:6"8NkXEDT< 'ש c D7  h0a5&D,dʆC"@Yb!usb)u6~ nTo58H5;qہt-?>+ݤIKf*3C7{ ?"x}8k2dϾ>Iwu@t!)Sit~҆O8v"O%E;=4UOѮol : BkUy>` Þd7Nxt v3!& Owr88 qLy@D O:H*[zV/bWCL .agUM/Ng/w3}Ps6G,=Tx8s +(S&0`ݥ!h :ы֕! J?D(~VCǞFo_A1Ȍ&Shm>L5 Hw?dxƟzNXGih6NHBPEL%oPA@6'U,;vVJ!΁A-?CMz+DJ2z>s"`1c*0NLFLa.|PИ%B+wT\& 'Q#{K>bV%QnDq0=Y2Ke(5H\i}4u =`JyB4 >*J"myk_%|)(jaiZ')<|Zz`I60Y;d5R}3EX/,xx$[g6[%$%P?i-Tq h~ Jk0˷ \e)BI>FdT8,`d:7'DY5+]6 tO^?|1P޽fZf(4Ya)\PmU4z<~tܮ]gY?ȸ h$rt\8ņm0ܛg2d t)$|KɂAX&V\|JO xCLF`_YŞ^KoBOI&6/.HJ!9InK)x3K+淊x->XuTGY@IU̎]ٲ:Qe# p=#a0G`NZY.Gu‡!h/)\ 2G DT5\ܪ;MHaW/GZY ʻbsDz"+n¦JT/{glP 4,5c6U;dv@ِzp}K,ingR(wء"as*BRcd5Zzm*אcXse`U`7܆jRV[1:&NeCppqս*a U&%`b0ϻHu$LiQ*O돫x0Chd%%wh" og)"=sL&$ǜ'ܒIp<#K\>06N\P I@9OR(!Jb;|1r J'dy]oFUY`1|uj \Eo/Ls4*-l}&؝vΑ:_9A-/2ίgׯ46z{4R9W!++/G<1ה?fLenO5|r}Lp]r!ng:/3,fp3gC~FTbHSvC֎!ڻoMRceJh?ťEy1!Jчޤ5hmDC"jq)ozZjBvWi Á-~!Pn8mQ5AUMCG2aPm6g sq%"N '/7~5=*͚zN+/ZmGT;蠁a=}e09 0UwpA_ըju52FOkrڍEfHmC@)𩟮J7Q;Qk%FzV~i)Ou_?a;Wߚ@zٚ:6*j3:=~ٰQI}&.T^|9cM yG&3\7Qm=&YNU}V>Q!H|`xϣ_b^9PeJ;RQ cr53/o40;%E;i`٩-;^;'@ݔM9̀=-Jv5aoF5զzW9j'`Vkb~IK/3BjHg27&"%b /bEx(8?aQDr4tvuuf@>s#fkRTi8uY]ƎcZ䂽0i\!DC:Pn}{/h4S*g UkC\vhethu:}4 tIe)l$0kA_K VAab ^-7w/Zig\f.E<#Fc21̼hLч{|~?'l.={γlwK}_G6w8~oͺ|Zޏ/]xs0Bj.z_}_Ӹ~*˗}͈ }?7+(HuTs ?'}]/|co{r=;/:~?NOyeNFsq!K@+ү/zһqsμGwѼ3Kpkk-]g Yuݫ0`}Szw x:`OR"_Z,3hŇ ο]^ekA)]Q IjAiPG&hv LJُlp`+d/ͩiy HJ3 /W;{ s% L_`L1dDFH7o { Lj7ef).i'`7LX}Dc 2@Sb qT~؝1DD@"? cfGC"og@W9pF E > i:!Y^9g8GFaC2d uF0ҭC<@쀔GeH]%}RVDg- \xW2(${:vӺ l9h,p }['W':Mc&xhW"vb}gQ43ќ@elB#$BX2A=L`FOǡ@*c\P,hg*/MC$( NߥՑfA^IPͨ BaӋ>[A9ѡ̸ˆ Ix˟E?BGze! HOT(maťϑpRŠ}pQoM䘁Ipd#[֝As2TэP4vbx Lccs{SГ J%)ɕ)ɵy~d! \ܾY-wMLF H΍#M=:0^|5ㄞ9+$lv#ݓ,rNxOjqƽgkzyXoJҝN3N'{f=*@M*ٽ@{&*YoTKr _Cի\҃\͟u81Vy;śf^ǫ}W~K-M=/EaFNIr-:ΉnY߀ ADפ=٧֘IKycлSݹeaۥ4cI&L:ȥ{|CAal\Qy*j @yz1b]N;+xv]}) DBMYuY0ħTeS,1-4 Oqp `?`Nb _HqqKI A8F+p9557є P-pM5k7PL`? 3]}ֵ?7́{zEԿCW2-fYR ef{׻o+ZhuE$JaYō(d4GT3CK?}wm&ӋRB6tvD.%_,f^Z^qrz&ci-_"PfJh|)߃BC-u@=c N`߳<,'+m+yMzv؞m6틳B-Ӕj"{A[<ԍnOCzs5 "$r|3{\TJA̸' ozZI9$g=KѩvzTX~sGsY"WD~ʗ^p?&Iեg;cO[Ew/kפM)5 Ux) ^rh;[=}쿯Dɶcx m(=sHeӆ-RnA<';Bލ.ɦ;sAIMX.30,J \=EVG*(LxkDվeUVt+_H~;R6* xT`VQ 0TCI'Sǃ x/ !F)k @x,_1ا8iP*]o@Q9J(T_*/PYvU5~Q -ٻujZ׵zxwѕX]w9(ѯv|A"\.hWq}6ŧpwI\+ f=rnz^}2CklVNc]]TŕʾRMUKzƽeRwho}ѐZx^S"Zމ 0'NI.3ǡWұƢ@2̪&DK~A^S~Th7^n8t: nRRBDR۬C9 ^ b?TCP1!S~ "kϭy&+)W|`^!Fo{H_auQOAۍro Ag5sfJCs ~*#2Kh(iz5YA#Z;͢v j^[v`d\'pw ~] ^\RVmv7\^Fx_EG{/D9Fb^J^<5νv$WJ w&=iE8vt39iV{"PKGesC_{I&*$j{z>AV|lm vu4 isy|W8>4Gʯ&[,Wo_em n |H]Lv*}R;1Y鞏a#]}.^dMoÅoWG\3 "?zP+`@p$] w0{nD_E\wyS 3jvJҊѮ,{W96qWz'Ro󞌜rD>\UWCߔHwv5ɮV:K/@=cU/љʛQgt̮Intq;-, ,:ӣMݥ!ơZ}r*ewSw=#i&j#t#kHXCyƜ==jJ&9to7em_ *R7ؾ}W=365qҎ V {n'>%fK[N>DjRg<*c+Ьq>rE-v*)c{<[xC>CWmuNƖMH- õ^9ۤ RU`9W]pZkEib翭L,iKӓ!<ط1Ӫs{zfݤؙݞ}[{}y"NjҳW_T:C4Pm_%p:H'({m[{Y tǡD߃c%R(#ޏa s 3+VX[<"_O[hT[]ɴj;L&X1VJ!S6P f\uĐ)3~0Jݱg^*^UZ9> BsۿŹ,WJ1fvE\M gʈZ|oV|l_M+$I4_VuW)wU4$#zlJ4ۈ:z b?^bM11`~X[AX/R[67=8mIԅ|zE7=<<2=oJi] m\g?J!@mѿŢcƹȿ W!2t8t0S~vyn:zs' msS_H',8|Q+Jp3 )`,Ua,KdPmXdUOkBk ?|$TԹezef#jݟ@E ًh-*o-CذoR `'oՓE=ɰyɼNՏxQ]{MQ}-4(un\iBV:=RH!۝[P=v;r7W]wpGcXXźӓGbSnZ@6a?8JQ^2zƨnaMGd9`x||½~`B뜟w۳'UR/lI.. N膜+aΛm\oYT}?G75OPT4,VȨy&9; :aMUD4M's╤te9$U'.[*a7Zu?o/+#, !u#`9[C|{G_Ys+4j>D'+~AܮUDťg~K:9 Qc5])f:oj3aYw_@~t 0XE3 CH341SER.INF _ށA(i%lAp6XadgD fa$al0ᴒ6Kh뭏iMh ځwj0 9,iĤIrJ/I~DS~~ǿĕ?qJ!y` ͉ #ax>'MD]NQ\ox̃Dy1Kxqxxܸc[>: Yܸ(u1&uq鐽)6qXF+B}B]s|ʯ],YT{y#УF''Mqu…bigNCBrVQ? op"@⿽e‰{ c(:(e-&ĚtA1BUa ÇOBv#{B$z#j)׆~g$2'F\s&*Z2P򱌇\8c~ص~ ]_2ɑ&P~o&Huy'KWER3KƒBfwv#ܣ)Ki2 />y77cN;/: X@~2{cZiJ'tA\yL.[{e{~ctĸV]<\v ^_;]YֺsD4Lo0\n95J[pfL6r׵+^9/Ki@T+su˓k3v86g1Fw?߳M$UXR0;M̈́B<39֡LOM$=W1}w3pFˋz *b$Wl`gy3q!odu;3nΖSR哝}v'"@ T{XѬcTWZ{bٳLJ4J(Nځ*CT :t_eUL{GӮU*K ë]CawZR&plw?}=1=}&t:]~~>S7h!ɑґ$>gO~oLM{e\[/_?nFT(PZ^J Fɇef5E|`c!:Lu^cy~h0j UdYhi,X(HH5M,c@d|VWFgI -Mǃ"$J2W,,l[Łu9ҐCnV:2ٔGKOF~VdĊ2lwXSGg( LʮivW[iVoh59LHK7>Ϛ \HӻhUOܩ4g][Zsδ݄WqLZa 򝲏<2܀a1] S>l ҥR3?sAmH\[ D"g(U+*?%槎H񣐽 ld[X]FIx =!L8<*\-DvNS vQ\ŪG nYnZEɂ)%|Dk'\iD6PkڽV0ۂ1JбI3 dF%r_=wSn I}Zq̷:K.to'YX%Stĺ]OWj4= :$/D r?YH t 0%S:F3 CH341SER.SYS Q fy&B`f E1Xj(&0'HdOC I ojپutA]A Q`"G&0"gܼꪾs2d=zg9]]]]]]U]%_Н|:ĉDNj1AAH8pCrc0Na}OSeIHQGe ]hQWi:O18MW8˯Weaa\3ïdoP^e d 䩽&h]|W]t{X-NhldSr1nXbr_e%ZX=.2} -A_rGCURa9s՛r5nrJU>n|i ˮ|R3c$ ]ozܤPD-P]e吤6.EӄCJ̈Ks?q:}b`jc8#?Es[I^ޚ؃hKL|wV1}jk|tȅP/=]d>SQ?Wk0jy{_F n@{;e}30f=:YΕJ1'fE&)ܾ x[0[X'ZO?P8F4?Mӫ.gvm`'TF#MP1$z XKjW pP(Gm65NI 0I+?$y{\GXvI'Nb G/{]#8B0}NHayy(Nź켜">k'gUA9b5ӥc4ogPuf#*gΫ^tww3:z-Ԏme鏈ZmG{zavA{<TD}>a5ܯ\0{Á1Ŝ- F=(zjD}d"d i굘fz] &>ʞʥ`l0|$lN\9T~GsFq(Qc,⫦a?D&enM} P~(6_ɭ YMAnKdIcrjb}uM]C[_4o4m߁c9;̮B~x`h;fq. _VVst;k| f?NZZU3 uI'=x~,]\OTCٱ[w<ĎZcܸ ׅxviñPWUp}m?Y<냽1u^Jג<"̀$ݫ\149iߝ(؍̖w~Pۓ0ɏu p}wkEշUKҸLG=ߙ)!+Hϫab+x4TfjT /,' I L(a|JRaΪ>D"^Am;MJdOҸf'b==#[T 5KZY|C),3YKQOTbw>ψvg>7g8G.,`{kI߶y*en3.'nB M5ʤh}э1" 0R XΡ {zl!lHQBd3߾Cߺ"nho {ou80ǥd26bHƛS _CnT( nD|ݱ y@}6cvs=!]' 86E~kjhEC_qƿq*n)>rAoWrgb$PQ%'Ž DV͢޾ٗgR6pEſW /h!^+*>W/yuZꝘȺp2290)-xS$BH}G>d|V=Y*9G_g *(ίx^o>g8TJk%caiQ$ S'ߴ=4zg^қ0{ǎe:G,J*كEKOVlJ&\ F>@0p`ףeUWwX[hCݮ@<& b.Έۍ4Ϋ䟐Ϳ/LE MCx4q]"3ECx t³HՈέcGHٛ|,r7tC|pKOxN35w݂LWXJՅ9eq и]+Bo,N:b=>V]vxT?Q[#ԧ}C1? :jS=V$.|p9Ýcp#76.6bۻde줮TtNp71L1LşAsH 9 ѧJ)o{a|S1۶"*\ ѵ5)^{&f‰5b7*=>-?Yb^)ݽƥ9?%]~+##Y?Wbsa\г4>"G q-괔z`R[{f6+|g 2.f^HLa4>n{sugPREhOK3#xgY7N IMٍuP(hk| QVDU?vTG8w{]0QxW%0'VK$CQ fQQ[ΣD(<+(LQB2`P+ysO0pqfߒ`\chɵg@|I\'-*:-'|a0“ ?sJ]5d%"LF)D1 Iݯh"4K:cG;1֠Q"iZ^ W 3{)n_3~e1> ӄOWG.V!kHRNǣ/5׼@3Ig)W"4` י.EpL[נٝzrx,Rb_O63AjGUY@>~R/Y ~Y\:>@"F2|dg 1 %2A7}_޲?^b+#B8#Z~տ}PIlȳK[ձًRi0jn&IH̀2<Di43J'Q< bUK-e:)ZcU41eSfBa;yXR[YEƏj3;r;q|$^yUO"zm8L`G8.[ |XZ@7@Xi+!ORz' f3*U2:6fH*-0rQs9"\ TH"|aȸi^n 3ǧG4!\5m=WQ 4¬b*V ͞$B^դo}{FkY)pqb$|i69ǑDiI+Ήf*G9Â1i3r@h)-(PDc8o+%ub:Tk=C5Td( 0Y2[fP ݗIh`3Йy+EPLlC`9YsbMd^a t屯bi/j$m|fWq7Yxcy Em%q*'2Iy~WC?k蓂u.F:aRNk+>uTt GtnK k'9:&rN3u 'ʊ?61P)pvc8ԙ:1E i^6}3^g1(U~`."YQޱ9zFOR+urJ97paFڄ@/%5I1ZRFߑbx/TrYWǻ)|Jc,z ) W+eqH>OȳҲFOb4(5q91mt1n}@4YgbKc=Qlkucq:cCU('AK@h(Lvglz@*d&Nۈ Gת8i-7RC=!ըDǸo W \WgmµW$M*x=28am͏clDjŭ] ck\ }^`:*j1k&衝L,GNx 좘,^NS._LCFAo<\X[]u-^Q3kP=M`Zcߑj74Ũd$g<`C tk4W}^kR~cz"0vWk _(^}QѝJ5&I`1_uEH**6,r^KB<_%crF˒FBAx_)hcKҙv{ Fٛau%֔ $a8 RkLKY&bΪ3YCuG?y©zZc5IFNRnv-JX'd[6 hhȥt3 q,Co_-c@iqEFVBu..hNk S#Xȧ`5̜ÓR&K:QmYNgپ0mJ xv$9 ֢XF~UK\NⲢa%p>Z409m{MJ;@2%Q3liAbb7EOlO?:YF݉#bb)0.zHEބ.<_osfZ堡1+J u;HIV e_Mm ,@%G#q$Xt 8$D4}#=p0^cj>C4F0)_K" IBY֓ٻ_#KXN-/,M d@<"on$Qɼ'H!ފG9 ALjot5M)htbWdIƾכ;3Y%˨bT11h6>% uEyc ).XPBڄ̪4'*- ),fO)Ip[~/,=<=ݳܻ.aȣmQ6|_=o%)`W<b>+F'ʝf<1u+WU5GP \~ԕB2FZ1#IzW \\\O-}{>b} uϘ' X8}Вnq7r/?z+O4ڊT\s#dmw 0 b>OcČr֠U ߞ3:M3Qm}e7eFxH,ymuӛ?hHV1\CVXj^JZeTM. g{ĥ{g>%R :!Cb^Ja)fMQC. (pZKBXlS> $YL| e4!F}ox 6;f;ɓ?h4T|o c`Hmр*z{tG(m5"q}PYi/O@:U"]\oJv2.FUnZr?:pT-ƨ>*مuAҩ8۸p/Q{@5S}*GO@<rcs+N2nq,bi::$# +)h a`i7ʽ騇`=4?T]N61fA.= H!5KX* pr.:zكNzpID5О̵s/ huNPJ\RB4!kYʲViI^d1q&}4_ÉO>Y {*$fU`f]ORnE2h`%cc.j8h%UDb)Y"zd\?c f;ep[m7#dHپ6.zsFtpsD[IP9JYXB4EY(aP1A b B*º r}ܼt>a\Y c>RD&`ٛ՜ztQSj/r a OeIAl&n@ٗD.~5bA\Ε]ԢЎF ^w. ܘA(ؔ??+zZ_vq`FH~:t u%AwxoQ]9XllHtH.?SPEgé"[%`:e-ť(wb ю 5r,ó_|MNH,^PX#{tb˓H-ёb` [a, n~uN*dz0pa6+GO˕ݢ{RޒN>jEe͖MxC4z詣ǂ5=PtED5سij6I6X0钆§px 0758뇾%[p_x7/r]zW|lM9LsA`+- (݈?au~M'FcTdP;c/ܹ~| N%+1cc+KX(1qjn$?lт{Ózhs"hČ} <܈{$ሆ= .2FJ [;,oD %xo @cf'g#m!Rđ~'5"W/Lr,`:G $ZF ZػA&[BNkhzLn5vK6Hڧ5&{-.[JQGIG˜zF֗IiG*T3k7&73Xaoi[]w0xSN i]9Tm˫#,l2*O{i@{Zכc,qy =A?zz!My՛>>X<T+ZPOqZL%ԴK)i?&GQw&w3I!zH*F AzVp(ο}W pltH%]Fsa>& l#xp{D"1?q&2ިp] if TR,g )(2rjl bM30.l^I\CثzW<6Lb6}O/ԣP`x7i07+.gSzÆرt =$ꤲ{?R1;AveX qu\/ؿU l>5I}`j@M0빌ISR6٫Y\f9`49ɶ.UmUE - o~FVS:adMDZYM #s"KRo)q7GSEFh(03+VΙ[W%ފ+\Ē=M +Ÿ*yfZ7SGi+4 ? 6*q1K*߫jQ;# Тm3QqK|Q&,|uzxMSbFvw}/r$ck􇽍^'D00!3yTRxny{sJ< :vثe^K0@spn9jS~,6 3N,(E8jp2y  ʆeNf z*&33{V*ldϡr,Ae kIU{v}1£$dX91FRlmtSݓ'#1l喝FmlkGMi&94A̸Ho.HYN.iLE!Xހt ;?c8fcWÑ5L6N  }=dEvl jZ)6 Zon* NG#[ƣoӋ_@>Scg[$xKue8JC2j7AC1tj±NHr"iwv=b'J2k,s ±(<bM-vklEm%" [,x_zك³qP>9|~]OYM"ԎŚ[Ln4`B8 qj)7COBԥ&@d ^}C=z$_""Ξ?}'-dћa6zmF(z5b"mPT[/E,6(ro1fAcKQtb<+ 616S/Ip+/颬Y*N)Xw"+A7J]i+CYسJJ%](-x~*@fbj % $3q|2>pbcH~@sTtm<nH)淈;Y hh R7j''Uu7aGLP(bɶ?~2Q 0fȲp9K=;wF~b+<Ӂ_n *zS2"fHv*81en: KWg(U2EV}m<IKk  ~Y۩FR!HB.'ޜ;A5$<(")w#YTͱ2)ryS~FM6W6 i; "H? YՏߝ2Ib lYƂ땵YI' MZ`P/cRGU}OVzη!s pc>3.Rdl.8 ؕ~e1lqBgh Q{ނhq3js,O c53E#;DMnc2_/μy5LO?#D=r=|?<2t+*%B\ @LFhljJ&=NJAbbX^s CSūvb4!ae(IO$]<+(_R&;{;_㵼Ʋʖks𿿄U, VymxC8ۙ~׊EFY=LT9noo1 ٿT8 c`K7 Aj^+>RlC; { M]K (nDn QCn2!XE@&QO9ώ\t]TB_N6 sB^69j-Ǝ;F~V>S$pHD7@'6ND |<)@ g`;; *^[-4KzΞ t$\ݰtBP0A,ES07юM-F&"ٓTֈ1c]gU [^ COa;Iœ&CXnIR  NL}byK$B$FJzr]b z0kx$Y8^Nk6j1<|$~lZ0yÀzl7o)$#f,xnUDԁڵ0L;)z"՝RI@÷Ɵ"΄]Bhxm -ᾀR*Qp .lGva#Zov9:z3br&v8$ux!!x.MHmg@!dӕ:k: R2D FL"  ?!)˪CZ CHp 4C>G ˑfHW\P!B!AW峀Tu=A5Iܡ->w/G>B:Hd:9q#"T˙Xȉǥy:Ns2Q3yM*x3AN#j*RZzğLG[+xx$ޝMJ?tk7QA[[d_X~89 Z R VC*`k=upQʡ$I^OreՍk].5`=;\ư5}d$C"H6KY"ޯ[ ߲fM'Jȋ+adykvP^Ca;q;<8Dga@˛ ?PdrD&`[E[dvPmuQu?k;:w|`f`Ypį^ ASBC&h́GH3iQ~WIy+a- :,8 <8!,#꽱([)Kg[ .AW,÷㚠e"ԑ?=bڐxZ ަ}. =w8P;\Ap7f{gCN:ٗrS'.mڹ7xpOK٠N=*#~Wh޿4$`d>tgUNJ]?\MT*ik9qiI*9ohN@ŢQ,TT)5c N>v>G"%W=r_qw|8./qDð`;ClNJ<Qv).NRgmI`Jlj*3{KH->jU 5ii?GÑ/)fLt!Rpb g{cmP!G(C;^@k-,ASef1W6!#\x՛ 7mܞb@8P `@<`>"(j]p`t3Nc)b=9)nc+P ޿AƟ# bK"QZ"hJj1HE}HS F I+RR,3e>BS (=G(orsHsJHePvPxZa‘G;iX'sS`}唁)O'q*}z~%r3΃AS$yZK}9cqp]hʷX"8t\n0?RGTXg9J`ѤRv $Q7.E"/*5j>3$]piT4lbf"ZMᝢ5@.caz^ZIdx#.䍰F!6}$x&ȕwS O#|EVPC^o5 a)"LsKgZFݪB4+zq:&,|\W:?`]ݻyk,MJ0;\"X+~\!c>jt~ߜ3&fIC4hq 43iD3Nf2:`33L%Kw Jׯ/?L?'16`|ُ$Ƒ$ɒwꔢ>b}dMI7TvPYMSxL~fMrJ~H 8 @|EҞƪn<{o܍gwS$@zdY+YFŋ$!NM!]x h A Pԏ6CR5v(?;@55nljy@Fi͵MT!Lso~,M_G$lȐ\x n|DlbɡJ4߇}0m)^ÂeˢRq,qJhO%M†R+鉮9(Bb-d-L%튒:yS>٫/!PC"LP"H] -XsE"r[|>hjTjRTzi .djG. CΥBJW'0|u$TڕҺ2(ڗ?ow 'n $ M#.֨W*n-2}<^grMZ)eTG7p 5=$FҼD@Y6aDVNA /zPbPoFM?P (; MgWvc lIf[^ ÿ[ `ݭNwq+=nJiA+8iOaywoZEdmDRCC | Nh‚!Q C @JnlC?f `1hU 6%TI#š8!=XHMHs ~FS!16cgR QW7 |R= UաTHg~SWYv)z#EYggw9{ea瓔xղ'rrJqI}3:)ᥥ@w+C&$"RB7s-WZ* Ҿ=7$0m@\7MI51/m-4)}8ʚ`aXI}ND7QP2+; o`&ޭݠ~s"eûއ86lEUQAFkco>t_zqó:);8$DtҭoҦa8f{ߙmp3Dd.r8v39^zFϥ45A .X)I{#/tZOF=y6vVSWbk)jyxC/gG{4wnc~r#0e0)s/CL`7qnmX @uSvi}3 $Wʅ-Xm%s(6BEz4`gԤZ!Ai'Ev#a$?-zS8P@]x*ds,<' 2 Oa#{~iV93tEx(5 $LJC 7Vd~͏;ʃذJbk7Bp>4#6;ZDi3al0+!"f,&YS6Ϧcp(*)w w&wݝ7( I^d)nFʧ #ͥyhE hU,:.~nYB_p/ux"oe42 2MT̓R.@{>/Ħ?vᝌufDV]ܹ,LTn%?;(H;h}U 9`[8 Yr7vĄ2<]QB%Li˃4OiTi'܃{UKr<59@(~#QKܴ=1 {b{c,7uȜ 39J %/BD5\G$Ót((lP$7|ZgCGJD=T?j>-ۅGy$JKCCC@@YJT3knCCB.N9t(e!Zۦ9lfu[OtKK W`}>bkCx}Md?XqXG|{J6c2&ev/0~/l˟'3+Wc<=3ˠs58$IЮӼ.K۫)ΙHW3aaB/"w~,tmΌ4={G!ui-H< } d~h#M\_զAe'jnЊ45#mbV#a͇~sK+3V:䫼f]țoLT X/\3~= PH ӐSc}OUFig~>?La*?IW*u$$9Ԏ sz$==yk|?MmFDnoE1R1S6gE5hz4;xOGe;Lg-7?1b|qTv]>hrz-Ȗ_V!Fy>;s0gfI:M|Qj.&OâF';2SW+thx#҄>jR*!hAC|Fh/m|~DW:3efb?t SB>IFbtǟx(5QX7-D-8)c%/iOMJ43V˞nw噯Q6nIDSi:)h \JCRR97^jxy%S[;E{kޗFiJր,cGF)C=ۗ& #R& EdFVh4txAkdzGzM$3 4`"1GQ?(L^;M(Il6J2O'reĠ+}"n!a ôogh}?iZ bSo:CU_DLSh\Fɺ12E "k-E/RpOxȱ?o GYwPDUp@ :%yxw7Ggk{)]UMɅV% & :$M"*c()^lH/ doq[ۅIy{@HrL|y:ջe(.+E o6f[F`IW;^G.|S0R3fDwҚ+BMGlɃ''>_)T*3ӳ,y`)EtMzMAz0*"ULa2˦#'J[Ϯ9Wg#<5OFۣfL[T;S?" uqH'S)ƃt1 >I9Jf.;sqzÀa33>."OT_f$u %]k|X ,x_$1qEZ0& }}%I$oOn?ZnyVVJ.k9+}oɃ~m'~em>ۅo|\L3o#;Gs>s?-o˟k{xeOOigkjx?RMy]տ>ϩ ;{[ j]ԷuՎW\G?qZc}vn݁[ҕs:W߫>*@x;/_;]wNE5mFo!kZP-m4܏Wv/Ͱ_;mXgGy578Ohz-_<v[UW#ͽ<׏2ϯUў`Sot{}.ˏ[[W_o\އKK~#XVqG6?7o}v__kk_8We}\}<%?mѳzo~_6E]y8/M۷~ڽ}k}b5~z>6oʹ-_Ϸ+6a|. 㹖w5ܮr~]+v/jΗ;D5߫Ҷ0^pgMg ǫ&'{^vޥ:O`*}+8o `#>Νiy)zΗ4߳Y]GI]4oz6to-3x% \U&XÆZj]lSOuNB fAr1y>2\'$QD#MS} LHp)h.,13Ε>L}93Ol}Y???~}\d#E'@'2;?ˏ:ɩGȝFw)==y҇J0sN:|*|Q.>0YQ{@eK Op& c̲xyGNqlL'֞-Cw6(6plUX}p >@{=ptBBM`0;F3%SX8QcFD4'̟?nLk>RsGp%4( FD? X]l/ L9`}sVv$Ax'pwxrga)犸E{)/@,@8, |<Ǿ [3x? F a'+_L5}H 93ZdLgO EͩJc3]]֡6~A`X89:1LIؑG(~@%z‰76 0O \ٴP(oC@3rH^A>l`qp5`~[ ijm2nӁ@ɜi@F h4y)ݪjmjny8\&GIJ˙/=an%4S!BGI _͗͆ror"tx-v}<8gmX2@\it߽&9ox%LԦЗg&Jvó%졜^\5sIdž|:r:u~.L9"C*s ?iMTߟH xB %IiZFm6-'=]ݠ:}hz&i$v"S,Ht4iHċLI0%9' INi6dI".%% IRF`I LVn<65,{A< jpDoKe#lʍn;yo:=RuhxūGȮSPcu4+,D9vV5'%E@w0бeVaЀ:> P\*}PI6Q,ƺ,`+Qua ZM}A tZU9fY};| \[`TSvE) (gtYo}?ȿ:Ϝ7kV&]5QnOK}N;+"Vx ZEʧrč&\j&uci3)kɦFLH&-콻XDQ5YjM!Ξ'Nz*$aaEiV۝v$BLX~uE 56OpT.cSHZοI۲.]ľv/EiѕFkQ_E1&M|_-@۴.~pR.QG܍C\ZjEԚ/뮵eNr8N+.J/Vz8ɛ쨾R@)֏I;q\:䔨g95ks>EŲ{EĮh,RݛQE>-TqV W|s̴ʢ`w,|KNF,컟iX&C6t˝GD_x۲K*2LZ,ߍEl~"NѤcx`g<z ?839$m=',#5JuzG:e*8 k(Ri+fQ0Oyj{HԵwK۴$Q=M2XO,1[~"MF&-.tq p ,BQKV 9*·gķQpC@l.mLox A:=0 y u~f@C#yQi1z5"cC@N&6 q uuV"xa\B_>UQ՞-Ϋe(u&D&d%3T%wƇS4TњSe>!rmi:įG`~k31, 4ĩ -ș+a/1qsI8Iު44,N,E%eBytQ7g;.͛n~TQծ$$+\u̅tM]e!/ʍ (, Sg!ɒ3$ƍ21O`1\4V9ik0}kx C,EaVq{+]7F\K#-,QZD*3f"+~Dmu";LkrTuNHSy&oPc4K<dxڃ ə܋WKr%+%[gt U|8r[5K\_ U@ mmBk;oG bK+7ҷue6b+K\8ؚH.}u(kzQy&ZCn9Ӯ,O.q {xdir"ıuAm&[AnыYJiŇo(aJBl再tڷKIa߀qhD_~O'`#.w_=ӬxBɵ]r돘LKn2xy75d%*~+O&quj[h`s쁢52ʗ_}Opcr*`8'~P1W& @8a`~Ab6 z!VT[M.MFO m/:s5|XMˠ/sS+rA{#+|& m7oQyf+ q9gQͦ"k;(AVngWb;yҘrGANR8EbZłސ1áU!oN>Z@Q6ޅGK0MY;Qr8;ԨK sJLF/(% H"7̫ؕ/du YT*u29|׷ᱴ\pjwȬ˃yt Ir[]Z•UgM^!ۚX v#|K`cK{'Ȯ/޿iۿ,.ʫ*;]%U`hwpU1#~݃8 2H%y P" Bpf9q:?ek*\JL7СXJYbr0jkr3R:>?`Ray<K4dv R^ljHqDq$(c{m"R} K՜ۻ /_벫QӬ\# jjNPH@2LeJ l:Aah26p])b Xܑ_ˤ슏m$QR*]l@dW1`\k{%/&N؄.Q<{&"4ݛ~t3+Dn0x>`{E>Uj8ʺVШw?6NGq!q Ƹk剡*UP D3?`.6g)~#'#i|2w~ygX(ujW@-&hd^å٣(r`VRq+3F/LK,]+= YQn]vQu|zr߳hE65Ʀ*]=Xrzo0wɽ"p6yk(!q4uvMZp{ˋֈm|$v^Yht].ZW9v]tnތTlS~2wQc`0GHkGzZ oKb_@&*ՁH-֗#f1|Ғڲʼns2[Љ~>eK/ibsxOnm@N"ynhQ &^{QX&~]"-`YCuN eʀ4%UvYfE6Z'i3,$Yƿ;;nWfk0sMMל5gyKY&'E𷾡jRv bzݷjWI~3VJhXZ)7N Egkܯ3o˔؉J0\`Hsm"F4c#t7|99mbTQ)QO9FbZ0EFvZ#%bSlRܳ{7I M}vDo.s){n UըGU4TϠTt +ef79ًXo٘ب|U)\b=Hwj{0ࠪ3sꥅ4lx;ErkphL/!>z0+|!!O#@<)а+:uޚGu~IYk dGb~&h͜K›E =Vy߃(v/9ꇀbj)(vi UF5tR 3M{iM"/ F%BتkSbo*qQiqL+=Y*6J/%C2 !DZbim63]7c0*OsS͑&eEؠ2=y5$*iD^NwAH9o{MS$nF ;m˃_;fzܫmϒk0r3 ~//JB#R+z=B^jK) io*[Tv _0=/ ik4iciKv5NwMSWlѬ]YR6J 0-â1+PSJMY7j{F=J=5p3Ѫ.zh鞧Ri0ɕ>K-q aIG*,#Q/w!b N͕@u<^UdSYy9Yw@MPi|]+Vē(:NĔ)e+licPx@θ/b8|8P&y;,X"/}\iGE/4s()c2UiO` 87Ƨ ۨ:yX,}^HJd)ډN:ǫnTu ?N#"P'n/~/f5_;hCfdNb+Z슗Y,dfS+⛆+<@w Q%67t(%PbJVάvGt'u/3FaS, ^|Hb41٥E'f-~S/y^nIAʅ0.D*ҳ(fP\Mhd\Nsožbp&CRbB|ZܨKs_w Gb\0={[ǂ`.:D7*R ʠ|"aso$p {'ˮy^*Nx_x-~:=?y*IۚOxT/?k@y_ ""i,<<ߙ>*q5 Ul m RkԄe\;uX΋ H[+Oh)*c, As~2Z?ҫT#GęZz&w!F&xæʄA'>Uaud㟛;B@3sw opJW,SΨߕ6,E޽a7R_n־X-VEaD3" s}@Cr]!{Unb0p| ~F~`1,uB F1>BSF{օ{R=+XxU{cU^ -骥K՚KeUA-Iw%h>- kYw"8yG #R* ʉi /fB]S[?.uLUQYjHKxu^;i1~pH-gQu2mC]l)@z(zI!B;aDJ%iS1MK|]'3u1"7p~&(͘^nU O@ٿ_r[IApw=;tC oVbD/d*p4U%0ƣRjՖQo|uxT}y*Qb[⯙PxMR1}R5IF/͙V; Zjo:/1CZ!yBWn"W#`'^@K[ ]}9Xٮñ*(b,Y^"'d1~bN(h(EM#]tPY B;r\+i>+P=0s L\swlWKč׌Q IAM/N x4g]BQuT~Md+#(R-7"%W *e 2B_nS/Ӎ[ ,"2q[i3)Cx%kBtF/$jȿTTw;H/mK0  V4ݳox͛@z/.;{"nnqT3]Sz9iiM}o^]§b4jvK`ӽ F4;ػRKˡ̯%i:ŔIݮX/gIB=ƮSh}=5#ުs)gtC»iM=iߒg%)%- ˎN֙v҇cS6thw;*;퉿{7v5O֖5SOJE딓(dա9;Ǽ|L5 RZ}4]9TI%$nڗщ:-#^0nZyA<~B>gc߿2PgLi{H9Tтcm1q4[# 4؇ 4(ARMF'CCHt -?gaHObG3 SETUP.EXE&U b3'$ 2,V ,"R.B3$ \r҇8G$l*[z6Fڽ^zн*HC@JZ([bҷ1V(Y 3ϼ'=:̞[?O<{fso[o^k^[r|(\l` D@VKC.ddUL JD@dU$ H\٬^8?"ܬ {~d2 ӏ=vnxzm^}-g%~B[j%YowSi?5v/wC<^~#e P'\)V|F$-ܬbElmm%ȵ0uE֖Pb2/ӣgV L?gԓ|=՟5vhj6tO"RC\ 倞 b\w-Xk٘g_+gn߅vkz2ۣf(((?fN7"CBOgC<6yW/cKcg,ZZ'~uUl+샱ᬍt`:u`A\pipn =4p9[%}#{|m,UK_ :)WHEXNn _Q%jj$Th|N:rY#_O[,FGKkoϋo8s!P+D.~{kh`pŽ[S"׈`"yOA:ϲ-(Zf',;"ߑr\8)C) {a2[RX%dm ͦlFk# ,,07KKh_*5in/g䔡RCIU{rB0CxE9 c%>K3_,ԸX@<(W3̈́'uzdm*)xxL0ÀJ*'hEUB3 ̀ ; T3H_Tjsㆵtz Bi{H ~K5ا-}$w[1}2es.~8vyc'E+/̙} a/)V.wGRyWdSonc}3!͡CvXm-.eT&d_o6,9 12{Az@L>q~01b\ y:6$(/34K`L3ZZLG>\\r ~ȻtTZKshJ)&Y%̛R ZLH>o؋Dݵ.'wudP%wRT vd񭿬8]}ZNgeg |ՄTW}r>~XLd{ ,%g'?ؠ$5i/hL P\ZLʦآQ3OvDz-F6fԾ8c%lTrC Yc7%.cKUSe .V`wyJwE_PXQa !o,VE@nqv]Pkw' ΂0D7]2 Ncmi]&ࡔߐ1nhH3l]z+:G& n?dbT9yT!/)J4XOpTc6)Ȱ]D4ڟ$@BI2K'w%d'=A#Ns/v) r2W6ܮAۙ7 JKhH&jij8Ĥ_Jm,͙tږPXpq)\LZBfS2DGmg1Xk9M*HjgNETLvGR {XmON}9} \-䦾W@o36Up4%WNʆI {|Նcݖp4ήXk0>;{A1EC\)I_ZZ5ܗ/;0w :zsYB$+L?||@ iZC!hp$۳#Iҿee/n6k -'~i:86bi`S*%-\VS]^\۬`|/cT`пW0 dC\,RM1Lp ll;b>嫆Q*0$^uc_rp=/+te$bJyŮ%ȩQۜ4Il!d=_+mj J9qbXT3jAaĈkR K)富&qȵLZs`G?L0?%Dq5L ReĤd[:% r.eTMwyV+JL}"rqlĄ BDmQ9+z~,$Q 98HѱMwzi5`nh}E0Gwڑݒ\l?^LsdĿDVxk;Wd}1%*UnޙtA42(5..FL)Nr\XYݹiOvuˉ,zEEu&˕;1ALCP842S)x T]J$ Rȇ?KH4ֽQPw)J(5u>)Auӕ&yLH!/Usۄ9;B칚2Rz)[~mN_dl19)̒FO6ۺ8&7 wDӗ΅g[rpNt9$z$$y*|%Wa l"YMhY0 Jw|m GL`m ^\WrnžRfAZ߀Jzv5 :Ju(rnȻ0C?~VwcrNg8ÒL1Z(]X1F+ :BTc`'~ E-BP) l[ZMt]˔40PsbI4%t.DF>n"Gr?M$%E97{wSGxK1o+T{ڿ%RX ׌Ky>ɯ;dQ\E7&# W'R`7i3ghAL/Xpͮ5I 𧙕@eȼlGk1Jg  FŃ=S-#͑\P,h- nt !#iTFu{% ;"Q;+_Nq8W>ze%iC5PL/m#4 4]a Vx*Rz'CA wxE'ݸ_! ȎđrWmF ^ YwSD)C͆rɡ5-˸,nI G<;_"$m,U2*߹ ь2mZQ7PH3SqP(_2ض [*J <֍p}1?Rd0T@I>~j~x [!ቍ?F+"=+[6דoPG ?ĸr UCLTʻ #*hr,_40>HEQ[K]uBŹ/V XATexyR#+ az }qW8N)'ť=t7 8:5^OIV)˙罾ߊbHPot)eTT%ٌo |W.P ʄDH]|Z g>TFw-Bu6d@2) eؑ6qɊFr犎7e &*"@ &,i^XZ5g< ؃kLRD7˗6y!Խlk*٭h;s0ة"WErSy:oq1넕M&4I  V~5v W8*Eamw*-_N/q} pJr˸|@EEَu!EE" hrLӒjYhݻUZJ/$fU6t*d1bD-J8=&Ifא2MqHkh!f9m3Uj9E;nPB ~;eA1<e灼jq.nrŷPwV̓.j^Ơfg6Enr氅v* I!*buY63S5blI 2 m \Vp߆l2@` ĊXjă<3IIivcuP9訫^M9Mn5 bwC[|$bĚ(zcA Rir~ x씥WX!B@+Z,TۿJ\b`{f*"1Rx 1⤓դUZi-:P"R*eoN. j 0#zJ\rE1߯DCƤSbP<ւ9K Вc~&کTdw$oWoI(ê#˷%қ.SAeIԳ:cg[|pmV+Z'Q{O+g#0G>nXwj"ZAbTb f:$*gU"3ٮA()*i9oMMCsZbKRcbA.ha?S +a36mpǏi"0!EcaKG*KծpJ, 8zl#r3D81|dE+eL4 xCyZC-}5zV ơŸx-z1 ֨3)w2pㆴ/9g#7 aV#uZ*`ܪP !V~.95tH6/ϧR.[c? xx hibD ;P;$y !(*_cYUf#jyy;- zr 9& VEҡ髶P)Io_/,rǕ.E&Kst`mɼciAFo^| sm-#h&,t h~;Mgaؑǃ:|-c!.EٳhZw<{/-ܢZYk~p#-ծ4sO r^_?}:EךLHCt-j^<7s:IrwOy'Fzy}rnV(0A.]yn[Gq=͹}诚yK&\R1q`WZ8yFmJ/,ͺggN(!>>HKY&!dlA ?' >Jr%=#?p,`j)#aE0B*9ˀ+B7/8e(cr ܒOyf[ rr咟=DY;{\P3*܋3$rɑepNx<v!#! \.+E|! \yafL8Fa{+[k_pГS$Q{\\?O+~|̧R((nRxX.ag!ܐ$[E&! r6JPAճ6va]``Tl"j.P3ub16Q^цIǓCz3w9e~ 3Q#xЄ ᄤ7 5/_uu I5lzp:mr2qE\ؽj;b' wR Sjd LX= ( 7qr|2jj̬O^{= sS\QMH".NW쾺;l ,YGPgxE lG@UQE7^'3ղDlRRaH~j,[ۀs ^9}4qȆwyqNwzgf\grmҸh= PeW+^cʽH,XZDh==`)7wj2X럪/ 45G w?-B45M{ pW~ջs{iowr-Oi8t^Sj7{T:H0>SRw j1x[#З9 R%K$?*`N#q+㱯 9|z÷u:?ܱN~ORdv0Z?W 4H##H`jc!s! 9BbSDö,T9]]ϰOuχT;F:ʤܽSI<>ٹZ|.914]T\ *8y>ZA=MEjqzE$DP[U6 KgCq~֩ ~>X>цO}VdYVPPV|Ao \, NaP l7TeւP gR0^1G,DQ#.~i?P9uOL."u;h/IC: ,J6X l7逴T; B7H0} Z̎X PV<;d?I[2jqkHt=еՅgk?O~kGt0\C Ķ*#0Ơ<BtGИKat+{˖,@p۞&&7qo?# &RS97K{^|!팸"`rnȗ!"BX2ܪ G0' *eJCCIr[=|jX,=;a%' &fŠcgs^lR_>|C*6=.]ZOrzoNn%?|r(R· 9({BQjunzT]3U;F'~Q)ΥDA,+cY"%Z:xkPߩ~oL-ZLJ3 Mi(!j{8 `X!Lemf,gKI`)_Ԩk5#Z Տu΄UmM$]~J7,ay')Z_Y=03J+j><_yapGFKMBSцňT׿I$ۮY-qpp`As /[> O ŜJČ@<~"?UyX xR^SH$ f`+}*`h4+|fJexDʀdb-R}4;fFN#2h,-X&cA~iZ '+imj4)_z0%:a51kX]L:'Fx) c5,p {LN[n9JBi)`uB_`ֳЃ|m@M/Y rfQ%(+J?g̩G& JЌ-/t8+])n(0~V* `ܬ_5l}L(Vׂ X)?N,F6KgGIoC+zXRl?Ȱ^\y?'A35_QUe"!t*^qVIjJYK@o7ޫu[qZ%7erO bXSǞx?~d{hzx4wA;usYd/HUFa3aaZv)x_IPɱ^D^Gz@%rzs셬xd>OmX,BZ pOlV=V;za֜{ѽ_wStz, Rf.>q}lGexg,mu-[(#pݠCy?lنҁlDMx>| Z,q6o/Jݩ$U*㮧,yse ނWr/k}La:addɍ P)VjԞtX"\MΛsr gm((1vMʎVj6pnoχr G3]܀X.`?;SG|B= @JJ#//zn՜j@PC(Nz PoA,E@uB,׀H K_1YG9Dc߱v Y^?x&?}Uf^o8.ld[Ep.Cng0IOPYz!1Hvj>8= pFZ++sS?J,%Kdca ?|~<B+nN,kB8냇a,D m=1`f, M,hvD+OW^W`rnj );DuIjϯ|YJ4|:L*f\Xr<#ÿKj$ ?\< v`l%lrp.uR7+=\/=C?ƽpiυpmVuόE1`s ?G|cwtnƞOҒ3Ngb\ųHE+J#WZpX ΃!-~ނ #'~.=;>u/#g|_GGQqQLaGEqx)'B,.#<<3}2[2/'4X7e[N:%,d|PZE;=6<C6Qz9{*YeAzjh^,/=2X\䶺6Kk1'ڕE":oL OڡAnTU7,5+y0cS!P4K4OKdikP7:lWnHC2(=-UfUNt}9{7LjmËVA.vQ-(n :w\F,bG[HBy&(zS 6o1rha5NB:hFtu(nR.烌%nwG@5;#2Ļ<hF2(_{ j|1ڻtL@KBYb= L/d 8-= ix+7 8^k^ '5ϧx$d"4#7Y(` z#S_灌M1o]<4a!"7v2SNb2Ew ZuXEc>c6p. 80aHD{28^vt{{\6#5w+[ cfޏnic_ ǚg7R6!5 53}jV+j J#7Ob)pi)͛Pn՛ ^MFCZR˷*j9Dm!?}u\,PRBAv|k S~%u;NF.ء"5-*|C~#EPXH=Xm}+x0jzZ,yKKo[Z3uaRzj sʳ.=Gts6eg^S2r/v4 iM΍XӀN:15H+MlnZb H:)r 0'{ftau~vxN|oM,N@,ClCn@qAiyWr0!sh9^ctkBDk@1q^i/<9[F@;LϺ篫Pmt@q{dslzwno#W1쁻~IH7ڢ\m=PE+4Y+v̭7/x` x':[RLaTpIȼ~vU.XҚ~4g`K*!d׬ZV/9{F봋v~QG#5D#5 dN6c); (ir\;;%Y/vfZlwGB稃)^eOErAUE ?C憣T"j*Zs/<,<*jn h=ReNd) )P! @ Y1e}P)  jɰKIJ;MƀQ@X@I$da]|o`@c3-R?׵,ھR56xB\]nb;piaxS, S%gA5.ao\I;rGJƽGNOE5"(ta١5ZG5YOr_lGJGy0`ToOn?>*\ķ&EJQ{$[`ÈJ($N08a -)vf"{s|ђ!.zwrυ_ S U1.5V䕼 !],<M3ї/VChV D@4l}Ns]h7_z$lVOkpS3+Lj $5t[Hci=ԃVWv˰gw9jp.aO@>f XΥXCB!w7%/)mO60KT8ozܨ0*+t_#+JEa/Ł-p2wY{]\7ڕVV%l f_idf}SXV2+c{J_<B`҉e[ΐY$^Ϻ!3 p|IhAh iBnd>V޴7f!~}#) |d4OC9:>˻NxiGnL ޘ$ (fL6&pfa&Ptcc_GLƻI|Hr]W0Qv+=UE;t8bW~{-=]:-"7cqX{Zk:@LBZK9V h: $qúHc&v`M/-d$=Xƿ -usbd\z§ aΫ9Ks!" C0~;hE~7ǒ0F?ԴzJrV#NCnfA*+I-GrfRYXXq%92mc@Ex f"ac#ԄQ]Mw9Hb}< yD{@D[cR %$2X[li`dY/}S_8zR0zxw^|)qõu<ƎF><m1+<6_d>ds@ -! %x+waAiD -7dACw@a^{Ww^ k/|d^gyCfF޶9QF| ~bxRя6|՝(BԦ@  9FDKZDCc1޳t~z|c éFFF8M}on[U!"V&"6۲ 9q/Iu]~K^Z% ^)T o̓O]dv3ą: ߔ_0"dwWAC(,+L,װ/'gO'J#SG8wzkb7tX_XW _~0+)8-b1UTt9eo.* ᪁:?K~2 2/C2a3rNX̃JeCXܶ*;̈́U L:EPV`W*йjwϟTP(B3$,ߥv~TwsIUZ044%+:@KV>'2p ,sMzemh^T<9D2XcidM? Z^-Ŀ+apiq}ُjJ:$yo\0P==uc-+ŨarJOV0 V4@jab=Ժ՝ۧx%}p0#jJ@qC d&YWro&;{51m4ŪWCl->v7N÷*wd5U+WA +@d+_i,+Qy a@* V/eBo~yFH6eJ9D ʿF0(]=n4G42BŰm4l)~a{DZ}AQ7 *@7KaLb6fÐ*&B5Ğf{M_ĵf y*ټ\ nvn#&S NO%Ln44^4/"a>Lbs첁x:8tG _~é/[nǑTc7tw ?ɄIg{ٌԅ7I\e1]K${>hm03oɴFd8.~N*9гsj]ӞwH;'is##p!;ܑwCXz>^բyYe [Љz@j.W }drW˯m|88v1?EzAȇ׹\o3 ThJK:׃s. K٧C\{K>>6d+eVm칟ݡ2kFZWdžSv:RSVPS-ò0&XV+m!3lչGi,H([3jvXp3!.`_rhIBT5,G.ȘKabLU+ «/EҺ7,.Z+hFFE)nƽpǿ14=L{@F{SR4r80gjDţV [SR=|_~xcÅCt_}NY9Japs0FO]L}0S'i@ HkZ1d1:t cvy*ӅYִ1o֗ |=xqYեj.\a|JlOA* ?|jxdȞ2+Dɪ\9m"U,vXSC%]#" jq@J(<>3/`?9rו_k m/xe4)e|l27^h󓐋pKS@7n :}X@s#a`R8;_EZKl80)ߙ6<;R*pTG#rQ<3D_?!iK KZ|Cf4~;(>y\=jhAGT@ȠN@jĆ5x zgd>'. gч 8Uxمr.)D yPy- 3EA h7H%wSiድ 3c ş.y-Eyx 蔇A1hRSPԃ䜓\.V QSS(ixkw?$r `VA27Zl5؀y%6Z dXŇvϓ;S\A~=6+ځ4NӍ18V?!ǞT= Xq$݀JtVh©ɀTN''oNW3'AQD>WStPjۙb'_׮|qN˥?+#6;mc}"a Bj bo(I!'5^NKXv&!Y'# Wdm9vAV @d,.\+1棃G75"^}0ak=c~}um\#FE1箣F/BH[5VB!Q U/d]eAmo9_h8pt?\;ԁ'oO ?-g([`}|O䭿M^Z)SNĿagpTk&Ȟt?H͝8w0 mv5ړ*;}L/jJ.Sy|}~1:jIc LWUr)#OA, /6Q=W :\ن 'ڃ[$)DyU) ]RdLE?ʇ ʗlX99țՏ@"zΟL.+)A^Z;0J xpd Z{DyhAkx$C% 7R8>$_h8aB4b8rs\}p>GV@E͕*uxU+dl]_m FxBz$o‹f^:u?* FnsF,%tOt*g<RoXa `;u{.(kBRbo4kAЏG0]'#[2Ş2n-0M{ڇu9hs25{͔GJ* Pܷ8<Ph&h+t$R2.Y g{M8 &LO݁(&"~`?`K-YC?> Vݲv,:3ak}P,J|qԶ[14zGHZJ<&H azxV/Veb/T%hM?KF]%ng2ril7q?oB@s!0Fpw@C؆ Ӻ=&VL@S΂ taH뢼S  _ÖC1OTh`+,B[Όz_='pv:$(ݔyET,π싹z<$nhvd 片m2VкF9]…;h HvmM-yv4#u_u)  Ѷ. GvÄզ<o83w@6!''V@2j>x{؜0 ]@Ni÷2_]S9>>óW̕ ^Ouft{ [OyS\*a_xOY"ihaoCzՏ-']Gg'[ֽ b=>`rJ`n03A-㲠\t-+OV=}:LלN}cg<3cH7 i1Kj 4 .2K+ ˻Pއbd%3JFWpF*ZSiOF iN"&\/v}&2v=7:df=uuY|tD]  PIjUVI2-U.H˗&uNfRɦI%[ɻ4cUsB@4ƆM։,ji *ay מ5 Q-ϪѢ~hJޜv199JPc J=[GJ*|^~ =eum-fbʫKqSs\j ˠv_gJÁNQ'+b*8:jL=t)wϸƋvVط@2ՐB0e,' {7%bX)Um־9BfEU dn.T*%N_Osףzv|;"=ƒ.u9A5MlNZuN\w)=x jvL{jmo!^E]*75揼拮5R@" ƥ|ۈvOm[a{2LN2iDq* NEF̽aO]?p9S~v߸⸀%f" !t=G[2[\΀X)pGghpG;jEf]F רEZc0Cwu W,N6ms$b@KqwcFUE4`2M=k@k(yx!Ms@ĢoXC\߬a@6Y & v:۫ ɗxG{rOD?<]V^xVhZ ܊fBv:frn}m0~Rw:#pDmol`5fms@;9;wbtpTE>hʂ"QhC5ڞ b "u`;D˛L б#vJ⇭(bLեƄN!H_Y,,|[dž%(!,|q|qYѱq&.frm@oL {,.KƤ[xR>6Ђ"{?c]c JM&bPGF|<§[o.ʮ&+Hajh SwC&gJMqFd;о9e\2Kr *Pآ=#ߑm3L-~>KcOtka+>+eȠn4&nF c qCvcP1[GT" h]Bu(>SiﱟI_fHQB_{qe#zboC~ fu{N U֪' \ؔwsfC9BU1)$8VEiɉR0w|f_<_mkvä$:<=QB^U\{N,v|ϔ`&f)3&c%?&cs39lvY艟;Y;rLTw[!1?/oMmL%G0jfl FbXt=h;"GU3p%l1/)ʒ?e *B3IL=$S؊./`,\o| X_dc:;p4Ӕѱ iàMBDGN 414A.#pF'VZ" bRHSX_"Tm9a#lt\]2>fZ!#'0lrc;4×7?k~py]Ԏw:QSjwaajSihj&;i<UnlrS 7 AGd<tJo1h@=eFRN 2ݗ f5VڜcF\B&QGBMIg) &|3d!,%)ؽD^(όG1m+p?9zM c)-]l*h+ZV̧ӢK3>[$P%h`ÆjNQI$=NJ$?!)Y݉;HgׅI4Ax6~hcU)tMp!:-@*1-)gUV#aaiܘ02agXsr3tti碬-^sf"nxV8 P?#nf@Wtc_sFaRz Ldt&`ZK"fTW5a;u)ӸM.cVm;K e ibVԆk\XzMB[\eg]FzBY*2uKZŐhTL l;KxQN= 4TY>+0ڳ ٭; )â{ +A ?07exMu B&k`ͤh*x?$oL0oϖkgyb)z!(΂ш=f.Yj,pBxOoՃ-zwEBb͗n*NdaE w %O -Ey7ZѶ+<*SR[bg߸ ѾZ l`UĻl*mWYM|.E0LZiLQNx{"WF f0"͌hLɢ"UL;m !]7XkM<Ѥr2j1ΰQ3כ^[P4b׾N XPv3'7yUJ١XoB #cx˵Cn˵ݥS0=ɒ~ p =ؓXh~ PDTPG=οp@_z+\&8\MjšrYBF~~:)zk$ħP"p-AU?9I:R=zL2BRK%b_ ( \:YEazJ;`L:K7(C:gB\ku@ב׽`z=VVOΚ`gqV[:^D |XS&zwVI4oGZ8jZ;(QfC- 5;27]{6-ql>%78\=bnxi7-ϓo+w:{vN0GŸ h8MRuͲ5O (z6 Zi7zPkѰ erPuD$2O/ݹwxQe[ wz+-YJ5n U|ۚX+QiYnr{s^`oYԸ|0ʉhN&fP \\)?i2#/d:r* [,, LlW6=.%nO0\.Q1Opxp.röfUte=3aC'hg$gTh VȶC|*hB*|Š*`;LZzC>Uѱ1Mt[>=HVP)S 2a^%[N ׶kpz!6Xt9",Ls$ovcXPY^s)FTG%6 i+)K3~i%L]mh -A퇶ߠkQ Ic@V[{u75_m1v"oe\9ùjUm*qŷ c=J $I$I$I$mN}ҦR)RRk\I&o KQI¨6ddI' N׾R(%rě8d'ZNԝ=|$TC">u2Z;*[rqdM0LңNԟBawjTNa?99R' K. O*9:艅C H?5 ~nA.!"!YAv;ԁ,@ zv؋$'"=Qwb">>'\+{\ ,*I(iR$F2t]G"ohG'G6`F޹4&;`^p+ 'x40hb "uGH#>"ے pY(Kj FT00&> 7 \ㆾ svGE%4"IҜe1ɢ`F#c!5 [Ҧ+ԧ&~R9"dk)` ߺc)/KX)+GNbJMVE,7F8 *іp(f9`ҵOѫEV䢲vvdت6]EIU@HYVI2)y@P+G")/Zp8L\}Q9( e'Q$aQgz.K_8_zc2kl/xk=W"hbg.5;H5߾EB rklUQi(Q"BIJ>E{e|8pB=W?x 4H{ dJ#O&@o#YQ`Yx)` J#\|zù\ppART!BBDE>&ꅩޢAPN{'Qd"@Ja/Bdef   }GGF$Nd6B9>@BPT,PUJ J_ C'-O z0bpO㘹s#:饲q9/!F~AcΩK=ܮw,y gsBGs( XZT{_?h+u?=@j4b &~C|TpbёIp3B"c $ X]" QM I d &E=X(un e-+r@>9pwNSZP6M'qǁE#Ir̈́>_H|N@9UJe{ \ZA8tZ֌A 9 G˧`yk/VPAda4 b@ `JT(p^_K@"ίsmRrC^Z Cx[Rrِ/KLmPt%OV\zhW2I!`*H+ ?HŖC`u>ƛBt&t PpP5\M2?/F9 CZX57E|2D?HT<;8Lr4+& z"V[F>3ud.Vp_ͻ ~F:iHI(dO"sPx*]g)Sɾ,TJ]wSH(Z^>GJ]pfrp#8dB\H=kDj+&!cث&[?AxMx(ʿaSDIEdȿ B4;9¦/HHG&v[s$O _j#f},C!e _\L*/52.Z-t( X} %\[BMW=bW#)X |XF_p%{B괉S&X  !Ah<hs1BRcDJqppIp 7!Z:.zP5{ρbtUlÑ1 ,.? ŋ 树H 77fWP@f,$HTRJʇ`VgDnkJcGa$]d LQrFvi~ ­< 4E#Ňo.>CH;֌D]oI%pYn~̾u{iavxj GL:(&Y<U!%e?qŎeBԻWl/эl&ʅ+H\q&(T!{Md4POk9[k p4D.-8@t2]}#m6u?ǧK#20-VvBMq}$I$I$Jᢎz#昭`2jgW.VҼ^?G*~*CXr@BhD(@Q0ug*R%}ҫƵ5\;/kR~iG?v_ VwqWJU"-y0~fL$5EU#5IO.Y=% F!q@/,(~3R:.Y!Rn'pAymJ>^~f }˝ 'Ӊ1h? TuY sɣA协,r-(|NEAI8u@{!Tyh+-`d& qتWC>E듵T߮ T>?w?~{xt{b&"{!!P\>\2S^LfdžXAÛ"嬆-W\60s*$C[yw~NC )@74uF툾^B8EIH akX9:ڣ' [~xSn}dr CI2~LNzJFH?Hhn<ܿ&ySÆܵ<~U jnn|&z1L؊H !IWrq D7Gu:|eҸluC{J3 $m#)s !Ӥbp l$Jzxifsq'.:a;bxPU/&dc8?L"\Å`rJ G\r"b><1ctG*\X@gWUMu. :[IU_:8(a%+d")#!}{q,aC}Gkή/JU!Uƨ8V)tұA ,P HdV  <@%jI2`H8^|у>ymR'ř?u7HnLYL3*,lan"%QIfk E&3VX}}@ P {CpQl|M#}ttKo?WpN>Am(oA:mo+uo|gD=󺥭D 7 N;.'mωmN7~LV~ܝ9{%nh[yW?m?~|1n[t|F!oԐ"|m^g@A%/yqaiġltb x-Z~[cGFRˎ|QJ>⍫\p'ٝm()H5CI3,E^I0: I\d$MSZqJqawQ?p>Wu+XQD~)^ C2H/?vVwp]k^ԯ9lkH^B倸BFs9Ÿό0lj!(Ig][YB˱\Ů,{:ݛ`Yy", {к`/:&IGaw%6uSJ9&ʦ*8m%Y KA'UUcʽ]C<`Yv2!o*LnK0ApqLj@TɪHaV`tɅў&?͓0C(Z#L#EڢvsĶbvȏS55?hê(Em5 .f}_AM/2?zt4Mz%Tw^VQ}GC쾔lpM,/CШXKS:R\S?>Wogj 0}Aҫ*??!:XBUx Q!ҫU^eu;zӱ۪]\HKmCTsU+QFY1J *2#\%H]v>лI+S}%}~?v`k+4W-|iUafU\]X6?T|pŅ c^q~P$_EN6wF0Q3&\/Wpa(W\;=ҷ=caJ ęcQTs   ~2\v9dI/J2c:[j3|*I$I$I$I$I$I$I$I+`75CXpz".D%[ h$>KQ'O$)4D 'vNܝ;uӓ'''4NXʈb K.@MؖZ n%W{]GQ_u -ZܼvB36rOke=/GMW\gٵ|XKJnח}}欚 }y6ezu~I sսy<=vOSyW/jSnhS~M}SxT~Gšڵ?Qgp ƫBh`]fxQ14OJ~zQQ~2s>jo}c:s20\??7.i/n-R_w3&-N6I惖Z6߯zZZG◗L~]y}\7;{zy+/He^Qag9k&ާY7&n}X7E#j3/cwWŸJsX~boSsvྍsK=;k9K 4eIQq`%SDt5Oߴsz6'ls^o"ˏ"Ni纛= ۢ1} 7pmzfObƱMDsu9}$I$I$#Eaإ2Nxudqzr '!}X|<$ʞaгTz\ʯGRT-})J5JL)L˝U/B2qW߃w"#B1Qo1{(s y,q n"m #[JqS0%eQ&0T;Q!j "@sg(MDQ.:!y o8LfzJ~LI Ң`_g`C9+ÑؔwpadF;. [^,\;F)Xqj4d{G3]@HsS0aF VfR`0b8‚]# Z0"p1uEƌ6cXne؂O'ZB&Li#ySo㖾#*w3-~*QûIRG˟K],TjW;kTXH89\iL)VI-ZZ.G"*Rfw-YX#K;_(H` hWc]M@[%a*RG YO5Ҹ%l2! ם= ﷓^Ы_l8q9oE
NUɣëB{r⢣=E:,DWN ޽ԧzs]tA½%-f ||,;uhu%p?N)ǂG(İW#+=Ee`,2QX֚Q9Wz?0,F $I$I$n/a3hزX +ISzJ٣NL,LmLFLk h]bPb:08Asb4Fmn"?2}%[T4~}|_آfg|zlRX#HFחЩP=+d< i,174e[%%̂&lD)4nM,veIE"6cժU6eE*V83[ Z h+r `r:@"tRaҺ>=\ꚩTŚA`+t+bpS Y DI'U'Su~d} 4a~ɫ 4C<iVh Fn}_D^$[{.Oq7᫛K~ [;gnlϷ,,m6RZyKv˧¢6S \埵?oCtoӱ.=,/լG1wy6t'O)|^/kj4W?[<*_)ct>3j8h=[Q Oi뾲3%-ǿn ?65 筍G,1_#S}|ΜyAL9 r14rེY9}lLRY7ày2F[ed)@hSȜ_^zD!tSaۈ˙Ƅ 6% 𢣁R .oc9oAnӅ(-C!кk˕SSU]K(5ݧ[7XL&2vywb}$2(ӷI,;ajk{.K.uȈ-Z6Iw瑡~'OyJovLn%pid昖%WͫvodNs_M W6\\@qy_R쌍[ {ʸ>wwݾ}5S{虐vOG\{/ps-})v|W 9)`7w~?''w6n>G~% s|ŷt⹶'yn GYgx" V}-]Ydv]KKIXKzbnڹ77 Sb.An4V=;~Zr¤*NPM[-]k<>zL?GO)#Ƶ??ȴ;^бe 9[V;1`>W^IJHӫ:/'5}_FẠK|Z 3w<.]ѽtجE9+N+GA9f8{zG&mՠݷs'TvQnS=?>>Wr^3.-3l,cXQ_wϺC|lZ1[#YrU*Mhr{RTYJP$w+͖OUj1EN.EafsguZm;!G5兩\ocWKpqi|ӻ4y]mGCѶ$b33_?㋁j[qo|wu[g~ɞrG~1`ؿ.rxhO}G4)[Z5ٜKjm:JY-3wjgd[~ 7Qѳ_k$􊝖q0z]8-'/#[8deyn~_z4_ƯcUF4sMlvbй8ۤnZRYA!V@hFK(4FϜ 23ƙm H \WH٫=lXbZ KGI&ܲ[C[0h P[h Y=ܗM^F{xCߗt5}/m`H{qN{ߞ7Dw[5,:<[3Fn]#ӥy[Ζ}A-3Put^ԈtekٴZwb-~kuΏA#+@uɻ:ӊ5olv&|~s_Rn\TY)8y lӥܤw/|3O6 ju5vf.W#5injZGOuvt()kWC]B񇁔sZ&r ]4v3vq^>.g?h74<͇u23,q*Dz-@H<}o9a6&w,KPjG ndbX̽VŁ9]7 ][STqgñ풑r~@ZH =E\$>X4:&K*n`mv?I7m"ϯp9Ѻ.>۔u[>"l؛^L+?վvXF}Eb [L&l?ƒǏao/w'OQ(xO;[.#%wpCwe|^zyHVGEc)j^-j.m+S|fb9}Aj+Bok#s.]|O͝:,L^?5Z>\l>/.Q1Խsm^k7vX( 0!V:+l8 UעVpjN]BV礸-qXr*qH/9QfZ\ ɶ8HXi-ԁlk ^]odRo뾂|w׺9:{T칻U;7}~^؉qkEǧKPw>jxWăEѓ[`|Ռ]Yko:Gr7NLFh3=|՟vlp^+gws1M_7?}hy])S^ -.8m~k{S@PN\66_A~;E|_or̜΂kCBq^/i{&.I&/W!m5bbrh`~8;R2 t$QSj5 Q9]8ɢ>cOM!p1hԼ}9pRi ZE"dz,F{Ct|M׋E_;rvTgYj_}&ܒWwstDw\ &r_Nv{Z~XNvWOj杩e|z;k^b9}kho8{4׋MEY=Gc~nccuOe!NOxL~S&lOwr[,N^e>pl*Zx5L񊈩?"^&Mx 4ghʹ7#PzP7vwsQK|1Y]'yW,3?YN}Lho. ߗlv/ɸJ4#^ ǭB!k0:u& &e8<MWnֽcuAs<6OWSu/.~ F87yrM[_#Ɉr?ɓL}-'رվu]/A %b$ھ +p;gn7Gw v&؃cpB}t =R1NbG3 DRVSETUP64\DRVSETUP64.exe%9  **#PtEhB"1A1$ddc$c,V1:GHQF,V:Orwf <Ͼξ{1C]]U]U]]_8s?WW]ﻻ<1!(m:8&k&LUͻdOޢ &*A,t|nB>$225:\|:Xb3 .J6ũ+bsrgV_V8gTrC4Gac`Wx*DŽ^ϜU%]=2I*Ï@[Q<9j:z9y@%}bƨK!"(=e)%BJAIELJL;0Աvp%b%5 bQbR F/QIl+5Q49}J8O[\\S hL>ZHløJx(Cx PL<3iy$X.z2U#"vաOm% QpE}+e! %G wzM3&q$ k5 O='cڕy1n7ŪQ!SJF1-q_ڲE'='$!=@$Af[^DBGTFȸKr11R0|(J(k XrD*/p+hrv+Q˃!w#I`Ӊe0¢?V@_2q*)VZvR*MBN #!N$Ÿ?b_+t?),U5%[_[zupL'iNk9|#yyZngxƐ 7[tVNJ6fa4ۖ6s:YaRNvÝ&&.xwq3A Aqp0?[7Lxj>2k$X  !NP+< Q9c^Ii(p1PkD@\~MJr^ÜRAW_:9nX=R6\-y1&:h^g"0z,la-.A?U ${[,1 gWRgʀ4848 BP/QbY M*)Uo(Si8k~9<Mׁ?S`{a3Nktqi$RXQc*nDY|/%-z[h{kۯ9BqBc-.1t`OHoJe] z0ҩ<Kߏ=CҒtu_!I>8G0{7J~b؉zavK$1,}1~&u=wM q֬"Am#b)I}.7Ȼ]Lpc,|NE#.Ts>vܬA/+ۙ~?q/lUCH"\P7xܠN$D+oXL1r9E}CIR5xxG5k}UO-V>)9dBA+cUӞ 4+ aȲniUׯ;8+\#}ιP)c0Z0ޙo; O@=zR(U£?_üb *M=:"T}ou00N) O2S޻'>| {@@y)9N*!hnWsރ9]*xՍ Glk5#Xtׇm5T[f:eUOMS,nn&wa}SQQL"'_yRgI}v8go>NoNCA=#nrK%*M{V[pmCa/5^ChIVJ:Z崦LF}qm{Lt[x!({@+FXܴT5ӄKFeУBאz{ZQ!{(<*`וJx?훚~X4ieF6("0⣵J""Vj_ E7v ެȄKkԽܕpkȪV!cB^*@X6IWBۆ=>` @I'*4Han!H?}G,gr p=-=[xS1[,7d9˧;*4k+{pA-SW(2 OR:O;5_X,Ki\IWX(˃Xm,A{Ku8;paf`8d6$,Pu{9OG+hm-d3Yb 5A_waCeV Ս;a0b܊Hceo6Rf- FRn#"= ; =p`)%]W2]yD(E땍8ChͧAaLg`@lG4ŸͲjA:r1tqܷt St~#Z:\FlA^@EE|.B_pO}"Md,!%s`yj{ "ڬ(]Q&ψ)/ON״i-b1wC'ZQqÕPD_%]2[7szz%' zv (iz坆;04Tn0/s&,eEf`(4O?rO 1LN+OLG7,ToXNb,fa|>.#pGU} Y-xKM{ei?5_W+?iP}Zzf( B *o F3LjJh!u(" OIԜ~8/덞**bM~j|8"k9a].1ȋ>0y˔|=v͜0&kD;,[J($gLDKfjy_ǐvAD3]^hb(&LQu ౢ1`QJYm=n'0.R 脺@|L*&lo. NhTE ,FOQ BANsbۛɐw_~e<}kGGD^N=e%r̫Ln΢?$5R~:J^UV\CUgԣtԅ"D:sRptmf]1X_#2y{`oFVgS4Z6` @Y:3}aϾ\^?bbN'BIo'pH,Sqjix*ejÞk.WغâA~ &x(SJ=oj{*b7t&%HuFV=OɈ;>?Kc V!ib7wS:W˔pr@Xf CZDT^,h1 BCڭU2V) ʉSsfEbƯx_|Ԗc25X>'DPA^3 V?@*NJM!$*QQ}<}γۥOm~YOy;8Ъռ )zSJ"H=jФi*K(xL !+9tW|2 8u}S& ;9 }7ol!BUQQ E];2A=;Zqa )ėtqk#cwId26xeY!`*$P;%pzn;FI?BѴ/t\8ܳsy?CS{cS?,erxSԙ@'hӄ! : 9':MSʥ+چO' ɐӵG^j-&?=-3f?EUh@)%# /:%WEoYDȈL~&\&iDâ_|+\:!ɀ7H­%>PDTGOB" Fn~Nwk#Aȹi \ { .% =5<\Qt?4@*O Z}Ҫ0EorZhJs:)HmZtNH%o3׵g΋㿩kt)>>ݨ26R*?i@ Qlmy g`*eHL(s} k͛~P -^lrd~?1-I10=gќ? y fCk :TyD1\RUqG z>pN VAʠ^22<3}K&]S/ |nׇWwV@uAMR݋cn:gZعj%;2-~oIZ XMɡ;8 aG>\8D>Qoȋ!rsmpY"$YWJdr3P d?'P AgĥHYm#l X@+~J ?8~|Sz,9ށA+OJ ީ# e^1. t -C W*Te O;.9eeE'WͽJ)dW7Q<\K ÔtfJ?|HB4$k!߻ӘC|6Mw%Z+Y$RmG#Di֕)(AZ<]D ⋀\O5eCRT<ȩ1(RT)5"۶,`2d>A$ݍud\:D$&U"[6@Բ-SpZb%|hY&O!C.K3HVk vdgYt1++(#?0:"k}EQ^Q.(69Fg R[УOnI ^{C0<9 m d[)BPJ kıˈ΁ZiEhX9$`6n7 iJ/&|),\GgJr&6Tx# } FPF<߸U5|gᏟIh) 5Do7EkXGiWœNZK ْC߹2zvW?6$Ep[4&=n'k33A7 $1 𐋎tRR!e|,r ?x Rt=+hF`h sex JזtNvgz&о7{ó4%uMN,,L#̑4=v_8]J;'"KzKӺ2Y` naH:x?qAbn)/[^jį{ѿ{OYB[Y^(%U"pރZ^|U=PZF[z=^!ZVO^W+|OWSz ~@5up3Y:6C3G ń29aIO2k1b%1AWAU]x}.YR% K|oZ*,"xRR#rM523D\eG#zX?e19V] '0.[\p+Ak 4!%MfN2Y3=( Sc_phȱC+h2.;pyE'wkCԼb!ΰg.@WhoG+jmŭW^O)I_e#Noq'REIRȩ?);ٍylL }ɲ.wDub3C)8S{-guŝOq#/5ǯbRY2hȅ*:S_Vf-Pʪ vR\|߸ކ+$_/QJ.|e˜ `d](l|)zX[Te+0 B9FXBY'o B;~xN&7SgB>0bTdT. f B79X7m חZmR Hߔb7湃׻>)=vDF=3]]#y[&'ǩ~vaA vij]:C2WT?r-e[݋*V6qR͕džWF͈D)' SM S1@f16̭3s$ѵ7$ЁSovXnݜDW'R =:a%%JE5Ca7RBFy<}@ǁeO1Z  ^xۢC(8)⋘ tO:U5k}(wgOX]1 ȗt/poINuv=g/ i".dr;NKWwKZXwM^M뿘Y;ar~2~P6c ȹ9@v.a'o#wWS)lHnը Dؠ<̟!&tN&D(<.MľPYs2'7'bル6 O\IHj/yu qՇk نw:ՈI3I5%6Eܓ·[.N'%'v!ImQ ? D.N`[By y8+HeV ΔN.&h9 l<9#nU$$.yP د\xa1Xw=16|Jx|ac<eQPHr (rfϾDM* J,nrK{[ Z 4v+w:_Doq d\[Z,,8ةy+bxwǁf#AnR@]=5! Oߏ4%>E|P%>LB~S:o-@1+֠p''e+חVS6ulkQB~0.\/A-MGhB k٤QݙHq]10S<&r%¼J['.Ә* j CwJvK~KQ 'C@;>:؆Wc%TCiْͫ|+eZ1я/g) L2"- OD2 Pvk(Ѭ7`n1oCDx0o NfBfBAEOH nN,m:Nc~gZnPˬ:7uk:v'NTۏV6 :5۷-ʒַx؂L w)% .I6\#]8eaˈ?:~KVUĸOհ ,I@J uY]L&. ZXҕ}(96_VrZF9Z"7eAto7/0H{TwM-[z~ξP 7!8obpx7&Qv7x%Ae]8%Lffu |ve?1Cy"m*]6y>BbY704rf9gn?}CS8XQ00C2nwd61t[b|b wH=T ڙ4_H3C*X29Te*ﺗjydgkKY+c9: g m lƪZl.rӜҗg~/u  ] pdғ^bޠ٨?gV);!؞i#oSBS. 4$CL+HFԫHgR,ϴ q>5kBl_⽪V"0ak8{>ϐi>f= 8P!j.q^=CqcbtCOfWɺt珤_L1wEF),_YK撠 I䃶hۂbAX`Qgه[g]oZ0uiCt!!,iJ*Ŋ8~9hʩ}4)ˆjHHw]X0x43Oښ_@T쐆-Xm&; QuQu{ukү;dhl>*z`ui! ՃׇN3Se_mSUx+GZ} W'l^ ޲ǝ CYpuXƃPeFb6h1#QCp;5FѶ6TفZڟ@} 'ׄ |GA2^7C߯Nσje W:Yqv 囟7gqė$y$f9Ic(2Kf|hg3 &a.{{Ν=6WgX<]6E0/KD\pf .<0gqeKMXOa6D`GusG!.OXRd$ᅐ.B_1: J92,B3hV擾Bo]%[gAe!HzYw횶K:௓L~̢4C9MRw{4'6]+;?)?uIl?f>\PL{#"CDBVܸ]8-2"DoN)4s9Yb@+Y8$v\:kھXe?F+8Xj+_˿WTz5ln^LA80ykDjQEyr(j95oJЕ]{^ \OJl"zB$Fk-Wx\W'BH.<RԿHM$$ݭ*WhQ"Zi=ZiNP[KhPY%<4D׵/]*u'ƪ;J|bvWȨ&<]SQ*mdG}L.ڈFO#ܳ[?R);p S|bذ.rX~7H:bC&ty}Փ ޶Dx5?5@ _GV]u{5wm{%ˇ~SeTߗ!_xB/HJU+D6&$+XˊuYSЋ&b+ UWLF9"1 `cUZ9va̭lZ[:31X"4eYo&W)m?ԋe +!<]$Rl4Z/Z>E)PY4T"7$(d!]NW @S|ſu)8RkOZ8nqh.^yl](,eZ4!: z+q.77 taua'ӉTiϨٽ%B-5ZaGS}tʳ4ٗ\u8oZyI8z+wb윓CXH .e)J /F6Mĩ~Wc$`f )9>92h*Lp[5v`VoiIU@R@!mŰYG8]o8tD4LWTLuh7C:sDKm  Zs04Husel|:&l2`T*ȳU QaQ1ܨs`wҏ7& w52 t͎\J Mpʔ$.`Sr=Pa+ LeAfLC@j,eoPE|i2,r6j,:#+_ z^`ThQ9U Q8dOPDF5F‰ e֙r*2֌kl2c6l^V2ee6>l{g] _sRrSrjƍڼTll8b 3Ͱ* 0;ohʫ4t?n Ər9o^frz5GZ#rCybcJX#(ecʵQ G_gf7xXGE*,|BbӏVbT"u09/!j3#\,(EBG$ QBB*1zqI>n߀E!¨yˎ<-rQCMR=9}ux3E~ZsLKXAYECA`).FׁThi*{0Wbw|}2RF}¼CC,biq]Z~];}Nl$2øKHمG7I_EA3y'[ʊIL:v3nXHUIqHW^HS2e0AA (M)Q"즡c)4O=B "S؈=(a 6? {C7GP(NOhO1#')b2.nBuEBKb&"w\n-8p9*5 CtC$?2N {C.aGFd1QBE u璍67":KUT#9$y\- bD$":9k\:AS O14/)`C6Q;^AP{khDRD@:TэLjrt-itp5"R@A/eo!r0w^O  a\E~`;[Dcit1+B'HcI*)W,Y: ⴪`^ѻ ERwnQE1GcV)+gRF?S_ON+S(5' \B(\ޒ(Qqj/ux,}plE$_SxE~kX*-om!cIw1ҸiH&[R.jF˖ 1 BóT2ga-@aXc”I #VQET;lE2֙@(2dG6ɅsTor&q)Ϛ{k2B #zR#~6-,G2~ºZ[kl˂$;'Iő0'csXֱͣ|@Qta84YX.%]I8ȻQ93NiYNa_ovܬ9[-uX-o(5YK6 sF54fɜPDV1)ubpkUoB Xs?*V7w(ZmJJ>qV9K,rXL &P4?Cq8v2(B2z fd- ( U(uƉ(uy3h@OmϜktьrhc$ ,9Ek:ghN:gUrh5ĈfNG%,ȱʕ;zexa&'jk<-AvIt)i )m>&k񊕙k2elnǁ?s0  3!py2P+IV 3`&Ov6)Q\YS9ė5A n>TqʠqUjaN8Ԍ_ {j?ЕP3nwmLcի#Xw)R2GΈ^:|=4ofao wQ¬QK;7qdNǗ 'w(*c&<tjRArFdiʒұS'qUbo [qPa>SS1sdt21( !ˑat/Q)e(:Ytj߆ PrԾX1"#2]KxۇJM5r憕1US4" h ʠM_$Bw F:z{"uvӰsĉii /ew!=̪q1yQK>_)rO=a3aX$9( ͤ~! E% ?RƸm`drV s5lSZoGF 0Y'C~Xj޵.3(Msq@jL;t2$C,K\w; I|.--=d\iÇcDU d] uYT.$]룊`*y((܌9*.w[>'WXXX(hUI>^._tBA96RKMB?~MDއ viBIhKO)ýMD GYt &n_&j,Tzxzz}߱9?Ml*{~m7jD̏KI#DʰVeVR#4MYVDȋ3,M.%6!3 ZkZDFiRy;)C" +iXB{ιI}/Rb3gvQپR[>iRٗPyr}^e[wLD$좒0j1+$t;u5l҈|$`dZťжPQ0Ur&\[Ɋ?VbW$WC7&J8~`jrs1~bi0蚍 ."_w@JbFzcu%}_Q.--uyV4DE8ԉDf[}|ZGB%Zpޞ6!o`1>Z)&ZOH=ܼIw[ܚ1ZZyO"iOq2YdWqG9Own=Dufq^FVVdH-ZWEl,srcЪf-#:j^GhdvMtLsҦ͸oBű[nG<8)WҙysR5d)&o']i5P*bM`=N2*Rc %%==_dDzYD^͸fjؿc}u~㫽FY* FY2*^!X߾ZNǿ(= crԳ7_۳aߵp'|}C99{Rsavloձoj[R}l&ԊPo:#;\:֊c5OlTN۝7?(e#! !kWժz}Vh0: ~85Ydj~6Bl;|1:?fͼܬ7bZES֟2et}`Oxl=\tWDO;V+Ҭᔺn(Yߪw+=wlnVMWiط~.3 Vn678s(S4gcNYcFi4 MŐMm4BVd[`7p BEBTc\rt=5\:&rܴ;q$w3s;}}i7ퟚB/x˦嫴䮵2XSWTNEu|V~}7:ykk4mcյϑ&7CK/SqbjKypBvaK+>&]E/-g?k|{H>شUkԃF`cVl.Me5^>h_wu:Hf]p6> O܋]^Ѹ\l+N0{3f0zi'K饫2tՋUøg_o{~FcZba`~R}ox|}mdP. C9J&}h<:ք u|4tKIJtKs W#1Asd/HA bj3_J,+2Rpk&U }vR}e7G[V=(uzͱy#}Pϧ؟X~WOoa5g>Y}{~+p+4zG{EbKk9;>#SEkmi/{EYZw{J#kt򶯆F&fl+=wOVYN)xf{R~ !ʶ4_>\ٚsm/mk֭ }Z6~br#o13r= ;M|xmO$~zvc j]Sv-' t}-7c;RB9&W#He iY1iUj;67{D`H5{K SZRbi#*,Eb{v3kAʉm 5k;3Cwtp<|C7ڻozdli\d#>6[MpWu]Q=cGS.oc k_Vd7߆FO^l^msl_ fW} :E:+;j_|_S2\.xacXM7Bu<[&&b$&u|E'-#Ulz,M+UB~2h^ vPo ){ɔ}sͫec?kd_s֜, CefY}#j#'ࡳu4hSQwe5x-deEn _c!\X̾7dǁ97ےj"Az a'Q^<2UK$^e K% %QӪjy"Bs+9RfמҶs+ <>'AY~cc&Ƀiڬ9XBܛ`::Nom74^;At`ڰ:K1ݮ('>?^/;cY4[y<^Fcok3^7NE37|svqt=B|,w`zJ{0ț&#c~3x[si7uTfx~_sAJ8*Z&}Ȝ˗l\#}tWEtЩ52㊭yxfc<ۓ[SZ+nnr B:\r2j{ܫ髡lO|-5zRܬi*iz@`n.WbyT79pSMW|ΎNKՎ{-.Q١ }V{өQgZ~r_.O圇XNtoE}M{b\lbNwI{OgFrtj<7*uIKWf/_js7{%m\WYw&tefn?{݋kZK.F1Dm+-K^%otղzM5%EVu_umAnƽN;+Go󶝅+qyS-y5,%X2Jh?ATEO.K_[K 0ZG&*DV.Õe3my5*w-{K3B;q2)x○ ooG6WrrPsɩ˖3QٽQxx[v\g {꒺{M:MGYCt*_sUK#sLŎ]r8nL_VSV܏ o^<E/d'x_E\_⯇ֻJw?ӸYUwi/wj5槾؏i1rǃݞ/YiŸߧ%0YX kZw&CBzr\ٔuޝU(b͒%TIbRhE;,M}јS=Z\z=y?L+$De9]N:+uO[ama5fhq|2{ҏME!For26b?F.YL'P^MfM7rfs'o"?3[\X(pnzv~~+DkKg2W!TxH} kN $j?,QU.qkV>.R GhFEGMWow#wcx >ʟtL_F@6y\u ;!g6ƫsz+9 \ݟ/7apuO=z|9T?[s| WS2clXrq_vVw" uo+b WH!Se-><-@d,ǭVjèpƳq9 qI~Q`+Vsg-]mrw̳g8BEp;Y[3?fa-c66ΓT]h_\m.hӒg˯ZuW++q],Gv]"}+㏶'B= 38Ssھ6{L`=&#54$7\ `L`Ay %Z-ÙȜ˻tmgnvs ^C|MKOKr{3 [8gZ v6R9 rˑ wPz N^$ڵJ]N"ECBO1iI8{;tV/ro P?]}6rCLhԴǜ05JDW<WztBEBOy\嬞~^%T8IDPDEsƻ82Meu0W 9"vɰN; y?7-&0q |{Y/J,%ؑ\KjEy/vB^ĿE/Fė%HZ`$7(w捖; gp v#&(JR:Dm.,e5x\I4tg aٱ2[;PN. -K¸~D 焰ʈx3g ER0M*,v\vmy4EOٝJffuqE4hD_P'I.tqb墉njX?T=kfų{es+cʐjZtȸ3H9^]y?hh*X #T^*-}N״Pfs8ŝKJ3W8/Rb_|k-jݣMT%kTTvݹ/Xk' өcI9 Uv#J?wjNOt 0jd:F3 CH341S64.SYS %T̉!^$[aJ TDQʠJ㒴1ZQZ=5R`!i--b8)=BZ mNz*G^ 5K,[9$g|<,9o[oZ'{E~ϩY/ρV,NXvlpk=\-3t=N?ݴav} >qike`RPz1e%7[Qujt-7V;N„s`D|%`VcV`W0~+Ú\"Z]pV.s-0{Z|I|_b/2xXrw]$aR g rUgV'vT\_M@CՈ\ʡ(jp^$D (4E8=9DyA nx>s38k(C'J;?Q rg5Ϝdfw>?}sRWiI{qSU#Ctiȏ[-BRڵ kXEg+1 g8Xfoqu|YuJ7kispgk#V,F O9ޣnsZG55'$  BawfA`l^1߲o?+y=ܽsZ9&L}De褒!Oū쾒cIBB vdulv.n^ 8ܲѕl#ޖ7*Tר=`{&Н)L" >y %FRƭ g=a)k\ŵ)sI#kJGՔG2:O i\߹(F[-^ﮚ+$$(j|\-tTo#€%6%Pž4%,/d+]< K_UkɼD$܂"3K#,|FBeޮF=NpRm!=3R lҗF^1QӦ: G&2`_>ha!+IbQ17O(C2'ZT}ےVBRY,4F@E#80󱚔\b|40!]zth8 | ` ɽ^_)/mZ9:jLC˜O"֪yavs hnT g hHt%HEJ0),g, _g,h*Zjܻ樑f;GlzY;[lCƠh T-_g;_qMp?H|(xg]"CB ~ؕ$ 4r*,}؅17ϚS"؜a6?Uj]{9xe!E}mt] T'=Tw:`U#q?9~?(k͂Q0o{uJFgEp(`6u;PAk{ڥY'j!j3BoܬL,95<%CJ-%p[urB/)k=% ]: _N1–4.p/KM=SYV;tKzXwkQC+w ojӎ$PoF櫍֭߿~VBȼ\fCӋ`{$HW<kױ׵R}QqhLӃK luQ-H9oU!)&Dc6Fѧλ=XԗXөjR0a65W}XӫYyj6Op# xo2 㺾=Y^ϵfll𪆃8D}v {oHOpo;h9o1FF;,41NJ{!cST"DnhTHsR\L!2JI)4ȓ" [Mw:XxޯVICVf,|XGaկPoJiJ6[?zH{ftKjy '!Y9S+l7za[wcwy<Ա6f̑*K'X5vͪy?X2Xn+(wN;GS{nqYB;B9Rd8dAs@qy pAI:P[ T->7 1cpصoq{0Ed/Iif]Rai'NKX=|`IW풼G~ۚ`ʍڍ{.Rѯ{f96jE219VI H ׃pX5AHq]PUWN[r*L$N.uZQ>Z@S8!@?Q!=DRJ 4޳ϱI|=~K}|!xƞg5Kd֡w]&4shgs%swVݬ|*ѶI5O]? ͽ^/y)O8lj#z\|#Bix){@(XN43 l%#&ڻ J|p?HɿYvo^dDw(iM4uEyhz[ø)SG(WgՔ M#Tk*(sZXeޣM Rr_bL6L8QK-)qZ:n00ǬX׹Eu{2rh(U2~iQA} EG " (dY"2v>mŬ ?k qWNlUF [ e*pD!'uA }R 4bq4 ?g=ZdBkmztۀ!F4-ҵϏe@Siv4V̭Ԗ w CsI~ yN!DŽ{$PF| 3B@.ՈM~Bm9Kp Oc˧(-ƂRAK f4&VHΙʳ^XQT x>ZI|R 5\3D <`ep:~dVcK چP(*)G'Īv%/*t_}93?&V1 |G]]GxL,$ig/:1oL{MRօBq|$j!z6X!nӌ]jG]'XSb8G!0}o0hm |. ؠkTջvƚȵ~ vIkcOZT87ϊHLQsZi8;1&`p:ِ4n8kHglr)KC4QשFTU%^}}}KPjtXQf_N*Mz+hUu]q$*AׁHY 2\ !*7p5 &dUM%O9(6ƉHXF|q.6dntdwiyJk7QiX@JlG^@Ik3G}8f @N#ѣ6fՎ^ٍ֢?5oQ5EJC'~kN FvViK|#׶fo!]vaJp]1M+YJ$fC-wĮfV"fú8/|ˆS27M"s\f6^4ykLl;eon.~#Ѵ(`>OI7oBjûn茆:ګ|v2UȀFASJ!?~^7S5B (52"DEhwKEٯu4zNoqުP~wA?\݁b2";/1^OHNU>&GIc*|~<0}k[)`8 MJ;E(`zE)R0[Ĥ*GXt:O2PWLָ$K\|$-rc3,r68kG8b;2Kka}xĶ~(5^lP!W`ZvG:uKEYa*s%mwa e.a<0*¿z*8hkUhrV܋kL7)"=ʓ V2(ĪXax͇ Zէ},0g4(pbV*\p(ARW 9HsILοj&dFIGkdGMsn\=r②'|Mo&>&T8>r@ď8-Հ,KX c2:zS&Ne_PwV;ZOsIGϣҒ(*$ӦK@E_Hl3yMe&2AU(ʡۭp~)0 " # T0>!%b =ۦϛi Y (BɽD+Gç鶬U:]Ȧ1mjA kyո3|vu֋ŃC; mq'&'`wAm9H5{R7WcwNò~q«bȜY7{BT+KF{KZd}ƨQHzըGGGLyă؃¥3MA!HBvrcA-d{52bD8$^lgQz|Rg( 7$&GEkSSLi*[Lh&SkǸS<<{WȐC SjCA/I/_=Y &>|Un|wDGH0Ș`lrgR=5qQDSYhSJXQ}(Q~ W-^0:6a):ofTmeE$VP~0pv5ZݹD%.C}BH%1߁L=^CBbQ - ?Єpfk,o76J(8U$W~(>zc CtHgDXo%L)п;:{ĻWETV?-Z%d[ҳJU+DvjQښ;AفQ!N1qA˘WEDRI)4h,9 -G->0il$,uLg[`GvMn]ygtʮF+)ΘH mUL49Y~##fƫD4u*wgۯen\#Z֗J3(A:uwƷ3hבhΪ.\k:rQ;l2Mi އB4@4L(n>N90+&:~ǸU{ jok >JvcI/;3 : gűN:+F}J,eB{qrǁ rylKҬJZ$A>8 Q&}f% Z&Ǥ4@& CQMp4F!d(DgA[kZuz!ЏZur;g6뻩7_<لJnҝwgRd/{|ܝKHnwIP\<NĥI g,iw 5*qmwIIsӣ,֯/-7r (kj孑.y"lcFn- m8׸IsTS'Y5GmЕvM_WtF8$ZMY- 6%0kuQNkK U`+4]$I^YaN*w7z@=5gLj `K00MZL'Y{_rӮӚod4Dd,QT(|ߢh,D sgq,]6TXZ>=/%QՄK^(@fq %l;C` sӉ &;CV>l%L=/^q1^wߴneVNJx ꜴP3 B=3fY ^ $r t6E{#v87oHMB8 qAI`s7yLY 8ɧf(埍A3j0}ɣ)ưt^ ٴ*s4*X+,0@٪{}}a5#JNFTXl,kk` X0{ZWk^$^C$U~48C {lbzaC0lCÚ/[$t1tQ/ UQqTo\PR1JƖz"Sb!I6 {c TCG|х=Bc =mdښ9]9|HDT[8ٔ"l G>3V9s"gpIC(}hsC=FFڟ0j\yˎx㢚~2RꇡHf|O|`LFp*:z>ƹD2C^ U}:ڷ+IvQBذrE‹t1kJ!ΨE9}1PTjJB7]ꗎ!\uZBXvqǀS(гL56>X~oa0&~(Uc≮"7;Z˄ ,<\Ug5#w4?~dBg{wp>i_Anp<^,&%^=MaY^A|[;)MlnP&bXjl;aMV-WN3RV/8ܔ^G,mTa "2LѿDWpR Ź!Fb){RZRY\3RWUM8a=|X:҉'Q +ňnLL_C\3i,{){G[H͏o?-Y3}[y劊yp-l6HUyX^Z7$G()C&bGWI<4"yMAe LcQ(&2i2<jTDLؠ{nu'X&"ɊI$$g)he,ލ wX!P.xB>Ml &:ԻzL{|NĢ(eR|m]^zVdC 4Ὀf-TMKSmlŎ3|NJ #;?G^ّ :kTzr08]q8U^6S[YFCixz8aWߜT? hG:}VVܽ~T=(&2{X]mÒ[WHRo0η )o6K I8YHB[9 9 !h`3K Ua(XS`fG0ֲ4Lv64 zL#:x(: ~GG <2 ]f 2Q DX.{NŽ͍洟Ҝ^/]i_N#펰QQ-Υ˅\B*:SGנ.O[&n+vxh B;ƕBKbĶ!(o y.W V :Z4B("%qĴ)!/K+%3m0c'!WIŠvQUU";ֈUWΑ'R=Q9Jllz.NDs.m-,:wtaBF龃- u u*@ƣj6K&KXp4Bt'HH5ـ]"sxRs)-pTn洼R Y eς29ţavh9KqMC%V|>FzK}Bֽ[cLaUՆHHvViAꅵ3@s]+}$n>p'E>5s(䌼SFt޸cN7*OG _U >PKlJ+CE+B(ĺvBd;CKg1ߔ ֥*h\X0 G% 6^pE/!U#b=_5*\kx`3QFF Xu pӵ}U '6LϜWȹ)G/]Ho ޷I,-Bc!Q.s:=DY R$yĨ'NY=u'A&|=f.T?xfifZ?aA릣KJ*\D` ucU ij(vf˿wv9o{T 3Ϝ]L[1g>݂1mf̘ωLX#"kmFI3UηUm_e6Ei{$EɴCzݲm&* 3l 3ܻ7~6BU!:o! _ .lPswk2]Ɖ%Q(fdIЖqz}A gtjLDDLQٝ > wvqA*4Ub2o5z'pd0$H4ٙg(mƐ0Dpbꓮ>2?OBvџd9c#-viS|2XrZ$\`a8[XNhuMX(6  # <27Fk\h^eu0ThVn9:õ|>ؘ%7YApZ[. {Hch QP-sЗb, Mc-hrPX֪FScX Qc #9U4 LCQMvY5195r&V~\mt}TsN'xzwtƉ&Sq4,&+1ϑ<4qne[:^~- ,.*QTE t?zaQzĮst͟m̵=r"n@iJEߑY[֙3A |7 hϹOlhIUceoQ\A̠qP jtq!LAG:=*m ,PODޮ'ƞ{ȸC{g7903]FӾq?̖,i^BKQ3^ao9jP(sg%0&Z|] lr~2)/.,nl].)SOIZ?n]?Bn@cѩ)(?˸(Q.@6= E]Ow4rT!&0%Dvjm37F_3ocM[4 TiuL` ;Q>i8%N{"hkA3Hx}W#!՗n_3a8x.a? xzqAh"0JyJ hX{%\ϔJB'{W^IM>G 5䥭ZzR+Y:Ayp\Ѝy8R n8@Y8"Jw#ēYqw,MONQEœ3ZgX?q6=&/OQX/?\pV4=&V7pA!wN[.j[VB3*+*jt-ol:BkG'ܗyeF%wht,ry;1$r|S$'; $m\U}㿮yTkҚT~NURھwN[RccR<4C*qAZ<`=7rk@6+VZr~ӊQ zmLcm?7rO%VqoavX/Ep4=L.x[#3?YD[(E_#QGW:q7c{\ vWixOt.yC:qO3]K=̵ĂC#܌@.۔l`)݌v>OX^ c4 bcǤf{IP#b%Bd$B ǔcW㡯CG|`3AzcoU21;IUXFM=pCʧw61G>tdž,—g^`D.*49BC|'BX&Y[O`Wh+﫵W B>3*װ= m4'bSRË-%oloh9 :W'{C+HC"Wr ?kLJ\\j_ɳ:Նa]hS&eg{bNbhrA;H̚L҂ڽkq0yv]C8\iY~Hԗow)Ld\f_ xfj"V€|0C+N^OHqXXsgvw. ;Q{!q=y VO29]R`8NJkYwc=F%JE(Ѓ?Tb6|L++Wٍ$dp#S5d0 /;yRP N@ A:8$ܝ@ۚee1G!*R5v#H䗬/cc9jt6VYS~n FkZ]}\duIdXr׏7;nkSPv5zfB1/mبcO%V"ź19sORm4 (g6ePQ6O,AXC׊+U?) ڃ[1^[=q0t0C8 #&}$mFcVl>SZ9 wgZbKuU9bnN:%ieZyj ȁv[˯"lrq *O~q2gy4r ڹ.>dBT$rK 9+*E2Nxfj4y%n}EKa#;&u\uK ]x2g8+Lg#W;1K im&_1xbUP5rETD ҮR Ҝp]su夯ŶmT'.lcS2&Χ,wSŸcg4c^ %O@ \Y1i2x2G{7$^ eY2vm9US67mRS#Tqpm\v$X,Zf> ֣^;,dGX02:4ߏc|3}RG1kI+v 疙 lX0743{#0-cBnånyV lux?4; oȑ3W Œy^9~Sz !8uڥa~"W`mKrhi"liL{EY@^bftC0iCl`ZO5f`DQOf΃璷h1`?ְcߝbE>Q6zdJpRjN&UoVͮ n.ߑbX'+.)Idmr ;8Y]ކ\ca/,T Ϫ:0?t5,j}3b%j9E{"|rHKcȺsT1>#' ͼ$"c~֋_ZP5B T׹7XAcmZcMKm5Fեne@ Xϟǃc㯾nw-!Y]舮˜B¤Zqi)~yt9KM 5?=Ϻ ݌|E. {甈kI2}LUz!y#H{i ŠZCI{pڲzlh?()6#3E3"=8b㹘\g2II>|8#F .XG"*`_ \װ2TK FÜ :b@W-0ni'b7C9Bz#(mGO5xN-y{jn'f5?u?i~gBά]STtjӬ{ҚD.r2ΙL :UPZ cu@yafGo )xI:[8:L5BTƥsĨM~9L;f*D Y~At}Pw]|#qLjb1z;gm·ΪIkZ!*5 WL!ه8̀1EJOA䟅b Z ˁ;|C js'7\jcXi/ًIѦz.bX4ZkO\6#FʯZD3qIbR.XS'ީl{epTPR!6Vc⮋BH}>3` x㐱Cɯ A[%Yp_h.ƕZWdD$i&Ϟ?0^dmNc(9c_K42Ɔd၂GZ5瀓qyJzVC&*N mE1pU`VA$ ֞9+qY E%l1-R O[UZ;} #/մ5-6PDvOe q$L M.ȵ:ѹdcM>HX&(tbk*)ںljav><=[Gne4[ -> ~%]a.`9H g#yM]eUBq|a ]0_G0h9'.JՇ317X%R`nR!'0moc/\gB.^v~%J*psGC9۞} R;wSèI<^5Pr4ٷ6&5=q>5Od=-gz^IwR焾4Qv(} y΀eYK9ȣp'V:A-`!G^1fhda^s~:ѯl?;vNnkZ P#\mTaj+W*Gw)waՐ|iB  lWo`_|7^:cL8!@%Jf|ע-2Zj0ѨV.F65W%q߻g!-5OB(CT=H< C@CbD%V#Tdٙ:`?`ah&E-uAp7E~6E^Miml s}#dVisA.K2 6_K (VKH'qͰ+PT(#M6͖ذJ ?$鸦zFi`588 \*j2=zK2i|+?L0~ Xq+(M8%X{jB5,xہrQ/J5(` " ,LRd.I,*Xdbĥ$&().U,ZI,JM.\X'UǬ)8 /xx4H?E$=m$=c իҔ?K6ʢ,P a0t$z9$;^mxG# r{Au} 57 DetA7)GA t1NK1"߮:eʨRBh9i^Д JNu6x;0P  $ ʃJnUi 쫃Ĭ_y(tCLX  BfD %%DtbdE}s,|-?-q/stL,\Ўs Ws5#z{tzcf2Ԅ UV_&{,?LVv $So9B: qk̤#,R BC̘y|$5"z7ސHrd2~T1S&6z"r գьhrmضPJ~D&HeU])Tpx~)VF)&d}  oQX\ z_(41C|"6cH}Tr-2DƧ1' ʘxw'x?)/5eAgLz`9y0<<~`#Dvaje%Uz%;a][Uj!Α f)!\P{_uAjOAat6a_Lqc&h/x_nZGخBR?%>BF+>Mث  n4밶a1ޕxF`/'G}58.lgv4% &<yhH?sW43F.U,47+;L*AyAX]ii (]fH)eq!bnkzʥn~V]Zc,nٖt- Q*}=}VYEφǘ[b_}2,>tm\uΫM}GڷF[TLw.? nWd6pdW6~WШfEPg]l_/ttߘ)~6varG,,Ϡr=cMqK1@|--b=Q}o?_ H /2GO*+C_c}3%k땳jNMvc^!,Wx~vaZ>uɱOR|j|" X d*9`[oIx#.T]MnrYBF\~6{oPsx]*n] #`XR Mj݅j/4 }aJRts)LMj-\Ns +- 4 * ]7(i69[2׃,mǃm)|n ۣ*bNo* ݙ ,Cs$SQuŸ؍Q00E٥y=Q?'J7)bGؤ5Fғ 5RKZKA #\4pTT ^k)`K})mӆTX`SqRvkBR4?[W1.1^}-eInՍ !skkVGIϬXFG_u<0ґjNٴlFT`ګ^nI/$$|@T15\uٯ 6 !5"sz~yP>^iQ^5$Z}zs`&1+Egح5ឞn.0rvr&¤ r-I{"S|KM|q ]IEMCƠYZ貳}5;v-h*IWιׅcs$7_&~r[LFނMcxFuց@J X*#Ǟ'E!{${Oaަ_f9#ͥ?afEPYݲMuBzxzmdbqVJjUj,)\Im4 ?̮v/hq̓KGJy<5`?̒JM)Tf]IQ{_Tr.mw<=8B3we;r@=ė R8OT_[,uIg┣1|NziHFR(>EPSY$<ܬb|H#ݕWl@Oz}C<t)qF};Yy2݄i=Cxu |rmlQ1"1va`D>@_(966HaCӁBG*$_'6A=椈 |<(oc5*n>IFWqH@P Z |m.Q5BCh SP?1br0n횋{d#kq.j~v-:iE,92ލ7mEܓn~M&y*mkُtl ;kXF^Vxa@sɼZNw/csUGNo5;`Tvol͗Dž#' ytaPǹZ%z1DlQܢA꾔P{メ6p$g]amUb$7£.dB5ai6K"G Hב7*ΤT*{Ħ%Dݦ\t4.5'|])L#l(-u'Y (~1 Qd 7_orLJ*RJ*RJ wI,2 O+4]dzsB!&tpRe6kTn2ţm9}nx"OBŸez;TOUzV~ W5F~a/Eݮ 7f3SDqJZUaۿ(uNƟN}cE=\K$.{3,w ?DM1gJb|ny1^|]J"\>J0yswcDuIW!siУ腿iZѨK_){;iZaZBgLTaV4Au18 L9b"Э6"ƩoU9udst և|6 R$c\p\EUrh7?ıA>; ?Pnu;TWh՞LpQ uyTC05(EwJD-R1GH璉+on@f@-݅- qq8s.R?z^,3q4Ok%\h;%Mq\{S;O#wQV!ӛ4Q}kNo`Րq5X!Q.n/Vz!݀ ޟeRz:^1Ӗo Jt780c]6:%`#ic9thapSoT 0h7}AJ$-M+(޼,p>H*qǛG>DqT1I2IIrJ"Ai,*E-3͝Ҫ 23 nTI]B^WT\YD*]MjU)ѴF3'!ct10kBtBxhq}GծM J+46NZ6ǒjPP]QLhOLc|NRv/΋Z z>SrdGH:@\EߊRjqɶaI*X_(dkRw>4Wv>MV{%CmWr8+pBuMV^'& <,#07[rTCQ( @fL l0!X)'&IJŠEyH30Kt* |e],bX /?LU8T^H'^%0J:IG(wvK2A%I%33s,@2ݠj9 5ܧٙD*Y_$23U-r%;X?}w>0ܼuɤʓtj0TvDvE)hKL{Dg^9 z#S>{u?b{"*QyQcOՒ\]яZ]2#/^<QJtp:i|SɍWMYbUאsiE^_>",\Gd X 8JغIʾmh3DW/:oXm뇫$Kv |WU`sbB Mn(P[,8qnI|tC%\b_W-yF̀ +!K+'` \7h T&p\|To= Ky^5d5 :[7K'۰7kr:v:^K"l+F?da.[wi=P:Cj >Q7`+eJnA$6-']tnslBۍF0[F.?RޛU>QՄ'X\.7LpC5 ~D|1*yE$"JM)Q=N81rJ?ePVع$Xcŋ !5u" FkA_q[`ܣ\-􊨓,+cj4] j-=\:siܧFbׇ3U7@(7iZ$+D݈.k#'l'nA5^{9[q>aQ=܅{wLYĹcL<5*B BB m^KtlchaѻLJśk~d=w Aڥ\ŊaT7z8)bR~޾w﯂;kd\ m6Y{%zj44z|b|ekYY,W}WQ/JPY,qz{?NHٝP"5`>1|.j,8G,@7uv T {0,)4ciz5:mόfwf_ZIP4uXM}{rz{KB#0?|*)2ɓFKF̡iojjBr{A|x]4M2N4P#?>Fl#)Xn7Ưn۝ۋ4vvmüoQTUGXc)2eƋF[NJ9p}fa2ˊM!G*.@oXv8J E&lT ?;Ȭh5o-l1S^}rB7gjD=ќ%؅?{F|HvH\!͎m89`< &N D$iSΟ _`>!hS5)(ąGNB>pRmXC|O|9@5p17 }x!ǜq<)׵`-a@_1ZN,3^Fb`%lrC 8JFn|ZyI1=WNvie҇yˣp XfE.ZdHf-+B pF]M؜ۯQã"ɶ ;)-{B0 Yp^ܠDjЄ9QH7b՚ِ6,% )c0X-E{yۇA&UtM!mD̅ė~w`̄ y¹ fw߀Ck<:Rb9x0h$/ 9uA1y5Q Ǝ# O*nx A3 Z0X<ę 3'2 a# vI7c9ΦET!V"Z&JHT<^897|a5'Y6^Œ0^=6Z>S6)BWͬJG4)2QpC6`xF; Xu5lb6z0w4 f^ub?Il 0"R$ d(/QξY9[ OKBcC$0JN 6MsJuBBr=!ۯ$>:TdϟMX=b0I䋱o:=^i8[+$5gVolpggb,T$tr&ٶυ@Ny%z7]`-$x_0 `6q9rGyDC<$( +#8C8J:YRIb1@*|" u0;PkKTThgݪ?L' P`ة׳߳O;=^?[I}ًpք ZfEA{DYV~ȅau畦![yibi: vYQ<.1X΂uvt O*|\&Xp fЇp. f͆a(K&͛FАtI]tDe\up2k3ٔeE{.ШUt˲+}]",ٛ?9 OcDR 0`DCrf(bW0b2_9<((4'R*c{ԵzrU߀eEoVͩ "$:EdpbѫA #%%eƯb{)zڠI]3Ր O!~WW δx 7u;U kfeJ͍^_`eZJoc_j&[ߕ⌷W 7A⶙b5z+KR[a.v{2wL2<+(Wbf 2 uze)ZNkvj}2V?gA`ce^jN9KrTyM{|/L< ="bdʽ]+`Ua^W"۠Q(W X]IIςCXdҺ1 {B4gxBJl< 䌷W5z2[VUpvGՌ'TvC~##Mw:Ir$#k}x?~_#d\_pWÓ1dz?OƠA('u>5;_g="p;&?4=t$( $*ģKGڦ?z? g WKl?$ӡIlz%14x !|&?JW:֓w1nd7L/NI |QT/Z}T<6ZPDu^G{_kՌ_uk҄'pQUsP5|8g$O=x#y51͇t~Ѫ>n^ >ѷW,uMܠ^3W4Wn.="=؈og+sspn+=ۋVN}únU1.op/vV.gzr-zr|-`ʗ v-}hUܐŷ?ڋ]yvZ@ ۛ;$<4m(3V>@]5m K1z u{&[F%|̂j4whZ(;MlWSw_(\g{mmp WwHT}x;s͞?fv\ӈx1lf@͵lðus'{l Y^YݦbP u²mСhi w0Wn2[v\xv-umiv(7PRDnPt=Yd@nrVBsxb0:2 <gzlڹw{(/TK)Xz9c_;vu3++_^I]*hl#x/5 Q4S9AF2kWwWM8]8diʵf!v-7p 2|Zqp+jU`|65qa7[R1oJ shȍ=ݥE=C+suwsn Q̔^c)Ut,<ξq #*!t*f*'wKK/ N]xPҾpO#.MWqʮrFlCq7cԎ>7#GjC ]~sQ Ս/t4 aΔ?|r+Ak[q8XrBTi pPV@R+ŎoQ['vb">\&>svbY5'iܡ(  a-@(i}W~;ч>W`V dDURKD4 IAB6v7RpC4 EfSWp :$M>D– A{  *a ?7*%jZ[(ȭK*$֍A7vj YM]kn+~*Q# vRvU8#y[Ʊ:_q\a_Ft.0\G0DRVSETUP64={@KuttyPy-GUI-2.3/docs/assets/KuttyPy-1.0.6.deb000066400000000000000000034265701456261524100204570ustar00rootroot00000000000000! debian-binary 1573052474 0 0 100644 4 ` 2.0 control.tar.xz 1573052474 0 0 100644 1416 ` 7zXZִF P!sb'@] }J>y&Y>=<( ؆S]Тe[@M߳ݕy8+\ y3%i9S]c'8tx"E^@|/9LuY Cvh}?I 5#vЖ4ӷWp:҉>U,7?5 5X0|>:/Cz#=xjy8t~G:HSVؕ0wn [Vx jgc(x,_Ÿ8&p@;OW.#Es1؃:*x\+kCɰ2q]_8i/o,VZЀJɝ c1p)?Yl6j:׿Κؚ9wXe5'gWO  )P# 1[sLޭ :ī o0FecݬpT3yB#'鈒07=r(:4QTX; Nq5n: 9Z dthLcjp/U ڥqMHmg7 zUx+2_BCNn~;9h^Se -?ԄSqssm2՜kkn1Ή7Ǒ\XqxM LLi,MI9HQ&UE#ь! n4Ҧeܻ13,W ;玘 Z,' Pc ՅgYZdata.tar.xz 1573052474 0 0 100644 927536 ` 7zXZִF8!U!I?] }J>y&Y:,>Ћj-R-nCVn3Q_{Ķ+NTO4z "-MO8Gļݖ[AA:$U!gĒ֕W\g0$ ɬq=F 9]SYFxXYIfj:N9ZnY;޽TZlT_jZA1:00ht|quhğ5屲ꀲi9w*9zC:V[TVg s )ҝ= 7/:1K~p>3<Κ0hKO&,ԝa9n<D=6ц{5ҽP7X+$9=WW]IZfZB,csOQ&\@bH#f`X6v{h@,nG-~I]P e| ʕ9*b[ AȒ45 P}Wcswg8^ "cAa4^[XC@kϋoVR _F%J@RqQj,[`uW+$rUwHxs^k9I=C"$ey_&ot* :Z6&ZI7^&54!鄋 K+aֈ!A8r V%+w'bSF ,i1ކ$N!Ͻ)2IBj9i{b M<2GHUOc@aDt?:+x3Ӻ(9[&N2UؐrFzQCoBWݵ3pIrgz2l-q*x]=nE9$N:r #>N AkW܌o-MP!kg9XYd>Gd;S$r=?>LdpcUw=ۿ~f1/H\;+(BBRQCLV:5@XHS-#{Xh0A a f񿐙H0)b-} e>ax *7NBP+W{W sL#ﳀU|N86IKZGQw&Te#޿* HbP#:z#41Z!M ;ejj><א21A;#]e4JT( ɗ}m54. Unjyh-p6FNt>d0kf_Ϙ}s ?r9JQBMnV(j!&z9.D(Ń6C:jYё7`聙}=[I,h(/p) ^=[{ }O8U,b`C\h1L 'iT\Vp)'k=];ܝd}zz||G bׇNHi&8 $-Vz0Xw5vdx}*FÍOÆ|v3ʑT4 *)4шq~ԄPƖ2{-]6uD9&g>I-$8eYږCgl L<@RCЎd4:̥ZhN֩6hy9Ͽο&vL}ZjFrqUqVhzVb۞~vH e%X]w *sKo{V]|o)3`/! d 8WهwqOP)]y#e/Z0ۯ\Lq LCG~W +ӂ6Sw2ݪé6W5:FxQ si)k"@ q1]iL-p>$ 43ݲ!Y~+Sj`"h<K}[\lOt"8p?4?:d'lYB+q>`t~'ӌ`[δLS8K0<* &|lf4 />K=>ߺ sk&3$xG t=}^^h#7ȭԘ>by3vD+V˧.-_B#5JXI+c|ZpO&}iT{UX p$S4ڑ )@;[`ÿL&񠜽!{^P  9p`SyDurE]MZTN7]6 `G f>WrۀvGS4HȄӽ#) Z}}Qx2т,C11h&$sHn9 ;̈́fzG5|\P7\rj2,O^D,crɈdžh ^AFZ} !fa4[9n0;c wuƼ`Z#svFCk[Q~#%~ N\|g6]Fd1)zU t\]c)} Lk O%G8VFoƟ|0h/2ik8OZ'GuDSO-A_]AR]36p;#A>uQ A`踺c%AϑCQ4>oXpA\!7.6p&Ԃ saI7>gYhCho:X}ۭG/9 D( SUTvftS-`,tD?J{'Z08h7фlYb츲rS dW[#Ƨt-荋s\_4LIaMzP7Qk*l0+Web3ݎ8ĥqjN ڑ9H-<kCK6hxB9"Ɍ1z0pjf[@:iRE#3ر)/UN5`X6@F 7xHjS P]Rwhˀ Adrflidi5]awz+]y7nc[oLm$K n;q ; o*9_tIW> J3o,*Gϸ ndĵ͠R&1eF{wԮN$ͣ33i=TXXCsDz^Ÿ$H53m/&vWV?mrʿMiu,~(xI 4;`JI1yf/k3"|bǓzۑkІFV[s!+J帗6=2dIDc0gU1w8:r"YiGhVSqnҤ3-689atƿV e~nL4`_[M_cE*^^I:zۺ1_*BK ѢN k\Ay,X5r|}0@-o‰~^^zP +>F 4C4!_,u8Ƀw?="Gxl51bjwS&sM Q(jKM3 pV9*{J.z9v)b (l+7<~L0NB4ЩrGUbl/gC,18i$`颭ַI #Ӧ~,0FwF_Cs8K:ˑk@$~̏C!6EN&VT4ڕ4d##%VOX/FsBal>wY}6.jW`5SfWOocIquD GQfN wJ$2mtUSǞZ_ lDTr:dvU B&=\룽4w4XrgH}㓨f]\Qp _[[ϻ 7Ik݊H9r+30F@wx9`-4(Y;4zۘS< )ӽz<ج,k p9^s\q{]pL+s̓7`<}D{D%<;ݢ` \/fp+¨΂ =M?I dk1$Fסx~?!S]#(uqv 453ž*~bPwAxkK~9~|[Y yxq5,hPG5ș_rmtiȰ1wP0ϲhIg6mܻ"~4  /hjΙٮr(A jR~ q8N @,*(g5{H ,L$M\[g@)]2+gxR@%&(V߫)AhwY:SPx;XH_"DRߊ^}[{ٓ w:Zʐƺ@Ybs665l`K,3NˢAMu ޅY>t WZqgNUFoʾme7jO#ݩFNuK0-oiYC.̣f/m AW{U P'S u5b#ACY^os@?$ J]K<l Q{qQZEp[oE^g%=Tȇ킆l\q́W-jDM$0h֍x0j%M6[obhpt=UC;'w/zvd)aHs ,5)PekڳoޚVKG;ݾ(&8 "8^4k~q#Qw vIhX Ѝ$رb#NCpd4F2nfj;tmۇ<ɐ{J-/D/щ7O%_ IiO`674 |M|CDԛ>5jtZ3TcnO6b7#LG=~;&?T Qێv̳ލrXH`?/r8KogbD*]4ߒW;".V\c!͹}uSу\3k@>жp+_Q)[0O <9~}wP݂\n*"iXˏi^L7!_#\.cvkjcjFj?*J+`\ODUwH$hn3 5x.rz& ĺt!ddas4 RyVbd+mRFw@¯I=#Z%Z"cI3+~NT ٚS`,=O=I(c^!%"9G |H|A e3uQ8}]24&v[VE(&̖8uQN^^b1DQk{t^$Z1EI洖p_/#c[6~X))?sj/cc[b ’,qWXTqՓ/1˓๔SVt4C1Ub*"bcsV{VJ&_J5mX ^' ,g8Uh;{ӬrSc'"f씋L ͸t8?4^C EMpeq=OfXԬfV# 5Z+MaTEmbUfxƦ% t9y 3ܨ]l{&yx=Zjt|#w4nT1((O߼UVPiBG(UY0g4=__J~I*n.jl89JwKإEIlizw"Q!-uv迵86>`ޟ!GE()[ΕcW yn?n/RW .;ט Lx7fZi K6I7==,9 [8OU477~<=ߋ fzAihP[V9E&{Rvw|ެ=BkLLpH+)BR5FsA|jH2e12dK+ާU*XJ阅[C6_#z.Nn5Z͖r"ER8KϼsZM<^NYi%|xB㼓NU`i<B4'+bao@;mf;)މEMt6q2AwN3qt"WrP_ 4-5OnP<:H1b4+Y]+4*0 [LE4}C=%s挐OlFHҠ}+5&a%)B0D)ًפ?-4JYUu؝ K\fk%Mh(vP)^Eh_XU1)f1KJuJzYZ6c4U{]I21#ܶ?J)P %n~lBjoOފ_>6~__m`nRO\&ƿDϜX-/[-Ϡ7^#ybIin!R G*T'嘼?;3(b*LQKFu d^[s4%[2{/ ;UkѤi mL؅:+fg/ׅlMૼ'1rx`A vxz $ߝ "PWDŐUy  ɠtʹL.[\ 1rp.[FiBYQ$N Əyh&8ntot24 K3HV3! Q qHb_NZ7GLt lURc oetlG{1t`)hᘹN<=?2x1Ee 9}V- $v9S [/"ۈ0YQ7jAg`vZԅk`ҹiua"_GHe7#|>6.$V%Alp&g9'jifbaHH~Doo| r8>d Uka7UUά٪hE$6d﹔\O2X^u!6IZ6iwg+ZXҦƁgESDT`P[9m+nMP2翱Ƿ"2o0C1=nB 2~e6ְn[8EhN-4si>Pܲv a}?(Ł 9etOdU\i͖/3l-if͗Ho.]4օQ{fyQ@g{k0S '\:˪' m62ruNGO3$,@ 7BrO}0 e\#⡟kvwvJ Eq0 3~6#p&^m RnAw `0F<>:7E嫕%YO lfqImG ڬ|<)L} 끵':Oˑ8^Z)|Ga~ 8ܠi׹8Q#k(@wć}}zާ(A 1KI "3cx-N#n%o?O;z 6|нmnGT@tt\!dh@g2>y#u0e t|sBs<0'|1:byy V"dh*hQǹy _J>-Qqtf=<`t(aY&e T.y3 t]`mٮ욆8Uo~[I D m=|MBiȔ]K+Ķ<c޸$[dGGu/֞6<.2ɍ؛Wp۱ YVo 1]xS=Xòe1;;xׇ{6#wa7Id,Ӽ2өBuPŒ{a`q$3@k3}Yee4\'aG{wpέ/تa ΃$sp}7h.Au/,ɉC3(Uhcy!k]e'̼h_UNL ՁގF-&PgdW<\:<xn߽}}B=MJ'G@#+dψs*wF#*ʼnT(J9X-f3߂~ Kl2f5fb(ݩםQ&VAmwkBՓn>K>h>A(ŻLvdN Y34xqb>ځb2RK@j/u2<7V?(uQ5r0njK 0) (1QM6K>ל|Dn(]}\ڞƠ̄uN0^̄Q]ͭC#.AQ[Zq~ pD{"rp. *go($דyҝ)(pqH)gZz˃͟P+;W]&ZQ}m(FL !xq̡y ,'hqy ^?S=+dBa c(}(4hĈşw4K<nJ9s%&cRECMG^Yy**⛁i3IYYg!\F{C¦!L$ex)$R\UI@+gAV$s7cۚrmcFe# 8UfqFnoim286PnVI*lT7mr%*4ɔAoR;2H孮nA2KаgW ,N47gF"M EjLڽg!Tk(! p`VVi58OֺS*aHђ{¶{^ϒ;۸nJ3)x@/cǰO).GEqIu\q0giR~Xa Tuo$ ڷK [3:!+?n cW[D(g?q.@@e n Q r,_D`3& W%-|r$wKlNA| i1M;g36=ۘK[m'?:S7dtr)s1t ^6miB8쪌Ú \&UJ0Y0갞dZ6MxC$4dKD6IsQGNyhʒ\n鉢piC3D#6vkHB+1yI|C`L5)x!֍aoo 3fϭ;oN Jc9fl78V S#g~{:~ϸ(jewf') {9yzLW}5PP 0&p@(Q!g'tcw}!@I={MyD 䥄TJ&V*uYx e$B^uїdF T*6^o?x ^1C$ߖe|vl<+Ӹ{ηrZv|}A81!h!}l2}}B+GmĈ*͒G"ُ`Q0D9yh8r52Tn4H! \@ߖQMWVn!ˡpq|,9<wN+AWʚ3plCҙI%]jӐBNM1BX#{_$I!* uLZY]awVUzx!!?R>ώhca4vҲPCm ݜ*6mYPxpv/|՗pv%b%k/\Y{+2U?;ZPG`hɓ۹{'c+#4 {c [#V׌簧 f\w8C ƌI&?MkLJ^k U8'> J=0e֘7L‡|Zt.]hV->͍eӭ-ZLu5Qbnj(YFxzO\6/BÌSuwgx(̦xʟ .ܖaaμYV8Ty!RÖČ=1{hzz;unN%iZlCִVO6x AŷYt M#my=n<Z˿WE,a++ߙ}s9|UBNT~) +LH2qCeF$-h q3#k5;g@WHiV+U <!ީ㡚`e9EyCڪmD|1uN5]4J$00WhX @ q^p B"'5b)xN7sTP4nms.uG!bL%n!|>K!!lJ"`s\alH 9o`E*^ku^0*[T Y%ȖjUWjLOYI>OCI'r5 _1b|JK ъq&& f).cL)<%}@؋tbW;Z('c`5Ͽ~Ar*\ҧ]Xlb%`,P2KJi#iMTl}| Ԏ!}J3^/̐zDiM dF.iLe1\ɑ'=,dL!.? |G=71!ʽx;@ƾ'*AQli-[7xYJG)Mh U_%6xt<-5%E,^ϣ+|Oκn3CqMCmN/Z%OA'lI *^A*zm$,"-}7B^"4֢}ƠqH \)X?yoUOBv)a^vP5ֱꓐB[™_:]5X@ЅOA? χ=b/L(o*cWpVl3 \Kߑّ*zXޞqOqzRR|i-iHS+i7*,G4&A\k.Zf OjeT!R!u@ F9Q^GK` w&{һJ( B5;aT/ ݾ]/9@*f~_p7,d* *mԅݢ360 ?%&Ӛ/Z~;#jaFcڏ"2rUkxfeII+E\2c؍[FU@UV{A۬ iz+QOBO:Lk2> mrP1e!7[d o0[ cx:h%eB,ĸaSbEYzJ 0<:MCj0oG\5:odҪ& _!B#hBPqjxZϫ%W߼N則5ߝtID zBF`__zmbvLy-g.YH2|m V;sA$(y XP ]yOiLN^Mn\Kw:C_)ң7FoT༃X5 76ۀN [+vuN)p*rмʪP^Szr1>oc-)SO#N2J>\EPmo0qܥ)9P}AfЍUlVy7u- Qʰi'#8\VO𵃼m z uvLxSx,N!ah[@7"J'RltY+\@F%mϮ7pS폞uzjqX[^[:Od.:~& "-}QE*:ȋ؁;zJU,%F{@(뚀}/0S~F I|ug7=V~aD 3$(&\lciu+ZP6}K}Vj(ȅw dbTCMDͤ>Q$B2(݄V8">]M-V`i1?>zTyapfO`W,Gz0C2z?1>ú'2zAlYHN%C&hӀ1ZpX_ƌ _@[}gv¸^23wcQqQ:1.ݞt]lhѻ^%;(씸=ұln~ ymhd* &Rc/O[ WDkФ)Io6T.DVl^;*A+i`ySN{tE՗VGzR#2,R)לEm/!\I~>SB gcC@6S}˂fŽL*W‘dY)5ģ;Ljg09Q E{g7՘M@ڢ/*\,Ǚի =JiӨӶ1fP)H߳4?SYK&Fm9]&<C3D$-i/Ȗ_\Ol2)͌ɠ㴶Jפ`Ύ_A_7;{y#?dֿ$.a<aqI|5yIs 6ghw\r JU93sTLuXGʸĵOR[Lab^@,{nk-F-&ֈ닝&Uy cS噜܆!<[wui[.bM@[g,Hl\n!S{&6uŝ%Frw%_m&Ae.B7X-)!VCkh~Z|3Op{I;4 ;6*;n35%q7Jڗ mm_&L;BYO\Hf+ J(At 9S ,~8 l?BƶCYQa. )Hs: ڛHM:̺%a**Z"rX1ϴLg>f;0²/.3D;JlR.Jbipoֲ2s!)0p)՝ #$iYs>l,j#i.3OSw;tt0r8}06sK%Ufq8JY(]9äb;W.^F"U0!]5؟Ն[u8~X g5TXFe7*W,P?2 :ԙI{9CEb%BFkFlH Fx y*KVV5!j_k&EХ%X[2N5s ip7 t)z1DznG [RA|@?:'$ 䤩W}bTko2h"uJ`L&Y,6]a%c"zb]&<:WlY:HCԆ;™BfMk)qש3 _x(@1$^&-닡iCtF 'T)c; S 9=DFysrCGAp@,V8@<qQZ#~3?ԨoP/ 6% ;C R`j" - pd^ ˼9u_E 5۱>B~Kn>sӵ۲σ!\NT:W'Tmz*{GqsȀd5[ eʒ^Æ bJ-0Pfw =y'\ ViH] = @Z_Q2ȯPG 2-qqݜp~ū 7;@`h1-`@lKSLZAc۸Ђqdm`9aYV2U6L{V{*dsNOGʘW 7?,kXWrЁc[W͂9$1 nҲ=I |y%$cSe~&}2Lb4\8,+}gLq8@dtiU-<t𙡅v>d F#GL3N/𗠇 ~0 (d >-O)77p- Җ}A3FQ²!]b;:m(&mT# 61#-644ԣyb5z^}i'HP؋"\N@Tي>UZ]+%) iP!^Yaf0Jn4.o ֺ@__1xp͂> U]dkj_; 4Z y/h {FLGzN}!m<@PM, meĩu v۹ ºgvԆ 1ԞX9ykZ|Νr?=;HKRMmi^ a07۲K&CJ5@-$qE5dDv@mWܯ!S.Lq3qi[$E aMS9'R@N.kTUۡζh$,mOAm83F#a/ #admY8ap|Zҏ+_p3~מ-D)ϳpIͩ7YgINݑXmѯ|Ass]U OVR]0&_QR{Л@`+,\?L㛧[2븇a]09c5o*cXS#m/ÑJ3n [<׶H qQp`zx]ހ9&oǧn*r`gW_w1ee(}ݴ˖f:^I DzbvyC:@ŷDL \-ָ-X̮x 4 5I}MUrKyS s/jcP]`lѲA&ޗ j!ZWrȼڿ4/l%}.Ej?.Tlgqa6LCi/[S¾'ܕ,@7i!VVBrO \܂+ּ]Rf);6x1zAT4P[X|]#.tD^3ɢG|۷:9(3#i¥T=^)~X:pڏ)\i{,5+Y=o zXֻmqrA^XTs10@0 jIkkL DنPl( \<[tc+j*AX`Qڍ0Ptoqh3iKsɐA}x1Ҵ̝ՃaAWb{Y#^#صP18钬 t󠐴ue]k_:-lү|Wq|rxt#8FZSgƋCS\De4Amߥ`b([|H9TZy-(F*6KyͣJFu=PVq=&}\Fo1EFm:NB8f[v],Ln>?abaY[2FPE=yc@pAW"X]#?JX K"K?\b;r(X=JX2xejk=:B; - 5Zp7)]l/_0(>cBz<1}QG;[bb}7QZ-=3;$.c'jq-y_ |$b?EDA (C*i<5ъRA%Cw)1D{iz&pIxwc)ٷ+sN_[B|xxǑC+A[I4sǶښp2ED %$Ӕ<ǖ)7ǟ׹\M+w9`7jC\dx3y&zKʨ]@~WU" ^QMv"̿Xم՛bUIA ZvjHFg[%"\&VekS*SfZ](}'(+NWqvgnλ),N2 땖5P| B0uF|w,3wDy!nP8֍-Fs=JeA\x0Mo +_nWν{nf4u2o+4j8 XFꠠЀQ& 9^0g-bv01 (j9,1ށ4+A\Ȍ -n`Ud5]vh{k _,Z`{I-tH 퉐9}~?r @,,"z0WM۲o19d^bīnqãǫ#M?3@a$$B_i`5.5y'\6~.W{H:ru/+rGNq?B'}cw? SA ~0پkcVتmUꁲKhԕn"!*0RI({}|n'qL3ssN2:c$2d*Z/He ́!tۏn1Ds{ If}˔2\0LwN|>Iobg0Bu ܞ[4'qeENW0z)ER9/c!Ҏ{J%ՊB^=N㮋/tѰݳ&H`ܝ?tsnr㴝AW)j|ιdS:hrV¼˽ d4eiQH#weLϠtۋ?[ "@O*3(eQJ`1zkF䥤9\lCش^=NG[gL^63DI4xw~_'4TՍy#=3kł[p%Vl9.0Mk!oRcAmsNᔕ~R)אLkIԎ]gW_ؔɋGCy҅,v G9/NNaŶN ɒ6lrkWH́QZmvxVo} &CtG&"8!}cBn%CS,4RY?,oɬ SI"7i68` E8unPmUÍQ^hID%sxv (:xsHɃLUMosBG%jȷ`.Y|޴ĸPYD&R5ܲXv63jMSj3/^8=KS ]^w{,}PcP/ԭDUoUiKw(8Ө3Tν3Xئ":O%!k.{9m'>aP &`^ ̻FqкIR_o˩Ov]TpG/EAO3:r7k~B0&]?\af+syPsZeJD\W7Fu!0R_D|ќh{QZʬ"ʫRc 'nǭ,G2\lM¡VwL[L>rgI`BV_O07T6N{tO E3Ǚaɦ( ˼VȂX߾hŸ/k6.鐔VI =Zf@Lt="pȝk#O="KmZc8͸{١6w .|: x3X1GƂ*$0%2c(X>xE(ڮg>ɾ,HVHln\Ayݻn?PB@SQa̔ oFȓP@.w .Ĉ麦,Mw(^;jGM?Ȅe(8c[<3 af4[(@5HMQ:Ғ cJ] S@or48$xϠMܜ"'"a["+W%)M,dmTSjˬއC4#PJLԞ;Zrl4fG]%r~)$ȉWTb-I̼ؑwi*~ωd\k[2ӛ$~9laj\1]=z;*XQ" q(k0!mWF jZV]9jtpwi0=_#ep$цz6͡8Ѕ8ԼĨuAR=S-;'jœ䯯 czmrQ̴1SMAu>A-Qx' hUii~Az|i }jL]кp5书CMg8.;YGQVe?Cm-Y[ Bpơ2hjßa]6>D %[AYI49T9Ou]$jz}!&¦[ ]ץ b{_T%LVVLmh.9 ˉ,LйNAH5(,>jMD౪iR ^e絯4@XMk1vI?u' ^~,n>2OTUhȕ>+_s9\8vbp꧉dH=5\D^=p]2!Ba(D16ЮsYxi+Y yB\Oz9#|8L0IZrHBVf{K +xmțǟ5LUy Q)ƥw=脪x'(H4TeJ0ooa^c:]}A1ۗ>!ǫ ѵмmsȤZc;y/a Z)"Ymeɪ.+cg;/rqڲB!;bbb-8Pt#pÁ ƿ%g[T4)5Q1N{LFG'e*"bAdE;m!mERG9W肽'[H\t"#9#}=A4%lt{0y$hCƛZA3c//DJ=b4 DSYp7NȂp=hg' 5,YfVA7fUTَh/f/#hEZ<}edڛG=SVO'3"()hPV5"zly,MM}Δ->EF Q8(PHS%yjN1yHA )ql[o^}YD/(HN׈j3-iAN/?Lte 'e X*+_e08uG?Κu>:Tn`Y"LxŎ5kXgOJHyI˨ᅗKN%h?\<-xf+9\@e'3bYmRr>0 *xA7pn^ʰ5#X I#?Q̮9|MxH=GV8yثߧ\2D9>Rr6SJ$tCXl5}ig\qctϐ6,y9|[xN!|PuS8UuiM]WR\2CNᆋuS聂Z %c]_Ӟy!4Vl66ѫq@hj0K[myj14nlDor3>3J摞۳-xTs^3"v$s$'ͮV;ڇltW̸c^AMkzM,~9[Ay %O5PИm4yŠJrUFuKa{Is Fj|3տ#oЧV3vIb@ >7eU>a50$mz?rt21R8țY[{.#}A]Π,="݁oũ/yiM Y9܀9~-fx$[UT$dhvhC$#aS#|tZ%Ed{>n /N_` hd}AtV=Nƺp6b#)Qc#.勎I7~ʔ{~sp"<1͑\v;hv5_513d0utIA:wU\H DcK_]svȱUB<: 9݇s'̻쇿\U ~&pp+}9ܺ'CU2IV^$(,X ܣh&Y+M4XSU KwgWX SGQ5l]5nx&aLoWSLl3ӢQ/N)^IϻueuNNf?268[B͟e(\mQC Aq`2%?/w(F_7V2صE[(5m1=jV,0<ULSx_P>[ N;I"MPѾ4.km-= I|)r2pn@M\Qt;O'Z| X,L՟-s|oGq9Q7ڌ=AXB$eʳ  ˕GRmLgXsA86 z6bgzQl|Ҧd 2?Sm`UC_3&ˣeR] ZoF07,!zFg im DAv=.tZᯉ'g0k*%&w@ F%>ˎMuZ9Y^o{Q/0qț3 aj8wq*fZ["?VA jE{Z+2?! lyM+\!k6-dE}t{x1Bˮ4Qpc &.Te 2It5.DW*_%*dd(rҞ I%OСpC`7i'iMIG,w{ޡ/#=5LSwR b(j52ײP肓Ռy'H>,5= ]E9ʸs%9ɞ߶xd(-eK}[ZxQ9kP[;xPGh5bW:AZ~^pR -/1ϦTOG I?Le6c ıHm[Bak SoC [q|(_{'!yCycʒ}؂d?&j Y}` FY5`2riLvwYi7O='w׹0OEEPÃ;GdY-<…[ 6_޾{y~ALQs2_RkW AVl6o2[ ? Шi H1Y*]Ûɿ2#2 tk?An*$g ~i.!7)N{Ve7前*)o`72EfTjLoY ga Hp;혱{N_Epʸ| \n*K :P}~%'N 6G\k_c~ކVMӅݱ-P?kF]3r4ϥZA`QXLgPS-oHiT8i>TI("X"Q= =afupۣׄU27F3~ڜoe,7;r Vt%Dz z!(\4X-)#.|=Z{,3{@4$0;֭V΄D /|po 1"?5j@g2Q KAR* rTkCȴ`28|KpFmMˑoJ]J-;J$PO8ӵ,iA&V=MK46oqKBjIk k曕>KO:=}ο;Ryƀgm{O3v$Q $dlIE58J\um;QF-$Qv`T Wψ,1 Մ͜D8;5kZYc=M{jyzȌ-]9,5ioӳ# ?G2]J&=.~`M-S BSS®ᄇ30w)w]os;r+neĩ 7SsMz oz%eb֝BZ{DC46 $Lg(`YZnA Im{S~2= _iNSTQw/1'\Sh* 4m͂ˡH!%gUT!I!(9F7/IFa1{ǟo^4+H@k6΀ɸZ584PmiipX)rat?p-*gAjޫ8 -\2} W_1T^FIt=gL B84|n|.0פa)(~/\F]ne&]SN Ev9U'F$ȧ^ܬ,Q>e*A{ow2EE0C6OW)S 0l%SunYcTg$t -ޛ=)'L2D`ڕһ9XV/y@"^61 -іs?ӹA=zL5¨?{΄h}G[Vjt:~(n9aEVzAEXi7n*>P'.xwF~_u`y$kԝDD+rɳE~$&<ՈՋ\WEB W>̥Lwx539Nˉșb$fyJV˸&< i5(YDǛ4PA8WOPZ#ZHyMyM~[h߶ _'W3ܹtO.o2`&?YHgVg%湤fmx*?EҸ.~6~C+o񇓣]t.xaj #e$"ldAjB6eI: EO| 4 ܃oEtc'oC]%B8Cz8rzq?㔅[O2%D }e!q-%TV&2]Ui O17RXAt|Ll&#b8k}2ᙦŬ"FAyD%"uP 伓[6- d?sNRůW`>PXf&W ǓqV |u|=^*:rOUd柳ވP˭eD5iNѕPݠz[ a#oX8GO(-e!7D;w7B"˘ 4D[mbMT9 -KHr15Gi ;t1@jЬɘƎnt'6`l_)E`z[Uk,iڔxieLJho~2"%8k,\zKxQAdl{@~U i3/ɜCAjޔBH7*\k_ rnwl1!T8k42-š8\2&ZCxK]Ca m[el:G tl6R9a%C/HA_bՈS= Fh}E# p'9Q gRl@F4U\D7;ݽ0Yƶpes%}P-BLS+݄1{ D&#OV ĵE8)ISsmiU2] P Y ܮ|ζcvJcfYC+ZsF  ɾaNຆ1P [y_vǿjw"_H[/eC[8ך`w*dRyJ!}>DH8Fb+3Z6T,BA LJIβ*6}-+gvk4&ݚޙ VAgxsh:cٜyL8tZtO yb&V{t[}8V~pIy"ӣą /ׄd/]]c0zqoqt,,ȡ#}j.J>j7>k:X1+VcuL)V(;7; ۗ! 9_|$awH25K+Gm{R鯃o+GSfhCԔ`4`{T 98ߢEjć-K?7ldw Hjz%";>5rl4sWek{ULtY =e tKξrn&aӈO.d* NZ"&|wt}jת ~)ѥ]8v I taٓ|-Ute$\Śumb=׀?I\ 7,Ryf@f{O#=`BP"|/ݦ<.S.J'}9Gr^jݧYoB^a?ޛ$ !ͣ uzk/n,NDŽɊ:G9#TIJ~͟lgG$k7&&ǐC td> :oc4%*k1Μn#$w5e 1 GW-tm-5^zNt)ʛ9k.:gz)'Wօ ,gb9A0a ](~h~D'm=9IvFX@xrc Y!-h2َcp1 %nyr(׈G@bfhh.n Lj@ ;?cMAeFk;9 T(Oԏߢf F_N .8!O_owS QkPn}mH <>-}-u&VEE6 Q+m8O65e ^bg*'+'Z6ʃx4V !B)=ݦgҽod OB hAiMKԥMT$HK%ҍxDJxbQe릓0M' "!%a9s /.仰ד E©!1mVRTzI"|z"%D [С{6mq, . 4zQS qXrJU~ŹeLhHp7,#\t UF .^iE0^2C/_WقA],6.lW'40;F^b8ޟ rH&6IRI ,T{B,˙~V8 f -2 v'>;S"~իGuy:]}C̹REkD #^om]~?x>oȯ4 %R~$:2l˜2Y1|NnñH=tD( `ORT‘5z)$.a<!S\4 N{; p B %EΌj̏+Х8R19~õVuiq8Ukrx2'R뾆/m{a[{BmQKU洭70_ RgKZvj9EPihD/_2-d)!,P8HhRdZ6>i.$Dm)$E 뺤^@Č%&isCK-2<;voycb!v {"ASRFi^gdA(Y^W߆@w!_޻8&C"#{zCG{¿ۅq<$ALOPNTXއNR4I B5i>:;~TQbeۑx4 AFc8VeҼxh0ߣL>%qFrc2 \G*F'LGx^ׅ1xDv7R#SQy\I+0k,]dR¡:D?7Ce 0&e"E2;v3q7-l(ӍULsTȈu U;{nT߀I.e>\8uzϕ6v`NŴ隉^[# ^/wG0j-j O]b&[  l#F!y L٬Ә4Z=9O}HQ,kpj{HdU?N_S{ͣJeAGfOrQ%BE}$~dfg)7oS?k+{S*v@ҍſ/496U?-L(4HIf \[DGJ"LܽcmE%Fʖ䎌XC9bhd/ffjȀx̣j*SM2֋`u ;9N2nv`%G* 팥xUhU`A#ٔߚmnNߖI*.}bszSQ& 8d]3L3DWܼti~\%UPH\㥤fGq_i`>vPUw.PUĻn$[N'}3z8TP>6wO#A˹8<`|smEQH>J6YR=] *DVV*m\4M vZ)%V?;\JȠ/(4vf(,\"PC/Xu!FЕέHFM5ck?b]z3n€NFbh֨G[S(qЏV,qvF2Ϲ( +v:g#^Sn\$4߮=+Wsoo?]pJjѢu81簚;L6~u &of|ݲ+93ITcJWQ)Y=3i|7]tH:>=It:uK`8ˈ"9 WƑ7S#җ[B46=(ǯAb󢼓0-ڴpPYF-[4 a~B;Da( ):7;p(TPvj O3֤^#BL=WJH:Y:/CPpC[fF~;Gӝ)85T,Kd#(爲NڐŇC%xYQ#]]m䓅 ΂xzga2 ?^6Jh~2͙)+_ N3~5aZT`eޕ968nYLj~pťh0gciahyr% ʊ9R/&PՓj/r6( ٝj]05G FXI{U =zUVȯ>=CK4iLvڠAK0qI׀k%KU 5;v͗/oL:L>@͚NDz1ڷR\ՐTb 2@pp[HFAW@1-fWǣ% !˜_˨ )QSџ9x5!艏֌a1=_8Y\:[CJ-@ 8߁Ohnaӯ- !6-][鱾Zuh52^*밺h2ً٢~WX,E1|:*Ur-=ּ@)pDS 1[F7`J ~C[Z"ư֝a۟( k_Sg䣥ndA^mEY,3Tw̓?l"rڟ ˹Z-I+(q^Y;er}tsLdxbǐ5] 8V4vzn?}7(&C9NS8x9Yn@͓gb^Lq9_l$G^PcTe55ءT׷5L2vfg$X](tB=D"n7N-vpDR @wn=0]u=*ŭ qju+N9)b]KTO1Iz[ ' 3?-2m[X։ %,>kΙxJp8>vȺ[">"B־)Ӊ XIfTy cqA$7GM/rKFӯ¿z?2vGOV7\5e"mO7B?<i&4%ސJ;iS=9~')yc@g+xT [_\n? lx^.^ (-1q RDBhUޤ7M⡽<  sIu!:!pXiONE+j A¼ݼwSʡFC=fL3(O,h Vv;D܁ @e)>Ⱦt̪o;H`3} kwăǘBSWDCj-*1P0zfH xc52n+8 >GsH?Bfo.?i588AU(Rsgޯ7y}A|R; sH U @WqGE%9]#^I~J&'vsFQ<)(LXp3#oJPߪp,29!.ܛ;M /MmI#aYH."cYɰx'GȻȅ45VǛ50LUH| 48C5H0Гh:Cƕr52NI5Z-fSyZZs?u YhHA)SkQռ/gQ*r(Z:W]-z:^x9Po~ư8wψtI@eޢ–4dq LN?Z`"gԎzN.Oi*n -(,65Db.@\Z%=0QJS/٬ _, bˊ0|^EX5&IDW!j6cð]o B1^UF}H 6T R&8V^>*yXPFU^ZP:d=On($[ E.uXCeʮ͈iqob7A&FAFb=kED4[n {G7R.) ŧd@odą9DzZ!SiZqQ mѭ?B/e3{XSfEC^>:a ?rGT2 ×C œv&%߻B܌`H^TJ~"ٻ>Cm3'\V Gr,{%kܘ QY8s(1 'zVIRkMmHn`d}5sݠ|7XP^!=`n9,1[?g \\v# ,IeP?=p:䮝RJbmDB_QŗKDQZzDfvM7OH':OeS9vԡ#J1z~?** Q 5nA5W|ה ?aa2=baLOjas{$N" c.M""auy{eЮf u5oSBe4@O}i~#)E2 10[hkޣ*~8ng:N \V7Hƨ$mKʗ74Zݮn!GB Ibp*914 iM7,x}cݯ4e"uZ9ފ4QNh5ai:w>`$l"&t׽g?xv9&Ж H|ʋ)c`ɭ0e蕔dutZ`n˱S$jaQT1hL@tPxMm:]>3?սZRģa7'plS$!qqAE&P}Zԏx\ϐ^풽ζ)ԛ?wwrӅ#axN4ҷ_#,mrצ5{:Q6VoHp 3ߞي:1!~[o,l9ݎEލaOfC[Amԭh"`/ܷ>`Mt>|)G#0_I8|d&#:|F(?_*EZ+d֔69<~ޒp=e7(֜LngO^WFER}M&KrFOZ ާci.tRC0K@G԰k ̚닺Iݚ@d6mt"c賕1Ƞ svHL?>̮Poc0Y#a ^,5Y"'bXψCD#9P7%V WcT>4}uUEmh߽D3EuZ}Љ7`Gg;=9,5jtĦ{&u17!F%I?ּʼn 8[BFv7ٟPY$/E26qyI;:r]US s oP&$1 JC*k:V6,Bz*VIDZ糮Q۶G7Ct8NZ1 8VnagY`rD"?<ҭ^0ܴUU;*;wJ_H}3DMrPB>kPLk=f *IC*4;(٢ XxKSzK#w~UyuSCwm{&U+9AV.A`Ѥ'Ѝa'6F]1LIVz&IdD֤CXW4i틌N= B LpQ[ f5n/ܯ09%,&#+ٓK3']Mb鬉## pNXBs^WxG47>u0kR&-`: ů7=:ʺZ8ՠ_ጞrT_P~]\>MTԵ7:%(~O-3GotO:ϼz-A&>nߣ/j^lhI| 㝦W%kؙpdV}˓GX-t@vntW!(xYO0R:98x=;Fi*Yg #vz@﴿-RVysTqG"+$c.b֕ KIm/4Ӧi_5/Uh埙 7)d=}Q)SkvRͦxf#W5RhJf ڳB]E[#򞘯ϱ{t@WN&ViV@7E}oJsbGwR7Ƿa:/Ȟ#,,PFBn4c!Kx㸂U]tYuV,L/oߚsdͷwUv;X-ڄs?4U FcqAf) hP㇮$V׋iWaqgl%6%q/}EҾx"gi#g P(`::2驮 2g?US!48H*#Z!cQS&XPշr 1y˞v6"-3e'XHaDIӋA{PvZ]xz^F+Q LֻgnM4.6'j J]'λ&4y+n.tg3=-)V!.Oɼ6"Bs{ЀBMnś!óSxhzm-chB "))heMA;sxoUl2;@9y]msh3{؆f̶%q+.;˹YC43.b蕬ߗ%/◴,%rr/0HϪt.rO\@?]K 2 #' #ͼzik_ ] t5. gZ>U 3Jzֶ&} \=:MPdtBSKh/r-a|to+Y*DѧP:/];O$HoW[CZjSoe|L0b $Dgܱyn(nӣ뢌5wȹ080 B˚sWK7KL׈6kD qDMÃm4ȕ5 ´Թ~IVwP|%(BeQsar~m1 Ab :n"PQ"zvd1\'+Y'(jqWM5aJv0Eh ߭rv* <-8<ˡnY kl<An39TN[ϽcL23vF_ P!'l T SLnz|qUf|rTx"!ЫS6Uj0^}|yGu3S#sh'rՁ&!"9\G{x+=qTg=b7 dx5&>i <Q`t{`:TǨq )YV\s4$l":dY~*IEOf5ӵgmAщxqby3"9LN|I%J,h3ϕ)|C*h9>-𛹳+_iT-,Ii8h@"3.noӽ ॑>|EWhGj#>qb,&-$0FL7e> UgqTʞ cao9F5p{Fšj[.SXsJCbZ,5fxhnyt䄍llu~fpc3--~{h~rpQfطTV]wgZ̍V"qpq|SBm*+DL ֢kB?`LZXD 7L&@Qlc`򰦬-,,?3B6e"FqHR""~~ʕ wa*^-_n7y#[\{v/:Ą1BƘaDF?B3$Vw rv,}OB~ZGOh"rw)+]rW ^^ǿU[R)Je/,}#k4%<}SWX zLuHiAFHeG3CX[ŽYxC3)ií&ɶ]avQ@|C?U<"vTˢ{ڎ ƙ%P[OW5 yr"}Mm/w9] c+:.a*xѿ(alEЊ3KNwLBWܹ! jz^9Z뫳/ p+lPGyƭ{[tB@%9y(}S_aX) ]M\y_ĕV"sv 椷h2٤c8(LJ)ⱙ%BB;WO…Rb{apttcK ﷛DK4 LƐDY6pF' z1˝fk0uAU#bLFm5\&J5o 㜼=g쒆(G3' uv,dM~=RndK~MUȇggt\X+t kv^ W}w۠,"08.IYa[:S"Lp뿉aN|f^K#@B_q lMt{%4X8u% `Ӭ_(_ųm_kiT5.u". pɛ"TaU\=XG;dg׊w4cBɇ vrŜ6D),4XS8TH) ] 1G(a0 Ml<g?kSV2?f1= OCe%L&b:#B Ģr#}oȠEbyQBa%N B‘f1.%-Eqr* P'!+쮳2X;}4{bH7 \}, 0ъ+vJ<(yNZ{dtV v.?BByc\L[fW~-*~.#WXbE}E 3WO%WX: F)I5LqԍB "?`/븟=ʒq Y?9O~qDZ~SSН#8>]6G:ԥٌ]X HzqY^­Y<a޲Վˍ۫lM*DO^HxFAc?ע%7,ur<2]\=fevw;)?~w\BEipU GcfvSgI0?c{4;/xŁTK~_c(XIB\UiڕKЎnji5@@fX/y+HukuEJDjք4Aa{"hOL ?֧NbO 2QwcEA[!)% ),|D5jE`6 G*Wkf RiGA4oBȐCl$ k?XB€rI0Y^ǴiPtqˈ 뵼gt*:Ĝgs\ so`:,75-y0G%K"r ;K8#7,#EJɯ{Zƈz6bW zBP6Hmi)0-o*LzJvBsRC/  ck>oJ"C|Lvkp=eTͬ<{=cT B op{npVRmKr{n4ko$fnZD*/̥:\%2r*0q/rS%ϙǠ^Dh CZ<b,lsWs]ztM}Q!/xbHZQي(m 2(yCis"_qN KqptI߱/ahf^n7-|hG,TFnLMZPS6z6{g?foRcK5G˺_ܯdW+z^< 6ASB)6IB@ cg>0 hžrJwKvD 1XLh K}H-z t8Q'VjXzfTCVh+A61mp[ 4TZAO%<9૞XFmxtU Lת,/74rkR>Z]f"<'~=ptF1]EbaͰ쀲 ,PH;T9m}+F[e!]̵vQ~lXtwMݻn!Q4gͰjK>g_j]4|GVS1r| jTO Is?h 0 pR#&~\ >:Ԑ(*"TNUn?y|`s Oedr0qX@p Z_@-D`&ni5ѨVb]+18 B0M`+m&u#- |挄LwtYMӑo"1:p_󓴫&pFe<) 7Šj4A3Ħa]m@on22| D̍D%Өk/%VU!wX,z_CK jT;p>Y:8CU¤ }n$l4ҳl $xr{i}'0uf"k00 i(cOO{_]%e=fV,[Wd~XH?,$@ >51cU;(e*[ʧBoN9ˎHOk7($;d~B$ꊻm"ss4a, 9 5?ڰ^"#?By@C r7ª/n@d vLlw յmO vߴI4?L_z69Veumig9 t̾~y>)wiܰs;,Xqj lAKPKcWMiʗ6сuUj76`9O6J¶7iWI+Mp9Iي;t!^!#([:FV2zky/iӑvO qsfdٍ&K!=mQ,B+t̀`jkX1&*hǩ*a^UE2G2BKn'-3 ,ٮT=3M@7!T c^mhF8))#²/{"AJ!?a?[Po3M0 F*&H U ǖI)Tpm8:My/ZQ_j$6J[v49Xcd?jͰH#nhJ8\SJnOΩw\.T*dp`[&m 0$s (Ѣ@BȅEe}iajUCD-^A>XPԥ!ΘJ5*Ec!nk(&PIGQo]k>U!% 2]PVz'qЙ-݄ @pֻ8&&fI ׾x~#]@̅KHRׅtK2ݐv$ vDj/M,|ZWV ݸPgr8nG:Vzt-ɎQtq|Ǡfa}×q-gjf5Y_ ءn0sy_YE O ֹʱn=z˓T}uXP>&"L8EHWr0@B@XcWt3Bo.7:̋)'*u&Q҈S!K*>'1h.9S"-Dvql5Tq&قcQ9\g1[q޼jjMvW%1s'k˯cPĵ T jLy30 dzy4M!;?dSF-gzxTтPՅ6\;dG&_UQ{YGGu= mJlGEl-W}gR")d)U1ozL9,މ4>$SsqDp*Gl`ڄ\Xp27;38rWȉZnID<: -D@pab ?SJ=X ^G||2}$ŀըOrUQD j<Ń:\dj"{f.c#Ozۤ[Gelt@ ivq 0ᶼc{zua⎺Mר*p?MQvfw1\Y\̙=,J l{"ol+n̈dQ g8Ιɺi$2HF|Q˛ ɓ;ݒu"WwW>Yɩjy0/Orx6t)•5[U&`ޟ)kO]djI7 kGql]L\}^Ou ¼X@F6<'q.DF\s#79.jCFT9a WLH*gAh H Y *wP>c#Ax i _3͗ڣ렎Y7^h ܃=,1[9qQbO4L_8aL!4 #dSˢLٝMպ݋5hMB? ;Z\vͬIe .vCo7$ R\yaWc&S~ЍNu·9;󕉃^̊{v P{CT%%'q`N<0 \Fȥn\m<`= *:`Ω- NjFb1%љkk^6QmpAo8ünf%A|pb$n=]<$:SZ@"nUD@7;C&FiCHɊQT_~zf- nQϧ~\. /(1 }Z@ߐ4Ԥޖ5$As7Ziб 'N}=:`AՆ%.߿C_"h`\4dIކ3 ;y*ggY/DJ蝡OJCh -jr9e♤"?n3tI6CR^b|]uLU^{3=EzMذ"ѲC;@㴵n]4gv(> 4V&P&dinಁٌmWܱM뱏ݓKig`M^~H?!Ӌ Ta%wvї9FTV8AX.OK PAbVM*i.ɅƕkjɔTMQ%L=O]C1T*bϘ.EB uԙ|4XĦ%3]t wc{4FK1pH]3.!z|XI%~뚿WD}_( )dH|v@ ]X)y.ͨ_Sh)Q<)5­|oK5Xɟ۹Qқ:BU!dvjHǏ"_1nN"py*}=|]Xº0i$˦֧.aTV&>#}jAApJ{p=e4:QW{L]xn-"aLtQSL>dy')'qu5CxJRmJ~f9ySܿvD{:i/"c2 o\6)z:CC;ڠH`U#+ƣ$`ϳ>Bm2sQgr(n!Y )TCs=U8@}dr,EA*,+A@L;xI4~WF0 CY2Pn-yꭉ>"פ PM:خ%28R41N=>TNp~M WFmJkO>wk;d6%CO?+&tPY| IuU#mڿc_1@K]yg,̴?r?cE.k`#xZ㝅 u_ S֌'SLRm( yNf0G%su$d)6j4>i4 +ph@1t6 ||0:cP{>g*<ܳ4)Y&!FgM47 7U< k1]zTn;@г]<ȁ!ۏPE͏bٻߡ#咶1DUý%J-(9Tٷ OugF=؍[&])F* +!;vpipuj-"(!zL݃w%6Y!&j3In@r/T&:ii\5>u`-OalO-٬ Ĝ oY>_gs/YӬ–guR Bj-K_ Sl 7H OMN0ɎVW|}M*SGܞ\xO .i ٯ }Q03l:] :'Pq'$22%Kp3,%7Z`aȧP0'6za |'BYM545 1K4Ĺx`m3zjUBO{X[S3֑t'-2vu鎬ZGu$wDm8“L;wCcɷS2sX5?Qqm Y-xx΅'x1s:$W>dv`ZOM~N)jaTOXӋ24fdm 8s)x(5*>`Ć*1NJb~jEꠖ/A5\GVbxb@ݘd " |9I%,cQF@DOSZcSx^WVDhɓ}zr'WDXd{$#5yL~ mm3U`l`Y2BWϟ$@_bɧo}fp 0@+а;L" \ԍ xbQ7H!:gT}ӆ>1KG\-o-$SӰ92*dNDN A"5978DvB崬٬}G&{XOb4jYœX\G^aOӉ#Nzv[gӖzb=.8~0@EQLLu4yvZ^C< Sc_gKm"9 Ğ c0XD=I+$ ^%OXV$:)hUNvitА`msH4t"gjjsM}LJ>]o4jiTpQ:@/CƬùG]-.- 'Ml$k]9oaÈ j<(h rۨ-ikgmhx_DisJ/8.;_\S&M9.,cS `E]d.{wyxNĜߝ`ʙFܸ޺0#ݚqvSCl<5]viX浦 у5+Ka䖳//D`rKR=-C'o'?sߕo b eӕIgSFVV0؂|t~XbT4`-TLpW%|F L ?!oQkm'y)kaҥc7̃Фˬ^PYݰ:Hus$7)EZ.Dw+$'w1b%u\9}6'UFw m__,EN[ǤN"<8SRZjv4lG岖UN1Z)o LO S@; X]mF}ڈTϛrF0ޮ(ߗLoHyiS&%bUs~jpv uJiJiSd6jʾ 0lõaȞV #3AkjPGnMH^>'MrhaGNFuvK\zo@9u#=N-RVH0ģuݠ[Wr9),l=:-UU̿q,[lK^{VE܍kF̨#fKlR5 ֛x bR!Ɖq0\{{WKݍ^o g_S*QRH}.wqFWezyffz¹'`AW+y{%]Q){>&g!>}(n1qpӝ*ڜbt?FGRO{BnP"~m{Jh](& c4l8;>'a2"BMUFiX[cZr ?8C5k?')qR^՜ol1Ե]HZn#S@П.7`RY?tluȩvKK$Sfltb7^Zd>p(*AjgLt038ȡ-nv0#Cʂx䢝 ڋ [d fH~VMۋSKOxҟm(I~9Ŋ#3u݀U3a! <{r?txXuC-A֜IX I܃\^tf9~\M'Bs%$##z;04y ʽHkaإqtCƴ<4e*:9[?i7l5vڈJ۫g8#6X9kTUsG%S)S <"?DL£@wzM>wSFtȣ)<8l]nj LN ”p+hcI`֓^\F5Vk& rgh_`R@1^󑙖2ools\Yxfd=&’yMH5dH; 檚 c4C4cDA XZ߼xHv&k?7U}⛥ԛ8Rh} .܋J/oX{#]^i;^ƍO4Έ4W]e˲wz t؄Ꮘo̲k.d3z;lOEkJӅw̮TC*gWL@݋y+'½QG5ݨp GLhT_0΀6ȽoZSdVJ!켄A};P=4ծ2^R~Fء%D \tA}!Z})8E7_%m.JxkܮHR^gM,W#[%hn|U0L*g6m1xP3H8NdE^Y+&' +Q1A^c{QKa&)~xϤ=KR5d䦝چM`t\pUn_;"?"^^aֆ`c!M{qv Xω Ia|w~K@: +^g0, I@Q&o:܆As?'/:v9#@O.Ur&$#iŐS=#=y ! yFP(R (*w݇E~iOՔF_YO1;(,`RU>u\QΠ C@uR\M2$͇FZ$JS - `( G ZS_6SnƋNLj(4(1uk/_z5Zt: F-&)ViI )*\_JXa@&:~oТ{;)^{Ÿv% `at*PeF븲6r<E&;A/  3E 1zQϖgN2EcR;)Od)u9n.te5[8D‹p*Lkv _/y:;^ j,Qef5GF(YEUZ7^ }" 4hI*hHZAlTW*=I=WN܏ U)H0ie{Ķnv%_QRm?#Mxc\tPG|+Zf7}G7xg4Fs9\_CL -(q}A4^,?AZ Cěrond#82%n1{jnlzWw׈D)kŒq08mՠv55mh&=sX k%+ +Lքa? YQxH3ilW {l*~AqSyV|e(tgeؔ9Mm8.4; g5Q,p?cHms2&_{lpp?C,գ>GmDPBP*_:#ŵUB3/N2ڶ!A0A}6_Ԏ)XP?9GV4HV1nuLH $mຂ֪aXG$@Riv*[D&hg]_%FqB2cRy8lnaeܳ|~ҋaea, nUp:KvL'~dI\4fN D!y[b6ۼkf'8dUgl^V0}+Nsvs@ry-򛜊Ro?iFhY5M+} ؓt'iDVxYhӧxQP)/J͒e]O!rҽɉD :`Qb_ZٴB ?UQTM‘"P@&%kx|EdT/ONSv9~Lvz𘦑x^MB wY&ulguV^@佯؀/?r}M2 {qŌVLK`nd6Bej, Ξ Lmƨο} y >Ü28:-ioz*G<>ohwGF-M5!>UfN8賳 쒖Q'g@e%Jǔ}ߵaw\7FFrA`8C_u BnG8QLlsjUhc0ܗE'Ѻ ϻG@_EкRα~#}JM'fpHV}iECT$bd rMeyk$HZwH*p>;4{=נ W*K{$p={w:pv;!Sі4}ߒb|7< ۝pA7)zb(Ԋ :;'J *:Hi o؁2^e ;iK4KؒM'_ky?jRJku}9fzybP4!GJ [Dfp"%h9&ea57Ͳ?p1]9i~S_r=a3e:+L<B͹\^ڄng:M:oզDˢ탪Y3+f씳6xPg|'܉A1dkA";h[O4BceƘBlM#Msl\wnpߒo ;U5Lo؟ w+{EutjĽ ʥ#J9$ȑa Npza7ޛW/C1p0QL{N֫lx[ _Y{[KBz(UWdXuE:_.}&P^$8=7k"˪_6&ӕg vCH%m@6lk #j$2e\%С+(P=4ţ@0rrTܸkҼ<# +H wjv(ۻ1w8Isd>ruJNҾE(]uDj BFivi,cC=ͺA=3:uXDXLQ'ol_(Aq0J#/@]Ρ%k\A& xǜ<7516;&BJ er3玽K2zzHp6EdO)V UٝF`ƺ]~w I;!b0SxZlk5@W/%b*UWrz^m][Gݻs7Y3Frt|DN?@ӹWꑔߤHڔ@:pyXP`)^hznFn 4J#g8a b+K7xBL|qCya_ "y|6|0:3O׏׹1 } W?@N1Y0gvҠK6CQIߣ9y4UXI zZXΧ?ḵ-yJj2I |pk20 ^e#y(OcYEW1!EB,"C^5<,k?mQŢ @tҞN,M J)&Y7Ic FV{gUGti#HLBkQf| ]%qء23"4X*s*džgmšۛq?8/|U׏m_E:5HpnK>PS 'D$x6 /~p \ts32ֳQzwl~oh36G(&30| *A;6iԱJI'dNaQ̇ :ɕj=y񠷊7)dq 6F}se6ɞdi˥Sp 3|aCت^DB u:Mha"AP0q+V_B Ja> Or`^yE.~e1vB MK͜z)-?f(nQ&UͶzk}> {21ܵ}t`[3c)ͿY _ w.;T&`vHyUҀ:%x~hʣ֢giw1!W9Np, SFuW_ q] QO 3Zi'Q`=fpa4(׆ҕ{VXh!L:v̀`9x [gtie\l6C'P&1pPlni"6`)DZ'yŕL-MwCdF^\{b P|>?.o+ޜ<>S;m(f<۝)qڐ-(r9ϗ[n~BZ7.CtjW;uP1νs"陉%u4\:&}L-9ۧ7z 4!!ei|]# Q jn0,cf15ӱoݢ=n ?-Y>Ώ_jnfJR,W.ӞWZC~?&=C|z-RAZp%ew Q-V'N}6rA0H-XUfviZ3PԀ:>3e)\rjA 4b qaH^W9a'TG@:5cIK,!HtK%$̓W;ƺ(Kwdc`AiOrGO t~ol$;|@h(vB~jlcύ0qy&uUcj&WuY})%V7B¾^ob.-~Sljg/ 4O$E(=*5v=VIG28iBn6Kk|D~lmަ&'0:ȹm!/EJs.`I1r+`nZ^L=pG=VM&-2V8haR:_9E> L#wC: sp9fwa[<2ݏUF¼ s=) ' )$($L,uqɲ^*c)BD'aVxu:Qx"z66ogհa {wM1.`w "D]~ yő9b+'I/*6D-"`8Κ.ӊ#``0UkQy+ˡ%༈u&?3;@xsK9lMΧk7Ƿy|30ޔѧ-IQ<ϛvp50~TZ‚^]MLI(v(RDιe&^ԐlPxbYV0@ʂ/2&qoN׷^Dt<ٜer!JkJ,G¾G-q?/w)*`5q OȮأfwF0=j>| id:R5yFfh c P?8Rۍ,iYrC*]|Gx%\nͅ8\9켺 YǒPɷo_coa<)-N4-5q.4![B~*DKoPX">%H2u8';s~ʪQO[  eFϟtN(>_|p<D*$e4t rylvvYg 6k oS3t@ 35O2,,= W8;  ۍDZb0,<0|~[|Nd{ LW"H8mc"f^͍(I\V *S.͕O T/+g@OlB[49廉뚓 VV4x8|АS(Rna*$q~Lg[(@~sYwTwU wz}lm(n]z<‡߂yW<էd # ֿl=/OJh'1, _-8E?4P)JA3gLЮ#uՒT#g" 0謾<1(̞; 3T#hE~Wlqy~SF J?$9rʸWA#AcޟL#Ayoҳ5zYZt)-]㣄 gf/5HxxFrR K _mb>Ӫ 8bSQP#|IȀax4gѮ^V>?&v3'1,8/ͤGq"5Ms65 vt< pz?P۞l3đ*Rj/?'1^|zï͓ EBy{o9h0f@L &_H'wHFH԰ V\F5djhf5'j3^gʿJGMx-T.a((gb{mX#%E~LwA*;}m䬼 Yi#02?@kA:"F mWwf۞L9j%dd3͙ HV&'tw#%M|МjL.Af@,"ƨe kr@Gz0ҹiNۻ6o4-ϋkC[8~pE n@f1ct%[ #oF!8R@j4DJž2nƔlS{PҜV罬^V5aiY۳Wyz>'I˶y2బPrСKM ?Xء+M39;nDx-k"j 3Ν,ǻD|x,IDrhgB,Xa>XKð5+=2;pZ1wá]R١,yAO! I]Z PηڂPP,h P޻h&ERf$ ĢOcTD| s◐- Y"|@b$BZ]+Mjy3l Ў0@zAb‡56̉Rd_cvnItI`oˆ3!e+L|Gz bXI.}T p+^DHvY7ND|E5fPvȪ.&:];zae{PZ d讯bq䒼*X2[82ۖey|>^3i 񤨭}=3>#TiksX>m/VX.óE9?^ST0%VA-E+XA—9SQDhBA?^0uA(66g-&\.,q|ljq|${ ON&00=)(w Al-((.8i&xHSNuUx#/wiބ22-Vb 9븪&XRE2A!b۾7&Iozh>0+@Ceq19<|E\(qz=H ~_ a9mv?S|HV? ěn +(=]mJ9Kc,Q5VЇIx})V{y^S>xbH8-4%^7 pN!XddufML $LVn3/-yYz4a{zLGfBBÊ쌆AtLiu(pvEN7KQLj?V?LbGf Yyٍ\rksJ{בJ7jC63"侭hDPUόg"G8UsWRiaY\$8|xMNG@J,aAP8 xaXkT+vِ78^'OD CVMz$:x6B|p[zⲌKRVPrg SmC Ax,DBZ*m{7Z#;.&OOel׌v\fEh۝*q֭>~EKv߃@Iz/{vRN حtg`]P'I]V m@LoBh0.%&҆rg\2VmЪjQJ^T7lfrqD8,xb ͱknOiߗ#M)9˂!- &>\V?*LB>K+1yp NwiKV eV'*Eq4 BJMksw=ToVVpf:j uDT8{,bgJN uFw! YF?G^BmF S›`~ [`@?{jW"zZ}趟? u6|9Y5ǴW֫t C {>ޠRdyDr&fjIJ'aJ3F;}9~`2920B[_e- D/EzS(Q?8XOGi bLѸhqؽ#"d}H+Gg9ȂTe38V'DU>vu, jd?2RkN\co)~VWhܦ#3.&M)XpI)OCvҀU~\Y?k6ATͭ$O@ .^-(ٓc:y;JHZKdйԄ*Lyc4<|kRZTG4k4KHR%\$1D!AV:eT fp4~mqƮPZNPa[8x0d(' w\>|א$Va V֜ #_*j⢳Y#D!ːU;S38?Ry!k2_~~~-"vqmǮK7ez= S~ `'gʞ]Z M\jyŁ#\/!'!ك= rs.ImL ,+nxޫ@^ ̿Hv1"bfX7cUulѓKT Jij3f/ݦ>%TvK~Q* vgb &_난l:& o܈럢A,D._RDŽL3O-CD1: It-j0Gf:{g"݉~v'ov\ޏ+KT.c5^eb$6"[F̔_eR4z5RڷV~10;YZObkh o 3>aWK?]-K_\5MNr*![U=*C^5W\SL'\:!ēum`NK/ˉ8PQXlLʝ֎U5b , H<Cse I2Y1<;Y3J&;:cC7tMGG:F)dvbFN7>/._^ՙ*m<6욠q^me8:_~b)q~0O;+mIˊE$.D0 >2[ B mA.-U[|*x&URkwnٷ" ŵcOg^GݞGd{_їho`" -yadA4QJ8ko!#pؼJ}}T5a~;UNA ^πyG pty¯fkdl1MUB%í19つGɈXA#1 )\[e8^ؓIx^ɎL̅KO$9gոY<'fk^"՟ǭ#߸j -Dm(t;@ˋ9[ wIy>-gEc뒏m %nA~m>8E98Do@]gJ;傒@=4R ɪS"L¨]_bosJ.HCs.`Yh9M[/>)#1`tTAZfy(V|1aᵉ8//ovCy[,@Bc6,T>TE!6> BUcY_dvLkqT D4A'$̓Nh?.U%I lous>keѮe}7mY%,3-.| lY(jSպ/EB͑M: ۙyc\((8EǬ w7W[5& ݲc.JYȝE_+̬ܯ-QS|ߏ Dٓy*fK!ۅ+^AKָ*'0 sUH 01h[vdWj>_UKN·*YM}5Da+)|AzVsB-[[dT.(wܙx^-Ӎ[U SaUZ`;*95 iNnMX9.#pB9}<̆E1Z>%yH4Q?ukBݡ%.D!;~-m ]|`7}^-PM#lx:@L =?oTJΚ%.g[<* DY$TyA8E 5Gb08DcQN,?Ɍ{Y$R޶=,{eQ‰x. ^)U`'yEs*^̢t˞mDkMwD?PxBCiQڂ2=w . 8CFOl`oaĉѦC/D=^ORUWukDWPW9Vj8۲s 勞`(S2B[yM{"s}LWQup*)nju/S=A`E7j+lMu)X mmY}k z>_VY"su@Xm_Ys#i5[˥Lz=&6%H)R8ĵ."%|9;,$)'m=,:D˰ 7rh]ץ:hFvu?f&P ;ڀqr5 R[FRK<_[2tf} S@ l%Xt\G0[)vm9<| gow,DKTΈPFL?+Km)v/cZQ '~񻰟i?瘴xPCџ8sB/Zꅦ:sWD0 p:6 hbƬA};t v:B~ڈT!|0ax5߾x݄~W{V#> 73URpϊh{9ollY}w"%N}[7K, [O( ۘS? F=`vzϦkQrcvEIˇh叩{zé炜2}]qKJRbK(&|qX\tcfC)]K0~ﰨ,N>͘On6O :bxl8|&R *S92.FCR#~ZUM~<_NJӕaQ17CN;)\TOSSī'ȣ OVCuH Ɖoͯgd0 %fz~ ,ux6`PH{wH +M4uTq|3y1g9ӭom`qQ҆3C{b9vWp~r:8"ΑSZYg-33`r}/ x0-)1Snr eiT[Cd]ktv鞈.!AQ~v6|ɑifwLlBK(l4N^xVfn{ڝP&3^[ʫ_Lupm'PSir<Ҝ";=rK}cNg~()rz݈tJ%"oYY_Xs [V@eE {ª~gԒ%/ZVo D:ɍ[}/(zIָ*W8&@ dE3\d",m{_RW}YK J g(T^ǓӡzP;8BeH`Tn-lʢv)\Pv<?Gpb2* k))7۳z}JR 3e7\lbV[ 9sn9݄?E>4붓#f[250^qn#ŵ闞_A1N*%swǔӣPD[<*Z,˗'NyO.)~3G59ZT-Q8 ݪ?͛Ǘzwc+ |y>5n5TNk˛F[6~W,t]z&[ #9^5p(xbiM+H. Þk7JuCf}<헤sý&6ͬ>|ۨuVn Q]=&{ky݆y,*waҸ]CxwHsjKOU9ԉ*6m<|y&@ybrRx@[e ym݊,'ZIۯfW׷ҀQr|2X_ڦ{!ذDľbx<sA}oj g8g9jM"#7v1hov؈D!p9=\7gͼ *z<HŻ3pA$!Q,UB 6vL]q0V0~Z]h@4SDo z|Qaw.,PZkۮJMa*+QQo@6'SztCdRu/^#CL*ELzwtU?,`:GO7^5ʷpzoPH:3}\ºHu\n:gXUPlBP%[d 4$5Y+Gvu^B8W{*~aX'ۥC(jlAҡhC#$[SY4)=; A=-ڣ&ԗ ӈ}-ԝAVgփ̏׈)ZTCe4,zz6Ƞ?Wrgz8a)Ӳc`lؑfD# 'lDl|,=j6& 9eDi52|hPb"zx̞K0a1^aw+BK͍'J%Ӄ&zQ/_,*%i'\nBJDPC vͬsƀ?&\O??Dt Зm8IP;[ykM'cE:ٖ {GƮ~T\6(y{g> oyK1b;4-mM@+Wb,(wN W5') "R.zBջvRKٓ"-y*4ؠ~k4lHr=*ubg(枳]4]"HG/&op jgڭZZ +-6c!*'Fbe(?&|G`08nr|'NP9rN}&^ex`< Nd@WvJ~g|9Ek:; jl5w q̇EVB+_I E>kR52&:ayN'Va(>!iŴYU 8ύ P iVXx,ߘ=I76Pc - *//Qd|= 9N#ޥ_\CSL_fxT𽐻Uzs:AHp1Oi(MN6Zz%q<(b\[XL>=z5-GNLcp>Xs.3. ̟W8ʧ]S%|ھBT*u C/ADafnͧ`-+б!cQqh#S 2gCKgZTP+ $řXe38AY%ɞ'y`B^- _$J(Bb@ܵf[~_ws^|Y9pLֽ%,ϝZhIlIqіx` 3 x$c8h2/jQ~?eJw8J chnp݉{ "a-/‚xA($<o]"?3Owɋ3 L| p?@\Bʈe^M@. Fi{{>"I -lu2gd+{<M+)V`V<0hyxy g,hbM)>=8<ݪ{'^3Չc. VHHYC孻@5Y[ ,㍛!1ɦuEL?KǟJwh€3}LVAݺatnJ, PD "R" fB#|-d*#'Nfa x2{'D-[ h}~~LR,p[f*ת-.Х&iC'8_KɄS@)t*Iiz)5-v Xnنsŕ\u/t{߬:  vFgZ0.o]uN @N5A)8 ά 0c[hD&+@ߏU.]EYuO&'b h=\BRdICC `?Cvx|م 8c^ M 5m(-Lw]=0i'c] NH=2Iw%J^f7\Oj*b:- +!Grdnc WOlsJkV8a1Gbz1 Xsxv;:uSZ|f-_hT\NeF÷JxiZ zN䭁y9>F~E=,1Rό %]bz!^L^)R[[<|%S2cb-B@0yvK,hp!-ϺtRfe5`HI58eI>Z L?b#d,|ˆa[y] $mGGux񒸹E^=ȋp(D jƊ۵~ZAnRo>u.o VgR?iUz|%'akA]޲z Ja86Y4Kk} ^rxGj%뙭1e,9sڭ3m%0tGE,NI[.E(A'^ 1%LNi壘,%n--BZErrc(vrH$y%7oKN:UH rQ,8nLl-%=<DIc }9L(IoW@T#!`}|(mw6gTI>VQQaq \Ȓީ>,%Ϻ0BqglM$?2C-P4RG~Db" P^HGͤ~o5OV ķz~,t!uA3;-cH4qN &g[i6t\T0 WA XDl1ƴ&, 87|Q,<$gb<{AlB BbR/A7aA=XKcN! uпiD{49I*?f>*ve;659I,e.q@4Ŧ!uz%UO N&~&+Q|Apw g$!JTp./}1ՕE:~p:dPիO$&Uޑ(SR޸:_ F{)lڴN-qڌ;l)('MBCݖg¨>6PR1.B$CdH/zGfVPohؽdĽ"W<ۺ% q1wm)-wDR9mvї1CZ*S_)B]#V[%"!Ñ>d{̞ZoD±qj1xtf*h;0 - {$! n\-~㢞a/nܣ~> I w Ib'41 _]Bf`9ڰ6gbxLoڹ~1$4Sp\BO,۲ ^П;VP@Ϊnx b>/t#N{񳠧C43JR:oyvV P{|:tu@N2ȲK4ɉ;d;}oPeҰ77htفSC-N nWZҷKEzǶES%ɸYdG\gFxL:Z?  fa8e;xTP% 13.WǤHрzVWg?, L']r0)]y mN1?@enpfƻQ4X* ~NeR-lWXgS$HUqPnVtC ,EL>gÙ| [Od4}L Z,tс <);Xpƨh oyy!-+סGaIJBtGR ] t /HXjHO+@W$;IWo?;o ̅뿔1j},7/۹V ޿\b,0jAvHcĐ*>LJG6'E_ws ^V%]s߭J`5;ފ{E5Bke@VVoTJ #)9#h_@Lgχ *wTd%Nɭ6=]f1_w6ՓY"](^ٮiЊq:V1a[`Ԭ"nH>~X׶+XgP VF3U<$S^ي8#Kl(a>qj]YFp~n &L:6"yj93 wΗyiR/up YSX'C$ +1 09G](/%T4h.&8P7%SwO(eJ-/3p7%NZKZmƮe;L~o#d^8ԟp3XAtknw}Y7 TfHg~]8m|5W+/鉳 S`3<9Nsܛ#FkeX`  P1ek,")9Uަg~hU:ckor3#ͨc@H]s$ZbTL+<MuxG\y"O^i/Iu9f ?or ,Rԓ_??MMH wK|a(bR\+Bz!N9x FtM'|VߧrKe#Z*]VY $RRߢfu t}aJ$έ?}l,+yͿvC d7fL0!1m0OwCMfxC Cԫ&,h{vCj{Gph3,c܌}// 0yʋB3qr=^FQyh/L)&pBs_m3AB2Yߩw`5U2{:-\3 GSB¿eIgm89-)|q\{N2Bx[(Tą&o@8,視r>k훍H5#YǍ*>!h<\z^FlooJVh?Ӎer< C\ '2E 0bP+IDh}߼"b|F &%IsԢ;s@BjI0 M+ Imo O~ ڒV=u~0>EO,]xŅVR)`(Xc\EϙfZW:I3!C(Bs㩅?D]]ΆwdĬBKG`q;pLjY߽O2^$9pøԹǁHܓs̲Nf3O07\BC7[ jr~D"úEH[J`>H+:\h9ݹElmρ ն>*-0FXJSOVVGIzNk87RWEfcL!UE"{*ՒEд.(1݄UKV.WmxW>4"Н΃6" g"~elm$cNݓш;$Ws}E`Jh/xYJAaHNTнG 2\Q@Wz.BPZ G Ag@##AZnD(JY.KHdӜOl C@#df+؊v*$d[s8)^W{؇L^^*EBzfH B!^x7 &"QHV vL}QxTE.paC!ng2րRoVIXckv{Ec=6ʩW=<졢[Z%dw&/k#K8W)PSuai%Ęz\qzȟS\Y Ө"2בU,!G[Jrv{n )ew5`iV ~VVSvDHEy[d~Y(H;o>&݈i8;S?cn3)P 2EAΟ!8ˑ5Aikբ0M#*eW "3#,ꀁ8.g=X)֝lէ t"PTUW .EOR ʝ `SI4M-U/ '_c8H GcFpeAi-nuu&17CEW0|yULQցHvn-VbDaB}M>JϦ)Fj*4%qW5r `aDw_P;~gcFjqs&H/G]wʎցNHhJ? E(715`Iە :"͂+Z^iZyw*^[ c_^?'0U)\<%]n:t}!Ϗ/靖#rE$QMqZ` \b|[^e;rlI3ŋ1q܇Ϫg̠ Cl츴t\.b%eFl} 75,wP+fMU20xY,nQcƬlRۊ[a8DƂ}V~a=󫌿hr2,l~nw^s" 1h^*B]NԦ)@~_+û2IIzG g_W!yEw!?o_ {= ~Fr..a Jԁ-cN6x7KdV>9فlw\CKXYŎ)*C|IB -5Ɉ3zW@؎ړfH3X?qc 6[ubk2 XJװ^<%Nd%/E'M W%:Q@păeNd3ޭ*0ݫ`Qg&=ZpoO; vVv=+_WO^IGJ}$ 0FTtJz+uMuoӸ~Q?n;C'9h{tγWs6L NFWPk:7mč֢18Q'&xa%%N-@"Cn_{uΕޖ9_i+t] qUѥD=alJ-{yJJ}{7heAQ<}^M rԇ8ApR4Oq F4u7>="Fvw a~#8B[)؛wW,ʎ !5[#HEϵ(C>)qY}.}[N8jEJ 䲶0Lj. SGChZ{3ϓ^$z}3!z'Z`DH$]jUZpV+4GmPr Ez5:1<m>j㆝yڝĠt=0X0";RC/F-yycuT$)n/Jʿ<Vxy?lQ$lD`梷>C٤ VJ)XoJ}K*!v%Hn.aEF7b:,XVҩGbPs*ţTUEd9' 5lU x'Y #YĤ^  N`np:`yN*o#V !2!xJ|QSܤv~؀K RMfi82:[a|?UF/^64ÐBIs"R] &lЧ6߲); *"Oêu4VFc0L~yLg­r姝j pe;M&E棉?CV0bI=lK&ڎٟjR7 91q+n:T*?G?"Q lT4;4_ʂnW/BB]7P6%Q<9*H G OJ\Sh#A꩒#q{QW+ij^wEپW$MZѼh1G Q;pc Ym/WΚj=2e7 |\$P܀D1Rҫ,Bީ.PlIFVVyL )P26I.oqyTpe_eƪ$$"NX1>뉓 9ieLD!,>I6m~{To]!oe 60*Hөg(Ĵ+F/ z-PΩ5H#=8!/AⵕU4,yWk Ӣ8D +62CpXRUzj흧UH͵?0V~!_  bBB%:OH[K$#()LzOS*yзK8B"EmK園%>ݹݝؐYLEP}YdhH-6/S^0"kN 8%VBU ioCI1x 7i+w ݩKUϥP롃TkdˎkzHtJGY` Nh{>\<,"АgMYva2+hs!K w A1)r@LZmKB @ áoB1|#Yr{g[ rK"wNPʚEy/KW| SWP f`!cE09̸fo}V";b& e=+g0c7xrh^M<4jr4Nڲna4lXX` o@Q&ЦYEG :ivQ3M¬;y -i6f&6oczrd4'jPT"kjstAj ["ٴBERw1P*>!Z2:F~YHo)9 ھU ЮkIe`ٮǀ&-qo=Y&x!Dsk] w2l:t2:eLYT"3%17ਲ਼ewlГ1VSAv wVmsfX2y CI?|Tw.6'*ԈDP#Q(&& tNYAlrĦG Y~xPjpa9~(_ShZ8R7K&iUqƉٵ?@|vWYSJ z&Yy;ǚf룮T/I=hSvX1M`DA7~xD pBwbcvۍ);_}US'l4v^zB@ﺗ8SuB5OmМCol 5~|Ɏ$Ѧ*@`t;_V>6E䣩V -Ͼqʪp_ݦJDHb (?b2͘O4S]xoڗn 'hÆܝ-ӡSCT2Lh'J,W(@Zg]. B#mglo߮rJ:ovS{GS0cklVwT 0?xm_)|`%(_=Q阐Ϭ.7fs}[I\QLKXb^XA!ŠMɏ|r1C3F($WE+u0KiM(1EI񔓾jF^;7OhW 'njj(A\CI jwZJTmmCOχD4)t c_(!K(P& >UG0Y4J;絑*R]dfdj/IsRb;_5” (ZnL̿*\ϱf1R{GAMn[,]4-9Dzvc7(gԊ-.f+PX-`APof~%Df%V_̓,n&BA%X0tUhW?O&"˯VGSdD>eUNzk~hyȇhWQD^L8)@H}EֱKvv"$Eoe6WL; ?ZV]w~`i8"ii8RZ7f"N}Ń_qݫA{q`%K tz?O%+dFnPdы=+Jyj rjdSrഹ7 _$?ַ'- Rpeq~7`-L׷p6 %kbScD9?*"veC?$tmdD?2CFN=F)@L eeX9*qphU;"I}kU6]َtEyP|d^Q&V[߸ޯu2(8ߟm N7L6.-,-5aSǔ&"!k}|()Rˑ rY?Ow+ 0"Qk\shu?]0NP)kmEjjZG 2]UG`Oeb2e"U0O]zH+'iY)Jc]T52FqƖJt"*p&?Q1LӹUn>IiGbݾ/u,%p{q8xyasv7th=̵Иwi:pb{;YwRȇHph4蕴H,f",P}! +HcP19Ԅ(=Diޚ̹N䥪ˊOŐ3Gg IW=~D[SB21c$ިfNgg:=cI|~ iva(B1 kC$*4:a~knbgL۩CX1_ᵅ޻ d@r"#w>1%UޭÝtR~9BwFj1OSy luΒ5N D12qṞlωGfaŦiR*)Rvp!Br-Â衫4ߧ_}ndd?0B2>P; 0s3UJNez`S\ak6:hRYﵜN6 KXNP&FY@Ump7aMݹ{ui|#lj&d:S^e Oav;T{|,C&>mX:mZU,YԐ.Nh/gn)K&`36&FkV-spj:É#ށ>g%}$_zYOp3[c+7Ft]" -|éu̾ 4{3;!^U^-S|4|]=j^;!mYr֦&(QXTd/[F9=R8Ѹ) :@f|۝(%c>nĕ0t&^-26f7iEQZ}_l6ǒ"g` G~7LSԤqʛk,zaK%̮&͟ڌvg^C$׆2Tcn 06  &{ȴ2RЌ2c^?=q=ړ!!M-/:L6+pP[ Uz&^bUٌ'jItd6PцKo^yf@dOR|?  j$g82@w \K=\WLh2G@\ fv(^OK嘿D%cv|?!Vh!gR>޻M6EGi9No0ܽ> tg`ez Hn&yk:͎8 )8s IJhpؗ q -HE0ƺ>sӻ4 0 b4lC|0?!2G^%D.L=1z9}Jvuoݻ%9߳ 'lu<y!S̜t Bt˛M`3U@yvAFA"qFUqin4kuCK(Pmuye%[?g O 'ڪv.QٗP_>%z{e%@z]U`rfy^&MH#0_NLƭf]C4{*:E#:-.e7c3^r獛'Ѹ pNNhy 6uxs%a냢'z  IZ1lA,!uédWZߙz'1uj7m"BR!>?l ŎMSf BAq<^AXte/H=NUg _Kޓ2-ei2  iR݄Ó(9EBKabMMDO3cpSC̚*#tg؍9K+=m~a #wo0%(&TD -q<`fUXUۢ n2vp,&,GSXT'zI<~0P?hIC6Yzy~nO{&"eWUAV=vu>l7.&TD뒲 h*D(%3Ϥ5,l)h_iyG#aȆ{1>YR!DzC`%;Mgq 돡Ę umodCB♑,:j9୰KDC{j7S\cx.̬s4Txڶ$x9=_rRt1~Rt 0g}cΠg RY4S%T&%%X5q47UɎf/fhkP`]&ƣGCq >Ee)8\/σ(v H:+9\e o+T¥7󅢨hvÜ?SP+V>jQםę"(6J-S s^l-툀GoA0#+)捯 B=-#'7ͿPO%tMGw3A-;4`WjIK*otzc!ԅQj:Ei@KsFï5 C&AiП`[O:Z<ƫ.85"T!+G/Tm9' qHd@$f`OIp2uk(^1zNV1p}ƅ!vfY;ba)GpƒvmR R29&] B Y&:FM/vĤv& Wt.in BVt.oi%6צ1" 3P:W?ni09tJV Ƙ5'S?q |T\%jx*2CPd[A/;t{eu.Ck2ʩesƣJDSWrl}aʊhK'@eh[b4"MOJ@zJZ4%a1|dOBYf7dbښ67OGCâ܆k ^b9`MZ0JVcpa%,͛폼_"S+ ص6\>1ca5pijI)pܒbBAYIHG#I`Cu6[pi"Dۀz*Ne\C:`i1Ra0os_ 'e_i@{Qkr|vJd YT禅v>d94Ѽ—1Gz MHh~+(~Y]VTA}$`VF%G8S*WGK =Ddݿ j;~FI{>@ Q~ [c;e^mg|PzfFm]*\xB)M+㤔-Z3frtwwv ˔vrsQgٰQct5X1>$6}.z8(a-J̯\mj}В"PWth"|y&Q3Wvw3ֿ8Gݓ^+ttڶ*5HC>Xs}ؽ8/8+B JUgh&fs1tgAM^_lakY}0+ʲU0&)#A?U{*KViqۮ}nm)$}`8hzGK_XoJ{x~&'Day~BN7v}Ie8~"cpݼM%"ŝ{ӲI0Jzk<%!Z5fBڿ̭mOp?"N!oiA~rIܩK=]]]8kj: 3uC`?ԨrT[xGJ ~S$m=P q(kfO&ѕ) p&"|ׯC$WT!JLLqIuabdDŒ͹$ٟ~$2"} nav/˙~ Y\x&&eZX%'YAWCw#*ss[֊C?R6Z}*4;9Ž7-pQg"rK˥n#jg77 y?FDYIJjOgq\oĞD4.{^(T_a,z7f1'$maavM~€v}ɓGWZ=Qn.2ks&MP~-LKT̗w12<tYBX{jJ*d0]uQr-;0 F6/Tׂs)?4K˘h\p8j sH 1Vs9ꊽͅ=fF=2tKUս6gBMrws]l8f^BQ!G44U&[tf*3ጼv+P.hޖ*яi=۞ɽ@ +I=I{G}]KDwtn^U1+=uS_o|%_$F}2Pnd& >Կ"N,3|# MXx&6F@?iN'+XWdKlMӈ5;x)lGnv0Ue"]v!Yw o:KhυqE,[j`prtwE/֏o|!}#Ϲ#OaB/(ƣ rtQa,#dc1V>N`98})- \alχi:۩@@| el?ܩYt4^g=X_6#HPL֘8k]-'v X2=~XnYՇDR u6Yb|O 븉 ۂ^d~\'ESVqDne{a> TSKmD g8ȼ4Q<%@MIG@lBٜf#2eτ?a׀hlQ!S L-ՓbՕIфw{ .\kǑG` {m(Z޶)(R;9h.9PNG:v8O_X./-s#sϥW+Y@LCDѠBq&1y"fHGL:f{E&ݘe+ |_?+2j9hodȇ;:+diSd¨Ǔ1yAN)0 슺\VyBE 74uHˑܥeFlˮS_4Wh#.LP[1gL&p?3$poIfҖʭWߖ1˗@ה^-Fg|ĂpN-k44럿`ʧFAzHpnD z/VF/<'h=K}Ig[ކdz/QLM[.b ggk&VՅւeFuv Mʼ_ :}$?F?<4 `X0ZMejܷd{|-6?$9T+=#fG ?0掋Db=F~O⍖+0JķxXQo{Гu\ tv̈b`EұT _|+,g+ rucΕ(VS w%lJN.fK׍bD$9OrNV0zZ=pt;ӞP m|d-;n)&N"N77`# `h Zʩ|5cjGQ^ }q9(=;JqEN)2Ѐ^fC4|yHC$磂pz^hl݊!zvNU@rrxNqK[G̱΃xoa7N?1,Qd[7pvO4Kn>j&ϒ2;n\U6%WxOMQ+kDKW{EݻKk10hNЖwFJh8 /b&faA3ctW}08uߑ<Dj'{g>d\rȝiܕW2f3rO{Cx#dz1Qn6}/n1F}|d#ذZ YTq~:n쫭wY Mֶq&2 Ac 9QN3I/cW>`8ǣ$"Q T5M=( -2V=:! ٘ӪXL/"hB!8qLF6M^a5SAg_"Xv%Vr DR5*[Iщ%@Yj)s݀@Z!QI|]tØ*B=+kѹZ0@;&v/jf+;Q{DWLGOW{ʢK:O>"Ҏ[2Y O74Ҳ-/NYB\|"~6W;#Z6h'i !Cät `?įѮu1~mQyN~256r|R՘]2 9Mر(9-":y)eʂ+jYCǻ4!iX,PR]j7ԛco Vp#K)н<~9Dv,/m Cz4F .WYҲIؼ`'bjAP=AןJD_GI3%ŏ<.b՛%nA9DNCK5Kc ݙ)sJHa4T]UvkLGh+Pōi,?=y@X!`[e} 'nA(h|l-}d_$k P*0 G\.ZG")cT A ޅXRH-wO~)<~-fpZ>~xs\Ir <}O6cWZwc`.5c>8wI@bD=Uṟ9ro|D:: n~h;O<1Nxo9jMvƳ*248M 0k$X FJ ՠLVdrH/kמyLˤO|`GsixՔͻ>uy{$ i ciTW₫R|ʛru2DO`Q A\^kM geޫ}~rikt1'cdyfTo ɕK*v,v܊5 V6;&~x^}p."7W6okvNgٺr}N؟q9w)i3zAUUef 帊1rӄw9~R0Xz&x}ץ%tCK l8ei錿3B>rFĠ !-tΎ~d]#}@HNBJ/CbYf#CZqbTmّ~'wHS!9onXxaVA=FzA6WaN|aw\~:,ҙF3zɢ/ju?[Ի؊B])ϼhx89ܭyh}ǟ*"ܐ;&^kONBDK6{z>l7p}5hV[i8uɚٓ}7{HG۾77);;BL=T^|eER@+Ns⍱DtȼH,-u8s_X|%sN"c938Mm[ρez*rF ֭ji3wvd/Z#w!1 $VJ_JNM*sVo3Wt,jus$aR!@ W2Vﶼ946Khz@-"_ W&d?$W2jE7習d2k V8Эر112l7%Wvn_KTK{ǒMwڎzuؤfGgB-FEJ }L_$/6fH_0/C"G φ؀rs"k?qLm穊U.n+hWpYƂ{_l=Iq2KAw?16@x2+طg«a>MR9kֈ~6@K7 Ĝ)PR6^悻DaLCC㹒xc*I[hl k =px\= nUr -őm:+BObx IK`VK%ҕ^1)?nP? u2J㸕]|)r[n@_>I%QcBT'&ZԿuDzlcB:`ohoC("A0e /y$ځOi`^=A.ږ$>  c6  GFn_LL2kܼ=WVNJ`Y/c- >eԾks^2Uxf`# |6;o!"7̛:xgcd?(&;(qÛ<KͲU8 Տ=`IN d!-U)lYbo/H@rK`$|)- 2Ia OQ+*${GtO LĊƯN:Ug o#˧vCb- 7X(G#Ȁ]iL̥N( QU5ڀ23VW+EPd_AjXYm]W ~O4v z1IaҘ iz$`f{PP!oĩs ;ar8Ec|E hDL b8OL#dg(xɧSd7'f{J\F\٪6Bcה3[QČCinv/5!dyXTDQcQnNZ}jR[gacoDTMԹIrWs$zr|Ȩrvs /`Hf:Qy 'ʎI){%숸Xh*k(R;ےRF& L *s(G @}њ{DYQF9R)g$qs ĸ0sE+g;SM/e<)6_C!ڵzZۂr.2$^0DP `~n|uL3ibm4^ɨټcw7=(tEeLeq Ŗ<r BۙQNs4 Mm#x>UAd7Ϻ8@ мWWT5Gf8>']Y6ZsO&@B0btK"40/֗`;?$@+ hIaB'*L 2ds]똊,zm%?T&d Bmξ}' SD<1V >`VpFycmpMլ{3MM-UxyecDkƆD<}.7Dq4(ytyP Ă>! f$ +SbTL`5ƣ8"y]ZDJ4W"U%~dT:Fӌ;87H FT,.TQc7}{9eˆMVcIAc-'Lu U `R`lPx鷱z#*'Q'|h26c "|ﵨ?v+epB.9MH*;rsڿB_,z{šT;:3ߏlf$_~fI!OCldտץ3;4[ t(4^J֭wȴ7ӒG@**GCg8Tw]ݪwYGhPklb7M3ZxY1>f}8h˥&ZSrupq'me|+pW™r%ǭaA8g!W8i#(잕mZH]M搩řRڔWV@nwd㾾 0iGd:; x:JuPiνl=D0ʚh) :^Ne]g@87~긼ȧbsyO Cz o1g̴'#Jx1:pi3LE:cOL=_!~rCƐN2.*=tv9$y7,k&GOna5QSUR??{6-\}K3s\CmźGƣv ~LJ>wN"c.&\+1?y^}Щ·:bQ!= \|m,^ BL'@h#g8+kb(Xs}J*bAڔ!y M|8/^w <#KUD))> UC/At[  C|UYqTV 8?Awö ZW"UgǞ"xWxGLTV/%V:lKs4-fOPB}3].$e,5>,"V)Lu?Ƙ [9}eX v.ղ8mй %!1TH]zS>s8!+`u58AusgER%馁Ty'y"!bRE=v'O;:S3Ej @~]^x|hc0qhU4J}Xe=;4Y C@ˏZ1$ʌԞ@MI{8,AC`y}U$ɮO K%5$w݈a,8Q\RtXPV 7'7#v65IJ*yڴ.*Ubj]g@h*]:JڍRaI5*lɂ*mzӇ텙w?`k/Ӕj{ z#ݹ/<#kr fȭ>A;R~L#f  ژ:T@-; XK Tѹ@Fuۧ~~\vEyP7Ěm.V3Ro̴EWp#v#TZ]) -[T^vo׊hASѼwr/qvcF>ˆY1EMFdvOn$'|@! wp_P:E ^#>thabg? u"! st/JN}P%<@\؉kH-,>@p^˘7(WUbT9L.@!!#Sԋ)g2qw1PLGgMHH[v 1/_"_s9}T?6쐣:>",F` )|'v~u(4%o[`RtugUܦJWG~~]1BCʅQx3c_L QKM] jr y?_ČcwM=c!f'= o+wYj DAܨY!t%~ ;Kĵpm~LJrZ]6Sdn TZ9=^dҲ ̞{1XYN4yۡcdTK<{OX𵉾%673-QM ~ ᰄg yVyGmP _#RU7INNG=- l, Kl8Ɏ-cL0V-+‹nP(O].9}9-h=G}4wV"I6  chf;ΫYq> au1 b.m"&:'B44KBvC'%V' KcQ y\#Y#u;w ip'dvl{'Q$3hn9 ! F57#dͿ@@B]-ν~]=C%/2zeN*dl.1gOl&BιJ9p/3`g$cdA;euCnz~m?Mc#hB͞&Ww0hvaMT9a{ v V0Od/s@műd:e~B3K^L ~nSW`/dZ67IG߅bVZs{3pt ? }Oۅ&HdZR3{)#/\Z:6R\&MG }w5t'G1VR3THk-4kԌRߕVTl\W#QgabQe6%6ip??LcwUr|3Fs׋^z$HV=HT%ުK51- 8DBG9-|;^&aX{E7/!FowIs' uNK?q7sG^o%__&JOg}(6]Zڅ0FRDUjkP8].,Se^<L? JCVLDwd,Z?b_z_ "ati{o26-d :*@E͍"Z}4'> [,TN70oCQ7WQc"ХNss| ܤ@$T / :|?``uPWZ ׀j$@!򆋎JUT>7s89vТ+D9zJXgcI}<}7tr9Ѱ(0e{ LAJwc4[woeX:v(mus\NєR`,U;*W1`oe޿Iu|}4t8\5cW/%i7p2{ޮ O.?jC6#9d ԏSQ=cZ*& ۞)6Og[ز1*Gj~m?gI=ĸ-I\xWc>Roo[|d-ٺ^ۘ.ւ ӃƐ f~HWO+O BCVG՛rHM׋P`F}!NslB$ӈ؄(" a&bDy{gjGNVY %跀$$ܦ lmV-rhitwh7šz y,47~K~I`rKS$? "9E˦>ȳrR{3=gaqpEE+vۃ~W(4%D9%e{(_*闶̂HăD(szSsq&Znՙjq(䂋H0 1d™g,ll$3$u^׍-Ie* sǾwъwZ@߾1N#˚Py3*.j'1zKԿs+q-q0vc٪1svet2[,WUwfۗɊEaOqvVʈtBwOߑw##d, RVDv@#WG)͑nzvRCg2W8FMS2!QMt)_MSkzSrc☃-:E/q= Se&7˜# zB! j)UꙈؑmP]#B]Lb=<>_bh$ ) ju="S9; 7Ë*Z;bAAXюM\K{.R)<ͽ7T-"T ګ6#U=m]:BEX=H=v9&o~ݏcwZKWxdHFLg*:kJBt'JbQ@.%]*U^dxnߎ嘞0/`ax=N12ņqhBVgVotn4E&;tj ޙr`2p E7mbAjU΍z_RL-̫JGe< 4K$"yECiE!> &|/4)cD,8,J ci<'qq3nȿ~+&ViAca\qs j|.ǮT4t<(@0#.Wz{h+Zѷ?VyZh$+l\mExoU1$滋0mW.]Lq8B!y>j.5~iY:!2Vj9(FLLб)+-PL'j~9yC ;s2NFS;g"p8 ?fKx1 }Nʹ%ͳ_zYT܍բtuŏ1Yӥ !DZX -#(\* ]f#O&fKYmSh#.R}}{g 9a8.] ?±di̩k}Ő8fIy Rj z_J~w/֯*z8>o×@w{K|s\ݘ.- 5"+.MQ&%ALQϹgy] ̠qM$k hll C+9>>6uȠJInP3OP45\? <N l @R_;LȐ>5+wuw@_ujbrs =cKd)g:5B#V)ƒ< z5_@ ww{ykx^|tȵs3}ngg8Z>)_sdQFgg2 gWjJ3mƉq?*mHHb;|ުjp>][Crh/.r)tF2P Zwލ2E4v  DԔ #B%%v3aS={v8jNAMCaצ߹c, aǿBy]xK>c{NF5$G=Ʌ{2'*'fW襏z?9-[\b-'JWlsTi4Z1R$Umf֬u6鷧2 7(fSEc[j*0NƠeQ i3BTbD=SVlQ@H9XKpN;C34ʱWA(H}ΊD9%-죢-MZDzM#:G--Ⱦgҋ( $1nyJSNjMF>C.IC/WnmޜUעB1O˼w?KXkagU+H)zA?-߱}B4unXJ}ӻ_8u'O "[FTI\'£Pt^#ڐ'4#ED:_]}Ͱb/͔gڔ΀0d%ϿR:RT|+Ng"a"1eP\PPԖCp6k`1SShNe$~xw:q.qoA+EW[cbPzQM` d0*՞2g)2Q{C%K'Q8)>r#RQs^[6@f9ݎAm_Yv% S 6 m20Ih2Eĥ,_Y@s5gPus{b2dM wd&8?v@e; *#͆=(r{nư>P7Okc6-rƢmь򫞀4_C0-dh-6IJ~jޅ+rfBHIhQq|kd33!v5G--0sdˇK#f l٠! *H3aKvzEP#-췼|0 W8GGsl81Z_2k=y ztԿ+U8剧dcMM틄sM.5g/IΜH|LĽ-dƞ1蔲h采wIQ{E4.DG_-:gWwH} ƮG_Έ_! 4}6a7a~@f{MОy6qBgpc.oH^'~*U-1IzZ/Μ^<ƹ< l'PS7P Ou:2jl7ΦA\ 0.2_Os2dSk %XН kqAd U]}"Qѐxn] Y.) B.>$DސvǼ] lS  GQsg֎H%#˜Ÿ&>_I2q>r5H?0ߊt1L$U f&me;`:쉦Ƹ22\q` 61e\ kbya}:뿲>:g9DA"*XK+ bтߢ-yZ5_M3%3O<(|zYfB #[Ns+"ކHBJP RQaL2ӀX_aЅ{$05@ DZЀ{QJX ޼EJ\aln:$<)5$ ,aėEs 0*DTw+vOJQqb\UAOLAw\94FywHp{B.)@]#|^۴mDθ uQlO0όsV%cJ) RLq(*[m+ FQMٗR]K{0IyE1ݱ&1cder G+ +?VˬJyr>ccDXq)XN80k0%:\$O9#C,yofoBJFr2mUǹlj\4G$R-w> B6r^=ӨUދ6n`zҡPG˺<`Y>hg5dGlU?D,Y+zMCЫR+Kt ćttOQxiNj6!1Z{D)Z9ۊYsvxj%  :Ld"mwO}5) edB۰2@~=Br%eK{]aO WgR/:QB1:rWX}(75\T'pޥN _شp]}1N%#Mh mra4.fLH}۫.阕;?TLFd.5qL[C B([tqb_eAƱ ES\<\M[@Iw52.*U=%c\>E )H$9,!\ .n)ԀubNB4]dojLq75j~RCS/QZ!6ܵ8tGxmWȒִfBtd-:XZY`ވ5ߞ4xm$|g473k5M]YmOa:t=CI 8U mģ*'t*]v,P#V Vwz'˼j&kCnQ~ݬlG#*3+I [N~P[ؽTk/^eVcѕؑQ`bgY MAN1Y0D,/)NJH\/<(!cdάM6uo) b*3F$s$ñ[xQkB5GK g:{ag~{q4BB@ùcu,u5Wb-M5/h!l!c/8q;O^P\Gz\dYՍϞZd;Cpn!_Nx`0+4 s@>wk"_4mO'wȃiQmpuS-LraO i1@8ajzncOMB8} m+<AeyJ:Y{Mv< 3Qʑ!$W3FƢOƽpP7zh k"izVuh# 0l׿ TH}W{j XV`"-^f,IgY[s%I"73-xL 7׫Jw³\ hjf)sxӕ$"+ `!j lQ@OntQN7YS:XhcxI>}Or=:6'9tM;fY#tcW12u ?C4ibLR/PY9`رnmQjo)]\ usZ2$I)奌4;l${b l1mDMaN9{ VG)ƑjNO z{?{јf'۫oDD>b,byj3$/#bCN .>ZN@&NXl3OGťͦhL˜>~Gm 1%eC=C/WBʣz>\R5![!75DN= KN]sL;Ai?N i}]oN{pNՐV[wlvJ9C\G4G% )p- "ڟ{T@j{pթ {nۢ&̥{ԉ1ώN<+.i>Z1GEOi3*<_2x mf2] 7'A_h UF2΢A@^lB:b_}ye Kk$U2ռ=y݈1 O$“˅'vJcOURۿ+WA @B;p??Ÿ,K%@ڱACnK! ?ɱ{5?ҥR#> { w  Ũ"@hI y)/)EpMhd>ɷnY@!YE+P<V·嫣6!Q}r1[2/g<֑9w(7\3k C.WchuwQW).8T*"8G[ɅS8cs#OvS x,CXCLk}* Iqv] f)%]N`Ly6G]BOmv&rB$.o)8 4~oPQYޘIsj@ޘvt#DБm 'f]=4"9P 2RE?up{Ͳ$n( VT-ui7IAq?ki @>CΕnI]͜; v9x&#5 aXp* c۷S:V$fʴA_wp3,4RQo٤+&4I^y]g̳D eq%] ! `d&0 .^6|LuW @*= )-؊"O4UQa5A4*m^s/>!W)8/`97N8n!`Xts`V[k2\>B8dNʞUnL p _bhX:9\9+lW]Q/;WowzXFa&zTa.tҩKJUisād'ˬxT[FnJ cE%*Wξ9.B軥$!&Xi)x2=.C|lūV=)w8G2d:^w79EA^knPIQX,Xu` W]|5^|Y^%UGO2&BHrGh-RvԼRAFd*C%x cA<,Lz|z'+&31~ޗӊN]x\u47 js6=.Mk< ܏1IV7Q}RoB}}I0=`USUႎS9iNjkLEVhtEڌ}Κ ID ޖb]H.tYڍS##@Nccl/j9k(3,W,(,D~{f뉈g-¿ѱ_$%ZV u4`,̴/FjaR?&XN!8Vw9ɌGsg򁻱=t1\d+Gl iS䜚sJnBg twŝB#l>g1O9ȥ:3D%IKSToQyr? !TĖx~K_ȹԒO-VVkjb1%&t>T7б-cݺE]tzj d`@7MsPRC'f q \j/lL!B(Iv/G@e-wr(`-5%SVZ11#pV{-8w'qVB=/]SELO} =2]JK!k_dly'TTL9*o @6^Kfqqm? p'p7"]>+/TMtQ\l ̟^Av2:,Mt$N^z!(J&x]1Mo2y%|*nCrzݖC<zj<=] -ƾCEĵo@o2[a@٠LzE KMmg302Tkܹ"+qcV.p6_'tJe 8S3b 0|fH}Gi8+z?p4n<$홏߼/M_L#y8 dM!;,ٹtJh(mCNRW#!' ?܍M2RC)bCzvUV癠6Mx#: E$"kίUa)K pUD/u'5*̖Y R/ƆDxTo+oUƶ~ 9 p:vcl4;%A)@~,n!Lrj6|[`՘ 0c*W`K\+:N~:UGAK\r_{(tcf*,x,mk`f7ȐE(}{X] ov"YFF'?n[L.?!&,ɽO?eBq~wL@;NO9)FFEVpe5{jW19?+o~jOZVݞl͘YE#TMD7Yvmr>rvT$Z®O4{ı$f\ui/~]v!gKVyW:\.SSJ1{X A'=:clo7r{m_Eڳ'jtM$awmdI:'-@кhU:&~G&vڭ/v4T _4M$-t&a#Mpc"&OW0kVC!Dpnp EyàTczP>W#HWѰKxىcĩ>$PJpRk/+ꑁiJzvDH`!nGG{50+Wb bSeRo>K@ .wߝ cԁ몽QjwF$qrr{qAL~qɦ bvZ(>.ڹ%3: ŹPN¢س*W$0ǦrVS4@"i]\" X0B^P+w>b^wZWtשTAFn2tmֺ2`NGJ r${Tԩkɜ-2|}as¤hu뉁oe'1o{IφWEzl ]CX{l$!Peb䎢"Ds&)JliBYxK)%`Χ``-:dfWK8)B_,'s&ytj'e𤨃=@a曧§TDzz_o TRxWGL W- # =lPC p>A ={50"-~wOU=edhĶV6w//#bb}Myd`quWlA`zk2DFE`(~ *.`R &I15-*篏amTƖ Z>Rz/!_"m9 R"~}vJα)TCvNJQ9 st4E%ꢩ1†bt;zgTi`wc9%/*t[[E; 1uk3/Vj*H)\5"U˕S.1Q#sB3PkzoONoՕ|%\8ngy/pcJr/{dKJ|@ӆ4kS=}I hΩ(-,m+^F{C<} `6ڂzQ\t̙vbG V}:?$d{$}喨:k'K[3'A2zJԓ #<^*ߞg_q,ONvwM._FtGG,I(\䕀pk[0R3%G"ȬNm{L Y)'~.̎yNQi7' :Ҟ -ECZA8I(˝`@,H/:t\d8g'sGzNduM"x 2EyAWJ)|U0 CÎ}Q4?T;dWT۾wqvsV17GM&bxJ eyzClT 򿙸4erxZE]Wȵ_f(9_/g(8δCF|W$C`*RUbtK٤ùzɐgI k)~7 :~VElcg Av메{}vFېMu.Y&w6ae#8Y{Rg<W(QHІx`d@SȽ'2ZclJJ1\ywd"z7Q)mw6]*VQ|] ^?-&\@ݫVEC,丌ycuM(WєAQ3K1SÈiuY=Ul$9̒@M%°SrT'F3C*7HR{D_ø.g@"Ĕ7<-|s ͫc.嚸N*PQy B'Qk⣰k{I[z47,Ew]@5Ϗ.堿|Mǡe K MW0@J_+oPjaYD|YԭnT8,хtkýi!f\1ca7eP\3p9g_Wj~LmX=ЀCp{üUORM :P̫(p5+jS!?"S6d3P!!]WVpP{ox[oݤ1gdDwj}д/> Eݑt-TsX?{ZcQKl `x\Ru"zMb|NmԢgQQv |2RSN8;0 khlKl#P7ΪVrnymXۑLF{?HIbIWPFM%~brAwreSmi8cW*?>.I/)X; uLF^v/Z |53eԐOCuIJtE!E3AYN';>X8^r8*BML0HI&m:ǒpFSˆԅU*ZsjOw<`[vyI`uC O?u9g"w޽;#tJ]Js#FR(^u]VףzP*Bu7߃ Wk"$EBӏ vJ Qqj;(( q.Mi%1س0[缪+}Y;eׂ *woph- \Pi-}svjpo&,( I/%o K߷U`IgzhȒaL'Uߏn)oX#~it#BzkV]඀'j{fXeߝ֫:R874ˮxЮ}DfN?;$TzmmKKxY-4}<λ,H͍֬S6GtJKϛ2 >oɸs=rW'ʸ}S[I[ɪlBrr1B5'x5^_\l]S$T ||ݧ?%>HA<9k,s:h.(`tMNR1Ȋ"+ OnܚvOhѰa!v غIc aXo~V]>N ȃTow}3b:wjetˈסX8U/QvۚRŹZp[Bqj[d wz,0ve[_fuPd(Yϡj6?J1 Z ~3p3mw]gTspb- ש%l~ U1܈ lnZaVIs{76UW;.(V4/;u%솉v,pn<jT2+\_H\KW뙻f1.#;^0!yP.KJ$ ::j:ӔcZ),z<rȗ `OnQ&4`[r?_e $0qü" +6#o&zm`z'r-$7n׽rZ?i3$YKg p+<3UsJU,sR͒] +321(6W6 de;WgbmtlƿJ$VH;%ܙ{D蕴(0kAy!Q3ΈJ!ǢM\uȄ*^Zh<}jD:|_8! G)Y F>csؖr d^@ENѭy&08s` yCMW=j\_1?=yJ1˭ Z! dGYR dh0>aV5bJ@b"M -/ϖT)c2A9dQ E٪큕Uc?6+tB~к'1|Z~i}U(i&2cw5gi>ÅJO,y&M̷ѐ`Bq]|94u / >qAGbp &VP^nxyX4) KYkʗ%WHavt-a Xa-{=QuGHĭNV*xY`^iOUy'rToCr+;@&)_@c֡ k u(bRqi.eƴGJ,GhpvS෤5)|} W#3}1 H{9?\a;bNjTS4AҴE*CI\"wCf)Ҿs{s@&+tuBW\r|%@2T%k4:ʕQX&JpQ}(d.5/Jg8$&b*f䪘 )"VtInoĸ(Je&鯑%R|t)XI;_ )Șq=?ƆU<lDY_:fRsyKNB`p1^ޖ~\ϧ(1 ‰RrO- _A^lyW\֑O_zNE2߮S<+%NhT㍝>%'V(:U7(/i 0'y2W$g\mmqQ'e} ͐͐Y脵Ԩu7pŤBM%&2~#UZ='$sC~No*+֫7π=K78,l x2wm5x0v`v[-GzTYsA- oӞQm-$wv g#w>PJ_Qv55B7O (MJFK]I#qI;;JcS-67žy{: H]gk hrtƧ__k'F&RSө6=(cãi{ u==VnSUfPuSQ^.b `];]Y/bEl$˃XMԠT%N F|3O<fuu0O3C*J%a@ lay?IJ>%3k]/-θqjC Uu"$XvU4G@IaGe4d?ȏ_r-SzbEGG=S,B? \*Gz5΂&NT*7l>?dMy}n'//˜68cZHT-Y9)&-Qt46jZC0OQgFQ/Ci!)_<TNKoٻ ٖT4e;h1S+8X%so*MQCg6toS{t{[yw0|t }N~0(dD3 >M7["LhG% ?tF:C6-˅T,1]Li^gdl!eDD+I=ce֤d ٥SBkZMY%nUja/hL^K!XX8>GjDNxBbA?CƼ8-ʛ{~ե;JK9P}qZ7l)'˔ιn%@!WYCD:􂝥[ S4H<%ImmU2~O~2J?go܂<`wpttGu7C%dJ TH޾G#A Y'0?9E|}0m[f[cƁi[~߄ PK~vӳTs?d1_ a_h6~Uy,5&pP9~4;\>3}ޮB2>pI׸%Fhս>غꟈ@P)<9=׫JɟŒxO{FL ŪS41E:[M&DV䭟? `$(z&(Y:NF3as-膧=]Ҝ *4@OON،fꉨ, 1}5 lOgVbXiAԃP-&٭=xfÐd\v2;ɱ) Uj}jFAI8jڵu)Y:=*ϕ(.5 NR){AVN]y)aPE<\}'3]7D=FBNVYzhO0 t/[lrU JxܣjscԻy6Gw6*K_'Z],I&NAib0o3uE31!81/{YY cq4=գ1eFU"+rnJ3}4ZzFq%oRB_p8漢O@d[=5Ղ!,I:\TQșx9`*"VG?TE(sp} poco6W(%pZldg hKku]: @ɔ?F])uLķ++|!J/6"i}R&TRd¢޴m^=߭``r[b14|6. Ws7{ya'KT|NB}HWGN ccIYtQ^ߡ^3zPHpvwcsEמ>6Ss@p3og .&MC ~^ۂs6 [7*8ÜUu!=_H?/=g)0Fe I]S@ ķ,G.fB2 VJ$!k?gdy(ÉѺ\Gὖj?" K]b( x"i6Q(Vt<}\B0u ]dX1ʿԋnfb|\ )aAf=>L89S9Ӫ]U^yҔc .b M;ܺ (!աs\W:J[ɵq] Q ?||HY퍺{Ʉ.ޞi{STW?sw@FA:<ˉ&1#}*XOWؐM vt`&N S9,m:@Duvscx| Z.>вZC Z9rȥ 0ApWZUq=d6ܮ-hl\{dF2vhZaU3LjR z3/>Wm1a֗APȒW5Fc,!3q Hk7yzieK@gQ>JzBxC6~&OJ = "9 Jrhj5̻gk80-.GX&Bl~N7\~JCmadBoE;bqJH{}Wcƃ&g@Fve.!ҩlhkl#KޣFL7px{(۲N(,UJmu !9<qUqh=Jw[$8:VKk*4.:[\X0Wz{%/<ȀKk;H $i%i-ź#|^ƾ]D1\-K2awGWD1#s$9h ,nv,|nBo M+{զ[< /u?&9X`@e+Ȉoy?%֡(S2 py>O?UM% Ơ_wp|?󢙸ȹ55Ab(n=%ul7 \3ٌkNm Sde[Q͙nE5Yc>qI`z̰hI6RY濻/l8TazY/ed=_V,d{KCڞNJ 5HQH)fugg;+FZ]نHsv%qZ79r~Xx"_}]VȭO=@ ~$hckRiZsM X,: RlzTW*{,ޢ^hz0-2U(a$f]WɧP͘q$'Ƶ-\\G aRŤy٭=SE@VOudɢD &K4Cq ?Y }L񈄰;(j7Mjzed 3jZA6KD`V3/cr uo 5s7&vF_sV S@ wJj;̡M|F@%M8q 3M(*F]!NqH*{'qph5JP湈Ɣi30֐)?, B"ͿI3HsajhRJT䇽;L fo-<AK`!#j'l /kILN&W;0w/6 Wgwe- B0#=6L )Y+ be Xu?iqѤ2L3{@@sNKVub`*ܦ0)Q"ؔF_>RFf? # !+(8:OC;9?79h]ØWN*]yNhlz>:=tX'b鵉Y/u:U>1!>NQgTIW{=K`RkзY,!򁿸k 2hEQA ӽ;D%Ln|'f}8d<#8&"vkx|o' 80$zɐ\Pţr% @F xª2lVCj.jw0 ӅV8j)X7~Dx!i$Ļ{6C%b^yN2NoZvp=pV)5h|e]kxOY; XA dղMƂV[^ 9YP5NA_Ɵ, V`P*EPmrY#JHFFG*ʘh~#*_8yJF&t)AS{wtm4JAu9BPI:) &w tı Al͌ff .0@IYڌYxD`|`ԝ,j0d_X4{l!Oϥ9yh<p~paVMLr y\<ь+C%_{–{F݂3P^XWw^QyXIrW1+sEwe( [b3cOu>%zW>gMMeu'nw|D42{)u'?B!ُw󴰞: S9Ӝɋ !kWQb c\Hcl? )>J}guud_†yԳӘr[/+,^~(DȐJԪ'G&"ƨړf$QhzfI|,‡Bqa9ʇ`9n,bL ([AN&{fwͫڊK̡\|Glqy4k$JKz ɋ[{89n v, )j<2*/tOwgv L6YAZK2'kR!jM5CT4nY󒹑,eXJ92{,C˔|p&Nf@ ?d۸f4 NAG2Y%Ե•:!K0>I6cF F@\OnpMu`}No]4ďԋn FG57$q>篊<pP&:sW@RTWc,:. qa@ i9;_`~mBv[Aٽh0 mvIjwV=tKmSG 19w)׎:]!>!faD 0A–q7F"|lHwO= ؽ%ϩy[!9x8Uq5`-WD|KNex:5:rjN:?gy"  y:< -2-3IgodYb @\e0~$An)Uɚ=2Y.V) %f BL$Tb{ ?ΠL/8OsBONE'g2 _"Óhod0> y0GY~GkďW\r~b~Qшl[QQO-&w1~ }/Xx@M6XDG%-CD Y2~)rRJn:kXbI!e1\m5ww#kiUWܰV/-]#Q*߉ߵ3Yn"t)ѳ!R ŮbUO'FɖdL+;h{K JiGXo@ `?aI?Pd {TUP;=1AʇQX qMW+p`UHx$j5~ǧ]-;PWlQh:7ܳseͬ(LLNN$Qm:9svݝLgBj10 mDPhVXg6 sĈP8hm' k  zdj9ʇ+W#Lk?#ۏG :;sDJq&_f cu-P|mQvmTG7VKzZ$v{s2*!FWफ़$5hڬ;bXO~JD >ǚaDb[{K+\ <ŚL؁I9C%4B0j$}}{[(Ϣx^>Z;ݮK +}@TD/_vH`Y2 ߴUg>}5"[awWY^3KC`z&I$V8>ceKX޶WKJw@/wg&x4(|J‹2]ټlD:)Ӊ$/XDDb13㗂szW~os+Irst8pDJ mш# ڭ4^?Q,NjN[{UjPa\(NR"Y8#9-;A?ҠkD̓DԪN~ߎ$2YM,œ*eS^?- `- NƅyWG)&-1*nc+p09pf N n7rPơ?X0{ֆ͏+cP1T<0422e m)<ezR~[g=\m 4Eu}7L5 ipI vakHQ!3{'6cQ Jp6چ|]TZ ꖛ:4NSy+ h@9-Wү6υAg>vae]sr'<Ӣ=mU8Nwve_Uݾ),x>&VJ,#ΨZH& "W>dc$rv; oY[[ʿ>aIhYzៈ] 5kނ2HB! SYvY'Ŏ%x  pi!X䆽Gr=nq@B{mJ8"Q2@m͍ܶ<I^X`.UiocUuRuqOFQ; nIɡeIu\/?(So}/qYŸmFmYie7]W.%Rok MMbUWL0G3pُJxQVU2|cJ.Q}N's{͙$ԃ͢War1@G;;d*5ye**aZ:4iωZs4>w8 6&uL`],po\\9+[}=ArhTVYB B-#"LkU̇}Ub8&hsgb7l^<ak!?V%}ÆgO9VJ#W֍CsS#FX86qɤBI=5ʥW kT[UR2gBy\+_dXyO4㭱7e淚5f]ϷkT7g#d@@ɲ۳tZ>H%De)) ?Ԟŀݒ ]Wpj(̪XO)#z'T2Mn bB1U{(>JeZ}DDKph囂@#;u<~$2U⼖f^ `V#+fbH Rc\~,2TlB0x[?ei? SU'wqШinC?\)Vs~cBظqLΓ^9(wPt qhk4rA;gj:";;l9  ]Z܅cI $w9&X"̖\=r*2.HOږ8!&& @"M(iۇxCo!VUV5>Y[p>M ޭH]PL-2;u1fE]ǣRvk9rlv@7 7OcDC-Oh$ERЉҞ$ک-ABZ̤z0? IW)~&vFJ<vDYRƶQp _;fO4ܤuRY̙ZDYLezz?;˳" l U HUKWg~ ZV+/_@ y}N/$F}L/o }#ա֒#9[2EOg@Ru~S/ml4q_)M݀ ># "F߻8 2)Zv(zN$ŵ}x9RSy !4(Wת\=m|bY89mPX?Oŵ:RGuo¾hYy q: .S\#W$4M%dcW0`Y\ .'֙pM~lFq'LmEbM%G7˖kT+XϷзNv37wId`ACϊ'gLI %-6Uzꕍ d,I:mAwE\JxHb02ez24A@Y)+U|EB>͡嵐ӗn!ю⥙+SHESO\F\粹4i;ttO̔3k5ђSE1u0RTT`SKā݋ln戽@-du{؂D,Wʜl?n!ب#U=M%: d''dϾz Uz{,]otdvlǃ^In1!m50nt2#8Dцaᵌ3(` Tq>ʀ^ާe NJJ p*+ﶎoG()^ Rv;UfQ<3*X>**&}9QCkg0S&c8iRP`p=,|οӔKOUml`l% HL}2ŤO99-lC71RFZflFhE1i#x$e"pulsVl*X~䔦>+,"$ͫq-jlk3@ SiҫD݉ kM*~$\.0-|Q_0ꔌ׸4^O_iSMKC&ShxKXJAm M@UZ'虻^6P~ C1} 1>jLϤ9;5%=*=,IyKmTnZa #N^AZ\oXB)!2uf8ZK4eN;Z(5|*r`D7JKiX2wЮG41S;E){c_GLCC_Fk=R\e{+{/V :%hUX91b`J>vʈ 'OHF1-ZkHQgzw%|p=yh]_4/>Р]XWճ(y V3bC;|PDpVoI #BB@M:8@v_dS-VjoQ0 PaJn5 fLf9vs_.̂#Su'U\:w&0GiIq$]DO7>E\QgYHOw C7Y$́Koy`c/f0{KG7#bu2(TG ҬaԇK54ORZ/6eܲZOT"[0[d(8 r}~xl..`0B7"Xw @D_1*y׸)N3/V;!9ce̍;>15OWB=~qXl:pu % +pI.b-9|p8Usk5\@H!J` ' Yv `OpUl ;=ֆwj*8!: [Dƣ%'[6xA6T$Xq`fdR.G@Zy^p9 \$tkZ$`6̾x]lJ)290Nk{Het<,MkriI+/߈GXK϶an/ps"  p[y6f-ƕO`+VH9ۋ>|}cuȮfU߯u鯞G>Ģ*/`j1@OsTu+5K;yj=hKa~5/}i۶ױт9Ջ ec{G)36>~Գh]rZlP}PD_X*,ܘ@C@O0q˘W)9F l.+`gUxnUB{//ģ4TpMl*KHϋ"(A ^,/9U^rF>hil|iEBe%\ax! e[G/W?Fs9K@ON9wFؙoaͲO'QJ }D@ʬYz*yC! w~s}2K o|qpXK6b~@ d <΀ɫvFDH]SXccy[yWBd ~1Y TVR6- LY3oo 'tmgCƇ5^pG@$v,s-c'_H:cɗr~F>d8 y5"_%%܍d_T:M+ifX|Y::+|2$4ŗ̅kJ4 A Ն7]3vտj3+"O87d Rl+6;& :2gۿ\j`m"LUѪ+:4 RṽH9'к{{ӤS~k[fA3q3zۿ/l S> h ,yy ϑ: kmF̏'I`lDlm@3g3aD/&X #SYХXqdVnB#2D N^e_'> }M*e Mf؍_pl-+a.&QRB_v0aN/ic>}FF(1w("dvInh0y'`%wش}m-R:d7SZ%`=KSQ!R謮!֓;j[E'iz4щYҙc~H\2>dc b[*Cw!("J`R'.1vl/ ֟>EÄT3ԎsgQ0"N: XW&`c42e-#T{<dž!jf`"bbL3caM k1W1YU}gӜ6F[E"=QJӵxk75Sr=lq|O};M[os;AֽTk N dd^dz'H])d>^[ݟGFA9F(t#)X7 Ms\{4t?)ԩ''xgz%Ol)[b?^Aє mJY~*m9;R1pC1(^Z7a0nVX <̺ (_Z~orCB֤OC(6q}OB8&(a+ o0jL{<''w:fL1vmoǫL]*?fbypYT6&n+#(Ͷ{VZ+߆F0\[N!&{;kH& )+ṅc.ؠ[g\{Сn'"X\MNGH4+E"E6[co8y()93}23)[~.R#t;ڬhDZa2st?%j̩:yF4B@Tm 'trv$ A=g(3 3q L wdo؛*3[͠^}q\kc X*QkءYIuڶ}w"tm7Z 2/͛jL8̂|̰~.FG*&dqnMܐRwR$#5nUahIdbۺY/L &3~YB2gzg,xBc5_+3o*F~X }~b'C#;zqshQQ:U.47paDe`*q`F~Z1_\2b[Ӌծ-}Ul,O¿e7Mv?ftAъ$7᫾O\e]C. ,F]=_cX3;~0$flr97t˟\:pbfDŽ-j[܅W.y NcMHqe;L&ApHƯSo&<+YkuGJyw97OGk|H" 󙽳'ha¹_WV^DFAC*V@. \?ـ* ݣVTIoOeI,HZtjګl,QENǮCoZ9j>3phI\U%~Ri@a`bbJ4Ex:>}2O:Y1UBOޮ/:[.5k7_9 OjKuk-8m(_R;]T~ .8RϷrO5lZ*p*7U1)\nFDiMZ#Vo,x*(1EYwt$_W'"OaHLLTv&[-R& ¡OiG;ˇ͙h3tqILvm[; ^*"Qi1uA sV5 g&Z⌎TG~8Al*ڑXއB]%]9jmU*ƚnVhw4 oMr`4t) ZZnʷoX꨸aPN#ҙ*~ $kD3sCNWUA:g"`ڊs4͒ f5yeVdѐ 0BST6ihqbl3q LL<<˗Qw8NAld|8q7Y|[qrʾ,.Uʸ}Xf5c;HJ6D,xHG"pyY(*Hiqd~kͱX\QF'张18`Qi]LK.*zL븧ӑ֒,33pC pF^LJ=%yLXP .$sJڌz%-`mVhjOL7YzF-A5k(: > 5妚RL!\0g=P4҉MUL=TŇ gD-Xcgp"ªn<] z`[17 EZi:7__} G!9q]qd/E/dHxH7`ώ] _Cz[]$Wjd(DgU冡Un1~dyotQA-G"ŝ{4i2zcYC>E)8Npz=^EPRJԃOQtkwCFQ?sq@ 2,'H?ۥLkpi`4X[2n}ޱ>DJ>{drm!C ,(T>OA|^9|[x@Hkaso*P\׃K +]&1d[0nxn&0i3詍'iVTETȆѹ`U}VQs Flk@cRG>eT*yqQ==L 'x;)츅YXZIEلZB u[L٤>_h&:c@f,j8%l@-}x}5ಢdĎ )O1عŁR,w|{ |ag|axGW!✡&!ݻÆӀf s8 0Ad%>{,,}3`*x2mu;4WnaJ`hbd6'^1Y* ~V \&6L pZ2B:d*/kQ/nI_~ އ7\\q7b.D.!Uޓ}Eae,#oT 5ȴ ڝ vL@̜ΛxH6>d 84 |';YR捻xȶG5ěd%LuxMʢEJٕ>Μu+.U i QD\)Ĵ I.7r1ƓM>޳ yhc:Cgw5X6$[Nk֡~oO'Ko#j^[./A(1'qw9"sʨ US>4^IQN%ʳD4H}~J&Иu7غd>}ŏǶ{•q:I| &opH#ES6ZqF`wX΋l>@Vd4=XS?L~P-R̾E XɍInEU*5a=?tEkNGXK ꑿˈ`@ضV!ʑ+%(嗡{ALVozԵhk=ESD#͌:*Mm${_DBn oBKw8_gn V}}>"<IU:P;JƦА̵rii5_JhpQ,\wΤ64k#\} zo#=f~HKldb~b_e;,IF$2Vp+\zWX~LaӭMHɗ3~:@Ar\=twš Q; L;pl0o)'/Wzil93AG'L/&mJv/ASW:'29*]n(%U4Ӫ3C4>d:tY|Qwyڰd_q֔\xnz))@ 7S ΰ/$Y>-/N78 jrvhZjs\ѠYU@) C Wńb>)vZe(ڳ%-UI,aS| ?jMm8b ݶ-,cuɽ>](:C7ϾuvQci\ 6^Isy΅W} l8> f/[SBlqgbw !hG\tnjk,h=#I`&9žLN&vUxJmXw, EE[i"2\zO:E l"!y#ɗ~-4xh`$ ȖuN"} +)+_}}OrnH$dDĊZ(8`!9H%y6VKY7i*:c OWKBzBn~rZM7#o*,UN pG}sh΍w _AVf@R0UKNt#8az p # (!Q5/.Ƿ,{U}8H8;3RBz/ }Xw?sZJgԣ(sG%7QQ3\$l_A:?r\߃[oXDȬ Oş^@ Ltk^|Q1I72s6-XmXD8c~7 5H[#J 01}ؗC ksYz<dК90BeT68}\L]#y`(>&sp9<6Qsq'Ws\ALp4B0C͎]P0L+Qąu}(XL=⨸?RyY)x3PE/$R|W\e$ w~*e¬16wO`ln"n9*T&8B%t72  '+!c%/o6xG?T5VU L"/åfYC\ZdF0sD>r#89\Ot$%10F5c͕h{% Y*bL.9aPg(=6*!D03tp?qqNr?$wYh=y1x2p;2N"Q~hs+¿%MTjqaVq0shdD)~[D;+1#cn_ݎSyohoDCnNZ -Ig]o6zJۀ͠U }#X,~bFh;C+2Q,ʪS=^ ppEَ;Ftbw9u?aT* pjDIaf"E;mdVR,Stʰbe_9];2U%:tP]-,{zIc GU_W $I">}n6>3 :̗bd8dhL6ȜMr <$l%BمRәÍ/g`H^(1LuӍ! KXYts/tS믷#7#H[:q~vQ ar - F E"RTs@@#nEپZ'ʴv+.-/l yCFoG W7vd%=uxLz$,:n:'-i4v㶏MRCIv`A5סF lLЅƒqxRR%b8xfBx4uX4 Sm0WZU` Fiĸچ[f qBI IUl3t,<렷ftlyqR; Ov& Mu6' #l6eq :~,l0Rk)?.9;)Smf}*ڭ%2ӯјyhgTJaI+!?#K. G8)5yծX] 8=-W4#fw&ֈ@vɘPCA'U-Y3]2bEd&8c',_Z >(Ql2_"P̃_bɀߧu#}s{i[kz÷o$_pX@~ LU5п aKĬ˺\* ']e ȵŬXᢀW1n,RsM#$kyL"KN|E:=/S#3Ɲ/3zZYc9FiV ^v|<([S('|t{v\Kɨ>u]wTxV'+i2{j>zCiƾiux${"6B\*;P"xYG\DB?߲Ooh1)9(2b_C͢AK 2E:n j9L':L=YS+80~f 1Lu;C2kȬeHdM,lhIhMwj7!G JN6t6 >V>$4f3I3ÔY3dYP xʄZ'/:Q)F=4=քROiK v۵cɛ%|gpdjqF,jIHE"mdOK;M3d}H6e;O7dnD `< y K^!GT"eėq̷FwpBԱw`)En 喊L̵ je-#*El:f3,'E$!_{?v6>?@Jyv(EM# e7[[""&RqgpvoTJ~4j151*QQCpf,skY&cc`:qX!4o>F6+ܬ2\@BU۫8m8G`c %pS 0ZguE]n(מ,܇pC!H˂¡]ޞM ΍ZuUah-v|cHKT J$A: 6 hnؒy3n\8_r%?i~;kDs8tڭ S%tf|3Hp䫊 y'gՠĨ JzrF3+p %!OZ3BBy"ҍd-a"$9:J1[0<4ͤʳvd sNc׻?8Eon/A!**4⓪aQC) J Η9%|M. h:3 8E?9´d!-8 p35^]N Ը|mO`Uj80dmYx=qt-F yا" (!w=-&BEz_YZ2H͵ZN*'EZ>?*.8Mɫ FYtKT9ľuk|΍̗0>Ub`$l"{DDEj].YzĄb܆>Q%탹'؝xWL[qk); L}tEeF f53}("TKpY}M0!iG2Yb1u8][$;PH~ fS]CE*aV4i݁yUOagb'8eb,ozX$;pթK^V8AuKӺe5k!#"tQt_;#k3Pa6a.Ry989[RY,_ם; 6 I|@]`d"]y=#ٻ4v~9㉤{ؚ^ٶ^lLɣŽq:;8gt|;`U,!RRu=^zuQlq3JrK* >)sd'jGzjΦl)vL^%od5|9O!?\6?DD#9*g2G4ϧh!׿r'zk;:YkG5V #$e=71J@z}~lqa7іCݜs0QI%+ )5>K%m1use3ZsfWuMyOjp4ԡk˶ߖ RY`ri֊]^cTʅ 9+ڷ<[T83ckeX3Rz?CY*>Ѵs@aG{Hb7$$zܔ8m"xP/GgcL& Y<[cker׼jd"WD_RҋsV K$OPGLY1ߜ>7DoK^POo29_MCTiuO~1xO7}V2.FӇ'Hĥ;w w3b82J׀chyn2Beo2-6\nei~?q00!r[i0Ί,ktm /(M^0+b\jm&aB@U6JRw1pp i\n:o7MaɀTr)gbG !1G -~āskӃF:mI/@StP֘&eԟ5R!T.j+yThdE_;5;z'¦ENR9%{b˅A؉NR1||8HVSP 7~x ho5yO״"`o+8@OfxBgBoh)&=*]v iS!)N1YCqK <6V2Ů[,N\qP-Y][Gq,eY3~Bi cWC.r<}\KE:Gn* @ꁋ撔%bL]0è q{j` }hgoʘq&mg$;UJk\?6*=p:  2xQR *i25\EmӎlDlv=*g2i~–$j63/a̸h}iԎt1Aktii1 kxD~HL?ʐxtkp%?8Xx'\ C;odǠwM_0eY=5.뎱DM2,D |zs2% @4_."yU& l󞯵C՝ RmLWzPz@a~ `<1ľ„7QTC':]U;tY hZ:l SF%8y2G>*$x0~ Vʐ *F-n"۰B7քp>ԳI:M9.ۖ#]=|SO~Z%r3V_q /0=yĸ!~qh#@ۛ|UW2 q fttc-O!(aFt^Kzb5eX-+/:`]6_C"FxCDe1Wܞf}ܴVlKt"'(E<$7@x-/zJuURk&O*$쥋0 c|/vHv. Hƹ[1WtHx^N^z2iaJ(^[|(.-ǣԅMZVJ[[dRvo1e,'v~prbB݋:dH~]73p4vIP|QGM7"3 'stHB'I^BvLDQd2=k ij6'(vG=Wx-!".ǚ:MgwP/4,Ψb{z Uo~דN'@EM;Ai`kbRmڊTI Hj6hzOrt{s]Xgx ̉6P[?%Qh_${L_8AM+E yVrYcQ7]wLjC4lK/G>q%֮p 'sJDsd\d=Ëf֔!۠ H L*t8aֳEBfzFÐ#X7w&C3*$VQ$L$һOuG"mFUliB: '[O hyK|sQx;"Qyɠ@鲶{_E]:#kNቦ?_g Fn%2jDGmkvIr #%('SS볿;IM2 |}5ޣAh2tFȕpm]I(]jF<ӥQYW8m/K/9oAUB(vCεmsoH*0˚s ZLHd@NmG44jCn w <ӲXLB\mxIGm7瀰Tenh',f伈|FᐘMD*;:F ׏`D'3Wū=bMyLm+6ŬK,#;^\gXѨʁph 钰e͌FmiGcwbuwMzt[ _REo̭FO.sC3Aٜ@Tf ъlQo~Y,:Y>X 3&/v3Z6'eYۋ)ظ9\u }"*B[PÍ񁬁I$>T+Of!im)YH9Sϖo)rì (qO}px@WN⻾e7w $2'l۟Q,get&`I(ՓvnSL/R3Z3YV2\p*5k{dF^U}zT̶#v]iS%Ө7euU]c:;Y>ՌT^a ;_>5eBc.~?"2NX_$iwa'w*ߘ#7kA"w1W<9Z ^Unva]; TR_κjĊ`Pv٣Zi =Ci@|Cz;bDdߵI'S E9괮gEߚ %ah/ʆos/uU5\Q=TsK&ZhQq}RUf>Q⑶adn)F$6*DDx| =פȋR3ܡ/cv˾y1Ov誒Y!\Mȗ4MvB"k:l0gFHkH};Q;0cXk 5qQ5 K~R" 9v4`*d,1ιl; ?Wft@տbڐđl[HunnUe,{B#J Nz'09BzZYH$<?&N+-3裄ԱoMR7@%Ref"Gcu<xfI'DfULW]SSK@+3.TbYS i#3.ScYH9 {.:\ZPUe=y[&[k _9Fi(ZtkM _O2sA+'m'!ۦx CH4zWI%lA%Fxzqtt/Ӭ.?TMVX# Jh#esWHϼ`y <=XUŞG,I7#(zrL č,:>wz2ڝlctRCka yn ;`hbhu依eY:6_FdDY-kЫ"rԅ IaQ3|8Aᣛ2>Z3-hTJsnd3'g3*D܈ZqMX` C\R:Ėz*XegWc6\p+!|ȴ LfKN1RZ!x)! H@4q;$)":,8 u2sr5[l9R0Fj=L YLbX0j>dVK7/C#2Z{5krrYҼ $J10T~BmRMKrq#k!on38Ÿp i[G/tP.B XóW4nԕE5^nxX#Ħoj]@s-Nʮ\"y壛bDIJi"B # {.%7k?4Hflܧh3;m _"? bO Z3<RU!+QY`;3]3$CJZRU'yj<A>Da؋J`UFݗ}vFa b7_ sz7 g36|F)t/lP)u(QRawOMe3ϑ=Yaeٵ/ TwWE4wDvVsbmM =Bn^K`?%-yۓb9̱.G/0=yٿ7QK8",{pv%RmAj q&uӓ.,I|DdU_F#%"sʟZE%|RTivfSm氬onG:ފVrmZ޵Bc T͹>+hQLiL^I0 #8܄: NDž}↎ިJKo#ac+ՕO'EDw*C`!*Pq0Vw?Tt .>W9@)"zZ!u>cבvFtf 3ii订RTg$g[MZm#v !z3@IB1g9#GblcHLB%5zY$}iʦ﵁-w.xK\Z;iLv0u TP %-bwRwT+2u3HdK7f-RG/NqZ9]&&NNQ\/+"S~ˏt4@=T%Cs~<7gLH7,M(w-Gl ẁ>ۀL2x.9EjihJS;N <%67*rS_˫y/d*&{º[ut+z`BЕKcqŎh| 5|4 Ջ{lC()ʛV_DW@M`.udDгa 6`}ܹyP]*<[k*G1@GaAZeX77N:8ņHF ZfB>xƅu蔴NZUQ9QO[y'00VQk$M" `.S:&OANGS>;9iw%_Fi(-AҪZh'P9on/A%>!3BnD陴h̰P~9!v;uJs'B:LPp`16~VO˫vTwL9tʕ09nPlp҂Rjodۂq7;}, A8t(_KI]" n_̔ m=ϏO1 m0YM5$s"Gu:h ~Æ!IAս?f%~ךE:zo;)SZs"Ax3?ESfNVf 6ܩtո4!Hs[sJhlLBLY{3>΍cçme;F-"-iGO,}1Kt+O{Nђ[#c%BHwQa-Z-IJ|5\*j-RJ0*DЀGdjbwvW4-[bQDF4 Pۜf]ɐ*(MNЌ]QA5Y$.b/S^YCFI{ jfvv-$]Ryxd-Pih}NM(Z{6ds! Gc%i'yHT.p^ iR&/(xzxWIEfEV 2氧goky]3h3Q<6/ lZ-nxJA8Scy j9 |Xfo1wjʁ5e9L+TsMY] Uv7 cŤ5SĜ;9E/L8o B vdy>й`[ 7ʇX,S9RK*W\L}<}?c}9mU] `'{Mrv&^ %'v̽i"ڇE:3~QROQ",1I N5gV83\LCRm;=;:B51&ԐچalMG5_wjMsW>M`oZ7@`*J3KNTБ0di_/a]f7yN~g]wҨ'.lͷ`}k2d"gf+)#c^R' ck=,kqxvĜ/n<ru )8>̯m{WnLӉ_}@Dի?t<)??6R)ǸdiDnA Ҝ"T͌8 iOCb\emuVB@״}{.2j(v2W[TeF"@b1Ͽk4Swg+5; ^3,Jтq^Amo,VX8d (|2 ˚$ZeF"iNcP?*/k.zQfatsp`x{Q冏gxWx \^uB_:x멉.'"oLw|q#G#yM,ZhrcV9GwugvmC1\ݮ=J9\eYlz>u'$p wZds#1S5Pvrٻwxnߛ}H(H_Y{=/{W3-:,N{K< i <%sN55jQ%)S]_yW["ާ6lYؘ eWTP{"sPa,Hn7cbgeOM3s MCi|[0) Rh0ZdAP }sf..ٵGԛX 5%W&W CB i9- ]r (fXQhorҽfoݧL\"!i g75Ic<S7߹=l3{G:oتj#)=_ϑo9` *NPW6.X0 >>W0Dٿa|5BY?e^ՂOּV\- ku~'bPOw6@y<.Y$)b^Y\`,)ܶ#KEyJBkާ]66Ƈ5A!$M]F+Jb+`U@p*cNV3Bky[P^Uy+D5E^زO4k[? )eXQ('Oa!1-u~犪-|(P䚖Pkˆ iPby)JmvB#pK͑чb+Z:={~`(MPCqAAB: +>G2l$i#PEq_'S7w)8ڧEf]kl.L%^I6heEt:4, PطӑBUKͮ1#:a|JC{P5;WuR5tS6߸tYC\ʹIèm9,BCᠬ="8ۣUxvA0]IʈꖽyL\$tA҃Saz/KI|yY'=yZZb[N.NCbEK0T{v9ڷTflKcv^}>b~xHC7g!)B:|f7au()MI(fU1 /+|8]ߜɂ&?nkmǷ;i}S46@k8i'J>ﱞVDaw#qoD z 5# $ j6*1 FaS K1ϐk5U*Ց=iiq?$`iȫ[&0XӻA֦2xf{Iq[^PlD;6׀f_ +и=NDkE+Z:=u>~:L=ƃAi J/)rv#G*PGR:χc}`{KcZ=+p8yx `[̄NJ*Mc@\w ؍Ǟ5`«pZ#qV3TLο<>Y'GOKatw&̍3-{dIPMAW#R\ roRΘ^v SGPÝ3ڶ`" ʻ5V4IuLJ8#`xza_r ۸)cI€>oY)q^.Qa v#[JpBֈO8Ux_hE3䎵E~h0\i?$ԧh@+$^*Д%ud8s%jCL"&#.ljg) IuŖ">B@ú {. *`R;E]/GkL9]J]4tPjXYc 1z1#ޒ`GvyY/'.t#(317\Qn{{ݟP-~ paO_0S\NBc N+29 :g Ms7rz$8R#;v .v`+ JӴ B;#]&XeZg|S#L w5yВ5&k'r#ܪ&CԼ0q+eN蘒Tn)x֋cz=X\l–w$>uA4)>CqO,`{'DZJlD%ZGC5VK B3E!u|  V1p^CAŲqLhO;A5%‚Cf/@{>gP<$%0m|m%UZWCl[H!c(`` )_ROlDžA>sU1%ۙI5|-skYL2 cXY󂣠~Y ^bX/La|S=Vd.,.Weޕk $ofؐX(A|%UudĔϔQNd/ Rr,9V_0brv^]CIJ9?Z$28%]tDI)bȝOQմ * pEav#}Pu>r7S(0ЭUߗTa^;'ܽpOy,.뤖)N!,W܃H Wb:ܓ#i;U+r )Ҡ96ieB&/ ƋV:|'\Je<'k@}mx$#*mcl.FOI]uH0J_"pIڢ^V2,> c iBА@k08\t[ ۤeBiX}#5UYD ]8Vl%Ć\.䠕gTvS'#׺k\A& An /э^-팬V#.bZSGFGQΊHim ZT9(ؤd^qi; =B\Gj~?J6"_Lۂ0r2u4lfEnUs}mZT~7L6s(ĶZ7NWUqȌ=<2X"F*%#aϖ̦HT/ cN)Bj3q8y`҈]mB*˝إНuaTYTשF_g<"s׉϶8Y;$wWCn} "-U:@>Ta\]mkBMu|>1!9=*Uem'mi*9beo|$9F*1ULqA +a)(-T`jzGf^{4"&I'{ܳP1_"Wg=f /}ɢA˓ hqн0?OCG0GLkJ6ױ `dѢi%qdZ5̍aq61=yp #V]%qibNF-޲^3eFczwyΥ,qBUUJ|o dNV')춬|&gǥeJ9/ ^)£O܉NY0PӾ ohKy!3SAԑ{>}fpU{Unz8J׭qaO"֐jbqժ=l a5ou%>/C3͖́́'~NUBp)qNGY{y=/$-aN&V6&g0j;5E {IQ鄜 bq'z}mVg'_}' ,+ln{3`ykw0T+NSSsҞ׿=Jk :7S%C7}3-gG? ܤ+6u3%~ܵE?CyRܑKri^Vd 7چ %ǀKc/w|t6to{#Sǖ#l sřʵ}S;9 Z˧6/}휆Uv{M߅O:"nwa٥"{ ;yQs4Ӕ6{٪2%hF%Uޥ@ J06Pq7C@k)ϋМ$ aouiƼe`@-Vɮn5@PS8o)ϘJOݯle,) tUlհ0j]ᠤE%*_(IAz80nJnS)H3+\NsPazUO b+c-\̿#ˑeA ang>ֶM2A"AÉ?ȇ55r m2F@7 zI-EGYﵪfEwsV2"6ʿv__7aVqsQHqR{&RLǹƼT0r43Mv-6EBG:|~eVЫӋAH#mEzVIBIGo<25c94k `Lc3VIw_aF``-n&"5A]^rOF]b)+0|h,#s&S=$7s@$#hg4Z*B]2&,bc0<"crƥ_4x#h%߈CpUz>-0%(-5M5Ahbi0Hud#`VG"ebjՕԾҊ ︙UnYMoZS u6kT"NV#hT=H{uy6N."G6&J.ףE yUčuFwhޮh_Y[`)1lިGAC˼ pOZ<6wc7.6Feۆ^,Px#(BU ӕJK{>PZJQo=fYHlRsk^3wB'TD5[zvο>n!'^jd9AV*+}}ι% ~z`ڬ{(#4a _j6$C:a%HrН(/V{)#z+<vхP<LQd C$x ^0 MzE怘qxTyܜϽd`xp]bLKkndM(霷 &.)RyϔX( %|jE ;LMc (9"0ۧ|n5VHu`Dnĸ-9UA] hp4Lā񒮫.M΃y&1ze]_P< *e~=/wMed҆{"#L:zct0Ky?M~O']|ʿ"VHUj'guT6VcQF&9yxTB8ڢI3!-XVb, FZQ.OD: OϤiT0go ZϤ]^z)lzWYε2]uRr8<|VW4&e\!ORs`ߠэN5SQ WoA i:AVBK|QRGW/z2*Y-RdzS'#/hitN/>tմBA Vaqʍ㝀?5ڄm$6,V9d+ɟRl&$I(uGգ 'tqQ@aJ:p|ڧ$c A uۏNͭ2̑-Lːi,2־RZPG7V ƼWC`sW滸2l[x3 =$|EYRqt| -t??\RCXS0+mB6b5B9)@C~uX뚔\c| VIGY3Z7pBnʙ&QqĽ{ sm0ڑ{uZBjz ye֓l y3NJzA`h]Q~S{=$D|]\SEhZqKl@̞"z r zAߍCWu6fzT/mki}D[䍨_vV}01dT+:@NjU7ϺQt bL"tdNIq;V;=nv Ђ$-p~Z4*yDkkP< L^Jw@UWaqR}@ G妵nPPi$lt_}(甙qѶޥ)#h1_yS 6(!0.* 1.sX}=~j+^{$o5.25UPSXt(S4R + +X(`8Dt"B&Mú-Q.LvWfvNwߑ;-$CsW8+(okP RHnQtay+D\?H83E<Zu'މ,Yޠ؈|&E]x4 (z0H@wwq\$5!rIβĥhVUKq>?09$իYcsm"inNsv/S<;^`E ȖiwS):kAaۃH"KSJ8?tvkRUdɰן&Uf@M/;s+{weԊǜ7WٸL3Fji+ݐߎF f4X >l^'?=MF42>dKأ v2bwG @k? |,v^QyuHÄ韮n4~iUrZ6H%tPDw655xf';(6bs 3Vt܀ @v*EOB`gͩԔȽV.ͼnmcZa9 0o4Чڛeψ͍>WB4ŷëM`ߗY]H ~5WgCo"JJ6.bANKGdi:F #$FA`\V0'W_!DRO}P-33$M^Sroݖ7NnԤeue Ƹ=xs6Cn@h\ ndp:A{dNuG|| #ĊO|dl]P}י,? -H L#b (9ܢWmD(,1AL RH GjPͧ"+8wܽar K{F[avϰA-Ckkrߩ΢·)'] v+zu ս𕮈W{xz~\f!O|y r\|p=&OX'['LlhN쮽<0gv $iT*< |M OՠS]ѥu|&&!,i~5#=м1[kE4:E0:\)kT%2p:?Ɓ1MʎO\ ˯{)73 v͵|RnW!rD1I豘P$QE4Ѻxe&Cٟ<EGIR _skI53K'Z f7ц4=( R5[ vFt$ʸg@tc:K^"C;/a_>"?h +f=Q2#T]N[۸ZeR"@vLMA h/(v ^S ǩͤ+暈aNOK'ɥ xCDQ3}o̯;^^om4"j#CA7I"j+l@y +АnJ]Vx5 *Ng_dϬAH`}1n¸Y_ٹ{(qSS4Smo $fz58Z%f ;G<3#]jWDxr9͇-cQZOؙjEI8c":VN0&R2J9'5NT29WLU? 'ʶ:]G6d {:.`baM 8)k,;0I&nvQrZ(4\4Wd(WK'y[}6A V3ۅU6lCJJ1H8LSH/^NcV{V,n?-2ΗDe3rx3 zsVy08]FHRZݓT^#PtPI9f bFDSaʪ1AM3GNQc)\}4TyOկo%$.JS$QF)pO&e$\T!7mx{tpI=F՛F!6(r3kø AQľ%Yvfˎ&ӷdJ |i<{Wtp6$.'[<~vbbx)ꁂUY$<>z41,.3>~#oS F~t#>%&*FA wfU6sv{MKv%OcuPKe1 fܝ8BM2 Xc )0*I$Z΀ 97!i4ZL/#wOOkTGmDlC-]ǬOx"Q$UWˈUKWO/l[DT)t8Alror^ix7;9woKڡܳM/f[:֫g鞖q^88!2c=v#Q6P/Q﹕f?d}=C#YuNk_PwP;YEbM\G־AOv Y~~KDhzꅋ69v]R@%U4鷙>7.˕Rtrk`y@xx:H!_e#,V,:y]37Y|#Hy] 3 ?A)N}J'@V)읩z@H<$Xc$ȕ*'@c0Ԕci. tbQ߈sIo8*UGyGbt>+O4 ӴG ecu?8jTRzp(Fńݶ/%?Y;O 4Se/@͸ L4Ls636=`51)_Hi31;N^B5 '(//!l fKO,UWͶhg+_ KbgsX**)&VDxwu?a~k8L%QLUd&{c%KuIYp̺4oB)dS=dg sy- e,P;D"f$"N Mk8X&6eڵ/ݷl<8kL̷*'j"1&`γE$\ju|p@G1+9$>OToatGk4a9Q4SMg sZJ 2jPzDX-YɟvN\yIA^ č!NCfr!Qb_2j}u}`6*zF^e6Mq|wT) u}KC`r]VhP|ZƬg ͊-L6pqe&!A?m,wNܒHPmӥn(AhQ|ig+%gj5ǫXyCIa7B?}*[7"ĒzuÕuLjF,uL5^ӿ"]_=30GvdNQ JGClW!/p^o.l4Y$r'A 3^4u(4hN#amT^cU QimP"ombi$d:ih$Fvj9gjg[AGDaP`J1 g7Ok'ϸlRU*W,똩:aj %b 8 钪k@Ir}\j3ҡólxU7o@`+H# Wdqz#vwQowbTgse m&NI-ΛY- _#L9Ms$ą6b\JWnv6=He^[^Z*x yW]rmEO`e0aE>6 =>iauCP粵[qr## $e L i[.Pݟ[oOpt=Ma4T6.̤@=ӄ/ʳc5i<1pMh/N2qC0vr" ۻP1%^Rdx6̅yic4u@0tJH')SLj?_6cP {nHTOSHC~G(fBk-Mb6nNlcڄҔ(J74bjyo+e#]EgoڈՔ!eY_UZDU{ #O? @@^8.M"VRf!DUt\r(&M77ުW?yxZ> 4 QG^"ϊ߈/g:r5+{J{1Vz'0xJO<nUwcJSYݪ؉ȗS +mfC!|1i<:?er=m\ٍT6SҎt? ^޹X>סϞ1_ÞC{ Ul. ?2MÞWO zB(BR(^) SqQk)y!v"XZã^%/^'eb@ 7^sa-D |)`}Ԗܐ)[Gn Xdk)J«p}^,WͰ!wM^4@|~>跶;YP W5 (b/ʇD38Hx,d9< ` W!;;$jn1%Y%s dP>>O6"vYjj*]!h4Bl oDJKF ЛXhfR8=xA_+H V;Ÿ:>$bW%Oߣ:I5YvhkH6Uk?/oۄPs*g/1)*UDQ2AMYK6#I>J*ODtFo5ѧKaGM@0^9zwQ~v@T e f{vČulF 5}M={}W@Of} *8BφvED uE\BjÇ2|X$Kgc\8QY:1$w!{;s2ph9́έǕ$Pqf)F)MR <̂a_F WuAI{+ JYhGHL. BU.)/=! /VW}Q;[/Leٸi!HK+&F8Rz2~74ڮ#LۘH]=.q~" +L.Xv2U?vOHpPfޑC =l]8SJvw|4C_Zwcmsɘ2c 2?+=ӛ7R[ՆKq+W$]T#iyB q2qK$͞AdthW] 1\vqT0 RtLzndCYQ [ %'hiK J|6DmA#SQQ;xuMuᐙz{}B$'$=k3q,Ǧ#7׳_FƝ-.5\,pMdt^'ZU dU誶")f(}LD ň3K5}s6Xz&bMdZ5 &+7|̏˒p"aTE%@AXYfړ5E`^_HCK"~Wl=x35.R535m;) >.-nRI0~WzcqqS6~Z*FFl6-;no҅8l׉e(P.Sұ?N:х: qdסVNh(!SyNVU#xj/ JLd]DIog]X.p 5ʖ^i U(EAH4hO-1>OF"M_4)ş ,ԇDz,@˭Wؔ7b hIलKF9`!~R y 6H߷?*ygd VEÂwL(ě~gݵ$NA /7Hs/Rwa`T`w!=Ϲ0mF/cՁHv%nt[csl K>Q*YtW?{⛉\"]ß( iqڮWȩuN q^KD߅>)ll{YI֧Y,>ރ)y.22>2s(sygC.@#o%pWmT@)hL2.>gjm ā;FNXs:o2SM6IJ42\Z*0'{7Mavͨ J-+Dz w{אR&՟ tzun^oSednhAtxS.B%o*". -/<~B0>/-"@GxR'lNE2mI iT \ȡ5sA\9g.kX!⤼$l/ꮍy&@BD^,L}\à1~b\r s˱CFsEX&%҂FuobҦ}L\Q"L*p Lgcr dpR~0x=Nn8?;bz:XNnx mpHf{m;iHn_Y?$L39 | ]&:by3xsn)_fQ"۰) )?j: ^f,Ip|.M+qp&tzߍ޸ 09E tP[hW,v# ڙ1j|Jbi^9YwihwfbNE /^԰O,0zY&]Вj?͸y$rx"6_ a$Xr$5$awK&M$|<w$7CC},+ͣNew"id#z Y1^;ӪLQÁaJ렛Jldtq<4u6yU"Z &{Ϛ3h_4W*n{ }o๸MvFrf'e5d7-٦Օ?čBzbhTۄlһm˫?T>ʙw&1S{{hʼnF)ypX2(F\ //+AZתR{'*ѥg ,Qo;hC'Hs峢?z.no*B{M.=Jhƨ$e, O+iJq)WT VXԈwte+p? 3g:Z軶KAEؖK5\"\4g̱N+UdṲ5ZPl:$bM>ZoR٫C?a)P',H6IMm(sԈ[^[16OM bhrylV2^L0=Qy31%,vhl_QOc4P0}o|N!%bv#ۀ)X;$+k0.RhىZ!U u4DqgI º#^f4(|䢄Ϧh@D&O]M3;l{dߞרOt0&SAȯ3}K3J2;YWz/66y\$`Fm1Fq=Zm)Vu2o)2,H}NNcܼc:pX ~JلlPv Yn@ `hrњyHIyWNS|/Ԭh-hovIg*$@p!:FrJYPM^7C~阥ݶ0;ϩSƁa:7ʔ33LT@#t $9QLR, _L#e >2S_Qhv}8~]0|6DנZ}Ļ_:+^zd謉ڬ,$`g8˂V7[2p6RUYj@YQ#憘Q@[A]oh:^_G},.|& 'G;昅6Ä#M>Pr [9u@v9 OdC*%;ƲZO?QZ+UƌT/ÈKyjQ`f"vy:q,7^d|p/1N~}c 6ZU7"Űs<(!L}xA$+ҁ1OgOM,WYw.ֶHQ^6(_4e%3RW c }w g!øגTQy@8/i˼]~־ir'5*Sy*wEV9 xgBЦ䇍D)KP3;VE2`d b{?\FX-BIQ`xsiL3?Ah9-i^<}d̲S5 lb|N;Ap!LI-tydgbzZĺ8\9s& @O!6y P Ib tguĝW!+rĻ|25߇.j?ޅJ"`mW]Mqj!_Pb3RVeOњLkI 1 X-FZ<.: GL4=xBsj('dZWWSV((emVw-o˨qu^9OzBZDD&l Z1Ж^!>(BGT\N+!i:I3yx00ǻKХ¼A1-[<,JoC"w=X 7V3G3w K5X 3^//E/<>2džS s@H.f jvAx|0X)nO}2 oy>䄵pdWDfNU:_&tg}oOy2̛wq{q0x/\C1,P#KxXup`z!C[1+7 f9ëKX*EYQrǣH.୅NրuՆB~cqQ~*c r`IוX̷YHUmݮ[xKkL,cSr8*N(HT>]9 =z&Ewc~GM$pa=CŰ4>?"hiX)/k,9JJ, ZDz '2]ģ$}ф_^mQ淎Od9C'VƼ'~D3T7[-Z{&^j J3B3Mxڼ@߿ ~Cl3n&byD`:sfqSBLj[6T ^U\UE휮jN ;h Z:;t*u6ġ98&\&kcyM/ ѝD>|ryw.9ӌ6!Ik`N7mBҵQ`b7EL5=|,x`IX(EurPI Y)5 lR?"udx@)+Pucg;>2g^vۉlRGm݂3z$FJA XöFE,fU;|m.bSRvxÕys=d4!5 Ț|r%o0#aV1uN,ESUV=t,l#MMd!R%P<fm lc6{ 2 ő{bdk܄ryhH荐 |_d=LX XYi?Z82n&vrQ*Ww;=+_w Z޶S<@έY93YwEePEOC)/+<- _ E+KOU;r*aD?^sctN(V YIhO]G/-ܩÂ04GĎ_TS>W^Yep v0ZюA~l61h0_aE[t $'R1FGjXt#DGv@*9^ecӯKA:c]j͂jx#79/ccŏy1DB@5؂q6kN8tIvs#n+H ? me/`WQi63]7ipiGS(AKR9SE^U'؂6\lH=- 4LgAw0xEC ءkk :|& /U#s CY/ɐX6zUVҝWRxƢyW^ٟҴ۞З:Ad<){gU|«l$S|t+R'ߩ.;X /oL!0PJp'B(ElpUfmZ\| 32ky9_ XQ5B^>qeFyPzh/ !sAK;ڨP;--! ݮ/S; H^(^~){fEx&PkxWTʺi/bgFhq躸^^B UH~dEC^(rPHg XRR ?`quW(' dV_x iNՒ/!pI]=u֘C֐+8)d.oIPbÇ_e|Ż[8OW #bOn{ (=oWN{LUJi<VgYWotaؚП;aKЅFB`()_9M55.9ıg@/}VE#GA; wiF Lռ9934eLSϡe5UHN,_ێB*bT˞OX]EZAXO(Cpa҈{MnJ+g}ZyYR_6s{LV%)xD @ O&ǍxH =cckt͂:$6fŨ#դu]gH%l^PGnP|2y#)7E*jؼŽ/o9ˋ^O%ܿn C(ܳhc} c<5iX՜)czAQ5V֧Y.Rf޴˙8rwEmd8O(؋`ժPZh ,WI53qӈ<]=xVpW.3Jڍs=s*IUe3Wr/`axvdu'!kY@o$ GBWÎr>{YOz5E CFO*J;r%,ܺ +I6ȩ+=L%Iz ,s{hYqpsp_ i[M ZnK"g2)|ɉ6kjiJ޷2*ąs!&*\(qΠr:HS[e:ɹ ᙇ#Z_/A)盻*0C'(+R)a}6UΫD{݌$707ܹCl7Յ彣ohLxr<J?2?Thqjoɹ;͐YYY.m=/uChL!;joLbPd(d[݄q=7-s/3ƫcdP=Bnl}ڒx¥GvA1Ko> iC0as )[C)+ԩ/h%lz5pXanĄoS_(IdF! Ha(@ >ZPO1x{{="\Jf8pغɺ j*s o&W]wX>Y_Hm驆xM@b3Y{;1 ,cUI~Aaߡնv)>* 5ζSouZTY%1׭GZյ#`UZN O'n5 U/# }\M!I}.Z#Ugw{%!27 y/P9C$̧ձ'gfeCu7)UgQ3bsǹI䞲+pg_r]D]7{@9O&$S^DR®8]*^P7vLSN4$cmwt#klHC+=15pk0`(ԟuw_t;P)O\'%\7 'd)^Vt1 ^ҵ=W9V Xi"7xa#״ `Yw06?U_e_!ؔ0RꕊQ]0'jg%'"FvKQ\dY+'lS?[8嶍ta9*.0\>!8yk3븱ܑ4 J}c{@5 .`{d&;U+z0?֩t$bڨe02]æLCCN jK$%m&4\\WKX6/ ;$Oqh]z.cIaհܮvofɚ {[=`^mt6z{n!3Xw1b+ic&Ȣ3BwoG8;NFs a >>RبMԠxsC5S5`w§%$z@nkS.`4 A|bH^Qh~x|X,XuY_y2QC3B{C7Ѭu>GDž$eT%p֌׮_K}gL9(,k4lЬ9}(,b=ycA@'i%j|O5X<=Ԣm y`ג$TC~!Zwy7ONeeN73.mD6RTE8Vnm\=jdODd~v/%o?%T5uNKNťo2$KZ-SE6lj#7McM q eE&0hP'܉S*괍v\Ixm!sq/1,~ dn5*jz˩B=ݛ3D1-̷Tb`{nVF`y% 㖏Er1'^ es>IKg6*+Ypm[ю۹=űk*p$pfDKrp* mWM1֥G 82!!tѵ" hL&)gQVDRch긭˜d \? t{x@m+wwaÐ-I;/M6 A+y2DC$ & EVj Kθ ycBbwКYiPnߢǸKXg(of!B>j}!kSPkrJV4޳&`s6plrVz 9w>ﯲ.K$R]Lj%/ti1D_NjnVS7p}W[\xF &DQ.eZfHb6(d%DYpobJRn̆r톼{cm&BmIg=]u%3?/ ztX[L!᛼B9l%̫1?ټ_$i;E3\17f8ԭxqa'"\q iK&,/Tr,+‶yr{4>i=8rf9?i"Mv;C#hNRkX""E2'@ ֽBAR CI  JWyV_4ەڒ8CmJ+) 0+}ٺOhr& [;[Űc+ZR}LXͮpP Vxsq10|Rn ;JH,]xY1ϡRY\y/>U+6uwi, '"кߧdpt{s $FHbTn d\lV7?ps:Cet~MIl7"shgΒO >ఄ-:8ZFh{@Q6=c9Q7.s}VDQtps~v7fqa^-BTDcx.æ/!4sǧŰ`TbߨVg\ ȝ)2U"Vtk қ5^hjcJ=34lH.GFh^gFPj 쓔h&DA S6LWl#43R4 HVyWVA rhHQ;0޹bIJctQB8;[R?U0ܢiIsFC]kK~7UHqŦ"@gNo߆{#=YVL"`DNJ[Pw;;k9iXؾWQWkX#31 .9dM{c *hË 5V:>l5Ś㿱 [De߃ T([c4"S0 ew=N++R"8|˩u18nIBW19@q 9Ƈ9(_cXܥNuᒘ V3u F cl3LɝG:, 8Ofl r o U*h 쭷${>O3z"PWuJ͕+SϊudRyTMU}h ?RB5 ^!{(A ۈI̱K e|c)OebFS[Bʵe_d{7]b,Bev>m3i1 o> fYQ(Vֹak}Uyd2b LxM,o$RmN1Mc(sWv`I!+&!K}}ݣ> "_q[23l17Oʮ'O0\NCƒIySuZ+[@ռ`/W, 36sAbZ嶻4dKAQj`JVPU;#څSq^,P ?FYS~Vw(: x}oDܑ;GĮ-rkFFKB:evVAl.f\iu/̆7?kPqA骃p"˶HW06D-(1 7'6SfAHd*+8:[=08W@ux/n8Q$6D >0Ġs/-sShY`U&S^JlG1P@ EUn"D8c ̚die=E2uJ-E}. %Г@PQ@֫2m X ΦB{uܹi7A-.3ܣ+ޚMsgK%SL"='&V ྆f5eZFjlE-e&M 黜ex:|[AcVI豧oa: ᾌDs)lLEPy(*H/X7N8ruGއw\, ;Xw(nd5:vƈq`/Fb%NQNޣAcUyxmv 89HqA5Wk=/nS0t6oܨ;Ƥ+pg 黛g"N/EΜ኿U>ݻM< t& @hY=77HWu;g7kCA-e"=ijBT[) &7G|w`8w#kRCqbv,^"<0M89y^࡚ uE[*Bxg^7anb`ɚVz@ B 6Ѳ*,+،[j~9BV(*9R>T:yuéPX)>Kׯ9W8ej ?-sH`ښc" ߼3qNک5̏#1aaQ'vgyIPV1nR/"Qe4Ơ|}%#PC٥3EC Zxm"27M6X.PU)Ɯ_h^o+1]]ahbfA34TNueg]axt 9-|KdP$H![yc pXxXcά! <*})߲c9IHSvdy(X\VR mzŅI`#BF_LpÍhslVBjU=U#2󉻷V$+OdZd0NI[- t#b_0SC*!}HstD?_}䙿J 8iNcA{iG aZQz% p3~0B֟Ԥס[5+Go> .U#${sDpc{nM-Ɇ+Ҹ'WTdaA~ԛtN{}ZII2Uɴq]9:A!AݠEEGܚ1;@ ȧJvgګEI#.I#N lv369a$..;>Mc6 yeYRb-FO*AMj?nAVid1`ш^rza%fFn4Ǹ훎=%Q}9ɺ0PsdU$+Яv'نA I4e~rt3O(~؉xsM`W ?2:U )'i!h{}ev 9LG) t S~H9_" 3oW./\)2> pONͮUS!nD2KƼԻ,"$i)O',=o0tfAqppdvC术d%։ 1g ?'=\TK$V-Їwd'#;Y/ oA΋{;+ Rdx^sa䭦%ܛZ7*ʳ6؏1׬.(֤֔h8\(ᾙ@E8P"%jU#e Ƴ%~JӉ;: d OyGTVw+f!%xxe vV!u洤" %z3WEMjȥ.Б#8٪? )9F{F EB7agd^iηB8ȄQ?i`{S #)ɵ ,=8)۴ u:lC0yps}uV|M 0AT:B̑4sة#/|}:(O&)"-Py?(?H"g"^q(Y1X 'E{pΌ]zⅰ>gI;=?0˳ z\[<\Tw rdq{xkW>q˥yH8 ~~\mNyrZ'0[A$H,ĄwQS4!aՍꤏ5$݅)'pȷ0It+5%_[_[l>t捒nC@WȌn]7IOt&ƴ\֩B(x(pz;jl83=Z*[v0/ ; pUmطGb4W%YJyPH0#N_.sDvM:ڕAC{b01M}:XK}4Ts1dBԷB$渻a3<{+W!Q |/+ʆIBa#CKokYyROs";QInB;4o;{Y u~I(]y>Ù \BlK574(^ 97;ҳy7pr VLZdemm*ӄYN+X牃-RImUXi2)-/x$I뒽Y6x$[ lz_~aiq;Y#-DO"#-gH ~ڄF-- 7sizrW8rJ*Ae]F6JfsI)d3X=@%3GipEyM P|͏_y[yNݲ͋E!3z0gGCT#x#%:£P O+]*1(.||>~|unYhEvHm4Xkw$'4P;]5.ˀxrnVWUG ]ӛ+yS#?jhb7ApL(m.ʾpuϲ:m0Z -ŕ@+C#1'U=F/K]7|ykvZMc+^*W(6.DMD OKro}˰a H*21Y$ I>.>^ˎlQC#'WhOeQ+4)|=6aI찅Odk2kUaP,f6O@Z$x޻#u⃟(_)ye 0pL= L.JG]oCbkBdy/eFof@(EXZllG;B-t32`Tgv::*NB{=tWݦcvSV ˜ Y 2⎣:g&9rw/Pkf}%;j`};Oœm=a:0Nζ@X=jmZ|$,d%5Va8r.+$p8s<^F7A=,Tm]Y} i1c J3&ete!frLÛ%LI;kC!P$Pcl2_o`#ȐAgnWtƈx3ڗ$Ђ̒jY3Ѓ_w ^*jI4;w<"=!yN53c2L "ɐ ̓`(8Yڦ pŅs S.ލLzf\Wd h].k>Áqb"L#ۘӹ\F}h'}vW~ksm5y ¤Li> &L` <ͥAgU6gk=_8e>oڗ\#I="A >QEwO'Ӝ DV mKB(&JaមN>܉ b规B[Qw}/^ZAב``m:+KVNE/ʶrTFF\oסf=)ߤxcoQz[I-u',Vf%Jc;Ғ/ ;2=" ߐ%fȠ5,A іlS!A6 "C*єybς\ kLNҷ&1YP_cmˌ0f#o J^imD"R}fFi 9c!7ZoYyΜ"3DU`d *d|8ҹԭy6p- 7qTFW-) ѓd y|izU9#;[2:Ϟʂn+h20҇>nr>}JGv8ʈk}";H@7f]nS٬ =V4A<]r-U,?ZeoPY\k;bg3O!{; U^V,LDbwjOԳixp= tֆB~628P%ܷv/bșLRk ;>Fhr%=iO@}Z738޹Tl;%U\N{sJ Y>gY hCvOL c.YDKYũЄ\*ӁF8$@LCQT%wu ~)E"m^nWUBAUy !d q[i, דآxчvܴ<5oBu1}\ZoR#qsPGY0_:\Y-&_2oXǾcPXӘBGDq t::%҈Vgb<3ț϶ͭXtlæ/r^\ڡ ?2SQ(,ϝ#Ǎ%CBƹ\_ 轓(rLj("lP ư^7'JkLholi2aON1SZ e+2>Nɤ}hC`Xiuh!. 9LTW3@sr}[+脔8ɺ)1h~'i}ɀUU8Py:dgwW{F#wC>j/zH`ҿ^~`+!5; }mHnM{[>_*ʎ&OH qX! `nnrt_x 0&i6ޙg*=Ǣ|4}eaRO]MGKHZª4u_|[9V:,Y-ߛz>9QKďN7 gԚ+ 8ēN2,=}mo58ρn]77kb!ű1Ź˸ "?vq_UTwn h#ϑKYA OBͬ*Vw"N>lDE./=ٳ%z\d\FL :yb|^<)AI -+\HAux>_Q]nPIRZ'[PU8O$?+I0uhĘ16" 5av9T&D] `ga *P\^%g{,d6y e2>})q#.lmiEdu ͥTU&^ nrqjWyajJ9,G$Ca* 0('򒏢r|Ax ޞe;ݯ5A0!h>ޠҺK/^k/Q%ʹJv VBSQF1Hc d_ϥjQ}pX S^KIX#m߀G,5sƕe튣D-l(r~SY}>vV:&~zǴpSbn o[Ry8qpx>i 7dBu#{yx.;hm#8buFw.]8zqõ*&-Sދ^2ze/U'}ք! e7KrH. wn(>5ۛ؏4uG7S^ 1.ΙmkG[|Zgf*sWXUM{BU:_hlju!Vo5 &C'_> j((!f,˟FN((֗C¬3f'f{;}&^#18X;"a/M['}hY~r gZ(spQTުsb,՟;֝bM%[T \*73ΥwQ8 |w!{SPF H11$IL 9Ȅ0eY_v:лDʄX?@8ffʋr Y @_>wɏW?WwmdTeW22H)Yʶu[_WH`PX> AHSpwb4pF bɀhԱb%s`11έ+mM@{Sn"?1r2pi7.Ȝ2d}O P`y)(m:C!\Oc}1^aOk}uHαz\2g%8cU 2.{_S/xPP[ 2/\}WĄf/Muš9Ps!ŕS\Vbb1MJC-Gdt? xdP};§WѠ4yNx.rq3JyDJ~shb5b\|< UYГ:DEO x_kfqXBN*`>W#Yre؀%ȍn%[ hҹv|5ay$j)|ǷwPFѺGap(1u?DMP[ (F Uɻ5w *.s+=K^^XĨQ+у7c6 -9c>4&kר5z:T]zD]mj{jAN/y;fG"iff~s sh}r%ItȐ3D)w:8H_l/93L NGy/$keXXQ#3נmiBKd:KMfɕI U|!!u8P:dϗs0N!hnqf:Uf]&$ս]IgѸc%yCykl/0UEGD ×>;r@3 Fe9/N9n)ѷ4׊Qi:dgy97}TRx{{9>ޫHudFRX<.\[/%+ Q(r^ނYd&a1==G$fRe4X߻uR}Z2jZm^z_M{e& ^sâY`* J\[G>8|;𣵍Mۨ G]8*Y+Dz )9=ՑG=AiU.mYsR5p\%P#X\x+9Vuo{s&,0c#3d=Rd+\pG^&Q@]iO[s©uK6:[^z:O!b)/?R6 rz#zO5*#i0r,h|Sb@={q%CU{Z Ǽ.* `af€ ǠsDX-g@-rv7PP7\h )9VbL 4?4wrB?%#K=yX{dÚHm1B)_*yxՔ"!¿;Qi20e79 xA1xSyufuރ*HA!؋&yX?R}A{3_lMBckTGMs/!>4nY-Yi_DUd3]'`GwcC-Thd)`OĕOtL 0Dƻ("{Xl p6W.uA}?߽C m䦪ެ ǽd(jvf5j7I6Ev h'@leeLő`bFplZli`N%TTYgW>ND>fHhdmZ#` W)ʠ񠻨ciٿG͑wH \?:y`CU)$ `x{jg} 9 }Srl/z\ 17ROՋ3YTćw}y4u'GUH8u~sR)bŏͧ)`MܘY7mN#y:A5l00h=Ga RX yхjD%i"K7SxTTyh/Hqki\6/huZ8Y%'7cI*=!3A4pG`ŀixwri y)x5NNҘSxUB7CɍME—؋|ٓ,(>rGm C+Zcꈁigbާ褞_L#R#-7yVDQe'h:K½<*)xSeJ8K@I&}R!юWqjfF%0um@&-;\k~ũ\y!V?V¶q:!PN_].4W&Ņf޶ĩ>ܢ% ʅ(ї´(K VX7қRwZab51 Юޖ>J=,GAΏ{n+{bFQEBA)zqEƪC ?=k+l KN=%aFCcx-@M>N>,teQufM(>O*N %~"J.}Y̩c"mΥ."Lo%"m+Su<eD k|ʥϩ\*gڻbn,7L1bF## 2 zg\KģFF"9KGy}ں2}?K leN~51Dnhk)uvq ]Y4IUmhJE4,"FkgoC 61h]KnI`Qx3VNA8tܯkwJR I{7[Rv+ryNy? ^kwhl9 iz:W1!>3KBIBNƺpYsb/J]u*cw3)."P d2g6%̟P8my DTV(KӃ4P+qGϡ'`u$y5jG)O7ZEV_[@f9^6l+&}UF|`ES @GJf?ە 駿RQ<`~pjs \3.XW%>"O40q]dۙt1GVóMwN S?9&Ӓ`];wyE(,w ZOc ͫؿD@dp/(RGk{u:@USa(a<:sWN+QB#k=I6VÇ`t\#/mvsE^<`%F~ˆ%0c8J]E:͟`kvʽy5hPlDZHoRMS=ѣ)9onwqfJJjhP~qRO TK&w\I`gh.P@*˳d)˰24Ļp=@xY 7/`,I6:5stFMnLıyaXI^Pw{TJ ~bq/YH<UPq$t Dl;?SC?  ٶL/#%"ͤAAF97Hm-n2gc>.\šA;th"6Q>\7w}( 8M0ۂIxuQQp9,˂vF8ܸVT;CKx6OR«TT@R$ECJgvO^rs w+۝8!g&ĐJp! þh~ |u`oW3ʐaڵ[ų+f@1%u:Ԓ[t@nUZ ȮG~PMm RɕގFNO76B]5.Y1OH)bh2E-cr{iu\ 5^)@7ُ(]" wZ>YD õH\7fn,`'%Hz Acw~bN"EZZs@?Q|_ Ym"HyiBš#L5GSYbZOZbUa*6r)}c\N[D|@k)?7~HF<*=bVIs_JV>kMnG֟#(4i A"(^4CHK}_ܚ8xiסk{SSE;e@^ ˙..kRߤkA9O.=%D~uE'(|KB`ѱBx! Ma_ 3ıxSRJ/l?}w;oͭ:凹i.)!)N/֡i/b<ԁdxڗ :o/sC2Fϩ. '?*dyPBؤNqWuP[s?vji@I?t$NRQjwC p/ewrX>"KojqJ|A/GJkܸĈgU<|N1?G8* ?iVUgMmQ,Wyaǘ5E;|j` A"pAV q{eُ rpڢDx_L/ hW\S_W[':~U<#l:1Zo4UpXQJFesʭ.SȜ_KE;)j5@O!nj?DyIoZKyF72b8 _E.W:bjIryD<,N{?mc#սBȎ5AeAq/l_*/|@NaJ#{ybP*k;.icӨ,<noޙJ #8# ՝GYqr'Rgo][g/HpċqVũ|F  ax<^Rlɘ'>_]qXK;!u{ `SXE^tb`z\{`IZ p #n'Դ)띶T?̀𨳰9 Ijl[)lȦOKc)$}§=,V{'i8u Kï *^Ӕ@*崙eOw0> ,DyUU#O:%q{#A*x.W"2Z5Z7Xs'SQ,ΠDHUMgJ@7F@eljc[ːlKњU˲;?Ky#SvÂy{9r^SrH?f\Og? ̤WwSjHs$nsS/eE9>PgòP;.64$vH54e1u?tYt0]aq?Q f8f A73 !"rSfH SkoXsjlځS'\o>JI#C&k!$7xD>|א2бme'k,Sk*:KJIh6`;G*[΃*xx1y T +@m4@tGq'CT  hu(19kg ^=M}~blT\;',HN˫4!ISECKm")"OJ` ~vJUTOˢ[5Tau@%s\2 )P9`G&|ftx _uGkNAmk͋Ճ9 h7V3L;:r"il!oGUr BA'6ItAw?)j]] kűaW.Flcoݓn94@[SW- P {{=-ۣvI"7ɸ$.S/]ٓget ;@3ٛPx88M!uS,_s;-C ^"Jm]e3xf>zCb}L[^=T 0K3J^uڋ[q2YpqD䄽5x}ОfW3X !Xoubȇv YImSCNO?(o+Ym<F2h| _'(2?1MO'0qd4[}jLk3eZKU74;Ēd[ eT_O8Ck'FHZ!= b=Gt3 Dnq{F]xNs̽ ql0 #Zv O.+ revʫq$>&Z1{Ns4Zb[$į=2/2!uZ$ .MSCw -.OP תT 8}Bw-FFx۩o{&U#8o5Fu!+ Ud܌ 4C`sх1Z2>; G4_ޔfbq@-uǣI/xXev"'+Q!Q[h4RY0 /&[!^eݮ>A/W*Qśipj2H OtvWDYYIzTy,ZCR9|bG״% Ϋgbr6*UF?w#pյ'\xsŰe#=lgD\G( ]+pTϳ3i3_}bu-7f wlc=f6ouɜDD#n^FJ(9f[2@nef?{Af%s^$d n:[(,++`j@CqfЎucsnn|[k3tkQċ+x>s5O"?uxU{a䛲S~sƩ5K!@Wl@Z)f^)%);QY5eu3i\SlȲt8ʼ.h@;HRLU+ ̂N+rעBlŸ VI,-Aص³&!q\gZT γrLt=Бjqq! KIEVhF"뗮(hyPT)h0͛˴()zv6S5'_B-eg^:kiH2~432aңѽmK@҄O u-8|f5Ֆ/Gd\<? y"X U6Me?Ed@B!/+SD,Q]YNfO+!(`Ͷs'ح;IZzT+5%>ycxq;>jQ ߕ'R2$BMn:C_ 17l~y>1KF;JRUQQZq$):wO7"X t8K0 * =8^2cXxI>]jC H Y +WSެ+Z]q>9z qk B7WIRUXMt3 ˂rܞ~m̱Y] n$`aiM$ŽU:_ =iwU n.or@tS9d⋽aB>sC]hw?F SIe}Xy5eYkѻi=P$ E;TQ, \S^MJ[wq\/܎p ]aVڅVf ְBM'}5D_;ܘofr EXrEDL^&?K#V50xDQw@AWҲ{2~ 8C#T[%!nWUHǶks3!QriX VI{76Ղ%U|-sRV5 m鍟$2*~gw{J =0*/ uKņ!.f9vӆ} g o0_l g'T?4~.FxP2J;R0B!fx$$j%;-V195+ct+o+\Hw]ӂH"Wh e޳m:ĂӲ Q\e[n6{׍bl9g{xq:Ljy"kB|Ui]BQ k916tbC)1i է5n xȠcm}<*{;."ti,DEF~fO'j;PdǂX)w&ihnN&MM!2qmF\:U8Ȏ**F_Zhj6qQ0tc\<|p+ŠOln$0 82Ե!ZةVr`JEX_៮д*}3Hiҏ,"@$X_`l9zubӫKrhKHX/Ih[Cny2*`τ>sNfC(T Ѱw(^)^`uޞkcqބʀ},ij 4JYЃ>ˉJM Yt+kBugF0懁4u0:?OZh K\&e݊i K:^ (b>(ȟI^j/Gk/"kXq2w@4GO}l7tZ&͂vSCnq,Yib Lb̶ֺŒ}5ˀ&shV<ClT@X-({?uW\-RuJG]Hނ9wbzxeBuoG?xg~hbt}/ y2LYYRa͝f<[Tu]ZJ/xaU hU,SԘ5۟`աEi4B_;VO3mA3$61fzT Ds)ޕcz$f[K#zߝ+y.@&%} >Χ\"c^X֓="^psgUJΉv':xp%':6b:q*rgg>`.[-6;VmuH';M*}lJdxlvwRX[Wmj9*촣Cil/ >-ki/V_m8.Clz/IO? ⮨]}N^/޿zτn;RLA6VNG[qewslrfrt9vM`zVEL{Rf> Td83;&ICSڊhE|2\~ ]p_Kn'&I@SC>t9~U5c4VRQj+N7&y lr<'!ok@N20i,` %l:B鍱1lrtѝ;.HgbZXkX;D4]V>3>J)k /'ﻡ4ҵc0ؼL%T'Zg*w2?*G t27@?r,AMRVDYs:S4j_@g;3 AoBsTa׵b䡎rʳ&E t>-ŐAв4&!}VxxO<Amk^ۿ sJLLaG%&'](&]2x(]&?ࣗ3<[<%_-1;?]vubMkȑ`qrFMYE `mSW)7w|PG-FK~^aV}`6`~t= Ӗ.:د7DHSv:R!.f ַ4VGq4ĢA# w@XvA8=H+X| }cfTZ$C+͵esNS':nOtW3ZDQ5!;Az.K4' R;)>w:kZm3d޵F+B6A0}耨E2d;, ŷ8~]w g1bajvSRe"O_cD߂9/~&G8=FbBܟf-玙HQXr,,MՏ0L!e062F8vh&b#!QiA"--480+5H [-aieEƜ%ʲH+jaxC3ZF"T r$L'Hyo1#$|LSXX Yfx?r#dmU2Z-!6[,6̤zt'*|ݸd#uKIIǝq!J֣ v3m\m)%V]fxDvfBb4I:^& E>rGc  4"!6+lwh|<9u{l5d ǎJJ"n$҅Z`>$lm<_= ){(>a59=(VP**UifBjmqئ{=8X6]A߲ m}:G,V Fϟ6 V62X7<،0a6AT՟g=] D&t!R  )&&RwYp=YCBrG}NR_ LM(M}b  K}rh[l5=zL`v(=I,jm&m1$_O6xaY'.LŜG3E~Ku\pO7E~4i9F*j,D] 03 }av86*_sK"Տ9jY[UU@ܹ:V8H~F@0\#-]KT}5GU|EǓc*Ђud z ;AW3w[ ~7c8Je^WߛIY#Ɖĺu#b'IH8<L&t`]rHH2<FTxPA\kj|eE@hZr9?N7+tC@⛭y_hfz{e|<b EC>V nnzΆH92f{LN|OI嶙Ն*ǤmVj3ttʍVh7ij!q d:d ~AzKp^%MjIő8XlR3,iқq~;j5cKn58ϧcuDZPKk4{hA .>RA N-e̪'OIzpЯv'%'(TB|H#a` 4w{o}-myd<@j'5edc`3i3 &!C0"cS~)@"{7@5o.62uLtK} ӒT]7KobAAmw*$hP8Hkjl8Ѧg'e+ZX3mw]k94)j3;525Ώ zwmU0\`E8_Ӹ i3s-I)Y;\=tdZi|3Eԟ@jX'v+`.mLKp0Kf*Y͇ :[UNajkJ\0V໬-WclmǑ|Ӟ PHNnsAK"F)r}teLk@cgҋ/Ba wurPal$9\9~zk:ĠdlCRAY(L3(bjVx1gڒgoR&@!*r w?Q\%!VTvJM [ ԏU3guL +\W(|Eͱc&#*MܫԾd̠ۢ5wX` R~QlU _=X?d+\A@;-.;,gs7L7y< @#H#TenU(c,QC<t~0' R8is)P83_I1|@_H>2]Sj7jEϓ^l$VzLBt $pwaH9QDZ= m1DmF<KwK)&x3>~D!v}`~rsiozT?nLPj 5\b?27.^. j\4ou๟N@P1+=2ftg0G9x8p*kEpNr l䀧$~kF@Pd}g3g)wl^]Ыδ1l a'SmGG|L“WdzpY4K#̨OY10|XESf.>io?a+XZd}^k"OVy(rKHvJ ~6Il=tB<8~{n0gÓ2x " :ZSo#yJ?(D)aWʦcۊ?:A 79.8xOiGu퍅OTwET,y\}҅3 w_`;Zssl<8 q'"g5&3G[-MrFЍc6;-F a2L4 s; E0}eWVQO, ، LBs:9bǹVΜ#YbH)gZﱀ;(X ]9[)=?smhi a x,D5x/\*7>h "}ws^_C3(Xs;?(CDJEb<84$9at 54pdGLљ\2LS/WuG3۩ON&zh/]lY83 낐AJo;{;ΤHeYQ@1T¡ݶc\J$Ӯ\> s֯5,IuXGP?O7d 3(u_weE"fK*ӭZ^Wl9^WN4E ~տ %Y1 'A䛣Հ|uyRcx11C8њۯ3'Eti,j)ZZ`07sWT OE"2ng6#J^xoR^T=Htf`DmiKIR/Ż{'M. )D*tj#  '->*hs)CS9?>-` ^P8Vk';͌t6~JR-8pI*QZ"ʟ XQ6I54O=Ȁ_YZ;R<o륱^{h^⫑& M\@doʃxHI"7E| fix@ (D$Ǜf,kҍ (*AMSR?a=z}bsUb} 4 iJQ,V@UH=H:?%:pGXrMT~d=dq$WޜhO+%M+f̖.#[?.{i?@NR,Y[`2#p2>p!k<ܫͷy "|Qe^04dL!M-3y],QsNB !ca64j^}Qy Ԭ]5:pFq"t%?ЭRK\#`ƉzJk=pPo_9:? Ԧ.i x L}i#Tk5WL- 4MռN[ћAE9G È;Tm:PSvڋhIj_#%Y'<ƉsB/wsq5<&\;\ n#\GKa-"l4A%Snc|,08Hm|R6#\~VʊAW>9,FtG)u4atKEhޱw [2Th0n$Қ1{=hW>kǁya ƐC j'R/ S|묾/9QxƍF %>QR(Nu>UcMlyt.r۷/:WղѳusTXE_; ۔PE.!锖.fȿZq6=F ᄾV\h9rfiN-4-1`LMg8Od'=o빣`O^fyi^}y g6)Je vGG>k- ~̮ޯ'!M/.4Wj8jR˰\_!f$I/XKkӨY,+5}ZfN;qϰeڒ9ÉrJLk&ev閍@O8O=dQ(ILGbWYI{vخ3_mT˜IX 12U qR߭ZL)p&=0wbdy@>ɇm$Py9MiEA%KR(Yw/Ws6Nod΅PٗԀ"W\@[A|l(֡@Q:2|Ikb4ۻON89 _yU8^Ji>׫vm(eypa+ #\^샿qS>bg)!v eGTH+.)-\F,f{ baԝ+qXgGe\WRBc̴#9)>ʿGvV<ƿ..!q+P}YT^IƝ?Pk ~RG.o94a &՟$LRPSAcy>0;`s1%qKG\%ˍ>G!_SQzRnV[9 Xi:_b.) ^K|@@2[#XIqldz̡O?3gDwbQ IRh%ppH./QA0imUbPdMg1OpDC GyD[ J:K&?h@ S[.F i/ij@RCh-FĂAχTwaEJИ߆Qj~~OvP QkR!xB/d -5OB2bv,JkA}h- v&:pE*bɂV{l|̼)ʼM;cUVh@q?q3c~Z焮JDZj*Br|CQ!lGmvHt q0IL:Umc59P{Frnko!O1ы紊)h(Kd Ds0JХeTfv A-1>ӷ9ALfL9ft`HȠ% 3;ec6E>O?voeO"n.h/QÃS.s)$U2zy̯84# &Nja8׷w*(Q'm჆*q60걕G~B"ut<f~?&Q|p:J\h&W0r S V7Z; sr.׎0xbz/$4?#h>hJa H5m)]9 tZ3A|1|;X |WM"Bl]䷍3ns  CK{.޷`j\WjT;F  )(68hah(jSF7(]഼.Y-tx5Ky^ fbZY! JYQ}d6 'eovTfww~Z \-qK F Nȗ3f::1U+ [v ?VQ,')#Vk(Ȅ9 hbeWᨔVk"=L'+=[saą>rr~)f/뤼GIE#@۫@uE}#SfX۶gHaU,%㈘i \3A_ƾITa̿ *$]:lQ:pNl5K{odi!p.w!؟Y;:iwMnlKN>JuK/*Oøbtb ]ODQl} "*wɗIr.xq 3TiBFQ*UDb&4朸x;qHI6 J<݁3BACVu#ӖHq{P=qxV1S rH&_msr" Ѐ!t(r~ED }Fuj5<[ALC^:HCX*@1(ֲHtm:Dj%O9;ZS eKD!TD 4cowt $_AIM z:/鮌I!GjCTv" kHQ*V.@ *1jΝuڏiQ`V+ِѮ<zF;~,z+mmN{ՒG+I7XCt֮" 6^D~䌗DR4fm{@q@.K@Yxh}/J61A;t$d1,w_/lxX2(~YJ0()},5iJGRU WD#m`fpy*"sUu &WÏ Ց+0ۍ½%mfVљ:ιu->oS9u; 0D\1j?a*x'85[J&3r"X7!QbsJc ?ށY`/ R~FkPJpvW2&JpEk{Q}!3E#n[nW@&jeժ!?*/];;ehq\ԁ^Vqvʀ/ #Q]F=T7Prj,/0=br ?0.y&Pn-Ktm)_LPDݚX n>_\ˡwT/ZE*&CyT_WEmx@[fdR@]Ukf =?X{p@#+pՅ^ lfX\G\8SOa*f(R~ q 󭮒&/MiFuˌ}avHҜ Ck Oo`zIČNp=3-I'Ǡ"*y@uS;֑EGNoCŽOpB[<6z潙;9.>9ZPsHKUET< @{3z}?3Bӯraވa/ B07lqG+Hkq~+b4usr:#*(40\ @?EǏ2%]FY+Z'j`\ԗ9Fa%g!P|t?U9?'> ݍLe^jYz&Uout=E F!ڏreѳi[f ;܂*ʻ4c/[oAX_'*u3sYL^h+l>,1@w\ $% >!;={y/dܱ &Tdܖrc%e\ʤ5:@#LUI'^#˾1@l0-l<*=Q͢ '8.1Qn| M?4AscTUwE> nȰ:25i(ン44`0DHSIBhӿ˒N*dMy@jrsp\ Z0)8u>:Q%i<l.$ ma Ƒ,7A$Qb~wb/. 0i>C]k Mؔe"8zsu1ݤ#JS5GڪяؙdO7'/a,\wP`bMƎ',6_SE%=381Ǿ^G/J6)kˌgvv:I%D$DŽ4ܥ̂L}UYsXL`v*o/)m :QFH̞3]%:O'X9ߚ@@i6`>fFzZ505k}D1E%D+a|]-g$ΌtxOb l'F _Ί Ql6ߔE6V44tV-C\z\0GO{\BƚWػDUЫ5[QJ rz=1^ 0=wO-ϙ>oSBKR0y䈙:t ƪ{r4ɢeٽYXYw{2m*yQhya!> Z6Y_ݞ>)_s_t5O󺶙<)fN5y;3N8vP˴G)3%*44S a`7vl~%~pEkGs4: }05йSʚDcR@ `z8CԠLWiW)G|^81CKY/|6G=vܾxj%̿{ S6K^9y! 3Ӹׂկ(7/imwc6X6Mmq^CZ(ܯ}y鳤{i2$f!!)!ZqR#72k~.J"$]ErWNB(:sl rqr1)3E̢ ʅ5 UlW#u G|ZTZiw#qoz!g)Y~hnv٥u,GLfϏ)P㭍1Rn`yj~3Y,s!V(e!7_eLRvS%L$r6YCT #x[8 0}#W5ˎf7_$6uL^*R]/%֕8urgsXd׀c[=[f9 vFkr(l=0*,*%]ļ@c'޴ z 8Nϻ >ŷIvqẄWjbQcW|zOQG4YG-|4߽HMNt,4˭s()mڙ6ʲVXύE| ~Xp9EKdN~YJ@3ٮ;JB&Cjlc ]D ƪe#<ƹ1afSPjh- W ٗq 1\\Kd>,ZKB-v%+ (َNȷj&nJe 0uSl㍓/+'Wd6Wtwi̶ig1 +4p^S'Hphu@;}j`q ^^3Յ|1WoR䤋6b kYJlx81iLsӖ}%Jf`8)Fři d+`ƱPD&qT~N{Jjީ/ $xcs2^m+ V5ŹZH=\sxm=!`7I |'连L߫jw)[3wQ iTޢHO* 'Qt녭!4?#8+<3Oc?m%,6)RxdId4M}wPVnTľ 1 $9aO%3bgydQ99aݗN}f2L(線'[gH/ɕR bq`x7GaaU_*r@!VM餌;޹5muɟ37+7P@ñy܋ W*pIvۮ:f}?mAW:U1ei}eb-/rG:i8 1E`lh P,h?@n0 w.k(` d5%-/۶Gٝz 1y_*-J=%º#o4ZtQ7 G"J/gL=W48iR7:NSW7uqN]䌭 tʪX7ƓFIbh[ .%g獮]CL8b'  28m-rǔ_w} ٣Chc(.lA2؎{}tÍɤSN5H(d=GslECi<כy{'T"nҟ N24ED8zz>"dl/&ςFc]?=Z,VmD ·]@Q㤃,jH^@˺ىUªEr0L|˶&'VnXC7&,{"]z$r ul?I)92T N~>2@uV,%P|~K=zS x- qk:R"pHXfJ~v;^l_&D 2 ٝ uQJvZ;vK~}aTmͳ!f6 8`+nyތN+LP`7.9IENH4(lA1/B:]w̦ԡKiEW)(0%??D} xVZ\ey:\wl{Y4m4Ȱ;f|\ycaF~"߳ 7w-KK Sih\ 'gek )?9r2L(-̠!+9'Q\-&Pg}*?_23}bFkrf>1J ߦsp3fFMUav,; /I@ wa?mRjw6=Q,%)K%1Hgd@c]EOӟ!֞x׿b`g.)nҟcY@-pF2N_ڵ?;Mu_OBt b$5У;_lU&uřv]FfLK^%BՃ!5P$ӚJ4CdԩйmpºUR#Ogn~з1V  ;|m,` i) KTE> B)@Ok* d)x>!e8@| bv+˿f$ dŜ<)˓sx glx+)}˦UV{Ū%"> 9 0u,M2$4mx [ ]0NU[PSv T߾L<™AԘ}%0F/}~)F*~ !},. H|O{zMͶHo_5tWHɣ1ߒnS"ȳ/}ߘH%5\`=6rqt`ڀ'Hͫ` amʰV\-'4{TV sqd $@62aoyl+% <ɷ[CzkmI"0VR^:!"5{(v"؝H@ _TX>k'!V7zw+-RQGpl칽,,s@vWR3Bjyǀ͔I`>LJ )bpf>ܐ>m0lsͺ"z}ϮNl/t`( #G1 w.k>ў" /j]ɗfW+8Ob lQƗ\# kky@維Pnq74B{Āoqzb #Tvyۺұ]VV=ba8aFpB,U.~r)QA}vHvθ G$\9x~>Ai `-`Ma@Akx\fA ;" ƺ&p_1L0pFv}V,1VWc3-SLY`LƆXr ٺѺutjJ"/;pZˉ+}fi}"v}G6YW2t $t/~y^Wo5(4,Aƿ݋gƫ[\ ~?Ϻ^OPS?ӘpvոZ+ŮX%̘o~d s`KL[- =KOdL?-];R:(BP ~Nd@.@7@'rMTM!"f&q,7yj8xnD#Y;Y;h]X[m餑gI>FP!J2(\O]Bݴ^[,go;$K+~p9Z>T(. Pmdq&%MugjD]O1baj5"$9kᏱ~S9+j7j;daʟybGCDʘ]]ߗD%-\XĦ@Wg#Y h) '56=y=V'?O6utփk҂yfj_N Mn,x˃ߤqwpXJ\Ug#--p A))P#9D81$݀PJuiEzcZhX0v{. "9ԝ.?,A,4{5XE!Pxu}HүO*2[Ι_|T&W*j iDrh-rK>uJ/IX)qp#O7S@0DKk^8tn km$@ ]#H&29{{DQ^]nP4C@Ƥb]D}HQ=~WcOO'pX#S"\ ,^dxkBȺrDd*@9ozW\MmMXMV z`Z۷&v2Us* ޯ#dd7'¢1Wàb̲N" Z+=m6/cWDI&#nuLUW#v4es&:! ÝވpZ]J=wdC3BE f8dG0څ_|EWbH z>\U9௒ξt; :GT,NއrsAižQǑu?x 0>H9*'vq+rf`zs mbN* 8>gnU U<Ǣb^-pQ=ݖxŎ<K3O7&y m_T2! S}N__rC Qqo悐%4 *171FZޛ;)(.TaS<9|ce"# i;C_s0<>/ĉ+F[G.FmH~!j ]uFɯ/n$BɣE%>;=y-csߕN_F!HWwP(-Re^FCwFղ6o$:UX2߂˅R8MoD }S3 fI(';"oXm6/IUqHHqKw#ZWlqxR *uP zKdAoGV4]W78I+D);5b 1*B׬Nj:p>v> i<|+mώQ@nj TnE{a2l08xĭ``mIr 4tqUFuiD3սM /*5G#*czR+>mD?cC`oV%g±;FiL7VND M_O6Q; z[( CƘ="*>ZU9G 4t<@S9#8/f]e:f^r7 J-C$!C nk{/_tZJ#ه !xa~tX#bQL[ 1c|(6@gDsE'3WĂ`(lb|Jiif.Dqa>pek@iyMe*7;暺ƹjs=[pX,Cj  7h0h˾Jͩxj[M15TÔY=wx88WǤRy$vBKl\7akar.񺼫 eqnKU )۠#樦?Bln K fyouo>#45UIW3Bhސ bhJm^ݡnNJ1kf/ uxZBY[ #P/jC9Jc+A{^hp'RU t{bLJӦ`kLH{ W X 2RZ _!K‹WFn'';?ąiC8;.\OmnΤvܶ oK/FiB]t"gQ Q|AJB)愑;5:LqWB3~gʙ:It6׃],(Z,ր ź:+ ,N84bJOK]^P5؟ kPSrX=Qr.B^Tw}֝GV~P-bqM"Xz|ZFv 7R~1NR7(]n62h$@ƛIM )HP"b02!H2 ;t2DTB-$ d-b r*<68:ʾZ`ʤ=(w25޹Q,yoذ(곆o?z`ޗ%PjLUE.B]jXwð)"um`AZ_Yg%0}=yVSwWQA H)¨Co{9{<9SڠඕXmOcsNmΘHd>a7k rE)JdTSs*;з{GmځF9MJ t\ xPGNR\mk)]uhhLB!]g@ a Dc{>34V&?.OCZAj~n.hŔhmS["?ՙ J=iEv3egddW+ҏ{!|0Jf-:%b}w^# kAR}{f$Ғ(DeX*Uw5T#j?Lˏ劒)B7ME"}q]ЍΛ)z˂CV{ RS0x)-fv9?Ձ֏d30Y}N{ vZyB= 37S2`6rJॖ)KRNLV-{ᰵpz /z)]V P*jg^_:Z|C%JcF'm2]gP2$'+@Vh9', -3 F/j\*6k61[G']zS5ܟ4X8|*K LM@ŪAm_`_ j.8R|Ae+ !)"QZo_$KOdڠXd[jnձBw&e8?3-RY 5UQv;}6/ZL(  E:Vt`CPqx3|˖ݐ=kq/LEN1]MW ѦjȜ Fqw̕SCsif=$aY ,:Eݛ6}]mhPĵ!Xp!HT=# !׹M gTʷE0XvP\B.^_ *tnm n[SH )դY \tiЎ~_cv.㚪,3}B s%V)B*6,1WXSݙTN5G΂ݣEBVr׿@c}>M"XEG.=sS;NP|,ZL<%B?LEA%*TY 6hpQVAL<Zuֵvd"`v2R ͦ)JD䚈J9umVrתt1E%bj$VdO7cCVZ;'ثyQ-N[/!? *3X6VI+ɥb^mQ__UN~; C3!`31?Lszi_Q:ώ k@ڃx¨#Lt{򇉟xz+8"'ΐQe.yl!\nj y#mT,a?*ĻOeh ξcz\p&EeK:Y$ [ NYj=q(7|0Ըw)ʗ _*Z6FU΁> N& 1}7ZN T7DyDj,68nTR>l}="5M *C57.wC>dJ$ 8-H} LK4cʭT J8'$w޺er~`5k⏿CXKS7yfKRA9ߢB0PЋdj+j,$o@a\2{ːwS>&9{c@h xe7hB}ޤ^xf3bĂmܸcmSvE?bAf~]g: 6wɺ{p7up$$DT6l˴Բ5U/\Q~e6cBc`aޥid=E}ك&$/+N,>ե:Kvy̲F84WX4R uoyW ̻"VXW0N4)7s4N rV k(Roj`:1M0;Rǭ\4`QX7s/CZinͩuakSЦte"6caJ=:y8ⱫkH/F$G!^t92 Yd70[n~dM: n9?Ox3^n ^!][pM4ˈ;PNjR*΍q0~㜭S.\aG>iM7 1Ryqq.2ᑜ)M6I$>Y{lEz 9:jq"B\CYM }RR3\ryB !E[="d[|`dTӴӁ*"=jִ)6ny]myqLo[2r?,8S[/ VPP4yd"6ywmP.O[1*[F[b\rHn4d3,޷eH TBvt.R TXq5}z Znp$/K`\6*(Knytmԗ_Ò t'֪ܲ]G}O)αff,qziAי 0TtThJ+0bL,*EN0PB>}VdWGMZoR0_=7 ="z?q,@؈ H+D}.yHxnY>WQx˕ ↸@^ ؗ2M qQoÍNfEmP0nwq"^]ʥv٢'ŔK}vRsCZ-*cdCR׮){C `O@SqpMt<vN^$fm+0e CZŴѿOaDM &V%=^_ =z .^bQ̅L>aGxquǸ{Ԡ|6j>b!h[_ݎP s5R03 [f'ƛ@lh)S+<譞ښFa pe8 GV@gsOE6dO.V(!=@V8s-tFUѠ3&XiIi2MإƟ DOWcnRI%֑9F-!*ldp"#$RsiKDd!5F qՇJ.]CHl;2 ŭIsF01}! 6@^6W._=(Õ4@6y^5&bd k:+ԩ7+*a NBc8 4lF'JSq']LMIEЉ{-u;2^M\V9;U="}PѫnJ,5oX62 -$f @}m)ѥ )kLY,, T"ttbPb;GBAKuګ6iDWx>5гCb aIA*-K0@ ף'+ q}rk/aGD3갼;Șj ^܊/t,):֣ AqNM +gJTR[?u[vuOh=zA MD4:+DIȻTeefb\`壎$eԁ>ߠR ]I[Dq\)7H5+P-%ޜ dQhOk%[Rak%Yq{d9toV#xJv=ôǃ+ e4̎&?dM{ާYWJKCaPi4fj>'<Tj ,eu)u`d<҅c- Mooz2PBs4:_Jti&~-95Ƙi3XzcױC-jJ-X5B@^p&,A7ՍZTI5@R5NIB1> ; c陨QG!&0A3vUXҥ/[-l>FNU7cKt*PW_>)Bq`&Gڭ"ږgt;s Pwh 0Z Y-Z f 4t$^I%d>lkh-oR8JOhX}A%!oh>" *y8rC b![a9o pvݑ4h,J$h{`:שYVM1Hq t|Z)QQ r_6&踤:niAS|'Y9^cd1 Z}fóqu@fj פ0JÁ;2XM ԥIff/tL:NGҀe`\ͰZH'2zeУSH$@cq\=1U4@JdID/:{Ks&&y1I˝`{xUXb6Ŧ bZrޛX4BQw"b=/rXeGN$29ӗ[ M!sӄ1rD%~>"ݳHF cPO!f(a Ź4.dգ[3^\턠8^Ҳ[ }?r!.w1f&}( 1ú$l+ ]Ho] &ذb0 !:g݆?{e'`9 `4S̿''  840ъ0(#^G6!K=7JH?Iu>= 4p;.PuևLK__o'cX^Vtd$]T#oԄLGKn.t&Xn-.q *]J-DwU[vc~ q@{1Ƀ6fmM–E}# RK,^svPn<[x܉nb|N u9"=yEz >lK~rw- ˋɃresmV&S5UzU6zaC2I?3BbqgJZ{i;O1%=BW>RU[k߯tK-0GCCƱ {ytmm^3iv [\j.M1utZ+d5 =Dk޸Y>e"%*ZDnw1Q*t႘`9;N~գ Ug;T/1ݙK${m )#3u+^0EHRuEj㩸%:*2 54dqV}1-` 7 +60ۅ Ң$Xz.;fB D7+rA=@6><<}ÜT h1 }#]lLy$Dݤ1\ٻ8RSi;)ıi/ HPƐWn \"N0zl{_GSf6ZL|b=|M=,N.oQ~b]t;SS"{;qpVQPGa]&#l6U\hb(z Gf)\c5Q&-r?Ev1 Lg`PU]iDDFSm9[dbzlx4김E:*ݮS6AISMGQ0"A2%ayՆ*$s~jl$ .KNf;v2/}#}e!igQ C7ENH9t V(|Pܵlj ~b&NtK 0GKD mXp/Ʋ;fY XN6,zKOgҚOŚ`T h"1+BEx~ta`9GpR'-xD.Q% % gc`G3ꠕHji<"\,dY&X+|~ZnjG/Ivz;ͻ5?L L~^h3 3vOWYy֠ S?tLs6{6g\;0Sۑ6 ocim} L)B' ψ f2+S!3ͼL>4jݸ*JRLqˈ5:|* nMEwc!̧dFz^1ԃխ7B򬵯sjQLKo!Rͮ73AYFηۢk4Y7J1BK/sV+!޷OK0*5rQlʼW{4$/lT+J~$왪0D<%Š+^Sf MŢ@UںXܜD|Z̯:` nwٻ @~q{}1PQQUOɿa )49Au`XMM…#ZkׂW`DVUHj]jSTD?Zf zf4^ "'HoPB20.3&2LF!%IxpѢmygdviuSDCy|Mh c}M-fS›AZϬE$ >hT%@4t7Oj"}i%Q,⋹UG_r/#d8ȵzJV/F@H|V)c/Ŭ:nvqN&׾g;KKv>rOv2F2q¼,dN, 4ЦU9%4B:C~E\IUI }m}ͺŚ:!1}<]?v]Nxv*xs? IRiT%,&;P 6cz]Vr?X^KYrv! Քoi'2]6;!Jsuٯmؙ1tMk.Ӱ .[7`h&9"=xS8ahKڛNIfhɏ.~M>MN ]y(7FN8:DTe\ bƖey;@oPǍvcN`qR%m#<ӷaZ*j?a<[?#=q2=a^ [Y 0RO&1Ӏ{z6rr_FDBӻWdY9*ax\ƻy/~e's%%HJZ(iqUҭ:TK WQSpPVI2H'dwbhѪ(=Z2}DedI''BZ߯K8_ `~ϷT<U]  F!lX{VUG2N:>~wBvIUK^k o?S: 퓅}yOCg&;?L=p(%)8Iw,wIN1Wo 8"X,7k!3Bڣ5iLFz_4l>]W~DWű90F_1I]}[ܤ%Ŷ6^A8iMofDfbs-|YcN z2;)MڞT]86^,V"=ufEZ#)F_J+.XlGc8 )! Ǭ L>Ox Q_:0^hd`A6yy2(u|TH}&Qǔ*.zg!u}&NY'?.XB bi3Yp.U@h+58қQ3gvvv\n6X0Vl2Y]oʱN8XfL\ہMk^ՉBc9Շ|xgĮ#T,Cuۂwhk3OCOvfF欫&!45vۻ'ǃ*Y2Y\oԣn׊dy=<9;M{ulqGIͷ$-TViéLn~YFCh`e\S6H1GGQ@D’KFKȍ`b}w6kpfqti[$DwrwFXA #bi{jDRYVo^Ҕ3IL'm'Vő`EL qE>Rd,ei4~A@ܡ"_~&( v>t@)/sL] GTx©[@;tECґthd/?~@ =qrfe]hqU טٗXXҦQt l9}/d Jپ؝,WgwKʐz՜ ȑ kpOiss&vd:Q|$ɉ?1 Kz ?(U<Nl:daġ y! (5Vw7+cص_iʜQxpc @εI/o$No[ D3ɪ}k62yEt1/F hN fKJ݁ hH;zőɜڂK|(_jB0 l(FnCEdhs?T,dla# !Kвkɧ彘I1jFu\H⑌#=I6l|mgۑ[ gak ;QR T \3DK;҇TWM$0-zXp*1_ CGƈ;wY^  _M0QIPX*/p?_QMeȰgTB^-\]OD]U9%jumwXQe65W=m?_Q Dc/ȾwJJ fiw!Y}.T`6.^faHAH+Ywo|d#r]me4}P fGyg8Mq95 C++nVk,Z%"_I ̿#^KoV9є M|-k-+ {S;ysr+uA yB'=_rprbp _TnJjrJFJWWD?]!.?.xs f)$?I^e@ő"G` quA:J~{49rX+\xȧ/BV7ڡY }LC2K=nȼgG2.ٻ;T[#e'\ fCLRx|30KkNBt7/F'P3#i\nԹO?߶TSrZW2*MM%VyLDف2z i(Ckpy$KљU'Y尣SRF8sm8 oLT4Rqc~,I4Q~ =됟w%`kMUZԁ[Xy{ fo" ?c/>62z ]bg^T<#m/R/, S;}8ֱ@ʫ-2bЄ Z1vo7Ԅ/V&P ): W@/w%2., Cx)<A?`n [B^j!׵ŀXHeA g? Zǎq+¸cbfy^Piw,K]) <, R.u}D2`bP556eߌ;0rFEyHRې՗KCƩ_?467ƷAWsbA8 P"raPz?wNVcޘ٭Ǖ b}ɐźVRK8ȯlQ֋QRi=`@=*x + s}H׷@2R\|^O 𻎧_!=@v 1$)uYi89_c[aeJI{?v9Xf8=^F[JmX%c V3*9XSҐFj94BJr,zn jvp=PC(v\'(k?"UQK( 3lI˄+1Cޥ{/X/xةѤO%!j-yz( 5NQG IH N{`8^&Sr@?ҙ곐8dQUyujPD(̿5wʏr\`Nʂ,S?1t#0;b)S%2O4!&f=A--0jǷ-KṾ_fW&귓ax3bUrϫFҁ0YP&k=moވzk9Ų@^F~+}Woƒhέ2\oѨȷvotc%wMD[+"]]/1'G(,pNغ~:Sm^{q[Z0˒Cyv;.F=+CѰ g-5=tisڀS<3M&?5$ +J Ŧ{+uD>?cfKpss+zs.q723j#b*fh4Ɗs`^EM]F(+"SVk51mvJ5OV%ߞL ƍcUue+&{^ <ٔ@č\aKRL"73)p-Ԛpk\'t? )<6i}MER` j@# qLO[9< #E䄯l .hgu;a 5./z0~(+/3d5IT K [#R^Ӂ{,_"db#1E~,4ci5O|W) ;]e --\?V# Җ>2=f`;id yFSF7ZMcl_9PFT}-%JWH߉;z&@rp x!IfMf~ e&t tbٚ G[x*e@Lm?rLJQ2t|( <}+U!_A‚gB[7 Wa1"ڑv de!NT,NeĨ>#nt3)zQkCA.e1na|sZ]Q_dN;]Q9yƠ7/AC*u҃Xs0 c -x.PiY9Ddxb}w޻ 4b9ezVlK'Fb,榄?Ը#)s`1D 05RоUAG=ēp'9YC0|.W"_ pE4uA{* Jb|! ͘dO;zqS3)GA/O\Onc$Fz:TC*Esu KjbeWU4h;V͛LU疣W?𠢋pHpTO &@L f +\:Hk6.k"q?Fl}7{D@w[&sX&v{LwT a)0u8pɱ\"-kix(|,f˂hY UDn'y~ø}l7|Øv`LE*DMs /5߰BbyT˱8fkdYqw[Aeٿo%?E :H󑻱X Qc цX!DD N5yX^QgPע#9%MOo{🰩.{O?mAv#'q$\ Ҟ_-*C౾yYTv@p ƴ2cRj%bI9Y2ӯD'Q{$F}B_s}]aS`M4Jñ:!UO~!LLL81a". ܲB+M;FqF1#n|R}Oxbqyw YѮiҲ/CucU2߇)7ITp/(U8YYY76[.rC?rEU|븡kԧBkUT83 }*= ŠI';ԝg|2o\δv": ,B Іr"O% w%67!0r :VP'T<gۈ|{Kg~#O/b$vfF~fAna fC B]g'Mږ2O:¢J L6~ُbCj owB'P8`؎xAgDEb-H^Pe46Q5⬹y/A&?SIw]Œ#?%6_ !b"~%2>s_Ǻ1aϢ Dy51}=F3{^KŹ_EM#"0jx b'sp@؞VMk2~R۾B'=yb?C[ד YئpD&HESQLۉ?EnsdgM\C6M4 QRt0Cn;6 h0 Rx]n"xKQ  jYP>>JyO I 8: $VӧXW\h(I<]IHB ߸5±1n&EF6A#DH$8fr_ZFoH6 d$),gJ {<7k)mq%vR޲yz Af( ߪ%H59j׿JL-2@ uD]%Tc⦓#hQx׈徙۹F8SOlrW" ">b;mOTPs({*||6;,0Ȱ3z SOp^ceٴ(ny]Og`K]. xZ>pހX3:2:ScwއlA”f|C w!aiÛ~dP^gEUf״$@Dуٍ镛 1=?B :n eO;Ygvb 3>B5&&kPdܼz]#?HhQj~9 gd+:w>ؕHX@.:9A@d0O[(Uhwk(_;PZO;Ij1+%oU䭌&WZ@Kd!KhBy o)h=uOoLۣM;E"zftPI~$Fu(,Ux•5Hn̊Sav64\VS$IerӖ:+w N{) d0|+ob%(?SYs[7?io\G%Tv>ڃ]S qZ4FM\#ڦ߲3GQH["YY#cKef yWȁ쌹n )m}@pB vC<0"NeЋםeR0jiXOn6rG_(X6YtktZc鬨%b.6_i,o+ Lٽ75t1iP2@,4]I]fu M$!H/8AC\qۡ@ݸ_9,9fRXtn=tكϕLAo˰ntp9/#*4- _vB'=~FPvP%?uCPN{ ^.Zü(zִ*kΰhhZ$3xIM g)APJ+9@r>P䂂t&x X# S'd}1t- ^rjzn_ %'f:qʶkS9Ý@V]]ljEkWEy" PxelRhjPtZQ1A:H<n"7{EipCJIUBDm9}kS[(I`)S{S85o<`7SE|uYw`Q薸WKuZr<{1I|7^pvCc4TщKrlb`_Ji烙l`qd}.&FB*w"Ur˂ba)M{=a=uKlnaV G{:kq|ϿwwuNdVz2-swb3*sLgnZ c4wr{{b;IJ#Dݬ}B'+GJ:¥$Q/dSG?yB]5_|¼PG~pU[JG?tk k\4H/t< 7՛E2L| :\F[4ۀMxb8fuV\߭ypH1\dX7bD%G=gXt<0@9;k meNlvq| Qf@ {G=0Q~pIUqr=,2uZrT8Ӕ8(qJ1DRTo=ҘMbLU+NV?V<`bU:Ҫv|G2d~Ed 旍MG(c;P'ЛaDZҐF#V/Ԭ)Y2pdY]+mb;Bʄ+v48+w j:60V~sÖ[~ SM/c)ZZۢvW T8Ynia?ȑwS6n`a"| +[<_e<ۦRuh-0#]^JZM|s[1y~KdZvn| weYLRSUUձPj\ DeTrpx!:%a"&[mo$"QrfhhTx{>^ #X.\8;i,?^@C7<Ӥ'O?:)g!O% i=dsr]!EO2Y䝓x&eOd>v mSq-e]+N>NLG\>va}'=YM&(Ȣ/evDN+ސq_Ǐ]Ѕʑcf1 ECj er߂'' neJ[O "԰ h9Y׉Lyr 1i(-ljmdhHF. Bˣ@ O-]lrD9ټ\TI_- K#ͼXg/kqK}CMWHJ騺F7{yHn :nqݣ("1䜃="";lqSWַtQJ`mV\Vj <̽4ijA8Xq U0ۦ _uH |Ai =< SIXNGD$~Nݾ T0f;*~2f /bFQd"56 du&^12W|"u|ˀ_X yN!r`2݈6I4;:: 9DFKɭxBGjk)oD{KUЊqrZ8."hT$\<:N `AwXT~ٰ$Ā=\h-ίt,* l͢?[T8@XĿ{lK[dSJKة;L&ƷE9ηr Swd~F=pgdog03O*9y`)|?Fhw]L8~MxeIDB=hpK /n̚]و{L^i޷Pu z8W5C|#5?sK0ATsִ(hڳ9mdLrLM FRs"s`j5.]3a zP[hZ 5vR֩Y{*K_MV WL.s ~Μç)Ccϣ@Aw-R_CZ{s ;BcgA!BI|ЮH*17%OI kJ<؁(+cRxw>5HnBo1}'HbA' ?rp[{DDj钧H8+~Dm.l^`c9_LF%./5:,NbJLu!5-7]),DIC:bT&;M.wdSߠzH8= y5SN ;*?‘WOKNyjC옐+Cf@%|K.B^+IKh[*~nxSNwpHtt5yb7/ Y(%[ Y},-9XZC 8Zܭk DJ]U`1=^ʫ9/N&-NJܒ@DqpoP, doA4~{v\ACPIӷ[>$mohgyk,AI wƝ}2 cH4 -kC1:arwb|Sh)]{vg\P/YL+X2;W-ћy3 yڦB2N`UU[vBayAx̛zC|X1uH 2N1ٶݝφQq[|c7_f&6Ḛ xO360LEM?Qq@d؋FcZ|V+d3 '=u̓Iuרx Q$'"m#CZ&1Ir\̞Щ'x墁-ņwŌ ;k VnD8LI;cӘ>9`jJs%,XUXGP/: B{>6>UV3""u2{1J+BʶRku@2~}`ؤBJ­*ՖpG)w\׈rbc̓m%X=]r]OY$bF< OӾ%Wy[MJE_a8ޯvf˽DZU1Cö^C-흏ֲ_v`]v"wv1yPݱ%#zRwݭ/*KnwOlw e&f y΃;ס$ |Qvy_Aı|5G-6-sQ;t(?ds= 7'B|{|9TT+ŗM;"ۯ_z.1 S}.lPv,ZMoKX B ஛YCnZ΁hAlZuv~v<[y ~C^.D HÕMiHnm7LD/ij$)`2ls:Kf6B-&R#-Jo51(R*;頌٢q  I#^T9ئߑѽtG-+V@.8`ܮq%yI;Nru+ S'$Q UI]@O9z^"ȝo?PHtM+y-ξ7OqU%īG9M?pmD K!s0߶yU'Gw63 DG/B/O+t՚8N:YJc6BY5UM?5]{_wǷK%6 U{l+g;UYbUEFbLl,106xC8h=,Av1U ȺĒ!mj@GF]0uz<Ğ ,; |cy7gV당vf=FG`:i9B@?ӣm0OW -1m,:1}OE@<l1X.5v+&>cjcɊd/Gxp)l+, 2,,:- +S 񶸂MO@NѝkQb`}Yl{| %9-( Zw`B} gP0<Ї. TDy/f?꧂Eppt }k@B3 /&cf7]|͟xlH5ج ۈ7dGTh>\$T& b ^l0wo}?F}M;B*S}\ ݇$%>?i»3+ߩؖ!M6 )؈\eeҰe9yk?Gǚ aS/26"P~^Dg Je'F/g^4k z;9dmtb9h4H){Hg9v Ms#$(Dc!}x{ױỤrn9z ϬuH,tjj}K1C3>U`j9䲩rsqEފ# G>kF#*=3nEJ>xzO-1AD)H"_.s6zfg"vM7Z +<P) j)g^sWw2_N4x+x,9VʧEGkFc3[RpTxjdI{7- ƇЪTxVNiDFsl,ͧz; <Ľ\57*=E9n0|Xѥ` Q:13moNB_똎]0'[kQLρ%m$/Fk!3K"b8E^ňdJ%DwlN{˜#u,=w*$!Ax;v JM•qAw87f&ٳDguRͿ!׍&UE)QI$P)ݟjBH)'qź)7~sÄt.Ρp.q|܊٫ƝC'Uu-!Tj +7wֲ40(#FoV!#:r<&3;&/HƿCW Yzjd-6jXw6HGq9kPlUW+ E#$.ǀiPm#YV6䜼&קXF3瑝)`o(〉ă9iݤN }$և i LxއLcl+& 3 xV.ZC@L'%Mټ*Qݔ K񒢺mA eҫ?Rv/f m}yJѪ](҉ O>@{1PEZ@@֝Je!*[`xsA_@rlo20 z!b%"NJJ0eD59dnX#_O)Hf:mݶ" 0eu{V-$8zcY3>;)<HqI %\/ O/Py "P] Hg3¦*xD{5HߞmRUjBgs3S;SֆHx/f95}aFOk ^bw)ÓL8@*Sl>ɥŃE)ri/w,J!'9ү,7P?<-b%:8WYbBn-( xNrLg8>n[ ױKCN@Vb ke RE/Hcy 4rwڀ]r4 0 xeBy^iQ}UC7rمFI&dR2P WZwɷHlk r69 jI#x"zЮ*P; [՗^d*]x[Ux=$"/ >lQ'8lTcIa3A]pNOX?sȬ,%\b{)v+7W!OHS jG)wyivڴumN )q9Ş&7bow0cd$tobld>V1C*K^\"``hOW>8j /=oã%a{<&nOK'xOU^i:B0 n3G:qX9b"asHP"UPK>'"t4]G atIozk{D%aʊj<%TzM1M09NL0SbR[e\=o]#ū~6V}ND,э"j Ij MXL!^_"vyTM2aʞ,:1UZ&~Pj+Bפė2K|Us s6isJF|&z>=g:l=R#eD5V ZgcO ߙqƘzwF xе) :DZ=`AM 'LK%ʂNo'^e{!QB$oyyNyH>fD^Q,0S#GՁn]ؓJ(+6OERd+IRʣFdcKg N'i AZ;QʌfSZNaD'J/织E~7ҟ LLWn '9sPXo22ƽ^94p&7TGx0Hڱa2 b˓yfԨ2܏AY*j>AUdp[`3hI-ADxΰ4&vQ)Sd'Gg0lު#kֶu\#} nPЈh3ҫ]P, nsVA#HVՃVf\&^(Jhlg ^Z_9ɨ_PVmD&n៫$ba $>C^Z" ȜK{%*["Y>JL(L6783 -%ARpVNeU"`}8^'|EI\(l7Q3 f[sۣC'䚤YFzR܏DB6l|D]+YeP_|&4r`, w~, ]zPϊ ^B5!RgeSqAm5H+0Ub_OS%fEȮV`ʕHpQڱ'7.С;n߻!f;gn rь$re7I8#ۂʵ ;ro4:@W"}~?NO=wڶZyxhPlCli9*Mp7Qb1J",7[¼QlT87~^. m/>xKZˁ.tyEbOpQϯ24k{p{D\b OM +fHCsZW[j5gOˑ[WB)Gﵶ.mDM_Ԯ%5S:Zu<2`Y к0}]#`.RZQFt,@U`@I-ju *-@! 7N䨳Uj0Xm%˄IԄ9 x'wewt.{"Xbԡɋ Te0ۧw-|Xj2V &%#-:qav!wER!^^?abT45h_p;V-Ԃ[ |I/EG]FzQ'lijLs',J(~$ñ[ʅNҽvD Mhg> kCcƚ:U.v?,Do[s8>SJ90M_mW7Tkt:>8MyeAK6WaKlKgpKL譩CD "3TA46$Aұ4.63 WӨƬ0иmKr%|V ES4elU3 XVSi<Ҽ}wV 9Eg=@h}EۨUfzКf[ܔuQ$]e{˨_,ǏeBBt  D-gWBah ^gch'Фk_Kw‹{|+,&ڱi>~W{ꐀ |"k_&:%E#C?yUHӣ$o|ju9:rFi8Y`XXh= cE5z$ A5,LDJR`ޕT۶xS ϱTx-ܘ~_ƕBW_TP5Mu ?|~سmK(9AIRf9k3XuqW0L1DodcHQ"o/!O?|}碢1ȧFOeF (8*b/HhTq;' E9[+(OxY8C=qSx8ƙ :IRIGJ+ѬΨu@)QnO0:aL# mP8 41OE+Oh akHO z3DpC&j*ӱHaOj|Ė3xc~2JSֹV[OmwkL'o,J |2 2ʋ/KrWS>[b]پ)ֶzzb=̀Moړ+f\x3`mʂ`\qgbpbBЕgc4j[q2yj E2+;WVij:Wص=^rao J:t$MLmDÓ>]kPA'\8\τ%`9r+ĪY&*ZO |5*̄%)B8&$S*u1RE#W\XWHc2>7ͥE5EJ&MW!Kl Lig&]# IuA+LQr-pyL 7 90OV2(ꕌHHhZ]J2ql>l0J켮ݕ7}Swg6voqca6i^ tdcWr"Ikq,Ĉ&9/y񧀯 jpy^sO,A\K\Z ٔ<ui[R!wpIJ%9ͫ2 μ]g$CBPoKԍY=Mʰ {yX/`vD@-vSUx&`}\VlEB _p4"y̭Sio_=X m *R5uJe%t |Mf]۫R93n (9lqK;PXˬ>h;AhO[/k6{ں]Kj1b;x_PL u'x(HOKktDe`4gʰKtq09N?G M}E,t Ӂ_Jx3 FǼ֩#*PII­х,pWAi'$wv%.v例M>3Ip؄y*PihxwebLjpZw(=xI-hhRLv=!fD=6$~3D4e9$7lZ5 lG㢁@Kl{ݕNX}_3@uڊ 7<*n{eA}$ECKZf0_fc^sp=z.>GHV(WhͱҔ!&de߂ 9Bcw $HmYkn*ɕ(3 JOnE5!h0Q5]8 O6Sx15kq%ӑCңȩ}u9d o/ԦnS:ȿk ̑U=E4]Q1XBIK1N/~ rDRuIQH2`7arBbezc/lqr#Ï !P^7ZR7'&[)Q)^~ILVᤢqAjpΜ14>b*?WjDE ']I6~]#]S$i0V9w]Uy;';S 3Ct=G-7CV,c?| _XٳRH: ) 3m; '-[U{1F=urnmj枒JX7-g+ep .VkQPjB3Rn94S35-]Jp2SifI~e/DHmg[ŋ{y ;$c4D 7 `5@V^P惂o9=-msC%&g :JApb?VuC6-'=iK\TfgW]cs}nPZaSXⲞ` _0uO8h_؞G*wrOK!<ctȇv {y2\ i׫O :l'g׺Z8ՁGj\-Vs#3SX[,`G>K)3| )$0 a9PBlv M,샃s#9+s/lx]2EpŶbcɻaYEE#q-G'*;IН,n|0OEOǏ#f!ҰK)eeWt+;kP3]z"lV{TοT8ϞiE5vZ~L14,Njpֳdm~?fh$@?J/dTw}"KHmV/+RTYR}_Z60Pu{oAϖGJv>&v/g㝷i)J.#>X)1_OJtXqf7!Dk8B'e,9΀7Aךcy 6-Zx 4f9ib6FSB/{Cf8b?uX1n!*wFz3_&)oAlbbN~$fS\xY 3ηN(p˹XvOY XO_#5\O'5iGhv;$&,#s44vBZy#:~on0r|]PdeAC)}e6MRAҌDln;, <=sc'81s$7L5]@2n2{-6m#]cܗї5yDr  nB 9gx3Tp˶1Z@XJ2%%]I%eו`Sf_5X$2;ZD]`{]ꗥmi6 dqM7؝!ѓSŸ-L2+ZʽqCټ :Ɉ+ì$j|Up%gR[B*+ Qx.÷MĹ+B,zSQ4iD&k@L:#vq篔E#+U$c>&/XwLD3}BKI :S ,ScF2(XECiGDn}!o 'l\E joQR̀rXf :u0T_O(OVaR[{0lZN Xݶy;0؅΂(:-W5 gt8E0kI>OPJ>{Peið[~^1.]^fnI:a3-SLp(/?R%pO=R =bΪ:v6uCc(I% ,EYSN%}6hdYM}CrH6CBhFfqfNqe;}k!#Ks1$Z@4GG/e^Rs@z; !Y%.J]cj5kkl=$K8FNU\%1M{+w"^6['8&zXX,.'%4O%"-`R`J顄E$]~ 5q%!إaӕ܂qZۏu&$cHxwTe=li>pc?D0B iҢcL(恀Gsȁ#9%|^/ ky]RB.(dU̜tz^_|'Z:4o>9^w67seZ(aͫGsDfsA~0uF찎uݬ~$h$jj]-p]h9a"$al0|c6O:Da,tlu&'D|Exo@MYh&Q1"1印25Jُg'…? `yTE <ml co+ % TG5dvst fw)C<jymm"ƓsIY _@!);bmV3zdAoU'ฅp[8׏)=Rr9' ^)"i v,xET?B)!wd#IΎd/Hi hbs-4~#"m'xącY0Fk6歔 exufܬknsq-[vF+geQLXE"5vS2{D B" MxhlZ9ۈ}bw]OsNstdLftyE @G RHxr0W{o92,Uf V\8L=6YuHx΂- Xnv:3y}XP;Gf] *LG Umufr$%G?%L+SЭ(x׺1@xVn+m 7flVr9OQ,32N" I )pQ\ w#Lܶwe;J*/1b#Dk7C9^o: hXZU-{vV>ވ?{r/_|#9עGpքJn9  i'^3ؿbp}+&qgA"6t Eq^=[yL"42ehqW[K68xztL_٪n3=@x2W¼KC R)>Q}ߠ-eltÈQ;>1x&~|sF蟏h𲀇*dHSsp!l|&*lStY(IZG +-MS%UDž:{Zb ~2MmxKh#R{ܨ1J F Q/⢖e [wHQܠ80Y$)ij,{顫tdR,62X}gMfX/kQz>L}< `6~}n$A ~1 kT]gk{bGqb`.R[ ES S<\<{-.eCiҗH &|P!9t0Q?9V)qI//!rǰr'؎z3A3 ǫ)諀tMXlkDu*qR_Q/r_`bAb4_-4G!( Tui=_)S#i&Ż~I.;!8Rf>lϒz+8,:7 <,CȈMmֆ؏"Q+S#w3TfDq(j*YkpXlW=o zž8yub"D MI5G,}^dx{" @ܶ0,waf%BeD >N8`n?B|t,뢘 /}Y&=#Ten0Xi:q^>]=20ͨstD,k?BZ;t@j|5Wċ鑌ϳLSd-l3fff|U-vrnK9?Rᢿsgnzݕ<tvڍ&էd7E,IKJ(1_Udó\0F̫#4&e.`w%8ITG ǩ?xzM}S p|%$Oӈ["60(A ;F;uHDo myC=$ef1;!x2%LHB$#Z6J.})T2,zUwϻX#}ލ_]+ ~*7D8zA "J?h36Z )F+Rf2&(gb 5BӱU W85[{x>^'֒B_ v P6q3VAp8f0nV8ydHif(6Q ~m;NSewr}͇1%&.l+upLJxr Fjޡnb>5Q$U{/&n\O|1KR(`RXI88$DZ`R|H#~$S7ːVZ8V]UwZEPLR-X6$m73&-.\~5j#2qoB z!݈oN-70ဨ,m 5^ gt8S0-$}OQR5!J> 8Ԣtnqkq*l##R~>jK3%P~t{%ߡ" $=H:!c;Lg;8{ y|,u[q`щ#4[`I rȌȲ73q<] v9ɗHWX71q2] . Dl#?LpaGtz/UVJapG?yZͬ)@^h" Ā/." ⯱{ >\r/OYQ\ 9[p74b+'bܬ:#jsyO#1A7/;x[4p$[ͪ`oS#a}- k9C<fݙ'^! cȑ!8w8 YD댆|g~aKt8*˅9Ov`"$:ΎIXv2q,v\{ q[1NʫGFGU&{Ke'2f ӬՎV&hj`0}9HASDZ0gYp]5|Fq>%5ieϳb1xoGJG!i1d3z`ƬI}KnU(iqRҘnN M8D <SX2$i~r;6W{$wO)@HfBwq7@p,=@Mn{KFZBfX5ƆPc"P~=vrBbc>tƎIOb=v7+&+nDh-}TףclX}74W`,r;#8A y5"iչr'AǤ 'jz+hnk#Y;䓖}+Wn82ɛ }( W\E{Jv%Ʒ6UX~ Ҭ(qw!%őΠ=xf$1˺u` !E/G箪fyFȰׁ۞+1&g! ^A|=3 M^ra>bbnAp,yeǨ&߹|Ő7_gNL+KFpI? %,юej`rE.06alu|)jPG4'?RxBhߒNYZP/dBuSU"^bHc{+7`LMPWȞ$ -n{A-g&xZj2<ڍnXm-S4 =>6[I_sjG Igɔ݉NT.Hn Uf8&%#gBmOirÏEuP?S粆yI^pk˹Re=w50ޣx`^Ƿ%`,>3u~/4c'峩:7T4VShnux4N<,|\'ˎD6 GCn?{ ׷ q͛R\3Ux2鯍PٖfFȿfB +iˈs*3&`~²mQsYM] WZSto/!!(=¶X9D@os(4`4gԐ8!e\*v٤kAGJqE' FJ2ߤ_ + e=V4h0"&S2}ݘMA'&AB(h%MLKֆޓ3ȘcpOWje1[dBBJpYɉ(C~`|5$6Uٗ2uھI[04n:gHlME7dK݆VFWY f\a#M [0X?VOT \ 6 tͣ)6'F-•0Heq3s:h§5.q=Tq# *(2:Mj-u(Ŋ_f.Vcy|>ƃ߳_']LLጧSCp! #H1e=A(|tSFFtI <*C- C&'8 !?UPֿdTԐkw%bs(=J4x;8DM=m~UQޤ'7 ԫR,fʼ a&JVuZϞ-q$+˧ κH@/9o~̺늡 >`6Og'IOz9QSzL1ӥ^GC05J3Gar)RiT0}L!3wAWV eӢfs>UW>ju4hsW`7~s)"NjR%pX x6BqfWC~vWY-Aׯ^,~Ç%&3]I!(K xyvmuۧ[N,h.`@cƂ$ya%r_mQG"j'NW-6g :c~~S7 /F\tZQZVZrٰ`7Mc?\ Ǖa2P$ G*N I|d ՁKƲVk%@V9 dE1E_Vp-f)5?2i.".V&sy/Ψ[7 @IHCr0} e t^%AO=XW3:+'l0ngto܆=Pn92g(I ^3@ׯ>G2PKVUN1şNx)iCcɴ w!H&.ƫO4{_}!H`dYĢx:Cwô Uf zB8:oQ="]_-ٰ1]rzפ|3&1ʦ0`-.eB0S8 QF\oz&L~T 𠠒v2B<왑a/g+48] I4kdsG#4{HE_k9AT:9*6\!&%*lWx&fB98fOB24WIhlE)b'pMp^'37v1I l;B"y [)Hpp24H',/);aT}FM^W}fJ:k.I4ܟʍ^/>SyF*_upu>+wC5.*2X!l'<Ù`w^]_gůQ+.@RzfS3(YkۢAzJ)N2oRW%z]Sⵅ,,M}0L± fQN&tj*@U1t<`LI(âÒt7A(?U-O*6K~3os? !P~%IInZ)K&(mCSqfq84k݇4ܝ:.M#3OōKa2T2zaչ ִyr2*׷~F+!=煗)MxMW'~ `BiY ( ou kM' Ii D0ɹ$ŝΔ%wKn]Ao,[rΐ8Wco׳j`.u~jkw=H6Z6K^,ԏ#eiaOFtx[&~ilFBѝ/Sq `L&φC= Qx+!qf75o=W+.k˱xl*\--;6m(Iީ߻S(wd]#tVJCMZjI?]gm Jkwu~zk/%Ҹڎ5Fj6Y׵`n.S'0"(yHBS xU-&1iQq"ߟhkYC=X^m$GS od!z n|O(A&y @4j qED?@ WBG7Q%c~sWXCZ5 G!QQQ^2:,z +U9Jʜ,zqkRC0Sw.*#<&MCu b;'OQ p*]jcl>FQ\p]xlPOj-{ J?ݸ\*SeS6DEwCBy;%wyL0QthʝXd[GzkrѰLn46n˒hL3H1bh ǭDg9\08,&>0IeS]8jc}$]y46 OD*zN0L09B@?Qd)?>},ItzI⹯E6f/0+eN,zkYr2_Hj|$Z7.cܶ[P!&-7vJ쑧IM$s&ëCYc)Uq(qfdIDP@iSKPR ZMlUD+N@tfȢbWаQ9&BI\jd!ԥqqQ>.T4Lt1gWJ5oe^~veDGT+udX )hP]Ph LH*FˤqäPǪR2R6jj[" 6;+nA7& e?  J ;@f@jE:\YB*}Gߏsrmԩ-ޯ} Xqm?Nk_JчN/17l\tP8t~#\DK+&-eP(ovU>\Vـw=?(A*: =2t})&@$B/#m`5^0`D)XecxRՑd2SU(*Q'a+]y, Ss6GP|ѭ͉3HO{,_Pz?V+`(_ ?F4 fB}5X$)(H.t ILf@ݧ78;қQQVV0l28ZVe5xU.quA&<>=8b'āIyH\fa qB̔_VZ7`ZX^6'RNcKy^{,ns@Ő[mG顯 7SNMhj/w1O<9FeVWED xAR#7ۂ:W`nUg/& }24>T?N*=e1a^QFNվF;X_d}c5AZ$#yZq@**c+2i*|W }7uyV/65+;dP;s ֮?㨖n t_^ P`Ҙ;74HdcD)4b8AWȽ6aSM~)G DaWo^h4PG>bVೃ= twWiկ>TVcR*ʹTCt䛈L&)D|-ˁuG:P!9w.5ܜ]}otSRQ&@3aرSwmyQ9'W>0n#L>6:Au}N7JәaPnŖ" o!b'65cuvj[3 En),qv9Fr`JME@6 so^-)f SsM7ty>lkJ>Vqn#zS:\azguoN *F{zTH%>Zm+ݭFݷ2\lk5o{8MhOU3ND$!<)0Vkowq]Ux;y_\;dS*!X9{ Y+2=P y!Tsܷ$9KD~e>AʷWr@t$Ựqyr;$%- Y\Q2M<ݘ6ѧdy?dM}䔮>4ś"6ӷB3 Fΰb6A~L=k3!beP?EfϖUEN:vuca]]B=BZ>dޞ9 V+tʜh+=Fw̝qcx>ΩCL'r Y SAg=^O:G_vX3ZڏؗCs[ux!ZȉIȡ`>u,;Ο=)&F_D.+U ^*c0k_\#2bQ#LrWKSRۻ.u3tt=)ٍuc-dg׻=*E=ɧH,ݫb7K=ƽ EBȈt,ڞXታbTP7Oy# vǁ}Q^Ҁl!9ȯ0c| Џ!J[Zh hn8Mea5hzַ^)NCHA 6괩O;&, `wʖ.fv9 d{6%9HuY֍`Yv\P\aێ˾ʡ;N ύdi%, _ t_qHvG+f|e",ܨrʼnbp{AH@23!@9%Gj, JlރE%&DAWqS{(O 35E#..z(rbu!p_wFqP ߃l]T"kqoJ,Mvvr%X<0S0}9z^]@m>Zm'R0 ?lΛge`SC:YLN=|7z N /66h] i #[p2'dDOdSGJ-a@af)]j)7#$gzaDǯM>0^/ћ_`r2FU R\ӜM0}NP1"0t,*Vt)"l5(RG+=Нnlu2z9|Z4ݦI4NM;aCҢ\|HZbghS!a^"ofLN.AU2Q؀z(%e$"pg炘\IfyZ*p_7,GCA]_qnʠӌLW-%"Ҝ1<[MR eR7.9H7+K t!Wo52n U[^̊pO{G Qe85qRx{8Hl׭5Y3p# f[:eN3/&xE0`+Zbk$U^SeM.!aMaY}D?rCn0"fK',\ EʋRMZr7v-NÑ2NOdI5,gN Է&*mbbȗkT T/p}BY}4~䂞CvKPd[y}!^7~](A U1/2{h#: w>2 @\/ӛ xWU4GiMЧ ׎S|8ph?lCb;B=r?}]zIghWr l{6HR'B5t}w"4=o?wQm8Fjڲb%T5A .ڏyi2xs[5FUQxs'X1E4y9䰩 'b ́F8>0/"'e} un) Mx^gI{i "7J䛇ٶJ8U3b?uVH0 #vYS@3/Lz Ŧƨ ڟ <<^]E{&$֐bF.`􊠮 I}`!(}$p+uh!/Si ActX͍jD~Q<߲ m~򦁄dѼOe'xlʑ02GKp\vs} AK0ѩ9Bb,oNq=π:Rtj]!+h :2j|w Q2N,65=DA2rFYX \b[O4@1-Z#~PGMLQMSW[:J=[v6~aK*eSxk+q,( k+BN r[g][>jS M~Pߢv;U$v u8/AT.W6& ^*Ay3h.-y&rxјqXi7EȆƿ=q>ꛤ,gFW:Z~,7Ƨ\f/@qɃ(<^Ol5Mi[bF@ЪRl\0mϭZK2'f n(FX(|4| cY !ЖwNU\gyPjfn; Ӵr!q=½nx8NRscf&`ҀM18'Afl O/xS6g:܂g i:|Tފ.S 8#V]pkz1(1YG=*T1gDHA#$c}'5fe~ ='C~p0 WrF' *mA$j}^H"Y<%+ j[q XԍrRYcхIX!vg ұ,F~=&E?%Md,jۋQk\սæ`gsm8 [["Qf >#gfxQWZFBO:hTRB}ׁfO4 WZ0;wo*ĸ:h#6.+ ?Ai6 t]#}ZLg/8 wŦzKvTYsZIHIAN\.Hi:F qo2X*V [N:6rstXݎJ=ݽm:ŃRdF^Vf:U/uwkX˰L~D9hFiTIьDӁZw+HiPtE=z54SUY-bxt]zdE.뫯8򫗍\M0E'̾hbNJo{;V$#J|Vǫp$3Qkǻ ,ͧ_㨣f.v\=ϩq.Z\[dq5mg@j; %3S N#sd]KYNǵanQLS9h:X`-g(-;O(L,W ^ JԢOn)b~KnNh)kw1cq~=k%x{^&LSKfvH& +KlxcU=7C}dBHOg+z7tG?g p.E %לG˸F/i͂1fPy}KⶈЅm 53BO R߶S9րnߍm|uA%)%+HHQ{U^$ X{_P.;&k`,1|YT2  F[o"G$m*fɳIkp1Г 7wbOTbFAk$zfgaՁ}Jt.U8/3fjME(2iGhO |H_+]\~4p[@ TdPRsC_o\7vx\j\4<9E4rFK!6>@f`k|/x5EQ6tbBnrd'-<)P¹Θķty'cޒ>¦\yǙ`Cˢ!-i>-QR)1y`ޡ֑M|ϑ=oO6}qu!{YdLVOH 9Rn4rmQSH c7-e"UzT]u寠`cVhD7 u0o0!$7Ar,37"4,4gPVJJ!oAu{>P,9Μ.㜃ZHm醽L#; q; H}!9 3Q"%CM6<Yl5IelJsTĜRuvD !ʟt'ϧ9ʐ.nuoQ#kw ӼŨ"5#S YeD-bh@;%XCv.;o{cH=u!l+Jr$ҫ3dY^OOAS}6^m!?n/9ð|J7SsεȋGg$3"+I*ݷ"1,EN&V]@9ΰqEGA4fjh|- "CXݫ[u#Q39-|{l^5<]1Óz5Oq+#=^(K@ؑ;%׼'m\׏5@$7GR@!j0nKW2uو+VwlY/b7` zѠeUbG F"2"ut gUDa<L+4,ЋD'!n\BW^ t 6&aql q=c$v3W3QtArKy  ǛJ z?GDŽ̙ SϼH\JԴȫ^.B¸I5Rw4ޔq6NEI<%t&Oqдn'Q8~e/1B4ɪR?ǵbzxH (,z=-6bCbtY RZfP2SK#MO׊+d˱Vj`Eo<`V~^ȊaْU ĎhtǺ^yttx@;B/K)梴qor& R$ [7"sSJjCީ~*m-ȀAïf=M!Nd_v5>"uWG%b@Pif{-C"mh4<ɖ:u)KPuv)ZC/ ^bhG No9>tRԆW1}楴kC+3;R҉Puƴ݀[f:OJnE8_?%D̿dhA`;IYf9k/>KR*su(~m5{B='$~H ?,`mclǨRH_R&}敒o.U#aȎxVh?V~awpQQcx -0yQ׈h54%ax b2"8H9s`sCm7ysl],}Qj"W1ps"c{H϶CUij ێ;vAxf;1C;W \o#z|u5Y\pH8$͙ NP(8b:P_@Zէxy~3siL33[g/ݒ)Ͷ5rqD,߷U'*Ž")(ʮPãa&<Ҵ:"vgVYfVT[QwW }a cS yX/fH /=%q[ZR( M$d}٩Kkk"2tO7mȵR$T|7xi sM!׍UaS2IzsywAMxlH8pN_ItqPqGEy:ੀG1F,X0"~MLP 4pӨ}'|?Lؑ8 fIFrľ5%ŁBÍ7Uᚄ̅aE [n2X[c#Ѿё#"ڐc>K! 9E!. p4½ϵ;8G5RJR7>l2߬A0hђ <ƱD8N"FE8vzPBgdU/u4҇me:$ o6>2v*֏_r@P w ~봁j3CʄI~ԙdfqNZN=U"SS8"xZ˲-֋~3E(T]) # ki*ylj9d ۖ8 gED^覚,roIʪVs ';#5hwx|^@ӯi'^oGanUd[tk*K L7nK;PGf*gsh6%8m zvJ˕Bf1;~GHf62I5_nJ5 6jʺD8д*ym\{װ"`{'iI^57VYk֘/dQJ'eA?^yh5Qȷ%Wce R\L[s:Ȃ<S|!Q=`)jfTl/oWTD)XP|/(~h~`cΓ{c3/R-Rq NR2XϢ`/9BՐ̪9J&Jg)HNؘDЈc@gڞɒ|@%ik>SQ~ y>O}B'5U;UOAk)G.~4T{lL"y٤#A,zIz 9\ *XnVWVǵʼ$R%d  tQyH%b'hPM [$H'2y9@o0zLAG&8FF7Qoc{amzo s_tBN.09.)_/ }Y\W€0;RASY!I /錕g.^BS(^p5ɰ ed؂it(a)@d\ȖX% U1 9YfS+Mǎl&K1D]ކ8 pTvmf6UT6QOXJSwdlIjC O/ ^peI0 "C7}Ijܥ4pMFVaszS6OɈN|5j%MDz,:Lgian8khJtnAڼ($J7/eԸNp0/wDzyjd#S38'V1LJ}]'kxrMH!L((MC![!L:9DO oPA(#IQ&\Q5hKp2Ņ<u3Ξ5\ rgPxv)]@o5S]G0(]t1\BpQ7C ˁfk آntEH}w^˹v筫}^uu>As+iC@ַec cyD5HΚ&we!4P;WhGIW^>#]&BnR8O"˜ޒhOcX?^ʂju'+1SO˚RwHP Nߗ?2 jub9 mj*l" H4-'N"7)GomTx)#ѱTElB6q?QndT(KH7yRdvՀ&@x zJÿ^pP)eM9I9!`4$ۚ+L9ojyٖ H׆xduZ4]ve@uv:h&KZ[ߑZn3:u˟˒g 1;;~I#K%sN,Wox)1  /;|_]sߊ;THG{qX'D͌ճpO~#ŞzFٝ{L$]|q6q.9NUUVT.s)T~Qs>!aR  ϐXg= DTұe49QOA~~*|q5(D^ lo;%ѓU\v~8cLi >םD#Gw mz:\4ZrAL04F0²yƂW8oƷwM@׶&#T=2?1X&:9 ^B&q٪[o>σw}߷|,  $ FQʢ69ɛ)F0S#XIݱv?JIt.8Ԣ(6z*#ߍO$4anh1\A[]#Cj2.@cHy> 8b9kv'Tj4R'i[=n\'J^^{ ;#Lg~i;?~TS}|5V87eB*Ҥ+AO"@A0E.Ȏwclndۗ*j r( 5jp dw47;`A.ψ Fǚ;=$QbH33tTbĈadTz{Mi( L~+餪 a>WE xf%2?72t($ +kcyMU0>Fem/-xVGd.)#r V6#E^4_xaY)~֙RZb_L i8 WPRoʼzfӵM XGrђar~k~G-:$0RD͊^o'r1J NE8 ;)?鈉`z1W7r线:e~ Иd`D%,X^ M"$q@> uw?6oh6%%`M@֎*=$heYv±b(QMB@*ܼrv5r v8$b7WQBER;Gã|wEa8FΗwn[y.iiy2tRizÏ^+O5_Ckd ׏BH{$ujol|\pg:_}TFFS1e*Ij3bU_Ϟ1i1fWϭT& jWuSfs4^^ʅNx,?p4)-{Iwby[9¸ͩMx.jBVuϏ:{DC#Uї{5ʡWzeA06U5=3<ܥ]I+uƔ< $/j mMF17%">яO;H)#Tل>ݘҮڒC 9f)8PG٦e0)FkœI6 Ydp'2{,Eux0v7dzmh.`w9SZ׊ Wi2m[dN"n#Y5O_z-h[ʦjL?˱gêȬS]rPDvmI#'] A5ZOV-q5YTBT" ipֺizO?x| 8vہr{sSmC 8_~ Mw`4X矞#$)cf {kn57rOSEcg'zL$1">tR  B m!cW87~]Un Yz@ǪhBɮ8Ɩ(S^jTȜ ;婃_Ba6%[݆ k#da}*7~fȹZQ)X\B&n1d!-ZsZcWMȯmzcJ\No̐}>wW7H.y?IjUXqOY$KT\@ZY| ΢n^$87g>GkA SV^Zi*4蠲쎡нtSNsMO/{viUR\jޥC K^P,w@t 9be &-ĕ0#>a F|39^ѹaqJ]YM][8/}Z7\+Ѥ qdVƃ|Ћ]o+,KÞX)AA!7G+` ]%t1_;c1_BGbeuy0I)I{ooحXoK=Ք=]H=ͤ3/jnbW'K!@psyeZpteshpwy1tNJJzW g+I*U)D4a55pDCU.vqYrdQrdo2fÔæhZs7Ɔ,BQᖬ))Le޾ hy}3X&(LPdyX\xM*vgԤk~WQFLQιu}lr,{* E On/&kF%$I{\oe"M  !i#M 9&wkf35(:BiVT @GȍǂHD+c=ڴ^y~Me3l.nD32@A,dcj9v[ H4[z]bbr<^9Ê8&Wi]h8* 2{uc#ĠHHHsL53Ma{-? pG'i*>q?1H*_@Ŀ-('ڰ\Kv椖a='z)4[aճAmyK/-RE " ;):m  FW!-%BXq-TjœtLu(ϞNl覓C?p͏lvWo3r&m+pSvq+eDY岼<?oU? ]׍iQU倴1Hܤ9Ի[GyO3ۺlH wEdn@Z]j%a̽*J/-`´Dm[Yʽߋ96[XJy\cx[{g`ðO` E"]O)+xr g-_mO2*X55gȑޔuzRR'6yY}X)ls1VYqWl!#rsy ƐoOYo@um"^0kih giy$<0L>EG!ivWYg&3Li[L -NJ.n qP&Pq@\X]7TޫzJ~3.^('j.5FB28`mIǨ=EH85)luHz3cp-qp' Irkvy̼ =2,UxY {S9q@-**I?eNxWʖfya/c Pcp Xt2<G/ԋ ޙP]pТ]2vL}\&tU Cf+7~FyԮb: | m확V:N"ZQ6$*kQadK8K'73#>e!ć Kf*C3Q⃡[O*6T)㲡cSxRdÀj>= wHx4Ɔ+$U3zA|mm(ՠXS]u*) Q~I.̓!@ko+A$DV滌Ý7@ GS < x^S` :۶h1cD4=h$$Eo\ `)Hnٞ1^2hČ"8? *AG#Fs.7?jqPUh }4<` jwXl; BY/ Gߣ[zTCuy\ a Y¬ rT9 硆dR_ ^sXLc?:\?A0S+-WxJ73Et3NJ59]GڟAJ >YW Scwބ :',G=kPIт89R(>B* )RBzl(+̖Q,7x ّ(6Ӡیk_M Di:8c:ά3-PqIyoqpwA?#RiF,:J)Sgt-\uV۞m0B $^QZ9Ӿ OW=i8zqh{ p+}+jZtk4(uS˼hbְ7JN)oEPK}$m&)vܗh[3qK֒ j٪ ݡT:e%5"_VhT>a4|QcRVi+qPlMss"9R"/Z-pHU6ZgjZiG,xQ{ CAU0lfX5ٶ%Ef92Tk%a5JМYJa%UZǭk1ZW\bi>{ɽw} _> SqzyڥI [E I =xm,w`T;u- ]>m(Z-}(h5{F8""B2K\pM](9NjY&oɨ; )*K7}%zT8)r#ȹ6Pnb֍,Ob 2? u;١,p),dÐء = A؟e T{s|HЃ-5qh8t0<os\^v9h4m:77tEՌse=hKQ |$|E>a )Au3yz.m;)65cxbxe| fg2iBZ5782m8_{ilN])a.d}͂t}0VWDܠIъGك' xjJra֜c4; h@RW41}k67t*)҇㝇 A~ UlLi.!:ۓ[Pdt cfcyמQ֢H𽫲 %py+ HsPve` kk ZѸ߶'|nfꚚx_O-YBV)/Zf=4{p zE=3+$9=H0o&Wr_/SҐՃ?V[^Hv1پrLT$ (RF89bQYQڟ˰0q|c[Y.*T9XFOQ(Zw qarΗ.mL]!l(75<-u/la̹tiTk^C+|(!qQ7èԋ-?ѧ8ƓbrvKJˉ.SPB\lem}8oOד!Ek+1PH M`)&vOj{obX`]B<(sBUmt2Nl=+]7k U /;OLKG:(t!~zLarۓ#N#aZ?G'@h;7}Hetq,JgFWmNf ̄p 0I䋾'NoA'> wp,{:a;@9H#=A8ge9,ƗKHVoҕ!SE/1 %]iI(;]wS%׋HތrRzZ6Ĭ51kG7qfm3)sn㨓gNy9,Y]kQBT}1\31bGˊ$ܽ?Six4e7R:XggW}jW_Vϴ@ z)풔[>=jQ uJHT(ڙF2ݼyHh36e8AYqDB/jZMAX0~%m;бT0"'*< `لjbIIMn ;HVza4|'_SYL)G6츅pyXpq-!> $_$B.\8{upzD'"ٞb\]>ΩLv&sެ?3i1Y酾jf`i 'F^`ˀYHy/~|?}K1/b8ZWOg/flH%;?^{Bj]uDfz;n󲈰XLbw**/J{Q{dKOaj/[0b~?oZBBq2dp~.O;^t<^2j%4^D_YGSP 6%d4|]o t %k/)h@"Ϻ'ǒ(^ߚc25175R']`3nP!stE(h™w]?GM7B)a@`>=yKyؔttV&݊U@dOmW=(k|Pn8@KJj^>j21g(>+DO(S*&N oby.l R &}\?HEhy3q rfHa?֪Cb5R Pc;AwMGgȂڍ0r鋁))wC ȝMii(/kڻvdFXbZK@bL㔑~r'4yM=tѹ+Uv;)<ַə hM2i5.cr :cVw] O`gK &OqPenMW؞~40ߵԓwZ CE oGXw~}7.0NGxRQİ;|qn U@Juzp}ۥ"40ߢ S) _Ta5WLsW*ᔔ o/ʬ6}V_&2b7BgU(l 2 *57R3bŵ1|ەD@op"mBr+D^4 h3P$ov%!16O.柳S.:@m/Z{G>hicl;? 3t :U[ѕA8yGbSfޓ};L1/Ym%Bz 3Hv MaJ z"*2b6 [(&r.( 5ڡwDc'0EVzE N7iwgGX|05R?DƝ`vп I[V<$ն~]YV{hKΣL q@* 0̄6D‰Ɛ|E!:.TgYVSmGr>$n9/̣AL4ĨC*]Ę {P'dvJ!t* u_{LZŴCn>D@g=?{/_8M AXZ`C E*NE52{2y@} tN_d0nD^NgܖK6^eFe=ݎծXQlj݇G $BiGN}b^-&wz-44}gƌy b~JD[oedϹ0"΀U ϬuTvpߌu4Ee9Ҫ0X1lig+KoCxb/j׸2 5zN 3cç8Luxy\sfydNDr҉*jt~kHnevV1Jz0ׁde:k|f67q0~Sp@ nqv=w6)#ww^M1)G0N++3D7Cṓçx.:N潵W%:*]5b ͢z@OacG U\Q+ btuL#ƹ=:;#%ke6_+#S|DTheaI`bp[q `i UwA ߊe"K~s4~V R?蒨dd_n>)x^b-+ݸqCF8 FGj_¢Kq路s}pU6LaVTo@\ UVoc/"$YL4~׺/x"kZjV Wr7 TYFCdODVh6"pnZ ^ݣ۬p$B6TFvS> җU{q[ P ը:=׍4סd/>"AAkyⶭ)gd#(Ӗ.}^}K㛵Y>oQ%2jޠ{쿜$=`: R<o񌢌v*~Y|4CxUiȱeIp'3 HZ|pOwH=| BR-is E!3+`;ރ/VWr뒨}u 9~9 {r*m*tT^du}O@V0━\T"jY5ӷY6Q53o,fҭ8ۉiBCBF?(- !G#F8EcʪEtPY],$K͝ emAgyn;e9aR|w\F#,;}V9:ds݌aGo /6 $݀ >K[= `S\b쐥*|p-haM Zcΐ{ AhfJKQ.PF5 Xɲ}j.Hˊ~6 2^>b8Sy%ߛgLg\3GHk oAH&3 );=ғ$ 1~ k6aH5O_"Ieq'!XtԨ bQٲݗPdP保'2͔*ߨc%"R:]dBd@:7ͲCtAlX|*x(;iz?!1v4#R<2Ӵޯ!;eKֶ.*w& ~̔ϵ1m} q!kH`) *&57'75Qo<ɉyA ppy FVQ;u /7?8^@(T ljYp0[jܱ0kC{s*|E\/+T7+n%RمC拑2 ZSxfIF!riFS;K&I?=leOAY+.륰Gsy[JX>jZELH&t=ů'aG5ĔOhU!'g)ג emI(_UIF!u `d<6z]hY=\oMR@ b|!H*a ,y4`]<kP&Ŀ3#H xwX{?dK~ 3jL1}$!][:@FW{6Je?P,+E]\k9T\NW g ^{+#Ov'jN _v_: w*[VqCq{Fѹ8@2-7{R3# ŚE$k%TC?` j6&׹屔L=;Xc! 5UqK O%}oEceKԒ>з9VyuՕ^%6`Ӿ7ި?lؙߎw$wA^rJލ}yPWNGDt[0  JAT׫*_1b z]XP%&B,1̆McIgE-Kj:()&%`q=.EUC`O<se1HيD ~^-CbHcnT[·ǡ#&{e8Ghj!YMG.KQ$[Nyd|ZډV%MuL)+._a7IV_gdL$w3TM}.DeTDF'ls|ޣ.;' 'NNr@@Jû\3бD]8 nyc8>cau!X_ Yޟ{-OZfFZHb@ Py9rRkNƻ.V"*8 $u'vw˨cwMp\+'N?ϼfOF9{1vP|FzE$$=T}Z?l?m.iVA8ĺtea [+:9D`-)3b.H·-9j,{~1{NN`P|Dl(; vF$ޙP, 올 I ʞ,=Dd= pQ[uAz=2zSLߏtڗb8^$k**Y-ȶu,myT3 (8(QոOԷ30c{sEVp!C>NpКD2iwF%}tuW1~<(0ņH:XSnj7m,ݍ[]M|g5}o\8̭osSL)tnn=O6=&֪kb~.=`("WraFՏ?eaI a6W;޽LT HF"~A0k YYޡ gk({P{&BOH [ɗ5J(H75o =gm߬S|e+%|ko3Ġ1e ?hq8 t j(PŪM{s)5.M7%KhL>Rv}fectco:mҠp ML,Ɗ ^H\3.Ǻdy$FBQ"jI74vԚ]7{&Ϸ.v֧LkbɞbU6]Jo%5IcpeƉLli%#U$B ߚN]} EA @fdcSb5zͯmBv̤w OKͰmX rٸ17ߞ[ u 9}(7w1fB3QR; Lk}.W< ?{=Q5{or;FN0XDDп1 uz Idp[p'ߟH ͎ruӡ5f^6MN} :7|!,ns6l#$B"JF iT=;@%}}%B?Lۥ)A+-p1~m Sp{HwE1Y_V$5 c't5xvtnY|x a&iD1`( Z9ڍ%'$4A[x9鷆|L-G屭R]P8s EIf.Jve4rQwB̹-WC5ٌ/>#ٮ;@)m ORT EfB6}o;J79fZ(0|ƍIC{띴,r؇ߴɦR§z1.֛,"(֛ۿnRPݍ5=G?+$duP|ዉ?+}9p[{Ys ,qfӳh]C$腧K7E.b0KQ)nT}ߨ*֬:g#\$CkǵYț.@[QRWB{=>ɘ3lDQ$hXaۯr `wLߨCB,[ȾR9G0Pį[a)j2cP99`(טV^#UQ- 78K e)#I7nN2ͩ;&xuȶ$I0&hї#6JOmu 0܌÷$EmZ`3{te%0/"%?fP#L9v-zkzfb>,ڝ Gj[3H]Wlx NXat-sl;t ԲĀ3;aHz>dAoqa'<=y7|iLBKi)d1+fW n`2@NQsYwxR!i6ݭ! 2`F ޿Vg&9x÷ܭg=j!l%p:&j} |aPܐP8FzsͽP}wd]pokV ɵ ىfc Š"jr?$<ɉH'srW >Ty[5Ȋq!ӢaZٓyzunO/=޻4hڌvMic\lNp%s w /8 v _flE 3b:փrׄu>淀 0!8`YgN܆?Za;>M"@ VyhgsphM]wHu;|=hQ bO͠ {d7؎p'+W I*̗zZkoy?cc*X.a=X8V!1 @;l?Vڢ",݀st|EH$? ֽ.U P ˗H+:C[L܏}&~ Z©gmy7E$H&3aʏ5n0o;/Dibj>cRIJyfPGOD ~g8H71.%M ]*MbV>DS4[TɉmHt3ZF{huDᶏeg0ϓaA(zvPZHMQx VɆ#aЋ^=>OhhuLQICdkXcWʎX9w#o*qӂ0oE+'[+w&1";$Q0c!aN(IuWS5P\rkO#H=̀m/?*.ŋHV+<%Pκ=_yds7M8Iy»!pT 8 !q<(;&&ew;LU =aV9S"PJ?&Md[͛NThK^Q^о^U_yJ LDlk,G1π(O[`[Uh6s.Q"ɧKm7rIFIqxY(mF XEK*k@JjO|{c$C[&kJ qߴ[WeD,Nb>qw]l~*«qΧҼQQ7: m* 1O4bt g 72σeQV8 }7{X6/S+4N" {ɵc-A陑Dtx]ԛAh8:~gVm~~Tঈ+,u_&i ҘCymn/HgnA ?Tv=ʥ2ŘKt227sRI13 rK ('37HcUq)pp1rFn$SVw,uT*i!BLR2R&ѢTLZNVc(BѺip YT!%2lUβA"dH"OtGkƻxKi*2tqNT-SU{9aI,b \0wGZewg;$4>D,OP뇥ΥP%L. # e4Bar)$ѰpAgיe_o f]_73+9 tDL[x~OZX&2{4YDڑ੃gydXvN 臐@J «>omhwPA{b?P^`-GZm~% zxRc2tdm.tڻ,VNE&F8p$ /wEo8T[GlwngKs IKm} pR-*VxQ}h@%)IVKwS?S Kҷ MxʘP$~&pQUEN?!ٛb,F̃$+4+aLXw|_lh0st.yn:ѧGY\_QM&`1z$94z\fteGKk; UAP/D\ _^,UmH-&lc{e#w+ݧUrJc}9!l'ǯͬH %ŝU\cq?"r~n0t!ziIt6ӭW|]c,Q_v+дyV$)K[<=D:'BU$=_ &r;="gK- *5qiBУA5ʾ:m{q_&zG%-`U뿟-:Jb}W#|1u7*nKl'%oF.%ƲڃCY`F:Gш) R{!z'I>5i\=9Kd~ qThVOޮJ,ͫqmJf SRB-5On%UaxnM"L[[ (;GjE$ioHja%1lcdJ1bPZ zRY?U )7%bb6g k8ZkR2hF_pz*jiCcM`u}#kt3{".ӻs!ܓloѸׄ)H͒&xR< )_&RڇܣQߤm@!c:s-B]ȄR!;2&^t C(^p?t edC>"]UdSI!XU"|UHZ*kJ85aQpQ?Z 3I@(( 4+Q(D@3y<}|a? ##.G8# g;󷀭 X36 _VORPDmX@goҎҪ:ˬ!~vN-& /BZTQNsDnFIA.c"jW[ ۭND{KO>}<_ 64Wbz"P0||wI\S%"%Я)E~vF`ݢ1w^N>*JҶ]KrQ}Du2<1 Lk\2b h.6]sY)yYX~%_hlSYWL}N>]{kڟ\ "&a.|{8 `9ɱ}VȮWwdGa^띢 M'YM4_*HࠜTq(ߟ ¨ ^5-Ow;k-vXN( »gVgN@گWf@΂>OHl\^dr_E!F^T2hY(nJ cI$YdE ۡӆ*\֒ס\H #EɈot} S|9}lE=J=!^L'!zG6(5y, N9jfMHq 4OI&Hj1z7y>X2!RPQS39s-v5'g{WHJaGd8*{oRINN- V9w󅞔)%0Y;ufR#; 2W쇰#[dD%[#anPv~ P”KBy!*n w>tV\S' zg}eL*(yjԢHEԙ2frI'!Ņ)g5| BksQ2 c`ڛh6-@7&1{B!Pj2j]pYi0k NhGE,Pb af9$w)ЩJg#=O}>z};9^w |*%Iͫ Zo^Ꝡqϝ{',@P+/ X ="4O^dpFd) 9܉EkȬkFY08(&O陼EDr}Eǩ; C4lҳdQ 2ϝL/x,| qs)*R!rQť<VeYE3LeK?@a28 ^!4ujaGηتqOq !:R4t"C-Cr _6J/V&zO4f2>Bʀ>[*K &%;0 F{mjB5{M2{VICyt;> oLsggDp/E:h(z`hjݚG+almq?;#Ey~d mTt<ܕQj14KMhr%.H~-!RYf|y dTaѨ>6R`843N+=Ju;Y9,;0d{7dq f[WTbmxT#Q? [My9UOg?QZ.q1C4f xG > {j3+0*e] BzG:r0ew%\L 7we:'ax8:?m&?*`/ v;fF׭{57qr=ŹWi'*\i%!&xҢv ZQIe@NXWټK զ9c-VcȆdlVq ؐrL(<-cc Q@򫻞\fU*S4Jx@^@F^s%$&8H=T(-D/|%0_CQF=rJƒ1x]0nEud7(xɇ`ߔ2y0'Wǯ &su#D8}=M0vT(Pܾك '^Jh9"zn,/\R]5(.zprU-hX``<}@+Qm~0> ?CFug_u+7aADy!m'}5ޯs$ZvbpĊ7c,0l8Sy K4%7GOnJ4#%m)<teAj7d9\xVB .^8q@_pl:gG5ZuYX2ѭ C59NYDńx3.Ęq Oh|?P]~Jw6#\jk:yտiqaUZi*(FW`g͊-Kq)!~4]]eydAIF}AZ"c_-n}F/F J)@"0̫vP18?$/X W3c8 (MZFs U,@~ǙKms<\峭[dG:B j֪i~S&Ύ *z$ԭfd86 sir$w2 v~+ *r5, K3pbK,{D* $}CS8yqSnyYoBɛS?0xlB/Ji/y<1YGwAb}hdwCa3V͙UxGao2A64IS/.#bG.U[lZؠ$smJw۹0c6*( E/+3ZSPw"# fh)$I`Es$qg?@T u@+Jwőj%!݇?m@#fc;ɒ%SuNۘ(n8Nz+&]uK^CfhڂT. xىպWP]g{`o$gE ?3q\K0JがQM n@39lϔ#g]#W!rUČ̈a >8Gܘ}v+LeWz}!R))rӨ/O_Xs%k.:>PXX@#|V`~0.eg֑c,QD9dRC^23WFMeݼc`P21~o‹j(owSńAҜRX#_=>M]:8KN]z5/!E+:f^Ҝ'15njb4kW%_=d0+߭;\-\ m>qHL)4C^AeG v$fh'49|cl;N끑#'2Pg;F2L% ](B{cr5Ѵ9}=Ś5IGљ=72Otf%Mq[Y]P(q5$L/.2 Z?9dN{k(J&BsDyȫv*Z3mGi0-zBpN4;̹\g'~̫a^㳡٣3aZwP7gPxo.f +k#]?\W5Mc>_ gkLMZ̙Kdd3<t_(NҔ+9{$Eʠ6ETKr&@"㿘"H\c<7O}w8t <-,_U8M-W!B~uJNRiPo CQbh*m+ݥhc7݌Y}Vbma&!qAp¬ Xu~Ey _ #hH?NۍQ|TTø oh,qxg |r5i7W J$ty&c҃vT1WLtߜ:18^ X!eng= d" =|j>3k&i7p4Nف8 U@F:zvʼJKrbsצyᘙAfgGnٻ;zz<`X9~ulQX8k7! PBۖ^"W}ŊRk\=SnյI5J8Oi߲@{S""9RZA!*E++G*,0p"/҅_ILg4Y;tfz[[Ǵ r=kCxh2 U.2+1lՂtHX@Z.gi&S@:o6S}i7 =^ #ܚ~[J1ҍ5ʁ8O,skh2Sfa>_M[:CIyψmoHɾlJڐ +RXDl&{B,'#J"8{>d E;IGy|);։싋DA~. U(&>&u4DM ބ"q[[n3ˊ!#ٶgLvՕKO9Յ$JǝW@VZug Th -oy{D޹q17<*tsvbH1|A%Hi ؒiy~=ȵe^*IR ؗR݃` Z (q# =ZS _6XH<`^b Ur>{;T1.:?xL(o\6 KwsSEX#|x0S9:|tLm^h"ΓW B9 4P4z)4eK/"4І5֒0syyiwnqT/4" ίx,; 1] 3EB۽0fh? ⺥Ǒ5'nbT;%,tȕ\O;w ӻچ\ʎ.PifKnqFSPݠ}jX4Qb3 axˮ5\=? r1?<5:Es@o#BEQi j(m<`xڥߒ4q@/ڊB F%-$LJČP1'5%(ɡϱUenZ+a53*` 'S%VjG^Ӭ|W1G%**TfEn\,=f[(xys\'gcEUiH oƖE-PjD, ,➕,MFx.U`0`V:>p+b>D{'`6'\v xh(HӒ'#zЖ|[3ݷnވ`.>d"LO2c91[ǒDaG2eqޏ-ɮ2Pnd6u| RJ4i"5;8l?Ժo]XD㚡КB+*0'z_Ű/ɆQQLg[A`:Q7G9'?{ :Bz,.4ذRӡD8n8MbWUQ"GmT/ɽO<*b neπ#Lߵb&9&8e*gwERta^IҪð9x š`wmӉgދh]WFȴ;.%L'sf3{QOI,gֺ?F8|i\uͷC-]f[5Ar;lRjR4g:@XV-+>)(#xeڱBA>J[<&-BwH.S&՜KP…Ga.rD[Hjm/@*CpCr}6Q*Hĺ^PK#G-Ād 2b7.Vႆ:+On4-DsVhYٳHB\ƫ>z7D|>+"`5G6'MOt"b]19\k)QgtSՍtj5z{EI=u0Kz&b6@q렬Qi4X')E(ޡT; duHXZ}tۑ߹xE߉zGT%rwL?KHao\W~5Pr65  V֘nc4TwKO,uC.g^kTxEKd*ViLa3, Cslq̍^]N"mߏD 9}vK0nqe9KvO_' B͠,=U? Vvl)f:#pG~=)U9yjqW%quǔڊN!.;/_9*+ކp(ݢg@Vuzi}+2żm5 J -3~`$jC%E_=&O_e!TR]Q2 [3J2;r;R2hQh*p];|筳@HO*@y+M2(eB{ OgXy nI-.$3$\Az't#`-R)bFhBʼnNA$b ~%^jӤІxa)@w 9ڗ] M86e, q2( &ra̢`9hkJhUEsZS}iJxŋH;^wH ܲiB:bd췃W҇X aN>8'O7 lQo8-s{RJa2&R>>ʔ騴IRe^S:dk:jɚDy.H?hdfyYٽ,rd 瀈=%!O}()j ; zY_3dz)KdݖÝ9Pv ՜c'!,Ši׬8&YrR1W3&b9hO˔+ <881#LDBsz H|R\+|.|SEMApvtG9YI!rg?[ OE Jx_̟Dk zi)_a"\M~10F5^ ϢRx0E/hNfzw7m%XCB?uuJUY%'A&)AOIu@Q<6 Li!;BW?H:0x}rˤ_0lfW;GV۲Č 0.QE%A:`ܬ/<;!~AK0ZvUnʀ=~uIqC?L~ 7r`g+Y&R\ _0s>U xJD]f ?OLPf`"BAPx|z%s3:+I*hd 6_%FF ȥVH>\2WFt+&҈D|ƌx0^Tz:OoX n,-T:ϟn]a*KJe~Jl- 6IMSrm|Q`4{j>.[n+柋rZwɛAmq}/XxCpOFۘf qV *WelujtIW^OiɸQ8h8FPJ[26O,>U(بpwEz8(J6^ H[+H!⿦1AF(  Eƴ" 5IIJ ߻@`g5醧.u Ӟr[W>\} ̾3"! `Kt-;L8y] t:3Μo,];8mˋ?srE6UȁO i#4tp=bM]Gi~:,=Bt2|ղd3ڄl -uKj-+;Ų=yC8* rc#C#?n#y*wX~^{ܖsCk]b yx ;0 {;E?3!g<: V$@$򞤺T1^cgjs!nEe>^Bvwvapw7VXU +Z"mk/j/+-UAf>ޞզċ`:!qn2@'Ȏ:nf~~\u:@~nZ9Hv{uЂ q#[#h7"e^ڻ]CVx9 O_(0rߍSLEOJ|k䝦F OvOOS{4Z8.g5˦/j3z#TQ Q"(l|rvT8-k(\ʡ(,ƚ9 cA8qxwOTA vJ&Īu/n9&£VM҃sSDM**T3vop))BJ1l[+kqe̲X_(o, 5xH z1x( #e;CJz5:cvF5)9WsԜi!={5c< ^) B[3q{!M[4#ڏYG" ϺI6su"g"G~tk|LRK@ %!u‰߷Orxq֝O+>*G#rnzVcٞ~`~ʠy5G}D %)kToNSԥ;#E4hɠjiPrJ ۂHs-s†bKSXhW8=~wL9 L|e7qNdl+`.Vɲ*w-P5hiF>޵ܞX{GcȿgXcЬexW ŝ3b(h;|TU|'(wJ_`"d#Wc2\7&͋V>Xj=o-_)9V#ؽ}Am/+"d;g)r8>vG+pQr#ij1z\t[1xiD{B<ɮƟBa 2|vE$%^9n@A4*3lTrh.#eRHį. =`67ءeG=nv֨irO3'𾱯N8w9oth͍4kqt4Fɍʔu?7I؋܏MaLIb ?d66ڃDN0<Zmţ|C|M [4 _oeKK3KR[ɯ.5P>z8[! څ.꟭].&+۱ON =4seB˦6i{Sg8|fYHa۽K8GsG$"dgl҃++Q&#뛤"9u3]K1eGD#@z '±ՠ ƍr$7 (E_*FI `aMpZ!4m}TW%bZI*a(_DNdxI#F' OOp}%^l ;zHS&} Gb{o$S9;o#cpȶgdw'g~$ fAf&粲U*Dc}C xWpИ/"}نoTˤQGj-Fi6L}>R};X2#&v強`Rɋ@.`;(ɪ-*[v~ JKܹql#H-C#6uNn.|9 ֡~L)q D>)Йɉe@V`񕗼ۓd{rȪK!qjԡm 7ct^cPU"JKI/6"NeqM C}\9z"uHFYk1 sa4L󢛳UWEԝB޴(  ?թnNq4+Il_spBtkZye'ejI#S)<'6,=SP.j|.\-gE=*uCxq e6^u8!ۂ̝(!a'FAI-B ex~ٻqZQn3`B,Ԏo3Ҥ^@vkb`}Z>Oj1?r$3.~Ao]fOwwoDke")`^D/RYH3}C̯E6\й<,U(O*ۏQ<ԬY+b4T//'}` v1YoR| 1xq ".u A4JϿd-3uP>ە+s+ "\ B3'd. ~2|kvꗂUM5ߓhU+Hk7CCN@tw$%Y2̮7K])㍵=xA1 j"iJ(\VYg:`,@c0T@ɑ!\* N6M8o# k$4AJ$0.ӑ.D#Lrj6.Y.sUgzXK}/IOw;b]HVWy,LJ@#%H,f;9 LnãhyJHaen?m#Rr%}a25͸;Irl+%tP&lQr(T8 +`(UI&Q/ҹmfH<ZPOn "90EU_WFivo-*! mҜ< j'l=]<4oEyx@eFi|hޓ {ۓjLwmWTf#WiG%nr"E"ڄކ땉~vv Ϣb.;\Z!- ًi ծvݢ1/MgZIX_'!G]>pSz,»!S%#3m K Pe-ټڸZȳi8UːtVHbjQqF2)8ho-DvS?H2ؔG Y~on "pFG .}o]:Y7uj!JAgqrv&%̟K#~+j{y5*ӈ4,Æ5f.0D5v6$Ćncʢ+ɊM%T?:e=턨GəBLPimVi!_ِ{KS=ufc$A4R|62Jj?= |C8%~2*/[4Ou7ք4 0ؾqŮfmyV^g?+BtvMMXTm*dt x6, LgOe_>1v2Exs t‹o9E>}Ox9[\%-IG&L&N1DҴrJ A Ig\ݬ˲r&ʴvQG$E6 7y["vR%8y"NXR7M  l,lٖ(ƇM"_hd0 0ho^}pߓ8[TMϣs|bg&:Za^w VX< <)t$[qyQ<b 44,6J[P#ib+T?~n}9O!GkD+~rѵs8_"}zMN_35۝$A~˚eƪZk /2WaH S/m6aLbЋ4;[ p#nTzZ ٻ(lza,fhܺ3l6ڑ$8-əaQ cE=VyKqa[v!ӥJTI@2,jPd"\@.6Ʃq.%,hm^(YTʱ/D[; EMK--h![qczp@ЗڝEK¶$ FF|(eIM Y4!,TR0q? j%8eJ(;I%a`DRe0E(EnK$^*"bH>To1UhžMeFҜ CQ/^=6~G ܗ#E x-tCq@ ޘDQ /6ߘ Lc0m<^ П<ZqAv14 02ceEԳՉʡ}ݛq8G}CVNDn(?NM8Uj 4oK>T0Rt$B}iӖk0)ᴔ}E<7{d"MdO&Wtae>|PRg<PBbdyk,SGюYaeSԧ]`X3{R){P]Y憫VyluGrtg"@c[c܁p;q(#. k%E ^/W&8yHwok!+Q3}?~YGrBAz{1!jjD6asՆ!#n)clJ10YU= bHr*1Y\#Ӱ4c/2mh\LHgM~l 62S0YW Q"rLl(SY]MJ̖ٚl)vdBKxPش䷂y祓-0P'[%jǀ_hüc >w%k@u_qKk1+VR66̈ ʫ) c7D;kX\(YAK-4* vPK׋oa,iDW U)0~ Րlamϖ Ȝ]f.jcOfsBu;ԤhB[vQNPI9R+LMegsims.mfvl'dngӢhR-Iu\’o|aj}?vVy#Q>xmduʑGG۔ c{Lrq/\nP.:^3 } Ovn:0ug򛤹_Lq1W}ѕr(0Uywҝa1RvWЏlJ3ҖDxW턭cⲂ"ٺDf<&!z^z9(ա=j)E +:mN#EMꔒ #8lf`.Lx_ @&[Ӷeht)q" ?kߙb"PZtC-Y,j[;eV/g&*8݀Qc|~r}/4@Z47V"_?kEt6 A,y tG7Y6ɲNO)J0QAɦ) NiC+O4(c!ԩH/@7EG` ZƒnƻJbґW=cW뼥#f7M&i-;WY0_qLB&7=Pٹ!ޅvWlg,M4ukf l9Vg[*w:Fi]`X. g @M(EY!~E N/ŊNyQaĂYM2C &ns]7Ty gQ [UK 2?TS gxV`%rp-?V30l.Z v&f DrDb(`/Ts9^^q_4 (FA ^Rp5z(Tp(þWxwFkZ"*MBE }U63lxHdGA mlˇ럈BrR9_X+oB2r37 V#>AHU`; Mvq#}#Q U=8Z*k†A27@u/~$k(`5fp(}1VcX{+C@|͐ ]4cAxr4!QLMFl+bϯ5P{$|ZH$<M<-_7FWx6SPάvVVT4ѢyӁ9a1,D? ܨI*D#!oQV wȘj`pkq=2 یP51~ҤDZ!g46 kȸB Gu,"ni/;q9՘@V6nU OU8I7&qB&i]su:ZNp]pY@{_%H1#'4[K- rںUqiY{QS*y&ADqnkp唋KYY'{}YHd*P r| SeۙvVw,.$iaL?2%XWŊAΠ\ҫn;$H~,%.%"RXH5/>+iKEX}B6b2ČON|HV.O܆ؾtl픆=rӠRerp"DdӶ~=ЃvGlGE48Z3%?CRZIhG3HY33捗#Id!wZx5_~#}Zä.>u4?0V'¦q5-m4@/Pڲh)}A-z.s/ YS&a Ǿ=2FG(CBgd zq&B4Qygm+n5C= hpXL#>i C4SglQD|_sU솜QQS@=ČYh*P[AG\P\PCI-0X=eRdM @hzc4\yYY׫aY%u媓,%+r O?k*aAyH^!Z^?0'䡎x߶!WGy+Wz%*tc>)B@ń\yųlţU$la8I5}]`K1˦p=.#-ɧY@nͅhe}%3h{7B]UC̓ulH~U,> 4l'P(yzL ;|+Hƛ E_.6}Z͍]uO{ vBf Uv_CNXǸW;ifDv$ I;p6Sn@ [Qz=PqqFE:sB=݌sndBP;E8 jL$WXC:H&\{pw l Tj.:LLۜ<|T[N=\Y|Sa #?#TWK`2Q i ƙp',AW݉`\Uѓ>0xpQU$@N#OeooFx0ط%G.,ěNC-5hUi c2RU{HXJU&wfTi"fc/Z4]&π&ͷ!reҋ@TCif#軻iX~ݴF8rAM!2|neWF!ϮaJI+cԙq.}[P|)Q<^D2쾁: eyWd)6Q11SCMJډkۗ,`*\`患ˢsfzD}*XDNQRt÷Orn"rghs׀m+tqX8G: uLf~,>%2=hi8H6WrHZ8O0C8hϘ4i$tqzt^JAsJgao `Oc*L3,W_%wT-澸F> u>ĺC$oPA̎F`hUg|OH0l|R졻iDl]K> ZV&if@`DBϘx:ΊE!+wcƝ׹E_UkpƶFHyN/)4xEX5]_W(.g8K5[w0 )<Bn3 T4W)J^;;!WZ2١w~ ^2B X; Y3穢*7vmr_/X=*e@f)E.+O";@MjMUh∽0wRpĝdP\x|XHu1KUҌyi)R\18C7L3l%ƪi7܃2˺:6f ^62= H3eg6-']\[}v2jpum I%"+Wj )ZP*$tMpp?&<Tv8uƅi 3Z{:L#bmZp[12ip^f'L? +چ69 7ֲP{ 3?#c Ba-KX17Y-'_ (C,1-i%zA87cdAI61aH1wɞX?B$ՁXIrRAFdz7{M`mC_XL>F.* ~*<d.0z dȇ խFWXEݞl0YPtѡ<М }8>H`d~>221n #ENhe"ceb4V0F㯧LvFC]NX/Neaׁ2"xDYؚ?GN k{`n|6XVeƎ{0;(]x^jso܇!$ul-'t K)3S a|>P̩vPUHcAdv8ZNA`/lQ .>=/h]y 1S;iܦDJ/Ъe% m] !%FόE OKl\qoG{/53dآ΁IDttj^oTB:('30+V@j`XkoCOlE]/R޺,,rW1AUQ.Ph>gӊR$J=N|Txu),d\Oݟ뎮QtO"{ h>D?P9G"PN'VD%TC#%ڬGN@R)1Vj 56OgQ(8r60Ocg/b΋lFRmϽxngy`S |>$}$ DS.5<)eRb [sM.(MqG[Wv>g70/Hg|)YQJápln4ý,7c׫q/=J[݀@h"XXۘ:GU,Za:-^}eHvklc6~ FoSd,e"n%ӗXߦ Xo&#?9Rɸe g2Vw3l$iX(RpA {S_6b㌪jm[m9TrZ 3SZ`t@X1-p|vX,7ᝯ&^~| [ gicG FP jMN[Oz5f+7$ jL鬢~`q`5-GL>(9xW81͚g 8vc|僈]Cࡇ8InÇkl4hڒH@te zwwTMD&r8N0AurOjQUcMG  )2C[xy!RXg{8&nl@C3mwQM de񓡙Pb|hy_< n;cn/~t0.\X_8 #q/;ol܎Z MkD  T(asJ-C p|&OH[̥٭(C**B>ޱ-˥U`k`SP)4ڽ\e6c^L4x/VR˩Ԉ"ʹ2..-ۭK%Z\c>6m5(#sTp6 vn 7\\:LXG-߄ Zz6gHp9#>5~>?̖VWױ6h%);)T: nu/vuh3PVcG`>  vjx~`7=IyLz(H)`>6,L#1aڪ_춃3_i(pcS,fG '{"ȑA!V#8rCٱiy X'7ka^Uk+J,9σ*׎ i+gܥqi.dVpR2AA۪ 6b٤_kg-uR>^3z:cmYK1FOI}be 0 BniQ$ԕFPd5q\PbThr[jwDL <5Cཱི9@ѯ'OPmz_ac[)> µX ؐgRnh>jGnhͧ?kDRTcwUƛf"Hb0F Rcd٨o?KZ9ؠY V:dȃjK Sih*e/! wfm Xcn;AgRO|4ZY#o\4 axէ3\};9SxH^! 6KF^ Sx_ih ։'P5TM/Rٖ`a,yC3QR捓K{Z ʏLwYk wI$vUl/yk:Q `zآ{I%8DrP@|.'>_>vͷn?w`۸t1G:`"ܥEeP"WS3je=tBz*E;H !j; _ TIB~˰0;~C/JTv3>JF(AڼU+ghl@0ʴ^iCI&_ЩHYKbp+5kҭ4KLҵg7qA#7qb, !'(d\ٍa i6>aNa!ѐvm%|ՒBxTp9%D`**S"v]ONgNrDŲN/f$=yî6F-To#dnG!a݊RPWÀs yfĕt̗#27pGy0@-c2U| KcoV0J@~qoy "oH&M! rwd O6 ]GO酇J>tLZ΄q_X c] H Niou2m~,34j-}}~<>9D3D*+*JדkhQpt;LfQ@ Fܿ(ya*5Ҫ`܍Nb靐X:'؄dQ.=*C~P}[3apkHgΙ-,8-0)l)yhu!K!+Xы> -%}yC pay8P#,8"9GΔniœXvzȰl"Qٚ<*H[gBK&bpUhOO׭;CW~KRn6GQou;d"SN@6II(ď@I0.M D ]MNUud~XٖEo 'glL4ARfW4's}~sW6!j7WԍnneGXPrS$쒶SĚx,]"n%uB)Xى1L.JwWSa2Fol+mH *_cbřQԫ8YsuJ647^8\EtrE̬k=#.2Wu::f`~+2U9-F!W4J*zkgq8VbWfhV6Q5 N[A|,`yt$ 1n4eU ߕnoRc.q\ren ,Tc <>o)cO{[En!#hpƳ[ 1Gs<DTX'0 Zhj$ٻR̤23FunHhVԟ]0Kܟr3e0zbWyBOŴLn+ՁT@}*e7a^bCqaz$Tx|_^:͂Zt=4~\+ZpA7bmģdbwGS$]Щ`ef=*GPGUN\|TVF>2QIų38_[L"a݂b?nr8X q>2KL eC08'c'ds'LBUN#tZIKsA.9%U' K̄Ad*=y]b$ /!ZUhyu%VN*!} bBtFȱmS^jۑL]$fZ3'Oj{Dnm-^<.oL \U93fZ{xD28%qwXMH]h$ 40e}a*}P"(&q)w\аO?]%{ 窲yB-hi^U-ets'H֍;1m7 ²cf+&%3XX2+Bq n#NQ9ӌWmnHdEjaXXIBˆRņW2 v!AO2 TAT[]CqyC=+:3{O;>ZE])P U*㉈JGqL&Ml)JM)-3@i8ՒP!|([u.V 2",ާ{Jr;h$q4uDܹ饗N=WSG{Oُh":wpʔ g T_1SlF*Te]TM/__?P6PI[2Is.\nY;Baq c#~aUCvP "yuc}}F"no{I*B(V8\#O6V{ of3VIP#|o ,Ea1 Q}7֡TagVZ}%enMf}Z4僻A5h \< 5ѮU2ٛWR9e#xtH_vhpP#LXܵᮉsg)0<D=g#!D3$lcnAX-ƭKD)S錋t j;U_W-%~Mx]&"}̠cߎ)~dSK.T=j=c}Eur1knәM\(m浕0w([7o)/}\8 =EQn8JM6 Xz&e$ڋPDKֶI!!;X0|qH sdnsYPLJ ySvNA~E_LͯfM軨u}©|]t" ֓ 7wI"W vI)Zv׺c7M`(vfy1;˗P 3SN PјTA-@9Ι\~p׵@:.=M>L|')y/Z^k )\դ}~Qi XJPh7iۖO%kR 'SqCYEt3S%QYOAh݄{w(]M jeci]V'/j4ji7n7E*JZ{eCuo(5 mbnc178 +(b˺mFDodq"} t;n:GH;}uRe dO27b,g^G".o[Ծ Wy|sP(WҏuPK=k8'klga~fJ/ZIb|$4,j$K*tqyrnzs(_/ݱvuI[|޿guGY Mta!aH; |Rdg` 3.%KRd#O/JtY6+id\z,`U7+ʃ uVd;Dl 犅#ZVAtQ%40`qwb#"үEvJiۮ \*X8ߊ[u]}8|P!(hG>xF&nZu)]0h< ~l@K@bNbk_f54*0b? AFLqnaQն9TcTb2ġ qr |Lh93 8ҥWtGM$ݣ7/&&7(+gI*-: Y+x&I!+^'n%(jsJN[[Mk $%n[OULLJdk Om X.*U2.Jg1@ N;C_F'y'VuOl Ŗb%\:?geqEO|gCuT7$X"걽$e@η 786W Ї"FѮR'V*r1`xVOV/ذR&b:wJK`]#ngѬFt)^XVƻRNj (>؝!P}-ơ5wU_$^%ȟ^(}w@ILlsQ5rdˁpBZ-z"9Rϖ.$CX#77rHdIėf |J` >OOaTTP* n`ûsNfaWbaHl벾 ,U֝ӀUrb-y cIw̜^厥FJV>ySu/n!:*+]2JlɹQ蹤}D6޶J3q+1wR7zI|~_ 0xfjA$ޯP4F,%lPb-a C o^"&"f4-E Yb6!c:DDi\[=|>8ŴSofO7:IÚ K_LrPwU@8spDY˟T#D ǐ[]Օ%Y D]lkvsT`@5ɫeR/).*WcE6:bgPSu%"UW{@VycͤwT{5I&Pt{B9GkˀeaYw Dϱ3mygOd=dzǀQh(̣ d!8F Pz| ]̒b8wkP>5 g>?KIK+Eqԛ 7yuj%jYa6ɛ {$mz(_UtxO =뙗oȢ*86Tש YH-" ^;rJeM¤흚=d"٤hT)(=Ya:Z]CXH>ʺ!rPl6b05 V[CW![]AE/ǵݜ ̔C0;^q5C=*nE_WW}:)]qCSDDwdN#Ǎ 8,N?>p<Ē*`ҟLeXРo#^,*%+ }wOqRMjϳJc)>f4,~e ([/1SF UH У-,И܄MSTt ǁFښE- B7=&d#F_PY3EǠY =@[o2hדȢ-e `RUPWF;/4HW$e1D'S&DITDk$7haX-I v."{δ[*}?9 5x$N\ oKV'(74hqpƟ6?Ҩ2x\Evh3?qjwYM2QȑF ; 0E\LkO[?O$Td1\GNKHHj>=ڬ҃=􇪛r3.!նH)AJYA˨Θ~6p]5i4zuoPjSx"dzN Dϴ,$GCpch7`d<%M<-꘴_lpr)|;6B v6=eʕ2 Q%Vv[s\;NA6#5lKTl ߵj~&Ĥq- # @C챊 =_WtSY\h{<Ϸ8%[O`Zm v'<O 7K3-;Q[>>7iP"9뗘^u,1!؃uj4Y02L +<۔ I.vɪ.ڀuy Ы-( +kjSDIrOPePrh(F> ܛ5jXn(z 8Y\Mm&En?}xn ߂8ogr͈9zwA] GQ4P?] >ni|}cE]aE4`N ؋q$qG%=R C@yN:K:+!Z;-<>7g+eԜvJ m‰yѤkWe(èD~#v @X֠:%d(dJER] ەO!'Y֯x8z!6AaFԝRغt r%SJ5Z׼JB>ԇϞyViڰM2;Ȇb;WTP ۿ8hH ²11C0GgumcVU!ٞ$=]G& Q[#nPxݡ>No&:P}F:qڶX0ވuC`;ĐԔ寫(D r. OUO1:1/lM=t]kw|(KZ3iO Jt"AӤLNn-$ iWn"ZY n9ott3؉sO"6ݪRBQf~ʊD%ÀmGkQyv~K/j!w,#J 񙛿QNՈ)o\@#t t-$/؎Z;p/MI@0B[>)pTļQOE:e K޷^P-R:`>OD: ւtJG%({%Z> Dˉ9g65ڰ&N0-d{;>J_z_J/_@d?~it3x~1v3ī!Mi%7){y)qC@4ZqwԊ&Ju_ȸT4]S b ėxXQρm醱7iI`sEC{D\u[ERZa:(7Xϯ?-;Z+" 1)4 ;YӂОO#S#,hWKݢz]WO;MFҬ8L++:75K۞ƴfSmt(b/D=6'?J:@9MA# ˟"1`E3q|b)oσJXW<3G0H왠?c6:LcpfAeoR`:xhT7I\ߕ(>$e]EX8 +w 8lo-dDz:Tas>66;_1{9,(Ʋ?,CaICihnPrUGp ;FּW6Բ, Oڛ4ѴlAϸ!]hS<, 9 Cv&?0 QL/ieFv׹@r4 $jp'|_L9XאLf;h7ߩh|?FcG%=; O;:(.x3:3>º1C+{%ON/E;|ү@r*=2L'䛩:HVTB.z1ENi{ o/Pp{q=<}TQ' +V1iCWܓ]Js3;VRMD ո)=?&] a[:ÄK"T];bu#0 qMhC},gtq^Ngɗ%)@u\$vC[2+M:\s6UK,U t^_"䄶B= [ExcE?gq73r؇ amل~pq˓}lf?of{@I{9hQM3LZBy@e* ؚ+1(e`psVgٔm`i/߰u3j0TZ. g!8s 7˧p^CI2ǙGP;'ZUPvXYnH}/g"kn4l?o\P#_ sl)(|2d'ZxiR8'|FTb+X-uHX kf(٨yqXȻ5|HopsEeAiV`n!Ōq(d[h L.Hܠ I2Pw 7h>7<+$4x}c~G]}q7@V0ΜLۜŀo/R;iZ:saKcge;J. j rدpwho ^vpΐ=+|61\/4=@^톔c.!u~Rj(|('uhGLXz ΉX7eLq;OĎE3d}aV3>&h7?஬n푟bjy d,W{=U @MWu|"!\9;ez¾ʳvg cO`_`oϹ.ֹH]7"mSUaCݪe>O߾xii)bT?mLX'׷ըs;%U"#ݜf\]mV~>ojoҼce3G_/} XhGCZv(|T:aZYa̭7vzh7 GOo1LY/ޛzUL\:4{κ&*&sex-d V0oX6=t ʌk,jTd%^$\jf[\5yOC"^x}Ţ)u&80ocVMjaة `;DU ߕwUU ,-`/|b?h@n!7ݔNh{7Z% U82YbobP\rI_| DoHWIIg/5$vp ,ר2G|:??Tye5ߺ|AyJ xcS"nݢ~h`"ƑGܾ ׀ -9¤d~h~cBm]ANlD:Z犩Qv9͢RqhI ZP\!i%{it $kFߏHZJhQ`'2q3~T[0RQJp ,"@= RA/_]:{pMwjf5MD|U_0nU 0_;.h3-ӵl4D#,:ִ|LVP'};+kphX`.v X'-LϚNJ^:DFKA@c|8U2<*-tOA4˼ԘY6m5q+/1D;g C5yV 6]7$[ٙB4DȡGG_ҬX/ș.`%:/)(NyP?C%d.ǡ[(|BPU(0/,Sq%Pً/an=Zu}fJ&$j׺Y! B2 [Wڟ\:b&_ܾ Iߪ-D ) QBY?Ws2Mdh..߷S@yR?B: _ބ1L.*)5]QNnx$N'$0DF'#)C>̫07L-a54.?jV -k{LwUh!'/迎`5; MTOۻё)pw)9,9YNÄLoX+ |ڏtK@,ÐI mSn+@.9,W~)@0FwE,̒Ah\33"PD&tReHVZuY.h{/WuKDL@.3"nrMU3L -H̿sh,.s]B+OM՜. n0fnCC@ u(װ|nsea*i؉2wlW@>߲71ouLŕt bZpW @V@B/FpW;1mk+kŦ7fԭ^O ) ; {@B}qZLK5 aD12T  .F˼6jm/͢9ѨLtM,JI-pkZ.>eGQvHS|3 lSI|α@ٚ~ 'R}.dJ{:H֍;:W V~.ع>ؾuDۮ7~ nA|f-@M04:kI)0 >& ij~nИN<ݬk>m2ox`N Tn~+6P[6).M %0x<߳B V~u'L-.f%2.dVc&ohfͤO7zmqzk&pw/r4[IqP"89rdc}̈́$`ɽj2Ǚ w ( IG#=P#ģ/7ݗ~>-gϊڝ$sѼ&JASژM aJ(OD$kq3{tT&y~%b e)ߩ~r&'{-] ^"e;C8TdU˙]›K66/(?Hʶk~U,2 ;rC-hg[PD;HƴWoSZnׂx؁ZYՠ[E3(vskԪK(p?|33 [GQd5O< OgH Wz1{D*~МṔ1u;^H9B7lp ϿV: ز W"R%INx)+ƾ!S"nsNDžҬĶWO҂PE?-wq ɻfha P_S7 EBo`T |XVA$_uG–i^W:ps=U[ i,\I&@L%8HYꡪNN5, /kKuKȚGYEM vг }A]\,.㉝V/<)(׿é/ @-X﯏)pK\@bЯKŜ.%Υ"#Wfє^1]z4|u紩,}K]+U QYC6+/Pt1?tRicV,+@>!|^FZG% ]ci̖̇^PU$PۿϬ7ј'hwxcV"Tޚav.>)Φe c@A"a# ^^1Q){zC 8*YYSRO%o4g!0HG1g UCS-Ƿ0?9o¿]יF]Тnw8e{ϐs?XHws"{T&wd(\4tƇEҁQ4Ī;|t:0%nxf(ij,P"Hs$Ig^Wɰ< x +*zTk=I,\1nhziq1x'pSeNxRYN}aYsӎlΦ콃ϟV9(@914 eMT\'_qkP |*"0d"v0n 8I,HQ{A%Ÿ)4yϙ ~J5ckdS' M V@ ;v!G־Mǽ &6~]6RUN:n^JhVm;+dclV:7ԇ~x$GUHnSS y(~7wt0 dfT{D,qK,[%9N̄ލP8E'=o*>wCؖ0Bx'Sx _| G!%ЭqhelWٽDQ\4Xp$֟Nfy?mH # #C ϲiBCHƋEÉ?)q!$VKU@U!"FA6 V+<֭78ƛ`*FET!(DGRcha>sՅ؊&5%l̈́hf q}^ֿy){^UTAy bVJڞt@ӻUJQ?0qb`&M[cv(<ɿT'0rVV꽀щfg1j%>jR7؝Gvm}9"JLRh`tq8$|}{Qz!+  ݁K}^>[lmc&U\~: Ym:Y؟K/-zloW{K:S!$߾Ncpމ>{'\p==oh.̃д$RtP*&z}'DWJBnPл8'7v "\c$ЛRlO&VƤQ]Qr/wD8VYvfrO#DclCq;V9^@u4 ;G&.q0j#m #q'ʣ8&ÙP,C[?[Je46Ɇ*f7!k%YVQ܅-U@u n$Nb4\,W[+.Cq'Wz݂}vm})f5xОbwڢ j$eIq-N͈z~~(͔JݤS@Ω~s]{vfT߫z@ʼYUcpQWa˅hN }[uwq9'TaXλ4oFrDr?LbKMZuBEifpe]݌%Z=d6D :~*Ɠł*pݍ (zɤѳ/_~OZfd?x!`: G[Ymq/+o,?jd. /P 'P훰)$I'_u?(gqHNd _7*qHu ʯ_pT 8 kbjE?"V-~q2\_Q-Zz$CDyGfQ(IPvlumԾ)l(>Lx# ۹ ||Ӝ>$\lW*ZMBU8q,\KEVUy~fT )Zܑi/kWiW苂~D!2Xg#891NJ𴾳} {Q fy҇?3i(ts[Jb h':.Xw2>7t sfW! DTdPrׄs03Ya)g~/MJibq6kLpg`2!]  ǁ v6IB]9u}%#(߅Dt]?'ć`g ltAKNz-}%yE޹:rܦϷeϞG ۆm~-Tt,D #=d]?ߝ[uFqD"- a[TxA5;qYI% })KR(Ԓ} vxѩ'Af2f kj!h@x6冃Q!mű0)zjm# x9QMlk%$`V1<@I PpzT猈T@t/a('i 5\wcmU}_c;%~5+SLp?אe}ū[ULw$co/tiIU"BnA/ʶw~b~ >dRl*h5EWrhյRvCd=p"ӼjA](vx5LM;2=K^qǓaXΝBHPYP '6hI]g%#ajNN]Vͨ.UM 5KV6K1r$uI 7)BI 'I fj_QddAۦɜ/u:NFpv)C"^/IZ0QVOCmMU_j(!m:9O$:prٕV顏;^s儾7uð=e2$R-JWԊM YpS$9C :Kݤw\QHO`iQ Iヷ1m[݌j&8aW9l͑,;s CvaBsm=K _4^]u[3;9&|Ҿ/Ⓖ# G~;$*Z󁘒ќ. }V/`_\٭blez.(= n$ĤPph84 ӽE'}WZՌ&P>u &|7E t{З+[71Te&bڜ0&!h|9hqAMku|9:֡RM g0UұqlJne]Ѫ 3Q˷O4DߍSI+6jRM8mp9tez`/.AK!;qPV)&,iYAQhRya%39h|\iLxxE엵!O "6-VR$!S" Bl;miokw^rLLKM|n \:9Vޚ`Еeh_I9A_&gFD.'OVM0tjMCA:O# yXPeպF:l#ET^t {3Ea˾T1clZ\Q{Kh`ďn?Ǚ q>=}߷y.ڽ{P$i}T4s@؈;%7@ )ڪ~Sqf'RnSi\t:sSAM>Kw޵E58IdAVtiuQ@E۽,w _kt 'g#$D*7!0sF9Aw17Ae񶍩?q ]+74k<ލDC[~aW߰'c[TKx }zJ ּB2-Z岫TPtLfU3cz/8W;YMkhG`]%p Eb ,/_1fy_R_;x6#2QnBkbфTK]K0GشiE-'@Fz0?O"Ò^eu 5р5^o]=֣R[޺FD`&gh>zWe / pm*%ipy&RPAj30k+@aF} 0&[sW y$ej{Scrܲ $Mq!WUyi:4M瞤Iva,Gz:[dȓ0č!vyCI? 1GrYFct žw Z?@Kqtj'mVEbO֞Õ|bU*v<ɵ?ġdLQ;vۤO&"OL(C/*!29Cʜ<\ mEmXOE8xI?f?1 mB稼<~%&,w~+pp AX-pS:se:q>KZʁ!FFf0D"BʯBIj W3U&ɣ?ӣCoIxrmyp=晗<0`n.Ǹ;xl:/F0r=Tx(j6fDAZT~4fHՏ;Op[ltW5vG#:E~p1w @EOQgV6dPP4~N{OK|_Q"QMgdPABXd,_s%C&}BCf"od IS-od&;WK?֬+· Gƅ Yy'8n`ŬϨ. ĉ:r<(ЪN=bfyk\F_g4}Sh;ĄM~EYB|2g֡0!p{Dt_ckgDou_H JX]jv>)KV*KaRCTThv|U@ly*}T MZ>q~XC௸ ޶[$"M``]rQpBs[D;@AptACao?XJ*jOZ[V[#ѕ\{FWm,8ɛ?~z)…rpӡA!n*5`;\ Hwo9hm,$)AjXԛ8(}s)t7`/< Oo XWOm ҞcHgKuvj\ӹ%xb4ľ<\F [7*Mn"FGn#o|p,Cu}a{5!aޅ0ٗ)C[K yN_U~I}ɂ|bfP }%Ê .?OJ=`}a9Ne7Rz(f&XZVCa-6 LTqL*!ibL_[D/ #8_r8#[ʺTSĦL v;XbtOV%۬LpNp*p 8 㲆-[r˛j4] mBU=$uĩ -e9XKL hv'׌92rh'dHhn tn6ctpx`wYI Fmir(BL$RbRH);PU*t/4M/xqNo1Ky4;jnOW5_py-D\n+ VBw[lqKMY2O-}*i=^BAajP זaZUf1֐ދЏ6 _GYtn-$h*E4dR_w;)"S zȵOf5Yی'-u$m{Xp]Lm27];pҕJx?*Ua֟lȏ57{ 80^"2}VXi.~=)2PlAlۊ1 ("1r4M>h=!^Sꫜ՞c^ς; %“/l}FXrOm$J` OO|6RCtx5 :rcԡIspNXEHxf䢟jE>uGTWX?Sv=|5խ`t#kcY.i3~t,9тp*N >4S- ?#OeV"Ed=+DVgTqǶZI Dzs0Жυ`1w?G缍b<҄;њ+d`CͯK`ϗyd9]9…0E f.Dr[0.#)3\iK)6`S巛3d:ik^,s-G|HҢŷC7ݻ"QԄں闼nƆ~:XB9 QݬV888S3,Th8@OΫ2S =LtrGZ]F@a>bfmVSM2nnc=(wMZ㩓pb:S(`BJP%HfV'G}ZїK=#Sp-rid`{ew)vCx  af jCE붝@|Ih'u@ ʒ-RRV$えK Nt M. |~ - w5+LDמkd̐RyHyPkK=5{fB0!R41.PcUAJOcil^N94 &ńv5c2¶>ڝW;:*Xsu .KmamE;#I&~VAw\gr}?>ܳaNgrQR4<`b$>ߘ2Ȏ ,:EHd۾Y#i#P/XYouZ2 J>l覕*vS$XT5ObێN97ppl1SHY u""?esZ3b`';3G-E/vO![]%WkfV.0' $W 0JkZRcFMp_N|a,>#h|IW7 [XuփVu$d{`fU h.|M  kb;їxS5Nw=>WFDyqH qv.M.JI^tl4d?j@5ō`HyE7qa'%2T S"z,Hn*zGw@nM|`]&F֤F$@hb{We#1E|IUzɣGPD,t`{ˏW_-d um0Ͽx'Ž .(6F+f  & !D4 Y Kci^бm2g}oy:z^x9M#(uA9$J\_#.yt/wCZ W">gAsP9v:>ն 1*v|t84~ɬJIDj2uaxjxT!-v]|('r$u;Ԑ,T]eJVn67e4M5')>UB4uP@XwfGg!SotdmFk|M`b3G7{k=1=֡|[ >[N wĔ]u^6Z~{a3~r/z*M8jDJ^ǸUl,WE@JΊ%>rDZWhj\1i R`^ `t9.qOBm~W"(V0W.|w#N[[o`O3'?,S;E#nņr;S .-6poe1 lݮV؈`~(&F AA͕_{/m PXU&ȍ+DߊXm<ȿd,++6 rc޷~7f]8vV%ҹ7CF[-ps|Zb{+g?h % { NzqPQT&lZ[,PERL4S| KgfSUI CӺ%CI冮اߦG̗]v&oi&Ra!0%j6bKcM"cBV 0> G78Q2 ዻ>8p$@g-fqﰯrUKVԌP[ppLDl Tċ98-lD<I͛B.HgrXq  =n] UO_!1~D{J.Dߧ~E?ν +ξ2M?܌ w0A Ά7eoo cvi6̒bkXR}NqGTzz?;q$qBumUJ9H,3?U7.9r9SJlG;%=7~Yahf,MȗET5XNP[]N8="(c#[Jʵ^Kը{H6 *4KДÝrC k0wyBSAɭwJ:10Dikx }o_ <弐])ڋ]^D]pc:ƶFM\lIvOOJ0},xaȵdYlX iluq+εӒuh\2CL\]".B`]z&pxGOkQ' GRHU<8r(ӻO!s!hiw{*"a9x6l< <-U+|*ZXl\voXG8+Zg_*C#\n_ԟ^΍c2yH)R[z IX[<&Z8.t-њpDgPX%r(Ҳ:BcPiS Z򨅊̓%MR՟ @ՠf$aNj2a3(n5K3L7["X`EMpXr&iCԐDŽۭ`DZқ)ѬȷLZ1 N& }] gv s'߬]vib+`&oV-ѱ$L1KvI[A+KFFEiMd3Yֽ拰ՠz}lK3(Fst1-ԻM͙#u$qLOwQb|4='I9򕏃l]p C@ +>Ӱ6a^&-<])2@n&P )luwMT.UaVF`y #ԏVoE×\c>gWFkn41qy 2_ɘAr֦=Lz1&Nh%vH:+njq[a/=|ۈy:WFE:Sݸc4V s WkȐ!ӠPͦ?vwR>1ZihŴ;imcsJ[ϱ%4% H ZU_dfPP4MJΚXDX026۶,CĞ!)]YwXfb̦5C kbOh3׌&Y ŦfYa{v&`'b9mp͸^ai;[uAR`@Wu&WvpXw LYexQ<6$?/#[HA< 2ϔB[o?mdTDR6'nK~bla`͜` GUPְ?Sq&|!,btq1f|S6l\}WKz5H675E?؛iʡfſ<! B6|r1RpnF J1a3_V;ҝ 2_SA?0]T=k,2:ØZ(tPzj"i.jw.ҜU\JBR;%@]+| 7j u>#[XEAzuu/qڸJF%Br_q)9JFH<ȳXu7""Q cQ~[lDOZj(nً@ޏuLPGcu߰'SUZYT;|y!GFpp#ԡjt<8F=u fi{q&8?N4Ɠt+L~>|dd=φ58']PIN| v52r5v~k9/.?3R`ЯQ7$vd -C!o<]*΃ϳs9z>9)uP]Z\JHdx8Cv6Л쌂1dQ[jeY]s;3xLlXL  C :cDLNr{j /`( QI_INV6H4?oB|;B{hvUp! 0' EKd_7&bB Ù9h1^x^f|sOy$ UXid1}ǠHڮ1K No9[BoA!g3cH-/WTp`^KC!Z=-GK|{O%8p< C @`d=Qx*=VʙRߨ0 Ĝ䷞Z8$uO}`hR"R^)uZ&(MDsȤ{mjH Fgݓˀ1W 37:c;^qR+^[lcĆ-E!$1fg>;BXhp4*]fE CҾ嗕gS./uG̖VJ0p0Fzy_1wacw3UY+TV%Y&FDgVtq%oGc"Xho/OSƼ(Ou(N>ɴ~i\3S ny7~+!"TnWq-(9I趑`~ׇ4,ii$eQ%;_qS UQcaR ,)NToo06DkAC4CQ螞((s@#{o*ԜLПVYa_F_7B:U]U+aq!̡3Q]erģ5-|)gf ŵr'DI߃. [{uMF]V#(%g0ݦRӓ ^_PfB59*6d hN~"{@-?;5Ssh$F㕼?3,εcOUW(t]9$A%GFkcޢA|a[,{F}CیMq#wMuꓜ@+'=y!&;hKR[8IizҦ g[֐!eeX-G\ Wޒ>WyY5(n!uqR!\* v 8^hO%Y*޼28P2rB`ni)ޮ64SRႴI>Zi(k+ $kD/w:g&-޺O,K2:6=[u[Ҹ+Ƶ+֍NK@Ϣ7 ]jrڰ[Ƹr+3 #&ܚ݅*`.ͩ: oQ=fec_s3MZtUV(05Zsnlb(NJ| Jl{S?kY257c<\W4|~ոɺH!4I&y)'QլFɞX!l; s"7@'̲ C>.۲a\R$^ۖ8$B,Jz#P]גe8`>9UZg_VˆتГC+B @Q:LmEM xGE k CJbexKCZTph7v䕋nTBY$g4~}W~1Q.mR:H<0!"n"IB?r]&r-;f9m^# /n h'OP{z i Uo3lFH~ʡ;]k:Fd}{֡a%%HlcН~lH$Jty8,ͨi n Aܳ\oD/4ȳd3/EN;r:a;I?/f#>Ӯ[XL;՛>_tN(҅׬P:M0֚]4gzA"Ltq:sC[isжXR9_S | n 5jO%Ȝ{,%I@\9" ka<>@YTǸ 6M$$҄} &CI fz|JXyY<cL7""FG#iҏf.WfoFL5<:`PDG؈5ںatSNZ&~bTP8{{K3䰹Du HڋKe-r޿eIrZyflЪ w_,s ,2t5cXV<AVr<#t<_E b`s?Wѕޕ狚' a럐8+v]{>= rQʁaZ \0h-\O[n*4ӿW,e|G !RN![l\\Əˉ(=u ȝ-BZHޏj~I:i0zփQq-?Wp +Nx.e %& |EOmnPU JI|4a(2&GktJg|m<ڬVݬ 6ݳqD+qZ8>㖕t|aV; jtt+D=)Gqi{pۧٷkJ~dxD5 hЀV⛎e^\RqYED38JmVc^IPL~2_7..eB`laco0x/h^%VRUK.]+S3dzׅYCfJLB)#Ȋ 3BSXrF5Bf qYT سQgJ'P40=8~2pwcA5e bFJfc/:9*%kO=ֳw* lHEv~ JL '҂ZH}w~_wknxi5Ô}HTBucR9@_Z2XOTLEtthZG#w?&KaKuYwg%8Tl!ܡô@+^" t*U7db;ljP*kup!l1w'{~t X-{G_.yqA󕋑mGCQKr<"qq }wʩ.3%nqk_V Ȃ)Ji8AqV4n.3~zѰ\hjQ]rmV*8S_o[6_ V4q 1 aIҗ#yƈ:\'X}#:_=u >!GݣL_xXnt#8@|.qNݸw+(knmuAӢ֑Xb2Bg~ӗ .zT,^mX{p؆,.OaOHCb VMml^l8'yԝE6" %ړbk*ӉBkh G(1p-ߊ7<[m:/hK%xV\kkqMΞm]Es׈ xSXB`EF]34ۂӃZaG]-hwBʔ_CM+Cn<4+%2˷5Go'ϊDjd?ɂBeLo2+CŜeI5P֮ G+ g:}\iOǘN.@dH|ˀuXK|]7YuNic$hLdzv(~Э{ O5̏9"V)x\HWJf9h e1xy'u3#¬p>wk-$hEqC9ǵBMH=֛&K ޔ Eӱ?_ĶTl?BCς`U,!HLwtE9}#Jd; /"JM ^ dZBȷ#~B@5]FL1yXLPNzaEC,+^^~.Ab,7 <]U-l &z`r@V |[@b !u#)! ȡ_RF{lf!{ogu9+AF 5LBv*(lY6C/S~fe =='*4o3Z\h*9[ E+%_> G.7YX0{ypBE^E1^ꍘAZox LtAf8>ݑO'tԷ/[ |$1)'|&C\ xZq€9ѡ1m+ uk;JOa:l u9U@ k`vYL(sS+k8{O.߿k|ݵW-O{IߐV{V.9E)bܒ7]Gn԰tRVa(BMh٧Bs^r/$-d F?ױv,'F/|A2?r4qp 3/95>'Гs}}}p.Dڍ7󔻘Bu*" q6+p3%Zm>{O /ow&{RQ0-wNn~@ K)y,>b+=`IoYb]\d(YXA~R} %@Su?Gs[s[F.&PG١^R W@4+!={I/11V\)ޮ\dKA So)Գ0u2D]E w;f{/!F` &[ &`asCsV_0 Vϔ^ɣ1liǬL}duHEqRص\YQm6Ϋ%AU w$=̀YͭP2s@xŃ?sE8cX#c><<ʧm)*)k?m]W0N|*['?f/))la~ /yfoxK 6m4?d=OG64<4S@fp$W& p"1P \\v2a[F"Mj !s::;Tָ"" |UX}Í^KDkUJn8_u^記DҮ :-C9hP`t_#c; ve Myq [WWS3+vH't&<>*+1-wؗW;=|+@%\tmfQn9.-n ugtZQ@գs"Kz@rB:@v$xD^4NsVÁjR diBg8CO/|ԇL42䯮24~0=p_VW9TF3|+3$ q1xktBC,QL^s!4`Z4#k;0P[n} Xz7u{Z7rbeN'|sy:N ) "mX} x[EApDxː_*1|9(P>' Onp\! `נ@ -*vym7Ey fMIgw6@E nG @”u/9Y}eTG/%{C%.V?' BM٠_]kRֆ \]F5lu/i]eQKlrWGzWڒ@PϞ85ZX*i7myCΠXrN,3&cX;t\ȍ7Ww;Y h^' o5ą.=mJ\j?ߥq}cw)K0`&ո C׿;ƚJt2!NF7 (`SZEvW~vA ؐZ;#ӻNޕF B=ڗg%S22?c}%yc}8f\]6T-.RGP7poEM˔\"b6{c:5-Ӕ]T:95H|$gz`H#n-Nrp"Fo] ,yW n9^meM/ Us=m+dPiAGN-S ߯2 τyu|*=30D= d- IPMє r֭0(fP6?ÄЊa9cl=I߃Ăjn^!^@Fykee`Wݱ)锅ݼ7=7k?Ғ09Gc u9)C9֍;*4*u [1_-+-JY(eK%iZF#&[jfšiy"2#|AQ;e!ڬJ4^Kf2DfbƲ6#t̝TVF$pxvjF]? ;S}1|ٛ?tBĸ#&rW߲iYmWVqEղrKT a=!Y+B.;Zv څR}.ޤ[{'!hp9W/¾*WL9WN<[u7 BhBbA"s=Q{Ub >g+opO89-XČ<5pE_Xm&2B[b6ŕ?Ar]ۧ myD>v1l!AÔNH>_'[~',% q(irVr=/7!n|gmW㤕_D 4 D<#*v;VS]Wꯅ?K:=alBٕDPbdYS3a&ćTGL@+YM d 4Bd$JN9x^(H!npu_sk2!hq$Ƌ?qA}|uI擇@&uQM4R#,}JJ;-6kp sfQ@2mԶi|eNDž>T\݄4ߚ)/9QƂJ4H)v?9kQ8( G-:ɾN?bޑ{䔯YvZ뉝 O.akAk얨C*{PJ(OO3Ǻj@0:F Q*v+vOѧ>)| "6Q33&<0itTxu+)(.Xz* fζde/ :Pf1v@L`R;s0~##BGoϬb^=Nz~1scS-J=46:ٲJ*|,! T]ki^= }]- j·d8V8iεJVD,}l &B:Mj+scX86PG ;pO4 x \ٍ%&(У_:a}85%: cQK \@qU!# /:r4b/ކ.F6FN~(Vx*`nsǃ_O>nԺ=hLViwu0fC;ױU({m!mTW9Wb${DsO?:U,9ÓYũnI/˟Eم;2fZtG zDAghyNᯏ} K)Z@dpQ"4"W_ \6k@?BZ ~F^gL~}+9NSkR&zf~"SG]1~a] 0#KHeS_PI瑺؀!E.܉',VEq ?Ga\jYvq |lg@! I dd W>*# :`ƊGq94O/E &VUݐBVK^͍_]I961t%w3]RWhlN 7B$qKqu.*9fݱwNVfkNpً1:g&2el]6Ҫf6KY(,acNPнA&XYAEM1IC5(V0CKL"Xs fi;gp ׷Gc-E٬mhfRmA#tbLߌ-Y*eeNf=2Ĭٔ߂룛o$pa#bE;jxW+3!_%U-ҲDuTiCz+R'T:[az1)>V.Bbro_6C QWQpf=cjTcTbq:])OB9&F8( Q BM7ұi R|WJuhPC@|lAs3Ɲf`Exg :pP.z}p@-uh`"`+a g@DAAEPݝPGsh(hîZqpь u6C#ΜS"P#A- ;$+xHG"-#=h_|&ŕtZ<.|x+0rq>6=uo( |%4dʰ6$U%ђɯ|e/Yw>x?)\, hI-f[Uydd)$w͕B[ΚV~v$$*kn<*'AW~7)1',#bɉ۱es@>1>9s[ߴ lCʈ<پn#Xe#p}8(UԞ "WF \]x"8rYb tj/:NI2~&¹k+jDnW0m/  S{%v'BEsݢ.0vdSx#ucYm'u'-k%qwEq?O# /&r<%+;v=[C/T9wY4C=C PٞgYj40?Xm)a%n(kܩ{mEe~M\18_.$ЅSZ|]nXE˵ .Rp`pZ4PQ!v6SjLhs?QلC1"_h)Ɍ=/%_L/3aHCWkӾ螿{5Ld8DzUg٦'V  4V@0#޿ 'Bą%җhzxC8",aDU\$Aު'$bǨe Mn0^Bm SHpZO ,}̈tNT-ǂaJk n=9IO&K$BM=k޳uaIctbepze zaØ8#+SXڑ68R{,В㜐H)g8d:iaW%L ^f2^vAt%FatIΦpz ?`~AP\!#^8`s0#cM%g>z)ABi,zqzo5 %PvU7s#Lݽ:'^بuc3}\R"&XFݨߞ$UyX^gM@I ;5M̃Vp--ЏJh̅׫7\88 qkE>⇅9C(qF)6h:>x8;Ɵץs73JĒMMwWO94g ._άALQDXJ92dqT]T О 3уTFI\G^{Ѱl߶,N m w.0@[p$avOl !*){17>x~$rg9`|n#T$!%zx5W3H8ݴ;uoKjlZr+R7{{lB$'8PVTWQMj0 frHD+ȌQ\.Yat gY\(9߲lbp{|7i3(f%86~/pǐKM /ߚE4+j+0~983ōiCfOrE-w2(K͜Uy0Q%К`~KS' '%+魌=57x3WI48C߉S^w~x؞oeJP'¼oX!))mK.A4Ī;a,liLަr.=h5Z#*ߩV eޭ&`ɖL9ULlp7K2G(iǪy=EɎDo5ly/W&ӝ 0 >¸͚<Ր8 aw?|*ٝUFV}oٿ꾶)j∉Ĉ϶oq{P0֭3ZA#T{Tz9bäԷ4m:AؒQq wl[ wkR_G.SyS*= ![ؙjQ{uG74u 2b,`Z,~Mf r,g{9z$nZWw{@6]2* tTU`O= rKV؂Y~pMXqR_Aŝټ ]1)he45Yγ-T8$}+H{E7&U*ҿs xܥ_{tt#rxKthDɫ4^Aȭ+ )ٕ tۣ̂XŕDV_*mmW|uXјpBbfb7FD }PT)i[oa195Jp&rrZ~5㉧;ðhDOՑ/c|}.g>/Ǝ@f\&>RR Lq AlRU^@6|@*JĐ ԍ;8Y\U<Z8wYbeN&YsPؕr v)^/>t Qbqo歷HܷIO_R{>R4)R'0:\CD >y @R[WA kwx+7_sXg/1l}lm!\#]F8(fɿ_'V@)\"k O{›ЊBLdq;.EeoZ=31IbX\)YҺ_y5ּ a;@EUs$k{btS 6_BeEZi/F?3kp|: (gɅ|Dsel,}B. Sid؟m%4Ac(V@*9.mCt+`Z'qAmt>tOb>N\.f4xufbPGi%wV|*aC$uHOk@K,rrKW t=TJi#9K3Y9{2 V2R/Y+IaGlIz|\3f']:эcʖ]*`hP3;:`V/6cw彐H9KˊEui)xoxC.x]yKwD!'XsNzFɍ)mtrbknP||'>s9&b Lvnok'{< 66#"@?4#1sS^ >Vp?/BxĒ;Գ#ZZϷB@Ц<% PΤ& ]!2;v/iu*z}0as$ZO|1 G>=‡&;Q u#$Ob(0G u6x,`o # Yhƅ^Nqb= hk򼠛/zn: \i% 7|],:AF᳊>̏S f/"V2+fnRӜִ+p|Į:99ZPPA42 }lOS %ՠ8^NxŎ8;B oe\D&{ lhWJnqb!*cSAJfgb 0ѭC[֑Zp8&cJ ro4zkG%3`9| Q/ \F9FT*`mJh^ql$6p>q|h$2Y`H6'Zur_uM^YӹCq,2$szQlrB/M ON'I9c;{aG) ngA2fZKP3r"dC#lkҹ1UJ"JzhVo,Q'&rգß 4TSp~hӏ ; ǵɺ-prfC!h tF9S/T d4IFG9b=hdB` Y.%N=-2K)DDŽRҔ\VľK`ã.eВqMoh>d/ʅ;`H8{MA}%\Ln+ୋҠGwSdL(0aPiTMZ! Y!ut{ %iB]8vdG QNJ`QMZ,H @Y7ʐr59>_ré}\4GAO{ղ.lt j3Rx:,!;^W1]h}0acVHA `(/!% .az)qWa2ssf);U.iT /K8~Ǝ^ܨaDr"l}|B#JYROS27MC1UE_TZmVYzQqeNw &/ "s~ >w ( m$~5Lz[ tܭ>[QtO /Cwy\R…qw͟kBapO Ȭ`1-%ՆEAq.l͓/չg>=Hiн$[@:~6a&mNAh)"Y=t K `ECfDW> 4*PMfnUZ'/`7 n;n8s|*$_ l/F:0Av@=G=ZK2~v ߎёH:ZAf M#ӧ#F&tfWN`l ,o b,"8!jPL'%L`p]iHs†M)y3 ܀K7 Rajg/9z&@N-}dy̍E@"hƁX5wѰ n9ϐĊ,_)QG4B)@!=5ݫʒ Kd 7@]5#4)serc¾HgE[ӫs*l9ݸ5#T?G(eϯUBd 9VpnuJYp!5YuȨ], 0Dٟ8_rg)DP+3p];8lƃBhfhe| ܛYBP|B.%U$OBƐFp83W5 HMhQL%)6d>Bg”.St'(@IOTöx@YzϱdҵC&:Y5LSen *bʶ@l]U/RTT~_]]I<E#2|8btNGq;"[0oQCZG%K(tysA9v0L{FƐ=ImDvtT8y6NP]kRSqPj;Vy"3}~RXK)x34вJ%i>t TM6#[h]Q7P|(Pw`1YxC%?FryG.*>8v*;3׻`p){=b,$f< "_*f#*ק𤤁*Vc|j)SxSQ#GPJۼ$‚kT/y"6D"1ёQY WB'jz*tS&\pd|KT0)rL( 3ŀ$LޤLTX.D=WE/le#fT:3\̄"kkD]D0ZdXS= ڰT+><{ÙE{=MI>c[M*}-AjfnTN 2loaYzQu$WQ˧d wZc\cHL?GHŞ SnQ`텕 O8~b qcdAU ,'LaS%XW5$ ݋{S:Ӝb䢭qTړɈno na1H2}2 4=]Ϡ~,jgjhKipst~z",,*&X ժ %y}E4H^ROx.he ha誘3$Jbn0{`as׊ѽFN*?>a=6(tψXl^!>mko8ԔޛOz8AHZ|+/V!CFf=p"y:tVYXw6m; NWL_/SS笕ToY>MF슈cIwEtʼnM:{&$v5!EBh[VbȺk=[r12=+VjtEz|AO4Q j #|دVNHCЌ+C1"aiTszd`3ؿ/êa,ؘ]lXTVESJk!oF=f|ޙn#}% mh:2rҠepxbSʻsAD7 Ut?"_Tz"ALrFGg_Jt*18(ͮ}LXa{z}K@. ţ̵3(td D@vϋnw`97s'k-2jk۠k#0b o R9++".8÷51m*6U6[; \ *2[ afCMh#8=3c3njGQ&ql5̀܀ *(\2zgE(mPEݝ2*lFBcd˕DCSk'@`V 'u"T{IW"BFkpSjMOSXD5YHW z`t{x[IU{YL34i:mO2^!!zԄAQBO,uq,ZDҢմ[d[_e˙1k}ݮ =cxKֵ2ujV5mI2/X x`0?a K,]1eLw^c)h=k v-^/Sٌǧ\?@=ABSk: ptRqk^P Jt&J++/4)HPgUO8&MD/v\9ӂ}q}!g= D#9"D"g^acz_I}O_HC,TmKs%9qB.ݵ8{Mds|D+W&W; k5I\#YoR{cwɂK8 PfsaTZ=]],IFJЎ,wX#_{h4ARrHg&} Y N!Lp C8jwuCmzrNv 9^+$Z٣A}KY%\:hPE*$Xk j.;NAdCkэtNtY+]j)}/s?+z&WDX(DWGRq_$?3>ψ(F 5!2Md&ބ- |$:UUFsxvyk-; \L &4"uǚyMљ|J~nɻ"9p7tť׍=u8dVA˖%1lI,<\vi'Au|E v$ﯪHOJ p-,,Ɇz++$ߕ*Ǧhn(߯oGjםKـS XB6#(b w83)1CgDK~) B$Uo")֋/u)EIu8n?Zoq)I%ҧy@0}s*I6[g)b?l"h]_Tri//̋Z&"Ak7'0RHW ,9s*7%AoqVcAy/@mtKN%kZYp;@1|NLC o%_ oI1n51qf)$sN2~ބCㄠj\`G*AkG,) ?Fڕy\gh3` s5 {k` {9ҍ`T\!7)F!jz` MuiJ, {GQ%]vHȋ?&&K3Y\čnArPU3%kEm'%{1( .Rg؏ZY_xy=QFڈAtefl i CyTr( e yiEvŜ:Ԅ$ImAw hw=LR?^7z2rZs&Qub{ Wy< gb}|fKP9*:wm\S`Lew@"sHPԇ CyL(MHAhMJ(DwP Z63_)O X9Wa믦,1o\t/0j1N>2-ரuu, }v7:L}xՒynOHKTSմWAuFI13S]`V > ()%!=h!#3UU8RY#`B1Z KTtdNMjȮU9^u*hK$Qu֟oj]kX{ 7Hab,a+Dn8&aUלk1(ē-y=񣧷#-iKaK9-<}*t JXNPOwr)jz@{K rR1x4fR(?aGg?(FcrWe2&צNnǷ-OpPMe/xM-fxypa%Y۠ Y~z!vQ FB7)ZIugN)+%#&b:8( >W5CÔ ?yFC3e >5gtxYWG FxNM_.?bgbjs$Z .tZUk}Ib{"pJ/g}bS`gx6t& B>d%#=ea>8`< y0^;怡ǥ݌>yO̸_Aܳh0()Lj+dŢ0k"MIuÇ PpJ1*<9D(*rwĸ.t(q$8oMgс~L̙,Cz_H&QiOA{Oika\70|ZBQ3qW^c& 8ȎjZX%+d 懅 EUܦz^% f@U]LJ_=yRٔWgEf|O$d6?0òŗE鿊>oy |J5lkl'Uuk,u2hrM{剧zv#!=KeeU/R4:-k|ോŘkٞ\fBB9WR~ dbYz$"uN% B1ЮP0#Hp|*t;'gĵoz7 h1SW١<7ؐt^K5 zDc}30F_DKU/9NNaIeϚcj6`+E1w'nt<]6@ykQozM> O5f)unHg ^3H`Rv3 ܣ8hC3/wW5}#M{],YjH.Y|Tu tp)>*!eKy0z)%ɬ)S91G'բOҖ h4{>]N=Ш\> _\bjKc) VkDmu`%T-m*ݚbsaofP(6[~y;{au2%{2B2fn,sC3Z$j>f5 )3xT+z;.@>PMSVq!CP)`ǚS.8ZDޗ74wj]v\Gp5{_" $Ue<35 g4]=# *+zy9!R!;bVPXTA3 䞞 Glm>{%;Y.?Dgԑ+njQ";憎U9P8(uGMuGg1&1΢&. ̠JH$IQdw%>]ڈ͗v=p$~M|L$`cH<>x)`jS,Z5'X +oYRvû" lv"{aSqWjoЁE >&/˹Z,pܭ_jIZ4eX˷ ٫Q73^e_e 1E o 9I|ˡX&0_4nÍ7I # H1?O{1ՈvWUN~ŏFY =>Nj*(8p}ÐUp2N|& Jv̷&;ԕB4[ﹰ}Vk:/I*oʱhٕ|!q_x/)IDc{ #Kм YT+ kcOk47#F_] jGQLh:+d }l#z5tD[a.fl%yr(89}B<"ôҖo)Nj12| ɛWV bkO?3h?04@ j. Vu>4tYýjBQEȠn٨ؕi{5î!@_JD쒙^`K뀠:ɐ[h3ʯY c*fog%PPf碿{V$exUDXcZs1K2E|z9 ȒMhȌo•s}?o,{f4`&Pq1 mmryB.Eg3_N'nU`7%%C~A!eו"20ՓJ1rGYT?(ɊN66MbxtrTهP52s0R`, <_of bhigYl:0sFZH:Fm_t M/+FĞ6JoE/.{*Y:^H#iVk 2bafԘ"fYU͇[qKA}#w'$jљ3mWUR|`N^rz:~ZuY2WlSY7:KPùT/ع~GrOmYe}\.. WkBt(59*D)Dmk$ѭI$_9'T*!/`I }t+^$Sa!vŲ2 b\==syL8_#eQ{kP_@S}HZl8eFr嵍O3)thE_6"{-bj~oCЀ#9g(,P롧=y͍>(ٮB%H CKXYo=k: ANdKgQr~HDݺ`58q[fY' Īo6i>=bL/ǘ-Y?)8cK5ֈq ۗXR>Ugue`W`çhdfKN9DY{U]W6+6zW\ԣ&d2II?j?%d2[O=GR!5t|w+(U'S$ꕙ%5d 3I߀f RRN=JΩ--ъ 氦;PT Gs< *rarUshm9E-x#"per2*hxze cV$-d4-~ft&]!D0>*D[B|3!/*x/4'bIzJKhdAZ01W.{b8Ko+oqwXڗrCyf>﵉!TPT}9Ե[.ς5왢$HzwI\C+"6;`0%6GSs0tky?:'8Q$=:Υ["RwxPO( fk0f/K/=QFrl%J94ӑ8v؏5ˢ3~|]&C@;MbLoE&7: ! dB lr]!t^uڊi+{$:g%c1 7k竓?+tHMCeh0>3ybxN 5hFO3v࿽JxG"j-sϫȻuJ'_϶_;IS܌[?V}4ZvT .VbTK ~fϛl$.3FKwbؗ% hi}uuZEuN+CS ǐCO$uD<.vZzbslߠ"i^Nv+#zxϳ-5iV.kp̄'Sn:Q=D>c4eϼ@GМڥ腷-a$p(KqPnh6Ƕk$ƂTIx%ѻ}=ps黣+d&G v\ӪZ Rk#Ӱu8g`rXe|y1[.N l$#˞,L,&И$46ly=%xd{ms P8n3hyskq*6D MvHEqzv+C&tҤOM(k} ,:}PVfx<+R!9cF..qS; ߋ`%FAY ab_{$WяEyNɧi̓ި;rS]Ԭ}s'I/ EP,DAnɴa!|Lz58plwHՓl B0ߤٺwn<C)eR;..j<Lo| nQnPbqrE7-r3GanԜsXyU;L(twPIurH_TmZMuSS.{ן7D7=xZal,msSRm܊4/e1 O>O7Ofj<Gol> fCy}}&k΋IVI n@==&Y`Chh["]7=SJ_0f}~Tbh~z{BvLvԬ^^5gc_qᡠӳ1bpf!Z3A (]%5&\Ȅj-YK_6$?^b_F'~a8@q꧲iꐮLz su|1\̷ UuwX9F:PצCK;Ry>ZHȸ)6o3զ, WMɾk,>BHfScȃ}֝1Fc(QȒ8*,5ࡢdUk)kdk\F$psFLc>CKgoG3}4o,\qd`d釘ۅ\zP+Yw?Щ=c_~>c.dفyt4nYSs}wi[˜>lb118{z4P4}m15-](G -"H񱱐6>0痥3sbzfDʼnQ^aITmh{_ʱ۷xH!$1q6߸о,YE R]tvihS4HqĖBz6 Sj*G3<ba?t2qd&[?xT`UId*dx'U+2vI62̥P^B_>w[&$n{\.؆bRKA! "0aI_2n<5Vn2kBD Sʴ*}$PX9BN;ꮖ/qϿN*J:68L׽.PQBvxkno/'cReϦdֱA$R1Uj&LJЏbO ƒu>X|O;ИpF㾍 $HTv=`]X#e|pJ,ho00t"D\yXD~?%W-?[ADj`-`t;_) ׊Kp K;lf&`״QErd~t["JL5ڸaKt܆M9"@/J:y;U얅 fݤBX:+lkO$5ECұ8wΈ~gK# .GpX;P VTuSTs@ %Q"[FU"eگ(c1M%!Aj#o^&'v>\.+`\ pGo(~10 vK4ulbtMD!i L?PKaon& !k2B='?|)+[11cP74LVy;;)t1Eyk((muS fN;@F(}3~h< [1'vcWɒ@ f<(6Ѐv͊32Si>rJAy/Lr@ȣ=w|"]\bX{\C4K_dhKEI`1NZCo{n3Q=K+u@JSw%kߣl6Ҹ:f;hv~I3i[*kJ.%&V] o"B#'XHOhDcw<୧M&Ydwv"1I9U ~.O,0ŠGPсJ]]*Г5%A9ƄsUB !d-0p&H08ܲCL$GD KQ(N͠V|:2^$oepU#t2T4K-?;nkɻi~ȊjN I1WJ=bqurz*e]"%F㎄8IR5Sb|&rEVH5SϼЌ6Qbi0]j:lş]jNk\wuPۋ#?<͹@eHn41ͬݦOԋc |tf=ֻ5aT<<#GT-Љo}dhY|8ԤѰ.s!tB%LZ~;J;Q?0Sъt&"ߌJ"klK$`.Mw(IFs/g̚O*<۔"T/#t(ЂW _R4B&SGo&%Pe> me=cȽ2@ F2,nCwFa.v?L|'loUz'wڿʇHvs dhqՋQ*Ow"YVC1eYI R%0)ϝOJ w1^uwMР/;ө9`" [K"o C*A*Ʒ.A@w;8gB :^,sxe:HR'K©ׇ822RV;v=(|gSpp;qPeσٝ,~[?ooC΅}T +k9#J#f;@s5л0gQz L|b>>- OII4Ěm;U3 dQLsz 23B]ܥwL|K!|Mٍjo"3c'*W͓{S'25?IXZ\jRe Nʽ$`"(Z&em{!x([JGd9OjxSٹTz岝rLJ B<[Oo9y2f7ZD3eF;KT69>fLeuFFSYkٷ1{98l B"f]#:YxnMakٰPxV=DK-Zx b'X:3KENJ,e_J< uYvD}jR# vb8{ݙL K%Hhr +5|R.肫N<qI!?,^pwttoOȁݪƷgy}Qs2}ڲC*nMYl?7gTmObp1 > ۇb ժdaլ$H/?oPdM=jXGbГ Bg~`(A Q%F[բW-*R SKi>֡^'sȺhqVXi鞜Rt_ prIJqVM觛p͒{y;Q@ Ȍd}%@8Ϫ]Q89ZSqf1ڔ脶şcZGz] 0]U1]?@@}vI>FPxj;fրC9ݯm[q׮eKhSO%sfCi'5dGXbd,/~ӊ;1wj=hIřod/֠T?<9OO cLd}<cu ROD$Fs3JSyR=/ryO 2|u86ж?)sN e@d&ΰW9eO$~)KUYCP+˚~@CG})gQ:ݻo`V {"%fR/5Z?B]hǏW3>!C Lz !\YOD~T ž}JE(`%FRX~Aw)^^' "Xs9kdK>*F}ş]c[9߀sGoYܞ@E 6@ڌм1n"XLޗ]2˂xFG 8DJ0i!𼂚`cQ{wEGڢjZ}"qQl% p6dD^C ݨ8I{u Ԏ9A|1T8CƷP3!4!w;pIw=/@Y|)~DW+?4$? l~; 4|,osryCԹ -A`Z.Q w=;{MפZV4pIյb2rU%KE0x NyʉF,4Pנ[c .A&lͩ~z%0KѻFK.S>%M Yb,űEl X/=< 4˹\ΆU@8$, $ZdAem<&U>[ d/D}{K u╓U'sUmq[ -: A{yyF->,f`@WպbSS1)GBoqz& FnKr7? "rFNdIX<}0E WU=n3L{RQRVx ~KwD;m3!(ء`! ӌ7GenU6ߺ <>J6^a}mVg9Y ւBF@>ab{U/Z ÷b4϶J'm?>"" &)9fu19ixгNG) *GVKt&JX3C NŞuN`Uz5IڤʧLa\&>tE'-/NxgV+ҰJfO"1FQCڸ--pݵ1!Z5U5+ڍn!Fl"u뼨]M ]w]'$#aKO<IX7FR%7fq'xi,E+nPNOD=Ɇ?ㄆܺgVo?97JSl/Jյ)U/dJiڌ`Dxqe9hуeVi;Fߪn9.S R&>4^Ri3Q̷gDH=x5/X#q+Y`^`͕#]`꣕IWRc[1Wµtp'_,Ne|&'T;(H/.^]V("c7 '1*XAJ3+ms}DM+27=^#TԷN'[(jwFm4]=y=$L)8WV’rxn-$D.274mS v1^w Ԭ ֺJ]=ZjKFU3M4is[8#sJ("=hg}ѱ\1U 4 ^B_T9' jԛM^2?kڪ/^,{ yr?78,X{l%o73(hJjwI1Q? ș[r~!HX
'iQo u KuBFcA#Rvs(!X]o X;]Oa"XݛjN Aޡ;fX\޴\煵u@A[ìt ;s6e7%'V/G ]-} {Df{]-$Z)5/6;܆Y)e&D_\;>-?4c/y:YsLf!xzߖd_\S1Y'XB?.(x{^ Y i> Gj?g(8 0#o I]Z@暣\%&`U%))&_K 3":hϱ[?2جt`ʀrЈsnլ\,*yddZ W_%ŽB0)dz9߮*J@Èi9y@Ο Dku%5ʮ k-:?C*-^2nh* Gr GD{H2,6>#8vj0ܼ_,LZKĂ0,mptl{o,zZpӨl/z1[Ҳ?P֔%of㗣PXnA+ _ |LqϠ2θ~bgJNԢ9zvP[R.AެQ=kN.'zT٧ ,nց*'GXnW3(^)' kxNjS`kOP\oĸt BIzzuOQL Dѹ)V2IzDkbg0ELTr>~v#5h,CL99J~5`}yEW Ov:S1TE !C8c4lm݋ dl@xQ(4ⲾnGH}fY|q#6 "ٲ,r(TԐB;Bqn_-*ߟ YZX+)`WNug+0s6 GC;|>lVUSDJ0>°Il6.Ƨ+o>`$9RRD] t`2bf&Z5 |_? CleAԱGQ`IbvYsGUm:_C[Piwл?# ]\W!bhAi?ܯuPu6TKpts&&WV$T9w_ݶ'ޝlɴ ueu@%&a]}os&UK1>Dҝi= fH=)ǒ'lQOuQNe >+YNuJ})(5Ma2,2#=2Vk0gdN;Q8u7Mg=([0IN9c|bT; %bV:q'XW;pkJh͇5=Uۨ*nꍻrsi٨Ù4FȼyFZ(Àzm%PSsZe&S[^f.Q{Q뒑@WB*Iϊv)[ݓ:O]rC(>^MMp!t\aj̓cX״+y.DGU't/m${\X}k=I Vg\Xc|5=Jm)/h4>L,*CTXPݷa8b5tUR;C9xB&v*tg鍦NQD+JoqQA3(*kAHp۩;kS /AwtfX^zFYbG _Z&} ,$K݄~@ CscD gk|D[W9\6XR- <\72288)d' il%ǵխv%9N dIϘ6$bd$Vxhs*\N\KыJD>;+TtǮaP[XmH8#77Z鵯U9 /*Z+ A$ꭲ5Y0`rK6IBadͲuxQS7 YعȕK׷g, %lxWo 54E鴽5˃zaͨ=lٌ<o'=Bo$X)hղ9)i}N 2hwZI퐠*wd^EEߟ\i"] V+KLP>_Ot\:*!O)bA|3x`wo(%oPɶ,m ΄K¤=c{UHBw p#{+$&WkI_+iIYs +{2L&4t(.րpǣѸ (r[g5OfchahydutlE )T0A< AA0$ŷ CJ@V (i/P:v7Z.ZDQJV~swJzh&3MuUa dm!Kgh}h6)¶ OzSS+'t|BhZ)dNulH<*l7Yr"J#$s+.Sx:]~uY t>R: v萯M+FN3)Wc, ya3 igLgo]~_(gszl>]rF}Dh6~ Jx ױ7hp&bi0!jIDt={׿48&t9&ٕEjQzo\cF-6㣓][WU:gN'u k9:wYMWl(]`]d_Bϓ7~_)LIW.35Uei\hzpTx: 9 Spʋv5VBrMnNҖgKg\2<o?h#w7@s8J/yIYmG'ׯfi,c?ش+97R@`PUF+ہWBj=}Z ڿ1=(!- [RC#|f[3BXA%ѯF 8omAoċ:|ǧ\NJOR/ƱwfZ%(pU߫56 >K,/xwbi?a1a3w}\ l޵.q2PtĔQ~S;>+s-TF !6nV [Z0]-"`E=W$\q&I[,/sHؐźE|%Ja;RRZə, Q~dMlITmgB:lȠ/7֤wuTc`{IwfESBf 2J%|Ood|>[.bn͛unSfb(sA/ݚ) 'fMeu1,K6$B 6js vϤ\6:qV@E>TϽn]ʯl  I]C{?JeؕTK>j4#hĹ(rGy]Ǽ8/ݛҞ9(+M?O4X"(,x{HI%X#'p_r94;z;m9OS-"TC"U%!c˨0,ϦwrnmwƏI*KLP 1HIp»]kf /"4{G}t2e2:ݑ]+ʙE֚ ib)fQ`g(# FDiذA\G<~jr" ¬iǗTqA;s ́%a.qbfA&/dve`zHdUK#RBkrW~B)qlO8q4v&@ڮI ;$MF%k֦e^{Em+Li"( W}+MA1©Mg 7K$w,TpS~]kB V+^ 'x1U:r겎CMu"CJߓF9#bxS/ONIŘ&DLlf`mR"dثM %:xoLD&5ytVvΙg ֩Dk4/vYz<ܮա\M/dc1 " BDL*\vǴ>`֜[Ii=t,*ŶtG|)|"kEf ɫq\yjPuH|wbm0#:m\a6$FBN>ẼT Psl天Cmٯ2_ZxᾌNf~,[yk_ \Y]?L7 Xf+Ҙz/g`ܓ*P Z )&èGe.^$Kym7Z޿14P䬀5c)zSBgb8>O6®#5$}i9en4^\ k$q^LQ@(B.V_kA(K Gd5h.{Li0q 5FM՞!;wW8G:ut=LfӺԈ$Ԑ! W\zqu泟\O,.%{S6au\ߌ$eUs S;;} L?]8ʉ5yah突q6>GnIFfV!3K V%]vH|nC;x~5B/юReLM͎!ik3*Br?w(Kώ- uXpiqm0sQ|@F܃l>{{ds$!ĭYG͸hKh 0FBc+-Byi ټȳ@_}~CJs">I0x[["2_d FW%}4{590X͕ք]ޕ=bZ@TG$!gSȈNytG_5[@>c֪.hOVm6HG[*LsQV“/p\d {M |QKPo{D](EķԁĜ6v@7Ѭ. )5I-pdhs+\!6zQGqh~}Njŧ^ÓVF38nf~bو}NY+N<rQ!(Ƨ[c>๛-mN/8ڔ<߮ΜbZ4yp89Zx NAxvؐr@]`Ɲ=DfR{ BHamf%3Ri?Nzd=s}N9|<(Z~]-#t,71kA>P.BUMu oC%jkDi_W%Ɂ9(2K݀SCʹuLz`a&duֶ"p-u>@2rWp]DK~i{ֵvÐB۟mq%/VFÿ;"1:Yd}vSrJ(%Y<[8;Ü8Zvp 9cķ{aQi,jd`hh6jS-͑~Kj#azsB:eHl]0eV T 1֯+kTrCcye\I;#cW!Nvk87b>$Zl.yV1qD)/pmzk'WR2\8FU ~&,! xyBݥ\%Q-Bpm+e8R $*ŶPa3hb+ = }][D .F_mW⃳z@l Z!=.E=@e-!iّ!Y8,㋎KK]_qﯦ{EI d LoP#H$x/z /#;IGMɼ#]n |RhT&d҇0ʋS$v\iMvݔJ91vamJ֥NX֛x2B<>6gQ`1j[|H,jC'$ls0HϡX65QZNs 6⃬$UX,a8ZSc8r9מJÿ& <$ C+)*gbG_ Dc*;V{cyg83]}Nۭp)TauF_½8.`XІ8Z@ő"B^8|N EC{QzjhMo~U󑶰@@>/^hxmEd- U3o,-,&ךc7 ]#il}On g.6ǴnjNv$Қh()kcԃ3P!hf ~!%ρvzߺnwZx~ .WFkWq1h*˖PL9o (}*g*dD"WGn_imHt?4PT>Iz@&'7߇l%L 6Sˢ*Lby!uj.6S&]c'{ $<  naIfDMЙѽ%nvŬBpc2벢;Vd >g9Dže̗B:x%4&1߂vO\΅e;A%5Y-UaKK"^tbmp:EȀBbl3p̱D킐U]RȳX6wˈ[ٝ,&%a+;E%קp=6  &53ҴG `?K=ma{"[UpXX.R]֤۞^Ѽ; eY#$85[7nL8JW3mDʆ'pn; |:gBYuX|XgR͵_W&}- |3'9=Ǚkn F97 g@."S"_wY9?gy5" yR =^DA\33 tu9ׯ{]*fYYyr=Z 0DL2yECx&Ts&/%0#9Ø-{zm,\DOsӫ58˖=]{&{%2eMʃrdS5s23mf"ƈZվ=Bavt^lּKzT8Vx&9}1;;LzB_ڎ ؠa heh/;,yw`؜gG("g's) ]҄&Au>[|>^R󤢡$+̻y"t~Z,141yGMIBEc.>ߝЮ\Ub&Ytv ŭvg8< ;'T8;OlφAoͪV#U&B~SHO,LsGHxHs&{Ǩv> lvoe2)}8" cz[iw&Mx_tFSCa'*| g>PǤ;9<*XIs$SЗy9v [ܘm/:|v^.0R CeI5|/5Ȁ":R.Ifs4RjJscll5w?p6:.]eab0'4\ZdhĢ`7 R4-8?UkE25"v H6ဇ8Z }/-•.A{gXRvM|pPVn19 O5X6oAĭ>M;\3E:řov \v& l j=XAr0I|:0$d 6 o Ab`d|Ɣ;SwrJmx:\mȷ(O,.d2fw|JjUB>E}x> ݷ S#6$}QA$`bs_=4IH؞2O؟sީxeYG5חJm.QgWb=w/U+_kSϪ]a=6Ziz3V>wv|G2@"Dkڴ LbYd|Pmqo}zDI":*ei2 TYc+/h쩊a mͨ\pJ[bRapBH Gs\#a w7{}D5vA C MǚM 8iUb% YW 3Qo3ٺ~f na|ͨ T&cmX%H,%_fi2r}?B'9. XݖW+EaЧ"^ P_+T^Spdiq|N<Zr"U5" 7|)6kMZ Bĭv݌|#{4L7 ;O/V71*.͌_͉>^&ԱNy-s3l!{mm.^ZP1ps_c1ㆇeQLfVSuId7,|ACQT?i2 oY!=Τ$rdp*}PPH!+:k.ոº>}[wFؒЉFŠs,haڀ~ cw{ b?f`=O[,X2L&ioρz=u/p"@!Ail?Hce,8]UTRbpz>.^zND>w*DxG |Rr ?+D~^5mxJJkwKEec|k-&)ykakQp^.|]<B@ ziB,v^8J(abhO7B3Ig@qK#{PWY@ㄗHٺ8wmY]ܱ)Us>nr`Y(lhR|hwL3_9 I+qw M6H]KrD^8EIX.ٙ*wiA[#n5꥙?nM5v-Z]S{_r';OkG^a܏_hV>R'82%cCf :'Y8 ?n}lrKpvN [P9*ݔ3|'7+A`Y?LUh(@qfv9&b~A5YvZ`qh* ~wg""_M# hߝe\dE ۺ`"A^Ue J+5cr|{PcN^. -v)U\ s Sjը#rː= Xܸaի\tk~iFdsp`嘏j^zUd@,"Sq!l- /KFr=S) <ٲ 3k?'#oU >տ'Ѳ $71#ל+ȿLʡZ^I,=> x%ɶ4&șo/dc!HuT#I\2aU@Wsx{`Ϟi`р|0RK^ڱ t %Z\@ˍr zWEf'R'2gHW|*˳*W׾J l'ChTe!%)p G*X]L9╟<O-)@d: YUvƕQ }c>s\39Vk ٔSt‚suK$fCӰӇ ȽN0 uJb4"xVo;( "JI&% {P8xo fvR]UfnAw>nx 쇾Lڛ5RNdG |CeKjN~VԺRk<Η!d^2z6AH'..fkP:g H'13)!է-+۞xc&/xPq;ZEWF_GsƬy3;V$Z26)0@ʀ3E[T+j!GS`N,,{ e.8g{Zj=Tm!%}q~-ѣ>-*76b|W;m-0AOw:= +_14(6 _PM=+>ȸq^ N53\>0+6!1irXY`v)x q PdR2W.@k=)Dϲq7<ܟ{ ISD : "gIeV;ҬZ\E:dp'{SSm^+ &\QlC: QzkL E\=is炈LGtbI+ٝ=DCqHhg1wξ;Z{} 74S@C\;d˗L:!~1F.HPV֨h% S:d gH YX3Pyyr2"[JY2ɹigyAl/X;NG _6i.u0j}/N;i_~(dN`'^2 @π?;y?=~:ix; G{~6E4dncIm 59 mߔx$*da.$n)g Wz$% qr<w,W7 n ^u§;MF5K꽩X0wl:9[#X[-$,&cwt]q4QƲFuAp [0ts*g7ƣ=Ì[c_; |ť71N&`ҌQsηll`Ēq#:%].{hba[dJLmpu8WU)Pqx7)8to24jAY)A?iQ@? 3XF~SI)@)K0"Zj;[I:g]MquԪCuK`VmR[c2bq! XTU.h \@_Yk7q(Eل衱:\^m*ݝ@=bOe6+׭OA*_qOY|1&yA$R#uS }JM;S })Ldfo˺HF7Mxw-zLh}aD"oC+rϾv̯9Gp& y푑+xq|[ h,u;lϳ/h뛗1詸yم..XOT9غ",,04:OsY]Ø꺌[ق,?8d 9dӸT!rP;XGB{ Xx̣2I˄{f:ҩ)b ҞxCs?afʘ 1҉RGAR7R4b"LҖ͑!z{l2 m5PR]xO6&,Y16a^ YIǧ|ro" X C77hkbRUNaLH<|g:NPyD!u^=&j"ƨ%'mO(y:4])tWfHmRW<>z'72qCi@0Bψ I͵7S C tůA 5lΖg0xt҇~.& 9;x"=͝z1Bɂↅü֕b?ughodu^ &?2sK`?rtVJN˓Mct&G [f,?^=N 3,c& :Px>w2N;E;uH9MṒƮ)oi #YzSH_][rl^:H n]1Yζ#%t08J H,q$k=i}h\˲(`ꊹ?ȉBj Ǻ-$\#(bTmmw3O.n^Y1v֖G.$wZ6;e;0bg0cRN!>%I_Mn/YU&p+Խo?*]6{Hs_Gw2e9?u]!q_0er(2p>&r0Iܤyl\qd[pٓd⎓eaZJ1$Xn%pJ 9rEL4BhIcVM*;]i%o:2'JoU;:HN_Euo L_) s?3f98sLOU13KDzs ~^@NR<]ڤG}4z-bѯʯ&?0=|g1Ǩuo^”7|p!jqI@5K&*MDArp:9~%:*ϟ?1!L?ꖉ @ _U83tmyR ){+2y9 W$wldZ1}5:F##~`X_{^ b]`o"m)-T&I>`﫠C ''VхxH5Y9Fe 9J}}87>Ϭ0DX=0?tkdx^O}5M{Njty[Mf: }@H#fnud GI UfuG3A@b 6%iZqsQDjV;Gut>uO'3 au njBH?'>gKFT"E0m2rDq"CuUxURԔ-RJ=(w%^ox|:d Gܲ֟v0FH*#.H^ Z?Wp(:ἲ{ruyL6, " z1Sw<ȆfxBL󶮲[[(V`ߡ p;kQ|z`+,?Pvt@wjTN"Uq춏$4s1^[EDASyѹ.k]w%3[%D@q\2$Fu wn.(7ϞP~li&(+l4fy `o ^W> VwCt nh(ح Bځ oi髜Xtl3/+1Q=()J(ߵ=ӕ)Biye;9Pzz_8g#aw!tGr[1û9VHZ||Y O_9U)ha(> Q֥;ߌP.J&f/p.XeYEQ&xkϽ&R 8 as\F,9Iuӎ.cWdmÍ:,lgLCd92R&CկDwΆ/0>pi 5T]cϡp<1`3o 9]>*Pݤ}D7̓[o; 1NN{tq>q!),cb#rYۓ+x܏ZVzV#_Y];ktsux ZQF:F$@a/.bI1o2\2@E'b3)Go}y`=t!xKɢ~?26*݁|2b'|}|#$!V7vSV#%|F uWwhj),-q׼9#l`Nh\Z(1d?sSCIeZq̫gֲ4 M>0FǏ{hBe+Qj}`iZM0?ꄎh-l-z_ϧaTyV)YKcXL#G1§#H9 HHWhtM+yS* Ѻ2+3~j@2~&DQeJo k;U DK4\򁄂95`+HT|+蕳Icz-~r vD(Xz2qz͵`w_a(&KG>˱&%nָr.R` jOȮ:\,CxqLRnʃ)]nD ]|wmH_T"%l!g_?`e,UսC Sa) F?AES$M˂QƐ.;:b뛒Bm Mh9օ{YiMٸ(4_>tUQ~*Jɽ@ٙgpX|}q;V}L 9 ڕ T89'[Jbks:Zg=z+J\~9SN=Zv65jw\b3`ҤY꥟٭v}&[jJ0hRZisAeO~ h7qדZ.箛nhkɧc=Ѻ^2YK-H%umGr Ҫ.~4pY'8,3d_a$>yCGkr~LЙD[c ]Xq Fǚo h7ޔ}HoaӾ g QYHN:GcZ sw ũj,wX\*Xq('C>1z͕zwA!}$Ɓ!4kIU dGŞ% Ux1Ȃjpb^ "^oO[{‰GZ ,91>3hGc5Q]sS-4U,^KU0? $ь>l]Ujk*5%i Re Xd1]Sz6K^)#MPc#eԪ̫{vr2~ ljR;7 uG]@S7aY$mPsYRv鮫ZPICBPE3*^#lƣ)5G)qf~{qCīO~DT]ts{&ԋy컪nDUp[}^=E!/hԐ:Wv$VS^ځ#lqO,!7Xb %LGEаū=D: 2mJ8T\:qh|.7WE̦-{ ~ RKڻSThq%$ jxBSߛتVjUQЀ'wJ:!_YZȐRwKK1ʻ•,}EmW #Oj}2-Т\CӝMm1/gK4dظQV!"<6vB"Ăgnq E]޾CNUޟ.#m9a glUIu?1W{9\y $(-H1z#''IXSQP /ʖ|^Gg̢>g$r5A4c+ | _IF']o{\RiW&$:O]N,!wFgcϰ;Ds 9˨<ߌDeq.4 g Mƣk&) =1C$֪mμGWLěb"i?ݎ֗s! 6Sy * .6c&o+p)5NuMn+Rb6\^u5ȇٖl!櫩͸P˷JAaR#̆LBt]ߴU{[pOx{nQza>AȗXVhdoe30=q1p`бYnk5F'V_<7 u{ X˜"|n'M%eN@RFH%EdgCt;knAeL&C6my$˻D?2By|w]2cO1mq]rB EvIeuT5]xD'f8Rl: ?rxdݎUb?,=gtQzrH9ſ< b^7P[ n={!WR(I9p|$p@N1-r!GO+=EBP{#٢ V2mh: %uY Ϝ{2{|B{h{ |$4f9E'"1x%TJmV(6YxQg8m,bة}^ڞ T@~lW[s<͆)">h9u_QGDXd΀6nTl=9*Dͬ */*[i-^/scrNUoŻdѾ b4mpE>D^2b1xIquk٣6A9*}[A@ծRtt(Ռf2S8oVHـֿJƥ kja"˓rĸY^l /ڀ-RAiC he?џ6l8oX2z_,mNP'.Og 8~naxLԄ*%|Pۖ eEKT\Xf^f=fW:ZOzY9 | M.}JepFOV)(h5A}%А@uv,/~WF-$(UozP8Cw;ә}$OI֙%z8'Ͻ/ŧa^N}mj,{R&k;1?.zmfb*ٱ1`ž b`K%a(W3mFT(eETwTԗ-2Dp\C$|{hW2C9rUp|5@Bo)U4qўn8̳XL 5PP c.%-.;OsMzf8`EFz&"I.tLA8H< 㿆K켶jƧOstќ.[׃W,+i <_3Lpx0ӡ?,,wr$%y|WWb?6[ !Os!/譑; |>{[# dJuy$ PgU' 6$]8#MT.#yT0o'H\{di'7_p:üXnڱ&zWܕcjř2~H6*etd!vvZڛJHȼM3 D<ѸOJ3 ,Sn"p+BGc}ݒ> LcsntYYAk5P2*:dn!@I0Zw9p& ̭b-N7(ߵH{ܶbGjkv^ҭF&AK>G- ƘYP2\BJ,3|Q2 vop_"Hk:7Fk2d( ]wy-|񿉿:=O2z Ċia-.ZiT4#R よ*-u.9ъqS^#v~3g'ϕ^*{IsɑyXupSdv'E !ίr`"ďQx|hKeM1mтX@Ӱr ~39i 鵷A聴EE&1@)RrG#B,wiü^Dް5paՀItf'YApQ7xY*ebƣӔs,Nq-_XsN< \0{ pvֳ2yG,t &ab/OMڔX %y1~iKwF[\}߸՝auMocM ~1`:2}zPYv{, |ږ)+[ԱO8=ɧ,3`2YF!J&~BSFX'^N!d'!5"Zy'Čэ028t Ն`*ʅ0ocv1 *)L\fkM?gՌX5KL lNk%oڭ$C88?*'6MyvEf1CٱQ%WvަBXŵ?"鰓\bDuՙpp{_k EO%>oωѠ1(]YS_9qg+"P5pnsB}cm? \AfvFa]H),+ rle{YRtojԒdO .u#EV 2(mmHV*' To)ր[&p^r41uի⛿.vIjqf'OF_yZBsc .=y0!67PwZ;6R W ߙ 5_O%.7 d|c6;K4AG{@6}/ B{qIy^#3Xj)ĉ|;uȳGZk$)z 4}) F >@ɖ=i_9ê`{t+4 =R+TSKRV Qabt}OR5y1 BJȘ̙^v;G}3M2Jf[:0,x{*+2hZ:'BG ^E-[50-Ņv핇Sd^*~dusdI01u]]N:k)Bk=r,Bٚ| S%GhU Bbe \IpRoumw)q"G`-K 5Pg$ jt{Ƥt]k]G666bE&gK?>_ӊ؃TqJ]^%.1yMN1POXTMq"exOI\pTxqg'Fm1q򟟌> *|mz&@3H7,Eɮ TT'7L#HW45bE0b>yCsjPjIJU6BhUA@Z'q8M iPkmҊu3ks 2Y#ͫ8#|}.&Y^9= yK@&;[גs1/.mRk w6&슎pRF}\?Sf: 2ֺd!pCe7䛳Kܢ ĥcI„,\ ZגͩX&+ QQo0ŌaѮ|4WRisf&n}!vb"d*6x>/?]G>R L,[>`Yhz~S$zBD^RXAݒPJoX,fkKS'ىiI2 ]S ^IXϹDMv"X`FK(3ߍ5cq+0uR粵|9vBes=-5\zLG.4)%luKŸH@а-'_z0E 楩U8Nn5E$XNHB f\LS}X*Jwfod\Nj2wrx&Jє%^n=?[sj^Ӭdn@ھl g`xU \ÖjOIu=2{0s- icGEĿs : F5e#pH޳0n=<$9eR1s~?nlG-ϝO5D')(~OlQ*c_b R u_ Ł+Ȃa 2|Be01)Œߴa rScg!nK`*تbTM *nXyoK˾;XJ]Q.qT/})_3W` Brd #-|>8ʴ)z%pτEe-H}6tML`nh?($VTB5>\]ʳFN@bϱ+q$f ;Fad5˳Fg4PI%1u *Zly7Ud+5COgڀGǎbd甹mD$Ď.O~;_¬p]ЄPRkAO #y0|D!pSkyM&.:oU8w! le~lENaPg1z;Nw!ZJS= LYjIr:flh- l mLf$?DPKz3Wj \XLzI9['z| BAיUSUO\ܥ)ݚ_dVx(,Q!l`OȏM #a"fټ# wpn3}aiUs͒{w>xO緂,4d/(^a^RC&qLo͇ AVX4\h`2`׽m-BZISghg I#gJKHnQoIg,?;g) b< zY`)m,hdA(vH6*i'ǡ"!WoYjHDcr2Q,~7# "'1 R}%*ld(ϒYo? 9z((J]cglB)"vPɝ*w0EnAc FƷ͍kC ?QjIc}4%H, eG4Q#]N A.`&$ܕB}GT[Do*Qg`JuZDW !S{mcPjJ+xA(iIAZA+<;b.!j*tOÏȴ՛rҟ?Nrm;G>o a#߀`&c, I㹗!b~Mi nƒt`5dtB-2A7 vW#1/Z_RJ[^PԪo i]m2p~Ƨ5#?ѓs^0>v{|8<_B@9W#=Lb$aHa.w:ߚ,fkoDUR ZαB?II jM9/]}i~,*:k%S/YNx5@&L=9Ð7I@vȶ )y@'?jN퐘LCyfXe~&rHP4अl]G@:QVi #rwa&uNj0]@6^d3}S)IhqPnC`q+BdBusjKh3\i^`?hu%ĥ'WgYاzژb=E-6kkuG9z+~c} ǻw-'&Do 1Or/zomEujxnt8Gh!ZIN@Mt#$Z^S6 R&d1| R1#ReȀl[>Z[Fd.wɄw^jbE6fMT2ü }c5q$w`\v7)sj|kCէpAZk Y w㊁C9a3Zb>WŌyذĹ;jck P}J g1@iKe6 szqXd-|u:Ìgu6{Abd *N$1cb|e$-Vf)/H$5WV +v-w+UQ/R,CA1!$27iK7Gw!r@nLf\}4ni?4Gm ![sH٤9w2R4mf r:6'lEp^_aZ޹Gyw/?~3TNB# \@*Hԡ!l?9""#2wA e.*Vuپx$JTw`83N8Ԝ |{|W\DLٻOvu|a,:S%󯾅r.q]Ϟ(un2qxc9B])pJ>81w|'xĄ=318r8zIOƻ 竖=VMV#x>s6wTj/b%y UZ I"eN L$<'7u6Njh\c,/a$nskf5>7 .jGXBm?}~yt* v(xiV\{ѬTLܙVfǕ$qi\06i%~ ׺I}Y~޸S9wolK6!.P_lJ2k*!E-[8(mľ2!l/_7&pکTj=nVƪ l,{ǯk6rg|=?Vm򒊑v:${̢?:\[QN] b)ށ &JloEbj8RF$ze5kpBuڲ^ZW\P0~!*;ދй1o\e)"Hǝ;\w4d-6Kmn煜o ܽ>ˤvAiSE yA/AU)t2YdO?dy;gy(BEӂHR ߲{Зo8o(wDVqK7iy,"w<+m)QvԱDy OPhB4iHBq5g<.:b>g o{{~2HnLox4B,gNi[HW 6bt;a[5wm[/56"8CeSo K@}|>d8 D]Wnzi%G6h.#M4T` n4GJ'>YBG=>z)$C_c9ѲߊKqGNzoCd+̀\.Bx+Ɔg} Tvf~M]A|pUpQ<*$HOv8:;MWқO@A)YxV)4y`4?%sQ=OϓQwp*ݨs?x,2R)@ڸ 7=mBFϙyIF6+?Ԡ='FsT|5 qY="լs%ˎ9[ ߍ)^(%}/GB#-ݧW M:9LȦ[z$Q Oژd ǐ|X{ |5DjNWAU#{6XK#I%$`myZlWGh eJ{:=hN`^Nr(eG7V>TDpF0v9q(]4bKSEFDJkg5ѷ05 ՗?e4P2 u-l΀ODd40m VZ=F*T*-ٳ`M N,D2s~LWm<:f'ccz4ʗbJ1"RF,yx~]Eu?4.@iFSXv14ځVǛ 0FYAX HP{g:%o!͟[<`;$nA-"ʀE.* o$u3SYd3rsw[v R@3,/[ O%m\آP;iɔkeHx,\Em@SXb7 (4V/ dpgb `%j>S-*FRҰ|Qʻ-{m @>Z}I(?训hLyETA}"? &fg:N:yoτZMlf EM}&b0or$:N;CeRFIk-+rf*.5}c+c>C#tKxzMr xo?K==,]Ƣ/ߢ{GGf7Dg|b!EX,c:Ʃ>,{ JBUN>ZEm߽ B<0ZDS(a!yvuړ.ֹ{Ku D=Ǚq2k>ەvt!ٜ͐ir;i2#u\ 5ly(5OX%'S^\̈́Z `Mn=$m^i$=Bop{'wۨe+G&d6OdU+ayϳ7:/4 YtiQor67Z7ooC nG88ID]jiݭU>Ec̠‡5Q%=X00)Ji, %R5x$q1%c<J& *w^q\qޙ?+\ !o6Uv;E|#yK^NtJPO@\U1|3d _TSحmc3}Տa}rm+zY%2ґq!eٴH?҆*iQGgkh5 1ߟ „5 z? eHhf$^[yJ#bߜ&U/(9ܗ"햱Khp9[U ~x"_c']ׂ^^:s_>K&fçA YQi~3V n72y:ᆙ nm~ *x/aRicK1' ̭ *2FOA[ng(?.KAjqS@^];vw $mڥD?@ , bݓ%iVu30~&'[`6 47S~+Vl?XT<;+*,r;r#ϭ ~k ى{5ouv:s|5D ;,Bk#q fh$}z&aqS)egeiUŧľ#x36/ \g!wTL爽q6hy6  6(Q 9JA @JKn{*z 5%{VށF" ^V+PЊ6; ?[4v,]mYlॶ֬sb~୹sM'8 |+F ^qUZ_IOitVB"[_S&heٔ(8is;VbR\K|s/ ?Dz׋)dS1ŲM3R- =R k$ Htp%VzJܙotׄ9nV{dI(LE0^)-ȭw"-f [ PRP0xI]j;ٞ&AEK~Agl_0mc~GϻwvLs@iEoFBzW3U%2?+ː3$%qTf0T ˗Q,Qi CLa>DN ~5@'sb?$+Ϳ+c̬0VMb\zWh4B(cpO * mgƯDn3Ϸ e & В-C8| 4(܈p㖳-mТ6+\5Lqa=ri~5Tߓ0>#zlcNin{ ^i<څ?ߞR^QYk$.U+OwoHaSkzo#e)ܳO9{]4A>T( H f̧h `S * <5ѫ9=(g45o~Vw6ܤ47`~'(}% LMI@_#l҇0;EԻ\Qa197a2Bzve B @kͲRn]ait}_]cSSmOt9& }{!Y㛊rS$vwe&-|5?nk$2QWU0Nm'HD>Dpi P ʸ-w۱_g:OöD$Sjł&ffUwq jE ɍKeCPd9Vt~(;+U)! h8Orߣ;  Zߪ#@;ێt]3O86S1#,&q*ߨqd?`:j|^ר/̅5bzRL1Վ y5y{Bmi F[qqa*$iMcAZSm-_v]ϧ0D𯵻,̍Fa>lQ&Yo<=SvgA6U|6)q`6 %oHwS`zc]w4 H]+=lPTْAڔ7Mw# R(|r_>$F.! YZ\F1re,U}n=>5Yzo„@ϻN;eWsKX@b/["6c"ݻӿ[̈t(ϾYP8fJ7#KG^zzf HOf G;tj)#j}I&U N17;FbDu8KL ( JQ*c1Ds ʠ:Yo!KD@zCU{>LEk^ Ùh׻9D~(q.HUJ[d@Bӂ/xW^*50I|m*碎W!R=cxEjc(MQ$Z,`NQ2? Ip9 Znd[ϼ\[ {yN5A^G\ 3p/7*{w)}+;.]9p݁T"u0.Ǎ %|!טT I\iK*)g?}bpHO9Xh@}cBS-E핋*ӵpPvM_ ddڔ0u1G9ð@0! vԘwh <F&mj`n"ߎb5>!J &z2HHA44 a#8Ghơgxj/ڼCcfl0 vp{~UQfrinQ"ሀ66z֫|M#JU1(j. i14IA:6` 8dShΗla]MW)DP;^=U]PYA~hF~Qtv,::h.Px^㲥ND"=܃".v/ԮVұQ{:ٗO k}.g6z r`w:W +97I+TJ-LS8 ,N(>{GIND^boq54`X rK/EojqP ^1QDhaE' Ri` +๸>yDEq 4.ƥmAhiPVz)J++M8n fGutE$|MǏ0\@t[EWQ@"\_o(e3u$@y9~?ivS`QRR'ɼy,c#Yx*HE9f*,W䗇}QFX0+"h^XO m5e?H\u;I1/4`o!9M̖/ϡ}FC:C<Rrg̗GH@47b [yCg=O+ ‡Z<W&źXZ?2S(Μ1rP*wZ5|@z[]8iWNZB//[URw3$Eu, 40rN|;|п l6r  GJDס_ӛk) ]p=ƃ4ƫyRq]4D6q/I9^ $f]Ԓo,3|O#҈Nhp#xYOmy~ؤ/4{EI_VԞ "Vka,Lxb^Ѻ$PT[(ud=֒J_MAZqf M%蹢)jOlʒ3b,xt΢$oÀV>v&30&8G&-bz}C> JRoԹF %'duUǍ)$Ho3grIECU((^ygt9VPPZڲ{.dUnb, FtPꗲ~`}AKV/Xbf IFlzǤ ]Tk>2RΪ6,&Ejܲ!^bX $GY ȩmZ{kIԘܜczhΌL7<3QkS NZTj;U f͡?kpA st-?) PćZS#x"ɔQ?{bGߩ|ڣ7!zRx$b'W/{SVJUr3Ev4%hpޘq F@ilBiPySl \uìf ƧSP']1;fсMᏛ&u?g^H0{팘TJTtt25`˞gF;vˆ7׹r/5Vڣh!,*d{aNڏVOtK 0—WZюvhh4ZjTj{b a=L3#0JT /+nߣ8at6p" s',Zb>2slSY+4nwȄEH6u[q<I Op65Wd+~cDo*-[YB-GE:<*pqmI&D "4GGHO@+EeGw"oK2.|ug?.B.<&d;3D#shP ervtmDn9OG7bBdq-]GIQûO]9s kp}2j!XSݒf\/W>۪lqbgXxnYojlq'P Ʀě1|F@á%BJ1M34q޵c+3g/a ĸSnhtDzr9 p XX62VF& zV팦 [ȂOZ)Uzo & l,D $Gl, D4 dR^m 0?1kP s R#4F[vE<+o<."V˃ t\nIdEojbD5\1Ez' l#h\,!SSC,"%'BJvN?hҙ~ @'~XS}WrUGSZ`s2K! `_[r5Hl&;윩5?lN"P]z~[d'c|'6/0+j|*V csa%0qCi*T?L3^5 #tBWZՑ#wF*FVM W&c^[Kqg 9vj)3ڳ=IҺCuԿ gsx -`GuF;@a+n!at*#e #5Q gMT21$} 2M["R?q`N Mx@0j{Sy(z6 {\7vpE/ih6QiwK('^N][@) a(FQe+kaC&T%]ïPEťF%40qœcI7'3X#3qItJNw"{A~CX6QQd.a\\[tHƣuHJtw垷'Jn~u8RiczlQJ<6K!Ldz9eP$m @ 9".)Qe<1?w2.jbYwn)>V=0Gۤ`k TDcFb1zFb2j Eh``XvzNB#m4MН e`(q,hebK="6hy PtH8 AZ!o fԸʅbAjSDp_ Y^0u( ~'hE6aiV<%s,(f`eҋ\6|ݡK/jՂ Q 4,;| +coGVoJ"x_Mu9(5vO ;Jn`49@ MB%ZhAu ev$b߹.TT7٪2{4uc46&miB#O̮ˊ0riѸ< _(wUb9wIu9QF%!\|hcŷp4T=:!l4#- yAn_vϮE:4i܊ui y3â]`2n[€CkI&הT0jfA%|Gi H.{^^p0qZJ8ϡ5IQ䑐Rں Sq5rxMA<42uH~!,'>}BgB7.7ZDBԔs"e$&5) ӗi)V&6O4EUd_26ǓyꉗKoMA/ΧgIC,cx֌, +0hfׯ>i0~]- 3cot\3VH1)ؑ+^;^nn!m/XJ ٍT0Q$aLc:8Q ^_Z(9nZ ZV]w~$OנI>SyQҪS,KJV0at3}il?X,^C\LN:l֬1PkC K%}LqrP `W.-5 >z NpR(4Lش/P ̿ ^dfp 別$]|uCiq]JZ`C.9Swі9V- lmzTXsF<@.YZy==YKU5c3ЖStؙb~xZVx*oW_SeW~An50baObv8^OW.e$FZDQhؓ܈bJKY6j_?NC|d@ ٝsQSԹVpFT$zH?аU[j'-fWJ@Ouy5 f. :ŷ $L{jqoI1?/N7/a Z;21³+2uFr%U|O'n4] o/wlyskæ/B\Í0*哫$7[`MLkB^dYIN/V*Uip 0&jKmtMZW{㸋Ig_Ƚ\bSZA$Tܰ|{˪=2%Qf፪W:W*JjT9- b~Cn0Ҝn9O[ ?:nxU=DOZ4BD"ۡ@[ſ,ePd;Pk)6&q=\璫z<"38C\:Fd[VL"aޥbA/ki1w8"" C]c6v1b@0F iCpykRQ -kB@hG8h}qT~ 3T?ގOb{Ưì!_un}TJ ܔcCi}gtcK Vuq.TT70s4¢̌m\j4ކY:TZN0N=ޮ1V TeY%>G2f% `гN؞ KK>4_`hhh+DY/c8n̐/DoϹ6912C\)i>5Zʟ834Lw̹4v '[0W.X!mDZlJpI*aen_0NBjvA E4)}a8niڎu p)\7̝hޅ+ *ELruj[5&rk uFiNȮ؀anxM){' p&*ZpNGk>#d" Ŝm&{gy.\IQSf?k=YʠM nlKG',lXPvSkQeK ^{|/+m7T5yzNr|cU Zw1*c?j_PzI-~Vy7vT-Xex.3bU^-瞷˖g~U}|[o472|GA9{q \*1`4 xs 8'2Ups/ KY5_qh1t9]G\qCc͉pNr| 5昅n粅u"z$f"b3y^BAV2v\)q٣08Eb;&qM5m 8X/5o8 L\V?x *Nب xKf)R\B\9l]uYU W28*60XgSrd҇ql7GEjH>lW,:d&hZ)t,7'5`/X&Zle=}Q"4!>R2vng%KBcoro"bXj s$y DՒqjq-_ʊ%Wo#UKǣn{eyߡH}/w- N"[Ir0/b1 ZB?Bpa0Tnfey߬}+ 7_]1q竓78= v5My٩B=Jd K֍"f1ݍJ<:wR;< ՚1F ZжLj}y>ե9T_Jב'BEF>KԊۡ0z 0w}``k2 s=` Er<&J9i%P1o.S[U*\R fau׃u9"ӼLh, =tMrӱb,NYehj&ΤSܯ֟cF\Y7RCQ+x.Ùk]QyH.fz*hw.l8|1T̔ d $s>jbBt]76%FrEQQ*8 M(7]TK9T}-շ"=|W{79]! $P0%%k97OztE";> Kz_͆^}Y57$^z1kDGإ)( k{xeNC< p$qI o5gMt9wZӋs?(Rq > FOgQ{;L%X\e$ l*!NJ6t=WRQ"K(ꫢ6DՐ0<9zMmo矈:U$`ZR%P8ʏ՟(Ꮺi2uh('`QY\~֭B;_Wμo ̰=lBҦb2;ճZ׷m>9-GT(MI9dW:ܠT$K+~ψjw.ɧgc :f=rl2vŕ_|!8#OY%嬐ѨA˥:EN EV)udXo:CQt 亮F61G=QX'%6h#[5xR8>8w85:]RC4Eqrΐ"RJ矮m ^:?.WZ%b1ʊ)v8aD[_?WԵhg۬L8QQ&sU_5|~@>_+[ GS;%We8%{9:Mo+9hUՙN !,%]U"yra>]2JJƬg/OMO9kPW3|kvtRŪK`z_ +h&nuhCeKx$ᑟpl^K"rhB }òu @2~wpfT Y "ø/Bp0۩GVC!gp5)K~ $yʭA=R`ij-֝ݩsˆ??+&GtҫTs>(F@Fk:GE:LΊ;?΃ʼk/ $zkp)~7Nf%r""N×u\,k+GR|JV({F^xde is 癇 \ &83O||Q&LWC4cH;T 8L컈W@oӰ2ASv~}9=}v¦&h4.& JWHFFrT]BneFM`E#]C}g[B呹%SVnk4HȂvj}FOԄgB ئOl i{2_WJҐ>ӀT/}UH"zRxz/zz-t4PQC6)p d~~ 't1vh %EJ8+ۺÛ1|N}GZZ8Y]P`z:4!,XXV I}1IR^Y|<50WEKJ=p98^,$G{ʹ"~-&h>mGu 醴]25ֽE%;8F5{R&(UwEcJecPψ<Y-^xT#/ǻM'*q8eF}]IHI!"t%XtRCWPc+l9N7] \!>SzK/ n\h?G̐~zKL_"cA ƒ G.qʿ +YgRGgm>}/Go%jg-IC{\)NBEp8_FML7)U{H♝Q/ˁ47T0֡55TWT87Cqؽ-bࡸ~]x> *2:ґZ /s r1(pMލÐ2f5é4L |(<7Pq.qjANUǥںL+x@tܳu߷&+Bk,] ꟐbXtp:ZD2gV rU"%Dcc'N.ML3,c[oT#Zs/zEVE+)~&o"K5m1L~F7:Pm_`Y q]EZ(WZAhͺ82fAA! sܷͷMTaPҊ%NzsDtpM+7j|#CUR?Y%(Ai"Ӥ&RI֥hr EU+!o!T,K)/hy>6VKӏn*/jE/,;1+!. Ox~eSD4埂oL{¸F8圆<ܳ ojh t & *87u3v r=ġzQ=m:bKHc{EEsVUӻpDEqL` tvۼ QwPA90V8oz,]Ǹ2U#G{t]Ք$6X+x7?TP](MTZ^v?9ҮR"I;A1SFY+AȚ~m*_{ڪ'xn45| ]V*>ߥrw"n.@DT@^QANt=RF栕Ogn.-ڬ,N48"Q?l;bAD" ^syS/3erE,5SKą6mD0Q[9oLsߠ>{@*[}-jo1K+ڹ3f9r#ƣUiR& %҄l;(h1^{r<ScZl07ɌVSrPBi0 bym9IZAH1CKlެv>.{5؏D[+@411") <57 E\!Bem8;@ dlwm,{R& 璫dБkPC#n|`ve.%eXN/[cۨЃp{B82FcC^kiDDE>"6-?Hf|Cuw)o; w26..@Ko*Y2O0|AUoT[!N"dB)֞P`(r!k3.P1K|bn~$W+n@giQ%$Bth$x.ib.!p[3eo9դ/j|gq& 2FBp/F$:˝} 9=7wC#pLm"w/~snS3 "Cz+Bx5 us kaNk/u]hy36^*m=V D'Uzmd%E4Dѽ;W߸@@}Q~ڹEdI:xTa_v س IM Sx8s)1H3DIڸ;bvA 813S ,Ʒ5 `짵VvwpÏ('/ϮP2poեI]Dc:Q6V܊}R FIRplGxc[DY*X̃oe쿸_MfyLv_iE\o:4g*'&S.df` Ϋ|^ Ȭ pIdg &SN&>LaVE5$ܾ] ޏϾ«]<`R{g~$(oz,/0tIQd Cx[JDo5GC;2:L_L$µRk3x]I}Po ՟ K0BM(['|: "BϾ^`ugwH7\Mқ" Ii݉^r@\2H9٤wQojMS656o\1@qiܒV*lyFML~KhE[U4fd+_=m4ȿ pWl%}E}{([<9;Aѳjh▦>J/ Q,Kv`ϲ+Q\{jF[tpiXSlص-\6&Bq:*+'S5<$<;2 &p LKq:a7u`0j2Ne9zl;n1E)YP Np/ۛ\*LϮ+ZvC|sg3|򴏼޶cx&;PʌAL{XORW%Z~Lm&}#v⪓.P[)g/|MH~cÇ;=ekej_g+I 5B j50ϰ~NCٹ v1$Jճw}v*e~Ңxu G5zRUA)ѵX-Eپlgy|[. m&F bqwigbD,N,ɮ gڝ>]dHx\(0n?r9)N0n:]Ѕ܇}Kwݫ[!T"<}92n_u_F7bQX7' --+RKw~""-Фf<lzλSogl.O6G `VOj:h-zPܷo5Ϊt o0#q `=荖{bE<ƀ}B6TLm_o)3FJji NZZd'eК'<6P\; ]aŏMDK1"м%U36hbFY T1ٖbYTn$(Zߩ"[dӟhZi\gmEc4-?p*QbVk@cknHEGVӈ^nF{\Gԧcntg`{䕒R70茁fOزk)UAI_ҝ#cuPL)N%T#ϐl|m!8rS`Ȏ%w 9?JI9}_E@^b`L-NUkH!TJM0uL*˱I6!YOCg?|UEFfB!ͷ[o`N*%}6yJ&o6i -9 0FDd*.Q,ٓs'~8U,TG_ƂDR8O>j8BoS E9ܯQY 5%&Z79cnɇEK=R>I{N} <JaV Y)B t(eֶdPSJ*S@A1jNgx)'watT1=,W>?>&4dݭEIЅnj\ JWm‘pJ=^Ak=Fê$ٰ@fUBÑ_4>n҈Fe(sF;{ثm j;Y~0}{Qĵ v=^nɥz`2)0zWԃ!+\3{#@us-o=Z)d$fRprޯ?'Ŝc a#QzXV-/$Í^ ج_A Hթ ۃ;M9TͶzC-  QBytvrronfSȭ֧ ?_;l\p^80)ҽHi9)4"9#rC @5$Db<fQN1 pߡ]G%8VAy!;1ˈ>eݲ̩b@}juҚKʶ̷El$ )Ha(;RHtkǖ1rSԖIVv< G k4OT MKl iř2g0&놠-ȉj@Y">ʹyVۜWCNݍ3Ԣo]J'ȐR*{\B<_%h4BV8=a)Ͽ8kHU &6w6@F_Ɩ%q k gF rEU/N.9 ݙlP P̨U*%V]˅z]x)Yy)&9~jV |-{@hM,<mntlk Ϋ^w=r  gz@O Q4 dd%FB\JLg20:4e}QFC> JslxZYT E*^x}P} %zLR@c83@2rMkm)QV+LFFl(Om0-Ӭ-}ZCyIX,Ìs_d '>BQ"i:g'%I!&@ݪw%le(٠Fjg_uO1bZB4S%;0׽p~Xׯҫ FɽyG8`ju2cuF9pؚJu|`P^N}]]yR<5:>yG"E⩇*:6r75*2~;k0ryW%6?X+^ljl(Q d! #0dpLxҲC'R pUa 8v^ʲb=)(& Liy[.9]tډO\Y"JZ.YA*'05V \;Cr 8 1N<;; S?*3:/5gdB]>C W9"0ܿjǩpG IȚIrZ>,ڶͥO*~ICf:3 m${Zxoy=kו1/qym̥rwiw'k7EPEiԨ^AmT@gU<\-LVjs{ɝ::4jghixɆfX r۳|%$;YYDk",w::8cvl6""x JCQΥs6PH~1`,Rq1KKа]m`$ X0YY(#A5?h"K?G_Áz I͒Bv^=r[rЁdh ]\ZhYh|D6/ɓ?n})8 Nn\& n2 wP w^" tq*Xa=)ޚ6p#KO$ވϳn$&Fc{@SwmJ} zX!͝foa2s@bJ/lDw cfxĽ 3Fjcc>o?1 s8V "״g]ɏ_6֬7N?A4Ɠ`~7}G `P-P'U^( bȟGMis569xVD2sA $&SV2A^KKynxzIX䚜EBJ%fOA~ɚ'| s)agm[{~ɾ6n6+Ƹ澾<8j0iApRnư'Ap7#C/vO9Ai% ~/Vz`7p$J!ƐmɄ;؛iUBk֣K烖CRg{U 378d|lxGg%k״g!bZ_d;1ORz3b wAuS.P^G?n-^e{8hdž GMc=^䋬BB*1WxC &F.Ke؁ BS`v^ܦ2\/dhaJDj`}'(%X:ﶙf\g1#KoBbS}CKOѳЅj"h.R=t8KZfČ&ç/7k+񍪘J|.h9 .P]@>B@Tk|ޯ&p`Ul$AXklg0뷐giB½2O-7Ow۬h6 ~jCUحqn,MLC1!$Lng @Trwo'is׽TSjVn} p{(79S)w=xo6ᐟ29-DyM_^ 1 jf,Hii6K.tqP, `M=eJIK0bq-J[TBHE@4Emz`44j"G)mO@| lkM内.)SGDVAU,ju eP -G>s*Бȕ)<ʜȔRr N/b`Lu/L0g&Kev]fQ'gyߡ+īmV=!8x0z>;2„j(Fh1 xQ.ʼ.%ߙ.fΌlwwBhq[aDXkeзkߝ)s{O-Y+C=S죤x2!VXR+uGhB3a:#\qUY,4 P`"+1%;e6}ꬎA V»wQ PܼhGΔ&W9@34 sq | `Wwy1/8PuIQ5I;hxbn)LylWA=؆rs /Ds ƿŸ bfg^KELy3׭3! % a.Rdi h /UURmF]o=Qfj]rEW(I~n6fd@Fs1ΚD\@StYnYBq33x.Nt3x$=/HCk*U:eftw h10IתpF7\P3¾_LNǷ4(q[2J㶇_]?bfOqR K$݌Y %bև̷1{|9KԨtb'l __Pb]پte"ɌDPh3{A[_C7~ÁىWKn_lyX(|PzG"+fI5 1vy)*RA$zKQa,2yQ2 *_XGOɟ;cQ̧5Nco3,.DYFo *>_q!'r/ \h g8\Z?Rrz9L#'p1R=0s,f/fAbGDi$XkK!hg๴9Kխ:|A+hIշ(GSU E2͒gyhk놙cݣo8jy^EkYGuGLD1)qR9ŘGK(cS{)WJ+i %3iFU`54nc,|3XL\D[?`##-_qW3g7 "<^!ʓQCYo+k\OI'V!jI\2=>o Ґ nvN=ЦN-;ed`E@/0IՌ5Ό3G2ۢ0wIqY~zDbO8jߞlH1QԇcX|&^o}Y55&r{pk|(JxLl'W*xxtuS>di4EQ׳cSHyCp̚5,+yK = XE|@ FֿZ~yt*.dKD dT䋿0cYT6z7`CaAk<kJ@oW^8{4Hn 6q~_>LoM >#5yֽ|ZL"%r8Y=ZAUO74,E30i ,{qX*$Ls`m~Zr(q$гQFb:L#45JQm%3N)ZpQط5_׉yڝ҄k(O#ܑI+4` X 9u|=18ΖHùaj]ZjPSJ<=t=XH"ceW\ʪ ?$OmFmV O: v(JKNѣV"<;RVcۼ 3J,G6V{(P'& [?71sJcL+:\.!Fs2HR@97 ^0,s˟X;QHOK /KK% "vtJ, Yuxރ6ѓY"ЪJ'8'levA lfHcOZLY?ڛ\wDGɯt8;CNB瓾45r$ʆYbB`g wC4v2V.AL-{huszР54,04a4l7U ]w7 h6}OJsہ0 V 744s$a-rMg.g7dnh8 հgq, ۞G勋YcnIzLDf2/W O KU\ב'[Ԝcn!]A;D" !S(a"%aGcCUtAu4Izsn4>2`"؅ϮcJvҟ6t3ߋ-~9ƾ1 d_.oHx[;sRw@>O0 gfGJ#[zxҬ7*¥n ׾o2~Z<"Ԧ{H\*Иb÷ ­WZER;m>s5wpIB X&` τ]q3/şh;L0g2 h:Ӧj/u4\&/XidO3pAa6ʡ)|\G;3bN=+[Ƶp?&MU|Ul^Mh|I~@` q8@y:ƿJY]RoWn)ܴrTI yB |Jd'1 2L+voebGYm!fXkׇrH17uhZSSXg7-#y{_";"}%[G1WX7?[O i"eH 07f{1sk0@W=ʛր>VYmWGqfC0+ ;Q#}[%.>M. ȶ2y3>Ye0@ӵvL/?'q<: 'Flg#Yg[ dH[YC5鋚V)Y"*K$үmόi Kc)"Q4`%vܰŪM {d;O뫓e8xx9]eo&$\@k=к+H3r$dTU@p&<:# $'T%I!(*U^Z\$lD|; s4m("Ѕu^@6`Tt=>pweErf5 wyb5Gԁ1T{ܕb~ɉuXU"$څG]U;2*?kP~ïk쎏-/ ?kxh^IR*&23+;,L`X>) cRT v䍉ka6 H(\խ`M2M8 H9ӟ@>3ەHSX2HG-m{x.:vN()W[:u6LB WV>x"Q>N!-n̺=!ofqF`5bD>8B LR̯gvv-%*ZuS _#a /Ǩ dSYu09ee=OZϔ\D~;"RCd[c훂KZf|݃?9׮O[D=|qO@;X+E$q_}^9L%*|A]/*8)UN:ā;J< X6;vOxAVӻ1D h }\iPuЅgv(::1q@ jY<ris&I<<,n4V* fC l='gO7oATW;:-v#1Q ];g7 +'\5n1w-q5d%6d hduQPno;Kipi߳Lb4xFuMJ=`TϚ>9R׻]'b0N78ZӷM' (N6k&Xe WDd %F ׍ 4˱Uv!'9j E#r Ϭ mf롽 -Ha|4{NcENB_ߺ­ew͆rI޷BdĉxvO|61$$OHA.53;!0q|PCӝ;e\scM)dJ4(#HjӠ eS&F4y; r\Ϯpg)`akp522S{Lv4C,||iu cMk;陠b5f9l.{frv햬΅nd+!빍*@Z3u%h-) 0F ZWN1y^T(\ӓy?ͥ0|B6i=ih\!qYzwŸLU|rIg< s|U».JfDc1M|q:/=^P>X>frt e6sU{M60YW 6ԹOl % Ta|4φ(/XFoX[];,dŅv5vZɐP 6Y V_VSJW+Б;;I)tG؆}M5>umd!(] q#Dy{p>3N%ioqZ/pD,980:5hDxƐ*5"ϪU8Sᾘ  GrJ77r8i )]TYPHCt'Iz}1Uс>`C,Yӣ֫&/ I-+ +K,Fu{d\6sG{il.U5'|Za[\lzx=9C,!viK_vy@:z}E_x*z:;tiNgU ,k$Iw#:q;z6e5cpq,>p&}} 9T,Jr8fmȕ>~T/s2^t߈XnU4A$q$gH[[eʕv_OjQnCa\)(Gkn2ق+4vk+%Iĝ. gC@c o"@(Tlegr*i'A'a-'mq#byn9Gcr"~h ?k o)#Jd" + . -|햵c?A>jQ6j@*D~j"q4rޘje#mOI&7џl :Yyd ڼ2L[yIJTzVyu6F#_YQeƖ7&S&-lͥ+0Y<6$`r`hdjy}0 pث&>dm Ϳ߄qmy c󵭦vؖ5LJNA`z0Tg=gI&R4U&[hEq`n@<7H9d;P~<2#2^N/nP@MVkRld v6X8Df|۹a*xt^R5}6MT^Hsٰu_ y@TuK{LV 3o- 7rCsσPBrdi^݉3!XxMsV8~@{Wjt~0]y E1 )2w8&HC첎P2Yꖘ0ӌ暠 gVUdÇ?*퉯IdjI{hpj>?~zPHUaz! @ĆpEjZS**tߏliW =\E NB)]BFRz]t.3ZA郛Mx}hͰhoc6XƋiqP~$l& V]P讯- Iish9=0zʵSHpuc,]HS:V+Î!'tFapc {Y%#;OJuŶ5!Ӱ c0b L5ي7(OaL_*Ѯ m&Q>B_OJ|^7!X7#_|(#|).!ցr?+"=5q_jujy"'Zv[`sXI!sF y0.i龡(䔳xS~~6?;w(6"ۺɇ]EUH@n2aMu<(x󤞬O*peIؕs5 yBPyx:7S  tĸQ)O㋰`zvbt( KH$C1<)-՟K=Ӷ*Ni˘rqɪ)%W3d=6Kj=53, z6B CM/:5wh쉕A`S {2.T\GP[gX Ѱ9Nԙ8+\ nKAT JfHЏ([\q&MdX1"Ml~KF)RwOA˜ӣ(ʩ'EHl+E΀D%|^ƭ(!7Х&242ח+['TK[n/DN''cNf/̬¢pJdaկzT6FLLrVRW/hRӐȦz"'3E+&(j;Ӗı/#WE Ʇ1`4ٞ!=;)95+qϸB'=pt_4Ww+zù'?qn ~˜іex} kr8}c_2Ac@z8kihg KUͣ7U.ۡ$~:Y&+4ޘ{cL= X;!DNeaIAie8 cS5ѷ ʳvGv7_<(Wv^(֍WZD B;+1x v,-^öX6aDVs(𲱾E <4JtA a-R/[4s_֚g[fyEUOQN$ӯ-Gc,YׄTg -[t\ѡv6L\"8fK3WZLZؿՋ@d~伦,M采Il'3j'T @bh]wo[Hv v`P'a @.6wN.mFas˕gG;bV5Cs&Mod"HW·/]Zvf}%n?z@џ>$XCvFI@U |xn4&m1ZjZp@x@}Vjyww86s!wOYD9r`?u T"VVZb|pUR9u#e b$!5BErg@!᳂fM;c (pJ~d XrH !3d$*8>Oh9suCϓJ5-veeܝq/$o+1JSb`}|z0µw|tJ\e@umsy#FQV6^Tʢ*s1ic6KK`0?ZN[?i+!GDLMʫRiC`B`ßfm:2%cþS`"|,eCg7J6@VHpf1@Y4lǼWqFdd1V-@VsWf5Kw[*W7HxlK*}i!xRt~ge!fT`.RP"AP q2:#pF94.`8d( Y8QU|dVN?a͍s]]9>QrK}uC@VS4s̫()ύ*U~62hy SoHxZ\-j@Cz:X?un9V%Ay)JS Q>)="M°Egfw[ jti2$R^ai)x~"`^?t$w=htr9@f);7Dk|#Fk|l1J>J8²yc޸&<,GW㟓R2{s2sط n}{sU :<=`p E<7x K`Ai~+F)% d??aL{ƄH|KzD}/Ne{5J4/&>DjNj|~E"KIcF^^yLPM 蚁ʉ /xF)vWFzFx]ot&H2bҷbB x]Q)^rZI1X{5BƐ݋{αrsnD5"oV#x1{m ÝQ ͟m@BrsHWp0tCO~OU+wlz/<ѭ>[ȇsR'#r¬\|G4.0dډ@_o 'qSxhlnAVSH8/'3C|y3u߶qo?/W۲ONl@"8HwZ`Yd]y-{cg#TgG5N@[6 WZ2XtL7XPq9cw'c&Ho3HXrh$w?"NDv.I+ m&l QF z :!>AG64g6'ŲQyj-zp?+"5*çPW^mGr:^hz_4g#2LpVa(\߯tVVR'm^(pIbngD^WuI1r+t5Mਝt``"ɝPMI`O=7b){= X8ɑR7j A]KW9VFsz2 @)HC**xj*d?caA;l}cۄC\x>㷂+ᜅRvKffo6P2у>R'Do)l8ߦ@TN)I1҃3TC?𺿲%%{̣.*~vg<;,l+CP/v4T'&{Otǡ?pEK|NU7ҏ3V M5u&2!jRb+[B,\\z 09Hus-U*HWYh:Fa<֏FQ1NR<bdcW7L}nA% dT)zK!sf[O_3i,w8c6/z ״24]YuʶPm$Ng(me<!V6"7$wU?V(M5EfQ'ijY){X$Π MqMl;񈅞ںJgG{4eLL|eDs'u>!lDR؎RZVa*yپytbo_Bôc\pxCCڹwHcԉ)87{mkv'М[7&A99O*95i0q+煑|1B濙 {^$>1`)}m,9B{)`2_A y‡K!|6?QkR ],^2.9-.gS%m^^EHk6n۵N jn+w<5@0aX\ g؀&.F7Q7C7vFI# QF_mYXΎ*/gb:j1&s>Kcu!ނoX:2\@Eپ*^3Anӿdtŀ,uE+'*M.!8ܣTU0^1$aN˜N@~DT%!+v:X20P} lCZxe7HL䐎bp)W[(ˁ}U\5Yy/'h@ zeUm__=c ɇ]\ K~>g?Y+M#^ -MKeN1+jX*}gZ,"g3EN}Nq!=`ߜcčtŃP_ )~Q+ }X,WDȼ^ [4dsLl|%޺o${<~~_)FU+T+c4v}R7q\ٞ<w|FwҀIZЛBgVfU<@ʷaz-_ vfL9': j%!IGrq\ |,|i3 Lύ Zb7Hl=R,iFT;R R\9l^'uˌ M\-OC^zykZLBbf>@PviJ`bc8#F.61 h {|PFblG.Rz7SUrMĕlжFِ9@Լ !́;tfc:zbATQwG1QuMQ>9K(ȀWYx[hI aLmOaP[`"*0OHk{|gn sӇJw\zBWBBt ĥv U  NXږpݥ"*֜LJQ^|A :Y S"plcaIccKF}HϨ~9NI#N?j JdI`j7_Շd -s{r;xJBD9#'l'~ΜW!Mw5Cs'ƶTIVc-A kI*(6. A~>d"=Cq۽uSQk ;/.bʔƖ-ٙӥ;E`Zab^Uej:H؊ V0{eODH`QYvQr&hm8PcĹ6i DV u mע5Y* pgެxrK>QF|dB|dSns>.,|w80>iEv!-q=rC1 p#/GZiY:҇cχU\a2&olWr[f['^1dn #If{ NѤe kMxrlA= `uz~jV!&'A#i7@9y?M={C3i$:H Jb־Jcחp)Vy"nôf$_Gk{gWZh ! wvfQiӨd=?r8fZ4<^4Zy"1IdY&DBx(l%uȷ55àIv6[E*KB+{V]%`7/ ׍ t SQ1m%QeytYZKz1bjHܳ R/lR<7ص/4DFrWP{&wⴼl&~cy4/Jitx{ Nnō:*@Yg|FWU/;:41xpPøC}Lߋ|wP# /^ey%2X/׾ 'y#J~ڬJ[T/J i:g'Van]z̡;=DEf'ULUEMK۸{+O~ f `sҐ1ح.[\A3li-lgܤoݥ N uwheN6vtP|茂}y[!zۃIL s=ڱҜ[BIK/hQ㏺"/Ҁ/WW9KC 4iEVj1{tD,M(iޤU~#˺D\am׌d.N 1})rsQ\lqNI!+ Wu_5v=d*75 Fѻytm9m2{a7s3Յ F3('J8 coh5_+AfR{wOiPM,jyH}3n7gtӡ1bbH# ukpڳ$UfzWtZ'#y*VT+hdw&vr"&Gj0҄s0N6GP"Eˢe)qTH)9|3 r&:t4eL0yڗ%YN{GgAqmZZ"΄"FZа0~>9 5!EyMG*ӖBeV v{l' " N=֣+$m]ΰK}MTZJh+y=PmYu94f}!&beXLGWs6ZzU5rFGkZoT%WOF?`n_d e)a"vr ctf^na(To&2V)>XҔJtl6<\:߮n ߈D5K{uI<;#ͨ[Z|5 Acu&AdYxhjhаHxb2R(9-·~;8S{{=hkoBZJw&o+Ӳ$E/`p(x3QV M|Q9)^/dtYKD-7Ʋ/X'MGTQ,|mˁӥY!H6cB7ֈfGx[Y0WHjN.q],wb8aTfг^H\_pGZc7HX(qO$j[R]bC(U:>ՙ 4rZ,Ŭ##AaZNwuRI9&._0hݠDT~RhI9 n`x k ֿ!br %,k-f1i& d T:~~&]Cu \TIl{$r1˚Vԏ--ZԵ>s2Ff;w_V5,4pE9lu"[%(?]A{Ewe1!U4fLRM̜;~g$YmD^47'b ipmGڅqߙNٌ]/<^.,Oz4xf=lS.OA9;W]oqs sk?{ir$=3VQgVFbI˛4pne~`eJYRSU`(q:Q&^^?/KgJo"3J /fyhoO>bɔGJgmUg`܁,Z4Vgd"9|zMA M|#߻3;!  Ư]-歧3-1\M%0_{c%Gf&v 8jA*K::$QDKHq&V.Zc{fYhO*Zl`VrLD * jn̙f(/K:ȣy)#7q =Ӯ=3?1:#  EcQE@>`pu}oΰ9C ۱W ;,P)jU15 V(.n b{ ac,xxa; Bt}_5(_%Dx5?"oyH\H.!cbNzr|P[ U]~'ȡj0~ c$(>NX G#1SZOw0baI بNۺ`lChŀ9ՀIJ(P`FM/ghJI/~ ,a&~uƆ~BV3S(]`2b$Մ0OIe~Òy t"vu^ړjb\hub] uKPzB/9 byzI ^o踄2EڇreMG|!p]g &ȅyϡ6fU rFݽs{\} fCmӲi 8zߢ=㋴Srb=nC략D l2f@fG|%0U,Mx\/gc|A$aw'5b/NJޯia !A6 l.vONH uK ^ oaCA} QXO@["nG=[Y#BO,$HcDtG&x~92&۰䃭6 3D9Lz 鷢boErg:SVU4ʼni+Ji*.bczp6J?m{QtXs.= *H=t1"rrsgl'!)^04wv΄b5@*?}Y,\T[y 9ND d*ۇb?ü/ZЍi+R݃LFz$t2x/ pĮ%,Nn*q4x VɄ_SqCNWƅ|r LkXsl?-3}g?8j&h;X<]5inz6|eȻ Fai P2KݻExLmp: C)ʩR"Y%q}֥^MrEnIZO %/3r{FbߨXkh׶qY2Xor@ i6e hatw_,vI>Bϸ.cF-_|HEc7 vC@Ѓ|hi4{WZUoN7OWwAlMqy7 9XU(;iGya`=r<t>l ɼtw˯ u#> T!O%<_DLwJ^d(B PWvsk)TE۳dP}Hrҹ u$mF3hMnm047EGX ؑ}ʶh `ҚΊM'iwоo\#ŴӃj5?Sԧ˖^sl{lgc?]5au3Lw_iy RXeg}*6ײB%9aoI0Ojw?sye[,D+楨 [$RڛKRA_[~/8SM,2S a5靳dݦ RrZwvNI [zPʨ| ֯|xYyOBq촶JAt8\E,Yh63GEo'n#|Q p${[,<nSFkT90F vg3\($$2aJ[v|׀}N%B1jz,*RKh^~?Of}=(<=D8&{Qhbae9N1F\#$GK/#!y v-U/֎I tO=T0'(Aj>UڭUrz C}MN3/K􈷮o3cdzJ""Ao͓og1ywX{u>J'XsW`vb9„eKH^K4:LiZI%OF't 3MıQM7Ҏ'D>CI_a{@ e=HrqOq'&yr>4ɵ_E} --$6D)^6퐧֊j[΄%w%jyPdSfvs,r]syH9"Ouƣ16 Ra8iN ~^9V$[MzqHy=E R3 9{P=UZ=EmӿX@RB:^OŸ(>Wd6s"aHjKt&1p@t䟎M] kcsN ] ia68]>)u<$N)\B&#?c$`r`8XS٢Gqpk"_3E"X7Rׁ<؊@oo(di2+uDd3ыc pZ[k/JW@\FSL6ۇK#NJv.'ܠԎ2CC: ( >$m95/)nt4)!G!vfȷP O΢nN 4iH"kYiypݶo8txzghGjMVU]h8,aHqIO PVIp HU: tJuc!>?y:jг8a'4Z%6aQoDfyJ4EQ^&7Qh1pg˺U1CHwa"'8P#{ѓ`TmEE(/]kό|Xg:#3DPT?h3mP/up3(ӧfr$P8| iu-Uc: *vN>﮽<' J*8s}SY`$"_Ԣ ׾LAY I-0u<`G? d,ʵʁ~M=b+d1P=ۯ[OB&v$pD=ʠO:8On92@H>һGa?T+;O ]!iɤQ?1iᇋ"hǹr.db SHZKa ZZI(^27Cz tj76 =c S\)&^nl?L;N[@<㢮 ugSuzZ ֵxLx˸.Ͻ{= 'd!IdFm0IXc;p&,6s9ƕ&`@.яP Nƺ3X,Uv$Uh螢8ޏIxŭ}H>KhIΔFVŰ 2U.CCuq .M0·xis"AՒ0{CL<¡9`8lc!,g,,M祻F[+bbno %Wl-J~-]ox`CM, ձhvu0X.:δmH1;X+c7 /Ô_ծ0g) V%C359ca 4"/Ҧ"O;]C*Yl_t,{pFKi31l{Ӎ<5}[awdRX;gB2Bh^C6"Fxغ3f sQaY&[~l=?4"rXh^HM(%SU+M5nTDO_B@U"B!fHL Qᑅ*!ƫȽstxyP?F&嘘$ԵHdd%c\[[ѢNBJ}u#w&:L6~]mn vˑU&pMUj4Ao`>bJfR{fQV ä^R;~| x;%G:j3aB׮lE3 ##pb=wiZElȹwa/sʚҭќ=%^0_ h *s"ѶsP.S4C]QOž7;2;@U$gH T7j=tCmQS&Yk%AX[Nsm .4%ZQ X7 9$ ľ_HTX;DYdlF8kŤ p#t&Qr4\Ҳ-HpTŝn!-C_;*2QY6ƭ*?&H+?Fs;]'a*寲k&%uQ(%keU А"ep}cjʡh~7Ak ğ%?UAǷGztwIDt$p:<- p 2uILD$t鎲bצI//].N)1D^|a:Hµ 줃wbr@>mrdC5dS70%MU60MCAs |נTB; d: 1e57\ ݅9eܱ,ő-=%Q Gԧ 57=E$<"yU1R V0j٧- L^Sj~B$_؜eWKdMm8[T0Qr Dr7d(x|' 9/QJb QMQFe"9mKbLz"(Զ2avTD#2 pojr z?#5jos~]0G 4U9a\}ni= Kw>xhZۺ=6a e^1)uvuC'k"OeXKz1hۣ\M(Rf W:&?\MpO͵KqyI/bjP3QSRGܓTɱpBx="д^>LH '_UV) Wa}0VKFctb3ځ^g``ԂͮCCC~,R D2nwXJsV1FEm[A` .ҁƹe7Ckg8ԿtۭQKD@+CIp=pZYiծo4&JUg{KdCLr,.ORLށjV mD3/WYs~׫Jܶ@y.ɬ~;$Iǒ-CD_xvSHBPZpu+}D;$#2#`aTDlJFP:J{;`LB|Yb.Ueup M\&jfh)-#7*QP}êrz}EJjZTEl(BFjPG,YE C855JBKz} ׫A:H ^lc;3HIQZ{2¬Xqnޥux^[1wM;d*=Gײgc]U',p4f*>l +"CX{YPKY (z%嗦 04b^S;qƚ ̵LJMPܣ8ub4lhGʑqF}ޞ(}x:w- -L\E3;{1Uy6Ա._iׂf\!OxQF?DI@H?{r8ehlc6g\c-<JhowGe:hqkG$Ar`_VÜ|L<5Z轻Lu]n 9?zl997Yd}JJt,oZ @+gL&zJI{Ƒ;8 W GZX^qڻDc8d\s% C7Sz@8eؙޏ I /,?և;i8XaXu]( ϠNJ?,3B&pࣷK+zWѧY<ޮU`k(ܧC:SDMy0"9ɹFCφZ7%hAQ?D{ o)I ٘{S'UO^W*L?2 "kRAN^g !> ;Bi!z~vA}$e֌Ŀ4K@my4 ӯ9LBh`=g}EP:ogqҵتQ#*7h+~ k sd 1E7$=[9tDa1Oְn̒m.VI5/hW&v| Lڛ ɋ: nj0{bg%{b9(u <6 V d8;ֲ וtsƜ$<2ȼ͍[ޫwWS @˼rKpj,EVp*f]9HChτ8|.Rn(љTqAs$Ҳ\=,Fy6M0'F ESIJ guOՉ2#744m_r@2Q[ZS-#: 矊Bԇi)9듺45ŗs'w/'ƀ`]&׸zq\+pH7n4pbľEq%N1U!I4 VKI(< sr]<_ܴ y(9^Mm}5eSx ke<`F $y0͗{?:]d&u-nؔ-NZ=Ϭ~LlS"+$%8+J9(:bŒ7#뚌b l 'vLd4{'Ki$Y{ X6қ[#FjaLy_o;^9 WּDK9Ba޼3)`@+H`s C&vb?뢊 9tRW\Aɱa2myCвXrcQ<60g)-"Q `"\Ascc1z<$~ec{qgy`NI! \ dH9{aw|[ f= 5솤[q#Z)?7"*TdxM@q9h/o188J%me܇\Ƚ@FтL4VEYPE^DІe?aWrcm=qt\t%"%!B4.Ul ,DB=@J_ku Ĺ8Œ o[}wK!ؗJjg`5"*a ]L׃(kij37q ]CeT+3 <Ƣt@A8'VAEfauׯQJ/5<0h3UzGt"UX&ɜ < NM#mjt. 9. Y){FScn:bϼk-4kaư`Gwmx|!ٳ촂@3~΋r:EigΔUEnxh?}`xW|щne HMSȵsmy60~,>5q^]\ RzPo^AdbSJU+aP-7,tjXYQ/p,wLam8R>fm|UNO#Ygؾ,wb q++y%.y[\ ;5VfAjA0Ljg/z@hߨU:Ҷvwx-xaMӇ8y}poSm# 3d߬/9K郃OʢM" 7ԡfvGN^3fZ/#RU_KiR7Cnܡ v fgg9q6։!uiDQ,l&oBOU\噡)}Z1%0 3u8B;RݥH.:y=sBO.}gwJM}uᳲ$ (4G@ƾ#z}K)᧋}N KگInrYqk?M@"lrl4>mǹtD_#&kn.7% "2Y`5ќ}u mj3hr+B,Qwz(p9^x^CB7_7n˿ϑ(5{ipM/l@\v}.4;.(<(Px(JWZX652(%'E1tTqN68-п;pKㇽU:bRyBгUVd&;Y#껲?+m O_ow3Rߛթ =7o'r<3_X?OT/ۙOj)5{m&Ӏ (Iwc hW}D8 *sz gO :_ց.["j=MmtgC9 1qĞ(tb(,1p8h}jjPN/*9ߘBd 6jެKAhc,*'9v ԁ*j[E>-_0f$u?%RcՠzN#z=\0=kS0͘Edʝ ql-*1V~7tTku77hژ0N囋Q,Jvm'bLѾ~Cl!/ul=BDƬAuxiǞ !0{ȶcwliYF`,G||4rm2ֱTP/ M#GUv*|/z7y7l 6 euEhʼnl2lZ.kkض"bX:} I{ZEwhXsu\P,q2.,z {|4hdAX2uwBίHMKECd芈xvM`Na!z?qy|\tp߂9rY<[JTi5<R3.>?!pj"jj#.ˆ'dp9՝'RKek+Z2,k3M#[ HB5TMԟ.z/o*O '`B\t5ՊqH#mvi cng՗^'=/"3)S4\+%i^qu߷:%|"Iu`\HJ2+Y!)hį׆{d'Pc.)GU{uRQ7;Xn\ЯjCܕg:d_D_;>1R+9Zw|pYO$+}hn % T!:J𦘵{ <<:[gqzuAfˀ=0%=V64Ӳ*˨P\׸2PZoIme@SY~4@X-~r>hqa`ԇxI>Ppڥ|b6b #kK/',V9$7|MxZ;0vJk1*6QNNspBʤ|c%OiotxEoaPg FAcm|мB'>a|* Ӿt_I#MU<}J{3P,) +D<іXu\\!"ੜ8)Upay gI i'8u w~p^+i5zq4szI [IbArFV2-"\_/-D9Vd`uR" ?c6Q+S. #X*J'pLNKiJR8:M 57z ˁ >=DًgmY:if rR~bE!Q+Z@cy@r<I,m+/_VЪ-BQXspS{Vr aaSM>Er^Zp=%UqDV(3%A|/5(='I~!P84Zp9GvlZk'qє(*mᙆ U% Z!vjqz,=E{Qr2x"{3Zk|.)Nҋ.G"H¦NJk(Ɍ6._u"ɷZRdy +r\zaܤ uFgG*7'n:qiS! xxs1fy{7*TE?k_FJ)!ΘϨ(yח,nn C#t-k}#a{ D#7Jۈmh~*7/fd %xBmGrqp[?lUm.0Rhc1PzЭw< H*J]zpMr^7Sq0} Cxe12:\:>\:PL)phΘwOCe)‰Orĭ-U/.܈ӦZ糕9RJn؇xoIBcRU{}40jGo#re(ٓaPm2eBc[>S,U%LjK7)LǙx2 saL(5gA!%;((yr;pբבѠPrb sX/|$iq ,$B.k9 t{>læ x+7\w̳-:C [aeFmʷj8㮈ne%'lQhw){\aOVuG;3FX *)6*f_y&:/ЖS۫vׇ鞓}4,$~b~ܡ;:yKN G#wb&Zfl.[]E:3BJ?@5rЯAe;+st:2߂X*]6VtJT}rwj.U_<դrr# BXz&FZg@^Ehe>y NЕ@柲Cz'OX0x)f5RY*᫫RdODS/M}oN*XlzWJaw h:?T(H\ff~=x 7Yaw\Tә[E_25܊Cci:iGӂ/,]u2@CLz]74qś|H-WUg3APv)p"ҩeAJۄ '}l_Hv2ל])91Cں,%?TZ(=#% y|,! /|pϲO?e%0a2!CJS-W)Ej[Gi$@E ˙׀n,yu;<[%!o:ESuTwx|#~8azo5F ɗW͑9:@#@ZMuw4Ug(Y6$Bse5YO94YB**SN͏NH?457ӷaմc3\dO9adPD`BP~A3ڹww0;i摩:Lb8I?;LaC5sUϽUƞ֑Hj;?m 1RjY :;v3BH -@n#i'+]\=Q2Lnaw'$d| OZ=>bM ^=9iIj'PG. H̐1WQr@SS~Q9krʅ k1Mz"dہP. ;tA, \i("/-VҔ,?W2rF@=]﵀IE*IW-<)0A*>l&%ĈCBZH+luI{+,a *M:CP>ZVQ2u.ua)zwT9 C9f 6/餖edbFSx=eҸ/ G8:Qq PXL<BT(Ejz{j5yB?4&4:AmCUP wR/Oxf(C%ː; @z`{1$H~Uo>u#Ճj~@ U[BvR!tN(˃Z .!hzeNي2}Hz,Iv._7>d=)od~X[]gW>(g, b~b b(FF- GْAh42EgIng Q ɟ(j =CV&B+mAVFgEɒPQ!7v^,qw%hl∾/9Vm En bBG,O7(V>!c]ݮ#$x:Ø2իtz 1grżZ__qV_*|76wغPt[>9փkv 9*;F.P6=yFv G_r#ٛ˕/2v^ֽӓqwz3A]0^ ƎsA&?઻>3z=kF׈$ A9^ܰJG+|*kN\4]QlIZO1g:ſ/+i1 ,J%-JRcVNZnz(xF]X on^o*d7Ux&Ð9EI{^ʟ/ *?ߐxr4 .r. R?-ÄOwTM?`DOǎ'2<ޜF?pogn+_P<Rvw(xl꩙a뤙h0gl޽VBmn4š1%Pníl>:8A5ݝ+e=pJ+e}stU=U:=pQR{R3h ΢)) L9V>s1AaPˣjaP <0a.P &4I^T|rnC6{| ayHWaj 3<i *ǔ7KP@F?7Z FW%O vZ&ʞ@WiHԎV]qC";4W?+['[&Oy_$8ʴ77*? {V\ܑ"۽!{T g*CE8[HMM +epTn<Yѓ"3V''Ԗq&1dYIjTWX_%L~~$70ba[9f;A\jv/nVt~;`&%!&gD yHMP[əmKr;MN,j^en~}c׳HďJOxj ^aK$½7$0XSk˲3&Dň(:I]\}QJ.خ.l8.Lj[ٜQ?M0K;.X_d:, ?/ꮸx|͈ &hx:~H6Ҕ}W0ϨlX:mLT-+8WRp4-)Xe3xZXL?"j~2 miqA2/ E;hG%!ʅ} _ 8kh̨ħp O&G *@1T4w k~YxTihzbNJ½vv\ @h- 1&u֡2{ 6%(m$`ʈ<@`oP sZpUIo $ԥkm# 'ڴd`ooY4e^l8#S-|,7FI:WE$öa٨cs%,d ɣ,"\:^99Ġes]1L$Ww$'Ty][=lOqa:)5@)V.LRh.SФLNf!2B/O(0l׵E(^V\H&Bjlw0TvX04+ Y믙tLq< I,[=GrE9]w!PQkťUW,et]3r p Ok>*HǾ {gm5x ;E(EgW!KQ[F;>&w+ۯh|ˇc3Z+ ؊oaS*lD3S 8[ ФG~S/JR璻=C$"l.)K4v&><'M(' H>np of5eҮt 4> û̇lIJ?H u!m(&c2;dW!*> rǕva9FƦ)a;%$=Y飑 ˨iSHi.Bm1<ǧPB܈`3aK :t.XW`8VԶpOZ1,'tj!m0S!#A#2'z2H)3~5ɣQ#5_T48V1LEappB9 DЪEtX}K:^K>#Ի+yxz<( $XT 9*ގ-}a*(ѝ$N\KixS薯&^fRx^Er1A q|$C\fU.Ld#>p=yI[ҡj'3#(}ͻC14#Th *2Z'ShsX& 7v/Oι3#Ic$TPעϚkɭbuF[v.W d"qPk8n2ĔRFqvǁCU_f*|0fBͰJ,j9̉c~iOl-%]JfF+- ?.8=DdlCex3FܨH'CeAD)sDF"q*y,BR>bː&U<_ټ?)<"ZwbdbPJ~}/na􌕄S$GWWhv9q@q&mu/LNI:x>Dq'22*aOYLْO8n*kI|p}B8CPF5 ]|Ӌ͖EfaoJa7P9Qj Npd*a<өIk[] .iP_6Y|}wE6b 5pFaM.$ ^ -p},9PM{oe@BRR `` "v$ґFȄg zB;ۀgn>U)!(}a5NP^v+hxN=mյl]uJ&7==u9mZ-*\LP-* fx>F3IH o[\hI}`s}qRV"26:j*AP8/G|ױr⿎!?Eǿȅk-ԽҞ9;2@:@ Yr@fno*nw.wBCuPo1abAu㯤B VN)AS~gݔp4nfN*npj3,z$oXP>q&h$B@q綅sfyX"MV}4|=blX 5+`ѝCBIsh$&G6B*wȒ~ p: ytsx@q-cȭP<ΟJg9V8hy%~ Ue'%Sqiz S˞ ę!iw}y/9;oFǙG "zH0#lW-@7]}0B'@4֌zp5W@-&=1bEu;ׇ>g׏+~J|* ''\†r(L]XCJSJg@&>"P{,fDh8 Jz) ;^ypGt 2?JӒrVMpOgQR)JBjF;Ql'Myo7H4)Rؒ1_ >IM'3h)'15Ldg ڀ^-X@B9^CpTouk7Rn.C%/K«_*BnCg&F.b*?-1ـq'0CJ[#t<—mR17ei`.Լ㋨sK.(oU&bv=bEspZ3Ռ'w\wr}*W *IX :Ao.7'TNkf81( t,h$(PoZy'F?CO0TEj)>}L=# ֳ1$+{S:^񈣋nm["TDo91D=jy"Nuny:U^IÕd+rI?2/*tme"˻F@ϻYR%YfHI+8tTG /ґK\fa{xEFhm'2um{ Զw:Uh*v@CT懓o[ao4NxA]׾.$'+ko e Wt'A5 R7ݣ-0PYth-@%*i!0`]]ݤ"15yS.A+=v. *XTz |c֜f%KA!&!m7mECyZB8W Jbq`yo-5v?93s8Hs6~ڪj$ aVx 2cx1 `U~/`` n_i2 >>Y Lb|4#Ѽ7iwn*{zo%]5;bMæ\C, ')[Y"V[q&! _%տ梟NrQGPi6 Lf0!Miba!fI-#s4Pэ#rA5`rҽ 8&gŽanC7cуF. 5/j5Q@XQC^q 2B{$t϶9DFdN\=I`O%`nS!^$%Pѯ|$yVTAFUE۬1bq18=L6Z3} 5 M>QRIW!">'ImG+HN H 4/=u, 餲HKK^g✈35O+7qA~':Oq6KE+dCY79lD6AFoMIin|-]ss3?Y#$>fx8Dn9JX@-lMaj}yVjrP&׼ Kb{2"ag3QG901Sa=sľ=4IA^Ae[)"]J;vjh&^*a5!Bg3ԡAd{>#9rczxH#RjkXחmWR+*Sw#1QU=!Keg5zne4 _?t>RjA1,A ̛}2}ÒIVewnHşBeUnY 1d~;!sm,OVP_6wl:cպ G_6q_u~}RQ+z o:INoPxHJFt1f?(axs֌PʠxP,MzjKBQO{SɏƇbu50Sz tX-Xy4OE/:;lPƀ nH]H OKВhNv&6} 7qt[9w׸v >XjN`G:Դjר8p tKt: ^ƴ%`3ĭp!O5HVO~'W1}4UuvFB9_% *YߪݠV%zU[:;~+K^QMї dž㶂r WU+cjBAP+ ^ V9Ft\6bؕ;r 4!)קm#7 "ygLh ]ZExz!\Ԅ <əRg,Ts bbNܡH na~V?[D 6?4J4ת1g9yB[<~"d7Ժ*A;AxԢFOtδ{g&yʼ`U[4Z-pRD+.qkzW@N\+ZBD-F|pxg\n.Ѫޙ(^..,R+rB} A|:I)a0O[%qXf1Ղ6iAdڔ}-hv̶ZuoL鶟Xu I>I!iayK[ŎT,fT3" B6v6!))v桯u ̕c3/,=PzFӣO焵G#JlJe bys6̯Fq3~3 ws ; 5'!ʐk4׻Sk/2-෶/Jwߍw NNw|׻:(XcMGYI~Z?&bQeۘ-&:&*qdJa?.x1a6}=ʺ-R|fc>Z4a&69l7:wT2]g#=ם %zd|w`qw}Q.zd:@5XD֋, 3X .T ˇkN;Di&VZv܊2hho:m{ǾUR8X[tQߜHn*ኵ_FFOHUX;[(jNO d/Py_ ? 1WOlJKg!6.^J,˾5{ !Qu57t % u-zKV3km 4 )tR qh-zvh:A#^:b|TH 9%EO8OسJaE|7|7<~?QPfڒa`R.{Z\pԋm5*ti1$ hXaWyLY`5gf|74]os51̀s^T>A8QxuW2m쩫ݎBFqn_|,B VܪyZ['zd5״vf޼cPu]Wc$pdև#H̻Qs3E皡+kJx7zq8<(6s0nn&eL`̥AE!!!D3Ag<-c&J  T2u޼KQ)S>}cU,9#s~IQ *=mV- L SiϪjlw "O@gOBCu*H;Y"Rm'9]Zm{l>A+$\vҾa_G5]zR4^CIt7 rG8*!=T"@ĎUxc#ZJc gE|Pb.oP- A- . k=!O" <`Hm+\clX޼lgvaؖ%Gk8NKO1muTkz]i{1a[$ [÷P؊9`V5J[Mɲ锧ӗc`PX^0G9PW <'8 y,# ɶ!~v80lEF;SgZ,) 5AFX3mUVBlt0|QJ`+U ~HuLhpT14UkݚFr,q[{BqO<1{_)eyeX hlc8?sNlyr5^jfYyeiYfM] \*NďٔRڎls\fy 10Tw7#}Hm냕r(4b[یH4(=>нD L ߹`*91klԊ0^ gR`5h>tnZ-IBQ-Y bSp8=I.q1f 4?w ("|-q|r0pކD+A܄oh5E83qKT\-~.oP8ŗ>Gm>lC~'I_Yo{W/Qּ =&BfZPK%KS0|]C~`u*,?|t4*< Hvpڅv.{VS,ht,no{Jw E[=&G$KJqLd{iTVL~ :}ѢO\*TI]92+Od6Z!3Jʀa6 Kh&y$ӓpOkm2Ǟ٬TCh;LE# *_&ɪDIubN..x7`m3>gdӯjwg$ & KkǫoWD(λb5>lC1lrkn~^9|;_ǨsA%KAj< =Oh6p>P/SB)BCZP;U*L4 rNšQҐLw~rL|pAI۟Ũ2 =r%pq=.5uZDvnvڇZ< [vd&{8.sC W؛09]}F]y ؈}ch}Ta&]r#VY0\7`2x1烕y鲟N#+ H/x]1 KC+-YDaY ]1y`N:Ej8,Q -O0%O5Jn-|νV?AX]x,c\DEfÅ&# f2!O9485y_g{6FY22" 0p/1Z>A3w4 #5ْF.|0j`}Tjڍe%tbd;xF@;cFLȌçgX8%fB|4† J-!P4(yJ6^ tO^R-k|կ ODpyYIǗ,X&);Fpr>JXEۆ Ҏ-&إT1D‹)~K'@rRa-eG_R8_"Aǀl:|4{Ҍ⫘*XS3"mͲwxٰ};_تk)&lRƨqoK?*LQjLWGa1mxJ r4c(QV@;U; `l͒ZE7^ˈAy=zv^uBe o!E/C%+m2l]_UW}y9Z핵T_ [w(jbKBPC4F.ӭ;/^i:TEX}@< fL` ̰|0 OCLbM6qlLSPA^]  Ǽ}4P(w9zŕX6"< Kb*<4>1,' Yy Š܂ޏm߁/OV%uQN_3(>UI;3*v%R?q<6[JŅ-#Mcf#?E T~"Yvo_<}d՟)xUN5V˒69.;9 M1wL!7x|RN-)!)eͼQbÄWⰉ d[-8VU%^WeޣnxJJ !ĥ@uEFK$6^l<:J0L2cbS?~(%/G36UdA+~PxNm-=)h=05ێ=ɌnWoc-iC2nRs=9w.Sν N.=&N93vZr=BŶ7l(I}e8Dg% ,XlnHY`Az5qiI Eb*Y M\t_vr/nazOހ[bRݞwG )b. Li pf\q| f-Y΅]6 G ,)zM dD#_ Fژ905eWK|I1c|yFv{dn kc.[۬&۟SEaEu4_~&ken JN*eS#변:0^̖2z`& R E=U?@ W?7pL`!oV#g332b~pX21PR07?VUY^\%wx΍ED8Yqty%A.2eeTLIx0żYn^X͛S{A,,ɱVD) -f(.md+{*+P։l difTz>.ωԅX^,X3w(0Yͧ#bߩAXsRMQTq׊qo7S#R`1;ܧpZs$I>9*ICXܧu=dm2<.FxUT}^$֛]R)c ̓ fV[#Һa*{>J|]0/'T J~]E=cE& _ɖ(B ="aAB!=Ӥeq>bª[Pm=ծZ?/TI#I3k wXbd°8Pf KNs5UHKC@.^A`VOJ\t0t m6b(x\`IJ/A)f )oq'!<Τ#&*o ~8fR{22vŽ )jGܰ*3t=iްVF>{ C/161{}D&ڎp yjY?诺) Nf& ab†5]Xď6 @j#6y/M ͜(tV /7Ax)'Qkj:`P%&<8͢˥E.)ę#`CĪY!Bq(0CLkI59RD#Q2'ԗ#+$=Sd3͚6^y|ϑd噧)9%M̗V4U@;[|)["IJ2B:sKYp@CԧRfjoɌr@rЫ"5Ʊ 8`%G:|_-l 9[,I 8fC`joAc[2Go'Bޖ~2Q("; U ֿ (#:=妐K!Z~6KEM5kڅ>B|Ysh;WR3Ų!d6*@E *f:[ÌRY%ô;կ́$|yЀk-koD=ꧬ,I.qiP7s}uϟ3V!zjRV䄸I E~o&~\~Qkφs]r§d3튝U8@fMYrwgq(fZezP|!:}hQPma."W3ʇ'OЭr D̍;AvxOŐH9_Of j4ݳK Ln40i_!RWJQK43}1WT^"I 0y,f ->.3'N?ۄkyJHp:9knPq=F"dy2reۮ|"Z87F0G?,7LΪu~ a;?; |RCʵh1z">l}B z,hm*^\p:VͶ 85/մjFVT0CkUv6vg[Zk! bTwLDKB#wg cH`؞4gte1,(4)8//$Ϋoߪ󾂇)vִǪ@1d+n p{ۇaѱjUҥn:@K+La@nRfxL^_<~T׈RSid?/-;UE xg|ҫjWsŽM0PKMc*+%L Kl~S5Bz /2//̑R C'>vrn?U|(7 K2h|Pa+C¼iH&ؗn?iQsKZXoHRKyx.D3싽Ł򀔼cZgj\~O?; Pѝ=G%- KW<0/PWNҙѓ\EZFwM"xL2-Jv$N6jIW9'ox&i{:dž}X\ܻ۠؏ Wp>ۇ3g,`FcYȅiTJO񜻟s (e_W}]<_CY-,5{.=;8mO|ljh\U,[v [gÎi0(HҞ;NYNک:ov3''~MYJH)`aktIh1Cx&E?0ݲ鉹S^OvOmͯsŚpa[B{G8(X-auu@'Yѹ"KmCdI1ZKV v'ѽhcB-D!恕ԃ- @'_J1In+/-( f%PCn^zÞy6!Ջ˴U Hf1YPƖt䲰u zƛFm7$T2W06[x7-3^6I='2go+Z"t;3al ]$s+CHem6 { 2Qv/Ne!+,m$\#A"@|Tbp#R0Jb9^=0Fs2p UՉ1H]- ]\#n+~l̴m_&`Džm6sm]!~+t8; bFoZQ镥fʖY/Gy N{ qRȯlMH-vXG]N7ySZUєoa  *a+)L#41݅6U[DlU{''PR}Û?鉴nEÅҮ/H*to(&AfAvU;C7ɷi ӲsGB{AZ< gkXWxgU>TBuFO_\R3b2ip"=_-1.u橡եS~'k (z*.-bS,Ub¦x!c'~*^g`7%nla6:#'U<1uIĄIHSQCsylظ<9@wtzؒ);=ƪtwȊ1ETR X 1c:U xA&o q#X wCh^VC/y:CZtR׊. |glW4Жi 0bV:Om^l̢FUbRٚ7}i%eHx V:2QJ mH44a_"s8H;{Gio{Og sϣ1˱H;C@ԫr7g7g,oOgXRNn`M j X":U04s!)?${$¸ Pv+ڵl-f+1}^L%z`2ѰV4 a:uƳBYMkVO^3kq>SDN=m!,_iK1 Gg0Ƕ[ Bs~#_ATq1dm:U#ǰZqFh@rs'hF>4/]C$5 L 4lW`GAj,njXTyF l? aDu7|_=QhŧupG_&]C}ȑ(BO)dTv]COa{z)s!0՞KTsʽ9t?4ȫlg!#o'c2^.)"]tR\,MhLR-U2Kh0߻,ӱ`ӍϝKF6]JbJBb+%7Dorh/$cYy@FT.>BÛ:)Go:s=.(qـ)VTk767P^lb$$Yt'T\L=]KA}/ T~ƋލSxPU:Hy"UiT Z򬨖㶘jb ң vFފ}y"đM_m@ ,&&F ;hG `%>&$̺}s`#K&ܻ:xI8o[}OJcGoƜ',͊xu@[TBƗC-=ˉ`mIZcü90HJz7r載y]JN$i:TxtXZ(7gդ6Zv'ז0BFu6 wdՐQ_>?p' N5N)kC,Ѧ\^hQ^ -/q+3Q= .l2"XUIl~ ˯Gl:1zɨjW%76&`nR/⒖4XND }Wz` :g|o ZA{BB_k;=?u ktUL)Co=y {98wgp.ad}YVLc[>evH>$Y@N`ę3V1/0qB -(V}_Z#k{$ C@Zցa HE?!29稓h+8M ˳ gˈ֦j\J ^n"up辭z'Z-ZB8bg82絰uG،(W*4|_8[D~1ѹm?ev#c#\6aNVOw@RH I\f!#\TRt|9 p޷#}I6Z`JrA3,YT0@= ŁM'NO~ эM@QM~QswO-7l>Nh?;U8alP &T~bj47&]kۭ12L¥ +<$#9f?yFF)}7eoK,-qNuچ|Xk=-O3 ?Xy[;1tHc#ŭ TZH)z*uyJ>wHAg|K6 d͡Y$jPBUsF!-+sp-K:} c~m=G/2\1ц4GtG|k̨vOP"O.=)rkAHqYٵ/&||V~"l`1_+k>FO`n0N,/Hz)+AI|ߙ`l߽3XWӘƱa7Sǽ{E=c JΉoL!!ncKmN*QU3mS8GcV1@!C#ؓz=QQS?2~fTl]kB & ^Z7{NL#hPg>%f$B`|o Thkst_5(HJCO6 vYh&KDQ2{= @rۼ+(nҊ,|!KwrRvUNHoGUAR x>2IVH6JU9 & 40=@28vtc|:~,g~},6c/2|*I4@>:L 6'tol(=hJ=1hM Oo)B:\ |xNߘZ/7T?s=.+cٶwT꾬^‡!t"/SI^ HG\ƒe~ӱife󁺺%tgJ(" ^yumD*37^=>aC66pA_@p#,m\b(o\2PbuV[an1Nݣ⡆>z kg{rsa908;~\ʑDEk=9Z5$kvu:٣F֒aI_]._c(hR+kvɘ ژf ^-o0S.heGVU^E{Zf֠y)4EK;2dR74$ ?Mw!hXya}œD;qULyx$TY<=.[bI,h ٰ@nBd["C$\*I^5jζ V1H[I+eK7Umw.Th\O4uIa;i/=l=~9W(]KtG̙8\yzhmu0}Y( =,XhU sN 'lk ~/oa4#ݮN)k^wxc]ڲĉٟZq0T]9CE#Q~kX|~6;)3/ Ǝ@6pS/,Gxy|@pя*  h$ K5\_V*.؉VK(?hԏ 7`%j4+$:@4/☹hBiY eRv+ǮMZk) >G,(cW0[ :|1D:F/1}o-my91KFq"Y T=\6sWt̀OU|u$T}C[ov3X_X7Dp8؞ϩ_n`}{Ƅ~6^J8vp!<}iB:?VpI&$~)i:8vsnh\BH|N*N yJ]9Y6>6R8^\6 FgKsVO TCޘD!-ѧA6,ixW *5ժ3*Tx:u2 D3k)/ zxFq/`/dr]q na=mlBT~ 3lF+G -L=~:M+ޙJ:n= )W\D!-ϒP-(LcD]ֈPeA|z0,PxLeF<3&k*G k\%I&5r`AGV,DMeU,ɦvp؞7gQbgԉ=퀂oEYN:jQen,>jEax=w̬ڣ_6xo2IQe+齈$=W %f!Bcsn Rt_nώqi"p:]kwr~D48*1G.Btg p>ڽIu+fn>Doe:pMzC~3kT AV əyW~_jV6&|E Ot=g{uJÉ*4Ͽ& wF۠dG\-V-ĂQMR'B'EʃM#qXsDLdj[rz\+\ WClQ\Dh0f2kuQ fN@ {ֽ&]ڧ8we]&_m{g}oZW<Rd oi"fxDgMO>A*c+6TJ 9vuUN7aBn ?`OB B]1L` DBqb;vH3Yәi|뿚CU/o\b_d}'(6UT;br8̨hYZ8j Ze1@וP/"GE[["%R+-X lr}TP#S< G})5|VUN2x2 nb`w༖Z<ǣ4Gf-m` 2(UӲ6 O ׳ q{҂|K>;}#`q"Oa#`T赩r>l/?ۡJK#Mn6vF&EvsEid4 #&Q&Dm!^L?wjd^;kw'eHċ+1u$Ldo}ƖJD1r]} l?mN|S,.k0BmLam"@go F—Bƌ3"Z6e8W`l$==*2O&5ozc.ء"Yar)j$'ZjA9c':d0s ]Vg^[NJǓ݂|v0E\+XNv:ӯ|_)F(<-Y0_/xĈ"seGL*|"8r u\=4Xa,-QͲ dߟt dMJ 30}ZH_w`5UQLf{YFGhL~[,8ߩ?z1 |ݰk;Eg~p4(^rʆMP8CvS}n#au6wz6yabM[I]4/imU?#m:pnPR*iږL-`[J2UA{M\ɲP7/O&%oy5E.#A*wH8<2Z_~8 V,ATb= =2t(>(0E%{5Ѣh`!5V^:hA1,'HsN;T_rg6]]7A)|"+gD %'JDӎDȂeWrxWIq)(^v`>,}IbV8b#ʚL?|Ψ=(@emeXju$:nTP[Ds Hro,\;˚j Y0ϻzM?KWese5@`g`^8Sś2#ԢAhUzD'd dg2J>"of7T-ZI. ׹ pL̴ZG,]F1k_1@pqjM+I ^j )sed殅\ͥ:?@e]VJM;hHQ#KɼvOy f5y1Fhv^247E|`an7)yα)ڲٯ4K:0uLmݍ姕q=7첧hY|yF;OS3yL'bč~$)Os@wontЦ I?I2+ f5bXYK*<*%M2mؾBRYHy!v3->&f686ZAS*<:_ʴ@/Ec#5u NߜHQh o^a&91PO3}(g??zƗK0g;%+xj+PNjį#qdo+! ".7FiXaZk=k]z$LT]J(65GO8<5ʲ9f>7v]OHqz+˽U`؅ʛ`[h?Ye3]GCQdd[T."_5*ٹߑQpEIi|:j 9%SץBjgôԽX''PCN-ɢt%o5 * ܇Y N5f>z4hCj%CKvݿ/Քa=pHSxJT8\Н>lwܠ$vSe`ډ _. pMbO~fªh7om~\r;mmΎ2enD FL{ !f·o L3KRI۶6TQXdrj]r\s#Gp[)،8yߜY5; ">0x |YNeeMYgAknD=&'\Đ_V̇ 8/^szQV'gJ%T}=!My#DQv *Fi;&, up |" H,/;'W047񟠃6>잠wp`꯼\=bd@<1?njY~SMN+^ux\JEMc/G gh_g(qQE@5@8 Q!kMwa~) ,eB &|.zpO+aVDnRJ@Ԅ9aHkq~8)MI8:^$Eh07Ch)A5c #5o}46vҜySA#@)hDh4f e9 F?ɮ cS4ruNSz]Uy jxXh'i/tQ<G \9tK~'­bI.d1[}[W5n#34 eEqܛkŷSmC%7˜鯣^#drP Tɸjkn 7@Bu$2Ȋ% Wݙ!"m4 "%f+9^񣚠9f:@gS6XⰡJ8`vmLwM`4G^5YPv$ӀĚEop-Բs`Â6kF5 ȴޙ-[u+6So4  }]tOauM@2?9|Ỽ^H&S+:F 9tCcnn%Nmn]Dӝ`mOgQVS þqҡ:44̬pUXq۴Hd%D[+&UZV }Uˠ&s8?%"oRƢ@%>V_I!Y_ wiЦ$Zo)fG ~L)%;w٪Q*DVyL҂PLEx)El9ڶX׉kۮOsh@6&hfH&'S\ܾaИHAV hF6{'6V|b҂Dl{~kB4*}l*p:A/! meWmYxJgxQ4,ز :n ,cH #ۖYbc{uFCY.myu;~dɏ⫃Ɋ_ldʌ+PysҹOTuL$Ivs}+ҡ!,RD#H,E㊿la}J}=Q+ N-͘wf϶{Pݹp𥳐Ӥ<3.5yfd'cJ B* 5;:YtJa{FۂyZYO<"FO2| Q"9|H .dB̈Ӝs _fP^ Bl[:<YƨX}F|ތSEQ!OSm]W1HBGhTPq`䟫lCLҤ#*-jYB#nŌ>HN6?;,j ;60M Hk-pGG0_8>e߰ۃ2,y.yG\[FCLSՅ)fh"Eq`"so-.'fyW9o{n@7C t[)L"jW+k\&<`+Ъ_e$L[u.*@6a_g$WACh;ꃔbhFvn5+L}B^Э$Qi ݬWN -?-So'aZi2&`ΏB/Sb|WRV vuNhjf7œ{IO==Xׅ WFw&jX s_Q?:C$V}.'d%_ e]~d"Qˆ~_Fg6t`@3K"Z\4';Wzvva.zdľɨEIL~m"yZpA"f,P5~{č]G_q̿$DbyP$uͼ[5n;A7p;ɢ loΤ&͙p!wmͷTt)t.-p0t/jBg+w+ ?{lBalR*4G*75Wãi8MC-h4c"? [H+n]!9 P\b)YD];-O6r>=.@miB-3ߚێgšVuijsĨ#g"/la||6W9\2w9#Np`p c^$]C O9 E)TT[X.xցUWFx>ťn 4C] wtP,͋" Gaƞo\pIl6a>PIik ĩP$ź:;@8|(YhR`+Qlǭ'rSP<9[ x Ho :31LW7o(]s/}g=9-18D! ;ϳ\%n;+n:I[LVTȾzuP~QD @&VQJ"iȪ,YCMmoڏiE] 1)eYtgGXIhHl AxGT~`t]AbI!C;CJLK[$G I/_VM?N?$ ,^𫥯kwv?xfe2+&YD fskyZg_f#SՓ$m2>+ob ŐI w=[n7(O> !(OO:d2y%-pVـx;J6\[4;ޅN-c;4Yb?~Zg[Tw_/W{ 2 xV4m,Q!xHA;HX eD`~$]U.JxИk܇ go<o$+2UMcoGH%?JM~f4jTe'C{ҋmx_dRtR)xg!V!§Ns9Ս1E*J!rGAU |Ɣ1s2W1SᎸNET]H}dy :YYXRh玧Z;x#C74h ԽuYС<$4ؠ^0F 饟M{]}3SPP8P@)eɥ֑̆Tg^?-盹ܻ Qur1Gp)K!+X{'QfnpD DiYSr+>t.TQ[k>sDRM;p-!r$.]iXHA' Nj[56htO못;gWDž~,EWXM3.-B&m1~4CHL g rЩ AwҚ< 縨NM3;#_8l(dϨFV%=Ćޖ9|1d[g̵VN_+V\kfڡ1k[4ɴy|bٙܽ.2#}!.]7g=NDFDY8xOn{<6y-xF" +,5~C`NQ1zFF%f}m Sw3v6¡Y"񒻕 y!a+x*yxHw[F! PQZR"$,d m;hƥX rݓ # ߢ܆vx11nhN! ST80|F+|n:JPدDCwYb< ,FȾf|ͲEǃ*5QOLJ؎Tl5Tƚd"pI{.?pט,Q'tQ4锆h8ŸzPR_6f!rv.cBuwOBkL)#m>;8I_+9BG T#|Z>>` ǽ&CeK&oR(2LB"$,H)$Gw'U Xvל%$/ed+lC#&O'2+qVb ;6K?n G7䩜EFˇ:YJl|n$0~*Sn\[.O5Gg6j%~I+pg.kn[l"qr.RK:SaBڻI/K!ƴavQM7bH`7N6#'pVb#XoDY0hl6H@k7 >?26-E14{ެn Hx4 KIYw%j-NVũ<ئ,S D"BƥyBkb;C#^~JcZ+{r,9T_,-"EKuVǍ-o_.Yh}:ÑB+C@fw-w͖L$pթ#9&xy& T%oT](T0ƱB8x.">l+LDKŠS7 F_粚>M⺗@d@o&+C#+x[xE>VlR`w Z3Z<Qj%'X -,N4(8Av@֭L dڞ¼XԆ7mK!c7EJviL۠Ě46G;A$IC }V!M2bٽE /rr 1XhvT jȨٟ`9Inpi{\؎v]Goe&fe1o5Q.pzvC`Bu:"K^J*$'7_@2](M c,m_ SK1UьmWVj:D5638 *i%ŏ /"İhE+S .Xp4HTݏ4-}'M^mZp7C@ՓZnDBB!a߱:qE8KIZTb!dė94_G) ^\, J='|We-Ze)3Aj'&J'Pcj0 ,l(p60qYҚe gG 5KTRg%rU;>6 Za@ C]V鈵gʫ=2N%R0p({kr =F8@J-С̄lb`Dz;m깘hb|g@rg5K9βqK_Sv)x71㠽aQg94P-uC1b!YȀ2( [1>YSxy cNB5(qZOw;̈;RRdr6 F㩆$k0{ZHDn5`Qa/V.8۞i*[>8-\ke_wx41޺s~lFb,sL\.*ts|DWoͽN [2SA0g:h#v(>.>%iHjC.upטCVRU;&=ӹw2GޫNpi*Pc|a frX4e"V+ ~od^*xg~NPwm6cnAz~Ot.kg\i7zC"bq 5a="`x@CXGuʍ2UV+~RTqoWѰ\@s{:~ʃJx9L*JWdh1v2]]n8kB ) Vc$K)ijW#M6`X2-D <2 IG;Z(Aaz/\^}DK9խ>{ s]~gjᰬ3 ?ڪͿ>klGv# |A\/~_\Cu{5GB~ִʞ` wL`Z w.'< $mzZ*<Vh*$UJn֫]lS2FT7n]R㑀[tE0X+;Up?>u]!h\[ٖR[;4տKinvNP jol* lABCFFyahNбW o@Xv-gc\6+{=zG EOIcb:=ϓKBa-̝kKUI0#Ib1J7G\?rvS2S0&H[TʰZ4-(jD)./pڃVC+=5DPNfX)W3|@0 {K&l;E!H@ME i Wyxh1h_N_._s^ܹp$q|4=" 2;hWtطV_OYGFlX%IS9}$փ"I-SA #'ttx{#3yAC.Oobp+SklT-g]3̇B1↞wY:GL5faAw.ҩ0bWo~zgEX.*& >e݂N;uy"JnLu -D:n:cO 2ؐ䆏={7dWFGpύt䖷Vj1[c0Zdvy7Z OKUb'"dmgG$t$TΩ}:,8 /b!8uxv'46?r/viHUy[<.T{B|G% Y#nSޘb/mixSrU(槯prUXNBli%OC_ ՚S"C- ^^XCYq}_4;m8Yo#eM="p 8®QU,Sv flH uhU-=CNdz>~ o ==2MYisɿ%?meEU\-,%X0IjN3F"0]'晃9jXo8(S ee滯ٖO`CA\#Hh8IZ`Epn}+쇄;J<-7N ӭSț뻍<6j.c\yqJ,Fo+h?>o!GLyA,aL'VJ֨2A@6ujgk"rZ8˒נ=(`3m>>vE<\:-6ʉ) /E [T`D`:SOkWu6JL,EGUK ܅m7d֗v<@2cj!U>gp҇Ax Š G:\`G+)T. FEh@M7.fKE ~˖!dfeM9PUw2ʕgs79-ڀ$>rnGrJ2fEy`ݞڅBD&&%}CД#^>5 ɛE1e_ g 2"t"c͞?A L3R.Iu.9ݯ[pwjkɆ3*GE^}돬/e@N+҄|3 y9Ʉ }PJUK}~oO;R`dFj?foBP*''H;BO7Za)m&r VeDNu&G5o|5"b/>EU&fȇ4yLFJ/9uzpMB<[ ,ǴP-_M VU(Ү$$r*44z؎1xbz9F vu9KܫA#6rs>(U{%{;0| guS _ۨIdI9jMsgEJvS/oj!*$#sSZ'))#Zv8&/4/%AY)#MwR*K}ǀ$źv]* ɶ0w%i!ESa a}OWPݹ:8X2t;L66/|61"U0S Zb ]lR ˆpA?Z(FӪ {Ng&0֢YhťF<ʚ4MC:骀ů.J`eMoaV]]8償 U eL,Wc4Rwknc2% gɠn#r>+TQ;%'a}!&<>(]_-l %+q .)ʧ$8MxI5իsZ;99iO8j-7a2(ؿԙƮ_c-Ƹ*~?i~<YS BLjf=t71Cǯy:U9zUk&ύ 1/6)3,\la|J9 ijbxE#UC۷>3_Yy=#VP(# u7FT)HWo χkY]J9q؈\l޾'CDmpy}h]K` bD!j2`Zm²!p1g:wHZ*LE*  b[8ׁoBoP/a_׹Eo;ۤ\[N?=> ?kEͫ  .ppj/i6VzWx?օ',.#yfH( +='_m|QXղnX5GQOgÛ+vq{&u~;צ0`s?!ȃO"u(h .mb 誢.RV'9E+4Q}80 w`r94ݬw.Y:I5}#35G֘ )s}] G]c*9>24π<9M޶C48 d/2Gp"Nd&>g"+qbzzC{|p]Q2Ŗ2~/@A*t{(:- į*' ~N֥s!a&A2{^/0xPWQEQ' e1JH\0 o2IntdG`6`.9PY~(Ek:{՗vhzQ&5~ j3>M8f(%=z (zx7U&.5aݒ[#G1aU(&"{2P L|Wʱ͒/Kou8BT@ <㜵D ЁuQv/Ɩp;}vh_liR c i1icJU)3tb? =פh|!f<5Rق5Ops@y? .w#@! CB BTծ`.7@juX3VSTj-9y+։Kyhqx8JnDa<_%)4i7dsr2=R]'dwD' |9N/.³ ΐm W%- *PBik7®*ܯ$]]K\k+͎<XAjm]Ynڻ͆.6I=[Uל=64byS;ö~)Kԍ2"1*c7 QrP4 h&x/z: )oxehdK~"K;ǃyQl׬o  nȾ%YB#FrEhTRQA};mxx-Sn/!M<͈G4 `+"<ː&*wIHut:=4PK+pl}\V'(Hչ(bf53 ^v8+'fpshD1j~⵨ٰmvY0?)zZght!/X/kP/JcO0 |%4S]^RsհUz;s-X YA%*$|P24ŀMGe*Z9X#Kبf䎷N[it*0#6kivMyKK*a|YW %nJn؉'_}qDuj.H*sS쟽 Y%Rѳb@˵@vRt}BKRFY9&A bZ1 ϽSRC$SMx?u__<k.woW}@!c}"{Ae$^o( aюyHWp;WUQؼZ5’ c ~=ߍA5M'g- @/`?PB\,yƫ[eBޱ9V, ۱K8<JSdClǽ&6G;y2{myk,p`mtn-t4,"f|5aD]81+! + V5|hr-VV^sEy4k@+b*Y"2(D5D2]G1C(soSUrֽ$,%3*dÚ G%F2ƥ&'ї*MϙU M,jR1\&d"H%U Q$?7+āڽjW}v!GE6 s64=oB>o('kg'=)Rog/LͧԢȺ YX~u taGfuڡT܏`f#%ϢZmmuki{i1έGbYt54v[CnT cOq_s8i16n~1ONV}f=VTˑ#)H77̿bʙ#8ea$ː%xV$[/ y%΃ }Kg8Rve`Py\%ӢnļsSY?C.DoF .4:+#=c*xVphcoX&Ʈ=GujIZBź)_ʤjEn{ٕ 2ɥ-Z ( r_3_{E̒ z`} ^lN("^E[ =c-R,Wɼ^f@MD揢b Wn{>FH]Y虲 3 e;Al=  -H8ha,D/볕joRgqK!,8,RO@1ٞь'P^NNdQ#_k"/<<2w3"$@,tt.Z+:ntC+D0gdo$̴0Y{K]U'0A,M$pmpƽ,f4t$+n /6H+e+?`vi2Cj,e5z٘NcvnE K^b1maf]2˂`>Fc DfPQDOFPŐu%ynʶb"h(c=Zr0okp)r+vmD47^yӰ߀g gϔ?nVLfXu&Qְ|\ lAꂭrJ(]$mdMX]+L;3ǩV|b@Y:B)8ˆM>Y]S<1iċe,7QX]GorgKRV H~N5#!)j [ۄxŻg>ip_D,.>;s\> r?S  Z LZx G]M/XSh⿤>Il\{UK׫K񄆑zM$$~u~xZՠx?MЁB qe_OvYuOb@0#_fqt)nkrmHN(1 LW븱Fi<- qjS+6%О׸c<$/Q Яy+)!޽K#xw~ YB .ZMix"ҙeKzLe$ziKWdu`?p%g'U{hꬻҦ{FT;BQϪgT\-Ddo|3b3[+m`=jWMsѱ4H/ޯo" ʜ/Qy#̣L~{e\^HWGH+?2%$H qw b=.U&3Ls2%{@#IFӋeW&_?F69&-c/Cuao>q߳ r\ [>::]}9T'%\C͎~9#-ds8H 1glɌ3>Zo-s:D+C66/v0Z4AY w`l6C֒$8_Z#&W՞_k&Ʈk W"!qWs'z^w]`jfK0`h o/G|e$eYA O:xPVjEm rV-n7$G0)Iw9DSp*7cL6a炪!4BAsƶshAtծ,ZjlhdOL~k dvJ~vG紵 7PpV6(Vz7}Gwj|~Y2{\_`i~XQ^)cG8ǔ[..Xb0p:ɮVyhw%ӵsS!{ֿvY-8U*%<s)L 2: Ot};(1 J ;N#Y%aڴ']TZ' z+#N^Ev ̥&6O2o'+K&;.RJkQ6F@+kP{>615~ )HWoj7Z/~2> ^C@~Ԩ4vL_ik :u++Ed×}GL(ci{ ;ܹ#^ظyX]sy7XmoLツK,XqpC~Kt#7IO&C>&MYr?\nȶ_0B#,1EM3lO2kZ``w`af?P|ܴE>d|bB2S6Y,Y;Py\rjҘ0[65=Q9bpO1$E 4շ+` ھ`L]/`Dh[~}bXPu%Q)gV. ><1(SQ"Wqx:)@Q~T rd9i;޷=/&`X宀\$RJCZŒ}hlP)фu%ӸŨUa&?nӚpJ#r8no\-Ѯ5xo3v0S$eR }( 3W4tC\&?Z>nMp1_v()ɦ}q'gwYG7boJE:?e'91k–pVP&GøC,kx vYϭeUkPVD+څ1UKm޴zTQE̝<$smHqKg q 4B߼pT*ijLxrhqCjXq lx\so<%X@1d06:9'9еʁJ̬QP;D٩ g<~)*.,V͹?S\ln]frwm} 8_'|#*4]gzj:?1ek:5n+}tl ψ!x=&>[[%BhulD@%(0JUh]|&| oH)^ecŮaB#ҡQZ.o*;ʦ!1֣`uiAaP9j,zro=U9T2 ebōM  ߐa֞ xU/TfMOk+]7D ̍9J7@i,ma{ im<ϗ6;"h$9}1d7PdhIDyI{wܗqv"*хyK@U,}wgֈT)-oK;Ch,~5+$?Sbo8`$Οf5=nW۽N0}M ! jH!^IE%%kIeɌ~װd_(3a||X{߲٩=~4ݚLR]Iu\A#6zQB)ڒO0! 'nҚ8f/(rE@uD]$, HR2xXt"'$3ݪR[V;_r:x\q)}0͇sPZuX!k LBlb̳Չ32Z`Cgc|I@ DNdrwnnu t &Ф j6EY![G lE'RPjk:-~{X]ElUԄ.* (_HDkusSuRq\Μ:jט=oip-Go}p>d XPW $./F6<9xIF_?h+R]\5߫R>E˭g}AC/n{jM/^簪{Mhk6x B&HtCàKA kQh;BfW4[e -D7Na{[3biML}?5 Q̬A Ce]= E7)y. PH-G}T}M,>aYhdGA  +ǽr'69%GbCtRFN{؅s}(u{6+̀Ds5Ô0TF0ۓBPT) Sˣ}8\y X)d)fs4k;wWƼ'As,j{N.RSHحqg V=C>n!fw+ӑ7 WVz㸖I#1a;^Hge p/x,Ŕ.]BX_!?,?1씪]%sm4#KŴ;kb<'JZoOɊ&@1q6_tfN;( -nH⛥]Y_Xer^LNݦZƧ]s|a?թ#S# PBX .'~^rq a k!xm~mVVj2X-)M,xw&.j$eTJ#&;a :N"kj9=<>,Q ݱ޳5;\:zҚ.TF ;ߝQQLavIadƱFmpn}\oj=S35>ɍ Zt*c[= BtY))7Mvi,] _=̗o XjɃжېŔ<Π6_^ ^5:yD%( H Żמ.]l WP LpBYP8Z=a/1o>qt,$ ܘ{L 0Cl:F,:riƞpڞOqbFN͗ϊ)Rs8m>{: AjdMd,' InMݬ#pk1 `auW rc+ =rh:} ~'Ob[,m M~u}줾B3Hbo7'}-Ɵ9&%UFm5'DK R`:@GtL^l sKgתh2B 0Z‚3˫0 ,!.]ը5_eON89<;eaK1|T/75S Xpw<#VON1ߏV/NOz%RvnJ6Ct^^4!Z݅ O~1AIw.=X„pW)Ѩ8@5E Ԝ}ĵX.:;h9h.8q ׆1hR_zUnE&J!q8wW֠ /a Lor^,{Pa4 aO`IX24Bv9Nw7>嚆'$/}f~ǟ@ \.P㠤yn1ܱ;Bcw@[|j,W`&̬ryRw(׭ Ns5y.]mqd /wnh4C~`F.h|=c<(v ƇI0XFA?FlO_-~,}"(a&V\U1@3IFރb^2V2٣=BEA 0PdʾQb?)J}b Ɵ0ֶ@.Rb-<\!E7#X^scc+en:Kջ&o_lƃhP<2CRQ񖡠ڹBVO*('$$UJ,<_;q XhJEw7XBj.Fιj&c'Xu|#S|FT1(67e!zPLѪA-0n5\3[ҞK ^KVv]ZAux,*Oũt:CP;J쒄&ma1u1)*~h}}0uqnJnEзfXqY(P{h4@E,kOf6nv|֋[\K7"ʌHInЙ3*;wb9wa f}[!H3sZ'Pݱ)ܜgoDoQUqТe$$|RGJ7l`q`:@)Ӌm9O>,[q#xR cZh@5{ UÚ$jj]ġ:81`f)Mfڝ&Q L<fXI}_DCUWcC4*;KD⹚^;TU37nYHi>BعLrp=.5) U"ziv Z~nOΠE2 m13gϸlD"5߁ v" hrg iF<]Y԰(G58swsw_eSqBI(R-xuZ࿶ RV[7|GK-6P{NH ѱ(P4H67: NY=cBYmB6na#h[hKL8Fl'Qqyy$ un0zWY9}cT!XF]-kgz{vσ\Jkb5T K5,b֬b͞Xyԕ^_hwh˥;UMUtUx( &E?L=? ܞ2CJtL:K~ 8_ZRp톅pKa'&YM@mMK[V¢4;bA V Z@RZ*  5.t:(XBh|`7C2- a֭X(AId}u nffFIqpD ` L3 혣$AA%h' 9#zI]]sIHO?rDNr( s*L5Xk_u*Ö``@LAhB%5PלKlaj*40넡AqqD*7 ߌ )tѰtBfrh DrIe\:J:~Q@Hq2M7(DpP@=Cw/P0ԭiL& gc5'Fp7EkKs| fؾ, zTw;M.郄YK-~i n'h Iy^.]LB=)UF؉ =hg8=zfI3$ﵐ:,13e Ѩ'%c<(:yEk@~N2ξ ݽ*ˆhz#10x뢱t G]&g<ԯwy)!w!9(]w`<>Y[6v\7` oXWJ_dԄj̑Jqax0lSR{?p D3; >#ݔ 6A9q\#V}5uO*a!s>tҁ h;6K)֎ _۰T-UgZnBR1~&Քߐ9Q3j>@)|( ~1We0bn qJ죘.F6!=Q|66PJMOaɱ5OT3tiau& Rצ,i,Hgn̚-͢eɋn|uDIm,ij2SZ [:ZH%`N>b}BT©eD !Jπ?6Fa8HS:`Üs;v+7~d,šHc:B<^PSoa,3NRlHu(PlWF |ʲQ#O/E(ZN 1cU4~= T6ShZռGRdMquF[i5̆|klBB9M{Ǩ2س]ƥi3qXjO釶Ɠ"U2i[S?1Q~★ljT W ]e՜XmY5Z0S7tC{#>1 f=02._) FG<x\ɮ&sC<,8DkO\ ВZQsT'w~t(& ~8vg|EZ(a:!NڙXޗzG4~E, 0WM{:[n=²b(-!&>dT{F_hL^bÙ~^<ɈҢ79j@sE^cȺHnbKK$M& bƏRJO,cf]eQx̛d&?#3: +ڪe;Ƒ KfyxJv 5s 4rWlʰhT3iQCYg8^F>s>BdFVZi;93 c~X|y-)EStVѷ#'GʲK /ŁR1,\EdhL bHl/6l1f_ͅ0,tNȾD_/ D/oRǀwt : ٟNܕND4vF9tq"Ӆ4!aE5 >ϦH)$6/fJ F(—Df b'[O[ɫp*AzSEi@Z:伂d Zs!Rdu31c< -J!7ҘB9i&b^-3)v܆y' b"37B7NtCj^FyJQ%[rQQ>иME 6kz3iШ"I yj;V8= dl)kS& R")_gG525ރeU꾰P,֪FXS]aH' N4F"6﷕WAzbGZo}a뻃Aۅ ނ w Lys5}#oy(㫱m(t"'rMa t{䪢(U^8q%Da&u(ۊ+`jH$?ȑ38`6g1ѯDLdd9Of ϛ#h}&~)OT}ث5*e1veiD0=%Z%FP3gXtF &3r6uš?RɼލKα$YDo۵jӭיQ=&"z0 uSBT{w oV\=<'``+Ł}ޱ1IzCHU3]Hτj 4LT*B=LakZ3wu `; (85v4J|7IYSb`v[M%UVkv.Be,䫬/X T=&?M_{Z%07W5`ဢX3OG'+c hG-Ўn\BХZ1#01 qթs̜n\a$) 2I0/HfAh?ssy!Qtty*Z$jnVb֓S FoY' {"ikG4LI1>:_+Dq-1$[=ycd#ZD݀Ue!vڂ.t?!PHuWcs + @թR>&ۻd%LfC6Iu|h8fۚL%BGs%ΎBIf| 6ytOyq!&(g)'Vz9f[isn3=uA^ߠcU5.B_}3'J|ZQz2ٽ\m }Dɱ}!8/YV߰#FCV[ǵWr 2Є'K6#=P0)hj9gxq,v( J Ԥlhg_T^]Ѕ-WN`|phڙ@^o1@EVY81]Uh& 1|y)1ѵ#ꆅqg KQ"i}ҝʂ/%1|:a/˅}Kq5wKd\llGlb3fͯ?mat R2/ŰucV2{.M^ʎZ3u˯ _gj*X&lo}ϒ,Ƙ BY| F}J25KhÞWz|3NqJdZ}S^fEJ1"DshXVTEl p_hNcRUS_^o]n  p5:bS=˱5 @ָlQG!tU;8s5ʷ!(@D=!ZgwK;ӰKq my @[|^` >GRxtC t}cV5_oۦ1?IaSPuHz6Bl.\ 4Vz~88_+K;Ie-ՍEYH ܥzhzuWx u ,VBR^~I ή6|"C{7- gac6V,BGӋkndF d.(Thimzg@\{PERz!6[@`҂g]cx_s_W/f8S<ʫalvPL#KjoiRVۨ D ß A;~W o47M6Q}>PjO>< 3l/"gE$fH!7;տfh[FK2bn*jF*؉b~=/ȸ bCoM|QƗ)F4% V.ZcDՕG(_+ۜŮ%I7V-&]fgvve+?:Rg#+w8Q` ]-7j 0џ,Z>W_眠[MQÀ } wPAza-*=ck Ϩze$Фi-to[PC EbV}f7]x` q)蚪6JK\ttF{ \; X1\􂰁duZx齵6co.O!;C@#uD?8EҺ[.Vw8o"vX ԛqپEeIE"OY(`gl@;>M?\ IK9j$I➱&0F!~YЎkn*T`S,Gis)u *z*s2rx)ZŎ$mŖSvd4<^i_C"&QBw[а,e)=1ZTav'/'AqZo$~> g/M|hE5OvII̍"䣊7 ]-<\~L#|_<nݎEfk AtШⱏ?lpFREvm<]lZ$!Ē$sN AIT鯸P6./W5֎=;`lj}!uCS;"N7}sr3#F[؆`W 4ο8f'yf;U4bux ?Gj\ziwdG(!>,&d]Yʭr_3 xي@7GܘrN?b@,^PHshś~l"wa@($;q*\H7W\2Nڇ_(^F*w׉Y# *GVLig}$Gڸ&1- HǺnfYE^͞^U۠2r&|l'XFv )͸DvRkZKl0r瘼iE VNK7|o?'weD!h% 7\о.cS݇h⽥Xō3n kCP-u^t~k(m}pエ7n!0Mhq њ~_b#.!cL=8D c |eTI("͚g38eyOtd=-Q;^0\o  O{3xEvYfKQ@M,*=Y]P]zg[Xbw%VLB4UL8RߋgEvⰠ@e(M(`'= %t1D狼ܙ>Y~&t A-)pw"'pZ#* NR*)uHOCdQcE) :hv׶$9=ֿb}KK3l0R-/oxu;*9lbh .1 矓vDPxм.l^ufDHEE*`]=9 ح$ rG&v?}vU=rЭ$uB*'zWnČAd$&<F4cH6]Ng.S#g(rcRj`8qj G͝F)2ջ,ܼԪL02hnqk|O@6b@?]>^!kFZ[&9$@2ьE{KӉW%b&~l3jx=wd{8$)J Z}#5g=gN"\e|M%vFOK"%izmx@JGZXO_ rG]ռлfi=ls[+鐬ɒќ ѭ0f`B#UۑBO2yӏ$F6h  ۍ¬"R$ TN;2(R*3& l)KѣZ3r\.x$m@75Xvt lɁ'_|7;3Hj2Ëb08{x_ ]!d_!(*t~ӏ7+I.1ivTpgk1`v I/&mh@~74 f1oX%R5veb}Ĩq9wcMgu ?Ǔ`Kc2?>h$?jBwJU:xt4ZwO4}?mFK}@( RhE@B&,(g簣zΥ"I?)C-5]k S&vS F0N{RJ{ rؐDC,^jQtpN,m}Jk;ʽ}J|虏gP'U~:xhWUӍJALƥQl 4Ҋ+˴* +T=ו`.+̓-'[dz;EӘY8|~Nm%e hVWliA:4&} 7UanM@5hpKjI bB| x2qZ\-S:U7Ɏ1Nnd.Ecۇ:TlVvވ^$hB) Uɯ"K/꺀pe2&6T%4*zLI҈2 nJx^K e)+.hˁlD  /!b^.Ā,-: [r" qܢi֩|)?-hI7<µ,rqn%.e}jM# \q|Q]ض FU:`5!>SC⿵# YWĀO~xזֳZ W~_L+O6mӟ GuZ-9[Ϋ)# %ex͆MAASLꢯv_ dqNZ9۠3x++"0?*7kAa_t_s#DTFWh:eNdvcCx[I\YAPf{WG 3b~51K|%_ L >B_aD3/*vLIf뾠Ĥ{Y21o^3x"M|MM^^H2SYLbPT'~vH?JE6yPxm,+#3jm^FZ<nM&`1~i:b#}]wL|WSxt0r`Is,pZf6 2EVXʫB'(=%"xu =*?楛ڕ㿟қdl8v3B/$g'y_{>Cۼ!~kA2R P;kt|8-fI&oe [!GV up#oÿxh3T4B 7# 3Sq/$EbY)J ήz9Gw$f rT8~ ,H4?ζfXeeDzN,0o_?4jc؊5JhMDQboϠjE⃃271齱L38 >| džB''AͬLT<\{ wj)[8JNZxnV.a( @]oE%r| I {B*-~.é kk^e-+KZru2Cԇo{AῚO1գ_nº?px+GQB@T.NiB(;2&˥j'Ҍֽfҿ| /繢dPgaM]N ڇpC8֌`OߎhlG_ބ4ϟΩ Wbo?b:D✨!7q",lҪ )m|~] 4<»ATL"=D:%h' M@/5CR(x[`+$xm{9lUsgF? U:b )ZnNpG+Ƣ1k QV'9GK [:~+Ba E}ƸSf B#9j(+ΙlFݮeP{[ 뗌a Gޔ;7{Ӻ:Q:?Ӕ.҆wI5#[6^…SF?)Sjd\*>e#ݬn wXOQؓ.>ƣqo'yFPbw_Q,%J=|P XbF*FxџBvID*zJa>OyX–V2ܷD nu= hcptmAҎ :GĪuG*Hj<Q*dFkFrd@"NXTcÏ1'{9S6L+9rͫc SnY Uqkǯ{#YY#9o/Y d3;ʮ!byOĿ:-Czdx>#-IZվؤ|p9?g5;Pu?N6XZP2(T9hN5O9Q3v KQ:MzĻ_xvNQxaLDlJ駝u o|[rM3Z,ҙΨ*U [m1 ƒ1k@K?޼Ј7,;q`AV~ILὙhg-wZ 5KD4%I' 7xb#t k?%f)r~WY RbZ,(8vK X<5l$3#pg^MWlmI*J?^}k$휼vo",_#f3NW(,yI$`ku2*/v{e")_E+d:0 bn02ɛtS{MaP=>kWأ4b (t~M<Юa/4 Pk!#É#m$/LT+?i~P4 vO䩆>x1htRpGJskGi̗y><1mrU<ϱ|Ԗ7! kvCҴ.. &#",&a/~흰$%6]E >,6\;TĢS}7-*KsNR{+ (Q.sQlжG$]D= yiާ?#rMק}? =|?`܌wpujiT\rǰKZW{xÿ́AjR^hI>;ܹ%4#*J7Кs"%}{H/q.φ0ʭO'6\Ws`fXY!ۯ!]o _Z'K3E4/t%]QI2$۸б n =pK#NbRtERgv!b7(=_Q OQqQw3-Y9cg^}Ra%i)# !GBUHNג$GPgO?!,N:fc)nsgBxyl/9Z:k@l >C8]O1z==nV!!"? G%3dˀT6\0WfU<9}F G 9۔^~qGS'U?oR~XuH4+R vrmn,Ft67Դ@6l׀+e-ZNq@մvX9$KP c8C`i8 Qo:u,"R&_R5%9 =f_:t&]n4d,Ɨ%ꀎWl#OWΩO8"l}(3G[֌'f12CCeϳ-% rX9ZBW *;*$ cJݪѦ"a#%{)/h2ζyh^T1S8d9XX A~rԾ t6? HA6d5C)"O3YÉtscۊS /[J_4nBS+{We9w ۲ȡN] J1Rd B# QJj2m5) vj{k-E"OISejGrg4W6>XT•U٤C'fZL) e{-ӡ^<[.0v./(0XClyƠ'̃ϳ2Dg\IF\lGˢ*ƥH侨:J?"| U UJ1j)M0W Y7>jߤҙ{1> `, Z &t-p1~ry cT,[ JR^J[>1C)Fs4+ ldÊouNEd\ d!6]kvLҜc|0d`:;m^l*ʼnz֎0k y&u#tuV,w5Ѷ>?ggmhB@d:~QۇYb 5I*>t͛>ͷ};dW[K0 v72B}4k=a of4k3H6%@K]on`3.Q9[dm{Y*y)J7X7zR=0QҮ7+l vOh)7\,92!|pzstl>b,bE  lza2@0@C'ď zf@F-:F`ם/熃"zV4ImkqȊ0QKXkC!@#N:'% g;c|/ޞ] R2hB'ͫQ^ 嚭x)P{(} vw(Dн'?6b\cWfA д+P`bXAh@uxI3IJ&9f`Sc Ia39a~8@lC1ތ_-;;J$<$Z: \U[1rߎ1 vd$rUKArtv=PIѹ je:wksrk#bJgFj;IZNgRnub2{Ճ#hc8%R$4wRưXRɂNT\]t#xK^zdyjޱ^;OIm_֍QMbpW1[OxYgTTH$|~]`0[xi' ‸͠Wt <@bfQHfge*ǯ|s&L+JۜJEʛkE@r_:=o;-Xf}M蠥jw}B:덲Ma5m| c@ wׂ9hpӜVciL^vVxx S_ى{XX3瘈%gT-tyC vޒN2ahjw\>1>52h.+(,oAjI wIovgQ6%3DYVH3'A3`↡=ՁH UsZևAu\1gQ?E!#Ga% e++GO4k!Q7ԇ,Ԑ %ŸV[4srb\pp/"H9RZٵpw.^y.rlaRsM_ch)6C^MhtU(Z2Cz<28Q,JJ-Ky(1xl(~}}i LʮpI}B}tZsr—Ԉ 6żg~eTねMPƪ;ПFE{!LT|Ց-e`QV8Yg>V`4zلNg ?4E/EZ CpJ>SuBx^uP84nX r?71.{(BdR1A!,G)V6嵽4>e$ç@w6*t!]D"]埪+sHm\@B@'7)\ߤL3W~/6ǟ^޷Sd.t;o@!T$! pg:Xr[+3~Ў*7HfK,\*b֋5d ]+O&hmIjCD94ɕ[3Jz ^&s>sܯ:`իUlB"_QK>bztD:[o;e D46lI`b>ͣinUH0hT`mKFTbܨ/_@t-0e;VQq^ODN1HXƕB[|G٘lo*SL8QX1S{a7'|1(>3`g0o+l=c($_i6p!1u/@*4эOaY&hj*IiP.l Ro$0ː䔄a~BY,wB@~^R4Sg%NPA;hO"_~F[ryWwz}?S\ .006>[|O}feH@X8ZkLQպ@"HJv3 FT?Zrx9տQ(7L0GF̧ 8x`y"$?z/m.R1~W^ZMv ajQ3%w7ՄVoP3j艜 _Z(h-Sr_xz=kbی>f D`Y@5 *&4ξX8 +N{fQz(NX C䴄 *O< l86H`Ve% xgjG3Ǡg{Bw^|W*C>¶Xf:<'ONk횗훆溚fv{&v8%0< $@xlӡ< l <B$t[Q( GHlP3X c2c—&}|6(3X+i@N|V35JLz Tj);vV j f"eHU&;&z^2j `jdymrKw:F Wc8e&hԴѤhxR(۽#^ : e.|`+:f?]CCYZeOZ_{=Qy1YVel _d|xa/.=mƱBѭy&`S~Eኸwf, {>m2@*l;v{T8[QfEPt f( fj-H;Ԗ Pcqj.CI!^+wBvgƴ2-g H>`C;Jz~g|Ig]}>EddXO?ӑmW\Kju\bd J]i1>gfNio"' =VGl~%B +\4g/.klJp<7aQx$ 4͌xf>˚_paD1mw*(,j/axN8"1X3/J(ھCVDU|L߀QkLn!}nKD*5|mqfOCU˗i˭(2x֢k ¬P򐛵 _`y7i-]ϮyD8R2Ez83o96p6-> % TLJ^ ~^8Ձ 3l&&v8fY"W8 JZBHa/^Mv5MvgǙ*Nw懦W7![nh@j#Jp ‹[^,d+}ycG0Ke`\S"Ut"Y~gwv_XuF|ٵ啼 ty-z^A `_f^.CP;-]^-:r`H5W'wBHs|eāeYsK\YFضL yDg,jdz] Z'LA.Dߌb5dE ݯ p(ߧg~?!W%=HI=F8'1x\5юMk!s`u%g~2 ?ZCv&3QVls/.H4J>IʞR V`5ZD;1J𹱧~=JJ(`wǼuZ.3,ܴIBO"]ABFPu26/ϟQ#y - ױz |香V"XexfZHX?B:I)(7SeWtfGLFCg n΃d|rؼNo"r4L\'QvU$P^pΞD@ 7 4->XP(V}YbC|IIQߣW1ϯ>ݏK!{ti2nuJȴN޼OFy\]_ C;h x@Zcz-^4rR)Lph7*h*6 gۋCYHv)o4z'^I୙2'gqEmE%xȉҒ nV@00lm`$r50o:LROK.Z&h~@ Ug(qNxP[@4TErUbſ)ɲ֜Z4\L<G| V6@t1Uwv\hjkq., O_J{50QmS~C+m%"m 1,4jVSL|ûRU$;2{X2Cecu,ݬ=s07dP]cE/yAHl<$+5ޞ7srZw54IN JSMhq׬FY:Q˷ >/!ƟUT* bf${*0$~@괃"n+^dxo;UB7p6D]wPM8֣iSD1/3 T)b5S )6iHS(p*ɽk|PiEe*/잂P/lP[1'n2 DET?M &Ĩ(7^47RԨFvJдV=!?" Hԉ#ORI)iLÆbw?VPv^"gZO PGե_7v[ػ {H{xp$ ᷧIipvy-I"c& ҫa_YR?Nim_K14HFDdQF3*}qpy w6hoư?B&h|j(6t $ M1Lrh?` dkόዅYG4TkW1>w kl)]oM]zPġ9!L79E ׸unCS!Bi8L 9Ӝ[K05>!wܶRQ=/6ǁ񘁄i*c=N)7RI$^f^UP~DSAWN(#$N6B Nϓ]^gCGgo8`t4XIEMMGvM)ZhD`Tؙ^Q[{t-])*. d&r'v::;H~_a܌7/EqoشSղ&zj ~ W-YXc  0 -qE\X <|.:&.VŶ $>RM(xZs"g+ʜJ{ݮ\I%xIwZzOڛm9<)!%~VYqpV 5@QV ̆d_n--8JȂZ'6'XlJh?bPT,QT?We@ r9☬ C K=/W9qAL}%/_ t%m#(nÕF,IM3Gbګ?(_'x˰>ɃӭH^Y[-PRؤ.ADCݗS>N:gUlxcġZQTKÃԘƸ?c$CJ|#|=@K=mһ<(;4wyt K m*qqWDm-*/p"!Fa݌G_"wF1|k)bTAmβy[Ǡ;˺* 29q)^_x>d"[nh_C"(+o̩sڙ٩d o^6.Gӝ3:'aZ *_r%OA˟ƌo"2ި%VOߵ5~S6Ǯv8;g}e:rm^7wpS,GeIIx]xBIaW‚u9k6Jd{hoWT.}jMͼvZu7X5@)=PJN|KXIrmjRt8B,I>K6 mHuqF/ڴ]KZNO# g\$wpXkܦVj6n+3c4OiHfn]_)g9nn҂`oٺeC}[-QW Ih2U:}DS(DRԀ"8}􊼴ENM[JUebNqA-}.Q]EýޠKvrYc.{2J 72@[?}o';1H|Z?h1uO(@ \坪\8) _Gta77nHNN(L6)2ȭӨ>@s^W#g"+(G<,hk9Y ]OnM:ȯGt7E43r0er1Gmx.{_ա4`&%pp2\C%N[E H6({fOE$EEͻ.rPA )ߎsoV ovXLӎ/e];aQBgv*|An[U=E,?;wq+Y.aӌ|<ި$֊x |ϖ6I'ÉMĶjFcj.;J*Z`bPN>nE0ni 7R X|rn` iJ7:Pq"XCl֘_c\d LE?]}2 15ZзoqW"U?Ll̠'Zhs}i~?L0!.]+7pcS[u֡NUIc:mڱsYW4c7 \T2:mY|TWR%s6[a觢lSfLjo]Bke|/#Z8'E`;ynt#O &f(f06 @W0=gVZ5~vwW=-c|{LAøOw &yI47h'س;!* p-'3 `i/3m@#dZ[:(M%IX$\i4=G~Gq xe2j7!6YLf ȩٹU B$bV쎏\`F RLOV-8W .ba[6 1?x!%${C\ 8SR->{-\o[ȃt# \ZYQasl?Ȥe\+ pvqdxi'ܭu1{uELp.ґkLh~@3{ }vdk7qٟ#)Dw ï><:,O*@Xup3ڲ`"3]8 SV7QrnՇ$k;*Ϗl QP4@[!psL$BeamM[մ?{CP~%H.':' W*pm~4O@+gK}oe1}gъ4` /#'>չbLJzS=Yd]m4±\>!O)ULߵWk< z`Q<a}9ђoVPe)+u]yPQ23`JP}r¡Y~Qs=0,#8  %o }+tpCk4*]<"g r=a${oNhErꌅC=!'D?g~t/zK&q?Pk;A m5a ^Sn$QCO0k`,9|p ht4 X`re μ;/~@Ix d3I! sO0Evo2ԔW @yZ4Yr䂰Wj.o:VM&%Ct~w]ݸO479ЈJ qv%Yŵ(o?uF…ZH]ZHC 2%hVuZt](jrS<NR$Y :Ӫb:`X6 id/+L5Q^P!kj)k ^7Yx+(C~dMWWPQc :NҐF&`X|JjZ-k<8p#A t< `f8SMxzmeLi(hE@njz |P !40;&LQ/o b7l(l "ZA"W{<7TAyY=窸e>56~ zb$&pq yL4`<tXSRfϢ}nv2ivu! bU;-cfeb:Y 85š7ɛf۠OV8y倢ul dKtT)O[AÐ(0eUAQAKދ.6X4]Y@ى:=kڌK'ˬcEE ìZ0Q [0ȅ8vF/qרySӸ |.X0,0nX5 %O=!Գm/1^o_˗>qv'n];jP12O)[2ꢀh6Og/pT:8rOf+6:%xTbw6[y %1fuF60rmm@TJ\E`oBҚ n9,9(sX-[XŮ)RuMUտ e^͞;u'$u^]{>VPV MEzs*h݇K-zK8`|1OrO_󲯷rbk)߬w p/.u5Ņ֍WIz8S^I]ꡛ E_ŏ.gi{6> o`0KN@fm< 3_j+eըM|]sR[!gq'OR:̫+3󮢂=O{z|j%m^Gy J骅@Xt@+k0]70D: P*~*ޠsaPn$B'0_ n [.=r֔ `XLݥe*x|{6 +3.zF )˽v?⦃mqee;ik[,B?_^z߾\D$ƷZP'332kANδ`*%x3G ʿJ JGħPsf~FN}.:]:YڷG@uocv0bmcJ5uf4$qi56kdq%Ё`S's7ҌE50șz̫ VQ-]B" ع*QebD7 +{e"@7{+I Ge OT^3uFmQl[SӖ;:p0-T ~b6YDqbR#1Fш;)f]UzBB04A3hk)%ET.i Y\¥PfkTWɵ;dǺŪ^.A+xN(&]|N 3r\FkFTMN W40ϙܹr/HcQCA78,z+=`Pz"Pbc3_čve[:@Q?$32,7N?F߇+9%еc7^ 5{T I5'KdO?[Ut7`a^Mo(2ݓM⫨\Rv*H^ٍs&᫄%tܒr\. TP\q/Q5@G3blY9Wl W,AĻs'K|6^U.cɏy# 9-|8,yiuS{?˒ElGg^Z^ ,EHǘ?] e3xzB-C/uT|^diwXqVHw퓹]sAI,2 ~7O@{Z2ev:D?"&8KCbA-92R>y7"&/F %[>d lؼR|Y]4 -e%vJvhzǭڤp0Y [@B|)(ZfMrZV"_ه-2PKJanj" \sgxТ({ӈ C|^QUJZX ])GEŻй#B\_&1Te,>,y3cJDԠܕ' B=Y̜"\{;:Ai~˱YlE^_\nO2P@4A#FcWo PksiV$vwbΝ+PH]o m݅ [) ʧn@b3 LLF: A8/ ezbymͷIn?ܬxA# -ȸG$hW:Ȫ· /(3F\Ral?A*c6U!s{k\Zj&Qs maN#C%|.nb =EMBj>NhVpT7sC=caBi E3sDe~"%g_7M9`B[8G ^xqϒ^NTD;GG:Nfg?-f, 7ycѣ({̥;mfHSD@( gzߧ‹T[#QɾV'GQElQ4plAYwNܻ 5Zu˷^r;l58IZF GEBTxA0.up4y:Wa,Bfp,(KRzDrQ=CRWk=:;d(dXOe fM,γe5 uM#6 ?1/[{'-, Ed6GE&aC.+O-un{nd3d0ɒD# qyx6}p^t$:+fYB1 vjq,mgHz%UPG`B-m,q< VG0υvl2?e[AQ{/6LF2z 0;1rധ3q+6U1߾s+_'5B %A.ekYNuE=}!K[BŇK@ Yeɚ M$ɰlT)u2zTVOrF2svsYV $Dv8\oTh'8y'IqS~6iA0_oQl=du n;v 640/3dMBDaYg$̩mkLܮt&6$rkcD9h_=m@c t J[awD-[ j0D wIhYv&'Te6_.֐ BQNRt42O)نԹ\o#\_f=&IMGmlFlHl?2Hhz|7U>ȃu8a?2 sGnCQܿ4Wab/iFUc62Sz'g:DK,Ԟ1- ^s)xI=e͢j) oHrj8[X$S `dzjs<4*~d@:8F(uyϝRq0=E~N_PމJ83xxx7I|GIj͞HTu3~Z80ej8r} $(1躔npvz˙IU,ކ1PHw 2W, lѼz-o^! ygG|pCzF2>]ge>7Nrym2>F\VAѸ.=5{:=de(Y9 =%~ ."ښM~ZM>ʭiJotK6/LgL*J>;"' xoC4Z6y|M4^TyFgg]MVp)_,rh-qcIK8o)E,Uz*2:Y`\;ijc"#Ӂ]f(݌StS=vˮ,SӴmt]{b<.&ak+Z(b@ %#ңOe-#?,7yO/#yb ؤA*$VĂT'Sq?q5š|i-mkdɭ+cwN#!mk/Oђ#i^`dLchQLEb.1hFvt3L^*IFg`>(1O'' Nd4^XӰhKsrk,Ŋsvi,К6z!&C`/T/A\Fʧox}'J0NIQ+z͆ErYs3hjs^iUhX$ku|UmY`z94V=[;ϒ8FNcr@C^I'jO1cSO n=``WO@w&*Ù;?2E#%eµxdXy[2) G=>MEǖ}Rg~R'FNsS ҄n3.뽦G_E,R|mG5ݤ2,@/'s"Deul3tܓFxi=c`L-͵Uqk8;]#$S;~ݑNN0.{۸U-CҰGCgg?d/K (|YWZV@.O-xFCT/F?e=-H`-YGS-WjP{.-1@B2x*͔;QWBvPd  S_':R |w#QqZ(oU7 xVԂQ5/0nYUXE*E۶4_EWx7]$VQ^uIRȎ{!;w)C?}m n{ Vb*(dp!'gE({h<5WՐ%c$kv JG*SY4l4B-d]63q0%vGUkY@]=*f']rnm-V6dJ}jrqPs_,{tڪ7xÈ0z)϶oeR&:k1J_:&QI I1_YA9w/15xJ "w>+fwaxgcI/)Cʳev4"Y$p_xe78Y x.VBRAm]} ;PWS\8%/Gѱ1d "B7 ]{Z._*Mh]=dwr3cȼU=mj6ˡT9nĠ5@f3K?瓷$-f5 g?YvSW P'{ ;ЫӖB?eAD _s´xC4[zWg?ႏdt$jdndVA١Th_N:*pL6^Ax*0/m &o $̱OW* `nO\'䄓%Q5VŽ`6Pr)G'&|9g`]AN8 )y&tCž LJks%RwhKC9,D*x/zRJﻠ >:j(m?fcĠ2b4z4V`zH QEmTA5 p3`ӨUzU,Vnڶn[;&ǻjFF@%F CkqLӤ/չNm"ܦDFrDULG.ڜLKUpĤ& -K0#@kctK;E dLѯH ٶ,+)GHou[؞"ͪfmL 8ivvV P!/ )yݩ%& ~LKqpy,hGn8ZgLVD8EM.ޑc`v`\]xa4Hs DC,vE2)QgʑtPae;OssL U4E[[Bܾ*W;xY(@sAIT&lQУ.U\J̼D.Bva-x[dD/bdc§v9+e bӐ£ƀ+TFN, Ode$H•I 7Y(z͑sO:1v P1tyxV>qJQ7˪ү{ wF'6 ,Jpl,ezWf=f柬79S xZ 2}3fQwwC?T\%~H @-GV9?ڜVG` +K8Z!gC}o<,/eڌ<+ X=֫$o\g6Ʉj;mD]+?i*gKONϱR1)5?hߚ ^k@@-%"D0=su j=AzDuv|)c>_.'6¢Z7Q^ͨ4`M e/>24q~4r\3BQlXB beАiu_?ו) LS$QL4{|hvf3 Eet6ԴDXpZ WVҝ}Ӧ :]aQgͷm`~Έüs lhP(4ixgM|Id\ND7P%uk|UpP 5G洂 vgx ~q~R.<8(JG|\.z+5>`̅F(cn҉W^+"Y^5OF哙t*|3WnOEL[3 ;4y˖QAx5.nw\rt ;$ӎV_:6P`8d1f]$"ad\:' ;<.qlW.-l6V ù{hvVˮUoVnT/yƃ_xUx3Wi( }CO&kr:kP<6"ܜWЉV$GI2]34XIr_nպO!g9> | 1;,Tna@ [/4ѷcpz(BE-@̽uZG™YHɦ%>:W*N:YzofԢvt gJ [K`ZM!N`6`CkO~M1D ns.mXs-8|Wjq`"J) 2\yW4 ynU*]Q*>$kUepy\[ D䋯H РL`9Ұ T1GZ+SWl`﬎Ri3fȃ\Q!6P~@Z0d3" 7XB](A ?vXLYt 6Jp (qol BomY(z_fXa [_XH-@=w)Aeo ?Iw:GLbh&B&2. r 7_\ݭ3{Z{#c1,.E~r=YS9%r-=8Ujת-osD*5<7I@N~kf 8ZQW68pj$^`tT2k6L  FD]I f0XwQ/[╴B IW{=;G6ʹ.,uU0C,ճѶ0C|x\ԩyD*Ƈ'y>T,XQ/`Po:ߍphM90\0M`1dWx>◬oylQlZؑ`I] nq'5l-h5RT0 emRIɍ(W0tDt$֝Y͈Ñ4yص^Ss&՗*s的-Mȃ1ÝH Lm v j k#.Iй΢' ,ʋh@'gѫMSfĆvcO71e,6K4eUswet':"?+4 d*#"*ЀAZ{ݟ>ߩٚv0ot3ݽOyu(&5 ȕV÷͖h3@Tq͞L0tWFiYq*P8-nS-98.f[Ww~·ӳمJ 9MXxD> bZIi~BU$R-{ LYIc<0~ZE6,=k+Tw`1~2WZWY$u\o6͡JҌij 59k.&޵".Ύ%#NL@]}~P5694~PI\h+k,|+ '?$Hdj|Ԗw=ZZ pҕu<M7nH?׍B1.B#-+)ckhCXABʏ5gGq p(=1gg{ IVvrW8:KblQ k-KMa)S"o%/^9A5G8N)u0R<Ɔm&w8 bJ`rogA Q}Î65ZʀtKfտ(Fab~/ӇCSj+|*aj"., a5̆W [ b&o«~=QYN*4ԬPHӓS BПFA LjޅWyLR4e;i^&ժC|з˿!Y==PX-g~0bܹ6SFN;?P7 ]~rra:FZ CYf}n CX[H^j,4afMBVzxe|qMd'ڗ} sԢw\< ѻ@-Ã;ݕ_&txd;Dhb6I霅ysmF iG*9k tJTj^ury\.|AM c:nh~V\vͶF ìCDuSތhۑ۔*6EoH2+گQ+~%>F`.h>"+v,TF,y8ahBSIpD?dOYFW\TD4r@ gZi Jؿ=4I -w"b$C/ koo,tYfJܰd~56 $~fVGydv&&`a{72-:  LwC$duu6$Eq1#mm>Bڱ҇/fɬ[L/8ʹp&)vVNx6vw`2Cpee  ^!W,cu0k*q֝5Q7gѪu)Ll/:s~5\a1/X:b D.j\\C~_B|z&f6V$PDK+2bX[܉P{E*Q\^mHJ1&e`K]kg]v6:>n~Vȷ)ԝr{hܙyGBB6Ȕ=iC*,͇U4(dՆ Sp='tb*$SD(m[#"# ]St}Z2c[VLCc@R\[1j+̄ e~M D;7Vy-Ȥ[Q$:t1:S߼|?3)ʲEYl_a]pޘ"\ݯT6x @4!ed˧C ǘ&~7>m@+Lħq>!bJ'fDS? BK dž32>QNY;FPl0&KQ4p9u1͝!͐-Lٸ\T7҅́T)Ns9iUEu$N6 lRBBrh.FK@C~=u|n XSf}25!14PgV%T#_\;;`=A{tɧF@ҧ3\<7l=t"-s_w8>1AG'=y *z q-qFrRqۦy#-^4?`%ԏ I?s$M;Ƹ|C~˲4 0um?i/{"#ZӏaFQ'ӥݑ] &|?a1\[ %@]|`tD:Wơ{(d.Vh8TtCf+9PE1Ϸ;W]w^a4NR l Ao p}8cj&Y`W ]j%<(~]x Ά{d>X "ꈏգBUa<6]ϣV7lA}U)W`nG2d7:`W f(Bd~ճ9e?̯8=Alh8KMZ>5=POz VPln@S)[%QLSW r8Q ]/EZ1B ?q>Ʌ i/LnU`D|gcXPmJYpOE.f`߫Ewom9h{a.ieBUu'!pR aSNo`?a'2l1d8n7zm>?.W\6Lӄ[>$ F :$Uvܸ+cr6cusӕs%Vqb>zOC,;hcT"ᾆ0O)#Oߝ#oWXˤ6B9NAK`+[7GUy★1݁:mwIϕJ|FÙdxJ_ڗ?rs{Y^ʆf8:$dkӞXzL ))A MTf07 #læV2xyUcf  1to zk:R"͂D)"@e@CFYY]j_4a%ZڟIYvGrH"jy6AgTl.B:6|9PQ״^f{V'R|=Oҿ!o)CUxt:)lijEzd՜FS*6c+& S,nHV ^zo_'Aƹ10ıZ!fe|pnm$LYL^WL00<g4ݨQcF@eFYJ |tz{.6S#-\M: ֗-j'd=Uh罄MN"(OSzak1 תuT2PS%57I:[_3܎ Qrk4JM$b((rn]'݋bw+\@4?e UAC̑3B$<],"t^nAStU7.-m!Ti!&7-TךQ0\0-2|.-B7D̓䮗K`Bu)麁7k/Ȭ38 c띙ŊtvOf#^WDs*"W#QJ4:kf93Y C&tN~Ǚ>9$+@,\7B打C̍CzEL1 EYϪnʢB]#,a0,6T,iYm]3_A lb>N7[:?_0g^w\6f*X( 4R'oLgl梁Cv_bJ+3vwtuґ s£pI'? ~/'C1S0Х*:o]*_( fbVo*ڴTl&b)86<%Ts@Z_xZ}P/֣}WP|_[^Hw̲܁MIO6 1J{;"d2c*.oW4ګl~UN_m![7.z=-;,0Kezev!2%KY7mFIեz+8~.V3DK[ܹx2Xn;L6nGXDof 9[p'>&JFks7P6K2~Hv|6`Y,!ldmzY[Ղ*oEwg*RX4sLfkjF+ Q( qg|J İ*t #HV{Iښ97dV\p"{wjM4SWZk/! \OP2n2qvjUIng`Gk'AaQŰI^z01i&:F \MV;a"<*%sΖj@.jl}Y 3ȶKw+V{E# X(4Q J' qo:ڞ%Ub4pn `l| r5 r?pBbqT [iJ84$gk/,:@Ԍ?@V+ n~})M??9A">[dFFi,P3gqi$7btVu٣l+xt߭]bVMD,֨țŢR߽ #՚TжWCF'A܎YDSv+7Enbt+3tɋW"rLn 3=SzfŗS|pop)C gz?VQ%SA|ܘ5b֝:x ?ɫ(a_o @8[<9na>$R~k RteZK$]R8UNg^$]0o\O褭(rFfwAV↲Xo(=|9>6˫-`٤P-(NBڬ፭`̛ g+;%@JvymcZOl!d @jyxXUWbK>+$G8_+at/I={ؚ@IAR[^~<뜵PLD3jTbǃ>4`mF}.nb=A[PiBJxҥKw:/2(`"Uw|SM2'TVo@H;ꞑ0Ke((IY$~94^QSۃJA\V1ھQT ݔ1IV=SqoQ0C_]Aa# 0GQjHA~k#A'~J Mf(Xh؞O]I"pTEքbHj @Oon Xsbޭy啂_R\ OSMWCP20}lǝJ)VǓ 1Eh}-$afwqUxs&`⟀۲fyq𣎇I ^lT$~+ ѕۼd%8*mykkhQ`G?ܒLAw>ހw;3:&Eu =90@ZMJjMG#^Sn7! (L6G}d?iMQM/ Me|HLp+;j:@a r-%w7P; V4m3ɘM u_5KTt3=*2"L:^}Vr:_LGM(iDY:~ cU&E:~QR08*X|RxזIrЮLZP,99rExo%$݄~w.4'{YiᬭkmгK:s"NƖR1AHsU-+c8G式Q"wмnEF ؃ESZl'g]B},ʌ K@ѫn01_8Lm`#ź4 aP  ${.9~b]Ob.NݜebJ{PQbq !¸ɫ1XBlTcz%$T@9d V\Yh-8Ȑcltd ‡.uQWG AW>}7%g˷"OQ5X8 T\nðfšltTM,f@5l|51&cq+h$'~+m`RW֊|`lD}4Jϱ8T ^r$XK-ރn /t)c*)ru%@O=G6Ԣ8R b"Eͩg7>8Dv'Lkl O}yq[L[a ,la"NFیyLdr>/cN6ݼ-Ǧlr瀐As`Oҧ{k ~όgF_622&B1~8ܭB(UO1/3i?s<-B i58~8z"RmU Z sfWZ}&S*XDB!kkSX?2=W-2^FPԜJnmWrMcVv S_>?"hZg@T/zm eTVĩv{|uOgO|<7fs 5ʹ&]HVO{y6!\{yڈc_d.LXYjPGnJSgrҀAD'u'{ &&TEgHv1X|P<r3]#lnEiF4KNt ?xQ3}b&Em5#כ2>.؆HiY$M5eŤzj۫xA* BaA^|st M!rxI/mTwX2W=,R4d98"#,?`_9߅lk}KB]`UtUxutMchzk_ KzBIuY i&J0W>Kwg0X5vú#{='ǽ t`_FQf/X wb9nuKɡ`.ߤK ΜX7B;P[*.6rF"W*ynbдCF_Hav@5 p /5Q@LFJ5(-Uۤ1s'X]qߢ,Gp;8J)MmWX'k?lnCC9UkX0#Ǩ>"h5[VG*U2B+dT\h.D|qk+j.ɗ,YE{2IUO]:f;SzIF~-rKEt֢vP;H5.;^~ԡg {A>:tIH?rZ-W#x?/yvs['UnAޖ 0pOurM%KkD%5SZbTP/,P3gb :4lkz5KY7)39+#_5P U0 8뀭2e<.64#rw~3Dkf8C*7EW.8N^M"ȲP"MvFcrՙtO0~1uA(Qbm&Ï3? ²s'c>}A3P=(0N-Z fPGG k92~>ӡgY~Soʎ]ߎd ֜%XL"?:%ԑe m_jEF¬B!V!l1<7㇝-M#4ZDB!SjS/I=(ߚ%7p1:h ) 3CG%zbydV!67DTI)? d8GQ+lKQ@Ao5)vi?F;;TvIS $;uGNNqSPoT@dFq㵠gfY@v=sUW-$,n+/َϢ  #-/{6]p NeA}O*LQK_jm[2=Me3\#2T"k o!b4Ɩ85㝦 YRYb1l fh,>c&~ '(($Ufuyvhd>,?$;4^qho,FKjGewɤޟAi-^^]Wq5sxC*v.'Z5%pmM܋儣+w=lLO,;ښQ TRx(,,?n{d4r mNyeg:fN_Wvɧ$E `;OV|w1\/Ewbx VR %pqĹo;y%[r3@:QT!F[ހ^ƒ{ T0 lGASL!,5渘η$ dC<ԱWG'gH9YTef@kj<Ʈ eu*?fPU[uO\LKUe_cPx$OmCLTKHBwzqtYmB$T9cL7v:({zo\"ܣl T8At@ۨ ;/WH_rH,8tHZq,|8A!RdEpCjyp) VĘCg%RaMyo'4@k EjћN?6s=0uROViRȭ"rH#^3=ȻFLEULH~=U7?XfzfqY-HyF_SjwK87S}tD+tBD&-Os_^OQo-( cpj3o]["WXdn7K='n1"xl{4';BSTQ31yP=DbBg!y[ v-;t@ ݕ^0ucWsi6p,)gށ]:u~nsK. tS[+v=C)L{S&yR̹Wś*4a}UZ[g6|k?˱B]J9 .D"NC)2<lUN@pF>vHA#G~JGPR{a{X8}J 9[__`NIWn#Z?!hJh^C`thXnEC8vD:l E38|kq_HM_Tg,Cb0Xq&AF!y@|&Ee{ZC3FhkFH$ O!Ċk-"]ȾY09ʿKhͥ=K3Jֶ.t ~0 O7z {[Oq <-neSX_!F)څ<IcH6>GkeawRga `Q{M k^#i֭5Oɉ]Hg|WkQ`2Ɗ q1(ryӸCt0_>OI_uPmb L$`~KҚnTEVQS=ke l S$&úanȭ&bVEyݐmK+oPƞ |.)VTq#ƴeL3;:m{6}M MzFZ^1,03 14dL3δ"Yzv0޶шrāmxJo^q<r΢%nE9xeWGѻ%`5:zbݨ"F L$Q)fɕP27[Vt.vU?YѺIl8vFo*U\7bA)W#TM ^@:3~4 ʸ-43аo%ci&~=CT=$GWd&r:fqeO0—$aRV'=aػ^9bn71ZBH}h'{X޲hWu"B@{֊ϗh)<*'|js*>0ZWsge8N@+|ϴ]0q__4#w$lFk#ln ?h'a=֔ B!hw:LjZtZ ]ouPDSpXt_{װbKMSΕ&CSGhɰSHL@,qKF6鵲[!Od8N돛k*[ )wlb1JѠGI'F)G"ew.gFk+L5]P0z&!:p x1qC߉g>vv-Mk@>q.5t{-ͻ; hѪh'yl9,$ az0ЭGPZcڏ ?*TZop,MwR]آ'Vް쾽S{ \Hbp%Ф+T߿ߩ_5`K0-~ïwA֋6SUiFT}t&eLt2F'M ,,xUp`|P[ }xłi_\RE"5-*09;7/:ViUm!z`&*Hǭi64|vB^>"ZEQt}@E3ud^p-Z G_xRO~od6kٲ.wzWRG>z,,M}mfK)ͬ}FxI{A-k :ɽbU 2B.KP!(xMrx}tԐ1πMY( 5}oo~[}X/8jU{$ #`>v1L@'`! g߫x~#)-B(HThkn Vp7u:/^˔,=?I30v|2͝pV3lwFKD Zy>Dr:~kh7cCap샐*̸_\Gp(G5(PDqO+W[ש)b9ccG H{%Z*ö VߔA>6$)0rGUA8ɓXh/%۟NN;N|2X}ŸH5@x9՘gW}w;YYA  ت#0eDu-ؔ "9 4gqA bG}6"ݟSYTVM \*p#2iZ}拟307¹h`b씹5{6ώ?r6~ /?\v뫍g=T9i5'{\oAl4 hq#u GNaMUA#sz;;aD`j܄< ǍR;A'-.V'!#lkݛܩc:[B5T;d^Q? ?nOPƇL!pe1ywC؎lBߝF!zYƒ='u @rc_h3,^&i.T =NMoF$+ MFa8叇,Ews5}d`۬@K"p<# XE/Pﵲ3B|2V#5ےZ0I 箫6_n_U5GK VPyUxO1+t\|rninc\ǥ4LY.S%>z@N. - F7Wpw4TudwRgradZ) z }'7n> Pg%ԟz:Z0Ӷ"8X&ENĞ&mPøwcN ![!,i;Ht}đt'L9Gvh\UBl!Jd+(ZGliC])/*zU 1]8" tRPR .܊U)JfXz>ϞLV\I32}qco)@^n]NY` g:/{𵣏*P L3obF V:yzô%ܝ Tׄn 5[wRnͰw4G ӵ@+$-X<7}S4PVSK;G*t{s6v*tW?myTRJM:Dv$t LgE@4AsPխXEm+!X|B<Ѹ'@{QN0-(v+FtM Y=dDQ㓄 ) Mv;5Q!'(?:^I)O^x߃7 a< _͚y2ni"qДgXF+@`@\qeϢ h"XYض=Hˍ~4s\LO~,}h#ux&l&jrJ >?h!lYT]Q`,V-p'#jz2Ǡaa; y+TQQʰnj?$Su?2,FipO&g d z@+nx7f ])TxuW |!_bmK9t]}eEν(&%j9!f0::vusҵ >7H(6%ӣ0-FgAj`E"Tע[ȩh u G:`yj=L5I"fDSt5;feۑ=F JxßE.lAU(Xض喒O>$4} FYȾ`՚iRM /;a֜A^&H}c0=!Q?iaPMh;c:|)^|j6!Cq# )识Z_NA7sr??:_jIT++64ꗟB/BŎso1Kz18V5rͭL~yI:7͚cܪOe܅m N);H+=y(4FGB%6gк\6.y'֙{/K2+"Yb$%Iw@+٧/Ŗs8̠kD|E{7N? 2pIOM2SBԾR! p̗0tdnZ\)dä7yr~ES^gEb}}a!z!5{JoȌ`ny5}LE K_y|Bgх&/=`3 uY(6Gxq2H]=ē|faFATȦIrvܷ. XǚX6vwJ-V }DySFR7&D;A!l VK_T3?v^IsxX#f琹\1nwX N0H܌V b4!"k@}~߹kgVFFk=ecIPRRT:Z>+ ݊u:[>b:UITCzy?e;EvS upIEn}$~\1coAGȐsAO=@G&(~l@aGhvg]˅ڌQLԏwt P-n7Q.FҐ Y[x?7A6cOM}4*kqjt ^z i1/JIK`b784[9"A<2űu`3OB"Լ N} ӉؾԲ&:4gއd 0<=p*0a V@Kݣ9GOk8"7Rxz?it;ܓ:eT7g˝ouslEO6a8z@ԀXc{(WXM,9ARn?`xͰIw\W!j+@XSҖ֢<yGD٩qQs;;t_Aκv@ú2ȧ7#&R/E*,v-fOF`v2:Eɼ~nrx Qua+ J87*ta`02@#EbL^$c\78ʲňiρw9zO殇<i $gLMg%QA?{$n,KCML+>C{ٓr![X>0%a>E]M9;~=5Sj剋Q4&4+6i7^}#@ymyPkp4[/F&:]MU@n3H⳨f3?!9~V|p2)J;>9٭v_ ]3\\#n}oo'^6n2iXTHɗE:Y2a g'Y{XVқ}ld+,׭4 v0%j5bZCDGѢ-OL6D3Q2l:%$.Q.S+͌GJS';hhҨ ]ic:b|mQ^N؈e* y.4&9 =b;.LR֕ 1yg)^ ^k+Gߟ64bS.i,Z>#J(Z}? #OhTpB${"9$ -eH-J<eE>_h:sk)}NܫwUEq1yQ NI~p:I<@+zJHx@RbAatVԍ3n!QRgZB )#CY!_DxZ7}͡r2,7;ɉoFeɥ3G :$ H4Mj:I՞⟁FyJ6eÄ}_DZhNWc޼qh+MǺo}KrLzsm+$`CY"})j_%iuR]DqX5@_$rb6##tv)0P2 RoX/_IoAInd}t-"v,Iײ,׋(u"ܪP_LmǼS"ؑS@C6)b6^|e3/ Ex^f@@Lc1V]+7g80-ÑVC:t4nvVLGURAWSÐiu1Zez:4@cX0gVdt>% _ͥ9p5«E.ݡ99p^&g~@E@bxe2DrEGw9t}R ūbCTD MdKAFԳa`l{R} ;1*<'BN[L]|2YraU+^-Ar&G]/"YgWcR!k*Q*b;!ǏwOLTD:%w3dgPyeV8$Y.<(Ry;.d W\|[ B S]ٺyܒF>\Hw)y$4$6:m+(.lcX]+:QhȱQ$ &:lV4ռ멢Ay&񺖾\뙏[D w8: *aeXi@s-k<"_18#%37m²[qyX H2lo&C l{&ˡc,{\TX,D|a)叝~j*g=陎5YM+xeYrnNv笗bR9>K En^S7TjKeruIO̻_*mWA)t0l U -+`?X3`t0_ i ӔĩQx"{8}z$XQN ^|`.|D5 7%Z.ꄸ(EEY%^Y^ȏYXBɟ+ 8U+H˳$){$6zWy;%L15sCg$:׿Xͨ pmhsL8C$6Qn.%;^9a~  clG* 03;yYB<ծK1Cec2󨤮0ND!&Eߘ~7nvSe B{ec"{K',6bϭ6XURd aάl'b; )9p`uX"Oj?쵣U{YJowz`U#UhmfLgU3%3.bCq՟4I޿~Cj94Nȉb &e5AZ0^@gԽ\R= '5/$N-֑aC^C> f#Ig[T0-jARˌ |" Z^ypɪӵ콚@S@Vڝv+m׏9en7w6ԃ՝a Q^EɴeYW02뾊KIc/}fcW :+JR|YtJ25G6 S"zpNKd a[=_0jNž9)`e٥cމ4h!ճ]tE7෦w8jnK&3=<K&5mGƪ$Qp#X*&X,TPp#]4PDPcsS_R̘*`Α4$c;N{ Șqgr>F'eZpȿSLQ@jY DBfJ nv3s++^% U;A2â~6K^H^,b.0rE!Ƭ6nkd'i`s}XE߸o޿Y:Mle3 c%Cr {d[<~|onUzjcVw$@F慀\F@EZΙ32/Ƀb@f 9^ZRGC݋܌,HN1%$}ceajg{cOPlW5 A D&Dd ٵi`hi!qK D6Mٴ=xևW=.x,j!4 |h=畲.*i#:?2V\gܻ.֜$ AYW˩P%%cW0dtʹ`t:) w. D~9hZv5I$ s'.ҽ_EDR;dt36K~@$e*%z93x ͨ$7dY3[-T{E*i_6ŋəeX>X.!N苐0yW+ Sޖ&^D$1y F ?G :1%:1ȵÇʟj=\sT`7d-0 ðhr8&Nͷ?@I0,mnzM ?e@Rwq'K|@bLFc'H[o ,-^pj#{Ul+L  ,)Ub^5=sC SfMS}$~&?v<ņDt6^zu 1FlO|/9¡ۧ3-* p]ig᠜2TQ+U~5@qV2{hܶ"0~yh!UwmƓWTfA"Eh 7˩J/鵘6kZ$v(Wi|Qܭb ڢBbl^uF MH iT.rG`L] 8fD][~` y5E n'wU{ЅLJ?e2⑹ mS0<~봗Ohj :.>v($0i(¡w Wx Gн<2WKuQ$5yNS\S_WQ E?gZϜ*(EkL%hׅweP߽PȨ2xrJy{d_c}K&YlB]νZ{1 a(~C.渃y0ʺʐ`WBA(#k_<%Ww?*m-E[}=9Gs2P[v)jU,\I,wNρhl7`{NJ%^13Ƶ V$rfutQl@=ߛeXyu%C3X9/.MNRkˑXŽ6}0;"M4_VI+J{RUjY=#X3"PLvDaAG~%E V+HZ[(>"6sSg-T1]N^;%quH"=esELHuhryk5Fn %??T1, x J>zܬqTɩIYNKj:ѫ͑B]R>_1$~~.@둯uzW)E4f%tJ^ RVN6Qkn}nUA`i{1Z x& )ʺ(RtIj=],.NY6мYcIfB`xțOpcsI ԺxAku[g-0n &8C= }!oO[Bt,V-shy@<4M(ף}rC֔.b[fYr!<qhρq ;;$tSz!+S5`3X,*(} `%phoX67txvbѱ3Q Q?Ggd bxP"m':1ww$](ޢ8QUVc[r"ESz,=>}?r> AUdC@Q}jmmSZ@BU(७p3c]r,pf%W;*Qnƕi' ~tG D A)L*NaU&BHqxmH7>weH7T\L=wRQ\Wt/%ʐbM7iv96d\u~vmՐC꒠K$αHJ)?+Z#3^V/4BueT촅ЕP;R7 ;ڈ&Q*n\co.VZccp.3Jw2οr0n/fwxhjPT$Zm5T;"]f1z)׈e[<쭾Xp` KYz>K`Gغ|hƷkφQ6w ˇ'h/39B$aAY}Mς#X_Z Al"U8f`yPu;Nqz`4pJ/'Qs1Gě$~5OF3 q<@pǴC6P Y؜z |%i GBs\v)\A{/la[x+bI 4{IJ݁wqEsA!6dm(lMLwǪ]3kEi_xw 8.&vZ%71)B+E+!&]0ucIs/Us6EP[Sڿ+l̵R`:p euC~r>J(EA4u!۷}Ȇ,%փڕ$i?_aY@f` 0LY^Oju`WQ%_}wUo=eU.D w;έ!!?ISfq|-+_5Hv5i3T.??@Z&'d 87]]qV2HIz1 =A'Sm@ý6+1>\(aLH[όξ\RQE.?A_\?|dv>dq<~I3Ѐ i5 Ś;])" p#|Qm j$n%.~_;" p|a%L΋j4g. : \zMɰSz)(]fy<퀅X`Ғ0jr }<2V^~due)=CBIT'ŝٍ 92rlLQcڣ k,##.6@`_"9RΤ>xׂ_=xݹǑCS0{fʋβ>gjABdB_]C [ٰuG2`JZ`#p4.DBZ^CBxMuQg5c)'WjU `6W~%ЧቋĞnY(gic6=3a%X`^"W LN@bg.X!rϞ _m}@*0ۀ d g-N U]=by? o) TEil4 ]nv;1X*p]W?%qJKd Qˎ;LkIUVzW\+~'"XցlKwnzL,km2䲉m P.iU3phk`mkW_̵=~ӥX)H6 DV6/OYȄ݅,paוBe#>NM*ǁ1M+ڱxS͔{0T-gF<+D)>Xz$| $-~(q%C |~Ĩ' t!\W܁:`$+%XYrER_j,gXO٪B݀E5آW$u#m[̇[i f7Brc9 PQ\)lYxNpݘ\Հ"m9_/}ҍJ`v6Ȭ#vvG-n(H_Wd!qv, fx"g&49j"&~>Wrװ+yy**{8+ qP?MmX}k [j'w<:R;>E~&jO0銏X7n 8pSxow7?p=l/te]' vl)oeF_DBVMf DC$ gG^eS`0 eʮR!qT2SĻ 銜2liļD:8-]x`Ie^߆̿;pOsHK_a͇)*tOoDlˬFzc8@(ҸM3H)ng}|[n-/S5`<ډ  +XSeM?ǹV{ |=gkt@͵/4Tb},vYDvtޕgtNMPG'RϪ-K̈b6$k4.e`> &D1U^TAϮ{"Snpxiη UY`!'/,A]5,@yyIYtb;ŝ&׹X1bЙLYS*L@O_q17Nmԍx>S\e %QM^!i"?z><%Gj{~sCl[(C;ݙ/XxFX0e6&%\h(ws*qdvْQChD]<3`N!xswC g>dF+JR=FDM1CS&!mXP'u$i- .8o.m%(? )"u}j~htVEPngx Σ1tX5yuB׶qS+8X+tw /U" d օk^cC/!蚔47[@v2O/8rb֏k‡qb7%4feGXUXjYĤriy !(8V*à (^,8`3vJ*zeORDQ˼мc;_R%kn(_m^tǏwH&@pΌ^jI3nЎ] &'-Aj$ Q~9;fezӉD,k֣m^R2 - Us2A^͸jUO޹IX;l)ʻH)wB'w^w8^n> P@REyC^8r'~8!L&ͳVbQ)Q%Y^q4DSU§LYhQD };0T8ymF,7di;ZB0V0-hn `e~ʹPx!6\g9priO*+H&RmƈڰCT#xr?jx)l2lMgp~V }ØQ*#%ޙJMO<$J@1[\J8dCgQи ~O1©;&"Ǟ5)`{$ŭ֋A|S."n\E~"Buݛm> َ/-`dv/8v'Χ杖l MaMKVc7i $ʼn~*Ҭy?7ّXSĵ:.(Fi;ŎN~^ύrNpT[<^#M3RHpl?q0Cu<av2S_P+5ȍTaF5.bNYp܂RӗQQ}iKd!g` vt2lyVzd˙IQ%q;i"##!:7H:Rg努]DoţFkyd'l#ð٬# ,z._=bn(À ,58m_/"ĿKvy $N"Gө6-n2%>ꢲBۨzjn+S\ϒѳ,~nI Η=a+$ kgR:!G:ph5sw~0w Wo㿫ds%'\V?f/0O;Gzz#7,ɟQbx$Y>Ӈ>س^K9$gi91'Νqy7 +CݣO?lD{8)u֛ȄOa'\r9H&vyG.+cX2NMmĺIÑei3%SsUE;Y_iP?okk'VW"t+/ʱt`Es!%sP`JXOU/F< D2Ƙ܏j#ݘH:~5`д7O~8`<)wX4%=|BN W);3.^&ʜcNzLLF?v<x4biSz4hhB}`WIY07/3z I"02QP/P*+>YI*-:>DG)h*H!-mx(3]ST%fC86иA@ _u܃磁*iیL"wI5Cg3M߱~ybj g-0M#))v=ZZ(.#< T@횉bm4'R{G=8$`َ+cv:r>S=#e33[^>s/-!~5VqxGY(:\#4`L{j-V&`G}ڋUpCT@wy 3f`ѵAC!&6ȲEeyr($Cf^iYk]W'D+ |2,t53I joCe)W19mp9E WW`@ blk6ɤJ>-+2BNOiru_ع`;yNE!usHxD=d--clo9X4F֟2ea~Ylq}:@ ^`F}$3GZQVW藈.4EJmt/?rOPdGGO~PO|jJxhOD{=fjNu3.bD?䲞-ᘒn/?'I^&Nɢ(=0]LB3i]QkeA֏˭G+6u8Mw#θfDX)J}I#W\j2 R5n Hژvə pIbB2vG 0a9 U*MC6P_r4'y>š%EbEEn{ S sioѩbDίLXsȡYmq=ޘ + ?C$Hmr3jr\TG_j8z,~vviWUɮB6t^f̅͏<|*e+H5-Q)hn>L K5ˋℵQT{1{fcd"WEa|b($yKQ7 mo^s2dzSHO]5deD!ߘL #6\yP)]sDBբӶd]Rr=iA@^̓J,8q2pst=j.r ^FF-`ٯT U( 6%܋#?E[\ʑ΃ylILmYn65q(wNԆ}K*RVyiE a̟0ZG#4^4=AV{{&jYza `&}iإ&@uɸ5pIFhia5-ZP8KUtGosq D8.⸌NWf_=; ~3*B*?ZFOXU?x6I0wɡ;ۿ_=ӵ4Z#V?w u*oLih8)$1w .b|@e͚f,Q4 T̳11~AʃyӾoWVu AY:Ψal vsa|6ӫax*֠űeAT\.zR0y/"wi8ha:Z꭮܁<;"'PhcJm^qЗy8q;MkXw7|3TfMC6q[U2(s(oXpn;N0_}b. KA9lw\ ?ۡ0Mٖ DS[=n? 4ҒAn@X&wNz,9?f i` u~#AyT6a$}uu%Q2Fox':&O2Ԓu8;¨Xּ*pjZf3oRw!F@n oD|@K524+ #@@CnEsuf<_ (=ŮN:g>b:U"(;edT3~ў'&KqGF<9)tvV%L,334wDtXP5h)J0:(ʏ+S&dAF^*|0Bxt`?*+T8qЎa&pԳHVvb~˴ b9'bOɩ2~vmҨńGx1|^@x) 3A=`OQV~" 2Ri[iq!3ޘ I6&ݿW煾AQz-GX(c"P\oѼd[ tH=XԨN4;s!1uGy&Gs+c+D.p1H{e\{@`㦘M[ͣC"=8BI<4?#Ba,ZQ"|Zz< 5PHQuOQf9󻄠~խOUO/\O;<$._ldFqr6uyV7߰HGXs7p_<5EkѪ5 ZwﲩYq\ K3xR73/#_HJ}ZҼqC V9(WPqQsZ36C/rlj UJ?ڳR F^3tAxKIe.C6?}^NZ"gv]7NFQ]<;K*\j\`.hcdޢmyJ=LsE v9r_O* R|_3K=ȩqIksE2q ٴv? (|濡B B{,-ߚn-;Gΰ}r epQ`H[((|kC yÆq${nj<0(p0f6䘔 3݉*UK"mF'z "<ʯ~ryt5.w-=E؆ud lϠ|5!yYK0wafTfH3#!9LQ/ *vs 5-T{әzN<ƙLVu FDfC@Bc5DuS}-]ysdi;6 ̪_LQKedTJZ@Ϯ,GZI:Yl|!K" X( H;OcM:2`o|8&7A9m,Ee|(t׋{TVK%@.vku|p= ưP͢FX5M[R&zT!o`[o"18Le7e*G ˹E&naY{f=]۸>z,|]1{Lby~^779&P&+x̆~$dR3`U#!'1i/D.Hi(G $p9}l\¹Wv99o>(=JS3<.Y':G04kLKd |-B~,xz\Z$K ǎBfxjJNƘVJ'_8[׊\zy!gRzD҄0 0&=Ra۪J飕bx] 7ׄLmP@ʆ+0jN|xICʣlu^3k}C13ހL5yA*~*j9\ߙU(c8?mIA@Z7E &* Q Q^׆!$A,W%2b?]Xթ j? d͔vJ K?PSkF^ί 3ec xe8:A]/YؗO jgŀ8GJ4qFF8pᨉI!*''ǺY! !0c{/j@R|AGVEs$϶n*(K>nYїWt9~rRWBm=%@DNy30_ aJٝƊ=y/΅nq4DB kk5(g t+ժe3a9Jh9tEThebDGc͢LBTs] [rMKg~km/~+O{ϋ&) #K.}?DpW~a_E-j&M]kИ濚t3X+z[8ajɲ P7 L 阎ZnA9/7ـ uܠ/)adxYr_0k9ϣxjA:-ZQmJ*Or wJ'V X> YӮkS~ф@Dm4XNx&~K,A Ջwod(,?{Pr/uX3Ic~ĩi[$ [m0W ŕ1GDqo8ytFk]t!jO_5ɿ%jȭQ+aD~}k(*~v#mײYɬ9:v`۹9jck0t]>q0(Z//Bցr1KדdytC_Zx{zQ8]ܶwH`aW(vz[hJ~z9O>#(Ӻ*bjL,u)vb~t"~WYYՠuNυ{Qdu#$Z^K1ِ)z[Y;n[,/݅[E@0]gjΜ"DchI\bVHg(cƂMa(4wM T!c01,j8as D}tS'CIF@{>k9۬ N`kHцWÕ#P%%9sLeU&??fmč֎9Zf|oKjD<YH) Ƈ7*ĭ:yLWN(Of=:9nq y[L#愃A=yX1E5%[F#T `9&\yXDf=Gq tdJJ/$14h"9J [,QX֞~GL8%+_CiWI6v_nagCK(Y79c~;&aKcP#$/wcc+7lHhp>eT UvݵP6b f7Re92 (^M]T>QIh8ӵ>ZpxTdrՍl2= X-%cwď!YY?@;@x&q.'=p57z1E$|w2\KByZn3)ɏJ6(.a(Yt5\Wx-,B~Ϣ+HQFonB8Ut tګM pL0eONjNFd$\oH@GXs_qЫ#6&\b)fk)7UKSsoO6hM PY4-IZ}DH*nRz옪K`t%OAg(/`k6]/n R_3)1OTs,:ͼX9{FRq:,`hO@MJ+zj .sl ?mx*s#J Is!8?w^Wp " >D:O' jICzNY&H|yUb-sHf .Qy-%0A]+[?a)˱U7>B["9!gܠ*3#Ǝ[Y})ixYu]h<2/]&:.>|^X~/CF~@4<6-a .̋T_ ۉ5o1 c(q^vJӠ+J[c>}|@%S #%QįMxK@ගfrjnG%,yu&gG78LnTUuz([:drvVBvc"阿E+a: -{᭬u'qykM/ ;1cю旼cZm&a})s ~&ˣ)k: )Jrm{:m@)6[?R^߿ƅňt-7vgD%<V_j3w]x5'!dӠ&#r;Ԥ>]C~6;' @oPڔ_~H{JgM\̨" J|+iq3o<' TNuE8(JnҿBQXFbVJ>q{~7Q+M A2fŒFM| :xbN:**BKj2( +2&'ܴFTP+Z_Kb3qN/%㹳x%i*vV ŧbNfPܙoꥭ D7Igw>{WbwR 3NL)WlCBrbFtl t:ŐaY<v5VpmN_^eG:`M k4#$CAgΔs(pڿyqP(L<5\/ Ds> ;r_1`u1{ȞN)Js߂o;qsI{@ɖ±eZv܀Gl { wK= m|sqWGSöWz"كzMMYqqS(YNI 㯻Vy68-M/ˣq]SgJA BԒfHt0MAq;R/Gy\@)`K[19lP|ex:$ OQ{|U+DU*Y*q/Ŀ$~z݀C{$Pe)yh-[~>-u4t9b=d]~`~#jk“fI7eښQX)@v~:)%cgmV`QmF.N *[X/ &ǔYghݔD_L~IU #oc߹d7QюAįBGbǷS \Ե[ϰ Ue9^f-~(q&Aag !M>FF"ibȠz;\#P5t{`<[NT0(ZU\ {*糲%x2i9'UcZM>$S^(I04vGiWYATpX73(ί >{UE3i~`C?\ݔL-KJS~w)JYЍ7~5f#G>g ѲEϖj4 b N $994_2U$J!C wQz4J'.xR0(r~VQs1et*F86WFi W N,!xCD?#n-UL|_*8(K׊*X@'nIb8S*MtA$R2%9]8 geG/* L,ȫeM^Jtt0 ب{BlŲЃ%ˣ]#_4?f㭹S 2%֑0 ϔU:U}Z 3@)fl{xH} W)Yy/`eV f7(}Ƣ RVTv^Y\Tn Ǟ ];z{m2 L-lLP19-s +)&P`>yX}rU( hWm#koX9Gݰt(y.,}NɅ) }{U?Vw:S۟'~O.|(zHhW;zxTݽ,#6ѠEJ_/x<Ռ)}9XIPdfTsaM>E0'EkBDRڧ],WKdGSKw>qE (qգ( ;>4E}?ے\"b|س7ovl_z^ܷ'rQ<8 1YRQ{j[Xk̚rU,)(ZbZ_#Dj%- n8R7(5r~dgi#i^iYڎWn݄ "Fu®/GU_Zyt 8ܶ&I,UI!"NA_g͢9sOe>\$+I)VК=LN H{?|Fj28+;}ް)b})gXKN/fI9]&ZLkt,d4%ɼilڹVgf)p@E5v1F ceG}*W4-טyI-i1 ?ss+$|V(ǢE%I*V&tbirڠGs2T%Gf^^`doVR^noWɲȻ!{ŷ\Hv"E`8H:@S{_P&wG0c$ZVW -e/3Lp_Dr5ͻr_3gō Bi171"y"Cuj|buEG'WkGN;F\8,SSۧ7y>vneĎQu۠͜|zᙰSɃ10ւ:u9Rÿ`n詅rRJkxBzѷ:aD#*]90/7϶/t cY^U\E' #bDPJJުH6z1ܐ屜uaz փ琽=Yr)k>|_`fvx<*un Cf0٫(^ dZ C=Yn\\'ݷ|?`t 4uwa5C6^xq5qZ?5hp[=+&i銐g wPd&n"rʟQ숉YeJ bV8uᕾug٘ӡT_[r5 2d@$s m$SK}92uǷ6~c6+wA%޹zRŮ3]j/nq<;B8Rh_Qr(-6 uh`9>Hd5СM4kI?@ %"o )M.7%G5/_@&B^+ID}cycB,UٺtY,Mqum0Cg"-"}ռD Wd ă4@Jdrѥ9/4<[: .8^+7%Ϭ2ĘEٚP 22D> /;^J'ҋmȩ$\yVmj/lϗzHWߞTthx7ucLR)= y?Tb/֍?8TR̾I1F\g!mP Lx. U a>O<5R[$hpU)>yQ* V[!ulT@=km=.oA.QڨeoC7>KiDPV2@HxOm{cJࣇ^qI9u!ȗ.T(DMBo/}D8pK!=Yh~ς' $붙_ltM9pmCI=7^ősAGAdcҦ|FZߒb2* !^5sHQ*¶@lږLa//WY,)CFQăڍAQ SOu ?p2Fou| ˜0^R:^NДh!joc99wX<)4Ĭd%Q*7oT}92},kXΰƗ:4{a2?Ǘ`AWJ0S-yI1JxQek_ن/})@㆔ol9cWY*Ydv 'Z88ŪP2=*7v˖$/(wGIhrL :j_1WѼD^_!6J0b&] 9%Fߣ3ЏGJh J\2 D<(VM@*]ݺ( V"4XPLVtĈ< JTߧr ͸8*|Tm|u1^虝N¾%DL,oUҝ偝Eq([牐4a( %lDNϢ+i"tqqN [z*bUIzŸtwSKQ:Bd8􉩉WdAssT>%|iLIgZ6YU#U_ $iLͲf?%e˼,bM>j^Br*QiFSέ"ӹ̶~RhAzm--&EQi #5.ñ Ȥ3@]|gg.kbM;hd˗F$ vi),a $`t1^J4<꫷WX]:KếV鄰EG6$u[{> MUqvw Hu" K.3¹޲4Lj?86r.#&OUwmn= GkSlu|ķU[WW6ۃzA amæSr R#CJ!08dtY  ]P?|BZ8A.Ħ-XYy%ih ί0Ơ&/D6T&}+xf>y rx'S]po~\:fu[ą7 Sq+_F3Uu:LSQ(Oz3u@J4bԣv_GleÚFU4$jhpᶃo3~O0=ȯKE^OlH .L#e\mXt UmS#xcv{T:uDzr1L῱75iOcQcѣ8x{Mi؅";Rк 0wN r⟱vlKEl V Qգ65z{I0`_T6"\2ֹ0quBǹx#+ ߡ@^@>=5RYoJInF%qG" Pkb' OSۗ:[{%Fh)IWC멄oXew0@z* K39AU1h_/vboxkq5!";#L/6!b#7x'`s÷} eP% }af#.%f대1\{}9S<7=ŃIҪA{ 5I,@\cPJPr? 4sy - \)7&m%1zpw4PiDDjx{ T#~2j%VJuNE*ϙ}ONZ5_u/d!lFLc2'P.UFq,g(wn*};O7$HgZ X=( gǍG,:,k]vzROc.BHobQcڀSNKJ:`j!s o_u9G3\ ""vorC!kaU9V)ߑ1e'&}㜂H<lJ kR49϶Mphi- h**|X3cC̡ xiZ!~eZ{-N]EF9PJK4.V'YHNMaٯh;I:IYW0y6I PDeM ^|d"t-)@1&#Z ])8~iNDuÞZ%ϐMsH&F8bòWPQ:)f:.= v@]fuHӇ~$(t[cV8&ޠ1M} 24J;ZRy0vOe ՌmDWLO̯gE/L-T@9EG@=Vʲ 8y.hE\Y$` !^VHޑ;Cf(UcÁKYw/5֒* {bش?lz=p+b٭½[%ZCy+VB\Ш6$2r(kghJH [uVPo}/{nėhneu΄_f^e!ʟS=vv4 G 5>@ D2n k`JiU {y3;7r\*Da 1Q&^qj.&PCGvȂVDn % Է53~`G}tQ˩)NOOe^M\}A:" 3B&GPj;#};Naeʈ: Hͭ5©^ 3#~i)a95ZO1aq1SvSyq9؈d@ ]l C+*A^x-srmՍrܩ3aR~1#VOVaBG6ӕ=}!o X8IeNfz8 QI\ʚ"F )%zXG9,hrSjG[`i̋Ӊ)/瑠Pfss_/_eVq%??A~!(2Na.?-Je-)\v6ǭl\mGnjf=nnR?:/ "@['+<_ZDxt|'MQ͏..`o黰Nb {$rp]c g^|hw,&l)+7v` Ga)]nՙLtlg vN8z1!ȢMF2Nܐ&UmsK2(DBM>>xR;],);#*x-9ic lCI'Wg=2 %l%?@9^km^Hd,_\9 -V:)C~6Էv6EO,tVF=ԔlըE*zr!)ވa"=/Fߚ\4w:qzP8H ({{_.>iYI.P+F-X~q  mLʗ8_&IIR$ {#BܕW~lD]uo7ֿ #;7ݛƀ_M qJe{ bŽy [8UY :]_qe@u1wPҫ|$(0KQVo8W˟ a~1&XAn7!MǗv߶otWlN!dZAlşUreC AJ`..`u0n |/-aj@xD\RBU:^BS /p%I')tK5k` ٰq0F >akPчaNoxz%w+U[$ngjp4hi?yAkfz{O0[Ax& DoQdQ@(abS ثHAEVmNz(ڬOi˟zĆnRË7Q4K@놽4 s8]#B<# BWAWڵJp~%4;Bm+{)!ц\:Fh ,7't^5}'S}\4`o?LfH4"T$!?mE~DŽ2Ufk(5?Yr|`d!VW\vEÅ 3Pxc".HĊ<~ ]JT|1".s{V5sj !,kMr<kEINRf,oQ0o2.}( m;qEqx;\ra6XG+Sq1āɽD)t q=^KM 7Ds?OA- g:f)+ nv4p&RE5vu;4Y紉͖$:C3e~i~1vbX5 D5 s?pøj ]ȟe?m_kQ[Z!~}! +YY:TS&$QNhaҢ.̍#\ z4VANCOҡ'"zZ$πȕ MGGĔ2iEνRe Ο6'6形ŠP ϣ=e e%0z/诉ߢ(y T pOh؂;y߸m#J2C[i2бcւcl|X~ ,dë y8ݟkpq@+q j(dt1L.2ZOeCCVd "@i''l1nF ~쓜Mڷ#+"m!,YxE~NI"jMպ@7~zZA#D]Ci:>\o9%4L)F˳T-pyڎH-hevgLkبg}M#mN: ;#ҞrxRՙ< BEs5 FuÝj"xO %K<J'؁hD/ӌx092Y5 F4'$upVL@y:9Nnki,j} r~ o+~ R/>¶RGS9؊CB+LYo&cjG 4BBs<Ѭ9R XPj z+Z' 9Rd"b~W] aP=xM0:0r9.]-F^,C!6 OXLxmH)x}f^M}\y"fv+HУ֌~p~h)1Vԑt; xu֚%1ĈXbGn9Q'2SHm\FgX>IA4s/_ﺾi!ihC X]fr0WSQ]m'τ#'k՞uUU<} w/Raez;zS6G[Ӊ*5ѣw!qp @AH_>b+^`BGY5#cȪϚ MnfkjMFs qR%O_}MaT4Oo{ 싦.W'5HW@5(ҟ%)0#ly"]g>'r_8"#Ukŏ. ΂:hĥ Cus_gd&Ѕ8i!up59Id$G#VtZ%M zYw\n+W1Q@ė8kހΪ"J3A-~\(Mor<GZpZW޶?OSx…y>8K=9r4u̹ꁀ79պ):Z4yVؖɥ1D]F]:fƂ?wKi?CД6 yDs.+THPd;he vrmjM Z74ߛ&`P:Q)vPvZcQ`ψ^X9hM9<7Uõzmҹ Z MNt ڻRKM"[!d!y”hWm".&C' 茏8'1WZ SaV< .LR#knOC3Ɗk '!-RVxNtnMeXh:d>6h]X:%L?glE ֧g'qcAHibI&!);{'즌b'UQfAD *3v7Vc!mfqmQ- RV'[=>882F#dݷ1ɆDE D7^=Qǫ(knvmDq 0b7.Y䒗C9`{DLl"(Yp"^G3$~ 0xW䣓N-63]&"mʧELJ#ȹ'|+*a<2"l+ ?xYKWQP_!csҴqHO M/ YĈx3-wv-!AOڢ0LC*jR )[x{™iJMu\:[{vDŽFۗ¸8%e鰭@f:emXK][C\jݝ,K9+xuj˘DU‚cAC2Ԇ}mO("`qo!ViW&-&-YGic?fB6\p 7`v {wxADikKM#c\ ""K0 }=FLoݹ?kWOU;Iޜpd=Lq1ے6A]X6qkL}ytDV'=H.Q^ v!ֺK,+9\aݟz@i.-N(o QS= 99z@|{'O$^պ w@R%N= H7^jֺPw-Qbf#ʭ5dPܨs> @gQΒֹY_bԩy@Xԯn Ú!TM'2Y:H d$Ļw&^dd8_L&_ۑl&}v  qBv`EXBM G(UaTU1 foȏ#?u~l9oxM-d0e.liGeTЗq̢y ='!4TH&lkш{طmk !*_owޓz2}HaBoF/eũ9t}609+,[GekBRCmog(-vCNܬE% Mhb7Js)>A̎00[1=^ZW>!zB0g'>r=YnldGyy^i~r: &F?^.7dQ(GVZ@?i*t .,A\z&H~6S}H8 }2%PlP0"z/w.W}Zq*IH×lZ-[>M{a.Q`قL m&yvFMy<\vΒކG&e.6jMwCۃBHGR @pr‰'`(' *Vis`v V \ESKf;%M HiÎ]#ϞCRyʡs> s]-ݻ[2 3ZVxa'f}UYEVNbŽ.IH.u2u羁Nס+qS3UxR7@`Q?q N\L^eV$ 5 ϐss⃮R!/j9q Tz5wV]BkSalyE ,yID`' J=̣gB[;|MOk-B02$1iA{~ UEԁځ:7;"<+=)g }A_B:gkJk5Z++lhl!AhSaVqOl9Ȫouёzd[0عCv'85 ~d-k1 ^n? ި; 0LNm G*X`!s.svݹQn(JNY;}t]cͮl Y݃OQ5n[3PE˫^Q^)aDJ=$9WAnObG+@C`*A_'I;\p|olŚ5zNDxŗ9M6=[C٣uRC!X`6Gk\#iJѨ8ޜ <&4URJ_&ۆ߅ٜYnBVj>c tJ NFm5cP*(I@DM2ʙYn#9CK8dw)/ K,W^o:mT|e{HF?3S]U_8-?bA$Xҫ~6c:mC#ɉq<"2 CP40X!E4BSuVkP2ʲn|hY5vҋ坦g#].E̱x \5qL6័0W+R\* xU5G?TI14zNj(4#]橥a^ QXn c3I>n%>67"0KTvAA.+[۰d>t$PZCpeB:i- ȋ/XZHj)ps[SZ$eg?TJz>~UTό=+#Qf 2ģg,<Ȧ\Qe?ΑQ8WP pJeAu| $b._!aenm'+ "I/.FD|vK9cQBP/D@^A>.U,3hA`!JG9g96b);Ί6'rD-. Sm 4K +>MM[j w:ލ W,FAo-77t2{$8~G,~T?ԍud +S m!ˣb9卟=7PZ _<߶X(YaϩT$пo>4&*&sN5?kDF8Ij 5,2Ej:tëZsכ/9J&8V$aDֲ#f"` [Oƴʈ(@RjҺ c?XÜ\R_W $ΏK(T5䧲`)nlu\H-|;AvxKd"Edqtn @s`&,Ò|[aX@ILRD"ʞ)V҄Y}Y(rr;W.d/no}[~[ [^xyޚXڀFb2N rbKL5BL""]ZÜԿ:_e%6,3@)6Փ~ c.aPR{JӫQ=s?kGeMQ_ۭI[EwB!f!pӊ{n蓡)ώL֘7TYo)_(NT6m}tf|mfШMgUJ+1e1BY ߽9t`wVE1^kVr_W]t|!vi݃ݢpe*1nU+k+@LZSM-+jN7pb ZK>gW퇏ҥ_cfCwp@%Mm0uqUԩG)0F`bN!OLW|}td?E!GlqMs:HFW'#_+L~;GJ\ȏ#uULtGkӟJ˝}'|^ҸdzȽЋ[-xzNdJ^C8:<=/^.(j^߾>tnP(iu\t >S0>~)M&W}$f.hedjoU fɖD]Vnf!88ߥkJ|3udj*6njŸ6 iyJ;N1u|-*Kux;nW6?Wf <4b( ,$ =៊+A͜B=[;Tt_ q_'R^TN}nդƞ'{<?hKf&R6JwOPdWB!V}b=GO&*TB/^t~ /`?À$ k2;p=LI6Ts!(AX kҖ`̄{zM@'v⛋2\9lctSJVxW84znmQ:G:m>)\1rJpP\7C>R|zXFz;vAcoCyZ/9T VQemUZBoRE-t&1沃ѣ+7NU['͛> (18Y)>8 \M༚tisxOg֮H+j@\NLR-_?,vla|5.Ԓa6@jm0v2QjvA*P <HhF,[l.*8|iNp9߯6 $=TYyҏ zV}y_: ^Q'TSG W:T=#7Z4~W|'!1We: ~>a3)Tn9O}c|w 'Rbh8u;j:4/6-Je] ^q.iϖ=v2C70f ~ h3J4%ߡE`$.֛6^~$n*2bt7"{Y0/l*q|k0,tIn&u;$Uuvՠ2vl!%t<8"ؠe{Qe .;bDL6RnV|*}BcsƊ; b'޷}*T-ú> ΍e/e4&̟f(0(]DuXoy/H",G{|<F0 |9Gfb#$KzA87>u#oQ5j{8d}zfbd9Dj/c콭]2U!-Cng A~q9Y경g  D~]}dD:@N1$9s1;$[ɅTHUq`̥׫B}Gp{=~MVp&cViV%AYcȦVT!jglfuAz8J;%%-<Z4њ0$An 5$Ҥ/lkOE#P2yJO٭sP307Q6Ō-_66HeO< nv83zѤҔIS A;F8I4LwFညRomYd YZT'fÙznQt9[Y7CBW%:h9Tffl*3?=/p闣m25cK #S t&dZd8w kɞ 1 lJ" HhI mL¤q kK&.*uϲl,V^E)+Rqx 7X5SG'´r-Zp9>flD?dLz_I(F@%f6k>a}IAS[ąlWv|4eҙ$7tZS0a=koYcS)*S5E"D:'ĩ%۸<ӕKm?ȻvŬenҬh6O٢R|~sTe%^3Г3 '5ʲb}wU-Sg/ɦhd c֬@f#ۤtjKı`q>SkSUHӊfKS7;L0zWev?DߌJ.I y%1ҒUY ~&2$qhѽpSqa־5C  Pj$*eD$Ļ&͚;O9k`/uݚb D",)MbQǓf4[|9:IYLEَ[uvj)=#TD{3&#(B (jS9ϛN^_hF{7GX;~q>׽Kx?ESm-isT؝Y?FEjib3& 0+zJcA߰co0\W.wa%>m跆jT$qZqC \l3IPhEK# R#!݅&Vȵ`VSS&A8(YluiB`P -/6S.`YtaXk5ao8r;)߻ShzȿjՖj ݽ0ゟNxZw]ݓ^9aeX _$?Y{|_+lc2zIo 4_ρg6#+%CX7-1R0QTG+ (*q %Lj~ŭgy|RɻK*(m:CALW괫VX#>kj^?򇱄ėp^ROuIqX ?Wnr=ݴ+eWzmĞGGOK @D0abŭ=Hjn]qcB?ћ&o}k;=/jƱbLWQwS 0%0+ڝ}`/bVlʞp2Ƹ_e[~H}f.Nµ)5StG[h:5AUߘ!!`/RJ6)$ ?/]+XsPr\3uB::cf<ϷߊN|x|am>\~޷80R>D2`xdtxu~"ˑ|kYD.˘?=R *4Y'³,29RmbyQW7ZLdQ>