summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/arm/cpu.c
blob: 91109e4e1d09f3fe06167a807c601a8f0adc9b81 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/**
 * @file
 *
 * @ingroup ScoreCPU
 *
 * @brief ARM architecture support implementation.
 */

/*
 *  COPYRIGHT (c) 2000 Canon Research Centre France SA.
 *  Emmanuel Raguet, mailto:raguet@crf.canon.fr
 *
 *  Copyright (c) 2002 Advent Networks, Inc
 *      Jay Monkman <jmonkman@adventnetworks.com>
 *
 *  Copyright (c) 2007 Ray xu <rayx.cn@gmail.com>
 *
 *  Copyright (c) 2009-2011 embedded brains GmbH
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.org/license/LICENSE.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <rtems/system.h>
#include <rtems.h>
#include <rtems/bspIo.h>
#include <rtems/score/isr.h>
#include <rtems/score/wkspace.h>
#include <rtems/score/thread.h>
#include <rtems/score/tls.h>
#include <rtems/score/cpu.h>

#ifdef ARM_MULTILIB_VFP_D32
  RTEMS_STATIC_ASSERT(
    offsetof( Context_Control, register_d8 ) == ARM_CONTEXT_CONTROL_D8_OFFSET,
    ARM_CONTEXT_CONTROL_D8_OFFSET
  );
#endif

#ifdef ARM_MULTILIB_HAS_THREAD_ID_REGISTER
  RTEMS_STATIC_ASSERT(
    offsetof( Context_Control, thread_id )
      == ARM_CONTEXT_CONTROL_THREAD_ID_OFFSET,
    ARM_CONTEXT_CONTROL_THREAD_ID_OFFSET
  );
#endif

#ifdef RTEMS_SMP
  RTEMS_STATIC_ASSERT(
    offsetof( Context_Control, is_executing )
      == ARM_CONTEXT_CONTROL_IS_EXECUTING_OFFSET,
    ARM_CONTEXT_CONTROL_IS_EXECUTING_OFFSET
  );
#endif

RTEMS_STATIC_ASSERT(
  sizeof( CPU_Exception_frame ) == ARM_EXCEPTION_FRAME_SIZE,
  ARM_EXCEPTION_FRAME_SIZE
);

RTEMS_STATIC_ASSERT(
  offsetof( CPU_Exception_frame, register_sp )
    == ARM_EXCEPTION_FRAME_REGISTER_SP_OFFSET,
  ARM_EXCEPTION_FRAME_REGISTER_SP_OFFSET
);

RTEMS_STATIC_ASSERT(
  sizeof( ARM_VFP_context ) == ARM_VFP_CONTEXT_SIZE,
  ARM_VFP_CONTEXT_SIZE
);

#ifdef ARM_MULTILIB_ARCH_V4

/*
 * This variable can be used to change the running mode of the execution
 * contexts.
 */
uint32_t arm_cpu_mode = 0x13;

void _CPU_Context_Initialize(
  Context_Control *the_context,
  void *stack_area_begin,
  size_t stack_area_size,
  uint32_t new_level,
  void (*entry_point)( void ),
  bool is_fp,
  void *tls_area
)
{
  the_context->register_sp = (uint32_t) stack_area_begin + stack_area_size;
  the_context->register_lr = (uint32_t) entry_point;
  the_context->register_cpsr = ( ( new_level != 0 ) ? ARM_PSR_I : 0 )
    | arm_cpu_mode;

#ifdef ARM_MULTILIB_HAS_THREAD_ID_REGISTER
  the_context->thread_id = (uint32_t) tls_area;
#endif

#ifdef RTEMS_SMP
  the_context->is_executing = false;
#endif

  if ( tls_area != NULL ) {
    _TLS_TCB_at_area_begin_initialize( tls_area );
  }
}

/* Preprocessor magic for stringification of x */
#define _CPU_ISR_LEVEL_DO_STRINGOF( x) #x
#define _CPU_ISR_LEVEL_STRINGOF( x) _CPU_ISR_LEVEL_DO_STRINGOF( x)

void _CPU_ISR_Set_level( uint32_t level )
{
  uint32_t arm_switch_reg;

  level = ( level != 0 ) ? ARM_PSR_I : 0;

  __asm__ volatile (
    ARM_SWITCH_TO_ARM
    "mrs %[arm_switch_reg], cpsr\n"
    "bic %[arm_switch_reg], #" _CPU_ISR_LEVEL_STRINGOF( ARM_PSR_I ) "\n"
    "orr %[arm_switch_reg], %[level]\n"
    "msr cpsr, %0\n"
    ARM_SWITCH_BACK
    : [arm_switch_reg] "=&r" (arm_switch_reg)
    : [level] "r" (level)
  );
}

uint32_t _CPU_ISR_Get_level( void )
{
  ARM_SWITCH_REGISTERS;
  uint32_t level;

  __asm__ volatile (
    ARM_SWITCH_TO_ARM
    "mrs %[level], cpsr\n"
    "and %[level], #" _CPU_ISR_LEVEL_STRINGOF( ARM_PSR_I ) "\n"
    ARM_SWITCH_BACK
    : [level] "=&r" (level) ARM_SWITCH_ADDITIONAL_OUTPUT
  );

  return ( level & ARM_PSR_I ) != 0;
}

void _CPU_ISR_install_vector(
  uint32_t vector,
  proc_ptr new_handler,
  proc_ptr *old_handler
)
{
  /* Redirection table starts at the end of the vector table */
  volatile uint32_t *table = (volatile uint32_t *) (MAX_EXCEPTIONS * 4);

  uint32_t current_handler = table [vector];

  /* The current handler is now the old one */
  if (old_handler != NULL) {
    *old_handler = (proc_ptr) current_handler;
  }

  /* Write only if necessary to avoid writes to a maybe read-only memory */
  if (current_handler != (uint32_t) new_handler) {
    table [vector] = (uint32_t) new_handler;
  }
}

