Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Cortell2010-02-15 15:34:31 +0000
committerJohn Cortell2010-02-15 15:34:31 +0000
commiteddb05898660bada8ed8f206c27b78c4b389c1e7 (patch)
tree29b881292993e05707f104d03afe6bd1a8c1a528
parentc569861751209d302cd2e5ad3541f1aa55fb432c (diff)
downloadorg.eclipse.cdt-eddb05898660bada8ed8f206c27b78c4b389c1e7.tar.gz
org.eclipse.cdt-eddb05898660bada8ed8f206c27b78c4b389c1e7.tar.xz
org.eclipse.cdt-eddb05898660bada8ed8f206c27b78c4b389c1e7.zip
[302772] Refactor DSF Disassembly view to support CDI
-rw-r--r--debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF1
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties7
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/AddressRangePosition.java (renamed from dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/AddressRangePosition.java)15
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/CDIDisassemblyRetrieval.java105
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyBackendCdi.java555
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyBackendCdiFactory.java40
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyPosition.java (renamed from dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyPosition.java)11
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyUtils.java53
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/ErrorPosition.java (renamed from dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/ErrorPosition.java)12
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyBackend.java178
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyDocument.java33
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyPartCallback.java73
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyRetrieval.java119
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/LabelPosition.java (renamed from dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/LabelPosition.java)13
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java7
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/.settings/.api_filters11
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/AddressRulerColumn.java5
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java960
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsfFactory.java37
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java1191
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java66
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/EditionFinderJob.java5
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/FunctionOffsetRulerColumn.java6
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/SourcePosition.java (renamed from dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/SourcePosition.java)15
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/ActionGotoAddress.java9
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/JumpToAddressAction.java5
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/BreakpointsAnnotationModel.java2
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyDocument.java180
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyWithSourcePosition.java12
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/provisional/DisassemblySelection.java6
-rw-r--r--dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java8
31 files changed, 2742 insertions, 998 deletions
diff --git a/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF b/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF
index 63deaff592..41f3dfa391 100644
--- a/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF
+++ b/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF
@@ -10,6 +10,7 @@ Export-Package:
org.eclipse.cdt.debug.internal.ui;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.actions;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.dialogfields;x-internal:=true,
+ org.eclipse.cdt.debug.internal.ui.disassembly.dsf;x-friends:="org.eclipse.cdt.dsf.ui",
org.eclipse.cdt.debug.internal.ui.editors;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.preferences;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.propertypages;x-internal:=true,
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties
index d66555e259..d2daff3715 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugUIMessages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2003, 2009 QNX Software Systems and others.
+# Copyright (c) 2003, 2010 QNX Software Systems and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
@@ -40,4 +40,7 @@ CDTDebugModelPresentation.24=-Infinity
CDTDebugModelPresentation.25=(disabled)
CBreakpointWorkbenchAdapterFactory.0=C/C++ breakpoint
CBreakpointWorkbenchAdapterFactory.1=C/C++ watchpoint
-ErrorStatusHandler.1=Error \ No newline at end of file
+ErrorStatusHandler.1=Error
+DisassemblyBackendCdi_Symbol_Evaluation_Unusable=Expression \"{0}\" evaluated to an unusable value.
+DisassemblyBackendCdi_Symbol_Didnt_Evaluate=Expression \"{0}\" could not be evaluated.
+DisassemblyBackendCdi_Error_Dlg_Title=Error \ No newline at end of file
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/AddressRangePosition.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/AddressRangePosition.java
index 7f4b865fdf..b4552a551d 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/AddressRangePosition.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/AddressRangePosition.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007 Wind River Systems and others.
+ * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model;
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
import java.math.BigInteger;
@@ -63,4 +63,15 @@ public class AddressRangePosition extends Position {
// identity comparison
return this == other;
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.text.Position#toString()
+ */
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + '@' + Integer.toHexString(System.identityHashCode(this))
+ + (fValid ? "" : "[INVALID]") //$NON-NLS-1$ //$NON-NLS-2$
+ + '[' + offset + ':' + length + "]->[" + fAddressOffset //$NON-NLS-1$
+ + ':' + fAddressLength + ']';
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/CDIDisassemblyRetrieval.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/CDIDisassemblyRetrieval.java
new file mode 100644
index 0000000000..a2853192d7
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/CDIDisassemblyRetrieval.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Anton Leherbauer (Wind River Systems) - initial API and implementation
+ * Freescale Semiconductor - refactoring
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
+
+import java.math.BigInteger;
+
+import org.eclipse.cdt.debug.core.cdi.CDIException;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIMixedInstruction;
+import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
+import org.eclipse.cdt.debug.core.model.ICDebugTarget;
+import org.eclipse.cdt.debug.core.model.ICStackFrame;
+import org.eclipse.cdt.debug.core.model.IDisassemblyBlock;
+import org.eclipse.cdt.debug.internal.core.model.DisassemblyBlock;
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IStackFrame;
+import org.eclipse.swt.widgets.Display;
+
+
+/**
+ */
+public class CDIDisassemblyRetrieval implements IDisassemblyRetrieval {
+
+ private ICDebugTarget fDebugTarget;
+
+ /**
+ * Constructor
+ */
+ public CDIDisassemblyRetrieval(ICDebugTarget debugTarget) {
+ fDebugTarget= debugTarget;
+ }
+
+ /*
+ * @see org.eclipse.cdt.debug.ui.infinitedisassembly.views.IDisassemblyRetrieval#asyncGetDisassembly(java.math.BigInteger, java.math.BigInteger, java.lang.String, int, org.eclipse.cdt.debug.ui.infinitedisassembly.views.IDisassemblyRetrieval.DisassemblyRequest)
+ */
+ public void asyncGetDisassembly(final BigInteger startAddress, final BigInteger endAddress, final String file, final int lineNumber, final int lines, final DisassemblyRequest disassemblyRequest) {
+ Runnable op= new Runnable() {
+ public void run() {
+ ICDITarget cdiTarget= (ICDITarget) fDebugTarget.getAdapter(ICDITarget.class);
+ try {
+ ICDIMixedInstruction[] mixedInstructions= null;
+ ICDIInstruction[] asmInstructions= null;
+ if (file != null) {
+ mixedInstructions= cdiTarget.getMixedInstructions(file, lineNumber, lines);
+ }
+ else if (startAddress != null) {
+ mixedInstructions= cdiTarget.getMixedInstructions(startAddress, endAddress);
+ if (mixedInstructions.length == 0) {
+ mixedInstructions= null;
+ asmInstructions= cdiTarget.getInstructions(startAddress, endAddress);
+ } else if (mixedInstructions.length == 1 && mixedInstructions[0].getInstructions().length == 0) {
+ mixedInstructions= null;
+ asmInstructions= cdiTarget.getInstructions(startAddress, endAddress);
+ }
+ }
+ if (mixedInstructions != null) {
+ IDisassemblyBlock block= DisassemblyBlock.create(fDebugTarget.getDisassembly(), mixedInstructions);
+ disassemblyRequest.setDisassemblyBlock(block);
+ } else if (asmInstructions != null) {
+ IDisassemblyBlock block= DisassemblyBlock.create(fDebugTarget.getDisassembly(), asmInstructions);
+ disassemblyRequest.setDisassemblyBlock(block);
+ }
+ } catch (CDIException exc) {
+ disassemblyRequest.setStatus(new Status(IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), exc.getDetailMessage(), exc));
+ } catch (DebugException exc) {
+ disassemblyRequest.setStatus(new Status(IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(), exc.getMessage(), exc));
+ } finally {
+ disassemblyRequest.done();
+ }
+
+ }
+ };
+ Display.getDefault().asyncExec(op);
+ }
+
+ /*
+ * @see org.eclipse.cdt.debug.ui.infinitedisassembly.views.IDisassemblyRetrieval#asyncGetFrameAddress(org.eclipse.debug.core.model.IStackFrame, org.eclipse.cdt.debug.ui.infinitedisassembly.views.IDisassemblyRetrieval.AddressRequest)
+ */
+ public void asyncGetFrameAddress(final IStackFrame stackFrame, final AddressRequest addressRequest) {
+ Runnable op= new Runnable() {
+ public void run() {
+ if (stackFrame instanceof ICStackFrame) {
+ addressRequest.setAddress(((ICStackFrame)stackFrame).getAddress().getValue());
+ } else {
+ addressRequest.cancel();
+ }
+ addressRequest.done();
+ }
+ };
+ Display.getDefault().asyncExec(op);
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyBackendCdi.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyBackendCdi.java
new file mode 100644
index 0000000000..41aab067ed
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyBackendCdi.java
@@ -0,0 +1,555 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ * Freescale Semiconductor - refactoring
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
+
+import java.math.BigInteger;
+
+import org.eclipse.cdt.debug.core.cdi.CDIException;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
+import org.eclipse.cdt.debug.core.model.IAsmInstruction;
+import org.eclipse.cdt.debug.core.model.IAsmSourceLine;
+import org.eclipse.cdt.debug.core.model.ICDebugElement;
+import org.eclipse.cdt.debug.core.model.ICDebugTarget;
+import org.eclipse.cdt.debug.core.model.ICStackFrame;
+import org.eclipse.cdt.debug.core.model.ICThread;
+import org.eclipse.cdt.debug.core.model.ICType;
+import org.eclipse.cdt.debug.core.model.ICValue;
+import org.eclipse.cdt.debug.core.model.IDisassemblyBlock;
+import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
+import org.eclipse.cdt.debug.internal.core.model.CExpression;
+import org.eclipse.cdt.debug.internal.core.model.CStackFrame;
+import org.eclipse.cdt.debug.internal.ui.CDebugUIMessages;
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IDebugEventSetListener;
+import org.eclipse.debug.core.model.ISourceLocator;
+import org.eclipse.debug.core.model.IStackFrame;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
+import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Position;
+
+import com.ibm.icu.text.MessageFormat;
+
+/**
+ * The CDI backend to the DSF disassembly view.
+ *
+ */
+public class DisassemblyBackendCdi implements IDisassemblyBackend, IDebugEventSetListener {
+
+ private IDisassemblyPartCallback fCallback;
+ private ICThread fTargetContext;
+ private String fCdiSessionId;
+ private ICStackFrame fTargetFrameContext;
+ private CDIDisassemblyRetrieval fDisassemblyRetrieval;
+
+ public DisassemblyBackendCdi() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#init(org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback)
+ */
+ public void init(IDisassemblyPartCallback callback) {
+ assert callback != null;
+ fCallback = callback;
+ DebugPlugin.getDefault().addDebugEventListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#hasDebugContext()
+ */
+ public boolean hasDebugContext() {
+ return fTargetContext != null;
+ }
+
+ /**
+ * Unlike DSF, CDI sessions don't have an ID. But to appease the DSF
+ * Disassembly view, we fabricate one.
+ *
+ * @param debugElement
+ * the debug element which represents the process being debugged
+ * @return the session ID
+ */
+ private String getSessionId(ICDebugElement debugElement) {
+ return "cdi-" + System.identityHashCode(debugElement.getDebugTarget()); //$NON-NLS-1$
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#setDebugContext(org.eclipse.core.runtime.IAdaptable)
+ */
+ public SetDebugContextResult setDebugContext(IAdaptable context) {
+ assert supportsDebugContext(context) : "caller should not have invoked us"; //$NON-NLS-1$
+
+ SetDebugContextResult result = new SetDebugContextResult();
+ result.sessionId = fCdiSessionId; // initial value; may change
+
+ ICDebugTarget cdiDebugTarget = (ICDebugTarget)((ICDebugElement)context).getDebugTarget();
+ String cdiSessionId = getSessionId(cdiDebugTarget);
+
+ fDisassemblyRetrieval = new CDIDisassemblyRetrieval(cdiDebugTarget);
+
+ if (!cdiSessionId.equals(fCdiSessionId)) {
+ fTargetContext = null;
+
+ if (context instanceof ICStackFrame) {
+ fTargetFrameContext = (ICStackFrame)context;
+ fTargetContext = (ICThread)fTargetFrameContext.getThread();
+ try {
+ // CDI frame levels are ordered opposite of DSF. Frame 0 is the
+ // root frame of the thread where in DSF it's the topmost frame
+ // (where the PC is). Do a little math to flip reverse the value
+ result.frameLevel = ((CStackFrame)((fTargetContext.getTopStackFrame()))).getLevel() - fTargetFrameContext.getLevel();
+ } catch (DebugException e) {
+ }
+ }
+
+ if (fTargetContext != null) {
+ result.sessionId = fCdiSessionId = cdiSessionId;
+ result.contextChanged = true;
+ }
+ }
+ else if (context instanceof ICStackFrame) {
+ if (context instanceof ICStackFrame) {
+ fTargetFrameContext = (ICStackFrame)context;
+ fTargetContext = (ICThread)fTargetFrameContext.getThread();
+ try {
+ // CDI frame levels are ordered opposite of DSF. Frame 0 is the
+ // root frame of the thread where in DSF it's the topmost frame
+ // (where the PC is). Do a little math to flip reverse the value
+ result.frameLevel = ((CStackFrame)((fTargetContext.getTopStackFrame()))).getLevel() - fTargetFrameContext.getLevel();
+ } catch (DebugException e) {
+ }
+ fCallback.gotoFrame(result.frameLevel);
+ }
+ }
+
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#supportsDebugContext(org.eclipse.core.runtime.IAdaptable)
+ */
+ public boolean supportsDebugContext(IAdaptable context) {
+ return supportsDebugContext_(context);
+ }
+
+ /**
+ * @param context
+ * @return
+ */
+ public static boolean supportsDebugContext_(IAdaptable context) {
+ return (context != null) && (context.getAdapter(ICDebugElement.class) != null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#clearDebugContext()
+ */
+ public void clearDebugContext() {
+ fTargetContext= null;
+ fCdiSessionId = null;
+ fTargetFrameContext = null;
+ fDisassemblyRetrieval = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#retrieveFrameAddress(int)
+ */
+ public void retrieveFrameAddress(final int targetFrame) {
+ try {
+ IStackFrame stackFrame= fTargetContext.getStackFrames()[targetFrame];
+ fDisassemblyRetrieval.asyncGetFrameAddress(stackFrame, new IDisassemblyRetrieval.AddressRequest() {
+ @Override
+ public void done() {
+ fCallback.setUpdatePending(false);
+ if (!isCanceled()) {
+ BigInteger address= getAddress();
+ if (targetFrame == 0) {
+ fCallback.updatePC(address);
+ } else {
+ fCallback.gotoFrame(targetFrame, address);
+ }
+ }
+ }
+ });
+
+ } catch (DebugException exc) {
+ DisassemblyUtils.internalError(exc);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#getFrameLevel()
+ */
+ public int getFrameLevel() {
+ return fTargetFrameContext.getLevel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#isSuspended()
+ */
+ public boolean isSuspended() {
+ return fTargetContext != null && fTargetContext.isSuspended();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#getFrameFile()
+ */
+ public String getFrameFile() {
+ return fTargetFrameContext != null ? fTargetFrameContext.getFile() : null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#getFrameLine()
+ */
+ public int getFrameLine() {
+ return fTargetFrameContext.getFrameLineNumber();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyBackend#retrieveDisassembly(java.math.BigInteger, java.math.BigInteger, java.lang.String, boolean, boolean, boolean, int, int, int)
+ */
+ public void retrieveDisassembly(final BigInteger startAddress,
+ BigInteger endAddress, String file, int lineNumber, int lines, final boolean mixed,
+ final boolean showSymbols, final boolean showDisassembly, int linesHint) {
+
+ if (fTargetContext == null || fTargetContext.isTerminated()) {
+ return;
+ }
+ final BigInteger addressLength= BigInteger.valueOf(lines * 4);
+ if (endAddress.subtract(startAddress).compareTo(addressLength) > 0) {
+ endAddress= startAddress.add(addressLength);
+ }
+ final BigInteger finalEndAddress= endAddress;
+ final IDisassemblyRetrieval.DisassemblyRequest disassemblyRequest= new IDisassemblyRetrieval.DisassemblyRequest() {
+ @Override
+ public void done() {
+ if (!isCanceled() && getDisassemblyBlock() != null) {
+ insertDisassembly(startAddress, getDisassemblyBlock(), mixed, showSymbols, showDisassembly);
+ } else {
+ final IStatus status= getStatus();
+ if (status != null && !status.isOK()) {
+ if (startAddress != null) {
+ fCallback.doScrollLocked(new Runnable() {
+ public void run() {
+ fCallback.insertError(startAddress, status.getMessage());
+ }
+ });
+ }
+ }
+ fCallback.setUpdatePending(false);
+ }
+ }
+ };
+ fDisassemblyRetrieval.asyncGetDisassembly(startAddress, finalEndAddress, file, lineNumber, lines, disassemblyRequest);
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#insertSource(org.eclipse.jface.text.Position, java.math.BigInteger, java.lang.String, int)
+ */
+ public Object insertSource(Position pos, BigInteger address,
+ String file, int lineNumber) {
+ ISourceLocator locator = fTargetContext.getLaunch().getSourceLocator();
+ if (locator instanceof ISourceLookupDirector) {
+ return ((ISourceLookupDirector)locator).getSourceElement(file);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#hasFrameContext()
+ */
+ public boolean hasFrameContext() {
+ return fTargetFrameContext != null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyBackend#gotoSymbol(java.lang.String)
+ */
+ public void gotoSymbol(String symbol) {
+ if (fTargetFrameContext != null) {
+ try {
+ // This logic was lifted from CMemoryBlockRetrievalExtension.getExtendedMemoryBlock(String, Object)
+ CStackFrame cstackFrame = (CStackFrame)fTargetFrameContext;
+ ICDIExpression cdiExpression = cstackFrame.getCDITarget().createExpression(symbol);
+ CExpression cdtExpression = new CExpression(cstackFrame, cdiExpression, null);
+ IValue value = cdtExpression.getValue();
+ if (value instanceof ICValue) {
+ ICType type = ((ICValue)value).getType();
+ if (type != null) {
+ // get the address for the expression, allow all types
+ String rawExpr = cdtExpression.getExpressionString();
+ String voidExpr = "(void *)(" + rawExpr + ')'; //$NON-NLS-1$
+ String attempts[] = { rawExpr, voidExpr };
+ for (int i = 0; i < attempts.length; i++) {
+ String expr = attempts[i];
+ String addressStr = cstackFrame.evaluateExpressionToString(expr);
+ if (addressStr != null) {
+ try {
+ final BigInteger address = (addressStr.startsWith("0x")) ? new BigInteger(addressStr.substring(2), 16) : new BigInteger(addressStr); //$NON-NLS-1$
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ fCallback.gotoAddress(address);
+ }});
+
+ } catch (NumberFormatException e) {
+ if (i >= attempts.length) {
+ throw new DebugException(new Status(IStatus.ERROR, CDebugUIPlugin.PLUGIN_ID,
+ MessageFormat.format(CDebugUIMessages.getString("DisassemblyBackendCdi_Symbol_Evaluation_Unusable"), new String[]{symbol}))); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+ }
+ else {
+ throw new DebugException(new Status(IStatus.ERROR, CDebugUIPlugin.PLUGIN_ID,
+ MessageFormat.format(CDebugUIMessages.getString("DisassemblyBackendCdi_Symbol_Didnt_Evaluate"), new String[]{symbol}))); //$NON-NLS-1$
+ }
+ }
+ catch (final CDIException exc) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(fCallback.getSite().getShell(),
+ CDebugUIMessages.getString("DisassemblyBackendCdi_Error_Dlg_Title"), //$NON-NLS-1$
+ null, new Status(IStatus.ERROR, CDebugUIPlugin.PLUGIN_ID, exc.getLocalizedMessage()));
+ }});
+ }
+ catch (final DebugException exc) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(fCallback.getSite().getShell(),
+ CDebugUIMessages.getString("DisassemblyBackendCdi_Error_Dlg_Title"), //$NON-NLS-1$
+ null, exc.getStatus());
+ }});
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyBackend#retrieveDisassembly(java.lang.String, int, java.math.BigInteger, boolean, boolean, boolean)
+ */
+ public void retrieveDisassembly(String file, int lines,
+ BigInteger endAddress, final boolean mixed, final boolean showSymbols,
+ final boolean showDisassembly) {
+ final IDisassemblyRetrieval.DisassemblyRequest disassemblyRequest= new IDisassemblyRetrieval.DisassemblyRequest() {
+ @Override
+ public void done() {
+ if (!isCanceled() && getDisassemblyBlock() != null) {
+ insertDisassembly(null, getDisassemblyBlock(), mixed, showSymbols, showDisassembly);
+ } else {
+ final IStatus status= getStatus();
+ if (status != null && !status.isOK()) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(fCallback.getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$
+ }
+ });
+ }
+ fCallback.setUpdatePending(false);
+ }
+ }
+ };
+
+ assert !fCallback.getUpdatePending();
+ fCallback.setUpdatePending(true);
+ fDisassemblyRetrieval.asyncGetDisassembly(null, endAddress, file, 1, lines, disassemblyRequest);
+ }
+
+ private void insertDisassembly(BigInteger startAddress, IDisassemblyBlock disassemblyBlock, boolean mixed, boolean showSymbols, boolean showDisassembly) {
+ if (!fCallback.hasViewer() || fCdiSessionId == null) {
+ return;
+ }
+
+ if (!fCallback.getUpdatePending()) {
+ assert false;
+ return;
+ }
+ try {
+ fCallback.lockScroller();
+
+ final IDisassemblyDocument document = fCallback.getDocument(); // for convenience
+ IAsmSourceLine[] srcLines= disassemblyBlock.getSourceLines();
+ AddressRangePosition p = null;
+ Object srcElement= disassemblyBlock.getSourceElement();
+ for (int i = 0; i < srcLines.length; i++) {
+ IAsmSourceLine srcLine= srcLines[i];
+
+ // If the caller doesn't want mixed, set line number to -1 so we
+ // create a pure disassembly position object
+ int lineNumber= mixed ? srcLine.getLineNumber() - 1 : -1;
+
+ IAsmInstruction[] instructions= srcLine.getInstructions();
+ for (int j = 0; j < instructions.length; j++) {
+ IAsmInstruction instruction = instructions[j];
+ BigInteger address= instruction.getAdress().getValue();
+ if (startAddress == null || startAddress.compareTo(BigInteger.ZERO) < 0) {
+ startAddress = address;
+ fCallback.setGotoAddressPending(address);
+ }
+ if (p == null || !p.containsAddress(address)) {
+ p = fCallback.getPositionOfAddress(address);
+ }
+ if (p instanceof ErrorPosition && p.fValid) {
+ p.fValid = false;
+ document.addInvalidAddressRange(p);
+ } else if (p == null) {
+ return;
+ } else if (p.fValid) {
+ if (srcElement != null && lineNumber >= 0 || p.fAddressLength == BigInteger.ONE) {
+ // override probably unaligned disassembly
+ p.fValid = false;
+ document.addInvalidAddressRange(p);
+ } else {
+ return;
+ }
+ }
+ boolean hasSource= false;
+ String compilationPath= null;
+ if (srcElement != null && lineNumber >= 0) {
+ if (srcElement instanceof LocalFileStorage) {
+ compilationPath = ((LocalFileStorage)srcElement).getFullPath().toString();
+ }
+ else if (srcElement instanceof IFile) {
+ compilationPath = ((IFile)srcElement).getLocation().toString();
+ }
+ else {
+ assert false : "missing support for source element of type " + srcElement.getClass().toString(); //$NON-NLS-1$
+ }
+ if (compilationPath != null) {
+ p = fCallback.insertSource(p, address, compilationPath, lineNumber);
+ hasSource = fCallback.getStorageForFile(compilationPath) != null;
+ }
+ else {
+ hasSource = false;
+ }
+ }
+ // insert symbol label
+ final String functionName= instruction.getFunctionName();
+ if (functionName != null && functionName.length() > 0 && instruction.getOffset() == 0) {
+ p = document.insertLabel(p, address, functionName, showSymbols && (!hasSource || showDisassembly));
+ }
+ // determine instruction byte length
+ BigInteger instrLength= null;
+ if (j < instructions.length - 1) {
+ instrLength= instructions[j+1].getAdress().distanceTo(instruction.getAdress()).abs();
+ } else if (i < srcLines.length - 1) {
+ int nextSrcLineIdx= i+1;
+ while (nextSrcLineIdx < srcLines.length) {
+ IAsmInstruction[] nextInstrs= srcLines[nextSrcLineIdx].getInstructions();
+ if (nextInstrs.length > 0) {
+ instrLength= nextInstrs[0].getAdress().distanceTo(instruction.getAdress()).abs();
+ break;
+ }
+ ++nextSrcLineIdx;
+ }
+ if (nextSrcLineIdx >= srcLines.length) {
+ break;
+ }
+ } else {
+ if (instructions.length == 1 && srcLines.length == 1) {
+ instrLength= p.fAddressLength;
+ }
+ }
+ if (instrLength == null) {
+ // cannot determine length of last instruction
+ break;
+ }
+ final String opCode;
+ // insert function name+offset instead of opcode bytes
+ if (functionName != null && functionName.length() > 0) {
+ opCode= functionName + '+' + instruction.getOffset();
+ } else {
+ opCode= ""; //$NON-NLS-1$
+ }
+ if (!showDisassembly && hasSource) {
+ p = document.insertDisassemblyLine(p, address, instrLength.intValue(), opCode, "", compilationPath, lineNumber); //$NON-NLS-1$
+ } else {
+ p = document.insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstructionText(), compilationPath, lineNumber); //$NON-NLS-1
+ }
+ if (p == null) {
+ break;
+ }
+ }
+ }
+
+
+ } catch (BadLocationException e) {
+ // should not happen
+ DisassemblyUtils.internalError(e);
+ } finally {
+ fCallback.setUpdatePending(false);
+ fCallback.updateInvalidSource();
+ fCallback.unlockScroller();
+ fCallback.doPending();
+ fCallback.updateVisibleArea();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
+ */
+ public void handleDebugEvents(DebugEvent[] events) {
+ for (DebugEvent event : events) {
+ if (event.getKind() == DebugEvent.TERMINATE) {
+ Object eventSource = event.getSource();
+ if ((eventSource instanceof CDebugTarget) && (getSessionId((CDebugTarget)eventSource).equals(fCdiSessionId))) {
+ fCallback.handleTargetEnded();
+ return;
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#dispose()
+ */
+ public void dispose() {
+ DebugPlugin.getDefault().removeDebugEventListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#evaluateExpression(java.lang.String)
+ */
+ public String evaluateExpression(String expression) {
+ // This is called to service text hovering. We either resolve the
+ // expression or we don't. No error reporting needed.
+ if (fTargetFrameContext != null) {
+ try {
+ // This logic was lifted from CMemoryBlockRetrievalExtension.getExtendedMemoryBlock(String, Object)
+ CStackFrame cstackFrame = (CStackFrame)fTargetFrameContext;
+ ICDIExpression cdiExpression = cstackFrame.getCDITarget().createExpression(expression);
+ CExpression cdtExpression = new CExpression(cstackFrame, cdiExpression, null);
+ IValue value = cdtExpression.getValue();
+ if (value instanceof ICValue) {
+ ICType type = ((ICValue)value).getType();
+ if (type != null) {
+ return cstackFrame.evaluateExpressionToString(cdtExpression.getExpressionString());
+ }
+ }
+ }
+ catch (Exception exc) {
+
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyBackendCdiFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyBackendCdiFactory.java
new file mode 100644
index 0000000000..96d67f6f82
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyBackendCdiFactory.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Freescale Semiconductor, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Freescale Semiconductor - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IAdapterFactory;
+
+public class DisassemblyBackendCdiFactory implements IAdapterFactory {
+
+ private static final Class<?>[] ADAPTERS = { IDisassemblyBackend.class };
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
+ */
+ @SuppressWarnings("rawtypes")
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if (IDisassemblyBackend.class.equals(adapterType)) {
+ if (adaptableObject instanceof IAdaptable && DisassemblyBackendCdi.supportsDebugContext_((IAdaptable)adaptableObject)) {
+ return new DisassemblyBackendCdi();
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
+ */
+ @SuppressWarnings("rawtypes")
+ public Class[] getAdapterList() {
+ return ADAPTERS;
+ }
+}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyPosition.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyPosition.java
index d07f699353..b1d3f72817 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyPosition.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyPosition.java
@@ -8,7 +8,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model;
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
import java.math.BigInteger;
@@ -45,5 +45,12 @@ public class DisassemblyPosition extends AddressRangePosition {
public int getLine() {
return -1;
}
-
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition#toString()
+ */
+ @Override
+ public String toString() {
+ return super.toString() + "->[" + new String(fFunction) + ']'; //$NON-NLS-1$
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyUtils.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyUtils.java
new file mode 100644
index 0000000000..de51911dd2
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/DisassemblyUtils.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ * Freescale Semiconductor - refactoring
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
+
+import java.math.BigInteger;
+
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * Some general utilities used by the DSF Disassembly view and its backends
+ */
+public class DisassemblyUtils {
+
+ /**
+ * Trace option. The view started out and continues to be in DSF but
+ * backends can be non-DSF.
+ */
+ public final static boolean DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.cdt.dsf.ui/debug/disassembly")); //$NON-NLS-1$//$NON-NLS-2$
+
+ public static String getAddressText(BigInteger address) {
+ if (address == null) {
+ return "<null>"; //$NON-NLS-1$
+ }
+ if (address.compareTo(BigInteger.ZERO) < 0) {
+ return address.toString();
+ }
+ String hex = address.toString(16);
+ return "0x" + "0000000000000000".substring(hex.length() + (address.bitLength() <= 32 ? 8 : 0)) + hex; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public static void internalError(Throwable e) {
+ if (DEBUG) {
+ System.err.println("Disassembly: Internal error"); //$NON-NLS-1$
+ CDebugUIPlugin.log(e);
+ }
+ }
+ public static BigInteger decodeAddress(String string) {
+ if (string.startsWith("0x")) { //$NON-NLS-1$
+ return new BigInteger(string.substring(2), 16);
+ }
+ return new BigInteger(string);
+ }
+}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/ErrorPosition.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/ErrorPosition.java
index 3e47f0783c..1395412383 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/ErrorPosition.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/ErrorPosition.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 Wind River Systems and others.
+ * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model;
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
import java.math.BigInteger;
@@ -37,4 +37,12 @@ public class ErrorPosition extends AddressRangePosition {
public int hashCode() {
return fHashCode;
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition#toString()
+ */
+ @Override
+ public String toString() {
+ return super.toString() + "->[" + fHashCode + ']'; //$NON-NLS-1$
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyBackend.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyBackend.java
new file mode 100644
index 0000000000..ca8bcc61b3
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyBackend.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ * Freescale Semiconductor - refactoring
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
+
+import java.math.BigInteger;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.text.Position;
+
+/**
+ * This is the main interface that connects the DSF Disassembly view to CDI and
+ * DSF backends. This interface is obtained through IAdaptable. A new instance
+ * is provided every time the adapter is requested. The caller must invoke
+ * {@link #dispose()} when it has no further use for the instance.
+ */
+public interface IDisassemblyBackend {
+
+ /**
+ * Used to return muliple results from
+ * {@link IDisassemblyBackend#setDebugContext(IAdaptable)}
+ */
+ public class SetDebugContextResult {
+ /**
+ * The ID of the session associated with the context
+ */
+ public String sessionId;
+
+ /**
+ * The frame represented by the context. 0 is the topmost frame (where
+ * the PC is)
+ */
+ public int frameLevel;
+
+ /**
+ * Whether the context changed to another execution context (the parent
+ * elements of a thread, typically a process)
+ */
+ public boolean contextChanged;
+ }
+
+ /**
+ * Called after instantiation
+ * @param callback
+ */
+ void init(IDisassemblyPartCallback callback);
+
+ /**
+ * Indicates whether this backend support the provided debug context,
+ *
+ * @param context
+ * the debug context
+ * @return true if it is supported. Caller should invoke
+ * {@link #setDebugContext(IAdaptable)} with [context] only after
+ * first checking with this method
+ */
+ boolean supportsDebugContext(IAdaptable context);
+
+ /**
+ * @return whether the backend has a debug context
+ */
+ boolean hasDebugContext();
+
+ /**
+ * Called by the view when there has been a change to the active debug
+ * context. Should be called only if
+ * {@link #supportsDebugContext(IAdaptable)} first returns true.
+ *
+ * @param context
+ * the active debug context; must not be null
+ * @return information about the new context
+ */
+ SetDebugContextResult setDebugContext(IAdaptable context);
+
+ /**
+ * Clear any knowledge of the current debug context.
+ */
+ void clearDebugContext();
+
+ /**
+ * The implementation should end up calling DisassemblyPart.gotoFrame() if
+ * targetFrame > 0, or DisassemblyPart.gotoPC() otherwise.
+ *
+ * @param targetFrame
+ * the frame level to retrieve. Level 0 is the topmost frame
+ * (where the PC is)
+ */
+ void retrieveFrameAddress(int targetFrame);
+
+ /**
+ * Get the frame of the current context
+ *
+ * @return the frame's level; 0 is the topmost frame (i.e., where the PC
+ * is). -1 if no frame context has been set.
+ */
+ int getFrameLevel();
+
+ /**
+ * Indicates whether the current context is suspended.
+ */
+ boolean isSuspended();
+
+ /**
+ * Indicates whether the current context is a frame.
+ */
+ boolean hasFrameContext();
+
+ /**
+ * Returns the file associated with the current frame context, or null if
+ * the current context is not a frame or if the frame has no file
+ * association.
+ */
+ String getFrameFile();
+
+ /**
+ * Returns the line number associated with the current frame context, or -1
+ * if current context is not a frame or if the frame has no file and line
+ * association.
+ */
+ int getFrameLine();
+
+ /**
+ * Retrieves disassembly based on either (a) start and end address range, or
+ * (b) file, line number, and line count. If the caller specifies both sets
+ * of information, the implementation should honor (b) and ignore (a).
+ *
+ * @param startAddress
+ * @param endAddress
+ * @param file
+ * @param lineNumber
+ * @param lines
+ * @param mixed
+ * @param showSymbols
+ * @param showDisassembly
+ * @param linesHint
+ */
+ void retrieveDisassembly(BigInteger startAddress, BigInteger endAddress, String file, int lineNumber, int lines, boolean mixed, boolean showSymbols, boolean showDisassembly, int linesHint);
+
+ Object insertSource(Position pos, BigInteger address, final String file, int lineNumber);
+
+ void gotoSymbol(String symbol);
+
+ /**
+ * Retrieves disassembly of the code generated by a source file, starting at
+ * the first line. Caller specifies the maximum number of disassembly lines
+ * that should result and a maximum address.
+ *
+ * @param file
+ * @param lines
+ * @param endAddress
+ * @param mixed
+ * @param showSymbols
+ * @param showDisassembly
+ */
+ void retrieveDisassembly(String file, int lines, BigInteger endAddress, boolean mixed, boolean showSymbols, boolean showDisassembly);
+
+ /**
+ * Evaluate an expression for text hover
+ *
+ * @param expression
+ * the expression to be evaluated
+ * @return the result, or "" if it doesn't resolve, for whatever reason
+ */
+ String evaluateExpression(String expression);
+
+ /**
+ * Called when the Disassembly view has no further use for this backend.
+ */
+ void dispose();
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyDocument.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyDocument.java
new file mode 100644
index 0000000000..f954594b7a
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyDocument.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ * Freescale Semiconductor - refactoring
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
+
+import java.math.BigInteger;
+
+import org.eclipse.jface.text.BadLocationException;
+
+/**
+ * DSF Disassembly view backends (CDI and DSF) need this limited access to the
+ * editor/view Document.
+ */
+public interface IDisassemblyDocument {
+
+ void addInvalidAddressRange(AddressRangePosition p);
+
+ AddressRangePosition insertLabel(AddressRangePosition pos,
+ BigInteger address, String label, boolean showLabels)
+ throws BadLocationException;
+
+ AddressRangePosition insertDisassemblyLine(AddressRangePosition p,
+ BigInteger address, int intValue, String opCode, String string,
+ String compilationPath, int lineNumber) throws BadLocationException;
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyPartCallback.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyPartCallback.java
new file mode 100644
index 0000000000..1c8e908a0f
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyPartCallback.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ * Freescale Semiconductor - refactoring
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
+
+import java.math.BigInteger;
+
+import org.eclipse.ui.IWorkbenchPartSite;
+
+/**
+ * Implementations of {@link IDisassemblyBackend} are given this access back
+ * into the part (editor/view) that created them. Except where noted, methods
+ * must be invoked on the GUI thread. A disassembly backend has to call back
+ * into the editor/view to carry out its duties.
+ *
+ * <p>
+ * This interface was born of the refactoring which allowed the DSF Disassembly
+ * view to work with both DSF and CDI. Before that, the functionality of
+ * IDisasssemblyBackend was built into DisassemblyPart and thus there was no
+ * need for this interface. This interface merely exposes model (DSF/CDI)
+ * agnostic access to DisassemblyPart. It exposes methods that have been in
+ * DisassemblyPart all along. Documentation for those methods were sparse, and
+ * thus this interface is likewise. See the DisassemblyPart for any available
+ * documentation.
+ */
+public interface IDisassemblyPartCallback {
+ void gotoFrame(int frame);
+ void gotoFrameIfActive(int frame);
+ void updateVisibleArea();
+ void updateInvalidSource();
+ void retrieveDisassembly(final BigInteger startAddress, BigInteger endAddress, final int linesHint, boolean mixed, boolean ignoreFile);
+ void insertError(BigInteger address, String message);
+ int getAddressSize();
+ void addressSizeChanged(int addressSize);
+ AddressRangePosition getPositionOfAddress(BigInteger address);
+ void gotoFrame(int frame, BigInteger address);
+ void updatePC(BigInteger pc);
+ void doPending();
+ void doScrollLocked(final Runnable doit);
+ void lockScroller();
+ void unlockScroller();
+ void insertSource(AddressRangePosition pos);
+ AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int lineNumber);
+ void setUpdatePending(boolean pending);
+ boolean getUpdatePending();
+ void setGotoAddressPending(BigInteger address);
+ BigInteger getGotoAddressPending();
+ IDisassemblyDocument getDocument();
+ Object getStorageForFile(String file);
+ void gotoAddress(BigInteger address);
+ IWorkbenchPartSite getSite();
+ boolean hasViewer();
+
+ /** Thread-safe */
+ void handleTargetSuspended();
+
+ /** Thread-safe */
+ void handleTargetResumed();
+
+ /** Thread-safe */
+ void handleTargetEnded();
+
+ /** Thread-safe */
+ void asyncExec(Runnable runnable);
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyRetrieval.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyRetrieval.java
new file mode 100644
index 0000000000..82eaa04689
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/IDisassemblyRetrieval.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Anton Leherbauer (Wind River Systems) - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
+
+import java.math.BigInteger;
+
+import org.eclipse.cdt.debug.core.model.IDisassemblyBlock;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.IRequest;
+import org.eclipse.debug.core.model.IStackFrame;
+
+/**
+ */
+public interface IDisassemblyRetrieval {
+ /**
+ */
+ public static class Request implements IRequest {
+ private IStatus fStatus;
+ private boolean fCanceled;
+ /*
+ * @see org.eclipse.debug.core.IRequest#cancel()
+ */
+ public void cancel() {
+ fCanceled= true;
+ }
+
+ /*
+ * @see org.eclipse.debug.core.IRequest#done()
+ */
+ public void done() {
+ }
+
+ /*
+ * @see org.eclipse.debug.core.IRequest#getStatus()
+ */
+ public IStatus getStatus() {
+ return fStatus;
+ }
+
+ /*
+ * @see org.eclipse.debug.core.IRequest#isCanceled()
+ */
+ public boolean isCanceled() {
+ return fCanceled;
+ }
+
+ /*
+ * @see org.eclipse.debug.core.IRequest#setStatus(org.eclipse.core.runtime.IStatus)
+ */
+ public void setStatus(IStatus status) {
+ fStatus= status;
+ }
+
+ }
+
+ /**
+ */
+ public static class AddressRequest extends Request {
+ private BigInteger fAddress;
+ /**
+ * @return the address
+ */
+ public BigInteger getAddress() {
+ return fAddress;
+ }
+
+ /**
+ * @param address the address to set
+ */
+ public void setAddress(BigInteger address) {
+ fAddress= address;
+ }
+ }
+
+ public static class DisassemblyRequest extends Request {
+ IDisassemblyBlock fDisassemblyBlock;
+
+ /**
+ * @return the disassemblyBlock
+ */
+ public IDisassemblyBlock getDisassemblyBlock() {
+ return fDisassemblyBlock;
+ }
+
+ /**
+ * @param disassemblyBlock the disassemblyBlock to set
+ */
+ public void setDisassemblyBlock(IDisassemblyBlock disassemblyBlock) {
+ fDisassemblyBlock= disassemblyBlock;
+ }
+ }
+
+ /**
+ * @param stackFrame
+ * @param addressRequest
+ */
+ void asyncGetFrameAddress(IStackFrame stackFrame, AddressRequest addressRequest);
+
+ /**
+ * @param startAddress
+ * @param endAddress
+ * @param file
+ * @param lines
+ * @param disassemblyRequest
+ */
+ void asyncGetDisassembly(BigInteger startAddress, BigInteger endAddress, String file, int fileNumber, int lines,
+ DisassemblyRequest disassemblyRequest);
+
+}
+
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/LabelPosition.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/LabelPosition.java
index 5dbaea989c..451acb3bf2 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/LabelPosition.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/dsf/LabelPosition.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 Wind River Systems and others.
+ * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model;
+package org.eclipse.cdt.debug.internal.ui.disassembly.dsf;
import java.math.BigInteger;
@@ -28,5 +28,12 @@ public class LabelPosition extends AddressRangePosition {
super(offset, length, addressOffset, BigInteger.ZERO);
fLabel = label;
}
-
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition#toString()
+ */
+ @Override
+ public String toString() {
+ return super.toString() + "->[" + fLabel + ']'; //$NON-NLS-1$
+ }
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
index 368e9fdc79..05803dab60 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2009 QNX Software Systems and others.
+ * Copyright (c) 2004, 2010 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -16,6 +16,7 @@ import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
+import org.eclipse.cdt.debug.core.model.ICDebugElement;
import org.eclipse.cdt.debug.internal.ui.CBreakpointUpdater;
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
import org.eclipse.cdt.debug.internal.ui.CDebugModelPresentation;
@@ -23,6 +24,7 @@ import org.eclipse.cdt.debug.internal.ui.CDebuggerPageAdapter;
import org.eclipse.cdt.debug.internal.ui.ColorManager;
import org.eclipse.cdt.debug.internal.ui.EvaluationContextManager;
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyBackendCdiFactory;
import org.eclipse.cdt.debug.internal.ui.disassembly.editor.DisassemblyEditorManager;
import org.eclipse.cdt.debug.ui.sourcelookup.DefaultSourceLocator;
import org.eclipse.cdt.debug.ui.sourcelookup.OldDefaultSourceLocator;
@@ -289,6 +291,9 @@ public class CDebugUIPlugin extends AbstractUIPlugin {
EvaluationContextManager.startup();
CDebugCorePlugin.getDefault().addCBreakpointListener( CBreakpointUpdater.getInstance() );
+ // Register the CDI backend for DSF's disassembly view
+ Platform.getAdapterManager().registerAdapters(new DisassemblyBackendCdiFactory(), ICDebugElement.class);
+
// We contribute actions to the platform's Variables view with a
// criteria to enable only when this plugin is loaded. This can lead to
// some edge cases with broken behavior (273306). The solution is to
diff --git a/dsf/org.eclipse.cdt.dsf.ui/.settings/.api_filters b/dsf/org.eclipse.cdt.dsf.ui/.settings/.api_filters
new file mode 100644
index 0000000000..9dd163b85d
--- /dev/null
+++ b/dsf/org.eclipse.cdt.dsf.ui/.settings/.api_filters
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component id="org.eclipse.cdt.dsf.ui" version="2">
+<resource path="src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java" type="org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyPart">
+<filter id="571473929">
+<message_arguments>
+<message_argument value="WorkbenchPart"/>
+<message_argument value="DisassemblyPart"/>
+</message_arguments>
+</filter>
+</resource>
+</component>
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/AddressRulerColumn.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/AddressRulerColumn.java
index 54a4c31bc8..d5cfa50889 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/AddressRulerColumn.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/AddressRulerColumn.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 Wind River Systems and others.
+ * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -12,10 +12,9 @@ package org.eclipse.cdt.dsf.debug.internal.ui.disassembly;
import java.math.BigInteger;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocument;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourceFileInfo;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourcePosition;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.text.source.IAnnotationModel;
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java
new file mode 100644
index 0000000000..691abe99f6
--- /dev/null
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java
@@ -0,0 +1,960 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ * Freescale Semiconductor - refactoring
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.debug.internal.ui.disassembly;
+
+import static org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils.DEBUG;
+import static org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils.internalError;
+
+import java.math.BigInteger;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.RejectedExecutionException;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.ErrorPosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback;
+import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
+import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
+import org.eclipse.cdt.dsf.concurrent.Query;
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.service.IDisassembly;
+import org.eclipse.cdt.dsf.debug.service.IExpressions;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
+import org.eclipse.cdt.dsf.debug.service.IInstruction;
+import org.eclipse.cdt.dsf.debug.service.IMixedInstruction;
+import org.eclipse.cdt.dsf.debug.service.IRunControl;
+import org.eclipse.cdt.dsf.debug.service.ISourceLookup;
+import org.eclipse.cdt.dsf.debug.service.IStack;
+import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext;
+import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
+import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IResumedDMEvent;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.ISuspendedDMEvent;
+import org.eclipse.cdt.dsf.debug.service.ISourceLookup.ISourceLookupDMContext;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
+import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
+import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
+import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
+import org.eclipse.cdt.dsf.service.DsfServicesTracker;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.cdt.dsf.service.DsfSession.SessionEndedListener;
+import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Position;
+
+public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedListener {
+
+ private volatile IExecutionDMContext fTargetContext;
+ private DsfServicesTracker fServicesTracker;
+ private IFrameDMContext fTargetFrameContext;
+ protected IFrameDMData fTargetFrameData;
+
+ private String fDsfSessionId;
+
+ private IDisassemblyPartCallback fCallback;
+
+ /**
+ * Constructor
+ */
+ public DisassemblyBackendDsf() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#init(org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback)
+ */
+ public void init(IDisassemblyPartCallback callback) {
+ assert callback != null;
+ fCallback = callback;
+ DsfSession.addSessionEndedListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#dispose()
+ */
+ public void dispose() {
+ DsfSession.removeSessionEndedListener(this);
+ }
+
+ public static boolean supportsDebugContext_(IAdaptable context) {
+ return context.getAdapter(IDMVMContext.class) != null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#supportsDebugContext(org.eclipse.core.runtime.IAdaptable)
+ */
+ public boolean supportsDebugContext(IAdaptable context) {
+ return supportsDebugContext_(context);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#hasDebugContext()
+ */
+ public boolean hasDebugContext() {
+ return fTargetContext != null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#setDebugContext(org.eclipse.core.runtime.IAdaptable)
+ */
+ public SetDebugContextResult setDebugContext(IAdaptable context) {
+ assert supportsDebugContext(context) : "caller should not have invoked us"; //$NON-NLS-1$
+ IDMVMContext vmContext = (IDMVMContext) context.getAdapter(IDMVMContext.class);
+ IDMContext dmContext = vmContext.getDMContext();
+
+ SetDebugContextResult result = new SetDebugContextResult();
+ result.sessionId = fDsfSessionId; // initial value; may change
+
+ String dsfSessionId = dmContext.getSessionId();
+
+
+ if (!dsfSessionId.equals(fDsfSessionId)) {
+ // switch to different session or initiate session
+ if (DEBUG) System.out.println("DisassemblyBackendDsf() " + dsfSessionId); //$NON-NLS-1$
+ fTargetContext= null;
+ if (dmContext instanceof IFrameDMContext) {
+ IFrameDMContext frame= (IFrameDMContext) dmContext;
+ IExecutionDMContext executionContext= DMContexts.getAncestorOfType(frame, IExecutionDMContext.class);
+ if (executionContext != null) {
+ fTargetContext= executionContext;
+ fTargetFrameContext= frame;
+ result.frameLevel = frame.getLevel();
+ }
+ }
+ if (fTargetContext != null) {
+
+ // remove ourselves as a listener with the previous session (context)
+ if (fDsfSessionId != null) {
+ final DsfSession prevSession = DsfSession.getSession(fDsfSessionId);
+ if (prevSession != null) {
+ try {
+ prevSession.getExecutor().execute(new DsfRunnable() {
+ public void run() {
+ prevSession.removeServiceEventListener(this);
+ }
+ });
+ } catch (RejectedExecutionException e) {
+ // Session is shut down.
+ }
+ }
+ }
+
+ result.sessionId = fDsfSessionId = dsfSessionId;
+ if (fServicesTracker != null) {
+ fServicesTracker.dispose();
+ }
+ fServicesTracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(), fDsfSessionId);
+ result.contextChanged = true;
+
+ // add ourselves as a listener with the new session (context)
+ final DsfSession newSession = DsfSession.getSession(dsfSessionId);
+ if (newSession != null) {
+ try {
+ newSession.getExecutor().execute(new DsfRunnable() {
+ public void run() {
+ newSession.removeServiceEventListener(this);
+ }
+ });
+ } catch (RejectedExecutionException e) {
+ // Session is shut down.
+ }
+ }
+ }
+ } else if (dmContext instanceof IFrameDMContext) {
+ // switch to different frame
+ IFrameDMContext frame= (IFrameDMContext) dmContext;
+ final IDMContext[] parents= frame.getParents();
+ for (IDMContext parent : parents) {
+ if (parent instanceof IExecutionDMContext) {
+ fTargetContext= (IExecutionDMContext) parent;
+ fTargetFrameContext= frame;
+ fCallback.gotoFrameIfActive(frame.getLevel());
+ result.frameLevel = getFrameLevel();
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#clearDebugContext()
+ */
+ public void clearDebugContext() {
+ final DsfSession session = DsfSession.getSession(fDsfSessionId);
+ if (session != null) {
+ try {
+ session.getExecutor().execute(new DsfRunnable() {
+ public void run() {
+ session.removeServiceEventListener(this);
+ }
+ });
+ } catch (RejectedExecutionException e) {
+ // Session is shut down.
+ }
+ }
+ fTargetContext= null;
+ if (fServicesTracker != null) {
+ fServicesTracker.dispose();
+ fServicesTracker= null;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#retrieveFrameAddress(int)
+ */
+ public void retrieveFrameAddress(final int frame) {
+ final DsfExecutor executor= getSession().getExecutor();
+ executor.execute(new DsfRunnable() {
+ public void run() {
+ retrieveFrameAddressInSessionThread(frame);
+ }});
+ }
+
+ void retrieveFrameAddressInSessionThread(final int frame) {
+ final IStack stack= fServicesTracker.getService(IStack.class);
+ final DsfExecutor executor= getSession().getExecutor();
+
+ // Our frame context is currently either un-set or it's set to the frame
+ // our caller is specifying. If un-set, then set it and reinvoke this
+ // method.
+ if (fTargetFrameContext == null) {
+ if (frame == 0) {
+ stack.getTopFrame(fTargetContext, new DataRequestMonitor<IFrameDMContext>(executor, null) {
+ @Override
+ protected void handleCompleted() {
+ fCallback.setUpdatePending(false);
+ fTargetFrameContext= getData();
+ if (fTargetFrameContext != null) {
+ retrieveFrameAddressInSessionThread(frame);
+ }
+ }
+ });
+ } else {
+ // TODO retrieve other stack frame
+ }
+ return;
+ }
+ else {
+ assert frame == fTargetFrameContext.getLevel();
+ }
+
+ stack.getFrameData(fTargetFrameContext, new DataRequestMonitor<IFrameDMData>(executor, null) {
+ @Override
+ protected void handleCompleted() {
+ fCallback.setUpdatePending(false);
+ IFrameDMData frameData= getData();
+ fTargetFrameData= frameData;
+ if (!isCanceled() && frameData != null) {
+ final IAddress address= frameData.getAddress();
+ final BigInteger addressValue= address.getValue();
+ if (DEBUG) System.out.println("retrieveFrameAddress done "+ DisassemblyUtils.getAddressText(addressValue)); //$NON-NLS-1$
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ if (address.getSize() * 4 > fCallback.getAddressSize()) {
+ fCallback.addressSizeChanged(address.getSize() * 4);
+ }
+ if (frame == 0) {
+ fCallback.updatePC(addressValue);
+ } else {
+ fCallback.gotoFrame(frame, addressValue);
+ }
+ }
+
+ });
+ } else {
+ final IStatus status= getStatus();
+ if (status != null && !status.isOK()) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(fCallback.getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$
+ }
+ });
+ }
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#isSuspended()
+ */
+ public boolean isSuspended() {
+ DsfSession session = getSession();
+ if (session == null || !session.isActive()) {
+ return false;
+ }
+ if (session.getExecutor().isInExecutorThread()) {
+ IRunControl runControl = getRunControl();
+ if (runControl == null) {
+ return false;
+ } else {
+ return runControl.isSuspended(fTargetContext);
+ }
+ }
+ Query<Boolean> query = new Query<Boolean>() {
+ @Override
+ protected void execute(DataRequestMonitor<Boolean> rm) {
+ try {
+ IRunControl runControl = getRunControl();
+ if (runControl == null) {
+ rm.setData(false);
+ } else {
+ rm.setData(runControl.isSuspended(fTargetContext));
+ }
+ } finally {
+ rm.done();
+ }
+ }
+ };
+ session.getExecutor().execute(query);
+ try {
+ return query.get();
+ } catch (InterruptedException exc) {
+ } catch (ExecutionException exc) {
+ }
+
+ return false;
+ }
+
+ private DsfSession getSession() {
+ return DsfSession.getSession(fDsfSessionId);
+ }
+
+ private IRunControl getRunControl() {
+ return getService(IRunControl.class);
+ }
+
+ private <V> V getService(Class<V> serviceClass) {
+ if (fServicesTracker != null) {
+ return fServicesTracker.getService(serviceClass);
+ }
+ return null;
+ }
+
+
+
+ @DsfServiceEventHandler
+ public void handleEvent(IExitedDMEvent event) {
+ if (fTargetContext == null) {
+ return;
+ }
+ final IExecutionDMContext context= event.getDMContext();
+ if (context.equals(fTargetContext)
+ || DMContexts.isAncestorOf(fTargetContext, context)) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ fCallback.handleTargetEnded();
+ }});
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void handleEvent(ISuspendedDMEvent event) {
+ if (fTargetContext == null) {
+ return;
+ }
+ final IExecutionDMContext context= event.getDMContext();
+ if (context.equals(fTargetContext)
+ || DMContexts.isAncestorOf(fTargetContext, context)) {
+ fCallback.handleTargetSuspended();
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void handleEvent(IResumedDMEvent event) {
+ if (fTargetContext == null) {
+ return;
+ }
+ final IExecutionDMContext context= event.getDMContext();
+ if (context.equals(fTargetContext)
+ || DMContexts.isAncestorOf(fTargetContext, context)) {
+ fCallback.handleTargetResumed();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.service.DsfSession.SessionEndedListener#sessionEnded(org.eclipse.cdt.dsf.service.DsfSession)
+ */
+ public void sessionEnded(DsfSession session) {
+ if (session.getId().equals(fDsfSessionId)) {
+ clearDebugContext();
+ fCallback.handleTargetEnded();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#getFrameLevel()
+ */
+ public int getFrameLevel() {
+ if (fTargetFrameContext != null) {
+ return fTargetFrameContext.getLevel();
+ }
+ return -1;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#hasFrameContext()
+ */
+ public boolean hasFrameContext() {
+ return fTargetFrameContext != null;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#getFrameFile()
+ */
+ public String getFrameFile() {
+ return fTargetFrameData.getFile();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#getFrameLine()
+ */
+ public int getFrameLine() {
+ return fTargetFrameData.getLine();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyBackend#retrieveDisassembly(java.math.BigInteger, java.math.BigInteger, java.lang.String, int, int, boolean, boolean, boolean, int)
+ */
+ public void retrieveDisassembly(final BigInteger startAddress, BigInteger endAddress, final String file, final int lineNumber, final int lines, boolean mixed, final boolean showSymbols, final boolean showDisassembly, final int linesHint) {
+ final BigInteger finalEndAddress= endAddress;
+
+ DsfSession session = getSession();
+ if (session == null) {
+ return; // can happen during session termination
+ }
+
+ final DsfExecutor executor= session.getExecutor();
+ final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
+
+ if (mixed) {
+ final DataRequestMonitor<IMixedInstruction[]> disassemblyRequest= new DataRequestMonitor<IMixedInstruction[]>(executor, null) {
+ @Override
+ public void handleCompleted() {
+ final IMixedInstruction[] data= getData();
+ if (!isCanceled() && data != null) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ if (!insertDisassembly(startAddress, finalEndAddress, data, showSymbols, showDisassembly)) {
+ // retry in non-mixed mode
+ fCallback.retrieveDisassembly(startAddress, finalEndAddress, linesHint, false, false);
+ }
+ }});
+ } else {
+ final IStatus status= getStatus();
+ if (status != null && !status.isOK()) {
+ if( file != null ) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ fCallback.retrieveDisassembly(startAddress, finalEndAddress, linesHint, true, true);
+ }});
+ }
+ else {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ fCallback.doScrollLocked(new Runnable() {
+ public void run() {
+ fCallback.insertError(startAddress, status.getMessage());
+ }
+ });
+ }});
+ }
+ }
+ fCallback.setUpdatePending(false);
+ }
+ }
+ };
+ if (file != null) {
+ executor.execute(new Runnable() {
+ public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
+ disassembly.getMixedInstructions(context, file, lineNumber, lines*2, disassemblyRequest);
+ }});
+ } else {
+ executor.execute(new Runnable() {
+ public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
+ disassembly.getMixedInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
+ }});
+ }
+ } else {
+ final DataRequestMonitor<IInstruction[]> disassemblyRequest= new DataRequestMonitor<IInstruction[]>(executor, null) {
+ @Override
+ public void handleCompleted() {
+ if (!isCanceled() && getData() != null) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ insertDisassembly(startAddress, finalEndAddress, getData(), showSymbols, showDisassembly);
+ }});
+ } else {
+ final IStatus status= getStatus();
+ if (status != null && !status.isOK()) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ fCallback.doScrollLocked(new Runnable() {
+ public void run() {
+ fCallback.insertError(startAddress, status.getMessage());
+ }
+ });
+ }});
+ }
+ fCallback.setUpdatePending(false);
+ }
+ }
+ };
+ if (file != null) {
+ executor.execute(new Runnable() {
+ public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
+ disassembly.getInstructions(context, file, lineNumber, lines, disassemblyRequest);
+ }});
+ } else {
+ executor.execute(new Runnable() {
+ public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
+ disassembly.getInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
+ }});
+ }
+ }
+
+
+ }
+
+ private void insertDisassembly(BigInteger startAddress, BigInteger endAddress, IInstruction[] instructions, boolean showSymbols, boolean showDisassembly) {
+ if (!fCallback.hasViewer() || fDsfSessionId == null) {
+ return;
+ }
+ if (DEBUG) System.out.println("insertDisassembly "+ DisassemblyUtils.getAddressText(startAddress)); //$NON-NLS-1$
+ assert fCallback.getUpdatePending();
+ if (!fCallback.getUpdatePending()) {
+ // safe-guard in case something weird is going on
+ return;
+ }
+ try {
+ fCallback.lockScroller();
+
+ AddressRangePosition p= null;
+ for (int j = 0; j < instructions.length; j++) {
+ IInstruction instruction = instructions[j];
+ BigInteger address= instruction.getAdress();
+ if (startAddress == null || startAddress.compareTo(BigInteger.ZERO) < 0) {
+ startAddress = address;
+ fCallback.setGotoAddressPending(address);
+ }
+ if (p == null || !p.containsAddress(address)) {
+ p = fCallback.getPositionOfAddress(address);
+ }
+ if (p instanceof ErrorPosition && p.fValid) {
+ p.fValid = false;
+ fCallback.getDocument().addInvalidAddressRange(p);
+ } else if (p == null || p.fValid || address.compareTo(endAddress) > 0) {
+ if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
+ return;
+ }
+ boolean hasSource= false;
+ String compilationPath= null;
+ // insert symbol label
+ final String functionName= instruction.getFuntionName();
+ if (functionName != null && functionName.length() > 0 && instruction.getOffset() == 0) {
+ p = fCallback.getDocument().insertLabel(p, address, functionName, showSymbols && (!hasSource || showDisassembly));
+ }
+ // determine instruction byte length
+ BigInteger instrLength= null;
+ if (j < instructions.length - 1) {
+ instrLength= instructions[j+1].getAdress().subtract(instruction.getAdress()).abs();
+ } else if (instructions.length == 1) {
+ if (p.fAddressLength.compareTo(BigInteger.valueOf(8)) <= 0) {
+ instrLength= p.fAddressLength;
+ }
+ }
+ if (instrLength == null) {
+ // cannot determine length of last instruction
+ break;
+ }
+ final String opCode;
+ // insert function name+offset instead of opcode bytes
+ if (functionName != null && functionName.length() > 0) {
+ opCode= functionName + '+' + instruction.getOffset();
+ } else {
+ opCode= ""; //$NON-NLS-1$
+ }
+ p = fCallback.getDocument().insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), compilationPath, -1);
+ if (p == null) {
+ break;
+ }
+ }
+ } catch (BadLocationException e) {
+ // should not happen
+ DisassemblyUtils.internalError(e);
+ } finally {
+ fCallback.setUpdatePending(false);
+ fCallback.updateInvalidSource();
+ fCallback.unlockScroller();
+ fCallback.doPending();
+ fCallback.updateVisibleArea();
+ }
+ }
+
+ /**
+ * @param startAddress
+ * an address the caller is hoping will be covered by this
+ * insertion. I.e., [mixedInstructions] may or may not contain
+ * that address; the caller wants to know if it does, and so we
+ * indicate that via our return value. Can be null or
+ * BigInteger(-1) to indicate n/a, in which case we return true
+ * as long as any instruction was inserted
+ * @param endAddress
+ * cut-off address. Any elements in [mixedInstructions] that
+ * extend beyond this address are ignored.
+ * @param mixedInstructions
+ * @param showSymbols
+ * @param showDisassembly
+ * @return whether [startAddress] was inserted
+ */
+ private boolean insertDisassembly(BigInteger startAddress, BigInteger endAddress, IMixedInstruction[] mixedInstructions, boolean showSymbols, boolean showDisassembly) {
+ if (!fCallback.hasViewer() || fDsfSessionId == null) {
+ return true;
+ }
+ if (DEBUG) System.out.println("insertDisassembly "+ DisassemblyUtils.getAddressText(startAddress)); //$NON-NLS-1$
+ boolean updatePending = fCallback.getUpdatePending();
+ assert updatePending;
+ if (!updatePending) {
+ // safe-guard in case something weird is going on
+ return true;
+ }
+ // indicates whether [startAddress] was inserted
+ boolean insertedStartAddress = false;
+ try {
+ fCallback.lockScroller();
+
+ AddressRangePosition p= null;
+ for (int i = 0; i < mixedInstructions.length; ++i) {
+ IMixedInstruction mixedInstruction= mixedInstructions[i];
+ final String file= mixedInstruction.getFileName();
+ int lineNumber= mixedInstruction.getLineNumber() - 1;
+ IInstruction[] instructions= mixedInstruction.getInstructions();
+ for (int j = 0; j < instructions.length; ++j) {
+ IInstruction instruction = instructions[j];
+ BigInteger address= instruction.getAdress();
+ if (startAddress == null || startAddress.compareTo(BigInteger.ZERO) < 0) {
+ startAddress = address;
+ fCallback.setGotoAddressPending(address);
+ }
+ if (p == null || !p.containsAddress(address)) {
+ p = fCallback.getPositionOfAddress(address);
+ }
+ if (p instanceof ErrorPosition && p.fValid) {
+ p.fValid = false;
+ fCallback.getDocument().addInvalidAddressRange(p);
+ } else if (p == null || address.compareTo(endAddress) > 0) {
+ if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
+ return insertedStartAddress;
+ } else if (p.fValid) {
+ if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
+ if (file != null && lineNumber >= 0 || p.fAddressLength == BigInteger.ONE) {
+ // override probably unaligned disassembly
+ p.fValid = false;
+ fCallback.getDocument().addInvalidAddressRange(p);
+ } else {
+ return insertedStartAddress;
+ }
+ }
+ boolean hasSource= false;
+ if (file != null && lineNumber >= 0) {
+ p = fCallback.insertSource(p, address, file, lineNumber);
+ hasSource = fCallback.getStorageForFile(file) != null;
+ }
+ // insert symbol label
+ final String functionName= instruction.getFuntionName();
+ if (functionName != null && functionName.length() > 0 && instruction.getOffset() == 0) {
+ p = fCallback.getDocument().insertLabel(p, address, functionName, showSymbols && (!hasSource || showDisassembly));
+ }
+ // determine instruction byte length
+ BigInteger instrLength= null;
+ if (j < instructions.length - 1) {
+ instrLength= instructions[j+1].getAdress().subtract(instruction.getAdress()).abs();
+ } else if (i < mixedInstructions.length - 1) {
+ int nextSrcLineIdx= i+1;
+ while (nextSrcLineIdx < mixedInstructions.length) {
+ IInstruction[] nextInstrs= mixedInstructions[nextSrcLineIdx].getInstructions();
+ if (nextInstrs.length > 0) {
+ instrLength= nextInstrs[0].getAdress().subtract(instruction.getAdress()).abs();
+ break;
+ }
+ ++nextSrcLineIdx;
+ }
+ if (nextSrcLineIdx >= mixedInstructions.length) {
+ break;
+ }
+ } else if (instructions.length == 1) {
+ if (p.fAddressLength.compareTo(BigInteger.valueOf(8)) <= 0) {
+ instrLength= p.fAddressLength;
+ }
+ }
+ if (instrLength == null) {
+ // cannot determine length of last instruction
+ break;
+ }
+ final String opCode;
+ // insert function name+offset instead of opcode bytes
+ if (functionName != null && functionName.length() > 0) {
+ opCode= functionName + '+' + instruction.getOffset();
+ } else {
+ opCode= ""; //$NON-NLS-1$
+ }
+ insertedStartAddress= insertedStartAddress || address.compareTo(startAddress) == 0;
+ p = fCallback.getDocument().insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), file, lineNumber);
+ if (p == null && insertedStartAddress) {
+ break;
+ }
+ }
+ }
+
+ } catch (BadLocationException e) {
+ // should not happen
+ DisassemblyUtils.internalError(e);
+ } finally {
+ fCallback.setUpdatePending(false);
+ if (insertedStartAddress) {
+ fCallback.updateInvalidSource();
+ fCallback.unlockScroller();
+ fCallback.doPending();
+ fCallback.updateVisibleArea();
+ } else {
+ fCallback.unlockScroller();
+ }
+ }
+ return insertedStartAddress;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#insertSource(org.eclipse.jface.text.Position, java.math.BigInteger, java.lang.String, int)
+ */
+ public Object insertSource(Position pos, BigInteger address, final String file, int lineNumber) {
+ Object sourceElement = null;
+ final ISourceLookupDMContext ctx= DMContexts.getAncestorOfType(fTargetContext, ISourceLookupDMContext.class);
+ final DsfExecutor executor= getSession().getExecutor();
+ Query<Object> query= new Query<Object>() {
+ @Override
+ protected void execute(final DataRequestMonitor<Object> rm) {
+ final DataRequestMonitor<Object> request= new DataRequestMonitor<Object>(executor, rm) {
+ @Override
+ protected void handleSuccess() {
+ rm.setData(getData());
+ rm.done();
+ }
+ };
+ final ISourceLookup lookup= getService(ISourceLookup.class);
+ lookup.getSource(ctx, file, request);
+ }
+ };
+ try {
+ getSession().getExecutor().execute(query);
+ sourceElement= query.get();
+ } catch (InterruptedException exc) {
+ DisassemblyUtils.internalError(exc);
+ } catch (ExecutionException exc) {
+ DisassemblyUtils.internalError(exc);
+ }
+ return sourceElement;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#gotoSymbol(java.lang.String)
+ */
+ public void gotoSymbol(final String symbol) {
+ final DsfExecutor executor= getSession().getExecutor();
+ executor.execute(new DsfRunnable() {
+ public void run() {
+ final IExpressions expressions= getService(IExpressions.class);
+ if (expressions == null) {
+ return;
+ }
+ IExpressionDMContext exprDmc= expressions.createExpression(fTargetContext, '&'+symbol);
+ final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT);
+ expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, null) {
+ @Override
+ protected void handleSuccess() {
+ FormattedValueDMData data= getData();
+ final String value= data.getFormattedValue();
+ final BigInteger address= DisassemblyUtils.decodeAddress(value);
+ if (address != null) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ fCallback.gotoAddress(address);
+ }});
+ }
+ }
+ @Override
+ protected void handleError() {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(fCallback.getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$
+ }});
+ }
+ });
+ }});
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#retrieveDisassembly(java.lang.String, int, java.math.BigInteger, boolean, boolean, boolean)
+ */
+ public void retrieveDisassembly(final String file, final int lines, final BigInteger endAddress, boolean mixed, final boolean showSymbols, final boolean showDisassembly) {
+ String debuggerPath= file;
+ // try reverse lookup
+ final ISourceLookupDMContext ctx= DMContexts.getAncestorOfType(fTargetContext, ISourceLookupDMContext.class);
+ final DsfExecutor executor= getSession().getExecutor();
+ Query<String> query= new Query<String>() {
+ @Override
+ protected void execute(final DataRequestMonitor<String> rm) {
+ final DataRequestMonitor<String> request= new DataRequestMonitor<String>(executor, rm) {
+ @Override
+ protected void handleSuccess() {
+ rm.setData(getData());
+ rm.done();
+ }
+ };
+ final ISourceLookup lookup= getService(ISourceLookup.class);
+ lookup.getDebuggerPath(ctx, file, request);
+ }
+ };
+ try {
+ getSession().getExecutor().execute(query);
+ debuggerPath= query.get();
+ } catch (InterruptedException exc) {
+ internalError(exc);
+ } catch (ExecutionException exc) {
+ internalError(exc);
+ }
+
+ final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
+
+ final String finalFile= debuggerPath;
+ final DataRequestMonitor<IMixedInstruction[]> disassemblyRequest= new DataRequestMonitor<IMixedInstruction[]>(executor, null) {
+ @Override
+ public void handleCompleted() {
+ final IMixedInstruction[] data= getData();
+ if (!isCanceled() && data != null) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ if (!insertDisassembly(null, endAddress, data, showSymbols, showDisassembly)) {
+ // retry in non-mixed mode
+ retrieveDisassembly(file, lines, endAddress, false, showSymbols, showDisassembly);
+ }
+ }});
+ } else {
+ final IStatus status= getStatus();
+ if (status != null && !status.isOK()) {
+ fCallback.asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(fCallback.getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$
+ }
+ });
+ }
+ fCallback.setUpdatePending(false);
+ }
+ }
+ };
+ assert !fCallback.getUpdatePending();
+ fCallback.setUpdatePending(true);
+ executor.execute(new Runnable() {
+ public void run() {
+ final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
+ if (disassembly == null) {
+ disassemblyRequest.cancel();
+ disassemblyRequest.done();
+ return;
+ }
+ disassembly.getMixedInstructions(context, finalFile, 1, lines, disassemblyRequest);
+ }});
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend#evaluateExpression(java.lang.String)
+ */
+ public String evaluateExpression(final String expression) {
+ if (fTargetFrameContext == null) {
+ return null;
+ }
+ final DsfExecutor executor= DsfSession.getSession(fDsfSessionId).getExecutor();
+ Query<FormattedValueDMData> query= new Query<FormattedValueDMData>() {
+ @Override
+ protected void execute(final DataRequestMonitor<FormattedValueDMData> rm) {
+ IExecutionDMContext exeCtx = DMContexts.getAncestorOfType(fTargetFrameContext, IExecutionDMContext.class);
+ final IRunControl rc= getService(IRunControl.class);
+ if (rc == null || !rc.isSuspended(exeCtx)) {
+ rm.done();
+ return;
+ }
+ final IExpressions expressions= getService(IExpressions.class);
+ if (expressions == null) {
+ rm.done();
+ return;
+ }
+ IExpressionDMContext exprDmc= expressions.createExpression(fTargetFrameContext, expression);
+ final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT);
+ expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, rm) {
+ @Override
+ protected void handleSuccess() {
+ FormattedValueDMData data= getData();
+ rm.setData(data);
+ rm.done();
+ }
+ });
+ }};
+
+ executor.execute(query);
+ FormattedValueDMData data= null;
+ try {
+ data= query.get();
+ } catch (InterruptedException exc) {
+ } catch (ExecutionException exc) {
+ }
+ if (data != null) {
+ return data.getFormattedValue();
+ }
+ return null;
+
+ }
+} \ No newline at end of file
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsfFactory.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsfFactory.java
new file mode 100644
index 0000000000..41b172ca4d
--- /dev/null
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsfFactory.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Freescale Semiconductor, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Freescale Semiconductor - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.debug.internal.ui.disassembly;
+
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IAdapterFactory;
+
+/**
+ */
+public class DisassemblyBackendDsfFactory implements IAdapterFactory {
+
+ private static final Class<?>[] ADAPTERS = { IDisassemblyBackend.class };
+
+ @SuppressWarnings("rawtypes")
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if (IDisassemblyBackend.class.equals(adapterType)) {
+ if (adaptableObject instanceof IAdaptable && DisassemblyBackendDsf.supportsDebugContext_((IAdaptable)adaptableObject)) {
+ return new DisassemblyBackendDsf();
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Class[] getAdapterList() {
+ return ADAPTERS;
+ }
+}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
index 178cbd9e5e..a716032d6a 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java
@@ -19,16 +19,14 @@ import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.RejectedExecutionException;
-
-import org.eclipse.cdt.core.IAddress;
-import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
-import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
-import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
-import org.eclipse.cdt.dsf.concurrent.Query;
-import org.eclipse.cdt.dsf.datamodel.DMContexts;
-import org.eclipse.cdt.dsf.datamodel.IDMContext;
+
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyPosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.ErrorPosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyBackend;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyDocument;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.LabelPosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.AbstractDisassemblyAction;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.ActionGotoAddress;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.ActionGotoProgramCounter;
@@ -37,43 +35,14 @@ import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.ActionOpenPrefe
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.AddressBarContributionItem;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.JumpToAddressAction;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions.TextOperationAction;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.BreakpointsAnnotationModel;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocument;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyPosition;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.ErrorPosition;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.LabelPosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourceFileInfo;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourcePosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.preferences.DisassemblyPreferenceConstants;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.presentation.DisassemblyIPAnnotation;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IDisassemblyPart;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.util.HSL;
-import org.eclipse.cdt.dsf.debug.service.IDisassembly;
-import org.eclipse.cdt.dsf.debug.service.IExpressions;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
-import org.eclipse.cdt.dsf.debug.service.IInstruction;
-import org.eclipse.cdt.dsf.debug.service.IMixedInstruction;
-import org.eclipse.cdt.dsf.debug.service.IRunControl;
-import org.eclipse.cdt.dsf.debug.service.ISourceLookup;
-import org.eclipse.cdt.dsf.debug.service.IStack;
-import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext;
-import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
-import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
-import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent;
-import org.eclipse.cdt.dsf.debug.service.IRunControl.IResumedDMEvent;
-import org.eclipse.cdt.dsf.debug.service.IRunControl.ISuspendedDMEvent;
-import org.eclipse.cdt.dsf.debug.service.ISourceLookup.ISourceLookupDMContext;
-import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
-import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
-import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
-import org.eclipse.cdt.dsf.service.DsfServicesTracker;
-import org.eclipse.cdt.dsf.service.DsfSession;
-import org.eclipse.cdt.dsf.service.DsfSession.SessionEndedListener;
-import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.cdt.internal.core.resources.ResourceLookup;
import org.eclipse.cdt.internal.ui.dnd.TextViewerDragAdapter;
import org.eclipse.core.commands.NotEnabledException;
@@ -104,7 +73,6 @@ import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.commands.ActionHandler;
-import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
@@ -189,14 +157,15 @@ import org.eclipse.ui.texteditor.IUpdate;
import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
-
+import static org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils.internalError;
+import static org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils.getAddressText;
/**
* DisassemblyPart
*/
@SuppressWarnings("restriction")
-public abstract class DisassemblyPart extends WorkbenchPart implements IDisassemblyPart, IViewportListener, ITextPresentationListener, SessionEndedListener {
+public abstract class DisassemblyPart extends WorkbenchPart implements IDisassemblyPart, IViewportListener, ITextPresentationListener, IDisassemblyPartCallback {
- private final static boolean DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.cdt.dsf.ui/debug/disassembly")); //$NON-NLS-1$//$NON-NLS-2$
+ final static boolean DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.cdt.dsf.ui/debug/disassembly")); //$NON-NLS-1$//$NON-NLS-2$
/**
* Annotation model attachment key for breakpoint annotations.
@@ -278,7 +247,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
private BigInteger fGotoAddressPending= PC_UNKNOWN;
private BigInteger fFocusAddress= PC_UNKNOWN;
private int fBufferZone;
- private volatile IExecutionDMContext fTargetContext;
private String fDebugSessionId;
private int fTargetFrame;
private DisassemblyIPAnnotation fPCAnnotation;
@@ -344,14 +312,12 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
private ArrayList<IHandlerActivation> fHandlerActivations;
private IContextActivation fContextActivation;
-
- private DsfServicesTracker fServicesTracker;
- private IFrameDMContext fTargetFrameContext;
- protected IFrameDMData fTargetFrameData;
+
+ private IDisassemblyBackend fBackend;
private AddressBarContributionItem fAddressBar = null;
private Action fJumpToAddressAction = new JumpToAddressAction(this);
-
+
private final class ActionRefreshView extends AbstractDisassemblyAction {
public ActionRefreshView() {
super(DisassemblyPart.this);
@@ -722,7 +688,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
} else {
updateDebugContext();
}
- DsfSession.addSessionEndedListener(this);
}
/*
@@ -756,9 +721,12 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
deactivateDisassemblyContext();
fViewer = null;
- setDebugContext(null);
- DsfSession.removeSessionEndedListener(this);
-
+ if (fBackend != null) {
+ fBackend.clearDebugContext();
+ fBackend.dispose();
+ fBackend = null;
+ }
+
fAnnotationAccess = null;
fAnnotationPreferences = null;
fAnnotationRulerColumn = null;
@@ -1369,18 +1337,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fHandlerActivations.add(handlerService.activateHandler(action.getActionDefinitionId(), new ActionHandler(action)));
}
- private void gotoFrame(IFrameDMContext frame) {
- if (fActive) {
- gotoFrame(frame.getLevel(), PC_UNKNOWN);
- }
- }
-
- private void gotoFrame(int frame) {
- if (fActive) {
- gotoFrame(frame, PC_UNKNOWN);
- }
- }
-
/*
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyPart#gotoProgramCounter()
*/
@@ -1434,40 +1390,10 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyPart#gotoSymbol(java.lang.String)
*/
public final void gotoSymbol(final String symbol) {
- if (!fActive || fTargetFrameContext == null) {
+ if (!fActive || fBackend == null || !fBackend.hasFrameContext()) {
return;
}
- final DsfExecutor executor= getSession().getExecutor();
- executor.execute(new DsfRunnable() {
- public void run() {
- final IExpressions expressions= getService(IExpressions.class);
- if (expressions == null) {
- return;
- }
- IExpressionDMContext exprDmc= expressions.createExpression(fTargetContext, '&'+symbol);
- final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.HEX_FORMAT);
- expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, null) {
- @Override
- protected void handleSuccess() {
- FormattedValueDMData data= getData();
- final String value= data.getFormattedValue();
- final BigInteger address= decodeAddress(value);
- if (address != null) {
- asyncExec(new Runnable() {
- public void run() {
- gotoAddress(address);
- }});
- }
- }
- @Override
- protected void handleError() {
- asyncExec(new Runnable() {
- public void run() {
- ErrorDialog.openError(getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$
- }});
- }
- });
- }});
+ fBackend.gotoSymbol(symbol);
}
private void gotoPosition(Position pos, boolean select) {
@@ -1527,12 +1453,15 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
/**
* Update lines of currently visible area + one page buffer zone below.
+ *
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#updateVisibleArea()
*/
- private void updateVisibleArea() {
+ public void updateVisibleArea() {
+ assert isGuiThread();
if (!fActive || fUpdatePending || fViewer == null || fDebugSessionId == null) {
return;
}
- if (fTargetContext == null || !isSuspended(fTargetContext) || fFrameAddress == PC_UNKNOWN) {
+ if (fBackend == null || !fBackend.hasDebugContext() || !fBackend.isSuspended() || fFrameAddress == PC_UNKNOWN) {
return;
}
StyledText styledText = fViewer.getTextWidget();
@@ -1568,9 +1497,8 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
AddressRangePosition bestPosition = null;
int bestLine = -1;
BigInteger bestDistance = null;
- Iterator<AddressRangePosition> it = fDocument.getInvalidAddressRanges().iterator();
- while (it.hasNext()) {
- AddressRangePosition p = it.next();
+ if (DEBUG) System.out.println("DisassemblyPart.updateVisibleArea() called. There are " + fDocument.getInvalidAddressRanges().length + " invalid ranges to consider updating"); //$NON-NLS-1$ //$NON-NLS-2$
+ for (AddressRangePosition p : fDocument.getInvalidAddressRanges()) {
try {
int line = fDocument.getLineOfOffset(p.offset);
if (line >= topIndex && line <= bottomIndex) {
@@ -1596,6 +1524,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
if (bestPosition != null) {
+ if (DEBUG) System.out.println("...and the best candidate is: " + bestPosition); //$NON-NLS-1$
int lines = fBufferZone+3;
BigInteger startAddress = bestPosition.fAddressOffset;
BigInteger endAddress = bestPosition.fAddressOffset.add(bestPosition.fAddressLength);
@@ -1625,10 +1554,22 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
retrieveDisassembly(startAddress, endAddress, lines);
}
+ else {
+ if (DEBUG) {
+ System.out.println("...but alas we didn't deem any of them worth updating. They are:"); //$NON-NLS-1$
+ int i = 0;
+ for (AddressRangePosition p : fDocument.getInvalidAddressRanges()) {
+ System.out.println("[" + i++ + "] " + p); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
scheduleDoPending();
}
- private void asyncExec(Runnable runnable) {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#asyncExec(java.lang.Runnable)
+ */
+ public void asyncExec(Runnable runnable) {
if (fViewer != null) {
fViewer.getControl().getDisplay().asyncExec(runnable);
}
@@ -1643,9 +1584,12 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
/**
- * Insert sourcelines if available.
+ * Insert source lines if available.
+ *
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#updateInvalidSource()
*/
- /*default*/ void updateInvalidSource() {
+ public void updateInvalidSource() {
+ assert isGuiThread();
if (fViewer == null) {
return;
}
@@ -1661,14 +1605,12 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fUpdatePending = true;
lockScroller();
}
- ArrayList<SourcePosition> copy = new ArrayList<SourcePosition>(fDocument.getInvalidSource());
- Iterator<SourcePosition> it = copy.iterator();
- while (it.hasNext()) {
- SourcePosition p = it.next();
+ SourcePosition[] invalidSources = fDocument.getInvalidSourcePositions();
+ for (SourcePosition p : invalidSources) {
if (!p.fValid) {
insertSource(p);
- } else if (DEBUG && fDocument.getInvalidSource().remove(p)) {
- System.err.println("!!! valid source position in invalid source list at "+getAddressText(p.fAddressOffset)); //$NON-NLS-1$
+ } else if (DEBUG && fDocument.removeInvalidSourcePosition(p)) {
+ System.err.println("!!! valid source position in invalid source list at "+ getAddressText(p.fAddressOffset)); //$NON-NLS-1$
}
}
} finally {
@@ -1681,7 +1623,9 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
/**
- * Show disassembly for given (source) file.
+ * Show disassembly for given (source) file. Retrieves disassembly starting
+ * at the beginning of the file, for as many lines as are specified. If
+ * [lines] == -1, the entire file is disassembled.
*
* @param file
* @param lines
@@ -1698,74 +1642,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
return;
}
if (DEBUG) System.out.println("retrieveDisassembly "+file); //$NON-NLS-1$
- String debuggerPath= file;
-
- // try reverse lookup
- final ISourceLookupDMContext ctx= DMContexts.getAncestorOfType(fTargetContext, ISourceLookupDMContext.class);
- final DsfExecutor executor= getSession().getExecutor();
- Query<String> query= new Query<String>() {
- @Override
- protected void execute(final DataRequestMonitor<String> rm) {
- final DataRequestMonitor<String> request= new DataRequestMonitor<String>(executor, rm) {
- @Override
- protected void handleSuccess() {
- rm.setData(getData());
- rm.done();
- }
- };
- final ISourceLookup lookup= getService(ISourceLookup.class);
- lookup.getDebuggerPath(ctx, file, request);
- }
- };
- try {
- getSession().getExecutor().execute(query);
- debuggerPath= query.get();
- } catch (InterruptedException exc) {
- internalError(exc);
- } catch (ExecutionException exc) {
- internalError(exc);
- }
-
- final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
-
- final String finalFile= debuggerPath;
- final DataRequestMonitor<IMixedInstruction[]> disassemblyRequest= new DataRequestMonitor<IMixedInstruction[]>(executor, null) {
- @Override
- public void handleCompleted() {
- final IMixedInstruction[] data= getData();
- if (!isCanceled() && data != null) {
- asyncExec(new Runnable() {
- public void run() {
- if (!insertDisassembly(null, fEndAddress, data)) {
- // retry in non-mixed mode
- retrieveDisassembly(file, lines, false);
- }
- }});
- } else {
- final IStatus status= getStatus();
- if (status != null && !status.isOK()) {
- asyncExec(new Runnable() {
- public void run() {
- ErrorDialog.openError(getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$
- }
- });
- }
- fUpdatePending= false;
- }
- }
- };
- assert !fUpdatePending;
- fUpdatePending = true;
- executor.execute(new Runnable() {
- public void run() {
- final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
- if (disassembly == null) {
- disassemblyRequest.cancel();
- disassemblyRequest.done();
- return;
- }
- disassembly.getMixedInstructions(context, finalFile, 1, lines, disassemblyRequest);
- }});
+ fBackend.retrieveDisassembly(file, lines, fEndAddress, mixed, fShowSymbols, fShowDisassembly);
}
private void retrieveDisassembly(BigInteger startAddress, BigInteger endAddress, int lines) {
@@ -1776,7 +1653,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
retrieveDisassembly(startAddress, endAddress, lines, fShowSource, false);
}
- private void retrieveDisassembly(final BigInteger startAddress, BigInteger endAddress, final int linesHint, boolean mixed, boolean ignoreFile) {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#retrieveDisassembly(java.math.BigInteger, java.math.BigInteger, int, boolean, boolean)
+ */
+ public void retrieveDisassembly(final BigInteger startAddress, BigInteger endAddress, final int linesHint, boolean mixed, boolean ignoreFile) {
+ assert isGuiThread();
assert !fUpdatePending;
fUpdatePending = true;
final int lines= linesHint + 2;
@@ -1787,132 +1668,24 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
boolean insideActiveFrame= startAddress.equals(fFrameAddress);
String file= null;
int lineNumber= -1;
- if (!ignoreFile && insideActiveFrame && fTargetFrameData != null) {
- file= fTargetFrameData.getFile();
+ if (!ignoreFile && insideActiveFrame && fBackend != null) {
+ file= fBackend.getFrameFile();
if (file != null && file.trim().length() == 0) {
- file= null;
- }
- lineNumber= fTargetFrameData.getLine();
- }
- final String finalFile= file;
- final int finalLineNumber= lineNumber;
- final BigInteger finalEndAddress= endAddress;
-
- final DsfExecutor executor= getSession().getExecutor();
- final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
-
- if (mixed) {
- final DataRequestMonitor<IMixedInstruction[]> disassemblyRequest= new DataRequestMonitor<IMixedInstruction[]>(executor, null) {
- @Override
- public void handleCompleted() {
- final IMixedInstruction[] data= getData();
- if (!isCanceled() && data != null) {
- asyncExec(new Runnable() {
- public void run() {
- if (!insertDisassembly(startAddress, finalEndAddress, data)) {
- // retry in non-mixed mode
- retrieveDisassembly(startAddress, finalEndAddress, linesHint, false, false);
- }
- }});
- } else {
- final IStatus status= getStatus();
- if (status != null && !status.isOK()) {
- if( finalFile != null ) {
- asyncExec(new Runnable() {
- public void run() {
- retrieveDisassembly(startAddress, finalEndAddress, linesHint, true, true);
- }});
- }
- else {
- asyncExec(new Runnable() {
- public void run() {
- doScrollLocked(new Runnable() {
- public void run() {
- insertError(startAddress, status.getMessage());
- }
- });
- }});
- }
- }
- fUpdatePending= false;
- }
- }
- };
- if (file != null) {
- executor.execute(new Runnable() {
- public void run() {
- final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
- if (disassembly == null) {
- disassemblyRequest.cancel();
- disassemblyRequest.done();
- return;
- }
- disassembly.getMixedInstructions(context, finalFile, finalLineNumber, lines*2, disassemblyRequest);
- }});
- } else {
- executor.execute(new Runnable() {
- public void run() {
- final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
- if (disassembly == null) {
- disassemblyRequest.cancel();
- disassemblyRequest.done();
- return;
- }
- disassembly.getMixedInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
- }});
+ file = null;
}
- } else {
- final DataRequestMonitor<IInstruction[]> disassemblyRequest= new DataRequestMonitor<IInstruction[]>(executor, null) {
- @Override
- public void handleCompleted() {
- if (!isCanceled() && getData() != null) {
- asyncExec(new Runnable() {
- public void run() {
- insertDisassembly(startAddress, finalEndAddress, getData());
- }});
- } else {
- final IStatus status= getStatus();
- if (status != null && !status.isOK()) {
- asyncExec(new Runnable() {
- public void run() {
- doScrollLocked(new Runnable() {
- public void run() {
- insertError(startAddress, status.getMessage());
- }
- });
- }});
- }
- fUpdatePending= false;
- }
- }
- };
if (file != null) {
- executor.execute(new Runnable() {
- public void run() {
- final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
- if (disassembly == null) {
- disassemblyRequest.cancel();
- disassemblyRequest.done();
- return;
- }
- disassembly.getInstructions(context, finalFile, finalLineNumber, lines, disassemblyRequest);
- }});
- } else {
- executor.execute(new Runnable() {
- public void run() {
- final IDisassembly disassembly= fServicesTracker.getService(IDisassembly.class);
- if (disassembly == null) {
- disassemblyRequest.cancel();
- disassemblyRequest.done();
- return;
- }
- disassembly.getInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
- }});
+ lineNumber= fBackend.getFrameLine();
}
}
+ if (DEBUG) System.out.println("Asking backend to retrieve disassembly: sa=" + startAddress + ",ea=" + endAddress + ",file=" + file + ",lineNumber=" + lineNumber + ",lines=" + lines); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ fBackend.retrieveDisassembly(startAddress, endAddress, file, lineNumber, lines, mixed, fShowSymbols, fShowDisassembly, linesHint);
}
- private void insertError(BigInteger address, String message) {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#insertError(java.math.BigInteger, java.lang.String)
+ */
+ public void insertError(BigInteger address, String message) {
+ assert isGuiThread();
AddressRangePosition p = null;
p = getPositionOfAddress(address);
if (p.fValid) {
@@ -1925,278 +1698,27 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
- private void insertDisassembly(BigInteger startAddress, BigInteger endAddress, IInstruction[] instructions) {
- if (fViewer == null || fDebugSessionId == null) {
- return;
- }
- if (DEBUG) System.out.println("insertDisassembly "+getAddressText(startAddress)); //$NON-NLS-1$
- assert fUpdatePending;
- if (!fUpdatePending) {
- // safe-guard in case something weird is going on
- return;
- }
- try {
- lockScroller();
-
- AddressRangePosition p= null;
- for (int j = 0; j < instructions.length; j++) {
- IInstruction instruction = instructions[j];
- BigInteger address= instruction.getAdress();
- if (startAddress == null || startAddress.compareTo(BigInteger.ZERO) < 0) {
- fGotoAddressPending = startAddress = address;
- }
- if (p == null || !p.containsAddress(address)) {
- p = getPositionOfAddress(address);
- }
- if (p instanceof ErrorPosition && p.fValid) {
- p.fValid = false;
- fDocument.getInvalidAddressRanges().add(p);
- } else if (p == null || p.fValid || address.compareTo(endAddress) > 0) {
- if (DEBUG) System.out.println("Excess disassembly lines at " + getAddressText(address)); //$NON-NLS-1$
- return;
- }
- boolean hasSource= false;
- String compilationPath= null;
- // insert symbol label
- final String functionName= instruction.getFuntionName();
- if (functionName != null && functionName.length() > 0 && instruction.getOffset() == 0) {
- p = fDocument.insertLabel(p, address, functionName, fShowSymbols && (!hasSource || fShowDisassembly));
- }
- // determine instruction byte length
- BigInteger instrLength= null;
- if (j < instructions.length - 1) {
- instrLength= instructions[j+1].getAdress().subtract(instruction.getAdress()).abs();
- } else if (instructions.length == 1) {
- if (p.fAddressLength.compareTo(BigInteger.valueOf(8)) <= 0) {
- instrLength= p.fAddressLength;
- }
- }
- if (instrLength == null) {
- // cannot determine length of last instruction
- break;
- }
- final String opCode;
- // insert function name+offset instead of opcode bytes
- if (functionName != null && functionName.length() > 0) {
- opCode= functionName + '+' + instruction.getOffset();
- } else {
- opCode= ""; //$NON-NLS-1$
- }
- p = fDocument.insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), compilationPath, -1);
- if (p == null) {
- break;
- }
- }
-
- } catch (BadLocationException e) {
- // should not happen
- internalError(e);
- } finally {
- fUpdatePending = false;
- updateInvalidSource();
- unlockScroller();
- doPending();
- updateVisibleArea();
- }
- }
-
- private boolean insertDisassembly(BigInteger startAddress, BigInteger endAddress, IMixedInstruction[] mixedInstructions) {
- if (fViewer == null || fDebugSessionId == null) {
- return true;
- }
- if (DEBUG) System.out.println("insertDisassembly "+getAddressText(startAddress)); //$NON-NLS-1$
- assert fUpdatePending;
- if (!fUpdatePending) {
- // safe-guard in case something weird is going on
- return true;
- }
- // indicates whether disassembly for the start address was inserted
- boolean success= false;
- try {
- lockScroller();
-
- AddressRangePosition p= null;
- for (int i = 0; i < mixedInstructions.length; ++i) {
- IMixedInstruction mixedInstruction= mixedInstructions[i];
- final String file= mixedInstruction.getFileName();
- int lineNumber= mixedInstruction.getLineNumber() - 1;
- IInstruction[] instructions= mixedInstruction.getInstructions();
- for (int j = 0; j < instructions.length; ++j) {
- IInstruction instruction = instructions[j];
- BigInteger address= instruction.getAdress();
- if (startAddress == null || startAddress.compareTo(BigInteger.ZERO) < 0) {
- fGotoAddressPending = startAddress = address;
- }
- if (p == null || !p.containsAddress(address)) {
- p = getPositionOfAddress(address);
- }
- if (p instanceof ErrorPosition && p.fValid) {
- p.fValid = false;
- fDocument.getInvalidAddressRanges().add(p);
- } else if (p == null || address.compareTo(endAddress) > 0) {
- if (DEBUG) System.out.println("Excess disassembly lines at " + getAddressText(address)); //$NON-NLS-1$
- return success;
- } else if (p.fValid) {
- if (DEBUG) System.out.println("Excess disassembly lines at " + getAddressText(address)); //$NON-NLS-1$
- if (file != null && lineNumber >= 0 || p.fAddressLength == BigInteger.ONE) {
- // override probably unaligned disassembly
- p.fValid = false;
- fDocument.getInvalidAddressRanges().add(p);
- } else {
- return success;
- }
- }
- boolean hasSource= false;
- if (file != null && lineNumber >= 0) {
- p = insertSource(p, address, file, lineNumber);
- hasSource = fFile2Storage.get(file) != null;
- }
- // insert symbol label
- final String functionName= instruction.getFuntionName();
- if (functionName != null && functionName.length() > 0 && instruction.getOffset() == 0) {
- p = fDocument.insertLabel(p, address, functionName, fShowSymbols && (!hasSource || fShowDisassembly));
- }
- // determine instruction byte length
- BigInteger instrLength= null;
- if (j < instructions.length - 1) {
- instrLength= instructions[j+1].getAdress().subtract(instruction.getAdress()).abs();
- } else if (i < mixedInstructions.length - 1) {
- int nextSrcLineIdx= i+1;
- while (nextSrcLineIdx < mixedInstructions.length) {
- IInstruction[] nextInstrs= mixedInstructions[nextSrcLineIdx].getInstructions();
- if (nextInstrs.length > 0) {
- instrLength= nextInstrs[0].getAdress().subtract(instruction.getAdress()).abs();
- break;
- }
- ++nextSrcLineIdx;
- }
- if (nextSrcLineIdx >= mixedInstructions.length) {
- break;
- }
- } else if (instructions.length == 1) {
- if (p.fAddressLength.compareTo(BigInteger.valueOf(8)) <= 0) {
- instrLength= p.fAddressLength;
- }
- }
- if (instrLength == null) {
- // cannot determine length of last instruction
- break;
- }
- final String opCode;
- // insert function name+offset instead of opcode bytes
- if (functionName != null && functionName.length() > 0) {
- opCode= functionName + '+' + instruction.getOffset();
- } else {
- opCode= ""; //$NON-NLS-1$
- }
- success= success || address.compareTo(startAddress) == 0;
- p = fDocument.insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), file, lineNumber);
- if (p == null && success) {
- break;
- }
- }
- }
-
- } catch (BadLocationException e) {
- // should not happen
- internalError(e);
- } finally {
- fUpdatePending = false;
- if (success) {
- updateInvalidSource();
- unlockScroller();
- doPending();
- updateVisibleArea();
- } else {
- unlockScroller();
- }
- }
- return success;
- }
-
- private void retrieveFrameAddress(final IExecutionDMContext targetContext, final int frame) {
- if (targetContext != null && isSuspended(targetContext)) {
- if (fUpdatePending) {
- gotoFrame(frame);
- return;
- }
- if (DEBUG) System.out.println("retrieveFrameAddress "+frame); //$NON-NLS-1$
- fUpdatePending = true;
- final DsfExecutor executor= getSession().getExecutor();
- executor.execute(new DsfRunnable() {
- public void run() {
- retrieveFrameAddressInSessionThread(targetContext, frame);
- }});
- }
- }
-
- private void retrieveFrameAddressInSessionThread(final IExecutionDMContext targetContext, final int frame) {
- final IStack stack= fServicesTracker.getService(IStack.class);
- final DsfExecutor executor= getSession().getExecutor();
- if (fTargetFrameContext == null) {
- if (frame == 0) {
- stack.getTopFrame(targetContext, new DataRequestMonitor<IFrameDMContext>(executor, null) {
- @Override
- protected void handleCompleted() {
- fUpdatePending= false;
- fTargetFrameContext= getData();
- if (fTargetFrameContext != null) {
- retrieveFrameAddressInSessionThread(targetContext, frame);
- }
- }
- });
- } else {
- // TODO retrieve other stack frame
- }
- return;
- }
- stack.getFrameData(fTargetFrameContext, new DataRequestMonitor<IFrameDMData>(executor, null) {
- @Override
- protected void handleCompleted() {
- fUpdatePending= false;
- IFrameDMData frameData= getData();
- fTargetFrameData= frameData;
- if (!isCanceled() && frameData != null) {
- final IAddress address= frameData.getAddress();
- final BigInteger addressValue= address.getValue();
- if (DEBUG) System.out.println("retrieveFrameAddress done "+getAddressText(addressValue)); //$NON-NLS-1$
- asyncExec(new Runnable() {
- public void run() {
- if (address.getSize() * 4 > fAddressSize) {
- addressSizeChanged(address.getSize() * 4);
- }
- if (frame == 0) {
- updatePC(addressValue);
- } else {
- gotoFrame(frame, addressValue);
- }
- }
-
- });
- } else {
- final IStatus status= getStatus();
- if (status != null && !status.isOK()) {
- asyncExec(new Runnable() {
- public void run() {
- ErrorDialog.openError(getSite().getShell(), "Error", null, getStatus()); //$NON-NLS-1$
- }
- });
- }
- }
- }
- });
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#getAddressSize()
+ */
+ public int getAddressSize() {
+ assert isGuiThread();
+ return fAddressSize;
}
-
- private void addressSizeChanged(int addressSize) {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#addressSizeChanged(int)
+ */
+ public void addressSizeChanged(int addressSize) {
+ assert isGuiThread();
BigInteger oldEndAddress= fEndAddress;
fEndAddress= BigInteger.ONE.shiftLeft(addressSize);
int oldAddressSize= fAddressSize;
fAddressSize= addressSize;
if (addressSize < oldAddressSize) {
fDocument.deleteDisassemblyRange(fEndAddress, oldEndAddress, true, true);
- List<AddressRangePosition> positions= fDocument.getInvalidAddressRanges();
List<AddressRangePosition> toRemove= new ArrayList<AddressRangePosition>();
- for (AddressRangePosition position : positions) {
+ for (AddressRangePosition position : fDocument.getInvalidAddressRanges()) {
if (position.fAddressOffset.compareTo(fEndAddress) >= 0) {
try {
fDocument.replace(position, position.length, ""); //$NON-NLS-1$
@@ -2209,7 +1731,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
position.fAddressLength= fEndAddress.subtract(position.fAddressOffset);
}
}
- positions.removeAll(toRemove);
+ fDocument.removeInvalidAddressRanges(toRemove);
} else if (addressSize > oldAddressSize) {
fDocument.insertInvalidAddressRange(fDocument.getLength(), 0, oldEndAddress, fEndAddress);
} else {
@@ -2223,7 +1745,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
- private AddressRangePosition getPositionOfAddress(BigInteger address) {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#getPositionOfAddress(java.math.BigInteger)
+ */
+ public AddressRangePosition getPositionOfAddress(BigInteger address) {
+ assert isGuiThread();
if (address == null || address.compareTo(BigInteger.ZERO) < 0) {
return null;
}
@@ -2254,13 +1780,13 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
refreshView(0);
} else {
doPendingPCUpdates();
- if (fTargetContext != null) {
+ if (fBackend != null && fBackend.hasDebugContext()) {
int frame = getActiveStackFrame();
- if (frame < 0 && isSuspended(fTargetContext)) {
+ if (frame < 0 && isSuspended()) {
frame= 0;
}
if (frame != fTargetFrame) {
- gotoFrame(frame);
+ gotoFrameIfActive(frame);
}
}
}
@@ -2271,101 +1797,38 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
private int getActiveStackFrame() {
- if (fTargetFrameContext != null) {
- return fTargetFrameContext.getLevel();
+ if (fBackend != null) {
+ return fBackend.getFrameLevel();
}
return -1;
}
- /**
- *
- */
protected void updateDebugContext() {
- IAdaptable debugContext= DebugUITools.getDebugContext();
- if (debugContext instanceof IDMVMContext) {
- setDebugContext((IDMVMContext)debugContext);
- }
- }
-
- protected void setDebugContext(IDMVMContext vmContext) {
- if (vmContext != null) {
- IDMContext dmContext= vmContext.getDMContext();
- String sessionId= dmContext.getSessionId();
- if (!sessionId.equals(fDebugSessionId)) {
- // switch to different session or initiate session
- if (DEBUG) System.out.println("DisassemblyPart.setDebugContext() " + sessionId); //$NON-NLS-1$
- fTargetContext= null;
- if (dmContext instanceof IFrameDMContext) {
- IFrameDMContext frame= (IFrameDMContext) dmContext;
- IExecutionDMContext executionContext= DMContexts.getAncestorOfType(frame, IExecutionDMContext.class);
- if (executionContext != null) {
- fTargetContext= executionContext;
- fTargetFrameContext= frame;
- fTargetFrame= frame.getLevel();
- }
- }
- if (fTargetContext != null) {
- if (fDebugSessionId != null) {
- if (getSession() != null) {
- try {
- // Don't call getSession() from executor; may
- // return different session by the time it runs
- final DsfSession session = getSession();
- session.getExecutor().execute(new DsfRunnable() {
- public void run() {
- session.removeServiceEventListener(DisassemblyPart.this);
- }
- });
- } catch (RejectedExecutionException e) {
- // Session is shut down.
- }
- }
- }
- fDebugSessionId= sessionId;
- if (fServicesTracker != null) {
- fServicesTracker.dispose();
- }
- fServicesTracker = new DsfServicesTracker(DsfUIPlugin.getBundleContext(), sessionId);
- if (fViewer != null) {
- debugContextChanged();
- }
+ IAdaptable context = DebugUITools.getDebugContext();
+ final IDisassemblyBackend prevBackend = fBackend;
+ fDebugSessionId = null;
+ if (context != null) {
+ if (fBackend == null || !fBackend.supportsDebugContext(context)) {
+ if (fBackend != null) {
+ fBackend.dispose();
}
- } else if (dmContext instanceof IFrameDMContext) {
- // switch to different frame
- IFrameDMContext frame= (IFrameDMContext) dmContext;
- final IDMContext[] parents= frame.getParents();
- for (IDMContext context : parents) {
- if (context instanceof IExecutionDMContext) {
- fTargetContext= (IExecutionDMContext) context;
- fTargetFrameContext= frame;
- gotoFrame(frame);
- break;
- }
+ fBackend = (IDisassemblyBackend)context.getAdapter(IDisassemblyBackend.class);
+ if (fBackend != null) {
+ fBackend.init(this);
}
}
- } else if (fDebugSessionId != null) {
- if (getSession() != null) {
- try {
- // Don't call getSession() from executor; may return
- // different session by the time it runs
- final DsfSession session = getSession();
- session.getExecutor().execute(new DsfRunnable() {
- public void run() {
- session.removeServiceEventListener(DisassemblyPart.this);
+
+ if (fBackend != null) {
+ IDisassemblyBackend.SetDebugContextResult result = fBackend.setDebugContext(context);
+ if (result != null) {
+ fDebugSessionId = result.sessionId;
+ if (result.contextChanged && fViewer != null) {
+ debugContextChanged();
+ if (prevBackend != null && fBackend != prevBackend) {
+ prevBackend.clearDebugContext();
}
- });
- } catch (RejectedExecutionException e) {
- // Session is shut down.
- }
- }
- fDebugSessionId= null;
- fTargetContext= null;
- if (fServicesTracker != null) {
- fServicesTracker.dispose();
- fServicesTracker= null;
- }
- if (fViewer != null) {
- debugContextChanged();
+ }
+ }
}
}
}
@@ -2378,16 +1841,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
if (fDebugSessionId != null) {
fJumpToAddressAction.setEnabled(true);
fAddressBar.enableAddressBox(true);
- try {
- final DsfSession session= getSession();
- session.getExecutor().execute(new DsfRunnable() {
- public void run() {
- session.addServiceEventListener(DisassemblyPart.this, null);
- }
- });
- } catch (RejectedExecutionException e) {
- // Session is shut down.
- }
updatePC(PC_UNKNOWN);
@@ -2414,66 +1867,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
firePropertyChange(PROP_SUSPENDED);
}
- /*
- * @see org.eclipse.cdt.dsf.service.DsfSession.SessionEndedListener#sessionEnded(org.eclipse.cdt.dsf.service.DsfSession)
- */
- public void sessionEnded(DsfSession endedSsession) {
- if (endedSsession.getId().equals(fDebugSessionId)) {
- asyncExec(new Runnable() {
- public void run() {
- setDebugContext(null);
- }});
- }
- }
-
- @DsfServiceEventHandler
- public void handleEvent(IExitedDMEvent event) {
- if (fTargetContext == null) {
- return;
- }
- final IExecutionDMContext context= event.getDMContext();
- if (context.equals(fTargetContext)
- || DMContexts.isAncestorOf(fTargetContext, context)) {
- asyncExec(new Runnable() {
- public void run() {
- setDebugContext(null);
- }});
- }
- }
-
- @DsfServiceEventHandler
- public void handleEvent(ISuspendedDMEvent event) {
- if (fTargetContext == null) {
- return;
- }
- final IExecutionDMContext context= event.getDMContext();
- if (context.equals(fTargetContext)
- || DMContexts.isAncestorOf(fTargetContext, context)) {
- asyncExec(new Runnable() {
- public void run() {
- updatePC(PC_UNKNOWN);
- firePropertyChange(PROP_SUSPENDED);
- }
- });
- }
- }
- @DsfServiceEventHandler
- public void handleEvent(IResumedDMEvent event) {
- if (fTargetContext == null) {
- return;
- }
- final IExecutionDMContext context= event.getDMContext();
- if (context.equals(fTargetContext)
- || DMContexts.isAncestorOf(fTargetContext, context)) {
- asyncExec(new Runnable() {
- public void run() {
- updatePC(PC_RUNNING);
- firePropertyChange(PROP_SUSPENDED);
- }
- });
- }
- }
private void attachBreakpointsAnnotationModel() {
IAnnotationModel annotationModel = fViewer.getAnnotationModel();
@@ -2502,7 +1896,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
if (fScrollPos != null) {
fScrollPos.isDeleted = true;
}
- gotoFrame(targetFrame);
+ gotoFrameIfActive(targetFrame);
} else {
refreshView((int)(refreshViewScheduled - now));
}
@@ -2588,6 +1982,9 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
* @return a position which denotes the documents position
*/
private AddressRangePosition updateAddressAnnotation(Annotation annotation, BigInteger address) {
+ if (fViewer == null) {
+ return null; // can happen during session shutdown
+ }
IAnnotationModel annotationModel = fViewer.getAnnotationModel();
annotationModel.removeAnnotation(annotation);
AddressRangePosition pos = getPCPosition(address);
@@ -2631,13 +2028,35 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
return null;
}
- private void gotoFrame(int frame, BigInteger address) {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#gotoFrame(int)
+ */
+ public void gotoFrame(int frame) {
+ assert isGuiThread();
+ gotoFrame(frame, PC_UNKNOWN);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#gotoFrameIfActive(int)
+ */
+ public void gotoFrameIfActive(int frame) {
+ assert isGuiThread();
+ if (fActive) {
+ gotoFrame(frame);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#gotoFrame(int, java.math.BigInteger)
+ */
+ public void gotoFrame(int frame, BigInteger address) {
+ assert isGuiThread();
if (DEBUG) System.out.println("gotoFrame " + frame + " " + getAddressText(address)); //$NON-NLS-1$ //$NON-NLS-2$
fTargetFrame = frame;
fFrameAddress = address;
if (fTargetFrame == -1) {
fTargetFrame = getActiveStackFrame();
- if (fTargetFrame < 0 && isSuspended(fTargetContext)) {
+ if (fTargetFrame < 0 && fBackend != null && fBackend.isSuspended()) {
fTargetFrame= 0;
}
if (fTargetFrame == -1) {
@@ -2652,7 +2071,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
if (fFrameAddress.compareTo(PC_UNKNOWN) == 0) {
if (!fUpdatePending) {
fGotoFramePending = false;
- retrieveFrameAddress(fTargetContext, fTargetFrame);
+ if (fBackend != null && fBackend.hasDebugContext() && fBackend.isSuspended()) {
+ if (DEBUG) System.out.println("retrieveFrameAddress "+frame); //$NON-NLS-1$
+ fUpdatePending = true;
+ fBackend.retrieveFrameAddress(fTargetFrame);
+ }
}
return;
}
@@ -2694,14 +2117,18 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyPart#isConnected()
*/
public final boolean isConnected() {
- return fDebugSessionId != null && fTargetContext != null;
+ if (fDebugSessionId == null) {
+ return false;
+ }
+
+ return (fBackend != null) ? fBackend.hasDebugContext() : false;
}
/*
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyPart#isSuspended()
*/
public final boolean isSuspended() {
- return isConnected() && isSuspended(fTargetContext);
+ return isConnected() && fBackend.isSuspended();
}
/*
@@ -2710,6 +2137,10 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
public final ISourceViewer getTextViewer() {
return fViewer;
}
+
+ public final boolean hasViewer() {
+ return fViewer != null;
+ }
/*
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyPart#addRulerContextMenuListener(org.eclipse.jface.action.IMenuListener)
@@ -2725,62 +2156,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fRulerContextMenuListeners.remove(listener);
}
- private boolean isSuspended(final IExecutionDMContext targetContext) {
- DsfSession session = getSession();
- if (session == null || !session.isActive()) {
- return false;
- }
- if (session.getExecutor().isInExecutorThread()) {
- IRunControl runControl = getRunControl();
- if (runControl == null) {
- return false;
- } else {
- return runControl.isSuspended(targetContext);
- }
- }
- Query<Boolean> query = new Query<Boolean>() {
- @Override
- protected void execute(DataRequestMonitor<Boolean> rm) {
- try {
- IRunControl runControl = getRunControl();
- if (runControl == null) {
- rm.setData(false);
- } else {
- rm.setData(runControl.isSuspended(targetContext));
- }
- } finally {
- rm.done();
- }
- }
- };
- session.getExecutor().execute(query);
- try {
- return query.get();
- } catch (InterruptedException exc) {
- } catch (ExecutionException exc) {
- }
- return false;
- }
-
- private IRunControl getRunControl() {
- return getService(IRunControl.class);
- }
-
- /*default*/ DsfSession getSession() {
- return DsfSession.getSession(fDebugSessionId);
- }
-
- /*default*/ <V> V getService(Class<V> serviceClass) {
- if (fServicesTracker != null) {
- return fServicesTracker.getService(serviceClass);
- }
- return null;
- }
-
- /*default*/ IFrameDMContext getTargetFrameContext() {
- return fTargetFrameContext;
- }
-
/**
* Schedule the retrieval of a module time stamp for the given address.
* Should return a <code>Long</code> object in case the value was computed,
@@ -2812,6 +2187,12 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
+ /**
+ * Act on the first PC in the pending list that is not a special value
+ * (UNKNOWN, RUNNING), discarding all special value entries leading up to
+ * it. If the list only has special values, act on the last one and clear
+ * the list.
+ */
private void doPendingPCUpdates() {
if (fPendingPCUpdates.isEmpty()) {
return;
@@ -2870,8 +2251,10 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
*
* @param pc Current pc address. -1 means retrieve pc from top frame, -2
* means target resumed
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#updatePC(java.math.BigInteger)
*/
- private void updatePC(BigInteger pc) {
+ public void updatePC(BigInteger pc) {
+ assert isGuiThread();
if (!fPendingPCUpdates.isEmpty()) {
BigInteger last = fPendingPCUpdates.get(fPendingPCUpdates.size()-1);
if (last.compareTo(BigInteger.ZERO) < 0) {
@@ -2933,14 +2316,18 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
- private void doPending() {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#doPending()
+ */
+ public void doPending() {
+ assert isGuiThread();
if (fViewer == null || fDocument == null) {
return;
}
if (fUpdateSourcePending) {
updateInvalidSource();
}
- boolean sourceValid= fDocument.getInvalidSource().isEmpty();
+ boolean sourceValid= !fDocument.hasInvalidSourcePositions();
if (sourceValid || fShowDisassembly) {
if (fGotoFramePending) {
gotoFrame(fTargetFrame, fFrameAddress);
@@ -2965,8 +2352,10 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
* Safely run given runnable in a state when no update is pending.
* Delays execution by 10 ms if update is currently pending.
* @param doit
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#doScrollLocked(java.lang.Runnable)
*/
- private void doScrollLocked(final Runnable doit) {
+ public void doScrollLocked(final Runnable doit) {
+ assert isGuiThread();
if (fViewer == null || fDebugSessionId == null) {
// disposed
return;
@@ -3011,7 +2400,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
- private void lockScroller() {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#lockScroller()
+ */
+ public void lockScroller() {
+ assert isGuiThread();
assert fScrollPos == null;
if (isOpcodeRulerVisible()) {
fRedrawControl = fViewer.getControl();
@@ -3051,7 +2444,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
- private void unlockScroller() {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#unlockScroller()
+ */
+ public void unlockScroller() {
+ assert isGuiThread();
try {
if (fScrollPos == null) {
return;
@@ -3099,7 +2496,19 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
- private void insertSource(SourcePosition pos) {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#insertSource(org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition)
+ */
+ public void insertSource(AddressRangePosition _pos) {
+ assert isGuiThread();
+ // IDisassemblyPartCallback does not have visibility to the
+ // SourcePosition type, which is DSF-specific, so it uses the base type
+ if (!(_pos instanceof SourcePosition)) {
+ assert false : "Caller should have passed in a SourcePosition"; //$NON-NLS-1$
+ return;
+ }
+ SourcePosition pos = (SourcePosition)_pos;
+
if (!fShowSource) {
fDocument.insertSource(pos, "", pos.fLine, true); //$NON-NLS-1$
return;
@@ -3213,8 +2622,8 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
try {
// make sure we start with first overlapping position
AddressRangePosition pos = fDocument.getModelPosition(startOffset);
- assert pos != null;
if (pos == null) {
+ assert false;
return;
}
it = fDocument.getPositionIterator(DisassemblyDocument.CATEGORY_MODEL, pos.offset);
@@ -3296,56 +2705,37 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
-
- private AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int lineNr) {
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#insertSource(org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition, java.math.BigInteger, java.lang.String, int)
+ */
+ public AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int lineNumber) {
+ assert isGuiThread();
Object sourceElement = null;
if (fFile2Storage.containsKey(file)) {
sourceElement = fFile2Storage.get(file);
} else {
- final ISourceLookupDMContext ctx= DMContexts.getAncestorOfType(fTargetContext, ISourceLookupDMContext.class);
- final DsfExecutor executor= getSession().getExecutor();
- Query<Object> query= new Query<Object>() {
- @Override
- protected void execute(final DataRequestMonitor<Object> rm) {
- final DataRequestMonitor<Object> request= new DataRequestMonitor<Object>(executor, rm) {
- @Override
- protected void handleSuccess() {
- rm.setData(getData());
- rm.done();
- }
- };
- final ISourceLookup lookup= getService(ISourceLookup.class);
- lookup.getSource(ctx, file, request);
- }
- };
- try {
- getSession().getExecutor().execute(query);
- sourceElement= query.get();
- } catch (InterruptedException exc) {
- internalError(exc);
- } catch (ExecutionException exc) {
- internalError(exc);
- }
- if (sourceElement instanceof File) {
- sourceElement = new LocalFileStorage((File)sourceElement);
- }
- if (sourceElement instanceof IStorage) {
- if (!(sourceElement instanceof IFile)) {
- // try to resolve as resource
- final IPath location= ((IStorage) sourceElement).getFullPath();
- if (location != null) {
- IFile iFile = ResourceLookup.selectFileForLocation(location, null);
- if (iFile != null) {
- sourceElement = iFile;
- }
+ sourceElement = fBackend.insertSource(pos, address, file, lineNumber);
+ }
+ if (sourceElement instanceof File) {
+ sourceElement = new LocalFileStorage((File)sourceElement);
+ }
+ if (sourceElement instanceof IStorage) {
+ if (!(sourceElement instanceof IFile)) {
+ // try to resolve as resource
+ final IPath location= ((IStorage) sourceElement).getFullPath();
+ if (location != null) {
+ IFile iFile = ResourceLookup.selectFileForLocation(location, null);
+ if (iFile != null) {
+ sourceElement = iFile;
}
}
- fFile2Storage.put(file, sourceElement);
- } else {
- fFile2Storage.put(file, null);
- logWarning(DisassemblyMessages.Disassembly_log_error_locateFile+file, null);
}
+ fFile2Storage.put(file, sourceElement);
+ } else {
+ fFile2Storage.put(file, null);
+ logWarning(DisassemblyMessages.Disassembly_log_error_locateFile+file, null);
}
+
if (sourceElement instanceof IStorage) {
SourceFileInfo fi = fDocument.getSourceInfo((IStorage)sourceElement);
if (fi == null) {
@@ -3360,8 +2750,9 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
fi.fReadingJob.schedule();
}
- pos = fDocument.insertInvalidSource(pos, address, fi, lineNr);
+ pos = fDocument.insertInvalidSource(pos, address, fi, lineNumber);
}
+
return pos;
}
@@ -3412,31 +2803,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
}
}
}
-
- public static BigInteger decodeAddress(String string) {
- if (string.startsWith("0x")) { //$NON-NLS-1$
- return new BigInteger(string.substring(2), 16);
- }
- return new BigInteger(string);
- }
-
- private static String getAddressText(BigInteger address) {
- if (address == null) {
- return "<null>"; //$NON-NLS-1$
- }
- if (address.compareTo(BigInteger.ZERO) < 0) {
- return address.toString();
- }
- String hex = address.toString(16);
- return "0x" + "0000000000000000".substring(hex.length() + (address.bitLength() <= 32 ? 8 : 0)) + hex; //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- static void internalError(Throwable e) {
- if (DEBUG) {
- System.err.println("Disassembly: Internal error"); //$NON-NLS-1$
- e.printStackTrace();
- }
- }
public AddressBarContributionItem getAddressBar() {
return fAddressBar;
@@ -3459,4 +2825,105 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
ctxService.deactivateContext(fContextActivation);
}
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#handleTargetSuspended()
+ */
+ public void handleTargetSuspended() {
+ asyncExec(new Runnable() {
+ public void run() {
+ updatePC(PC_UNKNOWN);
+ firePropertyChange(PROP_SUSPENDED);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#handleTargetResumed()
+ */
+ public void handleTargetResumed() {
+ asyncExec(new Runnable() {
+ public void run() {
+ updatePC(PC_RUNNING);
+ firePropertyChange(PROP_SUSPENDED);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#handleTargetEnded()
+ */
+ public void handleTargetEnded() {
+ asyncExec(new Runnable() {
+ public void run() {
+ fDebugSessionId = null;
+ debugContextChanged();
+ }
+ });
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#setUpdatePending(boolean)
+ */
+ public void setUpdatePending(boolean pending) {
+ fUpdatePending = pending;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#getUpdatePending()
+ */
+ public boolean getUpdatePending() {
+ assert isGuiThread();
+ return fUpdatePending;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#setGotoAddressPending(java.math.BigInteger)
+ */
+ public void setGotoAddressPending(BigInteger address) {
+ assert isGuiThread();
+ fGotoAddressPending = address;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#getGotoAddressPending()
+ */
+ public BigInteger getGotoAddressPending() {
+ assert isGuiThread();
+ return fGotoAddressPending;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#getDocument()
+ */
+ public IDisassemblyDocument getDocument() {
+ assert isGuiThread();
+ return fDocument;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#getStorageForFile(java.lang.String)
+ */
+ public Object getStorageForFile(String file) {
+ assert isGuiThread();
+ return fFile2Storage.get(file);
+ }
+
+ /**
+ * A passthru from the text hover code to the backend.
+ */
+ public String evaluateExpression(String expr) {
+ if (fBackend != null) {
+ return fBackend.evaluateExpression(expr);
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /**
+ * Most methods in IDisassemblyPartCallback require execution on the GUI thread.
+ */
+ private static boolean isGuiThread() {
+ return Display.getCurrent() != null;
+ }
}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java
index 585e023af6..463d947eb9 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyTextHover.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2009 Wind River Systems and others.
+ * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,25 +10,10 @@
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly;
-import java.util.concurrent.ExecutionException;
-
-import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
-import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
-import org.eclipse.cdt.dsf.concurrent.Query;
-import org.eclipse.cdt.dsf.datamodel.DMContexts;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyPosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.LabelPosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocument;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyPosition;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.LabelPosition;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourcePosition;
-import org.eclipse.cdt.dsf.debug.service.IExpressions;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues;
-import org.eclipse.cdt.dsf.debug.service.IRunControl;
-import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext;
-import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData;
-import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
-import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.cdt.internal.ui.text.CWordFinder;
import org.eclipse.core.runtime.IStatus;
@@ -112,48 +97,7 @@ public class DisassemblyTextHover implements ITextHover {
* @return expression value or <code>null</code>
*/
private String evaluateExpression(final String expr) {
- final IFrameDMContext frameDmc= fDisassemblyPart.getTargetFrameContext();
- if (frameDmc == null) {
- return null;
- }
- final DsfExecutor executor= fDisassemblyPart.getSession().getExecutor();
- Query<FormattedValueDMData> query= new Query<FormattedValueDMData>() {
- @Override
- protected void execute(final DataRequestMonitor<FormattedValueDMData> rm) {
- IExecutionDMContext exeCtx = DMContexts.getAncestorOfType(frameDmc, IExecutionDMContext.class);
- final IRunControl rc= fDisassemblyPart.getService(IRunControl.class);
- if (rc == null || !rc.isSuspended(exeCtx)) {
- rm.done();
- return;
- }
- final IExpressions expressions= fDisassemblyPart.getService(IExpressions.class);
- if (expressions == null) {
- rm.done();
- return;
- }
- IExpressionDMContext exprDmc= expressions.createExpression(frameDmc, expr);
- final FormattedValueDMContext valueDmc= expressions.getFormattedValueContext(exprDmc, IFormattedValues.NATURAL_FORMAT);
- expressions.getFormattedExpressionValue(valueDmc, new DataRequestMonitor<FormattedValueDMData>(executor, rm) {
- @Override
- protected void handleSuccess() {
- FormattedValueDMData data= getData();
- rm.setData(data);
- rm.done();
- }
- });
- }};
-
- executor.execute(query);
- FormattedValueDMData data= null;
- try {
- data= query.get();
- } catch (InterruptedException exc) {
- } catch (ExecutionException exc) {
- }
- if (data != null) {
- return data.getFormattedValue();
- }
- return null;
+ return fDisassemblyPart.evaluateExpression(expr);
}
}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/EditionFinderJob.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/EditionFinderJob.java
index 40b3249882..effc04e472 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/EditionFinderJob.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/EditionFinderJob.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008 Wind River Systems, Inc. and others.
+ * Copyright (c) 2010 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -22,6 +22,7 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
+import static org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils.internalError;
/**
* A job to find a suitable edition from the local history
@@ -69,7 +70,7 @@ class EditionFinderJob extends Job {
token.wait(1000);
}
} catch (InterruptedException e) {
- DisassemblyPart.internalError(e);
+ internalError(e);
}
token = fDisassemblyPart.retrieveModuleTimestamp(fAddress);
}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/FunctionOffsetRulerColumn.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/FunctionOffsetRulerColumn.java
index 216154959b..119cfb845c 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/FunctionOffsetRulerColumn.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/FunctionOffsetRulerColumn.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2009 Wind River Systems and others.
+ * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,9 +10,9 @@
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyPosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocument;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyPosition;
import org.eclipse.jface.text.BadLocationException;
/**
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/SourcePosition.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/SourcePosition.java
index f5138df554..77e723f8cd 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/SourcePosition.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/SourcePosition.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 Wind River Systems and others.
+ * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,10 +8,13 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model;
+package org.eclipse.cdt.dsf.debug.internal.ui.disassembly;
import java.math.BigInteger;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition;
+import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourceFileInfo;
+
/**
* SourcePosition
*/
@@ -46,5 +49,13 @@ public class SourcePosition extends AddressRangePosition {
fFileInfo = fileInfo;
fLine = line;
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition#toString()
+ */
+ @Override
+ public String toString() {
+ return super.toString() + "->["+fFileInfo.fFileKey + ':' + fLine + ']'; //$NON-NLS-1$
+ }
}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/ActionGotoAddress.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/ActionGotoAddress.java
index 9002f0fc7e..31359df011 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/ActionGotoAddress.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/ActionGotoAddress.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2009 Wind River Systems, Inc. and others.
+ * Copyright (c) 2008, 2010 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,10 +10,11 @@
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.actions;
+import static org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils.decodeAddress;
+
import java.math.BigInteger;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyMessages;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyPart;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IDisassemblyPart;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.jface.dialogs.IDialogConstants;
@@ -34,7 +35,7 @@ public final class ActionGotoAddress extends AbstractDisassemblyAction {
if (input == null || input.length() == 0)
return " "; //$NON-NLS-1$
try {
- BigInteger address= DisassemblyPart.decodeAddress(input);
+ BigInteger address= decodeAddress(input);
if (address.compareTo(BigInteger.ZERO) < 0) {
return DisassemblyMessages.Disassembly_GotoAddressDialog_error_invalid_address;
}
@@ -57,7 +58,7 @@ public final class ActionGotoAddress extends AbstractDisassemblyAction {
InputDialog dlg = new InputDialog(shell, dlgTitle, dlgLabel, defaultValue, validator);
if (dlg.open() == IDialogConstants.OK_ID) {
String value = dlg.getValue();
- BigInteger address= DisassemblyPart.decodeAddress(value);
+ BigInteger address= decodeAddress(value);
DsfUIPlugin.getDefault().getDialogSettings().put("gotoAddress", value); //$NON-NLS-1$
getDisassemblyPart().gotoAddress(address);
}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/JumpToAddressAction.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/JumpToAddressAction.java
index 372977be8c..a60ec2c69d 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/JumpToAddressAction.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/actions/JumpToAddressAction.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 Texas Instruments, Inc. and others.
+ * Copyright (c) 2009, 2010 Texas Instruments, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -16,6 +16,7 @@ import java.math.BigInteger;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyMessages;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyPart;
import org.eclipse.jface.action.Action;
+import static org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils.decodeAddress;
public class JumpToAddressAction extends Action {
@@ -37,7 +38,7 @@ public class JumpToAddressAction extends Action {
location = location.trim();
BigInteger address = null;
try {
- address = DisassemblyPart.decodeAddress(location);
+ address = decodeAddress(location);
if (address.compareTo(BigInteger.ZERO) < 0) {
address = null;
addressBar.setWarningIconVisible(true);
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/BreakpointsAnnotationModel.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/BreakpointsAnnotationModel.java
index bf9edc43bd..cce489456e 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/BreakpointsAnnotationModel.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/BreakpointsAnnotationModel.java
@@ -18,6 +18,8 @@ import java.util.Iterator;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.LabelPosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IBreakpointLocationProvider;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyDocument.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyDocument.java
index 79c5248bc4..f3af3f1b2c 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyDocument.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyDocument.java
@@ -10,14 +10,23 @@
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model;
+import static org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyUtils.DEBUG;
+
import java.io.File;
import java.math.BigInteger;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyPosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.ErrorPosition;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyDocument;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.LabelPosition;
+import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.SourcePosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.text.REDDocument;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.text.REDTextStore;
import org.eclipse.core.resources.IStorage;
@@ -32,21 +41,32 @@ import org.eclipse.jface.text.DocumentRewriteSessionType;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
+import org.eclipse.swt.widgets.Display;
/**
* DisassemblyDocument
*/
-public class DisassemblyDocument extends REDDocument {
+public class DisassemblyDocument extends REDDocument implements IDisassemblyDocument {
public final static String CATEGORY_MODEL = "category_model"; //$NON-NLS-1$
public final static String CATEGORY_DISASSEMBLY = "category_disassembly"; //$NON-NLS-1$
public final static String CATEGORY_SOURCE = "category_source"; //$NON-NLS-1$
public final static String CATEGORY_LABELS = "category_labels"; //$NON-NLS-1$
- private final static boolean DEBUG = false;
+ /**
+ * For ease of troubleshooting, don't add or remove from this list directly.
+ * Use the add/remove methods. Note that we're not the only ones that
+ * manipulate the list. This list should be accessed only from the GUI thread
+ */
+ private final List<AddressRangePosition> fInvalidAddressRanges = new ArrayList<AddressRangePosition>();
- private final ArrayList<AddressRangePosition> fInvalidAddressRanges = new ArrayList<AddressRangePosition>();
- private final ArrayList<SourcePosition> fInvalidSource = new ArrayList<SourcePosition>();
+ /**
+ * For ease of troubleshooting, don't add or remove from this list directly.
+ * Use the add/remove methods. Note that we're not the only ones that
+ * manipulate the list. This list should be accessed only from the GUI thread
+ */
+ private final List<SourcePosition> fInvalidSource = new ArrayList<SourcePosition>();
+
private final Map<IStorage, SourceFileInfo> fFileInfoMap = new HashMap<IStorage, SourceFileInfo>();
private int fMaxFunctionLength = 0;
@@ -88,14 +108,19 @@ public class DisassemblyDocument extends REDDocument {
*/
@Override
public void dispose() {
+ assert isGuiThread();
+
super.dispose();
+
// cleanup source info
for (Iterator<SourceFileInfo> iter = fFileInfoMap.values().iterator(); iter.hasNext();) {
SourceFileInfo fi = iter.next();
fi.dispose();
}
fFileInfoMap.clear();
+
fInvalidAddressRanges.clear();
+
fInvalidSource.clear();
}
@@ -109,12 +134,9 @@ public class DisassemblyDocument extends REDDocument {
completeInitialization();
}
- public List<AddressRangePosition> getInvalidAddressRanges() {
- return fInvalidAddressRanges;
- }
-
- public List<SourcePosition> getInvalidSource() {
- return fInvalidSource;
+ public AddressRangePosition[] getInvalidAddressRanges() {
+ assert isGuiThread();
+ return fInvalidAddressRanges.toArray(new AddressRangePosition[fInvalidAddressRanges.size()]);
}
public void setMaxOpcodeLength(int opcodeLength) {
@@ -690,9 +712,8 @@ public class DisassemblyDocument extends REDDocument {
if (list == null) {
throw new BadPositionCategoryException();
}
- int idx;
- idx = computeIndexInPositionListLast(list, pos.fAddressOffset);
- list.add(idx, pos);
+ if (DEBUG) System.out.println("Adding position to category <" + category + "> : " + pos); //$NON-NLS-1$ //$NON-NLS-2$
+ list.add(computeIndexInPositionListLast(list, pos.fAddressOffset), pos);
}
/**
@@ -771,7 +792,10 @@ public class DisassemblyDocument extends REDDocument {
@Override
public void removePosition(String category, Position position) throws BadPositionCategoryException {
super.removePosition(category, position);
- if (category != CATEGORY_MODEL && position instanceof AddressRangePosition) {
+
+ if (DEBUG && isOneOfOurs(category)) System.out.println("Removing position from category(" + category + ") :" + position); //$NON-NLS-1$ //$NON-NLS-2$
+
+ if (!category.equals(CATEGORY_MODEL) && position instanceof AddressRangePosition) {
super.removePosition(CATEGORY_MODEL, position);
}
}
@@ -781,6 +805,15 @@ public class DisassemblyDocument extends REDDocument {
if (toRemove.isEmpty()) {
return;
}
+
+ if (DEBUG && isOneOfOurs(category)) {
+ System.out.println("Removing positions from category(" + category + ')'); //$NON-NLS-1$
+ int i = 0;
+ for (AddressRangePosition pos : toRemove) {
+ System.out.println("[" + i++ +"] " + pos); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
List<Position> positions = (List<Position>) getDocumentManagedPositions().get(category);
if (positions != null) {
positions.removeAll(toRemove);
@@ -857,6 +890,16 @@ public class DisassemblyDocument extends REDDocument {
pos.offset += delta;
}
}
+
+ if (DEBUG) {
+ String escapedText = null;
+ if (text != null) {
+ escapedText = text.replace(new StringBuffer("\n"), new StringBuffer("\\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ escapedText = escapedText.replace(new StringBuffer("\r"), new StringBuffer("\\r")); //$NON-NLS-1$ //$NON-NLS-2$
+ escapedText = escapedText.replace(new StringBuffer("\t"), new StringBuffer("\\t")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ System.out.println("Calling AbstractDocument.replace("+insertPos.offset+','+replaceLength+",\""+escapedText+"\")"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+ }
super.replace(insertPos.offset, replaceLength, text);
}
@@ -869,6 +912,7 @@ public class DisassemblyDocument extends REDDocument {
*/
public AddressRangePosition insertAddressRange(AddressRangePosition pos, AddressRangePosition insertPos, String line, boolean addToModel)
throws BadLocationException {
+ assert isGuiThread();
final BigInteger address = insertPos.fAddressOffset;
BigInteger length = insertPos.fAddressLength;
if (pos == null) {
@@ -896,7 +940,7 @@ public class DisassemblyDocument extends REDDocument {
it.remove();
removeModelPosition(overlap);
if (!overlap.fValid) {
- fInvalidAddressRanges.remove(overlap);
+ removeInvalidAddressRange(overlap);
}
} while(!pos.containsAddress(address.add(length.subtract(BigInteger.ONE))));
}
@@ -914,7 +958,7 @@ public class DisassemblyDocument extends REDDocument {
newEndAddress = newStartAddress;
} else {
replaceLength += pos.length;
- fInvalidAddressRanges.remove(pos);
+ removeInvalidAddressRange(pos);
removeDisassemblyPosition(pos);
pos = null;
}
@@ -940,16 +984,12 @@ public class DisassemblyDocument extends REDDocument {
return pos;
}
- /**
- * @param pos
- * @param address
- * @param length
- * @param instruction
- * @throws BadPositionCategoryException
- * @throws BadLocationException
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyDocument#insertDisassemblyLine(org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition, java.math.BigInteger, int, java.lang.String, java.lang.String, java.lang.String, int)
*/
public AddressRangePosition insertDisassemblyLine(AddressRangePosition pos, BigInteger address, int length, String opcode, String instruction, String file, int lineNr)
throws BadLocationException {
+ assert isGuiThread();
String disassLine = null;
if (instruction == null || instruction.length() == 0) {
disassLine = ""; //$NON-NLS-1$
@@ -1037,6 +1077,7 @@ public class DisassemblyDocument extends REDDocument {
public AddressRangePosition insertErrorLine(AddressRangePosition pos, BigInteger address, BigInteger length, String line)
throws BadLocationException {
+ assert isGuiThread();
int hashCode = line.hashCode();
final long alignment = fErrorAlignment;
if (alignment > 1 && !(pos instanceof ErrorPosition)) {
@@ -1053,7 +1094,7 @@ public class DisassemblyDocument extends REDDocument {
if (pos.fAddressLength.compareTo(BigInteger.ZERO) == 0) {
replace(pos, pos.length, null);
removeModelPosition(pos);
- fInvalidAddressRanges.remove(pos);
+ removeInvalidAddressRange(pos);
pos = null;
} else {
pos.fAddressOffset = pos.fAddressOffset.add(mergeLen);
@@ -1081,7 +1122,7 @@ public class DisassemblyDocument extends REDDocument {
if (pos.fAddressLength.compareTo(BigInteger.ZERO) == 0) {
replace(pos, pos.length, null);
removeModelPosition(pos);
- fInvalidAddressRanges.remove(pos);
+ removeInvalidAddressRange(pos);
pos = null;
}
if (DEBUG) checkConsistency();
@@ -1101,7 +1142,7 @@ public class DisassemblyDocument extends REDDocument {
pos = insertAddressRange(pos, errorPos, errorLine, true);
addDisassemblyPosition(errorPos);
if (!errorPos.fValid) {
- fInvalidAddressRanges.add(errorPos);
+ addInvalidAddressRange(errorPos);
}
length = length.subtract(posLen);
address = address.add(posLen);
@@ -1110,15 +1151,12 @@ public class DisassemblyDocument extends REDDocument {
return pos;
}
- /**
- * @param pos
- * @param address
- * @param label
- * @throws BadLocationException
- * @throws BadPositionCategoryException
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyDocument#insertLabel(org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition, java.math.BigInteger, java.lang.String, boolean)
*/
public AddressRangePosition insertLabel(AddressRangePosition pos, BigInteger address, String label, boolean showLabels)
throws BadLocationException {
+ assert isGuiThread();
String labelLine = showLabels ? label + ":\n" : ""; //$NON-NLS-1$ //$NON-NLS-2$
LabelPosition labelPos = getLabelPosition(address);
if (labelPos != null) {
@@ -1158,7 +1196,7 @@ public class DisassemblyDocument extends REDDocument {
pos.length = sourceLines.length();
pos.fLine = line;
pos.fValid = true;
- fInvalidSource.remove(pos);
+ removeInvalidSourcePosition(pos);
replace(pos, oldLength, sourceLines);
if (!endOfSource) {
if (pos.length > 0) {
@@ -1167,7 +1205,7 @@ public class DisassemblyDocument extends REDDocument {
pos = new SourcePosition(pos.offset+pos.length, 0, pos.fAddressOffset, pos.fFileInfo, line, false);
addSourcePosition(pos);
addModelPosition(pos);
- fInvalidSource.add(pos);
+ addInvalidSourcePositions(pos);
} else {
//TLETODO need more checks for correct source pos
pos = oldPos;
@@ -1188,6 +1226,7 @@ public class DisassemblyDocument extends REDDocument {
* @return
*/
public AddressRangePosition insertInvalidSource(AddressRangePosition pos, BigInteger address, SourceFileInfo fi, int lineNr) {
+ assert isGuiThread();
SourcePosition sourcePos = getSourcePosition(address);
if (sourcePos != null) {
return pos;
@@ -1198,7 +1237,7 @@ public class DisassemblyDocument extends REDDocument {
pos = insertAddressRange(pos, sourcePos, sourceLine, true);
addSourcePosition(sourcePos);
assert !fInvalidSource.contains(sourcePos);
- fInvalidSource.add(sourcePos);
+ addInvalidSourcePositions(sourcePos);
} catch (BadLocationException e) {
internalError(e);
}
@@ -1213,6 +1252,7 @@ public class DisassemblyDocument extends REDDocument {
* @return
*/
public AddressRangePosition insertInvalidAddressRange(int offset, int replaceLength, BigInteger startAddress, BigInteger endAddress) {
+ assert isGuiThread();
String periods = "...\n"; //$NON-NLS-1$
AddressRangePosition newPos = new AddressRangePosition(offset, periods.length(), startAddress, endAddress
.subtract(startAddress), false);
@@ -1220,7 +1260,7 @@ public class DisassemblyDocument extends REDDocument {
addModelPositionFirst(newPos);
replace(newPos, replaceLength, periods);
addDisassemblyPosition(newPos);
- fInvalidAddressRanges.add(newPos);
+ addInvalidAddressRange(newPos);
} catch (BadLocationException e) {
internalError(e);
}
@@ -1232,6 +1272,7 @@ public class DisassemblyDocument extends REDDocument {
}
public void deleteDisassemblyRange(BigInteger startAddress, BigInteger endAddress, boolean invalidate, boolean collapse) {
+ assert isGuiThread();
DocumentRewriteSession session = startRewriteSession(DocumentRewriteSessionType.STRICTLY_SEQUENTIAL);
try {
String replacement = invalidate ? "...\n" : null; //$NON-NLS-1$
@@ -1267,7 +1308,7 @@ public class DisassemblyDocument extends REDDocument {
lastPos.fAddressLength = lastPos.fAddressLength.add(pos.fAddressLength);
toRemove.add(pos);
if (!pos.fValid) {
- fInvalidAddressRanges.remove(pos);
+ removeInvalidAddressRange(pos);
}
pos = null;
if (posEndAddress.compareTo(endAddress) < 0) {
@@ -1293,7 +1334,7 @@ public class DisassemblyDocument extends REDDocument {
if (pos != null) {
if (pos.fValid && invalidate) {
pos.fValid = false;
- fInvalidAddressRanges.add(pos);
+ addInvalidAddressRange(pos);
}
lastPos = pos;
}
@@ -1306,6 +1347,7 @@ public class DisassemblyDocument extends REDDocument {
}
public void invalidateSource() {
+ assert isGuiThread();
Iterator<Position> it;
try {
it = getPositionIterator(CATEGORY_SOURCE, 0);
@@ -1317,11 +1359,33 @@ public class DisassemblyDocument extends REDDocument {
SourcePosition srcPos = (SourcePosition)it.next();
if (srcPos != null && srcPos.fValid) {
srcPos.fValid = false;
- assert !getInvalidSource().contains(srcPos);
- getInvalidSource().add(srcPos);
+ assert !fInvalidSource.contains(srcPos);
+ addInvalidSourcePositions(srcPos);
}
}
}
+
+ public SourcePosition[] getInvalidSourcePositions() {
+ assert isGuiThread();
+ return fInvalidSource.toArray(new SourcePosition[fInvalidSource.size()]);
+ }
+
+ public boolean addInvalidSourcePositions(SourcePosition srcPos) {
+ assert isGuiThread();
+ if (DEBUG) System.out.println("Adding invalid source position to list: " + srcPos); //$NON-NLS-1$
+ return fInvalidSource.add(srcPos);
+ }
+
+ public boolean removeInvalidSourcePosition(SourcePosition srcPos) {
+ assert isGuiThread();
+ if (DEBUG) System.out.println("Removing invalid source position from list: " + srcPos); //$NON-NLS-1$
+ return fInvalidSource.remove(srcPos);
+ }
+
+ public boolean hasInvalidSourcePositions() {
+ assert isGuiThread();
+ return fInvalidSource.size() > 0;
+ }
public void invalidateDisassemblyWithSource(boolean removeDisassembly) {
for (Iterator<SourceFileInfo> it = fFileInfoMap.values().iterator(); it.hasNext();) {
@@ -1338,6 +1402,7 @@ public class DisassemblyDocument extends REDDocument {
* @throws BadLocationException
*/
public void deleteLineRange(int start, int end) throws BadLocationException {
+ assert isGuiThread();
if (start >= end) {
return;
}
@@ -1365,9 +1430,9 @@ public class DisassemblyDocument extends REDDocument {
toRemove.add(p);
if (!p.fValid) {
if (p instanceof SourcePosition) {
- getInvalidSource().remove(p);
+ removeInvalidSourcePosition((SourcePosition)p);
} else {
- getInvalidAddressRanges().remove(p);
+ removeInvalidAddressRange(p);
}
}
if (addressLength.compareTo(BigInteger.ZERO) > 0 && p.fAddressOffset.compareTo(endPos.fAddressOffset) >= 0) {
@@ -1446,4 +1511,35 @@ public class DisassemblyDocument extends REDDocument {
}
}
+ public void addInvalidAddressRange(AddressRangePosition pos) {
+ assert isGuiThread();
+ if (DEBUG) System.out.println("Adding to invalid range list: " + pos); //$NON-NLS-1$
+ fInvalidAddressRanges.add(pos);
+ }
+
+ public void removeInvalidAddressRanges(Collection<AddressRangePosition> positions) {
+ assert isGuiThread();
+ if (DEBUG) {
+ for (AddressRangePosition pos : positions)
+ System.out.println("Removing from invalid range list: " + pos); //$NON-NLS-1$
+ }
+ fInvalidAddressRanges.removeAll(positions);
+ }
+
+ public void removeInvalidAddressRange(AddressRangePosition pos) {
+ assert isGuiThread();
+ if (DEBUG) System.out.println("Removing from invalid range list: " + pos); //$NON-NLS-1$
+ fInvalidAddressRanges.remove(pos);
+ }
+
+ private static boolean isGuiThread() {
+ return Display.getCurrent() != null;
+ }
+
+ private static boolean isOneOfOurs(String category) {
+ return category.equals(CATEGORY_MODEL) ||
+ category.equals(CATEGORY_DISASSEMBLY) ||
+ category.equals(CATEGORY_LABELS) ||
+ category.equals(CATEGORY_SOURCE);
+ }
}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyWithSourcePosition.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyWithSourcePosition.java
index 3b466857f2..837a29df19 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyWithSourcePosition.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/model/DisassemblyWithSourcePosition.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2008 Wind River Systems and others.
+ * Copyright (c) 2007, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -12,6 +12,8 @@ package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model;
import java.math.BigInteger;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyPosition;
+
/**
* DisassemblyWithSourcePosition
*/
@@ -42,5 +44,13 @@ public class DisassemblyWithSourcePosition extends DisassemblyPosition {
public int getLine() {
return fLine;
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyPosition#toString()
+ */
+ @Override
+ public String toString() {
+ return super.toString() + "->["+fFile + ':' + fLine + ']'; //$NON-NLS-1$
+ }
}
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/provisional/DisassemblySelection.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/provisional/DisassemblySelection.java
index 49453b13ec..1e74767b06 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/provisional/DisassemblySelection.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/provisional/DisassemblySelection.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 Wind River Systems, Inc. and others.
+ * Copyright (c) 2009, 2010 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -13,9 +13,9 @@ package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional;
import java.math.BigInteger;
import java.net.URI;
+import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.DisassemblyPosition;
+import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.SourcePosition;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyDocument;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.DisassemblyPosition;
-import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourcePosition;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java
index 17714f1109..ed99700032 100644
--- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java
+++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/internal/ui/DsfUIPlugin.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2008 Wind River Systems and others.
+ * Copyright (c) 2006, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -11,7 +11,9 @@
package org.eclipse.cdt.dsf.internal.ui;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
+import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.DisassemblyBackendDsfFactory;
import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourceDocumentProvider;
+import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
@@ -55,6 +57,10 @@ public class DsfUIPlugin extends AbstractUIPlugin {
DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.cdt.dsf.ui/debug")); //$NON-NLS-1$//$NON-NLS-2$
fSourceDocumentProvider = new SourceDocumentProvider();
+
+ // Register the DSF backend for our disassembly view (the CDT debug UI
+ // plugin registers the CDI one)
+ Platform.getAdapterManager().registerAdapters(new DisassemblyBackendDsfFactory(), IDMVMContext.class);
}
/*

Back to the top

fyB %oސfšrFaF0l;5Om;A= MqpR4| nPA({܉1ת1*aF &F*90kN)Gdgׄ8R=`azhIEh&?cU]:l!zDMRTV /7gHPF# WAhvH|jQ;+~Vֆ2T@^:{dV $d: y MB;} 8fOg,,l2 9\F6w@/\ΐ|8J~fx)<"HB/:>X V `f :z_;Jg*QbܚؑE(^最%Q0 m{~9)M8l^VZ=u,dgHQ$)/Jho'ŢjZfQj~*$EwtSBGą7c2e0ܴT/V}!@0R9@/Y`~99gXBHDK | %KtZY&,o4Š-jnoHش!S 򸦷MJyb:0q꧖\!+w7(Fy|pqys~P$]8zU 5$t42t5=FM²AENbp݈{Tb$l@'rcN-jde(t,U ѓ+z.Vmie|H5l5JM3" ٯ!hT%}rLW覷k\.4;% 5j#!icl[uD7<|~"zKM'Ǚ^I`F \K, /D>Y)(/G:B`q_mupKaZ 8 #) &ȰY.a וP) 90=2n܆Z*D[B&AՏ5 Niq.^ߴMw*2uM-۹ƀFP6Y#_$*v ϕ{!;l'-xG_dΞYt<4}I½KnaK˽CsE/ݱ204E`&IQ-=Y7h65f0dl+ʂ1YWo{,45^+|p2û$%B$-b4+E] lok辰yR|eݯ6[>ՃfU;|pgx}1BIEGݻ[TNX1DFf4QwNʧk ah ![Z5?$L|@sw- "~!( nN;o=Rgr| Ƌe YPm׀PQ q3?Tg?K&%aBizߎ;]>2)l̊מnfsZ ;d 5ꡟ2 ׍j[~4g8?@@2'8>z\wnpWhp8$(^S8 YUXڴYIH(,}߫,hH#zVEyc4$:LҖLMIdT wv_.4K=u##zh"b* ?U,o׺u?9~Q/>TYݢ~fw̰ -"P/ĉ>7ߤRA@@̲~&پ o32k%}@+Ow9-F=U#ج90ЧyH3ߗdkl-吧{mW?Ac܆ro jH~m&tvx]傋̫4՞yTV,4Ԥ*$Îcc!x~uu*! Q$*ϯ-CO8j{M ~ +Mt\Jb&˯鑻*-{`2Ć#KY{P\/[/[:A\3dךF?wjR Tu]7/lWURϞiHYM 2->2 ZqX:AJ[e"lotkgK%"Kɭ.mab(>811RGwMc>Os1h^(n G)~{;\n*nN9ȟ/Sz" ʱ Ņ(8ލX*v^\O(nry-(t :n=y'v3M"չ]<mlr=3\np,23$kieCQ }מC3*R[FS&q["BDz6Q7uyAZ򷤶~Wfk ݏӧ~Ԡ,Zdg q$ >o*j3_uLOOT\nTu$oM$.(%r_,#Ӹza 4)}дz$Tۿx08tTT"bGC[@}v9DT=xoDݞA}:%j7,rx0(%d[T\Ne:w,MMARRRq=p&G'|,I5qh)hpi;HkGtv ؉*cGpCuݷB,B˙~dxG5``'AadU5~o~`3wd^Qbzu ل>#&tveuҩ$4Ё~IƳ l[8̊i2h 89_vKhl!mŴ^%\Ց0)?葶M!V*֐æBd$rdĮ j̏~nnIdC8^|VZ@K/`;|jb%ڳXA̘M߱KTj),jhޗ^N0wݯ6dxsy4GZWȥߪJ|> E9W_9|'SD .~(zh.fp^na1.Pzzl4." vJ' {LTxJeSL8$FU.`mXyeEeOB3 ޤ27bJŻs2,3^3D;PK]_q+1ɆWr<\=\eDOF&~gL2]gH\$a?}.ijwL€Z )A fo f1U_~}57K R&llـ$re7@Sv%BwOZ9uhIp{(^a&5>l*L(\Ze[@xy5 ) zD!{BwKxlFK/G*).w;`|z\r8엎 ~^w&<\AR24zn2󷢿捰hۆ%Ȏ3@9N\lKqsLV|c)3x<%q濍[Y}Ż/1siagFbvd?Q4aݚswEL-Povx#އ*8FߋgU 5X6sHiskm sMRw+cĽ45i͙H(Y\7B" e>BkZ1GUq$.Pf\ /<2ZdAj Cw j*kaSEA(fqR2:q0JjlH&w(y/{M 'R52]LhIcPdں@oKbqߜ뽺.Dz`m+9T)y)5 78N =zB>X je\wtlIޭ kǍ?z"'|fץdW/ wj? qOp:qӾ}d;<@ b8?Yv[7GWdZ~>teni %9l-(૆((v 9 +y:BuX *:n(5KKux6c+LR%CWm qO޳)3L҈+_`钾lbX¸ f#uO-"~Ҁ3?LFW)\*fVwa/Ϯ Oc~ _q8C|wC|Y7!G&^!E(]Ź  :؟.ˑ CKu2zN|),kv{&?C~@ao04' 5 ,5Q9.bM;X%kNٜf-gJulL]ZaR,Rjpb utى-)rp["lDYR'nDД~kw׌:BĵGٌ԰uZ6&u2o{RX(x%itC/~ >њ 2U5gay?l`3zݏ?TqtDlф9Ts"QQ%3D|x ^~K:0Ӟ~xfgA8_*c[ďc}͵B吨x>!@aKm)lO(\¥kAkC2<5qp۴^vjn[q]>jU="k}&dd0:ɈD4Ҙ0oA2,`6ySaa :sMkM%ь5)B1O5_kUԨDL3VK%yr&9$Am;oHij6§ Eƒԙ䊜uiVa=qJ^ (@hLHWzz輠?Rbjr7(u) R]\VieEzR#?ݼogNe:H1aGv-z(R[.Tn;AIxKϟ= k6AVu|쉒bP5G7q҆n{PnL"0v V]L=]_95z"*(R`|'Uyǯc klꕑ oM"׸ S/ckc\.>"p믋ջqn1l.$qD֌B^>Өĵ?~c;Ac/痈ʤ[?W`E0%JQo{}Y.3@ w,^{M礴  `voLe .l85e7;{G=MEOQv - 1ok>CV=3 Sʽ JJYޢa%sI. fxV|M6_+7_yڄ 4jX6"lfB;7Bٯiz2,͐AՁDS]8dN^r.|R 7_O@+c[ 𤕿8dA\0{Z/>8F>?: 9P[0?B0귧4`1ܩ {^XblIk#qƹ]RGth"\R)+KT*VG* ́i<.G{8*xIr[}H싟}ލtF=D*9(LU0ec}xY @fm{#S؍*1Op`i}qԆ?Dtf b,4nfbJ[oe }PW1:9kgDT`)Ci㭪Kϵw+7S7\73 ,hfRd1WϐR(2]Ó={4귤W­nlԤ|&61! O.sYIKY:,t9$뢧}y74r'lhj 6 DsUsǬGX(,pk8Ga]{2QS|Sê+v}38Pr*Cl1t%vkػe8/RtOTy+j) QkOW&g  _ ^a:1Y)\K#R /6bҊ9'OY5JUR@e1ucen)$ T,'LĐt g唂' bpm+@5%p :7-4J:MA>Ɋhk`c;nP v1㷗h00\xUF1,O>ӏ-3e$`MWz[͉F@|%ih8 8^4qԜPftP295*||4F8.4|tnxHaiI-i?Iw[&4t8H-IDgNYDD)]e7@ݝ 7LH*JuoQC'דT(T 5$V0Mpy=י}L[As׼ }^}Dn#%tKB(žE"`b^Zۯ=dܸI-X A֫5Z$^qk4-y |o+E &] +P -T>C- ֍[Xi[:Pρ90גMWkD#e#K~ugقp͒|TdNj~~_o!uE ʏ Ҍ5ݸ=1kt lؐ`+N Z,! *Qc@ ObŽ pp*c1mԱnP) bmKoGi]vQ$$Ϭ +k,g2@.HT:iS;S? |kg"nhFT]kDiG++9\>g8Aݧ籒2 ersχ\y 1:Y F9. EF''3͹ eT9t_5ur5O`g'k}ڂɣk4yYkN#GRZ,ퟬ>uh }$ְu-(P)2qMV9DhȽ߶{/b |fŭI[&B·<ؖǟ. krnqʆ[@=ʍe ԭ=0(-Y YF4؁I,A TA8OtYwœ8Le;Y7_S*S܆1$d Q EY FK1\ٵ}x^v;d`V.^Qgh!ϽX֯?+xr_0#v~$SG͑Me< aq%iތ}v_tju =_;fv['+=˛L"1*Vv:̞RRH=k/:KUN^u`.[v ^ S0e_5Z@c{G?K,B> ~aVPbz"N$JŰ^6KTMŒ  1ytyiq:S/ᰏmA3fqó>m vj/*kSmh??RT9<yّTl'w/0D0o<^wiwi8?Mq`k^2I7E}|N;0QUw0RwwuOD3ձ--5WmtYXxJFޕkl6XHc'vRH%7ӆSVս4O}Ƃ<5()9.;ߵF>eCqqLЗzZor Zj;.ğxw6Ds/gPOʓC FO$Etmi%O fH򢶂l 1+o,M rV[~,]F44px AxRԞWzA}hj-h'ȕ{HNk0=_?[G-#X#FS^k12_?afͤ t9cʝ1z6a'_+_Z< x5UBV 9 ڋUj'5TKM)BUċ BsNf?1t=Ay*>9ǝC} wYӹ60}s( &i.t=b|_Crsc@[mWг'w~ x8gzzY؄j1"d OܜL%p2EMaUV{"_֦5ezTZCACPr ~ _`Wö ͻեŒ2H]GgEϑ:qK >5E'=p+ ^ O~pIsOVM6EXWBHy63f(!vʐ< %%~f{f27TY$$\sN-j<~ ]{P+J2D+FB<H ЍjZmc/"A}d+> vi'}|vJ3m*?gm ނX0곳ċ[<e}Pq :,?[Xӯ|ּ*'KTF8J "K5+4zI.6E,J۴&wD-ަV-R~R0nܡ2N} V#j 3'̮[XԊػ UZcfPKr{xK'mKT.{JnD?jҖz t $*dggsSuY%s /j^1S29hnvMXD+d*h|:"tXH ~/!k'M"cw.DHHu'vs8 &`nݦ[=Z.;cRB#Oq޼LŬ%y=rP : -2`c% 8|jN+l~E}C@Q, Ʉ:=`r.nryhSrZPu_JZ%p MDf{Mr|! Z#g#l,*u WD UN]1~GC%z88rUv=+ VXa}lFi)&[?/ rzhρ5)kR[OP1~=]OZ;mMBV;J@&`=1|벍42`Xa,/,w=obxRͼSyc'Rc" 6Mp*KI}窔- y==nqg|u~X łM!AAWTKWA&ψ\Mh/TbӰ,yZN=;-&Q˩-FR&RoU B,Z|U[wAkA*ȼU2 !*I#q]PYi=O Ic\{ 8m߶ Q=,u0cvux2~6s.RgzwqJjs̓je *wγn`1:Ṏž~o\"Byw:kcH 8ůfY8|o -riy{ $q= 81*zћCEdE|.Αr]cWp\y' ]8cXJ:}jr:Py؟i R,$M<I6"e*ڇ.`Քsļc }IgxGeվOzTts+̶p1:Ez]*2XZQnsZ#8O4yD qqqk(~ٸQdpג q?( /C}`1]eq$~4\֖O[M)҃q<ݮZ& tCkzhcA&Fqd*p˼;))"IqXy9#6U+tNRh_OeB- 3y4gA$xn3x< \ -WB%I#6En9yt%uy)'OQ­0)Gôbfg!}n1Oc_rEJ8h#fKXTnހsv ͏"5;\-N[比`8-qsx'g#0(J--a]wjE$Ħ|Kk&~I˞{D[aCJk R6VPdS>Sz_A*ʇC sJ3ּ %u|+{K_΋XgwH+N,xF^}#[0,n7Mɣp`L?(E?<dKl;0ǟO9w;{Z\F, vn9s pU+H|${;m۽,e7rVqS)x`۬N 40+D  EeSj8}tgʨe+Br̪cJ~Hv-o{>8 T)CtPcr96-Yw궹kUҜWX%"5сEWeհ\ t"n෶:SrRis77'%"G?N@sVA\,Es(*G-$45p /N90t9C!I _"K]Iñ4Ly<&BhXc6j~?DULj+ysXkiK1.@g;q!7@.{KH+At@(ǞeYuXIS8]Y{ *=e2u#cqz_cheo]̪3 wJp(RA',6؞腆] _ŪS1zOƎM~fc+2;Rı?2%CwM+ s N\S{ o3ﵺnBx|֎j]6\Vhz M +JF3(ocn nImp/:prvUM MpH;E04F%oҒՆ 4Im#yE6CjH+}CjT܇\Ӻ|,(}׸FlmIlF m : _'M: 2h"?aFڀ(Y9 sGGʇ1:04~VGUV}~!\$_.WM M q+s(os'Y$dI/5Hf=JY.J(=oO>͔WQ5U¶F%R[T.+]ǭ2DWQ!E AAZ _e H&+3ھEOmS{j6ہV>e;HaO9G\?qE4MҮ,&YGR:MuM;(@ ȪTV>gZGOF^1WR ƢN})A gZ-7BH*侼7\ݤ Hdqى #q_lmJ=EH%F D A(i$ubFmNoqޠ/sbTAd焬͜O% EX0"ɇqSBCMh@q[Au +8m9'M-ؚOfXF/\MMu{zU;V_T{/ Br\L1d`P߭sWOAv oYí/J>;t`N?g;h6mԸ}hX@? 'HU-ɐBb?qV~ 需/b< V˗kɤ˭b܇wyW{ZwC >N&u?/P+i6=m mYcO!Fo)I&+*~+3 :>8G*bugfiu4"rv.rGǁ~!cC Kv>A\m׹ƞ䫍x>H5LcmV۝bQ|28m; kOk!LevsHʯ|;zo%:]vD%˓37!ٿMmkSʦ&tvd._'2wN=A]ednm0 ̡V.ס"q1%=?geXm\& .[C6?a ЊTlr[Xo8GߎuexQz"H5/dJ&9_.*?(%؇ٗ0ÅMBwęS6̔r~&Wbt/TwZͨz":,):jy&>ܑx 2Kϛ>p>:ͥ MC!Ҋɓ1n 3igWI>Ø67n<@2h-kxV@CSC&,krK(TخUsLꎃ` KK|t_oB XG |byuSx1JkH[.-zs(zuܿC\C\BVM8Ze+cxduޅiwUUW|m=ysIT*06RS]]kY3Wi4#D91Dl@0 hm3 fqp *%o_grBa}9UVF>ՏBhˮ;:DDͶ]!V޵oOc(>x2bǭ qw7o4ӈ|Xoe S7\cqmBYy`mRٵ ̛akI]OM*&0b"el;AyMjꄬݡh&i izcy8 _pT aO%l ]-kT~T#HKlun ?J|+ءpw _i/a.jCPB >ks1o7WOƫ7#f,uhۑQUOy^qFC@Wye@e@׭=CBPĮo¥A!R$$63ێ'KN=szؘHзsUKDkQޭǕ!)䡸e8oi dU % C dWd BA2aP6)K.ye<*z$>/qMDc XYN!~HrmY b|t|Mp4$/ NQΨE G6L;UXYb(ñlT,]M%OF{ $63xWs[:1>`"w?W:[9gm J- 8a}uUOVB>Ȗ3*\aU/}ӯօVxtPݱjҖn\iMV©:LG;2rQ1`:X_I &Cd2.Uջ0v i]XROjRzF/]%ku~] $ `I?Vo,m^jӠ\CN2%j r=$[o*pGsd;a>ޕgle@?ljӯ 3[.a\O9vPFY&.GX~sqv0)_W1qkA AT=\M׫[cgyYޟFOgXUg›D- 3)- ԴQPS2PkX/,mʩw>_g_ 1)mo_t-2JG(0GnL ,VL6jmlD*X)aʜ926Q>i+T.u* L0&WN ,/pՒN2d/&1%[20_N]>Lp %Ӂ3ꭽpxx-\'SC1m%h֪2VPJ1:,ȚDTP2NQRL AYV>[μ"A<1'9Ў8<;"\ 0+wşRqwO` Z!l!.l9F#JIHLKxei`D1ho69,S(Mk>Z %%Kkέ!C^ZLTD񄟃4Sxq ˜Y?9Ya,1GXݗnLmާ|<FTtٳ &|`m՘BŽ1K0#4ahJehp˒.ă.؈%U3.e>Yv7NU3}'sʖoS=Z%Yf7lm7f`}0>۷RA7 cSꡔRɥ0xh[n$ 'jnVW[6~QOڝ{a˫1n8yMHQ{Qм:ṽjJ16ma5W܇uqCZ˝ӝlfƼ>07e%`P-E`!4:Ohk>e:ݯd0 k5r1 wfTL)J|U|>4p4@CgDk2?(ask?q<~i "߭}~uJ~S z3~SQr7v T+<̠,s,X_4= zToS,EZtsڽ@yJ7Xq{]x03=c3p0ߝ6&D~EqtzWs`"Rk V\#ko' ðnEnq_i_q z'`6Sb숽FoVsr/8-&"$|{oq11cG1kL@-(sFu΂j;=v{+z^r)"SQEoHz$oG.?hɖ렛k -'̏: 04Vx_f!AH4=qf%Fz~(jm`*@`G_;Յ{3y,"sice"=Y{V3. tw˵D|N߷(x;)xppoA6δ")ʐSlJQ^Xj)dʔ!xR[ b{Ƥg$P=,BKv2'xk6f+-FJdPL uM } |nbtn?W2W@8YJ%u.&͏u!\qxUK.:.Pq3%d\Gjylw%sH\!(tMȋiڸ^~_o5jOR+t`Ց~|" u+:e132-wj@DSIN zL+ahB(#Wx4:Z !;*݊ƾEivج l걹ՁCC.ah=xxyw$EYYqrDP~H.wΩPMj]ؿTo#0\6(ч1 u,0A%L܀l2q$^Q]ZOL=TEto+ KBO]1`x_*XeQI$ A}۰8G9^4T4\8C`f?cRkL{Dža ukQ^r ꭞq_mH]TvJ$^$˙2]5̲&f[PZ³i.̽bm4M)=f ; lL8ʭ(-ޡYI:20u~|A33?"-Ŀu}MG;?t?kʏ|$ӭcnA;׸iw*67AB +G8%v uM|V鿖d 4X?T6;#ME9~\|FCUK>\^R`[:mˉlH`Vk)ý^m')of#bU,EzsՎ}Iƨ`9]ZKcn(h8J5vY9,4qCh0JoNǛI]B4b_eI+{\aEKu͛v7a-Nh\7ZzZk*)\#[f9mª#PFLTƪعU(IDd͇vS_5?V6-9:1p,~ة}T?^RkvZ-&z :f))_G?^井djy*P5z d ]4uJQO}5!PN/A[aaѵ/jU1.ov8o%ҜLUdf VGtFᡞ;ўE rSY6Y ? 䨴X`vtag@+:p&TyB+j+咖 eb)pOC_٘3?dGeQvRUJrQ"< :ζK;e%C,/<-U* [<(c/[4APo/E _잤Y[H μgJ=^>lovnM{/tRRON2⶯;qxjԃLW!p/Ãsa2_6T^ȫh(n95 U$VH{BXka%'lG}Nϓ.Er 0"`s$Ek,?m׹Kc0!p-v†}lpOu1ϐs~pΤJOq#3!߁X> .Iui]kK57h(M0I [黿` 4Թ_MלE_Eعj7cC< ,`rЖr(n,nD[p/Ұ޴GRFCS| 1^5#Ts[cc0IRL4qYJX42pjG4GG~‡U!;KX= $o:SyW(1+iYH,zl]AgЯU-iV63QFYƧڎ:÷ v0v4D,&CUzqZo \:ǿ/xA0ՑzohVlVBHiNډ-7Ztʐ Un:"sC"AI'6=hjrqԐ#}l98x}LjaYDaA\S*H^b@+/Eގhi峉QBhTf@HX?8Ir|ɓƚ5#dTJ]ب 0I3$;-]ݯy^N-D6GR1-~( ӶV#wi6% _.2g t3]{dtbAR |W)QP6GE+ugk%}κ6m6ckv%i>%凝k2KĚ(MLn.\|pW>{}06%ݎ"'.\9E1KCg暈@Fw))GŎ7s.05:Jd{~'S:%1Z ,S>T_}p*hΨ gOzT G+oLqW`37À^rC"K͹!KT;Ne& ynP a&SK, -0zNy+ձݏ:Ϫi|٭!߻j|E9]ca^K@" >cn}IW(ϔA]\˰^EZMQ%%})G\.q'wKo ;zl0UXж2ȋ>e[e_Jei o"x7OwuGy3bv1kZ֨5$p4ۤWzw%Ho6of!GtK|jeWjVL"\>JWA2khՖX"EvRu CV"&8)cIotLU;M]R/KV:0[#/sūJ@HfܷE.v4$gT*V`)̎nRg^;+`*TCibe־m_AjsXSE:Vw $XI홌&ZŬT pEpj% KVGɮ,[fJud8<Ǹ䀏ç0) R^ pPa2oU3 ONQk)-gS\0;ƔmG4RB&4#& V4hr}{ ]ut"-[r.A98f7*>X͎(o&^ucu )뮶1ȿ(ފ|V1a!*ƙ l92}-;Y ń R& M1+WnS2Xf1WV9|rmIglsd,MFߖ?ϱ~`BM*xuAA뻤xçx7 Wy#tn_Ȩ2M,@JTawE}03._|+ X43l^GelW޲ո2}$<^G)4dyV[-Z' xYQ@ua Jx͔iPoGcng fE1̔P)sOSǐD'e!EG֞x㊻~C9G\vxvSP. ڥ}3ttx!ٶrH3=MjX['v{Pdv?jтarV0h+Uxȯ5hDS@.Ĺ/`';[$>~ۉ-Ho5ԑa]9=D}!mhN]jw)&EIϸߥ 9iE{|ؐa"~/AU$?şj$3<|7j0@L_aE,]Vpda2IhXd04)zbRH`Ќ3+19T{Y{OS#4Ɂ1EoI+qkQH?)hҋF+63Z;bg@cv]Ny~K!Kd(0KWމr-sXR T)& WĖe:r.O'C4 xYq C1%`sG>مnB WM.fM\e9e7?ӐaEhQDN,ԝJ![XAZ 䒁l- <ԂU:C=Ye;P// ϒ92|3r$ }L/3Eu#l>]qq; !z(/m+Fl;=0 #K}䠖vϡqIl& aP@$Q-n) pn7HpC!G/J[-m'Kn@0J9~rkLh)Y N2i`jϜ/ܬsos;-F۲S%KD#pxgf{w uj"_ƖfFˎ2olmsp"elǢ)wl#mڕ Mlg#_-\ZVrRSVrx"ڷ9*V?7j`8렔ӟ<S *PC!%2(-cṗ؇Cu@kpb͟ |hoUH@O042*| (g6\Jv##>{LFDeha\'wlsSp ݵ e3$Q2 s]d=;YL rg:^60}bt~4RJݻ\"<іX#g$ljP _O& n?;ӝӬ\|R!UtӢ %32 rF~@Zts}m)VO˩(F*1np5σ<.ai$ 9Vlj꒏I 7i`-Z_vȅ g{37P荗f<4_0 hmbsnjΨ5@$/0OH7QQ+w󾀅CAZJ#zuy G {ugp=8Ӕ\oj^-m8d-PW+Z,|'؋{Ÿ^M$ϥhaAF@ $C3NV!QG| .'x)B( rڗ`=Ds%_VNa 4j\Ukߐ'T9+*̒i|䇃+EE uob`Bk>pNHz$Lo'9$9M1iy(N8W/ͱF֡[d5À&Y;D NR4aQf䄘RŗQk">'sUPMzIinaR&{((@ǝ/;։sΊj=]_Y1dPbhLWB%1AnoՌ&RBfkUuyWuQndmumOt;;i_HT/o~cF~v^j$3޻6@"r@|9kΨJW7uxk{±r F%BRITx#RFȋV%4ƃ PGSDM(!H+\LOX fۣ[ր Zr@Nx8# oyN jPZ ]O.}`}3o%ە,{\c2ajYޚ)Xw{m.Ge/ϘIBH;ɱαEm ͇Ẽ *.W.Te]dד~~:i%i]TD@6r H!9(D#k_'ICgX\غ-{{"}]qu_3;^ekGws]|u XATƁDBr~e Q9(}=}0M5ga8˞*r+#z,9ɐ$3$53A#SuTn8U.dU]d{ !s?,֩I:j:ͥHy&TP: /Կo>6RD2])nIEd|/&E yп*zʒ6+I}tLa6»BXqPU#c zfjH{MD泍4o5cFra[ Kcڀz c_sxԄ֎&:u S*Vho`^ :&H"$izcn٬߭K{.&ݠGE^ 렣fPgJuiH2i2%vPz)VAFDUNi9"BlD}+,IA$| 4WЋ6[2 ]i&vـy=12*Nark(Z \ba_ڝ^7!ۃh $H[>] P,to^~""`F*1gخM40lG9xH*xbm3$Wb1đn{s'6mqV9:?B/ܒYj;PYX^aCUr||`0R;d t1 6?ZcCy)k:]wbrA >(w:д H&Cn]\; q8} Z&1rQ1h=%YU6l==(Cڮ sCd#JYjok!\ f[=RfWXn(.HfGCCߔlKz:Cor"\".yoa^VfkVH@7`*t;a)RExzl!XiYIeNj0P)DlծL3AsxMxC?X5/!e|~ K 57cy sN؉0 ,ւ8$ɯ+Օܭp]׽x!FcMGܦK`k1 :7E9_Ë$̻ܵWoٗDAҹXPE⻋eE?A:ܞ.D}|M^wDލaeɺ:'swdmI˕hh~S+ٜ+ߘ/bg P!ܧ@9~?)./:^iHg:;3 ]g!O~X\sM5ȥIpv2YBl!G<.C90 +/F $Fœȩ9"WLᆿRֳ2ѨZo*¢Y l wv~De;dԪ՜75Ȭ®qK*("Rl{lޠp#"r`i,:snnBٴ|kG5cIkF|s Sd|?R'BL2뻻wVdCm}ncfu]G˹C4.:<3^WJ@`8UT Bpx^#j_pc#aIvC6Vظ. ?ՐqB}B/rt%Dj2eK"a}lF1![sZ󘂡6+VFXb+c,~Tz? qiI^k{>=2aS{߿㫁=|o:Z-fFOKhf枈8&oj݅/iwwq eqDKw;J|vz12Hrb,ᧇN KY9@'hP'`5!M_sՖܚJԆPJ_v4 HGJqX)`Р8ꯙS&[R Evt  h^Mj3bFڎ ="CWXP`ٗYW%2''8ٜ!uƒQewx檁ܳYC%0xTt|+Jk# V[5W`AJBB??D,݃73}jrD-#KQAܓ–/2OqG$SdP1BIC0_1%ZT.{s4(D6@Өx6(%֚ݴ=cμZqmZa+| B#l<3ܩkKzǘooS;u %i~*xқyFUӷGhPKⱋQ8#v8IV1ܤlAɽjH [NjLdcѐ<5eMngTzp[] rnM^ U2B#YbP&q2f/󢊴I= WN@OBFFp2$7[8[pInJ  `#, !w X+ ziJ崅!OvۛNz1 (] Qÿ& @BKQkm._l/I[J[l^_f½Rgȩ}-#驧'/t2; @yx.-Ȗ~dh>piw.5#u!v@Q;h^߱DØ5t఩|0=gy+tv%H2|#N7%@ѫdZtIU_aqf,,lӷjRvQ%2jQ^_T.۱<% bSٶΠ?GBPgq cYdh_6 3ܭL~X9 8vJdͷHts9%;3W?㥗 SQE~72nU*3@|~]$1 0#2.Ȫ׫AE/5,7o8цZHr]d|9k<_rIHo_8 HqђLzac6\P!gb6Y!{C0ݓI;M<:h%R=8u1cSΎ?o%\VRTYw ƞ'^i’z"<9?=.Ku˾kA}[~hvqSTd2o,YWAg! MҔ2q25&]QX%`xipdGp"ݝ(n*o1x>b"+=5^i욟tCљG (uxh]&"}B3%$^;L3E'jϨV<3cJڕI!ϫ[Z>ӑrJ}W pVz̏6E fI7٢)|_/E~+[軡YΠay}sͩaBݷ\g*L'/?=e52E%t^xhՔ:71Rk sqÑ>lz8[$XV;o:nGݞ_.*@4v:PK1$/:\||lba\坹ޅ գ3b86#⊇pVX ROnnOrgM1f -+͗5:*UR C ƟrL䗳QB[Aqpo퀉Fw TPc8 xo7n>|} Nꍠ`Ѷ _#>ႎUšQh  DtON~ $ ֓䦹 BUvu\LfF?U"9T nGl |y^U Ftr E2OfkKfҿ1ugh⬵.qH)N`1aDܬv*W8!/Ep֡w^՘wB{m#df (awv;8B R.bqmF]@k cT4'fNڂ@pFۆX '9!1rH(wk;ę%A#[~d *`Es<|Mmo#.[[ş@wvq{Ε*-qS%o%1 P7SDIF|+!eim* g*st %@ia%#ȱC[G*EAYièl^e H\*Vfu:Cx)Oz4XtyO^Ep68r\ yg0^4RmYn_ B2R8O.EDFYL#ߟf#(\$o]J4'P3uߠKhDR`TI8HԪG9ãMU7\Oņ?T>)M:>8R+ܶ?a>m?,e~ "VXa"$Ό$L[og/'G[ '?U@OO'NKϊjLoQwpf,:b,e`M>6Ud]޵B3vW"kH1:Eo.pѕUک%n0DѬqPA Mxת|mX5yL jB Xq&oH|"mmS(VIxl^ʏW/=oYrfGN,}1˼(ef0@a bpL-cs 6\z2J@~^]+&=2BbX'-56U8Ts]r (I)mv%1w],7~/ CܦzRP-jѕaµ 0@0` e" DT+?N:eE_&-yV,A.QB_^w6-ƥWz |{~O5HbO׈uHsc[ڙ7ίoS&LW4!dݠ"Q/%d@j_~>O"lu%'Npoh A1d!(c{ph!`c"oY5vCmy[C]  Xc/D>3Xi ȅt9-4`V^ 7cAzָ%ݍ>0 Ob]Pښ/X&M+؅jMA ?:Onc/7y2a/tGÔ ^Kuj+Vw"!-E(j$[a 7[k0+v` s^XeI Ha ?,6c|ܯ>?̩}vdTUX=ٔhT\,ʸɚ_}o*S٘ ?3K 靻65?wпfcSNp'^JڭZ_oCSas=nu+t_2y$䨏q a9i_-A$^G{CR(5 ͉ȳ6sa}Vn{+:?f*6B_9<rEa;٧nt_ጽTB-g߆Nf0֔lqsN)_E9& ?{dpTVo)Fy6k.Tne®!p&PK޳sbE{.4N^RzƘڲ8O9Qz6I쟻:#xZir\--.=g(''K CQXQ,QρH W}h=(qx/m\Z;wH{b=‰E^u_X;̧nA޽!TktI?\Ձ[v=lv*3 Ȁp"DNBiEMjgoF݉3zPЉoعL:\z]-zCpN|޴WQFPTrsgZjvϰP7BXx>Ye}pOz0|>Ή&$uޠ'u^ĻE9O4iXLAZCOs}ʜ4n"{ir"NmFRRP: $ե rg5@2IELa!v>\?ϊjzu"灢`|./,rHߍl^Q#`нФ8ip/Pⶤ39Og.O4.7k@mg(aE=ٰN?iIMdTWb.ojsC*oL{'9yEX3Iy݁"{D[UFs$6%f0h"֒vT".SIc6IF)DOb;SIH4nU<}13C1^]s-KvˁL330 /$|,W_rO*G8$"ɎҕȦr/ҡ'k50j^gZOQ}Wpߖ3-W S.iQTluZ2>~@{v Q ~U CBP3:XKۚ"jغ)uYZ!]8ۋJe׳VkP6>@7o-+MRc~kM|:JRF2v>kbAe/M6Ru&.tVQߗ3%4BwS,:ܸ6t͜Ĭ .PN0s`HF T:I/5BtJ" ekADy#WhDIBp& fFJ+i'1+3#[C.Qry?Bڗ -{ۏJ^~Ҷ = g ~g3ڇȰ;iz]Vܪ9u Gu湜7CVj+qM΢%y'BbSZMi~TBo0<| ݎ.P&(\>@^`t gK]+@G:LO%rV9+ŝ%WµuE(N6ӻN1DªP/1z>+)ϋP >3ۨz/8V J~Ǧ+߰'i }lӯ| gvA>gUR{jXwE(d~ަ+~T"/O%.4vzKbܱܚ:]\P&{;̖澣u@G"7Hm6l1ɈԵٞG$NW,dwpʱ!gwVIC*8VKܜ4**Bյ+R*UۖIEz áЖ#fJ6OBgWȾ=uxV'A7XQJ )@#tj=l(> =3ґ[mq)J/m솕Wp.P_Ls?;Ej﷖ewʝZ'P0XfxH 0Z)=VlX8iīipB?Q`Iny7 > Infͭ)|UiCsߛJ8 =aI J!KXE^RЮ^AJЈwVyeA7 z`p"bZi@9ٯާ+UoQ;WPg<(ק<8SJ2~k{x3opT` o30'd#L&m#R "[H / L-GD4L02v4\TJ"m0ޫ }is:_ ~jaBK0Gw- 7%yhyoJj:*h q~H7gxͮvOPOHSft'Z@m1CnYw92zVe.Cpa ªD_KhԬQ0 1SG3%&&$\]3Sw~.O|B%.^E?-%kK^7 (vH.8޻$G-LUD=X9]$[,9okLXZ`e>R4+I.ϓǼVrLUA+nc? 3t?a,hD+h׬ %{Sj-0u7[_R~]s||DR8}yGU/6317Z $ȬE]p_LתD#{R{@p5=5DoXѶtԴ'`(h6~uM`(mђ#NYf %/y{ۄ>0yH',[V5TN7q 藤22"HX Ŋ<RfdZiY},TNXڽh se7r,SY;!|G:欢cJQ&KV;Co&S4+g0WR"xX&p:tKLְB\p?Iq 8Gcc<1<}oϱ ތ9Dыd{PIǸTe' ܹs@R/9^:P2u)Dq7HُohpS&xv s~ibDՋEMQI^JTkma4,4I.*Ic,2ZFޟ4]n{V(Ȋg7onx ^SƋ3+{(7GD~?2NFQ51ٯc8=??iѻMkF=t|߬g26%{-/^+~Ep,૧}R 9Ld[z孋XuѰg #Gl4Otlf[X{0"Ԙ|+g^xd_&̹u絾Ka7G׈\֚ZTEuĭLe^&J,ÐӒB;&Q7.,qAgʳ>ۡJ-t(d^Of<4`uefP.vZکs9:R8xW F%Ǎp^^l9u}ymp@ H4_Pq݆ {Ohw>7r7 ^w|'\7.S aU:=S#g1ϴӑ,v[˗aXp.҂J4+Sv)m!v@Q%$?@p]lV S ۊ9qdA!8GLyung ;Dp[w=FxqY~>Č[戠ԨE8fhV>'#O BVxi±T@jz\| zE{@1 U0k*<ѥ5  <#KP5ؑ kg}JS˾?IpX$%.VJcK,PX0je!R :z;.,vo{^D+}}OT#t #|hzF9`8Lݪ5Bj|+]=~?LnWLtJO*]Ĺ9Ô3%ީnʤ0SGq[ \*,q Xnᚳ Lq m q[هaM@&a <ѢZyJqO}l)#hۦ]zT{Վ\ft{,͖GY0~́ yq]V6gԹ]i^$\ڲׯ_&N\܅|g*&0t("7SLcR^me2s^\|8EBxz,r,;bF0ho<\~ M>ڙQ2?QCC߹=m%{uka2СOjR : csTZEyqMj&VqҢԖ uwvugSnĶ[WyOJw\q9{RЊ i8_{[ztGY$Am=Oχw浶"U 4>^Xb?hadq\ /Gt i|s>[Q,ӽnLɔ=7}xkLSt˥0VGj rɔZ\MC$Cp-)$/90 W܏J6+Cy"G(jprpkL8Lț,V#$k!@iXT0~~4k" >Lt7nT⟰.-37ٹۮ!Nտ'Eh~F)d^q7&>CemvT,p:˭ܽ\tN?a09JX@ H+Q)TW=g;н٣aXt]: eB QLYt,ZJ1g>QKfb'?i :VOzB6bO:xt,2_pjp#qnZ ̎u/XBqI#}~ w j3yj\|Ńd#gI͡`+/$$fWxL\J)pj;8&I9/Pb%\C]/7fz{ :JF3leKN(&s)ENJ݈ bfI.BI$@|Es%+&1A :v/(MQi?ڤ0o7\ %?eؓ ƙ=GcS+ׯSn>YsOn>ƥ&a0RP)<$tV~ I7R+x8Q;"Tw=6^=%DбYWAsHOHxom=frSz0I.9}=aL"X&f%%J>I ۝ܜQID2U_G=(O73 5FUXvpârcɊ$@/ Bk.k| 1/(U12hr IXD{^l5UyLk) /XTyU r'Vȕgt 5- 5!RDjwo}NGجy="d\u\gf9p ּ¿Z;/|$\,ɜ5%3gT0||N!n(FJJncDCpDfy5Ae!@ 3nadxc!jZE@([%-?".pIS:hԏ!ΙU' הz: uX|-w-!кgo،<|cTzs"-a8 UXuؗ+pp ,[rpKP%?"4u.|ba s XE&w6-uSbq0TeZj6.!cZJ"R 1/v38hRIs&cpe~')g]Ϋ2Lj1>`"Z|-<`F~sW/Qqo^V )+ʼ.9hVfo:!~̱{%nX>XE)q#*\ FC|UI$_P˃<`_@.=r-IKt9-۠_ r3+Wqi@jDV۲edD%mO-ބձhp5*UQiyY}HGݰs0 p;kioFN7|op ]-Eu:UVR>17)4{ |И5;n@TFX$F[! hˌAvh1gd|L{Om/mopX n8y1~e.}i0J|#YGD#zELN,pRz_l1P "z=яu%K @If3N) #OawB>jVLL%:>j#)Mg6] jX}8YoI ok sN.fooaPmx^;pԈWv+WѕhY e˛v D XA9eXDp8v'`:*!fYn''B c qͺҳi|q10dpGÞL 1GBKs!θؑk6! {t~9}Hjmy2/B_6`WHB<))tf~ksPe ` sh!"cS-jܮ*7*7֌3'+*ۆj>lb˂"}HYU; ]KU[f]jAA,Я#ʝAv;*0꬞Ckb(Ҁ)#1OG P8,2rީl̯Iŏ*-2%?8E3t+Gusz]%z ^oljF3=־(&^Bq{7nⵎ#%G^53`5G@^6?8=?]h$ B$a,"J@Qz=,Wv_k ^㸳_uvS9B?kQw/q$,R4GvLp(2Ђ}n@G*_]4XβwnBܴ J侍KʲQE k{M}1Lgҹ8 [ h%w9x.Йߕ|dm<_,*# $%5*oP"a\!<ǖy>HYgOFp=d\JQ -̷ųi:mzQ|"*5ĩ/g>fKC gL1p܍hإfWNثAE9!JiB3|>#`'m<(-(Rȅ 9_H)PNn9K=EIى䱁Nи 4w=EGA͢-Tߔ~1Kf,r2DS_ѫW xcz~ՍU(SlN20a6g-E-%Cm}V@^Mv#@B kO=J;?[V)2 }\[bH褻_5q5졛0qϕWLTBD;b[xyOgKJJ+zZr+D?dhl**g _3J왂QR ;I1X/a [JV4ANcFT)3fi'3ϮaXÏ$Rf3y 8&|P}h%_ʧ$rm72BKm|rcI22Cpc'9-ݮOT>ZFWz8}RgtV˰tr]" Cj?VCRAKbty3P9Kg71h_eZx)( X<,1iQ) Z\䰰 d:< HJVtSpia$<ý I{Iы  ;EI~xHa*W}r^ӠDpL52aێxjlzRq4YTiaSC F!J^M! !┢;g|}|¡WSBƝ++cjs@xfo9DY6P/8C7l֦`ΞӸ.cb?&+EH'/dD'WGbl֌ݍbgYD"Gq   8!,SO5Yd^+?6'¡W8 ;awOF<҄t&8yi!' 4f,14 A|yc/Xn!y >ƙ@̥״{S@%EE65II2OJN2ĕAQ?xA|gmx=^[ A_UT'~ ۝> f"rK'·^tGq 8*cd x>^CdZoL6:EM:}hTjMwֵQ0(̙(4B{o\5\{7ldX#fnR7ܵoN<i.s|d3N/̫p.5ݮhCwgr=qjYQLcZsCSR>1$݄ydi( I s>|Dg?.b񪌦 o/ѫ!\D92Xo9NAlALrs_xA,P|Y $E Gh!"~CݓJ ё'è聏5.($қB7ł\P&7hȴ$|zT8ث Z%eq-TRWBʁ@jՖMv}39Y"1TJR0BR~sl{N),IR4ZBO"hb3&~NwcC]BN{bؽ̅JoV/;}XYBbuvbd2ǬxtSEzRj:tpJnN9Kx~`/ s\gHS~TkދId bRqM!Wrd~)2lEJcs2ȁ D[ ͧDY {񆅄}90 ?y7`^s6I&װ%H~؝'jdn- )T<^qmv[FST2)뛈}{˲^CY!˕`~{}E`qZi  t75aL;$Q5I_:ۆzaŌx^O$U2 r)쵪?^Bgl ڈ $߶~ѽ.4(Į^O\qR\׀Q@/(>(킄$DW22[-HNa 5 ^W@0nL|DnEC= daN@4tˁ՞ smӚ.5eyh#Jn)ȁ6_uoÝ?f&@ ?UڠG篞m0jEd6'uS*DJՆXG_`\:"ꖰ(^xs@xx0H(Mox" =?U)I& .bu_%aI₄T(Xg!~ɘ]XϕDG N߯*q(~>Eh/o8M{99vPgkRynrWǒ< 2/XS$xSr#7ؼ3GhG*hWCwi!%"ADh_ +7EGe%}+r>[ļv*sknautf!TpL ,I}=BA_he XþhT*')-%SKlaϋ#i!;*6D0[m\)yٌi0 9&0PiNf׵G>A7AP#-Ĩ/YA.ʁ2nμ9@Sifr4؅` umneX}7dpbQlC?4KɄq+xHyL S&y%ZxS-! ɻq^ S ~mߔkNt^!9{RB4|1u6Sm5؛;F<&" CL^^7Rk&\BW|~BZtR^,Njp9T$wc[%T7>il\<߾|[EXgnJ2E\RՃfk;9eCK8?7f˜i^d 5e+nNB#G9]l9M_&I-g%c;"uW:ph"*IPx:ޕUg9m 6p2Z<<\WI_*eTupY-DG׌b/J%2D'b%{.C)gE82@#{7pR'AWзj)үIL)۫Y,3gXvxoTp' lܡn;K"^NNe>?YC tS8"Ӱ@n{z*}>{õ5x ɾb#XלbUckUr嬆"_c/|1a-OI؆oÈs$j>Ѕ@-n4I1jIof c~-Hyฝv׺?C^5E.gfc k *8eS*Uy/d.u3Es7KU(+EyUs>a!/3RdJ'i-g-S0=*I{~(ߐΜϞj(d1 EZ+/2\[&31Qoz]^ĥ~%5_V֟ ǀwDoyp'{ s`hmH@dvʂM%:V`|Z"W"jD%XWMK=Fz&܂Kպe^ ٸgu+3F˖j|X3\PXnC-EaM;v0Nj_zoV,nG9&Wшf۱Qq g6pZy~=OKeI@Pu`,yp GQ24XD׉w~4u#aJ?kTXBmt$$ ׄ{zv7aƞZR5 6c~ Zlԭ-qH5s˗ȡF9JN*gt(e'i][ҒެMtbISEOXV-2tjɂtM9`d @I`9J[gVή_jl*{xP?JE6{3 3mPh)0?#!羻0[M.KIQ+̻9 ۗbo)ޠmc?acٗ+a-gsg;']|EgE튁ssrj+`؋GiO%9}sT;F|Uf8LK܇:U@_G˚bѯj10r 5;";N%oBӯQP]9)3"_PDvu(e}VfۡʷvN➀v&>$j27 u.92_V66!kլ] bx@vjɴMA{/Y|_J_'F${3/qج"WiG.Qej ҋUĔJ}N?ZIsVKɖyaJmlԇUV;),B+=o?İ4Xr[Йz4V Qwtybg;n3ҡKY,oM+Q˗Uö9cqq1A m6R ȹI|`uogț_A4c9'qqowHizU<,=+0G'UZK#gd I&Yw.d]鎎zЇ-vUԓv9qֽ^DjWas81FLYoQzJSN{ \Ѯ^rX 0i’PB/M3?qgۮ(A {I9V`=C N-KS3 ʈr3.\Rw`e+,.a;5I[@ Nܾj4#X ƓH9إF[>ߑJ@,p27~1Z#.]2gp%eJߩ@M+R MwZQ&i2U^'fqVNT5JZ#n*׌rĤuJ F?^^'Leej&t$JI53*owD!(S][v+j.I/ B0g{#r=շ;' ,ǐLmYF&KJ=˵RRGLt%\Ǘ}.QH6:zL*Np\@\~'QǷNh"n  HPJ7U7$L4nYŪɮm."cC\wYif|l5 %G*iĖReƘˡiFn"~ ]҅R@̍z6NUU7{OR=Ãͱ89O@?Ӂ\eʚɨ|>øM"Q)Fq6l'>8Zoae)YR/XMr>/8Ocy#bFd߸jechsSE(%erUD `z '\vN\!*ɹJԟ1גVA}䱊iO o+;J8PzwNAŹvr? &հ1ZJP+pK,Vb Aocj(uq#.8c p3ZS"_/llP%iNpOQ Wr5{y͖97I(hWw 7tߵ|Q܆m139\y,,X<32"fızsƿGYiƨ3W_Vn&h o&3dUmoCʈY/ՈYm|/Sƍ>"zbK=nԸsY2ޒiX|Ei!zd.PYNA+Mw[W-uN8RsѓVt9gqz uaUIyQ!RjBĕ]h;U,Kd|0`{ӊ;by`Zᵝl- M,yy2ݰo`+{JXS)åë8S9Z 02y$ͬP1`SZV<)+*p[Ǧ꒐l/mov! ʟĉ:VbQqKvނ,WR~u:ed9BD~`RjvŏjuLd|KV(̃e6!tM{pXg 6 Ӎ }E`Ah(x0 [V֢eը8j_MH9-e)9yFzDlǮ>+g~ip"~9{: ʼcRmΩh\n<:lI_ `>,3a &c uz:)P$ Ń|{ ߨv5j O` - 9w,l7sHJ\_ps ٞ[0["+ŬѓxaGމ̫e=wYx,hjw3Sݧ=Oi72!r澚ywkK^f\V݀9HnWىZe)~M M)7Gs./ZAg+E_j^8 B N&|Ƞxg{1ŔŲGgvBv̾^x84==F΢d&Vb 9yODORlf>3BO&XFlw W%.M?SSu6`X@ szBJ=M,a"6ׇ }*J48Y:@Hdl8wɭu~!eMmrރ/ܓ@n PnZX KoH!3B׿ ?]}( $8xPw? -P ĘN^'!fķTx䎻'k=sv]Hϲ[vZI#yr0GnGNcJ*c^upEl(*y^qQ 2<夰.sC &V߶͡(%S&v! :^ %$ِ* ϏGΰ>Xu11uC+ Xe \562jNdO{p떔iL$n -NaPu)+[=Tʊ"M2q: 7lbX!0ThԘwcNi8Z8vWƿJ8 Nq $`]vj] Џ}J2DNrp &o1nDb8x:chqߛDSؤH4ⅿ:r:XZp)^ҍ^f~:M̓ɼ`|9OCtޖ?(Uh^7 uPbdK7Vao0ZPStW/+4帛*G^$nUqm;@uWczw-| >4)+˔oTez7%,r|aӼ~}o8DLsY10n%DZ@[0b3p4 4-=N d $A>=EƷh+zbqiV|?Nə{3D}/-qC'`g+2; O86GCyKe?O7iݏ… ?x2I+@] 98aGkӶn_Mnv%c)Qc_6^z[ ^3Š~9!&.vWҘ 7JMdeHk hy%&>$n jZLIS1f@7$`uvbYsf?CCI[W`s]Pf%Y"X0=L48q =c2َɅ>. *MMH.'W.A/ g^⤤>]Oi5h˴1:X;\6}`]$lu]+>+Ioq­<orƈ2JWjUjqK""NsÒˤyzzɬ|H>]|v-/팶L cg)}{4p_x]'F?iսiIMgTk"YU- BAܓ;Ǧzk|z"WEzӂ[@/)LF lEB8kAzS]E4|d ъQtA>ǂ'ā JY6izxE%V8H*MJ5rƇRfœr>SQ sq[p _p5sk𾝨!_Җ7aݿF*YT ?y[٨Fp QZdV8'1T`SP+TFEM|T4EQU%zAǘ,SFsײV 5 XV]"}4‡W}}}50+~1 >F2Q 6\Zƶ/uyp!a?5вU-ojD P{kfXsMxMQ?;Dzpu8E_^ #`vtvI1SZ@j2-HlEU'~7a T/*?_X㮶.c8%:WEӡY7!QGdQ]$ƦiTs +NU& CL]ahb svܭFso`V(R!3q(FofcAMӶU`Y% _FhDInn@’~u4(HU$K$gRWj,66 E C }C$~N4CW6b7ղ)VN9o c3AO[Wdċy1 ʷLM8"QVO[Er] }̬DÉQO$$/|sm g۽9d)}q\GyݹMeTf&*Ch"̉ix 1WaO*4Cpv9Rřj!~ Klʔڳ>Wto)B+6Mr?l9Vy%r!?ӈu L0Q\Æ{\Df0Mv)}ZC;ҍU>8GLzvT7DB>čNs t%W$h#֯, dIgUEZqkpK6lH5+ l޵y9PP&p~F$c;tM4a#)D+TC΅ZDƀLIc o2;$WCjY=1tA.t5*v]X:C6lدv*z{XJ g0l'8)1r:)7 %gUjЁb#ժpE F6Hޜ TҽmMH+~M8]r8};\&mNUF'3aCx'9_0vq=e O fZsz U +U l <{q8 mP[]Z9B.ZEA\Q71K'U2L0QU/mLbc `K574%Az"cɂ^F}l1Ke 2}l~foc/xEem2H>AFl2I1!@ֽ;Ğlw@z&7/ &q'-EAF.[Cb<*eMee:b>Z:_b܏ŏ"{,_Ut1ZhW騏~qaPA7z3˄aGW*6PWl4-s n@QVR=e>-1m)a"Ɏ@~$?*u4Vzt(}A}P1мU _U)_i G҉ɴ$axf^նѯzN9Qy`r i31TՓgyqxf!׎.o%%ŧ5QmL]kEZJgxp|g .2)%y+UCaѮK;Xg/ :Zs0\xXŸJ ZgC:R,F(=z3- W/5+Ss7!t+,a,7‹P{ ')6tŞݨ_v(T`"3t_Qy1 jޡAMb?#";m{l!~0tfyd&&N)Z,ȳQ~\11T@H'eXI|?s5y0VG]% ɏM:>P *e?GM6ߔ= җ<___ |֌~eq̐2yp-eT[BO+k<91Ԏ>YM'ݧ8A@LvWtf MeQ*hrN¬bkhZ(P@{jԡQkq4BzBEb(AJӵNưD> G.$g=!QZB^|A*iA3߻jd"sBT(f\m*܀6T殮"ug)o_n(Qn#nt 2v[_͹1C-p%UT<'qh_nVͩdCEN?/g\v  1 v;%`NJȶ&ړṭf!H:(a+.(Y%$8v rEFb#0`/5cDRBj>'m`6`xC{ǖ<ŨL[ \wwavݸ]#PYKf3U1vA:&whּ(B1}?v? "DRp#.=FG֕-a_Vs1_N2h瀛c"#篥r0 Q,Uz<DQ>Mn(VI-c؊SY' ⚣, [0(cEA,e0B/RVApMr?<{ SLGxǭ=\ѮFbx P}`6k)9۫r$*A/ǎ('TUl1db26wG5 +޴(X&%{y";0'ŽoRt-N ]3%L!Q`慊mzlv- t8> R+gXet݌}G=ɨrL5I.r-5WҰ]FV17E$H yAJ;q27\%,+ 3}>R:Bp_| 5G^dLJ4H+>Qcz,xEn^Jxh"'79 Qǀ= !!8{ [z>= rpOT0&gVH'ቮt1JdV;>TỘ?~{uT ӄ՞-V' !"WF\ ~a2dvģ6 彯8dM2\ѹY.&Vk6 2rG!s,\c0M(&«xI\d̖C5Q!a'! P o{:(fbTTl\BRdj0[}d;.ڶ`s4ƺ4Mg^Ic R:y,p2,@4KqF_1B JޅxZ472݁B4w!Z -z/"k..Rg~MjY'X)]ʞ9aɌ$-/Ks-Li_ѮU-ֿ%wHnTM#x?>=Gm$>vu:elUykd䀱ngv:Y7 i*Z p5< 7lR?ekEl1dUeȍIrѐp*]B,b D;ٰ[~hPp3цw|OIX'||oPtFIĻ`>*rKtko(a]z{*G5 ]@E)A}vܥ}UQ*jp;2Vn,&k]$%'20zu"~]W';ы$냧uoN\J|KfKw6%G|aiHNqCWG¹E]`:ɰvM/ndrŬKs=)R$|'ҙSDRbwn."`E;,PՑt54jcm5Kҧ& 9"ߌezR'5#wha9L risDT)dbH/32Aq8jX( -8-NXTHZí(+DYRTZ7,!M'XxAG)$+8 ̠"^d8pc)Ɖ[ 3ɰT44W\qqq}%0;sN8,9 ,=H") ~SX? ջ*l 'AfŇϡHYr+Y~ <hkvNZzPT/Yho|4݁$!H ٽ|uhט9EƓvۓUŪSQDsB-YA٢#%Ti^ޔx,t)zx`OR3>:Rc%܃{b2̽mPC=?pS)ܵ#{A*$;;0.^su`ܸxY1"l|<=_p4Ju$$ٔ@QmF:7cKGLAP(FN{ ۣâ^ڨ2[,xQ,L27E.:eG< 9Ƕ|/˼G>^.hqU;LXuQL$泝gdX^wj]rY.`!#wnfbnǍI hJĜlt)ihTtʢVXk@lrRy ZO(8=m*٦֑@K:TFefAE+U!\&Ne|MJO=OC90j6651b#5QZɋ~Ţ{oaa,7ެ xnܶC*M:Eum_ *=ڛj$hE4aYUIyKd_O"1=?BZ oo*\~JˉUG5 Ь1_ S.Dlp)X[Y @.:AiR30Q$ -6|MCӥ/.ga/%USn @t.LFg.p9'oyǔ*(Do0SkF7?(B΃F?]̨]<"MR1PfիwBhg2~\< !82N+U=ˬǣPqvzv'fqMηD:mO:@|a"H􃱏 M}`eNC( S{EŏGe*9-@w/qu;CF:?gzj:4XV&jeLO֪ΡzY2Ǜ+mis3Ԕ԰h '$cpC\Yq,6몗8kWA.j='wnx(ooDxW]c,UJ'`}{_1eed|c2٘ \K{g'XI\kq\Io|Xv<1UgpBvIToikmN'K|W v?~~-TDV3rHlTjEs\uûiA'ҳσcЦM6אO8ǬsY1?1X}hmO= ^tGoPKŴ bb"Lyn2\pgQ0i6b9!ySIHx|4<ך}UU$ii*N聽U_5PV[SґZV'вӥ$qXw'pl^rx&Nr)P]Y[x(rlϾ3&rewf Wu^ WŎT!f;.b@SWCa8wڨ&f;vs]v gs5$ A^V$7&܁BHU~>HV,cd JM#[gvuu-#19qGhxijy'v9+8ZG߭kQE7.DumjӊZ=+ u Cj ͙8}+ErQ_ k[ж*).Svp5M/{Zp R6[pX:Ks~@Jfʊ/ 1AQF[I4ičP˄Dm/sAȌlcƉ"f=Ӭ؋qm4OV*QK'V lIPp^*c;e.cNY ?Y˜"Յ,)=7'= Oj(58\>d)XΫ\QW}Le Myo F0O=@~h9:4}<O^:|Cϲ]4ӵzRY݈L`3Gak>-׈^T1! ZҰbfiw(ybCYBԒu?~BElYs2@iS<'0@G s%uk/h2i_! wX_ o8BE R=xBax9p\NKUSsLI$'tDN0Ѐ6B;lh=I:R!A/P!hܫV15:L5M;̭)BVu_ F>"Id2t8(yhS|7mM/~`X5fvEd;X#DYK8P7=?yh_ad:w2"$w>g0UWH02( wn޺{P5$t5nxЫu! ~V5PYL<%Ǯ^X]_w W2 />_Љщ=~T bKAg+S4'M̏(L ٫ښ;oTyz#ժQ_`P^gyg@1tċ蛠= .%哝3."DzYF$Hy6@8N˦9RaQ׽eR$3]#Lz4$Ue_G[rr bӭnxF)ߕ(]nmQ{)`y݈<s5 ѭHÿ9QdzuԢwІkq_IՉ% yT84i?'ämy"OD|BYI0oG;"MR@B` k>దg2Cffp]8s۔sFOh2#.d,2o1;@i&h Ll~_ pcK@ +ڐaa>#Ӷo.Q b^C+ZnaXQYv1YOy|w CqmjۗY]#hh!1޳8asXt7eTA|"T =R(i)&vc-p5Q9USjh_ny0rDP5ӂp FoB`LU^vUUi-dEl$99,5Jtkjd[lF9F? `֚qƊ퐒zr^B$}vl s[g~ y\f%_rY ~o![UTbUɦ @d TEȷ^hWh7glYaתH[HʏXr*xF_ڥ qNf"D~od,ZN@5py5B}(ayJ1R,ppXNbb1oH7'[ wEś&%l,m@g$ŒBa7._cO[45KdЛuv/. W;93ͩ~bI~,Dx}eF- iZ%ojXC,$_ -LsٜI}WO\<7&E^:ީ``qHF57ZqӶɛbRnBNR V1RqaU#Ùm4Ц[WD=&=~[YCR%u@5B0ue#E ;+Y)t27wVnI J_$^B?Uω๸gvXPbAX@mЭ!@*hʬ!*G(z(&d b+$<~jO_#(H*װK'C-fXIڃ48l#,BfpBeJnDI|1D64sH2Uc+l' .x}LEZPM̏ Dox!57Ѹ_l32fئ %-pW![X`9< uYlcfRj薋GjÔ156%IM60&17&F=*(/ZR2ܸѢKԌjzв~0 +xs{4p5봰}KY^{R^3š Ў=V(.{;DpU 92Nqd%I' 0st60 {׏@@ RsD#ͭcR!vY.r( /Fy{sK?I}<*14l+kM?K /ݟP=/Dz r4c+-[MvˏACLj:ij[8̒p:\Hse-i:T "Y28Oce+nnzӈ Pڼ~16:;A8z\zq00&ٳΚ5X (# 8ؘĄrWRM ʹ6g9ueN9n9a8B䯤g|@x܍_5K4:Cxۼjs֪V5.cCRKNö"N߃!tN|{6 NP!i&&&_R쨡&7H7QO&U՜1IA:hb^"zzI]XzCl|Q5ϧAdqF&P22:v sZ/9d*3rom h'"0Y/tK_1@a@*P_ݱ;1Bsi{9 $jl ._2ͻ+yl ё'2su~ZQg>= X&qVcy /1b@;\}{FV☈cF|qw6+1Zyl\C+FQĊ4X{4 ħW-֛D\f3w;/ɻTZBFzk$VbZ ̮ *mlKEtF=oDf%1,#E1o5ĜfYf1Oխ=WQGJщq*V>&4H&gBaXc y^viXS'-H;5'_nOs/IET臊'dE{€'9R 9nOJyoǔZ~@,7Y$XVvO^ lJ%L=ߟ zrtPU]ñZ[=U>fui%_"s#y!?@5LӘ(ķҡ^bE6Հ.r_%f%g<&hLD *Tj@5,84;XȱVJRYۧyTa/e(wK{>C.Y-3L|axF90>?Fx_)Ν2܄3< CEIdѮC񑯜'Y#߃k( 3.LZ ĽhɄ8!#),5Y ,w?ˑ%hAeZ"T@FLv=@&'4ΉbKO)liUhJ(k\Y$gmoEW޶\^fJR~_`;Ap[U6( X3Ͱ6b:S7)ȸ+bsD;?x>4GVv#ė y9 yLJm27i$}el5XK67<)SU%$a.)=JV$lfЭ azH(#=}&^~96#lˆb>Iu 24S~6IsO(>ahYT$+ʻp`FX !0L0iK )3Ƈtэ&grsWL,]2VI ߋɝfJ <:u(MPb<ݍ4Xn"is2oǰ]»~ ٵ2ܞ>[N%% 䆞|P&gPWk8*T Q496/vxZ^q]6CZPGh'ǐv܋ԧ򝂂d),;&"ݤkE k+eT.RUezץPh+kgR_x딯F&u4(\A eC!Ҏnʨ#خk ݧ(͔2v\&ъ%`z5 1ֻ,!0l|1vg(\*t")NR?.vߚ_y1YQ;۹lUW6ŒP_PZ08~2ldPޞt[@WHNUhWKL)'\%Pxhj:da|4A@Uc.oRNJzͷq6kF_wBڔZ)^ Z{|I;Eqe k$!!9j&]#vhҾ.BB>>|kgU&tM(1{qaQSTf5!pC2E_yc7YXbɌA^BN~L7m's{ ރA|L3bq"Kz8?v\E=օ}  h%ֺ->Q 8`"CnxsP^>F/3|ryâ2P"x!MGc&+u ߰kw -:a621V06uTx/j@_~8%4{p_S8h;>J>VZݲOAۦ%ng iHP[!A7gOV?/%Ps qocuh\* aEdJi6wYaQEw\~gÃ6H̩Yπ" kWsq`"+]!2~1Bu1D;?s׌X5/ ==Jq{Il#8#9Xh zzluIUsџݣbQ6CaY}&boC¬Z{"CW'Α,qZ˭zy(cabojLL/׈TLLqsfE5zC Ϧr#gLV Zz%GYB|=mCWo; W/*G҉U}bNi>oTf VMmrd'{&[n/>͖nlkJhxJW$+%mOFJ8@wm>L'_W]G9ATRN!#pz#I*O+c!#;M\&O]u5NghY@ >1d;s🟧1 =4=jH6 .ϵt4C1fg*%orٳ3xt:XC97e/H$NDKCmUn!f>e}!`澂mksxWK=?]96 7dB\ D OY}A(,uQ ja7G Hc0{R@<lW7jcR2- -Mݥ &bY VՏ2,X垓XodW+s\CyI$>.pj8U.lBPg\7'K]X{ XSEiABݡ8yrRlOQ3 RV/uS#E/+m%O17CO2LeVۙ.0sG37GmQ q%xQ"ٰ}C!OXOK%8Q/]wR4A!`[~4\*` uc&[tݨRa*`p1UyȀ04YrW@xh0i&R F; i0T] _5~͗uǠO{Bw 7SGOEBWH5QN`Oz$W^EJ:; 2N$'Eȓl&Nt?ݘT+QZPVwPJ4Rф-'TALUenC Qm[icB7,k?/h,,)syJn4z ~u?i~[uNvA8EH]9(ց`FG5i|/gw5<ɫ#0w-o@v%q rR= AE♨=_#'車RؒB+f:Jnҫɹ2HAssT%&l%/|fy +tBJD7q$;|drݬ g.NVP"ab-QTTּ,i_X`rVi/fj.9U]!\|k^&8 +xk>m` zF[bQ40x"^zXj~cE _do׀slAQ m7ӵ )cu 4wƁTC$;r[T?dnSUZC}8v6U'7Oqu% s7G*JȧYK#H`v@IN 溒Tl-H~^͸^r d c-Cr]n=sGal8 s M5s<Fz+˭)1b6lw˹cӆe`v "1`V~ŹǢw5N(+ F5z?WS;ӢXx{YɏK8U飵y2s z^$Ig %[ 4.}s<=e]0&1gHhH(ܔT~}Z6&SL`n j!OEεekj5XVj8{+%@j;9wLKQ| G܁cjeWsWUQʬ)nשiӒy!è\TEt& *G^w:PL]+s)H'kfI{}ܚ1)8 WrjF'//=7S3n޲6;SS&ccARY9Zxϭ=ۊ  VD桓a˻ܮZ!RPd[/$h6E;oJM8a p3ʆ bd<˃!ϱuB'J* )}f) ?]Fyr'X{Q+p7o9|$?OGͲeI6^&ȗz%dȼ+x43=\z]aLwcv1>͔qc6ڨ KMDK:1.tYWAQta U/8"8voĤ*}-ҢgW0N!ViХ״\W&9R&z%vevUdg c069#9Nc& oejv<f i,% ׹`D*Qd>5^or6d uk":hzA_7oAS,\fqf6 y5yIi̺a<7`tۣ]}<î-d )+8pOu'm"ߟq÷+Cױ2嬸qaDYu֩rV;M @۵+kV 'T]8TR0Q"yq8f> ].`0b,F.ei3o(w7)nߋXH b 9ƖU jpS0Ԧ/Bc\~kT ~DYUlW\ ;k0[Pޑ~{T\dQIt^Fuhp1^i'#گE$`> pI`KUqCgE 8dwWXGK#@c[jZ Q&`†Ձ}3 q<4U5S|[@J7KJ@_3_-%f%uWp@HboYԹ $|iixXhi`Q.-8.[Vқ=mGwK^ƿ5sYpw,)ǁqLoybyϘAsV3)u6 S|m ^ZoY(_9ۙ'wPb8Za],wŎ ]%)s>lKDVnolm =b'4HSz]jR3.v`fDŽ:f\w򘥀/d)S@9fRl5*IؠBGh.Y |l4a %`E:ֺ)s%$rZN9"Frδ6#yW\<3.7 ߓ9I*>dV%6#nւ]Vs=%в_TYp *cl =;Ǣ/oILBs}s\\-k׮TsGr  ABrУsHW N$c]#ȉn*WىY|H'd@FpjϨ7g 3N [^( y/Ur{ЂawyYfAOC\ =kyp2( AD**7ʱlP" a {)^2!HA}821 mb!VP$s 8J, Ю {GiI"}ms!䷀ 8)'8UVz)oP멵DHȕ<}UĽ?1,=R\J9mZ=H(Zle[@<^QnzdS;a* r/F4]C*: /%OGb96(S7D!_LFN̝5:XR!שL vwJ^e[mx@?d-) j$nU@vvQV3 U@[/aF_yw8%F".x-oKl4#.kש)#gO?-ko,T-FHOJo(` ghkA`\-!?ƍ3 y#+;5@mVJ/ ̐*m I8AkG#37lS;q;Ϝ,@_8`uN?^Ӊc ~Y үC 30GcBX>D2lDk0K4~?X7oӧd# n{Ķ XBU;_./ 4;%\MgJx ep6-P(7 $S"&2Og-9AR˶S^{[ #)wt%\g4j) &3Xrdr\XSc Biwc; ά:jL>- (ht%ڔ@&堔k|p>r2ZH$tkYV"D*H}ps˦ AUy%~$S?9kbz|{?rM9λ@ OEi;9INjn+ODo/a˱Ⱥ.o2'#J*ގ߮YYgPlB+`)} wߟ)&Y$P=kch-]bsx6s_zs" qapXqvæ!lOQCmJ>y&igXtKq&]v,!:4Rҿl |F:e_EgucUc|1tr$9P uD69xdo(";'Cx11 V$2Zt kQnH@+i/m9odH:s˒i:ֽ cg*;Fa>Q2)/k͝Oe&C]Ʃ jNMWXq]E csMqcz?5jjUU£/UZ %zԍ ;AqZb3'עM'5%hf9=b{Pgu7mw~HFGYV6>Ęt9u ADɴ5 5c޶yۇ7=wd*7%Q'.#]Tn`utE\߳5T e q3ne58 \׸5ߞU"ogHG[!&[gKfWg4G%1׉[hpW`[>W|vfN/  oE/zlK=S59t_x z0 qaO96OkhƷDołg^Ɖ`~lk?M]:v %L:.+"do s=o6XQ:՚8:z  B 6!20L>_}v{5L5J &&( 88c:0*&;&DuI>,0~epV〉 /sT\ 2".JV_o& xVqLW e^S2D;԰fo ˓޶PT&"0[#@}P˞/P檷X-z$rd|]a8@TnkʄM-!҆0uh|zؗ@s<'N nW"׽p }4c/I4@ay KMلfNuRļY;"g!r?|aTܔ0bܢ(kY; ? ˗> lA 'B\p rMJBV6@y^F8?.HQƞٛjG \t]_3 T$ @۱W=S]βNomJ2QJl#ÄC6 iꎌ/=/ӿ|5^rz}o8?,*p|뷒u/;\wj.;ѓUr̉.-13}֚vQ/4oCp~eЇ}N$#Ȑm/ Kif:q~>ϖe{ em|AhRF=RRnu$Wl2%W"\vx"?nBSC fOΰGOsveA%8tYqmůrM>]W9 ҴHLH"tfͽ<_rH8_(_P;,Uy.7Ȃ \;HЁd47`Ӱkvɬ_H:'btغM2i)m+Xh%cc{ rN*8kc3lX FB9Tir]NٚL8=e`cBRzK07#fN@)b+O?6Z͢ϞL?C5XІ(Ͻ7?hwjFEJ/]U Fʸ࿕5B_3GM#De@cScklc(k,3lo",[ׇr۳.&\q4o}l/۲`cP({tDk>)֙Wrbeз0\y2R1;vߖKȵrQY߬QPb^(ᩥ{Mya$fA]k<:`+~M%U3*5N[Rk^$+9 $S^tdYmpHH^\uj.,[$j@Zb)w/5.Z0s&MALH.y+7Z{o\EVeB㨾2i??l((9ԓ rE\HߋC4T~FMqE d[_ᷨKuPfh+&j:;[OPJ?t6;qJIcEa~z<[l MJ}Oh0<2e.:S|%ڽj+YEثk2k4\G.cUtR)"2zޱOOeӏ 㱖h ?z h`aS,kL{rrrQ(=p<0`Z4-}mKH2ZQ?xЌE"|J+S^顪Ba@yV7کF6GX#^WsND^/"<;2WF˭G|,j|6/ ] ]~â^ㄝ/q,keisbz "^%1xj[ Ako΋wzĎx2`D+s=B\!@?3Y:|QZR J ?fJt5 4M GVXFD<ĮjPkѷkrk~A6)nVSxKME:p3҆Ew(5)YÊ+WKm:Wd#Gԩ/+AMw!{GoLjďC{s,Mpd[G02Pѓ~zbIUgٞdz,F> !Y@JƉF(O0zZBayXa&*`*m]gÞy֕F\]u?qt?ϕf-y+  [-њЀ $_h@g=w]A 4<mָfe~*o_w 5m;N{v(4ӛ798u5Y{Uy??X} tFSV` ڊ?)*hƹD? ԧm -m Dt ÆLbFl_'&*ww2Y^O\UpNPYmY=y*΄~iP:Z&£BQ6,blg5Z t}fb& |X1U[ZN7,B K(?e)[d*?1Ao=i?N]&j0S R3LiʐpK%O  M8.6oa.D=`j gA%E*8tg5bUn:Rn 0ÕnW}V+>w)؃/T mPW =g[n>M'ќ z0 t)u8.hM-ѳV>UWoȋۏ+(}ZpݒqX{oAqcx:F=ɅbBddؿ:+thW/\&IݽEQtgٓ(Z5|N#~Ō@=S6k[Lp>N&Gygc$jTInҲ5cxLc*SsΪPhs!޲C"E}Vd4s)fxsq^vA749؊i?5vwҢ9\=.`&uF:K<$ŧPf }߳Mi_"dgfyeUG\342Y싊1لխYdj?wlC4)sQb E 5Q*- <=zMw^t7ɗٜ$4;@bZJ:wv_*­Sޙ (,N#@SawC &/^@ϭD0,tE"ΊL~n̢Ӑ5N+ 0Y*]AUkG2N$ n^O0ۋܢ߬IJ·{׬[x_捂ڿFhc{RgEi/ЬSGMTב L-3҇n dN5U3n!iw'C@Nq`'*Zk H3n bn|WxdWG2QD, K$eFs BFǒUl2źo2{ldz?bxG]!80JZ- 捙kMTp%񞸤|#&^L1d$ 7`2|~O-*/fjŮ ޸N2i:T [&$Ṝ@x)/>cYH$q}pzwhJ 18%3ZNDUQuHgVN# Ȕľveg71矔NQS" WyU{Ť2ٴһa\k 8nZVI(Z V8Tq 0*}.h Ye2^5#Gnz᳈-*Lޞ}|գ?ƑNwN_Kͦ}_Nl D (#R$퐒:fdg0`LZiAiewmluecU"Ú)mVqT[\~ʹZݻY/w E4!j gE\ڔg^wY/R(kGJãGP=岍zQk%(;΅u93gW Wba~߃l]{bzۗ@DT@bίb>mtlĒKiʵB'pom٤'2z^C*>x@M^HDXTE*H[(;h^q>)[zK~tu.#j#N9b" SM,y@ڢ*D醇3D+~̏F =%N!\4K_@kaϻ[6V/^p}91iufx΍c9 %!Y";\ TWB[%plS tg^47mֆps%$*n(@dčMabX eZ򭆷'ۍX#._Êf 80[=v_ m790Fe79FٱoJ;L< m&;D[C|q i>?;B9-S{|O @/g(< `@n$5].BbEUv"Ir3rEs"1ϓiI.LqNr(NQPZ}L\m=B?hSȟ;0H(d~f:7eiw"B]fQ0R--[zTqX ZSi+` ԍK@3n\}[h˰+R 7~oY筒ƃ{\S${ ]d/CTh%:+ai([bD7VM?" ,uӮ*JiֳTA5̋ 7^Iߌù);y]\o ~?jx]jC(W'omjN/$6;xlK !ŖW;.6BJ8zJ.l! N6h7P4(mU$(Tr8 tphYi) 'uǓ[bv9X 5d-JYtT#&ky2s./Oݳv!1{Cĩ7j%ο NʚlӖUzeM_+Ϙ  da\x :($g3/v"Ll8*/FƆs)eIj_*bj0@ )@y%j .KaФ>x XB|3:D| e\cc Y,؈iL 2d b~S- X6AH oA[znZm'TiM9,>Ȋ: mB~9E0v@]d&p< uwnco9ͰK֮e B:(CJ#ak\zOF6zz%uP*g:t2p AXG&eF)d,a^p2f1)&ƔLCQ-'fc웏aτ; ߣ|} "Z=*ati&]3ABI o dU8Zh TRPX;aZ (F[gTr2wx6@nFi"wcnuvݶFLG>N ]pƈЄYKv(Z׸ä{czqJGs52~)$t7YYg Sb\B}+C1E`Æ*fEMK'nxȤw}~A+A+59]zG6=*r\q0`_4 .iU}I1FE౼C|:Ҍac5 ^weIϫo]jR";PIy.m?GVڥR$|aj . Q+)n 6]L>MTv-K闃vNtXz m$3YCŵ4W7>*cA:)ֶVk46!!@/p:_u j~VEz?%})}bbo>GYFr:D #~N.ˆ..4HD. ivK]G /zniRӨ'dx6adw,W+d2ZS_YK" y/mL"-2ϔGUOS,3nQtA.5EXME >iwзyenasc㤺 ]P`+ c'6:,G_?>{2F30JAw -Knt}3mv w?W?ځcZo6':5V -V a֥ͩ8<'VgPEy]c?|ϫص<̯~%.]7U喹h5,؞6P궝~zR?:+MUt.|u)ٵhmYug+|6Z}:M| a*"I$XF]H&KK$IV M[̶S)]3WQ0xYH. | EҤԊj ʀT^EΦBb|ZWVa~B&[G8+oHc,+:5\w`fڽ} :yY87rJq}<*A(%wR'- %ۈ\㋇ LѕnnoP4R, ?Ah6~*FVJ`kN=pnpTI1zf"[G'Vv9ϳj5a߀"G;A w ak̉3i_ӎD[Â%|~]!MMrk]_}K9ĒPy 40PfT˔x椮؎3@ij S(bp0iJyqHAۦNDsBTgbBw#^hq!: #W ݥBYE9؎Ou$SʭAf{(,SGf;d#eAe߾"$,BDot]Ec6P91L[%~Ii4 9KOVu`swI!RF QG7~c |hh+\YJ8bΙOZBL0f=M_nG QF̲?3S*B E;6$0z⡂*:>l"s D6J/㌣oV q&6C"DJ~k::"1ErITBьhA^lwF"SL[[G.`~b~{-F7o R:?FL"]' Eo+!rev7TdD279|r[˚z;iœϭ~̼-pzj_?LM&fqCDْ( Q(QypmfH"aP`.hWk\ K,`x\eWFCO,'~72z`3æ;:h%\灓 ?@éeEF.p+ʑDco$vd"yBGSh\=˫ǫKOIf^6 %8ԖPh.`1(A4]-/8Siy< xzlhY_L SC+a!dlMmŪ >o8R\MҼ}ﮢH ӅLjgfjoDE`AdjΧd!K_-J:r&No}{4X+#1!ޮbެHZ$d_bԫf;g!U鰶L"@3nAgtA+mb]w.AFڱA*9N) =ҰTY4Ht(dmbjɯ,dI3]#d"\BiʘHQYpmt΋i:mF"`g/# d1j6qSܵ!9FG^3JͩU2{>*<:fYgs'.^#ɂrKUlxjUxӖvz>""H]BCH2a+| gÅaZ"bb~ =; ]_\ ,/ [M\kծt !/d<ClOC8xn XJdvw4aB&PKƂ!{@CFZ,.^qDT,r"K$oXu>: UXxIM 9ZC1`HhK.߃Sn怉f ~Lы@TC%VMk4qHK_>Z 8N_A,\k)^}4 YqB Y%d}|v1 qFNxG뷹8%J9Ϩ}yg4_ gESn`30ˆo?zM,yu;űKLSeN6()5#h➆ג#9ѕlg~N7o؍Yjf0p`2`ѻe7pr*졅9|;WZՂߵlw$Ϝ ]5Ϸ縬>٧SDv#zœ*z!'.DXiem| 6A޻g s9g}RˈJW ~US`:O^@*)+EN $>UB.6 kes4طōhj;="wLÐ.&s^HeVP2',I%ϒ_cbeRu}CovsP f'jbDûYl] ^.6S7w)3-ГɌ8?|{lrYF4S 6^ SRNj)'kt+LF2;K\G}U1aFǖ;B~bSw?O=[6u!ch+KX̃H7']-h!>z Tt<ȚE X`ה|?vh$K`{0dpt+,m"SZ*_<^x0(qʔ_@F) }Gх KNK&ڗ'ػ4HZֱƃ ?9o)N  hlWP q.̄ #j. o_Xm?nZ8h\ތq;.TK]~22;u;Ul 'gs5ξxu:'Cn+[)G@8?jkUs?FhA8]ƌSX%I)l?JP؞C-QDŹf 07@QH>ΒHlC !#|Z AG+vtfC^}ylZGEwGGO~v͞^ot,h* :8şjA2YH;N䧔Cͅr{Bf$-"5Y2{}6qMvPӴc6>RUx@k,X&*XOF1.MNJt+FOt?*?Hfe=ZvԥA a@?ڦ ȍe1!9'Zw-1V0;'tWnmaazD`6MshfbY/f<Ɣ&Ɠ_!4?^ZȴREnE)YnXݽ~hՏhF"-w;5*R2}[#%td3>s$SⁱAɀL0y1tXFCWFoc,g)7".TwIOА?dʣF}?']n9bj9,~]Fp)gGe* b`Vϸa?(la~֛[IZrPlCQ@Fڼ2C2e/Lo[/R׋cEaK|*bȀװS̶Gm(\#QH=dX.vO 4oRt 5` nd'1V"U/Ee@e K- ]BӪ+l4 +\{01_ab#f79-ΖG}-&'+=ounaKsbOdq% {y>~S4!`_Kxw0Y7Zƀ+g2Xu&n&%r>~d>\3;fy*WGhO@$,(+c4]-G+-`L$ɛΦ{{dNs<,hjk~Hؕ3k'\Ŕ `2 )52AE`qaڋizhzW}[^/cRpf+ /.lȩrᲣ ($ГaJ ~b d͌<MPϐB`?j"l@h w)׳ODVY,ݹ)~֣k;%vN]dzλ~{0]ʰ[XbG9r|IuN7Ckyi(0|~)(% ^RubbrʃT}X|ݦuBD3?7@Rd=diw|vs@זϊRL<0C_*lEʰRŚ̲VD#tR+4-,gbj}'Gb$Nno37HxݑE2nlc^Xu*̗'t<]{yQҸ>)mr}njK;#,HT-@ 8` nb=-l~EC5~O@YTM>GjՈkDkn)H~n :ʲX9p@q~ GCvy$!wsjs; ufk sR?ϫn2;ww_ۮOpkn¡l {egiՆpvC ¯wfpo.&YODa$R4y(a"pV6]On>PVhf LO{2k.o{{jIkK(Y}uS4v L&ћT`Pr]HvdI)d7b B0K6~J'wUqTpfh!fcvĩYvoG;T.ګki6H [VM񛑦_@@u#$O 9St]q[V43&_, +b7"+ݽ;2Egf`^ d~Y#oD=|; ~$θrH\chvͮ(XQ=kGQ''@6M!,gN#whq̿[^sE 1MY6! ሑ%^*5gkqe HKȗRyUoHN|Z=$J 8tSyj >Z+i(r(\=j$,nJD- :#>VYZ軖 n=\cx-Q}fjLv[:\YVLOΊ[{[߯DmPv'LȑS!}FCSbI lLN8<ɡ6u?CKf6ᜂD+#(3UUN3))3ۆ!ʒ۠5XR>0Ӽ|Th{6F36;/mjYM <0ql5+a<bHG2|Bo?{ I[=MiWڷhBqGKSz^NUsօo!Zc/^% No=Yp¨/"LJ ,k*#OPYҧX];0ďKsMGKo@-N帚ݾCM\*zal*KѼUw] ܧዮM֫7R7;f2b{urfLql26N>BKw".Ƨҕ+sk8qq_0 ]aQ, ig()kO|OnXKܭuGLs< kJGZ_<ͲiQӿ鱪O 7 10: +-0 0XxF;V"GMciΥ':o&‡; ]+VLz$ڒ7Jhot䣋z5KxQnZ`C{reSNf~LƍnT)# ]gZ ώ'?a\&1O ^Dw\qEpl=qK7QEՒ1j%*eo07jl+7~1@#pۺbSG`pό _c{a6#B=.^FyN I(f JhuGpʹbw?䋗zk",͆9nΖejd;[#8.pY3`nXm1dz,\݇öVMye6Ws0BK#T}Xq5!gt3~:n u.Uf1.%3+qH?L_ڄ'-pv2TK; zkTs biєwUebQA(uΡC*hrJᤲrIUUjE^G<׏n:"EtV;pMu,AP#쭈ʺlJ4T\N0.uT-zvipi> E)vzLa=zɹ0),NNjyJL,$K["ǁt2?Z F,O%Bv|I~%>E9WԞ5_̬fVÿprc첰Y.jtVlǗ+z(5mBDk/FY&ѿ=|0Ae찾T =\bfLC벥5thg%Ujs;q. !O@ؒs2v;$\p|1Y/_`"?5UȚbYѵcDLyVԩAV24)ɲ\-`>$} J+.n$z b%οtuį׽1WX5&6"O&GƘ_EGzP62V)vFf>OX'a|*?{k;Z,a)%A?c'VsyV8:'p Yle޲8zh'+ڎWp2XfQE4S>`ANCb\YyL$y 6)mhկt I}CYr6${%=Va3.GBaZF..Zp;$PWU}'44q΋[3s[KxޖcV` V"-0RnCwv$? Es}̪ֈL8וEׯ3>`0ufd&L"<xĒ,lH~bz϶|ɤ@QT8uC>z#҅4; ITqMf>4v" J!IeܶϛEE,eٍK l*QڕD EbԖL2toop%1/FPmwUai`)TX_ ! 'h }74cM@`S/"F"<-Cc])+1YBx'DvՒzwY䏯^7ߟw[q|<%|@p+s&piZ5)1Au3e J@sUIzEQ#:+ܟa臘VO?9⮶},lG^ NBXQذ>} 8)QƎt vu<@b%0 {$!NrcO"eu{wwy86}B` di EwZLn ߵN7S'J d7pڪ@BƸXU7߾j>%rmʤ{@h5A[lj{~)kyЅ.|ZCK彸V\:MD:V?h9;?^-ݽ1]#煶!&r^j+y{r=6,na@"4]X}_HxF;.ʢX$T3G|\A z(A{ BPtF(oYJ nzZDu"_MpkOL:#6RP]J/E0 jU9j@P ?.+t'mpc`U "5K)0pJnC3nʻ cxyy&H>ץ\"G4,HCXp_.:qrS i{;n\Rey;{)(}vVCUO9-^ 4OcdǫG\}vu„զq]81?IJ/a4 qVcI)@ x/H7܂'qr6`k>x4s ȗ279QHqEN/3Y'LcG"0@ B M3_&;ݮ~?RDCyDP?Ĝ\k/-94?'TaE,](DM3]ptfu6 1묽'*.,AT ;mh7a )ʟfiO-8ms)y'3\5 @ˡ4y:=o: |=F&m^d;Ώ#*Ҝ9Yh$}P!u2x,P?(T-D#J e5!_gmNr8oWK9"+|MA9Q M+aqF\;ۖޔzp`G@Xh.<ҨZL]?sSҚD׆}J{P᚜'L_-up\K?nHQH0zIwFZHW9"148UF/zEv\Fw@gռT"?_j9nkn (W5?ЋPM}*ѣMUIڼD1qkE- D[:CTzOHJ'ӈ=;>ϳԄMLx8o`ނr]́yy o`ԥAiB^쓑01VWB%Ҟ`;L1*% 121lVMqߍh<_@CbJ*70ul]T8ԑ6fmwbߌ%/T2b#v'3…=. T;$N PڎejqٖQrphw6#6%KZYj G4rRrl32p#¹NDNNM:!.r^ׁd3D{PH1lWRx.!P]aqSl<lzqr yTf…-kW @5{AW6%Xl3I5X] M)+|#~],\}RVǖ>$z=rAYLGx0S:Rs}3iV$S9!' >m1.z$cfnK g"iϥŒK)zE# Ĭ'HNKA|d0?*!n5s&rDY u}6 祋X&.X#ȭ0ܔtGͮ *kf˭4 B:(eF3Zh*7j@ |wR'gn PRyeF 2`a8OtD;d__a$&w]1d{plXB&xWý8քʼn#8uhf~]"G7BM>eůkmTB>)G{7%n {F]Be1}/ E9%N dk"A͚NAC0i#k]c׈"n\~muITC)|@)jߝQV`D>Q|Gd)YP}Yp $N_40L Ma Rq1ts|'XtL``9"I<%O(Q ԗ$?e nhB>E]35e?2YTK?u ̭'Bz |#G&|Q"& 'x:}D"8H3cʕu_̝[_3Ϳ"\' @pw5p/k'U.{Y3)guŔzqWx^`Vw:ӊ/ ( 4.D$7Yߟ:b 2nyS.oN'myOdXo'2߉X R,}nW902VH+=Vܐv?v4iG0kǝO¯}TOƅT:C06 HW;;v7ͦK!SqX8|yqz9Q$z`Av{mT|C5= ߱;':qNXkU ~;ܛԞBm9ISNCPRlo6=ZJ7Oa׏8'& xlSsK-qt|Ԙ$@v{. y1w<0ۤR,h"+IgoN .~a3* U?f9&"+tח*~L:=<j-psLM$gݺK&/; BIL_Q=6D_/`}̷j`hFBdcNj>*O^Ś4y2%ep{DGB+za[qw*p2+9o 6q&aWa' z>ኼ%n4*pXW#1צG]Ţ2]?G4%EW;Z^`y@udwP gJ$bjC<Ȓ\,އF=] Spt7=Idv>9n&t TMUB{So 9J;Reh)g`qkZYA.)u(FxbZ ˂BT]pG^(?HxʴLPzNo7kh{|`!3sp#,t^W ,Vq}k ~@删7K",,5w8#/Mp0=|/eK˸C&5IYE ݒ@P4:@G_.cZyMRR/:tGGx;?pXI,&*#WBoZIrc ʴX0ςCoSjBޓLRRֱԻ|_iM" ?Z$8MMͩ*l z7i⵰)O~Eၡ~Oks;¶F 8/T ߯ŝL`=kx{& *MCBoj0f Igʫl@iJE1K]Ni"A]k;XSE-Yr[Kb:P=Amj*yLyorgx>mKx^BBF  #ђ{'#hYi&/ZoM*Dkc$YoC ש Ձo4T>eqlYzn2dckuv8%Y^ʖ6#opXtTs:jnӦ+AMW)'6ɻH0͡lͫ6!4✾86.!X66fn kt{BY~ mIܶMcC;BĨ/ \/03W;Vt"w9lődQ :s`zc1JrRz E{1bl4kDl lPo[j_ =N'7hA<F:/N+"nb0M ZrؖgI'w'ESA+[l4N\[Eb\{ażmc1RJɴi^0NmzH,"J0f)8Ruj9<8)r”.K0[7۬6O ^W(ߒ'ιЅ}$C"j,e ox&5ȕ%/ط;F]6Ťy>cEZ6c~JQ2\jbѯK]/mn|UML.=XtZS^gK^j8:FPеI XPPfqcՐ벛G| X+?26R01gQyM;|"uVpt=|gY2ţ :?hSg"C6$yk]#ndBl=W\)YBf)ѥ2DSؘ.w-+^f=˙W@iBr]&9byy)ITsvOl9A}k4ҫ‰`qc5_ |#P钕A5]x0!r 7l{D?[9&Zȱj'C ZWsGCreK1wE^YG  ȤR|i]Mwذ"9oQmw+!u_V"ꏽzc.!Gp^mS2]DT?+vI-g9ye*Q.LegɺIauš*6bѐy ((2;~I<; Cu-tXX ᧡` Lq݇qΟz0Fp^=_bxExS/(Y*avQ2V?wB \Gu'΃JO w*킠!'aᆪz/9?f(@Mẇ8d]Sdn<(s閣_)oO@rw;3!!&f"Ka=0&IQJCt H ڡY[b&@LX U2'<ق$7o< (EZc/0sx~Qƿ9]S<ҍvVjVXY#H;:<ѡ6&(U sZX"Q$mfz(ً RKdy9 D^tK/|_8NPd= #X8vH">lH`=Uel_.]JBDSH @_8 e/meӓ i]zgY@.%4WU1ɣJmݫ../=K2#ԚNmKDC,; _׶ou'H﹄aOvF,HKؖu'~$.T{jȨNb4ʖD (PYwbhIu}7wm7M%~l>(aujwZn>qVf>h(F1lZ!P)QvBn<@[@~)\ʆP4s#{HySY=%EV<@l+ϱN$vRYD-2i;7j<3}tEj|&wici \"Hn)α`X% o0YNdXc`=E*kSMfGcQR gI0"x8{==h>Mp`"hю0~Ўgߛ LuT㷠F\u,ӗj$,i.WVq+"\(kW/MC@G-,ou;wSvzhشC89=?d8~s]߭8놑hnt$t8pvEP\> ;<96 ҽV(~ =61j>+EpXaݾLqu>bw!SVSؖ`cY}h$})N:%!;]lyK2O_ސȭ~Ņ9NGVgK#`ԻlhR۩UI#$5wG- B'DN4'і^P3.ppe@X5=&b4i4tHQDlpR닑&6t^F&yӥƁiz /.gS*q*C[-VÛkESa 8SO 9&"@ j}iIQC:j:b\ ÿ2R?)!qҵEe(m ?xxI;o!Rf`sel:ePzJaǖL;IMSup]:t)&@]T`k;H\B [aN6Z50;ż>0_ P+H=G B]chDӳ a`z&= FZ l f쬥+¦@[녓ƀX$)_q"ދୄ;5l윞o•v "M&6TO,T\TGl׈hH9oW) ZpC{u"o^x%lu QR>s\ L+/h5qT+ۯel2c"o+s84#P3^Ğw]?DGkyМLu#I#[VZ 1˘7g~+GQ(b莟P鴶~$ #ް yoh\rբ2Z.>2AM1z`q]IF[O.t'] =h& /SEds0ז]ҔG;\D!8Vf\(f,kK@2EhbÒ˪5qK,2yNRk )[o%Q;.[s buryX9b|nR*)&2  h%>|TAf^h.ѕ86NV2w"BB.ωzdz$ZLY6Џs?itjY&lR=DDi<{,Vh9ܶZ~'"\HXT];H::F3 =fnZ@5-(2P4},S'50j./d[XQ\8D/rQLH65N*"%Q ԭo4+60 ^d,+AlYn+\vw!4-T'-ʶ oƢOX{DSw <ꆹ5 u =/2t bnXf1䵩$(Ά]Tz."玸"`S%>%mſ[C*7,!.׀f}[ژ;nr_y*Fxwhp PD%y61?]k$Ȇ@ж79%ƾ+)__LG\pxU+5v#Jkz:0Ypv9l:\5{T,7;(]1SKcٯY(qާN- :Xb,[UH#i lLʄldT<'n& t'}n_0p&gXqY-J~5 MUֹ>dSau姽L[[p] a`ʩ/uz~-hbF{$jj3aٝ; org\g|ĺNí5P!vjϬT> İXdpAr,/b\XaFq*ˊZN(R _G,&7U, \r jv+<{-eF8lVkXNk#3_˼PgfR *KRmp_?6#D&fT|AgzкMqgҬW~ays>gY\s>!';n g]+ zkH(hFJd%S LaZї<` oB"ہKRlO/ \ N"(A%TIgy 9Ay‡Gy αPA\G]R]Q/~=K0@vjŦi14)CE0ЈlGe-}[ yDs䇋Rvsc0(M?N5Ƕl3v:WIi=bf&Sk˹|C-- nx fL)j J,27vR_2 xaeyn$3Q<95?J^PvDrvI˃mm2 nIgcvtiBNpsɚ|+yp l3Q޻͡} "E8#He)J_Z?"$vBa p%}ҭ#s8307=Iņ].Du@gL-݌VGb'#wvc3sC-yǑD=x!)6QE=+hTw^ӓ-夁o02$b?yB{xox"2-s51w>?C3g˼#ɀOQ0`LLB;d-O-BH7  AŨ:D`G-W8^}{!0-c-(Ȃ6kb?T '<= ڊo1`ͦA6r^ų?OK桏>#uE,&J;g&dK*sBk<ŀ5F-z]&fԑA,{B13A`7^t2$sB>56E1w1,={;@Cěh"r/GEԪgVMmwϽ= clp_5;}%;wn9sыV'ZKr8=}:ʄ3>0ScEz R~ƛF5&< ܛ6^ܿ$dPxCJ< (Y \WЃgwo:H}Rrݞ-~+_j&k9QP8Z"UxZL;e uA!u"B!TUR?=VU! /1^C7!bi|+kκQ==h2epCՀ(jļ'LO J(8(nAT_0;sپLG*iўQP*[.Y^3[r8jx4gu{hT~LJQ #6ۥgϵ]ur/2Z"ZSXU0!tGgf1Onoc#PQsѾjFN2c8ݓ?ysԂ\M ;\ꎳt: t\HA'.{_3T).s&H1# D!Nk >H5A~|e]~F\Qvx[,4kYGَd9SNM5eeK8l缅s}e)'cnuF7_]$pJ( 3Ft3 Ol<UϏ9+iT&6c?)MQ{&H܁ m"`6kmM:G3Șb7",FgAD9ŮTa<[ ߥ0q3 $TDka#ڲRTO+?i"2>D@ .0xbO S>?ؗ-FdZt)0נ+8$@iNka1μ`܀:1̈|j.)Hm֔:7P02|jk]g8! !&UMw :/ؑV?rOjXNv݁sI3 3}q+>`hqȗ5 % ;Ѿ*hf?wsB ҫ FB6\DN,xm[,}{NNdlgwv ֥n`']iSF:  FO\Pd%y ZYk% P4S9gi.qhЈYJզp²CvJ2B_K9i(W!O?.iTH9"ôhZ-Ps$8 YW2cL:%p":{+S%7QlN6YVhd 뾮gg,$vv,@Hud2Tܫo#t'!hҺiO>Ō7 6}).z)inmya(#YJ$nrM=a;KKIߏ 7Mh}^] YJ|nr[2ȶf`YVI}Y$aJ5e:CopYbNG`K@@|t@|bJ]65rmk^6v{Ζ-u,kGj$dJo *3s.A ^8vɵk\&`v½ڵ`㩷br^kjHOvN(D\5nkAo,r&0P/9xl&*DP|{ҐuxTpn{ԫf^[`3WРfR OfgfonG8P_'u -ђ `8\(!{Oا'ٺN7T+PQbf-?+V$Dط7Z4b??ʙN!tՂ`SvJ|+\׮և#\ja8⏧NWosnԘ$mSE?dJ*i8ѳFIŘ&;&9rCtݵ mBexf| lLS尚|ĕ}t wέ'&M6h5[8?vR-Od6G!jk; Q. |;"oIGZ~8.>*hd/KHRCwV)Jܰ./7 fFy6?&JV,ތ8- BGjVhT?dHK_8Gͩ VĄ~a~9ybG'!7?he1j$w˻ǭ]Y&!(((Ђ?uM)ߣRAe %^nK4LPZ)@UP]jn259wLD++'-HkSCES(Y8ݮR!)a'"y9 kyn2NBWwٻ7x%* `VY)'$)Q96%梦bKh4[i:KQ#v(gܼ1}X2m~FWj{}@J0?)plv0O>=tL>wH:&ֻ7p`Mw4Uy}aF7+C<NSe_VnA¦+2-JE1tK򳻓ä=E9ݜ8#{6>8#]8 kV'iH܅1EJڋ`" $(^zdpC!0J־3 ,NK̅9.p{J-0qXEP€Ҿ0sS >{8L7rU-wHWiމml~86"u{޺ 8fެ6xsq!5JŽ e viĶlLm;AAk6 v*C Kdbj= YcOkJÞCW#1,!y_\y}ZL__ uuC(Vt}xWb&-⛱B2Y+ӎz.# ] TD 3!9ϔ#]SC)>YFw9՛AI"IPk"'Kt⻽l.?0Bc1VE#|ֶ4lQ`Zm=#&k%6T|ŲT3Y|>_|j=##Nm &<Ppp A8ͺ`d''J'{'R-#r^ kx9V ZdF{[ zrk-bGpC!{.O=H&OPhߛrevsm0T?Ԙ5LSm:f8p$4ԄoRmç\ffP EXz,s]):WH16yݭ֯T܋h$dMyFҨK 1KKڕNDʟvR wuiwud~7UbNd lQXrV,,4wGMKo4pf/',ͽ.9ACvn_Vtښ~>x.DZc#o/"9=Uf[_p~5!oX G!ouyxF^͵4- ]O͎qvBqIbkJքVe`8XIpNCyS4zuz*'}lL )G qyKQu 2FbA̓W?/Q0:BV=5AGDX74=B ?#t;rB;{i /)G8F Yi|&-bK4g=197I:A Q6Di_Ķ(]9#>Jeg n,kQXu4࡚ NU+ʈJD-^$}kmMQ.q\1xiڸҋY,*R*2Ghـ{ s T~r͋՞* mQl`)LŦs Zhi=F=<_3{{ZEy֘w>YB]h3/ &7k&znCujC͊~D_GܖJ/ |oM*[&^uSq: #5}<S($' o0W,:"1%NޯOx +4Uܖ|z6G͟ mV%BQZ,V[5 pG/cgA]^ߪ"ͶW;QiWSݍll*\{ofsei7[Ř=,4~~,\~u<Yeh|2 ^R^ؗ潕V&QT oS.ʌ'A4z NgO~qRù $ЙhUMtG^לP8L,}j;Ղ%Y5@᥼?!!tۮ3.h di$ 22x aoP 檭PH paK 2$(k1yt7k.Rkc\Ğ|U7`$j\8mʅҔ;YLzז;@myyqP{;a5YJ/nRyY9D  OңW#91L"P7&2}'0 D w:Ua`όA8_݂s\ |-h wOf̆)ZY$KL?;:[p5/- !H T>劀RFF%-\CuHդ`x6xB5T&MX9+*&2/sLHHEJ bOg86Ƭ$D,qͲ /J+(~:gx)wPKoa"@GD5l#_iYS[0[i|VyW)ru(͞g{6vӺB"E+h]ofre'[K\k빻ОN/.J@ڴz|.PLDw |L _9c]vHy4CO_=.;XRZ-aN@+$3qpĚ[]_]Im-sV Lp85ٙ Ч(i\]/7C77 oLOŢ(<>@˯24.$#қ˓#M<&7gU#%Nڀ-CԱ&xcu0zɊ7:2,.A*Fy98p|;Dmni@M=^(eF/" 8G1VeUlSh=dpUw^8SKu[dge3tW;ƛ((<,r&eK`WEM ggXVt8 I8:2<&E/vظ?X,v}+ArX b2{ƑiS-uYkn :vғq;tVڷ*KY_O`MU^t.ewT+#@#K²oPuYaLIuVGWh1OL!]kl$yE \ji]a=P=&yx3<8*?#h:KC"tlf~b*x`Nз.U|\)RЬuM֖mRA~̋c&-B]WqJL몪8;KY ~eYWȰ= ^P*odҬdHAC]wLͦA φMH\c&<2ʄi|T2#,C4XuN;_PXÎ@"- ǬN3{ÓKFLtPPڎ_`b饦zC*=j $c{9:T?N'W,^BT2V?Ě!m2/,k.3պó`ݵMEKgjÇw|`k4^-krÅ:&ga!2~TNTi}(Ee4-KqORb$x*^{4Ȝ\Ԉmq*_]Exn)u/'y5r |\g-ЄP'G|I]m Xc&8x^>);!ПmV7w#52A<C=|~#i2ADjR30 Arh p-DT-K>!>ǿC|$N-7xṮkt'8#Aj`N\=9^a۪%pr\M)q ?Vz-edUQ_Ӑ2>S~K {>~86D1-CH4 sJVֳ)2 ݿRoH+^< JGiy<Ub2@V*nD7żZ/;9hk$B}&݅sTQϘE, J" /J1bDs;2;g.NdtF ZgUB BCMW%n5Kh?'eWw|xf6ja;~6Eȋ{Unڛ -"ߐqhc7.J%QlbЛncLKc^џM=(;{0;swr&tLL^30kcE[훉`eC9h:b0S\6?Q_/UUY{>1j$JIn(- дܴ]Zx7ukiPw a%tkKΈ'^>C 9Yxh,缒 |@?`Xw=NI]fZ a\V_A鰡#ӺH'\w93lO4:ܳv2/{4j(*]IA[B`Z:PwfZ{RoKȑ8XUdYg(fi !Cj'Tz #4Jt7ZoX RC̩Bq ޚ k҉a(g 08b^n;ۿtpɞ<D5#R%9,B}/!7:s F-׭/@#0r)~ ~krZjTڙv!-n\ԺbD60]l˭SL},]֌-Z&\Z4*QD6,[qa( A\  jYpZ@_9L&@>2qhLkҽ"Tb`O]iF֟I~@HJ١ WziMC@~fӕ/H`uE(gm2l(LKş)MԽbBf~Q|&_ߪq[8ۄς]\rȑ\`|;ꌵ9__n5ca VkUk GM/(L)gS==_`̱}8)Zx?6eyߪ⦥gOd p0)Şh_1 ݥtbTJiʓrY ~|Ỳ'ߨߡO|;nCT;G4 JAmv g\w#/d8i ¿5lJb$1f햌*4^7QdeliwP{)to~Cl== HMh0y۳zvуɐ{?qUQqetXKߕgh 'd?†mJl?tM]=thȧ3g9Dy R߯oQM0; |ɼ8Xmb)ܟje.?fWC\_Q[7H P+^aB>%y[rB)s2WI͊r"Kj;} jvT EC+sXO? h lB|-*rpqjOӹFe;2BD 8O` 鋝y"Ѝb 1oЄDbR#gTc9s&#RXN+V}Jk``AoLFPOmY.|B Pz$d%A'C&.7F3f[.WN?d _B4.9)p{(wۧc@voN!hcwm۲"naɽFե0L=Fq!*rg@/u+0@ZZl-E?Tg;>Ƃ`CI! W i$-Y^a"I:tL mr Ͼ˴8TLQZXMPIy!d*_c{zU^N 'a;TʮDd>Q5@\6Zqzfp'4F~4:4u,fͯqiXQQ=qzm'𫫓?  3iߐYD3Q|Le>[2.pRChRÑcbs ^B)U7E*TEV Y? }f:4ͮz9F`uMjF#9UQ!ٚI6W\Ѳ^(dtרG[>PpMK1//BXxoRU^1՝dNb<.iZGzZj<73u.?gPT^>c qGj7 [OM\ڏ-| .ơSɂe{Wv,Qz;|⮠pc^OٕQ6;QGOߤHowQ~:Zۺh0x=O#N(%*+W%!7zefjE'H Ul!SͿ.AfŠ:X'cOg&oy@9`$tgabM523^Z+aƸ٤8$M16A6Z)mR7AyG|n%.RxmX/cf,Ԕ5޹HD o$7!^ 3In +ZA]+x # WvHz޾'D){h'd%)_J1HLB '[p1NOdV*P`4_bIl/];8_/^Na1mȡt 1 6=?d3 nB(W;p8î/;ro'`T;BE < 1:'0% 6Mk/lCfR \WD|'-"w;o"vHَsEșpG- + t!5dh_j6Li#OJ%` &:q [;l#E(~ =9r;'K@-8 6•o׎ѧWk3L26iu !1G9fͫSC'l5Y_+w *x2j߿1Wr~McǜyTVc{pW%Qm\kaLW/uN<0.*ayy pc #ݳJQ?> R*\'T v[~9Σ@icfU #⹕;y#y]R3ol`~,F%s]kİ;_05j/л\ 7ahD\dW2|D:yz qb *Y͐47\E z!{B{9 -?/:-N dv\6\Em ^gbN3HiKz@%Ð`C)+oP& 7")nz]`=|+2{ax?MCۢy#t[&t6oV%^z$)z-V|0I g+𘧤EU=v랒eTYRLbi 2dps9w_3<׸V/)rRU-DG:D|6 ` 3s_yZ 4v7okhv$L<*l8UdvQDtUޡ+œ!#XL!%(ȑ0tIVWL00~;!2Ә2--L^ѡ6 {SNIP:6ܞΐW}O{!2*gd nɰ$p7:~\X|'v=lemLT<㮱?NhqV=2ObƇQMV1`F(2dr[[w@/ʨ."_γWV%|3'tv _ W8e dNT|RG.3-H̄G^V S<:QLsҔaIBGB-vήJPoj(CS 'w<lj8<t3H{v꠶dr jSwtpF|6'Ylח@E \%k"]I9]HPI[4k׍%jKkxZb{"Od-!#>28d* 6"oٶDDUʇ9V\(Uy`|6 kɖ]l'Zy'ÚU'fR"`͡6aǻ٘~Ez&};OsCgDm49"F}hKQGv.t; 8^'lk~Do:*{@KmHKv/Q`mg̹Sl;2Sҥe>g5'$Wfcy˜))>TXd"H0Bă1s_nuv[>ckf@0fLq36`w$){swYO5ʁŠ]5׼!.H 0pFe5ZM>ٵpYQ Hap4T60^A';O c |F^?+ag5ryR1%y:cwa-ڶCsn~P BsmuA;'XǨ_Bg$lzܬuC ؄o[fxIO6\n=>c3,rUXx#;v`ZHӢֈOÝ^h5O؝̙'KeEwp|RNYV,axt/w* 3 V}*꤮YݥM` ߗΑ7̞6$~$ŁtՁ7" @hmKCXC8**xP 1d7Et[,TuDյսy22>v5돫4|l@[N`G̋uOO<7 >{+ne_qz/I 9zn`~"@ѤûJ}]n{=QdVw!ȴ잍Cۀ֠@`wӝ=~},EqA9DPZDe.H'urxujjQމ/RSr(3o)HHt[e✛@^%p Hp94GZHsˑ'1@M8РB9N].^n> ʃ&4ȴ;Xp[y^bu6ŘJ5Vlˤpl[Xck(hBQ*V:CqˣT?W73~[LpU/FBF2"TVD`nȧ)M'OiviZ3 #)T͌T%xY+B^V,`fF3drɚy%>;FYK@,dl7̶,Zn@6B8˱6]7E40gFAlL~'G{Kqp|MK-&cI:SCt$= 3\SG0p#4׋GҽDi'WɆ}cVGO޿^ǎckۣVo%mND~U~)[[k_; <2W wU̽nB|y^z-I:(p6}o@m8 ѿB.ri&H= mPC 8L r[x v-VqB7U2i:D 6C- $iR0pi}Օ ^X UoYs ѠRWNU|god;hL; :`֨R佃=QT>|bxKQzbT =O5 eQAd~uUKd/.De2I޿,;tv">T;̱:;#g'R 4Yvb$ъ^]"Zޗ˶7xHrgE//`/: Ou`8f_4Ӳd6 ƁT˩އY@h4SUpf1S@4Y!֚Ow%BfT(jrQD >|';I#TyLT/0ۆJ&yᢾ]|jnsrqu8^a R8Ƶs[_ez ̅/|< 9 0<E_ 9<{HlOWvywTP0HILfeJh6[wA6z p3+sR$FT~4yQt-L.7Mc,ѭz5Y3v?{'|5l?Epf(?,}3l$ Q໘(]`_#MW?OmBL7ф:^9A-1+iFϛ_ &n:2zW8yDznz_ngg`G&)-`'kNcmg`(ϲZ5^MFϓdvIR6@7㒨E$T%Y}mɝWbiR4c%[00_anm_٩z:F[>|Lo{6,ixYS8hFA갊aZ=d$#$E JadT|1o:sS#MRQ lVrIPT"joH=$NS[z1:YWa1xeD;PzT GS#K?U82R6_CA\u<*Ieh|8=(תo'o߲ ?~e"tkqp&.=[8' :mn>∂d-{~M%16Ln0ZLu-<%O{YtxmI!j[0y׸t ?W4u8b20iP`jQ:1jG \O)&!캒H|8~FϢ,$],9 Vj"BFJ=/onL> _W ˦V4Xi' s[Eu|"r]adZq󆈍EA\!%:чrÇBOyKGLcYDSew"?*-Y8y~Lr Gw&!|oa=/K%ݴ-EҍZYLG6RC/7ti{ٛu!Pjfx-&"OS0y7+ak{+p*ٍ4(wѷJ{Cq7tKYOg$4Q fj NKV4jzԦ\t5xbjBF|opQi݋D'J?X&3zNB$|+)%&ȧ/\]9xx$+j]JFiw){sKKK=NY>p."Q4.k'5U1(0D:d=N4'4<ɂu qթz{$mF6%.<|UN'y~sܪZx#e7(-wS"FϐZE >QUK|"[MR_Pm{[z׃g86ѷ0{ēڃ`%oh@0OqS\L&1ddž%x^o P0LHՅ C[K^0/9}{"' %?fPGbTVUF[s`Y&O X7{gj<=LJT刅2)84tƱ*}RyI2z`J02CnHW9Z\tq=f 0ȡh3V>"fj5ώI_Q\ǦL3ǿĺnr(sfAHUZk)#u[|(=D9> s00<˓ﭠOD> 3r/٨(#g٨L.pg1=2 `'N ;6O-<]X/TljoоYqnn[MZJdPꠒt21H0\BZnAW=bU|瓜DZ:B~`iKOA ``OٜC#es2h_È3h h)wJG 2̵t2& ?(l킁Q`3sJMF.N;T4+f"um?92d8kMhTOOMs.&?D[%]-WMZb܃KV|+i~`ZYb{0E0jBϑpcϩ+Pt^vwS#8@4%!3Nӝ]ל$*}W|.E8"$KD7H-I!8EPy]||nѫ8VYZz\Wy<#o8Hʯ6NS01كKEYmGp۩-!;>D\`\m*DHu s:h=gCjR@RR'Gr^_+H*צ_ ߖ2>:X9ip:'B U*RC~4C͹>:s&t]I90pb"Sᒶ=CsZӍ)ܺjJG]XYBE(𑽠%DJv5_kFN 2*V|Ǣ2ZÕ~}/޴ pm5E1)igk`Wger x7eg>aТEK,W &{X>&]򧒀l) pmb!&ΪQf&p?9N|V[lXX Ӷ}*_BYe%Ѕ˹rNXjKOB=ߡsSsIOkInGLxl[ Xl,uȡuzџ /*:5g7/hx@$%; Vp/Z5A "(_0y6'0s&ar -A:KiQ4fjO:"79JR\%6?{S^٘UT?]v ܧ m4ջ/v|^53HRns!C0&KՂ:-C/!!)qvoT$rFTP&"0>c-יP Hi+nhkJJ:ci 69MOvbwl9vɟ[C&Pď:~M󽿇pEA& ZoJ,+x{Ws.rI0шTiŬuۜ;iJZjUGu1TZ Ai$e-˗ȵdgg>ԣ/7=a56bōv9ޤ2#)бˆ39X;h Fx_pZYx'lp@xba㴈}߶ WͮIݮ[ewwM͋E#Ly_[9M[h)_96#[R_#4IbnrV1PP昺@[(:cŕKy nCsڕK,QTfad&4>(@51?'59!vV~rV ']Z?)Rϑk]-;1 g ;V۔j; wxoX{hes{|Fעm\e|}N_W!pV>:]șF ΃ r7u.$w6}RvY%mSk*SⶊkRzv>{M$ |3"t/͑S˜): B"6pd=F`yND:RN y%K:JҼj)NjG68Fc!ͅ5w45|A4dvcYm'#=xSDkJ;Ttۺ% W .s h=j=^V"#NM0i1^ R߮vWPy?Ij!!3X17fo;N yIڋ-r^oE/yZU8$$9z R^zȂ|_ X ERܤ_@!"tw槍r;&T4+{SU.KmIvyC0dߢjYC9ݯ?9 &x֢|pwoԺW_Id|lzht~cy\ kpsŵPJ]\O`BfWվ6{MIpCbuhEO]1'Qs쌗'ݲ:{׷:hK eR>s.܀$\k[uwRrDHnϋgFE=QdҊCl)PQn>1Y !:!g?A6*b }܀0 'HƐ=ڱrЧ7kGe2,WښеQv%&#j"Zf30{EC*ʟբ89, Xp_o`8HQL,BjN f,yJiRcYK+PLW/c50|^ſI'b dE*F[BDe2hT\B :ق_"ˋ-&CB\3cRLWil=iMtu LTWGf9 \9FI*|l6B'za\3m\hyU:=7Fݛ.Ikё&L4+'FXb } ٲS~^{PKU'FkT;{m>U^^*cԥa\wL#w1*qG0 0k3?؞5ҫyނEfYHCxݠ-oD>P./0U[@璾V Q'=Qcz}~g׾u"mR%VgKqa(2ZFJo  u~pFg{gBV/)t$"ce!R7Dǚ!(]OΗmfhzOJKј\* m=\r.2LS99kL:Z|4F }&zgWňJ`{7NsESJ(dkܻUz/8AE s"JxXTם.-W?˦5G+F <{L'r|~M9.D'AIdv]g dn̄uUVCxo5!6% ei)م=P.QQΐq η)}dբ3ګM+1>z.孱V@S<EJ j]} qU @ZZ>%T@e[w*$֦1`jn@_A'gRQ:[>㶗>$ܙKE-#fM0=8>B\V%.4bܕ佒$g[B7!ӵ~n\,ҭɯ4!ޞAbR˔J%aK02 < Egփ [%zv !m_>Y%xW{WZҹ=qTnڪU,m+{-]?FOy\LWp]m 9km:0 ㏻tP\Hۿu4(}`V(/FAO$۲lK |zLmD2jXwR%E~=%Wxtc.bu=l9lOMz?4=(*;x}`׷BM)YFjΗQP}qP޲ɻ{jT)G/eFd])ـrBfrPؓT$DdNB`$l2$|ߺ h)bMjpho pX&"+޸/͊w<bonU2B(8ANj%s@̿&#cPtC=^To}^PJ.p\j91Σڸ7XUAQ^mA-+*Ɲ^Iw 2/+|զv>v(SAc $H5L3nžGVn8= YʃEZQ`¡0Tjb|,q?"VS yL ko8~ÊXjG'"a l7<<%Lz&%p3^.D嬘+QJZNE}R'E;=}fP ockyihH`ۿMTO_DjeKl /4T</Nmyw%~pfw@{B#8Li:T)q\isf!*83mD |ŏӪ85j)”/MPho*WgQtvb~O{>%ȫ jee^"O}*+NF$3'$|Vu?+,gF}^jvoGvHFk0.|q_.Tp# > 8CNO.Ly~NV9uʤMם'R 9ׅ3ՔPK~S!2{`k<1et[jD.Ul&ͶrD_HpoDn@GNTi*tK.Tꤔ2S v .%w 7"^p~iS8~U=8Q7O$תqx庖B1ھnxω&isW+b)p=Wʠf2wTߧ4VyQ J { /MA w @"Q@êO'q-&[Xw -clkT|O }i w6` CQL`oZWe-z}0؈1Q]LwŸ)qT/|M=z=x?%$ sl|br}X,"2 JBznHpؙ9 .c)zsVz^z):S_n ;NdaT!ljZ}^ZfZJج*εpq=> en(KL)XǢMQ E)*u[<58"h& tߧ_ ǧ҂F^3ٛ)|>3NUx<JkHf"~w māMTv'A CY]V0SK*}  " Mש ?o5)Mp1(tf^7ȋH=$!)r=Y z5]*Al*y6NGebA,^x MqZ\[9Iwr-ր3 e" I)A4<:=۠e;9YL/G~aS"A@&Ja4{ mG'F2G0؍{Z9:_$j}7SV=$p_g t*U8DqT~ p*N)z~`(Lol2(7=\@ Gp R7urJeǁGl2|G/ukdr1 We_= Z cS18*f-_N)Y<"œK ^} #'v}vyo2+ij';ۀ sp|ÞvbKQX,v[5Å.s[jְ'MXu\RpBmJ.;j88=T c('?  G+mɦycƿl+64ZT'51|#VW98Q\| O}Ԁ[,7%eexup(:14d0Tݶ~JbCOv=cM7K),-9*$dw}La_aed]uɚv AyTV~"u!V{v$Rf).NQoO=FHَTƘ)Ԗ~8FzU*Y6|2 (0es(L*dVv5ڊɅf@HNײaΒr`1h2~̣Ol0(m%nrGm-|qB35|sXi|T[ CP^0F@פISqv,cZF7jH45 Y;wl,A&h$`}XciVBD.٭@f6T‚KeP)=lV3\(Apnjj漸 %rT?QGTB/[v޲K  9pyŋBM7zK=PU>Ll!䵓(y],Ǐ\Uȿ#xMҧ:: {F罍. ^GnjDV|7UdĐ\1Bbo2~[}=Ud 237fg;J3']a*3@#=#ɴV>UP}>vosR!ӣs?-/?m +9f9Gp-X?=σ@wxɮIºv`$ ]t G}bȉ[/+7^GKi>sМ'1b"9])F{BET/mAw + ڷ"7YnVIj+!B@iM C Vϡvf9qE:ze4e1K :ܼ3/d%,LGMpM`7 3קBuRMa&˞ԧnRѷ\l^N[u9' |y 06dJOg0kR"w I񿼱#(OηqzWIYtow{g#:f>0/lPXEɥm# ~J}#PmSWd$ELJZF\vp,&"2o` HCٞEe/'sy ^To B`xz\~{^o?)!*S 24|(C6xDNxn*JWñ?erWgr:󈨉yK^vgUA:GBS-*A걵wG}1qJ5V QG[|VR +2=xl Lr \ES-=]qCFڴ|Z-}bN웙dX8UZ@o+]67OlC]g{Xrϻti0F,׬k/3V+$ -J1cr6@_iS܋2_$Ly%v;|Vѡ>U)eǑ@e{L0$"%%{,52<~^B}ݔ%$-^y6o$xvr5.0D . V`ѾMHI}jѽ-ë{b(F+YklnV>Tmy1Zi%(!CŠBv_LA$ D>W2ڕ5-*82bHdfC7pN`)! +M. 5'l"E EG};NWy?ݯ`ͨWsjD-XS ?,Gi &!e׷=npiޢ/U8N{ˊ~RLQЉt쏨itae"uTàE[[@εo2h ^HϞmSe`U^@8@?ٌ6 %õHj ȤE>^J+ gK*½6a]Tn`j!(ryڻ }[,)"/"p\r K<>DAU78sǮ6ِZ" KldڡRrTѕHA2y6O47iJX ZG]j i`{/Lrq{'&%pKhb,JܡѪGi1v?tDЅ{ xt-7Qg_8TsLyW4$/:2>I^a(QIZ⼨oa$z!vcq-}Sأi#IΝ5zNbb\*#٤TBJڂ8_)?u>Nǡ?7~< N;H"Ya`#8yb7e+OC0 3b0ͻ &7j/K _9)uĚ&v =dg,Lc;ڜ[ո*} /`hO f:rŵ-}kBcku&}1nݷ =yW5-L=9ZRm},=9ΫI5ԣf?|ŴkNltqe@$igbܜL?P?@K4M֣<ً>; # 8YY ^_sKn p4273VKbr(BNkҠ%M#,]hS00!AT*E[y"[˛J4FYg݌n)b"׀6@ÎQFLKo V8ʂLMսP\XR?c 臜fJڶFc G+SQ8G g_(GT"͞+?:Kb|FD!?!" !FIiYg\w",k+Ypvk` nN"TN~m0{K$u&f]zj+m_2 F^w7-HVCg/![\?5< S/PDHܨ./suad IC䉀&K( <=aBP=`Q5EΓ|k!,ar.V1*GAkdfұչZYȻWbNU25 ,pB6^U^İ6 P,qvHe{ DogxE>@C, 2+Bw[ &kYVWyJK8k`Jls$yoCrQv[Iɮ2!m0r@1C 8@#]VbPC1D<BG $Q2gEl+$[å]*/'< 9<싗%3f,- "~HL]rM-)$ ~y}7EQ])8fhHo5n| ױ|2:hzL5p_Ah<՚z)$y&c+؏Rkjs8F_pbA$B(+Ʋv?))1 ެ^"&Borg/U"u_~s -11uH|˜i߭<->NYLk_bfbW`1ǍF#_l rPNA\yElj&8tt6$h8ݼEek)HZ¦:fBpnɦ g- ۏ䲫=ka@T2tq՝kdhR}߈0Wcoq$?r9cfF#"bY$yTO~vv]vHth.P12 [M \p4_iD)hð#cNY- :1hq~3u:+GjQWXW7^M"mdyEcbB| UR{tRaIC9r\7*I :lK]&R͡OE01ְS2L7I}hV{P3[. gYknyt&:ћ} z4ͦXdp7oE#I5ΔK{#"(Էc|V*y׎ϭtz]"DLs<֧hr8%?ʺ殻]ӂ&΍·ʨ֚m#}kP\8t| ]m z{Vj1w|2[ˊ-\<ǒ!!)g)XdfMM~ZmAϭ &Q&ksS{gȸXrԿjMf(ʩaFuL شx> an@**oS@HD;Y/,]4q:% ߳S6;NSw"NMw.A\V ˉ]`O2JSp W tn> /dH&;oFPb $4PwXN7aA2Y$!}S6* e1߻ mp/Ғ zUUם@_œ=mScaA sI'5tL's ?~K\P[@+TעY.BvmA8`>ѩ\,5(lCiZJ7#f.ʁhi,i0:>`ψxA,{aMQg>جb K"*!+7Cjc8a cJ"+&HH~kQnSؒ.Tjlt!"{O܇ v}^jRruJ^K{^7V_Vi׫bâYI3TSd= U`9MdxFf_H/aeAe௾ysL\VV˹bepd$+b8XqGi=mS<Yb A?)( wLJw4*7Fv\3,Mtp IOCCf ƆoX)4#!.v~WlNAv$L%,88HCMg8gV~ҏ yzINvM0LL 5wS)}>w==({$7];YpwI]y∅~=Re*Ԯ8+s}yU2h"ZMD!~Y3 PTm oCViOVɝfӷnw4Z$JG\|AbhɆ)TѦs".pF,x:T 1:?cj1M}.{ToŁZl+ݲ8흁 ~}T&u {ؤ{-Ok`=fNnXu ;^9Q! 4aWΣp)40*0BMbH%AxSI:e1+TP&@ vD=*lk9JZ S}dwW e+g ʢE-yQL5T~ \H#m&׈fGjDIcK) 6:VA<݇uϘv'te?e6 BF6lv(# 0ajNڙZ;eG.5?cXdf)YwGT|h`DɃch޵Bkzv+Cpw3)O8)0ҟ~k؄n y-ͻ &7SaE[(bv?8Em~vT> GU(r8LZb5zoO=UkĹܯ#i&磴4ؓ ,8 :+ߣ#z[CemqpฟW?[eM?f`{띟0QSܮI'SVZd缄OB߁?mTX=kɩUyϣ+A:(PsL_\qX QIHׇ?V-.؀ڿOInmkZcS|瀜:&y(% ~q!yedd2d`Y6E< 70.*ZQbIA#E(FShNvp E[~;u2[KZ2JhByHt^7k 0G 6qI\X 8] #x.`rT㖂u_IJ?:Bs10z9d)Eث0 " .@4G(7 |XhktT2g7% mj0sh6 ˚w7`G!cU*][eJ5ڽ)F k{ʓXPʼɊC +7P# MVuF!0+2׭e>\*\*],;wN I G|p]پC EuP+6^<*_0PY}s^Cru,Y&gws  ZYCbXY R%%JNKu;AR6 n\@xyht&z|S_>6t7 x]g-9`tK+5{pSZ&n~v}'fE,VйeҀ0#J -k@Z!#@T),j9JUcEu<5p7$GfHN1 P旼g&i[ %Z@n ^KA%aaYSx:ݝGq\07If7sjTc0v8r'W}lDIN|=ԍ$6b5(g/k6M"uc-Uh߬˧*j8wzj4[[9^ƛYn -QWWڎo*XŨM}jq}2i]/gAqЖh=Ԅ8ph=ҕ 䲰[BUyԱ'-ƻ3X⦼ P&+V·rGglA85609ȴwě\0\ږϾN#mÖ6χI\+4{T caj'LI}_ LT U d*NUn^h* PȲA1k]9 zV\IqyID I"FI&cB5&9&KxDl1&l,s6G7ԐK"]L^Fӭ EBЁXOpއ%mJABNEHqMgFTX͐2gaT6g򝳁}\{M+b!щjK=wJ;y81e8^=/I=YĒƒ90o3gJ-/bU^D+*]:')/4 slP"MCkMI,CnqtFō{2Xi7eE*vᥱM]6Ԅc;kRt2SAf$^@Ŝl:W֍|L7lgk").^yT"ʺzB|P>7|o "'pfY8G+ rNA=͖DHe7fTb!mߍKϖA -_캔e!1NXٗ3^'VR+Rm W.3JZMJ~݄DkB/}'L_OqBjȄi^II`d=Ł>ǺD;\RQ/vBm d U;\sht%F(z&2N1#>d.:26"qHsʶa}`fZ GPH/esok$Қ,0,fY20V-ђKqt&#;MyAⵓ,FBv;G9$cu4ܿ)_-iY|Z|.Ul&S%-]͠U{yIhJ,&xQZ|::]-#x$@f6Cu HTA C .|G6aOYtk1~tԦM;P?F_jYv7zFو$z&orT1M" A\<>&h_0CKX;锍 DcotjgΦC?kǁa?ӘAH&Bog<$`Z:uD cmudcmEmh"эjL^OeeD] K`;if(ךGORU'G.{7j./ZksjHAײ| }}DHX,MA x狰fٍ3n apL%{Ym_ДG }ͣ;oU1kghR8Z\SzցF/Ɦ}3^ųd7z֚1c".=dzP"6 I KnV[\qa3a+B1nŦ aFm^P~U Mpk; %E! Hl[SRK|M<|!nӜ@?|#ϳda@6/:n/&.w\ JQ"^ KZ}聣[O6復Scrڹ' o"DVͷjR\u:ejh_ W@ߊqai 鬼gzJ)o{Nɞ(y Me"V%,]Myb_s{Xx8 !l8 Bah8$kMm@P[A` aQL˸_,,I4I8al)OZvPRdBR\CM79=Qd_pr lb8(-c(I,gGX6%k&v 0V.3 idVXR k"G:XyM){=gv3B:"@A+,PH'UȽ?!Ԯ{,=_b+Si ր v>n`:@$r!!U DF];l[Jqv\PtQX0C׸m~K<{H魥+\:G=vO2DȰ%Cn.NxuhCb6u' Q-1ҷr*YNEgߖ™h!׵ӈySqlS_uʊs譗 ƨ>ŬRmarVd:<48A+:DIBٟ4M0f'<*\LEʾ^[r/6iŰ{&ʂ!Eӱ\ gDC{U "VHz5aBM*)TVFs:H:w l?㱍XRwWZ6hhJڦt-7Ȕs UxL$|Lf.^8DKoJs hWr0l.%1*+GԨNhT}E^dfu646|ڹ64yUzorvׯpa <|,W}n V\[C]{mop]yܚG#`M =@a&bzI itׇ\PtuKӖٍaEeX? #DEݻo3kdX L(G}}Sb!`2uDVL= yշMAu,rm>Al>_EB^ZpI4q.JU:˥$qAjDE)Df'+Bjt\.ұAi=itɂmw{ԫ ;3#eC_Xs~1*z|MY#M O;A{%L%Kc9DZyE'C+gu-}hc_2욯hX 63DE*3GO2l?ϺH+& =wU{YeQKɦ㐢BN-bsiV6J~u2_*!w>[CI鈑$s}͉]%c29+| 2A I )(}h <(ڟy4(/r)_tʌu kw0jq@Sޙ~r  7C>&S<8CF<:*"{@,l_](vz7]΍@Ivdr3Lc4^< V)1J:ȝ/;i<9?ʌm'F@Lڽ(\†dٱg/2OB3-b돱tihrH}2 Z꾡\"ۍ(~?>W22*ƚm~ Cciֲ tk6#a3I -}/ie%z)UQK;M{߇)YwW4QIT-A335lbڎ_;f(a¼58P҆*O,VOqz/i\]x ,Ժu~q}3\H05M[b('% M Ly~0?ROz?= @jWEg,ef7n4PlPV#Q\T,('xfMjlyJtf>t)<y~,6hxF}PK5cz1R i{Uԭ IpS-sɂsfos6] e[ [&]0k#/uݕUa&0ɖ'C25Xyk0.c!&LRMu13ָrjIJ Gغ!̛vEk\jNA)fLǐhc+&'*EFvOC)L9%Y왅bBNG 7gb(CT.P]-XpM KoU1+n(s>ӐCg ~)*)߿F)y]gAyfMoE5c(0 B?YO .VX -A@{ql-ӽloS)b\.EФPżyy?(e!%/B-ccYQW $U@MCYd.VvPDW"vIF٧ +dMܘ;8?*pO:.v]:el eIfd&I˿-o" ̶Y J>sqgOk~r!5"ӶZ' %\P'`*T/qn.2əl`7/ßn*] 6 EMk jbŒ&[ 0ϱl?xFwѝlҏ1o=ʜ.o89?N,DwE7Ntl5ۦ;wzilڕ傁 l){- _8 WzZ9zk)9%dOBg^ pt#~ZΔ_~CE &rydUews.e?x@Jd:(઴q!Ϣ(H`rRX6]K܏ #HrςN*Gwô߰==~a$ϱב'R>2b" K0v3,͠"f:CU0ImXcYA4Un0~ Ɗ8o_e= c:U ^j%PIwM5RTqvh0đq#lǭH׻w0ܲ-eq,FVBXtĒD.}EVwcЇdͶG.@Fp5'MSd]M&Ulg}Ý&z!}J1\OR :0MhVF&RHEn#wOS}XAKYوHGL|2fu+ 5kp}ﬡ{OKDJf6DLxF/OXDnwq)H8Fђkt(g[PqI 912XW||Fv?2DpWċsBWלĸ=Б.Epi'@G DYEǙ+h(aXzKp&e N6Yk%ͫŋ)ػol siFS?nYB${T̓ЉBM`5B)$F߲N+4=g_˅) U5{p83QPk]|ׅ'":1X8=` ; g,hȋ!VF6< 6dDu+܃ѧQ2*g~-\Yr mU+5NWW)ۂ8/)_ }tL3l)'_Co/n_Rà(+4M>M9d! DnzXJ4vbS\ZzqG iׇr"g ';Ū[@Ò0*SI=ŦK*"`YQϗP}j;>2Bֶx:|㿋;oUVoC)^inQg)q7̅f#cF Iu3}Ael&!ͪ5ԤWuA>XmPKJ.{u6 2H-4P(7-=QR$oNSȰNI/sVCz$maR8&,߃'n}dN^TM+`M+RY0(G;󦯑n`4J%Ys#F} Dm9٨Rxc&.2m#FKuI,ZWw> FxSpfw^kAݑۤޏg|R"=|H{kf Ղ,i* =w5Yԛ!ZFhF3mĸ=`@zG:)HG7\4 t'gg,S]B[7JtaH)Lg$$ M#:%1-+ҬXA8q)%muEEЖB$}^71L|Hs~T>_]tc:D(= Ι9V-nȬDLm}kHƣW+lo<؁@w`ȲN~ E%6vE(hZHmhTq40R` ] f1mHW4;hWi-q/ͬB+/#DȠ"ՙBhZ ᷪs UgNH>㵎a][OP*8d:c>q|AՔ2G1:h5|  `"\ M~qg5:ٵKi92A͙$IdC~/;CVz"g޷8WU+(xB&K>m ES =>8IJ"Ӎv/S}\z?.?J2CIޘi4ۯ5~LS> k\[ku Y ݷ^Iߊ8tFHf3!UBv~SVL6 #k&v1Ep?w/MlI Jb<#;/8E40ъmz65XKVO酷qB _՜  Vd &WFR1գ>=ϙ6(@Vޞ DzT㲯tAzuEu{MxGO\̸oLAwr=~GEx4w/O6EYo^!SꂳɣnTl%n]O~.1޿ֆVXV$!!ÐjŚ( #ݗgtX>8f0Tmbi:ZK"$^SwjvǨF>$٠'3%ɔ{3ټ?j42NwIJslJ1 ]fՔ#RYti4\E'C*N@inQ%`5{*^=.~@U3UC} ;1 o4"z "-yOط&GHw.N s_CmHFRD]},'jXS2 $`H ZTm' V<9Ļ[s~ u) 9m{`oxbtU@1h~`C&Bz$dcEvQUM[[>:nӺ+6^Iau9)mzR}n`n`FSMo[0 RֽpD59S&m&Y^E͜l)²qɡjrlA\r-1l,t\6}$?!Ƽܭߚ +MOGkWRഓrIr,<`Eي3.K! `םW du(2 Kp=j]:m6Vch'jd ىn)w=hOKf_}D$JZC #D4p}Y" <)"/ňnwE&B#"'{l9d2(.ߌJRFzk#Mw^D"nD#}B/[,F6v$yÓ,SBMyJ[%k=kE?\DYԄYُ#)M6T{mqqJxPn@z=>ܷ /+ {W 2&# %ސ;k=R9 X V=6":Q -X`fs/+̠g<>k|{Un)sםDE yƜI_3` ya0pet I<{}6BX;ө2֧iiȉC2҈CA&>p? 9ܔ윋!u2Ix\0+1!U ja1qk@_t uEOf}ܣ֮j'f%QGlW')ljtNߙ<,~m! u3Kq-mIɝJLD~ʟǃTV6>W7}WH&XTÄ278^P֒f|tA xMG-EHW&$ᯖ~`B B}<7z5q u B~g KF'"d¢!@.lvUݭᧆ䎁AIb)0ۚ NPk֞zֆSA(Y|fq|FFZJ{GLsj{bFhC!!egeҐ˂͹uP G9.|kZ 7F!0 sd&HU2^Er!u"n~z6 99!SM'é\2= T-NE/ qW#[#a 5E Wй+W/85 e|}81 qC~ظ`ٿGp.ݣa{qAzv?,T9$[XhUp|Dq2V*Jo~7L 28\@p$'O2' $ aK AW6tR)s!#a"_|mdquWM@wM-1͊U͌L(M W!HGxiŁQhT0AJ1{6g{d[x6+MKGBdFv3=k*L.D ~v.r+P'`8ZL_$Ig7iNChb%[%[R֙hRxZHE|ע W{*jr'{jxf"Da&πIJ `>-h>Y KdLVɇ{5ŭ!~MZ4]PO6|E}|ro2G-Q 1}P,* <n+fz簚'˵YX;] D}I`R1 2q[TUXnh伓g x$bƾ $aq1i$h^nqNʁT2T;->iPiEV?㉬#`$Unuh A;{|m'fr 0 - <FeGb[`n0s.ˆ(Ō$EKy%ޡH8X1HRf h<`lM1۝F?)-No+`ڬU:wV`X=EytEgD5rdp`X+por&1Dg4eYm'L(1慢 sN0%1aQ RrxHETwH.H!{8N]o5ժD$ Do9]`,HiH3 FMxQ3moB-@8QW'E5:J@AGnTm><3DO=q Ȱe0akY{\I1bۊM/t4\"|L5\k9,-j+~iJF?Sl OEIږ:%,"!ڦ2fe;s{\ $ji#Sk>^ϳHq=?V=^Agy&#AL=a iZy>zq$ûeT:X Beq-L+ Lc5N^eh0ǽsx]KD`3Y :-m^3o4Zf4]$v^vmsD8ÔGF Z,8y]&5xkED'[QZ1~ѥLMDre5Z@<Лf.VڛL],4 HH]q17~u|dmEڠ4nG'낲vv@h^v]J&9q)N]EhPMЫ-l̃GA2и8+f:zԚrn]ry%RG4(GY1rp7Hh\]?0FӮxLtdrKuU<J!N4ۚ{kG۝A5))p׆pEK}/ED19pYcw(E䤅}״=0ޅ0SB"vOWQ+P:psaju[xIg3g5~Qr6ݥtPrI%uBeɾ%U3?g_bcxXKŬ>U9=ը03̷1 $Bm/ *,Do zԬ^6@Byk"Km0"O[ݔtTvvܪ>qY $'64}+L2JaZ!䥲ݏ?]AM#OR9,tc9I(VcOdžnTT2;*>~[2pZH0?er0o] ."];7`W.%=-5 ’`̘"ԒB(\ru$8]{b,ݫyMFY6EqRwdXzب2/>nN b uVe`H {tPjJ. d{*D3&b!CuNU-i_{J@FYBc0nor06|t<,dlg#oU3&N'ڼ&A)IV )D1;49Ys+Y~3^eLt)YEu9Q b{v5qxK+R񜨞jOk!+1tr?፪|!ANzuYöz :5ɩwʛ(@f7SJcr3%q m%C0<;W0dPfX'z3x;,#ojKsϚdz 7{!!pÉe j2ga| bzkn!no'tʨ\|U%9|s*?ّd/'ޚ[iX$ng]R)4@1J)Bշ|AapLO-rGIɤ\p9k!,Zimz#]0=G5/~\u(KzH#68x*;}0¿6IWI&y.bai~2s~ܧNGCn0r&_?m;oY; x@={BO&osS& n&=[ܩw'WZwmL BSظ,`{?5 PzinOJu'[*(޶ey.Egۂ]5<(%_ɩL} tqC 3Hqϑ gk֕Ί-\x+1=Ht%AYĆDJ\> r+ XcxѦ~߂P[M& yzs߻̠yMFn}%'"{-==ٺęD#Ep#33CyAOAѤFiS4K}kR5K>HJ ؏Da5"jWV<ļ)\M$AsK*ƫ>V?e GWT,|'EKNCX{~eN9Ij!g(ٌUy&0¦qγJ>L\Tij`pW @\:dǣX̯UI`!e;񾛒|.xPҗΕ$ P09=CW]𮚰;͏z'E]wn6Be:pYzbFB݈uOx d0qoa0Ra,;ض ۖ̊][+"k5} A&@i7" ӄj&NMZз55׵(鴉!?6ΫYJbe>tDGY\OMNBq* b| 2%yj ϠHW+K6E WĎZ>O 4Vk-+DsPv)?c^汧1 >O%7xj$pP$$\'i1 vvv=YY;9sV.c0!&J:[dVl? |+SX1gJڿ\etY䅺'%ׯ ۼmb2k$% ~JrzPdytgvK$ xtoΩ5 ]r,ۻU`[24HhD`#*K(|o oDf}yt;O2{A`kTJCsjkjH-_O!x9n4&]w!bꠏZ6.8Za^aS@ JOx.Pud14ST$kǘ*;p+&k)G<˼y{= ,g# ߵ7dJ|L [Ō*BZ|ߥR*:sV uy]ye$IVDo p5URa=. a8J;WʞJ$YM܈7:; u&'YןL&"9?}OC~oGVL2sI O-{V6:E(),y~3]YU-\x+Siq-˪^ tDPǀ(K>e^}JMz bRsiO(b+hKlP Lڮ@^,k8m-@\dQH"mI>hJ z \$PMS?{-ᭃ #3Wp`@ :ω@=>|/kJ䘡xg SVp x帪bڍfJ+J(zT;Cjh#/N ~P&Ǡu[:jTݠU樈'2"!!w8i{,Ra_/n\WH nn52[UC{Hi7b!,mEs‌ꅝAD^FO:0^|8ZB>gG(q<85ocorOEo638 B?ΜV֯@lG6XY"=kƁ^\NcV KkXަȷ/$Db>ʳ_bơh|. Wcېѧڛ S~L[|+?Aj2-i!ם{6rG':+8vݪs IwgJLwVI4"sZV봮vE+XBg˄ UJ3'Lu&1 U } ɮW QIMuCqIMzA8{F^! BR6M x ]Nܷ/6`s|~3r^[0N26%8egYci^;:PU6[Ӭ\bz3 AYY\ۈۗUνEpNoѨxV27zPMv1 㳾8}^2$b3PaP%}5%3C1#j)z (i.h3GCG%gRjD44I7jEm2wS~(!й8X=UAt1ȩ}5e‡ӘTj,4FTrÍ &?Vo7D'6*YR:%R ^Ĕlc*g; R沴lg /ͅᇝߎID''MVJO|{*'U+W('n i&U4D=]!taԘ.<!޳ fH{vuۛ50s(d ɓ"Ad*?UcE] ,p3ô/U$]J[c_9Lk 3:RPwI?Վk'!T:MNL)ZtlQU!}ވ"Ӑ{Y2%ySS+]ӘRvtثH4ȌfuuL1,ƽ=E3s m| wRAa=vL_*+7ɾR\%6c$X0e&xVЦv?JsK&C|+Lzܶ2Py&PQS޹}O*WB d(exK(nH(ˆu4hMt ÆO,Dg/~]kO@YLaJSۣ Gpł͉&S@ĭA}{RܥdpIIB\)b !&(qMrp4Is\A6> Mߊ |$*s8`=[R؈Õ3@VSjyč,@F~ߚOS4uM %}גdƿÔ< =A^@>taR y/}oQY`F\%$(5q!ނ\.+LcQT5og# g\I2< {~9p0hBFkkf@Xm {Gǭz͵uU\<*`%`Ev,j'܅YMNfhK>%m=|=E| jQ3Y 0<P*i|ӿzﱹ/_H3L^Q?J voۭHKz/̴\a QCw ^Ow,V1b$Li2iֻ"Cߺ+C:;hVou5PCq ӿݲd1Jި#2ږ!fM[ Vy#s_ܱ&l'[{e: ;Ki8nk 7N#=~=AiÆ~3l7Zs`aq3BrR" MӴY$<㭪ug|Ixd# s?ޱՖ {3T+6fPք X \vS"m()AD:vrra:ʊU{Ԅx+i dJ/}M 5 )G jhdRXF{JQz7E#rR,'z%BBs}!)V`yb>݌Nc(2_Cy8:yJ~ٵӫ&X)I q棊Tj#7;aMĢsVœ֖԰**M0QP] vG0᯴+!ެ vU߭wqD߮MduTdlJqeRf;]?- DM1)D9 ) phϐI߬~a3K߯׶G}NV ʍЫ`K@&QoL@Q!TM_}ƄP#vb"$(R ,IzmG# V i~OvN+dlA친R yP+4ҵ8@f%URX]=h^`Yf. Yg492D€Vrt|IGE QR ji+! $_$͈ĹuԆnϖۻE' up1I&gŻf>߹RO)̪LIA ǧ]N2>"nrQ6.'WG%G%II][} кssZ@ 2(u>$Z"ϝ)CƖS^8漵i ,"EPzj{}`r]?0ƖM]e& &E Ơ`0L e%W9=U^-oJ؁`s&% 0<=Xd}wB(R<9kBVaqm \~U5X_mCnmË~ݲI[{>Wk` o` 2Bhjƒ0 e^|9V"|:ÅVr#_FzHIZms+(U,r|n#]e}e)-݈sti{f7Uqe+} 9` ǘ+ bxXV_E;Q!Pgמg ouBGGHӞjNzxHqȑ4KԾvSjRjb̮4c!}ڠiN.~(G(g fMQ*B],ki0sla4sfuLyӯ{# PK\pq u`|T/ƶ PC . #OI\A)I$ ý_lM zgMrLZ=ͬH?zl*˵)~$GW+ #9Iʯ=t$^.$3j<70wlǼd_{ׯN*HGao po(04V8b?Ay%:hN%sGV/uE4Xه<`Ɩ0 ` l^b?oV58;+=Q7{E;LA7a;5//W9n?8R* _ PfG \2/Wy%%0- j[S;R*gM;Fa) WBO;tHZ-'Uffb_CbqMtd aWr^r C_tېZ`?PEEŜ o-Mݿ (מ],ٚYńq&;.7G ];uD=,bNЪ# pQtł_nڢ9@5=##`Ƙpۤ Кfoollx"wuq1BCcnև< `2&MbY}Nn0F˝zH0lXAe Xĸ YϭMJ lc<1,H;n2)<@E&tThp:mFӽWȗ{) lշ )U\:%z8F"fyq.oů󨷘 u)~Lxu6'xuZfOVְC ["puϴ#^ }( oƥ^쌸/w6WUR Q6ߓ11P4|"%<!W9- j8 bEMtNGU'IlÚhlGq7nn'C}?oc,Lk W1v ;5 -*׷; \-{-PUL*ļі{Z!$hy'_S ^W1"^|ۃA1GzPH#lIMm_) ϒqw2Rr~޿.ע$z' :KNUri^L$4&ؗ3kuBy0H`?4-"K F.TyRwZc/[yEpPց"!'͠5IWG'3;!2`. -"=qATZ"5;XMG} ` b|[~Śp|Lڴ_-C#BE(+g!PV+ N=*68yVɸi}|wT N?P5}6=Fr2 O\GUC4N{Wg%s.03T'<^D" yRU3FC2턨fߙ%0x;Ltͩ+Ы&5_CX3(!`74Sag(Zw?,-6E) ܲ2[<0[%%[Mf[QdYQ?W<"zڅt+FT1L_g@oxOĬ:NX'Y-#Me5𧶑 'ޘ8j7-D4r_O8ޭh8ɳݞA0^ۓs"^3թV*A%7sġo!eJ\dyYNv:g8;\#KMh3TVMP {&y$ۃZoFM2'HH~5HZf r",h{ :b=GM>HnzkNU2S N\m(#dc%JsKYd7l7)F\|ˇvnsע[Z%}u4x1M녑V4:H{dX@G.><鎼}.=Q0腛8IpUCˤ{Z\/J4qZ]5M^poɈ+dٖヨYYl\lxluÁu h† ʞu ET!-ha]RUҫm&GIUf[Z K0Z*(Ky5eMn"#z LPW\.I =1ux[].z)PPx+Z-9lA5)ng#8n 7ᛃDej4%i ݝ9-!˹:;/>LjiW4iCQʼfQrgx&7H34*q/pڍ2|-cQO#W%@2${?'S;dF?tzvsY#^μ' UESxТ\ȃҭј.'=!f0 gTHS^FDw\3׽4w[UGO:l!;Ae{ǻ$-Wc8L=/U4f%)W|og -b/U+'R,sMJ/s[nIHss]澉TX{iV#ܨԮ;en߲]=mlkXn߂-7#%(OYMض uqV)3 /X|WKۛ졢s(-lABt)umF.6X_-e5bU",ڿ3!'.@,蚘h'Jsܡboews?ȒQ$-@ zHlJYknC NDcк^蔊!}㛢xu-=l0.'wj_UF Dj; iHC|@$kԾ1v+\Z*а`!plkoׁ5[3aj2)5U o@YY, 1-?^/:OQrjdZ!FmU'ю_*n^zJL511gcA{2oCUUn6pW7KͳX/b)ZS˸Q\56EbB0͜kުoQ4W9[A`CCK3(D9M0$wq]B c- ra1:y"vdHmO%r uQs8j~!9 Mk(i-cb#^ =0S=vWo'[%"{ 0] s:!|.lHR&ʟd./",D.pZm"%,lS3:x (R0t Wi~!hsVNFƆ|9Y} qlHmɳ L!VN9PWz }d0qa FmQ#ko*_h戽;])oh)g$@r6eq QA/P2ksfQ< 9T'B&_I\.txILTWk>)\#ok~]0RאwGimiŠE\P74 q`YN2EQSd,宼[bU̳_i^3qpO6z'\0b8%ԄXb΋4U6gx 'hw3CNKhH/IoÌ&^(5n[0ܵv" RXbޖi=e s_ cL\'B^Kbʗi%KA(!=,A O{lc}WcTiT B\q!ga^7+F˃Թ?n{;&Vind "!Insbe[[#&RPLf=r\Œ-C?u Ea{2GȄ yr cq92fQR6A`as}`_'d~{œ˲JYGVBVzF6$dJR柪78oQ1II uT{Qt2V1X퓙 fuPE N,ȕiQ>jmdE3m{=T2h I _{`v790 BDP>4$ˢ?ጉC8}}]` <^+;3W?bEtH]2%+.p"Od7q>{ś et< ` v<(0._;8,U`6Q'rgj,Ѭ^Q&UYY^HՀ@x7Dk ,ůX;Qxt0o)Bxv~H "2xVc(ԯaE4Oo+FWO,o!?Yh=aAX|3-dž1uaV0kPYVh܁ic8dj%߯~^g&2^Mu9x Dϭrp:ki4(~ UA@d--jo}Z NbZQ^$$*J<nAh*S[Hg孝=NbK8ݰ-brmBئ0F3ЈsC͋dlMǟ=XU,@OXˌȉ{@׾- xKCA(wlWKz$192΄ӡS.x4>WI:zk}iv Pa4mnv5ɗ9(%P;3U-ڱW>mX3zi"}LVJa,.|7PyJx`Ⱦ~C޽Q8*IkULeWqn'!D>SWس>Unۅo A6Ug˕]ak`\(݃j7aO=OGEV7@K.h {kŕgRLEfeg<`<|= FvT/?YrX!hagI@.'S$5:J~ž܀Cs:.*u?,.5y\ଞL8 _,LX7Lאc.!`xYdp 0 gLkpX<7ʘ@ӕlZc I"f/KF'ߠC"+9+՘U>}"~qB'{F ;>\j`l&y}ֆĵ$γMw;z̠ LO.Z&H䠎FVWw_p EyܛqQޣn= ^@TM lod$u ] z)U439MI+~52_hAQ76} gUmX f&ioQyGಭ"i_u>.b|)|RJCV:@v{ҕC1{*UN:1|4ȹԠe5f2F[vO+* +/'/"זFb4&%J|50ЌUjAl *Ǹ_ j4^tk^qiٷ~XsyL`mǿà2,f!oR"yߌ 00rk)3[&jxrO|/nslizNLAy#n[i[W!n{NQ,3V\orgW=2ur[ɂycv"}iBJ6J$wļH=hGZ/72k2z dC/w(1u7-ʐ#}Xͳ)KBgZU柢WWUDp 'Q'Jʾ3T݆Soުkf`0ͩo :Ou]04LtAak.CRȸ٪^,03X2TJfI q}rੋhH$]W'e z6!oJC2.˚ A*:1E_,fn>zVq1^\IvpH\N/&=$|Ϡ.IA3S2 9t?X:6#$Œ@%Fږ;d~{.m+YC,Ζz gF&=Ŏz״m{{mulz;z,%Bۚ- | ry1+n u 9qv"B+(>M$*8gKW T,mn,nx豆ñ{pCsxT`cc7)T2>JZWMSM B;Di/"k>Q&PσX J1I쳶fH;eA'xжqX-<ԣ)b=o@[U},'F)/.AN8z:4nb-Mb7Q>WĤ+}" n?X;@bc~.v_JNng0\;ӛ26Ϲ#c -K +  '`N*S޹6*ka=l~|)."BD. O0 ymk0=^q5p(˄X؁K̤p[,˗I|Ô4O6ty8qs9*~j8IMpp ƫM9aau_tOWOȔ+Lҫ)9%2jPޡIEBl/mbH]}C̄'3 ~)5pGyuuK/8$a~'޿OjuB2ܶ]պh~4*UKv'ϝ[-Y{XMeiV)y,jrzJqF@k_K+jѰLlB~JB^NaSֺSln\.~"g2y??>QbRUPUc_zp@^,w!p8ekQUI)FyOA1;\"N-!s=ʴ= /!) J|3=*Kp iN3"u-xbtu#bsڢ=; KN?6H`b(Bg1Ǡ7z=”׹[hV%-dkP@sOlZDc"CFxY .Iq;_C`L~Hf.Dhh a6tW>($;|Ė9{3ptî^jn:(:]U5pO}MCmJ7!N8w|9qZwꩪ5< [/-^SIXfF AiT/D;xoͮ=S =%wƕe5MUeY7iԃlF߇40%(R=[D4LXC^Ғ2Ysy[&eH;iFRN["hտpi/gFeUj_~9.mrYrE33听"V2wH|ð"z{&&"'`4XalpuВ7B屁< !D`%ލ=_\P= 0@=G*)ߜߥ7T)b0$Pw7u?CEsjy|(ǨGLSfn4!Y&(dPR*){yЫ 0}Y ~9| v|zb1Q_o+oo$ !G?,4~eˑjX\Q$JZLW>|jj-ve 6r ipd.(~{tɴfKC sn)TߺKk-9p!Fn؊ FRJ~QqiQHiĬH.QCdPr&>CKzV] 8T|xK0y\uĩZxP&7sr n}!,LrV9Ȳړo=Uj{&'dþ(ߒAC0]3m3dW]>┉VXZ2 g4y_u~x~ +pGo@j,O[bVRĽ LuO0!GTB\|} mD96~wd O! (=ʟ@,}iWL1l5@r2"v)T]3~@L$t=7vpW\,?!fcy^tS=rYK7$$FGF7'+qQ# J8u}HQJ_-cF ׺שcuIcĺr X^>=]Hِin>3n.omJ(% AQor 1牧?GQ+Ҧ(=*`mĄeq*qPcJPRi4Z#, 1'#u2[tyيw'9]ˢB ދ־PN> F[nZGY'Ib 96f*P>m:[7pԺ3S ITRs#D\s.sfͳ ! S@8Fz"lppjw ߽Vc'JU4OzL;gWOoIWNA*}ItM6S_7ya'l`}=$A]ZRF0շ %`^l :<{u[h|S{l {HH@ZI3emWmGÍHy1grTx:Cqо+NљTح2X__fX j80Lާ;>yN7AĽI /CNE4`ջ]/ ͐T[a5?Esk vv?nPu&~:ˤvdw4(Y4zux&̣c`T|xJ~CIjiVwa&#G@&&OeX;sWi+x7Y^E}Sd7=yWeO'F9 rj-0<&,_bĹ=īj ιE<6O(~29Zt{Ѧ(J|^9w6kqn4. *2 ky*HKc^՜)\Ѹ~%dhkԝubv/}V13JEW׍H]CEA *VZكd'hr@1yq3doe8*6I&PvMEb 2<,u\x6!҉hʁ۲YM8^jq>Wwb)ȶ<Z&m:"HC`e_r}8,^<(+ =Jw竩ڗ,b&1- MLHfyxӘfDN"]GTAK0Ђb7`=Dk֞x3($.i J܈J ADGNЖVg @)__{#MU VjR2]u "˘.h65ڄ6n+x4񘌾celԲQ? uU4y t8Q5  ͠Kuڕ u;*OƢuT|4¢P?}2p%)NNYNx\Kj<Ӧš}/2J[c~*4#oښ͞22x5tQkDphm0P9pd7 j Fc䏑Gkc>DIUOh0-,>zLቩ\D[ k{Jp(i#7Q0ˑ`cBoH%UȩGqVEpJ2 " m*yZWϬ4j6j>q$5`苆Wg&Sf5K!@F򯪦 m.HRڈ-@!TTtn)dD]/"vaÉfwzYBEBi ԦM'-MhSoinW )sgCY$☊2Ƹ8-{|06pU? cbrH aK ` (#NYID;*V`&piPd|+?Vv4x<6G N f쓙YFܨèg@E-]uEe)թIC*rv`D+2,?i4O%޴bMo3tu!}"Yfi[Kd_vp ^C6sS{xgO,^'zi$+|h˃0$㶏Mxf(2%k$#CG6+*Fg͜@l Q6Bh)oug,nZ)X s:SɐP{5;wc9ЂCdU砉܅J-}G㆚e`^txD&)V;i 9'}GN{zywkAB2/X>)O, ;K Gů1!ό3chlxL^KENY έeץoIzGS, ƻh]\^ޟw@}<\,xwd~e0 2fleXXFX%Htx%m^!eyjYd[*Ew=31.lGy̷ m@4mg|3ѭ\ɿ,rE H,&Nt mN,E6ݑoY˿GS>maϡAbks}_K}Ջ D@I*PiP!JovW*P]:il^9yHiDŽIYa sرZt3f;I3/^|eDX C77 r&isc^6*wO9h 8%gf$nCƏc> wڼ$(ݖUau1b6g94ר}C]v\vnS KjT<|42{$M'YPo.JL&^o^ }]y>ٷT wf$>Z1Ւ 1VS itG.1 NOdNtd@i;leW$hS;`nk]"Yjn l:2v_XݾYvy`fp Hw2c@scg>s=3CO1flKVWSpwyJF ,҅R#\!-*'xZb B_~l[VƒL/ h I $KP \k BZR&b6?\|0cr~ *<ׂJ+IO-O~% Vrη?w+p{A*߲fm MCu%D6hmqYV<4ϸ$r ; f_T&{L/[6puEY2K ш{@>1otZ)Rz`d XHq,Q_A5uKG"$ꂝ\]Ȧncȿ7vwKUCpM=euˇȎCj#'0kho﷍XJ qNV*M?&{Kk(}xS'h0uo5n"V{خa@}'H_z&&6.t E_3d\ƙg 3.WPc؉u,ISA7Hajď?[mn$a~wJgœVOO vn7* v99T mkD >FǾq r.uҝ?u5}i$OW̓ĨIfu≲|ŝI3N!34%.Wj nFr rOh6+̎3cܜsܔ{t/@+ s䠷FrMQ )&5(Fz8A $Z`=H>`x|]b'}̇:g ! #ޕל yqF bhN!RORb@ m [}1M.5Sp275fs~1qZO-QcF.]A:vfk5Gi&&XTgG}I"~"-k1t$π*:E(,RxWP}6GWiA% ƀę~DەZ?#P d%VFOEc0ᣡcZ6,3o `XnFâb[x}ustb-53Q٦tidXF|F|8)FQo&R]kM8-ǵCo~ z"p+;"E7jsK_J͍ti T^IiIz KVVrK56! 62[~P3lE<8oi](A0\I !R]XQ$Rοzo:d$BW9fWUadS,8]PE6Q`G`Gh+eJ߳IUD[W!N` O/Q5 fFqEQwsgdH; U)ҕWy۔\c?mZtOa ] é;W&JyNU2ց6xx5kxv-㨌$vN8)w(a=ts; W[[Vu|gb-25vXqj)-AzivquQ9Mb9JH2爒R*f6dʖB䭩S.K/g5lǾtay*(j_R"7Gg,~UyE`2PF@+MCEOj x1N6818,=;RbwgJ އ*yKrhM6<3PP-*xW,;m1*hR{~2v$aޓO +MnrqϋDψE nwk>bU3I)nZU}"6D&V(w(4StET9š"/@V Ff:믑0UIX-Q!l'|חcT2w8YYvaS\w >tfZqosܣIi-S>u^XE>ŎPa.\Ks{Y0/m1I VUsy 6ѽUdؘA:ޠrNm];Lq(_ ̃$F7=B487 I"5r؎yog&>W]}0)vO S3?GZV0zXwD{ٴj=:*XVgǃ t򘸕Aޑw ;8=*cgåfd7>HϞ\ "Lt{ ץـinQ7zͯ2}1">=g%ȍz<7SOqXD7jSECnyߨbkS/KX>la9vBľA=R`>G7k9TʥMYjnG8P?3`[^QbD>C&E^wuLe!R(0xa"s1$m[Q?V"ΔghKC Go@oU\+?:mGTIwHyuOj_ =_ j iL%壱AN'cNpe}Ѽ٣TmlH5=Wo %'q\aʞ}%jP4V%\CS=%fĄ;0Pؗcjr|sѤERqd_a{Zt.b>'a/׉9{-:Eqzcޘ- wUvu=;p ڄ(>]ו֕t5X,a.IkH&"۠]=渥ndɌKʏ7ZqhpxuTw\Hkf|Wt,*꫿"HNWnD'K@{ v&:w>׀+NʀE`r!iBKQsٗy@yAVk&c* ,'ءzS!PԌP.OUvBڎ Xc`e_CU `[ԉWifeK(r:UT]Mۂ/f쳲 ~@yOJ|O=x_ eA rns\8g೚F62,zQ6Eq3k>l'*7ܿ'\L=>]NRH4]q:vU&0 i"jaZٹ<=<kv;<+|G9#^ܷ¯\~gl6(S$&+Y!Lc;&Zg>nڹˤ_Cأ~QMJ.Ὄ;}Hh>gˡ:I ĕʌG%s43G"mxUfK#pem/ KpV!}KQ@a^Poj+U9ؒ2yXs'*Qvګw'WHLOoFvOJxSdz$+,Bd_H7j;ܣ/K]n8=1uszMN'N%Z.ܙKU8~pҖdn {:T@ooN8l`>/Q|J33`+nG1Q#SD4<ur[@Q5Uu 2ZQ7~"h@Jq-.' n?/C9[ɷW|@PndčrWG^)EvbdLr*DI3n[?ݖ7CVG/F*S{E*<(J '"a ~)$Ebq ,&ؽ >nGUXH/-ǬdyRUHEbPnVP}ݐ;sXlO =][ԣsI~B+4?@4.U fPA JhbmKj)sw 0ڠytEg7 ݕ`1\  %uHF͛PE]]18bRDCWERl3Zlmtu5$V$4[-ؓ %|-`Djv+sa;{P;`1sZڀQ=?[T$E:ܭ!b*VQqC b#WWы$p:j騹 =_HjZ?ک\ºJC:VB@I9&),"d{ሗuŸͽ"Q6yh]KPBDq &jV/>8 PCBQRq<;tM`yca?28@Ϫ2g[^>N%Ǐ" /2l `5sxآ OÑ7j`!, 3_ kY)IݤcsW.Cn h ҎS آ"}ud EߞF@#<:`m桨 ~O㳼@m$аt-$@*y c|dtG]Ƹr3b32˰Imݐ<1\zH am茛2F>NԃGMejvKitUsq Ԣ+/\2oWx;~e ^<(ܕ4S* 75̉d]&{2MIiv"?^ֽfDa@sD JPg9Nqm M" Yyn-O)#4^~9]j~P+ J2Q7Hzb9 !JvS:By.]& hbs?D Ry>ָ2Yy0$azHd <Ha}yrb{t@!Ag %(A 7GRqCxu)>n5 s{S rlfUOw}ܴ堀a0fjTg'+3vGsd"jI"W]{TZAS/!lXtmÌXq%/ʪE+B;O%GsA'8lJ#?@> n.M;5Ԝh0rån',g,s[M 8ۺ^q A6L& J໛LņP]P VAɝbD?(-$un(Rv[t{!W;gوZF,ucWG}Lm3K tL1oNU!4wgcHErܷ!~p{Y!^ۚ 8w32`;yxWhq)/l1Yָ7inEm>ƺ^%0%]K￧b:j7PhTz HZ7 OCu]\g.Q}fL5BŜE`g\ d y*(~y=B,EU%$ؾE8o2ȹz§dwq󝺖T]~uV3-ُ+O ~|@'h}Ifh JT|r|b܀ޛ'm&z QOV<͸tAӒ f 7K+ȟG`˗xM8UMdVX2s`'Zq^O7__5NsRE 8wqMXɉ5x9yDCҭ@`giw -k Ne[lx>Yն*̮ysKˏ ܏f?aCW;dH|Џ EI1C6`񱯫FV+.`hO֣QqC:y#B*}OۍP%tSED\qKpCL p5A&Hwbe6C*z ?ΞT@#Pu]8WZ@a8$sc1Lj;셉 Ũ7ב+㽨a-[SpYxLjh]R:ذCh:iWѓKM 66JBWyC Yr Wv޵b?9gz9zҐ1x GB tOn m;As@Ru--7:ZBپw 0.PEsK,jxfDQpڧ&NczKFnpQyUM@|m]шhI*SꉌyiI75,RAzqRydg{_%2֗@6c &غq&p-1^7egxqz&vD~2ϼrv%OޞмVLQ!L/f9ت7RE$$? 6F<_8C[  $ _dEBQkIٚl*HW;1hf%cτgxBθhdg>b_!qT;B^dENG3C)6D򰐛M P^D[wKKvW<;;5-ːTU؟+*t<ШqZU[/xg2`CS(sxһTrb1~V0[2\= }rUm)}#Je]\S?Y?s>Gl68!*llv؆6KKf tU\9%rneZ-F0|$lXxKXcu0LAHZxJv(Ojt!It4 ~:"VNDb!ૢ m4nтO jb.^Ѽ ir X#"?$}_w"qs^ `tu6Z^7}s^Ź2 >TW]!A-U$5p‹䀹')̳*h%F_mv? =ɽxLS,?G.J1D5"N!_q}6+ab8%H,L㽵}|{Nך@8Zȃ<tVVlO~X# f9صNM\"qæγ^jm+e#3`(68uvEe|`OǮކ豇O}܃&{9;tF-2+lpt_7rxiKϨ0}nQܺYs3.3TS+|?22\WbrSDMj?rå#.h0m6tt @>gƂ VN2Ѐ Հ;p!nv\hx) t2&*R)& z o܉Y`xDqJ]lԤkU[j&/sIm5€wP9 tf-"̣jkuŝj DH6&{${A!1"b]8czrG G$(281v֙7$E8Q(7$dDWWw/;UvYvFVZ߁QRB~HjӂA:è +- N./g4*Gĺ5ԂMgunџ^`PaL g- bEݭ.GH@' VqZ)Ӝ'MiPY!n Y?n|~+ ƅJq4h:@p;J Tq{]fĂ+]L{SaXC/ t܄!t.`i>*t_"YJhրoAzA4,L*ʿW= |#imziPelstюk4|aVRPXyGjp,\4eߎ`Q5p ݤCLleɣDŽ}V̷<qm4@p$ gI' myCo`BN3Bq𵜺6yH&\fZ`yYOCF0H$R u&Yv,cVSYUw#n |Q+|1W#/stȨ1 BTp˸d~ { !lzlȨ8K1vΫ^Ad3` !n{m-*JcUXQd-yE.M_nKN9rX"c͏Ȳƕ批 ?sdAn풶ѭ'ײN丸:ِp1,,26U _~EC,ۊ1'I9NdI䅻-)I Ax~q3=^; f)%-iR|~IqԦ! Jm6$BqsHe2ըYa?Ɍ"?h7b 3쀪v"> M>˳\7bz ,:1:BetRo͕D0N))Q)ħe"*5Ww&op/`v̛ζoQDC+ܜ2ᱶmMZ#~$Vh#͇Enz %`^$*XRRx '̅nT>wI}}OQVչݐZ ,mؚ&=ζ]Ü aaS%9fbm 7o/ˉѿmuAuΰ UbiN1m/qW/P24lr#A寝j|S?VO˥7bDM\B"۞{DiūvGim+TֺxX2t'@(&V Ic7 3>ފݜ )l,b:x5Q:4TrjŲR=:CYnY6a1δU_н)QUK;#*9z*Z2Hx^]*9=ҥ!TeFUxbwCҽ&V&M~!?y o>@{`D/0^xj>kĜdLK}B~o" .m&mʕc_bו5ݝ./ /)ՈH4Y-EGQz'\me~U7ޖ.nsa"m] a&Dϭ_ayhH6 6IvDoR:J7RuPu\` Oh&5eOoHkˢ/tZ|*:@Vof <#VOҠ&8?(Qvņ+D߰}eYmO "cW^N'Ňk kŔ񰌡\ځ%GS{Fԍj[:{5I?QS]ے28=4 r S} : '߄ rEfw`?{^[! &tgqXDS m*rA^+NH%$Ն}t7kUR35h?Ihh]"fix^Y<4@Yb־ӂ'7yJA6k&=H! 98}Xz/TC,4k eDW'zsHN9c5>δmqB4A4 [?\αbPwYNNjXkdQ`ܒѼ7LC݅H ū?H'_[9.`Bndh,Qa5nGO)—xM6KNhw K#xXWdO5ȿ wz_\6׼~ W_nKtvYȆWO;^Se>葼Hxaϙo|@@ .,'(:L1"rodo[+#Gxl--1h e{C(̜X`hnJ5C7+831sY WGHxUrAD=^jdNnw-_K2CT Ø^u dVFsV%z<)pVXbijTIY^`yg Чp,GP?F=^O %9J2U{-͠[kNA&SBNQ9.u^2JiMI#=K-3bƣ+19vq }e*9ؔAIA]'l]Z6LF*uG-a۱_3Ji?us} ɛ5kRVZpxCwH֨}Iǚ'G<pj}1IƦ8w6EYΰIsbdG+1f S|baJֲCȫ_f1&FK*X-Čb f9t*`3L~b%R}Ġ>TD K|KA"r0scP]܍bQ1.27JˏY1 `ztŸ3lf?iA2ܦ۬I.Chtrl k IJꚀů'[NNn =iLX߀[۟1]68s/O"`8Hۥ;vo{/X*˯O[+_o>ܘЙ~)mSXۍ(e:tp#B }+"mM_us*YKbiNM &wAo}}P+`Ls FPA]0~Jɸj!ͅ3@Z|''kwεџ `b>;St=in#daN8'`0$h~ҁ==k/t0Q mq+MbjPi)Z{8چ˃bw ,/g_%:uد_{4?.\&Q0%34CQR`_ϮHYq74R,Q>7 @3w }a:j %+J-!\aV0r/8-?KM [~_Qu|e=$x(M-Ӎ1_C=*9oNvi;QY/Il]QgC@)4Xb 93C +r,1 4!I6nv]5L BAH̞7:+E_)zyY중%9:j/[ X1"U<)ɵgˬMLӳ'%uuVId cIl@c Ae}K[< A)l!oWQiS e/b1㜇#Q $߂7v#}68[q? YhwpA23v|cIwG|rX[F>Ơ!pг׹bo{$.A}b ᧌S|fC|LU;4{RпV}Tnf8$D׊})Yy_jYF*^euocgƃ?uy츣{i N3h8;sGCve` 9~rn^ z/?;PՅ2Z'Qx_Y Ѓ,s"J[YOz[s\wF|eaI11I<_W CR{N`.ItH͠A[$%e%0&GH{?qq=-lq9VKT)EB^nbV->'r7_3O.e2L#A'I *a-`p[R8q@*6D>~ZU鹻Z dR92RBy[ Mݴ'Xfڝkɤ bJ, 8>A3~=ԁ)GkX:8 ql*2i5X5b^ЗQOIgy$1:+fy/&1 kbX_Z( ^֛ssq<y1ve$21`F~0 @K8F$>c0>O'Eu}$^R4Z+bkM^i ?hw Tf+xp52@aQ{t 6d*@?$t^/>>gg;zZ郄V.l p9r]p#!iTpL)H@l?W6)0;ܪCU{NC8GBJH(#F/hdFc]' I/PWI_BMiIPVxܝ  AS(0%>).7v0#!4)ɺW]qTOTf 6w-Xk*:H\Q>nr3nnV8Z*B)_eH9h׹VБZpĶϴ$9xR% up{w펥6 ħE ?̌wG:#mݫ}t FGea!Z9ʪ ,08]")|.mvj rT0-B Z?YvF~{ml ,R&$zBGq3r<"TؕMD{[$;=)]n1^Œ{z0[6[>1F#9$yVRs:i$F]*J%z B{MZT*fvœ 9+ -#,1]Z k,oTqM:]Q}T ~gg^[l[*M0o= 0?+Ӷ4QHb>Au)/sLa_Dd(gb4gJܻ[ lS&2cр`B4^M@Tهڮ |XGZTLc6{iwgˡ(@DZ%ޱcX"2,$^M]1{0v'*K2.t惻]a <[R\<>llC;ݫ.Oiz8_!ssrmUX:(1ėzm"#;ѲKt͢rTXwqewdhSmPY}.#槒);Z^:Қid4Qlß(ۂ %qL?Ecrp/|YD!c"u"L,1u ΂5SbRJ$Y5Cd֧D3pz? u{sMb@y/ 2uAI n,r46"頼 뺵6^3txx% 3ߠ2DYHGqDx }~v!:{# UqxNhB4 Ұ)X+k65c8vͶ.緗@Vݛѱfc1r`2h;ӈ Jjp.^-H=!W QvFo""ZJ',^2euMp)4 +3`?+;kapxy| T5i[+iWŲ9:DTFXN)eڼV)Ç,|n $~ Vo0Oq?yu=V6T%R׽׳NV݈O jyn]3Mݫ^USMzXu E07yGFzոV]\uf,ħ ح"+@R3(!Ƹ3}8 UC=7'n"~eD ж@\8(tKiwjLg=ͤ+0@n E~5O` DУ]R>S_ET*>2pưUq$Fɿ>ԅ;q7g{wRATC9-wn8C]ԩi]= cu ҍޞ:^8Ұ;l$pĕo]\`(^(A83>N 99n U \TIEH>g[HJˑ4N1E|e,{GR~ak"|=+u0VI&9(ya;i(}hf4Ґ#Imo>򘝎%$Փ2L-{ rM|WhЬKo"#G4g-л[ YNhX3A:i6vv._xZsrE Sb%̬ ]SP7ˢ6IŞS &gG";f{ب+BMpr7TfYnPGzJ 1KB|rgҩn)SHkH nYEE+BC: ,Pۆef`%4kO؜GOv.@ܲrs5(^5 em 'Pʌ^ܶ+>cg&YKUOWqQ1sd#y(x uM2(`$_GlQNK+ݖi ?~gvVV!ht smr*xi C'ʦ~ ^AaYް۬4Vٷ A5յ[4Ovؾ{ﰼń~cE _T8z[ vEܫoҁo4Ѡ# ư<_dm&> ]-Dv3#~n]Ttfp L$p[nt+4@7禟1neo !|[9oe_?pޞB2DZO^ʬt;wtOj,[0-ݧeTX5!qvNP7U١5kWnw;sDw!A-#tXfz̬xbe4YGb˪HgOxS$AV}ɹsF|pH͚XM4ֺyF5ߟrS8TSLhµd~5|X#4|SAϳKOe$oHVevѝ$$k{ɸ;MM+B~5XXkG.bټp.JxA{=I!VxW>C)Fi\Z8sv*z9V NVb[ ͏P)l 'y1T@9dZ?gFf֜f+Do9B[}˨aǞ`K w?0յ`hGYG/"&[BUbp#7 bup؀)O^)װYYXZJv7f9 &Ԭ4+*n Tl . yp֫Tn{}zO{ܚ`hp஫\Iؒ˥] JUNuKBfXm ] 6#pC [hbg[$C KdyLCd&*'&c*21sguC0td,鮕: 0KxJE're5\!A^MRF\@\MD?8EB>p٥ǤAqoK\};׷B: рϬYHHRyeo4i';oG*MQz5i;s˄͙L j0G  ! 7 Z܂s`@eVҲLl@™ٖoP@CbʘB_5W6UEL~Td:AobmX۷"4SD>J( QoO"F@ Ia2:r$Z/}.iOI֭a3ʇ?DQ$tc `;x -r&Ux (O&hJƕ}_j?ɗ-wQc[D!u֤톡*I{U ܥz*.Ih d[_(($oS֝0jՈPn3'0u=eε^w}$Q1 l!L|܌ rMp͕tFwڍZh\?GeZe?<_ў$Ãl_ JSԂOy7>=3+.TOoŃrΗyneIL&hi90 cx9Ty9jgV6'otOML,6+`x:b:EE\4 %zR6_BpWfw-._Z/ިJ pAEʔU pW^{?5y}>&R3TC<;mH~pv=x>zU|a̵gűu 0=@1 o2-J.kd1=J|H,?wibսnn)z PWvo ;·.XZx@]Pa(6sDpZQ % wL/z7c>R!,ԇS}qwGVR;ZSIJ'k1-;$Zwt{qj6E_Tvq,myb7r~L^0mB?;I :RIzXG.*Bx /H]!Ci'/e\j89XQ phHm L I+玠Q,/: AL.&[N>B H SQXhI!S gm7Z5 lJ w)C+ݾH܊So'ݢM\7c oۺM@>2_yӞ_#{2K8%r3=9;]/8(&V0NfTG*uYmK/.~+vOI|E"t+ VTܰ *Cj LE e%7`SԃP)RqҁogE|؂М|& U9 rO-WoS RvEF ӫ0O@ZtuV #dݿާV/{xst;9P܈FR@# h TI܇2Zܟ11ǬzյeBJGr"z.\ I4~%oյŵ 4JlQ6~(nb쌴՚k}.+^}Jt{r2֡<5#kFg]vQ[jFBUDym҇Lj'r^E9[!s:/uТD?WmF(!>ٌ|01t4̈́infvjX,SerU=8Y{Y`7~!J"^K_ ?h%BkP~p>b֒^,R7Ө6~? \w^^{?G)˹H*ЅڛlM/##9m튽؞[#"Jcd[eoaNl0,tΛDf3{,B@y(Ԗ\pB/k*"Aٜ+RË#LgmQeB_QŸ ~82F4@s_g"#&KL5ƾӠ)' ɒPor<-&Cw\ZlN["E(hb+TrU૭myv~rla_,_ƞ+_W8 T2==E°5!h)0<:E`- %kHg}S/ڗXtsl͘d |9J03.~G?L^\ բRR I՜!I;Qja nV1Fmum&6Y?s A֤=|> Hm$lt\wP7"22 UAEw [. "N/sqc_u J@%u-qK4&{>uqNԋ{0ITLj׌V+ %T嵳7q3ÁP:%pLZKOKݞÌX\Wvm[)?J Qmd*KF%wFԖBP9LD_R' V/[_I IWQ$ w2~\ l׫'9^;'iOɗ_c֨3cYXNPŢ# 8Ab`PTb/8iY6Z1پ@ @J)--l>&0"crXŚ0t3l3-[$Y ɺh *% ^GW#b_dέųbShSI(s.oTEU X^U %-xY}9z筇ubMFI@Ě"..{*JCEL&ڛGy ˗*YىT{MP|1CtK&+0E}Z2g]ID`̀啲TÍ:|ÿ:OPhZqyiA.S}uFMQd$)i߄GxX$r+2~u:t<3yB%RgS|iyim7zjq,<=<קnXXJwI槦|؎ \v.[>[^H]7ds@c/=ohf :D7~BhxQ u\;jPcV30_R[\{F^Prė@L`dfNb?S5P8"+OxO}[b >Z/y x  q+Cjf1h@gN ^g;Հ3WOˢ%=/Kt.8]i E` tFkk{P' S;vlse56.}q+j&Zpea!oKt}3pfvP/U0gy. Vo2GiS%"#9[AƏs7=ݔZ>:0d}^{ܹkذqw߀ё2 wYJ"3TLm۸Xĺ YYh ٠yH̛Qvl?̨|4ԋẂ+@䯉 V2,SROvڅ{u5hcS~kjwU![[v=bch)ňy?^]`aJݓy) 㬞>P L]ޚb ?yqHt2KBue88bʟ$W/!C~~@4x 0V*gqp/H*p+oBȏ" +i8ՊQH"*e6@D\h>f640D 3cJhw9'm`qˣ*QwB%h,-RՀ^Ek|B\`\ЮXVBH~_Iߝ~;1\ r)5F%rXy,f+CU.̕o^wNާD(f|j/h=7K"!좬J^ ,ۤ'%X9}v`2\$ J:UK߻߼&僷;v !~. Waqpd򠥌Ȭ't X5D'X~vSG|*|m2G"m%omHִ@/cV#piCv[tr?'q+pvgwvn8y|Ә[eWODž,XLu; ]R>L:ǣm{^Эc wfU ^Rbu\  lܟR8!y1V7^OY83 dW%7: })rz.G¨UNd-Y&NX Btni\g^_Ƹ*>m sg)J{Qqs 5 &%їbvo5XLg&̘bl9+6l<#Y/]¡AW#gn݅D%FPbעo"B<1'HGrV\72<]M"-㼍[Sr?~r*7gW tL\t p," O6.Fa.EvM/7{4ݍf>q4s-MB<=:G5Y;Ў 8{z(JQXeaoNi98iFܯ5t`8l9jcmJ|D>os8]Wny$F'FĤpȦol(<}N6"kE=͸qe Ne&(I$yo9]p۟@i>P0.ȣ!oku jf\>* ~e"j|MY;!W8O5/72~Pl(dώ=Q\^; C.xDrfK~w}av{'=d8:edTwt-v@g}J(857.xIyV7rʾ6AdzC+#g@=D#ϭJP|uvk%(kQ]_*l~#ÃenNQn~Nl_/07ecB]S06gfg>"}>w,_ќ5UUUF O0  nmCbܗTtauSg%*n8OɉBW^ꋴ#AӡY2ʣ&_?DAޞIWfiJI04plJ,U+'XBjBWc7KWL}5;0Ef;$>XX$G[Dg&ùLHWd<̛!zheql(3yz=qw}-G+Tε zA9| 2WIyg ?_)\4c7y8Mms4, r1\՜!cqպdO!aNDiAK}X7"g[fQ"5tפ^̝O0+B&<4b#QO +<@s^E3N\!BF _aܣe*l$")9a Xga(jl~L=-2F}Nފ)fBa[YXr-q(:dDZ%6>-  X1utjY_J7ebu?׍j܏vvωW͵V8i+ ͳoZMٚ׈ҝ|GAɟ#oPA#F%[щ?\ϱh_V*Έ_J۲Chbn^뙞49MKpぅtp/9 6.nIrCb=a3 I(>j(, 4G^ĺ[dTzc6Hժ*T0HbPJ{ =h(: cB2DGQu2;g0C@]{uFȊ\Ǯ7($m"LDCo=z I 0 FsHk[+ЉM9s춝_4ք3Kv^p1@Db g隍 ӛݡ}I<Ca Y Fu^)^鿰@SQUV)󘗊@=1A%gruXXiK&0^k h&9if32)2T\1% l&[3.'hxn]rʼn ;#&a X!ȹ\mr,I8+-˂%]#ɴUGy]#{\(:]Ծ8Јw{w%N'3]یIE'T7􇋿H72nuԦJa; @Tm!P$.rϿdCo0) "[ܐwk ~sRzRݶ#T柄F'8`'SڅPJ0bw`|[hy5X[ N[*N$˵8tvI5J:ŀ. Z[G$͔W_FO Eʥ+F5vO]mrŻĝ&oLDb\8ϪmS (&;ջOphEE"a v)f>! 6lhΡ=PhACPC &j뀙EtSb&x :s"p2kjXkdw&S>&JgFl״Aq̭Dw48B2ܷŀ텤}wsMe^~),q>V<ai)?Ѕ]d WTZ9ؠnBQV_jO_vPd-uWCu%F2Eypj;Ď| 2lAFWk,o {$t7˽Qs_}E*# n‹\ܔ7X*웞}^WS1&ǤA3;Ƚ{2 ڑ-MXup\ D dwB --t;r4c^u[;_ ߡ/̢ç}@DF BAd2؆y)1G.aHT yΎB[2`AR*{l#n'A7)[3Z|16Q)s*TeiF$881`6=/_ܬ-`9=_jvrt}p36.LANEpF5lӳfFuft4`o;e]M? t Ք<՟xn̄`%g<"Z&(t:p_ᇰә}|sSoB%٢K)c2`#'%5Ҥ:j?/ *ղL߀A4=2D~.:ҿD|tV,Z +q:` 4D`-B  %[?*K6K0$rk_Dg\_В^I;},x6 T#VaPKa=FAC(n5RGPD!yAikm|)14kq& +70T:aI]JЅUUI̮5C?!7tb VXM/ZbC޽MVyidŋqtI ՜U~s_û1w;ήC3 ,m5 N"P-iI8WڿF9URoAYdȃ+nB".sE|#PVl#(jvѡ)q@_%nx5a iL0HS{2nniY^Ow\|Elk q/=xSqQy.}d3$kl]Z~V$%KMS+)$0&YO ]f"mPe}78N(V6,8y)㝫Sj*%h kA:{!d ghda)m"{|e+-S9Ҍ_MMyk"ik5v"$[p>Xᎊb^hVZ= ?@ʏ'`ΖC6ny6W|U 7"UPɕ֎fʡ_6kn>p=y5ibNU1ǀ;m5ED܉{%22^CiSg訄*.%,͎n%,YF1C]԰trϢ(_5w ֐LUptlv \Ui`ɏ4M`ӧK 0c ϡDv߰+"+=56O6utgh Ÿ*%eoQ{T5=xk'Wʶ"F$]\ ^O VqԲmn-(_>ehن{ K R>m[r}@ u\=M+,>IP M>cr%0}O3$G\1xʸApƆ\#Y5&(!Jv[ ^s,["%BN-I?ZtdV<ա"+>? $. gnu<h[񼺷حF:GQ{PA) 腟6 6py[z&"7GXWbW6Ȁm4gkI`ŨAGFn5\f-e C1%.HE1llaȞ,zgxcE1+Qtr~u>065ZczwSrXϼ!WDȌeh~zdn+}D*U؍??`| CG BIZp-\bWe=|>7d5T LES p\4!wgH9u"蘅gOW37*>T<"/v)2DNc(ѣ;Hlѳ ƃ JlϽ{~a8Ob-t'=D$_=M@(W'SI?g|鏐=wN c8w[e?MkEɬ7i|(x3J 2{F/#ZsK+I% jk ;I$U$j0AVn}fbҕ1 ،ْhjC<&yx8ܠA`hyAzx859Z1>)g2T$scH]! SۆsXA]Ƥ Ec<dC#WߡD*ddۯ MD0+94p8Bߕ"ԬY9Nv<"\sa1xw!u:nh g l0W)oHR˒]yYDxi5hĂRqEKw+. _0ZdB u2'Ό}9J.gJb&Xxw'@OU(W_L]Y+0䢷1Ki&ByП؍u)~ғD .o }!jcFjv[)b\NV4rYi7`Q}}U}Y8cܩv~pIԭ}(Ŝa$ :nv56= yOϬbL<N,"`{vXS۽9(A7Y1Vc^ Q<G?n Gg<ý/| nxY΢fNMY**'D4]cr47<hj97u3mUl6:~ v_AHk :s3yi "#.H G=˿,SZf=OD~d4Jm%a&vX,j2jMcY:"v!@ѽy.( Vr9EJ$\p Q%0G}˹22h(o T63@aO*5#x*ONQd&IbNvo_2lgVWܗ0`EJ;^.d OSrj $R(Abu%@ÖuL3.'_ʀ-tO# =zr @S u sjf'kθx2K"Ym rp Bnsk.!MHt?m ;m՚~"ghٹS0+;3]|xkwr^{%(ܝy]4 S% d/V+iCQЛUoǥ1} 7,fCuIJF~ } .-y%F#Ej3HPW13àhka֙KgvdM_.a*1D~{2 ͨ,zaИ 2KQZi"G0Wzcj2i v/+KOrI "1ZP<.L#f5&.\|ϖc乁@F#9%TCsx5e^ bwt Ik@礅5Va\ K3sإa]0nJik @M1Nk#Yt!MfF-"XNN:i:ڿs}xlS׍Dv0|N额 C>^2I,K<2DK_zp=o.&E&pEE~a*)R"KRYnUtpg`G QҰ{03^W_ki*RdQ偩_vy[Uxk>3\3o3P^KL0S v4H[(]\EI$N~՚ I*%ceC;f fVa@&fDCaZ(j#V Lh&}gdLaH7HyvEӧ)0 Y4R _h/r1nFݪٝMnzr41:alY{`e=lUT AcOshBHרOY\ne(|b[NB5e#I!=w{L7#r0V=?ZQ|۳~07zDTtN>ۦՖS<,bl: ֈ>LΛ#ܢoKL߄C5 /čwjzp`HhAV4d/M^ ۦ\2#)W#_Sˮw Ђ?#bX>$d$Wʸ''-{#71vsढ़Ch\^~l+MXv|}foNu L*} qKBY 02m5i$|)>+{,&z?Px "b= } Z Fp^n} A*}r#v[˾o GY}]QjtPgAx SDxx_, ؠ$8K+;.OÛ8-'@o&J5F xC!fcO.t Sj9 ]nX,yզr<) 3]$>&.F1piڨPD }Y+^`H\f k>V%#M9HnlN#RQ :SsK+^ <{C;,A$5X77)%A#/ϟ|nk#.k+3w瀻l[4:4SY r $mD2d >OżX{Rs# ]A>m8o5SYo쫽` S-Ww&|" dXnթ]]U7 65܈ J'%"}T/T*LU.Ӏf@(jso1Zɀ4}8k5bm~{FޒK;ÄRPid7fn0"Vh%q#fBݡ`Cq R+āV6wu3ޣBDh66 ֬AKPZ"בf2"cE îI}K[s7(Huv$Fd(|F&N A_N#/5Hu s.B>18RF EXXɇL$mr$KJvD!w!D +g$q'9Qb(zNmw6Gi :0^ht4hܘD|Xs+ƏſaVG4=7lNvn&O}ꆈ&cHHavR?* ?=}Ω(ڄtFyV5\2讐gdfm広-B."8;Eh2_Bs&k`@hq|fdn)DJcH9á\uS4Apؘ|آ(lR目'<3F;jǨ׀`'BEN>1Mhr3P۽{F_S$Vu/Y~GnF:tk:&h؏Ħ ָKtDW70i2 Z%g#cՋ e4 D3`[` $>\5zc83j,)d+Bvguj9 ١Bk.9-G̐tӨ iH>f!>cza[_1 1I͍ TH}6kg8ſ|ϲ6]x"7Dj OF0z HmHĊ6Sx餝P *l57ED)-6>=O)k򚓰TtQ Q.Pm0HLjQw_< ` jk Eu>ƤT+ k琚T+oLLwj`"3d0M.0 7w #R }AEP" v!t\|cBăNةvIbĺHi@3*~B 6LH!bG9rֽ?! +t;bZ0t2Ӑv X.YF:7T:]ѡi#hM+awzzMQ;*I#r.l&iBn~v> wIBcN)]ZY;&]YQ䇮|+(%^ rYøfm ߏ&]/+B\<ƶwm:ɈCEd@eM&XNg0+][W&XX_fwN27TŤyɽv0!#LP?0UzHVƍCYeV:؉,AN(ŮGYoBG;(ͨx8H{3`Ҍ|qsD% fyw;Ĵ,Ӯ5Aw@Y}8bRcGyH9T*H^/zמ""u4/?j4c8-.}P&"sB4<>^FE+f˃_njT^U^]1-_ 0`J?VC!2@7qK(LUXB|P X_#iACps[+L0jذ/.ςlٙ=R~lrD):QUNni#{L_̞ Jrhrv8"9htCѲ+IBtߟ@3$~IyD /hH va(Y|MT+*˂I/b /վ>_$,I_ 7-_C9gNyU/0E+|9엵< !ď|(Io)ف;av(>~K!KqrtWA/9KD=Sw4ڔQvJG@LC3-щ_{Ӓ:#<5dQZfg) ܳ hBL\!ؑ l5(7qzahY]? I5 @D=F2%{+2{]Wa1}N 4J<龜'QFgS|SҝVdftf7;I(a#"LNa~B0G}bؖc'l鐵"ŖU䁢?i`&W/cf4`Ь˻Ռe&sgFhjBs-tb  4/Z}l; ɱIL[nVQ͇ٮT7i0R(bN/y-5ÒS&ҿؑb}X5KD#{M9}p~<Q\y_u;9ExO*Cx:&߭ <@ZolxX_r&HUZ5$}Wi%.Hm!W܍ V,o>G6gԙ_Q,5(.$g_ ^WtD-TB7ړ+KB/!ac⎏V%5$ZşF+F3Kb5\BR{ik|D_9YFC7'^R  td4ru&i͌~jqReeYaߘYJ%*sbHP(|FN_SOH)L@4 ј\5Ek===alr_i.v,wzQ9qHÌaE)AE79Dɰ^ "w_|6~);aD^"~)E.vru9=;&k RjL^֡Y)nX s䯘tr.-z`~\D$5$2Ȃep2'o02, !r}C]Go I42qNA1-e?F=B|( p=P?,2PGF~f{޿~(z ~ENYB@I:Qߍji:|ϭ~+Y^R&C7>9wSU!eB )oCl;4ʞ,wլ5ZQ!D:@ȴ9.-tXsbc 7mg LvL{XM0F 2rWG?f[pɂ?wu`ع`e}o]M"Uf'U OCxlOJ uJQ_h 﫻嚃n8;C\{ k(&q >ʱ)?@رD=fyPG$4KӔ `iC~&}[u̾ou'`2+aH7.` Ty>>CK?Թ<*RUSDqM遜봀I`Au d,p{Vae?Og%ANO#rR~>7b*  5S{E1sg 31…g +@6*(X.ЉhQg@A˓e n%X$\nˮ; 3+Z؛ I47y"RWbILh`AGډϷHk^* $#1GXO1l7a.:8ԹpJ9Y=(@:EVUZ{l^PgVG醉IEȭN9`HJVupPcT̺lA/vGP?5@$9C`S<>I;a*ŔyG"+~Dxf (lsOlPRϟcp0TJZn$yn%YzH9RnH<ժf?0)TYDDyAXܬ5[k q~LX|g_ j24gxFm^ d9bnZ+\5޿}x0 ,kbCSwB7.+N@Ǒ2ma5QKPH꿝Ϫyh[rbwҖ^$n#F`2.J ^ U.ŞC2~Fޒq6k)&8U 6C^%gLa癲Ӻ,^hZ (|R?Js ;sf@K+C 'WFț")rM7ᨄ[18: % 8Zw&@P%E뾳KhylFM@Θ\5`KzIM/ Y55;4(%Rȩ;Mb.K> *=uJ @b-Jc fn1bF BD;Pҹ#zⱓsWypMqj)~<[ Rdt04gK IJy'ul7ig`taFAGByF1Jcd8}WB\YmTk .볻4g.<{GL}/Mg[tl9e% $+ygƩUd(碌Mȳ3嗪dX?\ųϬ,d"ZG:C{;j:+ËzOlB?)5A*&{x|>^iR`,IRZly PA}d ~_ /GPU8JZCZUiwqĮ){f>{ʪV,,"N!(M { %g=9.˝49:bwF9Vgϓ#Kd%Df}^G&ERrPĀ+%/%FxD*m<hm4GԴ-S5ԊvU^o?i ݖ_aW,9m8c`WzS޶5̘E Gj:bU\>jHm<qJe3KX۱ ?m0E?A-;Ǵ4v 9"z ~+V={|Pܩ7bp_d9OzQ~ۀ}R flZF\G~{f *~r6$Eד^E#fO`؀ hIMe('k#ILK*[QQ~~[Uu7Hƹ$v7!)tv%E&,@VCˆxҖ`v,D,vF D VVnJ wmsWUΦ7/naW8YdĄyR*/T&y`XI`%Y|J5Sv}'DsYzt բs&8r3.jx493C/ou[re" E8,QQ4ܩ1+zAy⌣oCj-iSlv"ST }b3z0BiGfڔ#\ Ir8&'2(QzfxL '£Z/YBw E$ֈ~۬%3-h[;]!]04+slUz4׷SDoZ~ cơ!7FjKuo kU;( 'ƴ(r,{}(KٝՐ%U22Iп8LZH!sd5mp*Xr?%5+RI'BPCfC~+!+a{^LP;+86ߗtXhjUq)tzbǾ31 DO5yoqnq*Kjb[\Aoezz`b{tWbi @<pvҩ c[ᯯlp_ryFb g'UL4z-XmTzհ:Gܠ:L\ewXD];ǢɟNt+ ]N]3xRIS#OhpcQi[D@s]S#x+jrxqjk|NW~)xn{i(e mFhj4A'^ouE.RVtTE(>H =ȏګ 3yY;s<'-uON1$6 N`ӔB/UO#o1:.4LG% )oYlKnlPSnC1E4ZS*@&8 R.!_&.<טHvXrv|JdDmRT4ܚrUgz rr\a=d4Ԓ((#[Ƃr;3^5 দܨYZl'j9\xbHU KĢym͢-:Q Q*xU 9Ʈ了u8Rwa-٬xlݳ〲O`hS > LEgbѠ$kS>Tx>Aomccp쿥5453Wqy Eydwdç &85 Y]J)Cqj5}˘ EsYˍh?s{C A "o URA]/ܣh|qj\?mtpeLN4ɓ+qA[D$̗3nVzC'g؍C LXrVHjE8krtDZ81Nԣ&tnޞ q\ (excxXٛv & tcp+INU2u۩P!IV8b9Kr:aLI8FpXCu6uY/H8]li3~>zr&(<-YlC6n1xRΎK %f5" {B1(lc4]\oJYdgiT8h%<ؐ#ɲx:]+uc֩3!|2K̢$ԤꙎ )+,w^vIRJ3_7riLrjw>4v[uރʦƞf [F%Uƺg3FRQϤPpXYYC6MqXֵf:U33T5ZgaxH;K-(/KNOd,䠁D"#v"}<>T驿Zq<ob'/0tQN"JKҰ[s4v keC{99$)hlm,;݂n7,y'Frxp!!H(du6nNJ!4*A=yDI?9ć:]@Շ\oϏj6YͼxW6~LeTB s92lK]Gf.rղes 3^/b{yݺڍ^s3@з1KV\hǪżă_/³]|Gm$ @'Zvjw3KCJE`te;flTS+& daepYNjY1帕Dx"5BmR:ަ>Ɂbsw3 F9X.ͳ˲8J.y.:>Q`剏D>Hf_Z鈖'ۋʩx}M9o#Q >~jylu LQ>Ĥu[1de^N6iɆ֨ߤ`=yMvPq-'Te^Byp0I~ߛ@Ljw[ Ö ODe3I͝.|Lλɱ;1ǪT|0f7]"'}Gbkq<6AN͟'ŬҴM PáfN۫f*@.W)ugw/`\r5q1M9VȠnq`ԐЗ|ڻdNl:.^K0eyO,?}@f?GZ}[yĠњHbyJp =8:lsuVۘ04 cudV egsc8j6`ðuL9$|,o0%[B `O`F +/gݤnnR?J9,$oX-31C׵á\|n;NތWpXJx>J3uF(No|R2;-7pR#]MJ `*N;5趼Aj/oۢ/_/QwX",/#鼿: 5b㵶( -;gJ*9d|Vas -:UntHm]O(]M ѤTٵRj1cϏI!X'S&+zp 2kPt1oFMځ*i[omHРV&"w*0>Y!Afr=) צ~Fxɡ#ު^n+l T[+Nh*fQN>a ;)77CZ:AF(F$M=S}|cﷂAkMoa~H\Zk{^(MMPr>Lګv Saz+ &|8)ObHyka#}@ij E$ +#>{=䵩Y[muQJw$ە:eW̄lߵįA֥b6Os+2*tG` Cs(! B'|#1?M <\0$|9c J2nD ]L]VbQ˾CJ t3L.:S!nQdu2/HHLw=|"G`hBvM A,P&Y\8) ':j5hVCʡd &Z)"d.H1Ux~t bP'*#=YY y<2M̃J)Hpc[OB&Eeӌ& y -yxd\%XdbZ,h/ ]?b]QMYȼwݓ3H i8K^G#L5ʬ6B%B, dy4Y W65i"YߒqڰU"4Kh[qa*QJ(>*FǾ3w)|Fv7MvL!m(SlϘc*WDNQǽ/mWvH4bNs0d6D7f:Rco]orj%^@{ wXoh&QKci3 jqvMMdr l)X.\̃6aLm F|sUXFI -uĒMեR| &/>h[J V@b@-zR@jy٣t@7﫪noL㐕nH,[7>oA-iWJ%5-Dڝעn"ڂՅLQ*Nⅶ^XzŨS<[Rs Pod6GXTri:꺅ُ.GMK^sR+˥]bm僞Ąj/"I* LH)H(Ӯ|l+[^HݶxcC+ܛf\$,Y9ӨE:ho.apma=.BL0 L a'%/ ifeVXuMi2oxΌq>6{Yz.}Xm=qLekKlY -&1޳/8)[iiaMN'/6p!ǂؤ+ԥ[^q+zVH;kk[Ɵݶ^CS^Z= Uz&%0XSM3мGG\G~Ã:̿!SPQ__./ŨJGi@%^fLMcj*+ɤ#gߎ":RD|ž*a݊F %a2C_y6z:.#d'V0G+Cf(G q>z,H7E_0C*Lc7~ 7HM^D4T<-)^ .K۞ T. t{1V)Ycr M+Kf{&ֵ`б+6Y-lY]ȰX_7- $V: b˴FgwVe8WC֗uWxx3>{DĘ* FeF/7WlE<.o@c[N(_2~Pkz]%>Z)X ){7`/N|E;iYމY69l9Cc{7dhpFNoev ˣ8tQ8D}AFNA8 $<lNhˤDN6@9d(SUj~`N9{ "0OdWh̐ !0"41B,3AB !PՏ2|lEhEZ|ED/e$*wɡ@ފu/NNQ{F'Ipd9>B2dBNЅ>A͔.#/$QѦcWGއkqq,{t|쇽I{x-^p/#`2E𛡂ztXQQn˒LZp DfęO[y .Z!نD-y@#=?su"99Y8˫MQ RRU61 gKyC6X oEgs!=wC/x^:;ЫUUA͕\@D943o룑pFKR;pFTq&E4*ioQ3x{f`emT{ϵzZ] =/e_-@/IUiNu n":T^(*r;Zt fkT5M}b>ߞ8y"&[1R o򪑟6)ie^ aW"0fRΞʠEYRm#;D¾cԓ&MDZأE  @5sQ1!LDKet1ѻ8fQN } 5tW9ir`v$vc>%TO|Hѩ&)rӗMe;TN@ha:bqpc \|1dywם&J`yÆm < 〩maq0\,ZK(8N:5džgs{>۠P{j IhO?pݍvU׳+DϓiB0dwϫؒHږ2Ӈf3CctC{FEx0G} G^QQ‹X$>@|9+6VSlO:E-ifF,ݣ??ujoM|" -?Yz٤$PF11=xB̤*1lŤ[|@>{ye!? 4 c]\ '$1T p%gA $| I:tkf2|Pߣ%:`eL./ 䰬*<4>x[6uc:ېy<#魟+[H``3t3L&=QXgjh>^nLbv ?87:X b aw۞A*;T5J?*i27lݦ+ +z'ZHc) zbpaO(GӍ(l";@ږ~9;@|IJ@Ј ޙ@BP@O~!d=bĕ&1q#dLE>GCגKۙ'@gBc9q#uE(byR >~ZVlxC'VΙJ$/tt\/6:"S[{S2iEZ: >]uuP@'W 2pؗJ hзL`2ǽ|oRJ Ƽ9TbLMuGP%5i{*pFKIZu\AwPdӭ[񿬈Iz҈!ґ󐾑e3~d v@+ܯ'#$M8w_FZm郑7e]0'@Hҷ~P&u WOp33gY X|}@f{h^uOIQեE1Y)r<O#HHlFi<|cl:}4nXE,S5=oʈ¦ƚEW^2zɌH[ni1u0_H%a`sq|M&hz8_\p6ļuEQ RtyU ^nN j<fo&٪ sRTZIwܬnCXK pGLЁ D¿(cal''[ tzh= We5 ~vAAJb0w{-)>eK9;]}9w3yڇE|[܇trB0;yi%~oN׼L^@#!fQf,r`G4ZSJ\h܀ZNք w,fa reyF="f_?-{j"C= WRl9$A? t04i%w ,J^/햁j4KDDHE hCҭ[kqX`/Ξ-۾N^.;Iʝnn,Ye~/I@ ܚe g`!^S/Z^(G}|ʷ l?W<Ya_u>\Ct8PN]h1iUJ=]%(cPMdI3Y> t!p_l:CA}Ro?[h X|x\Zv,{0zs8j[۫W3tc"[3N$Kx0{D;}@IHz7 ~Mlqs^K)" \WnO,|Gp-?sՐ۪QvIU6-5|FǼgcJuý? _N1+?qc|ǘ 8>bF5i~a6 ݺV [AQgRV"cY'iKΰy?n)RuhАj'<4p<@r?eMA?3`|Y"Sur+eTF_c{2ެ14E_Acl2+kL,TA5m ]!ڃYk{hjfe[&\jO^1N_Av# W(IC.Hdr^'%-t$:5e,`ɇO tJD) , :9qi&Lی!?dE0fнԹ0߷Os 7?x,]ԱdBO1B~CrήDҸ|oL./عJ@>2u+q8kN H7v FAR/ ~_p:A V|)#̻1W{?dELݜ :8r| 7=?1 a$2Mm7papHl[R'X~7H܏n@3 5}4}5r~nr[J݁-Xc}}D@{al8h]&e-Im(*(W23TlMyꢦJK]>F[`Ԥ!(NȢD+>o!<ӾܮNކR,2M*"͆>e!DDsf"1b_a/kO]!Iffg[ס~+c{ Rj*EFoY/+wS=2/cj *{pvUޣw"B /We-jCIZgx $,Ʃc"=G6ShM(g`=]Zm[XBSQ1(t"2J;sc"8OD( I>$)"2=ykp-ϜšT2)y]-G2zpK$:WQFeFN89V ٷp&Q!#0;Ih_ 9Wx\LSvo @9媃Q Vۚ/9ܝtϜ4bj u{o> ΞH_򶥈<23459CBnleI鞏/DvWN@Z4.9.(65&zbtX⒟uI,WwL}tց(L%tp֠,bBEh;˷X'tnIRT<}[>{4k/>P$o &/DŠ ,V!p}= J2~z>9po oŌ􏋙 C/)2iPo3ԢsKqRJqή~Br64ZEO ý=&J exmONt 8LN^0q2Yŀ?^uߦe#ꝱ.Qdo9CdĘzRy!ND0C'?3/R.RW8H'*Tu`o Qi:ڎvnw%X.$Ne Q]bp-88E1џg/?O%iҔZvhrM>A.iOd&_|IW+}>Ub0mDf>A iz|7g3 i$ ]pO:0BdS8_#Kp=L7& Nו2"#R\Hg)7wqΏp"{^Iqky3ue3pho-Ik2π5[$EQKg ^ueBqg dcMb>0kyo-i-@"#l`iK~B[<(HikY\nQ=y"g ; K Cv+W$Ȱ/ͧ[wa=oe&)5}޻q sdo ⤺TyǨ)c֫dI@$39W-^%#74p)L&;ɟn]0w7XR8u" s.|ޠ6-LjNrt̿Кas8% &EV鋣8Ӧkǹu2+|Aj1<hMCޮ%lk_3O{t 1L'(x&< 4|TJD|u&_zЍחe-ۺ0}k?Eٛus<{sse3HHY|ITlMŪW0f ۖ,%.5vۺGwJ T%~mxo{{}s8g! pR="77kwTO|ϊej fVxvaSG A? V)axϱg1absKꁕLULkwrcb \WaNq?';!e+C )OYA|gJJ'_4'.h @)fjLp0!Z#Tk3wO d*א=ݕ8!D4בQm. @KIJXłC4AT9 &54ƒ0❋G7'}N')b ,R+~^/̮L+nicj(~.à]jGcT6T'_J|A eT`pp F1xˡ>&D#z4Me\RO/2{\Ei1hQ{T9RQ-0DlKߺ1o(ZYHrU?nPaj`dq._TCkkHk:H걨!a螳pvS\2p5w|5+R7Rʰ:|XF)<`%NL4驴ݞCL|1]j+@s%R2L>Z^gt0G*];6և2f-[rfDh1Kp\0rX0W/wI,BFYF`Zb iޙ"b;HVJxը !!QjN}شRVK -uo?<.DGJ֊?d64!bE=,^(D㈪&HC*v(C,G<|b,ҥ;rՃ/@EĚnM߆'3ĔyetlwPJ1:W_i}L2}[ Kq^//~e$?ǵL*laHřݚrWI`1[ѿWe!xjZhDN%fA1m#F24WȘlj01-2ؿ8:B n3&|ovqмψ]k_r Ude_C%(lS{'泓(&RpxX"UVb#`u˹Nzmv XȢ3P5d/AEK~+vELfED(v%$ut 6,sOTSr0ޏnv cm+rU;:Mqsk1kY xE3fv`l=oJd=Xڍ $ȥ]d8K mS3;RPEVe c'I(l56;ÀX~v%Qlpɭn"4 ƘIgTBEMHk^)1/ͩ^+ڰ:"4Hw9g썊HReVD%,)O;@FIp8zW =e~xna˃iEtڰ}A_Y~_$KMF%C< DWۏB:rbomD.d, qup &-n&FrL} LRR^zVye_Z/dj$f1..hh|9$C%S}um4&'0E k~ tvKeZ\yi_q%}Ɔ(j֮nuG*jx|=Dtrl0QCQSo%{!R[R˘Fƃ r6DGrc։՟ z.aA`_մEq7SmzH$4f`ɭzմ>*ך~gs 8bV'k(LgZƦg`s %@Z0cϠjA|+%crש9ypiIY婺,34p?׿|"Mt w4(.G߸ D_-?3G.ŀMB(R6$w""籄[oV/)ר y09y!ۣG3Nw}#wL'[M("Ep#^y**7[rv@4j9f+6%Ty\aT~~݇'4eצ% RsM1Z@d*s,HEnq;UYKN&X<( Dn-1ԧ̭PzD諝Qj"kgN,6+BR.Rb'T'l#%U&< BeFh.Yȃ8?8W;3aeT P!ˎNy{8JM:ġ9^c>%*ڕٓ tfkVژ8܉ my)换D%TO1΂-gt$2o %)GH谅g|%Zpr*Fe~k*]td.An$iF|p:1p,aDS* ^HTy)٬m:Gd1 z"V }m0ڭ "ևWQģeA ʩe*uoI5UſSgFlm>B #B~s$^B~qn bKBO8ظj-D\qKaW=⅏qc9xUxM&eRQ,!nܡLVp4 Vʁ" c'QmkP$s{`ᡂFw1^p\ܮtl(E1ߩx2vqTWȏx~1)34VD 1yU_G_J +qkruaFÃ?"dokY<͹g;89KM{wl?PŊ^Wۿ1hALIG[W2} ogDL(*BX0 4i^uW3P2iX0&sgeƙ+/siDE,v``zFeg4 f@bX4^cqìwhщ0ѕÚ.PLc;C;ɭk>yP)k22}\PuVd$G=·l;tl:֖QZO2ԯU:dqt]20*Pr1Z"oqK}ZȿM|DŽAnuv%/wݶ1CS @(uటpq+j:$" Nrӂ4>6jl#5nt>4RQެ+o\?"@!*ZpǟxG**`NTkU0a4Мh-7.q{ CgQVC*aS0Nˁ~[]I,`a5lK M7mSTjsf e:Jm#Z1w&nniބ uٵZ3bSG[`HRwrR?ʗ&Q~X4[; K҆=pL 6S/N{p|J|A%6] ^wBsυ-Zۦ4Z@14]sth/ݏ9eIDeO.i`}zםpR_?m:p_O.m~T@A;*%UQm-8XPׯsfk[ot@͗R*͝3}))'֒$͑m%kH:D0P+ôh)f^Pq`lnM߷70#1P0[7K%AʃR|aҡa@kB /|ŝ!f<_?CQXfrcr%oMwKj*=lZ'.K1[HrgJ{_[gn@-g9w-M0YP"|f[:fK;&=q2f ㉨b hs:>e?Y;!p;UUs7)ZFid[f/Je#Ruw-rH=]?0{ \bc8 X!C 捆:{8W@yTU,A(1JwY1 0,ew.uapBldG}78Y I#;G\AjE*=R^$NmkإagmT&(Jόu]MȂ(>ZMe0A_N5-ΊHN#ݦ&G^Cv$/T13ë?I] g2zuG}7JaWsB I:pa="xX6q k^Xvon?37~jJ`8'u$Y 'x} 7!~f/QMܐ,ғ^G:D*CZ?fxW/f."̵m09͓?Df1kr-ftnFy ?15 7c)f9&^?g0=8h~[>8ce@wR+UVwH%KIR"m% ]G hہ?G$3ry Tp0YYC𕏴b{ˎFd v>́R0n[}H %[%-D~%˥Q>+A0`{eAbI#960wcpL!qʳi{X 6 Uv4D?2g.쓿\ UkKK[:f ]\R)mDtd+Њޘ}` SfAV,&臚W %ty)Zk֗z|ĬVad"ʚ΢*k%qRO.Dƒb:~g" GT nl ˸Vkyagُ̗D raܠd'xO3&{-8^Sε8fF27UF,7iW&Y?{3 SKv.jpTHUkHpgLfv$Ö0v\<4#[&&^(,trQ8|{ U1,TfuvQҿ+}Ѯ-o̱RUTe o%>BGU>w~}WUh]0$9;{%bJђEcǒߏLt+>@V ,v0k9{L[UoyIx]['Z`whe6x({`l*b$?Aq]Q<&3 0 KM2DhJ-ۑ3e"DSIJ2%&kG0 ; hvӱV_:N2j@1<~;Mֶkyd8 ן#p%Qs=;FykltX]yȹ#+W}W_- .c딨i (^ldR,{)86_ЁQ j7MNDz,aaS+j/OM <3cpZlVpL"9М:D9ԨyckܰWGS \Vյ#t4"U1Dq eWwC30.%^IrkQ>|h `XMfUCcFT)џ|ku UÅ('NةiII4񰐘v TX.NҷdZ t~x& >Tn_}0,rY*Z9 uLǘ1)Zg6b7p^`ݰǒN,Wӝ  ¤J97BX_vފh9AМQ1c717Z ֧[͢6w*$dԾX.Ä5MeK0 F)2-8^MO8if?:n/R=s,p͘XLV:~"|rwMXs&p l;n h/x \cvwO&E10BlT0IK>kXSz)ѱ7Nx"KXԨ%Z,bgPl ^B"g5cCAq5a%a+pr8&IHد{"EpXC\CJ6 7hϣZ1Z\d?3~IJW˰)osn fqҼ: 3Q$n@]knP&R~ꟿL5<ܒ}Y _c{w];a$}_ԁ0K;[,ڏƌe4+NMNilk~R Y a#+zp#J0J#DlT͉S B@guQ, 07|7LzzO7Iu/MG1E M[J'$> p~+CLq_h=t˨WWD-Ki0`\f]&3/xFVL/3 7ېRƭГJC%5p5Q T2cN%VEFNfR " u slJ! {  wJP{E$ZĴK~DRhӫ\pFZ_ZE 2Rcn_idOTrؒ ~F_ϊ ꬳ JZZ¬o:aJVlj^4:f3wɄK[c4m`¨4Jb][qNg<:eOha4=LSF7t~= m] \961l{  DmT[̒#2B[f;Gw$)+vA\R!fP3t#Ug h$>Ńi[se[d%HNM9UwD 4Z/m`:ihcd'!e .-M*]JQAgA !w̗X 2i'/Ŕ>aa\sD '_`;(L[d}G#]n$Ƿ!eşK!>W{X-jm>*) M rO8R{>Zxuh)Ď1"̲(TOzR͛x-&"J VG1F qZ\Uٻ]|b2FEϛoc*S7ǚSb-PvqZ_Y~$zì=h+N=wA㽤H5K=ȥ/{?ڲܝgB?>!xzɃDXϡtKp ]:gQ=S6x2ERk+hg ԫFmWv@Re[b!xY 3@ mQzi;(syX*VX9[E?~Q7|+IQZ BFa,Kp\']Yֳ נ_f>h|H> W 0m;IRmCl}`Qʬ ZDX,HhҩuNْI鋛S9k!OX!B;] 6,g }q:[#hEOaakd=Ul PEJRR?>xeAki@T i!+ @Aπ̣u=|أSzp {hwXE:\UP-kkِ7bv/2xͰxF |bo7np[O]j\_F)!H nl3rAU u:PbBu:s_C WR[a BJeqIϷ+\l'~"爬pAMO;)5/(?w喛q4S˭4_a> 4kL |BA4^MK&ӥ ˧Ogi8$Z&WA۾j[1aV#BX|4+X/Ƹd>^I,rlU:}xr.y%|ؘ'E"ty^z_,+QLN# LSV43nA>Jq@?>|w!FfD#%ۚ:?caL"SˀT%$_w-xߐמ g/.Qx }v9Fa!CrmQ N2^fQ:ք{E,X{h+΂CUN8qbhpTLknCRUK;t}ȳ6g> y֯ enAg])-BNrgd86rO@0'bp@s3qsԖwiK4D21=GF{ӌ+^G*ŗU.Uq׋:ҴS\ȫ}̖:5S\u$!% @㟱uV4[/GOAUzrUt5SKR:B&QjB`ILf R0֣G퐟f3S)ԯ#جUXΗD[BIϟXիH}M(L)X!ޫ%>ҏ >RM dYkY߹VCBa4I|$zXlg"Y1 X2,N5l#nonz NI ЎGd[D>}:R*.J90Z-|31c->3{P- Z"N)&%`*%h,LQD˕n4%#Y&QMXl Lďc{D[H ;S7w5^I|ʅ׼X~dcr+~fÿa\-U9#iϾc۰H1xbz:92I~`$"o^*bKЄmp$}MvT~Pq6Z6scnZXlfMn2V&HHm,ަp$tSK@i*BkE5O\=$ p=$TDFS\x%w=*b.U a}!ـ;g \gT y8QFu;Lg$f8S. -tUg4l,W.ګT!$t$eo8m.iǦ>6f^`,ap=w",̰*P4R)VWG8Ir̐*٬f|F{O d剶߁{#9Bʇ%=q0ܰGr1H_Ζ$*yٴe_ݡOKFJ%`AN'{n*= ޼C.F'tq_#M{~MHd0IKٟXC0RM'@M? on^%처lW~ドbCH+^56ωwtQqLHI٩mZ!SX{^݃9' {3%u62m2Gp(g߻Vˈ~J5w05L'&+B@EbB ܨX<n^ dfsGF@ p3,N $\(=<,忷ݍPDϹq7PD )c*.Z2XXuR@1U&O=飦F ^*UWVO\U,X}G售_|rTýWxՄIk;-nTJM"(8(J =a*L_x o%Nmlq fI:~Dq^s+>E96S]Avy>!&$plg}]i('8wK/\7H}PԾ/yY K2&j˽|y_(UP՞mS]  ' Fkdutn`nq`5%J (VTиEF*No8E=-< aum]]7lo2`#̶͞BmVfGjƬ)0*BV݆3[g曽ICAdJd\v&򒇐^|+p);tf?^)xe4 s̙F4x5[jvZs}|wEp<1ahTet_+\c=t v@ˣ:Öy@o%op <ԇ3Np'd c!S W@AP,[_HCO\ykavU-)1D4te$!,s R\wMMJvLv/3_, [nH_(YD#cHv)As%@fEK 7 Ơ9_]5̏-jȥ diR>w7!4b_.C!ʐԧ .8,B@^`rBRϣ>[^ؕUgv#چzL kTe_jc± DƕC=Jo8`XUٗȫv4O$+Α5:{5 {!Xq6=QEl@`-D" JSLf_4!%X/!`pVw5?!'G1w[J }2E$aK&zqFuUX\sJׅP/h/!E܏h5Hrְ6P'*ܗUwj)/aRZMKYnkNލBE9RJOR;΀/FPl:ovh`u4V̠ї_ Nr<v?)j3#@PJMUݨ[(Eo& G$Dfb41V];`"RS=T "Wf5H9:HׯܑKynFdz6 qAaJʎv[#Z1_1+\ q x[J@FC["PUheDUlԣ Hc+HE}֭ D)o 򥘔9B,sns;VtCw- _}$|cr EeO%ƿB<9T!B, 8`UNe\~̅p.22Ɨk_V&ȭY4Wvo5By~YARqӸ y2)|>ĆgOH{*Tp{߈$ʷqN8Θi<۩Mj CgAaQN98AX3iE3)u1mP7upc)SJ/E3ɲ/(B]@#}\?fGf:3*D) UB]~Bt׹^=%~*nsU^j9BbCGY5(X3a8}^<іpg pTg:n&QY:I+t[aR$Ʒ%Y˸}/AmirYmG~P_vk6@֭0Gݾ^*0D< &qZT FtX'ggF(8!C.ϿuY^]έcߧ \&:\JD!z߿F53Q;`$Ii YcVhx݃_$hVu' Q94:YSuG#[Vҁދ %BO(ghȝf7k =0[dix寗 7ʒV{MwiYϭPoW!3< ֐6%=Ѷ #_,`J6֏kE_sf6j!|SZ,.YUF+a}UX(be'Aj}pBZw]9Aa  <ގήV㳞ѫ'3C g58[1aQYgrbEr_UL⛆gb7 (2S]1_>X>_MNφ8q aR%y{]=skYRdV5Ƒpse@'3vmWWmwKH [ )~/,~x=غ$C u*N8x.\& JzJ0A&x#5vh5 QlJ:KPva :0A7Dnس@߇* )A A9lh]Oh4QBsP2SH[͙vu1[ ʺ:w;LV*HZ=C@-)re95 E;GWdSHSMjv6%#.^D,&3 .y#~_}cR+dtj4[MGиOꞤpѸ' c)Iۖ*D'{a<&=<4oo7!ßb6EC4CecND>r}NYmZ Nd& uYnv4N# I;e(L>JVʣc=i ?ɵ)qAL C,'3Tx %"^Gu{2S@ZVs{3wQV/$Eho[ty򵼙Dw%$cGK*KhR?Ofe_&ny}&_εb `H8 4Beqsp3&3#ٙB%.q-pk \?}@t}aZ=]7y8runGđ೿vGA(wZDnD[e ȟt/:!PU6` ;[DbL7h`}KӜ|i(`h<1̹=$$[ד?3s5m8J~u2 b:;t+07 rYYx8dKHlCŷj岉c f1tO<"F}aۿj;wy蠴 g 6=^MXmdbˆMeg;k>P :gP,r7=0`.^³Nls@mHwfۤc_<~չA STP[EXup lx{nRe?0\H?+[c\DN=YDP?gBh5QUF\h܌ g>yd Hy!e_ sQ$>Q1ϗ)c(̽̓a@pxqu, f *tat{ak!J@ >`Iŵ&Vc^*@RD2ThxZ]ᏵޑOo9#/nk/; 3w3AV<QU2ޘRmYЎm"L:#z?=M@9#O;oߨtI}JZ#PY÷boYvN`vktdn보0jL }|5?'8d &_قoIXFOE(Pn:lMthNclXPm$;-败q=aH?D+9j'C!R;Yqt+[ f>j EK7?>]IL495AT ތt@Ňa2c~SOg /xb2 WAiGt:|JpyfdFxUdgyٽ͹=I0 955<|R$ \peLoIKE}ޏf*񀆎a†cy,Uړ "ފJlp/{kv#"u>){eQ^Ne?M`ژ?+G*Nҏ^f~ >DYy7 :ھ72-?q4c;P<)$>d2[Hk\+.:ߎZ91Yd;£ynW''#QQS6׭mכ7LJֱ1 TZ3zqAa$a~}%O!gRT1 {DҊN.0ZUcQ<: Mom4܂,ָ h;=+G% ].q|Pd@>dmY J3 K@ǵwں*, 6$V]m'Wbf \hl8IXksh Ip 5,BK+bYG׮#$!gٹR}O/}5,g噪z*$2ڄL;H_"}`'iZզ-뤫N&l\HbaU8q}&Aɗ0AQgQnM^DO- mL9ozTL@aR#b3|uj])02 1)?g(OOG'8?r(tXyw?xJw3ǔ{orHmQ]*ۓwxklu0 s*..O%b:"q\&cA_V ds(7m+ꤜrfcmGib2\8poorFzQ_`q!bZܑ)2c{|Ȑ9Iu!`][cPAW8a;:a(fVs{'[X}6dJc膳4j ( V 9`9H7M'niҝ;WBPкx}rXr"̧.-#Z] w:Ôliea#ڦJBWkR5 (Z$ܰ8 R9/fR(r *l(Ztk-`x ħ3kt* )Qy 'D6SV)xz 6Uq icdViaαE@oW~R)p0 ǹȬLOk9ቐbf7 HpW0 u^2_[˞V8Rfʰű~UXպ"lp8ׯr?皍/RBW J6% V0brTAz-%4Z;Z4],QńvȟV?{8װ~K3v__LFK23zoڛ> >E#T>fĺ;4qcZ4eU nqˆ'FikFU|\ûkD,r눥zĺEgGoքL 8#dk\~UlJ|4%^# @Y{yz$_)>xfYͩ~X 9@čj^u^hd+sKWWJ6D6-aHpY)Ҩx+FN 0.l`i4Z?܆3TW5t>} Ot`fVZC0%!ˉ[sl)<]A1Ƃr =ߨOPBΌ^=5ߎ&DsI26= ^>)g+'c4܇U7=ꂫ|қ]̱_-KɒJ8=jס:HS2Lx-$ZU- DϐHwİt[m'|mI\CTnuڡA"e>VC=F"ap2b&7d:11BUFCcZ/Z9T*j=WwPlBrl ׿6J斻|g}C =f%ivN';]H|yi |FEW u^m3X)fj#+oAu$*X| +e(kyi9VŠW_Y*gڦp G[D6k99Y7߹ ٹ<xSwCz42fܸDadfeh.Jޭ ר(A. @SO>NJ1^-) qiGDVJXAx~i&+'$MuG&=0 ^lZX>P{{"peJ4G8B jtͪ=X?w,h>W)' &yUC/T0IU(N+ d1e"͚qxfwj8GkǓ-84u~ԤsCA]+qʆ9?T^vNt% ͅ߄D_*Y/Ұl kuRL%)}7e21a!GD5+QWyIXeOP)h'1ծƬu7{Id5XoujBv^ʸx|̊7/8oO{l! Abf.Ni0NᲾ~ tI|G9Yg8p8X7%o^S)E٧+&*Xܽ󜔽^Xc  L&u2#7l11o^ r!ess}E7r`vSMUCkQ(Ф<! no,t s)||'=etHSBv 떉ݲ.W i;⤇OyS=_'tbddë24GQ!MiWcJTe!B!UvaAFh%SVf ͕V73j}⩁UIKg7hhĹȤK~ehR]6L<_nJhݘ`mBm֟Hhm UMXYsMa# 2dS>)}޲H@I`ȮSGk뷇o(tL9#+}Tг(WYgG%2A̫ʶP6JJO (g9hnDY_KZ1v 8[ܒ<]rDGHu8kgj۶+YTMit.O>NitJ_ݬq;nopdiX tE&:PI\~w|Ƙ'`E|IT\KȀjBnX&` iSǀiEy3/N:TMƊ4bUJbd9i̬M&TSYh 5kԋHZhߪ(e$ q h ^2/;l2wu o P:[ !TVF1.Cp%RN+xfҖ9΂!MMli{Λ?q{yR/g7 jS1stО941uҚ] }+ JӟgӲYrOO0Zd\QV*qV?i #p)_lWQ;U7X!v|[$~bC7qVK uι>:{L)Ɵw!ND6-hsݡ1/.yfA* MM54#s#8umi7;2ivK giȊt.#1 :<8_6]쮥%#ἂPCX^ VKK(Uyѩ ܆>1[֩qp⼛ #Zo9ܝdGN)$XF o ra%yw!Wl=K e,u }=*֍jyʉ.86NK&y)(?@;xd ~ûDFL#ߌ l tOGvozT%d.a,DH!˔~Ve[4YHbBfͦ0kN3]h$ԭsޞOp"_E_a>~f>! NrR\KA>gK Ҿpdf24sqh%ܴng7)-*]+%L c?&Mx]=sA͚`>YV$PdN%]K8#֘}TRsD,C5b2V4}.Q h)3b$LP52",&|$v@Wm^8Q#vX.uS" w!YĻEӿF`~. jǷm;4p;hKcf8HMh#Cp`aH ~O1q^֋%Х1///POm4mlʢǣz㣧v\ߜOnÛ!f#x(R\'\u -o7"qvHnE>r!nŗ^֠Щy3{} 6Az35wI|z@3 Sj{VL|(ll73&@8v=M#IwрrVГG!<1leC ܡ쥫OcWQ]sTk2q7UnypKvA0VU r #L:JMI"5bԂ?KXEԝ)agVNʖC\GfߟmG`kW1"ͫ: Z.ĝ&!Nu{њ-s)}O lOay#ob%9r=b,1GԜ]@oU:52[OqTgy9>ҝWmG>%`?ĥ|O^sb!G LunQyh@L~˭^7Njbel4Av?StD@DRc:LͲ<0+q;bAkmpM@Ja#=u}v/+`Tx 2E>?NH2CN%p>YJ9S ?h ]!5Q|Cs! \SO eU[YQt._cWf0Fj~_o-֦k)B…#5mկ\9{O3F`RMMoWׂVȞJ\1>6+;o cr4LhzOf!}NKt-}*ʒJVPwdZܳ*32T ]bn`[.Q͕N' =,jΰv$+*ӣJ2+mRFb oy绾X x/ȩ`֤Vx-x%fbSX#7wޣ߲;7'ճZaA"&z)Ji!G L'C^^}rOw ٷ'za]CFG0@mS`i`,(a#Р}b1֏D׼N%?hFJ.xJKpXP(=y_X/ʗ@p` "W>`hy'n]im;6Γ&"1 L< xZAXzr ;|g@.ju:NR&.ev>1Yna/B?I~i5t?$l#v D*^.e:%He/vR- "WaN36|E%/knpTK!GSRrFp@o{3@=$Fw(vpY/r2lGDNP^qLk?G"OVļ혩.:=[oӶ,.?`xzՒ?G%q31H ٰu`\>R݇p:xRB8BaDPEʏW'0|D/X[ I 11>1:(Zh\Pӂ%>'- xufv+{'Xy%B5YI\oFSy |z).,%WRv*6TV~=iMb`@S#3)h#^R%ЀbJ[S[ێ ^ˮĀOfVXbOPMp⸙* ƙl ]X]G}kg*M°Hq,ٔu$l,sCC_$^}PUcra34kP肝˄ W(=OW,l ' \"kʥ7 M4 7nUv]9$prAh' olRQݗ, I[o녟o{ß0C Vdb]1 L?=xgRZ.y9YV,J:3{m(ד E5`V!n^isB8IkIūhݩ]i6/]\h C~r0 l@Yt"‡G,#ϔ\Lݤ1i,'?π{`xt{SKaVR?1҄NyJ}hB`Dn{˺0ִ9놺c_ͥMkNo;y1 Yo.JWpGxwA"8"Ay5Ku1ߢ` ;9OOl 0xG'ŵ#~y.؅1ƕ" ̳Ct_xJE26] c |1VrU k/huMt* k𽆘eݘ JuԃSjMI_>ߵzVe] ?v`ߑFǧXp*bc]m!@ww%s.4~Te&+ffªcC$?i)|n./l P23br@T댼Jq+ f]`r21ULѨg .3N{ w/cA&(IOLYG-yψn4By^1k֦[Qk~`Ar'w>>nb2=jȔQFT7nh3}1QBe>Ԙr߯h],E H~pi Е~W,Qx7]8AK!LR;WH24]oa^&{:yKC*VDȖIH@~RqPRFͅ1'A.Hf}I{3ۉ&XM$Bs\8(iӠ޽@%cjAiVR[ p姞)ܻ],aE=s#+Y:v0޷Ej-gxN݄KNZt)]D%s$Y" *5hRF36i" QElƙ_-裯cSvou,6fKqlxsi; ZBYv>/bw̤89VUaAKճe,roU[k>-}0=hwnj @Xa{b}7T≠%~$ , G.#BɅWb3/I+=&?rbw橕7Q#xda1ޥaET\cp_;b\е L{nlL4{,A[7xw` %Sέʎx4▣X+edX*n9+7 dCSN'^UY IJIf՜eOiTCy-Q4!&n69wNEqn̯BS5Iלgf;+ ^%m*KPsz d$o4OL JM>d bYyZi#okMXbcf^BDZ>a($fhuO븄8O0Wz4mPl&?egm !_~4٧S{&K\ֿ3N@9m|+ zޝt\[#ȠXF?oaG`*A}f٘<觙 M|rDuw67 (KV^i`9R'$+Hq@,jJ=oѿ=DH,ڲ*%K?qW(5zzy8o;@="g')-PV]>83hBsUJ'[qIוIAub<8xwF,GjS9i(|=kLu4@w'oν O"IlOg|KRQ>MnpUi7`[IsS8mo6Ώ^D%^9!lt^#:_(Dsa{h@qߝ8Lw?RB]6q0.N/k)N%&SmX]D:{6E;A~^xwGr/bLKCc*f-51>24a/o&7^c+TJr Ҏe־L05r9)2NTKxU`/%第FpKuE܇ /A L,FT\ WL5H}T8W0F-(jZﮮA*w79j$PI \#qOlvu, */HC9c k|\}J%P>ALe[R6Uڥ'D04yxBK3Nj(5>yH}i>RU6 y!iP(.S|A/r(ē[X3MD踕7/(FB1TPR^lZGԬ"o3赠^ϊ"AHRRλ]uAXOjx덂e l@3cwMѣz[ 89.!Q M)sXƞBGަu$UKlQp?;gǷރuR_`9zM5f&u6[}̔)G)M_^m!غ QJ;X M17p^g[ؽ,>r"jrpO ŻX|6Ri zˇ,{L e?j;q CL%d%F)AB$S\:@ܮv{= -fW񯾂H1S3f `\,2b8TF4r)4*㢺rK[Ղw3Xxc}~,;?ʙs9̚s>[v RA>X2G|!慨SzF׹>ҽԈ”gO^f이In#H3UDeDZ :t r |ۉ3[ ;(('zIl9{Uwq(Ҁ% P69nu -8[a(Gw)\ۓy@A48ѳu/&w>7gB=u25e~Bl7=6)"L.>LHE$Xs0V:/]Ž!#}S꘍hl_`7HvȩJvXT7HQxc޴z08y"+[~u ZAz?fY n쁕g{o)?8@@q_!(T6텕hЈ,ٴ9Ímr\3{`R(pX43%脆{bu^yəYj3i)`65g3)QH[6̭Fo ǽLw3|1jBJs]'/'90h9@N2XaNveb<V(n#\S@-2>+C -~R@tt=hk )5*@iQW>~`J/%Mlw3.m~J`4H!Bl׆~pDFauZ: :24weOf =ݞ;+ 9jll4ѷ4G7\74v櫫o/?NTsX6 S2r-G}č! їK#}⒚\ˌ+ΈqguNo-'FUY]0-N.3&e`Sls(PKcER#R,74\ D)2ˍǯdb@yP>vc [1 L/%OnsH׮j= _*TU]sZ 4-+5J^huZ Y2]M"¦qRȶrX76 R ki{z)kv+JT4t)ge} 7Wxr3픹@f7,\LIP2FlcLLJ)!LUh֩\6ml e^&7 34o؁`هe8X3]Y ee ( FŌ HQBf|W('^Wy Wn_4FvF%p2g.d&ܱ1ڷVq\ZBsHb-h N͑;!`'IBi]bYX2_4 Mͳ^Lu듚Q"7?*}u. U:t >n`6Sm~Q#3k 82Hu6tm-+<5:1H;4MQOiA:wuLp_las8iݢ5aT!(> ֕GdfP=<)EEU(lz5糧_J|Z$@C-DxCy%mW6l.ŪV$&c/+D\Zur鞣w$cmZ yd8d~/W,níq[:q o^w}8?ؠ"qd3VWDS-[CQM9.4d pPW\ .L\)=mj'f"a BGZ(sfnuNy>xM{ml{KJ7)U%4V<#}lП"Î6kU,zpԥ s!#LE_W_a7cG"'2bWk2 ټ(9Rxo'T@HנX@D] bmr*{3I#B~W[i'+ 㔑T>et&LFD?w̨T7`$ΌdmȖ{] =ra7Jz4,ߥx?_'UD| # K'=JmK2`I`0#" 1Ҷg8zhZ rܻ\j;Qy}+c'@*G"Oy&V3=ښ\ԇr%A?vUy.J`|݃"CM!9#FʆW;vCɗ xiV;D^Aq_`,-I]dսqrK`LL^ifEh%W)%]{"ں0Y4;y w*Q 1<6 W 5 D~_;+Z))&%_i*p]Hw洠!A֍4oPHZ mHS'¨0\f-hނݙ4iN!S1L`oniIb>gЃD8JhZO3Ϙi ; cH4x@W|0^>ʱEj{nK5pz;t_~t Z +Ue8JՏ';__>׻,QE7]=ZWӀg{q#쯸_ୠ. j].Z1}U'MEN mGؠb^3x{U_[!U`2;t=(r0}4vz7Slgps$De FDO,5Ky,ʈL, Od4IK*PtOVz8ꬺҖ:,b% :@x/g/ j+oe`&:*Rnz9+Ij Ԉva@lgO`7`l.ߝ,mtvC*_הĨ}8\`?䠍\"K/BwH}mZ|fTL'U/H<Ty)Ϣ:kvsBn71PP bO-ZFmSTJsfU)Q|xZq#V{w5^`K@C>dBzv 8c0HYmUed$<^u7@RZq2YE,im` @zB+$. 1G-jj1ZojQy53nrTA\@ȍ6DlS[4];?DJ~H'̻-"{8FǶj?|t9%9YsVBڲ9׫S@\H0>\. NYEWuQ-GI\=GubraP/$ 9Qc[ B&I3H5!Vƴ<8kuZ~0oBrM6{L !9cHEVSDn;l tu.<h*5qޫe=]k޷ou(#Br ԂAG×y݀d Åpt?(^n5:Z'FZ:!Jo+vE"o}꺠R~J4>oꑌQ}5>4-rM,zʁpLN1{~WWu (|skpNʭ.$U% %B*7P^^4YQаKB[L rb^i: b2[|Τ}h-.!Ae,k)K VcȽW&w&Ѕ% W${р9稁mZP905L{Ɯ*=('Y1y;sJʭ*Zt<)ۣg̓x6_4$o\ frG 8<ã̓hN=g"O=MJLJ< {页Aa:^} dj*MJ[8n ^G(lߕ$+A#o;tf.A[p06c g\t$_Ju'=N/3G'B'.{a䈸3_[I6opEU23ɓ4*xENʯL!(Sd8[D~0P0TU#]:X,'I,TaZjA(_;N^u:vHOcx ` `1.2(DZpF_ýo1%Xa$r'UD54 HH IH63\tr3WeD^+L@!%Z ^l$T~ pd{pOb*Q<1(dL"85g 0w#:$HLt#]M% If_P; vwxӅQ֭5Ѫem*9(ҁ:/'D'L}$V]k^j6HXÝFW @ϣH>U.БŦ!(zيQŪMEd:fDrmmB@g [Y3kנa)po=j8@ Ch l*A_< H)C܉N庇|tu8cX7֦EBnF(vS\1=KF0sډ դx{iOd g-YwˠqI4*^qzLDُ&1rb4ܴ-b@rًnWk EGjd &}v\ 7;TPГT&"؀PF/61 WM3B HKh%醠g$˂ "݇߶@;XJoY訿Gnw) np/8SX!OiqȽT)caiힻm~B +b<<)""$_|U@|CͫEGa'`a wۢeX3Pee1R*[ni䑸Hy_ElI{ԽLq E#Ÿa_.K57FfǎI7ɑ2,k ~=4)d5L6E˗7)y(cT%SjA":ac쮀 ZYl2R혙9@V :U4Ï0X$Xlg4d!Z8os)ѫ<\AB3v|nBڜ͆·sB2 ܗf8 m!L`ze>.a7[Q=|1ϯekf Ӏ1ňѡc-n$QvA7 hӽzx*xhI}3ЋNkND A9ٽŝ,PF[@~3{3Adǃ8$yue2(f=0ȁ czp&>mp3 1ACtJDI>_O*M&h@Y,Es`@>C:<PBf2\ W9Se ^IJbrW*jg\nkrޏ_-&p쿴0V*jn]MP|3HhFH2)<@eXИTHT8$% =. $QHXeQid JZVe4;".л:;zq0? pS9o<]M0A~NI =f. ,Dc"(o@pt=EЭtlWdˤOf7')CpagLe/ϨCRx4(h>7t=$߱Z /ȕ[ܟ-F%lQQ[?eG^Z9OtJ)#4޼zd+_{݀(mMA]?{dF ]H/*0dnz̯KÞ{uŅlF1 z16K*h1 v)\>k HxLҍDʪbW #ZI184 ʨakkHBuywaS;9=-9ř,eeaO=.W7[&4k SDc6q" cn}i8SNCILWwM5 vB3kq?QWD 6.߰ s#iUy urɍ(! /.Ş42mĺ}[vh?y桔Aȡ`(3B=ô%7)ܗ9gVЈ[7,HX~kX) lzߐ5zP1GaC3X#fR0}i&v䌘*暠ޜ]Io "vMp4I&]:9.dm$С7Ot{:ih/Rd++;E8n#}OQpN=Ec%01o\\7&Th5p4TH* qYB pkwǘQ,U2T Ń 8"tk_,Pej3<G?b$$>.o%gM})(C"S&+{QxU<(2z%OY QZBbS+~68VnqSYXaP*.o׮dr%㹁b1Q .1SI?hﺩ>7z*)gUݾ[r#C91iſ1veCM|8S-k:{dAt 1@i{,j~\O9ȣ6"$v4ilSBĞ&+9nEyWh^^26T8U@`M.#č,{Q?] Q%"γMrX(>wJn1bK.t+F62Y"f?&ةt_C$!9RvRPTYcW]J]|JNxc~i!D̞d JE$$3K!Z@]inKnK2'ޡ$q 6pBޅEAzg±#LY_er{LSRRc!.$9iYmQ̘ Wę4hlh.` dtm(ieaJ & 1a>:?#7lwwVZ.k_dp8>hvLBW&[Jj[温s|}`kPh,=,xc!I}xt2Z{?Pak/dqy2#BZ7:GB8އ$jY ~;D [,͵ߑa#]MAnjn\^I6f Mi^Cƀܱ#"اZQ|SjUa'ha^" c]ȥ?]V\rG._.,L+"Q_W|H P"}ʣ $q@,Nvu)A7vj##Lsݾv1vNI<1왜8zTY? Q̗hω=8/Dϥ~Gu2~ǁN+a Qdrȋm?΋/5;=mfnMA`f !1=0;A>תKZ^P d~<˓U#[r*,eЪOE)1'CںEu:58ٯƳI\_Ǧ 4iYe 1YuηJD&M[dUcǝ50]$DGλdvƦ/(.[ނ]L?pdːGv~hc4՗H!={AxDl O5`+Fop-}EW+BV*όGqnK;u/s;Y{?yUlf>y7%FkhJaGe.Ym" r==9Nz<݌(ALe_x%\;`i$@3BP;3Muf!{ԉRk%z)&3$<wKѩgzD9ÝuOKS~vּ3c(e-/>:g̣s̈$ TVl,ez9ɒ0UzvBcͷbգlߚC*6U3bLaNcxKfb/PY`e=$u Z~~d{ZZ8 []ûVG}ؗ]Xl;o X#q䖞7HL h_ht$Ӌ:EotR1雛l Q@(4c? ~f] \=ڄ 'O3vsUF˜q|,qM#P~Gt<ѾpS뚠SB+L.֪"3@7|vFI#Z;qqpR /=Ҽw=fgl%+@8%Ula6o\2Ma+ȱ* S0rGeU{fɇzuCjq5 +>D-`<ǻQi-u}t$I LO)ɭڠݬl?em/{" $u=<\KmcB>RO[$xKkjFp P3hBC+#&"`?C7zuR2_"ҐqZ>?.MU_; 9FN1wR8)}N+`mJl[4WnkŹjƞVՎ6&O'a.YF,؄AWD( ^uNWk5W~!-U k4='}F8^BSZx⪺ rXjCu(BG$_ ɋ:\+y{G 5_MK48:I"+"L:> /lBI,nJT3}cQQ2lC߲/oNQ>'RkHSf}݃*AE'DؚCʌ*1}*U!v*,Zp pl̏݌?Ča`sdcK"0 !rEBT;Rk-k UK]#RTmly& m}mNjsHSsji mEwe&eKI %L wѬy=EǍ#*Wܜ-q qXX%7Vn U}_BSKkx6 <R, ׍ԷDllUKBΐRq|擊NHS(=qMS{|AZ gUrY; 9͸PeNO]p72tG`KNÚU('/>D"܄(ڣiKlK)tO n$^ Dy8!We4v{ʊEDٙ&(~$TɡíV'orA%b}$ndS5W,O, ԫm á0㳩a{ue|X+i<o_D7; Sx9e ukVX=Y)m/p̴ JjNt %kh:%"MSlA;.AqӉ:LKl8BaOImoK0Ys7zNxZav(]A;Ja:3ڵ"yUikT:~@~e|N~Ja_sHZYؽLc/CR0 ԴI{_n0S65/yw)[쒉b ~u˜:qI`mRr;:xXcwֳǸk2{Yjԗ5sh Fd& ü#y^ y/W}۹Go򄂹QzQOƤGOIfH+秵6{~TŴW-dOkr h"B#` -cY?t`_8/t?[x'\U|NqY\@gȒ?w3ɦ0,qeeV"f\6c WݾoԀuGN=vQ#%⣞Yͅ ܮᯨSRʾ&xu+=Q,b$@^+EtԝEK"}L FOܘ:;n%"lGGqڤR#[;N"Ȣ2j!X`vۉ3@Yڞ>j%D=4UV{C 6PT.V~fXH 5a8f%l#a PXH`½gV39,Y8;`wu! ykwl9_{M+Qy,++LNb# 1 7n}''_ - EjrSqI s>Ш'r.\dYzcl4p GEW0ɶI IN\[6 WgGhe*ЎKHЌ@ ([0ә8()3J%=L>nGd y>}GUٻSa_Jm/,h7fN+4d9l ,~9Sv!lPS33lU)jްyJD6rg BnS'ys ){iœGs+cW蠳N65+l59eI{̱Єgp g/xa^s ;96#{,>X|sq2S M &S9]5S *498=-ڕ29?XPv=d@LiM*8uj úù}7ϼsAȣ9}|dphki[LKҮU#+h~=: R`b5&#uV?Me:fsL0Lf8ِc 13rK ӵX瞟'B_̇RD 95څmxlcUrkj4Q&][reiP$H}>2MXru);K=aG9mEKKu þ 8p;{vVe({* _N9jVg?j#>͈7ZBF1ץt>}$@wMBCWm0=Y.yWlKz 5\nZq _\DxY@œA^ 4$v,lE鴡pv EH 7p_qOKt O;[˻Ji)5}b-%> w(&ڑ UՄlg]0D1ҴbI;b K=-igb|_*b&3unɵ**iDi?8[PahkgDnՓ}qǤ"q$UtMl! tq?_S}n te9aotQ]QkSzPeP -Ze&ƹILOxp|TEǷ-1dl\)~ +-HIdS`"E~7$nmR}I題9 oTjIڰ TY}i48."/+.P}Ve/c@1<)P"!s]h`sKB2U[!ƒ: r\{gfcsjWg0l 1MmD/}}}v# L2;Qem|o*m17g__9q-rj)4ܧt#IA ;};MlyEQ ph/}ցܦQ*4lΦ "A1XGO0(?%ˣ4 =GL/ȒQJ_c=NRצ:dGRG/ɡB=y W%좠nqǂz|fGteGRp@-euEnQ{@jmRg3@F. hUE -mud^}yF#lʫn Ĩܨ $@[1,2f+?`-daqt5r*P 2Ld:dsLC/gO<̟*`}.XJW fѕg7ts'̰) !~]3dk+zmpFIX`U[mǕv`ADZ'[.`{ěC-z_xj8 FÞIX >,֜* QDXP*hG/U.x%Fĺ͒lLvhOsNjߞu`YbՄ! l 0jc\v@IH_i?n칭5pf %AvR 3p,>7[b%pcW:H%J̞[I!uq >lykF `m]u@wRjShA \ a:r[TfI9S&k1@-2VB=0Id|ΰ%a1_'61^141`>-^2nI+hvR)ʚ8w"1~&j&*FbATEH{cK2BId3v)2gp;h2Vq{"1 4'pp">\< t DҐFo%O]dC.dxK˞mǺT=]vi1=rTi[.؅p79R <Ͷ7O#[=dl%&Oc~N, Pޟ0iQzY@B 1n1aY ;eLoe4>G߻x-y㒜Awv@Q7N6+? h סΈ)Y}Kk2>FD}CxkW@t"&h1cXW,R:`R,LAB|잎)ۥ߷[ U߹&m\%y< ]1wiIT#mM1,h;, ݇Sjm9$?[:C <;*!#}jdc6D c37zO^Asafe? -NF}9WRR،lll&udyuW[Ϯ6 BPd @DfEv&Z%qX=}~NR;Io[n[m[MM%IjG9ft}f <_LzWu[옘;. и S?[>j{wRX0 ym&hc{̶&FeI3F F?f!7jK[D8ԥ.{N[ZcRƭ.0[ Rd5BiPBusa9JH@.N?<i<Ú< -\%RQPBk1~/Р `3w˥wJg= ]TG !ڂEC4KX>a.h/!jqj >&PҶR=&ڹihJr`$d!ǂgHbAUNl~?ޜk׽z <ۓ8 -iU>,°M= <':(cu(N d{1ΘιV>)X[! 9\!zkx d zMɎ e|ݐsvf ݈d%&]7П~禄;i#- NuhK=y/UWu:z՞Ulw;f|Q=&y°]K?9`psp6CeP,(>:I8p<7P14zY{rɟ|xrPF1omiliGuV7>* 9ZMOx Mcvwq ď(M|Q3uS0H9<`j^Z{eb!nuxg9A-] ɝ6seq Bx8S{(Z^Lxj±'`%XbhZGf؞ 1tz)2hG ׯ=e:3o]7IDR Xco`găS7pFvm;"^h+NU KXIѲZrt`(?j-壧RjXF8[Ԡijc,f!2S8usIV'Nf4ń<;xR܂+b+U3$\fc 2 1g.;p!+ߛ$Z cQ"ճyGmo.)׊qƎt]۷ ~IcbkcG_][OS =+,V]"tD-)C,E)5{3M?(%Ъ3wv`hR^xA 廩FެS z-q9p!I||{BȽgkϐO:ʪS;v-E2WUF[4Ҧ4C$12-k!sBA<ͪ{)I2IUy`.#1/:6>z<:d!a`T+w;^b"S~J*[ j$Ѽ%}1#](`{3VA6z2b偂TCFĈ .H㪮oCM!qDz䀪n@Ho#p'ܠq`'+Ė]#u9ushœ}F!%[Oa{ܥ n g|y4Xh*M+W{X:+( S1{,y;ɼtYva?l:0UFB )[3j5 n4c^t: 8O>QGj:]6Y)\"Q;7',Cr6el7[P @{ \Sh4@eTk\KKk\:ʊBPVKJy2(w%7هJe&~}spXsUr5^gh#)8c%uIm$nesm+aq ڐ4fKH YK@p$[ cD$~.Yɚ!l-Q`/ D8H`I`M6&@*S|BgN\{4!c\w[\jRRJOl׆Į,yճ`0l'rX8D;<삲kͰ9s{fx;(v. &\EEfQ S ܣuSUo0MsrOЭca{" {|6bEÇ*TbiFmY"';O:r,\O:~|&@1v:Y`R6~}g _wA7[ לO[jC7fͿx,]!q=LߍKC߭BN:{#TΙ&/19=8H7r*G_Rn gBm.{prtXj`S{`'UIbGSZ 5X%z93/tVD̬+Fa= +`͎Րs1gCdWRpNmm~s%*l7bPfSW 0S@h.jWSgDÞ]-ГtƟ W|Ix9?!>S|el̇)-q9M,3c 'u3_ 4 MF!bDp5zglq43K X)PV>H쟕~#e<Z.*"P!d,.>%PB$ mwf2kTۏ&BTn #8aֺ:aނli^En]wkY;PI'\bYjj|׎A\$?h_'9DANl"3kv;Eyv=ѫ#98[wz\^S .b'Kc#q0EnW}q&8`u&gr}.66dT7Nb<+;F(Y~fT \{yR nI^*yMǏ J}m5I H+ebq<7}̃"we 1TdgvϽS ^n}_5LRhjaeU(Dt T!Ӱ|Hvh gEb|(~'WhՊYLˬzODN &W%rrw\4ķlQ_RbԅM/y71ɖ4n(k\p#!:# ʪqoJ|홳#M8( J yfز }mqĽ{-mNP= oSG.a?;ǡv#[e !j-tYհ5 ݎ/lq 5bXfِn>Hz$`aNH3u49V<#UԌɟF V0kIGZ}gc/9?GI{fbMͅ Z0hFim;[PLX<(P 4gRt H/\R#r& =vh;3Cm˨K"o-E8b" E z)hģl-ފ[=BhW@tڝ^i&VQ 3Wqj !9-]^7]%Q'];K@ ^QxrϮ'Y^d8ԙe˙D-F'iYk[jC 8 tb<~PH7:).eiKa&0vɺ٬(B!J' A`[h&zq}~c0`ϸar۟\;`͝7bwo; MKsXj=]XoNlPǹ%&U7J2D_D\PsQH 'aYA i;Mtk8^53Kvu/ڼ[t+5rũn(uY3}a|PZ>m{?޽onmqi($KkKpENŻđY:NJ䜕Hm9"8 #(|{R9 +#(l-~<ȳT8?`kGY RKifLܹ!ء(ŒGSIDX\S&*֮(w BgZzŧIڕd/,WI_ĎN @jy)Q%&A,;Pk8%`-hjElJHBӿ=Zz1/Q6Nd0{!oO 0z$9+@\|M_4^5 fkި? )b\X4m.%gh{h^'E3Em::BU.wlA<57ظ x0YcFŜ] @1X?FHCCLYޅWFh(bV' owa6I#Z)2v/#4Ѩ|7nIq?L)Q6SzSogBtsk3!/AzG~'*RhԦ*bo/bOwB.~|,QQ 4ѫ7 CEDǧFX#4D Z2)НWs\22yq9/C5%jƢĈ+Ӑ>oD2g2񔄽^CdPV:9|Bw^8-"?S&8žYUpER$*X?/2aLBMR52Ը%dNgO&(MOi9#ÜUKݺ0c&yj|qmԑgR C hat4(8qݰv,5jzLm8Ss]BB+^SEJXݧΰVv\Zl&t> |ODk'!2[dPi %]Q4Wסrz)-N_H*D*$Mߗŗs]z=l,h%=pe[^V߇#.l:K[ւw*Xurg"EV/9۹g"ZYrkH.y|(g ZpΙ*Yؾc"&T~hcVjd,{T<6tz<23kJ_ȫ-wWTHC`F&%'`G9eKrL'IG'y,ڋ>GÎ/EÒ:eQ΢pۻ؝%6Ƥl!݇LNP OSyqra1j{FFOgӽ!ϰA}Ȼ=WD';8|Vp1Y>6r\OQel -ܗE| sOkǥ5?o(a]MC8tU9+D:WzTs[UJG`$LH=)ϼWLZ6HC<8M[͝,sei#`aEחĥ]chF]gr-ߣåqCҚa#jQb(Je_T'>c'.63ι99& u[>BO@\+D[v])A)ݸ4=qJf y)WQۥ/@ )}B;XJDw4Q}P3Uq j"b[ O O 9.BPĈG^~H_GoKΆ?=W7<'IvWa9;뙙}DWzã;Wi'.IEC1WU|r#ҕcQY]b%jt3sZ+NRSx&% Mr`^hm4yVEJ&$pDƲ{Y.YR<[>͏mF+P姵gH>;D)n} 1}#7VEX#mdD"L'׉IUZhdJ;9]= DsCs] cAD;@Ǖ/qai9ʾ9 :hZE.zπ|w=ܛeS# ;PwxAH;a*~ x-=YrZ['_B}MyP(V 6͒싨4 SB]stbݶUJ_~` /莪Z_քG:|g|Kj>р@+Gc2a>Ҥ^{KtmZ2hݫSW rLeɝP5|3Ciٷ]d6MEAQgZ(.JS#,qsW]*}3; CBRh4Ļm'Ogyslפ7S4dJv#5l lЪ5m71kpŋyDeY NRqBʫDhy !SNLQ"NDt{0L'h`bއrLu;GP?-WۏTw++ E~]9:Mps"C' )ԓ5!=*T]#ʼ^xk&JovAzF:}q{<_dfQկx3u" 2 6?SY~qH!WMC+*+$L&-$WWjlvϨu-FFDmdvlZ.AB/#r# ^Q5Z\EP AouS<' o,v%u6>ŴנkG9C>} n7u2qÇ@|5LwD )8{N=oBnrB':/ǡރ3QH82uՠP9/>eecP{z/_MV?_ L}oz!_ 7–]0%sC ]8P<. z: g>x䵖*(^E:nV-%1Xũ, s;ỏ://fzzB?}K9B[GnR,7L:>Êv`zgv";mmKna9°{v HؖWGV3  Ek'G3 DV*<,{Ôlcgі?1W:X S^e'}{ x/g9C*z(BL-ܒieG @m9ӜwK d%7rC +8y2n''w3;*ݼ9BTsP9 ͰG 샏4pALatȵ*jҮU/OǦ7J\հOÁp 4ګ3uOPy{y 4@Ia?q(xr&MTmÕq[7n.cp$ fSřMVU4TB/Tt02F"5T= CMsI"A"ǽ?:Fl2TS/MHQ^LQlDKams\~Y$yN䪹tx(aޏD謭'&-fH="u[åHn ξe.FwRaK{#ٮF{jr1׃}2ޘ h:kOI#Z<  7Skx󪜀tqtv5 }=c ){_soװcԉP;Cf[~_&BF о-(Kً!$gM6;q NZ 6s~JWVfn Fx'awcWлUDż}guC¤ ;Nlh2KqV,u܆5fh6*si Id φ64pG8zy'wwzXUvՂidu14-N7J9odȩH:U(U4![M+"eqTSxwP}(Q֔@8FԼ > }ew"ڗzeNjV7T6+֌Յv|\Rʈ<esZjǺD2P4(6饳QTcǰf#xG}&h3> "KM]&'8ZJGh/:Ժhvf MJvR*A 'J14@$@&B[BЃx̫5٭bax \}S;_~ьͲEZ42qN}$b=HrE2^1ӤPj㔾G>0n12&Ck;Oz[\8W96m@JmFy׼{h8=v5 j'=H&Pf#၎]}H^=)fr=M@okDF_vc.kM8̯kT*Ƚ7TP[f{KR tĬnt)ѵFSGvɏ0m#\%X0"f\-[ELRQv+D>d[Ӥn;3˨.ThO[XשTwQ}D1 rp> z^+N2؇ʸICfC}oQ^2p`\Wz5 pG+K]e6X?K*r4W4mԻx*A?hdm(s|3J6Y\P(q(%SF^I{"hqE6 Y G<-y`}xhhǁXmW|0=xȪ,r9ﴪs={#e6^4xڿtHJP2pyȯh-O+}*o\((hV8ݏS_ | [Tݢ(&:'v'zި/–tUIspsٙdm-`hEgĆȣL)RC;Soa4١L +d8 `xlLIj HP VVdp;*, ZIm+?;b.#V6Hy=|Uj%%D$7Ll@(-}h6uf Cyv]\ǚXq "(z{8#HƎTӐЄquDlvdVHħC G-+CVQ2Y[/|n;UBD͍5 \NBHJ:-FKo_(~Iڽ'=fEoWܩsXYF.!fѓ C CYW yRb~!C_558._BDZ_FGÅ(OrSEl [,=MuϏЁTZ*vH߲͕},Pu<`l3 ˋ7}^ղf`U!FR7Ԏڂ("E:>y% th*px R7qK޾1ÃuS|#7sZ`{CR!+K|8ULʋT=0wA1# KrA7%(&ztk.x v[\Qc){ DGғ2- D@/]V_OoI";Ar}B⋌TӖKjSBtb]_v{{ߣ}`D隠F57rW-۫;,Ɏq_mok;!e:v$Ư=I\uׇhNdw >J".?"0M2!'w 1wضd4Z .1Tldd-/|C5Cj|(t3 ]vzj,'=:R>Kuzp+P'6:Vf/rї\3߫t~]fq׍TݡeKPN8~=o|PҮ2$Yܖ6m'ڳ;%5eCf+2]^ :*`#@h죷fDm.4lA$,tR#٤%τ!'&ER8ܓo.ed˚"F}|"j?UVUNHЅ=l?9r5pþ%?P.1AGyt h@=m yNBuӉB4lg?U--1bJ8'x/3ȔѴtD[/2 /4Ċ  WH ­>Bk~ e_/'fs'(02 7l'2ܟxs)z90fr4ށV]HJ} ΅K-{L5.$f;jC)tP`\InGo9|qM<~iMx+94]k G{|b3n9CU`@b'[lwT1I/<*³oEFSSh}^l5@Ipy̓"XÔ]aPdw9 {fk3,W~6ד1x6xtN)/U e6J9jɒ<7 Jw!(8V(]' XI PM}1"6Qwet1I_0{ۀ$"X&p'#SDz0xWpa) [\g y/~r;:.)6͗sjn( F`ѿPӱ. YȒȾ,XU/Km퐢gAdcK@NofK{GQTtPB ˾6t &F zW<΃0 ߻4t8j"7L|c2 >?cJN`EǎT{]&QG9"Us,D9rr^ZJ56OIfx *sz0gRiQ͛v^{5Vup -ޣmgN YR?&j.>E$^d+Qtˇl]oo94hxɸ,h^vF{'i.i[aַrBYEqɻ$yÐu2Cw4&bo䶕c;_au:)ټ&8BJ>S'dwMQhE17-&m|Ďg^n!,^ӂ`sN~# Ʌ̆ԬWx-vYxw#X8.\t0jғH^ԉ^엘+fk.I `оNj(dݛ˜oBMvNSJζ6 H1y P1!4x,S`oάKi^2p MY*@JR4wCeC ?Z7>/茴g w c-65Ǖ1:nQ^b%͉<.{,C%GT6E6JĆN˵dtV4;-"Y;f>>m`IEurO)M%JХF3Gʂ-*@\F6mT _ %pEynQ=! c,22!+L8n}?\Db >oT;b\lW*m wY(*ikh!:)tNJJ&| R9]#̉<5%baxOLslDRcC <~rx8=%J~bf?nKs#Ql~ Ȁ_7J(;ay odhe{gP,"\< 4ߗKhs۲u4<-:< Z3RH9|` i>RygBEwRif" x~gIמR#,KiX]^p6*f~!ɗM{"Wݙ*Nm^Xp.Zp?# iN]2'ilJAVLƊr2e毒6/\.wDHel}>-6PdΛB/}|ꪖD)B Ppɲ9`ٻ'T\qiaBCG]F׊bg,+ts/U8۩Ut¤?F_ZPV* ~ESuh|sZL۾AssU+v5CᖩwCJsNT.z Ghk7CP7y!HżAaКdaz (͘3;$ၚzn ![N;?CR! $8A{<.% .70 Q{rP/yQz;*qHMny_2V2?=DT7ѶL3O?S^54ƤL8~}4ڴ+TLy7G XY*Cu-R0aFFxy1d`g* zk*ؕKGVc,Z6}Z\}\yd,H"H>Ъxv͟uX^<%Q`^bbX,>s0̥%ulP( EïP #u!lW)OHd+`3e =}EKƌ:Z[/uJcy!9ثc{u4c"a .Q֑Wd|o3Į A 0>\;1 Hwmv>rFK,;.F`tZFNq?;M>y:e"_ 9Z?-cw ?{65dǔ]h8=65nL:e Դ(Kk*!IQ mbwhA]v(`w!Mu7z-CnY%^N@2$|@ehe@';)'1H]I'@ i cv,pzPU' X Cfi‰'v+:D9G"|dv'9E w/蹱'AF)Y9E?; M5t7lIJسe hur زi6[z t[^"ۖ_z[0 GNKJ8:1u PAHc#*$c9 h&ZOzC:a~wP-'?/SWiJm:uYM~pOhމ>`aSzLv'3JRۯ ܴwIbE9 <,"nGjSw cD&v~r:~W~SxBYa'J.Vf(,h\$JԺqlSOv݇z?pMr@c^//\Ǯ|,y"?[{WR6#6SZ sˁʮzߴ|_<0{-k_JIRh Y7Vֲut/,`z*K~J{[>+7ٻ+WM %qhQeF~mC5>2D2| ٍVn頂>һkfC{cp-V`D]dzeŶ?i&rL^Ul B׺<}p{$6^3l͘3q3jA5J3* ]pJQ˼<]Okňo:.<#}SR*nahJ24B9k?pn3CS-=`Eqfk"` ]Tvnvn&5uV 2WV]5q+;>I Pt, /36_\Xz?~@GRދhE#/*hujچ%QOQ܏_ꟈQQ~lcn\(ӕ]K0 X.ط1W2fzR 9 K&.N}l??AjdKNaJ'Nd iin99qHb)1%~NAP2J^;vBRxWʏ L3 /W>!g֙I]Wa=ͤq-5_uȄ#3 $}+r,,93Qi\jA7؀]pQ1tb~۱Pni߁14Gk_c*7J6Plm_7&:K5:uzb qu/'` cOF8xnF`~jUæPaٯ'SiBg_{4Sc@ *[ 5bQ9LaE 7wRDH7nVf87;E.FfgdZ+s!ҹaVwi1XX4pyE&z/Bh}Wʭ|Y\Z:(.~r$sdP1=3Zj?vLipL*8"S—G8τyyϴ+M{L&5C(9ofNH :m 8>V?O=[@VSנBm)dx伩 QN5=Q@\]qF{d&й>;X:0ĭz ݃0oLm7[1]R(uDahZu[\jAyrS \HVA7`F%>! I=jLP!xlgC3C= r><2ᖴ$tdZ@5p6r*_ }@yJyXhrABvv>Y"]5eL dB0[ [,(Pa4RPl?dt8k95Bfr'x(4ga -j I~֙ źhRX%~̄T0mV&9v:. jSyfLzTp-SbOܙwdS75ҙ/:p<~C MFpdΩ4 1Xsơsͭ=^L34؛,J~^.ݨcҙuj#F[@:PÌBJ1|[8+G㒗nf!kd(LoZ+Ifj߾۩ 3 1@Y덫mgiT|"c()~8,VHA<;bDwr|W=Z>NX> Q]-\ dCxqԀ)eOl.<хd@]ҝkdHwq g2]rDUpp&( g_oQۑ}"e!Zp~RFh>x){M!dݗ-꒕n~^pu^Sk~ETU͕Cq;l_<1vmAWq*onlcZ{9 ѶNչEvW@M8\Nhgǘ?5 Pb|gճi‘)]SJ|~Wb 3)=d$ge=^=kkU@~e7*^''S轖k;X+;PߎVг]YPةD(=QyN*™0`X5L;.J!rAߥvbtt}nҤY1Q{%ۭZC^FDwe>3,|X\<kםY\p&YH3fwi$;8k"cF|tbm7$|mŒE8ꚻl54.r5]c.o>?.)>#I&y(F`v(n9g%gS>mN[ Aӽ9k'߫\EuLBdj26}5+8a\VkzC9R}UL3%aBXS^2VR9D`s%,%~ EմSrڣ'}6+-2/9&tR׃LIXimc0\TUn̶["HHv 흇2 ʶWwaߜZOgˍr5~]!񦂷ҹ订6+u*h PH(y2eS b-=tR8s8D_4fԷudmnL9G_'bUHo8Vk@Hg68QOz1e{5wV% t$t⮸+ZjEyXz42ֽ›yޞTH}+t`~a<]>5'j4F4GNS[*eB/wD2USv hzc1i^S}g z & xsH[5`}H4]m`ۏKԈ:1.cʣ , ~$o,z?)( a)e  p$Q A.|:Ш.g1_ VPQF'zƿ W0zHqm+.Z=A3{6QVͥ]<r|vT׆j6(SN4z8hoe4nSq;GԂ}tuVyMJbBL s)H U-HW~ :C^ܹn-rn*}-=_JCB|=6l=R%B)f:1 a:+h"ut$qz˗fdwĵ`~*MP6,@oz -In',MdIdx*Q8=5$PqY\ϣ2R/[pT>[":1%|Vb5Zfζٓ RþYf^ Me !!iKɗscKCݮ2s (egC2Ma5s(6#z_tyZ%y=E":#{Pǔ,xgYjҐ5X8t Oك+`dU {"kPBݝr=6V)1&a{*! QW?]齹?cdp;`& -Kn{D1^ZBU+}~/oϑ eXSnYϗܲ*)!).{76Ysn[b:vOnOkKb$zBo6 cNC$͐{~mm V96ii9-]W oHGy3p^P{koF")8~,szL6 *K24:>}z,FxXJj$fx 9I2;?r0L:j\~z+7ξH08J 3˙%9URWy*?#q|Xz½ՙ`;[a}}N֨U iƁƌEFWiC(߹ RW oUmU: i,5uS4vO^ReqPl C5m.:K,gʰj'3fsp$_88#ҙȲPCYsPnDz?E pU**|6gv)/2ɉ&);%\gVÖfysDƺއr1Xc˧C(>Lf P f7o(&[ PF?;74NNۈ(<%j(V PN&"C e$r2%.1P&1Td<=5#"\_֨ior8*BF"5>BfKĮWZJD{?Qʏa 4EޡpUy3ftٲ& ] lrޱ}T5w+:a( нQ}oΨUMRɁ5D*_MH=hwBCeg]Ʈ[KSO% _ c YG Ƚ(O:/T-^ LuezGw̅t5N՘p~Ng`FB9ql@~*9C <>髉r\CUZ7DnCy8|i Л+A|p 5zp JS ևpN Q:@p 94NU=[v\*D>shl$\ܛ32v1:Ӹ@||mvuM.+QS4( 0cNrմ"#نO1900nYf:aE`OV%B8 lzԤODPI$;SPqεOog}(ͧ5"SI 1!2uFVe[岁տx|Atβ ?ޢ{o zNɴлKҤ *B߇.~2Lb47kN!˭o rd)nH!iSKύ,f bH/GZ>Lk]ѷ'k"<T>.Yw3^OƳkkZ "I5hJ~-B;xs4aI 1`MuXіG`u gRY\"G:¹Yv{&'m ^.0J^F5e4fÖõ3a;.`+`)DA@g_AzsWFm!Hu~~ GMG"m p}}٦g+&,$ =MPJH㛗<]в7WےK"-_m7R>T4?$ƱPbxS4kO䢪C{;Rmv!22BL|$Ǟ) ]o ]IY@řpY) Ojg;y:P5.j0^ҭڌЯmO_x %h$Dِ:;;VlD!%`<&PU/eaρR,30 rU,?O9f6ӲoڏW36m_:nEEkɺnJ$z.ґ*Phu0њw6Ͼ%2g_Zm2'V/D{]'3Wm-MP{a׹5/m_F,55kVXij6}2El*Y!bGR~xJ{ITMLQ!IusRن}8A}Xsn9$6TLO$ >xl9+k6)VR+~4 0>4X*;~F_? fM$.ѝמ'?T=^РWGuo.!#X }j8~7I<oȏɜű ]N9=wce8,<zNe[HEBg}x^§2"ՈIx&x9 d#э0|vA;% \.C)TWy;̕\CQ=|X }Ԛx}3 :4IŖUh[5uΡNN^}'S`RVQّpRd Se(᫋x(\u.hɊk 1Eq INr$jHR4B m Vښ;Ck:4Gbr Z'90s'rw^nQDtOhH){Bwi^L0bǐ~4;Ԉ[:+.OIkP"3Wౄ+ <;9Mh1L2&%A]QBO`Ŋ(Bn.*PVE]_o!GҘ0&4y}FDw*Y2]Yl !):M;w v t L&%C >#gM7!bP-UUNԓʟ$*[ LixW 1hBT:b͘eʄc"Bx|P~ nY^`?{\( N"zѾ'.o|*b)x͡aC!xÙ*O-|(PT-\ -n\ݺ3P (W^g v9-aŨE&.j$P:9-B] KG-qRV]H ~dx9,[dSi Ȕ|OŽup氢%P`FoN}ISv*'c7|ϲ_9rw7 R(<[JE[@ 7euu&ff> ܀E,jgiNrybdkH_@[jb W)~P;P,W<.ͲcT3 Cɔ+~}s<1c 2(DIͨu z KayH\J8=ҵRk K=ssN:nE)+\)$3t6)~}/d 7 YMu`C 3a~&T,="͊ZF(tɛѺ&N+"Rb5M~ڳqc7[r"M\1t*r f0)Z-&JZ\"06|o5(wȘ0U6@2Z)<1zv%{s-Q0lӥBsL;@Vs4Z"؜o'pI`n@z:Wo6fM+7㚽 =ݳwЈA”>K>)s^Ty݀A_l3^ iתƸ&T5I(gH M *hWay"w"; /Kظp%p5Q] ,iN l2 X%p} AP?T&obH=Sұ\.v?g"G~Dk>Liv o=T$븬ztzS<6,@Wgjljޙ ]#yn|#z${\Ñগg"65ݘ܎r\@UoDҭ۳;~ ڳӹ~k'] ұhXO|B23\B5WNJ!L?nY68!#!޳ւ*o !>kd:#KY^X˜ osk=՝M*9 $JI렶ӂHk3AlG'mzH~C~G/2W%#x,0+%5(kF0"\7b7ZNإtƸ_l/o6Nn,L1;)Wk A2nIRoo *Fa ڱ`=6݅務b8\#>'OW4̼h7!]0O񟮄w|ʀ'}ٜˑ95L2i\ȀH6| 1}-t/H',޹g$cDs,s*c`?B;]ؗئUheGǂ?X"$!>+z!}azR0xD! :r,JkulȠ}RѮ;k .->̀l(z-&JT DU LQP41UD;@ڊzB2-b23`[ #~+=b<<_: @i(X_M*z Ootʈ_h]n ѹamN6Υz&r0s7=͔m'+ϵItUbQ;Q`ott?"\j"M7ҪݏÌn:HRLX__OZ)vYMOr⮬-Booά2I5*/p ?r&=nуcD˺gi剱 ܰ 72U8*~QA)PlysՎqn (@,e6X#"^A]z"UՑuB!ɠc.pCSqSyHWg҈7jlпl&QW,ڝ[p=$a!rn$\D3ϸ2#fk@دvFg:2*F~Nd4sY#iU}>O WbZ0<Q zY0U᷋&;߽F" RW~j'XVb7Еr05MiWRfƤ'xtӭO/_UC($̱ѹktñ!:a(l[TU(W;>AT0;pV ϖ%[f2d.5Β?̘ѓ5eDVgJ: HIHk1wy$1idz@9]50AF𕸼N'h'ϤYu !`& Ng|\E TYpIhw-:;3:*|"؁F Cq[^{Rx>EsO1HB?2#u"Ʊ~@čg t<p~ ~wҩ0Cη@YP m+]:$= Jf67p\H@#~Lm~oQs+\!dB+.c ˭lgȚQ8gc}Nו%/|UpSw?s6(M`xI{k~zJQɖM󔴄+dm5_r@ЬQ/& ND l+|]3 n(g=ł'=5dvV$a6rpCK5S-fXzޣ"k>nV(`Q6Y(y}.$tD[Q͍)rxΞ{|佬?L&)gFZ˓?=U Q 9ZO[ #W֞b͝+;_Jg7_AyQ@XA\6'w0|9Y[yLG0I^,sK"FJd7AHA46 fuUn5(Ή8x-ͅ/Or6V-=VNJjd5_ 0&E@Fje ~9*`.`8J1Mw!TpMtU :9:v#}ABC=pK(Aᑉad~Z`mA r\ -+ͮ?YU CI+3ʔ̃ENSM #yy,g߂<$J?8i j`{6|~O!f#ɚ0!4QT9֡juE8W+Xb-ZhSN.F pGP?is{c:CSIt@2=Mj]3w#Ə׻/}2R壿VǷy!; VE;XAg*SYy&[ ^ 9/qATj.tHA,I%4{9nf"Vg4E8 sP;R `XX'(L0?X|l1DOjgKHD~%HŻ#k<_m`il>tgL{*̜hpzWy]KJ}pay>eg1(D(nTu q %>41 (ZƺZQV_@uB>†vV}!U4Y3W!찗6yL(>Ƽ$Q;/ 4;\Q]n>B >t]}4jqM-hPhoCQnh,Fi=3IZ3ҖNQJULpe .Z&82L !m)͹a|%rJ,>0`;H:gT|ps6Ğ`nfL|c=֕VrDDd:j;{?9%zG_mg#wF5u, R9Wf"¶p}2~ΐҘSbr*#4zYOCVA a۫goO}NkOBh>F6~q=0cCw?BE2*x6h'|\Sʙ5 Lم͹DTq]'Y͍-T\DcGAʦ!529DV?=٥T[nSuL`ÜuqfZ>o|y~pθl'@#.}x5Úwc8FUkv@o霋f}9ފi8 jL˵yvO$~ ijF[x`[]G9fdU;NJ|Le{iyǗø2lg r@lpHYa~ А[S8SMA.+2}MDdSB+<2hH&jBs&EzieWQ8FÐ ԩ<`)>3P~5}a tvүsU2'4-Z M>o(~52p,koeowM}Ej6;W kdzMNլX+6 fa?DҒ>p9:5|_{Ҕ3<Ȁ+O:ma{kEW-Y?wMUXypb_C8`WV5]cMy^z~ReZG7dEjάo@V;TwUOMEKOI,\1?Ĥ=$wVm8ddFG*R JOR4D^TƝ>Bn%rQ)#Ɔ4xst%QJԞތ:D qSFC ΤY hfЬm|h€/^M ?|x8Ga{E -sgwi -OQqH $sEy*67O'oC~ o->lh@1i`rƚB=!<~Qba@h -ZFh{h#SÍv U9,Jo>@La8>z /E">'̖"+qɝGڥc,0&svUZV1gR4Ȧ'yt43N:&[r o.uf9{_uHrfS24GyA9 *)7wC{gD=Xy~1k1]{~^h5(2u- !@y͆ Z@gNK1t$j`jfh9'Ie bSAI;l'"|!b kc\[1S/ o|fg Gww)C Nxh{+;ϙ:9 =l~♟; xhw_Oxwq^w. `7jF DR60uXE2W 0p?/;2mCLR=U[|qisQǓirJD ׎a &S'<!ʐ}W2`7|,`w1~YADk1^ZӾ;HkBXeS36K*m2e_Cs} 24x^}Ht$WK]%d鵨(_Kʅaˁ^N4M|9(?)$w';5ya,÷YUdB}2ڰd|Y1 9brMéopF]|]O/t,VDEҸlGLVZ'k6,Oi#(==60ϒJ9MBle]]:$s5 ]) +aҤ湜V$_cް9݁$AU vh>s'ʂx%Ry3"7|Js׹YK^*bX:.TsS~pPR=^1/E'D|}f?Pj aGy >Bj\tOۭ@ RʲDk{Wd3MAcY+ oSdz"8zOab a`Mo æ<:.q^)I]ó|94%+y?duf !DM5ί4o;C@>NK4K5tF:9ZՃ~ .Ye$}ߠU,TЎjB[pb`!^ &CxG@ ='gye)Ţ+Bc~_&M s3#Ғ`bŮ8"*:#9WW=_rPKR4= "e |Sqa̓Z/Os9?bh47"]ٷQl?f[BufK7+uY(a#aNbq*GTT aC͋`k:&D>Ӎ;A  {ql090EdUK 8>򛸭/)8WGrl+H3~@UHY)W /8*h2.V(3 xK𰖰2ЦBq{6f|-8E_̸XqGBD_txqoz3$/zïfWB}GB[*ydt'@ǜۆ3n 8xs- V9bVH|U_G)8)9͓nřj_T(ḱop爁i\}@&,\G 'kcrx0s ,kSgErK\[X}aCyU*1z[%$&8`K}>AAϸP6SZPJqFOsOs# qKQb|x'r}FIրzss UK_O+;2h^WdP"X~(P65ʮ9NL'"WSȊB}L{|`I%f@%e~ P<\6 ܲZ^T[vauY`6]y{V9㳵*'1^|yJ[&,5WCʪLB疁aR8O sȭ,*i`a|A@?P?OO3ᨧ:hsl4tIqZ&?N#H6G/-28y?X fH]QcF?k{ԋG/~Q.ǓlFL%A,'+yXN)"5ÚXhYoSLZkbO˃l7k+3=,_XYgawXE2s[,;VaoH sz'.!:$ jɄ~EgA< 'R-G[Da61=0}rcrqU9ǚ>Ƌ${lX^~VC!j߄5LiaۧQB1xKL6G"u(#"B) 0Bh~鹟[@@(cE ;vh7ے7=_ahnGF'GZDae`,MҸa F8p4]o3mjӳ+0_2oEރ& Fð'#ߢjHЧMQ0'l^Qh ˀL_5X̆eS4ޕ!s?8w3=Ij jsd*?[#AA(1Q/5d񅙠DncS5lt\I}',Sb;&ľHɚ ?k;e~y\4f.p[ W!7jNO1 #J˹>-HX۰jyrSЯ\lU6be,~*hҨghaI/xR_Zncv<x/amlS/cG0uokz G1,%R-QEe3ۯ: +ԥSM +lL-~n.k HJfaS61-#MQX{- DF5{0(a #uʴHL"VW}<6wO89U$ 3[ ٍp%D}bK9OH-3mM-utJgG=a EH s1%6ȃ5I+KsQcɚDe[tC$".NJ̣+2ѬHg_,x.Dy$H7Ei>sU+8t1KaPNnm'mюL Radrk:}j/8YOD ǦzǕEER%K+ m 69u-e'&3a\j$3Cd*l7Ca98q6?%ߴ7(Fk<%x'i"kA)\J@}KKcM |.))pY:3SX oOr(tAﰉjد$g=4.B9qYmilLS[njɆ6,*2Xn5KVM:+tq-ba.g1=.:XHSK7f7XHi䙂6 ne [3ݥOHH%|whr]p)|4^["Ύ7cAh`4 f54R@XvϯѪHܳݙ6]PY* lv?s" # 8o"ӵ!GAG5ah-8:皁t+JcxoI:UW1Pv*ֱ(-d%^;Nw@z G,ϖ6.fXV q 74ML^bGGd) YPɁTI!p*4P7^|gB%*/ PV1IK `~Npj.5-L^}B"Y]"!~[WsJ5`C^s+ aQ<s UѾx4t4sRjT[`6h4'rՙ3/#LPve|@ˋ=M6 -8Χt,%0AO` *"p^p&.ԜTқ K#Iyɯ(_w%2j`Vɗ0c.i'jӒ"9zMij A G7 7  4wSw'>X$!QCOq9//sJ)+8>s(K}8b?KC/jF&%;gNn^5k[Բ:3PP;4՞5=JLaVH4;1UrHM]Z{x Rv1m($=Z9\B0׵e0u 7o<8\!YIgW#0xk5zuXi Lŝ+!b* `TD~*z?MTfb/*^ ɥTn(ӑF2lj }u^miN_x6g^ wKgb M zhⶆߵ8.cP@d/fRd*#Q5a77TZpSRU yw Y|_UM}N~pX|q_6uبG>")m\GVHIXp'vwO. e^Ƶd4H.Z}4u ?3x!X]b;Vf եZ!O + I[Mǘ#0ͅl sS}b YF[Imɷ{+LHnlx_˖ y/#_NU#jQFK̯[U7k2a׸gNRk'F@)]͛#+'ꠙ.8筒zt;ጂlO+H>:?!7$JS/ *+5ݟő,N&<}S'!š$фR Bd; !|xr1`5þ,޳="j i^]{tOG;ވ }u9aHk|1YxfTM8+) tX6Npw7!ic,f^#/eq *K#n^!@f:tܞƾ Y//u O?J0翢%og(f%:sDz5y\[ťW:(r<2BS픸FI'*FlO ή~ɐ@&VimNTTwa~ĤMۥ zm1GehWWݪEXBHfR6 !Z lbfeR>z-.et-09FNQU'U!ك(WlnNE'whDjǂRͣr&]!'Sa Aމr*ľՔg6EI< ;g^dT~bҖ4yZ$3fj~[L0ܲ7w8F%Л-<2-hfk"|p Q@`*8o#]|"ouN-po- _A4@[wF?xmwPxCiAϰE{\ E@`rUjGq[ /0#7mukګsa*F\z{ּp߱Q EJ[vmZ҉n(Buq5<᮰8՞m+m>^\xy#˛tB%x |e=Y|nhP㒶{B-)O B|j,y) p啙@HNުvS_O^$p1kwC{G Tkg╈KOwh4Đq@Q`m;]9{DH wGZf51۰pC#\B9gP5p|+M# ƚ}n(CM1Ȫhl벌PZr85qN Lx&l![Kwt(1jћ'zx.?QedUϓ C~%&gOvx)ح] +F.;(xxl+ߩBSoa;/c8*#b`7@aoZf5LcшRPAeP% '+[RG9mhzֵa5cg&{ n2]ycRho 7DqAlh=lPSꒋdssg j ܾczxUIޒ=Wi^ϜFh^r8[F>}nEC/bl;AoFn0?z] N ydRV܇Z1BGGUF(oh 񚲧F9H= T!SQ2t{л3Re?#Η J)آExՙ`r*ų~o 'T.gg[ sQR͂%ly\y:X=UECJx;gIol7@'!(!M>>@ёݱyMʳv>\HyTōqHhpT~ p*4O5I]1@Q햊IuQۮ~}mXiRPNY~}o^7>9$H#򒛕`:e:L]V3d5RKCw9{Ih,`1SmLWKG!c}W4/;K_t}l2T[ytg2oIc5ySgFׁZz/ g 'bm8Ń <Bf*|&sOzW~M/-Y D Jz~q(+4,3Xq2̟_J`A9ü/G hqy8!NB\sT|1chv-dݓ`TjS~t?E1}c |t;TԢɥQx3*X8$!Yz)ǴW<*dQ c!(k$kzm>YY%8 MC0`e F63ʒ͍A5Be;`%=#x ENpx 9 uOAzǠ65+/Ce$Ȕ5e.s'Ԇ&Ij~)$F~P h$-ò+*-O)I;sS8y\(ӳlk"<)Y_E|##ȑRP67vTEx.[Ro!C5&ݫuvb}`$vaCˣ̨$߆VךcGkm=ED. mm~gn-khezZv4]%<1ď QetN##1{tHhbj@aCt_mbʭRIceOLqEWj+KOupxd!E")m؟Law3;d98M&Y!eY0`fMLuh<U:ӞZ4B-Ѷ, ܌Sb}U-MjXM3@?=Ȑ -+34Z~ܲeCq09P9G* &n8^hi&tjZ/P 7bb}^})5 Q)]W*Ҏfxs5$xr҆xQ,e9Zpfk@>J^?A!#rj>."}lHFHQ5~Ve"5- w+K3h0+0J Moёx cBzsxD7kz#RoDžgU2: |L>Jy2o%8oܝW62)W_ȳ, J`ܜjI(2v_J&[|#ʄP%Y ]7+'י`#^+d.(/~ϥD ϱ[`x͇q9p#RtDF(x ztي)4FM ͦAg.yS+##yYR"g "m 1 N 6 #AZU!=ɋ4[sb\uv֟A|VZuB2М]{9-Y)SNToD(I@Jk 5Vs!LR`KIG|\Ux` (P"`BlQݢK)]I մ'ÁSÍDr%J/,H˿K%4=]e:5W># naO\8ssmG 9F3t0@FJ̍^ofmRaQw8@33v:bB2+n`l,ȢC%ǿ'1gAP^_G(>Utw!GaYtW.PWrXlZy0ztpji(LͰGNŎVrG9A a|F<7) >Ȑ\D ڌP>QV'>wq ùm$cv2_]8CeW^PGԯE t./μzJb>o(Yf!?$!-RA)QoEa (;Ja@bj캂3tѰ?g #oҔ<.*s@^Is>jctm_l!p `e)[{3S^8(wΈh;X ϟAup嵗4iͬ]O;ˌ9-3 ON>ꌅ&%`g!wli)CVё = t-Cw/+"U1 l®\G[5 __6% @y-y8`2X_]8i!g~o}ܷU);.'+N,(cW]]@8ՈK ^AzǷ OTw1hq' NE=Kb_V XqC]1Xzׇ@cE}+f)'e*#@'SݞϕCANj)a%<B t`#T,1ˢ~H̎7]2qbbp? v/"mc :^U;kpi0l亻Q3# @M/aP\0lTI=Y kL N@Gq&g1m4gX[K !F@[/[tLS^(2Qʛᮕ67?S=ۏC)rfF͜#ӻ(c⑻qd& M&NXO%Amk.5R#x&_@}`sRr/oGoGdC݂C`TGa }*` 6Lr d'~hc2kahz.QɅ2|Y u,ar<ୀ{҃MP9yKp8ޟQUT1=L(x]cQۛ1 _ZvǽKD-T-ge`'`9rz"0}VَHsqN!-[Y؃K8Vk uFw||bK^/-[˪lmܚo*E_S]}8=2 gGmۜ}е!c2BPx,uQA_U38Zx^uZiBHȣ2֙;p <Dx1H:ޱ*D|X.yAUTqXVr0@eIWЋl*c"JQ4JZu2vL= `x^V!kE=~;. \4rJDP}x se47 ĵέ|U9L=[p<8!&\޴2QmR*r^:YpĴT%UbEt6pYzD8ZY.w"P"^s)]1)qۘPKU_C^IJ*!0oTܜw,?`z{{f@y3T/Y-HCmH1=FG f|oiڿ<P `(q yj#S2XaDI\⿾ i 7dIت/3bޓaNŮ@Րx"co̎/mG5~"1C8'ۚ e-pǽ ߎ0ZK5Mv#c, iR+f/;j|פa$HQԣlr|uy~[{!?lHh"VJuӋO*CupnZl&Iځ #{yf? nS==!r1=XdCJfv5,5hcw43ɸ)$@U!)*!GN2f(HLDC pEu,EKGۤ4 -qqjW&;J/$]ʠW˷=m~n. M".t;TRC gxHϑXqOwv;+m3Gޡ'IxZa T1)LW GJϢeT2Eo~]+&0}zjPsKCXC>lgS#a嫧rCε$P;`y%;` HtvIe P=s@$-ܼaHMBa@"D!ԗ'^mWrk=wu i}Ly& f7-bتyœQ+Wqh5o3["S&z nX9`%B Z5.GE,}*N1^,aXfL?ئl˧go1]E@vOOe􌺏HDySZAZY -=D:\ͨDm>Pc8 *9-UB"M>5w=VIbWfhVVX$+uqhAR pp di%~vL m{kZ6wV}M|0 U-#r}@kw2W}VE`y+gE dp7C\;Lk6eJ/fb9"UnҌbj ;ϻٽY9zhlV'D"| k"MTlsrlUteo~W~=?y%?֥ܧ|gYWi ?@*H?S[M=.dIpI?&ɺ>`nR:sWY`'`npXqśqv\1M]nvGC(_Fׄ*ǁ*2!.ڂ˭gIqv{̱?l`! guZlFc ]q;ۨXLVc+ \\k}0z^ΓUۛ}tzXX|.Cwz9J.aSc<ռ2UźĐ^b_pķW.yG3pwn\乨 QMB;ѾHB> =I:888^D!`16oR,@i5XaM卡5_y;&%yޘ~7GB5dx djaQ }Bdk:z+RHHX~Ƶ칇U(Γ^2 2&OPCLȪXT'[ӟU)=U*EtI6 hde<"ҵ6ڏ_خ c>}ӑO=O)h4k8 Ǖvn6L^})pFUO'v)NJG$A'Qelâ_v}weP绗ZɝZ+u1b!4Y,V^ǔj߅(HqȈ5FnPZsL瀇;d,U 1L- t ŚP.gHd?`< V2vKeؘtR>[.nv=nɯ. 3:wfӁшCVꤪ_5AR߷5D$[UI蕿ClY>,_ہpJA[&b%._K4eSg$Na5ͶC&M ÂO^. >g^=aQ4[Hy ĒrH#3X T&-Il~շƮ`Z)bK~;0!y|4c&(Q;boU7e VjϺP%1^2I>}+0< Kt7ƃMUe*eJ\:֗rT)k i/pp(g~q?da.!(כomPQ C:V#z?eO\8rJD|FMy i۵-7T~[ēS)!"\k%k6}וc}(>|%|sZރP"}e $3UEb5uo-^c%bIm6֟^CW1"%i ܁H8W]%|+Gk `it1Ws<@xXhٲi#=a>X,:F>HH_vFD'D07Cȱ* #`[,-)$dpu/r4/Hgri3mrd^EX+l}EmMC1ĩq]/W>һ?U PSFuϽ]J{v WUJƟ! 2ウY_42tze)N}oy\ZT4/Kq{8\k.% ٩kgy)=Y!uݒio}K˩҄#Г[9s%߆G<-\B9dBƂf=e.}27~)LDiI&}_h %k]KX!-b1g+]PIڛNrT%ɊK!?ۭ00P ӑ{RA3j-}.`BUB)AT3]zǔ6s3]}~ L!Ļёm̟C֘cVb2yo_8gedB3mW=e4׀opq5rҶ>IGBoB7E 1$~K972| K}W@40״uAzƠL9nEgx7*Bp`à6e'?[H=\͙AѠ |<[wCFK91Ú) Ze@aQ֞7iKN?W~ex!0w)Ô6/ծجKoußŬAU{0Z+TiwsZ#<6ƚRr~K|R7a6'Yu֍勥R{>Mve)X{~vO6˝c9#->IZ5]Fϵ0s+fT]F*U?ms=f3VYן[ n[m dPKiV6Gg<  I4rRM!S#ivg ]p=> bG-{GQƪ"gҳ>Ѧt5~_;SB~L[99ӓ⳯#vfY[Z3prB1u!_?FH3y>{ud}/01_3ssKLؒхq+a(DnYo>B'o1P5iB$K30vH%>G)Yț5aL³ٝRشddaEkJVBVl8vka۠Zt# OJ:9TXxڮON~uףRm$O};?@a9%PVaV`Ea4y j TY ˫eY=$4]S~_T)OSJ]_1 n}ɏnV0 k 6- &E83)- .FڽT|sg?n/|HtM-~e)尉 KWÖK z"6Vt)G ZwbhFX \Qu4QJUwLdݽeulJI!wWv4GS>~5b7.WnnfJͮ5>&R :B(֔=`h@5叽g)B Ŵ$>l#8ZB_GyVob QgTEiBR|JAGR.\iK|d)D9Or]H>մRR/"ъNԩI xs?y3Ư/>T`%פ') Ecy27o$?h;O̤ ֿ3_ |:w~D]C}nzz0gQe:‹Yen})V Y)\QK7#Z`Ч/gcz͛T:YuK:XHʹsNxr͉8oZΰDC0CmOZ Y-Zrh'dz]P]8M=(嚢AF?5Jr5QN% l諒%+ʙ=+і* %=8+M$IM0_4e@[2DMb6OՋ]ұ6f`j !逡e$ Q[nx4;EXf`/Ѐ.uYS@ 0 X&^R;L9,LzfWvk<=t9&AдZM*0KgbDSl)eͺek$ߴCq=,tQaXwHŃo79E$cٜ"!Exy"SDmYe%9.I8YM\`JM#gKE;N?k~BO3uzxi#~"tOk0#}7@\EsV] lHw'_JLl ꢞ s(R*0ru>E^AyC3^_q Ռ ιXyEŠśNS&AgG ^nQY'` |K I"p /(ezeY I#[8*v[/ ϶F68+=}<S^xj+,}ӆ &Wo:zx{-NlZCD +WXT_9 r(ͧm!"?Rδw)r:sKԺfW&FBfsRW2Ď~zxqg\X(VېLH4dm@3}k$_Y,٘ \KRcw8.~y޻T>0.v2Z~.5gJ078[<{c\jԺo3n}D>i *_5c ckY/+ c[y_sa*A 8s.kxౢ֭ }om=Y^N j"dF}z4d\`p))Kިq)V)QU_v2=GLm•Jbl[b:9Έv_A!>kdԱ ]ߵn)7TuTa9J_4zq(=vlk OtWT!/neSz,Ip$g Is >AO<6Jx)X3HGԋVpPx\8Pm݁F`DU0i,B1䮨9NjcRi~LGFDleM)Jijr4O !Vzu mDG>#4+3]ޘ"kpK݁J޼!;"+H8w9~IFiz("id1,.(B4O7=SyUmRF&)bu K'<ɔlyod&#/hjrox8#m%!O22۴>ㅲ r;24L]g[C:Q:sLy)eaM]ɠ-pd=.$[ܹ)\25J٬093Mlo/צ(B #YvۢkYNs% tܻYQrh҆ νM6X.<@#R}Vlu!q 9M^=ƋGGq<-|Vl"̃wM63ۗ"eMTV[Ae-8XsNGE&.aE.sِ8ʋcȒyk+8jgLZ*b)$K7UةSÝV՚!CY6J:A6{!w;JJ(lɲOGClWա0zcpnME]F*GwcTt<ؔR)d%B~{4ʇbe$;Y%O\vsIe~+^ g,\Bz{JCεQkQOP!]#A`58 ЁTGӑ :)pz\,vgVjx0 U樢t j|R-z|b'VrMbx9NJfq&U+ 3pV8㛁vn7کx/讟ai5'4uOԨ;= :n /.K3z?Z /.p//|QfYqpIG/PS>NhҖJ({|z+'U+Qs juê 8CdSMS .ؕqv;o w;J|e*! Z@*=:N޽30avw݉Qy]L[;JkF/osv@jz,`5^ {7f ۺ]d-`{ov~HFq2^ Jz5|df|ύN搪biҨ 7&+n1t 4h?jtR7nPaPl!}N ud*"2 鷤BT63-ۺf ^4p|tg=TD֓x,62 >cGR.fī>fN l+{lrB9MB{|INCm{GN rG9!aHX*Á iD$ KXewh)K$n ="d@he(Z}+b7), ȁh0+?I_{o-_n$ tZe!h( V^p^JRt-t\Fjg+Z=q=&qa86 Bxe|<{6f̿{s#PX+]{v%$hf>xXeHR,eރz)wφ[K1i)}TRX: U tl,kթ(@>tByau@=:vbk%T>VU5= w0 &I#ˋ֖D BV?@m}}RB>һ)5yZ n^#Fi:%}8rf(P1ywΈC*&0'|e4ةa*1: ,FwaɫѰAKl_l`N&aʾB #5Y@ DCq3 =jnL_2E@Oۊ+ɔl{;+FlHZ/"~o/Va{B MI.z?sWO<^8 %F H]pÁ\5{x6)4Wck̚d?>'HYFL5>cT75Wb/$qidI!j[H1jALG4j-lf¶\[R B.(;`]t` 6(($NRm2WpP\m;˿-p8TliiQ?pQ`@cgt^將|1P1Ɗh6*xsTh!r_ 56Mmȅ!.G2h8ll8Wry՟f$C6adž9bYuk IRSjVsw'w\WpmiOtOJ __ `ٗ7`-7gۉ "QYpyxr^adYV>^2[*=V5ݦ!eVM zwuC02O؞.s+rR }~yp+٬iQg%9޾?>u-bc$u٪Q \ht_R:r4%F)EyI!Uhh%?@2՗kۮ 2 vKz*0ɬ7W^ә^~ZbxXA~MZ}TZJI*Xsָ:Th"w'R$ۜ}oQ>DB;Fk}ckه-TԾ6ŶG￉G[)GH솔/԰R p w+8&”y뉢 s0QP5X1`D3Nlyo;z}k[k6'v|T/ Ƒ+ZSkXOaz! \_lp:ѥK>iV1V[7 N XByb1xzdeAPQ^ &?dL\q@&}h6V-Ԅ8^1*%p9꧍[~V 4Tu©/\<4~V|@[t;RtwTDȘaz+{%'эصf?-A6jq_\.aw&+U yžڋ6-e.#sgeoNb& %BK;REFg|u-]w!OŒjjz{78Y¢(orw,I.e3^6`)bi߶4Oꅔ9a<=\Z576AVa h(uqHOQ9m'&[NٶrSjB%Ň3*7Qf'ڰ3k͔SQdH-3cZ Vm992*wRHLac6$?W $;A%O[=P/ rq˦A,q6[7u |lto̻z{\MeJF"k߾rvET=Ml3=WqT/Hg( `|=a؋¡OJﳟSh$UeTDT5MwE*qod2pwH:j ,#pbB0u9?,$Z W@.rD{x U-D 7N0g5k]-_3"SR?P+VA ׆aU+flV '঵hLW1x~R:- qɩH:ZV%6|Z8C~f 'IDVcgR_bQ$],ɥk͊ (qޭKǼUՙSiMVӧR}i`d-˴ł fO|ۊ5pT*tRNY _ܠOH\ WrdEt|ls;j梕gfU @ē?b:2:fmM * W 4㑋~r z'c!|ø'. =rb"TP;1zg0y"~R1D=NX`[|ȪD' 灑?,e$w/\ZCOsb3R l>m]Bf B<&+w1%߳FM#^ѵdo(=$pT/!;[=xwC# C `Übg.sőF,9|X,ד= 0J0] .rB1I5.))3-83FWGZ/NG9W!j G{ё_ UZyc̓cx1Oh1SP)¬;զaԥ_X)zwo"8Di^gy5Lj.l)qQL|LoH -?{_ נE%S&sf9پm47өɥft\g|fA]-flNZ1^أN.Xu萊~@RPuL5\#wPdo9*8.-]6.LFK`}׹*%B;UWZ9ΝxUcëf񉫰:ͪ|ɐ-TӔo m޼ұeO܍ 0vZ~9d]vrGj7"-#zZS9voΖ%O{9͓>~> ld8vخo^6S]]noK;)fc™JN62\";Å%`Aܩ kQ@kݜ]F|jd]7HJzt۹:Q>"Lxu8Li]I`8TB4*ҳc0+?31UPt,5ױ3*a6s zҳm:*PYO?hs![BCIo/5A~*Lx5'Pî8R֘e;P=wZKDu0/S+Y‘djĕqTB܂?~{:-\bv4ЉjNU*f^RrEt Kb^6R$.Em#:DmJ_ap4z2]R2X뱭yĪfSc7SӘ0+ʈM(c-`vVW4\~(gY1܃+yV7v~GAZུڍ^rW=̶H!*=DfZ#7$ {USy/$[kU TPT[t\adcu *= ⤆Fw7NØg)."VuX_`{h)mښ_|ͲKRx_9Y|tKI&܅0JžR\3Refsݹ, <`$+1y៉a}[i̲r9lE/1>frw tڝYA  VU*dx3~5Uaf12Q#% ˳9Ӎl\=&!Y=W7n~Uڔ50#ҎGK#^\طȢT]Un}MZ}3ԇBEʖΛSk |hz؞yITJiyG.gu#!_0L鯗훊LLqK|7gZp\8(. OE lJ%R &zMhY rȩȩE+ ec/i ~efz#7*mZoZF;RoWҨC;G2o98bR°oeo=ʪJ>O_FS3ƒqGw9&k 81s i0OWGVӐ8m'NƒM|nڦ Kb%ʊNB{AR6MR)Psb0|y$r>z|Txo(f]iS%]ɪy]9['? 9O^@I4vx1>,dDQ]'cTA@Y&جQf~,Q): *tul J^ӤB岤L#-0^ <51ǔ{+S4yV;-"0~6JYgou8y'CėFȪG +en.>A Ƞ~e!b0TѲמ/ʜpA@*gzNL9,=li.0M2f?|RSd^[i j/F;t/ַ Ro>j^߹-tP'pJsW: ha GϐAsA:!&xp"3;m~XcL UR\=5s%*r7Ds**9ڄ0>|h1ԗf0^W<^Y@)YfS[V[K& H}I_&@g-,o*'93`xMLgAaגڲӘq(#̤r¾Rɤ+Q*"}w46.onTYnN9Yb:.J<;ؠX9˲Kon29aEqU[\EY!x f괠&tHH պd(G3qgDP'0V*)ܨ ٛwb!?ƝU Hh#1أd; X[3+k嬼{sP* n*5-NhB^>\!4 &y1# _e"b kSI W\],SS5~z@#:h]oB:O$qvRk\G<04޿LKmUǭ&rlJ"Dg\5[c)NkWhFeX+7 U%efKFVN+Dlo(El^ xvJqa=(6( W(@gߜ)Dw' Ba[fL]AW~PlyB9wk"JlEڊ-ҲezJ";wT6_՘7W+MOitPW'+3HP1K8k~àM(a=>&%2jx P^U¥ATŴri*ln#O~XOҲ3V]>B|+1M0q(I Aw}7'c%ȏ9)zng@6\=Ah U>4>JS&dcj3GC3gSO2 k~SV7wڔ&ϭ@;PW"?nEq~<:mMh@>o׿E~MK~sn~,5||-K6s/=I>vҭnKsV2O1IZo&,kb.e@==n<2OU] +h$tDJmKmeu R ژ+c3_3dM &UPIkܡ`d֙`~F B,$z{Y},;>oև8aͮi *V/ b2.u XЗSh9o^c<琽?DΎ3z`"">|uA&Ze*H9kG qB0yn$uڞfg}zz{韝[27늇 y&jd i5Ȳw C&H yPnC$nPN3Xށ4Uɯ?6_rvjр7ɜ:8<0}9vqYk1ߌlZ9>[ @)6 ~_頂4%2pQ9 Ta)t=pqv랲D٘&ܚlTr==fW}>ݎdP#"ixhv(Ʈc%ԐjK4䃖am(tG<ԯJ-80< @w9KM0=ܔ;e'k"}NT4C'A<>x]aXBˬ%:z;]= dFH/< lx /)iԮ; p jKmlU.Q |'PLϓp[`k=bj"!͋p;le0ͅD$Շɐ֜wA!+23 @'zZgvL )թRC+\|6o; 8㧛$/݉}1 ~?O5} *2 \bٳAЁmLV̷oߣnpJo8 kMs8{?Y^w2qu^l챂Aql?ڰ\'`UG;}-Ȇlx9$)k j@əos4:u' mvB[ dACڛ-*U8?EM[NI9ŦTa |J d/bRWkOAmCJp i ˣ= 44ȡDeי }~G}mes2K }nDan89Y m ?"-N`15cSIJL6Ua_ ӊѷlcݢoq^ ~t(7@Bpur$RD߿ϓt$ o~q5Ttm:Wt9i,YbHVCݳp;Vj3R?po֥ /f};wc@YGҸR%Ѻ&/)Jv+^jT'o?V@BhˀƸ ]$߆!nBٖ8OAr2M^7! qTli_<ޥ戺|*ެHTvɇ\$]'6bvA-,&>rAIe3n,o[tikryGڂa9QEH&IʚX3mu`fl~!Y^CR*jZ{ ;h=w:exlK&"^Upni.fb8璣u]Q)'y:},۹<qx0@UJVK۪V'mri f+1qnSrr96/(Nh#7%ut>DtyK* ]Scn_'٣Ԭ-8<j9bS@Jul"%"7O#Md!_+lSA /O+ĭkYPtNZm^~sǾx+&4/y,D =,~Ar@ϭrm2Zw!#;ecTA4qbiF{ \?`},S)XyqԶc '"P03V<5/%U53 m.TsN}3yMURŮl_Ѹwe~}QSt i%>t]bp+/򶑫&dT9d-ƯFC>U`I\V(Of"A:[8{ 1â?`G6|s]=(ɾHǛg7n Q+KH/f#c@@jH;LM=\c*AkîBt=$ +`~J.݊i?ՙ{cս W Z &p fl|'O <[vuK)C/Hb L5^-vr=}<Պr[rsL;C*nWGmJlD7t*6 YjC~-ޥ\Ա5};yţHQ)$GؔR[j t6DɃt 48gנ;G雫o4q̙-!IX?z~@|6mw+NءP4CS\d=T?PnO?ݼ!)f SBٓ&fy ta`/51a;س/1:a蘿NNOΟ~ő+K\RX'ҋ%.*=iV+;[DNG.Y&oDxk6̏&(I\D>YR!%`8qv'܏<ՇcÒY.])m?JDJF^{o M;^' #<,?W/P#2WTJ:ƒ` ]WM`$CV Zazfks9 Bٷt9`+6 -oB:D.{Ƙ.stf:^:|*9uG+18e?/;oQғ_րZ_A-fb˽ؾF#/yoH<.Ŷ'M!~JÉ +ZN{"Kn)[_\Uwpk}rF9n 9'D0(Nw)=Yt:oʝHr! |qm0XI4ʬC@ȴ@jMZ MQ. ?-aMzt{e a>Oջ)[#Cr{7qkrC6 2Lmxu C5.:k(Kj3@%P!BspФ5v9}_Y4wtCnP_VQdaྊ4"bgWnRn   ]-A]e+ˑMOWdN۪ Gm SjDq7ccZܴnԴt[^㒳J{c)(C J`PSH|qb"[a_Xqg^Uyh/:\htҤPP7ӳ';Po wk'AwN8Hi1axs<#[.4vu7.S1/g:Jf;XXg+%kkXaRrI*ɿ; ?FI 'EIEJ;ʼOH̆~!F,"/X/LhsWs<<AB qSpvB$cM3X-;sVS0רt$9næ;ZfVuvd[fx KN9w?yRb=<\ #aM ޷)Dg.aZO/OݵOx\qta.[M|$tra"GF~ggDzU9-b;FU%Q&ېBdRk127k9/òkUTh`Lz:> })S%|ڿS#gN e*Ó2gN3}U|c&&8 !\!ª2RQW*' ,hYg8GC%{eNLANgZ q1I&7ҙWM@/Dڽf[1F6kQIR&VJ*aM&^`~<:͒lC^}{ :.]k뫥{)7 ("- 5p=}7^M]$ڤLH{=xG' B~nUv7܆hH[4Sunɤ&Դ&lXt،SKG5>̚~cp Ldfp,lp hLPrO͵]s`vjux;?=G&P6o$m)v-ӻ#|dH~a#tnҹpHi 9&˫eg+y VFɛ@^#I]mLO\$G3Z$?M" PӁ;3{flG cM$9Y+vaU pRjOV XBHWUƬKW`hO‘nF0D\|H!K}!7JcKR9p@82[,i(R! AW"u̿a6\*.*/f'8!CdJctC -ykslBL )SJJ@I8|[y"W&3}AO;YvIBw"W9?䒕Hc_q=lP A"ڦo]N?/ a RՠP?ɍUa4 4gꁰ.zA"07gH^n?Lɘ'[$ ##z8ct #3 Wv|.d yoëp&}0>o|e^# Sn|_)Eq{Utb6^X"XcvF6znj+1Cdgu|~1 B 1P_/p?FA'͢}nt8)q4zBc@orK91 sRÎ۟1bb׊lƒo)WrTX[_?(3q߃:]g];%KX3% cZcYxrdϹIWk€$ ݵ W K SjΥ H(/@! <7\Y@ zg;2'ߜCAgr")+G?HQ[>w0`84; PV@M!%_.J|+ x^jLqA\P2g#3#X 4k&l('Oj~P|x ~3a.Qז-lU/QK)mAO)f>н 4r63Or>p;٠r9Zyw#8:\<%(ȘזP Bj6Q0-*(=)f@v* "c&W, u37|/{Za'q?v7(q Qg<=VwTMtaS{_r*%ʦ.<8s<5o:XJ* H%8˶ 0Bi^^ zOtu,I2\mܳ㽿gIF$zXoԭ2Y &{Ǻ3܌xE1a^N،MMv jnox>`qۀLc&S#SJ1xbtz6!tXS< Qž˪y#MQݽ)Y$zFPKQs ֗.=Ws<bo2TDӡd =-ÿaUh" v]H^~iyDP%bQ!HGQvAFkٛ wMп }"i% lMC#JL[S;DIu8}f=b;W= ̌8Se\[MR4s᪙zzhgt[&x\!x똞uKOTN <?N:"ɿR+ c~)pHA K{'GS_y#yUj[3t"L UCp]짓a0ŕ\7׿~AZTa>1[~7CG1+X!>rQR{8 7[ y\Tҩl]Ϸrjf{ *dՠNmVP+kS!"N$vp/c l8LE 1do+5y{. CF&&[7q\&g# Iy9@>C9;EPKd8\H:=9dFDvkwڻ5I?(K}%[z1>"C3mP 0#8%Bl\Ho]]A-}'NǴۿXu*熩Թ`ʴ"]);'BEbsX((WU<ޱ2 ݀*avl摻}>詎=IVĄQsW%uB?;7\d.L9 ,0 miYnh^3/T&4>kaӀ_ӧ;W;D%w(t饼9Z\`M;$]olzc#JS;p +̔ݷf zJj #bꐯj +~7o/r1 {M]EoAZ;BPvv41v}}'p7@b i1ɞ`Rw?9J?KmVx}c%OO>/LDBc8Rs4kKOqpޮl0IF@1?LXP`Q$.D GiiDJ~βGAARyNTi ǑTL_vvЉ\-I#vbM>%> w0ű\ J6X"- >uhn&C+3yulk_R^~P0X ^ͮ1Y|өvGh0t߹sTLA~jYqwS:(Ŏ6^zҐ!Y$" *oR$po\V[p0^ܖ,l#]"!4+h74mjGڧ*t{ס nRkaSx?}2Pu H&7 Q 1ҾFWG.Lǚ*R=߶\0!7b/lœ k]z:']q|lы3ެM{%gLLUCu[rz5 };9tP,-.SOzK*O!5A̯i˽1)@}E#]O95EuhžBȶH]SR^:' roZ3h ^v7>y>DiN;-}b9 mI!NV{sYᠭBViY=V]TS، \ҍ`#pJ?r?ʳvhe7 5݇pS2j}k1RF>;Ll`,0S.D0?NcMWί!< *Qnr嗮_fHXB)]<ϫ"?9vlCPM:pf8P d"}K =q Q@M\ hfWUDB4P>nA6.`GG~-eeғ!FԦ p3ll1 q̰I(Ͱ_%VLH ;F}+W>ӕ=T ^]n2 xCVQ:$,mP\RfkmYVlP1GOJj]G_M*C>Ni(MS"%*v+WK™CjhtLk틔 U&[gꟉ̸>Z= qnm%Ov1Ἑ7{p-]%cn{JRWlkKudz7/#۔ӻer3r)\/Z/HsR}?]5c&iI !*ń4)O'Fb5aPslK9@0?](d Uj%qlf4M3X\Μ`}l#' S9)բsh)?b,Է%$o-Ѝ愆\lbVJŏ*%7is 9Kfu`(m+Wkp1qTZv ;\.ϙ&^v1^yL\>V B&&PB\}Hxvk'+z}W܉"-]Xͧp˅9:;Z  ,sڋ1Q>4Iފ]^(C8Wbm 7w "¹]k&,w wLBnq`Um3s|'"Qsf + eJL82 TƜw(:ݽ{Hb?.`d ?Cdn+;3?Xar8RxP$j|*]Q&Q'|qy yBfh LcaeCce t\|Wc?WS1QA]gจk4T-D1gZ0Qq ,eq['ړџs|n\ 3gH?l:(~.@eQ/"mVN]L'dWJ- v}~W{ˢFvh:<5Uidz]_,3,27ST{掹k꾮vǨ .FYwzcIiL (sx5w}7s3<^*ao?(&}@r pXᅚz4>v.==n>x l~9f56K`j5-l=  hQ+]BabJ f$.0qإOXՕ2K B_e iuƎ%wGt Ai foc!RgkE>Z{iұvl)Z[lBLnv0m)}KPzuT !0 dAoq_ m a$CiY/#.3:*&+E7HJ&x,%{0yt5Mu$Һg m̔)0_յ6Hn\(jU%uqNKGGDN|g+ṢGnjixd_7DGyk'eUIHF(O@~ dʀND]SU3Jw ŗ4P=- l:=Ȓ\!\! ^ahm h2< Vu{\py-~U dʢE'XD摄1\m=5S4Dԣ4}1gH g68DW*mrRt[WyJ"!iA_EעإƋ=+XEۋwO͝czWGmn3yfQ>}?GQ+9߹SPȕU7ޢqhXW.t߲aVȇ=i?SH֎9$L>[ Jjρ ʛ>X݀2 lcr TLM/7B0p-lh)Vɳ页h28?z~S=O'h&u'z[jظ$t׋lCHe<}Qbܰ4*wm;C>)|12KFet %e#΢sa\[YL¤kz+GB r$ 7 Qn`푉7?~R :ضC||DJީ/E;9Kw.lI{Dxo¼J#Vdϴ3xu#.ȬXE~B8ţ*c†Pn)VаU;dm_= y\7m 'Bdp׋vnOroSf ϒ5g޾yC B vU3WUQ+;O?LUb2TGpͳ)T)/a-&SM_orvp"'l-(D=ƞ.!FpTs˘<.[p>B_QL jB&z6i,NFs]XJznagA<ҫ\&r죿/L`KrTt>JP"x%v H3lb99°@cL$W!؃f\lw]_v%ݎKϤ;-=[H& YKZ,k*E'#٫ÌKFUn6'G;)_]kc :Sv?b3c9gt/^4KNcC;-z ;fI]",uGbjZ>wŬEmcݵa DB  >qIS,A)%S r7\ L-S4|ϒ99]w٠8]k*e C/a8l^/q'Kc /G7F1fa…qZņVьչyj]ĤP_TxFY[so]"mAqhRC_q ]N0"N)9FYU1"I:؀h%jt!\tXv$mOfަ"sз q-WzhE)\ >G*m$0VG@qUjiUxc̎g37ϟ@dNG%i0k{Pcn~>R5<.,)c :_q qA:'j!\{ҁ5مG - "@8h_;mZެJ97Y.]=r!&]lvbtmdS=)c[=oOau32*ykεP* J([Zr!|7XeB)PȾs+f  wGlL3f]Es;HNZv.7+@$酿(a!P9CR2DV6'aٴ(խ8'QU0{ ;0CoxfĚ\#C*`g cY`sU#D{7(mfCd>vK !*%4s-G5?<+mlaH㼰㫣l ̖fGm8pB\wrm7N~crev@y$#!dےY`ChƢ?y'fZFZ3K]Ãh!_s[l,+K`U9czm؅6Jp Eрp5QŖ!;6%. ƨQR7D_Q0]=pkVB$*\Yq:ˎ-{>~\_bK?L uȔKnR ƨ&:hq#9OtŪ^.azZSd75> ˁKx\L܇r4W" zi9m)IHQ{ ~K_Z:hf+2& ٌ$.ޚ:ңkivm2э̤o1HB\=鑒W8NAP,='DdOڹ STʽdwV,r:9"E%KAkZ3dʨ_Q2\>s]ǵ.ٙ-y72oVRQ͖{h}<J3$ܗ098B_uF?B|Q`s~%01_Yi SIE ]8`=KzEGf;mT\_+_'yLoBԯTQ6&-\zM %Jz+ 3: !bH)]G*O,k/ 7h^m3 'ط0ʐ#f8;i0-75w{#XJzo $CV&{SB]ON.XgvfHCXxm½$s%n:)Ɏat-fCukS1 8׬$?oR)|_c\͆. P9q7k P}xHb#=)Ky&5!GOv.c"A0ll+/y7N>V@ (Վ`!c J5m8Ch(f<rJo02;0m ([xŚ Ȱ1ʶ#Ié,ҙ1% v 0@\fz>eCQEؑ' u6AOuUO۳sQ2nC}3xP/<׶ƨX"CN=F G,׺$#svmxm}%.%Lcigk_zi=W)~dSҮ}MGy{Jƞ&V LfHq?ԋfbZsܙ!@@?:aX~4/lv :>lOS%q7=Rs$*>=zr(XtoMHno&A/uCϷkK{7_{0 gShIi;}Yh])"?:<#1[qyoh_eQ-3yu&pNT*{S83$;{cW30iDw̶ԇ'J([}rɚN[Q_\f]_"A [%N'"VekE-z+BVv 4V>$'( Pts^ ^Bէݾ[:°z8(qݗ(P +,bKxDկ:?3LE"w%Vh"|o)RXΒ;J0NsV\`[D5kF_y\!+_cÛe^(dU&H∃a_74]^nxv z{VRq"upE)gbeVhRq5rQI<ۙv­_[fqh&pMgؿfN"R^;%ztT84ECQ}1wIZfP鯿,| 65A>Le|Ud,TaHޣT2z08MQbSnޗ@谭BPb?MUxN~oi_]y-|nJ0}a)dJT:TAۧ B(oABw2q㸚^̆O- YMhKvbb7\fg-$8g E35 CsŞ#Fr-X = h{#ǮC1.=0F7ll2Ûٓ$QΥH3ܧ)T[/M~E# CքҕSgGS wUM+*,F>F7Sc.4>-*0ϿeB,U 50fvރ8as`Bf`gajXL<ɿVe߷._%>*ѭuŋ<8>gr, Lσ{{m6U x9=B=B }@)+lS=M?y6XDRY_ݒy+2QkK\Xi@$rϭ.}cdHE$[kEbV">0+? ?_1.0k<\L31W]FJߨIPY!'$oraէ tVdsiEBՉI`Sߣ)S@ϛϨ3.\%(&`P*+ٿ AW2H#ҋ{uqtRG9xNa? K?(%Z ]e{ $jݍF~g F }^Rooɾъt/B!& rHuX,XjatBvoxqq} u(biJ{eֵl>9`mI|2&jde}!\jBP;d;y}!{ثo['vqzXii>]Y Z9 q6m. mCT{d˒KEQhh'c}6{}f%汔- 2",OX6Xӷ5.&?ޮI'Leé|+`4Զi'Da7'̂J=sU|LOwd[ Ca;[FNIuh0XzfıPpR}>z%qV3&Zl8yq=`rsw.u3vmÞ!˵L>"1t@(C(iШ]l2LJ!8^p¥1)P4[?nBۼqqL_2 ,KY4Wh='!hv\Ug s v䭣麠,&tp8pu3 dT6Iz1+ ޙd U2Aivm\(i^84v>zXձό**ބ;׏IbCEu-eQI3AMGd`.]&bP'B!K,>w*m3ps+DDnH9czǾvX_#&YxL3HV+E/Ǵ@~I7I4Ի^t#г#mcV=k5flixĿTXE)/I~Nlcn,QS`toC UqLA +ԛ~I+hFsB%]tCRoufmaILbcp xQ8 ;8 տU._g gj?㒕mZkŢ.ڊ.ۙ҇0,S^'(C2CRl* fcM dc1aVY2y\6~kFƀb#9emA(ŊDJ=SVCiL`d,: S| n":[X-<׌|j]Ł${ 9Ia0"[`Aؾ0fYVӾ-Z.iPG%D&!#3tQf0[e8QRC Zٜ"h<ю/| )l,I4yk'UarSPvqQ/S[az=᪵\:4pS XkNmȒvV+T-3lN0ōl[uR.s6݄j ԦIEfQOG*{ͼrEUJQy<ʚ.r%/RXV5Q/U1.ʩ,3D殚@y$5rugm(]‘K=5<ۑ0{h?,%N/"n֍ &єݓȪ:PۙoШ*Xxd;m) eB|1,uDr栺TcJmi{$H9z aP75Ӈ^qD-A}"hW ~v%跶otb_@(Ǚvrdjc5Yݰ|kB4lځԯJ,*#s-<$L(^ f׉"rPda2R^ < {y>KAS?fpi^;x)Oon! ,D+lfZEˆ~;gaCrXeOg`ֱs~p2FB{amVzĿ'EEϘbК6(?S&PHA=+GIKFvvTڣߨZ&ovNSC37Cf1Q't!͓eH7WkIï꨻fSI#i8A`^*~{FaqIg>?"ŀ`#a̗ WAhs0q9&ɍ87C<^m.C,+UWJo@?֋riimx󢸁l"v[rAܥ,H+%Dbm!}:w6DGŷYzRFCI|&dy2AR6 Sÿ1'BM! Ȯ&QWޢU~A 4>{}Ro ?O[0n`>~&OZ?'U PRMlӕ^5%)@ÄDZ[kr^HԬ~\Qi`7m̏6눠v}dE69a e$ yq~`~ UvI]PYZ@=M|J< OVvP!hdx*œ)ߤV><] z0&[LB{VtAVTަr_KWd yɸ`d>|nzT~ǒqy("v4u^DZjNm r|f$Tql4T{@jٲ'!onew{ C.$-m˘RӮ^v AUp*d3f4CBP03m//POhT ъp.-e/lؿZ2SjsDHXx;8Ϸ&'Wbf>^V>#hx! x󇒗 sj7+H][Xx,ϺC+ "b{RuDp Y: l$4Bxu+rWoC/j.;,PDo,6w az%`[l{|Y 6'NuװګZY>Tl`W?sn50#xcSNafeAx<ȪV ͒5/euD25K"2o{=LyL. cGJ8&XST1͢L؄' RPAD*`Z2&tH_•4MN_Lj/dh[ |סv/8~o.z[֍ dfWtYGCZJіqPN`NѪv:c'Lݴ$۞7<6NL\vXV΍і))+@ mV< 6zmA'V;R ?aHYraa_z͉/\+lOzKN}Si@:17sIkdmU`@U>t$i1=l8m"U"ܞ#}ncOɐCsm4~xɪ$(Pv <)l$:QWleOﲻ;nf F3^H-b^AX+bհa];%o=7WI}X-`3DD"]dnH{&sY\5LF!]<^Rl `A9+zx!vaԯ\=`6(BAX2m4gw6cb[Y+ȅ+ G "ٙ3+eYlK)~BaK9;ߓ.4[F7%s,L%XÉi 8+dA, +eXn%DZR=;✎y08DCђi^)+!,cP7קx-}q@;@WԝNزz>$^z3Ыo5Ғ<u ~/Y㓱ĐP3vgd)F~Ւmt\H@=67,WI`47i9,=C*&opJi&ȞW%ɬpv')O=8|mDPpCE䴯W4}|ũ>Y{EfK2M|bRWfkO =/p:hd\sĬG4o 9jte?L a8/mfN5||׏ЦWr4t5+Dsc<gׂNH1JԢRF-`pp\t.[&A YyF1 žOu 3~~qNg2`a P7 (4:qs+a _'`G%ھkej#tuHg8OQMNDJ'3:o% Bbk]X8Fyb/ZG! Ԭ"P7ۆ~#8,ٴr`~Ksr|Z8XA~7\bn}R!n= զ押OX,myN2kZl҄SeO^Ƹn|b3fNtSv)D۱cC4T6IXBh!:`gu\-l{*c]%2^S[.KߕF@dh] '84sZIqYe`Uvmw>#9zW{"㐱XI#&/'6 -B V"ZqP?Y/G6ИRGWoUشocZ9\F\t}tAA;A}'\w[Ct H=Xؾ޲軫7RVnx]ru+5C6US|!ق4;Vg" =d*+/;T5X: 8RjUgJ«~k\z# iL0O {J1c07ۻeE{#~@Pr=p|+-͘e ccXt[[+*q{F0~mi5 ?~~L?֣ FsѺv$Sh|ocK܆WAAy}"+0jXY^ܸuԻp$j]W0_~+- |9-1QG`p!jg90a)~eC*J@& eT Ϲ9p",G/# =1oa5Lϵ@yգ `(X tL_oz_G6t,Bz+TfFBDfK4m#T&oqNʌ,Y[ʁV#6#1!GCA[gCf[I=c3K̄{͕JLO¡]DuZN [8|Ԧ527q|)̝'۾CГnǏ~#hN16#2"L Lb,K\"NUM i|alJK97(F4Ny c]ynv "Q%<W[H:j^~ԕrqSa_ܐ_CMeƮRvg9|2}O{Y׋NFCX ɺY5B> o=u ,h&%ӵބ0q#1EiO*c Pv26kCuE:*@^xƓ>8||:hޔ葛|}%O+ WR?zc@AyvG4L첫lFsz )pS#VZCĬ#uqyo$hxQDmqԳ~T !|T5$ ջ}S?8ubvUwTU|r3 1和U~B5i1dxLS/4Wz3V\IjwN@A+/oƊ0+`AY+2` ˜~8EOIV.5nuމz0Ә7݄$dM-,zjGDF]GZu o/W9_c)uno@|=#b?]VHPzkIVj$ՑF9 N0or)f2[ɪC؏KH#e'(RhV#<{aJ̼ oT_^{dߚB:1YP)qZEa(V ƘdT>lꤩsܭ1}R;.aMS)<>qۇ+mnmj$ƒîWUr،Mq{.VCj]T `ӛYъg3SSRm1Fv"%;$D5X=6 .K Ej_MŬ .Sl I~muߗ~z!c6-x:DsQ,^X8 ca=f) \wp=ygic<[;Kܺ!+-NI)/ D#'o|I`GH &)/Ѐ=q &32bE@Ath\ӠD1h3r. SF<++#`[:UsjA8 ޙٓCoPFu^vIjqgx7xhyd4i0 L ݃q@WYu47;ݪt3 (!:Tvp6|M\ogʱol=޹$Gs3g#ymBCeϵC26lhWB Bq%ءE H5}SPCCVQGѝkQa,EQ;:qL=(f~sYFwݫ/n@z`mcE_t}SMyq:9 ><ug2{[BMk[Yc-fqЌw0RGUEƘ/4y8*UC4VRaY'I&m~P.^JFT%)<%Wxtzl<[zMO[e"!r{:Èf{I? »hpT0`FX0,H&'7N{υ(1Ǥ_PX*%_ugiL'>y{4ht i:O1l#{qEn"T;2nHrb62ɕKZzsi><vXՙ3 o9p Zt`f7uƿ=Î,㱇. j|LzŅL'%0Xؗu3t拀2ՙ+}MQl7BXf NS+~fōr'V 9a?I>Db8 qs'>pEn"-H#Sܹ؍F-׿.gJ|Ϭ=xGXeo$:扵@ְ8ϑ [-zތW$Ƣ D:Z.ñاr>TFJL0- yh-2ƔrdN]˄щ0w!;V } ], 8wko~ƐGZ7F7K +HԚHj&+{K0XeY^ZFrf8s+6 0 %yO$ЯC]}<}1= @.N,A9_vLQVkT~pQ :ӓ2H)?8CrZ$nTG²/YB t!>0WybDJƬy\ʹ]fwC LujLojzuc>}@~ZM39QЇ[a%FXiDc!FTa%`3i2ƀQ[GY Ha_U1Mh@K~PO~2jd\øS֮vNG㘦Jvv0z"]o{]*>'=ߡ$Ip׹2c!ჍosYf=Xa{3Bb ]փ/P$La-w@DD^99)ɢ Ca13Re2k`3w7Z۬Ht7ݸV tLH9:4f~_eH[P}CypPg:න\|$329{g悐 Q7aK  v=+J[VP !@b]_m#rSFcPr=fޔEWwiJou{E[pn1LJGclc`5{7 ilPfoq=+lI1O1%dC؊ciu" ()pGfW\!|ǨR-0+BnxkiĬhu]yO'깸 }H޻GXaV\۔VAis]'\a SG).Ved2(d3X==ґ‚J"n)LQʁ[1яBoͲtΡ~c[@q$~XV$Jگ@&of\ ?N@t4O@bT~= cK`4:_ƇgIA=ه26vPן/U$4dE=zjIr|^V.0L)6:-aƄ#\@5@˱1[ôB"*lK%{`/Ƈ&}kh%~#^!JU -]9Gsl~f F*\dX~+P9≲3DR@D%`VTU $X?nwٟxbB%Rm&d|Q.VgE"Ɠ[WSƲC`M߈8\s7Dz?.C1ň3v@&3ړ6)k _Y"W :jE4|ҔYm3X a t&x[L5c^p 5}o;=e3ؠ \gu &>zVAcXZj”A~)V@O/_4/uV]bQ:v9a+5Nd!1[./N5".xk]xx66Z-*SUtâUQ2,2]P>q!d:,C}Ƭu0:'bppAI2b*tb 'fX2D!6bf>2 [8I$`S6U[[Fu Xjݦt,i0 |2ܜɁ6_\sTtotk %R|_-`AVsv\$@o@h($z)S^M|b8\U +euvʓ&- 'Ԟ5}c 'Ac}MKJ\|ϖGG %CN}E(\F8 #wFH%&/ZO_͖_ Zcv.-ݩ 2`Y6뒣26M>=M Qa?&@|~}g5+x76 rHo?5yoZ6;-Qwup&7.)CѽdEMҁA@/لLw-AI'֜Vg Pq}ϒ: eAUULa͋+OQˏHy,GklJs:SBs[H8%s,J}_&wiW#@SLĥJwE;gwuh٩rR7ewcdpe{45QF8CZaᧅƬ; >ඈK6Ȯ=Ya#-ث@ 1{B]G\tIi%t*R.HONw n]uu:R{<`6Dz&TpЮ@"l}>՚EhEMnH8O^w aRɟ0#3)N[d ל` +A(W&'Ed23& G ƈ5SyJ{UXY:|Á&jzvM`dx Y&1Έ!)$;O?KOd֊h>sCa#͕2HuceD%]K; @.-ZDN!!{^bԽa6𠭌zhp`W] :MP6,M̩gmq! p/+'qRwY qS HDmU=n`?/1fsG[ };D6β-cv<^;!yye=yQ4]xb tII"@˲'O "sX(669:ƊLɍ3A5*bv lXc%g k"og:Y>GV TQ"ͦ9OuKVl 2U0N^r8`K'T3'z=s1^V;LN|Wm@Vy&6囂 {ވh/w۾}= kAQY?y"ZCPfLIlR/YEi%ҮWCfX8QDh\~< scOtzIމ*gFc} +}b}AtTf\ &V"/[O߄1hq(@M:_ۄ/f: (!2!4޽A8iM`arn&;ˑ{&%̸V◱HZV&oo(N~U۞u-I`sd֙ɸe%e; ߛO62an:q-x4@幆k&-;3: yq9oc-.(n@-7w+mUi,fC3jJ}l.=oWƮ7%x#jD:g6m4Sע-N~A(D~w'*(i&;eo/$\6$.=kDƫh~Ǚ*4d.qM۠M^^< QQR*9cr+Ly8:nqau<"tfJl?PB`quso{+^ wd.ErySҎGh]2sd ZdaGZȐ5֨W$BӘFY嗹~p1ÿ1JspyeO`2U=fP&/ *'u) n`nh2@2$Kiz Tzkg/Zߡutb(v R.UJ[$sA qqS&J;~$+^@Ի}.iJi 8Jgj/M @IyٺH@"Mݯow6WPn$X"'#+w_ymK bxQއQ׋0-]̚:6䬰}QHhG Ywk ӭ<z[/Ҹž=lJkEh$A埄[5IX<ǤW@j|xYGZsNJhu Q3C%Cz|.ٛ9ʭB|]oUYK2jebF)ϾgOD/ES(GLk,êM 8l_X{0~yz%W:e`Y|T A@A&}6f};{ `2zXY mqF2,O欍(n)z. 0AwބMdOjL)K olUIc2Fu;de-zp!(␎'X.fi|gVѲS*Zk6&/j"IGF[댶|گ!;me3I.Sno Gl1&H] KTeu$U/Xzjn *ȒǃCaZ+x&&kџ݄OɈsiS@25'(JW[li`0naLŸM#Vigi|Q]zmрiqRK^1oQ37}j–z0qaE"MPjR!/?2(+K+Ԙ\:`y=¡72}EǓVl!s1p<2t KBO(D,Q߈u8z8N:}`8haG ۅcnyR8uUNJ.OAT'x>4K갅HK ዯCلnv\IMJ"·L"@I~=WNt d{h,+:dq[,5(Q(M?Cl: ?i8Gpm0VYs87-lz)t3VT n39`+5ճLC 9+5V#/ix|l!I.8x`;-/ er:S06'F]b9-=rYiSim/hKHe<0 ~Of [k\F?7S'aW#\CgiGO͛ڋ氾O,F vRבcn#~yiI%ݝLq1aa)T?atZ![pzP]w,(G7$';Ǜ%ɏ~VIaE)pp2 \mkYGiCQYmE@;[dkӡ 9εu0es~-vq+D;ᄤRtOh1Xհ3o`{0+[M_VZ#&"yp8.c~x!$ 2,s-xK I&Iv1U#ʔڒc]m.|kaRx#07d{+[booihʵZrI:#>yILA[FٓŽג-vJOܯNH9C#uvt`Tu$ q\RZ9gnj-JzZXASI x'A$2p\uBڤWLi,YZQ[dX_Be` b!H_r#XKBh k$zw?#)}6 !Tq]aѝ ]vK]wDE:fd䗟mq_RaqEI:`)Z m@9f\<dU\rՍj`=騯J\ii˯J}7D ( S'}-"mF^QͳĊ1L@e*rnx^Ž KE>xݮz, Q=A}w3J; VCGuKqkVʖҽj'ШtVi&?+31с[MT\zƩ‚ϬͰF؜*ܥA߀Sv1PUg'2 }=(mxJ$SM/ s = Cؠw0 Xt0vZ-f?8PN^V~S_1XQƃ&@5a8żɨOz2drO_[_21@z`_O72Yj iͩIJ$YxbزZ@{8P#w~^;H3w9r3Eg^]c~}3櫉p r)inD%c)9`Ɖvȫ ku]x<(Z@}cXh< "EH$ȎQR}͟8:D.`a$?p%.IMk]>r)u4m}XxbQ6uLU)%:tti2un؍ߖ#glu.CzZ(օLrzƲ9;SN U\vTv}B8yn?PMzey1ASҀK"jtqEߤё' n=2դ13ךuԐƇkUdՄ jqo> @~:,R=(9YsKu/_9?.)>[aLȠU$ׯW0,)HVJ<·8Hȩ:wͧgLD@?a߾e8R qFie<^Ό>I)U (uZD7x5l@Ba>UqI5⸕=˜9>$V㫾Nm@jdp/33zc /, MNfg۠䞺kUڷ!A9&rc̎Pbh'B|sYTԙg?n4y֘ 0[o[ X('M:-9ܗ,{{rIaQܸf|=۰ɾԠÅ2|M`0UPC"~Gc?1OOH7>tGYO&-%ȳ ,-Iͤd}i)껉>6DDï}weS.,q /T{Z[D[A޼[&aJn6s7Gwݺ&nQ74&uPT,O4tVJ!2amivr`ỴhWQwtIL 4M+ꦶJSՎfdfw*4`9U'1lD^)+qkAw07& .<ڗ (uHR#Ou2p"UZ%fm0/KS Q3!vT:R"a7 l),10}x.-\FGL{Ѻ#1nM ;qqgfdZh̼z "oOn'ˏIHAh%#]n) Z)>14&WcȐ!6WVxU?_EmQ̚ai*FU-{x4XVI^N'>m*5FIw'!Zia,~`ߐ7'Xwelj8n ]#`uUyLj,L20h˂[V- GM` 1>\ *gж+.q]{ȃ=)"[y_KMVy(Z1A8hq D R|vkU&zħ?q|hl8WZm=V y%)9 L^zIfz%Iy_j,&#0+ő)"4/[ܿXࣲs%6w`48FlC#O')/y Fǃt!\M]> Ħ{\; wvGGmOˢ*W n;huOh?rp2?hJ2$JT]l.AccI}dvR8@sy͊gd?QጲaN_ K}Y@AG[Ndq50WPQ2 h09 5⎍H/n ~~u/i8Ck6@W VcPf,Yݺzyob ņ;$p Tg#V1[B*6qr^,q0-X l! Bwt߰?Jљ.V8UQ?=^&=H̍Idof*(8l.pk?,fE880X8'1PbPŔΡ>'sj[o Ag'\ xFJoGQ\ifVƉukM O 2O΀n1ZW.)ר:MUQ-jU7%Y,#M -_-bcn')[9ӑ!j(y}Qx>aq)A'F#kwNs@xLҲt($ C^$SDGu[\L+Q!]şxgmT‽ڥITY8q7 ?|DD0׸P?h@4sl֨%+ޟf,>!W5?C#cz\ qc!Il~%a%2jQ7߽o(IZ;NBтC.toRkdQS)Om.憚!8ZEZc uR (٩/CI0#K#WH`ZL"}H-xTr%(Ym[c@Е(T84+fM٥AAO>5ߓ+`'֛uK6, 捘~9n6sOXw5'hڥPd +0 K7OUqMyJn8緥ceaeHjG }_*s~Gj8/k#b%Id+W; VKW{[P q\/q5юݘ " 3~*y5McRݚ6}.%;<^PJkJmig|0ly+k~iAb&hb]?R3H(`x|2~c 78ܳMnw[pFke;flV2nTtgozB&ƒ7DŽّD씮 αՐZMgGb c $˫KEgYZ>2 AOeG?L?ZS2Q6Fxt̎ "2ya !m?NƒZ>B(y6{ { 1}UkBdBZߐ5qg;_l8A]AJɲ]h,s]~sio.3ϓis%J`NL\'_B$u ӱ9<5*q[n`_v=2FaJWtޟ5;>_0h#?ru^uhTh4F8I{/̘ϫs G}'MîFQU{f{mbX553g9.d%$ꥫy\]p7V'jaۦeо}š psYoFe$+*rxj1N^IcQa2cv|<L9ssiA Z.,uPpzsuO9v= $B BnR *QNR`R8ش)bfeTPoUGyǦb=>[xWg!6w{}ҐCq ^V^)Rp䕖`lUE& K` LyW >}N2wƢE֏;Jr O|x'M#ع{3`?s8Mw1ESg_Ao #=s"ȈN[oN?,5D3w {x7:x¸ԋFh+>G?/+s.[fuHSmaOn!F}*r5ҫ;`p5QWT]'#CZ;&m@!1n02%3N;ٱm_Vl@.G >8v1:T &0,?3Зg49%ݧr]Nm+h,"}7*]N! ivH1ndfӀaqw (ݩM1 Q8 "(α8'fZx퇸TKq ]ui \XגK.erH6X_1RM^iR t (f7ԏˍʥ4ڕ kTPG](x\Ԡca'ԩ 8dY?'@˳v߷1 ]qw1RbXGtA2Dw6ҍG@ I9Q1#OsYx 4$cW _zV#l?ה:G[kojoJei L(֧yfI2PSeƨ՗v$nws"UCЍ֩]ws;@/:%$Q2մSQq=3hC]4C߬Kuymxc:p=n,Ljއ' {ZyY*9!ǍZ}!R2΋hņVadg9 \Z$keQg6= hBVcYmtxu&BiƛVɭgs1&פ+BAkK}TiE9X:$`>w^-,X֗yDKz,2v{=U⚹@ U @0Ⱦ{[*ώ.ˍZp]N^"nC6˞q0d *eR)ދf],' gB1Le'4jvD۝6-8x+Jeo[|CېƄWA6c~=gң}:3G.7~=a}AW tMq0NU߶s֜&>MyZ2яK7Νkj-d0\:1Xw!ఆ^ȚbdM$|l{̢P^2eRxk[d-bd,>/h$-ޮ*Х P.qr|k W_qѐ ߉BDC!M>4Xx'4ڜ$7@>PbU6e-dg]{ ,3.ouWRkN% Nha}:"Y}%=ri{֨D%j'Uq? Fw)Ω's*vb ig'7,{W2nl&xf vGyS넠%Ϧi</UE0ljBR Ȁu󖊧2]zzynb ]_=}x*ͷ9v KTe=QˁQ]84r&H.:~&>*eoj?<ض&AW4㹄ZC*c}2 AwNe#O͉`X4 CbS०22N&^yˉ>Pѱ,ALEH"c>9s|QZ2I7\fqCzY^UKЎ"$ԋB6:1uD 3fCM.U%g5/ʬFK e`?LZwe\8\M򪵅03!CY(zG~ -$r֦hǵVqTV|i F0Sl- ]M,-A ,%E tVL]RQm39%[Q[}Ph]Q;0YwQLE ӆ'W|+egҚu}}W0azW];< ϔ0]qP8*]]U2I5e \_feV\>X_Gf1V8+uQEcn^FMhސK8E.y*7#-g>Iv[yH#Q0:yGv&GocDA? 2s]˰Bg?pX0H0 4.0,(a})NM']j3| fI 1}7Gvr bG 5\񓫢~zbfW0+i (6h`B}u=ՕY;HvaI\2ra:,+@H5,`qcĖFEsjg?b^PK E!ܪw^MXFV7m{D~ 7`5QwԲ΀{S _YQ%rx™-HΪ%"faV_aEKo â$9c ܡW,5o^ǜKebNq 0أۄ:;cЈk]Pۣ%pL7Sv3hNK+9pɟֿTW]a cձpht6G:{l^rr[V ϐ(-pQ/7-q#51Z,2ebg[A+(Ai'8 =3P Bm"NͮQn,?^`v,Sd[s5Om+k+m.LC7/(g~XVf#v-Ԙ88FvWM%GPhޚondIlC1 (c?Z}jUDtjs ¬7nL(:pvz#*S(#V,0dc[ daL mar.;!ख़' UUcN(E~I[vϵ{yhşZ(s{vpֻڪF3Bp1%h93RҀP3%E qm"Uyu&X(zALc|[1e3tHgY\ʼzv䓯{Ԕ<(D4+bA XD.6=/j.EH>{ɽ9/ZhZI\3x(") )ƍhӄIbbm¯5k;ovVlJ~Ma:֫jSRLMZ25t, xŠ!:g~pZ7QyC@.΃(7ǘ0eJ¢㫿m>1No!q(1s2t lc5EuHy(ؕI¨we n?8ɝJzFB過*u"a.Ia=cm _b'gV;]éT :b3E`ۣ͋ڰBD:Š7ouTj4ϹB Xˆ^ɚe؊ƦsgGW1dT#@qiS'+øDt\_jVt4S:Ӈo:PLS{),8LZG: -5T6׻VAyG#L5 Av g)4U.ߥN\i}C˥c'}K{MVoUbKȸJE/5`k'` DxsfjU FWaMNGyH K]33xV"G0ԠH5iu+&g3KGruZʹJJ9 qm=7M3{! + D_Hptk3}J Gdɞu^VԚMA}<fo# \]XF'.]F~Vsz8ÅK?8Raclʟ$.[@6m'qR"N{iޮA]TtC=; T5ˆМ#BdHn,'RFP(y?`ezfYWM 0o8cJx+3ﰎi.ch\VyTh>,7'\7ä' %'sE%4!b7IvVوˬE+;-3+ <[Cﱼ.hsmݜ3t1"*yCG\YZ;x=[jo׀sbWK:~w*<Լ>mpJ7`"UB_jmv2iA+Q${IVKv"SH*P@--oq=F]^mwt\5PGA",G7u&S!#>6N$պKf1`+nEU7}Lp/@s9U(WZSk֍a1$ߙwzKDAw(`P./ݫ="L" -ߢi'Pby%vɏ"AouS7 ˌxMD ʏ[04[m6&nLPȯ'/i3}i]u}azc$&Oҗ5U uQp}+Rtz֥>[ BF# }6w,Ic@Bp}ã|ϻP G$A"!xhMaR]&eMTyDkkAwR0D(-|gdEVOB|M j ~Z_ Ӽ#4L}(pɢ$͊ux)rv{Y,YfշLwub\32$Q`xy;Q62yַf!jzB+B4/5=J=o!'dz*Vcv%Gcx)f/AWsjMBGoUGMTֆmMAF٩GyT%jW%%驸:B+w#u*tL\?~4՗gY [X"Ljì}>1UX&衢ڬ%M?uyj:[df=h4{`ЀZGm2pĉmo՘9u8"NCqY5n҅SfrY` HXx0h~ %.[:= YҒ)x̌P#+D>>˘;%J e~N>8Y'ɒ4JfV0A  ~֍;!̥O^QzRȉ&쏞FFՀyLusk۟svCϧDXɺMN)ֲz#-Wh >3^]zEiBI(ȍ^hW) /qp_@Fhö ]/ŠͳXZP/8}EA [DS<D#q2yv޽ 9D9lhGnf#¡kDӮ \!Z "CH^jhr̬_%6f2iwD藝&-.D$X)z1Ŭ[jU,-l'!ncFxPjcq?dotsb3!;l<|3|$niWy5# r6]8``!lX̿\(gDdJ)]UA_ v} {Cz #8Zy썛TʥL6%@H,)My$Pw L@TOO$<C dAd)جd*.ԫVρȝ=@ 1؝.wy8|oi~XCrt>՞] 큣/ה.\ .d[0rϔxY"PE?C*JeIrl;< $rA| y{ a )_ˉ9d\+:H&eRpEHDl8ah:cBfioY#+~je~?$g99YA1}nV /!ՓsכRITQ7Bn^_} BƖx~v1̨g9$E݌(sBzf]7KA%ʹ3*d}܋' { |eh~>{s8'ߟڄ{g)~w Q' .$.t@ cZf?1S ߙ`ԑÄE1F /NKK+BmpH-9n6򋩍s1\<.|c΢ۍۮʁ8L \I#ѡ${y 3c~DFP.79[2;ס.;G/]a%@u4cj2.TG{bo<\`eCGF?lU~>N2ҋ#QJZek&k3 ',k^C?^(?3ԊpNX|n7Q$tPi"Z{mQiͳ1a^9HgK2EvG5'ۊf`"t t\/Bކ$xdkE<Tl_ET_]b7{`:UU?Gm_TtD\(*AF >tF{@R q{&W]QZ~L\ 2? 㪛90і8dEg_= l|v1qDQ,m|,{eL c ~ppw?c@lV|@]p\IvW3b"Hwzqͨ "K0VKTaod#WL;R+**C86 X'k R1]NAlX 'g6WgX/CiBE^Sjn֝będ4:n"Ľ5m` QsVgt$ pPSQQ޴Bω3/Ot z3)W[ k $q]P=̗ ;P Kye ja9@ 9{YD+]]75O30@!t=ʹ/]RVtp n9VR}Ca쯮?aJ6 QPyG ##bԑ2n&©Ϙ% Ztso_ kNC)Α۞{KY6d5Jd]7,F7]: Hv^حnxM&WLfp8$z W:)+[ F1&/=ʹNF,*:0*2~z˱`NinxUnƁ1vu/@Je}K5>0:ha_@ D:}`I㳿A: Q {6ur+ɑ:j_`7D k^> Q6xͪA~qi,   ^7߭st^3f}O?2C/;./#m$jG/m%qj-82%*Sk ꫧ(}]61ՈqQdwOhi%dB5KS`y*/O'7v=!˹>DgFvbw#\G#G䦬Con.fƆ==&d!: }V( Q^7 Xjw-H_Jw- _}])> JR1F(ڨ]] C.MHlGM_' =.pPy<_=GP(z#'$ >) \rwnx٢;&+OP/\43ԧ%3=-ct=怠ȡ`XN4GIZF91צ)7kV\[ku]>; eՠGZ5CO&=WV,M;53(e͠rYhL3mDc6:՟$Lݿj; Ĝ,MZm" Q㝕YLVyç :v˂B3= s3oBIB ,{M]*m8_Qɿ Z J4Kɿw9 u$%膮hvgMp9UFɷx`G fFPU./]AOSx?_CʅGƘ?8nsQ1܂h2NZᲨB~s;6=emO_y4LXkt,-)LiڔvU& orU Be$X&#ka?G&LQqs:1'/7kΣX]6p*dy!뻪-=*A$<`f[sT-j#jNI6.Q|ܤ5k* yl/R$6ۜb_)8oi/Fӆ|NQ|hx;^KDj9g>!ic8J|;2ضofӎlۢ &2`iQKiToa*blN/FdGYϛ*%ʭg:N(1\;]rQ< g \ 3P |-54bu58{5t8Hg&ǤX=ܚU@yȤk@[Qtn[Sz QSB.Ȝ1F8T/O^bD ~F S=^Bd+5ރiiKҪpaǨh,$X:gspQ A,齄föis{;a~@hw1S}r(Q-<MIdϹ-hODC=V߻R8K˺Q M=\$|QAw9%{Fx1xncgߺN%`l@0ԙ~eyWqV8ҁMD߰tv̙B`m:Q NCP!N9_ޣɐ),Cՠn,,el*#die ~bdmn 8MFPI%ژl+7Yg R`' &n.:>RsS,$ Fjg=,4f̀ǁYd;oV-nk;@)wb䑟vÆzjOx-D\@* U[3qꙍCZ٩0}c8oCT@!zk1V ;I?檏GTJxQܞґ \e]~G׽ cLԏsƪP ]`m>B)wXp$#tc{lqT%V{8 m'v r@ЂysI%Ǖ~w^aڌl2+uQ] 7h~dt WcUZ KtS!'\Hhel}p+Z1"@yeϞaˤ01 *pz!͟K 0T|  F d}6]OC Cp29la$E.0}0]Vh.qCe>q~uNUj ~ yq0'8ͧ`(µ[`krҪ"K rk;?ss-?lqc,ST&?W"Z-`'할b8WuZ-o=PSY=PlwyWAdqd2Ozd˽ -l̝@ Vi bpG՛#?hA %$mx[m#| e}rݳ'Bh +;Nox1i4enJqn ~J 9ǠyfQu.AJ 3V .H zBtPm)  %MeXI5c7/A |na{LbM"av45k C %i|Y`%V#DﲒS] `#SaAWRt}9Ï Jpv ̢85%sb)O2q=ozscV"x2gb$w}Z2ߣl UKߍht7K>L/[Y{`NlsL3 c!YN z7حb9`,{7:#@cxO :zÄز915OrA҄?"28U;Wط3}@exc'FaԎ8ċ3ՙX=%AzF^VEDz£kc ȢtY$ALJ|pl2*wPNa^Mm莃d 4-Ƹ2CVroGwtVw`yqOdeńC4mŸ+f<" @8UkS; q''zP _uX@a[ Ս=2GNXw,7-#ȠM*}.7sL3nGQC9-ߥ2yY63 Ja4wEWX7k2,=aa1U)4:1=%9C(ސ(g&)# Xt/dz>O 6 #* ӆP@6z;M? tI쾖^: }wԎl}f>Of޵/b;N%J~ͭ t@FsxE']F]?qgP݌oQ# e0U8JL˵}_A-ZN2@ Vgg'2-2͝54b(Op/".pj~*`OK{sx}߸j_2%{u$׳fV07}|\ai19y ]r4٭~b02NgsW% hm t_Vʀ/:0w .bkqּ)3@־$ 8=U0|* >4OsYwIdvxbqdM>%$z?tnOMS -BIE_To}H*v!N(\֋@kq$P:)L;Z8&RVfF.k:B! <^-jeى"_ֲU JK1g\~&z%.@|׃'=|H")jj')l[zpX8`Xq.[I++ՒRG Ho_03'Pb XYG^|rcTpa~Xr- :]pY]lި>tq.sl?d^$e<ñg]ɈaX?!onr+nfuI [Q XI,{&{;@ JY_oр?K`|F!3{8c0Xdz1yX"?TKJ"9@qT*G V+kmggGρ}9j/#+Mrj4r+Q6,K%V ZoV{,_OݺSQ7=ؒOyR}%QWfosd)sufmy%bUd&n淈eJI23FOdb@tTT6N4s dFG8ЊlvgU:[<ݧv8LD/VHb&DS3xyV z( )B4>J92?ΫCpeuOޥ:]Żrf C;wgFSQIVLz8(2 gͿ|Q/׫5M'Ň2k gw6uqV 6ۥPdJ,oZ u{V,U5ϺCRnBa/ ZDuO7Cl3l0.ħp_ s#:"/AY&9pĕޯlvd<|&ݠ0#x_߁E]J9Ĺ0?rZ)Ý-zJ kṲ̄k$`ܶU]XG.TŧnZKhb]>?b >yP =ʼBVAdb>.S(zz:u !"nXzQN X/)tL.b:^=;yrx=`% hfx0nIѼ4lԚ̶O-<-ڒ[!r2x,yy!.f:![hx&.wZǃY:>OLp5N2Ȭ_ ’9Gm7/7T7pS"[dvCiNq8M".U4b8o\b 1?M=#~}rnyLv4J#BŕqDiT(o6-ɶpKW6n@@{fh'Vڰ_ o@$s""K"&if1D, h57WMrbd+q8Le1I^&x/ w&CZ)>JNy=ͮ`c랃XMiʧ0O zl9:p1x= x܄o[9)6RLfcdM`K$甪oIx'٩11ֱZ/lK܎;'*VaFRO$HH3erh<0}M>L,ʦ_7ܩ?5*U{ȻNRZmcb1jvf6 ZSU@HW34ħcdYL[$q a~ܑ=j k;h::&NoFKy7Jl|'Dqo QBwRQ.?<䨝L%&T>8"fY,272ٔc/WoXa/1@Ɏ֓x\ȱ}h>A6~ǻSCc@s:uc,x9ЦtD #=j.jluSO5rx{ G9v}GP^>(T^ss'.`a+CzAu&^xh#j5Y]LlG2φ!iybU6 ׻'v,ؙ@( 'F>F`Zt!ϴ3 $xJ?MOex^OT%1y'П8WT@Hң/ \7( 5Iݨ N[ʽ"%0{P9N"5U/h1+[s}ڕuFW_Bw8zo?Լm,] V5.yY7ǩ>&s`)l<ؼhR_Fp[p\AVT ằf2AzpfD&@%;Kes| oRE\1"'9Yg{Ge?AEϾRK6+xf}Fi**vd.Xk> <3g$RGO K}A{K nn݅<~?X{q)C{N!?uAJGxHnޘS (Wȟ`>ڔ050aª:;~^{:-Z-> 8Xb)S% ;IEE-'MX0L%[s{maQ5&˩*^0}˫5GGi];g6'FR(,̜&BrG\QLG_ i0iW*D12$ _49bn-L`S/9r{hhy,6>"x\ݪuh;Q!̴k\A \q:#um@8Z饥Yv3"I2ÎkF]@ TƪWV =Hqƺb ƣ- .wULeɔQf|aJ&fĮ/%)50g|·-otZOVwb^bķe T+solWla@MA#>c M0*réCcI/_۬l" 3n~qLn)!&SI.7 EXsl T= q};ϫg,LaQΝCIB2&r d Qa} yA`I՚Dj̑+9ZyN!3:C7߄~ j)D S6d4e(i0&;rʴ@zE)LZ7̭2l0wW$]C`otc,$_:q׏'I2MN5ПOFG~5by) 8U_k.CH:MSOhwY1x/B-AK:Kx| AB}pe0s]ux?JtşdƖڱ҇ɿeZ> {NC 3HӐw>۪^}`l=M]a'%OWeE=]/LÂv'cp3sFNLiZ Q_Q}Wz@N 5.0r!;WCe R};EtLD:Ss9ֶaRA`:tqt2 0q!)d?E|^B"}㙴54vqTjH񐲋}\]sVU-E(?vbU&! m^fczEmC)Ji{*~@'E6 *c`sPRY=?n G |q`%6l@*l/`w`b@H"`+e{zЎ9n!#+|%ٸ mS-zW3{; ;m%sہsP)2늜LY2X/lc.&N&{37;xACy:\/QT jy狍B֢HZ㹴u-Gh#ge %m61˭< pVd[GlK*.ΞXI\mV>߼n$X:E[vBd)" Wsxc e˯ OpRk -eWs_4Bt,wN`lP"0=hu.srЊ s4V(ǝIp@;HJjp5m_7XMCwHxOQ'V7Ín0ː gFܟ=d C- hzmQ4Oٯ!폟jllD>wޟ 'nUتehCe^]c9@9ojYކ&uj=eJ\%pkHV*I.#k,&(Rk -M"!a9?9$hzF0<,OH0-k}O]9K6[f9O$#P?vEO [|v7ߐaw?m]bC( kΨ`waX됫f .&CfbҟSQ;q 2pb|[hGfN5psE/Rh3%& AQeمʦX,YR~`mB8!78dJøڀ.;f%Q1#j@W ORV8(YbZʎ8%_`ῷPvL&1Su}'M .Q>-(3cfC҅sL4d (5)zklMA "ri~ԭZ8x7b1nhU }4E#h0N$/I]nf{nF Ul$JGk?-piҦɹp Ecs2: )n~ˡDR g%MK'sB2G(1%xj*\ϵZtl~wX[+UcfPHpTL>/b+ӦV[KgsqiS$!wSwMUecCDP39n?`,MxO-ugr>LDb@e,mB_6 I0ւ#wtiXb?Qס 8ƿ*coAbLR\KU b #[F3noYgݺyʵpCؓweHھ/*"W~ D%DV%_\Nꍋd.KVmhϾp7fZhfFb:ްu-j#Gϸv]r"ء]GDC1MuɅoێLp ,6SFwvrNx3 ۗӣNn`*6!M!Y)^8FL[X - ĎuN05E6|n/BwJRb]1v›-}(Z-^ 56=m@ }+P̎Տ^ Tg|rt!V?)M&?d) MXܓz,5u@TcpaY7PUHVO53Zh'>o}Dєw_R-oʭAwEbsjJyCh eO=pؿ{YO"~,S۟.&f|.U_]F -St y҄|)cT`?mir0u`: {LP +Bk茋iRХ'hΏR8*Iv =Di+)9@<[wGۡ9Yw ?IJ8Q=Z[F;)D, 4մ{d"Q%GZF6LQ'fL!+qZ//AaS54$P6O:}K=RƧn:Kژ|q]րJ:=Nj΢ gA`q3ْ j9(ل%"˞$h6@=RA[PaŃ9w$(śUB/c ugDQ[o~!r760;<%`8=XQ$2 d{8ީz79n?j9FF=ܚ _:_^ӱdCatŁdNFt5E FZ(02L]/PÓ[ =h=@h:.= $^8VS(e/:˚W1}_a8 wIoknX\Fv?Aj֞T$ C$F@KxFm<5y'r]ܒOa螓e~D/TopNkWy;pVHh_eJD= ,`q%mV| <i҈1hAYiu [z A@l\4R6TG0bR 7}3CKS )xwe~ZLfǗ9ۦ_'fZJ;:O)vM'1C{P;ޯ;HYWL8{-ErQxIhm?kޛTolj3+,10ZpHXt 26Ɯ(cë f Jsc R=LBWUEk(6_/xs~]'BX_)i.P4g%b_^ NfL'΄b*fH +ʎw"S9hf=k TjԾ@ڍO~]hx+>eY~ $۳RCyF6`s_#0nur ʂtlO:?*a>,9SaVAlA na92ģ2xpZB̬pʘmH>@șuF߈99\lxJnyeVyX˪G[›;P3H<fvnQťЎb\XQ,f{m!r&ii>9T-hkpbJGb4ݺQS;{b/G)LqƪtHek^ez+\QG& bFx:&\x' h=ʔњﶱpdW{S?) K}ޤ_L%ҋB -圑7K92yOPw]q$ '{됓äJҍтų Nx?Id%l~M}_M<:ڪ䑐4sg)vDtZ 𤾿}Yu'Cbﴚ/7_$>6D4.MC$pRaE: w 0lN7R^D'{6pICK ^&ǡmWY8r%)Veފ5$4!Ôdf( *Kx)j=UxӤ~ L;l=b csY '燇>MYO@\.3#DwɲI ؔuk1ǘapRLtfW]HS`Ao5Z6>>BPJ 7aoAhԠQ_X }ޥ FnRծ`fZ)95z ",̡-T,Rݲ7"*7F."Pv/f8{ v/Ⰼ#X:i?!?%&7B!gr tDc:-\<;![m\N%bL3-/i1hӟ|ڎJ0jdb{5d`5J#ǡ=RB[چA蚖ߐ|Ԅ߱p^Q~1g7}暑XJ )&"uKVTJc{PsTb #?*(Iv^'=/TMS10_60wN%pHl|9az=ɪ2q03(bJyeNQ/09ݢ-f^*vȀZ&AL;ʵrD.֭&J;>PǤ, Cc{RLJ8'58)N_V0xYb5aj!ixF -S#ǼY\z oߞ`ˤu t>vl?<ܕcՒP=Ϊ@֋L̨7mQ47zžux5=?tF7pcn|Ү-!b ZMȎhN|CB^G&Yr[" )up HɷarHKd<[3gyŴΝ"O9 %+C*Eg> x\SpOsEc4h >ϭ.GQr$>>[!aoX\B}XTa\B4zG<"~[N!ymj"jC8lɀexfoFהlOoWv^naڇ~w=qXs[/ ʀIM~0tnoTm ('ZS q08k|o׾C{]%=2{#ڇ_CmtMKg¯^y@ܶt@ ]dQGYr<^_x*gv&溋0Ls8Ic9kp ט3!b5cW=1Dk*O}Mlff$JYUK7Qyl"`|1qnE)\ʪGOzAü9#[ ؘȕ &N51;nqۡ$hzx-GZ -uaL!UwbW՜ c4?)P֐[.fo$Z'&S /mZtho&}2! G]Ea?E#5a,[g|Nls_UZE Q~v1UAcZx{b|~V9 Z!My*G.W-O0WsȩLsU)a(1x:!aLFHTa~,';N n6hP=)L=W_P #2Ts/ws>1m[ɰԮ%N ^Rjn)rp2jb=pgau_tʎ.q-KR!pd֨'O>1 و"ȺXȈ vwІsɣeu6Ey,+EolR3=Y)עsP-tK p+YIIڥ0ZQ&{^ekJC9~fxBaAA p'GǸ8kE`+~cO/[uXSD|K&.ŭW _ũwU,Sa Od(֙-&2s&x%&< JđvgM>c$Yk\e[O?x*s@HaXql6c@m a53K"r+o%aS\eaș0mD dxR3É>{FX&]{Gǹ9"@|_*Crd.9<݊(0Jl)Em S8LKd녦]eG_XScrZ61j)+=rwl]Β "geUd$zE*t%4T5)릨)j1-8zNi i$bnEq~~?ƅ[m>uZ77= ?{z-+)urSީmy52Ud&.Ԑ6;[RVg-~/ _,0([W!<܈z5%y .R;o Z(}Y5 n&^y^z{(TchGlLxRgz3WCk"ΗǕa}iF]RQmV?0+O\%`'J kedDcG7?Ϊ!j9Y#n¬f(ᇲ` ' o!6JD1e,"=B$_hcZ??fuDW V0t&{^|SAU qǘrW]:)NG+WpU1h%Ka43.TFˤxKӵ~v%۟Df7h0Z*V:%L0~FjP;}cs<3b*`)Y6ļq&7P˟ج[%S)奇xdU~ML.O'jLǨu8DO^Ψ AM8qL'C][亂MQkdAdGbԛǐ! Ųgspe4xB&zn;<۵)]JYGjʝiۉS3 = _[@hA:aC%@c|lsX)k+NUK2:e*IuFH4T[]OOYryCGEqKhAW% Yot'zm1t p]xcq)Ez͔P&r(߅vf.<$oI&RY:ԃ;X[|T.`Y3X"ú >M2"`Dv)npѥf!Տq&Q%aRGRw_ȜwL8n,C`y鰻m\C\auN "M _lgVU3ؑfሎ(~jJjY&6T5plomϨZIW=ҼmsSJ؜h甆Nw4_آ!>`y;i f}4g׀lYQe=zSǦm3Z$Pg-xd +yUlaBc.bl2c$QKVPfҋnj _ 8p/-2Bf]YgeiYԼfaou8iGkQOAPqf_f{t'lJܭ4ai&x#YEH-`u #Yw vه]N?{װ `tW\yon6* %߼HZ.YO{T EqQ˗Pzw>ӳkࢅ]|ьOkO嫙p+iBS5]ہ͇l[܅ӭC8NCeX{)iA,V#5wV;yk_zC=ꙙ?r*x !.gm^NH>Sf DsO3ړ}`TR(lz9j1{Zh5ؘ7!Qd(+- :((){6P m 1deQEHv&Pà8C3(]c7JZWCf3pK]ErQvu~'py-npa/yr@K<u[_ ޺}m-MtbIdv{UYއE*ߦ$]K܎]nP*Sr8J@t5UX7Gx ˨bcEV-"arN継?'Cd:p/&rwGIZ"7H u6hӬ~'&a<:[T쿵ٲ5x)rӘRSLw[o*!YQ$YlMs%gͩNlFf(o?A ?{+UB[w9b/eDyQDf*&PjD3ڦ>g^F{ Ufxv{m%ij>r*9BmFh"o !jԍan nop}) *c\!`8_0+sT栎]SnΏr/ɝ.(Ʉ31_WZ 7lB%vWܶTYc1.,n k"3g$ZлBqne6h [B xs7a$7&#4tXէJTg4GJOĵ嬄&\&өMAʁ2`6bTA<]Ba†hUw}TiZh+Ȅ[,߽ E9eMwI0:$^&˂UXڪ^GH9N 6.s^"r2/JQ|M:,Jr"7l{;ʹv?%*QC!ADiX:Gey"xiN9էkP)Ї݄>E; flzH\cT^*N:Lb}0SpP!v{WJ 6r{P.~t۽m`[7@LnKN),P(ׅ|ġj}('r\Hn-3܂=@q /;-Y}:7˚ŭQ$ə,\!E; *N,^XӖf(-И:^۫ mhY? uC+m6+ɖw{Fv8㱑^=dIX>( ě_}S̆cʪJHV> \Ҩ 7 @d8 Z>܂}߻U+Yyb|_Wŭ -cQWans{wCj[/-FD#'%sXP!@~862ۨV++>"PQɀ"u"6"1 Evj4MzV(nA:n]>G=X7TƤwc\[,WEL[<6Tkt(7 f7,P b2 a(XtiqPu4BD/Z;FڭD~8{)j#6mȚ6Cț8&'~&`ͩM> iQ66~B(hֶxz,Ą}xQ̟!ÔI0V:xF/R{DER@j`Ѱd ^R~KtmܓnlA~+W5/D Be9thޟa 1:d$LX~!c94fs#+KW!,EhG1I%=mgӒGp~K_+o5ҽ}%hVxBvegs hza6G`|jHy.Cb xXˬtH|W˖PQ_G8[p _pexxj'RGkN3[QUR ISHWwwǐ!;8.l*i !fwr>ݓ>N,/4[ECr~I xM;5jyDf:cN֢_י Nɷ&R*&D&T /|t{_K4_yqf62^c4tA^ "]\oiY䕋|hrɰI)]eM=_l㕦,SqGA /]I 4w1hw(QI3wIS_A LjS7Ⱥ5wWG[爾^ IUԐ _՛}&rq`a aY?!(y/ ``<63qbW%Od5 0JͼrgQno(R;yOA#1jӜ`뚉'%j¤YM@N9Kv2uSa hw:QYZJD]o/{5Hp;PxD)[vj3D잘i9&H1]*^LSez 0(=#S0>+E1aMyc{n~|QRMCs鱺Ĕ')t ]/`klq74hSKvrR`gcG Yr{^^(zj=8uesVI<'Ǘ8;V(4[C E͎0(.?1 Ake HQ?kwys% X4 >NjΌw}^of5^{SZ4DxE7[É!]j:[Bi@>Ӛ?=ENFi BߡuaBåi.*/euKՈY 8H{5(+DÂ+%26mVwDg f o?ݗ+lDJHVW@+#ߴ_R7M~t;iUv*I|1Cbݜep i92\|(M_pr$S~Ί`kxv/Y_{i@4|b$Z9ۉ1Ȉ5l5tD(G|"ts%V*7%ǛBkc=Pf;]8CN 9ȡ(-]yHkJGv)ҸkXsm~qAUz @@R^49㮎oIy V]qcpsyES,y ZSc\:U ;4ɁAǓx`\$G,Dw]2OjYТeU19 u3&Ԥ1NyLj(4Α+:]*mb}ןh60ڮPRKb`n$={>Xd ΩܳW#qf5$T:K҈C}OG_㴨xޠn x{$y"+/ǟsť0,&zXxY$\C-ˡؤM\V\Ū^F.s&k3X^i?Hܨ[)/6#T Y:ާE?QG0pRCv#XZջ$)E'\z$| v]T6_ˡǪ$X|84cgŜc/M9qkAv p xYm)Ӑ*%QO.C#W(c4j"t-ZAͿ3ĺ&(DXcg{r{ݘڥJK'cdFFaDZXvKj rVƺ ⠁Sɚ܌ۉlf_p+ST$G\2 GCHwiaoے&NHӿ80LԳR!+cQţijĭ+kY~]siB~etl&5`ir%1G Tϩ- g5iPZBsWDȖPUG+2#7#'Vwi,{)K*{F;:軘BSzAkMO;-dj+ЍdN YW3; Xu}U[*6xν%t5!_2m4(ܵ+Y1wQWbV{-@57C]06qvT0ѩ]73@MEaC, tZ,:S1ɵ Ϸ TI[$쩘AbP%%#!Y!9E8FV.œv$ZHB.y9{kWcj,Ccbm`Z"Ǒ,ԑo2=&dή!$X>ԗ "Ea 3dk!+>]F{,fzl0 Ƌ0*='Λk|kӵeQnS}`OG 6$7;r.95A,lA&o#uAT73N)3ὔY˅Aǹ Ѥ;pLߠXMyȣ`_[ѯ'~V3P:[F'8|#=ȵmAFts)Wzy]4w+e rа$jPklgHN%y /NۧU?t gjL:u!wS2EᣯzE?; mo)x6J|Gi< `x;BiWENMv74R"sT$_yyn !Z.8c+\ mJ>&- ]_jT^\pB=iK:<=Dp1$Ĕ:Ô _ Y" a}YQn]!JL`rՓN pp#\p*ԥg :kz"ҀܥVa#n(y.X~r=O/W#\**><ܲ?41A5 釴c8[9W,25g\=5u y%{à72~P|RV= ([V`hY9EI8 -Wn%3CqX=iVXzZdPG R}kNqGeX#6J}l#8¿ "v#4&U+#+2H8"۫;Ϝqd >2j~!ݲ\Sz-Cչ1,` QYOKT[Ze󼚝a/CQc1ޒ3=Hҫ|=CPa&#jN,nmof51#a{8SKGO ~RY]k_֬:p܈xPdøSlB"E bB2{:/CxKJ[\qEǞz^'Y0Ơ-}<(FІؘul0Ik?-gy E~mE)TY|4#oUԺ|Bk[h@qQ{4zey8o3ز9 &PŸ/k!ZJҠnGdNY0A\:ȿDBpFrR r'`=.Jؖ*X/ȋU:wT-~Hؙ5cJ? ')ꟁ._~!Qhd !3ORo}Vk|^<{2- fFG';Tq #CB;&XNSބ~ VSoW̺5w/|oo!}a9pChDK`ّt }ʨ!-a'g㛆n떽FA^U*l_g^ lԗT5E/Qe5TmQmAƝ\0UBg|je`!%0lnĠoIx m=F|v ZjaA'/H$2<|gM^~sTk^L\;q[P8𘨘+< p)'W&"]w b^ECHjxx ЖEeRqsԒCkcc0[~Y7s,1#`2j ɴZZ]Kq7la7Qhu,&DQ'49:Ood_ݍ5 Aѡ*$J'a8aS[71MUˤ,@m_iƇPLߧ%UhUi}lAf'NTVl/=wy ~烔= 1l iUўe aK^GQHi{hq!BrcEbnJx})Ptb]X)?dkqc& TJcndS`u;~Θ-"B xJ˸X K}u-c!2Q]c1~| gc*kp+Z.D?&ޟ ksƀ< ppf%…n~R \GgL9'BޤXdn!2 +k5 [ m` '2QDۯݵ/|-Xr5F!/W8NUd.>P'TR&+H$_jFEG)Oա ;rePD1!(c[qp&4d/Ts"RW ^u^;JE( ?p蚳6sϛUJS0 YOe4O^; O??!ݐO͎N'4YLq-JK!M9H טDz١HO95(̌<7.{ 2J6]A }^\1geQ#IW6 2yBHV;)@k0-!9[ohk Wg!9t̔{&B23˴JO8H2UZi[}:(AZ'x83&Bh?gF~4DSS'B=H.4qUmCpUEF+{8Ԉ fMrI}gmU>:_pn5t.>cCk4>o(s?<-uBu1>k\)ۼ eNsJmzv?6ﭩ>KD#&Q38Z2nP۲!\Ydtb"ǀ"ww@x}nc;'[_Jx>i/c2DjSLܞ#VV7!\Uw]Paџ8dj 2nV3e̪!N; & HZ\h^j#3~n'r"Y09 Tx4CkvJ¤_:HsN4'ehd`t:HYۈ/хs#eeoJIbsY^Q]uHO|:{-Y?r{?u > CD Kc^H$ )n$Z(7Y,ۆ(CRByOY ;Y;|3mKK[!9im!({smt+Ny!ԙ móÿcI,?/wו3%Z0H)Nf6|\;EBjXvR==ds**5b05L[XܺduxG}?M!8T8?!/\c_aʎ/a{>_cg Ud6O{iP?&5 6O.)~:):ţ 66$./DDh0{:S,uH} CtXTt}ҙu3=?-J6Z$.lOc4znShh#r?;ޛZK2Ҹ-C"6t*IKշ"bW0AIlNPOu' &XۻPKAŸ0磾1Oz9!/!,pr;g~e0v-:`\mztȅ4 2.(DzD9/3rs@y%Lg@iEeYϺ hV?P@ a]j=r9!Ք4;bNJ'S~fG[y5f{G@&"[(kpb9[ z$Kٙ D-;~.OtHA>/w,ALOFA{"v?1pxޛ\53C/l6]|ꂻ/jLwBəRhWۉirʩ &{|`" dm(N6>)1Z[]XHL0(qm>cQB *?\ L_ZK u*>"D.{Ha"KjSyoeAK  NaP@brZN휈TvwMuߡy$'%(D}m-C!jfI>(O@0z:pw:| 9Hd<~}-/Ev;yQIJmxLVj`i%JMߦs3.q\ӣdoͪ>tfpyG&OR!/ I r Y}Y_[xa{ Rg<$l u(IIٟ6칢\hQnEhUq[Ks1_~Y̞ЧmЖdqJؙ12n8R/VG`"^'0ذQh>#&D̠2 -xPӯ=Ӎ=`b Z?Q(֢䕧n<Ⱦy 0ae4uVQFTY%`"X|!EIo\Z/a-S%!VRvk{QܐUH_~.2|U7)E~sgϘ"va;dO7Qjm#k@[${'tb\lCռPow+%V?OPRZc9q!Sn X/v^dQ$v鞈ଲ <WnpduOZuXX埸Ͼ%@Z} OB:#&8Uge$7dnZ"[;KWx_5cIЋ@$wd. 3a< U8ͦYoVwj堓[ P|L#ښY~h41="3G.׫YjiȊf" ;EJA`;X?x4]X XXzRU[`fxW~_2[֮\xm1)2Aj]t |ZuyZς\'W&V HE$ HnqݽZbu3ԱWku> ) Bieq Sx×=ZۇSlӿ`ɬչHe^V &"UH Bf|9bn9}4k-J*A4s_6KInqR&&iނ9Ue9(l:Lbg$N(ɱR?+얋#w)q wKH@e8)B2ɮ/NRP9Ev[:{;i !^N[1G!GyxE)c\bbܚP]7$^ֳ̽6h0AS\Qo˺h]t!vkgt_\ :Xc--}M3bpC"#nyS1 8VK z~dY+M>;giJW Tlw[T2PX=PŘ_94&L+l04">w13TtY #`DOr{I%w-~-XzalP>*~ؕͨN+:٬ab@}/dthpkUHAqdԕӵ$/BYOkcç)1S׉sgS4 #vDfl2CbOδRM<`}}pu#CG*&/eEH'C&ނt~B<>ov `#>H )P`ԝp(m<>$ glW\ܪtkۥ U#/vDW!wp~_%^Bkw'+ɜT ‰8}30b/27D헕v,\F32U0g)ԌhxV$6}1־pG^mP+YСEpe;hWT y )à Uz?*$~2#rE-Zs bԣ%CcwAs0ݵ\VI;JiSnl\Zx%_ڤn8Du>O ,+c_[іJL_f"ቡ:#'ǺSmӀmUniɼ8_oM QޅZz.I%ID¡: ":z&#`qC &BeJlB"^*Tz\[1D놥PA a[\%ytM'9&]~@;F%0N"4g-[3P}]a'r)CU]k+s>wk[2]#;x yc: ddV=y0 DϵVg.u[鄉Z _qmox90"X,<, Ԧt~pya 巷k̾VA[`$'ól:v N<N}~;v $sDܤ]o$'(oF.lIHlrv M k$"&&J{Uy1$nPwJgJ rj^7BK}9HoS]n)kpr>X#LXaMLM 3vĦ>h *tm_7`QKh󎘕EZ ֕]~D(Cel^ShV& 2>At|gDs&l P:FY-xd2.`t)_#Z3*7"OR>?a/ 1;&`HA7mԀZa Ġ]ю _u*ܛx$3t-5h~.΀w{by&]èKipD-[ bv3 9y_`?K"SP*6R.EXDr! (/T2?_u{#r'J|ɏt:!@NZLF B 7X3-pvwtpIDxK5NlL@mԵwف(v^1ݕu 8䘽XrCp>эT #cMbEk3 LU1'cr(%a˂"D3ɕ~jKtc7WN (!{Tdn rӞArW>[4/ֳ,~˕ 5U1#;L7,seIqJ4]oaKlB <u]2cׁGep}NVg#\Li駿5凳6 2Bw߿-o# Ty<ɹV`"wU@;W/&=1m}Ђ\_ υu_q|9m>؎ι`vF4YDGM'g,"XdYyŢvh|xv& P* -yzL>bC5R1f튠ɀ:-[T":$Ixex/yi[ 24Ss 2/'8`L;AXWhsHSI{!jvw^BG O#?(,^xA+6 筕 qPCt*N@{Ke^j^8azo%ֶ pH67=z8i!ws5|?D+ x2$ \ U9H|qo-PgRMQ ˴ 3;PַSqRf(g"H'"MoŵPk3o\Y?U$ҡ{~} cm%ㆎPf($u532k^2bSZ]epXD&bF2}fġޡLqRuw ѻ4޴UgAH`Ր@-:z(NS=e%*!vD(ZA$M׻^ݲ&,m!=ێ k{Kt0Gr^ka Ze|0{&<3@s@EUe44M9nnRD9ᘌxNĂOkmF[9,ur5jLx{)ť-,ΤT.hӈ@9k5v_qA=zj}57 7~Kj|} =2-U,$wHeFWCfH߽Jܵ(K4N KY7+) k%UoX7(p]11RC,V!-i-Li 1$(aYHiXf3yM5Mgyp:@E}1fx) C=j VcۏSӦͨMPjB3f96bGȌx1A%9'`3Pld`9q)$?ȮJgD#aeT=v85|Lv &%B7;rj z XR|spomrA7JN)Eu2)^&osA !"J&:6X @͎X8ޥE-@?5OX{Seh+2alN@MR{x'd x%ƛOxduDT 0ILgm<ƤEEW7]t`f޴6bص`K k(B6ݿʱcl`hpmZ':X& +(.jM[?fO]h$Ѷ}j;@Rc0Ŕ<ܑC"IuƱCtaZ@)?To55Vw.)X/I4S 㮲ҫ9NY"]k\]scLeٌc0<%)d.5tYV^r>#[RI2`l$} νq~@`vjMu1.hܹaVyE?^wߓ0H6;<7>rX @ `󩣟_o!S [k\d!Š{G?_W pOWDXgLR޶y7D "ִ"~) o}?7_"]S.S`nXgqq5pLn_~% Rp!K0x. v_Jo79!+yUʌƮq@a|Qא0ƭ PbF6A(Lz(p3רyU:܁BT!HSI kjL\,te=0s<RACI0vݼV/aXlF^ $dV%Hm0Lq>F ii.[. :'`#K,rcU#K7:es;L ao:XHV{ԎsIwM7(@C]*V.\M63x@*SPS-ܧfF p#^ySt0I;֊<ҹ1I*Nc2rGzM#\fk'$_E9OqcuMCir%\3>`R5Zī2A10\7uqY\;oJiPP(x/HI8ڬ{UJ Ja%ДU h%PKkgm̌y쐲,*~+N>=sW"m(o^Ey:ωEעeMIN~1rx+/Ia+b `gޥ;S=ef!;݆W >)r7ɏ}1s,W"HStR2 hvf6PZXZWWgѲC2sctӧ쑙3yJہsX[/0ڂ4ֶUphj)L6gS0͓D#]緅+# SʬQ}ܣ"7#fKK"ν'$a_Rs %:>* Y& ^#a^$tC_''(+`ã.n(يB/{xF օڬ⦣s~,H(H7/`nM|`b Rɾ.x VwǁU/ƴ-1xu9&|g|Dv,M7bKD[]JF;f]Վs3FcӦٸT[2/TR"̡#D]g3`_KR~0K荇f_bV|L1L)5Ca{rڣ5[iEuj2f0';3{* `&n}Y Z;g|EFB4@7 h< ~۶,BxYp2פ->.Dp$&TUA|2:QuGQټT4Bjl[:*7"#@$0؇gyhαEPby)km=]vY (xH]73CLW=Ma2$.Qj],y/y_BCZ/hKj@Z^f}IYabaZ&6dNpmТjQ/t\4M(ܑWn@@Tȅ̗C8oI&I8Q"be6xueEF }Xp~ny?UF2p*>yL0:JcJ *N w)mͺ6c@Fi(Ί>du*$EGޢ!kl-Hb|f n=MV0KLHԍL0*( yΪ2wDxQOE_?|!JȾ~ʙI0R%`;ky6Ct5dJ])%=EZ'|(LdzÕGPV>g:덈' MUL$,*ZiբN::z|԰7KLՁrg!pS>^> :#*ylvq=&#^?+ٖOB1m$j&W2aدm$YW{ t]*5/axT+SujPY3GbA g*pO{&k;O0qw=2?>;7jT$E"k _idu\ FVOСc Uİ 1Ǘ!F8ڎUf'sĻ\T9l[Np6Hg&=ːHac dVdi'WYDk׃\TvҾg6(td[c0:J!Bդ o1/hR`#cѽ]|%Ůlw+3ue6o.DHf,Ɇ`+`z-lp9BpW*9/N`3p,L7%'*q-CVD@ ^ M<f"!9HA{gL[ fy*b/BFʬcz(Nؐz=B6FhM")p&֭3j igp*[CxcRy 7|M ?e8V=fH`9:F_׾h.ݵ7{u üiTXDdBZ{NS0 >ʛQW^3{Cmh;J"0ڮbdܭvz6#q LeDs\l#~s(τEH@XʢDUz[YI@~6 l۟ ˽~9,ar`N_0d(0+?TF]ad1ue &ԤH8^I rH3 ir qAtT@<`yb=LuaH0j/YSPSۋz%ؤuw@N Glb:ؐ%`~ٞЅDr.U\wF[ "[y)&H*7S';aۺMR@}#P7D ^Jez&K\`T [~fDeAI`4zaJVga#2vOhʯ0He@J{n 8*ʟ/iD:3Tt%ZQ^qkEy4 [Po,[J7o9HFH%2OV*=;9-JƒQ/jx8g[/;!#ʄ3 "f8;[2hbCը I-K? 0GOwu{C?TbaMǕX{ԐHc!;ԝ+9J?sW,UZi۵1uΌlTrW>{`z,֬C>3>Ċj9ĊaL+fp9#(1rFfԘBpzvp1=3Ңt/6kxšc\nᵭzP̖'Gۍ^N\* <$qҎ{{6n3 (zM31'S4o3 !qt2"RuhWÆ."ǒ0' 9_Vz-~ 6AG&&,- ё6I5~S,PN0x D^ö>uNQ1Lc7wNόW.Xk:ptW%\7Y] %wPr]ʊCѿ)nXM +*9LI୹Vms;Siy[¿?}ם .Ń7׏s"V2lpDv8%@Z`D+>̒T2r74LVMr˜`]u^ 'p N-#op/5D;^%B|;)[X㽤mh∗&ιi +G0/]ƨ-U!{dKvRw#+.P`$ I?SU"Ӵ8# Keu::" =1GJG"Ed;ʶ`{o˱o#A$ʌQ>ɗXD' ?!M{/s慢4.N{;$F/Pa9f>ѿV 8Y` )FpC3yl8V^ͩ;XYIHU%9Tۘ;m@;F5o X3 D%||h£ 8'xpXy[v)M$@8-Q;-(6ߧV>H9ttp.){[xmL_k9~e9Unm C?UI :~=ݟ7XRߩvd2.-FPOZ(x~,jLi]h:Vڣ}=$>80M,&kDSu0Bl=Mcw3Z:b ^8NV3Ⱦd_)(.>58,Sg%ƄW8q0ׄ()Z~29Pqϫ}杄fL->t޷:-qˤ|#bqlP݁U :ZPqJ~8"=vNӂw_uٶݯA"h;@ECXuR$]sPe<_@:+g!Ů-=[a Z[UX|G۹E풱dԂ.*MH3TԼ*HZ;Dj3Nvh #Z..6,eܹ.Ů..(tB_T|:_ÏL2~Ì%J0m5}1lǗidvM¦H?Wsq8> .xƒ]d7xTaY:0QDW55I{Tϲf(p]@O䷘'cru ] Ζ +ؚDoeUYD]z\+:?Y )5|;B`7G,mC,GJg *QYI:;#_s^Qޭ&@O6`R '+O LxȦSl))~յADVnO %F?N&AUTs> 6K,HH‹^xp `0y0w[Y-"c+ '2ikTjJ?:8~ mGy&}-ʵNX{ CqY''8޲SNB/;٘[8Gn ǏXb>Ra4>2h^dM֐Rƽ3ʶv@29Q襅;&#3'!z81>'b@ eZh2"7p꺸X ؉-t:ɴcTgr^qb*ECY.m(J52KVaLh/Jՠin6nbV82b Ya|HPl+D^JB >xnP+~ S$s:Q(#0FA#TI2 u%^y=y? Ybooj-hSkR(nƞxw@M9 vhh(͈"8&+wunm m? l_͝av(rDvN^+BAOFT8ε13: I l*^}1hg0Y&0I@ʷ OA0?`%#U?9K)PӨaCK1i# NvQkCBV5/k }'a1kuGz]&zl'@ПGE9aޞMvef j=>5`HB>WaM:q4Ǫ+MBBhQtA.XV3`j6ΐy"mjRf!aqZ5.+a| n*6~n&_Rd}gkh_.CDLfpzϪ)^ 9dlz9At욳/q_tڀ7~xg2?HíJ__OpW-}x/khLW^x^30~(7ig\sׁM) (Ah7[Z, K8j&;'yT>9|3}Mu虸ʝiװUqbN&p^c8׷.=]\ni j[$uy(oXayžg8WıIdUGf[ 47 PLx]_Dg~B}oxx!XjեsG$**0^w>DI9>1: ,ՄhW}>'N^!.. %:M:*ztdou@ u*h @eHئRWHNeVV+ƀ~2ҟ.ʯ5큍.58Sl+FQm2E M-B!/v,A jˈ ˹4A :!*!K@U 0tLq>.+7O|:4:e:Dd7.@!3Fmb1 _t=C&HhSO) y)9^)u޷d{'^rxA}Q3GW1o Ry=bxO]ـts){m92wag `t^*1+ .QR/ς핈^,N9̉‘e4!s.}[B`j2>B4f2$$UƟl\Bj^R#q- BšZc.T{-s,n eZ2'yus=Wջ4h&c2xGwmFtϋlA:1IV{TMTkBsUQ; 4YoTzsi4&W"_Ysn5<+$ x6u\#Y5W% nFQ4Nj;tļUp87Fg&?M~*Hb 6c5˲< È2Wl@W|O 0MSS1ig~n>&zc"@3/eHSZ kiRL.b>3aL2QzX?Y-OYUГPO^i[-*נѷ8h=w OIJn7S{K4ewatSO~_Ǣ8>y0y7]}0'iFzv&>u6`ĒIjg}S虃9ǎA&~**sэ=ە-.E:o|fwK _l5+YW''A`%Pfߑpr̊{l<^0;aL9bYE*VpLW%GSZT~|x`Փ~4R$6G$|P[lTvUdG狤%@Gw@ԽYٻȞ P[&kkJW3aA#UmGrެZ:+>fX &a3-/lw_+bJ$p^M; \DB /3S 327]a"K;%!1fY<҆G`=p(C/WޝަNPg(UG?#5@9)γvXiOKւGGZ`$x 5t: v%@YYecv\&3BOT<6r \$jI!!AIE9ȩCXڸy^ L"kQeyZef@`*m:VT[ĎcѲﰡa%-Dڲn"-Z}|N<]/.\V!hހ,b.|Ve#D푏ϥN )zt_x\LcS=?5Ln0ҡe n7u$7vEZP^*vMl;gL20+umQ}ucͱEZ >1ݟ;cQ9 WG\։I 2aђ}Fi.Ί==42d-Ag`>RKQb,ҝGuۄHam溤*u .t/Y^F/ɖ13-x^Ԗ1?CR9vS+2//W!c%?cPͩ ˓eTbxRw(#"ȑKeŬVH!;a|&^au24q-_C26 HdOf8D@-M lD`&JwZ~ؑXS>$%-ARh\D_CO$E*Pe5 ~OҌ4}&|$oL"i9ɬ4PBʤ >>̓1eW'#͞')3IE IUd,Fz$7&Y4 QI9y*‰?n^߸g~\twfL$y Jۋp>|$X 3̗)8%@zʝL T3bl=# ϶Msf2wBtpSg{#0>5(i))٩UV&zAnoe טgt)0y*28oSUS (8B'- i䏍]#2m*h38e׭b&`;k[ ٭qBJQbgDvy`KY3eH?9B߮@R9_rYDu SXeGImхGWmfdֽWJA%I VHښ+-ݩˌPg^a܎Zr7Q~[W@jy+}[8w/qYqRI0&8]S4]AHFxgp/W |U##;HĨ:c|S!nҚm*@x7E]-l4U slٰGNrO3>8YVёc(1mQAغzr5S*ᖬ*>H+}_(kZS^=m9J]pf'{FxʛE! G!0\&~,'5:-%x<"jQ㎵0 -WU@&;U \|)Nw8%<;~jKfZi_/ c#bꅷ N:i8bBK#=g,9͝&,)=Q*=LKvAX5u_ %\rUH{E$|7_{d1QVzQú|ROb3AUzUp6#0gbS j&mik{ӺZ B [IaF!Ρt`f&s2dŧ 2LzhWKy;CwE7G-':W=NT2\>5P]%⨏T0J2!"-Z'Mb˜ 1KA6F^Yq,.!f=VߛYE@wa?vNڲ,jikm#sIIJV4Aڝ,aQU[?sUxׁo?;w,A[]~Cj_47cʓp9ܼKzw̎ Be&Ÿ>u0sϏ~- T7{ꢇ7M49H%ljƪ\R۰muc_[Dhx(W y*Oi:;Z$1-i<^*M[[)%#(>bQ*sz븙;h=U37KI9wL匿;"_l1 )Z<`! OJG(Xot U7{x/6q L ! PXW|D^^#.WiM1g~#͈y4IJ\ou=&i$tEfөu{`'Լm2u@ǐzd%kEѬj5_[|+!JY+ۻ)pV[%%9>>3+8NYu `Oɰ8@EȌL*zVy9^>]vkwK *3Fo>C ֪C;t-=i>'CIwVq* #UJ]Se|aa>tW߻Mw}g$1]-6 sGOFg7{Edf{:ԣL '$ni¥$s²O8O?nC*?oM#~ZBKaZ+k"},71"e[塚K.J!~# rz:xʸfN^G"fuqSHmҶk e,DWQ߸sSC#swCk`Wy{γ/X䕈ސ0&{Ǟ͐=E£eip=P[ca9@fû -/W6L,N~E e1?=;(wip8~yr%,5V4x5O?J}䴥>%Nz)@^ຆ rqr3=ӗ4lU Dkqw`tGƳ`<o=ם{Y}&yoQ2XBȦ4`NW0ք&b~#<[I6!T*GUV>f^E;wh'6{Dy 6{6)m'c\ M<'0f! lĤ&`b躄=t@O6ն,O{=Vrْ8 Tcor qtq^t*cojw>%{>yU(8V@>7f݄64x7Z1uMVm"kHi_)m\.b95B1WzÝc$E|SU[SYpwYpM:Ѱ3þf&[ Mu5h:i1Eŵp55pSI ލhۗc+=_`4*mU7^=)6,9m$޴a'qEv;bQ91Uf~Tf %d .VՍs{R=rT2 sZ4.638Rέ>#(>X~CH0qXƜX$D]KmOzk,Y]!.&/7: OV-2IR=V: 3H\L)>˸ rCPz:2ȝo.y ꆆ4O҉Ŭ;r!>^2`)굾pIf:HY)99ͯt KWH =?hǘkH?#c":3k.#m*lY1c׸oIy~?f߻;.͛%G*\aCUNkJX7a~9Mxq-#q UOY9rsU7Y 2,f-/Vڱ=ǚvttA}tI2tT^B/<2?î[)[nvD,H r L7sepoW0,hZ|V[il d⡥Y9~T5k4P^S#dj-[@D9ʆC8[փi'H4|&EhE(g uOQ*`ʢ)vrʐ,9 sv2 0kI#)0\4/+ˊ{Mqe 31rAR?<)y/6YRJD^PT7!M7ab(˚2Gϑw,n*ZKpH_4=svԲ޹ľstiJߥQ*;ġ}p/cAn~xbs@ާi%F%Ž<<FXFxK!N6wXOw䩖]~fksބE=֡T)/4gPOEukQQi,֚Ay W1 tVEDD+o]r^{|hkRV)9jb?`o7VʙwoNؠ"0UOT5{1ОV2E{` .,_ 9qvϣYO!sCք %83 \;hp4 ƪZډ$' 0`,eqE8<q܌so0LȂ+5ogH {*I=|T}WHQ]\46SD_eB6ю<~ÖܙlW@r|?UsI!JƐmgk| ֯P+-JVkpLcُEIu\&7ĔD 89$?O;H6A'>iTqdL>Y]3[K''V>cx+Mt5@ pPPnv̵@ 4FIÓ7?hW Ip_TԋWR,s[oLxrYbiI60}tC'BNPjPb8)ml/d  vOPppW s&ۂ\& oI.62bQ'7H/#NMN髪Z7/[ādXFۥQ g% ?J'b,@yZ#vm#h\5T 76X!>,D5;A*%[;'y._Dy,=ؽ2նڻ+E],[vd_s4;DM^f#S&rgfC'%JN%6"8'Yp)Bu^9J/qjO,; >%adwf_Бa? vPpF}59A #T\j< B1/`[CnhW>} uQ˫ #(VꏒHI"Ozє,,ŋRM*n#;gUܫǯbWA;@=$ц!$Jo8Cf^r kbpgWڑ7wEǮ}^`1g`Q.g"bd_Ȏ|^N$=Za'y4 =P^ѓ7nk(|//zKat-Oɬ{ItP" DEzz[̜R9DGiufb 6s'vp6 ),6Ƴ ɝ6Hi|#'*{Lc_)4K߉2Ca n0Vbɖr-Xm^Ĕb8ʶD`@[lk}}P- 2n3%y&GSx87}kOjhSBIr'D[fc0(z;~^H .b8J0?m<#֬q\[ju4Gꆌ3|5V'D(pkn(BIZ8'Oa$[y`4N&rL2uĽϋO(F!x{mp!eKd\4b~%.U ƼUnDmO$I40ٜ 焢(dE=6rlGthvDd5D n0r-H•llQC068':jKO ,})pNG얢徾4s?YYyVj~RP熳?W/g"sM^Hqi yQO 8jZ紮 +E6jSYº%_n͢;'E nK]Չcփfұ?^|I户?7Sd,hiweHzA.f]̮Py&sm-2âNcbג4C !p[OJl0ɛQD=2m݁9a$A׼ΌkZRTh|+G\jK!e@3Jls3!{bqTqW@PL!;dk:۩x7tBK?[J+CpϬ?v0Fpou :oT}!ΘFP+兙#N$xnl,jqQQy:9V\KDC>0{F@]&OsS2qN>$soj/n{U( T$X M~ Zԅ'z V_ IK |FO޲'푥 oT|KNk8:zUL~pxBZtV ʹUs-:ؗXW^^0I0.ަf{UaF:&?/- wЕKAfVyh]FJ؜Ga^q 6;ͥ]0{zƌEUݵM:]&g*ImIɠM**^wfvpg4JA+ɂWsO'_.nX"acEԋ #D;{!ȩ0ό.G- W8l O&jҞȔՂiGѭiJٌd&1H)ޙY:Cܵ xgVS &ejrF&r2(wh" zCo c n1tqCv~)w"齩UϸR1iPVI3o)|X[$iG*[y|Zs?b 1d`Q .(՗ dzф/&:`%> wXK* Cw]yWi< ?2&=RY1+RDfdca(W#__.5m}t]M1*>GGjQ#eU3a,QVn p3KVj> Brsif<ʋs]8LHStlFN=y1GRʷ+Q-vWo y%w!0"˞#F0(u 2.VZ;aSìB.LqU~)8ryeP;\ˤ?oBZRX>35 kvMj5JG#A,ˆ ۿoxk`M-0IbU>x;rK] EJ!Q^ӟDu@_ĝeYqg(D{`RbLpff9>KL8|Ȭ뷵A=ag4wg},77xUl"`^yߠV*k J}s5<1-RS."-P2<@UϾKWLC@()Aqhz2w^TPp.z(B:\RYɫ$CW2&OõK>mtM tX*5M9f#m,s? TBE2*vM/CU0dpY|M|fMiVCS߉HKزjk?V; 'j{FY5۟~.^}(h4eyGО~&BT ;+P\P̟=u`\/^K1c?DLq E~"n ;t/D!dyp. ޻ǃ Y(?oP? ¤`=e߸6_g}IqVF )o L|NEJ!H1싡 迉= Hо )`>NQ[>4zth×CL߻\n.R!-O1u!JͷanX'cj [^j?J>abq2-]]*Y㔳# $[-F\i 6jrrYvmةBB\~9JStuLn`&O0vw6*<*12p'FDaaH6qMz $r<>HiSzNw߬C1S={wcbX uч{q "}`5Tbz$u=MT]>{)gF43vj mbG, Z_6@_;Fo Le\W .o3閎֋iZl^-9v_Moۼ+߫ddU<򇪰 _J;SesdM/Yxϰz,cO#.,B z6@ MvR`qwt@H܂rrS8YH.s)V 8)<̝n1yj.:uJ۱FTJ,_0j\m!v!:)mYP+Y]Zܭ.9j =:A f2pg/`ɠ:Y]tb9,%MtqQKP{a"7Sҫ.tr턬w6d[[yU-~=tlH\ziO|Vߧ$RۥչOͅ. K6R˺)@ ە%/YsDE7Оc V8][x;oACq $(_sKs}ʂoru"tW*p(KM5'&5X4u=,HmC+SHEF國]|߷$``avc63WEQH{T/9b AӐ#''Pdfth;D- T5aN%ñW3h] O⺔{QcDlE@nO<=YJh)twZ*HG+Bo'pLOlNY&6L lVTu Yr\pStZX,`xt^6H桌1[,vǃ *D]f؎I ~x12+2G%U !%UI/~ ),\}k؟kUEQAH(ɟI9rx~%.JBz;fOrdtܡXxkM/ +?oFUE1$dl HiL`tBtW?R$XG`X!?!Sk Y5Bu *o`U6ɨ4OplK~(Cen_z1ʦ%7G_O!KPldT\9~{cJc\{H?xZoQZÝV4ɦ^$u.*6:00hzd^$1flfVƑu entOCS2?bҙm9 *PL5cp!k@`q(NfEf=$+%89q&&*4 KY\x}6Jm-+JF[ os9k87^uI83oaS[_FW?zG/e|C=sy%7*!16gѴBVv<'L"CZ[V%:aAu O^Om, z.ǻfw8اU|@品 EkaR0 ~ mQOyD1sbE0¨j 37p|@ӛ[[ xS'%&16ZPb*t & }8MXћw:b$ak#WG`+3o9Q\׆O6Ϡ !A9v@&b\ X /d HO s"?I􀇸)D_HMۨj QEOPI7Yn~N zXj=x&ytcp~yphateيaRu I׊U Li4S=nq<Lw^e)%N.FAGz00VrRkc V:`#w4=[avN*M u,x^`tPCtn$$qrLCuPe]"zîS82O7UKBH vRh*l t&# -a哘[ӫ%A⟶)჌[nnA'+|n[9 4]?6*Vax[rR-lPD<Ǘ6E68~eT2:9fd۽0!0\*i_֢9sGwdc`N]9Jo7^Ӂ'W$L\ a^fAT/8ZU}:&1[IDS|/E?hB -,k%WT{YАv=E @[O0A/9pԝNb bSasR]rz`sCQ+C_rY8r*Zj0g[3DSȺw/t[js @naF)~vfHʨ~um_ԕF ޱ"d\Yȹ43Hw j ZQ>r|ֻ׃oi^˅(A"T.㤬/ss>3b[>6_k˂r?g׆'a!;l1ƘpڧnҔkz@KUb+ՊQRܾ}t7*@Y '`>:Mcz{@!x])UxL 41iIHW#)# _s#aK_pk@ ]#B΍𡯉O%c2DsYi{oN"q[(H BVu[C%pj>-7|]Aa E1i*+(/Y25j\ze޺;$XX C&V9gw *枸`Qւa]hVB|Z:4ަVOR^ʇ-}_s"|)kp+հT`"1Tso22]NPSMp\j9 #zB?,g̞ZRH4#8%ʜHErmMi8. 8 n]OG~WüQϼ9|6BBgCz(,&O}| ׌5БC 0)K "FgS'.|wUOTK迚Sҥ;Ta欎pŋ(wRpsҳ G\y(G)HB;')*g9r?4fqe%Q?7{6E4$יZ,4RgzOÊ:n!EE+28r>{O΂%zA\hq6 'rD$@]{3ka7l(cfCĎ?FV– $Cyj-x0iZfNfviC44T*u.jYxFz7̩qrUkEgv".K.P%)=$gҐݱax muףzOwJÃZ0 #b寯F2+Y.CÞkM-):ɟ7"j> &QR|B.vtԠ-ʺHAe̡dFB/%D1)"ɇ3vrXRJJPl+|xd1֫ 2]F.S>~@kYS@NHVGd|ASc^qG&&CWlZ^OBe}6Z1f!E%;6d9yr#0p۾NieɇGC V*0!NGl4=dr$3g! 5W r9EeZ LФ[ؓ$X@GT,kÖt핺ku) 3hΛe `~gA5ef) h}%bRviV#dlS$ݔpy6$'}坝\З"]"y\zY}^.Az^dob(Gk?u;9}KIFm`P"g/Xk45f@HWF:h4h=bWxƱez}dm&b7 FL¸ؖxld#!,اqc;ߟ}fm"uFWY6.GqVصe]#@f HL9r{|=t$?/rmɞ)끮' JBXګkQװs a[+=bR-[[%AAR!|炢S0o-A,= 4̃`ǜcgi3Abp6MEw H|y>gx# P̴2S4LH=mphè 7߁?'zl uƯΨ1c' T_IM*_? ixoD1 _V憓Qd esx\:^ ~!A O 99Q NI+sf$&y dCT;m)6!C}w/tՋ *W|I' v~aLݯس?[Yc.)燷.3V( vLV;"Է݄ q`rM2k? F.R2=0b9*=Yq̛EF*΂gekM i}5WWTA1/\2ӨLD0x0#ɪ=Yg؋-4T>H?6Adx')'&f-m,RFޯ/Ϯ/V-YE8ODU\YQZa&3,$ODO&"R,Cw>s&4lƖi s)'Db%,٧B↭Jà Ɲɑ\GoV(kF:!Ulm6n8Ekq#DaMSY|hMH?἖LPCĆ PSx>ҫ~[wŌ)RI RmC]ij3TRC2P_#iy]QpE fZ,sTEe)ؖvNv%iړ4vo^js1')cd #+HV-L |fs\ʱ5&KdT\G˪E\ 4ݨ|"^5 Ư*k'ESm)ˎ(H I#Sl{ JCյΊhEY,E%\9HEuQG6)0Ҷ-dn^QFh4(_ pz7ױ,Yb"grLN`;)fz,> ZPڰ]gbk^Hጳ & "m%&`} 4+˭`蟿yof]YAP)1Ƹco\ d`CkM2+%p"$6,,x//b4CZ#j q%" | 2r!eyOX|N̞cgԩ^dȳ 6qWTxP%IB>qG4ί'%=ιB2C5xAF@[(# g^]2q.ME3E7b}`,VJ'qd/ K[1GYGmQ\M]h)Q26X6\4]33 jhT;D>0>=:̽om>t#)@P%x?e5w9HgP>JS/d(#͍rߡ۟ ͢EɢNeAQr29[EF A9 B!fɐM: $?!^t(H;bAۼ] z2:<2?_J'}\qK}<}8_qOG~?p7[ӃY(׌6Ppp`'.\f.Au~-Z]28?.Ďn>@]R~˔, Mx7* 2[{PÏٟI?~aaaU܅l_2E%Y*'&L\zY7q}V3Nܲg}Q@eWZ .#Q9:[MbH\u$Xj_pGnHN^Va!`DTH<+Hl\ Uռx䉯٦ZϺ  9dD隟swUm^%Y=(]Ö!t˷-:I q)Kg 5c ʏ1>ʞs=ɐ⦥Xͪ[3~e%M=ɂH GJˉ {#VO pn?asϣ7siCl֩Q=v)%pԯUI 8d:1]|8Sɽs]j#ʐ7Xll&ZdQ :6_?}舅œ+~ɽ>J+8P"K/@0eټc}C&־-HR[ 2"3eM0@ jy}<$4v);Hcfjz)?Dٔ oL"h#ސXxt:T4.ĮO䰹vgoW7hI q0R,\qˢڊZ~ȕ27Kn6Hl y JnY7:j@zpC0A"N1n 9'ˢh5eO_ :k]g*=3+iT<#b6*tdC\l;\ Y*|I*;/3m,ȥFj*z6VɃXrk.O ޻rto ѓg+^q!!iU]:٬]=c8l.dij"VLW 3 ~1ǜ{VmYSQ`dFZrRVEpEO \[{h&vֱCqXR6 )=C*޴W\InS3GTɱäiT[* 4ڴu}ݓH"B^kx{++NZFx5"2ku]$qʢEO*||yI>GjؐEE[+z eUFkQ֓ⷊ|/NOߔ|JzZ~UfE8690=F~O2j# 6'#ɜib?Bety]/} 0+Yh3Ʀ'tAh&vP E=Yd RfC@3OJnžD# H`c&t ]uK ]tehI{{(Єm7֯\>]!xb#{&q+n<|S~y/1NRG/""kªwRH_l B'8ݪY:cɂq!4[y$mݣ#>|۵$o)*.IMDkȬr>ۓeՑe\L7 =s&=U^y! ^\K$mv`Nk }V-C [G_Qet(^Ů"K3^r= 7zyZKBKg/W5_uZ`3D9/U%k;9uՉiV$Ӟ@S|f$ǪhQ#^O)۷+xQ~A7:+̆[nu6CqV{PKK|#{pn{d q ]1GvooTIړ;%QPn墥8_zQFsȖ#w/k{q/prŭYAY۔h-IeOpAx)tQ grr{(2$dngO5-ʣXvKiJ6<8~IJKf]-ƨʧWPD0+Z@okKML;@\tV 9r̾5 3U2uɶ'z5%k-?wlR;Y[ӗ؛|$WK6 ML|;#Y0!=CCn@2{Dn8(*謚hbTϲȕĺ0'Zgxl$)1@P`O>3H0'-ςܸBsxD|S2zQwI >_9 gd9`aH.+{Ej2#5õ_pLs‚.6"^d71c81| B#(N4Kah~-ѿo6?z->8+:}~UgHHoA&RkyLc5I#-+xm =-_w;tx‘td"9EsȌjܰX M<~ "m9~;-$ǸΥyH#k2NqR2Lհd.Jl|# +>8H4( /͏?EJ;6؝"% )X.P;/jQktRЅ0%6Ot8#!픪v333GaAElF) -~ӥ*'i^ʵJĀnkzE;&Z!8_M]/CH)Z1Yh^´)|v M 6{ a #zS'qE:7=׶{ݕ 6{"*SPFFNW&lTSor'm)`bHd;HQ1*INg%1,T-pJs|RjCm,>'-In#驩BeA囃-ӖyXeee\y7f2H "K 펚lѶu[r;,F3Z)v7CZs$ }[}um_ZaAz7j&CcL M)V(y -?Tjغ r;D%2M|l,Ŀ=6dz3Cw^!OP_)6\G%C;] H^y4>x-W}U9> ;WsN;1Q[5Oԉ1"y;.@~̛/i"&Ě7=nG,"B #S\YBǢ(r0)_'ҾO)&cx=}mu3_C-Zsv2l:}Ɠvfb`ffrB] &5m$/QTgzS 0%b*go6zY^d/RՇH;Ij\M'p쎩vpCld,ˇ0|@B_{4SsK湈q5~rpW.m[ZY"D)qs(8̲!=RSF?8<ēD6 @YwJMsqTֆRfbf߾Ed8"]n-!D#a "3Fy/:|ͅV Qv9#Ʋ`u0_ɯö_x N9 OY y~R@9Љ,@1vQ;F'ҰZrL9fŽṯ>|*ݯߕMarmV $^2{L=iZ|= \C 7Hp1ʠ*ن=\mKm ˇb%ضeQf&3,\"T0GT(ZAzs_.ΏZ5{odWȊpE1-{EdQ2XC66"!ܠ3YW(5AMG;KAX K- .q<-P;ٹTeKBܼT`?s0”ZIjz>P&>Q"J5\3ևK7Rl g,xg8?GE3jYLІELW ͡K'FGn7CP{NtW %RmX:{5GU$WyF]pW~O]/ĶbwVPP7H9M>M43NrDaNڭw&*)m-'HwMKS[S]|zy 1뷀ش$I7(-P5bbZF 3& شo1#LP|MՇ١8 m(!4 /ިۡ ]c[&3RʉxKaXՆEH. ."o n4PE#EL-U?JlFjdJyl "loҸ첊Ԓ}|O  eA|c1߹ =a5 Lhk5#mZՅ ؈ϣg<=6oq[b3A߃0aI(1:IE:8Eu^$3m. trD!9K2HB(w б oD-`c RnQ&ZIT٭`Dy M~kg[vOtmxKr-*4 JCG Q5h6 l$ R[Fpl :4Wf<#>uhXFOI|\ 1d}Żrw!<7Up2ZY0uޏڭ@ <ߙͤn<-OZ# {TXDWas?+H^=//}̓6Λ,fHjν7IdKm1Dȭ:^k" AbFm3㘩|ȿStG/W $$ Os I#w+ElZ׊gq}M]T;Ӷ }IM*XG8sUgUkǕ5kQiuD蟥K2BVeS= /cݯ_799x7='mFpgi~4nG;݁3ݾ;Q\zaa,UCy1dpo!*@T~GYRefx"x(pzٌf;k6Z)_ cW)BM(E FҪԎmy}c{$Asc ~YڄBA'kT*۷r=[G%/w6E[7C-ZI"!{CAt_L憦d?YoCSV|Yglji~^ߟ *O=FD:#.`{G*=cGk|CuT]TdFWg^w8jF(@<-S+VI`i8)6[#+L8+8zԱ=v# i`vRe g73!fO730zZCraRH{5 W@lڢޚ$>Y[*]Vp6;.6BQdG0:[D&\}H'f"E8-{iQ( RQ6˿eO?/=ZCJ j>5 x;?SM܌MͲ.X0 \&BښS*#}%'ZJ1oŶʏy8խ;AslcO.P–箰vii4(cjpVCU%+9Ap_^jybzfQ#{\Hu[0,rG3g->ՋsR̠$ 2ublصTOLW[hM)mAMY'śDU#¿r< ri>#ΩP'ظ-yX]459-=Ub 7?^[vbtY]@ߥCDŽm@ I,&CR2@*ߙr5NEnrhC%ȩ2Ean ^ELgGJ}}GMQel.>SKsq.*ml4 FI.cV)-#ouby߸O]蹬inJNsuam^J1 = „S.g,JTMh%xEdD*d.l bj㖼q>`نrccQ:㱵 n>P IIjEY-)Q./p> ;:t cA#/^GAW|tOp ɕ;HV#"PK&(k*'`,}9nx4oiza(IrY_G%( v<ܛ\o8%A/;YxUPI$p[oO 6ƍKRz>tVr۠MD73F2mx2Ϻ5}ja> axdbv,(<M:VںM׬Q[h w̰t9>ݽYɾX(BlFٯn8;ٹի u˱= }tfÎ,r*ͪ>-5 23@]u_p*B$cd{SUn<}ojJyܽ9]H7}n|~ H>DlGp  ݈Zzߗ|{e60ش"C27d5Nٯ}R4 ,KF<ΐ~7s-}:XCtRËFO!-@PMkJEDSiTמ\PlsovN)#Įy}o)<#b[fisb;LǺIdV/: P{~qy V=_jS_5pOE tKŊM96q㠖uo?Nƪ&ƙr 阳%z#)S9?EO=ʺmFlgXF,h=]6W%XZ>Tw{eOČ%#l+E30woB+ڃֹwg/Cg71m; #+Uv'ž[FiJUT)}nM Sֿ4im"}o) C-ƾPNɪe  ^1h7vOjQKtec`i 1* c;<!^4_}g1t6e_FxaHF OssppdtK+_͸̅ ,%Tq9*tB?7DK0E&Rd͆~9s T !h' ‘< D^ʱoV)" 1zGwq[Ť nA;`Xrn;#;.3J~(6K[\͸Pzo)]`Jo(48(kC7GJbӣF{l AǏقmדZྣ l2ܐ@L+>VTѝs۩4q)Cl5a̽]Q p7rnW\0'\Hϝ8±>ЕgDV8ւ|Xr'kVPv9c򬰙nUYLRMjGDA!^}"CHdwP2gk9.:l@oKkB4R.= 0xuȰ Ј%>&}L,^[ 8|C(76 @^Bn55%ʭzQ!MQfՃs]vT7ָ _Srm&ڂ?ӡڭQ񻵥C'~,Q/¶>aȪl䗵~%']*'/_GdnP#DUP9}}e_8AbVI<,uä뒻0͕hAboP! N{?#SG'mYƁ+$ӝI#0ƸN #X0qK-:Ni|ɳ8l:Ҳ\hN`+<# KñՌ-XT%A2-- nJBz=gQ)3FP3>Dy9bc'W-JMM]oo"&PLK$:s$PQ7id L*,\PNE*96T@[|V+7cuOFgZ@٨ ]3FA{j_.6Ps-OΩT02ڐFnGe  ]ǀi㈖v1CK,?ht|4ޒ:ԷHւ| H(;QG@eqn gz d9P2oI?Kވ]tPRٵEm1*Ic곈e1NI!źp"V5 -ZOSoUs AJ\ P J"=s@>UM>,YCؓv8;*B$>g#$$qE0O&:||[:C:ݿjs]1XSi^p2Jsa VDIWr [@^8z~En ;N؟7KT\w3LH9g&>s'L qr؋{]v6Cϴ w&5uc PN[u_qb ^NK)͕AM( Pv8r%YT 5MIw`(DQ:T LF$G)5;(Io{- OMh]7~2AuRe=kUm!OvzdDDӏ!C"NW9V!$C'9J? 1ܼptf{0g .NlrW~F6C5!g  \":'x5Usw=X wlW Z֖A`: 'VwXNs C$rV2L 50g81M8@wz{ HrWüzC]O!^e-VRs*B =οY( "K ,ZL80P{m\.PH"ʃ|zKZc#0aTm&O QRغd F2 xd<cdFI0Ć0!ɉ[]6|Y̓ ˼hO1nfTKG;[d jyH3ki[A~c~\A[8?']'䗋dAAOS f/S=f2)W-ڥ\'sUj/ߒ/]x:IǴo8 JMt5&pۏ6|yRd\2rPT;*Bfj4t4Kh Hk$䵱SR+"c:d|Y}YCoL y`e& b逩 ߳-č01β6IWvq?kJh5`=uf:*lhX'8NCFqA-Z{0f +Dr7X8S2\J,OaHIiY`2"|,Vz-+^X}%o$p~Y&^z"uuQFR[=Sdaw[5A 9ixėRL DozldL#O)?Zs;CNӧ sϔO6Hh z+=:d)4#/51DN$+5 cKhfΞzz}c@:9,[j?WskԘ 2,!UEhn7] P(< 0653h$uv5ٔHI~;Mh-9Ap`ûŊ3Fp,gk 0G DK:I6Za'JteӓCY -k6Ufϝ#\rb4MY"< 6<DNn]<] $c)ܧ>Y uv$ π:Z<3 +GJ^D+"OOm$ݶDs/-҆P2_هTtjOg,Ęgb[n]PCkZC%`ɹ9 1{L AyyfWMxkt4ыov"~S7Hj0y>s1z9WЅ,A5|Pn|,!")Ӝ"09t '#lblja3*FiYPhzT'*Sd @!mfF.MI>vQGvkG{EZ0> +˷ A{'hT}J SLuU/9M羓nxC͆@#VeDBҺ ƾd,g jT/¼M4*aҍ}mJzSuKG>&Uzj,n_i۫ 9a8oO(` D25bWc26k3DYi܃q W#%H#Y7͂Ebr!>!{U)j$ݐc ]hF6^#ƚ) *_/3-qeK"h yEElMV2,9ߍZ0Ev5\#AF`}wGpQLJW9zm9d [7g lXNK1۷4Y6Rφ^ҹoyJ'\:?|ۚ5eIxLG&BK<{ 7 b{3ճ (&5^S:l҇z+$!(2dC[mn^RPrFY+UU0I*B_;hʾKbo}MU@ԤC]*`[xix.mɮIEE&JƋ5=N~QDQWjAm(r?c6H듞gkJݠd{e!ž̛)/\,54#DJin y1d S#-v^SmHP\6&ӝ_r2۶zb$=5 E=vH[Y7ߴ,ST+ 6 |Bh_㬚hkJ"I0Pph7 *4e>(UO=K-BƦo~{n"tÊS~X⽘k b3PߧLU-w% t/dbsP6kOdKH.coeC;|,&I"wXZ"bs8m45Co_$Siτh0=h0 YfBcN$IJ7/7[CvhADˏ=IG-rž3f 53hHZ* `d߿XJ?{Ì p/Mgjw#2s=nYcqN*6Q]V R-ԇS~!^M <-2 T}ЭRWG[Kxcd8ogY3?jytK܊r=c!QjzŬT᩵˜Ki/@ъtD*[Dz :3!Y+2 Φۤrls~ߋP?6mՍi 뎍*sO>\lOe 3::YL 7K}aEk.8R RUu˪0;,6eXq (a>6+/NY"7Nvqff̊ ȓ]g;B`V+I,k=Ĉ;Hg9 J676hp$Yl f"g;k[̌&׿ #׳a47w¹LhѣilU}E o0=ESֲvFy?WS*\!4&L ` ֣hFmL-]݃hr*Wig~0 H w|KA'|86H |~LjQ-8޺Y$K;I,KQ1zR#rR+U| \?zk%KI4zG`v̮M2oL a/rC`Rؤx5)2  h%r:F~~&B6\9[Iyv~C?H=A7? фJ 6ǐ,sy\dEk(o Wpᚵ5ufiKe+qAwꥲR@ru zD+ԟ;i-:SKD3 ' qTt%Mt_(+nl9bemBUk /w0?\!֜S:cD CakM#J ş瓆ooz$Q~/j],x;W 4:;KĤ,U" إe!}hĐk{܋f֩v!o>qKdsq}h;F98>kk_4vɛAdhYťzo[jh9.!\c㜣#HP; JT̀a}=KRg n>"},˲W+1?kfaug ^Qۡ\̇2ԟ lZ^0:'_E:| #LOO*#z7~UXOmb x  *j?`<]D|e!,H(n<'wc!ïxA:ЖSME4[>bn}drOǠ(9cN୸J@NЕi3%es('*pH55Kw%nSR?ƨԆ-%5ex[@ ׭D Wfjg֢Q`{rrN;MspYS W;Q _xg ,r4vط<0_6Di5JX6$z,V T"w)Y)J, Ø#[QdHqi AC!flT~@~Q3c-ń]$R[D$r赮841 &I, ;E:|c쨂+slD_xv3beʘ$j\Zo"'8dE`+;41 L_GKc>3䍧/[ٖ>#Dߪޢ5C1IbGdZ\a2H1e8EKw-H?Y3 f}fYA47z''bWu\RCX0L$-ZSCv CX\ۏnri$J~ \+AIT6oL=.X!&ncGupScY+C!03X|*a6a$. Fr*.^YCq1y=ڦURZ@EרHތKrr!Vjts{65ACK)}2MeGq-^~f$1fH0Airy4&y%V3L`~dqHʲASO򭁄}f]^#! zo-dZ c4Ϝ7Y.`jqЮji"eh*-42vh~&ܜk LfH']^SLҧl?îq&ȫ>ϬzFU$ i`#"BR YI1}o/cqBPkC T!ڐ(dl:O^ K lNwvjdp7`/ۅjhx`8l/ ĐMu!l.] H? arII ӿP`6:}\ݕm`M*ɒwѽg8Ǜ~ך7t]"*zS'grt3WyFQ1XV9ti`08qgMUX];<" f5"\EHt}+pĘh+׳ uLdkH=Liۉ ǧ_W+P{,(>3"I[ns,i2mC7$~E!R{„ܚh[>;Y[W"{X~a_K}8+E]Ċro(;e ?88$@E Aqƾ<7 jdA ͩx< g"4/OB& ]oo)h}&r9՝) 6rN቏-:\lɢ:UNB(=vnLoEZa/.Ci*(/fM=S6 c+9—(if* 26ne՘PlS^BM+9̥Y8zQ0M#40]GK7%e'',:<>s-7mc0MOwCEvV&`wäm^L;F{7 gpmŨb^w,(ċ~fBíɝpU-C+ ([6G7UM/ {sg"γ4l\*bF0zըQWj;tba /ZJ&\6@edև,Z9:i Ժztg{yI ^F^׎ E40?uzyNA+d㮝GgUmY)_ j1$O{&@e" fY~5\ ΦU"gqpWhHP?6/'~ťsch}s I*\)HQ@Տ\mu!-"~8O2*Fc1F5<: po"E%·u4䴦h9r0b8Z6Bc𙔰i18![D( yOB+":UQ-J}x1ci 5otZLĚ^8lEG+s1츝0LeB$֖m-,XJ?iq?% Pkqw` =B&mɨB%.b=dk)R*;IK w _k}e>9l {T j8Z^MY&1oosѧ9,jGO@ݍ"9wsq!d^ABLt쯟gxʯfV߮6,b噅YaN~'Țv]|϶z߲6=J8SN{`VUTLă4Ū,vXxjz%y #~))rf@Em42dWg iW4f9jr~[ў$& d 'K50ng&(0v])iq+VބBZN>3v UZt0KS;xN.)UqO-9i9h0Ns!v֞,%wB#M%ZESzhSou,((z~ ZR>0 *{ p ' %Ӈ=.e%GZVF*~ I&ZbHA+TKVKQ!(]#J,OM[у0:hbfݞΞiR2]==߁ڙ㨲qj$zzP>$`yPr' !T|ia͋& HoiVk@m <3 OVG,?L wkҶ-a>7؃#殔m[J m >I6 =+kKǡ [z0Ϣ 2ηYWKFULi+5ӤE>B:kEmO8Gv<+R>ȓ@pmRE] >"_ +52%ۚG 0t<%wsk2|^lؒ {..iz."aiJMFGJ葦j@-`fn[ h+B/oz}SNcI1il?R?ef:Gfdpvȥ~x 9Kuŀt(n,Z|ǎO&sGGLxd71G9RAB8"cv=yԪܪp VJ]90V!7s^ܫFVDT"rEOZ޾]8Oi$AVnJuS LӪo_La+6}*7 i3mةQX_=ce}|vHˣ i?rەHMw˪{jԁaPBԊbDߒX|Y}MG+u;\Ƚ]-d {GSh~ZZ-_IŕDtf- mX^y{xѵH䩻Uq3jaaO+fuUDR8R Wl _P;vob|ώƺsFL"r2s_p"pWȣ,ІsGSR1WRx]Y#]x$+l=aJ_ròZnoބٳMfE{\V;5Ԟ:Ȇ #Nr05qJ8W\%Nb? IHߊx$-~S,|*0f]JY|p\9v1NUyRA9n޶`{ a*&Sֱ͉֧VMFeg!m :'k|Cg3khGb@ġ9ܼ {MW{SphSŤ}T+M@G?Ǫ]5b__pf*֛cD4== J) `_hg ޙ . %R3\z8׳𶓱j8pɫi: %dG3+7I \IM`\K(i[UCsvtcwgE$DV6d;&tBzHZ,Zf[)xZ  JRF]W\G94EOfcQ^\`^#v\pSmTމywj`XvT)Zǐst3JxϏ -hQ1"HDbaԀ^ȘM c䐌s Ly@uL}*a֘,~)wEOj.o "'I?4hi^d'D@UhdK rNH z)3+PM25$-}ݬ:NW~IY[ mgV܃{غ·a̴ [ɮ$|ɶ7To)FLg%~Jưʒ3|17\Qe.s-^wDnvF:C؝Yɳ=RWɮ0*33ȹB w\ UI.(zտ9xַ@S}@ EC()N\ !M@Ntm9=qe@V*e28ܿ 6DE6IwBW?O\epB6RKx /CJJ1jI|z|8a3Sk2n rATs 4Ԗ{Hkơt:"[}G,j ݶ^%^0F%+ ƒ*#jI85]GJ7K8}#a 1 DM0) jkHh@(]r%\ 祕t"֖ '_J*l y(h !hN\C v_*&R . v?g5Tguc(Zp._˨VH[1XU@.=h+A % 7M4^4N$psRKXeRb^/]:*΄N3BktE"`))A[Pw]€g]Gr*)AJjϝ0 P/m|;*Y.Gח2}]z-SN? 2A }X SJY$PYZ@Gypbx$͘.-tObaL8iiBAHdnӒew7}ʋqJ EN׵`p6oDYGP+ }ٿS5OpK>K0 ˷\K*1R~AO I2~Am=ȘL%,rTMx ML9Uv㫠v;g[+V?h\̇WK bV)P_ /L"M4ת<2UGօg*C2Nܩf9x)V3!؎ZQדQ0iSv<5 6:<rZҞxJ"yV@pxUպP>ϿHk$nLiP-ٌz+@#Pڐ5:?Hd꾜7+V vҜP)-/C%J<ב/9ɫI?D)$G gj6+iVW8NMܹ韫LQ"fñL蛸+׉ NQ˛Ahݽf64"~p炓0@k!79715ʇgщj\6Q(L-;X:~سÇ%>)#'L,WGc1#GTlXƹsZ:n uWNJ քe;=7% (gZfNxy?>)(疶ﺒ{mU<7u3;9#%&:mGF|Rd"6"fO62QG?:j]!lYǤH)s P"=|J2]F=ЦP~J&qA˾YZ[4 ~JAp5wK<6z>tY=-3 RK5-G7 ÉIоP/r4 Dvi\QolHl9 O Ced$3ʱ@TIii &Sz%z63ŸN8}&ک淢VuzHx|8ܼ nKc)TFk쓔@@V;㊭PT8&ЛU13,["-Kn/}^ItGs@Eñҽ*56s8|XŸFs!v4|)2\)7Rv[V?D {fťh&ȥ4X{PV*HCܷT|}Nk(*-wLکf;s] @w~< T:f^O$i~']EjcpՁ1P>1W!PpgӫSA /, [h}[00%妻x9@p:x>Å% ASCf_Uz~s2_mPX TG.>$aZ'pwtu&qO$<wxg"}Ծx H~W\zvۻ;83%IL ) MnI,oϷƲnvU*;oN񈭚ƜNZ]㶼(4OFY "BϵZֽ/ヤt@,~koւY(0O[Ix0MB=}qoUH5c$Jw0:ܯ*R Yr`I'^On=_~龋,]yRƍX}<J+CemU.CB\A\@* ((Mu :T6UA]Wstm$R.x&v8hyxߎ>d)D\7)%!׹ISں\ETۺRRwôLy{+ (ͩDRR&U;f4 e97e!cܷy~/tfޘWǰY"ecpE'"bޫO? ! O*V33\[{DD 7!!уBO /󔰃VL^(+:HxVk@T-܅n>GC44YݔFm`PFjq6ݮ7Re6Ň% ܣkpvf{k B4!ʽ=k%XNZP)+ч ?'%@KOVBnDĶb}AYhAV/Z{W/%+8{swї.LPу^x 1 ~!`ӏXwT u $<\N'n{]amS7nM)NӢ$TȄ/V̥k1)~/!E3Oug'8LR6m-5HG +Uyh~ZSةq́,`]l<.Gz]ˠO!%鞡P-TeMfAmW57= Uxfrmncg$~BM(},UQ"pu{Xw9®TAyfݓ.M12$ױE\y |mF䁅,PYkghݦk t[ nAGgh^q꿠vsܥ$(j$F!x$f_z;O^?Wʪ; '^/Ƒƶ ^{݄+ 3Du3NcɫEqꁱpePw$PaJת|j qe*Q.!~'l+uѨ@-_ae4k\/3ǠRr'F#Ug; ̩0@22;\B}tezP^-NIgan>zDym'kn T{dQv$q_6KlζfnZ7jF5EVrogJ y&oˁ z"ڏ&"ESNpm~k8:l 2dJɯ6.Y? 97EH0!$QUVN@Q926jf%G}%\a;!~2Ƶ cB g$}vEat.ԵpP}ו" GasLn\~Y7M=a_\^cClO5;ɾ"?Oekj%EzЙqbQ<1t,]#2O}`!M'}J9ݟ5IJ"z%ǹWeH}Z+ ^yg6c1 V8O/-,wP0ӫW!o*p3H]%we byA#"`/N| [*a ~atKWŕ}9rҫ=.\~"Bd9#}z!~."2vXo/iTbq;DM%&7 QaqЄe&Wi"qtxdd=Afah8iy8-;\iO@zw/hVպbj!X7Rhc֫׋P"k G2p#./6~UswKi9 IY?#cG Š䛈[$j;f[F g7AEaku>!ZN/ijɺ&xo+~ڜlX}_}3Rf2Pu|@% CZfK/d鋳`"J40Iå,5V(cC{(HQ$iW0]͖U.6ϜZ(3JXRaBʊzI7?'l4g@eiX[^{ÇIi!~aC{Z0AG ˼>>%kicY#°ݎ@X% 蟱$M\ȪK͚" [tX%9XT:Ę Xa0Z#C^ehrȑ*$Y`5PfP+%ђø^s]IJ̲ }ۅOugO>d5:8#Ze O;,ݴ/atůǽzJëw^Qi7|]Cu|r{2V ߭J5%730j~KoG#T.P=\etG}3%x.sJ:`n[1mhL`\v$ AP4= 4ɏI)b=.oe*ݫFSpm6[)wW6%lgi!Yn8lj+p?V홽e,PČlF>bբMs^!4>=y\v,'ľ>Xxܬ 5< "d'[nO’irdCʈ y&$.h޺ TfIBѮ U!;0rnA+"-2xhޱ 6 lcFY~Kǀ"˸8Ig rN  {[5 RufbgQDi)T@wnjDj =<<葲HZ]IvP;;gWquκ<#Kޒo¥R^rk~-@SNǕsCh@tb[n}@z5?rK| 5%j9Y[b1OjZhc!0ֻL/16APOFXӤ{O&(4f7Cɏ^QoXW$D?ISϯͻ20#-"V>| >ornYc {1ԛ[r@TMyIǹ;.(@Y۲/0D~uS[^KY"u_c/3IB؇c[kN!:E~9^"HBeJf>Pi)LPxW4p/즭nc% w^M5E+kYx52Ʃ#GY(xٹOqZY!y 8[*u; xkF^~ѨRW0;=-xFQTcyPOڌ db*y 21_^nkc5ɋq`0Oop[i .>@"yOǃLxBSgʴ .z)P||TZ0,jB&n XL*cL}zy¹ԜtwևZ-6ɕ{~4kkU.4f<JEu=P:5]3LCMlgƤ>q7ٺȩymz$C[Fz`~9 ")t!U4jWN TY-,^]WR^Ic2g2䳢Lon~kt[ӸoZ)-j(;Gn=;ЛaF')ccA b}ѶkNmpYioHrD=#O ϗad)W<)\ڶsVLC:k1O!O.ӷTۀUVgIHzاrNv]i˥yڍ_S}XZw+UqZ`2 !T<8X;]S .,ZUQ ܚ/oT' MŨ?gq/rc[IZs9oUs+tΊ*ǭV`8@3Amݖ084q5,B }vDeC1J!tgW5~/# 1֦(qr(t$9i("7I%h+T}X})w =JI&DH0غ mǾu7 9ԞD(/A@px {$I@:!MJMbF3Zc@&Si_ֻ5}#&qwK6p/`]*"mxK&rbPonӺYjN_Eq3~j۽?zڽ-ֵ0d^JJ ~B>,eQ+i\Z 遽-Y ءz\8hO?c]:<@+pqG#5-IcՎ vHϋ4q N_ ~!l>I֥ ci-/.?U5DD|*rVbsXu"D"Q;mgx2UmH@H-rf1 E{1j=}-R:W;UQLd2Voխ;kTōfХIr|]*Ȥzo-DJyt+ǬT3#S'jłC<ot(*u$Fz/k/TѨQT~NF)~ժ}糘i*y+lPNvMC6Vcn(k]9f0yHRM֔^~ #ktr.HW""Ntl{L eDEx0=(!d!CcKJ[ou妲FY~Jܩap $h(]f9}M]!|֓"4?=1{i(D|s bj@pIfxUXpӺ 3zC/;_eE憞{`? dE$M,u>h`j= ad`1%BSnn#BSԛ.(YP=)~G5nc`^18krNmjzdI 44%]l *-i[ &P fS{K q.OJLxk=- +)NM !f*s˔FN{ΛhG!0ϐe}asum^Q`ʚhK|_%Cp(Rt,\vE![8xeYeIfQ:B~%|m#(2D^KpՊB vj8ӠP:k99~:r8[W)ɗcI {vu*EޜXHgmAӯ~S^HGt{= f1{/0|͇ 9f|y١ U:gDnfΨ\,3+$bZw6U=2$D LPͳG/D.B0-d `oY7)~ɧu;c0Wl4ò1LX$PLG'&.qab֮^ZۘWI(Qt\H(ڕ箜.3}BAߙpL[ 9TCjKE,hYu*D_N'2ٻ6P0 (  ڵQGBP嘈6{pxMZYqnd-~JSvN?¸\y8M Z8S"(afoVad_0+8aU JHm8Ud?:v^LLXF!L+x4_];RwoY{.k+&ԟGenj26w&`Cx 1>w理>W'AA5MpEˇfgC'Io/U/h8ꨛ Ka X<XAT_\^@b\)oӳ$J'kaqd #D0ie˘Τڗ2T>is5-Iĺܬ]m tAQ ! CM6r<2mGiU}mX~w=23Pޚ'V|C-Qj7y ]Oq9wD背 YӃb0e ~. }E[⹂?ǐq>Zv'`Wrf"F~[d FLU,t=ժ6Y$5J!x8`:s&Y̲eF=ZYr%PÝJM n3ѐ] yGUz-E3/S<#@'P|X m8QX!6\]dıX1b2j:??(YcLOUY[ssh *1V/_;"S 8=&M4+c])Oeg!m R1~֙l\͌4 lp, d88 4"ER1'T*h{.~,73X|;f%Di!Wk&c6.y^L|#>v^PUSf4Z˷]2|dV; ;ҍ~|)~apt&xUf]~PpN~ D1p>@)tdXϋ3u=>4%j5>R\c,E|j40^_~8(Mć'/hλe1h]yA'5^qlc2YrU RbE~>$&av _uG)z[ Ϙ3B1@`Biz 2D0ໍZ2*0\mv/YbU?&+%f?c:|' TR<2ohc>X=L ɃKsMCDzK6Nl-T ;{*F,}ܩ <{D n/u5?ۿ4U/2!DK'bM~rܑC;/ U% J5qbp U/ce;_N?gǝXt/Uqk=4d5)&0!bP}Ps.;JAvȥWEU̧(̮hO3\r~!0/tB mYJ;kHwB,*E C)̢-Z呃O @>%ZI'We7*ޖS_)-(Ҁ q蚥s0ufw;FxݱK#XBƜp5-.AVc:0TؾkErN SR"| '.t(@ٵ̚?8^Zznœ$ mSsֵԴ18hF(T5ho&5|^j_v;!>];fgb} EWj A74u{DtϩgKs G 8GX%}gpHG1WyzӑmwHG~4Ϫ:,+U$vM]ztҍ.VOZQϱ ~)AicW|翡`zvne*]&(1}g^Zvt#s|G^!_+Iuy? sҬ__U<3۴ Z0ӄ>JEɒŴg5c_&|U@0-k0ԖL*6,\ `>Q^^!R6ӏYaʛ}aGP|5K}Լ.Q[C3~p>k(i7yZk\E\N{RxQ8AyqٷɀW*<> F9yLRR[t"^]TQ,ΫL%\0׌'m3_tp eYGEVxTq/qk#Va}a8+G|pAl< ܄1yu.MR& J|]RTm=E2{$vuyi6{*^m| mcV$ҧDBɠ"3`B?Ig`ӅW1rz6HV9R޿/ߣfl.nusܐ}x, Ds*-!5 1􇉤k |֑֙Pmq+Mj 1Qyxb70 tf *s$ LueL:˶Zeԩz^u [n-Gѕm9blHdkZܺ ,ɰG\g#,YlsH$<`3 ]uTCFN&9'^ [`zgrCa9f i[7O= \LS@ 0Md}ljhTw1D4s4I!3bΥ˹H:# ® WWY0Nb+KK[{qivyջNtᅪ^~Fh%ɉS.cbGh"wqKkl_J1V|K_|׭\^B!{s4r .dfE`1&0$0Ķ&*2{nI%qK@>T^rʽL yߣvfՉ Qih2uh!5)[y²+3n4g)s @A RX{M%] IN**UdԬ]+ޣtN樯-Qf;*p|Tu*`AiVf$Srɛ=do7M9Zdl nH6fe1 !-'+Y^DM ԡ^:ݗH[aF Q2&TtZy!JvJ~䋘G8H)ýZ u؊H|UI]ÿI=Q/v齩d ce[bNy2Kg`+y)y&[ʨ}4CH3_+2B uU}#SJdg@'ndeu};#f21)7f!@sfu]EtӨ:"W>@~Wzbh_K c|``y=_$`21Bbj`n9Oy@SwlDI 6 Pi;b|9r+zjSkO%!f9&9b$]*gd4 31Ki"I+m {* A*Gx9;l_ܩD6qݹ<6;I)6sK.bBs55@(oϥ`fwI\a5gV ,:uaC=WC)k[ı7SN yFBvj;#.F,X)A><7` ~5@n[``iŗ{u>3>] UZq@g˒HO~i*Xj6 ׺/~`23KӚ;+>C:G:;|'ѡGQ5UUXGqʿ?c8 ;zuf+205D9A=T5qr|%1Hn`Lpd8}oVu(h}ּIfbf 5DGw:9q#}%g$<ĵ48!nhu[׷zuqq鵴/`Y;&"Z~ta^V{&q5%cG XJ8ԕ& [yQןgJ].yކ{5۩?ĦeL'啓9vϏP^Y떷E&~R&\<ڍVG,BuY3*OG~uMgCP]jQc]OmrP.+5ח 0ͪL{L/go`xEb(p'<) ÐXxz[f BHF6jv+}S+h[Ɵ.) moM ک73猓1ft)`~WZnJ$.{:JϚMQjs{b*V~|A.7pM'xA&.Q} I@ NO) dv\a3>՟>W=2FA`𒙔\2m{V<'N݀=yc061LP'RϽ<6 j5x;U9x! Gla1S @є1/[{Q5rX+.}6WtIL d Ob˛H?!h#<_]JV[nbfNˤWr`O%q7CwoýstZ<+ʄWeŊX9#_ ɕYn'3 h c+RdPǁczo@.= G_h4#\ Ӝ~I\nÙE#µ׻lOJӮ`M[HKiqCKo-0pGe$ s= 4B9]G(y"{!34fo _(Rdˣ-8N҅*^ 9 RQlbe9vR_asV' #;F}Z::o6CfA!;y-h{ҋyeOIc |t D Nx˿Ym"JF#)ev~&j/o ?Zm 3FDʣ/sF/iG8B.S%8[X0HD&f!DUN!y.!(pVBς(4In.U1fTpHBRKKM!Wr[@ېYQrn$%zYޱ%N1!bmg*qwtA0@=ua9X%ĞcR} n=aV}GY a©?MSQ9čyZ8+W)uW HJ3^e^,&w~Ӗ >VsUh|jhm5̻̀:@gѫf- ~2^wzyx BdljN^dyjIԍ̭Sv_$PtЗPCzE_|EyLu"D77Ճ~u{_Kc}#Z8>;o.F&sXg+-uwdEJ&דD+BmYF[M ?jWL3m,zR ,_=kx|Gb(d\1"^WUdx,g;*7jd7.DD"{I4?Gu% b]0 _"n*_͑YG8ⶲtѹ/BBn:-(^WP>|j'o"^rg -BW[vu^iѵyFr̼MMCGBRi+qFHKO0H!~xkf0;aR ۩h'<'P\(G n ݽE)xp9ƫpE繫)A=ke)S<<$^}Bhk_hlma6X}}lqG[fb{x[sz E,DBI_@mτ&&T6F/"ݻ: ;Hy-zy(_2ov*!@,+/clB:R N3;("붗gҸU f *"LvYb¨pm:lKsg5ݸ.75Rz1$@\j%z~osԄOV6AL0w2n?S`UD3Ζ`ÿݭ?HR?O{1J^ޭ^v} W$|zRwt9lǩnXG{]anI~3#-_hpj}NUݴG-W WxaزB9ҢJF2+y0G}RwG9Iwy*ms+iT UxZ& `Mh[EE58T_" nj눱\0 ݎDg޵Y{b@,bYIbM.9I1Jeςe +'k1&ǺB IB\|cNoٮxMg562C8jTF K'v /B'Tgd ;"&O*{cPG~ 6Eb nɽ.DE.8~TQ=Ȼm/hs-bWnq[?xq#ngAeuz\:#d$?qոf-'ll .`UxboC-&JN HQS.o0Q:޸W՟6ז4hܼ:Q(vPEʢQS7 "ԏH(˰2p9,eu۞BXZx⓶osfn *ٴ,e !Vͪ濛\ɨYhWBX}`hS̄xaV˜[(.H9I߃{m# b߽i^羸c08 F9'4YE0 uJ|&Cˇv:W8u?@M\< P0ӟ\fe• JސC35#z-} $ Y:LlIV7`r)z 1E{5wyZ׽dxBV]@NسY2qO 6EBI sPm/ȯPh1bLs5S\uuAGZ" 2QP,pq!pf&dZ~7 Sȇ `l!eH2ч|s&+TFn]Q~]~ȮbY OkK^iq$>mHVHB%)\"49JOUϘP8]U~KF@IjunJ(@aQwXRX0ςvV9`ghzF<uY K@k #Ӌ5ϕ cӜgl;a<.'F74ezS^q64)& pJaE#ߤ%f<"rxic+vl|5>s2&h^ 3jofB#Gncڧ:Cs~Gy1QheV%>!'R#K=|wʄB3A>@ڀ~BCQ=4ݚwc+dZ͒ΔԊa\SרaJ>>I0]`p pֱZ~(ی=Fܥ*G&C:N06BhVk:;ōL6zr:+O5kٓty}˨Ya#4.>Bz0_& E802.JwBEx(;s f`3h^Yn%9WL0(3E(nq5T e!дyxZ 7aF<&H"bȺȮx-:3XoQy`+8 9czKLϒT!1gͨ_W|ʭm;G[5$$=6v(K,"cguL4W!іr #>,G.-)&M @+tҳky\*3I:h)?_6=ɽEДg?rZ^T&"HywYZ-|`,>/1:Zu^2*uMCF^8^*I8/@Ky2T&ځiϦl] ':R7PE2 i*nk:Pt4Bńn 9#U)Sُ:ϲ͞)>>9TZXRrM*^)k1ƙ%*dڣu?OU xWR ^Iep$x[\RЋF_n:Tu@Y5wn2d. ?|P%8FإpQxp ^Pt`&WϪZ%ۨq]JGΐOEP w54m*CN#8uW8F!alIN˭-odPŜ»+ǨQ>j1DR&"޷Q=_[΅[- ~0!:YLm1r>)_ z?Ht eM< ZDG_ZT$dx}|J]ްhDt2'Qtd^Aqс|5@2sL8Kob A ,|>W:c"`Y7}Ƕr_q!wu!sSOc!G6U e|jm/DgJ@Eu Y>˖7=8R$goy]zYq!y4=?|8qPbIAf-NO`6\:rƨ"Ih;6B7DÇf2J*GL4 u/mGi .6{z'U7cQt/3v`qYjǰ4E p<ߜja˅@ko]EVk^ՃuJ;|J 㵴#y MTn|ȃZ_"܁J/ceIRCJdz b N9kw!4jl8vQ6N2x4Ҙ|:N;E7SիGT+3(q6# \ hdҿ*+XQ$DŽbhT%`QJ 69!S8XArCɆCNOWĝ,Y%ru_8vi*gp;Ҷ9[.&7O02Auس.[[,Fک]ot!)M(w-O &I漕2λi1A+O9X Q仱2.m83yHI[gfY8`.>XUfb!}x3,Tz1."CSTýA'ETj~+Bw3l}#r ;Је`4I%5`њ3 j)dHbߵc2m#uhLHo ( g!12,wo*i..Hy`1qLi}R!iBP٫¸|Փ !Ԙgb͵ 'G}Yja#{iRbN$bgd UugVb%~zOaH-f$+&HZMw{E $է6GeWFß睬[u1:a=Wh?XrE2Q^:ʝ/շ iV4Ux2FG-}] H]`*|/B իK^6A ㉩J︾`4S[Fn=b=AgDַ%WJO ᳏M+H:GQ.Bb3Qw9 n2;UcëkѳoIz$oq9b0[p$5=|ŰT56I8fn2UqX ,gDw@vYKha_T6Cdz':gA>gjX'@3ܞ{o%g8$Z3xT{3I@S6abzU:/C(=DwV>Ĩh1NU4څpbA39FFh#8iCBi8 -7Y!3mt(-5 UUrJ.QHbI͋:?})_9j=ޝjIN+hEY0ٮj \lΥ2ppբػxX h'57$IYHe-i/ 8mh~P>H #h\ƅWqbH絗FSDH rF x&l7yDI4Ӫ8jA.YV^GHsPVɖ[8K Z'2ҷH=U@/jy D.fV fCwJ3_R<*A,lC_z@O,ל!ū[lW69H*FKdws Q7ڞ{A4 eP7Cfǣ9-/ 7gԅ*8 Gɿm>u| ÓG#U ( JPz4-R绒W'̾<~W:jb]\)3OɃRM7e\jgpī yf#RCe<ͯpXskI:۵ҷ7qC='e0w2mHc 7KGb։vTPh|I,m0Ȭݣ$$nbB8Bpa9i.;n% ¢,ןթ[LY_VSOO$vSgwzʿ8bloZ.C\G7u+moܺ_vE@6XE`6G~;{t?@<,c]˂:~SN\nݢaTAQ)eY$0>es UkUJ8֦>:I160t5.+&L#{&RA&<4(Qd_Z=ʒK`` <㴍ZA"Knۂz q&pxF?1Y *ow'+EFt?/ɦ7NK`gr`T>Q @2W̗}'V0$9S躹]$)S3]CJR6r#+"a )SYCo>Z%KEk0rK8NJKO!auMsp];X٠*=V(fw.Y=SSAR*J}'SS!rcyb"pa хl턠A8궪`caXEXKmՅE+K ɞRn"`rv.)?*Z[9S{Xb7&s\չ/k6Up+|UbB)g^& >QH?s5|ZLU~19.Has(@khRᒊ+ JK7Oܯ!"0-r޵ImhCVVuXv62^Oֆ}Y# 2dN3ͺMϺ:a4Dg5ʂbf,g]l76Ɔlϭx?JX1tLD.W6:5( a-sѩ 4f6UIuQijHw6QNw0c]&!JBgL@UMĉu?w ^J'Qcm5梸K Ch9U:2;҉nw?>JKk'ps 8F߫WƭUS`[f?GJ]5=>Tƫ2+kKW|!~F ?|{|_U CjUnNU3*N X\?`+(ysNDGci'} F좳rt/P}u28*Xe}\[.rh*eQe٤,zq$V{9K|G n鯽-Z`*biyCUj]'#Z*D{&w)Kp@?s~ XuH,86CR?uU~Fe4&Z\PZCRsNIM D`-$];Y6~'1 pIZ *M%|U r'KJzH_kOQ G垌TD7.G|ɸ}]|ݙ=]`4WϷ>H^%&4*8|`Ta;X3?2(%+Dog;Q~{kDdk뀸R\n\,y%!#_IXZ^[^qj"apԫ\Ӫ~9~66H$T&N \8#ÖVj^F=Y&!IӔK*a4@ÀŇ&6zX7VPc_,]l;-4"SpDCt3V\ED4NDuʳ z_͔+3!#4g* = '*-[!$'!K-Ȍ9XA5RFeî玓TG:@l$؜n7化CiCeLe$&(Y]PBXXC~d)4B<<.e2Ձ;2Np%t()^F[0WE?׵^s*87aΩ04! 9~.M$\x^>oFE]ǧAcq xsjsɘsI|Ryy8Czm9i51|3a#:_ܾ6 V [Y1q強B~mhnܷ(#UXB$1g!/6ʦugք&*SlQr\0g݊Yل{3pՃ*K9Jlj:>ɩ=RܩnY}GV_NKgOanb<|W5c LSCW daE˝Yx[ GaQ&Cb,:KDϿ绨[t,Ltr>U`g[x<,s X`ކPnt!F>7ݹKw=CnMexP^y"6H+ uPOEoeJ_DPaQjƞ4cvTer0\;aƴ>MnW=0n%=̟5:z\չRM e{l "._g5"cML=K) qWq[.1o%:ˠQtQhd_ј:}o_瞜,sG6=);ˁt~H.:M`qCT}oF̷sDE̼%IxW^J 48rD5:&E<0U(kcK|tq6濠tAR+%HB t I Bjս!3aw:[-Mp9%M -di;R/îCOW 4tB16+0pOU.u/0&(PdS5`]A[k2QЙAWL0lO[@1~YbnIi Qnѹ܄ASe?hʗU(g( [jV.HqrD=O^gT Z ZRc-Ŭ.Ӑ:W:-lM o\R ͺԺ@ar/a4m4,C}j9`񖫗@qvsRQo޾w$ V wU`'\* P~ۉOx[ ?c "zgqv05/SP^?|Dkgajw0?V|+5V9 ݲ3ѧp=Nf*H> PZ{Xﻋ[')t^aCYk "fU5< t 'XiҍCj/ZowE3MhIpz}KW>\,`+8=izK₤*Tqk477l.]lhHk PM趙+Bg6XA:>V4\O/h`o4`F~ nN\Hjç4A7R(gFSdʫp!)R\5$_Bnq-'q4+8KyBZdj(x"- iDT#ĈS١R[*_5Pr,մbmN3v[EKxM°rK!€(0q} DvNOep/(̜zNjU~|FpDNjI 3j^z>[,gF2rzlOOE=JJáKl>Q(z -jFBX\#dhw#HMVb(sL0pC7\e0bQ(8*[K3 "3PyY4G]FGܺ6;6o;Te ]P$<ϒoLI4=yO'#"ÐLEɟܗRm!t6sx EIDѼlc*Y wQO K65A!"XW /J%Yv ƮK-Lmy*LbDLiBu{!~'/;百Ry7\g2HPͣƔ }eо^c^F@ҔЁT$,I,FWl>L65`" {#Vqtʼiv"~{0\IN4vq>7<|XM0HgL5I~iwohvNYtΓ"-VgY Y3 @ڊ +mZL:ktEUl>wcv &d&ް&(:`gOiɦ' YbyQ L4 ż(SUIIFOQSy۽6u5nZn4N89;EvH|R'wڬi$mN VXCݍaQG{`{8-Srݫ\$ih󐖕O7^2V,[TWꃯL,QαzLtp'?7B~L%Ը6f'7I(k@Jݭu PW܌??TYS'vqґT8ƀD303VVƋ40yB.vRĻ ]>V]_R!*uSz8ٳ H|Vd[{%hkfQSjeW?1+I%UUȵmAM @!Ii[ w*Ơ]8> |;]ӖxS،GٔQztoLsup <AgwUPV+PS;0(Z- PuP4|ՄZ5x f/}&Xn _7ǁC}@>b&P6g|Ɂ?[mfDǕ `˙Ѡc"F.Ra˿d9DIk51Z봾e,d.1hLe,exZ pK 9,w.3+j)_?2y8ᐐ4Zܐ :EYu~VJPڻ3ظ`{O*UX=)nSPT 9Pz- *Wr#ePR B݈]vK"`"pLK^">CK=gv"I/oİ>Pq ti;~j$0.%?^⮔=)/4czLa辁7`jɲbWӦVI1*ԕ[" HZ^ BJ%wZ鏈S)S eq_pǸ2Mus9;8 hk]AυN]3R 5,8[NGD™ac""> suf?NM:-X%akSէ_q:[ !5 8Ϩ.?8_uAqPr/CٷUz,*wJEoH+|J7 0N ˼ ">3)~%vM.$PFץki[.2{$ۑ+'d21DY8TjqC͒Q~'Z8%u`'fMV_[eh% 7uݾvRp6cyc =?YqeuTA{ד_t%kHXJտt,\\SJ^ 9/ɦF=ijIr:st ;y+Osm`kSq*_\1Zf54|NTW[ΛxmqK1+0yU!m 5F(g PHNWOY/ؗ iH/:(E8(_s GӺspFUKO I)ixRΠp(4)(nvx'!q奍o /"M{4Y;ꀑ2F]Px_ H|ZB۱H7[~m5$Ux/Jnh}kX!C9PE < N6.udh#/mQy2|N LfWy8#!;Lcwyh4slk r>`ܫ%ـ{;BX+LQ}I$qйZ -_U9\ރLZ[˜@@1 ?BOض_ҘZ?4ä!h/z2#޽՜\aʠV%rޘו|/ Ҩf*ԃG#]ҩ bYry Tn΢A9`$[8K`z[~M|!'\EEnJ+Jr(8%,C:@oM]XDyѽzHyjӄWaW!~9<ʇqCz7|\s/[MsͷVΚ?Df^-fӗk" !a$$]sV)fҹ1;*SS AwwWLss_ ln vCV&ˌPȸ> fn 0sipb=5Ghh#4P_pZM|Wjh^ű~1&LۄŜC{>~ *䕃!Qi12bPY  UnND zIde BNAQ ~q⌓Z";_{ BSo$tV9o(@!w- l2VGe /RPj{%A"S ONJc)s!'A|#C1ʔ겢Bnx)O$YB X(>QTgK&g=Br9x!kJX4}yfUDІt 8)دPRNu\,jٚ$ $tDe [<>+2BNuq+weq.f6 _l$1|)Da]fs՜|C{{`gxKF" A%'S%=¯Ixlqǃ_uhicD^1,whّ:4߁4dWF8^qOt:s9އ0<:# vuNQF"EнQڹm!ND֝a^g9{/V"9ezE-#6nii<[tq,iÑPKQ\@`oLNB!`ɒ`毠s-LCe'D>5qp"$փ }fJgйe{vMocpxO es̬Q22U4!@ɇmZCG`|TNܨo^[jq}@+9bIEG=2,!(kѬH矅(A#ۗ bZͰa>=0FoK WJs}#]׼l$jBNҫ)؜]p#uxvA4둏g# ,9j%Ɋ|=gT FD3SdGBmmi(~D' Ep™zo^o &xZk1K#\|%ۥ)9Q KMQtD@ o?4u ]4/[ZTUzv,W9vZ\ qwF2pCUYKwgcR*O_qLwuOl*ry/&8ۢ;޲@OHƛ - wyB0 Jo=~5Exlccp@]>yۗ8hO\ƬnD;#sClOIܰʟLh5Bu>S}O(8K9hKƉyY.vK"B8@iQ Ht`jף\}):k"!'i_cXJSW;wj1Q(1|`eLr/ŵӇ  OێZ&G#SD S* .gOJgl j ˎ-Qn]VbH Ϸ],Q;Z j OIN_Ԡ/s_Q4ǤJ%o@8i8ZŜ/?o0WBffbGkQhBqqܣ/v#)GvC(%iF̓V8REw3௕^;>+5DLq+fۛBG;P3wH2*IFLD16~ʍδ񚈎3Dn89B|rvMfZ'=T{(v'?*N|Q'jm/Ғn(h'F}ƀdM7EN4%ͽ# Sl%"OHcL.] U/&* 0O 16t|[F&{ B8G9yfeʊ?*X00 1Ͼ;yyUI&v|J2 f೙14R3;,ބ$/j/UjbwO}LN3gf09aG)WIec[Gؐ8=W+EUG\Ou7^b%Rs5Hgv(Wh.* _be͛VEv2 z^<KFr_[nUGl[0ءVU%5mP5asfb54Uw+G>@~ j4C߻ 2_FWaxM݃k- j-87%P. h ^g "ՁoJx&$ZdсH!;eq`ho혩I,c ##}@w$陯 Zheb8DԂ.Q_f"%*)XǓ79cYh+{}cȱ(QƟRU8]ǛMmk`@+.|o:.I T^nzs,b# 2e?F%=l\L89- I5ͅhF<&XpConByY͍6pI)L'H]G9 :x,#e/~oY"UцQw59HɵVhivmx@#tJFkw) aVÌ[2@HN*1]efZܡVЂ. Gtu ^ZsNAΡ  $f4H.Jw*x*"#:Nƿ t~ i#gctt^'ՏY\Ň|)J4_Jwv-,;Cs-noK4ۈ+ MC5(\yv}~%Pf"#C MM%ɹ6`!I箌Qٙ4&;m '~ԅ '7? @wsU%j~n#+q9U&.\BJ+!ҔaJYYxqUs5B/aBrkŶiF?^soA,o#:YE4Sߌ,ĀsPp;?߇vtւ%w aD=}Hu4k ʉ .lD'K@6 J~=Eh^k4fov@34.؊5"N!SԡWpo7> zP*nq/˸9PR4#&C cA#|"P}d `u Qa&1}Q+`e3`}Ea֊T]bGO VR.b [~蔖I_C}q_ݒ% EM oL'ڴDF_:  E` ^%mG X]%^M/?MnqD [!i6 $?(^.A^ ,nPHID?놋CkCczOǣ@E.iЩ,Y( ` DəǷ=ɒ(| RJtYrIAP+߇,R~@3 "ZSsOH)rަ'{+|u(͹GSx$W;%otν<DGqG !9L$o8ɯ*.ud*1l*[͜Oav__Ѧ׮g-#320"U5쑧 ceNåӉL)a*И=:sG6Wft7B(KA)-ZPl =][S߃9ͨd~LN#6[6 ҝ[7I0+>ii6!Oy2NGߔJNߥ3YT0)TP -)~|Ɇ榤`t%X3RﺒˑdMm.ԬM-lϳͱ 8w-2]OՎjt%[f 0Or'YOG򵜏j@ajt/ݗn{Qh0Hb%QbkAHϔj9*{lb4Er}A/^W퍾z^޾3T2<􍕞YGT] C죻t3Dhiw8QLƇ , Y<|fT5y8+Kln[Vr)h2uGIY^ՠ%AY#IƄHi3h=niΰ~YFˆԌ'?]:͑s1i/o^4c*1qwѮenO;l\is;v&)!hqAc)>($"`XR[{]E_)nXp_&/b<5d;Gx@b֯zc^3˦ :WQlo22 k)gM-}031*+~V2p)׃yӗB3CU^+"Zt >=/691{RBz)_ٗ7@~'JdI]R>"a/_Q &$h*O@ ]{zXL1X&^X7>{pR'L ҆G$  1ݚACMED;qoZ@1"}mnO%_kdaPi)R-ܖ_ @B=6nba$F1>0 o<ڶ pI56:%zYb6iײ"ݾ \] , iw^P3JʻnJ5 mJucU+p7E!.HifF_Om ʤ.Fz+ʉ(F^:բ$Dǝ鯎8?ws)?Z6/yzrb@| UcC?"/6_EFᭀ_k-:Q:Ĺigo;r-N[vFCA8B²hyH}3Uf g3~Mw1ߞ~阱C(%mBI,sv Wqtd$jA`ҧaTW4Bx- Dֲ_?WdUZE3,dI2w%]hSd r%1G &AV!k+ִԸdE1כx;r3 }97d,ϗ Pl5h8Q _+4Q瀢:}<Ua-B3Xڒwt +-gEh : gE@[8}t m4YMpo7ecm?øHePcȦ1„D> XZ !IX Ϥr"`?%deJ}"0l7~VOPgx7 3l3([٥ܟTq9Qt cw%6YEHяMN%jQk.1f 7>oEYy$-zɅvnlC LK:J u\8؇a/?/WTq[׷_ǨR" ]i"3 j;Q_ѕ,8 p(p$~ՕPdxy|h.SmL){Cc QD22;.>~P:{1;Aeu$D?I_ƙH<"؉ "GyE;b+V}6YijWQ\]`BD3l}*]j>FZkP$tU$TKxdw]ɢ:fdqbds^@,!]VDE':P`}-zqlXvf3S, ˠa~i`U OuS3C~H@q>:}b?݋t?g;IF9;"Y k|˞PZE6 *((~*CX ҽio&cJZ!vOmz'$? II e=f.Hȵ?[J ?vbdA Z٘r4/qa[C WW_7tBfBUnJS2-g`q cr{;=cknxG\3!XA-> _hI~kOkNP-g59ZygOq8~.jȱgwPJ4&qo0ËÈx " X֌+ؔ lŰXH^G'[tBYt^(cWWr=\h @XA'$pu=4k\+X_ cn^t%ΊƁY>''DX~6saCLN2f ي__GLVIN6|7~BV;$7t+IrLTm2eÐVu|RZD v$Yg㜘o|X#c>-a:rZ$@&ïǷ3Q'fgI6q.7}N}{DVt'았6.-Zq|[ zS|dDCB]e&BTaFr]jrQOxmO!%_!'gNw'o֛iU#ƀy) bDҜ,u`gG ^~ :8ibWcn%(Ysu xUT\JcȢy X~jTRȝ;AdWUA 0^|\GDiڱ9]tٿrמF T -4,NƱ[y1|ӉVPG}lua뿫pNrcܡO*OCr :AsP *bv#۞g~F 7؊h7,.qL0~,'N&Ob5 wURđzntDKEVN6gx>m+\7z*ɉ 64DѫV+l*Hg`GN06=rEP62|A YXayTj-4F<1j!C) ̖NպM3U?Pc 46S.TE? ҙR0w\wy°<C:=Ly~E SET|n'я4z.5@1Ub$,aٲ[hrG^5cjkT"?[OF@Kޮ4DNFh@v5zQ^V>y =7h9=%|aHoB SkvzDcpn0ײkg!CLt1IP|lgkPn'YE `8qlj@s(p:7 :\7 sepQF1%eZdc:…\I@N쨦#iDAtq@N5'4d`qׁ7 I8} XȡjVy6h{QoORMOs(4lU/ГO=[]k3̲"$@;VoJY߀z!bꨮL1ht K%'۲Tf;.KFhslP ZRZPVhL,It7>G%Ac"MyjLW2ܮ% u: 5brT~4ġd>b`uHG鼺yKC-FƘ/֜&F;:-,u!*w#dǰEF)@,tbK WwSez 'ѤHU8D6Ŕl=N_Ϭ P'Ubvw#MzDCZ+vk6_%/tmIDб,-G[x)fdɞ g~xbS …:Tж4D7 E^b wJҸdP;U7Mxkhs% *B~}4SOҪj08vU!"I 1GڼAQJxJJw*>2O^ %0!|%WZ(,ZtnE\Ns< < 'b-y>Rd߻(Ϣk^p[_{ ;S`.GǂSN!QWc;lyR_K'vԌN `O=XoFs_BS3rQK.іYp|!P{ƞtSޙ2uV"XD\<8TXmz5[ 4ҰBQ۠3T!n9FX/jC9[.M,&ʼ#ͱC@ςluɹ;-@{g,/#L#›TC11hH̤ _ yŁ8,.P5 nLhӜ#xQ.UQ !6Ũ3b$aXX>%Vv|*ߋEO_|_BE'ʧ%nT~K|yC7ߗzFiub3YJ[SujǮ{9+V٥5rK+p /!?t ʬ|m s4#RcL{ 9Jw]8K9O`Q_bT]P.I]'MFUp&HZPH64N5 #TVX^T]DŽel c~cw#E \WOkOx@e@ yѳ/X4 E [TfFjrd|$i sYt ݝ_OpSe2o/ ={i/})dYm$lTsth{c( /8LXB]ƍxUz%> Q8< o{4o &HyO~PR#z;ǧ ʥHLzzD{ll+y%lb=R\6mF߬"9dR=p9 :(@ʱTzN ߠxE"2;)/B#q*d(Qht"!r,{]R+vuo ;V^c &,ZF ;sAk|nᶐTNW|! F%c.`%C0 g3s;Nl03 _HΖN3Y <~5u%grG:Ȑ ʺ;&jz7cedk[)tTKh?Ym s)8 ͙͋m$=OHBe3K bHєKe :*,ub e0;u(p/\+f%lԧ5ԉKqJXqׇp-!BޔWw>dg|lz]$ëcwĊ^4_Vgt<܀_3b?ТmSI9wwK.Km5" NbBV\6+5 ] Y&HP M& iْS !LC> $T`+ء/[GE2=nCk,ăiuԗ}%p.ĀU&XXEgH'dKyRaF˪aigs̲dt`$WZqEz<)xVMI6N%;`C/dwpWsXЬw]< j&i/Ɖ:E5JK<'׏Bֈwp1 OG?xQywzO(1Qݣ;̈ =MR'U,f2=<¡#t&ӭtA,xMYUWEFeG(0}+:pض(!x(|7΋| )/^j DZъ' *4s&x^RX!KJ+7RJL,%2,cku$ [8M 7ڱAA;Y m2,D.{QLHŁqSbK؇Y"iuWԋ DKye}1&O4Ótb7bȵ&S[F(O<7{.:yxd5셾TZ1䑑8hHg!ߗeN9y }vǐK&Q 1 -M kq8ss`&N֕7# 8L0ײ0qķU<~<1*]S@Bzqi) 1<FZcK:}pY[~=SUK~2͒ռ(=} G#/4&ICMr'oPaf<>QNV:Ԃi#FNɬ&IOOnrX*cٔD] ꡘL; ᒦZ%2/R4|.G *.$lτT ?b)Ƀ5ٓAFjY>&@}O[- ƚz@4M7k?cq"MP}~~'}O}W@hh4㘇}e.enLvq>*gGY֧LxwO)D_\$ ӳdaw>_ÂPfhlk6ÑL[`1(zkW}>Spj< q$:n(;_,rd-X|-QQwf!>JIv$ǭts8"CrH%+ 2vӭò5,lEG8RŸƂjOer4s9D /*F̗y3tdk 0o^B҉Ҏ+rI^ؠo@'ʏiˉ|GZj"H)&Q&/5&`"߲9S"N:#-~;0ICFQS4ܹGq$ljS8C|kYu Oՙa/ keӉ8䥋zqGxBo92nM@e?+PN*as 0-jܓI@ P'K)ɰ` pP4cAl)ȃEkz=tkD05$2v8v\G"/gͼ7F`7VN}2dkxk"W3+2-G"Ț`]T&Hhf{IC$ K>D->rTšXl(7&=;CMG~+e] Ͽpz B§رBfVx`Y.wfiҝGaDo:BǻR]1KE, NX(ЮȢZUmMgW :ABNeza;gU{b+K۞}3o%m,Аg2-Nae1li-O#DSxi':8|dΠń>Sqfȣ'><*#(ifWF$l p;NgHQف~':u'–Aˆ~18T^:6p'ԷB&Ð8a^0"e$"gU@* E'PhwdK)yp! ) PYCX綻L4POКeBPoANa .1]BYxzO߯ڟGz5*tx/b$$%{.ug-VK)5Rr/"ZށI>t\-ůţ< Q>tT+߈5O%?bwZu|t}:7Ū vBdæ3EbOd}&޷-Q*ngjJ{8ɷ]<;*%W ? td(QI`Cya뽋z\:Natڲ<~J%Ea{)N21׆N pr?O+%YH^ͨ(Dxr693!a{i"+J}Z 37R 59Lg@\z],FH"*U†*ؖhHP vuC[Q|:Ƽ-R4ν59Cltlޘ "}d0Ad,#IEK E1*%S[2˂3:cRyYBEOT$Q)<-+iw2ds d.hOOXL%(yJs~~x"=*p*TG2;:0^z>t{YL1p:vQ@酪r%*Ug?XkI(SR c#̉ h_LbwAᅻtWk&a$ľվVOwDLh,&.6W8-Ub;<6;|\~*>|R h~8 6RMAv8IpzJ-H"jS]$]+l'/}'`S^fÈuFT@O"SmUi& sʎ89GT%"5ݢoKql~X3Hw͸\v 6.JO L j2/f?cq+(O\"Trun*ْޑBfš@BɳpweprU< V{}tg}ad]qhd4(8 1+,*>%͌O|u:G`8%~0% thm-(9EaD J-9ɺ5Q/ss9+w2gئę/?=13nx(ܟ\J馯jU{o(g3*r@`Y8QeǦ#F^ŝ SiWoq.Ek}Tm-TSa3g?ϸi,%.jBɾ\qQx r`]ZBS')׫@S &<俽ѷdJ5Eg7iX+GD,Y}{"Z|-4*Ш= ewnV|{%g;*ia#t&j p) $XC%Җ({˪{qHFČZ`٧a?Ǭ$anNw1}0(U@е{5'nu{dŚB>1E׮'Et.AKt=܅"^#h (v`8uDK㡲qi K-9 7YGtgtNNZ-4/=8tm̐zC8Y7A=&C2<@KOK{ojM^^bƝI6bxnk,VM "54B 5PܑThqDyϮKVއs9TX 0.IzD1l|&1fkۉHwlRk8Ѻ\yi&SD%b5~DKMj@yX.sY?(M=hFɕ5T,+*BAeEۮ}ͱ'QG$~s2c駰^KWo,u*Ƿ}$f&HIy1FM]LqG݊VP 8BpN+Aʪh.bN&'l!{+/ u %aC^gŒIj!;".QynC ^r|r@D\rq?d4*`w©Ǔ&bݝnZ;kVvӌ؟@^"woX͖J XoNAͭkLfGLW4v:#m?dSriFkc Vw:.~# #n_z!d[ "P7.2JKlC:nrU"mž3v)R |1F? P.$Coz(K( ޳o•j(w=ӫ7U= sp6~}:Dgwq}` rqeHỬ̲quuXнMV b?~0^NiJ,G}R|f(ɢCӶ"I)߷M w;Ob~ RЄ3ҐjэY@e)dQ7˓jH.j;9p~AU,@nӨ>x#ʋ3`GsBLyKWdRKE?4@Ɋ[H >T_ܩ jDt~yɠvLJi7C=z۠u3ڔ (8L$jw{]6AɝMP>k78w*Ajkzp(n @8pK S zJyv@eYܜ&OsIted>i|>> ׵`(XxC{6'n eB맀0V`ж=v_h}d\ܯ6#4.D i_]mOz ʆ-+ Xj~:8F0`Hɂ v7\[<ᦀKi])ӗMhD.Z,Dc_Ȣ fk,-nH }vm>L$ݨ M e5PĵD&uwd\Ǧ:הaA5y"Mϒ٫oAۗ} XMj%.$9 K \*OCʕtѡO<ͦMYzX<C䑹RR.qk~>Zvmiof ؁;o 9-??jh1V,:b<Ò5),+puA dƢ=ܪ}^mƒrRϖhEE`uĞ*MYSAu/\-=$X d,',jMsHd0#t-؄XJ\!PVTvm s$+%p̝ a.4 뤧fՊjv 1`u]Fd*A܌b`ƊN|SUr76FGذj+:.AdB|K~ Gg+#8p_R ٻA>3si FhVli@?tY/raOC i ZB& [񴆏7&JP˂̒;]dYgk'\2Q˦Zvhit.֙/ޢ&LeaʵE2Wؾ*"dQ߃]Ջ5;:0\;PzA;&Ý wUn{B):X{wYUJȻMe}+ٖ*(ܠGMf;{n< ټ(ǦyI(q @3S Q$SQnSISg X$`9=#"½^B '͘5.,A}.˓3JrQȖDC/VJ,BNRo5-#Gg(m'|ɥЛM:j}cyYclf.wGFp3@YfkȢ!yֹ-V*{+Jպ("\K`ݯ[R­˲M!=ǣ)֙d+rLU"E0 kèY-_9]w}÷Vr1Pԣ닮UǞ=:{Md^,+A=5A(SYP1pSvP%OG@ל=] /ۧx#1Ɔ-aק84K5.B(X(bC&_9>HEYt@A'$Swl8 esuvTn .6ڏܧaWR~D*:D݌ ڴ~+זp[f}K/Nu+zTJQ>=JZ٨T@7gq2lMw[TNpprWà~5i@ÿ|vLuM}'Y[j{bC+r*9 3F ,`ft;UeW8\Bep<ۥ4pܘ3ݗmOrs =p] fg*&i.{F+sٶUZ8CJ2DsDx.e|A}4]J_L8?=rs׀O6 gɩWKRW`jorKS>oE\γgVxA);2BXC?ҳZ/ZʮO$)g_r>|ʦ k@d2/QoݴTVF2K  Ϋucʌ=@Ad(7~#N.o{aC)us_%27w]nPnҀX]vA92(›j Qm JkvP08!32҈$yM<ᰮi^Dgų`酐?ZXo7J?u-I'*R,&‘cLJ (9_ G'?( ~!f\"]~b2X#y -MbiU`xQ\h|v݉YmPx+::q7fPaYEF;wX *&YؠeA<$cG;3cE͒e:Y&8mwa}͆5߳^=gjwXJX|Cۗ rSb2w&xNX8+[QCZ$T|( m.E]+"zxQ'KK(&8_ϫDäxD4wבrÿ8C =Hs  {)З`װXS 53ތˈD|%͕н'noluuCPr-Ɩֵ%@LVB^HjoF! (aaH ch~Ig‚O",m_vgDzZײj.o<ljحw {eڥBX'!hya UaEa恚a;k7 eA~I2A.& ѹ $7z!|d(te*Bo9 SchZSɳ~c6FKn` mEc{Iy/{?D+>ǥuQ=-z'OY 0&F,Α~7vT,\vuKz U>Ԩ5p\ !Ҏ"h$@Hn)zKb N%lf]\viќ+xblNJ3VDe$`ui $M8p ǗH> *nZYmEMJ2W2NXy˞XPׄR\N/FIjv(]ih!%rB8e~deMZNܣ WEfizx^幒;a8["> *X B4hO5:+jz4榻emհ?]aY c1HPbQm>]1܌at߷j&G4B{$3`@UAs^{9g&X0.V@t=!8LgDz6]!CrN\w\^]Qͨ7gȢa..0Twj[dGzM޹!@2\pY+itB뤟X˂'lHP8y| h8h^WM~:}rh˼剃kmr!zd2xe;Qd;)Qo6ps K7 ڀV@LC, mHPkĸ$SF~& YxǖZK`ĉ: SvHMq 1f~7DZoy:M:tF3~䋱h['[XZ+nBH۩@W`&%tI؟,ځdzAGbhm5jei{od7{O)2hT=&5HMmLTJXb D6p%$]0&K{啥 GL"|h-.wOK.{ `9" bWnȀ&= c+m 7L=HpB{s)~9]8=2$|Ã,SZ{`~Ͱf/5 $Zpi'xRMZia"fǬ$.?w4+ 8ƶr (!O\Em2f5 `\ޱO*V,*$M#^ϝ+CQIx{$Dj@ȤI&_ u~[_x[=}>k꿧Tli ܔB6rQυ䪄wјzM% 8iy{3W.@)Z)|IKKZ-OV~F]+s@o?5}`ExVO yl d$ܾPg3y2 kn/8Y~ubX t )!N[;jN;3IQpQ *`y%S %hW`K;꿡(9a $ ME6(,F+%<)*w,̯+80kLsIvB:|Y>1lr6)fU+JxmJ1hC=Zxnd޳>ZXg3).1D_骂(\ y$IFE8tMZ>]ZFoFWt΂wqٜ.$u4p Jj{]$K6̈́  ["L3a نq26`;+x,Ķ$A,TR P/%9޾VgFЈYH^sρhq  jRJ^st4fM$BhߢʂI,⏕D 8)WAw#Hnfs- 7D4em1 bZ*I*OE˫«ٙZ 4sod]= V,df{Et`>eK KFԠ#:ZHG&""mMǾ~24hzӪjF5T;qx\5e=l#c.B'k~旲h$xgi7t^jܥv/WZNWET|!#]f>.aOU"{IN S^j9w?Тr&*z(Y[r<;Te7wļf!ho¹5M9d,B( rUo b{3ֹۨؖ1a5e=1Hs$gt[ͱ6|*Ճs1pb4EeqhVNkF:-`>+UaGiX[Ӡ@ Qr^ve:*K7Aj"7ہߥL%,m>tN#71VH)!D#y:9R I4:_ Dlhݮ0gFpXG7n\CP>}Xޒu3 #L [V3><J1QuٞJ+Tz{=>V8k[ tE"޴"F | LN^Vm,al" 8>ҥF]ʀ.3V P A4l([WeͫB=bpDCZ[rZw=]H ͏}Yx[VͳVv ~p?ȇۨ!]F>_s {xt{[Š΂%:1lB۠g)au^V)Rek!& ))nRL11Kurcp;Yt䮌?QLBn"C ! ba]8"fd®[SZSR&HUO}/P<-Ego 笮 >Bi>%ࠋWm?{չce 5D~1Le @B2=W`ҭk !Sͮx ~lӏ"nj Avl2#J uLNVݫOP D@/ᅮh /OhzρvSޚ " -x'%~Nj]kWh;3ܱ"@ W\/_ioj%Dխc1*?_p Z֝ ]B| !He˱F"zrd0."xfn\wɐ:mDeI1l)z|jO8H+_@(C~Β G9CxIہwI7N,&#vgG7t}~%(R??DR9~VT9+uYgR{;1=RjqݏpIJ]c^\Y>$bH͞_%@7"Y5j1[lcz20\Dh̚WN)2vP"]cb\)pkRџxFV8>0Y4)MExtc-& #yĦVn?'\a7 칋nU6vE]A=/w~Cn=K72SKK^ [*e&9{G:4JL ?ى!⭽g1IKUc߈pM"Y-ucBt?6(63ERk)e6ndSo{u= jr4kpbߕU$X䳤#ì`ɘ4 )$!i x$>yI٢_fav"<#E+E+Z-z#әtq&sPDQw7 9-`9^UD|C_?S)ՅR?)ǧa_fU<_\zD7M)n=70yE~2vZ}IhKMhKd:+O00 Ӎ:og,BŸ%j܀^D5{2ZN#!G/җY40?_e[Cd?г6YPx;Y.yÙT#I]^qED!i"]x0>!)kpHW$,l~tR]If]уqƅsi{%(.^yk1s)CMlùnVHVnaNm(ƷNod7NEo%of$Zyb1 Nzޥؐ CFO4TP@ic d0bXW" |Q= @kjGִ0ZMP gՄk'G=o8fΎBSEo#(H'WHzH+ lG l/]SRn6PZ A̵dW0TD̎zw [(W(S Y/R!5#lO $L.)YQb-t $Sle*9$XHžv!CrU'Y6IvOUTa+މ`SΨKK§ab]3Hʹf0`ws.4 HTLvrW#'h\Խ;[Wp5ZdbNT_.Piph/TjȒg#`{UDmX@ ' Ltn$)fq$,Eɢ_uB}TWTo) N*GN̷Aa43Ң1"Tf2kQFmXnQK,G| O2Q!n 9 F[ ^¹ lCoFJ(2$HN4E4ywţοm¹$ m~ypߨ.x/ߋ+;޸?f+y=1ű"1 NMx0-fS3NMfwT'{@2`_ x!f7ݡ1C!ȫu<(S4j… $@hY@S5בr>܂ݭ'o/.<"E+| ^e>Qd|%3;p-7p1Ψ]ؽ¿b+$'j@g0R[)jt{4~0E"? &Ge u:/D!5OvvψUz/ ~&DGAGd,{oAg m.l4 ?/״ܫA&m{0t@/,v+o8bx9M $BAU)L38#Agۙ7.$ B]P &&<ڒ1VJ Hı&; Op׋^м%: o7$QVm+$[dzI 9"nqSs+q#&x7RmA(/2UF2y TUGEr-kL'TR{R* _9>&yV\֕vJs)I{5]:{d8VUr}c~ܖ@Ŝ }?8p{්jC ٵW Lns9 #Wmqh([W?,6:9hT4wcHTW3S?+Gq=v9~%հ"x<8ݲUצU\{ Xi><++FPH^I͜ 5U96|KXU2Zc}ZSIͧka$aqI(oiǜlHj] )!VxryEĞ s=ӡV\hLΗFgE̴cx%\hC|\q%ӧGͅw ӂB Vs/h.2wkoc58D jawHpc=͹}ui)T;{GMh3?0Z%r͍#47A͓NGTLʲSF*~}YMd>Z$M/@&ol`kN9a:F(>h6Y'o Mr".97jol*?%G̭&r(F%Zdz!sg+qMx@N9s5ytyJ d}P/e<ļs w*A!߶K(H,Cc V8&B`EfQe0: r\u[݄͢:՛rݫuBȿ:7@.rg(NKf^*[Cru:(i%[.Ǐ~e܈jےQMF6Gi:ZH,9@m9n+|fa> Pcp 馘;v%BnC'sF6QO3P3FvqB/[.RegNB* /l#GGq6$ >T{Vѓ >M9,58 mT9K{P%ݷ)t$M v6 f5~Bٯ%0'pGM]H}~J8-:[2"YF|ZzʛU[&Ϛ[ VQa3$jʱj$mN =`ʻk{c3kI}Ąv9G&І Wrk־m {c*a/ f,ÖzĀPȸF6"93{ i.ְWV~}k2*sGb \PM>\֛g6fp㖴=}+ޥe"6n@YR= (I gYIc^qLw3eQ0 ~7((lPҌz\A7p\1jwJO-j$H0g>ʭ#2` he9D|[٪0H"qnN}^MT6(ꕚ'WUܝhlpJY 2!%B|ܵ .ʶƿq:Hb4c ^*r)Gta32N]4f7H *E|JpsQKB."95o_1pjy "C68NJ`Xo7,Z5 'vƺHvڮm/C|Ťfv1'Wh2 n,Ӥ=81pj օ$Ƽ!VVhyTk(@^+W"8eP&J)՜7:X>!{ C5=\$u%jq5L$QuqX^Y4k-~f$'-6R'eX#WOw]55: 7dtzhI[j-[r}D :d5-%ucw~B 8؄C>Sv).B? 1Rn׵h}!E' iA9uJzfϮ}_FG_ytTӥ0{,}:q=GAR\m NlZjjZ`{ǿ@gǎiAtpKŰ)[h3.c~GqhSĐ!|][ S4ItHZ>3kF=yK͘䜳zL~60HO{;rzT(`q@>ݿ9u>^ 04+ۡE;!Ī9eCم~}d[4<-m{b=Ҹ|gwb)tGY /Ӯ %xFM(RGn\OWo0|Q\삗 9QOIWNֹEϻH(w[Nnu(&4BpwuXis>8E5$]A oU__k, d"q$Z4zSI tNIg EUl1`" OuX e.T\gNtiESeP?׆sԈ mYyMA Ic?^|Wx>k=Bb"T+sR_,׾w Ҕ9R3r8ܟp; ~K:k?22/ٿ\7mNxQ8-!T&:5꩹zahXj;޸֜w}I7Kl!h2Wr4v`]}q}|[D[Pcl).#~jy0' N!m1RRwCO6DPyeꪸ/e/hɜ))rJ-L ۈ/] PB?Srl1f&z#F]9@*l ֿrB n:WQ=i !~7nUwYCSUZ,N 5墸 E>ڪ|6PvP!l4!!buAƈ|%1wo5\ZI0S~T f*tƺs Ųraj7R`ک)=Bah_wsb]1,w U:FS;n_ (ORz sްN8 ߪ5DL&5)Юabꗥ9fRaaoXxS5k4|j^Ŵ]z , B/0J&`qW8ߢ߾.j:JmN* 4$ Mrdh岘7U9֩r{+Q 5el"z&~v +8hS B<=|_:FO`K.rx)IQsq<͞GvRg^ _6srfik[hG?=G(jGb.5uFAa j|?ʤ0m[J|||4X !=&ӕ7F3h"Oz.yҁ'mEK_O*xBt*5KݡS{y>EfVS$kj \}.ܴ ~+ϡJ 1NK^9LQΤ;Z- ݣ'tFL5)K6ʥ"2X7rG'knDF^:j4(kpo:2͘X3rOٴ7ҷsT.[0ޅvdVV~RUqpԆGA󉕑KrhrF̷ R]``2ٓ:wMi 9ug KuM{q2;nj{a]=r0oapz?^0LLE!iͮD ˠZy{jyS@{La94fi$A1+54Nj.Ba !,ǜN^!j(u/0-SDnF@x tH<g ˑ.u|oX; e`sINSf%tvħ-qqs]OW{\dT5[әs2#x+E *y}T%SM(3`^sČ|cZ=錊;ʉw b֢7ve$ę۰\5fv=aG\ה6 ˓ >b'L'pfű醄ӛu ݄R:3O>/9FI0SMkB3^%Aw](`Bzh߭G;p1+Q,xydT@/A2n/^$E4K}c1J28s=ɕ[<ߞj`DNǣߣ.RFBg\r9ȵ>rD,=)L$-r!u%&s`ZpaLRceXo6@eط{,-Rmrvsq=:<{ Ԛ6zԏ:l~T׉ ۶+x|>g\cTQ-i: ?&uaptVt,j\cs,"TTc'BG k"ȹU6&a ~HB^`d6 b]$JXWFW΋FcO7hUWL~!SjbM(3(131Hv9 =崗a λGDGSKeETptc}EjH`:30QO0o!j}fǖ%,pٹZ >|iWÉ4oƃw.>.{yC`N-8Ao1/XHZwy2v l6~˶D-mU =^ zkRrPb1m.6[:4Zzhr=1o(i;,N3 ,4BE "od|TȬxսD/1uWȁU۪ϠT.oX͂r6$ڶ#=5C fb+[t5-i'׌#vUD \ Twcš͋F3w3 S? hSļKRU} _7lz4*WG M)T<=Xb".3.Llz^i(w-=cDj(H1Ln"U2 WYD4_7X4o<%aO%2H TAXikER" =5 h#Wd=K;~=ospf˼3>ZpJd>)>ֵX:5)bm\Q@Z#tGi '[[ ndkAY{ 8t}Vԑ<;H+{(٨s \]2yqz/caY#_|PJ:@k0ֆ#_a#S[<`v4U}M87nI蔜Өi*kN6[ѶIG4_nYfa#:O]%\7b{rM7|Ax DȪmjxHkd1E`=* %3N'ރtGd_a}ӹ:R:pGP5V+*UY;qϘ@KgTRXe=m_#X|2 (4j$`!Ʊ;2Y[=)aQ _-&,$d(x2 5 9M%;/_AbLudM^ ?hvpq@VkP1Oc܋ݿpG5mΌZ`|v-\2lzӽi6bL۝nYCt&8ZMҨǩwˆ S;Q:Y&zCe R(]%VsvZӄKDeyM`{L^0d!m*nmN#Zb&!VsDyExUoZ!19djoYU.%e4 -)vv>JQȘh}x;dubrfYZ3xAB\ zW?4 ɦʪPsP{9,O1$/ <')Mۮ h"GKJ&W,ʼM99{jO^!}h̕gեgXL:SOopGibӞJUt ݷfٞĮ4bePܿw+.@:WCP$~ekcr0xչRG!_wK,;ͷֆ^|%Й~Wt8_Ī"TDn8[U+G. dE^NE`C+]O?s̠\/wxQê~r4+F.&iaeQ\ŷfv"Z 68Fzel*PP Eb̢\iv=JZ N儿sh.CuADr^F bY2BV7>?B(^KWc> RB#CJntN,^89̗@^:'z.n!{SCi)Vɞ myIrp} q*xtM*l\9vx#}#qj6;{SK6qj'OTӤׂow!gʭ[E@2q]{4E@y;{Vmo鍄I@Dф!p zcm{蒙%[ %IEBcUb(j+$?3@W+#@SIܺGrI6W 6 + /P shk690tޔL'oM?!._](# adpml"kn#,Y(WLΊWffH{rE`C>>o봼 q?L3"oL}ZMS+5B1#^M7~ !aSFU;IHD+±(7p*Al`#I \7Tf卽 >!`eaN^ cc)TʴQv%@HC:MDEGm!-L&'J 8N ԍ=N9PH%R,(ak'(zdx  !؛&DkNVZ.ФؕLͳ KJ,zPTyw2NRqwgC.FXϵjKn5AIm}\`;)$489g,YO%[r䶨^ZY2Mp=XS.Yj>d(hAX,r1Q.A*IO7~ _ q08x|q'BZ= B0wMO췪K (nAb1Z(}0:tzTMlⲣaD> % 9tbցFE]1!Ss>O:' ^j&vZh>T2- ¹8@&B@MVs\^hۮ:*:lz]$&L=o,{:GqG#:jQ?ªycrK#ܾ5ͷ.=aPhM) ;x1 ި!$~R"Σ@(^fz6'* M/S,~mf'RX8bmm@f.Q_CY7 }QɌ0'D\~Sk^ 3T˚|5A@@5-zYt+.le<o[ -Cz;Z(TgG+斖)E}3Ma>cս5.7qÊ;IU]NXS19U/EJԈ#mٱL}Tm̒0>fi(.v)aT_!B͘D)b:}R\GZo3iP>lꓠ R׺Ԩd.ksed ($rB4ji i!Y|;ji}!iI{$i9N)>v-ק:B<"ţ{IJ8Tı,.Ԕ~2Zyz^Њ oMߌ齗 ZS9(Ԛ{ցENn}DuS26[[δ*tF sKFiez k{TQlyNM#%‹apz1? v7AJ =תӥx Ѕl(*[*e$<(7: jOax[ڍϝH;aʰ`q/奱/oɍ,Oˬ;wR?NK]`Zk:=%~&Ou{26~?o:X*Cu2<KD m Gϝs[.-d`ֿ,K*ē^m*%vg?x ԏ­ۆעX[&Q|]bc4 qҘ @tz TY{ ]Tɨ:]$PÔm aŊނ{a >[qeVJR ~ Gr) %~*9!qS~‡*^S!T慇]pjɎp|RoM$(kezKm|MJy wRp%_OXQ='ܘF ^BkHjE׾Jy݁FKNq.s@iATМ~PȘ۵J:hYTg|e%>&Y%uhBWV[_voW5K''TA "Ypa?[!?P<B KB_MD7Cpx  3 m9%S#:v[%[*CCwk\r=vOoeޫ"wD$G,_D !-NM8=U 6[_ Jh|"y+$>ٯiv[g e0,u褉H19' pOАsƾoō):H0c=$%"(T1M+iir6q80 } *}: =蠱Ke=W;?f%{t)}`C^{}b94谝$a̕nߛrFcWIړ?,3O!JT͌gT5DMnP܀{~rR1o\)U*$zXwf~YA2`ҳy]KﳱceIU1#Xoy&^)rQ=76<\7ܯgGD_j. 9IZ<&ޒd:/m=7zlg]c w#,6H#+m>XErf-ԧ!lf9 (TȦ p lkKtQ7nOd+Lz8E T08-kkkc { aM >-$m`dY/ 9Ϸm= 6=r#RrJ^,*Ckt~4̭}&MSw\Fy|,3Mu #rzof3y\F{5nxh*q[ 2ZW^= /`Ki= 1g?U;QDt=W|".`~dOFHA2G./ 8I`κۤZVT퉀⪯N;- X/{.y  zq;RY_-?T_Y׀ACnU16Nlz us[kF # ^$< "gX,!v@'ґJ" \iHMˎ4$0I)H,9y4<)kPeg R>8=[#="~ kld`i16gs9"aM6jNqoG \FMߴ hݍo-};$^;gͽDIR?jU6ʸMآ@'l.xJߧ[-owߔqZܲzR+=qL-A jsge&]U)3u=)x@CF˰留mn 6Ā80@bvQvS)!hC,7QɉQ1OD ֘rҚәtM{}n]~հe47M<톗'"2tv6o}jU@ PR׶{>A6>+l1• f>?0A0o-`׌ Tl:\_ÖmbF?[mY%'b-DPOTٮYRE7XeȌ}8~3;D(s|}cy5*%,`mBkCWx) R:'mkpD?otP2w۪C7> uQ W^E:/;3AS^A>S^'YK"ٗhm蚉aDeZN.YuFk@xoS.(}GXe")A܊wD^MgvЎi-\8KzO kKBܰr.ًKsDĢIJ?zg{\xբ2~qCvVGB!x>(mE:xDQ*t9 Kp݋a0TGNl?g,݆rǣHErvj*܉k~.y _pZ*OE ,Ri${C,lՏr>@&TKCwvӇ|Lo cgd[%Գ5J\j/58 1 ~c ϧfO|ի۹>·U@1`GXSaEZz*)(ʈ3\?ūזrfd`Ef8})s<B{ pFEo`!!]T|¾,ulq\ .F3ujhIhӌN@cDoXd;oTa˃Fgi*Qa{OD|`.x`7lCA %͝?% G #C3E0rBrNk *IˣVpYg19\$fCIc>+]Eq"4"OCgIa |҆ZYD$**dd BSWs'FR,sEJ-]4+T7xp<_ E F:Hgi.7O}HMWBv3L'7Gf!۞tm] '*@V9-ϷCpyX3!`e*kV am(Bz/ =Ci=St 8\$OslKn #w3^Qgob{G]8;Ip,xEQ} *f[\iylF3b9_iRq_l;3KK ^oԖ&ki;64*1+aŔ1 09#ֆϳ045XzDB0tDa+JčIOPZE0IwLnا{kˉxnx$WUzvDΊXQNԕ&{p ؙǠʘbXQcGT!CZ֨ТEsc'UV^`)F%+7CT"bY+R3Vz m]t$XQ TA#S:J~A.dG6XKd]4R5;-^23Tm娩WHwϒ$seLw$H0%#Wa1^FܰX|{(=JI^2#lΔD9KTY9L~Kb3g=1cE8¤i CqJӗy5g )^ٕu G?X n 7^\sh;V sި:"Ҿ9-Iϑ΍G3Tx|VAN0\NA!~ޣ axp֌q3I4{$DtJx(ZS>jO"+K5X(m XZvۺNq;M@X5!B=yW-ryt9hC!;cf Db(,Ox4nf>yūϗWɎOnpU#\g./ъ^AY0MZWvv 3*EpWs-qU;J 3׮Ӌ[va̠m/%_&[@/- s\!Tq}%PsO |:Jv;_сL0q2w+5ix^4bp , ,hkN =S(pU {ۢB%YyTՓb7+{;9+7< ,9%d/+qK$KG8^Ac/vi鱷xmq,3JMпzwi8*s̾(ў?Q6JI'_JU"_]@޺[M@."ܓ2(M1dQPF/"NfhJ'Bg0ǂxl2ۡ "WTte]7BdcVM* fo }e60W/( Ug?D^gd)H DVjbo',/$R՞, {_{2*TB2 _|uU_T}c@~ZcfV2>-3SFWY׹I2فg!Rǩ6{mfs9^X{lzhkDD7+k`Of[r;#7f-:*.}p Tu^fO\k. !ʒ:Ap@((6#*1E6cڌIDP}*|I%#՗fn8=ok!/$fִh6شC">KCSK0HV1̭C._e3Apyٴ 7Cɡ78I8tҗD+8[22jO R *X0e>BSHfws4sD({hQ.ﲒ ڜҦgUE3듗X=k:@ ~ Hdnd]A1/U!rlchHw4L&Vv-ihqrZ[]bV}K˖LB+OKᜲKڕ4N-AU3Z)Q3x-P0fA͖  Kڃl76[&QSsõ"bA]*׎ª㴯ꧽotƱ *W4u qv8k_qp  ذ8(Y>}ѢxHd .FG9Q`a+pfFLsP^Ep8u!bDЪ+#Ò4Y#C`9>v@C\H'ѾzC܄ #^r;Z̉,L׃Suf.H(O#;!t{(^SbmډYD /gٌ-TK22NcBu%:+hk\]˨{O3<9,OZYpX@ P ׊d1"*7tWaMN&sJ [f7< 5㏒!RDg͑'o"Z|8,K8 pZhК6vǭ̐DuϜ?p<4[""lW/Q+}qů3`!JGmxtl6.·y:zkAolO$e9b+o \A1>s/+l5u\!֊.QU^%O{u+_su1{`.aVP "dS>ja+'IuFE'1y~XKO^LA8>ULO-MJ~]|~P,Ua[)g(YDrɛxE~noe@s3$ohXg.]0է00p;΅Px)1wD56D㗥R(xeMJ ~3.Ǩ)O`'Hף)A |n;ZU+|!;NF^svbO/9HK5YF՞[\ L߹^ k1aF,׫L ?ޏGcnS=>;eG2<Λ֟hJoa6W:/"j6:Rr>& j{Z+TLA6EnmNa*+t^-(M)]0V O2mЃ[غ)ؠ{0)r>[!Z+o/  *s6kѺR.*"ߵ-H 3D Óa~b¼ p]b3Cbߢδ:*&892X5}YF̲dܢ[7mQ!qln_u,I̫5v>Tb/ogHY9)@mShJ * :=uۦj}K}~X8ɀj4RzF,2Ș ?c2o5>,f^ʇ?,yVLdQm -dE fið,EYxڦLmaS &z-n⽾S#?@Ŗp,R^&m.@wey'Ykݛ-c-c]/:]RlʷBHT/h#,y2_٦ͼGUpͲscnYPSsjՖr"k:fP18N*M!]]Mt=Z?W.aJr!ku_ FOs3pPO:Sc9'+x_G[erO/s^Xu3f}@cm\)٨뛳NAI_#c[ZqƗk|%t~!L7t=%dAv9,1N74?'O T3U`maJx%-){T -j6:EznAh'55 g?]zˏ9.&K%Q,3ݡ2y"a;0/I.Оbߔ37.|sAR=دJA?0&Ę(ψͨPW%`_cĉY&,P>nK/3:ǡѾn?qudHB'?,`Sy dK8s/RH[1Ja+.K0 OPPwc^4 g>aaFeѽwGV8̫ 2*AwnRveSD"VvZR_6.D״Ѹx ulh;-ͲAm ]!DX‘dޗ:#2paVWI"Au|A*'|zze7!7 !AłQݣPwUTA來k*3lzk7TQy6rɾMzJ;[N>)4>5 rU,uO҇KơOE32ؤPRWhu Ku: >I=dE`8caLwqP Ajwj襄8JUWܿh"Α ɢI ^Eòu}Hk#v3B sx#U0$UPtC5㒷B9J9ePVW7ntqoB`},Jhi#&{?H|@,"T5f98T4#nDo5#7<@ns[=\iK?w_agW-cD@Kɉt ix]#CgA0PR[!}A!( OSen<v*C났@%ӮV?Y{̥onbKޫbz c[4,_e-wk9t?OAUм6Bs5fpZ𘸊z hDI;bIڛ F <톥;I DYjiW>88EBM'5 ^:qݐC άK*zCn&/zs.NhYgR", t-CS{/PKs&`Yn/{r7#IR]jEOt{z$ha>%8]Ͻ!]wfϗ·'Nc*ޙm'oDI~.'ՙxT˓;l?[[,p )'.\Ӽ#3n$ŮGF?4dRz*P5wJh`$16-?_)R~ÿjfB<4vO9n?Wgwbihy ?Ǹ#wd pWo%r,@i8a+ȓGr5 C-|$@mqOCz?0TOSGUd=P:g\gg k,gTF5UPFIR#+iBf0pMÿh-( W(A<{7e_`\??! uJr\ oZ˾1 *%ٍd(7nIyu dϐ5V/rXܜp7.7#JOa$]oe^B3">৿FvIǐ,1~$H.]Nڢj='ܵ&D*Foq3}π  b.@Brc@ nx;J߰xT ({ \&2RQ6rIVp"X/_"ѳ >{ ,BPk1or >ݞ8ky^An4*l%@ VhIfWLbW7,"N6/`]j֧n~?0|nD28kOIwV=)ŲɁe?'^TYy/r5;Yc?&W568rM0 Kwpb&VLhPMӚfiL3?ɜ5a\#|¦'+{B[j&\9c0oY$Xaͷd!AQxz3c^y8Rk_kL%idfttE< MKk.藓gX$_uSzA\v5tfW?\9a˶%qϼ,/'y]GjAtW(%9>(UMh(6[edV`J4{Acx?%sB\`8 "hd|A"|>6fhgOkA=p]'hYAX "Эxj+3*{L&\2( nL N.XjyCVgr?AVpQ/ ̣ Zr] ډaA*B6S|e76!G\^ۋv-kl8}gpKlym!;bT_p̪eySve,J|_9EJx7KV؀o;Jv'S< r4aUJW+=i~(Ss2&ەVT9_W"G{=M⵬ƓtZ_2ݭpDBx 2ѠM{pȐƥ{A70bb8@RIO-Si}T: m" g: Gn-.n> j`e Mkfr6#%E̔Gn*YV5pi'O)&Š˗ h.V] U..\H/" a<._7ܛR0Ĩt'ӐGNxVI)|2!`VPQ^ƞ݇WOzL,(RLl\5+_@55k7֐rc$<^͈t6EGKDZ Ӿ2{/di5{$+cp5~TLa&IL8,Kef[n_M`qP߯񛖅G'׃hd ey\ ?RDtofmӅM^0_ /?U!*XP/m d\@ rl1M5@&me, ғ/bLdg<Φ{B]+2KH\0;%A"Q釣I Py}O$" -X_%ŷ$ς6̯eY$W05o "=KXjv'{ 7kR#[bvyepG ["I_i*c"8ʴk<DKhȠ'TV)-vo'=JwzX 'l%l\4TK:R8 \یL }) aEYY əEy`$FTzHސ^x7x I`ThZC3[#B#JǤXi7@܅dRYz[=ӓ^۱#C12VvzƠea0$ pa@QX0v`/*]g᜙ X0#(|]>OmM`mB"jqYBN qy4 ]跁d5`a\>'r;#!Y\~1ywh5۲d=Urtb:~$\h;ZC#7T o^* a{YRnAi■%e{yI><%Ag X* _hn؁hŎKTH#vB/IF_˔x9p<2;~q-eݠ^Q].ImEدHY.-P4X&8hg:xV,ΏUÁQ_e (ȶZ{OұE"H {|D?;gjR]NXJAnޘt_[ۻx@9(ג֝Sr%EW?0n0<WR/lϔyJ@R#wO8I;~ZURAf 6>~%zuW{}k<}3n\p;d.ʩYm>U`;Mk?0Qe} Kn/E'R HԬǁ46~ *" +&C]Hͫt&| B3 G zP;dɚ\BT ~T.jd`J?TKFvId,md~>=Չ4wK2ǓN7NOZ2]~.]AL9JPT4G^͍f>Q#!b^|Q4X!,WP<.]fTᴌ8V_rq6+Hf%$ zѽi;f6dK(0QHt&go:Y& ?r V_&]Y@\m%1KF?YLo^&b޷l?*`o(mo^n]BiGr?>M#v޽p2҄>^7K O|#x̏BrJ@7'ȭg %qimWE Ŷæ7Ax m ’U{Fx)&^XDTDS8};c feř[ e6Lt"8k})\ ૓>quD!ǎE2݋5s88bdJ=xSwRVB5hX:/-lĚCdl 1U[o,"*W>A.S-9oUJ?'g<кqlXROi76(Z~83l5١_>u(tX[١a1'@oR/P6ʆ-[5q†hyRt]#>'*wΉن` -K7._5#XmS:e\&ޓRdǪ`+17BޙDzơ5FaL~g*Zj l56צ0" Lpu ktvh$*n OJS+֓:\ҬUL3L˙O>k g{ҳd /-u48ѾS\9H.fNűZ::]hTiy39僝 >O,x+bJ廰jy ,KǨ\(죖=d(e@mn% ~J?1E~.llfSpI|0.9/i{{*g1i:(6 K Q0N.PQ$Y (V/מ_uz㔜zٿ2B9XGg:{~ E2?P8ksC懯-T2j`> Bwe2lDaaA{oK(>BBfE`gqPP,7՛P#o9?UwY۱DIE6.glA +ᑓ8i{wnW\K 7Ϛz.a"PJlq.a&C&yXRhLx@<*u9 (>]áT?3~Ȇ'PE5@AzUc90!1QP}ib[B@ytVׄӄyvFFxwrH~l0{b{$JE )X6YT~ؔ{/Aj+QOu:7'BhЌ24(GP5r\05hrGh 4[+_5'±+,]5ێ1hbbNy\. 1lQ 6ȇ'ⰘS|4Ŋ3f7{h zt/l`MR| МN ;@>щ.{\x7CʁgU֐V|O$鶒r Y߾3}P) Dw>VAgeo/^NE[H- x0k?zj[@Ù05fӫM _)bҪ$ݦlATx)E!YNN|&)8f:FeG2dMg#"9}R6I\PGe¨QEYI6 BEHScq7˲ůoh|6>K,'jκU!XNJR%.?uưx^_OUWu} WOkO\WCr^'8-;4/㸸-sB9,Lc#ݲm=8I4WEjak&۔j݇Uf9C,0Ѽ,VFA\f*-Ⱥ 4]9w,f̝Z_ {WsKTqsIc?@9p@dfl5ZTv% 2ti!/r]5pHmg2S ]4aՋcqQ2[Xtb ⫈gh+:/QrBQjϴYfԪ x{'ݵ5SfxT㐑$"pYsԫc?~)FJC>bYqq^n ޒW{ H >BbAqcR\:5pRK\I:g z,x_?+ dH"Gc781=jR+`DgڽN=$"eiʾ+Txu.c?C AD5Vg&~L6dn#_s%R. *V<\{j}+Ro0/sRj 茪WsT'LU#)p9VFo6R\jXLPu;Qqp5 a+`7Ґ!Uzr2̑EmH#9۠2x1bVOmKF+tdVX3a yb#S|2uʢ~q5]D]p4bekAnrG&J47$nXhGRCWwN2L4BN"d=R/v ͛6GyFY;p"]sT:+y&W6:ćģ0{AT]bcs]=>֘xv'NTUI4AU%Iȇy hb^?@s6G֎f ihsաGh.dǓ B Y-@QrE(DH˵~lLf2vܹwbYA˗!@bu CAh*k}Z"A~MN8E2yD9ohҪo1YkTlDaNirgg6a gWٿkC '-"TauҜ/9pLδ?k}ҟ>#3h{L ȹB~.d4?يl} gڇK+j ꖗ @]$][r(@?|3rVܑ= E ޢ=6L'_;>W>&jW؍T7a|2v1]jao4'H-*L*(5 5x{)1p4GFLF鼸kMdHU5iR J O a^ܫEb(* :r_":md,yD$jNGk ["Rd?bfOO}%`1lm7G34BٞwqpFrhh烚SG`D8IϹ/^GwîF46GO gyaOeCS">8+! ɃM0(Y^{3q`ua%07oiPW$7*_tنVSXNp@4m:DC5q>X%a0~A?وWj&[]K.IlA 8DYc|Z׃׋r~BW&yZ1?bdNvC&Y|"ЍS…@LW(ʏ ,x$ԙJ!6wLW TUc3zfn ;'<5ُĢ8UoL~Q/h&Dng[ҡOB4xSw͹x!չ%JAG0) r2d!MoZu7>{NK0L^u,OM!1e|HY[wš=QqtNk+; wQ~`ƶOm_C0>aa6x)yxy<Y-l2m7GYkTL]\Eubv$Z A.b/ _w\+\<OȍVX)}C}54r/PBڮ!jָ^5+<ݴ,wDX_4BAWP pʾ$cX蓡]v$ }*c%ntV|غ$+(G*jlݝMVUq;ǽm%&?D5tN4v;y$ ÜGˢn"8cZGA0xo"m)wYƅ9]з,~y BC,ْMT wl(DwYX;-Z3dYW"Y}7'"#ݑ<@fj|2V'(,4IDiVJ187&_$/-s#>jVeB!{?42b;#s+C":6~\ re%ޑwky;H* \}ՙpc&/l?7Z/Otzh$o&Vx ss- 2ᯎoY\AElBN0 "zA9ְjm9 z~=ZlA_.b숮DF~:[wXbfqPw# &C?;dBYtWG}"Àd'|O)^, Q=Fd.[O&p>5M [}tpWX\->6%g덻Hv)*kvh0OGfV=, ;aD֫=[FYi$|)k |Tp.뭈ldtt64$@;$K IHί+T/Q?)4A"ֱ]Ĉ#|<PJ/N|( Sw?%^+O+1j׉?;;{Y\csIXm}k*v;?}Kt;MnJƄ׿ HcCz%*w Tzc8WZ)βDz_X30Wf%ώ,,_쬋%$g(UaAnvMAx!kWc/'JI3J%-~AG^_\҇l<9Bb7xǵqՋ&(v@#2qyROyoے8\wUk /v{&f_PJ VCve>ǯwC1}Wsu)fvP0<ļ4pD" ~;D]Axi>Dcom.S/ܬ-*r+G,Z~1Xh+[R/uW'Pzso~ MB{ |{@B̽ͧ5;f =eGJIv7֛C !1hJANrg 6{qJh`Y9UF<~cZ) -lR;2Вe { 4tfrʓg梴{W@zn]J G4);!f e֌0 { րth엥tk=pkLM-k%io58J~qራ{B{> O^V^u+]SdRkWbKK/p7sR+MaS.$e81gc?- [$KH N.gn߀}G)>WAN]g tBr ƞ{1X$u77G1?pSjHL}~ ݽnʚRh&Y"E=,}9M~rANϊ'WGq$Mmz{C?NnEy?t򖽜 ^yÂP{8wGx8-ԙTQO5jdžW8 M8>ޓs?Ԫt9\ȏZ;PmQVh/u3khN IRUY7ԧDNP-ɻ6릂P0*v螣?7:kkߦvK۠F۝  .f6^9Y|u+lu#,JԼǎ!bFWDkeQ|,.Ujr,V Dhc7@]`_lhuWN*pz9JeceiP0W8f~m:޼IsQgl;uFӥߕ4qzM ыe`:r;M'sFCE2'z2>FB+Il"yD`Swꦲb4/`HK9Mf( 7|=Z֩xoŃh}@IPXH>ݤ@pH|w D^)?a !PdžRUgrMs!E&AY<(סX E{9X3E*rCm-Q, ~≈ B/H71*ETj{gƖ_|F` ciZUzjo,b2iH3g`hv\+h .~ޅLYgi*@-`1CT ;[I}\TYfZe VO^[V͞6r;ˌ\1=}%򀑘:'/8U{M皋@7L N1V&&F(&W3}&!c^ tY;LZ|})sV(#~V:[# ^\E*+U U+5nwvNJ>=:W$s t F@h3p~=;LBR]kKښ hHkyinuqbh_j^pcb +-S!~n^\?תI:m%VM>UAՊ CLE_^Z(4۴jFZ / 0 cT ,W bp%{i?H~% =O L+eVEdw*,$ 'Ubv>1<<5EpwNS/@sО-ip`*k\~!Yܶvi2Dp)\}ENYòrfjS6@*GKx:z3In1wmzB7,;d,Ȳ+SՕ+|YhgUU}hJPCNu|FsRXCs-H ـ$eW7|" LE~*i!22Zy bK41ߣ7 ųT#XR.łqC*DPt_n\ 8 2i>}-}d1"-$"@]kqRɟa$b&W [?>  &5]k;p! ,Z] 2 Uqwϕwӊ"+! I& +D'Fp˃}-mVů}_{*Ue{ڮ̧0`wȦ˂$OgJ+2U\m.a 0ӃGuub _tWu~aWSĀE;dHm/-e3*j !bm{zgO xŒvZ] $E)hYJlKk8B@uD{ɿ_,gkP~vՐn.?Cνc"p]OGLiLG% ^suMO>HID Y# @5J+ aqMɭ7agBa:pDZYmKm63=q EQxR,Jۦ 9ߔ_5d]7l'!+^p҇w[s\=ʝaS&Rj%(a3W7nH]y}՗ċ wȒ?Kyw V5K\eeXU:fLY+iaX*%ɿ "(.k:bوi<4Q۸DЊ: ēN?_\U:|n>.mR%4XY0A@Uc*^.`2E_fQjw%>;#%B|gL] ;Kr@8?aa$ _`n І-f\Q0g\vk3p[v!Rxu W=96q3[^K:{ۤp1AJwJ{cPh r%b{!wWDof!Xd}{;)E \z L* 8$AC)tx Ъ6 3D:vgu&ropi`~d_ Q]aM{5dRFi|;P{]u.?A;1-w%Jq@:]iў> YvWR|  Q{lghruc&Tݾ#W[f$WnnlJA2 ިTsÅ>.e6-@ "8t;k/"/T鐒 xv"0STKzS}?P 4Oe&)?yS=X=(p'N0:+n|&sj* )4^ܩP?׶AxSK1-Id@MҰ^|ϋRXkE;ml!視y(3Rmb|(;J Fjpۋ~1S~yMM%O$tb;l2 R53D$[n+"Pi<-i/.#N ;9+GUg;΃^O^%sy4Dբcp]KqԖsu˧5t}/' #@8)s~W* @Nk<KXv:@y~i߰BMHD)[9[+popl|bOS//x ^3U2BG(2CҞ"W 3Ѥ~;qyz'_6^=5HPOEݙvԨ͇WxعstrސZ]EF鵄wrt@M`s9M=wk"0H~k;5%"\Ί,I@b>nl첯̣uxz2("L7qo;EPd"λ1y06 {(OjU18E_ZAm"J^ 'AѳcqMI_}|<=hM `xClAߘ#ӌ-N H#yP> @ O9 q\. 7p-ʗĴs lyEvpb?SJG+N-2 @m7EElldVY̳ t A%KlP;Z'PrH7"Eڢ 'ОM]l_]Nc䳛ݤ&@~!j>D(-:e6{+m}{Ǯb4H{y0EG۫7.4mP)EOOFp$K&T7>JBOZ(/ǛdE\Cܧ, 3ǡj H}~w S5]hs *ՑҀ~u3v&rtBA=ޙv\x`պ.dHqu5WL)XkA l'eh%)R)>k\QE}&aeg&V62dF -Ƭ=2/rrdH<請=#VY=~%^ZBᄝg A=WV)5&:jXSd_ 5ѹrQ. g_}9FM2C6gŗ>ނ ZNx/6QV@> Cg꘠fBPQU"2[婕^b-: oj#&Wwl0%<\̂ߣQe4'5j>G\l6,)+՘ Rx!犥'wm¶+E~^Nlix .c?h]\6%MT- A֢@`׉U3`hx[ ҹϋXu#uoKIJSބ-R!vEwPޤGy} b~Ki*ZVͅf|FD_%S08 T[%#.fHq U;$zk!NhuϏ(R,evӵ>p$B!X ¬||E#Ћ7d 5^1_Ëz{k; Bn)&m2]4yM84i6Qe$xFT 2`@٠<RhÎ1/s7\Dfst0Dru)I$b&,B<(at8sBP~pV)zE,wcU,=V=wZAi=6ӗ&4k~E]cٿnIH:v9G BiL'FɮHE^8E&;Tݕ$&F`XXT=lJL8Jib<%^-[Z}.ì:-Rkb^2XD;w1k>j]]F9N( ZR+Kܱ,lur*!"pnquZgdPV!DS$SXp~ B}eS" [Ͽ2:6J4HS]~Unϙ6YH<[#xڧ-Pgm2VG} -C9bW<&WNS:WS]矓;?mźr/$6$OC q;+W\nJ[k(TX\tk}8't:%Ъgzd( f;k)_؍Yn TR8y 9dN=dG HA:';C~zY.-mO d8&Ici˃[.`Mʋ(9j|3 ;0fg$o?G9*&I#oNUvV+[vAXCՂ;-[D;Ϡ?d-js[PƯ'}>{J kmYRՕG)umgq@]&muSJ=.&.}F>~4,@xe^_! qh-=hqsPעѧ_N~iv/|,cs0bz~2dDJ%elFX٧n@F<67=o=1 =9y[>j ͕UxeMb*{C:.zPR-I*!fu19|uiRh+a2UO$1Jք^a$QA1!BY?=']+ڹPB7 A3T0r ?ZEo2v2"u$Mr *!F,zdՎr7#[r+ $cR[MYdp_SI6Ù}>61{;9xe#TF>]%- Fk}\30p ČTVZMwJ1 0͂蠡?Q*P=EU؟sF닠Nn=-ᯱ?؊]/hfxl^[Y+2Hcv;Ƕ'i;heutYa 1euR[>cS8NJ0Xb+Aȿ)baw0։<"zp~[ؙ& 99B|@yQnqEj)g`2p.'sTp_6!XD?~6 N- ;3XGH&nZa5/ػw/AF=c]6g6w.r­{5yXЙ 0˯.K`Z.cޯRE!]y aZw`V񂙼ķ~\b^ sz ҚDsMEFImnF1;qW9 hƦ{|2dɾ8:7Eu3p9L@=j;Z/ִ6qn (Ewc/ڃGR[n~=yHG8z-$ㅑ.(X3#bsj|`Lr31EӮT$t= ]?WẕenN`=LSIḾQ{48xd%-hN1w>ԮW& ICʹ. 2Ѷz4ׯw# lUmFbi9/ Id4ZA/TC̴M!}joR*λi@b'קjxjs,7$?C4t NeӞ)0Ly!a^m5P/ ,kRȦpV,Jh~TD>y} 4 g$"3ڔO#w1.swbWu~}̈́{DG}+fܹ N12IjP{L(R$ 4\ԝ@&dN)>euo2X\FH?Ii'g%FМW襢0GfV Z5N=Ks.vcGÕ+A6j!2)4k V\nlsiE"S%#6p$ 73,J^/X=w"˿A(h~ǚbHN|>1ׁ(w,\c҇T>_`+(q.fȤz%珲7T:DV46äD]N"b\FAc2`z@='̜8_.iLF!z[` $;N(x)DIsyzo9Gq#bUa{ߠL<( H;x\JP{9*9f^U)QJ%bZ$""+ƎW\gjY>~ˑ_fUtd@&G~c I74EPjΤ*p;T@k ȱ <8{YJ(uT22c mWo2aoeDf@unJ 4T< }<XQ\Qxut#k6y/ذPf ƲR=)߇d?:ӛ&/.n#L:CEJY5d+RVl"M3V&ŘlG@]&OvEj(N|? ubmw7]c#FaMMΩj_Uفm>2],znʲvu-oAV'w*p*`(Y77jM-{wNZ0U̳zXJ1VeйRu6F6wЉ3p]PZ;RP3ʏW\q2 A1n_G0<;d;-KVL|o]fmHIbiS@eS7Gqs^8{(7c*g鞠[lɼヿ-C#7z@d\~#9 J>'VyaWn d ʻB+ v+#_:߀_6Tq ,+nrdBLO &&ϏE4lhYԀuGЦaB>s̤ #.y!>r{D^Sv}bYXQXuKhKke#1ړ5QbI%({SS퇩)!4mAs}aw~,ݷVYS83omGo<,YCe3>u!tJDWAUŝ8tk >''>vfS-;j6] 0ia.~~O%Pۗ+M,&zXk|+ d%t.PGrL|Ra|WX3] |HJly Hd|֭]9:M.wHUQ?DZ,$.B)U24]BifUCvgB3_(f@3/O9v}r„aQNl &`Wļ yd8@o!񛧿RWڄS& ,Gt V5pPvCPHOz@Ԩ"92-'~M' /mYEԮ'eYJ0>IZ>)KM`C4-|="ûwI9a>g_L HFڊ/{%_cq6J-Jk Kf!Ǜ^z 677$ l)Rz"K(m;cm8E3ﴓPKVވ]܄b{6"c McmpSfPnN1fDѱ}tiߴX7 &W0]aʗ:^rlv`ϦgN Yx SPKiV 0VyTC}gg;M>C Kb!,QT=Śt~&'G/k-A+ApJրܯ8ěL'BD=h{Ldz{n/h4<9&i:mi`G*7(m1_(2DnźoDIn,U6uokZQȩ$\%)\7gt (:CL{"(zk?<\Z/OWb(a x:zW¸X}UPEp>0z\bS,8?RheN\330O5}/::^Q@* xPD@ v(ߕ @ |"+b$*dy?yƔ\XS^fp^ |.% oor!88cBznyH9  naE[$MȖ6gHl=ܵ\,=C[+ެvxnuYkBQ%Pjozǁ5}*6:,]Hc{rAw:FʯP&2qa gpt-yɂ-;Y<B||gp:(:94r OB"vE,ReAQ73kbz܀ab8b >ʒ~3`;ModWh'P8|v>_4͍Ʈܱ ۽Kʁ+K5N-Q8>&p'E찎:w-AaĚUvvQO/HT$9Ҷks|$prj>U4oha'utfn60u_VaTtHZzoB#4>2?mnтjukzۯ\,%ʺ\S@h0<\=LrCxQOQp?ȕ%%/9Dž2-hlA8Y7 $ KpIg]0\LC pwɌQa+j78b m6Z V"\rV[%2 9̖BxZ7UZ1:7Bl奊$3&Ѱ#%:R:@BLSIowVg!2SeR:)9 I>gzhU3XX M_D)C8ʓ-E!.m>f4!ZR[7 M%<3E>v ɶ+@)M=$M{e_'( | p7K"^ BGdd;fJMlu+akJo_K'o}EĤ7Vwyof퓠(V;`Q ~t ξ/HVUʼn4:#*#3Pk=XZaMM?6zTx>LiLs"*&o_}+';8Z{wbڬ/0 ,JoZ7s?_GNB_KWqC X0 h'%'_.#qp mb*=Х>Tm͎u3B66hK]F-u^Et*A Qvq9,l HM5J0\I6}=\CVo 0<1P.zSl]SDU8pߗeB1߹bV{ΥO݌_^[ "KQ]" P`#>>Qlr g'Akma3Cl*4v ;c}'RY\cPӿXp+AEzrP6sBVw5,Sm(9qp*0)|%4rY/msbL6{ >uź^m]6'w,+Ўסqׂ:6qҝ<]M Tx]p;@̣q/֟@J~Dk>yJ_qCi8iir'M^[q <-I bPZRrUbX5'p'LT"b}K&9}RL[AKdJ(X9S&ȭ +6|yLl<5akFaȗ/4k~VT4yS1iATo[ЌQlqw̨!|9ō%Y? :X|gԌ\GKq؋-1YJST:>ʴo[ᠭ*جoQט6rfo Zl7ˬQqaw& 858c5fx1TLZ6\,Mrg%/=#a׺z$"K$K8U]Ǟ x}Ni@oQTWY/u}\:\3;!d߬fBz!8DZpkIO5ckHV"SH5!xah5Isܝ 6ӄ9ǹ(?lMSW[HlgeO8;^.M¿\ p= ]?t᭵pH!x{:P'WF`U;q-LqH*+'HyA6S:Qg T`?)vt'4A5쎣F;:LcDz˥q敞Y]M_מ9: *G`U8vR&d).^By p0/Ŝ3Dy$MݟYYR:#J"pF^ ܋;:4-wwyHsva*`)ʡ\y:`,5_D bUɔGqtZe'pyqEx_BR9p߃ɫ,yne&$7w嚵oǴ6  d;R %<} St kS>&d^knMQ!^^=wNdAq/^(HϭEx~|CV9*mAІnecDeƓV(ML'K17H6 "ѽOâ{*U7D,8eǍ2I'Е`oiAº.CV--uTYEpѳlcS6ƋT8tTZEټ5F@JIs&(W"Qz*ɛg-@zZs_H܉h:sB䌤 ZŽ*H0Z~K+oho-}ߏ;iqpyD~C/`˄b8jJ$w˷sF;ة-QTdI%3n:Z@GǬd䤞1H0Sw5z]&KD2͋PiAœu1!W$v?s~ZH`OElpeBeQS]S(}_EPF`6Ff3Q ߚC/M -YIH9L>nk&jƶ;ɍG~_ҡyuYE Z9H^"G$O@N+ZtVu=#z%_C\CAJx@SP<2cv Ixf+>.K?&jUIl9S3`#p㌀[>))hӾd&BAr W4BA8k~b//.Zh;7}-2AVb3. k'ުXLe"x+dT'1U^sڞ! :PŹ$(0UA}ceT^͗^o7ѭfy7 zĢj&K:tLG<}e?tr˾b  K1hF,{fvN{ wewH ^V y!+wV;E%xhv֛8h{W0,g2q$/,g>ڥO%R冟3F2Q`⨁ɜNyzo0|L"UVjoc#d{"vibFtq( V iR:aq;H#Z ^sܽKхK s}?5maL,L%ߨ3m2=eǂ@ŞD*a` |a]_ID%ۈG"%2&7:nd` ܀av L}wd뻎냎p$l,UV:j.=8hUo6&px*X6\:pCⱥM%0*Vj3|V3X>B'Plw=NJb; a!_9g@ Q/<_FI FWZ%Xu0;*e9C^6d$0N2cH6'r~.!W(Ulv)]F,,$]d#qv"vȲ*=DgSZ3lJ 8_iAC[,X=nocK|:{4jRe} qi UCow؂C l`;')_E^c޶r68:jE_j(=_E CEf+s%$=AgNS#-ĒmyA B=LNQoz\ 9n K7!T~ @Yr"jisYE-Dɑ[YGWbVg!>ZWGF79 ≞N@2Äf@됉)M9<ȀilㇴE& ), }ы?e֑Q_E[LE2z5_p^3JcQJb?v*nL>Qboh}6/0qٰx"D`DL 0!v,TEjxljz k#<_(覐"@B??~$Km9Vz=D=!Bv9B^vt F\;&o3BMLr>?U9s/4t.Kgs-pϭ ]@r=Cыl={7R?mrrF1FY~ݟG1韖ЎCxT@1!~3s l{IȬZ [i&7 0G` ,ە꾦? i`mZ\}9\sxR \{I {hBmV*` <ʾM@/ =aЋ6;hP}LLq.=E"'dLEKiy$hrz6'/q &R3wM ~Y  <79:l٩U^-nYMjE  G-eOPo_詫quą3*H:1 DX>6UilJxTRjS Hr\ 4AYy"KTg0ymVcSjd4t>M`4Ć-x`fIV(3'@ %#nELz)aOn/pFǨ#bQq1`U+J?xP|ǿAAb@0Pmb6-JK1˪X U~{BGW"2~0v\ Tژ= 䛢|!3&Tq(:zYj@:4kۣja'|&%ݍ76\[\_( ub7u<tTmNgĝwr1HoMJG8*%KgnpGbZr;tv1[QϠ={Wӽ'uo7OQ C1<ϛ)# )xsV985ٞ@Lm[} Q?@nwyJzۿ䷒FYN E!KTV?>WB 8BXc8 ΡdeoZ̟)<f*+γ^{$=[ s5mtGnqҨZjFk#})):`j''';IyC!訾?˘gV;/ X+^vl'cLOuI[SuθA&SR#֞YÛњE6 r{_{ԸHm92Ȱ@& ԷD<]k,>ԒK OVY~(27V/ͫcxSӰѺnGNtӴ&h10N!?2~o Oz}uQ`R<9^ڗ¶\[OY? bs}%@ v 8C;a-\x) `{LX%ʳ8# pfpcNr!'7_u>? n3P`6hRDWv5d zײYwrD,JkߟڵK=}.郪A3%a$s&*C#.#Ad>l# ms^x`%;xK{~ѭ?m/L 2s(&㖁ջp3 ;p*r:]~j>;z# (8_H]8U޻=ɤx ҭIf!0 גuU!=7"΄-BZ:KupuNU\=P1u,=( rF {85C#ެB] 6FL5[=3rI|)was$k%Yn^o~w`%=e4赘q}UxQӞ8q)]$!_rB# PS.,m_JYe0WڷȜ*M+hڭhWVM~]6A ;aF8qa+ sHqIF5<3VtڝwPbRƱ&i_&WB5v&ɲ᝗Jk,;"Ӄf,;K̚.y-áfNvXR[1ߩ5IMvؗw\WzCdQ!yD_T@NaKc^,:b ~z#hڔ>1&Cp@2֬빴 KR?Oant>6hs5ezM1v+)g!D$t,sG]▤Nqncՠ`WWm+ ˚E KtLbۅW(ȣ#E\&󴄼陹st(aiW71E4EJN atXY)ŞN!dCǝw )_6 # O`:OHD9}=w:߃ 75w&JKlgSݿc;/d4#^@hѵy>\QfQ> A猚3tPS7_>6/bW8!Fk8\3oQT~z( ӋZ.s~ab0S:)k #&]DCTn+j<ET1o E9T& 7l~>aOtCwuM>[@Ӽ\.3l8c-fdHmc$^]cd-?>aO<1_2E/=P UKUNԊ&ۚ׹hU5{]'@}JOzwzܷw3PBv߄M$X[ӆt{O Z܎bDHpjqDejn*Qi-0fII]i?*d ;%.Ɲθ-h؋LeTE6s{&P1'l)M H)7}w vݨ_ =~#47 %WӐpԡm=W'"x7oR²pn n|e +U)g@bl|+fڔ<'Gϛ5MziS;:a#b'Y ec㝢o~x$F) <%u0D3y{L v=UKOݷ3E[zV-B_5D6N[!#f_\ċ]CHrØSŔG#5Kƨ]E iy8y5M@/%a#T8 O?O}t4Uk:Ne'FVr:pB7iD#9uHGmB('!S>pior~aadZ`tq,2BCգ͛rۏ$U b<أܽ+Ġ3C#\SZ26mt2<@$4wx)CxI,}!;vۂ^PZ٪{lW˸0G*#bxE etg\:3A1Lk䕎DOkE @Mb#T>v>q`sQBPHQ CNsݦr4q?3T/ͧ.9/6^3zdsPl1ɠȎoO&}bgĈ%ϸJ;`T$`T(V-q-wudeǺ=p%TbjYƻD6[xin*'`-1U1ouH$Z+QjO:p1̨[e-UMsvCEHP QRngAzH?J 4>Cwl6zH-wnϡmKkh?:CDFv VLQ=s;&pu L7cZXNؙFwuN.76! Sހi< I}x_]xCw"(D0\2N]~/~n´f 8R{=lVӠ@tq)/iNk5}E]/Feot{ҔOUzVV= }ԩ-ۅY>#b+ <°7=7!\;A4ӍLC7Ϳ؉emxga01Y`WwO?就 W2#; NTl9 * Pf%2.uJ/t8 ttRƲ]rwkaGK \„Ӊ /͇:E6!)YOɅ>r aM}L yℴ^uLS A>`?}~43-nbqOQI#Ct<yF0ʝ gr4 >]x<߀QlL^bzq 2W[S}[[@VˀBw߁H#}GaH) \rWѶܮq;ε'Š&'5"]xHrĒ?:afGٞ4 vBvxAdW<t|67rw7s\c٬92?0B͎Yap-1 Vڷ(0om5t. %zbX6nau1 ϤD5`="4( a%8W4<B#I}ݭleOSO4.AQްfZo(;f*ʢxpAq젠&dym:ɴnc=D~Djnr;z0J{EjƝ3z߮Z Hc㪈4lHYgm+ag!~Dod}c,( bj qy='n8>tYuz4n.8~o:sG0ȳ@izn0V8VF?=PS*/:^f;n^"^h*ɤ(FI 4g 0]pJkCY!ulӲa8[SiёUِǂV盲B^'dPPu/+דEXߙNf bxE SSd_O}KVFp8S9pQ~iH9lHbkNsOڊ(ҭwcv_0wRHݓPh)!-i#Wol{רFOVI^=t_֖ "?asU*V֝JX%FfZ4Ot[IOɀTP.7LU%>:NfSKOU Gɂ:-.ZN6"40'^j1244#K{D4H$N!K1a#9[̃^; gȰM6_.`ﲘeX,o0 @ANߐN|܌(Pt@#,ˀNLxHCAv%Fɏg2ϰ)S\`j |'\=*3!)"=YDSz\bX1a,\b=RbJHx4bb)QZ&% M!>C/X. kh~"92Ҟc/pQ/b1/qKņ)]^"9z3dóK~g^@(=7(~4GF@t/&az(h3ϨS!&cH8A&\, Ĩb}ɉa'G. a!ZbFѳMn(5pg&|KQ;cK&Ou~CTS\#g2^@'$l1c@::%<d\:O'e{ń{K'ozoL'U.^eSR=E`bZ%xt%@ Ss"5'J[YA /]ޏjn=40*\'!0JAn+|!cAU'xH$9 ܶo=G%G+8N -H |x A$5wu<QͰMx.1tUCbˍtB+/E瑀v>%?)7uzlb%[lc H $IB OXp8!#YD}>h&J'@)6)X_wjv;nE]߮Sݣͮ)I•k.qDXKɺ_u>ŢddZgӊ:r^.G!"+j*ͣ.0XVPqW=:؞RщVc⯱"I87l4 ~PlϜ̓Eud1֓qxGfO})J:aw HqB{}|,9SZV ݥ$}9 o2jYCLWrIGmALwȃ>ԗ~|]Ӽ1Puo0t+ sQ|_j/"\ACOܔcZZG~7%J9kSDgڎҸ/{rۮShzω1)P!$ |pT+|"U>lFw 6ZD=#"Sp'|R\RiU=T,Em,kLymaXC@Iwzi/wp:)LއEUHy-DY>GCGs?wU:g"MҮLӏ!h$ +lH ?}vz5 !_'e۷`D\# n75dXNv*hgdvwдQķwũ%9G󐰾A6bҍIW S0:1^g$],h5a\4Szh:VPQ]bU&2NyΧxPVHjCNwy{u:kJtN|:04*"I$=A7xH;c;+cH'.$%txz&eNX='ղul yY:9i)nm0 =T+50#H4ąؖt^pc3߽2#{)$z04a֝.>"}+cK./2`e_:W.i@OOy"-#@Qn^A~Cֈ.ߴs:OAhQќ/'wmFhkLykZDOeڙ ~"B >(NӬ l=W9 r [ ɾn[uC/̦.슂S\k%ׅtѓxг+JU?f h%HUq0nƢ+i&$? L¼FeϲBڟαos6}v+#>LRAfYK"1jy/hY |꒒ӦZ]N˳UzjwZ0e}jʎ=) &R>YP7aq`iN } 0#Q7|ۢyڮP;^}j*P޲oM+)mtӒ-2~~ ƍOH&H,hL6%QGTfQԤu3VPV?lISC:LƠPBݬxΔ`n.PaCO#;ʤ- rRݕԇ M1PZ] P&`@ڧcubb" @_/i9Y±/cg)qAdԾ=R[NM&)F&r7:liՠȬWMwˁU^E}{A~Pi[huu+R˔eNCbY|\h]F"-w?{Z\w7ʖhj$YE76DR־@5hт{Q}-HlXpX(0oC|R_>+TK i4!|  Ww.4j veL=˛JC k/rb1O'a\ҙM UySKT H3lā0]V2QohZ ,rqi$$*^bs[*{4#[A=RG&6$yl! \gsWg;,31՛m.7~^]CE[S絎C :`W1^Ķ&K\SRH9:,B5F-W}7C r(C8)kKcIM@ ۆ,ҿxO# Yzg}p6oC;1Wv(4s|/k;d4ٙW~yvC%$Xf)ȭ'\6/_o*!E䫑.$oSb*>(*N~`Fx%b_b$l!%1kvOCBZO(Q'kHݭ4,F(77P$00d[|+upPׅ\yF JCW=oosD703[6 ȲE=K]t8*z5rUfR(̦S1,/Wc]m3XHTv*8kk-|LnpAA5(A^֝5`}ZPJ[1b5x󭜟JQaھ:MvmIWmʹ[To&DӉjbMK;>&I)QQμ8J7:sE wR7C#v #hv `3|DCC$+U-JhRPFލóYx1xӗTͨGփU7جPڒ) )df4FL(( fB'1lq"-g\1µE 1na_썱\Zy!m̘KCgm34|  ]A'CdMHoj$q#(LuTR \QՈ)#᎙" krÉ5 KIj]Q 4`?DŽH\a*՜'|| WDi:ITZuBIǰ.z;rݨ9M9C{kخs5BHaXS\ %ڼY1 vN҆OiT:/ By E„1H22u`yX k~CZk/^9=leq'.Bw sF> ?F Ex- rLV/w¢|ى"i,q,!p=ωt97R<)L\j*:WY2BAZc4ї̝p>B$l$#8WAYC)ֲXu?b^i(Yg5`Du&mM4yq0Xq ,AȤmRQ6ٹSyy}2OCYloq^1K_Zyl9V memp&@K@嶁=h{X[UOb}9^Nf̓2RP⤄ޜO۹jiB8P+tS]('n[AnmIϥЏ4|-XHmra;{.„I9u^: GC$F܀ UkZ"Z]Jxha>yAAut_w=/)"-ؓf)L ?J)lX|F}1_trgh3iW<0-z.=z!*+̇XMYB4?)4-&\%iݢ20[mDZ CL;iz|G j x]wE` KW)4HDǣ#GqOHOa60:֞(LLo{XM`wҹ q T=02SV \5n|I)닭taRW>*@*O|pԞ|na+_(ZҺu~Q4k8~ 2hc!~=e$zaW`JZ"TWI6$9! njV-Ԙy@߄''| _bdgLJ.lg;ay@B@!#Wc] =owP+x {tc$b[*Ùq8/hWXf?6Mc 0 V;jR´q0'0Oo~l,"-7e(ߝFM{T:ń۝jFj3& #akX!^SZ*@볦5NЃx֌w[d?Tr,I.|xkIȬp-e"3 nRw.qWR*KGC<Ӧ p8\͒eٓtۘĐ`p:!TKcGb[~-Śg'(@=6g)I GkcgHtU̍i*!.u'n~|v΀mO^btE}0 _mf Vh \aIDl~a养WǙەW]!jרBãF6B$nFHJ9w' n֝֟+1_oGIߐu1V$f }rOPͦ>Cv"1x!v᠓q wt4:slN$祚ͬm2nw#ApjR*"xӉK uf;}ِ'9F7N_[rlV7|E`ވ3($͉WG_AҸ38h>l魣Eor&v7b]*Gp1B'oH?s=g<S3'ewU/%Z,f\hɔpS>fV9wz ZO3+kfmu)(45 / {,J_nf8,á#ܯSp QaKYCUOx(D(Kt[Z+$c'5 X12%NLKuue{Pk)r,\R3"v#?%e!i_ug9ъ(%{PK1#g? 3ٵ]hjTE#C-`[D碷deb'~rQKQ+&(tc>=|@Z\ hˆDvjkOu\60>h,CKul 9oAʀz.֥}zaOwT:]8JOS 7<\yڸ ^Ъ㦿}o~Yk["ߙkד GHׂ& lJ*vb켃ɑ7B nQR'yS iMB&yz|ON9̏1]d?߈SNk hzrdlԆ8Qiך~ +g+0m &%ৡ/98/~ \ĦJtW`JH)72ՔnwqYhX QǵCߍEV'JJ]Cg `e-ۿ}*t"P*lA oi!]3el=2sǦ03"u=d5Wd)E' l 9Bbp,q.܍UZҹ+%\%PL%^\yj0VDKD:F(k}eghAzAI]\(Ɏf WW櫔_1zOn+VJw_a3vk:񉋇EF4O}MB{TN//ʡu0Rg(s]ѥJ9,4$4q@fQ\A%^3u*eWԦ#.%mZ VkWd:h (h>&Ъ7BSSdmZg:)t(5#7~#j nA;2䆨NS+ub '_6yb6}j2! I!˱ ,xJk3K_A~b^z;A~Cf1~jĎ>Q8>xLn/.;5IȦ>\z3Í^uNwpa#VUUsCU^VIFϥ<, f:(i9J[?q#";x󅮗M YuyM}6oȽW]tC"9h V4Ro.s,fEk8E`ؠ9b筫%˚qX h7TԽ[R1`mKBҮK @k[W\\e=pgqhTǝ-lj8YA?t=/H,dW>abҾ,Pw;&JL48\ -]]$l"ߟoO_k8XFZM@/  )jPPvz3|҅{ݷhyb60N4HN! F8*eemh\Ž9 d&#`xx.r<& " DfTQdUs?_H"ζ_!XH8(ΨuDlβ7NhNneubؼN'.[@o{OBwsʊH0Զ|Ba.JG`,ޜ'J'C(ŀ.:w|- A moc aWԋZ6{&6F}*ZЕru\/qAwQvQ1؞ F"[I5d[8A֏1yox6 EQvreEN,o O{嘾l5}hnwB _H&k=r0u\e Q{uQX;i'lCZtA_QHMWZzSӰ)U汴V6jox=X}GFBxI(+Bs(~ae @؈>=_Xg¥7ZȜCF 4p7qֶTZiy+ V62E'^Fd pv%x8]AىUť4JWhzܤ=amfB0yek Ϧi G IVV.P{LXb%CL#jc6OMUXHdWfº<.E%|w&2Ti@X4"wMYsh  0aĤ=XԘ:V f=0xxǀ}ȃsPu"3#z`fѾ|1xm] ^Q&3Eu{x_x