void _CPU_Initialize( void )
{
  /* Do nothing */
}

#endif /* ARM_MULTILIB_ARCH_V4 */
=c-,;v $N~nG{^a&mHY\I5@o [ؚ- L7/7j_ŭ7`&=Ŏ@A!c n6.$HU@[~6u@`#@T,Llh^9LK ypcFiI*. ?OkhXZ2䋋I [gSp[kؼE~B N l螖ǘPȋA'=gQk'VA)qLqӘ b?x?qq;3!~Pc &k3~aE2##1vYaaڻ]&Qk-YZy:㟪D%A>N:!3yJUOAЮF@c 㼯39313VlƁMSoۛ媅%4ZsWiNf(zQl'*4RfPRՔ@|B;Ka-m/t g΢Kα wˀ*坜s/j5Uý̾4o޹kao?MK@X`s@*j=h#fOPEs't~@\ *旮]R]:ŸbɺNpxhQE> Ɗw$̾Ϡ P@z{U~xruVJwWҋoR*c\kcc}XOkxU '?Q@6{~@-^.\\x&ty0ߦ'++$/cA,zŝs|=B{## HIIEp~Q;ABISzz}sQ\?:x.sQߗQm;׉/;C5E# uA6NHQ7 9$|+]xgUBTՙ?~珞k.K,5Fn\tY(z{"K^#=9YC~]i,lKyLDN A"s!eETcFU)_u8tI$I$}k:uO=rO'{snlcC( aW R;N~Yy'|P mRN< Į`R(鑴GJZ5a拖Z6t]vb2ld4mTpwypIHcNULB͞@ѵ_l$tYp/KL]- kl_Y=[4Sxk!qd- n־Ųߧ$ABj3mv4pn.] VqS#tNhaAժ%2TYQ;h\L΀Co0OsxWy\w\(4ᱺDx_: upgnF j vq!8dŐ{hN>f6QXeQNfffeYv*3甆{$:LAHҀ{8 \lIkE|1[y̡0( gA~Ҧ\U>GF1:k~mrYb 3Z)EgganGd?G!D!$ h0Ỳ% 4F[29 bnC<YEcݢ9rsDن\ Qc=IQm˒gAֵ47Sʤc($Q 2/MY˒TԫP'#]@{_QVL#/0IGciw( Eyڼ$ tcjSrE\zC$"벃]Hh2I "&*K%`AN ]:5ݸ@e]⻀P@\LP7P-WH/b𒟷0H8hןg[=hOl6qZ^Y+'[YΤlb: tUR@@$$ m8t?q(XYafeae{` ژ$ {@]=\^뱇J;zݬjͶvvgvb%Zن4q5 臓-"" |O'1I$I$I$I$I$I$I$I$)|s/r#Xc7 ra ybԬb Rvݑx- l"B@NR#e4]AE ߏ=Wb}F` jRpx#~8&Mqs1c 9Gu!YI|kL2G&|=$l|'Wμ]K1U ̩Aipehp>;s#Sw'`@b$!! HBjvGeW#òEs@a^i6'n;&ɣC# iZۡfژˤ{/o4T7: nޡ4ER ^ΡjA"{`626N!SAW>N޾%E33U3U1EE4DDE5SDDDDDDS5S5S5S5S135P]'?_-}cf=jDA)ii_"Tw @^zßFQu#N%Ci"㎗ṄSYg9E9ԪA /Ag4C:2hsmA0P .s': n2v%T_TpA>Kytckoc$DhrE'k-> @I657g2ru`|f_>p a=sw;Z  fLq7;j3tVECL3ۛdj. Ir8#y-a%B3o&#Fg,5:zxYE؈fiY]b3s_#&K޼~2LoPt`gKۡHe83odU5FHefE%5Jj (* :5*g: Mjɜ}lzX\ 1{RLAŀP¤H5;Gʹ=Uܡ1frK9Y3 M?Of 9ّsTala $HeF74#uOMvnZi-ͩ$isA R?'Ⱦ?2se}@~2֞˖ͪscWt1)mn9Ot&<aOw=E]VPI)0!ȪGEYJwS3ۑe[vpFmw]6Tv­%X=cC0YCXC?3y7Љ¨Q6˃Odcx^ogJ>Vig^ZPb')_uv;m3 1˗p;CLdU/yXq]0a7Lw3Ieg5I$dѽ +y$]9$Z")ӻ:Jܬ!^ F&HH(u@ WlcF30}-4Tcr 5 <䯞][=Wc@!;[yAw2 ;G ht?}-F=|G+0Iwxmɞo0- 2}V՛ Gv:B6ET\N4Rzt*)waUYfa+L[.E;ja145$JhKƙP__LV"6 2\ ؉HU$U5;K 7 wHYYWBMMJO X 9 qWc;L\SW BM}nQJBlO5uTyGVP(]EQ( rEOMiIy).? w)à@$04yG =l(3Fy2˶d95H/=9yjInG>=_x&`ۈeL`E'~I:52UJGoT!E4uFA˳u s _z ۻT*:[[x~:Bqli浺th3x% kSqGUKOs(Q}r!n(rΆ,ɴɸ8x,νj<{wמ.a*ߦ>q4XO#vlS*/VeCW57N(w~w7\?Wx>wVu< l m+\8DѶ=xɔiuWk7 tI:ą$R$X{/4zgU=-cKL5!*#-ör":3dգ}u[qr㯖C_w<w s* <|Xq{j1b_j[Otw:30:8_.;G-G;䣔$jq4YMȇP³KAcY賦5\Z(g,c-^%Bjy~g}4QEQM7wnfۢ:CTB,ݿ_>[,2+@86H0\YŒLwh-4fz96Ǵp-i4Qdlz-u6ZC)SC/4l*YT..uCE-)]mg%gٮՆ+!#N-^fQ{!ǢNM[LEFY#sf*>? 0$xiL*worC#~,IvyX6v&jЪn^/_ݲfQ缆ɡnfQ啅' YV<ɽ'{'lVkJtLtJ-AQΒqtfa,c I oyة^h,j׬qڍ "ctEHYzetQ| x\~(L)i[ߝ뛭nUJCH^&!٤ʶoVGvfbS2(Hzuy+x8u!he SDaRf)60w V`%BBP oI*npٌ=P%9P\EbXQTc&Idx86SN _6P3,ywWu߷j '4E!ٚՠL&yh HdIw/e}I ǭ~0mq9N3K b\'uP dߌ]#*r朵I2JgoyP_oFs)[aoQ{>7zwT6Vi5_m眩0Hgr `SH͌Ž%;jv8y+NjZO;(N⠌,+6*;x{ު첈SV].Ldż-&MRAnBVJ(Ŭj"ɺy}YGR?ͦq$dz.g7NEQ!1 ezZ %]h ;o|x<7 /4um9'3pAi:4Sѕ\dۺuדwE8ե "i"P+ϑlVr2fRQ֣/@?gV}=QKn纈<s뭂 MQ3ڻʗ8"ІEcUw>4tÒWWB@̵Sf8"} ˞D^Qt|$3L\5APBh630]nuYOD9RO"|G }L5g+ҸHxqCm!Yp:dWS@̎ҋs9Vb;Wd^,a3/]Nލ'>=a;w wWgѿ* }_ ?,-#t35}5]G5f*=-VںRѠ ˹_sH- ?(ZCICU$RI꼰+x9x~O:(%L("Qpm^23 jEW&gT-]u6:PSS1*;m_I"g0rY>lnaUܒէOw{gLt=]d ' 0%:;\㤄2hñ_( <M >\nXxv9~]f"?wUzvQ(Q&L,ہ)7eYأE-K+bvW|$CuүS,x LݚCN*L$^7 >=\@jL2\@HV8ZQLlM2A=-Q<3ŅBiQy(NBL49~>Tzc[;#\|g%LlwR.=U}}S!w) xC8 #tK58F`kĀuinm( t%xto֜z$s|&O"9&ޫ421匐"D͌/p*fa~jZi:Ezg;шֈ@4 NpIJײW3 J5Ǔa4.8$v?K%IgZъ2Gp8-k$}J?uMO菳bnkzSx7777h!D(̻ X!ku]U~SEQDi׳ ûI}pIٱwTU<:# qTf-Q7cC6b5 .cOk[{ PQ!R mzxu)P hY#/|<4JmasZ~BiuI7iř?S%;ٛt"n&k36!m! om4j9׉$Uda7u;/=VB'(:r1H[8i-Y]v[ l54ks˦sBceX{CÇ "N v=oOg. $HHᯑ9p ({ ܾO^E.{0o[?r٫Ta[ýNd5RJhﴶr)O>33;ԝ,=fnd%^WL;Sb˜~~K T;#5y,>t%bmF;d)lfvmY0/{Zِxek /[Rc.kC~$Kp8"Q N)ieD8u*Ȭ$R?#mQ =:5Fe/۹Ǖʨ XkcP|+Ğνu'Fxi6 1+qVwԏY<"I/+Phh$ B'"гM 6N⹧#jB1i1Te]%Z(,l@򫟈̤SY0D/i58v/!jxO=0Np]rcHe׾xN]k u@hHl֮Wu p32Q=j;OvNbū+O YmVϯغro18L] hyl6>o9u0N'VEN83|pRke9IxN0 A P*Y- @: D&;)fVj3?1H" IlWz²chF tu[|uXm 5)rP9s.Ɯ1,31dXUjcHd75ba)I,ʼ-!F_;Gs^QD|+zVm/$cFm\ b}~_gvfa@0ɇ/D*ǾQ8X@Rqˑ`qYSʔ UXFUS(t5L0u kI:kG}F?qtϫqPmW$ \8>4cۊwz^8䗾D`BI~ ěO/?kr?mu0US;1S=%L" = y#In(庣ϿD|@Fm&$Ph) Q^%ɗ~˞ד5b~WH%j EMH Xf>1=w=Rq < ;mnoء%>z: ty hgP'5mW,i\|$ q>D8QK& M*/ie֘ePeObSHQB5k6N|9 `,N<,_ +98՛Q*k*kӲHc7Uw+~^4+q5V:S94>\o4(~~rb{X!\;b8V2b j3Qaao .}ݎ)w{4#G-IH{GRၕVq#1忣żi;ݩgfk"Ri~&8[faU.G #\BϾKU'XUcXf]ׅL4|9f~YoNXQd 99!քcm}# .="lH));&I%;Yn*=r{=o;o9U[{Elp:âی 9u;p~$Rd|}(T5]\bL>w8% : ȃf)dJV|eϣ7ۯrx>bfWΪR` X6T]F]k[(& ,_~3# ڍoTAJ+΄ʔd p#͠BG]XGSm߽y M"lU}U&|k94Ǚ^DMx^_h2?M=0[u;ۛhScncWYmZ8< >]~eG{ WGGLyyc_Wdql9bQ}.AՏĐm#}!)Rtw7{0yA4CwJ;ݵ/&fmɘsЏaʘPԡFÒK"AA(&fva&Kծ1gA jWrfsv|FHHʼnaJ˓evjtNQN7a|*I[ߚj>Ѵ=UeVN|}|U7sϿ)P1m홏{ٹ-yoz( 9Ck&;uUMzpF\`-̠B-⬯gsx/G|߼o'8aq g.6ٜf-,E|!A+ݞM6h:M;hl*0RbU>z £{ퟺ|qL>>aWm/|&ǜ׃UITԇjBTjQBI V6n!L? "8c=e4Dbr|uCܗ!1f0wGzv),nܢ"Nl ֣!t$1{gŐ̊"0r3qbw[_gF;50aA*e_W"aV{,olo;ێ5u9dʨEEj03wwtX@s~1;ۇ[R6r;s&Ы ,xCu$Ha dmȘN/R.i\pC.?_헵WNoo䟓媥H~dMCoa288tmמ=2 U큊!Ň"T:0`C Q1J5 X4 4F8%0K0 ϊWē('(20 p?wH԰f1 Wja"rBϣ8w|W+hn?{\xAʶ/XLDH̴4t("@! R+H=1-,BD5C~]m)&$!˻\9e!BҚ(vRFKZ 2g( &L2NW41㌘W$n<*++#_ӎjrཇ9Gn$B%, 78OyahT`hb4T܅teJ ,uA!N8 aƂ84sJ+[XJJ{皪^-\t$RA@]*ƻ>$"*h!$SHXH#݌\T+;Hk1_h`)|4~'ρ njfYF/ΚWGtr3lo8WА  >"M h3]2 VھLbfdez9>b xzkPxaP%V ^0 5}p$eb@EdZF)DoT[~`"hC@ar'b#1Z&!H3- >F+n:µxXJ7nَ2sq$݁z&0f# i0awvet[/;$Cr&vܢ;/)nS:!ZL{!dP|Q3+~iZ?" %h1S3oΨ}C$!?ےʔ"aҏ!Ӕl  ؂ؤ G4_VNFYeW=t"$H:S ap8&Q2[m-E ѠQx/'#DQ8k')eI o=*A%rm7JU)ii6sQD;|l;3"_~'7biSuȠG]A5@kPD u{;ǵ2P>k{1_ z3 :<~;fA[!:XjldvacqN$0~W x BG],?c-$o[Mb\6(i.t͝r% +2}LO7}确%Gf !kyVعK1jL00@]$GH2c46v;kM EPCD1UU-UUUL0N,p0R( b,$%&X$"dj "H$(bIb$& "L!&")( QN6E@u'!@IP H! T@1 ! LDM $J%.S{ ;8 IN*! y$X$*h HH$9 u#)B&F1 %5` I[!JqKF^XI 8+E^|y(,4xLl "b9 *c3Y܄BM$!~g.HW էOR4i+ /"Y;$O4@ҋ@6r I1 B˼%^!3C6FCq= 7PR^jŚڜT1"lRV&0ݣaUW;׶@(4)H"UM;b-&.߿AM!ŲS!p@؛ǼijǸXjn&I@#L+h*Q1ZaObg$Xqhվ̻癮oc4yaQ2sқh A?qŝTՐ N!7@̋3LL jFKlD~#; !ԬE=ISCfr E*9iWt/7_M_*oܲ۝B,]mkviW,]Y, nhX᭵EADhK ]T*d+"תBىsSy}uX\x)yq0l}2N-|+et`sb7}g\|uB a42g(8(<"([9*bJ1 ziRT'e/?Q5?4aKJO}wτ>HU.`>g@/gޯg:?.*ꪪE뮼MTp @ "ʾ>Sc ]f-a(1G 5+ ]?\Ԧ]QՕi%a'埂5yY0R۪fvN&4cIMQ;ܹe}} =.-QunRG"Ti6ǰ Ӟ/o\КwOw<p7`;8`Mu!3qPuf܆f#]D< ^ci۔H1M\vbx9zoC-8: ֋m "0ڢN8i0r]T]oo4={҂7 6퓲xTxGpASȖ~~LH]dh|xryeSsk?/Np"b6b:gvҝa,Dƻn5,3mɡWkN}5Iedhd*wf$oKu39Tˡlc\m5v4b+(*PB" @{c}] lJU,h -F*?ʯKC °+"+ XWg?/p?]_VPqWυHc#{E&>$#jYey"ߜX DBH!~Z*\VI UxP?LS_&џ*/6J $rH?$U$M9*ijn@.Y]M\Pr}<վ~DQK TF=ۭ+~ 4Œ2C"]rR@vՋ 2amWn[*q O%U ~&9`dt$S.yFfzp|LǐY~RE@Ѝ)֟A|8z#~_@ +cB4$"9u _O"WhER ~6ijbLq1uW&^)I8ԔYΐrp&-74yc PTH~$T|@|ަoN*#/XTLbo8Baf(?Kt mTB|xrw ;q6`o2f3 U}|,7'0C3al{r9R+X-00Շ&Yv80o{y?X0f 87Pi+E_㪟v=oyyQůEFBHwNI<>Xy{evQ,1!O 0 RZeX9f ý>+B+4i -/D&N뱼<&.@]t xUsk*R4 m1}]kYc]이TKqX=cpt@{)Y:VeW8Toߟm⿫w;|&WD8U2vE,y$5A00l#zad2N.|@LP>5~\c7NTEw6tag{Ý]t㹥e_ >9#LlS{J4F/׽f,|8F5bvjs gK(Ud?xz2SgQ'9xm:3ugh;Sf '޴PiX;\1~xιyFjiUî3+iG o)AFC7lA)KTYmn9Vxu~E|~J=_46xOy˙惘Eh(R50\&p^GL&UV'I~|Cz‘΁\IIbAm.M!!/pN[Oj(D$P7@S@hg1^ڏ;OiCH @U>dӻ>c%C|g9r}+c~#N2ԱO[ɎLYXϮ5(~:8H@K@}_(j8i^~&ᙞ=|Vkݍ_ӭ6v)q|N0xx#r'1ZfP=-?w" !`S00tCRTP Q!Bd~hs@0(b iOܸbdQ "U8 W@"wb~(IPT > (b~UU RPd$RQ $H;sM J@JHH "RHJL+) H"$ ȪԃJP , (B@ p%TI;3(Kc / $˗\! {)-Ckgi{~ we~Wm YmKU2 Hxy5ǫX>РŐ_gb2sRInrٻmv|gqu9Dcd .s1{E9>i胑LySgpCAg.<9ۮrjSjPc 1&`H앺n"'z~;T؊*wⱊ0Z "/:Yޜ=?}YKUko7;J\qfe]t,;wp=UQ!‡J,SΪa:Xab~k}ޯo"9~/.>{Mw{]{o;% /GϘ,($ .uV4Kn=Me0xe!GM\YOaH/KBc>./@6;iIu+Q>x%XNPb. DŽմFk D7rb*/jQ6L__|E,~ EvXy x H}J+|w +r$jmNwò `*^&x M4SE%4 ʔn16F^NB>g颊('GQV6 $YBڤ [Ep,T̙M4M4 `"k FTGcA }y!H~R={!C؇b;>N/\O̮뮫<&kb*#8`;N u'}YIP4I8g/(D w ;z]vQ/_ZMEaw1n5q]64k\L+hPJ=3vŽaho7ZZ;lgb5B8q$}`Tx:2q$&Lb!L ψLdX$`ץ_ñ |PH2F&|dUD-% "21 +G^Œw|UNkQ±AsDm61QB5U @fͅqh4P̀h ISyo 8B=DQ ̵Pq**"I AXQε& 9*ޱ(REz` Ќ a'\sJazd`_[f<=dcy\LW[Gms/?LƦlJ_Fhm'6mA:xnw;)H @RL)wH {8$,lS=`BfFC3GPp̝9eQ̎p4=j Z^4/R6݄]'@|R]8 if`7TЋڳ67p8o#9uV/u 衛e0P`ۻp,;EQPڇ~ۤ_A ԃDoπ>AZDF tH("]Q kĒ$DP9)}K3g_^ݏ=|d [$h!"DpAfE][7qҪvSB7(8-H`%GA?P}scuh0Uh@DyཞB$ /CD_9C0QVCwkzlS5MSA^ZH`??8Cce`a%r{ԐvʁkIA<ÃZ߫sD2F ?h83fL_t] B1?7 $蠏$8@H"jBq(< "C z}]]Yv<,8~Pd2EФQ'Czo ZrQ0lO9|ĕO==@h "7ӡ9l[UUUU3:~ ЮKGQ-Gx)Ke!'؅@ QelRW?79y %"tOB2)VXC`Pzl@@D]s5K!a5Sw.\J94 J%A ws˗AYݑDdm0:C; FČ}P#xu|K^jjo*Ԑv4fk7*:!AVц* ́d.bwc#]z\55z$% [!W%gjfm& zm)8<@2L,F+n4pӧI7fH' 5v vWûb /.h DhI F( >r܋L(hBxs |Ddys=a} nʈ*zve܊C.'Qӕ`T8yrrXSn)7 TrdXA|@H@(Q* kDSU`; v A좙"e J֯Vl,I aļubfxS5dE gN$:!x~AMf!5n`TG$i-qVQ"bEeI$3cC: :[) ;EU|*h_Z̳FADvo!lj *m:x`wM*"8hACSC $3m2 NQ4ɂrq!"݁0d2!nU ݡwk.|v"o狖eׁ+^3`ćMgyߎ5k 7! #*(BO5a$=sጵf4\(ϰ X z(mhòK#Z⠣`$y$mmG#֘x^B0.s fBIͪ GGCMog ?,6>DWn7nC,CTɶQdYi6Yra؜a PfQwx:/JǙFYf"!É9 Ooz9U0`Lv x $*PrͤD l߷n(dqSBI 8ә3P:g1NXd_ B эDUI;u3+330UQYbC~5'"wNt޶ԃNwgSMnrjuo kK4bSPc&绾0*̲m2)#'3YaU|;+粼n]P0GE&Y}|_^ۏ?@z}!98;Q5eY%X5g0c )Gy/>i-s`B]rtd'Y06|]wşϽC &zn.$/үȯ uZ=BR ]9!-ǐ^$\>3LFmIi6o[LUҋHHBI%I{y)7mC$J rj}13;rJA- GX6q3 9$mcgPyjͩfkϞUoHWd%z>ǿt}$[-K!EUT u>lꪘ^Ș5Xu6]#2d0*慐u]OnYEIxw^u 4;[ ؁@ao\eXM!rr5LGsbSpK4e#XUTM6t9AU; K SH.*FV9"n13W3E*ÏmC]jRN:IϿvѨڃ; R5DZIюo\. *V?g.1m/}n`nEZ>| T$Uugcs,Æ"wꇼߧyw~~A5;>]rrL3&SwUAfE+uAM /&piZC->k>'&_Ů:ͳࠃ JTkJl gUCj;(MW } 3W<9JӒ߳2Lie} y{fF|;զ~8A9ߤ:zghg:F*hKb[$)Rު)C&E)M.*p8ȌSc xc.X]g/## &>4!!!$/=yH?qFq=NjOڈqbg::̨Ȗ:g| 9 j* j.u"DN?N Q¥$ g31Ha"q- q(Ao64o"f]=o^D]C$G!Ȋ*-GTpPHWu|SV 8so  1]RrR_{!^*B1{h+{UknBB=|?NOw(AmtCI!\^{ZUqtSJܨ<;g9s.u@~GsӐ:^rd6Qi C32;pξ@D!΂'!aD3k Hr惬APaRQ)EĝqFFB O yj 'gdOC}?yss >mDڈQ^JcAh3Ol\@Բ!6@<| }\I8u 4p+4J\Aus[!X%b:I "|$MYBl6YcEPE1DDGA>32w<݌m5Goĺk辚OS[!fbQIPk/ٻ|13 W"x )KU'#U2ڣOࢳcfJՠ|zైޡy\G}!V#Cͭ$Ơ?LtPa_6ڷoog>8mAF*>sPN9uދff!0G#?8$N$$;9Ǒj*ަR(gvB LΫ m**|Fr@^7g"ˉ-'fm׾a]9jT2U1$?M2bٱ !X~̦7_JJJT% >DS+j'ն;;h(3m;(5>ְ2n`9%)JBҦG2 /7pJ JP-adC d ~܀kF:0a&e(\Nb8"5Ed&q63oWW趒]1§qĚ1Q]!L*QI'Rbp5#M5へAQqXQZ$)'$# umwdM+0:4+į=qQCy*BB5Za@ه*#UѸpʚQ>jbUUUUUUUɠRD\{:o2,$3F"s=Ip-g^YwnNHh{Kϧݰ2@Ĉx5L" S.RT'D;7|S& 7[u( n13I h&5 >E}DQߘtMa+¦#x[Kp^4*!Owϧ(nj>'QWdy(JFe0 Z:~g6V{^2[Ri) `P r΋kUy K&bRP 뱇V-]1;2 D @B#B)[ZhIaPƙ581ʌaCK-xJr̋Hq&hv᫅Uw/3`0Av43аtQAĬK 1$CẄzSg',uޣTi].7";#xpJ2ԩ4 xWI$@t릥䗉uA"UWC&XE9o-[0dE| 2&{3O%աu׍n:ErI͑8ӄ f)_5ZXXWM)2!SV ~1*0Jg39޲bֺA0 ZK'$ |zo12]_MId;K'y/KeUÌ$ɏ6/q3 }c@\~?8aR$TS\TN@m#2K.bEpR,E bʒ?%&.8ceLFa$$TF&`E4:#D򾏿6]Es9Dk T:cU"U* PU!x/i[#&?Q"svњ'&rNRϷ4nE(;^(s_/o쿛A>u!Nԡ= l5n5 0qQ|P#L$w9@Jbz?|fAhz2٠RFG#P6;[v:fsNϖęN˓TEXI5AfY]lB-_C8 s` K'*DF'o*J¾`&yWAFgd3ë0C~T[H"1HPޟQSD3N*:~~NlL E%{];W;$H*>1?,|o镐yTӴ5lR.3A=" s %*?;5;Or*i*\G?7і48M"l2%27!}ndT)EJ4Ӂ}f TT"(HIB RD HI2_< >"Q'edC(W׭{aϫS>U~G7'4ULd&ɮF2% t%R4R?;0]AdK' *;B1ރ>e7 \J4q#_IP>  !")`H bH$J`&C@dpi_YāWH1FM $b}pV( *4dڊoA` |FAPB.B~GpA(@SO-NvDb,OM5(cảN\A:1` > - z%ru0H]PcӚ'80$lGP_CH&̣j5b< LŚ0E #߱Du%11.92TnoM0ApӠe3YHD UJ4F׆N]<M"[h$_J QP^:l>= }5TE(>YR&*{D$A*xY A  -l6!-zDiG/(suy7(QH]68 wЇ2iQh=Pr hE܄ LO0 CZ:'2og F[R5ؗRB'z>  jDB?s7O>|:5|P0#eTaa޳~$8XbBY}}udY Sw*rNQV# aW! MV7\rgaOپ!`,I$6! A`QLSe.r AnȞ_B ("X"kI0Q$!5B6T= ""um6fct ƈGN R.Mzv d_D"[Iı6 `mOdj< #⡠rpc- g=/zѡX0}ndCbz:v:@V^YEi}Do|u?B>"H]0(\ $Li'.<UA%.y}΀h:eoˮ?9RcxE({4(rTA< G*R#NTrS vF6y4r(cI<;ZAmZ͊nDR!*^494H1DX)h%@JP-w|"0AbNAF n;9/`E;z,X)FyLp;4"kj+ "$"NJu3d!>TO5&0p!T*D!2L#ꀪ!C+&@:գPAPA S1QE>/g>ˊb()- ȩH0f4[2 $^>cb <$rS^ŝIt `d Tj7M\5@Gi vO2Y$BaQf&P<S1$P-rɜ D5 PE8袡Oqx+"#UU:x 6"9$ JԏC>(≤I,\A[ ;>oz !b0@X <$8u4CF"i(  :pj!B(ʆ3lFZ)JBRE8N%DqW d8ɤMPҜ(8/=qeUJW@#) lxN TiWo)ijcxeL4Fq&Dq's.LQY6 nB i L^(Tdn;jvưI5E`;Rro  (=0gb] v[ޡ/Iؖ3Am64 %7ƶ d*P}Q\yp [%n10ٝ/%h:0]Xaw(eюҒauqχtrp7LnMfZ V= !*=6(聬h lB\$KzhCH'#LBGDJ@qͳ3M:5ztGEL! VEe(JR Th̨ *X%6)#:ILeM, 3ػ6˂]@9Tt֬25=9512^6to]C#P&ٛeRDzkNLg~8or0Rf([IăRDZY4 FD )"-Adm07*٤^Q0TS4$2@%Ī*w _vDxSPiHI!` ((h`d B"`)Ѿc n &Z` hǗD 8Ƕ`ym?$ *iUR O:sËf M A 08\O^%@#舧2܈ $"4.#"|NbXx5 0Ի 60$,TC!@`_zF7vI/C^%s`frbݓ'!2s5_5YˌȄhMhF⌉r%*br!zjZ4P{E*p8NC (tӤ|+bde~om^5Q鈢5p־Tʃ3Ѩ2aي:@WUGhb#޻~ŁDYvSxQTޢh/\t1q 5JȎp &Ŧ |HX%bPP]AN SRh=zUAi$|#Ꮚz*{<1A5zEy(wM<RQӁ 0+.ʚS#c|%/D-F^A?3„D_0"Da !JħfYa 3M1|t>6 5/q*CZU!!pf!и~:oM@;89Hff% Ǽh)`Y7(oG|&9QcH؊rSDL Ig6H6@?@{[Q G#nh|@,"?jY . DiFĨ ; KJb'.TQO΃!B.t*mx}WEGC{9 Db'W`V؛̻@PT`lCJ,#Ё)fAQؠD<@khP`f" WA PM'L BT0@ڛ"ezS-)plv \UDQh=T֑Ee) /Ev8szW@(&>us"T# ŝ5OXܢQe0yս-a@. NaTyz`㺼%;_cJ^í]xvĖ- v#)tn̮~=Cꪈ]P ҏPO|{=';#;N& 41!wRQIB)FH0PN_g9JB$ca)Xb`4R"y18aC E0M1NV&14DA1 @P2a0$ĕ$T`a@`CDL@Q;f fgؓiu5AN3.A$($_XYQw8 %b)diSA6j҂R@B*lBQuj r]GELQu 97*y_4l; U!p5k8$#L p<ȩ,@Z,B" 1`"̤4(&Q@LA.({+?=ybd0~82H*W.C!]260'wOZuLQ0J]tAB)|%A;K?Ь2 t,D Ug (Ӭ"`` ,)XL= *BH$"$*+("8 @80B" k1Sz/gOZ+ Gb0>phEnbJP q g8mР6*C`S &TN, %l8XaP|0+E9JB=a^XPjJ )̴"ア;H]|5H8q4;9@~-?l&`m6<`V"]DԊL "ltXڂ܀a1Ƚ3"BYixlL `nPB ))S2jQc^'6hKuTwp {/XɚYB4U m,V_4r!A;Ղ MMS8%Bc T DvjPaڢ!HVDRI@!;=4!|~.w&v_y%Ti}9A)]vK ョ~R"I"4&|Q8y \ S=<}n`Uy`W A<WצbD&FBZ M#"9 B@L`2ԫ#UGAJQc1_O#b* W `R0.Ƕ{*AOA"2$ S|G4뢁5 X\1RM ɊT| !>Bր:fIxf 8`TL"P_ mHMf2-. MAF[ YR+Q,01(J&!`UBF",91 4!! $Ȅꥵ0""RHF 8K@T4T9@= EPUPPV( ?`9WzA6TP1G1_HwC+0 q0^S^^ʂAiƥCb !(d*0a +߼#AHPԖ\%F}&.H.N(Ib)j$V@$e" AYP!$$fRH!$VU)Qdd%Di*@ Y!BaXU% Z"U)iHh% bh (HaF(bF*jb(*"*)f|ʝ)ЧV!O!JD>?thPp0C3H WzDOĖBXU8Fcf!P'(dTv){HG0XK(BzuNkQLCZ_!)iFmUmS>(%(M >MME,ATLuei6:8,@1Bw`LpԵ Mak9hpz,!ܠWP=AQ&BH@"F4,alc l"hXg3cҦ`AcE:!wx==L@T+3@ty=N,Vt=gX91 pޜWB<`*r?i= E!c Q(1ENvyHC~刨p|}GE"C B$I9 2 +mĐI c&*97,|P}\ _Gi }h; y${H H o# C{" ީt*E;ث@)B(#R4#d" HJEEFɒ7{QF06`y6.M}^Qr3Xs;X3(.^ GD#;T[CEWJ✀0LW(23%% b&Ķ JQC*&qEG$dR5O P?yO5`0C@}JZ ƵC3h;N ٲAܣ 䐢  a!!FǞ Xf.Ye5SƂ CYi,2bD@۶M p`K@DKA AS rDFlp$FуDI ![t`%GXԖ 2bCM1) IPcJ(0Xb!`X)00dj 0Ȳ &HU/AbLΆyN`!D F&IDKZ U*V$ iHfcNS%HLq L)8J䁔`A"`e/R;tM %T2RA\XDdf8jF)TrJz7q}P |vWgQ!EKO41+K޴r m&82E6ccp~*uNE@BK1)^u;mn2~;̲ۀxoǎW첉]xED0,{ Ƅ#CE3S(jv2^f)AB!g H&VJ6g(3ܦ;ᶧ0ǑFc{vp.y<*^A <*(E9D.Iȸ ,N䂰< { I@lL̢q"Ck"mDӴb& Bgs560KbȆǞ>>9;;& `)9s^:hA&L-8uvs)R䌤Z'oWkzk9H"ybEUuC:lJ$ql+2*@P\PfT꣤uEE9Æ6*!y# t@NQ]钒i))))($;QR7cVT2<Ѹc9M&J ;zDž*bwp `EL]} ̄Upd8_^qQ"P?jQ DAEB!BB) .#(p)!@P0$ " Mn0|$4>f!.0-*C.b̃ Oi|z PG~L΄2L^)1IL&bGTf=Q!#2BD?f<: /" _X(@|ÚEЦ 0/8wE"Џ:@VѨ:Gb*drt8`ϼQF6hxA mڔ5o%3K:jG N,tib)q:7*1#pJ ᘄ0bH8kIػ!v>b\BK@*m  ItHb8,A5U]6g/9eLMaUVJ0 @ށC^~FrUD)TC!Pb @ c,={_"@4Ba LMUS!x0DfTĎPC¡v0D+J CCEPPQj!3SKve=߸ʨd1`EIA(VOϐd8vT )9NzGu3 V8}Rrֻ Ԡ@ޘRǰ~g 'QQ'|tENX!Fs0er@4) B*A$֒2,i*aSW,5",D RM rHs2&H#SΌMa8M"J(5#م Ųј*j2Uh1ZEr5-! R4+s4>'Ȟ  ditb}j G &YeCcTJ  ^))RdSCa]b*"""a w!<}$+eDe~(iD/U Ϙ%|aTAP(#XCfE 9ᘙdd9c.&# )Ĥ2 S C&23 4 G᝶3P Rf#OŭʈpQ=v&䈪Vx0v$!LcUE/8ݜNd"!bj;"8bD67p#n c0q4Ƥ Y)@P\f4-)4j[14̀r,bm(u.Q[ƈW!i &s)B3 $bJ*)`jb% bBbVr0) 隠GҀ?Zp1Axٽh,y"cAb4!5 !rg;H @ PN>z)܈4x…(y0" %Pu̶T2A &@gIXW0 6B|Ѡ8 6! RTSeD !(b HB%CSC=$dT}X F(1E45*%b ~j i9 ٹ)9xlh(HpA 9S"2zҽX]ns1(9D .%R -"Hu|{>6T>P*9 EPZI@R0tʠ]XV1}ûODQxH.#P $!SD"AqQrHZR{|7S=FOۼ> c)$s>}l安,)I.ƢpIq8CHEUHSEe\a&UsxbMM!r~^a e7제C1$,cdMHQNqiep?eH$[1-]iutJL3M$j`H>o36y#+  JA 8uR'Jz?Tqo8>OJ}]ĕi`STd+V3Vy=p$LJ(2fQ?uGtUGeNU^}7L뿇:}tq+LyfO(fįXa,>#緊:-_zӍ޼t09CD]Y`>:9_+?fԒP`SNJ{ xJ3@K|{mꖾ$< ȇ Dר8t3kosGVKUyzay(V̓GbLܔaN+״E=GŽ|fVzqt> 'ljh4((B>|G0z~h>Jl|B];>gD$}A}AӳoC!tf~$pt߾)iE,x־#:iVk5zB;FqFqi$( BH)#KkI#H#H\>pu!B8>Tl(q\[$hQ⨁lo&!A64Mx [vܿH Ψ:kJ`m`ZRcx? `k*GT79x`EĜ7[[|R%ZXd+BD434'A~ؒ_0 ]#|=UUUUUUUUTDE^BS0q ;lY ʅ1;QDX<:)Zz~$0 F| jxyEP!ͅ@!8wDUUL]!^pGy&ع5 2gi.N Ȑx!B;) p,'Guʣ謢 H{gyڃ 7 q. uFCvZW6%j =3·9XzeIQJˆܚJQL4JܸrrF PZC*p0Ũ( Z X `Ȏ, `oYug+ lh0 eEk ְ+[1D.WZˁ뙲` C64 cM؈B盢SRNMeޕzmelWܢ],7ޡwQ S!l8C<C~b <$C%6r pv`3~ P3 L3SSV|rs5tVfL+CIʱƲyᙉIrDQP )z`kE٪Uz Ԫ qɝRoc@㰢َ8vi'MsYP6hD\+Zv .&s%NC(>]rhH;$Au%1lA^ 쎡!<}TE~hC^ž{nB3$_=UeQᢡ V?iG|5+RCGN!B<=yO C ?FY&SL_W 7JDw.م9&Vf`g{#a GxtI~C0~'gLHh$W޾ PP5MVC; s_ 0G]&f{ŒcrH=mI0HI-{dl)^t"P*w%[Hi6;"'KAB, ExWa_ !OMW328ۡ ɢG;Έp46y95dVuWHR1 8JCJ3oy hSv0dB! `(k4~p$`)jR0R,3E MĆsyVEQIeE8>:Mezpi֗ƧZp8qyDn"&`P\8}8'|hq= e? {Liabkn}>8LPD_B,䦻HqۇD䂟"TlWqԩD U)@|)(f7N)Pb)}rF B @auE)Eh x9 C81^BiQF9; sݜ11%RB5ITHFtUs:!=:(ބAqā?uCsִKC2 d0Mp2N<@8nPt(t2'*'_Ts  OPn>J $˕#̊~Q?N5ӷ'BGq1KXIE&r3+3+1Ȧ0 3% 0Ƞ2,$>[M򮎋 QxbQse 2T,eǯ*B=\ )_d ,BÃH!Tj9>#>!rP2I$zz|$0T9syc-!;yN+3΢@)^SH9AA0ITHTH:4c1)] CѦESkqM>@:"=hEM_n\Txp"0xPiT5NB$w }LR'6CHJx]@1TS `zZ)H k}q9 @?a_y32DzdpLXcIIb![ jD_ha40 $.[4ܟ@$ .@s9vx=fxNAi 3"3֭t5T8|<@l9٦~_YUNJ! %~=`A؁xF \M`hc5o×^Ȅߝ>䁱u؞]}xN8\e2Fu桖)D9&MeG.*А}ڬ&NN .]Xh"{qogu}{U"&꞉rgNKTRU3_nqU=)3=+Mi),JF/qdG%+B_l lar"@Eo0|4O2$F0qkc|/'{// N.4$aAf1&Aj 32hł[lQ@ocdw}b )0FQe6"h* qX\=B(|!+ 4xbRa$HA(&@$6*#A,:DƫW"' 8# ժ;fTO *"7+1UJ -@D9NƼJ4|2~t{~OHk/0@5j%0te)q)m0rvƞVVPuC bd42Mkq‘LnkCu)/T0Ӧ K.vf lllmh (*)ƸUàZ9f{|/Vay MݙdD1 Qf 1Vv,_]$uy u$~+ll ErO $ѧѰ%Хu=EOsx}abtGIiEA?5 pP2Vѩ X b2IsyH@])@_}:v#? SWx^K08>qQ&-o;@|^`& R/7^In}?Ap:I})pq=2.1~_Q>Z^2.BB ϥr7ا1F"*LPRb,PWq(>*JNaX;2ŷf2A)i@k-)kX']w8+F){*D@ۼę4p&RT!}L3?٭,<#G*S\w;a0MNsUVV$=*vNxd7:"cT((+dPcRqRmvQ*@q(f!@K? /[p6_-ݐ/s{`nu-7atjK_Ms,鄐LАilap#& + 0Ǒ]kJ@; s#a77X}hif*}I}aybe@b`0`]`%wN%$AW`I@C^d!HqPAEB!@%N4}0iIr'9joR"kN=X*:ZB4.H`q3r~Pv {Oz5Ayb"ߡO!J BH)0x{D5-Aɒ2Tܰ1&+kJIeh% KP'ū 4sUT͊|`8` (2 9 ^ Dig@J'@t4Ij*%L嶶T@8F& llCc)X'e$H@8oԊT8Ewwmn6^Шy+S;r$aHN9ݩ9'  #0HrJ0r`ƒ%.u]=W:)[-P){/@,YWH#B0(3(Q+f(u@h CҸC G,>j͉!;A+CQgutlQA!Y/>Y( W G,lSˁN] LSPut:rvA3O>y;$w1C7<0BR!Ӊ_lc~Hy8TN>J]QMzi<4!>zJ$Hղg3$vY`